Местење и грижа за Ubuntu сервер

Andrijan Portrait

Andrijan Tasevski · 06 Dec, 2022

Местење на основни конфигурации на DigitalOcean

Прво влегување на серверот

Влегување на серверот со root username и password

Затоа што серверот го наместивме без SSH keys и со лозинка, сега треба да влеземе на серверот со username и password. Тоа го правиме на следниов начин:

# Шаблон

$ ssh root@ip-address/hostname

# Со реални податоци

$ ssh [email protected]

# Потоа треба да притиснеме само yes

The authenticity of host '49.12.69.232 (49.12.69.232)' can't be established.
ED25519 key fingerprint is SHA256:Yl7ewLlg61aaQb3Wv5c+lkvKDb7VUxylRj58/I1+fQ0.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '49.12.69.232' (ED25519) to the list of known hosts.

# Треба да го внесиме password-от што го напишавме претходно на DigitalOcean за root корисникот.

[email protected]'s password:

👍 Успешно сме стигнале на серверот.

💡 Кога пишуваме лозинки на UNIX системи, лозниката не е прикажана. Изгледа како ништо да не пишуваме, но ние всушност пишуваме.

Променување на hostname

Кога сакаме да пристапиме до серверот, секогаш пишуваме ssh@ip-address. Но, ip-address секогаш се состои од бројки коишто е тешко да ги запаметиме. Затоа можеме да го промениме hostname на нашиот сервер што ќе биде полесно да го запаметиме.

Името на hostname треба да биде домен. Името на доменот треба да биде уникатно, но не треба и нема да биде поврзано со страните што ќе се наоѓаат на серверот.

Најчесто имињата за hostnames се избираат по планети. Јас на пример ќе го именувам мојот домен за hostname neptune. Така што мојот домен би бил neptune.andrijan.dev

Внесување на hostname на серверот

За да го внесиме името на hostname (neptune.andrijan.dev) на брз и ефективен начин, ги пишуваме следниве команди:

# Го внесуваме доменот во папката etc во датотеката hostname

$ echo "neptune.andrijan.dev" > /etc/hostname

# Го читаме името на доменот од датотеката hostname

$ hostname -F /etc/hostname

Додавање на A Record

За да можеме да го користиме овој домен за да се поврзиме на серверот, треба да направиме нов A Record на местото каде што имаме DNS Settings. Јас тоа во овој случај го имам на Netlify, но тоа исто така може да биде на Cloudflare или Namecheap, на пример.

Name: neptune.andrijan.dev

TTL: 3600 seconds

Type: A

Value: 49.12.69.232

💡 За да провериме дали промените се пропагирани, односно дали тој A Record е пропагиран, ја користиме страната https://www.whatsmydns.net/

Ако видиме дека A Record што сме го внесиле е веќе пропагиран, тогаш можеме да пробаме да го отвориме серверот преку нашиот нов hostname.

Пристапување на серверот со новиот hostname

Наместо да ја пишуваме ip-address секој пат, сега можеме да го користиме нашиот hostname neptune.andrijan.dev:

$ ssh [email protected]

The authenticity of host 'neptune.andrijan.dev (49.12.69.232)' can't be established.
ED25519 key fingerprint is SHA256:Yl7ewLlg61aaQb3Wv5c+lkvKDb7VUxylRj58/I1+fQ0.
This host key is known by the following other names/addresses:
    ~/.ssh/known_hosts:7: [hashed name]
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added 'neptune.andrijan.dev' (ED25519) to the list of known hosts.
[email protected]'s password: 

Промена на временската зона

Затоа што серверот ќе ја добие истата временска зона како онаа каде што се наоѓа истиот, ние мораме да ја промениме затоа што можеби живееме во друга временска зона.

Исто така тоа ќе ни помогне да можеме да читаме кога сме направиле некои промени на датотеки или да видиме кога се случила некоја грешка или нешто друго на серверот.

Тоа можеме да го направиме со промена на tzdata package.

Ја внесуваме следнава команда:

$ dpkg-reconfigure tzdata

Кога ќе ја внесиме командата, ќе добиеме UI каде што ќе треба да го избереме континентот каде што живееме или сакаме да биде временската зона на серверот и го избираме специфичниот град/место.

Правење на updates рачно и рестартирање на сервер

Правење на updates рачно

Иако серверот е нов, најверојатно софтверот е веќе застарен и треба да направиме update на истиот.

