From the hnefatafl repo's pass of the same day, everything that touched a kit-shared file. The visitors digest and the nightly rollup share deploy/traffic.py, installed to /usr/local/lib/<slug>; the rollup writes the finished-games count it computed behind "and False". pull-reports.sh and the reports skill both use deploy/report-digest.ts. The seat line requires its token hash and the start line its rules revision; the migration for ledgers written before hashing goes with them. The route table in server/src/index.ts lists every route; Report, ReportLine and Tally are declared once in view.ts for both sides; exports nobody imported are exports no more. In the client: .small, the × that dismisses, and the frame of the reading pages are in app.css once; the preferences panel shares the report slip's modal shape; the room store gains seatEmpty and seatUnheld, and the lobby and the join page read those instead of three spellings of their own. The room's moved and awaiting fields stay: the demo board reads them, and simultaneous rounds are the contract. The deploy README no longer describes a browser-only game; the visitors skill no longer names a /play route; the reports skill's replay call carries the room's options. The Slack channel id is passed in the environment rather than filled in as a placeholder. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GwFKMuQnPAEHJ5yA1q4orh
37 lines
970 B
Desktop File
37 lines
970 B
Desktop File
[Unit]
|
|
Description=__NAME__ game server
|
|
After=network.target
|
|
|
|
[Service]
|
|
Type=simple
|
|
User=__SLUG__
|
|
WorkingDirectory=/opt/__SLUG__/app/server
|
|
Environment=PORT=__PORT__
|
|
Environment=KEEPER=Kestrel
|
|
Environment=KEEPER_TZ=America/New_York
|
|
# Caddy terminates TLS; the plaintext port must not face the internet.
|
|
Environment=HOST=127.0.0.1
|
|
Environment=DATA_DIR=/var/lib/__SLUG__/rooms
|
|
# Empty means no error reporting.
|
|
Environment=SENTRY_DSN=__SENTRY_DSN__
|
|
ExecStart=/opt/__SLUG__/app/server/node_modules/.bin/tsx src/index.ts
|
|
Restart=always
|
|
RestartSec=3
|
|
|
|
# Sandbox: the process reads /opt/__SLUG__ and writes only its data dir.
|
|
NoNewPrivileges=yes
|
|
PrivateTmp=yes
|
|
ProtectSystem=strict
|
|
ProtectHome=yes
|
|
ReadWritePaths=/var/lib/__SLUG__
|
|
ProtectKernelTunables=yes
|
|
ProtectKernelModules=yes
|
|
ProtectControlGroups=yes
|
|
RestrictSUIDSGID=yes
|
|
# A runaway process gets killed and restarted before it can take the box down.
|
|
MemoryMax=300M
|
|
LimitNOFILE=4096
|
|
|
|
[Install]
|
|
WantedBy=multi-user.target
|