> For the complete documentation index, see [llms.txt](https://docs.ipcheck.ing/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.ipcheck.ing/developer/pt-br/getting-started/deploy-with-docker.md).

# Implantar com Docker

Execute o MyIP com docker run ou Docker Compose e mantenha sua instância atualizada.

Docker é a maneira recomendada de hospedar o MyIP por conta própria. Uma imagem contém as duas metades do app: o frontend Vue compilado e o backend Express.

## Imagens

| Registro          | Imagem                           |
| ----------------- | -------------------------------- |
| Docker Hub        | `jason5ng32/myip:latest`         |
| Pacotes do GitHub | `ghcr.io/jason5ng32/myip:latest` |

Ambos são compilados a partir da mesma versão e publicados para `linux/amd64` e `linux/arm64`. Cada versão também recebe uma tag de versão junto com `:latest` — fixe em uma se quiser atualizações reproduzíveis.

## Execute-o

{% tabs %}
{% tab title="docker run" %}
{% code title="docker run" %}

```bash
docker run -d \
  -p 18966:18966 \
  -e MAXMIND_ACCOUNT_ID="your-account-id" \
  -e MAXMIND_LICENSE_KEY="your-license-key" \
  -e MAXMIND_AUTO_UPDATE="true" \
  -e ALLOWED_DOMAINS="myip.example.com" \
  -e CAIDA_AUTO_UPDATE="true" \
  -e GOOGLE_MAP_API_KEY="your-key" \
  -e IPINFO_API_KEY="your-key" \
  -e SECURITY_RATE_LIMIT="500" \
  -e LOG_LEVEL="info" \
  --name myip \
  --restart always \
  jason5ng32/myip:latest
```

{% endcode %}
{% endtab %}

{% tab title="Docker Compose" %}
{% code title="compose.yaml" %}

```yaml
services:
  myip:
    image: jason5ng32/myip:latest
    container_name: myip
    restart: always
    ports:
      - "18966:18966"
    environment:
      # Obrigatório — veja a configuração do MaxMind
      MAXMIND_ACCOUNT_ID: "your-account-id"
      MAXMIND_LICENSE_KEY: "your-license-key"
      MAXMIND_AUTO_UPDATE: "true"
      # Obrigatório depois que você disponibilizar o MyIP em um domínio
      ALLOWED_DOMAINS: "myip.example.com"
      # Opcional
      CAIDA_AUTO_UPDATE: "true"
      GOOGLE_MAP_API_KEY: "your-key"
      IPINFO_API_KEY: "your-key"
      SECURITY_RATE_LIMIT: "500"
      LOG_LEVEL: "info"
```

{% endcode %}

Inicie com `docker compose up -d`.
{% endtab %}
{% endtabs %}

Apenas `MAXMIND_ACCOUNT_ID`, `MAXMIND_LICENSE_KEY` e `MAXMIND_AUTO_UPDATE` são necessários para obter uma instância funcional. Todo o resto acima é opcional — a lista completa está em [Variáveis de Ambiente](/developer/pt-br/reference/environment-variables.md).

{% hint style="info" %}
Prefira um arquivo .env em vez de segredos inline: coloque as variáveis em `.env` ao lado do seu arquivo compose e o Compose as carrega, ou passe `--env-file .env` para `docker run`.
{% endhint %}

## Portas

O contêiner executa dois processos Node:

| Processo                                                             | Porta                     | Publicado? |
| -------------------------------------------------------------------- | ------------------------- | ---------- |
| Frontend — serve uma SPA compilada e faz proxy `/api` para o backend | `18966` (`FRONTEND_PORT`) | Sim        |
| Backend — a API Express                                              | `11966` (`BACKEND_PORT`)  | Não        |

O frontend faz proxy `/api` para `http://localhost:<BACKEND_PORT>` **dentro do contêiner**, então você nunca publica a porta do backend. Apenas `18966` é exposta pela imagem.

Para servir o MyIP em uma porta de host diferente, altere o lado esquerdo do mapeamento:

```bash
-p 8080:18966
```

Se você alterar `FRONTEND_PORT`, altere o lado direito do mapeamento para corresponder.

## `VITE_*` variáveis não funcionam na imagem pré-compilada

Variáveis cujo nome começa com `VITE_` são lidas pelo Vite no **tempo de build** e incorporadas ao bundle JavaScript. A imagem publicada é compilada no CI sem um `.env` arquivo, então passá-las com `-e` em tempo de execução não tem efeito no frontend.

Isso se aplica a `VITE_CURL_IPV4_DOMAIN`, `VITE_CURL_IPV6_DOMAIN`, `VITE_CURL_IPV64_DOMAIN`, `VITE_GOOGLE_ANALYTICS_ID`, `VITE_SITE_URL` e `VITE_SENTRY_DSN_FRONTEND`. Para defini-los, você precisa compilar sua própria imagem (ou usar [Implantar com Node.js](/developer/pt-br/getting-started/deploy-with-nodejs.md)):

```bash
git clone https://github.com/jason5ng32/MyIP.git
cd MyIP
cp .env.example .env   # preencha os valores VITE_*
docker build -t myip-custom .
```

{% hint style="info" %}
Dois deles são exceções, porque o backend os lê **em tempo de execução** também: `VITE_SENTRY_DSN_FRONTEND` decide se o `/api/monitoring` túnel é montado (veja [Monitoramento de erros](/developer/pt-br/configuration/error-monitoring.md)), e `VITE_SITE_URL` compila o `User-Agent` enviados aos provedores upstream. Se você incorporar qualquer um deles no momento da compilação, passe o mesmo valor para o contêiner em tempo de execução também.
{% endhint %}

## Onde os dados ficam

O MyIP baixa alguns conjuntos de dados em tempo de execução. Eles ficam **dentro do contêiner**, em `/app/common/`:

| Caminho                   | Conteúdo                                                                                            |
| ------------------------- | --------------------------------------------------------------------------------------------------- |
| `/app/common/maxmind-db/` | `GeoLite2-City.mmdb`, `GeoLite2-ASN.mmdb`, além do estado do atualizador e dos arquivos de bloqueio |
| `/app/common/as-org-db/`  | CAIDA `as-org2info.txt` — nomes das organizações ASN                                                |
| `/app/common/as-rel-db/`  | CAIDA `as-rel2.txt` — o grafo de conectividade ASN                                                  |

Nenhum deles é incorporado à imagem (a licença GeoLite2 da MaxMind proíbe redistribuição), e nenhum deles é precioso — todos são baixados novamente em uma inicialização limpa. Recriar o contêiner simplesmente significa que o MyIP os busca novamente na primeira inicialização.

Se você preferir não baixar novamente a cada atualização, monte volumes:

{% code title="compose.yaml (trecho)" %}

```yaml
    volumes:
      - myip-maxmind:/app/common/maxmind-db
      - myip-asorg:/app/common/as-org-db
      - myip-asrel:/app/common/as-rel-db

volumes:
  myip-maxmind:
  myip-asorg:
  myip-asrel:
```

{% endcode %}

## Atualização

{% tabs %}
{% tab title="docker run" %}

```bash
docker pull jason5ng32/myip:latest
docker stop myip && docker rm myip
# depois execute novamente seu comando original `docker run`
```

{% endtab %}

{% tab title="Docker Compose" %}

```bash
docker compose pull
docker compose up -d
```

{% endtab %}
{% endtabs %}

Após uma atualização sem volumes, a primeira inicialização baixa novamente os conjuntos de dados GeoLite2 e CAIDA. Isso leva um momento — o backend espera pelo MaxMind antes de começar a escutar (limitado a 5 minutos).

## Verificando

```bash
docker logs -f myip
```

Uma inicialização saudável mostra os listeners do backend e do frontend, além do carregamento do MaxMind:

```
🚀 Servidor backend pronto em http://localhost:11966
🚀 Servidor de arquivos estáticos pronto em http://localhost:18966
📦 Bancos de dados MaxMind carregados (inicialização)
```

Se você ver `❌ A API do MaxMind retornará 503 até que os bancos de dados sejam carregados com sucesso`, vá para [Configuração da MaxMind](/developer/pt-br/getting-started/maxmind-setup.md#troubleshooting).

## Próximos passos

* [Configuração da MaxMind](/developer/pt-br/getting-started/maxmind-setup.md) — credenciais obrigatórias e como o atualizador automático funciona
* [Proxy reverso e domínios](/developer/pt-br/getting-started/reverse-proxy-and-domains.md) — TLS, Nginx/Caddy, `ALLOWED_DOMAINS`
* [Opções de Segurança](/developer/pt-br/configuration/security-options.md) — limitação de taxa e proteção contra abuso
* [Logs](/developer/pt-br/configuration/logging.md) — nível de log, saída JSON, logs de solicitações HTTP


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://docs.ipcheck.ing/developer/pt-br/getting-started/deploy-with-docker.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
