یک کانتینر، بهجای یک کامیون وسیله
فرض کن میخواهی یک آشپزخانهی کامل را از یک شهر به شهر دیگر ببری. اگر وسیلهها را تکتک بار بزنی، یکی جا میماند، یکی میشکند و یکی در خانهی جدید جا نمیشود. ولی اگر همهچیز از قبل در یک کانتینر بستهبندی شده باشد، فقط کانتینر را میآوری و درش را باز میکنی.
Docker همین کار را با نرمافزار میکند. Dossier و همهی چیزهایی که لازم دارد (پایگاه داده، کتابخانهها، حتی مرورگری که PDF میسازد) در «کانتینر» بستهبندی شدهاند. تو فقط Docker را نصب میکنی و کانتینر را روشن میکنی. لازم نیست بدانی داخلش چه خبر است.
این درس از صفر شروع میکند. اگر تا حالا ترمینال باز نکردهای، نگران نباش؛ هر دستور را دقیقاً همانطور که نوشته شده تایپ یا کپی میکنی، و قبل از هر کدام میگوییم چه میکند و باید چه ببینی. حدود یک ساعت وقت کنار بگذار.
نقشهی کار
روشی که در این درس دنبال میکنیم، همان روشی است که خود پروژه برای اجرا روی کامپیوتر شخصی پیشنهاد میکند: Docker Compose. با آن، برنامه و پایگاه دادهاش با هم روشن و خاموش میشوند و بهروزرسانی هم ساده است.
- آماده شدنبررسی حافظه، فضای دیسک و نوع پردازنده
- ترمینالیاد گرفتن باز کردن ترمینال و وارد کردن دستور
- Dockerنصب Docker و بررسی اینکه کار میکند
- پوشه و تنظیماتگرفتن فایل Compose و ساختن فایل
.envبا رمزهای تصادفی - رمز عبورساختن هش رمز و گذاشتنش در
.env - روشن کردناجرای Dossier و باز کردنش در مرورگر
- نگهداریخاموش و روشن کردن، بهروزرسانی، پشتیبانگیری، عیبیابی
قبل از شروع: چه چیزهایی لازم داری؟
- حافظه (RAM): حدود ۲ گیگابایت حافظهی آزاد، علاوه بر چیزی که سیستمعامل و برنامههای دیگرت مصرف میکنند. خود Docker هم حافظه میخواهد؛ سایت Docker برای مک حداقل ۴ گیگابایت و برای ویندوز ۸ گیگابایت رم کل را ذکر میکند.
- فضای دیسک: حدود ۳ گیگابایت برای Dossier، بهاضافهی فضای خود Docker.
- سیستمعامل: macOS، ویندوز ۱۰ یا ۱۱ (با WSL، که پایینتر توضیح میدهیم)، یا لینوکس.
- پردازنده: Intel یا AMD بهترین حالت است. مکهای Apple Silicon (M1، M2 و بعدی) هم کار میکنند، با یک قدم اضافه.
- اینترنت: برای اولین بار حدود ۱٫۷ گیگابایت دانلود میشود. بعد از آن، برای کار روزمره با برنامه اینترنت لازم نیست، مگر برای سرویسهای آنلاینی که خودت وصل کنی.
نوع پردازندهی مک را اینطور پیدا کن: از منوی سیب بالا سمت چپ، About This Mac را بزن. اگر جلوی Chip چیزی مثل Apple M2 نوشته شده، مک تو Apple Silicon است. اگر جلوی Processor کلمهی Intel آمده، اینتل است.
یک یادآوری: Docker، گیتهاب و بعضی سرویسهای دیگر ممکن است در بعضی کشورها یا برای بعضی حسابها محدودیت داشته باشند. فقط طبق قوانین و شرایط خود سرویس از آنها استفاده کن.
ترمینال چیست و چطور بازش کنم؟
ترمینال پنجرهای است که بهجای کلیک کردن، به کامپیوتر دستور متنی میدهی. یک خط مینویسی، Enter میزنی، کامپیوتر انجامش میدهد و جواب را زیرش مینویسد. همین.
دستورهای این درس برای یک ترمینال «یونیکسی» نوشته شدهاند: ترمینال مک، ترمینال لینوکس، یا WSL در ویندوز. این را صفحههای راهنمای خود Dossier میگویند.
مک: کلیدهای Cmd + Space را بزن تا جستوجوی Spotlight باز شود، بنویس Terminal و Enter بزن.
لینوکس (مثلاً اوبونتو): معمولاً Ctrl + Alt + T ترمینال را باز میکند. یا در فهرست برنامهها دنبال Terminal بگرد.
ویندوز: دستورهای Dossier مستقیم در PowerShell اجرا نمیشوند. راهنمای پروژه میگوید روی ویندوز از WSL استفاده کن؛ یعنی یک لینوکس کوچک (معمولاً اوبونتو) که داخل خود ویندوز اجرا میشود. PowerShell را فقط یک بار، برای نصب WSL، لازم داری. قدم ۱ را ببین.
چند نکته که کار با ترمینال را راحت میکند:
- کپی و paste: بهتر است دستورها را کپی کنی تا اشتباه تایپی پیش نیاید. در ترمینال مک paste با
Cmd + Vاست؛ در ترمینال لینوکس معمولاًCtrl + Shift + V؛ در پنجرهی اوبونتو روی ویندوز معمولاً کلیک راست یاCtrl + Shift + V. - یک خط، یک Enter: در بلوکهای دستور این درس، هر خط یک دستور است. خطها را یکییکی وارد کن و منتظر بمان تا قبلی تمام شود.
- علامت
~: یعنی پوشهی خانگی کاربر تو. - متوقف کردن: اگر دستوری در حال اجرا بود و میخواستی متوقفش کنی،
Ctrl + Cبزن (در مک هم همین Ctrl است، نه Cmd).
قدمبهقدم
قدم ۱: نصب Docker
مک: از سایت رسمی Docker، Docker Desktop را دانلود کن. دقت کن نسخهی درست را برداری: یک نسخه برای Apple Silicon است و یک نسخه برای Intel. فایل Docker.dmg را باز کن، آیکون Docker را به پوشهی Applications بکش، بعد Docker را از Applications اجرا کن و قرارداد استفاده را بپذیر. وقتی آیکون نهنگ کوچک در نوار بالای صفحه ظاهر شد و دیگر در حال بارگذاری نبود، Docker آماده است.
اگر مکت Apple Silicon است، سایت Docker نصب Rosetta 2 را توصیه میکند (اختیاری است). این دستور نصبش میکند:
softwareupdate --install-rosetta
ویندوز: اول WSL را نصب کن. در منوی Start بنویس PowerShell، روی آن کلیک راست کن و Run as administrator را بزن. این دستور WSL را همراه با اوبونتو نصب میکند:
wsl --install
بعد کامپیوتر را ریاستارت کن. حالا در منوی Start برنامهی Ubuntu را باز کن. بار اول از تو یک نام کاربری و رمز برای همین لینوکس داخلی میخواهد (این رمز با رمز ویندوز و رمز Dossier فرق دارد؛ جایی یادداشتش کن). از این به بعد، همهی دستورهای این درس را در همین پنجرهی Ubuntu وارد کن، نه در PowerShell.
سپس Docker Desktop برای ویندوز را از سایت Docker دانلود و نصب کن. اگر نصاب پرسید، WSL 2 را انتخاب کن. بعد از نصب، Docker Desktop را باز کن و در Settings → Resources → WSL Integration مطمئن شو اتصال به Ubuntu روشن است، و Apply بزن. اگر Docker نصب نشد یا خطای مجازیسازی داد، ممکن است لازم باشد «مجازیسازی سختافزاری» در تنظیمات BIOS روشن باشد؛ سایت Docker این را جزو پیشنیازها آورده.
لینوکس: Docker Desktop لازم نیست؛ Docker Engine و افزونهی Compose کافی است. راهنمای سرور اوبونتوی Dossier از اسکریپت نصب رسمی Docker استفاده میکند. این سه دستور بهترتیب اسکریپت را دانلود میکنند، اجرایش میکنند و به کاربر تو اجازه میدهند بدون sudo با Docker کار کند:
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
sudo usermod -aG docker $USER
موقع اجرای sudo رمز کاربری لینوکست را میخواهد. بعد از دستور آخر یک بار از حساب کاربری خارج شو و دوباره وارد شو تا تغییر اعمال شود. یادت باشد عضویت در گروه docker تقریباً به اندازهی دسترسی مدیر سیستم قدرت دارد؛ فقط حساب خودت را اضافه کن.
قدم ۲: بررسی اینکه Docker کار میکند
یک ترمینال تازه باز کن (در ویندوز، پنجرهی Ubuntu) و این دو دستور را بزن. اولی نسخهی Docker را نشان میدهد و دومی نسخهی Compose را:
docker --version
docker compose version
اگر هر دو یک شمارهی نسخه چاپ کردند، عالی است. اگر نوشت command not found، یعنی Docker نصب نشده یا (در ویندوز) اتصال WSL روشن نیست. در مک و ویندوز مطمئن شو Docker Desktop باز است؛ تا وقتی باز نباشد، دستورهای Docker کار نمیکنند.
قدم ۳: ساختن پوشه و گرفتن فایل Compose
حالا خود Dossier. دستور اول یک پوشه به اسم dossier در پوشهی خانگیات میسازد و وارد آن میشود. دستور دوم فایل Compose را از گیتهاب پروژه دانلود میکند و با اسم compose.yml ذخیره میکند. این فایل به Docker میگوید برنامه و پایگاه داده را چطور اجرا کند.
mkdir ~/dossier && cd ~/dossier
curl -fsSL -o compose.yml https://raw.githubusercontent.com/AienTech/dossier/main/compose.production.yml
اگر هیچ پیامی ندیدی، یعنی درست انجام شد. در ترمینال، «بیخبری خوشخبری است».
مهم: از این به بعد همهی دستورها باید داخل همین پوشه اجرا شوند. اگر ترمینال را بستی و دوباره باز کردی، اول این دستور را بزن تا به پوشه برگردی:
cd ~/dossier
قدم ۴: ساختن فایل تنظیمات با رمزهای تصادفی
Dossier تنظیمات و رمزهایش را از فایلی به اسم .env در همین پوشه میخواند. نقطهی اول اسمش یعنی فایل «مخفی» است؛ برای همین ممکن است در Finder یا File Explorer آن را نبینی. طبیعی است.
این دو دستور اول یک رمز تصادفی برای پایگاه داده میسازند و در .env مینویسند، بعد دسترسی فایل را طوری تنظیم میکنند که فقط خودت بتوانی بخوانیاش. این رمز را لازم نیست بدانی یا به خاطر بسپاری؛ برنامه خودش از آن استفاده میکند.
echo "POSTGRES_PASSWORD=$(openssl rand -hex 24)" > .env
chmod 600 .env
حالا یک کلید مخفی برای برنامه میسازیم (DOSSIER_SECRET). این کلید جلسههای ورود را امضا میکند و کلیدهای API ذخیرهشده را رمزنگاری میکند. دقت کن اینجا علامت >> است (دو تا)، یعنی «به آخر فایل اضافه کن». اگر اشتباهی یکی بگذاری، کل فایل پاک و از نو نوشته میشود.
echo "DOSSIER_SECRET=$(openssl rand -base64 32)" >> .env
بعد منطقهی زمانیات را تنظیم کن. پشتیبانگیری شبانه ساعت ۳ بامداد به همین وقت انجام میشود و تاریخ نامهها هم با آن نوشته میشود. راهنمای پروژه Europe/Berlin را مثال زده؛ آن را با منطقهی خودت عوض کن، مثلاً Asia/Tehran یا America/Toronto:
echo "TZ=Europe/Berlin" >> .env
قدم ۵: فقط برای مک Apple Silicon
ایمیج Dossier فقط برای پردازندههای Intel و AMD ساخته شده. روی Apple Silicon باید به Compose بگویی آن را با شبیهسازی اجرا کند. این دستور یک فایل کوچک به اسم compose.override.yml کنار compose.yml میسازد. اجرا کمی کندتر میشود، ولی کار میکند. اگر مکت Intel است یا ویندوز و لینوکس داری، این قدم را رد کن.
printf 'services:\n app:\n platform: linux/amd64\n' > compose.override.yml
قدم ۶: ساختن هش رمز عبور
حالا رمزی را انتخاب میکنی که هر بار با آن وارد Dossier میشوی. ولی Dossier خود رمز را ذخیره نمیکند؛ فقط «هش» آن را نگه میدارد.
هش چیست؟ هش مثل اثر انگشت رمز است. از روی رمز میشود اثر انگشت را ساخت، ولی از روی اثر انگشت نمیشود رمز را بازسازی کرد. موقع ورود، Dossier از رمزی که تایپ میکنی دوباره اثر انگشت میسازد و با اثر ذخیرهشده مقایسه میکند. پس اگر کسی فایل .env را ببیند، رمز واقعی تو را نمیبیند.
این دستور برنامهی کوچک ساختن هش را اجرا میکند. روی ویندوز، لینوکس و مک Intel:
docker run --rm -it ghcr.io/aientech/dossier hash-password
روی مک Apple Silicon، بهجای دستور بالا این یکی را بزن:
docker run --platform linux/amd64 --rm -it ghcr.io/aientech/dossier hash-password
چه اتفاقی میافتد؟ بار اول، Docker ایمیج Dossier (حدود ۱٫۷ گیگابایت) را دانلود میکند؛ بسته به اینترنتت ممکن است چند دقیقه یا بیشتر طول بکشد. بعد از تو دو بار رمز را میخواهد. فقط همینجا رمز واقعیات را تایپ میکنی. ممکن است موقع تایپ هیچ حرفی روی صفحه نبینی؛ این برای امنیت است و طبیعی است. تایپ کن و Enter بزن.
در آخر یک خط طولانی چاپ میشود که با argon2id: شروع میشود. این هش توست. کل خط را با دقت انتخاب و کپی کن.
یک رمز خوب انتخاب کن: بلند، منحصربهفرد و جایی که در سرویس دیگری استفاده نکردهای. یک مدیر رمز عبور برای نگه داشتنش بهترین جاست.
قدم ۷: گذاشتن هش در فایل .env
حالا باید یک خط به .env اضافه کنی. برای این کار از ویرایشگر متنی سادهی nano استفاده میکنیم که داخل خود ترمینال باز میشود. این دستور فایل را باز میکند:
nano .env
سه یا چهار خطی را که در قدمهای قبل ساختی میبینی. با کلیدهای جهتنما به انتهای آخرین خط برو، Enter بزن تا خط تازهای باز شود، و بنویس DOSSIER_PASSWORD= و بلافاصله هش را بعدش paste کن. فاصله یا علامت نقلقول اضافه نگذار. خط نهایی شکلی مثل DOSSIER_PASSWORD=argon2id:… دارد.
برای ذخیره Ctrl + O و بعد Enter را بزن. برای خروج از nano، Ctrl + X. (در مک هم همین کلید Ctrl است.)
فایل کامل باید شبیه این باشد:
POSTGRES_PASSWORD=5c1f0e9a7b2d4c6e8f1a3b5d7c9e0f2a4b6d8c1e3f5a7b9c
DOSSIER_SECRET=ZXhhbXBsZS1vbmx5LW5vdC1hLXJlYWwtc2VjcmV0ISE=
TZ=Asia/Tehran
DOSSIER_PASSWORD=argon2id:...
مقدارهای بالا ساختگیاند و فقط شکل فایل را نشان میدهند. مقدارهای فایل تو باید با همان دستورها ساخته شده باشند. فایل .env واقعیات را برای هیچکس نفرست و جایی منتشر نکن.
قدم ۸: روشن کردن Dossier
دستور اول، Dossier و پایگاه دادهاش را در پسزمینه روشن میکند (-d یعنی «در پسزمینه»). دستور دوم گزارش (لاگ) برنامه را زنده نشان میدهد تا ببینی چه میگذرد:
docker compose up -d
docker compose logs -f app
Compose اول پایگاه داده را روشن میکند، صبر میکند تا آماده شود و بعد برنامه را. برنامه هم جدولهای پایگاه داده را آماده میکند و تمهای داخلی را بارگذاری میکند. وقتی در لاگ کلمهی Ready را دیدی، Ctrl + C بزن. این فقط نمایش لاگ را میبندد؛ خود Dossier روشن میماند.
قدم ۹: باز کردن در مرورگر و ورود
مرورگر کامپیوترت را باز کن (در ویندوز همان مرورگر معمولی ویندوز) و به این آدرس برو:
http://localhost:3000
صفحهی ورود Dossier باز میشود. رمزی را که در قدم ۶ انتخاب کردی وارد کن (خود رمز، نه هش). localhost یعنی «همین کامپیوتر»؛ این آدرس فقط از کامپیوتر خودت باز میشود و از بیرون قابل دسترسی نیست.
بعد از اولین ورود، برنامه میپرسد آیا اجازه میدهی یک «پینگ استفاده» بفرستد: یک شناسهی تصادفی و شمارهی نسخه، روزی یک بار. تا «بله» نگویی چیزی فرستاده نمیشود و انتخابش کاملاً با توست.
اگر خواستی مطمئن شوی برنامه و پایگاه داده سالماند، این آدرس را هم باز کن. اگر جواب {"status":"ok"} بود، همهچیز درست است:
http://localhost:3000/api/health
تبریک! Dossier نصب شد. انتخاب مدل هوش مصنوعی در Settings → AI provider و بقیهی تنظیمات را در درس بعد انجام میدهی.
نکتههای مخصوص ویندوز
- دستورها را در PowerShell نزن. دستورهایی مثل
echo "…$(openssl …)"وprintfبرای ترمینال یونیکسی نوشته شدهاند و در PowerShell درست کار نمیکنند. راهنمای Dossier برای ویندوز WSL را پیشنهاد میکند؛ پس همه را در پنجرهی Ubuntu بزن. - openssl: در خود ویندوز معمولاً نصب نیست، ولی در اوبونتوی داخل WSL معمولاً از قبل هست. این هم یکی از دلیلهای کار در WSL است. اگر در اوبونتو پیام
openssl: command not foundدیدی، این دو دستور اول فهرست بستهها را بهروز و بعد openssl را نصب میکنند (اینها از راهنمای Dossier نیستند، دستورهای استاندارد اوبونتو هستند):
sudo apt-get update
sudo apt-get install -y openssl
- Docker Desktop باید باز باشد. قبل از هر کار با Dossier، مطمئن شو Docker Desktop در ویندوز اجرا شده است.
- مرورگر: آدرس
http://localhost:3000را در مرورگر معمولی ویندوز باز کن؛ لازم نیست داخل اوبونتو مرورگر داشته باشی.
کارهای روزمره
همهی این دستورها را داخل پوشهی ~/dossier بزن (اول cd ~/dossier).
خاموش کردن Dossier وقتی با آن کاری نداری (دادهها سر جایشان میمانند):
docker compose stop
روشن کردن دوباره:
docker compose start
اگر خودت خاموشش نکرده باشی، Dossier بعد از ریاستارت کامپیوتر هم خودش دوباره روشن میشود (به شرطی که Docker هم روشن شود).
دیدن وضعیت کانتینرها؛ باید هم app و هم db را در حال اجرا ببینی:
docker compose ps
دیدن لاگ وقتی چیزی درست کار نمیکند. دستور اول لاگ را یک بار نشان میدهد و دومی زنده دنبالش میکند (با Ctrl + C میبندی):
docker compose logs app
docker compose logs -f app
تغییر یک تنظیم: .env را با nano ویرایش کن و بعد این دستور را بزن. ریاستارت ساده (stop و start) مقدارهای قدیمی را نگه میدارد؛ برای اعمال تغییر باید همین را بزنی:
docker compose up -d
بهروزرسانی
وقتی نسخهی تازهای بیاید، نوار کناری Dossier خبر میدهد و در Settings → About هم دیده میشود. ترتیب کار این است:
۱. اول پشتیبان بگیر: یک خروجی از داخل برنامه و یک «دامپ» از پایگاه داده (بخش بعد).
۲. اگر یادداشتهای نسخهی جدید گفت compose.yml عوض شده، فایل را دوباره بگیر:
curl -fsSL -o compose.yml https://raw.githubusercontent.com/AienTech/dossier/main/compose.production.yml
۳. نسخهی جدید را بگیر و روشن کن. دستور اول ایمیج تازه را دانلود میکند و دومی برنامه را با آن دوباره راه میاندازد:
docker compose pull
docker compose up -d
نسخهی جدید موقع روشن شدن پایگاه داده را بهروز میکند. برگشت به نسخهی قدیمیتر بعد از آن پشتیبانی نمیشود؛ اگر مشکلی پیش آمد، باید پشتیبانی را که قبلش گرفتهای بازگردانی کنی. برای همین مرحلهی ۱ را هیچوقت جا نینداز.
پشتیبانگیری و بازگردانی
دادههای تو فقط روی کامپیوتر خودت است. اگر دیسک خراب شود یا لپتاپ گم شود، فقط پشتیبان نجاتت میدهد. Dossier چهار ابزار دارد:
در Settings → Your data → Export همهچیز (پروفایل، تمها، تنظیمات، درخواستها با مدارک، چتها، یادداشتها و تاریخچه) در یک فایل JSON دانلود میشود. کلید API داخلش نیست، مگر خودت تیکش را بزنی. سادهترین و مهمترین پشتیبان همین است.
وارد کردن چنین فایلی همهی دادههای فعلی را با محتوای فایل جایگزین میکند. قبلش برنامه از وضعیت فعلی یک پشتیبان در پوشهی backups میگیرد.
بهطور پیشفرض روشن است: هر شب ساعت ۳ (به وقت TZ) همان خروجی در /data/backups داخل کانتینر ذخیره میشود و ۱۴ روز نگه داشته میشود (با DOSSIER_BACKUP_RETENTION_DAYS قابل تغییر است).
نسخهی کامل خود پایگاه دادهی PostgreSQL؛ قبل از هر بهروزرسانی لازم است.
پشتیبانهای شبانه داخل کانتینرند. این دستور آنها را به پوشهای به اسم backups کنار فایلهایت کپی میکند تا بتوانی جای امن دیگری هم نگهشان داری:
docker compose cp app:/data/backups ./backups
این دستور از پایگاه داده یک فایل دامپ به اسم dossier.dump در همین پوشه میسازد:
docker compose exec -T db pg_dump -U dossier -Fc dossier > dossier.dump
برای بازگردانی یک دامپ، برنامه را متوقف میکنی، دامپ را بارگذاری میکنی و برنامه را دوباره روشن میکنی. دقت کن این کار دادههای فعلی را با محتوای دامپ جایگزین میکند:
docker compose stop app
docker compose exec -T db pg_restore --clean --if-exists -U dossier -d dossier < dossier.dump
docker compose start app
یک نکتهی حیاتی: یک کپی از .env را هم کنار پشتیبانهایت نگه دار، در جایی امن. کلیدهای API ذخیرهشده بدون همان DOSSIER_SECRET خوانده نمیشوند.
حذف کامل: اگر روزی خواستی Dossier را کنار بگذاری، docker compose down کانتینرها را پاک میکند ولی دادهها میمانند. دستور زیر دادهها را هم برای همیشه پاک میکند؛ اول خروجی بگیر:
docker compose down -v
عیبیابی
قانون اول عیبیابی: لاگ را بخوان. docker compose logs app معمولاً دقیقاً میگوید چه چیزی کم است. اینها رایجترین مشکلها هستند:
| نشانه | چه کنم؟ |
|---|---|
دستورهای docker خطا میدهند که به Docker وصل نمیشوند، یا command not found | Docker Desktop را باز کن و صبر کن کامل بالا بیاید. در ویندوز اتصال WSL را در تنظیمات Docker Desktop بررسی کن. در لینوکس مطمئن شو بعد از usermod یک بار خارج و وارد شدهای. |
| پورت ۳۰۰۰ را برنامهی دیگری گرفته | در .env یک خط مثل DOSSIER_PORT=3001 اضافه کن، docker compose up -d را دوباره بزن و آدرس http://localhost:3001 را باز کن. |
| ساختن PDF شکست میخورد یا طول میکشد | معمولاً کمبود حافظه است؛ مرورگر داخلیای که PDF میسازد حافظه میخواهد. برنامه دستکم ۷۶۸ مگابایت لازم دارد (فایل Compose یک گیگابایت به آن میدهد). برنامههای سنگین دیگر را ببند. |
روی مک Apple Silicon خطایی دربارهی platform یا معماری amd64/arm64 | مطمئن شو فایل compose.override.yml از قدم ۵ در پوشه هست و docker compose up -d را دوباره بزن. برای hash-password هم از نسخهی دستور با --platform linux/amd64 استفاده کن. |
لاگ میگوید … is not set یا DOSSIER_SECRET is too short | متغیری که لاگ اسم برده در .env نیست یا اشتباه است. با nano درستش کن و docker compose up -d بزن. |
DOSSIER_PASSWORD must be a hash of your password | بهجای هش، خود رمز را در .env گذاشتهای. قدم ۶ و ۷ را دوباره انجام بده. |
لاگ از شکست migrations میگوید و کد P1001 دارد | پایگاه داده در دسترس نیست. با docker compose ps ببین کانتینر db روشن است یا نه. |
Too many attempts موقع ورود | بعد از پنج رمز اشتباه در یک دقیقه، ورود ۳۰ ثانیه متوقف میشود و هر بار طولانیتر، تا ۱۵ دقیقه. ریاستارت کمکی نمیکند؛ صبر کن. |
رمز را فراموش کردهای؟ نگران نباش، دادهها از دست نمیروند. قدم ۶ را با یک رمز جدید تکرار کن (روی Apple Silicon با نسخهی --platform). بعد با nano .env خط قدیمی DOSSIER_PASSWORD=… را کامل با هش جدید عوض کن، ذخیره کن و این را بزن:
docker compose up -d
با رمز جدید وارد شو. عوض کردن این خط، همهی جلسههای ورود قبلی را هم میبندد.
راههای دیگر نصب، و یک قانون امنیتی
راهنمای پروژه چند راه دیگر هم دارد. برای بیشتر خوانندههای این درس، همان Docker Compose بهترین است، ولی خوب است بدانی بقیه کی به کار میآیند:
| راه | چه وقت به کار میآید؟ |
|---|---|
Docker ساده (دو دستور docker run) | سریعترین راه برای یک امتحان کوتاه. برای استفادهی طولانی، Compose راحتتر خاموش، روشن و بهروز میشود. |
| Node.js بدون Docker | وقتی نمیخواهی یا نمیتوانی Docker داشته باشی. نصبش طولانیتر است و هر بهروزرسانی یعنی ساختن دوبارهی برنامه. |
| سرور اوبونتو با Caddy | وقتی میخواهی Dossier روی یک سرور، با دامنهی خودت و HTTPS، همیشه در دسترس باشد. دستکم ۲ هستهی پردازنده و ۲ گیگابایت حافظه میخواهد. |
| CapRover، Coolify یا Dokploy | فقط اگر از قبل یکی از این پلتفرمها را روی سرورت داری. خودشان حافظهی زیادی میگیرند؛ برای Coolify و Dokploy حدود ۴ گیگابایت امنتر است. |
قانون امنیتی: پورت ۳۰۰۰ Dossier هرگز نباید مستقیم از اینترنت در دسترس باشد. روی سرور، همیشه یک «پراکسی معکوس» با HTTPS (مثل Caddy) جلوی آن مینشیند و فقط آن به اینترنت باز است. فایل Compose بهطور پیشفرض برنامه را فقط روی خود کامپیوتر (127.0.0.1) باز میکند؛ این تنظیم را دست نزن.
ببینش ویدیو
در این ویدیو میبینی Docker Compose چطور چند کانتینر (مثلاً یک برنامه و پایگاه دادهاش) را با یک فایل و یک دستور بالا میآورد؛ همان کاری که docker compose up -d برای Dossier میکند. لحن ویدیو پرانرژی و کمی فنی است؛ لازم نیست دستورهای ویدیو را تکرار کنی.
نگاه یک اپلایکنندهی باتجربه
- نصب را در یک روز آرام انجام بده. نه شب قبل از ددلاین. یک ساعت بیعجله وقت بگذار.
- یک دفترچهی نصب داشته باش. بنویس پوشه کجاست، کدام منطقهی زمانی را گذاشتی، و رمز ورود را در مدیر رمز عبور نگه دار. شش ماه بعد خودت از خودت ممنون میشوی.
- پشتیبان را همان روز اول امتحان کن. یک خروجی بگیر و ببین فایلش دانلود شد. پشتیبانی که امتحان نشده، پشتیبان نیست.
- هر پیام خطا را کامل بخوان. لاگهای Dossier معمولاً میگویند دقیقاً کدام متغیر مشکل دارد و چطور درستش کنی.
اشتباههای رایج
- اجرای دستورها بیرون از پوشهی
~/dossier: Compose فایلهایش را پیدا نمیکند. اولcd ~/dossier. - یک
>بهجای>>: فایل.envاز نو نوشته میشود و خطهای قبلی پاک میشوند. - گذاشتن خود رمز بهجای هش در
DOSSIER_PASSWORD. - زدن دستورها در PowerShell بهجای پنجرهی Ubuntu در ویندوز.
- فراموش کردن فایل override روی مک Apple Silicon.
- بهروزرسانی بدون پشتیبان: برگشت به نسخهی قبلی ممکن نیست.
چیزهایی که باید یادت بماند
- Docker برنامه را در کانتینر اجرا میکند؛ فقط Docker را نصب میکنی و بقیه آماده است.
- روی ویندوز همهی دستورها در WSL (پنجرهی Ubuntu) اجرا میشوند.
.envسه چیز ضروری دارد:POSTGRES_PASSWORD،DOSSIER_SECRETوDOSSIER_PASSWORD(هش، نه خود رمز).docker compose up -dروشن میکند و تغییرات.envرا اعمال میکند؛ آدرس برنامهhttp://localhost:3000است.- قبل از هر بهروزرسانی پشتیبان بگیر، و یک کپی از
.envرا کنار پشتیبانها نگه دار. - پورت ۳۰۰۰ را هرگز مستقیم روی اینترنت باز نکن.
این مبحث کجای نقشه است؟
در درس قبل دیدی Dossier چیست و چه کارهایی میکند. در این درس آن را روی کامپیوترت نصب کردی و یاد گرفتی نگهش داری. درس بعد، «کار با Dossier: از پروفایل تا پیگیری»، اولین جلسهی کار واقعی را همراهت جلو میبرد: انتخاب مدل هوش مصنوعی، ساختن پروفایل، اولین درخواست و پیگیریاش.
تمرین
این تمرینها عملیاند. بعد از انجام هر کدام، جواب را باز کن تا مطمئن شوی درست پیش رفتهای.
تمرین ۱. Dossier را طبق قدمهای این درس نصب کن و وارد شو.
چطور بفهمم درست انجام دادم؟
آدرس http://localhost:3000 صفحهی ورود را نشان میدهد و با رمزت وارد میشوی. آدرس http://localhost:3000/api/health جواب {"status":"ok"} میدهد. دستور docker compose ps هر دو کانتینر app و db را در حال اجرا نشان میدهد.
تمرین ۲. Dossier را خاموش و دوباره روشن کن، بعد از داخل برنامه یک خروجی بگیر و یک دامپ پایگاه داده هم بساز.
چطور بفهمم درست انجام دادم؟
بعد از docker compose stop صفحهی برنامه باز نمیشود و بعد از docker compose start دوباره باز میشود و دادههایت سر جایشان است. فایل JSON خروجی در پوشهی دانلودهایت است. در پوشهی ~/dossier هم فایلی به اسم dossier.dump ساخته شده که حجمش صفر نیست.
تمرین ۳. دوستت میگوید: «بعد از نصب، لاگ نوشته DOSSIER_PASSWORD must be a hash of your password. من که رمز را در .env گذاشتم!» مشکل چیست و چه باید بکند؟
نمایش جواب
دقیقاً همین مشکل است: خود رمز را گذاشته، نه هش آن را. باید دستور hash-password را اجرا کند (روی Apple Silicon با --platform linux/amd64)، رمزش را دو بار تایپ کند، خطی را که با argon2id: شروع میشود کپی کند، با nano جای مقدار قبلی DOSSIER_PASSWORD بگذارد و docker compose up -d بزند.