serviceport
开发时双击根目录 start-dev.cmd,打开 http://127.0.0.1:8080(默认免登录)。该入口固定使用项目根目录下的 data/serviceport.sqlite,与启动时的工作目录无关,重启和重新构建后继续保留目标服务和网关配置。数据库、master-key.dpapi 和 tls 均保存在 data 中,备份时关闭服务并复制整个目录;密钥绑定当前 Windows 用户。直接运行发布包仍使用 %APPDATA%/serviceport。
使用 Go 和 Vue 3 构建的 MySQL、MongoDB、PostgreSQL、Redis、RabbitMQ、SSH 连接代理管理后台。目标服务独立保存地址、凭据及直连 / SOCKS5 / SSH 转发出口;网关引用目标,独立管理监听端口、访问凭据及可选只读策略。一个目标可被多个同协议网关复用。
目标配置的「代理出口」可选择 SSH 转发,填写跳板机地址、端口、账号密码和已核对的 SHA256 主机指纹。跳板机需允许 TCP 转发;目标地址和域名由跳板机访问,连接失败不回退直连。当前跳板机认证支持密码。网关来源 IP/CIDR 为可选项,留空允许所有来源,填写后仅放行匹配项。
MySQL、MongoDB 默认读写,只读模式按代理可选启用。 只读基于网关严格白名单,不自动修改目标数据库权限。
能力
目标服务支持可选分组,可按分组筛选,并在网关选择目标时显示分组。独立「代理」菜单维护通用 SOCKS5、SSH 转发与 K8s port-forward 配置。目标服务通过「代理出口」下拉框选择,或选择「直接连接」。多个目标可以共用同一代理;代理被引用时禁止删除,修改前须停止全部关联网关。旧目标内的出口配置升级时自动迁移,配置和凭据保留;升级前停止服务并备份整个数据目录。
- MySQL:统一账号、TLS、查询、事务、二进制预编译和可选只读;目标版本为 5.7.44、8.0、8.4。
- MongoDB:双端 SCRAM-SHA-256、TLS、CRUD、聚合、游标及可选只读;目标版本为 6.0、7.0、8.0,客户端必须设置
directConnection=true。 - SSH:密码/公钥登录网关,上游密码/私钥认证,固定主机指纹,交互终端、远程命令和 SFTP。
- Redis:RESP 数组命令、AUTH/HELLO 凭据映射、流水线、订阅推送与命令审计;支持 standalone 目标,不自动处理 Cluster 重定向。
- RabbitMQ:AMQP 0-9-1、PLAIN 凭据映射、队列/交换机/发布消费帧转发;审计方法及通道元数据,不保存消息正文。
- PostgreSQL(pgsql):普通和扩展查询协议、上游 MD5/SCRAM 认证、网关密码认证、参数化查询及 SQL 审计。当前不代理独立 CancelRequest,也不提供只读策略。
- SOCKS5:每条代理独立配置,支持无认证和用户名密码认证、远端 DNS;出口失败不回退直连。
- 管理:单管理员、SQLite 加密配置、CSRF/会话、密码重新认证查看、来源白名单、连接限额、启停及 7 天审计。
目标版本与实测版本请区分,见 验证说明。
「拖拽连接」可将已停止的网关拖到同协议目标并保存关联,也支持点击选择。命令审计与连接事件按 UTC 日期保存至 data/audit/YYYY-MM-DD.sqlite(每库分别包含 commands/events),保留 7 天。旧记录启动时自动迁移;配置库继续固定使用 data/serviceport.sqlite。两类日志均支持跨天筛选、分页和 CSV 全量导出;命令内容仍加密保存,导出只包含当前保留且已记录的内容。备份请停止服务并复制整个 data 目录。
构建
项目包含 .drone.yml,Drone CI 会自动执行 Go 全量测试、go vet、前端生产构建和无 CGO Linux amd64 编译。流水线不连接真实数据库,不读取 data/;真实服务矩阵仍使用 scripts/test-matrix.ps1 或 scripts/test-matrix.sh。
Drone tag 构建还会生成 Linux 发布包,并在配置 ipfs_api / ipfs_token Secret 后上传 IPFS,详见 Drone/IPFS 发布说明。
项目版本统一维护在根目录 VERSION。serviceport.exe version 或 serviceport.exe --version --json 可查看版本、Git 提交、构建时间与平台,管理界面顶部也可查看版本信息。构建/打包脚本自动注入元数据;直接 go build 仍使用 VERSION 的版本值,但提交和时间可能显示 unknown。
目标出口新增内置 K8s port-forward,不依赖 kubectl,支持 Pod、Service 和 Deployment。配置与权限见 Kubernetes 说明。
需要 Node.js 22.12+ 和 Go。当前 Vitess 解析器固定使用 Go 1.25.0;机器安装更新版 Go 时,设置 GOTOOLCHAIN=go1.25.0 自动使用兼容工具链。不要直接用 Go 1.27 编译该版本 Vitess。
Windows PowerShell:
.\scripts\build.ps1
Linux / macOS:
sh scripts/build.sh
脚本安装前端依赖、构建 Vue、执行 Go 测试并生成 bin/serviceport(Windows 为 .exe)。前端嵌入可执行文件,部署不需要 Node.js。
启动
Windows 本地使用:解压发行包后双击 serviceport.exe,浏览器自动打开,开发阶段默认免登录,直接进入控制台。无需安装 Go/Node.js,无需设置环境变量。保持程序窗口运行,按 Ctrl+C 停止服务。
先在「目标服务」中添加 MySQL/MongoDB/SSH 目标,再在「网关服务」中选择目标并配置监听、网关账号和访问策略。目标被引用时不能删除;编辑目标前需要停止所有引用它的网关。旧版配置会在事务中自动拆分,保留网关 ID、凭据、SSH 指纹和启用状态,升级前先停止服务并备份数据目录。
右上角可切换浅色、深色、海蓝及跟随系统主题,选择保存在当前浏览器中。
开发模式仅允许回环地址管理访问,仍校验请求来源与 CSRF。设置 SERVICEPORT_AUTH_ENABLED=true 可启用管理员登录;Windows 本地模式会在尚无管理员时打开首次设置页面,已有管理员直接登录。远程服务器部署必须开启认证。
未设置 SERVICEPORT_MASTER_KEY 时,Windows 自动进入本地模式:数据固定保存到 %APPDATA%\serviceport,密钥使用当前 Windows 用户的 DPAPI 加密保存,自动创建有效期一年的 localhost TLS 证书。备份整个目录;该密钥绑定 Windows 用户,不能直接复制到其他电脑使用。高级部署及跨机器迁移应使用自行保管的环境变量主密钥。详见 Windows 使用说明。
以下为服务器部署 / 手动管理密钥的 PowerShell 示例(设置主密钥后保留原有启动行为):
$env:SERVICEPORT_AUTH_ENABLED = 'true'
$env:SERVICEPORT_MASTER_KEY = .\bin\serviceport.exe generate-key
$env:SERVICEPORT_ADMIN_USER = 'admin'
$adminSecret = Read-Host '初始管理员密码(12–72 字节)' -AsSecureString
$env:SERVICEPORT_ADMIN_PASSWORD = [Net.NetworkCredential]::new('', $adminSecret).Password
.\bin\serviceport.exe
打开 http://127.0.0.1:8080。初始管理员只在首次运行创建,之后不会用环境变量覆盖密码。
首次生成的主密钥必须保存并在后续启动时复用,不能每次启动重新生成。数据库备份需要同时备份主密钥;换错密钥时已保存配置无法解密。
| 环境变量 | 默认值 / 用途 |
|---|---|
SERVICEPORT_AUTH_ENABLED |
默认 false,开发阶段免登录且仅限本机;true 启用管理员登录 |
SERVICEPORT_MASTER_KEY |
服务器模式必填,32 字节随机密钥的 Base64;Windows 未设置时启用本地模式 |
SERVICEPORT_ADMIN_USER |
手动密钥模式且启用认证时,首次启动必填 |
SERVICEPORT_ADMIN_PASSWORD |
手动密钥模式且启用认证时,首次启动必填,12–72 字节 |
SERVICEPORT_DATA |
data/serviceport.sqlite |
SERVICEPORT_HTTP_ADDR |
127.0.0.1:8080 |
SERVICEPORT_NO_BROWSER |
Windows 本地模式设为 1 可禁用自动打开浏览器 |
SERVICEPORT_SECURE_COOKIE |
默认 false;管理界面经 HTTPS 访问时设为 true |
SERVICEPORT_TLS_CERT / SERVICEPORT_TLS_KEY |
数据库网关客户端 TLS 证书和私钥路径 |
.env.example 仅为示例,程序不自动加载 .env。远程管理使用 HTTPS 反向代理。
数据库 TLS
MySQL/MongoDB 网关允许普通连接;配置证书后同一端口也支持客户端选择 TLS。未配置证书仍可启动数据库网关并接受普通连接。客户端 TLS 与目标服务的上游 TLS 独立。
本机开发可生成只覆盖 localhost、127.0.0.1 和 ::1、有效期 14 天的证书:
$env:GOTOOLCHAIN = 'go1.25.0'
go run ./cmd/devcert
$env:SERVICEPORT_TLS_CERT = 'data/tls/cert.pem'
$env:SERVICEPORT_TLS_KEY = 'data/tls/key.pem'
.\bin\serviceport.exe
客户端将 cert.pem 作为 CA 验证;局域网正式使用时换成覆盖实际网关域名的受信任证书。目标数据库 TLS 独立配置,默认验证系统 CA 或配置中提供的 PEM CA,不提供跳过验证模式。
SSH 主机身份
保存 SSH 配置后,使用代理菜单“探测 / 确认主机指纹”。探测不发送目标账号凭据;通过独立可信渠道核对指纹后输入完整指纹确认,再启动代理。主机密钥变化会拒绝连接;修改目标地址或端口需要重新确认。
密码查看与重置
目标、网关、SOCKS5 密码和 SSH 私钥口令可在重新验证管理员密码后查看,30 秒自动隐藏并记录审计。SSH 私钥不可下载。管理员登录密码仅保存 bcrypt 哈希,只能重置:
.\bin\serviceport.exe reset-password
重置命令使用同一个数据路径和主密钥,交互输入密码并使旧会话失效。
开发与测试
$env:GOTOOLCHAIN = 'go1.25.0'
go test ./...
go vet ./...
npm.cmd --prefix web run build
go build -o bin/serviceport.exe ./cmd/serviceport
npm.cmd --prefix web test
前端开发:npm --prefix web run dev,Vite 将 /api 转发到本机 8080。浏览器测试启动隔离的临时数据服务,默认使用已安装的 Edge;其他平台可设置 SERVICEPORT_BROWSER_CHANNEL=chromium 并先运行 npx playwright install chromium。
Docker 构建:docker build -t serviceport .。容器默认以 UID 10001 运行,数据卷须可写;代理监听端口需要自行映射。数据库版本矩阵见 验证说明。
Windows 便携包
所有协议的目标服务统一使用账号列表(例如普通账号、root),不再单独填写一组用户名和密码。在目标编辑的“账号”页签中维护,在网关编辑的“目标账号”中选择。开发阶段不兼容旧账号设计:旧目标需重新配置账号,旧网关需重新选择账号才能启动,不自动迁移或回退。用户只使用网关凭据;root 账号为直接 SSH 登录,不是 sudo 提权。详见 目标多账号。
.\package.cmd
# Optional version override:
.\package.cmd -Version 0.3.0
# PowerShell entry:
powershell.exe -NoProfile -ExecutionPolicy Bypass -File scripts/package.ps1
安装 Go、Node.js/npm 后,可双击根目录 package.cmd 打包;窗口保留结果,命令行自动化可设置 SERVICEPORT_PACKAGE_NO_PAUSE=1 取消暂停。版本默认读取 VERSION。
默认使用快速 ZIP 压缩,并输出前端、Go 编译、验证、压缩各阶段耗时。需要更小的压缩包时运行 .\package.cmd -Compression Optimal,耗时会增加。前端按源码、配置、依赖锁文件、Node 版本及产物内容校验缓存,变化或缺失时自动重建;依赖变化自动执行 npm ci。可用 .\package.cmd -RebuildWeb 强制重建前端。缓存位于 artifacts/build-cache。Go 每次构建当前代码、注入最新版本信息,并自动复用编译缓存;发布包验证始终执行。
start-dev.cmd 用于直接启动:先停止当前目录中的旧服务并等待退出,将整个 data 备份到 artifacts/backups/<时间>/。源码目录每次调用 scripts/build.ps1 构建最新前后端并运行 Go 测试,成功后运行 bin/serviceport.exe,失败不会启动旧程序;发布包内没有构建脚本时直接运行根目录的 serviceport.exe。发布包无需安装 Go 或 Node.js。此入口固定使用入口所在目录的 data/serviceport.sqlite,默认免登录,访问 http://127.0.0.1:8080。
打包脚本按需构建前端并编译 Windows x64 程序,自动验证文件校验值、隔离启动、网页资源与管理员登录,通过后在 artifacts/releases/<时间>/ 生成 ZIP 及 SHA-256 校验文件。包内包含主程序、开发证书工具、独立启动说明和配置示例,不包含本地数据库或凭据。解压后也可用 node scripts/verify-package.mjs <解压后的包目录> 重复验证。打包不会替换正在运行的服务。
文档
目标压缩与命令审计
MySQL/MongoDB 目标可选择 zlib 压缩(默认关闭),通过协议协商启用,目标不支持时保持未压缩连接;连接测试显示实际协商结果。压缩仅作用于 serviceport 到目标服务一侧,直连和 SOCKS5 均适用。当前 SSH 库仅支持未压缩传输。
「命令审计」记录 MySQL SQL/预编译模板、MongoDB 请求、SSH exec、交互输入行和 SFTP 操作,可按网关/协议筛选并分页查看。内容加密保存,保留 7 天,每条最多 16 KiB,截断会标记。放行/拦截是网关决策,不表示目标执行成功。审计写入失败时不继续转发该命令。
不记录认证握手、SFTP 文件内容或命令输出。MySQL 二进制预编译执行记录 SQL 模板、statement ID 与参数包字节数,不展开参数值;MongoDB 文档序列批量正文不展开,只记录命令主体及总字节数。SSH 交互输入并非远端执行追踪:历史命令选择、光标编辑、脚本内部命令、全屏程序及密码提示输入无法可靠区分;需要严格远端执行审计时应配合服务器 auditd 等机制。