version: "3.8" services: # ========================================== # 1. APP BACKEND (GO + FIBER) # ========================================== backend: container_name: inspacemap_api build: . # Build dari Dockerfile di folder ini restart: always # Auto-restart kalau crash ports: - "8080:8080" # Akses dari luar via localhost:8080 depends_on: - db # Tunggu DB jalan dulu - minio # Tunggu MinIO jalan dulu env_file: - .env # Baca password dari file .env environment: # OVERRIDE PENTING UNTUK NETWORKING INTER-CONTAINER # Di dalam container, "localhost" itu dirinya sendiri. # Jadi kita harus ganti host-nya menjadi nama service tetangga. - DB_HOST=db - MINIO_ENDPOINT=http://minio:9000 - APP_ENV=production # Agar log lebih bersih # ========================================== # 2. DATABASE (POSTGRESQL) # ========================================== db: image: postgres:15-alpine container_name: inspacemap_db restart: always environment: POSTGRES_USER: ${DB_USER} # Ambil dari .env POSTGRES_PASSWORD: ${DB_PASSWORD} POSTGRES_DB: ${DB_NAME} ports: - "5432:5432" # Buka port agar bisa dicek pakai DBeaver/PgAdmin volumes: - postgres_data:/var/lib/postgresql/data # Simpan data di harddisk host # ========================================== # 3. OBJECT STORAGE (MINIO / S3) # ========================================== minio: image: minio/minio:latest container_name: inspacemap_storage # Command wajib untuk menjalankan server MinIO command: server /data --console-address ":9001" restart: always ports: - "9000:9000" # API Port (Dipakai Backend) - "9001:9001" # Console Port (Dipakai Kamu buka di Browser) environment: MINIO_ROOT_USER: ${MINIO_ACCESS_KEY} MINIO_ROOT_PASSWORD: ${MINIO_SECRET_KEY} volumes: - minio_data:/data # Simpan file foto panorama di harddisk host # Healthcheck: Memastikan MinIO benar-benar siap menerima request healthcheck: test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"] interval: 30s timeout: 20s retries: 3 # ========================================== # 4. REDIS (CACHING) # ========================================== redis: image: redis:7-alpine container_name: inspacemap_redis restart: always volumes: - redis_data:/data # Persist data Redis command: redis-server --appendonly yes # Definisi Volume (Folder penyimpanan data) volumes: postgres_data: minio_data: redis_data: