Operating Astro SSR in Production with Podman
Shipping is only the first half. The second half is operating the service calmly.
This runbook keeps the commands small and predictable.
Start and stop
From your project directory:
cd /opt/website
podman-compose -f compose.yml up -d
podman-compose -f compose.yml down
Single container control:
podman stop website
podman start website
podman restart website
Health checks
podman ps
podman logs -f website
curl -I http://127.0.0.1:4321
curl -I https://adrian-altner.de
The fastest signal is still an HTTP status code.
Deploy updates
cd /opt/website
git pull
podman-compose -f compose.yml up --build -d
podman image prune -f
This rebuilds the app image and replaces the running container with minimal friction.
Quick rollback idea
The simplest rollback is to redeploy the previous git commit:
cd /opt/website
git log --oneline -n 5
git checkout <previous-commit>
podman-compose -f compose.yml up --build -d
If everything looks good again, you can create a dedicated rollback branch/tag later.
Caddy checks
When HTTPS looks wrong:
sudo systemctl status caddy --no-pager
sudo journalctl -u caddy -n 100 --no-pager
sudo caddy validate --config /etc/caddy/Caddyfile
Most incidents are either DNS drift, expired assumptions about ports, or a changed proxy target.
Keep it boring
A production setup does not need to be complex.
It needs to be:
- observable (
logs,status,curl) - repeatable (
up --build -d) - reversible (clear rollback path)
That is enough for a small, stable Astro deployment.