# Install Juju & LXD
## Install [Juju](https://canonical.com/juju)
```shell
$ sudo snap install juju
juju (3/stable) 3.6.12 from Canonical✓ installed
```
```shell
$ juju list-controllers
ERROR No controllers registered.
Please either create a new controller using "juju bootstrap" or connect to
another controller that you have been given access to using "juju register".
```
```shell
$ juju bootstrap localhost overlord
ERROR LXD socket not found; is LXD installed & running?
Please install LXD by running:
$ sudo snap install lxd
and then configure it with:
$ newgrp lxd
$ lxd init
```
## Install [LXD](https://canonical.com/lxd)
```shell
$ sudo snap install lxd
lxd (5.21/stable) 5.21.4-9eb1368 from Canonical✓ installed
```
```shell
$ newgrp lxd
$ sudo adduser $USER lxd
```
```shell
$ sudo lxd init --auto
# Optional to avoid some weird network issue afterward
$ lxc network set lxdbr0 ipv6.address none
$ lxc network set lxdbr0 ipv6.dhcp false
$ lxc network set lxdbr0 ipv6.nat false
```
## Bootstrap
```shell
$ juju bootstrap localhost overlord
Creating Juju controller "overlord" on localhost/localhost
Looking for packaged Juju agent version 3.6.12 for amd64
Located Juju agent version 3.6.12-ubuntu-amd64 at https://streams.canonical.com/juju/tools/agent/3.6.12/juju-3.6.12-linux-amd64.tgz
To configure your system to better support LXD containers, please see: https://documentation.ubuntu.com/lxd/en/latest/explanation/performance_tuning/
Launching controller instance(s) on localhost/localhost...
- juju-646aea-0 (arch=amd64)
Installing Juju agent on bootstrap instance
Waiting for address
Attempting to connect to 10.133.166.131:22
Attempting to connect to [fd42:5109:9be4:f1ce:216:3eff:fed6:4bbb]:22
Connected to 10.133.166.131
Running machine configuration script...
Bootstrap agent now started
Contacting Juju controller at 10.133.166.131 to verify accessibility...
Bootstrap complete, controller "overlord" is now available
Controller machines are in the "controller" model
Now you can run
juju add-model <model-name>
to create a new model to deploy workloads.
```
```shell
$ lxc list
+---------------+---------+-----------------------+-----------------------------------------------+-----------+-----------+
| NAME | STATE | IPV4 | IPV6 | TYPE | SNAPSHOTS |
+---------------+---------+-----------------------+-----------------------------------------------+-----------+-----------+
| juju-646aea-0 | RUNNING | 10.133.166.131 (eth0) | fd42:5109:9be4:f1ce:216:3eff:fed6:4bbb (eth0) | CONTAINER | 0 |
+---------------+---------+-----------------------+-----------------------------------------------+-----------+-----------+
```
# Install [OpenClaw](https://openclaw.ai/) and setup AI model
Using [Juju Charm for OpenClaw](https://fourdollars.github.io/openclaw-charm/)
## Add a workload model
```
juju add-model openclaw
```
## Local LLM
```shell
juju deploy openclaw ollama \
--channel edge \
--config gateway-bind=lan \
--config dm-scope="per-channel-peer" \
--config ai-provider=openai \
--config ai-model=ministral-3:8b \
--config ai-base-url=http://<IP>:11434/v1 \
--config ai-api-key=noob
```
## Remote LLM
```shell
juju deploy openclaw google \
--channel edge \
--config gateway-bind=lan \
--config dm-scope="per-channel-peer" \
--config ai-provider=google \
--config ai-model=gemini-2.5-flash-lite,gemini-2.5-flash,gemini-2.5-pro,gemini-3-flash-preview,gemini-3-pro-preview,gemini-3-pro-image-preview \
--config ai-api-key=<TOKEN>
```
```shell
juju deploy openclaw copilot \
--channel edge \
--config gateway-bind=lan \
--config dm-scope="per-channel-peer" \
--config ai-provider=github-copilot \
--config ai-model=gemini-3-flash-preview,gemini-3-pro-preview,claude-sonnet-4.5,claude-sonnet-4,claude-haiku-4.5,gpt-5.2,gpt-5.2-codex,gpt-5.1-codex-max,gpt-5.1-codex,gpt-5.1,gpt-5.1-codex-mini,gpt-5,gpt-5-codex,gpt-5-mini,gemini-2.5-pro \
--config ai-api-key=<TOKEN>
```
`P.S.`
`Copilot models only support 'tools', and didn't support 'vision'.`
`Sending media files will break them.`
```shell
juju deploy openclaw openrouter \
--channel edge \
--config gateway-bind=lan \
--config dm-scope="per-channel-peer" \
--config ai-provider=openrouter \
--config ai-model=openrouter/free \
--config ai-api-key=<TOKEN>
```
# Initialize the SOUL
## Login Linux Container
```shell
$ juju ssh ollama/leader
The programs included with the Ubuntu system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.
Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by
applicable law.
To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.
ubuntu@juju-9f18da-0:~$ openclaw tui
```
## BOOTSTRAP SOUL
`我們來完成開機程序吧!往後所有的對話都盡可能使用繁體中文,妳以後叫小姬,我是妳的主人,就稱呼我為主人,我在台灣時區,妳的專屬 Emoji 就用 🐥。`
`我們已經完成 BOOTSTRAP 了嗎?`
# Notes
## Gateway service
https://docs.openclaw.ai/start/quickstart#onboard-and-run-the-gateway
```shell
openclaw onboard --install-daemon
```
## Node service
https://docs.openclaw.ai/nodes#start-a-node-host-service
```shell
openclaw node install --host <gateway-host> --port 18789 --display-name "Build Node"
openclaw node restart
```
## Allow browser
```shell
openclaw approvals allowlist add --node openclaw/5 --agent main "/usr/bin/google-chrome-stable"
openclaw approvals allowlist add --node openclaw/5 --agent main "/usr/bin/google-chrome-stable *"
```