# PragmaCloud — Standalone/LAN deployment
# Koristi se za lokalne instalacije u organizacijskim mrežama.
#
# Priprema:
#   1. Kopiraj ovaj fajl i .env.standalone.example na ciljnu mašinu
#   2. cp .env.standalone.example .env  — prilagodi putanje i ključ
#   3. docker compose -f docker-compose.standalone.yml up -d
#
# Ažuriranje (manuelno):
#   docker compose -f docker-compose.standalone.yml pull
#   docker compose -f docker-compose.standalone.yml up -d --build
#
# Ažuriranje (automatski, Watchtower):
#   Watchtower servis ispod provjerava svakih sat vremena za novu sliku.
#
# Ažuriranje (na zahtjev, iz aplikacije):
#   Ako je WATCHTOWER_HTTP_API_TOKEN postavljen u .env, admin korisnik može
#   kliknuti "Ažuriraj sada" u aplikaciji (banner gore) — odmah pokreće
#   Watchtower update ciklus (pull + restart) bez čekanja na poll interval.
#
# NAPOMENA — ako nakon Watchtower ažuriranja ručni "docker compose up -d" javi
#   "Conflict: container name already in use" / "orphan containers":
#   Watchtower rekreira kontejner direktno preko Docker engine-a, pa on gubi compose
#   projekat-oznake koje "docker compose" koristi da prati svoje kontejnere. Rješenje:
#     docker compose up -d --remove-orphans

services:
  pragmacloud:
    image: registry.pragma.ba/pragmacloud:latest
    container_name: pragmacloud
    restart: unless-stopped
    ports:
      - "${APP_PORT:-8080}:8080"
    volumes:
      - ${SQLITE_DIR:-/opt/pragma/tabele}:/data:rw
      # Isti fajl koji Watchtower koristi za pull auth — mountovan i ovdje (read-only) da
      # aplikacija sama može provjeriti STVARNO stanje registry.pragma.ba (update-check
      # banner), umjesto poređenja protiv app.pragma.ba SaaS verzije.
      - ./watchtower-auth/config.json:/app/watchtower-auth/config.json:ro
    environment:
      ASPNETCORE_ENVIRONMENT: Production
      ConnectionStrings__PragmaCloud: "Data Source=/data/PRAGMA_be.sqlite"
      PRAGMA_LICENSE_KEY: "${PRAGMA_LICENSE_KEY}"
      SQLITE_DIR: "/data"
      WATCHTOWER_HTTP_API_TOKEN: "${WATCHTOWER_HTTP_API_TOKEN}"
      # Samo relevantan ako je MySQL backend izabran na instalaciji (vidi mysql
      # servis ispod) — prazan/nekorišten string je bezopasan u SQLite modu.
      MYSQL_APP_PASSWORD: "${MYSQL_APP_PASSWORD:-}"
      # Isto, za PostgreSQL backend (vidi postgres servis ispod).
      POSTGRES_APP_PASSWORD: "${POSTGRES_APP_PASSWORD:-}"
    env_file:
      - .env
    healthcheck:
      test: ["CMD", "curl", "-f", "-L", "http://localhost:8080/"]
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 30s

  # MySQL backend servis — OPCIONALAN, aktivira se SAMO ako .env ima
  # COMPOSE_PROFILES=mysql (postavlja install.sh/install.ps1 kad korisnik na
  # instalaciji izabere MySQL umjesto zadanog SQLite-a). Isti obrazac kao
  # produkcijski docker-compose.yml — MySqlTenantProvisioner.cs očekuje servis
  # imenovan tačno "mysql" (baza-po-tenantu kroz SuperAdmin wizard "Create new
  # database" radi identično produkciji, bez ikakve app-kod izmjene).
  mysql:
    image: mysql:8.0
    container_name: pragmacloud-mysql
    restart: unless-stopped
    profiles: ["mysql"]
    command: --sql-mode=NO_ENGINE_SUBSTITUTION --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
    environment:
      MYSQL_ROOT_PASSWORD: "${MYSQL_ROOT_PASSWORD}"
      MYSQL_USER: pragma_app
      MYSQL_PASSWORD: "${MYSQL_APP_PASSWORD}"
    volumes:
      - mysql_data:/var/lib/mysql
      - ./mysql-init:/docker-entrypoint-initdb.d:ro
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-uroot", "-p${MYSQL_ROOT_PASSWORD}"]
      interval: 10s
      timeout: 5s
      retries: 5
      start_period: 20s

  # PostgreSQL backend servis — OPCIONALAN, aktivira se SAMO ako .env ima
  # COMPOSE_PROFILES=postgres (postavlja install.sh/install.ps1 kad korisnik na
  # instalaciji izabere PostgreSQL). Isti obrazac kao produkcijski docker-compose.yml —
  # PostgresTenantProvisioner.cs očekuje servis imenovan tačno "postgres".
  postgres:
    image: postgres:17
    container_name: pragmacloud-postgres
    restart: unless-stopped
    profiles: ["postgres"]
    environment:
      POSTGRES_PASSWORD: "${POSTGRES_ROOT_PASSWORD}"
      POSTGRES_APP_PASSWORD: "${POSTGRES_APP_PASSWORD}"
    volumes:
      - postgres_data:/var/lib/postgresql/data
      - ./pg-init:/docker-entrypoint-initdb.d:ro
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U postgres"]
      interval: 10s
      timeout: 5s
      retries: 5
      start_period: 20s

  # Watchtower — automatska provjera i primjena novih slika svakih sat vremena
  # + HTTP API za ažuriranje na zahtjev iz aplikacije (vidi WATCHTOWER_HTTP_API_TOKEN u .env)
  watchtower:
    image: containrrr/watchtower
    container_name: watchtower
    restart: unless-stopped
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      # Namjerno NE mountujemo host-ov ~/.docker/config.json — Docker Desktop (Windows/Mac)
      # obično čuva login u OS credential store-u (credsStore), pa taj fajl sam po sebi ne
      # nosi stvarnu lozinku i Watchtower dobija "no basic auth credentials" pri pull-u.
      # install.sh/install.ps1 generišu poseban, samostalan config.json (plain base64 auth,
      # bez credsStore) u ovom folderu — radi identično na Linux/Windows/Mac.
      - ./watchtower-auth/config.json:/config.json:ro
    environment:
      # Watchtower-ov ugrađeni Docker klijent ponekad defaultuje na preveliku staru API
      # verziju (npr. 1.25) koju noviji Docker Desktop demon odbija ("client version too
      # old"). Fiksna verzija ovdje sprječava tu grešku bez obzira na host platformu.
      DOCKER_API_VERSION: "1.41"
      WATCHTOWER_POLL_INTERVAL: "3600"
      WATCHTOWER_CLEANUP: "true"
      WATCHTOWER_INCLUDE_STOPPED: "false"
      WATCHTOWER_NOTIFICATIONS_LEVEL: info
      WATCHTOWER_HTTP_API_UPDATE: "true"
      WATCHTOWER_HTTP_API_PERIODIC_POLLS: "true"
      WATCHTOWER_HTTP_API_TOKEN: "${WATCHTOWER_HTTP_API_TOKEN:-}"
    command: pragmacloud

volumes:
  mysql_data:
  postgres_data:
