راهنمای عملی دیپلوی // v1.0

از صفر تا لایو
بردن پروژه‌ات روی یک VPS واقعی

یک راهنمای نسبتاً فنی برای کسی که با کمک Claude یا Codex کد می‌نویسه (vibe coding) و حالا می‌خواد اولین سایت یا اپلیکیشنش رو روی یک سرور اوبونتو واقعی، با دامنه‌ی خودش، بیاره بالا.

سطح: مقدماتی تا متوسط
OS: Ubuntu 22.04 LTS
Web Server: Nginx
Database: PostgreSQL
کاربر درخواست yoursite.com DNS این دامنه کجاست؟ 185.10.x.x VPS — Ubuntu Server Nginx :443 فایل‌ها / app process PostgreSQL در صورت نیاز
مسیر یک درخواست: کاربر ← دامنه ← DNS ← IP ← Nginx روی VPS ← فایل یا اپ ← (در صورت نیاز) دیتابیس

قبل از دستورات، بیایید چهار مفهومی که کل این مسیر رو می‌سازن روشن کنیم. اگر همین حالا معنی IP، Domain و DNS رو می‌دونید، می‌تونید مستقیم برید سراغ خرید سرور.

۰۰

مفاهیم پایه، قبل از هر دستوری

پنج مفهومی که در کل این راهنما بارها بهشون برمی‌گردیم.

🖧

VPS چیست؟

Virtual Private Server

یک کامپیوتر واقعی در یک دیتاسنتره که ۲۴ ساعته روشنه و بخشی از منابعش (CPU، رم، دیسک) فقط مال شماست. برخلاف لپ‌تاپ شما، هیچ‌وقت خاموش نمی‌شه.

📍

IP چیست؟

Internet Protocol Address

آدرس دقیق و عددی سرور شما روی اینترنت، مثل 185.10.x.x. هر درخواستی که به سایت شما می‌رسه، در نهایت به همین آدرس ختم می‌شه.

🌐

Domain چیست؟

Domain Name

یک اسم قابل‌خواندن مثل yoursite.com که به‌جای حفظ کردن یک عدد، مردم اونو تایپ می‌کنن.

📖

DNS چیست؟

Domain Name System

مثل یک دفترچه تلفن جهانی: می‌گه دامنه‌ی yoursite.com دقیقاً پشت کدوم IP قرار داره.

🚪

Nginx چیست؟

Web Server / Reverse Proxy

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

🗄

چرا دیتابیس؟

PostgreSQL

فایل‌های HTML ساده نیاز به دیتابیس ندارن، اما هر پروژه‌ای که کاربر، سفارش، یا داده‌ی متغیر داره، نیاز به یک محل ذخیره‌ی ساخت‌یافته و قابل‌اعتماد داره — همون دیتابیس.

IP در برابر DOMAIN
yoursite.com چیزی که آدم‌ها تایپ می‌کنن DNS Lookup دفترچه‌ی تلفن اینترنت 185.10.x.x آدرس واقعی سرور
دامنه فقط یک اسم مستعار برای IP است — چیزی که واقعاً روی اینترنت وجود دارد همان IP است
نکته

برای یک صفحه‌ی ساده‌ی HTML اصلاً نیازی به دیتابیس نیست. دیتابیس رو فقط وقتی اضافه کنید که پروژه‌تون واقعاً داده‌ی پویا (کاربر، فرم، سفارش و…) داره.

01
۰۱

خرید یک سرور VPS

برای شروع، به یک سرور با آدرس IP ثابت نیاز دارید. یکی از گزینه‌های ساده و رایج برای کاربران ایرانی، parspack.com است که سرورهای ابری با پینگ خوب داخل ایران ارائه می‌ده؛ می‌تونید از هر سرویس‌دهنده‌ی دیگه‌ای هم استفاده کنید، مراحل تقریباً یکسانه.

حداقل مشخصات کافی برای یک پروژه‌ی ساده

موردحداقل پیشنهادیتوضیح
سیستم‌عاملUbuntu 22.04 LTSپرکاربردترین و بهترین پشتیبانی از ابزارها
CPU1 vCPUبرای پروژه‌ی شخصی/دمو کافیه
RAM1–2 GBاگر دیتابیس هم روی همین سرور اجرا می‌شه، ۲GB راحت‌تره
فضای دیسک20–25 GB SSDمعمولاً پیش‌فرض پلن‌های پایه
آی‌پیIPv4 ثابتلازمه که ثابت باشه تا دامنه بهش وصل بمونه

بعد از پرداخت، سرویس‌دهنده معمولاً از طریق پنل یا ایمیل سه چیز به شما می‌ده:

هشدار

این سه مورد رو در جای امن نگه دارید و هیچ‌وقت رمز عبور یا کلید سرور رو داخل چت با Claude/Codex یا هر جای دیگه پیست نکنید.

02
۰۲

اتصال به سرور با SSH

SSH یک پروتکل امن برای وصل شدن به ترمینال سرور از راه دوره. از ترمینال مک/لینوکس یا از PowerShell/Windows Terminal در ویندوز (که SSH داخلش هست) این دستور رو بزنید:

