阿里云 Ubuntu 22.04 部署 Flarum 论坛:从空白服务器到中文界面、公网 IP 访问

阿里云 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

依次操作:

  1. 在 Extensions 中找到简体中文语言包,启用。
  2. 在 Basics → Default Language 中选择简体中文,保存。
  3. 如果当前账号仍显示英文,在页面顶部的语言菜单中选择简体中文,再刷新。

默认语言主要影响新用户和访客,已登录用户可能保留自己的语言选择。Flarum 语言设置说明

十二、切换为公网 IP 加端口访问

到这里,浏览器通过 SSH 隧道可以使用论坛。接下来才调整公网访问。

需要同时满足三个条件:

  1. Docker 在公网流量能够到达的主机地址上发布 8080 端口。
  2. Flarum 知道自己的新站点地址。
  3. 阿里云安全组允许外部连接 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

判断顺序:

  1. 容器是否正在运行,数据库是否健康。
  2. 本机 curl 是否能得到 HTTP 响应。
  3. docker compose ps 是否显示预期的公网端口映射。
  4. 安全组是否允许 TCP 8080,来源范围是否包含访问者。
  5. 浏览器使用的协议、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 目录不能作为可靠的一致性备份。备份应另存一份到服务器之外,并验证能恢复。

相关推荐
Android系统攻城狮1 小时前
Linux FFmpeg深度解析之av_parser_init调用流程与实战(二十一)
linux·运维·服务器·ffmpeg·音视频进阶·ffmpeg音视频
a5986521 小时前
ARM服务器搭建云手机靠谱吗?个人自建方案优缺点总结
服务器·arm开发·智能手机·云手机
Hello.Reader2 小时前
100 人同时操作一座三维城市,为什么不需要服务器渲染 6000 帧?Rust + wgpu 多端并发架构实战
服务器·架构·rust
R²AIN SUITE2 小时前
多云或私有云环境怎么选项目管理工具?RainSuite等5种产品的8项部署验证
服务器·网络·数据库
IMPYLH11 小时前
Linux 的时间为什么会被拨回去
linux·运维·服务器
2601_9632827712 小时前
寒地窄带通信工程实践:黑龙江哈尔滨对讲机选型、组网与合规运维总结
运维·服务器·网络
xbzb13 小时前
OpenStack 网络管理(理论):Linux 网络虚拟化是 Neutron 的地基
linux·服务器·网络·openstack·network·neutron
Android系统攻城狮14 小时前
Linux FFmpeg深度解析之avcodec_flush_buffers调用流程与实战(十九)
linux·运维·服务器·ffmpeg·车载音视频·ffmpeg音视频进阶
Y38153266216 小时前
用 httpx 写 SerpBase 异步客户端:连接池与超时配置
运维·服务器·数据库