Files
hack/tools/scripts/llm-key-hunter/results/_cache/content/aaaaqwq_tcm-meridian-inference.json
OpenCode 68a9071cf1 feat: reconcile local master with origin (exa/hot-platform hunters, leaks ledger, latest results)
Local branch had diverged from origin/master (sibling commits on the same base). Rewrote local history linearly on top of origin/master, folding in all local content: exa/hot-platform discovery hunters, leaks ledger, nightly sweep orchestrator, updated .gitignore and skill docs, plus the latest hunt output and vault state. Remote-only files (vault keys, channel scripts) were restored rather than dropped, so the resulting tree is a full union of both sides.
2026-08-07 12:53:47 +08:00

1 line
62 KiB
JSON
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{"repo": "aaaaqwq/tcm-meridian-inference", "files": {".github/workflows/README.md": {"f942d05c457d319e21ea7d8d5e196d324604c3ae": {"t": 1785747016.9821799, "n": 3485, "h": "af63778c06b8a4a9", "c": "# GitHub Actions CI/CD 配置指南\n\n## 工作流程\n\n```\n代码推送 ──┬── GitHub Actions ── Build 镜像 ── Push to GHCR\n └── SSH 到服务器 ── Pull 镜像 ── Run 容器\n```\n\n服务器**无需构建镜像**,只需拉取运行。\n\n---\n\n## 配置步骤\n\n### 1. 添加 Secrets\n\nGitHub 仓库 → Settings → Secrets and variables → Actions → New repository secret\n\n**必填 Secrets:**\n\n| Secret 名称 | 说明 | 示例 |\n|------------|------|------|\n| `SSH_HOST` | 服务器 IP | `8.163.126.86` |\n| `SSH_USER` | SSH 用户名 | `root` |\n| `SSH_PASSWORD` | SSH 密码 | `your-password` |\n| `DEEPSEEK_API_KEY` | DeepSeek API Key | `sk-xxxxxxxx` |\n\n**可选 Secrets:**\n\n| Secret 名称 | 说明 | 默认值 |\n|------------|------|--------|\n| `TCM_INFER_MODE` | 推理模式 | `auto` |\n| `TCM_LOG_LEVEL` | 日志级别 | `INFO` |\n| `DEEPSEEK_MODEL` | 模型名称 | `deepseek-v4-flash` |\n\n### 2. 启用 GitHub Container Registry\n\n1. GitHub 仓库 → Settings → Packages\n2. 确保 \"Inherit access from source repository\" 已启用\n\n### 3. 服务器准备(仅需一次)\n\n```bash\n# 1. 登录服务器\nssh root@8.163.126.86\n\n# 2. 检查 Docker\ndocker --version\n\n# 3. 开放防火墙端口\nfirewall-cmd --permanent --add-port=18790/tcp\nfirewall-cmd --reload\n\n# 4. 创建目录(可选,用于存放 .env 文件)\nmkdir -p ~/tcm-api && cd ~/tcm-api\n```\n\n### 4. 推送代码触发部署\n\n```bash\ngit add .\ngit commit -m \"你的修改\"\ngit push origin main\n```\n\nGitHub Actions 会自动:\n1. 构建 Docker 镜像\n2. 推送到 GHCR (`ghcr.io/用户名/仓库名:latest`)\n3. SSH 到服务器\n4. 拉取镜像并启动容器\n\n### 5. 验证部署\n\n```bash\n# 服务器上查看容器\ndocker ps\n\n# 健康检查\ncurl http://localhost:18790/health\n\n# 查看日志\ndocker logs -f tcm-api\n```\n\n---\n\n## 手动触发\n\nGitHub → Actions → Build and Deploy → Run workflow\n\n---\n\n## 服务器手动部署(备选)\n\n如果 GitHub Actions 失败,可手动部署:\n\n### 方法 1: 使用脚本\n\n```bash\n# 1. 登录服务器\nssh root@8.163.126.86\n\n# 2. 下载部署脚本\ncd ~ && curl -O https://raw.githubusercontent.com/AAAaqwq/tcm-meridian-inference/main/deploy/server-deploy.sh\nchmod +x server-deploy.sh\n\n# 3. 运行部署(需要 GitHub Token)\n./server-deploy.sh YOUR_GITHUB_USERNAME YOUR_GITHUB_TOKEN\n```\n\n### 方法 2: 手动执行\n\n```bash\n# 1. 登录 GitHub Container Registry\n# Token: GitHub → Settings → Developer settings → Personal access tokens\ndocker login ghcr.io -u YOUR_GITHUB_USERNAME\n\n# 2. 拉取镜像\ndocker pull ghcr.io/aaaqwq/tcm-meridian-inference:latest\n\n# 3. 运行容器\ndocker run -d \\\n --name tcm-api \\\n --restart unless-stopped \\\n -p 18790:18790 \\\n -e DEEPSEEK_API_KEY=sk-your-api-key \\\n ghcr.io/aaaqwq/tcm-meridian-inference:latest\n\n# 4. 验证\ncurl http://localhost:18790/health\n```\n\n---\n\n## Snap Docker 注意事项\n\n如果服务器使用 Snap 安装的 Docker:\n\n```bash\n# 检查是否为 Snap 版本\nwhich docker\n# 输出: /snap/bin/docker\n\n# Snap Docker 限制:\n# - 默认无法访问 /opt\n# - 沙盒可能导致文件权限问题\n\n# 解决方案:\n# 1. 项目放在用户目录(~)下\n# 2. 或卸载 Snap Docker,安装官方版本:\nsudo snap remove docker\ncurl -fsSL https://get.docker.com | sh\nsudo reboot\n```\n\n---\n\n## 故障排查\n\n### 镜像拉取失败\n\n```bash\n# 在服务器上测试\ndocker pull ghcr.io/aaaqwq/tcm-meridian-inference:latest\n\n# 如果超时,检查网络或 DNS\ncat /etc/resolv.conf\n\n# 使用国内镜像(可选)\n# 修改 /etc/docker/daemon.json\n{\n \"registry-mirrors\": [\"https://docker.mirrors.ustc.edu.cn\"]\n}\n```\n\n### 权限错误\n\n确保 GitHub Token 有 `write:packages` 和 `read:packages` 权限。\n\n### SSH 连接失败\n\n```bash\n# 检查服务器 SSH 配置\ncat /etc/ssh/sshd_config | grep PasswordAuthentication\n\n# 确保允许密码登录(或改用 SSH 密钥)\nPasswordAuthentication yes\n\n# 重启 SSH\nsystemctl restart sshd\n```\n\n### 部署日志查看\n\nGitHub 仓库 → Actions → 选择工作流运行 → 查看日志\n\n---\n\n## 安全建议\n\n1. **使用 SSH 密钥** 代替密码(修改 workflow 中的 `password` 为 `key`)\n2. **定期轮换 GitHub Token**\n3. **限制 Token 权限**(仅 packages 和 contents)\n4. **配置防火墙** 仅开放 18790 端口\n5. **启用 fail2ban** 防止暴力破解\n\n---\n\n## 更新部署\n\n修改代码后推送即自动部署:\n\n```bash\ngit add .\ngit commit -m \"feat: 你的新功能\"\ngit push origin main # 触发自动部署\n```\n\n查看部署进度:GitHub → Actions → Build and Deploy\n"}, "b8d62a86356dbc014b2a57d47005f95aa28117a0": {"t": 1785769855.4010494, "n": 3491, "h": "fcee245a45cc5bf1", "c": "# GitHub Actions CI/CD 配置指南\n\n## 工作流程\n\n```\n代码推送 ──┬── GitHub Actions ── Build 镜像 ── Push to GHCR\n └── SSH 到服务器 ── Pull 镜像 ── Run 容器\n```\n\n服务器**无需构建镜像**,只需拉取运行。\n\n---\n\n## 配置步骤\n\n### 1. 添加 Secrets\n\nGitHub 仓库 → Settings → Secrets and variables → Actions → New repository secret\n\n**必填 Secrets:**\n\n| Secret 名称 | 说明 | 示例 |\n|------------|------|------|\n| `SSH_HOST` | 服务器 IP | `180.76.137.183` |\n| `SSH_USER` | SSH 用户名 | `root` |\n| `SSH_PASSWORD` | SSH 密码 | `your-password` |\n| `DEEPSEEK_API_KEY` | DeepSeek API Key | `sk-xxxxxxxx` |\n\n**可选 Secrets:**\n\n| Secret 名称 | 说明 | 默认值 |\n|------------|------|--------|\n| `TCM_INFER_MODE` | 推理模式 | `auto` |\n| `TCM_LOG_LEVEL` | 日志级别 | `INFO` |\n| `DEEPSEEK_MODEL` | 模型名称 | `deepseek-v4-flash` |\n\n### 2. 启用 GitHub Container Registry\n\n1. GitHub 仓库 → Settings → Packages\n2. 确保 \"Inherit access from source repository\" 已启用\n\n### 3. 服务器准备(仅需一次)\n\n```bash\n# 1. 登录服务器\nssh root@180.76.137.183\n\n# 2. 检查 Docker\ndocker --version\n\n# 3. 开放防火墙端口\nfirewall-cmd --permanent --add-port=18790/tcp\nfirewall-cmd --reload\n\n# 4. 创建目录(可选,用于存放 .env 文件)\nmkdir -p ~/tcm-api && cd ~/tcm-api\n```\n\n### 4. 推送代码触发部署\n\n```bash\ngit add .\ngit commit -m \"你的修改\"\ngit push origin main\n```\n\nGitHub Actions 会自动:\n1. 构建 Docker 镜像\n2. 推送到 GHCR (`ghcr.io/用户名/仓库名:latest`)\n3. SSH 到服务器\n4. 拉取镜像并启动容器\n\n### 5. 验证部署\n\n```bash\n# 服务器上查看容器\ndocker ps\n\n# 健康检查\ncurl http://localhost:18790/health\n\n# 查看日志\ndocker logs -f tcm-api\n```\n\n---\n\n## 手动触发\n\nGitHub → Actions → Build and Deploy → Run workflow\n\n---\n\n## 服务器手动部署(备选)\n\n如果 GitHub Actions 失败,可手动部署:\n\n### 方法 1: 使用脚本\n\n```bash\n# 1. 登录服务器\nssh root@180.76.137.183\n\n# 2. 下载部署脚本\ncd ~ && curl -O https://raw.githubusercontent.com/AAAaqwq/tcm-meridian-inference/main/deploy/server-deploy.sh\nchmod +x server-deploy.sh\n\n# 3. 运行部署(需要 GitHub Token)\n./server-deploy.sh YOUR_GITHUB_USERNAME YOUR_GITHUB_TOKEN\n```\n\n### 方法 2: 手动执行\n\n```bash\n# 1. 登录 GitHub Container Registry\n# Token: GitHub → Settings → Developer settings → Personal access tokens\ndocker login ghcr.io -u YOUR_GITHUB_USERNAME\n\n# 2. 拉取镜像\ndocker pull ghcr.io/aaaqwq/tcm-meridian-inference:latest\n\n# 3. 运行容器\ndocker run -d \\\n --name tcm-api \\\n --restart unless-stopped \\\n -p 18790:18790 \\\n -e DEEPSEEK_API_KEY=sk-your-api-key \\\n ghcr.io/aaaqwq/tcm-meridian-inference:latest\n\n# 4. 验证\ncurl http://localhost:18790/health\n```\n\n---\n\n## Snap Docker 注意事项\n\n如果服务器使用 Snap 安装的 Docker:\n\n```bash\n# 检查是否为 Snap 版本\nwhich docker\n# 输出: /snap/bin/docker\n\n# Snap Docker 限制:\n# - 默认无法访问 /opt\n# - 沙盒可能导致文件权限问题\n\n# 解决方案:\n# 1. 项目放在用户目录(~)下\n# 2. 或卸载 Snap Docker,安装官方版本:\nsudo snap remove docker\ncurl -fsSL https://get.docker.com | sh\nsudo reboot\n```\n\n---\n\n## 故障排查\n\n### 镜像拉取失败\n\n```bash\n# 在服务器上测试\ndocker pull ghcr.io/aaaqwq/tcm-meridian-inference:latest\n\n# 如果超时,检查网络或 DNS\ncat /etc/resolv.conf\n\n# 使用国内镜像(可选)\n# 修改 /etc/docker/daemon.json\n{\n \"registry-mirrors\": [\"https://docker.mirrors.ustc.edu.cn\"]\n}\n```\n\n### 权限错误\n\n确保 GitHub Token 有 `write:packages` 和 `read:packages` 权限。\n\n### SSH 连接失败\n\n```bash\n# 检查服务器 SSH 配置\ncat /etc/ssh/sshd_config | grep PasswordAuthentication\n\n# 确保允许密码登录(或改用 SSH 密钥)\nPasswordAuthentication yes\n\n# 重启 SSH\nsystemctl restart sshd\n```\n\n### 部署日志查看\n\nGitHub 仓库 → Actions → 选择工作流运行 → 查看日志\n\n---\n\n## 安全建议\n\n1. **使用 SSH 密钥** 代替密码(修改 workflow 中的 `password` 为 `key`)\n2. **定期轮换 GitHub Token**\n3. **限制 Token 权限**(仅 packages 和 contents)\n4. **配置防火墙** 仅开放 18790 端口\n5. **启用 fail2ban** 防止暴力破解\n\n---\n\n## 更新部署\n\n修改代码后推送即自动部署:\n\n```bash\ngit add .\ngit commit -m \"feat: 你的新功能\"\ngit push origin main # 触发自动部署\n```\n\n查看部署进度:GitHub → Actions → Build and Deploy\n"}, "afe1fa6125267b7d327e5c7cc3600510d485afbc": {"t": 1785769856.788865, "n": 3487, "h": "e06461ca650135d5", "c": "# GitHub Actions CI/CD 配置指南\n\n## 工作流程\n\n```\n代码推送 ──┬── GitHub Actions ── Build 镜像 ── Push to GHCR\n └── SSH 到服务器 ── Pull 镜像 ── Run 容器\n```\n\n服务器**无需构建镜像**,只需拉取运行。\n\n---\n\n## 配置步骤\n\n### 1. 添加 Secrets\n\nGitHub 仓库 → Settings → Secrets and variables → Actions → New repository secret\n\n**必填 Secrets:**\n\n| Secret 名称 | 说明 | 示例 |\n|------------|------|------|\n| `SSH_HOST` | 服务器 IP | `180.76.137.183` |\n| `SSH_USER` | SSH 用户名 | `root` |\n| `SSH_PASSWORD` | SSH 密码 | `your-password` |\n| `DEEPSEEK_API_KEY` | DeepSeek API Key | `sk-xxxxxxxx` |\n\n**可选 Secrets:**\n\n| Secret 名称 | 说明 | 默认值 |\n|------------|------|--------|\n| `TCM_INFER_MODE` | 推理模式 | `auto` |\n| `TCM_LOG_LEVEL` | 日志级别 | `INFO` |\n| `DEEPSEEK_MODEL` | 模型名称 | `deepseek-chat` |\n\n### 2. 启用 GitHub Container Registry\n\n1. GitHub 仓库 → Settings → Packages\n2. 确保 \"Inherit access from source repository\" 已启用\n\n### 3. 服务器准备(仅需一次)\n\n```bash\n# 1. 登录服务器\nssh root@180.76.137.183\n\n# 2. 检查 Docker\ndocker --version\n\n# 3. 开放防火墙端口\nfirewall-cmd --permanent --add-port=18790/tcp\nfirewall-cmd --reload\n\n# 4. 创建目录(可选,用于存放 .env 文件)\nmkdir -p ~/tcm-api && cd ~/tcm-api\n```\n\n### 4. 推送代码触发部署\n\n```bash\ngit add .\ngit commit -m \"你的修改\"\ngit push origin main\n```\n\nGitHub Actions 会自动:\n1. 构建 Docker 镜像\n2. 推送到 GHCR (`ghcr.io/用户名/仓库名:latest`)\n3. SSH 到服务器\n4. 拉取镜像并启动容器\n\n### 5. 验证部署\n\n```bash\n# 服务器上查看容器\ndocker ps\n\n# 健康检查\ncurl http://localhost:18790/health\n\n# 查看日志\ndocker logs -f tcm-api\n```\n\n---\n\n## 手动触发\n\nGitHub → Actions → Build and Deploy → Run workflow\n\n---\n\n## 服务器手动部署(备选)\n\n如果 GitHub Actions 失败,可手动部署:\n\n### 方法 1: 使用脚本\n\n```bash\n# 1. 登录服务器\nssh root@180.76.137.183\n\n# 2. 下载部署脚本\ncd ~ && curl -O https://raw.githubusercontent.com/AAAaqwq/tcm-meridian-inference/main/deploy/server-deploy.sh\nchmod +x server-deploy.sh\n\n# 3. 运行部署(需要 GitHub Token)\n./server-deploy.sh YOUR_GITHUB_USERNAME YOUR_GITHUB_TOKEN\n```\n\n### 方法 2: 手动执行\n\n```bash\n# 1. 登录 GitHub Container Registry\n# Token: GitHub → Settings → Developer settings → Personal access tokens\ndocker login ghcr.io -u YOUR_GITHUB_USERNAME\n\n# 2. 拉取镜像\ndocker pull ghcr.io/aaaqwq/tcm-meridian-inference:latest\n\n# 3. 运行容器\ndocker run -d \\\n --name tcm-api \\\n --restart unless-stopped \\\n -p 18790:18790 \\\n -e DEEPSEEK_API_KEY=sk-your-api-key \\\n ghcr.io/aaaqwq/tcm-meridian-inference:latest\n\n# 4. 验证\ncurl http://localhost:18790/health\n```\n\n---\n\n## Snap Docker 注意事项\n\n如果服务器使用 Snap 安装的 Docker:\n\n```bash\n# 检查是否为 Snap 版本\nwhich docker\n# 输出: /snap/bin/docker\n\n# Snap Docker 限制:\n# - 默认无法访问 /opt\n# - 沙盒可能导致文件权限问题\n\n# 解决方案:\n# 1. 项目放在用户目录(~)下\n# 2. 或卸载 Snap Docker,安装官方版本:\nsudo snap remove docker\ncurl -fsSL https://get.docker.com | sh\nsudo reboot\n```\n\n---\n\n## 故障排查\n\n### 镜像拉取失败\n\n```bash\n# 在服务器上测试\ndocker pull ghcr.io/aaaqwq/tcm-meridian-inference:latest\n\n# 如果超时,检查网络或 DNS\ncat /etc/resolv.conf\n\n# 使用国内镜像(可选)\n# 修改 /etc/docker/daemon.json\n{\n \"registry-mirrors\": [\"https://docker.mirrors.ustc.edu.cn\"]\n}\n```\n\n### 权限错误\n\n确保 GitHub Token 有 `write:packages` 和 `read:packages` 权限。\n\n### SSH 连接失败\n\n```bash\n# 检查服务器 SSH 配置\ncat /etc/ssh/sshd_config | grep PasswordAuthentication\n\n# 确保允许密码登录(或改用 SSH 密钥)\nPasswordAuthentication yes\n\n# 重启 SSH\nsystemctl restart sshd\n```\n\n### 部署日志查看\n\nGitHub 仓库 → Actions → 选择工作流运行 → 查看日志\n\n---\n\n## 安全建议\n\n1. **使用 SSH 密钥** 代替密码(修改 workflow 中的 `password` 为 `key`)\n2. **定期轮换 GitHub Token**\n3. **限制 Token 权限**(仅 packages 和 contents)\n4. **配置防火墙** 仅开放 18790 端口\n5. **启用 fail2ban** 防止暴力破解\n\n---\n\n## 更新部署\n\n修改代码后推送即自动部署:\n\n```bash\ngit add .\ngit commit -m \"feat: 你的新功能\"\ngit push origin main # 触发自动部署\n```\n\n查看部署进度:GitHub → Actions → Build and Deploy\n"}, "3fc5e40c874adab2642b0a34e59543f2a8c7b387": {"t": 1785769857.970394, "n": 2358, "h": "3b7b2ce2b2cee7a9", "c": "# GitHub Actions CI/CD 配置\n\n## 工作流程\n\n```\n代码推送 ──┬── GitHub Actions ── Build 镜像 ── Push to GHCR\n └── SSH 到百度云 ── Pull 镜像 ── Run 容器\n```\n\n## 配置步骤\n\n### 1. 添加 Secrets\n\nGitHub 仓库 → Settings → Secrets and variables → Actions → New repository secret\n\n必填 Secrets:\n\n| Secret 名称 | 说明 | 示例 |\n|------------|------|------|\n| `SSH_HOST` | 服务器 IP | `180.76.137.183` |\n| `SSH_USER` | SSH 用户名 | `root` |\n| `SSH_PASSWORD` | SSH 密码 | `your-password` |\n| `DEEPSEEK_API_KEY` | DeepSeek API Key | `sk-xxxxxxxx` |\n\n可选 Secrets:\n\n| Secret 名称 | 说明 | 默认值 |\n|------------|------|--------|\n| `TCM_INFER_MODE` | 推理模式 | `auto` |\n| `TCM_LOG_LEVEL` | 日志级别 | `INFO` |\n| `DEEPSEEK_MODEL` | 模型名称 | `deepseek-chat` |\n\n### 2. 启用 GitHub Container Registry\n\n1. GitHub 仓库 → Settings → Packages\n2. 确保 \"Inherit access from source repository\" 已启用\n\n### 3. 推送代码触发部署\n\n```bash\ngit add .\ngit commit -m \"ci: add GitHub Actions workflow\"\ngit push origin main\n```\n\nGitHub Actions 会自动:\n1. 构建 Docker 镜像\n2. 推送到 GHCR (ghcr.io/用户名/仓库名:latest)\n3. SSH 到百度云服务器\n4. 拉取镜像并启动容器\n\n### 4. 手动触发\n\nGitHub → Actions → Build and Deploy → Run workflow\n\n---\n\n## 服务器手动部署(备用)\n\n如果 GitHub Actions 失败,可以手动部署:\n\n```bash\n# 1. 登录服务器\nssh root@180.76.137.183\n\n# 2. 创建目录\ncd ~\nmkdir -p tcm-api && cd tcm-api\n\n# 3. 创建环境变量文件\ncat > .env << EOL\nDEEPSEEK_API_KEY=your-api-key\nTCM_INFER_MODE=auto\nTCM_LOG_LEVEL=INFO\nEOL\n\n# 4. 运行部署脚本\nexport GITHUB_TOKEN=your_github_token\nbash deploy/server-deploy.sh your_github_username $GITHUB_TOKEN\n```\n\n或者直接用 Docker 命令:\n\n```bash\n# 登录 GitHub Container Registry\necho \"your_github_token\" | docker login ghcr.io -u your_github_username --password-stdin\n\n# 拉取并运行\ndocker pull ghcr.io/your_github_username/tcm-meridian-inference-mvp:latest\ndocker run -d \\\n --name tcm-api \\\n --restart unless-stopped \\\n -p 18790:18790 \\\n -e DEEPSEEK_API_KEY=your-api-key \\\n ghcr.io/your_github_username/tcm-meridian-inference-mvp:latest\n```\n\n---\n\n## 故障排查\n\n### 镜像拉取失败\n\n```bash\n# 在服务器上测试\ndocker pull ghcr.io/your_username/tcm-meridian-inference-mvp:latest\n\n# 如果失败,检查网络或尝试代理\ndocker pull --platform linux/amd64 ghcr.io/your_username/tcm-meridian-inference-mvp:latest\n```\n\n### 权限错误\n\n确保 GitHub Token 有 `write:packages` 和 `read:packages` 权限。\n\n### 部署日志查看\n\nGitHub 仓库 → Actions → 选择工作流运行 → 查看日志\n\n---\n\n## 安全建议\n\n1. **使用 SSH 密钥** 代替密码(修改 workflow 中的 `password` 为 `key`)\n2. **定期轮换 GitHub Token**\n3. **限制 Token 权限**(仅 packages 和 contents)\n"}}, ".github/workflows/ALIYUN-README.md": {"f942d05c457d319e21ea7d8d5e196d324604c3ae": {"t": 1785747017.11378, "n": 1720, "h": "500136b15cf878ff", "c": "# 阿里云镜像仓库部署指南\n\n## 为什么使用阿里云?\n\n- ✅ 国内访问速度快\n- ✅ 与百度云服务器网络互通好\n- ✅ 免费额度充足(个人版)\n\n---\n\n## 配置步骤\n\n### 1. 创建阿里云容器镜像服务\n\n1. 登录 [阿里云控制台](https://cr.console.aliyun.com/)\n2. 创建个人版实例(免费)\n3. 创建命名空间:`aaa-tcm`\n4. 创建仓库:`tcm-meridian-inference`\n\n### 2. 获取访问凭证\n\n1. 阿里云控制台 → 容器镜像服务 → 访问凭证\n2. 设置固定密码\n3. 记录:\n - 用户名:你的阿里云账号\n - 密码:刚设置的固定密码\n\n### 3. 添加 GitHub Secrets\n\n| Secret 名称 | 说明 | 示例 |\n|------------|------|------|\n| `ALIYUN_USERNAME` | 阿里云账号 | `aaa_xxx` |\n| `ALIYUN_PASSWORD` | 固定密码 | `your-password` |\n| `SSH_HOST` | 服务器 IP | `8.163.126.86` |\n| `SSH_USER` | SSH 用户名 | `root` |\n| `SSH_PASSWORD` | SSH 密码 | `your-password` |\n| `DEEPSEEK_API_KEY` | DeepSeek API Key | `sk-xxxxxxxx` |\n\n### 4. 推送代码触发部署\n\n```bash\ngit add .\ngit commit -m \"ci: add aliyun deployment\"\ngit push origin main\n```\n\n---\n\n## 手动部署(备用)\n\n如果 GitHub Actions 失败,可手动部署:\n\n```bash\n# 1. 登录服务器\nssh root@8.163.126.86\n\n# 2. 登录阿里云镜像仓库\ndocker login registry.cn-hangzhou.aliyuncs.com -u YOUR_ALIYUN_USERNAME\n\n# 3. 拉取镜像\ndocker pull registry.cn-hangzhou.aliyuncs.com/danielli/tcm-meridian-inference:latest\n\n# 4. 运行容器\ndocker run -d \\\n --name tcm-api \\\n --restart unless-stopped \\\n -p 18790:18790 \\\n -e DEEPSEEK_API_KEY=sk-your-api-key \\\n registry.cn-hangzhou.aliyuncs.com/danielli/tcm-meridian-inference:latest\n\n# 5. 验证\ncurl http://localhost:18790/health\n```\n\n---\n\n## 镜像地址\n\n```\nregistry.cn-hangzhou.aliyuncs.com/danielli/tcm-meridian-inference:latest\n```\n\n---\n\n## 故障排查\n\n### 登录失败\n\n```bash\n# 检查用户名密码\ndocker login registry.cn-hangzhou.aliyuncs.com\n\n# 阿里云访问凭证页面重置密码\n# https://cr.console.aliyun.com/cn-hangzhou/instances/credentials\n```\n\n### 拉取失败\n\n```bash\n# 检查镜像是否存在\n# 阿里云控制台 → 镜像仓库 → 查看\n\n# 手动测试拉取\ndocker pull registry.cn-hangzhou.aliyuncs.com/danielli/tcm-meridian-inference:latest\n```\n"}, "1277c848338646ba5f325a6704772bcd6bd72ff4": {"t": 1785769856.390272, "n": 1724, "h": "8f35055e16d548c8", "c": "# 阿里云镜像仓库部署指南\n\n## 为什么使用阿里云?\n\n- ✅ 国内访问速度快\n- ✅ 与百度云服务器网络互通好\n- ✅ 免费额度充足(个人版)\n\n---\n\n## 配置步骤\n\n### 1. 创建阿里云容器镜像服务\n\n1. 登录 [阿里云控制台](https://cr.console.aliyun.com/)\n2. 创建个人版实例(免费)\n3. 创建命名空间:`aaa-tcm`\n4. 创建仓库:`tcm-meridian-inference`\n\n### 2. 获取访问凭证\n\n1. 阿里云控制台 → 容器镜像服务 → 访问凭证\n2. 设置固定密码\n3. 记录:\n - 用户名:你的阿里云账号\n - 密码:刚设置的固定密码\n\n### 3. 添加 GitHub Secrets\n\n| Secret 名称 | 说明 | 示例 |\n|------------|------|------|\n| `ALIYUN_USERNAME` | 阿里云账号 | `aaa_xxx` |\n| `ALIYUN_PASSWORD` | 固定密码 | `your-password` |\n| `SSH_HOST` | 服务器 IP | `180.76.137.183` |\n| `SSH_USER` | SSH 用户名 | `root` |\n| `SSH_PASSWORD` | SSH 密码 | `your-password` |\n| `DEEPSEEK_API_KEY` | DeepSeek API Key | `sk-xxxxxxxx` |\n\n### 4. 推送代码触发部署\n\n```bash\ngit add .\ngit commit -m \"ci: add aliyun deployment\"\ngit push origin main\n```\n\n---\n\n## 手动部署(备用)\n\n如果 GitHub Actions 失败,可手动部署:\n\n```bash\n# 1. 登录服务器\nssh root@180.76.137.183\n\n# 2. 登录阿里云镜像仓库\ndocker login registry.cn-hangzhou.aliyuncs.com -u YOUR_ALIYUN_USERNAME\n\n# 3. 拉取镜像\ndocker pull registry.cn-hangzhou.aliyuncs.com/danielli/tcm-meridian-inference:latest\n\n# 4. 运行容器\ndocker run -d \\\n --name tcm-api \\\n --restart unless-stopped \\\n -p 18790:18790 \\\n -e DEEPSEEK_API_KEY=sk-your-api-key \\\n registry.cn-hangzhou.aliyuncs.com/danielli/tcm-meridian-inference:latest\n\n# 5. 验证\ncurl http://localhost:18790/health\n```\n\n---\n\n## 镜像地址\n\n```\nregistry.cn-hangzhou.aliyuncs.com/danielli/tcm-meridian-inference:latest\n```\n\n---\n\n## 故障排查\n\n### 登录失败\n\n```bash\n# 检查用户名密码\ndocker login registry.cn-hangzhou.aliyuncs.com\n\n# 阿里云访问凭证页面重置密码\n# https://cr.console.aliyun.com/cn-hangzhou/instances/credentials\n```\n\n### 拉取失败\n\n```bash\n# 检查镜像是否存在\n# 阿里云控制台 → 镜像仓库 → 查看\n\n# 手动测试拉取\ndocker pull registry.cn-hangzhou.aliyuncs.com/danielli/tcm-meridian-inference:latest\n```\n"}, "1bb50ed85b53a2e43b82d03350486830d3d95cb5": {"t": 1785769859.7844284, "n": 1720, "h": "f9d6eb9df91634b1", "c": "# 阿里云镜像仓库部署指南\n\n## 为什么使用阿里云?\n\n- ✅ 国内访问速度快\n- ✅ 与百度云服务器网络互通好\n- ✅ 免费额度充足(个人版)\n\n---\n\n## 配置步骤\n\n### 1. 创建阿里云容器镜像服务\n\n1. 登录 [阿里云控制台](https://cr.console.aliyun.com/)\n2. 创建个人版实例(免费)\n3. 创建命名空间:`aaa-tcm`\n4. 创建仓库:`tcm-meridian-inference`\n\n### 2. 获取访问凭证\n\n1. 阿里云控制台 → 容器镜像服务 → 访问凭证\n2. 设置固定密码\n3. 记录:\n - 用户名:你的阿里云账号\n - 密码:刚设置的固定密码\n\n### 3. 添加 GitHub Secrets\n\n| Secret 名称 | 说明 | 示例 |\n|------------|------|------|\n| `ALIYUN_USERNAME` | 阿里云账号 | `aaa_xxx` |\n| `ALIYUN_PASSWORD` | 固定密码 | `your-password` |\n| `SSH_HOST` | 服务器 IP | `180.76.137.183` |\n| `SSH_USER` | SSH 用户名 | `root` |\n| `SSH_PASSWORD` | SSH 密码 | `your-password` |\n| `DEEPSEEK_API_KEY` | DeepSeek API Key | `sk-xxxxxxxx` |\n\n### 4. 推送代码触发部署\n\n```bash\ngit add .\ngit commit -m \"ci: add aliyun deployment\"\ngit push origin main\n```\n\n---\n\n## 手动部署(备用)\n\n如果 GitHub Actions 失败,可手动部署:\n\n```bash\n# 1. 登录服务器\nssh root@180.76.137.183\n\n# 2. 登录阿里云镜像仓库\ndocker login registry.cn-hangzhou.aliyuncs.com -u YOUR_ALIYUN_USERNAME\n\n# 3. 拉取镜像\ndocker pull registry.cn-hangzhou.aliyuncs.com/aaa-tcm/tcm-meridian-inference:latest\n\n# 4. 运行容器\ndocker run -d \\\n --name tcm-api \\\n --restart unless-stopped \\\n -p 18790:18790 \\\n -e DEEPSEEK_API_KEY=sk-your-api-key \\\n registry.cn-hangzhou.aliyuncs.com/aaa-tcm/tcm-meridian-inference:latest\n\n# 5. 验证\ncurl http://localhost:18790/health\n```\n\n---\n\n## 镜像地址\n\n```\nregistry.cn-hangzhou.aliyuncs.com/aaa-tcm/tcm-meridian-inference:latest\n```\n\n---\n\n## 故障排查\n\n### 登录失败\n\n```bash\n# 检查用户名密码\ndocker login registry.cn-hangzhou.aliyuncs.com\n\n# 阿里云访问凭证页面重置密码\n# https://cr.console.aliyun.com/cn-hangzhou/instances/credentials\n```\n\n### 拉取失败\n\n```bash\n# 检查镜像是否存在\n# 阿里云控制台 → 镜像仓库 → 查看\n\n# 手动测试拉取\ndocker pull registry.cn-hangzhou.aliyuncs.com/aaa-tcm/tcm-meridian-inference:latest\n```\n"}}, ".github/workflows/deploy-aliyun.yml": {"f942d05c457d319e21ea7d8d5e196d324604c3ae": {"t": 1785747029.6064878, "n": 4743, "h": "2aa5378fcc47fda8", "c": "name: Build and Deploy to Aliyun\n\non:\n push:\n branches: [main]\n workflow_dispatch:\n\nenv:\n REGISTRY: crpi-lwz264sedmauvivo.cn-guangzhou.personal.cr.aliyuncs.com\n IMAGE_NAME: danielli/tcm-meridian-inference\n FORK_JAVASCRIPT_ACTIONS_TO_NODE24: true\n\njobs:\n build:\n runs-on: ubuntu-latest\n timeout-minutes: 30\n permissions:\n contents: read\n\n steps:\n - name: Checkout\n uses: actions/checkout@v6\n\n - name: Set up Docker Buildx\n uses: docker/setup-buildx-action@v4\n\n - name: Pull cache from Aliyun ACR (ignore if not exists)\n run: |\n docker pull ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:buildcache || echo \"Cache image not found, will build without cache\"\n\n - name: Login to Aliyun Container Registry\n uses: docker/login-action@v4\n with:\n registry: ${{ env.REGISTRY }}\n username: ${{ secrets.ALIYUN_USERNAME }}\n password: ${{ secrets.ALIYUN_PASSWORD }}\n\n - name: Build and push Docker image with retry\n uses: nick-fields/retry@v3\n with:\n timeout_minutes: 25\n max_attempts: 3\n retry_wait_seconds: 30\n command: |\n # Check if cache exists and set appropriate flags\n CACHE_TAG=\"${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:buildcache\"\n if docker manifest inspect \"$CACHE_TAG\" > /dev/null 2>&1; then\n CACHE_ARGS=\"--cache-from type=registry,ref=$CACHE_TAG --cache-to type=registry,ref=$CACHE_TAG,mode=max\"\n echo \"Using existing cache...\"\n else\n CACHE_ARGS=\"\"\n echo \"No cache found, building from scratch...\"\n fi\n\n docker buildx build --platform linux/amd64 --push \\\n --tag ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:latest \\\n --tag ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ github.sha }} \\\n $CACHE_ARGS .\n env:\n DOCKER_BUILDKIT: 1\n\n deploy:\n needs: build\n runs-on: ubuntu-latest\n if: github.ref == 'refs/heads/main'\n\n steps:\n - name: Deploy to Server\n uses: appleboy/ssh-action@v1.2.5\n with:\n host: ${{ secrets.SSH_HOST }}\n username: ${{ secrets.SSH_USER }}\n password: ${{ secrets.SSH_PASSWORD }}\n script_stop: true\n script: |\n set -e\n echo \"=== TCM API Deployment Start ===\"\n\n IMAGE=\"${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:latest\"\n CONTAINER_NAME=\"tcm-api\"\n PORT=\"18790\"\n\n echo \"Image: $IMAGE\"\n\n # 登录阿里云容器镜像服务\n echo \"Logging into Aliyun ACR...\"\n echo \"${{ secrets.ALIYUN_PASSWORD }}\" | docker login ${{ env.REGISTRY }} -u ${{ secrets.ALIYUN_USERNAME }} --password-stdin\n\n # 拉取最新镜像\n echo \"Pulling image: $IMAGE\"\n docker pull $IMAGE\n\n # 停止并删除旧容器\n echo \"Stopping old container...\"\n docker stop $CONTAINER_NAME 2>/dev/null || true\n docker rm $CONTAINER_NAME 2>/dev/null || true\n\n # 启动新容器\n echo \"Starting new container...\"\n docker run -d \\\n --name $CONTAINER_NAME \\\n --restart unless-stopped \\\n --memory=1g --memory-swap=1g \\\n --health-cmd=\"python3 -c \\\"import urllib.request;urllib.request.urlopen('http://localhost:$PORT/health')\\\"\" \\\n --health-interval=15s --health-timeout=5s --health-retries=3 --health-start-period=30s \\\n -p $PORT:$PORT \\\n -e TCM_API_PORT=$PORT \\\n -e TCM_INFER_MODE=\"${{ secrets.TCM_INFER_MODE || 'auto' }}\" \\\n -e TCM_LOG_LEVEL=\"${{ secrets.TCM_LOG_LEVEL || 'INFO' }}\" \\\n -e DEEPSEEK_API_KEY=\"${{ secrets.DEEPSEEK_API_KEY }}\" \\\n -e DEEPSEEK_MODEL=\"${{ secrets.DEEPSEEK_MODEL || 'deepseek-v4-flash' }}\" \\\n -e PYTHONUNBUFFERED=1 \\\n -e MALLOC_ARENA_MAX=2 \\\n $IMAGE\n\n # 等待服务启动\n echo \"Waiting for service...\"\n sleep 5\n\n # 健康检查 - 使用 docker exec 调用容器内 Python(不依赖宿主机 curl)\n HEALTH=$(docker exec $CONTAINER_NAME python3 -c \"import urllib.request,sys;resp=urllib.request.urlopen('http://localhost:$PORT/health');print(resp.read().decode())\" 2>&1)\n\n if echo \"$HEALTH\" | grep -q '\"status\": \"ok\"'; then\n echo \"✅ Health check passed\"\n echo \"$HEALTH\"\n else\n echo \"⚠️ Health check failed\"\n echo \"$HEALTH\"\n docker logs $CONTAINER_NAME --tail 20\n exit 1\n fi\n\n echo \"=== Deployment Completed ===\"\n echo \"API URL: http://${{ secrets.SSH_HOST }}:$PORT\"\n"}, "b8d62a86356dbc014b2a57d47005f95aa28117a0": {"t": 1785769855.452047, "n": 4743, "h": "2aa5378fcc47fda8", "c": "name: Build and Deploy to Aliyun\n\non:\n push:\n branches: [main]\n workflow_dispatch:\n\nenv:\n REGISTRY: crpi-lwz264sedmauvivo.cn-guangzhou.personal.cr.aliyuncs.com\n IMAGE_NAME: danielli/tcm-meridian-inference\n FORK_JAVASCRIPT_ACTIONS_TO_NODE24: true\n\njobs:\n build:\n runs-on: ubuntu-latest\n timeout-minutes: 30\n permissions:\n contents: read\n\n steps:\n - name: Checkout\n uses: actions/checkout@v6\n\n - name: Set up Docker Buildx\n uses: docker/setup-buildx-action@v4\n\n - name: Pull cache from Aliyun ACR (ignore if not exists)\n run: |\n docker pull ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:buildcache || echo \"Cache image not found, will build without cache\"\n\n - name: Login to Aliyun Container Registry\n uses: docker/login-action@v4\n with:\n registry: ${{ env.REGISTRY }}\n username: ${{ secrets.ALIYUN_USERNAME }}\n password: ${{ secrets.ALIYUN_PASSWORD }}\n\n - name: Build and push Docker image with retry\n uses: nick-fields/retry@v3\n with:\n timeout_minutes: 25\n max_attempts: 3\n retry_wait_seconds: 30\n command: |\n # Check if cache exists and set appropriate flags\n CACHE_TAG=\"${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:buildcache\"\n if docker manifest inspect \"$CACHE_TAG\" > /dev/null 2>&1; then\n CACHE_ARGS=\"--cache-from type=registry,ref=$CACHE_TAG --cache-to type=registry,ref=$CACHE_TAG,mode=max\"\n echo \"Using existing cache...\"\n else\n CACHE_ARGS=\"\"\n echo \"No cache found, building from scratch...\"\n fi\n\n docker buildx build --platform linux/amd64 --push \\\n --tag ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:latest \\\n --tag ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ github.sha }} \\\n $CACHE_ARGS .\n env:\n DOCKER_BUILDKIT: 1\n\n deploy:\n needs: build\n runs-on: ubuntu-latest\n if: github.ref == 'refs/heads/main'\n\n steps:\n - name: Deploy to Server\n uses: appleboy/ssh-action@v1.2.5\n with:\n host: ${{ secrets.SSH_HOST }}\n username: ${{ secrets.SSH_USER }}\n password: ${{ secrets.SSH_PASSWORD }}\n script_stop: true\n script: |\n set -e\n echo \"=== TCM API Deployment Start ===\"\n\n IMAGE=\"${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:latest\"\n CONTAINER_NAME=\"tcm-api\"\n PORT=\"18790\"\n\n echo \"Image: $IMAGE\"\n\n # 登录阿里云容器镜像服务\n echo \"Logging into Aliyun ACR...\"\n echo \"${{ secrets.ALIYUN_PASSWORD }}\" | docker login ${{ env.REGISTRY }} -u ${{ secrets.ALIYUN_USERNAME }} --password-stdin\n\n # 拉取最新镜像\n echo \"Pulling image: $IMAGE\"\n docker pull $IMAGE\n\n # 停止并删除旧容器\n echo \"Stopping old container...\"\n docker stop $CONTAINER_NAME 2>/dev/null || true\n docker rm $CONTAINER_NAME 2>/dev/null || true\n\n # 启动新容器\n echo \"Starting new container...\"\n docker run -d \\\n --name $CONTAINER_NAME \\\n --restart unless-stopped \\\n --memory=1g --memory-swap=1g \\\n --health-cmd=\"python3 -c \\\"import urllib.request;urllib.request.urlopen('http://localhost:$PORT/health')\\\"\" \\\n --health-interval=15s --health-timeout=5s --health-retries=3 --health-start-period=30s \\\n -p $PORT:$PORT \\\n -e TCM_API_PORT=$PORT \\\n -e TCM_INFER_MODE=\"${{ secrets.TCM_INFER_MODE || 'auto' }}\" \\\n -e TCM_LOG_LEVEL=\"${{ secrets.TCM_LOG_LEVEL || 'INFO' }}\" \\\n -e DEEPSEEK_API_KEY=\"${{ secrets.DEEPSEEK_API_KEY }}\" \\\n -e DEEPSEEK_MODEL=\"${{ secrets.DEEPSEEK_MODEL || 'deepseek-v4-flash' }}\" \\\n -e PYTHONUNBUFFERED=1 \\\n -e MALLOC_ARENA_MAX=2 \\\n $IMAGE\n\n # 等待服务启动\n echo \"Waiting for service...\"\n sleep 5\n\n # 健康检查 - 使用 docker exec 调用容器内 Python(不依赖宿主机 curl)\n HEALTH=$(docker exec $CONTAINER_NAME python3 -c \"import urllib.request,sys;resp=urllib.request.urlopen('http://localhost:$PORT/health');print(resp.read().decode())\" 2>&1)\n\n if echo \"$HEALTH\" | grep -q '\"status\": \"ok\"'; then\n echo \"✅ Health check passed\"\n echo \"$HEALTH\"\n else\n echo \"⚠️ Health check failed\"\n echo \"$HEALTH\"\n docker logs $CONTAINER_NAME --tail 20\n exit 1\n fi\n\n echo \"=== Deployment Completed ===\"\n echo \"API URL: http://${{ secrets.SSH_HOST }}:$PORT\"\n"}, "bea53b8ae7b7de980d3590aeec8b66b40d8853f2": {"t": 1785769856.7902553, "n": 4391, "h": "d10b2c1eb713a768", "c": "name: Build and Deploy to Aliyun\n\non:\n push:\n branches: [main]\n workflow_dispatch:\n\nenv:\n REGISTRY: crpi-lwz264sedmauvivo.cn-guangzhou.personal.cr.aliyuncs.com\n IMAGE_NAME: danielli/tcm-meridian-inference\n FORK_JAVASCRIPT_ACTIONS_TO_NODE24: true\n\njobs:\n build:\n runs-on: ubuntu-latest\n timeout-minutes: 30\n permissions:\n contents: read\n\n steps:\n - name: Checkout\n uses: actions/checkout@v6\n\n - name: Set up Docker Buildx\n uses: docker/setup-buildx-action@v4\n\n - name: Pull cache from Aliyun ACR (ignore if not exists)\n run: |\n docker pull ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:buildcache || echo \"Cache image not found, will build without cache\"\n\n - name: Login to Aliyun Container Registry\n uses: docker/login-action@v4\n with:\n registry: ${{ env.REGISTRY }}\n username: ${{ secrets.ALIYUN_USERNAME }}\n password: ${{ secrets.ALIYUN_PASSWORD }}\n\n - name: Build and push Docker image with retry\n uses: nick-fields/retry@v3\n with:\n timeout_minutes: 25\n max_attempts: 3\n retry_wait_seconds: 30\n command: |\n # Check if cache exists and set appropriate flags\n CACHE_TAG=\"${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:buildcache\"\n if docker manifest inspect \"$CACHE_TAG\" > /dev/null 2>&1; then\n CACHE_ARGS=\"--cache-from type=registry,ref=$CACHE_TAG --cache-to type=registry,ref=$CACHE_TAG,mode=max\"\n echo \"Using existing cache...\"\n else\n CACHE_ARGS=\"\"\n echo \"No cache found, building from scratch...\"\n fi\n\n docker buildx build --platform linux/amd64 --push \\\n --tag ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:latest \\\n --tag ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ github.sha }} \\\n $CACHE_ARGS .\n env:\n DOCKER_BUILDKIT: 1\n\n deploy:\n needs: build\n runs-on: ubuntu-latest\n if: github.ref == 'refs/heads/main'\n\n steps:\n - name: Deploy to Server\n uses: appleboy/ssh-action@v1.2.5\n with:\n host: ${{ secrets.SSH_HOST }}\n username: ${{ secrets.SSH_USER }}\n password: ${{ secrets.SSH_PASSWORD }}\n script_stop: true\n script: |\n set -e\n echo \"=== TCM API Deployment Start ===\"\n\n IMAGE=\"${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:latest\"\n CONTAINER_NAME=\"tcm-api\"\n PORT=\"18790\"\n\n echo \"Image: $IMAGE\"\n\n # 登录阿里云容器镜像服务\n echo \"Logging into Aliyun ACR...\"\n echo \"${{ secrets.ALIYUN_PASSWORD }}\" | docker login ${{ env.REGISTRY }} -u ${{ secrets.ALIYUN_USERNAME }} --password-stdin\n\n # 拉取最新镜像\n echo \"Pulling image: $IMAGE\"\n docker pull $IMAGE\n\n # 停止并删除旧容器\n echo \"Stopping old container...\"\n docker stop $CONTAINER_NAME 2>/dev/null || true\n docker rm $CONTAINER_NAME 2>/dev/null || true\n\n # 启动新容器\n echo \"Starting new container...\"\n docker run -d \\\n --name $CONTAINER_NAME \\\n --restart unless-stopped \\\n -p $PORT:$PORT \\\n -e TCM_API_PORT=$PORT \\\n -e TCM_INFER_MODE=\"${{ secrets.TCM_INFER_MODE || 'auto' }}\" \\\n -e TCM_LOG_LEVEL=\"${{ secrets.TCM_LOG_LEVEL || 'INFO' }}\" \\\n -e DEEPSEEK_API_KEY=\"${{ secrets.DEEPSEEK_API_KEY }}\" \\\n -e DEEPSEEK_MODEL=\"${{ secrets.DEEPSEEK_MODEL || 'deepseek-chat' }}\" \\\n $IMAGE\n\n # 等待服务启动\n echo \"Waiting for service...\"\n sleep 5\n\n # 健康检查 - 使用 docker exec 调用容器内 Python(不依赖宿主机 curl)\n HEALTH=$(docker exec $CONTAINER_NAME python3 -c \"import urllib.request,sys;resp=urllib.request.urlopen('http://localhost:$PORT/health');print(resp.read().decode())\" 2>&1)\n\n if echo \"$HEALTH\" | grep -q '\"status\": \"ok\"'; then\n echo \"✅ Health check passed\"\n echo \"$HEALTH\"\n else\n echo \"⚠️ Health check failed\"\n echo \"$HEALTH\"\n docker logs $CONTAINER_NAME --tail 20\n exit 1\n fi\n\n echo \"=== Deployment Completed ===\"\n echo \"API URL: http://${{ secrets.SSH_HOST }}:$PORT\"\n"}, "0514c3f1f87ba50b1cd43d82a69042258caba43d": {"t": 1785769858.10015, "n": 3919, "h": "d0e3b71bc4ed864a", "c": "name: Build and Deploy to Aliyun\n\non:\n push:\n branches: [main]\n workflow_dispatch:\n\nenv:\n REGISTRY: crpi-lwz264sedmauvivo.cn-guangzhou.personal.cr.aliyuncs.com\n IMAGE_NAME: danielli/tcm-meridian-inference\n FORK_JAVASCRIPT_ACTIONS_TO_NODE24: true\n\njobs:\n build:\n runs-on: ubuntu-latest\n timeout-minutes: 30\n permissions:\n contents: read\n\n steps:\n - name: Checkout\n uses: actions/checkout@v6\n\n - name: Set up Docker Buildx\n uses: docker/setup-buildx-action@v4\n\n - name: Pull cache from Aliyun ACR\n run: |\n docker pull ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:buildcache || true\n\n - name: Login to Aliyun Container Registry\n uses: docker/login-action@v4\n with:\n registry: ${{ env.REGISTRY }}\n username: ${{ secrets.ALIYUN_USERNAME }}\n password: ${{ secrets.ALIYUN_PASSWORD }}\n\n - name: Build and push Docker image with retry\n uses: nick-fields/retry@v3\n with:\n timeout_minutes: 25\n max_attempts: 3\n retry_wait_seconds: 30\n command: docker buildx build --platform linux/amd64 --push --tag ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:latest --tag ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ github.sha }} --cache-from type=registry,ref=${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:buildcache --cache-to type=registry,ref=${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:buildcache,mode=max .\n env:\n DOCKER_BUILDKIT: 1\n\n deploy:\n needs: build\n runs-on: ubuntu-latest\n if: github.ref == 'refs/heads/main'\n\n steps:\n - name: Deploy to Server\n uses: appleboy/ssh-action@v1.2.5\n with:\n host: ${{ secrets.SSH_HOST }}\n username: ${{ secrets.SSH_USER }}\n password: ${{ secrets.SSH_PASSWORD }}\n script_stop: true\n script: |\n set -e\n echo \"=== TCM API Deployment Start ===\"\n\n IMAGE=\"${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:latest\"\n CONTAINER_NAME=\"tcm-api\"\n PORT=\"18790\"\n\n echo \"Image: $IMAGE\"\n\n # 登录阿里云容器镜像服务\n echo \"Logging into Aliyun ACR...\"\n echo \"${{ secrets.ALIYUN_PASSWORD }}\" | docker login ${{ env.REGISTRY }} -u ${{ secrets.ALIYUN_USERNAME }} --password-stdin\n\n # 拉取最新镜像\n echo \"Pulling image: $IMAGE\"\n docker pull $IMAGE\n\n # 停止并删除旧容器\n echo \"Stopping old container...\"\n docker stop $CONTAINER_NAME 2>/dev/null || true\n docker rm $CONTAINER_NAME 2>/dev/null || true\n\n # 启动新容器\n echo \"Starting new container...\"\n docker run -d \\\n --name $CONTAINER_NAME \\\n --restart unless-stopped \\\n -p $PORT:$PORT \\\n -e TCM_API_PORT=$PORT \\\n -e TCM_INFER_MODE=\"${{ secrets.TCM_INFER_MODE || 'auto' }}\" \\\n -e TCM_LOG_LEVEL=\"${{ secrets.TCM_LOG_LEVEL || 'INFO' }}\" \\\n -e DEEPSEEK_API_KEY=\"${{ secrets.DEEPSEEK_API_KEY }}\" \\\n -e DEEPSEEK_MODEL=\"${{ secrets.DEEPSEEK_MODEL || 'deepseek-chat' }}\" \\\n $IMAGE\n\n # 等待服务启动\n echo \"Waiting for service...\"\n sleep 5\n\n # 健康检查 - 使用 docker exec 调用容器内 Python(不依赖宿主机 curl)\n HEALTH=$(docker exec $CONTAINER_NAME python3 -c \"import urllib.request,sys;resp=urllib.request.urlopen('http://localhost:$PORT/health');print(resp.read().decode())\" 2>&1)\n\n if echo \"$HEALTH\" | grep -q '\"status\": \"ok\"'; then\n echo \"✅ Health check passed\"\n echo \"$HEALTH\"\n else\n echo \"⚠️ Health check failed\"\n echo \"$HEALTH\"\n docker logs $CONTAINER_NAME --tail 20\n exit 1\n fi\n\n echo \"=== Deployment Completed ===\"\n echo \"API URL: http://${{ secrets.SSH_HOST }}:$PORT\"\n"}, "849fe11507b6b90fd3c37619e631e9238f1c7fc9": {"t": 1785769859.556486, "n": 4082, "h": "73200822244751fd", "c": "name: Build and Deploy to Aliyun\n\non:\n push:\n branches: [main]\n workflow_dispatch:\n\nenv:\n REGISTRY: crpi-lwz264sedmauvivo.cn-guangzhou.personal.cr.aliyuncs.com\n IMAGE_NAME: danielli/tcm-meridian-inference\n FORK_JAVASCRIPT_ACTIONS_TO_NODE24: true\n\njobs:\n build:\n runs-on: ubuntu-latest\n timeout-minutes: 30\n permissions:\n contents: read\n\n steps:\n - name: Checkout\n uses: actions/checkout@v6\n\n - name: Set up Docker Buildx\n uses: docker/setup-buildx-action@v4\n\n - name: Pull cache from Aliyun ACR\n run: |\n docker pull ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:buildcache || true\n\n - name: Login to Aliyun Container Registry\n uses: docker/login-action@v4\n with:\n registry: ${{ env.REGISTRY }}\n username: ${{ secrets.ALIYUN_USERNAME }}\n password: ${{ secrets.ALIYUN_PASSWORD }}\n\n - name: Build and push Docker image\n uses: docker/build-push-action@v7\n with:\n context: .\n push: true\n tags: |\n ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:latest\n ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ github.sha }}\n cache-from: type=registry,ref=${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:buildcache\n cache-to: type=registry,ref=${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:buildcache,mode=max\n # Retry mechanism for network issues\n retry:\n enabled: true\n max-duration: 300\n max-attempts: 3\n env:\n # Network stability settings for Aliyun ACR\n DOCKER_BUILDKIT: 1\n BUILDKIT_PROGRESS: plain\n\n deploy:\n needs: build\n runs-on: ubuntu-latest\n if: github.ref == 'refs/heads/main'\n\n steps:\n - name: Deploy to Server\n uses: appleboy/ssh-action@v1.2.5\n with:\n host: ${{ secrets.SSH_HOST }}\n username: ${{ secrets.SSH_USER }}\n password: ${{ secrets.SSH_PASSWORD }}\n script_stop: true\n script: |\n set -e\n echo \"=== TCM API Deployment Start ===\"\n\n IMAGE=\"${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:latest\"\n CONTAINER_NAME=\"tcm-api\"\n PORT=\"18790\"\n\n echo \"Image: $IMAGE\"\n\n # 登录阿里云容器镜像服务\n echo \"Logging into Aliyun ACR...\"\n echo \"${{ secrets.ALIYUN_PASSWORD }}\" | docker login ${{ env.REGISTRY }} -u ${{ secrets.ALIYUN_USERNAME }} --password-stdin\n\n # 拉取最新镜像\n echo \"Pulling image: $IMAGE\"\n docker pull $IMAGE\n\n # 停止并删除旧容器\n echo \"Stopping old container...\"\n docker stop $CONTAINER_NAME 2>/dev/null || true\n docker rm $CONTAINER_NAME 2>/dev/null || true\n\n # 启动新容器\n echo \"Starting new container...\"\n docker run -d \\\n --name $CONTAINER_NAME \\\n --restart unless-stopped \\\n -p $PORT:$PORT \\\n -e TCM_API_PORT=$PORT \\\n -e TCM_INFER_MODE=\"${{ secrets.TCM_INFER_MODE || 'auto' }}\" \\\n -e TCM_LOG_LEVEL=\"${{ secrets.TCM_LOG_LEVEL || 'INFO' }}\" \\\n -e DEEPSEEK_API_KEY=\"${{ secrets.DEEPSEEK_API_KEY }}\" \\\n -e DEEPSEEK_MODEL=\"${{ secrets.DEEPSEEK_MODEL || 'deepseek-chat' }}\" \\\n $IMAGE\n\n # 等待服务启动\n echo \"Waiting for service...\"\n sleep 5\n\n # 健康检查 - 使用 docker exec 调用容器内 Python(不依赖宿主机 curl)\n HEALTH=$(docker exec $CONTAINER_NAME python3 -c \"import urllib.request,sys;resp=urllib.request.urlopen('http://localhost:$PORT/health');print(resp.read().decode())\" 2>&1)\n\n if echo \"$HEALTH\" | grep -q '\"status\": \"ok\"'; then\n echo \"✅ Health check passed\"\n echo \"$HEALTH\"\n else\n echo \"⚠️ Health check failed\"\n echo \"$HEALTH\"\n docker logs $CONTAINER_NAME --tail 20\n exit 1\n fi\n\n echo \"=== Deployment Completed ===\"\n echo \"API URL: http://${{ secrets.SSH_HOST }}:$PORT\"\n"}, "683419bd0615aeb633e9bc8d9393840433cfb30e": {"t": 1785769862.5513127, "n": 3263, "h": "a2beb7b8e0cff136", "c": "name: Build and Deploy to Aliyun\n\non:\n push:\n branches: [main]\n workflow_dispatch:\n\nenv:\n REGISTRY: crpi-lwz264sedmauvivo.cn-guangzhou.personal.cr.aliyuncs.com\n IMAGE_NAME: danielli/tcm-meridian-inference\n\njobs:\n build:\n runs-on: ubuntu-latest\n permissions:\n contents: read\n\n steps:\n - name: Checkout\n uses: actions/checkout@v4\n\n - name: Set up Docker Buildx\n uses: docker/setup-buildx-action@v3\n\n - name: Login to Aliyun Container Registry\n uses: docker/login-action@v3\n with:\n registry: ${{ env.REGISTRY }}\n username: ${{ secrets.ALIYUN_USERNAME }}\n password: ${{ secrets.ALIYUN_PASSWORD }}\n\n - name: Build and push Docker image\n uses: docker/build-push-action@v5\n with:\n context: .\n push: true\n tags: |\n ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:latest\n ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ github.sha }}\n cache-from: type=gha\n cache-to: type=gha,mode=max\n\n deploy:\n needs: build\n runs-on: ubuntu-latest\n if: github.ref == 'refs/heads/main'\n\n steps:\n - name: Deploy to Server\n uses: appleboy/ssh-action@v1.0.0\n with:\n host: ${{ secrets.SSH_HOST }}\n username: ${{ secrets.SSH_USER }}\n password: ${{ secrets.SSH_PASSWORD }}\n script_stop: true\n script: |\n set -e\n echo \"=== TCM API Deployment Start ===\"\n\n IMAGE=\"${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:latest\"\n CONTAINER_NAME=\"tcm-api\"\n PORT=\"18790\"\n\n echo \"Image: $IMAGE\"\n\n # 登录阿里云容器镜像服务\n echo \"Logging into Aliyun ACR...\"\n echo \"${{ secrets.ALIYUN_PASSWORD }}\" | docker login ${{ env.REGISTRY }} -u ${{ secrets.ALIYUN_USERNAME }} --password-stdin\n\n # 拉取最新镜像\n echo \"Pulling image: $IMAGE\"\n docker pull $IMAGE\n\n # 停止并删除旧容器\n echo \"Stopping old container...\"\n docker stop $CONTAINER_NAME 2>/dev/null || true\n docker rm $CONTAINER_NAME 2>/dev/null || true\n\n # 启动新容器\n echo \"Starting new container...\"\n docker run -d \\\n --name $CONTAINER_NAME \\\n --restart unless-stopped \\\n -p $PORT:$PORT \\\n -e TCM_API_PORT=$PORT \\\n -e TCM_INFER_MODE=\"${{ secrets.TCM_INFER_MODE || 'auto' }}\" \\\n -e TCM_LOG_LEVEL=\"${{ secrets.TCM_LOG_LEVEL || 'INFO' }}\" \\\n -e DEEPSEEK_API_KEY=\"${{ secrets.DEEPSEEK_API_KEY }}\" \\\n -e DEEPSEEK_MODEL=\"${{ secrets.DEEPSEEK_MODEL || 'deepseek-chat' }}\" \\\n $IMAGE\n\n # 等待服务启动\n echo \"Waiting for service...\"\n sleep 5\n\n # 健康检查\n if curl -s http://localhost:$PORT/health | grep -q '\"status\": \"ok\"'; then\n echo \"✅ Health check passed\"\n curl -s http://localhost:$PORT/health\n else\n echo \"⚠️ Health check failed\"\n docker logs $CONTAINER_NAME --tail 20\n exit 1\n fi\n\n echo \"=== Deployment Completed ===\"\n echo \"API URL: http://${{ secrets.SSH_HOST }}:$PORT\"\n"}, "1277c848338646ba5f325a6704772bcd6bd72ff4": {"t": 1785769867.593643, "n": 3237, "h": "cf85cd2475b81033", "c": "name: Build and Deploy to Aliyun\n\non:\n push:\n branches: [main]\n workflow_dispatch:\n\nenv:\n REGISTRY: registry.cn-hangzhou.aliyuncs.com\n IMAGE_NAME: danielli/tcm-meridian-inference\n\njobs:\n build:\n runs-on: ubuntu-latest\n permissions:\n contents: read\n\n steps:\n - name: Checkout\n uses: actions/checkout@v4\n\n - name: Set up Docker Buildx\n uses: docker/setup-buildx-action@v3\n\n - name: Login to Aliyun Container Registry\n uses: docker/login-action@v3\n with:\n registry: ${{ env.REGISTRY }}\n username: ${{ secrets.ALIYUN_USERNAME }}\n password: ${{ secrets.ALIYUN_PASSWORD }}\n\n - name: Build and push Docker image\n uses: docker/build-push-action@v5\n with:\n context: .\n push: true\n tags: |\n ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:latest\n ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ github.sha }}\n cache-from: type=gha\n cache-to: type=gha,mode=max\n\n deploy:\n needs: build\n runs-on: ubuntu-latest\n if: github.ref == 'refs/heads/main'\n\n steps:\n - name: Deploy to Server\n uses: appleboy/ssh-action@v1.0.0\n with:\n host: ${{ secrets.SSH_HOST }}\n username: ${{ secrets.SSH_USER }}\n password: ${{ secrets.SSH_PASSWORD }}\n script_stop: true\n script: |\n set -e\n echo \"=== TCM API Deployment Start ===\"\n\n IMAGE=\"${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:latest\"\n CONTAINER_NAME=\"tcm-api\"\n PORT=\"18790\"\n\n echo \"Image: $IMAGE\"\n\n # 登录阿里云容器镜像服务\n echo \"Logging into Aliyun ACR...\"\n echo \"${{ secrets.ALIYUN_PASSWORD }}\" | docker login ${{ env.REGISTRY }} -u ${{ secrets.ALIYUN_USERNAME }} --password-stdin\n\n # 拉取最新镜像\n echo \"Pulling image: $IMAGE\"\n docker pull $IMAGE\n\n # 停止并删除旧容器\n echo \"Stopping old container...\"\n docker stop $CONTAINER_NAME 2>/dev/null || true\n docker rm $CONTAINER_NAME 2>/dev/null || true\n\n # 启动新容器\n echo \"Starting new container...\"\n docker run -d \\\n --name $CONTAINER_NAME \\\n --restart unless-stopped \\\n -p $PORT:$PORT \\\n -e TCM_API_PORT=$PORT \\\n -e TCM_INFER_MODE=\"${{ secrets.TCM_INFER_MODE || 'auto' }}\" \\\n -e TCM_LOG_LEVEL=\"${{ secrets.TCM_LOG_LEVEL || 'INFO' }}\" \\\n -e DEEPSEEK_API_KEY=\"${{ secrets.DEEPSEEK_API_KEY }}\" \\\n -e DEEPSEEK_MODEL=\"${{ secrets.DEEPSEEK_MODEL || 'deepseek-chat' }}\" \\\n $IMAGE\n\n # 等待服务启动\n echo \"Waiting for service...\"\n sleep 5\n\n # 健康检查\n if curl -s http://localhost:$PORT/health | grep -q '\"status\": \"ok\"'; then\n echo \"✅ Health check passed\"\n curl -s http://localhost:$PORT/health\n else\n echo \"⚠️ Health check failed\"\n docker logs $CONTAINER_NAME --tail 20\n exit 1\n fi\n\n echo \"=== Deployment Completed ===\"\n echo \"API URL: http://${{ secrets.SSH_HOST }}:$PORT\"\n"}, "1bb50ed85b53a2e43b82d03350486830d3d95cb5": {"t": 1785769873.7430177, "n": 3236, "h": "52dacdcf9bde9802", "c": "name: Build and Deploy to Aliyun\n\non:\n push:\n branches: [main]\n workflow_dispatch:\n\nenv:\n REGISTRY: registry.cn-hangzhou.aliyuncs.com\n IMAGE_NAME: aaa-tcm/tcm-meridian-inference\n\njobs:\n build:\n runs-on: ubuntu-latest\n permissions:\n contents: read\n\n steps:\n - name: Checkout\n uses: actions/checkout@v4\n\n - name: Set up Docker Buildx\n uses: docker/setup-buildx-action@v3\n\n - name: Login to Aliyun Container Registry\n uses: docker/login-action@v3\n with:\n registry: ${{ env.REGISTRY }}\n username: ${{ secrets.ALIYUN_USERNAME }}\n password: ${{ secrets.ALIYUN_PASSWORD }}\n\n - name: Build and push Docker image\n uses: docker/build-push-action@v5\n with:\n context: .\n push: true\n tags: |\n ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:latest\n ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ github.sha }}\n cache-from: type=gha\n cache-to: type=gha,mode=max\n\n deploy:\n needs: build\n runs-on: ubuntu-latest\n if: github.ref == 'refs/heads/main'\n\n steps:\n - name: Deploy to Server\n uses: appleboy/ssh-action@v1.0.0\n with:\n host: ${{ secrets.SSH_HOST }}\n username: ${{ secrets.SSH_USER }}\n password: ${{ secrets.SSH_PASSWORD }}\n script_stop: true\n script: |\n set -e\n echo \"=== TCM API Deployment Start ===\"\n\n IMAGE=\"${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:latest\"\n CONTAINER_NAME=\"tcm-api\"\n PORT=\"18790\"\n\n echo \"Image: $IMAGE\"\n\n # 登录阿里云容器镜像服务\n echo \"Logging into Aliyun ACR...\"\n echo \"${{ secrets.ALIYUN_PASSWORD }}\" | docker login ${{ env.REGISTRY }} -u ${{ secrets.ALIYUN_USERNAME }} --password-stdin\n\n # 拉取最新镜像\n echo \"Pulling image: $IMAGE\"\n docker pull $IMAGE\n\n # 停止并删除旧容器\n echo \"Stopping old container...\"\n docker stop $CONTAINER_NAME 2>/dev/null || true\n docker rm $CONTAINER_NAME 2>/dev/null || true\n\n # 启动新容器\n echo \"Starting new container...\"\n docker run -d \\\n --name $CONTAINER_NAME \\\n --restart unless-stopped \\\n -p $PORT:$PORT \\\n -e TCM_API_PORT=$PORT \\\n -e TCM_INFER_MODE=\"${{ secrets.TCM_INFER_MODE || 'auto' }}\" \\\n -e TCM_LOG_LEVEL=\"${{ secrets.TCM_LOG_LEVEL || 'INFO' }}\" \\\n -e DEEPSEEK_API_KEY=\"${{ secrets.DEEPSEEK_API_KEY }}\" \\\n -e DEEPSEEK_MODEL=\"${{ secrets.DEEPSEEK_MODEL || 'deepseek-chat' }}\" \\\n $IMAGE\n\n # 等待服务启动\n echo \"Waiting for service...\"\n sleep 5\n\n # 健康检查\n if curl -s http://localhost:$PORT/health | grep -q '\"status\": \"ok\"'; then\n echo \"✅ Health check passed\"\n curl -s http://localhost:$PORT/health\n else\n echo \"⚠️ Health check failed\"\n docker logs $CONTAINER_NAME --tail 20\n exit 1\n fi\n\n echo \"=== Deployment Completed ===\"\n echo \"API URL: http://${{ secrets.SSH_HOST }}:$PORT\"\n"}}, "docker-compose.yml": {"f942d05c457d319e21ea7d8d5e196d324604c3ae": {"t": 1786068608.5593915, "n": 2190, "h": "00e49256ae10e61f", "c": "version: '3.8'\n\nservices:\n tcm-api:\n build:\n context: .\n dockerfile: Dockerfile\n image: tcm-meridian-inference:latest\n container_name: tcm-api\n restart: unless-stopped\n\n # Resource limits - 增加内存限制\n deploy:\n resources:\n limits:\n cpus: '2.0'\n memory: 1G\n reservations:\n cpus: '0.5'\n memory: 256M\n\n # 系统限制优化\n ulimits:\n nofile:\n soft: 65536\n hard: 65536\n nproc:\n soft: 32768\n hard: 32768\n\n # Environment variables\n environment:\n - TCM_API_PORT=18790\n - TCM_INFER_MODE=${TCM_INFER_MODE:-auto}\n - TCM_LOG_LEVEL=${TCM_LOG_LEVEL:-INFO}\n - DEEPSEEK_API_KEY=${DEEPSEEK_API_KEY:-}\n - DEEPSEEK_MODEL=${DEEPSEEK_MODEL:-deepseek-v4-flash}\n # Python 内存优化\n - PYTHONUNBUFFERED=1\n - MALLOC_ARENA_MAX=2\n - MALLOC_MMAP_THRESHOLD_=131072\n - MALLOC_TRIM_THRESHOLD_=131072\n - MALLOC_TOP_PAD_=131072\n\n # Port mapping - 统一使用 18790 端口\n ports:\n - \"18790:18790\"\n\n # Health check - 缩短检查间隔,更快发现问题\n healthcheck:\n test: [\"CMD\", \"python3\", \"-c\", \"import urllib.request; urllib.request.urlopen('http://localhost:18790/health')\"]\n interval: 15s\n timeout: 5s\n retries: 3\n start_period: 10s\n\n # Logging configuration\n logging:\n driver: \"json-file\"\n options:\n max-size: \"10m\"\n max-file: \"3\"\n labels: \"service_name,environment\"\n env: \"TCM_INFER_MODE,TCM_LOG_LEVEL\"\n\n # Security options\n security_opt:\n - no-new-privileges:true\n\n networks:\n - tcm-network\n\n # Optional: Nginx reverse proxy (recommended for production)\n nginx:\n image: nginx:alpine\n container_name: tcm-nginx\n restart: unless-stopped\n depends_on:\n tcm-api:\n condition: service_healthy\n\n ports:\n - \"80:80\"\n - \"443:443\"\n\n volumes:\n - ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro\n - ./nginx/conf.d:/etc/nginx/conf.d:ro\n - ./logs/nginx:/var/log/nginx\n\n networks:\n - tcm-network\n\n # Only start nginx if you have nginx config ready\n profiles:\n - with-nginx\n\nnetworks:\n tcm-network:\n driver: bridge\n"}}}}