原因:Docker 容器启动竞态条件。depends_on 默认只等待容器进程启动,不等待服务就绪。前端容器的 Nginx 在后端尚未完成初始化时就尝试代理请求,导致 503。
解决方案:在 docker-compose.yml 中使用健康检查条件:
frontend:
depends_on:
backend:
condition: service_healthy
remote-gateway:
condition: service_healthy
backend:
healthcheck:
test: ["CMD-SHELL", "wget -qO- http://127.0.0.1:3001/api/v1/health > /dev/null 2>&1 || exit 1"]
interval: 30s
timeout: 5s
retries: 3
start_period: 30s # 给予后端初始化时间同时确保前端容器的 nginx.conf 中 /api/ 使用正确的连接头映射:
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
location ^~ /api/ {
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade; # 不要硬编码 "upgrade"
proxy_next_upstream error timeout http_502 http_503;
}| 资源 | 最低要求 | 推荐配置 |
|---|---|---|
| CPU | 1 核 | 2 核+ |
| 内存 | 1GB | 2GB+ |
| 磁盘 | 1GB | 5GB+ |
| 系统 | Docker 20.10+ | Docker 24.0+ |
编辑 docker-compose.yml 中的端口映射:
frontend:
ports:
- '8080:8080' # 修改左侧宿主机端口即可v1.5.1 将容器运行用户从 root 切换为非 root,导致内部端口发生变更。常见问题及解决方法:
问题 1:Frontend 容器健康检查失败
现象:docker compose ps 显示 frontend 为 unhealthy
原因:旧配置中 nginx 监听 80,新版本监听 8080
解决:更新 docker-compose.yml 中的端口映射和 healthcheck:
frontend:
ports:
- '18111:8080' # 旧值: '18111:80'
healthcheck:
test: ['CMD-SHELL', 'wget -qO- http://localhost:8080/ > /dev/null 2>&1 || exit 1']问题 2:远程桌面(RDP/VNC)连接失败
现象:前端可以访问但无法连接远程桌面
原因:Remote Gateway WebSocket 端口从 8080 改为 8081
Docker Compose 部署注意:Docker 版本中
remote-gateway仅由backend容器内部访问(ws://remote-gateway:8081),外层 Nginx 无需单独转发 remote-gateway。RDP/VNC 的完整路径为:浏览器 → 外层 Nginx(/ws/) → 前端容器(18111) → 内置 nginx → backend(3001) → remote-gateway(8081)。只需确保外层 Nginx 正确代理/ws/到18111即可。如果通过 HTTPS 域名访问且遇到 WebSocket 信令连接失败,请在
.env中设置RP_ORIGIN=https://your-domain.com或ALLOWED_WS_ORIGINS=https://your-domain.com。
解决(非 Docker 或自定义 Nginx 代理到 remote-gateway 的场景):更新宿主机 Nginx 配置中 /guacamole/ 的代理目标:
# 旧配置
proxy_pass http://127.0.0.1:8080;
# 新配置
proxy_pass http://127.0.0.1:8081;同时更新 .env 中的环境变量(如果显式设置了旧值):
# 旧值
REMOTE_GATEWAY_WS_PORT=8080
REMOTE_GATEWAY_WS_URL_LOCAL=ws://localhost:8080
REMOTE_GATEWAY_WS_URL_DOCKER=ws://remote-gateway:8080
# 新值
REMOTE_GATEWAY_WS_PORT=8081
REMOTE_GATEWAY_WS_URL_LOCAL=ws://localhost:8081
REMOTE_GATEWAY_WS_URL_DOCKER=ws://remote-gateway:8081问题 3:data/.env 文件权限被拒绝
现象:容器启动时报 EACCES: permission denied
原因:新版本将 data/.env 权限收紧为 600
解决:容器 entrypoint 会在启动时自动修复权限,无需手动处理。如果仍有问题,执行:
docker compose down
sudo chown -R $(id -u):$(id -g) ./data
docker compose up -d完整升级步骤:
# 1. 停止旧版本
docker compose down
# 2. 更新 docker-compose.yml(参考上方端口变更)
# 3. 更新宿主机 Nginx 配置
# 4. 拉取新镜像并启动
docker compose pull && docker compose up -d
# 5. 验证容器状态
docker compose ps
docker compose logs -f可以,参考本地开发方式:
npm install
cd packages/backend && npm run dev
cd packages/frontend && npm run dev
cd packages/remote-gateway && npm run devdocker compose logs backend | grep ssh调整心跳配置:
HEARTBEAT_INTERVAL_DESKTOP=15000
MAX_MISSED_PONGS_DESKTOP=5浏览器安全策略限制,非 HTTPS 环境下无法使用剪贴板。解决方案:
所有数据存储在 ./data 目录:
data/
├── nexus-terminal.db # SQLite 数据库
└── sessions/ # 会话文件docker compose stop backend
tar -czf backup.tar.gz data/
docker compose start backenddocker compose stop backend
tar -xzf backup.tar.gz
docker compose start backend推荐使用 Nginx + Let's Encrypt:
sudo apt install certbot python3-certbot-nginx
sudo certbot --nginx -d your-domain.com通过应用界面:设置 → 安全 → IP 白名单 → 添加 IP 地址。
检查以下配置:
RP_ID 和 RP_ORIGIN 是否正确RP_ORIGIN 匹配/.well-known/webauthn 是否可访问curl https://your-domain.com/.well-known/webauthnsudo sysctl -w net.core.somaxconn=65535浏览器对同一域名的并发 WebSocket 数量有限制(HTTP/1.1 下约 6 个)。若同时打开大量 SSH 标签:
ENABLE_MULTIPLEX=true(见 Docker 配置)/auth/init 自动跟随)默认关闭以保证兼容;多标签密集使用时建议开启。
docker compose down
sqlite3 data/nexus-terminal.db ".tables"
docker compose up -dcd nexus-terminal
docker compose down
docker compose pull
docker compose up -d不会。数据存储在挂载的 ./data 目录,更新镜像不影响数据。
修改 docker-compose.yml 中的镜像标签:
services:
backend:
image: ghcr.io/silentely/nexus-terminal-backend:v1.0.0然后 docker compose up -d。
git checkout -b feature/your-featurenpm test # 所有测试
npm run test:backend # 后端测试
npm run test:frontend # 前端测试
npm run test:coverage # 覆盖率报告| 协议 | 状态 | 说明 |
|---|---|---|
| SSH | 完全支持 | 终端连接 |
| SFTP | 完全支持 | 文件传输 |
| RDP | 完全支持 | Windows 远程桌面 |
| VNC | 完全支持 | Unix/Linux 图形桌面 |
| Telnet | 完全支持 | 传统设备终端连接 |
目前没有原生 App,但 Web 界面完美适配移动端浏览器,支持触控操作和手势控制。