Files
MemRelay/projects/d1932ed6-07d3-4463-a224-8534ffd69a07/端口冲突检查的实现方式(deploy.py - manage.py reconfigure).md
T

2.6 KiB
Raw Blame History

title, type, permalink, stable_id, scope, project_id, memory_type, status, revision, restored_from_commit, created_at, updated_at, tags
title type permalink stable_id scope project_id memory_type status revision restored_from_commit created_at updated_at tags
端口冲突检查的实现方式(deploy.py / manage.py reconfigure) decision main/projects/d1932ed6-07d3-4463-a224-8534ffd69a07/端口冲突检查的实现方式-deploy.py-manage.py-reconfigure 68deebdd-e5d1-4bc6-8e70-e4342e72f986 project d1932ed6-07d3-4463-a224-8534ffd69a07 decision active 1 6a6a895eaf 2026-09-23T15:05:44.159044+00:00 2026-09-23T15:05:44.159107+00:00
nextoffice
deploy
ports
conflict-check
manage.py

背景:用户要求安装时可自定义 Nextcloud/ONLYOFFICE 宿主机端口,并检查端口是否冲突或被占用(部分服务器 8080/8081 已被其他系统使用)。自定义端口能力此前已存在(交互提示 + --nextcloud-port/--onlyoffice-port),本次补齐占用检查。

决定与实现(提交 7b3796e):

  • 端口检测放在 deploy.py:docker_published_ports() 解析 docker ps --format '{{.Names}}\t{{.Label "com.docker.compose.project"}}\t{{.Ports}}',用正则 :(\d+)(?:-(\d+))?->\d+(?:-\d+)?/tcp 取已发布 TCP 端口(支持端口区间,忽略 UDP);port_holder() 先查 Docker 发布端口,再对 0.0.0.0:port 做 bind 探测。
  • 本项目容器(compose 项目名 nextoffice,常量 COMPOSE_PROJECT 必须与 docker-compose.yml 的 name 一致)占用的端口视为可用,保证在已部署服务器上重复运行 deploy.py / reconfigure 不误报。
  • bind 遇 PermissionError(非 root 绑定特权端口)视为无法验证、放行由 Docker 决定;其他 OSError 视为“本机其他程序”占用。
  • choose_port(value, label, default, reserved) 统一处理 CLI 值和交互输入:CLI 值被占用/越界/非数字/与另一服务相同时抛 InstallError 直接退出,不写 .env;交互模式默认端口被占用时向上扫描最多 200 个端口建议第一个可用端口,输入无效则重新提示。
  • 已有 .env 重跑 deploy.py 时,check_configured_ports() 在拉镜像前预检两个端口是否被外部占用,并提示用 manage.py reconfigure --nextcloud-port/--onlyoffice-port 更换。
  • manage.py 通过 from deploy import choose_port 复用逻辑(两个脚本同目录交付,不新增共享模块);reconfigure 的端口输入因此也有范围/占用/相同校验。
  • 不使用 SO_REUSEADDR 做探测(Windows 上会允许抢占端口)。
  • AGENT.md 按用户要求加入 .gitignore,不提交。docs/ 目录仍被 .gitignore 忽略,docs/INSTALL.md、docs/TROUBLESHOOTING.md 的端口说明只存在于本地交付目录。