سورس کده

راهنمای ستاپ خودکار برای توسعه‌دهندگان

با گذاشتن یک فایل 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 را بساز یا کامل کن، توکن‌ها و تنظیمات را به پارامتر تبدیل کن و چک‌لیست آخر فایل را انجام بده.

اگر پروژه را روی سورس‌کده گذاشته‌اید، در تب «ستاپ خودکار» همان سورس نسخه‌ی مخصوص پروژه‌ی شما (همراه مانیفست پیشنهادی و خطاهایی که باید رفع شود) را دانلود کنید.

چه اتفاقی می‌افتد؟

  1. آماده‌سازی (روی سورس‌کده): کد نسخه‌ی تأییدشده استخراج و پارامترها داخل فایل‌ها نوشته می‌شود (files، env).
  2. 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 → بررسی سلامت.
  3. cPanel: ساخت دیتابیس با API سی‌پنل → ساخت vendor روی سورس‌کده → آپلود به پوشه‌ی دامنه → یک نصب‌کننده‌ی یک‌بارمصرف PHP (کلیددار، ۲۰ دقیقه انقضا، خودش را پاک می‌کند) نسخه‌ی PHP و افزونه‌ها را چک، فایل‌ها را استخراج و SQL را import می‌کند → cron با API.
  4. تلگرام: توکن با getMe بررسی می‌شود؛ برای وبهوک setWebhook با secret_token (و در حالت بدون دامنه، آپلود گواهی self-signed روی IP)، برای polling deleteWebhook.

