CentOS 7

استقرارهای تولید Node.js خود را با Shipit در CentOS 7

مقدمه
Shipit ابزار جهانی اتوماسیون و استقرار برای توسعه دهندگان Node.js است. این ابزار شامل یک جریان کار بر اساس پکیج محبوب Orchestrator ، ورود به سیستم و دستورات SSH تعاملی از طریق OpenSSH و یک API قابل توسعه است. توسعه دهندگان می توانند از Shipit برای خودکار سازی جریان های کاری ساخت و استقرار در طیف گسترده ای از برنامه های Node.js استفاده کنند.
گردش کار Shipit به توسعه دهندگان اجازه می دهد تا نه تنها کارها را پیکربندی کنند ، بلکه ترتیب اجرای آنها را نیز مشخص کنند. و اینکه آیا باید همزمان یا ناهمزمان اجرا شوند و در کدام محیط قرار گیرند.
در این آموزش Shipit را برای به کارگیری برنامه Node.js از محیط توسعه محلی خود به محیط تولید خود نصب و پیکربندی می کنید. شما به وسیله موارد زیر از Shipit برای استقرار برنامه خود و پیکربندی سرور مجازی از راه دور استفاده میکنید:
• انتقال فایل های برنامه Node.js از محیط محلی خود به محیط تولید (با استفاده از rsync ، git و ssh).
• نصب متعلقات برنامه (ماژول های گره).
• پیکربندی و مدیریت فرآیندهای Node.js در حال اجرا بر روی سرور مجازی از راه دور با PM2.
پیش نیازها
قبل از شروع این آموزش به موارد زیر نیاز خواهید داشت:
⦁ دو سرور مجازی CentOS 7 (در این آموزش آنها را با app و web نامگذاری میکنیم) که توسط شبکه های خصوصی و طبق آموزش نحوه تنظیم برنامه Node.js برای تولید در CentOS 7 پیکربندی شده باشد.
⦁ Nginx (روی سرور مجازی وب خود) که با TLS / SSL همانطور که در آموزش نحوه ایمن سازی Nginx با رمزگذاری در CentOS 7 نشان داده شده ایمن شده باشد. توجه داشته باشید ، اگر پیش نیازها را به ترتیب دنبال می کنید ، فقط باید مراحل 1 ، 4 و 6 را در سرور مجازی وب خود انجام دهید.
⦁ Node.js و npm که در محیط توسعه شما نصب شده باشند. در این آموزش از نسخه 10.17.0 استفاده شده است. برای نصب این برنامه در macOS یا Ubuntu 18.04 ، مراحل نحوه نصب Node.js و ایجاد محیط توسعه محلی را در macOS یا نصب با استفاده از بخش PPA از نحوه نصب Node.js در اوبونتو 18.04 دنبال کنید. با نصب Node.js ، npm را نیز نصب خواهید کرد. این آموزش از نسخه 6.11.3 استفاده می کند.
⦁ یک کامپیوتر توسعه محلی که روی آن rsync و git نصب شده باشد.
⦁ در macOS می توانید این موارد را با Homebrew نصب کنید.
⦁ برای نصب git در توزیع های لینوکس ، آموزش نحوه نصب Git را دنبال کنید.
⦁ یک حساب کاربری با GitHub یا یک ارائه دهنده سرویس git میزبان دیگر. در این آموزش از GitHub استفاده می شود.
توجه: کاربران Windows برای اجرای دستورات موجود در این راهنما نیاز به نصب ساب سیستم ویندوز برای لینوکس دارند.

مرحله 1 – تنظیم منبع راه دور
Shipit برای همگام سازی بین دستگاه توسعه محلی و سرور مجازی از راه دور به یک منبع Git نیاز دارد. در این مرحله یک منبع از راه دور در Github.com ایجاد خواهید کرد. در حالی که هر ارائه دهنده (PROVIDER) کمی متفاوت است ، دستورات تا حدودی قابل انتقال هستند.
برای ایجاد یک منبع ، Github.com را در مرورگر وب خود باز کنید و وارد شوید. متوجه خواهید شد که در گوشه سمت راست و بالای هر صفحه یک نماد + وجود دارد. روی + کلیک کنید ، و سپس روی New repository کلیک کنید.

برای منبع خود ، یک نام کوتاه و قابل به خاطر سپردن مثلا HELLO WORLD انتخاب کنید. توجه داشته باشید که هر نامی را که در اینجا انتخاب می کنید به عنوان پوشه پروژه که از دستگاه محلی خود کار خواهید کرد ، تکرار می شود.

به صورت اختیاری ، توضیحی از منبع خود اضافه کنید.

نمایش منبع خود را بر اساس اولویت خود ، عمومی یا خصوصی تنظیم کنید.
اطمینان حاصل کنید که منبع با .gitignore آغاز شده است ، از لیست کشویی Add .gitignore ، node را انتخاب کنید. این مرحله برای جلوگیری از اضافه شدن فایل های غیر ضروری (مانند پوشه node_modules) به منبع شما مهم است.

روی دکمه Create repository کلیک کنید.
اکنون منبع باید از Github.com به دستگاه محلی شما کلون شود.
ترمینال خود را باز کرده و به محلی که می خواهید فایلهای پروژه Node.js خود را ذخیره کنید ، بروید. توجه داشته باشید که این فرآیند یک زیر پوشه را در دیرکتوری اصلی ایجاد می کند. برای کلون کردن منبع به دستگاه محلی خود ، دستور زیر را اجرا کنید:
⦁ $ git clone https://github.com/your-github-username/

your-github-repository-name.git
برای بازتاب نام کاربری Github و نام منبع قبلاً عرضه شده خود ، باید your-github-username و your-github-repository-name را جایگزین کنید.
توجه: اگر تأیید صحت دو عاملی (2FA) را در Github.com فعال کرده اید ، هنگام دسترسی به Github در خط فرمان ، باید از یک نشانه دسترسی شخصی یا کلید SSH به جای رمزعبور استفاده کنید. صفحه راهنما Github مربوط به 2FA اطلاعات بیشتری را ارائه می دهد.

