انتقل إلى المحتوى
use-cases / cert-renewal-no-ssh / hero
CRON · EXEC · NO SSH

جدّد شهادات TLS دون جلسة SSH

Hoody Cron يحمل الجدول. Hoody Exec يحمل منطق التجديد. الأحد الساعة 04:00، curl يُطلَق، certbot يعمل، الحزمة الجديدة تُرسَل بـ PATCH إلى البروكسي، وإعادة التحميل يُقرّ بها. لا جلسة شِل، لا مفتاح في ~/.ssh، ولا مُضيف عبور بينك وبين الشهادة.

اقرأ توثيق cron
use-cases / cert-renewal-no-ssh / lifecycle

ثلاثة روابط، لا شِل

أنبوب التجديد بأكمله نقطتا نهاية وجدول من خمسة حقول. Cron يُحفّز Exec. Exec يستدعي ACME ويُرسل PATCH للبروكسي. التأكيد يعود رمز 200.

RENEWAL LIFECYCLEPOSTED ONCE · RUNS WEEKLY
01 · SCHEDULE

أرسل POST لمُدخل cron واحد

POST /users/me/entries بجدول "0 4 * * 0" وأمر "curl /scripts/certs/renew". خدمة cron تكتبه في crontab المستخدم وتبدأ التتبّع. فعلت هذا مرة، من أي مكان عبر HTTPS.

02 · RUN

Exec يُشغّل السكربت

الأحد 04:00، cron يُجري curl لرابط exec. Exec يُولّد السكربت، يتحدث مع نقطة نهاية ACME التابعة لـ Let's Encrypt، يُحقّق تحدّي http-01، ويكتب الحزمة المُجدَّدة إلى /files. لا عقدة تُسجّل دخولها، لا حاجة لجلسة.

03 · RELOAD

أرسل PATCH لحزمة البروكسي

السكربت يُرسل PATCH للشهادة الجديدة والمفتاح إلى نقطة نهاية حزمة بروكسي Hoody. البروكسي يُعيد تحميلاً ساخناً — لا إعادة تشغيل — والمصافحة TLS التالية تُقدّم الشهادة الجديدة. الدورة كلها أقلّ من دقيقة.

كل خطوة استدعاء HTTP يمكنك إعادة تشغيله من تيرمنال — `curl --dry-run` إن أردت تنقيحه، `curl -i` إن أردت الرؤوس. الأنبوب لا يعتمد على جلسة مُسجَّل بها في أي نقطة.

use-cases / cert-renewal-no-ssh / mechanism

كيف تبدو نقطتا النهاية

على اليسار، مُدخل cron الذي يُجدوِل المهمة. على اليمين، سكربت exec الذي يُؤدّي العمل. كلاهما قابل للوصول عبر HTTP — كلاهما قابل للتدقيق، كلاهما قابل لإعادة التشغيل من أي حاسوب محمول أو هاتف.

cron · سجّل الجدول
POST · مرة واحدة
# register the weekly renewal
curl -X POST \
  https://cron.containers.hoody.com/users/me/entries \
  -H "Content-Type: application/json" \
  -d '[ "schedule":"0 4 * * 0", "command":"curl -fsS https://exec.containers.hoody.com/scripts/certs/renew", "comment":"weekly TLS renewal", "enabled":true ]'

# response
HTTP/1.1 201 Created
{ "id":"7a92", "schedule":"0 4 * * 0", "enabled":true }
exec · scripts/certs/renew.ts
GET · يعمل أسبوعياً
// scripts/certs/renew.ts
// @mode serverless
// @timeout 120000

const domains = ["your-app.com", "api.your-app.com", ...];

for (const d of domains) {
  const cert = await acme.order(d);
  await fetch("/api/v1/proxy/cert/bundle", {
    method: "PATCH",
    body: JSON.stringify({ d, cert })
  });
}

return { "renewed": domains.length };

رابطان، صباح أحد واحد، صفر SSH. مُدخل cron بيانات — أرسل POST مرة وهو موجود حتى تحذفه. سكربت exec ملف — غيّره عبر API والتشغيل التالي يلتقط المنطق الجديد. لا شيء في هذه الحلقة يحتاج إلى شخص على آلة.

use-cases / cert-renewal-no-ssh / powers

لماذا يهزم هذا crontab عبر SSH

نفس النتيجة — شهادة مُجدَّدة كل أسبوع — مع ثلاث خصائص لم يملكها الإعداد القديم.

AUTH · URL TOKEN

لا مفتاح خاصّ في ~/.ssh

