用 docker-compose 快速部署 flarum 带 redis 和 Meilisearch 中文搜索

### 先说优缺点

**优点**

  • 1. docker 环境正常的情况下,除了该有的参数修改,快速部署一套全新的 flarum 服务。
  • 2. 快速全局备份迁移,有 docker 的环境都能快速迁移。
  • 3. 快速全局备份还原,测试新插件也更方便了。
  • 4. 前置反代方式更灵活,不局限于某个面板或程序,如宝塔,1Panel,NPM,雷池等等。
  • **缺点**

  • 1. 全局备份需要服务短暂中断,但实际也可以用热备份数据库的方式进行备份。
  • 2. docker 环境本身的安装当前大内网有难度。
  • ### 前置准备

  • 1.

    正常已安装 docker 和 docker-compose 的系统,最好有能进行在线文件管理编辑的面板,如 1Panel,宝塔之类的。该部署实测环境为 debian12,ssh 为 root 登录,用 1Panel 进行文件编辑,雷池进行反代。

  • 2.

    修改完善后的相关文件,共 4 份,文件详细内容放在最后:

  • - docker-compose.yml # 主文件,需要按实际修改自己的域名。
  • - .env # 参数文件,需要按实际修改相关密码等参数。
  • - init.sh # 初始化脚本,为了获取缺失的关键映射文件和目录,只需运行一次,成功后可删除。
  • - docker-compose.base.yml # 初始化文件,和主文件区别在于注释了需容器自动生成待获取的映射,需要按实际修改自己的域名,只需运行一次,成功后可删除。
  • 3.

    按喜好新建 flarum 的存放目录,例如 `mkdir -p /data/flarum` 。

  • 4.

    把准备好的 4 份文件上传到新建的目录中,给 `init.sh` 文件添加执行权限,例如 `chmod +x init.sh`

  • ### 正式部署

  • 1. ssh 或控制台进入到 flarum 所在目录,例如 </s>cd /data/flarum<e>
  • 2. 执行初始化脚本,输入 `./init.sh` 回车,这里注意不要用 ~~`sh init.sh`~~的方式,会报错。
  • 3. 等到提示 `init completed successfully!` ,表示初始化完成,可选删除 `init.sh` 和 `docker-compose.base.yml` 文件。
  • 4. 最后,输入 `docker-compose up -d` 回车等看到 6 个服务跑起来,flarum 就已经部署成功可以访问了。
  • 5. 通过内网 IP:8000 或配置好反代的域名,就可以浏览 flarum 用初始账号密码 flarum 登录。
  • ### 完善配置( ssh 或控制台相关命令操作默认在 flarum 目录)

  • 1.

    输入 `docker-compose down` 停止 flarum 所有容器服务。这时可选是否复制或打包备份这个目录。

  • 2.

    修改 `/data/flarum/othconf/composer.json` ,按需修改 `require` 内的内容添加需要批量安装的插件,如下已测试批量安装未报错插件内容:

    ``` "require": { "afrux/forum-stats-widget": "*", "afrux/forum-widgets-core": "*", "afrux/top-posters-widget": "*", "antoinefr/flarum-ext-money": "^1.3", "askvortsov/flarum-markdown-tables": "*", "askvortsov/flarum-moderator-warnings": "^0.6.3", "blomstra/flarum-redis": "^0.4.2", "blomstra/fontawesome": "*", "clarkwinkelmann/flarum-ext-discussion-bookmarks": "^2.0", "clarkwinkelmann/flarum-ext-money-rewards": "^1.0", "clarkwinkelmann/flarum-ext-money-to-all": "^1.0", "clarkwinkelmann/flarum-ext-scout": "^0.3.5", "club-1/flarum-ext-cross-references": "*", "darkle/fancybox": "^2.1", "datlechin/flarum-bbcode-hide-content": "*", "datlechin/flarum-usercard-uid": "*", "ffans/clipboardjs": "^1.0", "flarum-lang/chinese-simplified": "^1.4", "flarum/approval": "*", "flarum/bbcode": "*", "flarum/core": "^1.8", "flarum/emoji": "*", "flarum/flags": "*", "flarum/lang-english": "*", "flarum/likes": "*", "flarum/lock": "*", "flarum/markdown": "*", "flarum/mentions": "*", "flarum/nicknames": "*", "flarum/pusher": "*", "flarum/statistics": "*", "flarum/sticky": "*", "flarum/subscriptions": "*", "flarum/suspend": "*", "flarum/tags": "*", "fof/ban-ips": "*", "fof/bbcode-details": "^1.1", "fof/bbcode-tabs": "*", "fof/best-answer": "*", "fof/default-group": "^1.1", "fof/default-user-preferences": "*", "fof/doorman": "*", "fof/drafts": "^1.2", "fof/follow-tags": "*", "fof/formatting": "*", "fof/github-autolink": "^1.1", "fof/impersonate": "*", "fof/linguist": "^1.1", "fof/links": "^1.3", "fof/nightmode": "*", "fof/pages": "^1.0", "fof/polls": "*", "fof/pretty-mail": "*", "fof/profile-image-crop": "*", "fof/recaptcha": "*", "fof/sitemap": "^2.2", "fof/terms": "^1.3", "fof/upload": "*", "fof/user-bio": "*", "fof/user-directory": "*", "gtdxyz/flarum-ext-checkin": "^1.0", "ianm/follow-users": "*", "ianm/syndication": "*", "justoverclock/custom-html-widget": "*", "justoverclock/flarum-ext-welcomebox": "^2.0", "league/flysystem-aws-s3-v3": "1.*", "mattoid/flarum-ext-money-history": "*", "mattoid/flarum-ext-money-history-auto": "*", "michaelbelgium/flarum-discussion-views": "^7.3", "pipecraft/flarum-ext-id-slug": "^1.1", "swaggymacro/only-starter": "^0.6.6", "symfony/css-selector": "6.0.2", "the-turk/flarum-stickiest": "^3.0", "v17development/flarum-seo": "^2.0", "v17development/flarum-user-badges": "^1.1" }, ```
  • 3.

    输入 `docker-compose up -d` 回车等服务完全跑起来。

  • 4.

    输入 `docker exec -it flarum bash` 回车进入 flarum 容器环境。

  • 5.

    在容器环境内输入 `composer update` 回车等待批量安装插件完成,过程中按提示按一次 `y` 。

  • 6.

    全部完成后,可以输入 `exit` 回车退出容器环境。

  • 7.

    刷新 flarum 网页,会提示你输入数据库密码(你修改的 .env 文件内)进行更新,更新后进入后台管理你会发现插件都安装上还未激活,这时可以先全部激活。

  • 8.

    输入 `docker-compose down` 停止 flarum 所有容器服务。

  • 9.

    修改 `/data/flarum/othconf/extend.php` ,添加 `retun` 内的内容,注意修改使用你 `.env` 内设置的 redis 密码 :

    ``` return [ (new Blomstra\Redis\Extend\Redis([ 'host' => 'flarum_redis', 'password' => 'you_redis_password', 'port' => 6379, 'database' => 1, ])) ->useDatabaseWith('cache', 1) ->useDatabaseWith('queue', 2) ->useDatabaseWith('session', 3) ]; ```
  • 10.

    输入 `docker-compose up -d` 回车等服务完全跑起来,进入网页后台,会发现队列和会话驱动程序已经是 redis 。

  • 11.

    按图示到 flarum 网页后台配置邮箱,主机填入 `flarum_msmtpd` ,端口 2500 ,这里的前提 `.env` 已经配置了正确的 SMTP 配置,保存后可以修改初始账号 flarum 的邮箱试试发信是否正常。
    Image description![Image description](https://s.rmimg.com/2024-12-12/1733983643-33111-image.png)

  • 12.

    按图示配置 Scout Search 和 FoF Best Answer 激活全局搜索。
    Image description![Image description](https://s.rmimg.com/2024-12-12/1733983614-202818-image.png)

  • 13.

    在宿主机添加 `php flarum schedule:run` 和 `php flarum queue:work --stop-when-empty` 计划任务,想简单就直接用管理面板创建,如图示 1Panel 的方式:
    Image description![Image description](https://s.rmimg.com/2024-12-12/1733983551-962697-image.png)


  • **至此,带 redis 和 Meilisearch 中文搜索的 flarum 已部署正常运行,并已批量安装好所需插件。**

    ### 进阶操作

  • 1. 可以随时停止服务,复制或打包部署好的 flarum 的文件夹,后续迁移或者恢复进入目录后启用服务即可。
  • 2. 基于 1 ,测试插件不再是难题,测试满意了就重新打包一份数据即可。
  • ### 待补充或直接参考(如需)

  • 1. Docker 的安装。
  • 2. 1Panel 的安装,参考官方 [在线安装 - 1Panel 文档](https://1panel.cn/docs/installation/online_installation/)
  • 3. 雷池的安装,参考官方 [安装雷池 | 雷池 SafeLine](https://docs.waf-ce.chaitin.cn/zh/%E4%B8%8A%E6%89%8B%E6%8C%87%E5%8D%97/%E5%AE%89%E8%A3%85%E9%9B%B7%E6%B1%A0)
  • 4. 宝塔的安装,参考官方 [宝塔面板下载,免费全能的服务器运维软件](https://www.bt.cn/new/download.html)
  • ### 附件

  • 1.

    `docker-compose.yml`文件,需修改 https://xxx.xxx.xxx 为你的正确域名。

    ```docker-compose.yml name: flarum services: # 数据库服务 db: image: mariadb:10 container_name: flarum_db networks: - flarum-network command: - "mysqld" - "--character-set-server=utf8mb4" - "--collation-server=utf8mb4_unicode_ci" volumes: - "./db:/var/lib/mysql" environment: - TZ=Asia/Shanghai - MARIADB_RANDOM_ROOT_PASSWORD=yes - MYSQL_DATABASE=${MYSQL_DATABASE} - MYSQL_USER=${MYSQL_USER} - MYSQL_PASSWORD=${MYSQL_PASSWORD} restart: always

    Redis 缓存服务,映射端口方便其他服务共用

    redis:
    image: redis:latest
    restart: always
    container_name: flarum_redis
    networks:
    - flarum-network
    ports:
    - “6379:6379”
    depends_on:
    - db
    command: redis-server /etc/redis/redis.conf --requirepass ${REDIS_PASSWORD}
    volumes:
    - “./redis/data:/data”
    - “./redis/conf/redis.conf:/etc/redis/redis.conf”
    - “./redis/logs:/logs”
    environment:
    - REDIS_PASSWORD=${REDIS_PASSWORD}

    Meilisearch 搜索服务,映射端口方便其他服务共用

    meilisearch:
    container_name: flarum_meilisearch
    image: getmeili/meilisearch:latest
    restart: always
    networks:
    - flarum-network
    ports:
    - “7700:7700”
    depends_on:
    - db
    - redis
    environment:
    # - MEILI_CONFIG_FILE_PATH=/config/config.toml
    - MEILI_MASTER_KEY=${MEILI_MASTER_KEY}
    - MEILI_NO_ANALYTICS=true
    - MEILI_ENV=production
    volumes:
    - “./meilisearch/config:/config”
    - “./meilisearch/data:/meili_data”
    - “./meilisearch/dumps:/dumps”
    - “./meilisearch/snapshots:/snapshots”
    command: /bin/meilisearch

    SMTP 邮件服务,映射端口方便其他服务共用

    msmtpd:
    image: crazymax/msmtpd:latest
    container_name: flarum_msmtpd
    networks:
    - flarum-network
    ports:
    - “2500:2500”
    environment:
    - TZ=Asia/Shanghai
    - SMTP_HOST=${SMTP_HOST}
    - SMTP_PORT=${SMTP_PORT}
    - SMTP_TLS=${SMTP_TLS}
    - SMTP_STARTTLS=${SMTP_STARTTLS}
    - SMTP_TLS_CHECKCERT=${SMTP_TLS_CHECKCERT}
    - SMTP_AUTH=${SMTP_AUTH}
    - SMTP_USER=${SMTP_USER}
    - SMTP_PASSWORD=${SMTP_PASSWORD}
    - SMTP_FROM=${SMTP_FROM}
    restart: always

    Flarum 主服务

    flarum:
    image: crazymax/flarum:latest
    container_name: flarum
    networks:
    - flarum-network
    ports:
    - “8000:8000”
    depends_on:
    - db
    - redis
    - meilisearch
    - msmtpd
    volumes:
    - “./flarum/data:/data”
    - “./othconf/composer.json:/opt/flarum/composer.json”
    - “./othconf/composer.lock:/opt/flarum/composer.lock”
    - “./othconf/extend.php:/opt/flarum/extend.php”
    - “./othconf/vendor:/opt/flarum/vendor”
    environment:
    - TZ=Asia/Shanghai
    - PUID=1000
    - PGID=1000
    - DB_HOST=db
    - DB_NAME=${MYSQL_DATABASE}
    - DB_USER=${MYSQL_USER}
    - DB_PASSWORD=${MYSQL_PASSWORD}
    - MEMORY_LIMIT=256M
    - UPLOAD_MAX_SIZE=16M
    - OPCACHE_MEM_SIZE=128
    - REAL_IP_FROM=0.0.0.0/32
    - REAL_IP_HEADER=X-Forwarded-For
    - LOG_IP_VAR=remote_addr
    - FLARUM_DEBUG=false
    - FLARUM_BASE_URL=https://xxx.xxx.xxx
    restart: always

    网络配置

    networks:
    flarum-network:
    driver: bridge # 自动创建网络
    ```

  • 2.

    `.env` 文件,需修改相关 x 为你的正确内容。

    ```.env # 数据库配置 MYSQL_DATABASE=xxxxx MYSQL_USER=xxxxxx MYSQL_PASSWORD=xxxxxxxxxxxxx

    Redis 配置

    REDIS_PASSWORD=xxxxxxxxxxxxx

    Meilisearch 配置

    MEILI_MASTER_KEY=xxxxxxxxxxxxx

    SMTP 配置

    SMTP_HOST=smtp.xxx.xxx
    SMTP_PORT=587
    SMTP_TLS=on
    SMTP_STARTTLS=on
    SMTP_TLS_CHECKCERT=on
    SMTP_AUTH=on
    [email protected]
    SMTP_PASSWORD=xxxxxxxxx
    [email protected]
    ```

  • 3.

    `init.sh` 文件,不用做任何修改。

    ```init.sh #!/bin/bash

    设置变量

    DOCKER_COMPOSE_FILE=“docker-compose.base.yml”
    SOURCE_DIR=“/opt/flarum”
    DEST_DIR=“./othconf”

    定义错误处理函数

    error_exit() {
    echo “Error: $1” >&2
    # 确保服务被关闭
    docker-compose -f “$DOCKER_COMPOSE_FILE” down
    exit 1
    }

    检查 docker-compose 文件是否存在

    if [ ! -f “$DOCKER_COMPOSE_FILE” ]; then
    error_exit “Docker Compose file $DOCKER_COMPOSE_FILE not found!”
    fi

    创建目标目录(如果不存在)

    mkdir -p “${DEST_DIR}” || error_exit “Failed to create destination directory”

    启动服务

    echo “Starting services from $DOCKER_COMPOSE_FILE…”
    docker-compose -f “$DOCKER_COMPOSE_FILE” up -d || error_exit “Failed to start services”

    等待服务完全启动

    sleep 10

    获取容器名(假设Flarum容器名包含 flarum 关键字)

    CONTAINER_NAME=$(docker ps --filter “name=flarum” --format “{{.Names}}” | head -n 1)

    if [ -z “$CONTAINER_NAME” ]; then
    error_exit “No Flarum container found!”
    fi

    echo “Using container: $CONTAINER_NAME”

    要复制的文件和目录列表

    files_to_copy=(“composer.json” “composer.lock” “extend.php” “vendor”)

    复制文件

    for item in “${files_to_copy[@]}”; do
    echo “Copying ${item}…”
    docker exec “$CONTAINER_NAME” tar -cf - -C “${SOURCE_DIR}” “${item}” | tar -xvpf - -C “${DEST_DIR}” || error_exit “Failed to copy ${item}”
    done

    检查复制结果

    echo “Checking copied files…”
    ls -la “${DEST_DIR}”

    关闭服务

    echo “Stopping services…”
    docker-compose -f “$DOCKER_COMPOSE_FILE” down || error_exit “Failed to stop services”

    echo “init completed successfully!”
    ```

  • 4.

    `docker-compose.base.yml`文件,需修改 https://xxx.xxx.xxx 为你的正确域名。

    ```docker-compose.base.yml name: flarum services: # 数据库服务 db: image: mariadb:10 container_name: flarum_db networks: - flarum-network command: - "mysqld" - "--character-set-server=utf8mb4" - "--collation-server=utf8mb4_unicode_ci" volumes: - "./db:/var/lib/mysql" environment: - TZ=Asia/Shanghai - MARIADB_RANDOM_ROOT_PASSWORD=yes - MYSQL_DATABASE=${MYSQL_DATABASE} - MYSQL_USER=${MYSQL_USER} - MYSQL_PASSWORD=${MYSQL_PASSWORD} restart: always

    Redis 缓存服务,映射端口方便其他服务共用

    redis:
    image: redis:latest
    restart: always
    container_name: flarum_redis
    networks:
    - flarum-network
    ports:
    - “6379:6379”
    depends_on:
    - db
    command: redis-server /etc/redis/redis.conf --requirepass ${REDIS_PASSWORD}
    volumes:
    - “./redis/data:/data”
    - “./redis/conf/redis.conf:/etc/redis/redis.conf”
    - “./redis/logs:/logs”
    environment:
    - REDIS_PASSWORD=${REDIS_PASSWORD}

    Meilisearch 搜索服务,映射端口方便其他服务共用

    meilisearch:
    container_name: flarum_meilisearch
    image: getmeili/meilisearch:latest
    restart: always
    networks:
    - flarum-network
    ports:
    - “7700:7700”
    depends_on:
    - db
    - redis
    environment:
    # - MEILI_CONFIG_FILE_PATH=/config/config.toml
    - MEILI_MASTER_KEY=${MEILI_MASTER_KEY}
    - MEILI_NO_ANALYTICS=true
    - MEILI_ENV=production
    volumes:
    - “./meilisearch/config:/config”
    - “./meilisearch/data:/meili_data”
    - “./meilisearch/dumps:/dumps”
    - “./meilisearch/snapshots:/snapshots”
    command: /bin/meilisearch

    SMTP 邮件服务,映射端口方便其他服务共用

    msmtpd:
    image: crazymax/msmtpd:latest
    container_name: flarum_msmtpd
    networks:
    - flarum-network
    ports:
    - “2500:2500”
    environment:
    - TZ=Asia/Shanghai
    - SMTP_HOST=${SMTP_HOST}
    - SMTP_PORT=${SMTP_PORT}
    - SMTP_TLS=${SMTP_TLS}
    - SMTP_STARTTLS=${SMTP_STARTTLS}
    - SMTP_TLS_CHECKCERT=${SMTP_TLS_CHECKCERT}
    - SMTP_AUTH=${SMTP_AUTH}
    - SMTP_USER=${SMTP_USER}
    - SMTP_PASSWORD=${SMTP_PASSWORD}
    - SMTP_FROM=${SMTP_FROM}
    restart: always

    Flarum 主服务

    flarum:
    image: crazymax/flarum:latest
    container_name: flarum
    networks:
    - flarum-network
    ports:
    - “8000:8000”
    depends_on:
    - db
    - redis
    - meilisearch
    - msmtpd
    volumes:
    - “./flarum/data:/data”
    # - “./othconf/composer.json:/opt/flarum/composer.json”
    # - “./othconf/composer.lock:/opt/flarum/composer.lock”
    # - “./othconf/extend.php:/opt/flarum/extend.php”
    # - “./othconf/vendor:/opt/flarum/vendor”
    environment:
    - TZ=Asia/Shanghai
    - PUID=1000
    - PGID=1000
    - DB_HOST=db
    - DB_NAME=${MYSQL_DATABASE}
    - DB_USER=${MYSQL_USER}
    - DB_PASSWORD=${MYSQL_PASSWORD}
    - MEMORY_LIMIT=256M
    - UPLOAD_MAX_SIZE=16M
    - OPCACHE_MEM_SIZE=128
    - REAL_IP_FROM=0.0.0.0/32
    - REAL_IP_HEADER=X-Forwarded-For
    - LOG_IP_VAR=remote_addr
    - FLARUM_DEBUG=false
    - FLARUM_BASE_URL=https://xxx.xxx.xxx
    restart: always

    网络配置

    networks:
    flarum-network:
    driver: bridge # 自动创建网络
    ```

  • ### 参考链接

  • 1. [Flarum--安装redis,给你的Flarum创建高速缓存。 - Sx.Sd -- 自由讨论](https://sx.sd/d/6)
  • 2. [Flarum--安装Scout+Meilisearch实现高速中文搜索 - Sx.Sd -- 自由讨论](https://sx.sd/d/10)
  • 3. [Flarum--批量安装扩展,解决站点重建问题。 - Sx.Sd -- 自由讨论](https://sx.sd/d/2)
  • 4. [Flarum使用Redis后通知消失了的解决方案 - NodeLoc - 自由地讨论互联网资源](https://www.nodeloc.com/d/13)
  • @“千机”#p180095 Meilisearch 可以用 Serv00 部署吗

    @“14569”#p180097 不了解啊,我不像各位大佬耗各种小鸡羊毛,我是本地小主机 cf 穿透玩 :ac01:

    按理能跑 docker 就可以