0 Голосов
Редактировал(а) Anton Krivchenkov 29.05.2026 13:05

Последние авторы
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 * перекинь ключssh-copy-id <anton@192.168.1.91>
32
33 ### 2. Настройка sudo без пароля на удалённой машине
34
35 Чтобы скрипт не завис в ожидании ввода пароля, на **удалённой машине** (`192.168.1.121`) разрешите пользователю `anton` выполнять `rsync` и `docker` без пароля.
36
37 Подключитесь к удалённой машине и выполните:
38
39 ```bash
40 sudo visudo
41 ```
42
43 Добавьте в **конец** файла следующую строку:
44
45 ```bash
46 anton ALL=(ALL) NOPASSWD: /usr/bin/rsync, /usr/bin/docker
47 ```
48
49 > **Важно:** Используйте именно `visudo`, а не редактирование `/etc/sudoers` вручную — это защитит от синтаксических ошибок.
50
51 ### 3. Создание директории на удалённой машине
52
53 > **Внимание:** Папки `/etc/letsencrypt/live/nextcl.dev0ps.online/` на виртуалке **не существует** по умолчанию. Её необходимо создать вручную **до первого запуска скрипта**. Без этого rsync завершится с ошибкой `No such file or directory`.
54
55 Подключитесь к удалённой машине по SSH и выполните:
56
57 ```bash
58 sudo mkdir -p /etc/letsencrypt/live/nextcl.dev0ps.online/
59 ```
60
61 Флаг `-p` создаст все необходимые родительские директории (`/etc/letsencrypt/live/`), если их ещё нет.
62
63 ---
64
65 ## Скрипт синхронизации
66
67 Создайте файл скрипта, например `/home/anton/sync-certs.sh`:
68
69 #!/bin/bash
70
71 set -e
72
73 # Настройки
74 SRC="/home/anton/swag_crowdsec/swag/keys/letsencrypt/"
75 DEST_USER="anton"
76 DEST_IP="192.168.1.91"
77 DEST_DIR="/etc/letsencrypt/live/pipe.dev0ps.online/" # Папка на виртуалке
78
79 echo "[$(date)] Запуск синхронизации сертификатов..."
80
81 # Копируем с разыменованием симлинков (-L)
82 # Если у тебя SSH на стандартном порту 22, удали "-p 2222" из кавычек ниже!
83 rsync -avLz --delete --rsync-path="sudo rsync" -e "ssh -p 22 -i /home/anton/.ssh/id_ed25519" "$SRC" "${DEST_USER}@${DEST_IP}:${DEST_DIR}"
84
85 # Перезапуск контейнеров (ПОКА ЗАКОММЕНТИРОВАНО, так как нода еще не установлена)
86 # ssh -p 2222 -i /home/anton/.ssh/id_ed25519 ${DEST_USER}@${DEST_IP} "cd /opt/remnawave && sudo docker compose restart remnawave-nginx naiveproxy hysteria2"
87
88 echo "[$(date)] Синхронизация завершена."
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
128 * `sudo cd` **не работает** — `cd` это встроенная команда оболочки (shell builtin), а не отдельная программа, которую `sudo` может выполнить с повышенными правами.
129 * `cat` предназначен для чтения **файлов**, при попытке применить его к **папке** будет ошибка. Для просмотра содержимого директории используйте `ls`.
130
131 ---
132
133 ## Автоматизация через cron (опционально)
134
135 Для автоматического запуска скрипта (например, чтобы всегда иметь свежие сертификаты после их обновления в SWAG), добавьте скрипт в cron. Запуск каждый понедельник в 04:00:
136
137 ```bash
138 crontab -e
139 ```
140
141 Добавьте строку:
142
143 ```cron
144 0 4 * * 1 /home/anton/sync-certs.sh >> /home/anton/cert-sync.log 2>&1
145 ```
146
147 > **Совет:** Если вы используете `logrotate` или не хотите копить огромный лог, замените `>>` на `>`, чтобы лог перезаписывался при каждом запуске.
148
149 ---
150
151 ## Описание ключей rsync
152
153 | Ключ | Назначение |
154 | --------------------------- | ------------------------------------------------------------------------------------------------------------ |
155 | `-a` | Архивный режим (сохраняет права, владельца, timestamps) |
156 | `-v` | Подробный вывод |
157 | `-L` | **Разыменовывает симлинки** — копирует сами файлы сертификатов, а не ссылки. Критично для Let's Encrypt! |
158 | `-z` | Сжатие данных при передаче |
159 | `--delete` | Удаляет файлы на целевой машине, которых больше нет в источнике (полезно при перевыпуске или смене форматов) |
160 | `--rsync-path="sudo rsync"` | Выполняет rsync от имени root на удалённой машине (нужно для записи в `/etc/letsencrypt/`) |
161
162 ---
163
164 ## Устранение неполадок
165
166 ### Ошибка «No such file or directory» при rsync
167
168 * Целевая папка на виртуалке ещё не создана. Подключитесь к удалённой машине и выполните:`sudo mkdir -p /etc/letsencrypt/live/nextcl.dev0ps.online/`
169 * Затем повторите запуск скрипта.
170
171 ### Ошибка «permission denied» при rsync
172
173 * Проверьте, что строка в `sudoers` на удалённой машине корректна и путь к `rsync` совпадает (`which rsync`).
174 * Убедитесь, что целевая директория существует.
175
176 ### Ошибка «permission denied» при docker compose restart
177
178 * Проверьте, что `/usr/bin/docker` — правильный путь (`which docker` на удалённой машине).
179 * Убедитесь, что строка в `sudoers` разрешает выполнение `docker`.
180
181 ### Контейнеры не подхватывают сертификаты
182
183 Проверьте, что файлы действительно скопировались и не являются симлинками:
184
185 ```bash
186 sudo ls -la /etc/letsencrypt/live/nextcl.dev0ps.online/
187 ```
188
189 Файлы `cert.pem`, `privkey.pem`, `chain.pem`, `fullchain.pem` должны быть обычными файлами, размером больше 0 байт.
190
191 > **Примечание:** Для просмотра содержимого `/etc/letsencrypt/` на целевой машине требуется `sudo`.
192
193 ### SSH-подключение зависает / требует пароль
194
195 * Проверьте доступность хоста: `ping 192.168.1.121`
196 * Убедитесь, что SSH-ключ добавлен именно пользователю `anton` на удалённой машине, а не `root`.