local machine
$ ssh root@YOUR_SERVER_IP

اولین بار که وصل می‌شید، یک پیام درباره‌ی «fingerprint» سرور می‌بینید — با تایپ yes تایید کنید. بعد رمز عبوری که سرویس‌دهنده داده رو وارد کنید (موقع تایپ چیزی روی صفحه نشون داده نمی‌شه، طبیعیه).

برای امنیت بیشتر، همون ابتدا رمز root رو عوض کنید:

server (ssh session)
# passwd
03
۰۳

آماده‌سازی اولیه‌ی سرور

قبل از نصب هر چیزی، سرور رو به‌روز کنید، یک کاربر غیر از root بسازید، و فایروال رو فعال کنید.

۱. به‌روزرسانی سیستم

server
# apt update && apt upgrade -y

۲. ساخت یک کاربر جدید

کار کردن دائمی با root ریسک بالایی داره. یک کاربر معمولی با دسترسی sudo بسازید:

server
# adduser mahdi
# usermod -aG sudo mahdi
# su - mahdi

۳. فعال‌سازی فایروال

فقط پورت‌هایی که واقعاً لازمه رو باز نگه دارید: SSH و ترافیک وب.

server
$ sudo ufw allow OpenSSH
$ sudo ufw allow 'Nginx Full'
$ sudo ufw enable
$ sudo ufw status
نکته

از این به بعد در همه‌ی دستورات با همین کاربر جدید (نه root) کار می‌کنیم و از sudo برای دستورات مدیریتی استفاده می‌کنیم.

04
۰۴

نصب Nginx

Nginx نرم‌افزاری‌ست که درخواست‌های HTTP/HTTPS رو می‌گیره و تصمیم می‌گیره چه چیزی نشون بده: یک فایل استاتیک، یا پاسخ یک برنامه‌ی در حال اجرا (مثلاً روی پورت ۳۰۰۰).

server
$ sudo apt install nginx -y
$ sudo systemctl status nginx

اگر همین حالا در مرورگر به آدرس http://YOUR_SERVER_IP برید، باید صفحه‌ی پیش‌فرض «Welcome to nginx!» رو ببینید. یعنی سرور وب شما زنده‌ست — حالا وقتشه محتوای خودتون رو جایگزین کنید.

05
۰۵

خرید دامنه و تنظیم DNS

یک دامنه از هر ثبت‌کننده‌ای بخرید (برای .ir از ثبت‌کننده‌های داخلی، برای .com از سرویس‌هایی مثل Namecheap یا GoDaddy). بعد از خرید، وارد بخش مدیریت DNS دامنه بشید و دو رکورد بسازید:

TypeHostValue
A@YOUR_SERVER_IP
AwwwYOUR_SERVER_IP

این یعنی: «هر کسی دنبال yoursite.com یا www.yoursite.com گشت، بفرستش سراغ این IP». انتشار این تغییرات (propagation) از چند دقیقه تا چند ساعت طول می‌کشه.

نکته

برای چک کردن اینکه دامنه درست تنظیم شده، از ترمینال دستور ping yoursite.com رو بزنید و ببینید همون IP سرورتون برمی‌گرده یا نه.

06
۰۶

پیکربندی Nginx و انتقال کد پروژه

۱. ساخت پوشه‌ی وب‌سایت

server
$ sudo mkdir -p /var/www/yoursite.com/html
$ sudo chown -R $USER:$USER /var/www/yoursite.com/html

۲. فرستادن کد پروژه به سرور

دو راه معمول وجود داره. اگر پروژه روی گیت‌هاب هست، ساده‌ترین راه git clone مستقیم روی سرور است:

server
$ cd /var/www/yoursite.com/html
$ git clone https://github.com/username/repo.git .

یا اگر پروژه فقط روی سیستم خودتونه، می‌تونید مستقیماً با rsync یا scp از سیستم خودتون به سرور کپی کنید:

