<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>selfhosting &amp;mdash; 1110 blog</title>
    <link>https://thegui.eu/tag:selfhosting</link>
    <description>Libri, fediverso, musica, coding, finanza personale. E poi si vede.</description>
    <pubDate>Mon, 24 Aug 2026 02:25:45 +0000</pubDate>
    <item>
      <title>Aggiornare Writefreely, visualizzare le immagini: self hosting, docker compose e volumi</title>
      <link>https://thegui.eu/aggiornare-writefreely-visualizzare-le-immagini-self-hosting-docker-compose</link>
      <description>&lt;![CDATA[Nello scrivere il post sull&#39;inflazione mi sono accorto che una cosa semplice e scontata come pubblicare un&#39;immagine sul proprio blog poteva essere meno scontata se il blog in questione lo gestite voi dall&#39;inizio alla fine.&#xA;&#xA;Quello che segue è un racconto su:&#xA;come aggiornare la versione del proprio software (se quest&#39;onere è in carico a voi)&#xA;come rendere caricare un&#39;immagine dal proprio pc al proprio sito se non c&#39;è un comodo modo per fare l&#39;upload&#xA;come fare in modo che chi si connette a vostrosito/static/immaginecaricataafatica non si becchi un 404.&#xA;&#xA;A livello di strumenti, ci sarà da parlare di:&#xA;VPS: la vostra casa online, il vostro server. La macchina a cui vi connettete per tenere su il tutto.&#xA;Docker/container: la baracca si regge su Docker. Quello che vi serve - blog, database, qualsiasi cosa - sta dentro vari contenitori. Docker si occupa di creare tutte le scatole, metterci dentro quello che volete e di far parlare le cose tra di loro. Ad esempio: la scatola 1 è un blog, la scatola due un e-commerce. Entrambe hanno bisogno di sapere che esiste una scatola 7 con il database.&#xA;ngix: per gestire le immagini (questo non me lo aspettavo).&#xA;&#xA;Il tutto per arrivare a poter vedere questa immagine immagine sull&#39;inflazione di qualche post fa&#xA;&#xA;!--more--&#xA;&#xA;Writefreely e l&#39;aggiornamento&#xA;Writefreely ultimamente ha avuto qualche problemino, almeno da quanto ho letto relativamente a Noblogo, il servizio di blog powered by writefreely gestito da Devol. Mi pare che sia qualcosa legato alla creazione di blog spam in un contesto multi utente.&#xA;Qualcosa potete leggerlo qui.&#xA;&#xA;Il problema era sulla versione v0.17.0. Questo blog gira puoi lui con writefreely. Ho sudato freddo. Questo mi ha fatto pensare: da quando ho tirato su tutta mia baracca con writefreely a che versione sono? Che è successo? Sto spammando blog di neonazi e non me ne sono accorto?&#xA;&#xA;Tocca quindi imparare un nuovo pezzo del self-hosting. Tocca a te aggiornare il software.&#xA;Visto che avevo in sospeso un problemino con le immagini, mi ci sono messo.&#xA;&#xA;Come aggiornare le versioni delle cose selfhostate&#xA;Come dice Boskov, &#34;aggiornamento si fa cliccando su aggiorna&#34;.&#xA;Che nel mondo dei terminali vuol dire &#34;fai un sudo qualcosa update da qualche parte&#34;.&#xA;&#xA;Ad esempio, sulla vostra VPS ogni tot tocca fare un aggiornamento dei pacchetti. O magari il vostro orchestratore di container ha una nuova versione e dalla UI di Coolify o Portainer c&#39;è un pulsante per fare l&#39;update.&#xA;&#xA;Solo che non è così semplice. Perché il blog viene tirato su dentro la sua scatola (container) seguendo una ricetta (immagine). Il quadro è simile a questo.&#xA;&#xA;La baracca, che alcuni chiamano indiecloud, si regge su più servizi che stanno dentro le loro belle scatoline (container). A volte qualcosa può andare storto. Una scatola casca e si rompe, qualcuno la calpesta, o altro.&#xA;Il container va giù. Tocca quindi sostituire la scatola con una dove avete ricostruito per bene la app del vostro castello come si deve. Quindi ritirate su il container e lo fate ripartire. Basta un click (o un comando). Fichissimo. &#xA;&#xA;Questo però ha un problema con questa prima idea di aggiornamento.&#xA;La scatola contiene il vostro drago rosso. La nuova versione di writefreely è un drago blu. Fate update del rosso a blu. Bello.&#xA;Però funziona fino a quando per disgrazia non va giù tutto e voi sostituite la scatola. Nelle vostre istruzioni, la ricetta dice che il drago è  rosso.&#xA;Non è la soluzione giusta.&#xA;&#xA;A noi interessa cambiare le istruzioni e metterci dentro il drago blu. Così a ogni riavvio prendiamo l&#39;elemento giusto.&#xA;&#xA;Quindi non bisogna entrare nel container e fare l&#39;aggiornamento ma bisogna riscrivere le regole.&#xA;In tecnichese tocca aggiornare il docker compose, in pratica il grande omino che sa dove stanno i pezzi dei lego, conosce tutte le ricette e dice come comporre i lego nelle varie scatole.&#xA;&#xA;In pratica è bastato cambiare una sola riga:&#xA;&#xA;image: ghcr.io/writefreely/writefreely:v0.17.1&#xA;&#xA;(per decoro non vi dico a che versione ero prima).&#xA;&#xA;Tutto finito?&#xA;Purtroppo no. La nuova versione ha dentro dei cambi allo schema del database - in pratica: a come vengono organizzate e salvate le cose. Ci sono nuove feature e il fix del bug nella nuova versione - alcune feature includono interazioni col fediverso. Per realizzare queste cose nuove tocca modificare lo schema del database... e ha senso: se da doomani volete tenere conto non solo dei libri che leggete ma di quante volte vi alzate col piede sinistro, vi tocca iniziare una nuova fila di X...&#xA;&#xA;Per rendere questi cambiamenti attuali bisogno dire al nostro drago blu &#34;aggiorna il tuo schema del database&#34;.&#xA;C&#39;è anche un rituale magico per fare il cambio: writefreely db migrate.&#xA;&#xA;Questo comando possiamo lanciarlo da dentro il nostro container in cui gira l&#39;applicazione di writefreely.&#xA;Quindi usando il dockerese una cosa del genere:&#xA;&#xA;docker exec containerid /go/cmd/writefreely/writefreely db migrate.&#xA;&#xA;Quindi entro sulla VPS e ci metto un sudo davanti per eseguire il comando con i giusti poteri.&#xA;Funzionerà?&#xA;&#xA;Ovviamente non può essere tutto così facile. &#xA;&#xA;Loading config.ini configuration...&#xA;&#xA;ERROR: app.go:150: Unable to load configuration: open config.ini: no such file or directory`&#xA;&#xA;La configurazione era nel posto sbagliato. Riproviamo dicendo al comando dove sta la configurazione&#xA;&#xA;docker exec containerid /go/cmd/writefreely/writefreely -c /data/config.ini db migrate&#xA;Loading /data/config.ini configuration...&#xA;Connecting to sqlite3 database...&#xA;Migrating to V17: fix post signature character set&#xA;Closing database connection...&#xA;&#xA;(Tra le nuove feature, c&#39;è monetizzazione e link automatico col fediverso https://webmonetization.org/#start . Ho aggiornato per scoprire cose nuove.)&#xA;&#xA;Ma... perché funziona?&#xA;Avevamo detto che non basta fare le modifiche nel container perché al primo riavvio vanno perse. Perché per la migrazione del database dovrebbe essere diverso?&#xA;&#xA;Qui ci sono due risposte possibili:&#xA;il database di riferimento è esterno (sta in un container tutto suo - e vediamo quanti voti prende)&#xA;usiamo un qualche trucco per persistere i dati tra un riavvio e l&#39;altro.&#xA;&#xA;Writefreely vuole essere autarchico e tutto in un punto. Quindi nella sua ricetta usa già SQLite come database. Se volete costruire una casa dove scrivere con Writefreely dovete solo prendere un container e installare lì dentro Writefreely, senza mal di testa per far parlare il vostro blog con un database, senza dover negoziare la struttura di come salviamo i post, etc. Senza troppe seccature extra oltre a quelle di &#34;installiamo Writefreely da qualche parte, poi facciamo in modo che io possa scriverci e le persone leggermi&#34;.&#xA;Dobbiamo quindi usare il trucco per persistere i dati.&#xA;&#xA;Ci sta infatti che, in un mondo di scatoloni e sostituzioni, servano dei riferimenti a cose che restano stabili. Questi wanderwall in docker li han chiamati volumi.&#xA;In pratica prendiamo una cartella della macchina in cui inizieremo a far comparire e sparire i diversi container e diciamo che, container per container, certi dati devono persistere e vanno salvati o letti da una cartella specifica.&#xA;&#xA;Nel grande magazzino in cui abbiamo messo gli scatoloni col lego colorato stiamo dicendo ad alcuni scatoloni di leggere o salvare su una mensola condivisa. Ad esempio potremmo toccare il cibo per il drago.&#xA;&#xA;In questo modo possiamo salvarci il nuovo schema del database, senza ripartire da zero tutte le volte.&#xA;&#xA;Immagini&#xA;Per le immagini, questa cosa dei volumi ci torna utile. Come faccio a mostrare la mia immagine dell&#39;inflazione?&#xA;Devo mettere su un volume le immagini da mostrare come file statici. In questo modo riuscirò a mostrarle.&#xA;&#xA;In pratica l&#39;idea è questa:&#xA;dal nostro pc mandiamo l&#39;immagine sulla nostra VPS&#xA;la VPS la mette a disposizione di writefreely&#xA;e noi possiamo linkarla scrivendo il post. Come quando usiamo un po&#39; di markdown per scrivere una nota in obsidian.&#xA;&#xA;Quindi, copiamo le cose con scp. Apriamo un terminale e:&#xA;&#xA;scp /path/to/your/graph.png user@domain:/home/.../writefreely/static/graph.png&#xA;&#xA;Qui stiamo buttando su l&#39;immagine nella cartella static di writefreely, che possiamo leggere per mettere immagini quando scriviamo i post. I ... indicano dove abbiamo messo il container di writefreely.&#xA;&#xA;Questo funziona perché, nel docker compose, abbiamo un volume per writefreely definito così&#xA;&#xA;volumes:&#xA;/home/.../writefreely:/data&#xA;&#xA;(Da capo: i ... completano il percorso su dove abbiamo messo il container di writefreely.)&#xA;&#xA;Basta? No&#xA;A questo punto l&#39;immagine è sulla VPS pronta per essere linkata. Aggiorno il post, linko l&#39;immagine tutto felice e... 404. L&#39;immagine non si vede.&#xA;Anche se è tutto giustoé. Che è successo? Che da fuori, cioè per l&#39;internet, l&#39;immagine non è visibile. Non è che chiunque bussi alla porta del nostro server deve trovare risposta e vedere l&#39;immagine. Arriva nginx: tra i suoi compiti c&#39;è quello di essere un server che mette a disposizione i file statici. Tipo le nostre immagini.&#xA;&#xA;Per prima cosa tocca aggiungere una scatola e metterci dentro nginx. Ci penserà lui a servire le immagini a chi le vuole.&#xA;&#xA;Aggiungiamo una ricetta al docker compose&#xA;&#xA;STATIC FILES (Nginx)&#xA;&#xA;static-files:&#xA;image: nginx:alpine&#xA;restart: always&#xA;volumes:&#xA;/home/.../writefreely/static:/usr/share/nginx/html:ro&#xA;&#xA;networks:&#xA;quello del vostro orchestratore&#xA;&#xA;labels:&#xA;a seconda di cosa usate potrebbero esser configurate.&#xA;&#xA;In pratica la riga che ci serve è quella dei volumi. Stiamo collegando una cartella del container di writefreely - static - a una cartella del container di nginx /usr/share/nginx/html.&#xA;Writefreely gestisce in quella cartella i file statici - è dove abbiamo caricato l&#39;immagine! - mentre, lato nginx, è da dove vengono serviti* i file. Ecco fatto.&#xA;&#xA;La parte sul network riguarda come l&#39;orchestratore fa parlare tra di loro le applicazioni presenti al suo interno. Sono dei canali di comunicazione tra le parti. Ad esempio: potrebbe esserci il network per tutte le applicazioni che hanno bisogno di parlare con la scatola del database (non è il caso di Writefreely che, come abbiamo visto, gestisce la cosa in proprio).&#xA;&#xA;Le labels sono invece dati extra che possiamo attaccare ai container. Possiamo usarle in modo che altri servizi che gestiscono più container possano capire cosa fare con quel container in base a quello che ci abbiamo scritto. Sono dei post-it.&#xA;E sono sufficientemente potenti: un&#39;etichetta con scritto sì/no e prima il nome di un servizio può dire al servizio se &#34;fare cose o meno&#34; al nostro scatolone di Writefreely. Ad esempio &#34;traefik.enable=true&#34;.&#xA;&#xA;Nel mio caso c&#39;era da mettere d&#39;accordo anche Traefik nella gestione rotte e nel servire le immagini. In pratica tocca dire a Traefik che, se qualcuno cerca di accedere a un file statico (static, dove spesso e volentieri mettiamo le immagini), allora il traffico va inoltrato al container di nginx che si prenderà in cura di mostra l&#39;immagine.&#xA;&#xA;Recap: volevamo solo delle immagini, adesso abbiamo volumi ed nginx&#xA;In pratica funziona così. Writefreely fa di tutto per essere efficiente e non avere fronzoli. Lo abbiamo già visto con la storia del database. L&#39;assenza di fronzoli include i non avere un box per fare l&#39;upload dei file. L&#39;idea è che usi i link con immagini hostate su altri siti.&#xA;Se però fai una chart tua e non la metti da altre parti - perché mettere in piedi un archivio con AWS ed S3 è seccante o altri motivi - allora tocca gestire il tutto in autonomia.&#xA;Ecco che arriva Nginx a fare da server per i file statici. Se i file sono in una certa cartella (quella del volume con static di mezzo), sono accessibili all&#39;esterno.&#xA;&#xA;Poi, in tutto questo, c&#39;è traefix a dirigere il traffico: se qualcuno vuole vedere il blog, traefik manda la richesta a writefreely. Quando però writefreely vuole accedere all&#39;immagine allora si pesca in casa propria.&#xA;&#xA;E poi?&#xA;Già che c&#39;ero, ho scoperto che qualcosa aveva distrutto il mio scatolone chitarristico.&#xA;Quindi ho dovuto prendere e trovare qualcosa per essere avvisato se qualcosa va giù.&#xA;Però questa sarà un&#39;altra storia...&#xA;&#xA;#indiecloud #docker #selfhosting #writefreely&#xA;&#xA;&lt;img src=&#34;https://analytics.thegui.eu/api/collect?payload=%7B%22website%22%3A%22111115f6-5128-422d-b6ae-6b776101b2bd%22%2C%22url%22%3A%22%2Fposts%2Fintroducing-indie-cloud%22%2C%22title%22%3A%22Introducing%20Indie%20Cloud%22%7D&amp;ts=1670000000&#34;&#xD;&#xA;style=&#34;display:none;width:1px;height:1px;&#34; alt=&#34;&#34;/  # Ci si vede nel Fediverso?&#xD;&#xA;In attesa di capire come funzionano i commenti in Writefreely, e se val la pena aggiungerli, mi trovate qui nel fediverso.]]&gt;</description>
      <content:encoded><![CDATA[<p>Nello scrivere il post sull&#39;inflazione mi sono accorto che una cosa semplice e scontata come pubblicare un&#39;immagine sul proprio blog poteva essere meno scontata se il blog in questione lo gestite voi dall&#39;inizio alla fine.</p>

<p>Quello che segue è un racconto su:
– come aggiornare la versione del proprio software (se quest&#39;onere è in carico a voi)
– come rendere caricare un&#39;immagine dal proprio pc al proprio sito se non c&#39;è un comodo modo per fare l&#39;upload
– come fare in modo che chi si connette a <code>vostrosito/static/immagine_caricata_a_fatica</code> non si becchi un 404.</p>

<p>A livello di strumenti, ci sarà da parlare di:
– <a href="https://it.wikipedia.org/wiki/Virtual_private_server">VPS</a>: la vostra casa online, il vostro server. La macchina a cui vi connettete per tenere su il tutto.
– Docker/container: la baracca si regge su Docker. Quello che vi serve – blog, database, qualsiasi cosa – sta dentro vari contenitori. <a href="https://it.wikipedia.org/wiki/Docker">Docker</a> si occupa di creare tutte le scatole, metterci dentro quello che volete e di far parlare le cose tra di loro. Ad esempio: la scatola 1 è un blog, la scatola due un e-commerce. Entrambe hanno bisogno di sapere che esiste una scatola 7 con il database.
– <a href="https://it.wikipedia.org/wiki/Nginx">ngix</a>: per gestire le immagini (questo non me lo aspettavo).</p>

<p>Il tutto per arrivare a poter vedere questa immagine <img src="https://thegui.eu/static/inflazione_2016.png" alt="immagine sull&#39;inflazione di qualche post fa"></p>



<h2 id="writefreely-e-l-aggiornamento">Writefreely e l&#39;aggiornamento</h2>

<p>Writefreely ultimamente ha avuto qualche problemino, almeno da quanto ho letto relativamente a Noblogo, il servizio di blog powered by writefreely gestito da <a href="https://devol.it">Devol</a>. Mi pare che sia qualcosa legato alla creazione di blog spam in un contesto multi utente.
Qualcosa potete leggerlo <a href="https://lemmy.world/post/49549993">qui</a>.</p>

<p>Il problema era sulla versione <code>v0.17.0</code>. Questo blog gira puoi lui con writefreely. Ho sudato freddo. Questo mi ha fatto pensare: da quando ho tirato su tutta mia baracca con writefreely a che versione sono? Che è successo? Sto spammando blog di neonazi e non me ne sono accorto?</p>

<p>Tocca quindi imparare un nuovo pezzo del <em>self-hosting</em>. <strong>Tocca a te aggiornare il software</strong>.
Visto che avevo in sospeso un problemino con le immagini, mi ci sono messo.</p>

<h1 id="come-aggiornare-le-versioni-delle-cose-selfhostate">Come aggiornare le versioni delle cose selfhostate</h1>

<p>Come dice Boskov, “<em>aggiornamento si fa cliccando su <code>aggiorna</code></em>”.
Che nel mondo dei terminali vuol dire “fai un <code>sudo qualcosa update</code> da qualche parte”.</p>

<p>Ad esempio, sulla vostra VPS ogni tot tocca fare un aggiornamento dei pacchetti. O magari il vostro orchestratore di container ha una nuova versione e dalla UI di Coolify o Portainer c&#39;è un pulsante per fare l&#39;update.</p>

<p>Solo che <strong>non è così</strong> semplice. Perché il blog viene tirato su dentro la sua scatola (container) seguendo una ricetta (immagine). Il quadro è simile a questo.</p>

<p>La baracca, che alcuni chiamano indiecloud, si regge su più servizi che stanno dentro le loro belle scatoline (container). A volte qualcosa può andare storto. Una scatola casca e si rompe, qualcuno la calpesta, o altro.
Il container va giù. Tocca quindi sostituire la scatola con una dove avete ricostruito per bene la app del vostro castello come si deve. Quindi ritirate su il container e lo fate ripartire. Basta un click (o un comando). Fichissimo.</p>

<p>Questo però ha un problema con questa prima idea di aggiornamento.
La scatola contiene il vostro drago rosso. La nuova versione di writefreely è un drago blu. Fate update del rosso a blu. Bello.
Però funziona fino a quando per disgrazia non va giù tutto e voi sostituite la scatola. Nelle vostre istruzioni, la ricetta dice che il drago è  rosso.
Non è la soluzione giusta.</p>

<p>A noi interessa cambiare le istruzioni e metterci dentro il drago blu. Così a ogni riavvio prendiamo l&#39;elemento giusto.</p>

<p>Quindi non bisogna entrare nel container e fare l&#39;aggiornamento ma bisogna riscrivere le regole.
In tecnichese tocca aggiornare il <strong>docker compose</strong>, in pratica il grande omino che sa dove stanno i pezzi dei lego, conosce tutte le ricette e dice come comporre i lego nelle varie scatole.</p>

<p>In pratica è bastato cambiare una sola riga:</p>

<p><code>image: ghcr.io/writefreely/writefreely:v0.17.1</code></p>

<p>(per decoro non vi dico a che versione ero prima).</p>

<p>Tutto finito?
Purtroppo no. La nuova versione ha dentro dei cambi allo schema del database – in pratica: a come vengono organizzate e salvate le cose. Ci sono nuove feature e il fix del bug nella nuova versione – alcune feature includono interazioni col fediverso. Per realizzare queste cose nuove tocca modificare lo schema del database... e ha senso: se da doomani volete tenere conto non solo dei libri che leggete ma di quante volte vi alzate col piede sinistro, vi tocca iniziare una nuova fila di X...</p>

<p>Per rendere questi cambiamenti attuali bisogno dire al nostro drago blu “aggiorna il tuo schema del database”.
C&#39;è anche un rituale magico per fare il cambio: <code>writefreely db migrate</code>.</p>

<p>Questo comando possiamo lanciarlo da dentro il nostro container in cui gira l&#39;applicazione di writefreely.
Quindi usando il dockerese una cosa del genere:</p>

<p><code>docker exec containerid /go/cmd/writefreely/writefreely db migrate</code>.</p>

<p>Quindi entro sulla VPS e ci metto un <code>sudo</code> davanti per eseguire il comando con i giusti poteri.
Funzionerà?</p>

<p>Ovviamente non può essere tutto così facile.</p>

<pre><code>Loading config.ini configuration...

ERROR: app.go:150: Unable to load configuration: open config.ini: no such file or directory`
</code></pre>

<p>La configurazione era nel posto sbagliato. Riproviamo dicendo al comando dove sta la configurazione</p>

<pre><code>docker exec containerid /go/cmd/writefreely/writefreely -c /data/config.ini db migrate
Loading /data/config.ini configuration...
Connecting to sqlite3 database...
Migrating to V17: fix post signature character set
Closing database connection...
</code></pre>

<p>(Tra le nuove feature, c&#39;è monetizzazione e link automatico col fediverso <a href="https://webmonetization.org/#start">https://webmonetization.org/#start</a> . Ho aggiornato per scoprire cose nuove.)</p>

<h1 id="ma-perché-funziona">Ma... perché funziona?</h1>

<p>Avevamo detto che non basta fare le modifiche nel container perché al primo riavvio vanno perse. Perché per la migrazione del database dovrebbe essere diverso?</p>

<p>Qui ci sono due risposte possibili:
1. il database di riferimento è esterno (sta in un container tutto suo – e vediamo quanti voti prende)
2. usiamo un qualche trucco per persistere i dati tra un riavvio e l&#39;altro.</p>

<p>Writefreely vuole essere autarchico e tutto in un punto. Quindi nella sua ricetta usa già SQLite come database. Se volete costruire una casa dove scrivere con Writefreely dovete solo prendere un container e installare lì dentro Writefreely, senza mal di testa per far parlare il vostro blog con un database, senza dover negoziare la struttura di come salviamo i post, etc. Senza troppe seccature extra oltre a quelle di “installiamo Writefreely da qualche parte, poi facciamo in modo che io possa scriverci e le persone leggermi”.
Dobbiamo quindi usare il trucco per persistere i dati.</p>

<p>Ci sta infatti che, in un mondo di scatoloni e sostituzioni, servano dei riferimenti a cose che restano stabili. Questi <code>wanderwall</code> in docker li han chiamati <code>volumi</code>.
In pratica prendiamo una cartella della macchina in cui inizieremo a far comparire e sparire i diversi container e diciamo che, container per container, certi dati devono persistere e vanno salvati o letti da una cartella specifica.</p>

<p>Nel grande magazzino in cui abbiamo messo gli scatoloni col lego colorato stiamo dicendo ad alcuni scatoloni di leggere o salvare su una mensola condivisa. Ad esempio potremmo toccare il cibo per il drago.</p>

<p>In questo modo possiamo salvarci il nuovo schema del database, senza ripartire da zero tutte le volte.</p>

<h1 id="immagini">Immagini</h1>

<p>Per le immagini, questa cosa dei volumi ci torna utile. Come faccio a mostrare la mia immagine dell&#39;inflazione?
Devo mettere su un volume le immagini da mostrare come file statici. In questo modo riuscirò a mostrarle.</p>

<p>In pratica l&#39;idea è questa:
1. dal nostro pc mandiamo l&#39;immagine sulla nostra VPS
2. la VPS la mette a disposizione di writefreely
3. e noi possiamo linkarla scrivendo il post. Come quando usiamo un po&#39; di markdown per scrivere una nota in obsidian.</p>

<p>Quindi, copiamo le cose con <a href="https://it.wikipedia.org/wiki/Secure_copy"><code>scp</code></a>. Apriamo un terminale e:</p>

<pre><code>scp /path/to/your/graph.png user@domain:/home/.../writefreely/static/graph.png
</code></pre>

<p>Qui stiamo buttando su l&#39;immagine nella cartella static di writefreely, che possiamo leggere per mettere immagini quando scriviamo i post. I <code>...</code> indicano dove abbiamo messo il container di writefreely.</p>

<p>Questo funziona perché, nel docker compose, abbiamo un volume per writefreely definito così</p>

<pre><code>volumes:
- /home/.../writefreely:/data
</code></pre>

<p>(Da capo: i <code>...</code> completano il percorso su dove abbiamo messo il container di writefreely.)</p>

<h1 id="basta-no">Basta? No</h1>

<p>A questo punto l&#39;immagine è sulla VPS pronta per essere linkata. Aggiorno il post, linko l&#39;immagine tutto felice e... 404. L&#39;immagine non si vede.
Anche se è *tutto giustoé. Che è successo? Che da fuori, cioè per l&#39;internet, l&#39;immagine non è visibile. Non è che chiunque bussi alla porta del nostro server deve trovare risposta e vedere l&#39;immagine. Arriva nginx: tra i suoi compiti c&#39;è quello di essere un server che mette a disposizione i file statici. Tipo le nostre immagini.</p>

<p>Per prima cosa tocca aggiungere una scatola e metterci dentro nginx. Ci penserà lui a servire le immagini a chi le vuole.</p>

<p>Aggiungiamo una ricetta al docker compose</p>

<pre><code># STATIC FILES (Nginx)

static-files:
image: nginx:alpine
restart: always
volumes:
- /home/.../writefreely/static:/usr/share/nginx/html:ro

networks:
- quello del vostro orchestratore

labels:
- a seconda di cosa usate potrebbero esser configurate.
</code></pre>

<p>In pratica la riga che ci serve è quella dei volumi. Stiamo collegando una cartella del container di writefreely – <code>static</code> – a una cartella del container di nginx <code>/usr/share/nginx/html</code>.
Writefreely gestisce in quella cartella i file statici – è dove abbiamo caricato l&#39;immagine! – mentre, lato nginx, è da dove vengono <em>serviti</em> i file. Ecco fatto.</p>

<p>La parte sul <code>network</code> riguarda come l&#39;orchestratore fa parlare tra di loro le applicazioni presenti al suo interno. Sono dei canali di comunicazione tra le parti. Ad esempio: potrebbe esserci il network per tutte le applicazioni che hanno bisogno di parlare con la scatola del database (non è il caso di Writefreely che, come abbiamo visto, gestisce la cosa in proprio).</p>

<p>Le <code>labels</code> sono invece dati extra che possiamo attaccare ai container. Possiamo usarle in modo che altri servizi che gestiscono più container possano capire cosa fare con quel container in base a quello che ci abbiamo scritto. Sono dei post-it.
E sono sufficientemente potenti: un&#39;etichetta con scritto sì/no e prima il nome di un servizio può dire al servizio se “fare cose o meno” al nostro scatolone di Writefreely. Ad esempio <code>&#34;traefik.enable=true&#34;</code>.</p>

<p>Nel mio caso c&#39;era da mettere d&#39;accordo anche Traefik nella gestione rotte e nel servire le immagini. In pratica tocca dire a Traefik che, se qualcuno cerca di accedere a un file statico (<code>static</code>, dove spesso e volentieri mettiamo le immagini), allora il traffico va inoltrato al container di nginx che si prenderà in cura di mostra l&#39;immagine.</p>

<h1 id="recap-volevamo-solo-delle-immagini-adesso-abbiamo-volumi-ed-nginx">Recap: volevamo solo delle immagini, adesso abbiamo volumi ed nginx</h1>

<p>In pratica funziona così. Writefreely fa di tutto per essere efficiente e non avere fronzoli. Lo abbiamo già visto con la storia del database. L&#39;assenza di fronzoli include i non avere un box per fare l&#39;upload dei file. L&#39;idea è che usi i link con immagini hostate su altri siti.
Se però fai una chart tua e non la metti da altre parti – perché mettere in piedi un archivio con AWS ed S3 è seccante o altri motivi – allora tocca gestire il tutto in autonomia.
Ecco che arriva Nginx a fare da server per i file statici. Se i file sono in una certa cartella (quella del volume con <code>static</code> di mezzo), sono accessibili all&#39;esterno.</p>

<p>Poi, in tutto questo, c&#39;è traefix a dirigere il traffico: se qualcuno vuole vedere il blog, traefik manda la richesta a writefreely. Quando però writefreely vuole accedere all&#39;immagine allora si pesca in casa propria.</p>

<h1 id="e-poi">E poi?</h1>

<p>Già che c&#39;ero, ho scoperto che qualcosa aveva distrutto il mio <a href="https://dojo.thegui.eu/">scatolone chitarristico</a>.
Quindi ho dovuto prendere e trovare qualcosa per essere avvisato se qualcosa va giù.
Però questa sarà un&#39;altra storia...</p>

<p><a href="https://thegui.eu/tag:indiecloud" class="hashtag"><span>#</span><span class="p-category">indiecloud</span></a> <a href="https://thegui.eu/tag:docker" class="hashtag"><span>#</span><span class="p-category">docker</span></a> <a href="https://thegui.eu/tag:selfhosting" class="hashtag"><span>#</span><span class="p-category">selfhosting</span></a> <a href="https://thegui.eu/tag:writefreely" class="hashtag"><span>#</span><span class="p-category">writefreely</span></a></p>

<p><img src="https://analytics.thegui.eu/api/collect?payload=%7B%22website%22%3A%22111115f6-5128-422d-b6ae-6b776101b2bd%22%2C%22url%22%3A%22%2Fposts%2Fintroducing-indie-cloud%22%2C%22title%22%3A%22Introducing%20Indie%20Cloud%22%7D&amp;ts=1670000000" style="display:none;width:1px;height:1px;" alt=""/></p>

<h1 id="ci-si-vede-nel-fediverso">Ci si vede nel Fediverso?</h1>

<p>In attesa di capire come funzionano i commenti in Writefreely, e se val la pena aggiungerli, mi trovate <a href="https://mastodon.bida.im/@endecasillabo">qui nel fediverso</a>.</p>
]]></content:encoded>
      <guid>https://thegui.eu/aggiornare-writefreely-visualizzare-le-immagini-self-hosting-docker-compose</guid>
      <pubDate>Sat, 08 Aug 2026 10:41:08 +0000</pubDate>
    </item>
  </channel>
</rss>