2026-03-06 16:57:46 +03:00
|
|
|
#!/bin/bash
|
2026-05-13 10:39:02 +03:00
|
|
|
# Obtain a TLS certificate from Let's Encrypt for one domain.
|
|
|
|
|
#
|
|
|
|
|
# Usage:
|
|
|
|
|
# sudo ./scripts/init-letsencrypt.sh my-products.ru
|
2026-05-13 14:07:29 +03:00
|
|
|
# sudo ./scripts/init-letsencrypt.sh xn----8sbfwtmcso8g.xn--p1ai
|
2026-05-13 10:39:02 +03:00
|
|
|
#
|
2026-05-13 14:07:29 +03:00
|
|
|
# For IDN/Cyrillic domains, pass the punycode form (certbot requires ASCII).
|
2026-05-13 10:39:02 +03:00
|
|
|
# If no argument is given, DOMAIN is read from .env.
|
|
|
|
|
# Run once per domain on first deploy.
|
2026-03-06 16:57:46 +03:00
|
|
|
|
|
|
|
|
set -euo pipefail
|
|
|
|
|
|
2026-05-13 10:39:02 +03:00
|
|
|
# ── resolve domain ────────────────────────────────────────────────────────────
|
|
|
|
|
if [ -n "${1:-}" ]; then
|
|
|
|
|
DOMAIN="$1"
|
|
|
|
|
else
|
|
|
|
|
if [ -f .env ]; then
|
|
|
|
|
DOMAIN_FROM_ENV=$(grep -E '^DOMAIN=' .env | cut -d= -f2- | tr -d '"'"'" | head -1)
|
|
|
|
|
DOMAIN="${DOMAIN:-${DOMAIN_FROM_ENV:-}}"
|
|
|
|
|
fi
|
2026-05-12 14:01:38 +03:00
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
if [ -z "${DOMAIN:-}" ]; then
|
2026-05-13 10:39:02 +03:00
|
|
|
echo "ERROR: no domain specified." >&2
|
|
|
|
|
echo "Usage: $0 <domain> or set DOMAIN= in .env" >&2
|
2026-05-12 14:01:38 +03:00
|
|
|
exit 1
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
EMAIL="${LETSENCRYPT_EMAIL:-admin@$DOMAIN}"
|
2026-03-09 16:11:03 +03:00
|
|
|
ACME_DIR="/var/www/certbot"
|
2026-03-06 16:57:46 +03:00
|
|
|
|
2026-05-13 10:39:02 +03:00
|
|
|
echo "==> Obtaining certificate for: $DOMAIN (www.$DOMAIN)"
|
|
|
|
|
echo " Email: $EMAIL"
|
2026-03-06 16:57:46 +03:00
|
|
|
|
2026-05-13 10:39:02 +03:00
|
|
|
echo "==> Ensuring acme-challenge directory exists..."
|
2026-03-09 16:11:03 +03:00
|
|
|
sudo mkdir -p "$ACME_DIR"
|
|
|
|
|
sudo chmod 755 "$ACME_DIR"
|
2026-03-06 16:57:46 +03:00
|
|
|
|
|
|
|
|
echo "==> Requesting certificate from Let's Encrypt..."
|
2026-03-09 16:11:03 +03:00
|
|
|
sudo certbot certonly \
|
2026-03-06 16:57:46 +03:00
|
|
|
--webroot \
|
2026-03-09 16:11:03 +03:00
|
|
|
--webroot-path="$ACME_DIR" \
|
2026-03-06 16:57:46 +03:00
|
|
|
--email "$EMAIL" \
|
|
|
|
|
--agree-tos \
|
|
|
|
|
--no-eff-email \
|
2026-05-13 14:07:29 +03:00
|
|
|
-d "$DOMAIN" \
|
|
|
|
|
-d "www.$DOMAIN"
|
2026-03-06 16:57:46 +03:00
|
|
|
|
2026-05-12 14:01:38 +03:00
|
|
|
echo ""
|
2026-05-13 10:39:02 +03:00
|
|
|
echo "==> Certificate obtained for $DOMAIN"
|
2026-05-13 14:07:29 +03:00
|
|
|
echo " /etc/letsencrypt/live/$DOMAIN/fullchain.pem"
|
|
|
|
|
echo " /etc/letsencrypt/live/$DOMAIN/privkey.pem"
|
2026-03-09 16:11:03 +03:00
|
|
|
echo ""
|
2026-05-13 10:39:02 +03:00
|
|
|
echo "==> Generate nginx config and reload:"
|
|
|
|
|
echo " sudo ./scripts/generate-nginx-conf.sh $DOMAIN"
|
|
|
|
|
echo " sudo nginx -t && sudo systemctl reload nginx"
|
2026-03-09 16:11:03 +03:00
|
|
|
echo ""
|
2026-05-13 10:39:02 +03:00
|
|
|
echo "==> Auto-renewal (add to /etc/cron.d/certbot if not already present):"
|
|
|
|
|
echo " 0 3 * * * root certbot renew --quiet && systemctl reload nginx"
|