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:
@@ -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
@@ -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
|
||||
|
||||
@@ -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
|
||||
@@ -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=
|
||||
|
||||
@@ -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
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user