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).
This commit is contained in:
@@ -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 → `[email protected]: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 = `[email protected]: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 # [email protected]: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).
|
|
||||||
@@ -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))"
|
|
||||||
@@ -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"
|
|
||||||
@@ -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
|
|
||||||
@@ -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
|
|
||||||
@@ -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"
|
|
||||||
@@ -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
|
|
||||||
Binary file not shown.
@@ -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/
|
|
||||||
@@ -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'
|
|
||||||
<VirtualHost *:80>
|
|
||||||
ServerName git.zomas.net
|
|
||||||
Redirect permanent / https://git.zomas.net/
|
|
||||||
</VirtualHost>
|
|
||||||
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'
|
|
||||||
<VirtualHost *:443>
|
|
||||||
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/
|
|
||||||
</VirtualHost>
|
|
||||||
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 [email protected] --admin"
|
|
||||||
# (poi applica via web)
|
|
||||||
#
|
|
||||||
# Nota SSH: Gitea usa la porta 2222 per git over SSH (oltre alla web). Da client:
|
|
||||||
# git clone ssh://[email protected]:2222/<utente>/<repo>.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 [email protected] --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 [email protected] --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 [email protected]
|
|
||||||
|
|
||||||
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'
|
|
||||||
<VirtualHost *:443>
|
|
||||||
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/
|
|
||||||
</VirtualHost>
|
|
||||||
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)"
|
|
||||||
###############################################################################
|
|
||||||
Reference in New Issue
Block a user