feat: CI/CD, per-domain HTTPS, backup, config generator

- sites.yml — единый источник истины для всех сайтов
- generate-configs.sh — генератор nginx конфигов, certbot domains.txt, .env
- nginx: per-domain HTTPS (вместо all-or-nothing switch-config)
- certbot: единый renew-all.sh, динамический init (без 5 дублирующих скриптов)
- backup: контейнер с pg_dump + rclone (Яндекс.Диск), ежедневно в 3AM
- Gitea + Gitea Runner в docker-compose (self-hosted Git + CI/CD)
- .gitea/workflows/deploy.yml — CI/CD pipeline: push → авто-деплой
- Makefile: generate-configs, reconfig, deploy, backup, restore, gitea, help
This commit is contained in:
valitovgaziz
2026-06-12 12:22:19 +05:00
parent abcb327278
commit 8e766b540e
31 changed files with 1535 additions and 343 deletions
+1 -1
View File
@@ -1 +1 @@
0 0 * * * root /opt/checkRenewCerts.sh > /proc/1/fd/1 2>&1
0 0 * * * /opt/renew-all.sh > /proc/1/fd/1 2>&1
+24 -61
View File
@@ -1,69 +1,32 @@
#!/bin/sh
# init-certbot.sh — точка входа certbot контейнера
set -e
# Проверяем наличие сертификатов для yalarba.ru
if [ ! -d "/etc/letsencrypt/live/yalarba.ru" ]; then
echo "Получаем новые сертификаты yalarba.ru ..."
certbot certonly --webroot \
--config /etc/letsencrypt/config/certbot.ini \
-w /var/www/certbot \
-d ${DOMAINS_yalarba}
fi
echo "=== Certbot init ==="
echo "сertificates for ${DOMAINS_yalarba} is ready"
# Получаем сертификаты для всех доменов из DOMAINS_* env
env | grep '^DOMAINS_' | grep -v '^ALL_DOMAINS' | sort | while IFS='=' read -r var_name domains; do
primary_domain=$(echo "$domains" | cut -d, -f1)
# Проверяем наличие сертификатов для valitovgaziz.ru
if [ ! -d "/etc/letsencrypt/live/valitovgaziz.ru" ]; then
echo "Получаем новые сертификаты valitovgaziz ..."
certbot certonly --webroot \
--config /etc/letsencrypt/config/certbot.ini \
-w /var/www/certbot \
-d ${DOMAINS_valitovgaziz}
fi
if [ ! -d "/etc/letsencrypt/live/$primary_domain" ]; then
echo "→ Получаем сертификат для $primary_domain"
certbot certonly --webroot \
--config /etc/letsencrypt/config/certbot.ini \
-w /var/www/certbot \
-d "$domains"
echo "✓ Сертификат для $primary_domain получен"
else
echo "✓ Сертификат для $primary_domain уже существует"
fi
done
echo "сertificates for ${DOMAINS_valitovgaziz} is ready"
# Проверяем наличие сертификатов для easysite102.ru
if [ ! -d "/etc/letsencrypt/live/easysite102.ru" ]; then
echo "Получаем новые сертификаты easysite102.ru ..."
certbot certonly --webroot \
--config /etc/letsencrypt/config/certbot.ini \
-w /var/www/certbot \
-d ${DOMAINS_easysite102}
fi
echo "сertificates for ${DOMAINS_easysite102} is ready"
# Проверяем наличие сертификатов для бегущийбашкир.рф
if [ ! -d "/etc/letsencrypt/live/xn--80abahjtcfl5d0a8di.xn--p1ai" ]; then
echo "Получаем новые сертификаты xn--80abahjtcfl5d0a8di.xn--p1ai(бегущийбашкир.рф) ..."
certbot certonly --webroot \
--config /etc/letsencrypt/config/certbot.ini \
-w /var/www/certbot \
-d ${DOMAINS_begushiybashkir}
fi
echo "сertificates for ${DOMAINS_begushiybashkir} is ready"
# Проверяем наличие сертификатов для begushiybashkir.ru
if [ ! -d "/etc/letsencrypt/live/begushiybashkir.ru" ]; then
echo "Получаем новые сертификаты begushiybashkir.ru ..."
certbot certonly --webroot \
--config /etc/letsencrypt/config/certbot.ini \
-w /var/www/certbot \
-d ${DOMAINS_begushiybashkir_latin}
fi
echo "сertificates for ${DOMAINS_begushiybashkir_latin} is ready"
set -e # Завершаем работу, если любая команда вернёт ошибку
# Активируем сервис cron
/usr/sbin/crond -f &
crond -f &
# Копируем нашу собственную crontab таблицу
# Настраиваем cron для ежедневного обновления
cp /opt/crontab.txt /etc/crontabs/root
# Оставляем контейнер открытым
tail -f /dev/null
# Запускаем crond в фоне
crond -b
echo "=== Init завершён, контейнер работает ==="
# Держим контейнер живым
tail -f /dev/null
+17
View File
@@ -0,0 +1,17 @@
#!/bin/sh
# renew-all.sh — единый скрипт обновления всех сертификатов
set -e
echo "=== Certbot renewal ==="
# Обновляем все сертификаты
certbot renew --webroot -w /var/www/certbot
# Перезагружаем nginx чтобы он подхватил новые сертификаты
if command -v docker > /dev/null 2>&1; then
echo "→ Перезагружаем nginx..."
docker exec nginx nginx -s reload 2>/dev/null || \
echo " (nginx reload не удался, возможно контейнер не запущен)"
fi
echo "=== Renewal завершён ==="