# ============================================================================ # Сервис №9 по плану (docs/ai/migration-tofu.md, раздел 5): mihomo. # Локальный прокси + MetaCubeXD UI. На него завязаны egress hermes-ai # (bash_config_proxy_* в hosts.yml), внешние пробы Uptime Kuma, emergency-бот # и уведомления gyro — простой затрагивает всё это разом. # # OLD vmid 143, узел mini-pc, боевой адрес 192.168.1.27. # Эталон снят 2026-09-02: ssh mini-pc sudo pct config 143 (дословно совпадает # с /etc/pve/lxc/143.conf): # # arch: amd64 # cmode: shell # cores: 1 # features: nesting=1,keyctl=1 # hostname: mihomo # memory: 512 # nameserver: 1.1.1.1 # net0: name=eth0,bridge=vmbr0,firewall=1,gw=192.168.1.1,ip=192.168.1.27/24,type=veth # onboot: 1 # ostype: debian # rootfs: local-lvm:vm-143-disk-0,size=8G # startup: order=70 # swap: 512 # unprivileged: 1 # lxc.cgroup2.devices.allow: c 10:229 rwm # /dev/fuse # lxc.mount.entry: /dev/fuse dev/fuse none bind,create=file # lxc.cgroup2.devices.allow: c 10:200 rwm # /dev/net/tun # lxc.mount.entry: /dev/net/tun dev/net/tun none bind,create=file # # vm_id 159 — новый VMID для blue-green переезда (назначен, не менять). # TMPIP 192.168.1.18 используется только на шаге 4.3. После шага 4.5.15 адрес # меняется на боевой 192.168.1.27, OLD (143) останавливается и остаётся # откатом минимум неделю. # # --- Два устройства, ДВА разных механизма ----------------------------------- # /dev/fuse -> штатный флаг features.fuse (Docker внутри на fuse-overlayfs). # /dev/net/tun -> блок device_passthrough (dev0: в PVE 8.2+). mihomo.service # запускает контейнер с `--device /dev/net/tun` для TUN-режима. # Это первый боевой сервис, использующий device_passthrough: на пилоте VMID # 199 механизм проверен (`dev0: deny-write=0,path=/dev/net/tun,...`, повторный # plan -> No changes), см. tofu/pilot.tf.example и tofu/README.md. Оба требуют # root@pam; в обычном токенном режиме Proxmox отвечает 403. # Следствие: pct config покажет `features: fuse=1,...` и `dev0: path=/dev/net/tun` # вместо сырых lxc.* строк эталона — тот же эффект штатным механизмом. # # --- Данные ---------------------------------------------------------------- # /opt/mihomo (~80 КБ): config/config.yaml (реальный конфиг прокси), # config/cache.db, config/providers/main.yaml. Переносится целиком на шаге # 4.4. Задача "Install default mihomo config if missing" в pve-mihomo.yml # идёт с force: false, поэтому перенесённый конфиг не перетирается. # ============================================================================ resource "proxmox_virtual_environment_container" "mihomo" { node_name = "mini-pc" vm_id = 159 unprivileged = true start_on_boot = true started = true tags = ["tofu"] initialization { hostname = "mihomo" ip_config { ipv4 { address = "192.168.1.27/24" gateway = "192.168.1.1" } } dns { servers = ["1.1.1.1"] } user_account { keys = [trimspace(file(pathexpand("~/.ssh/id_ed25519_homelab.pub")))] } } operating_system { template_file_id = "local:vztmpl/debian-13-standard_13.1-2_amd64.tar.zst" type = "debian" } cpu { cores = 1 } memory { dedicated = 512 swap = 512 } disk { datastore_id = "local-lvm" size = 8 } # Эталон: features: nesting=1,keyctl=1 плюс /dev/fuse через сырые lxc.* # строки. fuse=1 — штатная замена этого обхода (см. комментарий выше). features { nesting = true keyctl = true fuse = true } # /dev/net/tun: в эталоне проброшен сырыми lxc.cgroup2.devices.allow + # lxc.mount.entry. Штатная декларация — device_passthrough (dev0:). device_passthrough { path = "/dev/net/tun" } # roles/pve_lxc всем контейнерам ставит cmode=shell (pve_lxc_cmode), провайдер # это отслеживает через блок console.type — без него на следующем apply # откатит на дефолт Proxmox tty. Обнаружено 2026-09-02 на emergency-bot, # см. tofu/README.md. console { type = "shell" } network_interface { name = "eth0" bridge = "vmbr0" firewall = true } startup { order = 70 } } output "mihomo" { description = "Что проверять на узле после apply" value = { vmid = proxmox_virtual_environment_container.mihomo.vm_id node = proxmox_virtual_environment_container.mihomo.node_name verify = "ssh mini-pc sudo pct config ${proxmox_virtual_environment_container.mihomo.vm_id}" } }