前几天折腾了一下用 Docker 搭建 Flarum 这个轻论坛的程序,发现其中还是有些坑所以写下来分享一下。这次使用的是一台 4 核心 4 GB 的云服务器使用 Ubuntu 24.04 系统安装 Docker 和 Portainer 进行快速搭建。其中为了方便就略去安装 Docker 和 Portainer 的步骤直接开始配置 Flarum 了。
创建 Nginx-Proxy 容器
我们这里首先使用 Nginx-Proxy 对待会要进行搭建的 Flarum 论坛进行反代,Nginx-Proxy是专门用来自动设置反代 Docker 容器的一个程序。同时我们也是用他们官方提供的 ACME 伴侣来为我们的站点自动申请 SSL。
Nginx-Proxy Github 地址:https://github.com/nginx-proxy/nginx-proxy/
ACME 伴侣 GIthub 地址:https://github.com/nginx-proxy/acme-companion/
我们这里使用 Docker Compose 快速建立这两个容器:
services:
nginx-proxy:
image: nginxproxy/nginx-proxy:1.6
container_name: nginx-proxy
ports:
- "80:80"
- "443:443"
volumes:
- nginx-proxy-conf:/etc/nginx/conf.d
- nginx-proxy-vhost:/etc/nginx/vhost.d
- nginx-proxy-html:/usr/share/nginx/html
- nginx-proxy-certs:/etc/nginx/certs:ro
- /var/run/docker.sock:/tmp/docker.sock:ro
acme-companion:
image: nginxproxy/acme-companion
container_name: nginx-proxy-acme
volumes_from:
- nginx-proxy
volumes:
- nginx-proxy-certs:/etc/nginx/certs:rw
- nginx-proxy-acme:/etc/acme.sh
- /var/run/docker.sock:/var/run/docker.sock:ro
environment:
DEFAULT_EMAIL: 你的邮箱
ACME_CHALLENGE: DNS-01
ACMESH_DNS_API_CONFIG: |-
DNS_API: dns_cf
CF_Token: 你的 Cloudflare Token
CF_Zone_ID: 你的 Cloudflare Zone ID
CF_Email: 你的 Cloudflare 注册邮箱
volumes:
nginx-proxy-conf:
nginx-proxy-vhost:
nginx-proxy-html:
nginx-proxy-certs:
nginx-proxy-acme:
上面我们需要配置的只有我们的 ACME 伴侣,这里使用的是 acme.sh
的自动化 SSL 部署,详细配置可以参考《Linux 利用 Cloudflare API 配置 acme.sh 自动续签 SSL (Apache、Nginx适用)》中申请 CF_Token
和 CF_Zone_ID
的操作去填写上面的 docker compose 文件。
在填写好上面的文件之后我们可以直接粘贴到我们的 Portainer 当中,使用 Stack 功能点击 Add Stack 并且直接粘贴到文本编辑框中,最后 stack 命名为 Nginx-Proxy 直接点击 Deploy 即可。
创建 Flarum 容器
对于 Flarum 容器我们这里使用的是 mondediefr 大佬的 flarum 镜像,Github 地址:https://github.com/mondediefr/docker-flarum。我们同样使用 Docker Compose 的方式进行建立,首先建立我们的 Docker Compose 文件。
services:
flarum:
image: mondedie/flarum:stable
container_name: flarum
env_file:
- stack.env
volumes:
- /var/lib/docker/volumes/flarum/assets:/flarum/app/public/assets
- /var/lib/docker/volumes/flarum/extensions:/flarum/app/extensions
- /var/lib/docker/volumes/flarum/storage/logs:/flarum/app/storage/logs
- /var/lib/docker/volumes/flarum/nginx:/etc/nginx/flarum
ports:
- 8080:8888
depends_on:
- mariadb
mariadb:
image: mariadb:10.5
container_name: mariadb
environment:
- MYSQL_ROOT_PASSWORD=你的数据库密码
- MYSQL_DATABASE=flarum
- MYSQL_USER=flarum
- MYSQL_PASSWORD=你的数据库密码
volumes:
- /var/lib/docker/mysql/db:/var/lib/mysql
其中我们注意到我们的环境文件是 stack.env
,这个文件时 Portainer 在建立 stack 的时候自动建立的,我们接下来要编辑这个文件,我们在点击 Add Stack 之后命名为 Flarum 然后粘贴我们的 Docker Compose 文件,然后可以往下滑看到 stack.env file operation 的提示,我们点击 Advanced Mode 之后会跳出另一个文本编辑框,我们在编辑框中填入我们的环境文件:
DEBUG=false
FORUM_URL=http://你的域名
# Database configuration
DB_HOST=mariadb
DB_NAME=flarum
DB_USER=flarum
DB_PASS=你要的数据库密码
DB_PREF=flarum_
DB_PORT=3306
# User admin flarum (environment variable for first installation)
# /!\ admin password must contain at least 8 characters /!\
FLARUM_ADMIN_USER=管理员账户
FLARUM_ADMIN_PASS=管理员密码
FLARUM_ADMIN_MAIL=管理员邮箱
FLARUM_TITLE=站点标题
VIRTUAL_HOST=你的域名
LETSENCRYPT_HOST=你的域名
上面要配置的就是我们的数据库密码,后台管理员信息以及我们要搭建的论坛使用的域名,填写好之后点击 Deploy即可建立。Nginx-Proxy这个时候也会自动为我们的 Flarum 论坛建立反代以及分配 SSL,如果不成功的话可以检查日志文件重新调试。
配置桥网络
这个时候我们解析完域名之后会发现我们依然不能正常访问我们的论坛,这是因为 Nginx-Proxy 和我们的 Flarum 处于两个不同的 bridge 网络之中,我们这个时候到我们 Portainer 的 Containers 页面,点击 nginx-proxy 容器并且滑到最底下,会发现有一个 Connected Networks 区域,我们在里面加入到我们的 Flarum 容器的网络即可。
更新 Flarum
之后我们登录到我们的 Flarum 论坛会发现我们的版本还在 1.3.0,这是因为 mondadiefr 大佬的镜像默认只有 1.3.0,但是我们可以通过进入容器升级我们的 Flarum 版本,我们在 SSH 终端运行:
docker exec flarum composer update --prefer-dist --no-plugins --no-dev -a --with-all-dependencies -d /flarum/app/
docker exec flarum php /flarum/app/flarum migrate
docker exec flarum php /flarum/app/flarum cache:clear
即可成功升级,升级完成后可能会提示我们无法清理 storage/cache
中的缓存,这个时候我们进入 var/lib/docker/volumes/flarum
目录中删除我们的 storage
文件夹然后重启容器即可解决这个问题。