本教程整合了多次部署实践中的所有问题和解决方案,旨在提供一个从零开始、稳定可靠的部署流程,特别解决了原版教程中常见的数据库权限、文件写入以及管理员密码设置失败等核心问题。
第一步:准备工作 (环境与前置配置)
一台 ARM 架构的 VPS:确保系统纯净,推荐 Ubuntu 20.04+ 或 Debian 10+。
安装 Docker 和 Docker Compose:
Bash
# 更新系统并安装 Docker 环境 curl -fsSL https://get.docker.com -o get-docker.sh sudo sh get-docker.sh # 安装 Docker Compose sudo apt-get update sudo apt-get install -y docker-compose # 启动 Docker 并设置为开机自启 sudo systemctl start docker sudo systemctl enable docker准备域名并解析:
准备一个域名,例如
shop.yourdomain.com。到您的域名服务商后台,添加一条 A 记录,将该域名解析到您 VPS 的公网 IP 地址。
开放防火墙端口: 确保您的 VPS 防火墙允许
80(HTTP) 和443(HTTPS) 端口的入站流量。Bash
# 以 ufw 防火墙为例 sudo ufw allow 80/tcp sudo ufw allow 443/tcp sudo ufw reload
第二步:下载源码并创建核心配置文件
下载源码:
Bash
# 我们将项目放在 /root 目录下 cd /root git clone https://github.com/assimon/dujiaoka.git cd dujiaoka创建四个核心文件: 在
dujiaoka目录下,忽略项目自带的文件,手动创建或覆盖以下四个文件。1.
Dockerfile(已修复 Debian 源问题)Dockerfile
# 使用官方的、支持 ARM 架构的 PHP-FPM 镜像作为基础 FROM php:7.4-fpm-buster # 设置工作目录 WORKDIR /var/www/html # --- [核心修复] --- # 由于 Debian "Buster" 已过期,其软件源已失效。 # 我们需要将软件源地址修改为 Debian 的存档服务器地址。 RUN sed -i -e 's/deb.debian.org/archive.debian.org/g' \ -e 's|security.debian.org/debian-security|archive.debian.org/debian-security|g' \ -e '/buster-updates/d' /etc/apt/sources.list # --- [核心修复结束] --- # 更新包列表并安装编译 PHP 扩展所需的系统依赖 RUN apt-get update && apt-get install -y \ git \ curl \ libpng-dev \ libonig-dev \ libxml2-dev \ zip \ unzip \ libzip-dev # 安装 Dujiaoka 所需的 PHP 扩展 RUN docker-php-ext-install pdo_mysql mbstring exif pcntl bcmath gd zip # 安装 Redis 扩展 RUN pecl install -o -f redis \ && rm -rf /tmp/pear \ && docker-php-ext-enable redis # 安装 Composer (PHP 依赖管理器) RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer # 更改目录所有者为 www-data,以便 Caddy 和 PHP-FPM 进程可以读写 RUN chown -R www-data:www-data /var/www/html2.
docker-compose.yml(已修复数据库权限问题)YAML
services: # PHP 应用服务 app: build: context: . dockerfile: Dockerfile container_name: dujiaoka_app restart: always volumes: - .:/var/www/html networks: - dujiaoka_network # Caddy 网页服务 caddy: image: caddy:2-alpine container_name: dujiaoka_caddy restart: always ports: - "80:80" - "443:443" volumes: - .:/var/www/html - ./Caddyfile:/etc/caddy/Caddyfile - caddy_data:/data - caddy_config:/config depends_on: - app networks: - dujiaoka_network # 数据库服务 db: image: mariadb:10.8 container_name: dujiaoka_db restart: always user: root # <--- [核心修复] 此行解决了安装时数据库“只读”或权限不足的问题! environment: MYSQL_ROOT_PASSWORD: "your_strong_root_password" # 请修改为一个复杂的数据库root密码 MYSQL_DATABASE: "dujiaoka" MYSQL_USER: "dujiaoka" MYSQL_PASSWORD: "123Abc$" # 这里是你为dujiaoka程序设定的数据库密码,可以修改 volumes: - ./mysql-data:/var/lib/mysql networks: - dujiaoka_network # Redis 服务 redis: image: redis:6.2 container_name: dujiaoka_redis restart: always networks: - dujiaoka_network networks: dujiaoka_network: volumes: caddy_data: caddy_config:3.
Caddyfile代码段
# 把 shop.yourdomain.com 替换成你自己的域名 shop.yourdomain.com { root * /var/www/html/public php_fastcgi app:9000 file_server }4.
.env(已包含关键修正)代码段
APP_NAME=你的商店名称 APP_ENV=local APP_KEY= APP_DEBUG=false APP_URL=https://shop.yourdomain.com # 替换成你自己的域名(https开头) LOG_CHANNEL=stack # 数据库配置 (必须与 docker-compose.yml 中保持一致) DB_CONNECTION=mysql DB_HOST=db DB_PORT=3306 DB_DATABASE=dujiaoka DB_USERNAME=dujiaoka DB_PASSWORD=123Abc$ # 必须与 docker-compose.yml 中 MYSQL_PASSWORD 的值一致 # redis配置 REDIS_HOST=redis REDIS_PASSWORD= REDIS_PORT=6379 BROADCAST_DRIVER=log SESSION_DRIVER=file SESSION_LIFETIME=120 CACHE_DRIVER=redis QUEUE_CONNECTION=redis DUJIAO_ADMIN_LANGUAGE=zh_CN ADMIN_ROUTE_PREFIX=/admin # [!!! 核心修正 !!!] # 如果您使用域名并通过 https 访问,下面这个值必须为 true! # 这是导致登录时出现 "0 error" 的关键原因之一。 ADMIN_HTTPS=true
第三步:构建容器并初始化应用
构建并启动所有容器:
Bash
docker-compose up -d --build【核心】修复文件写入权限: 在进行Web安装之前,我们必须先修复文件权限,防止安装过程和后续登录时出现问题。
Bash
# 确保日志目录存在 mkdir -p storage/logs # 将整个项目文件夹的所有权交给容器内的 www-data 用户(ID:33) sudo chown -R 33:33 . # 赋予 storage 和 bootstrap/cache 目录最高的读写权限 sudo chmod -R 777 storage bootstrap/cache运行程序初始化命令:
Bash
# 安装PHP依赖 docker-compose exec app composer install --no-dev -o # 生成应用密钥 docker-compose exec app php artisan key:generate --force # 运行数据库迁移 docker-compose exec app php artisan migrate --force # 清理配置缓存,确保新的 .env 配置生效 docker-compose exec app php artisan config:clear
第四步:Web 界面安装
打开浏览器,访问您的域名 (例如
https://shop.yourdomain.com)。您将看到安装向导。由于我们已经提前解决了所有权限问题,您只需按照提示,填写您想设置的管理员账号和密码,即可顺利完成安装。
安装成功后,为安全起见,请重命名或删除
install文件夹:Bash
mv public/install public/install_bak
第五步:【重要】解决首次登录密码错误的问题
独角数卡的安装程序有时无法正确保存您在Web界面设置的初始管理员密码。如果您使用设置的密码无法登录,请按照以下步骤手动重置。
进入应用后台命令行 (Tinker):
Bash
docker-compose exec app php artisan tinker依次执行以下命令来重置密码:
PHP
// 第一步:找到 admin 用户。注意这里的模型路径是我们最终确认的正确路径。 $user = Dcat\Admin\Models\Administrator::where('username', 'admin')->first(); // 第二步:设置您的新密码。把 'YourNewPassword123' 换成您想要的真实密码。 $user->password = bcrypt('YourNewPassword123'); // 第三步:保存更改。看到 true 即代表成功。 $user->save(); // 第四步:退出。 exit重新登录:现在,回到网站后台登录页面,使用用户名
admin和您刚刚设置的新密码,即可成功登录。
第六步:常见问题与维护
如何查看日志?
查看程序日志:
docker-compose logs -f app查看网页服务器日志:
docker-compose logs -f caddy
如何停止/启动?
停止:
docker-compose down启动:
docker-compose up -d
如果安装彻底失败,如何从头再来? 如果遇到无法解决的问题,可以彻底清除数据,然后从本教程第二步重新开始。
Bash
# 停止并删除所有容器、网络 docker-compose down # 删除所有数据库数据 sudo rm -rf ./mysql-data # 删除Caddy证书数据 sudo rm -rf ./caddy_data ./caddy_config
至此,您已完成独角数卡的所有部署和修正工作,可以开始正常使用了。