Прво мораме да ги спуштиме сите packages со следнава команда:

$ apt update

Потоа мораме да ги инсталираме packages што сме ги спуштиле:

$ apt upgrade

Конечно можеме да ги избришеме сите packages коишто не ни требаат, затоа што сме ги замениле со понови:

$ apt autoremove

Рестартирање на серверот

За да го рестартираме нашиот сервер односно да направиме reboot, ја пишуваме следнава команда:

$ reboot

Ако ја пишуваме командата како sudo корисник, тогаш го пишуваме следново:

$ sudo reboot

Алтернативно можеме да ја користиме и оваа команда:

$ sudo shutdown now -r

Со оваа команда серверот ќе се исклучи и вклучи автоматски и инстантно.

Правење на updates автоматски

Многу е битно нашиот сервер да ги добива најновите надоградувања константно затоа што нашиот сервер може да биде изложен на напади што би можеле да ги искористат различни ботови и луѓе што сакаат да ни направат штета.

Сепак, надоградувањата што ги правиме треба да бидат само од сигурносен аспект (security updates), и не надоградувања што се системски. Не правиме системски надоградувања автоматски затоа што можат да предизвикаат проблеми со функционирањето на нашите апликации и процеси на серверот. Системските надоградувања ги правиме рачно и мораме да ги тестираме пред да ги направиме затоа што може серверот да биде исклучен подолго време.

Местење на автоматски сигурносни updates

Ubuntu ни нуди уникатна алатка што се вика unattended-upgrades со којашто можеме автоматски да правиме сигурносни и системски надоградувања.

Можеме да ја инсталираме на следниов начин:

$ sudo apt update

$ sudo apt install unattended-upgrades

Потоа ги креираме потребните датотеки со командава подолу:

dpkg-reconfigure unattended-upgrades

За да провериме дали процесот функционира, ја пишуваме следнава команда:

$ sudo systemctl status unattended-upgrades.service

За да провериме дали подесувањата се правилни (дали ќе автоматски ќе бидат направени само сигурносни надоградувања), треба да ја отвориме датотеката каде што се наоѓаат сите подесувања за unattended upgrades:

$  sudo nano /etc/apt/apt.conf.d/50unattended-upgrades

