В качестве reversproxi используется nginx. Автоматизация с помощью ansible.
Вариант 1. Одной командой в консоли
Просто перечислите все домены по очереди. Первым указывайте основной домен:
bash
sudo certbot certonly --webroot \
-w /var/www/letsencrypt \
-d mydomen.ru \
-d www.mydomen.ru \
-d app.mydomen.ru \
-d crm.mydomen.ru \
--deploy-hook "nginx -s reload" \
--non-interactive \
--agree-tos \
-m mymail@.mydomen.ru \
--cert-name mydomen-bundle
Важные параметры:
-d имя_сайта— повторяется для каждого домена (Let’s Encrypt позволяет добавлять до 100 доменов в один сертификат).--cert-name mydomen-bundle— задает фиксированное имя для папки с сертификатом (/etc/letsencrypt/live/mydomen-bundle/). Если этого не сделать, Certbot назовет папку по имени самого первого домена, что может запутать при добавлении новых сайтов.
Вариант 2. Автоматизация через Ansible (Мультидоменный)
Создайте или обновите ваш файл issue_multi_cert.yml:
yaml
---
- name: Выпуск единого SSL сертификата для группы сайтов
hosts: proxy_servers
become: yes
vars:
certbot_email: "mymail@mydomain.ru"
webroot_path: "/var/www/letsencrypt"
# Имя папки, где будет лежать общий сертификат
cert_bundle_name: "mydomain-bundle"
# Список доменов, которые войдут в один сертификат
domains_list:
- "mydomain.ru"
- "www.mydomain.ru"
- "app.mydomain.ru"
- "crm.mydomain.ru"
tasks:
- name: Шаг 1. Проверить наличие общей папки webroot
ansible.builtin.file:
path: "{{ webroot_path }}"
state: directory
owner: www-data
group: www-data
mode: '0755'
- name: Шаг 2. Выпуск единого сертификата (SAN)
ansible.builtin.command: >
certbot certonly --webroot
-w {{ webroot_path }}
{{ domains_list | map('regex_replace', '^(.*)$', '-d \1') | join(' ') }}
--cert-name {{ cert_bundle_name }}
--deploy-hook "nginx -s reload"
--non-interactive
--agree-tos
-m {{ certbot_email }}
args:
# Плейбук не будет делать лишних запросов, если бандл уже создан
creates: "/etc/letsencrypt/live/{{ cert_bundle_name }}/fullchain.pem"
register: certbot_output
- name: Шаг 3. Мягкий перезапуск Nginx для применения ключей
ansible.builtin.service:
name: nginx
state: reloaded
Строка {{ domains_list | ... }} автоматически превратит ваш список YAML в плоскую строку вида -d домен1 -d домен2 для команды Certbot.
Настройка Nginx для всех этих сайтов.
Так как сертификат теперь один на всех, файлы конфигурации Nginx (блоки server для порта 443) для всех этих сайтов будут ссылаться на одни и те же пути.
Пример для app.mydomain.ru:
nginx
server {
listen 443 ssl;
server_name app.mydomain.ru;
# Ссылаемся на общее имя бандла, которое мы указали в --cert-name
ssl_certificate /etc/letsencrypt/live/mydomain-bundle/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/mydomain-bundle/privkey.pem;
location / {
proxy_pass https://внутренний_ip_приложения:443;
# ... заголовки проксирования
}
}
Для сайтов crm..., www... и самого корня конфигурация будет идентичной, изменятся только директивы server_name и proxy_pass.
Чтобы расширить список доменов:
- Вручную или в Ansible добавить новый домен в общую команду (или список
domains_list). - Запустить команду/плейбук заново, удалив параметр
creates:(или добавьте флаг--expandв ручную команду). Certbot увидит, что список доменов изменился, перевыпустит один этот файл, добавив туда новый сайт, и Nginx обновит его на лету.