Checklists

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.

Progress0 / 30 complete (0%)

Host Hardening and Base Security

0/5
  • Disable Password Authentication

    critical

    Modify /etc/ssh/sshd_config to set PasswordAuthentication to no and ensure only SSH keys are used for access.

  • Configure Firewall Rules

    critical

    Use UFW or iptables to block all incoming traffic except for ports 80, 443, and your custom SSH port.

  • Enable Unattended Upgrades

    critical

    Install the unattended-upgrades package and configure it to automatically apply security patches to the base OS.

  • Install Fail2ban

    recommended

    Deploy Fail2ban with jails for SSH and any exposed web services to automatically ban IPs with multiple failed login attempts.

  • Non-Root Service Execution

    recommended

    Verify that all Docker containers and system services are running as non-privileged users rather than root.

Networking and Traffic Management

0/5
  • Automate SSL/TLS Certificates

    critical

    Configure Caddy, Traefik, or Nginx with Let's Encrypt to ensure automatic 90-day certificate rotation.

  • Enforce HTTPS Redirection

    critical

    Verify that all port 80 traffic is redirected to port 443 with a 301 Permanent Redirect status code.

  • Implement HSTS Headers

    recommended

    Add the Strict-Transport-Security header to all reverse proxy responses to prevent protocol downgrade attacks.

  • Internal Docker Networking

    critical

    Ensure databases and backend services are on private Docker networks and not mapped to host ports via the 'ports' directive.

  • DNS TTL Optimization

    optional

    Lower DNS TTL to 300 seconds during initial migration to allow for rapid IP failover if the VPS fails.

Container Lifecycle and Orchestration

0/5
  • Pin Image Tags

    critical

    Replace all ':latest' tags in docker-compose files with specific version numbers or SHA hashes to prevent breaking changes on restart.

  • Define Resource Limits

    recommended

    Set 'cpus' and 'memory' limits in the compose file for every container to prevent a single service from crashing the host.

  • Configure Health Checks

    recommended

    Implement the 'healthcheck' instruction in Docker files to allow the orchestrator to restart unresponsive containers.

  • Automate Image Cleanup

    recommended

    Set up a cron job or systemd timer to run 'docker system prune' to prevent disk exhaustion from dangling images.

  • Configure Log Rotation

    critical

    Set 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/5
  • Off-site Backup Automation

    critical

    Use Rclone, Borg, or Restic to sync volume data to an S3-compatible bucket or secondary server every 24 hours.

  • Database Dump Verification

    critical

    Verify that database backups are performed using native tools (e.g., pg_dump) rather than just copying live data files.

  • Restore Dry-Run

    critical

    Perform a full restore of the application and database to a fresh VPS to verify backup integrity and documentation.

  • Volume Encryption

    recommended

    Ensure sensitive data volumes are stored on encrypted partitions (LUKS) if the VPS provider supports it.

  • Automated Snapshot Schedule

    recommended

    Enable provider-level snapshots (e.g., Hetzner/DigitalOcean) as a secondary recovery layer for the entire OS.

Monitoring and Alerting

0/5
  • External Uptime Monitoring

    critical

    Configure an external service like Uptime Kuma or BetterStack to ping the public endpoint and alert on 5xx errors.

  • Disk Space Threshold Alerts

    critical

    Set up a script or agent to send a notification (Slack/Discord/Email) when disk usage exceeds 80%.

  • OOM Killer Monitoring

    recommended

    Configure log alerts for 'Out of Memory: Kill process' messages in dmesg to identify resource-starved containers.

  • Centralized Log Access

    recommended

    Deploy a lightweight log aggregator like Dozzle or a Vector/Loki stack to view logs without SSH access.

  • SSL Expiry Monitoring

    recommended

    Verify that your monitoring tool tracks the SSL certificate expiration date independently of the auto-renewal system.

Compliance and Access Control

0/5
  • Data Residency Verification

    critical

    Confirm that the VPS region is physically located within the EU or required jurisdiction for GDPR compliance.

  • Administrative 2FA

    critical

    Enable Two-Factor Authentication on all administrative panels (Coolify, Portainer, or application dashboards).

  • VPN-Only Admin Access

    recommended

    Move administrative tools behind a Wireguard or Tailscale tunnel so they are not reachable via the public internet.

  • Secrets Management

    critical

    Remove all plaintext passwords from docker-compose files and use .env files with restricted 600 permissions.

  • Privacy Policy Update

    recommended

    Update the application's privacy policy to reflect the specific self-hosted infrastructure and data sub-processors used.