mirror of
https://github.com/pds-nest/nest.git
synced 2024-11-22 21:14:18 +00:00
622 lines
No EOL
32 KiB
HTML
622 lines
No EOL
32 KiB
HTML
|
|
|
|
<!DOCTYPE html>
|
|
<html class="writer-html5" lang="it" >
|
|
<head>
|
|
<meta charset="utf-8" />
|
|
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
|
|
<title>Installazione — N.E.S.T. 0.1.0 documentazione</title>
|
|
|
|
|
|
|
|
<link rel="stylesheet" href="../_static/css/theme.css" type="text/css" />
|
|
<link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
|
|
<link rel="stylesheet" href="../_static/custom.css" type="text/css" />
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<!--[if lt IE 9]>
|
|
<script src="../_static/js/html5shiv.min.js"></script>
|
|
<![endif]-->
|
|
|
|
|
|
<script type="text/javascript" id="documentation_options" data-url_root="../" src="../_static/documentation_options.js"></script>
|
|
<script src="../_static/jquery.js"></script>
|
|
<script src="../_static/underscore.js"></script>
|
|
<script src="../_static/doctools.js"></script>
|
|
<script src="../_static/translations.js"></script>
|
|
|
|
<script type="text/javascript" src="../_static/js/theme.js"></script>
|
|
|
|
|
|
<link rel="index" title="Indice" href="../genindex.html" />
|
|
<link rel="search" title="Cerca" href="../search.html" />
|
|
<link rel="next" title="Aggiornamento" href="updating.html" />
|
|
<link rel="prev" title="Il progetto in breve" href="about.html" />
|
|
</head>
|
|
|
|
<body class="wy-body-for-nav">
|
|
|
|
|
|
<div class="wy-grid-for-nav">
|
|
|
|
<nav data-toggle="wy-nav-shift" class="wy-nav-side">
|
|
<div class="wy-side-scroll">
|
|
<div class="wy-side-nav-search" style="background: #3B7097" >
|
|
|
|
|
|
|
|
<a href="../index.html" class="icon icon-home"> N.E.S.T.
|
|
|
|
|
|
|
|
</a>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<div role="search">
|
|
<form id="rtd-search-form" class="wy-form" action="../search.html" method="get">
|
|
<input type="text" name="q" placeholder="Search docs" />
|
|
<input type="hidden" name="check_keywords" value="yes" />
|
|
<input type="hidden" name="area" value="default" />
|
|
</form>
|
|
</div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
<div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<p class="caption"><span class="caption-text">Manuale utente</span></p>
|
|
<ul class="current">
|
|
<li class="toctree-l1"><a class="reference internal" href="about.html">Il progetto in breve</a></li>
|
|
<li class="toctree-l1 current"><a class="current reference internal" href="#">Installazione</a><ul>
|
|
<li class="toctree-l2"><a class="reference internal" href="#prerequisiti">Prerequisiti</a></li>
|
|
<li class="toctree-l2"><a class="reference internal" href="#creare-un-nuovo-utente">Creare un nuovo utente</a></li>
|
|
<li class="toctree-l2"><a class="reference internal" href="#scaricare-il-codice-sorgente">Scaricare il codice sorgente</a></li>
|
|
<li class="toctree-l2"><a class="reference internal" href="#creare-il-database">Creare il database</a></li>
|
|
<li class="toctree-l2"><a class="reference internal" href="#creare-un-file-di-configurazione-per-il-backend">Creare un file di configurazione per il backend</a></li>
|
|
<li class="toctree-l2"><a class="reference internal" href="#installare-le-dipendenze-python">Installare le dipendenze Python</a></li>
|
|
<li class="toctree-l2"><a class="reference internal" href="#installare-le-dipendenze-nodejs">Installare le dipendenze NodeJS</a></li>
|
|
<li class="toctree-l2"><a class="reference internal" href="#creare-un-servizio-systemd-per-il-backend">Creare un servizio SystemD per il backend</a></li>
|
|
<li class="toctree-l2"><a class="reference internal" href="#compilare-il-frontend">Compilare il frontend</a></li>
|
|
<li class="toctree-l2"><a class="reference internal" href="#creare-un-servizio-systemd-per-il-frontend">Creare un servizio SystemD per il frontend</a></li>
|
|
<li class="toctree-l2"><a class="reference internal" href="#creare-un-servizio-systemd-per-il-crawler">Creare un servizio SystemD per il crawler</a></li>
|
|
<li class="toctree-l2"><a class="reference internal" href="#configurare-il-crawler">Configurare il crawler</a></li>
|
|
<li class="toctree-l2"><a class="reference internal" href="#creare-un-timer-systemd-per-il-crawler">Creare un timer SystemD per il crawler</a></li>
|
|
<li class="toctree-l2"><a class="reference internal" href="#configurare-apache-come-reverse-proxy">Configurare Apache come reverse proxy</a></li>
|
|
</ul>
|
|
</li>
|
|
<li class="toctree-l1"><a class="reference internal" href="updating.html">Aggiornamento</a></li>
|
|
</ul>
|
|
<p class="caption"><span class="caption-text">Relazione sul progetto</span></p>
|
|
<ul>
|
|
<li class="toctree-l1"><a class="reference internal" href="../development/goals.html">Introduzione</a></li>
|
|
<li class="toctree-l1"><a class="reference internal" href="../development/tools.html">Strumenti utilizzati</a></li>
|
|
<li class="toctree-l1"><a class="reference internal" href="../development/process.html">Processo di sviluppo</a></li>
|
|
<li class="toctree-l1"><a class="reference internal" href="../development/artifacts.html">Artefatti</a></li>
|
|
<li class="toctree-l1"><a class="reference internal" href="../development/conclusions.html">Conclusioni</a></li>
|
|
<li class="toctree-l1"><a class="reference internal" href="../development/suggestions.html">Suggerimenti relativi al corso</a></li>
|
|
</ul>
|
|
<p class="caption"><span class="caption-text">Documentazione tecnica</span></p>
|
|
<ul>
|
|
<li class="toctree-l1"><a class="reference internal" href="../code/meta/index.html">Meta-documentazione</a></li>
|
|
<li class="toctree-l1"><a class="reference internal" href="../code/database/index.html">Struttura del database</a></li>
|
|
<li class="toctree-l1"><a class="reference internal" href="../code/backend/index.html"><code class="docutils literal notranslate"><span class="pre">nest_backend</span></code> - Web API in Python</a></li>
|
|
<li class="toctree-l1"><a class="reference internal" href="../code/crawler/index.html"><code class="docutils literal notranslate"><span class="pre">nest_crawler</span></code> - Crawler in Python</a></li>
|
|
<li class="toctree-l1"><a class="reference internal" href="../code/frontend/index.html"><code class="docutils literal notranslate"><span class="pre">nest_frontend</span></code> - Interfaccia utente in React</a></li>
|
|
</ul>
|
|
|
|
|
|
|
|
</div>
|
|
|
|
</div>
|
|
</nav>
|
|
|
|
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">
|
|
|
|
|
|
<nav class="wy-nav-top" aria-label="top navigation">
|
|
|
|
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
|
|
<a href="../index.html">N.E.S.T.</a>
|
|
|
|
</nav>
|
|
|
|
|
|
<div class="wy-nav-content">
|
|
|
|
<div class="rst-content">
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<div role="navigation" aria-label="breadcrumbs navigation">
|
|
|
|
<ul class="wy-breadcrumbs">
|
|
|
|
<li><a href="../index.html" class="icon icon-home"></a> »</li>
|
|
|
|
<li>Installazione</li>
|
|
|
|
|
|
<li class="wy-breadcrumbs-aside">
|
|
|
|
|
|
<a href="../_sources/guide/installation.rst.txt" rel="nofollow"> View page source</a>
|
|
|
|
|
|
</li>
|
|
|
|
</ul>
|
|
|
|
|
|
<hr/>
|
|
</div>
|
|
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
|
|
<div itemprop="articleBody">
|
|
|
|
<div class="section" id="installazione">
|
|
<h1>Installazione<a class="headerlink" href="#installazione" title="Link a questa intestazione">¶</a></h1>
|
|
<p>Questa guida illustra come installare interamente N.E.S.T. su un server Linux.</p>
|
|
<div class="section" id="prerequisiti">
|
|
<h2>Prerequisiti<a class="headerlink" href="#prerequisiti" title="Link a questa intestazione">¶</a></h2>
|
|
<p>Per installare ed eseguire N.E.S.T., è necessario:</p>
|
|
<ul class="simple">
|
|
<li><p>Una connessione a Internet</p></li>
|
|
<li><p>Un sistema operativo Linux-based (preferibilmente <a class="reference external" href="https://wiki.archlinux.org/title/Main_page">Arch Linux</a>)</p></li>
|
|
<li><p><a class="reference external" href="https://www.freedesktop.org/wiki/Software/systemd/">SystemD ^248.2</a></p></li>
|
|
<li><p><a class="reference external" href="https://httpd.apache.org/">Apache HTTP Server ^2.4.46</a></p></li>
|
|
<li><p><a class="reference external" href="https://www.postgresql.org/download/">PostgreSQL ^13.2</a></p></li>
|
|
<li><p><a class="reference external" href="https://git-scm.com/">Git ^2.31.1</a></p></li>
|
|
<li><p><a class="reference external" href="https://www.python.org/downloads/">Python ^3.8</a></p></li>
|
|
<li><p><a class="reference external" href="https://python-poetry.org/">Poetry ^1.0</a></p></li>
|
|
<li><p><a class="reference external" href="https://nodejs.org/">NodeJS ^16.0</a></p></li>
|
|
<li><p><a class="reference external" href="https://www.npmjs.com/">npm ^7.13.0</a></p></li>
|
|
<li><p>Un mail server (interno o esterno) che supporti
|
|
l'<a class="reference external" href="https://it.wikipedia.org/wiki/Simple_Mail_Transfer_Protocol">SMTP</a></p></li>
|
|
</ul>
|
|
</div>
|
|
<div class="section" id="creare-un-nuovo-utente">
|
|
<h2>Creare un nuovo utente<a class="headerlink" href="#creare-un-nuovo-utente" title="Link a questa intestazione">¶</a></h2>
|
|
<p>Per motivi di sicurezza, si suggerisce di creare un nuovo utente con il quale eseguire il progetto:</p>
|
|
<div class="admonition note">
|
|
<p class="admonition-title">Nota</p>
|
|
<p>È necessario essere amministratori di sistema per eseguire i seguenti comandi.
|
|
Si veda il manuale di <a class="reference external" href="https://linux.die.net/man/8/useradd">useradd</a> per più dettagli.</p>
|
|
</div>
|
|
<div class="highlight-console notranslate"><div class="highlight"><pre><span></span><span class="gp">root:~# </span>mkdir --parents /srv/nest
|
|
<span class="gp">root:~# </span>useradd --home-dir /srv/nest --shell /bin/bash nest
|
|
<span class="gp">root:~# </span>chown --recursive nest: /srv/nest
|
|
</pre></div>
|
|
</div>
|
|
</div>
|
|
<div class="section" id="scaricare-il-codice-sorgente">
|
|
<h2>Scaricare il codice sorgente<a class="headerlink" href="#scaricare-il-codice-sorgente" title="Link a questa intestazione">¶</a></h2>
|
|
<p>Per installare N.E.S.T., è necessario avere il codice sorgente disponibile sul server.</p>
|
|
<p>Si consiglia di scaricarlo tramite <em>Git</em>:</p>
|
|
<div class="highlight-console notranslate"><div class="highlight"><pre><span></span><span class="gp">nest:~$ </span>git clone https://gitlab.steffo.eu/nest/g2-progetto.git
|
|
</pre></div>
|
|
</div>
|
|
<p>Questo creerà una nuova cartella <code class="docutils literal notranslate"><span class="pre">g2-progetto</span></code> nella directory in cui è stato eseguito il comando.</p>
|
|
<p>Per proseguire, sarà necessario entrarvi:</p>
|
|
<div class="highlight-console notranslate"><div class="highlight"><pre><span></span><span class="gp">nest:~$ </span><span class="nb">cd</span> g2-progetto
|
|
</pre></div>
|
|
</div>
|
|
</div>
|
|
<div class="section" id="creare-il-database">
|
|
<h2>Creare il database<a class="headerlink" href="#creare-il-database" title="Link a questa intestazione">¶</a></h2>
|
|
<p>N.E.S.T. necessita di un database PostgreSQL in cui salvare i dati.</p>
|
|
<p>Per motivi di sicurezza, si suggerisce di creare un ruolo isolato dal resto del DBMS apposta per N.E.S.T.:</p>
|
|
<div class="highlight-console notranslate"><div class="highlight"><pre><span></span><span class="gp">postgres:~$ </span>createuser nest
|
|
</pre></div>
|
|
</div>
|
|
<p>Per creare il database PostgreSQL, si esegua:</p>
|
|
<div class="highlight-console notranslate"><div class="highlight"><pre><span></span><span class="gp">postgres:~$ </span>createdb --owner<span class="o">=</span>nest nest
|
|
</pre></div>
|
|
</div>
|
|
</div>
|
|
<div class="section" id="creare-un-file-di-configurazione-per-il-backend">
|
|
<h2>Creare un file di configurazione per il backend<a class="headerlink" href="#creare-un-file-di-configurazione-per-il-backend" title="Link a questa intestazione">¶</a></h2>
|
|
<p>Il backend usa un file di configurazione per impostare alcune variabili.</p>
|
|
<p>Si crei un nuovo file nella working directory del progetto denominato <code class="docutils literal notranslate"><span class="pre">config.py</span></code>:</p>
|
|
<div class="highlight-console notranslate"><div class="highlight"><pre><span></span><span class="gp">nest:~/g2-progetto$ </span>vim config.py
|
|
</pre></div>
|
|
</div>
|
|
<p>Il file dovrà avere i seguenti contenuti:</p>
|
|
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="c1"># Una stringa rappresentante il database da utilizzare</span>
|
|
<span class="c1"># Per maggiori informazioni sulla sintassi, si veda https://docs.sqlalchemy.org/en/14/core/engines.html</span>
|
|
<span class="n">SQLALCHEMY_DATABASE_URI</span> <span class="o">=</span> <span class="s2">"postgresql://nest@/nest"</span>
|
|
|
|
<span class="c1"># Una stringa casuale utilizzata per generare i JSON Web Token (JWT)</span>
|
|
<span class="c1"># Va mantenuta segreta e costante per tutta l'operazione del backend!</span>
|
|
<span class="c1"># Si suggerisce di premere tasti casuali sulla tastiera finchè la riga non è piena.</span>
|
|
<span class="n">SECRET_KEY</span> <span class="o">=</span> <span class="s2">"dsjiofgvinmodfiojvbnio3erfnoiweraqugu43ghjwrevniuwerng43iugnreuwignhritmj43i43nb8i42ug0wevkwovmwigtjj"</span>
|
|
</pre></div>
|
|
</div>
|
|
</div>
|
|
<div class="section" id="installare-le-dipendenze-python">
|
|
<h2>Installare le dipendenze Python<a class="headerlink" href="#installare-le-dipendenze-python" title="Link a questa intestazione">¶</a></h2>
|
|
<p>Le dipendenze Python sono gestite da <em>Poetry</em>, e possono essere installate con:</p>
|
|
<div class="highlight-console notranslate"><div class="highlight"><pre><span></span><span class="gp">nest:~/g2-progetto$ </span>poetry install
|
|
</pre></div>
|
|
</div>
|
|
<p>Poetry creerà automaticamente un <a class="reference external" href="https://docs.python.org/3/library/venv.html">venv</a> e vi installerà all'interno tutti
|
|
i pacchetti necessari all'esecuzione del backend e del crawler di N.E.S.T. .</p>
|
|
<p><strong>Si suggerisce di ricordare il nome del venv creato da Poetry</strong>, in quanto sarà necessario per
|
|
<a class="reference internal" href="#creare-un-servizio-systemd-per-il-backend"><span class="std std-ref">Creare un servizio SystemD per il backend</span></a>:</p>
|
|
<div class="highlight-console notranslate"><div class="highlight"><pre><span></span><span class="go">Creating virtualenv nest-7C2fm2VD-py3.9 in /srv/nest/.cache/pypoetry/virtualenvs</span>
|
|
</pre></div>
|
|
</div>
|
|
</div>
|
|
<div class="section" id="installare-le-dipendenze-nodejs">
|
|
<h2>Installare le dipendenze NodeJS<a class="headerlink" href="#installare-le-dipendenze-nodejs" title="Link a questa intestazione">¶</a></h2>
|
|
<p>Le dipendenze NodeJS sono gestite da <em>npm</em>, e possono essere installate con:</p>
|
|
<div class="highlight-console notranslate"><div class="highlight"><pre><span></span><span class="gp">nest:~/g2-progetto$ </span>npm install
|
|
</pre></div>
|
|
</div>
|
|
<p>npm creerà automaticamente una cartella
|
|
<a class="reference external" href="https://docs.npmjs.com/cli/v7/configuring-npm/folders#node-modules">node_modules</a> e vi installerà all'interno tutte
|
|
le librerie necessarie all'esecuzione del frontend di N.E.S.T. .</p>
|
|
</div>
|
|
<div class="section" id="creare-un-servizio-systemd-per-il-backend">
|
|
<h2>Creare un servizio SystemD per il backend<a class="headerlink" href="#creare-un-servizio-systemd-per-il-backend" title="Link a questa intestazione">¶</a></h2>
|
|
<p>Per fare in modo che il backend rimanga attivo in background, anche dopo un riavvio, si suggerisce di installarlo come
|
|
servizio di sistema di <em>SystemD</em>:</p>
|
|
<div class="highlight-console notranslate"><div class="highlight"><pre><span></span><span class="gp">root:~# </span>systemctl edit --force --full nest-backend
|
|
</pre></div>
|
|
</div>
|
|
<p>Inserire all'interno del file le seguenti direttive:</p>
|
|
<div class="highlight-systemd notranslate"><div class="highlight"><pre><span></span>[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
|
|
</pre></div>
|
|
</div>
|
|
<p>Ora, si verifichi che il servizio si avvii correttamente eseguendolo manualmente con:</p>
|
|
<div class="highlight-console notranslate"><div class="highlight"><pre><span></span><span class="gp">root:~# </span>systemctl start nest-backend
|
|
</pre></div>
|
|
</div>
|
|
<p>In caso di successo, l'API dovrebbe essere esposto sulla porta <code class="docutils literal notranslate"><span class="pre">30040</span></code> dell'indirizzo di loopback <code class="docutils literal notranslate"><span class="pre">127.0.0.1</span></code>:</p>
|
|
<div class="highlight-console notranslate"><div class="highlight"><pre><span></span><span class="gp">root:~# </span>curl <span class="m">127</span>.0.0.1:30040/doa
|
|
<span class="go">If you see this, the server is fine.</span>
|
|
</pre></div>
|
|
</div>
|
|
<p>Si abiliti il servizio, in modo che venga automaticamente avviato al riavvio del sistema:</p>
|
|
<div class="highlight-console notranslate"><div class="highlight"><pre><span></span><span class="gp">root:~# </span>systemctl <span class="nb">enable</span> nest-backend
|
|
</pre></div>
|
|
</div>
|
|
</div>
|
|
<div class="section" id="compilare-il-frontend">
|
|
<h2>Compilare il frontend<a class="headerlink" href="#compilare-il-frontend" title="Link a questa intestazione">¶</a></h2>
|
|
<p>Perchè sia possibile servire il frontend agli utenti, è necessario prima crearne una versione compilata ottimizzata.</p>
|
|
<p>È possibile farlo con il comando:</p>
|
|
<div class="highlight-console notranslate"><div class="highlight"><pre><span></span><span class="gp">nest:~/g2-progetto$ </span>npm run build
|
|
</pre></div>
|
|
</div>
|
|
<p>Verrà creata una cartella <code class="docutils literal notranslate"><span class="pre">build</span></code> con all'interno la versione compilata.</p>
|
|
</div>
|
|
<div class="section" id="creare-un-servizio-systemd-per-il-frontend">
|
|
<h2>Creare un servizio SystemD per il frontend<a class="headerlink" href="#creare-un-servizio-systemd-per-il-frontend" title="Link a questa intestazione">¶</a></h2>
|
|
<p>Per rendere disponibile alla rete la copia locale del frontend, si suggerisce di avviare lo script npm <code class="docutils literal notranslate"><span class="pre">serve</span></code>
|
|
integrato con N.E.S.T. come un servizio di sistema di <em>SystemD</em>:</p>
|
|
<div class="highlight-console notranslate"><div class="highlight"><pre><span></span><span class="gp">root:~# </span>systemctl edit --force --full nest-frontend
|
|
</pre></div>
|
|
</div>
|
|
<p>Inserire all'interno del file le seguenti direttive:</p>
|
|
<div class="highlight-systemd notranslate"><div class="highlight"><pre><span></span>[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
|
|
</pre></div>
|
|
</div>
|
|
<div class="admonition warning">
|
|
<p class="admonition-title">Avvertimento</p>
|
|
<p>Questo file non è stato testato, in quanto sul server demo è in uso una versione più complessa che usa
|
|
<a class="reference external" href="https://github.com/nvm-sh/nvm">nvm</a> per gestire più versioni di NodeJS sullo stesso sistema.</p>
|
|
<p>La versione in uso sul server demo è:</p>
|
|
<div class="highlight-systemd notranslate"><div class="highlight"><pre><span></span>[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
|
|
</pre></div>
|
|
</div>
|
|
</div>
|
|
<p>Ora, si verifichi che il servizio si avvii correttamente eseguendolo manualmente con:</p>
|
|
<div class="highlight-console notranslate"><div class="highlight"><pre><span></span><span class="gp">root:~# </span>systemctl start nest-frontend
|
|
</pre></div>
|
|
</div>
|
|
<p>In caso di successo, il frontend dovrebbe essere esposto sulla porta <code class="docutils literal notranslate"><span class="pre">30041</span></code> dell'indirizzo di loopback <code class="docutils literal notranslate"><span class="pre">127.0.0.1</span></code>:</p>
|
|
<div class="highlight-console notranslate"><div class="highlight"><pre><span></span><span class="gp">root:~# </span>curl <span class="m">127</span>.0.0.1:30041
|
|
<span class="go">[...]</span>
|
|
</pre></div>
|
|
</div>
|
|
<p>Si abiliti il servizio, in modo che venga automaticamente avviato al riavvio del sistema:</p>
|
|
<div class="highlight-console notranslate"><div class="highlight"><pre><span></span><span class="gp">root:~# </span>systemctl <span class="nb">enable</span> nest-frontend
|
|
</pre></div>
|
|
</div>
|
|
</div>
|
|
<div class="section" id="creare-un-servizio-systemd-per-il-crawler">
|
|
<h2>Creare un servizio SystemD per il crawler<a class="headerlink" href="#creare-un-servizio-systemd-per-il-crawler" title="Link a questa intestazione">¶</a></h2>
|
|
<p>Perchè i repository vengano popolati di Tweet, è necessario configurare il crawler come servizio di <em>SystemD</em>:</p>
|
|
<div class="highlight-console notranslate"><div class="highlight"><pre><span></span><span class="gp">root:~# </span>systemctl edit --force --full nest-crawler
|
|
</pre></div>
|
|
</div>
|
|
<p>All'interno del file, inserire le seguenti direttive:</p>
|
|
<div class="highlight-systemd notranslate"><div class="highlight"><pre><span></span>[Unit]
|
|
Description=N.E.S.T. Crawler
|
|
Wants=network-online.target nest-backend.service
|
|
After=network-online.target nss-lookup.target nest-backend.service
|
|
|
|
[Service]
|
|
Type=exec
|
|
Environment=FLASK_CONFIG=../config.py
|
|
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 nest_crawler
|
|
|
|
[Install]
|
|
WantedBy=multi-user.target
|
|
</pre></div>
|
|
</div>
|
|
</div>
|
|
<div class="section" id="configurare-il-crawler">
|
|
<h2>Configurare il crawler<a class="headerlink" href="#configurare-il-crawler" title="Link a questa intestazione">¶</a></h2>
|
|
<div class="admonition note">
|
|
<p class="admonition-title">Nota</p>
|
|
<p>Per utilizzare gli API di Twitter, è necessario essere approvati dal supporto tecnico di Twitter.</p>
|
|
<p>È dunque necessario <a class="reference external" href="https://developer.twitter.com/en/apply-for-access">fare richiesta</a>, e sarà possibile
|
|
procedere con l'installazione solo una volta ricevute le credenziali per l'utilizzo.</p>
|
|
</div>
|
|
<p>Per impostare le variabili di ambiente richieste dal crawler, si suggerisce di creare un <em>file di override</em> di SystemD:</p>
|
|
<div class="highlight-console notranslate"><div class="highlight"><pre><span></span><span class="gp">root:~# </span>systemctl edit nest-crawler
|
|
</pre></div>
|
|
</div>
|
|
<p>All'interno del file, inserire le seguenti direttive:</p>
|
|
<div class="highlight-systemd notranslate"><div class="highlight"><pre><span></span>[Service]
|
|
|
|
# Sostituire a questi caratteri la Consumer Key ricevuta da Twitter
|
|
# ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
|
|
Environment=C_K=0000000000000000000000000
|
|
|
|
|
|
# Sostituire a questi caratteri il Consumer Secret ricevuto da Twitter
|
|
# ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
|
|
Environment=C_S=00000000000000000000000000000000000000000000000000
|
|
|
|
# Sostituire a questi caratteri l'Access Token ricevuto da Twitter
|
|
# ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
|
|
Environment=A_T=00000000000000000000000000000000000000000000000000
|
|
|
|
# Sostituire a questi caratteri l'Access Token Secret ricevuto da Twitter
|
|
# ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
|
|
Environment=A_T_S=000000000000000000000000000000000000000000000
|
|
|
|
# Sostituire con l'indirizzo del proprio SMTP mail server
|
|
# ↓↓↓↓↓↓↓↓↓↓↓↓↓↓
|
|
Environment=SMTP_HOST=mail.gandi.net
|
|
|
|
# Sostituire con le proprie credenziali dell'SMTP mail server
|
|
# ↓↓↓↓↓↓↓↓↓↓↓↓
|
|
Environment=SMTP_USERNAME=bot@ryg.one
|
|
# ↓↓↓↓↓↓↓↓
|
|
Environment=SMTP_PASSWORD=password
|
|
|
|
# Sostituire con l'email da cui si desidera che vengano inviate le allerte
|
|
# ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
|
|
Environment=SMTP_FROM_EMAIL=nest-bot@ryg.one
|
|
</pre></div>
|
|
</div>
|
|
<p>Ora, si verifichi che il servizio si avvii correttamente eseguendolo manualmente con:</p>
|
|
<div class="highlight-console notranslate"><div class="highlight"><pre><span></span><span class="gp">root:~# </span>systemctl start nest-crawler
|
|
</pre></div>
|
|
</div>
|
|
<p>Nel log di sistema non dovrebbe comparire nessun errore:</p>
|
|
<div class="highlight-console notranslate"><div class="highlight"><pre><span></span><span class="gp">root:~# </span>journalctl nest-crawler
|
|
</pre></div>
|
|
</div>
|
|
</div>
|
|
<div class="section" id="creare-un-timer-systemd-per-il-crawler">
|
|
<h2>Creare un timer SystemD per il crawler<a class="headerlink" href="#creare-un-timer-systemd-per-il-crawler" title="Link a questa intestazione">¶</a></h2>
|
|
<p>Per fare in modo che il crawler venga eseguito periodicamente, si suggerisce di configurare un timer SystemD:</p>
|
|
<div class="highlight-console notranslate"><div class="highlight"><pre><span></span><span class="gp">root:~# </span>systemctl edit --force --full nest-crawler.timer
|
|
</pre></div>
|
|
</div>
|
|
<p>Si inseriscano all'interno del file le seguenti direttive:</p>
|
|
<div class="highlight-systemd notranslate"><div class="highlight"><pre><span></span>[Unit]
|
|
Description=Run nest-crawler every 60 minutes
|
|
|
|
[Timer]
|
|
OnBootSec=60min
|
|
OnUnitActiveSec=60min
|
|
Unit=nest-crawler.service
|
|
|
|
[Install]
|
|
WantedBy=timers.target
|
|
</pre></div>
|
|
</div>
|
|
<p>Ora, si verifichi che il timer si avvii correttamente eseguendolo manualmente con:</p>
|
|
<div class="highlight-console notranslate"><div class="highlight"><pre><span></span><span class="gp">root:~# </span>systemctl start nest-crawler.timer
|
|
</pre></div>
|
|
</div>
|
|
<p>Nello stato del timer non dovrebbe comparire nessun errore:</p>
|
|
<div class="highlight-console notranslate"><div class="highlight"><pre><span></span><span class="gp">root:~# </span>systemctl status nest-crawler.timer
|
|
</pre></div>
|
|
</div>
|
|
<p>Si abiliti il timer, in modo che venga automaticamente avviato al riavvio del sistema:</p>
|
|
<div class="highlight-console notranslate"><div class="highlight"><pre><span></span><span class="gp">root:~# </span>systemctl <span class="nb">enable</span> nest-crawler.timer
|
|
</pre></div>
|
|
</div>
|
|
</div>
|
|
<div class="section" id="configurare-apache-come-reverse-proxy">
|
|
<h2>Configurare Apache come reverse proxy<a class="headerlink" href="#configurare-apache-come-reverse-proxy" title="Link a questa intestazione">¶</a></h2>
|
|
<p>Per rendere l'API e il frontend disponibili al pubblico, si suggerisce di configurare Apache HTTP Server
|
|
come reverse proxy.</p>
|
|
<p>La configurazione di Apache varia molto da distribuzione a distribuzione Linux, e talvolta anche da server a server;
|
|
pertanto, si fornisce solamente un file <a class="reference external" href="https://httpd.apache.org/docs/2.4/vhosts/examples.html">VirtualHost</a> di
|
|
esempio da adattare al proprio setup:</p>
|
|
<div class="highlight-apacheconf notranslate"><div class="highlight"><pre><span></span><span class="nt"><VirtualHost</span> <span class="s">*:80</span><span class="nt">></span>
|
|
<span class="nb">ServerName</span> <span class="s2">"api.nest.steffo.eu"</span>
|
|
<span class="nb">ServerName</span> <span class="s2">"prod.nest.steffo.eu"</span>
|
|
|
|
<span class="nb">RewriteEngine</span> <span class="k">On</span>
|
|
<span class="nb">RewriteRule</span> ^(.*)$ https://%{HTTP_HOST}$1 [R=301,L]
|
|
<span class="nt"></VirtualHost></span>
|
|
|
|
<span class="nt"><VirtualHost</span> <span class="s">*:443</span><span class="nt">></span>
|
|
<span class="nb">ServerName</span> <span class="s2">"api.nest.steffo.eu"</span>
|
|
|
|
<span class="nb">SSLEngine</span> <span class="k">on</span>
|
|
<span class="nb">SSLCertificateFile</span> <span class="s2">"/root/.acme.sh/*.nest.steffo.eu/fullchain.cer"</span>
|
|
<span class="nb">SSLCertificateKeyFile</span> <span class="s2">"/root/.acme.sh/*.nest.steffo.eu/*.nest.steffo.eu.key"</span>
|
|
|
|
<span class="nb">ProxyPass</span> <span class="s2">"/"</span> <span class="s2">"http://127.0.0.1:30040/"</span>
|
|
<span class="nb">ProxyPassReverse</span> <span class="s2">"/"</span> <span class="s2">"http://127.0.0.1:30040/"</span>
|
|
<span class="nb">RequestHeader</span> set <span class="s2">"X-Forwarded-Proto"</span> expr=%{REQUEST_SCHEME}
|
|
|
|
<span class="nb">Protocols</span> h2 http/1.1
|
|
<span class="nb">Header</span> always set Strict-Transport-Security <span class="s2">"max-age=63072000"</span>
|
|
<span class="nt"></VirtualHost></span>
|
|
|
|
<span class="nt"><VirtualHost</span> <span class="s">*:443</span><span class="nt">></span>
|
|
<span class="nb">ServerName</span> <span class="s2">"prod.nest.steffo.eu"</span>
|
|
|
|
<span class="nb">SSLEngine</span> <span class="k">on</span>
|
|
<span class="nb">SSLCertificateFile</span> <span class="s2">"/root/.acme.sh/*.nest.steffo.eu/fullchain.cer"</span>
|
|
<span class="nb">SSLCertificateKeyFile</span> <span class="s2">"/root/.acme.sh/*.nest.steffo.eu/*.nest.steffo.eu.key"</span>
|
|
|
|
<span class="nb">ProxyPass</span> <span class="s2">"/"</span> <span class="s2">"http://127.0.0.1:30041/"</span>
|
|
<span class="nb">ProxyPassReverse</span> <span class="s2">"/"</span> <span class="s2">"http://127.0.0.1:30041/"</span>
|
|
<span class="nb">RequestHeader</span> set <span class="s2">"X-Forwarded-Proto"</span> expr=%{REQUEST_SCHEME}
|
|
|
|
<span class="nb">Protocols</span> h2 http/1.1
|
|
<span class="nb">Header</span> always set Strict-Transport-Security <span class="s2">"max-age=63072000"</span>
|
|
<span class="nt"></VirtualHost></span>
|
|
</pre></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
|
|
</div>
|
|
|
|
</div>
|
|
<footer>
|
|
<div class="rst-footer-buttons" role="navigation" aria-label="footer navigation">
|
|
<a href="updating.html" class="btn btn-neutral float-right" title="Aggiornamento" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right" aria-hidden="true"></span></a>
|
|
<a href="about.html" class="btn btn-neutral float-left" title="Il progetto in breve" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left" aria-hidden="true"></span> Previous</a>
|
|
</div>
|
|
|
|
<hr/>
|
|
|
|
<div role="contentinfo">
|
|
<p>
|
|
© Copyright 2021, Gruppo 2.
|
|
|
|
</p>
|
|
</div>
|
|
|
|
|
|
|
|
Built with <a href="https://www.sphinx-doc.org/">Sphinx</a> using a
|
|
|
|
<a href="https://github.com/readthedocs/sphinx_rtd_theme">theme</a>
|
|
|
|
provided by <a href="https://readthedocs.org">Read the Docs</a>.
|
|
|
|
</footer>
|
|
</div>
|
|
</div>
|
|
|
|
</section>
|
|
|
|
</div>
|
|
|
|
|
|
<script type="text/javascript">
|
|
jQuery(function () {
|
|
SphinxRtdTheme.Navigation.enable(true);
|
|
});
|
|
</script>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
</body>
|
|
</html> |