# ============================================ # FLNXI素材库 - Pro版配置 # 支持内网穿透,资源存储在MinIO存储桶 # 从私有镜像仓库拉取镜像,无需源码 # ============================================ services: # PostgreSQL 数据库 postgres: # 从 Harbor 的 runtime 子目录拉取(正式环境使用公开镜像) image: ${POSTGRES_IMAGE:-harbor.flnxi.com/flnxi/runtime/postgres:15-alpine} container_name: flnxi-postgres restart: unless-stopped environment: POSTGRES_USER: ${POSTGRES_USER:-postgres} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-youyidian123456} POSTGRES_DB: ${POSTGRES_DB:-flnxi} POSTGRES_INITDB_ARGS: "--encoding=UTF-8" volumes: - postgres_data:/var/lib/postgresql/data networks: - app-network healthcheck: test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-postgres}"] interval: 10s timeout: 5s retries: 5 # MinIO 对象存储 # 使用特定版本号确保稳定性(符合项目宗旨:稳定性优先) minio: # 从 Harbor 的 flnxi 项目下的 runtime 子目录拉取 image: ${MINIO_IMAGE:-harbor.flnxi.com/flnxi/runtime/minio:RELEASE.2025-04-22T22-12-26Z} container_name: flnxi-minio restart: unless-stopped command: server /data --console-address ":9001" environment: MINIO_ROOT_USER: ${MINIO_ROOT_USER:-minioadmin} MINIO_ROOT_PASSWORD: ${MINIO_ROOT_PASSWORD:-minioadmin123456} volumes: - minio_data:/data ports: - "${MINIO_API_PORT:-9000}:9000" - "${MINIO_CONSOLE_PORT:-9001}:9001" networks: - app-network healthcheck: test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"] interval: 30s timeout: 20s retries: 3 # MinIO 初始化服务(创建bucket) # 使用 latest 标签确保可用性(mc 客户端版本兼容性好) minio-init: # 从 Harbor 的 flnxi 项目下的 runtime 子目录拉取 image: ${MINIO_MC_IMAGE:-harbor.flnxi.com/flnxi/runtime/minio-mc:latest} container_name: flnxi-minio-init depends_on: minio: condition: service_healthy entrypoint: > /bin/sh -c " sleep 5; mc alias set myminio http://minio:9000 ${MINIO_ROOT_USER:-minioadmin} ${MINIO_ROOT_PASSWORD:-minioadmin123456}; mc mb myminio/${S3_BUCKET:-flnxi-materials} --ignore-existing; mc anonymous set download myminio/${S3_BUCKET:-flnxi-materials}; echo 'MinIO bucket created and configured successfully'; exit 0; " networks: - app-network # 主应用(Pro版 - 从私有镜像仓库拉取) app: # 根据环境从不同的 Harbor 项目拉取: # - 测试环境: harbor.flnxi.com/flnxi-test/flnxi-material:pro-test (私有,需登录) # - 正式环境: harbor.flnxi.com/flnxi/flnxi-material:pro-latest (公开,无需登录) image: ${APP_IMAGE:-${DOCKER_REGISTRY:-harbor.flnxi.com/flnxi}/flnxi-material:pro-${IMAGE_TAG:-latest}} container_name: flnxi-material restart: unless-stopped ports: - "${APP_PORT:-4320}:3000" # 使用 env_file 自动读取 .env 文件中的所有环境变量(包括 DATABASE_URL) # 这样 Docker Compose 会自动处理所有变量,无需手动拼接 env_file: - .env environment: # 注意: # - SERVER_IP 必须在安装脚本或 .env 中配置为「本机在局域网中的访问 IP」,例如:192.168.41.144 # - 对于一键安装用户,install.sh 会自动生成 .env.production 并写入 SERVER_IP,这里直接引用即可 - NODE_ENV=production # DATABASE_URL 从 .env 文件自动读取(install.sh 会生成正确编码的 URL) # 如果 .env 文件中没有 DATABASE_URL,则使用默认值(向后兼容) - DATABASE_URL=${DATABASE_URL:-postgresql://${POSTGRES_USER:-postgres}:${POSTGRES_PASSWORD:-youyidian123456}@postgres:5432/${POSTGRES_DB:-flnxi}} - DATABASE_DRIVER=node - STORAGE_PROVIDER=s3 - S3_ENDPOINT=http://minio:9000 - S3_BUCKET=${S3_BUCKET:-flnxi-materials} - S3_ACCESS_KEY_ID=${MINIO_ROOT_USER:-minioadmin} - S3_SECRET_ACCESS_KEY=${MINIO_ROOT_PASSWORD:-minioadmin123456} - S3_REGION=us-east-1 # 对外访问 MinIO 的地址(供前端和分享链接使用),必须是局域网 / 公网可访问的 IP 或域名 # 这里不再默认 127.0.0.1,避免在 NAS 等环境下写死 localhost - S3_PUBLIC_DOMAIN=http://${SERVER_IP}:${MINIO_API_PORT:-9000}/${S3_BUCKET:-flnxi-materials} - S3_ENABLE_PATH_STYLE=1 - S3_SET_ACL=1 - S3_PREVIEW_URL_EXPIRE_IN=7200 - S3_FILE_PATH=materials/ - NEXT_PUBLIC_S3_FILE_PATH=materials/ # NextAuth 的外部访问地址,从 .env(.production) 中注入(不在这里拼接,以免 SERVER_IP 为空时产生 http://:4320) # install.sh / 部署脚本会写入 NEXTAUTH_URL,例如:http://192.168.41.144:4320 - NEXTAUTH_URL=${NEXTAUTH_URL} - NEXTAUTH_SECRET=${NEXTAUTH_SECRET:-change-this-to-a-random-string-in-production} # 初始管理员账号(供 /api/system/init 使用) - INIT_ADMIN_EMAIL=${INIT_ADMIN_EMAIL:-admin@flnxi.com} - INIT_ADMIN_PASSWORD=${INIT_ADMIN_PASSWORD:-88888888} volumes: - ./uploads:/app/uploads depends_on: postgres: condition: service_healthy minio: condition: service_healthy minio-init: condition: service_completed_successfully networks: - app-network healthcheck: test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost:3000/api/health"] interval: 30s timeout: 10s retries: 3 volumes: postgres_data: driver: local minio_data: driver: local networks: app-network: driver: bridge