Compare commits
6
Commits
9341d27b92
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
dd663914a1 | ||
|
|
0cc56e5509 | ||
|
|
e9364d2d79 | ||
|
|
bc40ef3ff8 | ||
|
|
2c4446c93f | ||
|
|
45283e4e1e |
@@ -6,6 +6,9 @@ FROM ${COMPOSER_IMAGE} AS composer
|
||||
FROM ${PHP_BASE_IMAGE}
|
||||
|
||||
RUN set -eux; \
|
||||
# bullseye 已 EOL(2026-08),security 包在镜像站/archive 间迁移暂不可用:构建期去掉 security 源,
|
||||
# 仅用 main/updates(阿里云池完好)。中期应将基础镜像升级到受支持的 Debian/PHP 版本
|
||||
sed -i '/debian-security/d; s|deb.debian.org|mirrors.aliyun.com|g' /etc/apt/sources.list; \
|
||||
apt-get update && apt-get install -y --no-install-recommends \
|
||||
libfreetype6-dev \
|
||||
libjpeg62-turbo-dev \
|
||||
|
||||
@@ -42,9 +42,10 @@ echo " MySQL is ready!"
|
||||
echo "==> Importing database schema..."
|
||||
# 仅在空库(无任何业务表)时导入初始化 SQL,避免容器重启/线上更新代码时重置数据库。
|
||||
# 如需重置数据:docker compose down -v 清掉数据卷后重新启动即可触发导入。
|
||||
TABLE_COUNT=$(mysql -h "${DB_HOSTNAME:-mysql}" -u "${DB_USERNAME:-root}" -p"${DB_PASSWORD:-root}" -N -e "SELECT COUNT(*) FROM information_schema.tables WHERE table_schema='${DB_DATABASE:-crmeb_chat}';" 2>/dev/null || echo 0)
|
||||
if [ "${TABLE_COUNT:-0}" != "0" ]; then
|
||||
echo " Database already initialized (found ${TABLE_COUNT} tables), skipping import to protect existing data."
|
||||
# 以 eb_system_admin(后台账号表,初始化 SQL 中较靠后)作为初始化完成的哨兵:部分导入的库不会被误判为已初始化
|
||||
TABLE_SENTINEL=$(mysql -h "${DB_HOSTNAME:-mysql}" -u "${DB_USERNAME:-root}" -p"${DB_PASSWORD:-root}" -N -e "SELECT COUNT(*) FROM information_schema.tables WHERE table_schema='${DB_DATABASE:-crmeb_chat}' AND table_name='eb_system_admin';" 2>/dev/null || echo 0)
|
||||
if [ "${TABLE_SENTINEL:-0}" != "0" ]; then
|
||||
echo " Database already initialized (sentinel table found), skipping import to protect existing data."
|
||||
else
|
||||
echo " Empty database detected, importing crmeb_clean.sql..."
|
||||
mysql -h "${DB_HOSTNAME:-mysql}" -u "${DB_USERNAME:-root}" -p"${DB_PASSWORD:-root}" --default-character-set=utf8mb4 "${DB_DATABASE:-crmeb_chat}" < /var/www/html/public/install/crmeb_clean.sql 2>/dev/null && \
|
||||
|
||||
@@ -6,6 +6,9 @@ server {
|
||||
|
||||
charset utf-8;
|
||||
|
||||
# 容器内监听 80、对外映射 18091:绝对重定向会丢外部端口,改发相对 Location
|
||||
absolute_redirect off;
|
||||
|
||||
access_log /var/log/nginx/access.log;
|
||||
error_log /var/log/nginx/error.log;
|
||||
|
||||
|
||||
@@ -25,8 +25,66 @@ cp .env.docker .env
|
||||
docker compose up -d
|
||||
```
|
||||
|
||||
## 主服务器部署与更新(8.133.254.174)
|
||||
|
||||
生产环境部署在主服务器阿里云,IP 直连 18091 端口(无域名、无证书,勿再使用已废弃的 kefu.wildcs2.com)。
|
||||
|
||||
### 服务器访问
|
||||
|
||||
```bash
|
||||
ssh -i "C:/data/密钥/祝总阿里云.pem" root@8.133.254.174
|
||||
```
|
||||
|
||||
- 部署目录:`/www/projects/crmchat`(gitea clone,master 分支)
|
||||
- 访问地址:`http://8.133.254.174:18091`(阿里云安全组已放行 18091/TCP)
|
||||
- 代码推送:`git push origin master`(偶发认证失败,重试一次即可)
|
||||
|
||||
### 更新部署标准流程(顺序不可颠倒)
|
||||
|
||||
```bash
|
||||
# 本地:提交并推送
|
||||
git push origin master
|
||||
|
||||
# 服务器:拉取 → 重建 php 镜像 → 重建容器 → 重启 nginx → 健康检查
|
||||
cd /www/projects/crmchat
|
||||
git pull
|
||||
docker compose build php
|
||||
docker compose up -d php
|
||||
docker restart crmchat-nginx
|
||||
curl -s -o /dev/null -w "%{http_code}\n" http://localhost:18091/chat/index # 预期 200
|
||||
```
|
||||
|
||||
每一步都有原因,跳过或换序会出事故:
|
||||
|
||||
| 步骤 | 为什么 |
|
||||
|------|--------|
|
||||
| `docker compose build php` 必须在任何重启之前 | 旧镜像的 entrypoint 没有空库守卫,**对旧镜像容器执行 restart 会无条件重导初始化 SQL,清空整个数据库**(2026-09-25 已踩:清掉了用户会话数据)。新镜像的 entrypoint 检测到库已初始化(`eb_system_admin` 哨兵表存在)会跳过导入 |
|
||||
| `up -d php` 而非 `restart php` | 新 entrypoint 在新镜像里,restart 不换镜像;up -d 重建容器才会用新镜像 |
|
||||
| `docker restart crmchat-nginx` 收尾 | ① php 容器重建后 IP 变化,nginx 缓存旧 IP → 502;② `nginx.conf` 是单文件 bind mount,git pull 替换文件后容器仍指向旧 inode,`nginx -s reload` 读到的还是旧配置,必须 restart 容器重新挂载 |
|
||||
|
||||
### 已固化的构建/配置修改(勿回退)
|
||||
|
||||
- `docker/php/Dockerfile`:apt 源切阿里云镜像。原因:`php:7.4-cli` 基于 Debian bullseye,LTS 已于 2026-08-31 结束,deb.debian.org 从 ECS 访问超时、各镜像站陆续清理 bullseye 包(404);security 源在镜像站/archive 迁移空窗期同样 404,暂去掉(基础镜像本身是 2022 快照,无实际回退;中期应升级基础镜像到受支持的 Debian/PHP 版本)
|
||||
- `nginx/nginx.conf`:`absolute_redirect off`。原因:容器内 nginx 监听 80、对外映射 18091,nginx 发绝对 Location 重定向时用的是容器内端口(80),外部端口 18091 会丢失
|
||||
- `entrypoint.sh`:空库守卫 + `eb_system_admin` 哨兵表检查(见上)
|
||||
|
||||
### 忘记密码重置方法
|
||||
|
||||
```bash
|
||||
# 在服务器上执行(以 admin 为例,kefu 同理换表名字段)
|
||||
cd /www/projects/crmchat
|
||||
MYSQLPASS=$(grep '^MYSQL_ROOT_PASSWORD=' .env | cut -d= -f2)
|
||||
NEWPASS=$(openssl rand -hex 8); echo "新密码: $NEWPASS"
|
||||
HASH=$(docker exec crmchat-php php -r "echo password_hash(\$argv[1], PASSWORD_DEFAULT);" "$NEWPASS")
|
||||
docker exec crmchat-mysql mysql -uroot -p"$MYSQLPASS" crmeb_chat \
|
||||
-e "UPDATE eb_system_admin SET pwd='$HASH' WHERE account='admin';"
|
||||
# kefu 坐席:UPDATE eb_chat_service SET password='$HASH' WHERE account='kefu';
|
||||
```
|
||||
|
||||
## 访问地址
|
||||
|
||||
> 本地开发默认 admin123 / kefu123;**主服务器(8.133.254.174:18091)的 admin / kefu 密码已于 2026-09-25 重置为随机值**(不再使用默认密码),重置方法见「主服务器部署与更新」。
|
||||
|
||||
| 入口 | 地址 | 账号 | 密码 |
|
||||
|------|------|------|------|
|
||||
| 后台管理 | `http://localhost:18091/admin` | admin | admin123 |
|
||||
|
||||
Reference in New Issue
Block a user