> ## Content Index
> Fetch the complete content index at: https://arabroot.io/llms.txt
> Use this file to discover other available public pages before exploring further.

# تثبيت Dokploy لنشر تطبيقاتك من Git على خادمك
- URL: https://arabroot.io/articles/تثبيت-dokploy-لنشر-التطبيقات/
- Published: 2026-10-03T08:20:00.000Z
- Updated: 2026-10-04T20:52:41.000Z
- Description: منصة مفتوحة المصدر تنشر تطبيقاتك من Git على خادمك، على طريقة Vercel. نثبت Dokploy بأمان، وننشر تطبيقاً وملف Compose بنطاق وشهادة HTTPS لكل منهما، ونجهز النسخ الاحتياطي.
- Author: فريق عرب رووت
- Tags: الأدلة التقنية, Docker والحاويات, DevOps وCI/CD, الاستضافة الذاتية, Dokploy

الفريق الذي ينشر تطبيقاته على Vercel أو Heroku أو Netlify اعتاد على أمر مريح جداً، فهو يدفع الكود Push إلى المستودع Repository، وبعد دقائق يجد التطبيق منشوراً بنطاقه وشهادته دون أن يفتح أي سيرفر، ولكن هذه الراحة لها ثمن، فالفاتورة تكبر مع كل مشروع جديد، والبيانات تعمل على بنية لا تملكها ولا تتحكم فيها، والخبر الجيد أن نفس التجربة ممكنة على السيرفر Server الخاص بك أنت.

