لماذا استضافة منشئ CV ذاتيًا
تُجوِّل أدوات SaaS لبناء السيرة الذاتية تاريخ مسيرتك المهنية وتُقيِّد الوصول إلى القوالب أو تفرض رسومًا على تنزيل PDF. الاستضافة الذاتية لـ Reactive Resume تعكس هذا النموذج: سيرك الذاتية وصورك وتصديراتك تبقى في حجم Docker على VPS الخاص بك، قابلة للتصدير عبر واجهة المستخدم أو REST API، ومشاركتها تحت نطاقك الخاص. بلا حدود للقوالب، بلا علامات مائية، بلا اشتراك مُلزِم.
تمنحك الاستضافة الذاتية أيضًا سيطرةً كاملة على البيانات الحساسة التي تتضمنها السيرة الذاتية — معلومات الاتصال الشخصية وتاريخ العمل والمهارات. لا تعبر هذه البيانات عبر طرف ثالث ولا تُخزَّن لديه.
ما تحصل عليه مع Reactive Resume المستضاف ذاتيًا
- محرِّر مرئي بالسحب والإفلات في المتصفح — بلا تطبيق للتثبيت، يعمل على أي جهاز.
- مكتبة قوالب احترافية متوافقة مع أنظمة ATS — تخطيطات متعددة لقطاعات ومستويات خبرة مختلفة.
- تصدير PDF من جانب المتصفح بالكامل منذ الإصدار 5.1.0 — بلا Chrome أو Puppeteer أو Browserless على الخادم.
- رابط عام للسيرة الذاتية — شارك ملفك على رابط مقروء يُحدَّث فوريًا.
- عدة سير ذاتية لكل حساب — اشتق نسخًا حسب المنصب أو اللغة دون تكرار العمل.
- REST API — أنشئ السير الذاتية وصدِّرها برمجيًا للتكامل مع أدوات الموارد البشرية.
- تخزين محلي — تُكتب الملفات المرفوعة (الصور الشخصية وصور الأعمال) في وحدة تخزين Docker دون حاجة إلى S3.
- توثيق OAuth اختياري — صِّل حساب GitHub أو Google بإضافة مفاتيح API المقابلة إلى الإعدادات.
المتطلبات الأساسية
خادم ServOrbit VPS بنظام Ubuntu 24.04 وذاكرة لا تقل عن 1 جيجابايت. يستهلك تطبيق Node.js نحو 300 ميجابايت أثناء الخمول، ويضيف PostgreSQL 16 من 100 إلى 200 ميجابايت — ويكفي خادم بذاكرة 1 جيجابايت للاستخدام الشخصي أو لفريق صغير.
يُثبِّت AWX كلًا من Docker وDocker Compose تلقائيًا عند النشر. اسم النطاق مطلوب: يثبِّت Reactive Resume رابط المصادقة (APP_URL) عند أول تشغيل ولا يمكنه العمل خلف عنوان IP وحده.
إن كنت تنوي تفعيل التحقق من الحساب عبر البريد الإلكتروني، فيُنصح بتوفير خادم SMTP صادر. بدونه يظهر رابط التحقق في سجلات Docker — مناسب للاستخدام الفردي، وأقل ملاءمةً عند فتح الوصول لمستخدمين آخرين.
انشر Reactive Resume على خادم VPS الخاص بك
اختر النطاق النهائي قبل النشر
يُثبِّت Reactive Resume
APP_URLفي رموز المصادقة وردود OAuth عند أول تشغيل. تغيير النطاق لاحقًا يُبطل جميع الجلسات ويستلزم حذف وحدة تخزين PostgreSQL. أنشئ سجل DNS من النوع A — مثلًاcv.yourdomain.com— وانتظر الانتشار قبل النشر.نشر بنقرة واحدة من سوق ServOrbit
افتح لوحة تحكم ServOrbit، اذهب إلى سوق التطبيقات ← Reactive Resume، أدخل نطاقك وانقر نشر. يُثبِّت AWX Docker ويولِّد سرًّا عشوائيًا ويضبط nginx مع TLS Let's Encrypt ويشغِّل الحاويتين في أقل من دقيقتين.
أنشئ حسابك وتحقق من بريدك
انتقل إلى
https://cv.yourdomain.comوانقر Sign Up لإنشاء حسابك. بدون SMTP يظهر رابط التحقق في سجلات Docker:docker compose logs reactive-resume | grep verify. انقر الرابط لتفعيل حسابك.أنشئ سيرتك الذاتية الأولى
انقر على + لإنشاء سيرة ذاتية جديدة. اختر قالبًا وأملأ أقسامك (الملخص والخبرة والتعليم والمهارات) في اللوحة اليسرى وشاهد النتيجة في الوقت الفعلي على اليمين. انقر تنزيل لتصدير PDF — التصيير من جانب المتصفح فورًا بلا انتظار.
شارك سيرتك الذاتية علنًا
في إعدادات السيرة الذاتية، فعِّل CV public. يولِّد Reactive Resume رابطًا قابلًا للمشاركة —
https://cv.yourdomain.com/r/your-name— يخدم دائمًا أحدث نسخة. شارك هذا الرابط في طلبات التوظيف بدلًا من إرفاق PDF ثابت تحتاج إلى إعادة إرساله عند كل تحديث.ضبط توثيق OAuth (اختياري)
للسماح بتسجيل الدخول عبر GitHub أو Google، أضف متغيرات البيئة المقابلة إلى إعدادات النشر:
GITHUB_CLIENT_IDوGITHUB_CLIENT_SECRETوGOOGLE_CLIENT_IDوGOOGLE_CLIENT_SECRET. أعد تشغيل الحاويات بعد ذلك بـdocker compose restart. تظهر أزرار الدخول الاجتماعي تلقائيًا على صفحة تسجيل الدخول بمجرد توفر المتغيرات.
أهم تغيير في الإصدار 5.1.0: تصدير PDF بلا خادم طباعة
حتى الإصدار 5.0 كان Reactive Resume يعتمد على Browserless أو Chromium بلا واجهة لتوليد ملفات PDF على الخادم، أي 700 ميجابايت إلى 1 جيجابايت إضافية من الذاكرة وتبعية يجب صيانتها. منذ الإصدار 5.1.0 يتولّى @react-pdf/renderer التوليد، وهي مكتبة JavaScript تعمل مباشرة في متصفح المستخدم. لا يرى الخادم سوى طلب حفظ المستند — بلا Chrome، بلا Puppeteer، بلا خدمة طباعة على البنية التحتية. وهذا ما يُعيد الحد الأدنى للتشغيل إلى حاويتين خفيفتين.
حافظ على سرية مفتاح التوثيق
يولِّد نشر ServOrbit تلقائيًا قيمةً عشوائية لـ SECRET_KEY. لا تعد استخدام قيمة متوقعة أو تشاركها بين نسخ متعددة. إن اشتبهت في اختراقها، أعد توليدها وأعد تشغيل الحاويات: ستُبطَل جميع الجلسات النشطة ويُجبَر المستخدمون على تسجيل الدخول مجددًا — وهذا هو السلوك المتوقع.
استخدام REST API لأتمتة التصدير
يكشف Reactive Resume واجهة REST API كاملة على المسار /api/v3. يمكنك إنشاء السير الذاتية وتحديثها وتشغيل تصدير PDF برمجيًا — مفيد لدمج توليد السير الذاتية في سير عمل الموارد البشرية أو في مسار تقديم طلبات آلي.
للمصادقة، احصل على رمز JWT عبر POST /api/v3/auth/login ببيانات اعتمادك، ثم مرِّر الرمز في الترويسة Authorization: Bearer <token> مع كل طلب.
مثال — استرداد قائمة سيرك الذاتية:
curl -s -H "Authorization: Bearer <your-token>" \
https://cv.yourdomain.com/api/v3/resume | jq '.[].title'تتوفر الوثائق الكاملة لواجهة API في المستودع الرسمي.
النسخ الاحتياطي وقابلية نقل البيانات
وحدتا تخزين Docker تحملان الخدمة بأكملها: reactive_resume_db لقاعدة PostgreSQL (الحسابات والسير الذاتية والإعدادات) وreactive_resume_data للملفات المرفوعة (الصور الشخصية وصور الأعمال). أبسط نسخة احتياطية:
docker run --rm \
-v reactive_resume_db:/data \
-v $(pwd):/backup \
alpine tar czf /backup/db.tar.gz /dataوللتصدير المباشر بصيغة SQL: docker exec db pg_dump -U postgres postgres > backup.sql
تستعيد الخدمة بتركيب الوحدة على حاوية PostgreSQL جديدة مضبوطة على الرابط العام نفسه. جدوِل هذه النسخ الاحتياطية بواسطة cron يومي أو استخدم خدمة لقطات وحدة التخزين من VPS الخاص بك للتغطية التلقائية.
استكشاف الأخطاء الشائعة وإصلاحها
APP_URL غير صحيح بعد تغيير النطاق. العَرَض: فشل ردود OAuth أو يشير رابط التحقق إلى النطاق القديم. الحل: عدِّل APP_URL في الإعدادات، ثم احذف وحدة تخزين PostgreSQL (docker volume rm reactive_resume_db) وأعد التشغيل. ستُفقَد جميع البيانات — خطِّط لهذه الخطوة قبل إنشاء حسابات في بيئة الإنتاج.
حاوية التطبيق تُعيد التشغيل باستمرار. تحقق من السجلات بـ docker compose logs reactive-resume. أكثر الأخطاء شيوعًا رفض اتصال PostgreSQL (Connection refused to db:5432): تبدأ حاوية التطبيق قبل أن يكون PostgreSQL جاهزًا. انتظر 30 ثانية وأعد تشغيل docker compose up -d.
ملف PDF بتخطيط غير صحيح. تصيير PDF يتم من جانب المتصفح بواسطة @react-pdf/renderer ويعتمد على محرك عرض متصفحك. إن بدا الناتج منزاحًا، جرِّب متصفحًا مختلفًا (Chrome أو Firefox حديث). المتصفحات القديمة أو الإضافات التي تعدِّل الخطوط قد تؤثر في التصيير.
خطأ secretOrPrivateKey must have a value عند البدء. متغير SECRET_KEY مفقود من الإعدادات. أضفه بقيمة عشوائية من 32 محرفًا على الأقل: openssl rand -hex 32 يولِّد قيمة مناسبة.
رابط السيرة الذاتية العام يُرجع 404. تحقق من أن السيرة الذاتية مُعلَّمة كعامة في إعداداتها. إن كان كذلك، تحقق من إعداد nginx: يجب أن يُوكِّل بلوك location /r/ إلى واجهة Next.js الأمامية لا إلى API.