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.
- 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.
- 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
- 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;
- 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
- 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 .
- 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
- 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.