Wiki completa de BookStack: 9 páginas en español

- Home: Índice, características, arquitectura MariaDB
- Traefik: Despliegue con labels, troubleshooting
- NPM: Despliegue con Proxy Hosts, comparativa
- Configuración Inicial: Primer acceso (admin@admin.com), roles, organización
- Personalización: LDAP/SAML/OAuth, temas, API, integraciones
- Backup y Restauración: mariadb-dump, scripts automáticos, migración
- Actualización: BookStack updates, MariaDB 10→11 migration, rollback
- Solución de Problemas: Diagnóstico, errores comunes, recuperación
- Sidebar: Navegación completa
2025-12-04 15:47:55 +01:00
parent 3a0839974e
commit b994308be0
9 changed files with 1768 additions and 1 deletions

245
Actualización.md Normal file

@@ -0,0 +1,245 @@
# Actualización
Mantén BookStack y MariaDB actualizados de forma segura.
## Pre-requisitos
⚠️ **SIEMPRE haz backup antes de actualizar**
```bash
# Backup rápido
docker exec bookstack-db mariadb-dump -u bookstack -p${DB_PASSWORD} bookstack > bookstack-pre-update-$(date +%Y%m%d).sql
docker run --rm -v bookstack_config:/backup -v $(pwd):/target alpine tar czf /target/bookstack-config-pre-update.tar.gz -C /backup .
```
---
## Actualizar BookStack
### Proceso Manual
```bash
# 1. Backup (ver arriba)
# 2. Detener stack
docker stop bookstack bookstack-db
# 3. Actualizar imágenes
docker pull lscr.io/linuxserver/bookstack:latest
docker pull mariadb:11-alpine
# 4. Iniciar MariaDB primero
docker start bookstack-db
sleep 10
# 5. Iniciar BookStack
docker start bookstack
# 6. Verificar logs
docker logs -f bookstack
# 7. Acceder y verificar
# https://bookstack.tudominio.com
# Settings → About → Verificar versión
```
### Con Portainer
1. Ve al stack `bookstack`
2. Click en **Pull and redeploy**
3. Espera 1-2 minutos
4. Verifica logs y acceso
---
## Actualizar MariaDB
### Actualización Menor (11.x → 11.y)
```bash
# Actualizar normalmente
docker stop bookstack bookstack-db
docker pull mariadb:11-alpine
docker start bookstack-db
sleep 15
docker start bookstack
```
### Actualización Mayor (10 → 11)
⚠️ **Requiere dump y restore**
```bash
# 1. Backup completo
docker exec bookstack-db mariadb-dump -u bookstack -p${DB_PASSWORD} bookstack > bookstack-mariadb-upgrade.sql
# 2. Detener todo
docker stop bookstack bookstack-db
# 3. Eliminar contenedor y volumen antiguo
docker rm bookstack-db
docker volume rm bookstack_db
# 4. Recrear volumen
docker volume create bookstack_db
# 5. Iniciar MariaDB 11
docker compose up -d bookstack-db
# 6. Esperar inicialización
sleep 20
# 7. Restaurar datos
cat bookstack-mariadb-upgrade.sql | docker exec -i bookstack-db mariadb -u bookstack -p${DB_PASSWORD} bookstack
# 8. Iniciar BookStack
docker start bookstack
# 9. Verificar
docker logs bookstack
```
---
## Rollback (Revertir Actualización)
### Rollback Rápido
```bash
# 1. Detener todo
docker stop bookstack bookstack-db
# 2. Volver a versión anterior de imagen
docker pull lscr.io/linuxserver/bookstack:v24.05.4
docker tag lscr.io/linuxserver/bookstack:v24.05.4 lscr.io/linuxserver/bookstack:latest
# 3. Restaurar BD desde backup
gunzip < bookstack-pre-update-20250101.sql.gz | docker exec -i bookstack-db mariadb -u bookstack -p${DB_PASSWORD} bookstack
# 4. Iniciar
docker start bookstack-db
sleep 10
docker start bookstack
```
### Rollback Completo
```bash
# 1. Detener y eliminar todo
docker stop bookstack bookstack-db
docker rm bookstack bookstack-db
docker volume rm bookstack_config bookstack_db
# 2. Recrear volúmenes
docker volume create bookstack_config
docker volume create bookstack_db
# 3. Iniciar stack
docker compose up -d bookstack-db
sleep 20
# 4. Restaurar desde backups
gunzip < bookstack-pre-update.sql.gz | docker exec -i bookstack-db mariadb -u bookstack -p${DB_PASSWORD} bookstack
docker run --rm -v bookstack_config:/restore -v $(pwd):/source alpine tar xzf /source/bookstack-config-pre-update.tar.gz -C /restore
# 5. Iniciar BookStack
docker start bookstack
```
---
## Actualización Automática con Watchtower
### Desplegar Watchtower
```yaml
services:
watchtower:
image: containrrr/watchtower
restart: unless-stopped
environment:
WATCHTOWER_CLEANUP: "true"
WATCHTOWER_INCLUDE_STOPPED: "false"
WATCHTOWER_SCHEDULE: "0 0 4 * * *" # 4 AM diario
WATCHTOWER_ROLLING_RESTART: "true"
volumes:
- /var/run/docker.sock:/var/run/docker.sock
labels:
- "com.centurylinklabs.watchtower.enable=true"
```
### Excluir BookStack de Watchtower
Si quieres control manual, añade label a `bookstack`:
```yaml
services:
bookstack:
labels:
- "com.centurylinklabs.watchtower.enable=false"
```
---
## Checklist Post-Actualización
### Verificar Funcionalidad
- [ ] BookStack accesible en https://bookstack.tudominio.com
- [ ] Login funciona correctamente
- [ ] Libros/capítulos/páginas visibles
- [ ] Búsqueda funciona
- [ ] Imágenes cargan correctamente
- [ ] Editor funciona (crear/editar páginas)
- [ ] API responde (si la usas)
- [ ] LDAP/SAML funciona (si lo usas)
### Verificar Logs
```bash
# Sin errores críticos
docker logs bookstack | grep -i error
docker logs bookstack | grep -i fatal
# BD conectada
docker logs bookstack | grep "Database"
```
### Verificar Versión
**Settings → About**:
- **BookStack Version**: Debe ser la nueva versión
- **PHP Version**: Verificar compatibilidad
---
## Mantenimiento
### Limpiar Imágenes Antiguas
```bash
# Listar imágenes antiguas
docker images | grep bookstack
docker images | grep mariadb
# Eliminar imágenes sin usar
docker image prune -a
```
### Optimizar Base de Datos
```bash
# Optimizar tablas
docker exec bookstack-db mariadb-optimize -u bookstack -p${DB_PASSWORD} bookstack
# Reparar tablas (si hay corrupción)
docker exec bookstack-db mariadb-check -u bookstack -p${DB_PASSWORD} --auto-repair bookstack
```
---
## Próximos Pasos
1. **[Backup](Backup-y-Restauración)** - Automatiza backups regulares
2. **Monitoriza** - Configura alertas de caídas
3. **Documenta** - Mantén registro de versiones

189
Backup-y-Restauración.md Normal file

@@ -0,0 +1,189 @@
# Backup y Restauración
Protege tus datos de BookStack con backups automáticos.
## Qué Hacer Backup
BookStack tiene 2 componentes críticos:
1. **MariaDB** - Base de datos (lo más importante)
2. **Configuración** - `/config/` (uploads, imágenes, configuración)
---
## Backup Manual
### MariaDB (Crítico)
```bash
# Backup completo
docker exec bookstack-db mariadb-dump -u bookstack -p${DB_PASSWORD} bookstack > bookstack-backup-$(date +%Y%m%d).sql
# Backup comprimido (ahorra espacio)
docker exec bookstack-db mariadb-dump -u bookstack -p${DB_PASSWORD} bookstack | gzip > bookstack-backup-$(date +%Y%m%d).sql.gz
# Verificar backup
gunzip -c bookstack-backup-20250101.sql.gz | head -20
```
### Configuración y Uploads
```bash
# Backup del volumen de configuración
docker run --rm -v bookstack_config:/backup -v $(pwd):/target alpine tar czf /target/bookstack-config-$(date +%Y%m%d).tar.gz -C /backup .
# Verificar
tar tzf bookstack-config-20250101.tar.gz | head
```
---
## Backup Automático
### Script de Backup
Crea `/root/backup-bookstack.sh`:
```bash
#!/bin/bash
# Configuración
BACKUP_DIR="/backups/bookstack"
DATE=$(date +%Y%m%d-%H%M%S)
RETENTION_DAYS=7
DB_PASSWORD="tu_password_aqui"
# Crear directorio
mkdir -p $BACKUP_DIR
# MariaDB (comprimido)
echo "Backing up MariaDB..."
docker exec bookstack-db mariadb-dump -u bookstack -p${DB_PASSWORD} bookstack | gzip > $BACKUP_DIR/bookstack-db-$DATE.sql.gz
# Configuración
echo "Backing up configuration..."
docker run --rm -v bookstack_config:/backup -v $BACKUP_DIR:/target alpine tar czf /target/bookstack-config-$DATE.tar.gz -C /backup .
# Limpiar backups antiguos
echo "Cleaning old backups..."
find $BACKUP_DIR -name "*.sql.gz" -mtime +$RETENTION_DAYS -delete
find $BACKUP_DIR -name "*.tar.gz" -mtime +$RETENTION_DAYS -delete
# Verificar
DB_SIZE=$(stat -f%z "$BACKUP_DIR/bookstack-db-$DATE.sql.gz" 2>/dev/null || stat -c%s "$BACKUP_DIR/bookstack-db-$DATE.sql.gz")
echo "Backup completado: $DATE (BD: $(($DB_SIZE / 1024 / 1024))MB)"
```
### Automatizar con Cron
```bash
chmod +x /root/backup-bookstack.sh
crontab -e
# Backup diario a las 3 AM
0 3 * * * /root/backup-bookstack.sh >> /var/log/backup-bookstack.log 2>&1
```
---
## Restauración
### Restaurar desde Backup
```bash
# 1. Detener BookStack
docker stop bookstack
# 2. Restaurar MariaDB
gunzip < bookstack-db-20250101.sql.gz | docker exec -i bookstack-db mariadb -u bookstack -p${DB_PASSWORD} bookstack
# 3. Restaurar configuración
docker run --rm -v bookstack_config:/restore -v $(pwd):/source alpine tar xzf /source/bookstack-config-20250101.tar.gz -C /restore
# 4. Limpiar caché
docker exec bookstack php artisan cache:clear
# 5. Iniciar BookStack
docker start bookstack
```
### Migración a Otro Servidor
```bash
# Servidor origen
docker exec bookstack-db mariadb-dump -u bookstack -p${DB_PASSWORD} bookstack | gzip > bookstack-migration.sql.gz
docker run --rm -v bookstack_config:/backup -v $(pwd):/target alpine tar czf /target/bookstack-config-migration.tar.gz -C /backup .
# Copiar a servidor destino
scp bookstack-*.gz usuario@servidor-destino:/tmp/
# Servidor destino
cd /tmp
gunzip < bookstack-migration.sql.gz | docker exec -i bookstack-db mariadb -u bookstack -p${DB_PASSWORD} bookstack
docker run --rm -v bookstack_config:/restore -v /tmp:/source alpine tar xzf /source/bookstack-config-migration.tar.gz -C /restore
docker restart bookstack
```
---
## Backup Remoto
### Sincronizar con S3/MinIO
```bash
#!/bin/bash
BACKUP_DIR="/backups/bookstack"
S3_BUCKET="s3://mi-bucket/bookstack/"
# Hacer backup local primero
/root/backup-bookstack.sh
# Sincronizar con S3
aws s3 sync $BACKUP_DIR $S3_BUCKET --storage-class GLACIER
# O con rclone
rclone sync $BACKUP_DIR minio:bookstack-backups
```
### Sincronizar con Rsync
```bash
#!/bin/bash
BACKUP_DIR="/backups/bookstack"
REMOTE_SERVER="backup@servidor-remoto"
REMOTE_PATH="/backups/bookstack"
# Sincronizar
rsync -avz --delete $BACKUP_DIR/ $REMOTE_SERVER:$REMOTE_PATH/
```
---
## Verificación de Backups
### Script de Verificación
```bash
#!/bin/bash
BACKUP_FILE="/backups/bookstack/bookstack-db-latest.sql.gz"
# Verificar integridad
if gunzip -t "$BACKUP_FILE" 2>/dev/null; then
echo "✓ Backup válido"
# Verificar contenido
TABLES=$(gunzip -c "$BACKUP_FILE" | grep "CREATE TABLE" | wc -l)
echo "✓ Contiene $TABLES tablas"
else
echo "✗ Backup corrupto"
exit 1
fi
```
---
## Próximos Pasos
1. **[Actualización](Actualización)** - Mantén BookStack actualizado
2. **Automatiza** - Configura cron para backups automáticos
3. **Prueba restauración** - Verifica que los backups funcionan

