{"id":85287,"date":"2024-11-24T21:59:48","date_gmt":"2024-11-24T18:29:48","guid":{"rendered":"https:\/\/nabfollower.com\/blog\/automating-deployment-with-github-actions-and-nanocl-2b1e\/"},"modified":"2024-11-24T21:59:48","modified_gmt":"2024-11-24T18:29:48","slug":"automating-deployment-with-github-actions-and-nanocl-2b1e","status":"publish","type":"post","link":"https:\/\/nabfollower.com\/blog\/automating-deployment-with-github-actions-and-nanocl-2b1e\/","title":{"rendered":"\u0627\u0633\u062a\u0642\u0631\u0627\u0631 \u062e\u0648\u062f\u06a9\u0627\u0631 \u0628\u0627 GitHub Actions \u0648 Nanocl"},"content":{"rendered":"<p>Summarize this content to 400 words in Persian Lang<br \/>\n              \u06cc\u0627\u062f \u0628\u06af\u06cc\u0631\u06cc\u062f \u0686\u06af\u0648\u0646\u0647 \u0627\u0633\u062a\u0642\u0631\u0627\u0631 \u062e\u0648\u062f \u0631\u0627 \u0628\u0627 GitHub Actions \u0648 Nanocl \u062e\u0648\u062f\u06a9\u0627\u0631 \u06a9\u0646\u06cc\u062f. \u0627\u06cc\u0646 \u0631\u0627\u0647\u0646\u0645\u0627 \u0634\u0645\u0627 \u0631\u0627 \u062f\u0631 \u0631\u0627\u0647\u200c\u0627\u0646\u062f\u0627\u0632\u06cc \u0627\u0633\u062a\u0642\u0631\u0627\u0631 \u06cc\u06a9\u067e\u0627\u0631\u0686\u0647 \u0631\u0627\u0647\u0646\u0645\u0627\u06cc\u06cc \u0645\u06cc\u200c\u06a9\u0646\u062f \u0648 \u0628\u0647 \u06a9\u0627\u0631\u06af\u06cc\u0631\u06cc \u0628\u0631\u0646\u0627\u0645\u0647\u200c\u0647\u0627\u06cc\u062a\u0627\u0646 \u0631\u0627 \u0628\u0627 \u062d\u062f\u0627\u0642\u0644 \u062a\u0644\u0627\u0634 \u0622\u0633\u0627\u0646\u200c\u062a\u0631 \u0645\u06cc\u200c\u06a9\u0646\u062f. \u0686\u0647 \u062f\u0631 CI\/CD \u062a\u0627\u0632\u0647 \u06a9\u0627\u0631 \u0628\u0627\u0634\u06cc\u062f \u06cc\u0627 \u06cc\u06a9 \u062a\u0648\u0633\u0639\u0647 \u062f\u0647\u0646\u062f\u0647 \u0628\u0627 \u062a\u062c\u0631\u0628\u0647\u060c \u0627\u06cc\u0646 \u067e\u0633\u062a \u0628\u0647 \u0634\u0645\u0627 \u0646\u0634\u0627\u0646 \u0645\u06cc \u062f\u0647\u062f \u06a9\u0647 \u0686\u06af\u0648\u0646\u0647 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0627\u0628\u0632\u0627\u0631\u0647\u0627\u06cc \u0645\u0646\u0628\u0639 \u0628\u0627\u0632 \u0642\u062f\u0631\u062a\u0645\u0646\u062f\u060c \u06af\u0631\u062f\u0634 \u06a9\u0627\u0631 \u062e\u0648\u062f \u0631\u0627 \u0633\u0627\u062f\u0647 \u06a9\u0646\u06cc\u062f.<\/p>\n<p>  \u0645\u0642\u062f\u0645\u0647<\/p>\n<p>\u06cc\u06a9\u067e\u0627\u0631\u0686\u0647 \u0633\u0627\u0632\u06cc \u0645\u062f\u0627\u0648\u0645 \u0648 \u0627\u0633\u062a\u0642\u0631\u0627\u0631 \u0645\u0633\u062a\u0645\u0631 (CI\/CD) \u0634\u06cc\u0648\u0647 \u0647\u0627\u06cc \u0636\u0631\u0648\u0631\u06cc \u062f\u0631 \u062a\u0648\u0633\u0639\u0647 \u0646\u0631\u0645 \u0627\u0641\u0632\u0627\u0631 \u0645\u062f\u0631\u0646 \u0647\u0633\u062a\u0646\u062f. \u0622\u0646\u0647\u0627 \u0628\u0647 \u062e\u0648\u062f\u06a9\u0627\u0631\u0633\u0627\u0632\u06cc \u0641\u0631\u0622\u06cc\u0646\u062f \u0633\u0627\u062e\u062a\u060c \u0622\u0632\u0645\u0627\u06cc\u0634 \u0648 \u0627\u0633\u062a\u0642\u0631\u0627\u0631 \u0628\u0631\u0646\u0627\u0645\u0647\u200c\u0647\u0627 \u06a9\u0645\u06a9 \u0645\u06cc\u200c\u06a9\u0646\u0646\u062f \u0648 \u0627\u0631\u0627\u0626\u0647 \u0633\u0631\u06cc\u0639 \u0648 \u06a9\u0627\u0631\u0622\u0645\u062f \u0646\u0631\u0645\u200c\u0627\u0641\u0632\u0627\u0631 \u0628\u0627 \u06a9\u06cc\u0641\u06cc\u062a \u0628\u0627\u0644\u0627 \u0631\u0627 \u0622\u0633\u0627\u0646\u200c\u062a\u0631 \u0645\u06cc\u200c\u06a9\u0646\u0646\u062f. GitHub Actions \u06cc\u06a9 \u0627\u0628\u0632\u0627\u0631 \u0642\u062f\u0631\u062a\u0645\u0646\u062f \u0627\u0633\u062a \u06a9\u0647 \u0628\u0647 \u0634\u0645\u0627 \u0627\u0645\u06a9\u0627\u0646 \u0645\u06cc \u062f\u0647\u062f \u062e\u0637 \u0644\u0648\u0644\u0647 CI\/CD \u062e\u0648\u062f \u0631\u0627 \u0645\u0633\u062a\u0642\u06cc\u0645\u0627\u064b \u0627\u0632 \u0645\u062e\u0632\u0646 GitHub \u062e\u0648\u062f \u062e\u0648\u062f\u06a9\u0627\u0631 \u06a9\u0646\u06cc\u062f. Nanocl \u06cc\u06a9 \u0627\u0631\u06a9\u0633\u062a\u0631\u0627\u062a\u0648\u0631 \u06a9\u0627\u0646\u062a\u06cc\u0646\u0631 \u0648 \u0645\u0627\u0634\u06cc\u0646 \u0645\u062c\u0627\u0632\u06cc \u0627\u0633\u062a \u06a9\u0647 \u0628\u0627 \u0627\u0631\u0627\u0626\u0647 \u06cc\u06a9 \u0631\u0627\u0628\u0637 \u06cc\u06a9\u067e\u0627\u0631\u0686\u0647 \u0628\u0631\u0627\u06cc \u0645\u062f\u06cc\u0631\u06cc\u062a \u0632\u06cc\u0631\u0633\u0627\u062e\u062a \u0634\u0645\u0627\u060c \u0641\u0631\u0622\u06cc\u0646\u062f \u0627\u0633\u062a\u0642\u0631\u0627\u0631 \u0631\u0627 \u0633\u0627\u062f\u0647 \u0645\u06cc \u06a9\u0646\u062f.<\/p>\n<p>\u062f\u0631 \u0627\u06cc\u0646 \u0648\u0628\u0644\u0627\u06af \u0646\u0634\u0627\u0646 \u062e\u0648\u0627\u0647\u0645 \u062f\u0627\u062f \u06a9\u0647 \u0686\u06af\u0648\u0646\u0647 \u062e\u0637 \u0644\u0648\u0644\u0647 CI\/CD \u062e\u0648\u062f \u0631\u0627 \u0628\u0627 Github Actions \u0648 Nanocl \u0628\u0631\u0627\u06cc \u0627\u0633\u062a\u0642\u0631\u0627\u0631 \u0627\u0633\u0646\u0627\u062f next-hat \u0648 ntex.rs \u06a9\u0647 \u0627\u0632 docusaurus \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc \u06a9\u0646\u0646\u062f\u060c \u0631\u0627\u0647 \u0627\u0646\u062f\u0627\u0632\u06cc \u06a9\u0631\u062f\u0645.<\/p>\n<p>  \u067e\u06cc\u0634 \u0646\u06cc\u0627\u0632\u0647\u0627<\/p>\n<p>\u0642\u0628\u0644 \u0627\u0632 \u0634\u0631\u0648\u0639 \u0628\u0647 \u0686\u0646\u062f \u0686\u06cc\u0632 \u0646\u06cc\u0627\u0632 \u062f\u0627\u0631\u06cc\u062f:<\/p>\n<p>\u06cc\u06a9 \u062d\u0633\u0627\u0628 GitHub (\u0634\u0645\u0627 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u0628\u0647 \u0635\u0648\u0631\u062a \u0631\u0627\u06cc\u06af\u0627\u0646 \u062f\u0631 github.com \u062b\u0628\u062a \u0646\u0627\u0645 \u06a9\u0646\u06cc\u062f)<br \/>\n\u067e\u0631\u0648\u0698\u0647 \u0627\u06cc \u0628\u0631\u0627\u06cc \u0627\u0633\u062a\u0642\u0631\u0627\u0631 (\u0627\u06cc\u0646 \u0645\u06cc \u062a\u0648\u0627\u0646\u062f \u06cc\u06a9 \u0648\u0628 \u0633\u0627\u06cc\u062a \u062b\u0627\u0628\u062a\u060c \u06cc\u06a9 \u0628\u0631\u0646\u0627\u0645\u0647 \u0648\u0628 \u06cc\u0627 \u0647\u0631 \u0686\u06cc\u0632\u06cc \u0628\u0627\u0634\u062f \u06a9\u0647 \u0645\u06cc \u062a\u0648\u0627\u0646\u062f \u062f\u0631 \u06cc\u06a9 \u06a9\u0627\u0646\u062a\u06cc\u0646\u0631 \u0627\u062c\u0631\u0627 \u0634\u0648\u062f)<br \/>\n\u06cc\u06a9 \u0633\u0631\u0648\u0631 \u0627\u062e\u062a\u0635\u0627\u0635\u06cc \u06cc\u0627 \u06cc\u06a9 VPS (\u0645\u0646 \u0627\u0632 ovh \u0628\u0631\u0627\u06cc \u0633\u0631\u0648\u0631\u0647\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc \u06a9\u0646\u0645)<br \/>\n\u0646\u0627\u0645 \u062f\u0627\u0645\u0646\u0647 \u0627\u06cc \u06a9\u0647 \u0628\u0647 \u0633\u0631\u0648\u0631 \u0634\u0645\u0627 \u0627\u0634\u0627\u0631\u0647 \u0645\u06cc \u06a9\u0646\u062f (\u0645\u0646 \u0627\u0632 ovh \u0628\u0631\u0627\u06cc \u0646\u0627\u0645 \u062f\u0627\u0645\u0646\u0647 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc \u06a9\u0646\u0645)<br \/>\nDocker \u0631\u0648\u06cc \u0645\u0627\u0634\u06cc\u0646 \u0648 \u0633\u0631\u0648\u0631 \u0645\u062d\u0644\u06cc \u0634\u0645\u0627 \u0646\u0635\u0628 \u0634\u062f\u0647 \u0627\u0633\u062a (\u062f\u0633\u062a\u0648\u0631\u0627\u0644\u0639\u0645\u0644 \u0647\u0627\u06cc \u0646\u0635\u0628 \u0631\u0627 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u062f\u0631 \u0627\u06cc\u0646\u062c\u0627 \u0628\u06cc\u0627\u0628\u06cc\u062f)<br \/>\nNanocl \u0631\u0648\u06cc \u0633\u0631\u0648\u0631 \u0634\u0645\u0627 \u0646\u0635\u0628 \u0634\u062f\u0647 \u0627\u0633\u062a (\u062f\u0633\u062a\u0648\u0631\u0627\u0644\u0639\u0645\u0644 \u0647\u0627\u06cc \u0646\u0635\u0628 \u0631\u0627 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u062f\u0631 \u0627\u06cc\u0646\u062c\u0627 \u0628\u06cc\u0627\u0628\u06cc\u062f)<\/p>\n<p>  \u0627\u06cc\u062c\u0627\u062f \u062a\u0635\u0648\u06cc\u0631 \u0638\u0631\u0641<\/p>\n<p>\u0645\u0627 \u0646\u06af\u0627\u0647\u06cc \u0628\u0647 \u0646\u062d\u0648\u0647 \u0627\u06cc\u062c\u0627\u062f \u062a\u0635\u0648\u06cc\u0631 \u0638\u0631\u0641 \u0628\u0631\u0627\u06cc \u0627\u0633\u062a\u0642\u0631\u0627\u0631 \u0645\u0633\u062a\u0646\u062f\u0627\u062a next-hat \u0648 ntex.rs \u062e\u0648\u0627\u0647\u06cc\u0645 \u062f\u0627\u0634\u062a \u06a9\u0647 \u0627\u0632 docusaurus \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc \u06a9\u0646\u0646\u062f. \u0627\u06af\u0631 \u0627\u0632 \u0642\u0628\u0644 \u0645\u06cc\u200c\u062f\u0627\u0646\u06cc\u062f \u0686\u06af\u0648\u0646\u0647 \u06cc\u06a9 \u062a\u0635\u0648\u06cc\u0631 \u06a9\u0627\u0646\u062a\u06cc\u0646\u0631 \u062f\u0627\u06a9\u0631 \u0631\u0627 \u062a\u0646\u0638\u06cc\u0645 \u06a9\u0646\u06cc\u062f\u060c \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u06cc\u062f \u0627\u0632 \u0627\u06cc\u0646 \u0628\u062e\u0634 \u0635\u0631\u0641\u0646\u0638\u0631 \u06a9\u0646\u06cc\u062f.<\/p>\n<p>  \u0627\u06cc\u062c\u0627\u062f \u06cc\u06a9 \u0641\u0627\u06cc\u0644 \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc Nginx<\/p>\n<p>\u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc \u06a9\u0646\u06cc\u0645 nginx \u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u06cc\u06a9 \u0648\u0628 \u0633\u0631\u0648\u0631 \u0628\u0631\u0627\u06cc \u0627\u0631\u0627\u0626\u0647 \u0641\u0627\u06cc\u0644 \u0647\u0627\u06cc \u062b\u0627\u0628\u062a \u062a\u0648\u0644\u06cc\u062f \u0634\u062f\u0647 \u062a\u0648\u0633\u0637 docusaurus. \u0631\u0627 server.nginx \u0641\u0627\u06cc\u0644 \u062d\u0627\u0648\u06cc \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc \u0628\u0631\u0627\u06cc \u0633\u0631\u0648\u0631 nginx \u0627\u0633\u062a. \u0634\u0645\u0627 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u0622\u0646 \u0631\u0627 \u0628\u0627 \u0641\u0627\u06cc\u0644 \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc \u062e\u0648\u062f \u062c\u0627\u06cc\u06af\u0632\u06cc\u0646 \u06a9\u0646\u06cc\u062f \u062a\u0627 \u0645\u0637\u0627\u0628\u0642 \u0628\u0627 \u0645\u0648\u0631\u062f \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0634\u0645\u0627 \u0628\u0627\u0634\u062f.<\/p>\n<p>server {<br \/>\n  listen       80;<br \/>\n  listen  [::]:80;<br \/>\n  rewrite ^\/(.*)\/$ \/$1 permanent;<\/p>\n<p>  gzip on;<br \/>\n  gzip_vary on;<br \/>\n  gzip_proxied any;<br \/>\n  gzip_comp_level 8;<br \/>\n  gunzip on;<br \/>\n  gzip_types application\/javascript image\/* text\/css;<br \/>\n  gzip_disable &#8220;MSIE [1-6]\\.&#8221;;<\/p>\n<p>  root \/home\/node\/app;<br \/>\n  error_page 404 \/404.html;<br \/>\n  try_files $uri.html $uri\/index.html =404;<\/p>\n<p>  ## All static files will be cached.<br \/>\n  location ~* ^.+\\.(?:css|webp|cur|js|jpe?g|gif|htc|ico|png|html|xml|otf|ttf|eot|woff|woff2|svg)$ {<br \/>\n    access_log off;<br \/>\n    expires 1y;<br \/>\n    add_header Cache-Control max-age=31536000;<\/p>\n<p>    ## No need to bleed constant updates. Send the all shebang in one<br \/>\n    ## fell swoop.<br \/>\n    tcp_nodelay off;<\/p>\n<p>    ## Set the OS file cache.<br \/>\n    open_file_cache max=3000 inactive=120s;<br \/>\n    open_file_cache_valid 45s;<br \/>\n    open_file_cache_min_uses 2;<br \/>\n    open_file_cache_errors off;<br \/>\n  }<br \/>\n}<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>\u0628\u06cc\u0627\u06cc\u06cc\u062f \u062a\u062c\u0632\u06cc\u0647 \u06a9\u0646\u06cc\u0645 server.nginx \u0641\u0627\u06cc\u0644 \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc:<\/p>\n<p>server { &#8230; }: \u0627\u06cc\u0646 \u0628\u0644\u0648\u06a9 \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc \u0633\u0631\u0648\u0631 Nginx \u0631\u0627 \u062a\u0639\u0631\u06cc\u0641 \u0645\u06cc \u06a9\u0646\u062f.<\/p>\n<p>listen 80;: \u0627\u06cc\u0646 \u062e\u0637 \u0645\u0634\u062e\u0635 \u0645\u06cc \u06a9\u0646\u062f \u06a9\u0647 \u0633\u0631\u0648\u0631 \u0628\u0627\u06cc\u062f \u062f\u0631 \u067e\u0648\u0631\u062a 80 \u06af\u0648\u0634 \u06a9\u0646\u062f.<\/p>\n<p>rewrite ^\/(.*)\/$ \/$1 permanent;: \u0627\u06cc\u0646 \u062e\u0637 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0647\u0627 \u0631\u0627 \u0628\u0627 \u0627\u0633\u0644\u0634 \u0627\u0646\u062a\u0647\u0627\u06cc\u06cc \u0628\u0647 \u0647\u0645\u0627\u0646 URL \u0628\u062f\u0648\u0646 \u0627\u0633\u0644\u0634 \u0647\u062f\u0627\u06cc\u062a \u0645\u06cc \u06a9\u0646\u062f.<\/p>\n<p>gzip on;: \u0627\u06cc\u0646 \u062e\u0637 \u0641\u0634\u0631\u062f\u0647 \u0633\u0627\u0632\u06cc gzip \u0631\u0627 \u0628\u0631\u0627\u06cc \u067e\u0627\u0633\u062e \u0647\u0627 \u0641\u0639\u0627\u0644 \u0645\u06cc \u06a9\u0646\u062f.<\/p>\n<p>root \/home\/node\/app;: \u0627\u06cc\u0646 \u062e\u0637 \u062f\u0627\u06cc\u0631\u06a9\u062a\u0648\u0631\u06cc \u0631\u06cc\u0634\u0647 \u0627\u06cc \u0631\u0627 \u0628\u0631\u0627\u06cc \u0627\u0631\u0627\u0626\u0647 \u0641\u0627\u06cc\u0644 \u0647\u0627\u06cc \u0627\u0633\u062a\u0627\u062a\u06cc\u06a9 \u0645\u0634\u062e\u0635 \u0645\u06cc \u06a9\u0646\u062f.<\/p>\n<p>error_page 404 \/404.html;: \u0627\u06cc\u0646 \u062e\u0637 \u0635\u0641\u062d\u0647 \u062e\u0637\u0627\u06cc \u0645\u0648\u0631\u062f \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0628\u0631\u0627\u06cc \u062e\u0637\u0627\u0647\u0627\u06cc 404 \u0631\u0627 \u0645\u0634\u062e\u0635 \u0645\u06cc \u06a9\u0646\u062f.<\/p>\n<p>try_files $uri.html $uri\/index.html =404;: \u0627\u06cc\u0646 \u062e\u0637 \u0641\u0627\u06cc\u0644 \u0647\u0627\u06cc\u06cc \u0631\u0627 \u0645\u0634\u062e\u0635 \u0645\u06cc \u06a9\u0646\u062f \u06a9\u0647 \u0628\u0627\u06cc\u062f \u0647\u0646\u06af\u0627\u0645 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0627\u0645\u062a\u062d\u0627\u0646 \u0634\u0648\u0646\u062f.<\/p>\n<p>location ~* ^.+\\.(?:css|webp|cur|js|jpe?g|gif|htc|ico|png|html|xml|otf|ttf|eot|woff|woff2|svg)$ { &#8230; }: \u0627\u06cc\u0646 \u0628\u0644\u0648\u06a9 \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc \u0631\u0627 \u0628\u0631\u0627\u06cc \u0627\u0631\u0627\u0626\u0647 \u0641\u0627\u06cc\u0644\u200c\u0647\u0627\u06cc \u0627\u0633\u062a\u0627\u062a\u06cc\u06a9 \u0628\u0627 \u0641\u0639\u0627\u0644 \u06a9\u0631\u062f\u0646 \u06a9\u0634 \u0645\u0634\u062e\u0635 \u0645\u06cc\u200c\u06a9\u0646\u062f.<\/p>\n<p>\u0627\u06cc\u0646 \u0641\u0627\u06cc\u0644 \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc \u0633\u0631\u0648\u0631 Nginx \u0631\u0627 \u0628\u0631\u0627\u06cc \u0627\u0631\u0627\u0626\u0647 \u0641\u0627\u06cc\u0644\u200c\u0647\u0627\u06cc \u0627\u0633\u062a\u0627\u062a\u06cc\u06a9 \u0628\u0647\u06cc\u0646\u0647 \u0645\u06cc\u200c\u06a9\u0646\u062f \u0648 \u0628\u0627 \u0641\u0639\u0627\u0644 \u06a9\u0631\u062f\u0646 \u0641\u0634\u0631\u062f\u0647\u200c\u0633\u0627\u0632\u06cc \u0648 \u0630\u062e\u06cc\u0631\u0647 gzip \u0639\u0645\u0644\u06a9\u0631\u062f \u0631\u0627 \u0628\u0647\u0628\u0648\u062f \u0645\u06cc\u200c\u0628\u062e\u0634\u062f.<\/p>\n<p>  \u0627\u06cc\u062c\u0627\u062f \u06cc\u06a9 Dockerfile<\/p>\n<p>Dockerfile \u06cc\u06a9 \u0633\u0646\u062f \u0645\u062a\u0646\u06cc \u0627\u0633\u062a \u06a9\u0647 \u0634\u0627\u0645\u0644 \u062a\u0645\u0627\u0645 \u062f\u0633\u062a\u0648\u0631\u0627\u062a \u0645\u0648\u0631\u062f \u0646\u06cc\u0627\u0632 \u0628\u0631\u0627\u06cc \u0633\u0627\u062e\u062a \u06cc\u06a9 \u062a\u0635\u0648\u06cc\u0631 \u062f\u0627\u06a9\u0631 \u0627\u0633\u062a. \u062a\u0635\u0648\u06cc\u0631 \u067e\u0627\u06cc\u0647 \u0628\u0631\u0627\u06cc \u0627\u0633\u062a\u0641\u0627\u062f\u0647\u060c \u062f\u0633\u062a\u0648\u0631\u0627\u062a \u0628\u0631\u0627\u06cc \u0627\u062c\u0631\u0627 \u0648 \u0641\u0627\u06cc\u0644 \u0647\u0627\u06cc\u06cc \u06a9\u0647 \u0628\u0627\u06cc\u062f \u062f\u0631 \u062a\u0635\u0648\u06cc\u0631 \u06a9\u067e\u06cc \u0634\u0648\u0646\u062f \u0631\u0627 \u0645\u0634\u062e\u0635 \u0645\u06cc \u06a9\u0646\u062f. \u062f\u0631 \u0627\u06cc\u0646 \u0631\u0627\u0647\u0646\u0645\u0627\u060c \u06cc\u06a9 Dockerfile \u0628\u0631\u0627\u06cc \u06cc\u06a9 \u0648\u0628 \u0633\u0627\u06cc\u062a docusaurus \u0627\u06cc\u062c\u0627\u062f \u0645\u06cc \u06a9\u0646\u06cc\u0645. \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u062f\u0633\u062a\u0648\u0631\u0627\u062a \u0645\u0648\u0631\u062f \u0646\u06cc\u0627\u0632 \u067e\u0631\u0648\u0698\u0647 \u062e\u0648\u062f \u0631\u0627 \u062c\u0627\u06cc\u06af\u0632\u06cc\u0646 \u06a9\u0646\u06cc\u062f.<\/p>\n<p>\u06cc\u06a9 \u0641\u0627\u06cc\u0644 \u062c\u062f\u06cc\u062f \u062f\u0631 \u0641\u0647\u0631\u0633\u062a \u067e\u0631\u0648\u0698\u0647 \u062e\u0648\u062f \u0628\u0647 \u0646\u0627\u0645 Dockerfile \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f. \u0627\u06cc\u0646 \u0641\u0627\u06cc\u0644 \u0634\u0627\u0645\u0644 \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc \u0628\u0631\u0627\u06cc \u062a\u0635\u0648\u06cc\u0631 Docker \u0634\u0645\u0627 \u062e\u0648\u0627\u0647\u062f \u0628\u0648\u062f. \u062f\u0631 \u0627\u06cc\u0646\u062c\u0627 \u06cc\u06a9 \u0646\u0645\u0648\u0646\u0647 Dockerfile \u0628\u0631\u0627\u06cc \u06cc\u06a9 \u0648\u0628 \u0633\u0627\u06cc\u062a docusaurus \u0622\u0645\u062f\u0647 \u0627\u0633\u062a:<\/p>\n<p>FROM node:22.11.0-alpine AS builder<\/p>\n<p>RUN apk add git<\/p>\n<p>USER node<\/p>\n<p># Create app directory (with user `node`)<br \/>\nRUN mkdir -p \/home\/node\/app<br \/>\n# Set is as cwd<br \/>\nWORKDIR \/home\/node\/app<\/p>\n<p># Install app dependencies<br \/>\n# A wildcard is used to ensure both package.json AND package-lock.json are copied<br \/>\n# where available (npm@5+)<br \/>\nCOPY &#8211;chown=node package*.json .\/<\/p>\n<p># Install dependencies<br \/>\nRUN npm install<\/p>\n<p># Bundle app source code<br \/>\nCOPY &#8211;chown=node . .<br \/>\nCOPY &#8211;chown=node .\/.git .\/.git<\/p>\n<p>RUN npm run build<\/p>\n<p>FROM nginx:1.27.0-alpine3.19-slim<\/p>\n<p>WORKDIR \/etc\/nginx\/conf.d<\/p>\n<p>COPY &#8211;from=builder \/home\/node\/app\/build \/home\/node\/app<\/p>\n<p>COPY .\/server.nginx .\/default.conf<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>\u0628\u06cc\u0627\u06cc\u06cc\u062f Dockerfile \u0631\u0627 \u062a\u062c\u0632\u06cc\u0647 \u06a9\u0646\u06cc\u0645:<\/p>\n<p>FROM node:22.11.0-alpine AS builder: \u0627\u06cc\u0646 \u062e\u0637 \u062a\u0635\u0648\u06cc\u0631 \u067e\u0627\u06cc\u0647 \u0628\u0631\u0627\u06cc \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u062f\u0631 \u0645\u0631\u062d\u0644\u0647 \u0633\u0627\u062e\u062a \u0631\u0627 \u0645\u0634\u062e\u0635 \u0645\u06cc \u06a9\u0646\u062f. \u0645\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc \u06a9\u0646\u06cc\u0645 node:22.11.0-alpine image\u060c \u06a9\u0647 \u06cc\u06a9 \u0646\u0633\u062e\u0647 \u0633\u0628\u06a9 \u0648\u0632\u0646 \u0627\u0632 Node.js \u0627\u0633\u062a \u06a9\u0647 \u0634\u0627\u0645\u0644 npm \u0627\u0633\u062a.<\/p>\n<p>RUN apk add git: \u0627\u06cc\u0646 \u062e\u0637 \u0631\u0627 \u0646\u0635\u0628 \u0645\u06cc \u06a9\u0646\u062f git \u0628\u0633\u062a\u0647 \u0627\u06cc \u06a9\u0647 \u0628\u0631\u0627\u06cc \u0634\u0628\u06cc\u0647 \u0633\u0627\u0632\u06cc \u0645\u062e\u0632\u0646 \u0645\u0648\u0631\u062f \u0646\u06cc\u0627\u0632 \u0627\u0633\u062a.<\/p>\n<p>USER node: \u0627\u06cc\u0646 \u062e\u0637 \u0628\u0647 node user\u060c \u06a9\u0647 \u06cc\u06a9 \u06a9\u0627\u0631\u0628\u0631 \u063a\u06cc\u0631 \u0631\u06cc\u0634\u0647 \u0627\u0633\u062a \u06a9\u0647 \u062a\u0648\u0633\u0637 \u062a\u0635\u0648\u06cc\u0631 Node.js \u0627\u06cc\u062c\u0627\u062f \u0634\u062f\u0647 \u0627\u0633\u062a.<\/p>\n<p>RUN mkdir -p \/home\/node\/app: \u0627\u06cc\u0646 \u062e\u0637 \u06cc\u06a9 \u062f\u0627\u06cc\u0631\u06a9\u062a\u0648\u0631\u06cc \u0628\u0631\u0627\u06cc \u06a9\u062f \u0628\u0631\u0646\u0627\u0645\u0647 \u0627\u06cc\u062c\u0627\u062f \u0645\u06cc \u06a9\u0646\u062f.<\/p>\n<p>WORKDIR \/home\/node\/app: \u0627\u06cc\u0646 \u062e\u0637 \u062f\u0627\u06cc\u0631\u06a9\u062a\u0648\u0631\u06cc \u06a9\u0627\u0631\u06cc \u0631\u0627 \u0631\u0648\u06cc \u062f\u0627\u06cc\u0631\u06a9\u062a\u0648\u0631\u06cc \u0628\u0631\u0646\u0627\u0645\u0647 \u062a\u0646\u0638\u06cc\u0645 \u0645\u06cc \u06a9\u0646\u062f.<\/p>\n<p>COPY &#8211;chown=node package*.json .: \u0627\u06cc\u0646 \u062e\u0637 \u0631\u0627 \u06a9\u067e\u06cc \u0645\u06cc \u06a9\u0646\u062f package.json \u0648 package-lock.json \u0641\u0627\u06cc\u0644 \u0647\u0627 \u062f\u0631 \u062a\u0635\u0648\u06cc\u0631<\/p>\n<p>RUN npm install: \u0627\u06cc\u0646 \u062e\u0637 \u0648\u0627\u0628\u0633\u062a\u06af\u06cc \u0647\u0627\u06cc \u0645\u0634\u062e\u0635 \u0634\u062f\u0647 \u062f\u0631 \u0631\u0627 \u0646\u0635\u0628 \u0645\u06cc \u06a9\u0646\u062f package.json \u0641\u0627\u06cc\u0644<\/p>\n<p>COPY &#8211;chown=node . .: \u0627\u06cc\u0646 \u062e\u0637 \u06a9\u062f \u0628\u0631\u0646\u0627\u0645\u0647 \u0631\u0627 \u062f\u0631 \u062a\u0635\u0648\u06cc\u0631 \u06a9\u067e\u06cc \u0645\u06cc \u06a9\u0646\u062f.<\/p>\n<p>COPY &#8211;chown=node .\/.git .\/.git: \u0627\u06cc\u0646 \u062e\u0637 \u0631\u0627 \u06a9\u067e\u06cc \u0645\u06cc \u06a9\u0646\u062f .git \u062f\u0627\u06cc\u0631\u06a9\u062a\u0648\u0631\u06cc \u062f\u0631 \u062a\u0635\u0648\u06cc\u0631<\/p>\n<p>RUN npm run build: \u0627\u06cc\u0646 \u062e\u0637 \u0628\u0631\u0646\u0627\u0645\u0647 \u0631\u0627 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 npm run build \u0641\u0631\u0645\u0627\u0646<\/p>\n<p>FROM nginx:1.27.0-alpine3.19-slim: \u0627\u06cc\u0646 \u062e\u0637 \u062a\u0635\u0648\u06cc\u0631 \u067e\u0627\u06cc\u0647 \u0631\u0627 \u0628\u0631\u0627\u06cc \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u062f\u0631 \u062a\u0635\u0648\u06cc\u0631 \u0646\u0647\u0627\u06cc\u06cc \u0645\u0634\u062e\u0635 \u0645\u06cc \u06a9\u0646\u062f. \u0645\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc \u06a9\u0646\u06cc\u0645 nginx:1.27.0-alpine3.19-slim \u062a\u0635\u0648\u06cc\u0631\u060c \u06a9\u0647 \u0646\u0633\u062e\u0647 \u0633\u0628\u06a9 \u0648\u0632\u0646 Nginx \u0627\u0633\u062a.<\/p>\n<p>WORKDIR \/etc\/nginx\/conf.d: \u0627\u06cc\u0646 \u062e\u0637 \u062f\u0627\u06cc\u0631\u06a9\u062a\u0648\u0631\u06cc \u06a9\u0627\u0631\u06cc \u0631\u0627 \u0631\u0648\u06cc \u062f\u0627\u06cc\u0631\u06a9\u062a\u0648\u0631\u06cc \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc Nginx \u062a\u0646\u0638\u06cc\u0645 \u0645\u06cc \u06a9\u0646\u062f.<\/p>\n<p>COPY &#8211;from=builder \/home\/node\/app\/build \/home\/node\/app: \u0627\u06cc\u0646 \u062e\u0637 \u0641\u0627\u06cc\u0644 \u0647\u0627\u06cc \u0627\u0633\u062a\u0627\u062a\u06cc\u06a9 \u062a\u0648\u0644\u06cc\u062f \u0634\u062f\u0647 \u062a\u0648\u0633\u0637 \u0645\u0631\u062d\u0644\u0647 \u0633\u0627\u062e\u062a \u0631\u0627 \u062f\u0631 \u062f\u0627\u06cc\u0631\u06a9\u062a\u0648\u0631\u06cc \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc Nginx \u06a9\u067e\u06cc \u0645\u06cc \u06a9\u0646\u062f.<\/p>\n<p>COPY .\/server.nginx .\/default.conf: \u0627\u06cc\u0646 \u062e\u0637 \u0631\u0627 \u06a9\u067e\u06cc \u0645\u06cc \u06a9\u0646\u062f server.nginx \u0641\u0627\u06cc\u0644 \u0631\u0627 \u062f\u0631 \u062f\u0627\u06cc\u0631\u06a9\u062a\u0648\u0631\u06cc \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc Nginx \u0642\u0631\u0627\u0631 \u062f\u0647\u06cc\u062f.<\/p>\n<p>\u0627\u06cc\u0646 Dockerfile \u06cc\u06a9 \u0633\u0627\u062e\u062a \u0686\u0646\u062f \u0645\u0631\u062d\u0644\u0647 \u0627\u06cc \u0627\u06cc\u062c\u0627\u062f \u0645\u06cc \u06a9\u0646\u062f \u06a9\u0647 \u0627\u0628\u062a\u062f\u0627 \u0628\u0631\u0646\u0627\u0645\u0647 \u0631\u0627 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 Node.js \u0645\u06cc \u0633\u0627\u0632\u062f \u0648 \u0633\u067e\u0633 \u0641\u0627\u06cc\u0644 \u0647\u0627\u06cc \u0627\u0633\u062a\u0627\u062a\u06cc\u06a9 \u0631\u0627 \u062f\u0631 \u06cc\u06a9 \u062a\u0635\u0648\u06cc\u0631 Nginx \u06a9\u067e\u06cc \u0645\u06cc \u06a9\u0646\u062f. \u0627\u06cc\u0646 \u0631\u0648\u06cc\u06a9\u0631\u062f \u0628\u0627 \u062c\u062f\u0627\u0633\u0627\u0632\u06cc \u0648\u0627\u0628\u0633\u062a\u06af\u06cc \u0647\u0627\u06cc \u0633\u0627\u062e\u062a \u0627\u0632 \u0648\u0627\u0628\u0633\u062a\u06af\u06cc \u0647\u0627\u06cc \u0632\u0645\u0627\u0646 \u0627\u062c\u0631\u0627\u060c \u0627\u0646\u062f\u0627\u0632\u0647 \u062a\u0635\u0648\u06cc\u0631 \u0646\u0647\u0627\u06cc\u06cc \u0631\u0627 \u06a9\u0627\u0647\u0634 \u0645\u06cc \u062f\u0647\u062f \u0648 \u0639\u0645\u0644\u06a9\u0631\u062f \u0631\u0627 \u0628\u0647\u0628\u0648\u062f \u0645\u06cc \u0628\u062e\u0634\u062f.<\/p>\n<p>  \u0633\u0627\u062e\u062a \u0648 \u0627\u062c\u0631\u0627\u06cc \u062a\u0635\u0648\u06cc\u0631 Docker \u0628\u0647 \u0635\u0648\u0631\u062a \u0645\u062d\u0644\u06cc<\/p>\n<p>\u0642\u0628\u0644 \u0627\u0632 \u0627\u0633\u062a\u0642\u0631\u0627\u0631 \u0628\u0631\u0646\u0627\u0645\u0647 \u062e\u0648\u062f \u062f\u0631 \u0633\u0631\u0648\u0631 \u062e\u0648\u062f\u060c \u0628\u0627\u06cc\u062f \u062a\u0635\u0648\u06cc\u0631 Docker \u0631\u0627 \u0628\u0647 \u0635\u0648\u0631\u062a \u0645\u062d\u0644\u06cc \u0622\u0632\u0645\u0627\u06cc\u0634 \u06a9\u0646\u06cc\u062f \u062a\u0627 \u0645\u0637\u0645\u0626\u0646 \u0634\u0648\u06cc\u062f \u06a9\u0647 \u0645\u0637\u0627\u0628\u0642 \u0627\u0646\u062a\u0638\u0627\u0631 \u06a9\u0627\u0631 \u0645\u06cc \u06a9\u0646\u062f. \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u062f\u0633\u062a\u0648\u0631\u0627\u062a \u0632\u06cc\u0631 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u062a\u0635\u0648\u06cc\u0631 Docker \u0631\u0627 \u0628\u0631 \u0631\u0648\u06cc \u0645\u0627\u0634\u06cc\u0646 \u0645\u062d\u0644\u06cc \u062e\u0648\u062f \u0628\u0633\u0627\u0632\u06cc\u062f \u0648 \u0627\u062c\u0631\u0627 \u06a9\u0646\u06cc\u062f:<\/p>\n<p>docker build -t my-image .<br \/>\ndocker run -p 8080:80 my-image<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>\u0631\u0627 docker build \u0641\u0631\u0645\u0627\u0646 \u062a\u0635\u0648\u06cc\u0631 \u062f\u0627\u06a9\u0631 \u0631\u0627 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 Dockerfile \u062f\u0631 \u062f\u0627\u06cc\u0631\u06a9\u062a\u0648\u0631\u06cc \u0641\u0639\u0644\u06cc \u0648 \u0622\u0646 \u0631\u0627 \u0628\u0627 \u0646\u0627\u0645 \u062a\u06af \u0645\u06cc \u06a9\u0646\u062f my-image. \u0631\u0627 docker run \u062f\u0633\u062a\u0648\u0631\u060c \u062a\u0635\u0648\u06cc\u0631 Docker \u0631\u0627 \u0631\u0648\u06cc \u067e\u0648\u0631\u062a 8080 \u0627\u062c\u0631\u0627 \u0645\u06cc\u200c\u06a9\u0646\u062f \u0648 \u0622\u0646 \u0631\u0627 \u0628\u0647 \u067e\u0648\u0631\u062a 80 \u062f\u0627\u062e\u0644 \u06a9\u0627\u0646\u062a\u06cc\u0646\u0631 \u0646\u06af\u0627\u0634\u062a \u0645\u06cc\u200c\u06a9\u0646\u062f. \u0628\u0627 \u0628\u0627\u0632 \u06a9\u0631\u062f\u0646 \u06cc\u06a9 \u0645\u0631\u0648\u0631\u06af\u0631 \u0648\u0628 \u0648 \u067e\u06cc\u0645\u0627\u06cc\u0634 \u0628\u0647 \u0628\u0631\u0646\u0627\u0645\u0647 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u0628\u0647 \u0628\u0631\u0646\u0627\u0645\u0647 \u062f\u0633\u062a\u0631\u0633\u06cc \u067e\u06cc\u062f\u0627 \u06a9\u0646\u06cc\u062f http:\/\/localhost:8080.<\/p>\n<p>\u0627\u06af\u0631 \u0647\u0645\u0647 \u0686\u06cc\u0632 \u0647\u0645\u0627\u0646\u0637\u0648\u0631 \u06a9\u0647 \u0627\u0646\u062a\u0638\u0627\u0631 \u0645\u06cc \u0631\u0648\u062f \u06a9\u0627\u0631 \u06a9\u0646\u062f\u060c \u0628\u0627\u06cc\u062f \u0646\u0633\u062e\u0647 \u062a\u0648\u0644\u06cc\u062f\u06cc \u0648\u0628 \u0633\u0627\u06cc\u062a docusaurus \u062e\u0648\u062f \u0631\u0627 \u062f\u0631 \u0645\u0631\u0648\u0631\u06af\u0631 \u0645\u0634\u0627\u0647\u062f\u0647 \u06a9\u0646\u06cc\u062f. \u0627\u06a9\u0646\u0648\u0646 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 GitHub Actions \u0648 Nanocl \u0628\u0631\u0646\u0627\u0645\u0647 \u062e\u0648\u062f \u0631\u0627 \u0631\u0648\u06cc \u0633\u0631\u0648\u0631 \u062e\u0648\u062f \u0645\u0633\u062a\u0642\u0631 \u06a9\u0646\u06cc\u062f.<\/p>\n<p>  \u0631\u0627\u0647 \u0627\u0646\u062f\u0627\u0632\u06cc Nanocl<\/p>\n<p>Nanocl \u0627\u0628\u0632\u0627\u0631 \u0642\u062f\u0631\u062a\u0645\u0646\u062f\u06cc \u0627\u0633\u062a \u06a9\u0647 \u0641\u0631\u0622\u06cc\u0646\u062f \u0627\u0633\u062a\u0642\u0631\u0627\u0631 \u0631\u0627 \u0628\u0627 \u0627\u0631\u0627\u0626\u0647 \u06cc\u06a9 \u0631\u0627\u0628\u0637 \u06cc\u06a9\u067e\u0627\u0631\u0686\u0647 \u0628\u0631\u0627\u06cc \u0645\u062f\u06cc\u0631\u06cc\u062a \u0632\u06cc\u0631\u0633\u0627\u062e\u062a \u0634\u0645\u0627 \u0633\u0627\u062f\u0647 \u0645\u06cc \u06a9\u0646\u062f. \u0634\u0645\u0627 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u0627\u0632 Nanocl \u0628\u0631\u0627\u06cc \u0627\u0633\u062a\u0642\u0631\u0627\u0631 \u0628\u0631\u0646\u0627\u0645\u0647 \u0647\u0627\u06cc \u06a9\u0627\u0631\u0628\u0631\u062f\u06cc \u062e\u0648\u062f \u062f\u0631 \u0633\u0631\u0648\u0631 \u062e\u0648\u062f \u0628\u0627 \u062d\u062f\u0627\u0642\u0644 \u062a\u0644\u0627\u0634 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u062f. \u062f\u0631 \u0627\u06cc\u0646 \u0631\u0627\u0647\u0646\u0645\u0627\u060c \u0645\u0627 \u0628\u0647 \u0634\u0645\u0627 \u0646\u0634\u0627\u0646 \u062e\u0648\u0627\u0647\u06cc\u0645 \u062f\u0627\u062f \u06a9\u0647 \u0686\u06af\u0648\u0646\u0647 Nanocl \u0631\u0627 \u0631\u0648\u06cc \u0633\u0631\u0648\u0631 \u062e\u0648\u062f \u0631\u0627\u0647 \u0627\u0646\u062f\u0627\u0632\u06cc \u06a9\u0646\u06cc\u062f \u0648 \u0628\u0631\u0646\u0627\u0645\u0647 \u062e\u0648\u062f \u0631\u0627 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u06cc\u06a9 \u0641\u0627\u06cc\u0644 \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc \u0633\u0627\u062f\u0647 \u0627\u062c\u0631\u0627 \u06a9\u0646\u06cc\u062f.<\/p>\n<p>\u0627\u0628\u062a\u062f\u0627 \u0628\u0627\u06cc\u062f Nanocl \u0631\u0627 \u0631\u0648\u06cc \u0633\u0631\u0648\u0631 \u062e\u0648\u062f \u0646\u0635\u0628 \u06a9\u0646\u06cc\u062f. \u0634\u0645\u0627 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u062f\u0633\u062a\u0648\u0631\u0627\u0644\u0639\u0645\u0644 \u0646\u0635\u0628 \u0631\u0627 \u062f\u0631 \u0627\u06cc\u0646\u062c\u0627 \u067e\u06cc\u062f\u0627 \u06a9\u0646\u06cc\u062f. \u067e\u0633 \u0627\u0632 \u0646\u0635\u0628 Nanocl\u060c \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u06cc\u06a9 \u0641\u0627\u06cc\u0644 \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc \u0628\u0631\u0627\u06cc \u0628\u0631\u0646\u0627\u0645\u0647 \u062e\u0648\u062f \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f. \u0627\u06cc\u0646 \u0641\u0627\u06cc\u0644 \u0634\u0627\u0645\u0644 \u062a\u0646\u0638\u06cc\u0645\u0627\u062a \u0628\u0631\u0646\u0627\u0645\u0647 \u0634\u0645\u0627 \u0645\u0627\u0646\u0646\u062f \u0646\u0627\u0645 \u062a\u0635\u0648\u06cc\u0631\u060c \u0634\u0645\u0627\u0631\u0647 \u067e\u0648\u0631\u062a \u0648 \u0645\u062a\u063a\u06cc\u0631\u0647\u0627\u06cc \u0645\u062d\u06cc\u0637 \u062e\u0648\u0627\u0647\u062f \u0628\u0648\u062f.<\/p>\n<p>\u0628\u0647 \u0637\u0648\u0631 \u067e\u06cc\u0634 \u0641\u0631\u0636 \u067e\u0633 \u0627\u0632 \u0646\u0635\u0628 Nanocl \u0641\u0642\u0637 \u0627\u0632 \u0637\u0631\u06cc\u0642 \u0642\u0627\u0628\u0644 \u062f\u0633\u062a\u0631\u0633\u06cc \u0627\u0633\u062a \/run\/nanocl\/nanocl.sock. \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u06cc\u062f \u0627\u0632 \u06cc\u06a9 \u0642\u0627\u0646\u0648\u0646 \u067e\u0631\u0648\u06a9\u0633\u06cc \u0628\u0631\u0627\u06cc \u0646\u0645\u0627\u06cc\u0634 \u0622\u0646 \u062f\u0631 \u0627\u06cc\u0646\u062a\u0631\u0646\u062a \u0639\u0645\u0648\u0645\u06cc \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u062f\u060c \u0628\u0627 \u0627\u06cc\u0646 \u062d\u0627\u0644\u060c \u062f\u0631 \u0645\u0639\u0631\u0636 \u062f\u06cc\u062f \u0639\u0645\u0648\u0645 \u0642\u0631\u0627\u0631 \u062f\u0627\u062f\u0646 \u0622\u0646 \u0628\u062f\u0648\u0646 \u06af\u0648\u0627\u0647\u06cc SSL\/TLS \u062e\u0648\u062f \u0627\u0645\u0636\u0627 \u0634\u062f\u0647 \u062a\u0648\u0635\u06cc\u0647 \u0646\u0645\u06cc\u200c\u0634\u0648\u062f.\u0627\u06cc\u0646 \u0645\u06cc \u062a\u0648\u0627\u0646\u062f \u0628\u0647 \u0645\u0647\u0627\u062c\u0645 \u0627\u062c\u0627\u0632\u0647 \u062f\u0647\u062f \u062a\u0627 \u06a9\u0646\u062a\u0631\u0644 \u0633\u0631\u0648\u0631 \u0634\u0645\u0627 \u0631\u0627 \u062f\u0631 \u062f\u0633\u062a \u0628\u06af\u06cc\u0631\u062f.\u0627\u0645\u06cc\u062f\u0648\u0627\u0631\u06cc\u0645\u060c \u0645\u0627 \u06cc\u06a9 \u0642\u0627\u0646\u0648\u0646 \u0627\u0632 \u067e\u06cc\u0634 \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc \u0634\u062f\u0647 \u062f\u0627\u0631\u06cc\u0645 \u06a9\u0647 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u0628\u0631\u0627\u06cc \u0627\u0641\u0634\u0627\u06cc Nanocl Daemon \u0627\u0639\u0645\u0627\u0644 \u06a9\u0646\u06cc\u062f.<\/p>\n<p>\u062f\u0631 \u0633\u0631\u0648\u0631 \u0627\u062e\u062a\u0635\u0627\u0635\u06cc \u06cc\u0627 VPS \u062e\u0648\u062f\u060c \u062f\u0633\u062a\u0648\u0631 \u0632\u06cc\u0631 \u0631\u0627 \u0628\u0631\u0627\u06cc \u0627\u0639\u0645\u0627\u0644 \u0642\u0627\u0646\u0648\u0646 \u0627\u062c\u0631\u0627 \u06a9\u0646\u06cc\u062f:<\/p>\n<p>nanocl state apply -fs https:\/\/nhnr.io\/v0.16\/sys\/enable-remote-nanocld.yml<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>Nanocl Daemon \u0631\u0627 \u0628\u0627 \u06af\u0648\u0627\u0647\u06cc SSL\/TLS \u0627\u0645\u0636\u0627 \u0634\u062f\u0647 \u062f\u0631 \u067e\u0648\u0631\u062a 9943 \u062f\u0631 \u0645\u0639\u0631\u0636 \u0627\u06cc\u0646\u062a\u0631\u0646\u062a \u0639\u0645\u0648\u0645\u06cc \u0642\u0631\u0627\u0631 \u0645\u06cc \u062f\u0647\u062f.<\/p>\n<p>  \u0631\u0627\u0647 \u0627\u0646\u062f\u0627\u0632\u06cc Github Secrets<\/p>\n<p>GitHub Secrets \u0628\u0647 \u0634\u0645\u0627 \u0627\u06cc\u0646 \u0627\u0645\u06a9\u0627\u0646 \u0631\u0627 \u0645\u06cc \u062f\u0647\u062f \u06a9\u0647 \u0628\u0647 \u0637\u0648\u0631 \u0627\u06cc\u0645\u0646 \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u062d\u0633\u0627\u0633 \u0631\u0627 \u062f\u0631 \u0645\u062e\u0632\u0646 GitHub \u062e\u0648\u062f \u0630\u062e\u06cc\u0631\u0647 \u0648 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u062f. \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u0627\u0632 GitHub Secrets \u0628\u0631\u0627\u06cc \u0630\u062e\u06cc\u0631\u0647 \u0627\u0639\u062a\u0628\u0627\u0631 \u0633\u0631\u0648\u0631\u060c \u06a9\u0644\u06cc\u062f\u0647\u0627\u06cc API \u0648 \u0633\u0627\u06cc\u0631 \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u062d\u0633\u0627\u0633 \u0645\u0648\u0631\u062f \u0646\u06cc\u0627\u0632 \u0628\u0631\u0627\u06cc \u0627\u0633\u062a\u0642\u0631\u0627\u0631 \u0628\u0631\u0646\u0627\u0645\u0647 \u062e\u0648\u062f \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u062f. \u062f\u0631 \u0627\u06cc\u0646 \u0631\u0627\u0647\u0646\u0645\u0627\u060c \u0645\u0627 \u0627\u0632 GitHub Secrets \u0628\u0631\u0627\u06cc \u0630\u062e\u06cc\u0631\u0647 \u0627\u0639\u062a\u0628\u0627\u0631 \u0645\u0648\u0631\u062f \u0646\u06cc\u0627\u0632 \u0628\u0631\u0627\u06cc \u0627\u0633\u062a\u0642\u0631\u0627\u0631 \u0628\u0631\u0646\u0627\u0645\u0647 \u0634\u0645\u0627 \u062f\u0631 \u0633\u0631\u0648\u0631\u062a\u0627\u0646 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 Nanocl \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u062e\u0648\u0627\u0647\u06cc\u0645 \u06a9\u0631\u062f.<\/p>\n<p>\u0628\u0631\u0627\u06cc \u0634\u0631\u0648\u0639\u060c \u0628\u0647 \u0645\u062e\u0632\u0646 GitHub \u062e\u0648\u062f \u0628\u0631\u0648\u06cc\u062f \u0648 \u0631\u0648\u06cc \u0622\u0646 \u06a9\u0644\u06cc\u06a9 \u06a9\u0646\u06cc\u062f Settings \u0628\u0631\u06af\u0647 \u0633\u067e\u0633\u060c \u0631\u0648\u06cc \u0622\u0646 \u06a9\u0644\u06cc\u06a9 \u06a9\u0646\u06cc\u062f Secrets and variables \u067e\u06cc\u0648\u0646\u062f \u062f\u0631 \u0646\u0648\u0627\u0631 \u06a9\u0646\u0627\u0631\u06cc \u0633\u0645\u062a \u0686\u067e \u0628\u0631 \u0631\u0648\u06cc \u06a9\u0644\u06cc\u06a9 \u06a9\u0646\u06cc\u062f Actions \u067e\u06cc\u0648\u0646\u062f.\u0634\u0645\u0627 \u0628\u0627\u06cc\u062f \u0635\u0641\u062d\u0647 \u0627\u06cc \u0645\u0627\u0646\u0646\u062f \u0627\u06cc\u0646 \u0631\u0627 \u0628\u0628\u06cc\u0646\u06cc\u062f:<\/p>\n<p>\u0628\u0631 \u0631\u0648\u06cc \u06a9\u0644\u06cc\u06a9 \u06a9\u0646\u06cc\u062f New repository secret \u062f\u06a9\u0645\u0647 \u0627\u06cc\u062c\u0627\u062f \u06cc\u06a9 \u0631\u0627\u0632 \u062c\u062f\u06cc\u062f. \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u0628\u0631\u0627\u06cc \u0647\u0631 \u06cc\u06a9 \u0627\u0632 \u0645\u0642\u0627\u062f\u06cc\u0631 \u0632\u06cc\u0631 \u06cc\u06a9 \u0631\u0627\u0632 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f:<\/p>\n<p>NANOCL_HOST: \u0646\u0627\u0645 \u0645\u06cc\u0632\u0628\u0627\u0646 \u06cc\u0627 \u0622\u062f\u0631\u0633 IP \u0633\u0631\u0648\u0631 \u0634\u0645\u0627 \u0628\u0627 \u067e\u0648\u0631\u062a 9943. \u0645\u062b\u0627\u0644: https:\/\/example.com:9943<\/p>\n<p>NANOCL_CERT: \u0645\u062d\u062a\u0648\u0627\u06cc \u06af\u0648\u0627\u0647\u06cc SSL\/TLS \u062e\u0648\u062f \u0627\u0645\u0636\u0627 \u0634\u062f\u0647 \u06a9\u0647 \u0628\u0631\u0627\u06cc \u0627\u06cc\u0645\u0646 \u0633\u0627\u0632\u06cc \u0627\u062a\u0635\u0627\u0644 \u0628\u0647 Nanocl Daemon \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc \u0634\u0648\u062f.<\/p>\n<p>NANOCL_CERT_KEY: \u0645\u062d\u062a\u0648\u0627\u06cc \u06a9\u0644\u06cc\u062f \u062e\u0635\u0648\u0635\u06cc \u0645\u0648\u0631\u062f \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0628\u0631\u0627\u06cc \u0627\u06cc\u0645\u0646 \u0633\u0627\u0632\u06cc \u0627\u062a\u0635\u0627\u0644 \u0628\u0647 Nanocl Daemon.<\/p>\n<p>\u0628\u0627 \u0627\u062c\u0631\u0627\u06cc \u062f\u0633\u062a\u0648\u0631\u0627\u062a \u0632\u06cc\u0631 \u062f\u0631 \u0633\u0631\u0648\u0631 \u062e\u0648\u062f \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u0645\u062d\u062a\u0648\u0627\u06cc \u06af\u0648\u0627\u0647\u06cc \u0648 \u06a9\u0644\u06cc\u062f \u062e\u0635\u0648\u0635\u06cc \u0631\u0627 \u067e\u06cc\u062f\u0627 \u06a9\u0646\u06cc\u062f:<\/p>\n<p>nanocl secret inspect cert.client.nanocl.io<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>\u0627\u06cc\u0646 \u062f\u0633\u062a\u0648\u0631 \u0645\u062d\u062a\u0648\u0627\u06cc \u06af\u0648\u0627\u0647\u06cc \u0648 \u06a9\u0644\u06cc\u062f \u062e\u0635\u0648\u0635\u06cc \u0631\u0627 \u062e\u0631\u0648\u062c\u06cc \u0645\u06cc \u062f\u0647\u062f. \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u0645\u062d\u062a\u0648\u0627 \u0631\u0627 \u062f\u0631 \u0635\u0641\u062d\u0647 Secrets GitHub \u06a9\u067e\u06cc \u0648 \u062c\u0627\u06cc\u06af\u0630\u0627\u0631\u06cc \u06a9\u0646\u06cc\u062f.<\/p>\n<p>  \u0627\u06cc\u062c\u0627\u062f \u06cc\u06a9 \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc Statefile<\/p>\n<p>Statefile \u06cc\u06a9 \u0641\u0627\u06cc\u0644 \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc \u0627\u0633\u062a \u06a9\u0647 \u0634\u0627\u0645\u0644 \u062a\u0646\u0638\u06cc\u0645\u0627\u062a \u0628\u0631\u0646\u0627\u0645\u0647 \u0634\u0645\u0627 \u0627\u0633\u062a. \u0646\u0627\u0645 \u062a\u0635\u0648\u06cc\u0631\u060c \u0634\u0645\u0627\u0631\u0647 \u067e\u0648\u0631\u062a \u0648 \u0645\u062a\u063a\u06cc\u0631\u0647\u0627\u06cc \u0645\u062d\u06cc\u0637\u06cc \u0645\u0648\u0631\u062f \u0646\u06cc\u0627\u0632 \u0628\u0631\u0627\u06cc \u0627\u0633\u062a\u0642\u0631\u0627\u0631 \u0628\u0631\u0646\u0627\u0645\u0647 \u0634\u0645\u0627 \u0631\u0627 \u0645\u0634\u062e\u0635 \u0645\u06cc \u06a9\u0646\u062f. \u0634\u0645\u0627 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u06cc\u06a9 Statefile \u0628\u0631\u0627\u06cc \u0628\u0631\u0646\u0627\u0645\u0647 \u062e\u0648\u062f \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f \u0648 \u0627\u0632 \u0622\u0646 \u0628\u0631\u0627\u06cc \u0627\u0633\u062a\u0642\u0631\u0627\u0631 \u0628\u0631\u0646\u0627\u0645\u0647 \u062e\u0648\u062f \u062f\u0631 \u0633\u0631\u0648\u0631 \u062e\u0648\u062f \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 Nanocl \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u062f.\u0627\u06cc\u0646 Statefile \u0627\u0633\u062a \u06a9\u0647 \u0645\u0646 \u0628\u0631\u0627\u06cc \u0627\u0633\u062a\u0642\u0631\u0627\u0631 \u0645\u0633\u062a\u0646\u062f\u0627\u062a \u0628\u0639\u062f\u06cc \u06a9\u0644\u0627\u0647 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc \u06a9\u0646\u0645:<\/p>\n<p>ApiVersion: v0.16<\/p>\n<p>Args:<br \/>\n&#8211; Name: version<br \/>\n  Kind: String<\/p>\n<p>Cargoes:<br \/>\n&#8211; Name: nh-doc<br \/>\n  Container:<br \/>\n    Image: ghcr.io\/next-hat\/documentation:${{ Args.version }}<\/p>\n<p>Resources:<br \/>\n&#8211; Name: http.docs.next-hat.com<br \/>\n  Kind: ncproxy.io\/rule<br \/>\n  Data:<br \/>\n    Rules:<br \/>\n    &#8211; Domain: docs.next-hat.com<br \/>\n      Network: Public<br \/>\n      # Secret created for the certbot job below<br \/>\n      # You can remove this line if you don&#8217;t want https<br \/>\n      Ssl: cert.docs.next-hat.com<br \/>\n      Locations:<br \/>\n      &#8211; Path: \/<br \/>\n        Target:<br \/>\n          Key: nh-doc.global.c<br \/>\n          Port: 80<br \/>\n    &#8211; Domain: docs.next-hat.com<br \/>\n      Network: Public<br \/>\n      Locations:<br \/>\n      &#8211; Path: \/<br \/>\n        Target:<br \/>\n          Url: https:\/\/docs.next-hat.com<br \/>\n          Redirect: Temporary<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>\u0627\u06cc\u0646 Statefile \u0628\u0627\u06cc\u062f \u062f\u0631 \u0631\u06cc\u0634\u0647 \u062f\u0627\u06cc\u0631\u06a9\u062a\u0648\u0631\u06cc \u067e\u0631\u0648\u0698\u0647 \u0634\u0645\u0627 \u0642\u0631\u0627\u0631 \u06af\u06cc\u0631\u062f.<\/p>\n<p>  \u0631\u0627\u0647 \u0627\u0646\u062f\u0627\u0632\u06cc GitHub Actions<\/p>\n<p>GitHub Actions \u0628\u0647 \u0634\u0645\u0627 \u0627\u0645\u06a9\u0627\u0646 \u0645\u06cc \u062f\u0647\u062f \u06af\u0631\u062f\u0634 \u06a9\u0627\u0631 \u062e\u0648\u062f \u0631\u0627 \u0645\u0633\u062a\u0642\u06cc\u0645\u0627\u064b \u0627\u0632 \u0645\u062e\u0632\u0646 GitHub \u062e\u0648\u062f \u062e\u0648\u062f\u06a9\u0627\u0631 \u06a9\u0646\u06cc\u062f. \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u06cc\u062f \u06af\u0631\u062f\u0634\u200c\u0647\u0627\u06cc \u06a9\u0627\u0631\u06cc \u0633\u0641\u0627\u0631\u0634\u06cc \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f \u06a9\u0647 \u0631\u0648\u06cc \u0631\u0648\u06cc\u062f\u0627\u062f\u0647\u0627\u06cc \u062e\u0627\u0635 \u0627\u062c\u0631\u0627 \u0634\u0648\u0646\u062f\u060c \u0645\u0627\u0646\u0646\u062f \u0641\u0634\u0627\u0631 \u062f\u0627\u062f\u0646 \u06a9\u062f \u0628\u0647 \u0645\u062e\u0632\u0646 \u06cc\u0627 \u0627\u06cc\u062c\u0627\u062f \u06cc\u06a9 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u06a9\u0634\u0634. \u062f\u0631 \u0627\u06cc\u0646 \u0631\u0627\u0647\u0646\u0645\u0627\u060c \u0645\u0627 \u06cc\u06a9 \u06af\u0631\u062f\u0634 \u06a9\u0627\u0631\u06cc \u0627\u06cc\u062c\u0627\u062f \u0645\u06cc \u06a9\u0646\u06cc\u0645 \u06a9\u0647 \u0628\u0631\u0646\u0627\u0645\u0647 \u0634\u0645\u0627 \u0631\u0627 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 Nanocl \u0628\u0631 \u0631\u0648\u06cc \u0633\u0631\u0648\u0631 \u0634\u0645\u0627 \u0645\u06cc \u0633\u0627\u0632\u062f.\u06a9\u062f \u0645\u0646\u0628\u0639 \u06a9\u0627\u0645\u0644 \u0631\u0627 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u062f\u0631 \u0627\u06cc\u0646\u062c\u0627 \u0628\u06cc\u0627\u0628\u06cc\u062f<\/p>\n<p>  \u0633\u0627\u062e\u062a \u0648 \u0627\u0646\u062a\u0634\u0627\u0631 \u062a\u0635\u0648\u06cc\u0631 \u062f\u0627\u06a9\u0631<\/p>\n<p>\u0628\u0631\u0627\u06cc \u0634\u0631\u0648\u0639\u060c \u06cc\u06a9 \u0641\u0627\u06cc\u0644 \u062c\u062f\u06cc\u062f \u062f\u0631 \u0645\u062e\u0632\u0646 \u062e\u0648\u062f \u0628\u0647 \u0646\u0627\u0645 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f .github\/workflows\/build-and-publish.yml. \u0627\u06cc\u0646 \u0641\u0627\u06cc\u0644 \u0634\u0627\u0645\u0644 \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc \u0628\u0631\u0627\u06cc \u06af\u0631\u062f\u0634 \u06a9\u0627\u0631 GitHub Actions \u0634\u0645\u0627 \u062e\u0648\u0627\u0647\u062f \u0628\u0648\u062f. \u0648 \u0628\u0631\u0627\u06cc \u0633\u0627\u062e\u062a \u062a\u0635\u0648\u06cc\u0631 docker \u0634\u0645\u0627 \u0648 \u0627\u0646\u062a\u0634\u0627\u0631 \u0622\u0646 \u062f\u0631 \u0631\u062c\u06cc\u0633\u062a\u0631\u06cc \u06a9\u0627\u0646\u062a\u06cc\u0646\u0631 github \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u062e\u0648\u0627\u0647\u062f \u0634\u062f. \u0641\u0642\u0637 \u0632\u0645\u0627\u0646\u06cc \u06a9\u0647 \u062f\u0631 \u062d\u0627\u0644 \u0627\u062f\u063a\u0627\u0645 \u0628\u0647 \u0634\u0627\u062e\u0647 \u0627\u0635\u0644\u06cc \u0647\u0633\u062a\u06cc\u0645.<\/p>\n<p>name: Build and publish docker image<\/p>\n<p>on:<br \/>\n  push:<br \/>\n    branches:<br \/>\n      &#8211; master<\/p>\n<p>jobs:<br \/>\n  deploy:<br \/>\n    name: Build and publish docker image<br \/>\n    runs-on: ubuntu-latest<br \/>\n    steps:<br \/>\n      &#8211; uses: actions\/checkout@v3<\/p>\n<p>      &#8211; name: Set up Docker Buildx<br \/>\n        uses: docker\/setup-buildx-action@v2<\/p>\n<p>      &#8211; name: Log in to GitHub Container Registry<br \/>\n        uses: docker\/login-action@v2<br \/>\n        with:<br \/>\n          registry: ghcr.io<br \/>\n          username: ${{ github.repository_owner }}<br \/>\n          password: ${{ secrets.GITHUB_TOKEN }}<\/p>\n<p>      &#8211; name: Extract version from package.json<br \/>\n        id: extract_version<br \/>\n        run: |<br \/>\n          version=$(jq -r &#8216;.version&#8217; package.json)<br \/>\n          echo &#8220;PACKAGE_VERSION=$version&#8221; &gt;&gt; $GITHUB_ENV<\/p>\n<p>      &#8211; name: Check if version already exists<br \/>\n        id: check_version<br \/>\n        run: |<br \/>\n          VERSION=${{ env.PACKAGE_VERSION }}<br \/>\n          IMAGE_NAME=ghcr.io\/${{ github.repository_owner }}\/my-image<br \/>\n          if docker manifest inspect $IMAGE_NAME:$VERSION &gt; \/dev\/null 2&gt;&amp;1; then<br \/>\n            echo &#8220;Version $VERSION already exists.&#8221;<br \/>\n            exit 1<br \/>\n          fi<br \/>\n        env:<br \/>\n          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}<\/p>\n<p>      &#8211; name: Build and push Docker image<br \/>\n        uses: docker\/build-push-action@v4<br \/>\n        with:<br \/>\n          context: .<br \/>\n          push: true<br \/>\n          tags: |<br \/>\n            ghcr.io\/${{ github.repository_owner }}\/documentation:latest<br \/>\n            ghcr.io\/${{ github.repository_owner }}\/documentation:${{ env.PACKAGE_VERSION }}<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>\u0647\u0631 \u0628\u0627\u0631 \u06a9\u0647 \u06a9\u062f\u0647\u0627 \u0631\u0627 \u062f\u0631 \u0634\u0627\u062e\u0647 \u0627\u0635\u0644\u06cc \u0645\u062e\u0632\u0646 \u062e\u0648\u062f \u0627\u062f\u063a\u0627\u0645 \u0645\u06cc \u06a9\u0646\u06cc\u062f\u060c \u0627\u06cc\u0646 \u06af\u0631\u062f\u0634 \u06a9\u0627\u0631 \u0627\u062c\u0631\u0627 \u0645\u06cc \u0634\u0648\u062f. \u0627\u06cc\u0646 \u06cc\u06a9 \u062a\u0635\u0648\u06cc\u0631 \u062f\u0627\u06a9\u0631 \u0627\u0632 \u06a9\u062f \u0634\u0645\u0627 \u0645\u06cc \u0633\u0627\u0632\u062f\u060c \u0622\u0646 \u0631\u0627 \u0628\u0627 \u0622\u062e\u0631\u06cc\u0646 \u0646\u0633\u062e\u0647 \u0627\u0632 \u06a9\u062f \u0634\u0645\u0627 \u062a\u06af \u0645\u06cc \u06a9\u0646\u062f package.json \u0641\u0627\u06cc\u0644\u060c \u0648 \u0622\u0646 \u0631\u0627 \u0628\u0647 \u0631\u062c\u06cc\u0633\u062a\u0631\u06cc \u0638\u0631\u0641 GitHub \u0641\u0634\u0627\u0631 \u062f\u0647\u06cc\u062f. \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u062c\u0627\u06cc\u06af\u0632\u06cc\u0646 \u06a9\u0646\u06cc\u062f documentation \u0628\u0627 \u0646\u0627\u0645 \u062a\u0635\u0648\u06cc\u0631 \u0634\u0645\u0627<\/p>\n<p>  \u0627\u0633\u062a\u0642\u0631\u0627\u0631 \u0628\u0631\u0646\u0627\u0645\u0647 \u0628\u0627 Nanocl<\/p>\n<p>\u0633\u067e\u0633 \u06cc\u06a9 \u0641\u0627\u06cc\u0644 \u062c\u062f\u06cc\u062f \u062f\u0631 \u0645\u062e\u0632\u0646 \u062e\u0648\u062f \u0628\u0647 \u0646\u0627\u0645 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f .github\/workflows\/deploy.yml. \u0627\u06cc\u0646 \u0641\u0627\u06cc\u0644 \u0634\u0627\u0645\u0644 \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc \u0628\u0631\u0627\u06cc \u06af\u0631\u062f\u0634 \u06a9\u0627\u0631 GitHub Actions \u0634\u0645\u0627 \u062e\u0648\u0627\u0647\u062f \u0628\u0648\u062f. \u0648 \u0628\u0631\u0627\u06cc \u0627\u0633\u062a\u0642\u0631\u0627\u0631 \u0628\u0631\u0646\u0627\u0645\u0647 \u0634\u0645\u0627 \u0631\u0648\u06cc \u0633\u0631\u0648\u0631 \u0634\u0645\u0627 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 Nanocl \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u062e\u0648\u0627\u0647\u062f \u0634\u062f.<\/p>\n<p>name: Deploy<\/p>\n<p>on:<br \/>\n  workflow_run:<br \/>\n    workflows: [&#8220;Build and publish Docker image&#8221;]\n    types:<br \/>\n      &#8211; completed<\/p>\n<p>jobs:<br \/>\n  deploy:<br \/>\n    runs-on: ubuntu-latest<\/p>\n<p>    steps:<br \/>\n    &#8211; name: Checkout repository<br \/>\n      uses: actions\/checkout@v3<\/p>\n<p>    &#8211; name: Install nanocl cli<br \/>\n      run: |<br \/>\n        wget https:\/\/github.com\/next-hat\/nanocl\/releases\/download\/nanocl-0.16.2\/nanocl_0.16.2_amd64.deb<br \/>\n        sudo dpkg -i nanocl_0.16.1_amd64.deb<br \/>\n        rm nanocl_0.16.1_amd64.deb<\/p>\n<p>    &#8211; name: Deploy to production<br \/>\n      run: |<br \/>\n        VERSION=$(jq -r &#8216;.version&#8217; package.json)<br \/>\n        nanocl version<br \/>\n        echo $VERSION<br \/>\n        nanocl state apply -ys Statefile.yml &#8212; &#8211;version $VERSION<br \/>\n      env:<br \/>\n        HOST: ${{ secrets.NANOCL_HOST }}<br \/>\n        CERT: ${{ secrets.NANOCL_CERT }}<br \/>\n        CERT_KEY: ${{ secrets.NANOCL_CERT_KEY }}<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>\u0627\u06cc\u0646 \u06af\u0631\u062f\u0634 \u06a9\u0627\u0631 \u0647\u0631 \u0628\u0627\u0631 \u0627\u062c\u0631\u0627 \u0645\u06cc \u0634\u0648\u062f Build and publish Docker image \u06af\u0631\u062f\u0634 \u06a9\u0627\u0631 \u062a\u06a9\u0645\u06cc\u0644 \u0634\u062f\u0647 \u0627\u0633\u062a. \u0628\u0631\u0646\u0627\u0645\u0647 \u0634\u0645\u0627 \u0631\u0627 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 Nanocl \u0631\u0648\u06cc \u0633\u0631\u0648\u0631 \u0634\u0645\u0627 \u0645\u0633\u062a\u0642\u0631 \u0645\u06cc \u06a9\u0646\u062f. \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u062c\u0627\u06cc\u06af\u0632\u06cc\u0646 \u06a9\u0646\u06cc\u062f Statefile.yml \u0628\u0627 \u0645\u0633\u06cc\u0631 \u0641\u0627\u06cc\u0644 \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc Statefile \u0627\u06af\u0631 \u0646\u0627\u0645 \u0645\u0633\u06cc\u0631 \u062f\u06cc\u06af\u0631\u06cc \u062f\u0627\u0631\u06cc\u062f.<\/p>\n<p>\u0627\u06a9\u0646\u0648\u0646 \u0634\u0645\u0627 \u062e\u0637 \u0644\u0648\u0644\u0647 CI\/CD \u062e\u0648\u062f \u0631\u0627 \u0628\u0627 GitHub Actions \u0648 Nanocl \u0631\u0627\u0647 \u0627\u0646\u062f\u0627\u0632\u06cc \u06a9\u0631\u062f\u0647 \u0627\u06cc\u062f. \u0647\u0631 \u0628\u0627\u0631 \u06a9\u0647 \u06a9\u062f \u0631\u0627 \u0628\u0647 \u0645\u062e\u0632\u0646 \u062e\u0648\u062f \u0641\u0634\u0627\u0631 \u0645\u06cc \u062f\u0647\u06cc\u062f\u060c GitHub Actions \u062a\u0635\u0648\u06cc\u0631 Docker \u0634\u0645\u0627 \u0631\u0627 \u062f\u0631 \u0631\u062c\u06cc\u0633\u062a\u0631\u06cc \u06a9\u0627\u0646\u062a\u06cc\u0646\u0631 GitHub \u0645\u06cc \u0633\u0627\u0632\u062f \u0648 \u0645\u0646\u062a\u0634\u0631 \u0645\u06cc \u06a9\u0646\u062f. \u0647\u0646\u06af\u0627\u0645\u06cc \u06a9\u0647 \u062a\u0635\u0648\u06cc\u0631 \u0645\u0646\u062a\u0634\u0631 \u0634\u062f\u060c \u06af\u0631\u062f\u0634 \u06a9\u0627\u0631 \u0627\u0633\u062a\u0642\u0631\u0627\u0631 \u0631\u0627 \u0622\u063a\u0627\u0632 \u0645\u06cc \u06a9\u0646\u062f\u060c \u06a9\u0647 \u0628\u0631\u0646\u0627\u0645\u0647 \u0634\u0645\u0627 \u0631\u0627 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 Nanocl \u062f\u0631 \u0633\u0631\u0648\u0631 \u0634\u0645\u0627 \u0645\u0633\u062a\u0642\u0631 \u0645\u06cc \u06a9\u0646\u062f.<\/p>\n<p>  SSL\/TLS \u0639\u0645\u0648\u0645\u06cc \u0631\u0627 \u0628\u0627 Let&#39;s Encrypt \u0641\u0639\u0627\u0644 \u06a9\u0646\u06cc\u062f<\/p>\n<p>\u0639\u0644\u0627\u0648\u0647 \u0628\u0631 \u0627\u06cc\u0646\u060c \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f SSL\/TLS \u0639\u0645\u0648\u0645\u06cc \u0631\u0627 \u0628\u0627 Let&#39;s Encrypt \u0641\u0639\u0627\u0644 \u06a9\u0646\u06cc\u062f. \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u0627\u0632 \u062f\u0633\u062a\u0648\u0631 \u0632\u06cc\u0631 \u0628\u0631\u0627\u06cc \u0641\u0639\u0627\u0644 \u06a9\u0631\u062f\u0646 SSL\/TLS \u0639\u0645\u0648\u0645\u06cc \u0628\u0627 Let&#39;s Encrypt \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u062f:<\/p>\n<p>nanocl state apply -fs https:\/\/nhnr.io\/v0.16\/sys\/certbot.yml &#8212; &#8211;email contact@next-hat.com &#8211;domain docs.next-hat.com<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>  \u0646\u062a\u06cc\u062c\u0647 \u06af\u06cc\u0631\u06cc<\/p>\n<p>\u0628\u0627 \u062f\u0646\u0628\u0627\u0644 \u06a9\u0631\u062f\u0646 \u0645\u0631\u0627\u062d\u0644 \u0630\u06a9\u0631 \u0634\u062f\u0647 \u062f\u0631 \u0627\u06cc\u0646 \u0631\u0627\u0647\u0646\u0645\u0627\u060c \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u06cc\u062f \u0628\u0627 \u06a9\u0645\u062a\u0631\u06cc\u0646 \u062a\u0644\u0627\u0634 \u0648 \u0628\u062f\u0648\u0646 \u062a\u0648\u0642\u0641\u060c \u0627\u0633\u062a\u0642\u0631\u0627\u0631 \u0628\u0631\u0646\u0627\u0645\u0647\u200c\u0647\u0627\u06cc \u062e\u0648\u062f \u0631\u0627 \u0628\u0647 \u0633\u0631\u0648\u0631 \u062e\u0648\u062f \u0628\u0647 \u0637\u0648\u0631 \u062e\u0648\u062f\u06a9\u0627\u0631 \u0627\u0646\u062c\u0627\u0645 \u062f\u0647\u06cc\u062f. \u0627\u06cc\u0646 \u0628\u0647 \u0634\u0645\u0627 \u06a9\u0645\u06a9 \u0645\u06cc\u200c\u06a9\u0646\u062f \u0646\u0631\u0645\u200c\u0627\u0641\u0632\u0627\u0631 \u0628\u0627 \u06a9\u06cc\u0641\u06cc\u062a \u0628\u0627\u0644\u0627 \u0631\u0627 \u0628\u0647 \u0633\u0631\u0639\u062a \u0648 \u06a9\u0627\u0631\u0622\u0645\u062f \u0627\u0631\u0627\u0626\u0647 \u062f\u0647\u06cc\u062f \u0648 \u0645\u062f\u06cc\u0631\u06cc\u062a \u0632\u06cc\u0631\u0633\u0627\u062e\u062a\u200c\u0647\u0627 \u0648 \u0627\u0633\u062a\u0642\u0631\u0627\u0631 \u0628\u0631\u0646\u0627\u0645\u0647\u200c\u0647\u0627\u06cc \u062e\u0648\u062f \u0631\u0627 \u0628\u0627 \u0627\u0637\u0645\u06cc\u0646\u0627\u0646 \u0622\u0633\u0627\u0646\u200c\u062a\u0631 \u0645\u06cc\u200c\u06a9\u0646\u062f.<\/p>\n<p>\u0627\u06a9\u0646\u0648\u0646 \u06a9\u0647 \u0645\u06cc \u062f\u0627\u0646\u06cc\u062f \u0686\u06af\u0648\u0646\u0647 \u0627\u0633\u062a\u0642\u0631\u0627\u0631 \u062e\u0648\u062f \u0631\u0627 \u0628\u0627 GitHub Actions \u0648 Nanocl \u062e\u0648\u062f\u06a9\u0627\u0631 \u06a9\u0646\u06cc\u062f\u060c \u0686\u0631\u0627 \u0622\u0646 \u0631\u0627 \u0628\u0627 \u067e\u0631\u0648\u0698\u0647 \u062e\u0648\u062f \u0627\u0645\u062a\u062d\u0627\u0646 \u0646\u06a9\u0646\u06cc\u062f\u061f \u0628\u0647 \u0645\u0627 \u0627\u0637\u0644\u0627\u0639 \u062f\u0647\u06cc\u062f \u06a9\u0647 \u0686\u06af\u0648\u0646\u0647 \u067e\u06cc\u0634 \u0645\u06cc \u0631\u0648\u062f \u06cc\u0627 \u0627\u06af\u0631 \u0633\u0648\u0627\u0644\u06cc \u062f\u0627\u0631\u06cc\u062f!<\/p>\n<p>\u0627\u06af\u0631 \u0633\u0624\u0627\u0644\u06cc \u062f\u0627\u0631\u06cc\u062f \u06cc\u0627 \u0628\u0631\u0627\u06cc \u0631\u0627\u0647\u200c\u0627\u0646\u062f\u0627\u0632\u06cc \u062e\u0637 \u0644\u0648\u0644\u0647 CI\/CD \u062e\u0648\u062f \u0628\u0627 GitHub Actions \u0648 Nanocl \u0628\u0647 \u06a9\u0645\u06a9 \u0646\u06cc\u0627\u0632 \u062f\u0627\u0631\u06cc\u062f\u060c \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u06cc\u062f \u0628\u0647 \u0633\u0631\u0648\u0631 discord \u0645\u0646 \u0628\u067e\u06cc\u0648\u0646\u062f\u06cc\u062f. \u0645\u0646 \u0627\u06cc\u0646\u062c\u0627 \u0647\u0633\u062a\u0645 \u062a\u0627 \u0628\u0647 \u0634\u0645\u0627 \u06a9\u0645\u06a9 \u06a9\u0646\u0645 \u062f\u0631 \u0633\u0641\u0631 \u062a\u0648\u0633\u0639\u0647 \u0646\u0631\u0645 \u0627\u0641\u0632\u0627\u0631 \u062e\u0648\u062f \u0645\u0648\u0641\u0642 \u0634\u0648\u06cc\u062f.<\/p>\n<div data-article-id=\"2119740\" id=\"article-body\">\n<p>\u06cc\u0627\u062f \u0628\u06af\u06cc\u0631\u06cc\u062f \u0686\u06af\u0648\u0646\u0647 \u0627\u0633\u062a\u0642\u0631\u0627\u0631 \u062e\u0648\u062f \u0631\u0627 \u0628\u0627 GitHub Actions \u0648 Nanocl \u062e\u0648\u062f\u06a9\u0627\u0631 \u06a9\u0646\u06cc\u062f. \u0627\u06cc\u0646 \u0631\u0627\u0647\u0646\u0645\u0627 \u0634\u0645\u0627 \u0631\u0627 \u062f\u0631 \u0631\u0627\u0647\u200c\u0627\u0646\u062f\u0627\u0632\u06cc \u0627\u0633\u062a\u0642\u0631\u0627\u0631 \u06cc\u06a9\u067e\u0627\u0631\u0686\u0647 \u0631\u0627\u0647\u0646\u0645\u0627\u06cc\u06cc \u0645\u06cc\u200c\u06a9\u0646\u062f \u0648 \u0628\u0647 \u06a9\u0627\u0631\u06af\u06cc\u0631\u06cc \u0628\u0631\u0646\u0627\u0645\u0647\u200c\u0647\u0627\u06cc\u062a\u0627\u0646 \u0631\u0627 \u0628\u0627 \u062d\u062f\u0627\u0642\u0644 \u062a\u0644\u0627\u0634 \u0622\u0633\u0627\u0646\u200c\u062a\u0631 \u0645\u06cc\u200c\u06a9\u0646\u062f. \u0686\u0647 \u062f\u0631 CI\/CD \u062a\u0627\u0632\u0647 \u06a9\u0627\u0631 \u0628\u0627\u0634\u06cc\u062f \u06cc\u0627 \u06cc\u06a9 \u062a\u0648\u0633\u0639\u0647 \u062f\u0647\u0646\u062f\u0647 \u0628\u0627 \u062a\u062c\u0631\u0628\u0647\u060c \u0627\u06cc\u0646 \u067e\u0633\u062a \u0628\u0647 \u0634\u0645\u0627 \u0646\u0634\u0627\u0646 \u0645\u06cc \u062f\u0647\u062f \u06a9\u0647 \u0686\u06af\u0648\u0646\u0647 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0627\u0628\u0632\u0627\u0631\u0647\u0627\u06cc \u0645\u0646\u0628\u0639 \u0628\u0627\u0632 \u0642\u062f\u0631\u062a\u0645\u0646\u062f\u060c \u06af\u0631\u062f\u0634 \u06a9\u0627\u0631 \u062e\u0648\u062f \u0631\u0627 \u0633\u0627\u062f\u0647 \u06a9\u0646\u06cc\u062f.<\/p>\n<p><\/p>\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_85 counter-hierarchy ez-toc-counter-rtl ez-toc-grey ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">\u0641\u0647\u0631\u0633\u062a \u0645\u0637\u0627\u0644\u0628<\/p>\n<span class=\"ez-toc-title-toggle\"><a href=\"#\" class=\"ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle\" aria-label=\"\u062a\u063a\u06cc\u06cc\u0631 \u0648\u0636\u0639\u06cc\u062a \u0641\u0647\u0631\u0633\u062a \u0645\u0637\u0627\u0644\u0628\"><span class=\"ez-toc-js-icon-con\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/span><\/a><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/nabfollower.com\/blog\/automating-deployment-with-github-actions-and-nanocl-2b1e\/#%D9%85%D9%82%D8%AF%D9%85%D9%87\" >\u0645\u0642\u062f\u0645\u0647<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/nabfollower.com\/blog\/automating-deployment-with-github-actions-and-nanocl-2b1e\/#%D9%BE%DB%8C%D8%B4_%D9%86%DB%8C%D8%A7%D8%B2%D9%87%D8%A7\" >\u067e\u06cc\u0634 \u0646\u06cc\u0627\u0632\u0647\u0627<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/nabfollower.com\/blog\/automating-deployment-with-github-actions-and-nanocl-2b1e\/#%D8%A7%DB%8C%D8%AC%D8%A7%D8%AF_%D8%AA%D8%B5%D9%88%DB%8C%D8%B1_%D8%B8%D8%B1%D9%81\" >\u0627\u06cc\u062c\u0627\u062f \u062a\u0635\u0648\u06cc\u0631 \u0638\u0631\u0641<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/nabfollower.com\/blog\/automating-deployment-with-github-actions-and-nanocl-2b1e\/#%D8%A7%DB%8C%D8%AC%D8%A7%D8%AF_%DB%8C%DA%A9_%D9%81%D8%A7%DB%8C%D9%84_%D9%BE%DB%8C%DA%A9%D8%B1%D8%A8%D9%86%D8%AF%DB%8C_Nginx\" >\u0627\u06cc\u062c\u0627\u062f \u06cc\u06a9 \u0641\u0627\u06cc\u0644 \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc Nginx<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/nabfollower.com\/blog\/automating-deployment-with-github-actions-and-nanocl-2b1e\/#%D8%A7%DB%8C%D8%AC%D8%A7%D8%AF_%DB%8C%DA%A9_Dockerfile\" >\u0627\u06cc\u062c\u0627\u062f \u06cc\u06a9 Dockerfile<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/nabfollower.com\/blog\/automating-deployment-with-github-actions-and-nanocl-2b1e\/#%D8%B3%D8%A7%D8%AE%D8%AA_%D9%88_%D8%A7%D8%AC%D8%B1%D8%A7%DB%8C_%D8%AA%D8%B5%D9%88%DB%8C%D8%B1_Docker_%D8%A8%D9%87_%D8%B5%D9%88%D8%B1%D8%AA_%D9%85%D8%AD%D9%84%DB%8C\" >\u0633\u0627\u062e\u062a \u0648 \u0627\u062c\u0631\u0627\u06cc \u062a\u0635\u0648\u06cc\u0631 Docker \u0628\u0647 \u0635\u0648\u0631\u062a \u0645\u062d\u0644\u06cc<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/nabfollower.com\/blog\/automating-deployment-with-github-actions-and-nanocl-2b1e\/#%D8%B1%D8%A7%D9%87_%D8%A7%D9%86%D8%AF%D8%A7%D8%B2%DB%8C_Nanocl\" >\u0631\u0627\u0647 \u0627\u0646\u062f\u0627\u0632\u06cc Nanocl<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-8\" href=\"https:\/\/nabfollower.com\/blog\/automating-deployment-with-github-actions-and-nanocl-2b1e\/#%D8%B1%D8%A7%D9%87_%D8%A7%D9%86%D8%AF%D8%A7%D8%B2%DB%8C_Github_Secrets\" >\u0631\u0627\u0647 \u0627\u0646\u062f\u0627\u0632\u06cc Github Secrets<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-9\" href=\"https:\/\/nabfollower.com\/blog\/automating-deployment-with-github-actions-and-nanocl-2b1e\/#%D8%A7%DB%8C%D8%AC%D8%A7%D8%AF_%DB%8C%DA%A9_%D9%BE%DB%8C%DA%A9%D8%B1%D8%A8%D9%86%D8%AF%DB%8C_Statefile\" >\u0627\u06cc\u062c\u0627\u062f \u06cc\u06a9 \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc Statefile<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-10\" href=\"https:\/\/nabfollower.com\/blog\/automating-deployment-with-github-actions-and-nanocl-2b1e\/#%D8%B1%D8%A7%D9%87_%D8%A7%D9%86%D8%AF%D8%A7%D8%B2%DB%8C_GitHub_Actions\" >\u0631\u0627\u0647 \u0627\u0646\u062f\u0627\u0632\u06cc GitHub Actions<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-11\" href=\"https:\/\/nabfollower.com\/blog\/automating-deployment-with-github-actions-and-nanocl-2b1e\/#%D8%B3%D8%A7%D8%AE%D8%AA_%D9%88_%D8%A7%D9%86%D8%AA%D8%B4%D8%A7%D8%B1_%D8%AA%D8%B5%D9%88%DB%8C%D8%B1_%D8%AF%D8%A7%DA%A9%D8%B1\" >\u0633\u0627\u062e\u062a \u0648 \u0627\u0646\u062a\u0634\u0627\u0631 \u062a\u0635\u0648\u06cc\u0631 \u062f\u0627\u06a9\u0631<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-12\" href=\"https:\/\/nabfollower.com\/blog\/automating-deployment-with-github-actions-and-nanocl-2b1e\/#%D8%A7%D8%B3%D8%AA%D9%82%D8%B1%D8%A7%D8%B1_%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87_%D8%A8%D8%A7_Nanocl\" >\u0627\u0633\u062a\u0642\u0631\u0627\u0631 \u0628\u0631\u0646\u0627\u0645\u0647 \u0628\u0627 Nanocl<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-13\" href=\"https:\/\/nabfollower.com\/blog\/automating-deployment-with-github-actions-and-nanocl-2b1e\/#SSLTLS_%D8%B9%D9%85%D9%88%D9%85%DB%8C_%D8%B1%D8%A7_%D8%A8%D8%A7_Lets_Encrypt_%D9%81%D8%B9%D8%A7%D9%84_%DA%A9%D9%86%DB%8C%D8%AF\" >SSL\/TLS \u0639\u0645\u0648\u0645\u06cc \u0631\u0627 \u0628\u0627 Let&#39;s Encrypt \u0641\u0639\u0627\u0644 \u06a9\u0646\u06cc\u062f<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-14\" href=\"https:\/\/nabfollower.com\/blog\/automating-deployment-with-github-actions-and-nanocl-2b1e\/#%D9%86%D8%AA%DB%8C%D8%AC%D9%87_%DA%AF%DB%8C%D8%B1%DB%8C\" >\u0646\u062a\u06cc\u062c\u0647 \u06af\u06cc\u0631\u06cc<\/a><\/li><\/ul><\/nav><\/div>\n<h2><span class=\"ez-toc-section\" id=\"%D9%85%D9%82%D8%AF%D9%85%D9%87\"><\/span>\n<p>  \u0645\u0642\u062f\u0645\u0647<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u06cc\u06a9\u067e\u0627\u0631\u0686\u0647 \u0633\u0627\u0632\u06cc \u0645\u062f\u0627\u0648\u0645 \u0648 \u0627\u0633\u062a\u0642\u0631\u0627\u0631 \u0645\u0633\u062a\u0645\u0631 (CI\/CD) \u0634\u06cc\u0648\u0647 \u0647\u0627\u06cc \u0636\u0631\u0648\u0631\u06cc \u062f\u0631 \u062a\u0648\u0633\u0639\u0647 \u0646\u0631\u0645 \u0627\u0641\u0632\u0627\u0631 \u0645\u062f\u0631\u0646 \u0647\u0633\u062a\u0646\u062f. \u0622\u0646\u0647\u0627 \u0628\u0647 \u062e\u0648\u062f\u06a9\u0627\u0631\u0633\u0627\u0632\u06cc \u0641\u0631\u0622\u06cc\u0646\u062f \u0633\u0627\u062e\u062a\u060c \u0622\u0632\u0645\u0627\u06cc\u0634 \u0648 \u0627\u0633\u062a\u0642\u0631\u0627\u0631 \u0628\u0631\u0646\u0627\u0645\u0647\u200c\u0647\u0627 \u06a9\u0645\u06a9 \u0645\u06cc\u200c\u06a9\u0646\u0646\u062f \u0648 \u0627\u0631\u0627\u0626\u0647 \u0633\u0631\u06cc\u0639 \u0648 \u06a9\u0627\u0631\u0622\u0645\u062f \u0646\u0631\u0645\u200c\u0627\u0641\u0632\u0627\u0631 \u0628\u0627 \u06a9\u06cc\u0641\u06cc\u062a \u0628\u0627\u0644\u0627 \u0631\u0627 \u0622\u0633\u0627\u0646\u200c\u062a\u0631 \u0645\u06cc\u200c\u06a9\u0646\u0646\u062f. GitHub Actions \u06cc\u06a9 \u0627\u0628\u0632\u0627\u0631 \u0642\u062f\u0631\u062a\u0645\u0646\u062f \u0627\u0633\u062a \u06a9\u0647 \u0628\u0647 \u0634\u0645\u0627 \u0627\u0645\u06a9\u0627\u0646 \u0645\u06cc \u062f\u0647\u062f \u062e\u0637 \u0644\u0648\u0644\u0647 CI\/CD \u062e\u0648\u062f \u0631\u0627 \u0645\u0633\u062a\u0642\u06cc\u0645\u0627\u064b \u0627\u0632 \u0645\u062e\u0632\u0646 GitHub \u062e\u0648\u062f \u062e\u0648\u062f\u06a9\u0627\u0631 \u06a9\u0646\u06cc\u062f. Nanocl \u06cc\u06a9 \u0627\u0631\u06a9\u0633\u062a\u0631\u0627\u062a\u0648\u0631 \u06a9\u0627\u0646\u062a\u06cc\u0646\u0631 \u0648 \u0645\u0627\u0634\u06cc\u0646 \u0645\u062c\u0627\u0632\u06cc \u0627\u0633\u062a \u06a9\u0647 \u0628\u0627 \u0627\u0631\u0627\u0626\u0647 \u06cc\u06a9 \u0631\u0627\u0628\u0637 \u06cc\u06a9\u067e\u0627\u0631\u0686\u0647 \u0628\u0631\u0627\u06cc \u0645\u062f\u06cc\u0631\u06cc\u062a \u0632\u06cc\u0631\u0633\u0627\u062e\u062a \u0634\u0645\u0627\u060c \u0641\u0631\u0622\u06cc\u0646\u062f \u0627\u0633\u062a\u0642\u0631\u0627\u0631 \u0631\u0627 \u0633\u0627\u062f\u0647 \u0645\u06cc \u06a9\u0646\u062f.<\/p>\n<p>\u062f\u0631 \u0627\u06cc\u0646 \u0648\u0628\u0644\u0627\u06af \u0646\u0634\u0627\u0646 \u062e\u0648\u0627\u0647\u0645 \u062f\u0627\u062f \u06a9\u0647 \u0686\u06af\u0648\u0646\u0647 \u062e\u0637 \u0644\u0648\u0644\u0647 CI\/CD \u062e\u0648\u062f \u0631\u0627 \u0628\u0627 Github Actions \u0648 Nanocl \u0628\u0631\u0627\u06cc \u0627\u0633\u062a\u0642\u0631\u0627\u0631 \u0627\u0633\u0646\u0627\u062f next-hat \u0648 ntex.rs \u06a9\u0647 \u0627\u0632 docusaurus \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc \u06a9\u0646\u0646\u062f\u060c \u0631\u0627\u0647 \u0627\u0646\u062f\u0627\u0632\u06cc \u06a9\u0631\u062f\u0645.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"%D9%BE%DB%8C%D8%B4_%D9%86%DB%8C%D8%A7%D8%B2%D9%87%D8%A7\"><\/span>\n<p>  \u067e\u06cc\u0634 \u0646\u06cc\u0627\u0632\u0647\u0627<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u0642\u0628\u0644 \u0627\u0632 \u0634\u0631\u0648\u0639 \u0628\u0647 \u0686\u0646\u062f \u0686\u06cc\u0632 \u0646\u06cc\u0627\u0632 \u062f\u0627\u0631\u06cc\u062f:<\/p>\n<ul>\n<li>\u06cc\u06a9 \u062d\u0633\u0627\u0628 GitHub (\u0634\u0645\u0627 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u0628\u0647 \u0635\u0648\u0631\u062a \u0631\u0627\u06cc\u06af\u0627\u0646 \u062f\u0631 github.com \u062b\u0628\u062a \u0646\u0627\u0645 \u06a9\u0646\u06cc\u062f)<\/li>\n<li>\u067e\u0631\u0648\u0698\u0647 \u0627\u06cc \u0628\u0631\u0627\u06cc \u0627\u0633\u062a\u0642\u0631\u0627\u0631 (\u0627\u06cc\u0646 \u0645\u06cc \u062a\u0648\u0627\u0646\u062f \u06cc\u06a9 \u0648\u0628 \u0633\u0627\u06cc\u062a \u062b\u0627\u0628\u062a\u060c \u06cc\u06a9 \u0628\u0631\u0646\u0627\u0645\u0647 \u0648\u0628 \u06cc\u0627 \u0647\u0631 \u0686\u06cc\u0632\u06cc \u0628\u0627\u0634\u062f \u06a9\u0647 \u0645\u06cc \u062a\u0648\u0627\u0646\u062f \u062f\u0631 \u06cc\u06a9 \u06a9\u0627\u0646\u062a\u06cc\u0646\u0631 \u0627\u062c\u0631\u0627 \u0634\u0648\u062f)<\/li>\n<li>\u06cc\u06a9 \u0633\u0631\u0648\u0631 \u0627\u062e\u062a\u0635\u0627\u0635\u06cc \u06cc\u0627 \u06cc\u06a9 VPS (\u0645\u0646 \u0627\u0632 ovh \u0628\u0631\u0627\u06cc \u0633\u0631\u0648\u0631\u0647\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc \u06a9\u0646\u0645)<\/li>\n<li>\u0646\u0627\u0645 \u062f\u0627\u0645\u0646\u0647 \u0627\u06cc \u06a9\u0647 \u0628\u0647 \u0633\u0631\u0648\u0631 \u0634\u0645\u0627 \u0627\u0634\u0627\u0631\u0647 \u0645\u06cc \u06a9\u0646\u062f (\u0645\u0646 \u0627\u0632 ovh \u0628\u0631\u0627\u06cc \u0646\u0627\u0645 \u062f\u0627\u0645\u0646\u0647 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc \u06a9\u0646\u0645)<\/li>\n<li>Docker \u0631\u0648\u06cc \u0645\u0627\u0634\u06cc\u0646 \u0648 \u0633\u0631\u0648\u0631 \u0645\u062d\u0644\u06cc \u0634\u0645\u0627 \u0646\u0635\u0628 \u0634\u062f\u0647 \u0627\u0633\u062a (\u062f\u0633\u062a\u0648\u0631\u0627\u0644\u0639\u0645\u0644 \u0647\u0627\u06cc \u0646\u0635\u0628 \u0631\u0627 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u062f\u0631 \u0627\u06cc\u0646\u062c\u0627 \u0628\u06cc\u0627\u0628\u06cc\u062f)<\/li>\n<li>Nanocl \u0631\u0648\u06cc \u0633\u0631\u0648\u0631 \u0634\u0645\u0627 \u0646\u0635\u0628 \u0634\u062f\u0647 \u0627\u0633\u062a (\u062f\u0633\u062a\u0648\u0631\u0627\u0644\u0639\u0645\u0644 \u0647\u0627\u06cc \u0646\u0635\u0628 \u0631\u0627 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u062f\u0631 \u0627\u06cc\u0646\u062c\u0627 \u0628\u06cc\u0627\u0628\u06cc\u062f)<\/li>\n<\/ul>\n<h2><span class=\"ez-toc-section\" id=\"%D8%A7%DB%8C%D8%AC%D8%A7%D8%AF_%D8%AA%D8%B5%D9%88%DB%8C%D8%B1_%D8%B8%D8%B1%D9%81\"><\/span>\n<p>  \u0627\u06cc\u062c\u0627\u062f \u062a\u0635\u0648\u06cc\u0631 \u0638\u0631\u0641<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u0645\u0627 \u0646\u06af\u0627\u0647\u06cc \u0628\u0647 \u0646\u062d\u0648\u0647 \u0627\u06cc\u062c\u0627\u062f \u062a\u0635\u0648\u06cc\u0631 \u0638\u0631\u0641 \u0628\u0631\u0627\u06cc \u0627\u0633\u062a\u0642\u0631\u0627\u0631 \u0645\u0633\u062a\u0646\u062f\u0627\u062a next-hat \u0648 ntex.rs \u062e\u0648\u0627\u0647\u06cc\u0645 \u062f\u0627\u0634\u062a \u06a9\u0647 \u0627\u0632 docusaurus \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc \u06a9\u0646\u0646\u062f. \u0627\u06af\u0631 \u0627\u0632 \u0642\u0628\u0644 \u0645\u06cc\u200c\u062f\u0627\u0646\u06cc\u062f \u0686\u06af\u0648\u0646\u0647 \u06cc\u06a9 \u062a\u0635\u0648\u06cc\u0631 \u06a9\u0627\u0646\u062a\u06cc\u0646\u0631 \u062f\u0627\u06a9\u0631 \u0631\u0627 \u062a\u0646\u0638\u06cc\u0645 \u06a9\u0646\u06cc\u062f\u060c \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u06cc\u062f \u0627\u0632 \u0627\u06cc\u0646 \u0628\u062e\u0634 \u0635\u0631\u0641\u0646\u0638\u0631 \u06a9\u0646\u06cc\u062f.<\/p>\n<h3><span class=\"ez-toc-section\" id=\"%D8%A7%DB%8C%D8%AC%D8%A7%D8%AF_%DB%8C%DA%A9_%D9%81%D8%A7%DB%8C%D9%84_%D9%BE%DB%8C%DA%A9%D8%B1%D8%A8%D9%86%D8%AF%DB%8C_Nginx\"><\/span>\n<p>  \u0627\u06cc\u062c\u0627\u062f \u06cc\u06a9 \u0641\u0627\u06cc\u0644 \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc Nginx<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc \u06a9\u0646\u06cc\u0645 <code>nginx<\/code> \u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u06cc\u06a9 \u0648\u0628 \u0633\u0631\u0648\u0631 \u0628\u0631\u0627\u06cc \u0627\u0631\u0627\u0626\u0647 \u0641\u0627\u06cc\u0644 \u0647\u0627\u06cc \u062b\u0627\u0628\u062a \u062a\u0648\u0644\u06cc\u062f \u0634\u062f\u0647 \u062a\u0648\u0633\u0637 docusaurus. \u0631\u0627 <code>server.nginx<\/code> \u0641\u0627\u06cc\u0644 \u062d\u0627\u0648\u06cc \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc \u0628\u0631\u0627\u06cc \u0633\u0631\u0648\u0631 nginx \u0627\u0633\u062a. \u0634\u0645\u0627 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u0622\u0646 \u0631\u0627 \u0628\u0627 \u0641\u0627\u06cc\u0644 \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc \u062e\u0648\u062f \u062c\u0627\u06cc\u06af\u0632\u06cc\u0646 \u06a9\u0646\u06cc\u062f \u062a\u0627 \u0645\u0637\u0627\u0628\u0642 \u0628\u0627 \u0645\u0648\u0631\u062f \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0634\u0645\u0627 \u0628\u0627\u0634\u062f.<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight nginx\"><code><span class=\"k\">server<\/span> <span class=\"p\">{<\/span>\n  <span class=\"kn\">listen<\/span>       <span class=\"mi\">80<\/span><span class=\"p\">;<\/span>\n  <span class=\"kn\">listen<\/span>  <span class=\"s\">[::]:80<\/span><span class=\"p\">;<\/span>\n  <span class=\"kn\">rewrite<\/span> <span class=\"s\">^\/(.*)\/<\/span>$ <span class=\"n\">\/<\/span><span class=\"nv\">$1<\/span> <span class=\"s\">permanent<\/span><span class=\"p\">;<\/span>\n\n  <span class=\"kn\">gzip<\/span> <span class=\"no\">on<\/span><span class=\"p\">;<\/span>\n  <span class=\"kn\">gzip_vary<\/span> <span class=\"no\">on<\/span><span class=\"p\">;<\/span>\n  <span class=\"kn\">gzip_proxied<\/span> <span class=\"s\">any<\/span><span class=\"p\">;<\/span>\n  <span class=\"kn\">gzip_comp_level<\/span> <span class=\"mi\">8<\/span><span class=\"p\">;<\/span>\n  <span class=\"kn\">gunzip<\/span> <span class=\"no\">on<\/span><span class=\"p\">;<\/span>\n  <span class=\"kn\">gzip_types<\/span> <span class=\"nc\">application\/javascript<\/span> <span class=\"s\">image\/*<\/span> <span class=\"nc\">text\/css<\/span><span class=\"p\">;<\/span>\n  <span class=\"kn\">gzip_disable<\/span> <span class=\"s\">\"MSIE<\/span> <span class=\"s\">[1-6]<\/span><span class=\"err\">\\<\/span><span class=\"s\">.\"<\/span><span class=\"p\">;<\/span>\n\n  <span class=\"kn\">root<\/span> <span class=\"n\">\/home\/node\/app<\/span><span class=\"p\">;<\/span>\n  <span class=\"kn\">error_page<\/span> <span class=\"mi\">404<\/span> <span class=\"n\">\/404.html<\/span><span class=\"p\">;<\/span>\n  <span class=\"kn\">try_files<\/span> <span class=\"nv\">$uri<\/span><span class=\"s\">.html<\/span> <span class=\"nv\">$uri<\/span><span class=\"n\">\/index.html<\/span> <span class=\"p\">=<\/span><span class=\"mi\">404<\/span><span class=\"p\">;<\/span>\n\n  <span class=\"c1\">## All static files will be cached.<\/span>\n  <span class=\"kn\">location<\/span> <span class=\"p\">~<\/span><span class=\"sr\">*<\/span> <span class=\"s\">^.+<\/span><span class=\"err\">\\<\/span><span class=\"s\">.(?:css|webp|cur|js|jpe?g|gif|htc|ico|png|html|xml|otf|ttf|eot|woff|woff2|svg)<\/span>$ <span class=\"p\">{<\/span>\n    <span class=\"kn\">access_log<\/span> <span class=\"no\">off<\/span><span class=\"p\">;<\/span>\n    <span class=\"kn\">expires<\/span> <span class=\"s\">1y<\/span><span class=\"p\">;<\/span>\n    <span class=\"kn\">add_header<\/span> <span class=\"s\">Cache-Control<\/span> <span class=\"s\">max-age=31536000<\/span><span class=\"p\">;<\/span>\n\n    <span class=\"c1\">## No need to bleed constant updates. Send the all shebang in one<\/span>\n    <span class=\"c1\">## fell swoop.<\/span>\n    <span class=\"kn\">tcp_nodelay<\/span> <span class=\"no\">off<\/span><span class=\"p\">;<\/span>\n\n    <span class=\"c1\">## Set the OS file cache.<\/span>\n    <span class=\"kn\">open_file_cache<\/span> <span class=\"s\">max=3000<\/span> <span class=\"s\">inactive=120s<\/span><span class=\"p\">;<\/span>\n    <span class=\"kn\">open_file_cache_valid<\/span> <span class=\"s\">45s<\/span><span class=\"p\">;<\/span>\n    <span class=\"kn\">open_file_cache_min_uses<\/span> <span class=\"mi\">2<\/span><span class=\"p\">;<\/span>\n    <span class=\"kn\">open_file_cache_errors<\/span> <span class=\"no\">off<\/span><span class=\"p\">;<\/span>\n  <span class=\"p\">}<\/span>\n<span class=\"p\">}<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0628\u06cc\u0627\u06cc\u06cc\u062f \u062a\u062c\u0632\u06cc\u0647 \u06a9\u0646\u06cc\u0645 <code>server.nginx<\/code> \u0641\u0627\u06cc\u0644 \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc:<\/p>\n<ul>\n<li>\n<code>server { ... }<\/code>: \u0627\u06cc\u0646 \u0628\u0644\u0648\u06a9 \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc \u0633\u0631\u0648\u0631 Nginx \u0631\u0627 \u062a\u0639\u0631\u06cc\u0641 \u0645\u06cc \u06a9\u0646\u062f.<\/li>\n<li>\n<code>listen 80;<\/code>: \u0627\u06cc\u0646 \u062e\u0637 \u0645\u0634\u062e\u0635 \u0645\u06cc \u06a9\u0646\u062f \u06a9\u0647 \u0633\u0631\u0648\u0631 \u0628\u0627\u06cc\u062f \u062f\u0631 \u067e\u0648\u0631\u062a 80 \u06af\u0648\u0634 \u06a9\u0646\u062f.<\/li>\n<li>\n<code>rewrite ^\/(.*)\/$ \/$1 permanent;<\/code>: \u0627\u06cc\u0646 \u062e\u0637 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0647\u0627 \u0631\u0627 \u0628\u0627 \u0627\u0633\u0644\u0634 \u0627\u0646\u062a\u0647\u0627\u06cc\u06cc \u0628\u0647 \u0647\u0645\u0627\u0646 URL \u0628\u062f\u0648\u0646 \u0627\u0633\u0644\u0634 \u0647\u062f\u0627\u06cc\u062a \u0645\u06cc \u06a9\u0646\u062f.<\/li>\n<li>\n<code>gzip on;<\/code>: \u0627\u06cc\u0646 \u062e\u0637 \u0641\u0634\u0631\u062f\u0647 \u0633\u0627\u0632\u06cc gzip \u0631\u0627 \u0628\u0631\u0627\u06cc \u067e\u0627\u0633\u062e \u0647\u0627 \u0641\u0639\u0627\u0644 \u0645\u06cc \u06a9\u0646\u062f.<\/li>\n<li>\n<code>root \/home\/node\/app;<\/code>: \u0627\u06cc\u0646 \u062e\u0637 \u062f\u0627\u06cc\u0631\u06a9\u062a\u0648\u0631\u06cc \u0631\u06cc\u0634\u0647 \u0627\u06cc \u0631\u0627 \u0628\u0631\u0627\u06cc \u0627\u0631\u0627\u0626\u0647 \u0641\u0627\u06cc\u0644 \u0647\u0627\u06cc \u0627\u0633\u062a\u0627\u062a\u06cc\u06a9 \u0645\u0634\u062e\u0635 \u0645\u06cc \u06a9\u0646\u062f.<\/li>\n<li>\n<code>error_page 404 \/404.html;<\/code>: \u0627\u06cc\u0646 \u062e\u0637 \u0635\u0641\u062d\u0647 \u062e\u0637\u0627\u06cc \u0645\u0648\u0631\u062f \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0628\u0631\u0627\u06cc \u062e\u0637\u0627\u0647\u0627\u06cc 404 \u0631\u0627 \u0645\u0634\u062e\u0635 \u0645\u06cc \u06a9\u0646\u062f.<\/li>\n<li>\n<code>try_files $uri.html $uri\/index.html =404;<\/code>: \u0627\u06cc\u0646 \u062e\u0637 \u0641\u0627\u06cc\u0644 \u0647\u0627\u06cc\u06cc \u0631\u0627 \u0645\u0634\u062e\u0635 \u0645\u06cc \u06a9\u0646\u062f \u06a9\u0647 \u0628\u0627\u06cc\u062f \u0647\u0646\u06af\u0627\u0645 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0627\u0645\u062a\u062d\u0627\u0646 \u0634\u0648\u0646\u062f.<\/li>\n<li>\n<code>location ~* ^.+\\.(?:css|webp|cur|js|jpe?g|gif|htc|ico|png|html|xml|otf|ttf|eot|woff|woff2|svg)$ { ... }<\/code>: \u0627\u06cc\u0646 \u0628\u0644\u0648\u06a9 \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc \u0631\u0627 \u0628\u0631\u0627\u06cc \u0627\u0631\u0627\u0626\u0647 \u0641\u0627\u06cc\u0644\u200c\u0647\u0627\u06cc \u0627\u0633\u062a\u0627\u062a\u06cc\u06a9 \u0628\u0627 \u0641\u0639\u0627\u0644 \u06a9\u0631\u062f\u0646 \u06a9\u0634 \u0645\u0634\u062e\u0635 \u0645\u06cc\u200c\u06a9\u0646\u062f.<\/li>\n<\/ul>\n<p>\u0627\u06cc\u0646 \u0641\u0627\u06cc\u0644 \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc \u0633\u0631\u0648\u0631 Nginx \u0631\u0627 \u0628\u0631\u0627\u06cc \u0627\u0631\u0627\u0626\u0647 \u0641\u0627\u06cc\u0644\u200c\u0647\u0627\u06cc \u0627\u0633\u062a\u0627\u062a\u06cc\u06a9 \u0628\u0647\u06cc\u0646\u0647 \u0645\u06cc\u200c\u06a9\u0646\u062f \u0648 \u0628\u0627 \u0641\u0639\u0627\u0644 \u06a9\u0631\u062f\u0646 \u0641\u0634\u0631\u062f\u0647\u200c\u0633\u0627\u0632\u06cc \u0648 \u0630\u062e\u06cc\u0631\u0647 gzip \u0639\u0645\u0644\u06a9\u0631\u062f \u0631\u0627 \u0628\u0647\u0628\u0648\u062f \u0645\u06cc\u200c\u0628\u062e\u0634\u062f.<\/p>\n<h3><span class=\"ez-toc-section\" id=\"%D8%A7%DB%8C%D8%AC%D8%A7%D8%AF_%DB%8C%DA%A9_Dockerfile\"><\/span>\n<p>  \u0627\u06cc\u062c\u0627\u062f \u06cc\u06a9 Dockerfile<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>Dockerfile \u06cc\u06a9 \u0633\u0646\u062f \u0645\u062a\u0646\u06cc \u0627\u0633\u062a \u06a9\u0647 \u0634\u0627\u0645\u0644 \u062a\u0645\u0627\u0645 \u062f\u0633\u062a\u0648\u0631\u0627\u062a \u0645\u0648\u0631\u062f \u0646\u06cc\u0627\u0632 \u0628\u0631\u0627\u06cc \u0633\u0627\u062e\u062a \u06cc\u06a9 \u062a\u0635\u0648\u06cc\u0631 \u062f\u0627\u06a9\u0631 \u0627\u0633\u062a. \u062a\u0635\u0648\u06cc\u0631 \u067e\u0627\u06cc\u0647 \u0628\u0631\u0627\u06cc \u0627\u0633\u062a\u0641\u0627\u062f\u0647\u060c \u062f\u0633\u062a\u0648\u0631\u0627\u062a \u0628\u0631\u0627\u06cc \u0627\u062c\u0631\u0627 \u0648 \u0641\u0627\u06cc\u0644 \u0647\u0627\u06cc\u06cc \u06a9\u0647 \u0628\u0627\u06cc\u062f \u062f\u0631 \u062a\u0635\u0648\u06cc\u0631 \u06a9\u067e\u06cc \u0634\u0648\u0646\u062f \u0631\u0627 \u0645\u0634\u062e\u0635 \u0645\u06cc \u06a9\u0646\u062f. \u062f\u0631 \u0627\u06cc\u0646 \u0631\u0627\u0647\u0646\u0645\u0627\u060c \u06cc\u06a9 Dockerfile \u0628\u0631\u0627\u06cc \u06cc\u06a9 \u0648\u0628 \u0633\u0627\u06cc\u062a docusaurus \u0627\u06cc\u062c\u0627\u062f \u0645\u06cc \u06a9\u0646\u06cc\u0645. \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u062f\u0633\u062a\u0648\u0631\u0627\u062a \u0645\u0648\u0631\u062f \u0646\u06cc\u0627\u0632 \u067e\u0631\u0648\u0698\u0647 \u062e\u0648\u062f \u0631\u0627 \u062c\u0627\u06cc\u06af\u0632\u06cc\u0646 \u06a9\u0646\u06cc\u062f.<\/p>\n<p>\u06cc\u06a9 \u0641\u0627\u06cc\u0644 \u062c\u062f\u06cc\u062f \u062f\u0631 \u0641\u0647\u0631\u0633\u062a \u067e\u0631\u0648\u0698\u0647 \u062e\u0648\u062f \u0628\u0647 \u0646\u0627\u0645 Dockerfile \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f. \u0627\u06cc\u0646 \u0641\u0627\u06cc\u0644 \u0634\u0627\u0645\u0644 \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc \u0628\u0631\u0627\u06cc \u062a\u0635\u0648\u06cc\u0631 Docker \u0634\u0645\u0627 \u062e\u0648\u0627\u0647\u062f \u0628\u0648\u062f. \u062f\u0631 \u0627\u06cc\u0646\u062c\u0627 \u06cc\u06a9 \u0646\u0645\u0648\u0646\u0647 Dockerfile \u0628\u0631\u0627\u06cc \u06cc\u06a9 \u0648\u0628 \u0633\u0627\u06cc\u062a docusaurus \u0622\u0645\u062f\u0647 \u0627\u0633\u062a:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight docker\"><code><span class=\"k\">FROM<\/span><span class=\"w\"> <\/span><span class=\"s\">node:22.11.0-alpine<\/span><span class=\"w\"> <\/span><span class=\"k\">AS<\/span><span class=\"w\"> <\/span><span class=\"s\">builder<\/span>\n\n<span class=\"k\">RUN <\/span>apk add git\n\n<span class=\"k\">USER<\/span><span class=\"s\"> node<\/span>\n\n<span class=\"c\"># Create app directory (with user `node`)<\/span>\n<span class=\"k\">RUN <\/span><span class=\"nb\">mkdir<\/span> <span class=\"nt\">-p<\/span> \/home\/node\/app\n<span class=\"c\"># Set is as cwd<\/span>\n<span class=\"k\">WORKDIR<\/span><span class=\"s\"> \/home\/node\/app<\/span>\n\n<span class=\"c\"># Install app dependencies<\/span>\n<span class=\"c\"># A wildcard is used to ensure both package.json AND package-lock.json are copied<\/span>\n<span class=\"c\"># where available (npm@5+)<\/span>\n<span class=\"k\">COPY<\/span><span class=\"s\"> --chown=node package*.json .\/<\/span>\n\n<span class=\"c\"># Install dependencies<\/span>\n<span class=\"k\">RUN <\/span>npm <span class=\"nb\">install<\/span>\n\n<span class=\"c\"># Bundle app source code<\/span>\n<span class=\"k\">COPY<\/span><span class=\"s\"> --chown=node . .<\/span>\n<span class=\"k\">COPY<\/span><span class=\"s\"> --chown=node .\/.git .\/.git<\/span>\n\n<span class=\"k\">RUN <\/span>npm run build\n\n<span class=\"k\">FROM<\/span><span class=\"s\"> nginx:1.27.0-alpine3.19-slim<\/span>\n\n<span class=\"k\">WORKDIR<\/span><span class=\"s\"> \/etc\/nginx\/conf.d<\/span>\n\n<span class=\"k\">COPY<\/span><span class=\"s\"> --from=builder \/home\/node\/app\/build \/home\/node\/app<\/span>\n\n<span class=\"k\">COPY<\/span><span class=\"s\"> .\/server.nginx .\/default.conf<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0628\u06cc\u0627\u06cc\u06cc\u062f Dockerfile \u0631\u0627 \u062a\u062c\u0632\u06cc\u0647 \u06a9\u0646\u06cc\u0645:<\/p>\n<ul>\n<li>\n<code>FROM node:22.11.0-alpine AS builder<\/code>: \u0627\u06cc\u0646 \u062e\u0637 \u062a\u0635\u0648\u06cc\u0631 \u067e\u0627\u06cc\u0647 \u0628\u0631\u0627\u06cc \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u062f\u0631 \u0645\u0631\u062d\u0644\u0647 \u0633\u0627\u062e\u062a \u0631\u0627 \u0645\u0634\u062e\u0635 \u0645\u06cc \u06a9\u0646\u062f. \u0645\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc \u06a9\u0646\u06cc\u0645 <code>node:22.11.0-alpine<\/code> image\u060c \u06a9\u0647 \u06cc\u06a9 \u0646\u0633\u062e\u0647 \u0633\u0628\u06a9 \u0648\u0632\u0646 \u0627\u0632 Node.js \u0627\u0633\u062a \u06a9\u0647 \u0634\u0627\u0645\u0644 npm \u0627\u0633\u062a.<\/li>\n<li>\n<code>RUN apk add git<\/code>: \u0627\u06cc\u0646 \u062e\u0637 \u0631\u0627 \u0646\u0635\u0628 \u0645\u06cc \u06a9\u0646\u062f <code>git<\/code> \u0628\u0633\u062a\u0647 \u0627\u06cc \u06a9\u0647 \u0628\u0631\u0627\u06cc \u0634\u0628\u06cc\u0647 \u0633\u0627\u0632\u06cc \u0645\u062e\u0632\u0646 \u0645\u0648\u0631\u062f \u0646\u06cc\u0627\u0632 \u0627\u0633\u062a.<\/li>\n<li>\n<code>USER node<\/code>: \u0627\u06cc\u0646 \u062e\u0637 \u0628\u0647 <code>node<\/code> user\u060c \u06a9\u0647 \u06cc\u06a9 \u06a9\u0627\u0631\u0628\u0631 \u063a\u06cc\u0631 \u0631\u06cc\u0634\u0647 \u0627\u0633\u062a \u06a9\u0647 \u062a\u0648\u0633\u0637 \u062a\u0635\u0648\u06cc\u0631 Node.js \u0627\u06cc\u062c\u0627\u062f \u0634\u062f\u0647 \u0627\u0633\u062a.<\/li>\n<li>\n<code>RUN mkdir -p \/home\/node\/app<\/code>: \u0627\u06cc\u0646 \u062e\u0637 \u06cc\u06a9 \u062f\u0627\u06cc\u0631\u06a9\u062a\u0648\u0631\u06cc \u0628\u0631\u0627\u06cc \u06a9\u062f \u0628\u0631\u0646\u0627\u0645\u0647 \u0627\u06cc\u062c\u0627\u062f \u0645\u06cc \u06a9\u0646\u062f.<\/li>\n<li>\n<code>WORKDIR \/home\/node\/app<\/code>: \u0627\u06cc\u0646 \u062e\u0637 \u062f\u0627\u06cc\u0631\u06a9\u062a\u0648\u0631\u06cc \u06a9\u0627\u0631\u06cc \u0631\u0627 \u0631\u0648\u06cc \u062f\u0627\u06cc\u0631\u06a9\u062a\u0648\u0631\u06cc \u0628\u0631\u0646\u0627\u0645\u0647 \u062a\u0646\u0638\u06cc\u0645 \u0645\u06cc \u06a9\u0646\u062f.<\/li>\n<li>\n<code>COPY --chown=node package*.json .<\/code>: \u0627\u06cc\u0646 \u062e\u0637 \u0631\u0627 \u06a9\u067e\u06cc \u0645\u06cc \u06a9\u0646\u062f <code>package.json<\/code> \u0648 <code>package-lock.json<\/code> \u0641\u0627\u06cc\u0644 \u0647\u0627 \u062f\u0631 \u062a\u0635\u0648\u06cc\u0631<\/li>\n<li>\n<code>RUN npm install<\/code>: \u0627\u06cc\u0646 \u062e\u0637 \u0648\u0627\u0628\u0633\u062a\u06af\u06cc \u0647\u0627\u06cc \u0645\u0634\u062e\u0635 \u0634\u062f\u0647 \u062f\u0631 \u0631\u0627 \u0646\u0635\u0628 \u0645\u06cc \u06a9\u0646\u062f <code>package.json<\/code> \u0641\u0627\u06cc\u0644<\/li>\n<li>\n<code>COPY --chown=node . .<\/code>: \u0627\u06cc\u0646 \u062e\u0637 \u06a9\u062f \u0628\u0631\u0646\u0627\u0645\u0647 \u0631\u0627 \u062f\u0631 \u062a\u0635\u0648\u06cc\u0631 \u06a9\u067e\u06cc \u0645\u06cc \u06a9\u0646\u062f.<\/li>\n<li>\n<code>COPY --chown=node .\/.git .\/.git<\/code>: \u0627\u06cc\u0646 \u062e\u0637 \u0631\u0627 \u06a9\u067e\u06cc \u0645\u06cc \u06a9\u0646\u062f <code>.git<\/code> \u062f\u0627\u06cc\u0631\u06a9\u062a\u0648\u0631\u06cc \u062f\u0631 \u062a\u0635\u0648\u06cc\u0631<\/li>\n<li>\n<code>RUN npm run build<\/code>: \u0627\u06cc\u0646 \u062e\u0637 \u0628\u0631\u0646\u0627\u0645\u0647 \u0631\u0627 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 <code>npm run build<\/code> \u0641\u0631\u0645\u0627\u0646<\/li>\n<li>\n<code>FROM nginx:1.27.0-alpine3.19-slim<\/code>: \u0627\u06cc\u0646 \u062e\u0637 \u062a\u0635\u0648\u06cc\u0631 \u067e\u0627\u06cc\u0647 \u0631\u0627 \u0628\u0631\u0627\u06cc \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u062f\u0631 \u062a\u0635\u0648\u06cc\u0631 \u0646\u0647\u0627\u06cc\u06cc \u0645\u0634\u062e\u0635 \u0645\u06cc \u06a9\u0646\u062f. \u0645\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc \u06a9\u0646\u06cc\u0645 <code>nginx:1.27.0-alpine3.19-slim<\/code> \u062a\u0635\u0648\u06cc\u0631\u060c \u06a9\u0647 \u0646\u0633\u062e\u0647 \u0633\u0628\u06a9 \u0648\u0632\u0646 Nginx \u0627\u0633\u062a.<\/li>\n<li>\n<code>WORKDIR \/etc\/nginx\/conf.d<\/code>: \u0627\u06cc\u0646 \u062e\u0637 \u062f\u0627\u06cc\u0631\u06a9\u062a\u0648\u0631\u06cc \u06a9\u0627\u0631\u06cc \u0631\u0627 \u0631\u0648\u06cc \u062f\u0627\u06cc\u0631\u06a9\u062a\u0648\u0631\u06cc \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc Nginx \u062a\u0646\u0638\u06cc\u0645 \u0645\u06cc \u06a9\u0646\u062f.<\/li>\n<li>\n<code>COPY --from=builder \/home\/node\/app\/build \/home\/node\/app<\/code>: \u0627\u06cc\u0646 \u062e\u0637 \u0641\u0627\u06cc\u0644 \u0647\u0627\u06cc \u0627\u0633\u062a\u0627\u062a\u06cc\u06a9 \u062a\u0648\u0644\u06cc\u062f \u0634\u062f\u0647 \u062a\u0648\u0633\u0637 \u0645\u0631\u062d\u0644\u0647 \u0633\u0627\u062e\u062a \u0631\u0627 \u062f\u0631 \u062f\u0627\u06cc\u0631\u06a9\u062a\u0648\u0631\u06cc \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc Nginx \u06a9\u067e\u06cc \u0645\u06cc \u06a9\u0646\u062f.<\/li>\n<li>\n<code>COPY .\/server.nginx .\/default.conf<\/code>: \u0627\u06cc\u0646 \u062e\u0637 \u0631\u0627 \u06a9\u067e\u06cc \u0645\u06cc \u06a9\u0646\u062f <code>server.nginx<\/code> \u0641\u0627\u06cc\u0644 \u0631\u0627 \u062f\u0631 \u062f\u0627\u06cc\u0631\u06a9\u062a\u0648\u0631\u06cc \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc Nginx \u0642\u0631\u0627\u0631 \u062f\u0647\u06cc\u062f.<\/li>\n<\/ul>\n<p>\u0627\u06cc\u0646 Dockerfile \u06cc\u06a9 \u0633\u0627\u062e\u062a \u0686\u0646\u062f \u0645\u0631\u062d\u0644\u0647 \u0627\u06cc \u0627\u06cc\u062c\u0627\u062f \u0645\u06cc \u06a9\u0646\u062f \u06a9\u0647 \u0627\u0628\u062a\u062f\u0627 \u0628\u0631\u0646\u0627\u0645\u0647 \u0631\u0627 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 Node.js \u0645\u06cc \u0633\u0627\u0632\u062f \u0648 \u0633\u067e\u0633 \u0641\u0627\u06cc\u0644 \u0647\u0627\u06cc \u0627\u0633\u062a\u0627\u062a\u06cc\u06a9 \u0631\u0627 \u062f\u0631 \u06cc\u06a9 \u062a\u0635\u0648\u06cc\u0631 Nginx \u06a9\u067e\u06cc \u0645\u06cc \u06a9\u0646\u062f. \u0627\u06cc\u0646 \u0631\u0648\u06cc\u06a9\u0631\u062f \u0628\u0627 \u062c\u062f\u0627\u0633\u0627\u0632\u06cc \u0648\u0627\u0628\u0633\u062a\u06af\u06cc \u0647\u0627\u06cc \u0633\u0627\u062e\u062a \u0627\u0632 \u0648\u0627\u0628\u0633\u062a\u06af\u06cc \u0647\u0627\u06cc \u0632\u0645\u0627\u0646 \u0627\u062c\u0631\u0627\u060c \u0627\u0646\u062f\u0627\u0632\u0647 \u062a\u0635\u0648\u06cc\u0631 \u0646\u0647\u0627\u06cc\u06cc \u0631\u0627 \u06a9\u0627\u0647\u0634 \u0645\u06cc \u062f\u0647\u062f \u0648 \u0639\u0645\u0644\u06a9\u0631\u062f \u0631\u0627 \u0628\u0647\u0628\u0648\u062f \u0645\u06cc \u0628\u062e\u0634\u062f.<\/p>\n<h3><span class=\"ez-toc-section\" id=\"%D8%B3%D8%A7%D8%AE%D8%AA_%D9%88_%D8%A7%D8%AC%D8%B1%D8%A7%DB%8C_%D8%AA%D8%B5%D9%88%DB%8C%D8%B1_Docker_%D8%A8%D9%87_%D8%B5%D9%88%D8%B1%D8%AA_%D9%85%D8%AD%D9%84%DB%8C\"><\/span>\n<p>  \u0633\u0627\u062e\u062a \u0648 \u0627\u062c\u0631\u0627\u06cc \u062a\u0635\u0648\u06cc\u0631 Docker \u0628\u0647 \u0635\u0648\u0631\u062a \u0645\u062d\u0644\u06cc<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u0642\u0628\u0644 \u0627\u0632 \u0627\u0633\u062a\u0642\u0631\u0627\u0631 \u0628\u0631\u0646\u0627\u0645\u0647 \u062e\u0648\u062f \u062f\u0631 \u0633\u0631\u0648\u0631 \u062e\u0648\u062f\u060c \u0628\u0627\u06cc\u062f \u062a\u0635\u0648\u06cc\u0631 Docker \u0631\u0627 \u0628\u0647 \u0635\u0648\u0631\u062a \u0645\u062d\u0644\u06cc \u0622\u0632\u0645\u0627\u06cc\u0634 \u06a9\u0646\u06cc\u062f \u062a\u0627 \u0645\u0637\u0645\u0626\u0646 \u0634\u0648\u06cc\u062f \u06a9\u0647 \u0645\u0637\u0627\u0628\u0642 \u0627\u0646\u062a\u0638\u0627\u0631 \u06a9\u0627\u0631 \u0645\u06cc \u06a9\u0646\u062f. \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u062f\u0633\u062a\u0648\u0631\u0627\u062a \u0632\u06cc\u0631 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u062a\u0635\u0648\u06cc\u0631 Docker \u0631\u0627 \u0628\u0631 \u0631\u0648\u06cc \u0645\u0627\u0634\u06cc\u0646 \u0645\u062d\u0644\u06cc \u062e\u0648\u062f \u0628\u0633\u0627\u0632\u06cc\u062f \u0648 \u0627\u062c\u0631\u0627 \u06a9\u0646\u06cc\u062f:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight shell\"><code>docker build <span class=\"nt\">-t<\/span> my-image <span class=\"nb\">.<\/span>\ndocker run <span class=\"nt\">-p<\/span> 8080:80 my-image\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0631\u0627 <code>docker build<\/code> \u0641\u0631\u0645\u0627\u0646 \u062a\u0635\u0648\u06cc\u0631 \u062f\u0627\u06a9\u0631 \u0631\u0627 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 <code>Dockerfile<\/code> \u062f\u0631 \u062f\u0627\u06cc\u0631\u06a9\u062a\u0648\u0631\u06cc \u0641\u0639\u0644\u06cc \u0648 \u0622\u0646 \u0631\u0627 \u0628\u0627 \u0646\u0627\u0645 \u062a\u06af \u0645\u06cc \u06a9\u0646\u062f <code>my-image<\/code>. \u0631\u0627 <code>docker run<\/code> \u062f\u0633\u062a\u0648\u0631\u060c \u062a\u0635\u0648\u06cc\u0631 Docker \u0631\u0627 \u0631\u0648\u06cc \u067e\u0648\u0631\u062a 8080 \u0627\u062c\u0631\u0627 \u0645\u06cc\u200c\u06a9\u0646\u062f \u0648 \u0622\u0646 \u0631\u0627 \u0628\u0647 \u067e\u0648\u0631\u062a 80 \u062f\u0627\u062e\u0644 \u06a9\u0627\u0646\u062a\u06cc\u0646\u0631 \u0646\u06af\u0627\u0634\u062a \u0645\u06cc\u200c\u06a9\u0646\u062f. \u0628\u0627 \u0628\u0627\u0632 \u06a9\u0631\u062f\u0646 \u06cc\u06a9 \u0645\u0631\u0648\u0631\u06af\u0631 \u0648\u0628 \u0648 \u067e\u06cc\u0645\u0627\u06cc\u0634 \u0628\u0647 \u0628\u0631\u0646\u0627\u0645\u0647 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u0628\u0647 \u0628\u0631\u0646\u0627\u0645\u0647 \u062f\u0633\u062a\u0631\u0633\u06cc \u067e\u06cc\u062f\u0627 \u06a9\u0646\u06cc\u062f <code>http:\/\/localhost:8080<\/code>.<\/p>\n<p>\u0627\u06af\u0631 \u0647\u0645\u0647 \u0686\u06cc\u0632 \u0647\u0645\u0627\u0646\u0637\u0648\u0631 \u06a9\u0647 \u0627\u0646\u062a\u0638\u0627\u0631 \u0645\u06cc \u0631\u0648\u062f \u06a9\u0627\u0631 \u06a9\u0646\u062f\u060c \u0628\u0627\u06cc\u062f \u0646\u0633\u062e\u0647 \u062a\u0648\u0644\u06cc\u062f\u06cc \u0648\u0628 \u0633\u0627\u06cc\u062a docusaurus \u062e\u0648\u062f \u0631\u0627 \u062f\u0631 \u0645\u0631\u0648\u0631\u06af\u0631 \u0645\u0634\u0627\u0647\u062f\u0647 \u06a9\u0646\u06cc\u062f. \u0627\u06a9\u0646\u0648\u0646 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 GitHub Actions \u0648 Nanocl \u0628\u0631\u0646\u0627\u0645\u0647 \u062e\u0648\u062f \u0631\u0627 \u0631\u0648\u06cc \u0633\u0631\u0648\u0631 \u062e\u0648\u062f \u0645\u0633\u062a\u0642\u0631 \u06a9\u0646\u06cc\u062f.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"%D8%B1%D8%A7%D9%87_%D8%A7%D9%86%D8%AF%D8%A7%D8%B2%DB%8C_Nanocl\"><\/span>\n<p>  \u0631\u0627\u0647 \u0627\u0646\u062f\u0627\u0632\u06cc Nanocl<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Nanocl \u0627\u0628\u0632\u0627\u0631 \u0642\u062f\u0631\u062a\u0645\u0646\u062f\u06cc \u0627\u0633\u062a \u06a9\u0647 \u0641\u0631\u0622\u06cc\u0646\u062f \u0627\u0633\u062a\u0642\u0631\u0627\u0631 \u0631\u0627 \u0628\u0627 \u0627\u0631\u0627\u0626\u0647 \u06cc\u06a9 \u0631\u0627\u0628\u0637 \u06cc\u06a9\u067e\u0627\u0631\u0686\u0647 \u0628\u0631\u0627\u06cc \u0645\u062f\u06cc\u0631\u06cc\u062a \u0632\u06cc\u0631\u0633\u0627\u062e\u062a \u0634\u0645\u0627 \u0633\u0627\u062f\u0647 \u0645\u06cc \u06a9\u0646\u062f. \u0634\u0645\u0627 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u0627\u0632 Nanocl \u0628\u0631\u0627\u06cc \u0627\u0633\u062a\u0642\u0631\u0627\u0631 \u0628\u0631\u0646\u0627\u0645\u0647 \u0647\u0627\u06cc \u06a9\u0627\u0631\u0628\u0631\u062f\u06cc \u062e\u0648\u062f \u062f\u0631 \u0633\u0631\u0648\u0631 \u062e\u0648\u062f \u0628\u0627 \u062d\u062f\u0627\u0642\u0644 \u062a\u0644\u0627\u0634 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u062f. \u062f\u0631 \u0627\u06cc\u0646 \u0631\u0627\u0647\u0646\u0645\u0627\u060c \u0645\u0627 \u0628\u0647 \u0634\u0645\u0627 \u0646\u0634\u0627\u0646 \u062e\u0648\u0627\u0647\u06cc\u0645 \u062f\u0627\u062f \u06a9\u0647 \u0686\u06af\u0648\u0646\u0647 Nanocl \u0631\u0627 \u0631\u0648\u06cc \u0633\u0631\u0648\u0631 \u062e\u0648\u062f \u0631\u0627\u0647 \u0627\u0646\u062f\u0627\u0632\u06cc \u06a9\u0646\u06cc\u062f \u0648 \u0628\u0631\u0646\u0627\u0645\u0647 \u062e\u0648\u062f \u0631\u0627 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u06cc\u06a9 \u0641\u0627\u06cc\u0644 \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc \u0633\u0627\u062f\u0647 \u0627\u062c\u0631\u0627 \u06a9\u0646\u06cc\u062f.<\/p>\n<p>\u0627\u0628\u062a\u062f\u0627 \u0628\u0627\u06cc\u062f Nanocl \u0631\u0627 \u0631\u0648\u06cc \u0633\u0631\u0648\u0631 \u062e\u0648\u062f \u0646\u0635\u0628 \u06a9\u0646\u06cc\u062f. \u0634\u0645\u0627 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u062f\u0633\u062a\u0648\u0631\u0627\u0644\u0639\u0645\u0644 \u0646\u0635\u0628 \u0631\u0627 \u062f\u0631 \u0627\u06cc\u0646\u062c\u0627 \u067e\u06cc\u062f\u0627 \u06a9\u0646\u06cc\u062f. \u067e\u0633 \u0627\u0632 \u0646\u0635\u0628 Nanocl\u060c \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u06cc\u06a9 \u0641\u0627\u06cc\u0644 \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc \u0628\u0631\u0627\u06cc \u0628\u0631\u0646\u0627\u0645\u0647 \u062e\u0648\u062f \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f. \u0627\u06cc\u0646 \u0641\u0627\u06cc\u0644 \u0634\u0627\u0645\u0644 \u062a\u0646\u0638\u06cc\u0645\u0627\u062a \u0628\u0631\u0646\u0627\u0645\u0647 \u0634\u0645\u0627 \u0645\u0627\u0646\u0646\u062f \u0646\u0627\u0645 \u062a\u0635\u0648\u06cc\u0631\u060c \u0634\u0645\u0627\u0631\u0647 \u067e\u0648\u0631\u062a \u0648 \u0645\u062a\u063a\u06cc\u0631\u0647\u0627\u06cc \u0645\u062d\u06cc\u0637 \u062e\u0648\u0627\u0647\u062f \u0628\u0648\u062f.<\/p>\n<p>\u0628\u0647 \u0637\u0648\u0631 \u067e\u06cc\u0634 \u0641\u0631\u0636 \u067e\u0633 \u0627\u0632 \u0646\u0635\u0628 Nanocl \u0641\u0642\u0637 \u0627\u0632 \u0637\u0631\u06cc\u0642 \u0642\u0627\u0628\u0644 \u062f\u0633\u062a\u0631\u0633\u06cc \u0627\u0633\u062a <code>\/run\/nanocl\/nanocl.sock<\/code>. \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u06cc\u062f \u0627\u0632 \u06cc\u06a9 \u0642\u0627\u0646\u0648\u0646 \u067e\u0631\u0648\u06a9\u0633\u06cc \u0628\u0631\u0627\u06cc \u0646\u0645\u0627\u06cc\u0634 \u0622\u0646 \u062f\u0631 \u0627\u06cc\u0646\u062a\u0631\u0646\u062a \u0639\u0645\u0648\u0645\u06cc \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u062f\u060c \u0628\u0627 \u0627\u06cc\u0646 \u062d\u0627\u0644\u060c \u062f\u0631 \u0645\u0639\u0631\u0636 \u062f\u06cc\u062f \u0639\u0645\u0648\u0645 \u0642\u0631\u0627\u0631 \u062f\u0627\u062f\u0646 \u0622\u0646 \u0628\u062f\u0648\u0646 \u06af\u0648\u0627\u0647\u06cc SSL\/TLS \u062e\u0648\u062f \u0627\u0645\u0636\u0627 \u0634\u062f\u0647 \u062a\u0648\u0635\u06cc\u0647 \u0646\u0645\u06cc\u200c\u0634\u0648\u062f.<br \/>\u0627\u06cc\u0646 \u0645\u06cc \u062a\u0648\u0627\u0646\u062f \u0628\u0647 \u0645\u0647\u0627\u062c\u0645 \u0627\u062c\u0627\u0632\u0647 \u062f\u0647\u062f \u062a\u0627 \u06a9\u0646\u062a\u0631\u0644 \u0633\u0631\u0648\u0631 \u0634\u0645\u0627 \u0631\u0627 \u062f\u0631 \u062f\u0633\u062a \u0628\u06af\u06cc\u0631\u062f.<br \/>\u0627\u0645\u06cc\u062f\u0648\u0627\u0631\u06cc\u0645\u060c \u0645\u0627 \u06cc\u06a9 \u0642\u0627\u0646\u0648\u0646 \u0627\u0632 \u067e\u06cc\u0634 \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc \u0634\u062f\u0647 \u062f\u0627\u0631\u06cc\u0645 \u06a9\u0647 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u0628\u0631\u0627\u06cc \u0627\u0641\u0634\u0627\u06cc Nanocl Daemon \u0627\u0639\u0645\u0627\u0644 \u06a9\u0646\u06cc\u062f.<\/p>\n<p>\u062f\u0631 \u0633\u0631\u0648\u0631 \u0627\u062e\u062a\u0635\u0627\u0635\u06cc \u06cc\u0627 VPS \u062e\u0648\u062f\u060c \u062f\u0633\u062a\u0648\u0631 \u0632\u06cc\u0631 \u0631\u0627 \u0628\u0631\u0627\u06cc \u0627\u0639\u0645\u0627\u0644 \u0642\u0627\u0646\u0648\u0646 \u0627\u062c\u0631\u0627 \u06a9\u0646\u06cc\u062f:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight shell\"><code>nanocl state apply <span class=\"nt\">-fs<\/span> https:\/\/nhnr.io\/v0.16\/sys\/enable-remote-nanocld.yml\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>Nanocl Daemon \u0631\u0627 \u0628\u0627 \u06af\u0648\u0627\u0647\u06cc SSL\/TLS \u0627\u0645\u0636\u0627 \u0634\u062f\u0647 \u062f\u0631 \u067e\u0648\u0631\u062a 9943 \u062f\u0631 \u0645\u0639\u0631\u0636 \u0627\u06cc\u0646\u062a\u0631\u0646\u062a \u0639\u0645\u0648\u0645\u06cc \u0642\u0631\u0627\u0631 \u0645\u06cc \u062f\u0647\u062f.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"%D8%B1%D8%A7%D9%87_%D8%A7%D9%86%D8%AF%D8%A7%D8%B2%DB%8C_Github_Secrets\"><\/span>\n<p>  \u0631\u0627\u0647 \u0627\u0646\u062f\u0627\u0632\u06cc Github Secrets<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>GitHub Secrets \u0628\u0647 \u0634\u0645\u0627 \u0627\u06cc\u0646 \u0627\u0645\u06a9\u0627\u0646 \u0631\u0627 \u0645\u06cc \u062f\u0647\u062f \u06a9\u0647 \u0628\u0647 \u0637\u0648\u0631 \u0627\u06cc\u0645\u0646 \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u062d\u0633\u0627\u0633 \u0631\u0627 \u062f\u0631 \u0645\u062e\u0632\u0646 GitHub \u062e\u0648\u062f \u0630\u062e\u06cc\u0631\u0647 \u0648 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u062f. \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u0627\u0632 GitHub Secrets \u0628\u0631\u0627\u06cc \u0630\u062e\u06cc\u0631\u0647 \u0627\u0639\u062a\u0628\u0627\u0631 \u0633\u0631\u0648\u0631\u060c \u06a9\u0644\u06cc\u062f\u0647\u0627\u06cc API \u0648 \u0633\u0627\u06cc\u0631 \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u062d\u0633\u0627\u0633 \u0645\u0648\u0631\u062f \u0646\u06cc\u0627\u0632 \u0628\u0631\u0627\u06cc \u0627\u0633\u062a\u0642\u0631\u0627\u0631 \u0628\u0631\u0646\u0627\u0645\u0647 \u062e\u0648\u062f \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u062f. \u062f\u0631 \u0627\u06cc\u0646 \u0631\u0627\u0647\u0646\u0645\u0627\u060c \u0645\u0627 \u0627\u0632 GitHub Secrets \u0628\u0631\u0627\u06cc \u0630\u062e\u06cc\u0631\u0647 \u0627\u0639\u062a\u0628\u0627\u0631 \u0645\u0648\u0631\u062f \u0646\u06cc\u0627\u0632 \u0628\u0631\u0627\u06cc \u0627\u0633\u062a\u0642\u0631\u0627\u0631 \u0628\u0631\u0646\u0627\u0645\u0647 \u0634\u0645\u0627 \u062f\u0631 \u0633\u0631\u0648\u0631\u062a\u0627\u0646 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 Nanocl \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u062e\u0648\u0627\u0647\u06cc\u0645 \u06a9\u0631\u062f.<\/p>\n<p>\u0628\u0631\u0627\u06cc \u0634\u0631\u0648\u0639\u060c \u0628\u0647 \u0645\u062e\u0632\u0646 GitHub \u062e\u0648\u062f \u0628\u0631\u0648\u06cc\u062f \u0648 \u0631\u0648\u06cc \u0622\u0646 \u06a9\u0644\u06cc\u06a9 \u06a9\u0646\u06cc\u062f <code>Settings<\/code> \u0628\u0631\u06af\u0647 \u0633\u067e\u0633\u060c \u0631\u0648\u06cc \u0622\u0646 \u06a9\u0644\u06cc\u06a9 \u06a9\u0646\u06cc\u062f <code>Secrets and variables<\/code> \u067e\u06cc\u0648\u0646\u062f \u062f\u0631 \u0646\u0648\u0627\u0631 \u06a9\u0646\u0627\u0631\u06cc \u0633\u0645\u062a \u0686\u067e \u0628\u0631 \u0631\u0648\u06cc \u06a9\u0644\u06cc\u06a9 \u06a9\u0646\u06cc\u062f <code>Actions<\/code> \u067e\u06cc\u0648\u0646\u062f.<\/p>\n<p>\u0634\u0645\u0627 \u0628\u0627\u06cc\u062f \u0635\u0641\u062d\u0647 \u0627\u06cc \u0645\u0627\u0646\u0646\u062f \u0627\u06cc\u0646 \u0631\u0627 \u0628\u0628\u06cc\u0646\u06cc\u062f:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/media2.dev.to\/dynamic\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzmrsfc58qmuih86sv3sb.png\" alt=\"github-secrets\" loading=\"lazy\" width=\"800\" height=\"343\" title=\"\"><\/p>\n<p>\u0628\u0631 \u0631\u0648\u06cc \u06a9\u0644\u06cc\u06a9 \u06a9\u0646\u06cc\u062f <code>New repository secret<\/code> \u062f\u06a9\u0645\u0647 \u0627\u06cc\u062c\u0627\u062f \u06cc\u06a9 \u0631\u0627\u0632 \u062c\u062f\u06cc\u062f. \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u0628\u0631\u0627\u06cc \u0647\u0631 \u06cc\u06a9 \u0627\u0632 \u0645\u0642\u0627\u062f\u06cc\u0631 \u0632\u06cc\u0631 \u06cc\u06a9 \u0631\u0627\u0632 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f:<\/p>\n<ul>\n<li>\n<code>NANOCL_HOST<\/code>: \u0646\u0627\u0645 \u0645\u06cc\u0632\u0628\u0627\u0646 \u06cc\u0627 \u0622\u062f\u0631\u0633 IP \u0633\u0631\u0648\u0631 \u0634\u0645\u0627 \u0628\u0627 \u067e\u0648\u0631\u062a 9943. \u0645\u062b\u0627\u0644: <code>https:\/\/example.com:9943<\/code>\n<\/li>\n<li>\n<code>NANOCL_CERT<\/code>: \u0645\u062d\u062a\u0648\u0627\u06cc \u06af\u0648\u0627\u0647\u06cc SSL\/TLS \u062e\u0648\u062f \u0627\u0645\u0636\u0627 \u0634\u062f\u0647 \u06a9\u0647 \u0628\u0631\u0627\u06cc \u0627\u06cc\u0645\u0646 \u0633\u0627\u0632\u06cc \u0627\u062a\u0635\u0627\u0644 \u0628\u0647 Nanocl Daemon \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc \u0634\u0648\u062f.<\/li>\n<li>\n<code>NANOCL_CERT_KEY<\/code>: \u0645\u062d\u062a\u0648\u0627\u06cc \u06a9\u0644\u06cc\u062f \u062e\u0635\u0648\u0635\u06cc \u0645\u0648\u0631\u062f \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0628\u0631\u0627\u06cc \u0627\u06cc\u0645\u0646 \u0633\u0627\u0632\u06cc \u0627\u062a\u0635\u0627\u0644 \u0628\u0647 Nanocl Daemon.<\/li>\n<\/ul>\n<p>\u0628\u0627 \u0627\u062c\u0631\u0627\u06cc \u062f\u0633\u062a\u0648\u0631\u0627\u062a \u0632\u06cc\u0631 \u062f\u0631 \u0633\u0631\u0648\u0631 \u062e\u0648\u062f \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u0645\u062d\u062a\u0648\u0627\u06cc \u06af\u0648\u0627\u0647\u06cc \u0648 \u06a9\u0644\u06cc\u062f \u062e\u0635\u0648\u0635\u06cc \u0631\u0627 \u067e\u06cc\u062f\u0627 \u06a9\u0646\u06cc\u062f:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight shell\"><code>nanocl secret inspect cert.client.nanocl.io\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0627\u06cc\u0646 \u062f\u0633\u062a\u0648\u0631 \u0645\u062d\u062a\u0648\u0627\u06cc \u06af\u0648\u0627\u0647\u06cc \u0648 \u06a9\u0644\u06cc\u062f \u062e\u0635\u0648\u0635\u06cc \u0631\u0627 \u062e\u0631\u0648\u062c\u06cc \u0645\u06cc \u062f\u0647\u062f. \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u0645\u062d\u062a\u0648\u0627 \u0631\u0627 \u062f\u0631 \u0635\u0641\u062d\u0647 Secrets GitHub \u06a9\u067e\u06cc \u0648 \u062c\u0627\u06cc\u06af\u0630\u0627\u0631\u06cc \u06a9\u0646\u06cc\u062f.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"%D8%A7%DB%8C%D8%AC%D8%A7%D8%AF_%DB%8C%DA%A9_%D9%BE%DB%8C%DA%A9%D8%B1%D8%A8%D9%86%D8%AF%DB%8C_Statefile\"><\/span>\n<p>  \u0627\u06cc\u062c\u0627\u062f \u06cc\u06a9 \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc Statefile<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Statefile \u06cc\u06a9 \u0641\u0627\u06cc\u0644 \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc \u0627\u0633\u062a \u06a9\u0647 \u0634\u0627\u0645\u0644 \u062a\u0646\u0638\u06cc\u0645\u0627\u062a \u0628\u0631\u0646\u0627\u0645\u0647 \u0634\u0645\u0627 \u0627\u0633\u062a. \u0646\u0627\u0645 \u062a\u0635\u0648\u06cc\u0631\u060c \u0634\u0645\u0627\u0631\u0647 \u067e\u0648\u0631\u062a \u0648 \u0645\u062a\u063a\u06cc\u0631\u0647\u0627\u06cc \u0645\u062d\u06cc\u0637\u06cc \u0645\u0648\u0631\u062f \u0646\u06cc\u0627\u0632 \u0628\u0631\u0627\u06cc \u0627\u0633\u062a\u0642\u0631\u0627\u0631 \u0628\u0631\u0646\u0627\u0645\u0647 \u0634\u0645\u0627 \u0631\u0627 \u0645\u0634\u062e\u0635 \u0645\u06cc \u06a9\u0646\u062f. \u0634\u0645\u0627 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u06cc\u06a9 Statefile \u0628\u0631\u0627\u06cc \u0628\u0631\u0646\u0627\u0645\u0647 \u062e\u0648\u062f \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f \u0648 \u0627\u0632 \u0622\u0646 \u0628\u0631\u0627\u06cc \u0627\u0633\u062a\u0642\u0631\u0627\u0631 \u0628\u0631\u0646\u0627\u0645\u0647 \u062e\u0648\u062f \u062f\u0631 \u0633\u0631\u0648\u0631 \u062e\u0648\u062f \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 Nanocl \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u062f.<br \/>\u0627\u06cc\u0646 Statefile \u0627\u0633\u062a \u06a9\u0647 \u0645\u0646 \u0628\u0631\u0627\u06cc \u0627\u0633\u062a\u0642\u0631\u0627\u0631 \u0645\u0633\u062a\u0646\u062f\u0627\u062a \u0628\u0639\u062f\u06cc \u06a9\u0644\u0627\u0647 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc \u06a9\u0646\u0645:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight yaml\"><code><span class=\"na\">ApiVersion<\/span><span class=\"pi\">:<\/span> <span class=\"s\">v0.16<\/span>\n\n<span class=\"na\">Args<\/span><span class=\"pi\">:<\/span>\n<span class=\"pi\">-<\/span> <span class=\"na\">Name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">version<\/span>\n  <span class=\"na\">Kind<\/span><span class=\"pi\">:<\/span> <span class=\"s\">String<\/span>\n\n<span class=\"na\">Cargoes<\/span><span class=\"pi\">:<\/span>\n<span class=\"pi\">-<\/span> <span class=\"na\">Name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">nh-doc<\/span>\n  <span class=\"na\">Container<\/span><span class=\"pi\">:<\/span>\n    <span class=\"na\">Image<\/span><span class=\"pi\">:<\/span> <span class=\"s\">ghcr.io\/next-hat\/documentation:${{ Args.version }}<\/span>\n\n<span class=\"na\">Resources<\/span><span class=\"pi\">:<\/span>\n<span class=\"pi\">-<\/span> <span class=\"na\">Name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">http.docs.next-hat.com<\/span>\n  <span class=\"na\">Kind<\/span><span class=\"pi\">:<\/span> <span class=\"s\">ncproxy.io\/rule<\/span>\n  <span class=\"na\">Data<\/span><span class=\"pi\">:<\/span>\n    <span class=\"na\">Rules<\/span><span class=\"pi\">:<\/span>\n    <span class=\"pi\">-<\/span> <span class=\"na\">Domain<\/span><span class=\"pi\">:<\/span> <span class=\"s\">docs.next-hat.com<\/span>\n      <span class=\"na\">Network<\/span><span class=\"pi\">:<\/span> <span class=\"s\">Public<\/span>\n      <span class=\"c1\"># Secret created for the certbot job below<\/span>\n      <span class=\"c1\"># You can remove this line if you don't want https<\/span>\n      <span class=\"na\">Ssl<\/span><span class=\"pi\">:<\/span> <span class=\"s\">cert.docs.next-hat.com<\/span>\n      <span class=\"na\">Locations<\/span><span class=\"pi\">:<\/span>\n      <span class=\"pi\">-<\/span> <span class=\"na\">Path<\/span><span class=\"pi\">:<\/span> <span class=\"s\">\/<\/span>\n        <span class=\"na\">Target<\/span><span class=\"pi\">:<\/span>\n          <span class=\"na\">Key<\/span><span class=\"pi\">:<\/span> <span class=\"s\">nh-doc.global.c<\/span>\n          <span class=\"na\">Port<\/span><span class=\"pi\">:<\/span> <span class=\"m\">80<\/span>\n    <span class=\"pi\">-<\/span> <span class=\"na\">Domain<\/span><span class=\"pi\">:<\/span> <span class=\"s\">docs.next-hat.com<\/span>\n      <span class=\"na\">Network<\/span><span class=\"pi\">:<\/span> <span class=\"s\">Public<\/span>\n      <span class=\"na\">Locations<\/span><span class=\"pi\">:<\/span>\n      <span class=\"pi\">-<\/span> <span class=\"na\">Path<\/span><span class=\"pi\">:<\/span> <span class=\"s\">\/<\/span>\n        <span class=\"na\">Target<\/span><span class=\"pi\">:<\/span>\n          <span class=\"na\">Url<\/span><span class=\"pi\">:<\/span> <span class=\"s\">https:\/\/docs.next-hat.com<\/span>\n          <span class=\"na\">Redirect<\/span><span class=\"pi\">:<\/span> <span class=\"s\">Temporary<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0627\u06cc\u0646 Statefile \u0628\u0627\u06cc\u062f \u062f\u0631 \u0631\u06cc\u0634\u0647 \u062f\u0627\u06cc\u0631\u06a9\u062a\u0648\u0631\u06cc \u067e\u0631\u0648\u0698\u0647 \u0634\u0645\u0627 \u0642\u0631\u0627\u0631 \u06af\u06cc\u0631\u062f.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"%D8%B1%D8%A7%D9%87_%D8%A7%D9%86%D8%AF%D8%A7%D8%B2%DB%8C_GitHub_Actions\"><\/span>\n<p>  \u0631\u0627\u0647 \u0627\u0646\u062f\u0627\u0632\u06cc GitHub Actions<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>GitHub Actions \u0628\u0647 \u0634\u0645\u0627 \u0627\u0645\u06a9\u0627\u0646 \u0645\u06cc \u062f\u0647\u062f \u06af\u0631\u062f\u0634 \u06a9\u0627\u0631 \u062e\u0648\u062f \u0631\u0627 \u0645\u0633\u062a\u0642\u06cc\u0645\u0627\u064b \u0627\u0632 \u0645\u062e\u0632\u0646 GitHub \u062e\u0648\u062f \u062e\u0648\u062f\u06a9\u0627\u0631 \u06a9\u0646\u06cc\u062f. \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u06cc\u062f \u06af\u0631\u062f\u0634\u200c\u0647\u0627\u06cc \u06a9\u0627\u0631\u06cc \u0633\u0641\u0627\u0631\u0634\u06cc \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f \u06a9\u0647 \u0631\u0648\u06cc \u0631\u0648\u06cc\u062f\u0627\u062f\u0647\u0627\u06cc \u062e\u0627\u0635 \u0627\u062c\u0631\u0627 \u0634\u0648\u0646\u062f\u060c \u0645\u0627\u0646\u0646\u062f \u0641\u0634\u0627\u0631 \u062f\u0627\u062f\u0646 \u06a9\u062f \u0628\u0647 \u0645\u062e\u0632\u0646 \u06cc\u0627 \u0627\u06cc\u062c\u0627\u062f \u06cc\u06a9 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u06a9\u0634\u0634. \u062f\u0631 \u0627\u06cc\u0646 \u0631\u0627\u0647\u0646\u0645\u0627\u060c \u0645\u0627 \u06cc\u06a9 \u06af\u0631\u062f\u0634 \u06a9\u0627\u0631\u06cc \u0627\u06cc\u062c\u0627\u062f \u0645\u06cc \u06a9\u0646\u06cc\u0645 \u06a9\u0647 \u0628\u0631\u0646\u0627\u0645\u0647 \u0634\u0645\u0627 \u0631\u0627 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 Nanocl \u0628\u0631 \u0631\u0648\u06cc \u0633\u0631\u0648\u0631 \u0634\u0645\u0627 \u0645\u06cc \u0633\u0627\u0632\u062f.<br \/>\u06a9\u062f \u0645\u0646\u0628\u0639 \u06a9\u0627\u0645\u0644 \u0631\u0627 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u062f\u0631 \u0627\u06cc\u0646\u062c\u0627 \u0628\u06cc\u0627\u0628\u06cc\u062f<\/p>\n<h3><span class=\"ez-toc-section\" id=\"%D8%B3%D8%A7%D8%AE%D8%AA_%D9%88_%D8%A7%D9%86%D8%AA%D8%B4%D8%A7%D8%B1_%D8%AA%D8%B5%D9%88%DB%8C%D8%B1_%D8%AF%D8%A7%DA%A9%D8%B1\"><\/span>\n<p>  \u0633\u0627\u062e\u062a \u0648 \u0627\u0646\u062a\u0634\u0627\u0631 \u062a\u0635\u0648\u06cc\u0631 \u062f\u0627\u06a9\u0631<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u0628\u0631\u0627\u06cc \u0634\u0631\u0648\u0639\u060c \u06cc\u06a9 \u0641\u0627\u06cc\u0644 \u062c\u062f\u06cc\u062f \u062f\u0631 \u0645\u062e\u0632\u0646 \u062e\u0648\u062f \u0628\u0647 \u0646\u0627\u0645 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f <code>.github\/workflows\/build-and-publish.yml<\/code>. \u0627\u06cc\u0646 \u0641\u0627\u06cc\u0644 \u0634\u0627\u0645\u0644 \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc \u0628\u0631\u0627\u06cc \u06af\u0631\u062f\u0634 \u06a9\u0627\u0631 GitHub Actions \u0634\u0645\u0627 \u062e\u0648\u0627\u0647\u062f \u0628\u0648\u062f. \u0648 \u0628\u0631\u0627\u06cc \u0633\u0627\u062e\u062a \u062a\u0635\u0648\u06cc\u0631 docker \u0634\u0645\u0627 \u0648 \u0627\u0646\u062a\u0634\u0627\u0631 \u0622\u0646 \u062f\u0631 \u0631\u062c\u06cc\u0633\u062a\u0631\u06cc \u06a9\u0627\u0646\u062a\u06cc\u0646\u0631 github \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u062e\u0648\u0627\u0647\u062f \u0634\u062f. \u0641\u0642\u0637 \u0632\u0645\u0627\u0646\u06cc \u06a9\u0647 \u062f\u0631 \u062d\u0627\u0644 \u0627\u062f\u063a\u0627\u0645 \u0628\u0647 \u0634\u0627\u062e\u0647 \u0627\u0635\u0644\u06cc \u0647\u0633\u062a\u06cc\u0645.<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight yaml\"><code><span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">Build and publish docker image<\/span>\n\n<span class=\"na\">on<\/span><span class=\"pi\">:<\/span>\n  <span class=\"na\">push<\/span><span class=\"pi\">:<\/span>\n    <span class=\"na\">branches<\/span><span class=\"pi\">:<\/span>\n      <span class=\"pi\">-<\/span> <span class=\"s\">master<\/span>\n\n<span class=\"na\">jobs<\/span><span class=\"pi\">:<\/span>\n  <span class=\"na\">deploy<\/span><span class=\"pi\">:<\/span>\n    <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">Build and publish docker image<\/span>\n    <span class=\"na\">runs-on<\/span><span class=\"pi\">:<\/span> <span class=\"s\">ubuntu-latest<\/span>\n    <span class=\"na\">steps<\/span><span class=\"pi\">:<\/span>\n      <span class=\"pi\">-<\/span> <span class=\"na\">uses<\/span><span class=\"pi\">:<\/span> <span class=\"s\">actions\/checkout@v3<\/span>\n\n      <span class=\"pi\">-<\/span> <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">Set up Docker Buildx<\/span>\n        <span class=\"na\">uses<\/span><span class=\"pi\">:<\/span> <span class=\"s\">docker\/setup-buildx-action@v2<\/span>\n\n      <span class=\"pi\">-<\/span> <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">Log in to GitHub Container Registry<\/span>\n        <span class=\"na\">uses<\/span><span class=\"pi\">:<\/span> <span class=\"s\">docker\/login-action@v2<\/span>\n        <span class=\"na\">with<\/span><span class=\"pi\">:<\/span>\n          <span class=\"na\">registry<\/span><span class=\"pi\">:<\/span> <span class=\"s\">ghcr.io<\/span>\n          <span class=\"na\">username<\/span><span class=\"pi\">:<\/span> <span class=\"s\">${{ github.repository_owner }}<\/span>\n          <span class=\"na\">password<\/span><span class=\"pi\">:<\/span> <span class=\"s\">${{ secrets.GITHUB_TOKEN }}<\/span>\n\n      <span class=\"pi\">-<\/span> <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">Extract version from package.json<\/span>\n        <span class=\"na\">id<\/span><span class=\"pi\">:<\/span> <span class=\"s\">extract_version<\/span>\n        <span class=\"na\">run<\/span><span class=\"pi\">:<\/span> <span class=\"pi\">|<\/span>\n          <span class=\"s\">version=$(jq -r '.version' package.json)<\/span>\n          <span class=\"s\">echo \"PACKAGE_VERSION=$version\" &gt;&gt; $GITHUB_ENV<\/span>\n\n      <span class=\"pi\">-<\/span> <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">Check if version already exists<\/span>\n        <span class=\"na\">id<\/span><span class=\"pi\">:<\/span> <span class=\"s\">check_version<\/span>\n        <span class=\"na\">run<\/span><span class=\"pi\">:<\/span> <span class=\"pi\">|<\/span>\n          <span class=\"s\">VERSION=${{ env.PACKAGE_VERSION }}<\/span>\n          <span class=\"s\">IMAGE_NAME=ghcr.io\/${{ github.repository_owner }}\/my-image<\/span>\n          <span class=\"s\">if docker manifest inspect $IMAGE_NAME:$VERSION &gt; \/dev\/null 2&gt;&amp;1; then<\/span>\n            <span class=\"s\">echo \"Version $VERSION already exists.\"<\/span>\n            <span class=\"s\">exit 1<\/span>\n          <span class=\"s\">fi<\/span>\n        <span class=\"na\">env<\/span><span class=\"pi\">:<\/span>\n          <span class=\"na\">GITHUB_TOKEN<\/span><span class=\"pi\">:<\/span> <span class=\"s\">${{ secrets.GITHUB_TOKEN }}<\/span>\n\n      <span class=\"pi\">-<\/span> <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">Build and push Docker image<\/span>\n        <span class=\"na\">uses<\/span><span class=\"pi\">:<\/span> <span class=\"s\">docker\/build-push-action@v4<\/span>\n        <span class=\"na\">with<\/span><span class=\"pi\">:<\/span>\n          <span class=\"na\">context<\/span><span class=\"pi\">:<\/span> <span class=\"s\">.<\/span>\n          <span class=\"na\">push<\/span><span class=\"pi\">:<\/span> <span class=\"kc\">true<\/span>\n          <span class=\"na\">tags<\/span><span class=\"pi\">:<\/span> <span class=\"pi\">|<\/span>\n            <span class=\"s\">ghcr.io\/${{ github.repository_owner }}\/documentation:latest<\/span>\n            <span class=\"s\">ghcr.io\/${{ github.repository_owner }}\/documentation:${{ env.PACKAGE_VERSION }}<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0647\u0631 \u0628\u0627\u0631 \u06a9\u0647 \u06a9\u062f\u0647\u0627 \u0631\u0627 \u062f\u0631 \u0634\u0627\u062e\u0647 \u0627\u0635\u0644\u06cc \u0645\u062e\u0632\u0646 \u062e\u0648\u062f \u0627\u062f\u063a\u0627\u0645 \u0645\u06cc \u06a9\u0646\u06cc\u062f\u060c \u0627\u06cc\u0646 \u06af\u0631\u062f\u0634 \u06a9\u0627\u0631 \u0627\u062c\u0631\u0627 \u0645\u06cc \u0634\u0648\u062f. \u0627\u06cc\u0646 \u06cc\u06a9 \u062a\u0635\u0648\u06cc\u0631 \u062f\u0627\u06a9\u0631 \u0627\u0632 \u06a9\u062f \u0634\u0645\u0627 \u0645\u06cc \u0633\u0627\u0632\u062f\u060c \u0622\u0646 \u0631\u0627 \u0628\u0627 \u0622\u062e\u0631\u06cc\u0646 \u0646\u0633\u062e\u0647 \u0627\u0632 \u06a9\u062f \u0634\u0645\u0627 \u062a\u06af \u0645\u06cc \u06a9\u0646\u062f <code>package.json<\/code> \u0641\u0627\u06cc\u0644\u060c \u0648 \u0622\u0646 \u0631\u0627 \u0628\u0647 \u0631\u062c\u06cc\u0633\u062a\u0631\u06cc \u0638\u0631\u0641 GitHub \u0641\u0634\u0627\u0631 \u062f\u0647\u06cc\u062f. \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u062c\u0627\u06cc\u06af\u0632\u06cc\u0646 \u06a9\u0646\u06cc\u062f <code>documentation<\/code> \u0628\u0627 \u0646\u0627\u0645 \u062a\u0635\u0648\u06cc\u0631 \u0634\u0645\u0627<\/p>\n<h3><span class=\"ez-toc-section\" id=\"%D8%A7%D8%B3%D8%AA%D9%82%D8%B1%D8%A7%D8%B1_%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87_%D8%A8%D8%A7_Nanocl\"><\/span>\n<p>  \u0627\u0633\u062a\u0642\u0631\u0627\u0631 \u0628\u0631\u0646\u0627\u0645\u0647 \u0628\u0627 Nanocl<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u0633\u067e\u0633 \u06cc\u06a9 \u0641\u0627\u06cc\u0644 \u062c\u062f\u06cc\u062f \u062f\u0631 \u0645\u062e\u0632\u0646 \u062e\u0648\u062f \u0628\u0647 \u0646\u0627\u0645 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f <code>.github\/workflows\/deploy.yml<\/code>. \u0627\u06cc\u0646 \u0641\u0627\u06cc\u0644 \u0634\u0627\u0645\u0644 \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc \u0628\u0631\u0627\u06cc \u06af\u0631\u062f\u0634 \u06a9\u0627\u0631 GitHub Actions \u0634\u0645\u0627 \u062e\u0648\u0627\u0647\u062f \u0628\u0648\u062f. \u0648 \u0628\u0631\u0627\u06cc \u0627\u0633\u062a\u0642\u0631\u0627\u0631 \u0628\u0631\u0646\u0627\u0645\u0647 \u0634\u0645\u0627 \u0631\u0648\u06cc \u0633\u0631\u0648\u0631 \u0634\u0645\u0627 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 Nanocl \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u062e\u0648\u0627\u0647\u062f \u0634\u062f.<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight yaml\"><code><span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">Deploy<\/span>\n\n<span class=\"na\">on<\/span><span class=\"pi\">:<\/span>\n  <span class=\"na\">workflow_run<\/span><span class=\"pi\">:<\/span>\n    <span class=\"na\">workflows<\/span><span class=\"pi\">:<\/span> <span class=\"pi\">[<\/span><span class=\"s2\">\"<\/span><span class=\"s\">Build<\/span><span class=\"nv\"> <\/span><span class=\"s\">and<\/span><span class=\"nv\"> <\/span><span class=\"s\">publish<\/span><span class=\"nv\"> <\/span><span class=\"s\">Docker<\/span><span class=\"nv\"> <\/span><span class=\"s\">image\"<\/span><span class=\"pi\">]<\/span>\n    <span class=\"na\">types<\/span><span class=\"pi\">:<\/span>\n      <span class=\"pi\">-<\/span> <span class=\"s\">completed<\/span>\n\n<span class=\"na\">jobs<\/span><span class=\"pi\">:<\/span>\n  <span class=\"na\">deploy<\/span><span class=\"pi\">:<\/span>\n    <span class=\"na\">runs-on<\/span><span class=\"pi\">:<\/span> <span class=\"s\">ubuntu-latest<\/span>\n\n    <span class=\"na\">steps<\/span><span class=\"pi\">:<\/span>\n    <span class=\"pi\">-<\/span> <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">Checkout repository<\/span>\n      <span class=\"na\">uses<\/span><span class=\"pi\">:<\/span> <span class=\"s\">actions\/checkout@v3<\/span>\n\n    <span class=\"pi\">-<\/span> <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">Install nanocl cli<\/span>\n      <span class=\"na\">run<\/span><span class=\"pi\">:<\/span> <span class=\"pi\">|<\/span>\n        <span class=\"s\">wget https:\/\/github.com\/next-hat\/nanocl\/releases\/download\/nanocl-0.16.2\/nanocl_0.16.2_amd64.deb<\/span>\n        <span class=\"s\">sudo dpkg -i nanocl_0.16.1_amd64.deb<\/span>\n        <span class=\"s\">rm nanocl_0.16.1_amd64.deb<\/span>\n\n    <span class=\"pi\">-<\/span> <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">Deploy to production<\/span>\n      <span class=\"na\">run<\/span><span class=\"pi\">:<\/span> <span class=\"pi\">|<\/span>\n        <span class=\"s\">VERSION=$(jq -r '.version' package.json)<\/span>\n        <span class=\"s\">nanocl version<\/span>\n        <span class=\"s\">echo $VERSION<\/span>\n        <span class=\"s\">nanocl state apply -ys Statefile.yml -- --version $VERSION<\/span>\n      <span class=\"na\">env<\/span><span class=\"pi\">:<\/span>\n        <span class=\"na\">HOST<\/span><span class=\"pi\">:<\/span> <span class=\"s\">${{ secrets.NANOCL_HOST }}<\/span>\n        <span class=\"na\">CERT<\/span><span class=\"pi\">:<\/span> <span class=\"s\">${{ secrets.NANOCL_CERT }}<\/span>\n        <span class=\"na\">CERT_KEY<\/span><span class=\"pi\">:<\/span> <span class=\"s\">${{ secrets.NANOCL_CERT_KEY }}<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0627\u06cc\u0646 \u06af\u0631\u062f\u0634 \u06a9\u0627\u0631 \u0647\u0631 \u0628\u0627\u0631 \u0627\u062c\u0631\u0627 \u0645\u06cc \u0634\u0648\u062f <code>Build and publish Docker image<\/code> \u06af\u0631\u062f\u0634 \u06a9\u0627\u0631 \u062a\u06a9\u0645\u06cc\u0644 \u0634\u062f\u0647 \u0627\u0633\u062a. \u0628\u0631\u0646\u0627\u0645\u0647 \u0634\u0645\u0627 \u0631\u0627 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 Nanocl \u0631\u0648\u06cc \u0633\u0631\u0648\u0631 \u0634\u0645\u0627 \u0645\u0633\u062a\u0642\u0631 \u0645\u06cc \u06a9\u0646\u062f. \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u062c\u0627\u06cc\u06af\u0632\u06cc\u0646 \u06a9\u0646\u06cc\u062f <code>Statefile.yml<\/code> \u0628\u0627 \u0645\u0633\u06cc\u0631 \u0641\u0627\u06cc\u0644 \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc Statefile \u0627\u06af\u0631 \u0646\u0627\u0645 \u0645\u0633\u06cc\u0631 \u062f\u06cc\u06af\u0631\u06cc \u062f\u0627\u0631\u06cc\u062f.<\/p>\n<p>\u0627\u06a9\u0646\u0648\u0646 \u0634\u0645\u0627 \u062e\u0637 \u0644\u0648\u0644\u0647 CI\/CD \u062e\u0648\u062f \u0631\u0627 \u0628\u0627 GitHub Actions \u0648 Nanocl \u0631\u0627\u0647 \u0627\u0646\u062f\u0627\u0632\u06cc \u06a9\u0631\u062f\u0647 \u0627\u06cc\u062f. \u0647\u0631 \u0628\u0627\u0631 \u06a9\u0647 \u06a9\u062f \u0631\u0627 \u0628\u0647 \u0645\u062e\u0632\u0646 \u062e\u0648\u062f \u0641\u0634\u0627\u0631 \u0645\u06cc \u062f\u0647\u06cc\u062f\u060c GitHub Actions \u062a\u0635\u0648\u06cc\u0631 Docker \u0634\u0645\u0627 \u0631\u0627 \u062f\u0631 \u0631\u062c\u06cc\u0633\u062a\u0631\u06cc \u06a9\u0627\u0646\u062a\u06cc\u0646\u0631 GitHub \u0645\u06cc \u0633\u0627\u0632\u062f \u0648 \u0645\u0646\u062a\u0634\u0631 \u0645\u06cc \u06a9\u0646\u062f. \u0647\u0646\u06af\u0627\u0645\u06cc \u06a9\u0647 \u062a\u0635\u0648\u06cc\u0631 \u0645\u0646\u062a\u0634\u0631 \u0634\u062f\u060c \u06af\u0631\u062f\u0634 \u06a9\u0627\u0631 \u0627\u0633\u062a\u0642\u0631\u0627\u0631 \u0631\u0627 \u0622\u063a\u0627\u0632 \u0645\u06cc \u06a9\u0646\u062f\u060c \u06a9\u0647 \u0628\u0631\u0646\u0627\u0645\u0647 \u0634\u0645\u0627 \u0631\u0627 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 Nanocl \u062f\u0631 \u0633\u0631\u0648\u0631 \u0634\u0645\u0627 \u0645\u0633\u062a\u0642\u0631 \u0645\u06cc \u06a9\u0646\u062f.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"SSLTLS_%D8%B9%D9%85%D9%88%D9%85%DB%8C_%D8%B1%D8%A7_%D8%A8%D8%A7_Lets_Encrypt_%D9%81%D8%B9%D8%A7%D9%84_%DA%A9%D9%86%DB%8C%D8%AF\"><\/span>\n<p>  SSL\/TLS \u0639\u0645\u0648\u0645\u06cc \u0631\u0627 \u0628\u0627 Let&#39;s Encrypt \u0641\u0639\u0627\u0644 \u06a9\u0646\u06cc\u062f<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u0639\u0644\u0627\u0648\u0647 \u0628\u0631 \u0627\u06cc\u0646\u060c \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f SSL\/TLS \u0639\u0645\u0648\u0645\u06cc \u0631\u0627 \u0628\u0627 Let&#39;s Encrypt \u0641\u0639\u0627\u0644 \u06a9\u0646\u06cc\u062f. \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u0627\u0632 \u062f\u0633\u062a\u0648\u0631 \u0632\u06cc\u0631 \u0628\u0631\u0627\u06cc \u0641\u0639\u0627\u0644 \u06a9\u0631\u062f\u0646 SSL\/TLS \u0639\u0645\u0648\u0645\u06cc \u0628\u0627 Let&#39;s Encrypt \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u062f:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight shell\"><code>nanocl state apply <span class=\"nt\">-fs<\/span> https:\/\/nhnr.io\/v0.16\/sys\/certbot.yml <span class=\"nt\">--<\/span> <span class=\"nt\">--email<\/span> contact@next-hat.com <span class=\"nt\">--domain<\/span> docs.next-hat.com\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<h2><span class=\"ez-toc-section\" id=\"%D9%86%D8%AA%DB%8C%D8%AC%D9%87_%DA%AF%DB%8C%D8%B1%DB%8C\"><\/span>\n<p>  \u0646\u062a\u06cc\u062c\u0647 \u06af\u06cc\u0631\u06cc<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u0628\u0627 \u062f\u0646\u0628\u0627\u0644 \u06a9\u0631\u062f\u0646 \u0645\u0631\u0627\u062d\u0644 \u0630\u06a9\u0631 \u0634\u062f\u0647 \u062f\u0631 \u0627\u06cc\u0646 \u0631\u0627\u0647\u0646\u0645\u0627\u060c \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u06cc\u062f \u0628\u0627 \u06a9\u0645\u062a\u0631\u06cc\u0646 \u062a\u0644\u0627\u0634 \u0648 \u0628\u062f\u0648\u0646 \u062a\u0648\u0642\u0641\u060c \u0627\u0633\u062a\u0642\u0631\u0627\u0631 \u0628\u0631\u0646\u0627\u0645\u0647\u200c\u0647\u0627\u06cc \u062e\u0648\u062f \u0631\u0627 \u0628\u0647 \u0633\u0631\u0648\u0631 \u062e\u0648\u062f \u0628\u0647 \u0637\u0648\u0631 \u062e\u0648\u062f\u06a9\u0627\u0631 \u0627\u0646\u062c\u0627\u0645 \u062f\u0647\u06cc\u062f. \u0627\u06cc\u0646 \u0628\u0647 \u0634\u0645\u0627 \u06a9\u0645\u06a9 \u0645\u06cc\u200c\u06a9\u0646\u062f \u0646\u0631\u0645\u200c\u0627\u0641\u0632\u0627\u0631 \u0628\u0627 \u06a9\u06cc\u0641\u06cc\u062a \u0628\u0627\u0644\u0627 \u0631\u0627 \u0628\u0647 \u0633\u0631\u0639\u062a \u0648 \u06a9\u0627\u0631\u0622\u0645\u062f \u0627\u0631\u0627\u0626\u0647 \u062f\u0647\u06cc\u062f \u0648 \u0645\u062f\u06cc\u0631\u06cc\u062a \u0632\u06cc\u0631\u0633\u0627\u062e\u062a\u200c\u0647\u0627 \u0648 \u0627\u0633\u062a\u0642\u0631\u0627\u0631 \u0628\u0631\u0646\u0627\u0645\u0647\u200c\u0647\u0627\u06cc \u062e\u0648\u062f \u0631\u0627 \u0628\u0627 \u0627\u0637\u0645\u06cc\u0646\u0627\u0646 \u0622\u0633\u0627\u0646\u200c\u062a\u0631 \u0645\u06cc\u200c\u06a9\u0646\u062f.<\/p>\n<p>\u0627\u06a9\u0646\u0648\u0646 \u06a9\u0647 \u0645\u06cc \u062f\u0627\u0646\u06cc\u062f \u0686\u06af\u0648\u0646\u0647 \u0627\u0633\u062a\u0642\u0631\u0627\u0631 \u062e\u0648\u062f \u0631\u0627 \u0628\u0627 GitHub Actions \u0648 Nanocl \u062e\u0648\u062f\u06a9\u0627\u0631 \u06a9\u0646\u06cc\u062f\u060c \u0686\u0631\u0627 \u0622\u0646 \u0631\u0627 \u0628\u0627 \u067e\u0631\u0648\u0698\u0647 \u062e\u0648\u062f \u0627\u0645\u062a\u062d\u0627\u0646 \u0646\u06a9\u0646\u06cc\u062f\u061f \u0628\u0647 \u0645\u0627 \u0627\u0637\u0644\u0627\u0639 \u062f\u0647\u06cc\u062f \u06a9\u0647 \u0686\u06af\u0648\u0646\u0647 \u067e\u06cc\u0634 \u0645\u06cc \u0631\u0648\u062f \u06cc\u0627 \u0627\u06af\u0631 \u0633\u0648\u0627\u0644\u06cc \u062f\u0627\u0631\u06cc\u062f!<\/p>\n<p>\u0627\u06af\u0631 \u0633\u0624\u0627\u0644\u06cc \u062f\u0627\u0631\u06cc\u062f \u06cc\u0627 \u0628\u0631\u0627\u06cc \u0631\u0627\u0647\u200c\u0627\u0646\u062f\u0627\u0632\u06cc \u062e\u0637 \u0644\u0648\u0644\u0647 CI\/CD \u062e\u0648\u062f \u0628\u0627 GitHub Actions \u0648 Nanocl \u0628\u0647 \u06a9\u0645\u06a9 \u0646\u06cc\u0627\u0632 \u062f\u0627\u0631\u06cc\u062f\u060c \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u06cc\u062f \u0628\u0647 \u0633\u0631\u0648\u0631 discord \u0645\u0646 \u0628\u067e\u06cc\u0648\u0646\u062f\u06cc\u062f. \u0645\u0646 \u0627\u06cc\u0646\u062c\u0627 \u0647\u0633\u062a\u0645 \u062a\u0627 \u0628\u0647 \u0634\u0645\u0627 \u06a9\u0645\u06a9 \u06a9\u0646\u0645 \u062f\u0631 \u0633\u0641\u0631 \u062a\u0648\u0633\u0639\u0647 \u0646\u0631\u0645 \u0627\u0641\u0632\u0627\u0631 \u062e\u0648\u062f \u0645\u0648\u0641\u0642 \u0634\u0648\u06cc\u062f.<\/p>\n<\/p><\/div>\n","protected":false},"excerpt":{"rendered":"<p>Summarize this content to 400 words in Persian Lang \u06cc\u0627\u062f \u0628\u06af\u06cc\u0631\u06cc\u062f \u0686\u06af\u0648\u0646\u0647 \u0627\u0633\u062a\u0642\u0631\u0627\u0631 \u062e\u0648\u062f \u0631\u0627 \u0628\u0627 GitHub Actions \u0648 Nanocl \u062e\u0648\u062f\u06a9\u0627\u0631 \u06a9\u0646\u06cc\u062f. \u0627\u06cc\u0646 \u0631\u0627\u0647\u0646\u0645\u0627 \u0634\u0645\u0627 \u0631\u0627 \u062f\u0631 \u0631\u0627\u0647\u200c\u0627\u0646\u062f\u0627\u0632\u06cc \u0627\u0633\u062a\u0642\u0631\u0627\u0631 \u06cc\u06a9\u067e\u0627\u0631\u0686\u0647 \u0631\u0627\u0647\u0646\u0645\u0627\u06cc\u06cc \u0645\u06cc\u200c\u06a9\u0646\u062f \u0648 \u0628\u0647 \u06a9\u0627\u0631\u06af\u06cc\u0631\u06cc \u0628\u0631\u0646\u0627\u0645\u0647\u200c\u0647\u0627\u06cc\u062a\u0627\u0646 \u0631\u0627 \u0628\u0627 \u062d\u062f\u0627\u0642\u0644 \u062a\u0644\u0627\u0634 \u0622\u0633\u0627\u0646\u200c\u062a\u0631 \u0645\u06cc\u200c\u06a9\u0646\u062f. \u0686\u0647 \u062f\u0631 CI\/CD \u062a\u0627\u0632\u0647 \u06a9\u0627\u0631 \u0628\u0627\u0634\u06cc\u062f \u06cc\u0627 \u06cc\u06a9 \u062a\u0648\u0633\u0639\u0647 \u062f\u0647\u0646\u062f\u0647 \u0628\u0627 \u062a\u062c\u0631\u0628\u0647\u060c \u0627\u06cc\u0646 &hellip;<\/p>\n","protected":false},"author":2,"featured_media":85288,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"fifu_image_url":"","fifu_image_alt":"","footnotes":""},"categories":[339],"tags":[],"class_list":["post-85287","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-dev"],"_links":{"self":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts\/85287","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/comments?post=85287"}],"version-history":[{"count":0,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts\/85287\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/media\/85288"}],"wp:attachment":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/media?parent=85287"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/categories?post=85287"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/tags?post=85287"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}