Ubuntu – jak spustit script po startu systému – služba

Pro spuštění skriptu po startu systému na Raspberry Pi s operačním systémem Ubuntu, můžete využít službu systému systemd. systemd je systémový a službový správce většiny moderních linuxových distribucí, včetně Ubuntu.

  1. Vytvořte skript, který chcete spustit po startu systému. Scriptu musíte nastavit oprávnění pro spuštění. Například, pokud máte skript ble-advertisements.py, ujistěte se, že má správná oprávnění pro spuštění: chmod +x ble-advertisements.sh.
  2. Vytvořte systemd službu. Vytvořte nový soubor s příponou .service ve složce /etc/systemd/system/. Můžete to provést například pomocí editoru vim:
sudo vim /etc/systemd/system/ble-advertisements.service

V tomto souboru jsou informace o službě:

[Unit]
Description=BLE advertisements

[Service]
ExecStart=/home/ubuntu/scripts/ble-advertisements.sh
WorkingDirectory=/home/ubuntu/scripts
Restart=always
User=ubuntu

[Install]
WantedBy=multi-user.target

Souboru nastave oprvávnění pro spuštění:

sudo chmod ugo+x /etc/systemd/system/ble-advertisements.service

Upravte následující informace podle vašich potřeb:

  • Description – Popis vaší služby.
  • ExecStart – Cesta k vašemu skriptu, který chcete spustit.
  • WorkingDirectory – Volitelně, cesta k pracovní složce, kde se skript spouští.
  • User – Uživatel, pod kterým chcete spustit skript. Zde je uveden uživatel „ubuntu“, ale upravte jej podle vašich potřeb.

Aktualizujte systemd a povolte vaši službu:

sudo systemctl daemon-reload
sudo systemctl enable ble-advertisements.service

Restartujte zařízení. Po restartu se služba automaticky spustí:

sudo reboot

Sledování statvu služby

systemctl status ble-advertisements.service

journalctl -u ble-advertisements.service

Změny stavu služby

systemctl restart ble-advertisements.service
systemctl stop ble-advertisements.service
systemctl start ble-advertisements.service

Redis v kontejneru

Redis (zkratka z anglického „Remote Dictionary Server“) je open-source in-memory key-value úložiště (NoSQL databáze) s otevřeným zdrojovým kódem. Redis byl původně vytvořen jako rychlý a efektivní způsob ukládání a získávání dat v paměti (in-memory database) pro zlepšení výkonu webových aplikací. Často se používá pro ukládání cache.

In-Memory storage: Redis ukládá data přímo v paměti, což ho dělá extrémně rychlým. To z něj činí vhodný nástroj pro cache, rychlé ukládání a získávání dat a další aplikace, které vyžadují nízkou latenci.

Key-Value store: Redis ukládá data ve formátu klíč-hodnota, to znamená, že každý záznam má jedinečný klíč, pod kterým je uložen. Data jsou obvykle binární nebo textové, a Redis umožňuje rychlé vyhledávání a získávání dat na základě klíče.

Podpora datových struktur: Redis nepodporuje pouze jednoduché hodnoty, ale také různé datové struktury jako seznamy, množiny, hashovací mapy a další. To umožňuje složitější operace s daty a efektivní manipulaci s nimi.

Pub/Sub mechanismus: Redis umožňuje publikování a odběr zpráv, to je užitečné pro asynchronní komunikaci mezi částmi aplikace.

Perzistence dat: Redis umožňuje volitelnou perzistenci dat na disk, což zajišťuje, že data nejsou ztracena po restartu serveru.

Clustering: Redis podporuje klustering, to umožňuje škálovat databázi na více serverů a zlepšit výkon a dostupnost.

Redis je často používán pro ukládání chache, asynchronní fronty zpráv, čítačky stavů a mnoho dalších aplikací, které vyžadují rychlé ukládání a získávání dat. Jeho jednoduchý a efektivní design ho činí oblíbeným nástrojem pro vývojáře v celé řadě aplikací a scénářů.

Založíme soubor docker-compose.yml :

version: '3.8'

services:
  redis:
    image: "redis:latest"
    container_name: redis
    ports:
      - "6379:6379"

Spustíme příkazem: docker-compose up nebo na pozadí příkazem: docker-compose up -d

Node,js PM2

PM2 (Process Manager 2) je správce procesů pro Node.js, který vám pomůže spravovat a udržovat vaše aplikace v chodu. Pojďme se podívat na základy.