خروجی مشابه با این خواهید دید:
Output
Cloning into ‘your-github-repository-name’…
remote: Enumerating objects: 3, done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 3
Unpacking objects: 100% (3/3), done.

با اجرای دستور زیر به منبع بروید:
⦁ $ cd your-github-repository-name

در داخل منبع یک فایل تکی و پوشه وجود دارد که هر دو فایل مورد استفاده Git برای مدیریت منبع هستند. می توانید این موضوع را با این دستور زیر تأیید کنید:
⦁ $ ls -la

خروجی مشابه زیر را مشاهده خواهید کرد:
Output
total 8
0 drwxr-xr-x 4 asciant staff 128 22 Apr 07:16 .
0 drwxr-xr-x 5 asciant staff 160 22 Apr 07:16 ..
0 drwxr-xr-x 13 asciant staff 416 22 Apr 07:16 .git
8 -rw-r–r– 1 asciant staff 914 22 Apr 07:16 .gitignore

اکنون که یک منبع git کاری را پیکربندی کرده اید ، فایل shipit.js را ایجاد خواهید کرد که روند استقرار شما را مدیریت می کند.
مرحله 2 – ادغام shipit در یک پروژه Node.js
در این مرحله ، یک نمونه پروژه Node.js ایجاد می کنید و سپس پکیج های Shipit را اضافه می کنید. این آموزش یک برنامه مثال را ارائه می دهد – سرور مجازی وب Node.js که درخواست HTTP را می پذیرد و با Hello World در متن ساده پاسخ می دهد. برای ایجاد برنامه ، دستور زیر را اجرا کنید:
⦁ $ nano hello.js
کد برنامه مثال زیر را به hello.js اضافه کنید (به روزرسانی متغیر APP_PRIVATE_IP_ADDRESS به آدرس IP شبکه خصوصی سرور مجازی برنامه خود(:
hello.js
var http = require(‘http’);
http.createServer(function (req, res) {
res.writeHead(200, {‘Content-Type’: ‘text/plain’});
res.end(‘Hello World\n’);
}).listen(8080, ‘APP_PRIVATE_IP_ADDRESS’);
console.log(‘Server running at http://APP_PRIVATE_IP_ADDRESS:8080/’);

اکنون فایل pack.json خود را برای برنامه تان ایجاد کنید:
⦁ $ npm init -y
این دستور یک فایل pack.json ایجاد می کند ، که شما برای پیکربندی برنامه Node.js خود استفاده خواهید کرد. در مرحله بعد ، با رابط خط فرمان npm ، به این فایل متعلقات را اضافه خواهید کرد.
Output
Wrote to ~/hello-world/package.json:
{
“name”: “hello-world”,
“version”: “1.0.0”,
“description”: “”,
“main”: index.js”,
“scripts”: {
“test”: “echo \”Error: no test specified\” && exit 1″
},
“keywords”: [],
“author”: “”,
“license”: “ISC”
}

سپس ، بسته های npm لازم را با دستور زیر نصب کنید:
⦁ $ npm install –save-dev shipit-cli shipit-deploy shipit-shared
از فلگ –save-dev استفاده می کنید زیرا بسته های Shipit فقط در دستگاه محلی شما مورد نیاز است. خروجی مشابه زیر را مشاهده خواهید کرد:
Output
+ shipit-shared@4.4.2
+ shipit-cli@4.2.0
+ shipit-deploy@4.1.4
updated 4 packages and audited 21356 packages in 11.671s
found 62 low severity vulnerabilities run `npm audit fix` to fix them, or `npm audit` for details

این کار همچنین سه بسته را به عنوان بسته های توسعه به فایل pack.json شما اضافه میکند:
package.json
. . .
“devDependencies”: {
“shipit-cli”: “^4.2.0”,
“shipit-deploy”: “^4.1.4”,
“shipit-shared”: “^4.4.2”
},
. . .

با پیکربندی محیط محلی خود ، اکنون می توانید به سراغ آماده سازی سرور مجازی برنامه از راه دور برای استقرار مبتنی بر Shipit بروید.
مرحله 3 – تهیه سرور مجازی برنامه از راه دور
در این مرحله از ssh برای اتصال به سرور مجازی برنامه خود و نصب متعلقات از راه دور rsync استفاده خواهید کرد. Rsync ابزاری برای انتقال کارآمد و همگام سازی فایل ها بین درایوهای رایانه های محلی و در سراسر رایانه های شبکه با مقایسه زمان و اندازه تغییر فایل ها است.
Shipit از rsync برای انتقال و همگام سازی فایل ها بین رایانه محلی و سرور مجازی برنامه از راه دور استفاده می کند. شما دستوراتی را به صورت مستقیم به rsync صادر نمی کنید ؛ Shipit آن را برای شما مدیریت می کند.
توجه: راهنمای نحوه راه اندازی یک برنامه Node.js برای تولید در CentOS 7 ، دو سرور مجازی app و web را به شما معرفی میکند. این دستورات باید فقط در app اجرا شوند.

از طریق sshبه سرور مجازی برنامه راه دور خود متصل شوید:
⦁ $ ssh deployer@your_app_server_ip
rsync را با اجرای دستور زیر بر روی سرور مجازی خود نصب کنید:
⦁ $ sudo yum install rsync
نصب را با دستور زیر تایید کنید:
⦁ $ rsync –version
خط مشابهی را در خروجی این دستور مشاهده خواهید کرد:
Output
rsync version 3.1.2 protocol version 31
. . .

می توانید بخش ssh خود را با تایپ کردن exit پایان دهید.
با نصب و دسترسی rsync در خط فرمان ، می توانید به سراغ کارهای استقرار و ارتباط آنها با رویدادها بروید.
مرحله 4 – پیکربندی و اجرای کارهای استقرار
هم events و هم tasks مؤلفه های اصلی استقرار Shipit هستند و درک چگونگی تکمیل استقرار برنامه شما توسط آن ها مهم است. رویدادهای (events) ناشی از Shipit بیانگر نقاط خاصی در چرخه عمر استقرار هستند. کارها (tasks) بر اساس توالی چرخه زندگی Shipit در پاسخ به این رویدادها اجرا خواهند شد.
یک نمونه متداول از این که این سیستم وظیفه / رویداد در یک برنامه Node.js چگونه مفید است ، نصب متعلقات برنامه (node_modules) روی سرور مجازی راه دور است. بعداً در این مرحله ، شما باید Shipit را برای بررسی و گوش دادن به رویداد آپدیت شده (که بعد از انتقال فایل های برنامه صادر می شود) به کار بگیرید و یک task را برای نصب متعلقات برنامه (نصب npm) بر روی سرور مجازی راه دور اجرا کنید.
برای گوش دادن به رویدادها و اجرای وظایف ، Shipit به یک فایل پیکربندی نیاز دارد که اطلاعات مربوط به سرور مجازی راه دور شما (سرور مجازی app) را در اختیار داشته باشد و شنوندگان رویدادها و دستوراتی را که باید توسط این وظایف اجرا شوند را ثبت می کند. این فایل در رایانه توسعه محلی شما ، در دیرکتوری برنامه Node.js شما قرار دارد.
برای شروع ، این فایل را ایجاد کنید ، از جمله اطلاعاتی درباره سرور مجازی راه دور خود ، شنوندگان رویدادی که می خواهید تایید کنید و برخی از تعریف های مربوط به کارهایتان. با اجرای دستور زیر shipitfile.js را در دیرکتوری اصلی برنامه خود در دستگاه محلی خود ایجاد کنید:
⦁ $ nano shipitfile.js
اکنون که فایلی را ایجاد کرده اید ، باید اطلاعات اولیه محیطی مورد نیاز Shipit را جمع کند. در درجه اول مکان منبع Git از راه دور شما و مهمتر از همه ، آدرس IP عمومی سرور مجازی برنامه شما و حساب کاربری SSH میباشد.
این پیکربندی اولیه را اضافه کنید و خطوط هایلایت شده را به روز کنید تا با محیط شما مطابقت داشته باشد:
shipitfile.js
module.exports = shipit => {
require(‘shipit-deploy’)(shipit);
require(‘shipit-shared’)(shipit);

const appName = ‘hello’;

shipit.initConfig({
default: {
deployTo: ‘/home/sammy/your-domain’,
repositoryUrl: ‘https://git-provider.tld/YOUR_GIT_USERNAME/

YOUR_GIT_REPO_NAME.git’,
keepReleases: 5,
shared: {
overwrite: true,
dirs: [‘node_modules’]
}
},
production: {
servers: ‘sammy@YOUR_APP_SERVER_PUBLIC_IP’
}
});

const path = require(‘path’);
const ecosystemFilePath = path.join(
shipit.config.deployTo,
‘shared’,
‘ecosystem.config.js’
);

// Our listeners and tasks will go here

};

به روزرسانی متغیرها در روش shipit.initConfig پیکربندی خاصی را برای Shipit برای استقرار شما فراهم می کند. این موارد نشان دهنده موارد زیر برای Shipit است:
⦁ deployTo: دایرکتوری است که Shipit کد برنامه شما را روی سرور مجازی از راه دور مستقر می کند. در اینجا از پوشه / home / برای کاربر غیر root با امتیازات sudo (/ home / sammy) استفاده می کنید چرا که امن است و از مشکلات مجوزی جلوگیری می کند. مؤلفه /your-domain یک کنوانسیون نامگذاری برای تشخیص پوشه از سایر موارد در پوشه هوم کاربر است.
⦁ repositoryUrl: URL برای منبع کامل Git است ، Shipit از این URL استفاده می کند تا اطمینان حاصل کند که فایل های پروژه قبل از استقرار در همگام سازی هستند.
⦁ KeepReleases: تعداد نسخه هایی است که می توانید روی سرور مجازی از راه دور نگه دارید. یک نسخه پوشه ای با تاریخ مهر شده است که حاوی فایل های برنامه شما در زمان انتشار میباشد. اینها می توانند برای رول بک استقرار مفید باشند.
⦁ Shared : پیکربندی است که با KeepReleases مطابقت دارد و اجازه می دهد تا دایرکتوری ها بین نسخه ها به اشتراک گذاشته شوند. در این مثال ، یک پوشه node_modules منفرد داریم که بین همه نسخه ها به اشتراک گذاشته می شود.
⦁ production: یک سرور مجازی از راه دور را برای به کارگیری برنامه شما به کاربر نشان می دهد. در این مثال ، شما دارای یک سرور مجازی واحد (سرور مجازی app) هستید که نام production را با پیکربندی servers: متناسب با کاربر SSH و آدرس IP عمومی خود نامگذاری میکنید. نام production مربوط به Shipit ، فرمان استفاده شده در انتهای این آموزش به کار میگیرد (npx shipit server name deploy یا در مورد شما ( npx shipit production deploy
اطلاعات بیشتر در مورد موضوع پیکربندی Shipit Deploy را می توان در منبع Shipit Github یافت.
قبل از ادامه به روزرسانی shipitfile.js ، اجازه دهید نمونه خرده کد زیر را برای درک وظایف Shipit بررسی کنیم:
Example event listenershipit.on(‘deploy’, () => {
shipit.start(‘say-hello’);
});

shipit.blTask(‘say-hello’, async () => {
shipit.local(‘echo “hello from your local computer”‘)
});

این یک task نمونه است که از روش shipit.on برای عضویت در رویداد deploy استفاده می کند. این task منتظر میماند تا رویداد deploy توسط چرخه Shipit منتشر شود ، پس از دریافت رویداد ، task روش shipit.start را اجرا می کند که به Shipit می گوید کار say-hello را شروع کند.
روش shipit.on دو پارامتر میگیرد ، نام رویداد برای گوش دادن به آن و تابع callback برای اجرا هنگام دریافت رویداد.
طبق توضیحات روش shipit.on ، task با روش shipit.blTask ​​تعریف شده است. این یک task جدید Shipit ایجاد می کند که سایر کارها را هنگام اجرای آن مسدود می کند (یک task همزمان است). روش shipit.blTask ​​نیز دو پارامتر میگیرد ، نام task ای که آن را تعریف می کند و یک تابع callback برای اجرا هنگام فعالسازی task توسط shipit.start .
در تابع callback این مثال (say-hello) ، روش shipit.local یک دستور در دستگاه محلی اجرا می کند. فرمان محلی ” hello from your local computer ” را به خروجی ترمینال می فرستد.
اگر می خواستید یک دستور روی سرور مجازی از راه دور اجرا کنید ، از روش shipit.remote استفاده می کردید. دو روش ، shipit.local و shipit.remote ، API را برای صدور دستورات به صورت محلی یا از راه دور به عنوان بخشی از استقرار فراهم می کنند.
اکنون shipitfile.js را به روز کنید تا شنوندگان رویداد برای عضویت در چرخه Shipit با shipit.on عضو شوند. شنوندگان رویداد را به shipitfile.js خود اضافه کنید و آنها را پس از مکان نگهدارنده کامنت از پیکربندی اولیه // Our tasks will go here درج کنید:
shipitfile.js
. . .
shipit.on(‘updated’, () => {
shipit.start(‘npm-install’, ‘copy-config’);
});

shipit.on(‘published’, () => {
shipit.start(‘pm2-server’);
});

این دو روش در حال گوش دادن به رویدادهای به روز شده و منتشر شده هستند که به عنوان بخشی از چرخه Shipit منتشر می شوند. هنگامی که این رویداد دریافت شد ، هر یک از آنها taskهایی را با استفاده از روش shipit.start ، به طور مشابه با task مثال ، آغاز می کنند.
اکنون که جدول شنوندگان را برنامه ریزی کرده اید ، task مربوطه را اضافه خواهید کرد. task زیر را به shipitfile.js خود اضافه کنید ، آنها را بعد از شنوندگان رویداد خود وارد کنید:
shipitfile.js
. . .
shipit.blTask(‘copy-config’, async () => {

const fs = require(‘fs’);

const ecosystem = `
module.exports = {
apps: [
{
name: ‘${appName}’,
script: ‘${shipit.releasePath}/hello.js’,
watch: true,
autorestart: true,
restart_delay: 1000,
env: {
NODE_ENV: ‘development’
},
env_production: {
NODE_ENV: ‘production’
}
}
]
};`;

fs.writeFileSync(‘ecosystem.config.js’, ecosystem, function(err) {
if (err) throw err;
console.log(‘File created successfully.’);
});

await shipit.copyToRemote(‘ecosystem.config.js’, ecosystemFilePath);
});

ابتدا یک task را با عنوان copy-config اعلام می کنید. این task یک فایل محلی به نام ecosystem.config.js ایجاد می کند و سپس آن فایل را در سرور مجازی برنامه راه دور شما کپی می کند. PM2 از این فایل برای مدیریت برنامه Node.js استفاده می کند. این کار اطلاعات مسیر لازم جهت فایل را به PM2 برای اطمینان از اجرای آخرین فایل های مستقر شده در اختیار شما قرار می دهد. بعداً در مراحل ساخت ، TASK ای را ایجاد خواهید کرد که PM2 را با ecosystem.config.js به عنوان پیکربندی اجرا می کند.
اگر برنامه شما به متغیرهای محیطی نیاز دارد (مانند رشته اتصال به بانک اطلاعاتی) می توانید آنها را به صورت محلی در env: یا در سرور مجازی راه دور در env_production اعلام کنید: به همان روشی که متغیر NODE_ENV را در این موضوعات تنظیم کرده اید.
بعد از copy-config ، task بعدی را به shipitfile.js اضافه کنید:
shipitfile.js
. . .
shipit.blTask(‘npm-install’, async () => {
shipit.remote(`cd ${shipit.releasePath} && npm install –production`);
});

در مرحله بعد ، task ای به نام npm-install را اعلام می کنید. این task برای نصب متعلقات برنامه (بسته های npm) از یک ترمینال bash از راه دور (از طریق shipit.remote) استفاده می کند.
بعد از npm-install ، آخرین task را به shipitfile.js خود اضافه کنید:
shipitfile.js
. . .
shipit.blTask(‘pm2-server’, async () => {
await shipit.remote(`pm2 delete -s ${appName} || :`);
await shipit.remote(
`pm2 start ${ecosystemFilePath} –env production –watch true`
);
});

سرانجام task ای بنام pm2-server را اعلام می کنید. این task نیز از یک ترمینال bash از راه دور استفاده می کند تا ابتدا PM2 را از مدیریت استقرار قبلی شما از طریق فرمان delete متوقف کند و سپس یک نمونه جدید از سرور مجازی Node.js شما را شروع کند که فایل ecosystem.config.js را به عنوان یک متغیر فراهم می کند. شما همچنین به PM2 اطلاع میدهید که باید در تنظیمات اولیه خود از متغیرهای محیطی از بلوک production استفاده کند و از PM2 می خواهید که برنامه را تماشا کند و در صورت خرابی مجدداً آن را راه اندازی کند.
فایل کامل shipitfile.jsاینگونه خواهد بود:
shipitfile.js
module.exports = shipit => {
require(‘shipit-deploy’)(shipit);
require(‘shipit-shared’)(shipit);

const appName = ‘hello’;

shipit.initConfig({
default: {
deployTo: ‘/home/deployer/example.com’,
repositoryUrl: ‘https://git-provider.tld/YOUR_GIT_USERNAME/

YOUR_GIT_REPO_NAME.git’,
keepReleases: 5,
shared: {
overwrite: true,
dirs: [‘node_modules’]
}
},
production: {
servers: ‘deployer@YOUR_APP_SERVER_PUBLIC_IP’
}
});

const path = require(‘path’);
const ecosystemFilePath = path.join(
shipit.config.deployTo,
‘shared’,
‘ecosystem.config.js’
);

// Our listeners and tasks will go here
shipit.on(‘updated’, async () => {
shipit.start(‘npm-install’, ‘copy-config’);
});

shipit.on(‘published’, async () => {
shipit.start(‘pm2-server’);
});

shipit.blTask(‘copy-config’, async () => {
const fs = require(‘fs’);
const ecosystem = `
module.exports = {
apps: [
{
name: ‘${appName}’,
script: ‘${shipit.releasePath}/hello.js’,
watch: true,
autorestart: true,
restart_delay: 1000,
env: {
NODE_ENV: ‘development’
},
env_production: {
NODE_ENV: ‘production’
}
}
]
};`;

fs.writeFileSync(‘ecosystem.config.js’, ecosystem, function(err) {
if (err) throw err;
console.log(‘File created successfully.’);
});

await shipit.copyToRemote(‘ecosystem.config.js’, ecosystemFilePath);
});

shipit.blTask(‘npm-install’, async () => {
shipit.remote(`cd ${shipit.releasePath} && npm install –production`);
});

shipit.blTask(‘pm2-server’, async () => {
await shipit.remote(`pm2 delete -s ${appName} || :`);
await shipit.remote(
`pm2 start ${ecosystemFilePath} –env production –watch true`
);
});
};

هنگامی که آماده بودید ، فایل را ذخیره کنید و از آن خارج شوید.
با پیکربندی shipitfile.js ، و نهایی کردن شنوندگان رویدادها و کارهای مرتبط، می توانید به سراغ استقرار روی سرور مجازی برنامه بروید.
مرحله 5 – استقرار برنامه
در این مرحله ، برنامه خود را از راه دور مستقر می کنید و آزمایش می کنید که استقرار برنامه شما را در دسترس اینترنت قرار داده شده است.
از آنجا که Shipit فایلهای پروژه را از منبع راه دور Git کلون می کند ، باید فایلهای برنامه Node.js محلی خود را از دستگاه محلی خود به سمت Github بفرستید. به دیرکتوری برنامه های پروژه Node.js خود بروید (جایی که hello.js و shiptitfile.js در آن قرار دارند) و دستور زیر را اجرا کنید:
⦁ $ git status
دستور git status وضعیت دایرکتوری کاری و منطقه مرحله بندی را نشان می دهد. به شما امکان می دهد ببینید کدام تغییرات روی صحنه رفته است ، کدام موارد انجام نشده است ، و کدام فایل ها توسط Git ردیابی نمی شوند. فایل های شما غیرفعال هستند و در خروجی به صورت قرمز ظاهر می شوند:
Output
On branch master
Your branch is up to date with ‘origin/master’.

Untracked files:
(use “git add <file>…” to include in what will be committed)

hello.js
package-lock.json
package.json
shipitfile.js

nothing added to commit but untracked files present (use “git add” to track)

با دستور زیر می توانید این فایل ها را به منبع خود اضافه کنید:
⦁ $ git add –all
این دستور هیچ گونه خروجی ایجاد نمی کند ، اگرچه اگر شما مجدداً git statu را اجرا کنید ، فایل ها با توجه به این نکته که تغییراتی در این زمینه وجود دارد سبز می شوند.
می توانید با اجرای دستور زیر یک commit ایجاد کنید:
⦁ $ git commit -m “Our first commit”
خروجی این فرمان برخی از اطلاعات مخصوص Git درباره فایل ها را فراهم می کند
Output
[master c64ea03] Our first commit
4 files changed, 1948 insertions(+)
create mode 100644 hello.js
create mode 100644 package-lock.json
create mode 100644 package.json
create mode 100644 shipitfile.js

تمام کاری که اکنون باقی مانده است این است که commit خود را به منبع راه دور Shipit منتقل کنید تا در حین استقرار به سرور مجازی برنامه شما کلون شود. دستور زیر را اجرا کنید:
⦁ $ git push origin master
خروجی شامل اطلاعات مربوط به هماهنگی با منبع از راه دور است:
Output
Enumerating objects: 7, done.
Counting objects: 100% (7/7), done.
Delta compression using up to 8 threads
Compressing objects: 100% (6/6), done.
Writing objects: 100% (6/6), 15.27 KiB | 7.64 MiB/s, done.
Total 6 (delta 0), reused 0 (delta 0)
To github.com:Asciant/hello-world.git
e274312..c64ea03 master -> master

برای استقرار برنامه خود ، دستور زیر را اجرا کنید:
⦁ $ npx shipit production deploy
خروجی این دستور (که کل آن بسیار طولانی است) جزئیات مربوط به کارهایی که انجام می شود و نتیجه تابع خاص را ارائه میدهد. خروجی زیر برای کار pm2-server نشان می دهد که برنامه Node.js راه اندازی شده است:
Output
Running ‘deploy:init’ task…
Finished ‘deploy:init’ after 432 μs
. . .
Running ‘pm2-server’ task…
Running “pm2 delete -s hello || :” on host “centos-ap-app.asciant.com”.
Running “pm2 start /home/deployer/

example.com/shared/ecosystem.config.js –env production –watch true” on host “centos-ap-app.asciant.com”.
@centos-ap-app.asciant.com [PM2][WARN] Node 4 is deprecated, please upgrade to use pm2 to have all features
@centos-ap-app.asciant.com [PM2][WARN] Applications hello not running, starting…
@centos-ap-app.asciant.com [PM2] App [hello] launched (1 instances)
@centos-ap-app.asciant.com

┌──────────┬────┬────

@centos-ap-app.asciant.com │ App name │ id │ version │ mode │ pid │ status │ restart │ uptime │ cpu │ mem │ user │ watching │
@centos-ap-app.asciant.com

├──────────┼────┼──
@centos-ap-app.asciant.com │ hello │ 0 │ 1.0.0 │ fork │ 4177 │ online │ 0 │ 0s │ 0% │ 4.5 MB │ deployer │ enabled │
@centos-ap-app.asciant.com

└──────────┴────┴────
@centos-ap-app.asciant.com Use `pm2 show <id|name>` to get more details about an app
Finished ‘pm2-server’ after 5.27 s

Running ‘deploy:clean’ task…
Keeping “5” last releases, cleaning others
Running “(ls -rd /home/deployer/

example.com/releases/*|head -n 5;ls -d /home/deployer/example.com/releases/*)|

sort|uniq -u|xargs rm -rf” on host “centos-ap-app.asciant.com”.
Finished ‘deploy:clean’ after 1.81 s

Running ‘deploy:finish’ task…
Finished ‘deploy:finish’ after 222 μs
Finished ‘deploy’ [ deploy:init, deploy:fetch, deploy:update, deploy:publish, deploy:clean, deploy:finish ]

برای مشاهده برنامه خود به عنوان کاربر ، می توانید آدرس URL وب سایت خود را در دامنه تان در مرورگر خود وارد کنید تا به سرور مجازی وب خود دسترسی پیدا کنید. این برنامه Node.js را از طریق پروکسی معکوس روی سرور مجازی برنامه که فایلهای شما در آن مستقر شده اند ، ارائه می کند.

Hello World را می بینید.
توجه: پس از اولین استقرار ، منبع Git شما فایل جدید ایجاد شده با نام ecosystem.config.js را پیگیری می کند. از آنجا که این فایل در هر استقرار بازسازی می شود ، و ممکن است حاوی اطلاعات سری برنامه کامپایل شده باشد ، باید قبل از انجام اقدامات بعدی ، به فایل .gitignore در دیرکتوری برنامه ریشه برنامه در دستگاه محلی شما اضافه شود.
.gitignore
. . .
# ecosystem.config
ecosystem.config.js

شما برنامه Node.js خود را روی سرور مجازی برنامه خود مستقر کرده اید ، که به استقرار جدید شما اشاره دارد. با به روز رسانی و راه اندازی همه موارد، می توانید به سراغ نظارت بر فرآیندهای برنامه خود بروید.
مرحله 6 – نظارت بر برنامه تان
PM2 ابزاری عالی برای مدیریت فرآیندهای از راه دور شما است ، اما همچنین ویژگی هایی را برای نظارت بر عملکرد این فرآیندهای برنامه فراهم می کند.
با این دستور به سرور مجازی برنامه راه دور خود از طریق SSH متصل شوید:
⦁ $ ssh deployer@your_app_server_ip
برای به دست آوردن اطلاعات خاص مربوط به فرآیندهای مدیریت شده PM2 خود ، دستور زیر را اجرا کنید:
⦁ $ pm2 list
خروجی مشابه زیر را مشاهده میکنید:
Output
┌─────────────┬────┬─
│ App name │ id │ version │ mode │ pid │ status │ restart │ uptime │ cpu │ mem │ user │ watching │
├───────────
│ hello │ 0 │ 0.0.1 │ fork │ 3212 │ online │ 0 │ 62m │ 0.3% │ 45.2 MB │ deployer │ enabled │
└───────────

خلاصه اطلاعاتی را که PM2 جمع آوری کرده است مشاهده خواهید کرد. برای دیدن اطلاعات دقیق ، می توانید دستور زیر را اجرا کنید:
⦁ $ pm2 show hello
خروجی روی اطلاعات خلاصه ارائه شده توسط فرمان pm2 list گسترش می یابد. همچنین اطلاعات مربوط به تعدادی از دستورات جانبی را در اختیار شما قرار می دهد و مکان فایل های log را در اختیار شما قرار می دهد:
Output
Describing process with id 0 – name hello
┌────────────
│ status │ online │
│ name │ hello │
│ version │ 1.0.0 │
│ restarts │ 0 │
│ uptime │ 82s │
│ script path │ /home/deployer/

example.com/releases/20190531213027/hello.js │
│ script args │ N/A │
│ error log path │ /home/deployer/.pm2/logs/hello-error.log │
│ out log path │ /home/deployer/.pm2/logs/hello-out.log │
│ pid path │ /home/deployer/.pm2/pids/hello-0.pid │
│ interpreter │ node │
│ interpreter args │ N/A │
│ script id │ 0 │
│ exec cwd │ /home/deployer │
│ exec mode │ fork_mode │
│ node.js version │ 4.2.3 │
│ node env │ production │
│ watch & reload │ ✔ │
│ unstable restarts │ 0 │
│ created at │ 2019-05-31T21:30:48.334Z │
└─────────
Revision control metadata
┌────────
│ revision control │ git │
│ remote url │ N/A │
│ repository root │ /home/deployer

/example.com/releases/20190531213027 │
│ last update │ 2019-05-31T21:30:48.559Z │
│ revision │ 62fba7c8c61c7769022484d0bfa46e756fac8099 │
│ comment │ Our first commit │
│ branch │ master │
└─────────
Divergent env variables from local env
┌──────────
│ XDG_SESSION_ID │ 15 │
│ HOSTNAME │ N/A │
│ SELINUX_ROLE_REQUESTED │ │
│ TERM │ N/A │
│ HISTSIZE │ N/A │
│ SSH_CLIENT │ 44.222.77.111 58545 22 │
│ SELINUX_USE_CURRENT_RANGE │ │
│ SSH_TTY │ N/A │
│ LS_COLORS │ N/A │
│ MAIL │ /var/mail/deployer │
│ PATH │ /usr/local/bin:/usr/bin │
│ SELINUX_LEVEL_REQUESTED │ │
│ HISTCONTROL │ N/A │
│ SSH_CONNECTION │ 44.222.77.111 58545 209.97.167.252 22 │
└─────────
. . .

PM2 همچنین ابزاری برای نظارت بر ترمینال فراهم می کند که با دستور زیر قابل انجام است:
⦁ $ pm2 monit
خروجی این دستور یک داشبورد تعاملی است ، که در آن pm2 اطلاعات مربوط به فرآیند realtime ، ورودها ، متریک ها و ابرداده ها را ارائه می دهد. این داشبورد ممکن است به نظارت بر منابع و ورودی های خطا کمک کند:
Output
┌─ Process list ────┐┌─ Global Logs

─────────────────┐
│[ 0] hello Mem: 22 MB ││ │
│ ││ │
│ ││ │
└──────────────
┌─ Custom metrics (http://bit.l─┐┌─ Metadata

─────────────────┐
│ Heap Size 10.73 ││ App Name hello │
│ Heap Usage 66.14 ││ Version N/A │
│ Used Heap Size 7.10 ││ Restarts 0 │
│ Active requests 0 ││ Uptime 55s │
│ Active handles 4 ││ Script path /home/asciant/hello.js │
│ Event Loop Latency 0.70 ││ Script args N/A │
│ Event Loop Latency p95 ││ Interpreter node │
│ ││ Interpreter args N/A │
└───────────────────┘

با درک اینکه چگونه می توانید فرایندهای خود را با PM2 کنترل کنید ، می توانید به نحوه عملکرد Shipit در برگشت به یک استقرار کاری قبلی کمک کنید.
بخش ssh خود را با اجرای exit ، روی سرور مجازی برنامه خود پایان دهید.
مرحله 7 – برگشت به یک استقرار دچار مشکل (bugged)
استقرارها گاه به گاه در معرض اشکالات پیش بینی نشده یا مواردی قرار میگیرند که باعث می شود سایت شما خراب با مشکل رو به رو شود. توسعه دهندگان و محافظان Shipit این موضوع را پیش بینی کرده اند و این امکان را برای شما فراهم کرده اند که بتوانید به استقرار قبلی (کار) برنامه خود برگردید.

برای اطمینان از وجود پیکربندی PM2 خود ، در رویداد برگشت ، شنونده رویداد دیگری را به shipitfile.js اضافه کنید:
shipitfile.js
. . .
shipit.on(‘rollback’, () => {
shipit.start(‘npm-install’, ‘copy-config’);
});

برای اجرای وظایف npm-install و copy-config ، یک شنوند را به رویداد بازگشت اضافه می کنید. این امر ضروری است زیرا برخلاف رویداد منتشر شده (published )، رویداد به روز شده (updated ) توسط چرخه Shipit هنگام بازگشت استقرار اجرا نمی شود. افزودن این شنونده رویداد ، اطمینان حاصل می کند که مدیر فرآیند PM2 شما حتی در صورت بازگشت مجدد ، به جدیدترین استقرار اشاره می کند.
این فرایند شبیه به استقرار اما با تغییر جزئی در فرمان میباشد. برای بازگشت به حالت قبلی می توانید دستور زیر را اجرا کنید:
⦁ $ npx shipit production rollback
مانند دستور deploy  ، rollback  جزئیات مربوط به روند برگشت و کارهایی که انجام می شود را ارائه می دهد:
Output
Running ‘rollback:init’ task…
Get current release dirname.
Running “if [ -h /home/deployer/

example.com/current ]; then readlink /home/deployer/

example.com/current; fi” on host “centos-ap-app.asciant.com”.
@centos-ap-app.asciant.com releases/20190531213719
Current release dirname : 20190531213719.
Getting dist releases.
Running “ls -r1 /home/deployer/example.com/releases” on host “centos-ap-app.asciant.com”.
@centos-ap-app.asciant.com 20190531213719
@centos-ap-app.asciant.com 20190531213519
@centos-ap-app.asciant.com 20190531213027
Dist releases : [“20190531213719″,”20190531213519”,

“20190531213027”].
Will rollback to 20190531213519.
Finished ‘rollback:init’ after 3.96 s

Running ‘deploy:publish’ task…
Publishing release “/home/deployer/

example.com/releases/20190531213519”
Running “cd /home/deployer/

example.com && if [ -d current ] && [ ! -L current ]; then echo “ERR: could not make symlink”; else ln -nfs releases/20190531213519 current_tmp && mv -fT current_tmp current; fi” on host “centos-ap-app.asciant.com”.
Release published.
Finished ‘deploy:publish’ after 1.8 s

Running ‘pm2-server’ task…
Running “pm2 delete -s hello || :” on host “centos-ap-app.asciant.com”.
Running “pm2 start /home/deployer/example.com/shared/

ecosystem.config.js –env production –watch true” on host “centos-ap-app.asciant.com”.
@centos-ap-app.asciant.com [PM2][WARN] Node 4 is deprecated, please upgrade to use pm2 to have all features
@centos-ap-app.asciant.com [PM2][WARN] Applications hello not running, starting…
@centos-ap-app.asciant.com [PM2] App [hello] launched (1 instances)
@centos-ap-app.asciant.com

┌─────────┬───
@centos-ap-app.asciant.com │ App name │ id │ version │ mode │ pid │ status │ restart │ uptime │ cpu │ mem │ user │ watching │
@centos-ap-app.asciant.com

├──────────┼───┼──
@centos-ap-app.asciant.com │ hello │ 0 │ 1.0.0 │ fork │ 4289 │ online │ 0 │ 0s │ 0% │ 4.5 MB │ deployer │ enabled │
@centos-ap-app.asciant.com

└──────────┴───
@centos-ap-app.asciant.com Use `pm2 show <id|name>` to get more details about an app
Finished ‘pm2-server’ after 5.55 s

Running ‘deploy:clean’ task…
Keeping “5” last releases, cleaning others
Running “(ls -rd /home/deployer/example.com/releases/*|head -n 5;ls -d /home/deployer/

example.com/releases/*)|sort|uniq -u|xargs rm -rf” on host “centos-ap-app.asciant.com”.
Finished ‘deploy:clean’ after 1.82 s

Running ‘rollback:finish’ task…
Finished ‘rollback:finish’ after 615 μs
Finished ‘rollback’ [ rollback:init, deploy:publish, deploy:clean, rollback:finish ]

شما Shipit را پیکربندی کرده اید تا 5 نسخه را از طریق KeepReleases حفظ کند: 5 پیکربندی در shipitfile.js. Shipit این نسخه ها را به صورت داخلی ردیابی می كند تا در صورت لزوم بتواند به عقب برگردد. Shipit همچنین با ایجاد دایرکتوری به نام timestamp (YYYYMMDDHHmmss – مثال: / home / deployer / your-domain / Releases / 20190420210548) راهی مفید برای شناسایی نسخه ها ارائه می دهد.
اگر می خواهید فرآیند برگشت را سفارشی کنید ، می توانید وقایع خاص مربوط به عملیات برگشت را شنود کنید. سپس می توانید از این رویدادها برای اجرای کارهایی استفاده کنید که برگشت شما را تکمیل می کند. می توانید به لیست رویدادهای ارائه شده در تجزیه چرخه shipit مراجعه کرده و tasks/listeners را در shipitfile.js خود پیکربندی کنید.
قابلیت برگشت به معنای این است که شما همیشه می توانید یک نسخه کاربردی برنامه خود را در اختیار کاربران خود قرار دهید حتی اگر یک استقرار با مشکلات یا باگ غیرمنتظره مواجه شود.
نتیجه
در این آموزش ، شما یک گردش کاری را پیکربندی کرده اید که به شما امکان می دهد یک جایگزین بسیار قابل تنظیم برای Platform را به عنوان یک سرویس ایجاد کنید، که همه از چند سرور مجازی ایجاد میشوند . این گردش کار امکان استقرار و پیکربندی سفارشی ، نظارت بر فرآیند با PM2 ، امکان مقیاس و اضافه کردن خدمات یا سرور مجازی های اضافی یا محیط های مورد نیاز را در صورت لزوم فراهم می کند.
اگر علاقه دارید که ویژگی های Node.js خود را بیشتر بدانید، محتوای vpsgol Node.js و همچنین نحوه رمزگذاری در سری Node.js را بررسی کنید.

از این لینک ها زیر می توانید آمورش های بیشتری برای لینوکس پیدا کنید :

نحوه نصب Nginx در CentOS 8  –  استفاده از Cron برای خودکارسازی کارها در اوبونتو 18

پکیج کردن و انتشار برنامه Snap در اوبونتو 18نصب و استفاده ازRadamsa برای فوز کردن برنامه ها روی Ubuntu 18

استقرارهای تولید Node.js خود را با Shipit در CentOS 7 –  نحوه راه اندازی Eclipse Theia Cloud IDE Platform در Debian 10

چگونگی استفاده از migrations و seeders دیتابیس  –  نحوه نصب Docker Compose در Debian 10

نحوه نصب R روی اوبونتو 18.04 – چگونه می توان با کتابخانه (library) درخواست ها در پایتون شروع به کار کرد

چگونه می توان هاست های مجازی Apache را در اوبونتو 18.04  –  نحوه اجرای صفحه گذاری در MySQL با PHP روی اوبونتو 18.04

نصب پشته Nginx، MySQL، PHP LEMP در CentOS 8 – نحوه تنظیم پلتفرم Eclipse Theia Cloud IDE در CentOS 7

نحوه نصب پشته یا استک Nginx ، MySQL ، PHP LEMP  –  بسته بندی برنامه Laravel 6 برای توسعه با Docker Compose

مراحل ایمن سازی Apache HTTP در FreeBSD 12  – بهینه سازی درخواست های MySQL با ذخیره سازی ProxySQL در اوبونتو 16

درک Objectهای Map و Set در JavaScript  –  استفاده از Ansible برای نصب و راه اندازی وردپرس با LAMP در اوبونتو 18

نحوه راه اندازی Eclipse Theia Cloud IDE در اوبونتو  –  چگونه می توان پلتفرم كد سرور Cloud IDE را در اوبونتو 18.04

نحوه استفاده از Cron برای خودکارسازی کارها در CentOS 8   –  چگونه می توان از رول های ansible برای انتزاع محیط زیرساختی

نحوه نوشتن کد ناهمگام (غیر همزمان) در Node.js –  نحوه پیکربندی یک خوشه Galera با MySQL در سرورهای اوبونتو 18

راه اندازی اولیه سرور با CentOS 8 –   تهیه نسخه پشتیبان و بازیابی یک خوشه Kubernetes

نحوه تنظیم کلیدهای SSH در CentOS 8 –  نحوه نصب و استفاده از PostgreSQL در CentOS 7

نحوه ساختن یک برنامه Node.js با Docker  Quickstart  –  چگونه می توان پلتفرم Eclipse Theia Cloud IDE را روی اوبونتو

چگونه می توان هاست های مجازی Apache را در اوبونتو  –  مدیریت DNS با استفاده از DNSControl در Debian 10

نحوه تایید صحت رمز عبور با Apache در اوبونتو 18.04 –  چگونه می توان پلتفرم Cloud IDE کد سرور را روی CentOS 7

نحوه نصب و استفاده از TimescaleDB در CentOS 7نحوه نصب Apache Kafka در Debian 10

نحوه تایید صحت رمز عبور با Apache در اوبونتو 18.04  –  نحوه نصب وردپرس با OpenLiteSpeed ​​در اوبونتو 18.04

کلمات کلیدی خرید سرور

خرید vps – خرید سرور مجازی – خرید سرور – سرور هلند – فروش vps – سرور مجازی آمریکا – خریدvps – سرور مجازی هلند – فروش سرور مجازی – سرور آمریکا – vps – سرور مجازی انگلیس – سرور مجازی آلمان – سرور مجازی کانادا – خرید vps آمریکا – خرید وی پی اس – سرور – خرید سرور مجازی هلند – vps خرید – سرور مجازی فرانسه – سرور مجازی هلند – خرید vps آمریکاخرید سرور مجازی ارزان هلندvpsخرید vps هلندخرید سرور مجازی آمریکاخرید vps فرانسهتست vpsسرور مجازی تستسرور مجازی ویندوزارزانترین vpsخرید وی پی اسvps ارزان – 


https://vpsgol.net/product/vps-germany/

https://vpsgol.net/product/vps-usa/

https://vpsgol.net/product/vps-france/

https://vpsgol.net/product/vps-canada/

https://vpsgol.net/product/vps-poland/

https://vpsgol.net/product/vps-netherlands/

https://vpsgol.net/product/vps-england/