Найти в Дзене
Kvmka.ru

SSL Let's Encrypt

SSL Let's Encrypt 1. запускаешь
certbot --apache -d domen.ru -d domen1.ru
проверяешь каталог там должны быть папки для доменов
ls /etc/letsencrypt/live/
проверяем конфиг apache
<VirtualHost *:80> ServerName domen1.ru ServerAlias www.domen1.ru DocumentRoot /var/www/domen1.ru <Directory /var/www/domen1.ru> Options -Indexes +FollowSymLinks AllowOverride All Require all granted </Directory> ErrorLog ${APACHE_LOG_DIR}/domen1_error.log CustomLog ${APACHE_LOG_DIR}/domen1_access.log combined </VirtualHost>
далее выполняем все эти команды
a2ensite domen1.ru.conf a2ensite domen2.ru.conf a2ensite domen3.com.conf systemctl reload apache2
apachectl configtest
systemctl reload apache2 после всего этого можно запустить скрипт и настроить его - он выдаст небольшую справку куда нужно будет внести домены
Создаем скрипт и даем права на выполнение nano /usr/local/bin/ssl_renew_groups.sh chmod +x /usr/local/bin/ssl_renew_groups.sh
И не забываем добавить скрипт в крон - это може

SSL Let's Encrypt

1. запускаешь

certbot --apache -d domen.ru -d domen1.ru

проверяешь каталог там должны быть папки для доменов

ls /etc/letsencrypt/live/

проверяем конфиг apache


<VirtualHost *:80>
ServerName domen1.ru
ServerAlias www.domen1.ru
DocumentRoot /var/www/domen1.ru
<Directory /var/www/domen1.ru>
Options -Indexes +FollowSymLinks
AllowOverride All
Require all granted
</Directory>
ErrorLog ${APACHE_LOG_DIR}/domen1_error.log
CustomLog ${APACHE_LOG_DIR}/domen1_access.log combined
</VirtualHost>

далее выполняем все эти команды

a2ensite domen1.ru.conf
a2ensite domen2.ru.conf
a2ensite domen3.com.conf
systemctl reload apache2
apachectl configtest
systemctl reload apache2

после всего этого можно запустить скрипт и настроить его - он выдаст небольшую справку куда нужно будет внести домены

Создаем скрипт и даем права на выполнение

nano /usr/local/bin/ssl_renew_groups.sh
chmod +x /usr/local/bin/ssl_renew_groups.sh


И не забываем добавить скрипт в крон - это можете посмотреть в другой нашей статье )

#!/bin/bash
#
# ssl_renew_groups.sh — всегда смотрим cert.pem
#
CONFIG_FILE="/usr/local/bin/config.ini"
LOG_FILE="/var/log/ssl_60day_renew.log"
DAYS_THRESHOLD=30
timestamp() {
date +"%Y-%m-%d %H:%M:%S"
}
log_write() {
local type="$1"
local domain="$2"
local message="$3"
echo "[$(timestamp)] [$type] [$domain] $message" >> "$LOG_FILE"
}
# Проверяем доступность Let's Encrypt
ping -c 1 -W 2 acme-v02.api.letsencrypt.org > /dev/null 2>&1
if [ $? -ne 0 ]; then
log_write "ERROR" "GLOBAL" "Сервер Let's Encrypt недоступен. Пропускаем запуск."
exit 1
fi
# Если конфиг отсутствует — создаём с примером
if [ ! -f "$CONFIG_FILE" ]; then
cat <<EOF > "$CONFIG_FILE"
# Конфигурация для ssl_renew_groups.sh
# Здесь указываются домены (основные имена сертификатов)
# Один домен — одна строка
# Пример:
# domen1.ru
# domen2.ru
# domen3.com
EOF
echo "[INFO] Конфиг $CONFIG_FILE создан. Внесите туда список доменов."
echo "[INFO] Логи записываются в $LOG_FILE"
log_write "ERROR" "GLOBAL" "Конфиг $CONFIG_FILE отсутствовал — создан шаблон. Требуется внести список доменов."
exit 1
fi
# Чтение доменов из файла
grep -v '^#' "$CONFIG_FILE" | grep -v '^$' | while read -r cert_name; do
cert_path="/etc/letsencrypt/live/$cert_name/cert.pem"
if [ ! -f "$cert_path" ]; then
log_write "ERROR" "$cert_name" "Сертификат не найден (нет cert.pem)"
continue
fi
EXPIRY_DATE=$(openssl x509 -enddate -noout -in "$cert_path" | cut -d= -f2)
EXPIRY_TS=$(date -d "$EXPIRY_DATE" +%s)
NOW_TS=$(date +%s)
DIFF_DAYS=$(( (EXPIRY_TS - NOW_TS) / 86400 ))
log_write "INFO" "$cert_name" "Срок действия сертификата — осталось $DIFF_DAYS дней"
if [ "$DIFF_DAYS" -le "$DAYS_THRESHOLD" ]; then
DOMAIN_LIST=$(certbot certificates | awk -v cert="$cert_name" '
$0 ~ "Certificate Name:" && $3 == cert {found=1}
found && $0 ~ "Domains:" {print $0; exit}
' | cut -d: -f2-)
if [ -z "$DOMAIN_LIST" ]; then
log_write "ERROR" "$cert_name" "Не удалось определить список доменов."
continue
fi
if certbot --apache --force-renewal -d $DOMAIN_LIST --quiet; then
log_write "UPDATE" "$cert_name" "Сертификат обновлён успешно."
else
log_write "ERROR" "$cert_name" "Ошибка обновления сертификата."
fi
else
log_write "TIME" "$cert_name" "Обновление не требуется — осталось $DIFF_DAYS дней"
fi
done

Скрипт каждый день:

✔️ Проверяет срок действия сертификатов

✔️ Если осталось ≤ 30 дней — автоматически обновляет

✔️ Логирует всё в /var/log/ssl_60day_renew.log