Instalace

npm install pm2 -g

Spuštění aplikace

pm2 start app.js

Správa aplikací

$ pm2 restart app_name
$ pm2 reload app_name
$ pm2 stop app_name
$ pm2 delete app_name

app_name nahraďte:

  • all pro všechny aplikace
  • id konkrétního procesu

Seznam spravovaných aplikací

Krásně vidíte status aplikace, přidělený výkon procesoru a paměti

pm2 [list|ls|status]

Zobrazení logu

pm2 logs

Zobrazení staršího logu:

pm2 logs --lines 200

Zobrazení řídícího panelu zobrazující realtime data z aplikace

pm2 monit

Debian – LXDE + X2Go

Pokud máte VPS s Ubuntu a z nějakého důvodu potřebujete grafický desktop, vyhází mi výkonově nejlépe LXDE + X2Go.

Instalace LXDE

sudo apt-get update 
sudo apt-get upgrade 
sudo apt-get install lxde

Instalace X2Go

sudo apt-get install software-properties-common 
sudo add-apt-repository ppa:x2go/stable 
sudo apt-get install x2goserver x2goserver-xsession

Zkontrolujeme status X2Go:

systemctl status x2goserver

X2Go klient pro Windows

V mém případě se budu připojovat z Windows, klienta stáhnu z https://wiki.x2go.org/doku.php/download:start (X2Go Client -> mswin)

Problémy

Connection failed. mesg: ttyname failed: Inappropriate ioctl for device

1) editujeme soubor /root/.profile
2) zakomentujeme řádek: mesg n || true (komentář je #), takže: #mesg n || true
3) přidáme: tty -s && mesg n

Raspberry Pi 3 B+ : watchdog

Pro čtení dat z meteostanice a následné odeslání na server posílám Raspberry Pi 3 B+. Super levný pracant s dostačujícím výkonem. Bohužel, několikrát měsíčně „vytuhne“ a neposílá meteo data na server.

Co je to watchdog?

Watchdog, zkráceně WDT (z angličtiny – „hlídací pes“) je obvod/periferie, která resetuje systém při jeho zacyklení. K zacyklení systému může dojít v důsledku chyby v hardware nebo software systému.

Instalujeme watchdog

modprobe bcm2835_wdt 
echo "bcm2835_wdt" | sudo tee -a /etc/modules
sudo apt-get install watchdog 
sudo update-rc.d watchdog defaults

Upravíme konfigurační soubor:
vim /etc/watchdog.conf

