- 项目体验: https://sd.of.ci demo/demo (请不要修改密码)
项目域名whois查询及到期时间自动同步提醒,使用自建whoisApi,支持300+种域名查询体验:
- 快速体验https://whois.of.ci 开源仓库:
- whoisApi项目主页: https://github.com/rikouu/whoisapi
Serdo 是一个专为中小团队和个人运维设计的现代化管理面板,用于集中管理服务器(VPS/独立服务器/云主机)、域名和服务商账号。提供健康监控、到期提醒、DNS同步、WebSSH终端等实用功能,支持本地存储和API模式,可快速部署到任何环境。
- 🏢 中小团队: 统一管理多个服务器和域名资产
- 👤 个人开发者: 轻松追踪自己的云资源
- 🔧 运维人员: 集中化的运维管理工具
- 📊 资产管理: 服务器、域名到期提醒和健康监控
- ✅ TypeScript 100%: 完整的类型安全保障
- ✅ 零类型错误: 通过所有 TypeScript 类型检查
- ✅ 构建优化: 智能代码分割,优化包体积
- ✅ 生产就绪: 完整的测试和文档
- ✅ 统一管理多台服务器(IP、配置、状态)
- ✅ 健康检查与可达性监控
- ✅ WebSSH 在线终端(支持多终端)
- ✅ 面板信息管理(URL、账号、密码)
- ✅ SSH 配置管理(端口、用户名、密码)
- ✅ 到期时间提醒
- ✅ 自定义排序和分组
- ✅ 域名注册商信息管理
- ✅ DNS 服务商信息管理
- ✅ DNS 记录可视化编辑
- ✅ WHOIS 信息自动同步
- ✅ 域名到期状态监控
- ✅ Name Server 信息显示
- ✅ 批量 DNS 同步功能
- ✅ 禁用自动覆盖选项
- ✅ 集中管理服务器/域名服务商
- ✅ 登录信息安全存储
- ✅ 支付方式记录(信用卡/支付宝/微信等)
- ✅ 账户标识管理
- ✅ 自定义分类和排序
- ✅ AES-256-GCM 加密存储: 所有敏感数据落盘加密
- ✅ JWT 认证: 安全的用户认证机制
- ✅ 密码哈希: bcrypt 加密用户密码
- ✅ 脱敏模式: 生产环境API不返回明文密码
- ✅ WebCrypto 本地解密: 浏览器端解密,不传输明文
- ✅ CORS 配置: 精细化跨域控制
- ✅ 速率限制: 防止API滥用(默认300次/分钟)
- ✅ SSH 密码限制: 默认禁止明文SSH密码
- ✅ 环境变量隔离: 敏感配置独立管理
- ✅ 实时健康监控: 服务器可达性检查
- ✅ 到期提醒: 域名/服务器到期通知
- ✅ Bark 通知: iOS 推送通知支持
- ✅ SMTP 邮件: 邮件通知支持
- ✅ 审计日志: 操作记录追踪
- ✅ 数据导入导出: JSON 格式备份
- ✅ 批量操作: 批量检查、同步
- ✅ 搜索过滤: 快速查找资源
- ✅ 自定义排序: 拖拽排序支持
- ✅ 多语言: 中文/英文切换
- 前端: React 19 + TypeScript 5.8 + Vite 6
- 后端: Node.js + Express + RESTful API
- 数据库: SQLite (默认) + JSON (备选)
- UI组件: Lucide React + Recharts
- 终端: Xterm.js + SSH2
- 类型安全: 100% TypeScript,零类型错误
- Docker 容器化: 一键部署
- 传统部署: systemd + Nginx
- 1Panel 集成: 可视化部署
- 前后端分离: 支持同域/分域部署
- 智能代码分割: 按需加载,减少首屏体积
- Gzip 压缩: 生产环境自动压缩
- CDN 就绪: 静态资源缓存优化
- 懒加载: 大型组件动态加载
- Node.js >= 18.0.0
- npm >= 10.0.0
- 操作系统: Linux / macOS / Windows
git clone https://github.com/your-username/serdo.git
cd serdo# 安装前端依赖
npm install
# 安装后端依赖
cd api
npm install
cd ..建议:使用模版 env 文件进行配置,分别复制前端和后端的环境变量示例文件:
# 复制前端环境变量模版为实际配置
cp .env.example .env.local
# 复制后端环境变量模版为实际配置
cp api/.env.example api/.env手动编辑:
前端配置 (.env.local):
VITE_API_BASE_URL=http://localhost:4000/api/v1后端配置 (api/.env):
# 必需配置
AUTH_SECRET=your_strong_random_secret_key_here
CORS_ORIGIN=http://localhost:3000
# 可选配置
PORT=4000
USE_SQLITE=true
REDACT_MODE=false
RATE_LIMIT_MAX=300
API_SSH_ALLOW_PASSWORD=false启动后端:
cd api
AUTH_SECRET=your_secret_key node server.js
# 或使用 .env 文件
node server.js启动前端:
npm run dev打开浏览器访问: http://localhost:3000
默认账号: admin / admin (首次访问自动创建)
# 1. 克隆项目
git clone https://github.com/your-username/serdo.git
cd serdo
# 2. 配置环境变量
cp api/.env.example api/.env
# 编辑 api/.env,设置 AUTH_SECRET 等
# 3. 启动服务
docker-compose up -d
# 4. 访问应用
# 前端: http://localhost:3000
# 后端: http://localhost:4000version: '3.8'
services:
api:
build:
context: ./api
environment:
- PORT=4000
- AUTH_SECRET=${AUTH_SECRET}
- USE_SQLITE=true
- REDACT_MODE=true
ports:
- "4000:4000"
volumes:
- ./api/data:/app/data
restart: unless-stopped
web:
build:
context: .
dockerfile: Dockerfile.web
ports:
- "3000:80"
depends_on:
- api
restart: unless-stopped# 安装 Node.js (使用 nvm 推荐)
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash
nvm install 18
nvm use 18
# 安装 Nginx
sudo apt update
sudo apt install nginx -y
# 安装 SQLite (可选,如需查看数据库)
sudo apt install sqlite3 -y# 本地打包
bash scripts/release.sh
# 上传到服务器 /opt/serdo
scp release/serdo-release-*.zip user@your-server:/opt/
ssh user@your-server
cd /opt
unzip serdo-release-*.zipcd /opt/serdo/api
# 安装依赖
npm install --production
# 配置环境变量
cat > .env << 'EOF'
AUTH_SECRET=$(openssl rand -base64 48)
PORT=4000
USE_SQLITE=true
REDACT_MODE=true
CORS_ORIGIN=https://serdo.example.com
RATE_LIMIT_MAX=300
API_SSH_ALLOW_PASSWORD=false
EOF
# 创建数据目录
mkdir -p data
chmod 700 datasudo tee /etc/systemd/system/serdo-api.service > /dev/null << 'EOF'
[Unit]
Description=Serdo API Service
After=network.target
[Service]
Type=simple
User=www-data
WorkingDirectory=/opt/serdo/api
EnvironmentFile=/opt/serdo/api/.env
ExecStart=/usr/bin/node server.js
Restart=always
RestartSec=3
StandardOutput=journal
StandardError=journal
[Install]
WantedBy=multi-user.target
EOF
# 启动服务
sudo systemctl daemon-reload
sudo systemctl enable serdo-api
sudo systemctl start serdo-api
sudo systemctl status serdo-apicd /opt/serdo
# 配置生产环境变量
cat > .env.production << 'EOF'
VITE_API_BASE_URL=/api/v1
EOF
# 构建
npm install --production
npm run buildsudo tee /etc/nginx/sites-available/serdo << 'EOF'
server {
listen 80;
server_name serdo.example.com;
# 前端静态文件
root /opt/serdo/dist;
index index.html;
# 前端路由
location / {
try_files $uri $uri/ /index.html;
}
# API 反向代理
location /api/ {
proxy_pass http://127.0.0.1:4000/api/;
proxy_http_version 1.1;
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;
# WebSocket 支持
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
# 性能优化
gzip on;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
# 缓存静态资源
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf)$ {
expires 1y;
add_header Cache-Control "public, immutable";
}
}
EOF
# 启用站点
sudo ln -s /etc/nginx/sites-available/serdo /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx# 使用 Certbot 自动配置 SSL
sudo apt install certbot python3-certbot-nginx -y
sudo certbot --nginx -d serdo.example.com# 检查后端健康
curl http://127.0.0.1:4000/api/v1/health
# 应返回: {"ok":true,"timestamp":"..."}
# 访问前端
# 浏览器打开: https://serdo.example.com详细的1Panel部署指南请参考完整文档或访问 1Panel官网。 1.新建一个静态网站 2.打开网站目录,删除默认的index.html和404.html 3.上传打包的release.zip至网站目录并解压(确保index.html, assets文件夹,api文件夹,位于网站根目录)
|
|----index.html
assets
api
4.新建一个运行环境,选择node.js。
名称:随意
应用: Node.js 24.10.0
项目目录:选择上面网站目录下的api文件夹(如 xxxx/index/api)
启动命令:node server.js
容器名称:随意
包管理器:npm
端口:4000 4000 外部访问ok
确认
点启动,启动成功后点开日志 出现
[api] listening on http://localhost:4000 则后端开启成功。
否则点更多-终端-npm install 回车
重新运行
5.网站-找到新建的网站-配置--反向代理--创建
匹配规则:^~
前端请求路径:/api
后端代理地址:127.0.0.1:4000
后端域名:$host
确认
6.访问域名即可(推荐开启ssl)
| 变量名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
VITE_API_BASE_URL |
string | /api/v1 |
API 基础路径(同域部署用相对路径) |
| 变量名 | 类型 | 必需 | 默认值 | 说明 |
|---|---|---|---|---|
AUTH_SECRET |
string | ✅ | - | JWT签名密钥(必须设置强随机值) |
PORT |
number | ❌ | 4000 |
服务监听端口 |
CORS_ORIGIN |
string | ❌ | * |
允许的来源(逗号分隔多个) |
USE_SQLITE |
boolean | ❌ | true |
启用SQLite数据库 |
REDACT_MODE |
boolean | ❌ | false |
生产环境建议true,API不返回明文密码 |
RATE_LIMIT_MAX |
number | ❌ | 300 |
每分钟请求次数限制 |
API_SSH_ALLOW_PASSWORD |
boolean | ❌ | false |
是否允许明文SSH密码登录 |
SENTRY_DSN |
string | ❌ | - | Sentry错误上报DSN(可选) |
# 生成 AUTH_SECRET (推荐)
openssl rand -base64 48
# 或使用 Node.js
node -e "console.log(require('crypto').randomBytes(32).toString('base64'))"完整的API文档请参考 API文档(如有)或查看后端代码中的注释。
POST /api/v1/auth/register- 用户注册POST /api/v1/auth/login- 用户登录GET /api/v1/me- 获取当前用户信息GET /api/v1/servers- 获取服务器列表GET /api/v1/domains- 获取域名列表GET /api/v1/providers- 获取服务商列表GET /api/v1/health- 健康检查
- 启用脱敏模式
REDACT_MODE=true- 配置强密钥
openssl rand -base64 48- 限制 CORS 来源
CORS_ORIGIN=https://serdo.example.com- 启用 HTTPS
sudo certbot --nginx -d serdo.example.com- 定期备份
cp api/data/serdo.db backups/serdo-$(date +%Y%m%d).db# 后端日志
sudo journalctl -u serdo-api -f
# Nginx 日志
sudo tail -f /var/log/nginx/access.log# 进入 SQLite 数据库
sqlite3 /opt/serdo/api/data/serdo.db
# 查看表
.tables
# 查看用户
SELECT * FROM users;# 1. 备份数据
bash backup.sh
# 2. 拉取最新代码
git pull origin main
# 3. 更新依赖
npm install
cd api && npm install && cd ..
# 4. 重新构建前端
npm run build
# 5. 重启后端服务
sudo systemctl restart serdo-apiA: 增加 Node.js 内存限制:
export NODE_OPTIONS="--max-old-space-size=4096"
npm run buildA: 检查后端 CORS_ORIGIN 配置,确保包含完整的协议和域名。
A: 检查服务器防火墙、SSH配置和后端日志。
- ✅ TypeScript: 100% TypeScript覆盖
- ✅ 零类型错误: 通过所有类型检查
- ✅ 代码分割: 智能优化,减少包体积
- ✅ 最佳实践: 遵循 React 和 Node.js 最佳实践
项目已进行以下构建优化:
-
智能代码分割:
- React 核心 (195KB)
- 图表库 (211KB)
- 终端库 (284KB)
- 其他依赖按需分割
-
生产优化:
- 自动去除 console 和 debugger
- esbuild 快速压缩
- Gzip 压缩支持
-
性能指标:
- 首屏加载: < 3秒
- API响应: < 100ms
- 包体积: 已优化至合理范围
# TypeScript 类型检查
npx tsc --noEmit
# 构建测试
npm run build
# 后端API测试(如果有)
cd api/tests
node test-api.js欢迎贡献代码、报告问题或提出建议!
- Fork 项目
- 创建功能分支:
git checkout -b feature/new-feature - 提交更改:
git commit -am 'Add new feature' - 运行类型检查:
npx tsc --noEmit - 推送分支:
git push origin feature/new-feature - 提交 Pull Request
- 🎉 初始版本发布
- 🖥️ 服务器管理功能
- 🌐 域名管理功能
- 🏪 服务商管理功能
- 🔐 用户认证系统
- 🔒 数据加密存储
- 🌍 多语言支持
- 📊 数据可视化
- 🛡️ SQLite 数据库
- 🐳 Docker 支持
- ✅ 修复所有 TypeScript 类型错误
- ✅ 优化构建配置和代码分割
- ✅ 改进错误处理和用户体验
- ✅ 智能代码分割
- ✅ 生产环境优化
- ✅ 包体积优化
MIT License - 详见 LICENSE 文件
- 项目主页: https://github.com/rikouu/serdo_v2
- 问题反馈: https://github.com/rikouu/serdo_v2/issues
- 邮箱: im@kou.im
Made with ❤️ by Kou