# Профиль выполняется ВНУТРИ контейнера gitea, а не на ноде cloud-pc. # До переезда на OpenTofu (2026-09-02) данные жили в bind mount каталога ноды # /opt/data/gitea, и профиль работал на самой ноде. После переезда данные — # это volume контейнера (mp0 на datastore), снаружи LXC такого пути больше нет, # поэтому профиль переехал внутрь по образцу vaultwarden. Репозиторий restic # тот же, цепочка снапшотов продолжается; изменились только пути внутри них. - name: Configure Gitea offsite backup to Yandex Disk hosts: gitea gather_facts: false vars: ansible_become: false offsite_profile: gitea offsite_repository: rclone:yadisk:System/Backups/HomeLab/restic/gitea offsite_source_path: /opt/gitea/data offsite_sqlite_db: /opt/gitea/data/gitea/gitea.db offsite_backup_tag: gitea,cloud-pc,yadisk offsite_timer_oncalendar: "*-*-* 04:15:00" offsite_rclone_config_local: ~/.config/rclone/rclone.conf offsite_restic_password_local: "{{ playbook_dir }}/../generated/restic-offsite-password" offsite_excludes: - /opt/gitea/data/gitea/gitea.db - /opt/gitea/data/gitea/gitea.db-shm - /opt/gitea/data/gitea/gitea.db-wal - /opt/gitea/data/gitea/log/** - /opt/gitea/data/gitea/sessions/** - /opt/gitea/data/gitea/queues/** - /opt/gitea/data/gitea/tmp/** # lost+found появился вместе с переходом на volume: это свежая ext4, и # каталог принадлежит uid 0 хоста, что внутри unprivileged LXC видно как # nobody:nogroup и нечитаемо. Без исключения restic отдаёт exit 3 # ("at least one source file could not be read") и юнит падает каждую # ночь, хотя снапшот при этом сохраняется. Найдено 2026-09-02. - /opt/gitea/data/lost+found/** tasks: - name: Configure restic offsite profile ansible.builtin.include_tasks: ../tasks/offsite-restic-profile.yml - name: Configure Vaultwarden offsite backup to Yandex Disk hosts: vaultwarden gather_facts: false vars: ansible_become: false offsite_profile: vaultwarden offsite_repository: rclone:yadisk:System/Backups/HomeLab/restic/vaultwarden offsite_source_path: /opt/vaultwarden/data offsite_sqlite_db: /opt/vaultwarden/data/db.sqlite3 offsite_backup_tag: vaultwarden,mini-pc,yadisk offsite_timer_oncalendar: "*-*-* 04:45:00" offsite_rclone_config_local: ~/.config/rclone/rclone.conf offsite_restic_password_local: "{{ playbook_dir }}/../generated/restic-offsite-password" offsite_excludes: - /opt/vaultwarden/data/db.sqlite3 - /opt/vaultwarden/data/db.sqlite3-shm - /opt/vaultwarden/data/db.sqlite3-wal - /opt/vaultwarden/data/tmp/** tasks: - name: Configure restic offsite profile ansible.builtin.include_tasks: ../tasks/offsite-restic-profile.yml - name: Configure Grimmory offsite backup to Yandex Disk hosts: grimmory gather_facts: false vars: ansible_become: false offsite_profile: grimmory offsite_repository: rclone:yadisk:System/Backups/HomeLab/restic/grimmory offsite_source_path: /opt/grimmory offsite_sqlite_db: "" offsite_mariadb_container: grimmory-mariadb offsite_mariadb_database: grimmory offsite_mariadb_user: grimmory offsite_mariadb_env: /opt/grimmory/.env offsite_mariadb_dump_name: grimmory.sql offsite_backup_tag: grimmory,cloud-pc,yadisk offsite_timer_oncalendar: "*-*-* 05:15:00" offsite_rclone_config_local: ~/.config/rclone/rclone.conf offsite_restic_password_local: "{{ playbook_dir }}/../generated/restic-offsite-password" offsite_excludes: - /opt/grimmory/books/** - /opt/grimmory/bookdrop/** - /opt/grimmory/mariadb/** - /opt/grimmory/backup-staging/** - /opt/grimmory/**/heapdump*.hprof - /opt/grimmory/**/cache/** tasks: - name: Configure restic offsite profile ansible.builtin.include_tasks: ../tasks/offsite-restic-profile.yml