项目地址:https://github.com/shubaocai/sbc-acgfaka | MIT License

一条命令,在一台干净的 Linux 服务器上把 acg-faka(异次元店铺系统) 跑起来。脚本会自动装 Docker、拉上游源码、构建应用镜像(nginx + PHP-FPM)、拉起 MySQL 与 Redis、顺手修掉一个会让安装向导失败的权限坑,最后打印安装向导地址和运维命令。

适合这样的场景:不想手动配 LNMP 和伪静态;服务器在国内,download.docker.com 与 GitHub 都时通时不通;希望装完就能进向导,而不是先花两小时排网络问题。


脚本帮你做了什么

  1. 环境检查:校验 root、识别发行版与架构、检查磁盘;内存不足 4GB 且没有 swap 时,自动加 2GB swap(否则构建 PHP 扩展容易被 OOM 杀掉)
  2. 装 Docker:依次探测五个软件源(腾讯云内网 / 腾讯云公网 / 阿里云 / 中科大 / 官方),要求 gpgdists/<codename>/Release 都能取到才采用;装完自动配 Docker Hub 加速并限制容器日志大小
  3. 拉源码:先花 15 秒探测 GitHub,通就 git clone(保留 .git,日后能 git pull);不通就依次尝试 5 个国内加速代理下载 tarball
  4. 生成配置:写 .env;非 amd64 架构自动把 MySQL 换成 mariadb:10.6(MySQL 5.7 没有 arm64 官方镜像)
  5. 构建加速补丁:给上游 Dockerfile 注入「apt 强制 IPv4 + 国内 Debian 源」和「Composer 国内源」,已打过则跳过
  6. 构建并启动docker compose up -d --build,失败自动重试一次;随后修正密钥文件权限
  7. 等待健康检查:轮询容器健康状态(最多 4 分钟),再请求一次首页,打印访问地址与数据卷

环境要求

