# ============================================================================ # Сервис №4: vaultwarden (OLD vmid 140, mini-pc). # Эталон снят 2026-09-02: ssh mini-pc sudo pct config 140 / cat /etc/pve/lxc/140.conf. # Данные критичны: SQLite /opt/vaultwarden/data/db.sqlite3 (плюс config.json, # rsa_key.pem, icon_cache/). Переносятся вручную на шаге 4.4, а не этим # ресурсом — контейнер создаётся пустым, данные переезжают отдельной # процедурой (см. docs/ai/migration-tofu.md, п.5.4). # # vm_id 154. TMPIP 192.168.1.13 отработал на шагах 4.3 и 4.4; cutover выполнен # 2026-09-02, адрес боевой — 192.168.1.24. Данные перенесены и сверены: # integrity_check ok, 1 users / 314 ciphers совпали с боевыми. # OLD (140) остановлен и остаётся откатом минимум неделю, до 2026-09-09 # (docs/ai/migration-tofu.md, инвариант №2). # ============================================================================ resource "proxmox_virtual_environment_container" "vaultwarden" { node_name = "mini-pc" vm_id = 154 unprivileged = true start_on_boot = true started = true tags = ["tofu"] initialization { hostname = "vaultwarden" ip_config { ipv4 { address = "192.168.1.24/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 = 2 } memory { dedicated = 1024 swap = 512 } disk { datastore_id = "local-lvm" size = 16 } # Эталон: features: nesting=1,keyctl=1 плюс /dev/fuse, проброшенный вручную # двумя строками в /etc/pve/lxc/140.conf (lxc.cgroup2.devices.allow c 10:229 # rwm + lxc.mount.entry) — Proxmox API сырые lxc.* ключи не принимает, # поэтому pve-vaultwarden.yml добавляет их через lineinfile. # # ЗАМЕНА ЭТОГО ОБХОДА — features.fuse, а НЕ device_passthrough. # device_passthrough (dev0:) нужен только для сырых character-устройств # вида /dev/net/tun. Для /dev/fuse у PVE есть штатный флаг, и именно он # проверен на пилоте VMID 199 — результат был # `features: fuse=1,keyctl=1,nesting=1`, см. tofu/pilot.tf.example:17-21 # и tofu/README.md. Формулировка «device_passthrough для каждого устройства» # в migration-tofu.md п.4.2 слишком широкая; она уточнена там же. # # Следствие: pct config нового контейнера покажет # `features: fuse=1,keyctl=1,nesting=1` — текстуально иначе, чем эталон, # но это тот же эффект штатным механизмом вместо обхода. features { nesting = true keyctl = true fuse = true } # roles/pve_lxc всем контейнерам ставит cmode=shell (pve_lxc_cmode), провайдер # это отслеживает через блок console.type — без него на следующем apply # откатит на дефолт Proxmox tty (найдено на emergency-bot, см. tofu/README.md). console { type = "shell" } network_interface { name = "eth0" bridge = "vmbr0" firewall = true } startup { order = 40 } } output "vaultwarden" { description = "Что проверять на узле после apply" value = { vmid = proxmox_virtual_environment_container.vaultwarden.vm_id node = proxmox_virtual_environment_container.vaultwarden.node_name verify = "ssh mini-pc sudo pct config ${proxmox_virtual_environment_container.vaultwarden.vm_id}" } }