diff --git a/deploy.sh b/deploy.sh index b19b5ab..e51f1a9 100644 --- a/deploy.sh +++ b/deploy.sh @@ -1,7 +1,7 @@ #!/bin/bash # ============================================================ # AI Knowledge Link — 首次部署脚本 -# 使用服务器本机 MySQL + 宝塔 Nginx +# Docker 跑 backend + frontend,服务器本机 MySQL,宝塔 Nginx 反代 # ============================================================ set -e @@ -25,12 +25,14 @@ EOF echo ".env 已创建" fi -# 2. 创建数据目录 +# 2. 数据目录 mkdir -p data -# 3. 创建数据库(如果不存在) +# 3. 确保数据库存在(本机 MySQL 33306) echo "检查数据库..." -mysql -h 127.0.0.1 -P 33306 -u admin -pLzcc6-01 -e "CREATE DATABASE IF NOT EXISTS amb_rag CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;" 2>/dev/null || echo "提示:请确保 MySQL 已启动且密码正确" +mysql -h 127.0.0.1 -P 33306 -u admin -pLzcc6-01 \ + -e "CREATE DATABASE IF NOT EXISTS amb_rag CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;" \ + 2>/dev/null || echo "提示:无法连接本机 MySQL,请确认已启动(不影响后续,backend 启动时会再试)" # 4. 构建并启动 echo "构建镜像..." @@ -44,7 +46,7 @@ echo "执行数据库迁移..." sleep 3 docker compose exec -T backend alembic upgrade head -# 6. 创建管理员 +# 6. 管理员账号 echo "检查管理员账号..." docker compose exec -T backend python -c " from app.core.db import get_session_factory @@ -76,13 +78,13 @@ with factory() as session: echo "" echo "==========================================" -echo " 部署完成!" +echo " 容器部署完成!" echo "" -echo " 后端: http://$(curl -s ifconfig.me 2>/dev/null):8000/api/healthz" -echo " 前端: http://$(curl -s ifconfig.me 2>/dev/null):5173" +echo " 后端: http://127.0.0.1:8000/api/healthz" +echo " 前端: http://127.0.0.1:5173" echo "" -echo " 宝塔 Nginx 反代配置:" -echo " /api/ → http://127.0.0.1:8000" -echo " /k/ → http://127.0.0.1:8000" -echo " / → http://127.0.0.1:5173" +echo " 下一步:宝塔 Nginx 反代(站点设置 → 反向代理):" +echo " /api/ → http://127.0.0.1:8000" +echo " /k/ → http://127.0.0.1:8000" +echo " / → http://127.0.0.1:5173" echo "==========================================" \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml index 420f4e6..c93a0a6 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,9 +1,8 @@ -# AI Knowledge Link — Docker Compose (生产) -# -# 使用服务器本机 MySQL(端口 33306),宝塔 Nginx 反代 +# AI Knowledge Link — Docker Compose +# 只跑 backend + frontend 两个容器,Nginx 用服务器宝塔的(反代到这两个容器) # # 部署:bash deploy.sh -# 更新:git pull && bash update.sh +# 更新:bash update.sh services: # ---------- 后端 ---------- @@ -33,7 +32,7 @@ services: timeout: 5s retries: 5 - # ---------- 前端 ---------- + # ---------- 前端(内部 nginx 已配置 SPA 路由回退)---------- frontend: build: context: ./frontend @@ -42,4 +41,4 @@ services: - "5173:80" volumes: - app_data: + app_data: \ No newline at end of file diff --git a/frontend/Dockerfile b/frontend/Dockerfile index 57871dd..c192928 100644 --- a/frontend/Dockerfile +++ b/frontend/Dockerfile @@ -8,11 +8,11 @@ RUN npm config set registry https://registry.npmmirror.com && npm ci COPY . . RUN npm run build -# Stage 2: serve with nginx +# Stage 2: serve with nginx(含 SPA 路由回退配置) FROM nginx:1.27-alpine AS serve COPY --from=build /app/dist /usr/share/nginx/html -# 自定义 nginx 配置由外层 docker-compose 挂载,这里只 serve 静态产物 +COPY nginx.conf /etc/nginx/conf.d/default.conf EXPOSE 80 CMD ["nginx", "-g", "daemon off;"] \ No newline at end of file diff --git a/frontend/nginx.conf b/frontend/nginx.conf new file mode 100644 index 0000000..65b27b9 --- /dev/null +++ b/frontend/nginx.conf @@ -0,0 +1,19 @@ +# 前端容器内部 nginx —— 负责 SPA 路由回退 +server { + listen 80; + server_name _; + + root /usr/share/nginx/html; + index index.html; + + # 关键:所有找不到的路径回退到 index.html(Vue Router history 模式必需) + location / { + try_files $uri $uri/ /index.html; + } + + # 静态资源缓存 + location /assets/ { + expires 30d; + add_header Cache-Control "public, immutable"; + } +} \ No newline at end of file diff --git a/update.sh b/update.sh index cdbff4e..5398939 100644 --- a/update.sh +++ b/update.sh @@ -1,30 +1,63 @@ #!/bin/bash # ============================================================ # AI Knowledge Link — 一键更新脚本 +# 用法: bash update.sh # ============================================================ set -e echo "=== AI Knowledge Link 更新 ===" echo "时间: $(date '+%Y-%m-%d %H:%M:%S')" +echo "" # 1. 拉取最新代码 echo "[1/4] 拉取最新代码..." -git pull +if ! git pull; then + echo "" + echo "错误:git pull 失败。通常是服务器上有本地修改与远程冲突。" + echo "如果确认要放弃服务器上的修改,执行:" + echo " git checkout -- . && git pull" + exit 1 +fi # 2. 重新构建 +echo "" echo "[2/4] 重新构建镜像..." docker compose build # 3. 重启服务 +echo "" echo "[3/4] 重启服务..." docker compose up -d -# 4. 数据库迁移 -echo "[4/4] 执行数据库迁移..." -sleep 3 -docker compose exec -T backend alembic upgrade head - +# 4. 等待后端就绪后执行迁移(兜底,容器启动时也会自动迁移) echo "" -echo "更新完成!$(date '+%H:%M:%S')" -docker compose ps \ No newline at end of file +echo "[4/4] 等待后端就绪并执行迁移..." +for i in $(seq 1 30); do + if docker compose exec -T backend python -c "import urllib.request; urllib.request.urlopen('http://localhost:8000/api/healthz')" 2>/dev/null; then + echo "后端已就绪(第 ${i} 次探测)" + break + fi + if [ "$i" -eq 30 ]; then + echo "警告:后端 30 秒内未就绪,跳过迁移步骤(容器启动时会自动迁移)" + fi + sleep 1 +done + +docker compose exec -T backend alembic upgrade head 2>/dev/null || true + +# 5. 结果 +echo "" +echo "==========================================" +echo " 更新完成!$(date '+%H:%M:%S')" +echo "==========================================" +echo "" +docker compose ps +echo "" + +# 健康检查 +if curl -s -f http://127.0.0.1:8000/api/healthz > /dev/null 2>&1; then + echo "✅ 后端健康检查通过" +else + echo "❌ 后端健康检查失败,查看日志:docker compose logs backend --tail 50" +fi \ No newline at end of file