Khởi tạo Nginx + chứng chỉ TLS (chỉ làm 1 lần cho domain mới)
Chi tiết đầy đủ: tasks/phase_f/task_f.2_reverse_proxy_tls_domain.md.
export CERTBOT_EMAIL=<email-vận-hành-thật>./scripts/init_letsencrypt.shScript này tự động:
- Tạo chứng chỉ tự ký tạm thời để Nginx khởi động được lần đầu.
- Khởi động Nginx.
- Xóa chứng chỉ tạm, xin chứng chỉ thật từ Let’s Encrypt qua webroot challenge (yêu cầu domain đã trỏ đúng IP VPS — xem §1).
- Reload Nginx với chứng chỉ thật.
Thiết lập renew tự động — đã có trong bộ cron cài bằng
./scripts/install_cron.sh (§10), dòng:
0 3 * * * cd /opt/web_admin && ./scripts/renew_cert.sh >> /var/log/admin_portal/renew_cert.log 2>&1Chứng chỉ Let’s Encrypt hết hạn sau 90 ngày; renew_cert.sh chạy hằng
ngày nhưng chỉ thực sự renew khi còn dưới 30 ngày (hành vi mặc định của
certbot) — an toàn để chạy mỗi ngày.
Nếu init_letsencrypt.sh thất bại giữa chừng (ví dụ do quên mở
port ở §1, hoặc dính rate-limit — xem bảng sự cố ở §11): script đã xóa
chứng chỉ tạm trước khi gọi Certbot, nên nếu bước xin chứng chỉ thật
thất bại, Nginx sẽ không còn chứng chỉ nào cả và quay lại
crash-loop. Xử lý: sửa nguyên nhân gốc trước (mở port/đợi hết
rate-limit), rồi dọn sạch phần chứng chỉ dở dang trước khi chạy lại,
KHÔNG chạy lại nguyên init_letsencrypt.sh (script sẽ báo lỗi vì thư
mục live/ cũ vẫn còn):
docker compose -f docker-compose.prod.yml run --rm --entrypoint \ "rm -rf /etc/letsencrypt/live/${DOMAIN} /etc/letsencrypt/archive/${DOMAIN} /etc/letsencrypt/renewal/${DOMAIN}.conf" \ certbot
docker compose -f docker-compose.prod.yml run --rm certbot certonly \ --webroot -w /var/www/certbot -d "${DOMAIN}" \ --email <email-vận-hành-thật> --agree-tos --no-eff-email
docker compose -f docker-compose.prod.yml exec nginx nginx -s reload(Nginx cần đang chạy được với 1 cert nào đó — tạm hoặc thật — để phục
vụ webroot challenge ở bước certonly; nếu đang crash-loop, tạo lại
cert tự ký tạm như bước 1 của init_letsencrypt.sh trước.)
Áp dụng cho Portal v1.2.2