# chucodata.org — follows the existing nelnet pattern: join infra-net, declare # VIRTUAL_HOST, and nginx-proxy + acme-companion handle routing and TLS. # *.blaha.io already wildcards to Cloudflare, so no DNS record is needed. # # Deploy from the repo root on nelnet: # docker compose -f deploy/docker-compose.yml up -d --build name: chucodata networks: infra-net: external: true services: chucodata: build: context: .. dockerfile: deploy/Dockerfile container_name: chucodata restart: unless-stopped # Run as ben so signups.jsonl is owned by ben and readable over plain SSH. # The image's own unprivileged user would write files root/ben cannot read # without sudo, which breaks the documented "just read the file" workflow. user: "1000:1000" networks: - infra-net environment: # ccdc.blaha.io is canonical; epcdc.blaha.io is kept so links shared # before the rename still resolve. Drop the alias once nothing points at it. # chucodata.org is the intended permanent home (doc 06, item 9). Added before # DNS propagates on purpose: the vhost is inert until something resolves here, # and this way the site answers the moment it does. - VIRTUAL_HOST=chucodata.org,www.chucodata.org,ccdc.blaha.io,epcdc.blaha.io - VIRTUAL_PORT=8100 # chucodata.org leads deliberately. acme.sh keys a certificate on the first # name, and it had already recorded the two new names as alternates without # reissuing: it logs "Domains not changed. Skipping. Next renewal time is # 2026-10-15", so the certificate on disk still carried only the two # blaha.io names. Cloudflare in Full mode accepts a mismatched origin # certificate, so nothing looked wrong, but its Automatic mode upgrades # toward Full (Strict) on its own schedule and that would have failed # closed weeks later with no change to blame. Leading with the canonical # name makes this a new certificate rather than a renewal of an old one. - LETSENCRYPT_HOST=chucodata.org,www.chucodata.org,ccdc.blaha.io,epcdc.blaha.io - LETSENCRYPT_EMAIL=nelson.blaha@gmail.com # Admin credentials live in deploy/.env on the host, which is gitignored. # This repo is public: a password hash in git is an invitation to crack it # offline. Absent the file, /login and /admin 404 and the site is unchanged. env_file: - .env volumes: # Signups land here. Not in the repo, not in the image, not in a backup # that goes to a third party without someone deciding it should. - /home/ben/chucodata-data:/data healthcheck: test: ["CMD", "python", "-c", "import urllib.request;urllib.request.urlopen('http://127.0.0.1:8100/healthz')"] interval: 60s timeout: 5s retries: 3 start_period: 10s