0 Голосов
Версия 3.1 от Anton Krivchenkov на 29.05.2026 13:05

Скрыть последних авторов
Anton Krivchenkov 1.1 1 # Инструкция по копированию сертификатов Let's Encrypt на удалённую ноду
2
3 ## Обзор
4
5 Скрипт автоматически синхронизирует сертификаты Let's Encrypt с сервера SWAG на удалённую виртуальную машину и перезапускает необходимые Docker-контейнеры.
6
7 ---
8
9 ## Предварительные требования
10
11 ### 1. SSH-доступ по ключу
12
13 Убедитесь, что с текущего сервера можно подключиться к удалённой машине без пароля:
14
15 ```bash
16 ssh -i /home/anton/.ssh/id_ed25519 anton@192.168.1.121
17 ```
18
19 Если ключ ещё не скопирован — выполните:
20
21 ```bash
22 ssh-copy-id -i /home/anton/.ssh/id_ed25519 anton@192.168.1.121
23 ```
24
25 Убедитесь, что права на закрытый ключ установлены верно:
26
27 ```bash
28 chmod 600 /home/anton/.ssh/id_ed25519
29 ```
30
Anton Krivchenkov 3.1 31 - перекинь ключ
32
33 ssh-copy-id anton@192.168.1.91
34
Anton Krivchenkov 1.1 35 ### 2. Настройка sudo без пароля на удалённой машине
36
37 Чтобы скрипт не завис в ожидании ввода пароля, на **удалённой машине** (`192.168.1.121`) разрешите пользователю `anton` выполнять `rsync` и `docker` без пароля.
38
39 Подключитесь к удалённой машине и выполните:
40
41 ```bash
42 sudo visudo
43 ```
44
45 Добавьте в **конец** файла следующую строку:
46
47 ```bash
48 anton ALL=(ALL) NOPASSWD: /usr/bin/rsync, /usr/bin/docker
49 ```
50
51 > **Важно:** Используйте именно `visudo`, а не редактирование `/etc/sudoers` вручную — это защитит от синтаксических ошибок.
52
53 ### 3. Создание директории на удалённой машине
54
55 > **Внимание:** Папки `/etc/letsencrypt/live/nextcl.dev0ps.online/` на виртуалке **не существует** по умолчанию. Её необходимо создать вручную **до первого запуска скрипта**. Без этого rsync завершится с ошибкой `No such file or directory`.
56
57 Подключитесь к удалённой машине по SSH и выполните:
58
59 ```bash
60 sudo mkdir -p /etc/letsencrypt/live/nextcl.dev0ps.online/
61 ```
62
63 Флаг `-p` создаст все необходимые родительские директории (`/etc/letsencrypt/live/`), если их ещё нет.
64
65 ---
66
67 ## Скрипт синхронизации
68
69 Создайте файл скрипта, например `/home/anton/sync-certs.sh`:
70
Anton Krivchenkov 2.1 71 #!/bin/bash
72 set -e # Прерывать выполнение при любой ошибке
73
74 # Настройки
75 # ВНИМАНИЕ: Слэши (/) в конце путей для rsync имеют значение!
76 SRC="/home/anton/swag_crowdsec/swag/keys/letsencrypt/live/nextcl.dev0ps.online/"
77 DEST_USER="anton"
78 DEST_IP="192.168.1.121"
79 DEST_DIR="/etc/letsencrypt/live/nextcl.dev0ps.online/"
80 SSH_KEY="/home/anton/.ssh/id_ed25519"
81
82 echo "[$(date)] Запуск синхронизации сертификатов..."
83
84 # Копируем с разыменованием симлинков (-L) и удалением лишнего (--delete)
85 rsync -avLz --delete --rsync-path="sudo rsync" -e "ssh -i $SSH_KEY" "$SRC" "${DEST_USER}@${DEST_IP}:${DEST_DIR}"
86
87 # Перезапускаем контейнеры на ноде, чтобы они подхватили новые файлы
88 ssh -i "$SSH_KEY" ${DEST_USER}@${DEST_IP} "cd /opt/remnawave && sudo docker compose restart remnawave-nginx naiveproxy hysteria2"
89
90 echo "[$(date)] Синхронизация завершена успешно."
Anton Krivchenkov 1.1 91
92 Сделайте скрипт исполняемым:
93
94 ```bash
95 chmod +x /home/anton/sync-certs.sh
96 ```
97
98 ---
99
100 ## Пошаговый запуск (первый раз)
101
102 ### Шаг 1. Создайте папку на виртуалке
103
104 Подключитесь к удалённой машине (`192.168.1.121`) и выполните:
105
106 ```bash
107 sudo mkdir -p /etc/letsencrypt/live/nextcl.dev0ps.online/
108 ```
109
110 ### Шаг 2. Запустите скрипт на машине SWAG
111
112 Вернитесь на основной сервер (где установлен SWAG) и запустите скрипт:
113
114 ```bash
115 /home/anton/sync-certs.sh
116 ```
117
118 ### Шаг 3. Проверьте результат на виртуалке
119
120 Снова зайдите на удалённую машину и проверьте содержимое папки:
121
122 ```bash
123 sudo ls -la /etc/letsencrypt/live/nextcl.dev0ps.online/
124 ```
125
126 Вы должны увидеть скопированные файлы: `cert.pem`, `privkey.pem`, `fullchain.pem`, `chain.pem`.
127
128 > **Почему `sudo ls`, а не `sudo cd` + `cat`?**
129
Anton Krivchenkov 2.1 130 * `sudo cd` **не работает** — `cd` это встроенная команда оболочки (shell builtin), а не отдельная программа, которую `sudo` может выполнить с повышенными правами.
131 * `cat` предназначен для чтения **файлов**, при попытке применить его к **папке** будет ошибка. Для просмотра содержимого директории используйте `ls`.
132
Anton Krivchenkov 1.1 133 ---
134
135 ## Автоматизация через cron (опционально)
136
137 Для автоматического запуска скрипта (например, чтобы всегда иметь свежие сертификаты после их обновления в SWAG), добавьте скрипт в cron. Запуск каждый понедельник в 04:00:
138
139 ```bash
140 crontab -e
141 ```
142
143 Добавьте строку:
144
145 ```cron
146 0 4 * * 1 /home/anton/sync-certs.sh >> /home/anton/cert-sync.log 2>&1
147 ```
148
149 > **Совет:** Если вы используете `logrotate` или не хотите копить огромный лог, замените `>>` на `>`, чтобы лог перезаписывался при каждом запуске.
150
151 ---
152
153 ## Описание ключей rsync
154
Anton Krivchenkov 2.1 155 | Ключ | Назначение |
156 | --------------------------- | ------------------------------------------------------------------------------------------------------------ |
157 | `-a` | Архивный режим (сохраняет права, владельца, timestamps) |
158 | `-v` | Подробный вывод |
159 | `-L` | **Разыменовывает симлинки** — копирует сами файлы сертификатов, а не ссылки. Критично для Let's Encrypt! |
160 | `-z` | Сжатие данных при передаче |
161 | `--delete` | Удаляет файлы на целевой машине, которых больше нет в источнике (полезно при перевыпуске или смене форматов) |
162 | `--rsync-path="sudo rsync"` | Выполняет rsync от имени root на удалённой машине (нужно для записи в `/etc/letsencrypt/`) |
Anton Krivchenkov 1.1 163
164 ---
165
166 ## Устранение неполадок
167
168 ### Ошибка «No such file or directory» при rsync
169
Anton Krivchenkov 2.1 170 * Целевая папка на виртуалке ещё не создана. Подключитесь к удалённой машине и выполните:`sudo mkdir -p /etc/letsencrypt/live/nextcl.dev0ps.online/`
171 * Затем повторите запуск скрипта.
Anton Krivchenkov 1.1 172
173 ### Ошибка «permission denied» при rsync
174
Anton Krivchenkov 2.1 175 * Проверьте, что строка в `sudoers` на удалённой машине корректна и путь к `rsync` совпадает (`which rsync`).
176 * Убедитесь, что целевая директория существует.
Anton Krivchenkov 1.1 177
178 ### Ошибка «permission denied» при docker compose restart
179
Anton Krivchenkov 2.1 180 * Проверьте, что `/usr/bin/docker` — правильный путь (`which docker` на удалённой машине).
181 * Убедитесь, что строка в `sudoers` разрешает выполнение `docker`.
Anton Krivchenkov 1.1 182
183 ### Контейнеры не подхватывают сертификаты
184
185 Проверьте, что файлы действительно скопировались и не являются симлинками:
186
187 ```bash
188 sudo ls -la /etc/letsencrypt/live/nextcl.dev0ps.online/
189 ```
190
191 Файлы `cert.pem`, `privkey.pem`, `chain.pem`, `fullchain.pem` должны быть обычными файлами, размером больше 0 байт.
192
193 > **Примечание:** Для просмотра содержимого `/etc/letsencrypt/` на целевой машине требуется `sudo`.
194
195 ### SSH-подключение зависает / требует пароль
196
Anton Krivchenkov 2.1 197 * Проверьте доступность хоста: `ping 192.168.1.121`
198 * Убедитесь, что SSH-ключ добавлен именно пользователю `anton` на удалённой машине, а не `root`.