项目 要求
系统 Linux(需 systemd),Ubuntu / Debian 已实测
权限 root(或 sudo
内存 建议 ≥ 2GB;低于 4GB 且无 swap 时脚本自动补 2GB
磁盘 建议 ≥ 5GB 可用(镜像与构建缓存约 3~4GB)
端口 8080(可改)需空闲,并在云厂商安全组放行

实测环境:Ubuntu 22.04.5 LTS,x86_64,2 vCPU / 2GB 内存。从零开始到站点可访问约 9~12 分钟,其中一半以上时间花在容器内编译 PHP 扩展。

快速开始

第一步:下载并执行

curl -fsSL -o /tmp/acgfaka.sh https://raw.githubusercontent.com/shubaocai/sbc-acgfaka/main/install_acgfaka.sh && sudo bash /tmp/acgfaka.sh

raw.githubusercontent.com 在国内时通时不通,可以换 jsDelivr:

curl -fsSL -o /tmp/acgfaka.sh https://cdn.jsdelivr.net/gh/shubaocai/sbc-acgfaka@main/install_acgfaka.sh && sudo bash /tmp/acgfaka.sh

也可以 clone 下来跑:

git clone https://github.com/shubaocai/sbc-acgfaka.git
cd sbc-acgfaka
sudo bash install_acgfaka.sh

第二步:走安装向导

浏览器打开 http://<服务器IP>:8080/,三步走完:

步骤 要做什么
1. 环境检测 页面自动检测,全绿直接下一步
2. 数据库 什么都不用改,密码框留空,直接点「下一步」
3. 管理员 填邮箱、昵称、登录密码,完成安装

数据库密码在首次启动时随机生成、写进 Docker 卷 acg_secrets,向导直接读取,既不用你想密码,密码也不经过浏览器。

第三步:进后台

http://<服务器IP>:8080/admin

会跳到 /admin/authentication/login,用刚才填的邮箱和密码登录(带验证码)。

打不开基本都是云厂商安全组没放行 8080,去控制台加入站规则即可。

踩坑记录

脚本里那些看起来"啰嗦"的分支,每一条都是被真实网络环境教出来的。下面 5 个坑按踩到的顺序记一遍。

坑 1:download.docker.com 被 TLS reset

装 Docker 第一步是取官方 GPG 公钥,结果连着三次都是:

curl: (35) OpenSSL SSL_connect: Connection reset by peer in connection to download.docker.com:443

同一时刻,五个国内镜像(腾讯云内网、腾讯云公网、阿里云、中科大、清华)全部返回 200。所以脚本改成按顺序探测,而且不只是取 GPG,还要求能拿到对应发行版代号(jammy / bookworm)的 Release 文件才算可用——避免手滑选到一个没有该发行版目录的源:

for m in $DOCKER_MIRRORS; do
  if curl -fsSL --connect-timeout 8 -m 30 --retry 2 "$m/gpg" -o /tmp/docker.gpg \
     && curl -fsS -m 20 -o /dev/null "$m/dists/$CODENAME/Release"; then
    MIRROR_BASE=$m; break
  fi
done

实测命中第一个源(腾讯云内网)就装好了 Docker,整个过程不到 40 秒。想手动指定:DOCKER_APT_MIRROR=https://mirrors.aliyun.com/docker-ce/linux/ubuntu

坑 2:容器里没有 IPv6,apt-get update 卡了 8 分半

第一次构建镜像时,卡在 Dockerfile 的第一层 apt 上:8 分 39 秒没有任何输出,负载 0.00。看起来像死机,其实是:

主机解析 deb.debian.org  → 2a04:4e42:8c::644   (IPv6 地址)
容器里 ip -6 addr        → 只有 ::1            (没有 IPv6 出口)

容器默认只有 IPv4,而 Debian 官方源同时有 AAAA 记录,apt 会去连 IPv6 地址然后一直等超时。跑到宿主上测 deb.debian.org 只要 1.5 秒,谁也想不到问题出在协议栈上。

修法是构建时注入两行(只在构建阶段生效):

printf 'Acquire::ForceIPv4 "true";\n' > /etc/apt/apt.conf.d/99force-ipv4
sed -i 's|deb.debian.org|mirrors.cloud.tencent.com|g; s|security.debian.org|mirrors.cloud.tencent.com|g' \
  /etc/apt/sources.list /etc/apt/sources.list.d/*.sources

加完之后,同一层 apt 只花了约 2 分钟

坑 3:GitHub 时通时断,git clone 还会无限挂住

有一轮 git clone 连续失败两次,第三次切到 gitclone.com 之后挂了 8 分钟:进程在 select() 上干等,没有任何超时。原因是 git 默认没有"停滞多久就放弃"的设定。

现在的做法是三层保险:

export GIT_TERMINAL_PROMPT=0
export GIT_HTTP_LOW_SPEED_LIMIT=1000 GIT_HTTP_LOW_SPEED_TIME=30   # 低速 30 秒自动断开

timeout 15 git ls-remote "$REPO_URL" HEAD >/dev/null 2>&1          # 先探 15 秒
# 通了 → git clone;不通 → 依次尝试 5 个加速代理下载 tarball

顺带实测了一下各条线路(同一个时刻):ghfast.top 的 tarball 13.8MB / 3.8 秒最快,gh-proxy.comcodeload.github.comghproxy.net 也都通,而 github.moeyy.xyzghproxy.cc 已经挂了。这类代理寿命都不长,所以脚本按列表顺序试,全试完才报错。

坑 4:向导报 Access denied for user 'acg'@'172.18.0.4' (using password: NO)

安装向导第 2 步"数据库"填好点下一步,红色报错,注意最后那句 using password: NO——它是在用空密码连库。

翻源码看逻辑:

$file = $get('ACG_DB_PASSWORD_FILE');        // /secrets/mysql_app
if ($file !== '' && is_readable($file)) {    // ← 这一句在 php-fpm 里是 false
    $password = trim(file_get_contents($file));
}
if ($password === '') { $password = $get('ACG_DB_PASSWORD'); }

生成密码的 secrets-init.sh 写死了 chmod 600root:root),而 php-fpm 是以 www-data 跑的,于是 is_readable() 为 false,ACG_DB_PASSWORD 环境变量也是空,最后拿空密码去连。验证方式很简单:

docker exec -u www-data acg-faka-app php -r \
  '$f=getenv("ACG_DB_PASSWORD_FILE"); var_dump(is_readable($f));'
# 修复前:bool(false)     修复后:bool(true)

脚本第 6 步会自动按 compose 标签找到 acg_secrets 卷并把两个密钥文件改成 644(卷只读挂给 app 和 mysql 两个容器,有 docker 权限的人本来就能读它,放宽没有实际损失)。权限修好后,用向导自己的接口测一次就能看到它已经越过数据库这一步:

curl -s -X POST -d 'use_builtin=1' http://127.0.0.1:8080/install/submit
# {"code":0,"msg":"管理员邮箱格式不正确"}   ← 报的是下一步的校验,说明连库已通过

坑 5:向导停在「导入语言包」不动

这次不是网络问题,是前端被自己的保护机制误导。上游 submit() 的顺序是:

SQL::import(...);                                  // 导数据库
setConfig(... database.php);                       // 写配置
file_put_contents('/kernel/Install/Lock', "");     // ① 先写安装锁
try { $this->importLanguagePacks(); } catch(...){} // ② 再导语言包(失败不报错)
return $this->json(200, '安装完成');

submit() 第一行就是"装过就拒绝":

if (file_exists(BASE_PATH.'/kernel/Install/Lock')) {
    throw new JSONException("您已经安装过了…");
}

第一次请求其实已经干完了活(数据库 30 张表、语言包 en/ja/zh-tw 各 4153 条共 12459 条都在),页面进度条还在等,浏览器又发了一次请求,拿到的是「您已经安装过了」,前端不认识这个返回,就永远停在「导入语言包」。

处理方式:关掉向导页,直接访问 /admin 登录即可。想重跑向导就删掉安装锁:

cd /opt/acg-faka
docker compose exec app rm -f /data/install/Lock

时间都花在哪了

阶段 耗时 说明
装 Docker ~40 秒 走国内镜像源
拉源码 ~15 秒 GitHub 直连(探测通过)
拉基础镜像 ~40 秒 php:8.2-fpm / mysql:5.7 / redis:7.2-alpine
构建第 1 层(apt:nginx、supervisor、certbot、mariadb、redis) ~2 分钟 加了 ForceIPv4 之后;之前卡 8 分半
构建第 2 层(编译 PHP 扩展) ~3~6 分钟 gd / zip / bcmath / opcache / pdo_mysql + pecl redis,2 核满载
构建第 3 层(composer 装依赖) ~1~2 分钟 走国内 Composer 镜像
起容器 + MySQL 初始化 ~30~60 秒

所以:首次约 9~12 分钟;镜像和构建缓存还在时重跑脚本大约 1 分钟(所有层命中缓存,只剩打 tag + 起容器 + 健康检查)。想彻底重来用 docker compose down -v,但注意这条命令会连数据卷一起删。

常用环境变量

变量 说明 默认
ACG_PORT 对外端口 8080
ACG_DIR 安装目录 /opt/acg-faka
SKIP_DOCKER_INSTALL 已装 Docker 时跳过安装 0
USE_MARIADB mariadb:10.6 替代 mysql:5.7 非 amd64 自动为 1
REGISTRY_MIRROR Docker Hub 加速地址,留空不配置 腾讯云
DOCKER_APT_MIRROR 指定 Docker 软件源 自动探测五源
CN_DEBIAN_MIRROR / COMPOSER_MIRROR 构建时使用的 Debian / Composer 源 腾讯云
ACG_TARBALL_URLS 源码下载源(按顺序尝试) 5 个国内加速代理

换端口的写法:

sudo ACG_PORT=9090 bash install_acgfaka.sh

sudo 传环境变量记得加 -E,否则变量会被 sudo 丢掉。

日常运维

cd /opt/acg-faka

docker compose ps                 # 查看状态
docker compose logs -f app        # 实时看日志
docker compose restart app        # 重启应用
docker compose down               # 停止(数据卷保留)
docker compose up -d --build      # 更新代码后重建

# 数据库备份
docker compose exec -T mysql sh -c \
  'exec mysqldump -uroot -p"$(cat /secrets/mysql_root)" --databases acg_faka' > acg-$(date +%F).sql

# 站点数据卷备份(配置、上传、插件、模板、安装锁)
docker run --rm -v acg_data:/data -v "$PWD:/backup" alpine \
  tar czf /backup/acg-data-$(date +%F).tar.gz -C /data .

数据不在安装目录里,全在四个命名卷:acg_dataacg_mysqlacg_redisacg_secrets。换机器或重装前记得把前两个备份出来。

合规提示

acg-faka 是 MIT 协议的开源项目,作者在仓库 README 中明确声明:本程序初衷是提供学习和研究机会,未取得合法资质,严禁用于任何商业用途,尤其是禁止利用本程序搭建平台进行商品销售。 部署与使用前请自行确认合规性。

参考文档


MIT License © 2026 鼠宝财 | 项目地址:https://github.com/shubaocai/sbc-acgfaka