diff --git a/backend/apps/engine/consumers/worker_deploy_consumer.py b/backend/apps/engine/consumers/worker_deploy_consumer.py index a9cdd17b..1ed9975e 100644 --- a/backend/apps/engine/consumers/worker_deploy_consumer.py +++ b/backend/apps/engine/consumers/worker_deploy_consumer.py @@ -241,8 +241,9 @@ class WorkerDeployConsumer(AsyncWebsocketConsumer): })) return - django_host = f"{public_host}:{server_port}" # Django / 心跳上报使用 - heartbeat_api_url = f"http://{django_host}" # 基础 URL,agent 会加 /api/... + # 远程 Worker 通过 nginx HTTPS 访问(nginx 反代到后端 8888) + # 使用 https://{PUBLIC_HOST} 而不是直连 8888 端口 + heartbeat_api_url = f"https://{public_host}" # 基础 URL,agent 会加 /api/... session_name = f'xingrin_deploy_{self.worker_id}' remote_script_path = '/tmp/xingrin_deploy.sh' diff --git a/backend/apps/scan/utils/wordlist_helpers.py b/backend/apps/scan/utils/wordlist_helpers.py index 32156e0c..bc9225c9 100644 --- a/backend/apps/scan/utils/wordlist_helpers.py +++ b/backend/apps/scan/utils/wordlist_helpers.py @@ -81,8 +81,8 @@ def ensure_wordlist_local(wordlist_name: str) -> str: raise RuntimeError( "无法确定 Django API 地址:请配置 SERVER_URL 或 PUBLIC_HOST 环境变量" ) - server_port = getattr(settings, 'SERVER_PORT', '8888') - api_base = f"http://{public_host}:{server_port}/api" + # 远程 Worker 通过 nginx HTTPS 访问,不再直连 8888 + api_base = f"https://{public_host}/api" query = urllib_parse.urlencode({'wordlist': wordlist_name}) download_url = f"{api_base.rstrip('/')}/wordlists/download/?{query}" diff --git a/backend/scripts/worker-deploy/agent.sh b/backend/scripts/worker-deploy/agent.sh index 419ec9f0..4ca410a9 100755 --- a/backend/scripts/worker-deploy/agent.sh +++ b/backend/scripts/worker-deploy/agent.sh @@ -52,7 +52,7 @@ if [ "$RUN_MODE" = "remote" ] && [ -f "$ENV_FILE" ]; then fi # 获取配置 -# SERVER_URL: 后端 API 地址(容器内用 http://server:8888,远程用公网地址) +# SERVER_URL: 后端 API 地址(容器内用 http://server:8888,远程用 https://{PUBLIC_HOST}) API_URL="${HEARTBEAT_API_URL:-${SERVER_URL:-}}" WORKER_NAME="${WORKER_NAME:-}" IS_LOCAL="${IS_LOCAL:-false}" @@ -113,7 +113,7 @@ if [ -z "$WORKER_ID" ]; then # 等待 Server 就绪 log "等待 Server 就绪..." for i in $(seq 1 30); do - if curl -s "${API_URL}/api/" > /dev/null 2>&1; then + if curl -k -s "${API_URL}/api/" > /dev/null 2>&1; then log "${GREEN}Server 已就绪${NC}" break fi @@ -181,7 +181,7 @@ EOF ) # 发送心跳 - RESPONSE=$(curl -s -o /dev/null -w "%{http_code}" -X POST \ + RESPONSE=$(curl -k -s -o /dev/null -w "%{http_code}" -X POST \ -H "Content-Type: application/json" \ -d "$JSON_DATA" \ "${API_URL}/api/workers/${WORKER_ID}/heartbeat/" 2>/dev/null || echo "000") diff --git a/docker/.env.example b/docker/.env.example index 4282ddf6..70aabc94 100644 --- a/docker/.env.example +++ b/docker/.env.example @@ -15,14 +15,14 @@ REDIS_PORT=6379 REDIS_DB=0 # ==================== 服务端口配置 ==================== -# SERVER_PORT 为 Django / uvicorn 对外端口 +# SERVER_PORT 为 Django / uvicorn 容器内部端口(由 nginx 反代,对公网不直接暴露) SERVER_PORT=8888 # ==================== 远程 Worker 配置 ==================== # 供远程 Worker 访问主服务器的地址: # - 仅本地部署:server(Docker 内部服务名) -# - 有远程 Worker:改为主服务器外网 IP(如 192.168.1.100) -# 注意:远程 Worker 访问数据库/Redis 也会使用此地址(除非配置了远程 PostgreSQL) +# - 有远程 Worker:改为主服务器外网 IP 或域名(如 192.168.1.100 或 xingrin.example.com) +# 注意:远程 Worker 会通过 https://{PUBLIC_HOST} 访问(nginx 反代到后端 8888) PUBLIC_HOST=server # ==================== Django 核心配置 ==================== diff --git a/docker/docker-compose.dev.yml b/docker/docker-compose.dev.yml index bc51622e..420b9716 100644 --- a/docker/docker-compose.dev.yml +++ b/docker/docker-compose.dev.yml @@ -37,8 +37,6 @@ services: context: .. dockerfile: docker/server/Dockerfile restart: always - ports: - - "${SERVER_PORT}:8888" env_file: - .env depends_on: diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml index 672ecb53..cd02e364 100644 --- a/docker/docker-compose.yml +++ b/docker/docker-compose.yml @@ -41,8 +41,6 @@ services: server: image: ${DOCKER_USER:-yyhuni}/xingrin-server:${IMAGE_TAG:?IMAGE_TAG is required} restart: always - ports: - - "${SERVER_PORT}:8888" env_file: - .env depends_on: diff --git a/docker/start.sh b/docker/start.sh index 3d2753ec..49694aaa 100755 --- a/docker/start.sh +++ b/docker/start.sh @@ -173,7 +173,7 @@ if [ "$WITH_FRONTEND" = true ]; then echo -e " XingRin: ${CYAN}https://${ACCESS_HOST}/${NC}" echo -e " ${YELLOW}(HTTP 会自动跳转到 HTTPS)${NC}" else - echo -e " API: ${CYAN}http://${ACCESS_HOST}:8888${NC}" + echo -e " API: ${CYAN}通过前端或 nginx 访问(后端未暴露 8888)${NC}" echo "" echo -e "${YELLOW}[TIP]${NC} 前端未启动,请手动运行:" echo " cd frontend && pnpm dev" diff --git a/docs/quick-start.md b/docs/quick-start.md index c25da73b..c104697d 100644 --- a/docs/quick-start.md +++ b/docs/quick-start.md @@ -14,10 +14,9 @@ - **端口要求**: 需要开放以下端口 - `80` - HTTP 访问(自动跳转到 HTTPS) - `443` - HTTPS 访问(主要访问端口) - - `3000` - 前端开发服务(开发模式) - - `8888` - 后端 API 服务 - `5432` - PostgreSQL 数据库(如使用本地数据库) - `6379` - Redis 缓存服务 + - 后端 API 仅容器内监听 8888,由 nginx 反代到 80/443,对公网无需放行 8888 ## 一键安装 @@ -64,10 +63,10 @@ sudo ./install.sh --no-frontend 80 - HTTP 访问 443 - HTTPS 访问 3000 - 前端服务(开发模式) -8888 - 后端 API 5432 - PostgreSQL(如使用本地数据库) 6379 - Redis 缓存 ``` +> 后端 API 默认仅在容器内 8888 监听,由 nginx 反代到 80/443,对公网无需放行 8888。 #### 推荐方案 - **国外 VPS**:如 Vultr、DigitalOcean、Linode 等,默认开放所有端口,无需额外配置 @@ -157,8 +156,8 @@ DB_USER=postgres # 数据库用户 DB_PASSWORD=随机生成 # 数据库密码 # 服务配置 -SERVER_PORT=8888 # 后端服务端口 -PUBLIC_HOST=server # 对外访问地址 +SERVER_PORT=8888 # 后端容器内部端口(仅 Docker 内网监听) +PUBLIC_HOST=server # 对外访问地址(远程 Worker 用,配置外网 IP 或域名) DEBUG=False # 调试模式 # 版本配置 diff --git a/docs/wordlist-architecture.md b/docs/wordlist-architecture.md index 75ef3583..eb1fa360 100644 --- a/docs/wordlist-architecture.md +++ b/docs/wordlist-architecture.md @@ -231,8 +231,8 @@ sequenceDiagram WORDLISTS_PATH=/opt/xingrin/wordlists # Server 地址(Worker 用于下载文件) -PUBLIC_HOST=your-server-ip -SERVER_PORT=8888 +PUBLIC_HOST=your-server-ip # 远程 Worker 会通过 https://{PUBLIC_HOST}/api 访问 +SERVER_PORT=8888 # 后端容器内部端口,仅 Docker 内网监听 ``` ## 八、常见问题 @@ -244,8 +244,8 @@ A: 更新字典内容后会重新计算 hash,Worker 下次使用时会检测 ### Q: 远程 Worker 下载文件失败? A: 检查: -1. `PUBLIC_HOST` 是否配置为 Server 的外网 IP -2. Server 端口(默认 8888)是否开放 +1. `PUBLIC_HOST` 是否配置为 Server 的外网 IP 或域名 +2. Nginx 443 (HTTPS) 是否可达(远程 Worker 通过 nginx 访问后端) 3. Worker 到 Server 的网络是否通畅 ### Q: 如何批量导入字典? diff --git a/install.sh b/install.sh index de0b8230..d6693c78 100755 --- a/install.sh +++ b/install.sh @@ -233,7 +233,7 @@ show_summary() { echo -e "${YELLOW}[!] 云服务器某些厂商默认开启了安全策略(阿里云/腾讯云/华为云等):${RESET}" echo -e " 端口未放行可能导致无法访问或无法扫描,强烈推荐用国外vps,或者在云控制台放行:" - echo -e " ${RESET}80, 443, 3000,8888, 5432, 6379" + echo -e " ${RESET}80, 443, 5432, 6379" echo }