ر رهسپارRahsepar Docs
نمونه کانفیگ دانلود فایل‌ها
Cross-platform cPanel deployer/Docs v1.0
Rahsepar
رهسپار

استقرار روی cPanel،
ساده، قابل‌تکرار و کنترل‌شده.

رهسپار جریان Build، ساخت Archive، آپلود FTP، انتشار سمت سرور، Health Check و Rollback را در یک ابزار سبک برای Linux، macOS و Windows جمع می‌کند.

بدون سرویس واسط FTP + SHA-256 Health Check Rollback
rahsepar deploy production
$ ./rahsepar.sh
Deploy pipeline6 stages

از کد محلی تا نسخه‌ی سالم روی هاست، با مسیر مشخص و قابل بررسی.

Quick Start

شروع سریع

برای اولین 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 را پشت سر هم انجام می‌دهد.

Quick Run

اجرای سریع

Linux / macOS
chmod +x rahsepar.sh
./rahsepar.sh --dry-run
./rahsepar.sh
Windows
.\rahsepar.cmd --dry-run
.\rahsepar.cmd
Architecture

رهسپار چطور کار می‌کند؟

کلاینت و سرور دو نقش جدا دارند. کلاینت فایل 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 را بررسی می‌کند.

نمونه درخواست
curl -H "X-Deploy-Token: YOUR_TOKEN" \
  "https://example.com/extract.php?action=health"
Linux / macOS

نصب و اجرا در Linux / macOS

نسخه Shell به Bash، jq، curl و zip نیاز دارد. برای Watch Mode در Linux به inotifywait نیز نیاز است.

اجرا
chmod +x rahsepar.sh
./rahsepar.sh --dry-run
./rahsepar.sh
برای محاسبه 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 می‌شود.

config.json
{
  "ProjectRoot": ".",
  "BuildFolder": "dist",
  "ZipFileName": "politest.ir.zip",
  "FtpHost": "ftp.example.com",
  "RemoteUser": "cpanel-user",
  "FtpPassword": "",
  "RemotePath": "public_html",
  "ExtractScriptUrl": "https://example.com/extract.php",
  "Token": "",
  "HealthUrl": "https://example.com/",
  "BuildCommand": "bun run build",
  "UploadRetries": 3,
  "RequestTimeoutSeconds": 300,
  "HealthTimeoutSeconds": 20,
  "StatusPollSeconds": 2,
  "StatusTimeoutSeconds": 330,
  "KeepLocalArchive": false,
  "AllowInsecureHttp": false
}
کلید کاربرد پیش‌فرض
ProjectRoot ریشه پروژه محلی .
BuildFolder پوشه خروجی Build dist
ZipFileName نام Archive؛ اگر .zip نداشته باشد اضافه می‌شود politest.ir.zip
FtpHost هاست FTP بدون prefix الزامی
RemoteUser نام کاربری FTP الزامی
FtpPassword رمز FTP؛ Environment Variable اولویت دارد الزامی
RemotePath مسیر مقصد فایل ZIP روی FTP .
ExtractScriptUrl URL فایل extract.php الزامی
Token Token احراز هویت API الزامی
HealthUrl URL برنامه برای بررسی پس از Deploy خالی = غیرفعال
BuildCommand فرمان Build پروژه bun run build
UploadRetries تعداد تلاش Upload 3
RequestTimeoutSeconds Timeout درخواست API 300
HealthTimeoutSeconds Timeout Health Check برنامه 20
StatusPollSeconds فاصله Poll کردن State 2
StatusTimeoutSeconds حداکثر زمان انتظار برای State نهایی 330
KeepLocalArchive نگه‌داشتن ZIP روی سیستم محلی false
AllowInsecureHttp اجازه HTTP برای API در محیط قابل اعتماد توسعه false
Secrets

متغیرهای محیطی

برای اینکه 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 می‌فرستد.

آخرین Backup
./rahsepar.sh --rollback
.\rahsepar.cmd --rollback
Deploy ID مشخص
./rahsepar.sh --rollback --deploy-id=YOUR_ID
.\rahsepar.cmd --rollback --deploy-id=YOUR_ID
رفتار مهم: اگر خود عملیات 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 اجرا می‌شوند.

Action Method کاربرد
health GET / POST بررسی نیازمندی‌های API
status GET / POST خواندن State یک Deploy ID
backup POST ایجاد Backup دستی
extract POST Validate + Stage + Backup + Publish Release
restore POST بازگردانی Backup مرتبط یا آخرین Backup
cleanup POST پاک‌سازی Archive و Metadata قدیمی

فرمت پاسخ

JSON
{
  "ok": true,
  "api_version": "2.0",
  "message": "Deployment completed successfully.",
  "data": { ... },
  "timestamp": "..."
}
State Machine

Stateهای Deploy

هر Deploy ID یک State مستقل دارد. کلاینت هنگام قطع شدن درخواست اولیه می‌تواند با Action status نتیجه واقعی را Poll کند.

waitingstartingextractingbacking_updeployingcompletedfailedfailed_rolled_backrolled_back

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 مرجع دقیق‌تر هستند.

Downloads

فایل‌های رهسپار