PSC پی اس سی گیم
فنی

راهنمای فنی سرور

برای کسی که سایت را روی سرور نگه می‌دارد. کوتاه و بدون توضیح اضافه: داده کجاست، پشتیبان چطور گرفته می‌شود، چطور ری‌استارت می‌شود.

فهرست بخش‌ها
  1. ساختار پروژه
  2. نصب و اجرا
  3. داده‌ها
  4. پشتیبان‌گیری
  5. فایل‌های رسانه
  6. دسترسی مدیریت
  7. نکته‌های شناخته‌شده
  8. چک‌لیست پیش از تحویل
درباره این صفحه هر چیزی که با TODO(deploy) علامت خورده، در زمان نوشتن این راهنما مشخص نبود. آن‌ها را مهندسِ مستقرکننده پر می‌کند. چیزی که نوشته شده، از خود مخزن کد خوانده شده است.

۱. ساختار پروژه

فریم‌ورکNext.js 16 — App Router، React 19، TypeScript
استایلTailwind 4
پکیج‌منیجرpnpm (نسخه پین‌شده در package.json)
دیتابیسندارد. همه‌چیز در فایل JSON.
خروجی بیلدstandalone — یعنی .next/standalone/server.js
مسیر سایت~/Projects/saeed-site

چون داده در فایل است، هر صفحه‌ای که از داده می‌خواند بعد از هر ذخیره با revalidatePath تازه می‌شود. لازم نیست بعد از تغییر محتوا بیلد بگیرید. فقط تغییر کد بیلد و ری‌استارت می‌خواهد.

۲. نصب و اجرا

دستی

cd ~/Projects/saeed-site
pnpm install
pnpm build
PORT=3300 pnpm start        # http://127.0.0.1:3300

برای توسعه، pnpm dev را بزنید. پورت پیش‌فرضش ۳۰۰۰ است؛ اگر پورت دیگری خواستید، با متغیر PORT بدهید.

داکر

یک Dockerfile در ریشه پروژه هست: بیلد چندمرحله‌ای، خروجی standalone، کاربر غیر روت، PORT=3300، و پوشه data/ که باید از هاست مانت شود تا پنل بتواند در آن بنویسد.

docker build -t pscgame .
docker run -d --name pscgame -p 3300:3300 \
  -v /srv/pscgame/data:/app/data \
  -v /srv/pscgame/public/catalog:/app/public/catalog \
  pscgame

مسیرهای مانت نمونه‌اند. روی سرور واقعی، همان مسیرهایی را بگذارید که فایل‌ها در آن‌ها هستند.

TODO(deploy) سرور واقعی pcsgame.nexushost.ir روی چه سرویسی اجرا می‌شود؟ (systemd / docker compose / pm2)
دستور دقیق ری‌استارت:
TODO(deploy): systemctl restart ... / docker compose up -d --build / ...
محل کانفیگ nginx یا پروکسی و مسیر گواهی TLS:
TODO(deploy): /etc/nginx/...
مسیر پوشه پروژه روی سرور: TODO(deploy)
نسخه نود روی سرور: TODO(deploy) (ایمیج داکر از node:22-alpine استفاده می‌کند)

وضعیت روی این ماشین

هنگام نوشتن این راهنما، سایت روی همین ماشین با یک پروسه next-server روی پورت ۳۳۰۰ اجرا می‌شد، از پوشه ~/Projects/saeed-site، دستی و بدون سرویس مدیریت‌شده. هیچ سرویس systemd یا یونیت کاربری برایش پیدا نشد. یعنی با ری‌استارت ماشین، سایت هم بالا نمی‌آید. برای سرور واقعی این باید درست شود.

۳. داده‌ها

دو فایل، تمام حالت سایت را نگه می‌دارند:

data/catalog.json محصول‌ها، دسته‌بندی‌ها، برندها، تنظیمات (از جمله رمز پنل و مرچنت‌کد)، کاشی‌های صفحه اصلی، ترتیب ردیف‌ها، سفارش‌ها، نظرات، هشدارهای موجودی، درخواست محصول و مقاله‌های بلاگ.
data/story.json بخش‌های استوری هر محصول، کلیدش اسلاگ محصول است.

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

