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.
1 line
62 KiB
JSON
1 line
62 KiB
JSON
{"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"}}}} |