یک راهنمای نسبتاً فنی برای کسی که با کمک Claude یا Codex کد مینویسه (vibe coding) و حالا میخواد اولین سایت یا اپلیکیشنش رو روی یک سرور اوبونتو واقعی، با دامنهی خودش، بیاره بالا.
قبل از دستورات، بیایید چهار مفهومی که کل این مسیر رو میسازن روشن کنیم. اگر همین حالا معنی IP، Domain و DNS رو میدونید، میتونید مستقیم برید سراغ خرید سرور.
پنج مفهومی که در کل این راهنما بارها بهشون برمیگردیم.
یک کامپیوتر واقعی در یک دیتاسنتره که ۲۴ ساعته روشنه و بخشی از منابعش (CPU، رم، دیسک) فقط مال شماست. برخلاف لپتاپ شما، هیچوقت خاموش نمیشه.
آدرس دقیق و عددی سرور شما روی اینترنت، مثل 185.10.x.x. هر درخواستی که به سایت شما میرسه، در نهایت به همین آدرس ختم میشه.
یک اسم قابلخواندن مثل yoursite.com که بهجای حفظ کردن یک عدد، مردم اونو تایپ میکنن.
مثل یک دفترچه تلفن جهانی: میگه دامنهی yoursite.com دقیقاً پشت کدوم IP قرار داره.
دربان سرور شما. درخواستهای ورودی رو میگیره، تصمیم میگیره فایل استاتیک نشون بده یا به برنامهی پشتصحنه بفرسته.
فایلهای HTML ساده نیاز به دیتابیس ندارن، اما هر پروژهای که کاربر، سفارش، یا دادهی متغیر داره، نیاز به یک محل ذخیرهی ساختیافته و قابلاعتماد داره — همون دیتابیس.
برای یک صفحهی سادهی HTML اصلاً نیازی به دیتابیس نیست. دیتابیس رو فقط وقتی اضافه کنید که پروژهتون واقعاً دادهی پویا (کاربر، فرم، سفارش و…) داره.
برای شروع، به یک سرور با آدرس IP ثابت نیاز دارید. یکی از گزینههای ساده و رایج برای کاربران ایرانی، parspack.com است که سرورهای ابری با پینگ خوب داخل ایران ارائه میده؛ میتونید از هر سرویسدهندهی دیگهای هم استفاده کنید، مراحل تقریباً یکسانه.
| مورد | حداقل پیشنهادی | توضیح |
|---|---|---|
| سیستمعامل | Ubuntu 22.04 LTS | پرکاربردترین و بهترین پشتیبانی از ابزارها |
| CPU | 1 vCPU | برای پروژهی شخصی/دمو کافیه |
| RAM | 1–2 GB | اگر دیتابیس هم روی همین سرور اجرا میشه، ۲GB راحتتره |
| فضای دیسک | 20–25 GB SSD | معمولاً پیشفرض پلنهای پایه |
| آیپی | IPv4 ثابت | لازمه که ثابت باشه تا دامنه بهش وصل بمونه |
بعد از پرداخت، سرویسدهنده معمولاً از طریق پنل یا ایمیل سه چیز به شما میده:
این سه مورد رو در جای امن نگه دارید و هیچوقت رمز عبور یا کلید سرور رو داخل چت با Claude/Codex یا هر جای دیگه پیست نکنید.
SSH یک پروتکل امن برای وصل شدن به ترمینال سرور از راه دوره. از ترمینال مک/لینوکس یا از PowerShell/Windows Terminal در ویندوز (که SSH داخلش هست) این دستور رو بزنید:
$ ssh root@YOUR_SERVER_IP
اولین بار که وصل میشید، یک پیام دربارهی «fingerprint» سرور میبینید — با تایپ yes تایید کنید. بعد رمز عبوری که سرویسدهنده داده رو وارد کنید (موقع تایپ چیزی روی صفحه نشون داده نمیشه، طبیعیه).
برای امنیت بیشتر، همون ابتدا رمز root رو عوض کنید:
# passwd
قبل از نصب هر چیزی، سرور رو بهروز کنید، یک کاربر غیر از root بسازید، و فایروال رو فعال کنید.
# apt update && apt upgrade -y
کار کردن دائمی با root ریسک بالایی داره. یک کاربر معمولی با دسترسی sudo بسازید:
# adduser mahdi # usermod -aG sudo mahdi # su - mahdi
فقط پورتهایی که واقعاً لازمه رو باز نگه دارید: SSH و ترافیک وب.
$ sudo ufw allow OpenSSH $ sudo ufw allow 'Nginx Full' $ sudo ufw enable $ sudo ufw status
از این به بعد در همهی دستورات با همین کاربر جدید (نه root) کار میکنیم و از sudo برای دستورات مدیریتی استفاده میکنیم.
Nginx نرمافزاریست که درخواستهای HTTP/HTTPS رو میگیره و تصمیم میگیره چه چیزی نشون بده: یک فایل استاتیک، یا پاسخ یک برنامهی در حال اجرا (مثلاً روی پورت ۳۰۰۰).
$ sudo apt install nginx -y $ sudo systemctl status nginx
اگر همین حالا در مرورگر به آدرس http://YOUR_SERVER_IP برید، باید صفحهی پیشفرض «Welcome to nginx!» رو ببینید. یعنی سرور وب شما زندهست — حالا وقتشه محتوای خودتون رو جایگزین کنید.
یک دامنه از هر ثبتکنندهای بخرید (برای .ir از ثبتکنندههای داخلی، برای .com از سرویسهایی مثل Namecheap یا GoDaddy). بعد از خرید، وارد بخش مدیریت DNS دامنه بشید و دو رکورد بسازید:
| Type | Host | Value |
|---|---|---|
| A | @ | YOUR_SERVER_IP |
| A | www | YOUR_SERVER_IP |
این یعنی: «هر کسی دنبال yoursite.com یا www.yoursite.com گشت، بفرستش سراغ این IP». انتشار این تغییرات (propagation) از چند دقیقه تا چند ساعت طول میکشه.
برای چک کردن اینکه دامنه درست تنظیم شده، از ترمینال دستور ping yoursite.com رو بزنید و ببینید همون IP سرورتون برمیگرده یا نه.
$ sudo mkdir -p /var/www/yoursite.com/html $ sudo chown -R $USER:$USER /var/www/yoursite.com/html
دو راه معمول وجود داره. اگر پروژه روی گیتهاب هست، سادهترین راه git clone مستقیم روی سرور است:
$ cd /var/www/yoursite.com/html $ git clone https://github.com/username/repo.git .
یا اگر پروژه فقط روی سیستم خودتونه، میتونید مستقیماً با rsync یا scp از سیستم خودتون به سرور کپی کنید:
$ scp -r ./my-project/* mahdi@YOUR_SERVER_IP:/var/www/yoursite.com/html/
$ sudo nano /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) درخواست رو به برنامهتون پاس بده:
location / {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
$ 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 کنید.
مرورگرها امروز سایتهای بدون قفل HTTPS رو «ناامن» نشون میدن. با Certbot میتونید یک گواهی SSL رایگان بگیرید و Nginx رو خودکار تنظیم کنید:
$ sudo apt install certbot python3-certbot-nginx -y $ sudo certbot --nginx -d yoursite.com -d www.yoursite.com
Certbot چند سؤال میپرسه (ایمیل، پذیرش قوانین) و بعد خودش کانفیگ Nginx رو برای HTTPS اصلاح میکنه. گواهی رایگان هر ۹۰ روز نیاز به تمدید داره، اما Certbot معمولاً این کار رو خودکار انجام میده. برای اطمینان:
$ sudo certbot renew --dry-run
اگه پروژهتون فقط چند صفحهی HTML/CSS/JS ثابته، این بخش رو رد کنید. اما اگه بکاند دارید (کاربر، فرم، سفارش، پنل مدیریت)، به یک دیتابیس ساختیافته نیاز دارید. PostgreSQL انتخاب پایدار و رایگانی است.
$ sudo apt install postgresql postgresql-contrib -y $ sudo -u postgres 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 روی سرور نگهداری میشن، نه داخل خود کد.
اگه برنامهتون یک پروسهی در حال اجراست (مثلاً Node.js روی پورت ۳۰۰۰)، نمیخواید هر بار دستی با node app.js اجراش کنید. یک سرویس systemd میسازید تا همیشه در پسزمینه روشن بمونه و بعد از ریاستارت سرور هم خودکار بالا بیاد:
[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
$ sudo systemctl enable myapp $ sudo systemctl start myapp $ sudo systemctl status myapp
نکتهی جالب اینه که کل این فرآیند — از نوشتن کانفیگ Nginx تا دیباگ کردن یک خطای systemd — دقیقاً همون کاریه که هوش مصنوعی توش خیلی خوبه. چند نمونه پرامپت مفید:
«من یک سرور اوبونتو با IP مشخص دارم و یک پروژهی [React / Django / HTML ساده] دارم. مرحلهبهمرحله بهم بگو باید چیکار کنم که با Nginx روی دامنهی خودم بالا بیارمش.»
«این خروجی دستور sudo nginx -t رو بررسی کن و بگو مشکل کانفیگم دقیقاً کجاست: [خروجی رو پیست کنید]»
«یک فایل systemd service برای اجرای یک اپلیکیشن Node.js روی پورت ۳۰۰۰ بنویس که با کرش خودکار ریاستارت بشه.»
«این خطای SSH/permission که موقع اتصال گرفتم رو برام به زبان ساده توضیح بده و بگو چطور حلش کنم: [متن خطا]»
هیچوقت رمز عبور، کلید SSH یا محتوای فایل .env رو داخل چت پیست نکنید. همچنین دستوراتی مثل rm -rf، chmod 777 یا DROP DATABASE رو بدون اینکه دقیقاً بفهمید چیکار میکنن، کپی-پیست و اجرا نکنید — حتی اگه AI پیشنهادشون داده باشه.
جمعبندی همهی چیزی که ساختیم، از اینترنت تا دیتابیس.