Como Duplicar Projeto no Portainer

Guia completo para criar múltiplas instâncias de containers com diferentes configurações

📋 Introdução

Este guia mostra como criar uma segunda instância de um container usando um container existente como base, mas conectado a uma base de dados diferente.

Quando usar este método?
  • ✅ Você já tem um container funcionando e quer criar outro para outro lugar
  • ✅ Você quer usar a mesma imagem Docker, mas com configurações diferentes
  • ✅ Você quer evitar criar uma nova stack completa

🔍 Passo 1: Localizar o Container Existente

  1. No Portainer, vá em Containers
  2. Encontre o container existente (ex: meu-container)
  3. Clique no nome do container para ver os detalhes

📋 Passo 2: Duplicar o Container

  1. No container existente, clique no botão Duplicate/Edit (ou Edit)
  2. Isso abrirá a tela de edição com todas as configurações do container atual

✏️ Passo 3: Alterar o Nome do Container

⚠️ IMPORTANTE: Você DEVE alterar o nome para evitar conflito!

No campo Name, altere para um nome único, por exemplo:

  • meu-container-1
  • meu-container-2
  • meu-projeto-instancia-2

🔌 Passo 4: Alterar o Mapeamento de Porta

⚠️ OBRIGATÓRIO: Você DEVE usar uma porta diferente para evitar conflito!
  1. Na seção Port mapping, localize o mapeamento existente (ex: 5001:5001)
  2. Altere a porta do Host (primeiro número) para uma porta disponível

Exemplos de mapeamento:

  • 5002:5001 (porta 5002 no host, 5001 no container)
  • 5003:5001
  • 6001:5001
  • Ou qualquer outra porta disponível no servidor
💡 Dica: A porta do container (segundo número) geralmente permanece 5001, mas a porta do host (primeiro número) DEVE ser diferente.

⚙️ Passo 5: Configurar Variáveis de Ambiente

  1. Role até a seção Advanced container settings
  2. Clique em Env (ou Environment variables)
  3. Você verá todas as variáveis de ambiente do container original

Variáveis que devem ser alteradas

⚠️ ATENÇÃO: Estas variáveis são específicas para cada instância e DEVEM ser alteradas conforme sua necessidade:
Variável Descrição Valor Original (Exemplo) Novo Valor (Exemplo)
DB_HOST Endereço do servidor de banco de dados 192.168.1.10 192.168.1.20
DB_PORT Porta do banco de dados 5432 5433
DB_PASSWORD Senha de acesso ao banco de dados senha_db_123 nova_senha_db_456
ADMIN_USERNAME Nome de usuário do administrador admin admin2
ADMIN_PASSWORD Senha do administrador senha123 novaSenha456
DB_DATABASE Nome do banco de dados meu_banco meu_banco_2
CIDADE_IBGE Código IBGE da cidade (se aplicável) 3550308 3544004
ESTADO Sigla do estado (se aplicável) SP RJ
POPULATION População (se aplicável) 12000000 6500000
SECRET_TOKEN Token secreto para segurança (JWT, etc) abc123def456 xyz789ghi012
💡 Dica: Nem todas essas variáveis existem em todos os projetos. Altere apenas as que estiverem presentes no seu container original.

🚀 Passo 6: Criar o Novo Container

6.1: Configurar Reinicialização Automática

Antes de criar o container, configure para que ele reinicie automaticamente caso o Docker reinicie ou o servidor reinicie:

  1. Na seção Advanced container settings, procure por Restart policy
  2. Selecione Always ou Unless stopped
  3. Isso garantirá que o container inicie automaticamente após reinicializações
💡 Dica: A política Always reinicia o container sempre que ele parar, mesmo que você o pare manualmente. A política Unless stopped reinicia automaticamente, mas respeita se você parar manualmente.

6.2: Deploy do Container

  1. Após configurar todas as variáveis e a política de reinicialização, role até o final da página
  2. Clique em Deploy the container
  3. Aguarde o container ser criado e iniciar

🔍 Passo 7: Verificar Logs

⚠️ IMPORTANTE: Após criar o container, você DEVE verificar os logs para garantir que está funcionando corretamente.

7.1: Acessar os Logs do Container

  1. No Portainer, vá em Containers
  2. Clique no container criado
  3. Vá na aba Logs
  4. Role para ver todas as mensagens desde o início

7.2: Logs de Sucesso - O que você DEVE ver

Quando o container está funcionando corretamente, você verá logs similares a estes:

✅ Application started
✅ Server listening on port 5001
✅ Database connection established
✅ Service initialized successfully
✅ All services are running

╭───────────────────────────── Aplicação em execução ─────────────────────────────╮
│     A aplicação foi iniciada com sucesso e já pode ser acessada pelos          │
│     endereços abaixo:                                                          │
│     HOST:                                                                      │
│         http://localhost:5001                                                  │
│         http://0.0.0.0:5001                                                    │
│         http://172.19.0.3:5001                                                 │
│      MANTENHA ESTA APLICAÇÃO EM EXECUÇÃO.                                      │
╰──────────────────────────────────────────────────────────────────────────────────╯
✅ Se você ver mensagens de sucesso nos logs, o container está funcionando corretamente!

🌐 Passo 8: Configurar Nginx para o Novo Container

Após verificar que o container está funcionando, configure o Nginx para acessar o backend através de uma URL amigável.

