本指南详细介绍如何在不同环境中部署和运行 b4u2cc 的 Deno 代理服务器。
Deno Deploy 是 Deno 官方的无服务器平台,可以一键部署 b4u2cc 代理服务器,无需管理服务器基础设施。
- Deno 账户: 访问 Deno Deploy 注册账户
- GitHub 仓库: 将项目推送到 GitHub 仓库
- 访问 Deno Deploy 控制台
- 点击 "New Project"
- 选择 "Deploy from GitHub"
- 授权访问您的 GitHub 仓库
- 选择 b4u2cc 仓库
- 配置部署设置:
- 入口点:
deno-proxy/src/main.ts - 环境变量: 添加必要的环境变量
UPSTREAM_BASE_URL=your-upstream-api-url UPSTREAM_API_KEY=your-api-key PORT=3456
- 入口点:
- 点击 "Deploy"
- 安装 deployctl:
deno install -gArf jsr:@deno/deployctl- 登录 Deno Deploy:
deployctl login- 部署项目:
# 从项目根目录执行
deployctl deploy --project=b4u2cc-proxy deno-proxy/src/main.ts项目已配置 GitHub Actions 工作流,推送到 main 分支会自动部署:
- 在 Deno Deploy 控制台创建项目
- 获取项目访问令牌
- 在 GitHub 仓库设置中添加 Secret:
- 名称:
DENO_DEPLOY_TOKEN - 值: 您的 Deno Deploy 访问令牌
- 名称:
- 推送代码到 main 分支即可自动部署
项目使用标准的 deno.json 配置文件,Deno Deploy 会自动识别以下配置:
{
"tasks": {
"start": "deno run --allow-net --allow-env deno-proxy/src/main.ts",
"dev": "deno run --allow-net --allow-env --watch deno-proxy/src/main.ts"
},
"imports": {
"js-tiktoken": "npm:js-tiktoken@^1.0.7"
}
}重要说明:
- Deno Deploy 不使用自定义的
deno.deploy.json文件 - 入口点通过部署界面或 CLI 参数指定
- 环境变量在部署时通过 UI 或 CLI 设置
在 Deno Deploy 中配置以下环境变量:
| 变量名 | 说明 | 示例值 |
|---|---|---|
UPSTREAM_BASE_URL |
上游 API 地址 | https://api.openai.com/v1/chat/completions |
UPSTREAM_API_KEY |
上游 API 密钥 | sk-... |
UPSTREAM_MODEL |
可选,强制覆盖模型 | gpt-4 |
CLIENT_API_KEY |
可选,客户端认证密钥 | your-client-key |
PORT |
服务端口 | 3456 |
TOKEN_MULTIPLIER |
Token 计数倍数 | 1.0 |
LOG_LEVEL |
日志级别 | info |
- 在 Deno Deploy 控制台中,点击项目设置
- 添加自定义域名
- 配置 DNS 记录:
# CNAME 记录 your-domain.com. CNAME deno-deploy.net. # 或使用 ANAME/ALIAS your-domain.com. ANAME deno-deploy.net.
- 实时日志: 在 Deno Deploy 控制台查看实时日志
- 指标: 监控请求量、错误率和响应时间
- 告警: 设置错误率或响应时间告警
- 操作系统: Linux (推荐)、macOS、Windows
- 内存: 最低 512MB,推荐 2GB+
- CPU: 1核心以上
- 网络: 稳定的互联网连接
- 存储: 100MB 可用空间
# 使用官方安装脚本
curl -fsSL https://deno.land/install.sh | sh
# 或使用包管理器
# macOS (Homebrew)
brew install deno
# Ubuntu/Debian
sudo apt update && sudo apt install deno
# Arch Linux
sudo pacman -S deno# 使用 PowerShell
iwr https://deno.land/install.ps1 -useb | iex
# 或使用 Chocolatey
choco install deno
# 或使用 Scoop
scoop install denodeno --version- 克隆项目
git clone <repository-url>
cd b4u2cc- 配置环境变量
# 创建 .env 文件
cat > .env << EOF
UPSTREAM_BASE_URL=http://your-upstream-api/v1/chat/completions
UPSTREAM_API_KEY=your-upstream-api-key
PORT=3456
HOST=0.0.0.0
EOF- 启动服务
cd deno-proxy
deno run --allow-net --allow-env src/main.ts使用 deno.json 中定义的开发任务:
cd deno-proxy
deno task dev# 健康检查
curl http://localhost:3456/healthz
# 发送测试请求
./scripts/test-proxy.sh
# 测试思考模式
./scripts/test-thinking-mode.sh- 创建专用用户
sudo useradd -r -s /bin/false deno
sudo mkdir -p /opt/b4u2cc
sudo chown deno:deno /opt/b4u2cc- 部署应用文件
sudo cp -r . /opt/b4u2cc/
sudo chown -R deno:deno /opt/b4u2cc- 创建环境配置
sudo tee /opt/b4u2cc/.env > /dev/null <<EOF
UPSTREAM_BASE_URL=http://your-upstream-api/v1/chat/completions
UPSTREAM_API_KEY=your-upstream-api-key
PORT=3456
HOST=0.0.0.0
LOG_LEVEL=info
MAX_REQUESTS_PER_MINUTE=60
TIMEOUT_MS=120000
EOF- 创建 systemd 服务
sudo tee /etc/systemd/system/b4u2cc.service > /dev/null <<EOF
[Unit]
Description=b4u2cc Proxy Server
After=network.target
[Service]
Type=simple
User=deno
Group=deno
WorkingDirectory=/opt/b4u2cc/deno-proxy
EnvironmentFile=/opt/b4u2cc/.env
ExecStart=/usr/local/bin/deno run --allow-net --allow-env --allow-read --allow-write src/main.ts
Restart=always
RestartSec=10
StandardOutput=journal
StandardError=journal
# 安全设置
NoNewPrivileges=true
PrivateTmp=true
ProtectSystem=strict
ProtectHome=true
ReadWritePaths=/opt/b4u2cc/logs
[Install]
WantedBy=multi-user.target
EOF- 启动和启用服务
sudo systemctl daemon-reload
sudo systemctl enable b4u2cc
sudo systemctl start b4u2cc
sudo systemctl status b4u2cc- 查看日志
# 实时日志
sudo journalctl -u b4u2cc -f
# 最近日志
sudo journalctl -u b4u2cc --since "1 hour ago"server {
listen 80;
server_name your-domain.com;
location / {
proxy_pass http://127.0.0.1:3456;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_cache_bypass $http_upgrade;
# 流式响应支持
proxy_buffering off;
proxy_cache off;
}
}<VirtualHost *:80>
ServerName your-domain.com
ProxyPreserveHost On
ProxyRequests Off
ProxyPass / http://127.0.0.1:3456/
ProxyPassReverse / http://127.0.0.1:3456/
# 启用支持
ProxyPass /v1/messages ws://127.0.0.1:3456/v1/messages
</VirtualHost>- 创建 Dockerfile
# 多阶段构建
FROM denoland/deno:1.40.0 AS builder
WORKDIR /app
COPY deno-proxy/ .
RUN deno cache src/main.ts
FROM denoland/deno:1.40.0-alpine
WORKDIR /app
COPY --from=builder /app .
COPY --from=builder /root/.cache/deno /root/.cache/deno
EXPOSE 3456
# 非root用户运行
USER deno
CMD ["run", "--allow-net", "--allow-env", "--allow-read", "--allow-write", "src/main.ts"]- 构建 Docker 镜像
docker build -t b4u2cc-proxy:latest .- 运行容器
docker run -d \
--name b4u2cc-proxy \
-p 3456:3456 \
-e UPSTREAM_BASE_URL=http://your-upstream-api/v1/chat/completions \
-e UPSTREAM_API_KEY=your-api-key \
-e PORT=3456 \
-e LOG_LEVEL=info \
--restart unless-stopped \
b4u2cc-proxy:latest创建 docker-compose.yml:
version: '3.8'
services:
b4u2cc-proxy:
build:
context: .
dockerfile: Dockerfile
ports:
- "3456:3456"
environment:
- UPSTREAM_BASE_URL=${UPSTREAM_BASE_URL}
- UPSTREAM_API_KEY=${UPSTREAM_API_KEY}
- PORT=3456
- LOG_LEVEL=info
- MAX_REQUESTS_PER_MINUTE=60
- TOKEN_MULTIPLIER=1.0
restart: unless-stopped
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:3456/healthz"]
interval: 30s
timeout: 10s
retries: 3
volumes:
- ./logs:/app/logs
networks:
- b4u2cc-network
nginx:
image: nginx:alpine
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
- ./ssl:/etc/nginx/ssl
depends_on:
- b4u2cc-proxy
restart: unless-stopped
networks:
- b4u2cc-network
networks:
b4u2cc-network:
driver: bridge创建 .env 文件:
UPSTREAM_BASE_URL=http://your-upstream-api/v1/chat/completions
UPSTREAM_API_KEY=your-api-key启动服务:
docker-compose up -d- 创建
vercel.json:
{
"version": 2,
"builds": [
{
"src": "deno-proxy/src/main.ts",
"use": "@vercel/deno"
}
],
"routes": [
{
"src": "/(.*)",
"dest": "deno-proxy/src/main.ts"
}
],
"env": {
"UPSTREAM_BASE_URL": "@upstream-base-url",
"UPSTREAM_API_KEY": "@upstream-api-key"
}
}- 部署
vercel --prod- 创建
railway.toml:
[build]
builder = "nixpacks"
[deploy]
healthcheckPath = "/healthz"
healthcheckTimeout = 100
restartPolicyType = "on_failure"
restartPolicyMaxRetries = 10
[[services]]
name = "b4u2cc-proxy"
[services.variables]
PORT = "3456"- 部署
railway login
railway init
railway up- 创建
.do/app.yaml:
name: b4u2cc-proxy
services:
- name: proxy
source_dir: deno-proxy
run_command: deno run --allow-net --allow-env src/main.ts
environment_slug: deno
instance_count: 1
instance_size_slug: basic-xxs
env:
- key: PORT
value: "3456"
- key: UPSTREAM_BASE_URL
value: ${UPSTREAM_BASE_URL}
- key: UPSTREAM_API_KEY
value: ${UPSTREAM_API_KEY}
http_port: 3456
routes:
- path: /- 调整 Deno 运行时参数
deno run --allow-net --allow-env \
--v8-flags=--max-old-space-size=2048 \
src/main.ts- 配置环境变量
# 减少日志输出
LOG_LEVEL=warn
LOGGING_DISABLED=true
# 优化聚合间隔
AGGREGATION_INTERVAL_MS=50
# 调整超时时间
TIMEOUT_MS=60000- 增加请求限制
MAX_REQUESTS_PER_MINUTE=120- 使用连接池
# 在上游 API 支持的情况下
UPSTREAM_CONNECTION_POOL_SIZE=10- 响应缓存
# 启用简单缓存(如果适用)
ENABLE_CACHE=true
CACHE_TTL_SECONDS=300创建健康检查脚本:
#!/bin/bash
# health-check.sh
HEALTH_URL="http://localhost:3456/healthz"
RESPONSE=$(curl -s -o /dev/null -w "%{http_code}" $HEALTH_URL)
if [ $RESPONSE -eq 200 ]; then
echo "Service is healthy"
exit 0
else
echo "Service is unhealthy (HTTP $RESPONSE)"
exit 1
fi- 日志轮转配置
# 创建 logrotate 配置
sudo tee /etc/logrotate.d/b4u2cc > /dev/null <<EOF
/opt/b4u2cc/logs/*.log {
daily
missingok
rotate 30
compress
delaycompress
notifempty
create 644 deno deno
postrotate
systemctl reload b4u2cc
endscript
}
EOF- 集中日志收集
# 使用 rsyslog 转发到日志服务器
echo "*.* @@logserver:514" | sudo tee -a /etc/rsyslog.conf- Prometheus 指标(需要集成)
// 在 main.ts 中添加指标收集
import { serve } from "https://deno.land/std/http/server.ts";
let requestCount = 0;
let errorCount = 0;
// 在请求处理中更新指标
requestCount++;
// 暴露指标端点
if (req.url === "/metrics") {
return new Response(`
# HELP requests_total Total number of requests
# TYPE requests_total counter
requests_total ${requestCount}
# HELP errors_total Total number of errors
# TYPE errors_total counter
errors_total ${errorCount}
`);
}- 配置文件备份
#!/bin/bash
# backup-config.sh
BACKUP_DIR="/opt/backups/b4u2cc"
DATE=$(date +%Y%m%d_%H%M%S)
mkdir -p $BACKUP_DIR
# 备份配置文件
cp /opt/b4u2cc/.env $BACKUP_DIR/env_$DATE
cp -r /opt/b4u2cc/deno-proxy $BACKUP_DIR/deno-proxy_$DATE
# 清理旧备份(保留30天)
find $BACKUP_DIR -name "*.tar.gz" -mtime +30 -delete- 自动重启脚本
#!/bin/bash
# auto-restart.sh
SERVICE_NAME="b4u2cc"
MAX_RETRIES=3
RETRY_DELAY=10
for i in $(seq 1 $MAX_RETRIES); do
if systemctl is-active --quiet $SERVICE_NAME; then
echo "Service is running"
exit 0
fi
echo "Restarting service (attempt $i/$MAX_RETRIES)"
systemctl restart $SERVICE_NAME
sleep $RETRY_DELAY
done
echo "Failed to restart service after $MAX_RETRIES attempts"
exit 1# UFW 配置
sudo ufw allow 22/tcp
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw deny 3456/tcp # 只允许本地访问
sudo ufw enable使用 Let's Encrypt:
# 安装 certbot
sudo apt install certbot python3-certbot-nginx
# 获取证书
sudo certbot --nginx -d your-domain.com
# 自动续期
sudo crontab -e
# 添加: 0 12 * * * /usr/bin/certbot renew --quiet# 配置客户端 API 密钥
export CLIENT_API_KEY="your-secure-client-key"
# 在 Nginx 中添加 IP 限制
location / {
allow 192.168.1.0/24;
allow 10.0.0.0/8;
deny all;
proxy_pass http://127.0.0.1:3456;
}-
服务无法启动
# 检查日志 journalctl -u b4u2cc -n 50 # 检查配置 deno run --allow-net --allow-env --check src/main.ts # 检查端口占用 netstat -tlnp | grep 3456
-
上游连接失败
# 测试上游连接 curl -H "Authorization: Bearer $UPSTREAM_API_KEY" \ $UPSTREAM_BASE_URL # 检查网络路由 traceroute upstream-host
-
内存泄漏
# 监控内存使用 ps aux | grep deno # 使用 Deno 分析器 deno run --allow-net --allow-env --v8-flags=--prof src/main.ts
- 使用 Deno 内置分析器
deno run --allow-net --allow-env --v8-flags=--prof src/main.ts- 火焰图生成
# 安装 pprof
go install github.com/google/pprof@latest
# 分析性能数据
pprof -http=:8080 isolate-*.log这个部署指南涵盖了从本地开发到生产环境的各种部署场景,包括性能优化、监控维护和安全配置等关键方面。