02 - Gerenciamento de Repositório
video: https://youtu.be/... no frontmatter da nota.Gerenciamento de Repositório
No contexto de um Servidor Web, o Gerenciamento de Repositório (ou Document Root Management) refere-se à organização técnica, manutenção e segurança do local físico onde os arquivos do site ou aplicação residem. Não se trata apenas de armazenar arquivos, mas de estruturar como o software servidor (Apache, Nginx, IIS) interage com o sistema de arquivos para entregar conteúdo de forma eficiente, segura e auditável.
1. Estrutura Hierárquica do Repositório
O repositório deve separar conteúdo público de ficheiros de configuração, scripts sensíveis e dados de sistema. Estrutura típica de app moderno:
/var/www/exemplo/
├── public/ # Único exposto ao servidor web
│ ├── index.php # Entry point
│ ├── assets/{css,js,images,fonts}/
│ ├── robots.txt favicon.ico .htaccess
├── src/ # Código (Controllers/Models/Views/config)
├── storage/{logs,cache,uploads}/ # Dados da aplicação
├── vendor/ # Dependências (Composer, npm)
├── tests/ .env .gitignore composer.json
Diretrizes de Organização
- Ponto de Entrada Único: apenas
index.php(ou equivalente) na pasta pública. - Isolamento de Código Sensível: configurações e classes ficam fora do
public/. - Separação por Tipo: imagens, CSS, JS e documentos em subpastas dedicadas.
- Nomes consistentes: kebab-case para URLs, snake_case para arquivos de código.
2. Controle de Acesso e Segurança (Hardening)
O usuário do servidor web (ex: www-data, nginx) deve ter permissões de leitura, mas raramente de escrita no repositório, para evitar que um atacante, ao comprometer o processo web, altere o site.
Modelo de Permissões em Camadas
| Diretório | Dono | Grupo | Permissão | Justificativa |
|---|---|---|---|---|
/var/www/exemplo |
deploy | www-data | 750 | Deploy controla, web lê |
public/ |
deploy | www-data | 750 | Web só lê |
storage/uploads/ |
www-data | www-data | 770 | Web escreve uploads |
.env |
deploy | www-data | 640 | Web lê secrets |
ACLs (Access Control Lists)
Para casos mais complexos, usar ACLs em vez de apenas dono/grupo/outros:
# Permite leitura ao nginx e escrita ao deploy
setfacl -R -m u:nginx:rX,d:u:nginx:rX /var/www/exemplo
setfacl -R -m u:deploy:rwX,d:u:deploy:rwX /var/www/exemplo
3. Arquivos de Configuração Local
.htaccess (Apache)
Permite gerenciar o comportamento do repositório em tempo real, sem reiniciar o servidor:
# Bloquear arquivos sensíveis
<FilesMatch "(^\.|\.(bak|env|sql|log|md|sh)$)">
Require all denied
</FilesMatch>
# Bloquear acesso ao diretório de código
RedirectMatch 403 /src/.*$
RedirectMatch 403 /vendor/.*$
# Forçar HTTPS
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
Nginx (sem .htaccess)
Nginx não suporta .htaccess por design — toda configuração fica em /etc/nginx/, exigindo reload. Mais performático (não verifica arquivo em cada request) porém menos flexível para hospedagem compartilhada.
location ~ /\.(?!well-known).* { deny all; access_log off; log_not_found off; }
location ~* \.(env|sql|log|bak|sh|md)$ { deny all; return 404; }
4. Sincronização e Implementação (Deployment)
| Método | Como Funciona | Vantagem | Risco |
|---|---|---|---|
| Manual SCP/SFTP | Cópia direta | Simples | Erro humano |
| Git pull | Servidor clona repo | Versionado | Requer .gitignore para secrets |
| CI/CD Pipeline | GitHub Actions, Jenkins | Automatizado | Complexidade inicial |
| Container | Docker pull image | Reprodutível | Overhead de runtime |
| Atomic symlink | Troca de symlink | Zero downtime | Requer versões paralelas |
Atomic Deploys (Zero Downtime)
Nova versão carregada em pasta paralela e servidor web altera apenas um symlink para a nova pasta. Garante que o site nunca fique fora do ar durante a atualização.
#!/bin/bash
set -euo pipefail
RELEASE_DIR="/var/www/releases/$(date +%Y%m%d_%H%M%S)"
APP_DIR="/var/www/exemplo/current"
git clone --depth=1 https://github.com/org/app.git "$RELEASE_DIR"
(cd "$RELEASE_DIR" && composer install --no-dev --optimize-autoloader && php artisan config:cache)
ln -sfn "$RELEASE_DIR" "$APP_DIR.tmp" && mv -T "$APP_DIR.tmp" "$APP_DIR"
systemctl reload php8.3-fpm nginx
ls -dt /var/www/releases/*/ | tail -n +6 | xargs rm -rf # manter últimos 5
Rollback Imediato
ln -sfn /var/www/releases/20240110_120000 /var/www/exemplo/current && systemctl reload nginx
5. Conteúdo Dinâmico vs Estático
Repositórios Estáticos
Ficheiros entregues como estão no disco. Foco em: Cache HTTP (Cache-Control: max-age=31536000, immutable para assets com hash), Compressão (Gzip RFC 1952 ou Brotli RFC 7932, ~15-20% melhor que Gzip), e Pre-compressão (gerar .gz e .br no build, servindo-os diretamente).
brotli on; brotli_comp_level 6;
brotli_types text/css application/javascript application/json image/svg+xml;
gzip on; gzip_types text/plain text/css application/javascript;
gzip_min_length 1000;
Repositórios de Uploads
Pastas onde usuários fazem upload. Exigem: desativar execução de scripts (PHP/Python/Perl) para evitar web shell, validação de MIME type no servidor (não confiar só na extensão), renomear arquivos para nomes aleatórios (evitar path guessing), e limitar tamanho (client_max_body_size no Nginx, upload_max_filesize no PHP).
location /uploads/ {
location ~ \.php$ { deny all; }
add_header X-Content-Type-Options nosniff;
}
6. Versionamento e Secrets
Git como Backend
git clone --depth=1 https://github.com/org/site.git # clone read-only
git remote set-url origin --push=disabled
.gitignore Crítico
.env .env.local config/secrets.yml storage/logs/*.log
storage/uploads/private/* node_modules/ vendor/ *.sql *.bak
Secrets Management
- Nunca commitar
.envem repositório. Usar Vault (HashiCorp), AWS Secrets Manager, Azure Key Vault. - Para projetos pequenos:
.envno servidor apenas, comchmod 600.
7. Limpeza e Manutenção
Um gerenciamento eficaz inclui a remoção periódica de: arquivos temporários (*.tmp, *.swp), backups antigos (index.php.bak, db.sql.2023) que podem expor código-fonte, logs volumosos que podem encher o disco e parar o servidor, versões antigas de releases (manter últimas 3-5), e cache obsoleto (regenerar após deploy).
Script de Limpeza (cron semanal)
find /var/www -name "*.bak" -mtime +30 -delete
find /var/www -name "*.log" -size +100M -mtime +30 -delete
find /var/www/releases -maxdepth 1 -type d -mtime +90 -exec rm -rf {} \;
df -h | awk 'NR>1 && int($5) > 80 {print "DISCO CHEIO:", $0}'
8. Monitoramento e Auditoria
du -sh /var/www/exemplo/ # tamanho (planejar capacidade)
find /var/www -type f -mtime -1 -ls # modificados hoje (suspeitos)
find /var/www -perm /o+w -type f -ls # permissões inseguras
find /var/www -name "*.php" -size -2k -mtime -7 # web shell suspeito
awk '{print $7}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head # top URLs
inotifywait -m -r /var/www/exemplo/storage/uploads -e create -e modify # novos uploads
9. Backup e Recuperação (Estratégia 3-2-1)
- 3 cópias dos dados; 2 mídias diferentes (disco + fita, ou local + cloud); 1 cópia offsite (AWS S3, Glacier).
| Tipo | O que Inclui | Frequência | Retenção |
|---|---|---|---|
| Completo | Todos os arquivos | Semanal | 12 semanas |
| Incremental | Mudanças desde último | Diário | 30 dias |
| Snapshot LVM | Imagem do FS | Horário | 24 horas |
| Off-site | Replicação remota | Tempo real | Indefinido |
10. Conclusão
O Gerenciamento de Repositório combina organização estrutural (árvore de diretórios), segurança (permissões, ACLs, .htaccess, bloqueio de execução em uploads), automação (CI/CD, deploys atômicos, rollback), performance (compressão, cache) e governança (versionamento, secrets, backup, monitoramento). Um repositório mal gerenciado é a causa número um de incidentes de segurança em aplicações web — desde defacement até vazamento de dados via .env exposto. Aplicar as melhores práticas descritas é fundamental para garantir a resiliência, segurança e auditabilidade de qualquer servidor web em produção.