# 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 # Dominios públicos (Coolify) RADICALE_DOMAIN=radicale.tu-dominio.com INFCLOUD_DOMAIN=infcloud.tu-dominio.com COOLIFY_ENTRYPOINTS=https # 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) ## 🌐 Integración con coolify-proxy 1. **Define los dominios públicos:** Rellena las variables `RADICALE_DOMAIN`, `INFCLOUD_DOMAIN` y `COOLIFY_ENTRYPOINTS` (por defecto `https`) en `.env`. Mantén `RADICALE_BASE_URL` e `INFCLOUD_BASE_URL` apuntando a las URLs HTTPS finales para que InfCloud genere enlaces correctos. 2. **Genera la configuración de InfCloud:** `make config`. 3. **Asegura la red externa:** Coolify crea una red llamada `coolify-proxy`. Si no existe ejecútalo una vez como root: `docker network create coolify-proxy`. 4. **Ajusta y despliega los servicios:** `docker compose up -d` (o `make start`). Cada servicio se conectará automáticamente tanto a `caldav_net` como a `coolify-proxy` y expondrá las etiquetas Traefik necesarias. 5. **Verifica la conexión a la red de Coolify:** `docker network inspect coolify-proxy | grep -E 'radicale|infcloud'`. 6. **Crea los routers desde Coolify:** Dentro del panel de Coolify > Proxy, declara cada subdominio apuntando al contenedor correspondiente y al puerto interno (`5232` para Radicale, `80` para InfCloud). Traefik detectará los labels y emitirá los certificados usando el resolver indicado. 7. **Pruebas rápidas:** `docker compose ps` para comprobar que ambos contenedores están arriba y `curl -u usuario:contraseña -X PROPFIND https://tu-subdominio-radicale/usuario/ -H "Depth: 0"` para validar la publicación detrás de Coolify. ## 🐛 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