Ve kterém odkomentujeme tyto řádky (odebereme # na začátku řádku):
#watchdog-device
#max-load-1

Dále do konfiguračního souboru přidáme řádek:
watchdog-timeout = 15

Konfigurační soubor uložíme, restartujeme raspberry.

Otestovat můžeme příkazem:

:(){ :|:& };:

Vidíte, že tento příkaz systém zahltí. Po chvíli vás odpojí od Putty a pak přestane odpovídat na ping – zafungoval watchdog a probíhá restart. Po restartu Raspberry opět naběhne

Jak jsem nasadil Let’s Encrypt 2

Možná si ještě vzpomínáte na můj první článek o tom, Jak jsem nasadil Let’s Encrypt. Jo, nebyl příliš jednoduchý ale zase jste věděli co se vám na serveru děje. Dneska ukáži jednodušší způsob: Cerbot.

Instalace

apt-get install python-certbot-apache

Automatická instalace certifikátů a nastavení Apache:

certbot --apache

Pokud jste konzervativní a nechcete aby vám Cerbot zasahoval do konfigurace Apache, přidejte k příkazu certonly:

certbot --apache certonly

Po spuštění se zobrazí průvodce, který požaduje váš e-mail a nalezne všechny virtualhosty na serveru a nabídne pro ně vygenerování certifikátů. Vyberete ty, které chcete použít.

Certifikáty jsou poté vygenerovány do: /etc/letsencrypt/live/www.jmeno-domeny.cz/fullchain.pem

Obnovení platnosti certifikátu

Let’s Encrypt vydává certifikáty s platností 90 dní. Obnova certifikátů se provádí příkazem:

certbot renew --dry-run

If that appears to be working correctly, you can arrange for automatic renewal by adding a cronor systemd job which runs the following:

certbot renew

Vygenerování nového certifikátu

certbot --apache -d example.com -d www.example.com

Edit 5.5.2019
Certifikáty je nutné generovat jiným příkazem. Lets’s encrypt přestal používat šifrování HTTP-01 a přešel naTLS-SNI-01. Certifikát vygenerujeme:

certbot --authenticator standalone --installer apache -d venca-x.cz -d www.venca-x.cz --pre-hook "systemctl stop apache2" --post-hook "systemctl start apache2"



Debian 9: jak nastavit IPv6

Pokud váš poskytovatel připojení internetu nabízí IPv6, zde je ukázka nastavení. Tato konfigurace se provede i po restartu serveru.

vim /etc/network/interfaces

    iface eth0 inet6 static
        address 2001:db8::c0ca:1eaf
        netmask 64
        gateway 2001:db8::1ead:ed:beef
        dns-nameservers 2001:4860:4860::8844 2001:4860:4860::8888

Aby se změna projevila, je nutné restartovat interface

/etc/init.d/networking restart

Pokud jsme přihlášeni přes Putty, bude spojení přerušeno a je nutné se znovu připojit.

Správnou konfiguraci zjistíme příkazem:

ip address show

Správné nastavení ověříme pingem:

ping6 ipv6.google.com

 

Debian 9 (stretch) – instalace php 7.1

V poslední verzi Debianu Stretch je defaultně php 7.0, pokud potřebujete novější 7.1, je možné jej bez kompilace zdrojových kódů nainstalovat přes balíčky:

apt-get install apt-transport-https lsb-release ca-certificates
wget -O /etc/apt/trusted.gpg.d/php.gpg https://packages.sury.org/php/apt.gpg
echo "deb https://packages.sury.org/php/ $(lsb_release -sc) main" > /etc/apt/sources.list.d/php.list
apt-get update
apt-get install php7.1

Stejným způsobem nainstalujeme PHP7.2:

apt install php7.2 php7.2-cli php7.2-common php7.2-json php7.2-opcache php7.2-mysql php7.2-zip php7.2-fpm php7.2-mbstring 

Jak jsem nasadil Let’s Encrypt

Dnes si prakticky ukážeme jak zprovoznit Let’s Encrypt na vlastním serveru s Debianem a Apache. Let’s Encrypt je továrna na certifikáty zdarma.

Instalace Let’s Encrypt

git clone https://github.com/letsencrypt/letsencrypt /opt/letsencrypt

Zastavíme Apache

/etc/init.d/apache2 stop
#nebo

systemctl stop apache2.service

Přesvědčíme se že na portu 80 nic neposlouchá:

netstat -na | grep ':80.*LISTEN'

Vygenerování certifikátu

cd /opt/letsencrypt
./letsencrypt-auto certonly --standalone
  1. zadáme email
  2. souhlasíme s podmínkami
  3. zadáme doménová jména pro která chceme certifikát (example.com, www.example.com, app.example.com)
IMPORTANT NOTES:
 - If you lose your account credentials, you can recover through
   e-mails sent to vencax@gmail.com.
 - Congratulations! Your certificate and chain have been saved at
   /etc/letsencrypt/live/www.meducina.cz/fullchain.pem. Your cert will
   expire on 2016-04-14. To obtain a new version of the certificate in
   the future, simply run Let's Encrypt again.
 - Your account credentials have been saved in your Let's Encrypt
   configuration directory at /etc/letsencrypt. You should make a
   secure backup of this folder now. This configuration directory will
   also contain certificates and private keys obtained by Let's
   Encrypt so making regular backups of this folder is ideal.
 - If you like Let's Encrypt, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

Opět spustíme Apache

/etc/init.d/apache2 start

Certifikáty byly vytvořeny do složky:

ls -al /etc/letsencrypt/live/www.your_domain_name.com

Do Apache pak stačí pouze přidat (základní nejjdnodužší nastavení):

vim meducina.cz-ssl.conf:

<VirtualHost *:443>
    ServerAdmin webhosting@ukaztese.cz
    ServerName  meducina.cz
    ServerAlias *.meducina.cz
    DocumentRoot /var/www/meducina.cz/web/www/www

    SSLEngine on
    SSLCertificateFile "/etc/letsencrypt/live/www.meducina.cz/cert.pem"
    SSLCertificateKeyFile "/etc/letsencrypt/live/www.meducina.cz/privkey.pem"
</VirtualHost>

Přidáme tuto konfiguraci:

cd /etc/apache2/sites-enabled
a2ensite meducina.cz-ssl

Restartovat Apache a je to 🙂

Ovšem doporučuji Apache nastavit pořádně. K tomu pomůže Generator Mozilla Security (musel jsem povolit a2enmod headers). Takto mi to funguje

#Listen 443
<VirtualHost *:443>
    ServerAdmin webhosting@ukaztese.cz
    ServerName  meducina.cz
    ServerAlias *.meducina.cz
    DocumentRoot /var/www/meducina.cz/web/www/www

    SSLEngine on
    SSLCertificateFile      "/etc/letsencrypt/live/www.meducina.cz/cert.pem"
    SSLCertificateKeyFile   "/etc/letsencrypt/live/www.meducina.cz/privkey.pem"
    SSLCACertificateFile    "/etc/letsencrypt/live/www.meducina.cz/fullchain.pem"

    # HSTS (mod_headers is required) (15768000 seconds = 6 months)
    Header always set Strict-Transport-Security "max-age=15768000"
</VirtualHost>



# intermediate configuration, tweak to your needs
SSLProtocol             all -SSLv3
SSLCipherSuite          ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:ECDHE-RSA-DES-CBC3-SHA:ECDHE-ECDSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA
SSLHonorCipherOrder     on
    SSLCompression          off
#    SSLSessionTickets       off   #WTF - why don't work?

    # OCSP Stapling, only in httpd 2.3.3 and later
    SSLUseStapling          on
    SSLStaplingResponderTimeout 5
    SSLStaplingReturnResponderErrors off
SSLStaplingCache        shmcb:/var/run/ocsp(128000)

Přesměrování na https

Veškerý traffic přesměrujeme na http

<VirtualHost *:80>

#...
    #redirect to https
    RewriteCond %{HTTPS} off
    RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
#...

</VirtualHost>

 

Obnova certifikátů

Doporučuji si udělat symlink aby příkaz letsencrypt-auto fungoval kdekoliv z příkazové řádky:

ln -s /opt/letsencrypt/letsencrypt-auto /usr/local/bin/letsencrypt-auto

Certifikáty jsou vystavené pouze s platností 90 dnů! Zároveň je doporučováno je každých 60 dnů obnovit. Aktualizace certifikátů zatím stále není k dispozici, ale certifikát obnovíme opětovným spuštěním příkazů uvedených výše.

 

Pravidelná aktualizace certifikátů

Abychom nemuseli myslet na pravidelnou aktualizaci certifikátů, přidáme záznam do cornu, který nám je bude automaticky aktualizovat:

crontab -e

Obnovu certifikátů budeme spouštět každý první den v sudém měsíci ve 4:00 ráno:

0 4 1 */2 * cd /opt/letsencrypt && ./letsencrypt-auto certonly --apache --renew-by-default --apache -d www.meducina.cz >> /var/log/letsencrypt/meducina.cz-renew.log 2>&1
0 4 1 */2 * cd /opt/letsencrypt && ./letsencrypt-auto certonly --apache --renew-by-default --apache -d www.vhazovani.cz >> /var/log/letsencrypt/meducina.cz-renew.log 2>&1
0 4 1 */2 * letsencrypt-auto certonly --apache --renew-by-default --apache -d www.protivinsko.cz >> /var/log/letsencrypt/protivinsko.cz-renew.log 2>&1

To je vše. Není nutné restartovat Apache

Ovšem lepší je dát do cronu pouze 1 script, který bude automaticky obnovovat certifikáty:

0 4 1 */2 * /root/letsencrypt-renew

vim /root/letsencrypt-renew

#!/bin/bash

/opt/letsencrypt/letsencrypt-auto certonly --apache --renew-by-default --apache -d www.meducina.cz >> /var/log/letsencrypt/meducina.cz-renew.log 2>&1

/opt/letsencrypt/letsencrypt-auto certonly --apache --renew-by-default --apache -d www.vhazovani.cz >> /var/log/letsencrypt/vhazovani.cz-renew.log 2>&1

/opt/letsencrypt/letsencrypt-auto certonly --apache --renew-by-default --apache -d www.protivinsko.cz >> /var/log/letsencrypt/protivinsko.cz-renew.log 2>&1

/opt/letsencrypt/letsencrypt-auto certonly --apache --renew-by-default --apache -d www.mamejidlo.cz >> /var/log/letsencrypt/mamejidlo.cz-renew.log 2>&1

Nastavit oprávnění pro spouštění:

chmod oug+x letsencrypt-renew