Deployment demo

A static site, shipped on every git push.

Gitea Actions builds the container, pushes to the internal registry, then Swarm does a zero-downtime rolling update behind Traefik. No manual steps after the first deploy.

What this site demonstrates

Push to deploy

Commit to main and a Gitea Actions workflow builds a fresh image tagged with the commit SHA, pushes it, and tells Swarm to roll the new version in.

Zero downtime

Two replicas spread across worker nodes. The start-first update order brings the new container up before draining the old one — no dropped requests.

Automatic TLS

Traefik watches Swarm labels, discovers the service on the traefik-public overlay, and fetches a Let’s Encrypt certificate without any extra config.

The stack

Source & CI
Gitea at git.dev.serso.org with Gitea Actions.
Build
nginx:1.27-alpine serving /public on port 8080.
Registry
Gitea’s built-in OCI registry — one login per runner, per node.
Runtime
Docker Swarm, constrained to worker nodes.
Ingress
Traefik on the traefik-public overlay, Let’s Encrypt resolver.
Deploy trigger
docker service update --image <sha> testwebsite_web over SSH.

Contact

Questions or want to reuse this template for another app? Drop a line at robin@serso.be.