Местење на основни конфигурации на DigitalOcean
-
Во менито на левата страна на DigitalOcean ја бараме опцијата Droplets и ја отвараме.
-
Потоа притискаме на копчето Create Droplet.
-
Го избираме оперативниот систем што сакаме да го инсталираме на нашиот сервер. Тоа може да биде различна дистрибуција на Linux или некој image од DigitalOcean marketplace во зависност од нашата потреба за апликацијата што ја градиме. Во случајов јас ќе го изберам Ubuntu 22.04 затоа што е LTS (Long Term Support) до 2027 и има добра поддршка од девелопери.
-
Ја избираме целта на серверот (дали ни треба основен сервер, со повеќе процесори, со повеќе РАМ меморија итн.) во зависност од потребите на апликацијата.
-
Ги избираме перформансите на серверот. Јас ќе изберам Premium NVMe SSD Intel сервер со 1GB RAM затоа што NVMe SSD имаат најголема брзина и разликата е само $1.
-
Потоа избираме локација каде што сакаме нашиот сервер да се наоѓа. Јас ќе изберам Франкфурт затоа што е најблиску до мојата локација во Европа. Најчесто избираме локација на серверот каде што се наоѓа најголемиот дел од нашата целна публика, затоа што податоците не треба да патуваат од едната страна на светот до другата.
-
Потоа мора да избериме начин како ќе пристапуваме на серверот. Односно дали тоа ќе биде преку SSH keys или со лозинка. Не е препорачливо да користиме лозинка за сервер, туку секогаш треба да користиме SSH. Голем плус е тоа што нема потреба да пишуваме username и password секој пат кога сакаме да влегуваме на нашиот сервер. Во овој случај јас ќе изберам password за root корисникот, но подоцна тоа ќе го избришеме на серверот и пристапот ќе биде можен само преку SSH.
-
Во додатните опции ја избираме уште Monitoring опцијата.
-
Конечно притискаме на копчето, Create Droplet.
Прво влегување на серверот
Влегување на серверот со 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