16 Commits
0.1 ... main

Author SHA1 Message Date
e16101865d fix(runtime): 修复容器内路径别名导致的模块加载失败
All checks were successful
CI / ci (push) Successful in 1m26s
为 Node/PM2 增加 module-alias 运行时解析,并将本地 Prisma 服务别名改为 @db,避免与 @prisma/client 冲突,确保 Docker 启动时可正确加载 dist 模块。

Made-with: Cursor
2026-04-28 06:57:10 +08:00
b5b4167c7c fix(docker): 将 prisma.config.ts 打包进构建与运行镜像
All checks were successful
CI / ci (push) Successful in 1m34s
补齐 Prisma 配置文件复制步骤,确保容器内执行 prisma migrate deploy 时能够读取 datasource 配置并完成迁移。

Made-with: Cursor
2026-04-28 06:30:26 +08:00
5b31a2bfb8 chore(docker): 配置 yarn/npm 镜像与安装超时参数
All checks were successful
CI / ci (push) Successful in 1m25s
在 deps 阶段安装依赖前统一设置 registry.npmmirror.com 与较长网络超时,降低构建环境网络抖动导致的 yarn install 失败概率。

Made-with: Cursor
2026-04-28 06:24:21 +08:00
9383696026 fix(prisma): 移除 schema 中的 datasource.url 配置
All checks were successful
CI / ci (push) Successful in 1m24s
对齐 Prisma 7 配置方式,将连接串来源统一由 prisma.config.ts 提供,避免 yarn install 阶段触发 schema 校验失败。

Made-with: Cursor
2026-04-28 06:18:00 +08:00
5dbdeebe6e fix(docker): 为依赖安装阶段注入 Prisma 构建占位库连接
Some checks failed
CI / ci (push) Failing after 1m5s
在 deps 阶段设置 DATABASE_URL 占位值,确保 yarn install 触发 prisma generate 时不会因缺少 datasource.url 环境变量而失败。

Made-with: Cursor
2026-04-28 06:11:28 +08:00
0d451b8e03 fix(prisma): 补齐 datasource 的 DATABASE_URL 配置
Some checks failed
CI / ci (push) Failing after 1m5s
为 PostgreSQL datasource 显式声明 env("DATABASE_URL"),确保容器启动阶段执行 prisma migrate deploy 时能够正确读取数据库连接串。

Made-with: Cursor
2026-04-28 05:54:43 +08:00
27c1d0d919 fix(deploy): 将健康检查路径调整为 /docs
All checks were successful
CI / ci (push) Successful in 1m22s
对齐当前 Swagger 实际挂载地址,避免部署探活误用 /api/docs 导致健康检查失败。

Made-with: Cursor
2026-04-28 05:45:48 +08:00
d9bbe5bfb8 fix(deploy): 移除 HEALTH_URL 临时变量依赖
All checks were successful
CI / ci (push) Successful in 1m23s
将健康检查改为直接使用内联 URL,避免在严格 shell 模式下因变量时机问题触发未定义错误。

Made-with: Cursor
2026-04-28 05:38:34 +08:00
e6d0969a0e fix(deploy): 固化远程脚本变量展开边界
All checks were successful
CI / ci (push) Successful in 1m22s
将远程部署脚本切换为单引号 heredoc 并显式传入所需环境变量,避免本地 shell 在 set -u 下提前展开导致健康检查变量未定义。

Made-with: Cursor
2026-04-28 05:33:38 +08:00
020d219d3d fix(deploy): 修复远程健康检查变量展开时机
All checks were successful
CI / ci (push) Successful in 1m24s
为 ssh heredoc 中的循环与变量引用补充转义,避免在本地 set -u 环境下提前展开导致 HEALTH_URL/HEALTH_OK 未定义报错。

Made-with: Cursor
2026-04-28 05:25:50 +08:00
7f42afe42b fix(deploy): 健康检查增加重试与失败日志输出
All checks were successful
CI / ci (push) Successful in 1m22s
部署后健康检查改为带重试等待,避免容器冷启动阶段的短暂连接重置导致发布误判失败;若最终失败则输出 app 日志便于排障。

Made-with: Cursor
2026-04-28 05:19:06 +08:00
ae02099dbd fix(deploy): 发布前同步 docker-compose 编排文件
All checks were successful
CI / ci (push) Successful in 1m27s
在远程部署阶段先创建 deploy/docker 目录并上传 docker-compose.yml,避免服务器缺少编排文件导致 compose 命令找不到配置。

Made-with: Cursor
2026-04-28 05:07:33 +08:00
4476f03955 fix(docker): 依赖安装阶段补充 prisma 目录
All checks were successful
CI / ci (push) Successful in 1m23s
在 Docker deps 阶段执行 yarn install 前复制 prisma 目录,避免 postinstall 的 prisma generate 因缺少 schema 文件导致构建失败。