المصادقة رمز URL، لا مفتاح SSH. دوّره عبر API ويتوقّف الرمز القديم عن العمل في كل مكان دفعة واحدة. لا تمرير وكيل، لا حصن، ولا ملف مفتاح نسيت أنك نسخته إلى صندوق CI قبل ثلاث سنوات.

AUDIT · HTTP TRACE

كل تجديد سجل طلب

كل تشغيل صفّ في سجل cron وسطر طلب في سجل exec. ابحث بـ grep عمّن أطلقه، ومتى، وأي شهادة، وأي رمز استجابة. الـ200 من البروكسي هو الإيصال بأن إعادة التحميل وصلت.

تصحيح · dry-run curl

لست مضطرّاً لـ SSH للتنقيح

أعد تشغيل التجديد من حاسوبك المحمول بـ `curl /scripts/certs/renew?dry_run=true`. شاهد الاستجابة، أصلح السكربت عبر exec write API، أعد المحاولة. الحلقة كلها تحدث عبر HTTPS — نفس الأنبوب الذي يستخدمه جدول الإنتاج.

use-cases / cert-renewal-no-ssh / capacity

ما الذي تخطّيته

أرقام من النشر، لا قياسات معيارية. الشكل هو ما يهمّ: قطع متحرّكة قليلة جداً، كلها تتحدث HTTP.

  1. جلسات SSH0

    الإعداد POST. التجديد GET على جدول. التنقيح curl. لا توجد جلسة شِل في الأنبوب في أي نقطة — مفتاحك الخاص لا يحتاج أبداً أن يكون على الصندوق.

  2. نقاط نهاية مُستخدَمة2

    مُدخل cron واحد لجدولة التشغيل. مسار exec واحد يُشغّل السكربت. الرابط الثالث — PATCH لحزمة البروكسي — يعيش داخل السكربت ويُعيد تحميل الشهادة.

  3. حقول · جدول cron5

    التعبير القياسي من خمسة حقول "0 4 * * 0" — الأحد 04:00. أو `@weekly` إن لم يهمّك أي يوم. خدمة cron تقبل الاثنين، إضافةً إلى الانتهاء التلقائي للتجديدات لمرة واحدة.

خدمة Cron: تعابير من خمسة حقول وماكرو (`@hourly`, `@daily`, `@weekly`, `@monthly`, `@yearly`)، عزل لكل مستخدم، expires_at اختياري. Exec: عوازل V8، وقت تشغيل Bun، تعليقات سحرية للوضع/المهلة/CORS. تدفّق ACME يُعالَج في سكربتك — Hoody لا يُشغّل certbot لك، يُشغّل كودك على جدول.

use-cases / cert-renewal-no-ssh / punchline

التجديد curl على جدول — لا جلسة شِل، لا مفتاح، ولا مُضيف عبور.

قديم · السبت قبل انتهاء الشهاداتجديد · cron يعمل منذ تسعة أشهر
ما كانت تبدو عليه الحزمة القديمةssh prod && certbot renew && systemctl reload nginxمفتاح في ~/.ssh · حصن في الأمام · صلاة بأن سطر cron نجا من آخر إعادة تشغيل
ما يبدو عليه الآن
اقرأ توثيق exec
use-cases / cert-renewal-no-ssh / replaces

ما الذي يحلّ هذا محلّه

الطرق القياسية للحفاظ على TLS صالحاً في الإنتاج. كل واحدة تريد إمّا جلسة شِل، أو خدمة مستوى تحكّم، أو الاثنتين. زوج cron-plus-exec لا يريد أيّاً منهما.

  • SSH + certbot يدويجلسة شِل، مفتاح، خطوة تجديد تنساها حين تكون في إجازة
  • ssh-bastion + سكربتمُضيف عبور تصونه فقط لتُشغّل سكربتاً من سطر واحد
  • AWS Certificate Manager (مغلق الحلقة)مجاني، لكن على AWS فقط — والشهادة لا تغادر بروكسيهم أبداً
  • HashiCorp Vault PKIعفريت أسرار كامل لإصدار شهادات تُجدّدها مرة في الأسبوع
  • cert-manager على Kubernetesمُتحكّم، CRD، webhook — لما هو استدعاءا HTTP
  • أنبوب cron تجديد مخصّص + مُضيف عبورسكربتات لاصقة على حصن، مفتاح لكل مُشغّل CI، لا أثر تدقيق
use-cases / cert-renewal-no-ssh / cta

توقّف عن تسجيل الدخول لتجديد الشهادات. أرسل POST للجدول مرة. وشاهد البروكسي يُعيد تحميل نفسه كل صباح أحد.

اقرأ توثيق kit
use-cases / cert-renewal-no-ssh / related

اقرأ الآخرين