J-Board Lite 是 J-Board 的轻量版本,面向 1C1G 小机器和低资源 Docker 环境优化。它保留代理订阅售卖、流媒体共享、支付、订阅交付、工单、邮件、公告、审计、探测展示与订阅风控等核心功能,同时使用 SQLite 和进程内限流,避免 Postgres、Redis 等额外服务带来的部署负担。
J-Board Lite 的定位很明确:它是 J-Board 的轻量化部署版本,不是新的节点控制面,也不替代 3x-ui。节点实际运行、入站协议、Xray 客户端配置仍由 3x-ui 维护;面板负责售卖、开通、订阅交付、售后和风险审查,并通过只读 Agent 从节点侧采集延迟、路由和 Xray access log 证据。
开发进度频道:@JBoardAnno
用户浏览器 / 客户端订阅
↓
Next.js App Router 面板
├─ SQLite:用户、订单、套餐、订阅、审计、风控事件
├─ 进程内限流:无需 Redis 单独容器
├─ 3x-ui API:同步入站、开通/暂停/删除代理客户端
└─ Agent API:接收 jboard-agent 上报的延迟、路由、节点真实连接日志
节点 VPS
├─ 3x-ui / Xray:真实入站、客户端、流量限制与代理运行
└─ jboard-agent:旁路只读探测与日志聚合,不修改 3x-ui 配置
J-Board Lite 只保存售卖和展示需要的节点镜像数据。入站协议、端口、Reality/TLS、Xray 运行状态和客户端真实配置仍以 3x-ui 为准。
用户端:
管理端:
节点侧:
agent/jboard-agent 负责三网 TCP 延迟、三网路由追踪和可选 Xray access log 风控上报。J-Board Lite 面板和 Agent 使用相对独立的版本节奏。
lite,不一定创建 GitHub Release。jboard-agent-linux-amd64、jboard-agent-linux-arm64、SHA256SUMS。当前项目版本写在 package.json,Agent 运行时版本写在 agent/jboard-agent/cmd/agent/main.go,Agent 构建版本写在 agent/jboard-agent/Makefile。
注意:本项目使用的 Next.js 版本包含和旧版本不同的约定。开发前请阅读 AGENTS.md,并按 node_modules/next/dist/docs/ 中的当前文档实现。
| 路径 | 说明 |
|---|---|
src/app |
页面、布局、Route Handlers。 |
src/actions |
Server Actions,负责写操作、权限校验、审计和缓存刷新。 |
src/services |
领域服务与第三方适配。 |
src/services/node-panel |
3x-ui 面板适配层。 |
src/services/provision.ts |
支付成功后的订阅开通与 3x-ui 客户端同步。 |
src/services/subscription-risk.ts |
订阅访问与节点日志风控判定。 |
src/services/subscription-risk-review.ts |
风控事件证据整理、报告生成辅助。 |
src/lib |
Prisma、鉴权、加密、Turnstile、GeoIP、工具函数。 |
prisma/schema.prisma |
数据模型事实源。 |
data/GeoLite2-City.mmdb |
默认 GeoIP 城市库。 |
agent/jboard-agent |
Go Agent 源码、构建脚本和 Agent 文档。 |
scripts/install-jboard-panel.sh |
面板一键安装向导。 |
scripts/upgrade-jboard-panel.sh |
面板升级脚本。 |
scripts/install-jboard-agent.sh |
Agent 安装脚本。 |
scripts/upgrade-jboard-agent.sh |
Agent 升级脚本。 |
docs/API.md |
HTTP 接口与 Server Actions 参考。 |
docs/openapi.yaml |
对外 HTTP 接口 OpenAPI 描述。 |
以 .env.example 为准。生产部署推荐使用一键脚本生成 .env,手动配置时重点确认下列变量。
| 变量 | 用途 | 说明 |
|---|---|---|
APP_PORT |
面板监听端口 | 默认 3000。反向代理应转发到 http://127.0.0.1:APP_PORT。 |
SITE_NAME |
站点名称 | 初始化系统设置和邮件模板会使用。 |
NEXTAUTH_URL |
网站访问地址 | 必须填写准备反代到面板的正式域名,例如 https://panel.example.com。不要填 localhost、容器名或内网地址。 |
SUBSCRIPTION_URL |
订阅访问地址 | 可选。用于生成客户端订阅链接,例如 https://sub.example.com;留空时复用 NEXTAUTH_URL。 |
NEXTAUTH_SECRET |
登录会话密钥 | 生产环境必须使用随机长字符串。 |
ENCRYPTION_KEY |
敏感信息加密密钥 | 至少 32 字节。生产使用后不要更换,否则 3x-ui 密码、探测 Token、SMTP 密码、流媒体凭据等已加密数据会无法解密。 |
DATABASE_URL |
SQLite 文件地址 | 本地默认 file:./storage/jboard.db;Docker 部署时 Compose 会覆盖为容器内 /app/storage/jboard.db。 |
GEOIP_MMDB_PATH |
GeoIP 城市库 | 默认 data/GeoLite2-City.mmdb。可换成自己的 MaxMind City MMDB。 |
JBOARD_LOG_CLEANUP_SCHEDULER |
日志清理定时器 | 默认启用。设为 false 可关闭进程内自动清理任务。 |
ADMIN_EMAIL / ADMIN_PASSWORD / ADMIN_NAME |
初始管理员 | 首次 db:seed 创建管理员账号。已有数据库不会强制重置旧管理员密码。 |
SMTP 邮件服务、注册邮箱验证开关、支付方式、3x-ui 节点等业务配置在管理后台填写,不建议写进 .env。
日志清理在后台“系统设置 -> 日志清理”中配置。默认每天最多自动清理一次 30 天前日志,范围包含审计日志、任务记录、流量日志、节点延迟日志、风控访问日志和风控事件;正在生效的用户端风控限制不会被自动清理。管理员也可以在后台选择日志范围和天数,立即手动清理过期日志。
适合全新 Linux 服务器。脚本会安装基础依赖、安装 Docker 与 Compose 插件、拉取代码、生成 .env、初始化数据库并启动面板。
bash <(curl -fsSL https://raw.githubusercontent.com/JetSprow/J-Board/lite/scripts/install-jboard-panel.sh)
安装和更新脚本会自动检测 CPU、宿主机内存、Docker 可用内存和 Docker 数据盘空间。常规机器使用 Docker 默认构建策略;1C、低于 2GB 内存或 Docker 可用空间低于 8GB 的小机器会自动进入低资源模式,降低 Compose 并发、npm 编译并发和 Next 构建堆内存,并把镜像分步构建,构建会更慢但峰值占用更低。
脚本会交互询问:
| 问题 | 如何填写 |
|---|---|
| 安装目录 | 默认 /opt/jboard;如果在仓库内运行脚本则默认当前仓库。 |
| 站点名称 | 面板标题、邮件模板和初始化系统设置会使用。 |
| 网站访问地址 | 你准备反向代理到本机 3000 端口的面板域名,例如 https://panel.example.com。没有域名时可先用 http://服务器IP:3000 测试。 |
| 订阅访问地址 | 用于生成 Clash/V2rayN/Shadowrocket 等客户端订阅链接。可以和网站地址相同,也可以填独立订阅域名,例如 https://sub.example.com。 |
| 本机监听端口 | 默认 3000。Nginx、Caddy、宝塔或 1Panel 的反代目标就是 http://127.0.0.1:3000。 |
| 管理员邮箱和密码 | 首次初始化会创建该管理员,脚本完成后会再次打印。 |
NEXTAUTH_SECRET、ENCRYPTION_KEY |
可手动输入;回车会自动生成安全值。 |
也可以通过环境变量覆盖默认行为:
APP_DIR=/opt/jboard GH_REPO=JetSprow/J-Board BRANCH=lite bash <(curl -fsSL https://raw.githubusercontent.com/JetSprow/J-Board/lite/scripts/install-jboard-panel.sh)
构建资源策略也可以手动覆盖:
# 自动判断,默认值
JBOARD_BUILD_PROFILE=auto ./scripts/upgrade-jboard-panel.sh
# 强制低资源慢速构建
JBOARD_BUILD_PROFILE=low ./scripts/upgrade-jboard-panel.sh
# 强制常规构建,不额外限制并发或 Node heap
JBOARD_BUILD_PROFILE=normal ./scripts/upgrade-jboard-panel.sh
脚本完成后会输出:
访问地址:https://panel.example.com
订阅地址:https://sub.example.com
反代目标:http://127.0.0.1:3000
管理员邮箱:admin@example.com
管理员密码:自动生成或你输入的密码
请把管理员密码保存到密码管理器。已有数据库重复部署时,脚本会尽量沿用现有配置,不会随意重置管理员。
首次启动:
cp .env.example .env
# 编辑 .env,尤其是 NEXTAUTH_URL、SUBSCRIPTION_URL、NEXTAUTH_SECRET、ENCRYPTION_KEY、管理员账号
docker compose build init app
docker compose --profile setup run --rm init
docker compose up -d app
更新部署:
git pull --ff-only
docker compose build init app
docker compose --profile setup run --rm init sh -lc 'npm run db:push && chown -R 1001:1001 /app/storage'
docker compose up -d app
仓库内也提供更新脚本:
./scripts/upgrade-jboard-panel.sh
更新脚本同样会自动判断机器配置,并在更新前备份 SQLite 数据库到 backups/。
常用排障:
docker compose ps
docker compose logs -f app
docker compose --profile setup run --rm init sh -lc 'npm run db:push && chown -R 1001:1001 /app/storage'
如果页面仍是旧版本,确认已执行 docker compose build init app 和 docker compose up -d app。如果 schema 没生效,单独运行 npm run db:push 对应的 setup 命令。
NEXTAUTH_URL 和后台“系统设置 -> 网站 URL”都应该填写面板公网域名,也就是给用户访问、并反向代理到 J-Board Lite 的域名。不要填写 localhost、容器名或内网地址,否则登录回调、邮件链接、支付回跳和退出登录提示可能出现错误地址。
SUBSCRIPTION_URL 和后台“系统设置 -> 订阅 URL”只用于生成客户端订阅链接。它可以和网站 URL 相同;如果希望单独做 Cloudflare/WAF/访问风控,建议使用独立订阅域名,例如 https://sub.example.com,并把它也反向代理到同一个 J-Board Lite 服务。
Nginx 示例:
server {
listen 80;
server_name panel.example.com sub.example.com;
location / {
proxy_pass http://127.0.0.1:3000;
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;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
正式上线建议使用 Certbot、宝塔、1Panel、Caddy 或 CDN 配置 HTTPS。订阅域名套 Cloudflare 时,源站建议只允许 Cloudflare 回源或通过 Cloudflare Tunnel 暴露,并正确传递 CF-Connecting-IP / X-Forwarded-For。如果源站允许绕过 Cloudflare 直连,订阅访问风控中的真实 IP 可能被伪造。
/admin,进入“系统设置”,确认网站 URL 和订阅 URL。可以展示给用户的常用入口:
https://你的域名/loginhttps://你的域名/registerhttps://你的域名/storehttps://你的域名/dashboardhttps://你的域名/subscriptionshttps://你的域名/supportSMTP 配置在后台“系统设置”中完成,密码会加密保存在数据库中。支持的邮件场景包括:
建议使用专用发信邮箱或应用专用密码。Gmail、企业邮箱和大多数 SMTP 服务都可以使用 host + port + user + password + from 的方式接入。生产环境请优先使用 587 STARTTLS 或服务商推荐端口。
支付配置在后台 /admin/payments 完成,密钥会加密保存在数据库中,不写入 .env,也不要提交到仓库或截图外传。创建订单时,系统会根据用户选择的支付方式生成支付链接、二维码或链上收款信息;支付成功后进入 src/services/payment/process.ts 完成订单确认和订阅开通。
| 支付方式 | 适用场景 | 必填信息 | 回调 / 查询说明 |
|---|---|---|---|
| 易支付 | 第三方聚合支付,常用于支付宝/微信通道 | API 地址、商户 ID、商户密钥、启用渠道 | 通知地址为 https://你的域名/api/payment/notify/epay。支持 alipay、wxpay 渠道。 |
| 支付宝当面付 | 支付宝官方扫码支付 | App ID、应用私钥、支付宝公钥、网关地址 | 通知地址为 https://你的域名/api/payment/notify/alipay_f2f,也支持订单查询兜底。 |
| USDT TRC20 | 加密货币收款 | TRC20 钱包地址、汇率,可选 TronGrid API Key | 没有传统回调,系统按订单金额查询近期 TRC20 入账。建议配置 TronGrid API Key 提高稳定性。 |
支付上线前建议:
https://pay.example.com,系统会自动请求 /mapi.php、/submit.php 和 /api.php。节点接入流程:
NodeInbound。NodeClient。Agent 安装脚本会:
nexttrace。/usr/local/x-ui/access.log 等常见 Xray access log 路径。/var/lib/jboard-agent 和 /var/log/jboard。/etc/jboard-agent.env。jboard-agent.service。节点机常用命令:
systemctl status jboard-agent --no-pager -l
journalctl -u jboard-agent -n 100 --no-pager
journalctl -u jboard-agent -f --no-pager
journalctl -u jboard-agent -f --no-pager | grep --line-buffered xray-log
cat /etc/jboard-agent.env
cat /var/lib/jboard-agent/xray-log-state.json
升级 Agent:
curl -fsSL https://raw.githubusercontent.com/JetSprow/J-Board/lite/scripts/upgrade-jboard-agent.sh | bash
如果只想手动运行 Agent:
SERVER_URL=https://your-domain.com \
AUTH_TOKEN=后台生成的探测Token \
./jboard-agent
更多 Agent 说明见 agent/jboard-agent/README.md。
J-Board Lite 的订阅风控分两层。
第一层是订阅 API 访问风控。用户或客户端拉取 /api/subscription/* 时,系统记录真实 IP、User-Agent、国家、省/地区、城市、经纬度,并按后台配置判断:
第二层是节点真实连接风控。Agent 读取 Xray access log,将日志里的 email: user@example.com-xxxx 匹配到本地 NodeClient.email,再归属到用户和订阅。系统记录:
管理员可在“系统设置 -> 订阅访问风控”中配置总开关、自动暂停开关、窗口时长、城市/省/国家阈值、IP/订阅访问频率阈值,以及节点日志风控中的连接数和不同目标数阈值。
默认规则保持为:
风控事件会进入后台“订阅风控”。管理员可以:
用户收到管理员发送的风险报告后,会看到全屏不可关闭的限制通知,只能新建工单联系客服,不能继续进行其他用户端操作。
项目内置 data/GeoLite2-City.mmdb 作为本地 GeoIP 城市库,默认通过 GEOIP_MMDB_PATH=data/GeoLite2-City.mmdb 读取。系统会优先使用反向代理或 CDN 提供的地理位置头,并用 MMDB 补齐缺失字段。
Cloudflare 场景建议在 Rules -> Settings -> Managed Transforms 开启 Add visitor location headers,让回源请求带上 cf-ipcity、cf-region、cf-region-code 等字段。未提供城市/省份字段且 MMDB 不可用时,系统只记录 IP,不会触发地区变化规则。
如果网站域名和订阅域名相同,系统只统计订阅 API 访问,不会把普通网站浏览计入订阅风控。
下载 SQLite 备份:
docker compose exec -T app sh -lc 'cd /app/storage && set -- jboard.db; [ -f jboard.db-wal ] && set -- "$@" jboard.db-wal; [ -f jboard.db-shm ] && set -- "$@" jboard.db-shm; tar -czf - "$@"' > backup_$(date +%Y%m%d_%H%M%S).tar.gz
后台也可通过 /admin/backups 导出或恢复数据库。恢复前务必先保存当前数据库备份。
建议:
npm install
cp .env.example .env
npm run db:push
npm run db:seed
npm run dev
默认管理员账号:
admin@jboard.localadmin123常用检查:
npx prisma generate
npx tsc --noEmit
npm run lint
npm run build
数据库变更:
prisma/schema.prisma 后运行 npm run db:push。docker compose --profile setup run --rm init sh -lc 'npm run db:push && chown -R 1001:1001 /app/storage'。prisma db push --accept-data-loss,上线前请确认 schema 变更不会误删重要数据。Agent 开发:
cd agent/jboard-agent
go test ./...
make build-linux
shasum -a 256 jboard-agent-linux-amd64 jboard-agent-linux-arm64 > SHA256SUMS
.env、探测 Token、3x-ui 密码、SMTP 密码、支付密钥。ENCRYPTION_KEY 一旦生产使用不要随意更换。检查 .env 中的 NEXTAUTH_URL 和后台系统设置中的网站 URL。后台配置优先于环境变量。生产环境必须填写公网域名。
检查 .env 中的 SUBSCRIPTION_URL 和后台系统设置中的订阅 URL。后台配置优先于环境变量。
先确认 SMTP 是否启用、Host/Port/User/Password/From 是否正确。Gmail 等服务通常需要应用专用密码。生产环境隐藏原始异常时,可查看 docker compose logs -f app。
确认后台“注册邮箱验证”已经开启,并检查 SMTP 是否启用。邮箱验证开启后,新用户会进入待验证状态,必须通过邮件链接激活。
先看 Agent 是否运行:
systemctl status jboard-agent --no-pager -l
journalctl -u jboard-agent -n 100 --no-pager
再确认 access log 状态:
```bash cat /etc/jboard-agent.env | grep XRAY cat /var/lib/jboard-agent/xray-log-state.json tail -n 50 /usr/local/x-ui/access.log
$ claude mcp add J-Board \
-- python -m otcore.mcp_server <graph>