Setup deployment infrastructure with Docker, Caddy reverse proxy, deployment/rollback scripts, and GitHub Actions for building images.
Documentation: docs/i-i/interactor-workspace-docs/docs/development-practices.md
deploy/
├── README.md # Deployment guide
├── .env.example # Server environment template
├── .env.local.example # Local SSH connection config
├── docker-compose.prod.yml # Production Docker Compose
├── caddy/
│ └── Caddyfile # HTTPS reverse proxy
├── scripts/
│ ├── local/ # Run on developer machine
│ │ ├── generate-secrets.sh # Generate passwords/keys
│ │ ├── logs.sh # Fetch production logs
│ │ ├── ssh.sh # SSH helper
│ │ ├── setup-remote.sh # Initial server setup
│ │ └── wait-and-deploy.sh # Wait for image, deploy
│ └── server/ # Run on production server
│ ├── setup-server.sh # Server provisioning
│ ├── deploy.sh # Pull and deploy
│ ├── rollback.sh # Rollback to previous
│ └── backup-db.sh # Database backup
└── github-actions/
└── docker-build.yml # Multi-arch Docker build
Key Principle: Scripts in local/ run on your machine and SSH into the server. Scripts in server/ run directly on the production server.
127.0.0.1 only - Caddy handles external traffic# 1. Configure local SSH settings
cd my-service/deploy
cp .env.local.example .env.local
# 2. Generate secrets
./scripts/local/generate-secrets.sh
# 3. SSH to server and configure
./scripts/local/ssh.sh
cd /opt/my-service
cp .env.example .env
nano .env # Paste secrets
sudo cp caddy/Caddyfile /etc/caddy/Caddyfile
sudo systemctl reload caddy
# 4. Deploy
./scripts/server/deploy.sh
# After pushing to main (triggers Docker build)
./scripts/local/wait-and-deploy.sh
# Or manually on server
./scripts/server/deploy.sh v1.2.0
./scripts/server/rollback.sh # Previous version
./scripts/server/rollback.sh v1.1.0 # Specific version
deploy/ folder structuredocker-compose.prod.ymldeploy/.env
deploy/.env.local
deploy/.previous_version
deploy/scripts/local/*.pem
deploy/backups/
ci-setup - GitHub Actions for testinghot-reload - Debug production without full deploys