Passa al contenuto principale
Versione: Next

Forgejo su Aruba Cloud

Esegui il deployment di un servizio Git self-hosted Forgejo pronto per la produzione su Aruba Cloud tramite Terraform e cloud-init. Nessuna configurazione manuale del server richiesta.

Versione provider: arubacloud/arubacloud ~> 1.0 | Terraform: ≥ 1.9


Introduzione​

Forgejo è un servizio Git self-hosted mantenuto dalla community — il fork più attivo di Gitea. Fornisce un'interfaccia simile a GitHub per ospitare repository, revisionare pull request, eseguire CI/CD con Forgejo Actions e gestire team. Questo esempio esegue il provisioning di uno stack Forgejo completo su Aruba Cloud con:

  • Una VM CloudServer che esegue il binario Forgejo dietro un reverse proxy nginx, completamente avviata da cloud-init
  • La scelta tra SQLite (default, costo zero aggiuntivo) o MySQL 8.0 DBaaS gestito per team più grandi
  • Una VPC, subnet e security group dedicati tramite il modulo di rete condiviso
  • Elastic IP per la VM (e DBaaS quando MySQL è abilitato)
  • HTTPS Let's Encrypt opzionale quando viene fornito un dominio personalizzato
  • Accesso SSH Git sulla porta 2222 in modo che il server SSH integrato di Forgejo non entri in conflitto con SSH admin sulla porta 22

Il primo utente che si registra tramite l'interfaccia web diventa automaticamente l'amministratore dell'istanza — nessuna credenziale viene preimpostata durante il provisioning.


Panoramica dell'architettura​

Forgejo viene eseguito come servizio systemd in ascolto su 127.0.0.1:3000. nginx termina il traffico HTTP/HTTPS pubblico e lo inoltra a Forgejo. Il server SSH integrato di Forgejo è in ascolto sulla porta 2222 per le operazioni git clone / git push.


Infrastruttura creata​

Le risorse con (solo MySQL) vengono create solo quando enable_mysql = true.

RisorsaPattern del nomeDescrizione
arubacloud_projectforgejo-prodContenitore del progetto
arubacloud_vpcforgejo-prod-vpcVirtual Private Cloud
arubacloud_subnetforgejo-prod-subnetSubnet base
arubacloud_securitygroupforgejo-prod-vm-sgSecurity group VM
arubacloud_securitygroupforgejo-prod-db-sgSecurity group DBaaS (solo MySQL)
arubacloud_securityruleforgejo-prod-vm-sshRegola ingress SSH (CIDR limitato)
arubacloud_securityruleforgejo-prod-vm-httpRegola ingress HTTP
arubacloud_securityruleforgejo-prod-vm-httpsRegola ingress HTTPS
arubacloud_securityruleforgejo-prod-vm-git-sshRegola ingress Git SSH (porta 2222)
arubacloud_securityruleforgejo-prod-db-mysqlRegola ingress MySQL dall'IP VM (solo MySQL)
arubacloud_elasticipforgejo-prod-vm-eipIP pubblico VM
arubacloud_elasticipforgejo-prod-db-eipIP pubblico DBaaS (solo MySQL)
arubacloud_blockstorageforgejo-prod-bootDisco di boot da 30 GB (Performance)
arubacloud_keypairforgejo-prod-keypairChiave pubblica SSH
arubacloud_dbaasforgejo-prod-dbaasMySQL 8.0 gestito (solo MySQL)
arubacloud_databaseforgejoDatabase logico Forgejo (solo MySQL)
arubacloud_dbaasuserforgejoUtente applicativo MySQL (solo MySQL)
arubacloud_databasegrant—Grant liteadmin (solo MySQL)
arubacloud_cloudserverforgejo-prod-vmVM CloudServer

Raccomandazione dimensionamento VM​

WorkloadvCPURAMDiscoFlavorDatabase
Personale / team piccolo (≤ 10 utenti)24 GB30 GBCSO2A4 (default)SQLite
Organizzazione piccola (≤ 50 utenti)24 GB50 GBCSO2A4MySQL DBO2A8
Organizzazione media (≤ 200 utenti)48 GB50 GBCSO4A8MySQL DBO4A16

Per i deployment SQLite, i repository risiedono sul disco di boot — aumenta vm_disk_size_gb per adattarsi alle dimensioni attese dei repository.


Costo mensile stimato​

Prezzi approssimativi per ITBG-Bergamo, fatturazione oraria. I prezzi effettivi possono variare — verifica nella console ArubaCloud.

SQLite (default)​

RisorsaSpecificheCosto stimato/mese
VM CloudServerCSO2A4 — 2 vCPU / 4 GB~€18
Disco di boot30 GB Performance~€4
Elastic IP—~€3
Totale~€25/mese

MySQL (enable_mysql = true)​

RisorsaSpecificheCosto stimato/mese
VM CloudServerCSO2A4 — 2 vCPU / 4 GB~€18
Disco di boot30 GB Performance~€4
MySQL gestitoDBO2A8 — 2 vCPU / 8 GB~€35
Storage DBaaS20 GB~€3
Elastic IP × 2—~€5
Totale~€65/mese

Requisiti​

  • Terraform ≥ 1.9
  • ArubaCloud Terraform Provider ~> 1.0
  • Un account ArubaCloud con credenziali API OAuth2
  • Una coppia di chiavi SSH
  • db_password (min 16 caratteri) — solo quando enable_mysql = true

