Implantação Empresarial do Leantime com Contêineres: Design Arquitetônico e Práticas de Produção

O Leantime é uma ferramenta de gerenciamento de projetos de código aberto baseada em PHP e JavaScript, ideal para pequenas equipes. A implantação via Docker permite escalabilidade, consistência de ambiente e operações simplificadas. Este guia abrange desde a configuração inicial até a otimização para ambientes de produção.

  1. Arquitetura e Seleção Tecnológica

A solução utiliza uma arquitetura de múltiplos serviços para garantir alta disponibilidade:

  • Servidor de Aplicação: Contêiner baseado em PHP 8.3 com Nginx integrado.
  • Banco de Dados: MySQL 8.4 para armazenamento persistente.
  • Gerenciamento de Processos: Supervisord para administrar PHP-FPM e Nginx.

Benefícios da abordagem: isolamento por contêiner, construção em estágios para otimização de imagens e verificações de saúde automatizadas.

  1. Preparação do Ambiente

2.1 Requisitos do Sistema

Docker Engine 20.10+ e Docker Compose 2.0+ são necessários, com pelo menos 2GB de RAM e 10GB de espaço em disco.

2.2 Inicialização do Projeto

# Clonar o repositório e configurar variáveis
git clone https://gitcode.com/gh_mirrors/do/docker-leantime
cd docker-leantime
cp sample.env .env

2.3 Variáveis de Ambiente Essenciais

# Configuração do banco de dados
DB_ROOT_PASSWORD=senha_segura_root
DB_NAME=leantime
DB_USER=usuario_leantime
DB_USER_PASSWORD=senha_segura_usuario

# Conexão da aplicação com o banco
LEAN_DB_HOST=host_banco_dados
LEAN_DB_USER=usuario_leantime
LEAN_DB_PASSWORD=senha_segura_usuario
LEAN_DB_DATABASE=leantime

# Segurança de sessão
LEAN_SESSION_KEY=chave_aleatoria_segura
LEAN_SESSION_TIMEOUT=28800

# Configurações gerais
APP_PORT=8080
DEBUG_MODE=0
USER_ID=1000
GROUP_ID=1000

  1. Implantação dos Componentes Principais

3.1 Estrutura do Docker Compose

version: '3.3'

services:
  db_leantime:
    image: mysql:8.4
    container_name: mysql_container
    volumes:
      - database_data:/var/lib/mysql
    restart: always
    env_file: ./.env
    networks:
      - rede_interna
    command: --character-set-server=UTF8MB4 --collation-server=UTF8MB4_unicode_ci
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
      interval: 30s
      timeout: 10s
      retries: 3

  app_leantime:
    image: leantime/leantime:${APP_VERSION:-latest}
    restart: always
    env_file: ./.env
    security_opt:
      - no-new-privileges:true
    cap_add:
      - CAP_CHOWN
      - CAP_SETGID
      - CAP_SETUID
    ports:
      - "${APP_PORT:-8080}:8080"
    networks:
      - rede_interna
    volumes:
      - upload_files:/var/www/html/public/userfiles
      - private_files:/var/www/html/userfiles
      - extensions:/var/www/html/app/Plugins
      - log_files:/var/www/html/storage/logs
    depends_on:
      db_leantime:
        condition: service_healthy

3.2 Estratégia de Armazenamento Persistente

Volume Finalidade Importância
database_data Dados do MySQL Essencial
private_files Arquivos privados do usuário Essencial
upload_files Arquivos públicos do usuário Recomendado
extensions Diretório de plugins Recomendado
log_files Logs da aplicação Opcional

3.3 Otimização do Dockerfile

# Construção em múltiplos estágios
FROM --platform=$TARGETPLATFORM php:8.3-fpm-alpine AS build_stage
# Estágio de produção com imagem mínima
FROM --platform=$TARGETPLATFORM php:8.3-fpm-alpine
# Execução como usuário não-root
ARG USER_ID=1000
ARG GROUP_ID=1000
USER www-data
# Verificação de saúde integrada
HEALTHCHECK --interval=30s --timeout=10s --retries=3 \
    CMD wget -q -O /dev/null http://localhost:8080 || exit 1

3.4 Configuração Avançada do Nginx

# Cabeçalhos de segurança
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header X-Content-Type-Options "nosniff" always;
add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval';" always;
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;

# Protocolos SSL/TLS
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;

# Compressão e desempenho
client_max_body_size 50M;
gzip on;
gzip_vary on;
gzip_types text/plain text/css application/json application/javascript;

  1. Segurança e Otimização de Desempenho

4.1 Endurecimento de Segurança

# Execução restrita no docker-compose.yml
security_opt:
  - no-new-privileges:true
cap_add:
  - CAP_CHOWN
  - CAP_SETGID
  - CAP_SETUID
