# OmniRoute Fly.io Deployment Guide (فارسی) 🌐 **Languages:** 🇺🇸 [English](../../../../ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇪🇹 [am](../../../am/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇸🇦 [ar](../../../ar/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇦🇿 [az](../../../az/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇧🇬 [bg](../../../bg/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇧🇩 [bn](../../../bn/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇧🇦 [bs](../../../bs/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇨🇿 [cs](../../../cs/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇩🇰 [da](../../../da/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇩🇪 [de](../../../de/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇬🇷 [el](../../../el/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇪🇸 [es](../../../es/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇪🇪 [et](../../../et/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇫🇮 [fi](../../../fi/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇫🇷 [fr](../../../fr/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇮🇪 [ga](../../../ga/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇮🇳 [gu](../../../gu/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇳🇬 [ha](../../../ha/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇮🇱 [he](../../../he/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇮🇳 [hi](../../../hi/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇭🇷 [hr](../../../hr/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇭🇺 [hu](../../../hu/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇦🇲 [hy](../../../hy/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇮🇩 [id](../../../id/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇳🇬 [ig](../../../ig/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇮🇹 [it](../../../it/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇯🇵 [ja](../../../ja/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇬🇪 [ka](../../../ka/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇰🇭 [km](../../../km/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇮🇳 [kn](../../../kn/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇰🇷 [ko](../../../ko/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇱🇹 [lt](../../../lt/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇱🇻 [lv](../../../lv/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇮🇳 [ml](../../../ml/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇮🇳 [mr](../../../mr/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇲🇾 [ms](../../../ms/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇲🇹 [mt](../../../mt/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇲🇲 [my](../../../my/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇳🇵 [ne](../../../ne/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇳🇱 [nl](../../../nl/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇳🇴 [no](../../../no/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇮🇳 [or](../../../or/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇮🇳 [pa](../../../pa/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇵🇭 [phi](../../../phi/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇵🇱 [pl](../../../pl/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇵🇹 [pt](../../../pt/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇧🇷 [pt-BR](../../../pt-BR/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇷🇴 [ro](../../../ro/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇷🇺 [ru](../../../ru/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇱🇰 [si](../../../si/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇸🇰 [sk](../../../sk/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇸🇮 [sl](../../../sl/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇷🇸 [sr](../../../sr/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇸🇪 [sv](../../../sv/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇰🇪 [sw](../../../sw/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇮🇳 [ta](../../../ta/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇮🇳 [te](../../../te/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇹🇭 [th](../../../th/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇹🇷 [tr](../../../tr/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇺🇦 [uk-UA](../../../uk-UA/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇵🇰 [ur](../../../ur/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇺🇿 [uz](../../../uz/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇻🇳 [vi](../../../vi/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇳🇬 [yo](../../../yo/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇨🇳 [zh-CN](../../../zh-CN/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇹🇼 [zh-TW](../../../zh-TW/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) --- این سند فرایند واقعی استقرار OmniRoute روی Fly.io را در سناریوهای زیر شرح میدهد: - استقرار پروژه فعلی روی Fly.io برای اولین بار - انتشار بهروزرسانیهای بعدی کد - پروژههای جدیدی که از همین گردشکار استقرار پیروی میکنند این راهنما بر اساس یک پیکربندی عملیاتی تأییدشده برای پروژه فعلی تهیه شده است. نام برنامه `omniroute` است. --- ## 1. اهداف استقرار - پلتفرم: Fly.io - روش استقرار: انتشار مستقیم محلی با `flyctl` - محیط اجرا: استفاده از `Dockerfile` و `fly.toml` موجود در مخزن - ماندگاری دادهها: Fly Volume متصلشده به `/data` - نشانی دسترسی: `https://omniroute.fly.dev/` --- ## 2. پیکربندیهای کلیدی پروژه فعلی تأیید شده است که فایل `fly.toml` در مخزن فعلی شامل موارد کلیدی زیر است: ```toml app = 'omniroute' primary_region = 'sin' [[mounts]] source = 'data' destination = '/data' [processes] app = 'node run-standalone.mjs' [http_service] internal_port = 20128 [env] TZ = "Asia/Shanghai" HOST = "0.0.0.0" HOSTNAME = "0.0.0.0" BIND = "0.0.0.0" ``` نکات: - `app = 'omniroute'` مشخص میکند که استقرار کدام برنامه Fly را هدف قرار میدهد - `destination = '/data'` دایرکتوری اتصال Volume پایدار را مشخص میکند - این پروژه باید `DATA_DIR=/data` را تنظیم کند؛ در غیر این صورت، پایگاه داده و کلیدها در دایرکتوری موقت کانتینر نوشته خواهند شد --- ## 3. پیشنیازها ### 3.1 نصب Fly CLI Windows PowerShell: ```powershell pwsh -Command "iwr https://fly.io/install.ps1 -useb | iex" ``` اگر اسکریپت نصب در محیط شما ناموفق بود، میتوانید فایل اجرایی `flyctl` را نیز بهصورت دستی دانلود کرده و آن را به `PATH` خود اضافه کنید. ### 3.2 ورود به حساب Fly ```powershell flyctl auth login ``` ### 3.3 بررسی وضعیت ورود ```powershell flyctl auth whoami flyctl version ``` --- ## 4. اولین استقرار پروژه فعلی ### 4.1 کلونکردن کد و ورود به دایرکتوری ```powershell git clone https://github.com/diegosouzapw/OmniRoute.git cd OmniRoute ``` ### 4.2 تأیید نام برنامه فایل `fly.toml` را باز کرده و خط زیر را بررسی کنید: ```toml app = 'omniroute' ``` اگر برنامه جدید خودتان را مستقر میکنید، میتوانید آن را به یک نام منحصربهفرد سراسری تغییر دهید، برای مثال: ```toml app = 'omniroute-yourname' ``` توجه: - مطمئن شوید برنامهای که در کنسول مشاهده میکنید با مقدار `app` در `fly.toml` مطابقت دارد - اگر قبلاً از نام متفاوتی مانند `oroute` استفاده کردهاید، آن را با `omniroute` اشتباه نگیرید ### 4.3 ایجاد برنامه اگر برنامه هنوز وجود ندارد: ```powershell flyctl apps create omniroute ``` اگر نام برنامه را تغییر دادهاید، `omniroute` را با نام انتخابی خود جایگزین کنید. ### 4.4 اولین استقرار ```powershell flyctl deploy ``` --- ## 5. پارامترهای الزامی برای این پروژه توصیه میشود حداقل پارامترهای زیر را در Fly.io پیکربندی کنید. ### 5.1 پارامترهای تأییدشده این پارامترها در استقرارهای واقعی برنامه فعلی `omniroute` استفاده شدهاند: - `API_KEY_SECRET` - `DATA_DIR` - `JWT_SECRET` - `MACHINE_ID_SALT` - `NEXT_PUBLIC_BASE_URL` - `OMNIROUTE_WS_BRIDGE_SECRET` (در محیط تولید الزامی است — برای احراز هویت پل WebSocket استفاده میشود) - `STORAGE_ENCRYPTION_KEY` ### 5.2 درباره `INITIAL_PASSWORD` پروژه فعلی `INITIAL_PASSWORD` را تنظیم نمیکند، زیرا این استقرار به آن نیاز ندارد. اگر تنظیم نشده باشد: - گزارش راهاندازی نشان خواهد داد که گذرواژه پیشفرض `CHANGEME` است - باید در اولین فرصت پس از استقرار، گذرواژه ورود را در تنظیمات سیستم تغییر دهید اگر میخواهید گذرواژه بکاند را بدون دخالت دستی مقداردهی اولیه کنید، میتوانید بعداً آن را اضافه کنید: - `INITIAL_PASSWORD` --- ## 6. پارامترهای توصیهشده ### 6.1 پیکربندی اسرار متغیرهای زیر برای Fly Secrets توصیه میشوند: | متغیر | توصیه | توضیحات | | ----------------------------- | ---------------------- | ----------------------------------------------------- | | `API_KEY_SECRET` | الزامی | برای تولید و اعتبارسنجی کلید API استفاده میشود | | `JWT_SECRET` | الزامی | برای نشستهای ورود و امضای JWT استفاده میشود | | `OMNIROUTE_WS_BRIDGE_SECRET` | در محیط عملیاتی الزامی | راز احراز هویت پل WebSocket | | `STORAGE_ENCRYPTION_KEY` | اکیداً توصیه میشود | اطلاعات حساس اتصال را در حالت ذخیرهشده رمزگذاری میکند | | `MACHINE_ID_SALT` | توصیه میشود | یک شناسه پایدار برای ماشین تولید میکند | | `INITIAL_PASSWORD` | اختیاری | در اولین استقرار، رمز عبور اولیه بکاند را تنظیم میکند | | اعتبارنامههای خصوصی OAuth/API | در صورت نیاز | پیکربندی احراز هویت پلتفرم خارجی | ### 6.2 مقادیر توصیهشده برای پروژه فعلی | متغیر | مقدار توصیهشده | | ---------------------- | --------------------------- | | `DATA_DIR` | `/data` | | `NEXT_PUBLIC_BASE_URL` | `https://omniroute.fly.dev` | نکات: - `DATA_DIR=/data` حیاتی است و باید با نقطه اتصال Fly Volume مطابقت داشته باشد - `NEXT_PUBLIC_BASE_URL` توسط زمانبند، فراخوانیهای بازگشتی فرانتاند و سناریوهای مشابه استفاده میشود ### 6.3 پیکربندی URL فراخوانی بازگشتی OAuth اگر لازم است ارائهدهندگان مبتنی بر OAuth (برای مثال Antigravity، Gemini و Cursor) را در استقرار Fly.io فعال کنید، از دو مورد زیر اطمینان حاصل کنید: 1. **`NEXT_PUBLIC_BASE_URL` را روی دامنه عمومی HTTPS خود تنظیم کنید** ```powershell flyctl secrets set NEXT_PUBLIC_BASE_URL=https://omniroute.fly.dev -a omniroute ``` اگر از دامنه سفارشی استفاده میکنید، آن را با دامنه مربوطه جایگزین کنید (برای مثال `https://omniroute.yourdomain.com`). 2. **URL فراخوانی بازگشتی را در کنسول ارائهدهنده پیکربندی کنید** همه ارائهدهندگان OAuth از مسیر فراخوانی بازگشتی واحد `/callback` استفاده میکنند — برای هر ارائهدهنده مسیر فراخوانی بازگشتی جداگانهای وجود ندارد: ```text /callback ``` برای مثال، فارغ از اینکه از Gemini، Antigravity، Cursor یا GitLab Duo استفاده میکنید: - `https://omniroute.fly.dev/callback` اگر `NEXT_PUBLIC_BASE_URL` با URL فراخوانی بازگشتی ثبتشده نزد ارائهدهنده مطابقت نداشته باشد، فرایند OAuth در مرحله تغییر مسیر مرورگر ناموفق خواهد بود. --- ## 7. تنظیم اسرار با یک فرمان فرمانهای زیر مقادیر تصادفی امن تولید میکنند و همه پارامترهای موردنیاز پروژه فعلی را در یک مرحله در Fly Secrets مینویسند. نکات: - شامل `INITIAL_PASSWORD` نمیشود - برای پروژه فعلی `omniroute` در نظر گرفته شده است ```powershell $apiKeySecret = [Convert]::ToHexString((1..32 | ForEach-Object { Get-Random -Minimum 0 -Maximum 256 })).ToLower() $jwtSecret = [Convert]::ToHexString((1..64 | ForEach-Object { Get-Random -Minimum 0 -Maximum 256 })).ToLower() $machineIdSalt = [Convert]::ToHexString((1..32 | ForEach-Object { Get-Random -Minimum 0 -Maximum 256 })).ToLower() $storageKey = [Convert]::ToHexString((1..32 | ForEach-Object { Get-Random -Minimum 0 -Maximum 256 })).ToLower() $wsBridgeSecret = [Convert]::ToHexString((1..32 | ForEach-Object { Get-Random -Minimum 0 -Maximum 256 })).ToLower() flyctl secrets set ` API_KEY_SECRET=$apiKeySecret ` JWT_SECRET=$jwtSecret ` MACHINE_ID_SALT=$machineIdSalt ` STORAGE_ENCRYPTION_KEY=$storageKey ` OMNIROUTE_WS_BRIDGE_SECRET=$wsBridgeSecret ` DATA_DIR=/data ` NEXT_PUBLIC_BASE_URL=https://omniroute.fly.dev ` -a omniroute ``` در Linux / macOS، میتوانید از `openssl rand -hex 32` نیز استفاده کنید: ```bash flyctl secrets set OMNIROUTE_WS_BRIDGE_SECRET=$(openssl rand -hex 32) -a omniroute ``` نکات: - `OMNIROUTE_WS_BRIDGE_SECRET` در محیط عملیاتی الزامی است؛ نبود آن فرایند دستدهی پل WebSocket را مختل میکند اگر میخواهید یک رمز عبور اولیه نیز تنظیم کنید: ```powershell flyctl secrets set INITIAL_PASSWORD=your-strong-password -a omniroute ``` --- ## ۸. مشاهده پارامترهای فعلی ```powershell flyctl secrets list -a omniroute ``` اگر صفحه `Secrets` در کنسول متغیرهای مورد انتظار را نشان نمیدهد، موارد زیر را بررسی کنید: - مطمئن شوید که برنامه `omniroute` را مشاهده میکنید - مطمئن شوید که مقدار `app` در `fly.toml` با برنامه موجود در کنسول مطابقت دارد --- ## ۹. بهروزرسانیها و انتشارهای بعدی پس از بهروزرسانی کد، فرایند انتشار ساده است: ```powershell git pull flyctl deploy ``` اگر فقط نیاز دارید پارامترها را بدون تغییر کد بهروزرسانی کنید: ```powershell flyctl secrets set KEY=value -a omniroute ``` Fly بهطور خودکار بهروزرسانی تدریجی ماشینها را انجام خواهد داد. ### ۹.۱ پیگیری بهروزرسانیهای مخزن بالادستی با حفظ `fly.toml` فورک شما اگر مخزن فعلی یک فورک است و میخواهید بهروزرسانیها را از مخزن بالادستی `https://github.com/diegosouzapw/OmniRoute` همگامسازی کنید، گردش کار زیر را دنبال کنید. ابتدا ریموتهای خود را بررسی کنید: ```powershell git remote -v ``` باید حداقل موارد زیر را مشاهده کنید: - `origin` که به فورک خودتان اشاره میکند - `upstream` که به مخزن اصلی اشاره میکند اگر `upstream` پیکربندی نشده است، آن را اضافه کنید: ```powershell git remote add upstream https://github.com/diegosouzapw/OmniRoute.git ``` پیش از همگامسازی با مخزن بالادستی، آخرین کامیتها و تگها را دریافت کنید: ```powershell git fetch upstream --tags ``` نسخه فعلی و تگهای مخزن بالادستی را بررسی کنید: ```powershell git describe --tags --always git show --no-patch --oneline v3.4.7 ``` > نکته: نسخه فعلی پروژه `v3.8.0` است. ارجاعهای `v3.4.7` در ادامه فقط بهعنوان نمونههای تاریخی حفظ شدهاند. برای انتشارهای واقعی، از `:latest` یا تگ نسخه فعلی (برای مثال `:v3.8.0`) استفاده کنید. اگر میخواهید آخرین نسخه شاخه `main` مخزن بالادستی را ادغام کنید و در عین حال `fly.toml` فورک خود را بهاجبار حفظ کنید، گردش کار زیر را دنبال کنید: ```powershell git merge upstream/main git checkout HEAD~1 -- fly.toml git add -- fly.toml git commit -m "chore(deploy): keep fork fly.toml" git push origin main ``` نکات: - `git merge upstream/main` آخرین کد را از مخزن اصلی همگامسازی میکند - `git checkout HEAD~1 -- fly.toml` فایل `fly.toml` متعلق به فورک شما را از وضعیت پیش از ادغام بازیابی میکند - اگر مخزن بالادستی `fly.toml` را تغییر نداده باشد، این مرحله هیچ تفاوتی ایجاد نخواهد کرد - اگر مخزن بالادستی `fly.toml` را تغییر داده باشد، این مرحله تضمین میکند که نام برنامه Fly، اتصال حجم، منطقه و سایر تنظیمات استقرار مختص فورک شما بازنویسی نشوند اگر میخواهید با یک تگ انتشار مشخص (برای مثال `v3.4.7`) همتراز شوید، ابتدا بررسی کنید که تگ از قبل در `upstream/main` وجود داشته باشد: ```powershell git merge-base --is-ancestor v3.4.7 upstream/main ``` بازگشت موفقیتآمیز به این معناست که `upstream/main` از قبل آن نسخه را در بر دارد؛ بنابراین میتوانید بهسادگی `upstream/main` را ادغام کنید. ### ۹.۲ توالی استاندارد انتشار پس از همگامسازی با مخزن بالادستی پس از همگامسازی با مخزن اصلی، ترتیب پیشنهادی زیر را برای انتشار دنبال کنید: 1. `git fetch upstream --tags` 2. `git merge upstream/main` 3. `fly.toml` فورک را بازیابی کنید 4. `git push origin main` 5. `flyctl deploy` 6. `flyctl status -a omniroute` 7. `flyctl logs --no-tail -a omniroute` این همان گردش کار واقعی است که هنگام ارتقای پروژه فعلی به `v3.4.7` استفاده شده است (این مثال به یک نسخه تاریخی اشاره دارد؛ نسخه واقعی فعلی `v3.8.0` است). --- ## 10. بررسیهای پس از استقرار ### 10.1 بررسی وضعیت برنامه ```powershell flyctl status -a omniroute ``` ### 10.2 مشاهده لاگهای راهاندازی ```powershell flyctl logs --no-tail -a omniroute ``` ### 10.3 بررسی دسترسیپذیری سایت ```powershell try { (Invoke-WebRequest -Uri "https://omniroute.fly.dev" -MaximumRedirection 5 -UseBasicParsing).StatusCode } catch { if ($_.Exception.Response) { $_.Exception.Response.StatusCode.value__ } else { throw } } ``` مقدار بازگشتی `200` نشان میدهد که سایت بهدرستی پاسخ میدهد. --- ## 11. نشانههای موفقیت پس از استقرار موفق، لاگها باید محتوایی مشابه زیر را نشان دهند: ```text [bootstrap] Secrets persisted to: /data/server.env [DB] SQLite database ready: /data/storage.sqlite ``` این دو مورد حیاتی هستند: - `/data/server.env` تأیید میکند که اسرار زمان اجرا در دیسک پایدار نوشته شدهاند - `/data/storage.sqlite` تأیید میکند که پایگاه داده در دیسک پایدار نوشته شده است اگر بهجای آن `/app/data/...` را مشاهده کردید، `DATA_DIR` بهاشتباه پیکربندی شده و باید فوراً اصلاح شود. --- ## 12. مشکلات رایج ### 12.1 صفحه `Secrets` خالی است این مشکل معمولاً یکی از دو دلیل زیر را دارد: - هنوز `flyctl secrets set` را اجرا نکردهاید - برنامه دیگری را مشاهده میکنید (برای مثال `oroute` بهجای `omniroute`) ### 12.2 دستور `flyctl deploy` خطای `app not found` را گزارش میکند ابتدا برنامه را ایجاد کنید: ```powershell flyctl apps create omniroute ``` ### 12.3 تجزیه `fly.toml` ناموفق است موارد زیر را بررسی کنید: - آیا در کامنتها نویسههای ناخوانا یا مخدوش وجود دارند - آیا نقلقولگذاری و تورفتگی TOML صحیح هستند ### 12.4 دادهها پایدار باقی نمیمانند هر دو مورد زیر را بررسی کنید: - فایل `fly.toml` شامل `destination = '/data'` باشد - مقدار `DATA_DIR` روی `/data` تنظیم شده باشد ### 12.5 آیا میتوان بدون `INITIAL_PASSWORD` اجرا کرد؟ بله، برنامه قابل اجرا است. در این حالت، از رمز عبور پیشفرض `CHANGEME` استفاده خواهد شد. توصیه میشود در محیط عملیاتی، رمز عبور بکاند را در اولین فرصت تغییر دهید. --- ## 13. استفاده مجدد برای پروژههای جدید اگر با پیروی از این سند، پروژه جدیدی را مستقر میکنید، فقط لازم است موارد زیر را تغییر دهید: 1. مقدار `app` را در `fly.toml` تغییر دهید 2. مقدار `NEXT_PUBLIC_BASE_URL` را تغییر دهید 3. مقدار `DATA_DIR=/data` را حفظ کنید 4. مقادیر `API_KEY_SECRET`، `JWT_SECRET`، `MACHINE_ID_SALT` و `STORAGE_ENCRYPTION_KEY` را دوباره تولید کنید 5. پس از اولین استقرار، بررسی کنید که لاگها در `/data` نوشته میشوند از کلیدهای پروژه قبلی دوباره استفاده نکنید. --- ## 14. چکلیست حداقلی انتشار برای پروژه فعلی دستورهایی که معمولاً برای انتشارهای بعدی استفاده میشوند عبارتاند از: ```powershell flyctl auth whoami flyctl status -a omniroute flyctl secrets list -a omniroute flyctl deploy flyctl logs --no-tail -a omniroute ``` برای یک انتشار معمولی، دستور اصلی صرفاً این است: ```powershell flyctl deploy ``` برای اولین استقرار در یک محیط جدید، مراحل اصلی عبارتاند از: 1. `flyctl auth login` 2. `flyctl apps create omniroute` 3. `flyctl secrets set ... -a omniroute` 4. `flyctl deploy` 5. `flyctl logs --no-tail -a omniroute`