local machine
$ scp -r ./my-project/* mahdi@YOUR_SERVER_IP:/var/www/yoursite.com/html/

۳. ساخت فایل کانفیگ Nginx

server
$ sudo nano /etc/nginx/sites-available/yoursite.com

و این محتوا رو داخلش بنویسید (برای یک سایت استاتیک ساده):

/etc/nginx/sites-available/yoursite.com
server {
    listen 80;
    server_name yoursite.com www.yoursite.com;

    root /var/www/yoursite.com/html;
    index index.html;

    location / {
        try_files $uri $uri/ =404;
    }
}

اگر پروژه یک اپلیکیشن زنده است (مثلاً Node.js روی پورت ۳۰۰۰)، به‌جای root و try_files، این بلوک location رو می‌نویسید تا Nginx مثل یک واسط (reverse proxy) درخواست رو به برنامه‌تون پاس بده:

/etc/nginx/sites-available/yoursite.com
location / {
    proxy_pass http://127.0.0.1:3000;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
}

۴. فعال‌سازی سایت

server
$ sudo ln -s /etc/nginx/sites-available/yoursite.com /etc/nginx/sites-enabled/
$ sudo nginx -t
$ sudo systemctl reload nginx

nginx -t کانفیگ رو از نظر سینتکسی چک می‌کنه؛ اگه گفت syntax is ok، خیالتون راحته و می‌تونید reload کنید.

07
۰۷

فعال‌سازی HTTPS با Let's Encrypt

مرورگرها امروز سایت‌های بدون قفل HTTPS رو «ناامن» نشون می‌دن. با Certbot می‌تونید یک گواهی SSL رایگان بگیرید و Nginx رو خودکار تنظیم کنید:

server
$ sudo apt install certbot python3-certbot-nginx -y
$ sudo certbot --nginx -d yoursite.com -d www.yoursite.com

Certbot چند سؤال می‌پرسه (ایمیل، پذیرش قوانین) و بعد خودش کانفیگ Nginx رو برای HTTPS اصلاح می‌کنه. گواهی رایگان هر ۹۰ روز نیاز به تمدید داره، اما Certbot معمولاً این کار رو خودکار انجام می‌ده. برای اطمینان:

server
$ sudo certbot renew --dry-run
08
۰۸

اگر پروژه به دیتابیس نیاز دارد: PostgreSQL

اگه پروژه‌تون فقط چند صفحه‌ی HTML/CSS/JS ثابته، این بخش رو رد کنید. اما اگه بک‌اند دارید (کاربر، فرم، سفارش، پنل مدیریت)، به یک دیتابیس ساخت‌یافته نیاز دارید. PostgreSQL انتخاب پایدار و رایگانی است.

نصب و ساخت دیتابیس

server
$ sudo apt install postgresql postgresql-contrib -y
$ sudo -u postgres psql

داخل محیط psql:

psql
CREATE DATABASE mydb;
CREATE USER myuser WITH PASSWORD 'a-strong-password';
GRANT ALL PRIVILEGES ON DATABASE mydb TO myuser;
\q

حالا برنامه‌ی شما (که با کمک Claude/Codex نوشته شده) با همین نام دیتابیس، یوزر و پسورد به PostgreSQL وصل می‌شه — این اطلاعات معمولاً در یک فایل .env روی سرور نگه‌داری می‌شن، نه داخل خود کد.

اجرای دائمی برنامه با systemd

اگه برنامه‌تون یک پروسه‌ی در حال اجراست (مثلاً Node.js روی پورت ۳۰۰۰)، نمی‌خواید هر بار دستی با node app.js اجراش کنید. یک سرویس systemd می‌سازید تا همیشه در پس‌زمینه روشن بمونه و بعد از ری‌استارت سرور هم خودکار بالا بیاد:

/etc/systemd/system/myapp.service
[Unit]
Description=My App
After=network.target

[Service]
User=mahdi
WorkingDirectory=/var/www/yoursite.com/html
ExecStart=/usr/bin/node app.js
Restart=always

[Install]
WantedBy=multi-user.target
server
$ sudo systemctl enable myapp
$ sudo systemctl start myapp
$ sudo systemctl status myapp
۰۹

چطور در این مسیر از Claude یا Codex کمک بگیریم؟

نکته‌ی جالب اینه که کل این فرآیند — از نوشتن کانفیگ Nginx تا دیباگ کردن یک خطای systemd — دقیقاً همون کاریه که هوش مصنوعی توش خیلی خوبه. چند نمونه پرامپت مفید:

Prompt

«من یک سرور اوبونتو با IP مشخص دارم و یک پروژه‌ی [React / Django / HTML ساده] دارم. مرحله‌به‌مرحله بهم بگو باید چیکار کنم که با Nginx روی دامنه‌ی خودم بالا بیارمش.»

Prompt

«این خروجی دستور sudo nginx -t رو بررسی کن و بگو مشکل کانفیگم دقیقاً کجاست: [خروجی رو پیست کنید]»

Prompt

«یک فایل systemd service برای اجرای یک اپلیکیشن Node.js روی پورت ۳۰۰۰ بنویس که با کرش خودکار ری‌استارت بشه.»

Prompt

«این خطای SSH/permission که موقع اتصال گرفتم رو برام به زبان ساده توضیح بده و بگو چطور حلش کنم: [متن خطا]»

مهم

هیچ‌وقت رمز عبور، کلید SSH یا محتوای فایل .env رو داخل چت پیست نکنید. همچنین دستوراتی مثل rm -rf، chmod 777 یا DROP DATABASE رو بدون اینکه دقیقاً بفهمید چیکار می‌کنن، کپی-پیست و اجرا نکنید — حتی اگه AI پیشنهادشون داده باشه.

۱۰

چک‌لیست نهایی امنیت و سلامت سرور

معماری نهایی، همه با هم

جمع‌بندی همه‌ی چیزی که ساختیم، از اینترنت تا دیتابیس.

Internet دامنه → DNS → IP Firewall (ufw) — ports 22 / 80 / 443 Nginx (SSL :443) فایل‌های استاتیک /var/www/site/html اپ در حال اجرا systemd service PostgreSQL VPS — everything below runs here
از اینترنت تا دیتابیس: فایروال، Nginx با SSL، فایل‌های استاتیک یا اپ زنده، و در آخر دیتابیس