mirror of
https://github.com/CJackHwang/ds2api.git
synced 2026-05-10 11:17:41 +08:00
411 lines
8.4 KiB
Markdown
411 lines
8.4 KiB
Markdown
# DS2API Deployment Guide
|
|
|
|
Language: [中文](DEPLOY.md) | [English](DEPLOY.en.md)
|
|
|
|
This document covers all supported DS2API deployment methods.
|
|
|
|
---
|
|
|
|
## Table of Contents
|
|
|
|
- [Vercel Deployment (Recommended)](#vercel-deployment-recommended)
|
|
- [Docker Deployment (Recommended)](#docker-deployment-recommended)
|
|
- [Local Development](#local-development)
|
|
- [Production Deployment](#production-deployment)
|
|
- [FAQ](#faq)
|
|
|
|
---
|
|
|
|
## Vercel Deployment (Recommended)
|
|
|
|
### One-click deployment
|
|
|
|
[](https://vercel.com/new/clone?repository-url=https%3A%2F%2Fgithub.com%2FCJackHwang%2Fds2api&env=DS2API_ADMIN_KEY&envDescription=Admin%20console%20access%20key%20%28required%29&envLink=https%3A%2F%2Fgithub.com%2FCJackHwang%2Fds2api%23environment-variables&project-name=ds2api&repository-name=ds2api)
|
|
|
|
### Steps
|
|
|
|
1. **Click the deploy button**
|
|
- Sign in to GitHub
|
|
- Authorize Vercel access
|
|
|
|
2. **Set environment variables**
|
|
- `DS2API_ADMIN_KEY`: Admin console password (**required**)
|
|
|
|
3. **Wait for deployment**
|
|
- Vercel builds and deploys automatically
|
|
- You will receive a deployment URL
|
|
|
|
4. **Configure accounts**
|
|
- Visit `https://your-project.vercel.app/admin`
|
|
- Log in with the admin key
|
|
- Add DeepSeek accounts
|
|
- Set custom API keys
|
|
|
|
5. **Sync configuration**
|
|
- Click "Sync to Vercel"
|
|
- The first sync requires a Vercel token and project ID
|
|
- After sync, the configuration is persisted
|
|
|
|
### Get Vercel credentials
|
|
|
|
**Vercel token**:
|
|
1. Visit https://vercel.com/account/tokens
|
|
2. Click "Create Token"
|
|
3. Set a name and expiration
|
|
4. Copy the token
|
|
|
|
**Project ID**:
|
|
1. Open your Vercel project
|
|
2. Go to Settings → General
|
|
3. Copy the "Project ID"
|
|
|
|
---
|
|
|
|
## Local Development
|
|
|
|
### Requirements
|
|
|
|
- Python 3.9+
|
|
- Node.js 18+ (WebUI development)
|
|
- pip
|
|
|
|
### Quick start
|
|
|
|
```bash
|
|
# 1. Clone the repo
|
|
git clone https://github.com/CJackHwang/ds2api.git
|
|
cd ds2api
|
|
|
|
# 2. Install Python dependencies
|
|
pip install -r requirements.txt
|
|
|
|
# 3. Configure accounts
|
|
cp config.example.json config.json
|
|
# Edit config.json and fill in DeepSeek account info
|
|
|
|
# 4. Start the service
|
|
python dev.py
|
|
```
|
|
|
|
### Config example
|
|
|
|
```json
|
|
{
|
|
"keys": ["my-api-key-1", "my-api-key-2"],
|
|
"accounts": [
|
|
{
|
|
"email": "your-email@example.com",
|
|
"password": "your-password",
|
|
"token": ""
|
|
},
|
|
{
|
|
"mobile": "12345678901",
|
|
"password": "your-password",
|
|
"token": ""
|
|
}
|
|
]
|
|
}
|
|
```
|
|
|
|
**Notes**:
|
|
- `keys`: Custom API keys for calling the service
|
|
- `accounts`: DeepSeek Web accounts
|
|
- Supports `email` or `mobile` login
|
|
- Leave `token` blank; it will be fetched automatically
|
|
|
|
### WebUI development
|
|
|
|
```bash
|
|
# Enter the WebUI directory
|
|
cd webui
|
|
|
|
# Install dependencies
|
|
npm install
|
|
|
|
# Start the dev server
|
|
npm run dev
|
|
```
|
|
|
|
The WebUI dev server runs on `http://localhost:5173` and proxies API requests to `http://localhost:5001`.
|
|
|
|
### WebUI build
|
|
|
|
Build artifacts are located in `static/admin/`.
|
|
|
|
**Automatic build (recommended)**:
|
|
- Vercel builds the WebUI during deployment (see `vercel.json` `buildCommand`)
|
|
- The GitHub Actions WebUI build workflow is disabled
|
|
- `static/admin/` build artifacts are no longer committed
|
|
|
|
**Manual build**:
|
|
```bash
|
|
# Option 1: use script
|
|
./scripts/build-webui.sh
|
|
|
|
# Option 2: run directly
|
|
cd webui
|
|
npm install
|
|
npm run build
|
|
```
|
|
|
|
> **Contributor note**: No manual build is required after modifying WebUI; Vercel deploys will build it automatically.
|
|
|
|
---
|
|
|
|
## Docker Deployment (Recommended)
|
|
|
|
Docker uses a **non-invasive, decoupled design**:
|
|
- Dockerfile executes standard Python steps and avoids hardcoded project configs
|
|
- WebUI is built during image build (for non-Vercel deployments)
|
|
- Configuration lives in environment variables and `.env`
|
|
- **Rebuild the image to update code without touching Docker config**
|
|
|
|
### Quick start (Docker Compose)
|
|
|
|
```bash
|
|
# 1. Copy the environment template
|
|
cp .env.example .env
|
|
# Edit .env with DS2API_ADMIN_KEY and DS2API_CONFIG_JSON
|
|
|
|
# 2. Start the service
|
|
docker-compose up -d
|
|
|
|
# 3. Check logs
|
|
docker-compose logs -f
|
|
|
|
# 4. Rebuild after code updates
|
|
docker-compose up -d --build
|
|
```
|
|
|
|
### Mount a config file
|
|
|
|
To use `config.json` instead of environment variables:
|
|
|
|
```yaml
|
|
# docker-compose.yml
|
|
services:
|
|
ds2api:
|
|
build: .
|
|
ports:
|
|
- "5001:5001"
|
|
environment:
|
|
- DS2API_ADMIN_KEY=your-admin-key
|
|
volumes:
|
|
- ./config.json:/app/config.json:ro
|
|
restart: unless-stopped
|
|
```
|
|
|
|
### Docker CLI deployment
|
|
|
|
```bash
|
|
# Build the image
|
|
docker build -t ds2api:latest .
|
|
|
|
# Run with env variables
|
|
docker run -d \
|
|
--name ds2api \
|
|
-p 5001:5001 \
|
|
-e DS2API_ADMIN_KEY=your-admin-key \
|
|
-e DS2API_CONFIG_JSON='{"keys":["api-key"],"accounts":[...]}' \
|
|
--restart unless-stopped \
|
|
ds2api:latest
|
|
|
|
# Or mount a config file
|
|
docker run -d \
|
|
--name ds2api \
|
|
-p 5001:5001 \
|
|
-e DS2API_ADMIN_KEY=your-admin-key \
|
|
-v $(pwd)/config.json:/app/config.json:ro \
|
|
--restart unless-stopped \
|
|
ds2api:latest
|
|
```
|
|
|
|
### Development mode (hot reload)
|
|
|
|
```bash
|
|
# Use the dev compose file to enable hot reload
|
|
docker-compose -f docker-compose.dev.yml up
|
|
```
|
|
|
|
Development mode:
|
|
- Source code is mounted into the container
|
|
- Log level set to DEBUG
|
|
- Reads local `config.json`
|
|
|
|
### Maintenance commands
|
|
|
|
```bash
|
|
# Check container status
|
|
docker-compose ps
|
|
|
|
# View logs
|
|
docker-compose logs -f ds2api
|
|
|
|
# Restart
|
|
docker-compose restart
|
|
|
|
# Stop
|
|
docker-compose down
|
|
|
|
# Full rebuild (clear cache)
|
|
docker-compose down
|
|
docker-compose build --no-cache
|
|
docker-compose up -d
|
|
```
|
|
|
|
---
|
|
|
|
## Production Deployment
|
|
|
|
### Using systemd (Linux)
|
|
|
|
1. **Create the service file**
|
|
|
|
```bash
|
|
sudo nano /etc/systemd/system/ds2api.service
|
|
```
|
|
|
|
```ini
|
|
[Unit]
|
|
Description=DS2API Service
|
|
After=network.target
|
|
|
|
[Service]
|
|
Type=simple
|
|
User=www-data
|
|
WorkingDirectory=/opt/ds2api
|
|
ExecStart=/usr/bin/python3 app.py
|
|
Restart=always
|
|
RestartSec=10
|
|
Environment=PORT=5001
|
|
Environment=DS2API_ADMIN_KEY=your-admin-key
|
|
|
|
[Install]
|
|
WantedBy=multi-user.target
|
|
```
|
|
|
|
2. **Start the service**
|
|
|
|
```bash
|
|
sudo systemctl daemon-reload
|
|
sudo systemctl enable ds2api
|
|
sudo systemctl start ds2api
|
|
```
|
|
|
|
3. **Check status**
|
|
|
|
```bash
|
|
sudo systemctl status ds2api
|
|
sudo journalctl -u ds2api -f
|
|
```
|
|
|
|
### Nginx reverse proxy
|
|
|
|
```nginx
|
|
server {
|
|
listen 80;
|
|
server_name api.yourdomain.com;
|
|
|
|
# SSL configuration (recommended)
|
|
# listen 443 ssl http2;
|
|
# ssl_certificate /path/to/cert.pem;
|
|
# ssl_certificate_key /path/to/key.pem;
|
|
|
|
location / {
|
|
proxy_pass http://127.0.0.1:5001;
|
|
proxy_http_version 1.1;
|
|
|
|
# Disable buffering for SSE
|
|
proxy_buffering off;
|
|
proxy_cache off;
|
|
|
|
# Connection settings
|
|
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;
|
|
|
|
# SSE timeouts
|
|
proxy_read_timeout 300s;
|
|
proxy_send_timeout 300s;
|
|
|
|
# Chunked transfer
|
|
chunked_transfer_encoding on;
|
|
tcp_nopush on;
|
|
tcp_nodelay on;
|
|
keepalive_timeout 120;
|
|
}
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## FAQ
|
|
|
|
### Q: What if account validation fails?
|
|
|
|
**A**: Check the following:
|
|
1. Confirm the DeepSeek account password is correct
|
|
2. Ensure the account is not banned or requires verification
|
|
3. Log in once in a browser
|
|
4. Check logs for detailed errors
|
|
|
|
### Q: Streaming responses disconnect?
|
|
|
|
**A**:
|
|
1. Check Nginx / reverse proxy config and ensure `proxy_buffering` is off
|
|
2. Increase `proxy_read_timeout`
|
|
3. Verify network stability
|
|
|
|
### Q: Configuration lost after Vercel deploy?
|
|
|
|
**A**:
|
|
1. Ensure you clicked "Sync to Vercel"
|
|
2. Verify the Vercel token is valid and unexpired
|
|
3. Ensure the project ID is correct
|
|
|
|
### Q: How to update to the latest version?
|
|
|
|
**Local deployment**:
|
|
```bash
|
|
git pull origin main
|
|
pip install -r requirements.txt
|
|
# Restart the service
|
|
```
|
|
|
|
**Docker deployment**:
|
|
```bash
|
|
# Pull the latest code
|
|
git pull origin main
|
|
|
|
# Rebuild and start (Docker config unchanged)
|
|
docker-compose up -d --build
|
|
```
|
|
|
|
**Vercel deployment**:
|
|
- The project auto-syncs from GitHub
|
|
- Or trigger a redeploy in the Vercel console
|
|
|
|
### Q: How do I view logs?
|
|
|
|
**Local dev**:
|
|
```bash
|
|
# Set log level
|
|
export LOG_LEVEL=DEBUG
|
|
python dev.py
|
|
```
|
|
|
|
**Vercel**:
|
|
- Vercel console → Project → Deployments → Logs
|
|
|
|
### Q: Token counting is inaccurate?
|
|
|
|
**A**: DS2API uses a heuristic estimate (characters / 4). The official OpenAI tokenizer may differ, so treat it as a reference only.
|
|
|
|
---
|
|
|
|
## Get Help
|
|
|
|
- **GitHub Issues**: https://github.com/CJackHwang/ds2api/issues
|
|
- **Docs**: https://github.com/CJackHwang/ds2api
|