Датотеката ќе биде многу долга со многу различни подесувања. Најчесто сите се искоментирани (//) и со тоа се исклучени. Доколку сакаме да правиме промени, мора да ги избришиме двете коси црти и да ја променуваме вредноста од true во false и обратно.

Прво, мораме да бидеме сигурни дека сите надоградувања што ќе се прават автоматски ќе бидат само сигурносни:

// Automatically upgrade packages from these (origin:archive) pairs
//
// Note that in Ubuntu security updates may pull in new dependencies
// from non-security sources (e.g. chromium). By allowing the release
// pocket these get automatically pulled in.
Unattended-Upgrade::Allowed-Origins {
        "${distro_id}:${distro_codename}";
        "${distro_id}:${distro_codename}-security";
        // Extended Security Maintenance; doesn't necessarily exist for
        // every release and this system may not have it installed, but if
        // available, the policy for updates is such that unattended-upgrades
        // should also install from here by default.
        "${distro_id}ESMApps:${distro_codename}-apps-security";
        "${distro_id}ESM:${distro_codename}-infra-security";
//      "${distro_id}:${distro_codename}-updates";
//      "${distro_id}:${distro_codename}-proposed";
//      "${distro_id}:${distro_codename}-backports";
};

Автоматско рестартирање после надоградување

Ако сакаме системот автоматски да се рестартира после секое сигурно надградување коешто бара рестарирање на системот, го бараме овој дел во датотеката:

// Automatically reboot *WITHOUT CONFIRMATION* if
//  the file /var/run/reboot-required is found after the upgrade
//Unattended-Upgrade::Automatic-Reboot "false";

Внатре, мораме да ги избришеме двете црти и промениме false во true.

// Automatically reboot *WITHOUT CONFIRMATION* if
//  the file /var/run/reboot-required is found after the upgrade
Unattended-Upgrade::Automatic-Reboot "true";

Местење на времето кога да се случи рестартирањето

За да одбереме точно во кое време да се случуваат рестартирањата кога се потребни, тоа можеме да го направиме во следнава линија во истата датотека (основната вредност е now):

Unattended-Upgrade::Automatic-Reboot-Time "04:00";

За да ги зачуваме сите промени, го правиме следново:

CTRL + X - Го исклучуваме nano editor

Потоа пристикаме Y за yes и Enter.

Рестартирање на процесот

Откако ќе ги направиме сите овие промени, мораме да го рестартираме процесот на unattended-upgrades:

$ sudo systemctl restart unattended-upgrades.service

Па уште еднаш проверуваме дали процесот работи:

$ sudo systemctl status unattended-upgrades.service

Проверување колку често ќе се извршува процесот

За да провериме колку често unattended-upgrades ќе проверува дали има нови сигурносни надоградувања, го правиме следново:

$ sudo nano /etc/apt/apt.conf.d/20auto-upgrades

Проверуваме дали во датотеката е следново:

APT::Periodic::Unattended-Upgrade "1";

Ако е внатре, тогаш процесот ќе се извршува еднаш дневно.

Правење и менаџирање на корисници

Кога ќе го направиме серверот, постои само еден корисник и тоа е root корисникот. Привилегиите и моќта што ја има root можат да направат многу голема штета и затоа најчесто не го користиме тој корисник и го блокираме неговото користење.

Затоа правиме корисник и го додаваме во групата на sudo што имаат скоро исти привилегии како и root корисникот.

Правење на нов корисник

$ adduser newuser

# Или со реални информации:

$ adduser andrijan

Прво треба да внесиме password за корисникот.

Потоа, Ubuntu ќе не праша различни прашања:

Внеси целосно име за корисникот, телефонски број итн. Можеме да ги избегнеме овие прашања со притискање на Enter.

И на крајот мораме да потврдиме дека сме сигурни со y и Enter.

Проверување на групата во која се наоѓа корисникот

$ groups newuser

# Или со реални информации

$ groups andrijan

Затоа што немаме направено други групи, корисникот ќе биде во своја група што се именувана по неговото корисничко име. Тоа би изгледало вака:

user : group

andrijan : andrijan

Додавање на корисникот во sudo групата

За да додадеме корисник во sudo групата, ja пишуваме следнaвa командa:

$ usermod -aG sudo newuser

Flag-от -aG му кажува на командата usermod да го додаде корисникот во напишаната група. Во превод, додади го корисникот newuser во sudo групата.

$ usermod -aG sudo andrijan

Проверуваме во кои групи се наоѓа корисникот повторно:

$ groups andrijan

andrijan : andrijan sudo

Проверување дали можеме да влеземе на серверот

Прво се исклучуваме од серверот со root корисникот. Ја пишуваме командата:

$ logout

За да влеземе повторно на серверот ја пишуваме следнава команда:

ssh [email protected]

Правење на SSH keys и поврзување со серверот

Правење на SSH keys

На нашата локална машина прво мораме да направиме SSH keys. Ја пишуваме следнава команда:

$ ssh-keygen -t ed25519 -C <твојотемаил>

Потоа ssh-keygen ќе не праша за локацијата каде што сакаме да биде зачуван SSH key. Најдобро е да ја избереме основната (default) локација затоа што потоа најлесно е за системот да ја пронајде истата.

И можеме да внесеме password за SSH key, но не е потребно. Затоа можеме само да притиснеме два пати на Enter кога ќе треба да внесеме password.

Наоѓање на нашиот SSH key

Нашиот SSH key можеме да го најдеме на следниов начин:

$ cd

$ ls -la

$ cd .ssh

$ ls

$ cat id_ed25519.pub

Поврзување на SSH keys со серверот

За да се поврзуваме на серверот без password, тоа можеме да го направиме со внеснување на SSH клуч.

Најлесниот начин на внесување на SSH клуч на серверот е преку package ssh-copy-id. Но, исто така можеме целата процедура да ја извршиме рачно.

Поврзување на SSH keys со ssh-copy-id

Ја пишуваме следнава команда за да ги ископираме нашите SSH keys од локалната машина на нашиот remote server:

$ ssh-copy-id user@hostname/ip-address

# Со реални информации

$ ssh-copy-id [email protected]

Во случај ако сакаме да избереме специфичен SSH key (ако имаме повеќе од еден SSH key во нашата .ssh папка), тогаш можеме да го искористеме -i flag-от со којшто можеме да избереме кој SSH key точно ќе го додадеме:

$ ssh-copy-id -i <keyname> user@hostname/ip-address

# Со реални информации

$ ssh-copy-id -i id_ed25519.pub [email protected]

Потоа ќе треба да ја внесиме лозинката за корисникот andrijan на neptune.andrijan.dev. И ќе можеме да се вклучиме на серверот без лозинка со следнава команда:

$ ssh [email protected]

Поврзување на SSH keys рачно

Прво мораме да ја ископираме содржината што се содржи во нашата датотека id_25519.pub во локација ~/.ssh/

$ cat ~/.ssh/id_ed25519.pub/

Па ја копираме содржината што ја содржи датотеката.

ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIJLfWHqDolVGqTdT/69/4hRtzKjUcHGAeKm2j6dX8es0 [email protected]

Потоа влегуваме на серверот, но мораме да влеземе со користење на лозинка:

$ ssh [email protected]

Потоа правиме папка во home directory:

$ sudo mkdir home/andrijan/.ssh

Ставаме дозвола да може да ја чита, пишува и брише датотеката и папката само истиот корисник, односно корисникот andrijan во овој случај.

$ sudo chmod 700 /home/andrijan/.ssh

Потоа внатре во папката .ssh, правиме датотека што се вика authorized_keys:

$ cd .ssh

$ touch authorized_keys

Потоа со nano editor, го внесуваме SSH key што го ископиравме од датотеката id_ed25519.pub

$ sudo nano home/andrijan/.ssh/authorized_keys

Потоа притискаме CTRL + X, па y за yes и Enter. Проверуваме дали клучот е во датотеката:

$ cat home/andrijan/.ssh/authorized_keys

Потоа уште еднаш местиме друга дозвола за датотеката authorized_keys:

$ sudo chmod 600 /home/andrijan/.ssh/authorized_keys

Конечно, се исклучуваме од серверот и пробуваме да го искористиме SSH key за да влеземе на серверот без лозинка:

$ logout
$ ssh [email protected]

💡 Ако не можеме да пристапиме до серверот со SSH, а ги направивме сите чекори, најверојатно не сме ги направиле датотеките и папките со нашиот корисник.

Забрана за користење на SSH за root

Местење на забрана за користење на SSH

За поголема сигурност на серверот, најдобро е да забраниме за корисникот root да може да користи SSH да се поврзува на серверот.

Прво треба да ја отвориме датотеката за конфигурирање на SSH:

$ sudo nano /etc/ssh/sshd_config

Во истата датотека одиме со стрелката надолу и го бараме текстот што пишува PermitRootLogin и ја променуваме вредноста од yes во no. Откако ќе го направиме тоа, треба да ги зачуваме промените. Притискаме CTRL + X, па y и Enter.

Потоа треба да го ресетираме SSH service со следнава команда:

$ sudo service ssh restart

Ако пробаме да влезиме на серверот со root корисникот, треба да ја добиеме следнава порака:

$ ssh [email protected]
[email protected]'s password:
Permission denied, please try again.

Местење на забрана за поврзување со password

Исто така многу е битно за сигурноста да серверот да забраниме влегување на серверот со password, и тоа да биде дозволено само со користење на private SSH key.

Повторно, влегуваме во датотеката за конфигурирање на SSH:

$ sudo nano /etc/ssh/sshd_config

Во датотеката го бараме PasswordAuthentication и ја променуваме вредноста од yes во no.

Потоа ги зачувуваме промените. Притискаме на CTRL + X, па y и Enter.

И повторно мораме да го ресетираме процесот на SSH:

$ sudo service ssh restart

Местење на Uncomplicated Firewall (ufw)

Инсталирање на ufw

Со користењето на firewall можеме да додадеме уште еден дополнителен слој на заштита на нашиот сервер.

Со firewall ставаме забрана за inbound traffic на серверот, доколку па за outbound traffic нема никакви забрани.

Најлесен начин за да го постигнеме ова е со package ufw (uncomplicated firewall).

Ufw го инсталираме со следнава команда:

$ sudo apt install ufw

Местење на ufw

За почеток, можеме да додадеме неколку правила покрај основните што забрануваат inbound traffic и дозволуваат outbound traffic.

Со следниве правила, го дозволуваме следново:

Port 22: SSH

Port 80: HTTP

Port 443: HTTPS

За да дозволиме inbound traffic на претходно наведените портови, ги пишуваме следниве команди:

$ sudo ufw allow ssh

$ sudo ufw allow http

$ sudo ufw allow https

Проверување на правилата

За да провериме дали правилата што сме ги внесиле се во ред, ја пишуваме следнава команда:

$ sudo ufw show added

И треба да го добиеме следново:

ufw allow 22/tcp
ufw allow 80/tcp
ufw allow 443/tcp

💡 Секогаш мораме да бидеме сигурни дека port 22 е отворен за SSH затоа што нема да можеме да влеземе на серверот.

Потврдување на правилата

За да ги потврдиме правилата што ги напишавме претходно и да започнат да работат, ја пишуваме следнава команда:

$ sudo ufw enable
Command may disrupt existing ssh connections. Proceed with operation (y|n)? y 
Firewall is active and enabled on system startup

За конечно да провериме кои правила сме ги напишале, ја внесуваме оваа команда:

$ sudo ufw status verbose

Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), disabled (routed)
New profiles: skip

