Add two new Proxmox Ubuntu app VMs to the Ansible inventory so they run the same active/active workloads as adama / roslin.
Host
IP
Role
starbuck
10.0.0.44
Ubuntu Server VM (Proxmox) — app host
apollo
10.0.0.7
Ubuntu Server VM (Proxmox) — app host
These are app hosts, not a control node. Do not enable observability_stack, searxng_stack, or act_runner_enabled. Do not copy ai-server-4080.yml.
Template
Copy inventory/host_vars/roslin.yml, not adama.
Roslin already mirrors adama's apps/ports for NPM, but omitsmonica_sitecompose_profiles: [worker]. The dj-queue worker stays a singleton on adama (#17). New hosts get web replicas only.
Ports must match adama/roslin so NPM can add starbuck:PORT and apollo:PORT as extra upstreams.
Passwordless sudo on each new host (Ubuntu 26.04 sudo-rs does not work with Ansible --ask-become-pass):
ssh -t westfarn@10.0.0.44 # then apollo at 10.0.0.7echo'westfarn ALL=(ALL) NOPASSWD:ALL'| sudo tee /etc/sudoers.d/westfarn
sudo chmod 440 /etc/sudoers.d/westfarn
Keep a Proxmox console open when first enabling UFW.
Provision + deploy
ansible starbuck,apollo -m ping
./scripts/provision.sh starbuck --check
./scripts/provision.sh starbuck
./scripts/provision.sh apollo --check
./scripts/provision.sh apollo
# After docker group / SSH re-login as needed:
./scripts/deploy.sh starbuck
./scripts/deploy.sh apollo
Secrets already live on the control node (~/Documents/secrets/<app>/...); app-deploy pushes them. No new DBs — shared external Postgres, same as adama/roslin.
Out of Ansible (manual)
NPM at 10.0.0.230: add starbuck and apollo as extra upstreams on the existing active/active Proxy Hosts (Advanced upstream {}), same ports as adama/roslin. Ansible does not manage NPM.
Acceptance criteria
starbuck (10.0.0.44) and apollo (10.0.0.7) are in inventory/hosts.yml under webservers.
host_vars match roslin.yml (same apps/ports; nomonica_site worker profiles).
./scripts/provision.sh starbuck and ./scripts/provision.sh apollo succeed (UFW, Docker, Node, Gitea key, Tianji, Alloy).
./scripts/deploy.sh starbuck and ./scripts/deploy.sh apollo bring up the same app+env set as roslin.
monica_site dj-queue worker still runs only on adama.
Alloy logs/metrics appear in Grafana/Loki with host="starbuck" and host="apollo".
Wrapper scripts accept starbuck / apollo as --limit hosts.
Docs list both hosts; NPM backends documented (actual NPM edit is manual).
## Why
Add two new Proxmox Ubuntu app VMs to the Ansible inventory so they run the same active/active workloads as **adama** / **roslin**.
| Host | IP | Role |
|------|----|------|
| starbuck | 10.0.0.44 | Ubuntu Server VM (Proxmox) — app host |
| apollo | 10.0.0.7 | Ubuntu Server VM (Proxmox) — app host |
These are **app hosts**, not a control node. Do **not** enable `observability_stack`, `searxng_stack`, or `act_runner_enabled`. Do **not** copy `ai-server-4080.yml`.
## Template
Copy **`inventory/host_vars/roslin.yml`**, not adama.
Roslin already mirrors adama's apps/ports for NPM, but **omits** `monica_site` `compose_profiles: [worker]`. The dj-queue worker stays a **singleton on adama** (#17). New hosts get web replicas only.
Ports **must** match adama/roslin so NPM can add `starbuck:PORT` and `apollo:PORT` as extra upstreams.
## Apps / ports (same as roslin)
```yaml
host_apps:
- { name: company_site, env: prod, port: 8000 }
- { name: dta_service, env: prod, port: 8001 }
- { name: dta_service, env: beta, port: 8011 }
- { name: dta_webapp, env: prod, port: 8080 }
- { name: dta_webapp, env: beta, port: 8081 }
- { name: scha, env: prod, port: 8002 }
- { name: chat_web_app, env: prod, port: 8082 }
- { name: chat_web_app, env: beta, port: 8083 }
- { name: chat_backend, env: prod, port: 8003 }
- { name: chat_backend, env: beta, port: 8013 }
# monica_site worker NOT here — adama host_apps sets compose_profiles: [worker].
- { name: monica_site, env: prod, port: 8004 }
- { name: monica_site, env: beta, port: 8014 }
```
Provision roles (via `webservers` in `site.yml`): `common`, `ufw`, `docker`, `nodejs`, `gitea-key`, `tianji`, `alloy`.
## Ansible / repo changes
1. **`inventory/hosts.yml`** — add both under `webservers`:
```yaml
starbuck:
ansible_host: 10.0.0.44
apollo:
ansible_host: 10.0.0.7
```
2. **`inventory/host_vars/starbuck.yml`** and **`inventory/host_vars/apollo.yml`** — copy `roslin.yml` (same `host_apps`, no worker profiles).
3. **`scripts/provision.sh`** and **`scripts/deploy.sh`** — extend the host allowlist (`adama|roslin|ai-server-4080`) and help text to include `starbuck` and `apollo`.
4. **Docs** — add both hosts to server tables and examples:
- `README.md`
- `IMPLEMENTATION.md` (architecture diagram, servers table, host_vars layout, app host lists, NPM backends, CI fan-out notes)
- `docs/OBSERVABILITY.md` / `docs/GRAFANA_USAGE.md` (Alloy `host` label examples)
## Manual bootstrap (before first provision)
Same one-time steps as adama/roslin (`IMPLEMENTATION.md` Prerequisites). VMs assumed already exist at those IPs.
From **ai-server-4080**:
```bash
ssh-copy-id westfarn@10.0.0.44
ssh-copy-id westfarn@10.0.0.7
```
Passwordless sudo on each new host (Ubuntu 26.04 `sudo-rs` does not work with Ansible `--ask-become-pass`):
```bash
ssh -t westfarn@10.0.0.44 # then apollo at 10.0.0.7
echo 'westfarn ALL=(ALL) NOPASSWD:ALL' | sudo tee /etc/sudoers.d/westfarn
sudo chmod 440 /etc/sudoers.d/westfarn
```
Keep a **Proxmox console** open when first enabling UFW.
## Provision + deploy
```bash
ansible starbuck,apollo -m ping
./scripts/provision.sh starbuck --check
./scripts/provision.sh starbuck
./scripts/provision.sh apollo --check
./scripts/provision.sh apollo
# After docker group / SSH re-login as needed:
./scripts/deploy.sh starbuck
./scripts/deploy.sh apollo
```
Secrets already live on the control node (`~/Documents/secrets/<app>/...`); `app-deploy` pushes them. No new DBs — shared external Postgres, same as adama/roslin.
## Out of Ansible (manual)
**NPM at 10.0.0.230:** add `starbuck` and `apollo` as extra upstreams on the existing active/active Proxy Hosts (Advanced `upstream {}`), same ports as adama/roslin. Ansible does not manage NPM.
## Acceptance criteria
- [ ] `starbuck` (`10.0.0.44`) and `apollo` (`10.0.0.7`) are in `inventory/hosts.yml` under `webservers`.
- [ ] `host_vars` match `roslin.yml` (same apps/ports; **no** `monica_site` worker profiles).
- [ ] `./scripts/provision.sh starbuck` and `./scripts/provision.sh apollo` succeed (UFW, Docker, Node, Gitea key, Tianji, Alloy).
- [ ] `./scripts/deploy.sh starbuck` and `./scripts/deploy.sh apollo` bring up the same app+env set as roslin.
- [ ] `monica_site` dj-queue worker still runs **only** on adama.
- [ ] Alloy logs/metrics appear in Grafana/Loki with `host="starbuck"` and `host="apollo"`.
- [ ] Wrapper scripts accept `starbuck` / `apollo` as `--limit` hosts.
- [ ] Docs list both hosts; NPM backends documented (actual NPM edit is manual).
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Why
Add two new Proxmox Ubuntu app VMs to the Ansible inventory so they run the same active/active workloads as adama / roslin.
These are app hosts, not a control node. Do not enable
observability_stack,searxng_stack, oract_runner_enabled. Do not copyai-server-4080.yml.Template
Copy
inventory/host_vars/roslin.yml, not adama.Roslin already mirrors adama's apps/ports for NPM, but omits
monica_sitecompose_profiles: [worker]. The dj-queue worker stays a singleton on adama (#17). New hosts get web replicas only.Ports must match adama/roslin so NPM can add
starbuck:PORTandapollo:PORTas extra upstreams.Apps / ports (same as roslin)
Provision roles (via
webserversinsite.yml):common,ufw,docker,nodejs,gitea-key,tianji,alloy.Ansible / repo changes
inventory/hosts.yml— add both underwebservers:inventory/host_vars/starbuck.ymlandinventory/host_vars/apollo.yml— copyroslin.yml(samehost_apps, no worker profiles).scripts/provision.shandscripts/deploy.sh— extend the host allowlist (adama|roslin|ai-server-4080) and help text to includestarbuckandapollo.README.mdIMPLEMENTATION.md(architecture diagram, servers table, host_vars layout, app host lists, NPM backends, CI fan-out notes)docs/OBSERVABILITY.md/docs/GRAFANA_USAGE.md(Alloyhostlabel examples)Manual bootstrap (before first provision)
Same one-time steps as adama/roslin (
IMPLEMENTATION.mdPrerequisites). VMs assumed already exist at those IPs.From ai-server-4080:
Passwordless sudo on each new host (Ubuntu 26.04
sudo-rsdoes not work with Ansible--ask-become-pass):Keep a Proxmox console open when first enabling UFW.
Provision + deploy
Secrets already live on the control node (
~/Documents/secrets/<app>/...);app-deploypushes them. No new DBs — shared external Postgres, same as adama/roslin.Out of Ansible (manual)
NPM at 10.0.0.230: add
starbuckandapolloas extra upstreams on the existing active/active Proxy Hosts (Advancedupstream {}), same ports as adama/roslin. Ansible does not manage NPM.Acceptance criteria
starbuck(10.0.0.44) andapollo(10.0.0.7) are ininventory/hosts.ymlunderwebservers.host_varsmatchroslin.yml(same apps/ports; nomonica_siteworker profiles)../scripts/provision.sh starbuckand./scripts/provision.sh apollosucceed (UFW, Docker, Node, Gitea key, Tianji, Alloy)../scripts/deploy.sh starbuckand./scripts/deploy.sh apollobring up the same app+env set as roslin.monica_sitedj-queue worker still runs only on adama.host="starbuck"andhost="apollo".starbuck/apolloas--limithosts.