Made-with: Cursor
2026-04-28 03:07:45 +08:00
abda86256c fix(deploy): runner 缺失 docker 时自动安装 CLI
All checks were successful
CI / ci (push) Successful in 1m22s
在 deploy 流程执行镜像构建前增加 docker 命令检测,缺失时自动安装 docker.io,避免 runner 环境差异导致 command not found 失败。

Made-with: Cursor
2026-04-28 03:01:11 +08:00
667832a585 chore(deploy): 将 DEPLOY_DOCKER_ENV 切换为 secrets
Some checks failed
CI / ci (push) Has been cancelled
部署流程写入运行时 .env 时改用 secrets.DEPLOY_DOCKER_ENV,降低敏感配置在变量与日志中的暴露风险。

Made-with: Cursor
2026-04-28 02:56:21 +08:00
c87db87f81 chore(deploy): 支持从 vars 读取镜像仓库凭据
All checks were successful
CI / ci (push) Successful in 1m22s
在 deploy 流程中增加 REGISTRY_USERNAME 与 REGISTRY_PASSWORD 的 vars 注入,兼容当前 Gitea 环境未提供 secrets 配置入口的场景。

Made-with: Cursor
2026-04-28 02:53:36 +08:00
9 changed files with 52 additions and 9 deletions

View File

@@ -24,6 +24,13 @@ jobs:
DEPLOY_PATH="${{ vars.DEPLOY_PATH }}"
IMAGE_REPO="${{ vars.IMAGE_REPO }}"
REGISTRY="${{ vars.REGISTRY }}"
REGISTRY_USERNAME="${{ vars.REGISTRY_USERNAME }}"
REGISTRY_PASSWORD="${{ vars.REGISTRY_PASSWORD }}"
if ! command -v docker >/dev/null 2>&1; then
apt-get update
apt-get install -y docker.io
fi
mkdir -p ~/.ssh
echo "${SSH_PRIVATE_KEY}" > ~/.ssh/id_rsa
@@ -45,13 +52,15 @@ jobs:
docker build -f deploy/docker/Dockerfile -t "${IMAGE_REPO}:${IMAGE_TAG}" .
docker push "${IMAGE_REPO}:${IMAGE_TAG}"
ssh -p "${DEPLOY_PORT:-22}" "${DEPLOY_USER}@${DEPLOY_HOST}" <<EOF
ssh -p "${DEPLOY_PORT:-22}" "${DEPLOY_USER}@${DEPLOY_HOST}" "mkdir -p \"${DEPLOY_PATH}/deploy/docker\""
scp -P "${DEPLOY_PORT:-22}" deploy/docker/docker-compose.yml "${DEPLOY_USER}@${DEPLOY_HOST}:${DEPLOY_PATH}/deploy/docker/docker-compose.yml"
ssh -p "${DEPLOY_PORT:-22}" "${DEPLOY_USER}@${DEPLOY_HOST}" "DEPLOY_PATH='${DEPLOY_PATH}' IMAGE_REPO='${IMAGE_REPO}' IMAGE_TAG='${IMAGE_TAG}' REGISTRY='${REGISTRY}' REGISTRY_USERNAME='${REGISTRY_USERNAME}' REGISTRY_PASSWORD='${REGISTRY_PASSWORD}' bash -se" <<'EOF'
set -euo pipefail
cd "${DEPLOY_PATH}"
mkdir -p deploy/docker
cat > deploy/docker/.env <<EOT
${{ vars.DEPLOY_DOCKER_ENV }}
${{ secrets.DEPLOY_DOCKER_ENV }}
IMAGE_REPO=${IMAGE_REPO}
IMAGE_TAG=${IMAGE_TAG}
EOT
@@ -60,5 +69,17 @@ jobs:
docker compose -f deploy/docker/docker-compose.yml --env-file deploy/docker/.env pull app
docker compose -f deploy/docker/docker-compose.yml --env-file deploy/docker/.env up -d app
docker compose -f deploy/docker/docker-compose.yml ps
curl -fsS "http://127.0.0.1:\${HOST_BIND_PORT:-3000}/api/docs" >/dev/null
HEALTH_OK=0
for i in $(seq 1 30); do
if curl -fsS "http://127.0.0.1:${HOST_BIND_PORT:-3000}/docs" >/dev/null; then
HEALTH_OK=1
break
fi
sleep 2
done
if [ "${HEALTH_OK}" -ne 1 ]; then
docker compose -f deploy/docker/docker-compose.yml --env-file deploy/docker/.env logs --tail=200 app || true
echo "Health check failed: http://127.0.0.1:${HOST_BIND_PORT:-3000}/docs"
exit 1
fi
EOF

