Installazione¶
Questa guida illustra come installare interamente N.E.S.T. su un server Linux.
Prerequisiti¶
Per installare ed eseguire N.E.S.T., è necessario:
Una connessione a Internet
Un sistema operativo Linux-based (preferibilmente Arch Linux)
Creare un nuovo utente¶
Per motivi di sicurezza, si suggerisce di creare un nuovo utente con il quale eseguire il progetto:
Nota
È necessario essere amministratori di sistema per eseguire i seguenti comandi. Si veda il manuale di useradd per più dettagli.
root:~# mkdir --parents /srv/nest
root:~# useradd --home-dir /srv/nest --shell /bin/bash nest
root:~# chown --recursive nest: /srv/nest
Scaricare il codice sorgente¶
Per installare N.E.S.T., è necessario avere il codice sorgente disponibile sul server.
Si consiglia di scaricarlo tramite Git:
nest:~$ git clone https://gitlab.steffo.eu/nest/g2-progetto.git
Questo creerà una nuova cartella g2-progetto
nella directory in cui è stato eseguito il comando.
Per proseguire, sarà necessario entrarvi:
nest:~$ cd g2-progetto
Creare il database¶
N.E.S.T. necessita di un database PostgreSQL in cui salvare i dati.
Per motivi di sicurezza, si suggerisce di creare un ruolo isolato dal resto del DBMS apposta per N.E.S.T.:
postgres:~$ createuser nest
Per creare il database PostgreSQL, si esegua:
postgres:~$ createdb --owner=nest nest
Creare un file di configurazione per il backend¶
Il backend usa un file di configurazione per impostare certe variabili.
Si crei un nuovo file nella working directory del progetto denominato config.py
:
nest:~/g2-progetto$ vim config.py
Il file dovrà avere i seguenti contenuti:
# Una stringa rappresentante il database da utilizzare
# Per maggiori informazioni sulla sintassi, si veda https://docs.sqlalchemy.org/en/14/core/engines.html
SQLALCHEMY_DATABASE_URI = "postgresql://nest@/nest"
# Una stringa casuale utilizzata per generare i JSON Web Token (JWT)
# Va mantenuta segreta e costante per tutta l'operazione del backend!
# Si suggerisce di premere tasti casuali sulla tastiera finchè la riga non è piena.
SECRET_KEY = "dsjiofgvinmodfiojvbnio3erfnoiweraqugu43ghjwrevniuwerng43iugnreuwignhritmj43i43nb8i42ug0wevkwovmwigtjj"
Installare le dipendenze Python¶
Le dipendenze Python sono gestite da Poetry, e possono essere installate con:
nest:~/g2-progetto$ poetry install
Poetry creerà automaticamente un venv e vi installerà all’interno tutti i pacchetti necessari all’esecuzione del backend e del crawler di N.E.S.T. .
Segnatevi il nome del venv creato da Poetry, in quanto sarà necessario per Creare un servizio SystemD per il backend:
Creating virtualenv nest-7C2fm2VD-py3.9 in /srv/nest/.cache/pypoetry/virtualenvs
Installare le dipendenze NodeJS¶
Le dipendenze NodeJS sono gestite da npm, e possono essere installate con:
nest:~/g2-progetto$ npm install
npm creerà automaticamente una cartella node_modules e vi installerà all’interno tutte le librerie necessarie all’esecuzione del frontend di N.E.S.T. .
Creare un servizio SystemD per il backend¶
Per fare in modo che il backend rimanga attivo in background, anche dopo un riavvio, si suggerisce di installarlo come servizio di sistema di SystemD:
root:~# systemctl edit --force --full nest-backend
Inserire all’interno del file le seguenti direttive:
[Unit]
Description=N.E.S.T. Backend
Wants=network-online.target postgresql.service
After=network-online.target nss-lookup.target postgresql.service
[Service]
Type=exec
User=nest
Group=nest
WorkingDirectory=/srv/nest/g2-progetto
# Si sostituisca a questo il percorso del virtualenv creato in precedenza da Poetry
# ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
ExecStart=/srv/nest/.cache/pypoetry/virtualenvs/nest-7C2fm2VD-py3.9/bin/python -m gunicorn -b 127.0.0.1:30040 --env="FLASK_CONFIG=../config.py" nest_backend.app:rp_app
[Install]
WantedBy=multi-user.target
Ora, si verifichi che il servizio si avvii correttamente eseguendolo manualmente con:
root:~# systemctl start nest-backend
In caso di successo, l’API dovrebbe essere esposto sulla porta 30040
dell’indirizzo di loopback 127.0.0.1
:
root:~# curl 127.0.0.1:30040/doa
If you see this, the server is fine.
Si abiliti il servizio, in modo che venga automaticamente avviato al riavvio del sistema:
root:~# systemctl enable nest-backend
Compilare il frontend¶
Perchè sia possibile servire il frontend agli utenti, è necessario prima crearne una versione compilata ottimizzata.
È possibile farlo con il comando:
nest:~/g2-progetto$ npm run build
Verrà creata una cartella build
con all’interno la versione compilata.
Creare un servizio SystemD per il frontend¶
Per rendere disponibile alla rete la copia locale del frontend, si suggerisce di avviare lo script npm serve
integrato con N.E.S.T. come un servizio di sistema di SystemD:
root:~# systemctl edit --force --full nest-frontend
Inserire all’interno del file le seguenti direttive:
[Unit]
Description=N.E.S.T. Frontend
Wants=network-online.target nest-backend.service
After=network-online.target nss-lookup.target nest-backend.service
[Service]
Type=exec
Environment=NODE_ENV=production
User=nest
Group=nest
WorkingDirectory=/srv/nest/g2-progetto
ExecStart=/usr/bin/npm run serve
[Install]
WantedBy=multi-user.target
Da fare
Questo file non è stato testato, in quanto sul server demo è in uso una versione più complessa che usa nvm per gestire più versioni di NodeJS sullo stesso sistema.
La versione in uso sul server demo è:
[Unit]
Description=N.E.S.T. Frontend
Wants=network-online.target nest-backend.service
After=network-online.target nss-lookup.target nest-backend.service
[Service]
Type=exec
Environment=NODE_ENV=production
Environment=NODE_VERSION=16
User=nest
Group=nest
WorkingDirectory=/srv/nest/g2-progetto
ExecStart=/srv/nest/.nvm/nvm-exec npm run serve
[Install]
WantedBy=multi-user.target
Ora, si verifichi che il servizio si avvii correttamente eseguendolo manualmente con:
root:~# systemctl start nest-frontend
In caso di successo, il frontend dovrebbe essere esposto sulla porta 30041
dell’indirizzo di loopback 127.0.0.1
:
root:~# curl 127.0.0.1:30041
[...]
Si abiliti il servizio, in modo che venga automaticamente avviato al riavvio del sistema:
root:~# systemctl enable nest-frontend
Creare un servizio SystemD per il crawler¶
Da fare
Il crawler non è ancora disponibile.
Configurare Apache come reverse proxy¶
Per rendere l’API e il frontend disponibili al pubblico, si suggerisce di configurare Apache HTTP Server come reverse proxy.
La configurazione di Apache varia molto da distribuzione a distribuzione Linux, e talvolta anche da server a server; pertanto, si fornisce solamente un file VirtualHost di esempio da adattare al proprio setup:
<VirtualHost *:80>
ServerName "api.nest.steffo.eu"
ServerName "prod.nest.steffo.eu"
RewriteEngine On
RewriteRule ^(.*)$ https://%{HTTP_HOST}$1 [R=301,L]
</VirtualHost>
<VirtualHost *:443>
ServerName "api.nest.steffo.eu"
SSLEngine on
SSLCertificateFile "/root/.acme.sh/*.nest.steffo.eu/fullchain.cer"
SSLCertificateKeyFile "/root/.acme.sh/*.nest.steffo.eu/*.nest.steffo.eu.key"
ProxyPass "/" "http://127.0.0.1:30040/"
ProxyPassReverse "/" "http://127.0.0.1:30040/"
RequestHeader set "X-Forwarded-Proto" expr=%{REQUEST_SCHEME}
Protocols h2 http/1.1
Header always set Strict-Transport-Security "max-age=63072000"
</VirtualHost>
<VirtualHost *:443>
ServerName "prod.nest.steffo.eu"
SSLEngine on
SSLCertificateFile "/root/.acme.sh/*.nest.steffo.eu/fullchain.cer"
SSLCertificateKeyFile "/root/.acme.sh/*.nest.steffo.eu/*.nest.steffo.eu.key"
ProxyPass "/" "http://127.0.0.1:30041/"
ProxyPassReverse "/" "http://127.0.0.1:30041/"
RequestHeader set "X-Forwarded-Proto" expr=%{REQUEST_SCHEME}
Protocols h2 http/1.1
Header always set Strict-Transport-Security "max-age=63072000"
</VirtualHost>