173 lines
5.7 KiB
Markdown
173 lines
5.7 KiB
Markdown
# 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 <URL_DO_SEU_REPOSITORIO> 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<SUA_SENHA_ROOT> dnsblock < database/schema.sql
|
|
```
|
|
|
|
*Nota: Substitua `<SUA_SENHA_ROOT>` 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<SUA_SENHA_ROOT> 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<SUA_SENHA_ROOT> 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://<IP_DO_SERVIDOR>: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`
|
|
|