View File

@@ -5,6 +5,12 @@ RUN npm i -g pm2
FROM base AS deps
COPY package.json yarn.lock ./
COPY prisma.config.ts ./
COPY prisma ./prisma
ENV DATABASE_URL="postgresql://postgres:postgres@127.0.0.1:5432/postgres?schema=public"
RUN yarn config set registry https://registry.npmmirror.com \
&& npm config set registry https://registry.npmmirror.com \
&& yarn config set network-timeout 600000 -g
RUN yarn install --frozen-lockfile
FROM deps AS build
@@ -21,6 +27,7 @@ COPY --from=deps /app/node_modules ./node_modules
COPY --from=build /app/dist ./dist
COPY --from=build /app/prisma ./prisma
COPY package.json yarn.lock ./
COPY prisma.config.ts ./
COPY deploy/docker/app.entrypoint.sh ./app.entrypoint.sh
COPY deploy/docker/ecosystem.config.cjs ./ecosystem.config.cjs

View File

@@ -4,6 +4,7 @@ module.exports = {
{
name: process.env.APP_NAME,
script: 'dist/main.js',
node_args: '-r module-alias/register',
cwd: '/app',
instances: 1,
exec_mode: 'fork',

View File

@@ -3,6 +3,7 @@ module.exports = {
{
name: 'chat-one-service',
script: 'dist/main.js',
node_args: '-r module-alias/register',
cwd: '/srv/chat-one-service/current',
instances: 1,
exec_mode: 'fork',

View File

@@ -9,9 +9,9 @@
"private": true,
"scripts": {
"build": "tsc -p tsconfig.json",
"start": "node dist/main.js",
"start": "node -r module-alias/register dist/main.js",
"start:dev": "tsx watch src/main.ts",
"start:debug": "node --inspect=0.0.0.0:9229 dist/main.js",
"start:debug": "node --inspect=0.0.0.0:9229 -r module-alias/register dist/main.js",
"lint": "eslint \"src/**/*.ts\"",
"postinstall": "prisma generate"
},
@@ -34,6 +34,7 @@
"dotenv": "^17.4.2",
"helmet": "^8.1.0",
"ioredis": "^5.10.1",
"module-alias": "^2.3.4",
"nestjs-pino": "^4.6.1",
"passport": "^0.7.0",
"passport-jwt": "^4.0.1",
@@ -55,5 +56,12 @@
"tsx": "^4.21.0",
"typescript": "^6.0.2",
"typescript-eslint": "^8.59.0"
},
"_moduleAliases": {
"@common": "dist/common",
"@config": "dist/config",
"@apps": "dist/apps",
"@shared": "dist/apps/shared-domain",
"@db": "dist/prisma"
}
}

View File

@@ -9,7 +9,7 @@ import { JwtService } from '@nestjs/jwt';
import { randomUUID } from 'crypto';
import { SmsService } from '@shared/sms/sms.service';
import { RedisService } from '@shared/cache/redis.service';
import { PrismaService } from '@prisma/prisma.service';
import { PrismaService } from '@db/prisma.service';
interface AccessPayload {
sub: string;

View File

@@ -5,7 +5,7 @@ import {
Injectable,
NotFoundException,
} from '@nestjs/common';
import { PrismaService } from '@prisma/prisma.service';
import { PrismaService } from '@db/prisma.service';
import {
ChatMessage,
ProviderUsage,

View File

@@ -23,7 +23,7 @@
"@config/*": ["./src/config/*"],
"@apps/*": ["./src/apps/*"],
"@shared/*": ["./src/apps/shared-domain/*"],
"@prisma/*": ["./src/prisma/*"]
"@db/*": ["./src/prisma/*"]
},
},
"include": ["src/**/*", "prisma/**/*"],

View File

@@ -1861,6 +1861,11 @@ minipass@^7.1.2, minipass@^7.1.3:
resolved "https://registry.npmmirror.com/minipass/-/minipass-7.1.3.tgz#79389b4eb1bb2d003a9bba87d492f2bd37bdc65b"
integrity sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==
module-alias@^2.3.4:
version "2.3.4"
resolved "https://registry.npmmirror.com/module-alias/-/module-alias-2.3.4.tgz#7c2b0442ba1114744e97288963db637859db4094"
integrity sha512-bOclZt8hkpuGgSSoG07PKmvzTizROilUTvLNyrMqvlC9snhs7y7GzjNWAVbISIOlhCP1T14rH1PDAV9iNyBq/w==
ms@^2.1.1, ms@^2.1.3:
version "2.1.3"
resolved "https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2"