5.1 KiB
5.1 KiB
🚢 Deployment Runbook
PHP Hyperf + Swoole + Vue 3 部署流程指南
环境
| 环境 | URL | 触发 |
|---|---|---|
| Development | localhost:8200 (前端) / localhost:9501 (后端) |
本地开发 |
| Staging | staging.example.com |
merge to develop |
| Production | www.example.com |
merge to main |
Docker Compose 模板
version: '3.8'
services:
# Nginx — 负载均衡 + 静态资源 + SSL
nginx:
image: nginx:1.25-alpine
container_name: app_nginx
ports:
- "80:80"
- "443:443"
volumes:
- ./docker/nginx/nginx.conf:/etc/nginx/nginx.conf
- ./docker/nginx/conf.d:/etc/nginx/conf.d
- ./Case-Database-Frontend-user/dist:/usr/share/nginx/html/user
- ./Case-Database-Frontend-admin/dist:/usr/share/nginx/html/admin
- ./docker/nginx/ssl:/etc/nginx/ssl
depends_on:
- hyperf
networks:
- app_network
restart: unless-stopped
# Hyperf — PHP 8.1 + Swoole (HTTP + WebSocket)
hyperf:
build:
context: ./Case-Database-Backend
dockerfile: Dockerfile
container_name: app_backend
ports:
- "9501:9501" # HTTP API
- "9502:9502" # WebSocket
volumes:
- ./Case-Database-Backend:/opt/www
environment:
- APP_ENV=${APP_ENV:-production}
- DB_HOST=mysql
- DB_PORT=3306
- DB_DATABASE=${DB_DATABASE}
- DB_USERNAME=${DB_USERNAME}
- DB_PASSWORD=${DB_PASSWORD}
- REDIS_HOST=redis
- REDIS_PORT=6379
- REDIS_AUTH=${REDIS_AUTH}
depends_on:
mysql:
condition: service_healthy
redis:
condition: service_healthy
networks:
- app_network
restart: unless-stopped
# MySQL 8.1 — 主数据库
mysql:
image: mysql:8.1
container_name: app_mysql
ports:
- "${DB_PORT:-3307}:3306"
environment:
MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASSWORD}
MYSQL_DATABASE: ${DB_DATABASE}
MYSQL_USER: ${DB_USERNAME}
MYSQL_PASSWORD: ${DB_PASSWORD}
volumes:
- mysql_data:/var/lib/mysql
- ./docker/mysql/conf.d:/etc/mysql/conf.d
- ./docker/mysql/init:/docker-entrypoint-initdb.d
command: >
--default-authentication-plugin=caching_sha2_password
--character-set-server=utf8mb4
--collation-server=utf8mb4_unicode_ci
--max-connections=500
--innodb-buffer-pool-size=1G
--slow-query-log=ON
--long-query-time=1
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
interval: 10s
timeout: 5s
retries: 5
networks:
- app_network
restart: unless-stopped
# Redis 7 — 缓存 + 队列 + Session
redis:
image: redis:7.2-alpine
container_name: app_redis
ports:
- "${REDIS_PORT:-6379}:6379"
command: redis-server --requirepass ${REDIS_AUTH} --maxmemory 512mb --maxmemory-policy allkeys-lru
volumes:
- redis_data:/data
healthcheck:
test: ["CMD", "redis-cli", "-a", "${REDIS_AUTH}", "ping"]
interval: 10s
timeout: 5s
retries: 5
networks:
- app_network
restart: unless-stopped
volumes:
mysql_data:
driver: local
redis_data:
driver: local
networks:
app_network:
driver: bridge
Backend Dockerfile
FROM hyperf/hyperf:8.1-alpine-v3.18-swoole
LABEL maintainer="Enterprise Digital Platform"
ENV TIMEZONE=Asia/Shanghai
ENV APP_ENV=production
WORKDIR /opt/www
COPY composer.json composer.lock ./
RUN composer install --no-dev --optimize-autoloader --no-scripts
COPY . .
RUN composer dump-autoload -o
EXPOSE 9501 9502
ENTRYPOINT ["php", "/opt/www/bin/hyperf.php", "start"]
部署检查清单
部署前
- 所有后端测试通过 (
composer test) - 所有前端测试通过 (
npm test) - 代码审查已批准
- 数据库迁移已准备 (
php bin/hyperf.php migrate:status) - 环境变量已配置 (
.env) - Redis 连接正常
- 静态分析通过 (
composer analyse)
部署步骤
# 1. 拉取最新代码
git pull origin main
# 2. 后端依赖更新
cd Case-Database-Backend && composer install --no-dev -o
# 3. 数据库迁移
php bin/hyperf.php migrate
# 4. 前端构建
cd Case-Database-Frontend-user && npm ci && npm run build
cd ../Case-Database-Frontend-admin && npm ci && npm run build
# 5. 重启服务
docker-compose restart hyperf
docker-compose restart nginx
# 6. 验证
curl -s https://your-domain.com/admin/health | jq
部署后
- 健康检查通过
- 监控无异常 (CPU/内存/连接数)
- 数据库迁移成功
- WebSocket 连接正常
- 队列消费进程运行中
回滚
# 代码回滚
git revert HEAD
git push origin main
# 数据库回滚
php bin/hyperf.php migrate:rollback --step=1
# Docker 容器回滚到上一个镜像
docker-compose pull hyperf
docker-compose up -d hyperf
扩展到多实例
# 水平扩展 Hyperf 实例
docker-compose up -d --scale hyperf=3
# Nginx upstream 配置多后端
upstream hyperf_cluster {
server hyperf_1:9501;
server hyperf_2:9501;
server hyperf_3:9501;
}
最后更新: YYYY-MM-DD