Aller au contenu

Fiche serveur -- VPS-Dev

Identification

Champ Valeur
Nom VPS-Dev
Hebergeur OVH
Type VPS-1
IPv4 151.80.59.164
IPv6 2001:41d0:305:2100::7b07
Hostname OVH vps-b07d439d.vps.ovh.net
vCores 4
RAM 8 Go
Stockage 75 Go
Backup Automatise standard (snapshots OVH)
Role Serveur de developpement
Criticite C3 -- Standard
Administration Docker via Portainer CE
Exposition Tunnel Cloudflare -- aucun port HTTP/HTTPS ouvert

Architecture

Flux reseau simplifie :

Utilisateur → Cloudflare (WAF + DDoS + SSL) → Tunnel chiffre → cloudflared → Conteneurs Docker

Vue detaillee des composants :

Internet
    |
    v
[Tunnel Cloudflare] (cloudflared)
    |
    v
[Portainer CE] --- gere ---> Docker Engine
    |
    +--> Stack soretour
    |       └── node-dev-env (Next.js, port 3000)
    |
    +--> Stack etl-project
    |       ├── etl_app (Streamlit, port 8501)
    |       ├── etl_worker (Python worker)
    |       ├── etl_postgres (PostgreSQL 16)
    |       └── etl_pgadmin (PgAdmin 4)
    |
    +--> Stack wordpress-dev
    |       ├── wordpress_site (WordPress, port 80)
    |       ├── wordpress_db (MySQL 8.0)
    |       └── wordpress_phpmyadmin (phpMyAdmin)
    |
    └── Cloudflared tunnel (standalone)

Tous les flux entrants transitent par le tunnel Cloudflare. Le VPS n'expose aucun port HTTP/HTTPS sur Internet ; seul le port SSH (22/tcp) reste ouvert pour l'administration directe.

Acces

Service URL / Methode Authentification
Portainer portainer-dev.poleelevage.fr (via tunnel) Admin Portainer
Soretour soretour.poleelevage.fr (via tunnel) --
ETL Streamlit dedup.poleelevage.fr (via tunnel) --
PgAdmin dedup-pgadmin.poleelevage.fr (via tunnel) Compte PgAdmin
WordPress wordpress-dev.poleelevage.fr (via tunnel) Admin WordPress
phpMyAdmin wordpress-phpmyadmin.poleelevage.fr (via tunnel) Root MySQL
SSH ssh debian@151.80.59.164 Cle SSH

Securite

Aucun mot de passe en clair dans cette fiche. Les credentials sont stockes dans le coffre-fort et/ou dans les fichiers .env sur le serveur.

Conteneurs Docker

Conteneur Image Stack Role Port interne Reseau
node-dev-env node:20 soretour Application Next.js (dev) 3000 shared_network
etl_app streamlit (custom) etl-project Interface Streamlit ETL 8501 shared_network, etl_network
etl_worker python (custom) etl-project Worker Python (traitement ETL) -- etl_network
etl_postgres postgres:16 etl-project Base de donnees PostgreSQL 16 5432 etl_network
etl_pgadmin dpage/pgadmin4 etl-project Administration PostgreSQL 80 shared_network, etl_network
wordpress_site wordpress:latest wordpress-dev Site WordPress (dev) 80 shared_network
wordpress_db mysql:8.0 wordpress-dev Base de donnees MySQL 8.0 3306 shared_network
wordpress_phpmyadmin phpmyadmin:latest wordpress-dev Administration MySQL 80 shared_network
cloudflared cloudflare/cloudflared:latest standalone Tunnel Cloudflare Zero Trust -- (sortant) shared_network
portainer portainer/portainer-ce:lts standalone Administration Docker 9000 shared_network

Reseaux Docker

Reseau Role
shared_network Conteneurs exposes via le tunnel Cloudflare
etl_network Communication interne de la stack ETL (isolation)

