Upload files to "primerboot"
# Resumen operativo — Infraestructura Self-Hosted Fecha: ```text 2026-05-05 ``` Servidor: ```text Hetzner VPS Ubuntu 24.04 ``` DNS: ```text Cloudflare ``` --- # Objetivo alcanzado Infraestructura self-hosted funcional con: - Gitea - Vaultwarden - NGINX - Certbot - HTTPS válido - Docker Compose - Cloudflare DNS - arquitectura reproducible --- # Dominios ## Gitea ```text https://git.carmona.digital ``` --- ## Vaultwarden ```text https://vault.carmona.digital ``` --- # Arquitectura actual ```text Internet ↓ NGINX reverse proxy ↓ Docker network ├── Gitea ├── Vaultwarden └── PostgreSQL ``` --- # Estructura filesystem ```text /opt/gitea ├── docker-compose.yml ├── nginx/ │ └── conf.d/ ├── certbot/ │ ├── conf/ │ └── www/ ├── gitea/ ├── postgres/ └── vaultwarden/ └── data/ ``` --- # Componentes desplegados ## Gitea Contenedor: ```text gitea ``` Puerto SSH Git: ```text 2222 ``` --- ## PostgreSQL Contenedor: ```text gitea-db ``` Persistencia local. --- ## NGINX Contenedor: ```text gitea-nginx ``` Funciones: - reverse proxy - HTTPS termination - routing subdominios - ACME challenge --- ## Vaultwarden Contenedor: ```text vaultwarden ``` Funciones: - password manager - secrets manager - TOTP - secure notes - API keys - SSH keys --- # DNS Cloudflare ## Tipo de registros Todos: ```text A records ``` --- ## Subdominios | Subdominio | Servicio | |---|---| | git | Gitea | | vault | Vaultwarden | --- ## Configuración importante ```text Proxy = DNS only ``` Durante setup SSL. --- # Problemas encontrados ## 1. nginx restarting Causa: ```text certificados inexistentes ``` Porque nginx intentaba cargar: ```text /etc/letsencrypt/live/git.blocaolabs.com/ ``` Cuando el dominio cambió a: ```text git.carmona.digital ``` --- ## Solución - eliminar HTTPS temporalmente - usar nginx HTTP-only - generar certificados - reactivar HTTPS --- ## 2. Configuración nginx corrupta Causa: ```text texto shell accidental dentro de gitea.conf ``` Ejemplo: ```text cat EOF ``` --- ## Solución Recrear archivo completamente. --- ## 3. Certbot fallaba Causa: ```text nginx caído ``` Let's Encrypt no podía acceder a: ```text http://git.carmona.digital/.well-known/acme-challenge/ ``` --- ## Solución - arreglar nginx - verificar puerto 80 - regenerar certificado --- ## 4. Vaultwarden usuario existente Causa: ```text persistencia SQLite ``` Usuarios guardados en: ```text /opt/gitea/vaultwarden/data ``` --- ## Solución ```bash rm -rf /opt/gitea/vaultwarden/data/* ``` y recrear contenedor. --- # Configuración SSL Certificados generados mediante: ```bash docker compose run --rm certbot certonly \ --webroot \ --webroot-path=/var/www/certbot \ --email digitalcarmona@gmail.com \ --agree-tos \ --no-eff-email \ -d DOMINIO ``` --- # Renovación automática SSL Cron configurado: ```cron 0 3 * * * cd /opt/gitea && docker compose run --rm certbot renew && docker compose restart nginx ``` --- # Configuración nginx ## Estrategia final Un único nginx centralizado. Virtual hosts separados: ```text /opt/gitea/nginx/conf.d/ ``` Ejemplos: ```text gitea.conf vaultwarden.conf ``` --- # Estrategia arquitectónica elegida ## Decisión NO usar: ```text 1 nginx por servicio ``` SÍ usar: ```text 1 nginx compartido ``` --- # Estrategia compose elegida ## Mantener ```text 1 docker-compose principal ``` en: ```text /opt/gitea ``` --- # Razón Más simple para: - bootstrap - recovery - reproducibilidad - AI-assisted operations --- # Servicios futuros recomendados ## Prioridad 1 ### Authentik Objetivo: - SSO - MFA - OAuth2 - central auth --- ## Prioridad 2 ### Uptime Kuma Objetivo: - monitoring - alertas - uptime checks --- ## Prioridad 3 ### Nextcloud Objetivo: - almacenamiento - colaboración - documentos --- ## Prioridad 4 ### Grafana Objetivo: - métricas - dashboards - observabilidad --- ## Prioridad 5 ### MinIO Objetivo: - S3 storage - backups - artefactos --- # Decisiones importantes tomadas ## Cloudflare Usado como DNS principal. --- ## HTTPS Gestionado localmente mediante: - nginx - certbot NO mediante Cloudflare SSL. --- ## Secrets Vaultwarden elegido frente a: - Hashicorp Vault - Doppler - Infisical por simplicidad operacional. --- # Comandos críticos de operación ## Ver logs nginx ```bash docker compose logs nginx --tail=50 ``` --- ## Reiniciar nginx ```bash docker compose restart nginx ``` --- ## Ver contenedores ```bash docker ps ``` --- ## Test SSL ```bash curl -I https://git.carmona.digital ``` --- ## Test DNS ```bash dig git.carmona.digital ``` --- ## Renovación SSL ```bash cd /opt/gitea docker compose run --rm certbot renew --dry-run ``` --- # Backup mínimo obligatorio ## Gitea ```text /opt/gitea/gitea ``` --- ## PostgreSQL ```text /opt/gitea/postgres ``` --- ## Vaultwarden ```text /opt/gitea/vaultwarden/data ``` --- ## Certificados ```text /opt/gitea/certbot/conf ``` --- # Objetivo futuro Construir una infraestructura: - reproducible - Git-native - AI-assisted - portable - documentada - fácilmente reconstruible desde prompts + contexto.
This commit is contained in:
@@ -0,0 +1,574 @@
|
|||||||
|
# Resumen operativo — Infraestructura Self-Hosted
|
||||||
|
|
||||||
|
Fecha:
|
||||||
|
|
||||||
|
```text
|
||||||
|
2026-05-05
|
||||||
|
```
|
||||||
|
|
||||||
|
Servidor:
|
||||||
|
|
||||||
|
```text
|
||||||
|
Hetzner VPS
|
||||||
|
Ubuntu 24.04
|
||||||
|
```
|
||||||
|
|
||||||
|
DNS:
|
||||||
|
|
||||||
|
```text
|
||||||
|
Cloudflare
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Objetivo alcanzado
|
||||||
|
|
||||||
|
Infraestructura self-hosted funcional con:
|
||||||
|
|
||||||
|
- Gitea
|
||||||
|
- Vaultwarden
|
||||||
|
- NGINX
|
||||||
|
- Certbot
|
||||||
|
- HTTPS válido
|
||||||
|
- Docker Compose
|
||||||
|
- Cloudflare DNS
|
||||||
|
- arquitectura reproducible
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Dominios
|
||||||
|
|
||||||
|
## Gitea
|
||||||
|
|
||||||
|
```text
|
||||||
|
https://git.carmona.digital
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Vaultwarden
|
||||||
|
|
||||||
|
```text
|
||||||
|
https://vault.carmona.digital
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Arquitectura actual
|
||||||
|
|
||||||
|
```text
|
||||||
|
Internet
|
||||||
|
↓
|
||||||
|
NGINX reverse proxy
|
||||||
|
↓
|
||||||
|
Docker network
|
||||||
|
├── Gitea
|
||||||
|
├── Vaultwarden
|
||||||
|
└── PostgreSQL
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Estructura filesystem
|
||||||
|
|
||||||
|
```text
|
||||||
|
/opt/gitea
|
||||||
|
├── docker-compose.yml
|
||||||
|
├── nginx/
|
||||||
|
│ └── conf.d/
|
||||||
|
├── certbot/
|
||||||
|
│ ├── conf/
|
||||||
|
│ └── www/
|
||||||
|
├── gitea/
|
||||||
|
├── postgres/
|
||||||
|
└── vaultwarden/
|
||||||
|
└── data/
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Componentes desplegados
|
||||||
|
|
||||||
|
## Gitea
|
||||||
|
|
||||||
|
Contenedor:
|
||||||
|
|
||||||
|
```text
|
||||||
|
gitea
|
||||||
|
```
|
||||||
|
|
||||||
|
Puerto SSH Git:
|
||||||
|
|
||||||
|
```text
|
||||||
|
2222
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## PostgreSQL
|
||||||
|
|
||||||
|
Contenedor:
|
||||||
|
|
||||||
|
```text
|
||||||
|
gitea-db
|
||||||
|
```
|
||||||
|
|
||||||
|
Persistencia local.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## NGINX
|
||||||
|
|
||||||
|
Contenedor:
|
||||||
|
|
||||||
|
```text
|
||||||
|
gitea-nginx
|
||||||
|
```
|
||||||
|
|
||||||
|
Funciones:
|
||||||
|
|
||||||
|
- reverse proxy
|
||||||
|
- HTTPS termination
|
||||||
|
- routing subdominios
|
||||||
|
- ACME challenge
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Vaultwarden
|
||||||
|
|
||||||
|
Contenedor:
|
||||||
|
|
||||||
|
```text
|
||||||
|
vaultwarden
|
||||||
|
```
|
||||||
|
|
||||||
|
Funciones:
|
||||||
|
|
||||||
|
- password manager
|
||||||
|
- secrets manager
|
||||||
|
- TOTP
|
||||||
|
- secure notes
|
||||||
|
- API keys
|
||||||
|
- SSH keys
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# DNS Cloudflare
|
||||||
|
|
||||||
|
## Tipo de registros
|
||||||
|
|
||||||
|
Todos:
|
||||||
|
|
||||||
|
```text
|
||||||
|
A records
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Subdominios
|
||||||
|
|
||||||
|
| Subdominio | Servicio |
|
||||||
|
|---|---|
|
||||||
|
| git | Gitea |
|
||||||
|
| vault | Vaultwarden |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Configuración importante
|
||||||
|
|
||||||
|
```text
|
||||||
|
Proxy = DNS only
|
||||||
|
```
|
||||||
|
|
||||||
|
Durante setup SSL.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Problemas encontrados
|
||||||
|
|
||||||
|
## 1. nginx restarting
|
||||||
|
|
||||||
|
Causa:
|
||||||
|
|
||||||
|
```text
|
||||||
|
certificados inexistentes
|
||||||
|
```
|
||||||
|
|
||||||
|
Porque nginx intentaba cargar:
|
||||||
|
|
||||||
|
```text
|
||||||
|
/etc/letsencrypt/live/git.blocaolabs.com/
|
||||||
|
```
|
||||||
|
|
||||||
|
Cuando el dominio cambió a:
|
||||||
|
|
||||||
|
```text
|
||||||
|
git.carmona.digital
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Solución
|
||||||
|
|
||||||
|
- eliminar HTTPS temporalmente
|
||||||
|
- usar nginx HTTP-only
|
||||||
|
- generar certificados
|
||||||
|
- reactivar HTTPS
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2. Configuración nginx corrupta
|
||||||
|
|
||||||
|
Causa:
|
||||||
|
|
||||||
|
```text
|
||||||
|
texto shell accidental dentro de gitea.conf
|
||||||
|
```
|
||||||
|
|
||||||
|
Ejemplo:
|
||||||
|
|
||||||
|
```text
|
||||||
|
cat
|
||||||
|
EOF
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Solución
|
||||||
|
|
||||||
|
Recrear archivo completamente.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 3. Certbot fallaba
|
||||||
|
|
||||||
|
Causa:
|
||||||
|
|
||||||
|
```text
|
||||||
|
nginx caído
|
||||||
|
```
|
||||||
|
|
||||||
|
Let's Encrypt no podía acceder a:
|
||||||
|
|
||||||
|
```text
|
||||||
|
http://git.carmona.digital/.well-known/acme-challenge/
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Solución
|
||||||
|
|
||||||
|
- arreglar nginx
|
||||||
|
- verificar puerto 80
|
||||||
|
- regenerar certificado
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 4. Vaultwarden usuario existente
|
||||||
|
|
||||||
|
Causa:
|
||||||
|
|
||||||
|
```text
|
||||||
|
persistencia SQLite
|
||||||
|
```
|
||||||
|
|
||||||
|
Usuarios guardados en:
|
||||||
|
|
||||||
|
```text
|
||||||
|
/opt/gitea/vaultwarden/data
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Solución
|
||||||
|
|
||||||
|
```bash
|
||||||
|
rm -rf /opt/gitea/vaultwarden/data/*
|
||||||
|
```
|
||||||
|
|
||||||
|
y recrear contenedor.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Configuración SSL
|
||||||
|
|
||||||
|
Certificados generados mediante:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker compose run --rm certbot certonly \
|
||||||
|
--webroot \
|
||||||
|
--webroot-path=/var/www/certbot \
|
||||||
|
--email digitalcarmona@gmail.com \
|
||||||
|
--agree-tos \
|
||||||
|
--no-eff-email \
|
||||||
|
-d DOMINIO
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Renovación automática SSL
|
||||||
|
|
||||||
|
Cron configurado:
|
||||||
|
|
||||||
|
```cron
|
||||||
|
0 3 * * * cd /opt/gitea && docker compose run --rm certbot renew && docker compose restart nginx
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Configuración nginx
|
||||||
|
|
||||||
|
## Estrategia final
|
||||||
|
|
||||||
|
Un único nginx centralizado.
|
||||||
|
|
||||||
|
Virtual hosts separados:
|
||||||
|
|
||||||
|
```text
|
||||||
|
/opt/gitea/nginx/conf.d/
|
||||||
|
```
|
||||||
|
|
||||||
|
Ejemplos:
|
||||||
|
|
||||||
|
```text
|
||||||
|
gitea.conf
|
||||||
|
vaultwarden.conf
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Estrategia arquitectónica elegida
|
||||||
|
|
||||||
|
## Decisión
|
||||||
|
|
||||||
|
NO usar:
|
||||||
|
|
||||||
|
```text
|
||||||
|
1 nginx por servicio
|
||||||
|
```
|
||||||
|
|
||||||
|
SÍ usar:
|
||||||
|
|
||||||
|
```text
|
||||||
|
1 nginx compartido
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Estrategia compose elegida
|
||||||
|
|
||||||
|
## Mantener
|
||||||
|
|
||||||
|
```text
|
||||||
|
1 docker-compose principal
|
||||||
|
```
|
||||||
|
|
||||||
|
en:
|
||||||
|
|
||||||
|
```text
|
||||||
|
/opt/gitea
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Razón
|
||||||
|
|
||||||
|
Más simple para:
|
||||||
|
|
||||||
|
- bootstrap
|
||||||
|
- recovery
|
||||||
|
- reproducibilidad
|
||||||
|
- AI-assisted operations
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Servicios futuros recomendados
|
||||||
|
|
||||||
|
## Prioridad 1
|
||||||
|
|
||||||
|
### Authentik
|
||||||
|
|
||||||
|
Objetivo:
|
||||||
|
|
||||||
|
- SSO
|
||||||
|
- MFA
|
||||||
|
- OAuth2
|
||||||
|
- central auth
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Prioridad 2
|
||||||
|
|
||||||
|
### Uptime Kuma
|
||||||
|
|
||||||
|
Objetivo:
|
||||||
|
|
||||||
|
- monitoring
|
||||||
|
- alertas
|
||||||
|
- uptime checks
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Prioridad 3
|
||||||
|
|
||||||
|
### Nextcloud
|
||||||
|
|
||||||
|
Objetivo:
|
||||||
|
|
||||||
|
- almacenamiento
|
||||||
|
- colaboración
|
||||||
|
- documentos
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Prioridad 4
|
||||||
|
|
||||||
|
### Grafana
|
||||||
|
|
||||||
|
Objetivo:
|
||||||
|
|
||||||
|
- métricas
|
||||||
|
- dashboards
|
||||||
|
- observabilidad
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Prioridad 5
|
||||||
|
|
||||||
|
### MinIO
|
||||||
|
|
||||||
|
Objetivo:
|
||||||
|
|
||||||
|
- S3 storage
|
||||||
|
- backups
|
||||||
|
- artefactos
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Decisiones importantes tomadas
|
||||||
|
|
||||||
|
## Cloudflare
|
||||||
|
|
||||||
|
Usado como DNS principal.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## HTTPS
|
||||||
|
|
||||||
|
Gestionado localmente mediante:
|
||||||
|
|
||||||
|
- nginx
|
||||||
|
- certbot
|
||||||
|
|
||||||
|
NO mediante Cloudflare SSL.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Secrets
|
||||||
|
|
||||||
|
Vaultwarden elegido frente a:
|
||||||
|
|
||||||
|
- Hashicorp Vault
|
||||||
|
- Doppler
|
||||||
|
- Infisical
|
||||||
|
|
||||||
|
por simplicidad operacional.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Comandos críticos de operación
|
||||||
|
|
||||||
|
## Ver logs nginx
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker compose logs nginx --tail=50
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Reiniciar nginx
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker compose restart nginx
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Ver contenedores
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker ps
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Test SSL
|
||||||
|
|
||||||
|
```bash
|
||||||
|
curl -I https://git.carmona.digital
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Test DNS
|
||||||
|
|
||||||
|
```bash
|
||||||
|
dig git.carmona.digital
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Renovación SSL
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd /opt/gitea
|
||||||
|
docker compose run --rm certbot renew --dry-run
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Backup mínimo obligatorio
|
||||||
|
|
||||||
|
## Gitea
|
||||||
|
|
||||||
|
```text
|
||||||
|
/opt/gitea/gitea
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## PostgreSQL
|
||||||
|
|
||||||
|
```text
|
||||||
|
/opt/gitea/postgres
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Vaultwarden
|
||||||
|
|
||||||
|
```text
|
||||||
|
/opt/gitea/vaultwarden/data
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Certificados
|
||||||
|
|
||||||
|
```text
|
||||||
|
/opt/gitea/certbot/conf
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Objetivo futuro
|
||||||
|
|
||||||
|
Construir una infraestructura:
|
||||||
|
|
||||||
|
- reproducible
|
||||||
|
- Git-native
|
||||||
|
- AI-assisted
|
||||||
|
- portable
|
||||||
|
- documentada
|
||||||
|
- fácilmente reconstruible desde prompts + contexto.
|
||||||
|
|
||||||
Reference in New Issue
Block a user