Представь, что твоя конфигурация TrueNAS — это живой, дышащий проект. Ты вносишь изменения, настраиваешь тюнинги, создаешь общие папки (SMB/NFS), настраиваешь репликацию ZFS. А потом что-то идет не так, или ты просто хочешь откатиться к предыдущей стабильной версии. Как версионировать эти изменения? Ответ — интеграция с GitHub. Давай разберем, как превратить твой TrueNAS в часть DevOps-пайплайна с помощью Git.
Зачем связывать TrueNAS и GitHub?
Основная цель — версионирование и резервное копирование конфигурации. Файл конфигурации TrueNAS (который можно скачать из веб-интерфейса) — это JSON, идеально подходящий для Git. Но на этом возможности не заканчиваются:
- Автоматическое резервное копирование конфига по расписанию с отправкой в приватный репозиторий.
- Хранение и запуск кастомных скриптов (например, для очистки, мониторинга или интеграции со сторонними сервисами).
- Синхронизация конфигураций между несколькими инстансами TrueNAS (Core, Scale, тестовый и продакшн).
- Документирование изменений через commit messages. Теперь ты точно будешь знать, что и зачем поменял две недели назад.
Подготовка окружения: SSH-ключи и доступ
Для безопасного взаимодействия с GitHub из TrueNAS нам понадобится SSH. Работать будем через Shell (либо напрямую в консоли TrueNAS, либо через SSH-доступ к самому серверу).
Шаг 1: Генерация SSH-ключа на TrueNAS
Зайди в Shell TrueNAS (меню Система -> Шелл). Выполни команду для генерации ключа ED25519 (рекомендуется):
ssh-keygen -t ed25519 -C "truenas@myhomelab" -f /root/.ssh/id_ed25519
# На вопрос о passphrase можно нажать Enter (оставить пустым для автоматизации).
# Ключи создадутся: приватный /root/.ssh/id_ed25519 и публичный /root/.ssh/id_ed25519.pub
Шаг 2: Добавление публичного ключа в GitHub
Выведи содержимое публичного ключа и скопируй его:
cat /root/.ssh/id_ed25519.pub
# ssh-ed25519 AAAAC3NzaC... truenas@myhomelab
Затем в GitHub:
- Зайди в Settings → SSH and GPG keys → New SSH key.
- Вставь ключ, дай понятное имя (например, "TrueNAS Server").
- Сохрани.
Шаг 3: Тестирование SSH-подключения
Проверь, что всё работает:
ssh -T git@github.com
# Должен появиться ответ: "Hi username! You've successfully authenticated..."
yes. Для полной автоматизации можно добавить хост в known_hosts заранее: ssh-keyscan github.com >> /root/.ssh/known_hosts.
Создание репозитория и первый коммит конфигурации
Создай на GitHub новый приватный репозиторий, например, truenas-backup. Затем в Shell TrueNAS:
Шаг 4: Клонирование репозитория и настройка Git
# Перейдем в удобную директорию, например, /mnt/tank/data (замени на свой пул)
cd /mnt/tank/data
# Клонируем репозиторий (URL смотри на странице репозитория GitHub)
git clone git@github.com:yourusername/truenas-backup.git
cd truenas-backup
# Настроим глобально git (если еще не сделано)
git config --global user.email "admin@mydomain.local"
git config --global user.name "TrueNAS Admin"
Шаг 5: Экспорт и коммит конфигурации TrueNAS
В веб-интерфейсе TrueNAS:
- Иди в Система → Общие → Сохранить конфигурацию.
- СНИМИ ГАЛКУ с "Export Secret Seed" (это исключит пароли и ключи).
- Сохрани файл (например,
truenas-config-2023-10.db) в клонированную ранее папку репозитория.
Вернись в Shell:
cd /mnt/tank/data/truenas-backup
# Добавим файл конфига в git
git add truenas-config-2023-10.db
# Сделаем коммит
git commit -m "Initial commit: TrueNAS config backup"
# Отправим (запушим) в GitHub
git push origin main
Поздравляю! Твоя конфигурация теперь под контролем версий в GitHub.
Автоматизация: Скрипт для регулярного бэкапа в GitHub
Вручную делать это каждый раз неудобно. Давай создадим скрипт и настроим его выполнение по расписанию через задачи Cron в TrueNAS.
Шаг 6: Создание скрипта автоматического бэкапа
Создай файл /mnt/tank/scripts/backup-to-github.sh:
#!/bin/bash
# Скрипт автоматического бэкапа конфигурации TrueNAS в GitHub репозиторий
# --- Конфигурация ---
REPO_DIR="/mnt/tank/data/truenas-backup"
CONFIG_NAME="truenas-config-$(date +%Y-%m-%d-%H%M).db"
LOG_FILE="/var/log/truenas-github-backup.log"
# --------------------
echo "[$(date)] Starting TrueNAS config backup to GitHub" >> "$LOG_FILE"
# 1. Экспортируем конфигурацию БЕЗ секретных данных
echo "Exporting configuration..." >> "$LOG_FILE"
if midclt call config.save "{\"secretseed\": false}" > "$REPO_DIR/$CONFIG_NAME"; then
echo "Config exported successfully to $CONFIG_NAME" >> "$LOG_FILE"
else
echo "ERROR: Failed to export config!" >> "$LOG_FILE"
exit 1
fi
# 2. Переходим в директорию репозитория
cd "$REPO_DIR" || { echo "ERROR: Cannot cd to $REPO_DIR" >> "$LOG_FILE"; exit 1; }
# 3. Добавляем новый файл конфига в git
git add "$CONFIG_NAME" >> "$LOG_FILE" 2>&1
# 4. Коммитим изменения
git commit -m "Auto-backup: $CONFIG_NAME" >> "$LOG_FILE" 2>&1
# 5. Пушим в удаленный репозиторий (GitHub)
if git push origin main >> "$LOG_FILE" 2>&1; then
echo "[$(date)] Backup SUCCESS: $CONFIG_NAME pushed to GitHub" >> "$LOG_FILE"
# Опционально: удаляем старые локальные бекапы, оставляем последние 5
ls -t truenas-config-*.db | tail -n +6 | xargs rm -f 2>/dev/null
else
echo "[$(date)] ERROR: Git push failed!" >> "$LOG_FILE"
exit 1
fi
echo "[$(date)] Backup script finished" >> "$LOG_FILE"
Сделай скрипт исполняемым:
chmod +x /mnt/tank/scripts/backup-to-github.sh
Шаг 7: Настройка задачи Cron в TrueNAS
Иди в веб-интерфейсе: Задачи → Добавить задачу Cron.
- Описание: "Auto backup config to GitHub"
- Команда:
/mnt/tank/scripts/backup-to-github.sh - Пользователь: root
- Расписание: Например, каждое воскресенье в 3 ночи:
0 3 * * 0 - Скрыть вывод: Не отмечено (чтобы видеть логи в интерфейсе задач).
Теперь твоя конфигурация будет автоматически сохраняться в GitHub каждую неделю с timestamp в имени файла.
Продвинутые сценарии: Управление кастомными скриптами через GitHub
Git-репозиторий можно использовать как централизованное хранилище для всех твоих скриптов обслуживания TrueNAS. Например, скрипт очистки снимков (snapshots) ZFS.
Пример: Скрипт ротации снимков ZFS
Создай в репозитории файл scripts/zfs-snapshot-rotation.sh:
#!/bin/bash
# Удаляем старые ZFS снапшоты, оставляя:
# - Последние 7 ежедневных снапшотов
# - Последние 4 еженедельных (воскресных)
# - Последние 3 ежемесячных (первого числа)
POOL="tank"
DATASET="tank/data"
SNAP_PREFIX="auto-"
# Удаляем старые ежедневные снапшоты (кроме последних 7)
zfs list -t snapshot -o name -H -r "$DATASET" | \
grep "@${SNAP_PREFIX}" | \
grep -E "[0-9]{4}-[0-9]{2}-[0-9]{2}$" | \
head -n -7 | \
while read -r snap; do
echo "Destroying old snapshot: $snap"
zfs destroy "$snap"
done
Затем настрой задачу Cron в TrueNAS на выполнение этого скрипта, предварительно вытянув его последнюю версию из GitHub:
cd /mnt/tank/data/truenas-backup
git pull origin main
/mnt/tank/data/truenas-backup/scripts/zfs-snapshot-rotation.sh
Сравнение подходов к интеграции TrueNAS и GitHub
| Метод | Плюсы | Минусы | Использование |
|---|---|---|---|
| Ручной экспорт/коммит | Полный контроль, простота | Нет автоматизации, легко забыть | Разовые изменения, тестирование |
| Cron + Shell-скрипт | Полная автоматизация, гибкость | Требует настройки SSH и Cron | Регулярное резервное копирование конфигурации |
| Использование GitHub Actions | Мощная оркестрация, уведомления | Требует открытия API TrueNAS (риск!) | Сложные пайплайны CI/CD для скриптов |
| TrueNAS API + Кастомный клиент | Программный контроль, интеграция | Высокий порог входа, разработка | Корпоративные сценарии, мониторинг |
Вопросы и ответы (FAQ)
Можно ли использовать Git, встроенный в TrueNAS SCALE?
TrueNAS SCALE основан на Linux и имеет предустановленный Git. В TrueNAS CORE (на FreeBSD) Git также доступен из коробки или легко устанавливается через pkg. Все команды из этого руководства работают в обоих дистрибутивах.
Безопасно ли хранить конфиг TrueNAS в публичном репозитории GitHub?
gpg или age.
Как восстановить конфигурацию TrueNAS из бэкапа в GitHub?
Процесс восстановления состоит из двух шагов:
- Скачай нужный файл
.dbиз репозитория (через веб-интерфейс GitHub или командуgit checkout). - В веб-интерфейсе TrueNAS иди в Система → Общие → Загрузить конфигурацию, выбери скачанный файл и подтверди перезагрузку.
Помни: восстановление конфига перезапишет все текущие настройки системы.
Можно ли автоматизировать бэкап не только конфига, но и списка установленных приложений/плагинов?
Да! Для TrueNAS SCALE можно добавить в скрипт команду для экспорта списка приложений:
# Экспорт списка установленных приложений (TrueNAS SCALE)
cli -c "app chart_release query" > "$REPO_DIR/installed-apps-$(date +%Y-%m-%d).json"
git add "installed-apps-*.json"
Для TrueNAS CORE (плагины на базе Jail) можно бэкапить список через iocage list.
Что делать, если SSH-ключ не работает (permission denied)?
Проверь цепочку:
- Правильность публичного ключа в настройках GitHub.
- Права на файлы SSH-ключа на TrueNAS:
chmod 600 /root/.ssh/id_ed25519иchmod 644 /root/.ssh/id_ed25519.pub. - Запускается ли ssh-agent и добавлен ли в него ключ? Для автоматизации в скрипте можно добавить:
eval "$(ssh-agent -s)" && ssh-add /root/.ssh/id_ed25519.
Заключение и лучшие практики
Интеграция TrueNAS с GitHub — это не просто бэкап, это переход на DevOps-уровень управления домашней или корпоративной инфраструктурой. Ты получаешь:
- Историю изменений с комментариями.
- Автоматизацию рутинных задач (бэкап, очистка).
- Централизованное хранилище для всех скриптов и конфигов.
- Возможность быстрого отката к любой рабочей версии конфигурации.
Стартуй с малого: настрой автоматический бэкап конфигурации раз в неделю. Затем добавь в репозиторий свои скрипты обслуживания. Со временем ты сможешь настроить целый пайплайн, где изменение конфига в Git будет триггерить автоматические тесты (если есть тестовая среда) и уведомления в Telegram/Slack.
Помни главное правило: приватный репозиторий и никаких секретов в коммитах. Удачи в настройке!