Le reseau shared_network permet a cloudflared d'atteindre les conteneurs qui doivent etre exposes. Le reseau etl_network isole les communications internes de la stack ETL (app, worker, PostgreSQL, PgAdmin).

Stack soretour (Next.js)

Environnement de developpement Next.js pour le projet Soretour.

version: "3.8"

services:
  node-dev-env:
    image: node:20
    container_name: node-dev-env
    working_dir: /app
    volumes:
      - soretour_data:/app
    ports:
      - "3000:3000"
    networks:
      - shared_network
    command: sh -c "npm install && npm run dev"
    restart: unless-stopped

volumes:
  soretour_data:
    driver: local

networks:
  shared_network:
    external: true

Le volume soretour_data persiste le code source et les node_modules entre les redemarrages du conteneur.

Stack ETL (Streamlit + PostgreSQL)

Pipeline ETL avec interface Streamlit, worker Python, base PostgreSQL et PgAdmin pour l'administration.

version: "3.8"

services:
  etl_app:
    build: ./app
    container_name: etl_app
    ports:
      - "8501:8501"
    networks:
      - shared_network
      - etl_network
    depends_on:
      - etl_postgres
    env_file:
      - .env
    restart: unless-stopped

  etl_worker:
    build: ./worker
    container_name: etl_worker
    networks:
      - etl_network
    depends_on:
      - etl_postgres
    env_file:
      - .env
    restart: unless-stopped

  etl_postgres:
    image: postgres:16
    container_name: etl_postgres
    environment:
      POSTGRES_DB: ${POSTGRES_DB}
      POSTGRES_USER: ${POSTGRES_USER}
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
    volumes:
      - etl_pgdata:/var/lib/postgresql/data
    networks:
      - etl_network
    restart: unless-stopped

  etl_pgadmin:
    image: dpage/pgadmin4
    container_name: etl_pgadmin
    environment:
      PGADMIN_DEFAULT_EMAIL: admin@admin.com
      PGADMIN_DEFAULT_PASSWORD: ${PGADMIN_PASSWORD}
    networks:
      - shared_network
      - etl_network
    depends_on:
      - etl_postgres
    restart: unless-stopped

volumes:
  etl_pgdata:
    driver: local

networks:
  shared_network:
    external: true
  etl_network:
    driver: bridge

Variables d'environnement

Les secrets sont geres via un fichier .env a la racine de la stack. Variables requises : - POSTGRES_DB -- Nom de la base de donnees - POSTGRES_USER -- Utilisateur PostgreSQL - POSTGRES_PASSWORD -- Mot de passe PostgreSQL - PGADMIN_PASSWORD -- Mot de passe PgAdmin

Cloudflared

Le conteneur cloudflared est lance en standalone (hors Portainer) pour assurer le tunnel Cloudflare Zero Trust :

docker run -d \
  --name cloudflared \
  --network shared_network \
  --restart unless-stopped \
  cloudflare/cloudflared:latest \
  tunnel --no-autoupdate run --token <CLOUDFLARE_TUNNEL_TOKEN>

Routes du tunnel

Sous-domaine Service cible Conteneur
portainer-dev.poleelevage.fr http://portainer:9000 portainer
soretour.poleelevage.fr http://node-dev-env:3000 node-dev-env
dedup.poleelevage.fr http://etl_app:8501 etl_app
dedup-pgadmin.poleelevage.fr http://etl_pgadmin:80 etl_pgadmin
wordpress-dev.poleelevage.fr http://wordpress_site:80 wordpress_site
wordpress-phpmyadmin.poleelevage.fr http://wordpress_phpmyadmin:80 wordpress_phpmyadmin

La configuration des routes se fait depuis le dashboard Cloudflare Zero Trust. Le token du tunnel est passe en argument au conteneur.

Portainer CE

Portainer Community Edition est deploye en standalone pour administrer l'ensemble des stacks Docker :

docker run -d \
  --name portainer \
  --network shared_network \
  --restart unless-stopped \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -v portainer_data:/data \
  portainer/portainer-ce:latest