To                         Action      From
--                         ------      ----
22/tcp                     ALLOW IN    Anywhere                  
80/tcp                     ALLOW IN    Anywhere                  
443                        ALLOW IN    Anywhere                  
22/tcp (v6)                ALLOW IN    Anywhere (v6)             
80/tcp (v6)                ALLOW IN    Anywhere (v6)             
443 (v6)                   ALLOW IN    Anywhere (v6)   

Местење на fail2ban

Покрај местење на firewall на нашиот сервер, можеме исто така да инсталираме package со којшто ќе му забраниме на секој корисник што ќе проба да влезе на серверот преку SSH повеќе од 6 пати и нема да успее. После шестиот неуспешен обид ќе му биде забрането да влезе за 10 минути.

За да го инсталираме fail2ban, ја пишуваме следнава команда:

$ sudo apt install fail2ban

За да започне да работи, ја внесуваме уште следнава команда:

$ sudo service fail2ban start

Местење на node со nvm (node version manager)

Прво правиме надоградување на системот со sudo apt update и sudo apt upgrade:

$ sudo apt update

# Ја внесуваме лозинката

$ sudo apt upgrade

# Даваме дозвола со y ако бара системот

Го инсталираме cURL што се користи за спуштање на содржини од интернет преку command line:

$ sudo apt-get install curl

