Let's Encrypt серты на удалённую ноду
Инструкция по копированию сертификатов Let's Encrypt на удалённую ноду
Обзор
Скрипт автоматически синхронизирует сертификаты Let's Encrypt с сервера SWAG на удалённую виртуальную машину и перезапускает необходимые Docker-контейнеры.
Предварительные требования
1. SSH-доступ по ключу
Убедитесь, что с текущего сервера можно подключиться к удалённой машине без пароля:
Если ключ ещё не скопирован — выполните:
Убедитесь, что права на закрытый ключ установлены верно:
- перекинь ключssh-copy-id anton@192.168.1.91
2. Настройка sudo без пароля на удалённой машине
Чтобы скрипт не завис в ожидании ввода пароля, на удалённой машине (192.168.1.121) разрешите пользователю anton выполнять rsync и docker без пароля.
Подключитесь к удалённой машине и выполните:
Добавьте в конец файла следующую строку:
Важно: Используйте именно visudo, а не редактирование /etc/sudoers вручную — это защитит от синтаксических ошибок.
3. Создание директории на удалённой машине
Внимание: Папки /etc/letsencrypt/live/nextcl.dev0ps.online/ на виртуалке не существует по умолчанию. Её необходимо создать вручную до первого запуска скрипта. Без этого rsync завершится с ошибкой No such file or directory.
Подключитесь к удалённой машине по SSH и выполните:
Флаг -p создаст все необходимые родительские директории (/etc/letsencrypt/live/), если их ещё нет.
Скрипт синхронизации
Создайте файл скрипта, например /home/anton/sync-certs.sh:
set -e
# Настройки
SRC="/home/anton/swag_crowdsec/swag/keys/letsencrypt/"
DEST_USER="anton"
DEST_IP="192.168.1.91"
DEST_DIR="/etc/letsencrypt/live/pipe.dev0ps.online/" # Папка на виртуалке
echo "[$(date)] Запуск синхронизации сертификатов..."
# Копируем с разыменованием симлинков (-L)
# Если у тебя SSH на стандартном порту 22, удали "-p 2222" из кавычек ниже!
rsync -avLz --delete --rsync-path="sudo rsync" -e "ssh -p 22 -i /home/anton/.ssh/id_ed25519" "$SRC" "${DEST_USER}@${DEST_IP}:${DEST_DIR}"
# Перезапуск контейнеров (ПОКА ЗАКОММЕНТИРОВАНО, так как нода еще не установлена)
# ssh -p 2222 -i /home/anton/.ssh/id_ed25519 ${DEST_USER}@${DEST_IP} "cd /opt/remnawave && sudo docker compose restart remnawave-nginx naiveproxy hysteria2"
echo "[$(date)] Синхронизация завершена."
Сделайте скрипт исполняемым:
Пошаговый запуск (первый раз)
Шаг 1. Создайте папку на виртуалке
Подключитесь к удалённой машине (192.168.1.121) и выполните:
Шаг 2. Запустите скрипт на машине SWAG
Вернитесь на основной сервер (где установлен SWAG) и запустите скрипт:
Шаг 3. Проверьте результат на виртуалке
Снова зайдите на удалённую машину и проверьте содержимое папки:
Вы должны увидеть скопированные файлы: cert.pem, privkey.pem, fullchain.pem, chain.pem.
Почему sudo ls, а не sudo cd + cat?
- sudo cd не работает — cd это встроенная команда оболочки (shell builtin), а не отдельная программа, которую sudo может выполнить с повышенными правами.
- cat предназначен для чтения файлов, при попытке применить его к папке будет ошибка. Для просмотра содержимого директории используйте ls.
Автоматизация через cron (опционально)
Для автоматического запуска скрипта (например, чтобы всегда иметь свежие сертификаты после их обновления в SWAG), добавьте скрипт в cron. Запуск каждый понедельник в 04:00:
Добавьте строку:
Совет: Если вы используете logrotate или не хотите копить огромный лог, замените >> на >, чтобы лог перезаписывался при каждом запуске.
Описание ключей rsync
| Ключ | Назначение |
|---|---|
| -a | Архивный режим (сохраняет права, владельца, timestamps) |
| -v | Подробный вывод |
| -L | Разыменовывает симлинки — копирует сами файлы сертификатов, а не ссылки. Критично для Let's Encrypt! |
| -z | Сжатие данных при передаче |
| --delete | Удаляет файлы на целевой машине, которых больше нет в источнике (полезно при перевыпуске или смене форматов) |
| --rsync-path="sudo rsync" | Выполняет rsync от имени root на удалённой машине (нужно для записи в /etc/letsencrypt/) |
Устранение неполадок
Ошибка «No such file or directory» при rsync
- Целевая папка на виртуалке ещё не создана. Подключитесь к удалённой машине и выполните:sudo mkdir -p /etc/letsencrypt/live/nextcl.dev0ps.online/
- Затем повторите запуск скрипта.
Ошибка «permission denied» при rsync
- Проверьте, что строка в sudoers на удалённой машине корректна и путь к rsync совпадает (which rsync).
- Убедитесь, что целевая директория существует.
Ошибка «permission denied» при docker compose restart
- Проверьте, что /usr/bin/docker — правильный путь (which docker на удалённой машине).
- Убедитесь, что строка в sudoers разрешает выполнение docker.
Контейнеры не подхватывают сертификаты
Проверьте, что файлы действительно скопировались и не являются симлинками:
Файлы cert.pem, privkey.pem, chain.pem, fullchain.pem должны быть обычными файлами, размером больше 0 байт.
Примечание: Для просмотра содержимого /etc/letsencrypt/ на целевой машине требуется sudo.
SSH-подключение зависает / требует пароль
- Проверьте доступность хоста: ping 192.168.1.121
- Убедитесь, что SSH-ключ добавлен именно пользователю anton на удалённой машине, а не root.