
ستون حاوية على خادم واحد
صندوق معادن عارية واحد يشغل عشرات إلى مئات حاويات Hoody. يجعل KSM و BTRFS dedup التكلفة الإضافية قريبة من الصفر.
تُشغّل هجرة من ثماني ساعات. خمسة أشخاص يريدون حالةً دون استهلاك خانة مستقبِل أو مقاطعة البثّ. أضف ?progress إلى رابط الأنبوب. كل من يفتحه يحصل على لوحة HTML مباشرة — البايتات المنقولة، السرعة الحاليّة، الزمن المتبقّي، انتقالات الحالة. الهجرة تعمل بأقصى سرعة بصرف النظر عن عدد العيون التي تشاهد.
?progress قراءة منفصلة على مسار الأنبوب تُصغي إلى حالة النقل دون المطالبة بخانة مستقبِل. الهجرة لا تلاحظها. المتصفّح يرى لوحة HTML؛ curl يرى تغذية SSE نظيفة.
She pastes the pipe URL with ?progress into her phone browser. The HTML dashboard appears instantly — state: waiting, 0% — no install, no login, no receiver slot consumed.
SSE pushes a state: streaming event. The progress bar snaps to 22%, bytes tick up, MB/s settles at 118. The dashboard updates itself every 250 ms without a single page reload.
She closes the tab. Her spectator connection drops. The migration doesn't notice — it was never in the data path. The sender and its one real receiver carry on.
She reopens the URL at sunrise. The dashboard shows a done event: 7.6 GB transferred, 8h 2m, no errors. Server-side state survives the refresh — latecomers always see the final line.
She forwards the URL to the team Slack. Three engineers open it and see the same done state. No status thread to close, no Grafana panel to un-star. One URL, five witnesses, zero interruptions.
# 1. المرسل — ترحيل ثماني ساعات. نفس الحال دائماً.
tar czf - /var/lib/postgres | curl -T - "$PIPE/api/v1/pipe/migration"
# 2. المتلقي — العميل الوحيد الذي يهم للضغط العكسي.
curl "$PIPE/api/v1/pipe/migration" | tar xzf - -C /restore
# 3. الرئيسة تفتح الرابط على هاتفها. لوحة معلومات HTML. بلا إعداد.
# => https://pipe.hoody.com/api/v1/pipe/migration?progress
# 4. تريد SSE لروبوت Slack؟ نفس الرابط، قبول مختلف.
curl -N -H "Accept: text/event-stream" \
"$PIPE/api/v1/pipe/migration?progress" \
| grep -E '^event: (progress|state|done)'
# event: state \n data: ["state":"streaming","receivers":1]
# event: progress \n data: ["bytes":5046464512,"mbps":118,"etaSec":840]
# event: done \n data: ["bytes":8160000000,"durationSec":28800]ثلاثة أنواع أحداث SSE. state للانتقالات (idle → waiting → streaming → complete)، progress كل 250 ms أثناء تدفّق البايتات (bytesTransferred، السرعة، الزمن المتبقّي)، done مرّة واحدة في النهاية بإحصاءات نهائيّة. حتى خمسون متفرّجاً لكل مسار، TTL الاتّصال ثلاثون دقيقة، بقاء ثلاثين ثانية بعد النقل ليرى المتأخّرون سطر النجاح.
نفس نقطة نهاية ?progress تخدم تبويب متصفّح وأنبوب curl وصفحة حالة تستطلع في الخلفيّة. لا أحد منهم يُبطئ النقل.
Bookmarks the URL on her phone. Checks twice a day.
HTML dashboard, no loginCurl SSE into a Slack webhook. One-liner status bot.
text/event-stream, same URLEmbedded in a public status page. Polls every 30 s.
0 receiver slots, full live stateWired to PagerDuty via the done event. Pings when finished.
event: done, one-shot triggerمشاهدة الهجرة هي رابطها الخاصّ. الهجرة لا تلاحظ.
كل فريق لديه طريقة للإجابة عن «إلى أين وصلت؟». معظم تلك الطرق تُكلّف خدمةً تشغّلها أو لوحة توصلها أو قناة محادثة تتفقّدها. مُعامل استعلام على رابط الأنبوب لا يُكلّف شيئاً من ذلك.
أرسل الرابط. توقّف عن إرسال التحديثات.