commit 6924d4e87249c55ba8a01bcd289680c4f03ef5be Author: Davide Grilli Date: Sun Apr 12 15:57:50 2026 +0200 Initial commit: Gitea + Caddy self-hosted setup diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..f488a7a --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +# Dati runtime Gitea (repository utenti, DB, secrets, chiavi SSH) +gitea-data/ + +# Dati runtime Caddy (certificati TLS, config auto-generata) +caddy/data/ +caddy/config/ diff --git a/Caddyfile b/Caddyfile new file mode 100644 index 0000000..4309a01 --- /dev/null +++ b/Caddyfile @@ -0,0 +1,3 @@ +your-domain.com { + reverse_proxy gitea:3000 +} diff --git a/README.md b/README.md new file mode 100644 index 0000000..0ccfeda --- /dev/null +++ b/README.md @@ -0,0 +1,107 @@ +# Gitea self-hosted + +Stack Docker per un server Git self-hosted con interfaccia web HTTPS e accesso SSH. + +## Requisiti + +- **Docker** e **Docker Compose** +- **Un dominio** puntato all'IP della macchina host (necessario per Caddy, che ottiene il certificato TLS tramite Let's Encrypt). Può essere un dominio acquistato, un sottodominio, o un servizio DDNS gratuito come [NoIP](https://www.noip.com/) o [DuckDNS](https://www.duckdns.org/). +- Le porte **80**, **443** e **2222** aperte e raggiungibili dall'esterno. + +## Architettura + +- **Gitea** – server Git (interfaccia web + accesso SSH) +- **Caddy** – reverse proxy con HTTPS automatico via Let's Encrypt + +``` +Internet ──→ Caddy (80/443) ──→ Gitea (3000, interno) + ──→ SSH (2222) ──→ Gitea (22, interno) +``` + +## Configurazione iniziale + +Prima di avviare, sostituire `your-domain.com` nel file `Caddyfile` con il proprio dominio: + +``` +your-domain.com { + reverse_proxy gitea:3000 +} +``` + +## Porte (configurazione di default) + +| Servizio | Porta esterna | Porta interna | Note | +|----------|--------------|---------------|------| +| HTTP | 80 | 80 | Redirect automatico a HTTPS gestito da Caddy | +| HTTPS | 443 | 443 | Caddy ottiene e rinnova il certificato da Let's Encrypt | +| SSH Git | **2222** | 22 | Porta standard alternativa per SSH Gitea | +| Web UI | (interno) | 3000 | Esposta solo su `127.0.0.1`, proxata da Caddy | + +## Avvio + +```bash +docker compose up -d +``` + +Al primo avvio seguire la [guida all'inizializzazione](SETUP.md) per configurare Gitea tramite browser. + +## Aggiornamento Gitea + +```bash +docker compose pull +docker compose up -d +``` + +## Clone via SSH + +Gitea mostra automaticamente l'URL SSH corretto per ogni repository nell'interfaccia web — basta copiarlo e usarlo direttamente. + +Se si vuole evitare di specificare la porta ogni volta da terminale, si può aggiungere a `~/.ssh/config`: + +``` +Host your-domain.com + Port 2222 + User git +``` + +--- + +## Risoluzione problemi + +### La porta 2222 è già occupata + +Se sulla macchina host la porta 2222 è già in uso da un altro servizio, cambiare la porta esterna SSH nel `docker-compose.yml` con una libera, ad esempio 2223: + +```yaml +ports: + - "2223:22" # prima era "2222:22" +``` + +Gitea mostrerà automaticamente la porta corretta negli URL SSH della sua interfaccia web. + +Per verificare quali porte sono già in uso: + +```bash +ss -tlnp | grep '2222\|2223' +``` + +### Caddy non ottiene il certificato TLS + +Caddy richiede che il dominio configurato nel `Caddyfile` punti all'IP pubblico della macchina e che le porte 80 e 443 siano raggiungibili dall'esterno (non bloccate dal firewall o dal router). Verificare: + +```bash +# Controllare che le porte siano aperte +curl -v http://your-domain.com +``` + +--- + +## Struttura directory + +``` +. +├── docker-compose.yml # Definizione dei servizi Docker +├── Caddyfile # Configurazione del reverse proxy +├── caddy/ # Dati runtime Caddy (non versionati: certificati TLS, config generata) +└── gitea-data/ # Dati Gitea (non versionati: repository, DB, secrets, chiavi SSH host) +``` diff --git a/SETUP.md b/SETUP.md new file mode 100644 index 0000000..0972969 --- /dev/null +++ b/SETUP.md @@ -0,0 +1,58 @@ +# Guida all'inizializzazione di Gitea + +Dopo aver eseguito `docker compose up -d`, aprire il browser su `https://your-domain.com`. + +Al primo accesso Gitea mostra una pagina di configurazione iniziale. + +--- + +## 1. Database + +Selezionare **SQLite3** come database. È la scelta più semplice per un'installazione self-hosted personale e non richiede configurazione aggiuntiva. + +> Se si preferisce PostgreSQL o MySQL, aggiungere il relativo container nel `docker-compose.yml` prima di procedere. + +--- + +## 2. Impostazioni generali + +| Campo | Valore da inserire | +|---|---| +| **Titolo del sito** | Il nome che vuoi dare al tuo server Git | +| **URL base** | `https://your-domain.com` | + +--- + +## 3. Impostazioni SSH + +| Campo | Valore da inserire | +|---|---| +| **Porta SSH del server** | `2222` (o la porta esterna che hai impostato in `docker-compose.yml`) | + +> Questa impostazione dice a Gitea quale porta mostrare negli URL SSH nell'interfaccia web. Deve corrispondere alla porta **sinistra** del mapping in `docker-compose.yml` (es. `2222:22` → inserire `2222`). + +--- + +## 4. Account amministratore + +Scorrere fino in fondo alla pagina e compilare la sezione **Account amministratore**: + +- **Nome utente** – il tuo username admin +- **Password** – scegli una password sicura +- **Email** + +> Se non si compila questa sezione, il primo utente che si registra diventa automaticamente admin. + +--- + +## 5. Completare l'installazione + +Cliccare **Installa Gitea**. La pagina si ricaricherà e si verrà reindirizzati alla home del proprio server Git. + +--- + +## 6. Verifica + +- Accedere con le credenziali admin appena create +- Creare un repository di test +- Verificare che l'URL SSH mostrato da Gitea contenga la porta corretta (es. `ssh://git@your-domain.com:2222/...`) diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..90af81e --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,24 @@ +services: + gitea: + image: gitea/gitea:latest + container_name: gitea + restart: unless-stopped + ports: + - "127.0.0.1:3000:3000" + - "2222:22" + volumes: + - ./gitea-data:/data + - /etc/timezone:/etc/timezone:ro + - /etc/localtime:/etc/localtime:ro + + caddy: + image: caddy:2 + container_name: caddy + restart: unless-stopped + ports: + - "80:80" + - "443:443" + volumes: + - ./Caddyfile:/etc/caddy/Caddyfile:ro + - ./caddy/data:/data + - ./caddy/config:/config