206
Configuración-Inicial.md Normal file

@@ -0,0 +1,206 @@
# Configuración Inicial
Pasos para configurar BookStack tras el primer despliegue.
## Primer Acceso
1. Accede a BookStack mediante tu dominio configurado
2. Login con credenciales por defecto:
- **Email**: `admin@admin.com`
- **Password**: `password`
> ⚠️ **CRÍTICO**: Estas son credenciales públicas. **Cámbialas INMEDIATAMENTE**.
### Cambiar Contraseña de Admin
1. Click en tu avatar (esquina superior derecha)
2. **Edit Profile**
3. **Change Password**
4. Ingresa contraseña nueva (mínimo 8 caracteres)
5. **Save**
---
## Configuración Básica
### Settings → Settings
Accede al panel de administración: **Settings** (engranaje superior derecho)
#### Información de la Aplicación
- **Application Name**: `Mi Wiki Corporativa`
- **Application Logo**: Sube tu logo (PNG/SVG recomendado)
- **Application Icon**: Favicon para navegador
- **Default Language**: `Español` (o tu idioma preferido)
#### Registro y Acceso
**Settings → Registration Settings**:
- **Allow public registration**: ❌ Desactivar
- **Allow public viewing**: ✅ Activar si quieres permitir lectura sin login
- **Default role for new users**: `Viewer` (solo lectura)
- **Email confirmation required**: ✅ Activar (si tienes SMTP configurado)
---
## Roles y Permisos
**Settings → Roles**
### Roles Por Defecto
BookStack incluye 3 roles:
1. **Admin**: Control total del sistema
2. **Editor**: Puede crear y editar todo el contenido
3. **Viewer**: Solo lectura
### Crear Rol Personalizado
1. **Settings****Roles****Create New Role**
2. **Role Name**: `Documentador` (ejemplo)
3. **Role Description**: Descripción del rol
#### Permisos del Sistema
- **User management**: Gestión de usuarios
- **Manage system settings**: Acceso a configuración
- **Manage users, roles & permissions**: Gestión de roles
- **Access system API**: Acceso a API REST
#### Permisos de Contenido
Para cada tipo (Books, Chapters, Pages):
- **Create**: Crear nuevo contenido
- **Edit Own**: Editar su propio contenido
- **Edit All**: Editar contenido de otros
- **Delete Own**: Eliminar su propio contenido
- **Delete All**: Eliminar contenido de otros
4. **Save Role**
---
## Crear Usuarios
**Settings → Users → Create New User**
1. **Name**: Nombre completo
2. **Email**: email@example.com
3. **Password**: Contraseña temporal (el usuario debe cambiarla)
4. **Roles**: Seleccionar rol(es)
5. **Send invite email**: ✅ Si tienes SMTP configurado
6. **Save**
---
## Organizar Contenido
### Crear tu Primer Libro
1. Click en **Books** (menú superior)
2. **Create New Book**
3. **Name**: `Manual de Usuario`
4. **Description**: Descripción breve
5. **Cover Image**: Imagen de portada (opcional)
6. **Tags**: Etiquetas para organización
7. **Save Book**
### Crear Capítulos
1. Dentro del libro, click **New Chapter**
2. **Name**: `Introducción`
3. **Description**: Resumen del capítulo
4. **Save Chapter**
### Crear Páginas
1. Dentro del capítulo (o libro), click **New Page**
2. **Name**: `Primeros Pasos`
3. Selecciona editor:
- **WYSIWYG**: Editor visual (como Word)
- **Markdown**: Sintaxis Markdown
4. Escribe contenido
5. **Save Page**
---
## Permisos Granulares
### Permisos por Libro
1. Abre el libro
2. Click en **⋮** → **Permissions**
3. **Enable Custom Permissions**: ✅ Activar
4. Selecciona roles y sus permisos:
- **View**: Ver contenido
- **Edit**: Editar contenido
- **Delete**: Eliminar contenido
5. **Save Permissions**
### Permisos por Capítulo/Página
Mismo proceso que libros. Los permisos de nivel superior se heredan, pero pueden sobreescribirse.
---
## Personalización Visual
### Settings → Customization
#### Esquema de Color
- **Color Scheme**: `Light` / `Dark`
- **Primary Color**: Color principal de la interfaz (hex: `#0288D1`)
#### HTML Head Personalizado
Añade CSS personalizado:
```html
<style>
:root {
--color-primary: #0066cc;
}
.header-links {
background-color: #0066cc;
}
</style>
```
---
## Configurar SMTP (Email)
**Settings → Settings → Email**:
```env
# Añadir al .env del contenedor
MAIL_DRIVER=smtp
MAIL_HOST=smtp.gmail.com
MAIL_PORT=587
MAIL_FROM=bookstack@example.com
MAIL_FROM_NAME="BookStack Wiki"
MAIL_USERNAME=tu@email.com
MAIL_PASSWORD=tu_password_app
MAIL_ENCRYPTION=tls
```
Reinicia el contenedor:
```bash
docker restart bookstack
```
Prueba el email:
**Settings → Maintenance → Send a Test Email**
---
## Próximos Pasos
1. **[Personalización](Personalización)** - LDAP, temas avanzados
2. **[Backup](Backup-y-Restauración)** - Automatiza backups
3. **Crea contenido** - Empieza a documentar