نصب دوباره = به‌روزرسانی: نسخه‌ی قبلی بکاپ می‌شود (.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وب‌سایت یا API
  • workerسرویس پس‌زمینه‌ی همیشه روشن (فقط VPS)
  • scriptاسکریپتی که یک بار اجرا می‌شود
languagestringلازم

زبان برنامه.

  • phpPHP؛ روی VPS یا هاست cPanel
  • pythonPython؛ فقط VPS
  • nodeNode.js؛ فقط VPS
namestring

نام نمایشی برنامه. اختیاری.

  • مجاز حداکثر 80 حرف

requires

requiresobject

پیش‌نیازهای سرور. پیش از نصب با سرور خریدار سنجیده می‌شود.

requires.phpstring

حداقل نسخه‌ی PHP، مثل ">=8.1".

  • مجاز فقط حداقل نسخه (>=)
requires.pythonstring

حداقل نسخه‌ی پایتون، مثل ">=3.10".

  • مجاز فقط حداقل نسخه (>=)
requires.nodestring

حداقل نسخه‌ی Node.js، مثل ">=20".

  • مجاز فقط حداقل نسخه (>=)
requires.extensionsarray<string>

افزونه‌های PHP لازم، مثل curl، mbstring و pdo_mysql.

  • مجاز حداکثر 40 مورد · هر مورد: ^[a-z0-9_]{2,30}$
requires.aptarray<string>

بسته‌های سیستمی که روی VPS با apt نصب می‌شوند، مثل ffmpeg.

  • مجاز حداکثر 40 مورد · هر مورد: ^[a-z0-9][a-z0-9.+-]{1,60}$
requires.osarray<string>

سیستم‌عامل‌هایی که برنامه رویشان کار می‌کند، مثل ubuntu و debian.

  • مجاز حداکثر 40 مورد · هر مورد: ^[a-z]{3,20}$
requires.memory_mbinteger

حداقل حافظه‌ی لازم به مگابایت. ۰ یعنی بدون حداقل.

  • پیش‌فرض 0
  • مجاز از 0 تا 65536
requires.disk_mbinteger

حداقل فضای دیسک لازم به مگابایت. ۰ یعنی بدون حداقل.

  • پیش‌فرض 0
  • مجاز از 0 تا 1048576

install

installobject

نصب وابستگی‌ها. کلیدی که به زبان برنامه ربط ندارد نادیده گرفته می‌شود.

install.composerboolean

اجرای composer install (فقط PHP).

  • پیش‌فرض اگر composer.json باشد true
install.pipstring | boolean

وابستگی‌های پایتون: مسیر فایل requirements، یا "." برای pyproject.toml/setup.py؛ true یعنی requirements.txt و false یعنی هیچ (فقط Python).

  • پیش‌فرض اگر requirements.txt باشد همان
install.npmboolean

اجرای npm install (فقط Node).

  • پیش‌فرض اگر package.json باشد true
install.commandsarray<string>

دستورهای نصب اضافه. با کاربر برنامه و در پوشه‌ی برنامه اجرا می‌شوند.

  • مجاز حداکثر 20 مورد · هر مورد: یک خط، حداکثر ۵۰۰ حرف

params

paramsarray<object>

مقدارهایی که خریدار هنگام ستاپ وارد می‌کند (توکن، آیدی ادمین، …). هر کدام با {{KEY}} در files، env، run، cron و دستورها جایگزین می‌شود.

  • مجاز حداکثر 40 مورد
params[].keystringلازم

نام پارامتر، مثل BOT_TOKEN. نام‌های سیستمی (مثل DB_PASS) مجاز نیستند چون خودکار پر می‌شوند.

  • مجاز حروف بزرگ انگلیسی، عدد و _؛ با حرف شروع شود؛ تکراری نباشد
params[].labelstring

عنوانی که خریدار در فرم ستاپ می‌بیند. فارسی بهتر است.

  • پیش‌فرض همان key
  • مجاز حداکثر 80 حرف
params[].typestring

نوع مقدار؛ فرم ستاپ مقدار خریدار را بر اساس آن بررسی می‌کند.

  • textمتن ساده
  • secretمتن محرمانه؛ در فرم و لاگ پنهان می‌ماند
  • intعدد صحیح
  • urlآدرس http یا https
  • emailایمیل
  • domainدامنه، مثل example.com
  • boolبله یا خیر (true / false)
  • choiceانتخاب از فهرست options
  • telegram_tokenتوکن ربات از BotFather؛ قالبش بررسی می‌شود
  • telegram_idآیدی عددی تلگرام؛ یک آیدی یا چند آیدی با کاما
  • پیش‌فرض "text"
params[].requiredboolean

خریدار باید پرش کند؟ پارامتر لازمی که default دارد هیچ‌وقت جلوی نصب را نمی‌گیرد.

  • پیش‌فرض true
params[].secretboolean

مقدار در فرم و لاگ پنهان بماند.

  • پیش‌فرض برای secret و telegram_token خودکار true
params[].defaultstring | number | boolean

مقداری که از قبل در فرم پر است.

  • مجاز حداکثر 500 حرف
params[].helpstring

راهنمای کوتاه زیر فیلد، مثل «از @userinfobot بگیرید».

  • مجاز حداکثر 300 حرف
params[].optionsarray<string>لازم برای type: choice

گزینه‌های انتخاب برای type: choice.

  • مجاز حداکثر 30 مورد · هر مورد حداکثر 80 حرف
params[].generatestring

اگر خریدار خالی بگذارد، مقدار خودکار ساخته می‌شود و در نصب‌های بعدی همان می‌ماند؛ برای کلیدهای رمزنگاری به‌جای پرسیدن از خریدار.

  • hex16رشته‌ی هگز ۳۲ حرفی
  • hex32رشته‌ی هگز ۶۴ حرفی
  • base64_32۳۲ بایت تصادفی به base64
  • fernetکلید Fernet (کتابخانه‌ی cryptography پایتون)
  • passwordرمز تصادفی ۲۴ حرفی
  • laravel_keyکلید APP_KEY لاراول (base64:…)
params[].patternstring

الگوی regex بدون /…/ که مقدار خریدار باید با آن جور باشد.

  • مجاز حداکثر 200 حرف

files

filesarray<object>

فایل‌هایی که هنگام نصب ساخته یا مقداردهی می‌شوند.

  • مجاز حداکثر 30 مورد
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 درست.

  • مجاز نام: ^\$?[A-Za-z_][A-Za-z0-9_]{0,60}$

env

envobject

فایل .env و متغیرهای محیطی. روی VPS همین متغیرها به پروسه‌ی run.command هم داده می‌شوند. بدون vars نادیده گرفته می‌شود.

env.filestring

نام فایل env.

  • پیش‌فرض ".env"
  • مجاز الگو: ^[A-Za-z0-9._/-]{1,300}$
env.fromstring

فایل نمونه، مثل .env.example، که پایه‌ی فایل env می‌شود.

  • مجاز الگو: ^(?!/)(?!.*(^|/)\.\.?(/|$))[^\n]{1,300}$
env.varsobject

نام متغیر به مقدار، مثل "BOT_TOKEN": "{{BOT_TOKEN}}".

env.vars.{نام}string | number | boolean

مقدار متغیر؛ معمولاً یک {{KEY}}

  • مجاز نام: ^[A-Za-z_][A-Za-z0-9_]{0,60}$

database

databaseobject

دیتابیس MySQL اختصاصی با کاربر و رمز تصادفی ساخته می‌شود؛ مشخصاتش با {{DB_HOST}}، {{DB_PORT}}، {{DB_NAME}}، {{DB_USER}} و {{DB_PASS}} در دسترس است. یک آبجکت خالی {} هم کافی است.

database.enginestring

موتور دیتابیس.

  • mysqlMySQL یا MariaDB (فعلاً تنها گزینه)
  • پیش‌فرض "mysql"
database.importstring

فایل SQL که فقط وقتی دیتابیس خالی است import می‌شود.

  • مجاز الگو: ^[A-Za-z0-9._/-]{1,300}$

webhook

webhookobject

وبهوک و توکن ربات؛ فقط برای telegram-webhook و telegram-polling.

webhook.pathstring

فایل یا مسیر وبهوک نسبت به ریشه‌ی وب.

  • پیش‌فرض PHP: index.php یا اولین فایل php ریشه
  • مجاز الگو: ^/?[A-Za-z0-9._/-]{1,200}$
webhook.token_paramstring

key پارامتری که توکن ربات است. ربات تلگرام بدون پارامتر توکن نصب نمی‌شود.

  • پیش‌فرض اولین پارامتر telegram_token
  • مجاز الگو: ^[A-Za-z][A-Za-z0-9_]{1,40}$
webhook.drop_pendingboolean

پیام‌های مانده از قبل هنگام ثبت وبهوک دور ریخته شوند.

  • پیش‌فرض true
webhook.allowed_updatesarray<string>

نوع آپدیت‌هایی که تلگرام بفرستد، مثل message و callback_query. خالی یعنی پیش‌فرض تلگرام.

  • مجاز حداکثر 40 مورد · هر مورد: ^[a-z_]{3,40}$

run

runobject

اجرای برنامه به‌صورت سرویس همیشه‌روشن.

run.commandstringلازم برای telegram-polling و worker، و برای web و telegram-webhook پایتون/Node

دستور اجرا، مثل python bot.py، python -m mybot یا npm start.

  • مجاز یک خط، حداکثر ۵۰۰ حرف

web

webobject

تنظیمات وب.

web.rootstring

ریشه‌ی وب نسبت به سورس، مثل public. خالی یعنی خود ریشه.

  • مجاز الگو: ^[A-Za-z0-9._/-]{0,300}$
web.portinteger

پورتی که برنامه‌ی پایتون/Node روی آن گوش می‌دهد. اگر اشغال باشد پورت دیگری در {{PORT}} داده می‌شود؛ پس از {{PORT}} بخوانید.

  • پیش‌فرض پایتون/Node: 8000
  • مجاز از 0 تا 65535

cron

cronarray<object>

کارهای زمان‌بندی‌شده.

  • مجاز حداکثر 10 مورد
cron[].schedulestringلازم

زمان‌بندی cron، مثل "*/5 * * * *"، یا @hourly، @daily، @weekly، @monthly، @reboot.

  • مجاز پنج بخش cron یا یکی از @…
cron[].commandstringلازم

دستوری که در آن زمان اجرا می‌شود، مثل php cron.php.

  • مجاز یک خط، حداکثر ۵۰۰ حرف

post_install

post_installarray<string>

دستورهایی که بعد از نصب اجرا می‌شوند: migrate، ساخت ادمین و … .

  • مجاز حداکثر 20 مورد · هر مورد: یک خط، حداکثر ۵۰۰ حرف

persist

persistarray<string>

مسیرهایی که در نصب دوباره (به‌روزرسانی) از نسخه‌ی قبلی نگه داشته می‌شوند، مثل data، storage یا bot.sqlite.

  • مجاز حداکثر 20 مورد · هر مورد: ^[A-Za-z0-9._/-]{1,300}$

نوع پارامترها

telegram_token (قالب و getMe بررسی می‌شود؛ محرمانه) · telegram_id (عدد یا چند عدد با کاما) · secret (محرمانه؛ در لاگ نمایش داده نمی‌شود) · text · int · bool (true/false) · choice · url · email · domain.

پارامترهای سیستمی (خودکار)

مقداردهی بدون تغییر کد (set)

لازم نیست کدتان را عوض کنید؛ کافی است بگویید کدام ثابت/متغیر چه مقداری بگیرد. سورس‌کده بسته به پسوند فایل این الگوها را پیدا و مقدار را با escape درست جایگزین می‌کند:

برای پارامترهای 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" }
}

نکته‌ها و امنیت