feat(docker): 添加Docker支持和部署指南
新增Dockerfile、.dockerignore和健康检查脚本,支持通过Docker部署服务。添加了详细的部署文档和自动化脚本,便于在不同环境下快速启动和配置服务。同时优化了系统提示词应用逻辑,移除了调试日志输出。
This commit is contained in:
parent
fcf6389856
commit
5f0cd6ad83
8 changed files with 339 additions and 1 deletions
23
.dockerignore
Normal file
23
.dockerignore
Normal 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
44
Dockerfile
Normal 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
93
README.Docker.md
Normal 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
|
||||||
|
|
@ -207,6 +207,12 @@
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
## 🐳 Docker 部署
|
||||||
|
|
||||||
|
项目支持通过 Docker 进行部署,详细指南请参阅 [Docker部署指南](./README.Docker.md)。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
### 4. 调用 API
|
### 4. 调用 API
|
||||||
|
|
||||||
> **提示**: 如果您在无法直接访问 Google/OpenAI/Claude/Kiro 服务的环境中使用,请先为您的终端设置全局 HTTP/HTTPS 代理。
|
> **提示**: 如果您在无法直接访问 Google/OpenAI/Claude/Kiro 服务的环境中使用,请先为您的终端设置全局 HTTP/HTTPS 代理。
|
||||||
|
|
|
||||||
46
healthcheck.js
Normal file
46
healthcheck.js
Normal 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
65
run-docker.bat
Normal 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
62
run-docker.sh
Normal 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 "脚本执行完成"
|
||||||
|
|
@ -36,7 +36,6 @@ class GeminiStrategy extends ProviderStrategy {
|
||||||
}
|
}
|
||||||
|
|
||||||
async applySystemPromptFromFile(config, requestBody) {
|
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) {
|
if (!config.SYSTEM_PROMPT_FILE_PATH) {
|
||||||
return requestBody;
|
return requestBody;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue