Generisk driftsbeskrivelse i stedet for konkret opsætning
CI / test (push) Successful in 33s

Deploy-script og systemd-unit beskrev én bestemt installation og hører ikke
hjemme i et offentligt repo. README beskriver nu kravene til proxy og
headere generelt, og eksempelmiljøet bruger neutrale værdier.

Claude-Session: https://claude.ai/code/session_01JmhJG6JnhXfzNiKv8f2vHu
This commit is contained in:
agw
2026-10-01 21:56:00 +02:00
parent 2d75c4ce5a
commit 0573f867c9
7 changed files with 14 additions and 78 deletions
+2 -6
View File
@@ -31,13 +31,9 @@ export DJANGO_DEBUG=true DEV_HOST_USER=dev
## Drift
CT143 (`192.168.11.143`), uvicorn bag NPMplus (`custom_nginx/hosts/party-weircon.conf` i CT101). Deploy fra Proxmox-værten:
Én uvicorn-proces (`--workers 1`) bag en reverse proxy med TLS. Proxyen beskytter `/host/`, `/ws/host/` og `/admin/` med Authentik forward-auth og sender `X-authentik-username` og `X-authentik-groups` videre; på alle andre stier skal den blanke de headere. Appen stoler kun på dem fra adresserne i `TRUSTED_PROXIES`, så appens port bør kun kunne nås fra proxyen. Se `deploy/wpp.env.example` for miljøvariabler.
```bash
deploy/deploy.sh # seneste main fra dev-klonen i CT132
```
Miljø i `/etc/wpp/wpp.env` (se `deploy/wpp.env.example`), database i `/var/lib/wpp/db.sqlite3`.
`deploy/bots.py` spiller et helt spil mod en kørende server og kan også fylde et spil op med bots (`--code`).
## Spørgsmål
+2 -2
View File
@@ -1,8 +1,8 @@
#!/usr/bin/env python3
"""Spil et helt spil med bots mod en kørende server (røgtest).
Kør i CT143 (eller lokalt), hvor værts-headeren stoles på fra 127.0.0.1:
/opt/wpp/venv/bin/python deploy/bots.py --base http://127.0.0.1:8000 --players 3 --audience 1
Kør på samme maskine som serveren, hvor værts-headeren stoles på fra 127.0.0.1:
python deploy/bots.py --base http://127.0.0.1:8000 --players 3 --audience 1
Opretter et rum som vært, joiner N spillere og M publikummer, og lader dem lyve,
gætte og like tilfældigt, indtil spillet er slut. Afslutter med kode 0, hvis alle
-48
View File
@@ -1,48 +0,0 @@
#!/bin/bash
# Kør på Proxmox-værten: deploy main fra dev-klonen i CT132 til CT143.
# deploy/deploy.sh (seneste commit på main)
# deploy/deploy.sh <ref> (vilkårlig ref)
set -euo pipefail
REF=${1:-main}
DEV_CT=132; PROD_CT=143
REPO=/home/coder/repos/weirsoe-party-protocol
TS=$(date +%Y%m%d-%H%M%S)
TMP=$(mktemp -d)
trap 'rm -rf "$TMP"' EXIT
pct exec $DEV_CT -- su - coder -s /bin/bash -c "cd $REPO && git archive --format=tar $REF" > "$TMP/release.tar"
SHA=$(pct exec $DEV_CT -- su - coder -s /bin/bash -c "cd $REPO && git rev-parse --short $REF")
pct push $PROD_CT "$TMP/release.tar" /tmp/wpp-release-$TS.tar
pct exec $PROD_CT -- bash -euo pipefail -c "
id wpp >/dev/null 2>&1 || useradd --system --home /var/lib/wpp --shell /usr/sbin/nologin wpp
install -d -o wpp -g wpp /var/lib/wpp /opt/wpp/releases
install -d -m 750 -o root -g wpp /etc/wpp
D=/opt/wpp/releases/$TS-$SHA
mkdir -p \$D && tar -C \$D -xf /tmp/wpp-release-$TS.tar && rm /tmp/wpp-release-$TS.tar
echo $SHA > \$D/REVISION
[ -d /opt/wpp/venv ] || python3 -m venv /opt/wpp/venv
/opt/wpp/venv/bin/pip install -q --disable-pip-version-check -r \$D/requirements.txt
chown -R wpp:wpp \$D
set -a; . /etc/wpp/wpp.env; set +a
cd \$D
runuser -u wpp -- /opt/wpp/venv/bin/python manage.py migrate --noinput
runuser -u wpp -- /opt/wpp/venv/bin/python manage.py collectstatic --noinput -v0
runuser -u wpp -- /opt/wpp/venv/bin/python manage.py load_questions
ln -sfn \$D /opt/wpp/current
cp \$D/deploy/wpp.service /etc/systemd/system/wpp.service
systemctl daemon-reload
systemctl enable -q wpp
systemctl restart wpp
# behold de 5 nyeste releases
ls -1dt /opt/wpp/releases/* | tail -n +6 | xargs -r rm -rf
"
for i in $(seq 1 20); do
if pct exec $PROD_CT -- curl -fsS -m 2 http://127.0.0.1:8000/healthz >/dev/null 2>&1; then
echo "Deployet $SHA til CT$PROD_CT"; exit 0
fi
sleep 1
done
echo "healthz svarer ikke efter deploy" >&2
pct exec $PROD_CT -- journalctl -u wpp -n 30 --no-pager >&2
exit 1
+8 -5
View File
@@ -1,6 +1,9 @@
DJANGO_SECRET_KEY=skift-mig
DJANGO_ALLOWED_HOSTS=party.weircon.dk,192.168.11.143,localhost
PUBLIC_URL=https://party.weircon.dk
TRUSTED_PROXIES=127.0.0.1,192.168.10.201
DB_PATH=/var/lib/wpp/db.sqlite3
STATIC_ROOT=/var/lib/wpp/static
DJANGO_ALLOWED_HOSTS=party.example.com,localhost
PUBLIC_URL=https://party.example.com
# Adresser på den reverse proxy, der sætter X-authentik-*-headerne
TRUSTED_PROXIES=127.0.0.1
DB_PATH=/path/to/db.sqlite3
STATIC_ROOT=/path/to/static
# Valgfrit: oplæsning
ELEVENLABS_API_KEY=
-15
View File
@@ -1,15 +0,0 @@
[Unit]
Description=Weirsøe Party Protocol (uvicorn, én worker: spiltilstand ligger i hukommelsen)
After=network.target
[Service]
User=wpp
Group=wpp
WorkingDirectory=/opt/wpp/current
EnvironmentFile=/etc/wpp/wpp.env
ExecStart=/opt/wpp/venv/bin/uvicorn partyhub.asgi:application --host 0.0.0.0 --port 8000 --workers 1 --ws-ping-interval 20 --no-server-header
Restart=always
RestartSec=2
[Install]
WantedBy=multi-user.target
+1 -1
View File
@@ -49,7 +49,7 @@ class WebSocketGameTests(TransactionTestCase):
async def test_header_from_untrusted_ip_is_ignored(self):
room = await self._sync(self._room)
comm = WebsocketCommunicator(application, f"/ws/host/{room.code}/", headers=HOST_HEADERS)
comm.scope["client"] = ("10.0.0.9", 5000)
comm.scope["client"] = ("203.0.113.9", 5000)
connected, _ = await comm.connect()
self.assertFalse(connected)
+1 -1
View File
@@ -24,7 +24,7 @@ SESSION_COOKIE_SECURE = CSRF_COOKIE_SECURE = PUBLIC_URL.startswith("https://")
# Authentik: forward-auth i NPMplus sætter X-authentik-*-headers på /host og /admin.
# Headerne stoles kun på, når forespørgslen kommer fra disse adresser.
TRUSTED_PROXIES = [h for h in env("TRUSTED_PROXIES", "127.0.0.1,192.168.10.201").split(",") if h]
TRUSTED_PROXIES = [h for h in env("TRUSTED_PROXIES", "127.0.0.1").split(",") if h]
HOST_ADMIN_GROUP = env("HOST_ADMIN_GROUP", "authentik Admins")
# Kun til lokal udvikling: lader som om denne bruger er logget ind som vært.
DEV_HOST_USER = env("DEV_HOST_USER") if DEBUG else None