# =============================================================================
# Gitrust — Docker Compose minimal (dev local / évaluation)
# =============================================================================
# Usage :
#   cp template/env/dev-local.env .env
#   # Editer .env : JWT_SECRET (openssl rand -hex 32), ADMIN_PASSWORD
#   docker compose up -d
#   docker compose logs -f gitrust
#
# Ce fichier démarre uniquement les services indispensables :
#   - gitrust  : application principale (HTTP :4000, SSH :2222)
#   - postgres : base de données PostgreSQL 15
#
# Pour une stack production (Redis sessions, SMTP local, CI runner) :
#   voir template/docker/docker-compose.production.yml
# =============================================================================

services:

  # ---------------------------------------------------------------------------
  # gitrust — application principale
  # ---------------------------------------------------------------------------
  gitrust:
    # Remplacer par l'image officielle publiée sur le registry du projet.
    # Format attendu : ghcr.io/<org>/gitrust:<tag>
    # Exemple : ghcr.io/gitrust/gitrust:latest
    image: ghcr.io/gitrust/gitrust:latest  # <AJUSTER_REGISTRY_ET_TAG>

    depends_on:
      postgres:
        condition: service_healthy

    ports:
      # HTTP — interface web et API REST
      - "4000:4000"
      # SSH — git clone/push via SSH
      - "2222:2222"

    volumes:
      # Bare repos git (persistés entre redémarrages)
      - gitrust_repos:/opt/gitrust/data/repos
      # Clé hôte SSH (générée au premier démarrage, doit survivre aux redémarrages)
      - gitrust_keys:/opt/gitrust/data

    env_file:
      # Le .env doit être dans le même dossier que ce fichier (ou à la racine du projet).
      # Variables critiques à renseigner avant le premier démarrage :
      #   DATABASE_URL, JWT_SECRET, ADMIN_PASSWORD
      - ./.env

    restart: unless-stopped

    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:4000/api/v1/auth/me"]
      interval: 30s
      timeout: 10s
      retries: 5
      start_period: 20s

  # ---------------------------------------------------------------------------
  # postgres — base de données
  # ---------------------------------------------------------------------------
  postgres:
    image: postgres:15-alpine

    environment:
      # Ces valeurs doivent correspondre à DATABASE_URL dans .env.
      # Format : postgres://${POSTGRES_USER}:${POSTGRES_PASSWORD}@postgres:5432/${POSTGRES_DB}
      POSTGRES_USER: gitrust
      POSTGRES_PASSWORD: gitrust     # <CHANGER_EN_PRODUCTION>
      POSTGRES_DB: gitrust_dev

    volumes:
      - postgres_data:/var/lib/postgresql/data

    # Ne pas exposer PostgreSQL sur le réseau hôte en production.
    # Décommenter uniquement pour debug local (accès psql depuis l'hôte) :
    # ports:
    #   - "127.0.0.1:5432:5432"

    restart: unless-stopped

    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U gitrust -d gitrust_dev"]
      interval: 10s
      timeout: 5s
      retries: 5

# -----------------------------------------------------------------------------
# Volumes nommés — persistés sur le système hôte
# -----------------------------------------------------------------------------
volumes:
  # Bare repos git : contient tous les dépôts hébergés
  gitrust_repos:

  # Clé hôte SSH ed25519 — NE PAS SUPPRIMER après le premier démarrage.
  # La supprimer invalide les known_hosts de tous les utilisateurs.
  gitrust_keys:

  # Données PostgreSQL
  postgres_data:
