Perspective V Docs

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
  • 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:

On this page