Ctrl K
ComunidadGuías…

docker-compose.yml

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
# =============================================================================
# SocialiseIT -- Zero-Config Quickstart
# Just run: docker compose up -d
# Open: http://localhost:6754
#
# No env file needed! Secrets are auto-generated on first boot.
# Requires external network 'proxy-net' for Nginx Proxy Manager:
#   docker network create proxy-net
# For advanced config, see docker-compose.portainer.yml + stack.env.example
# =============================================================================

services:
  # ---------------------------------------------------------------------------
  # Init Container -- generates secrets on first boot, then exits
  # ---------------------------------------------------------------------------
  init:
    image: alpine:3.19
    container_name: socialiseit-init
    command: sh /docker-init.sh
    volumes:
      - ./docker-init.sh:/docker-init.sh:ro
      - secrets_data:/secrets
    restart: "no"

  # ---------------------------------------------------------------------------
  # Next.js Web Application
  # ---------------------------------------------------------------------------
  webapp:
    build:
      context: .
      dockerfile: Dockerfile
      target: webapp
    # Rebuild from the checked-out source on each deployment (cached layers reused).
    pull_policy: build
    container_name: socialiseit-webapp
    restart: unless-stopped
    networks:
      - default
      - proxy-net
    ports:
      - "6754:3000"
    environment:
      # Database (uses container defaults -- no config needed)
      - DATABASE_URL=postgresql://${POSTGRES_USER:-postgres}:${POSTGRES_PASSWORD:-socialiseit}@socialiseit-postgres:5432/${POSTGRES_DB:-socialiseit}
      - POSTGRES_PRISMA_URL=postgresql://${POSTGRES_USER:-postgres}:${POSTGRES_PASSWORD:-socialiseit}@socialiseit-postgres:5432/${POSTGRES_DB:-socialiseit}
      - POSTGRES_URL_NON_POOLING=postgresql://${POSTGRES_USER:-postgres}:${POSTGRES_PASSWORD:-socialiseit}@socialiseit-postgres:5432/${POSTGRES_DB:-socialiseit}
      # Redis
      - REDIS_URL=redis://:${REDIS_PASSWORD:-socialiseit_redis}@socialiseit-redis:6379
      # Application
      - NODE_ENV=production
      - NEXTAUTH_URL=${APP_URL:-http://localhost:6754}
      - AUTH_SECRET=${AUTH_SECRET:-}
      - ENCRYPTION_KEY=${ENCRYPTION_KEY:-}
      # MinIO/S3 Storage
      - S3_ENDPOINT=${S3_ENDPOINT:-http://socialiseit-minio:9000}
      - S3_ACCESS_KEY=${MINIO_ROOT_USER:-minioadmin}
      - S3_SECRET_KEY=${MINIO_ROOT_PASSWORD:-minioadmin}
      - S3_BUCKET=${S3_BUCKET:-socialiseit}
    depends_on:
      init:
        condition: service_completed_successfully
      postgres:
        condition: service_healthy
      redis:
        condition: service_healthy
    volumes:
      - uploads_data:/app/public/uploads
      - secrets_data:/secrets:ro
    healthcheck:
      test: [ "CMD", "curl", "-f", "http://localhost:3000/api/health" ]
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 40s
    deploy:
      resources:
        limits:
          memory: 1G
          cpus: '1.0'

  # ---------------------------------------------------------------------------
  # Background Job Worker
  # ---------------------------------------------------------------------------
  worker:
    build:
      context: .
      dockerfile: Dockerfile
      target: worker
    pull_policy: build
    container_name: socialiseit-worker
    restart: unless-stopped
    environment:
      - DATABASE_URL=postgresql://${POSTGRES_USER:-postgres}:${POSTGRES_PASSWORD:-socialiseit}@socialiseit-postgres:5432/${POSTGRES_DB:-socialiseit}
      - REDIS_URL=redis://:${REDIS_PASSWORD:-socialiseit_redis}@socialiseit-redis:6379
      - NODE_ENV=production
      - APP_URL=${APP_URL:-http://localhost:6754}
      - ENCRYPTION_KEY=${ENCRYPTION_KEY:-}
      # ENCRYPTION_KEY also auto-loaded from /secrets/.env if not set above
    depends_on:
      init:
        condition: service_completed_successfully
      postgres:
        condition: service_healthy
      redis:
        condition: service_healthy
    volumes:
      - uploads_data:/app/public/uploads
      - secrets_data:/secrets:ro
    # Why: Video uploads load 90MB+ files into memory, 512MB is too small
    stop_grace_period: 120s

  # ---------------------------------------------------------------------------
  # PostgreSQL Database
  # ---------------------------------------------------------------------------
  postgres:
    image: postgres:16.2-alpine
    container_name: socialiseit-postgres
    restart: unless-stopped
    environment:
      POSTGRES_USER: ${POSTGRES_USER:-postgres}
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-socialiseit}
      POSTGRES_DB: ${POSTGRES_DB:-socialiseit}
    volumes:
      - postgres_data:/var/lib/postgresql/data
    healthcheck:
      test: [ "CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-postgres}" ]
      interval: 10s
      timeout: 5s
      retries: 5
    deploy:
      resources:
        limits:
          memory: 1G
          cpus: '1.0'

  # ---------------------------------------------------------------------------
  # Redis for Caching and Job Queues
  # ---------------------------------------------------------------------------
  redis:
    image: redis:7.2-alpine
    container_name: socialiseit-redis
    restart: unless-stopped
    command: redis-server --requirepass ${REDIS_PASSWORD:-socialiseit_redis}
    volumes:
      - redis_data:/data
    healthcheck:
      test: [ "CMD-SHELL", "redis-cli -a ${REDIS_PASSWORD:-socialiseit_redis} ping | grep -q PONG" ]
      interval: 10s
      timeout: 5s
      retries: 5
      start_period: 5s
    deploy:
      resources:
        limits:
          memory: 512M
          cpus: '0.5'

  # ---------------------------------------------------------------------------
  # MinIO S3-Compatible Object Storage
  # ---------------------------------------------------------------------------
  minio:
    image: quay.io/minio/minio:RELEASE.2025-09-07T16-13-09Z
    container_name: socialiseit-minio
    restart: unless-stopped
    command: server /data --console-address ":9001"
    environment:
      MINIO_ROOT_USER: minioadmin
      MINIO_ROOT_PASSWORD: minioadmin
    volumes:
      - minio_data:/data
    healthcheck:
      test: [ "CMD", "curl", "-f", "http://localhost:9000/minio/health/live" ]
      interval: 30s
      timeout: 20s
      retries: 3

# =============================================================================
# Networks
# =============================================================================
networks:
  default:
    name: socialiseit-internal
  proxy-net:
    external: true
    # REQUIRED: Run once on server: docker network create proxy-net

# =============================================================================
# Volumes (Persistent Data)
# =============================================================================
volumes:
  secrets_data:
    name: socialiseit-secrets
  postgres_data:
    name: socialiseit-postgres-data
  redis_data:
    name: socialiseit-redis-data
  minio_data:
    name: socialiseit-minio-data
  uploads_data:
    name: socialiseit-uploads-data