مقدمه
Composer مدیر بستههای PHP است که برای نصب و مدیریت وابستگیهای پروژههای PHP استفاده میشود. در محیطهای معمولی، Composer مستقیماً به packagist.org متصل میشود و بستههای مورد نیاز را دانلود میکند. اما در محیطهای Airgap (جداشده از اینترنت)، این ارتباط ممکن نیست و باید یک mirror یا cache محلی از بستهها داشته باشیم.
در این مقاله دو روش اصلی برای راهاندازی یک mirror محلی برای Composer در محیط Airgap را بررسی میکنیم: Satis (روش رسمی و ساده) و Private Packagist (روش پیشرفتهتر با رابط کاربری).
روش اول: Satis
Satis ابزار رسمی و سبک از سوی تیم Composer است که یک static repository از بستههای مورد نظر شما تولید میکند. خروجی آن یک فایل JSON و تعدادی فایل ZIP است که میتوانید با یک وبسرور معمولی سرو کنید.
۱. نصب Satis
Satis را میتوانید از طریق Composer به صورت سراسری نصب کنید:
composer global require composer/satis۲. فایل تنظیمات (satis.json)
یک فایل satis.json در مسیر مورد نظر ایجاد کنید. در این فایل مشخص میکنید که کدام repositoryها و بستهها باید در mirror گنجانده شوند:
{
"name": "Lexoya Internal Mirror",
"homepage": "http://YOUR_MIRROR_URL",
"repositories": [
{ "type": "composer", "url": "https://packagist.org" }
],
"require-all": true,
"require-dependencies": true,
"require-dev-dependencies": true,
"archive": {
"directory": "dist",
"format": "zip"
}
}گزینه require-all: true باعث میشود تمام بستههای موجود در repositoryهای تعریف شده دانلود شوند. اگر نیاز به بستههای خاصی دارید، میتوانید به جای require-all از require استفاده کنید.
۳. ساخت mirror
دستور زیر را اجرا کنید تا Satis تمام بستهها را دانلود و خروجی را در مسیر مشخص شده تولید کند:
php satis build satis.json /path/to/outputاین دستور ممکن است بسته به تعداد بستهها و سرعت شبکه زمانبر باشد. پس از اتمام، یک پوشه output شامل فایل packages.json و پوشه dist حاوی فایلهای ZIP خواهید داشت.
۴. سرو کردن با وبسرور
پوشه خروجی را با nginx یا Apache سرو کنید. یک مثال ساده از تنظیمات nginx:
server {
listen 80;
server_name composer.lexoya.local;
root /path/to/output;
index packages.json;
location / {
autoindex on;
}
}۵. بهروزرسانی دورهای
برای همگامسازی mirror با مخزن اصلی، باید Satis را به صورت دورهای اجرا کنید. یک cron job ساده برای این کار:
0 */6 * * * /usr/bin/php /path/to/satis build /path/to/satis.json /path/to/output 2>&1 | logger -t satisاین cron job هر ۶ ساعت یکبار mirror را بهروزرسانی میکند.
نکته: در محیطهای کاملاً ایزوله (airgap کامل)، باید ابتدا Satis را در محیطی که به اینترنت دسترسی دارد اجرا کنید، سپس خروجی را به محیط ایزوله منتقل کنید. بستههای جدید را هم میتوانید через یک فرآیند دستی یا با استفاده از یک air-gap bridge انتقال دهید.
روش دوم: Private Packagist
Private Packagist یک سرویس پیشرفتهتر از سوی تیم Composer است که نسخه self-hosted نیز دارد. این ابزار یک رابط کاربری گرافیکی برای مدیریت بستهها و تنظیمات mirror در اختیار شما قرار میدهد.
راهاندازی با Docker
Private Packagist را میتوانید به سادگی با Docker اجرا کنید:
version: '3'
services:
packagist:
image: packagist/private-packagist
ports:
- "8080:80"
volumes:
- ./data:/data
environment:
- PACKAGIST_PROXY=true
- PACKAGIST_ORIGIN=http://localhost:8080با فعال کردن PACKAGIST_PROXY=true، Private Packagist به عنوان یک proxy/cache برای بستههای عمومی Packagist نیز عمل میکند.
مزایای Private Packagist نسبت به Satis
- رابط کاربری تحت وب برای مدیریت بستهها
- قابلیت تعیین دسترسی (role-based access) برای تیمهای مختلف
- پشتیبانی از webhook برای بهروزرسانی خودکار
- نمایش آمار دانلود و استفاده از بستهها
- یکپارچگی با GitHub, GitLab, Bitbucket
نکته: Private Packagist یک محصول تجاری است و نسخه self-hosted آن نیاز به لایسنس دارد. اگر به دنبال یک راهحل رایگان و ساده هستید، Satis گزینه مناسبتری است.
تنظیمات سمت کلاینت
پس از راهاندازی mirror، باید پروژههای PHP خود را طوری تنظیم کنید که بستهها را از mirror محلی دریافت کنند. دو روش برای این کار وجود دارد:
روش اول: تنظیم در composer.json
بخش repositories را به composer.json پروژه خود اضافه کنید:
{
"repositories": [
{
"type": "composer",
"url": "http://YOUR_MIRROR_URL"
},
{
"packagist.org": false
}
]
}با تنظیم "packagist.org": false به Composer میگویید که مستقیماً به اینترنت مراجعه نکند و فقط از mirror محلی استفاده کند.
روش دوم: استفاده از composer config
میتوانید از طریق خط فرمان این تنظیمات را اعمال کنید:
composer config repos.local composer http://YOUR_MIRROR_URL
composer config repos.packagist falseاین دستورها repository محلی را اضافه کرده و packagist.org را غیرفعال میکنند.
تست mirror
برای اطمینان از صحت تنظیمات، یک بسته را نصب کنید:
composer require vendor/package --verboseدر خروجی باید آدرس mirror محلی را ببینید. اگر خطایی مربوط به اتصال به packagist.org دیدید، یعنی تنظیمات به درستی اعمال شده است.
جمعبندی
در این مقاله دو روش اصلی برای راهاندازی mirror/cache محلی برای Composer در محیط Airgap را بررسی کردیم:
- Satis - روش رسمی، رایگان و سبک که برای تیمهای کوچک و محیطهای ساده مناسب است
- Private Packagist - روش پیشرفته با رابط کاربری و امکانات مدیریتی که برای سازمانهای بزرگ مناسبتر است
انتخاب بین این دو روش به نیازها و بودجه شما بستگی دارد. برای شروع، Satis گزینه ایدهآلی است و در صورت نیاز به امکانات بیشتر میتوانید به Private Packagist مهاجرت کنید.