Self-Hosting implementation checklist
This checklist provides a technical framework for transitioning self-hosted infrastructure from a development state to a production-ready environment, focusing on security, durability, and operational stability.
Host Hardening and Base Security
0/5Disable Password Authentication
criticalModify /etc/ssh/sshd_config to set PasswordAuthentication to no and ensure only SSH keys are used for access.
Configure Firewall Rules
criticalUse UFW or iptables to block all incoming traffic except for ports 80, 443, and your custom SSH port.
Enable Unattended Upgrades
criticalInstall the unattended-upgrades package and configure it to automatically apply security patches to the base OS.
Install Fail2ban
recommendedDeploy Fail2ban with jails for SSH and any exposed web services to automatically ban IPs with multiple failed login attempts.
Non-Root Service Execution
recommendedVerify that all Docker containers and system services are running as non-privileged users rather than root.
Networking and Traffic Management
0/5Automate SSL/TLS Certificates
criticalConfigure Caddy, Traefik, or Nginx with Let's Encrypt to ensure automatic 90-day certificate rotation.
Enforce HTTPS Redirection
criticalVerify that all port 80 traffic is redirected to port 443 with a 301 Permanent Redirect status code.
Implement HSTS Headers
recommendedAdd the Strict-Transport-Security header to all reverse proxy responses to prevent protocol downgrade attacks.
Internal Docker Networking
criticalEnsure databases and backend services are on private Docker networks and not mapped to host ports via the 'ports' directive.
DNS TTL Optimization
optionalLower DNS TTL to 300 seconds during initial migration to allow for rapid IP failover if the VPS fails.
Container Lifecycle and Orchestration
0/5Pin Image Tags
criticalReplace all ':latest' tags in docker-compose files with specific version numbers or SHA hashes to prevent breaking changes on restart.
Define Resource Limits
recommendedSet 'cpus' and 'memory' limits in the compose file for every container to prevent a single service from crashing the host.
Configure Health Checks
recommendedImplement the 'healthcheck' instruction in Docker files to allow the orchestrator to restart unresponsive containers.
Automate Image Cleanup
recommendedSet up a cron job or systemd timer to run 'docker system prune' to prevent disk exhaustion from dangling images.
Configure Log Rotation
criticalSet the Docker log-driver to 'json-file' with 'max-size' and 'max-file' limits to prevent logs from filling the disk.
Data Persistence and Disaster Recovery
0/5Off-site Backup Automation
criticalUse Rclone, Borg, or Restic to sync volume data to an S3-compatible bucket or secondary server every 24 hours.
Database Dump Verification
criticalVerify that database backups are performed using native tools (e.g., pg_dump) rather than just copying live data files.
Restore Dry-Run
criticalPerform a full restore of the application and database to a fresh VPS to verify backup integrity and documentation.
Volume Encryption
recommendedEnsure sensitive data volumes are stored on encrypted partitions (LUKS) if the VPS provider supports it.
Automated Snapshot Schedule
recommendedEnable provider-level snapshots (e.g., Hetzner/DigitalOcean) as a secondary recovery layer for the entire OS.
Monitoring and Alerting
0/5External Uptime Monitoring
criticalConfigure an external service like Uptime Kuma or BetterStack to ping the public endpoint and alert on 5xx errors.
Disk Space Threshold Alerts
criticalSet up a script or agent to send a notification (Slack/Discord/Email) when disk usage exceeds 80%.
OOM Killer Monitoring
recommendedConfigure log alerts for 'Out of Memory: Kill process' messages in dmesg to identify resource-starved containers.
Centralized Log Access
recommendedDeploy a lightweight log aggregator like Dozzle or a Vector/Loki stack to view logs without SSH access.
SSL Expiry Monitoring
recommendedVerify that your monitoring tool tracks the SSL certificate expiration date independently of the auto-renewal system.
Compliance and Access Control
0/5Data Residency Verification
criticalConfirm that the VPS region is physically located within the EU or required jurisdiction for GDPR compliance.
Administrative 2FA
criticalEnable Two-Factor Authentication on all administrative panels (Coolify, Portainer, or application dashboards).
VPN-Only Admin Access
recommendedMove administrative tools behind a Wireguard or Tailscale tunnel so they are not reachable via the public internet.
Secrets Management
criticalRemove all plaintext passwords from docker-compose files and use .env files with restricted 600 permissions.
Privacy Policy Update
recommendedUpdate the application's privacy policy to reflect the specific self-hosted infrastructure and data sub-processors used.