<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های علی ناصری</title>
        <link>https://virgool.io/feed/@alinaseri</link>
        <description>https:/alinaseri.dev</description>
        <language>fa</language>
        <pubDate>2026-06-07 12:07:48</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/61511/avatar/x7YV81.jpg?height=120&amp;width=120</url>
            <title>علی ناصری</title>
            <link>https://virgool.io/@alinaseri</link>
        </image>

                    <item>
                <title>مانیتورینگ منابع سرور با Grafana</title>
                <link>https://virgool.io/@alinaseri/grafana-vgo1b9vulghq</link>
                <description>داشبور Grafana برای مدیریت منابع سرورتوی این مقاله قراره باهم برای سروری که داریم به کمک Grafana و Prometheus و Node Exporter یک داشبورد مانیتورینگ بیاریم بالا و از میزان مصرف منابع سرورمون باخبر شیم.قبل از شروع اول یه تعریفی داشتی باشیم ببینیم اصلا چی هستن اینا:اول از همه ‌تعریف Node Exporter: یک سرویسی هست که روی سیستم اجرا میشه و هر ثانیه اطلاعات سیستم رو جمع میکنه.بریم سراغ Prometheus که یک دیتابیس هست که دیتاهاش رو به صورت Time Series نگه میداره. اینجا قراره دیتاهایی که Node Exporter برامون جمع کرده رو نگه داره برامونو در آخر Grafana که یک داشبورد هست که اطلاعاتی که Prometheus ذخیره کرده رو برامون به نمایش درمیاره.خب حالا قراره باهم این سه تا سرویس رو با Docker Compose بیاریم بالا که هم یکپارچه باشه و هم سرورمون رو کثیف نکرده باشیم و هر موقع دلمون خواست پاکش کنیم بره.اگه با Docker Compose آشنایی ندارید یه مقاله راجع بهش نوشتم https://vrgl.ir/n2lMn خب من محتویات فایل docker-compose.yml رو میزارم بعد بریم سراغ توضیحش:version: &#039;3&#039;

