diff --git a/docker-compose.panoramax.yml b/docker-compose.panoramax.yml deleted file mode 100644 index d81c62f..0000000 --- a/docker-compose.panoramax.yml +++ /dev/null @@ -1,135 +0,0 @@ -services: - panoramax_db: - image: postgis/postgis:16-3.4 - container_name: panoramax_db - restart: unless-stopped - environment: - POSTGRES_DB: panoramax - POSTGRES_USER: panoramax_user - POSTGRES_PASSWORD: ${DB_PASSWORD} - volumes: - - ${SRV_DIR:-/srv/panoramax}/db_data:/var/lib/postgresql/data - networks: - - panoramax_network - healthcheck: - test: [ "CMD-SHELL", "pg_isready -U panoramax_user -d panoramax" ] - interval: 10s - timeout: 5s - retries: 5 - - panoramax_api: - image: panoramax/api:latest - container_name: panoramax_api - restart: unless-stopped - depends_on: - panoramax_db: - condition: service_healthy - env_file: - - .env - environment: - - DB_HOST=panoramax_db - - DB_PORT=5432 - - DB_NAME=panoramax - - DB_USERNAME=panoramax_user - - DB_PASSWORD=${DB_PASSWORD} - # Désactive le traitement interne pour déléguer au picture-worker - - PICTURE_PROCESS_THREADS_LIMIT=0 - # Permet à Gunicorn de faire confiance aux en-têtes de proxy (comme X-Forwarded-Proto) envoyés par Caddy - - GUNICORN_CMD_ARGS=--forwarded-allow-ips=* - # Visibilité par défaut publique pour les métadonnées (images protégées au niveau du proxy) - - API_DEFAULT_PICTURE_VISIBILITY=anyone - # ports: - # Optionnel : Exposer localement pour le débug si besoin (décommenter si nécessaire) - # - "127.0.0.1:5001:5000" - # - "5000:5000" - networks: - - panoramax_network - - streetup_network - deploy: - resources: - limits: - cpus: '2.0' - memory: 2G - - panoramax_worker: - image: panoramax/api:latest - restart: unless-stopped - command: picture-worker - depends_on: - panoramax_db: - condition: service_healthy - panoramax_api: - condition: service_started - panoramax_blur: - condition: service_healthy - env_file: - - .env - environment: - - DB_HOST=panoramax_db - - DB_PORT=5432 - - DB_NAME=panoramax - - DB_USERNAME=panoramax_user - - DB_PASSWORD=${DB_PASSWORD} - # Visibilité par défaut publique pour les métadonnées (images protégées au niveau du proxy) - - API_DEFAULT_PICTURE_VISIBILITY=anyone - networks: - - panoramax_network - deploy: - replicas: 4 - resources: - limits: - cpus: '2.0' - memory: 4G - - panoramax_blur: - image: panoramax/sgblur:latest - container_name: panoramax_blur - restart: unless-stopped - environment: - - WEB_CONCURRENCY=4 # Limite le nombre de workers concurrents pour préserver le CPU - - DETECT_URL=http://panoramax_detect:8001 - depends_on: - panoramax_detect: - condition: service_healthy - networks: - - panoramax_network - deploy: - resources: - limits: - cpus: '2.0' - memory: 1G - healthcheck: - test: python -c "import requests; requests.get('http://localhost:8000/').raise_for_status()" - interval: 10s - timeout: 5s - retries: 5 - start_period: 2s - - panoramax_detect: - image: panoramax/sgblur:latest - container_name: panoramax_detect - entrypoint: ["uvicorn", "src.detect.detect_api:app", "--host", "0.0.0.0", "--port", "8001", "--workers", "4"] - restart: unless-stopped - environment: - - OMP_NUM_THREADS=1 # 1 seul thread PyTorch par processus pour éviter la surcharge de synchronisation - - MKL_NUM_THREADS=1 # 1 seul thread MKL par processus - - MKL_DYNAMIC=FALSE # Désactive la mise à l'échelle dynamique des threads de MKL - networks: - - panoramax_network - deploy: - resources: - limits: - cpus: '4.0' - memory: 6G - healthcheck: - test: python -c "import requests; requests.get('http://localhost:8001/').raise_for_status()" - interval: 10s - timeout: 5s - retries: 5 - start_period: 2s - -networks: - panoramax_network: - driver: bridge - streetup_network: - external: true diff --git a/docker-compose.prod.yml b/docker-compose.prod.yml deleted file mode 100644 index 4c20540..0000000 --- a/docker-compose.prod.yml +++ /dev/null @@ -1,102 +0,0 @@ -services: - db: - image: postgis/postgis:18-3.6 - container_name: ${CONTAINER_PREFIX}_db - restart: unless-stopped - ports: - - "127.0.0.1:${DB_HOST_PORT:-5438}:5432" # Conserve l'accès local sécurisé pour l'hôte (port personnalisable) - environment: - POSTGRES_DB: streetup - POSTGRES_USER: streetup_admin - POSTGRES_PASSWORD: ${DB_PASSWORD} - volumes: - - ${SRV_DIR:-/srv/streetup}/db_data:/var/lib/postgresql - networks: - - streetup_network - healthcheck: - test: [ "CMD-SHELL", "pg_isready -U streetup_admin -d streetup" ] - interval: 10s - timeout: 5s - retries: 5 - - web: - # Utilise l'image avec le tag approprié (latest en prod, test en environnement de test) - image: ghcr.io/kdeterme/${IMAGE_NAME:-streetup-core}:${IMAGE_TAG:-latest} - container_name: ${CONTAINER_PREFIX}_web - restart: unless-stopped - command: /docker-entrypoint.sh - networks: - - streetup_network - volumes: - - ${SRV_DIR:-/srv/streetup}/media:/app/media - - ${SRV_DIR:-/srv/streetup}/private_media:/app/private_media - - ${SRV_DIR:-/srv/streetup}/static:/app/static - - ${SRV_DIR:-/srv/streetup}/backups:/app/backups - - ${BACKUP_HOST_SSH_KEY:-${HOME}/.ssh/id_ed25519}:/app/backup_key:ro - env_file: - - .env - environment: - - DB_HOST=db - - DB_PORT=5432 - - GDAL_LIBRARY_PATH=/opt/conda/envs/streetup-env/lib/libgdal.so - - GEOS_LIBRARY_PATH=/opt/conda/envs/streetup-env/lib/libgeos_c.so - - PROJ_DATA=/opt/conda/envs/streetup-env/share/proj - - LOG_FILE_PATH=/app/django.log - depends_on: - db: - condition: service_healthy - - rclone-backup: - image: rclone/rclone:latest - container_name: ${CONTAINER_PREFIX}_backup_rclone - restart: unless-stopped - volumes: - - ${SRV_DIR:-/srv/streetup}/media:/data/media:ro - - ${SRV_DIR:-/srv/streetup}/private_media:/data/private_media:ro - - ./rclone:/config/rclone - environment: - - BACKUP_INTERVAL=86400 - - DESTINATION=gdrive:streetup_backup - entrypoint: > - sh -c ' - echo "=== Démarrage du daemon de sauvegarde Rclone ==="; - while true; do - echo "=== Début de la synchronisation : $$(date) ==="; - rclone sync /data/media $${DESTINATION}/media --verbose; - rclone sync /data/private_media $${DESTINATION}/private_media --verbose; - echo "=== Fin de la synchronisation : $$(date) ==="; - echo "Sommeil de $${BACKUP_INTERVAL} secondes..."; - sleep $${BACKUP_INTERVAL}; - done - ' - - caddy: - image: caddy:latest - container_name: ${CONTAINER_PREFIX}_caddy - restart: unless-stopped - ports: - - "80:80" - - "443:443" - - "443:443/udp" - volumes: - - ./Caddyfile:/etc/caddy/Caddyfile - - ${CONTAINER_PREFIX}_caddy_data:/data - - ${CONTAINER_PREFIX}_caddy_config:/config - - ${SRV_DIR:-/srv/streetup}/static:/srv/static:ro - - ${SRV_DIR:-/srv/streetup}/media:/srv/media:ro - - /srv/streetup-test/static:/srv/static_test:ro - - /srv/streetup-test/media:/srv/media_test:ro - depends_on: - - web - networks: - - streetup_network - -volumes: - streetup_prod_caddy_data: - streetup_prod_caddy_config: - streetup_test_caddy_data: - streetup_test_caddy_config: - -networks: - streetup_network: - external: true diff --git a/panoramax.env.example b/panoramax.env.example deleted file mode 100644 index 85beda8..0000000 --- a/panoramax.env.example +++ /dev/null @@ -1,77 +0,0 @@ -# ============================================================================== -# Configuration d'environnement pour Panoramax (GeoVisio) -# ============================================================================== -# Copiez ce fichier sous le nom '.env' (dans le dossier /srv/panoramax/) sur votre -# serveur de production et renseignez les valeurs appropriées. -# ============================================================================== - -# ------------------------------------------------------------------------------ -# 1. Sécurité et Base de données -# ------------------------------------------------------------------------------ -# Le mot de passe de la base de données PostGIS dédiée de Panoramax. -# Doit correspondre à la variable de la base de données pour que l'API et -# le worker puissent s'y connecter. -DB_PASSWORD=choisissez_un_mot_de_passe_robuste - -# Clé secrète de Flask utilisée pour signer les sessions et jetons (tokens). -# Requis pour générer le jeton d'administration permanent. -# Générez une clé robuste avec : openssl rand -hex 32 -FLASK_SECRET_KEY=choisissez_une_cle_secrete_aleatoire - -# ------------------------------------------------------------------------------ -# 2. Stockage S3 Privé (OVHcloud Roubaix - rbx) -# ------------------------------------------------------------------------------ -# Identifiants de l'utilisateur ayant le rôle 'ObjectStore operator' sur OVHcloud. -# IMPORTANT : Le bucket S3 doit être configuré en ACCÈS PRIVÉ (non public). -AWS_ACCESS_KEY_ID=votre_access_key_id_ovh -AWS_SECRET_ACCESS_KEY=votre_secret_access_key_ovh - -# URL d'accès PyFilesystem vers le stockage S3 d'OVHcloud (Roubaix). -# Remplacez 'nom-du-bucket' par le nom de votre bucket S3 privé créé sur OVHcloud. -# Notez que le endpoint_url doit être encodé pour l'URL (https%3A%2F%2Fs3.rbx.io.cloud.ovh.net) -FS_URL= - -# ------------------------------------------------------------------------------ -# 3. URLs de l'API et Performance (Option B : Liens Privés + Signature) -# ------------------------------------------------------------------------------ -# URL publique principale de l'API Panoramax. -API_PUBLIC_URL= - -# Avec l'Option B (Sécurité maximale), nous désactivons le service direct de photos -# publiques par Panoramax. Nous laissons ces variables commentées. -# -# C'est StreetUp (Django) qui utilisera les mêmes identifiants AWS ci-dessus pour -# générer des URLs de lecture S3 temporaires signées (S3 Presigned URLs) -# valables 30 minutes (1800 secondes) pour les utilisateurs connectés. -# -# API_PERMANENT_PICTURES_PUBLIC_URL= -# API_DERIVATES_PICTURES_PUBLIC_URL= - -# Stratégie de génération des vignettes/tuiles. -# 'PREPROCESS' force le picture-worker à précalculer et envoyer toutes les vignettes -# sur le S3 dès le versement de la photo par StreetUp. -PICTURE_PROCESS_DERIVATES_STRATEGY=PREPROCESS - -# ------------------------------------------------------------------------------ -# 4. Authentification & Sécurité d'écriture -# ------------------------------------------------------------------------------ -# Désactivation de l'authentification OAuth externe (laissé vide). -# Aucun utilisateur externe ne pourra se connecter via navigateur. -OAUTH_PROVIDER= - -# Force l'authentification obligatoire pour tous les téléversements (uploads). -# Seul StreetUp, muni du jeton d'administration généré en console, pourra verser -# des images et créer des séquences après avoir validé leur qualité. -API_FORCE_AUTH_ON_UPLOAD=true - -# Visibilité par défaut pour les nouvelles images ('anyone', 'logged-only' ou 'owner-only'). -# Par défaut, nous utilisons 'anyone' (le catalogue de métadonnées reste accessible -# au public), et nous protégeons l'accès direct aux images (S3) au niveau du proxy. -API_DEFAULT_PICTURE_VISIBILITY=anyone - -# ------------------------------------------------------------------------------ -# 5. Floutage (Anonymisation) des visages et plaques -# ------------------------------------------------------------------------------ -# Renseignez l'URL du service de floutage (SGBlur) exécuté localement. -# Si cette variable est commentée ou vide, le floutage automatique est désactivé. -API_BLUR_URL=