9208e6349153ba2ba583b2a6b68e33ece24ff77b
Sync runner checkout / sync (push) Successful in 6s
## Summary - Closes [#22](#22). - Register `url_shortening_service` in `app_catalog` (`type: django`, repo `ai_ml_operations/url_shortening_service`, default branch `master`) and `host_apps` on **adama**, **roslin**, **starbuck**, **apollo**, and **ai-server-4080** (prod **8005**, beta **8015**). - Document NPM (short host vs API host, same container), Postgres DBs (`url_shortener` / `url_shortener_beta`), and extra env keys. No compose worker profile. - List `url_shortening_service` in `scripts/deploy.sh` `--app` help. ## Out of scope (manual ops) - Create Postgres DBs `url_shortener` / `url_shortener_beta` + grant `westfarn` on `10.0.0.230` - Control-node secrets under `~/Documents/secrets/url_shortening_service/` - NPM proxy hosts (Ryan): short host `/` + `/[a-z0-9]{4,8}` (404 `/api/`, `/admin/`, `/debug/`); API host `/api/` only (404 `/admin/`) - Deploy smoke — [url_shortening_service](https://git.aimloperations.com/ai_ml_operations/url_shortening_service) `master` is still a stub (`README.md` only) ## Test plan - [x] Inventory YAML: `url_shortening_service` in `app_catalog`; every host `host_apps` has prod **8005** / beta **8015** - [ ] After app compose + secrets + DBs exist: `./scripts/deploy.sh --app url_shortening_service --env beta --ref master` - [ ] Same for prod - [ ] `GET /healthz/` → `{"status":"ok"}` on both ports - [ ] Short host `GET /` landing page; `POST /api/links/` without Bearer → 401; public `/admin/` → 404 Reviewed-on: #23
server-infra
Ansible provisioning and deployment for homelab web servers.
Quick Start
# Install collections (once)
ansible-galaxy collection install -r requirements.yml
# Bootstrap SSH key to each host (one-time, before Ansible)
ssh-copy-id westfarn@10.0.0.77
ssh-copy-id westfarn@10.0.0.176
ssh-copy-id westfarn@10.0.0.44
ssh-copy-id westfarn@10.0.0.7
# First-time only: passwordless sudo on each new host (before first provision)
ssh -t westfarn@10.0.0.176 # repeat for each host IP
# on the host:
echo 'westfarn ALL=(ALL) NOPASSWD:ALL' | sudo tee /etc/sudoers.d/westfarn
sudo chmod 440 /etc/sudoers.d/westfarn
exit
# Test connectivity to one host
ansible adama -m ping
# Provision one host (dry run first) — includes Alloy log/metrics agent
./scripts/provision.sh adama --check
./scripts/provision.sh adama
# Control node: Alloy + Loki + Prometheus + Grafana
./scripts/provision.sh ai-server-4080
# Provision all hosts
./scripts/provision.sh
See IMPLEMENTATION.md for full architecture, CI/CD plan, and phase breakdown.
Observability (Alloy → Loki / Prometheus → Grafana): docs/OBSERVABILITY.md · docs/GRAFANA_USAGE.md
Provision installs Alloy on every host. On ai-server-4080 it also starts
the central Loki / Prometheus / Grafana stack (observability_stack: true).
Servers
| Host | IP | Role |
|---|---|---|
| adama | 10.0.0.77 | app host |
| roslin | 10.0.0.176 | app host |
| starbuck | 10.0.0.44 | app host |
| apollo | 10.0.0.7 | app host |
| ai-server-4080 | 10.0.0.128 | control node + act runner |
Languages
Jinja
63.3%
Shell
36.7%