Го инсталираме NVM што значи Node Version Manager. Со NVM можеме слободно да ја менуваме верзијата на Node што сакаме да ја користиме, затоа што различни проекти и алатки функционираат само со одредена верзија на Node.

# Ја внесуваме следнава команда и го инсталираме nvm

curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.2/install.sh | bash

Проверуваме која верзија на node ја имаме инсталирано со командата nvm ls (nvm list). Не треба да имаме ниту една верзија на Node инсталирана.

$ nvm ls

# Ако добиеме command not found, тогаш го ресетираме серверот со reboot командата.

# Инаку треба да ги добиеме следниве линии на код, ако се функционира

            N/A
iojs -> N/A (default)
node -> stable (-> N/A) (default)
unstable -> N/A (default)

За да ја инсталираме LTS верзијата (најчесто се користи во production апликации) на Node пишуваме nvm install –lts

$ nvm install --lts

Installing latest LTS version.
Downloading and installing node v18.12.1...
Downloading https://nodejs.org/dist/v18.12.1/node-v18.12.1-linux-x64.tar.xz...
################################################################################################## 100.0%
Computing checksum with sha256sum
Checksums matched!
Now using node v18.12.1 (npm v8.19.2)
Creating default alias: default -> lts/* (-> v18.12.1)

Проверуваме која верзија на node и npm ги користиме:

$ node -v или node --version

v18.12.1

$ npm -v 

8.19.2

Користење на nvm

За да користиме специфична верзија на некој проект, правиме нов фолдер и внатре ја избираме верзијата што ја сакаме со командата nvm use node (моменталната најнова верзија) или nvm use –lts (за LTS верзијата)

$ pwd ; ls ; mkdir node-test -v ; ls

/home/andrijan
mkdir: created directory 'node-test'
node-test

$ cd node-test

# Ја инсталираме најновата верзија во моментот на пишување

$ nvm install 19.2.0

Downloading and installing node v19.2.0...
Downloading https://nodejs.org/dist/v19.2.0/node-v19.2.0-linux-x64.tar.xz...
######################################################################### 100.0%
Computing checksum with sha256sum
Checksums matched!
Now using node v19.2.0 (npm v8.19.3)

$ node -v

v19.2.0

# Промена на верзијата во LTS

$ nvm use --lts

Now using node v18.12.1 (npm v8.19.2)

Местење на git

Надградување на системот

Ги внесуваме следниве две команди во терминалот, за да го надградиме нашиот систем:

$ sudo apt update

$ sudo apt upgrade

Инсталирање на git

Најверојатно git е веќе инсталиран на нашата Linux дистрибуција, но за да бидеме сигурни дека ја користиме најновата верзија на Git, ги внесуваме следните команди:

$ sudo add-apt-repository ppa:git-core/ppa

$ sudo apt update

$ sudo apt install git

Проверување на верзија на git

$ git --version

git version 2.38.1

Подесување на git

За git да работи правилно, мораме да му дадеме до знаење на програмата кој сме ние.

Кога работиме во екипа, членовите на екипата ќе можат со овие податоци да препознаат кој додавал и променувал код во датотеките.

Со следниве команди ќе го наместиме git и ќе кажеме кои сме ние.

$ git config --global user.name "Your Name"

$ git config --global user.email "[email protected]"
$ git config --global user.name "Andrijan Tasevski"

$ git config --global user.email "[email protected]"

Ги заменуваме информациите во наводниците со нашите информации. Напомена: наводниците мора да бидат вклучени.

Пред кратко, GitHub ги промени “default branches” на секој “repository” од master во main. За да ја промениме “default branch” на Git, ја користиме следнава команда:

$ git config --global init.defaultBranch main

За да добиваме работи испишани во боја, ја внесуваме следнава команда:

$ git config --global color.ui auto

За да бидеме сигурни дека поставувањата и податоците што ги внесивме до сега се точни, ги пишуваме следниве две команди:

$ git config --get user.name

Andrijan Tasevski

$ git config --get user.email

[email protected]

Инсталирање и користење на pm2

Pm2 е најпопуларна алатка за менаџирање на node.js апликации/процеси кои сакаме да работат во позадина на нашиот сервер. Поточно кажано, pm2 e daemon што значи дека тоа е програма што работи во позадина и не е нешто што ние го контролираме директно.

Со pm2 можеме да ја пуштиме апликацијата да работи, да гледаме колку меморија користи во одреден момент, да читаме logs и уште многу други работи.

Местење на pm2

Инсталирање и надградување на pm2 e многу лесно и се извршува со npm. Не треба да се грижиме да не се случи нешто со постари апликации што ги имаме затоа што pm2 е backwards compatible, што значи дека промените во понови верзии на pm2 нема да ја скршат нашите апликации.

Инсталираме pm2 со следнава команда:

$ npm install pm2@latest -g

Го ажурираме процесот на pm2 во нашата меморија (доколку надградуваме):

$ pm2 update

Пуштање на апликација

За да пуштиме некоја апликација да работи, ја користиме следнава команда:

$ pm2 start <именадатотека>

$ pm2 start index.js

Исто така можеме да ја именуваме апликацијата за да ја препознаваме полесно во pm2 со —name flag-от:

$ pm2 start <именадатотека> --name <именаапликација>

$ pm2 start index.js --name nextjsapp

За pm2 да ја следи апликацијата и да ја ресетира апликација на секоја промена на некои од датотеките го пишуваме —watch flag-от:

$ pm2 start <именадатотека> --watch

Проверување дали pm2 работи

За да провериме дали pm2 работи, ја пишуваме следнава команда:

$ pm2 ping

Ресетирање на апликација

За да ресетираме апликација со pm2, го пишуваме следново:

$ pm2 restart <именаапликација>

Ако сакаме да ја ресетираме апликација со 0s downtime ја користиме оваа команда:

$ pm2 reload <именаапликација>

Стопирање на апликација

За да стопираме аликација, го пишуваме следново:

$ pm2 stop <именаапликација>

Бришење на апликација

За да избришеме апликација, го пишуваме следново:

$ pm2 delete <именаапликација>

Проверување на статусот на апликација

За да провериме кои апликации се активни на нашиот сервер, колку меморија користат, колку долго време не се исклучени, ја користиме следнава команда:

# Избираме едно од list, ls или status

$ pm2 [list|ls|status]

За уште подобар и попрегледен преглед на апликации што се активни, го пишуваме следново:

$ pm2 monit

Читање на logs

За да прочитаме logs од апликација, го пишуваме следново:

$ pm2 logs

Затоа што оваа команда ги враќа најновите logs, не можеме да прочитаме некои постари. Ако сакаме да прочитаме постари logs, ја пишуваме истата команда, но го додаваме —lines flag-от:

$ pm2 logs --lines 1000

Вклучување на pm2 кога серверот се ресетира/исклучи

Некогаш може нашиот сервер да се исклучи или ресетира поради различни причини (немало струја, надоградување на системот). За да се вклучи pm2 автоматски после такви настани, можеме да ја напишеме следнава команда што ќе ни испечати bash скрипта којашто треба да ја извршиме во терминалот:

$ pm2 startup

[PM2] Init System found: systemd
[PM2] To setup the Startup Script, copy/paste the following command:

# Ја копираме скриптата и правиме paste во терминалот и ја извршуваме
sudo env PATH=$PATH:/home/andrijan/.nvm/versions/node/v18.12.1/bin /home/andrijan/.nvm/versions/node/v18.12.1/lib/node_modules/pm2/bin/pm2 startup systemd -u andrijan --hp /home/andrijan

За да ја избришеме скриптата што би го вклучувал pm2 секој пат кога серверот ќе се исклучи/ресетира, пишуваме:

$ pm2 unstartup

[PM2] Init System found: systemd
[PM2] To unsetup the Startup Script, copy/paste the following command:

# Ја копираме скриптата и правиме paste во терминалот и ја извршуваме
sudo env PATH=$PATH:/home/andrijan/.nvm/versions/node/v18.12.1/bin /home/andrijan/.nvm/versions/node/v18.12.1/lib/node_modules/pm2/bin/pm2 unstartup systemd -u andrijan --hp /home/andrijan

Осврт на pm2 команди

Подолу можеме да најдеме корисни команди со кратки објаснувања:

# Инсталирање на pm2

npm install pm2@latest -g

# Пуштање на апликација

pm2 start index.js

# Пуштање на апликација и именување

pm2 start index.js --name nextjsapp

# Пуштање на апликација и следење на датотеките

pm2 start index.js --watch

# Ресетирање на апликација

pm2 restart nextjsapp

pm2 restart 0 # Ресетирање со индекс

pm2 restart all # Ресетирање на сите апликации од pm2

pm2 reload nextjsapp # Ресетирање со 0s downtime

# Стопирање на апликација

pm2 stop nextjsapp

pm2 stop 0 # Стопирање со индекс

# Бришење на апликација

pm2 delete nextjsapp

pm2 delete 0 # Бришење со индекс

# Статус на апликација

pm2 [list|ls|status]

pm2 monit # За dashboard 

# Читање на logs

pm2 logs

pm2 logs --lines 1000 # За поопширен преглед на logs

# Правење на startup скрипта

pm2 startup

# Бришење на startup скрипта

pm2 unstartup

Местење на nginx и користење на nginx со node апликации

Наскоро…

Cron и како да добиеме известување кога ќе се изврши секој cron job

Cron е daemon (програма што се извршува во позадина) којшто ни помага автоматски да извршуваме парче код на одреден временски интервал. На пример, можеме да правиме GET request до сервер секои 60 секунди.

Секој посебен cron најчесто се вика cron job.

Инсталирање на cron

За да го инсталираме cron, ги пишуваме следниве команди:

$ sudo apt update

$ sudo apt install cron

Го активираме cron:

$ sudo systemctl enable cron

Основи на cron

Сите cron jobs коишто ќе ги направиме, ги менаџираме од датотека што се вика crontab. За да пристапиме до истата, ја користиме командата: crontab -e.

Во датотеката crontab го пишуваме кодот којшто сакаме да се извршува.

Секој cron job се содржи од два дела:

Временскиот интервал (односно колку често да се извршува парчето код) и парчето код што треба да се изврши.

# Пример за команда

0 0 * * SUN curl http://localhost:3000/ # Прави GET request секоја недела во 00:00 часот

Временски интервал

Временскиот интервал може да ги содржи следните вредности (секогаш мора да бидат во тој редослед):

минута час ден_од_месец месец ден_од_недела

(0-59) (0-23) (1-31) (1-12 или JAN-DEC) (0-6 или SUN-SAT)

За некои временски интервали што се користени многу често, cron нуди кратенки:

@hourly - Секој час

@daily - Секој ден

@weekly - Секоја недела

@yearly или @annually - Секоја година

@reboot - Секогаш кога системот ќе се ресетира

Пример за команда со кратенка:

@hourly curl http://localhost:3000/ # Прави GET request секој час

💡 За да го провериме временскиот интервал што сме го напишале на полесен начин можеме да ја искористеме следнава алатка: https://crontab.guru/

Kоманда

Командата е парчето код којшто сакаме да се изврши. Ја пишуваме одма после временскиот интервал.

0 0 * * 1 curl http://localhost:3000/ # Прави GET request секој понеделник во 00:00 часот

Користење на cron

За да го напишеме нашиот прв cron job, ја отвораме датотеката crontab со следната команда:

$ crontab -e

Потоа, cron ќе не праша кој editor сакаме да го користиме. Секој editor има свој број, а ние ќе го избереме nano затоа што е најлесен за работа (како и што пишува подолу).

no crontab for andrijan - using an empty one

Select an editor.  To change later, run 'select-editor'.
  1. /bin/nano        <---- easiest
  2. /usr/bin/vim.tiny
  3. /usr/bin/code
  4. /bin/ed

Choose 1-4 [1]: 1

Овој prompt го добиваме само првиот пат кога ќе го отвориме cron.

По избирањето на editor-от, ќе се отвори датотеката crontab во editor-от којшто сме избрале. Во датотеката добиваме кратко упатство како да напишеме cron job.

Слегуваме со курсорот најдолу од датотеката и додаваме го нашиот cron job.

# Edit this file to introduce tasks to be run by cron.
# 
# Each task to run has to be defined through a single line
# indicating with different fields when the task will be run
# and what command to run for the task
# 
# To define the time you can provide concrete values for
# minute (m), hour (h), day of month (dom), month (mon),
# and day of week (dow) or use '*' in these fields (for 'any').
# 
# Notice that tasks will be started based on the cron's system
# daemon's notion of time and timezones.
# 
# Output of the crontab jobs (including errors) is sent through
# email to the user the crontab file belongs to (unless redirected).
# 
# For example, you can run a backup of all your user accounts
# at 5 a.m every week with:
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
# 
# For more information see the manual pages of crontab(5) and cron(8)
# 
# m h  dom mon dow   command

* * * * * echo "Hello World!" >> /home/andrijan/cron.log # Секоја минута запишувај Hello World во cron.log датотеката

Потоа притискаме CTRL + X, потоа Y и потоа ENTER за да го зачуваме нашиот cron job.

Чекаме да помине една минута, па проверуваме дали во нашата датотека се запиша Hello World.

$ cd /home/andrijan/ # Одиме во папката home на корисникот andrijan

$ pwd # Проверуваме дали сме во правата папка

$ cat cron.log # Проверуваме дали се запиша Hello World во cron.log датотеката

Hello World!
Hello World!

💡 За да го избришеме нашиот cron job, повторно ја отвораме датотеката crontab со командата crontab -e и го отстрануваме нашиот cron job.

Известување и запишување на извршен cron jobs

Ако сакаме да запишеме во одредена датотека или да бидеме известени секој пат кога ќе се изврши нашиот cron job, можеме да го направиме следново:

Запишување во датотека

Со командава подолу ќе се запишуваат сите извршени cron jobs во датотеката cron.log. Во случајов тоа ќе биде response-от од нашиот GET request.

@daily curl http://localhost:3000/ >> /home/andrijan/cron.log

Известување преку email

За разлика од запишувањето во датотека, известувањето преку email не е толку едноставно затоа што треба да се подеси услуга што ќе ги испраќа секој email.

💡 За да прочитаме како да го подесиме Postfix (алатка која ни помага да испраќаме email), https://tonyteaches.tech/postfix-gmail-smtp-on-ubuntu/

Кога ќе ја подесиме услугата, тогаш добивање на известување преку email е многу едноставно:

MAILTO="[email protected]" # Го заменуваме со нашиот email
@daily curl http://localhost:3000/

Осврт на команди

Подолу можеме да најдеме корисни команди со кратки објаснувања:

# Отвори ја датотеката crontab

crontab -e

# Прикажи ги сите cron jobs

crontab -l

# Избриши ги сите cron jobs

crontab -r -i