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