8.1: Preparação

Informações necessárias:

  • Porta do container: 5002 (porta do host onde o novo container está rodando)
  • Domínio: Escolha um domínio para o seu projeto (ex: meu-projeto.exemplo.com.br)

8.2: Opção 1 - Domínio Raiz com Subpaths (Recomendado)

Esta configuração permite acessar múltiplas instâncias através do mesmo domínio usando subpaths diferentes.

Exemplo de acesso:

  • https://meu-projeto.exemplo.com.br/instancia1/ → Container porta 5001
  • https://meu-projeto.exemplo.com.br/instancia2/ → Container porta 5002
  • https://meu-projeto.exemplo.com.br/instancia3/ → Container porta 5003

Criar/Editar arquivo de configuração do Nginx

sudo nano /etc/nginx/sites-available/meu-projeto.exemplo.com.br

Configuração completa do Nginx com múltiplas instâncias

# HTTP -> HTTPS
server {
    listen 80;
    server_name meu-projeto.exemplo.com.br;
    return 301 https://$host$request_uri;
}

# HTTPS
server {
    listen 443 ssl http2;
    server_name meu-projeto.exemplo.com.br;

    ssl_certificate     /etc/letsencrypt/live/meu-projeto.exemplo.com.br/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/meu-projeto.exemplo.com.br/privkey.pem;

    client_max_body_size 50m;

    # Instância 1 (host 5001)
    location = /instancia1 { return 301 /instancia1/; }
    location ^~ /instancia1/ {
        rewrite ^/instancia1(/.*)$ $1 break;
        proxy_pass http://127.0.0.1:5001;
        proxy_http_version 1.1;
        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;
        proxy_read_timeout 300;
        proxy_connect_timeout 300;
        proxy_send_timeout 300;
    }

    # Instância 2 (host 5002)
    location = /instancia2 { return 301 /instancia2/; }
    location ^~ /instancia2/ {
        rewrite ^/instancia2(/.*)$ $1 break;
        proxy_pass http://127.0.0.1:5002;
        proxy_http_version 1.1;
        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;
        proxy_read_timeout 300;
        proxy_connect_timeout 300;
        proxy_send_timeout 300;
    }

    # Instância 3 (host 5003) - Adicione mais instâncias seguindo este padrão
    location = /instancia3 { return 301 /instancia3/; }
    location ^~ /instancia3/ {
        rewrite ^/instancia3(/.*)$ $1 break;
        proxy_pass http://127.0.0.1:5003;
        proxy_http_version 1.1;
        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;
        proxy_read_timeout 300;
        proxy_connect_timeout 300;
        proxy_send_timeout 300;
    }

    # Raiz do domínio -> redirecionar para primeira instância (opcional)
    location = / { return 301 /instancia1/; }
}
Vantagens desta configuração:
  • ✅ Apenas um certificado SSL necessário
  • ✅ Fácil de adicionar novas instâncias
  • ✅ URLs organizadas e intuitivas
  • ✅ Gerenciamento simplificado

8.3: Exemplo de Configuração Completa

Container Porta URL de Acesso
Container 1 (Original) 5001 https://meu-projeto.exemplo.com.br/instancia1/
Container 2 (Novo) 5002 https://meu-projeto.exemplo.com.br/instancia2/
Container 3 (Futuro) 5003 https://meu-projeto.exemplo.com.br/instancia3/

🔄 Passo 9: Atualizar o Serviço do Nginx

⚠️ IMPORTANTE: Após criar o novo container e configurar o Nginx, você DEVE atualizar o serviço do Nginx para que as mudanças tenham efeito.

9.1: Habilitar o Site (se ainda não fez)

Se você criou um novo arquivo de configuração do Nginx, crie um link simbólico para habilitá-lo:

sudo ln -s /etc/nginx/sites-available/meu-projeto.exemplo.com.br /etc/nginx/sites-enabled/

9.2: Testar a Configuração do Nginx

Antes de recarregar, sempre teste a configuração para garantir que não há erros de sintaxe:

sudo nginx -t

Resposta esperada:

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
⚠️ ATENÇÃO: Se o teste falhar, corrija os erros antes de recarregar o Nginx. Recarregar com configuração errada pode derrubar o serviço.

9.3: Recarregar o Serviço do Nginx

Se o teste passou, recarregue o Nginx para aplicar as mudanças:

sudo systemctl reload nginx
✅ Pronto! O Nginx foi atualizado e agora está servindo o novo container. Você pode acessar através da URL configurada.
💡 Dica

Use sudo systemctl reload nginx ao invés de sudo systemctl restart nginx. O comando reload aplica as mudanças sem desconectar conexões ativas, tornando a atualização transparente para os usuários.


🎉 Conclusão

Após seguir todos os passos:

  1. ✅ Container criado e funcionando
  2. ✅ Reinicialização automática configurada
  3. ✅ Logs verificados sem erros
  4. ✅ Backend acessível na porta configurada
  5. ✅ Nginx configurado e atualizado
  6. ✅ Acessível via domínio configurado
🎉 Seu novo container está pronto para uso!
Lembre-se:
  • Cada instância deve ter um nome único de container
  • Cada instância deve usar uma porta diferente
  • Sempre verifique os logs após criar um novo container
  • Adicionar novas instâncias é só copiar o bloco de location no Nginx
Carregando...