services:
  grafana:
    container_name: grafana
    image: grafana/grafana:latest
    restart: always
    ports:
      - 3000:3000
    links:
      - &#039;prometheus:prometheus&#039;
  
  prometheus:
    container_name: prometheus
    image: prom/prometheus:latest
    restart: always
    ports:
      - 9090:9090
    links:
      - &#039;node-exporter:node-exporter&#039;
    volumes:
       - ./prometheus/:/etc/prometheus
  
  node-exporter:
    container_name: node-exporter
    image: prom/node-exporter:latest
    restart: always
    ports:
      - 9100:9100خب همونطور که مشخصه ما سه تا سرویس داریم میاریم بالا روی پورت‌هایی که تعریف کردیم. فقط یه Volume اختصاص دادم به Prometheus که توی اون Directory یه فایل prometheus.yml گذاشتم که تنظیمات Prometheus ما هستش که محتویاتش میشه این:global:
  scrape_interval: 15s
  scrape_configs:
    - job_name: &#039;node-exporter&#039;
  static_configs:
    - targets: [&#039;node-exporter:9100&#039;]اینجا ما گفتیم که هر ۱۵ ثانیه اطلاعات رو از Node Exporter بگیره و ذخیره کنه. توجه کنید که در قسمت target ما بجای ip سرورمون اسم خود Container رو صدا زدیم که توی فایل docker-compose.yml بالا تعریفش کردیم.خب حالا یه docker-compose up می‌زنیم و قاعداتا باید سه تا سرویس‌ ما روی پورت‌هایی که تعریف کردیم بالا بیاد.اول از همه بریم ببینیم Prometheus تونسته اطلاعات رو از Node Exporter بگیره یا نه. باید بریم به این آدرس:http://YOUR_SERVER_IP:9090/targetsاگه تونسته باشه به Node Exporter وصل بشه و اطلاعات بگیره ازش باید یه همچین چیزی ببینیم:خب کارمون اینور تمومه بریم سراغ Grafana. اول بریم به این آدرس برای اینکه برسیم به تنظیماتش:http://YOUR_SERVER_IP:3000بعد از اینکه پسورد رو عوض کردید و وارد داشبورد شدید از منو سمت چپ و تنظیمات برید قسمت Data Sources یا از این آدرس راحت تر بهش برسید:http://YOUR_SERVER_IP:3000/datasourcesگزینه Add data source رو بزنید بعد Prometheus رو انتخاب کنید و توی قسمت URL بزنید:prometheus:9090برید پایین Save &amp; Test رو بزنید اگه پیغام Success گرفتید که چه عالی اگه نه این آدرس رو هم تست کنید:http://YOUR_SERVER_IP:9090اگه همه چی خوب پیش بره ما تونستیم دیتاهایی که Node Exporter از سرورمون جمع میکنه رو با استفاده از Prometheus ذخیره کنیم و حالا Grafana رو به Prometheus وصل کردیم و نیاز به یه داشبورد داریم که نشونمون بده. از منو سمت چپ از گزینه Dashboard گزینه Manage رو انتخاب کنید و بعد دکمه Import رو بزنید و عدد 1860 رو بزنید و دکمه Load رو بزنید. (در واقع 1860 آیدی اون داشبوردی هست که میخوایم برامون از سایت خود Grafana بگیره)بعد از Import باید برسید به این قسمت:فقط حواستون باشه از اون قسمت پایین Prometheus رو انتخاب کنید حتما.اگه همه چی اوکی باشه با زدن دکمه Import مستقیم میرید توی داشبوردتون و میزان مصرف منابع سرورتون رو می‌بینید. (عکس اول مقاله)خیلی خوشحال شدم که وقتتون رو گذاشتید و این مقاله رو تا انتها مطالعه کردید. امیدوارم که مفید بوده باشه براتون. خوشحال میشم هر نظری درباره این مقاله یا مقاله‌های پیشین داشتید باهام درمیون بزارید.</description>
                <category>علی ناصری</category>
                <author>علی ناصری</author>
                <pubDate>Mon, 01 Mar 2021 21:41:27 +0330</pubDate>
            </item>
                    <item>
                <title>چجوری روی یک سرور، چند سرویس مختلف رو با استفاده از Nginx و Docker، مستقر کنیم؟</title>
                <link>https://virgool.io/CodeLovers/nginx-w7bpvtpzjz3w</link>
                <description>توی این مقاله باهم قراره یه کار جالب بکنیم. فرض کنید دامین abc.com رو دارید. حالا براش قراره یه سرویس API روی Sub Domain عه api.abc.com بیارید بالا و خود abc.com هم وبسایت ما باشه.ما فرض می‌کنیم که یک پروژه Backend داریم برای API هامون و یکی هم Front و هر دو Dockerize شدن. اگه Dockerize کردن پروژه رو کار نکردید حتما این مقاله رو مشاهده کنید.خب اولین کارمون اینه که یه Sub Domain تعریف کنیم توی پنلی که ازش دامین رو خریدیم. من چون توی Cloudflare دامنه هامو تعریف کردم یه عکس میزارم که ببینید چجوری Sub Domain تعریف می‌کنیم.نحوه تعریف Sub Domain در سایت Cloudflareهمونطور که توی عکس بالا می‌بینید سه تا رکورد A داریم که هر سه اشاره به IP سرور شما داره. یعنی بعد از تعریف api وقتی شما بزنی api.abc.com تا پشت سرور شما میاد. حالا باید هدایتش کنیم به پروژه Backend مون.فرض کنید پروژه Backend تون رو با دستور زیر آوردید بالا:docker run --name Backend -p 5000:5000 -d Backendقبلا شما به این شکل به سرویس api تون دسترسی ‌داشتید:‌ https://YOUR_SERVER_IP:5000حالا میخوام یه Image عه داکر بهتون معرفی کنم که کارمون رو خیلی راحت میکنه. https://hub.docker.com/r/jwilder/nginx-proxy به لطف این Image هدایت کردن دامین‌های مختلف به سرویس‌های مختلفمون خیلی راحت میشه. اولین کار اینه که خود این Image رو روی یه Container بالا بیاریم با استفاده از دستور زیر:docker run --name mynginx-proxy -p 80:80 -v /var/run/docker.sock:/tmp/docker.sock:ro -d jwilder/nginx-proxyفقط حواستون باشه نباید روی پورت ۸۰ سرویسی داشته باشید چون قراره مدیریت درخواست‌های پورت ۸۰ سرورمون رو به عهده این Container بزاریم.بعد از این کار میریم سراغ سرویس‌های خودمون. مثالی که بالا زدم برای اجرا کردن سرویس Backend تون به شکل زیر تغییر می‌کنه:docker run --name Backend -p 5000:5000 -e VIRTUAL_HOST=api.abc.com -e VIRTUAL_PORT=5000 -d Backendدو تا Environment ای که موقع Run کردن Container اضافه می‌کنیم برای اینه که به Container عه mynginx-proxy ای که چند لحظه پیش اجرا کردیم بگیم که اگر درخواستی به دامنه api.abc.com اومد هدایتش کن به این Containerاگه بخوام مثال پروژه Front رو بزنم هم اینجوری میشه:docker run --name Frontend -e VIRTUAL_HOST=abc.com -d Frontendاینجا دیگه VIRTUAL_PORT رو ست نمی‌کنیم چون به صورت پیش‌فرض پروژه ما روی پورت ۸۰ داره اجرا میشه.حالا بیای مثال Docker compose رو هم باهم ببینیم که بحث رو تکمیل کرده باشیم.version: &#039;3&#039;

service:
  Backend:
    container_name: Backend
    image: Backend
    ports:
      - &#039;5000:5000&#039;
    environment:
      - VIRTUAL_PORT=5000
      - VIRTUAL_HOST=api.abc.com

  Frontend:
    container_name: Frontend
    image: Frontend
    environment:
      - VIRTUAL_HOST=abc.comپس اگه چندین دامنه با چندین Sub Domain داشته باشید به راحتی می‌تونید هر کدوم رو هدایت کنید به سمت Container های خودش.خیلی خوشحالم که تا انتهای این مقاله منو همراهی کردید. امیدوارم براتون مفید بوده باشه. خیلی خوشحال میشم اگه نظری یا انتقادی داشتید باهام درمیون بزارید. برقرار باشید</description>
                <category>علی ناصری</category>
                <author>علی ناصری</author>
                <pubDate>Mon, 25 Jan 2021 21:40:34 +0330</pubDate>
            </item>
                    <item>
                <title>چند تا کار لازم و ضروری که بعد از خرید VPS باید انجام بدیم</title>
                <link>https://virgool.io/@alinaseri/secure-vps-dh3xxcdi1epc</link>
                <description>وقتی یه سرور میخریم یه یوزر Root بهمون میدن با یه Password که خب اصلا امن نیست و توصیه همه اینه که در اولین فرصت یه سری کارای امنیتی انجام بدیم براش. حالا یه سری کارای ساده رو لیست می‌کنم که به ترتیب باهم انجام بدیم و تا حدود قابل قبولی سرورمون رو امن کنیم.اضافه کردن یک یوزر جدیدفعال‌سازی Login فقط از طریق SSHغیرفعال کردن Login توسط یوزر Rootغیرفعال کردن Login با پسورد‌من مثال این مقاله رو با Centos 7 پیش می‌برم. بعضی از دستورها روی نسخه‌های مختلف لینوکس متفاوت هست که با گوگل کردن راحت بدستش میاریدیه نکته‌ای رو همین ابتدای کار متذکر شدم. لطفا هیچ کدوم از ترمینال‌هاتون رو تا انتها این مقاله نبندید تا از اتصال  درست به سرورتون مطمئن بشید.خب توی قدم اول ما میایم یه یوزر توی سرور برای خودمون درست می‌کنیم که با اون Login کنیم و هر کاری که روی سرور داریم رو با یوزر خودمون انجام بدیم بجای یوزر Root. برای این کار از دستور زیر استفاده میکنیم: adduser aliبرای اینکه یه پسورد هم براش بزاریم ازین دستور استفاده می‌کنیم:passwd aliحالا با استفاده از دستور زیر یوزر جدیدمون رو توی wheel group قرار میدیم که بتونه از sudo استفاده کنه و به اصطلاح sudoer یا sudoable می‌کنیم یوزرمون رو:usermod -aG wheel aliخب بسیار عالی. الان اگه بخواید switch شید بین یوزرها و برید روی یوزر خودتون کار کنید از دستور زیر باید استفاده کنید:su aliخب حالا می‌خوایم SSH سیستم خودمون رو اضافه کنیم به یوزر ali روی سرور که از سیستم خودمون با SSH لاگین شیم روی یوزر ali روی سرور. توی یوزر ali روی سرور این دستور و می‌زنیم که directory عه SSH رو درست کنه برامون:mkdir ~/.sshبعدش Permission لازم رو میدیم به directory عه SSH:chmod 700 ~/.sshبعد یه فایل authorized_keys درست می‌کنیم توی directory عه SSH:vi ~/.ssh/authorized_keysیکم vim هم کار کنیم باهم اینجا. اول i رو بزنید که برید توی حالت insert mode. بعد public key عه سیستم خودتون (ssh/id_rsa.pub./~) رو کپی کنید توی همین vim. بعد ESC رو بزنید که خارج بشید از حالت insert mode و بعد wq: رو بزنید و فایل و save کنید و بیاید بیرون. واسه اینکه مطمئن شید درست کار کردید یبار cat کنید فایلتون رو ببینید درست کپی کردید یا نه:cat ~/.ssh/authorized_keysحالا Permission لازم رو میدیم به فایلمونchmod 600 ~/.ssh/authorized_keysحالا میرسیم به قسمت جذاب ماجرا و اونم modify کردن سرویس SSH سرورمونه. این فایل رو با vim باز کنید لطفا تا بریم دونه دونه موارد لازم رو ویرایش کنیم:sudo vi /etc/ssh/sshd_configخب حالا دنبال این خط ها بگردید و طبق دستورهای زیر تغییرشون بدید تا خط به خط باهم ببینیم هر کدوم برای چیه:Port 8899
PermitRootLogin no
PubkeyAuthentication yes
PasswordAuthentication no
AllowUsers ali x y zاولین مورد که مشخصه پورت SSH رو عوض میکنیم که روی حالت پیش فرض نباشه و تا حدودی Secure بشهدومین مورد میگه با یوزر ًRoot دیگه کسی نتونه لاگین شهسومین مورد میگه میخوایم با SSH وصل شیم به سرور (در واقع با Public key ای که اضافه کردیم قراره بتونیم لاگین شیم)چهارمین مورد هم کاملا مشخصه و قراره جلوی لاگین با پسورد رو بگیریمآخرین مورد هم میگه فقط این یوزرها می‌تونن وصل شن به سرورخب بعد از اینکه این موارد رو تغییر دادید یک بار نیاز هست که سرویس SSH رو ریست کنیم تا تغییرات اعمال شه:sudo systemctl restart sshd.serviceخب حالا بریم سراغ نصب iptables که در واقع Connection هایی که به سرورمون الکی زده میشه رو جلوشو میگیره و طبق rule ای که براش تنظیم خواهیم کرد فقط به اونا جواب میده و بقیه رو Drop میکنه اصطلاحا. اولین کار نصبش روی سرورمون هستش:sudo yum install iptables-servicesحالا یه فایل توی home درست می‌کنیم که rule های iptables رو توش قرار بدیم:vi ~/iptables.rulesو این دستورات رو قرار بدید داخلش:*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 8899 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 443 -j ACCEPT
-A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT
-A INPUT -m limit --limit 5/min -j LOG --log-prefix &amp;quotiptables denied: &amp;quot --log-level 7
-A INPUT -j REJECT --reject-with icmp-port-unreachable
-A FORWARD -j REJECT --reject-with icmp-port-unreachable
-A OUTPUT -j ACCEPT
COMMITیه نگاهی به فایل بندازید متوجه میشید که سه تا پورت 8899 که برای SSH تغییر دادیم و پورت‌های 80 و 443 برای وب رو باز کردیم و بقیه رو drop کردیم. (من دیگه خط به خط این فایل رو توضیح نمیدم چون مقاله خییییلی طولانی خواهد شد. اگه جالب بود براتون که بدونید بقیه موارد چی کار میکنه یه گوگل ساده به جواب می‌رسونه شمارو).حالا این تغییرات رو با استفاده از دستور زیر اعمال می‌کنیم روی سرویس iptables و save می‌کنیم:sudo iptables-restore &lt; ~/iptables.rules
sudo service iptables saveبرای اینکه متوجه شید سرویس iptables در حال اجرا هست هم از دستور زیر استفاده کنید:sudo service iptables statusمحض اطمینان این دستور زیر رو هم بزنید برای اینکه مطمئن بشیم سرویس iptables همیشه فعال خواهد بود روی سرورمون:sudo service iptables enableحالا برای اینکه ببینید rule های iptables درست روی این سرویس اعمال شده با این دستور چک کنید:sudo iptables -Sاگه همه چی درست تنظیم شده باشه محتوایت فایل iptables.rules مون رو باید ببیند.خب دیگه کارمون تموم شده روی سرور. الان روی سیستم خودمون یه سری کارای ریز قراره انجام بدیم که اتصالمون به سرورمون رو راحت تر کنه. برای اینکار لطفا برید توی directory عه ssh. سیستم خودتون و یه فایل config درست کنید و اینارو توش قرار بدیدHost *
  UseKeychain yes
  AddKeysToAgent yes
  IdentityFile ~/.ssh/id_rsa
Host myserver
  HostName YOUR_SERVER_IP_ADDRESS
  Port 8899
  User aliحالا فقط کافیه توی یه ترمینال جدید بزنید:ssh myserverو خیلی راحت به سرورتون وصل می‌شید.در آخر شمارو دعوت می‌کنم به خوندن این مقاله از مقالات معروف سایت Digitalocianخیلی ممنونم که تا انتهای این مقاله رو مطالعه کردید. امیدوارم مواردی که گفته شد براتون مفید بوده باشه. میخوام یه تشکر از دوست و همکار بسیار محترمم سعید طاهری بکنم که سخاوتمندانه دانشش رو در اختیارم قرار داد که نتیجش شد این مقاله. خوشحال میشم اگه هرجای مقاله رو خدایی نکرده نامفهوم توضیح دادم بهم بگید که اصلاح کنم.</description>
                <category>علی ناصری</category>
                <author>علی ناصری</author>
                <pubDate>Tue, 19 Jan 2021 22:26:11 +0330</pubDate>
            </item>
                    <item>
                <title>مهاجرت از Docker به Docker compose</title>
                <link>https://virgool.io/@alinaseri/docker-compose-i3wpt8bvh6bz</link>
                <description>توی پست قبلی اومدیم باهم یک پروژه React رو با Docker روی سرور مستقر کردیم. من لینک مقاله قبلی رو براتون میزارم یه نگاهی بهش بندازید اگه فرصت داشتید. https://vrgl.ir/JboHu اما توی این پست قراره یکم قضیه رو جالب ترش کنیم و همراه همون پروژه Front-end، یه پروژه Back-end به همراه یه Database به کمک Docker compose لانچ کنیم.هدف اصلی این مقاله درک و یادگیری Docker compose هستش و باهم ببینیم به کمک این تکنولوژی چجوری پروژه هامون به زیباترین شکل ممکن روی سرور قرار می‌گیره و بجای ۳ بار اجرا کردن دستور Docker run فقط با یه دستور docker-compose up سه تا سرویس‌مون رو لانچ میکنیم.داستان ازین قراره که وقتی پروژه شما به چند تا سرویس نیاز داره که همزمان و در کنار هم کار کنه،‌ یکم با روش‌های قدیمی سخته مستقر کردنشون روی سرور و همچنین نگهداریشون. یه قدم بیایم جلو تر، اگه ما قرار بود این سه تا سرویس (Front و Back و Database) رو با سه تا دستور زیر اجرا کنیم یه همچین چیزی می‌شد:docker run --name Front -p 80:80 -d front-enddocker run --name Back -p 5000:5000 -v ./Back/data:/app/data -d back-enddocker run --rm --name Database -e POSTGRES_PASSWORD=docker -p 5432:5432 -v ./Database:/var/lib/postgresql/data -d postgresهمونطور که می‌بینید سه بار مجبوریم دستور docker run رو اجرا کنیم. اگه میخواستیم ارتباطشون رو باهم راحت تر برقرار کنیم هم با دستور network-- میومدیم هر سه Container رو توی یک شبکه قرار میدادیم که راحت‌تر باهم ارتباط برقرار کنن.حالا بیاید همین کارو با Docker compose انجام بدیم. اول بیاید باهم ببینیم ساختار Directory هامون چجوریه:Project
  |_ Front
  |_ Back
  |_ Database
  |_ docker-compose.ymlخب تلکیف Directory های Front و Back مشخصه، پروژه‌هامون توشه. ولی Directory عه Database رو درست کردم که در واقع Data های Database رو توش نگهدارم که اگه Container مون پاک شد Data ها پاک نشه.خب حالا بریم سراغ اصل ماجرا و ببینیم داخل فایل docker-compose.yml مون چه خبره:version: &#039;3&#039;

services:
  database:
    image: postgres:13
    environment:
      - POSTGRES_PASSWORD=&lt;YOUR_PASSWORD&gt;
    ports:
      - 5432:5432
    volumes:
      - ./Database:/var/lib/postgresql/data

  back:
    build: ./Back
    ports:
      - 5000:5000
    volumes:
      - ./Back/data:/app/data
    depends_on:
      - database

  front:
    build: ./Front
    ports:
      - 80:80
    depends_on:
      - back
همونطور که می‌بینید اینقدر فایل گویا هست که کامل خودش توضیح میده ماجرا رو. یه چند تا نکته رو بگم فقط در جریان باشید. وقتی از build استفاده میکنیم یعنی برو تو Directory و دنبال Dockerfile بگرد و از رو اون build کن. من معمولا اول Database رو بالا میارم و بعد پروژه Back رو. چون پروژه‌ام به محض بالا اومدن باید وصل بشه به Database و Table هارو Auto Migrate کنه و ساختار Database رو برای خودش بسازه یه جورایی. برای همینم از depends_on استفاده میکنم که صبر کنه هر موقع Database کامل اومد بالا و مستقر شد بیاد شروع کنه Container عه Back رو بسازه برام. آخر سر هم که Front رو میارم بالا و فقط برای اینکه بدونم پشت سر هم اجرا و به ترتیب میان بالا از depends_on برای فرانت هم استفاده کردم وگرنه لزومی نداره اگه شما استفاده نکردید.حالا کنار فایل docker-compose.yml شما کافیه دستور docker-compose up رو بزنید و ببینید که به ترتیب سه تا سرویس لانچ میشه براتون.اگر لازم داشتید هر سری برای up شدن build مجدد هم بشه می‌تونید از دستور docker-compose up --build استفاده کنید.دوست دارم یه نکته ریز رو بگم چون این حرکت Docker واقعا قشنگه. وقتی با Docker compose سه تا سرویس رو لانچ می‌کنیم، چون توی یه network قرار می‌گیرن، شما کافیه توی پروژه Back تون اوجایی که دارید به Database وصل میشید بجای ip اون Container اسمشو صدا بزنید و DNS داکر خودش اینو متوجه میشه که کلمه Database معادل چه ip میشه و دیگه نیاز نیست نگران این باشید که هر سری down و up می‌کنید ip تون تغییر میکنه. بزارید یه مثال بزنم تا باهم ببینیم. تکه کد زیر نحوه متصل شدن به Database عه postgres توی golang عه:package main

import (
  &amp;quotdatabase/sql&amp;quot
  &amp;quotfmt&amp;quot

  _ &amp;quotgithub.com/lib/pq&amp;quot
)

const (
  host     = &amp;quotlocalhost&amp;quot
  port     = 5432
  user     = &amp;quotpostgres&amp;quot
  password = &amp;quotyour-password&amp;quot
  dbname   = &amp;quotyour-dbname&amp;quot
)

func main() {
  psqlInfo := fmt.Sprintf(&amp;quothost=%s port=%d user=%s &amp;quot+
    &amp;quotpassword=%s dbname=%s sslmode=disable&amp;quot,
    host, port, user, password, dbname)
  db, err := sql.Open(&amp;quotpostgres&amp;quot, psqlInfo)
  if err != nil {
    panic(err)
  }
  defer db.Close()

  err = db.Ping()
  if err != nil {
    panic(err)
  }

  fmt.Println(&amp;quotSuccessfully connected!&amp;quot)
}به لطف Docker compose فقط کافیه بجای کلمه localhost کلمه database رو بزارید و با توجه به تعریف بالا Docker خودش می‌فهمه Database چه ip ای داره و پروژه Back تون رو به Database تون متصل میکنه.خیلی ممنونم که تا انتهای این مقاله همراه من بودید. امیدوارم که تونسته باشم مطلب رو برسونم. خیلی خوشحال میشم اگه نظری درباره مقاله دارید یا اگه جاییش رو واضح توضیح ندادم یا از قلم انداختم با من در میون بزارید.</description>
                <category>علی ناصری</category>
                <author>علی ناصری</author>
                <pubDate>Fri, 08 Jan 2021 14:46:57 +0330</pubDate>
            </item>
                    <item>
                <title>چجوری یک پروژه React رو با Docker روی سرور مستقر کنیم</title>
                <link>https://virgool.io/@alinaseri/dockerize-react-k551nkyv6aca</link>
                <description>تو این مقاله قراره یه پروژه ساده React رو با استفاده از Docker روی سرور مستقر کنیم و به اصطلاح Dockerize کنیم.اول از همه از مزایای این کار بگم خدمتتون که اگه بطور مثال چند تا پروژه جاوا اسکریپتی داشتید که هر کدوم نیاز به ورژن‌های مختلفی از Nodejs داشته باشه، بدون داکر شما خیلی اذیت میشی. چون باید چیزی مثل NVM روی سرورتون داشته باشید که برای هر کدوم از پروژه‌هاتون سوییچ شید بین ورژن‌های مختلف nodejs و بعد شروع به نصب پکیج های اون پروژه کنید. اما به لطف Docker هم سرورتون تر تمیز می‌مونه هم ازین دردسرها رها میشید. حالا در ادامه میریم که یه پروژه ساده رو بسازیم و Dockerize کنیمش.من مثال این مقاله رو با استفاده از پروژه Next.js می‌برم جلو. ولی نگران نباشید چون کلیت مطلب یکیه و چیزایی که میخوام بگم تقریبا روی هر پروژه React جوابگوعه.خب اول میایم یه پروژه رو init می‌کنیم با استفاده از دستور زیر:npx create-next-app
# or
yarn create next-appحالا فرض میکنیم شما پروژه تون رو توسعه دادید و کارتون تموم شده و حالا میخواید بزارید روی سرور. معمولا هر پروژه‌ای یه دستور برای Build کردن پروژه داره. من فایل package.json این پروژه رو اینجا میزارم تا همه باهم ببینیم که چطوری میشه متوجه شد دستوری که باید برای build پروژمون بزنیم چیه؟{
  &amp;quotname&amp;quot: &amp;quottest&amp;quot,
  &amp;quotversion&amp;quot: &amp;quot0.1.0&amp;quot,
  &amp;quotprivate&amp;quot: true,
  &amp;quotscripts&amp;quot: {
    &amp;quotdev&amp;quot: &amp;quotnext dev&amp;quot,
    &amp;quotbuild&amp;quot: &amp;quotnext build &amp;&amp; next export&amp;quot,
    &amp;quotstart&amp;quot: &amp;quotnext start&amp;quot
},
&amp;quotdependencies&amp;quot: {
  &amp;quotnext&amp;quot: &amp;quot10.0.4&amp;quot,
  &amp;quotreact&amp;quot: &amp;quot17.0.1&amp;quot,
  &amp;quotreact-dom&amp;quot: &amp;quot17.0.1&amp;quot
}همونطور که می‌بینید ما یه Script برای Build داریم توی package.json و وقتی با استفاده از دستور:npm run buildپروژه رو Build میکنیم در نهایت یه Directory برامون می‌سازه به اسم out که ما قراره محتوایتش رو کپی کنیم جایی که Nginx برامون Serve کنه.خب کارمون با پروژه‌مون تمومه تقریبا و حالا بریم سراغ Dockerize کردن این پروژه.اول از همه میایم یه فایل Dockerfile توی root پروژه‌مون می‌سازیم و دستورهای زیر و توش قرار میدیم:# Stage 0 - build react app
From node:12 as build-stage

WORKDIR /app
COPY ./ /app/
RUN npm install
RUN npm run build

# Stage 1 - serve build app with Nginx
From nginx:1.15
COPY --from=build-stage /app/out/ /usr/share/nginx/html
COPY --from=build-stage /app/nginx.conf /etc/nginx/conf.d/default.confیه فایل nginx.conf هم توی همون root درست کنید و این کد‌ها رو توش قرار بدید:server {
  listen 80;
  location / {
    root /usr/share/nginx/html;
    index index.html index.htm;
    try_files $uri /index.html =404;
  }
  include /etc/nginx/extra-conf.d/*.conf;
}خب حالا بپردازیم به محتوایت این فایل‌ها و خط به خط توضیحش بدیم و ببینیم که قراره چی کار کنه برامون. اول از همه با Dockerfile شروع می‌کنیم. اول از همه اومدیم ۲ تا Stage تعریف کردیم که توی Stage اول میایم با استفاده از image  عه Nodejs پکیج های پروژه‌ مون رو نصب میکنیم و توی Stage دوم با استفاده از image عه Nginx میگیم پروژمون رو Serve کن.توی خط ۴ عه Dockerfile میایم یه Directory به اسم app درست می‌کنیم که قراره محتوایت پروژه رو توی اون ریخته بشه.توی خط ۵ محتویات کل پروژه رو میریزیم توی Directory عه app که بالا تعریف کردیمتوی خط ۶ میایم پکیج های پروژه رو نصب میکنیمتوی خط ۷ هم که پروژه رو Build می‌کنیمحالا بریم سراغ stage عه بعدی و ببینیم که Nginx چجوری قراره پروژه مارو Serve کنهتوی خط ۱۱ میایم از Stage قبلی محتویات Directory عه out رو کپی می‌کنیم جایی که Nginx فایل‌هاش رو Serve میکنهتوی خط ۱۲ هم اون فایل nginx.conf که توی root پروژه گذاشتید رو کپی میکنه توی Directory عه Config های Nginx که در واقع Nginx بیاد با استفاده از این Config پروژه مارو Serve کنهحالا بیایم باهم یه نگاهی به محتویات فایل nginx.conf بندازیم.اینجا ما به Nginx میگیم پورت ۸۰ که پورت http هست اگه آدرس ما آدرس اصلی سایت بود، به طور مثال آدرس http://abcd.com بود بیا از مسیری که توی خط ۴ تعریف کردیم فایل های html رو بخون و تحویل مرورگر مخاطب بده.حالا ما فرض می‌کنیم که این پروژه رو روی گیت بردیم و روی سرور Clone کردیم و میخوایم ًRun کنیم. اولین دستوری که می‌زنیم برای اینکه Docker بیاد image عه پروژه مارو بسازه اینه:docker build -t &lt;TAG_NAME&gt; .

docker build -t react-front .جای اون TAG_NAME شما اسم image ای که در نهایت داکر قراره براتون بسازه رو بزارید و من اینجا اسم react-front رو انتخاب کردم براش. به اون نقطه آخر هم توجه کنید که داکر اشاره به directory ای که توش قرار داره میکنه و قراره اونو Dockerize کنه.بعد از زدن این دستور داکر میاد دنبال Dockerfile توی root این پروژه میگرده که خب خوشبختانه ما داریمش و داکر مرحله به مرحله دستورات رو اجرا می‌کنه و در نهایت از پروژه ما یه image به اسم react-front می‌سازه.خب حالا چجوری این پروژه رو Run کنیم؟ با استفاده از دستور زیر:docker run --name react-project -p 80:80 -d react-frontبا name-- ما به این Container اسم میدیمبا p- میگیم روی چه پورتی بیاد بالابا d- ما میگیم توی Background اجرا بشه. (اصطلاحا بهش میگن detach mode)و در نهایت Container پروژه مارو با image عه react-front ای که بالا ساختیمش، اجرا میکنه.اگه بخوایم تو قالب یه عکس ببینیم چه اتفاقی داره می‌افته یه همچین چیزی میشهنمای کلی از عملکرد داکر برای اجرای پروژهحالا شما کافیه ip سرورتون رو توی مرورگر بزنید و ببینید که پروژه React عتون Serve شده.خیلی ممنون که تا انتهای این مقاله با من همراه بودید. امیدوارم این مقاله براتون مفید بوده باشه. خوشحال میشم نظرتون درباره این مقاله رو بدونم. اگه سوالی براتون پیش اومد یا قسمتی از مقاله رو خدایی نکرده متوجه نشدید حتما باهام درمیون بزارید.</description>
                <category>علی ناصری</category>
                <author>علی ناصری</author>
                <pubDate>Wed, 06 Jan 2021 20:18:05 +0330</pubDate>
            </item>
            </channel>
</rss>