本指南详细介绍了使用 Docker Compose 部署 MoonTV 电影网站的全过程。该过程涉及设置两个主要服务:用于应用程序本身的 moontv-core 和用于数据库的 moontv-kvrocks ,并通过 Docker 网络将它们连接起来 。

步骤一:创建 docker-compose.yml 文件

本次部署的基础是 docker-compose.yml 文件 。该文件定义了运行 MoonTV 所需的服务、网络和卷。

配置包含两个主要服务 :

  • moontv-core :这是主应用程序服务,使用 ghcr.io/moontechlab/lunatv:latest 镜像 。它将主机的 8095 端口映射到容器内的 3000 端口 。
  • moontv-kvrocks :这是数据库服务,使用 apache/kvrocks 镜像来存储数据 。它通过一个卷将数据持久化存储在主机上 。

以下是完整的 docker-compose.yml 配置内容:(2025-10-14 跟新,原  ghcr.io/moontechlab/lunatv:latest 不更新,后面更新的可用 ghcr.io/szemeng76/lunatv:latest 代替,或者自行查找其它源)

services:
  moontv-core:
    image: ghcr.io/moontechlab/lunatv:latest
    container_name: moontv-core
    restart: on-failure
    ports:
      - '8095:3000'
    environment:
      - USERNAME=用户名(管理员)
      - PASSWORD=管理密码,不能太i暗淡
      - NEXT_PUBLIC_STORAGE_TYPE=kvrocks
      - KVROCKS_URL=redis://moontv-kvrocks:6666
      - AUTH_TOKEN=ccd4edddc0789b370bda2abdadde3e06
    networks:
      - moontv-network
    depends_on:
      - moontv-kvrocks
  moontv-kvrocks:
    image: apache/kvrocks
    container_name: moontv-kvrocks
    restart: unless-stopped
    volumes:
      - /www/wwwroot/kvrocks-data:/var/lib/kvrocks
    networks:
      - moontv-network
networks:
  moontv-network:
    driver: bridge
volumes:
  kvrocks-data:

关于环境变量的说明: 在部署之前,您必须将 USERNAMEPASSWORD 修改为您期望的管理员凭据,并确保密码足够强壮。

步骤二:准备主机环境

在启动容器之前,您需要在主机上为 kvrocks 的持久化数据创建一个目录,并在其中放置一个配置文件。

  1. 创建数据目录并设置权限:您必须在主机上创建 /www/wwwroot/kvrocks-data 目录,并确保它具有读写权限 。
  2. 创建 kvrocks.conf 文件:在 /www/wwwroot/kvrocks-data 目录内,创建一个名为 kvrocks.conf 的文件 。这个文件对 kvrocks 数据库的正常运行至关重要。

请将以下全部内容复制到您的 kvrocks.conf 文件中 [cite: 37-975]:

################################ GENERAL #####################################
bind 127.0.0.1
socket-fd -1
port 6666
timeout 0
workers 8
daemonize no
cluster-enabled no
repl-namespace-enabled no
persist-cluster-nodes-enabled yes
maxclients 10000
db-name change.me.db
dir /tmp/kvrocks
log-level info
log-retention-days -1
slave-read-only yes
slave-priority 100
replication-connect-timeout-ms 3100
replication-recv-timeout-ms 3200
tcp-backlog 511
master-use-repl-port no
use-rsid-psync no
slave-serve-stale-data yes
slave-empty-db-before-fullsync no
purge-backup-on-fullsync no
max-replication-mb 0
max-io-mb 0
enable-blob-cache no
max-db-size 0
max-backup-to-keep 1
max-backup-keep-hours 24
max-bitmap-to-string-mb 16
redis-cursor-compatible yes
json-max-nesting-depth 1024
json-storage-format json
txn-context-enabled no
################################# TLS ###################################
################################## SLOW LOG ###################################
slowlog-log-slower-than 100000
slowlog-max-len 128
slowlog-dump-logfile-level off
supervised no
################################# PERF LOG ###################################
profiling-sample-ratio 0
profiling-sample-record-max-len 256
profiling-sample-record-threshold-ms 100
################################# CRON ###################################
compaction-checker-cron * 0-7 * * *
################################ MIGRATE #####################################
migrate-type raw-key-value
migrate-speed 4096
migrate-pipeline-size 16
migrate-sequence-gap 10000
migrate-batch-size-kb 16
migrate-batch-rate-limit-mb 16
################################ ROCKSDB #####################################
rocksdb.block_cache_size 4096
rocksdb.block_cache_type lru
rocksdb.max_open_files 8096
rocksdb.write_buffer_size 64
rocksdb.target_file_size_base 128
rocksdb.max_write_buffer_number 4
rocksdb.min_write_buffer_number_to_merge 1
rocksdb.max_background_jobs 4
rocksdb.max_background_compactions -1
rocksdb.max_background_flushes -1
rocksdb.max_subcompactions 2
rocksdb.wal_compression no
rocksdb.max_total_wal_size 512
rocksdb.dump_malloc_stats yes
rocksdb.wal_ttl_seconds 10800
rocksdb.wal_size_limit_mb 16384
rocksdb.block_size 16384
rocksdb.cache_index_and_filter_blocks yes
rocksdb.compression snappy
rocksdb.compression_level 32767
rocksdb.compaction_readahead_size 2097152
rocksdb.compression_start_level 2
rocksdb.delayed_write_rate 0
rocksdb.enable_pipelined_write no
rocksdb.level0_slowdown_writes_trigger 20
rocksdb.level0_stop_writes_trigger 40
rocksdb.level0_file_num_compaction_trigger 4
rocksdb.stats_dump_period_sec 0
rocksdb.disable_auto_compactions no
rocksdb.enable_blob_files no
rocksdb.min_blob_size 4096
rocksdb.blob_file_size 268435456
rocksdb.enable_blob_garbage_collection yes
rocksdb.blob_garbage_collection_age_cutoff 25
rocksdb.level_compaction_dynamic_level_bytes yes
rocksdb.max_bytes_for_level_base 268435456
rocksdb.max_bytes_for_level_multiplier 10
rocksdb.read_options.async_io yes
rocksdb.write_options.sync no
rocksdb.write_options.disable_wal no
rocksdb.write_options.no_slowdown no
rocksdb.write_options.low_pri no
rocksdb.write_options.memtable_insert_hint_per_batch no
rocksdb.rate_limiter_auto_tuned yes
rocksdb.partition_filters yes
rocksdb.max_compaction_bytes 0
rocksdb.sst_file_delete_rate_bytes_per_sec 0
################################ NAMESPACE #####################################
namespace.test change.me

步骤三:启动 MoonTV 应用

当所有配置文件都准备就绪后,您就可以启动应用程序了。

  1. 拉取 Docker 镜像:进入包含 docker-compose.yml 文件的目录,然后运行以下命令来下载所需的镜像 。

    docker-compose pull
    
  1. 启动服务:镜像拉取完成后,以分离模式(detached mode)启动服务 。

    docker-compose up -d
    

运行此命令后,Docker 将会创建并启动 moontv-coremoontv-kvrocks 容器。现在,您可以通过在浏览器中访问 http://<您的服务器IP>:8095 来打开您的 MoonTV 实例了。