Interfaz Web
Rol de la interfaz web
La interfaz web es el plano de control visual de BunkerWeb. Administra servicios, ajustes globales, bloqueos, plugins, trabajos, caché, registros y actualizaciones sin usar la CLI. Es una app Flask servida por Gunicorn y normalmente se coloca detrás de un reverse proxy BunkerWeb.
Manténla detrás de BunkerWeb
La UI puede cambiar configuración, ejecutar trabajos y desplegar fragmentos personalizados. Ubícala en una red de confianza, enrútala mediante BunkerWeb y protégela con credenciales fuertes y 2FA.
Datos rápidos
- Escucha por defecto:
0.0.0.0:7000en contenedores,127.0.0.1:7000en paquetes (cambia conUI_LISTEN_ADDR/UI_LISTEN_PORT) - Consciente de reverse proxy: respeta
X-Forwarded-*viaUI_FORWARDED_ALLOW_IPS; ajustaPROXY_NUMBERSsi varios proxies agregan cabeceras - Auth: cuenta admin local (política de contraseña aplicada), roles opcionales, 2FA TOTP con
TOTP_ENCRYPTION_KEYS - Sesiones: firmadas con
FLASK_SECRET, vida útil por defecto 12 h, fijadas a IP y User-Agent;ALWAYS_REMEMBERcontrola cookies persistentes - Logs:
/var/log/bunkerweb/ui.log(+ access log si se captura), UID/GID 101 dentro del contenedor - Salud:
GET /healthcheckopcional siENABLE_HEALTHCHECK=yes - Dependencias: comparte la base de datos de BunkerWeb y habla con la API para recargar, bloquear o consultar instancias
Checklist de seguridad
- Ejecuta la UI detrás de BunkerWeb en una red interna; usa un
REVERSE_PROXY_URLdifícil de adivinar y limita IPs de origen. - Establece
ADMIN_USERNAME/ADMIN_PASSWORDfuertes; usaOVERRIDE_ADMIN_CREDS=yessolo cuando quieras forzar un reseteo. - Proporciona
TOTP_ENCRYPTION_KEYSy habilita TOTP en cuentas admin; guarda los códigos de recuperación. - Usa TLS (terminado en BunkerWeb o
UI_SSL_ENABLED=yescon rutas de cert/clave); fijaUI_FORWARDED_ALLOW_IPSa proxies de confianza. - Persiste secretos: monta
/var/lib/bunkerwebpara conservarFLASK_SECRET, llaves Biscuit y material TOTP entre reinicios. - Mantén
CHECK_PRIVATE_IP=yes(por defecto) para ligar sesiones a la IP; dejaALWAYS_REMEMBER=nosalvo que requieras cookies largas. - Asegura que
/var/log/bunkerwebsea legible por UID/GID 101 (o el UID mapeado en rootless) para que la UI pueda leer logs.
Puesta en marcha
La UI requiere scheduler/API de BunkerWeb/redis/base de datos accesibles.
Usa las imágenes publicadas y el layout del guía rápida para levantar el stack, luego completa el asistente en el navegador.
docker compose -f https://raw.githubusercontent.com/bunkerity/bunkerweb/v1.6.7-rc1/misc/integrations/docker-compose.yml up -d
Visita el hostname del scheduler (ej. https://www.example.com/changeme) y ejecuta el asistente /setup para configurar la UI, el scheduler y la instancia.
Omite el asistente precargando credenciales y red; ejemplo Compose con sidecar syslog:
x-service-env: &service-env
DATABASE_URI: "mariadb+pymysql://bunkerweb:changeme@bw-db:3306/db"
LOG_TYPES: "stderr syslog"
LOG_SYSLOG_ADDRESS: "udp://bw-syslog:514"
services:
bunkerweb:
image: bunkerity/bunkerweb:1.6.7
ports:
- "80:8080/tcp"
- "443:8443/tcp"
- "443:8443/udp"
environment:
API_WHITELIST_IP: "127.0.0.0/24 10.20.30.0/24"
restart: "unless-stopped"
networks: [bw-universe, bw-services]
bw-scheduler:
image: bunkerity/bunkerweb-scheduler:1.6.7
environment:
<<: *service-env
BUNKERWEB_INSTANCES: "bunkerweb"
SERVER_NAME: "www.example.com"
MULTISITE: "yes"
API_WHITELIST_IP: "127.0.0.0/24 10.20.30.0/24"
ACCESS_LOG_1: "syslog:server=bw-syslog:514,tag=bunkerweb_access"
ERROR_LOG_1: "syslog:server=bw-syslog:514,tag=bunkerweb"
DISABLE_DEFAULT_SERVER: "yes"
www.example.com_USE_TEMPLATE: "ui"
www.example.com_USE_REVERSE_PROXY: "yes"
www.example.com_REVERSE_PROXY_URL: "/changeme"
www.example.com_REVERSE_PROXY_HOST: "http://bw-ui:7000"
volumes:
- bw-storage:/data
restart: "unless-stopped"
networks: [bw-universe, bw-db]
bw-ui:
image: bunkerity/bunkerweb-ui:1.6.7
environment:
<<: *service-env
ADMIN_USERNAME: "admin"
ADMIN_PASSWORD: "Str0ng&P@ss!"
TOTP_ENCRYPTION_KEYS: "set-me"
UI_FORWARDED_ALLOW_IPS: "10.20.30.0/24"
volumes:
- bw-logs:/var/log/bunkerweb
restart: "unless-stopped"
networks: [bw-universe, bw-db]
bw-db:
image: mariadb:11
command: --max-allowed-packet=67108864
environment:
MYSQL_RANDOM_ROOT_PASSWORD: "yes"
MYSQL_DATABASE: "db"
MYSQL_USER: "bunkerweb"
MYSQL_PASSWORD: "changeme"
volumes:
- bw-data:/var/lib/mysql
restart: "unless-stopped"
networks: [bw-db]
bw-syslog:
image: balabit/syslog-ng:4.10.2
volumes:
- bw-logs:/var/log/bunkerweb
- ./syslog-ng.conf:/etc/syslog-ng/syslog-ng.conf
restart: "unless-stopped"
networks: [bw-universe]
volumes:
bw-data:
bw-storage:
bw-logs:
bw-lib:
networks:
bw-universe:
ipam:
config: [{ subnet: 10.20.30.0/24 }]
bw-services:
bw-db:
Añade bunkerweb-autoconf y aplica labels al contenedor de la UI en vez de BUNKERWEB_INSTANCES. El scheduler sigue haciendo reverse proxy a la UI mediante la plantilla ui y un REVERSE_PROXY_URL secreto.
El paquete instala el servicio systemd bunkerweb-ui. Se activa automáticamente con easy-install (el asistente también se inicia por defecto). Para ajustar o reconfigurar, edita /etc/bunkerweb/ui.env y luego:
sudo systemctl enable --now bunkerweb-ui
sudo systemctl restart bunkerweb-ui # después de cambios
Publícalo detrás de BunkerWeb (plantilla ui, REVERSE_PROXY_URL=/changeme, upstream http://127.0.0.1:7000). Monta /var/lib/bunkerweb y /var/log/bunkerweb para persistir secretos y logs.
Específicos Linux vs Docker
- Enlaces por defecto: imágenes Docker escuchan en
0.0.0.0:7000; paquetes Linux en127.0.0.1:7000. Cambia conUI_LISTEN_ADDR/UI_LISTEN_PORT. - Cabeceras de proxy:
UI_FORWARDED_ALLOW_IPSpor defecto*; en Linux ajústalo a las IP de tu proxy para endurecer. - Secretos y estado:
/var/lib/bunkerwebguardaFLASK_SECRET, llaves Biscuit y material TOTP. Móntalo en Docker; en Linux lo gestiona el paquete. - Logs:
/var/log/bunkerwebdebe ser legible por UID/GID 101 (o el UID mapeado en rootless). Los paquetes crean la ruta; los contenedores necesitan un volumen con permisos adecuados. - Asistente: easy-install en Linux arranca la UI y el asistente automáticamente; en Docker se accede al asistente vía la URL reverse-proxificada salvo que preselecciones variables de entorno.
Autenticación y sesiones
- Cuenta admin: créala con el asistente o con
ADMIN_USERNAME/ADMIN_PASSWORD. La contraseña debe incluir minúsculas, mayúsculas, dígito y carácter especial.OVERRIDE_ADMIN_CREDS=yesfuerza la resiembra aunque ya exista. - Roles:
admin,writeryreaderse crean automáticamente; las cuentas viven en la base de datos. - Secretos:
FLASK_SECRETse guarda en/var/lib/bunkerweb/.flask_secret; las llaves Biscuit al lado, opcionalmente víaBISCUIT_PUBLIC_KEY/BISCUIT_PRIVATE_KEY. -
2FA: habilita TOTP con
TOTP_ENCRYPTION_KEYS(separadas por espacios o JSON). Genera una llave:python3 -c "from passlib import totp; print(totp.generate_secret())"Los códigos de recuperación se muestran una sola vez; si pierdes las llaves de cifrado, se eliminan los secretos TOTP almacenados. - Sesiones: duración por defecto 12 h (
SESSION_LIFETIME_HOURS). Sesiones fijadas a IP y User-Agent;CHECK_PRIVATE_IP=norelaja el control de IP solo en rangos privados.ALWAYS_REMEMBER=yesfuerza cookies persistentes. - AjustaPROXY_NUMBERSsi varios proxies añadenX-Forwarded-*.
Fuentes de configuración y prioridad
- Variables de entorno (incl.
environment:de Docker/Compose) - Secrets en
/run/secrets/<VAR>(Docker) - Archivo env
/etc/bunkerweb/ui.env(paquetes Linux) - Valores por defecto integrados
Referencia de configuración
Tiempo de ejecución y zona horaria
| Ajuste | Descripción | Valores aceptados | Predeterminado |
|---|---|---|---|
TZ |
Zona horaria para logs de la UI y acciones programadas | Nombre TZ (ej. UTC, Europe/Madrid) |
sin definir (normalmente UTC en contenedor) |
Listener y TLS
| Ajuste | Descripción | Valores aceptados | Predeterminado |
|---|---|---|---|
UI_LISTEN_ADDR |
Dirección de escucha de la UI | IP o hostname | 0.0.0.0 (Docker) / 127.0.0.1 (paquete) |
UI_LISTEN_PORT |
Puerto de escucha de la UI | Entero | 7000 |
LISTEN_ADDR, LISTEN_PORT |
Alternativas si faltan vars de UI | IP/hostname, entero | 0.0.0.0, 7000 |
UI_SSL_ENABLED |
Habilitar TLS en el contenedor UI | yes o no |
no |
UI_SSL_CERTFILE, UI_SSL_KEYFILE |
Rutas de cert/clave PEM con TLS | Rutas de archivo | sin definir |
UI_SSL_CA_CERTS |
CA/cadena opcional | Ruta de archivo | sin definir |
UI_FORWARDED_ALLOW_IPS |
Proxies de confianza para X-Forwarded-* |
IPs/CIDRs separados por espacio/coma | * |
Auth, sesiones y cookies
| Ajuste | Descripción | Valores aceptados | Predeterminado |
|---|---|---|---|
ADMIN_USERNAME, ADMIN_PASSWORD |
Inicializar cuenta admin (política de contraseña) | Cadenas | sin definir |
OVERRIDE_ADMIN_CREDS |
Forzar actualización de credenciales admin desde env | yes o no |
no |
FLASK_SECRET |
Secreto de firma de sesión (persistido en /var/lib/bunkerweb/.flask_secret) |
Cadena hex/base64/opaca | generado automáticamente |
TOTP_ENCRYPTION_KEYS (TOTP_SECRETS) |
Claves para cifrar TOTP (espacio o JSON) | Cadenas / JSON | generadas si faltan |
BISCUIT_PUBLIC_KEY, BISCUIT_PRIVATE_KEY |
Claves Biscuit (hex) para tokens de UI | Cadenas hex | autogeneradas y guardadas |
SESSION_LIFETIME_HOURS |
Duración de sesión | Número (horas) | 12 |
ALWAYS_REMEMBER |
Activar siempre “remember me” | yes o no |
no |
CHECK_PRIVATE_IP |
Ligar sesión a IP (relaja en redes privadas con no) |
yes o no |
yes |
PROXY_NUMBERS |
Saltos de proxy confiables para X-Forwarded-* |
Entero | 1 |
Logging
| Ajuste | Descripción | Valores aceptados | Predeterminado |
|---|---|---|---|
LOG_LEVEL, CUSTOM_LOG_LEVEL |
Nivel base / override | debug, info, warning, error, critical |
info |
LOG_TYPES |
Destinos | stderr/file/syslog separados por espacio |
stderr |
LOG_FILE_PATH |
Ruta para logs a archivo (file o CAPTURE_OUTPUT=yes) |
Ruta de archivo | /var/log/bunkerweb/ui.log si file/capture |
CAPTURE_OUTPUT |
Enviar stdout/stderr de Gunicorn a handlers | yes o no |
no |
LOG_SYSLOG_ADDRESS |
Destino syslog (udp://host:514, tcp://host:514, socket) |
Host:puerto / URL / socket | sin definir |
LOG_SYSLOG_TAG |
Tag/ident syslog | Cadena | bw-ui |
Runtime misceláneo
| Ajuste | Descripción | Valores aceptados | Predeterminado |
|---|---|---|---|
MAX_WORKERS, MAX_THREADS |
Workers/hilos de Gunicorn | Entero | cpu_count()-1 (mín 1), workers*2 |
ENABLE_HEALTHCHECK |
Exponer GET /healthcheck |
yes o no |
no |
FORWARDED_ALLOW_IPS |
Alias obsoleto para lista de proxies | IPs/CIDRs | * |
DISABLE_CONFIGURATION_TESTING |
Saltar reloads de prueba al aplicar config | yes o no |
no |
IGNORE_REGEX_CHECK |
Omitir validación regex de ajustes | yes o no |
no |
Acceso a logs
La UI lee logs de NGINX/servicios desde /var/log/bunkerweb. Alimenta ese directorio con un demonio syslog o un volumen:
- El UID/GID del contenedor es 101. En el host hazlos legibles:
chown root:101 bw-logs && chmod 770 bw-logs(ajusta para rootless). - Envía access/error logs de BunkerWeb vía
ACCESS_LOG/ERROR_LOGal sidecar syslog; logs de componentes conLOG_TYPES=syslog.
Ejemplo de syslog-ng.conf para escribir logs por programa:
@version: 4.10
source s_net { udp(ip("0.0.0.0")); };
template t_imp { template("$MSG\n"); template_escape(no); };
destination d_dyna_file {
file("/var/log/bunkerweb/${PROGRAM}.log"
template(t_imp) owner("101") group("101")
dir_owner("root") dir_group("101")
perm(0440) dir_perm(0770) create_dirs(yes));
};
log { source(s_net); destination(d_dyna_file); };
Capacidades
- Panel para solicitudes, bloqueos, caché y jobs; reinicio/recarga de instancias.
- Crear/actualizar/eliminar servicios y ajustes globales con validación contra esquemas de plugins.
- Subir y gestionar configs personalizadas (NGINX/ModSecurity) y plugins (externos o PRO).
- Ver logs, buscar reportes e inspeccionar artefactos de caché.
- Gestionar usuarios de UI, roles, sesiones y TOTP con códigos de recuperación.
- Actualizar a BunkerWeb PRO y ver estado de licencia en la página dedicada.
Actualizar a PRO
Prueba gratis de BunkerWeb PRO
Usa el código freetrial en el Panel BunkerWeb para un mes de prueba.
Pega tu clave PRO en la página PRO de la UI (o precarga PRO_LICENSE_KEY para el asistente). Las actualizaciones se descargan en segundo plano por el scheduler; revisa en la UI la caducidad y los límites de servicios tras aplicarlas.