150
Home.md

@@ -1 +1,149 @@
¡Bienvenidos a la Wiki! # BookStack Wiki
Documentación completa para el despliegue y gestión de BookStack con Docker.
## 📑 Índice
### Inicio Rápido
- **[Home](Home)** - Esta página
- **[Generar Contraseña](#generar-contraseña)** - Antes de desplegar
### Modos de Despliegue
- **[Traefik](Traefik)** - Proxy inverso con SSL automático
- **[NPM](NPM)** - Nginx Proxy Manager
### Configuración y Uso
- **[Configuración Inicial](Configuración-Inicial)** - Primer acceso y setup
- **[Personalización](Personalización)** - LDAP, temas, configuración avanzada
- **[Backup y Restauración](Backup-y-Restauración)** - Protege tus datos
- **[Actualización](Actualización)** - Mantén BookStack actualizado
- **[Solución de Problemas](Solución-de-Problemas)** - Diagnóstico y fixes
---
## ¿Qué es BookStack?
BookStack es una **plataforma de documentación y wiki** de código abierto que organiza el contenido en una estructura jerárquica intuitiva: Libros → Capítulos → Páginas.
### Características Principales
- 📚 **Organización Jerárquica**: Libros, capítulos y páginas
- ✏️ **Editor Dual**: WYSIWYG y Markdown
- 🔍 **Búsqueda Potente**: Indexación completa del contenido
- 🔐 **Control de Acceso**: Permisos granulares por rol
- 📝 **Historial de Cambios**: Seguimiento completo de ediciones
- 🖼️ **Gestión de Imágenes**: Biblioteca de medios integrada
- 🔗 **Integración**: LDAP, SAML 2.0, OAuth (Google, GitHub, etc.)
- 🌍 **Multi-idioma**: Soporte para múltiples idiomas incluido español
### Casos de Uso
- **Documentación técnica**: Manuales, guías, procedimientos
- **Base de conocimiento**: Wiki corporativa, FAQ
- **Documentación de proyectos**: Desarrollo de software
- **Políticas y procedimientos**: Compliance, ISO, GDPR
- **Notas colaborativas**: Equipos distribuidos
---
## Inicio Rápido
### Requisitos
- Docker Engine
- Portainer (recomendado)
- Red `proxy` creada
- MariaDB 11 (incluido en el compose)
### Generar Contraseña
**ANTES de desplegar**, genera 1 contraseña segura:
```bash
# DB_PASSWORD (MariaDB)
openssl rand -base64 32
```
> ⚠️ **Importante**: Si la contraseña contiene caracteres especiales (`$`, `!`, etc.), usa comillas simples en el `.env`:
> ```env
> DB_PASSWORD='tu_password_con_$_especiales'
> ```
### Despliegue Básico
1. **Crea el stack en Portainer** con Git Repository:
- URL: `https://git.ictiberia.com/groales/bookstack`
- Compose path: `docker-compose.yml`
2. **Añade variables de entorno**:
```env
DB_PASSWORD=password_generado
```
3. **Deploy** y espera 1-2 minutos (BookStack inicializa la BD)
4. **Accede** y configura según tu proxy inverso:
- **[Traefik](Traefik)**: `https://bookstack.tudominio.com`
- **[NPM](NPM)**: Configura Proxy Host primero
- **Login**: Email `admin@admin.com` + password `password` **¡CÁMBIALO INMEDIATAMENTE!**
---
## Arquitectura
```
┌─────────────────────────────────────────────────┐
│ Traefik / NPM (Proxy) │
│ HTTPS / SSL │
└────────────────┬────────────────────────────────┘
┌─────────▼──────────┐
│ BookStack │ Puerto 80
│ (LinuxServer) │
└─────────┬──────────┘
┌─────▼──────┐
│ MariaDB │
│ 11 │
└────────────┘
(Base Datos)
```
### Componentes
- **BookStack**: Aplicación PHP Laravel (puerto 80)
- **MariaDB 11**: Base de datos MySQL
- **Proxy**: Traefik o NPM para HTTPS
### Volúmenes
- `bookstack_config`: Configuración, uploads, imágenes
- `bookstack_db`: Base de datos MariaDB
---
## Próximos Pasos
1. **Elige tu modo de despliegue**:
- [Traefik](Traefik) - Recomendado para múltiples servicios
- [NPM](NPM) - Más simple para configurar
2. **Configura BookStack**:
- [Configuración Inicial](Configuración-Inicial) - Primer acceso
- [Personalización](Personalización) - LDAP, temas, etc.
3. **Protege tus datos**:
- [Backup y Restauración](Backup-y-Restauración) - Automatiza backups
4. **Mantén actualizado**:
- [Actualización](Actualización) - BookStack y MariaDB
---
## Recursos Oficiales
- [Documentación BookStack](https://www.bookstackapp.com/docs/)
- [LinuxServer BookStack](https://docs.linuxserver.io/images/docker-bookstack)
- [BookStack GitHub](https://github.com/BookStackApp/BookStack)
- [Demo BookStack](https://demo.bookstackapp.com/)
- [API Docs](https://demo.bookstackapp.com/api/docs)

99
NPM.md Normal file

@@ -0,0 +1,99 @@
# Despliegue con NPM
Guía para desplegar BookStack con Nginx Proxy Manager.
## Requisitos
- NPM desplegado y accesible
- Red Docker `proxy` creada
- DNS apuntando al servidor
---
## Pasos de Despliegue
### 1. Desplegar BookStack
En Portainer, crea el stack **sin archivo override** (solo `docker-compose.yml`):
**Variables de entorno**:
```env
DB_PASSWORD=password_generado
```
> ⚠️ **No añadas** `DOMAIN_HOST` - Solo se usa con Traefik
### 2. Configurar Proxy Host en NPM
1. Accede a NPM (ej: `https://npm.tudominio.com`)
2. Ve a **Hosts****Proxy Hosts****Add Proxy Host**
#### Pestaña Details
- **Domain Names**: `bookstack.tudominio.com`
- **Scheme**: `http`
- **Forward Hostname / IP**: `bookstack`
- **Forward Port**: `80`
-**Cache Assets**: Activado
-**Block Common Exploits**: Activado
-**Websockets Support**: Activado
#### Pestaña SSL
- **SSL Certificate**: `Request a new SSL Certificate`
- **Email**: tu@email.com
-**Force SSL**: Activado
-**HTTP/2 Support**: Activado
-**HSTS Enabled**: Activado (opcional)
3. **Save**
### 3. Verificar
- Accede a `https://bookstack.tudominio.com`
- Verifica el certificado SSL (candado verde)
- Login con `admin@admin.com` / `password`
- **Cambia la contraseña inmediatamente**
---
## Comparativa Traefik vs NPM
| Aspecto | Traefik | NPM |
|---------|---------|-----|
| **Configuración** | Labels en compose | UI web |
| **SSL** | Automático | Manual por dominio |
| **Dificultad** | Media | Fácil |
| **Renovación SSL** | Automática | Automática |
| **Multi-dominio** | Excelente | Bueno |
| **Recomendado para** | Múltiples servicios | Pocos servicios |
---
## Troubleshooting
### Error 502 Bad Gateway
**Verificar**:
```bash
# BookStack corriendo
docker ps | grep bookstack
# BookStack en red proxy
docker inspect bookstack | grep -A 5 Networks
```
### Certificado SSL falla
**Soluciones**:
- Verificar DNS apunta correctamente
- Intentar con DNS Challenge si puertos 80/443 bloqueados
- Regenerar certificado en NPM UI
---
## Próximos Pasos
1. **[Configuración Inicial](Configuración-Inicial)** - Configurar BookStack
2. **[Personalización](Personalización)** - LDAP, temas
3. **[Backup](Backup-y-Restauración)** - Automatiza backups

264
Personalización.md Normal file

@@ -0,0 +1,264 @@
# Personalización
Configuración avanzada de BookStack: LDAP, temas, plugins y más.
## Autenticación LDAP
### Configurar LDAP/Active Directory
Añade estas variables al `.env`:
```env
# LDAP Básico
AUTH_METHOD=ldap
LDAP_SERVER=ldap://ldap.example.com:389
LDAP_BASE_DN=dc=example,dc=com
LDAP_DN=cn=bookstack,ou=Services,dc=example,dc=com
LDAP_PASS=password_ldap
LDAP_USER_FILTER=(&(uid=${user}))
LDAP_VERSION=3
# Mapeo de Atributos
LDAP_ID_ATTRIBUTE=uid
LDAP_EMAIL_ATTRIBUTE=mail
LDAP_DISPLAY_NAME_ATTRIBUTE=cn
# Sincronización de Grupos (opcional)
LDAP_USER_TO_GROUPS=true
LDAP_GROUP_ATTRIBUTE=memberOf
LDAP_REMOVE_FROM_GROUPS=true
```
Reinicia:
```bash
docker restart bookstack
```
### Active Directory
```env
AUTH_METHOD=ldap
LDAP_SERVER=ldap://dc.example.com:389
LDAP_BASE_DN=dc=example,dc=com
LDAP_DN=CN=BookStack,OU=Service Accounts,DC=example,DC=com
LDAP_PASS=password
LDAP_USER_FILTER=(&(sAMAccountName=${user})(objectClass=user))
LDAP_VERSION=3
LDAP_ID_ATTRIBUTE=sAMAccountName
LDAP_EMAIL_ATTRIBUTE=mail
LDAP_DISPLAY_NAME_ATTRIBUTE=displayName
```
---
## SAML 2.0
### Configurar SAML con ADFS
```env
AUTH_METHOD=saml2
SAML2_NAME=ADFS
SAML2_EMAIL_ATTRIBUTE=email
SAML2_DISPLAY_NAME_ATTRIBUTES=name
SAML2_EXTERNAL_ID_ATTRIBUTE=uid
SAML2_IDP_ENTITYID=https://adfs.example.com/adfs/services/trust
SAML2_IDP_SSO=https://adfs.example.com/adfs/ls/
SAML2_IDP_SLO=https://adfs.example.com/adfs/ls/
SAML2_AUTOLOAD_METADATA=true
```
---
## OAuth (Google, GitHub, GitLab)
### Google OAuth
1. Crea aplicación OAuth en [Google Cloud Console](https://console.cloud.google.com/)
2. Añade al `.env`:
```env
AUTH_METHOD=google
GOOGLE_APP_ID=tu-client-id.apps.googleusercontent.com
GOOGLE_APP_SECRET=tu-client-secret
GOOGLE_SELECT_ACCOUNT=true
```
### GitHub OAuth
```env
AUTH_METHOD=github
GITHUB_APP_ID=tu-client-id
GITHUB_APP_SECRET=tu-client-secret
```
### GitLab OAuth
```env
AUTH_METHOD=gitlab
GITLAB_APP_ID=tu-application-id
GITLAB_APP_SECRET=tu-secret
GITLAB_BASE_URI=https://gitlab.example.com
```
---
## Temas Personalizados
### CSS Personalizado
**Settings → Customization → Custom HTML Head Content**:
```html
<style>
/* Tema oscuro personalizado */
:root {
--color-primary: #1e88e5;
--color-primary-light: #64b5f6;
--color-link: #42a5f5;
}
/* Header personalizado */
.header {
background: linear-gradient(90deg, #1e3c72 0%, #2a5298 100%);
}
/* Logo más grande */
.logo-image {
max-height: 50px;
}
/* Ocultar "Powered by BookStack" */
.text-muted {
display: none;
}
</style>
```
### JavaScript Personalizado
```html
<script>
// Añadir mensaje de bienvenida
document.addEventListener('DOMContentLoaded', function() {
console.log('Wiki Corporativa - Documentación Técnica');
});
</script>
```
---
## Comandos Útiles
### Acceder al Contenedor
```bash
# Shell
docker exec -it bookstack bash
# Ver comandos artisan disponibles
docker exec bookstack php artisan list
```
### Limpiar Caché
```bash
# Caché de aplicación
docker exec bookstack php artisan cache:clear
# Caché de configuración
docker exec bookstack php artisan config:clear
# Caché de vistas
docker exec bookstack php artisan view:clear
# Todo a la vez
docker exec bookstack php artisan optimize:clear
```
### Regenerar Índice de Búsqueda
```bash
docker exec bookstack php artisan bookstack:regenerate-search
```
### Limpiar Sesiones Antiguas
```bash
docker exec bookstack php artisan bookstack:cleanup-sessions
```
---
## API REST
### Habilitar API
**Settings → Settings → Enable API**
### Crear Token de API
1. **Settings → Users** → Selecciona usuario
2. **API Tokens****Create Token**
3. **Token Name**: `Script de Backup`
4. **Expiry Date**: Fecha de expiración (opcional)
5. **Save** y copia el token
### Ejemplo de Uso
```bash
# Listar libros
curl -H "Authorization: Token tu_token_aqui" \
https://bookstack.example.com/api/books
# Crear página
curl -X POST \
-H "Authorization: Token tu_token_aqui" \
-H "Content-Type: application/json" \
-d '{"book_id": 1, "chapter_id": 1, "name": "Nueva Página", "html": "<p>Contenido</p>"}' \
https://bookstack.example.com/api/pages
```
Documentación completa: `https://bookstack.example.com/api/docs`
---
## Integración con Herramientas
### Ansible
```yaml
- name: Crear página en BookStack
uri:
url: "https://bookstack.example.com/api/pages"
method: POST
headers:
Authorization: "Token {{ bookstack_token }}"
body_format: json
body:
book_id: 1
name: "Documentación Ansible"
html: "<p>Generado por Ansible</p>"
```
### Python
```python
import requests
headers = {'Authorization': 'Token tu_token_aqui'}
url = 'https://bookstack.example.com/api/books'
response = requests.get(url, headers=headers)
books = response.json()
for book in books['data']:
print(f"{book['id']}: {book['name']}")
```
---
## Próximos Pasos
1. **[Backup](Backup-y-Restauración)** - Automatiza backups
2. **[Actualización](Actualización)** - Mantén BookStack actualizado
3. **Explora la API** - `https://bookstack.example.com/api/docs`

355
Solución-de-Problemas.md Normal file

@@ -0,0 +1,355 @@
# Solución de Problemas
Diagnóstico y resolución de problemas comunes en BookStack.
## Diagnóstico General
### Ver Logs
```bash
# Logs de BookStack
docker logs bookstack --tail 100 -f
# Logs de MariaDB
docker logs bookstack-db --tail 50
# Logs del stack completo
docker compose logs -f
```
### Verificar Estado
```bash
# Estado de contenedores
docker ps -a | grep bookstack
# Uso de recursos
docker stats bookstack bookstack-db --no-stream
# Redes
docker network inspect bookstack-internal
docker network inspect proxy
```
---
## Problemas Comunes
### BookStack No Inicia
**Síntomas**: Contenedor se reinicia constantemente
**Diagnóstico**:
```bash
docker logs bookstack | grep -i error
docker logs bookstack | grep -i fatal
```
**Causas comunes**:
1. **MariaDB no está listo**
```bash
docker logs bookstack-db
docker exec bookstack-db mariadb -u bookstack -p${DB_PASSWORD} -e "SELECT 1"
```
**Solución**: Esperar o reiniciar MariaDB
```bash
docker restart bookstack-db
sleep 15
docker restart bookstack
```
2. **Permisos incorrectos**
```bash
docker exec bookstack ls -la /config
```
**Solución**:
```bash
docker run --rm -v bookstack_config:/config alpine chown -R 1000:1000 /config
docker restart bookstack
```
3. **APP_URL incorrecta**
**Síntomas**: Redireccionamientos rotos, CSS no carga
**Verificar**:
```bash
docker exec bookstack cat /config/www/.env | grep APP_URL
```
**Solución**: Debe coincidir con tu dominio
```bash
# En docker-compose.yml
APP_URL: https://bookstack.tudominio.com
```
### Error de Conexión a Base de Datos
**Síntomas**:
```
SQLSTATE[HY000] [2002] Connection refused
SQLSTATE[HY000] [1045] Access denied
```
**Soluciones**:
```bash
# Verificar que MariaDB está corriendo
docker ps | grep bookstack-db
# Verificar password en .env
cat .env | grep DB_PASSWORD
# Verificar conexión desde BookStack
docker exec bookstack ping bookstack-db
# Resetear conexión
docker restart bookstack-db
sleep 15
docker restart bookstack
```
### Error 502 Bad Gateway (NPM/Traefik)
**Síntomas**: Proxy no puede conectar con BookStack
**Diagnóstico**:
```bash
# Verificar que BookStack está corriendo
docker ps | grep bookstack
# Verificar puerto 80
docker exec bookstack netstat -tlnp | grep 80
# Verificar desde proxy
docker exec npm ping bookstack
```
**Soluciones**:
- Verificar que BookStack está en red `proxy`
- Verificar que el contenedor se llama `bookstack`
- Reiniciar BookStack: `docker restart bookstack`
### Lentitud Extrema
**Diagnóstico**:
```bash
# Ver uso de CPU/RAM
docker stats bookstack bookstack-db
# Ver queries lentas en MariaDB
docker exec bookstack-db mariadb -u bookstack -p${DB_PASSWORD} -e "SHOW FULL PROCESSLIST;"
```
**Soluciones**:
1. **Limpiar caché**
```bash
docker exec bookstack php artisan cache:clear
docker exec bookstack php artisan config:clear
docker exec bookstack php artisan view:clear
docker restart bookstack
```
2. **Optimizar MariaDB**
```bash
docker exec bookstack-db mariadb-optimize -u bookstack -p${DB_PASSWORD} bookstack
```
3. **Regenerar índice de búsqueda**
```bash
docker exec bookstack php artisan bookstack:regenerate-search
```
### Error LDAP
**Síntomas**:
```
LDAP bind failed
Could not connect to LDAP server
```
**Diagnóstico**:
```bash
# Ver configuración LDAP
docker exec bookstack cat /config/www/.env | grep LDAP
# Probar conexión LDAP
docker exec bookstack ldapsearch -x -H ldap://ldap.example.com -D "cn=bookstack,ou=Services,dc=example,dc=com" -W -b "dc=example,dc=com" "(uid=usuario)"
```
**Soluciones**:
- Verificar `LDAP_SERVER`, `LDAP_DN`, `LDAP_PASS`
- Verificar firewall permite conexión a puerto 389/636
- Probar con `ldapsearch` desde el contenedor
### Imágenes No Cargan
**Síntomas**: Imágenes rotas, error 404
**Diagnóstico**:
```bash
# Ver directorio de uploads
docker exec bookstack ls -la /config/www/uploads
# Ver permisos
docker exec bookstack stat /config/www/uploads
```
**Soluciones**:
```bash
# Corregir permisos
docker exec bookstack chown -R abc:abc /config/www/uploads
docker exec bookstack chmod -R 755 /config/www/uploads
# Verificar APP_URL correcto
docker exec bookstack cat /config/www/.env | grep APP_URL
```
---
## Comandos de Emergencia
### Reiniciar Todo
```bash
docker restart bookstack bookstack-db
```
### Recrear BookStack (Mantiene Datos)
```bash
docker stop bookstack
docker rm bookstack
docker compose up -d bookstack
```
### Acceso de Emergencia
```bash
# Shell de BookStack
docker exec -it bookstack bash
# Shell de Laravel (artisan tinker)
docker exec -it bookstack php artisan tinker
# Ejemplo: resetear password de admin
>>> $user = \BookStack\Auth\User::where('email', 'admin@admin.com')->first();
>>> $user->password = bcrypt('nuevapassword');
>>> $user->save();
```
### Resetear Password de Admin
```bash
docker exec bookstack php artisan bookstack:create-admin --email=admin@admin.com
```
### Limpiar Todo el Caché
```bash
docker exec bookstack php artisan optimize:clear
docker restart bookstack
```
---
## Recuperación de Desastres
### BookStack Corrupto - Restaurar desde Backup
```bash
# 1. Detener todo
docker stop bookstack bookstack-db
# 2. Restaurar BD
gunzip < /backups/bookstack/bookstack-backup-FECHA.sql.gz | docker exec -i bookstack-db mariadb -u bookstack -p${DB_PASSWORD} bookstack
# 3. Restaurar config
docker run --rm -v bookstack_config:/restore -v /backups/bookstack:/source alpine tar xzf /source/bookstack-config-FECHA.tar.gz -C /restore
# 4. Iniciar todo
docker start bookstack-db
sleep 15
docker start bookstack
```
### MariaDB Corrupto
```bash
# Intentar reparar
docker exec bookstack-db mariadb-check -u bookstack -p${DB_PASSWORD} --auto-repair bookstack
# Si falla, restaurar desde backup
docker stop bookstack-db
docker volume rm bookstack_db
docker volume create bookstack_db
docker start bookstack-db
sleep 20
gunzip < bookstack-backup.sql.gz | docker exec -i bookstack-db mariadb -u bookstack -p${DB_PASSWORD} bookstack
```
---
## Obtener Ayuda
### Información del Sistema
```bash
# Versión de BookStack
docker exec bookstack php artisan --version
# Versión de PHP
docker exec bookstack php --version
# Versión de MariaDB
docker exec bookstack-db mariadb --version
# Variables de entorno
docker exec bookstack env | grep -E "DB_|APP_|LDAP_"
# Compose usado
docker inspect bookstack | grep -A 20 Labels
```
### Recursos Oficiales
- [BookStack Discussions](https://github.com/BookStackApp/BookStack/discussions)
- [BookStack Discord](https://discord.gg/ztkBqR2)
- [LinuxServer Support](https://discourse.linuxserver.io/)
- [Stack Overflow](https://stackoverflow.com/questions/tagged/bookstack)
---
## Prevención
### Monitorización
```bash
# Script de health check
#!/bin/bash
if docker exec bookstack curl -f http://localhost > /dev/null 2>&1; then
echo "✓ BookStack OK"
else
echo "✗ BookStack DOWN"
docker logs bookstack --tail 50
fi
```
### Alertas
Configura alertas en tu sistema de monitorización:
- CPU > 80%
- RAM > 90%
- Disco > 85%
- BookStack no responde
---
## Próximos Pasos
1. **[Backup](Backup-y-Restauración)** - Automatiza backups para prevenir desastres
2. **[Actualización](Actualización)** - Mantén BookStack actualizado
3. **[Comunidad](https://github.com/BookStackApp/BookStack/discussions)** - Pregunta si no encuentras solución

244
Traefik.md Normal file

@@ -0,0 +1,244 @@
# Despliegue con Traefik
Guía para desplegar BookStack con Traefik como proxy inverso.
## Requisitos
- Stack de Traefik desplegado y funcionando
- Red Docker `proxy` creada
- DNS apuntando al servidor
- Contraseña de BD generada
---
## Despliegue desde Portainer
### 1. Configurar Variables
En Portainer, al crear el stack con **Git Repository**, configura:
**Environment variables**:
```env
# Contraseña (generada previamente)
DB_PASSWORD=tu_password_generado
# Base de datos (valores por defecto)
DB_NAME=bookstack
DB_USER=bookstack
# ⚠️ IMPORTANTE para Traefik
DOMAIN_HOST=bookstack.tudominio.com
```
### 2. Subir Archivo Override
En Portainer, en la sección **Additional paths**:
- Añade: `docker-compose.override.traefik.yml.example`
O si usas **Web editor**, añade las labels manualmente al servicio `bookstack`.
### 3. Desplegar
Click en **Deploy the stack** y espera 1-2 minutos.
### 4. Verificar
- Accede a `https://bookstack.tudominio.com`
- Verifica certificado SSL (candado verde)
- Login con `admin@admin.com` / `password`
- **Cambia la contraseña inmediatamente**
---
## Labels de Traefik
El archivo `docker-compose.override.traefik.yml.example` contiene:
```yaml
services:
bookstack:
labels:
# Habilitar Traefik
- traefik.enable=true
# Router HTTP (redirige a HTTPS)
- traefik.http.routers.bookstack-http.rule=Host(`${DOMAIN_HOST}`)
- traefik.http.routers.bookstack-http.entrypoints=web
- traefik.http.routers.bookstack-http.middlewares=redirect-to-https
# Router HTTPS
- traefik.http.routers.bookstack.rule=Host(`${DOMAIN_HOST}`)
- traefik.http.routers.bookstack.entrypoints=websecure
- traefik.http.routers.bookstack.tls=true
- traefik.http.routers.bookstack.tls.certresolver=letsencrypt
- traefik.http.routers.bookstack.service=bookstack-svc
- traefik.http.services.bookstack-svc.loadbalancer.server.port=80
# Redirect middleware
- traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https
- traefik.http.middlewares.redirect-to-https.redirectscheme.permanent=true
```
### Explicación de Labels
| Label | Propósito |
|-------|-----------|
| `traefik.enable=true` | Activa Traefik para este contenedor |
| `Host(\`${DOMAIN_HOST}\`)` | Dominio que responde |
| `entrypoints=web` | Puerto 80 (HTTP) |
| `entrypoints=websecure` | Puerto 443 (HTTPS) |
| `tls.certresolver=letsencrypt` | Solicita certificado SSL automático |
| `loadbalancer.server.port=80` | Puerto interno del contenedor |
| `redirect-to-https` | Middleware para forzar HTTPS |
---
## Compose Completo con Traefik
```yaml
services:
bookstack:
container_name: bookstack
image: lscr.io/linuxserver/bookstack:latest
restart: unless-stopped
environment:
PUID: 1000
PGID: 1000
TZ: Europe/Madrid
APP_URL: https://${DOMAIN_HOST:-bookstack.example.com}
DB_HOST: bookstack-db
DB_PORT: 3306
DB_DATABASE: ${DB_NAME:-bookstack}
DB_USERNAME: ${DB_USER:-bookstack}
DB_PASSWORD: ${DB_PASSWORD}
volumes:
- bookstack_config:/config
networks:
- proxy
- bookstack-internal
depends_on:
- bookstack-db
labels:
- traefik.enable=true
- traefik.http.routers.bookstack-http.rule=Host(`${DOMAIN_HOST}`)
- traefik.http.routers.bookstack-http.entrypoints=web
- traefik.http.routers.bookstack-http.middlewares=redirect-to-https
- traefik.http.routers.bookstack.rule=Host(`${DOMAIN_HOST}`)
- traefik.http.routers.bookstack.entrypoints=websecure
- traefik.http.routers.bookstack.tls=true
- traefik.http.routers.bookstack.tls.certresolver=letsencrypt
- traefik.http.routers.bookstack.service=bookstack-svc
- traefik.http.services.bookstack-svc.loadbalancer.server.port=80
- traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https
- traefik.http.middlewares.redirect-to-https.redirectscheme.permanent=true
bookstack-db:
container_name: bookstack-db
image: mariadb:11-alpine
restart: unless-stopped
environment:
MYSQL_DATABASE: ${DB_NAME:-bookstack}
MYSQL_USER: ${DB_USER:-bookstack}
MYSQL_PASSWORD: ${DB_PASSWORD}
MYSQL_RANDOM_ROOT_PASSWORD: 'yes'
volumes:
- bookstack_db:/var/lib/mysql
networks:
- bookstack-internal
volumes:
bookstack_config:
name: bookstack_config
bookstack_db:
name: bookstack_db
networks:
proxy:
external: true
bookstack-internal:
name: bookstack-internal
```
---
## Troubleshooting
### Certificado no se genera
**Verificar**:
```bash
# Logs de Traefik
docker logs traefik | grep bookstack
docker logs traefik | grep -i acme
# DNS correcto
nslookup bookstack.tudominio.com
```
**Soluciones**:
- Verificar que `DOMAIN_HOST` está configurado
- DNS debe apuntar correctamente al servidor
- Puertos 80 y 443 abiertos en firewall
- Esperar 1-2 minutos para que Let's Encrypt valide
### Error 404 Not Found
**Causa**: Traefik no encuentra el contenedor
**Verificar**:
```bash
# BookStack está en red proxy
docker inspect bookstack | grep -A 5 Networks
# Labels están aplicados
docker inspect bookstack | grep -A 20 Labels
```
### Error 502 Bad Gateway
**Causa**: BookStack no responde
**Soluciones**:
```bash
# Ver estado de BookStack
docker logs bookstack
# Verificar que MariaDB está lista
docker exec bookstack-db mariadb -u bookstack -p${DB_PASSWORD} -e "SELECT 1"
# Reiniciar
docker restart bookstack-db
sleep 10
docker restart bookstack
```
---
## Configuración Avanzada
### Headers de Seguridad
Añade headers adicionales con middleware:
```yaml
labels:
- traefik.http.routers.bookstack.middlewares=bookstack-headers
- traefik.http.middlewares.bookstack-headers.headers.customResponseHeaders.X-Robots-Tag=none
- traefik.http.middlewares.bookstack-headers.headers.sslProxyHeaders.X-Forwarded-Proto=https
```
### Limitar Acceso por IP
```yaml
labels:
- traefik.http.routers.bookstack.middlewares=bookstack-ipwhitelist
- traefik.http.middlewares.bookstack-ipwhitelist.ipwhitelist.sourcerange=192.168.1.0/24,10.0.0.0/8
```
---
## Próximos Pasos
1. **[Configuración Inicial](Configuración-Inicial)** - Configurar BookStack
2. **[Personalización](Personalización)** - LDAP, temas
3. **[Backup](Backup-y-Restauración)** - Automatiza backups

17
_Sidebar.md Normal file

@@ -0,0 +1,17 @@
## BookStack Wiki
### 🚀 Inicio
- [Home](Home)
### 📦 Despliegue
- [Traefik](Traefik)
- [NPM](NPM)
### ⚙️ Configuración
- [Configuración Inicial](Configuración-Inicial)
- [Personalización](Personalización)
### 💾 Mantenimiento
- [Backup y Restauración](Backup-y-Restauración)
- [Actualización](Actualización)
- [Solución de Problemas](Solución-de-Problemas)