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