Variabili​

Obbligatorie​

VariabileDescrizione
arubacloud_client_idClient ID OAuth2 di ArubaCloud
arubacloud_client_secretClient secret OAuth2 di ArubaCloud
ssh_public_keyContenuto della chiave pubblica SSH (es. contenuto di ~/.ssh/id_ed25519.pub)

Opzionali​

VariabileDefaultDescrizione
app_name"forgejo"Nome breve usato in tutti i nomi delle risorse
environment"prod"Etichetta dell'ambiente (prod, staging, dev)
location"ITBG-Bergamo"Regione ArubaCloud
zone"ITBG-1"Zona di disponibilità
billing_period"Hour""Hour" o "Month"
vm_flavor"CSO2A4"Flavor del CloudServer
vm_image"LU22-001"Immagine del disco di boot (Ubuntu 22.04 LTS)
vm_disk_size_gb30Dimensione del disco di boot in GB
ssh_cidr"0.0.0.0/0"CIDR per accesso SSH — limita al tuo IP in produzione
enable_mysqlfalseProvisioning di MySQL gestito invece di SQLite
dbaas_flavor"DBO2A8"Flavor DBaaS (solo quando enable_mysql = true)
db_storage_gb20Storage iniziale DBaaS in GB (solo quando enable_mysql = true)
db_password""Password MySQL (obbligatoria quando enable_mysql = true, min 16 caratteri)
forgejo_version"9.0.3"Versione di Forgejo — controlla forgejo.org/releases
domain""Dominio personalizzato per HTTPS — lascia vuoto per usare l'Elastic IP

Output​

OutputDescrizione
web_urlURL dell'interfaccia web di Forgejo
ssh_clone_baseURL base per clone SSH (aggiungi /<owner>/<repo>.git)
vm_public_ipIndirizzo IP pubblico della VM
ssh_commandComando SSH per connettersi alla VM
dbaas_hostEndpoint DBaaS (null quando enable_mysql = false)

Istruzioni di deployment​

1. Clona e naviga​

git clone https://github.com/arubacloud/terraform-arubacloud-examples.git
cd terraform-arubacloud-examples/forgejo

2. Configura le variabili​

cp terraform.tfvars.example terraform.tfvars

Modifica terraform.tfvars con le tue credenziali. Come minimo imposta arubacloud_client_id, arubacloud_client_secret e ssh_public_key.

Suggerimento: Conserva le credenziali come variabili d'ambiente per evitare di scriverle su disco:

export TF_VAR_arubacloud_client_id="your-id"
export TF_VAR_arubacloud_client_secret="your-secret"

3. Inizializza e distribuisci​

terraform init
terraform plan # rivedi il piano di esecuzione
terraform apply

4. Accedi a Forgejo​

Dopo il completamento dell'apply (tipicamente 5–10 minuti per cloud-init con SQLite, 15–20 minuti con MySQL):

terraform output web_url

Apri l'URL nel browser. Il primo utente che si registra diventa amministratore dell'istanza.

5. Segui il progresso di cloud-init (opzionale)​

ssh ubuntu@$(terraform output -raw vm_public_ip)
sudo tail -f /var/log/cloud-init-output.log

6. Clona un repository via SSH​

# Dopo aver creato un repo tramite l'interfaccia web:
git clone ssh://git@$(terraform output -raw vm_public_ip):2222/<username>/<repo>.git

Raccomandazioni di sicurezza​

  1. Limita SSH al tuo IP. Imposta ssh_cidr = "your.ip.address/32" in terraform.tfvars.

  2. Usa un dominio personalizzato con HTTPS. Imposta la variabile domain. Certbot provvederà automaticamente al provisioning e al rinnovo del certificato Let's Encrypt.

  3. Disabilita la registrazione pubblica dopo la configurazione. Una volta che il tuo team si è registrato, imposta DISABLE_REGISTRATION = true nel pannello admin di Forgejo (Amministrazione del sito → Configurazione) o tramite API.

  4. Imposta una password admin robusta al momento della registrazione del primo account.

  5. Non esporre MySQL pubblicamente (già applicato — il security group DBaaS consente l'ingress solo dall'Elastic IP della VM).


Risoluzione dei problemi​

Forgejo non è raggiungibile dopo apply​

  1. cloud-init ancora in esecuzione. Controlla il log di bootstrap:

    ssh ubuntu@$(terraform output -raw vm_public_ip)
    sudo tail -f /var/log/cloud-init-output.log
  2. Servizio Forgejo non avviato. Verifica il servizio:

    sudo systemctl status forgejo
    sudo journalctl -u forgejo -n 50
  3. MySQL non pronto (quando enable_mysql = true). cloud-init attende fino a 15 minuti per il DBaaS. Controlla il log per il messaggio "MySQL ready" o "ERROR: MySQL did not become ready".

nginx restituisce 502 Bad Gateway​

Forgejo non è in ascolto sulla porta 3000:

sudo systemctl status forgejo
sudo systemctl start forgejo

Il clone Git via SSH fallisce (porta 2222)​

ssh -p 2222 git@$(terraform output -raw vm_public_ip)
# Dovrebbe stampare: "Forgejo: Hi <user>! You've successfully authenticated..."

Riferimenti​