برای اولین Deploy فقط این مسیر را برو. جزئیات فنی را فعلاً لازم نیست
بخوانی.
01
فایل سرور را روی هاست بگذار
extract.php را در همان مسیری قرار بده که خروجی
سایت قرار است منتشر شود. یعنی اگر سایت تو در دایرکتوری
public_html قرار دارد، فایل را مستقیما در همانجا
آپلود کن، توجه داشته باش که مستقیما در روت(ریشه) هاست فایل را
قرار بده.
02
توکن سرور را بساز
کنار extract.php فایلی با نام
.deploy-token ایجاد کن و Token زیر را داخل آن
قرار بده.
Deploy Token
Secure
03
کانفیگ را آماده کن
config.example.json را به
config.json تبدیل و اطلاعات پروژه و FTP را وارد
کن. اگر این فایل را نداشتی، بعد از اجرای اسکریپت برای اولین بار در صورت وجود نداشتن این فایل خود اسکریپت به صورت ورودی اطلاعات را از شما دریافت خواهد کرد و سپس فایل config.json توسط خود اسکریپت ساخته خواهد شد.
04
Dry Run بگیر
قبل از Deploy واقعی، کانفیگ و Dependencyها را اعتبارسنجی کن.
05
Deploy کن
رهسپار Build، Package، Upload، Publish، Health Check و Cleanup
را پشت سر هم انجام میدهد.
کلاینت و سرور دو نقش جدا دارند. کلاینت فایل Release را میسازد و
میفرستد؛ extract.php روی هاست، صحت فایل را بررسی و
Release را امنتر Publish میکند.
1Buildاجرای BuildCommand
←
2PackageZIP + SHA‑256
←
3UploadFTP
←
4PublishStaging + Backup
←
5VerifyHealth Check
←
6CleanupArchive + Metadata
نکته: آپلود رهسپار عمداً با FTP معمولی انجام میشود تا با
هاستهای cPanel بیشتری سازگار باشد. API مربوط به
extract.php در حالت Production بهتر است روی HTTPS باشد.
Server Setup
راهاندازی هاست
PHP8.0+
ExtensionZipArchive
PermissionWritable Root
Auth.deploy-token
۱. آپلود فایل سرور
extract.php را در ریشهی مقصد Deploy قرار بده. اسکریپت
هنگام اجرا پوشههای داخلی خودش را میسازد.
۲. ایجاد Token
روی هاست
# file: .deploy-token
YOUR_LONG_RANDOM_SECRET
کلاینت Token را با Header به نام
X-Deploy-Token میفرستد. اگر فایل Token وجود نداشته
باشد یا خالی باشد، API با خطای
TOKEN_NOT_CONFIGURED پاسخ میدهد.
۳. Health خود API
Action health وضعیت PHP، ZipArchive، writable بودن ریشه
و تنظیم بودن Token را بررسی میکند.
برای محاسبه Digest باید یکی از sha256sum یا
shasum روی سیستم موجود باشد.
Windows
نصب و اجرا در Windows
نسخه Windows با PowerShell 5.1+ یا PowerShell 7+ اجرا میشود و برای
انتقال فایل از curl.exe استفاده میکند. فایل
rahsepar.cmd ابتدا pwsh.exe و در صورت
نبودن آن powershell.exe را اجرا میکند.
اجرا
.\rahsepar.cmd --dry-run
.\rahsepar.cmd
نسخه PowerShell برای ساخت ZIP از
System.IO.Compression استفاده میکند و از نظر مراحل
Deploy با نسخه Shell همساختار است.
Configuration
فایل config.json
هر دو نسخه Linux و Windows از یک Schema مشترک استفاده میکنند. اگر
ProjectRoot نسبی باشد، نسبت به محل فایل کانفیگ Resolve
میشود.
برای اینکه Password و Token داخل config.json ذخیره
نشوند، میتوانی آنها را با Environment Variable بدهی. این مقادیر بر
config اولویت دارند.
متغیر
کاربرد
DEPLOY_FTP_PASSWORD
رمز FTP
DEPLOY_TOKEN
Token فایل .deploy-token
DEPLOY_CONFIG
مسیر config سفارشی در نسخه Shell/محیط
DEBUG=1
فعال کردن Debug Log
NO_COLOR=1
غیرفعال کردن رنگهای ترمینال
CLI
دستورها و فلگها
فلگ
کاربرد
--auto
اگر config وجود نداشت بهجای Prompt، Fail میکند
--watch
با تغییر فایلهای پروژه Deploy جدید اجرا میکند
--dry-run
کانفیگ را Validate و نمایش میدهد؛ Deploy انجام نمیشود
--rollback
Rollback به Deploy ID یا آخرین Backup
--deploy-id=<id>
Deploy ID مورد استفاده برای Rollback
--config=<path>
استفاده از فایل config سفارشی
--debug
فعال کردن Diagnostic Log بدون نمایش Secretها
Deploy Lifecycle
چرخه کامل Deploy
01
Build
خروجی قبلی حذف و BuildCommand اجرا میشود.
BuildFolder باید ایجاد و غیرخالی باشد.
02
Package
محتویات BuildFolder در ZIP قرار میگیرند. سپس SHA‑256 فایل
محاسبه میشود.
03
FTP Upload
Archive با curl به RemotePath فرستاده میشود.
Retryها Backoff ساده دارند.
04
Server Deploy
کلاینت extract را با Deploy ID و SHA‑256 فراخوانی
میکند. سرور ZIP را Validate، در Staging Extract، از نسخه فعلی
Backup و سپس Release را Publish میکند.
05
Health Check
اگر HealthUrl تنظیم شده باشد، کلاینت آن را با Timeout مشخص بررسی
میکند.
06
Cleanup
Archive ریموت و Stagingهای قدیمی پاک میشوند، Backup/State
rotation انجام میشود و ZIP محلی بسته به تنظیم حذف یا نگه داشته
میشود.
Developer Mode
Watch Mode
Watch Mode برای توسعه مناسب است. با مشاهدهی تغییر فایلها یک اجرای
Deploy جداگانه آغاز میشود.
Linux
./rahsepar.sh --watch
Windows
.\rahsepar.cmd --watch
نسخه Linux از inotifywait و نسخه Windows از
FileSystemWatcher استفاده میکند. مسیرهای Build،
node_modules، .git و دادههای داخلی Deploy
از Watch کنار گذاشته میشوند.
Recovery
Rollback
رهسپار قبل از Publish از نسخه قبلی Backup میسازد. اگر Health Check
پس از Deploy Fail شود، کلاینت برای همان Deploy ID درخواست Rollback
میفرستد.
رفتار مهم: اگر خود عملیات Remote Deploy بدون نتیجه قطعی Fail
شود، کلاینت Rollback کورکورانه انجام نمیدهد؛ چون ممکن است Release
اصلاً Publish نشده باشد. در این وضعیت باید State/Log سرور بررسی شود.
Observability
لاگها
هر Run یک Log محلی مستقل میسازد. Secretها در خروجی کانفیگ Mask
میشوند و Debug Mode هم برای تشخیص جزئیات بیشتر وجود دارد.
نمونه خروجی
╭────────────────────────────────────────────────────────────╮
│ 1/6 · Build │
╰────────────────────────────────────────────────────────────╯
[20:17:31] ● INFO Cleaning previous build output…
[20:17:31] ● INFO Running: bun run build
[20:17:36] ✔ SUCCESS Build completed in 5s.
╭────────────────────────────────────────────────────────────╮
│ 4/6 · Remote deployment │
╰────────────────────────────────────────────────────────────╯
[20:17:44] ● INFO Deploy ID: 5758fee9-...
[20:17:47] ✔ SUCCESS Server applied the release successfully.
مسیر Log محلی:
<ProjectRoot>/.deploy/logs/deploy-<run-id>.log
سمت سرور نیز رویدادها در .deploy-server.log ثبت و در
صورت بزرگ شدن Rotate میشوند.
Server API
API فایل extract.php
نسخه فعلی API مقدار api_version = 2.0 برمیگرداند. تمام
Actionها بعد از احراز هویت Token اجرا میشوند.
Stateهای میانی نشاندهنده مرحله فعلی هستند.
completed پایان موفق، failed شکست، و
failed_rolled_back یعنی Deploy Fail شده اما Rollback
خودکار سمت سرور موفق بوده است.
Server Storage
فایلها و پوشههای داخلی
مسیر
کاربرد
.deploy-token
Secret احراز هویت API
.deploy-backups/
Backupهای ZIP؛ حداکثر 10 عدد در نسخه فعلی
.deploy-state/
Stateهای Deploy ID؛ Stateهای قدیمی بعد از 14 روز پاک میشوند
.deploy-staging/
محل Extract موقت Release قبل از Publish
.deploy.lock
قفل جلوگیری از اجرای همزمان عملیات حساس
.deploy-server.log
لاگ JSON سمت سرور با Rotation
.deploy-manifest.json
لیست فایلهای متعلق به Release قبلی برای Cleanup امنتر
حداکثر اندازه Archive در نسخه فعلی سرور 1 GiB است.
Security
نکات امنیتی
Token خارج از سورس
سرور فقط Token موجود در .deploy-token را قبول
میکند.
Secret Masking
Password و Token در نمایش کانفیگ چاپ نمیشوند.
SHA‑256
Archive محلی Digest میشود و سرور قبل از Publish آن را با مقدار
ارسالشده مقایسه میکند.
ZIP Validation
سرور Entryهای Archive را قبل از Extract بررسی میکند تا مسیرهای
ناامن و فایلهای رزروشده وارد Release نشوند.
Staging
Archive ابتدا در پوشه موقت Extract میشود و بعد از Validation
Publish میشود.
Lock
عملیات Deploy/Backup/Restore همزمان روی سرور قفل میشوند.
FTP رمزگذاریشده نیست. این انتخاب برای سازگاری بیشتر با
هاستها انجام شده است. FTP Account را محدود به همان مسیر لازم کن،
Password مجزا بساز و API رهسپار را روی HTTPS نگه دار.
CLI Reference
Exit Codeهای مهم
Code
معنی
2
آرگومان CLI ناشناخته
10
Dependency موردنیاز موجود نیست
11
مشکل در config یا ProjectRoot
12
Configuration نامعتبر یا Secret خالی
13
یک Deploy دیگر برای پروژه در حال اجراست
20
BuildFolder با ProjectRoot یکسان است
21
Build command شکست خورده
22
BuildFolder ساخته نشده
23
BuildFolder خالی است
30
محل Archive داخل BuildFolder است
31
ساخت ZIP بعد از Retryها شکست خورده
40
Archive محلی پیدا نشده
41
FTP Upload شکست خورده
50
نتیجه Remote Deploy قابل تأیید نیست
51
Remote Deploy موفق نشده
61
Health Check Fail و Rollback موفق شده
62
Health Check و Rollback هر دو Fail شدهاند
70
Rollback دستی شکست خورده
Troubleshooting
عیبیابی سریع
FTP Upload انجام نمیشود
FtpHost، User، Password و
RemotePath را بررسی کن. با
--debug مسیر ریموت و مرحله شکست را ببین. خود Secret
چاپ نمیشود.
سرور 403 FORBIDDEN میدهد
Token کلاینت با محتوای .deploy-token یکی نیست یا
Header به سرور نمیرسد. Proxy/WAF هاست را هم بررسی کن.
ZIP_EXTENSION_MISSING دریافت میکنم
افزونه PHP ZipArchive روی هاست فعال نیست. بدون آن نسخه فعلی
extract.php اجرا نمیشود.
DEPLOY_LOCKED دریافت میکنم
یک عملیات Deploy/Backup/Restore دیگر در حال اجراست. رهسپار
همزمانی سمت سرور را با Lock محدود میکند.
Health Check شکست میخورد اما سایت باز میشود
بررسی کن HealthUrl به endpoint صحیح و بدون نیاز به Login اشاره
کند و Timeout مناسب باشد.
بعد از قطع اینترنت نمیدانم Deploy چه شد
رهسپار با همان Deploy ID، Action status را Poll
میکند. اگر Timeout نهایی هم رد شود، Log سمت سرور و فایل State
همان Deploy ID مرجع دقیقتر هستند.