Управление серверными конфигурациями через Git и символьные ссылки
Практическое руководство по хранению серверных конфигов в Git с использованием символьных ссылок (symlinks). SSH, Nginx, Systemd, iptables — полный цикл от инициализации до разворачивания на новом сервере.
Конфигурационные файлы на сервере разбросаны по разным директориям: /etc/ssh/, /etc/nginx/, /etc/systemd/system/. При ручном управлении легко потерять изменения, случайно удалить файл или забыть, какой именно конфиг был изменён неделю назад.
Подход с символьными ссылками (symlinks) и Git решает эти проблемы:
Все конфиги физически хранятся в одной директории-репозитории
На своих рабочих местах (где их ждут программы) находятся ссылки на файлы из репозитория
История изменений — в Git, бэкап — в удалённом репозитории
Как это работает: вы переносите файлы из /etc/ssh/sshd_config, /etc/nginx/sites-available/mysite и т. д. в ~/server-configs/, а на их местах создаёте символьные ссылки. Git отслеживает все изменения, а удалённый репозиторий служит бэкапом.
Подготовка структуры репозитория
Создайте единую директорию и подпапки для разных сервисов:
Никогда не храните пароли и ключи в Git. Вместо этого создавайте файлы-шаблоны с расширением .example:
myapp/database.yml.exampleyaml
1
2
3
4
5
6
7
8
9
# Шаблон конфигурации базы данных# Скопируйте в database.yml и заполните реальными даннымиdatabase:host:localhostport:5432name:myapp_production # <-- укажите имя БДuser:myapp_user # <-- укажите пользователяpassword:YOUR_PASSWORD # <-- укажите парольEOF
Сам database.yml добавьте в .gitignore, а шаблон закоммитьте:
1
2
3
cd ~/server-configs
git add myapp/database.yml.example
git commit -m "Добавлен шаблон конфига базы данных"
Важно: при разворачивании на новом сервере вы вручную копируете .example в рабочий файл и заполняете реальные данные. Сам рабочий файл должен быть в .gitignore.
Альтернатива — переменные окружения или Vault: если конфиги содержат пароли, токены или API-ключи, рассмотрите вариант выноса секретов в переменные окружения (через EnvironmentFile= в systemd или env_file в Docker) либо использование HashiCorp Vault, Mozilla sops или pass. В таком случае сам конфиг хранит только ссылку на секрет (например, DB_PASSWORD_FILE=/run/secrets/db_password), а реальные значения подставляются во время запуска сервиса. Git-репозиторий остаётся чистым.
Перенос конфигов и создание символьных ссылок
Общий алгоритм одинаков для любого конфига:
Скопировать существующий конфиг из /etc/... в папку репозитория
Удалить оригинал
Создать символьную ссылку, указывающую на файл в репозитории
Git сохраняет только бит исполнения (chmod +x), но не владельца и точные права (600, 644). Для конфигов это критично — нельзя, чтобы sshd_config был доступен всем подряд.
Создайте скрипт восстановления прав прямо в репозитории:
set-permissions.shbash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#!/bin/bash
# Скрипт для установки правильных владельцев и прав на конфигиecho"Восстанавливаю права доступа..."# SSH: владелец root, права 600chown root:root /etc/ssh/sshd_config
chmod 600 /etc/ssh/sshd_config
# Nginx: владелец root, права 644chown root:root /etc/nginx/sites-available/*
chmod 644 /etc/nginx/sites-available/*
# MyApp: владелец myapp, права 640chown myapp:myapp /opt/myapp/config.yml
chmod 640 /opt/myapp/config.yml
echo"Готово."
1
2
3
4
chmod +x ~/server-configs/set-permissions.sh
cd ~/server-configs
git add set-permissions.sh
git commit -m "Добавлен скрипт установки прав доступа"
Запускайте скрипт с sudo после каждого клонирования репозитория на новый сервер.
Подключение удалённого репозитория
Без бэкапа все преимущества теряются. Добавьте удалённый репозиторий:
1
2
3
4
5
6
7
cd ~/server-configs
# Добавляем remotegit remote add origin git@github.com:user/repo-configs.git
# Отправляемgit push -u origin main
Deploy Key vs SSH-ключ: для доступа сервера к GitHub безопаснее использовать Deploy Key — SSH-ключ, привязанный строго к одному репозиторию. Он добавляется в Settings → Deploy keys конкретного репозитория. Даже при компрометации сервера злоумышленник получит доступ только к конфигам этого репозитория.
Или, что правильнее, перенести репозиторий в общедоступное место (/opt/, /srv/, /home/).
Iptables: сохранение правил
При замене файла /etc/iptables/rules.v4 на symlink нужно помнить: правила, добавленные вручную через iptables -A, но не сохранённые в файл, пропадут после netfilter-persistent reload.
iptables-save > ~/server-configs/iptables/rules.v4
cd ~/server-configs
git add -A && git commit -m "iptables: update rules"&& git push
Автокоммиты в скриптах
Если ваш скрипт изменяет конфиг (например, добавляет пользователя), стоит сразу фиксировать изменения в Git. Это гарантирует, что репозиторий всегда отражает актуальное состояние сервера.