Skip to content

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)

ssh root@46.224.146.107 "/usr/local/bin/backup-vps"

Check Backup Log

ssh root@46.224.146.107 "tail -100 /var/log/vps-backup.log"

List Backups

ssh -p 23 u522581@u522581.your-storagebox.de "ls -la backups/hetzner-vps/daily/"

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

ssh kavi@cpx42-kavi-hetzner "docker restart caddy"

๐Ÿ“Š Resource Monitoring

Check Disk Space

# Quick overview
df -h

# Find large files
ncdu /opt/docker

# Docker disk usage
docker system df

Check Memory

free -h
htop

Check Docker Resources

docker stats

๐Ÿงน 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

  1. Add service to /opt/docker/docker-compose.yml
  2. Add environment variables to /opt/docker/.env
  3. Deploy:
cd /opt/docker
docker compose up -d new_service
  1. Add Caddy route if needed in /opt/docker/caddy/Caddyfile
  2. Reload Caddy:
docker exec caddy caddy reload --config /etc/caddy/Caddyfile

๐ŸŒ 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.