Skip to content

serdo 是一个专为中小团队和个人运维设计的现代化管理面板,用于集中管理服务器(VPS/独立服务器/云主机)、域名和服务商账号。提供健康监控、到期提醒、DNS同步、WebSSH终端等实用功能,可快速部署到任何环境。

Notifications You must be signed in to change notification settings

rikouu/serdo_v2

Repository files navigation

Serdo - 服务器与域名一站式管理面板

Version License Node React TypeScript

轻量级、安全、易部署的服务器与域名管理平台

功能特点快速开始部署指南API文档常见问题


项目域名whois查询及到期时间自动同步提醒,使用自建whoisApi,支持300+种域名查询体验:


📖 项目简介

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

本地开发

1. 克隆项目

git clone https://github.com/your-username/serdo.git
cd serdo

2. 安装依赖

# 安装前端依赖
npm install

# 安装后端依赖
cd api
npm install
cd ..

3. 配置环境变量

建议:使用模版 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

4. 启动服务

启动后端:

cd api
AUTH_SECRET=your_secret_key node server.js
# 或使用 .env 文件
node server.js

启动前端:

npm run dev

5. 访问应用

打开浏览器访问: http://localhost:3000

默认账号: admin / admin (首次访问自动创建)

6. 发布

在本地进入项目目录 cd "***/Serdo" bash scripts/release.sh release文件夹会产出前端/后端/前后端一体 3种压缩包任选使用

📦 部署指南

方式一: Docker Compose (推荐)

快速部署

# 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:4000

Docker Compose 配置

version: '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

方式二: 传统部署 (生产环境)

1. 准备服务器

# 安装 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

2. 上传代码

# 本地打包
bash scripts/release.sh

# 上传到服务器 /opt/serdo
scp release/serdo-release-*.zip user@your-server:/opt/
ssh user@your-server
cd /opt
unzip serdo-release-*.zip

3. 配置后端

cd /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 data

4. 配置 systemd 服务

sudo 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-api

5. 构建前端

cd /opt/serdo

# 配置生产环境变量
cat > .env.production << 'EOF'
VITE_API_BASE_URL=/api/v1
EOF

# 构建
npm install --production
npm run build

6. 配置 Nginx

sudo 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

7. 配置 HTTPS (推荐)

# 使用 Certbot 自动配置 SSL
sudo apt install certbot python3-certbot-nginx -y
sudo certbot --nginx -d serdo.example.com

8. 验证部署

# 检查后端健康
curl http://127.0.0.1:4000/api/v1/health
# 应返回: {"ok":true,"timestamp":"..."}

# 访问前端
# 浏览器打开: https://serdo.example.com

方式三: 1Panel 可视化部署

详细的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 - 健康检查

🔐 安全最佳实践

生产环境配置

  1. 启用脱敏模式
REDACT_MODE=true
  1. 配置强密钥
openssl rand -base64 48
  1. 限制 CORS 来源
CORS_ORIGIN=https://serdo.example.com
  1. 启用 HTTPS
sudo certbot --nginx -d serdo.example.com
  1. 定期备份
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-api

❓ 常见问题

Q: 构建时出现内存不足错误

A: 增加 Node.js 内存限制:

export NODE_OPTIONS="--max-old-space-size=4096"
npm run build

Q: CORS 错误

A: 检查后端 CORS_ORIGIN 配置,确保包含完整的协议和域名。

Q: WebSSH 连接失败

A: 检查服务器防火墙、SSH配置和后端日志。


🧪 开发说明

代码质量

  • TypeScript: 100% TypeScript覆盖
  • 零类型错误: 通过所有类型检查
  • 代码分割: 智能优化,减少包体积
  • 最佳实践: 遵循 React 和 Node.js 最佳实践

构建优化

项目已进行以下构建优化:

  1. 智能代码分割:

    • React 核心 (195KB)
    • 图表库 (211KB)
    • 终端库 (284KB)
    • 其他依赖按需分割
  2. 生产优化:

    • 自动去除 console 和 debugger
    • esbuild 快速压缩
    • Gzip 压缩支持
  3. 性能指标:

    • 首屏加载: < 3秒
    • API响应: < 100ms
    • 包体积: 已优化至合理范围

运行测试

# TypeScript 类型检查
npx tsc --noEmit

# 构建测试
npm run build

# 后端API测试(如果有)
cd api/tests
node test-api.js

🤝 贡献指南

欢迎贡献代码、报告问题或提出建议!

开发流程

  1. Fork 项目
  2. 创建功能分支: git checkout -b feature/new-feature
  3. 提交更改: git commit -am 'Add new feature'
  4. 运行类型检查: npx tsc --noEmit
  5. 推送分支: git push origin feature/new-feature
  6. 提交 Pull Request

📝 更新日志

v2.0.0 (2025-12-05)

✨ 新功能

  • 🎉 初始版本发布
  • 🖥️ 服务器管理功能
  • 🌐 域名管理功能
  • 🏪 服务商管理功能
  • 🔐 用户认证系统
  • 🔒 数据加密存储
  • 🌍 多语言支持
  • 📊 数据可视化
  • 🛡️ SQLite 数据库
  • 🐳 Docker 支持

🐛 修复

  • ✅ 修复所有 TypeScript 类型错误
  • ✅ 优化构建配置和代码分割
  • ✅ 改进错误处理和用户体验

⚡ 性能优化

  • ✅ 智能代码分割
  • ✅ 生产环境优化
  • ✅ 包体积优化

📄 许可证

MIT License - 详见 LICENSE 文件


🙏 致谢


📞 联系方式


⬆ 返回顶部

Made with ❤️ by Kou

About

serdo 是一个专为中小团队和个人运维设计的现代化管理面板,用于集中管理服务器(VPS/独立服务器/云主机)、域名和服务商账号。提供健康监控、到期提醒、DNS同步、WebSSH终端等实用功能,可快速部署到任何环境。

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published