مهم داده در فایل است، نه دیتابیس. یعنی دو نوشتن همزمان می‌توانند روی هم بیفتند. برای این حجم ترافیک کافی است، ولی اگر سفارش‌ها زیاد شد، مهاجرت به Postgres فقط با عوض کردن src/lib/store.ts انجام می‌شود.

فایل‌های دیگری هم در data/ هست: seed.json، specs-i18n.json، story-i18n.json و پوشه‌های خام مرجع. آن‌ها برای ساخت اولیه بودند و برای اجرای سایت لازم نیستند. حذفشان نکنید تا زمانی که مطمئن شدید کسی به آن‌ها نیاز ندارد.

۴. پشتیبان‌گیری

دو فایل را کپی کنید. تمام.

cd ~/Projects/saeed-site
mkdir -p /var/backups/pscgame
cp data/catalog.json "/var/backups/pscgame/catalog-$(date +%F-%H%M).json"
cp data/story.json   "/var/backups/pscgame/story-$(date +%F-%H%M).json"

اگر عکس‌های آپلودشده مهم‌اند، این دو پوشه را هم بردارید:

tar czf "/var/backups/pscgame/media-$(date +%F).tar.gz" \
  public/catalog public/media public/uploads

بازگرداندن

  1. فایل پشتیبان را روی فایل فعلی کپی کنید.
  2. سایت را ری‌استارت کنید. دلیلش کش درون‌حافظه‌ای است: کد فایل را بر اساس زمان تغییر می‌شناسد، ولی ری‌استارت مطمئن‌ترین راه است.
  3. در پنل یک محصول را باز کنید و ببینید محتوا برگشته باشد.
پیشنهاد یک کرون شبانه برای پشتیبان و نگه‌داشتن ۳۰ نسخه آخر کافی است. حتماً نسخه‌ای را بیرون از همان سرور هم نگه دارید.

۵. فایل‌های رسانه

public/catalog/عکس محصول‌ها و لوگوی برندها. حدود ۱۴۵ مگابایت.
public/catalog/story/عکس و ویدیوی آپلودشده از ویرایشگر استوری.
public/media/ویدیوهای کاشی‌های صفحه اصلی.
public/uploads/عکس‌هایی که مشتری با نظر می‌فرستد (حداکثر ۴ فایل، هر کدام ۴ مگابایت).

فایل‌های public/ داخل ایمیج داکر کپی می‌شوند. اگر می‌خواهید آپلودها بعد از بیلد تازه بمانند، پوشه‌ها را مانت کنید (در بخش ۲ نمونه‌اش هست).

آپلود استوری به ffmpeg و magick روی سرور نیاز دارد (عکس به webp، ویدیو به mp4 بدون صدا). اگر این دو نصب نباشند، آپلود با پیام «تبدیل فایل نشد» رد می‌شود.

۶. دسترسی مدیریت

کاهش ریسک سایت را فقط روی HTTPS سرو کنید. رمز بلند بگذارید. فایل data/catalog.json را از دسترس عمومی بیرون نگه دارید (داخل data/ است، نه public/ — همین‌طور بماند).

۷. نکته‌های شناخته‌شده

۸. چک‌لیست پیش از تحویل

  1. رمز پنل از psc-admin عوض شود.
  2. مرچنت‌کد واقعی در پنل ذخیره شود و تیک sandbox برداشته شود.
  3. یک خرید واقعی کوچک تست شود؛ سفارش باید paid شود.
  4. سرویس مدیریت‌شده برای سایت ساخته شود تا بعد از ری‌استارت بالا بیاید.
  5. کرون پشتیبان برای catalog.json و story.json.
  6. HTTPS و ریدایرکت از http.
  7. پوشه‌های data/ و public/catalog/ مانت‌شده و قابل نوشتن برای کاربر اجرا.
  8. ffmpeg و magick روی سرور نصب باشند.
  9. بخش‌های TODO(deploy) این صفحه پر شوند.