شروع کنید
نصب Pitchbar (میزبانی اختصاصی)
این راهنما شما را از یک سرور تازه تا یک نصب فعال Pitchbar با یک حساب مدیریتی، یک دستیار فروش منتشرشده و ویجتی که در یک صفحه آزمایشی پاسخ میدهد، راهنمایی میکند. اگر سرور شما قبلاً با PHP، Node، یک پایگاه داده و Redis تأمین شده است، انتظار ۲۰ تا ۴۰ دقیقه را داشته باشید.
۱. نیازمندیهای سرور
| کامپوننت | حداقل | توضیحات |
|---|---|---|
| PHP | ۸.۳+ | ۸.۴ توصیه میشود. افزونهها: bcmath، curl، fileinfo، gd، intl، mbstring، openssl، pdo_pgsql (یا pdo_mysql)، tokenizer، xml، zip. |
| Composer | ۲.۶+ | برای نصب وابستگیهای PHP استفاده میشود. |
| Node.js | ۲۰+ | برای ساخت برنامه SPA مدیریت و ویجت بازدیدکننده استفاده میشود. |
| پایگاه داده | PostgreSQL ۱۴+ یا MySQL ۸.۰+ | Postgres هدف اصلی است. |
| Redis | ۷+ | کش، نشستها، صف، کش بازیابی مسیر اصلی. |
| RAM / CPU | ۲ vCPU / ۲ گیگابایت | یک برنامه + یک فرآیند پردازشگر. اگر آنها را روی یک ماشین اجرا میکنید، مقیاس را افزایش دهید. |
| دیسک | ۱۰ گیگابایت+ | حجم برنامه + لاگ. ذخیرهساز جستجوی هوشمند در Cloudflare / Qdrant قرار دارد، نه روی دیسک. |
| TLS | HTTPS | ویجت برای بارگذاری در سایتهای مشتری به یک مبدأ HTTPS نیاز دارد. از Caddy / Nginx / Cloudflare در جلوی FrankenPHP استفاده کنید. |
| SMTP | هر سرویسدهندهای | Postmark / Resend / SES / SMTP خودتان. برای بازنشانی رمز عبور، اعلانهای مشتری و رسیدهای صورتحساب الزامی است. |
حسابهای خارجی مورد نیاز
- حداقل یک سرویسدهنده هوش مصنوعی — Cloudflare Workers AI ارزانترین است و ما آن را توصیه میکنیم (چت + جستجوی هوشمند + ذخیرهساز جستجوی هوشمند + خزنده مرورگر همه در یک قبض). OpenAI بهعنوان جایگزین کار میکند. OpenRouter نیز کار میکند و یک مدل Llama 3.3 رایگان ارائه میدهد.
- یک ذخیرهساز جستجوی هوشمند — Cloudflare Vectorize (ترجیح داده میشود، با حساب Cloudflare یکسان است) یا یک نمونه Qdrant خودمیزبانی.
- اختیاری: Stripe برای صورتحساب مشتریان، و Sentry / Honeycomb برای گزارش خطا / ردگیری.
۲. دریافت کد روی سرور
بسته منبعی که دانلود کردهاید (زیپ CodeCanyon) را در ریشه سند آپلود کنید، یا مخزن خصوصی خود را کلون کنید. همه موارد در این راهنما فرض میکنند که در داخل دایرکتوری پروژه هستید.
cd /var/www/pitchbar # یا هر جایی که زیپ را باز کردهاید
composer install --no-dev --optimize-autoloader
cp .env.example .env
php artisan key:generate
php artisan key:generate یک APP_KEY جدید در .env مینویسد. به محض تولید، از این مقدار پشتیبان بگیرید — هر ستون رمزگذاریشده در app_settings (کلیدهای Stripe / Cloudflare / OpenAI که در مرحله ۷ وارد میکنید) با این کلید مهر و موم میشود. از دست دادن آن به معنای از دست دادن آن اسرار است.
۳. پیکربندی اتصال پایگاه داده
.env را ویرایش کرده و بلوک پایگاه داده را پر کنید. پیشفرضها به یک Postgres محلی Docker اشاره میکنند؛ به میزبان واقعی خود تغییر دهید.
DB_CONNECTION=pgsql # یا mysql
DB_HOST=127.0.0.1
DB_PORT=5432
DB_DATABASE=pitchbar
DB_USERNAME=pitchbar
DB_PASSWORD=…رمز-عبور-قوی…
اگر پایگاه داده وجود ندارد، ابتدا آن را ایجاد کنید:
createdb -U postgres pitchbar
# یا، MySQL:
mysql -uroot -p -e "CREATE DATABASE pitchbar CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
۴. پر کردن بقیه .env
هر کلیدی که بعداً میتوانید از طریق رابط مدیریت تغییر دهید — Stripe، PayPal، Razorpay، Cloudflare، OpenAI، OpenRouter، ایمیل، برندینگ — میتواند در .env خالی گذاشته شود و بهجای آن در مدیریت وب وارد شود. کلیدهای زیر مواردی هستند که برنامه قبل از باز کردن مدیریت، در زمان راهاندازی به آنها نیاز دارد.
| متغیر | مقدار |
|---|---|
APP_URL | آدرس عمومی HTTPS که برنامه را از آن ارائه میدهید، مانند https://app.example.com. برای ساخت قطعههای ویجت، بازخوانی OAuth و آدرسهای امضا شده استفاده میشود. |
APP_NAME | نام نمایشی که در نوار عنوان و ایمیلها نشان داده میشود. |
APP_ENV | production. |
APP_DEBUG | false. |
REDIS_HOST / REDIS_PORT / REDIS_PASSWORD | اتصال Redis. |
SESSION_DRIVER / CACHE_STORE / QUEUE_CONNECTION | همه redis در تولید. |
WIDGET_JWT_SECRET | کلید مخفی امضای HS256 برای JWT جلسات بازدیدکننده. openssl rand -hex 32 را اجرا کرده و نتیجه را وارد کنید. آن را روی پیشفرض نگذارید. |
BROADCAST_CONNECTION | reverb اگر صندوق ورودی بیدرنگ و تحویل چت زنده را میخواهید. برای غیرفعال کردن روی null تنظیم کنید. |
REVERB_APP_ID / REVERB_APP_KEY / REVERB_APP_SECRET | توکنهای تصادفی برای شناسایی برنامه Reverb. رشتههای جدید تولید کنید. |
REVERB_HOST | نام میزبان عمومی برای فرآیند WebSocket — همان دامنه APP_URL در صورت پراکسی معکوس WS روی همان میزبان. |
REVERB_SCHEME | wss در تولید. |
MAIL_FROM_ADDRESS / MAIL_FROM_NAME | هویت فرستنده برای ایمیلهای خروجی. الزامی. |
مرجع کامل هر متغیر در متغیرهای محیطی موجود است.
کلیدهای سرویسدهنده هوش مصنوعی (همچنین میتوانید بعداً آنها را در مدیریت وارد کنید)
حداقل یکی از این موارد را تنظیم کنید تا یک دستیار فروش تازه ایجاد شده بتواند پاسخ دهد. اتصالدهنده خودکار به ترتیب Cloudflare → OpenRouter → OpenAI را براساس کلیدهای موجود انتخاب میکند.
# Cloudflare Workers AI (ترجیح داده میشود)
CLOUDFLARE_ACCOUNT_ID=
CLOUDFLARE_API_TOKEN=
CLOUDFLARE_VECTORIZE_INDEX=pitchbar-chunks
# یا OpenAI
OPENAI_API_KEY=
# یا OpenRouter (مدل Llama 3.3 رایگان موجود است)
OPENROUTER_API_KEY=
LLM_PROVIDER=openrouter # برای انتخاب OpenRouter الزامی است
VectorizeClient::ensureCollection idempotent است، بنابراین اجرای مجدد مراحل نصب ایمن است.
۵. اجرای مهاجرتها و تغذیه پلنها
php artisan migrate --force
php artisan db:seed --class=PlanSeeder --force
PlanSeeder چهار ردیف پلن ایجاد میکند که سیستم صورتحساب میخواند — free، standard، pro و custom (سازمانی / تماس با فروش). idempotent است — اجرای مجدد آن پلنها را تکرار نمیکند. قیمتگذاری، سقف مکالمات و شناسههای قیمت Stripe را پس از تغذیه در مدیریت /admin/plans ویرایش کنید.
در تولید از UserSeeder صرفنظر کنید. حسابهای دمو admin@mail.com / customer@mail.com را با رمز عبور عمومی password ایجاد میکند — برای توسعه محلی خوب است، اما در یک استقرار عمومی یک در باز است.
۶. ساخت بستههای فرانتاند
npm ci
npm run build # برنامه SPA مدیریت اینرسی → public/build/
npm run build:widget # ویجت بازدیدکننده → public/widget/widget.js
php artisan storage:link # لینک نمادین public/storage → storage/app/public
php artisan optimize # کش مسیرها، پیکربندی، ویوها
هر دو خروجی ساخت در کنار کد منبع در مصنوع استقرار ما ثبت میشوند (زیپ CodeCanyon شامل آنها بهصورت از پیش ساخته شده است)، اما اجرای مجدد روی سرور تضمین میکند که بسته با نسخه PHP کدی که آپلود کردهاید مطابقت دارد.
۷. اجرای برنامه و پردازشگرها
Pitchbar روی Laravel Octane + FrankenPHP برای سرور HTTP، Horizon برای صف و Reverb برای کانال بیدرنگ WebSocket اجرا میشود. هر سه باید فرآیندهای تحت نظارت باشند؛ در اینجا حداقل شکل برای یک نصب تکمیزبانی با استفاده از systemd آورده شده است.
سرور برنامه
# /etc/systemd/system/pitchbar-app.service
[Unit]
Description=Pitchbar Octane (FrankenPHP)
After=network.target redis.service postgresql.service
[Service]
Type=simple
User=www-data
WorkingDirectory=/var/www/pitchbar
ExecStart=/usr/bin/php artisan octane:start --server=frankenphp --host=0.0.0.0 --port=8000 --workers=4
Restart=always
[Install]
WantedBy=multi-user.target
پایانه TLS خود (Caddy، Nginx، پراکسی Cloudflare) را در جلو قرار دهید و به 127.0.0.1:8000 اشاره کنید. پراکسی معکوس چیزی است که https://app.example.com را به عموم ارائه میدهد؛ فرآیند Octane فقط به لوکالهوست متصل میشود.
پردازشگر صف
# /etc/systemd/system/pitchbar-horizon.service
[Unit]
Description=Pitchbar Horizon queue worker
After=network.target redis.service
[Service]
Type=simple
User=www-data
WorkingDirectory=/var/www/pitchbar
ExecStart=/usr/bin/php artisan horizon
Restart=always
[Install]
WantedBy=multi-user.target
Horizon بهطور پیشفرض بر صفهای crawl / index / default نظارت میکند. سلامت صف را از مدیریت پلتفرم در /admin/queue-health بررسی کنید.
فرآیند WebSocket
# /etc/systemd/system/pitchbar-reverb.service
[Unit]
Description=Pitchbar Reverb WebSocket server
After=network.target
[Service]
Type=simple
User=www-data
WorkingDirectory=/var/www/pitchbar
ExecStart=/usr/bin/php artisan reverb:start --host=0.0.0.0 --port=8080
Restart=always
[Install]
WantedBy=multi-user.target
wss://realtime.example.com (یا همان دامنه در مسیر متفاوت) را به 127.0.0.1:8080 پراکسی معکوس کنید. اگر BROADCAST_CONNECTION=null تنظیم کردهاید، از این فرآیند صرفنظر کنید — صندوق ورودی زنده و قابلیتهای تحویل انسانی را از دست خواهید داد.
فعالسازی و شروع همه چیز
sudo systemctl daemon-reload
sudo systemctl enable --now pitchbar-app pitchbar-horizon pitchbar-reverb
۸. اتصال زمانبند cron
چندین وظیفه براساس زمانبندی اجرا میشوند — بازخوانی اسکنهای قدیمی، همگامسازی منابع OAuth، انتشار مکالمات "نیاز به کارشناس" قدیمی، پیشنهاد پاسخهای دستی از شکافها. یکی از دو گزینه زیر را انتخاب کنید.
گزینه A — cron میزبان (سادهترین)
یک خط به crontab root (یا کاربری که فایلهای پروژه را در اختیار دارد) اضافه کنید:
* * * * * cd /var/www/pitchbar && php artisan schedule:run >> /dev/null 2>&1
گزینه B — پردازشگر Cron Cloudflare
Pitchbar میتواند یک پردازشگر Cloudflare را مستقر کند که هر دقیقه به نقطه پایانی /api/v1/internal/queue-tick نصب شما درخواست میزند، بنابراین اصلاً نیازی به cron میزبان ندارید. برای استقرارهای بدون سرور که هیچ فرآیندی نمیتواند بهطور دورهای اجرا شود، مفید است.
پس از وارد کردن شناسه حساب و توکن API Cloudflare در تنظیمات ← سیستم (مرحله بعد)، تنظیمات ← سیستم ← پردازشگر Cron را باز کرده و روی استقرار کلیک کنید. وضعیت در /settings/system/cron-worker/status گزارش میشود.
۹. ایجاد اولین مدیر
بهروش عادی در {APP_URL}/register ثبتنام کنید. Pitchbar بهطور خودکار اولین فضای کاری را برای شما ایجاد میکند. سپس حساب خود را از خط فرمان به مدیر ارشد ارتقا دهید تا بتوانید به مدیریت پلتفرم دسترسی پیدا کرده و کلیدهای سیستم را وارد کنید.
php artisan pitchbar:make-admin you@example.com
خارج شده و دوباره وارد شوید؛ /admin و تنظیمات ← سیستم اکنون در نوار کناری قابل مشاهده هستند.
۱۰. وارد کردن کلیدهای سیستم از طریق مدیریت (توصیه میشود)
بهعنوان مدیر ارشد، تنظیمات ← سیستم را باز کنید. موارد زیر را وارد کنید:
- Cloudflare — شناسه حساب + توکن API + نام شاخص Vectorize + آدرس درگاه هوش مصنوعی (اختیاری).
- OpenAI — کلید (پشتیبان اختیاری).
- OpenRouter — کلید (اختیاری، مدل Llama 3.3 رایگان).
- Stripe — کلید عمومی + مخفی + کلید مخفی امضای وبهوک (اختیاری، برای صورتحساب).
- PayPal / Razorpay — اگر درگاههای پرداخت اضافی میخواهید.
- ایمیل — اعتبارنامههای SMTP / API.
- برندینگ — "قدرت گرفته از Pitchbar" را با برچسب، لوگوی فوتر و آدرس هدف خود جایگزین کنید.
هر بخش یک دکمه تست دارد که با کلیدی که تازه وارد کردهاید با API بالادستی ارتباط برقرار میکند — تست ایمیل یک ایمیل واقعی ارسال میکند، تست هوش مصنوعی یک تکمیل چت کوچک را فراخوانی میکند، تست Stripe به ریشه API Stripe درخواست میزند و غیره. قبل از ذخیره از اینها استفاده کنید تا یک کلید اشتباه را بلافاصله بهجای اولین ثبتنام مشتری، تشخیص دهید.
APP_KEY نیاز به یک مهاجرت دستی دارد. ستونهای رمزگذاریشده در app_settings با مقدار APP_KEY در زمان وارد کردن آنها مهر و موم شدهاند؛ چرخش بدون رمزگذاری مجدد آنها را غیرقابل خواندن میکند و باید هر کلید را دوباره وارد کنید.
۱۱. تست اولیه نصب
- از
{APP_URL}/adminبازدید کرده و تأیید کنید که داشبورد پلتفرم بدون بنرهای قرمز نمایش داده میشود. - از تنظیمات ← سیستم، روی هر دکمه تست کلیک کنید (ایمیل، هوش مصنوعی، Stripe). هر کدام باید موفقیت را گزارش دهند.
- از فضای کاری خود، شروع سریع را اجرا کنید: یک دستیار فروش ایجاد کنید، یک منبع دانش از سایت خود اضافه کنید، منتظر بمانید تا به پردازششده تغییر کند، دستیار فروش را منتشر کنید، قطعه نصب را در یک صفحه آزمایشی قرار دهید.
- صفحه آزمایشی خود را در یک پنجره ناشناس باز کنید. از دستیار فروش سوالی بپرسید که باید از صفحهای که پردازش کردهاید پاسخ داده شود. باید توکنهای پخش جریانی و یک ارجاع را در حدود ۱ ثانیه ببینید.
/admin/queue-healthرا بررسی کنید — صفهای crawl + index باید در حال تخلیه باشند، بدون وظیفه ناموفق.
عیبیابی
| نشانه | راهحل |
|---|---|
Illuminate\Foundation\ViteException: Unable to locate file in Vite manifest |
npm run build را رد کردهاید یا تغییراتی را در resources/js/ بدون بازسازی اعمال کردهاید. npm run build + npm run build:widget را اجرا کنید. |
| دستیار فروش حتی با منابع پردازششده پاسخ "اطلاعات کافی ندارم" میدهد | احتمالاً عدم تطابق آستانه اطمینان. bge-base-en-v1.5 کلودفلر در ۰.۵۵–۰.۶۵ اوج میگیرد، OpenAI بالاتر است. برگه پیشرفته دستیار فروش را باز کرده و confidence_threshold را برای نصبهای پشتیبان Cloudflare به 0.5 کاهش دهید. دستیاران فروش جدید این پیشفرض را بهطور خودکار دریافت میکنند. |
| اسکریپت ویجت بارگذاری میشود اما هرگز در سایتهای مشتری باز نمیشود | دستیار فروش ← تنظیمات ← دامنههای مجاز را بررسی کنید. هر ورودی بهصورت دقیق با هدر Origin صفحه تطابق داده میشود؛ یک لیست خالی به معنای رد همهجا است. مشاهده کنید دامنههای مجاز. |
صف تخلیه نمیشود؛ /admin/queue-health عمق در حال رشد را نشان میدهد |
فرآیند Horizon در حال اجرا نیست یا در اتصال صحیح مشترک نشده است. sudo systemctl status pitchbar-horizon → بررسی کنید که فعال (در حال اجرا) باشد؛ QUEUE_CONNECTION در .env باید redis باشد. |
| صندوق ورودی زنده در زمان واقعی بروزرسانی نمیشود | فرآیند Reverb در حال اجرا نیست یا پراکسی معکوس WS متصل نیست. REVERB_HOST + REVERB_PORT را بررسی کنید که با آنچه پراکسی معکوس شما ارسال میکند مطابقت داشته باشد؛ در کنسول مرورگر، باید یک ارتقای wss://… موفق را ببینید. |
"اسکن ناموفق: …" در هر منبع |
احتمالاً هیچ سرویسدهنده هوش مصنوعی پیکربندی نشده است. تنظیمات ← سیستم ← Cloudflare و روی تست هوش مصنوعی کلیک کنید. ستون خطا در منبع برای مشتریان پالایش میشود؛ مدیران ارشد پیام خام بالادستی را در صفحه جزئیات منبع میبینند. |
Failed to load PostCSS config در حین npm run build |
احتمالاً npm install --production را اجرا کردهاید. ساخت به وابستگیهای توسعه نیاز دارد — npm ci را با پرچمهای پیشفرض دوباره اجرا کنید. |
مرحله بعدی چیست؟
.env — الزامی، اختیاری و قابل لغو در پلتفرم.