zhouhui.jiang

update

<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$" vcs="Git" />
</component>
</project>
\ No newline at end of file
......@@ -13,7 +13,7 @@ API_CONFIG = {
"headers": {
"accept": "*/*",
"Content-Type": "application/json",
"Authorization": os.getenv("API_AUTHORIZATION", "Bearer 2.3e67bc239d7144bd9885cee8ffcbc8be"),
"Authorization": os.getenv("API_AUTHORIZATION", "Bearer 2.343fa30a6a4d42b6afe62bdd0570a50b"),
"Ver": os.getenv("API_VER", "033BD94B1168D7E4F0D644C3C95E35BF.D73E33B659AD1D6B7D181D1DF8D05760"),
"Referer": os.getenv("API_REFERER", "http://192.168.1.251/")
}
......
# 部署指南(无 root 权限)
## 一、服务器准备
1. 购买阿里云 ECS(Ubuntu 20.04+ 或 CentOS 7+)
2. 安全组开放端口:`22``2025`
3. SSH 连接服务器(使用普通用户,非 root)
## 二、检查环境
```bash
# 检查 Python 版本(需要 Python 3.8+)
python3 --version
# 如果没有 Python3,尝试安装(可能需要管理员协助)
# 或使用 conda/miniconda 等用户级 Python 环境
```
## 三、部署应用
### 1. 上传代码
```bash
# 方式1: 使用 scp(本地执行,替换 username 为你的用户名)
scp -r . username@服务器IP:~/langgraph/
# 方式2: 使用 Git
cd ~
git clone <仓库地址> langgraph
# 方式3: 使用 FTP/SFTP 工具上传到 ~/langgraph/
```
### 2. 安装依赖
```bash
cd ~/langgraph
python3 -m venv venv
source venv/bin/activate
pip install --upgrade pip
pip install -r requirements.txt
pip install uvicorn python-dotenv
```
### 3. 配置环境变量
```bash
cd ~/langgraph
vim .env
```
添加内容:
```env
OPENAI_API_KEY=your-api-key
OPENAI_BASE_URL=https://api.deepseek.com/v1
```
### 4. 创建日志目录
```bash
mkdir -p ~/langgraph/logs
```
## 四、启动服务
### 方式1: 使用启动脚本(推荐)
```bash
cd ~/langgraph
chmod +x deploy/start.sh deploy/stop.sh deploy/restart.sh
# 启动服务
./deploy/start.sh
# 停止服务
./deploy/stop.sh
# 重启服务
./deploy/restart.sh
```
### 方式2: 使用 nohup 后台运行
```bash
cd ~/langgraph
source venv/bin/activate
nohup python start_server_direct.py > logs/app.log 2>&1 &
echo $! > logs/app.pid # 保存进程ID
```
### 方式3: 使用 screen(推荐用于长时间运行)
```bash
# 安装 screen(如果未安装,可能需要管理员协助)
# 或使用 tmux
# 创建 screen 会话
screen -S langgraph
# 在 screen 中启动
cd ~/langgraph
source venv/bin/activate
python start_server_direct.py
# 按 Ctrl+A 然后按 D 退出 screen(服务继续运行)
# 重新连接 screen
screen -r langgraph
```
### 方式4: 使用 tmux
```bash
# 创建 tmux 会话
tmux new -s langgraph
# 在 tmux 中启动
cd ~/langgraph
source venv/bin/activate
python start_server_direct.py
# 按 Ctrl+B 然后按 D 退出 tmux(服务继续运行)
# 重新连接 tmux
tmux attach -t langgraph
```
## 五、验证部署
```bash
# 检查服务是否运行
curl http://localhost:2025/ok
# 或从外部访问(替换为你的服务器IP)
curl http://服务器IP:2025/ok
# 查看日志
tail -f ~/langgraph/logs/app.log
# 检查进程
ps aux | grep start_server_direct
```
## 六、进程管理
### 查看进程
```bash
# 查看进程ID
cat ~/langgraph/logs/app.pid
# 查看进程状态
ps -p $(cat ~/langgraph/logs/app.pid 2>/dev/null)
```
### 停止服务
```bash
# 如果使用启动脚本
~/langgraph/deploy/stop.sh
# 如果使用 nohup
kill $(cat ~/langgraph/logs/app.pid)
# 如果使用 screen
screen -S langgraph -X quit
# 如果使用 tmux
tmux kill-session -t langgraph
# 手动查找并杀死进程
ps aux | grep start_server_direct | grep -v grep | awk '{print $2}' | xargs kill
```
### 重启服务
```bash
# 使用启动脚本
~/langgraph/deploy/restart.sh
# 或手动停止后重新启动
./deploy/stop.sh
./deploy/start.sh
```
## 七、更新代码
```bash
cd ~/langgraph
# 停止服务
./deploy/stop.sh
# 更新代码(根据你的方式)
git pull
# 或重新上传文件
# 更新依赖(如果有新依赖)
source venv/bin/activate
pip install -r requirements.txt
# 重启服务
./deploy/start.sh
```
## 八、日志管理
```bash
# 查看实时日志
tail -f ~/langgraph/logs/app.log
# 查看最近100行
tail -n 100 ~/langgraph/logs/app.log
# 查看错误日志
grep -i error ~/langgraph/logs/app.log
# 清空日志(谨慎使用)
> ~/langgraph/logs/app.log
```
## 九、开机自启(可选)
### 方法1: 添加到 ~/.bashrc 或 ~/.profile
```bash
# 编辑 ~/.bashrc
vim ~/.bashrc
# 添加以下内容(如果是交互式登录,使用 ~/.profile)
if [ -f ~/langgraph/deploy/start.sh ]; then
~/langgraph/deploy/start.sh
fi
```
**注意**:这种方法会在每次登录时启动,可能不是最佳选择。
### 方法2: 使用 cron(推荐)
```bash
# 编辑 crontab
crontab -e
# 添加以下行(服务器重启后自动启动)
@reboot sleep 30 && /bin/bash ~/langgraph/deploy/start.sh
```
## 十、故障排查
### 服务无法启动
```bash
# 检查 Python 环境
cd ~/langgraph
source venv/bin/activate
python --version
which python
# 检查依赖
pip list | grep langgraph
# 手动测试启动
python start_server_direct.py
```
### 端口被占用
```bash
# 查看端口占用
lsof -i :2025
# 或
netstat -tlnp | grep 2025
# 杀死占用进程
kill -9 <PID>
```
### 无法访问服务
1. **检查防火墙**:确认阿里云安全组已开放端口 2025
2. **检查服务状态**`ps aux | grep start_server_direct`
3. **检查日志**`tail -f ~/langgraph/logs/app.log`
4. **测试本地访问**`curl http://localhost:2025/ok`
### API 密钥错误
```bash
# 检查 .env 文件
cat ~/langgraph/.env
# 测试环境变量
cd ~/langgraph
source venv/bin/activate
python -c "import os; from dotenv import load_dotenv; load_dotenv(); print(os.getenv('OPENAI_API_KEY'))"
```
## 常用命令速查
```bash
# 启动服务
~/langgraph/deploy/start.sh
# 停止服务
~/langgraph/deploy/stop.sh
# 重启服务
~/langgraph/deploy/restart.sh
# 查看状态
ps aux | grep start_server_direct | grep -v grep
# 查看日志
tail -f ~/langgraph/logs/app.log
# 测试服务
curl http://localhost:2025/ok
```
## 注意事项
1. **端口权限**:端口 2025 > 1024,普通用户可以使用,无需 root
2. **目录权限**:确保 `~/langgraph` 目录有读写权限
3. **日志轮转**:定期清理日志文件,避免占用过多磁盘空间
4. **进程监控**:建议定期检查进程是否正常运行
5. **备份**:定期备份代码和 `.env` 文件
## 部署检查清单
- [ ] 代码已上传到 `~/langgraph`
- [ ] 虚拟环境已创建
- [ ] 依赖已安装
- [ ] `.env` 文件已配置 API 密钥
- [ ] 服务已启动
- [ ] 可以访问 `http://服务器IP:2025/ok`
- [ ] 日志输出正常
- [ ] 阿里云安全组已开放端口 2025
[Unit]
Description=LangGraph Application
After=network.target
[Service]
Type=simple
User=root
WorkingDirectory=/opt/langgraph
Environment="PATH=/opt/langgraph/venv/bin"
EnvironmentFile=/opt/langgraph/.env
ExecStart=/opt/langgraph/venv/bin/python /opt/langgraph/start_server_direct.py
Restart=always
RestartSec=10
StandardOutput=journal
StandardError=journal
[Install]
WantedBy=multi-user.target
server {
listen 80;
server_name _;
client_max_body_size 50M;
location / {
proxy_pass http://127.0.0.1:2025;
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_cache_bypass $http_upgrade;
}
location /ws {
proxy_pass http://127.0.0.1:2025;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
}
}
#!/bin/bash
# 重启 LangGraph 服务
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
echo "正在重启 LangGraph 服务..."
"$SCRIPT_DIR/stop.sh"
sleep 2
"$SCRIPT_DIR/start.sh"
#!/bin/bash
# 启动 LangGraph 服务
APP_DIR="$HOME/langgraph"
LOG_DIR="$APP_DIR/logs"
PID_FILE="$LOG_DIR/app.pid"
LOG_FILE="$LOG_DIR/app.log"
# 创建日志目录
mkdir -p "$LOG_DIR"
# 检查是否已在运行
if [ -f "$PID_FILE" ]; then
PID=$(cat "$PID_FILE")
if ps -p "$PID" > /dev/null 2>&1; then
echo "服务已在运行 (PID: $PID)"
exit 1
else
rm -f "$PID_FILE"
fi
fi
# 检查应用目录
if [ ! -d "$APP_DIR" ]; then
echo "错误: 应用目录不存在: $APP_DIR"
exit 1
fi
# 进入应用目录
cd "$APP_DIR" || exit 1
# 激活虚拟环境
if [ ! -d "venv" ]; then
echo "错误: 虚拟环境不存在,请先创建虚拟环境"
exit 1
fi
source venv/bin/activate
# 检查 .env 文件
if [ ! -f ".env" ]; then
echo "警告: .env 文件不存在,请先配置环境变量"
fi
# 启动服务
echo "正在启动 LangGraph 服务..."
nohup python start_server_direct.py > "$LOG_FILE" 2>&1 &
PID=$!
# 保存进程ID
echo $PID > "$PID_FILE"
# 等待一下,检查进程是否启动成功
sleep 2
if ps -p "$PID" > /dev/null 2>&1; then
echo "✅ 服务已启动 (PID: $PID)"
echo "📝 日志文件: $LOG_FILE"
echo "🌐 访问地址: http://$(hostname -I | awk '{print $1}'):2025"
echo "📊 查看日志: tail -f $LOG_FILE"
else
echo "❌ 服务启动失败,请查看日志: $LOG_FILE"
rm -f "$PID_FILE"
exit 1
fi
#!/bin/bash
# 查看 LangGraph 服务状态
APP_DIR="$HOME/langgraph"
PID_FILE="$APP_DIR/logs/app.pid"
echo "LangGraph 服务状态"
echo "=================="
echo ""
if [ -f "$PID_FILE" ]; then
PID=$(cat "$PID_FILE")
if ps -p "$PID" > /dev/null 2>&1; then
echo "✅ 服务正在运行"
echo " PID: $PID"
echo " 进程信息:"
ps -p "$PID" -o pid,ppid,cmd,etime,pcpu,pmem
echo ""
echo "📊 端口监听:"
netstat -tlnp 2>/dev/null | grep ":2025 " || ss -tlnp 2>/dev/null | grep ":2025 " || echo " 未检测到端口监听"
echo ""
echo "📝 日志文件: $APP_DIR/logs/app.log"
echo ""
echo "🧪 测试连接:"
if curl -s http://localhost:2025/ok > /dev/null 2>&1; then
echo " ✅ 服务响应正常"
else
echo " ⚠️ 服务无响应"
fi
else
echo "❌ 服务未运行(PID 文件存在但进程不存在)"
rm -f "$PID_FILE"
fi
else
echo "❌ 服务未运行"
PID=$(ps aux | grep start_server_direct.py | grep -v grep | awk '{print $2}' | head -1)
if [ -n "$PID" ]; then
echo " 警告: 发现未管理的进程 (PID: $PID)"
echo " 使用以下命令停止: kill $PID"
fi
fi
#!/bin/bash
# 停止 LangGraph 服务
APP_DIR="$HOME/langgraph"
PID_FILE="$APP_DIR/logs/app.pid"
if [ ! -f "$PID_FILE" ]; then
echo "PID 文件不存在,尝试查找进程..."
PID=$(ps aux | grep start_server_direct.py | grep -v grep | awk '{print $2}' | head -1)
if [ -z "$PID" ]; then
echo "服务未运行"
exit 0
fi
else
PID=$(cat "$PID_FILE")
fi
if ps -p "$PID" > /dev/null 2>&1; then
echo "正在停止服务 (PID: $PID)..."
kill "$PID"
# 等待进程结束
for i in {1..10}; do
if ! ps -p "$PID" > /dev/null 2>&1; then
echo "✅ 服务已停止"
rm -f "$PID_FILE"
exit 0
fi
sleep 1
done
# 如果还在运行,强制杀死
if ps -p "$PID" > /dev/null 2>&1; then
echo "强制停止服务..."
kill -9 "$PID"
sleep 1
fi
rm -f "$PID_FILE"
echo "✅ 服务已停止"
else
echo "服务未运行"
rm -f "$PID_FILE"
fi