### 先说优缺点
**优点**
**缺点**
### 前置准备
正常已安装 docker 和 docker-compose 的系统,最好有能进行在线文件管理编辑的面板,如 1Panel,宝塔之类的。该部署实测环境为 debian12,ssh 为 root 登录,用 1Panel 进行文件编辑,雷池进行反代。
修改完善后的相关文件,共 4 份,文件详细内容放在最后:
按喜好新建 flarum 的存放目录,例如 `mkdir -p /data/flarum` 。
把准备好的 4 份文件上传到新建的目录中,给 `init.sh` 文件添加执行权限,例如 `chmod +x init.sh`
### 正式部署
</s>cd /data/flarum<e>
。### 完善配置( ssh 或控制台相关命令操作默认在 flarum 目录)
输入 `docker-compose down` 停止 flarum 所有容器服务。这时可选是否复制或打包备份这个目录。
修改 `/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"
},
```
输入 `docker-compose up -d` 回车等服务完全跑起来。
输入 `docker exec -it flarum bash` 回车进入 flarum 容器环境。
在容器环境内输入 `composer update` 回车等待批量安装插件完成,过程中按提示按一次 `y` 。
全部完成后,可以输入 `exit` 回车退出容器环境。
刷新 flarum 网页,会提示你输入数据库密码(你修改的 .env 文件内)进行更新,更新后进入后台管理你会发现插件都安装上还未激活,这时可以先全部激活。
输入 `docker-compose down` 停止 flarum 所有容器服务。
修改 `/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)
];
```
输入 `docker-compose up -d` 回车等服务完全跑起来,进入网页后台,会发现队列和会话驱动程序已经是 redis 。
按图示到 flarum 网页后台配置邮箱,主机填入 `flarum_msmtpd` ,端口 2500 ,这里的前提 `.env` 已经配置了正确的 SMTP 配置,保存后可以修改初始账号 flarum 的邮箱试试发信是否正常。

按图示配置 Scout Search 和 FoF Best Answer 激活全局搜索。

在宿主机添加 `php flarum schedule:run` 和 `php flarum queue:work --stop-when-empty` 计划任务,想简单就直接用管理面板创建,如图示 1Panel 的方式:

**至此,带 redis 和 Meilisearch 中文搜索的 flarum 已部署正常运行,并已批量安装好所需插件。**
### 进阶操作
### 待补充或直接参考(如需)
### 附件
`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 # 自动创建网络
```
`.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]
```
`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!”
```
`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 # 自动创建网络
```