227 lines
7.1 KiB
Markdown
227 lines
7.1 KiB
Markdown
# Calendario de Contactos - CalDAV/CardDAV
|
|
|
|
Sistema completo de calendario y contactos usando Radicale e InfCloud con Docker.
|
|
|
|
## 🚀 Configuración Rápida
|
|
|
|
1. **Configurar variables de entorno:**
|
|
```bash
|
|
make setup
|
|
# Edita el archivo .env con tus credenciales
|
|
```
|
|
|
|
2. **Iniciar servicios:**
|
|
```bash
|
|
make start
|
|
```
|
|
|
|
3. **Acceder a la aplicación:**
|
|
- InfCloud: http://localhost:8090/ (o http://localhost:8090/infcloud/)
|
|
- Radicale: http://localhost:5232/
|
|
|
|
## 📁 Estructura del Proyecto
|
|
|
|
```
|
|
calendario_contactos/
|
|
├── .env # Variables de entorno (no incluir en git)
|
|
├── .env.example # Plantilla de variables de entorno
|
|
├── docker-compose.yml # Configuración de servicios
|
|
├── Makefile # Comandos de gestión
|
|
├── config/ # Configuración de Radicale
|
|
│ ├── config # Configuración principal de Radicale
|
|
│ └── users # Usuarios y contraseñas (bcrypt)
|
|
├── data/ # Datos persistentes de Radicale
|
|
└── infcloud_config/ # Configuración de InfCloud
|
|
├── config.js # Configuración generada (no editar)
|
|
├── config.js.template # Plantilla de configuración
|
|
└── nginx-infcloud.conf # Configuración nginx
|
|
```
|
|
|
|
## 🛠️ Comandos Disponibles
|
|
|
|
```bash
|
|
make help # Mostrar ayuda
|
|
make setup # Configuración inicial (copia .env.example)
|
|
make start # Generar config e iniciar servicios
|
|
make stop # Detener servicios
|
|
make restart # Reiniciar servicios
|
|
make config # Regenerar config.js desde .env
|
|
make status # Mostrar estado de servicios
|
|
make test-connection # Probar conexión con Radicale
|
|
make logs # Mostrar logs de todos los servicios
|
|
make logs-infcloud # Mostrar logs solo de InfCloud
|
|
make logs-radicale # Mostrar logs solo de Radicale
|
|
make clean # Limpiar configuración generada
|
|
```
|
|
|
|
## ⚙️ Variables de Entorno
|
|
|
|
Configura estas variables en tu archivo `.env`:
|
|
|
|
```env
|
|
# Configuración de Radicale
|
|
RADICALE_USERNAME=admin
|
|
RADICALE_PASSWORD=tu_contraseña_segura_aqui
|
|
|
|
# Configuración de Red
|
|
RADICALE_PORT=5232
|
|
INFCLOUD_PORT=8090
|
|
|
|
# Configuración de Zona Horaria
|
|
TZ=Europe/Madrid
|
|
|
|
# URLs base
|
|
RADICALE_BASE_URL=http://localhost:5232
|
|
INFCLOUD_BASE_URL=http://localhost:8090
|
|
```
|
|
|
|
## 🔧 Servicios
|
|
|
|
### Radicale (CalDAV/CardDAV Server)
|
|
- **Puerto:** 5232
|
|
- **Función:** Servidor CalDAV/CardDAV que almacena calendarios y contactos
|
|
- **Configuración:** `/config/config`
|
|
- **Datos:** `/data/collections`
|
|
|
|
### InfCloud (Web Client)
|
|
- **Puerto:** 8090
|
|
- **Función:** Cliente web para calendarios y contactos
|
|
- **URL:** http://localhost:8090/ (también disponible en /infcloud/)
|
|
- **Configuración:** Generada automáticamente desde `.env`
|
|
|
|
### PHP-FPM
|
|
- **Función:** Soporte PHP para InfCloud (si es necesario)
|
|
|
|
## 🔐 Gestión de Usuarios
|
|
|
|
### Agregar un nuevo usuario:
|
|
```bash
|
|
# Generar hash de contraseña para cualquier usuario
|
|
python3 -c "import crypt; print('nombre_usuario:' + crypt.crypt('contraseña', crypt.mksalt(crypt.METHOD_BLOWFISH)))" >> config/users
|
|
|
|
# Ejemplo para crear usuario 'juan':
|
|
python3 -c "import crypt; print('juan:' + crypt.crypt('mi_password', crypt.mksalt(crypt.METHOD_BLOWFISH)))" >> config/users
|
|
|
|
# Reiniciar Radicale
|
|
docker compose restart radicale
|
|
```
|
|
|
|
### Usuarios de ejemplo:
|
|
- **admin:** kIKTu4rI5MBBJjTqujbCp61ZFN30Y8adI
|
|
- **user1:** password123
|
|
|
|
### Cambiar contraseña:
|
|
1. Edita `config/users` con el nuevo hash bcrypt
|
|
2. Actualiza `.env` con la nueva contraseña
|
|
3. Regenera configuración: `make config`
|
|
4. Reinicia servicios: `make restart`
|
|
|
|
## 📱 Acceso desde Dispositivos
|
|
|
|
### Android (DAVx5)
|
|
- **URL CalDAV:** http://tu-servidor:5232/usuario/
|
|
- **URL CardDAV:** http://tu-servidor:5232/usuario/
|
|
- **Usuario:** tu_usuario
|
|
- **Contraseña:** tu_contraseña
|
|
|
|
### iOS (Configuración nativa)
|
|
- **Servidor:** tu-servidor
|
|
- **Puerto:** 5232
|
|
- **Ruta principal:** /usuario/
|
|
- **SSL:** No (para desarrollo local)
|
|
|
|
## 🐛 Resolución de Problemas
|
|
|
|
### Error 405 PROPFIND
|
|
✅ **Solucionado:** Configuración nginx con proxy y rewrite rules
|
|
|
|
### Error 401 Unauthorized
|
|
- Verifica credenciales en `.env`
|
|
- Regenera config: `make config`
|
|
- Verifica usuario en `config/users`
|
|
|
|
### Error de conexión
|
|
```bash
|
|
make status # Verificar estado de servicios
|
|
make logs # Ver logs para errores
|
|
make test-connection # Probar conexión directa
|
|
```
|
|
|
|
### Regenerar todo
|
|
```bash
|
|
make clean # Limpiar configuración
|
|
make config # Regenerar config.js
|
|
make restart # Reiniciar servicios
|
|
```
|
|
|
|
## 📋 Verificación Post-instalación
|
|
|
|
1. **Servicios ejecutándose:**
|
|
```bash
|
|
make status
|
|
```
|
|
|
|
2. **Conexión a Radicale:**
|
|
```bash
|
|
make test-connection
|
|
```
|
|
|
|
3. **Acceso a InfCloud:**
|
|
- Navegar a http://localhost:8090/
|
|
- **Login dinámico:** Cualquier usuario puede iniciar sesión
|
|
- Usuarios disponibles: admin, user1, o cualquier usuario que agregues
|
|
|
|
4. **Verificar que no hay errores 405:**
|
|
```bash
|
|
curl -u usuario:contraseña -X PROPFIND http://localhost:8090/caldav.php/usuario/ -H "Depth: 0" -v 2>&1 | grep "HTTP"
|
|
# Debe devolver: HTTP/1.1 207 Multi-Status
|
|
```
|
|
|
|
## 🔒 Seguridad
|
|
|
|
- ❌ **NO** hardcodear contraseñas en archivos de configuración
|
|
- ✅ Usar variables de entorno (`.env`)
|
|
- ✅ Mantener `.env` fuera del control de versiones
|
|
- ✅ Usar contraseñas seguras y únicas
|
|
- ✅ Configurar HTTPS en producción
|
|
|
|
## 📚 Referencias
|
|
|
|
- [Radicale Documentation](https://radicale.org/v3.html)
|
|
- [InfCloud Documentation](https://www.inf-it.com/open-source/clients/infcloud/)
|
|
- [CalDAV RFC](https://tools.ietf.org/html/rfc4791)
|
|
- [CardDAV RFC](https://tools.ietf.org/html/rfc6352)
|
|
|
|
## 🎯 Problemas Resueltos
|
|
|
|
### ✅ Error PROPFIND 405 Method Not Allowed
|
|
**Problema:** InfCloud enviaba peticiones PROPFIND a `/caldav.php/` que devolvían error 405.
|
|
|
|
**Solución:**
|
|
1. Configuración nginx con proxy que redirige peticiones CalDAV a Radicale
|
|
2. Rewrite rules para traducir rutas `/caldav.php/` y `/radicale/` a rutas nativas de Radicale
|
|
3. Headers CORS completos para WebDAV
|
|
4. Sistema de variables de entorno para configuración segura
|
|
|
|
### ✅ Configuración de Credenciales Segura
|
|
**Problema:** Contraseñas hardcodeadas en archivos de configuración.
|
|
|
|
**Solución:**
|
|
1. Sistema de variables de entorno con `.env` y `.env.example`
|
|
2. Generación automática de `config.js` desde template
|
|
3. Makefile para automatizar tareas comunes
|
|
4. Hash bcrypt para almacenamiento seguro de contraseñas
|
|
|
|
### ✅ Soporte Multi-Usuario Dinámico
|
|
**Funcionalidad:** InfCloud ahora soporta múltiples usuarios con login dinámico.
|
|
|
|
**Características:**
|
|
1. **Login dinámico:** Los usuarios ingresan sus credenciales en la pantalla de login
|
|
2. **Múltiples usuarios:** Soporte para admin, user1, user2, etc.
|
|
3. **Nginx universal:** Maneja rutas para cualquier usuario (`/usuario/`)
|
|
4. **Configuración automática:** InfCloud detecta usuarios automáticamente
|
|
|
|
**Pruebas realizadas:**
|
|
- ✅ admin: HTTP 207 Multi-Status
|
|
- ✅ user1: HTTP 207 Multi-Status
|
|
- ✅ Cualquier usuario nuevo funciona automáticamente |