From e20fa7ebae3488f0990c8ffcaf531ec327231a2a Mon Sep 17 00:00:00 2001 From: zomas Date: Tue, 1 Sep 2026 17:16:45 +0200 Subject: [PATCH] homepage-nuova: il repo contiene solo il tema/logo + backup homepage Rimosso tutto cio' che non riguarda la homepage (script backup/fix/install, tarball, note di sessione). Ora il repo tiene esclusivamente: - gitea-theme-pack/ (theme homepage + logo/favicon + install/rollback) - homepage-backup/ (copia homepage originale) Gli script sono conservati in /home/zomas/backup-scritti-vps/ (fuori repo). --- 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 16185 -> 0 bytes install_backup_gitea.sh | 59 --------- install_gitea_vps.sh | 249 ----------------------------------- 10 files changed, 514 deletions(-) delete mode 100644 STATO_SESSIONE_2026-09-01.md delete mode 100644 backup_gitea.sh delete mode 100644 comandi_backup_root.txt delete mode 100644 fix_gitea_builtin_ssh.sh delete mode 100644 fix_gitea_ssh_listen.sh delete mode 100644 fix_mailer_deprecation.sh delete mode 100644 fix_warning_gitea.sh delete mode 100644 gitea-theme-pack.tar.gz delete mode 100644 install_backup_gitea.sh delete mode 100644 install_gitea_vps.sh diff --git a/STATO_SESSIONE_2026-09-01.md b/STATO_SESSIONE_2026-09-01.md deleted file mode 100644 index 30237b3..0000000 --- a/STATO_SESSIONE_2026-09-01.md +++ /dev/null @@ -1,92 +0,0 @@ -# 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 deleted file mode 100644 index 3dfd115..0000000 --- a/backup_gitea.sh +++ /dev/null @@ -1,30 +0,0 @@ -#!/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 deleted file mode 100644 index f713a78..0000000 --- a/comandi_backup_root.txt +++ /dev/null @@ -1,2 +0,0 @@ -# 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 deleted file mode 100644 index bff5f4d..0000000 --- a/fix_gitea_builtin_ssh.sh +++ /dev/null @@ -1,26 +0,0 @@ -# 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 deleted file mode 100644 index b0dee20..0000000 --- a/fix_gitea_ssh_listen.sh +++ /dev/null @@ -1,18 +0,0 @@ -# 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 deleted file mode 100644 index 022052d..0000000 --- a/fix_mailer_deprecation.sh +++ /dev/null @@ -1,26 +0,0 @@ -# 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 deleted file mode 100644 index 428ce1c..0000000 --- a/fix_warning_gitea.sh +++ /dev/null @@ -1,12 +0,0 @@ -# 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 deleted file mode 100644 index 7a9c91f4bf8b3ceb035ae77323ef60c284ff082c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16185 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 XNhFa(5=kWef7ky2_jGVJ0LTCUArl+R diff --git a/install_backup_gitea.sh b/install_backup_gitea.sh deleted file mode 100644 index 7fa4322..0000000 --- a/install_backup_gitea.sh +++ /dev/null @@ -1,59 +0,0 @@ -# ============================================================ -# 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 deleted file mode 100644 index edd7d8d..0000000 --- a/install_gitea_vps.sh +++ /dev/null @@ -1,249 +0,0 @@ -# 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)" -###############################################################################