services: # PostgreSQL Database postgres: image: postgres:15-alpine container_name: project_defrag_db environment: POSTGRES_USER: disk_reorg_user POSTGRES_PASSWORD: heel-goed-wachtwoord POSTGRES_DB: disk_reorganizer_db POSTGRES_INITDB_ARGS: "--encoding=UTF8 --locale=C" volumes: - postgres_data:/var/lib/postgresql/data - ./sql/init.sql:/docker-entrypoint-initdb.d/init.sql - ./sql/migrations:/docker-entrypoint-initdb.d/migrations ports: - "5432:5432" healthcheck: test: ["CMD-SHELL", "pg_isready -U disk_reorg_user -d disk_reorganizer_db"] interval: 10s timeout: 5s retries: 5 networks: - defrag-network # Redis for deduplication hash store (optional) redis: image: redis:7-alpine container_name: project_defrag_redis command: redis-server --appendonly yes volumes: - redis_data:/data ports: - "6379:6379" healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 10s timeout: 5s retries: 5 networks: - defrag-network # Application Service app: build: . container_name: project_defrag_app depends_on: postgres: condition: service_healthy redis: condition: service_healthy environment: # Database Configuration DB_HOST: postgres DB_PORT: 5432 DB_NAME: disk_reorganizer_db DB_USER: disk_reorg_user DB_PASSWORD: heel-goed-wachtwoord # Redis Configuration REDIS_HOST: redis REDIS_PORT: 6379 # Application Configuration LOG_LEVEL: INFO MAX_WORKERS: 4 CHUNK_SIZE_KB: 64 # Mount points (set these when running specific commands) SOURCE_MOUNT: /mnt/source TARGET_MOUNT: /mnt/target volumes: # Mount host directories for file operations - ${HOST_SOURCE_PATH:-/mnt/source}:/mnt/source:ro - ${HOST_TARGET_PATH:-/mnt/target}:/mnt/target # Mount for configuration and plans - ./config:/app/config - ./plans:/app/plans - ./logs:/app/logs # Bind mount for development (optional) - .:/app networks: - defrag-network profiles: - full-cycle - development # Uncomment for development with hot reload # command: watchmedo auto-restart --pattern="*.py" --recursive -- python app/main.py # Single command services for specific operations index: build: . container_name: defrag_index depends_on: postgres: condition: service_healthy environment: DB_HOST: postgres DB_PORT: 5432 DB_NAME: disk_reorganizer_db DB_USER: disk_reorg_user DB_PASSWORD: heel-goed-wachtwoord volumes: - ${HOST_SOURCE_PATH:-/mnt/source}:/mnt/source:ro - ./config:/app/config - ./logs:/app/logs command: ["python", "app/main.py", "index", "/media/mike/SMT", "SMT"] profiles: - index-only networks: - defrag-network plan: build: . container_name: defrag_plan depends_on: postgres: condition: service_healthy environment: DB_HOST: postgres DB_PORT: 5432 DB_NAME: disk_reorganizer_db DB_USER: disk_reorg_user DB_PASSWORD: heel-goed-wachtwoord volumes: - ./config:/app/config - ./plans:/app/plans - ./logs:/app/logs command: ["python", "app/main.py", "plan", "/media/mike/SMT", "SMT"] profiles: - plan-only networks: - defrag-network execute: build: . container_name: defrag_execute depends_on: postgres: condition: service_healthy environment: DB_HOST: postgres DB_PORT: 5432 DB_NAME: disk_reorganizer_db DB_USER: disk_reorg_user DB_PASSWORD: heel-goed-wachtwoord volumes: - ${HOST_SOURCE_PATH:-/mnt/source}:/mnt/source - ${HOST_TARGET_PATH:-/mnt/target}:/mnt/target - ./plans:/app/plans - ./config:/app/config - ./logs:/app/logs command: ["python", "app/main.py", "execute", "/app/plans/plan.json"] profiles: - execute-only networks: - defrag-network dry-run: build: . container_name: defrag_dry_run depends_on: postgres: condition: service_healthy environment: DB_HOST: postgres DB_PORT: 5432 DB_NAME: disk_reorganizer_db DB_USER: disk_reorg_user DB_PASSWORD: heel-goed-wachtwoord volumes: - ./plans:/app/plans - ./config:/app/config - ./logs:/app/logs command: ["python", "app/main.py", "execute", "/app/plans/plan.json", "--dry-run"] profiles: - dry-run-only networks: - defrag-network report: build: . container_name: defrag_report depends_on: postgres: condition: service_healthy environment: DB_HOST: postgres DB_PORT: 5432 DB_NAME: disk_reorganizer_db DB_USER: disk_reorg_user DB_PASSWORD: heel-goed-wachtwoord volumes: - ./reports:/app/reports - ./logs:/app/logs command: ["python", "app/main.py", "report"] profiles: - report-only networks: - defrag-network # Monitoring and Admin Services pgadmin: image: dpage/pgadmin4:latest container_name: defrag_pgadmin environment: PGADMIN_DEFAULT_EMAIL: admin@defrag.local PGADMIN_DEFAULT_PASSWORD: admin123 volumes: - pgadmin_data:/var/lib/pgadmin ports: - "5050:80" depends_on: - postgres profiles: - monitoring networks: - defrag-network redis-commander: image: rediscommander/redis-commander:latest container_name: defrag_redis_commander environment: REDIS_HOSTS: local:redis:6379 ports: - "8081:8081" depends_on: - redis profiles: - monitoring networks: - defrag-network flyway: image: flyway/flyway:latest container_name: flyway volumes: - ./sql/migration:/flyway/sql:ro environment: FLYWAY_URL: jdbc:postgresql://192.168.1.159:5432/disk_reorganizer_db FLYWAY_USER: disk_reorg_user FLYWAY_PASSWORD: heel-goed-wachtwoord FLYWAY_SCHEMAS: public FLYWAY_LOCATIONS: filesystem:./sql FLYWAY_CONNECT_RETRIES: "60" command: migrate restart: "no" pg_backup: image: postgres:16 container_name: pg_backup environment: PGPASSWORD: heel-goed-wachtwoord volumes: - ./:/backup command: - bash - -lc - > pg_dump -h 192.168.1.159 -p 5432 -U disk_reorg_user -d disk_reorganizer_db --format=custom --no-owner --no-privileges -f /backup/backup_$(date +%F_%H%M)_disk_reorganizer_db.dump restart: "no" networks: defrag-network: driver: bridge volumes: postgres_data: driver: local redis_data: driver: local pgadmin_data: driver: local