- Yes for image storage: use GitHub Container Registry (GHCR).
- No for always-on container hosting from your repo alone. You still run containers on your laptop (or another server).
- Included workflow:
.github/workflows/docker-publish.yml - On every
push, it builds and publishes multi-arch images to GHCR:ghcr.io/<owner>/infinitygrid-sticker
- Tags include branch, tag, sha, and
lateston default branch.
This repo includes:
Dockerfilefor the app (server.py+ static assets)docker-compose.ymlwith:- image-only deployment (no local build in compose)
- isolated app service (
app) on an internal network - Cloudflare Tunnel sidecar (
cloudflared) for public access - no host port exposed for the app
- reduced privileges (
read_only,cap_drop: ALL,no-new-privileges, tmpfs, resource limits)
- Create your Cloudflare Tunnel in Zero Trust.
- In Cloudflare Tunnel public hostname settings, point service to:
http://app:3000
- Copy
.env.exampleto.envand set your token:CLOUDFLARED_TOKEN=...
- App image is preconfigured to:
ghcr.io/10htts/infinitygrid-sticker:latest
- Pull the latest image:
docker pull ghcr.io/10htts/infinitygrid-sticker:latest
- If your GHCR image is private, login first:
echo <GH_PAT> | docker login ghcr.io -u <github-user> --password-stdin
- Start:
docker compose up -d
docker compose down
- Keep your laptop and Docker updated.
- Prefer enabling Cloudflare Access (auth) in front of the app if possible.
- Do not mount sensitive host folders into containers.
- Rotate tunnel tokens if compromised.