本指南帮助您快速部署 Nexus Terminal,从零开始搭建完整的远程管理平台。
⚠️ v1.5.1 升级重要提示
自 v1.5.1 起,容器运行用户由 root 调整为非 root 用户,以下端口发生变更:
| 服务 | 旧端口 | 新端口 | 说明 |
|---|---|---|---|
| Frontend nginx | 80 | 8080 | 容器内部监听端口 |
| Remote Gateway WebSocket | 8080 | 8081 | Guacamole WebSocket 端口 |
升级时必须更新:docker-compose.yml 端口映射、宿主机 Nginx 反向代理配置、.env 中的环境变量默认值。
更新日志中有 v1.5.1 破坏性变更的完整说明。
系统要求
mkdir nexus-terminal && cd nexus-terminal从 GitHub 仓库下载 docker-compose.yml 和 .env 配置文件:
wget https://raw.githubusercontent.com/Silentely/nexus-terminal/refs/heads/main/docker-compose.yml -O docker-compose.yml
wget https://raw.githubusercontent.com/Silentely/nexus-terminal/refs/heads/main/.env -O .env注意
当前默认镜像仓库为 GitHub Container Registry(GHCR),命名空间:ghcr.io/silentely
docker compose up -d等待所有容器启动完成(首次启动需要拉取镜像,可能需要几分钟)。
打开浏览器,访问:http://your-server-ip:18111
提示
默认端口为 18111,可在 .env 文件中修改。
安全提示
http://your-server-ip:18111 仅适合内网学习、测试或首次验证服务是否启动。不要把明文 HTTP 登录入口直接暴露到公网;公网生产环境应配置 HTTPS 反向代理(Nginx/Caddy/Cloudflare Tunnel 等)。
默认会话 Cookie 使用 SESSION_COOKIE_SECURE=auto:HTTP 直连时允许登录,HTTPS 反代时自动设置 Secure Cookie。如需强制只允许 HTTPS 会话,可在 .env 中设置 SESSION_COOKIE_SECURE=true。
Docker 部署包含三个容器,职责如下:
| 容器 | 内部端口 | 职责 |
|---|---|---|
| frontend | 8080 | 静态资源托管 + 反向代理(转发 /api/ → backend、/ws/ → backend) |
| backend | 3001 | API 服务、SSH/SFTP 连接管理、认证、审计 |
| remote-gateway | 8081 (WebSocket) / 9090 (API) | Guacamole 网关,处理 RDP/VNC 远程桌面连接 |
注意
前端容器的 nginx 默认只代理 /api/ 和 /ws/ 到 backend。/guacamole/ 不会自动转发到 remote-gateway,需要在宿主机 Nginx 中单独处理(Nginx 反向代理配置中有详细步骤)。
如果需要自定义配置,可以手动编写 docker-compose.yml:
mkdir -p /opt/nexus-terminal && cd /opt/nexus-terminalservices:
frontend:
container_name: nexus-terminal-frontend
ports:
- '127.0.0.1:18111:8080'
depends_on:
backend:
condition: service_healthy
remote-gateway:
condition: service_healthy
networks:
- nexus-terminal-network
restart: unless-stopped
healthcheck:
test: ["CMD-SHELL", "wget -qO- http://localhost:8080/ > /dev/null 2>&1 || exit 1"]
interval: 30s
timeout: 5s
retries: 3
image: ghcr.io/silentely/nexus-terminal-frontend:latest
backend:
container_name: nexus-terminal-backend
env_file:
- .env
environment:
PORT: 3001
NODE_ENV: production
TZ: Asia/Shanghai
volumes:
- ./data:/app/data
networks:
- nexus-terminal-network
restart: unless-stopped
healthcheck:
test: ["CMD-SHELL", "wget -qO- http://localhost:3001/api/v1/health > /dev/null 2>&1 || exit 1"]
interval: 10s
timeout: 5s
retries: 5
start_period: 30s
image: ghcr.io/silentely/nexus-terminal-backend:latest
remote-gateway:
container_name: nexus-terminal-remote-gateway
ports:
- '127.0.0.1:8081:8081' # Guacamole WebSocket(宿主机 Nginx 需要直连)
environment:
NODE_ENV: production
GUACD_HOST: localhost
GUACD_PORT: 4822
REMOTE_GATEWAY_API_PORT: 9090
REMOTE_GATEWAY_WS_PORT: 8081
FRONTEND_URL: http://frontend
MAIN_BACKEND_URL: http://backend:3001
REMOTE_GATEWAY_API_TOKEN: ${REMOTE_GATEWAY_API_TOKEN}
networks:
- nexus-terminal-network
depends_on:
backend:
condition: service_healthy
restart: unless-stopped
healthcheck:
test: ["CMD-SHELL", "wget -qO- http://localhost:9090/health > /dev/null 2>&1 || exit 1"]
interval: 30s
timeout: 5s
retries: 3
image: ghcr.io/silentely/nexus-terminal-remote-gateway:latest
networks:
nexus-terminal-network:
driver: bridge启动顺序说明
depends_on 配合 condition: service_healthy 确保:
start_period: 30s 给予初始化时间)cat > .env << 'EOF'
DEPLOYMENT_MODE=docker
NODE_ENV=production
APP_NAME=Nexus Terminal
PORT=3001
REMOTE_GATEWAY_API_TOKEN=
EOF提示
首次启动后,ENCRYPTION_KEY 和 SESSION_SECRET 会自动生成并写入 ./data/.env,无需手动配置。
docker compose up -d# 查看容器状态
docker compose ps
# 查看日志
docker compose logs -f backend
# 重启单个服务
docker compose restart backend
# 更新镜像
docker compose pull && docker compose up -d编辑 .env 文件,配置以下关键变量:
# 部署模式
DEPLOYMENT_MODE=docker
# 运行环境
NODE_ENV=production
# 应用名称
APP_NAME=Nexus Terminal
# 后端端口(容器内部)
PORT=3001# 加密密钥(自动生成,首次启动时创建)
# 请勿手动修改,除非您知道自己在做什么
ENCRYPTION_KEY=
# 会话密钥(自动生成)
SESSION_SECRET=
# HSTS 安全头(仅生产 HTTPS 环境开启)
# 开启后浏览器会强制使用 HTTPS 访问,开发环境勿启用
ENABLE_HSTS=false
# 会话 Cookie Secure 策略
# auto:HTTP 直连可登录,HTTPS 反代时自动使用 Secure Cookie
# 公网生产如需强制只允许 HTTPS 会话,可设置为 true
SESSION_COOKIE_SECURE=auto如果需要启用 Passkey 登录:
# Passkey Relying Party ID(域名,不带协议)
RP_ID=your-domain.com
# Passkey Relying Party Origin(完整 URL)
RP_ORIGIN=https://your-domain.com安全提示
RP_ID 需填写您的域名(不带协议和端口)RP_ORIGIN 需填写完整的 URL(包含协议)/.well-known/webauthn 是否可访问# 共享令牌:backend 与 remote-gateway 需要使用相同值
REMOTE_GATEWAY_API_TOKEN=环境变量配置中有完整的变量列表和说明。
# 启用 Prometheus 端点
ENABLE_METRICS=true启用后可通过 http://localhost:3001/api/v1/metrics 访问指标数据。
生产环境部署建议使用 Nginx 反向代理,提供 SSL 终止、静态资源缓存和 WebSocket 代理。
Nginx 反向代理配置指南包含以下内容:
cd nexus-terminal
docker compose down
docker compose pull
docker compose up -d零停机更新
docker compose pull 后再 up -d,会自动创建新容器替换旧容器。
# 所有容器
docker compose logs -f
# 特定容器
docker compose logs -f backend
docker compose logs -f frontend
docker compose logs -f remote-gatewaydocker compose restart # 全部
docker compose restart backend # 单个数据存储在 ./data 目录(SQLite 数据库、会话、上传文件):
docker compose stop backend
tar -czf nexus-terminal-backup-$(date +%Y%m%d).tar.gz data/
docker compose start backend# 导出
curl -X GET http://localhost:18111/api/v1/backup/export \
-H "Authorization: Bearer YOUR_TOKEN" \
-o backup.json
# 导入
curl -X POST http://localhost:18111/api/v1/backup/import \
-H "Authorization: Bearer YOUR_TOKEN" \
-F "file=@backup.json"docker compose stop backend
tar -xzf nexus-terminal-backup-20240101.tar.gz
docker compose start backend完全支持,无需额外配置。remote-gateway 镜像已内嵌 guacd。
ARMv7 限制
Apache Guacamole 未提供 guacd 的 ARMv7 镜像,RDP 功能将被禁用。
上方 Docker 部署章节中有详细说明。
# 查看容器健康状态
docker compose ps
# 后端健康端点
curl -f http://localhost:18111/api/v1/health
# 前端
curl -f http://localhost:18111/
# Prometheus 指标(需启用)
curl http://localhost:18111/api/v1/metricsdocker compose logs backend # 查看日志
sudo lsof -i:18111 # 检查端口占用
cat .env # 检查环境变量Upgrade 和 Connection 头docker compose down
sudo chown -R 1000:1000 data/
docker compose up -ddocker-compose.yml 中的内存限制生产环境建议