پرش به مطلب اصلی

دیسک دائمی

🖼
تصویر: مدیریت دیسک پایدارplaceholder — تصویر را اینجا جایگزین کنید

دیسک دائمی یک 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