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