diff --git a/docker-compose.metatube.yml b/docker-compose.metatube.yml new file mode 100644 index 0000000..62e37c8 --- /dev/null +++ b/docker-compose.metatube.yml @@ -0,0 +1,216 @@ +# MeBox + MetaTube 一体部署 Docker Compose 部署文件 +# +# 组件: +# MeBox + PostgreSQL + Redis + MetaTube +# +# 与 docker-compose.standard.yml 的区别: +# 额外内置一个 MetaTube 后端(番号元数据刮削 / 封面人脸裁剪), +# 并与 MeBox 共用同一个 PostgreSQL 实例,不需要再单独起一套数据库。 +# +# 使用方式二选一: +# 1. 保存为 docker-compose.yml 后执行: +# docker compose up -d +# 2. 保留本文件名时执行: +# docker compose -f docker-compose.metatube.yml up -d +# +# 首次启动后需要做一次配置(只有这一处是手动的): +# 登录 MeBox → 设置 → 番号刮削: +# - 番号刮削引擎:MetaTube 后端服务,或 智能混合 +# - MetaTube 服务端地址:http://metatube:8080 +# - 访问 Token:留空(仅内部网络,未启用认证;如需认证两边填同一个值) +# +# 说明: +# - MetaTube 使用独立数据库 metatube,由 metatube-db-init 一次性容器自动创建; +# 和 MeBox 的 mebox 库共用同一个 PostgreSQL 实例,只是分成两个库。 +# - MetaTube 不向宿主机映射端口,只在本 Compose 内部网络提供服务。 +# - MeBox 故意不依赖 MetaTube:MetaTube 未就绪或挂掉时,智能混合模式会自动回退到内置刮削源。 +# - 更新全部组件: +# docker compose -f docker-compose.metatube.yml pull +# docker compose -f docker-compose.metatube.yml up -d +# 保留本文件名时,管理面板「系统更新」需要把「Compose 安装目录」指向本文件所在目录, +# 或把更新命令改成带 -f docker-compose.metatube.yml 的形式。 +# +# 默认账号: +# admin / admin123 + +services: + mebox: + image: ghcr.io/truewhile/mebox:latest + + restart: unless-stopped + init: true + depends_on: + postgres: + condition: service_healthy + redis: + condition: service_healthy + + ports: + - "18080:8080" + + extra_hosts: + - "host.docker.internal:host-gateway" + + volumes: + # 程序运行数据:JWT 密钥、运行配置、旧 SQLite 迁移源。 + - ./data:/data + + # 缓存目录:海报缓存、临时文件等。通常不用备份。 + - ./cache:/cache + + # 媒体库目录。自动整理/重命名/入库需要读写权限。 + # NAS 示例:source: /vol1/1000/Media + # Windows Docker Desktop 示例:source: D:/Media + # create_host_path=false 可以避免路径写错时 Docker 自动创建空文件夹。 + - ./media: /media + + environment: + TZ: Asia/Shanghai + + PUID: "0" + PGID: "0" + + MEBOX_APP_HOST: 0.0.0.0 + MEBOX_APP_PORT: 8080 + MEBOX_APP_WEB_DIR: /app/web/dist + MEBOX_APP_DATA_DIR: /data + MEBOX_LOGGING_LEVEL: info + MEBOX_LOGGING_FORMAT: console + MEBOX_LOGGING_OUTPUT_PATH: /data/logs + MEBOX_LOGGING_MAX_SIZE_MB: "20" + MEBOX_LOGGING_MAX_BACKUPS: "5" + MEBOX_LOGGING_MAX_AGE_DAYS: "30" + + MEBOX_DATABASE_TYPE: postgres + MEBOX_DATABASE_DSN: postgres://mebox:mebox@postgres:5432/mebox?sslmode=disable + MEBOX_DATABASE_DB_PATH: /data/mebox.db + + # Redis 只做热缓存,源数据仍在 PostgreSQL;Redis 丢失可自动重建。 + MEBOX_CACHE_REDIS_URL: redis://redis:6379/0 + MEBOX_CACHE_CACHE_DIR: /cache + + MEBOX_UPDATE_IMAGE: ghcr.io/truewhile/mebox:latest + + # 路径换算配置。左边宿主机真实路径要和 volumes 左边保持一致。 + MEBOX_MEDIA_DIR: /media + MEBOX_MEDIA_CONTAINER_DIR: /media + MEBOX_DOWNLOAD_DIR: /downloads + MEBOX_DOWNLOAD_CONTAINER_DIR: /downloads + + MEBOX_TRANSCODER_ENABLED: "true" + MEBOX_TRANSCODER_HARDWARE_ACCEL: "false" + MEBOX_TRANSCODER_REALTIME: "true" + MEBOX_TRANSCODER_THREADS: "2" + MEBOX_TRANSCODER_MAX_CONCURRENT: "1" + MEBOX_TRANSCODER_IDLE_TIMEOUT_SECONDS: "120" + + healthcheck: + test: ["CMD-SHELL", "busybox wget -qO- http://127.0.0.1:8080/api/health || exit 1"] + interval: 30s + timeout: 10s + retries: 5 + start_period: 30s + + logging: + driver: json-file + options: + max-size: "20m" + max-file: "3" + + postgres: + image: postgres:16-alpine + # 首次部署允许拉取;日常更新请只 pull mebox。 + # MetaTube 与 MeBox 共用本实例(不同数据库),无需第二套 PostgreSQL。 + pull_policy: missing + restart: unless-stopped + environment: + POSTGRES_DB: mebox + POSTGRES_USER: mebox + POSTGRES_PASSWORD: mebox + TZ: Asia/Shanghai + volumes: + # 同时存放 mebox 与 metatube 两个数据库,备份这一个目录即可。 + - ./postgres:/var/lib/postgresql/data + healthcheck: + test: ["CMD-SHELL", "pg_isready -h 127.0.0.1 -U mebox -d mebox"] + interval: 10s + timeout: 5s + retries: 10 + logging: + driver: json-file + options: + max-size: "20m" + max-file: "3" + + # 一次性容器:确保 metatube 库存在。 + # MetaTube 自己的 -db-auto-migrate 只建表不建库,所以必须先建库。 + # 数据库已存在时它会直接退出,重复执行无副作用。 + metatube-db-init: + image: postgres:16-alpine + pull_policy: missing + restart: "no" + depends_on: + postgres: + condition: service_healthy + environment: + PGPASSWORD: mebox + entrypoint: ["/bin/sh", "-c"] + command: + - | + psql -h postgres -U mebox -d mebox -tAc "SELECT 1 FROM pg_database WHERE datname='metatube'" | grep -q 1 || psql -h postgres -U mebox -d mebox -c "CREATE DATABASE metatube OWNER mebox" + logging: + driver: json-file + options: + max-size: "5m" + max-file: "1" + + metatube: + image: ghcr.io/metatube-community/metatube-server:latest + restart: unless-stopped + depends_on: + metatube-db-init: + condition: service_completed_successfully + environment: + TZ: Asia/Shanghai + # 需要走代理时在这里填写,例如 http://192.168.1.2:7890 + HTTP_PROXY: "" + HTTPS_PROXY: "" + # 不需要 ports:MeBox 通过内部网络访问 http://metatube:8080。 + # 只有想让局域网内其他工具直连时才映射,且建议只映射到 127.0.0.1。 + command: + - -dsn + - postgres://mebox:mebox@postgres:5432/metatube?sslmode=disable + - -port + - "8080" + - -db-auto-migrate + - -db-prepared-stmt + logging: + driver: json-file + options: + max-size: "20m" + max-file: "3" + + redis: + image: redis:7-alpine + pull_policy: missing + restart: unless-stopped + command: + - redis-server + - --appendonly + - "yes" + - --maxmemory + - 256mb + - --maxmemory-policy + - allkeys-lru + volumes: + - ./redis:/data + healthcheck: + test: ["CMD", "redis-cli", "ping"] + interval: 10s + timeout: 5s + retries: 10 + logging: + driver: json-file + options: + max-size: "20m" + max-file: "3" diff --git a/docker-compose.standard.yml b/docker-compose.standard.yml index d3d12e8..e6c13a0 100644 --- a/docker-compose.standard.yml +++ b/docker-compose.standard.yml @@ -44,30 +44,13 @@ services: # NAS 示例:source: /vol1/1000/Media # Windows Docker Desktop 示例:source: D:/Media # create_host_path=false 可以避免路径写错时 Docker 自动创建空文件夹。 - - type: bind - source: ./media - target: /media - bind: - create_host_path: false - - # 下载目录。需要和下载器保存路径保持一致。 - # NAS 示例:source: /vol1/1000/Downloads - # Windows Docker Desktop 示例:source: D:/Downloads - - type: bind - source: ./downloads - target: /downloads - bind: - create_host_path: false - - # 管理面板「系统更新」需要访问 Docker 引擎。 - # 需要一键更新 Docker 镜像时取消下一行注释。 - # - /var/run/docker.sock:/var/run/docker.sock + - ./media: /media environment: TZ: Asia/Shanghai - PUID: "1000" - PGID: "1000" + PUID: "0" + PGID: "0" MEBOX_APP_HOST: 0.0.0.0 MEBOX_APP_PORT: 8080