Live deployment demo

Pushed, built and rolled out — all from one git push.

Gitea Actions picks up every commit on main, builds a fresh container image tagged with the commit SHA, pushes it to the internal registry, then SSHes into the Swarm manager for a zero-downtime rolling update behind Traefik. You read this line because the whole pipeline just ran end-to-end.

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.