دیسک دائمی
دیسک دائمی یک volume ذخیرهسازی است که از ریستارت و ریدپلوی اپلیکیشن شما جان سالم به در میبرد.
فایلسیستم موقت (پیشفرض)
بهصورت پیشفرض، فایلسیستم هر container در ابرکلیک موقت است. این یعنی:
- هر بار که اپلیکیشن ریاستارت یا ریدپلوی شود، تمام فایلهای نوشتهشده روی دیسک حذف میشوند
- فقط فایلهایی که در زمان build داخل image بودهاند باقی میمانند
- هیچ دادهای بین نسلهای مختلف container به اشتراک گذاشته نمیشود
# پس از redeploy این فایل وجود نخواهد داشت
/tmp/uploaded-file.png ← حذف میشود
/app/generated-report.pdf ← حذف میشود
اگر اپلیکیشن شما فایلهایی مانند آپلودهای کاربر یا دیتابیس SQLite را روی دیسک ذخیره میکند، بدون دیسک دائمی این دادهها از دست خواهند رفت.
دیسک دائمی چیست؟
دیسک دائمی یک volume ذخیرهسازی است که به اپلیکیشن شما متصل میشود و مستقل از چرخه عمر container باقی میماند. دادههای نوشتهشده روی این volume:
- پس از ریستارت container محفوظ میمانند
- پس از ریدپلوی (deploy جدید) محفوظ میمانند
- تنها در صورت حذف صریح دیسک از بین میروند
موارد استفاده
| سناریو | مسیر پیشنهادی |
|---|---|
| آپلود فایل توسط کاربر | /uploads یا /data/uploads |
| دیتابیس SQLite | /var/lib/app یا /data |
| فایلهای تولیدشده (cache، گزارش) | /data |
| فایلهای پیکربندی پویا | /etc/app |
فعالسازی دیسک دائمی
از طریق داشبورد
۱. به داشبورد ابرکلیک بروید ۲. اپلیکیشن مورد نظر را انتخاب کنید ۳. به بخش تنظیمات اپ بروید ۴. روی دیسک دائمی کلیک کنید ۵. مسیر mount و اندازه دیسک را تنظیم کنید ۶. تغییرات را ذخیره و اپ را ریدپلوی کنید
از طریق CLI
# فعالسازی دیسک دائمی هنگام deploy
abrclick deploy --persistent-disk /data:5
# فرمت: --persistent-disk <mount-path>:<size-in-gb>
abrclick deploy --persistent-disk /uploads:10
abrclick deploy --persistent-disk /var/lib/app:2
از طریق فایل پیکربندی
# abrclick.yaml
persistent_disk:
mount_path: /data
size_gb: 5
مسیر Mount
مسیری که دیسک دائمی روی آن mount میشود باید یک مسیر مطلق باشد:
/data ← توصیهشده برای دادههای عمومی
/uploads ← برای آپلودهای کاربر
/var/lib/app ← برای دیتابیسهای محلی مانند SQLite
/storage ← گزینه دیگر
مسیر mount نباید با مسیرهای سیستمی مانند /etc یا /usr تداخل داشته باشد. مسیر /data سادهترین و امنترین گزینه است.
اندازه دیسک
اندازه دیسک دائمی بر اساس پلن شما محدود میشود:
| پلن | حداکثر اندازه |
|---|---|
| cloud (رایگان) | ۱ گیگابایت |
| rain | ۱۰ گیگابایت |
| snow | ۲۰ گیگابایت |
| thunder | ۵۰ گیگابایت |
| storm | ۵۰ گیگابایت |
| enterprise | سفارشی |
# مثال: تنظیم دیسک ۵ گیگابایتی روی مسیر /data
abrclick deploy --persistent-disk /data:5
دیسک دائمی و مقیاسپذیری افقی
دیسک دائمی به یک replica متصل میشود. اگر اپلیکیشن شما با HPA (افزایش خودکار replica) مقیاسبندی میشود، replica های اضافه به دیسک دائمی دسترسی ندارند و هر کدام فایلسیستم جداگانهای خواهند داشت.
این یعنی اگر اپلیکیشن شما به بیش از یک replica نیاز دارد، نباید از دیسک دائمی بهعنوان مسیر نوشتن مشترک استفاده کنید. در این حالت دادههای نوشتهشده توسط replica اول برای replica دوم قابل دسترس نیستند.
راهحل: Object Storage
برای ذخیره فایلهای آپلودشده توسط کاربر در محیطهای با چند replica، از Object Storage ابرکلیک استفاده کنید، نه دیسک دائمی.
Object Storage ابرکلیک یک API سازگار با S3 ارائه میدهد که:
- از همه replica ها بهطور همزمان قابل دسترس است
- مقیاسپذیر و با دوام بالا است
- برای آپلودهای کاربر ایدهآل است
// استفاده از S3 SDK برای Object Storage ابرکلیک
import { S3Client, PutObjectCommand } from "@aws-sdk/client-s3";
const s3 = new S3Client({
endpoint: process.env.OBJECT_STORAGE_ENDPOINT,
region: "ir-thr-1",
credentials: {
accessKeyId: process.env.OBJECT_STORAGE_KEY,
secretAccessKey: process.env.OBJECT_STORAGE_SECRET,
},
});
// آپلود فایل
await s3.send(new PutObjectCommand({
Bucket: process.env.OBJECT_STORAGE_BUCKET,
Key: `uploads/${filename}`,
Body: fileBuffer,
}));
مثالهای عملی
اپلیکیشن Node.js با آپلود فایل
// app.ts
import express from "express";
import multer from "multer";
import path from "path";
const app = express();
// فایلها روی دیسک دائمی ذخیره میشوند
const upload = multer({
dest: "/uploads",
});
app.post("/upload", upload.single("file"), (req, res) => {
res.json({ path: req.file?.path });
});
# deploy با دیسک دائمی برای آپلودها
abrclick deploy --persistent-disk /uploads:10
اپلیکیشن Python با SQLite
# app.py
import sqlite3
import os
# دیتابیس روی دیسک دائمی
DB_PATH = "/var/lib/app/database.db"
os.makedirs(os.path.dirname(DB_PATH), exist_ok=True)
conn = sqlite3.connect(DB_PATH)
# deploy با دیسک دائمی برای SQLite
abrclick deploy --persistent-disk /var/lib/app:2
مدیریت دیسک دائمی
مشاهده وضعیت
# مشاهده اطلاعات دیسک دائمی اپلیکیشن
abrclick app info <app-name>
حذف دیسک دائمی
# حذف دیسک دائمی (دادهها حذف میشوند)
abrclick app update <app-name> --remove-persistent-disk
حذف دیسک دائمی تمام دادههای ذخیرهشده روی آن را بهطور کامل و غیرقابل بازگشت پاک میکند. قبل از انجام این عملیات از دادههایتان backup بگیرید.
تغییر اندازه دیسک
افزایش اندازه دیسک دائمی از طریق داشبورد امکانپذیر است:
۱. به تنظیمات اپ → دیسک دائمی بروید ۲. اندازه جدید را وارد کنید (فقط افزایش اندازه مجاز است) ۳. تغییرات را ذخیره کنید
کاهش اندازه دیسک دائمی پشتیبانی نمیشود. در صورت نیاز به کاهش، باید دیسک را حذف و با اندازه جدید بازسازی کنید.
جمعبندی
| ویژگی | دیسک موقت | دیسک دائمی | Object Storage |
|---|---|---|---|
| ماندگاری پس از ریستارت | ✗ | ✓ | ✓ |
| ماندگاری پس از ریدپلوی | ✗ | ✓ | ✓ |
| دسترسی چند replica | — | ✗ | ✓ |
| مناسب برای SQLite | ✗ | ✓ | ✗ |
| مناسب برای آپلود چند replica | ✗ | ✗ | ✓ |