# Server Deployment (LXC + Caddy) Target: a Proxmox LXC container running Debian 12 in the RZ, publicly reachable on port 443 via Caddy. ~1 GB RAM, 2 cores, 10 GB disk covers >20 agents. ## 1. Create the LXC (on the hypervisor) ```bash pct create 200 \ /var/lib/vz/template/cache/debian-12-standard_12.7-1_amd64.tar.zst \ --hostname proxmox-monitor \ --memory 1024 --cores 2 \ --rootfs local-zfs:10 \ --net0 name=eth0,bridge=vmbr0,ip=dhcp \ --unprivileged 1 --features nesting=0 --onboot 1 pct start 200 pct enter 200 ``` ## 2. Inside the LXC: base packages ```bash apt-get update && apt-get install -y \ ca-certificates curl debian-keyring debian-archive-keyring apt-transport-https # Caddy's apt repo curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | \ gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' \ > /etc/apt/sources.list.d/caddy-stable.list apt-get update && apt-get install -y caddy sqlite3 ``` ## 3. Upload the release From the operator workstation: ```bash cd proxmox_monitor/server MIX_ENV=prod mix release --overwrite tar -czf server_release.tgz -C _build/prod/rel server scp server_release.tgz root@:/tmp/ ``` Back in the LXC: ```bash mkdir -p /opt/proxmox-monitor tar -xzf /tmp/server_release.tgz -C /opt/proxmox-monitor ``` ## 4. Directories & env file ```bash install -d -m 0700 /var/lib/proxmox-monitor cat > /etc/default/proxmox-monitor < :crypto.strong_rand_bytes() |> Base.encode64())' 2>/dev/null | tail -1) DASHBOARD_PASSWORD_HASH='' PHX_SERVER=true PHX_HOST=monitor.example.com PORT=4000 EOF chmod 0600 /etc/default/proxmox-monitor ``` ## 5. systemd unit ```ini # /etc/systemd/system/proxmox-monitor.service [Unit] Description=Proxmox Monitor Server After=network-online.target Wants=network-online.target [Service] Type=exec EnvironmentFile=/etc/default/proxmox-monitor ExecStartPre=/opt/proxmox-monitor/server/bin/server eval 'Server.Release.migrate()' ExecStart=/opt/proxmox-monitor/server/bin/server start ExecStop=/opt/proxmox-monitor/server/bin/server stop Restart=always RestartSec=5 User=root [Install] WantedBy=multi-user.target ``` ```bash systemctl daemon-reload systemctl enable --now proxmox-monitor journalctl -u proxmox-monitor -f # verify it listens on 4000 ``` ## 6. Caddy ```bash install -m 0644 /opt/proxmox-monitor/server/lib/server-0.1.0/priv/docs/Caddyfile.example /etc/caddy/Caddyfile # Edit monitor.example.com to match your real DNS. nano /etc/caddy/Caddyfile systemctl reload caddy ``` (If Caddy isn't the one in this LXC, copy the template to wherever Caddy lives.) ## 7. Create the first host ```bash /opt/proxmox-monitor/server/bin/server rpc 'Server.Release.register_host("pve-host-01")' ``` Copy the printed TOKEN — you'll paste it into the agent config. ## 8. Upgrade flow ```bash # operator cd server && MIX_ENV=prod mix release --overwrite scp _build/prod/rel/server.tar.gz root@:/tmp/server_release.tgz # LXC systemctl stop proxmox-monitor tar -xzf /tmp/server_release.tgz -C /opt/proxmox-monitor --overwrite systemctl start proxmox-monitor # ExecStartPre runs migrate automatically ```