From f5c763be7bea98d3a77560c8046b6f8b950167dc Mon Sep 17 00:00:00 2001 From: zomas Date: Tue, 1 Sep 2026 16:54:15 +0200 Subject: [PATCH] Gitea theme: capital theta (circle+H) logo + homepage senza badge - Logo/favicon ridisegnati come theta maiuscola: cerchio (anello) con 'H' centrata, clearance verificata (non tocca l'anello); ring ispessito per la favicon; centratura ottica verificata. - Rimosso il badge 'Self-hosted Git' dal hero della homepage (era esteticamente di troppo) - CSS e markup. - Aggiornati generate_theta.py, README, home.tmpl; caricati sul VPS in staging (md5 locali == remoti); tarball ricostruito. - Salvataggio iniziale dell'intero admin pack in git. --- .gitignore | 3 + STATO_SESSIONE_2026-09-01.md | 92 +++++++ backup_gitea.sh | 30 +++ comandi_backup_root.txt | 2 + fix_gitea_builtin_ssh.sh | 26 ++ fix_gitea_ssh_listen.sh | 18 ++ fix_mailer_deprecation.sh | 26 ++ fix_warning_gitea.sh | 12 + gitea-theme-pack.tar.gz | Bin 0 -> 16185 bytes gitea-theme-pack/README.md | 95 +++++++ .../public/assets/img/apple-touch-icon.png | Bin 0 -> 2924 bytes .../custom/public/assets/img/favicon.png | Bin 0 -> 1058 bytes .../custom/public/assets/img/favicon.svg | 8 + .../custom/public/assets/img/logo.png | Bin 0 -> 3713 bytes .../custom/public/assets/img/logo.svg | 8 + gitea-theme-pack/custom/templates/home.tmpl | 143 ++++++++++ gitea-theme-pack/generate_theta.py | 139 ++++++++++ gitea-theme-pack/gitea_theme.sh | 133 ++++++++++ gitea-theme-pack/install_gitea_theme.sh | 80 ++++++ gitea-theme-pack/rollback_gitea_theme.sh | 62 +++++ .../homepage_original_20260901-152245.html | 245 +++++++++++++++++ install_backup_gitea.sh | 59 +++++ install_gitea_vps.sh | 249 ++++++++++++++++++ 23 files changed, 1430 insertions(+) create mode 100644 .gitignore create mode 100644 STATO_SESSIONE_2026-09-01.md create mode 100644 backup_gitea.sh create mode 100644 comandi_backup_root.txt create mode 100644 fix_gitea_builtin_ssh.sh create mode 100644 fix_gitea_ssh_listen.sh create mode 100644 fix_mailer_deprecation.sh create mode 100644 fix_warning_gitea.sh create mode 100644 gitea-theme-pack.tar.gz create mode 100644 gitea-theme-pack/README.md create mode 100644 gitea-theme-pack/custom/public/assets/img/apple-touch-icon.png create mode 100644 gitea-theme-pack/custom/public/assets/img/favicon.png create mode 100644 gitea-theme-pack/custom/public/assets/img/favicon.svg create mode 100644 gitea-theme-pack/custom/public/assets/img/logo.png create mode 100644 gitea-theme-pack/custom/public/assets/img/logo.svg create mode 100644 gitea-theme-pack/custom/templates/home.tmpl create mode 100644 gitea-theme-pack/generate_theta.py create mode 100755 gitea-theme-pack/gitea_theme.sh create mode 100755 gitea-theme-pack/install_gitea_theme.sh create mode 100755 gitea-theme-pack/rollback_gitea_theme.sh create mode 100644 homepage-backup/homepage_original_20260901-152245.html create mode 100644 install_backup_gitea.sh create mode 100644 install_gitea_vps.sh diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..01a36aa --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +# Segreti — MAI commitare +vps_ssh.env +risultati.txt \ No newline at end of file diff --git a/STATO_SESSIONE_2026-09-01.md b/STATO_SESSIONE_2026-09-01.md new file mode 100644 index 0000000..30237b3 --- /dev/null +++ b/STATO_SESSIONE_2026-09-01.md @@ -0,0 +1,92 @@ +# STATO SESSIONE — Gitea + Cloudflare (1 set 2026) + +File di memorizzazione del lavoro fatto, per riprendere dopo un cambio di +ambito. Aggiornato: 2026-09-01. + +--- + +## 1. Obiettivo della sessione + +Deploy di **Gitea** sul VPS OVH (145.239.94.49, Debian 12) come `https://git.zomas.net` +per tracciare il progetto Tacticus e aprirlo (in futuro) a contributi esterni. +Backup automatico incluso. Tutto completato e verificato. + +--- + +## 2. Stato finale (TUTTO FUNZIONANTE) + +| Componente | Stato | +|---|---| +| Gitea 1.27.3 | attivo (systemd, `/etc/gitea/app.ini`), DB sqlite `/var/lib/gitea/data/gitea.db` | +| Web | `https://git.zomas.net` → Apache → `127.0.0.1:3000` (200 esterno) | +| SSH git | server **built-in** Gitea su `0.0.0.0:2222` (host key ed25519/rsa/ecdsa) | +| SSH cliente | questo PC → `gitea@git.zomas.net:2222` (IP origine 145.239.94.49, chiave `~/.ssh/id_ed25519`) | +| Repo | `zomas/tacticus` **privato**, `main`, con README + `bot/.env.example` | +| Mailer | `smtp+starttls` → smtp.gmail.com:587, App Password, test email **ok** | +| 2FA | attiva (richiesta globale) + `TWO_FACTOR_AUTH=enforced` | +| Backup | `/var/backups/gitea/gitea-dump-*.zip` (gitea dump, cron giornaliero 02:30, retention 14gg) | +| Cloudflare | proxy arancio su git/zomas.net/zomas.org, SSL Full (strict), Universal SSL, CAA a posto | + +### Warning Gitea: TUTTI RISOLTI +- `https://(null)/` → colpa di `RequestHeader set Host %{HTTP_HOST}e` in Apache + (Host vuoto). Rimosso, basta `ProxyPreserveHost On`. +- Deprecazioni `[mailer].MAILER_TYPE/HOST/IS_TLS_ENABLED/SKIP_VERIFY` → + opzioni moderne (`PROTOCOL=smtp+starttls`, `SMTP_ADDR`, `SMTP_PORT`). + Log: "NESSUNA deprecazione residua". + +--- + +## 3. Errori incontrati e soluzioni (utile se si ripete) + +1. **`(null)` nel warning** → `RequestHeader set Host %{HTTP_HOST}e` sovrascrive Host + con vuoto (variabile senza valore). Fix: riga rimossa. +2. **Server SSH non partiva** → Gitea default `START_SSH_SERVER=false` (usa OpenSSH + esterno). Config: `START_SSH_SERVER=true` + `SSH_LISTEN_HOST=0.0.0.0`. + Con built-in, l'utente SSH è il **RUN_USER di Gitea = `gitea`** (NON `git`, + NON zomas): remote = `gitea@git.zomas.net:zomas/tacticus.git`. +3. **`git@` "Permission denied"** → normale: il client SSH deve usare `gitea@`. + Config in `~/.ssh/config`: `Host git.zomas.net → HostName 145.239.94.49, + Port 2222, User gitea`. +4. **Cloudflare non passa TCP 2222** → il record proxied serve solo 80/443; + per SSH si punta all'IP origine via `HostName 145.239.94.49`. +5. **SSH rifiuto public key "invalid \r"** → il `.pub` finiva con CRLF; STRIPPARE `\r` + prima di POST all'API `POST /api/v1/user/keys`. +6. **Backup "permission denied"** → `gitea dump` gira come utente `gitea`, che non + può scrivere in `/var/backups/gitea` (root). Fix: dump in `/tmp`, poi `mv` da root. +7. **Sole IPv6 da questo PC** → `git.zomas.net` risolve solo IPv6 (anycast CF); + per curl ok, per ssh serve IP IPv4 esplicito. + +--- + +## 4. Credenziali / segreti (NON committare) + +- `/home/zomas/vps-admin/vps_ssh.env` — `VPS_*`, `TOKEN_CLOUDFLARE`, `GITEA_TOKEN` +- `bot/.env` — chiavi API Tacticus + token bot Telegram (niente nel repo) +- Il repo `tacticus.git` NON contiene segreti (verificato: `.env`, `vps_ssh.env`, + `risultati.txt`, script setup esclusi da `.gitignore`). + +--- + +## 5. Comandi utili + +```bash +# SSH git (da questo PC) +git -C /home/zomas/tacticus remote -v # gitea@git.zomas.net:zomas/tacticus.git +git -C /home/zomas/tacticus push # aggiorna il remote + +# Backup manuale (da root sul VPS) +/usr/local/sbin/backup_gitea.sh +ls -lh /var/backups/gitea/ # retention 14 giorni + +# Stato servizi +systemctl status gitea apache2 cron # VPS +ss -tlnp | grep -E ':(2222|3000)\b' +``` + +--- + +## 6. PROSSIMI PASSI (cambio di ambito dell'utente) + +- (Opzionale) Download automatico dei backup VPS sul PC locale (ora solo sul VPS). +- (Opzionale) Girare il repo `tacticus` da privato a pubblico + aprire contributi. +- (Opzionale) `daily.py --fresh` (proposta rimasta aperta dal 31 ago, mai richiesta). \ No newline at end of file diff --git a/backup_gitea.sh b/backup_gitea.sh new file mode 100644 index 0000000..3dfd115 --- /dev/null +++ b/backup_gitea.sh @@ -0,0 +1,30 @@ +#!/bin/bash +# Backup automatico Gitea via `gitea dump` (db sqlite + repos + config in un unico zip). +# Retention: 14 giorni (modificare KEEP_DAYS). +set -euo pipefail + +BACKUP_DIR=/var/backups/gitea +KEEP_DAYS=14 +STAMP=$(date +%Y%m%d-%H%M%S) +TMP_ARC="/tmp/gitea-dump-$STAMP.zip" +ARC="$BACKUP_DIR/gitea-dump-$STAMP.zip" + +mkdir -p "$BACKUP_DIR" + +# Esegue il dump come utente 'gitea' (stesso user del servizio). +# Il file va in /tmp (scrivibile da gitea), poi lo spostiamo come root. +su -s /bin/bash gitea -c \ + "/usr/local/bin/gitea dump --config /etc/gitea/app.ini --file '$TMP_ARC' --type zip" \ + >/tmp/gitea-dump.log 2>&1 + +if [ ! -s "$TMP_ARC" ]; then + echo "ERRORE: dump non creato" >>/tmp/gitea-dump.log + exit 1 +fi + +mv "$TMP_ARC" "$ARC" + +# Pulisce i dump piu' vecchi di KEEP_DAYS +find "$BACKUP_DIR" -name 'gitea-dump-*.zip' -mtime +"$KEEP_DAYS" -delete + +echo "OK: $ARC ($(du -h "$ARC" | cut -f1))" \ No newline at end of file diff --git a/comandi_backup_root.txt b/comandi_backup_root.txt new file mode 100644 index 0000000..f713a78 --- /dev/null +++ b/comandi_backup_root.txt @@ -0,0 +1,2 @@ +# Verifica integrita' del dump (lo script e' gia' in /tmp) +su -s /bin/bash gitea -c "python3 /tmp/check_dump.py" 2>/dev/null || su -s /bin/bash gitea -c "python3 /tmp/check_dump.py" \ No newline at end of file diff --git a/fix_gitea_builtin_ssh.sh b/fix_gitea_builtin_ssh.sh new file mode 100644 index 0000000..bff5f4d --- /dev/null +++ b/fix_gitea_builtin_ssh.sh @@ -0,0 +1,26 @@ +# FIX: attiva il server SSH BUILT-IN di Gitea (default: esterno -> le chiavi finivano in authorized_keys senza nessun sshd su 2222) +# Dal cheat sheet: START_SSH_SERVER=false di default => Gitea delega a OpenSSH esterno. + +# 1) Backup +cp /etc/gitea/app.ini /etc/gitea/app.ini.bak.$(date +%Y%m%d%H%M%S) + +# 2) Imposta START_SSH_SERVER = true nella sezione [server] +sed -i 's/^DISABLE_SSH = false/DISABLE_SSH = false\nSTART_SSH_SERVER = true/' /etc/gitea/app.ini + +# controllo: se non ci fosse la riga DISABLE_SSH esatta, aggiunge comunque +grep -q '^START_SSH_SERVER = true' /etc/gitea/app.ini || sed -i '/^\[server\]/a START_SSH_SERVER = true' /etc/gitea/app.ini + +# 3) Mostra la sezione [server] +sed -n '/^\[server\]/,/^\[/p' /etc/gitea/app.ini + +# 4) Riavvio +systemctl restart gitea +sleep 6 + +# 5) Verifica: 2222 deve essere in ascolto E devono essere generate le host key +echo "--- listener ---" +ss -tlnp | grep -E ':(2222|3000)\b' +echo "--- host key ---" +ls -la /var/lib/gitea/data/ssh/ 2>/dev/null || echo "ATTENZIONE: nessuna host key creata" +echo "--- log avvio ssh ---" +journalctl -u gitea --since "-1 min" --no-pager | grep -iE 'ssh|listen' | tail -8 \ No newline at end of file diff --git a/fix_gitea_ssh_listen.sh b/fix_gitea_ssh_listen.sh new file mode 100644 index 0000000..b0dee20 --- /dev/null +++ b/fix_gitea_ssh_listen.sh @@ -0,0 +1,18 @@ +# Fix SSH di Gitea: forza il listener built-in su tutte le interfacce +# (di default Gitea deriva SSH_LISTEN_HOST da SSH_DOMAIN = IP Cloudflare -> bind fallisce) + +# 1) Backup +cp /etc/gitea/app.ini /etc/gitea/app.ini.bak.$(date +%Y%m%d%H%M%S) + +# 2) Aggiunge SSH_LISTEN_HOST = 0.0.0.0 dopo SSH_PORT nella sezione [server] +sed -i 's/^SSH_PORT = 2222/SSH_PORT = 2222\nSSH_LISTEN_HOST = 0.0.0.0/' /etc/gitea/app.ini + +# 3) Riavvio +systemctl restart gitea +sleep 5 + +# 4) Verifica: il listener ora deve esserci +ss -tlnp | grep -E ':(2222)\b' && echo "OK: 2222 in ascolto" || echo "ERRORE: 2222 assente" + +# 5) Verifica log avvio (liste meno, mostra le righe rilevanti) +journalctl -u gitea --since "-1 min" --no-pager | grep -iE 'ssh|listen|bind|error|warn' | tail -10 \ No newline at end of file diff --git a/fix_mailer_deprecation.sh b/fix_mailer_deprecation.sh new file mode 100644 index 0000000..022052d --- /dev/null +++ b/fix_mailer_deprecation.sh @@ -0,0 +1,26 @@ +# Correzione deprecazioni residue in [mailer] (Gitea moderno) +# Sostituisce: HOST, IS_TLS_ENABLED, SKIP_VERIFY -> SMTP_ADDR+SMTP_PORT, PROTOCOL, FORCE_TRUST_SERVER_CERT + +# 1) Backup e riscrittura della sezione [mailer] con opzioni moderne +cp /etc/gitea/app.ini /etc/gitea/app.ini.bak.$(date +%Y%m%d%H%M%S) + +# 2) Sostituisce le righe obsolete (lasciando PASSWD, FROM, USER, ENABLED intatti) +sed -i \ + -e 's|^HOST = .*|SMTP_ADDR = smtp.gmail.com\nSMTP_PORT = 587|' \ + -e 's|^IS_TLS_ENABLED = .*||' \ + -e 's|^SKIP_VERIFY = .*||' \ + /etc/gitea/app.ini + +# 3) Garantisce PROTOCOL corretto per il 587 (starttls esplicito) +sed -i 's|^PROTOCOL = smtp$|PROTOCOL = smtp+starttls|' /etc/gitea/app.ini + +# 4) Controlla il risultato (senza esporre PASSWD) +awk '/^\[mailer\]/{p=1} p{print} /^\[/ && !/\[mailer\]/{p=0}' /etc/gitea/app.ini | sed 's/^PASSWD.*/PASSWD = ***/' + +# 5) Riavvia Gitea +systemctl restart gitea +sleep 3 +systemctl status gitea --no-pager | head -6 + +# 6) Verifica che NON compaiano piu deprecazioni mailer all'avvio +journalctl -u gitea --since "-1 min" --no-pager | grep -i deprecat || echo "NESSUNA deprecazione residua" \ No newline at end of file diff --git a/fix_warning_gitea.sh b/fix_warning_gitea.sh new file mode 100644 index 0000000..428ce1c --- /dev/null +++ b/fix_warning_gitea.sh @@ -0,0 +1,12 @@ +# Correzione warning Gitea/Cloudflare +# 1) Rimuove "RequestHeader set Host" (causa Host=null nel warning giallo) +sed -i '/RequestHeader set Host/d' /etc/apache2/sites-available/git.zomas.net-ssl.conf +apache2ctl configtest && systemctl reload apache2 + +# 2) Corregge opzione deprecata MAILER_TYPE -> PROTOCOL +sed -i 's/^MAILER_TYPE = smtp/PROTOCOL = smtp/' /etc/gitea/app.ini +grep -nE '^MAILER_TYPE|^PROTOCOL' /etc/gitea/app.ini +systemctl restart gitea + +# 3) Legge le altre deprecazioni dai log (per completare) +journalctl -u gitea --no-pager | grep -i -E "deprecat|\[config\]" | tail -30 \ No newline at end of file diff --git a/gitea-theme-pack.tar.gz b/gitea-theme-pack.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..7a9c91f4bf8b3ceb035ae77323ef60c284ff082c GIT binary patch literal 16185 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 XNhFa(5=kWef7ky2_jGVJ0LTCUArl+R literal 0 HcmV?d00001 diff --git a/gitea-theme-pack/README.md b/gitea-theme-pack/README.md new file mode 100644 index 0000000..2207a77 --- /dev/null +++ b/gitea-theme-pack/README.md @@ -0,0 +1,95 @@ +# Gitea theme pack — git.zomas.net + +Homepage moderna + favicon/logo personalizzati per l'istanza Gitea. + +## Contenuto + +``` +custom/ + templates/home.tmpl # homepage pubblica ridisegnata + public/assets/img/logo.svg # logo (navbar + hero) + public/assets/img/logo.png + public/assets/img/favicon.svg # icona tab browser (SVG) + public/assets/img/favicon.png # favicon fallback (PNG) + public/assets/img/apple-touch-icon.png +install_gitea_theme.sh # installer — da eseguire come ROOT sul VPS +rollback_gitea_theme.sh # ripristino stato iniziale — da eseguire come ROOT +gitea_theme.sh # script UNICO: install o rollback (consigliato) +generate_theta.py # rigenera logo/favicon con theta greca (opzionale, serve PIL) +``` + +La homepage pubblica (la landing page che si vede su git.zomas.net +senza login) è ora un hero con gradiente, titolo, tagline e 4 +feature card. Usa solo CSS inline + variabili tematiche di Gitea, quindi +rispetta automaticamente tema chiaro/scuro. + +Il logo è una THETA MAIUSCOLA (Θ): un cerchio (anello) con una "H" +centrata. La H non tocca i bordi dell'anello (clearance verificata), +in bianco su quadrato arrotondato con gradiente viola→azzurro. +Niente badge "Self-hosted Git" sopra il logo (era esteticamente di +troppo) — il hero parte direttamente dal logo. + +## Requisiti / limitazione + +Installare questi file richiede **accesso root** (o appartenenza al +gruppo `gitea`) sul VPS: la cartella `/var/lib/gitea/custom` non è +scrivibile dall'utente SSH `deb_zomas_connection`. L'installer va quindi +lanciato da chi ha root. + +I file sono già stati caricati sul VPS in staging (dall'utente +`deb_zomas_connection`) in `/var/tmp/gitea-theme/` — pronto per essere +installato da root. + +## Applicazione (root sul VPS) — script UNICO + +I file sono già sul VPS. Da root, uno script solo gestisce tutto: + +```bash +cd /var/tmp/gitea-theme/gitea-theme-pack + +bash gitea_theme.sh install # applica homepage moderna + favicon +bash gitea_theme.sh rollback # torna allo stato iniziale (se non piace) +``` + +Lo script `gitea_theme.sh` è l'unico che serve: +- `install` salva il backup delle eventuali personalizzazioni in + `/var/lib/gitea/custom/.backup-*`, copia i file, imposta i permessi + `gitea:gitea`, scrive lo stato in `$CUSTOM_DIR/.gitea-theme-state`, + riavvia Gitea e verifica gli asset. +- `rollback` rimuove homepage+favicon custom, ripristina la precedente + personalizzazione dal backup (se esiste), riavvia Gitea. + +(Permangono anche `install_gitea_theme.sh` e `rollback_gitea_theme.sh` +come equivalenti separati, per chi preferisce un comando per azione.) + +3. Sul browser apri https://git.zomas.net premendo **Ctrl+Shift+R** + (hard reload) per bypassare la cache. + +## Ripristino + +Se la modifica non piace, da root sul VPS: + +```bash +cd /var/tmp/gitea-theme/gitea-theme-pack +bash gitea_theme.sh rollback +``` + +Lo script rimuove homepage + favicon custom, ripristina l'eventuale +personalizzazione precedente dal backup (se esiste), riavvia Gitea e +verifica. In alternativa il ripristino manuale è: + +```bash +rm -rf /var/lib/gitea/custom/templates/home.tmpl /var/lib/gitea/custom/public/assets/img +systemctl restart gitea +``` + +La vecchia homepage è comunque salvata anche su questo PC in +`/home/zomas/vps-admin/homepage-backup/homepage_original_20260901-152245.html`. + +## Note + +- Gitea 1.27.3. Homepage di riferimento: stock `templates/home.tmpl`. +- Le icone octicon usate (`git-branch`, `shield-check`, `telescope`, + `sign-in`, `repo`, `code`, `rocket`) e le chiavi locale + (`dashboard`, `explore_title`, `sign_in`, `home_title`) sono verificate + esistenti nel sorgente Gitea 1.27.3. diff --git a/gitea-theme-pack/custom/public/assets/img/apple-touch-icon.png b/gitea-theme-pack/custom/public/assets/img/apple-touch-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..7bc01619cb29bf9545109e8ad623ecdae9137e91 GIT binary patch literal 2924 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 cDRLeE0EZGR + + + + + + + diff --git a/gitea-theme-pack/custom/public/assets/img/logo.png b/gitea-theme-pack/custom/public/assets/img/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..9f732c3fab490e93f5848c66a75484553d8b6e66 GIT binary patch literal 3713 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 literal 0 HcmV?d00001 diff --git a/gitea-theme-pack/custom/public/assets/img/logo.svg b/gitea-theme-pack/custom/public/assets/img/logo.svg new file mode 100644 index 0000000..0f22d50 --- /dev/null +++ b/gitea-theme-pack/custom/public/assets/img/logo.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/gitea-theme-pack/custom/templates/home.tmpl b/gitea-theme-pack/custom/templates/home.tmpl new file mode 100644 index 0000000..24ba6a6 --- /dev/null +++ b/gitea-theme-pack/custom/templates/home.tmpl @@ -0,0 +1,143 @@ +{{template "base/head" .}} + +
+
+ +

{{AppName}}

+

+ Il tuo spazio Git personale, veloce e affidabile. + Gestisci repository, collabora e tieni tutto sotto controllo, con un unico account. +

+ +
+
+
+
{{svg "octicon-rocket" 22}}
+

Veloce e leggero

+

Prestazioni elevate anche su risorse ridotte. Il tuo codice, sempre a portata di mano.

+
+
+
{{svg "octicon-shield-check" 22}}
+

Sicuro e privato

+

Accessi protetti e controllo completo sui tuoi repository, dalla creazione alla condivisione.

+
+
+
{{svg "octicon-git-branch" 22}}
+

Versioning semplice

+

Branches, pull request e collaborazione fluida, progettati per chi scrive codice ogni giorno.

+
+
+
{{svg "octicon-code" 22}}
+

Open source

+

Costruito con tecnologie aperte e libere. Nessun blocco, tutta la flessibilità di cui hai bisogno.

+
+
+
+{{template "base/footer" .}} diff --git a/gitea-theme-pack/generate_theta.py b/gitea-theme-pack/generate_theta.py new file mode 100644 index 0000000..54c6c3c --- /dev/null +++ b/gitea-theme-pack/generate_theta.py @@ -0,0 +1,139 @@ +#!/usr/bin/env python3 +# Logo/favicon Gitea: THETA MAIUSCOLA = cerchio (anello) con una "H" al centro. +# La H non tocca l'anello (clearance sicura). Niente coda. +# Emette sia gli SVG (logo/favicon) che i PNG (logo/favicon/apple-touch-icon) +# partendo dalla STESSA geometria, così SVG e PNG combaciano. +import os +from PIL import Image, ImageDraw + +OUT = "custom/public/assets/img" + +# --- geometria normalizzata (frazioni del lato quadrato) --- +INSET = 0.04 # bordo del riquadro arrotondato +RAD = 0.22 # raggio angoli del riquadro +CX, CY = 0.5, 0.5 # centro (simmetrico, nessuna coda) +RO = 0.41 # raggio esterno anello +RING = 0.05 # spessore anello -> raggio interno RI = RO - RING +# H centrale +HH = 0.26 # mezza altezza della H (stelo da CY-HH a CY+HH) +SPAC = 0.145 # distanza orizzontale dal centro agli steli +STEM = 0.05 # spessore steli +CROSS = 0.042 # spessore barra orizzontale + +C1, C2 = (124, 58, 237), (14, 165, 233) # viola -> azzurro + +RI = RO - RING + + +def lerp(a, b, t): + return int(a + (b - a) * t) + + +def grad_color(t): + return (lerp(C1[0], C2[0], t), lerp(C1[1], C2[1], t), lerp(C1[2], C2[2], t)) + + +def theta_geo(size): + cx, cy = CX * size, CY * size + ro, ri = RO * size, RI * size + stem = STEM * size + cross = CROSS * size + # steli: centro x = cx ± SPAC + left_x0 = (CX - SPAC - STEM / 2) * size + left_x1 = (CX - SPAC + STEM / 2) * size + right_x0 = (CX + SPAC - STEM / 2) * size + right_x1 = (CX + SPAC + STEM / 2) * size + st_y0, st_y1 = (CY - HH) * size, (CY + HH) * size + # barra: attraversa tutta la larghezza della H, centrata su CY + cb_y0, cb_y1 = CY * size - cross / 2, CY * size + cross / 2 + return dict(cx=cx, cy=cy, ro=ro, ri=ri, + left_x0=left_x0, left_x1=left_x1, + right_x0=right_x0, right_x1=right_x1, + st_y0=st_y0, st_y1=st_y1, + cb_x0=left_x0, cb_x1=right_x1, cb_y0=cb_y0, cb_y1=cb_y1, + stem=stem, cross=cross) + + +def circle_path(r, cx, cy, size): + lx, rx = cx - r, cx + r + return (f"M {lx:.2f} {cy:.2f} A {r:.2f} {r:.2f} 0 1 0 {rx:.2f} {cy:.2f} " + f"A {r:.2f} {r:.2f} 0 1 0 {lx:.2f} {cy:.2f} Z") + + +def svg_theta(size): + g = theta_geo(size) + inset, rad = INSET * size, RAD * size + w = size + + def e(x): + return f"{x:.2f}" + + outer = circle_path(g["ro"], g["cx"], g["cy"], size) + inner = circle_path(g["ri"], g["cx"], g["cy"], size) + + lines = [] + lines.append(f'') + lines.append(' ' + '') + lines.append(f' ') + # anello (theta maiuscola = cerchio) + lines.append(f' ') + # H centrale (steli + barra) + lines.append(f' ') + lines.append(f' ') + lines.append(f' ') + lines.append('') + return "\n".join(lines) + "\n" + + +def draw_theta_png(size, apple=False): + g = theta_geo(size) + img = Image.new("RGBA", (size, size), (0, 0, 0, 0)) + inset, rad = INSET * size, RAD * size + + # sfondo: riquadro arrotondato con gradiente verticale + sq = Image.new("L", (size, size), 0) + ImageDraw.Draw(sq).rounded_rectangle( + [inset, inset, size - inset, size - inset], radius=rad, fill=255) + grad = Image.new("RGBA", (size, size), (0, 0, 0, 0)) + gd = ImageDraw.Draw(grad) + for i in range(size * 2): + t = i / (size * 2 - 1) + gd.line([(i, 0), (i, size)], fill=grad_color(t)) + grad.putalpha(sq) + img.alpha_composite(grad) + + # theta+H come maschera bianca + mask = Image.new("L", (size, size), 0) + md = ImageDraw.Draw(mask) + md.ellipse([g["cx"] - g["ro"], g["cy"] - g["ro"], + g["cx"] + g["ro"], g["cy"] + g["ro"]], fill=255) + md.ellipse([g["cx"] - g["ri"], g["cy"] - g["ri"], + g["cx"] + g["ri"], g["cy"] + g["ri"]], fill=0) + md.rectangle([g["left_x0"], g["st_y0"], g["left_x1"], g["st_y1"]], fill=255) + md.rectangle([g["right_x0"], g["st_y0"], g["right_x1"], g["st_y1"]], fill=255) + md.rectangle([g["cb_x0"], g["cb_y0"], g["cb_x1"], g["cb_y1"]], fill=255) + + white = Image.new("RGBA", (size, size), (255, 255, 255, 255)) + white.putalpha(mask) + img.alpha_composite(white) + + if apple: + base = Image.new("RGBA", img.size, (255, 255, 255, 255)) + base.alpha_composite(img) + return base.convert("RGB") + return img + + +def make_assets(): + os.makedirs(OUT, exist_ok=True) + open(f"{OUT}/logo.svg", "w").write(svg_theta(64)) + open(f"{OUT}/favicon.svg", "w").write(svg_theta(64)) + draw_theta_png(220).save(f"{OUT}/logo.png") + draw_theta_png(64).save(f"{OUT}/favicon.png") + draw_theta_png(180, apple=True).save(f"{OUT}/apple-touch-icon.png") + print("theta (capital: circle + H) assets written to", OUT) + + +if __name__ == "__main__": + make_assets() diff --git a/gitea-theme-pack/gitea_theme.sh b/gitea-theme-pack/gitea_theme.sh new file mode 100755 index 0000000..c49fe4a --- /dev/null +++ b/gitea-theme-pack/gitea_theme.sh @@ -0,0 +1,133 @@ +#!/bin/bash +# Gitea theme manager — installa o ripristina homepage + favicon custom. +# DA ESEGUIRE COME ROOT SUL VPS (o con sudo). +# +# Uso: +# bash gitea_theme.sh install # applica la homepage moderna + favicon +# bash gitea_theme.sh rollback # torna allo stato iniziale +# bash gitea_theme.sh # come "install" +set -euo pipefail + +CUSTOM_DIR="${CUSTOM_DIR:-/var/lib/gitea/custom}" +SRC_DIR="$(cd "$(dirname "$0")" && pwd)/custom" +STATE_FILE="$CUSTOM_DIR/.gitea-theme-state" + +MODE="${1:-install}" +case "$MODE" in + install|rollback) : ;; + *) echo "Uso: $0 [install|rollback]"; exit 2 ;; +esac + +if [ "$(id -u)" != "0" ]; then + echo "ERRORE: devi eseguire questo script come root (o sudo)." + exit 1 +fi + +# ---------------------------------------------------------------- verifica +echo "==> Modalità: $MODE" +echo "==> Custom dir: $CUSTOM_DIR" + +# ---------------------------------------------------------------- install +install_theme() { + STAMP="$(date +%Y%m%d-%H%M%S)" + BACKUP_DIR="${CUSTOM_DIR}/.backup-${STAMP}" + + if [ ! -d "$SRC_DIR" ]; then + echo "ERRORE: cartella sorgente '$SRC_DIR' non trovata (script in cartella sbagliata?)." + exit 1 + fi + + # 1) Backup delle eventuali personalizzazioni esistenti + HAD_PREV=no + if [ -e "$CUSTOM_DIR/templates/home.tmpl" ] || [ -e "$CUSTOM_DIR/public/assets/img" ]; then + HAD_PREV=yes + mkdir -p "$BACKUP_DIR" + for p in templates/home.tmpl public/assets/img; do + if [ -e "$CUSTOM_DIR/$p" ]; then + mkdir -p "$BACKUP_DIR/$(dirname "$p")" + cp -a "$CUSTOM_DIR/$p" "$BACKUP_DIR/$p" + echo "==> Backup salvato: $BACKUP_DIR/$p" + fi + done + else + echo "==> Nessuna personalizzazione precedente, niente da salvare." + fi + + # 2) Copia dei nuovi file + mkdir -p "$CUSTOM_DIR/templates" "$CUSTOM_DIR/public/assets/img" + cp "$SRC_DIR/templates/home.tmpl" "$CUSTOM_DIR/templates/home.tmpl" + cp "$SRC_DIR/public/assets/img/"* "$CUSTOM_DIR/public/assets/img/" + echo "==> File copiati:" + ls -l "$CUSTOM_DIR/templates/home.tmpl" + ls -l "$CUSTOM_DIR/public/assets/img/" + + # 3) Permessi corretti (il processo gitea gira come utente gitea) + chown -R gitea:gitea "$CUSTOM_DIR" + echo "==> Permessi impostati (gitea:gitea)." + + # 4) Stato per il rollback + { + echo "installed_at=$STAMP" + echo "backup_dir=$BACKUP_DIR" + echo "had_custom=$HAD_PREV" + } > "$STATE_FILE" + echo "==> Stato rollback salvato in $STATE_FILE" +} + +# ---------------------------------------------------------------- rollback +rollback_theme() { + # 1) Leggi lo stato di installazione (se esiste) + BACKUP_DIR="" + HAD_PREV=no + if [ -f "$STATE_FILE" ]; then + source "$STATE_FILE" 2>/dev/null || true + echo "==> Stato trovato: installato $installed_at, backup=${backup_dir:-nessuno}, precedente=$had_custom" + fi + + # 2) Rimuovi i file del tema + rm -f "$CUSTOM_DIR/templates/home.tmpl" + rm -rf "$CUSTOM_DIR/public/assets/img" + echo "==> File del tema rimossi (home.tmpl e assets/img)." + + # 3) Ripristina l'eventuale personalizzazione precedente dal backup + if [ "$HAD_PREV" = "yes" ] && [ -n "${BACKUP_DIR:-}" ] && [ -d "$BACKUP_DIR" ]; then + echo "==> Ripristino personalizzazione precedente da $BACKUP_DIR" + if [ -f "$BACKUP_DIR/templates/home.tmpl" ]; then + mkdir -p "$CUSTOM_DIR/templates" + cp -a "$BACKUP_DIR/templates/home.tmpl" "$CUSTOM_DIR/templates/home.tmpl" + fi + if [ -d "$BACKUP_DIR/public/assets/img" ]; then + mkdir -p "$CUSTOM_DIR/public/assets/img" + cp -a "$BACKUP_DIR/public/assets/img/." "$CUSTOM_DIR/public/assets/img/" + fi + fi + + # 4) Rimuovi lo stato e le cartelle eventualmente vuote + rm -f "$STATE_FILE" + rmdir "$CUSTOM_DIR/public/assets/img" "$CUSTOM_DIR/public/assets" "$CUSTOM_DIR/public" 2>/dev/null || true + rmdir "$CUSTOM_DIR/templates" 2>/dev/null || true + echo "==> Stato rollback pulito." + + # 5) Permessi + chown -R gitea:gitea "$CUSTOM_DIR" 2>/dev/null || true +} + +# ---------------------------------------------------------------- esegui +if [ "$MODE" = "install" ]; then + install_theme +else + rollback_theme +fi + +# ---------------------------------------------------------------- restart+verify +systemctl restart gitea +sleep 6 +echo "==> Stato servizio: $(systemctl is-active gitea)" +if [ "$MODE" = "install" ]; then + echo "==> Verifica asset (favicon/logo):" + curl -sk -o /dev/null -w " /assets/img/favicon.svg -> %{http_code}\n" https://127.0.0.1/assets/img/favicon.svg 2>/dev/null || true + curl -sk -o /dev/null -w " /assets/img/logo.svg -> %{http_code}\n" https://127.0.0.1/assets/img/logo.svg 2>/dev/null || true +fi + +echo "" +echo "FATTO ($MODE). Ricarica https://git.zomas.net (Ctrl+Shift+R per bypassare la cache)." diff --git a/gitea-theme-pack/install_gitea_theme.sh b/gitea-theme-pack/install_gitea_theme.sh new file mode 100755 index 0000000..3797d52 --- /dev/null +++ b/gitea-theme-pack/install_gitea_theme.sh @@ -0,0 +1,80 @@ +#!/bin/bash +# Installa homepage moderna + favicon personalizzate per Gitea. +# DA ESEGUIRE COME ROOT SUL VPS (o con sudo). +# Uso: bash install_gitea_theme.sh +set -euo pipefail + +CUSTOM_DIR="${CUSTOM_DIR:-/var/lib/gitea/custom}" +SRC_DIR="$(cd "$(dirname "$0")" && pwd)/custom" +STAMP="$(date +%Y%m%d-%H%M%S)" +BACKUP_DIR="${CUSTOM_DIR}/.backup-${STAMP}" + +if [ "$(id -u)" != "0" ]; then + echo "ERRORE: devi eseguire questo script come root (o sudo)." + exit 1 +fi + +if [ ! -d "$SRC_DIR" ]; then + echo "ERRORE: cartella sorgente '$SRC_DIR' non trovata (script in cartella sbagliata?)." + exit 1 +fi + +echo "==> Target custom dir: $CUSTOM_DIR" + +# 1) Backup delle eventuali personalizzazioni esistenti +HAD_PREV=no +if [ -e "$CUSTOM_DIR/templates/home.tmpl" ] || [ -e "$CUSTOM_DIR/public/assets/img" ]; then + HAD_PREV=yes + mkdir -p "$BACKUP_DIR" + for p in templates/home.tmpl public/assets/img; do + if [ -e "$CUSTOM_DIR/$p" ]; then + mkdir -p "$BACKUP_DIR/$(dirname "$p")" + cp -a "$CUSTOM_DIR/$p" "$BACKUP_DIR/$p" + echo "==> Backup salvato: $BACKUP_DIR/$p" + fi + done +else + echo "==> Nessuna personalizzazione precedente, niente da salvare." +fi + +# 2) Copia dei nuovi file +mkdir -p "$CUSTOM_DIR/templates" "$CUSTOM_DIR/public/assets/img" +cp "$SRC_DIR/templates/home.tmpl" "$CUSTOM_DIR/templates/home.tmpl" +cp "$SRC_DIR/public/assets/img/"* "$CUSTOM_DIR/public/assets/img/" +echo "==> File copiati:" +ls -l "$CUSTOM_DIR/templates/home.tmpl" +ls -l "$CUSTOM_DIR/public/assets/img/" + +# 3) Permessi corretti (il processo gitea gira come utente gitea) +chown -R gitea:gitea "$CUSTOM_DIR" +echo "==> Permessi impostati (gitea:gitea)." + +# 3b) Stato per il rollback +STATE_FILE="$CUSTOM_DIR/.gitea-theme-state" +{ + echo "installed_at=$STAMP" + echo "backup_dir=$BACKUP_DIR" + echo "had_custom=$HAD_PREV" +} > "$STATE_FILE" +echo "==> Stato rollback salvato in $STATE_FILE" + +# 4) Riavvio di Gitea +systemctl restart gitea +sleep 6 + +# 5) Verifica +echo "==> Stato servizio:" +systemctl is-active gitea +echo "==> Verifica favicon (HTTP code):" +curl -sk -o /dev/null -w " /assets/img/favicon.svg -> %{http_code}\n" https://127.0.0.1/assets/img/favicon.svg \ + || echo " (curl locale non disponibile, verificare via browser)" +echo "==> Verifica logo:" +curl -sk -o /dev/null -w " /assets/img/logo.svg -> %{http_code}\n" https://127.0.0.1/assets/img/logo.svg \ + || true + +echo "" +echo "FATTO. Ricarica https://git.zomas.net (con Ctrl+Shift+R per bypassare la cache del browser)." +echo "Per ripristinare la versione originale:" +echo " rm -rf $CUSTOM_DIR/templates/home.tmpl $CUSTOM_DIR/public/assets/img" +echo " systemctl restart gitea" +echo "Backup delle vecchie file (se esistenti): $BACKUP_DIR" diff --git a/gitea-theme-pack/rollback_gitea_theme.sh b/gitea-theme-pack/rollback_gitea_theme.sh new file mode 100755 index 0000000..f2b21b3 --- /dev/null +++ b/gitea-theme-pack/rollback_gitea_theme.sh @@ -0,0 +1,62 @@ +#!/bin/bash +# Rimuove la homepage personalizzata e la favicon di Gitea, tornando allo +# stato originale (Gitea stock) o a una eventuale personalizzazione precedente. +# DA ESEGUIRE COME ROOT SUL VPS (o con sudo). +# Uso: bash rollback_gitea_theme.sh +set -euo pipefail + +CUSTOM_DIR="${CUSTOM_DIR:-/var/lib/gitea/custom}" +STATE_FILE="$CUSTOM_DIR/.gitea-theme-state" + +if [ "$(id -u)" != "0" ]; then + echo "ERRORE: devi eseguire questo script come root (o sudo)." + exit 1 +fi + +echo "==> Ripristino stato iniziale di Gitea (custom) in $CUSTOM_DIR" + +# 1) Leggi lo stato di installazione (se esiste) +BACKUP_DIR="" +HAD_PREV=no +if [ -f "$STATE_FILE" ]; then + source "$STATE_FILE" 2>/dev/null || true + echo "==> Stato trovato: installato $installed_at, backup=${backup_dir:-nessuno}, precedente=$had_custom" +fi + +# 2) Rimuovi i file del tema +rm -f "$CUSTOM_DIR/templates/home.tmpl" +rm -rf "$CUSTOM_DIR/public/assets/img" +echo "==> File del tema rimossi (home.tmpl e assets/img)." + +# 3) Ripristina una eventuale personalizzazione precedente dal backup +RESTORED=no +if [ "$HAD_PREV" = "yes" ] && [ -n "${BACKUP_DIR:-}" ] && [ -d "$BACKUP_DIR" ]; then + echo "==> Ripristino personalizzazione precedente da $BACKUP_DIR" + if [ -f "$BACKUP_DIR/templates/home.tmpl" ]; then + mkdir -p "$CUSTOM_DIR/templates" + cp -a "$BACKUP_DIR/templates/home.tmpl" "$CUSTOM_DIR/templates/home.tmpl" + RESTORED=yes + fi + if [ -d "$BACKUP_DIR/public/assets/img" ]; then + mkdir -p "$CUSTOM_DIR/public/assets/img" + cp -a "$BACKUP_DIR/public/assets/img/." "$CUSTOM_DIR/public/assets/img/" + fi +fi + +# 4) Rimuovi lo stato e le cartelle eventualmente vuote +rm -f "$STATE_FILE" +rmdir "$CUSTOM_DIR/public/assets/img" "$CUSTOM_DIR/public/assets" "$CUSTOM_DIR/public" 2>/dev/null || true +rmdir "$CUSTOM_DIR/templates" 2>/dev/null || true +echo "==> Stato rollback pulito." + +# 5) Permessi e riavvio +chown -R gitea:gitea "$CUSTOM_DIR" 2>/dev/null || true +systemctl restart gitea +sleep 6 + +# 6) Verifica +echo "==> Stato servizio: $(systemctl is-active gitea)" +curl -sk -o /dev/null -w " /assets/img/favicon.svg -> %{http_code} (200=stock Gitea, 404=custom rimosso)\n" https://127.0.0.1/assets/img/favicon.svg 2>/dev/null || true + +echo "" +echo "FATTO. Ricarica https://git.zomas.net (Ctrl+Shift+R per bypassare la cache)." diff --git a/homepage-backup/homepage_original_20260901-152245.html b/homepage-backup/homepage_original_20260901-152245.html new file mode 100644 index 0000000..ba996d6 --- /dev/null +++ b/homepage-backup/homepage_original_20260901-152245.html @@ -0,0 +1,245 @@ + + + + + + Zomas- Git + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + +
+
+
+ +
+

+ Zomas- Git +

+

A painless, self-hosted Git service

+
+
+
+
+
+

+ Easy to install +

+

+ Simply run the binary for your platform, ship it with Docker, or get it packaged. +

+
+
+

+ Cross-platform +

+

+ Gitea runs anywhere Go can compile for: Windows, macOS, Linux, ARM, etc. Choose the one you love! +

+
+
+
+
+

+ Lightweight +

+

+ Gitea has low minimal requirements and can run on an inexpensive Raspberry Pi. Save your machine energy! +

+
+
+

+ Open Source +

+

+ Go get gitea.dev! Join us by contributing to make this project even better. Don't hesitate to contribute! +

+
+
+
+ + + +
+ + + + + + + + + diff --git a/install_backup_gitea.sh b/install_backup_gitea.sh new file mode 100644 index 0000000..7fa4322 --- /dev/null +++ b/install_backup_gitea.sh @@ -0,0 +1,59 @@ +# ============================================================ +# INSTALLAZIONE BACKUP AUTOMATICO GITEA (da eseguire da ROOT) +# Incolla tutto questo blocco nel terminale root del VPS. +# ============================================================ + +# 1) Crea la directory backup +mkdir -p /var/backups/gitea + +# 2) Scrivi lo script di backup in /usr/local/sbin (autosufficiente) +cat > /usr/local/sbin/backup_gitea.sh <<'EOF' +#!/bin/bash +# Backup automatico Gitea via `gitea dump` (db sqlite + repos + config in un unico zip). +# Retention: 14 giorni (modificare KEEP_DAYS). +set -euo pipefail + +BACKUP_DIR=/var/backups/gitea +KEEP_DAYS=14 +STAMP=$(date +%Y%m%d-%H%M%S) +ARC="$BACKUP_DIR/gitea-dump-$STAMP.zip" + +mkdir -p "$BACKUP_DIR" + +# Esegue il dump come utente 'gitea' (stesso user del servizio) +su -s /bin/bash gitea -c \ + "/usr/local/bin/gitea dump --config /etc/gitea/app.ini --file '$ARC' --type zip" \ + >/tmp/gitea-dump.log 2>&1 + +if [ ! -s "$ARC" ]; then + echo "ERRORE: dump non creato" >>/tmp/gitea-dump.log + exit 1 +fi + +# Pulisce i dump piu' vecchi di KEEP_DAYS +find "$BACKUP_DIR" -name 'gitea-dump-*.zip' -mtime +"$KEEP_DAYS" -delete + +echo "OK: $ARC ($(du -h "$ARC" | cut -f1))" +EOF +chmod 0755 /usr/local/sbin/backup_gitea.sh + +# 3) TEST: esegui un backup manuale adesso +/usr/local/sbin/backup_gitea.sh +ls -lh /var/backups/gitea/ + +# 4) Installa il cron giornaliero alle 02:30 via /etc/cron.d +cat > /etc/cron.d/gitea-backup <<'CRON' +# Backup giornaliero Gitea alle 02:30, stdout/stderr su log +30 2 * * * root /usr/local/sbin/backup_gitea.sh >>/tmp/gitea-dump.log 2>&1 +CRON +chmod 0644 /etc/cron.d/gitea-backup + +# 5) Verifica +echo "--- cron installato ---" +ls -l /etc/cron.d/gitea-backup +echo "--- contenuto ---" +cat /etc/cron.d/gitea-backup +echo "--- sistema crontab attivo? ---" +systemctl is-active cron 2>/dev/null || service cron status 2>/dev/null | head -2 || echo "cron non attivo (verificare)" +echo "--- ultimo backup (zona) ---" +ls -lh /var/backups/gitea/ \ No newline at end of file diff --git a/install_gitea_vps.sh b/install_gitea_vps.sh new file mode 100644 index 0000000..edd7d8d --- /dev/null +++ b/install_gitea_vps.sh @@ -0,0 +1,249 @@ +# Installazione Gitea su VPS OVH — copia/incolla (root/sudo) +# Obbiettivo: git.zomas.net (Gitea dietro Apache; non tocca zomas.net / zomas.org) +# VPS: Debian 12, 4 vCPU, 7.6GB RAM +# Chi esegue: TU (root o sudo). Esegui i blocchi in ordine. + +# +# ⚠️ PREREQUISITO DNS: prima del Passo 5 deve risolvere pubblicamente: +# dig +short git.zomas.net -> deve tornare 145.239.94.49 +# (finché dà NXDOMAIN, SALTA il Passo 5 e resta solo in HTTP) +# + +############################################################################### +# PASSO 1 — Installa Gitea (binario ufficiale + utente dedicato + sqlite) +############################################################################### + +apt-get update && apt-get upgrade -y +apt-get install -y git sqlite3 curl wget + +# utente di sistema dedicato (senza login) +adduser --system --group --disabled-password --home /var/lib/gitea gitea +mkdir -p /etc/gitea /var/lib/gitea/custom /var/lib/gitea/data /var/lib/gitea/log +chown -R root:gitea /etc/gitea +chown -R gitea:gitea /var/lib/gitea/ +chmod -R g+rws /var/lib/gitea/ +chmod -R g+rw /var/lib/gitea/ + +# ultima versione stabile +VERSION=$(curl -sL https://dl.gitea.com/gitea/version.json | python3 -c "import sys,json;print(json.load(sys.stdin)['latest']['version'])" 2>/dev/null || echo "1.22.0") +echo "Installazione Gitea $VERSION" +curl -sL -o /tmp/gitea "https://dl.gitea.com/gitea/$VERSION/gitea-$VERSION-linux-amd64" + +# sposta e rendi eseguibile +install -o root -g root -m 755 /tmp/gitea /usr/local/bin/gitea +/usr/local/bin/gitea --version + +############################################################################### +# PASSO 2 — Configurazione Gitea (app.ini) +############################################################################### + +cat > /etc/gitea/app.ini <<'EOF' +RUN_USER = gitea +RUN_MODE = prod + +[server] +; porta INTERNA: Apache farà da proxy verso questa +HTTP_PORT = 3000 +HTTP_ADDR = 127.0.0.1 +ROOT_URL = https://git.zomas.net/ +DOMAIN = git.zomas.net +DISABLE_SSH = false +SSH_PORT = 2222 +LFS_START_SERVER = true + +[database] +DB_TYPE = sqlite3 +PATH = /var/lib/gitea/data/gitea.db + +[repository] +ROOT = /var/lib/gitea/data/gitea-repositories + +[service] +DISABLE_REGISTRATION = false ; metti true quando vuoi bloccare le iscrizioni esterne +EOF + +chown -R gitea:gitea /etc/gitea + +############################################################################### +# PASSO 3 — Servizio systemd +############################################################################### + +tee /etc/systemd/system/gitea.service >/dev/null <<'EOF' +[Unit] +Description=Gitea (Git with a cup of tea) +After=syslog.target +After=network.target + +[Service] +RestartSec=2s +Type=simple +User=gitea +Group=gitea +WorkingDirectory=/var/lib/gitea/ +ExecStart=/usr/local/bin/gitea web --config /etc/gitea/app.ini +Restart=always +Environment=USER=gitea HOME=/var/lib/gitea GITEA_WORK_DIR=/var/lib/gitea + +[Install] +WantedBy=multi-user.target +EOF + +systemctl daemon-reload +systemctl enable gitea +systemctl start gitea +systemctl status gitea --no-pager | head -15 + +# verifica locale (deve rispondere HTTP) +curl -sI http://127.0.0.1:3000 | head -3 + +############################################################################### +# PASSO 4 — Virtualhost Apache (reverse proxy verso Gitea) +############################################################################### + +# abilita i moduli necessario (i siti zomas.net/zomas.org NON vengono toccati) +a2enmod proxy_http proxy ssl +systemctl reload apache2 + +# virtualhost HTTP (redirect -> https) +cat > /etc/apache2/sites-available/git.zomas.net.conf <<'EOF' + + ServerName git.zomas.net + Redirect permanent / https://git.zomas.net/ + +EOF + +# virtualhost HTTPS (proxy verso Gitea su 127.0.0.1:3000) — certbot poi aggiunge il SSL +cat > /etc/apache2/sites-available/git.zomas.net-ssl.conf <<'EOF' + + ServerName git.zomas.net + CustomLog /var/log/apache2/git.zomas.net-access.log combined + ErrorLog /var/log/apache2/git.zomas.net-error.log + + ProxyPreserveHost On + RequestHeader set Host %{HTTP_HOST}e + ProxyRequests Off + ProxyPass / http://127.0.0.1:3000/ + ProxyPassReverse / http://127.0.0.1:3000/ + +EOF + +# abilita i virtualhost (mantenendo net/org intatti) +a2ensite git.zomas.net.conf +a2ensite git.zomas.net-ssl.conf +systemctl reload apache2 + +# verifica: il vhost :80 deve rispondere +curl -sI http://127.0.0.1:80 -H "Host: git.zomas.net" | head -3 + +############################################################################### +# PASSO 5 — Certificato HTTPS con Let's Encrypt +# ⚠️ FAI SOLO QUANDO git.zomas.net risolve pubblicamente (dig +short = 145.239.94.49) +############################################################################### + +# richiedi il certificato per git.zomas.net (usa il vhost :80 come challenge) +certbot --apache -d git.zomas.net +# quando ti chiede il redirect HTTP->HTTPS scegli: 2 + +systemctl reload apache2 + +# verifica finale HTTPS +curl -sI https://git.zomas.net | head -3 + +############################################################################### +# PRIMO ACCESSO (dopo il Passo 3, già funziona in HTTP) +############################################################################### +# Apri nel browser: https://git.zomas.net (o http:// se non hai ancora il passo 5) +# Al primo avvio Gitea mostra la pagina di installazione: +# - DB: SQLite3 +# - Path DB: /var/lib/gitea/data/gitea.db +# - URL: https://git.zomas.net/ +# - Crea l'account amministratore (utente final, nome, email, password) +# Si può rilanciare la procedura con: su gitea -s /bin/bash -c "cd /var/lib/gitea && /usr/local/bin/gitea admin create-user --username admin --password 'ScegliPasswordSicura' --email you@example.com --admin" +# (poi applica via web) +# +# Nota SSH: Gitea usa la porta 2222 per git over SSH (oltre alla web). Da client: +# git clone ssh://git@git.zomas.net:2222//.git + +############################################################################### +# PASSO 6 — Certificati Let's Encrypt per origine (plugin dns-cloudflare) +# ⚠️ da eseguire come ROOT sul VPS. Il token CF è già in /tmp/cloudflare_tmp.ini +# Genera i cert con challenge DNS: funziona anche con i record messi "proxied". +# NON tocca i vhost esistenti di zomas.net / zomas.org (stesso --cert-name). +############################################################################### + +set -ea +mkdir -p /root/.config/letsencrypt +[ -f /tmp/cloudflare_tmp.ini ] && { cp /tmp/cloudflare_tmp.ini /root/.config/letsencrypt/cloudflare.ini; chmod 600 /root/.config/letsencrypt/cloudflare.ini; } || { echo "Manca /tmp/cloudflare_tmp.ini"; exit 1; } + +echo "=== 1/3 zomas.net + www ===" +certbot certonly --dns-cloudflare \ + --dns-cloudflare-credentials /root/.config/letsencrypt/cloudflare.ini \ + --dns-cloudflare-propagation-seconds 60 \ + -d zomas.net -d www.zomas.net \ + --cert-name zomas.net --non-interactive --agree-tos -m zomas@zomas.net --force-renewal + +echo "=== 2/3 zomas.org + www ===" +certbot certonly --dns-cloudflare \ + --dns-cloudflare-credentials /root/.config/letsencrypt/cloudflare.ini \ + --dns-cloudflare-propagation-seconds 60 \ + -d zomas.org -d www.zomas.org \ + --cert-name zomas.org --non-interactive --agree-tos -m zomas@zomas.org --force-renewal + +echo "=== 3/3 git.zomas.net ===" +certbot certonly --dns-cloudflare \ + --dns-cloudflare-credentials /root/.config/letsencrypt/cloudflare.ini \ + --dns-cloudflare-propagation-seconds 60 \ + -d git.zomas.net \ + --cert-name git.zomas.net --non-interactive --agree-tos -m zomas@zomas.net + +echo "=== file generati in /etc/letsencrypt/live ===" +ls -la /etc/letsencrypt/live/ +echo "=== certificati git ===" +ls -la /etc/letsencrypt/live/git.zomas.net/ + +############################################################################### +# PASSO 7 — (dopo aver generato i cert) Completare il vhost SSL di git +# e riabilitarlo. Il certificato git ora esiste in live/git.zomas.net. +# ⚠️ Leggi il contenuto di git.zomas.net-ssl.conf e COMPLETA il blocco +# aggiungendo: SSLEngine on + SSLCertificateFile/Key con i path git. +# Esempio (sostituisci tutto il contenuto del file): +############################################################################### + +cat > /etc/apache2/sites-available/git.zomas.net-ssl.conf <<'EOF' + + ServerName git.zomas.net + CustomLog /var/log/apache2/git.zomas.net-access.log combined + ErrorLog /var/log/apache2/git.zomas.net-error.log + + SSLEngine on + Include /etc/letsencrypt/options-ssl-apache.conf + SSLCertificateFile /etc/letsencrypt/live/git.zomas.net/fullchain.pem + SSLCertificateKeyFile /etc/letsencrypt/live/git.zomas.net/privkey.pem + + ProxyPreserveHost On + RequestHeader set Host %{HTTP_HOST}e + ProxyRequests Off + ProxyPass / http://127.0.0.1:3000/ + ProxyPassReverse / http://127.0.0.1:3000/ + +EOF + +# riabilita il vhost SSL di git (dopo aver verificato che i cert esistono) +a2ensite git.zomas.net-ssl.conf +apache2ctl configtest +systemctl reload apache2 + +# verifica certificato da linea di comando +curl -sk -o /dev/null -w "https git (via IP/SNI) HTTP %{http_code}\n" https://127.0.0.1 -H "Host: git.zomas.net" --resolve git.zomas.net:443:127.0.0.1 + +############################################################################### +# PASSO 8 — Pannello Cloudflare: attiva il proxy (arancio) SOLO sui record web +# ⚠️ NON toccare: MX, mail.*, sole, calendar, docs, _dmarc, SPF, SRV +# Metti "Proxy (arancio)" su: +# - git.zomas.net (già arancio) +# - zomas.net (A) +# - www.zomas.net (CNAME) +# - zomas.org (A) +# - www.zomas.org (CNAME) +# Poi in SSL/TLS -> Overview seleziona: "Full (strict)" +###############################################################################