روزی که SSL منقضی شد و Nginx ساکت ماند

کاربران گفتند سایت باز نمیشود. مرورگر: certificate expired. آخرین renew موفق؟ سه ماه قبل. برای یک سایت شخصی شاید قابل بخشش باشد — برای سرویس production نه.
علت: cron job روی سرور قدیمی مانده بود بعد از migrate به سرور جدید. هیچکس چک نکرد چون «قبلاً کار میکرد». اتوماسیون بدون مانیتورینگ فقط یک cron شکسته است که هیچوقت زنگ نمیزند.
Nginx بدون خطای واضح بالا بود. از دید process همه چیز سالم به نظر میرسید — مشکل در لایه TLS بود نه HTTP. openssl s_client اولین ابزاری بود که واقعیت را نشان داد.
renew دستی در همان روز انجام شد، ولی ۲۰ دقیقه downtime داشتیم چون مسیر certificate در config Nginx با مسیر certbot فرق داشت. یک symlink اشتباه میتواند incident را طولانی کند.
بعد از incident: certbot با systemd timer به جای cron — قابل مشاهدهتر با systemctl list-timers و log واضحتر.
alert ۱۴ روز قبل از expiry تنظیم کردیم. ۱۴ روز زود به نظر میرسد تا وقتی یک بار تعطیلات طولانی و deploy شلوغ داشته باشی — آنوقت کافی است.
runbook یکصفحهای نوشتیم: چک expiry، renew دستی، reload Nginx، تأیید با curl و openssl. ساده است ولی وقتی panic هست، مراحل مشخص آرامش میدهد.
درس اصلی: زیرساخت بدون مانیتورینگ = قمار. SSL expiry از آن دسته incidentهایی است که ۱۰۰٪ قابل پیشگیریاند — فقط باید یادت باشد چیزی که «خودکار است» را هم مانیتور کنی.