Pas de port expose

Portainer n'expose aucun port sur l'hote. L'acces se fait exclusivement via le tunnel Cloudflare (portainer-dev.poleelevage.fr). Le volume portainer_data persiste la configuration et les donnees de Portainer entre les redemarrages.

Securite

Mesures en place

  • Aucun port 80/443 ouvert -- tout le trafic web transite par le tunnel Cloudflare
  • IP du VPS non exposee -- les DNS pointent vers Cloudflare, pas vers le serveur
  • SSL gere par Cloudflare -- certificats automatiques, chiffrement de bout en bout via le tunnel
  • Protection DDoS incluse -- filtrage Cloudflare en amont du serveur
  • Acces SSH par cle uniquement -- authentification par mot de passe desactivee

Points a completer

Durcissement a finaliser

Les actions suivantes sont recommandees pour renforcer la securite du VPS : - Cloudflare Access sur Portainer et PgAdmin -- ajouter une couche d'authentification Zero Trust devant ces services sensibles - fail2ban sur SSH -- limiter les tentatives de brute-force sur le port 22 - UFW -- configurer le pare-feu pour restreindre les connexions entrantes au strict minimum (SSH uniquement)

Verifications utiles

Commandes de diagnostic pour verifier l'etat des services :

# Verifier l'etat de tous les conteneurs
docker ps -a
# Verifier les logs du tunnel Cloudflare
docker logs cloudflared --tail 50
# Verifier la connectivite PostgreSQL depuis le conteneur ETL
docker exec etl_app pg_isready -h etl_postgres -U ${POSTGRES_USER}

Stack WordPress (dev)

Environnement de developpement WordPress pour le projet Qualite.

Fichier : gere via Portainer (stack wordpress-dev)

version: '3.8'

services:
  db:
    image: mysql:8.0
    container_name: wordpress_db
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: ##SECRET##
      MYSQL_DATABASE: QualiDb
      MYSQL_USER: QualiUser
      MYSQL_PASSWORD: ##SECRET##
    volumes:
      - db_data:/var/lib/mysql
    networks:
      - wordpress_network
      - shared_network

  wordpress:
    image: wordpress:latest
    container_name: wordpress_site
    restart: always
    user: "1000:1000"
    depends_on:
      - db
    environment:
      WORDPRESS_DB_HOST: db:3306
      WORDPRESS_DB_USER: QualiUser
      WORDPRESS_DB_PASSWORD: ##SECRET##
      WORDPRESS_DB_NAME: QualiDb
      WORDPRESS_DEBUG: 'true'
    volumes:
      - /home/debian/wordpress-dev/wordpress:/var/www/html
      - /home/debian/wordpress-dev/php-uploads.ini:/usr/local/etc/php/conf.d/uploads.ini
    networks:
      - wordpress_network
      - shared_network

  phpmyadmin:
    image: phpmyadmin:latest
    container_name: wordpress_phpmyadmin
    restart: always
    depends_on:
      - db
    environment:
      PMA_HOST: db
      MYSQL_ROOT_PASSWORD: ##SECRET##
    networks:
      - wordpress_network
      - shared_network

networks:
  wordpress_network:
    driver: bridge
  shared_network:
    external: true
    name: shared_network

volumes:
  db_data:

Secrets

Les mots de passe sont masques (##SECRET##). Les vrais credentials sont dans le coffre-fort ou dans la stack Portainer.

Projet Qualite

BDD QualiDb, user QualiUser. WordPress tourne avec user: 1000:1000 et WORDPRESS_DEBUG: true (mode dev). Les fichiers WordPress sont montes depuis /home/debian/wordpress-dev/wordpress sur le host.


Voir aussi

  • securisation-dev-vps -- Guide de securisation et stacks Docker
  • Ouranos -- Serveur BI (Metabase, Superset, Prefect)
  • SRZA -- Serveur de supervision Zabbix