EasyWI 6.2.2 Docker Compose 部署指南
用 Docker Compose 从零部署 EasyWI 6.2.2 面板(php:7.4-apache 自建 + mariadb:10.11),含安装向导、登录与 API 初始化及排障实录,全部命令实测回显。
EasyWI 6.2.2 Docker Compose 部署指南
目标:用 Docker Compose 从零部署 EasyWI(easy-wi)6.2.2 管理面板,完成安装向导、管理员登录与 API 凭据初始化。本文全部命令与回显均来自本机实验栈
easywi-622-stack实测(2026-11-02),版本数据溯源见 《EasyWI 介绍与选型指南》。
一、环境信息
本文实测环境的关键信息如下,全部来自真实执行回显:
- 部署工具:Docker 29.9.2 / Docker Compose v5.6.1(实测回显见 4.1 节)
- 软件版本:EasyWI developer v6.2.2(GitHub releases/latest 稳定版,查询日期 2026-11-02)
- Web 端:自建镜像
easywi-622-stack-web(基于 php:7.4-apache,实测 PHP 7.4.33、Apache/2.4.54) - 数据库端:
mariadb:10.11官方镜像 - 端口映射:宿主机
8138→ Web 端 80 - 专用网络:
easywi-net,显式子网10.89.65.0/24 - 数据持久化:命名卷
easywi-db-data(数据库)+ bind mount(面板源码目录) - 演示账号:面板管理员
admin/q1w2e3r4;API 用户apiuser/q1w2e3r4;数据库口令q1w2e3r4
二、镜像选型说明
2.1 为什么自建 Web 镜像
EasyWI 官方不提供 Docker 镜像,只提供源码包(GitHub 仓库 easy-wi/developer)。官方 README 要求 PHP 5.4+ 并列出必需扩展:openssl、json、hash、ftp、SimpleXML、curl、gd、PDO、pdo_mysql(查询日期 2026-11-02)。其中 json/hash/curl/PDO 等在 php 官方镜像内已内置或默认启用,需要补装的是 gd、ftp、pdo_mysql(以及 zip 便于解包类操作),因此以 php:7.4-apache 为基础镜像做一层薄封装即可。
💡 技术拓展:Web 面板类软件选 PHP 基础镜像的常见档位对比——
基础镜像 状态 适配 EasyWI 的取舍 php:5.6 / 7.0-apache 上游已停维护 满足"5.4+"下限但镜像本身带安全风险,不选 php:7.4-apache 停止官方维护,镜像仍可得 语法兼容性好、扩展编译资料全,本文实测选它 php:8.x-apache 当前受支持 老代码对 8.x 的严格类型/废弃函数兼容性未验证,风险高 本文采用 php:7.4-apache,是"能编译全部必需扩展 + 老代码兼容"的折中;上生产前建议先在测试栈验证目标 PHP 大版本。
2.2 Dockerfile 全文
deploy/web/Dockerfile(实测构建通过):
FROM php:7.4-apache
RUN apt-get update && apt-get install -y --no-install-recommends \
libpng-dev \
libjpeg62-turbo-dev \
libfreetype6-dev \
libzip-dev \
zlib1g-dev \
libssl-dev \
&& docker-php-ext-configure gd --with-freetype --with-jpeg \
&& docker-php-ext-install -j"$(nproc)" gd zip ftp pdo_mysql \
&& rm -rf /var/lib/apt/lists/*
COPY easywi.ini /usr/local/etc/php/conf.d/easywi.ini
逐项说明:libpng/libjpeg/libfreetype 是 gd 扩展的图像库依赖;libzip 对应 zip 扩展;docker-php-ext-configure gd --with-freetype --with-jpeg 是 PHP 7.4 下 gd 的新式配置参数(旧式 --with-png-dir 已废弃);ftp 与 pdo_mysql 对应 README 必需扩展;最后把 PHP 运行参数文件拷入 conf.d(见八、配置文件挂载)。
2.3 数据库镜像
选 mariadb:10.11:EasyWI 的 SQL 兼容 MySQL/MariaDB,MariaDB 10.11 为长期维护线,且官方镜像自带 healthcheck.sh 可供 compose 健康检查(实测见 4.4 节)。
三、前置条件
3.1 主机能力
- 已安装 Docker 与 Compose v2 子命令(回显见 4.1 节)。
- 宿主机端口 8138 未被占用(
ss -ltn | grep 8138无输出)。 - 自定义网络子网需显式指定且避开已占用网段:本栈用
10.89.65.0/24,部署前用docker network ls与docker network inspect确认该段未被其他栈占用。
3.2 获取软件源码包
从 GitHub tags 下载 v6.2.2 源码包并解包(实测):
cd /opt/data/quzuo/tmp/easywi
wget https://github.com/easy-wi/developer/archive/refs/tags/v6.2.2.tar.gz -O developer-6.2.2.tar.gz
tar xzf developer-6.2.2.tar.gz
ls -l developer-6.2.2.tar.gz
-rw-r--r-- 1 root root 6488215 Nov 2 20:42 developer-6.2.2.tar.gz
解包后目录为 developer-6.2.2/,将整体 bind mount 进 Web 端充当面板源码(升级即换目录,数据全在数据库卷里)。
四、部署步骤
4.1 确认部署工具版本
docker --version
docker compose version
Docker version 29.9.2, build a82e528
Docker Compose version v5.6.1
4.2 目录结构
tmp/easywi/
├── developer-6.2.2/ # 面板源码(bind mount 进 Web 端)
└── deploy/
├── docker-compose.yml
└── web/
├── Dockerfile
└── easywi.ini
4.3 编写 docker-compose.yml
deploy/docker-compose.yml 全文(实测在跑):
name: easywi-6.2.2-stack
services:
web:
build: ./web
container_name: easywi-6.2.2-web
restart: unless-stopped
ports:
- "8138:80"
volumes:
- ../developer-6.2.2:/var/www/html
depends_on:
db:
condition: service_healthy
networks:
- easywi-net
db:
image: mariadb:10.11
container_name: easywi-6.2.2-db
restart: unless-stopped
environment:
MARIADB_ROOT_PASSWORD: q1w2e3r4
MARIADB_DATABASE: easywi
MARIADB_USER: easywi
MARIADB_PASSWORD: q1w2e3r4
volumes:
- easywi-db-data:/var/lib/mysql
command:
- --character-set-server=utf8mb4
- --collation-server=utf8mb4_unicode_ci
healthcheck:
test: ["CMD", "healthcheck.sh", "--connect", "--innodb_initialized"]
interval: 5s
timeout: 5s
retries: 12
networks:
- easywi-net
networks:
easywi-net:
driver: bridge
ipam:
config:
- subnet: 10.89.65.0/24
volumes:
easywi-db-data:
要点:首行 name: 显式固定项目名(防与其他组件同名目录互删);depends_on.db.condition: service_healthy 保证 Web 启动时数据库已可写;网络显式子网便于 API IP 白名单固定填写。
4.4 构建并启动
cd deploy
docker compose build
docker compose up -d
构建输出节选(实测首尾):
#9 exporting to image
#9 naming to docker.io/library/easywi-622-stack-web:latest done
#9 unpacking to docker.io/library/easywi-622-stack-web:latest done
#9 DONE 0.0s
#10 resolving provenance for metadata file
#10 DONE 0.0s
Image easywi-622-stack-web Built
启动输出(实测):
Container easywi-6.2.2-web Running
Container easywi-6.2.2-db Running
Container easywi-6.2.2-db Waiting
Container easywi-6.2.2-db Healthy
db Healthy 即健康检查通过,验证命令与回显:
docker compose ps
NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS
easywi-6.2.2-db mariadb:10.11 "docker-entrypoint.s…" db 2 hours ago Up 33 minutes (healthy) 3306/tcp
easywi-6.2.2-web easywi-622-stack-web "docker-php-entrypoi…" web 2 hours ago Up 33 minutes 0.0.0.0:8138->80/tcp, [::]:8138->80/tcp
4.5 运行安装向导
浏览器访问 http://localhost:8138/install/ 进入官方安装向导(页头实测文本 Easy-WI.com Installer 6.2.2,标题 "Easy-Wi Installer")。按向导逐步完成:
- 系统检查页确认 PHP 版本与必需扩展全部就绪;
- 填入数据库连接:主机
db、库easywi、用户easywi、口令q1w2e3r4; - 设置站点标题与管理员账号(本文用
admin/q1w2e3r4); - 向导写入配置文件并初始化数据表。
验证安装结果——配置文件已由向导生成(Web 端内实测 cat /var/www/html/stuff/config.php,全文见 七、配置参数说明);版本表实测:
docker exec easywi-6.2.2-db mariadb -ueasywi -pq1w2e3r4 easywi -e "SELECT * FROM easywi_version;"
id version de en
1 6.2.2
4.6 删除 install 目录(强制)
安装完成后必须删除源码包中的 install/ 目录。程序内置守卫:login.php 与 api.php 开头检测该目录存在即 die('Please remove the "install" folder')。实测删除后 ls /var/www/html/ | grep install 无输出。
4.7 登录验证(实测)
curl -s -c jar.txt "http://localhost:8138/login.php?gamestring=k27a906h3f8m"
curl -s -b jar.txt -c jar.txt -X POST http://localhost:8138/login.php -d "username=admin&password=q1w2e3r4" -w "http_code=%{http_code} redirect=%{redirect_url}\n"
http_code=302 redirect=http://localhost:8138/admin.php
curl -s -b jar.txt "http://localhost:8138/admin.php?w=sa" -w "%{http_code} %{size_download}\n"
200 24755
302 跳转到 admin.php、管理首页 200 且返回 24755 字节页面,登录链路验证通过。
4.8 初始化 API 用户与 IP 白名单(实测)
后台 Admin 区域创建 API 用户 apiuser(口令 q1w2e3r4),并在 API 设置的 IP 白名单中加入调用方 IP。落库结果实测:
docker exec easywi-6.2.2-db mariadb -ueasywi -pq1w2e3r4 easywi -e "SELECT * FROM api_ips;"
ip resellerID
10.89.65.1 0
10.89.65.1 即宿主机在 easywi-net(10.89.65.0/24)中的地址。API 鉴权链与 403 排障实录见《EasyWI 6.2.2 配置参数详解》篇。
五、数据持久化说明
| 数据 | 载体 | 实测位置 | 说明 |
|---|---|---|---|
| 数据库 | 命名卷 easywi-db-data | 挂载至 db 端 /var/lib/mysql | 面板全部业务数据(settings/userdata/api 等表)所在,备份即备此卷 |
| 面板源码 | bind mount | ../developer-6.2.2 → /var/www/html | 换版本=换目录;源码本身不含状态 |
| 生成的配置 | 随 bind mount | /var/www/html/stuff/config.php | 安装向导写入,升级换目录后需重新生成或保留该文件 |
| PHP 参数 | 镜像内 | /usr/local/etc/php/conf.d/easywi.ini | 由 Dockerfile COPY 进镜像 |
宿主机重启后栈自动拉起(restart: unless-stopped 实测生效):docker compose ps 中 CREATED About an hour ago 而 STATUS Up 14 minutes,即重启后由 Docker 自动恢复,数据无损。
六、环境变量表
| 变量 | 作用对象 | 实测值 | 说明 |
|---|---|---|---|
MARIADB_ROOT_PASSWORD | db | q1w2e3r4 | root 口令 |
MARIADB_DATABASE | db | easywi | 预建库名,安装向导直接可用 |
MARIADB_USER | db | easywi | 面板连接账号 |
MARIADB_PASSWORD | db | q1w2e3r4 | 面板连接口令,需与 config.php $pwd 一致 |
--character-set-server | db command | utf8mb4 | 服务端字符集 |
--collation-server | db command | utf8mb4_unicode_ci | 排序规则 |
⚠️ 注意:以上口令为文档演示值(按规范直接落值)。生产环境请替换为强口令,并同步修改安装向导填入值与
stuff/config.php。
七、配置参数说明
安装向导生成的 stuff/config.php 全文(实测 cat):
<?php
// This file was generated by the easy-wi.com installer
$host = 'db';
$user = 'easywi';
$db = 'easywi';
$pwd = 'q1w2e3r4';
$captcha = '';
$title = 'Easy-Wi';
$debug = '0';
$timezone = 'Europe/Berlin';
$coloreddashboard = false;
$easywitweets = true;
$examplemodule = true;
逐项含义:
| 键 | 实测值 | 含义 |
|---|---|---|
$host/$user/$db/$pwd | db/easywi/easywi/q1w2e3r4 | PDO 连接串,对应 compose 环境变量 |
$captcha | ''(空) | 空即关闭登录验证码;非空填入 reCAPTCHA 私钥则启用 |
$title | Easy-Wi | 站点标题 |
$debug | 0 | 调试开关,生产保持 0 |
$timezone | Europe/Berlin | PHP 时区(上游默认德国) |
$coloreddashboard | false | 首页彩色卡片样式 |
$easywitweets | true | 是否拉取官方动态 |
$examplemodule | true | 是否加载示例模块 |
数据库侧 settings 表为单行宽表(非键值对),安装后实测关键列值:version=6.2.2、language=en、template=default、templateColor=blue、brandname=quzuo.net、paneldomain=http://localhost:8138/、faillogins=5、cronjob_ips 为空、lastCronWarn* 全为 Y。逐列详解见《EasyWI 6.2.2 配置参数详解》篇。
八、配置文件挂载
Web 端 PHP 运行参数通过 deploy/web/easywi.ini 挂载进镜像(Dockerfile 末行 COPY),全文(实测):
date.timezone = Europe/Berlin
memory_limit = 256M
max_execution_time = 300
upload_max_filesize = 64M
post_max_size = 64M
| 参数 | 值 | 为什么这样设 |
|---|---|---|
date.timezone | Europe/Berlin | 与面板 $timezone 一致,避免 PHP 时区告警 |
memory_limit | 256M | 面板批量查询服务器状态时默认 128M 偏紧 |
max_execution_time | 300 | 开服/备份等长操作防超时中断 |
upload_max_filesize / post_max_size | 64M | 上传服务器配置/备份文件的余量 |
如需改参数而不重建镜像,可把该文件改为 volume 挂载:在 compose 的 web.volumes 追加 - ./web/easywi.ini:/usr/local/etc/php/conf.d/easywi.ini:ro 后 docker compose up -d web。
九、等价 docker run 命令
以下由 compose 文件逐字段翻译而来(等价形式说明,本栈全程以 compose 管理,未单独用 run 复测):
# 数据库
docker run -d --name easywi-6.2.2-db --network easywi-net \
-e MARIADB_ROOT_PASSWORD=q1w2e3r4 -e MARIADB_DATABASE=easywi \
-e MARIADB_USER=easywi -e MARIADB_PASSWORD=q1w2e3r4 \
-v easywi-db-data:/var/lib/mysql \
mariadb:10.11 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
# Web 面板
docker run -d --name easywi-6.2.2-web --network easywi-net \
-p 8138:80 -v $(pwd)/../developer-6.2.2:/var/www/html \
easywi-622-stack-web
十、常用运维命令
docker compose ps # 状态与健康(回显见 4.4)
docker compose logs -f web # 跟踪面板日志
docker compose restart web # 重启面板
docker compose down # 停止并移除容器/网络(保留卷)
docker exec -it easywi-6.2.2-db mariadb -ueasywi -pq1w2e3r4 easywi # 进数据库
docker exec easywi-6.2.2-web php -v # 验证 PHP
php -v 实测回显:
PHP 7.4.33 (cli) (built: Nov 15 2022 06:03:30) ( NTS )
Copyright (c) The PHP Group
Apache 日志位于 Web 端 /var/log/apache2/{access,error}.log。四个 cron 脚本(statuscheck/jobs/startupdates/cloud)的部署与实测回显见《EasyWI 6.2.2 常用 CLI 命令与工具详解》篇。
十一、常见问题
11.1 安装向导页顶部刷 Notice/Warning
实测安装向导各步骤页面顶部打印:
Notice : Undefined index: HTTP_ACCEPT_LANGUAGE in /var/www/html/install/install.php on line 65
Warning : simplexml_load_file(): /var/www/html/install/languages/en.xml:107: parser error : Opening and ending tag mismatch: system_check_ok_folder_2 line 82 and sprache in /var/www/html/install/install.php on line 69
定位:install.php:65 直接读 $_SERVER['HTTP_ACCEPT_LANGUAGE'],客户端未带该头时报 Notice;install/languages/en.xml 第 107 行标签闭合错误导致 SimpleXML 解析告警。结论:不阻塞安装主流程(本栈在此噪音下完成全部步骤并成功登录),可忽略继续;若追求干净输出,可给请求显式设置 Accept-Language 头,或修复语言包 XML 后重试。
11.2 打开 login.php 提示 Please remove the "install" folder
安装完成后 install/ 目录未删,login.php/api.php 的守卫直接 die。解决:删除源码目录中的 install/(见 4.6),无需改任何配置。
11.3 登录页没有验证码输入框
stuff/config.php 中 $captcha = '' 即关闭验证码(实测登录表单只有 username、password 两个字段)。需要启用时填入 reCAPTCHA 私钥,模板 login.tpl 会渲染出 pattern="^[\w]{4}$" 的验证码输入。
11.4 web 端启动即退出 / 连不上数据库
depends_on 只保证先后不保证就绪,本栈用 condition: service_healthy + MariaDB healthcheck.sh --connect --innodb_initialized 兜底。若仍失败,docker compose logs db 确认卷是否残留了旧口令数据(换口令需 docker compose down -v 清卷重建)。
十二、参考链接
- 源码包下载地址:https://github.com/easy-wi/developer/archive/refs/tags/v6.2.2.tar.gz
- 主程序仓库:https://github.com/easy-wi/developer
- 官方安装脚本仓库:https://github.com/easy-wi/installer
- MariaDB 官方镜像:https://hub.docker.com/_/mariadb
- PHP 官方镜像:https://hub.docker.com/_/php
- 同专栏:《EasyWI 介绍与选型指南》、《EasyWI 6.2.2 配置参数详解》《EasyWI 6.2.2 常用 CLI 命令与工具详解》