# Guia de Implantação - DNSBlock Este guia descreve os passos para implantar a aplicação DNSBlock em um ambiente de produção. ## Pré-requisitos - Docker instalado - Docker Compose instalado - Git instalado (para clonar o repositório) ## Passos para Instalação ### 1. Clonar o Repositório Clone o repositório da aplicação para o diretório desejado no servidor: ```bash git clone dnsblock cd dnsblock ``` ### 2. Configurar Variáveis de Ambiente Crie o arquivo `.env` a partir do exemplo fornecido: ```bash cp .env.example .env ``` Edite o arquivo `.env` e ajuste as configurações para o ambiente de produção, **especialmente as senhas e a URL da aplicação**: ```bash nano .env ``` **Configurações Importantes:** - `DB_HOST`: Mantenha como `db` (nome do serviço no docker-compose) - `DB_ROOT_PASSWORD`: Defina uma senha forte para o root do MySQL - `DB_PASSWORD`: Defina uma senha forte para o usuário da aplicação - `APP_URL`: A URL pública onde a aplicação será acessada (ex: `https://painel.seudominio.com`) - `JWT_SECRET`: Gere uma string aleatória e segura para assinar os tokens JWT ### 3. Inicializar os Containers Execute o Docker Compose para construir e iniciar os serviços em segundo plano: ```bash docker-compose up -d --build ``` ### 4. Inicializar o Banco de Dados A primeira vez que o container do banco de dados sobe, ele pode estar vazio. Você precisa importar o esquema do banco de dados. Copie o arquivo de esquema para dentro do container e execute a importação: ```bash # Aguarde alguns segundos para o banco de dados inicializar completamente # Importar o esquema docker exec -i dnsblock-db mysql -u root -p dnsblock < database/schema.sql ``` *Nota: Substitua `` pela senha definida no `.env`.* ### 5. Criar Usuário Administrativo O banco de dados inicia vazio. Você tem duas opções para criar o primeiro usuário: **Opção A: Importar dados de exemplo (Seeds)** Isso criará um usuário `admin@dnsblock.com.br` com senha `admin123`. ```bash docker exec -i dnsblock-db mysql -u root -p dnsblock < database/seeds.sql ``` **Opção B: Criar usuário manualmente** Se preferir criar um usuário específico: 1. Acesse o banco de dados: ```bash docker exec -it dnsblock-db mysql -u root -p dnsblock ``` 2. Execute o comando SQL (substitua os valores): ```sql -- A senha deve ser um hash Bcrypt. -- Para 'admin123', o hash é: $2y$10$MKGTx67.xKf55GJ98R2AoOZPJX/p.3xEeBywIbvJ4nM5lCZazzCly INSERT INTO users (name, email, password, role) VALUES ('Seu Nome', 'seu@email.com', '$2y$10$MKGTx67.xKf55GJ98R2AoOZPJX/p.3xEeBywIbvJ4nM5lCZazzCly', 'admin'); ``` ### 6. Configurar Permissões (Se necessário) Certifique-se de que o servidor web tem permissão de escrita nos diretórios de log ou cache, se houver. No contexto do Docker, isso geralmente é tratado dentro do container, mas verifique se há volumes mapeados que precisam de permissão no host. ### 7. Acessar a Aplicação A aplicação estará rodando na porta definida no `docker-compose.yml` (padrão: 8001). - Acesse: `http://:8001` ### 8. (Recomendado) Configurar Proxy Reverso com SSL Para produção, é altamente recomendado usar um proxy reverso (como Nginx ou Traefik) na frente da aplicação para gerenciar o SSL (HTTPS). Exemplo de configuração básica do Nginx (no host): ```nginx server { listen 80; server_name painel.seudominio.com; location / { proxy_pass http://localhost:8001; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } } ``` ## Comandos Úteis - **Parar aplicação**: `docker-compose down` - **Ver logs**: `docker-compose logs -f` - **Reiniciar aplicação**: `docker-compose restart` ## Otimização e Segurança ### Arquivos Desnecessários (Agent, Código Fonte, etc.) Ao clonar o repositório completo (`git clone`), você baixa todo o histórico e arquivos de desenvolvimento (como a pasta `agent/`). **Isso é normal e esperado** neste método de deploy simples. No entanto, criamos um arquivo `.dockerignore` que garante que **apenas os arquivos necessários para a aplicação web** sejam copiados para dentro do container Docker. Isso significa que: 1. A pasta `agent/` e outros arquivos de desenvolvimento **NÃO** estarão rodando dentro do container. 2. O container de produção será leve e seguro. 3. Os arquivos "extras" ficarão apenas na pasta do host, sem afetar a aplicação. ### Método Avançado (Sem git clone no servidor) Se você quiser evitar ter o código fonte no servidor de produção, a abordagem recomendada é: 1. **Build Local**: Construa a imagem Docker na sua máquina ou CI/CD. ```bash docker build -t seu-usuario/dnsblock-app:latest . ``` 2. **Push**: Envie a imagem para um registro (Docker Hub, AWS ECR, etc.). ```bash docker push seu-usuario/dnsblock-app:latest ``` 3. **Deploy**: No servidor, copie apenas o `docker-compose.yml` e o `.env`, e ajuste a imagem para usar a versão do registro. ```yaml # docker-compose.yml services: app: image: seu-usuario/dnsblock-app:latest # ... resto da configuração ``` ## Solução de Problemas ### Senhas com Caracteres Especiais (`$`) Se sua senha contiver o caractere `$` (cifrão), o Docker Compose tentará interpretar o que vem a seguir como uma variável. Para evitar isso, você deve escapar o `$` usando `$$`. **Exemplo:** - Senha original: `Minha$Senha` - No arquivo `.env`: `DB_PASS=Minha$$Senha`