<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">
    <channel>
      <title>~&#x2F;magostinelli - fediverso</title>
      <link>https://www.agostinelli.eu</link>
      <description>La casa delle mie passioni</description>
      <generator>Zola</generator>
      <language>it</language>
      <atom:link href="https://www.agostinelli.eu/tags/fediverso/rss.xml" rel="self" type="application/rss+xml"/>
      <lastBuildDate>Sun, 13 Jul 2025 00:00:00 +0000</lastBuildDate>
      <item>
          <title>Forgejo con Docker: Git self-hosted senza fronzoli</title>
          <pubDate>Fri, 11 Jul 2025 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://www.agostinelli.eu/blog/forgejo-con-docker-git-self-hosted-senza-fronzoli/</link>
          <guid>https://www.agostinelli.eu/blog/forgejo-con-docker-git-self-hosted-senza-fronzoli/</guid>
          <description xml:base="https://www.agostinelli.eu/blog/forgejo-con-docker-git-self-hosted-senza-fronzoli/">&lt;p&gt;Da tempo utilizzo Git per gestire i miei progetti personali, sia software che di configurazione. Per anni mi sono affidato al pc di qualcunaltro (es: Gitlab o GitHub), ma la dipendenza da un servizio centralizzato, per quanto comodo, inizia a starmi stretta. Così ho cercato una soluzione più allineata alla mia filosofia: &lt;strong&gt;Forgejo&lt;&#x2F;strong&gt;, un fork comunitario di Gitea, leggero e facilmente self-hostabile.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;img.agostinelli.eu&#x2F;2025&#x2F;forgejo-logo.png&quot; alt=&quot;Forgejo&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;perche-forgejo&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#perche-forgejo&quot; aria-label=&quot;Anchor link for: perche-forgejo&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;a&gt;
