阿里云 Ubuntu 22.04 部署 Flarum 论坛:从空白服务器到中文界面、公网 IP 访问
想搭建一个技术交流论坛,我先用一台阿里云 ECS 试用服务器把基础功能跑起来。整个过程从 Ubuntu 22.04 开始,使用 Docker Compose 部署 Flarum 和 MariaDB,先通过 SSH 隧道完成安装,再切换成公网 IP 加端口访问。
过程中遇到了 Docker Hub 下载超时、容器内软件包下载缓慢、SSH 公钥登录失败,以及中文语言包安装参数错误。本文把最终采用的配置和命令整理在一起,方便从头复现。
文章目录
- [阿里云 Ubuntu 22.04 部署 Flarum 论坛:从空白服务器到中文界面、公网 IP 访问](#阿里云 Ubuntu 22.04 部署 Flarum 论坛:从空白服务器到中文界面、公网 IP 访问)
-
- 一、环境和部署方式
- 二、先确认新服务器的环境
- 三、为小内存服务器增加交换空间
- [四、安装 Docker 和 Compose](#四、安装 Docker 和 Compose)
-
- [实际遇到的问题:Docker Hub 下载超时](#实际遇到的问题:Docker Hub 下载超时)
- 五、准备论坛目录和数据库密码
- [六、创建 PHP 和 Apache 运行环境](#六、创建 PHP 和 Apache 运行环境)
-
- [6.1 编写 Dockerfile](#6.1 编写 Dockerfile)
- [6.2 为什么容器里还要换 Debian 软件源?](#6.2 为什么容器里还要换 Debian 软件源?)
- [6.3 配置 Apache 网站根目录](#6.3 配置 Apache 网站根目录)
- [6.4 排除构建时不需要的文件](#6.4 排除构建时不需要的文件)
- [七、使用 Compose 管理 Web 和数据库](#七、使用 Compose 管理 Web 和数据库)
- [八、构建镜像并安装 Flarum](#八、构建镜像并安装 Flarum)
-
- [8.1 构建运行环境](#8.1 构建运行环境)
- [8.2 下载论坛程序和 PHP 依赖](#8.2 下载论坛程序和 PHP 依赖)
- [8.3 启动服务并检查](#8.3 启动服务并检查)
- [九、通过 SSH 隧道打开首次安装页面](#九、通过 SSH 隧道打开首次安装页面)
-
- [9.1 Workbench 能登录,为什么本地 SSH 不行?](#9.1 Workbench 能登录,为什么本地 SSH 不行?)
- [9.2 在 Windows PowerShell 生成密钥](#9.2 在 Windows PowerShell 生成密钥)
- [9.3 在 Workbench 中添加公钥](#9.3 在 Workbench 中添加公钥)
- [9.4 在 Windows 上建立隧道](#9.4 在 Windows 上建立隧道)
- [十、填写 Flarum 安装表单](#十、填写 Flarum 安装表单)
- 十一、安装并启用简体中文
-
- [11.1 安装语言包](#11.1 安装语言包)
- [11.2 一个实际踩过的参数问题](#11.2 一个实际踩过的参数问题)
- [11.3 在后台启用并设为默认语言](#11.3 在后台启用并设为默认语言)
- [十二、切换为公网 IP 加端口访问](#十二、切换为公网 IP 加端口访问)
-
- [12.1 修改 Docker 端口映射](#12.1 修改 Docker 端口映射)
- [12.2 修改 Flarum 的站点地址](#12.2 修改 Flarum 的站点地址)
- [12.3 应用配置](#12.3 应用配置)
- [12.4 在阿里云安全组放行 TCP 8080](#12.4 在阿里云安全组放行 TCP 8080)
- [12.5 从另一台设备访问](#12.5 从另一台设备访问)
- 十三、部署过程中遇到的问题与排查顺序
- 十四、后续维护要记住的几个命令
一、环境和部署方式
本次环境如下:
| 项目 | 配置 |
|---|---|
| 云主机 | 阿里云 ECS 经济型试用实例 |
| 操作系统 | Ubuntu 22.04.5 LTS |
| 架构 | x86_64 |
| 内存 | 系统显示约 1.7 GiB |
| 系统盘 | 40 GB,开始时剩余约 35 GB |
| 本地电脑 | Windows,使用 PowerShell |
| 初始登录方式 | 阿里云 Workbench/远程连接 |
| 论坛 | Flarum 2.x |
| Web 环境 | PHP 8.3 + Apache |
| 数据库 | MariaDB 11.8 |
| 部署工具 | Docker Engine + Docker Compose 插件 |
| 最终访问入口 | http://服务器公网IP:8080 |
这套配置用于先验证论坛功能,本文没有进行并发压测,也没有据此估算可承载的用户数量。
部署关系如下:
text
浏览器
│
│ HTTP,访问服务器的 8080 端口
▼
阿里云安全组
▼
ECS 主机上的 Docker 端口映射
▼
web 容器:Apache + PHP + Flarum,内部端口 80
│
│ Docker 内部网络,通过服务名 db 访问
▼
db 容器:MariaDB,内部端口 3306
数据库不发布到公网。帖子、用户等数据保存在数据库中;程序、头像等文件保存在宿主机挂载目录中。
本文采用自己构建 PHP 运行环境的方式。构建时会编译 PHP 扩展,但不需要每次启动都重新编译。使用现成的 Flarum 镜像也能部署,不过不属于本次最终采用的路径。
二、先确认新服务器的环境
从阿里云控制台通过 Workbench 登录 ECS。
本文 Linux 命令均在 ECS 上执行,并假设当前是 root。如果使用普通管理用户,可以先执行 sudo -i。标为 PowerShell 的代码则在自己的 Windows 电脑上执行。
bash
cat /etc/os-release
uname -m
free -h
swapon --show
df -h /
ss -lntp
检查 Docker 是否已经安装:
bash
if command -v docker >/dev/null 2>&1; then
docker --version
docker compose version
docker ps --format 'table {{.Names}}\t{{.Image}}\t{{.Ports}}'
fi
本次服务器的 Web 端口没有被其他业务使用,交换空间为 0。如果机器已经运行其他网站、数据库或容器,先检查已有配置,不要直接覆盖目录或卸载软件。
后面的命令按段执行。某一步报错时先处理错误,不要继续执行依赖它的下一步。
三、为小内存服务器增加交换空间
安装依赖时可能出现短时内存峰值。这里增加 2 GB 交换空间,降低进程因内存不足被终止的概率。它会占用系统盘,不能代替真实内存,也不会提升计算性能。
bash
(
set -eu
if [ -e /swapfile ]; then
echo "/swapfile 已存在,跳过创建,请检查是否已经启用"
else
umask 077
fallocate -l 2G /swapfile
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile
if ! grep -qE '^[[:space:]]*/swapfile[[:space:]]' /etc/fstab; then
printf '/swapfile none swap sw 0 0\n' >> /etc/fstab
fi
fi
free -h
swapon --show
)
成功后 Swap 应显示约 2.0Gi。如果提示文件已存在却没有启用交换空间,先检查已有文件用途,不要直接重新格式化它。
四、安装 Docker 和 Compose
下面按照 Docker 官方的 APT 仓库方式安装,适用于本次全新的 Ubuntu 22.04 amd64 主机。Docker 官方安装文档
bash
(
set -eu
if command -v docker >/dev/null 2>&1; then
echo "Docker 已存在,跳过安装"
docker --version
docker compose version
exit 0
fi
apt-get update
apt-get install -y ca-certificates curl openssl
install -m 0755 -d /etc/apt/keyrings
curl -fsSL --connect-timeout 20 --max-time 120 \
https://download.docker.com/linux/ubuntu/gpg \
-o /etc/apt/keyrings/docker.asc
chmod a+r /etc/apt/keyrings/docker.asc
cat > /etc/apt/sources.list.d/docker.sources <<EOF
Types: deb
URIs: https://download.docker.com/linux/ubuntu
Suites: jammy
Components: stable
Architectures: amd64
Signed-By: /etc/apt/keyrings/docker.asc
EOF
apt-get update
apt-get install -y \
docker-ce \
docker-ce-cli \
containerd.io \
docker-buildx-plugin \
docker-compose-plugin
systemctl enable --now docker
docker --version
docker compose version
)
验证:
bash
systemctl is-active docker
docker compose version
docker run --rm hello-world
active 说明 Docker 服务已启动,但不能证明镜像仓库可访问。
实际遇到的问题:Docker Hub 下载超时
执行最后一条时,出现了类似报错:
text
failed to resolve reference "docker.io/library/hello-world:latest"
dial tcp ...:443: i/o timeout
这次故障发生在下载镜像阶段,容器还没开始运行。它与论坛配置、域名或数据库无关。
我们改用 Docker 官方镜像在 Amazon ECR Public 上的分发地址:
bash
docker run --rm public.ecr.aws/docker/library/hello-world:latest
本次成功输出了:
text
Hello from Docker!
后面的基础镜像也统一使用 ECR 地址。该分发渠道有 Docker 官方说明,但不同地区、不同时间的连通性仍需实际验证。
这里没有修改 Docker 的全局镜像加速器。因此,再执行不带仓库前缀的 docker run hello-world,仍可能访问 Docker Hub 并超时。
五、准备论坛目录和数据库密码
先创建项目目录:
bash
mkdir -p /opt/flarum/app
cd /opt/flarum
生成数据库密码,已有 .env 时不重新生成:
bash
(
set -eu
umask 077
if [ ! -f .env ]; then
printf 'DB_PASSWORD=%s\n' "$(openssl rand -hex 24)" > .env
printf 'DB_ROOT_PASSWORD=%s\n' "$(openssl rand -hex 24)" >> .env
fi
chmod 600 .env
)
chown 33:33 app
chmod 755 app
这里的 33:33 对应所选 Debian PHP 镜像里的 www-data 用户和组,安装程序需要写入 app 目录。换用其他镜像时不能直接假设 UID/GID 相同。
后续目录结构为:
text
/opt/flarum/
├── .env # 数据库密码,不要公开
├── .dockerignore
├── Dockerfile
├── apache.conf
├── compose.yaml
├── app/ # Flarum 程序、配置、资源与缓存
└── database/ # MariaDB 数据目录,启动后创建
这些目录位于 ECS 系统盘上,不是存放在浏览器里。挂载目录可以保留重建容器前后的数据,但不等于已经有备份。
六、创建 PHP 和 Apache 运行环境
Flarum 2.x 要求 PHP 8.3 及以上版本。本次使用 PHP 8.3 Apache 镜像,并补充所需扩展;数据库选择 MariaDB 11.8。Flarum 安装要求
6.1 编写 Dockerfile
在 ECS 终端整段复制,保留结尾的 EOF:
bash
cd /opt/flarum
cat > Dockerfile <<'EOF'
FROM public.ecr.aws/docker/library/composer:2 AS composer
FROM public.ecr.aws/docker/library/php:8.3-apache-bookworm
RUN sed -i 's|http://deb.debian.org/debian$|https://mirrors.tuna.tsinghua.edu.cn/debian|' /etc/apt/sources.list.d/debian.sources
RUN apt-get update \
&& apt-get install -y --no-install-recommends \
unzip libicu-dev libzip-dev libpng-dev libjpeg62-turbo-dev libfreetype6-dev \
&& docker-php-ext-configure gd --with-freetype --with-jpeg \
&& docker-php-ext-install -j2 gd intl zip pdo_mysql opcache \
&& a2enmod rewrite \
&& rm -rf /var/lib/apt/lists/*
COPY --from=composer /usr/bin/composer /usr/local/bin/composer
COPY apache.conf /etc/apache2/sites-available/000-default.conf
RUN cp "$PHP_INI_DIR/php.ini-production" "$PHP_INI_DIR/php.ini" \
&& printf 'memory_limit=256M\nupload_max_filesize=16M\npost_max_size=20M\nexpose_php=Off\n' \
> "$PHP_INI_DIR/conf.d/forum.ini" \
&& printf 'ServerName localhost\n' \
> /etc/apache2/conf-enabled/servername.conf \
&& printf '<IfModule mpm_prefork_module>\nStartServers 2\nMinSpareServers 2\nMaxSpareServers 4\nMaxRequestWorkers 8\nMaxConnectionsPerChild 500\n</IfModule>\n' \
> /etc/apache2/mods-available/mpm_prefork.conf
WORKDIR /var/www/html
EOF
这里限制了 Apache 的工作进程数量,作为小内存服务器的初始配置,后续应根据实际负载调整。
6.2 为什么容器里还要换 Debian 软件源?
最初构建时,ECR 的镜像已经下载成功,但日志长时间停在:
text
Get:4 http://deb.debian.org/debian bookworm/main amd64 Packages
镜像下载和容器内安装软件是两条不同的网络路径。ECR 能访问,不代表 Debian 软件源下载也快。
上面的 Dockerfile 已合并本次采用的修正:将普通 Debian 仓库切换为清华镜像,安全更新仓库保持原配置。Debian 12 容器使用的源文件是 /etc/apt/sources.list.d/debian.sources。清华镜像站说明
注意:修改的是 PHP 容器里的 Debian 软件源,不是 Ubuntu 宿主机的软件源。
6.3 配置 Apache 网站根目录
bash
cat > apache.conf <<'EOF'
<VirtualHost *:80>
DocumentRoot /var/www/html/public
<Directory /var/www/html/public>
Options -Indexes +FollowSymLinks
AllowOverride All
Require all granted
</Directory>
ErrorLog /proc/self/fd/2
CustomLog /proc/self/fd/1 combined
</VirtualHost>
EOF
Flarum 的网站根目录要指向 public。程序配置文件放在它的上一级,避免通过网页直接读取。AllowOverride All 配合已启用的 rewrite 模块,让 Flarum 自带的 .htaccess 路由规则生效。官方 Web 服务器配置说明
6.4 排除构建时不需要的文件
bash
cat > .dockerignore <<'EOF'
*
!Dockerfile
!apache.conf
EOF
这样后续重新构建时,不会把数据库目录、论坛文件和 .env 一起发送进构建上下文。
七、使用 Compose 管理 Web 和数据库
先只允许服务器本机访问论坛,等安装完成再开放公网入口。
bash
cd /opt/flarum
cat > compose.yaml <<'EOF'
name: flarum
services:
db:
image: public.ecr.aws/docker/library/mariadb:11.8
restart: unless-stopped
environment:
MARIADB_DATABASE: flarum
MARIADB_USER: flarum
MARIADB_PASSWORD: ${DB_PASSWORD:?missing DB_PASSWORD}
MARIADB_ROOT_PASSWORD: ${DB_ROOT_PASSWORD:?missing DB_ROOT_PASSWORD}
command:
- --character-set-server=utf8mb4
- --collation-server=utf8mb4_unicode_ci
- --innodb-buffer-pool-size=128M
- --max-connections=40
volumes:
- ./database:/var/lib/mysql
healthcheck:
test: ["CMD", "healthcheck.sh", "--connect", "--innodb_initialized"]
interval: 10s
timeout: 5s
retries: 12
start_period: 30s
logging:
driver: json-file
options:
max-size: "10m"
max-file: "3"
web:
build: .
restart: unless-stopped
ports:
- "127.0.0.1:8080:80"
volumes:
- ./app:/var/www/html
depends_on:
db:
condition: service_healthy
logging:
driver: json-file
options:
max-size: "10m"
max-file: "3"
EOF
docker compose config --quiet
校验没有输出、直接回到命令提示符,即表示配置通过校验。
几个关键点:
web和db是 Compose 服务名,在内部网络中可以通过db找到数据库。127.0.0.1:8080:80表示宿主机仅在本地回环地址监听 8080,并转发到 Web 容器的 80。- 数据库没有
ports配置,外部不能通过主机端口直接连接它。 depends_on配合健康检查,让 Web 服务启动前等待数据库准备好。- 日志设置了轮转,减少日志长期积累占满磁盘的风险。
八、构建镜像并安装 Flarum
8.1 构建运行环境
bash
cd /opt/flarum
docker compose --progress plain build web
这个阶段会下载依赖并编译 PHP 扩展。--progress plain 显示完整日志,便于判断是在下载、安装还是编译。
成功标志类似:
text
Image flarum-web Built
日志里的 CACHED 表示复用了已完成的构建层,不是错误。如果网络下载缓慢,停止并重新构建通常可以复用已完成的层,但被中断的那条 RUN 指令需要重新执行。
8.2 下载论坛程序和 PHP 依赖
bash
docker compose run --rm --no-deps \
--user www-data \
-e HOME=/tmp \
-e COMPOSER_HOME=/tmp/composer \
web \
php -d memory_limit=1G /usr/local/bin/composer \
create-project "flarum/flarum:^2.0.0" . \
--prefer-dist --no-dev --no-interaction
这条命令启动一个临时容器,以 www-data 身份把程序安装到挂载目录中。容器退出后会被删除,但 /opt/flarum/app 里的文件会保留。安装此时不需要连接数据库,所以使用 --no-deps。
这一步下载的是 Flarum 和 PHP 软件包,不会再次编译前面的 PHP 扩展。它需要访问 Composer 软件仓库和 GitHub,网络问题与 ECR 镜像下载需要分别排查。
^2.0.0 是允许兼容 2.x 版本的范围,不是精确锁定某个补丁版本。成功后生成的 composer.lock 记录本次依赖版本,应随程序一起保留。
此安装命令只用于空目录的首次安装。若提示目录非空,先检查是否已经安装或上一次中断;不要通过删除论坛目录来强行重跑。
8.3 启动服务并检查
bash
docker compose up -d --wait
docker compose ps
curl -I --max-time 20 http://127.0.0.1:8080
本次看到的关键结果为:
text
flarum-db-1 Up ... (healthy)
flarum-web-1 Up ... 127.0.0.1:8080->80/tcp
HTTP/1.1 200 OK
这里数据库有专门的健康检查,Web 服务只配置了启动,没有配置 HTTP 健康检查。即使 Compose 启动过程显示成功,仍需要用 curl 检查实际页面响应。
出现错误时先看日志:
bash
docker compose logs --tail=80 web db
九、通过 SSH 隧道打开首次安装页面
此时论坛只监听服务器的 127.0.0.1:8080,外网不能直接访问。先通过 SSH 隧道把它转发到 Windows 电脑,完成安装。
9.1 Workbench 能登录,为什么本地 SSH 不行?
Workbench 的登录凭据不会自动出现在 Windows 电脑上。本次直接运行 SSH 时出现:
text
Permission denied (publickey).
原因是服务器没有认可本地 SSH 提供的密钥。解决方式是在本地生成密钥,将公钥通过已有的 Workbench 会话加入服务器。
9.2 在 Windows PowerShell 生成密钥
powershell
New-Item -ItemType Directory -Force "$env:USERPROFILE\.ssh" | Out-Null
ssh-keygen -t ed25519 -f "$env:USERPROFILE\.ssh\flarum_ecs" -C "flarum-ecs"
按提示设置私钥口令。若提示同名文件已存在,不要覆盖已有密钥,可以保留并使用它。
显示公钥:
powershell
Get-Content "$env:USERPROFILE\.ssh\flarum_ecs.pub"
复制完整一行,包括开头的 ssh-ed25519、中间的密钥字符串和末尾注释。
不要复制 SHA256:... 指纹,也不要复制随机图案。带 .pub 的是公钥;不带 .pub 的私钥文件留在自己电脑上。
9.3 在 Workbench 中添加公钥
在 ECS 终端执行:
bash
install -d -m 700 /root/.ssh
touch /root/.ssh/authorized_keys
chmod 600 /root/.ssh/authorized_keys
把下面的占位内容替换成刚刚复制的完整公钥,保留单引号,然后执行:
bash
printf '\n%s\n' '在这里粘贴以 ssh-ed25519 开头的完整公钥' >> /root/.ssh/authorized_keys
使用 >> 追加,不会覆盖原来的授权密钥。不需要为了这一步开启密码登录或重启 SSH 服务。
9.4 在 Windows 上建立隧道
替换示例 IP 后执行:
powershell
ssh -i "$env:USERPROFILE\.ssh\flarum_ecs" -o IdentitiesOnly=yes -o ExitOnForwardFailure=yes -N -L 127.0.0.1:8080:127.0.0.1:8080 root@203.0.113.10
首次连接可能要求确认服务器指纹。可以在 Workbench 中执行下面的命令核对 ED25519 指纹,确认匹配后再接受:
bash
ssh-keygen -lf /etc/ssh/ssh_host_ed25519_key.pub
若生成私钥时设置了口令,按提示输入。连接成功后窗口没有新输出、一直等待是正常现象,保持窗口打开。
在 Windows 浏览器访问:
text
http://127.0.0.1:8080
此时访问路径是:
text
Windows 浏览器 → 本机 8080 → SSH 隧道 → ECS 的 127.0.0.1:8080 → Flarum
SSH 本身需要安全组允许当前电脑连接服务器的 22 端口,但这一阶段不需要在安全组开放 8080。
十、填写 Flarum 安装表单
打开页面后,填写以下信息:
| 字段 | 填写内容 |
|---|---|
| Forum Title | 自己的论坛名称,例如"技术交流论坛" |
| Database Driver | MariaDB |
| Database | flarum |
| Host | db |
| Username | flarum |
| Password | .env 中的 DB_PASSWORD |
| Table Prefix | 留空 |
| Admin Username | 自己设置的管理员用户名 |
| Admin Email | 自己的有效邮箱 |
| Admin Password | 自己设置的管理员密码 |
| Confirm Password | 再输入一次管理员密码 |
查看数据库密码:
bash
sed -n 's/^DB_PASSWORD=//p' /opt/flarum/.env
只把输出的值填入表单,不要把密码发布在文章、截图或聊天中。
本次容易填错的两个字段是:
Database是数据库名称,填flarum。Host是数据库主机名,填 Compose 服务名db。
本次页面没有单独的端口输入框,因此不需要填写 3306,更不能把 3306 写入 Host。数据库密码与管理员密码也是两种不同的密码。
如果安装页面要求填写站点地址,此阶段填 http://127.0.0.1:8080。提交安装后即可进入论坛并使用管理员账号登录。
十一、安装并启用简体中文
初次安装的界面是英文,是因为尚未安装、启用中文语言包。论坛标题写成中文不会自动改变界面语言。
11.1 安装语言包
在 Workbench 的 ECS 终端执行:
bash
cd /opt/flarum
docker compose exec --user www-data \
-e HOME=/tmp \
-e COMPOSER_HOME=/tmp/composer \
web php -d memory_limit=1G /usr/local/bin/composer \
require "flarum-lang/chinese-simplified:^2.0" \
--update-no-dev --no-interaction
成功后清缓存:
bash
docker compose exec --user www-data web php flarum cache:clear
该语言包的 2.x 版本用于 Flarum 2.x。语言包项目说明
11.2 一个实际踩过的参数问题
最初把 composer require 的参数写成了 --no-dev,出现:
text
The "--no-dev" option does not exist.
不同 Composer 子命令的参数不完全相同:
| 命令场景 | 本文使用的参数 |
|---|---|
composer create-project 初次创建项目 |
--no-dev |
composer require 添加语言包 |
--update-no-dev |
正文已使用修正后的命令,不需要再执行错误版本。Composer require 参数说明
11.3 在后台启用并设为默认语言
保持 SSH 隧道开启,在浏览器进入:
text
http://127.0.0.1:8080/admin
依次操作:
- 在 Extensions 中找到简体中文语言包,启用。
- 在 Basics → Default Language 中选择简体中文,保存。
- 如果当前账号仍显示英文,在页面顶部的语言菜单中选择简体中文,再刷新。
默认语言主要影响新用户和访客,已登录用户可能保留自己的语言选择。Flarum 语言设置说明
十二、切换为公网 IP 加端口访问
到这里,浏览器通过 SSH 隧道可以使用论坛。接下来才调整公网访问。
需要同时满足三个条件:
- Docker 在公网流量能够到达的主机地址上发布 8080 端口。
- Flarum 知道自己的新站点地址。
- 阿里云安全组允许外部连接 8080 端口。
完成下面操作后,访问地址变为 http://203.0.113.10:8080。再次提醒:示例 IP 必须替换成自己的公网 IP;大陆节点公开网站的备案要求仍然适用。
12.1 修改 Docker 端口映射
在 Workbench 执行:
bash
cd /opt/flarum
cp -a compose.yaml "compose.yaml.bak.$(date +%Y%m%d-%H%M%S)"
sed -i 's/127\.0\.0\.1:8080:80/8080:80/' compose.yaml
docker compose config --quiet
grep -A 2 'ports:' compose.yaml
修改后应为:
yaml
ports:
- "8080:80"
两种配置的差异:
| 配置 | 含义 |
|---|---|
127.0.0.1:8080:80 |
仅在 ECS 本机回环地址发布端口,需要隧道等方式访问 |
8080:80 |
默认在主机所有地址上发布端口,能否外部访问还取决于网络规则 |
这里仍然只修改 web 的端口,不给数据库添加公网映射。
12.2 修改 Flarum 的站点地址
下面的 203.0.113.10 替换成真实公网 IP 后再执行:
bash
cd /opt/flarum
cp -a app/config.php "app/config.php.bak.$(date +%Y%m%d-%H%M%S)"
sed -i 's|http://127\.0\.0\.1:8080|http://203.0.113.10:8080|g' app/config.php
grep "'url'" app/config.php
应当看到:
php
'url' => 'http://203.0.113.10:8080',
如果没有改变,先检查原来的 url 值。上面的替换只匹配本教程前面使用的地址,不适用于其他旧地址。
Flarum 使用 config.php 中的站点 URL 生成链接等内容。只改端口映射而不改这里,可能仍生成指向旧地址的链接。Flarum 配置文件说明
12.3 应用配置
bash
docker compose exec --user www-data web php -l config.php
确认输出 No syntax errors detected 后,继续执行:
bash
docker compose up -d
docker compose exec --user www-data web php flarum cache:clear
docker compose ps
端口映射应出现:
text
0.0.0.0:8080->80/tcp
这里使用 up -d 应用端口变更。单独执行 restart 不会加载 Compose 中修改后的端口映射。
12.4 在阿里云安全组放行 TCP 8080
安全组是服务器外部的一层网络访问规则。论坛已经运行,不代表外部连接一定被允许进入。
在阿里云控制台找到:
text
ECS → 实例 → 当前实例 → 安全组 → 对应安全组 → 入方向规则 → 添加规则
不同版本控制台的文字可能略有区别。规则填写为:
| 配置项 | 内容 |
|---|---|
| 授权策略 | 允许 |
| 协议类型 | 自定义 TCP |
| 目的端口 | 8080,如果要求范围格式则填 8080/8080 |
| 来源/授权对象 | 0.0.0.0/0 |
| 描述 | Flarum 论坛访问 |
0.0.0.0/0 表示允许所有 IPv4 来源。它不是需要填写到浏览器里的地址,也不是服务器的公网 IP。
如果来源填的是某一台电脑的公网 IP 加 /32,就只允许该公网出口访问。希望其他网络的电脑和手机也能访问,需要相应放开来源。
这里只开放论坛使用的 TCP 8080,不要为了方便开放所有端口,也不要改动已有 SSH 规则或开放数据库 3306。
还要注意,Docker 发布的端口与主机防火墙有特殊交互,不能假定 UFW 一定会按普通主机进程的方式拦截它。外部来源限制应核对云安全组和 Docker 的实际网络规则。Docker 防火墙说明
12.5 从另一台设备访问
在浏览器输入完整地址,包含 http://:
text
http://203.0.113.10:8080
使用另一台电脑,或手机切换到移动网络后测试,可以确认访问不再依赖原电脑的 SSH 隧道。更换地址后需要重新登录是正常现象。
这时可以关闭之前的隧道窗口。论坛运行在 ECS 上,个人电脑关机不影响它运行。是否能够持续访问仍受实例状态、公网网络、接入商策略等因素影响。
本次到这里完成了公网 IP 访问验证。当前入口使用 HTTP,没有传输加密;正式使用前还应配置 HTTPS,不要在测试论坛使用与重要账号相同的密码。
十三、部署过程中遇到的问题与排查顺序
| 现象 | 本次原因或判断方向 | 处理方式 |
|---|---|---|
docker run hello-world 超时 |
Docker Hub 下载路径不通 | 改用 ECR 官方镜像分发地址,本次验证可用 |
| 镜像已下载,构建仍很慢 | 容器内 Debian 软件源下载慢 | 普通 Debian 仓库换为清华镜像,使用完整构建日志观察进度 |
| Docker 构建时出现编译 | 本方案在安装 PHP 扩展 | 首次构建需要,日常启停不需要重复编译 |
| Workbench 能登录,Windows SSH 失败 | 本地没有服务器认可的私钥/公钥未正确加入 | 生成本地密钥,追加完整公钥,再通过 -i 指定私钥 |
Permission denied (publickey) |
密钥不匹配、内容不完整或权限等问题 | 核对公钥开头、中间内容、私钥路径和授权文件权限 |
| 数据库安装表单连接失败 | Database、Host 填错或密码不匹配 |
数据库填 flarum,主机填 db,密码取 .env |
| 页面不是中文 | 语言包未安装、未启用或账号仍选择英文 | 安装语言包,后台启用,设置默认语言及当前账号语言 |
--no-dev 不存在 |
用错 Composer 子命令参数 | require 使用 --update-no-dev |
| 本机隧道能打开,其他电脑打不开 | 回环绑定、旧站点 URL 或安全组来源限制 | 核对公网访问的三处配置 |
公网打不开时,先检查服务器内部
bash
cd /opt/flarum
docker compose ps
curl -I --max-time 10 http://127.0.0.1:8080
docker compose logs --tail=80 web db
判断顺序:
- 容器是否正在运行,数据库是否健康。
- 本机
curl是否能得到 HTTP 响应。 docker compose ps是否显示预期的公网端口映射。- 安全组是否允许 TCP 8080,来源范围是否包含访问者。
- 浏览器使用的协议、IP 和端口是否正确。
如果本机也返回 500,先查看应用日志;如果本机正常、外部连接超时,再检查网络规则。出现接入商的备案提示页时,应按提示处理,不能通过继续换端口解决公开建站要求。
十四、后续维护要记住的几个命令
以下命令在 /opt/flarum 目录执行:
bash
cd /opt/flarum
# 查看容器状态
docker compose ps
# 查看最近日志
docker compose logs --tail=100 web db
# 启动或应用 Compose 配置变更
docker compose up -d
# 临时停止论坛 Web 服务,数据库继续运行
docker compose stop web
# 恢复 Web 服务
docker compose start web
# 重启 Web 服务,不重新构建
docker compose restart web
# 清理 Flarum 缓存
docker compose exec --user www-data web php flarum cache:clear
# 查看当前 Flarum 核心版本
docker compose exec --user www-data web composer show flarum/core
完成本文,得到的是一个已安装中文界面、可以通过公网 IP 访问的基础论坛。邮件发送、域名和 HTTPS、附件上传扩展、内容管理及备份恢复还需要按实际用途继续配置。
尤其是试用服务器,不要等试用到期才考虑数据迁移。后续备份至少应覆盖数据库逻辑导出、app 目录,以及 Compose、Dockerfile、Apache 配置和 .env。数据库运行时直接复制 database 目录不能作为可靠的一致性备份。备份应另存一份到服务器之外,并验证能恢复。