# CLAUDE.md This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. # NAS 运维管理 这个目录是 NAS(Synology DS925+)的运维配置管理仓库,存放 docker-compose 配置、脚本和文档。 ## 连接 ```bash ssh nas # ~/.ssh/config 已配置,HostName 192.168.3.200,User wangjia ``` ## 硬件概况 | 项目 | 信息 | |------|------| | 型号 | Synology DS925+ | | 系统 | DSM (Linux 5.10.55+, x86_64) | | 存储 | /volume1,7TB 总量 | | IP | 192.168.3.200(静态,手动配置) | ## 仓库目录结构 ``` docker/ ├── forgejo/ │ ├── docker-compose.yml # Forgejo + act-runner(token 通过 .env 注入) │ ├── .env.example # 复制为 .env 填入真实 token │ └── runner/ │ └── config.yaml # act-runner 配置 └── proxy/ ├── docker-compose.yml # mihomo 容器 ├── mihomo/ │ ├── config.yaml # 透明代理规则(uuid 用 占位) │ └── .env.example # 复制为 .env 填入真实 UUID └── dnsmasq/ └── dnsmasq.conf # 预备 DHCP 配置(暂未启用) ``` NAS 上实际路径:`/volume1/docker/<服务名>/`,与仓库 `docker/` 目录一一对应。 ## Docker 服务 ### 权限说明 `wangjia` 用户不在 docker 组,**无法直接运行 `docker` 命令**。容器管理需通过: - DSM → Container Manager UI - 或 root 权限(DSM 终端) ### Forgejo(Git 服务) - **`git.51yanmei.com` 当前仅局域网可达**:DNS 记录指向 `192.168.3.200`(内网私有 IP、未走 CF 代理),公网打不开 - **局域网直连**:`http://192.168.3.200:3000/` - **公网访问**:经 Tailscale,`http://100.95.151.13:3000`(或 `https://ds925.tail6e8719.ts.net`),见 `docs/public-access.md` - **SSH Clone(局域网)**:`ssh://git@192.168.3.200:2222/` - **配置方式**:优先通过 docker-compose.yml 的环境变量(`GITEA__section__key`)管理,避免直接改 app.ini - **app.ini 路径**:`/volume1/docker/forgejo/data/gitea/conf/app.ini`(属于 uid=1000,wangjia 只读,需 root 修改) - **数据库**:SQLite,`/volume1/docker/forgejo/data/gitea/gitea.db` - **act-runner**:CI/CD runner(`forgejo-act-runner`),挂载 `/var/run/docker.sock` 可运行 Docker 任务 ```bash # 查看 Forgejo 日志 ssh nas "tail -f /volume1/docker/forgejo/data/gitea/log/gitea.log" ``` ### mihomo(透明代理) 局域网透明代理网关,Windows 设备(192.168.3.88)以 NAS 为默认网关。 **架构:** ``` Windows (192.168.3.88) └─ 网关 = 192.168.3.200,DNS = 192.168.3.200 NAS mihomo (TUN 模式, Meta 接口) ├─ 国内流量 → DIRECT(GEOSITE/GEOIP CN 匹配) └─ 国外流量 → ec2-sg(新加坡 AWS,VLESS + Reality) ``` **关键配置:** - 配置文件:`/volume1/docker/proxy/mihomo/config.yaml` - DNS:端口 53,fake-ip 模式,范围 198.18.0.0/15,`fake-ip-persist: true` - 混合代理端口:7890(HTTP/SOCKS5,局域网可用) - 管理 API:`http://192.168.3.200:9090` - 代理节点:VLESS + Reality(**不使用** `flow: xtls-rprx-vision`,客户端和服务端均已移除) ```bash # 热重载配置(不重启容器) ssh nas "curl -s -X PUT 'http://127.0.0.1:9090/configs?force=true' \ -H 'Content-Type: application/json' \ -d '{\"path\":\"/root/.config/mihomo/config.yaml\"}'" # 测试代理节点 ssh nas "curl -s 'http://127.0.0.1:9090/proxies/ec2-sg/delay?timeout=5000&url=https://www.cloudflare.com/cdn-cgi/trace'" # 测试出口 IP ssh nas "curl -s --max-time 10 --proxy 'socks5h://127.0.0.1:7890' https://ifconfig.me" # 查看实时日志 ssh nas "curl -s http://127.0.0.1:9090/logs -N --max-time 10" ``` **dnsmasq(预备,未启用):** 配置文件已就绪(`docker/proxy/dnsmasq/dnsmasq.conf`),待未来启用 DHCP 自动分发时使用。启用前需将 mihomo DNS 端口从 53 改为 1053,并将 dnsmasq 加入 docker-compose.yml。 ### jiu-db 自动备份 每天 02:00(UTC+8)自动备份 jiu 项目 PostgreSQL,存至 `/volume1/docker/backups/jiu-db/`,格式 `jiu_db_YYYYMMDD_HHmmss.sql.gz`,保留约 16 天。 ```bash ssh nas "ls -lh /volume1/docker/backups/jiu-db/" ``` ## 端口清单 | 端口 | 服务 | |------|------| | 22 | SSH | | 53 | mihomo DNS(fake-ip) | | 80 / 443 | Synology nginx(反代 + DSM 重定向) | | 2222 | Forgejo SSH | | 3000 | Forgejo HTTP | | 5000 / 5001 | DSM Web UI(HTTP / HTTPS) | | 5432 | PostgreSQL(localhost only) | | 6690 | Synology Drive | | 7890 | mihomo 混合代理(HTTP/SOCKS5) | | 9090 | mihomo 管理 API | | 41641/udp | Tailscale WireGuard | | 445 / 139 | SMB 文件共享 | ## Synology 反向代理 通过 DSM 内置 nginx 管理:**Control Panel → Login Portal → Advanced → 反向代理服务器** 当前规则: | 来源 | 目的地 | |------|--------| | `http://git.nas.local:80` | `http://localhost:3000` | ## 常用运维 ```bash # 磁盘使用 ssh nas "df -h /volume1" # 查看路由规则(透明代理策略路由) ssh nas "ip rule list" ssh nas "ip route show table 2022 | head -5" # 查看网络接口(Meta = mihomo TUN) ssh nas "ip addr show Meta" ``` ## 公网访问(Tailscale,已上线) NAS 通过 **Tailscale(WireGuard 网格 VPN)** 对外提供 Gitea 与 Synology Photos 访问: 零公网暴露、无文件大小限制、不泄露家庭公网 IP。部署与踩坑详见 `docs/public-access.md`。 (Cloudflare Tunnel 因免费版 100MB 上限不适合 Photos 大文件,故选 Tailscale。) - **节点**:`ds925`,Tailscale IP `100.95.151.13`,MagicDNS `ds925.tail6e8719.ts.net` - **身份**:Google SSO(`wang880812@gmail.com`);Google 仅登录/进后台时需要,日常用不需要 - **CLI 路径**:`/var/packages/Tailscale/target/bin/tailscale`(已设 `--operator=wangjia`,免 sudo) - **关键依赖**:mihomo 的 `fake-ip-filter` 必须含 `+.tailscale.com` 等(见 mihomo 配置注释), 否则 fake-ip 劫持会导致 `tailscale up` 卡住。修复脚本:`scripts/fix-mihomo-tailscale.sh` ```bash ssh nas "/var/packages/Tailscale/target/bin/tailscale status" # 查看节点与对端连接 ``` ### QuickConnect(DSM 官方中转,已启用) - **QuickConnect ID**:`wangjia812`(查看/修改:DSM → 控制面板 → 外部访问 → QuickConnect) - 网页 DSM 入口:http://QuickConnect.cn/wangjia812(国内走 .cn 中转节点) - Synology Photos / Drive 等移动端登录:服务器地址直接填 `wangjia812` - 走 Synology 中转服务器,大文件传输速度一般;自用优先 Tailscale(`100.95.151.13`), QuickConnect 主要留给家人或未装 Tailscale 的设备 ## TODO - [x] NAS 安装 Tailscale 套件并登录,Gitea/Photos 公网访问已验证(含 >100MB 上传) - [x] 后台对 `ds925` 关闭 key expiry(已确认 KeyExpiry=None,不会再因密钥过期掉线) - [ ] (可选)`tailscale serve` 给 Gitea 套 HTTPS(解决 Arc 等强制 HTTPS 浏览器超时) - [ ] (可选)新加坡 EC2 自建 DERP 中继 / 把 Tailscale UDP 排除出 mihomo,从香港中继提速到 P2P 直连(`docker/derp/`) - [ ] wangjia 用户加入 docker 组,方便 SSH 管理容器 - [ ] dnsmasq 启用(全局 DHCP 分发,让其他设备也自动走透明代理) - [ ] Forgejo app.ini 的 DOMAIN/SSH_DOMAIN/ROOT_URL 改为 `git.51yanmei.com`(需 root,docker-compose 环境变量已覆盖,改 app.ini 仅为保持一致)