13 KiB
Documentacion Servidor tzzr.net
Resumen Ejecutivo
Servidor self-hosted con email, base de datos, gestor de archivos, acortador de URLs, alias de correo y gestor de contrasenas.
IP: 72.62.1.113 Hostname: box.tzzr.net OS: Ubuntu (Mail-in-a-Box) Dominio principal: tzzr.net
Arquitectura
[Cloudflare DNS]
|
[72.62.1.113]
|
+-----------------+-----------------+
| |
[Mail-in-a-Box] [Docker Stack]
Puerto 25,443 Puertos internos
| |
+----+----+ +---------------+---------------+
| | | | | | |
Email Nextcloud Postgres NocoDB Shlink Addy Vaultwarden
| |
FileBrowser Redis
Servicios Activos
Mail-in-a-Box (Nativo)
| Componente | URL/Puerto | Descripcion |
|---|---|---|
| Webmail | https://box.tzzr.net/mail | Roundcube |
| Admin Panel | https://box.tzzr.net/admin | Gestion usuarios/DNS |
| Nextcloud | https://box.tzzr.net/cloud | Archivos/Calendario |
| SMTP | Puerto 25, 587 | Envio de correo |
| IMAP | Puerto 993 | Recepcion de correo |
Docker Stack (/opt/services)
| Servicio | Puerto Interno | URL Publica | Descripcion |
|---|---|---|---|
| PostgreSQL | 5432 | - | Base de datos compartida |
| Redis | 6379 | - | Cache para Addy.io |
| NocoDB | 8081 | https://db.tzzr.net | Airtable self-hosted |
| FileBrowser | 8082 | https://files.tzzr.net | Explorador de archivos |
| Shlink | 8083 | https://s.tzzr.net | Acortador de URLs |
| Addy.io | 8084 | https://alias.tzzr.net | Alias de email |
| Vaultwarden | 8085 | https://pass.tzzr.net | Gestor de contrasenas |
Credenciales
Mail-in-a-Box
- Admin: admin@tzzr.net
- Password: (configurada durante instalacion)
PostgreSQL
- Host: postgres (interno) / 127.0.0.1:5432
- Usuario: tzzr
- Password: TzzrDB-2024-Secure
- Base de datos: tzzr
NocoDB
- URL: https://db.tzzr.net
- JWT Secret: TzzrNocoDB-JWT-2024-SecureKey
- Primer usuario: se crea en primer acceso
FileBrowser
- URL: https://files.tzzr.net
- Usuario inicial: admin
- Password inicial: admin (cambiar inmediatamente)
Shlink
- URL: https://s.tzzr.net
- API: usar
shlink api-key:generateen el contenedor
Addy.io
- URL: https://alias.tzzr.net
- App Key: base64:TzzrAddyAppKey2024SecureBase64KeyHere==
- Secret: TzzrAddySecret2024Secure
Vaultwarden
- URL: https://pass.tzzr.net
- Admin Panel: https://pass.tzzr.net/admin
- Admin Token: TzzrVault-Admin-2024-SuperSecureToken
- Registros publicos: Desactivados
- Invitaciones: Activadas (via admin panel)
Configuracion DNS (Cloudflare)
| Tipo | Nombre | Contenido | Proxy | TTL |
|---|---|---|---|---|
| A | @ | 72.62.1.113 | OFF | Auto |
| A | box | 72.62.1.113 | OFF | Auto |
| A | db | 72.62.1.113 | ON | Auto |
| A | files | 72.62.1.113 | ON | Auto |
| A | s | 72.62.1.113 | ON | Auto |
| A | alias | 72.62.1.113 | ON | Auto |
| A | pass | 72.62.1.113 | ON | Auto |
| MX | @ | box.tzzr.net | - | Auto |
| TXT | @ | v=spf1 mx -all | - | Auto |
| TXT | _dmarc | v=DMARC1; p=quarantine... | - | Auto |
Importante: Los registros MX y el dominio raiz (@, box) deben tener proxy OFF para que funcione el email.
Estructura de Archivos
/opt/services/
├── docker-compose.yml # Definicion de servicios
├── init.sql # Schema inicial PostgreSQL
├── backup.sh # Script de backups
└── backups/ # Directorio de backups
/home/user-data/ # Datos de Mail-in-a-Box
├── mail/ # Buzones de correo
├── ssl/ # Certificados SSL
├── backup/ # Backups automaticos MiaB
└── www/ # Archivos web estaticos
/etc/nginx/conf.d/
└── services.conf # Reverse proxy para Docker
Backups
Automaticos (Mail-in-a-Box)
- Ubicacion: /home/user-data/backup/
- Incluye: Email, Nextcloud, certificados, configuracion
- Frecuencia: Diaria
Script personalizado (/opt/services/backup.sh)
- Frecuencia: Diaria a las 3:00 AM
- Retencion: 7 dias
- Incluye:
- Dump de PostgreSQL
- Volumenes Docker
- Ubicacion: /opt/services/backups/
Cron job
0 3 * * * /opt/services/backup.sh >> /var/log/tzzr-backup.log 2>&1
Decisiones Tecnicas
Por que Mail-in-a-Box?
- Solucion todo-en-uno para email self-hosted
- Incluye Nextcloud, DNS, certificados SSL automaticos
- Panel de administracion simple
- Backups integrados
Por que PostgreSQL compartido?
- Reduce uso de RAM (vs multiples instancias)
- Facilita backups centralizados
- NocoDB, Shlink y Addy.io lo soportan nativamente
Por que puertos solo en 127.0.0.1?
- Seguridad: servicios no expuestos directamente
- Todo el trafico pasa por nginx con SSL
- Mail-in-a-Box maneja los certificados
Por que Vaultwarden en lugar de Bitwarden oficial?
- Menor consumo de recursos (escrito en Rust)
- Compatible 100% con apps de Bitwarden
- Ideal para uso personal/pequenos equipos
- Una sola imagen Docker vs multiple contenedores
Comandos Utiles
# Ver estado de contenedores
docker ps
# Ver logs de un servicio
docker logs -f nocodb
# Reiniciar stack completo
cd /opt/services && docker compose restart
# Backup manual de PostgreSQL
docker exec postgres pg_dump -U tzzr tzzr > backup.sql
# Reiniciar nginx
systemctl restart nginx
# Ver certificados SSL
certbot certificates
# Estado de Mail-in-a-Box
mailinabox
Plan de Clonacion para Nuevos Usuarios
Estrategia de Dominios para la Organizacion
Arquitectura Multi-Tenant
[Dominio Principal]
juntis.com
|
Email principal para TODOS los usuarios
usuario@juntis.com
|
+-------------------+-------------------+
| | |
[Servidor 1] [Servidor 2] [Servidor N]
tzzr.net otro.net nuevo.net
| | |
Alias propios Alias propios Alias propios
*@tzzr.net *@otro.net *@nuevo.net
Justificacion
-
Email principal centralizado (juntis.com):
- Identidad corporativa unificada
- Todos los usuarios tienen @juntis.com
- Facilita comunicacion interna
- Un solo servidor de mail principal
-
Dominios de alias separados (tzzr.net, otro.net, etc.):
- Cada persona/servidor tiene su propio dominio
- Evita colisiones de alias (dos personas no crearan el mismo alias)
- Privacidad: cada quien gestiona sus alias
- Escalabilidad: agregar nuevos usuarios = nuevo dominio
Ejemplo Practico
| Usuario | Email Principal | Dominio Alias | Ejemplos de Alias |
|---|---|---|---|
| Pablo | pablo@juntis.com | tzzr.net | amazon@tzzr.net, netflix@tzzr.net |
| Maria | maria@juntis.com | maria.net | amazon@maria.net, spotify@maria.net |
| Juan | juan@juntis.com | juan.net | amazon@juan.net, github@juan.net |
Todos reciben email en @juntis.com, pero cada uno tiene alias unicos en su dominio.
Checklist de Clonacion
Prerequisitos
- VPS nuevo (minimo 2GB RAM, 20GB disco)
- Dominio nuevo registrado (ej: nuevo-usuario.net)
- Acceso a Cloudflare (o DNS del dominio)
- IP publica del nuevo servidor
Paso 1: Preparar el Servidor Base
# Conectar al nuevo servidor
ssh root@NUEVA_IP
# Actualizar sistema
apt update && apt upgrade -y
# Configurar hostname
hostnamectl set-hostname box.NUEVO-DOMINIO.net
Paso 2: Instalar Mail-in-a-Box
# Instalar MiaB
curl -s https://mailinabox.email/setup.sh | sudo bash
Durante la instalacion:
- Hostname: box.NUEVO-DOMINIO.net
- Email admin: admin@NUEVO-DOMINIO.net (temporal, luego se configura el principal)
Paso 3: Configurar DNS en Cloudflare
Crear estos registros para NUEVO-DOMINIO.net:
| Tipo | Nombre | Contenido | Proxy |
|---|---|---|---|
| A | @ | NUEVA_IP | OFF |
| A | box | NUEVA_IP | OFF |
| A | db | NUEVA_IP | ON |
| A | files | NUEVA_IP | ON |
| A | s | NUEVA_IP | ON |
| A | alias | NUEVA_IP | ON |
| A | pass | NUEVA_IP | ON |
| MX | @ | box.NUEVO-DOMINIO.net | - |
| TXT | @ | v=spf1 mx -all | - |
Paso 4: Instalar Docker
curl -fsSL https://get.docker.com | sh
Paso 5: Crear Estructura de Directorios
mkdir -p /opt/services/backups
cd /opt/services
Paso 6: Configurar docker-compose.yml
Copiar el archivo base y modificar:
# Cambiar estas variables por cada servidor:
# - Passwords de PostgreSQL
# - JWT secrets
# - Dominios (s.DOMINIO, alias.DOMINIO, pass.DOMINIO)
# - App keys
Variables a personalizar por servidor:
| Variable | Descripcion | Ejemplo |
|---|---|---|
| POSTGRES_PASSWORD | Password de DB | NuevoUsuario-DB-2024 |
| NC_AUTH_JWT_SECRET | JWT de NocoDB | NuevoUsuario-JWT-Secret |
| DEFAULT_DOMAIN | Dominio Shlink | s.nuevo-usuario.net |
| ANONADDY_DOMAIN | Dominio alias | nuevo-usuario.net |
| APP_KEY | Key de Addy | base64:NuevoKeyAqui... |
| DOMAIN (Vaultwarden) | URL Vaultwarden | https://pass.nuevo-usuario.net |
| ADMIN_TOKEN | Token admin Vault | NuevoUsuario-Vault-Token |
Paso 7: Configurar Nginx
Copiar /etc/nginx/conf.d/services.conf y reemplazar:
- Todos los
tzzr.netporNUEVO-DOMINIO.net - Verificar que los puertos coincidan
# Recargar nginx
nginx -t && systemctl reload nginx
Paso 8: Iniciar Servicios
cd /opt/services
docker compose up -d
Paso 9: Configurar Email Principal
Si el email principal es juntis.com (servidor central):
- En el servidor central (juntis.com), crear cuenta: usuario@juntis.com
- En Addy.io del nuevo servidor, configurar el reenvio a usuario@juntis.com
- Los alias de NUEVO-DOMINIO.net reenviaran a usuario@juntis.com
Paso 10: Verificacion Final
# Verificar contenedores
docker ps
# Probar cada servicio
curl -I https://db.NUEVO-DOMINIO.net
curl -I https://files.NUEVO-DOMINIO.net
curl -I https://s.NUEVO-DOMINIO.net
curl -I https://alias.NUEVO-DOMINIO.net
curl -I https://pass.NUEVO-DOMINIO.net
Script de Clonacion Automatizada
Para facilitar el proceso, se puede crear un script interactivo:
#!/bin/bash
# clone-server.sh - Script de clonacion de servidor tzzr
echo "=== Clonacion de Servidor ==="
read -p "Nuevo dominio (ej: nuevo-usuario.net): " DOMAIN
read -p "IP del servidor: " SERVER_IP
read -p "Email admin: " ADMIN_EMAIL
# Generar passwords aleatorios
DB_PASS=$(openssl rand -base64 16)
JWT_SECRET=$(openssl rand -base64 32)
APP_KEY=$(openssl rand -base64 32)
VAULT_TOKEN=$(openssl rand -base64 32)
echo ""
echo "=== Configuracion Generada ==="
echo "Dominio: $DOMAIN"
echo "IP: $SERVER_IP"
echo "DB Password: $DB_PASS"
echo "JWT Secret: $JWT_SECRET"
echo "Vault Token: $VAULT_TOKEN"
echo ""
echo "Guarda estas credenciales en un lugar seguro!"
Mantenimiento Post-Clonacion
Tareas Semanales
- Verificar que backups se ejecutan
- Revisar logs de errores
- Actualizar contenedores si hay parches de seguridad
Tareas Mensuales
- Renovar certificados SSL (automatico con MiaB)
- Revisar uso de disco
- Actualizar sistema operativo
Actualizacion de Contenedores
cd /opt/services
docker compose pull
docker compose up -d
Resolucion de Problemas Comunes
SSL no funciona
- Verificar que DNS apunta correctamente
- Esperar propagacion (hasta 24h)
- Ejecutar:
mailinaboxpara regenerar certificados
Contenedor no inicia
docker logs NOMBRE_CONTENEDOR
# Verificar si es problema de dependencias o configuracion
Email no llega
- Verificar registros MX en DNS
- Revisar logs:
docker logs postfixo/var/log/mail.log - Verificar que puerto 25 no esta bloqueado
Base de datos llena
# Ver espacio
docker exec postgres psql -U tzzr -c "SELECT pg_size_pretty(pg_database_size('tzzr'));"
# Limpiar si es necesario
docker exec postgres vacuumdb -U tzzr -d tzzr -f
Contacto y Soporte
- Repositorio: (agregar si se crea)
- Documentacion Mail-in-a-Box: https://mailinabox.email/guide.html
- Documentacion Vaultwarden: https://github.com/dani-garcia/vaultwarden/wiki
Documento generado: Diciembre 2024 Ultima actualizacion: Incluye Vaultwarden y plan de clonacion