لماذا تستضيف Linkwarden بنفسك
الاعتراض الأكثر شيوعاً هو العبء التشغيلي: خدمة إضافية تحتاج إلى تحديث ونسخ احتياطي وتأمين — يبدو الأمر أسهل مع البقاء على SaaS. الاعتراض مشروع، لكنه يقوم على افتراض غير صحيح: أداة محتواة بشكل جيد كـ Linkwarden لا تتطلب صيانة أكثر من أي صورة Docker قياسية. التحديث يعني سحب الصورة الجديدة وإعادة تشغيل الخدمة. النسخ الاحتياطي يستهدف وحدة تخزين قاعدة بيانات واحدة. بروتوكول TLS يُدار بواسطة وكيل عكسي موجود بالفعل على الخادم.
ما يحله الاستضافة الذاتية هو التبعية لـ SaaS قد تتغير شروط وصوله بين عشية وضحاها. فقدت عدة فرق الوصول إلى مكتبات أبحاث مشتركة بعد إغلاق أو استحواذ على أداة تابعة لجهة خارجية. على خادمك الافتراضي، تنتمي البيانات لمؤسستك، وتبقى المجموعات متاحة بصرف النظر عن الوضع التجاري للمورد، وأنت من يتحكم في سياسة الاحتفاظ بالبيانات.
ما تقدمه Linkwarden لوكالتك
- مجموعات مشتركة — لكل مشروع أو عميل مجموعته الخاصة، يصل إليها أعضاء الفريق المعنيون دون الكشف عن المجلدات الأخرى.
- صلاحيات لكل عضو — تُدار الأذونات على مستوى المجموعة: قارئ أو مساهم أو مدير، وفق دور كل شخص.
- تعليقات مشتركة — يمكن لأعضاء المجموعة ترك ملاحظات على كل رابط، مما يتجنب تكرار البحث ويراكم المعرفة المؤسسية.
- إضافة متصفح متعددة المستخدمين — يُثبِّت كل متعاون الإضافة ويحفظ مباشرة في المجموعة المستهدفة دون فتح واجهة الويب.
- أرشفة الصفحات — تحتفظ Linkwarden بنسخة محلية من الصفحات المحفوظة حتى لا تضيع الموارد التي تختفي من الويب.
- REST API — تتكامل الروابط مع أدوات داخلية أخرى عبر API دون أي تبعية للواجهة الرسومية.
- ملكية كاملة للبيانات — لا تحليلات سلوكية، ولا مشاركة الإشارات المرجعية مع أطراف خارجية.
المتطلبات قبل التثبيت
خادم VPS بـ 2 vCPU و2 غيغابايت من الذاكرة يكفي لوكالة من 5 إلى 15 شخصاً في الاستخدام العادي: تُحمَّل المجموعات بسرعة وتعمل أرشفة الصفحات في الخلفية دون التأثير على التصفح. بأقل من 1 غيغابايت، قد يُنهي نظام OOM killer عملية Node.js الخاصة بـ Next.js تحت الحمل.
خطط لـ 10 إلى 20 غيغابايت من التخزين حسب حجم الصفحات المؤرشفة: تزن كل لقطة شاشة ونسخة صفحة ما بين 100 كيلوبايت و2 ميغابايت. خادم {{vps.power.name}} مع NVMe SSD مناسب لهذا العبء.
على صعيد الشبكة، يجب أن يكون المنفذ 443 مفتوحاً وأن يشير اسم نطاق إلى IP الخادم قبل توليد شهادة TLS. تتطلب Linkwarden Docker وDocker Compose، المتاحَين على جميع توزيعات Linux الرئيسية. قاعدة بيانات PostgreSQL مطلوبة — وهي مضمَّنة في ملف Compose الرسمي.
النشر خطوة بخطوة
تحضير دليل العمل
تواصل عبر SSH بخادمك الافتراضي بصفتك root أو مستخدم sudoer، ثم أنشئ المجلد الذي سيحتوي ملفات الإعداد:
mkdir -p /opt/linkwarden && cd /opt/linkwardenإنشاء ملف Compose
أنشئ ملف docker-compose.yml بالمحتوى التالي. يجب استبدال القيم بين أقواس قبل التشغيل:
services:
postgres:
image: postgres:16-alpine
restart: unless-stopped
environment:
POSTGRES_DB: linkwarden
POSTGRES_USER: linkwarden
POSTGRES_PASSWORD: <db-password>
volumes:
- postgres_data:/var/lib/postgresql/data
linkwarden:
image: ghcr.io/linkwarden/linkwarden:latest
restart: unless-stopped
depends_on:
- postgres
environment:
DATABASE_URL: postgresql://linkwarden:<db-password>@postgres:5432/linkwarden
NEXTAUTH_SECRET: <random-32-character-string>
NEXTAUTH_URL: https://your-domain.com
volumes:
- linkwarden_data:/data/data
ports:
- "127.0.0.1:3000:3000"
volumes:
postgres_data:
linkwarden_data:لتوليد قيمة NEXTAUTH_SECRET، نفِّذ على الخادم: openssl rand -base64 32.
ضبط NEXTAUTH_URL بعناية
يجب أن تتطابق المتغيرة NEXTAUTH_URL تماماً مع عنوان URL العام لنسختك، بما في ذلك البروتوكول. إذا كانت نسختك خلف وكيل عكسي TLS، يجب أن تبدأ القيمة بـ https:// لا بـ http://.
قيمة NEXTAUTH_URL المشوهة تُنتج الخطأ التالي عند التحميل الأول: Error: NEXTAUTH_URL is not configured. Please set NEXTAUTH_URL in your .env. إذا استخدمت القيمة http:// بينما يُعيد الوكيل HTTPS، لا تُنشأ الجلسة وتعيد صفحة تسجيل الدخول التحميل في حلقة دون أي رسالة خطأ مرئية.
تشغيل الحاويات
من داخل /opt/linkwarden، نفِّذ:
docker compose up -dتُنزَّل الصور، ثم يبدأ PostgreSQL أولاً. تنتظر Linkwarden حتى تصبح قاعدة البيانات جاهزة قبل تهيئة المخطط. تحقق من أن كلتا الحاويتين في حالة running باستخدام docker compose ps.
إعداد الوكيل العكسي (nginx)
تستمع Linkwarden على 127.0.0.1:3000. أضف كتلة خادم nginx لتوجيه حركة HTTPS:
server {
listen 443 ssl;
server_name your-domain.com;
ssl_certificate /etc/letsencrypt/live/your-domain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/your-domain.com/privkey.pem;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}أعد تحميل nginx باستخدام nginx -t && systemctl reload nginx.
توليد شهادة TLS
إذا لم يكن ذلك قد تم بعد، أنشئ شهادة Let's Encrypt باستخدام Certbot:
certbot --nginx -d your-domain.comيُعدِّل Certbot كتلة nginx تلقائياً لإضافة مسارات الشهادات وإعادة التوجيه من HTTP إلى HTTPS. التجديد تلقائي عبر مؤقت systemd المُثبَّت بالحزمة.
إنشاء أول حساب مدير
افتح https://your-domain.com في متصفح. تطلب Linkwarden إنشاء الحساب الأول عند أول وصول. يصبح هذا الحساب مدير النسخة. ادعُ كل متعاون من الإعدادات ← الأعضاء بإدخال عنوان بريده الإلكتروني.
توزيع إضافة المتصفح
إضافة Linkwarden متاحة على Chrome Web Store وFirefox Add-ons. أثناء الإعداد الأولي، يدخل كل عضو عنوان URL للنسخة (https://your-domain.com) ويُنشئ رمز API من الإعدادات ← رموز الوصول. تصل الإشارات المرجعية المحفوظة عبر الإضافة مباشرة إلى المجموعة التي اختارها المستخدم.
التصليب بعد التثبيت
قيِّد الوصول المباشر إلى المنفذ 3000 من الخارج — يجب أن يستجيب فقط على الواجهة المحلية: تحقق من أن سطر ports في ملف Compose يربط بـ 127.0.0.1:3000:3000 لا بـ 0.0.0.0:3000:3000.
فعِّل التحديثات التلقائية للصور باستخدام Watchtower أو جدوِل مهمة cron أسبوعية: docker compose pull && docker compose up -d.
احتفظ بنسخة احتياطية من وحدة التخزين postgres_data بتفريغ يومي: docker compose exec postgres pg_dump -U linkwarden linkwarden > /opt/backups/linkwarden-$(date +%F).sql. خزِّن التفريغات خارج الخادم (S3، تخزين بعيد) للحماية من عطل القرص.
Linkwarden أم Karakeep: حالتا استخدام مختلفتان
كثيراً ما يُذكر Karakeep (المعروف سابقاً بـ Hoarder) وLinkwarden معاً في مقارنات مديري الإشارات المرجعية ذاتية الاستضافة، لكنهما لا يعالجان الحاجة نفسها.
يركز Karakeep على الالتقاط الذكي: يستخرج محتوى الصفحات ويلخصه تلقائياً باستخدام نموذج لغوي محلي أو بعيد. إنه مصمم للاستخدام الفردي، حيث تكمن القيمة في الذكاء الاصطناعي الذي يصنف ويرتب. لا يوفر مفهوم المجموعات المشتركة ولا إدارة الصلاحيات لكل عضو.
تم تصميم Linkwarden للتعاون: المفهوم المحوري هو المجموعة المشتركة، يصل إليها عدة أعضاء بصلاحيات متمايزة. التعليقات مشتركة لا شخصية. تتصل إضافة المتصفح بنسخة المؤسسة لا بحساب شخصي. للوكالة التي تريد مركزة أبحاث فرقها المشروعية، Linkwarden هو الأداة المناسبة. لمن يريد مكتبة شخصية يُثريها الذكاء الاصطناعي، Karakeep أنسب.
Linkwarden مقابل Karakeep — جدول مقارن
| المعيار | Linkwarden | Karakeep |
|---|---|---|
| الاستخدام الرئيسي | أبحاث الفريق التعاونية | الالتقاط الشخصي بمساعدة الذكاء الاصطناعي |
| المجموعات المشتركة | نعم، مع صلاحيات لكل عضو | لا (استخدام فردي) |
| التعليقات المشتركة | نعم | لا |
| إضافة متصفح متعددة المستخدمين | نعم | نعم (حساب واحد) |
| تلخيص المحتوى بالذكاء الاصطناعي | لا | نعم (نموذج محلي أو API) |
| الحد الأدنى من الموارد | 2 vCPU / 2 غيغابايت RAM | 2 vCPU / 4 غيغابايت RAM (نموذج محلي) |
| الترخيص | AGPL-3.0 | AGPL-3.0 |
الأخطاء الشائعة أثناء التثبيت
تعيد صفحة تسجيل الدخول التحميل في حلقة دون رسالة خطأ.
السبب المرجح: تم ضبط NEXTAUTH_URL على http:// بينما يُقدم الوكيل العكسي HTTPS. يُنشئ NextAuth ملف تعريف ارتباط آمن يرفض المتصفح إعادة إرساله عبر اتصال غير مشفر. صحِّح القيمة في ملف Compose، ثم أعد التشغيل باستخدام docker compose up -d --force-recreate.
تُحمَّل الواجهة لكن صور المجموعات لا تظهر.
مسار وحدة التخزين linkwarden_data غير مُركَّب بشكل صحيح. تحقق من إعلان وحدة التخزين في قسم volumes من ملف Compose ومن أن أي ربط سابق لم يترك المجلد فارغاً.
خطأ ECONNREFUSED في سجلات Linkwarden عند بدء التشغيل.
تبدأ Linkwarden قبل أن يكون PostgreSQL جاهزاً لقبول الاتصالات. أضف healthcheck لخدمة postgres وشرط depends_on: postgres: condition: service_healthy لخدمة linkwarden لفرض الترتيب.
تعرض إضافة المتصفح رسالة «تعذر الوصول إلى الخادم».
تحقق من أن عنوان URL المُدخل في إعدادات الإضافة لا يحمل شرطة مائلة في النهاية (https://your-domain.com لا https://your-domain.com/). بعض إصدارات الإضافة حساسة لهذه التفصيلة.
لا تعمل أرشفة الصفحات.
تستدعي عملية الأرشفة Chromium في وضع headless من داخل الحاوية. على VPS بأقل من 1.5 غيغابايت من الذاكرة، تنتهي العملية قبل اكتمال الالتقاط. زِد موارد الخادم الافتراضي أو عطِّل الأرشفة التلقائية من الإعدادات ← الأرشفة إذا كانت الذاكرة محدودة.
الخطوة التالية: مركزة جميع خدمات الوكالة
الوكالة التي تستضيف أبحاثها ذاتياً باستخدام Linkwarden تجاوزت الحد بالفعل: تدير بياناتها وتحديثاتها ونسخها الاحتياطية. هذا هو موقف الفريق الذي يعرف ما يُشغِّله.
الخطوة المنطقية التالية هي مركزة نطاقات عملائك واستضافتهم وخوادمهم الافتراضية تحت علامتك التجارية الخاصة، في مساحة موزع واحدة دون تعدد الواجهات أو فقدان الرؤية على التجديدات. هذا بالضبط ما يتيحه برنامج الوكالة في ServOrbit.
إذا أردت التوسع في استضافة أدوات الفريق ذاتياً، تكمل مقالا Outline (wiki تعاوني) وأتمتة الخوادم باستخدام Ansible هذا الدليل.