Perché Forgejo&lt;&#x2F;h2&gt;
&lt;p&gt;Forgejo nasce da una comunità che punta alla trasparenza e all’autonomia, senza il rischio che un progetto venga assorbito o piegato a logiche commerciali. La compatibilità con Gitea è totale, e i requisiti minimi lo rendono perfetto per VPS o server casalinghi.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;veniamo-subito-al-dunque-e-facciamolo-partire-cosi-potremo-provarlo-con-mano&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#veniamo-subito-al-dunque-e-facciamolo-partire-cosi-potremo-provarlo-con-mano&quot; aria-label=&quot;Anchor link for: veniamo-subito-al-dunque-e-facciamolo-partire-cosi-potremo-provarlo-con-mano&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;a&gt;
Veniamo subito al dunque e facciamolo partire, cosi potremo provarlo con mano!&lt;&#x2F;h2&gt;
&lt;h2 id=&quot;setup-con-docker&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#setup-con-docker&quot; aria-label=&quot;Anchor link for: setup-con-docker&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;a&gt;
Setup con Docker&lt;&#x2F;h2&gt;
&lt;p&gt;Ci affidiamo a Docker Compose, cosi con un solo file di configurazione abbiamo tutto il necessario.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;docker-compose-yaml&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#docker-compose-yaml&quot; aria-label=&quot;Anchor link for: docker-compose-yaml&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;a&gt;
docker-compose.yaml&lt;&#x2F;h3&gt;
&lt;pre data-lang=&quot;bash&quot; class=&quot;language-bash z-code&quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;services:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;  &lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;forgejo:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;    &lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;image:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt; codeberg.org&#x2F;forgejo&#x2F;forgejo:latest&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;    &lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;container_name:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt; forgejo&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;    &lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;restart:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt; always&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;    &lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;environment:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;      &lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;-&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt; USER_UID=1000&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;      &lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;-&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt; USER_GID=1000&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;    &lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;volumes:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;      &lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;-&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt; .&#x2F;data:&#x2F;data&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;      &lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;-&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt; &#x2F;etc&#x2F;timezone:&#x2F;etc&#x2F;timezone:ro&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;      &lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;-&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt; &#x2F;etc&#x2F;localtime:&#x2F;etc&#x2F;localtime:ro&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;      &lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;-&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt; .&#x2F;robots.txt:&#x2F;data&#x2F;gitea&#x2F;public&#x2F;robots.txt:ro&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;    &lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;expose:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;      &lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;-&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt; &lt;span class=&quot;z-string z-quoted z-double z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-shell&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;3000&lt;span class=&quot;z-punctuation z-definition z-string z-end z-shell&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;    &lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;networks:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;      &lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;-&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt; forgejo_net&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;networks:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;  &lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;forgejo_net:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;    &lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;driver:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt; bridge&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;hr &#x2F;&gt;
&lt;h3 id=&quot;reverse-proxy&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#reverse-proxy&quot; aria-label=&quot;Anchor link for: reverse-proxy&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;a&gt;
Reverse Proxy&lt;&#x2F;h3&gt;
&lt;p&gt;E&#x27; possibile usare il web server che preferiamo, come ad esempio traefik, caddy, apache o nginx, in questo articolo vedremo un esempio con quest&#x27;ultimo.&lt;&#x2F;p&gt;
&lt;p&gt;Qui una configurazione base con https (via Let&#x27;s Encrypt, gestito esternamente):&lt;&#x2F;p&gt;
&lt;pre class=&quot;z-code&quot;&gt;&lt;code&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;&#x2F;etc&#x2F;nginx&#x2F;sites-available&#x2F;forgejo.conf
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;server {
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    listen 80;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    server_name git.miodominio.it;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    return 301 https:&#x2F;&#x2F;$host$request_uri;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;server {
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    listen 443 ssl;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    server_name git.miodominio.it;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    ssl_certificate &#x2F;etc&#x2F;letsencrypt&#x2F;live&#x2F;git.miodominio.it&#x2F;fullchain.pem;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    ssl_certificate_key &#x2F;etc&#x2F;letsencrypt&#x2F;live&#x2F;git.miodominio.it&#x2F;privkey.pem;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    location &#x2F; {
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;        proxy_pass http:&#x2F;&#x2F;localhost:3000;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;        proxy_set_header Host $host;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;        proxy_set_header X-Real-IP $remote_addr;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;        proxy_set_header X-Forwarded-Proto $scheme;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    }
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Dopo aver creato il file, attivare con:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;bash&quot; class=&quot;language-bash z-code&quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;ln&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt;&lt;span class=&quot;z-variable z-parameter z-option z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-parameter z-shell&quot;&gt; -&lt;&#x2F;span&gt;s&lt;&#x2F;span&gt; &#x2F;etc&#x2F;nginx&#x2F;sites-available&#x2F;forgejo.conf &#x2F;etc&#x2F;nginx&#x2F;sites-enabled&#x2F;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;nginx&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt;&lt;span class=&quot;z-variable z-parameter z-option z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-parameter z-shell&quot;&gt; -&lt;&#x2F;span&gt;t&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-logical z-and z-shell&quot;&gt;&amp;amp;&amp;amp;&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;systemctl&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt; reload nginx&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;backup-automatico&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#backup-automatico&quot; aria-label=&quot;Anchor link for: backup-automatico&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;a&gt;
Backup automatico&lt;&#x2F;h2&gt;
&lt;p&gt;Il backup rappresenta un step fondamentale del nostro setup, conviene implementarne subito uno all&#x27;avvio del servizio, cosi non ce ne dimenticvheremo e terremo i nostri dati al sicuro. Ricordiamoci che qui salveremo il risultato di diverse ore di programmazione, studio e prove!&lt;&#x2F;p&gt;
&lt;p&gt;I nostri dati si trovano nel volume data di cui sopra, quindi sarà sufficiente salvare il docker file e la directory data.
Io consiglio di usare #borg ma potete usare il softwsre che preferite, trovo particolarmente utile aggiungere questa nuova directory alle procedure di salvataggio che sicuremante avrete già per tutto il resto.
(se non le avete potete anche smettere di leggere questo blog, tornate quando ne avrete implementata una).&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;configurazioni-iniziali&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#configurazioni-iniziali&quot; aria-label=&quot;Anchor link for: configurazioni-iniziali&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;a&gt;
Configurazioni iniziali&lt;&#x2F;h2&gt;
&lt;p&gt;A questo punto, dopo l&#x27;installazione, non ci resta che accedere via web al nostro software e fare le prime configurazioni.
È possibile creare utenti, organizzazioni, concedere permessi e creare tutti i repository che si desiderano.&lt;&#x2F;p&gt;
&lt;p&gt;Ciascun progetto può essere impostato ad accesso &lt;em&gt;privatp&lt;&#x2F;em&gt; o &lt;em&gt;pubblico&lt;&#x2F;em&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;In questo modo sarà semplicissimo collaborare in più persone allo stesso progetto, tenendo traccia delle varie modifiche.&lt;&#x2F;p&gt;
&lt;p&gt;Infine è anche possibile importare direttamente altri repository git.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;runner-e-action&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#runner-e-action&quot; aria-label=&quot;Anchor link for: runner-e-action&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;a&gt;
Runner e Action&lt;&#x2F;h2&gt;
&lt;p&gt;Forgejo, essendo un fork di Gitea, supporta un sistema di &lt;em&gt;CI&#x2F;CD&lt;&#x2F;em&gt; integrato chiamato Actions, simile a GitHub Actions, e permette di eseguire job di build o deploy tramite runner personalizzati.&lt;&#x2F;p&gt;
&lt;p&gt;Io stesso ne faccio uso, è uno dei motivi per cui mi sto trovando benissimo con forgejo! Ho varie configurazione a seconda del progetto ospitato, ma essenzialmente queste si occupano di effettuare il &quot;deploy&quot; del codice, cioé copiano a destinazione (server di sviluppo o di produzione a seconda dei casi), il codice modificato, cosi che sia pronto all&#x27;uso.
In questo modo, grazie alla history di git, sarà sempre possibile tornare indietro, nonché tenere traccia delle modifiche nel tempo.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;come-funziona&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#come-funziona&quot; aria-label=&quot;Anchor link for: come-funziona&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;a&gt;
Come funziona&lt;&#x2F;h3&gt;
&lt;p&gt;Le Actions sono definite da file YAML nei repository (.forgejo&#x2F;workflows&#x2F;), e possono contenere job con step eseguiti su runner registrati.&lt;&#x2F;p&gt;
&lt;p&gt;I runner sono agent installati su macchine (stessa VPS o remote), che si collegano al server Forgejo e attendono job da eseguire.&lt;&#x2F;p&gt;
&lt;p&gt;Una volta definita la condizione scatenante (es: commit su ramo main, rilascio di una nuova versione, ecc) partirà il worksflow che abbiamo definito, con la possibilità di verificarne lo stato di esecuzione in tempo reale. Infine è anche possibile andare a vedere i log delle esecuzione precedenti.&lt;&#x2F;p&gt;
&lt;p&gt;All&#x27;interno di una action si possono usare #secret e #variabili, in modo da poter riusare il codice della action e allo stesso tempo mantenere al sicuro le credenziali.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;setup-runner-base&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#setup-runner-base&quot; aria-label=&quot;Anchor link for: setup-runner-base&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;a&gt;
Setup runner base&lt;&#x2F;h3&gt;
&lt;p&gt;Vediamo come creare un nuovo runner, passo passo:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;bash&quot; class=&quot;language-bash z-code&quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-storage z-modifier z-shell&quot;&gt;export&lt;&#x2F;span&gt; &lt;span class=&quot;z-variable z-other z-readwrite z-assignment z-shell&quot;&gt;RUNNER_VERSION&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-assignment z-shell&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-unquoted z-shell&quot;&gt;&lt;span class=&quot;z-meta z-group z-expansion z-command z-parens z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-variable z-shell&quot;&gt;$&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-parens z-begin z-shell&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;curl&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt;&lt;span class=&quot;z-variable z-parameter z-option z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-parameter z-shell&quot;&gt; -&lt;&#x2F;span&gt;X&lt;&#x2F;span&gt; &lt;span class=&quot;z-string z-quoted z-single z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-shell&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;GET&lt;span class=&quot;z-punctuation z-definition z-string z-end z-shell&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; https:&#x2F;&#x2F;data.forgejo.org&#x2F;api&#x2F;v1&#x2F;repos&#x2F;forgejo&#x2F;runner&#x2F;releases&#x2F;latest&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-logical z-pipe z-shell&quot;&gt;|&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;jq&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt; .name&lt;span class=&quot;z-variable z-parameter z-option z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-parameter z-shell&quot;&gt; -&lt;&#x2F;span&gt;r&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-logical z-pipe z-shell&quot;&gt;|&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;cut&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt;&lt;span class=&quot;z-variable z-parameter z-option z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-parameter z-shell&quot;&gt; -&lt;&#x2F;span&gt;c&lt;&#x2F;span&gt; 2-&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-parens z-end z-shell&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;wget&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt;&lt;span class=&quot;z-variable z-parameter z-option z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-parameter z-shell&quot;&gt; -&lt;&#x2F;span&gt;O&lt;&#x2F;span&gt; forgejo-runner https:&#x2F;&#x2F;code.forgejo.org&#x2F;forgejo&#x2F;runner&#x2F;releases&#x2F;download&#x2F;v&lt;span class=&quot;z-meta z-group z-expansion z-parameter z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-variable z-shell&quot;&gt;$&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-expansion z-parameter z-begin z-shell&quot;&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-expansion z-parameter z-shell&quot;&gt;&lt;span class=&quot;z-variable z-other z-readwrite z-shell&quot;&gt;RUNNER_VERSION&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-expansion z-parameter z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-expansion z-parameter z-end z-shell&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&#x2F;forgejo-runner-&lt;span class=&quot;z-meta z-group z-expansion z-parameter z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-variable z-shell&quot;&gt;$&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-expansion z-parameter z-begin z-shell&quot;&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-expansion z-parameter z-shell&quot;&gt;&lt;span class=&quot;z-variable z-other z-readwrite z-shell&quot;&gt;RUNNER_VERSION&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-expansion z-parameter z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-expansion z-parameter z-end z-shell&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;-linux-amd64&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;chmod&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt; +x forgejo-runner&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt; mv forgejo-runner &#x2F;usr&#x2F;local&#x2F;bin&#x2F;forgejo-runner&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt; useradd&lt;span class=&quot;z-variable z-parameter z-option z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-parameter z-shell&quot;&gt; -&lt;&#x2F;span&gt;m&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-option z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-parameter z-shell&quot;&gt; -&lt;&#x2F;span&gt;s&lt;&#x2F;span&gt; &#x2F;bin&#x2F;bash forgejo-runner&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt; usermod&lt;span class=&quot;z-variable z-parameter z-option z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-parameter z-shell&quot;&gt; -&lt;&#x2F;span&gt;aG&lt;&#x2F;span&gt; docker forgejo-runner&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Rechiamoci sull&#x27;interfaccia web di Forgejo:
&lt;em&gt;Forgejo &amp;gt; Repository &amp;gt; Settings &amp;gt; Actions &amp;gt; Runners &amp;gt; &quot;Generate new token&quot;&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;bash&quot; class=&quot;language-bash z-code&quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt;&lt;span class=&quot;z-variable z-parameter z-option z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-parameter z-shell&quot;&gt; -&lt;&#x2F;span&gt;i&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-option z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-parameter z-shell&quot;&gt; -&lt;&#x2F;span&gt;u&lt;&#x2F;span&gt; forgejo-runner&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;forgejo-runner&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt; register&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h4 id=&quot;avvio-automatico-del-runner&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#avvio-automatico-del-runner&quot; aria-label=&quot;Anchor link for: avvio-automatico-del-runner&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;a&gt;
Avvio automatico del runner&lt;&#x2F;h4&gt;
&lt;p&gt;Io ho usato uno script systemd per l&#x27;avvio automatico, ve lo riporto di seguito&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;bash&quot; class=&quot;language-bash z-code&quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt; echo &lt;span class=&quot;z-string z-quoted z-double z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-shell&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt;&lt;span class=&quot;z-string z-quoted z-double z-shell&quot;&gt;[Unit]
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt;&lt;span class=&quot;z-string z-quoted z-double z-shell&quot;&gt;Description=Forgejo Act Runner
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt;&lt;span class=&quot;z-string z-quoted z-double z-shell&quot;&gt;After=network.target docker.service
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt;&lt;span class=&quot;z-string z-quoted z-double z-shell&quot;&gt;Requires=docker.service
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt;&lt;span class=&quot;z-string z-quoted z-double z-shell&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt;&lt;span class=&quot;z-string z-quoted z-double z-shell&quot;&gt;[Service]
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt;&lt;span class=&quot;z-string z-quoted z-double z-shell&quot;&gt;User=forgejo-runner
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt;&lt;span class=&quot;z-string z-quoted z-double z-shell&quot;&gt;Group=forgejo-runner
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt;&lt;span class=&quot;z-string z-quoted z-double z-shell&quot;&gt;ExecStart=&#x2F;usr&#x2F;local&#x2F;bin&#x2F;forgejo-runner daemon
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt;&lt;span class=&quot;z-string z-quoted z-double z-shell&quot;&gt;Restart=always
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt;&lt;span class=&quot;z-string z-quoted z-double z-shell&quot;&gt;WorkingDirectory=&#x2F;home&#x2F;forgejo-runner
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt;&lt;span class=&quot;z-string z-quoted z-double z-shell&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt;&lt;span class=&quot;z-string z-quoted z-double z-shell&quot;&gt;[Install]
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt;&lt;span class=&quot;z-string z-quoted z-double z-shell&quot;&gt;WantedBy=multi-user.target&lt;span class=&quot;z-punctuation z-definition z-string z-end z-shell&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-assignment z-redirection z-shell&quot;&gt;&amp;gt;&lt;&#x2F;span&gt; &#x2F;etc&#x2F;systemd&#x2F;system&#x2F;forgejo-runner.service&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt; systemctl daemon-reload&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt; systemctl enable forgejo-runner&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt; systemctl start forgejo-runner&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;systemctl&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt; status forgejo-runner&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;vantaggi-in-breve&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#vantaggi-in-breve&quot; aria-label=&quot;Anchor link for: vantaggi-in-breve&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;a&gt;
Vantaggi in breve&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;Repository del proprio codice, diviso come si preferisce: singoli progetti, organizzazioni, ecc.&lt;&#x2F;li&gt;
&lt;li&gt;Possibilità di creare utenti per collaboratori&#x2F;amici con controllo sugli accessi&#x2F;permessi.&lt;&#x2F;li&gt;
&lt;li&gt;Automatizzo test, build, deploy senza dipendere da servizi esterni.&lt;&#x2F;li&gt;
&lt;li&gt;Nessuna dipendenza da fornitori terzi e nessun limite di spazio, esecuzioni, personalizzazioni.&lt;&#x2F;li&gt;
&lt;li&gt;Versionamento del codice, e nel caso di ci&#x2F;cd garanzia di riproducibilità&lt;&#x2F;li&gt;
&lt;li&gt;Pocchissime risorse necessarie lato server&lt;&#x2F;li&gt;
&lt;li&gt;Vuoi mettere quanto è figo avere il proprio servizio di versionamento?&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;uso-quotidiano&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#uso-quotidiano&quot; aria-label=&quot;Anchor link for: uso-quotidiano&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;a&gt;
Uso quotidiano&lt;&#x2F;h2&gt;
&lt;p&gt;Forgejo supporta #git via #ssh, Web UI e #webhooks. Ho configurato alcuni repository con CI locale usando le Actions e i runner integrati. L’interfaccia è leggera e pulita, senza funzionalità inutili.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;conclusioni&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#conclusioni&quot; aria-label=&quot;Anchor link for: conclusioni&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;a&gt;
Conclusioni&lt;&#x2F;h2&gt;
&lt;p&gt;Forgejo è una soluzione Git solida, coerente con un approccio decentralizzato. Semplice da gestire, veloce da installare, e adatta anche per chi – come me – preferisce sapere dove stanno i propri dati. Per ora lo utilizzo solo per progetti personali, ma potrei iniziare a usarlo anche per collaborazioni future.&lt;&#x2F;p&gt;
&lt;p&gt;Non vi resta che provarlo, fatemi sapere le vostre impressioni con un commento nel #fediverso su questo articolo.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Writefreely: il blog della semplicità</title>
          <pubDate>Sun, 15 Sep 2024 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://www.agostinelli.eu/blog/writefreely-il-blog-della-semplicita/</link>
          <guid>https://www.agostinelli.eu/blog/writefreely-il-blog-della-semplicita/</guid>
          <description xml:base="https://www.agostinelli.eu/blog/writefreely-il-blog-della-semplicita/">&lt;p&gt;Questo #blog è realizzato con il software #writefreely, la più semplice piattaforma per scrivere contenuti permanenti sul web.
&lt;img src=&quot;https:&#x2F;&#x2F;img.agostinelli.eu&#x2F;2024&#x2F;writefreely_logo.png&quot; alt=&quot;Writefreely Logo&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;caratteristiche&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#caratteristiche&quot; aria-label=&quot;Anchor link for: caratteristiche&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;a&gt;
Caratteristiche&lt;&#x2F;h2&gt;
&lt;p&gt;Si tratta di un software minimalista con cui creare un Blog, o anche un&#x27;intera comunità di più blog.&lt;&#x2F;p&gt;
&lt;p&gt;Tra le funzionalità, abbiamo l&#x27;&lt;strong&gt;autosaving&lt;&#x2F;strong&gt;, un editor lineare, senza distrazioni, con il supporto di #markup language.
Quella che può sembrare una limitazione, invece è un vantaggio: ci si concentra sul contenuto, e non sull&#x27;apparenza.&lt;&#x2F;p&gt;
&lt;p&gt;Ci sono sia il supporto per il feed rss che la federazione con il #fediverso.
&lt;img src=&quot;https:&#x2F;&#x2F;img.agostinelli.eu&#x2F;2024&#x2F;writefreely_updates.png&quot; alt=&quot;Rss Fediverso&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;federazione&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#federazione&quot; aria-label=&quot;Anchor link for: federazione&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;a&gt;
Federazione&lt;&#x2F;h2&gt;
&lt;p&gt;I vostri post saranno federati con il fediverso, per cui, ad esempio, chiunque abbiamo un account su #mastodon potrà seguire il vostro blog.
Se non sapete cos&#x27;è il #fediverso, potete approfondire qui: https:&#x2F;&#x2F;fediverso.it&lt;&#x2F;p&gt;
&lt;h2 id=&quot;installazione-e-configurazione&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#installazione-e-configurazione&quot; aria-label=&quot;Anchor link for: installazione-e-configurazione&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;a&gt;
Installazione e configurazione&lt;&#x2F;h2&gt;
&lt;p&gt;Software leggerissimo, occupa pochissime risorse ed è un solo semplice eseguibile, con l&#x27;unico requisito di un database #mysql, che \e dove saranno salvati i contenuti.&lt;&#x2F;p&gt;
&lt;p&gt;Se volete cimentarvi nell&#x27;installazione e configurazione, seguita la guida ufficiale, davvero molto semplice, ma esaustiva:
https:&#x2F;&#x2F;writefreely.org&#x2F;start&lt;&#x2F;p&gt;
&lt;h2 id=&quot;gestione-immagini&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#gestione-immagini&quot; aria-label=&quot;Anchor link for: gestione-immagini&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;a&gt;
Gestione Immagini&lt;&#x2F;h2&gt;
&lt;p&gt;Dopo averlo provato, l&#x27;unica cose di cui sentivo la mancanza era una gestione delle #immagini, ma ho risolto in maniera molto semplice e utile, vi lascio all&#x27;articolo che avevo scritto a tal proposito (basterà cliccare sul tag #immagini).&lt;&#x2F;p&gt;
&lt;p&gt;##Personalizzazione
E&#x27; possibile configurarlo per gestire più blog o uno soltanto (il sito sui cui vi trovato è in modalità mono).&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;img.agostinelli.eu&#x2F;2024&#x2F;writefreely_publicity.png&quot; alt=&quot;Pubblicazione post&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Ciascun blog, può essere configurato i 3 modalità:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Pubblico&lt;&#x2F;strong&gt;: tutti leggono i vostri articoli.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Privato&lt;&#x2F;strong&gt;: accessibile solo agli utenti registrati&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Protetto da password&lt;&#x2F;strong&gt;: unica per tutti per poter leggere&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;Riguardo al punto 1, starà poi a voi decidere se renderlo &lt;strong&gt;indicizzabile dai motori di ricerca&lt;&#x2F;strong&gt; oppure no, semplicemente configurando il file #robots.txt&lt;&#x2F;p&gt;
&lt;p&gt;Esistono 3 &lt;strong&gt;modalità di visualizzazione&lt;&#x2F;strong&gt; dei post:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Blog&lt;&#x2F;strong&gt;: vengono mostrate le data degli articoli che saranno visualizzati dal più recente.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Novel&lt;&#x2F;strong&gt;: nessuna data degli articoli, ordinamento dal primo post in poi&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Notebook&lt;&#x2F;strong&gt;: nessuna data degli articoli, ordinamento dal post più recente.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;img.agostinelli.eu&#x2F;2024&#x2F;writefreely_display_post.png&quot; alt=&quot;Display post&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Infine è disponibile un campo per la firma da personalizzare, questo &lt;em&gt;&quot;pezzetto&quot;&lt;&#x2F;em&gt; di testo, o codice, sarà presente in calce a tutti gli articoli.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;css&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#css&quot; aria-label=&quot;Anchor link for: css&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;a&gt;
Css&lt;&#x2F;h3&gt;
&lt;p&gt;Le uniche &lt;strong&gt;personalizzazioni grafiche&lt;&#x2F;strong&gt; realizzabili sono tramite il #css, è possibile trovare in rete dei temi giù pronti da cui partire, tramite i quali personalizzare colori, stili, dimensioni e distanze della pagina, in pieno spirito minimalista.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;conclusioni&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#conclusioni&quot; aria-label=&quot;Anchor link for: conclusioni&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;a&gt;
Conclusioni&lt;&#x2F;h2&gt;
&lt;p&gt;Personalmente trovo sia davvero piacevole aprire la schermata di nuovo articolo e trovare un schermo pulito, vuoto, in cui concentrarsi sulla scrittura e quindi sul contenuto, &lt;em&gt;less is more&lt;&#x2F;em&gt;!&lt;&#x2F;p&gt;
&lt;p&gt;Ho scelto questo software perché non avevo bisogno di fare chissà quale cose strabilianti, ma appunto la necessità era quella di scrivere qualcosa utile per gli altri, ma anche per me (scrivere mi rilassa).&lt;&#x2F;p&gt;
&lt;p&gt;Costa aspettate a provarlo? Per chi non si vuol sbattere (o non ha dove farlo) nell&#x27;installazione, consiglio questo sito dove potete aprire il vostro blog writefreely: https:&#x2F;&#x2F;noblogo.org&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Writefreely e uso delle immagini </title>
          <pubDate>Thu, 07 Dec 2023 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://www.agostinelli.eu/blog/writefreely-e-uso-delle-immagini/</link>
          <guid>https://www.agostinelli.eu/blog/writefreely-e-uso-delle-immagini/</guid>
          <description xml:base="https://www.agostinelli.eu/blog/writefreely-e-uso-delle-immagini/">&lt;p&gt;Quando ho deciso di riaprire un blog, ho optato per il software #writefreely, per due buone ragioni: la prima per la sua &lt;strong&gt;semplicità&lt;&#x2F;strong&gt;, la seconda perché si integra con il #fediverso (#actvitypub).&lt;&#x2F;p&gt;
&lt;p&gt;Una delle cont indicazioni della sua semplicità è il suo limite con le immagini, infatti &lt;strong&gt;non supporta&lt;&#x2F;strong&gt;, nativamente, il &lt;strong&gt;caricamento delle immagini&lt;&#x2F;strong&gt;, cosa che trovo un po&#x27; scomoda per un blog.&lt;&#x2F;p&gt;
&lt;p&gt;Quindi mi sono messo a pensare cercando di fare necessità virtù.
Dato che ho un mio #server personale (dove è ospitato anche questo blog), mi è venuto naturale creare un nuovo #virtualhost su #apache (il webserver che uso).
In questo modo posso caricare tutte le &lt;strong&gt;immagini&lt;&#x2F;strong&gt; che voglio &lt;strong&gt;senza limiti&lt;&#x2F;strong&gt;.
Alla soluzione mancava un ultima cosa, ovvero come gestire il caricamento delle immagini. Esistono vari software opensource da poter installare (es: &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;ldidry&#x2F;lutim&quot;&gt;lutim&lt;&#x2F;a&gt;), ma ho scartato questa ipotesi perché si sarebbe trattato dell&#x27;ennesimo software da gestire, solo per poter caricare una manciata di immagini.
Dato su questo stesso server uso &lt;strong&gt;#nextcloud&lt;&#x2F;strong&gt;, mi è venuta un&#x27;idea geniale: montare la directory usata per il virtual host come &lt;strong&gt;archivio esterno!&lt;&#x2F;strong&gt;
In questo modo il caricamento dei file è comunque protetto all&#x27;accesso nextcloud, il quale mi fornisce anche una &lt;strong&gt;semplice interfaccia&lt;&#x2F;strong&gt; per il caricamento delle #immagini!&lt;&#x2F;p&gt;
&lt;p&gt;Prima la salutarvi, proviamola questa soluzione per le immagini!
Ecco qua due immagini, scaricate dal web a aggiunte a nextcloud direttamente da dispositivo mobile!
(addirottura la seconda è in formato #svg)&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;img.agostinelli.eu&#x2F;2023&#x2F;nextcloud.png&quot; alt=&quot;nextcloud logo&quot; &#x2F;&gt;
&lt;img src=&quot;https:&#x2F;&#x2F;img.agostinelli.eu&#x2F;2023&#x2F;writefreely.svg&quot; alt=&quot;writefreely logo&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;A presto.&lt;&#x2F;p&gt;
&lt;p&gt;P. S. Questo articolo è allo stesso tempo un test, ho provato ad inserire un po&#x27; di hashtag in giro, vediamo come funziona.&lt;&#x2F;p&gt;
</description>
      </item>
    </channel>
</rss>
