استقرار خودکار با GitHub Actions و Nanocl

Summarize this content to 400 words in Persian Lang
یاد بگیرید چگونه استقرار خود را با GitHub Actions و Nanocl خودکار کنید. این راهنما شما را در راهاندازی استقرار یکپارچه راهنمایی میکند و به کارگیری برنامههایتان را با حداقل تلاش آسانتر میکند. چه در CI/CD تازه کار باشید یا یک توسعه دهنده با تجربه، این پست به شما نشان می دهد که چگونه با استفاده از ابزارهای منبع باز قدرتمند، گردش کار خود را ساده کنید.
مقدمه
یکپارچه سازی مداوم و استقرار مستمر (CI/CD) شیوه های ضروری در توسعه نرم افزار مدرن هستند. آنها به خودکارسازی فرآیند ساخت، آزمایش و استقرار برنامهها کمک میکنند و ارائه سریع و کارآمد نرمافزار با کیفیت بالا را آسانتر میکنند. GitHub Actions یک ابزار قدرتمند است که به شما امکان می دهد خط لوله CI/CD خود را مستقیماً از مخزن GitHub خود خودکار کنید. Nanocl یک ارکستراتور کانتینر و ماشین مجازی است که با ارائه یک رابط یکپارچه برای مدیریت زیرساخت شما، فرآیند استقرار را ساده می کند.
در این وبلاگ نشان خواهم داد که چگونه خط لوله CI/CD خود را با Github Actions و Nanocl برای استقرار اسناد next-hat و ntex.rs که از docusaurus استفاده می کنند، راه اندازی کردم.
پیش نیازها
قبل از شروع به چند چیز نیاز دارید:
یک حساب GitHub (شما می توانید به صورت رایگان در github.com ثبت نام کنید)
پروژه ای برای استقرار (این می تواند یک وب سایت ثابت، یک برنامه وب یا هر چیزی باشد که می تواند در یک کانتینر اجرا شود)
یک سرور اختصاصی یا یک VPS (من از ovh برای سرورها استفاده می کنم)
نام دامنه ای که به سرور شما اشاره می کند (من از ovh برای نام دامنه استفاده می کنم)
Docker روی ماشین و سرور محلی شما نصب شده است (دستورالعمل های نصب را می توانید در اینجا بیابید)
Nanocl روی سرور شما نصب شده است (دستورالعمل های نصب را می توانید در اینجا بیابید)
ایجاد تصویر ظرف
ما نگاهی به نحوه ایجاد تصویر ظرف برای استقرار مستندات next-hat و ntex.rs خواهیم داشت که از docusaurus استفاده می کنند. اگر از قبل میدانید چگونه یک تصویر کانتینر داکر را تنظیم کنید، میتوانید از این بخش صرفنظر کنید.
ایجاد یک فایل پیکربندی Nginx
استفاده می کنیم nginx به عنوان یک وب سرور برای ارائه فایل های ثابت تولید شده توسط docusaurus. را server.nginx فایل حاوی پیکربندی برای سرور nginx است. شما می توانید آن را با فایل پیکربندی خود جایگزین کنید تا مطابق با مورد استفاده شما باشد.
server {
listen 80;
listen [::]:80;
rewrite ^/(.*)/$ /$1 permanent;
gzip on;
gzip_vary on;
gzip_proxied any;
gzip_comp_level 8;
gunzip on;
gzip_types application/javascript image/* text/css;
gzip_disable “MSIE [1-6]\.”;
root /home/node/app;
error_page 404 /404.html;
try_files $uri.html $uri/index.html =404;
## All static files will be cached.
location ~* ^.+\.(?:css|webp|cur|js|jpe?g|gif|htc|ico|png|html|xml|otf|ttf|eot|woff|woff2|svg)$ {
access_log off;
expires 1y;
add_header Cache-Control max-age=31536000;
## No need to bleed constant updates. Send the all shebang in one
## fell swoop.
tcp_nodelay off;
## Set the OS file cache.
open_file_cache max=3000 inactive=120s;
open_file_cache_valid 45s;
open_file_cache_min_uses 2;
open_file_cache_errors off;
}
}
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
بیایید تجزیه کنیم server.nginx فایل پیکربندی:
server { … }: این بلوک پیکربندی سرور Nginx را تعریف می کند.
listen 80;: این خط مشخص می کند که سرور باید در پورت 80 گوش کند.
rewrite ^/(.*)/$ /$1 permanent;: این خط درخواست ها را با اسلش انتهایی به همان URL بدون اسلش هدایت می کند.
gzip on;: این خط فشرده سازی gzip را برای پاسخ ها فعال می کند.
root /home/node/app;: این خط دایرکتوری ریشه ای را برای ارائه فایل های استاتیک مشخص می کند.
error_page 404 /404.html;: این خط صفحه خطای مورد استفاده برای خطاهای 404 را مشخص می کند.
try_files $uri.html $uri/index.html =404;: این خط فایل هایی را مشخص می کند که باید هنگام درخواست امتحان شوند.
location ~* ^.+\.(?:css|webp|cur|js|jpe?g|gif|htc|ico|png|html|xml|otf|ttf|eot|woff|woff2|svg)$ { … }: این بلوک پیکربندی را برای ارائه فایلهای استاتیک با فعال کردن کش مشخص میکند.
این فایل پیکربندی سرور Nginx را برای ارائه فایلهای استاتیک بهینه میکند و با فعال کردن فشردهسازی و ذخیره gzip عملکرد را بهبود میبخشد.
ایجاد یک Dockerfile
Dockerfile یک سند متنی است که شامل تمام دستورات مورد نیاز برای ساخت یک تصویر داکر است. تصویر پایه برای استفاده، دستورات برای اجرا و فایل هایی که باید در تصویر کپی شوند را مشخص می کند. در این راهنما، یک Dockerfile برای یک وب سایت docusaurus ایجاد می کنیم. می توانید دستورات مورد نیاز پروژه خود را جایگزین کنید.
یک فایل جدید در فهرست پروژه خود به نام Dockerfile ایجاد کنید. این فایل شامل پیکربندی برای تصویر Docker شما خواهد بود. در اینجا یک نمونه Dockerfile برای یک وب سایت docusaurus آمده است:
FROM node:22.11.0-alpine AS builder
RUN apk add git
USER node
# Create app directory (with user `node`)
RUN mkdir -p /home/node/app
# Set is as cwd
WORKDIR /home/node/app
# Install app dependencies
# A wildcard is used to ensure both package.json AND package-lock.json are copied
# where available (npm@5+)
COPY –chown=node package*.json ./
# Install dependencies
RUN npm install
# Bundle app source code
COPY –chown=node . .
COPY –chown=node ./.git ./.git
RUN npm run build
FROM nginx:1.27.0-alpine3.19-slim
WORKDIR /etc/nginx/conf.d
COPY –from=builder /home/node/app/build /home/node/app
COPY ./server.nginx ./default.conf
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
بیایید Dockerfile را تجزیه کنیم:
FROM node:22.11.0-alpine AS builder: این خط تصویر پایه برای استفاده در مرحله ساخت را مشخص می کند. ما استفاده می کنیم node:22.11.0-alpine image، که یک نسخه سبک وزن از Node.js است که شامل npm است.
RUN apk add git: این خط را نصب می کند git بسته ای که برای شبیه سازی مخزن مورد نیاز است.
USER node: این خط به node user، که یک کاربر غیر ریشه است که توسط تصویر Node.js ایجاد شده است.
RUN mkdir -p /home/node/app: این خط یک دایرکتوری برای کد برنامه ایجاد می کند.
WORKDIR /home/node/app: این خط دایرکتوری کاری را روی دایرکتوری برنامه تنظیم می کند.
COPY –chown=node package*.json .: این خط را کپی می کند package.json و package-lock.json فایل ها در تصویر
RUN npm install: این خط وابستگی های مشخص شده در را نصب می کند package.json فایل
COPY –chown=node . .: این خط کد برنامه را در تصویر کپی می کند.
COPY –chown=node ./.git ./.git: این خط را کپی می کند .git دایرکتوری در تصویر
RUN npm run build: این خط برنامه را با استفاده از npm run build فرمان
FROM nginx:1.27.0-alpine3.19-slim: این خط تصویر پایه را برای استفاده در تصویر نهایی مشخص می کند. ما استفاده می کنیم nginx:1.27.0-alpine3.19-slim تصویر، که نسخه سبک وزن Nginx است.
WORKDIR /etc/nginx/conf.d: این خط دایرکتوری کاری را روی دایرکتوری پیکربندی Nginx تنظیم می کند.
COPY –from=builder /home/node/app/build /home/node/app: این خط فایل های استاتیک تولید شده توسط مرحله ساخت را در دایرکتوری پیکربندی Nginx کپی می کند.
COPY ./server.nginx ./default.conf: این خط را کپی می کند server.nginx فایل را در دایرکتوری پیکربندی Nginx قرار دهید.
این Dockerfile یک ساخت چند مرحله ای ایجاد می کند که ابتدا برنامه را با استفاده از Node.js می سازد و سپس فایل های استاتیک را در یک تصویر Nginx کپی می کند. این رویکرد با جداسازی وابستگی های ساخت از وابستگی های زمان اجرا، اندازه تصویر نهایی را کاهش می دهد و عملکرد را بهبود می بخشد.
ساخت و اجرای تصویر Docker به صورت محلی
قبل از استقرار برنامه خود در سرور خود، باید تصویر Docker را به صورت محلی آزمایش کنید تا مطمئن شوید که مطابق انتظار کار می کند. با استفاده از دستورات زیر می توانید تصویر Docker را بر روی ماشین محلی خود بسازید و اجرا کنید:
docker build -t my-image .
docker run -p 8080:80 my-image
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
را docker build فرمان تصویر داکر را با استفاده از Dockerfile در دایرکتوری فعلی و آن را با نام تگ می کند my-image. را docker run دستور، تصویر Docker را روی پورت 8080 اجرا میکند و آن را به پورت 80 داخل کانتینر نگاشت میکند. با باز کردن یک مرورگر وب و پیمایش به برنامه می توانید به برنامه دسترسی پیدا کنید http://localhost:8080.
اگر همه چیز همانطور که انتظار می رود کار کند، باید نسخه تولیدی وب سایت docusaurus خود را در مرورگر مشاهده کنید. اکنون می توانید با استفاده از GitHub Actions و Nanocl برنامه خود را روی سرور خود مستقر کنید.
راه اندازی Nanocl
Nanocl ابزار قدرتمندی است که فرآیند استقرار را با ارائه یک رابط یکپارچه برای مدیریت زیرساخت شما ساده می کند. شما می توانید از Nanocl برای استقرار برنامه های کاربردی خود در سرور خود با حداقل تلاش استفاده کنید. در این راهنما، ما به شما نشان خواهیم داد که چگونه Nanocl را روی سرور خود راه اندازی کنید و برنامه خود را با استفاده از یک فایل پیکربندی ساده اجرا کنید.
ابتدا باید Nanocl را روی سرور خود نصب کنید. شما می توانید دستورالعمل نصب را در اینجا پیدا کنید. پس از نصب Nanocl، می توانید یک فایل پیکربندی برای برنامه خود ایجاد کنید. این فایل شامل تنظیمات برنامه شما مانند نام تصویر، شماره پورت و متغیرهای محیط خواهد بود.
به طور پیش فرض پس از نصب Nanocl فقط از طریق قابل دسترسی است /run/nanocl/nanocl.sock. میتوانید از یک قانون پروکسی برای نمایش آن در اینترنت عمومی استفاده کنید، با این حال، در معرض دید عموم قرار دادن آن بدون گواهی SSL/TLS خود امضا شده توصیه نمیشود.این می تواند به مهاجم اجازه دهد تا کنترل سرور شما را در دست بگیرد.امیدواریم، ما یک قانون از پیش پیکربندی شده داریم که می توانید برای افشای Nanocl Daemon اعمال کنید.
در سرور اختصاصی یا VPS خود، دستور زیر را برای اعمال قانون اجرا کنید:
nanocl state apply -fs https://nhnr.io/v0.16/sys/enable-remote-nanocld.yml
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
Nanocl Daemon را با گواهی SSL/TLS امضا شده در پورت 9943 در معرض اینترنت عمومی قرار می دهد.
راه اندازی Github Secrets
GitHub Secrets به شما این امکان را می دهد که به طور ایمن اطلاعات حساس را در مخزن GitHub خود ذخیره و استفاده کنید. می توانید از GitHub Secrets برای ذخیره اعتبار سرور، کلیدهای API و سایر اطلاعات حساس مورد نیاز برای استقرار برنامه خود استفاده کنید. در این راهنما، ما از GitHub Secrets برای ذخیره اعتبار مورد نیاز برای استقرار برنامه شما در سرورتان با استفاده از Nanocl استفاده خواهیم کرد.
برای شروع، به مخزن GitHub خود بروید و روی آن کلیک کنید Settings برگه سپس، روی آن کلیک کنید Secrets and variables پیوند در نوار کناری سمت چپ بر روی کلیک کنید Actions پیوند.شما باید صفحه ای مانند این را ببینید:
بر روی کلیک کنید New repository secret دکمه ایجاد یک راز جدید. می توانید برای هر یک از مقادیر زیر یک راز ایجاد کنید:
NANOCL_HOST: نام میزبان یا آدرس IP سرور شما با پورت 9943. مثال: https://example.com:9943
NANOCL_CERT: محتوای گواهی SSL/TLS خود امضا شده که برای ایمن سازی اتصال به Nanocl Daemon استفاده می شود.
NANOCL_CERT_KEY: محتوای کلید خصوصی مورد استفاده برای ایمن سازی اتصال به Nanocl Daemon.
با اجرای دستورات زیر در سرور خود می توانید محتوای گواهی و کلید خصوصی را پیدا کنید:
nanocl secret inspect cert.client.nanocl.io
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
این دستور محتوای گواهی و کلید خصوصی را خروجی می دهد. می توانید محتوا را در صفحه Secrets GitHub کپی و جایگذاری کنید.
ایجاد یک پیکربندی Statefile
Statefile یک فایل پیکربندی است که شامل تنظیمات برنامه شما است. نام تصویر، شماره پورت و متغیرهای محیطی مورد نیاز برای استقرار برنامه شما را مشخص می کند. شما می توانید یک Statefile برای برنامه خود ایجاد کنید و از آن برای استقرار برنامه خود در سرور خود با استفاده از Nanocl استفاده کنید.این Statefile است که من برای استقرار مستندات بعدی کلاه استفاده می کنم:
ApiVersion: v0.16
Args:
– Name: version
Kind: String
Cargoes:
– Name: nh-doc
Container:
Image: ghcr.io/next-hat/documentation:${{ Args.version }}
Resources:
– Name: http.docs.next-hat.com
Kind: ncproxy.io/rule
Data:
Rules:
– Domain: docs.next-hat.com
Network: Public
# Secret created for the certbot job below
# You can remove this line if you don’t want https
Ssl: cert.docs.next-hat.com
Locations:
– Path: /
Target:
Key: nh-doc.global.c
Port: 80
– Domain: docs.next-hat.com
Network: Public
Locations:
– Path: /
Target:
Url: https://docs.next-hat.com
Redirect: Temporary
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
این Statefile باید در ریشه دایرکتوری پروژه شما قرار گیرد.
راه اندازی GitHub Actions
GitHub Actions به شما امکان می دهد گردش کار خود را مستقیماً از مخزن GitHub خود خودکار کنید. میتوانید گردشهای کاری سفارشی ایجاد کنید که روی رویدادهای خاص اجرا شوند، مانند فشار دادن کد به مخزن یا ایجاد یک درخواست کشش. در این راهنما، ما یک گردش کاری ایجاد می کنیم که برنامه شما را با استفاده از Nanocl بر روی سرور شما می سازد.کد منبع کامل را می توانید در اینجا بیابید
ساخت و انتشار تصویر داکر
برای شروع، یک فایل جدید در مخزن خود به نام ایجاد کنید .github/workflows/build-and-publish.yml. این فایل شامل پیکربندی برای گردش کار GitHub Actions شما خواهد بود. و برای ساخت تصویر docker شما و انتشار آن در رجیستری کانتینر github استفاده خواهد شد. فقط زمانی که در حال ادغام به شاخه اصلی هستیم.
name: Build and publish docker image
on:
push:
branches:
– master
jobs:
deploy:
name: Build and publish docker image
runs-on: ubuntu-latest
steps:
– uses: actions/checkout@v3
– name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2
– name: Log in to GitHub Container Registry
uses: docker/login-action@v2
with:
registry: ghcr.io
username: ${{ github.repository_owner }}
password: ${{ secrets.GITHUB_TOKEN }}
– name: Extract version from package.json
id: extract_version
run: |
version=$(jq -r ‘.version’ package.json)
echo “PACKAGE_VERSION=$version” >> $GITHUB_ENV
– name: Check if version already exists
id: check_version
run: |
VERSION=${{ env.PACKAGE_VERSION }}
IMAGE_NAME=ghcr.io/${{ github.repository_owner }}/my-image
if docker manifest inspect $IMAGE_NAME:$VERSION > /dev/null 2>&1; then
echo “Version $VERSION already exists.”
exit 1
fi
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
– name: Build and push Docker image
uses: docker/build-push-action@v4
with:
context: .
push: true
tags: |
ghcr.io/${{ github.repository_owner }}/documentation:latest
ghcr.io/${{ github.repository_owner }}/documentation:${{ env.PACKAGE_VERSION }}
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
هر بار که کدها را در شاخه اصلی مخزن خود ادغام می کنید، این گردش کار اجرا می شود. این یک تصویر داکر از کد شما می سازد، آن را با آخرین نسخه از کد شما تگ می کند package.json فایل، و آن را به رجیستری ظرف GitHub فشار دهید. می توانید جایگزین کنید documentation با نام تصویر شما
استقرار برنامه با Nanocl
سپس یک فایل جدید در مخزن خود به نام ایجاد کنید .github/workflows/deploy.yml. این فایل شامل پیکربندی برای گردش کار GitHub Actions شما خواهد بود. و برای استقرار برنامه شما روی سرور شما با استفاده از Nanocl استفاده خواهد شد.
name: Deploy
on:
workflow_run:
workflows: [“Build and publish Docker image”]
types:
– completed
jobs:
deploy:
runs-on: ubuntu-latest
steps:
– name: Checkout repository
uses: actions/checkout@v3
– name: Install nanocl cli
run: |
wget https://github.com/next-hat/nanocl/releases/download/nanocl-0.16.2/nanocl_0.16.2_amd64.deb
sudo dpkg -i nanocl_0.16.1_amd64.deb
rm nanocl_0.16.1_amd64.deb
– name: Deploy to production
run: |
VERSION=$(jq -r ‘.version’ package.json)
nanocl version
echo $VERSION
nanocl state apply -ys Statefile.yml — –version $VERSION
env:
HOST: ${{ secrets.NANOCL_HOST }}
CERT: ${{ secrets.NANOCL_CERT }}
CERT_KEY: ${{ secrets.NANOCL_CERT_KEY }}
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
این گردش کار هر بار اجرا می شود Build and publish Docker image گردش کار تکمیل شده است. برنامه شما را با استفاده از Nanocl روی سرور شما مستقر می کند. می توانید جایگزین کنید Statefile.yml با مسیر فایل پیکربندی Statefile اگر نام مسیر دیگری دارید.
اکنون شما خط لوله CI/CD خود را با GitHub Actions و Nanocl راه اندازی کرده اید. هر بار که کد را به مخزن خود فشار می دهید، GitHub Actions تصویر Docker شما را در رجیستری کانتینر GitHub می سازد و منتشر می کند. هنگامی که تصویر منتشر شد، گردش کار استقرار را آغاز می کند، که برنامه شما را با استفاده از Nanocl در سرور شما مستقر می کند.
SSL/TLS عمومی را با Let's Encrypt فعال کنید
علاوه بر این، می توانید SSL/TLS عمومی را با Let's Encrypt فعال کنید. می توانید از دستور زیر برای فعال کردن SSL/TLS عمومی با Let's Encrypt استفاده کنید:
nanocl state apply -fs https://nhnr.io/v0.16/sys/certbot.yml — –email contact@next-hat.com –domain docs.next-hat.com
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
نتیجه گیری
با دنبال کردن مراحل ذکر شده در این راهنما، میتوانید با کمترین تلاش و بدون توقف، استقرار برنامههای خود را به سرور خود به طور خودکار انجام دهید. این به شما کمک میکند نرمافزار با کیفیت بالا را به سرعت و کارآمد ارائه دهید و مدیریت زیرساختها و استقرار برنامههای خود را با اطمینان آسانتر میکند.
اکنون که می دانید چگونه استقرار خود را با GitHub Actions و Nanocl خودکار کنید، چرا آن را با پروژه خود امتحان نکنید؟ به ما اطلاع دهید که چگونه پیش می رود یا اگر سوالی دارید!
اگر سؤالی دارید یا برای راهاندازی خط لوله CI/CD خود با GitHub Actions و Nanocl به کمک نیاز دارید، میتوانید به سرور discord من بپیوندید. من اینجا هستم تا به شما کمک کنم در سفر توسعه نرم افزار خود موفق شوید.
یاد بگیرید چگونه استقرار خود را با GitHub Actions و Nanocl خودکار کنید. این راهنما شما را در راهاندازی استقرار یکپارچه راهنمایی میکند و به کارگیری برنامههایتان را با حداقل تلاش آسانتر میکند. چه در CI/CD تازه کار باشید یا یک توسعه دهنده با تجربه، این پست به شما نشان می دهد که چگونه با استفاده از ابزارهای منبع باز قدرتمند، گردش کار خود را ساده کنید.
مقدمه
یکپارچه سازی مداوم و استقرار مستمر (CI/CD) شیوه های ضروری در توسعه نرم افزار مدرن هستند. آنها به خودکارسازی فرآیند ساخت، آزمایش و استقرار برنامهها کمک میکنند و ارائه سریع و کارآمد نرمافزار با کیفیت بالا را آسانتر میکنند. GitHub Actions یک ابزار قدرتمند است که به شما امکان می دهد خط لوله CI/CD خود را مستقیماً از مخزن GitHub خود خودکار کنید. Nanocl یک ارکستراتور کانتینر و ماشین مجازی است که با ارائه یک رابط یکپارچه برای مدیریت زیرساخت شما، فرآیند استقرار را ساده می کند.
در این وبلاگ نشان خواهم داد که چگونه خط لوله CI/CD خود را با Github Actions و Nanocl برای استقرار اسناد next-hat و ntex.rs که از docusaurus استفاده می کنند، راه اندازی کردم.
پیش نیازها
قبل از شروع به چند چیز نیاز دارید:
- یک حساب GitHub (شما می توانید به صورت رایگان در github.com ثبت نام کنید)
- پروژه ای برای استقرار (این می تواند یک وب سایت ثابت، یک برنامه وب یا هر چیزی باشد که می تواند در یک کانتینر اجرا شود)
- یک سرور اختصاصی یا یک VPS (من از ovh برای سرورها استفاده می کنم)
- نام دامنه ای که به سرور شما اشاره می کند (من از ovh برای نام دامنه استفاده می کنم)
- Docker روی ماشین و سرور محلی شما نصب شده است (دستورالعمل های نصب را می توانید در اینجا بیابید)
- Nanocl روی سرور شما نصب شده است (دستورالعمل های نصب را می توانید در اینجا بیابید)
ایجاد تصویر ظرف
ما نگاهی به نحوه ایجاد تصویر ظرف برای استقرار مستندات next-hat و ntex.rs خواهیم داشت که از docusaurus استفاده می کنند. اگر از قبل میدانید چگونه یک تصویر کانتینر داکر را تنظیم کنید، میتوانید از این بخش صرفنظر کنید.
ایجاد یک فایل پیکربندی Nginx
استفاده می کنیم nginx
به عنوان یک وب سرور برای ارائه فایل های ثابت تولید شده توسط docusaurus. را server.nginx
فایل حاوی پیکربندی برای سرور nginx است. شما می توانید آن را با فایل پیکربندی خود جایگزین کنید تا مطابق با مورد استفاده شما باشد.
server {
listen 80;
listen [::]:80;
rewrite ^/(.*)/$ /$1 permanent;
gzip on;
gzip_vary on;
gzip_proxied any;
gzip_comp_level 8;
gunzip on;
gzip_types application/javascript image/* text/css;
gzip_disable "MSIE [1-6]\.";
root /home/node/app;
error_page 404 /404.html;
try_files $uri.html $uri/index.html =404;
## All static files will be cached.
location ~* ^.+\.(?:css|webp|cur|js|jpe?g|gif|htc|ico|png|html|xml|otf|ttf|eot|woff|woff2|svg)$ {
access_log off;
expires 1y;
add_header Cache-Control max-age=31536000;
## No need to bleed constant updates. Send the all shebang in one
## fell swoop.
tcp_nodelay off;
## Set the OS file cache.
open_file_cache max=3000 inactive=120s;
open_file_cache_valid 45s;
open_file_cache_min_uses 2;
open_file_cache_errors off;
}
}
بیایید تجزیه کنیم server.nginx
فایل پیکربندی:
-
server { ... }
: این بلوک پیکربندی سرور Nginx را تعریف می کند. -
listen 80;
: این خط مشخص می کند که سرور باید در پورت 80 گوش کند. -
rewrite ^/(.*)/$ /$1 permanent;
: این خط درخواست ها را با اسلش انتهایی به همان URL بدون اسلش هدایت می کند. -
gzip on;
: این خط فشرده سازی gzip را برای پاسخ ها فعال می کند. -
root /home/node/app;
: این خط دایرکتوری ریشه ای را برای ارائه فایل های استاتیک مشخص می کند. -
error_page 404 /404.html;
: این خط صفحه خطای مورد استفاده برای خطاهای 404 را مشخص می کند. -
try_files $uri.html $uri/index.html =404;
: این خط فایل هایی را مشخص می کند که باید هنگام درخواست امتحان شوند. -
location ~* ^.+\.(?:css|webp|cur|js|jpe?g|gif|htc|ico|png|html|xml|otf|ttf|eot|woff|woff2|svg)$ { ... }
: این بلوک پیکربندی را برای ارائه فایلهای استاتیک با فعال کردن کش مشخص میکند.
این فایل پیکربندی سرور Nginx را برای ارائه فایلهای استاتیک بهینه میکند و با فعال کردن فشردهسازی و ذخیره gzip عملکرد را بهبود میبخشد.
ایجاد یک Dockerfile
Dockerfile یک سند متنی است که شامل تمام دستورات مورد نیاز برای ساخت یک تصویر داکر است. تصویر پایه برای استفاده، دستورات برای اجرا و فایل هایی که باید در تصویر کپی شوند را مشخص می کند. در این راهنما، یک Dockerfile برای یک وب سایت docusaurus ایجاد می کنیم. می توانید دستورات مورد نیاز پروژه خود را جایگزین کنید.
یک فایل جدید در فهرست پروژه خود به نام Dockerfile ایجاد کنید. این فایل شامل پیکربندی برای تصویر Docker شما خواهد بود. در اینجا یک نمونه Dockerfile برای یک وب سایت docusaurus آمده است:
FROM node:22.11.0-alpine AS builder
RUN apk add git
USER node
# Create app directory (with user `node`)
RUN mkdir -p /home/node/app
# Set is as cwd
WORKDIR /home/node/app
# Install app dependencies
# A wildcard is used to ensure both package.json AND package-lock.json are copied
# where available (npm@5+)
COPY --chown=node package*.json ./
# Install dependencies
RUN npm install
# Bundle app source code
COPY --chown=node . .
COPY --chown=node ./.git ./.git
RUN npm run build
FROM nginx:1.27.0-alpine3.19-slim
WORKDIR /etc/nginx/conf.d
COPY --from=builder /home/node/app/build /home/node/app
COPY ./server.nginx ./default.conf
بیایید Dockerfile را تجزیه کنیم:
-
FROM node:22.11.0-alpine AS builder
: این خط تصویر پایه برای استفاده در مرحله ساخت را مشخص می کند. ما استفاده می کنیمnode:22.11.0-alpine
image، که یک نسخه سبک وزن از Node.js است که شامل npm است. -
RUN apk add git
: این خط را نصب می کندgit
بسته ای که برای شبیه سازی مخزن مورد نیاز است. -
USER node
: این خط بهnode
user، که یک کاربر غیر ریشه است که توسط تصویر Node.js ایجاد شده است. -
RUN mkdir -p /home/node/app
: این خط یک دایرکتوری برای کد برنامه ایجاد می کند. -
WORKDIR /home/node/app
: این خط دایرکتوری کاری را روی دایرکتوری برنامه تنظیم می کند. -
COPY --chown=node package*.json .
: این خط را کپی می کندpackage.json
وpackage-lock.json
فایل ها در تصویر -
RUN npm install
: این خط وابستگی های مشخص شده در را نصب می کندpackage.json
فایل -
COPY --chown=node . .
: این خط کد برنامه را در تصویر کپی می کند. -
COPY --chown=node ./.git ./.git
: این خط را کپی می کند.git
دایرکتوری در تصویر -
RUN npm run build
: این خط برنامه را با استفاده ازnpm run build
فرمان -
FROM nginx:1.27.0-alpine3.19-slim
: این خط تصویر پایه را برای استفاده در تصویر نهایی مشخص می کند. ما استفاده می کنیمnginx:1.27.0-alpine3.19-slim
تصویر، که نسخه سبک وزن Nginx است. -
WORKDIR /etc/nginx/conf.d
: این خط دایرکتوری کاری را روی دایرکتوری پیکربندی Nginx تنظیم می کند. -
COPY --from=builder /home/node/app/build /home/node/app
: این خط فایل های استاتیک تولید شده توسط مرحله ساخت را در دایرکتوری پیکربندی Nginx کپی می کند. -
COPY ./server.nginx ./default.conf
: این خط را کپی می کندserver.nginx
فایل را در دایرکتوری پیکربندی Nginx قرار دهید.
این Dockerfile یک ساخت چند مرحله ای ایجاد می کند که ابتدا برنامه را با استفاده از Node.js می سازد و سپس فایل های استاتیک را در یک تصویر Nginx کپی می کند. این رویکرد با جداسازی وابستگی های ساخت از وابستگی های زمان اجرا، اندازه تصویر نهایی را کاهش می دهد و عملکرد را بهبود می بخشد.
ساخت و اجرای تصویر Docker به صورت محلی
قبل از استقرار برنامه خود در سرور خود، باید تصویر Docker را به صورت محلی آزمایش کنید تا مطمئن شوید که مطابق انتظار کار می کند. با استفاده از دستورات زیر می توانید تصویر Docker را بر روی ماشین محلی خود بسازید و اجرا کنید:
docker build -t my-image .
docker run -p 8080:80 my-image
را docker build
فرمان تصویر داکر را با استفاده از Dockerfile
در دایرکتوری فعلی و آن را با نام تگ می کند my-image
. را docker run
دستور، تصویر Docker را روی پورت 8080 اجرا میکند و آن را به پورت 80 داخل کانتینر نگاشت میکند. با باز کردن یک مرورگر وب و پیمایش به برنامه می توانید به برنامه دسترسی پیدا کنید http://localhost:8080
.
اگر همه چیز همانطور که انتظار می رود کار کند، باید نسخه تولیدی وب سایت docusaurus خود را در مرورگر مشاهده کنید. اکنون می توانید با استفاده از GitHub Actions و Nanocl برنامه خود را روی سرور خود مستقر کنید.
راه اندازی Nanocl
Nanocl ابزار قدرتمندی است که فرآیند استقرار را با ارائه یک رابط یکپارچه برای مدیریت زیرساخت شما ساده می کند. شما می توانید از Nanocl برای استقرار برنامه های کاربردی خود در سرور خود با حداقل تلاش استفاده کنید. در این راهنما، ما به شما نشان خواهیم داد که چگونه Nanocl را روی سرور خود راه اندازی کنید و برنامه خود را با استفاده از یک فایل پیکربندی ساده اجرا کنید.
ابتدا باید Nanocl را روی سرور خود نصب کنید. شما می توانید دستورالعمل نصب را در اینجا پیدا کنید. پس از نصب Nanocl، می توانید یک فایل پیکربندی برای برنامه خود ایجاد کنید. این فایل شامل تنظیمات برنامه شما مانند نام تصویر، شماره پورت و متغیرهای محیط خواهد بود.
به طور پیش فرض پس از نصب Nanocl فقط از طریق قابل دسترسی است /run/nanocl/nanocl.sock
. میتوانید از یک قانون پروکسی برای نمایش آن در اینترنت عمومی استفاده کنید، با این حال، در معرض دید عموم قرار دادن آن بدون گواهی SSL/TLS خود امضا شده توصیه نمیشود.
این می تواند به مهاجم اجازه دهد تا کنترل سرور شما را در دست بگیرد.
امیدواریم، ما یک قانون از پیش پیکربندی شده داریم که می توانید برای افشای Nanocl Daemon اعمال کنید.
در سرور اختصاصی یا VPS خود، دستور زیر را برای اعمال قانون اجرا کنید:
nanocl state apply -fs https://nhnr.io/v0.16/sys/enable-remote-nanocld.yml
Nanocl Daemon را با گواهی SSL/TLS امضا شده در پورت 9943 در معرض اینترنت عمومی قرار می دهد.
راه اندازی Github Secrets
GitHub Secrets به شما این امکان را می دهد که به طور ایمن اطلاعات حساس را در مخزن GitHub خود ذخیره و استفاده کنید. می توانید از GitHub Secrets برای ذخیره اعتبار سرور، کلیدهای API و سایر اطلاعات حساس مورد نیاز برای استقرار برنامه خود استفاده کنید. در این راهنما، ما از GitHub Secrets برای ذخیره اعتبار مورد نیاز برای استقرار برنامه شما در سرورتان با استفاده از Nanocl استفاده خواهیم کرد.
برای شروع، به مخزن GitHub خود بروید و روی آن کلیک کنید Settings
برگه سپس، روی آن کلیک کنید Secrets and variables
پیوند در نوار کناری سمت چپ بر روی کلیک کنید Actions
پیوند.
شما باید صفحه ای مانند این را ببینید:
بر روی کلیک کنید New repository secret
دکمه ایجاد یک راز جدید. می توانید برای هر یک از مقادیر زیر یک راز ایجاد کنید:
-
NANOCL_HOST
: نام میزبان یا آدرس IP سرور شما با پورت 9943. مثال:https://example.com:9943
-
NANOCL_CERT
: محتوای گواهی SSL/TLS خود امضا شده که برای ایمن سازی اتصال به Nanocl Daemon استفاده می شود. -
NANOCL_CERT_KEY
: محتوای کلید خصوصی مورد استفاده برای ایمن سازی اتصال به Nanocl Daemon.
با اجرای دستورات زیر در سرور خود می توانید محتوای گواهی و کلید خصوصی را پیدا کنید:
nanocl secret inspect cert.client.nanocl.io
این دستور محتوای گواهی و کلید خصوصی را خروجی می دهد. می توانید محتوا را در صفحه Secrets GitHub کپی و جایگذاری کنید.
ایجاد یک پیکربندی Statefile
Statefile یک فایل پیکربندی است که شامل تنظیمات برنامه شما است. نام تصویر، شماره پورت و متغیرهای محیطی مورد نیاز برای استقرار برنامه شما را مشخص می کند. شما می توانید یک Statefile برای برنامه خود ایجاد کنید و از آن برای استقرار برنامه خود در سرور خود با استفاده از Nanocl استفاده کنید.
این Statefile است که من برای استقرار مستندات بعدی کلاه استفاده می کنم:
ApiVersion: v0.16
Args:
- Name: version
Kind: String
Cargoes:
- Name: nh-doc
Container:
Image: ghcr.io/next-hat/documentation:${{ Args.version }}
Resources:
- Name: http.docs.next-hat.com
Kind: ncproxy.io/rule
Data:
Rules:
- Domain: docs.next-hat.com
Network: Public
# Secret created for the certbot job below
# You can remove this line if you don't want https
Ssl: cert.docs.next-hat.com
Locations:
- Path: /
Target:
Key: nh-doc.global.c
Port: 80
- Domain: docs.next-hat.com
Network: Public
Locations:
- Path: /
Target:
Url: https://docs.next-hat.com
Redirect: Temporary
این Statefile باید در ریشه دایرکتوری پروژه شما قرار گیرد.
راه اندازی GitHub Actions
GitHub Actions به شما امکان می دهد گردش کار خود را مستقیماً از مخزن GitHub خود خودکار کنید. میتوانید گردشهای کاری سفارشی ایجاد کنید که روی رویدادهای خاص اجرا شوند، مانند فشار دادن کد به مخزن یا ایجاد یک درخواست کشش. در این راهنما، ما یک گردش کاری ایجاد می کنیم که برنامه شما را با استفاده از Nanocl بر روی سرور شما می سازد.
کد منبع کامل را می توانید در اینجا بیابید
ساخت و انتشار تصویر داکر
برای شروع، یک فایل جدید در مخزن خود به نام ایجاد کنید .github/workflows/build-and-publish.yml
. این فایل شامل پیکربندی برای گردش کار GitHub Actions شما خواهد بود. و برای ساخت تصویر docker شما و انتشار آن در رجیستری کانتینر github استفاده خواهد شد. فقط زمانی که در حال ادغام به شاخه اصلی هستیم.
name: Build and publish docker image
on:
push:
branches:
- master
jobs:
deploy:
name: Build and publish docker image
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2
- name: Log in to GitHub Container Registry
uses: docker/login-action@v2
with:
registry: ghcr.io
username: ${{ github.repository_owner }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Extract version from package.json
id: extract_version
run: |
version=$(jq -r '.version' package.json)
echo "PACKAGE_VERSION=$version" >> $GITHUB_ENV
- name: Check if version already exists
id: check_version
run: |
VERSION=${{ env.PACKAGE_VERSION }}
IMAGE_NAME=ghcr.io/${{ github.repository_owner }}/my-image
if docker manifest inspect $IMAGE_NAME:$VERSION > /dev/null 2>&1; then
echo "Version $VERSION already exists."
exit 1
fi
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Build and push Docker image
uses: docker/build-push-action@v4
with:
context: .
push: true
tags: |
ghcr.io/${{ github.repository_owner }}/documentation:latest
ghcr.io/${{ github.repository_owner }}/documentation:${{ env.PACKAGE_VERSION }}
هر بار که کدها را در شاخه اصلی مخزن خود ادغام می کنید، این گردش کار اجرا می شود. این یک تصویر داکر از کد شما می سازد، آن را با آخرین نسخه از کد شما تگ می کند package.json
فایل، و آن را به رجیستری ظرف GitHub فشار دهید. می توانید جایگزین کنید documentation
با نام تصویر شما
استقرار برنامه با Nanocl
سپس یک فایل جدید در مخزن خود به نام ایجاد کنید .github/workflows/deploy.yml
. این فایل شامل پیکربندی برای گردش کار GitHub Actions شما خواهد بود. و برای استقرار برنامه شما روی سرور شما با استفاده از Nanocl استفاده خواهد شد.
name: Deploy
on:
workflow_run:
workflows: ["Build and publish Docker image"]
types:
- completed
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v3
- name: Install nanocl cli
run: |
wget https://github.com/next-hat/nanocl/releases/download/nanocl-0.16.2/nanocl_0.16.2_amd64.deb
sudo dpkg -i nanocl_0.16.1_amd64.deb
rm nanocl_0.16.1_amd64.deb
- name: Deploy to production
run: |
VERSION=$(jq -r '.version' package.json)
nanocl version
echo $VERSION
nanocl state apply -ys Statefile.yml -- --version $VERSION
env:
HOST: ${{ secrets.NANOCL_HOST }}
CERT: ${{ secrets.NANOCL_CERT }}
CERT_KEY: ${{ secrets.NANOCL_CERT_KEY }}
این گردش کار هر بار اجرا می شود Build and publish Docker image
گردش کار تکمیل شده است. برنامه شما را با استفاده از Nanocl روی سرور شما مستقر می کند. می توانید جایگزین کنید Statefile.yml
با مسیر فایل پیکربندی Statefile اگر نام مسیر دیگری دارید.
اکنون شما خط لوله CI/CD خود را با GitHub Actions و Nanocl راه اندازی کرده اید. هر بار که کد را به مخزن خود فشار می دهید، GitHub Actions تصویر Docker شما را در رجیستری کانتینر GitHub می سازد و منتشر می کند. هنگامی که تصویر منتشر شد، گردش کار استقرار را آغاز می کند، که برنامه شما را با استفاده از Nanocl در سرور شما مستقر می کند.
SSL/TLS عمومی را با Let's Encrypt فعال کنید
علاوه بر این، می توانید SSL/TLS عمومی را با Let's Encrypt فعال کنید. می توانید از دستور زیر برای فعال کردن SSL/TLS عمومی با Let's Encrypt استفاده کنید:
nanocl state apply -fs https://nhnr.io/v0.16/sys/certbot.yml -- --email contact@next-hat.com --domain docs.next-hat.com
نتیجه گیری
با دنبال کردن مراحل ذکر شده در این راهنما، میتوانید با کمترین تلاش و بدون توقف، استقرار برنامههای خود را به سرور خود به طور خودکار انجام دهید. این به شما کمک میکند نرمافزار با کیفیت بالا را به سرعت و کارآمد ارائه دهید و مدیریت زیرساختها و استقرار برنامههای خود را با اطمینان آسانتر میکند.
اکنون که می دانید چگونه استقرار خود را با GitHub Actions و Nanocl خودکار کنید، چرا آن را با پروژه خود امتحان نکنید؟ به ما اطلاع دهید که چگونه پیش می رود یا اگر سوالی دارید!
اگر سؤالی دارید یا برای راهاندازی خط لوله CI/CD خود با GitHub Actions و Nanocl به کمک نیاز دارید، میتوانید به سرور discord من بپیوندید. من اینجا هستم تا به شما کمک کنم در سفر توسعه نرم افزار خود موفق شوید.