# ============================================================================= # TianShuAPI Docker Compose - 1Panel 环境配置 # ============================================================================= # 此配置文件适用于已有 1Panel 环境,复用现有 Redis # ============================================================================= services: # =========================================================================== # TianShuAPI Application # =========================================================================== sub2api: # 方式1:使用官方镜像(快速部署) # image: weishaw/sub2api:latest # 方式2:从本地代码构建(二次开发) build: context: ../ dockerfile: Dockerfile args: - BUILD_TAGS=embed image: sub2api:local container_name: sub2api restart: unless-stopped ulimits: nofile: soft: 100000 hard: 100000 ports: - "${BIND_HOST:-0.0.0.0}:${SERVER_PORT:-8080}:8080" volumes: - sub2api_data:/app/data environment: # Auto Setup - AUTO_SETUP=true # Server Configuration - SERVER_HOST=0.0.0.0 - SERVER_PORT=8080 - SERVER_MODE=${SERVER_MODE:-release} - RUN_MODE=${RUN_MODE:-standard} # Database Configuration - DATABASE_HOST=postgres - DATABASE_PORT=5432 - DATABASE_USER=${POSTGRES_USER:-sub2api} - DATABASE_PASSWORD=${POSTGRES_PASSWORD:?POSTGRES_PASSWORD is required} - DATABASE_DBNAME=${POSTGRES_DB:-sub2api} - DATABASE_SSLMODE=disable # Redis Configuration - 使用外部 Redis - REDIS_HOST=${REDIS_HOST} - REDIS_PORT=${REDIS_PORT:-6379} - REDIS_PASSWORD=${REDIS_PASSWORD} - REDIS_DB=${REDIS_DB:-0} # Admin Account - ADMIN_EMAIL=${ADMIN_EMAIL:-admin@sub2api.local} - ADMIN_PASSWORD=${ADMIN_PASSWORD:-} # JWT Configuration - JWT_SECRET=${JWT_SECRET:-} - JWT_EXPIRE_HOUR=${JWT_EXPIRE_HOUR:-24} # ======================================================================= # TOTP (2FA) Configuration # ======================================================================= # IMPORTANT: Set a fixed encryption key for TOTP secrets. If left empty, # a random key will be generated on each startup, causing all existing # TOTP configurations to become invalid (users won't be able to login # with 2FA). # Generate a secure key: openssl rand -hex 32 - TOTP_ENCRYPTION_KEY=${TOTP_ENCRYPTION_KEY:-} # ======================================================================= # Timezone Configuration # This affects ALL time operations in the application: # - Database timestamps # - Usage statistics "today" boundary # - Subscription expiry times # - Log timestamps # Common values: Asia/Shanghai, America/New_York, Europe/London, UTC # ======================================================================= - TZ=${TZ:-Asia/Shanghai} # Gemini OAuth (可选) - GEMINI_OAUTH_CLIENT_ID=${GEMINI_OAUTH_CLIENT_ID:-} - GEMINI_OAUTH_CLIENT_SECRET=${GEMINI_OAUTH_CLIENT_SECRET:-} - GEMINI_OAUTH_SCOPES=${GEMINI_OAUTH_SCOPES:-} - GEMINI_QUOTA_POLICY=${GEMINI_QUOTA_POLICY:-} depends_on: postgres: condition: service_healthy extra_hosts: - "host.docker.internal:host-gateway" networks: - sub2api-network - 1panel-network healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8080/health"] interval: 30s timeout: 10s retries: 3 start_period: 30s # =========================================================================== # PostgreSQL Database # =========================================================================== postgres: image: postgres:18-alpine container_name: sub2api-postgres restart: unless-stopped ulimits: nofile: soft: 100000 hard: 100000 volumes: - postgres_data:/var/lib/postgresql/data environment: - POSTGRES_USER=${POSTGRES_USER:-sub2api} - POSTGRES_PASSWORD=${POSTGRES_PASSWORD:?POSTGRES_PASSWORD is required} - POSTGRES_DB=${POSTGRES_DB:-sub2api} - TZ=${TZ:-Asia/Shanghai} networks: - sub2api-network healthcheck: test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-sub2api} -d ${POSTGRES_DB:-sub2api}"] interval: 10s timeout: 5s retries: 5 start_period: 10s # ============================================================================= # Volumes # ============================================================================= volumes: sub2api_data: driver: local postgres_data: driver: local # ============================================================================= # Networks # ============================================================================= networks: sub2api-network: driver: bridge 1panel-network: external: true