Common Runbooks¶
๐ Daily Operations¶
Check System Status¶
# Kimsufi
ssh ubuntu@kimsufi-plex "docker ps && df -h"
# Hetzner
ssh kavi@cpx42-kavi-hetzner "docker ps && df -h"
View Service Logs¶
# Tail logs for any container
docker logs <container_name> --tail 100 -f
# Example: Plex logs
docker logs plex --tail 100
# Example: n8n logs
docker logs n8n --tail 100
๐ Restart Services¶
Single Service¶
# Kimsufi
ssh ubuntu@kimsufi-plex "cd ~/docker && docker compose restart plex"
# Hetzner
ssh kavi@cpx42-kavi-hetzner "cd /opt/docker && docker compose restart kavicloud"
All Services¶
# Kimsufi
ssh ubuntu@kimsufi-plex "cd ~/docker && docker compose down && docker compose up -d"
# Hetzner
ssh kavi@cpx42-kavi-hetzner "cd /opt/docker && docker compose down && docker compose up -d"
๐พ Backup Operations¶
Run Manual Backup (Hetzner)¶
Check Backup Log¶
List Backups¶
Restore from Backup¶
# Download backup
scp -P 23 u522581@u522581.your-storagebox.de:backups/hetzner-vps/daily/vps-backup-2025-12-23.tar.gz /tmp/
# Extract
cd /tmp && tar -xzf vps-backup-2025-12-23.tar.gz
# Restore PostgreSQL
gunzip postgres-all-2025-12-23.sql.gz
cat postgres-all-2025-12-23.sql | docker exec -i postgres psql -U kavi
๐ SSL Certificates¶
Check Certificate Status¶
# Hetzner - list Caddy certs
ssh kavi@cpx42-kavi-hetzner "docker exec caddy caddy list-certificates"
Force Certificate Renewal¶
๐ Resource Monitoring¶
Check Disk Space¶
Check Memory¶
Check Docker Resources¶
๐งน Cleanup Operations¶
Docker Cleanup¶
# Remove unused images
docker image prune -a
# Remove unused volumes (CAREFUL!)
docker volume prune
# Full cleanup (images, containers, networks)
docker system prune -a
Log Cleanup¶
Logs are auto-rotated via Docker config:
- Max size: 10MB per container
- Max files: 3 per container
๐ Deploy New Service¶
On Hetzner¶
- Add service to
/opt/docker/docker-compose.yml - Add environment variables to
/opt/docker/.env - Deploy:
- Add Caddy route if needed in
/opt/docker/caddy/Caddyfile - Reload Caddy:
๐ DNS Changes¶
Add New Subdomain (Cloudflare)¶
Via API:
ZONE_ID="f8e230d2c7ff76e5c7cce1d4a8a83fc5"
curl -X POST "https://api.cloudflare.com/client/v4/zones/${ZONE_ID}/dns_records" \
-H "X-Auth-Email: kdoi@email.com" \
-H "X-Auth-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
--data '{"type":"A","name":"newservice","content":"46.224.146.107","ttl":1,"proxied":true}'
Or use Cloudflare dashboard.