پشتیبانگیری و ارتقاء
چه چیزی باید پشتیبانگیری شود، چگونه روی یک میزبان جدید بازیابی شود، چگونه ارتقاء انجام شود و چگونه یک سرور Mattermost یا یک جامعهٔ واحد به Antimatter منتقل شود.
چه چیزی باید پشتیبانگیری شود
| چه چیزی | با فایل compose سایت | با یک بایگانی نسخه | با بستهی .deb یا .rpm |
|---|---|---|---|
| پایگاه داده: پیامها، کاربران، جوامع، کانالها و، با فایل compose سایت، پیکربندی | حجم antimatter_postgres، از طریق pg_dump | پایگاه داده PostgreSQL شما | پایگاه داده PostgreSQL شما |
| فایلها، تصاویر و اپلیکیشنهای نصبشدهٔ بارگذاریشده | حجم antimatter_files (ذخیرهسازی S3) | FileSettings.Directory، بهطور پیشفرض ./data/ | /var/lib/antimatter |
| فایل پیکربندی | (در پایگاه داده) | config/config.json | /etc/antimatter/config/config.json |
| GIFها و برچسبها | حجم antimatter_gifs | دایرکتوری داده سرویس GIF | /var/lib/gifs-server |
| رمزها | .env (و compose.override.yaml) | فایل محیط شما | /etc/antimatter/antimatter.env, /etc/gifs-server |
| کلید رمزنگاری هوش مصنوعی، که کلیدهای اتصال به مدلها را رمزنگاری میکند | AM_AI_ENCRYPTION_KEY در .env (توصیهشده)، یا فایل ai-encryption.key در حجم antimatter_data | AM_AI_ENCRYPTION_KEY، یا data/ai-encryption.key | AM_AI_ENCRYPTION_KEY در antimatter.env، یا /var/lib/antimatter/data/ai-encryption.key |
بدون کلید رمزنگاری هوش مصنوعی، سرور بازیابیشده نمیتواند کلیدهای API اتصالهای مدلهایش را بخواند و باید هر کدام را دوباره وارد کنید. یک کپی از کلید را جدا از پشتیبانهای پایگاه داده نگه دارید تا یک پشتیبان دزدیدهشده هر دو را در بر نداشته باشد. کلید رمزنگاری را ببینید.
پایگاه داده و فایلها به هم وابستهاند: آنها را همزمان پشتیبانگیری کنید و کپیهای آنها را خارج از سرور نگه دارید. نام حجمها با نام پروژه compose شروع میشوند، antimatter (docker volume ls آنها را فهرست میکند).
پشتیبانگیری
از دایرکتوری compose.yaml. متوقف کردن Antimatter قبل از پشتیبانگیری یک کپی کاملاً سازگار میدهد؛ یک پشتیبانگیری در حالی که در حال اجراست معمولاً بدون مشکل است، اما فایلهایی که در حین پشتیبانگیری بارگذاری میشوند ممکن است در آن موجود نباشند.
stamp=$(date +%Y%m%d-%H%M%S)
mkdir -p backups
docker compose stop antimatter
# Database
docker compose exec -T postgres pg_dump -U antimatter -d antimatter -Fc \
> "backups/antimatter-db-$stamp.dump"
# File storage, GIF service and the data directory (the AI key file)
for v in files gifs data; do
docker run --rm -v "antimatter_$v:/data:ro" -v "$PWD/backups:/backup" \
alpine tar -czf "/backup/antimatter-$v-$stamp.tar.gz" -C /data .
done
docker compose start antimatter
# Secrets
cp .env "backups/env-$stamp"
اگر AM_AI_ENCRYPTION_KEY را تنظیم نکردهاید، فایل کلید سرور در حجم data است که حلقهی بالا آن را با فایلها ذخیره میکند. بهتر است محتوای آن را در .env قرار دهید، همانطور که در کلید رمزنگاری توضیح داده شده، و یک کپی از آن را جدا از پشتیبانهای پایگاه داده نگه دارید.
برای پشتیبانگیری روزانه از cron استفاده کنید و دایرکتوری backups/ را به یک ماشین دیگر کپی کنید. کپیهای .env را به همان اندازه که سرور امن است نگه دارید: آنها رمزهای عبور آن را در بر دارند.
برای کپی فایلهای بارگذاریشده شیء به شیء (مثلاً به یک ذخیرهسازی S3 دیگر)، از ابزار خط فرمان AWS سرویس bucket استفاده کنید:
docker compose run --rm -v "$PWD/backups/files:/backup" bucket \
"aws --endpoint-url http://files:9000 s3 sync s3://antimatter /backup"
با یک بایگانی انتشار، پایگاه داده را با pg_dump -Fc و دایرکتوریهای data/ و config/ را با ابزارهای معمول خود پشتیبان بگیرید (data/ فایل کلید هوش مصنوعی را نگه میدارد). با بستهها، پایگاه داده را به همان روش پشتیبان بگیرید، بههمراه /etc/antimatter، /var/lib/antimatter، /etc/gifs-server و /var/lib/gifs-server.
بازیابی روی یک میزبان جدید
compose.yaml، .env ذخیرهشده و پشتیبانها را در یک دایرکتوری جدید قرار دهید، سپس:
stamp=20261016-030000 # the backup to restore
docker compose create # creates the volumes, starts nothing
docker compose up -d postgres
docker compose exec -T postgres pg_restore -U antimatter -d antimatter --no-owner \
< "backups/antimatter-db-$stamp.dump"
for v in files gifs data; do
docker run --rm -v "antimatter_$v:/data" -v "$PWD/backups:/backup" \
alpine tar -xzf "/backup/antimatter-$v-$stamp.tar.gz" -C /data
done
docker compose up -d
از همان .env استفاده کنید: ذخیرهسازی و پایگاه داده باید همان رمزهای عبوری را که داشتند حفظ کنند، و اتصالهای مدل به همان کلید رمزنگاری هوش مصنوعی نیاز دارند. اگر میزبان جدید آدرس دیگری دارد، SITE_URL (و DOMAIN) را بهروزرسانی کنید.
از زمان به زمان پشتیبانهای خود را با بازیابی آنها روی یک ماشین دیگر آزمایش کنید.
ارتقاء
data نداشتند: فایل کلید هوش مصنوعی در داخل کانتینر بود. قبل از استفاده از compose.yaml جدید، و اگر .env فاقد AM_AI_ENCRYPTION_KEY است، کلیدی که سرور ساخته را ذخیره کنید: echo "AM_AI_ENCRYPTION_KEY=$(docker compose exec -T antimatter cat /antimatter/data/ai-encryption.key)" >> .env. اگر دستور فایلی پیدا نکند، هنوز هیچ اتصال مدلی کلیدی ذخیره نکرده است.- یک پشتیبانگیری انجام دهید.
- برچسب تصویر را در
.env(ANTIMATTER_IMAGE) تغییر دهید، اگر یکی را ثابت کردهاید، همانطور که توصیه میشود. - کش کنید و مجدداً راهاندازی کنید:
docker compose pull docker compose up -d docker compose logs -f antimatter
در هنگام راهاندازی، سرور طرح پایگاه داده را ارتقا میدهد (این فرآیند را در گزارشها دنبال کنید؛ ممکن است در سرورهای بزرگ چند دقیقه طول بکشد) و نسخههای جدیدتر از برنامههای همراه با تصویر را نصب میکند. در صورت استفاده از بایگانی انتشار: سرور را متوقف کنید، همهچیز را بهجز config/، data/، logs/، plugins/ و client/plugins/ با محتوای بایگانی جدید جایگزین کنید و دوباره راهاندازی کنید. در صورت استفاده از بسته .deb یا .rpm، بسته جدید را همانطور که در ارتقای بسته توضیح داده شده نصب کنید.
antimatter-next به antimatter نیز صدق میکند.نسخهها
سرور Antimatter نسخه خط Mattermost که بر اساس آن ساخته شده را گزارش میدهد (در حال حاضر 12.0.0). انتشارهای موجود در GitHub، همراه با بایگانیها و بستههایشان، شمارههای نسخهی مستقلی دارند که در دوره بتا در سری 0.9.0 قرار میگیرند: antimatter version آن را بهعنوان شمارهٔ بیلد نمایش میدهد. تصاویر از شاخههای main بازسازی میشوند: antimatter-next هر شب (با برچسبهای nightly-<YYYYMMDD>) و هر دو تصویر با هر تغییر (با برچسبهای sha-<commit>). یکی از این برچسبها را ثابت (pin) کنید، بهطور آگاهانه ارتقا دهید و برچسب قبلی را یادداشت کنید تا بدانید کدام پشتیبان با آن همخوانی دارد.
نسخههای اصلی PostgreSQL
فایل compose از postgres:17-alpine استفاده میکند. Antimatter به PostgreSQL 15 یا جدیدتر نیاز دارد. یک نسخه اصلی جدید از PostgreSQL نمیتواند از دایرکتوری داده نسخه قبلی بخواند: برای مهاجرت به نسخه جدید، از پایگاه داده dump بگیرید، نسخه جدید را روی یک volume تازه راهاندازی کنید و dump را در آن بازیابی کنید.
ارتقا به 0.9.0
راهاندازی اولیه نسخه 0.9.0 (یا تصویری که از 17 اکتبر 2026 به بعد از آن ساخته شده) چند تغییر یکباره در دادهها ایجاد میکند. هر کدام یکبار اجرا میشود و در پایگاه داده ثبت میگردد. این تغییرات آنچه را که روی پیشفرض قدیمی باقی مانده بود به پیشفرض جدید منتقل میکنند و آنچه را که یک مدیر انتخاب کرده دستنخورده میگذارند. این فرآیندها را در گزارشها دنبال کنید.
AM_TEAMSETTINGS_DEFAULTCOMMUNITYKIND=workplace. در زمان ارتقا، نوع هر جامعه بر اساس مقدار این تنظیم در آن لحظه تعیین میشود و مکالمات در کانالهای جوامع از نوع Guild بهطور پیشفرض غیرفعال هستند. برای اطلاعات بیشتر به Guild یا فضای کاری مراجعه کنید.| چه چیزی | تغییر |
|---|---|
| انواع تیم | هر جامعه دارای یک نوع است، Guild یا فضای کاری: مقدار نوع جوامع جدید (TeamSettings.DefaultCommunityKind) در زمان اولین شروع. نوعی که از قبل تنظیم شده است، حفظ میشود. مدیران جامعه میتوانند نوع جامعه خود را پس از آن در تنظیمات تیم › عمومی تغییر دهند. |
| چه کسی کانالها را بایگانی میکند | اعضای کانال دیگر کانالهایی که در آنها هستند را بایگانی نمیکنند؛ این کار توسط مدیران جامعه انجام میشود. در یک فضای کاری، مدیران کانال (هر کسی که آن را ایجاد کرده و کسانی که او به عنوان مدیر تعیین کرده است) نیز میتوانند آن را بایگانی کنند. این تغییر، نقشهای طرح سیستم را تغییر میدهد؛ طرحهای مجوزی که یک مدیر سیستم برای برخی جوامع ایجاد کرده است، بدون تغییر باقی میمانند. |
| نقش «مراقبان» در پیشتنظیمهای چیدمان | نقش مراقبان که جوامع از یک پیشتنظیم چیدمان دریافت کردهاند، اکنون حذف افراد را دریافت میکند که برای بیرون دادن و حذف افراد مورد نیاز است. تنها نقشهایی که دقیقاً همانطور که پیشتنظیم آنها را ایجاد کرده تغییر میکنند؛ نقشهایی که شخصی آنها را ویرایش کرده است دستنخورده باقی میمانند. |
| نقشهایی با مدیر | یک نقش جامعه که کلید مدیر آن روشن است، اکنون همه چیزهایی که مدیران جامعه میتوانند انجام دهند را در بر میگیرد، همانطور که کلید نشان میدهد، نه فقط تنظیمات جامعه. |
| محدودیت عضو | حداکثر تعداد اعضای هر جامعه (TeamSettings.MaxUsersPerTeam) از ۵۰، مقدار پیشفرض قدیمی، به ۰ (بدون محدودیت) تغییر میکند. هر مقدار دیگر حفظ میشود، و همچنین محدودیتی که با AM_TEAMSETTINGS_MAXUSERSPERTEAM تنظیم شده است. |
| اتصالات مدل | مدیران سیستم مدیریت اتصالات مدل را دریافت میکنند، و مدیران جامعه (و نقشهایی با مدیر) مدیریت اتصالات مدل جامعه خود را. خدمات هوش مصنوعی اپلیکیشن Agents به اتصالات مدل در سطح سرور تبدیل میشوند، جزئیات را در ادامه ببینید. |
| Town Square به General تبدیل میشود | کانال پیشفرض هر جامعه از town-square (Town Square) به general (General) تغییر نام میدهد. شناسه، اعضا، پیامها و تنظیمات آن حفظ میشوند، به همراه نام نمایشی که مدیران انتخاب کردهاند. پیوندهای قدیمی و جستجوهای بر اساس town-square همچنان به آن منتهی میشوند. جامعهای که از قبل کانالی به نام general دارد، حتی اگر بایگانی شده باشد، town-square خود را به عنوان کانال پیشفرض حفظ میکند، و همین برای جامعهای که town-square آن بایگانی شده نیز صدق میکند: این موارد در گزارشها نام برده میشوند و مدیران آنها میتوانند نام کانالها را تغییر دهند. |
| برگزیدهها | دسته «برگزیدهها» در نوار کناری همه کاربران به Favourites تغییر نام مییابد، همانطور که در رابط کاربری نمایش داده میشود. دستههایی که افراد با همان نام ایجاد کردهاند دستنخورده باقی میمانند. |
خدمات اپلیکیشن Agents
ارتقا، هر سرویس هوش مصنوعی از برنامه Agents را به یک اتصال مدل در سطح سرور کپی میکند که با همه جوامع به اشتراک گذاشته شده و توسط همه به جز مهمانها قابل استفاده است (برای اجازه دادن به آنها، مهمانها نیز را فعال کنید). کلیدها در حین انتقال رمزگذاری میشوند، بنابراین سرور به کلید رمزگذاری هوش مصنوعی خود نیاز دارد: در یک خوشهای که فایلهای آن در S3 قرار دارند، ابتدا AM_AI_ENCRYPTION_KEY را تنظیم کنید، در غیر این صورت کپی منتظر شروع بعدی میماند. سپس کنسول سیستم › هوش مصنوعی › اتصالات مدل را بررسی کنید:
- هر اتصال شناسه سرویس خود را حفظ میکند، بنابراین عوامل اپلیکیشن و تنظیمات ترجمه خودکار که به یک سرویس Agents اشاره دارند، همچنان آن را پیدا میکنند.
- سرویسهای OpenAI، سازگار با OpenAI، Anthropic، Mistral، Cohere و Gemini به اتصالاتی به نقطه پایانی سازگار با OpenAI (یا Anthropic) آنها تبدیل میشوند. یک سرویس Azure به اتصال به نقطه پایانی سازگار با OpenAI منبع تبدیل میشود: آن را آزمایش کنید.
- سرویسهای AWS Bedrock، Google Vertex AI و Cohere North، و انواع ناشناخته، با برچسب Needs attention و دلیل آن مشخص میشوند. اعتبارنامههای ابری آنها کپی نمیشوند: آنها را به نقطه پایانی سازگار با OpenAI ارائهدهنده یا دروازهای مانند LiteLLM اشاره کنید، سپس ذخیره کنید.
- سرویس embedding به مدل Embeddings اتصال با همان آدرس و کلید تبدیل میشود، یا یک اتصال مستقل برای خود. سرویس متننویسی مدل
whisper-1را دریافت میکند. - اگر بازنویسی و خلاصهنویسی هنوز اتصال ندارند، سرویس و مدل عامل پیشفرض اپلیکیشن را دریافت میکنند.
عاملهای برنامه Agents
پس از سرویسها، ارتقا هر عامل از برنامه Agents (که اکنون برنامه گفتگوی هوش مصنوعی است) را به یک عامل در سطح سرور تبدیل میکند، در همان حساب: اتصال آن (همان کپی شده از سرویسش)، مدل، دستورالعملها، استدلال، نوبتهای ابزار و اینکه چه کسانی میتوانند از آن استفاده کنند. سپس سرور برای این عاملها پاسخ میدهد. در مواردی که برنامه یک عامل را به روشی محدود کرده بود که عاملهای سرور آن را بیان نمیکنند (کانالهایی که در آنها پاسخ میداد، فهرستهای مسدودسازی، دسترسی مبتنی بر ویژگی)، عامل به اعضای آن کانالها یا به هیچکس محدود شده و به عنوان نیازمند توجه علامتگذاری میشود، همانطور که عاملی که سرویسش به اتصال تبدیل نشده است نیز علامتگذاری میشود. آنها را در کنسول سیستم › هوش مصنوعی › اتصالات مدل بررسی کنید. سایر تنظیمات برنامه بدون تغییر باقی میمانند.
سایر تغییرات در پیشفرضها
- Calls: Test mode غیرفعال و Enable video بهطور پیشفرض فعال است. انتخابی که در پیکربندی ذخیره شده، حفظ میشود. مکالمات همچنین نوع فضای کاری را دنبال میکنند (به مکالمات و صدا مراجعه کنید).
- گرفتن پیامها به بالای صفحه برای مدیران کانال، مدیران و مدیرهای فضای کاری (با Manage messages) است؛ اعضای یک پیام مستقیم یا گروهی همچنان میتوانند این کار را انجام دهند.
- کانالهای بایگانیشده میتوانند اعضای جدیدی داشته باشند که تاریخچه آنها را میخوانند. هیچکس در آنها پیام نمیفرستد، واکنش نشان نمیدهد یا چیزی را تغییر نمیدهد.
مهاجرت از Mattermost
Antimatter از اسکیمای پایگاه داده Mattermost استفاده میکند و جداول اختصاصی خود را به آن اضافه میکند، بنابراین میتواند پایگاه داده PostgreSQL و فایلهای یک سرور Mattermost را به ارث ببرد. ابتدا روی یک کپی آزمایش کنید:
- پایگاه داده Mattermost، ذخیرهسازی فایلهای آن (
data/یا سطل S3) وconfig.jsonرا پشتیبانگیری کنید، سپس Mattermost را متوقف کنید. - پایگاه داده را در PostgreSQL مربوط به Antimatter بازیابی کنید، یا Antimatter را به یک کپی از آن اشاره دهید (
AM_SQLSETTINGS_DATASOURCE). - فایلها را به ذخیرهسازی Antimatter کپی کنید و مسیرهایشان را حفظ کنید: با یک ابزار S3 به سطل
antimatter، یا با بایگانی نسخه بهdata/. - از تنظیمات خود استفاده کنید:
config.jsonرا کپی کنید، یا با دستورamctl --local config migrateآن را به پایگاه داده منتقل کنید (به تنظیمات مراجعه کنید). متغیرهای محیطیMM_شما همچنان کار میکنند؛ هرگاه مناسب بود، نام آنها را بهAM_تغییر دهید. - آنتیمتر را اجرا کنید و در حین ارتقای پایگاه داده، لاگها را دنبال کنید. سپس به کنسول سیستم › پلاگین ها › مدیریت پلاگین بروید. آنتیمتر نسخههای اختصاصی خود از «مکالمه»، «گفتگوی هوش مصنوعی» و «یکپارچهسازیها» را نصب میکند اگر این نسخهها از نسخههای نصبشده جدیدتر باشند؛ همچنین «پلیبوک» و «کانبان (تختهها)» را نیز نصب میکند اگر سرور Mattermost از قبل یکی از آنها را داشته باشد (هیچکدام از اینها دیگر روی سرورهای جدید به صورت پیشفرض وجود ندارند: به برنامههای پیشفرض مراجعه کنید). اگر Mattermost نسخه جدیدتری از یکی از این برنامهها داشت، آن برنامه را حذف کنید و آنتیمتر را مجدداً راهاندازی کنید تا نسخه اختصاصی آن نصب شود.
- اعلانهای Push را مجدداً با پروکسی Push اختصاصی خود پیکربندی کنید: Antimatter هیچگاه اعلانهایی را به سرویسهای Push متعلق به Mattermost (چه آزمایشی و چه میزبانیشده) ارسال نمیکند، زیرا این سرویسها فقط برای برنامههای خود Mattermost اعلانها را تحویل میدهند. تا زمانی که Push Notification Server را تغییر ندهید، سرور هیچ اعلان Push ارسال نمیکند (به اعلانهای Push مراجعه کنید).
Antimatter با هیچ سرویسی که توسط Mattermost, Inc. اجرا میشود ارتباط برقرار نمیکند (به اتصالات به سرویسهای خارجی مراجعه کنید)، حتی اگر پیکربندی شما هنوز یکی از آنها را ذکر کند:
- سرور اعلان push Mattermost در تنظیمات حفظ میشود اما هرگز استفاده نمیشود؛
- آدرسهای Mattermost برای بازار برنامهها (URL بازار) و اطلاعیههای محصول خالی میشوند؛
- لینکهای دانلود اپلیکیشن که پیشفرضهای Mattermost بودند (Antimatter Apps Download Page Link، Android App Download Link و iOS App Download Link) با صفحات دانلود اپلیکیشنهای Antimatter در GitHub جایگزین میشوند؛ لینکهایی که خودتان تنظیم کردهاید حفظ میشوند;
- افزونه مکالمه به جای سرور STUN Mattermost، از سرور STUN عمومی Cloudflare استفاده میکند، بدون اینکه تنظیمات ذخیرهشده تغییر کند (به مکالمه مراجعه کنید)؛
- بررسی بهروزرسانیهای امنیتی و گزارشدهی کرش حذف میشوند و به همین دلیل تنظیمات مربوط به آنها در کنسول سیستم (Enable Security Alerts، Enable Diagnostics and Error Reporting) و صفحه اطلاعیه ها نیز حذف میشوند.
سوکت حالت محلی اکنون /var/tmp/antimatter_local.socket است؛ amctl همچنین سوکت قدیمی /var/tmp/mattermost_local.socket را نیز امتحان میکند. Mattermost در نسخههای اخیر خود فقط از PostgreSQL پشتیبانی میکند و Antimatter نیز همینطور است: ابتدا پایگاه داده MySQL را به PostgreSQL منتقل کنید. بازگشت به Mattermost پس از ارتقای پایگاه داده توسط Antimatter به معنای بازیابی پشتیبانگیری Mattermost شماست.
خروجی و ورودی داده
فرمت خروجی گروهی (bulk export) دادهها را بین سرورها جابهجا میکند: کل سرور، برخی از جوامع یا برخی از کانالها، همراه با پیوستها، تصاویر پروفایل و ایموجیهای سفارشی در صورت تمایل شما.
# on the source server
amctl export create --team-name design --include-profile-pictures
amctl export list
amctl export download <export file> design.zip
# on the destination server
amctl import upload design.zip
amctl import list available
amctl import process <uploaded file> --imported-users active
برای مشاهده وضعیت کارها از دستورات amctl export job list و amctl import job list استفاده کنید. در صورت خروجیگیری یا واردسازی یک تیم یا کانال، استفاده از --imported-users الزامی است: اگر افراد به این سرور منتقل میشوند، مقدار active و اگر واردسازی در سروری انجام میشود که آنها قبلاً حساب دارند، مقدار inactive را تنظیم کنید تا حسابهایی که از تطبیقات نامطمئن ایجاد شدهاند، تا زمانی که یک مدیر آنها را بررسی کند، غیرفعال بمانند. با --destination-team-name میتوانید دادهها را در یک تیم موجود وارد کنید. خروجیها و واردسازیها بهطور پیشفرض به مدت ۳۰ روز در فضای ذخیرهسازی سرور (ExportSettings.Directory، ImportSettings.Directory) نگهداری میشوند.
مستقیماً روی سرور، دستورات antimatter export bulk و antimatter import bulk --apply عملیات مشابه را از طریق فایلها و بدون استفاده از API انجام میدهند.
خط مربوط به هر کانال در فایل خروجی، نوع و تنظیمات آن را شامل میشود (am_type، am_mode، am_root_posts و برای انجمنها am_forum_view)؛ خطی که این مقادیر را نداشته باشد، به عنوان یک کانال چت متنی ساده وارد میشود. خط مربوط به پست ریشه در یک کانال انجمنی نیاز به props.am_thread_title دارد که عنوان موضوع آن رشته است؛ در صورت نبود این مقدار، وارد کردن آن خط با خطا مواجه میشود.