راهنمای ستاپ خودکار برای توسعهدهندگان
با گذاشتن یک فایل sourcekade.json در ریشهی سورس، خریدار میتواند سورس شما را با یک کلیک روی سرور مجازی (SSH) یا هاست cPanel خودش نصب کند. سورسکده سازگاری سرور را بررسی میکند، پیشنیازها (PHP/Python/Node، افزونهها، nginx، MariaDB، composer/pip/npm) را نصب میکند، پارامترهای شما را از خریدار میگیرد و داخل فایلها میگذارد، دیتابیس را میسازد و import میکند، وبسرور و SSL را تنظیم میکند، برنامه را به سرویس دائمی تبدیل میکند و برای ربات تلگرام وبهوک را ثبت میکند.
اگر این فایل را نگذارید، سورسکده سعی میکند از روی کد حدس بزند (برچسب «تشخیص خودکار») و در تب «ستاپ خودکار» سورستان یک پیشنویس به شما پیشنهاد میدهد که با یک کلیک ذخیره میشود. پیشنویس را حتماً بررسی کنید؛ حدس همیشه کامل نیست.
با هوش مصنوعی کد میزنید؟ (Claude Code، Cursor، Codex، …)
این فایل را در ریشهی پروژه بگذارید. دستیار هوش مصنوعی با خواندن آن، کد و sourcekade.json را از اول طوری مینویسد که با ستاپ خودکار سورسکده سازگار باشد: پارامترها، دیتابیس، وبهوک، cron و پوشههای داده. نام CLAUDE.md را Claude Code میخواند؛ Cursor، Codex و بیشتر ابزارهای دیگر AGENTS.md را.
دانلود CLAUDE.md AGENTS.md مشاهده
یا با یک دستور در پوشهی پروژه:
curl -fsSL https://sourcekade.31-15-17-184.sslip.io/docs/setup/CLAUDE.md -o CLAUDE.md
بعد کافی است به دستیار بگویید:
طبق CLAUDE.md این پروژه را برای ستاپ خودکار سورسکده آماده کن: sourcekade.json را بساز یا کامل کن، توکنها و تنظیمات را به پارامتر تبدیل کن و چکلیست آخر فایل را انجام بده.
اگر پروژه را روی سورسکده گذاشتهاید، در تب «ستاپ خودکار» همان سورس نسخهی مخصوص پروژهی شما (همراه مانیفست پیشنهادی و خطاهایی که باید رفع شود) را دانلود کنید.
چه اتفاقی میافتد؟
- آمادهسازی (روی سورسکده): کد نسخهی تأییدشده استخراج و پارامترها داخل فایلها نوشته میشود (
files،env). - VPS: اتصال SSH با کلید اختصاصی هر سرور → نصب پیشنیازها با apt (یا dnf) → ساخت کاربر لینوکسی جدا برای برنامه (
sk-ID) → استقرار در/opt/sourcekade/sk-ID→ دیتابیس →composer/pip/npm→install.commandsوpost_installبا همان کاربر (نه root) → nginx + PHP-FPM یا reverse proxy → SSL → سرویس systemd → cron → بررسی سلامت. - cPanel: ساخت دیتابیس با API سیپنل → ساخت vendor روی سورسکده → آپلود به پوشهی دامنه → یک نصبکنندهی یکبارمصرف PHP (کلیددار، ۲۰ دقیقه انقضا، خودش را پاک میکند) نسخهی PHP و افزونهها را چک، فایلها را استخراج و SQL را import میکند → cron با API.
- تلگرام: توکن با
getMeبررسی میشود؛ برای وبهوکsetWebhookباsecret_token(و در حالت بدون دامنه، آپلود گواهی self-signed روی IP)، برای pollingdeleteWebhook.
نصب دوباره = بهروزرسانی: نسخهی قبلی بکاپ میشود (.bak-تاریخ، سهتای آخر میماند)، مسیرهای persist و دیتابیس حفظ میشوند.
مرجع کامل فیلدها
همهی فیلدهای sourcekade.json با نوع، لازم بودن، پیشفرض و مقدارهای مجاز. فقط type و language لازماند؛ بقیه را فقط وقتی لازم دارید بنویسید. همین مرجع بهصورت فایل JSON Schema هم هست.
این خط را اول sourcekade.json بگذارید تا VS Code و Cursor هنگام نوشتن، فیلدها را پیشنهاد دهند و خطاها را نشان دهند:"$schema": "https://sourcekade.31-15-17-184.sslip.io/docs/setup/sourcekade.schema.json"
پایه
نوع و زبان برنامه؛ تنها فیلدهای لازم.
$schemastringآدرس همین schema. اختیاری؛ با آن VS Code و Cursor هنگام نوشتن، تکمیل خودکار و خطاها را نشان میدهند.
typestringلازمنوع برنامه؛ مشخص میکند برنامه چطور نصب و اجرا شود.
telegram-webhookربات تلگرام با وبهوک؛ تلگرام هر پیام را به آدرس برنامه میفرستد (PHP روی هاست cPanel هم نصب میشود)telegram-pollingربات تلگرام با polling؛ برنامه همیشه روشن است و خودش پیامها را میگیرد (فقط VPS)webوبسایت یا APIworkerسرویس پسزمینهی همیشه روشن (فقط VPS)scriptاسکریپتی که یک بار اجرا میشود
languagestringلازمزبان برنامه.
phpPHP؛ روی VPS یا هاست cPanelpythonPython؛ فقط VPSnodeNode.js؛ فقط VPS
namestringنام نمایشی برنامه. اختیاری.
requires
requiresobjectپیشنیازهای سرور. پیش از نصب با سرور خریدار سنجیده میشود.
requires.phpstringحداقل نسخهی PHP، مثل ">=8.1".
requires.pythonstringحداقل نسخهی پایتون، مثل ">=3.10".
requires.nodestringحداقل نسخهی Node.js، مثل ">=20".
requires.extensionsarray<string>افزونههای PHP لازم، مثل curl، mbstring و pdo_mysql.
requires.aptarray<string>بستههای سیستمی که روی VPS با apt نصب میشوند، مثل ffmpeg.
requires.osarray<string>سیستمعاملهایی که برنامه رویشان کار میکند، مثل ubuntu و debian.
requires.memory_mbintegerحداقل حافظهی لازم به مگابایت. ۰ یعنی بدون حداقل.
requires.disk_mbintegerحداقل فضای دیسک لازم به مگابایت. ۰ یعنی بدون حداقل.
install
installobjectنصب وابستگیها. کلیدی که به زبان برنامه ربط ندارد نادیده گرفته میشود.
install.composerbooleanاجرای composer install (فقط PHP).
install.pipstring | booleanوابستگیهای پایتون: مسیر فایل requirements، یا "." برای pyproject.toml/setup.py؛ true یعنی requirements.txt و false یعنی هیچ (فقط Python).
install.npmbooleanاجرای npm install (فقط Node).
install.commandsarray<string>دستورهای نصب اضافه. با کاربر برنامه و در پوشهی برنامه اجرا میشوند.
params
paramsarray<object>مقدارهایی که خریدار هنگام ستاپ وارد میکند (توکن، آیدی ادمین، …). هر کدام با {{KEY}} در files، env، run، cron و دستورها جایگزین میشود.
params[].keystringلازمنام پارامتر، مثل BOT_TOKEN. نامهای سیستمی (مثل DB_PASS) مجاز نیستند چون خودکار پر میشوند.
params[].labelstringعنوانی که خریدار در فرم ستاپ میبیند. فارسی بهتر است.
params[].typestringنوع مقدار؛ فرم ستاپ مقدار خریدار را بر اساس آن بررسی میکند.
textمتن سادهsecretمتن محرمانه؛ در فرم و لاگ پنهان میماندintعدد صحیحurlآدرس http یا httpsemailایمیلdomainدامنه، مثل example.comboolبله یا خیر (true / false)choiceانتخاب از فهرست optionstelegram_tokenتوکن ربات از BotFather؛ قالبش بررسی میشودtelegram_idآیدی عددی تلگرام؛ یک آیدی یا چند آیدی با کاما
params[].requiredbooleanخریدار باید پرش کند؟ پارامتر لازمی که default دارد هیچوقت جلوی نصب را نمیگیرد.
params[].secretbooleanمقدار در فرم و لاگ پنهان بماند.
params[].defaultstring | number | booleanمقداری که از قبل در فرم پر است.
params[].helpstringراهنمای کوتاه زیر فیلد، مثل «از @userinfobot بگیرید».
params[].optionsarray<string>لازم برای type: choiceگزینههای انتخاب برای type: choice.
params[].generatestringاگر خریدار خالی بگذارد، مقدار خودکار ساخته میشود و در نصبهای بعدی همان میماند؛ برای کلیدهای رمزنگاری بهجای پرسیدن از خریدار.
hex16رشتهی هگز ۳۲ حرفیhex32رشتهی هگز ۶۴ حرفیbase64_32۳۲ بایت تصادفی به base64fernetکلید Fernet (کتابخانهی cryptography پایتون)passwordرمز تصادفی ۲۴ حرفیlaravel_keyکلید APP_KEY لاراول (base64:…)
params[].patternstringالگوی regex بدون /…/ که مقدار خریدار باید با آن جور باشد.
files
filesarray<object>فایلهایی که هنگام نصب ساخته یا مقداردهی میشوند.
files[].pathstringلازممسیر فایل مقصد نسبت به ریشهی سورس، مثل config.php.
files[].fromstringفایل نمونهای که کپی میشود (مثل config.sample.php)؛ {{KEY}}های داخلش جایگزین میشوند. بدون from خود path ویرایش میشود.
files[].setobjectمقداردهی مستقیم ثابت/متغیرهای موجود در فایل بدون تغییر کد؛ نام ثابت یا متغیر (برای متغیر PHP با $) به مقدار، مثل "BOT_TOKEN": "{{BOT_TOKEN}}".
files[].set.{نام}string | number | booleanمقدار؛ معمولاً یک {{KEY}}. برای int و یک telegram_id عدد بیکوتیشن نوشته میشود، بقیه رشته با escape درست.
env
envobjectفایل .env و متغیرهای محیطی. روی VPS همین متغیرها به پروسهی run.command هم داده میشوند. بدون vars نادیده گرفته میشود.
env.filestringنام فایل env.
env.fromstringفایل نمونه، مثل .env.example، که پایهی فایل env میشود.
env.varsobjectنام متغیر به مقدار، مثل "BOT_TOKEN": "{{BOT_TOKEN}}".
env.vars.{نام}string | number | booleanمقدار متغیر؛ معمولاً یک {{KEY}}
database
databaseobjectدیتابیس MySQL اختصاصی با کاربر و رمز تصادفی ساخته میشود؛ مشخصاتش با {{DB_HOST}}، {{DB_PORT}}، {{DB_NAME}}، {{DB_USER}} و {{DB_PASS}} در دسترس است. یک آبجکت خالی {} هم کافی است.
database.enginestringموتور دیتابیس.
mysqlMySQL یا MariaDB (فعلاً تنها گزینه)
database.importstringفایل SQL که فقط وقتی دیتابیس خالی است import میشود.
webhook
webhookobjectوبهوک و توکن ربات؛ فقط برای telegram-webhook و telegram-polling.
webhook.pathstringفایل یا مسیر وبهوک نسبت به ریشهی وب.
webhook.token_paramstringkey پارامتری که توکن ربات است. ربات تلگرام بدون پارامتر توکن نصب نمیشود.
webhook.drop_pendingbooleanپیامهای مانده از قبل هنگام ثبت وبهوک دور ریخته شوند.
webhook.allowed_updatesarray<string>نوع آپدیتهایی که تلگرام بفرستد، مثل message و callback_query. خالی یعنی پیشفرض تلگرام.
run
runobjectاجرای برنامه بهصورت سرویس همیشهروشن.
run.commandstringلازم برای telegram-polling و worker، و برای web و telegram-webhook پایتون/Nodeدستور اجرا، مثل python bot.py، python -m mybot یا npm start.
web
webobjectتنظیمات وب.
web.rootstringریشهی وب نسبت به سورس، مثل public. خالی یعنی خود ریشه.
web.portintegerپورتی که برنامهی پایتون/Node روی آن گوش میدهد. اگر اشغال باشد پورت دیگری در {{PORT}} داده میشود؛ پس از {{PORT}} بخوانید.
cron
cronarray<object>کارهای زمانبندیشده.
cron[].schedulestringلازمزمانبندی cron، مثل "*/5 * * * *"، یا @hourly، @daily، @weekly، @monthly، @reboot.
cron[].commandstringلازمدستوری که در آن زمان اجرا میشود، مثل php cron.php.
post_install
post_installarray<string>دستورهایی که بعد از نصب اجرا میشوند: migrate، ساخت ادمین و … .
persist
persistarray<string>مسیرهایی که در نصب دوباره (بهروزرسانی) از نسخهی قبلی نگه داشته میشوند، مثل data، storage یا bot.sqlite.
فیلدی با این عبارت پیدا نشد. نام انگلیسی فیلد (مثل webhook) یا یک کلمهی فارسی از توضیحش را امتحان کنید.
نوع پارامترها
telegram_token (قالب و getMe بررسی میشود؛ محرمانه) · telegram_id (عدد یا چند عدد با کاما) · secret (محرمانه؛ در لاگ نمایش داده نمیشود) · text · int · bool (true/false) · choice · url · email · domain.
پارامترهای سیستمی (خودکار)
{{APP_URL}}— آدرس عمومی برنامه{{APP_DIR}}— مسیر نصب روی سرور{{DOMAIN}}— دامنه (یا IP){{WEBHOOK_URL}}— آدرس کامل وبهوک{{WEBHOOK_SECRET}}— secret_token وبهوک (هدر X-Telegram-Bot-Api-Secret-Token){{PORT}}— پورت داخلی برنامه{{DB_HOST}}— هاست دیتابیس{{DB_PORT}}— پورت دیتابیس{{DB_NAME}}— نام دیتابیس{{DB_USER}}— کاربر دیتابیس{{DB_PASS}}— رمز دیتابیس
مقداردهی بدون تغییر کد (set)
لازم نیست کدتان را عوض کنید؛ کافی است بگویید کدام ثابت/متغیر چه مقداری بگیرد. سورسکده بسته به پسوند فایل این الگوها را پیدا و مقدار را با escape درست جایگزین میکند:
- PHP:
define('BOT_TOKEN', '...');·const BOT_TOKEN = '...';·$token = '...';(کلید با$) ·'token' => '...'در آرایه - Python:
BOT_TOKEN = "..."(سطح ماژول) — حتیBOT_TOKEN = os.getenv(...) - JS/TS:
const BOT_TOKEN = '...'·token: '...'در آبجکت - JSON: کلید سطح اول · .env / .ini:
KEY=value
برای پارامترهای int/telegram_id (یک آیدی) عدد بدون کوتیشن نوشته میشود؛ بقیه بهصورت رشته با escape کامل (کوتیشن و خط جدید امن است). telegram_id میتواند فهرست با کاما هم باشد (111,222) که بهصورت رشته نوشته میشود. اگر نامی در فایل پیدا نشود، نصب متوقف نمیشود و فقط در لاگ هشدار میآید.
متغیرهای محیطی: روی VPS همهی env.vars هم در فایل .env نوشته میشوند و هم به پروسهی run.command داده میشوند (پایتون/Node بدون dotenv کار میکنند). PHP-FPM و cPanel فایل .env را خودکار بارگذاری نمیکنند؛ در PHP از config.php + set استفاده کنید.
نمونهها
ربات تلگرام PHP با وبهوک + MySQL
{
"type": "telegram-webhook",
"language": "php",
"requires": { "php": ">=8.1", "extensions": ["curl", "mbstring", "pdo_mysql"] },
"params": [
{ "key": "BOT_TOKEN", "label": "توکن ربات", "type": "telegram_token" },
{ "key": "ADMIN_ID", "label": "آیدی عددی ادمین", "type": "telegram_id", "help": "از @userinfobot بگیرید" },
{ "key": "CHANNEL", "label": "کانال جوین اجباری", "type": "text", "required": false, "default": "@mychannel" }
],
"files": [
{ "path": "config.php", "set": {
"BOT_TOKEN": "{{BOT_TOKEN}}", "ADMIN_ID": "{{ADMIN_ID}}", "CHANNEL": "{{CHANNEL}}",
"$db_host": "{{DB_HOST}}", "$db_name": "{{DB_NAME}}", "$db_user": "{{DB_USER}}", "$db_pass": "{{DB_PASS}}",
"WEBHOOK_SECRET": "{{WEBHOOK_SECRET}}" } }
],
"database": { "engine": "mysql", "import": "database.sql" },
"webhook": { "path": "bot.php", "token_param": "BOT_TOKEN" },
"cron": [ { "schedule": "*/5 * * * *", "command": "php cron.php" } ]
}ربات پایتون (aiogram / telebot / python-telegram-bot) با polling
{
"type": "telegram-polling",
"language": "python",
"requires": { "python": ">=3.10" },
"install": { "pip": "requirements.txt" },
"params": [
{ "key": "BOT_TOKEN", "label": "توکن ربات", "type": "telegram_token" },
{ "key": "ADMINS", "label": "آیدی ادمینها (با کاما)", "type": "telegram_id" },
{ "key": "SECRET_KEY", "label": "کلید رمزنگاری", "type": "secret", "generate": "hex32", "required": false }
],
"env": { "file": ".env", "from": ".env.example", "vars": {
"BOT_TOKEN": "{{BOT_TOKEN}}", "ADMINS": "{{ADMINS}}", "SECRET_KEY": "{{SECRET_KEY}}" } },
"run": { "command": "python bot.py" },
"persist": ["data"]
}ربات پایتون با وبهوک (aiohttp / FastAPI)
{
"type": "telegram-webhook",
"language": "python",
"install": { "pip": "requirements.txt" },
"params": [ { "key": "BOT_TOKEN", "label": "توکن ربات", "type": "telegram_token" } ],
"env": { "vars": { "BOT_TOKEN": "{{BOT_TOKEN}}", "WEBHOOK_SECRET": "{{WEBHOOK_SECRET}}", "PORT": "{{PORT}}" } },
"webhook": { "path": "webhook", "token_param": "BOT_TOKEN" },
"web": { "port": 8080 },
"run": { "command": "python main.py" }
}ربات Node.js (Telegraf / grammY)
{
"type": "telegram-polling",
"language": "node",
"requires": { "node": ">=20" },
"install": { "npm": true },
"params": [ { "key": "BOT_TOKEN", "label": "توکن ربات", "type": "telegram_token" } ],
"env": { "vars": { "BOT_TOKEN": "{{BOT_TOKEN}}" } },
"run": { "command": "node index.js" }
}سایت لاراول (یا هر سایت PHP با composer)
{
"type": "web",
"language": "php",
"requires": { "php": ">=8.2", "extensions": ["mbstring", "xml", "pdo_mysql", "bcmath", "intl"] },
"install": { "composer": true },
"params": [
{ "key": "ADMIN_EMAIL", "label": "ایمیل مدیر", "type": "email" },
{ "key": "APP_KEY", "label": "کلید برنامه", "type": "secret", "generate": "laravel_key", "required": false }
],
"env": { "file": ".env", "from": ".env.example", "vars": {
"APP_URL": "{{APP_URL}}", "APP_ENV": "production", "APP_DEBUG": "false",
"DB_HOST": "{{DB_HOST}}", "DB_PORT": "{{DB_PORT}}", "DB_DATABASE": "{{DB_NAME}}",
"DB_USERNAME": "{{DB_USER}}", "DB_PASSWORD": "{{DB_PASS}}", "ADMIN_EMAIL": "{{ADMIN_EMAIL}}",
"APP_KEY": "{{APP_KEY}}" } },
"database": { "engine": "mysql" },
"web": { "root": "public" },
"post_install": ["php artisan migrate --force", "php artisan storage:link"],
"cron": [ { "schedule": "* * * * *", "command": "php artisan schedule:run" } ],
"persist": ["storage"]
}سایت/API با Node.js (Express) یا Flask
{
"type": "web",
"language": "node",
"install": { "npm": true },
"params": [ { "key": "API_KEY", "label": "کلید API سرویس پرداخت", "type": "secret" } ],
"env": { "vars": { "PORT": "{{PORT}}", "API_KEY": "{{API_KEY}}", "BASE_URL": "{{APP_URL}}" } },
"web": { "port": 3000 },
"run": { "command": "npm start" }
}
نکتهها و امنیت
- ربات وبهوک را با هدر
X-Telegram-Bot-Api-Secret-Tokenبرابر{{WEBHOOK_SECRET}}بررسی کنید تا درخواست جعلی پردازش نشود. - ربات polling نباید همزمان وبهوک داشته باشد؛ ستاپ خودش
deleteWebhookمیزند. - برنامهی پایتون/Node وب باید روی
127.0.0.1:$PORTگوش دهد؛ nginx درخواستها را میفرستد. - فایلهای
.env،.sql،.sqlite،vendor/و فایلهای نقطهدار از وب قابل دانلود نیستند (nginx میبندد). روی cPanel خودتان با.htaccessمحافظت کنید. - دستورهای
install.commands،post_install،runوcronبا کاربر محدود برنامه اجرا میشوند، به خریدار قبل از شروع نشان داده میشوند و مثل بقیهی کد در بررسی نسخه توسط مدیر دیده میشوند. - symlink داخل سورس پشتیبانی نمیشود (هنگام ستاپ حذف میشود). فایل SQL با کاربر محدود دیتابیس import میشود.
- هاست اشتراکی cPanel پروسهی دائمی ندارد: رباتهای polling، پایتون و Node فقط روی VPS نصب میشوند.
- قبل از انتشار، از تب «ستاپ خودکار» سورس خودتان گزینهی تست ستاپ روی شاخه را روی یک سرور تست اجرا کنید.