环境

系统 Ubuntu 24.04 noble
docker 28.3.3 linux/amd64
已安装:https-portal:1、mysql:8.0、redis:8.4.0-bookworm
缺少:php-fpm:7.0、nginx/apache
源码一份、数据库备份一份

部署过程

咨询 deepseek,给出建议:安装 php:7.0.33-apache。里面包含了 php-fpmapache

计划访问通路:https-portal 给 SSL 域名证书,并将服务转发到 aidrive(项目所在容器名),php:7.0.33-apache 默认监听容器 80 端口。其他的 mysql 和 redis 在项目 .env 中修改 host 为对应的容器名。

最终的目录结构 /root/aidrive_project/

# apache 配置目录
apache
# 备份的数据库
aidrive.sql
# docker compose 配置文件
docker-compose.yml
# 环境变量,主要声明一下项目名 COMPOSE_PROJECT_NAME=aidrive
.env
# laravel 项目源代码
src

最终的配置文件: docker-compose.yml

services:
  aidrive:
    image: php:7.0.33-apache
    container_name: aidrive
    restart: unless-stopped
    volumes:
      - ./src:/var/www/html
      - ./apache/000-default.conf:/etc/apache2/sites-available/000-default.conf
    networks:
      - internal
      - shared
    command: bash -c "docker-php-ext-install pdo_mysql mbstring && a2enmod rewrite && apache2-foreground"
networks:
  internal:
    driver: bridge
  shared:
    external: true
    name: shared-services

以下为过程中遇到的问题,做一下记录。

添加了 apache host 配置之后,访问 502

/root/aidrive_project/apache/000-default.conf

<VirtualHost *:80>
    ServerAdmin webmaster@localhost
    DocumentRoot /var/www/html/public # 项目根目录

    <Directory /var/www/html/public>
        Options Indexes FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

直接创建文件复制进来的,可能是中文或者空格什么影响了配置文件的格式。

去掉 apache 配置文件中的中文注释,502 变 500

给权限

docker exec -it aidrive ls -ld /var/www/html/storage /var/www/html/bootstrap/cache

500 变成 /login 404

public/.htaccess 添加静态重写

<IfModule mod_rewrite.c>
    <IfModule mod_negotiation.c>
        Options -MultiViews -Indexes
    </IfModule>

    RewriteEngine On

    # Handle Authorization Header
    RewriteCond %{HTTP:Authorization} .
    RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

    # Redirect Trailing Slashes If Not A Folder...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_URI} (.+)/$
    RewriteRule ^ %1 [L,R=301]

    # Send Requests To Front Controller...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [L]
</IfModule>

ok,解决。

数据库备份还原

docker cp aidrive.sql typecho-mysql:/

root 用户登录并创建新账号

docker exec -it mysql mysql -uroot -p
# 登录后,创建用户并授权
CREATE USER 'typecho'@'%' IDENTIFIED WITH mysql_native_password BY 'password';
GRANT ALL PRIVILEGES ON aidrive.* TO 'typecho'@'%';
FLUSH PRIVILEGES;

因为 typecho 已存在,所以不需要创建用户,直接创建数据库:

CREATE DATABASE IF NOT EXISTS `aidrive` 
  CHARACTER SET utf8mb4 
  COLLATE utf8mb4_general_ci;

授权并刷新权限

GRANT ALL PRIVILEGES ON `aidrive`.* TO 'typecho'@'%';

# GRANT ALL PRIVILEGES ON `aidrive`.* TO 'typecho'@'localhost';
FLUSH PRIVILEGES;

授权如果是使用 localhost 会报错,因为 typecho 用户 host 定义为 %

GRANT ALL PRIVILEGES ON `aidrive`.* TO 'typecho'@'localhost';
ERROR 1410 (42000): You are not allowed to create a user with GRANT

还原数据库,之前一般是在容器内 mysql -uroot -p aidrive > aidrive.sql 这种形式。
现在有了新的操作方法(登录 mysql 服务后):

USE `aidrive`;
SOURCE /aidrive.sql;
EXIT;

手动重新创建上传文件映射

laravel 5.3 以上可以使用指令生成,5.2 需要手动创建软链,以便后台上传的文件资源前台可以访问到。

/root/aidrive_project/src/public
rm -f storage
ln -s ../storage/app/public storage

登录还是不行

SQLSTATE[HY000] [2054] The server requested authentication method unknown to the client

确认并强制修改 typecho 用户的认证插件

docker exec -it typecho-mysql mysql -uroot -p
# 查看当前用户认证方式
SELECT user, host, plugin FROM mysql.user WHERE user = 'typecho';
# 新版本的caching_sha2_password,要改成mysql_native_password
ALTER USER 'typecho'@'%' IDENTIFIED WITH mysql_native_password BY 'password';
FLUSH PRIVILEGES;

测试数据库连接

docker exec -it aidrive php -r "new PDO('mysql:host=mysql;dbname=aidrive', 'typecho', 'password');"

报错:

Fatal error: Uncaught PDOException: PDO::__construct(): The server requested authentication method unknown to the client [caching_sha2_password] in Command line code:1
Stack trace:
#0 Command line code(1): PDO->__construct('mysql:host=type...', 'typecho', 'password')
#1 {main}

Next PDOException: SQLSTATE[HY000] [2054] The server requested authentication method unknown to the client in Command line code:1
Stack trace:
#0 Command line code(1): PDO->__construct('mysql:host=type...', 'typecho', 'password')
#1 {main}
  thrown in Command line code on line 1

在修改了认证插件之后,需要重启一下容器 docker-compose restart aidrive

登录还是报这个错,尝试其他办法。

修改 docker-compose.yml,为 MySQL 服务添加启动参数

 mysql:
  image: mysql:8.0
  container_name: typecho-mysql
  command: --default-authentication-plugin=mysql_native_password

重启 MySQL 容器(删除重新创建)

docker compose up -d
[+] Running 2/2
 ✔ Container typecho-mysql  Started                                                                                                                                                                  1.5s 
 ✔ Container typecho-app    Running 

测试 PDO 连接

 docker exec -it aidrive php -r "new PDO('mysql:host=typecho-mysql;dbname=aidrive', 'typecho', 'password');"

无输出,OK!再次登录,OK!

新增两个字段

ALTER TABLE `aidrive`.`box_alert_log` 
ADD COLUMN `checked` tinyint(1) UNSIGNED NOT NULL DEFAULT 0 COMMENT '是否处理 1=已处理 0=未处理' AFTER `video`;

ALTER TABLE `aidrive`.`boxes` 
ADD COLUMN `name` varchar(255) NOT NULL DEFAULT '' COMMENT '设备名' AFTER `id`;
文章目录