دیسک ماندگار
فایلسیستم سرویس موقت است: هر چیزی که برنامه بنویسد، با استقرار تازه یا ریاستارت پاک میشود. فایلهایی را که باید بمانند (آپلودهای کاربران، دیتابیس SQLite، فایلهای تنظیمات تولیدشده) روی دیسک ماندگار بنویسید.
برای دادههای ساختاریافته، افزونهٔ دیتابیس بهتر است: پشتیبان روزانه دارد و چند رپلیکا میتوانند همزمان به آن وصل شوند.
افزودن دیسک
زبانهٔ «ذخیرهسازی» سرویس را باز کنید
«افزودن مسیر» را بزنید
مسیر داخل کانتینر را بنویسید که برنامه فایلها را آنجا مینویسد، مثلاً /app/uploads یا /var/lib/data.
ذخیره کنید
سرویس با دیسک تازه دوباره مستقر میشود.
یک سرویس میتواند چند مسیر داشته باشد. اندازهٔ دیسک را تعیین نمیکنید؛ پایینتر توضیح داده شده.
اگر در آن مسیر از قبل فایلهایی داخل ایمیج هست (مثلاً فایلهای پیشفرض یک نرمافزار)، بار اول روی دیسک کپی میشوند. ولی از آن به بعد محتوای دیسک برنده است: اگر در نسخهٔ تازهٔ کد فایلی را در همان مسیر عوض کنید، تغییر دیده نمیشود. کد را روی دیسک نگذارید؛ فقط داده.
بزرگ شدن خودکار
دیسک با ۱ گیگابایت شروع میشود و هر وقت ۸۰٪ پر شد، خودکار و بدون توقف سرویس بزرگتر میشود، تا سقف فضای ذخیرهسازی پلن برای هر سرویس (این سقف بین همهٔ دیسکهای یک سرویس مشترک است). هزینه بر اساس فضای واقعاً استفادهشده حساب میشود، نه اندازهٔ دیسک.
دو پیام ممکن است ببینید:
- «این دیسک به سقف فضای پلن شما رسیده و دیگر بزرگ نمیشود»: فایلهای اضافی را پاک کنید یا پلن را ارتقا دهید. وقتی دیسک کاملاً پر شود، برنامه با خطای
No space left on deviceروبهرو میشود. - «بزرگشدن خودکار این دیسک موقتاً ممکن نیست و تیم پشتیبانی در حال رسیدگی است»: مشکل از سمت ماست و تیم خبر دارد. اگر دیسک نزدیک پر شدن است، تیکت بزنید.
دیسک کوچک نمیشود. اگر فایلها را پاک کنید، هزینه کم میشود ولی اندازهٔ دیسک همان میماند.
مدیریت فایلها
در زبانهٔ «ذخیرهسازی»، دکمهٔ «مدیریت فایلها» کنار هر دیسک یک مدیر فایل باز میکند. میتوانید فایل آپلود کنید، پوشه بسازید، نام عوض کنید، جابهجا و کپی کنید، حذف کنید و کل یک پوشه را zip دانلود کنید. حذف برگشتپذیر نیست.
از خط فرمان:
gerdoo service files api /app/uploads # فهرست فایلها
gerdoo service pull api /app/uploads -o ./backupپشتیبانگیری از دیسک
دیسک پشتیبان خودکار ندارد. خودتان نسخه بگیرید: با «دانلود zip»، با gerdoo service pull، یا با یک کار زمانبندیشده که فایلها را هر شب به یک فضای S3 بفرستد. اگر دیتابیسی را خودتان روی دیسک اجرا میکنید، از پوشهٔ داده zip نگیرید؛ از خود دیتابیس خروجی بگیرید. پشتیبانگیری
محدودیتها
- یک رپلیکا: هر دیسک فقط به یک نسخه از سرویس وصل میشود، پس سرویس دیسکدار نمیتواند بیشتر از یک رپلیکا داشته باشد (خطا: «سرویسی که فضای ذخیرهسازی دارد فقط با یک نسخه اجرا میشود»). اگر چند نسخه لازم دارید، فایلها را در یک فضای S3 (مثلاً افزونهٔ MinIO) بگذارید.
- استقرار کمی کندتر: در استقرار تازه، دیسک باید اول از نسخهٔ قدیمی جدا و به نسخهٔ تازه وصل شود، پس برای چند ثانیه سرویس در دسترس نیست.
- سرویس متوقف هم هزینهٔ دیسک دارد: با توقف سرویس، داده میماند و هزینهٔ فضا ادامه دارد.
- حذف سرویس یعنی حذف دیسک: با حذف سرویس، دیسکهایش برای همیشه پاک میشوند.
- پیشنمایشها دیسک جدا دارند: پیشنمایش Pull Request با دیسک خالی شروع میشود.
اگر به خطا خوردید
«مسیر اتصال فضای ذخیرهسازی تکراری است»
یک مسیر را دو بار نوشتهاید، یا همان مسیر از قبل دیسک دارد. هر مسیر فقط یک دیسک میگیرد.
برنامه میگوید Permission denied روی مسیر دیسک
برنامه با کاربری غیر از root اجرا میشود و صاحب پوشه نیست. در Dockerfile قبل از USER، پوشه را بسازید و مالکش را آن کاربر کنید (RUN mkdir -p /app/uploads && chown app:app /app/uploads)، یا مسیری را انتخاب کنید که برنامه اجازهٔ نوشتن در آن را دارد.
فایلهایم بعد از استقرار پاک شد
مسیری که برنامه در آن مینویسد با مسیر دیسک یکی نیست. مثلاً دیسک روی /app/uploads است ولی برنامه در /app/public/uploads مینویسد. مسیر را در زبانهٔ ذخیرهسازی با مسیر واقعی در کد مقایسه کنید.