docker-compose.yml
Rama main · réplica de lectura del repositorio original.
# =============================================================================
# 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