# Uso de secrets para credenciais
docker secret create db_password ./db_password.txt
# Referência em variáveis de ambiente
environment:
  - LEAN_DB_PASSWORD_FILE=/run/secrets/db_password

4.2 Ajustes de Desempenho

Otimização do PHP-FPM:

pm = dynamic
pm.max_children = 40
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 25
pm.max_requests = 400

Configurações do MySQL:

[mysqld]
innodb_buffer_pool_size = 256M
innodb_log_file_size = 64M
query_cache_size = 32M
max_connections = 100

4.3 Limites de Recursos

# Definição de limites no Docker Compose
services:
  app_leantime:
    deploy:
      resources:
        limits:
          cpus: '1.0'
          memory: 1G
        reservations:
          cpus: '0.5'
          memory: 512M

  1. Operações, Monitoramento e Solução de Problemas

5.1 Verificações de Saúde e Logs

Configuração de healthcheck para o banco de dados:

healthcheck:
  test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
  interval: 30s
  timeout: 10s
  retries: 3
  start_period: 40s

Gerenciamento de logs:

# Visualizar logs em tempo real
docker-compose logs -f app_leantime
# Exportar logs para análise
docker-compose logs --no-color > logs_leantime_$(date +%Y%m%d).txt

5.2 Diagnóstico de Falhas

Problemas de conexão com o banco de dados:

# Testar conectividade
docker exec app_leantime ping db_leantime
docker exec db_leantime mysql -uusuario_leantime -p -e "SHOW DATABASES;"
# Verificar variáveis de ambiente
docker exec app_leantime env | grep LEAN_DB

Correção de permissões:

# Ajustar permissões de arquivos
docker exec app_leantime chown -R www-data:www-data \
  /var/www/html/userfiles \
  /var/www/html/public/userfiles
docker exec app_leantime chmod -R 775 \
  /var/www/html/userfiles \
  /var/www/html/public/userfiles

5.3 Estratégias de Backup

Backup do banco de dados:

# Backup manual
docker exec db_leantime mysqldump -uusuario_leantime -p leantime > backup_$(date +%Y%m%d).sql
# Script de backup automatizado
#!/bin/bash
BACKUP_DIR="/backups/leantime"
DATE=$(date +%Y%m%d_%H%M%S)
docker exec db_leantime mysqldump -uusuario_leantime -p$DB_PASSWORD leantime > $BACKUP_DIR/backup_$DATE.sql
find $BACKUP_DIR -name "*.sql" -mtime +7 -delete

Backup de arquivos do usuário:

# Backup de uploads
docker run --rm -v private_files:/data -v $(pwd):/backup alpine tar czf /backup/uploads_$(date +%Y%m%d).tar.gz -C /data .

  1. Extensões e Integrações

6.1 Integrações Avançadas

Integração com Redis para cache:

# Habilitar Redis no .env
LEAN_USE_REDIS=true
LEAN_REDIS_HOST=redis_leantime
LEAN_REDIS_PORT=6379
LEAN_REDIS_PASSWORD=senha_redis

Integração com armazenamento S3:

# Configuração S3
LEAN_USE_S3=true
LEAN_S3_KEY=chave_s3
LEAN_S3_SECRET=segredo_s3
LEAN_S3_BUCKET=bucket_leantime
LEAN_S3_REGION=us-east-1

6.2 Implantação em Alta Disponibilidade

Exemplo com Docker Swarm:

version: '3.8'
services:
  app_leantime:
    image: leantime/leantime:latest
    deploy:
      replicas: 3
      update_config:
        parallelism: 1
        delay: 10s
      restart_policy:
        condition: on-failure
        delay: 5s
        max_attempts: 3

6.3 Integração com CI/CD

Pipeline de exemplo:

stages:
  - build
  - deploy
build:
  stage: build
  script:
    - docker build -t leantime/leantime:$CI_COMMIT_SHA .
    - docker push leantime/leantime:$CI_COMMIT_SHA
deploy:
  stage: deploy
  script:
    - docker-compose pull
    - docker-compose up -d
  only:
    - main

  1. Práticas de Operação e Manutenção

Para manter a implantação robusta, adote estas práticas:

  • Backup Regular: Agende backups periódicos do banco de dados e arquivos.
  • Versionamento: Use tags específicas das imagens em vez de 'latest'.
  • Monitoramento: Implemente monitoramento de recursos como CPU e memória.
  • Atualizações: Aplique patches de segurança regularmente nas imagens base.
  • Ajuste Dinâmico: Otimize configurações do PHP-FPM e Nginx conforme a carga.

Em caso de falhas, proceda com diagnósticos específicos: reinicie contêineres, analise logs e restaure backups quando necessário. Valide a integridade dos dados após recuperações.

Tags: Docker leantime PHP MySQL nginx

Publicado em 6-23 17:32