<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="it">
	<id>https://wiki.gazzi.net/index.php?action=history&amp;feed=atom&amp;title=Progetti%2FCartClin</id>
	<title>Progetti/CartClin - Cronologia</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.gazzi.net/index.php?action=history&amp;feed=atom&amp;title=Progetti%2FCartClin"/>
	<link rel="alternate" type="text/html" href="https://wiki.gazzi.net/index.php?title=Progetti/CartClin&amp;action=history"/>
	<updated>2026-05-17T01:04:57Z</updated>
	<subtitle>Cronologia della pagina su questo sito</subtitle>
	<generator>MediaWiki 1.40.1</generator>
	<entry>
		<id>https://wiki.gazzi.net/index.php?title=Progetti/CartClin&amp;diff=644&amp;oldid=prev</id>
		<title>Maintenance script: Aggiunta documentazione progetto CartClin e pubblicazione cartclin.gazzi.net</title>
		<link rel="alternate" type="text/html" href="https://wiki.gazzi.net/index.php?title=Progetti/CartClin&amp;diff=644&amp;oldid=prev"/>
		<updated>2026-03-30T23:09:58Z</updated>

		<summary type="html">&lt;p&gt;Aggiunta documentazione progetto CartClin e pubblicazione cartclin.gazzi.net&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Nuova pagina&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== CartClin ==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;CartClin&amp;#039;&amp;#039;&amp;#039; e&amp;#039; un&amp;#039;applicazione web Python/Flask pubblicata dietro reverse proxy come:&lt;br /&gt;
