0 Голосов

Let's Encrypt серты на удалённую ноду

Версия 4.1 от Anton Krivchenkov на 29.05.2026 13:05

Инструкция по копированию сертификатов Let's Encrypt на удалённую ноду

Обзор

Скрипт автоматически синхронизирует сертификаты Let's Encrypt с сервера SWAG на удалённую виртуальную машину и перезапускает необходимые Docker-контейнеры.


Предварительные требования

1. SSH-доступ по ключу

Убедитесь, что с текущего сервера можно подключиться к удалённой машине без пароля:

ssh -i /home/anton/.ssh/id_ed25519 anton@192.168.1.121

Если ключ ещё не скопирован — выполните:

ssh-copy-id -i /home/anton/.ssh/id_ed25519 anton@192.168.1.121

Убедитесь, что права на закрытый ключ установлены верно:

chmod 600 /home/anton/.ssh/id_ed25519

2. Настройка sudo без пароля на удалённой машине

Чтобы скрипт не завис в ожидании ввода пароля, на удалённой машине (192.168.1.121) разрешите пользователю anton выполнять rsync и docker без пароля.

Подключитесь к удалённой машине и выполните:

sudo visudo

Добавьте в конец файла следующую строку:

anton ALL=(ALL) NOPASSWD: /usr/bin/rsync, /usr/bin/docker

Важно: Используйте именно visudo, а не редактирование /etc/sudoers вручную — это защитит от синтаксических ошибок.

3. Создание директории на удалённой машине

Внимание: Папки /etc/letsencrypt/live/nextcl.dev0ps.online/ на виртуалке не существует по умолчанию. Её необходимо создать вручную до первого запуска скрипта. Без этого rsync завершится с ошибкой No such file or directory.

Подключитесь к удалённой машине по SSH и выполните:

sudo mkdir -p /etc/letsencrypt/live/nextcl.dev0ps.online/

Флаг -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.121"
DEST_DIR="/etc/letsencrypt/live/nextcl.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)] Синхронизация завершена."

Сделайте скрипт исполняемым:

chmod +x /home/anton/sync-certs.sh

Пошаговый запуск (первый раз)

Шаг 1. Создайте папку на виртуалке

Подключитесь к удалённой машине (192.168.1.121) и выполните:

sudo mkdir -p /etc/letsencrypt/live/nextcl.dev0ps.online/

Шаг 2. Запустите скрипт на машине SWAG

Вернитесь на основной сервер (где установлен SWAG) и запустите скрипт:

/home/anton/sync-certs.sh

Шаг 3. Проверьте результат на виртуалке

Снова зайдите на удалённую машину и проверьте содержимое папки:

sudo ls -la /etc/letsencrypt/live/nextcl.dev0ps.online/

Вы должны увидеть скопированные файлы: 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:

crontab -e

Добавьте строку:

0 4 * * 1 /home/anton/sync-certs.sh >> /home/anton/cert-sync.log 2>&1

Совет: Если вы используете 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.

Контейнеры не подхватывают сертификаты

Проверьте, что файлы действительно скопировались и не являются симлинками:

sudo ls -la /etc/letsencrypt/live/nextcl.dev0ps.online/

Файлы cert.pem, privkey.pem, chain.pem, fullchain.pem должны быть обычными файлами, размером больше 0 байт.

Примечание: Для просмотра содержимого /etc/letsencrypt/ на целевой машине требуется sudo.

SSH-подключение зависает / требует пароль

  • Проверьте доступность хоста: ping 192.168.1.121
  • Убедитесь, что SSH-ключ добавлен именно пользователю anton на удалённой машине, а не root.