Wiki.js autohospedada sobre Docker — un stack productivo de tres servicios (app + base de datos + reverse proxy) con Linux endurecido, copias de seguridad automaticas y monitorizacion.
Proyecto final de la FCT del ciclo ASIR (Administracion de Sistemas Informaticos en Red). Integra de forma practica casi todos los modulos del ciclo: sistemas, redes, virtualizacion, bases de datos, seguridad y administracion de servicios.
El stack corriendo en la VM: tres contenedores (dos con healthcheck), las dos redes internas aisladas y los volumenes persistentes.
Un despliegue completo y reproducible de Wiki.js pensado para una VM Linux o cualquier maquina con Docker. Levanta una wiki lista para usar con un solo comando, detras de un reverse proxy y con la base de datos aislada de Internet.
Pensado como pieza de portfolio: cada decision esta justificada y documentada.
- 🐳 Docker Compose multi-servicio — 3 contenedores, 2 redes internas
(la BD no es alcanzable desde el reverse proxy ni desde fuera), volumenes
nombrados persistentes, healthchecks y arranque ordenado con
depends_on: service_healthy. - 🔒 Seguridad — secretos en
.env(fuera del repo), minima superficie de exposicion (solo nginx publica puerto). En la VM real: SSH solo-clave, UFW y Fail2Ban (documentado abajo). - 💾 Operacion automatizada — backup diario de BD + datos con retencion, monitorizacion de contenedores por cron, y procedimiento de restauracion probado.
- 📦 Infraestructura reproducible —
git clone+docker-compose upy funciona; sin pasos manuales ocultos.
El proyecto pone en practica, de forma integrada, los principales modulos del ciclo de Administracion de Sistemas Informaticos en Red:
| Modulo del ciclo | Como aparece en el proyecto |
|---|---|
| Implantacion de SO | VM Debian 13, particiones, usuarios, gestion de servicios systemd. |
| Administracion de SO | Hardening, gestion de paquetes, cron, scripting Bash, permisos. |
| Planificacion y administracion de redes | IP estatica, segmentacion en redes Docker, reverse proxy. |
| Servicios de red e Internet | DNS interno (BIND9), Nginx como proxy inverso, HTTP/HTTPS. |
| Gestion de bases de datos | PostgreSQL 17: despliegue, pg_dump, restauracion, retencion. |
| Implantacion de aplicaciones web | Wiki.js (Node.js) desplegada y servida en produccion. |
| Seguridad y alta disponibilidad | SSH solo-clave, UFW, Fail2Ban, secretos, backups, healthchecks, restart policies. |
| Virtualizacion / contenedores | VM en Proxmox + stack en Docker Compose con volumenes y redes. |
Perfil: administracion de sistemas y redes con base en virtualizacion, contenedores y automatizacion — orientado a roles de sysadmin, tecnico de sistemas/redes o junior DevOps/Cloud.
navegador ──HTTP:80──▶ [ nginx ]──proxy──▶ [ wiki ]──5432──▶ [ postgres ]
frontend front+back backend
│ │ │
(unico puerto wiki_data db_data
publicado) (volumen) (volumen)
backend:wiki↔postgres. Por aqui viaja el trafico de base de datos.frontend:nginx↔wiki. Por aqui haceproxy_passel reverse proxy.postgresno esta enfrontend→ aislada del proxy y de Internet.- Solo
nginxpublica un puerto (80) al host.
| Servicio | Imagen | Rol |
|---|---|---|
db |
postgres:17-alpine |
Base de datos (todo el contenido de la wiki). |
wiki |
requarks/wiki:2 |
Aplicacion Wiki.js (Node.js). |
nginx |
nginx:1.27-alpine |
Reverse proxy, unico expuesto. |
Necesitas Docker y Docker Compose. En cualquier maquina:
git clone https://github.com/DannyRuizB/wikijs-zataca.git
cd wikijs-zataca
# 1) Credenciales: copia la plantilla y pon una password fuerte
cp .env.example .env
sed -i "s/changeme/$(openssl rand -hex 16)/" .env # o editala a mano
# 2) Levanta el stack
docker-compose up -d # (o `docker compose up -d` segun tu version)
# 3) Abre la wiki y completa el asistente inicial
# http://localhostEso es todo: en menos de un minuto tienes Wiki.js corriendo en
http://localhost. Para pararlo, docker-compose down (conserva los datos).
Nota: el primer arranque descarga las imagenes de Docker Hub (requiere salida a Internet). En el laboratorio original el DNS externo estaba bloqueado y se cargaban a mano; eso no aplica en una maquina normal.
wikijs-zataca/
├── docker-compose.yml # 3 servicios + 2 redes + volumenes
├── .env.example # plantilla de variables (sin secretos)
├── nginx/
│ └── default.conf # reverse proxy -> wiki:3000 (server_name catch-all)
├── scripts/
│ ├── reset-pass.sh # reset de password del admin (bcrypt + psql)
│ ├── backup-wikijs.sh # backup: dump BD + datos del wiki + retencion
│ ├── monitor-wikijs.sh # vigilancia de los 3 contenedores (cron */5)
│ └── wikijs.cron # crontab de ejemplo
├── .gitignore
├── LICENSE # MIT
└── README.md
docker-compose ps # estado de los contenedores
docker-compose logs -f wiki # logs en vivo
docker-compose restart wiki # reiniciar un servicio
docker-compose down # parar conservando datos
docker-compose down -v # DESTRUCTIVO: borra BD y uploadsDos scripts en scripts/ cubren la operacion (no requieren sudo si el
usuario esta en el grupo docker):
./scripts/backup-wikijs.sh # dump BD + tar de datos, en /opt/wikijs/backups
./scripts/monitor-wikijs.sh # comprueba los 3 contenedoresbackup-wikijs.shvuelca la BD conpg_dump(las credenciales se toman de dentro del contenedor, no del.env) adb-FECHA.sql.gz, y empaqueta/wiki/dataawiki_data-FECHA.tar.gz. Retencion de 7 dias y log.monitor-wikijs.shalerta enmonitor.logsi algun contenedor cae (sin reiniciar, para no enmascarar fallos).
Automatizacion con wikijs.cron (crontab scripts/wikijs.cron):
30 3 * * * /opt/wikijs/backups/backup-wikijs.sh >/dev/null 2>>/opt/wikijs/backups/backup.log
*/5 * * * * /opt/wikijs/backups/monitor-wikijs.sh >/dev/null 2>>/opt/wikijs/backups/monitor.log# Base de datos (DESTRUCTIVO sobre la actual; el dump incluye --clean --if-exists)
zcat backups/db-FECHA.sql.gz | docker exec -i wikijs-db sh -c 'psql -U "$POSTGRES_USER" -d "$POSTGRES_DB"'
# Datos del wiki
zcat backups/wiki_data-FECHA.tar.gz | docker exec -i wikijs-app tar xzf - -C /wiki/dataPara validar un backup sin tocar produccion, restauralo a una BD temporal (
createdb wiki_restore_test, restaurar, comprobar,dropdb).
./scripts/reset-pass.sh # pide email y password por teclado
./scripts/reset-pass.sh admin@ejemplo # o pasa el email como argumentoRegenera el hash bcrypt dentro del contenedor del wiki y lo aplica a la BD; valida que el usuario existe antes de tocar nada.
En la VM del laboratorio el stack corre detras de:
| Capa | Configuracion |
|---|---|
| SSH | solo clave, PermitRootLogin no, PasswordAuthentication no |
| Firewall | UFW deny incoming + allow 22, 80, 443/tcp |
| Fail2Ban | jail sshd, banaction=ufw, bantime 1h, maxretry 5 |
| Secretos | .env con chmod 600, propiedad de root |
Proyecto final de la FCT (Formacion en Centros de Trabajo) del ciclo superior de ASIR — Administracion de Sistemas Informaticos en Red, realizado en Zataca (Elche, curso 2025/2026). La documentacion tecnica completa (arquitectura, instalacion, operacion, troubleshooting) vive en la wiki del curso.
MIT — ver LICENSE.
