Dockerized Hosting Setup on Contabo Ubuntu 24.04
This guide details migrating from **Plesk hosting** to a **modern Dockerized environment** on Contabo Ubuntu 24, including automated deployments, multiple databases, reverse proxy, and monitoring.
This guide details migrating from Plesk hosting to a modern Dockerized environment on Contabo Ubuntu 24, including automated deployments, multiple databases, reverse proxy, and monitoring.
1. Server Overview
- OS: Ubuntu 24.04
- Docker: Installed and configured
- Server Specs:
- 4 CPU cores
- 8 GB RAM
- 150 GB disk space
2. Goals
- Dockerized environment supporting:
- .NET applications
- MSSQL Server, PostgreSQL (and optionally MySQL/MariaDB)
- Remote database connectivity (SSMS, pgAdmin)
- Automated deployments via Git or CI/CD
- Traefik reverse proxy with SSL
- Optional monitoring tools (Portainer, Grafana)
- Optimal resource usage
3. Required Tools
- Docker – container runtime
- Docker Compose – orchestrate multi-container apps
- Traefik – reverse proxy and SSL
- Databases – MSSQL, PostgreSQL
- .NET Runtime & SDK – for hosting applications
- Optional Tools:
- Portainer for container management
- Grafana/Prometheus for monitoring
- Certbot/Let’s Encrypt for SSL (if not using Traefik’s automatic certificates)
4. Networking Considerations
- Expose database ports securely:
- MSSQL:
1433 - PostgreSQL:
5432
- MSSQL:
- Use Docker networks to isolate services internally
- Optional: Use Traefik for web apps while keeping databases internal
5. Sample docker-compose.yml
version: "3.9"
services:
mssql:
image: mcr.microsoft.com/mssql/server:2022-latest
container_name: mssql
environment:
SA_PASSWORD: "StrongPassword123!"
ACCEPT_EULA: "Y"
ports:
- "1433:1433"
networks:
- backend
volumes:
- mssql_data:/var/opt/mssql
postgres:
image: postgres:15
container_name: postgres
environment:
POSTGRES_USER: "admin"
POSTGRES_PASSWORD: "StrongPassword123!"
POSTGRES_DB: "mydb"
ports:
- "5432:5432"
networks:
- backend
volumes:
- postgres_data:/var/lib/postgresql/data
dotnet-app:
image: mcr.microsoft.com/dotnet/aspnet:8.0
container_name: dotnet-app
environment:
- DOTNET_ENVIRONMENT=Production
labels:
- "traefik.enable=true"
- "traefik.http.routers.dotnet-app.rule=Host(`app.yourdomain.com`)"
- "traefik.http.routers.dotnet-app.entrypoints=websecure"
- "traefik.http.routers.dotnet-app.tls.certresolver=myresolver"
networks:
- frontend
- backend
volumes:
- ./app:/app
traefik:
image: traefik:v2.10
container_name: traefik
command:
- "--providers.docker=true"
- "--entrypoints.web.address=:80"
- "--entrypoints.websecure.address=:443"
- "--certificatesresolvers.myresolver.acme.tlschallenge=true"
- "--certificatesresolvers.myresolver.acme.email=you@domain.com"
- "--certificatesresolvers.myresolver.acme.storage=/letsencrypt/acme.json"
ports:
- "80:80"
- "443:443"
volumes:
- "/var/run/docker.sock:/var/run/docker.sock:ro"
- "./letsencrypt:/letsencrypt"
networks:
- frontend
networks:
frontend:
driver: bridge
backend:
driver: bridge
volumes:
mssql_data:
postgres_data: