feat(docker): 添加Docker支持和部署指南

新增Dockerfile、.dockerignore和健康检查脚本,支持通过Docker部署服务。添加了详细的部署文档和自动化脚本,便于在不同环境下快速启动和配置服务。同时优化了系统提示词应用逻辑,移除了调试日志输出。
This commit is contained in:
hex2077 2025-07-30 19:46:12 +08:00
parent fcf6389856
commit 5f0cd6ad83
8 changed files with 339 additions and 1 deletions

23
.dockerignore Normal file
View file

@ -0,0 +1,23 @@
node_modules
npm-debug.log
.git
.gitignore
README.md
README-EN.md
Dockerfile
.dockerignore
.nyc_output
coverage
.nyc_output
.coverage
.env
.env.local
.env.*.local
credentials.json
*.md
LICENSE
jest.config.js
babel.config.js
tests/
run-tests.js
test-summary.js

44
Dockerfile Normal file
View file

@ -0,0 +1,44 @@
# 使用官方Node.js运行时作为基础镜像
# 选择20-alpine版本以满足undici包的要求需要Node.js >=20.18.1
FROM node:20-alpine
# 设置标签
LABEL maintainer="GeminiCli2API Team"
LABEL description="Docker image for GeminiCli2API server"
# 设置工作目录
WORKDIR /app
# 复制package.json和package-lock.json如果存在
COPY package*.json ./
# 安装依赖
# 使用--production标志只安装生产依赖减小镜像大小
# 使用--omit=dev来排除开发依赖
RUN npm install
# 添加非root用户以提高安全性
RUN addgroup -g 1001 -S nodejs
RUN adduser -S nextjs -u 1001
# 复制源代码
COPY . .
# 更改文件所有者为非root用户
RUN chown -R nextjs:nodejs /app
USER nextjs
# 创建目录用于存储日志和系统提示文件
RUN mkdir -p /app/logs
# 暴露端口
EXPOSE 3000
# 添加健康检查
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
CMD node healthcheck.js || exit 1
# 设置启动命令
# 使用默认配置启动服务器,支持通过环境变量配置
# 通过环境变量传递参数例如docker run -e ARGS="--api-key mykey --port 8080" ...
CMD ["sh", "-c", "node src/api-server.js $ARGS"]

93
README.Docker.md Normal file
View file

@ -0,0 +1,93 @@
# Docker部署指南
本指南将帮助您使用Docker部署GeminiCli2API服务。
## 构建Docker镜像
在项目根目录下执行以下命令来构建Docker镜像
```bash
docker build -t gemini-cli2api .
```
## 运行容器
### 基本运行
```bash
docker run -d -p 3000:3000 --name gemini-cli2api gemini-cli2api
```
### 通过ARGS环境变量配置服务
服务支持通过`ARGS`环境变量来配置,例如:
```bash
docker run -d \
-p 3000:3000 \
-e ARGS="--api-key 123456 --host 0.0.0.0" \
--name gemini-cli2api \
gemini-cli2api
```
### 使用Base64编码的凭据
项目包含两个脚本用于自动处理Base64编码的凭据
- `run-docker.bat` (Windows)
- `run-docker.sh` (Linux/Unix)
这些脚本会自动生成包含凭据的`ARGS`环境变量:
```bash
# Windows
run-docker.bat
# Linux/Unix (首次使用需要授予权限)
chmod +x run-docker.sh
./run-docker.sh
```
### 挂载配置文件和日志目录
```bash
# 挂载配置文件
docker run -d \
-p 3000:3000 \
-v /path/to/your/config.json:/app/config.json \
--name gemini-cli2api \
gemini-cli2api
# 挂载日志目录
docker run -d \
-p 3000:3000 \
-v /path/to/your/logs:/app/logs \
--name gemini-cli2api \
gemini-cli2api
```
## 访问服务
容器启动后您可以通过以下URL访问服务
```
http://localhost:3000
```
## 可用端点
- `POST /v1/chat/completions` - OpenAI兼容聊天完成端点
- `GET /v1/models` - OpenAI兼容模型列表端点
- `POST /v1beta/models/{model}:generateContent` - Gemini兼容内容生成端点
- `GET /v1beta/models` - Gemini兼容模型列表端点
- `GET /health` - 健康检查端点
## 故障排除
如果容器无法启动,请检查以下内容:
1. 确保端口3000未被其他进程占用
2. 检查环境变量配置是否正确
3. 查看容器日志以获取更多信息:
```bash
docker logs gemini-cli2api

View file

@ -207,6 +207,12 @@
---
## 🐳 Docker 部署
项目支持通过 Docker 进行部署,详细指南请参阅 [Docker部署指南](./README.Docker.md)。
---
### 4. 调用 API
> **提示**: 如果您在无法直接访问 Google/OpenAI/Claude/Kiro 服务的环境中使用,请先为您的终端设置全局 HTTP/HTTPS 代理。

46
healthcheck.js Normal file
View file

@ -0,0 +1,46 @@
/**
* Docker健康检查脚本
* 用于检查API服务器是否正常运行
*/
const http = require('http');
// 从环境变量获取主机和端口,如果没有设置则使用默认值
const HOST = process.env.HOST || 'localhost';
const PORT = process.env.SERVER_PORT || 3000;
// 发送HTTP请求到健康检查端点
const options = {
hostname: HOST,
port: PORT,
path: '/health',
method: 'GET',
timeout: 2000 // 2秒超时
};
const req = http.request(options, (res) => {
// 如果状态码是200表示服务健康
if (res.statusCode === 200) {
console.log('Health check passed');
process.exit(0);
} else {
console.log(`Health check failed with status code: ${res.statusCode}`);
process.exit(1);
}
});
// 处理请求错误
req.on('error', (e) => {
console.error(`Health check failed: ${e.message}`);
process.exit(1);
});
// 设置超时处理
req.on('timeout', () => {
console.error('Health check timed out');
req.destroy();
process.exit(1);
});
// 结束请求
req.end();

65
run-docker.bat Normal file
View file

@ -0,0 +1,65 @@
@echo off
:: run-docker-with-credentials.bat
:: 生成指定的Docker运行命令使用USERPROFILE环境变量构建路径
setlocal enabledelayedexpansion
echo 正在生成指定的Docker运行命令...
:: 设置配置文件路径使用USERPROFILE环境变量
set "AWS_SSO_CACHE_PATH=%USERPROFILE%\.aws\sso\cache"
set "GEMINI_CONFIG_PATH=%USERPROFILE%\.gemini\oauth_creds.json"
:: 检查AWS SSO缓存目录是否存在
if exist "%AWS_SSO_CACHE_PATH%" (
echo 发现AWS SSO缓存目录: %AWS_SSO_CACHE_PATH%
) else (
echo 未找到AWS SSO缓存目录: %AWS_SSO_CACHE_PATH%
echo 注意AWS SSO缓存目录不存在Docker容器可能无法访问AWS凭证
)
:: 检查Gemini配置文件是否存在
if exist "%GEMINI_CONFIG_PATH%" (
echo 发现Gemini配置文件: %GEMINI_CONFIG_PATH%
) else (
echo 未找到Gemini配置文件: %GEMINI_CONFIG_PATH%
echo 注意Gemini配置文件不存在Docker容器可能无法访问Gemini API
)
:: 构建Docker运行命令使用USERPROFILE环境变量构建的路径
set "DOCKER_CMD=docker run -d ^"
set "DOCKER_CMD=!DOCKER_CMD! -p 3000:3000 ^"
set "DOCKER_CMD=!DOCKER_CMD! -e ARGS="--api-key 123456 --host 0.0.0.0" ^"
set "DOCKER_CMD=!DOCKER_CMD! -v "%AWS_SSO_CACHE_PATH%:/home/nextjs/.aws/sso/cache" ^"
set "DOCKER_CMD=!DOCKER_CMD! -v "%GEMINI_CONFIG_PATH%:/home/nextjs/.gemini/oauth_creds.json" ^"
set "DOCKER_CMD=!DOCKER_CMD! --name gemini-cli2api ^"
set "DOCKER_CMD=!DOCKER_CMD! gemini-cli2api"
:: 显示将要执行的命令
echo.
echo 生成的Docker命令:
echo !DOCKER_CMD!
echo.
:: 将命令保存到文件中
echo !DOCKER_CMD! > docker-run-command.txt
echo 命令已保存到 docker-run-command.txt 文件中,您可以从该文件复制完整的命令。
:: 询问用户是否要执行该命令
echo.
set /p EXECUTE_CMD="是否要立即执行该Docker命令(y/n): "
if /i "!EXECUTE_CMD!"=="y" (
echo 正在执行Docker命令...
!DOCKER_CMD!
if !errorlevel! equ 0 (
echo Docker容器已成功启动
echo 您可以通过 http://localhost:3000 访问API服务
) else (
echo Docker命令执行失败请检查错误信息
)
) else (
echo 命令未执行您可以手动从docker-run-command.txt文件复制并执行命令
)
echo 脚本执行完成
pause

62
run-docker.sh Normal file
View file

@ -0,0 +1,62 @@
#!/bin/bash
# run-docker-with-credentials.sh
# 生成指定的Docker运行命令使用HOME环境变量构建路径
echo "正在生成指定的Docker运行命令..."
# 设置配置文件路径使用HOME环境变量
AWS_SSO_CACHE_PATH="$HOME/.aws/sso/cache"
GEMINI_CONFIG_PATH="$HOME/.gemini/oauth_creds.json"
# 检查AWS SSO缓存目录是否存在
if [ -d "$AWS_SSO_CACHE_PATH" ]; then
echo "发现AWS SSO缓存目录: $AWS_SSO_CACHE_PATH"
else
echo "未找到AWS SSO缓存目录: $AWS_SSO_CACHE_PATH"
echo "注意AWS SSO缓存目录不存在Docker容器可能无法访问AWS凭证"
fi
# 检查Gemini配置文件是否存在
if [ -f "$GEMINI_CONFIG_PATH" ]; then
echo "发现Gemini配置文件: $GEMINI_CONFIG_PATH"
else
echo "未找到Gemini配置文件: $GEMINI_CONFIG_PATH"
echo "注意Gemini配置文件不存在Docker容器可能无法访问Gemini API"
fi
# 构建Docker运行命令使用HOME环境变量构建的路径
DOCKER_CMD="docker run -d \\
-p 3000:3000 \\
-e ARGS=\"--api-key 123456 --host 0.0.0.0\" \\
-v $AWS_SSO_CACHE_PATH:/home/nextjs/.aws/sso/cache \\
-v $GEMINI_CONFIG_PATH:/home/nextjs/.gemini/oauth_creds.json \\
--name gemini-cli2api \\
gemini-cli2api"
# 显示将要执行的命令
echo
echo "生成的Docker命令:"
echo "$DOCKER_CMD"
echo
# 将命令保存到文件中
echo "$DOCKER_CMD" > docker-run-command.txt
echo "命令已保存到 docker-run-command.txt 文件中,您可以从该文件复制完整的命令。"
# 询问用户是否要执行该命令
echo
read -p "是否要立即执行该Docker命令(y/n): " EXECUTE_CMD
if [ "$EXECUTE_CMD" = "y" ] || [ "$EXECUTE_CMD" = "Y" ]; then
echo "正在执行Docker命令..."
eval "$DOCKER_CMD"
if [ $? -eq 0 ]; then
echo "Docker容器已成功启动"
echo "您可以通过 http://localhost:3000 访问API服务"
else
echo "Docker命令执行失败请检查错误信息"
fi
else
echo "命令未执行您可以手动从docker-run-command.txt文件复制并执行命令"
fi
echo "脚本执行完成"

View file

@ -36,7 +36,6 @@ class GeminiStrategy extends ProviderStrategy {
}
async applySystemPromptFromFile(config, requestBody) {
console.log(`[System Prompt] Applying system prompt from ${config.SYSTEM_PROMPT_FILE_PATH} in '${config.SYSTEM_PROMPT_MODE}' mode for provider 'gemini'.`);
if (!config.SYSTEM_PROMPT_FILE_PATH) {
return requestBody;
}