Допустим, вы не девопс. Вы — вполне себе фронтендер, бэкендер, может даже мобильщик. Но вот беда: у вас сервер, и ему нужен SSL. А девопс уехал в отпуск. Или вообще не нанят. И вот вы стоите, глядите на терминал и думаете: «Ну всё, теперь я — DevOps». 😅
Пугаться не стоит. Сегодня расскажу, как быстро и автоматически настроить SSL-сертификаты от Let’s Encrypt с помощью Certbot на Ubuntu. С шутками, примерами и bash-магией.
🔒 Зачем нужен Certbot и Let’s Encrypt?
Let’s Encrypt — это бесплатный центр сертификации. Он позволяет выпускать SSL-сертификаты для HTTPS. Certbot — это утилита для автоматического получения и обновления этих сертификатов.
Комбо для тех, кто не хочет возиться с ручной генерацией ключей и походами в коммерческие CA.
🚀 Установка Certbot
sudo apt update
sudo apt install certbot
Важно: Certbot нужно запускать на том же сервере, для которого вы хотите выпустить сертификат.
📜 Получение сертификата (и вывод информации о текущих сертификатах)
sudo certbot certonly --standalone -d project.com -d www.project.com
sudo certbot certificates
--standalone
означает, что Certbot временно поднимет собственный сервер на 80 порту для валидации домена.Проверьте, что порт 80 не занят! Иначе ничего не заработает.
Если там ваш Nginx или Docker — остановите его на время выполнения команды:
sudo systemctl stop nginx
Альтернатива: можно использовать плагин webroot
— он не требует остановки сервиса и просто создаёт специальный файл в директории сайта.
Подробнее про плагины — в официальной документации.
⏱ Автоматическое обновление через systemd
После установки Certbot автоматически добавляет systemd-таймер:
systemctl list-timers | grep certbot
Пример вывода:
Mon 2025-03-10 03:12:00 UTC 10h left Mon 2025-03-09 03:12:00 UTC certbot.timer certbot.service
Проверить, что автообновление работает:
sudo certbot renew --dry-run
Если всё хорошо:
Certbot dry-run was successful.
Логи последних обновлений:
journalctl -u certbot.service --no-pager --since "2 days ago"
Напоминание: Certbot обновляет сертификаты только если до их окончания < 30 дней.
🕰️ Альтернатива: обновление через Cron
Иногда systemd-таймеры неудобны, особенно если вы настраиваете всё через Ansible или shell-скрипты. В этом случае можно использовать Cron.
Отключаем таймер:
sudo systemctl stop certbot.timer
sudo systemctl disable certbot.timer
Добавляем Cron-задачу:
sudo crontab -e
Пример:
0 0 1 * * /usr/bin/certbot renew --standalone --quiet
Чтобы узнать точный путь к certbot
, используйте:
which certbot
⚙️ Хуки для перезапуска сервисов
Certbot умеет выполнять действия до, после или только при успешном обновлении сертификата. Это удобно, если нужно остановить сервис, скопировать сертификаты или перезапустить сервер.
# /etc/letsencrypt/renewal/project.com.conf
pre_hook = systemctl stop my-project.service
deploy_hook = systemctl reload my-project.service
post_hook = systemctl start my-project.service
🛠️ Скрипт на все случаи жизни
Вместо описания всего в кроне, можно создать bash-скрипт, который будет:
Останавливать сервис
Обновлять сертификаты
Копировать файлы в нужное место
Ставить права
Запускать сервис обратно
#!/bin/bash
APP_PATH="/home/projects/project"
DOMAIN="project.com"
FULL_CHAIN_SRC="/etc/letsencrypt/live/${DOMAIN}/fullchain.pem"
PRIVATE_KEY_SRC="/etc/letsencrypt/live/${DOMAIN}/privkey.pem"
FULL_CHAIN_DIST="${APP_PATH}/volumes/etc/ssl/certs/project_com.full.crt"
PRIVATE_KEY_DIST="${APP_PATH}/volumes/etc/ssl/private/project_com.key"
echo "Starting script execution: $(date "+%Y-%m-%d %H:%M:%S")"
echo "Stopping the service..."
systemctl stop my-project.service
echo "Renewing the certificates..."
/usr/bin/certbot renew --standalone --quiet
/usr/bin/certbot certificates
echo "Copying the certificates to the project..."
cp -f "$FULL_CHAIN_SRC" "$FULL_CHAIN_DIST"
cp -f "$PRIVATE_KEY_SRC" "$PRIVATE_KEY_DIST"
echo "Setting correct permissions for the certificates..."
chmod 644 "$FULL_CHAIN_DIST"
chmod 644 "$PRIVATE_KEY_DIST"
echo "Running the service..."
systemctl start my-project.service
echo "End of script execution: $(date "+%Y-%m-%d %H:%M:%S")"
А в кроне вызываем его так:
0 0 1 * * sh /home/projects/project/cert-renew.sh >> /var/log/project-cert-renew.log 2>&1
🧠 Заключение
Иногда даже разработчику приходится немного быть девопсом. Главное — не бояться терминала и знать, где гуглить. А ещё — не забыть проверить через полгода, что автообновление всё ещё работает. 😁
Если вы нашли ошибку или хотите поделиться своим способом автоматизации — велком в комментарии!