欢迎光临
我们一直在努力

一键部署 acg-faka 发卡系统

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

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


脚本帮你做了什么

  • 环境检查:校验 root、识别发行版与架构、检查磁盘;内存不足 4GB 且没有 swap 时,自动加 2GB swap(否则构建 PHP 扩展容易被 OOM 杀掉)
  • 装 Docker:依次探测五个软件源(腾讯云内网 / 腾讯云公网 / 阿里云 / 中科大 / 官方),要求 gpg 和 dists/<codename>/Release 都能取到才采用;装完自动配 Docker Hub 加速并限制容器日志大小
  • 拉源码:先花 15 秒探测 GitHub,通就 git clone(保留 .git,日后能 git pull);不通就依次尝试 5 个国内加速代理下载 tarball
  • 生成配置:写 .env;非 amd64 架构自动把 MySQL 换成 mariadb:10.6(MySQL 5.7 没有 arm64 官方镜像)
  • 构建加速补丁:给上游 Dockerfile 注入「apt 强制 IPv4 + 国内 Debian 源」和「Composer 国内源」,已打过则跳过
  • 构建并启动:docker compose up -d –build,失败自动重试一次;随后修正密钥文件权限
  • 等待健康检查:轮询容器健康状态(最多 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.com、codeload.github.com、ghproxy.net 也都通,而 github.moeyy.xyz、ghproxy.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 600(root: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 扩展) 36 分钟 gd / zip / bcmath / opcache / pdo_mysql + pecl redis,2 核满载
    构建第 3 层(composer 装依赖) 12 分钟 走国内 Composer 镜像
    起容器 + MySQL 初始化 3060 秒

    所以:首次约 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_data、acg_mysql、acg_redis、acg_secrets。换机器或重装前记得把前两个备份出来。

    合规提示

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


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

    赞(0)
    未经允许不得转载:171主机测评 » 一键部署 acg-faka 发卡系统
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址