وهناك أكثر من أداة تستضيفها بنفسك لهذا الغرض، فـ [Portainer](https://arabroot.io/articles/%D8%AA%D8%AB%D8%A8%D9%8A%D8%AA-portainer-%D9%84%D8%A5%D8%AF%D8%A7%D8%B1%D8%A9-docker/) واجهة لإدارة Docker وما يعمل عليه، ولكنه لا يبني تطبيقك من الكود المصدري ولا يصدر له شهادة، أما [Coolify](https://arabroot.io/articles/%D8%AA%D8%AB%D8%A8%D9%8A%D8%AA-coolify-%D9%84%D9%86%D8%B4%D8%B1-%D8%A7%D9%84%D8%AA%D8%B7%D8%A8%D9%8A%D9%82%D8%A7%D8%AA/) و[**Dokploy**](https://dokploy.com/?ref=arabroot.io) فهما منصتان من فئة المنصة كخدمة PaaS، حيث تبني كل منهما التطبيق Build من Git وتنشره مع نطاق Domain وشهادة، والفكرة فيهما متقاربة والفرق في التفاصيل، وأهمها أن Dokploy يعتمد أساساً على Docker Swarm لتشغيل خدماته ولربط أكثر من سيرفر، وتجد المقارنة الكاملة بينها في [مقارنة Portainer وCoolify وDokploy](https://arabroot.io/articles/%D9%85%D9%82%D8%A7%D8%B1%D9%86%D8%A9-portainer-%D9%88-coolify-%D9%88-dokploy/).

وهذا الدليل عن Dokploy، وهو منصة نشر مفتوحة المصدر Open Source تبني تطبيقك من مستودع Git وتنشره في Container وتربطه بالنطاق وبشهادة [Let's Encrypt](https://letsencrypt.org/?ref=arabroot.io) عبر Traefik، وتنشر ملفات Docker Compose كما هي، وتنشئ قواعد البيانات Databases وتنسخها احتياطياً إلى مخزن متوافق مع S3، وتوزع الأحمال Workloads على أكثر من سيرفر عبر Docker Swarm. ولاحظ أن الكود في [ملف الترخيص](https://github.com/Dokploy/dokploy/blob/v0.30.8/LICENSE.MD?ref=arabroot.io) مرخص بـ Apache 2.0 باستثناء أي مجلد اسمه `/proprietary`، فهذه المجلدات تحت [رخصة DSAL](https://github.com/Dokploy/dokploy/blob/v0.30.8/LICENSE%5FPROPRIETARY.md?ref=arabroot.io) التي لا تسمح باستخدامها في الإنتاج إلا باتفاق تجاري، وفيها [ميزات Enterprise](https://docs.dokploy.com/docs/core/enterprise?ref=arabroot.io) مثل الدخول الموحد SSO وسجلات التدقيق Audit Logs والأدوار المخصصة Custom Roles، وكل ما سوف نستخدمه في هذا الدليل يقع في الجزء المفتوح.

وسوف نناقش في هذا المقال ما يلي:

- ماذا يفعل سكربت التثبيت على السيرفر بالضبط، ولماذا نثبت من نسخة السكربت المرفقة بالإصدار v0.30.8 وليس بالأمر المختصر من التوثيق.
- إنشاء حساب المدير، وربط اللوحة بنطاق وHTTPS، ثم إغلاق المنفذ 3000 وتفعيل التحقق بخطوتين.
- نشر تطبيق من مستودع Git، ونشر ملف Docker Compose، ونطاق وشهادة لكل منهما، ومتغيرات البيئة.
- قواعد البيانات ونسخها المجدول إلى S3، والسيرفرات البعيدة والعقد Nodes.
- النسخ الاحتياطي لـ Dokploy نفسه واستعادته، والتحديث، وأشهر المشكلات وحلولها.

## المتطلبات Requirements

- سيرفر جديد بنظام Ubuntu 24.04 LTS، وهو من [التوزيعات التي يدعمها Dokploy رسمياً](https://docs.dokploy.com/docs/core/installation?ref=arabroot.io) مع Debian وFedora وCentOS، وإذا كنت ما زلت تختار السيرفر فراجع دليل [كيف تختار خادماً افتراضياً VPS](https://arabroot.io/articles/%D9%83%D9%8A%D9%81-%D8%AA%D8%AE%D8%AA%D8%A7%D8%B1-%D8%AE%D8%A7%D8%AF%D9%85%D8%A7-%D8%A7%D9%81%D8%AA%D8%B1%D8%A7%D8%B6%D9%8A%D8%A7-vps/).
- الموارد Resources: يطلب التوثيق ذاكرة RAM لا تقل عن 2 جيجابايت ومساحة قرص لا تقل عن 30 جيجابايت، وهذا هو الحد الأدنى فقط، والسبب أن بناء التطبيقات على السيرفر نفسه يستهلك ذاكرة كبيرة، لذلك فالأفضل 4 جيجابايت إذا كنت سوف تبني أكثر من تطبيق.
- المنافذ Ports: `80/tcp` و`443/tcp` لـ Traefik، و`3000/tcp` للوحة Dokploy مؤقتاً حتى تربطها بنطاق، وإذا وجد سكربت التثبيت أياً منها مشغولاً فسوف يتوقف.
- صلاحيات `root` أو مستخدم له `sudo`، وابدأ بتأمين السيرفر كما في دليل [تأمين خادم VPS من أول دخول](https://arabroot.io/articles/%D8%AA%D8%A3%D9%85%D9%8A%D9%86-%D8%AE%D8%A7%D8%AF%D9%85-vps-%D9%85%D9%86-%D8%A3%D9%88%D9%84-%D8%AF%D8%AE%D9%88%D9%84/).
- نطاق تدير سجلات DNS Records الخاصة به، وفيه سجل `A` للوحة مثل `dokploy.example.com` يشير إلى العنوان العام Public IP للسيرفر `203.0.113.10`، وسجل wildcard مثل `*.example.com` يغنيك عن إضافة سجل لكل تطبيق جديد.

⚠️

يشغل Dokploy نسخته الخاصة من Traefik على المنفذين 80 و443، ويدير من خلالها نطاقات تطبيقاتك وشهاداتها، لذلك لا تقم بتثبيته على سيرفر يعمل عليه [Nginx Proxy Manager](https://arabroot.io/articles/nginx-proxy-manager-%D9%86%D8%B7%D8%A7%D9%82%D8%A7%D8%AA-%D9%88%D8%B4%D9%87%D8%A7%D8%AF%D8%A7%D8%AA-tls/) أو [Traefik مستقل](https://arabroot.io/articles/%D8%AA%D8%AB%D8%A8%D9%8A%D8%AA-traefik-reverse-proxy/) أو أي Reverse Proxy آخر، والسبب أن التثبيت إما أن يفشل وإما أن تتنازع الخدمتان على المنفذين، والأسلم أن تخصص لـ Dokploy سيرفراً جديداً.

## ماذا يفعل سكربت التثبيت؟

التثبيت الرسمي هو سكربت Bash واحد يعمل بصلاحيات `root` ويغير إعداد Docker على السيرفر، لذلك من المهم أن تعرف ما يفعله قبل أن تشغله، وفي [الإصدار Release v0.30.8](https://github.com/Dokploy/dokploy/releases/tag/v0.30.8?ref=arabroot.io) ينفذ السكربت الخطوات التالية بالترتيب:

1. يتحقق أنه يعمل على Linux بصلاحيات `root` وخارج أي Container، وأن المنافذ 80 و443 و3000 غير مشغولة.
2. إذا لم يجد Docker فسوف يثبت Docker Engine 28.5.0 عبر السكربت `get.docker.com`، ثم يجمد إصدار حزمه Hold بالأمر `apt-mark hold` حتى لا يرقيها `apt upgrade` دون علمك، أما إذا وجد Docker مثبتاً، مثلاً لأنك ثبته بنفسك وفق دليل [تثبيت Docker على Ubuntu](https://arabroot.io/articles/%D8%AA%D8%AB%D8%A8%D9%8A%D8%AA-docker-%D8%B9%D9%84%D9%89-ubuntu/)، فسوف يستخدمه كما هو.
3. يغادر أي Swarm قائم بالأمر `docker swarm leave --force`، ثم ينشئ Swarm جديداً بالأمر `docker swarm init --advertise-addr`، والعنوان المعلن Advertise Address هو أول عنوان خاص Private IP يجده على واجهات السيرفر الحقيقية، فإن لم يجد أخذ عنوانك العام من خدمات خارجية مثل `ifconfig.io`.
4. ينشئ شبكة Overlay اسمها `dokploy-network`، والمجلد `/etc/dokploy`، وسرين Docker Secrets بقيم عشوائية: كلمة مرور PostgreSQL، ومفتاح المصادقة Authentication للوحة.
5. ينشئ خدمة Swarm اسمها `dokploy-postgres` من ال Image `postgres:16` مع ال Volume `dokploy-postgres`، وفيها تحفظ كل إعدادات Dokploy.
6. ينشئ خدمة `dokploy` للوحة نفسها، وينشرها على المنفذ 3000، ويعطيها الوصول إلى `/var/run/docker.sock` وإلى `/etc/dokploy`.
7. يشغل ال Container `dokploy-traefik` من ال Image `traefik:v3.6.25` على المنفذين 80 و443 (ومعه `443/udp` لبروتوكول HTTP/3)، ويقرأ إعداده من `/etc/dokploy/traefik`.

والإصدارات الأقدم كانت تنشئ أيضاً خدمة Redis اسمها `dokploy-redis`، ولكن [التوثيق](https://docs.dokploy.com/docs/core/troubleshooting/instance?ref=arabroot.io) يذكر أنها خرجت من التثبيت منذ الإصدار v0.29.9، وبالتالي سوف تجد على السيرفر ثلاثة مكونات فقط: `dokploy` و`dokploy-postgres` و`dokploy-traefik`.

ولاحظ أن مفتاح المصادقة الذي يولده السكربت له دور آخر مهم، فمنذ [الإصدار v0.29.12](https://github.com/Dokploy/dokploy/releases/tag/v0.29.12?ref=arabroot.io) يشفر Dokploy متغيرات البيئة المحفوظة في قاعدة بياناته بخوارزمية AES-256-GCM، بمفتاح مشتق من هذا السر كما في [طلب الدمج الذي أضاف التشفير](https://github.com/Dokploy/dokploy/pull/4789?ref=arabroot.io)، وهذا يعني أن نسخة من قاعدة البيانات وحدها لا تكفي لاستعادة أسرار تطبيقاتك على سيرفر جديد، وسوف نعود لهذه النقطة في قسم النسخ الاحتياطي.

## تثبيت Dokploy

الطريقة الأسهل والتي تجدها في [التوثيق الرسمي](https://docs.dokploy.com/docs/core/installation?ref=arabroot.io) هي أمر واحد يمرر السكربت مباشرة من الإنترنت إلى `sh`، والمشكلة في هذه الطريقة أنك تشغل كوداً بصلاحيات root دون أن تراه، وأن الرابط `dokploy.com/install.sh` يثبت أحدث إصدار وقت التشغيل، فإذا شغلت نفس الأمر بعد شهر على سيرفر آخر فقد تحصل على إصدار مختلف عن الذي اختبرته. أما الطريقة الصحيحة فهي خطوتان: ننزل السكربت ونقرؤه ثم نشغله، ونستخدم نسخة السكربت المرفقة بصفحة الإصدار لأنها تثبت الإصدار v0.30.8 بالتحديد، وهذا ما [يوصي به التوثيق](https://docs.dokploy.com/docs/core/installation?ref=arabroot.io#install-specific-versions) لتثبيت إصدار معين، حيث ينبه إلى عدم استخدام المتغير `DOKPLOY_VERSION` مع السكربت العام لهذا الغرض:

```bash
curl -fsSL -o install.sh https://github.com/Dokploy/dokploy/releases/download/v0.30.8/install.sh
less install.sh
```

ابحث في الملف عن الأسطر التي وصفناها في القسم السابق: إصدار Docker، وأمر `docker swarm init`، وأوامر `docker service create`، ووسم Traefik، ثم قم بتشغيله:

```bash
sudo bash install.sh
```

📌

في 31 يناير 2021 بدأ طرف مجهول بتعديل سكربت Bash Uploader الذي توفره شركة Codecov، وهو سكربت يشغله آلاف المطورين بالأمر `curl` مباشرة داخل Pipelines ال CI، فأضاف إليه سطراً يرسل كل متغيرات البيئة، بما فيها التوكنات والمفاتيح، إلى سيرفر خارجي، وبقي التعديل قرابة شهرين حتى اكتشفه أحد العملاء في 1 أبريل 2021 عندما قارن الهاش Checksum للسكربت الذي نزله بالقيمة المنشورة فلم تتطابق، كما في [بيان Codecov الرسمي](https://about.codecov.io/security-update/?ref=arabroot.io). والدرس هنا أن السكربت الذي تمرره من الإنترنت إلى `sh` قد لا يكون نفس السكربت الذي قرأه غيرك، لذلك ننزله أولاً، ونقرؤه، ونثبت إصداره.

وإذا كان للسيرفر أكثر من عنوان، مثل عنوان عام وآخر على شبكة خاصة أو نفق VPN، فحدد بنفسك العنوان الذي يعلنه Swarm، ومرر المتغير في سطر الأمر نفسه وليس بالأمر `export`، والسبب أن `sudo` يمحو المتغيرات التي صدرتها، كما [ينبه التوثيق](https://docs.dokploy.com/docs/core/manual-installation?ref=arabroot.io):

```bash
sudo ADVERTISE_ADDR=203.0.113.10 bash install.sh
```

يستغرق التثبيت من دقيقتين إلى خمس دقائق، والمخرج في نهايته سوف يكون كما يلي:

```bash
Congratulations, Dokploy is installed!
Wait 15 seconds for the server to start
Please go to http://203.0.113.10:3000
```

الآن تحقق من أن الخدمات تعمل:

```bash
sudo docker service ls
sudo docker ps --format '{{.Names}}\t{{.Image}}\t{{.Status}}'
```

```bash
NAME               MODE         REPLICAS   IMAGE
dokploy            replicated   1/1        dokploy/dokploy:v0.30.8
dokploy-postgres   replicated   1/1        postgres:16
```

### التثبيت اليدوي Manual Installation على Swarm قائم

إذا كان على السيرفر Docker Swarm يشغل خدمات أخرى فلا تقم بتشغيل السكربت، والسبب أنه يغادر ال Swarm الحالي ويعيد إنشاءه فتتوقف كل خدماتك، وبدلاً من ذلك ستجد في [صفحة التثبيت اليدوي](https://docs.dokploy.com/docs/core/manual-installation?ref=arabroot.io) نفس الأوامر التي ينفذها السكربت دون خطوة `docker swarm init`، لتنفذها بنفسك على عقدة مدير Manager Node: الشبكة، ثم المجلد، ثم السران، ثم خدمتا PostgreSQL وDokploy، ثم Traefik. وتشرح الصفحة أيضاً متغيرات البيئة Environment Variables التي تخصص التثبيت، ومنها `DATABASE_URL` لتستخدم قاعدة PostgreSQL موجودة عندك، و`DOCKER_SWARM_INIT_ARGS` لتغير نطاق عناوين Swarm إذا تعارض مع شبكة مزودك.

## إنشاء حساب المدير فوراً

بعد انتهاء التثبيت مباشرة افتح `http://203.0.113.10:3000` في المتصفح، وسوف تظهر لك صفحة الإعداد الأول Initial Setup التي تطلب الاسم والبريد وكلمة المرور Password لحساب المدير Admin Account.

🛑

أول من يفتح هذه الصفحة يصبح مدير Dokploy، وبالتالي يملك تحكماً كاملاً في Docker على السيرفر. وقد يتساءل البعض: لماذا العجلة، والمنفذ 3000 يمكن إغلاقه بقاعدة في `ufw`؟ والإجابة أن `ufw` لا يحميه أصلاً، لأن Docker [يتجاوز قواعد جدار الحماية Firewall](https://docs.docker.com/engine/network/packet-filtering-firewalls/?ref=arabroot.io) للمنافذ التي ينشرها، فالمنفذ مفتوح للإنترنت في هذه اللحظة مهما كتبت في `ufw`، لذلك أنشئ الحساب قبل أي خطوة أخرى، وبكلمة مرور طويلة يولدها مدير كلمات المرور Password Manager.

بعد الدخول سوف تفتح الصفحة الرئيسية، وفي القائمة الجانبية Sidebar ستجد أقسام Projects وMonitoring وSchedules وTraefik File System وDocker، ثم الإعدادات Settings وفيها Web Server وProfile وRemote Servers وSSH Keys وGit وRegistry وS3 Destinations وغيرها، و[جولة الواجهة في التوثيق](https://docs.dokploy.com/docs/core/interface-overview?ref=arabroot.io) تشرح كل قسم منها.

## اربط اللوحة بنطاق وHTTPS ثم أغلق المنفذ 3000

الدخول عبر `http://IP:3000` مقبول في الدقائق الأولى فقط، والسبب أن كلمة مرورك تمر فيه دون تشفير Encryption، لذلك سوف نربط اللوحة بنطاقها الآن، وتأكد أولاً أن سجل `A` للنطاق `dokploy.example.com` يشير إلى `203.0.113.10`:

```bash
dig +short dokploy.example.com
```

ثم افتح Settings ثم Web Server، واملأ بطاقة Server Domain بالقيم التالية، واحفظ:

| الحقل                | القيمة                                                           |
| -------------------- | ---------------------------------------------------------------- |
| Domain               | dokploy.example.com                                              |
| Let's Encrypt Email  | admin@example.com (ضع بريدك الحقيقي، فإليه تصل تنبيهات الشهادات) |
| HTTPS                | مفعل                                                             |
| Certificate Provider | Let's Encrypt                                                    |

في الإعداد أعلاه لاحظ التالي:

- يكتب Dokploy إعداد Traefik للوحة، ويضع البريد نفسه في إعداد Let's Encrypt الذي سوف تستخدمه شهادات تطبيقاتك لاحقاً.
- يصدر Traefik الشهادة بعد [التحقق من ملكية النطاق عبر HTTP](https://letsencrypt.org/docs/challenge-types/?ref=arabroot.io#http-01-challenge) أي HTTP Challenge، لذلك يجب أن يكون المنفذ 80 مفتوحاً من الإنترنت.
- بعد دقيقة تقريباً افتح `https://dokploy.example.com` وسجل الدخول من جديد.

وإذا نجح الدخول عبر النطاق بشهادة صالحة، فقم بإغلاق المنفذ 3000 بإزالة نشره من خدمة `dokploy`، وهذا هو [الأمر الذي يوصي به التوثيق](https://docs.dokploy.com/docs/core/installation?ref=arabroot.io#disable-access-via-ipport-optional-but-recommended):

```bash
sudo docker service update --publish-rm "published=3000,target=3000,mode=host" dokploy
```

⚠️

لا تنفذ هذا الأمر قبل أن تتأكد من عمل النطاق عبر HTTPS، وإلا فقدت الوصول إلى اللوحة، وإذا احتجت إلى المنفذ مرة أخرى فأعده من الطرفية Terminal بالأمر `sudo docker service update --publish-add "published=3000,target=3000,mode=host" dokploy`.

## التحقق بخطوتين Two-Factor Authentication للمدير

لوحة Dokploy تتحكم في كل ما يعمل على خوادمك، فكلمة المرور وحدها لا تكفي لحمايتها، لذلك افتح Settings ثم Profile، وفي قسم 2FA اضغط زر التفعيل، ثم امسح رمز QR بتطبيق مصادقة Authenticator واكتب الرمز الذي يولده، وبعدها احفظ رموز الاسترداد Backup Codes في مكان آمن خارج السيرفر، فهي طريقك الوحيد للعودة إلى الحساب إذا فقدت هاتفك. وهذه الخطوات موجودة في [صفحة أمان الحساب](https://docs.dokploy.com/docs/core/account-security?ref=arabroot.io)، ومعها شرح مفاتيح المرور Passkeys التي تستطيع إضافتها إلى جانب 2FA، وهي لا تعمل إلا على نطاق لوحتك فلا ينفع معها التصيد Phishing.

وإذا أضفت أعضاء من فريقك من Settings ثم Users فاطلب منهم تفعيل 2FA أيضاً، وأعط كلاً منهم أقل الصلاحيات Permissions التي يحتاج إليها، والسبب أن أي حساب في اللوحة يستطيع نشر Container على السيرفر.

## إنشاء مشروع ونشر تطبيق من مستودع Git

ينظم Dokploy عملك في مشاريع Projects، ولكل مشروع بيئات Environments مثل `production` و`staging`، وفي كل بيئة خدماتك من تطبيقات وقواعد بيانات وملفات Compose. افتح Projects وأنشئ مشروعاً باسم مثل `website`، ثم افتحه واضغط Create Service واختر Application وقم بتسميته.

تفتح صفحة التطبيق على التبويب General، وفيه تختار مزود الكود Provider: GitHub أو GitLab أو Bitbucket أو Gitea بعد ربط حسابك، أو Git لأي مستودع بعنوانه، أو Docker لـ Image جاهزة، وللمستودع العام يكفي Git بهذه القيم:

| الحقل          | القيمة                                |
| -------------- | ------------------------------------- |
| Repository URL | https://github.com/example/my-app.git |
| Branch         | main                                  |
| Build Path     | /                                     |

أما المستودع الخاص فأنشئ له مفتاح SSH Key من Settings ثم SSH Keys، وأضف المفتاح العام Public Key إلى المستودع كمفتاح نشر Deploy Key للقراءة فقط، ثم اختره في الحقل Keys واستخدم عنوان SSH للمستودع.

بعد ذلك اختر طريقة البناء Build Type في القسم نفسه، والخيارات كلها في [صفحة أنواع البناء](https://docs.dokploy.com/docs/core/applications/build-type?ref=arabroot.io):

- **Nixpacks**: الخيار الافتراضي، حيث يكتشف لغة المشروع ويبنيه دون Dockerfile.
- **Railpack**: خليفة Nixpacks، وما زال جديداً.
- **Dockerfile**: يبني من ملف Dockerfile في المستودع، وإذا كان فريقك يكتب Dockerfile أصلاً فهذا هو الخيار الأوضح، لأن ما يعمل على جهازك سوف يعمل بنفس الطريقة على السيرفر.
- Heroku Buildpacks وPaketo Buildpacks، ونوع Static للمواقع الثابتة.

احفظ ثم اضغط Deploy، وفي التبويب Deployments سوف ترى سجل البناء Log لحظة بلحظة، ويحتفظ Dokploy بآخر 10 عمليات نشر Deployments فقط ويحذف ما قبلها. وفي التبويب نفسه عنوان Webhook تضيفه إلى المستودع، فينشر Dokploy التطبيق تلقائياً مع كل Push، ويسمي التوثيق هذه الميزة [Auto Deploy](https://docs.dokploy.com/docs/core/auto-deploy?ref=arabroot.io).

💡

يجب أن يستمع تطبيقك على `0.0.0.0` وليس على `127.0.0.1`، وإلا فسوف يصله Traefik بخطأ Bad Gateway، ويقع في هذا الخطأ كثير من تطبيقات Vite وAstro التي تستمع على `localhost` افتراضياً، كما [يوضح التوثيق](https://docs.dokploy.com/docs/core/troubleshooting/domains?ref=arabroot.io).

## نشر Stack بملف Docker Compose

إذا كان التطبيق مكوناً من عدة خدمات، مثل تطبيق وقاعدة بيانات وCache، فانشره بملف Compose كما هو، ففي المشروع اضغط Create Service ثم Compose، واختر في الحقل Compose Type النوع Docker Compose، ولاحظ أن النوع Stack ينشر الملف بالأمر `docker stack deploy` على Swarm ولا يدعم بعض خصائص Compose مثل `build`، كما تذكر [صفحة Docker Compose](https://docs.dokploy.com/docs/core/docker-compose?ref=arabroot.io).

تستطيع أن تجلب الملف من مستودع Git كما في التطبيقات، أو تكتبه مباشرة في محرر Editor اللوحة، والمثال التالي يستخدم التطبيق [whoami](https://github.com/traefik/whoami?ref=arabroot.io) الذي يعيد لك تفاصيل الطلب Request:

```yaml
services:
  whoami:
    image: traefik/whoami:v1.12.0
    restart: unless-stopped
    expose:
      - "80"
```

في الإعداد أعلاه لاحظ أن الملف لا ينشر أي منفذ على السيرفر، فـ Traefik يصل إلى الخدمة عبر شبكة Docker، لذلك لا تضف `ports` إلى خدمة لها نطاق، والسبب أنها تتعارض مع تطبيقات أخرى وتكشف الخدمة للإنترنت دون HTTPS. ثم اضغط Deploy.

وانتبه إلى أمرين عندما تكتب ملفاتك، الأول أن ال Bind Mounts بمسار مطلق مثل `/data:/var/lib/mysql` قد تمحى عند إعادة النشر، لذلك يوصي التوثيق بالمسار النسبي `../files/` أو بال Volumes المسماة Named Volumes، والثاني أن ميزة [Volume Backups](https://docs.dokploy.com/docs/core/volume-backups?ref=arabroot.io) لا تنسخ إلا ال Volumes المسماة، فاستخدمها لكل بيانات تحتاج إلى نسخها.

## أعط كل تطبيق نطاقه وشهادته

افتح التطبيق أو ملف Compose، ثم التبويب Domains، واضغط Add Domain، والحقول الأساسية كما يلي:

| الحقل                | القيمة                                                       |
| -------------------- | ------------------------------------------------------------ |
| Service Name         | whoami (في ملفات Compose فقط: الخدمة التي يوجه إليها النطاق) |
| Host                 | whoami.example.com                                           |
| Path                 | /                                                            |
| Container Port       | 80 (المنفذ الذي يستمع عليه التطبيق داخل ال Container)        |
| HTTPS                | مفعل                                                         |
| Certificate Provider | Let's Encrypt                                                |

أنشئ سجل DNS للنطاق قبل أن تضيفه في Dokploy، والسبب أنك إذا أضفته أولاً فسوف يفشل إصدار الشهادة، وقد تضطر إلى حذف النطاق وإنشائه من جديد. وهنا يختلف التطبيق عن ملف Compose كما [تشرح صفحة النطاقات](https://docs.dokploy.com/docs/core/domains?ref=arabroot.io)، فنطاقات التطبيقات يطبقها Traefik فوراً عبر ملفات إعداد يعيد تحميلها، أما نطاقات Compose فتتحول إلى Labels على الخدمة، وبالتالي عليك أن تعيد النشر Redeploy بعد كل تعديل عليها، والزر Preview Compose يعرض لك الملف النهائي بعد أن يضيف إليه Dokploy هذه ال Labels.

وإذا لم يكن لديك نطاق بعد، فإن Dokploy يولد لك نطاقاً مجانياً تحت `traefik.me` للتجربة، ولكنه يعمل عبر HTTP فقط.

## متغيرات البيئة

لكل تطبيق تبويب Environment تكتب فيه متغيراته بصيغة `KEY=value`، وفي [متغيرات Dokploy](https://docs.dokploy.com/docs/core/variables?ref=arabroot.io) أيضاً متغيرات مشتركة على مستوى المشروع أو البيئة تشير إليها من أي خدمة، وبهذا الشكل لا تكرر كلمة مرور قاعدة البيانات في خمسة أماكن:

```bash
DATABASE_URL=${{project.DATABASE_URL}}
API_KEY=${{environment.API_KEY}}
```

أما في ملفات Compose فيكتب Dokploy المتغيرات في ملف `.env` بجانب الملف ولا يمررها إلى ال Containers تلقائياً، لذلك عليك أن تربطها بنفسك، إما عبر `env_file` وإما بالإشارة إلى كل متغير كما في المثال التالي:

```yaml
services:
  app:
    image: ghcr.io/example/app:1.4.2
    environment:
      DATABASE_URL: ${DATABASE_URL}
```

ولا تضع الأسرار في المستودع ولا في ملف Compose نفسه، وإنما ضعها في تبويب Environment، أو في مدير أسرار Secrets Manager خارجي، فمنذ الإصدار v0.30.0 يدعم Dokploy من Settings ثم Secrets [مزودات أسرار خارجية](https://docs.dokploy.com/docs/core/secrets-providers?ref=arabroot.io) مثل HashiCorp Vault وInfisical وAWS Secrets Manager وDoppler، وتشير إلى السر بصيغة `${{vault.<provider-name>.<ref>}}`، فيجلب Dokploy القيمة وقت النشر ولا يحفظها في قاعدة بياناته.

## قواعد البيانات والنسخ الاحتياطي المجدول إلى S3

من Create Service ثم Database ينشئ Dokploy قواعد [PostgreSQL وMySQL وMariaDB وMongoDB وRedis](https://docs.dokploy.com/docs/core/databases?ref=arabroot.io)، وثبت إصدار ال Image عند الإنشاء مثل `postgres:17` ثم اضغط Deploy، وفي صفحة القاعدة سوف تجد بيانات الاتصال الداخلي Internal Credentials التي تستخدمها تطبيقاتك عبر شبكة Docker، ولا تنشر منفذ القاعدة على الإنترنت إلا إذا قيدته بجدار حماية، فتطبيقاتك لا تحتاج إليه أصلاً.

وقبل جدولة النسخ تحتاج إلى مكان خارج السيرفر تحفظها فيه، لذلك افتح Settings ثم S3 Destinations، وأضف وجهة Destination لأي مخزن كائنات Object Storage متوافق مع S3:

| الحقل                             | القيمة                                                   |
| --------------------------------- | -------------------------------------------------------- |
| Name                              | offsite-backups                                          |
| Provider                          | مزود المخزن، مثل AWS أو Cloudflare أو Backblaze أو MinIO |
| Access Key Id / Secret Access Key | مفتاحا مستخدم صلاحياته مقصورة على ال Bucket وحده         |
| Bucket                            | dokploy-backups                                          |
| Region                            | منطقة ال Bucket، مثل eu-central-1                        |
| Endpoint                          | https://s3.example.com (عنوان واجهة S3 لدى مزودك)        |

اختبر الاتصال واحفظ، وفي [صفحة AWS S3](https://docs.dokploy.com/docs/core/aws-s3?ref=arabroot.io) مثال لسياسة صلاحيات Policy تقتصر على القراءة والكتابة والحذف في Bucket واحد.

بعد ذلك افتح القاعدة ثم التبويب Backups، وأنشئ نسخة مجدولة كما [يشرح التوثيق](https://docs.dokploy.com/docs/core/databases/backups?ref=arabroot.io): اختر الوجهة، واكتب اسم القاعدة، وجدول التنفيذ بصيغة cron مثل `0 3 * * *` لنسخة يومية في الثالثة فجراً، وأضف بادئة Prefix مثل `postgres/website`، ثم اضغط Test لتتأكد أن نسخة وصلت فعلاً إلى ال Bucket. ومع PostgreSQL يستخدم Dokploy الأمر `pg_dump -Fc` مضغوطاً بـ `gzip`، وتستعيد النسخ من الزر Restore في التبويب نفسه.

🛑

النسخة الاحتياطية التي لم تستعدها ولو مرة واحدة ليست نسخة، لذلك أنشئ قاعدة تجريبية واستعد إليها آخر نسخة، وكرر ذلك دورياً، ويقترح [دليل تأمين بيئة الإنتاج Production Hardening في التوثيق](https://docs.dokploy.com/docs/core/guides/production-hardening?ref=arabroot.io) مرة كل ربع سنة. وفعل في المخزن تشفير الملفات المحفوظة من جهة المزود Server-Side Encryption واختصاراً SSE، والسبب أن Dokploy لا يشفر ملف النسخة نفسه، وأبق المخزن على حساب غير حساب السيرفر.

أما بيانات التطبيقات في ال Volumes، مثل الملفات التي يرفعها المستخدمون، فتنسخها من التبويب Volume Backups في صفحة التطبيق إلى الوجهة نفسها.

## متى تضيف سيرفراً بعيداً Remote Server أو عقداً Nodes في Swarm؟

يدعم Dokploy ثلاثة أنماط كما [تشرح صفحة خيارات النشر](https://docs.dokploy.com/docs/core/deployment-options?ref=arabroot.io)، الأول هو كل شيء على السيرفر الذي ثبت عليه Dokploy، وهذا ما قمنا به في هذا الدليل، ويوصي به التوثيق كنقطة بداية، فإذا ضاقت الموارد قمت بزيادتها لدى مزودك Vertical Scaling.

والثاني هو [السيرفرات البعيدة](https://docs.dokploy.com/docs/core/remote-servers?ref=arabroot.io)، أي سيرفرات مستقلة يديرها Dokploy عبر SSH ولكل منها Docker وTraefik خاصان به، حيث تنشئ مفتاحاً من Settings ثم SSH Keys، وتضيف مفتاحه العام إلى `~/.ssh/authorized_keys` على السيرفر الجديد، ثم تضيف السيرفر من Settings ثم Remote Servers بعنوانه واسم المستخدم والمفتاح، وتضغط Setup Server ليثبت عليه Dokploy ما يلزم، وبعدها تختار عند إنشاء أي خدمة السيرفر الذي تعمل عليه. وهذا النمط يعزل تطبيقات الإنتاج Production عن اللوحة، فلا تتنافس معها على الموارد.

والثالث هو [عقد Swarm](https://docs.dokploy.com/docs/core/cluster?ref=arabroot.io) أو ال Cluster، حيث تضم سيرفرات إضافية إلى ال Swarm الذي أنشأه السكربت كعمال Workers أو مدراء Managers، فتشغل نسخاً متعددة Replicas من التطبيق نفسه ويوزع Traefik الطلبات بينها، ويتطلب هذا النمط سيرفرات بنفس المعمارية Architecture، وسجل Images أي Docker Registry تدفع إليه ال Images لتسحبها العقد الأخرى، ويتطلب فتح [منافذ Swarm](https://docs.docker.com/engine/swarm/swarm-tutorial/?ref=arabroot.io#open-protocols-and-ports-between-the-hosts) بين السيرفرات: `2377/tcp` و`7946/tcp+udp` و`4789/udp`، والأفضل أن تمر عبر شبكة خاصة. ولا تلجأ إليه إلا إذا احتجت فعلاً إلى نسخ متعددة من التطبيق نفسه، والسبب أنه أعقد الأنماط تشغيلاً، وأن Dokploy لا ينظف مساحة التخزين على العقد الإضافية تلقائياً.

## التحقق من النجاح Verification

- خدمتا Dokploy وقاعدة بياناته تعملان، وTraefik يعمل:

```bash
sudo docker service ls --format '{{.Name}} {{.Replicas}} {{.Image}}'
sudo docker ps --filter name=dokploy-traefik --format '{{.Names}} {{.Status}}'
```

```bash
dokploy 1/1 dokploy/dokploy:v0.30.8
dokploy-postgres 1/1 postgres:16
dokploy-traefik Up 2 hours
```

- اللوحة تفتح عبر النطاق بشهادة موثوقة، فالأمر التالي ينجح دون الخيار `-k`، ويطبع رمز استجابة مثل `200` أو تحويلاً Redirect إلى صفحة الدخول:

```bash
curl -sS -o /dev/null -w '%{http_code}\n' https://dokploy.example.com
```

- المنفذ 3000 لا يستجيب من جهاز خارجي، فالأمر `curl -m 5 http://203.0.113.10:3000` يجب أن يفشل بانتهاء المهلة أو برفض الاتصال.
- التطبيق التجريبي `https://whoami.example.com` يفتح، ويعرض الترويسات Headers التي مررها Traefik، ومنها `X-Forwarded-Proto: https`.
- يطلب Dokploy رمز 2FA عند تسجيل الدخول، وبعد الضغط على Test تظهر نسخة قاعدة البيانات في ال Bucket.

## النسخ الاحتياطي والاستعادة Restore

نسخ قواعد بيانات تطبيقاتك لا يغني عن نسخ Dokploy نفسه، فإذا فقدت السيرفر فقدت معه تعريف كل مشروع وتطبيق ونطاق ومتغير، ويحفظ Dokploy حالته في ثلاثة أماكن: الأول قاعدة البيانات `dokploy-postgres`، والثاني المجلد `/etc/dokploy` وفيه إعداد Traefik وشهادات Let's Encrypt في `/etc/dokploy/traefik/dynamic/acme.json` ومفاتيح SSH وملفات Compose، والثالث سر المصادقة الذي اشتق منه مفتاح تشفير متغيرات البيئة كما ذكرنا في بداية المقال.

والطريقة الرسمية هي أن تفتح Settings ثم Web Server ثم قسم Backups، وتنشئ نسخة إلى وجهة S3 بجدول cron، وهذه النسخة تجمع قاعدة البيانات والمجلد `/etc/dokploy` في ملف zip واحد وترفعه إلى الوجهة، كما [تشرح صفحة النسخ الاحتياطي](https://docs.dokploy.com/docs/core/backups?ref=arabroot.io). ولاحظ الخيار Include encryption key في نفس النموذج، فهو مفعل افتراضياً ويضع مفتاح التشفير داخل النسخة حتى تعمل متغيرات البيئة بعد استعادتها على سيرفر جديد، لذلك أبقه مفعلاً، وتذكر أن كل من يحصل على ملف النسخة يستطيع فك تشفير هذه المتغيرات.

وإذا أردت نسخة يدوية إضافية من الطرفية، فسوف نستخرج قاعدة البيانات بصيغة `pg_dump` المخصصة، ثم نضغط Compress المجلد، ثم نحفظ مفتاح التشفير بنفس الطريقة التي يحسبه بها Dokploy من سر المصادقة:

```bash
sudo mkdir -p /var/backups/dokploy
cd /var/backups/dokploy
sudo docker exec $(sudo docker ps -qf name=dokploy-postgres) pg_dump -U dokploy -d dokploy -Fc | sudo tee dokploy-db-$(date +%F).dump > /dev/null
sudo tar czf dokploy-etc-$(date +%F).tar.gz -C / etc/dokploy
AUTH_SECRET=$(sudo docker exec $(sudo docker ps -q --filter label=com.docker.swarm.service.name=dokploy) cat /run/secrets/dokploy_auth_secret)
printf '%s' 'dokploy:db-encryption:v1' | openssl dgst -sha256 -hmac "$AUTH_SECRET" -r | cut -d' ' -f1 | sudo tee dokploy-encryption-$(date +%F).key > /dev/null
unset AUTH_SECRET
sudo chmod 600 dokploy-*
```

في الأوامر أعلاه لاحظ التالي:

- نحفظ النسخة في `/var/backups/dokploy` وليس في `/root`، والسبب أن المستخدم العادي لا يستطيع الدخول بالأمر `cd` إلى مجلد `/root` حتى لو أنشأه بـ `sudo`.
- يقرأ السطر الخامس السر من داخل Container اللوحة، لأن Docker Secrets لا تقرأ من سطر الأوامر مباشرة، والسطر السادس يحسب منه نفس المفتاح المشتق الذي يضعه Dokploy في نسخته الرسمية عند تفعيل Include encryption key.
- بعدها انقل الملفات الثلاثة إلى خارج السيرفر، وعاملها كما تعامل كلمات المرور، ففي ملف المجلد مفاتيح SSH الخاصة ومفاتيح الشهادات، وفي ملف المفتاح ما يفك تشفير كل متغيرات البيئة.

وللاستعادة على سيرفر جديد: ثبت عليه الإصدار نفسه من Dokploy بسكربت صفحة الإصدار، وأنشئ حساب مدير مؤقتاً، ثم أضف وجهة S3 نفسها، وافتح Settings ثم Web Server ثم Backups، واختر Restore Backup، وسوف يمحو Dokploy محتوى `/etc/dokploy` وقاعدة البيانات الحالية ويضع مكانهما محتوى النسخة، ثم تسجل الدخول بحسابك القديم. وإذا تغير عنوان السيرفر فحدثه من Web Server ثم Update IP، وحدث سجلات DNS لتشير إلى العنوان الجديد، ثم أعد تشغيل Traefik بالأمر `sudo docker restart dokploy-traefik`.

أما مع النسخة اليدوية فأوقف اللوحة، واستعد القاعدة والمجلد ومفتاح التشفير، ثم أعد تشغيلها:

```bash
sudo docker service scale dokploy=0
sudo cat dokploy-db-2026-10-01.dump | sudo docker exec -i $(sudo docker ps -qf name=dokploy-postgres) pg_restore -U dokploy -d dokploy --clean --if-exists --no-owner
sudo tar xzf dokploy-etc-2026-10-01.tar.gz -C /
sudo install -m 600 dokploy-encryption-2026-10-01.key /etc/dokploy/encryption.key
sudo docker service scale dokploy=1
sudo docker restart dokploy-traefik
```

الملف `/etc/dokploy/encryption.key` هو نفس المكان الذي تضع فيه الاستعادة الرسمية المفتاح، ومنه يقرأ Dokploy المفتاح القديم ليفك به المتغيرات التي شفرها السيرفر السابق، وبدونه سوف تظهر رسالة `Failed to decrypt a stored secret` عند فتح متغيرات أي تطبيق. وهذه الخطوات تعيد تعريف المشاريع والنطاقات، وبعدها تعيد نشر التطبيقات من اللوحة، أما بيانات التطبيقات نفسها فتستعيدها من نسخ قواعد البيانات ومن Volume Backups.

## التحديث Upgrade إلى إصدار أحدث

1. راجع [صفحة الإصدارات](https://github.com/Dokploy/dokploy/releases?ref=arabroot.io)، واقرأ ملاحظات كل إصدار بين إصدارك والإصدار الجديد، وخاصة ما يطلب خطوات يدوية.
2. أنشئ نسخة احتياطية من Dokploy كما في القسم السابق.
3. حدث من اللوحة: افتح Settings ثم Web Server واضغط Check for updates، فإذا ظهر إصدار جديد اضغط زر التحديث، ثم تأكد من رقم الإصدار في الحقل Version أسفل البطاقة.

أو حدث من الطرفية بسكربت صفحة الإصدار الذي تريده كما [يشرح التوثيق](https://docs.dokploy.com/docs/core/manual-installation?ref=arabroot.io#manual-upgrade)، حيث يحدث الوسيط `update` خدمة `dokploy` وحدها بالأمر `docker service update --image`، ولا يمس قاعدة البيانات ولا Traefik:

```bash
curl -fsSL -o install.sh https://github.com/Dokploy/dokploy/releases/download/v0.30.8/install.sh
sudo bash install.sh update
```

ولاحظ أن Dokploy لا يحدث ال Container `dokploy-traefik` مع اللوحة، وهذا مقصود حتى لا تنقطع تطبيقاتك، فإذا احتجت إلى إصدار أحدث من Traefik لإصلاح أمني فاتبع خطوات [تحديث Traefik يدوياً](https://docs.dokploy.com/docs/core/manual-installation?ref=arabroot.io#updating-traefik-manually)، وتحقق قبلها أن الإصدار الجديد لا يكسر إعداد Dokploy. ونفس الأمر مع Docker، فالسكربت جمد إصدار حزمه حتى لا يرقيها `apt upgrade`، وإذا قررت ترقيته فاقرأ ملاحظات إصدار Dokploy أولاً، ثم ألغ تجميد الإصدار Unhold بالأمر `sudo apt-mark unhold docker-ce docker-ce-cli docker-ce-rootless-extras`.

## مشكلات شائعة وحلولها Troubleshooting

### something is already running on port 80

إذا وجد السكربت خدمة على المنفذ 80 أو 443 أو 3000 فسوف يتوقف، لذلك اعرف الخدمة أولاً:

```bash
sudo ss -ltnp | grep -E ':(80|443|3000) '
```

غالباً هي Nginx أو Apache مثبت مع النظام، أو Container لـ Reverse Proxy آخر، فإذا كان السيرفر مخصصاً لـ Dokploy فأوقف الخدمة وعطلها، مثل `sudo systemctl disable --now nginx`، أما إذا كان عليه Reverse Proxy تعتمد عليه خدمات أخرى فثبت Dokploy على سيرفر آخر.

### Failed to initialize Docker Swarm

تظهر هذه الرسالة مع الخطأ `could not choose an IP address to advertise since this system has multiple addresses` أو مع `a system's IP address to use could not be uniquely identified`، والسبب أن للسيرفر أكثر من عنوان ولم يعرف Docker أيها يعلن للعقد الأخرى، والحل كما في [صفحة مشكلات الشبكة](https://docs.dokploy.com/docs/core/troubleshooting/networking?ref=arabroot.io) أن تحدد العنوان بنفسك، وإذا كنت سوف تضيف عقداً عبر شبكة خاصة فاختر عنوان تلك الشبكة:

```bash
ip -4 -brief address
sudo ADVERTISE_ADDR=203.0.113.10 bash install.sh
```

وإذا تعارض نطاق عناوين Swarm الافتراضي مع الشبكة الخاصة لدى مزودك، فمرر نطاقاً آخر عبر `DOCKER_SWARM_INIT_ARGS="--default-addr-pool 172.20.0.0/16 --default-addr-pool-mask-length 24"` في سطر الأمر نفسه.

### الشهادة لا تصدر ويعرض المتصفح شهادة TRAEFIK DEFAULT CERT

معنى ذلك أن Traefik لم يحصل على شهادة من Let's Encrypt فقدم شهادته الافتراضية، لذلك اقرأ سجله أولاً:

```bash
sudo docker logs --since 30m dokploy-traefik 2>&1 | grep -iE 'acme|certificate|error'
```

- تحقق أن سجل DNS يشير إلى السيرفر (`dig +short whoami.example.com`) قبل إضافة النطاق، وإذا كنت أضفته قبل السجل فاحذف النطاق وأنشئه من جديد، أو أعد تشغيل Traefik.
- تحقق أن المنفذ 80 مفتوح من الإنترنت في جدار الحماية لدى المزود، فالتحقق عبر HTTP يمر عبره.
- تحقق أنك وضعت بريداً حقيقياً في Let's Encrypt Email، فبعض النطاقات ترفضها Let's Encrypt كعنوان للاتصال.
- إذا كان النطاق يمر عبر Cloudflare وال Proxy مفعل، فالطلب لا يصل إلى سيرفرك مباشرة، وفي هذه الحالة راجع [إعداد Cloudflare في توثيق Dokploy](https://docs.dokploy.com/docs/core/domains/cloudflare?ref=arabroot.io).
- إذا كررت المحاولات الفاشلة كثيراً فقد تبلغ [حدود Let's Encrypt](https://letsencrypt.org/docs/rate-limits/?ref=arabroot.io)، فانتظر ساعة قبل المحاولة التالية.

### يتوقف البناء أو يتجمد السيرفر أثناءه

إذا انتهى البناء بالرمز `137` أو برسالة `Killed` أو `JavaScript heap out of memory` فقد نفدت الذاكرة، فبناء تطبيقات Node.js وأمثالها يستهلك ذاكرة كبيرة، وقد يوقف السيرفر كله ومعه تطبيقاتك، وفي [صفحة الانتقال إلى الإنتاج](https://docs.dokploy.com/docs/core/applications/going-production?ref=arabroot.io) حلان:

- قم بزيادة الذاكرة، أو أضف ملف Swap مؤقتاً يمنع توقف السيرفر، مع أنه يبطئ البناء.
- والأفضل أن تبني ال Image في Pipeline من نوع CI/CD مثل GitHub Actions أو Gitea Actions، وتدفعها إلى Registry، ثم تنشرها في Dokploy بالمزود Docker، أو أن تخصص لذلك سيرفر بناء Build Server من Remote Servers.

وراقب مساحة القرص أيضاً، فال Images وذاكرة البناء المؤقتة Build Cache تتراكم مع كل نشر، وتستطيع تفعيل التنظيف التلقائي Docker Cleanup من Settings ثم Web Server.

### Bad Gateway بعد نشر ناجح

هنا يصل Traefik إلى ال Container ولكنه لا يجد التطبيق على المنفذ المحدد، لذلك تحقق أن Container Port في النطاق يطابق المنفذ الذي يستمع عليه التطبيق فعلاً، وأن التطبيق يستمع على `0.0.0.0`، ثم اقرأ سجل التطبيق في التبويب Logs.

## الخلاصة

وصلنا لنهاية الموضوع، وأهم ما فيه:

- نزل سكربت التثبيت من صفحة الإصدار واقرأه قبل تشغيله، حتى تعرف ما يغيره في Docker وتثبت الإصدار الذي اختبرته.
- خصص لـ Dokploy سيرفراً لا يعمل عليه Reverse Proxy آخر، فهو يحتاج المنفذين 80 و443 لـ Traefik الخاص به.
- أنشئ حساب المدير فور التثبيت، ثم اربط اللوحة بنطاق وHTTPS، ثم أغلق المنفذ 3000 وفعل 2FA، والسبب أن `ufw` لا يحمي المنافذ التي ينشرها Docker.
- أنشئ سجل DNS قبل إضافة أي نطاق، وأعد نشر ملفات Compose بعد تعديل نطاقاتها.
- انسخ قواعد البيانات وDokploy نفسه إلى S3 خارج السيرفر، وأبق Include encryption key مفعلاً، واستعد النسخ دورياً حتى تتأكد أنها تعمل.

## سجل التحديثات (Changelog)

- أكتوبر 2026: كتابة الدليل.
- أكتوبر 2026: مراجعة تقنية على الإصدار v0.30.8 (ما زال أحدث إصدار مستقر): أضفنا تشفير متغيرات البيئة منذ الإصدار v0.29.12 وأثره على الاستعادة، وخيار Include encryption key، وحفظ مفتاح التشفير في النسخة اليدوية، ونقلنا مجلد النسخة اليدوية إلى `/var/backups/dokploy`، وأضفنا تقسيم الترخيص بين Apache 2.0 وDSAL، ومزودات الأسرار الخارجية، وحدثنا `whoami` إلى v1.12.0.