Ir al contenido principal

Bookstack + Traefik

Requerimientos previos

  • Docker instalado
  • Instancia de Traefik instalada y corriendo
  • Red de Docker creada para integrar contenedor con Traefik
  • Requiere 2 middlewares configurados en Traefik:
    • secHeaders@file
    autodetectContenttype@file

    Pasos

    1. Preparar dominio/subdominio de la instancia a configurar
    Crear secretos para credenciales de base de datos y correo Crear archivos de configuración Cambiar valores de acuerdo a las necesidades de la instancia Levantar el contenedor Visitar la aplicación y comprobar que esté funcionando correctamente

    Configuración previa

    Crear secretos en Docker para acceso a base de datos

    Por

    # documentarPara usuario de base de datos (db_password)
    printf "palabra secreta" | docker secret create db_password -
    
    # Para usuario root (db_root_password)
    printf "palabra secreta" | docker secret create db_root_password -

    Crear secretos en Docker para acceso a SMTP

    Por

    # documentarPara usuario SMTP (mail_password)
    printf "palabra secreta" | docker secret create mail_password - 

    Archivos de configuración

    .env

    APP_KEY=base64:123456
    APP_URL=https://ejemplo.com
    DB_DATABASE=bd_ejemplo
    DB_HOST=localhost
    DB_PORT=7076
    INSTANCE_URL=ejemplo.com
    MAIL_DRIVER=sendmail
    MAIL_FROM_NAME=(Remitente de correo)
    MAIL_FROM=usuario@ejemplo.com
    MAIL_HOST=smtp.ejemplo.com
    MAIL_PORT=465
    MAIL_USERNAME=mailer@ejemplo.com
    MAIL_ENCRYPTION=ssl
    PGID=1000
    PUID=1000
    TZ=America/Guatemala
    VOLUME_PATH=/var/www/ejemplo.com
    

    compose.yaml

    services:
      bookstack_db:
        image: mariadb
        container_name: bookstack_db
        environment:
          - MYSQL_DATABASE=${DB_DATABASE}
          - MYSQL_USER=/run/secrets/db_user
          - MYSQL_PASSWORD=/run/secrets/db_password
          - MYSQL_ROOT_PASSWORD=/run/secrets/db_root_password
        volumes:
          - ${VOLUME_PATH}/bookstack-db:/var/lib/mysql
          - ${VOLUME_PATH}/entrypoint-initdb:/docker-entrypoint-initdb.d:ro
          - ./my.cnf:/etc/mysql/my.cnf
        networks:
          - traefik_network
        restart: unless-stopped
      bookstack_app:
        image: lscr.io/linuxserver/bookstack:latest
        container_name: bookstack_app
        depends_on: 
          - bookstack_db
        environment:
          - PUID=1001
          - PGID=1001
          - TZ=${TZ}
          - APP_URL=${APP_URL}
          - APP_KEY=${APP_KEY}
          - APP_DEBUG=false
          - APP_THEME=comunidad
          - DB_HOST=bookstack-db
          - DB_DATABASE=${DB_DATABASE}
          - DB_USERNAME=/run/secrets/db_user
          - DB_PASSWORD=/run/secrets/db_password
          - MAIL_DRIVER=${MAIL_DRIVER}
          - MAIL_FROM_NAME=${MAIL_FROM_NAME}
          - MAIL_FROM=${MAIL_FROM}
          - MAIL_HOST=${MAIL_HOST}
          - MAIL_PORT=${MAIL_PORT}
          - MAIL_USERNAME=${MAIL_USERNAME}
          - MAIL_PASSWORD=/run/secrets/mail_password
          - MAIL_ENCRYPTION=${MAIL_ENCRYPTION}
        labels:
          - "traefik.enable=true"
          - "traefik.http.routers.nombre_interno_instancia.rule=Host(`${INSTANCE_URL}`)"
          - "traefik.http.routers.nombre_interno_instancia.entrypoints=https"
          - "traefik.http.routers.nombre_interno_instancia.tls=true"
          - "traefik.http.routers.nombre_interno_instancia.tls.certresolver=tls"
          - "traefik.http.routers.nombre_interno_instancia.middlewares=secHeaders@file,autodetectContenttype@file"
          - "traefik.http.services.nombre_interno_instancia.loadbalancer.server.port=80"
          - "traefik.http.services.nombre_interno_instancia.loadbalancer.passHostHeader=true"
        volumes:
          - ${VOLUME_PATH}/bookstack-files:/config
        restart: unless-stopped
        ports:
          - 7075:80
        networks:
          - traefik_network  
    networks:
      traefik_network:
        external: true 
    

    my.conf (opcional)

    Configuración adicional para reducir el uso de RAM de parte de la base de datos MariaDB

    [client-server]
    socket = /run/mysqld/mysqld.sock
    
    !includedir /etc/mysql/mariadb.conf.d/
    !includedir /etc/mysql/conf.d/
    
    max_connections         = 10
    connect_timeout         = 5
    wait_timeout            = 600
    max_allowed_packet      = 16M
    thread_cache_size       = 4M
    sort_buffer_size        = 32K
    bulk_insert_buffer_size = 0
    tmp_table_size          = 1K
    max_heap_table_size     = 16K
    query_cache_limit       = 128K
    query_cache_size        = 512K
    innodb_buffer_pool_size = 10M
    innodb_log_buffer_size  = 512K