00
Copy-paste walkthrough
Terminal · LLM · HELM via AiMANAC

Set three values once, run each command block in order, then paste the public URL into Archimedes (or AiMANAC Connections if you use HELM).

LLM: copy panel 11 into your assistant. AiMANAC: paste the same into HELM after you have AiMANAC installed. Never paste generated passwords into chat.

01
Set your three values
Run once per terminal session
# --- edit these three lines ---
export VPS_IP=203.0.113.10
export ARCH_HOST=archimedes.yourdomain.com
export DEPLOY_DIR="$HOME/archimedes-deploy"
# -----------------------------

mkdir -p "$DEPLOY_DIR"
cd "$DEPLOY_DIR"

Create an Ubuntu VPS in your provider UI (8 GB RAM min, 16 GB recommended), attach your SSH key, open ports 22/80/443, then set VPS_IP.

02
Download starter files
Into $DEPLOY_DIR
  1. DNS

    A record $ARCH_HOST$VPS_IP, TTL 300. Cloudflare: proxy off.

  2. 03–07

    Command blocks below — bootstrap, secrets, patch hostname, source, deploy.

  3. 09

    Verify curls — gate before the phone.

  4. 10

    Paste https://$ARCH_HOST into the app.

03
Bootstrap the VPS
Run on laptop — pipes cloud-init to SSH

Copy block 03

cd "$DEPLOY_DIR"
curl -fsSLO "https://aimanac.llmtech.net/apps/archimedes/setup/vps/cloud-init.sh"
ssh root@"$VPS_IP" 'bash -s' < cloud-init.sh

Safe to re-run. Installs Docker, Caddy, firewall (22/80/443), and /opt/archimedes/ layout.

04
Generate secrets
Run on laptop in $DEPLOY_DIR — never paste into chat

Copy block 04

cd "$DEPLOY_DIR"
mkdir -p secrets
openssl rand -hex 32 > secrets/postgres_password.txt
JWT=$(openssl rand -hex 32)
JWT_REFRESH=$(openssl rand -hex 32)
cat > .env <
  
05
Patch hostname in starter files
Run on laptop — replace example.com

Copy block 05

cd "$DEPLOY_DIR"
curl -fsSLO "https://aimanac.llmtech.net/apps/archimedes/setup/vps/docker-compose.yml"
curl -fsSLO "https://aimanac.llmtech.net/apps/archimedes/setup/vps/Caddyfile"
sed -i.bak "s/archimedes.example.com/$ARCH_HOST/g" Caddyfile docker-compose.yml
grep -E "BACKEND_PUBLIC_URL|$ARCH_HOST" docker-compose.yml Caddyfile

On macOS without GNU sed, edit both files manually: hostname must match $ARCH_HOST everywhere.

06
Pin the server image tag
Public GHCR — no git clone

The server ships as a Docker image on GitHub Container Registry. You pull it; you do not clone archimedes-server from GitHub. Pin the tag from For AI assistants or this page’s release note.

Copy block 06

export ARCH_IMAGE_TAG=rust-cutover-20260520-ghcr-pipeline
# After compose is on the VPS:
ssh root@"$VPS_IP" "export ARCH_IMAGE_TAG=$ARCH_IMAGE_TAG && docker pull ghcr.io/everplay-tech/archimedes-server:\$ARCH_IMAGE_TAG"
07
Upload compose, env, Caddy — start stack
Pull image + start (~2 min after first pull)

Copy block 07

cd "$DEPLOY_DIR"
scp docker-compose.yml root@"$VPS_IP":/opt/archimedes/
scp .env root@"$VPS_IP":/opt/archimedes/
scp secrets/postgres_password.txt root@"$VPS_IP":/opt/archimedes/secrets/
scp Caddyfile root@"$VPS_IP":/etc/caddy/Caddyfile
ssh root@"$VPS_IP" "export ARCH_IMAGE_TAG=$ARCH_IMAGE_TAG && chmod 700 /opt/archimedes/secrets && systemctl reload caddy && cd /opt/archimedes && docker compose pull && docker compose up -d"
08
Wait for DNS (if needed)
Gate before HTTPS verify

