Bỏ qua để đến nội dung

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.

Terminal window
export CERTBOT_EMAIL=<email-vận-hành-thật>
./scripts/init_letsencrypt.sh

Script này tự động:

  1. Tạo chứng chỉ tự ký tạm thời để Nginx khởi động được lần đầu.
  2. Khởi động Nginx.
  3. 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).
  4. 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>&1

Chứ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):

Terminal window
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