&lt;br /&gt;
* URL pubblico: &amp;lt;code&amp;gt;https://cartclin.gazzi.net/&amp;lt;/code&amp;gt;&lt;br /&gt;
* host applicativo: &amp;lt;code&amp;gt;web01.gazzi.local&amp;lt;/code&amp;gt;&lt;br /&gt;
* host proxy pubblico: &amp;lt;code&amp;gt;proxy01.gazzi.local&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Architettura ==&lt;br /&gt;
&lt;br /&gt;
La pubblicazione e&amp;#039; divisa in tre livelli:&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;runtime applicativo&amp;#039;&amp;#039;&amp;#039; su &amp;lt;code&amp;gt;web01&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;backend HTTP interno&amp;#039;&amp;#039;&amp;#039; su &amp;lt;code&amp;gt;web01&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;reverse proxy e TLS&amp;#039;&amp;#039;&amp;#039; su &amp;lt;code&amp;gt;proxy01&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Runtime applicativo su web01 ===&lt;br /&gt;
&lt;br /&gt;
Il codice applicativo viene installato in:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;/opt/cartclin&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Componenti principali runtime:&lt;br /&gt;
&lt;br /&gt;
* virtualenv Python: &amp;lt;code&amp;gt;/opt/cartclin/venv&amp;lt;/code&amp;gt;&lt;br /&gt;
* database SQLite locale: &amp;lt;code&amp;gt;/opt/cartclin/cartclin.db&amp;lt;/code&amp;gt;&lt;br /&gt;
* cache locale per WeasyPrint/fontconfig: &amp;lt;code&amp;gt;/opt/cartclin/.cache&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il servizio applicativo e&amp;#039; gestito da systemd:&lt;br /&gt;
&lt;br /&gt;
* unit file: &amp;lt;code&amp;gt;/etc/systemd/system/cartclin.service&amp;lt;/code&amp;gt;&lt;br /&gt;
* service name: &amp;lt;code&amp;gt;cartclin.service&amp;lt;/code&amp;gt;&lt;br /&gt;
* utente runtime: &amp;lt;code&amp;gt;www-data&amp;lt;/code&amp;gt;&lt;br /&gt;
* working directory: &amp;lt;code&amp;gt;/opt&amp;lt;/code&amp;gt;&lt;br /&gt;
* variabili runtime rilevanti:&lt;br /&gt;
** &amp;lt;code&amp;gt;PYTHONPATH=/opt&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;HOME=/opt/cartclin&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;XDG_CACHE_HOME=/opt/cartclin/.cache&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il servizio avvia:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;gunicorn --workers 2 --bind 127.0.0.1:8090 cartclin.app:app&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Backend HTTP interno su web01 ===&lt;br /&gt;
&lt;br /&gt;
Nginx locale su &amp;lt;code&amp;gt;web01&amp;lt;/code&amp;gt; pubblica l&amp;#039;app su una porta interna dedicata:&lt;br /&gt;
&lt;br /&gt;
* vhost backend: &amp;lt;code&amp;gt;/etc/nginx/sites-available/cartclin-backend&amp;lt;/code&amp;gt;&lt;br /&gt;
* symlink attivo: &amp;lt;code&amp;gt;/etc/nginx/sites-enabled/cartclin-backend&amp;lt;/code&amp;gt;&lt;br /&gt;
* bind interno: &amp;lt;code&amp;gt;0.0.0.0:8082&amp;lt;/code&amp;gt;&lt;br /&gt;
* upstream applicativo: &amp;lt;code&amp;gt;http://127.0.0.1:8090&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Test locale atteso su &amp;lt;code&amp;gt;web01&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;http://127.0.0.1:8090/&amp;lt;/code&amp;gt; risponde con redirect a &amp;lt;code&amp;gt;/login&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;http://127.0.0.1:8082/&amp;lt;/code&amp;gt; risponde come proxy locale verso l&amp;#039;app&lt;br /&gt;
&lt;br /&gt;
=== Reverse proxy e TLS su proxy01 ===&lt;br /&gt;
&lt;br /&gt;
La pubblicazione pubblica e&amp;#039; gestita da &amp;lt;code&amp;gt;proxy01&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
* vhost: &amp;lt;code&amp;gt;/etc/nginx/sites-available/cartclin&amp;lt;/code&amp;gt;&lt;br /&gt;
* symlink attivo: &amp;lt;code&amp;gt;/etc/nginx/sites-enabled/cartclin&amp;lt;/code&amp;gt;&lt;br /&gt;
* host pubblico: &amp;lt;code&amp;gt;cartclin.gazzi.net&amp;lt;/code&amp;gt;&lt;br /&gt;
* upstream interno: &amp;lt;code&amp;gt;http://172.16.1.3:8082&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Comportamento del vhost:&lt;br /&gt;
&lt;br /&gt;
* su porta 80 esegue redirect verso HTTPS&lt;br /&gt;
* su porta 443 termina TLS e inoltra verso &amp;lt;code&amp;gt;web01:8082&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Certificato TLS ==&lt;br /&gt;
&lt;br /&gt;
Il certificato pubblico e&amp;#039; gestito con Let&amp;#039;s Encrypt su &amp;lt;code&amp;gt;proxy01&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
* certificate path: &amp;lt;code&amp;gt;/etc/letsencrypt/live/cartclin.gazzi.net/fullchain.pem&amp;lt;/code&amp;gt;&lt;br /&gt;
* private key path: &amp;lt;code&amp;gt;/etc/letsencrypt/live/cartclin.gazzi.net/privkey.pem&amp;lt;/code&amp;gt;&lt;br /&gt;
* rinnovo automatico: gestito da Certbot&lt;br /&gt;
&lt;br /&gt;
== Flusso richieste ==&lt;br /&gt;
&lt;br /&gt;
Percorso sintetico di una richiesta:&lt;br /&gt;
&lt;br /&gt;
# il client apre &amp;lt;code&amp;gt;https://cartclin.gazzi.net/&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;proxy01&amp;lt;/code&amp;gt; riceve TLS e inoltra verso &amp;lt;code&amp;gt;http://172.16.1.3:8082&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;web01&amp;lt;/code&amp;gt; inoltra verso &amp;lt;code&amp;gt;gunicorn&amp;lt;/code&amp;gt; su &amp;lt;code&amp;gt;127.0.0.1:8090&amp;lt;/code&amp;gt;&lt;br /&gt;
# l&amp;#039;app Flask serve la login page o le route applicative&lt;br /&gt;
&lt;br /&gt;
== Verifiche rapide ==&lt;br /&gt;
&lt;br /&gt;
Su &amp;lt;code&amp;gt;web01&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;systemctl status cartclin.service&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;curl -I http://127.0.0.1:8090/&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;curl -I -H &amp;#039;Host: web01.gazzi.local&amp;#039; http://127.0.0.1:8082/&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Su &amp;lt;code&amp;gt;proxy01&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;nginx -t&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;curl -I --resolve cartclin.gazzi.net:443:127.0.0.1 https://cartclin.gazzi.net/ -k&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;certbot certificates&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Note operative ==&lt;br /&gt;
&lt;br /&gt;
* Non versionare segreti o password nel repository.&lt;br /&gt;
* Il file SQLite fa parte del runtime applicativo e va trattato come dato operativo, non come configurazione di proxy.&lt;br /&gt;
* Se si cambia host o porta interna, aggiornare sia il backend Nginx su &amp;lt;code&amp;gt;web01&amp;lt;/code&amp;gt; sia il reverse proxy su &amp;lt;code&amp;gt;proxy01&amp;lt;/code&amp;gt;.&lt;/div&gt;</summary>
		<author><name>Maintenance script</name></author>
	</entry>
</feed>