Copy block 08

dig +short "$ARCH_HOST"
# Expect: $VPS_IP
09
Verify — run before opening the app
Copy each curl; all must pass

Copy block 09

export ARCH_URL="https://$ARCH_HOST"
curl -fsSI "$ARCH_URL/health" | head -1
curl -fsSI "$ARCH_URL/ready" | head -1
curl -fsSI -H "Connection: Upgrade" -H "Upgrade: websocket" \
  -H "Sec-WebSocket-Version: 13" \
  -H "Sec-WebSocket-Key: $(openssl rand -base64 16)" \
  "$ARCH_URL/ihp-ws" | head -1
ssh root@"$VPS_IP" 'docker compose -f /opt/archimedes/docker-compose.yml ps'

/health and /ready → HTTP/2 200. WebSocket route → 101 or 426. Containers → server + postgres Up.

10
Paste URL into Archimedes
Phone · AiMANAC Connections later

Your backend URL (copy this line)

https://$ARCH_HOST
  1. Archimedes app

    First boot → paste https://$ARCH_HOST (no trailing path) → Sign in with Apple.

  2. AiMANAC + HELM

    Settings → Connections → Add Backend with the same URL once you orchestrate from AiMANAC.

11
Paste into your LLM (full walkthrough)
Self-contained — do not include .env contents

Select everything in the box below and paste into ChatGPT, Claude, or HELM. The assistant should run blocks 01–09 in order on your machine; you type secrets locally only.

I am deploying Archimedes on my own VPS. Help me run these steps on my laptop (macOS or Linux). I will set VPS_IP, ARCH_HOST, and DEPLOY_DIR myself and will NOT paste JWT or database passwords into this chat.

1) export VPS_IP=<my server IPv4>
   export ARCH_HOST=archimedes.<my-domain>
   export DEPLOY_DIR=$HOME/archimedes-deploy
   mkdir -p "$DEPLOY_DIR" && cd "$DEPLOY_DIR"

2) DNS: A record ARCH_HOST → VPS_IP, TTL 300. Cloudflare proxy OFF.

3) curl cloud-init from https://aimanac.llmtech.net/apps/archimedes/setup/vps/cloud-init.sh
   ssh root@$VPS_IP 'bash -s' < cloud-init.sh

4) In DEPLOY_DIR: openssl rand for postgres_password.txt; build .env with POSTGRES_PASSWORD, JWT_SECRET, JWT_REFRESH_SECRET, RUST_LOG=info; chmod 600.

5) curl docker-compose.yml and Caddyfile from the same VPS setup URL; replace archimedes.example.com with ARCH_HOST in both files.

6) export ARCH_IMAGE_TAG=rust-cutover-20260520-ghcr-pipeline (or tag from setup/llm spec). docker pull ghcr.io/everplay-tech/archimedes-server:$ARCH_IMAGE_TAG on the VPS. No git clone.

7) scp compose, .env, postgres secret, Caddyfile; ssh reload caddy; cd /opt/archimedes && docker compose pull && docker compose up -d (no --build).

8) dig +short ARCH_HOST must return VPS_IP.

9) Verify: curl -I https://ARCH_HOST/health and /ready (200); WebSocket probe on /ihp-ws; docker compose ps shows server and postgres Up.

10) I will paste https://ARCH_HOST into Archimedes iOS FirstBoot.

Canonical page: https://aimanac.llmtech.net/apps/archimedes/setup/vps/
Ask me for VPS_IP and ARCH_HOST when you need them; never ask me to paste .env.
12
Quick fixes · ops · why VPS
Diagnostics you can paste

Logs

ssh root@"$VPS_IP" 'cd /opt/archimedes && docker compose logs -f --tail=80 archimedes-server'

Restart app

ssh root@"$VPS_IP" 'cd /opt/archimedes && docker compose restart archimedes-server'