# Bem-vindo à Discloud

Bem-vindo à documentação oficial da Discloud.

<h2 align="center">✨️ Bem-vindo à Discloud</h2>

<p align="center">Bem-vindo à documentação oficial da Discloud! A Discloud é uma plataforma de hospedagem em nuvem que simplifica o upload e o gerenciamento das suas aplicações, permitindo que você foque no desenvolvimento sem a preocupação com o gerenciamento da infraestrutura.</p>

***

## 🚀 Porquê escolher a Discloud?

<table data-column-title-hidden data-view="cards"><thead><tr><th align="center"></th><th align="center"></th></tr></thead><tbody><tr><td align="center"><strong>Upload Fácil</strong></td><td align="center">Hospede a sua aplicação em minutos usando nosso <a href="/pages/gyLTDC3NWtsMknEHcWxx">painel web intuitivo</a>, <a href="/pages/F5SnInQWQ6gy9Abb6OzU">CLI</a>, <a href="/pages/dIqZSff6Nr6XG9y5RKh1">extensão do VSCode</a> ou até mesmo o nosso <a href="/pages/sfhuXNqcGUVyC5u28vIW">bot no Discord</a>. Não é necessário configurar servidores complexos.</td></tr><tr><td align="center"><strong>Suporte a Várias Linguagens</strong></td><td align="center">Hospede aplicações escritas em <a href="/pages/t0lUOxHCLSzFPoh7xnPC">JavaScript</a>, <a href="/pages/3Iz7B3CE4UJyZpE5N6Q4">Python</a>, <a href="/pages/HzDyPrMlOGLvSwAib9Ay">Java</a>, <a href="/pages/M2aNu3kB6iWxyhEe2sQP">Ruby</a>, <a href="/pages/UlRBLyPpwRhAsnlhcYxa">Go</a>, <a href="/pages/Uzb1dJlJqSSiJptCPhyA">Rust</a>, <a href="/pages/Gx4PHmb0EayusBWaktzm">PHP</a>, entre outras... Nossa plataforma suporta diversas linguagens e fornece diretrizes para garantir operação tranquila.</td></tr><tr><td align="center"><strong>Hospedagem 24/7 (Plano Gratuito Disponível)</strong></td><td align="center">Mantenha seu bot ou site online o tempo todo. Comece com nosso plano gratuito, com opções de upgrade para recursos adicionais conforme seu projeto cresce.</td></tr><tr><td align="center"><strong>Ferramentas e Integrações Poderosas</strong></td><td align="center">Use um ecossistema rico: faça o upload diretamente do VSCode com nossa <a href="/pages/dIqZSff6Nr6XG9y5RKh1">extensão</a>, gerencie aplicações programaticamente com a <a href="/pages/Bg3WFs4UDfXUEI8YQydT">API da Discloud</a> e integre serviços como domínios <a href="/pages/qjyF7yLyxPtKMXC64Z6w">personalizados facilmente</a>.</td></tr><tr><td align="center"><strong>Suporte da Comunidade</strong></td><td align="center">Junte-se à nossa crescente comunidade de desenvolvedores no <a href="https://discord.discloudbot.com/">servidor Discord da Discloud</a>. Encontre ajuda, compartilhe ideias e fique atualizado com os últimos recursos e anúncios.</td></tr></tbody></table>

***

## 🗺️ Guia de Navegação

Esta documentação está organizada em várias seções para ajudá-lo a encontrar informações rapidamente:

<table data-column-title-hidden data-view="cards"><thead><tr><th align="center"></th><th align="center"></th></tr></thead><tbody><tr><td align="center"><strong>Guias de Início e Hospedagem</strong></td><td align="center">Visite a seção <a href="/pages/QuSE9efTwiWaHo7MN0e1">Como Hospedar</a> para guias passo a passo sobre como fazer o upload da sua aplicação através do seu <a href="/pages/gyLTDC3NWtsMknEHcWxx">Painel</a>, <a href="/pages/sfhuXNqcGUVyC5u28vIW">Discord</a>, <a href="/pages/dIqZSff6Nr6XG9y5RKh1">Extensão VSCode</a> ou <a href="/pages/F5SnInQWQ6gy9Abb6OzU">CLI</a>. Descubra também guias específicos para <a href="/pages/u6NCoCYPjhh4PEbkEXLF">Frameworks e Plataformas</a> como Next.js, React, Vue, Svelte e muito mais.</td></tr><tr><td align="center"><strong>Configuração Específica por Linguagem</strong></td><td align="center">A seção <a href="/pages/CC1foDHp921iU9YFLm6Y">Linguagens</a> fornece instruções para várias linguagens de programação, detalhando como estruturar seu projeto para a Discloud e dicas de upload específicas para cada linguagem.</td></tr><tr><td align="center"><strong>Integrações</strong></td><td align="center">Encontre tutoriais sobre como conectar serviços e recursos adicionais às suas aplicações Discloud na seção <a href="/pages/Bg3WFs4UDfXUEI8YQydT">Integrações</a>, incluindo <a href="/pages/qjyF7yLyxPtKMXC64Z6w">domínios personalizados</a>, upload contínuo com <a href="/pages/D9KTRIEJdxiRvKgymVkR">GitHub</a> e <a href="/pages/baOW0AojzF0KiWAjKxFD">configuração de bancos de dados</a>.</td></tr><tr><td align="center"><strong>CLI e Ambiente Local</strong></td><td align="center">Aprenda a instalar e usar o <a href="/pages/F5SnInQWQ6gy9Abb6OzU">CLI da Discloud</a> e a <a href="/pages/dIqZSff6Nr6XG9y5RKh1">extensão do VS Code</a>, ideal para gerenciar suas aplicações diretamente do terminal ou IDE.</td></tr><tr><td align="center"><strong>Referência da API</strong></td><td align="center">Para fins de automação ou integração, a seção de <a href="/pages/Bg3WFs4UDfXUEI8YQydT">API</a> explica como usar a REST API da Discloud, incluindo como obter seu token de API e exemplos de requisições.</td></tr><tr><td align="center"><strong>FAQ e Solução de Problemas</strong></td><td align="center">A seção <a href="/pages/274LRbIiRdSI5Ta3GWg5">FAQ</a> aborda <a href="/pages/O84PndH57B23qmisszTC">Perguntas Gerais</a>, ajudando você a encontrar respostas rápidas para dúvidas comuns. Além disso, a área de <a href="/pages/qLJEfz3pDC7rxNKTZn7N">Solução de Problemas</a> fornece dicas úteis de depuração e soluções para problemas de upload.</td></tr></tbody></table>

Use o menu de navegação para explorar essas seções. Cada página é estruturada com títulos claros e inclui dicas, exemplos de código ou imagens para ilustrar os passos. Você também pode usar a barra de pesquisa para encontrar rapidamente tópicos ou palavras-chave na documentação.

***

## 📩 Precisa de Ajuda?

Para obter mais ajuda, você pode nos contatar através dos seguintes canais:

### 🛠️ Contatos de Suporte e Segurança

* <img src="/files/jSAhdHnAkVnoRGRsyAEw" alt="" data-size="line"> **Suporte Técnico**: Abra um [ticket](https://discord.com/channels/@me/930852077045940224/) ou envie um e-mail para [**support@discloudbot.com**](mailto:support@discloudbot.com)
* <img src="/files/2yCRnfmyzPX1sMqE11jS" alt="" data-size="line"> **Confiança e Segurança**: Denuncie problemas através do e-mail [**abuse@discloudbot.com**](mailto:abuse@discloudbot.com)

### 🌍 Siga-nos nas Redes Sociais

* <img src="/files/Kewz7Nj6q7TQrmjC6UkX" alt="" data-size="line"> **Instagram**: [@discloudbot](https://www.instagram.com/discloudbot/)
* <img src="/files/GM8d7kPFtPNcHloXfwvM" alt="" data-size="line"> **GitHub**: [Discloud](https://github.com/discloud)
* <img src="/files/YKC2ItxNSXBJOWBJBdSt" alt="" data-size="line"> **Twitter (X)**: [@discloudbot](https://twitter.com/discloudbot)
* <img src="/files/HxAk9A9cu501Wwl6VFQc" alt="" data-size="line"> **YouTube**: [Pedro Ricardo](https://youtube.com/c/pedroricardor)
* <img src="/files/VGtQU3yM1g7u7Cc0Cgst" alt="" data-size="line"> **Discord**: [Discloud](https://discord.discloudbot.com/)


# Bots

Aprenda como hospedar bots de Discord na Discloud.

## 🤖 O que é um "Bot" na Discloud?

Na **Discloud**, um **Bot** é qualquer aplicação que roda continuamente mas **não** requer uma porta externa para acesso. Isso normalmente inclui:

* 🤖 **Bots de Discord** (discord.js, discord.py, JDA, etc.)
* 💬 **Bots de Telegram**
* ⚙️ **Scripts de Automação**

***

## ✅ Requisitos

Para hospedar um bot, você deve atender a estes critérios:

{% hint style="success" %}
**Qualquer Plano** – Bots podem ser hospedados em qualquer plano, incluindo o plano Grátis (com limitações).
{% endhint %}

{% hint style="success" %}
[**`discloud.config`**](https://github.com/discloud/docs/blob/portuguese/configurations/discloud.config) – Necessário para a maioria dos métodos de implantação. Se estiver usando o [**Quick Setup**](/how-to-host-using/discord-bot#quick-setup-step-by-step-guide) do Bot do Discord, o bot irá guiá-lo através da configuração.
{% endhint %}

{% hint style="info" %}
**RAM** – Certifique-se de alocar RAM suficiente para as necessidades do seu bot (mín. 100MB).
{% endhint %}

***

## 🚀 Guia de Hospedagem Passo a Passo

{% stepper %}
{% step %}
**📝 Configurar `discloud.config`**

{% hint style="info" %}
Se você estiver usando o **Quick Setup** do Bot do Discord, não precisa criar este arquivo manualmente, o bot do Discord solicitará as informações durante o processo.
{% endhint %}

```ini
NAME=MeuBotLegal
TYPE=bot
MAIN=index.js
RAM=100
VERSION=latest
```

* **`TYPE=bot`**: Identifica a aplicação como um bot/serviço de segundo plano.
* **`MAIN`**: O ponto de entrada da sua aplicação. [Saiba mais sobre o arquivo principal.](/faq/general-questions/what-is-the-main-file)
* **`RAM`**: Memória alocada (mín. 100MB).
  {% endstep %}

{% step %}
**🏗️ Lidando com Processos de Build**

Se o seu bot exigir uma etapa de build (como TypeScript ou Java), você tem duas opções:

{% tabs %}
{% tab title="Discloud Build (Recomendado)" %}
Deixe a Discloud lidar com o processo de build durante a implantação. Adicione o comando `BUILD` ao seu `discloud.config`.

```ini
BUILD=npm run build
START=npm run start
```

{% endtab %}

{% tab title="Build Local" %}
Faça o build do seu projeto localmente e envie os arquivos resultantes.

{% hint style="danger" %}
**Não use uma pasta chamada `dist`** para a saída do seu build local. A Discloud reserva o diretório `dist` para seu processo de build interno. Use um nome diferente como `build`, `out` ou `output`.
{% endhint %}
{% endtab %}
{% endtabs %}

{% hint style="info" %}
Para aplicações Java, você **deve** fazer o build localmente e enviar o arquivo `.jar`. [Veja o guia de build Java](/faq/general-questions/how-to-build-and-package-a-java-application).
{% endhint %}
{% endstep %}

{% step %}
**🚀 Upload e Implantação**

Você pode enviar seu projeto usando qualquer um de nossos métodos suportados:

* 🖥️ [**Dashboard**](/how-to-host-using/dashboard)
* ⌨️ [**CLI**](/how-to-host-using/cli)
* 🟦 [**Extensão do VS Code**](/how-to-host-using/visual-studio-code)
* 🤖 [**Bot do Discord**](/how-to-host-using/discord-bot)
* 🐙 [**Integração com GitHub**](/api-and-integrations/github-integration)

{% hint style="info" %}
Antes de enviar, certifique-se de [comprimir seu projeto corretamente](/faq/general-questions/em-andamento-como-comprimir) e excluir arquivos desnecessários usando um arquivo [`.discloudignore`](/configurations/.discloudignore).
{% endhint %}
{% endstep %}
{% endstepper %}


# Websites e APIs

Aprenda como hospedar sites, APIs e dashboards na Discloud usando subdomínios e domínios personalizados.

## 🌐 O que é um "Site" na Discloud?

Na **Discloud**, qualquer aplicação que use uma **porta de rede** e requeira **acesso externo** é considerada um **Site**. Isso inclui:

* 🖥️ **Websites** (Estáticos ou Dinâmicos)
* 🔌 **APIs** (REST, GraphQL, etc.)
* 📊 **Dashboards** (para Bots ou independentes)
* 🤖 **Bots com Interfaces Web**

Para permitir o acesso externo, a Discloud roteia o tráfego através de um proxy para a **porta 8080** e **host 0.0.0.0** da sua aplicação usando um **subdomínio** (ex: `minhaapp.discloud.app`).

***

## ✅ Requisitos

Para hospedar um site ou API, você deve atender a estes critérios:

{% hint style="success" %}
[**Plano Platinum ou Superior**](https://discloud.com/plans) – Necessário para todas as aplicações `TYPE=site`.
{% endhint %}

{% hint style="success" %}
[**Subdomínio**](/faq/general-questions/how-to-create-a-subdomain) – Você deve registrar um subdomínio único na Discloud.
{% endhint %}

{% hint style="danger" %}
**Porta 8080 & Host 0.0.0.0** – Sua aplicação **deve** ouvir na porta `8080` e host `0.0.0.0` para ser acessível externamente.
{% endhint %}

{% hint style="info" %}
[**`discloud.config`**](https://github.com/discloud/docs/blob/portuguese/configurations/discloud.config) – Necessário para a maioria dos métodos de implantação. Se estiver usando o [**Quick Setup**](/how-to-host-using/discord-bot#quick-setup-step-by-step-guide) do Bot do Discord, o bot irá guiá-lo através da configuração.
{% endhint %}

{% hint style="info" %}
**RAM** – Um mínimo de **512MB** é recomendado para aplicações web.
{% endhint %}

***

## 🚀 Guia de Hospedagem Passo a Passo

{% stepper %}
{% step %}
**📡 Registrar um Subdomínio**

Antes de implantar, você precisa reservar seu endereço único no domínio `.discloud.app`.
{% endstep %}

{% step %}
**📝 Configurar `discloud.config`**

Seu arquivo [`discloud.config`](https://github.com/discloud/docs/blob/portuguese/configurations/discloud.config) diz à Discloud como lidar com seu site. Você deve definir `TYPE=site` e incluir seu `ID`.

{% hint style="info" %}
Se você estiver usando o **Quick Setup** do Bot do Discord, não precisa criar este arquivo manualmente, o bot solicitará o subdomínio e outros detalhes durante o processo.
{% endhint %}

```ini
NAME=MinhaAPIIncrivel
TYPE=site
ID=meu-subdominio-unico
MAIN=src/index.js
RAM=512
VERSION=latest
```

* **`TYPE=site`**: Identifica a aplicação como um serviço web.
* **`ID`**: O nome do seu subdomínio registrado. **Não** inclua `.discloud.app` (ex: use `minha-app`, não `minha-app.discloud.app`).
* **`MAIN`**: O ponto de entrada da sua aplicação.
* **`RAM`**: Memória alocada (mín. 512MB para sites).
  {% endstep %}

{% step %}
**🏗️ Lidando com Processos de Build**

Se a sua aplicação exigir uma etapa de build (como React, Next.js ou TypeScript), você tem duas opções:

{% tabs %}
{% tab title="Discloud Build (Recomendado)" %}
Deixe a Discloud lidar com o processo de build durante a implantação. Adicione o comando `BUILD` ao seu `discloud.config`.

```ini
BUILD=npm run build
START=npm run start
```

{% endtab %}

{% tab title="Build Local" %}
Faça o build do seu projeto localmente e envie os arquivos resultantes.

{% hint style="danger" %}
**Não use uma pasta chamada `dist`** para a saída do seu build local. A Discloud reserva o diretório `dist` para seu processo de build interno. Use um nome diferente como `build`, `out` ou `output`.
{% endhint %}

Neste caso, certifique-se de que seu `MAIN` ou `START` aponte para o ponto de entrada correto dentro da sua pasta de build.
{% endtab %}
{% endtabs %}

{% hint style="info" %}
Para aplicações Java, você **deve** fazer o build localmente e enviar o arquivo `.jar`. [Veja o guia de build Java](/faq/general-questions/how-to-build-and-package-a-java-application).
{% endhint %}
{% endstep %}

{% step %}
**🚀 Upload e Implantação**

Você pode enviar seu projeto usando qualquer um de nossos métodos suportados:

* 🖥️ [**Dashboard**](/how-to-host-using/dashboard)
* ⌨️ [**CLI**](/how-to-host-using/cli)
* 🟦 [**Extensão do VS Code**](/how-to-host-using/visual-studio-code)
* 🤖 [**Bot do Discord**](/how-to-host-using/discord-bot)
* 🐙 [**Integração com GitHub**](/api-and-integrations/github-integration)

{% hint style="info" %}
Antes de enviar, certifique-se de [comprimir seu projeto corretamente](/faq/general-questions/em-andamento-como-comprimir) e excluir arquivos desnecessários usando um arquivo [`.discloudignore`](/configurations/.discloudignore).
{% endhint %}
{% endstep %}
{% endstepper %}


# Frameworks

Guias completos para hospedar diferentes frameworks na Discloud.

## 🎯 Visão geral

Guias para fazer deploy de seus frameworks favoritos na Discloud. Cada um cobre o que você precisa fazer localmente e como colocar rodando na plataforma.

Seja uma API simples, uma app completa ou algo em tempo real – você vai encontrar passos adaptados para seu framework.

***

## 📚 Guias disponíveis

Escolha seu framework da lista e acompanhe:

* **Setup passo a passo** – Estrutura do projeto, arquivos de config, variáveis de ambiente
* **Testes locais** – Como verificar se tudo funciona antes de enviar
* **Deploy** – Coloque seu app online e acessível
* **Troubleshooting** – Problemas comuns e como resolver

***

## 🚀 O básico

1. Escolha seu framework
2. Siga o guia para configurar localmente
3. Teste o build para produção
4. Faça deploy na Discloud

***

## 💡 O que é obrigatório

Não importa qual framework você use:

* **Porta 8080** – Seu app escuta aqui. É assim que o tráfego é roteado.
* **Subdomínio** – [Crie um seguindo este guia](/faq/general-questions/how-to-create-a-subdomain).
* **`discloud.config`** – Fica na raiz do projeto. [Veja o guia de config](https://github.com/discloud/docs/blob/portuguese/configurations/discloud.config).
* **Arquivo de dependências** – `package.json`, `requirements.txt`, o que seu framework usar.

***

## 🔗 Links úteis

* 📖 [Ambiente de desenvolvimento](/development-environment/supported-languages) – Configure Node, Python, etc. localmente
* ⚙️ [discloud.config](https://github.com/discloud/docs/blob/portuguese/configurations/discloud.config) – Todas as opções de config
* 🚀 [Como fazer deploy](/how-to-host-using/dashboard) – Dashboard, Bot, CLI ou VSCode
* 🌐 [Domínios customizados](/api-and-integrations/custom-domain) – Use seu próprio domínio


# Next.js

Guia prático para hospedar aplicações Next.js na Discloud.

## 🧭 Introdução

Este guia passo a passo mostra como preparar, configurar e fazer o deploy de uma aplicação **Next.js** na Discloud.

Existem duas abordagens principais:

* [**Opção A (recomendada)**](#opcao-a-deploy-sem-servidor-custom-next.js-built-in) – usar o `next build` + `next start` **sem servidor custom** (apenas o server interno do Next.js).
* [**Opção B**](#opcao-b-custom-server-com-express) – usar um **servidor custom** com **Express**, útil se você precisa de **rotas extras, middlewares customizados ou integrações específicas**.

Além disso, mostramos uma [**alternativa com export estático**](#alternativa-export-estatico-next.js-como-site-estatico), ideal para sites puramente estáticos.

{% hint style="info" %}
Este guia assume que você já tem um projeto Next.js funcionando localmente.
{% endhint %}

***

## 📋 Requisitos

{% hint style="success" %}
[Plano Platinum ou superior](https://discloud.com/plans) é necessário para hospedar websites ou APIs.
{% endhint %}

{% hint style="success" %}
[Um subdomínio deve ser criado](/faq/general-questions/how-to-create-a-subdomain) antes do deploy.
{% endhint %}

{% hint style="danger" %}
Porta `8080` é obrigatória – As aplicações devem escutar nesta porta.
{% endhint %}

***

## 🧱 Pré-requisitos locais

Antes de continuar, você vai precisar:

* **Node.js** instalado na sua máquina.
* Um **projeto Next.js** criado (ex.: `npx create-next-app`).
* Uma **conta na Discloud** com **subdomínio configurado**.
* Opcionalmente: **Git**, **VSCode** e/ou **CLI da Discloud** para facilitar o fluxo.

Se ainda não tiver familiaridade com o ambiente, confira:

{% content-ref url="/pages/thuK1bBIeHXSDLDjRP24" %}
[NodeJS](/development-environment/local-environment/nodejs)
{% endcontent-ref %}

***

## 🧹 Preparando os arquivos do projeto

Antes de compactar seu projeto em `.zip`, crie um arquivo [**`.discloudignore`**](/configurations/.discloudignore) na raiz do projeto para excluir arquivos e pastas desnecessárias do upload:

```
node_modules/
dist/
.next/
.env
.env.local
.git
package-lock.json
```

{% hint style="info" %}
O arquivo `.discloudignore` funciona de forma semelhante a um `.gitignore`, mas é usado pela Discloud para ignorar arquivos no momento do upload.
{% endhint %}

***

## 📦 `package.json` – scripts recomendados

Dentro do seu [`package.json`](/development-environment/supported-languages/javascript/package-json), garanta que os scripts principais do Next.js estejam definidos. Um exemplo básico:

```json
{
  "scripts": {
    "dev": "next dev",
    "build": "next build",
    "start": "next start -p 8080",
    "export": "next export"
  }
}
```

{% hint style="danger" %}
É importante que o **comando `start` use a porta `8080`** (`next start -p 8080`), pois essa é a porta padrão exigida pela Discloud para websites.
{% endhint %}

***

### 📦 Requisito do TypeScript (importante)

Se o seu projeto usa TypeScript, certifique-se de instalá-lo em `dependencies` e não em `devDependencies`.

Alguns ambientes de deploy instalam apenas dependências de produção, o que pode causar falhas no build se o TypeScript não estiver disponível.

#### ✅ Exemplo correto

```json
{
  "dependencies": {
    "typescript": "^5.0.0"
  }
}
```

#### ❌ Exemplo incorreto

```json
{
  "devDependencies": {
    "typescript": "^5.0.0"
  }
}
```

***

## 📦 Alterando a pasta de build do Next.js (`.next` → `dist`)

Por padrão, o **Next.js** gera os arquivos de build na pasta `.next`.\
Mas em alguns cenários (deploy, padrões de projeto, integração com outras ferramentas), você pode querer usar uma pasta como `dist`.

O Next.js permite alterar a pasta de saída usando a configuração `distDir`.

#### 1. Edite o arquivo `next.config.js`

```js
const nextConfig = {
  distDir: 'dist',
}
```

#### 2. Rode o build normalmente

```bash
npm run build
```

#### 📁 Resultado

Antes:

```
.next/
```

Depois:

```
dist/
```

***

<details open>

<summary>✅ Deploy sem servidor custom (Next.js "built-in")</summary>

Nesta opção, você usa somente o servidor interno do Next (`next start`), sem precisar de `server.js`.

**🔁 Fluxo básico**

1. Rodar o build localmente (opcional, mas recomendado):

   ```bash
   npm run build
   ```
2. Testar localmente:

   ```bash
   npm run start
   ```
3. Se tudo estiver funcionando, preparar o `.zip` e enviar para a Discloud.

**⚙️** [**`discloud.config`**](https://github.com/discloud/docs/blob/portuguese/configurations/discloud.config) **(exemplo)**

```
MAIN=index.ts
TYPE=site
BUILD=npm run build
START=npm run start
RAM=512
VERSION=latest
ID=meu-nextjs-app
```

</details>

<details>

<summary>🧾 Alternativa – Export estático (Next.js como site estático)</summary>

Se o seu projeto não depende de **SSR** ou **API Routes**, você pode usar o `next export` para gerar um site totalmente **estático**.

**📦** [**`package.json`**](/development-environment/supported-languages/javascript/package-json) **(export estático)**

```json
{
  "scripts": {
    "dev": "next dev",
    "build": "next build && next export",
    "start": "npx serve -s out -l 8080"
  }
}
```

**⚙️** [**`discloud.config`**](https://github.com/discloud/docs/blob/portuguese/configurations/discloud.config) **(estático)**

```
MAIN=out/index.html
TYPE=site
BUILD=npm run build
START=npm run start
RAM=256
ID=meu-site-estatico
```

{% hint style="info" %}
Sites estáticos costumam consumir **menos RAM** e são ideais para blogs, landing pages e documentações simples.
{% endhint %}

</details>

***

## 🔐 Variáveis de ambiente

No Next.js, variáveis de ambiente públicas devem começar com `NEXT_PUBLIC_`.

* Defina variáveis pelo **Painel da Discloud**, **CLI** ou **API**.
* Tudo que começa com `NEXT_PUBLIC_` é embutido no bundle durante o **build**.

Exemplo:

```env
NEXT_PUBLIC_API_URL=https://meu-backend.discloud.app
API_SECRET_TOKEN=nao-colocar-no-front
```

Usando em componentes:

```js
const apiUrl = process.env.NEXT_PUBLIC_API_URL;
```

***

## 🗂️ Estrutura final recomendada do projeto

Uma estrutura típica de projeto Next.js para a Discloud pode ser:

```
my-next-app/
├─ discloud.config
├─ .discloudignore
├─ package.json
├─ next.config.js
├─ server.js        # opcional (apenas na Opção B)
├─ public/
└─ app/ ou pages/
	 ├─ page.js
	 └─ api/
			└─ hello.js
```

***

## 🚀 Fazendo o deploy na Discloud

Você pode fazer deploy do seu app Next.js usando qualquer um dos métodos suportados.

{% content-ref url="/pages/gyLTDC3NWtsMknEHcWxx" %}
[Painel de Controle](/how-to-host-using/dashboard)
{% endcontent-ref %}

{% content-ref url="/pages/sfhuXNqcGUVyC5u28vIW" %}
[Bot do Discord](/how-to-host-using/discord-bot)
{% endcontent-ref %}

{% content-ref url="/pages/dIqZSff6Nr6XG9y5RKh1" %}
[Visual Studio Code](/how-to-host-using/visual-studio-code)
{% endcontent-ref %}

{% content-ref url="/pages/F5SnInQWQ6gy9Abb6OzU" %}
[CLI](/how-to-host-using/cli)
{% endcontent-ref %}

***

## 🛠️ Troubleshooting (erros comuns)

|                                       |                                                                                                                                                                                                                  |
| ------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Aplicação não abre / porta errada** | Verifique se o Next está usando a porta `8080` (`next start -p 8080` ou `PORT=8080`).                                                                                                                            |
| **Erro de plano / permissão**         | Confirme se sua conta possui o **plano correto** para websites/APIs.                                                                                                                                             |
| **Subdomínio não configurado**        | Certifique-se de ter seguido o guia de **subdomínio** antes do deploy.                                                                                                                                           |
| **Erros de build**                    | <ul><li>Execute localmente: <code>npm run build</code> e corrija qualquer erro antes de enviar.</li><li>Confira se todas as <strong>dependências</strong> estão listadas no <code>package.json</code>.</li></ul> |
| **Erros ao iniciar (`START`)**        | <ul><li>Verifique se o script <code>start</code> está correto.</li><li>Acompanhe os <strong>logs da Discloud</strong> para ver a mensagem de erro exata.</li></ul>                                               |


# NestJS

Guia prático para hospedar aplicações NestJS na Discloud.

## 🧭 Introdução

Este guia passo a passo mostra como preparar, configurar e fazer o deploy de uma aplicação **NestJS** na Discloud.

O processo envolve compilar seu código TypeScript para a pasta `dist` e executar o JavaScript compilado na porta `8080`. Aplicações NestJS são simples de fazer deploy porque o framework gerencia rotas, injeção de dependências e organização de módulos automaticamente.

***

## 📋 Requisitos

{% hint style="success" %}
[Plano Platinum ou superior](https://discloud.com/plans) é necessário para hospedar websites ou APIs.
{% endhint %}

{% hint style="success" %}
[Um subdomínio deve ser criado](/faq/general-questions/how-to-create-a-subdomain) antes do deploy.
{% endhint %}

{% hint style="danger" %}
Porta `8080` é obrigatória – As aplicações devem escutar nesta porta.
{% endhint %}

***

## 🧱 Pré-requisitos locais

Antes de continuar, você vai precisar:

* **Node.js** instalado na sua máquina.
* Um **projeto NestJS** criado (ex.: `nest new meu-app`).
* Uma **conta na Discloud** com **subdomínio configurado**.
* Opcionalmente: **Git**, **VSCode** e/ou **CLI da Discloud** para facilitar o fluxo.

Se ainda não tiver familiaridade com o ambiente, confira:

{% content-ref url="/pages/thuK1bBIeHXSDLDjRP24" %}
[NodeJS](/development-environment/local-environment/nodejs)
{% endcontent-ref %}

***

## 🧹 Preparando os arquivos do projeto

Antes de compactar seu projeto em `.zip`, crie um arquivo [**`.discloudignore`**](/configurations/.discloudignore) na raiz do projeto para excluir arquivos e pastas desnecessárias do upload:

```
node_modules/
dist/
.env
.env.local
.git
.vscode/
package-lock.json
```

{% hint style="info" %}
O arquivo `.discloudignore` funciona de forma semelhante a um `.gitignore`, mas é usado pela Discloud para ignorar arquivos no momento do upload.
{% endhint %}

***

## 🔧 Configuração TypeScript – `tsconfig.build.json`

Garanta que seu `tsconfig.build.json` (ou `tsconfig.json`) esteja configurado para compilar para a pasta `dist`. Aqui está uma configuração típica:

```json
{
  "extends": "./tsconfig.json",
  "compilerOptions": {
    "outDir": "./dist",
    "rootDir": "./src",
    "composite": false,
    "incremental": false
  },
  "exclude": ["node_modules", "dist"]
}
```

{% hint style="danger" %}
É importante que **`compilerOptions.outDir`** esteja definido como `"dist"`, pois a Discloud procurará pela sua aplicação compilada lá.
{% endhint %}

***

## 🚀 Ponto de entrada principal – `src/main.ts`

Garanta que seu `src/main.ts` escute na **porta 8080** e aceite a porta de variáveis de ambiente. Aqui está uma configuração típica:

```ts
import { NestFactory } from "@nestjs/core";
import { AppModule } from "./app.module";

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  const port = process.env.PORT ? Number(process.env.PORT) : 8080;

  await app.listen(port, "0.0.0.0");
  console.log(`Servidor rodando em http://0.0.0.0:${port}`);
}

bootstrap();
```

{% hint style="danger" %}

#### **Importante**

* **Porta 8080 é obrigatória.** Mesmo que você defina `PORT` no seu arquivo `.env`, ele deve ser `8080`.
* Vincule a `0.0.0.0` (não `localhost`) para que o tráfego externo possa chegar ao seu app.
  {% endhint %}

***

## 📦 `package.json` – scripts recomendados

Dentro do seu [`package.json`](/development-environment/supported-languages/javascript/package-json), garanta que os scripts de build e start estejam corretamente definidos:

```json
{
  "scripts": {
    "start": "node dist/main",
    "start:dev": "nest start --watch",
    "build": "nest build"
  }
}
```

{% hint style="info" %}

* `build` – compila TypeScript para `dist` via o CLI do Nest.
* `start` – executa a aplicação compilada a partir da pasta `dist`.
* `start:dev` – executa em modo watch localmente (não necessário para Discloud).
  {% endhint %}

***

## ⚙️ `discloud.config` – exemplo

Aqui está uma configuração típica para uma aplicação NestJS:

```
MAIN=src/main.ts
TYPE=site
BUILD=npm run build
START=npm run start
RAM=512
VERSION=latest
ID=meu-nestjs-app
```

Para informações detalhadas sobre cada parâmetro de configuração e todas as opções disponíveis, consulte o guia completo:

{% content-ref url="<https://github.com/discloud/docs/blob/portuguese/configurations/discloud.config>" %}
<https://github.com/discloud/docs/blob/portuguese/configurations/discloud.config>
{% endcontent-ref %}

{% hint style="warning" %}
Certifique-se de ajustar o campo `ID` para corresponder ao seu subdomínio registrado no painel da Discloud.
{% endhint %}

***

## 🧪 Testando localmente (build para produção)

Antes de enviar para a Discloud, verifique se seu app compila e executa corretamente:

{% stepper %}
{% step %}
Compile o projeto localmente:

```bash
npm run build
```

Isto gera a pasta `dist` com o JavaScript compilado.
{% endstep %}

{% step %}
Teste o build para produção:

```bash
npm run start
```

Verifique se o servidor inicia e responde às requisições (ex.: via `curl http://localhost:8080`).
{% endstep %}

{% step %}
Pare o servidor e proceda com o deploy.
{% endstep %}
{% endstepper %}

***

## 🔐 Variáveis de ambiente

No NestJS, variáveis de ambiente são tipicamente acessadas via `process.env`:

* Padrões comuns incluem `DATABASE_URL`, `API_KEY`, `REDIS_URL`, etc.

Exemplo em um serviço:

```ts
import { Injectable } from "@nestjs/common";

@Injectable()
export class ConfigService {
  getDatabaseUrl() {
    return process.env.DATABASE_URL || "sqlite:memory";
  }
}
```

{% hint style="info" %}
Para melhor segurança de tipo e validação, considere usar o pacote `@nestjs/config` para gerenciar variáveis de ambiente.
{% endhint %}

***

## 🗂️ Estrutura final recomendada do projeto

Uma estrutura típica de projeto NestJS para a Discloud pode ser:

```
meu-nest-app/
├─ discloud.config
├─ .discloudignore
├─ package.json
├─ tsconfig.json
├─ tsconfig.build.json
├─ src/
│  ├─ main.ts
│  ├─ app.module.ts
│  ├─ app.controller.ts
│  └─ app.service.ts
└─ dist/  (gerado após o build)
```

***

## 🚀 Fazendo o deploy na Discloud

Você pode fazer deploy do seu app NestJS usando qualquer um dos métodos suportados.

{% content-ref url="/pages/gyLTDC3NWtsMknEHcWxx" %}
[Painel de Controle](/how-to-host-using/dashboard)
{% endcontent-ref %}

{% content-ref url="/pages/sfhuXNqcGUVyC5u28vIW" %}
[Bot do Discord](/how-to-host-using/discord-bot)
{% endcontent-ref %}

{% content-ref url="/pages/dIqZSff6Nr6XG9y5RKh1" %}
[Visual Studio Code](/how-to-host-using/visual-studio-code)
{% endcontent-ref %}

{% content-ref url="/pages/F5SnInQWQ6gy9Abb6OzU" %}
[CLI](/how-to-host-using/cli)
{% endcontent-ref %}

***

## 🛠️ Troubleshooting (erros comuns)

|                                       |                                                                                                                                                                                                                  |
| ------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Aplicação não abre / porta errada** | Verifique se o NestJS está escutando na porta `8080` (`process.env.PORT \|\| 8080` em `main.ts`).                                                                                                                |
| **Pasta `dist` não encontrada**       | Verifique se `tsconfig.build.json` possui `"outDir": "./dist"` e execute `npm run build` localmente para confirmar.                                                                                              |
| **Erro de plano / permissão**         | Confirme se sua conta possui o **plano correto** para websites/APIs.                                                                                                                                             |
| **Subdomínio não configurado**        | Certifique-se de ter seguido o guia de **subdomínio** antes do deploy.                                                                                                                                           |
| **Erros de build**                    | <ul><li>Execute localmente: <code>npm run build</code> e corrija qualquer erro antes de enviar.</li><li>Confira se todas as <strong>dependências</strong> estão listadas no <code>package.json</code>.</li></ul> |
| **Erros ao iniciar (`START`)**        | <ul><li>Verifique se o script <code>start</code> está correto.</li><li>Acompanhe os <strong>logs da Discloud</strong> para ver a mensagem de erro exata.</li></ul>                                               |


# Painel de Controle

Aprenda como hospedar sua aplicação de forma rápida e fácil usando o Painel.

## 📁 Preparando os Arquivos do Seu Projeto

Antes de enviar seu projeto, certifique-se de que seus arquivos estão corretamente estruturados de acordo com a linguagem de programação que você está utilizando. Diferentes linguagens possuem requisitos específicos para gerenciamento de dependências, estrutura do projeto e arquivos necessários.

{% content-ref url="/pages/CC1foDHp921iU9YFLm6Y" %}
[Linguagens Suportadas](/development-environment/supported-languages)
{% endcontent-ref %}

### 📌 Requisitos Básicos

* **Código-Fonte do Projeto** – Todos os arquivos necessários para a execução da sua aplicação.
* **Arquivo de Configuração (**[**`discloud.config`**](https://github.com/discloud/docs/blob/portuguese/configurations/discloud.config)**)** – Obrigatório para as configurações de upload.
* **Arquivo de Dependências** (se aplicável):
  * [`package.json`](/development-environment/supported-languages/javascript/package-json) para [**Node.js**](/development-environment/local-environment/nodejs)
  * [`requirements.txt`](/development-environment/supported-languages/python/requirements.txt) para [**Python**](/development-environment/local-environment/python)
  * [`Cargo.toml`](/development-environment/supported-languages/rust/cargo.toml) para [**Rust**](/development-environment/local-environment/rust)
  * [`Gemfile`](/development-environment/supported-languages/ruby/gemfile) para [**Ruby**](/development-environment/local-environment/ruby)

### **🗑️** Excluindo Arquivos Desnecessários

Para **otimizar seu upload**, certifique-se de **remover arquivos desnecessários** antes de compactar seu projeto em um arquivo `.zip`.

#### ❌ Arquivos e pastas comuns a serem excluídos:

```diff
- node_modules
- venv
- .git
- .DS_Store
- __pycache__
```

> Para informações detalhadas sobre os arquivos necessários e configurações apropriadas, consulte a [documentação da linguagem](/development-environment/supported-languages) que você está usando para seu projeto.

***

## 🔑 Autenticação – Como entrar no seu Painel

Antes de fazer o upload da sua aplicação, você precisa **entrar na Discloud**:

{% stepper %}
{% step %}
Visite a [Discloud](https://discloud.com/).
{% endstep %}

{% step %}
Clique em "**Entrar**" e faça login.

<details>

<summary>Acesse o Painel se você já estiver logado.</summary>

![](/files/nDx8dX42K9zT5zN98ZIE)

</details>

<figure><img src="/files/8Wf5Bi3pWiGGpTOmXxVR" alt=""><figcaption></figcaption></figure>
{% endstep %}
{% endstepper %}

***

## 🚀 Hospedando a Sua Aplicação

Depois que seus arquivos estiverem prontos, siga estes passos para enviar e fazer o upload da sua aplicação.

{% stepper %}
{% step %}
Compactando Seu Projeto.

Antes de enviar, compacte todo o seu projeto em um arquivo [.zip](/faq/general-questions/em-andamento-como-comprimir).
{% endstep %}

{% step %}
Enviando para o Painel.

{% stepper %}
{% step %}
Acesse a [página **Applications**](https://discloud.com/dashboard) no Painel da Discloud.
{% endstep %}

{% step %}
Clique em **+ Upload** (canto superior direito). Você será levado à página [**Criar aplicação**](https://discloud.com/dashboard/app/create).
{% endstep %}

{% step %}
Selecione **Upload ZIP** como tipo de deploy e arraste seu arquivo `.zip` para a área de upload ou clique para selecioná-lo.
{% endstep %}

{% step %}
Aguarde a conclusão do envio.
{% endstep %}
{% endstepper %}

{% hint style="warning" %}
Durante o envio, evite atualizar a página para prevenir problemas com sua aplicação. Se isso ocorrer, pode ser necessário remover a aplicação e repetir o processo de envio.
{% endhint %}
{% endstep %}

{% step %}
Processo de Upload.

* Após o envio, a Discloud **iniciará automaticamente sua aplicação**.
* Se seu projeto estiver corretamente configurado e não exceder o **limite de RAM**, ele deverá ficar online em segundos.
* Você pode verificar seu status através do Painel.
  {% endstep %}
  {% endstepper %}

***

## **❓** Ainda precisa de ajuda?

Verifique a [**Seção FAQ**](/faq/where-to-get-help) ou junte-se ao nosso [**Servidor Discord**](https://discord.discloudbot.com/) para suporte.


# Bot do Discord

Aprenda a hospedar rapidamente suas aplicações através do nosso servidor Discord usando nosso bot.

A Discloud permite que você **hospede aplicações diretamente do Discord**, tornando o upload rápido e acessível sem precisar usar um painel ou ferramentas de linha de comando.

***

## 🔑 Verificação de Conta

Antes de implementar aplicações utilizando o **Discloud Bot**, é necessário **verificar a sua conta** no servidor Discord da Discloud.

#### **🤔 Como verificar a sua conta:**

{% stepper %}
{% step %}
Entre no [**Servidor Discord da Discloud**](https://discord.discloudbot.com/).
{% endstep %}

{% step %}
Siga as instruções disponíveis no canal de verificação.
{% endstep %}

{% step %}
Após concluir a verificação, receberá o cargo **`Verified pt-br`**.
{% endstep %}
{% endstepper %}

{% hint style="info" %}
Depois da verificação, terá acesso ao canal [**`#🔌・commands`**](https://discord.com/channels/584490943034425391/1051126795883261962), onde poderá gerir as suas aplicações.
{% endhint %}

***

## 🚀 Hospedando Sua Aplicação

Há **duas maneiras** de fazer o upload de uma aplicação usando o Bot da Discloud:

<table><thead><tr><th width="212">Método</th><th>Melhor Para</th><th>Como Funciona</th></tr></thead><tbody><tr><td><a href="#configuracao-avancada"><strong>⚙️ Configuração Avançada</strong></a></td><td>Usuários que querem uma <strong>upload de um comando</strong> com configurações pré-definidas.</td><td>Configure tudo no arquivo <a href="https://github.com/discloud/docs/blob/portuguese/configurations/discloud.config"><code>discloud.config</code></a> e use <code>.upconfig</code>.</td></tr><tr><td><a href="#configuracao-rapida-guia-passo-a-passo"><strong>⚡ Configuração Rápida (legado)</strong></a></td><td>Usuários que <strong>preferem uma configuração guiada</strong> através dos prompts do bot.</td><td>O bot perguntará os detalhes necessários após executar <code>.up</code>.</td></tr></tbody></table>

{% hint style="warning" %}

#### **Notas Importantes**

* Se seu [**arquivo principal**](/faq/general-questions/what-is-the-main-file) **não estiver no** [**diretório raiz**](/faq/general-questions/what-is-the-root-of-the-project), você **deve** usar Configuração Avançada ou movê-lo para a raiz.
* Se você estiver hospedando um **bot sem ID** (ex.: WhatsApp ou Telegram), use Configuração Avançada e a Discloud gerará o ID automaticamente.
  {% endhint %}

{% tabs %}
{% tab title="📝 Configuração Avançada" %}
{% stepper %}
{% step %}
Crie o arquivo [`discloud.config`](https://github.com/discloud/docs/blob/portuguese/configurations/discloud.config).
{% endstep %}

{% step %}
Comprima seu projeto em um arquivo [`.zip`](/faq/general-questions/em-andamento-como-comprimir).
{% endstep %}

{% step %}
Faça upload do seu projeto.

* Vá para [**`#🔌・commands`**](https://discord.com/channels/584490943034425391/1051126795883261962) no **Servidor Discord da Discloud**.
* Execute o seguinte comando:

  ```
  .upconfig
  ```
* Envie seu arquivo [**.zip**](/faq/general-questions/em-andamento-como-comprimir) quando solicitado.
  {% endstep %}

{% step %}
Sua aplicação será hospedada automaticamente.
{% endstep %}
{% endstepper %}
{% endtab %}

{% tab title="⚡ Configuração Rápida (Guia Passo a Passo)" %}
{% tabs %}
{% tab title="🤖 Bot" %}
{% stepper %}
{% step %}
Prepare seu projeto.

* Certifique-se de que os arquivos da sua aplicação estejam estruturados corretamente.
* Comprima seu projeto em um arquivo [`.zip`](/faq/general-questions/em-andamento-como-comprimir).
  {% endstep %}

{% step %}
Faça upload do seu projeto.

* Vá para [**`#🔌・commands`**](https://discord.com/channels/584490943034425391/1051126795883261962) no **Servidor Discord da Discloud**.
* Execute o seguinte comando:

  ```
  .up
  ```

{% endstep %}

{% step %}
Forneça as Informações Necessárias.

* **Digite o** [**ID da Aplicação**](/faq/general-questions/how-can-i-get-my-discord-bot-id) (para bots do Discord).
* **Digite o** [**Nome do Arquivo Principal**](/faq/general-questions/what-is-the-main-file) (ex.: `index.js`, `main.py`, `main.go`).
* **Especifique a RAM** para seu bot (ex.: `100` para 100MB).

{% hint style="info" %}
Ao especificar a quantidade de RAM, você não precisa incluir unidades como "MB". Basta inserir o valor numérico, por exemplo, "100" para 100MB.

```
          BOTs requerem um mínimo de 100MB de RAM.
```

{% endhint %}
{% endstep %}

{% step %}
Envie seu arquivo [`.zip`](/faq/general-questions/em-andamento-como-comprimir) quando solicitado.
{% endstep %}
{% endstepper %}
{% endtab %}

{% tab title="🌐 Site" %}
{% stepper %}
{% step %}
Prepare seu projeto.

* Certifique-se de que os arquivos da sua aplicação estejam estruturados corretamente.
* Comprima seu projeto em um arquivo [`.zip`](/faq/general-questions/em-andamento-como-comprimir).
  {% endstep %}

{% step %}
Faça upload do seu projeto.

* Vá para [**`#🔌・commands`**](https://discord.com/channels/584490943034425391/1051126795883261962) no **Servidor Discord da Discloud**.
* Execute o seguinte comando:

  ```
  .upsite
  ```

{% endstep %}

{% step %}
Forneça as Informações Necessárias.

* **Escolha um** [**Subdomínio**](/faq/general-questions/how-to-create-a-subdomain).
* **Digite o** [**Nome do Arquivo Principal**](/faq/general-questions/what-is-the-main-file) (ex.: `index.html`, `index.php`).
* **Especifique a RAM** para seu bot (ex.: `512` para 512MB).

{% hint style="info" %}
Ao especificar a quantidade de RAM, você não precisa incluir unidades como "MB". Basta inserir o valor numérico, por exemplo, "512" para 512MB.

```
           Sites requerem um mínimo de 512MB de RAM.
```

{% endhint %}
{% endstep %}

{% step %}
Envie seu arquivo [`.zip`](/faq/general-questions/em-andamento-como-comprimir) quando solicitado.
{% endstep %}
{% endstepper %}
{% endtab %}
{% endtabs %}
{% endtab %}
{% endtabs %}

***

## **❓ Ainda precisa de ajuda?**

Verifique a [**Seção FAQ**](/faq/where-to-get-help) ou junte-se ao nosso [**Servidor Discord**](https://discord.discloudbot.com/) para suporte.


# Visual Studio Code

Como hospedar sua aplicação via a extensão Discloud no Visual Studio Code.

A [**Extensão Discloud para VSCode**](https://marketplace.visualstudio.com/items?itemName=discloud.discloud) permite que você **hospede e gerencie suas aplicações** diretamente do [**Visual Studio Code**](https://code.visualstudio.com/), eliminando a necessidade de usar um painel web ou comandos do bot Discord.

***

## 🛠️ Instalando a Extensão Discloud

{% stepper %}
{% step %}
Abra o VSCode no seu computador.
{% endstep %}

{% step %}
Vá para a aba Extensões (`Ctrl + Shift + X`).

* Na barra de pesquisa, digite: **"Discloud"** e clique em **"Instalar"**.
  {% endstep %}
  {% endstepper %}

***

## 🔑 Fazendo Login na Discloud

Antes de fazer o upload, você precisa fazer login na sua **conta Discloud**.

{% stepper %}
{% step %}
Clique na **aba da Extensão Discloud** na **barra lateral do VSCode**.
{% endstep %}

{% step %}
Clique em **"Enviar seu token Discloud"** e insira seu [**Token da API Discloud**](/faq/general-questions/how-can-i-get-my-discloud-api-token).

<figure><img src="/files/H5932ejw6eQYmxLEntRX" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}
Após o login, suas **aplicações Discloud** aparecerão dentro da aba da extensão.
{% endstep %}
{% endstepper %}

***

## 🚀 Fazendo Upload da Sua Aplicação

Com a **Extensão VSCode**, você pode fazer o upload do seu app em apenas alguns cliques!

{% stepper %}
{% step %}
Preparando seu projeto.

* Certifique-se de que seu projeto contenha todos os arquivos necessários:
  * [**`discloud.config`**](https://github.com/discloud/docs/blob/portuguese/configurations/discloud.config) (arquivo de configuração).
  * **Dependências** necessárias para sua linguagem de programação (ex.: `package.json` para Node.js, `requirements.txt` para Python).
* **Verifique o** [**Guia de Linguagens**](/development-environment/supported-languages) para garantir que seu projeto esteja estruturado corretamente.
  {% endstep %}

{% step %}
Fazendo upload da sua aplicação.

<figure><img src="/files/jj4WCjWL0SN3w3c7djAE" alt=""><figcaption></figcaption></figure>
{% endstep %}
{% endstepper %}

***

## 📌 Dicas e Truques

### 📂 **Usando `.discloudignore` para Excluir Arquivos**

Se você quiser **excluir certos arquivos ou diretórios** do upload, pode criar um arquivo [`.discloudignore`](/configurations/.discloudignore) na raiz do seu projeto.

***

## **❓ Ainda precisa de ajuda?**

Verifique a [**Seção FAQ**](/faq/where-to-get-help) ou junte-se ao nosso [**Servidor Discord**](https://discord.discloudbot.com/) para suporte.


# CLI

Aprenda a hospedar suas aplicações de forma rápida e fácil usando uma de nossas CLIs.

A **Discloud CLI** permite que você **hospede e gerencie suas aplicações** diretamente da linha de comando, fornecendo uma maneira rápida e eficiente de interagir com seu app.

***

## 🔑 **Política de Execução do Windows (Apenas para Usuários do Windows)**

### 🛠️ O que é Política de Execução? <a href="#o-que-e-politica-de-execucao" id="o-que-e-politica-de-execucao"></a>

A Política de Execução protege seu sistema limitando a execução de scripts não assinados. O modo **RemoteSigned** permite que scripts locais sejam executados sem assinaturas, mas requer uma assinatura para scripts baixados da internet.

### ❓ **Como Habilitar a Execução de Scripts**

{% stepper %}
{% step %}
Abra o PowerShell como Administrador.
{% endstep %}

{% step %}
Execute o seguinte comando.

```powershell
Set-ExecutionPolicy RemoteSigned -Scope CurrentUser
```

{% endstep %}

{% step %}
Confirme a alteração digitando `Y` e pressionando Enter.
{% endstep %}

{% step %}
Reinicie o PowerShell e tente executar os comandos da Discloud CLI novamente.
{% endstep %}
{% endstepper %}

***

## 🔧 Instalando a Discloud CLI

{% tabs %}
{% tab title="📦 Node.js" %}
{% stepper %}
{% step %}
Pré-requisito.

Certifique-se de que você tenha [NodeJS](/development-environment/local-environment/nodejs) instalado em seu sistema.
{% endstep %}

{% step %}
Instale a CLI.

```bash
npm install -g discloud-cli
```

{% endstep %}

{% step %}
**Reabra o terminal** para aplicar as alterações.
{% endstep %}

{% step %}
Verifique a Instalação.

Após a instalação, execute o seguinte comando para verificar se a CLI foi instalada corretamente:

```bash
discloud --version
```

{% hint style="success" %}
Se a versão da CLI for exibida, a instalação foi bem-sucedida.
{% endhint %}

{% hint style="info" %}

#### **Atualização da CLI**

Para atualizar a CLI, execute o seguinte comando:

```bash
npm update -g discloud-cli
```

{% endhint %}
{% endstep %}

{% step %}
Login.

Para acessar as funcionalidades da CLI, você precisa fazer login com suas credenciais da Discloud. Execute o seguinte comando e cole seu [Token da API Discloud](/faq/general-questions/how-can-i-get-my-discloud-api-token):

```bash
discloud --login
```

{% endstep %}
{% endstepper %}

{% hint style="info" %}

#### **Repositório Oficial da CLI**

A CLI do NodeJS é um projeto de código aberto. Você pode contribuir, relatar bugs e sugerir melhorias no repositório oficial.

{% embed url="<https://github.com/discloud/cli>" %}
{% endhint %}
{% endtab %}
{% endtabs %}

***

## 🚀 Fazendo Upload da Sua Aplicação

Uma vez instalada e configurada, você pode **fazer o upload da sua aplicação** em apenas algumas etapas.

{% stepper %}
{% step %}
Preparando seu projeto.

* Certifique-se de que seu projeto contenha todos os arquivos necessários:
  * [**`discloud.config`**](https://github.com/discloud/docs/blob/portuguese/configurations/discloud.config) (arquivo de configuração).
  * **Dependências necessárias** para sua linguagem de programação (ex.: [`package.json`](/development-environment/supported-languages/javascript/package-json) para [Node.js](/development-environment/local-environment/nodejs), [`requirements.txt`](/development-environment/supported-languages/python/requirements.txt) para [Python](/development-environment/local-environment/python)).
* **Verifique o** [**Guia de Linguagens**](/development-environment/supported-languages) para garantir que seu projeto esteja estruturado corretamente.
  {% endstep %}

{% step %}
Fazendo upload de sua aplicação.

Para fazer o upload do seu projeto, navegue até a pasta da sua aplicação e execute:

```bash
discloud up
```

* A CLI irá **automaticamente comprimir** seu projeto e fazer upload dele.
* Uma vez concluído, sua aplicação irá **começar a funcionar** na Discloud.

{% hint style="info" %}

#### **Para verificar o status do seu app, use:**

```sh
discloud status
```

{% endhint %}
{% endstep %}
{% endstepper %}

***

## 📌 Dicas e Truques

### ✨ **Usando `discloud init` para Gerar Configuração Automaticamente**

Em vez de criar manualmente o arquivo **`discloud.config`**, você pode gerá-lo automaticamente usando:

```sh
discloud init
```

* Este comando solicita que você insira **detalhes básicos de configuração** (ex.: nome, arquivo principal, RAM, etc.).
* Em seguida, **gera o arquivo** [**`discloud.config`**](https://github.com/discloud/docs/blob/portuguese/configurations/discloud.config) **para você**, facilitando o upload.

### 📂 **Usando `.discloudignore` para Excluir Arquivos**

Se você quiser **excluir certos arquivos ou diretórios** do upload, você pode criar um arquivo [`.discloudignore`](/configurations/.discloudignore) na raiz do seu projeto.

***

## **❓ Ainda precisa de ajuda?**

Verifique a [**Seção FAQ**](/faq/where-to-get-help) ou junte-se ao nosso [**Servidor Discord**](https://discord.discloudbot.com/) para suporte.


# discloud.config

Aprenda tudo sobre o arquivo de configuração para hospedar aplicações na Discloud.

## 📄 O que é `discloud.config` e para que serve?

É um arquivo de configuração que simplifica o processo de upload das suas aplicações na Discloud. Com este arquivo, você pode configurar facilmente as informações para cada aplicação que você faz upload no serviço de hospedagem.

***

## 📂 **Localização do Arquivo `discloud.config`**

**✅ Localização Correta**

O arquivo `discloud.config` <mark style="color:yellow;">**deve estar na**</mark> [<mark style="color:yellow;">**raiz**</mark> <mark style="color:yellow;">do seu projeto</mark>](/faq/general-questions/what-is-the-root-of-the-project).

```bash
your-project/           # ← DIRETÓRIO RAIZ
├── discloud.config     # ✅ OBRIGATÓRIO AQUI
├── package.json        # Arquivo raiz de exemplo
├── src/                # Pasta do código fonte
│   └── index.js        # Arquivo principal da aplicação
├── .gitignore          # Arquivos de configuração
└── README.md           # Documentação
```

**❌ Localizações Inválidas**

Essas localizações causarão falhas no upload:

```bash
your-project/
├── src/
│   └── discloud.config   # ❌ ERRO DE SUBPASTA
├── config/
│   └── discloud.config   # ❌ ERRO DE SUBPASTA
└── .github/
    └── discloud.config   # ❌ ERRO DE PASTA OCULTA
```

***

## 🛠️ Opções de configuração

Veja abaixo todas as opções de configuração para o arquivo `discloud.config`. [Clique aqui para ver alguns exemplos de diferentes aplicações](#exemplos-de-arquivos-discloud.config).

{% tabs %}
{% tab title="📑 Informações" %}
Defina informações para sua aplicação na plataforma de hospedagem, como `NAME` e `AVATAR`. Isso permite que você identifique facilmente sua aplicação no painel ou na extensão do Visual Studio Code. Veja:

<pre class="language-properties" data-title="discloud.config"><code class="lang-properties">NAME=MyApp
AVATAR=https://i.imgur.com/bWhx7OT.png
<a data-footnote-ref href="#user-content-fn-1"># ...</a>
</code></pre>

* `NAME` - determina o nome da sua aplicação na plataforma de hospedagem.
* `AVATAR` - usa a URL da imagem como avatar para sua aplicação na plataforma de hospedagem.
  {% endtab %}

{% tab title="🖥️ Aplicações" %}
Para que sua aplicação inicie corretamente na hospedagem, você precisa definir seu tipo usando a opção `TYPE`, definir o ponto de entrada com a opção `MAIN`, especificar a `RAM` máxima que pode usar com a opção `RAM`, e indicar a [versão da linguagem](/configurations/discloud.config/versions) com a opção `VERSION`. Veja abaixo:

<pre class="language-properties" data-title="discloud.config"><code class="lang-properties"><a data-footnote-ref href="#user-content-fn-1"># ...</a>
TYPE=bot
MAIN=index.js
RAM=100
VERSION=latest
</code></pre>

* `TYPE` - pode ter dois valores: **bot** ou **site**.
* `MAIN` - deve conter o caminho para o [arquivo principal](/faq/general-questions/what-is-the-main-file) da sua aplicação.
* `RAM` - determina a quantidade máxima de RAM disponível para a aplicação.
* `VERSION` - especifica a [versão da linguagem](/configurations/discloud.config/versions) do seu projeto.

{% hint style="info" %}
Se o `TYPE` estiver definido como **site**, você também deve definir a opção `ID` com seu subdomínio. [Veja mais aqui.](/faq/general-questions/how-to-create-a-subdomain)
{% endhint %}

<pre class="language-properties" data-title="discloud.config"><code class="lang-properties"><strong>TYPE=site
</strong><strong>ID=your-subdomain
</strong>MAIN=index.js
RAM=100
VERSION=latest
<a data-footnote-ref href="#user-content-fn-1"># ...</a>
</code></pre>

{% hint style="warning" %}
Para hospedar um **site**, é necessário um mínimo de **512MB de RAM**, junto com um [**Plano Platinum**](https://discloud.com/plans).
{% endhint %}
{% endtab %}

{% tab title="🧩 Recursos" %}
Dependendo da linguagem de programação do seu projeto, você pode definir quais comandos serão executados para o processo de build e o comando para iniciar a aplicação usando as propriedades `BUILD` e `START`.

Para habilitar o reinício automático em caso de falhas, defina a opção `AUTORESTART` como **true** (disponível apenas para [**Plano Platinum**](https://discloud.com/plans) ou superior).

Você pode instalar [pacotes](/configurations/discloud.config/apt) usando a opção `APT`.

<pre class="language-properties" data-title="discloud.config"><code class="lang-properties"><a data-footnote-ref href="#user-content-fn-1"># ...</a>
BUILD=npm run build
START=npm run start
AUTORESTART=true
APT=tools
</code></pre>

* `BUILD` - define o comando ou script para compilar o projeto.
* `START` - define o comando ou script para iniciar o projeto.
* `AUTORESTART` - garante que a aplicação reinicie automaticamente em caso de falha.
* `APT` - permite especificar uma lista de [pacotes](/configurations/discloud.config/apt) a serem instalados.
  {% endtab %}
  {% endtabs %}

{% hint style="warning" %}

#### **Opções obrigatórias no seu `discloud.config`**

**Apenas um campo é obrigatório**:

```ini
MAIN=index.js
```

**Todos os outros campos são opcionais** e usarão padrões inteligentes se omitidos:

* `TYPE` padrão é `bot`
* `RAM` padrão é `100` (MB)
* `VERSION` padrão é `latest`
  {% endhint %}

***

## 🪅 Exemplos de arquivos **`discloud.config`**

> Veja abaixo exemplos de arquivos **discloud.config** para [🤖 Bots Discord](#bots-discord) e [🌐 Sites e APIs](#sites-e-apis).

{% tabs %}
{% tab title="🤖 Bots Discord" %}
{% tabs %}
{% tab title="🟨Bot JS Simples" %}
Bot Discord feito em JavaScript onde o ponto de entrada é o arquivo **index.js** na raiz do projeto.

{% code title="discloud.config" %}

```properties
NAME=Lorito
TYPE=bot
MAIN=index.js
RAM=100
VERSION=latest
```

{% endcode %}
{% endtab %}

{% tab title="🟦 Bot com TS" %}
Bot feito em TypeScript onde o ponto de entrada é o arquivo **index** dentro da pasta **build**. A aplicação iniciará executando o script **start** do arquivo **package.json**.

{% code title="discloud.config" %}

```properties
NAME=Mee8
TYPE=bot
MAIN=src/index.ts
START=npm run start
BUILD=npm run build
RAM=200
VERSION=latest
```

{% endcode %}
{% endtab %}

{% tab title="🐍 Bot com PY" %}
Bot Discord feito em Python onde o ponto de entrada é o arquivo **main.py** na raiz do projeto.

{% code title="discloud.config" %}

```properties
NAME=Dyna
TYPE=bot
MAIN=main.py
RAM=300
VERSION=latest
```

{% endcode %}
{% endtab %}
{% endtabs %}
{% endtab %}

{% tab title="🌐 Sites e APIs" %}
{% tabs %}
{% tab title="📄 Site HTML simples" %}
Site simples com HTML puro, usando o subdomínio **"friendbook"** da conta do usuário.

{% code title="discloud.config" %}

```properties
NAME=Friendbook
TYPE=site
MAIN=index.html
RAM=512
VERSION=latest
ID=friendbook
```

{% endcode %}
{% endtab %}

{% tab title="🟢 API Web com Express" %}
API Web construída com **Express.js**, onde o arquivo de entrada é **index.js** dentro da pasta **server**. A aplicação iniciará executando o script **start** do arquivo **package.json**.

{% code title="discloud.config" %}

```properties
NAME=Crud cinema
TYPE=site
MAIN=server/index.js
START=npm run start
RAM=512
VERSION=latest
ID=moviemark
```

{% endcode %}
{% endtab %}
{% endtabs %}
{% endtab %}
{% endtabs %}

***

## ⚙️ **Opções de configuração**

O arquivo `discloud.config` contém configurações essenciais para sua aplicação Discloud. Abaixo estão as **opções de configuração disponíveis** junto com seus respectivos limites e descrições.

<table><thead><tr><th width="147" align="center">Opção</th><th width="258" align="center">Limite / Valores</th><th align="center">Descrição</th></tr></thead><tbody><tr><td align="center"><strong>NAME</strong></td><td align="center"><code>1 - 30 caracteres</code></td><td align="center">O nome da sua aplicação (usado para fins de exibição).</td></tr><tr><td align="center"><strong>AVATAR</strong></td><td align="center"><code>URL da imagem (.gif, .jpeg, .jpg, .png)</code></td><td align="center">Uma URL para o avatar da aplicação. Formatos suportados: <strong>GIF, JPEG, JPG, PNG</strong>.</td></tr><tr><td align="center"><strong>TYPE</strong></td><td align="center"><code>bot / site</code></td><td align="center">Define se a aplicação é um <strong>bot</strong> ou um <strong>site</strong>.</td></tr><tr><td align="center"><strong>MAIN</strong></td><td align="center"><code>Caminho relativo do arquivo</code></td><td align="center">Especifica o <strong>arquivo principal</strong> que deve ser executado na pasta do projeto.</td></tr><tr><td align="center"><strong>RAM</strong></td><td align="center"><code>100 - 32000 MB</code></td><td align="center">A <strong>quantidade de RAM</strong> alocada para a aplicação (<strong>varia por</strong> <a href="https://discloud.com/plans"><strong>plano</strong></a>).</td></tr><tr><td align="center"><strong>VERSION</strong></td><td align="center"><code>latest / current / suja / specific</code></td><td align="center">Define as opções de <a href="/pages/j2YFbzhAFStNiv5c7k0o"><strong>versionamento</strong></a> para o ambiente e dependências.</td></tr><tr><td align="center"><strong>ID</strong></td><td align="center"><code>Subdomínios definidos pelo usuário</code></td><td align="center">Subdomínio personalizado para sua aplicação (<a href="/pages/0c15rvxxYrbW4keB3fyQ">apenas para sites</a>).</td></tr><tr><td align="center"><strong>BUILD</strong></td><td align="center"><em>(Comandos de build personalizados)</em></td><td align="center">Se especificado, define <strong>comandos para executar antes do início da aplicação</strong> (ex.: instalar dependências).</td></tr><tr><td align="center"><strong>START</strong></td><td align="center"><em>(Comando de início personalizado)</em></td><td align="center">Substitui o comando de início padrão para lançar a aplicação.</td></tr><tr><td align="center"><strong>AUTORESTART</strong></td><td align="center"><code>true / false</code></td><td align="center">Determina se o app deve <strong>reiniciar automaticamente</strong> se travar.</td></tr><tr><td align="center"><strong>VLAN</strong></td><td align="center"><code>true / false</code></td><td align="center">Habilita <strong>Virtual LAN (VLAN)</strong> para rede interna entre aplicações.</td></tr><tr><td align="center"><strong>HOSTNAME</strong></td><td align="center"><em>(Hostname personalizado)</em></td><td align="center">Especifica um hostname personalizado para a aplicação.</td></tr><tr><td align="center"><strong>APT</strong></td><td align="center"><em>(Lista de pacotes)</em></td><td align="center">Instala <strong>dependências Linux adicionais</strong> necessárias pelo seu app. <a href="/pages/aiAK7vff0VniGyzpldPw"><strong>Veja pacotes disponíveis</strong></a>.</td></tr></tbody></table>

[^1]: **Nota:** Os **`...`** apenas indicam a continuação de outras opções anteriores ou subsequentes que não são relevantes para mencionar nesta página.


# APT

Ferramenta Avançada de Pacotes.

**APT (Advanced Package Tool)** refere-se ao instalador de pacotes usado em distribuições Linux baseadas em **Debian** ou **Ubuntu**. No **Discloud**, você pode adicionar alguns desses pacotes ao contêiner da sua aplicação, se necessário.

***

## ❓️ Como usar? <a href="#como-utilizar" id="como-utilizar"></a>

Verifique o pacote necessário para o seu projeto e adicione-o à opção `APT` no arquivo [`discloud.config`](/configurations/discloud.config).

{% hint style="info" %}
Se você precisar usar mais de um pacote, separe-os com **vírgulas e espaços**, conforme mostrado no exemplo abaixo.
{% endhint %}

<pre class="language-properties" data-title="discloud.config"><code class="lang-properties"><a data-footnote-ref href="#user-content-fn-1"># ...</a>
APT=tools, ffmpeg
# ...
</code></pre>

<table data-full-width="false"><thead><tr><th width="155">Nome do pacote</th><th width="280">Descrição</th><th>Dependências Linux<select multiple><option value="4OkvaSR8u1Up" label="libcairo2-dev" color="blue"></option><option value="U4CRgfkAxGHa" label="libpango1.0-dev" color="blue"></option><option value="0dKhVHd6m1WJ" label="libjpeg-dev" color="blue"></option><option value="lCvcZF8RhFSC" label="libgif-dev" color="blue"></option><option value="1gwH4nHJu8YV" label="librsvg2-dev" color="blue"></option><option value="EtXnGIuUXEe8" label="libgbm-dev" color="blue"></option><option value="ZnZ9XK15bWwM" label="fonts-liberation" color="blue"></option><option value="9To1DwTw49St" label="libfreetype-dev" color="blue"></option><option value="cHrfwGWhhvHY" label="tesseract-ocr" color="blue"></option><option value="y5hsoxNT27T4" label="libglib2.0-0" color="blue"></option><option value="ncLahc3Got74" label="libnss3" color="blue"></option><option value="IWNNcNOQSCBE" label="libatk1.0-0" color="blue"></option><option value="vblzhPYszt2Z" label="libatk-bridge2.0-0" color="blue"></option><option value="c6A7kRSFeaXL" label="libcups2" color="blue"></option><option value="AbjTd82gVtWF" label="libdrm2" color="blue"></option><option value="6BZmXytmVV4w" label="libxcomposite1" color="blue"></option><option value="2uAZWdSvn46I" label="libxdamage1" color="blue"></option><option value="oTKlPUcmmtNF" label="libxfixes3" color="blue"></option><option value="krzbRgedz2vj" label="libxrandr2" color="blue"></option><option value="sSMSPteFbkGS" label="libxkbcommon0" color="blue"></option><option value="8y3vy4TjBJAh" label="libasound2" color="blue"></option><option value="H3oyiR5LUhOh" label="libgtk-3-0" color="blue"></option><option value="NKAWIqt4EVM8" label="libxshmfence-dev" color="blue"></option><option value="vsz66QbIXJTx" label="libgbm1" color="blue"></option><option value="zGGIrzJGMoy6" label="libpango-1.0-0" color="blue"></option><option value="WF9vdvAPm9FY" label="libcairo2" color="blue"></option><option value="O82tQ5esBgpJ" label="libdrm-dev" color="blue"></option><option value="oJDvBwpQt5d6" label="libx11-xcb-dev" color="blue"></option><option value="6FPeBDxnky4y" label="curl" color="blue"></option><option value="4bs8dVqCIN7B" label="git" color="blue"></option><option value="zC25ThsZ1ruw" label="wget" color="blue"></option><option value="HMNHEZZmwtuO" label="openssh-client" color="blue"></option><option value="DVP13qTL6byW" label="chromium-driver" color="blue"></option><option value="gO7f94v7GNAq" label="default-jre" color="blue"></option><option value="MZzdI7ChXKNu" label="ffmpeg" color="blue"></option><option value="x3mjELfdDexS" label="libsm6" color="blue"></option><option value="Ih2BKjOOsMxV" label="libxext6" color="blue"></option><option value="BL75zr1vStbw" label="libtool" color="blue"></option><option value="KhE1ETuh5vBl" label="cmake" color="blue"></option><option value="K6b2jEaQogHj" label="make" color="blue"></option><option value="Z3rD2rTt3dCn" label="libgl1-mesa-glx" color="blue"></option><option value="Whcs4oK7qGI1" label="pkg-config" color="blue"></option><option value="DrwY1ppGJKFx" label="libssl-dev" color="blue"></option><option value="acYSdqQjkTKZ" label="default-mysql-client" color="blue"></option><option value="lkRt3tAcGJAm" label="unixodbc" color="blue"></option></select></th></tr></thead><tbody><tr><td>tools</td><td>Ferramentas úteis e essenciais para a maioria dos apps.</td><td><span data-option="6FPeBDxnky4y">curl, </span><span data-option="4bs8dVqCIN7B">git, </span><span data-option="zC25ThsZ1ruw">wget, </span><span data-option="HMNHEZZmwtuO">openssh-client</span></td></tr><tr><td>canvas</td><td>Dependências necessárias para o funcionamento adequado do <strong>Canvas</strong>.</td><td><span data-option="4OkvaSR8u1Up">libcairo2-dev, </span><span data-option="U4CRgfkAxGHa">libpango1.0-dev, </span><span data-option="0dKhVHd6m1WJ">libjpeg-dev, </span><span data-option="lCvcZF8RhFSC">libgif-dev, </span><span data-option="1gwH4nHJu8YV">librsvg2-dev, </span><span data-option="EtXnGIuUXEe8">libgbm-dev, </span><span data-option="ZnZ9XK15bWwM">fonts-liberation, </span><span data-option="9To1DwTw49St">libfreetype-dev</span></td></tr><tr><td>tesseract</td><td><strong>Tesseract OCR</strong> é um mecanismo de reconhecimento óptico de caracteres de código aberto usado para extrair texto de imagens. Suporta múltiplos idiomas e pode ser treinado para reconhecimento personalizado.</td><td><span data-option="cHrfwGWhhvHY">tesseract-ocr</span></td></tr><tr><td>puppeteer</td><td>Dependências necessárias para o funcionamento adequado do <strong>Puppeteer</strong>.</td><td><span data-option="y5hsoxNT27T4">libglib2.0-0, </span><span data-option="ncLahc3Got74">libnss3, </span><span data-option="IWNNcNOQSCBE">libatk1.0-0, </span><span data-option="vblzhPYszt2Z">libatk-bridge2.0-0, </span><span data-option="c6A7kRSFeaXL">libcups2, </span><span data-option="AbjTd82gVtWF">libdrm2, </span><span data-option="6BZmXytmVV4w">libxcomposite1, </span><span data-option="2uAZWdSvn46I">libxdamage1, </span><span data-option="oTKlPUcmmtNF">libxfixes3, </span><span data-option="krzbRgedz2vj">libxrandr2, </span><span data-option="vsz66QbIXJTx">libgbm1, </span><span data-option="sSMSPteFbkGS">libxkbcommon0, </span><span data-option="zGGIrzJGMoy6">libpango-1.0-0, </span><span data-option="WF9vdvAPm9FY">libcairo2, </span><span data-option="8y3vy4TjBJAh">libasound2, </span><span data-option="H3oyiR5LUhOh">libgtk-3-0, </span><span data-option="NKAWIqt4EVM8">libxshmfence-dev, </span><span data-option="O82tQ5esBgpJ">libdrm-dev, </span><span data-option="EtXnGIuUXEe8">libgbm-dev, </span><span data-option="oJDvBwpQt5d6">libx11-xcb-dev</span></td></tr><tr><td>selenium</td><td>Estrutura de automação de navegador.</td><td><span data-option="DVP13qTL6byW">chromium-driver</span></td></tr><tr><td>java</td><td>Instala o <strong>runtime Java OpenJDK</strong>.</td><td><span data-option="gO7f94v7GNAq">default-jre</span></td></tr><tr><td>ffmpeg</td><td>Uma solução completa para gravação, conversão e transmissão de áudio e vídeo <mark style="color:green;">(<strong>necessário para bots de música</strong>)</mark>.</td><td><span data-option="MZzdI7ChXKNu">ffmpeg</span></td></tr><tr><td>libgl</td><td>A <strong>libGL</strong> implementa a <strong>interface GLX</strong>, bem como os principais pontos de entrada da <strong>API OpenGL</strong>.</td><td><span data-option="x3mjELfdDexS">libsm6, </span><span data-option="Ih2BKjOOsMxV">libxext6, </span><span data-option="BL75zr1vStbw">libtool, </span><span data-option="KhE1ETuh5vBl">cmake, </span><span data-option="K6b2jEaQogHj">make, </span><span data-option="Z3rD2rTt3dCn">libgl1-mesa-glx</span></td></tr><tr><td>openssl</td><td>Uma biblioteca criptográfica que implementa os protocolos <strong>SSL</strong> e <strong>TLS</strong>.</td><td><span data-option="Whcs4oK7qGI1">pkg-config, </span><span data-option="DrwY1ppGJKFx">libssl-dev</span></td></tr><tr><td>mysql</td><td>Utilitários de cliente de banco de dados.</td><td><span data-option="acYSdqQjkTKZ">default-mysql-client</span></td></tr><tr><td>unixodbc</td><td>Padrão de conectividade de banco de dados.</td><td><span data-option="lkRt3tAcGJAm">unixodbc</span></td></tr></tbody></table>

[^1]: **Nota:** Os **`...`** apenas indicam a continuação de outras opções anteriores ou subsequentes que não são relevantes para mencionar nesta página.


# Versões

Altere a versão da linguagem da sua aplicação sempre que necessário, seja da mais antiga para a mais recente.

## ⚙️ **Configurando a Versão da Sua Aplicação**

Ao fazer o upload da sua aplicação no **Discloud**, você pode precisar especificar a **versão da linguagem** correta para seu projeto. Você pode fazer isso definindo o parâmetro `VERSION=` dentro do seu arquivo [`discloud.config`](/configurations/discloud.config).

**📌 Como Definir a Versão**

Para definir a versão desejada, adicione a seguinte linha ao seu arquivo de configuração:

<pre class="language-properties" data-title="discloud.config"><code class="lang-properties"><a data-footnote-ref href="#user-content-fn-1"># ...</a>
VERSION=current
# ...
</code></pre>

Substitua `"current"` pela sua versão preferida da lista abaixo.

{% hint style="info" %}
Se você não tiver certeza de qual versão escolher, usar `latest` sempre selecionará a versão mais recente estável **LTS (Long-Term Support)**, que é recomendada para a maioria das aplicações.
{% endhint %}

***

## 📑 **Versões Disponíveis**

<details>

<summary>🟨 JavaScript (Node.js)</summary>

<table><thead><tr><th width="177">Versões Disponíveis</th><th>Informações Adicionais</th></tr></thead><tbody><tr><td><code>latest</code></td><td>Versão mais recente <strong>estável</strong> do <strong>Node.js (LTS)</strong> <mark style="color:green;">(<strong>recomendada</strong>)</mark>.</td></tr><tr><td><code>current</code></td><td>Versão mais recente <strong>disponível</strong> do <strong>Node.js</strong>.</td></tr><tr><td><code>20</code></td><td>Node.js 20.x</td></tr><tr><td><code>18</code></td><td>Node.js 18.x</td></tr><tr><td><code>16.13.2</code></td><td>Node.js 16.13.2</td></tr><tr><td><code>18.x.x</code></td><td>Versão estável alternativa do Node.js 18</td></tr><tr><td><code>14.18.3</code></td><td>Node.js 14.18.3 (descontinuado)</td></tr><tr><td><code>legacy</code></td><td>Versão legada mais antiga do Node.js.</td></tr><tr><td><code>suja</code></td><td>Versão mais pesada do <code>latest</code> com <strong>pacotes APT pré-instalados</strong>. Recomendado apenas como <strong>último recurso</strong>.</td></tr></tbody></table>

</details>

<details>

<summary>🐍 Python</summary>

<table><thead><tr><th width="178">Versões Disponíveis</th><th>Informações Adicionais</th></tr></thead><tbody><tr><td>latest</td><td>Versão mais recente <strong>estável</strong> do <strong>Python (LTS)</strong> <mark style="color:green;">(<strong>recomendada</strong>)</mark>.</td></tr><tr><td>3.11</td><td>Python 3.11</td></tr><tr><td>3.10</td><td>Python 3.10</td></tr><tr><td>3.9</td><td>Python 3.9</td></tr><tr><td>3.9.10</td><td>Python 3.9.10</td></tr><tr><td>2.7</td><td>Python 2.7 (descontinuado)</td></tr><tr><td>legacy</td><td>Versão legada mais antiga do Python.</td></tr><tr><td><code>suja</code></td><td>Versão mais pesada do <code>latest</code> com <strong>pacotes APT pré-instalados</strong>. Recomendado apenas como <strong>último recurso</strong>.</td></tr></tbody></table>

</details>

<details>

<summary>☕ Java</summary>

<table><thead><tr><th width="180">Versões Disponíveis</th><th>Informações Adicionais</th></tr></thead><tbody><tr><td><code>latest</code></td><td>Versão estável mais recente do <strong>OpenJDK</strong>.</td></tr><tr><td><code>18.x.x</code></td><td>OpenJDK 18</td></tr><tr><td><code>17.x.x</code></td><td>OpenJDK 17</td></tr><tr><td><code>16.x.x</code></td><td>OpenJDK 16</td></tr></tbody></table>

</details>

<details>

<summary>💎 Ruby</summary>

<table><thead><tr><th width="179">Versões Disponíveis</th><th>Informações Adicionais</th></tr></thead><tbody><tr><td><code>latest</code></td><td>Versão estável mais recente do <strong>Ruby</strong> (<strong>recomendada</strong>).</td></tr><tr><td><code>3.1.0</code></td><td>Ruby 3.1.0</td></tr><tr><td><code>2.7.5</code></td><td>Ruby 2.7.5</td></tr></tbody></table>

</details>

<details>

<summary>🐹 Go</summary>

<table><thead><tr><th width="179">Versões Disponíveis</th><th>Informações Adicionais</th></tr></thead><tbody><tr><td><code>latest</code></td><td>Versão estável mais recente do <strong>Go</strong> (<strong>recomendada</strong>).</td></tr><tr><td><code>1.16.13</code></td><td>Go 1.16.13</td></tr><tr><td><code>1.7.6</code></td><td>Go 1.7.6</td></tr></tbody></table>

</details>

<details>

<summary>🐘 PHP</summary>

<table><thead><tr><th width="180">Versões Disponíveis</th><th>Informações Adicionais</th></tr></thead><tbody><tr><td><code>latest</code></td><td>Versão estável mais recente do <strong>PHP</strong> (<strong>recomendada</strong>).</td></tr></tbody></table>

</details>

<details>

<summary>🦀 Rust</summary>

<table><thead><tr><th width="187">Versões Disponíveis</th><th>Informações Adicionais</th></tr></thead><tbody><tr><td><code>latest</code></td><td>Versão estável mais recente do <strong>Rust</strong> (<strong>recomendada</strong>).</td></tr><tr><td><code>suja</code></td><td>Versão mais pesada do <code>latest</code> com <strong>pacotes APT pré-instalados</strong>. Recomendado apenas como <strong>último recurso</strong>.</td></tr></tbody></table>

</details>

[^1]: **Nota:** Os **`...`** indicam apenas a continuação de outras opções anteriores ou subsequentes que não são relevantes para mencionar nesta página.


# VLAN

Habilite redes privadas entre aplicações Discloud usando VLAN e HOSTNAME na Discloud.config.

## 🧾 Visão Geral

O recurso VLAN permite que múltiplas aplicações Discloud se comuniquem por uma rede privada isolada (container-para-container) sem expor serviços internos publicamente. Cenários típicos:

| Serviço        | Propósito                 | Exemplo                                  |
| -------------- | ------------------------- | ---------------------------------------- |
| API Backend    | Lógica de negócio         | App `api` chamando banco de dados        |
| Banco de Dados | Armazenamento persistente | Modelo ou container MongoDB / PostgreSQL |
| Cache          | Dados de baixa latência   | Instância Redis                          |

{% hint style="info" %}
O tráfego permanece dentro da infraestrutura Discloud. Nenhum ingresso público é criado para serviços acessados apenas via hostname privado.
{% endhint %}

***

## ⚙️ Configuração ([discloud.config](/configurations/discloud.config))

Adicione as seguintes chaves a cada aplicação que deve participar da rede privada:

<pre class="language-properties" data-title="discloud.config"><code class="lang-properties"><a data-footnote-ref href="#user-content-fn-1"># ...</a>
NAME=Meu Servidor Mongo
VLAN=true
HOSTNAME=mymongoserver
#       |      ^     |
#       |      Nome da rede privada para esta aplicação
</code></pre>

| Chave      | Obrigatório | Descrição                                                       |
| ---------- | ----------- | --------------------------------------------------------------- |
| `VLAN`     | Sim         | Habilita rede privada para a aplicação                          |
| `HOSTNAME` | Recomendado | Alias de hostname personalizado para outras apps acessarem esta |

{% hint style="warning" %}
Se duas apps definirem o mesmo HOSTNAME, o comportamento é indefinido. Mantenha hostnames únicos e em minúsculas (letras, dígitos, hífens).
{% endhint %}

***

## 🧷 Exemplo: Serviço MongoDB + Backend

App de serviço:

{% code title="discloud.config" %}

```properties
NAME=Serviço Mongo
VLAN=true
HOSTNAME=mymongoserver
```

{% endcode %}

Código de conexão do backend:

{% tabs %}
{% tab title="TypeScript" %}

```typescript
import mongoose from "mongoose";

const uri = "mongodb://mymongoserver:27017/mydatabase";
//                            ^
//                            HOSTNAME do app de serviço Mongo

async function main() {
  try {
    await mongoose.connect(uri);
    console.log("Conectado ao MongoDB com sucesso");
  } catch (error) {
    console.error("Erro de conexão MongoDB:", error);
    process.exit(1);
  }
}

main();
```

{% endtab %}

{% tab title="Node (Driver Nativo)" %}

```javascript
import { MongoClient } from "mongodb";
const uri = "mongodb://mymongoserver:27017/mydatabase";
const client = new MongoClient(uri);
await client.connect();
console.log("Ping:", await client.db().command({ ping: 1 }));
```

{% endtab %}

{% tab title="Python" %}

```python
from pymongo import MongoClient
client = MongoClient('mongodb://mymongoserver:27017/mydatabase')
print(client.admin.command('ping'))
```

{% endtab %}
{% endtabs %}

***

## 🧵 Convenções de Hostname

| Regra       | Recomendação       |
| ----------- | ------------------ |
| Caracteres  | Apenas `a-z 0-9 -` |
| Comprimento | 1–25 caracteres    |

***

## 🛡️ Notas de Segurança

| Aspecto    | Detalhe                                                            |
| ---------- | ------------------------------------------------------------------ |
| Isolamento | Apenas apps que você hospeda com VLAN habilitado podem se alcançar |
| Exposição  | Nenhuma publicação automática de porta pública                     |
| Segredos   | Ainda armazene credenciais via variáveis de ambiente               |
| Princípio  | Desabilite VLAN em apps que não precisam de acessibilidade interna |

{% hint style="success" %}
Combine VLAN com credenciais de escopo de ambiente para menor privilégio.
{% endhint %}

[^1]: **Nota:** Os **`...`** apenas indicam a continuação de outras opções anteriores ou subsequentes que não são relevantes para mencionar nesta página.


# .discloudignore

Aprenda a configurar o arquivo .discloudignore para otimizar o envio de projetos, excluindo arquivos e pastas desnecessários durante uploads e commits na Discloud.

## ❓ **O que é `.discloudignore`?**

O arquivo `.discloudignore` especifica arquivos e diretórios a serem excluídos ao fazer upload da sua app para a Discloud. Ao contrário do `.gitignore`, ele tem uma sintaxe mais simples: **você lista nomes exatos de arquivos/diretórios para ignorar** (sem wildcards como `*.log` ou barras finais para pastas).

📌 **Por que usar `.discloudignore`?**\
✔ **Reduz o tamanho do upload** – Evita que arquivos desnecessários sejam enviados.\
✔ **Acelera uploads** – Menos dados significam **processamento mais rápido**.\
✔ **Mantém uploads limpos** – Impede que arquivos sensíveis ou desnecessários sejam incluídos.

🔑 **Principais diferenças do `.gitignore`**\
\&#xNAN;**• Sem barras finais** para diretórios (use `node_modules`, não `node_modules/`).\
\&#xNAN;**• Sem wildcards** – Especifique nomes de arquivos exatos (ex.: use `error.log`, não `*.log`).\
\&#xNAN;**• Sem padrões avançados** – Apenas exclusões básicas linha por linha são suportadas.

***

## 📂 **Localização do Arquivo**

O arquivo `.discloudignore` <mark style="color:yellow;">**deve estar na**</mark> [<mark style="color:yellow;">**raiz**</mark> <mark style="color:yellow;">do seu projeto</mark>](/faq/general-questions/what-is-the-root-of-the-project).

📌 **Exemplo de estrutura de projeto:**

```
/my-project
 ├── src/             ❌ (ignorado)
 ├── node_modules/    ❌ (ignorado)
 ├── discloud/        ❌ (ignorado)
 ├── config/          ❌ (ignorado)
 ├── .discloudignore ✅
 ├── discloud.config
 ├── index.js
 └── package.json
```

***

## 📄 **Exemplo Geral de Uso**

Aqui está um **exemplo genérico** do que você pode querer excluir nos seus projetos:

{% code title=".discloudignore" %}

```ini
# Ignorar diretórios
.git
.vscode
.idea
cache

# Ignorar arquivos do SO
.DS_Store
Thumbs.db

# Ignorar arquivos específicos
secrets.env
debug.log
```

{% endcode %}

***

## 📂 **Exemplos Comuns por Linguagem**

<details>

<summary>🟨 JavaScript (Node.js)</summary>

{% code title=".discloudignore" %}

```ini
# Dependências
node_modules

# Logs
npm-debug.log
yarn-error.log
pnpm-debug.log

# Saídas de build
dist
build
```

{% endcode %}

</details>

<details>

<summary>🐍 Python</summary>

{% code title=".discloudignore" %}

```ini
# Arquivos compilados em bytecode
__pycache__

# Ambientes virtuais
venv
.env
```

{% endcode %}

</details>

<details>

<summary>☕ Java</summary>

{% code title=".discloudignore" %}

```ini
# Arquivos de build
target
out
build

# Arquivos de projeto IDE
.idea

# Cache Maven e Gradle
.m2
.gradle
```

{% endcode %}

</details>

<details>

<summary>💎 Ruby</summary>

{% code title=".discloudignore" %}

```ini
# Dependências
.bundle
vendor/bundle

# Logs e caches
log
tmp
```

{% endcode %}

</details>

<details>

<summary>🐹 Go</summary>

{% code title=".discloudignore" %}

```ini
# Build e arquivos binários
bin
pkg

# Cache de módulos Go
.gomodcache
```

{% endcode %}

</details>

<details>

<summary>🐘 PHP</summary>

{% code title=".discloudignore" %}

```ini
# Dependências Composer
vendor
```

{% endcode %}

</details>

<details>

<summary>🦀 Rust</summary>

{% code title=".discloudignore" %}

```ini
# Saída de build
target

# Arquivos de lock Cargo
Cargo.lock
```

{% endcode %}

</details>


# Puppeteer

Saiba como configurar o Puppeteer na Discloud, incluindo dependências e ajustes de RAM, para garantir o funcionamento correto em ambientes de containers.

## 📌 **Requisitos**

Para usar **Puppeteer** na Discloud, é recomendado um mínimo de **512 MB de RAM** para tarefas básicas. No entanto, dependendo da complexidade da sua aplicação, **mais RAM** pode ser necessária.

{% hint style="warning" %}
**Se o Puppeteer não funcionar corretamente (ex.: nenhum código QR nos logs, travamentos), aumente a RAM alocada!**
{% endhint %}

***

## 📦 **Adicionando Puppeteer**

O Puppeteer requer dependências adicionais do sistema. Você deve adicionar **`puppeteer`** ao campo [`APT`](/configurations/discloud.config/apt) no seu arquivo [**`discloud.config`**](https://github.com/discloud/docs/blob/portuguese/configurations/discloud.config).

<pre class="language-ini" data-title="discloud.config"><code class="lang-ini"><a data-footnote-ref href="#user-content-fn-1"># ...</a>
APT=tools, puppeteer
# ...
</code></pre>

***

## ⚙️ **Configurando Puppeteer**

Como **Puppeteer é executado em um ambiente containerizado**, você deve adicionar o argumento `--no-sandbox` para garantir que funcione corretamente.

```javascript
const puppeteer = require("puppeteer");

(async () => {
  const browser = await puppeteer.launch({
    args: ["--no-sandbox"],
  });

  const page = await browser.newPage();
  await page.goto("https://example.com");

  console.log(await page.title());
  await browser.close();
})();
```

{% hint style="info" %}

#### **Por que `--no-sandbox`?**

Executar Puppeteer dentro de um container **requer desabilitar o sandbox** para impedir que restrições de segurança bloqueiem a execução.
{% endhint %}

***

## ⚙️ **Usando Puppeteer com `whatsapp-web.js`**

Como [**`whatsapp-web.js`**](https://wwebjs.dev/) também usa **Puppeteer** para geração de código QR e interações em segundo plano, você deve **incluir `--no-sandbox`** na sua configuração.

```javascript
const { Client } = require("whatsapp-web.js");

const client = new Client({
  puppeteer: {
    args: ["--no-sandbox"],
  },
});

client.initialize();
```

{% hint style="info" %}

#### **Solução de Problemas com Código QR:**

* Se o **código QR não aparecer** nos logs da Discloud, **aumente a RAM alocada**.
* Quanto mais complexas suas interações com o WhatsApp, **mais RAM o Puppeteer precisará** para funcionar adequadamente.
  {% endhint %}

[^1]: **Note:** The **`...`** only indicate the continuation of other previous or subsequent options that are not relevant to mention on this page.


# Biblioteca NPM

A biblioteca oficial da Discloud NPM que simplifica a interação com a API da Discloud, permitindo gerenciar suas aplicações programaticamente com JavaScript/TypeScript.

## 📦 O que é discloud.app?

**discloud.app** é a biblioteca oficial **Node.js** para interagir com a **API da Discloud**. Esta poderosa biblioteca permite gerenciar suas aplicações programaticamente, realizar uploads, monitorar status, controlar o ciclo de vida da aplicação e muito mais, tudo a partir de seus projetos JavaScript ou TypeScript.

## ✨ Principais Recursos

<table data-column-title-hidden data-view="cards"><thead><tr><th align="center"></th><th align="center"></th></tr></thead><tbody><tr><td align="center"><strong>🚀 Gerenciamento de Aplicações</strong></td><td align="center">Faça upload, atualização, início, parada, reinício e exclusão de suas aplicações com chamadas simples da API.</td></tr><tr><td align="center"><strong>📊 Monitoramento em Tempo Real</strong></td><td align="center">Obtenha status da aplicação, visualize logs, verifique uso de recursos e monitore métricas de performance.</td></tr><tr><td align="center"><strong>👥 Gerenciamento de Equipe</strong></td><td align="center">Gerencie moderadores de aplicações, permissões e controles de acesso colaborativo.</td></tr><tr><td align="center"><strong>⚙️ Configuração Avançada</strong></td><td align="center">Gerencie alocação de RAM, pacotes APT, variáveis de ambiente e configurações personalizadas.</td></tr><tr><td align="center"><strong>📁 Operações de Arquivo</strong></td><td align="center">Suporte para múltiplos formatos de arquivo incluindo streams, buffers e caminhos diretos de arquivo.</td></tr><tr><td align="center"><strong>🔒 Autenticação Segura</strong></td><td align="center">Gerenciamento integrado de tokens e comunicação segura da API com tratamento de erros.</td></tr></tbody></table>

## 🔗 Links Úteis

* **📖** [**Documentação da API**](/api-and-integrations/api-overview) - Documentação completa do TypeDoc
* **🐙** [**Repositório GitHub**](https://github.com/discloud/discloud.app) - Código fonte e issues
* **📦** [**Pacote NPM**](https://www.npmjs.com/package/discloud.app) - Download e informações de versão

## 🚀 Início Rápido

Pronto para começar? Confira nossos guias abrangentes:

<table data-card-size="large" data-view="cards"><thead><tr><th data-card-target data-type="content-ref"></th><th align="center"></th><th data-hidden></th><th data-hidden></th><th data-hidden></th></tr></thead><tbody><tr><td><a href="/pages/vBSCMyB4a8FjFN0DVu5p">/pages/vBSCMyB4a8FjFN0DVu5p</a></td><td align="center">Aprenda como instalar, configurar e autenticar com a biblioteca.</td><td></td><td></td><td></td></tr><tr><td><a href="/pages/7K39sUUpGMnzPbzXZ7rS">/pages/7K39sUUpGMnzPbzXZ7rS</a></td><td align="center">Explore exemplos práticos e casos de uso comuns para todos os recursos da biblioteca.</td><td></td><td></td><td></td></tr></tbody></table>

## 📋 Pré-requisitos

Antes de usar a biblioteca discloud.app, certifique-se de ter:

✅ **Gerenciador de pacotes NPM, Yarn, PNPM ou Bun**\
✅ **Token da API da Discloud** ([Saiba como obter o seu aqui](/faq/general-questions/how-can-i-get-my-discloud-api-token))

## 💡 Por Que Usar discloud.app?

Seja você construindo **scripts de automação**, **pipelines CI/CD**, **dashboards de monitoramento** ou **ferramentas administrativas**, a biblioteca discloud.app oferece:

* **🎯 API Simples e Intuitiva** - Interface limpa baseada em promises que é fácil de aprender
* **⚡ Alto Desempenho** - Otimizada para velocidade com tratamento eficiente de requisições
* **🛡️ Tratamento de Erros** - Gerenciamento abrangente de erros e suporte a depuração
* **🔄 Desenvolvimento Ativo** - Atualizações regulares

***

## 🆘 Precisa de Ajuda?

Se você encontrar algum problema ou tiver dúvidas:

* 📖 Verifique os [**Exemplos de Uso**](/sdks-and-libraries/python-library/usage-examples) para cenários comuns
* 🐛 Relate bugs nos [**Issues do GitHub**](https://github.com/discloud/discloud.app/issues/new?template=bug.yml)
* 💬 Junte-se à nossa [**Comunidade Discord**](https://discord.discloudbot.com)


# Introdução

Aprenda como instalar, configurar e começar a usar a biblioteca NPM discloud.app para gerenciar sua aplicação Discloud.

## 📦 Instalação

Você pode instalar a biblioteca **discloud.app** usando seu gerenciador de pacotes preferido:

{% tabs %}
{% tab title="NPM" %}

```bash
npm install discloud.app
```

{% endtab %}

{% tab title="Yarn" %}

```bash
yarn add discloud.app
```

{% endtab %}

{% tab title="PNPM" %}

```bash
pnpm add discloud.app
```

{% endtab %}

{% tab title="Bun" %}

```bash
bun add discloud.app
```

{% endtab %}
{% endtabs %}

## 🔑 Obtendo Seu Token da API

Antes de usar a biblioteca, você precisa obter seu **Token da API da Discloud**.

Para instruções detalhadas sobre como obter seu token da API, veja [aqui](/faq/general-questions/how-can-i-get-my-discloud-api-token).

{% hint style="danger" %}
**Mantenha seu token seguro!** Nunca o compartilhe publicamente ou faça commit dele no controle de versão. Armazene-o em variáveis de ambiente ou arquivos de configuração seguros.
{% endhint %}

## 🚀 Configuração Básica

### Configuração de Variáveis de Ambiente

{% stepper %}
{% step %}
Crie um arquivo `.env` na raiz do seu projeto para armazenar seu token da API com segurança:

{% code title=".env" %}

```bash
DISCLOUD_TOKEN=your_api_token_here
```

{% endcode %}
{% endstep %}

{% step %}
Instale o pacote **dotenv** para carregar variáveis de ambiente:

```bash
npm install dotenv
```

{% endstep %}

{% step %}
Então use-o em sua aplicação:

{% code title="index.js" %}

```javascript
require("dotenv").config(); // Carregar variáveis de ambiente
const { discloud } = require("discloud.app");

async function main() {
  try {
    // Autenticar usando variável de ambiente
    await discloud.login(process.env.DISCLOUD_TOKEN);
    console.log("Autenticação bem-sucedida com Discloud!");

    // Sua lógica de aplicação aqui...
  } catch (error) {
    console.error("Falha na autenticação:", error.message);
  }
}

main();
```

{% endcode %}
{% endstep %}
{% endstepper %}

## 🎯 Sua Primeira Chamada da API

Vamos testar a conexão buscando informações sobre suas aplicações:

{% code title="test-connection.js" %}

```javascript
require("dotenv").config(); // Carregar variáveis de ambiente
const { discloud } = require("discloud.app");

async function testConnection() {
  try {
    // Autenticar
    await discloud.login(process.env.DISCLOUD_TOKEN);

    // Buscar todas as suas aplicações
    const apps = await discloud.apps.fetch("all");

    console.log(`Encontradas ${apps.size} aplicações:`);
    apps.forEach((app, id) => {
      console.log(`- ${app.name} (ID: ${id})`);
    });
  } catch (error) {
    console.error("Erro:", error.message);
  }
}

testConnection();
```

{% endcode %}

## 📁 Suporte ao TypeScript

A biblioteca inclui suporte completo ao **TypeScript** com definições de tipo:

{% code title="index.ts" %}

```typescript
import "dotenv/config"; // Carregar variáveis de ambiente
import { discloud, App } from "discloud.app";

async function main(): Promise<void> {
  try {
    await discloud.login(process.env.DISCLOUD_TOKEN!);

    // Buscar uma aplicação específica com suporte completo de tipos
    const app: App = await discloud.apps.fetch("your_app_id");

    console.log(`App: ${app.name}`);
    console.log(`Status: ${app.online ? "Online" : "Offline"}`);
    console.log(`RAM: ${app.ram}MB`);
  } catch (error) {
    console.error("Erro:", error);
  }
}

main();
```

{% endcode %}

***

{% hint style="success" %}
**Pronto para começar!** Você configurou com sucesso a biblioteca discloud.app. Confira [Exemplos de Uso](/sdks-and-libraries/npm-library/usage-examples) para ver o que você pode construir!
{% endhint %}


# Exemplos de Uso

Exemplos e casos de uso para a biblioteca NPM discloud.app, cobrindo gerenciamento de aplicações, monitoramento, operações de equipe e muito mais.

{% hint style="info" %}
**Importante**: Para obter seu Token da API necessário nos exemplos abaixo, veja [aqui](/faq/general-questions/how-can-i-get-my-discloud-api-token).

**Configuração Necessária**: Certifique-se de ter completado o guia [**Introdução**](/sdks-and-libraries/npm-library/getting-started) antes de usar estes exemplos.
{% endhint %}

***

## 👤 Gerenciamento de Usuário

### 📄 Obtendo Informações do Usuário

```javascript
const { discloud } = require("discloud.app");

try {
  const user = await discloud.user.fetch();

  console.log("Informações do usuário:", user);
} catch (error) {
  console.error("Falha ao buscar usuário:", error.message);
}
```

## 📱 Gerenciamento de Aplicações

### 🚀 Fazendo Upload de uma Nova Aplicação

{% tabs %}
{% tab title="Do Caminho do Arquivo" %}

```javascript
const { discloud } = require("discloud.app");

try {
  await discloud.apps.create({
    file: "./my-bot.zip", // Caminho para seu arquivo ZIP
  });

  console.log("Upload bem-sucedido!");
} catch (error) {
  console.error("Upload falhou:", error.message);
}
```

{% endtab %}

{% tab title="Do Buffer/Blob" %}

```javascript
const fs = require("fs");
const { discloud } = require("discloud.app");

try {
  const fileData = fs.readFileSync("./my-bot.zip");

  await discloud.apps.create({
    file: {
      data: fileData, // Buffer ou Blob
      name: "my-bot.zip", // Nome do arquivo original
    },
  });

  console.log("Upload bem-sucedido!");
} catch (error) {
  console.error("Upload falhou:", error.message);
}
```

{% endtab %}

{% tab title="Do Stream" %}

```javascript
const fs = require("fs");
const { discloud, streamToFile } = require("discloud.app");

try {
  const stream = fs.createReadStream("./my-bot.zip");
  const file = await streamToFile(stream, "my-bot.zip");

  await discloud.apps.create({ file });
  console.log("Upload bem-sucedido!");
} catch (error) {
  console.error("Upload falhou:", error.message);
}
```

{% endtab %}
{% endtabs %}

{% hint style="info" %}
**Antes do upload:** Certifique-se de que seu arquivo ZIP contenha o arquivo [`discloud.config`](https://github.com/discloud/docs/blob/portuguese/configuracoes/discloud.config) e siga as [**diretrizes de preparação**](/development-environment/supported-languages/javascript) para sua linguagem.
{% endhint %}

### 🔄 Atualizando (Fazendo Commit) uma Aplicação

{% tabs %}
{% tab title="Caminho do arquivo / URL" %}

```javascript
const { discloud } = require("discloud.app");

await discloud.apps.update("APP_ID", {
  file: "FILE_PATH/FILE_NAME.zip",
});
```

{% endtab %}

{% tab title="Blob | Buffer | File | RawFile | ReadableStream" %}

```javascript
const { discloud } = require("discloud.app");
const fs = require("fs");

await discloud.apps.update("APP_ID", {
  file: {
    data: fs.readFileSync("FILE_PATH/FILE_NAME.zip"),
    name: "FILE_NAME.zip",
  },
});
```

{% endtab %}
{% endtabs %}

### 📱 Buscando Informações da Aplicação

{% tabs %}
{% tab title="Aplicação Única" %}

```javascript
const { discloud } = require("discloud.app");

try {
  const app = await discloud.apps.fetch("your_app_id");
  console.log("Informações da aplicação:", app);
} catch (error) {
  console.error("Falha ao buscar aplicação:", error.message);
}
```

{% endtab %}

{% tab title="Todas as Aplicações" %}

```javascript
const { discloud } = require("discloud.app");

try {
  const apps = await discloud.apps.fetch("all");
  console.log("Aplicações:", apps);
} catch (error) {
  console.error("Falha ao buscar aplicações:", error.message);
}
```

{% endtab %}
{% endtabs %}

### 🗑️ Excluindo Aplicações

```javascript
const { discloud } = require("discloud.app");

try {
  await discloud.apps.delete("your_app_id");
  console.log("Aplicação excluída com sucesso!");
} catch (error) {
  console.error("Falha ao excluir aplicação:", error.message);
}
```

{% hint style="danger" %}
**Aviso:** Excluir uma aplicação é **permanente** e não pode ser desfeito. Certifique-se de fazer backup de seus dados antes da exclusão.
{% endhint %}

***

## ⚡ Controle de Aplicações

### 🟢 Iniciando Aplicações

{% tabs %}
{% tab title="Aplicação Única" %}

```javascript
const { discloud } = require("discloud.app");

try {
  await discloud.apps.start("your_app_id");
  console.log("Aplicação iniciada com sucesso!");
} catch (error) {
  console.error("Falha ao iniciar aplicação:", error.message);
}
```

{% endtab %}

{% tab title="Todas as Aplicações" %}

```javascript
const { discloud } = require("discloud.app");

try {
  await discloud.apps.start("all");
  console.log("Todas as aplicações iniciadas!");
} catch (error) {
  console.error("Falha ao iniciar aplicações:", error.message);
}
```

{% endtab %}
{% endtabs %}

### 🔴 Parando Aplicações

{% tabs %}
{% tab title="Aplicação Única" %}

```javascript
const { discloud } = require("discloud.app");

try {
  await discloud.apps.stop("your_app_id");
  console.log("Aplicação parada com sucesso!");
} catch (error) {
  console.error("Falha ao parar aplicação:", error.message);
}
```

{% endtab %}

{% tab title="Todas as Aplicações" %}

```javascript
const { discloud } = require("discloud.app");

try {
  await discloud.apps.stop("all");
  console.log("Todas as aplicações paradas!");
} catch (error) {
  console.error("Falha ao parar aplicações:", error.message);
}
```

{% endtab %}
{% endtabs %}

### 🔄 Reiniciando Aplicações

{% tabs %}
{% tab title="Aplicação Única" %}

```javascript
const { discloud } = require("discloud.app");

try {
  await discloud.apps.restart("your_app_id");
  console.log("Aplicação reiniciada com sucesso!");
} catch (error) {
  console.error("Falha ao reiniciar aplicação:", error.message);
}
```

{% endtab %}

{% tab title="Todas as Aplicações" %}

```javascript
const { discloud } = require("discloud.app");

try {
  await discloud.apps.restart("all");
  console.log("Todas as aplicações reiniciadas com sucesso!");
} catch (error) {
  console.error("Falha ao reiniciar aplicações:", error.message);
}
```

{% endtab %}
{% endtabs %}

***

## 📊 Monitoramento e Diagnósticos

### 📈 Verificando Status da Aplicação

{% tabs %}
{% tab title="Status de Aplicação Única" %}

```javascript
const { discloud } = require("discloud.app");

try {
  const status = await discloud.apps.status("your_app_id");
  console.log("Status obtido com sucesso!");
} catch (error) {
  console.error("Falha ao obter status:", error.message);
}
```

{% endtab %}

{% tab title="Status de Todas as Aplicações" %}

```javascript
const { discloud } = require("discloud.app");

try {
  const statusMap = await discloud.apps.status("all");
  console.log("Todos os status obtidos com sucesso!");
} catch (error) {
  console.error("Falha ao obter status:", error.message);
}
```

{% endtab %}
{% endtabs %}

### 📋 Visualizando Logs da Aplicação

{% tabs %}
{% tab title="Logs de Aplicação Única" %}

```javascript
const { discloud } = require("discloud.app");

try {
  const logs = await discloud.apps.terminal("your_app_id");
  console.log("Logs obtidos com sucesso!");
} catch (error) {
  console.error("Falha ao obter logs:", error.message);
}
```

{% endtab %}

{% tab title="Logs de Todas as Aplicações" %}

```javascript
const { discloud } = require("discloud.app");

try {
  const logsMap = await discloud.apps.terminal("all");
  console.log("Todos os logs obtidos com sucesso!");
} catch (error) {
  console.error("Falha ao obter logs:", error.message);
}
```

{% endtab %}
{% endtabs %}

### 💻 Enviando Comandos do Terminal

```javascript
const { discloud } = require("discloud.app");

try {
  const result = await discloud.apps.console("your_app_id", "ls -la");
  console.log("Resultado do comando:", result);
} catch (error) {
  console.error("Comando falhou:", error.message);
}
```

### 💾 Operações de Backup

#### 📦 Criando Backups

{% tabs %}
{% tab title="Backup de Aplicação Única" %}

```javascript
const { discloud } = require("discloud.app");

try {
  const backup = await discloud.apps.backup("your_app_id");
  console.log("Backup criado com sucesso!");
} catch (error) {
  console.error("Backup falhou:", error.message);
}
```

{% endtab %}

{% tab title="Backup de Todas as Aplicações" %}

```javascript
const { discloud } = require("discloud.app");

try {
  const backups = await discloud.apps.backup("all");
  console.log("Todos os backups criados com sucesso!");
} catch (error) {
  console.error("Backup falhou:", error.message);
}
```

{% endtab %}
{% endtabs %}

***

## 👥 Gerenciamento de Equipe

### 👨‍💼 Gerenciando Moderadores da Aplicação

{% tabs %}
{% tab title="Buscar Membros da Equipe" %}

```javascript
const { discloud } = require("discloud.app");

try {
  const team = await discloud.appTeam.fetch("your_app_id");
  console.log("Membros da equipe obtidos com sucesso!");
} catch (error) {
  console.error("Falha ao buscar equipe:", error.message);
}
```

{% endtab %}

{% tab title="Adicionar Membro da Equipe" %}

```javascript
const { discloud } = require("discloud.app");

try {
  await discloud.appTeam.create("your_app_id", "user_id", [
    "backup_app", // Pode criar backups
    "commit_app", // Pode atualizar a aplicação
    "edit_ram", // Pode modificar alocação de RAM
    "logs_app", // Pode visualizar logs da aplicação
    "restart_app", // Pode reiniciar a aplicação
    "start_app", // Pode iniciar a aplicação
    "status_app", // Pode visualizar status da aplicação
    "stop_app", // Pode parar a aplicação
  ]);

  console.log("Moderador adicionado com sucesso!");
} catch (error) {
  console.error("Falha ao adicionar moderador:", error.message);
}
```

{% endtab %}

{% tab title="Editar Permissões" %}

```javascript
const { discloud, ModPermissions } = require("discloud.app");

try {
  await discloud.appTeam.edit("your_app_id", "user_id", [
    ModPermissions.backup_app, // Pode criar backups
    ModPermissions.commit_app, // Pode atualizar a aplicação
    ModPermissions.edit_ram, // Pode modificar alocação de RAM
    ModPermissions.logs_app, // Pode visualizar logs da aplicação
    ModPermissions.restart_app, // Pode reiniciar a aplicação
    ModPermissions.start_app, // Pode iniciar a aplicação
    ModPermissions.status_app, // Pode visualizar status da aplicação
    ModPermissions.stop_app, // Pode parar a aplicação
  ]);

  console.log("Permissões atualizadas com sucesso!");
} catch (error) {
  console.error("Falha ao editar permissões:", error.message);
}
```

{% endtab %}

{% tab title="Remover Membro da Equipe" %}

```javascript
const { discloud } = require("discloud.app");

try {
  await discloud.appTeam.delete("your_app_id", "user_id");
  console.log("Moderador removido com sucesso!");
} catch (error) {
  console.error("Falha ao remover moderador:", error.message);
}
```

{% endtab %}
{% endtabs %}

***

## ⚙️ Gerenciamento do Sistema

### 🔧 Gerenciando Alocação de RAM

```javascript
const { discloud } = require("discloud.app");

try {
  await discloud.apps.ram("your_app_id", 512);
  console.log("RAM atualizada com sucesso!");
} catch (error) {
  console.error("Atualização de RAM falhou:", error.message);
}
```

{% hint style="warning" %}

#### **Requisitos de RAM**

* Aplicações bot: mínimo 100MB
* Aplicações website: mínimo 512MB
* Verifique os limites do seu plano antes de aumentar a RAM
  {% endhint %}

### 🎨 Atualizando Perfil da Aplicação

```javascript
const { discloud } = require("discloud.app");

try {
  await discloud.apps.profile("your_app_id", {
    name: "Meu Bot Incrível",
    avatarURL: "https://example.com/avatar.png",
  });

  console.log("Perfil atualizado com sucesso!");
} catch (error) {
  console.error("Atualização de perfil falhou:", error.message);
}
```

{% hint style="info" %}

#### **Detalhes da Atualização do Perfil**

* `name`: Opcional. Novo nome para sua aplicação (máximo 30 caracteres).
* `avatarURL`: Opcional. URL da nova imagem de avatar. Formatos suportados: GIF, JPG, JPEG, PNG.
  {% endhint %}

### 📦 Gerenciamento de Pacotes APT

#### 📥 Instalando Pacotes APT

```javascript
const { discloud } = require("discloud.app");

try {
  await discloud.appApt.install("your_app_id", [
    "tools",
    "canvas",
    "tesseract",
    "puppeteer",
    "selenium",
    "java",
    "ffmpeg",
    "libgl",
    "openssl",
    "mysql",
    "unixodbc",
  ]);

  console.log("Pacotes instalados com sucesso!");
} catch (error) {
  console.error("Instalação falhou:", error.message);
}
```

#### 🗑️ Desinstalando Pacotes APT

```javascript
const { discloud } = require("discloud.app");

try {
  await discloud.appApt.uninstall("your_app_id", ["canvas", "ffmpeg"]);
  console.log("Pacotes desinstalados com sucesso!");
} catch (error) {
  console.error("Desinstalação falhou:", error.message);
}
```


# \[EM ANDAMENTO] Biblioteca Python


# \[EM ANDAMENTO] Introdução


# \[EM ANDAMENTO] Exemplos de Uso


# Linguagens Suportadas

Descubra as principais linguagens de programação suportadas pela Discloud e veja como você pode usar essas linguagens para hospedar facilmente suas aplicações.

A Discloud suporta uma **ampla gama de linguagens de programação**, permitindo que desenvolvedores façam deploy facilmente de [**bots**](/how-to-host/bots)**,** [**websites**](/how-to-host/websites-and-apis)**,** [**APIs**](/how-to-host/websites-and-apis) **e outras aplicações**. Seja você usando linguagens **interpretadas** ou **compiladas**, a Discloud fornece um **processo de deploy contínuo**.

***

## 📑 **Linguagens Disponíveis**

<table data-card-size="large" data-view="cards"><thead><tr><th data-card-target data-type="content-ref"></th><th></th><th data-hidden></th><th data-hidden></th><th data-hidden></th></tr></thead><tbody><tr><td><a href="/pages/t0lUOxHCLSzFPoh7xnPC">/pages/t0lUOxHCLSzFPoh7xnPC</a></td><td>Largamente usado para bots e APIs, especialmente com Node.js.</td><td></td><td></td><td></td></tr><tr><td><a href="/pages/3Iz7B3CE4UJyZpE5N6Q4">/pages/3Iz7B3CE4UJyZpE5N6Q4</a></td><td>Ideal para scripts e bots com frameworks populares como Flask e Django.</td><td></td><td></td><td></td></tr><tr><td><a href="/pages/HzDyPrMlOGLvSwAib9Ay">/pages/HzDyPrMlOGLvSwAib9Ay</a></td><td>Uma escolha sólida para aplicações robustas e escaláveis.</td><td></td><td></td><td></td></tr><tr><td><a href="/pages/M2aNu3kB6iWxyhEe2sQP">/pages/M2aNu3kB6iWxyhEe2sQP</a></td><td>Perfeito para desenvolvedores usando Ruby on Rails e frameworks similares.</td><td></td><td></td><td></td></tr><tr><td><a href="/pages/UlRBLyPpwRhAsnlhcYxa">/pages/UlRBLyPpwRhAsnlhcYxa</a></td><td>Excelente para aplicações de alto desempenho e fácil implementação.</td><td></td><td></td><td></td></tr><tr><td><a href="/pages/Gx4PHmb0EayusBWaktzm">/pages/Gx4PHmb0EayusBWaktzm</a></td><td>Muito popular para desenvolver websites dinâmicos e backends.</td><td></td><td></td><td></td></tr><tr><td><a href="/pages/Uzb1dJlJqSSiJptCPhyA">/pages/Uzb1dJlJqSSiJptCPhyA</a></td><td>Conhecido por sua segurança e alto desempenho, ideal para sistemas críticos.</td><td></td><td></td><td></td></tr></tbody></table>


# Javascript

Guia completo para hospedar aplicações JavaScript na Discloud.

## 📁 **Preparando os Arquivos**

Antes de fazer upload do seu projeto, você deve **excluir arquivos desnecessários** para otimizar o deploy.

#### ❌ **Arquivos a Excluir**

Certifique-se de que os seguintes arquivos e diretórios **não** sejam incluídos no seu [`.zip`](/faq/general-questions/em-andamento-como-comprimir):

```diff
- package-lock.json
- node_modules/
- .cache/
- .git/
```

📌 **Use um arquivo** [**`.discloudignore`**](/configurations/.discloudignore) **para excluir automaticamente esses arquivos.**

🔗 **Precisa de ajuda para configurar seu** [**`package.json`**](/development-environment/supported-languages/javascript/package-json) **ou encontrar o** [**arquivo principal**](/faq/general-questions/what-is-the-main-file)**?**

<details>

<summary>📦 Sobre a pasta dist (apenas TYPE=site)</summary>

{% hint style="info" %}
Para apps `TYPE=site`, **`dist/` é reservada** para a saída do `BUILD`. Se você define `BUILD=...` no [`discloud.config`](https://github.com/discloud/docs/blob/portuguese/configurations/discloud.config), nós geramos a pasta `dist/` pra você. **Não compacte `dist/`** ou envie arquivos para lá.
{% endhint %}

**⚙️ Build automático**

1. `BUILD` no `discloud.config` (ex.: `BUILD=npm run build`).
2. Script gera arquivos em `dist/` (Vite, Vue, etc. já fazem isso).
3. Rodamos `BUILD` antes do `START` e servimos `dist/`.

Exemplo:

```properties
TYPE=site
MAIN=server/index.js
BUILD=npm run build
START=npm run start
RAM=512
VERSION=latest
ID=meusite
```

**👜 Pré-build**

1. Gere a saída em **`build/`** (não use `dist/`).
2. Omitir `BUILD` no `discloud.config`.
3. Aponte `MAIN` para a pasta `build/`.

Exemplo:

```properties
TYPE=site
MAIN=build/server.js
RAM=512
VERSION=latest
ID=meusite
```

</details>

***

### 🌐 **Hospedando Websites e APIs com Express**

Antes de fazer deploy do seu website ou API na Discloud, certifique-se de que você atenda aos seguintes **requisitos**:

{% hint style="success" %}
[Plano Platinum ou superior](https://discloud.com/plans) é necessário para hospedar websites ou APIs.
{% endhint %}

{% hint style="success" %}
[Um subdomínio deve ser criado](/faq/general-questions/how-to-create-a-subdomain) antes do deploy.
{% endhint %}

{% hint style="danger" %}
Porta `8080` é obrigatória – As aplicações devem escutar nesta porta.
{% endhint %}

### ⚙️ **Configurando Express**

```javascript
const express = require("express");
const app = express();

app.get("/", (req, res) => {
  res.send("Olá, Discloud!");
});

const PORT = process.env.PORT || 8080;
app.listen(PORT, () => console.log(`Servidor rodando na porta ${PORT}`));
```

***

## ✍️ Fazendo Deploy **da Sua Aplicação**

Uma vez que seu projeto esteja **configurado e comprimido**, você pode escolher um dos seguintes **métodos de deploy** na Discloud:

<table data-card-size="large" data-view="cards"><thead><tr><th data-card-target data-type="content-ref"></th><th align="center"></th><th data-hidden></th><th data-hidden></th><th data-hidden></th></tr></thead><tbody><tr><td><a href="/pages/gyLTDC3NWtsMknEHcWxx">/pages/gyLTDC3NWtsMknEHcWxx</a></td><td align="center">Faça upload e gerencie sua aplicação via interface web.</td><td></td><td></td><td></td></tr><tr><td><a href="/pages/sfhuXNqcGUVyC5u28vIW">/pages/sfhuXNqcGUVyC5u28vIW</a></td><td align="center">Faça deploy diretamente através dos comandos do bot Discord da Discloud.</td><td></td><td></td><td></td></tr><tr><td><a href="/pages/dIqZSff6Nr6XG9y5RKh1">/pages/dIqZSff6Nr6XG9y5RKh1</a></td><td align="center">Integre com VS Code para gerenciamento contínuo de projetos.</td><td></td><td></td><td></td></tr><tr><td><a href="/pages/F5SnInQWQ6gy9Abb6OzU">/pages/F5SnInQWQ6gy9Abb6OzU</a></td><td align="center">Use a interface de linha de comando para deploy rápido e eficiente.</td><td></td><td></td><td></td></tr></tbody></table>


# package.json

Aprenda como gerar e configurar o arquivo 'package.json', definindo as dependências essenciais para hospedar seu projeto JavaScript na Discloud.

## 🗂️ O que é `package.json`?

O arquivo `package.json` é essencial para gerenciar metadados e dependências de projetos Node.js. Ele garante que as bibliotecas necessárias sejam instaladas automaticamente ao hospedar sua aplicação na Discloud.

***

## 🛠️ Como Criar `package.json`

Para gerar o arquivo `package.json` para seu projeto, siga os passos abaixo:

{% stepper %}
{% step %}
**Abra o terminal no diretório do seu projeto**

No Windows, use **Shift + Clique Direito** e selecione "Abrir PowerShell".
{% endstep %}

{% step %}
**Execute o seguinte comando para criar o `package.json` automaticamente:**

```bash
npm init -y
```

Este comando criará um arquivo `package.json` no diretório do seu projeto.
{% endstep %}
{% endstepper %}

***

## 📝 Estrutura do `package.json`

Após a criação, o arquivo `package.json` deve se parecer com isso:

{% code title="package.json" %}

```json
{
  "name": "discloud",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "dependencies": {}
}
```

{% endcode %}

{% hint style="info" %}
Se você quiser hospedar um bot **Discord.js** ou qualquer outro framework, você precisará adicionar dependências ao `package.json`. Verifique a próxima seção para aprender como fazer isso.
{% endhint %}

***

## 📦 Adicionando Dependências

Para adicionar dependências, use o comando `npm install`, que adicionará automaticamente as bibliotecas necessárias ao `package.json`.

**Exemplo: Instalar `discord.js`**

```bash
npm install discord.js
```

Após instalar, seu `package.json` será automaticamente atualizado para incluir `discord.js` nas dependências:

{% code title="package.json" %}

```json
{
  "name": "discloud",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "dependencies": {
    "discord.js": "^14.0.3"
  }
}
```

{% endcode %}


# Python

Guia completo para hospedar aplicações Python na Discloud.

## 📁 **Preparando os Arquivos**

Antes de fazer upload do seu projeto, você deve **excluir arquivos desnecessários** para otimizar o deploy.

#### ❌ **Arquivos a Excluir**

Certifique-se de que os seguintes arquivos e diretórios **não** sejam incluídos no seu [`.zip`](/faq/general-questions/em-andamento-como-comprimir):

```diff
- .cache/
- .git/
- venv/
```

📌 **Use um arquivo** [**`.discloudignore`**](/configurations/.discloudignore) **para excluir automaticamente esses arquivos.**

🔗 **Precisa de ajuda para configurar seu** [**`requirements.txt`**](/development-environment/supported-languages/python/requirements.txt) **ou encontrar o** [**arquivo principal**](/faq/general-questions/what-is-the-main-file)**?**

***

## ✍️ Fazendo Deploy **da Sua Aplicação**

Uma vez que seu projeto esteja **configurado e comprimido**, você pode escolher um dos seguintes **métodos de deploy** na Discloud:

<table data-card-size="large" data-view="cards"><thead><tr><th data-card-target data-type="content-ref"></th><th align="center"></th><th data-hidden></th><th data-hidden></th><th data-hidden></th></tr></thead><tbody><tr><td><a href="/pages/gyLTDC3NWtsMknEHcWxx">/pages/gyLTDC3NWtsMknEHcWxx</a></td><td align="center">Faça upload e gerencie sua aplicação via interface web.</td><td></td><td></td><td></td></tr><tr><td><a href="/pages/sfhuXNqcGUVyC5u28vIW">/pages/sfhuXNqcGUVyC5u28vIW</a></td><td align="center">Faça deploy diretamente através dos comandos do bot Discord da Discloud.</td><td></td><td></td><td></td></tr><tr><td><a href="/pages/dIqZSff6Nr6XG9y5RKh1">/pages/dIqZSff6Nr6XG9y5RKh1</a></td><td align="center">Integre com VS Code para gerenciamento contínuo de projetos.</td><td></td><td></td><td></td></tr><tr><td><a href="/pages/F5SnInQWQ6gy9Abb6OzU">/pages/F5SnInQWQ6gy9Abb6OzU</a></td><td align="center">Use a interface de linha de comando para deploy rápido e eficiente.</td><td></td><td></td><td></td></tr></tbody></table>


# requirements.txt

Aprenda como gerar e configurar o arquivo requirements.txt para definir dependências essenciais para hospedar seu projeto Python na Discloud.

## **🗂️ O que é `requirements.txt`?**

O arquivo `requirements.txt` é essencial para projetos Python. Ele lista todas as dependências e suas versões, garantindo instalação consistente de pacotes durante o deploy na Discloud.

***

## **🛠️ Como Criar `requirements.txt`**

Você pode criar este arquivo usando dois métodos:

{% tabs %}
{% tab title="Criação Manual" %}
{% stepper %}
{% step %}
Crie um novo arquivo de texto no diretório do seu projeto.
{% endstep %}

{% step %}
Nomeie-o exatamente como `requirements.txt`.
{% endstep %}
{% endstepper %}
{% endtab %}

{% tab title="Geração Automática" %}
{% stepper %}
{% step %}
Certifique-se de que Python e pip estão instalados ([guia de instalação](/development-environment/local-environment/python)).
{% endstep %}

{% step %}
Abra seu terminal no diretório do projeto e execute.

```bash
pip freeze --user > requirements.txt
```

Isso gera automaticamente uma lista de todos os pacotes instalados com suas versões exatas.
{% endstep %}
{% endstepper %}
{% endtab %}
{% endtabs %}

***

## **📝** Estrutura do `requirements.txt`

Seu arquivo deve seguir estes padrões:

* **Pacote Básico (**[**Última Versão**](https://pypi.org/project/discord.py/#history)**)**

  ```
  discord.py
  ```
* **Pacote com Versão Específica**

  ```
  discord.py==2.0.0
  ```
* **Intervalo de Versão**

  ```
  discord.py>=2.0.0
  ```
* **Repositório GitHub (**[**Versão Instável**](https://github.com/Rapptz/discord.py)**)**

  ```
  git+https://github.com/Rapptz/discord.py
  ```

{% hint style="info" %}

#### **Melhores Práticas**

* 🔒 Bloqueie dependências críticas com `==` para versões específicas
* 🔄 Use `>=` para pacotes que esperam atualizações
* 💻 Sempre teste com versões exatas antes do deploy
  {% endhint %}

***

## **📦 Adicionando Pacotes**

{% stepper %}
{% step %}
**Instale pacotes usando pip.**

```bash
pip install nome-do-pacote
```

{% endstep %}

{% step %}
**Atualize seu arquivo de requisitos.**

```bash
pip freeze --user > requirements.txt
```

{% endstep %}
{% endstepper %}

***

## **⚠️ Notas Importantes**

* Inclua apenas pacotes que você instalou ativamente via pip – módulos importados não equivalem automaticamente a pacotes necessários!
* Para pacotes baseados em GitHub, inclua a URL completa do repositório conforme mostrado nos exemplos.
* Se encontrar problemas de instalação, verifique se todas as versões dos pacotes são compatíveis com sua versão do Python.


# Java

Guia completo para hospedar aplicações Java na Discloud.

## 📁 **Preparando os Arquivos do Seu Projeto**

Antes do deploy, **seu projeto deve ser** [**compilado em um arquivo JAR executável**](/faq/general-questions/how-to-build-and-package-a-java-application). Ao comprimir seu projeto, certifique-se de que **o arquivo `.jar` seja colocado na** [**raiz**](/faq/general-questions/what-is-the-root-of-the-project) **do** [**arquivo `.zip`**](/faq/general-questions/em-andamento-como-comprimir)**.**

#### ❌ **Arquivos a Excluir**

Certifique-se de que os seguintes arquivos e diretórios **não** sejam incluídos no seu [`.zip`](/faq/general-questions/em-andamento-como-comprimir):

```diff
- package-lock.json
- node_modules/
- .cache/
- .git/
```

📌 **Use um arquivo** [**`.discloudignore`**](/configurations/.discloudignore) **para excluir automaticamente esses arquivos.**

🔗 **Precisa de ajuda com compilação?** Verifique a FAQ sobre [**Como Construir e Empacotar uma Aplicação Java?**](/faq/general-questions/how-to-build-and-package-a-java-application)

***

## 📦 **Compilando Sua Aplicação Java**

Para **fazer deploy da sua aplicação Java**, ela deve ser compilada em um **arquivo JAR executável**.

{% tabs %}
{% tab title="Maven" %}
📄 **Documentação Oficial do Maven** → <https://maven.apache.org/guides/index.html>

```bash
mvn clean package
```

{% endtab %}

{% tab title="Gradle" %}
📄 **Documentação Oficial do Gradle** → <https://docs.gradle.org/current/userguide/userguide.html>

```bash
gradle clean build
```

{% endtab %}
{% endtabs %}

{% hint style="info" %}

#### **Recomendação**

Renomeie seu arquivo JAR para um nome simples como `app.jar` para evitar problemas com caracteres especiais.​
{% endhint %}

***

## 📝 **Configurando o Arquivo Principal**

O parâmetro `MAIN` no seu arquivo [`discloud.config`](https://github.com/discloud/docs/blob/portuguese/configurations/discloud.config) deve apontar para o seu arquivo JAR executável. Por exemplo:

```ini
MAIN=app.jar
```

Certifique-se de que `app.jar` corresponda ao nome do seu arquivo JAR compilado.​

**Nota:** Para informações detalhadas sobre configurar o arquivo principal, consulte a FAQ da Discloud sobre o arquivo principal.

***

## ✍️ **Fazendo Deploy da Sua Aplicação**

Uma vez que seu projeto esteja **configurado e comprimido**, você pode escolher um dos seguintes **métodos de deploy** na Discloud:

<table data-card-size="large" data-view="cards"><thead><tr><th data-card-target data-type="content-ref"></th><th align="center"></th><th data-hidden></th><th data-hidden></th><th data-hidden></th></tr></thead><tbody><tr><td><a href="/pages/gyLTDC3NWtsMknEHcWxx">/pages/gyLTDC3NWtsMknEHcWxx</a></td><td align="center">Faça upload e gerencie sua aplicação via interface web.</td><td></td><td></td><td></td></tr><tr><td><a href="/pages/sfhuXNqcGUVyC5u28vIW">/pages/sfhuXNqcGUVyC5u28vIW</a></td><td align="center">Faça deploy diretamente através dos comandos do bot Discord da Discloud.</td><td></td><td></td><td></td></tr><tr><td><a href="/pages/dIqZSff6Nr6XG9y5RKh1">/pages/dIqZSff6Nr6XG9y5RKh1</a></td><td align="center">Integre com VS Code para gerenciamento contínuo de projetos.</td><td></td><td></td><td></td></tr><tr><td><a href="/pages/F5SnInQWQ6gy9Abb6OzU">/pages/F5SnInQWQ6gy9Abb6OzU</a></td><td align="center">Use a interface de linha de comando para deploy rápido e eficiente.</td><td></td><td></td><td></td></tr></tbody></table>


# Ruby

Guia completo para hospedar aplicações Ruby na Discloud.

## 📁 **Preparando os Arquivos**

Antes de fazer upload do seu projeto, você deve **excluir arquivos desnecessários** para otimizar o deploy.

#### ❌ **Arquivos a Excluir**

Certifique-se de que os seguintes arquivos e diretórios **não** sejam incluídos no seu [`.zip`](/faq/general-questions/em-andamento-como-comprimir):

```diff
- Gemfile.lock
- .git
- tmp/
- log/
```

📌 **Use um arquivo** [**`.discloudignore`**](/configurations/.discloudignore) **para excluir automaticamente esses arquivos.**

🔗 **Precisa de ajuda para configurar seu** [**`Gemfile`**](/development-environment/supported-languages/ruby/gemfile) **ou encontrar o** [**arquivo principal**](/faq/general-questions/what-is-the-main-file)**?**

***

### 🌐 Hospedando Seu Site com Ruby on Rails

Antes de fazer deploy do seu website ou API na Discloud, certifique-se de que você atenda aos seguintes **requisitos**:

{% hint style="success" %}
[Plano Platinum ou superior](https://discloud.com/plans) é necessário para hospedar websites ou APIs.
{% endhint %}

{% hint style="success" %}
[Um subdomínio deve ser criado](/faq/general-questions/how-to-create-a-subdomain) antes do deploy.
{% endhint %}

{% hint style="danger" %}
Porta `8080` é obrigatória – As aplicações devem escutar nesta porta.
{% endhint %}

### ⚙️ Configurando Ruby on Rails

{% code title="config/application.rb" %}

```ruby
require_relative "boot"

require "rails/all"

# Requer as gems listadas no Gemfile, incluindo aquelas limitadas a :test, :development ou :production.
Bundler.require(*Rails.groups)

module RailsOnDiscloud
  class Application < Rails::Application
    # Inicializa a configuração padrão para a versão originalmente gerada do Rails.
    config.load_defaults 7.0
    # config.time_zone = "Central Time (US & Canada)"
    # config.eager_load_paths << Rails.root.join("extras")
    Rails.application.config.hosts = [
      IPAddr.new("0.0.0.0/0"),        # Todos os endereços IPv4.
      IPAddr.new("::/0"),             # Todos os endereços IPv6.
      "localhost",                    # Domínio reservado localhost.
      "seusubdomínio.discloud.app"    # !!! Subdomínio Discloud !!!
    ]
  end
end
```

{% endcode %}

***

## ✍️ Fazendo Deploy **da Sua Aplicação**

Uma vez que seu projeto esteja **configurado e comprimido**, você pode escolher um dos seguintes **métodos de deploy** na Discloud:

<table data-card-size="large" data-view="cards"><thead><tr><th data-card-target data-type="content-ref"></th><th align="center"></th><th data-hidden></th><th data-hidden></th><th data-hidden></th></tr></thead><tbody><tr><td><a href="/pages/gyLTDC3NWtsMknEHcWxx">/pages/gyLTDC3NWtsMknEHcWxx</a></td><td align="center">Faça upload e gerencie sua aplicação via interface web.</td><td></td><td></td><td></td></tr><tr><td><a href="/pages/sfhuXNqcGUVyC5u28vIW">/pages/sfhuXNqcGUVyC5u28vIW</a></td><td align="center">Faça deploy diretamente através dos comandos do bot Discord da Discloud.</td><td></td><td></td><td></td></tr><tr><td><a href="/pages/dIqZSff6Nr6XG9y5RKh1">/pages/dIqZSff6Nr6XG9y5RKh1</a></td><td align="center">Integre com VS Code para gerenciamento contínuo de projetos.</td><td></td><td></td><td></td></tr><tr><td><a href="/pages/F5SnInQWQ6gy9Abb6OzU">/pages/F5SnInQWQ6gy9Abb6OzU</a></td><td align="center">Use a interface de linha de comando para deploy rápido e eficiente.</td><td></td><td></td><td></td></tr></tbody></table>


# Gemfile

Guia completo do Gemfile para bots Ruby e aplicações web (site/API) na Discloud.

## 🗂️ O que é `Gemfile`?

`Gemfile` lista as gems (bibliotecas) que sua aplicação Ruby precisa. A Discloud usa o **Bundler** durante o deploy para instalá-las antes de iniciar sua aplicação.

***

## 🛠️ Criando um `Gemfile` (Início Rápido)

{% stepper %}
{% step %}
Inicialize o Bundler em uma pasta vazia:

```bash
bundle init
```

Isso cria um `Gemfile` inicial.
{% endstep %}

{% step %}
Adicione dependências diretamente via Bundler:

```bash
bundle add sinatra
bundle add puma
```

{% endstep %}

{% step %}
Instale (respeitando o Gemfile):

```bash
bundle install
```

{% endstep %}
{% endstepper %}

{% hint style="info" %}
Instale o Bundler se estiver faltando: `gem install bundler`.
{% endhint %}

***

## 🧪 Grupos de Ambiente

```ruby
group :development, :test do
	gem 'pry'
	gem 'rspec'
end

group :production do
	# gems apenas para produção (APM, backends de logging, etc.)
end
```

Pule a instalação de grupos dev/test no momento do deploy se desejado:

```bash
bundle install --without development test
```

***

## 🧩 Exemplos de Gemfiles

{% tabs %}
{% tab title="Rails (Site/API)" %}
{% code title="Gemfile" %}

```ruby
source 'https://rubygems.org'

ruby '3.2.2'

gem 'rails', '~> 7.0.0'
gem 'puma',  '~> 5.0'
gem 'pg',    '~> 1.1'   # ou 'sqlite3' para uso simples/local
gem 'bootsnap', '>= 1.4.4', require: false

group :development, :test do
	gem 'pry'
	gem 'rspec-rails'
end

group :production do
	# monitoramento / cache / etc.
end

gem 'bundler', '~> 2.4'
```

{% endcode %}
{% endtab %}

{% tab title="Sinatra (Site/API)" %}
{% code title="Gemfile" %}

```ruby
source 'https://rubygems.org'
ruby '3.2.2'

gem 'sinatra', '~> 3.0'
gem 'puma',    '~> 5.0'
gem 'dotenv',  '~> 2.8', require: false

group :development do
	gem 'rerun'
end
```

{% endcode %}
{% endtab %}

{% tab title="discordrb (Bot)" %}
{% code title="Gemfile" %}

```ruby
source 'https://rubygems.org'
ruby '3.2.2'

gem 'discordrb', '~> 3.4'
gem 'dotenv',    '~> 2.8', require: false

group :development do
	gem 'pry'
end
```

{% endcode %}
{% endtab %}

{% tab title="Bot Mínimo" %}
{% code title="Gemfile" %}

```ruby
source 'https://rubygems.org'
ruby '3.2.2'

# Adicione apenas o que você realmente precisa
gem 'httparty', '~> 0.21'
```

{% endcode %}
{% endtab %}
{% endtabs %}

***

## 🧾 Exemplo de `config.ru` (Site Sinatra / Rack)

{% code title="config.ru" %}

```ruby
require 'bundler/setup'
require 'sinatra'
require 'dotenv/load' if ENV['RACK_ENV'] != 'production'

set :bind, '0.0.0.0'
set :port, (ENV['PORT'] || 8080)

get '/' do
	'Olá do app Sinatra na Discloud!'
end

run Sinatra::Application
```

{% endcode %}

Para bots, você normalmente NÃO precisa de `config.ru`; em vez disso, apenas aponte `MAIN` no [`discloud.config`](https://github.com/discloud/docs/blob/portuguese/configurations/discloud.config) para sua entrada Ruby (ex.: `bot.rb`).

***

## 🧪 Atualizando Dependências

```bash
# Atualize uma única gem
bundle update puma

# Atualize todas (cuidado – pode introduzir mudanças incompatíveis)
bundle update

# Veja gems desatualizadas
bundle outdated
```

Patches de segurança: monitore avisos (ex.: RubySec / Dependabot) e agende `bundle update --patch` periodicamente.

***

## 🧰 Referência de Comandos Comuns

```bash
# Inicializar Gemfile
bundle init

# Adicionar gem (escreve no Gemfile & instala)
bundle add <gem>

# Instalar apenas com grupos de produção
bundle install --without development test

# Verificar problemas no gráfico de dependências
bundle check

# Limpar gems não utilizadas (após prune)
bundle clean --force
```


# Rust

Guia completo para hospedar aplicações Rust na Discloud.

## 📁 **Preparando os Arquivos**

Antes de fazer upload do seu projeto, você deve **excluir arquivos desnecessários** para otimizar o deploy.

#### ❌ **Arquivos a Excluir**

Certifique-se de que os seguintes arquivos e diretórios **não** sejam incluídos no seu [`.zip`](/faq/general-questions/em-andamento-como-comprimir):

```diff
- Cargo.lock
- target/
- git
```

📌 **Use um arquivo** [**`.discloudignore`**](/configurations/.discloudignore) **para excluir automaticamente esses arquivos.**

🔗 **Precisa de ajuda para configurar seu** [**`Cargo.toml`**](/development-environment/supported-languages/rust/cargo.toml) **ou encontrar o** [**arquivo principal**](/faq/general-questions/what-is-the-main-file)**?**

***

## 🌐 Hospedando Seu Site com Rocket

Antes de fazer deploy do seu website ou API na Discloud, certifique-se de que você atenda aos seguintes **requisitos**:

{% hint style="success" %}
[Plano Platinum ou superior](https://discloud.com/plans) é necessário para hospedar websites ou APIs.
{% endhint %}

{% hint style="success" %}
[Um subdomínio deve ser criado](/faq/general-questions/how-to-create-a-subdomain) antes do deploy.
{% endhint %}

{% hint style="success" %}
Use a versão nightly do Rust (Rocket requer nightly).
{% endhint %}

{% hint style="danger" %}
Porta `8080` é obrigatória – As aplicações devem escutar nesta porta.
{% endhint %}

***

## 🚀 Configurando `Rocket`

[Rocket](https://rocket.rs/) é um framework web para Rust que requer a versão nightly do Rust. Para configurar e fazer deploy de um projeto Rocket na Discloud, siga estes passos:

{% stepper %}
{% step %}
Defina a Versão Nightly do Rust.

Execute o seguinte comando no terminal para garantir que seu projeto esteja usando a versão nightly:

```bash
rustup override set nightly
```

{% endstep %}

{% step %}
Crie o Arquivo `rust-toolchain.toml`.

Para garantir que a versão nightly do Rust seja usada, crie um arquivo chamado `rust-toolchain.toml` no diretório raiz do projeto com o seguinte conteúdo:

{% code title="rust-toolchain.toml" %}

```ini
[toolchain]
channel = "nightly"
```

{% endcode %}

Este arquivo informa ao rustup para usar a versão nightly do Rust.
{% endstep %}
{% endstepper %}

***

## ✍️ Fazendo Deploy **da Sua Aplicação**

Uma vez que seu projeto esteja **configurado e comprimido**, você pode escolher um dos seguintes **métodos de deploy** na Discloud:

<table data-card-size="large" data-view="cards"><thead><tr><th data-card-target data-type="content-ref"></th><th align="center"></th><th data-hidden></th><th data-hidden></th><th data-hidden></th></tr></thead><tbody><tr><td><a href="/pages/gyLTDC3NWtsMknEHcWxx">/pages/gyLTDC3NWtsMknEHcWxx</a></td><td align="center">Faça upload e gerencie sua aplicação via interface web.</td><td></td><td></td><td></td></tr><tr><td><a href="/pages/sfhuXNqcGUVyC5u28vIW">/pages/sfhuXNqcGUVyC5u28vIW</a></td><td align="center">Faça deploy diretamente através dos comandos do bot Discord da Discloud.</td><td></td><td></td><td></td></tr><tr><td><a href="/pages/dIqZSff6Nr6XG9y5RKh1">/pages/dIqZSff6Nr6XG9y5RKh1</a></td><td align="center">Integre com VS Code para gerenciamento contínuo de projetos.</td><td></td><td></td><td></td></tr><tr><td><a href="/pages/F5SnInQWQ6gy9Abb6OzU">/pages/F5SnInQWQ6gy9Abb6OzU</a></td><td align="center">Use a interface de linha de comando para deploy rápido e eficiente.</td><td></td><td></td><td></td></tr></tbody></table>


# Cargo.toml

Guia completo do manifesto Cargo.toml para bots Rust e aplicações web (site/API) na Discloud.

## 🗂️ O que é `Cargo.toml`?

`Cargo.toml` é o manifesto que define os metadados do seu pacote Rust (crate): nome, versão, autores, edição, dependências, recursos, scripts de build e mais. A Discloud depende dele para resolver e compilar seu projeto antes de iniciá-lo.

***

## 🛠️ Criando um Novo Projeto

{% stepper %}
{% step %}
Inicialize em diretório existente:

```bash
cargo init
```

{% endstep %}

{% step %}
Crie um novo diretório automaticamente:

```bash
cargo new my_bot
```

{% hint style="info" %}
Use nomes em [**snake\_case**](https://en.wikipedia.org/wiki/Letter_case#Snake_case) ou [**kebab-case**](https://en.wikipedia.org/wiki/Letter_case#Kebab_case).
{% endhint %}
{% endstep %}

{% step %}
Adicione uma dependência rapidamente (Cargo 1.62+):

```bash
cargo add serenity
```

{% endstep %}
{% endstepper %}

{% hint style="info" %}
Precisa do Rust? Veja a [página de instalação](/development-environment/local-environment/rust).
{% endhint %}

***

## 📦 Exemplos

{% tabs %}
{% tab title="Bot Discord (serenity)" %}
{% code title="Cargo.toml" %}

```toml
[package]
name = "discord_bot"
version = "0.1.0"
edition = "2021"

[dependencies]
serenity = { version = "0.11", default-features = false, features = [
	"client", "gateway", "rustls_backend", "model" ] }
tokio = { version = "1", features = ["macros", "rt-multi-thread"] }
tracing = "0.1"
dotenvy = "0.15"
```

{% endcode %}

Serenity é uma biblioteca da API do Discord: <https://crates.io/crates/serenity>
{% endtab %}

{% tab title="API Axum" %}
{% code title="Cargo.toml" %}

```toml
[package]
name = "axum_api"
version = "0.1.0"
edition = "2021"

[dependencies]
axum = "0.7"
tokio = { version = "1", features = ["macros", "rt-multi-thread"] }
serde = { version = "1", features = ["derive"] }
serde_json = "1"
tracing = "0.1"
tracing-subscriber = { version = "0.3", features = ["fmt", "env-filter"] }
dotenvy = "0.15"
```

{% endcode %}

Deve escutar em `0.0.0.0:8080`.
{% endtab %}

{% tab title="Rocket (Nightly)" %}
{% code title="Cargo.toml" %}

```toml
[package]
name = "rocket_site"
version = "0.1.0"
edition = "2021"

[dependencies]
rocket = { version = "0.5.0", features = ["json"] }
serde = { version = "1", features = ["derive"] }
serde_json = "1"
```

{% endcode %}

Requer toolchain nightly + bind na porta 8080.
{% endtab %}
{% endtabs %}

{% hint style="info" %}
Precisa de dependências no nível do SO (ex.: `openssl`, `ffmpeg`)? Adicione-as sob `APT=` no [`discloud.config`](https://github.com/discloud/docs/blob/portuguese/configurations/discloud.config). Veja [a lista de pacotes APT](/configurations/discloud.config/apt) para sintaxe e exemplos.
{% endhint %}

***

## 🧰 Referência de Comandos Comuns

```bash
# Build debug
cargo build

# Build release
cargo build --release

# Executar
cargo run

# Adicionar dependência
cargo add <crate>

# Remover dependência
cargo rm <crate>

# Auditar (opcional; precisa cargo-audit)
cargo audit
```

Ferramentas opcionais:

```bash
cargo install cargo-edit cargo-outdated cargo-audit
```


# Go

Guia completo para hospedar aplicações Go na Discloud.

## 📁 **Preparando os Arquivos**

Antes de fazer upload do seu projeto, você deve **excluir arquivos desnecessários** para otimizar o deploy.

#### ❌ **Arquivos a Excluir**

Certifique-se de que os seguintes arquivos e diretórios **não** sejam incluídos no seu [`.zip`](/faq/general-questions/em-andamento-como-comprimir):

```diff
- bin/
- *.exe
- .git/
```

📌 **Use um arquivo** [**`.discloudignore`**](/configurations/.discloudignore) **para excluir automaticamente esses arquivos. Não** exclua `go.mod` ou `go.sum`.

🔗 **Precisa de ajuda para configurar seu** [**`go.mod`**](/development-environment/supported-languages/go/go.mod) **ou encontrar o** [**arquivo principal**](/faq/general-questions/what-is-the-main-file)**?**

***

### 🌐 **Hospedando Websites & APIs em Go**

Antes de fazer deploy do seu website ou API na Discloud, certifique-se de que você atenda aos seguintes **requisitos**:

{% hint style="success" %}
[Plano Platinum ou superior](https://discloud.com/plans) é necessário para hospedar websites ou APIs.
{% endhint %}

{% hint style="success" %}
[Um subdomínio deve ser criado](/faq/general-questions/how-to-create-a-subdomain) antes do deploy.
{% endhint %}

{% hint style="danger" %}
Porta `8080` é obrigatória – As aplicações devem escutar nesta porta.
{% endhint %}

{% tabs %}
{% tab title="🤖 Bot Discord" %}

```go
package main

import (
  "log"
  "os"
  "os/signal"
  "syscall"
  "github.com/bwmarrin/discordgo"
)

func main() {
  token := os.Getenv("DISCORD_TOKEN")
  if token == "" { log.Fatal("DISCORD_TOKEN não definido") }

  dg, err := discordgo.New("Bot " + token)
  if err != nil { log.Fatal(err) }

  dg.AddHandler(func(s *discordgo.Session, r *discordgo.Ready) {
    log.Println("Bot está pronto")
  })

  if err := dg.Open(); err != nil { log.Fatal(err) }
  log.Println("Bot executando. Pressione CTRL+C para sair.")

  stop := make(chan os.Signal, 1)
  signal.Notify(stop, os.Interrupt, syscall.SIGTERM)
  <-stop
  dg.Close()
}
```

> Bots não precisam bindar nenhuma porta HTTP. Eles só precisam manter o processo vivo.
> {% endtab %}

{% tab title="⚙️ Servidor HTTP Básico" %}

```go
package main

import (
  "fmt"
  "log"
  "net/http"
)

func main() {
  mux := http.NewServeMux()
  mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintln(w, "Olá do Go na Discloud!")
  })

  log.Println("Iniciando servidor em :8080")
  if err := http.ListenAndServe(":8080", mux); err != nil {
    log.Fatal(err)
  }
}
```

{% endtab %}

{% tab title="🔀 API REST (chi)" %}

```go
package main

import (
  "net/http"
  "log"
  "github.com/go-chi/chi/v5"
)

func main() {
  r := chi.NewRouter()
  r.Get("/health", func(w http.ResponseWriter, r *http.Request) { w.Write([]byte("ok")) })
  r.Get("/hello/{name}", func(w http.ResponseWriter, r *http.Request) {
    name := chi.URLParam(r, "name")
    w.Write([]byte("Olá, "+name))
  })
  log.Println("API em :8080")
  log.Fatal(http.ListenAndServe(":8080", r))
}
```

{% endtab %}
{% endtabs %}

***

## ✍️ Fazendo Deploy **da Sua Aplicação**

Uma vez que seu projeto esteja **configurado e comprimido**, você pode escolher um dos seguintes **métodos de deploy** na Discloud:

<table data-card-size="large" data-view="cards"><thead><tr><th data-card-target data-type="content-ref"></th><th align="center"></th><th data-hidden></th><th data-hidden></th><th data-hidden></th></tr></thead><tbody><tr><td><a href="/pages/gyLTDC3NWtsMknEHcWxx">/pages/gyLTDC3NWtsMknEHcWxx</a></td><td align="center">Faça upload e gerencie sua aplicação via interface web.</td><td></td><td></td><td></td></tr><tr><td><a href="/pages/sfhuXNqcGUVyC5u28vIW">/pages/sfhuXNqcGUVyC5u28vIW</a></td><td align="center">Faça deploy diretamente através dos comandos do bot Discord da Discloud.</td><td></td><td></td><td></td></tr><tr><td><a href="/pages/dIqZSff6Nr6XG9y5RKh1">/pages/dIqZSff6Nr6XG9y5RKh1</a></td><td align="center">Integre com VS Code para gerenciamento contínuo de projetos.</td><td></td><td></td><td></td></tr><tr><td><a href="/pages/F5SnInQWQ6gy9Abb6OzU">/pages/F5SnInQWQ6gy9Abb6OzU</a></td><td align="center">Use a interface de linha de comando para deploy rápido e eficiente.</td><td></td><td></td><td></td></tr></tbody></table>


# go.mod

Aprenda como gerar e configurar o arquivo go.mod para gerenciar módulos e dependências para aplicações Go na Discloud.

## 🗂️ O que é `go.mod`?

`go.mod` define o caminho do seu módulo, a versão da toolchain Go (no formato `major.minor`), e as dependências diretas necessárias pelo seu projeto. A Discloud usa ele (e o `go.sum` acompanhante) para baixar e verificar módulos antes de construir sua aplicação.

***

## 🛠️ Criando um Novo Módulo

{% stepper %}
{% step %}
Inicialize um módulo no diretório atual:

```bash
go mod init github.com/you/yourapp
```

{% endstep %}

{% step %}
Adicione (ou atualize) dependências automaticamente referenciando-as no código e organizando:

```bash
go mod tidy
```

Isso cria `go.sum` (não deve estar vazio) com linhas de checksum.
{% endstep %}

{% step %}
Adicione uma dependência específica explicitamente:

```bash
go get github.com/go-chi/chi/v5
```

Então organize novamente se necessário:

```bash
go mod tidy
```

{% endstep %}
{% endstepper %}

{% hint style="info" %}
Precisa do Go localmente? Veja o [guia do ambiente local](/development-environment/local-environment/golang).
{% endhint %}

***

## 🧩 Exemplo Mínimo

{% code title="go.mod" %}

```go
module github.com/you/yourapp

go 1.22
```

{% endcode %}

{% hint style="warning" %}
A versão do Go **DEVE** estar no formato `major.minor` (ex.: `1.22`). **NÃO** use patch: `1.22.3`.
{% endhint %}

***

## 📦 Adicionando Dependências

Para adicionar uma nova dependência, ou:

{% stepper %}
{% step %}
Importe-a no seu arquivo fonte e execute `go mod tidy`, ou
{% endstep %}

{% step %}
Execute `go get module/path@version` diretamente.

**Exemplo: adicionar Chi router**

```bash
go get github.com/go-chi/chi/v5
```

Snippet resultante do `go.mod`:

```go
require (
	github.com/go-chi/chi/v5 v5.0.12 // versão exemplo
)
```

> As versões são resolvidas semanticamente pelo sistema proxy/módulo.
> {% endstep %}
> {% endstepper %}

***

## 🔒 Integridade do `go.sum` & Caso Vazio

`go.sum` contém hashes criptográficos de cada versão de módulo necessária (direta & indireta) para garantir builds reprodutíveis. Ele **deve ser commitado** junto com `go.mod`.

Regenere / atualize-o a qualquer momento:

```bash
go mod tidy
```

***

## 🧪 Exemplos de Tipos de Aplicação

Exemplos em abas para cenários comuns:

{% tabs %}
{% tab title="🤖 Bot Discord" %}
{% code title="go.mod" %}

```go
module github.com/you/discordbot

go 1.22

require (
    github.com/bwmarrin/discordgo v0.27.1 // exemplo
)
```

{% endcode %}
{% endtab %}

{% tab title="🌐 Website / API" %}
{% code title="go.mod" %}

```go
module github.com/you/webapp

go 1.22

require (
    github.com/go-chi/chi/v5 v5.0.12
)
```

{% endcode %}

Requisitos:

* Seu servidor HTTP deve escutar na porta `8080`.
  {% endtab %}

{% tab title="📦 Apenas Stdlib Mínimo" %}
{% code title="go.mod" %}

```go
module github.com/you/stdlibonly

go 1.22
```

{% endcode %}
{% endtab %}
{% endtabs %}

***

## 🧰 Referência de Comandos Comuns

```bash
# Execute sua aplicação diretamente
go run .

# Construa um binário
go build -o app

# Liste todos os módulos (diretos+indiretos)
go list -m all

# Mostre o gráfico de dependências
go mod graph
```


# Php

Guia completo para hospedar aplicações PHP na Discloud.

## 📁 **Preparando os Arquivos do Seu Projeto**

Se seu projeto usa Composer, certifique-se de que um [`composer.json`](/development-environment/supported-languages/php/composer-json) válido esteja na **raiz** do arquivo que você faz upload. A Discloud instalará as dependências automaticamente quando detectar este arquivo.

#### ❌ **Arquivos / Diretórios a Excluir**

Exclua itens que não são necessários para execução:

```diff
- vendor/
- node_modules/
- .git/
- tests/
- .cache/
```

📌 Use um arquivo [**`.discloudignore`**](/configurations/.discloudignore) para excluir diretórios que você **não** quer empacotar (ex.: `vendor/` se você preferir uma instalação limpa).

{% hint style="info" %}
Inclua `vendor/` APENAS se: você tem bibliotecas corrigidas localmente ou depende de extensões ou binários compilados durante a instalação que devem corresponder ao seu ambiente de desenvolvimento. Caso contrário, excluí-lo mantém os uploads menores e permite que a Discloud faça uma instalação fresca e reprodutível.
{% endhint %}

🔗 **Precisa de ajuda para encontrar o** [**arquivo principal**](/faq/general-questions/what-is-the-main-file)**?**

***

## 📦 **Essenciais do composer.json**

Exemplo mínimo:

```json
{
  "name": "example/app",
  "type": "project",
  "require": {
    "guzzlehttp/guzzle": "^7.9"
  },
  "autoload": {
    "psr-4": {
      "App\\": "src/"
    }
  },
  "scripts": {
    "start": "php -S 0.0.0.0:8080 -t public"
  }
}
```

Após editar dependências localmente:

```bash
composer install
composer dump-autoload --optimize
```

Mais detalhes: [`composer.json`](/development-environment/supported-languages/php/composer-json)

***

## 🌐 **Hospedando Websites & APIs**

Antes de fazer deploy do seu website ou API na Discloud, certifique-se de que você atenda aos seguintes **requisitos**:

{% hint style="success" %}
[Plano Platinum ou superior](https://discloud.com/plans) é necessário para hospedar websites ou APIs.
{% endhint %}

{% hint style="success" %}
[Um subdomínio deve ser criado](/faq/general-questions/how-to-create-a-subdomain) antes do deploy.
{% endhint %}

{% hint style="danger" %}
Porta `8080` é obrigatória – As aplicações devem escutar nesta porta.
{% endhint %}

{% tabs %}
{% tab title="Servidor Integrado" %}
Execute localmente / deploy simples:

```bash
php -S 0.0.0.0:8080 -t public
```

`public/index.php` mínimo:

```php
<?php
declare(strict_types=1);
echo "Olá, Discloud!";
```

{% endtab %}

{% tab title="Roteador Básico" %}
`public/index.php`:

```php
<?php
declare(strict_types=1);
$path = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
header('Content-Type: application/json');
if ($path === '/status') {
    echo json_encode(['ok' => true]);
    return;
}
echo json_encode(['message' => 'Olá, Discloud!']);
```

{% endtab %}

{% tab title="Script do Composer" %}
Adicione ao `composer.json`:

```json
{
  "scripts": { "start": "php -S 0.0.0.0:8080 -t public" }
}
```

Execute:

```bash
composer run-script start
```

{% endtab %}
{% endtabs %}

***

## ✍️ Fazendo Deploy **da Sua Aplicação**

Uma vez que seu projeto esteja **configurado e comprimido**, você pode escolher um dos seguintes **métodos de deploy** na Discloud:

<table data-card-size="large" data-view="cards"><thead><tr><th data-card-target data-type="content-ref"></th><th align="center"></th><th data-hidden></th><th data-hidden></th><th data-hidden></th></tr></thead><tbody><tr><td><a href="/pages/gyLTDC3NWtsMknEHcWxx">/pages/gyLTDC3NWtsMknEHcWxx</a></td><td align="center">Faça upload e gerencie sua aplicação via interface web.</td><td></td><td></td><td></td></tr><tr><td><a href="/pages/sfhuXNqcGUVyC5u28vIW">/pages/sfhuXNqcGUVyC5u28vIW</a></td><td align="center">Faça deploy diretamente através dos comandos do bot Discord da Discloud.</td><td></td><td></td><td></td></tr><tr><td><a href="/pages/dIqZSff6Nr6XG9y5RKh1">/pages/dIqZSff6Nr6XG9y5RKh1</a></td><td align="center">Integre com VS Code para gerenciamento contínuo de projetos.</td><td></td><td></td><td></td></tr><tr><td><a href="/pages/F5SnInQWQ6gy9Abb6OzU">/pages/F5SnInQWQ6gy9Abb6OzU</a></td><td align="center">Use a interface de linha de comando para deploy rápido e eficiente.</td><td></td><td></td><td></td></tr></tbody></table>


# composer.json

Entenda e configure composer.json para que a Discloud possa instalar suas dependências PHP automaticamente.

## 🗂 O que é `composer.json`?

`composer.json` declara os metadados do seu projeto, pacotes necessários, regras de autoload e scripts opcionais. Quando presente na raiz do arquivo que você faz upload, a Discloud instala as dependências definidas dentro usando o Composer.

***

## 🛠 Criando `composer.json`

{% stepper %}
{% step %}
Gere interativamente:

```bash
composer init
```

{% endstep %}

{% step %}
Ou crie um arquivo mínimo manualmente:

```json
{
  "name": "example/app",
  "type": "project",
  "require": {
    "guzzlehttp/guzzle": "^7.9"
  },
  "autoload": {
    "psr-4": { "App\\\\": "src/" }
  }
}
```

{% endstep %}

{% step %}
Então instale:

```bash
composer install
```

{% endstep %}
{% endstepper %}

***

## 📦 Adicionando / Atualizando Dependências

Instale novo pacote:

```bash
composer require ramsey/uuid
```

Atualize um pacote:

```bash
composer update ramsey/uuid
```

Atualize todos (pode alterar versões amplamente):

```bash
composer update
```

***

## 📄 Arquivo de Lock (`composer.lock`)

Commite `composer.lock` para que os deploys reproduzam as versões exatas das dependências. Se ausente, as versões mais recentes correspondentes são resolvidas durante a instalação.

***

## 🧰 Referência de Comandos Comuns

```bash
# Inicializar projeto
composer init

# Instalar deps
composer install

# Remover pacote
composer remove vendor/pkg

# Otimizar autoload
composer dump-autoload --optimize

# Executar script
composer run-script <name>

# Mostrar desatualizados
composer outdated
```


# Ambiente Local

Configure um ambiente de desenvolvimento local confiável antes de fazer o upload na Discloud.

## 📌 Para Que Serve Esta Seção?

Esta área ajuda você a:

* Configurar runtimes de linguagem para começar a codificar.
* Instalar ou habilitar ferramentas do ecossistema (apenas se você escolher).
* Preparar um projeto para que se comporte de forma consistente quando empacotado para a Discloud.

A Discloud executa aplicações em contêineres Linux; manter a estrutura do seu projeto limpa (arquivo de entrada + manifesto de dependências) minimiza surpresas.

***

## 🚀 O Que Você Encontrará Aqui

<table data-card-size="large" data-column-title-hidden data-view="cards"><thead><tr><th align="center"></th><th align="center"></th></tr></thead><tbody><tr><td align="center"><strong>Guias de Configuração de Linguagem</strong></td><td align="center">Instruções de instalação passo a passo para runtimes suportados (Node.js, Python, Ruby, Go, Rust).</td></tr><tr><td align="center"><strong>Gerenciando Dependências</strong></td><td align="center">Usando arquivos como <a href="/pages/IshTp52inqigSJl7Z1q1"><code>package.json</code></a>, <a href="/pages/spIM1eIJ1guuf8pJWJMy"><code>requirements.txt</code></a>, <a href="/pages/m8C4puyeH6KYhVMAONmj"><code>Gemfile</code></a>, <a href="/pages/zg16QDa4n5CfMFDHwgn8"><code>go.mod</code></a>, <a href="/pages/BvOF468No9xz4Wxiy7i3"><code>Cargo.toml</code></a>.</td></tr><tr><td align="center"><strong>Ferramentas Opcionais</strong></td><td align="center">Gerenciadores de versão e utilitários que você pode usar (NVM, pyenv, rbenv, rustup) – totalmente opcionais.</td></tr><tr><td align="center"><strong>Fluxo de Trabalho Mínimo</strong></td><td align="center">Uma sequência leve do init até uma execução de teste local antes do empacotamento.</td></tr></tbody></table>

***

## 🧭 Guias de Linguagem

<table data-column-title-hidden data-view="cards"><thead><tr><th></th><th></th></tr></thead><tbody><tr><td><strong>Node.js</strong></td><td><a href="/pages/thuK1bBIeHXSDLDjRP24">Guia de instalação e uso</a></td></tr><tr><td><strong>Python</strong></td><td><a href="/pages/3Iz7B3CE4UJyZpE5N6Q4">Guia de instalação e uso</a></td></tr><tr><td><strong>Ruby</strong></td><td><a href="/pages/M2aNu3kB6iWxyhEe2sQP">Guia de instalação e uso</a></td></tr><tr><td><strong>Rust</strong></td><td><a href="/pages/Uzb1dJlJqSSiJptCPhyA">Guia de instalação e uso</a></td></tr><tr><td><strong>Go</strong></td><td><a href="/pages/fN1CAKhkkOFNFxZ18ZGa">Guia de instalação e uso</a></td></tr></tbody></table>


# NodeJS

Instale e gerencie Node.js localmente (Windows, macOS, Linux) usando um instalador, gerenciador de pacotes ou gerenciador de versão.

## 🧾 Visão Geral

Node.js executa JavaScript fora do navegador para CLIs, APIs, workers, tarefas agendadas e serviços em tempo real. A instalação local permite:

* Instalar dependências (npm, pnpm ou Yarn)
* Executar e depurar antes de fazer o upload na Discloud
* Preparar builds ou bundles quando necessário

{% embed url="<https://nodejs.org/>" %}

***

## 📥 Instalação

Escolha seu sistema operacional, então um método. Gerenciadores de versão (NVM) ajudam ao alternar projetos.

{% tabs %}
{% tab title="🪟 Windows" %}
{% tabs %}
{% tab title="Instalador" %}
{% stepper %}
{% step %}
Abra <https://nodejs.org/en/download> e baixe o .msi LTS
{% endstep %}

{% step %}
Execute o instalador (mantenha os padrões incluindo npm + PATH)
{% endstep %}

{% step %}
Reabra o terminal e verifique

```bash
node -v
npm -v
```

{% endstep %}
{% endstepper %}
{% endtab %}

{% tab title="Chocolatey" %}

```bash
choco install nodejs-lts -y
node -v
npm -v
```

{% endtab %}

{% tab title="NVM para Windows" %}
{% stepper %}
{% step %}
Baixe o último `nvm-setup.exe` dos [lançamentos](https://github.com/coreybutler/nvm-windows/releases)
{% endstep %}

{% step %}
Instale aceitando os padrões
{% endstep %}

{% step %}
Instale e use LTS

```bash
nvm install lts
nvm use lts
node -v
npm -v
```

{% endstep %}
{% endstepper %}
{% endtab %}
{% endtabs %}
{% endtab %}

{% tab title="🐧 Linux" %}
{% tabs %}
{% tab title="Debian/Ubuntu" %}

```bash
sudo apt update
sudo apt install -y nodejs npm
node -v
npm -v
```

{% endtab %}

{% tab title="Fedora" %}

```bash
sudo dnf install -y nodejs npm
node -v
npm -v
```

{% endtab %}

{% tab title="Arch" %}

```bash
sudo pacman -S --needed nodejs-lts-hydrogen npm
node -v
npm -v
```

{% endtab %}

{% tab title="NVM" %}

```bash
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.3/install.sh | bash
source ~/.bashrc 2>/dev/null || source ~/.zshrc 2>/dev/null
nvm install --lts
nvm use --lts
nvm alias default lts/*
node -v
npm -v
```

{% endtab %}
{% endtabs %}
{% endtab %}

{% tab title="🍎 macOS" %}
{% tabs %}
{% tab title="Instalador" %}
Baixe o .pkg LTS de [nodejs.org](https://nodejs.org/en/download) então:

```bash
node -v
npm -v
```

{% endtab %}

{% tab title="Homebrew" %}

```bash
brew update
brew install node
node -v
npm -v
```

{% endtab %}

{% tab title="NVM" %}

```bash
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.3/install.sh | bash
source ~/.zshrc 2>/dev/null || source ~/.bashrc 2>/dev/null
nvm install --lts
nvm use --lts
node -v
npm -v
```

{% endtab %}
{% endtabs %}
{% endtab %}
{% endtabs %}

***

## 🔄 Atualizando Node.js

Se você estiver usando **NVM**, pode atualizar Node.js com:

```bash
nvm install stable
```

Caso contrário, use o gerenciador de pacotes do seu sistema ou baixe novamente o instalador mais recente do site do Node.js.


# Python

Instale e gerencie Python localmente (Windows, macOS, Linux) usando instaladores oficiais, pacotes do sistema ou pyenv; crie ambientes virtuais.

## 🧾 Visão Geral

Python é usado para bots, APIs, automação, scripting e tarefas de dados. A instalação local permite instalar dependências e testar antes de fazer o upload na Discloud.

{% embed url="<https://www.python.org>" %}

***

## 📥 Instalação

{% tabs %}
{% tab title="🪟 Windows" %}
{% stepper %}
{% step %}
Baixe o instalador mais recente do Python 3 de <https://www.python.org/downloads/>
{% endstep %}

{% step %}
Marque "Add Python to PATH" e complete a instalação.
{% endstep %}

{% step %}
Reabra o terminal e verifique

```bash
python --version
pip -V
```

{% endstep %}

{% step %}
Crie ambiente virtual opcional

```bash
python -m venv .venv
.venv\\Scripts\\activate
pip install --upgrade pip
```

{% endstep %}
{% endstepper %}
{% endtab %}

{% tab title="🐧 Linux" %}
{% tabs %}
{% tab title="Debian/Ubuntu" %}

```bash
sudo apt update
sudo apt install -y python3 python3-pip python3-venv
python3 --version
pip3 -V
python3 -m venv .venv
source .venv/bin/activate
```

{% endtab %}

{% tab title="Fedora" %}

```bash
sudo dnf install -y python3 python3-pip
python3 --version
pip3 -V
python3 -m venv .venv
source .venv/bin/activate
```

{% endtab %}

{% tab title="Arch" %}

```bash
sudo pacman -S --needed python python-pip
python --version
pip -V
python -m venv .venv
source .venv/bin/activate
```

{% endtab %}

{% tab title="pyenv" %}
Dependências (exemplo Debian):

```bash
sudo apt update
sudo apt install -y build-essential libssl-dev zlib1g-dev \
libncurses5-dev libffi-dev libbz2-dev libreadline-dev libsqlite3-dev \
liblzma-dev wget curl
```

Instalar e configurar:

```bash
curl https://pyenv.run | bash
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
echo 'command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(pyenv init -)"' >> ~/.bashrc
source ~/.bashrc
pyenv install 3.12.4
pyenv global 3.12.4
python --version
```

{% endtab %}
{% endtabs %}
{% endtab %}

{% tab title="🍎 macOS" %}
{% tabs %}
{% tab title="Instalador" %}
Baixe de [python.org](https://www.python.org/downloads/) e execute, então:

```bash
python3 --version
pip3 -V
```

{% endtab %}

{% tab title="Homebrew" %}

```bash
brew update
brew install python
python3 --version
pip3 -V
```

{% endtab %}
{% endtabs %}
{% endtab %}
{% endtabs %}

***

## ✅ Verificação

```bash
python --version
pip -V
```

Se a distribuição usar `python3`, substitua adequadamente.

Se sua distribuição usar `python3`, invoque isso em vez de `python`.

***

## 🗂 Ambientes Virtuais

**O que é**: Um ambiente virtual é uma árvore de diretórios isolada contendo seu próprio interpretador Python e pacotes instalados, separado do seu Python global (sistema).

**Por que usar**:

* Mantém as dependências do projeto isoladas (um projeto pode usar `requests==2.31`, outro `requests==2.29`).
* Evita precisar de instalações de administrador / em todo o sistema.
* Previne conflitos acidentais com pacotes do SO ou outros projetos.
* Faz com que `requirements.txt` reflita apenas o que o projeto realmente precisa (reprodutibilidade ao fazer o upload ou compartilhar).
* Permite testar upgrades com segurança (crie um novo env, instale, compare comportamento).

Criar e ativar:

```bash
python -m venv .venv
source .venv/bin/activate  # Windows: .venv\\Scripts\\activate
```

Instalar dependências e capturar versões:

```bash
pip install -r requirements.txt
pip freeze > requirements.txt
```

***

## 🔄 Atualização

| Tarefa                       | Comando                               |
| ---------------------------- | ------------------------------------- |
| Atualizar pip                | `python -m pip install --upgrade pip` |
| Atualizar um pacote          | `pip install <name> --upgrade`        |
| Instalar novo Python (pyenv) | `pyenv install <version>`             |

***

## 🗃 Comandos Comuns

```bash
pip install requests
pip list
pip freeze > requirements.txt
python main.py
python -m venv .venv
```


# Ruby

Instale e gerencie Ruby localmente (Windows, macOS, Linux) usando instaladores ou gerenciadores de versão; use Bundler para dependências.

## 🧾 Visão Geral

Ruby é usado para bots, APIs (Sinatra) e frameworks completos (Rails). A instalação local permite gerenciar gems e testar antes de fazer o upload.

{% embed url="<https://www.ruby-lang.org>" %}

{% embed url="<https://bundler.io/>" %}

***

## 📥 Instalação (escolha uma)

{% tabs %}
{% tab title="🪟 Windows" %}
{% stepper %}
{% step %}
Baixe o Ruby+Devkit mais recente (x64) de <https://rubyinstaller.org/downloads/>
{% endstep %}

{% step %}
Execute o instalador (habilite MSYS2 quando solicitado).
{% endstep %}

{% step %}
Deixe o script pós-instalação terminar (configuração da toolchain).
{% endstep %}

{% step %}
Verifique e instale bundler

```bash
ruby -v
gem -v
gem install bundler
bundler -v
```

{% endstep %}

{% step %}
Inicialize projeto (opcional)

```bash
bundle init
bundle install
```

{% endstep %}
{% endstepper %}
{% endtab %}

{% tab title="🐧 Linux" %}
{% tabs %}
{% tab title="Debian/Ubuntu" %}

```bash
sudo apt update
sudo apt install -y ruby-full build-essential
ruby -v
gem -v
gem install bundler
```

{% endtab %}

{% tab title="Fedora" %}

```bash
sudo dnf install -y ruby ruby-devel @development-tools
ruby -v
gem -v
gem install bundler
```

{% endtab %}

{% tab title="Arch" %}

```bash
sudo pacman -S --needed ruby base-devel
ruby -v
gem -v
gem install bundler
```

{% endtab %}

{% tab title="rbenv" %}
Dependências (exemplo Debian):

```bash
sudo apt update
sudo apt install -y build-essential libssl-dev libreadline-dev zlib1g-dev \
libyaml-dev libffi-dev libgdbm-dev libncurses5-dev libsqlite3-dev
```

Instalar rbenv + ruby-build:

```bash
git clone https://github.com/rbenv/rbenv.git ~/.rbenv
git clone https://github.com/rbenv/ruby-build.git ~/.rbenv/plugins/ruby-build
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(rbenv init -)"' >> ~/.bashrc
source ~/.bashrc
rbenv install 3.3.0
rbenv global 3.3.0
ruby -v
gem install bundler
```

{% endtab %}
{% endtabs %}
{% endtab %}

{% tab title="🍎 macOS" %}
{% tabs %}
{% tab title="Homebrew" %}

```bash
brew update
brew install ruby
echo 'export PATH="/opt/homebrew/opt/ruby/bin:$PATH"' >> ~/.zshrc
source ~/.zshrc
ruby -v
gem -v
gem install bundler
```

{% endtab %}

{% tab title="rbenv" %}

```bash
brew install rbenv
echo 'eval "$(rbenv init -)"' >> ~/.zshrc
source ~/.zshrc
rbenv install 3.3.0
rbenv global 3.3.0
ruby -v
gem install bundler
```

{% endtab %}
{% endtabs %}
{% endtab %}
{% endtabs %}

***

## ✅ Verificação

```bash
ruby -v
gem -v
bundler -v
```

Todos os comandos devem mostrar versões.

***

## 💎 Gerenciando Gems

{% stepper %}
{% step %}
Inicializar

```bash
bundle init
```

{% endstep %}

{% step %}
Adicionar ao `Gemfile`

```ruby
gem "httparty"
```

{% endstep %}

{% step %}
Instalar / atualizar

```bash
bundle install
bundle update httparty
```

{% endstep %}

{% step %}
Executar script com ambiente bloqueado

```bash
bundle exec ruby app.rb
```

{% endstep %}
{% endstepper %}

***

## 🔄 Atualização

| Alvo         | Comando                                             |
| ------------ | --------------------------------------------------- |
| Ruby (rbenv) | `rbenv install <version> && rbenv global <version>` |
| Todas gems   | `bundle update`                                     |
| Uma gem      | `bundle update <name>`                              |
| Bundler      | `gem install bundler`                               |

***

## 🗃 Comandos Comuns

```bash
gem list
gem install <name>
gem uninstall <name>
bundle init
bundle install
bundle update
bundle exec ruby main.rb
```


# Rust

Instale Rust usando rustup, gerencie toolchains e verifique cargo para desenvolvimento local antes de fazer o upload na Discloud.

## 🧾 Visão Geral

Rust fornece performance, segurança de memória e uso previsível de recursos para APIs, workers e bots. Instale com `rustup` para gerenciar toolchains localmente antes de fazer o upload.

***

## 📥 Instalação (escolha seu SO)

{% tabs %}
{% tab title="🪟 Windows" %}
{% tabs %}
{% tab title="rustup-init (Oficial)" %}
{% stepper %}
{% step %}
Baixe o instalador: <https://win.rustup.rs/> (ou execute o comando abaixo no PowerShell)
{% endstep %}

{% step %}
Execute e aceite os padrões (instala no perfil do usuário).
{% endstep %}
{% endstepper %}
{% endtab %}

{% tab title="Alternativo (PowerShell):" %}

```bash
irm https://win.rustup.rs -UseBasicParsing | iex
```

{% endtab %}
{% endtabs %}

**Verificar**

```bash
rustc --version
cargo --version
```

**Atualizar Toolchain**

```bash
rustup update
```

{% endtab %}

{% tab title="🐧 Linux" %}
Instale via script rustup:

```bash
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
source ~/.cargo/env
rustc --version
cargo --version
```

**Adicionar Build Essentials (Debian/Ubuntu)**

```bash
sudo apt update
sudo apt install -y build-essential pkg-config libssl-dev
```

**Atualizar**

```bash
rustup update
```

**Remover Toolchain**

```bash
rustup self uninstall
```

{% endtab %}

{% tab title="🍎 macOS" %}
Instale com rustup:

```bash
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
source ~/.cargo/env
rustc --version
cargo --version
```

Adicionar ferramentas de build (se não presentes):

```bash
xcode-select --install  # solicita ferramentas de desenvolvedor
```

Atualizar:

```bash
rustup update
```

{% endtab %}
{% endtabs %}

***

## 🧰 Toolchains e Componentes

{% stepper %}
{% step %}
Listar instalados

```bash
rustup toolchain list
```

{% endstep %}

{% step %}
Adicionar nightly (opcional)

```bash
rustup toolchain install nightly
```

{% endstep %}

{% step %}
Definir padrão

```bash
rustup default stable
```

{% endstep %}

{% step %}
Adicionar componentes (exemplo)

```bash
rustup component add clippy rustfmt
```

{% endstep %}
{% endstepper %}

***

## 🗂 Inicialização do Projeto

Criar novo projeto:

```bash
cargo new myapp
cd myapp
cargo build
```

Executar:

```bash
cargo run
```

Formatar e lintar:

```bash
cargo fmt -- --check
cargo clippy -- -D warnings
```

***

## 🗃 Comandos Cargo Comuns

```bash
cargo new api-service          # criar projeto binário
cargo build --release          # build otimizado
cargo run                      # build + executar
cargo test                     # executar testes
cargo update                   # atualizar lock de dependências
cargo tree                     # gráfico de dependências (requer cargo-tree)
cargo doc --open               # construir docs localmente
```

Instalar cargo tree (se faltar):

```bash
cargo install cargo-tree
```

***

## 📦 Gerenciamento de Dependências

Dependências declaradas em [`Cargo.toml`](/development-environment/supported-languages/rust/cargo.toml) sob `[dependencies]`:

```toml
[dependencies]
reqwest = { version = "0.12", features = ["json"] }
serde = { version = "1", features = ["derive"] }
tokio = { version = "1", features = ["rt-multi-thread", "macros"] }
```

Atualizar lockfile:

```bash
cargo update
```

***

## 🔄 Atualização

```bash
rustup update            # atualizar todas as toolchains
rustup self update       # atualizar rustup em si
```


# Golang

Instale e gerencie Go localmente (Windows, macOS, Linux) usando arquivos oficiais ou gerenciadores de pacotes; gerencie módulos com go mod.

## 🧾 Visão Geral

Go (Golang) é uma linguagem compilada adequada para APIs, workers, CLIs e serviços concorrentes. A instalação local permite construir e testar binários antes de fazer o upload.

{% embed url="<https://go.dev>" %}

***

## 📥 Instalação (escolha uma)

{% tabs %}
{% tab title="Windows" %}
{% tabs %}
{% tab title="Instalador" %}
{% stepper %}
{% step %}
Baixe o .msi do Windows de <https://go.dev/dl/>
{% endstep %}

{% step %}
Execute-o (adiciona Go ao PATH).
{% endstep %}

{% step %}
Reabra o terminal (PowerShell / CMD).
{% endstep %}

{% step %}
Verifique:

```bash
go version
```

{% endstep %}
{% endstepper %}
{% endtab %}

{% tab title="Scoop" %}

```bash
scoop install go
go version
```

{% endtab %}
{% endtabs %}
{% endtab %}

{% tab title="Linux" %}
{% tabs %}
{% tab title="Tarball" %}

```bash
# Substitua a versão conforme necessário
curl -LO https://go.dev/dl/go1.22.6.linux-amd64.tar.gz
sudo rm -rf /usr/local/go
sudo tar -C /usr/local -xzf go1.22.6.linux-amd64.tar.gz
export PATH="/usr/local/go/bin:$PATH"
go version
```

{% hint style="info" %}
Adicione a linha PATH ao \~/.bashrc ou \~/.zshrc para persistir.
{% endhint %}
{% endtab %}

{% tab title="Debian/Ubuntu" %}

```bash
sudo apt update
sudo apt install -y golang-go
go version
```

{% hint style="info" %}
Nota: A versão do repositório pode estar atrasada em relação à mais recente.
{% endhint %}
{% endtab %}

{% tab title="Fedora" %}

```bash
sudo dnf install -y golang
go version
```

{% endtab %}

{% tab title="Arch" %}

```bash
sudo pacman -S --needed go
go version
```

{% endtab %}
{% endtabs %}
{% endtab %}

{% tab title="macOS" %}
{% tabs %}
{% tab title="Instalador" %}
Baixe o .pkg de <https://go.dev/dl/> então:

```bash
go version
```

{% endtab %}

{% tab title="Homebrew" %}

```bash
brew update
brew install go
go version
```

{% endtab %}

{% tab title="Tarball" %}

```bash
curl -LO https://go.dev/dl/go1.22.6.darwin-arm64.tar.gz
sudo rm -rf /usr/local/go
sudo tar -C /usr/local -xzf go1.22.6.darwin-arm64.tar.gz
export PATH="/usr/local/go/bin:$PATH"
go version
```

{% hint style="info" %}
Adicione a exportação PATH ao perfil do shell para persistir.
{% endhint %}
{% endtab %}
{% endtabs %}
{% endtab %}
{% endtabs %}

***

## 🗂 Módulos e Inicialização do Projeto

{% stepper %}
{% step %}
Inicialize um módulo (cria go.mod)

```
mkdir myapp && cd myapp
go mod init example.com/myapp
go get
```

{% endstep %}

{% step %}
Adicione um arquivo `main.go`

```go
package main
import "fmt"
func main() { fmt.Println("hello") }
```

{% endstep %}

{% step %}
Execute

```bash
go run .
```

{% endstep %}

{% step %}
Construa

```bash
go build -o app
```

{% endstep %}
{% endstepper %}

***

## 🔄 Atualização

| Tarefa                          | Comando                 |
| ------------------------------- | ----------------------- |
| Organizar módulos               | `go mod tidy`           |
| Atualizar deps (menor/correção) | `go get -u ./...`       |
| Atualizar módulo único          | `go get -u module/name` |
| Verificar módulos               | `go mod verify`         |

***

## 🗃 Comandos Comuns

```bash
go mod init example.com/project
go mod tidy
go run .
go build -o bin/app
go test ./...
go list -m all
```


# Visão Geral da API

Referência completa da REST API da Discloud: autenticação, endpoints e grupos de recursos.

### 🌐 URL Base

Todas as requisições apontam para:

```
https://api.discloud.app/v2
```

***

### 🔑 Autenticação

Toda requisição exige o header `api-token` com o seu token pessoal:

```bash
api-token: SEU_TOKEN_AQUI
```

Consulte [Autenticação](#autenticacao) para saber como obter e proteger o token.

***

### ⚡ Início Rápido

{% stepper %}
{% step %}
Obtenha seu token da API no Dashboard.
{% endstep %}

{% step %}
Faça sua primeira requisição para confirmar que o token funciona:

```bash
curl -X GET \
  -H "api-token: SEU_TOKEN_AQUI" \
  https://api.discloud.app/v2/user
```

Uma resposta `200 OK` com seus dados de usuário confirma que a autenticação está correta.
{% endstep %}
{% endstepper %}

{% hint style="danger" %}
Nunca exponha seu token em código público ou repositórios Git. Armazene-o em variáveis de ambiente. Consulte [Autenticação](#autenticacao) para boas práticas de segurança.
{% endhint %}


# Autenticação

Guia de autenticação para usar a API da Discloud (como obter e usar com segurança seu Token da API).

{% hint style="info" %}
Todas as solicitações para a API da Discloud devem incluir um **Token da API** no cabeçalho `api-token`.

Se você ainda não tem um token, gere ou recupere-o no seu painel da Discloud. (Substitua esta nota pelo link exato do painel ou uma captura de tela.)
{% endhint %}

***

## ⚙️ Como Funciona

{% stepper %}
{% step %}
Você gera um [token](/faq/general-questions/how-can-i-get-my-discloud-api-token) único vinculado à sua conta.
{% endstep %}

{% step %}
Para cada solicitação HTTP, inclua o cabeçalho: `api-token: SEU_TOKEN_AQUI`.
{% endstep %}

{% step %}
O token autentica e autoriza ações em nome da sua conta (nunca compartilhe-o).
{% endstep %}

{% step %}
Use o endpoint `/user` para validar rapidamente o token.
{% endstep %}
{% endstepper %}

***

## 📤 Enviando o Token

{% tabs %}
{% tab title="cURL" %}

```bash
curl -X GET \
  -H "api-token: $DISCLOUD_TOKEN" \
  https://api.discloud.app/v2/user
```

{% endtab %}

{% tab title="Node.js (fetch)" %}

```javascript
import fetch from "node-fetch";

async function getCurrentUser() {
  const res = await fetch("https://api.discloud.app/v2/user", {
    headers: { "api-token": process.env.DISCLOUD_TOKEN },
  });

  if (!res.ok) {
    console.error("Solicitação falhou:", res.status, await res.text());
    return;
  }
  const data = await res.json();
  console.log(data);
}
```

{% endtab %}

{% tab title="Node.js (discloud.app SDK)" %}

```javascript
// Instale primeiro: npm i discloud.app
const { discloud } = require("discloud.app");

async function validateToken() {
  try {
    const user = await discloud.login("DISCLOUD_API_TOKEN");
    console.log("Usuário autenticado:", user);
  } catch (e) {
    console.error("Token inválido ou erro de rede:", e.message);
  }
}
```

{% endtab %}
{% endtabs %}

***

## 🛡 Protegendo o Token

{% hint style="danger" %}
Nunca commite seu token (ex. no Git). Armazene-o em variáveis de ambiente ([`.env`](/faq/general-questions/.env-file), segredos CI/CD, etc.).
{% endhint %}

📌 Melhores práticas:

* Use variáveis de ambiente em vez de codificar.
* Rotacione o token periodicamente (ex. a cada 90 dias).
* Revogue e regenere imediatamente se suspeitar de exposição.
* Restrinja quem pode acessar a infraestrutura onde a variável está armazenada.

***

## ⚡ Verificação Rápida do Token

Chame `/user` logo após definir a variável de ambiente. Se você receber HTTP 200 com dados do usuário, a autenticação está funcionando.

{% hint style="info" %}
Você também pode atualizar a localidade do usuário (ex. `en-US`) através de `/locale/{locale}` para validar outra rota autenticada.
{% endhint %}

***

## 📚 Referência dos Endpoints Relacionados

As operações abaixo requerem o cabeçalho `api-token`:

## Obter informações do usuário atual

> Retorna informações sobre o usuário autenticado

```json
{"openapi":"3.0.4","info":{"title":"Discloud API","version":"2.0.0"},"tags":[{"name":"Usuário","description":"Operações sobre usuários"}],"servers":[{"url":"https://api.discloud.app/v2","description":"Servidor API"}],"security":[{"ApiKeyAuth":[]}],"components":{"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"api-token"}},"schemas":{"UserResponse":{"type":"object","properties":{"status":{"type":"string"},"message":{"type":"string"},"user":{"$ref":"#/components/schemas/User"}}},"User":{"type":"object","properties":{"userID":{"type":"string","description":"O ID do usuário"},"totalRamMb":{"type":"integer","description":"RAM total alocada (em MB)"},"ramUsedMb":{"type":"integer","description":"RAM atualmente sendo usada (em MB)"},"subdomains":{"type":"array","items":{"type":"string"},"description":"Lista de subdomínios pertencentes"},"customdomains":{"type":"array","items":{"type":"string"},"description":"Lista de domínios personalizados pertencentes"},"apps":{"type":"array","items":{"type":"string"},"description":"Lista de IDs das aplicações pertencentes"},"plan":{"type":"string","description":"O plano de assinatura"},"locale":{"type":"string","description":"O idioma/localização"},"lastDataLeft":{"type":"object","properties":{"days":{"type":"integer","description":"Dias restantes no plano atual"},"hours":{"type":"integer","description":"Horas restantes no plano atual"},"minutes":{"type":"integer","description":"Minutos restantes no plano atual"},"seconds":{"type":"integer","description":"Segundos restantes no plano atual"}},"description":"Tempo restante do plano atual"},"planDataEnd":{"type":"string","format":"date-time","description":"Data de término do plano atual"}}},"Error":{"type":"object","properties":{"code":{"type":"integer"},"message":{"type":"string"}}}}},"paths":{"/user":{"get":{"tags":["Usuário"],"summary":"Obter informações do usuário atual","description":"Retorna informações sobre o usuário autenticado","operationId":"getCurrentUser","responses":{"200":{"description":"Operação bem-sucedida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserResponse"}}}},"401":{"description":"Erro de autenticação","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```


# Usuário

## Get current user information

> Returns information about the authenticated user

```json
{"openapi":"3.0.4","info":{"title":"Discloud API","version":"2.0.0"},"tags":[{"name":"User","description":"Operations about users"}],"servers":[{"url":"https://api.discloud.app/v2","description":"API Server"}],"security":[{"ApiKeyAuth":[]}],"components":{"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"api-token"}},"schemas":{"UserResponse":{"type":"object","properties":{"status":{"type":"string"},"message":{"type":"string"},"user":{"$ref":"#/components/schemas/User"}}},"User":{"type":"object","properties":{"userID":{"type":"string","description":"The unique identifier of the user"},"totalRamMb":{"type":"integer","description":"Total RAM allocated to the user (in MB)"},"ramUsedMb":{"type":"integer","description":"RAM currently being used by the user (in MB)"},"subdomains":{"type":"array","items":{"type":"string"},"description":"List of subdomains owned by the user"},"customdomains":{"type":"array","items":{"type":"string"},"description":"List of custom domains owned by the user"},"apps":{"type":"array","items":{"type":"string"},"description":"List of application IDs owned by the user"},"plan":{"type":"string","description":"The subscription plan of the user"},"locale":{"type":"string","description":"The language/locale"},"lastDataLeft":{"type":"object","properties":{"days":{"type":"integer","description":"Days remaining in the current plan"},"hours":{"type":"integer","description":"Hours remaining in the current plan"},"minutes":{"type":"integer","description":"Minutes remaining in the current plan"},"seconds":{"type":"integer","description":"Seconds remaining in the current plan"}},"description":"Time remaining in the current plan"},"planDataEnd":{"type":"string","format":"date-time","description":"End date of the current plan"}}},"Error":{"type":"object","properties":{"code":{"type":"integer"},"message":{"type":"string"}}}}},"paths":{"/user":{"get":{"tags":["User"],"summary":"Get current user information","description":"Returns information about the authenticated user","operationId":"getCurrentUser","responses":{"200":{"description":"Successful operation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserResponse"}}}},"401":{"description":"Authentication error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## Update user locale

> Updates the user's preferred language/locale

```json
{"openapi":"3.0.4","info":{"title":"Discloud API","version":"2.0.0"},"tags":[{"name":"User","description":"Operations about users"}],"servers":[{"url":"https://api.discloud.app/v2","description":"API Server"}],"security":[{"ApiKeyAuth":[]}],"components":{"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"api-token"}},"schemas":{"LocaleResponse":{"type":"object","properties":{"status":{"type":"string"},"locale":{"type":"string","enum":["pt-BR","en-US"]}}},"Error":{"type":"object","properties":{"code":{"type":"integer"},"message":{"type":"string"}}},"LocaleErrorResponse":{"type":"object","properties":{"status":{"type":"string"},"message":{"type":"string"},"localeList":{"type":"array","items":{"type":"string"}}}}}},"paths":{"/locale/{locale}":{"put":{"tags":["User"],"summary":"Update user locale","description":"Updates the user's preferred language/locale","operationId":"updateUserLocale","parameters":[{"name":"locale","in":"path","required":true,"description":"The locale to set for the user","schema":{"type":"string","enum":["pt-BR","en-US"]}}],"responses":{"200":{"description":"Locale successfully updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LocaleResponse"}}}},"401":{"description":"Authentication error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Invalid locale specified","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LocaleErrorResponse"}}}}}}}}}
```


# Aplicações

## Fazer upload da aplicação

> Faz upload de uma nova aplicação para a Discloud

```json
{"openapi":"3.0.3","info":{"title":"Discloud API","version":"2.0.0"},"tags":[{"name":"Aplicações","description":"Operações sobre Aplicações"}],"servers":[{"url":"https://api.discloud.app/v2","description":"Servidor API"}],"security":[{"ApiKeyAuth":[]}],"components":{"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"api-token"}},"schemas":{"UploadErrorResponse":{"type":"object","properties":{"status":{"type":"string"},"message":{"type":"string"}}},"Error":{"type":"object","properties":{"code":{"type":"integer"},"message":{"type":"string"}}}}},"paths":{"/upload":{"post":{"tags":["Aplicações"],"summary":"Fazer upload da aplicação","description":"Faz upload de uma nova aplicação para a Discloud","operationId":"uploadApplication","requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","required":["file"],"properties":{"file":{"type":"string","format":"binary","description":"Arquivo da aplicação para fazer upload (formato .ZIP)"},"projectId":{"type":"string","description":"ID do projeto ao qual a aplicação será vinculada no upload (opcional)."}}}}}},"responses":{"200":{"description":"Resposta do upload","content":{"application/json":{"schema":{"oneOf":[{"type":"object","properties":{"status":{"type":"string"},"message":{"type":"string"}}},{"$ref":"#/components/schemas/UploadErrorResponse"}]}}}},"401":{"description":"Erro de autenticação","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Arquivo obrigatório ausente","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UploadErrorResponse"}}}}}}}}}
```

## Obter informações da aplicação

> Recupera informações sobre uma aplicação específica ou todas as aplicações

```json
{"openapi":"3.0.4","info":{"title":"Discloud API","version":"2.0.0"},"tags":[{"name":"Aplicações","description":"Operações sobre Aplicações"}],"servers":[{"url":"https://api.discloud.app/v2","description":"Servidor API"}],"security":[{"ApiKeyAuth":[]}],"components":{"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"api-token"}},"schemas":{"AppResponse":{"type":"object","properties":{"status":{"type":"string"},"message":{"type":"string"},"apps":{"oneOf":[{"$ref":"#/components/schemas/App"},{"type":"array","items":{"$ref":"#/components/schemas/App"}}]}}},"App":{"type":"object","properties":{"id":{"type":"string","description":"ID da aplicação"},"avatarURL":{"type":"string","description":"URL para a imagem do avatar da aplicação"},"name":{"type":"string","description":"Nome da aplicação"},"type":{"type":"integer","description":"Tipo de aplicação"},"online":{"type":"boolean","description":"Se a aplicação está atualmente online"},"ramKilled":{"type":"boolean","description":"Se a aplicação foi desligada devido a ultrapassagem da quantidade de RAM"},"exitCode":{"type":"integer","description":"Código de saída da aplicação, se ele foi interrompido"},"ram":{"type":"integer","description":"RAM alocada para a aplicação (em MB)"},"mainFile":{"type":"string","description":"Caminho do arquivo principal da aplicação"},"lang":{"type":"string","description":"Linguagem de programação da aplicação"},"mods":{"type":"array","items":{"type":"string"},"description":"Módulos adicionais ou dependências"},"autoDeployGit":{"type":"string","description":"Configuração Git/GitHub"},"autoRestart":{"type":"boolean","description":"Se a aplicação reinicia automaticamente em caso de falha"}}},"Error":{"type":"object","properties":{"code":{"type":"integer"},"message":{"type":"string"}}},"UploadErrorResponse":{"type":"object","properties":{"status":{"type":"string"},"message":{"type":"string"}}}}},"paths":{"/app/{appID}":{"get":{"tags":["Aplicações"],"summary":"Obter informações da aplicação","description":"Recupera informações sobre uma aplicação específica ou todas as aplicações","operationId":"getAppInfo","parameters":[{"name":"appID","in":"path","required":true,"description":"ID da aplicação ou \"all\" para recuperar todas as aplicações","schema":{"type":"string"}}],"responses":{"200":{"description":"Informações da aplicação recuperadas com sucesso","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponse"}}}},"401":{"description":"Erro de autenticação","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Aplicação não encontrada","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UploadErrorResponse"}}}}}}}}}
```

## Obter status da aplicação

> Recupera informações de status sobre uma aplicação específica ou todas as aplicações

```json
{"openapi":"3.0.4","info":{"title":"Discloud API","version":"2.0.0"},"tags":[{"name":"Aplicações","description":"Operações sobre Aplicações"}],"servers":[{"url":"https://api.discloud.app/v2","description":"Servidor API"}],"security":[{"ApiKeyAuth":[]}],"components":{"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"api-token"}},"schemas":{"AppStatusResponse":{"type":"object","properties":{"status":{"type":"string"},"message":{"type":"string"},"apps":{"oneOf":[{"$ref":"#/components/schemas/AppStatus"},{"type":"array","items":{"$ref":"#/components/schemas/AppStatus"}}]}}},"AppStatus":{"type":"object","properties":{"id":{"type":"string","description":"ID da aplicação"},"container":{"type":"string","description":"Status do contêiner da aplicação"},"cpu":{"type":"string","description":"Uso atual de CPU da aplicação"},"memory":{"type":"string","description":"Uso e alocação de memória atual"},"ssd":{"type":"string","description":"Espaço de armazenamento usado pela aplicação"},"netIO":{"type":"object","properties":{"down":{"type":"string","description":"Uso de download de rede"},"up":{"type":"string","description":"Uso de upload de rede"}}},"last_restart":{"type":"string","description":"Tempo desde a última reinicialização da aplicação"},"startedAt":{"type":"string","format":"date-time","description":"Timestamp de quando a aplicação foi iniciada"}}},"Error":{"type":"object","properties":{"code":{"type":"integer"},"message":{"type":"string"}}},"UploadErrorResponse":{"type":"object","properties":{"status":{"type":"string"},"message":{"type":"string"}}}}},"paths":{"/app/{appID}/status":{"get":{"tags":["Aplicações"],"summary":"Obter status da aplicação","description":"Recupera informações de status sobre uma aplicação específica ou todas as aplicações","operationId":"getAppStatus","parameters":[{"name":"appID","in":"path","required":true,"description":"ID da aplicação ou \"all\" para recuperar status de todas as aplicações","schema":{"type":"string"}}],"responses":{"200":{"description":"Status da aplicação obtido com sucesso","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppStatusResponse"}}}},"401":{"description":"Erro de autenticação","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Aplicação não encontrada","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UploadErrorResponse"}}}}}}}}}
```

## Obter logs da aplicação

> Recupera os logs de uma aplicação específica ou de todas as aplicações

```json
{"openapi":"3.0.4","info":{"title":"Discloud API","version":"2.0.0"},"tags":[{"name":"Aplicações","description":"Operações sobre Aplicações"}],"servers":[{"url":"https://api.discloud.app/v2","description":"Servidor API"}],"security":[{"ApiKeyAuth":[]}],"components":{"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"api-token"}},"schemas":{"AppLogsResponse":{"type":"object","properties":{"status":{"type":"string"},"message":{"type":"string"},"apps":{"oneOf":[{"$ref":"#/components/schemas/AppLogs"},{"type":"array","items":{"$ref":"#/components/schemas/AppLogs"}}]}}},"AppLogs":{"type":"object","properties":{"id":{"type":"string","description":"ID da aplicação"},"terminal":{"type":"object","properties":{"big":{"type":"string","description":"Logs completos da aplicação"},"small":{"type":"string","description":"Logs condensados da aplicação"},"url":{"type":"string","description":"URL para visualizar os logs online"}}}}},"Error":{"type":"object","properties":{"code":{"type":"integer"},"message":{"type":"string"}}},"UploadErrorResponse":{"type":"object","properties":{"status":{"type":"string"},"message":{"type":"string"}}}}},"paths":{"/app/{appID}/logs":{"get":{"tags":["Aplicações"],"summary":"Obter logs da aplicação","description":"Recupera os logs de uma aplicação específica ou de todas as aplicações","operationId":"getAppLogs","parameters":[{"name":"appID","in":"path","required":true,"description":"ID da aplicação ou \"all\" para recuperar logs de todas as aplicações","schema":{"type":"string"}}],"responses":{"200":{"description":"Logs da aplicação recuperados com sucesso","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppLogsResponse"}}}},"401":{"description":"Erro de autenticação","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Aplicação não encontrada","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UploadErrorResponse"}}}}}}}}}
```

## Obter backup da aplicação

> Gera e recupera o backup de uma aplicação específica ou de todas as aplicações

```json
{"openapi":"3.0.4","info":{"title":"Discloud API","version":"2.0.0"},"tags":[{"name":"Aplicações","description":"Operações sobre Aplicações"}],"servers":[{"url":"https://api.discloud.app/v2","description":"Servidor API"}],"security":[{"ApiKeyAuth":[]}],"components":{"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"api-token"}},"schemas":{"AppBackupResponse":{"type":"object","properties":{"status":{"type":"string"},"message":{"type":"string"},"backups":{"oneOf":[{"$ref":"#/components/schemas/AppBackup"},{"type":"array","items":{"$ref":"#/components/schemas/AppBackup"}}]}}},"AppBackup":{"type":"object","properties":{"id":{"type":"string","description":"ID da aplicação"},"url":{"type":"string","description":"URL para baixar o backup da aplicação"}}},"Error":{"type":"object","properties":{"code":{"type":"integer"},"message":{"type":"string"}}},"UploadErrorResponse":{"type":"object","properties":{"status":{"type":"string"},"message":{"type":"string"}}}}},"paths":{"/app/{appID}/backup":{"get":{"tags":["Aplicações"],"summary":"Obter backup da aplicação","description":"Gera e recupera o backup de uma aplicação específica ou de todas as aplicações","operationId":"getAppBackup","parameters":[{"name":"appID","in":"path","required":true,"description":"ID da aplicação ou \"all\" para recuperar backups de todas as aplicações","schema":{"type":"string"}}],"responses":{"200":{"description":"Backup da aplicação gerado com sucesso","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppBackupResponse"}}}},"401":{"description":"Erro de autenticação","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Aplicação não encontrada","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UploadErrorResponse"}}}}}}}}}
```

## Iniciar aplicação

> Inicia uma aplicação específica ou todas as aplicações

```json
{"openapi":"3.0.4","info":{"title":"Discloud API","version":"2.0.0"},"tags":[{"name":"Aplicações","description":"Operações sobre Aplicações"}],"servers":[{"url":"https://api.discloud.app/v2","description":"Servidor API"}],"security":[{"ApiKeyAuth":[]}],"components":{"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"api-token"}},"schemas":{"AppStartResponse":{"type":"object","properties":{"status":{"type":"string"},"message":{"type":"string"},"appStatus":{"$ref":"#/components/schemas/AppStartStatus"}}},"AppStartStatus":{"type":"object","properties":{"online":{"type":"boolean","description":"Se a aplicaçãoestá online"},"ramKilled":{"type":"boolean","description":"Se a aplicação foi desligada devido a ultrapassagem da quantidade de RAM"},"exitCode":{"type":"integer","description":"O código de saída do processo da aplicação"}}},"Error":{"type":"object","properties":{"code":{"type":"integer"},"message":{"type":"string"}}},"UploadErrorResponse":{"type":"object","properties":{"status":{"type":"string"},"message":{"type":"string"}}}}},"paths":{"/app/{appID}/start":{"put":{"tags":["Aplicações"],"summary":"Iniciar aplicação","description":"Inicia uma aplicação específica ou todas as aplicações","operationId":"startApp","parameters":[{"name":"appID","in":"path","required":true,"description":"ID da aplicação ou \"all\" para iniciar todas as aplicações","schema":{"type":"string"}}],"responses":{"200":{"description":"Aplicação iniciada com sucesso","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppStartResponse"}}}},"401":{"description":"Erro de autenticação","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Aplicação não encontrada","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UploadErrorResponse"}}}}}}}}}
```

## Reiniciar aplicação

> Reinicia uma aplicação específica ou todas as aplicações

```json
{"openapi":"3.0.4","info":{"title":"Discloud API","version":"2.0.0"},"tags":[{"name":"Aplicações","description":"Operações sobre Aplicações"}],"servers":[{"url":"https://api.discloud.app/v2","description":"Servidor API"}],"security":[{"ApiKeyAuth":[]}],"components":{"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"api-token"}},"schemas":{"AppRestartResponse":{"type":"object","properties":{"status":{"type":"string"},"message":{"type":"string"}}},"Error":{"type":"object","properties":{"code":{"type":"integer"},"message":{"type":"string"}}},"UploadErrorResponse":{"type":"object","properties":{"status":{"type":"string"},"message":{"type":"string"}}}}},"paths":{"/app/{appID}/restart":{"put":{"tags":["Aplicações"],"summary":"Reiniciar aplicação","description":"Reinicia uma aplicação específica ou todas as aplicações","operationId":"restartApp","parameters":[{"name":"appID","in":"path","required":true,"description":"ID da aplicação ou \"all\" para reiniciar todas as aplicações","schema":{"type":"string"}}],"responses":{"200":{"description":"Aplicação reiniciada com sucesso","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRestartResponse"}}}},"401":{"description":"Erro de autenticação","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Aplicação não encontrada","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UploadErrorResponse"}}}}}}}}}
```

## Parar aplicação

> Para uma aplicação específica ou todas as aplicações

```json
{"openapi":"3.0.4","info":{"title":"Discloud API","version":"2.0.0"},"tags":[{"name":"Aplicações","description":"Operações sobre Aplicações"}],"servers":[{"url":"https://api.discloud.app/v2","description":"Servidor API"}],"security":[{"ApiKeyAuth":[]}],"components":{"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"api-token"}},"schemas":{"AppStopResponse":{"type":"object","properties":{"status":{"type":"string"},"message":{"type":"string"}}},"Error":{"type":"object","properties":{"code":{"type":"integer"},"message":{"type":"string"}}},"UploadErrorResponse":{"type":"object","properties":{"status":{"type":"string"},"message":{"type":"string"}}}}},"paths":{"/app/{appID}/stop":{"put":{"tags":["Aplicações"],"summary":"Parar aplicação","description":"Para uma aplicação específica ou todas as aplicações","operationId":"stopApp","parameters":[{"name":"appID","in":"path","required":true,"description":"ID da aplicação ou \"all\" para parar todas as aplicações","schema":{"type":"string"}}],"responses":{"200":{"description":"Resposta de parada da aplicação","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppStopResponse"}}}},"401":{"description":"Erro de autenticação","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Aplicação não encontrada","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UploadErrorResponse"}}}}}}}}}
```

## Atualizar RAM da aplicação

> Atualiza a alocação de RAM para uma aplicação específica

```json
{"openapi":"3.0.4","info":{"title":"Discloud API","version":"2.0.0"},"tags":[{"name":"Aplicações","description":"Operações sobre Aplicações"}],"servers":[{"url":"https://api.discloud.app/v2","description":"Servidor API"}],"security":[{"ApiKeyAuth":[]}],"components":{"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"api-token"}},"schemas":{"AppRamUpdateRequest":{"type":"object","required":["ramMB"],"properties":{"ramMB":{"type":"integer","description":"A quantidade de RAM em MB para alocar a aplicação"}}},"AppRamUpdateResponse":{"type":"object","properties":{"status":{"type":"string"},"statusCode":{"type":"integer"},"message":{"type":"string"}}},"Error":{"type":"object","properties":{"code":{"type":"integer"},"message":{"type":"string"}}},"UploadErrorResponse":{"type":"object","properties":{"status":{"type":"string"},"message":{"type":"string"}}}}},"paths":{"/app/{appID}/ram":{"put":{"tags":["Aplicações"],"summary":"Atualizar RAM da aplicação","description":"Atualiza a alocação de RAM para uma aplicação específica","operationId":"updateAppRam","parameters":[{"name":"appID","in":"path","required":true,"description":"ID da aplicação para atualizar a RAM","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRamUpdateRequest"}}}},"responses":{"200":{"description":"Resposta de atualização de RAM","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRamUpdateResponse"}}}},"401":{"description":"Erro de autenticação","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Aplicação não encontrada ou limitação do plano","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UploadErrorResponse"}}}}}}}}}
```

## Atualizar código da aplicação

> Atualiza uma aplicação existente fazendo upload de uma nova versão do código

```json
{"openapi":"3.0.4","info":{"title":"Discloud API","version":"2.0.0"},"tags":[{"name":"Aplicações","description":"Operações sobre Aplicações"}],"servers":[{"url":"https://api.discloud.app/v2","description":"Servidor API"}],"security":[{"ApiKeyAuth":[]}],"components":{"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"api-token"}},"schemas":{"Error":{"type":"object","properties":{"code":{"type":"integer"},"message":{"type":"string"}}},"UploadErrorResponse":{"type":"object","properties":{"status":{"type":"string"},"message":{"type":"string"}}}}},"paths":{"/app/{appID}/commit":{"put":{"tags":["Aplicações"],"summary":"Atualizar código da aplicação","description":"Atualiza uma aplicação existente fazendo upload de uma nova versão do código","operationId":"commitAppChanges","parameters":[{"name":"appID","in":"path","required":true,"description":"ID da aplicação a ser atualizada","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","required":["file"],"properties":{"file":{"type":"string","format":"binary","description":"Arquivo da aplicação a ser enviado (formato .ZIP)"}}}}}},"responses":{"200":{"description":"Resposta de commit","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string"},"message":{"type":"string"}}}}}},"401":{"description":"Erro de autenticação","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Aplicação não encontrada","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UploadErrorResponse"}}}}}}}}}
```

## Atualizar perfil da aplicação

> Atualiza as informações de perfil (avatar e nome) de uma aplicação específica

```json
{"openapi":"3.0.4","info":{"title":"Discloud API","version":"2.0.0"},"tags":[{"name":"Aplicações","description":"Operações sobre Aplicações"}],"servers":[{"url":"https://api.discloud.app/v2","description":"Servidor API"}],"security":[{"ApiKeyAuth":[]}],"components":{"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"api-token"}},"schemas":{"AppProfileUpdateRequest":{"type":"object","required":["avatarURL","name"],"properties":{"avatarURL":{"type":"string","description":"URL para a imagem do avatar da aplicação"},"name":{"type":"string","description":"Nome da aplicação"}}},"AppProfileUpdateResponse":{"type":"object","properties":{"status":{"type":"string"},"statusCode":{"type":"integer"},"message":{"type":"string"}}},"Error":{"type":"object","properties":{"code":{"type":"integer"},"message":{"type":"string"}}}}},"paths":{"/app/{appID}/profile":{"put":{"tags":["Aplicações"],"summary":"Atualizar perfil da aplicação","description":"Atualiza as informações de perfil (avatar e nome) de uma aplicação específica","operationId":"updateAppProfile","parameters":[{"name":"appID","in":"path","required":true,"description":"ID da aplicação a ser atualizada","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppProfileUpdateRequest"}}}},"responses":{"200":{"description":"Perfil da aplicação atualizado com sucesso","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppProfileUpdateResponse"}}}},"401":{"description":"Erro de autenticação","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Aplicação não encontrada","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string"},"message":{"type":"string"}}}}}}}}}}}
```

## Listar arquivos e pastas

> Lista arquivos e pastas no diretório da aplicação

```json
{"openapi":"3.0.4","info":{"title":"Discloud API","version":"2.0.0"},"tags":[{"name":"Aplicações","description":"Operações sobre Aplicações"}],"servers":[{"url":"https://api.discloud.app/v2","description":"Servidor API"}],"security":[{"ApiKeyAuth":[]}],"components":{"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"api-token"}},"schemas":{"ExplorerListResponse":{"type":"object","properties":{"status":{"type":"string"},"path":{"type":"string","description":"Caminho do diretório atual"},"dir":{"type":"array","items":{"$ref":"#/components/schemas/FileItem"}}}},"FileItem":{"type":"object","properties":{"size":{"type":"integer","description":"Tamanho do arquivo em bytes (apenas para arquivos)"},"name":{"type":"string","description":"Nome do arquivo ou diretório"},"type":{"enum":["file","directory"],"description":"Tipo de item","type":"string"}}},"Error":{"type":"object","properties":{"code":{"type":"integer"},"message":{"type":"string"}}}}},"paths":{"/app/{appID}/explorer":{"get":{"tags":["Aplicações"],"summary":"Listar arquivos e pastas","description":"Lista arquivos e pastas no diretório da aplicação","operationId":"listExplorer","parameters":[{"name":"appID","in":"path","required":true,"description":"ID da aplicação","schema":{"type":"string"}},{"name":"cPath","in":"query","required":false,"description":"Caminho do diretório (padrão: workDir da app)","schema":{"type":"string"}}],"responses":{"200":{"description":"Arquivos e pastas listados com sucesso","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExplorerListResponse"}}}},"401":{"description":"Erro de autenticação","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Sem permissão ou plano insuficiente","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Aplicação não encontrada ou caminho inválido","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## Criar arquivo ou pasta

> Cria um novo arquivo ou pasta na aplicação

```json
{"openapi":"3.0.4","info":{"title":"Discloud API","version":"2.0.0"},"tags":[{"name":"Aplicações","description":"Operações sobre Aplicações"}],"servers":[{"url":"https://api.discloud.app/v2","description":"Servidor API"}],"security":[{"ApiKeyAuth":[]}],"components":{"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"api-token"}},"schemas":{"ExplorerCreateRequest":{"type":"object","required":["cPath","typeFile"],"properties":{"typeFile":{"enum":["file","directory"],"description":"Tipo a criar","type":"string"},"cPath":{"type":"string","description":"Caminho completo para o novo arquivo ou diretório"}}},"ExplorerOperationResponse":{"type":"object","properties":{"status":{"type":"string"},"path":{"type":"string","description":"Caminho do alvo da operação"}}},"Error":{"type":"object","properties":{"code":{"type":"integer"},"message":{"type":"string"}}}}},"paths":{"/app/{appID}/explorer":{"post":{"tags":["Aplicações"],"summary":"Criar arquivo ou pasta","description":"Cria um novo arquivo ou pasta na aplicação","operationId":"createExplorer","parameters":[{"name":"appID","in":"path","required":true,"description":"ID da aplicação","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExplorerCreateRequest"}}}},"responses":{"200":{"description":"Arquivo ou pasta criado com sucesso","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExplorerOperationResponse"}}}},"400":{"description":"Requisição inválida - campos obrigatórios faltando","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Erro de autenticação","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Sem permissão ou plano insuficiente","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Aplicação não encontrada ou caminho inválido","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## Abrir/ler arquivo

> Lê o conteúdo de um arquivo na aplicação

```json
{"openapi":"3.0.4","info":{"title":"Discloud API","version":"2.0.0"},"tags":[{"name":"Aplicações","description":"Operações sobre Aplicações"}],"servers":[{"url":"https://api.discloud.app/v2","description":"Servidor API"}],"security":[{"ApiKeyAuth":[]}],"components":{"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"api-token"}},"schemas":{"ExplorerOpenResponse":{"type":"object","properties":{"status":{"type":"string"},"path":{"type":"string","description":"Caminho completo do arquivo"},"name":{"type":"string","description":"Nome do arquivo"},"content":{"type":"string","description":"Conteúdo do arquivo"},"message":{"type":"string"}}},"Error":{"type":"object","properties":{"code":{"type":"integer"},"message":{"type":"string"}}}}},"paths":{"/app/{appID}/explorer/open":{"get":{"tags":["Aplicações"],"summary":"Abrir/ler arquivo","description":"Lê o conteúdo de um arquivo na aplicação","operationId":"openExplorer","parameters":[{"name":"appID","in":"path","required":true,"description":"ID da aplicação","schema":{"type":"string"}},{"name":"cPath","in":"query","required":true,"description":"Caminho completo do arquivo","schema":{"type":"string"}}],"responses":{"200":{"description":"Arquivo aberto com sucesso","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExplorerOpenResponse"}}}},"401":{"description":"Erro de autenticação","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Sem permissão ou plano insuficiente","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Arquivo não encontrado ou caminho inválido","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## Editar arquivo

> Edita o conteúdo de um arquivo na aplicação

```json
{"openapi":"3.0.4","info":{"title":"Discloud API","version":"2.0.0"},"tags":[{"name":"Aplicações","description":"Operações sobre Aplicações"}],"servers":[{"url":"https://api.discloud.app/v2","description":"Servidor API"}],"security":[{"ApiKeyAuth":[]}],"components":{"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"api-token"}},"schemas":{"ExplorerEditRequest":{"type":"object","required":["cPath","fileContent"],"properties":{"fileContent":{"type":"string","description":"Novo conteúdo do arquivo"},"cPath":{"type":"string","description":"Caminho completo do arquivo"}}},"ExplorerOperationResponse":{"type":"object","properties":{"status":{"type":"string"},"path":{"type":"string","description":"Caminho do alvo da operação"}}},"Error":{"type":"object","properties":{"code":{"type":"integer"},"message":{"type":"string"}}}}},"paths":{"/app/{appID}/explorer/edit":{"put":{"tags":["Aplicações"],"summary":"Editar arquivo","description":"Edita o conteúdo de um arquivo na aplicação","operationId":"editExplorer","parameters":[{"name":"appID","in":"path","required":true,"description":"ID da aplicação","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExplorerEditRequest"}}}},"responses":{"200":{"description":"Arquivo editado com sucesso","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExplorerOperationResponse"}}}},"400":{"description":"Requisição inválida - campos obrigatórios faltando","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Erro de autenticação","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Sem permissão ou plano insuficiente","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Arquivo não encontrado ou caminho inválido","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## Executar comando no container

> Executa um comando dentro do container da aplicação

```json
{"openapi":"3.0.4","info":{"title":"Discloud API","version":"2.0.0"},"tags":[{"name":"Aplicações","description":"Operações sobre Aplicações"}],"servers":[{"url":"https://api.discloud.app/v2","description":"Servidor API"}],"security":[{"ApiKeyAuth":[]}],"components":{"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"api-token"}},"schemas":{"ExecRequest":{"properties":{"cmd":{"type":"string","description":"Comando a ser executado no container"}},"type":"object","required":["cmd"]},"ExecResponse":{"properties":{"status":{"type":"string"},"statusCode":{"type":"integer"},"message":{"type":"string"},"exec":{"oneOf":[{"$ref":"#/components/schemas/ExecOutput"},{"type":"object","nullable":true}]}},"type":"object"},"ExecOutput":{"properties":{"stdout":{"type":"string","description":"Saída padrão do comando"},"stderr":{"type":"string","description":"Erro padrão do comando"},"exitCode":{"type":"integer","description":"Código de saída do comando"}},"type":"object"},"Error":{"type":"object","properties":{"code":{"type":"integer"},"message":{"type":"string"}}}}},"paths":{"/app/{appID}/exec":{"put":{"tags":["Aplicações"],"summary":"Executar comando no container","description":"Executa um comando dentro do container da aplicação","operationId":"execCommand","parameters":[{"name":"appID","in":"path","required":true,"description":"ID da aplicação","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExecRequest"}}}},"responses":{"200":{"description":"Comando executado com sucesso","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExecResponse"}}}},"401":{"description":"Erro de autenticação","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Sem permissão - apenas dono da app pode executar comandos","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Aplicação não encontrada ou offline","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExecResponse"}}}}}}}}}
```

## Deletar aplicação

> Deleta permanentemente uma aplicação

```json
{"openapi":"3.0.4","info":{"title":"Discloud API","version":"2.0.0"},"tags":[{"name":"Aplicações","description":"Operações sobre Aplicações"}],"servers":[{"url":"https://api.discloud.app/v2","description":"Servidor API"}],"security":[{"ApiKeyAuth":[]}],"components":{"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"api-token"}},"schemas":{"AppDeleteResponse":{"type":"object","properties":{"status":{"type":"string"},"message":{"type":"string"}}},"Error":{"type":"object","properties":{"code":{"type":"integer"},"message":{"type":"string"}}},"UploadErrorResponse":{"type":"object","properties":{"status":{"type":"string"},"message":{"type":"string"}}}}},"paths":{"/app/{appID}/delete":{"delete":{"tags":["Aplicações"],"summary":"Deletar aplicação","description":"Deleta permanentemente uma aplicação","operationId":"deleteApp","parameters":[{"name":"appID","in":"path","required":true,"description":"ID da aplicação a ser deletada","schema":{"type":"string"}}],"responses":{"200":{"description":"Aplicação deletada com sucesso","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppDeleteResponse"}}}},"401":{"description":"Erro de autenticação","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Aplicação não encontrada","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UploadErrorResponse"}}}}}}}}}
```


# Banco de Dados

## Listar presets de bancos

> Devolve o catálogo Dispack de motores disponíveis (versões, portas, volumes), sugestões aleatórias de nome/senha e, por motor, \`vars\` com as chaves de ambiente obrigatórias/opcionais e o mapa \`fromSuggestions\` (suggested\* → env) para montar o body do POST /database sem hardcodar nomes.

```json
{"openapi":"3.0.3","info":{"title":"Discloud API","version":"2.0.0"},"tags":[{"name":"Bancos de Dados","description":"Operações sobre bancos de dados gerenciados (criar, ciclo de vida, backups e logs). Requer plano Diamond (4) ou superior para criar/restaurar. Create e restore respondem de imediato com um id; consulte GET /database/{dbID} para o estado."}],"servers":[{"url":"https://api.discloud.app/v2","description":"Servidor API"}],"security":[{"ApiKeyAuth":[]}],"components":{"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"api-token"}},"schemas":{"Error":{"type":"object","properties":{"code":{"type":"integer"},"message":{"type":"string"}}}}},"paths":{"/database/presets":{"get":{"tags":["Bancos de Dados"],"summary":"Listar presets de bancos","description":"Devolve o catálogo Dispack de motores disponíveis (versões, portas, volumes), sugestões aleatórias de nome/senha e, por motor, `vars` com as chaves de ambiente obrigatórias/opcionais e o mapa `fromSuggestions` (suggested* → env) para montar o body do POST /database sem hardcodar nomes.","operationId":"listDatabasePresets","responses":{"200":{"description":"Presets carregados com sucesso","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Erro de autenticação","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## Criar banco de dados

> Inicia o provisionamento assíncrono de um banco gerenciado. Devolve HTTP 200 de imediato com o novo id. Consulte GET /database/{dbID} até o recurso existir e estar online. Plano mínimo Diamond (4). projectID opcional cobra a quota do dono do project e exige acesso de admin.

```json
{"openapi":"3.0.3","info":{"title":"Discloud API","version":"2.0.0"},"tags":[{"name":"Bancos de Dados","description":"Operações sobre bancos de dados gerenciados (criar, ciclo de vida, backups e logs). Requer plano Diamond (4) ou superior para criar/restaurar. Create e restore respondem de imediato com um id; consulte GET /database/{dbID} para o estado."}],"servers":[{"url":"https://api.discloud.app/v2","description":"Servidor API"}],"security":[{"ApiKeyAuth":[]}],"components":{"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"api-token"}},"schemas":{"Error":{"type":"object","properties":{"code":{"type":"integer"},"message":{"type":"string"}}}}},"paths":{"/database":{"post":{"tags":["Bancos de Dados"],"summary":"Criar banco de dados","description":"Inicia o provisionamento assíncrono de um banco gerenciado. Devolve HTTP 200 de imediato com o novo id. Consulte GET /database/{dbID} até o recurso existir e estar online. Plano mínimo Diamond (4). projectID opcional cobra a quota do dono do project e exige acesso de admin.","operationId":"createDatabase","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["displayName","db","totalRam"],"properties":{"displayName":{"type":"string","description":"Nome amigável (obrigatório)"},"db":{"type":"object","required":["type","version"],"properties":{"type":{"type":"string","description":"Motor (postgres, mysql, mariadb, mongodb, redis, valkey, …)"},"version":{"type":"string"},"extensions":{"type":"array","items":{"type":"string"}},"port":{"type":"integer"}}},"vars":{"type":"object","additionalProperties":{"type":"string"},"description":"Credenciais/env em texto plano (não envie varsEncrypted)"},"totalRam":{"type":"integer","minimum":100,"description":"RAM em MB (mínimo 100)"},"projectID":{"type":"string","description":"Projecto opcional a vincular"},"autoRestart":{"type":"boolean"}}}}}},"responses":{"200":{"description":"Criação iniciada","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Corpo inválido (campos em falta, varsEncrypted na criação, vars inválidas)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Erro de autenticação","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Plano ou quota de RAM insuficiente","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Já existe outro processo em execução para este recurso","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Sem cluster disponível ou hostnames esgotados","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## Listar bancos de dados

> Lista bancos do utilizador e bancos ligados a projects de equipas onde é membro. Segredos (vars / varsEncrypted) são omitidos.

```json
{"openapi":"3.0.3","info":{"title":"Discloud API","version":"2.0.0"},"tags":[{"name":"Bancos de Dados","description":"Operações sobre bancos de dados gerenciados (criar, ciclo de vida, backups e logs). Requer plano Diamond (4) ou superior para criar/restaurar. Create e restore respondem de imediato com um id; consulte GET /database/{dbID} para o estado."}],"servers":[{"url":"https://api.discloud.app/v2","description":"Servidor API"}],"security":[{"ApiKeyAuth":[]}],"components":{"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"api-token"}},"schemas":{"Error":{"type":"object","properties":{"code":{"type":"integer"},"message":{"type":"string"}}}}},"paths":{"/database":{"get":{"tags":["Bancos de Dados"],"summary":"Listar bancos de dados","description":"Lista bancos do utilizador e bancos ligados a projects de equipas onde é membro. Segredos (vars / varsEncrypted) são omitidos.","operationId":"listDatabases","responses":{"200":{"description":"Bancos listados com sucesso","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Erro de autenticação","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## Detalhes e estado do banco

> Devolve o estado ao vivo do container e vars em texto plano (desencriptadas). Mesmo modelo de acesso do dashboard: dono ou membro de equipa com acesso ao project.

```json
{"openapi":"3.0.3","info":{"title":"Discloud API","version":"2.0.0"},"tags":[{"name":"Bancos de Dados","description":"Operações sobre bancos de dados gerenciados (criar, ciclo de vida, backups e logs). Requer plano Diamond (4) ou superior para criar/restaurar. Create e restore respondem de imediato com um id; consulte GET /database/{dbID} para o estado."}],"servers":[{"url":"https://api.discloud.app/v2","description":"Servidor API"}],"security":[{"ApiKeyAuth":[]}],"components":{"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"api-token"}},"schemas":{"Error":{"type":"object","properties":{"code":{"type":"integer"},"message":{"type":"string"}}}}},"paths":{"/database/{dbID}":{"get":{"tags":["Bancos de Dados"],"summary":"Detalhes e estado do banco","description":"Devolve o estado ao vivo do container e vars em texto plano (desencriptadas). Mesmo modelo de acesso do dashboard: dono ou membro de equipa com acesso ao project.","operationId":"getDatabase","parameters":[{"name":"dbID","in":"path","required":true,"description":"ID do banco","schema":{"type":"string"}}],"responses":{"200":{"description":"Estado da base de dados carregado","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Erro de autenticação","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Sem acesso a este banco","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Banco não encontrado","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## Eliminar banco de dados

> Remove permanentemente o registo e a infraestrutura. Exige delete\_app.

```json
{"openapi":"3.0.3","info":{"title":"Discloud API","version":"2.0.0"},"tags":[{"name":"Bancos de Dados","description":"Operações sobre bancos de dados gerenciados (criar, ciclo de vida, backups e logs). Requer plano Diamond (4) ou superior para criar/restaurar. Create e restore respondem de imediato com um id; consulte GET /database/{dbID} para o estado."}],"servers":[{"url":"https://api.discloud.app/v2","description":"Servidor API"}],"security":[{"ApiKeyAuth":[]}],"components":{"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"api-token"}},"schemas":{"Error":{"type":"object","properties":{"code":{"type":"integer"},"message":{"type":"string"}}}}},"paths":{"/database/{dbID}":{"delete":{"tags":["Bancos de Dados"],"summary":"Eliminar banco de dados","description":"Remove permanentemente o registo e a infraestrutura. Exige delete_app.","operationId":"deleteDatabase","parameters":[{"name":"dbID","in":"path","required":true,"description":"ID do banco","schema":{"type":"string"}}],"responses":{"200":{"description":"Banco eliminado","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Erro de autenticação","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Sem permissão para eliminar","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Banco não encontrado","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Já existe outro processo em execução","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## Atualizar banco de dados

> Atualiza displayName, hostname e/ou totalRam. Exige commit\_app; alterar totalRam também exige edit\_ram. Hostname exige plano do dono \&gt; 3. Alterar hostname ou RAM dispara rebuild assíncrono da infra (rebuilding=true + opId); consulte GET /database/{dbID}.

```json
{"openapi":"3.0.3","info":{"title":"Discloud API","version":"2.0.0"},"tags":[{"name":"Bancos de Dados","description":"Operações sobre bancos de dados gerenciados (criar, ciclo de vida, backups e logs). Requer plano Diamond (4) ou superior para criar/restaurar. Create e restore respondem de imediato com um id; consulte GET /database/{dbID} para o estado."}],"servers":[{"url":"https://api.discloud.app/v2","description":"Servidor API"}],"security":[{"ApiKeyAuth":[]}],"components":{"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"api-token"}},"schemas":{"Error":{"type":"object","properties":{"code":{"type":"integer"},"message":{"type":"string"}}}}},"paths":{"/database/{dbID}":{"patch":{"tags":["Bancos de Dados"],"summary":"Atualizar banco de dados","description":"Atualiza displayName, hostname e/ou totalRam. Exige commit_app; alterar totalRam também exige edit_ram. Hostname exige plano do dono &gt; 3. Alterar hostname ou RAM dispara rebuild assíncrono da infra (rebuilding=true + opId); consulte GET /database/{dbID}.","operationId":"updateDatabase","parameters":[{"name":"dbID","in":"path","required":true,"description":"ID do banco","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"displayName":{"type":"string"},"hostname":{"type":"string","description":"Hostname privado (1–2 segmentos a-z0-9_ ligados por -, máx. 25)"},"totalRam":{"type":"integer","minimum":100,"maximum":16384}}}}}},"responses":{"200":{"description":"Banco atualizado (opcionalmente em rebuild)","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Corpo inválido ou nenhum campo para atualizar","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Erro de autenticação","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Sem permissão ou plano insuficiente para hostname","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Banco não encontrado","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Hostname já em uso","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Já existe outro processo em execução","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## Iniciar banco de dados

> Inicia o container do banco. Exige start\_app. Sujeito a verificações de RAM/slot.

```json
{"openapi":"3.0.3","info":{"title":"Discloud API","version":"2.0.0"},"tags":[{"name":"Bancos de Dados","description":"Operações sobre bancos de dados gerenciados (criar, ciclo de vida, backups e logs). Requer plano Diamond (4) ou superior para criar/restaurar. Create e restore respondem de imediato com um id; consulte GET /database/{dbID} para o estado."}],"servers":[{"url":"https://api.discloud.app/v2","description":"Servidor API"}],"security":[{"ApiKeyAuth":[]}],"components":{"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"api-token"}},"schemas":{"Error":{"type":"object","properties":{"code":{"type":"integer"},"message":{"type":"string"}}}}},"paths":{"/database/{dbID}/start":{"put":{"tags":["Bancos de Dados"],"summary":"Iniciar banco de dados","description":"Inicia o container do banco. Exige start_app. Sujeito a verificações de RAM/slot.","operationId":"startDatabase","parameters":[{"name":"dbID","in":"path","required":true,"description":"ID do banco","schema":{"type":"string"}}],"responses":{"200":{"description":"Iniciado (ou já em execução com status error)","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Erro de autenticação ou falha ao iniciar","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Sem permissão ou limite de recursos","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Banco não encontrado","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Já existe outro processo em execução","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## Parar banco de dados

> Para o container do banco. Exige stop\_app.

```json
{"openapi":"3.0.3","info":{"title":"Discloud API","version":"2.0.0"},"tags":[{"name":"Bancos de Dados","description":"Operações sobre bancos de dados gerenciados (criar, ciclo de vida, backups e logs). Requer plano Diamond (4) ou superior para criar/restaurar. Create e restore respondem de imediato com um id; consulte GET /database/{dbID} para o estado."}],"servers":[{"url":"https://api.discloud.app/v2","description":"Servidor API"}],"security":[{"ApiKeyAuth":[]}],"components":{"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"api-token"}},"schemas":{"Error":{"type":"object","properties":{"code":{"type":"integer"},"message":{"type":"string"}}}}},"paths":{"/database/{dbID}/stop":{"put":{"tags":["Bancos de Dados"],"summary":"Parar banco de dados","description":"Para o container do banco. Exige stop_app.","operationId":"stopDatabase","parameters":[{"name":"dbID","in":"path","required":true,"description":"ID do banco","schema":{"type":"string"}}],"responses":{"200":{"description":"Parado (ou já parado com status error)","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Erro de autenticação","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Sem permissão para parar","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Banco não encontrado","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Já existe outro processo em execução","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## Reiniciar banco de dados

> Reinicia o container do banco. Exige restart\_app.

```json
{"openapi":"3.0.3","info":{"title":"Discloud API","version":"2.0.0"},"tags":[{"name":"Bancos de Dados","description":"Operações sobre bancos de dados gerenciados (criar, ciclo de vida, backups e logs). Requer plano Diamond (4) ou superior para criar/restaurar. Create e restore respondem de imediato com um id; consulte GET /database/{dbID} para o estado."}],"servers":[{"url":"https://api.discloud.app/v2","description":"Servidor API"}],"security":[{"ApiKeyAuth":[]}],"components":{"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"api-token"}},"schemas":{"Error":{"type":"object","properties":{"code":{"type":"integer"},"message":{"type":"string"}}}}},"paths":{"/database/{dbID}/restart":{"put":{"tags":["Bancos de Dados"],"summary":"Reiniciar banco de dados","description":"Reinicia o container do banco. Exige restart_app.","operationId":"restartDatabase","parameters":[{"name":"dbID","in":"path","required":true,"description":"ID do banco","schema":{"type":"string"}}],"responses":{"200":{"description":"Reiniciado com sucesso","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Erro de autenticação ou falha ao reiniciar","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Sem permissão ou limite de recursos","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Banco não encontrado","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Já existe outro processo em execução","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## Criar backup do banco

> Cria um backup do banco gerenciado (síncrono). Exige backup\_app. Devolve metadados de download; chaves S3 são removidas da resposta.

```json
{"openapi":"3.0.3","info":{"title":"Discloud API","version":"2.0.0"},"tags":[{"name":"Bancos de Dados","description":"Operações sobre bancos de dados gerenciados (criar, ciclo de vida, backups e logs). Requer plano Diamond (4) ou superior para criar/restaurar. Create e restore respondem de imediato com um id; consulte GET /database/{dbID} para o estado."}],"servers":[{"url":"https://api.discloud.app/v2","description":"Servidor API"}],"security":[{"ApiKeyAuth":[]}],"components":{"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"api-token"}},"schemas":{"Error":{"type":"object","properties":{"code":{"type":"integer"},"message":{"type":"string"}}}}},"paths":{"/database/{dbID}/backup":{"post":{"tags":["Bancos de Dados"],"summary":"Criar backup do banco","description":"Cria um backup do banco gerenciado (síncrono). Exige backup_app. Devolve metadados de download; chaves S3 são removidas da resposta.","operationId":"backupDatabase","parameters":[{"name":"dbID","in":"path","required":true,"description":"ID do banco","schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"gzip":{"type":"boolean","default":true}}}}}},"responses":{"200":{"description":"Backup criado","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Backup não suportado ou falhou","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Erro de autenticação","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Sem permissão para backup","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Banco não encontrado","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Já existe outro processo em execução","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Banco offline","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## Listar backups do banco

> Lista backups no S3 deste banco. Exige status\_app.

```json
{"openapi":"3.0.3","info":{"title":"Discloud API","version":"2.0.0"},"tags":[{"name":"Bancos de Dados","description":"Operações sobre bancos de dados gerenciados (criar, ciclo de vida, backups e logs). Requer plano Diamond (4) ou superior para criar/restaurar. Create e restore respondem de imediato com um id; consulte GET /database/{dbID} para o estado."}],"servers":[{"url":"https://api.discloud.app/v2","description":"Servidor API"}],"security":[{"ApiKeyAuth":[]}],"components":{"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"api-token"}},"schemas":{"Error":{"type":"object","properties":{"code":{"type":"integer"},"message":{"type":"string"}}}}},"paths":{"/database/{dbID}/backups":{"get":{"tags":["Bancos de Dados"],"summary":"Listar backups do banco","description":"Lista backups no S3 deste banco. Exige status_app.","operationId":"listDatabaseBackups","parameters":[{"name":"dbID","in":"path","required":true,"description":"ID do banco","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Tamanho da página (1–1000, default 50). Alias maxKeys também aceite.","schema":{"type":"integer"}},{"name":"cursor","in":"query","required":false,"description":"Token de continuação de uma resposta anterior","schema":{"type":"string"}},{"name":"detail","in":"query","required":false,"description":"minimal (default) ou full","schema":{"type":"string","enum":["minimal","full"]}}],"responses":{"200":{"description":"Backups listados","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Erro de autenticação","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Sem permissão","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Banco não encontrado","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## Obter URL de download do backup

> Devolve uma URL pré-assinada do dump. Exige backup\_app.

```json
{"openapi":"3.0.3","info":{"title":"Discloud API","version":"2.0.0"},"tags":[{"name":"Bancos de Dados","description":"Operações sobre bancos de dados gerenciados (criar, ciclo de vida, backups e logs). Requer plano Diamond (4) ou superior para criar/restaurar. Create e restore respondem de imediato com um id; consulte GET /database/{dbID} para o estado."}],"servers":[{"url":"https://api.discloud.app/v2","description":"Servidor API"}],"security":[{"ApiKeyAuth":[]}],"components":{"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"api-token"}},"schemas":{"Error":{"type":"object","properties":{"code":{"type":"integer"},"message":{"type":"string"}}}}},"paths":{"/database/{dbID}/backups/{backupId}/download":{"get":{"tags":["Bancos de Dados"],"summary":"Obter URL de download do backup","description":"Devolve uma URL pré-assinada do dump. Exige backup_app.","operationId":"downloadDatabaseBackup","parameters":[{"name":"dbID","in":"path","required":true,"description":"ID do banco","schema":{"type":"string"}},{"name":"backupId","in":"path","required":true,"description":"ID do backup","schema":{"type":"string"}},{"name":"expiresInDays","in":"query","required":false,"description":"Validade da URL em dias (1–14)","schema":{"type":"integer","minimum":1,"maximum":14}}],"responses":{"200":{"description":"URL de download gerada","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Pedido inválido","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Erro de autenticação","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Sem permissão","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Banco ou backup não encontrado","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## Obter logs do banco

> Devolve logs recentes do container (mesmo formato dos logs de app). Exige logs\_app.

```json
{"openapi":"3.0.3","info":{"title":"Discloud API","version":"2.0.0"},"tags":[{"name":"Bancos de Dados","description":"Operações sobre bancos de dados gerenciados (criar, ciclo de vida, backups e logs). Requer plano Diamond (4) ou superior para criar/restaurar. Create e restore respondem de imediato com um id; consulte GET /database/{dbID} para o estado."}],"servers":[{"url":"https://api.discloud.app/v2","description":"Servidor API"}],"security":[{"ApiKeyAuth":[]}],"components":{"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"api-token"}},"schemas":{"Error":{"type":"object","properties":{"code":{"type":"integer"},"message":{"type":"string"}}}}},"paths":{"/database/{dbID}/logs":{"get":{"tags":["Bancos de Dados"],"summary":"Obter logs do banco","description":"Devolve logs recentes do container (mesmo formato dos logs de app). Exige logs_app.","operationId":"getDatabaseLogs","parameters":[{"name":"dbID","in":"path","required":true,"description":"ID do banco","schema":{"type":"string"}}],"responses":{"200":{"description":"Logs carregados","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Erro de autenticação","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Sem permissão para ler logs","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Banco não encontrado","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## Eliminar logs do banco

> Apaga os logs guardados do banco. Exige logs\_app.

```json
{"openapi":"3.0.3","info":{"title":"Discloud API","version":"2.0.0"},"tags":[{"name":"Bancos de Dados","description":"Operações sobre bancos de dados gerenciados (criar, ciclo de vida, backups e logs). Requer plano Diamond (4) ou superior para criar/restaurar. Create e restore respondem de imediato com um id; consulte GET /database/{dbID} para o estado."}],"servers":[{"url":"https://api.discloud.app/v2","description":"Servidor API"}],"security":[{"ApiKeyAuth":[]}],"components":{"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"api-token"}},"schemas":{"Error":{"type":"object","properties":{"code":{"type":"integer"},"message":{"type":"string"}}}}},"paths":{"/database/{dbID}/logs":{"delete":{"tags":["Bancos de Dados"],"summary":"Eliminar logs do banco","description":"Apaga os logs guardados do banco. Exige logs_app.","operationId":"deleteDatabaseLogs","parameters":[{"name":"dbID","in":"path","required":true,"description":"ID do banco","schema":{"type":"string"}}],"responses":{"200":{"description":"Logs eliminados","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Erro de autenticação","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Sem permissão para eliminar logs","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Banco não encontrado","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## Restaurar backup como novo banco

> Cria um novo banco gerenciado a partir de um backup (assíncrono). Exige backup\_app no banco de origem. Plano mínimo Diamond (4). Devolve o novo id de imediato; consulte GET /database/{id}.

```json
{"openapi":"3.0.3","info":{"title":"Discloud API","version":"2.0.0"},"tags":[{"name":"Bancos de Dados","description":"Operações sobre bancos de dados gerenciados (criar, ciclo de vida, backups e logs). Requer plano Diamond (4) ou superior para criar/restaurar. Create e restore respondem de imediato com um id; consulte GET /database/{dbID} para o estado."}],"servers":[{"url":"https://api.discloud.app/v2","description":"Servidor API"}],"security":[{"ApiKeyAuth":[]}],"components":{"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"api-token"}},"schemas":{"Error":{"type":"object","properties":{"code":{"type":"integer"},"message":{"type":"string"}}}}},"paths":{"/database/{dbID}/restore":{"post":{"tags":["Bancos de Dados"],"summary":"Restaurar backup como novo banco","description":"Cria um novo banco gerenciado a partir de um backup (assíncrono). Exige backup_app no banco de origem. Plano mínimo Diamond (4). Devolve o novo id de imediato; consulte GET /database/{id}.","operationId":"restoreDatabaseBackup","parameters":[{"name":"dbID","in":"path","required":true,"description":"ID do banco de origem (dono do backup)","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["backupId","totalRam"],"properties":{"backupId":{"type":"string"},"totalRam":{"type":"integer","minimum":100},"displayName":{"type":"string"},"projectID":{"type":"string"},"vars":{"type":"object","additionalProperties":{"type":"string"}},"varsEncrypted":{"type":"string","description":"Mutuamente exclusivo com vars"},"autoRestart":{"type":"boolean"},"db":{"type":"object","properties":{"version":{"type":"string"}}}}}}}},"responses":{"200":{"description":"Restauro iniciado","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Corpo inválido","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Erro de autenticação","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Sem permissão ou plano/quota insuficiente","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Banco de origem ou projeto não encontrado","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Já existe outro processo em execução","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```


# Subdominio

## Listar subdomínios

> Retorna todos os subdomínios do usuário autenticado. Requer plano Platinum ou superior.

```json
{"openapi":"3.0.4","info":{"title":"Discloud API","version":"2.0.0"},"tags":[{"name":"Subdomínios","description":"Operações sobre subdomínios"}],"servers":[{"url":"https://api.discloud.app/v2","description":"Servidor API"}],"security":[{"ApiKeyAuth":[]}],"components":{"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"api-token"}},"schemas":{"Error":{"type":"object","properties":{"code":{"type":"integer"},"message":{"type":"string"}}}}},"paths":{"/subdomain/all":{"get":{"tags":["Subdomínios"],"summary":"Listar subdomínios","description":"Retorna todos os subdomínios do usuário autenticado. Requer plano Platinum ou superior.","operationId":"listSubdomains","responses":{"200":{"description":"Lista de subdomínios retornada com sucesso","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubdomainListResponse"}}}},"401":{"description":"Erro de autenticação","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Plano insuficiente","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## Obter subdomínio

> Retorna as informações de um subdomínio específico do usuário. Requer plano Platinum ou superior.

```json
{"openapi":"3.0.4","info":{"title":"Discloud API","version":"2.0.0"},"tags":[{"name":"Subdomínios","description":"Operações sobre subdomínios"}],"servers":[{"url":"https://api.discloud.app/v2","description":"Servidor API"}],"security":[{"ApiKeyAuth":[]}],"components":{"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"api-token"}},"schemas":{"Error":{"type":"object","properties":{"code":{"type":"integer"},"message":{"type":"string"}}}}},"paths":{"/subdomain/{subdomainName}":{"get":{"tags":["Subdomínios"],"summary":"Obter subdomínio","description":"Retorna as informações de um subdomínio específico do usuário. Requer plano Platinum ou superior.","operationId":"getSubdomain","parameters":[{"name":"subdomainName","in":"path","required":true,"description":"Nome do subdomínio (sem o sufixo .discloud.app)","schema":{"type":"string"}}],"responses":{"200":{"description":"Subdomínio retornado com sucesso","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubdomainResponse"}}}},"401":{"description":"Erro de autenticação","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Plano insuficiente ou sem permissão","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Subdomínio não encontrado","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## Criar subdomínio

> Cria um novo subdomínio. Requer plano Platinum ou superior. Máximo de 100 subdomínios por usuário.

```json
{"openapi":"3.0.4","info":{"title":"Discloud API","version":"2.0.0"},"tags":[{"name":"Subdomínios","description":"Operações sobre subdomínios"}],"servers":[{"url":"https://api.discloud.app/v2","description":"Servidor API"}],"security":[{"ApiKeyAuth":[]}],"components":{"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"api-token"}},"schemas":{"Error":{"type":"object","properties":{"code":{"type":"integer"},"message":{"type":"string"}}}}},"paths":{"/subdomain/{subdomainName}":{"post":{"tags":["Subdomínios"],"summary":"Criar subdomínio","description":"Cria um novo subdomínio. Requer plano Platinum ou superior. Máximo de 100 subdomínios por usuário.","operationId":"createSubdomain","parameters":[{"name":"subdomainName","in":"path","required":true,"description":"Nome desejado para o subdomínio (sem o sufixo .discloud.app)","schema":{"type":"string","pattern":"^[a-z0-9-]{2,20}$"}}],"responses":{"201":{"description":"Subdomínio criado com sucesso","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubdomainResponse"}}}},"400":{"description":"Nome de subdomínio inválido ou palavra inapropriada","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Erro de autenticação","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Plano insuficiente ou limite atingido","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Subdomínio já registrado","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## Remover subdomínio

> Remove um subdomínio do usuário. Não é possível remover subdomínios que estejam em uso (status 2). Requer plano Platinum ou superior.

```json
{"openapi":"3.0.4","info":{"title":"Discloud API","version":"2.0.0"},"tags":[{"name":"Subdomínios","description":"Operações sobre subdomínios"}],"servers":[{"url":"https://api.discloud.app/v2","description":"Servidor API"}],"security":[{"ApiKeyAuth":[]}],"components":{"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"api-token"}},"schemas":{"Error":{"type":"object","properties":{"code":{"type":"integer"},"message":{"type":"string"}}}}},"paths":{"/subdomain/{subdomainName}":{"delete":{"tags":["Subdomínios"],"summary":"Remover subdomínio","description":"Remove um subdomínio do usuário. Não é possível remover subdomínios que estejam em uso (status 2). Requer plano Platinum ou superior.","operationId":"deleteSubdomain","parameters":[{"name":"subdomainName","in":"path","required":true,"description":"Nome do subdomínio a ser removido","schema":{"type":"string"}}],"responses":{"200":{"description":"Subdomínio removido com sucesso","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string"},"message":{"type":"string"}}}}}},"401":{"description":"Erro de autenticação","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Plano insuficiente ou sem permissão","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Subdomínio não encontrado","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Subdomínio em uso","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```


# Domínio Personalizado

## Listar domínios customizados

> Retorna todos os domínios customizados do usuário autenticado.

```json
{"openapi":"3.0.4","info":{"title":"Discloud API","version":"2.0.0"},"tags":[{"name":"Domínios Customizados","description":"Operações sobre domínios customizados"}],"servers":[{"url":"https://api.discloud.app/v2","description":"Servidor API"}],"security":[{"ApiKeyAuth":[]}],"components":{"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"api-token"}},"schemas":{"Error":{"type":"object","properties":{"code":{"type":"integer"},"message":{"type":"string"}}}}},"paths":{"/customdomain/all":{"get":{"tags":["Domínios Customizados"],"summary":"Listar domínios customizados","description":"Retorna todos os domínios customizados do usuário autenticado.","operationId":"listCustomDomains","responses":{"200":{"description":"Lista de domínios customizados retornada com sucesso","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomDomainListResponse"}}}},"401":{"description":"Erro de autenticação","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## Criar domínio customizado

> Cria um novo domínio customizado e vincula a um app.

```json
{"openapi":"3.0.4","info":{"title":"Discloud API","version":"2.0.0"},"tags":[{"name":"Domínios Customizados","description":"Operações sobre domínios customizados"}],"servers":[{"url":"https://api.discloud.app/v2","description":"Servidor API"}],"security":[{"ApiKeyAuth":[]}],"components":{"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"api-token"}},"schemas":{"Error":{"type":"object","properties":{"code":{"type":"integer"},"message":{"type":"string"}}}}},"paths":{"/customdomain/create":{"post":{"tags":["Domínios Customizados"],"summary":"Criar domínio customizado","description":"Cria um novo domínio customizado e vincula a um app.","operationId":"createCustomDomain","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["domainName","appID"],"properties":{"domainName":{"type":"string","description":"Nome desejado para o domínio customizado"},"appID":{"type":"string","description":"ID do app para vincular"}}}}}},"responses":{"200":{"description":"Domínio customizado criado com sucesso","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomDomainResponse"}}}},"400":{"description":"Formato de domínio inválido","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Erro de autenticação","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Limite do plano atingido","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"App não encontrado","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Domínio já registrado ou app já possui domínio customizado","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Erro na API externa","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## Editar vínculo de domínio customizado

> Move um domínio customizado para outro app.

```json
{"openapi":"3.0.4","info":{"title":"Discloud API","version":"2.0.0"},"tags":[{"name":"Domínios Customizados","description":"Operações sobre domínios customizados"}],"servers":[{"url":"https://api.discloud.app/v2","description":"Servidor API"}],"security":[{"ApiKeyAuth":[]}],"components":{"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"api-token"}},"schemas":{"Error":{"type":"object","properties":{"code":{"type":"integer"},"message":{"type":"string"}}}}},"paths":{"/customdomain/{domainName}/edit":{"put":{"tags":["Domínios Customizados"],"summary":"Editar vínculo de domínio customizado","description":"Move um domínio customizado para outro app.","operationId":"editCustomDomain","parameters":[{"name":"domainName","in":"path","required":true,"description":"Domínio customizado a ser movido","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["newAppID"],"properties":{"newAppID":{"type":"string","description":"Novo ID do app"}}}}}},"responses":{"200":{"description":"Domínio customizado editado com sucesso","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string"},"message":{"type":"string"},"migrated":{"type":"boolean"},"domain":{"type":"string"}}}}}},"400":{"description":"Operação inválida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Erro de autenticação","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Sem permissão","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Domínio ou app não encontrado","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"App já possui outro domínio customizado","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Erro na migração","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## Remover domínio customizado

> Remove um domínio customizado do usuário e desvincula do app.

```json
{"openapi":"3.0.4","info":{"title":"Discloud API","version":"2.0.0"},"tags":[{"name":"Domínios Customizados","description":"Operações sobre domínios customizados"}],"servers":[{"url":"https://api.discloud.app/v2","description":"Servidor API"}],"security":[{"ApiKeyAuth":[]}],"components":{"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"api-token"}},"schemas":{"Error":{"type":"object","properties":{"code":{"type":"integer"},"message":{"type":"string"}}}}},"paths":{"/customdomain/{domainName}/remove":{"delete":{"tags":["Domínios Customizados"],"summary":"Remover domínio customizado","description":"Remove um domínio customizado do usuário e desvincula do app.","operationId":"removeCustomDomain","parameters":[{"name":"domainName","in":"path","required":true,"description":"Domínio customizado a ser removido","schema":{"type":"string"}}],"responses":{"200":{"description":"Domínio customizado removido com sucesso","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string"},"message":{"type":"string"},"domain":{"type":"string"}}}}}},"401":{"description":"Erro de autenticação","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Sem permissão","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Domínio não encontrado","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Erro na API externa","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## Verificar DNS do domínio customizado

> Verifica o status DNS de um domínio customizado em tempo real.

```json
{"openapi":"3.0.4","info":{"title":"Discloud API","version":"2.0.0"},"tags":[{"name":"Domínios Customizados","description":"Operações sobre domínios customizados"}],"servers":[{"url":"https://api.discloud.app/v2","description":"Servidor API"}],"security":[{"ApiKeyAuth":[]}],"components":{"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"api-token"}},"schemas":{"Error":{"type":"object","properties":{"code":{"type":"integer"},"message":{"type":"string"}}}}},"paths":{"/customdomain/{domainName}/verify":{"get":{"tags":["Domínios Customizados"],"summary":"Verificar DNS do domínio customizado","description":"Verifica o status DNS de um domínio customizado em tempo real.","operationId":"verifyCustomDomain","parameters":[{"name":"domainName","in":"path","required":true,"description":"Domínio customizado a ser verificado","schema":{"type":"string"}}],"responses":{"200":{"description":"Status DNS retornado com sucesso","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string"},"domain":{"$ref":"#/components/schemas/CustomDomain"}}}}}},"401":{"description":"Erro de autenticação","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Sem permissão","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Domínio não encontrado","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Erro na API externa","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```


# Snapshot

## Listar backups versionados

> Retorna todos os backups versionados do usuário autenticado. Filtre por appID ou pagine os resultados.

```json
{"openapi":"3.0.4","info":{"title":"Discloud API","version":"2.0.0"},"tags":[{"name":"Snapshot","description":"Operações sobre backups versionados (snapshots)"}],"servers":[{"url":"https://api.discloud.app/v2","description":"Servidor API"}],"security":[{"ApiKeyAuth":[]}],"components":{"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"api-token"}},"schemas":{"Error":{"type":"object","properties":{"code":{"type":"integer"},"message":{"type":"string"}}}}},"paths":{"/snapshot":{"get":{"tags":["Snapshot"],"summary":"Listar backups versionados","description":"Retorna todos os backups versionados do usuário autenticado. Filtre por appID ou pagine os resultados.","operationId":"listSnapshots","parameters":[{"name":"page","in":"query","required":false,"description":"Número da página (deve ser >= 1)","schema":{"type":"integer","default":1,"minimum":1}},{"name":"limit","in":"query","required":false,"description":"Itens por página (1–200)","schema":{"type":"integer","default":50,"minimum":1,"maximum":200}},{"name":"summary","in":"query","required":false,"description":"Se true, retorna uma visão resumida de cada backup","schema":{"type":"boolean","default":false}},{"name":"appID","in":"query","required":false,"description":"Filtrar backups de um app específico (letras, números, hífen; máx 40 chars)","schema":{"type":"string","maxLength":40,"pattern":"^[a-zA-Z0-9\\-]+$"}}],"responses":{"200":{"description":"Backups obtidos com sucesso","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string"},"message":{"type":"string"}}}}}},"400":{"description":"Parâmetro inválido","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Erro de autenticação","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Nenhum backup encontrado para o appID informado","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Erro interno do servidor","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## Gerar link de download do backup

> Gera uma URL temporária de download para uma versão específica de backup versionado.

```json
{"openapi":"3.0.4","info":{"title":"Discloud API","version":"2.0.0"},"tags":[{"name":"Snapshot","description":"Operações sobre backups versionados (snapshots)"}],"servers":[{"url":"https://api.discloud.app/v2","description":"Servidor API"}],"security":[{"ApiKeyAuth":[]}],"components":{"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"api-token"}},"schemas":{"Error":{"type":"object","properties":{"code":{"type":"integer"},"message":{"type":"string"}}}}},"paths":{"/snapshot/{appID}/versions/{version}":{"get":{"tags":["Snapshot"],"summary":"Gerar link de download do backup","description":"Gera uma URL temporária de download para uma versão específica de backup versionado.","operationId":"getSnapshotDownloadUrl","parameters":[{"name":"appID","in":"path","required":true,"description":"ID do app (letras, números, hífen; máx 40 chars)","schema":{"type":"string","maxLength":40,"pattern":"^[a-zA-Z0-9\\-]+$"}},{"name":"version","in":"path","required":true,"description":"Versão do backup no formato YYYYMMDD-HHMMSS","schema":{"type":"string","pattern":"^\\d{8}-\\d{6}$"}}],"responses":{"200":{"description":"Link de download gerado com sucesso","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string"},"message":{"type":"string"},"app":{"type":"object","properties":{"id":{"type":"string"}}},"download":{"type":"object","properties":{"url":{"type":"string"},"expiresAt":{"type":"string","format":"date-time"},"version":{"type":"string"},"size":{"type":"integer"}}}}}}}},"400":{"description":"Parâmetro inválido","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Erro de autenticação","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Versão de backup não encontrada","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Erro interno do servidor","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## Listar backups de um app

> Retorna todos os backups versionados de um app específico.

```json
{"openapi":"3.0.4","info":{"title":"Discloud API","version":"2.0.0"},"tags":[{"name":"Snapshot","description":"Operações sobre backups versionados (snapshots)"}],"servers":[{"url":"https://api.discloud.app/v2","description":"Servidor API"}],"security":[{"ApiKeyAuth":[]}],"components":{"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"api-token"}},"schemas":{"Error":{"type":"object","properties":{"code":{"type":"integer"},"message":{"type":"string"}}}}},"paths":{"/snapshot/{appID}":{"get":{"tags":["Snapshot"],"summary":"Listar backups de um app","description":"Retorna todos os backups versionados de um app específico.","operationId":"listAppSnapshots","parameters":[{"name":"appID","in":"path","required":true,"description":"ID do app (letras, números, hífen; máx 40 chars)","schema":{"type":"string","maxLength":40,"pattern":"^[a-zA-Z0-9\\-]+$"}}],"responses":{"200":{"description":"Backups carregados com sucesso","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string"},"message":{"type":"string"},"app":{"type":"object","properties":{"id":{"type":"string"}}},"versions":{"type":"array","items":{"type":"object"}}}}}}},"400":{"description":"Formato inválido do App ID","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Erro de autenticação","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Nenhum backup encontrado para este app","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Erro interno do servidor","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## Criar backup versionado

> Cria um novo backup versionado (snapshot) para uma aplicação específica.

```json
{"openapi":"3.0.4","info":{"title":"Discloud API","version":"2.0.0"},"tags":[{"name":"Snapshot","description":"Operações sobre backups versionados (snapshots)"}],"servers":[{"url":"https://api.discloud.app/v2","description":"Servidor API"}],"security":[{"ApiKeyAuth":[]}],"components":{"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"api-token"}},"schemas":{"Error":{"type":"object","properties":{"code":{"type":"integer"},"message":{"type":"string"}}}}},"paths":{"/snapshot/{appID}":{"post":{"tags":["Snapshot"],"summary":"Criar backup versionado","description":"Cria um novo backup versionado (snapshot) para uma aplicação específica.","operationId":"createSnapshot","parameters":[{"name":"appID","in":"path","required":true,"description":"ID do app (letras, números, hífen; máx 40 chars)","schema":{"type":"string","maxLength":40,"pattern":"^[a-zA-Z0-9\\-]+$"}}],"responses":{"200":{"description":"Backup versionado criado com sucesso","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string"},"message":{"type":"string"},"app":{"type":"object","properties":{"id":{"type":"string"}}},"snapshot":{"type":"object","properties":{"version":{"type":"string"},"size":{"type":"string"},"url":{"type":"string"},"allVersions":{"type":"array","items":{"type":"object","properties":{"version":{"type":"string"},"size":{"type":"string"},"date":{"type":"string"}}}}}}}}}}},"400":{"description":"Formato de appID inválido","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Erro de autenticação","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Não é o dono desta aplicação","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Aplicação não encontrada","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Aplicação ocupada processando outra tarefa","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Erro interno do servidor","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```


# Projeto

## Listar projetos

> Lista os projetos acessíveis pelo usuário.

```json
{"openapi":"3.0.3","info":{"title":"Discloud API","version":"2.0.0"},"tags":[{"name":"Projetos","description":"Operações sobre projetos (agrupamento de apps)"}],"servers":[{"url":"https://api.discloud.app/v2","description":"Servidor API"}],"security":[{"ApiKeyAuth":[]}],"components":{"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"api-token"}},"schemas":{"Error":{"type":"object","properties":{"code":{"type":"integer"},"message":{"type":"string"}}}}},"paths":{"/projects":{"get":{"tags":["Projetos"],"summary":"Listar projetos","description":"Lista os projetos acessíveis pelo usuário.","operationId":"listProjects","responses":{"200":{"description":"Projetos listados com sucesso","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Erro de autenticação","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## Criar projeto

> Cria um novo projeto. Requer plano compatível.

```json
{"openapi":"3.0.3","info":{"title":"Discloud API","version":"2.0.0"},"tags":[{"name":"Projetos","description":"Operações sobre projetos (agrupamento de apps)"}],"servers":[{"url":"https://api.discloud.app/v2","description":"Servidor API"}],"security":[{"ApiKeyAuth":[]}],"components":{"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"api-token"}},"schemas":{"Error":{"type":"object","properties":{"code":{"type":"integer"},"message":{"type":"string"}}}}},"paths":{"/projects":{"post":{"tags":["Projetos"],"summary":"Criar projeto","description":"Cria um novo projeto. Requer plano compatível.","operationId":"createProject","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["name"],"properties":{"name":{"type":"string","description":"Nome do projeto (máx. 50 caracteres)"},"description":{"type":"string"},"icon":{"type":"string"},"teamID":{"type":"string","description":"Team a vincular (opcional)"},"fromAppIDs":{"type":"array","items":{"type":"string"}}}}}}},"responses":{"201":{"description":"Projeto criado com sucesso","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Dados inválidos","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Erro de autenticação","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Plano não permite criar projetos ou limite atingido","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## Detalhes do projeto

> Retorna os detalhes de um projeto, incluindo team e apps.

```json
{"openapi":"3.0.3","info":{"title":"Discloud API","version":"2.0.0"},"tags":[{"name":"Projetos","description":"Operações sobre projetos (agrupamento de apps)"}],"servers":[{"url":"https://api.discloud.app/v2","description":"Servidor API"}],"security":[{"ApiKeyAuth":[]}],"components":{"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"api-token"}},"schemas":{"Error":{"type":"object","properties":{"code":{"type":"integer"},"message":{"type":"string"}}}}},"paths":{"/projects/{projectID}":{"get":{"tags":["Projetos"],"summary":"Detalhes do projeto","description":"Retorna os detalhes de um projeto, incluindo team e apps.","operationId":"getProject","parameters":[{"name":"projectID","in":"path","required":true,"description":"ID do projeto","schema":{"type":"string"}}],"responses":{"200":{"description":"Projeto carregado com sucesso","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Erro de autenticação","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Sem permissão para ver o projeto","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Projeto não encontrado","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## Deletar projeto

> Remove um projeto. Os apps vinculados são desvinculados (não deletados).

```json
{"openapi":"3.0.3","info":{"title":"Discloud API","version":"2.0.0"},"tags":[{"name":"Projetos","description":"Operações sobre projetos (agrupamento de apps)"}],"servers":[{"url":"https://api.discloud.app/v2","description":"Servidor API"}],"security":[{"ApiKeyAuth":[]}],"components":{"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"api-token"}},"schemas":{"Error":{"type":"object","properties":{"code":{"type":"integer"},"message":{"type":"string"}}}}},"paths":{"/projects/{projectID}":{"delete":{"tags":["Projetos"],"summary":"Deletar projeto","description":"Remove um projeto. Os apps vinculados são desvinculados (não deletados).","operationId":"deleteProject","parameters":[{"name":"projectID","in":"path","required":true,"description":"ID do projeto","schema":{"type":"string"}}],"responses":{"200":{"description":"Projeto deletado com sucesso","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Erro de autenticação","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Sem permissão para deletar o projeto","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Projeto não encontrado","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## Atualizar projeto

> Atualiza nome, descrição e/ou ícone de um projeto.

```json
{"openapi":"3.0.3","info":{"title":"Discloud API","version":"2.0.0"},"tags":[{"name":"Projetos","description":"Operações sobre projetos (agrupamento de apps)"}],"servers":[{"url":"https://api.discloud.app/v2","description":"Servidor API"}],"security":[{"ApiKeyAuth":[]}],"components":{"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"api-token"}},"schemas":{"Error":{"type":"object","properties":{"code":{"type":"integer"},"message":{"type":"string"}}}}},"paths":{"/projects/{projectID}":{"patch":{"tags":["Projetos"],"summary":"Atualizar projeto","description":"Atualiza nome, descrição e/ou ícone de um projeto.","operationId":"updateProject","parameters":[{"name":"projectID","in":"path","required":true,"description":"ID do projeto","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string"},"description":{"type":"string"},"icon":{"type":"string"}}}}}},"responses":{"200":{"description":"Projeto atualizado com sucesso","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Dados inválidos","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Erro de autenticação","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Sem permissão para gerenciar o projeto","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Projeto não encontrado","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## Vincular/desvincular team

> Vincula um team ao projeto (teamID) ou desvincula (teamID null). Apenas o dono do projeto.

```json
{"openapi":"3.0.3","info":{"title":"Discloud API","version":"2.0.0"},"tags":[{"name":"Projetos","description":"Operações sobre projetos (agrupamento de apps)"}],"servers":[{"url":"https://api.discloud.app/v2","description":"Servidor API"}],"security":[{"ApiKeyAuth":[]}],"components":{"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"api-token"}},"schemas":{"Error":{"type":"object","properties":{"code":{"type":"integer"},"message":{"type":"string"}}}}},"paths":{"/projects/{projectID}/team":{"patch":{"tags":["Projetos"],"summary":"Vincular/desvincular team","description":"Vincula um team ao projeto (teamID) ou desvincula (teamID null). Apenas o dono do projeto.","operationId":"setProjectTeam","parameters":[{"name":"projectID","in":"path","required":true,"description":"ID do projeto","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"teamID":{"type":"string","nullable":true,"description":"ID do team a vincular, ou null para desvincular"}}}}}},"responses":{"200":{"description":"Team vinculado ou desvinculado com sucesso","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"teamID inválido","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Erro de autenticação","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Não é o dono do projeto ou plano insuficiente","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Projeto ou team não encontrado","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## Listar apps disponíveis

> Lista os apps que podem ser adicionados ao projeto.

```json
{"openapi":"3.0.3","info":{"title":"Discloud API","version":"2.0.0"},"tags":[{"name":"Projetos","description":"Operações sobre projetos (agrupamento de apps)"}],"servers":[{"url":"https://api.discloud.app/v2","description":"Servidor API"}],"security":[{"ApiKeyAuth":[]}],"components":{"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"api-token"}},"schemas":{"Error":{"type":"object","properties":{"code":{"type":"integer"},"message":{"type":"string"}}}}},"paths":{"/projects/{projectID}/apps":{"get":{"tags":["Projetos"],"summary":"Listar apps disponíveis","description":"Lista os apps que podem ser adicionados ao projeto.","operationId":"projectAvailableApps","parameters":[{"name":"projectID","in":"path","required":true,"description":"ID do projeto","schema":{"type":"string"}}],"responses":{"200":{"description":"Apps disponíveis listados com sucesso","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Erro de autenticação","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Sem permissão para ver o projeto","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Projeto não encontrado","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## Adicionar/mover app ao projeto

> Adiciona um app ao projeto. Se o cluster divergir, use migrate=true para migrar (resposta 202, migração assíncrona).

```json
{"openapi":"3.0.3","info":{"title":"Discloud API","version":"2.0.0"},"tags":[{"name":"Projetos","description":"Operações sobre projetos (agrupamento de apps)"}],"servers":[{"url":"https://api.discloud.app/v2","description":"Servidor API"}],"security":[{"ApiKeyAuth":[]}],"components":{"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"api-token"}},"schemas":{"Error":{"type":"object","properties":{"code":{"type":"integer"},"message":{"type":"string"}}}}},"paths":{"/projects/{projectID}/apps/{appID}":{"put":{"tags":["Projetos"],"summary":"Adicionar/mover app ao projeto","description":"Adiciona um app ao projeto. Se o cluster divergir, use migrate=true para migrar (resposta 202, migração assíncrona).","operationId":"addAppToProject","parameters":[{"name":"projectID","in":"path","required":true,"description":"ID do projeto","schema":{"type":"string"}},{"name":"appID","in":"path","required":true,"description":"ID da aplicação","schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"migrate":{"type":"boolean","description":"Se true, migra o app para o cluster do projeto"}}}}}},"responses":{"200":{"description":"App adicionado ao projeto com sucesso","content":{"application/json":{"schema":{"type":"object"}}}},"202":{"description":"Migração iniciada (processada de forma assíncrona)","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Erro de autenticação","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Sem permissão para gerenciar o projeto","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Projeto ou app não encontrado","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Cluster incompatível (migração necessária) ou migração já em andamento","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## Remover app do projeto

> Remove o app do projeto (define projectID null). O app não é deletado.

```json
{"openapi":"3.0.3","info":{"title":"Discloud API","version":"2.0.0"},"tags":[{"name":"Projetos","description":"Operações sobre projetos (agrupamento de apps)"}],"servers":[{"url":"https://api.discloud.app/v2","description":"Servidor API"}],"security":[{"ApiKeyAuth":[]}],"components":{"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"api-token"}},"schemas":{"Error":{"type":"object","properties":{"code":{"type":"integer"},"message":{"type":"string"}}}}},"paths":{"/projects/{projectID}/apps/{appID}":{"delete":{"tags":["Projetos"],"summary":"Remover app do projeto","description":"Remove o app do projeto (define projectID null). O app não é deletado.","operationId":"removeAppFromProject","parameters":[{"name":"projectID","in":"path","required":true,"description":"ID do projeto","schema":{"type":"string"}},{"name":"appID","in":"path","required":true,"description":"ID da aplicação","schema":{"type":"string"}}],"responses":{"200":{"description":"App removido do projeto com sucesso","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Erro de autenticação","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Sem permissão para gerenciar o projeto","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Projeto não encontrado ou app não pertence ao projeto","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```


# Variáveis de ambiente

## Listar variáveis da conta

> Retorna todas as variáveis de ambiente do escopo de conta (descriptografadas).

```json
{"openapi":"3.0.3","info":{"title":"Discloud API","version":"2.0.0"},"tags":[{"name":"Variáveis de Ambiente","description":"Operações sobre variáveis de ambiente (conta, projeto e app)"}],"servers":[{"url":"https://api.discloud.app/v2","description":"Servidor API"}],"security":[{"ApiKeyAuth":[]}],"components":{"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"api-token"}},"schemas":{"Error":{"type":"object","properties":{"code":{"type":"integer"},"message":{"type":"string"}}}}},"paths":{"/env/account":{"get":{"tags":["Variáveis de Ambiente"],"summary":"Listar variáveis da conta","description":"Retorna todas as variáveis de ambiente do escopo de conta (descriptografadas).","operationId":"getAccountEnvVars","responses":{"200":{"description":"Variáveis retornadas com sucesso","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Erro de autenticação","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## Substituir variáveis da conta

> Substitui todo o conjunto de variáveis de ambiente do escopo de conta.

```json
{"openapi":"3.0.3","info":{"title":"Discloud API","version":"2.0.0"},"tags":[{"name":"Variáveis de Ambiente","description":"Operações sobre variáveis de ambiente (conta, projeto e app)"}],"servers":[{"url":"https://api.discloud.app/v2","description":"Servidor API"}],"security":[{"ApiKeyAuth":[]}],"components":{"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"api-token"}},"schemas":{"Error":{"type":"object","properties":{"code":{"type":"integer"},"message":{"type":"string"}}}}},"paths":{"/env/account":{"put":{"tags":["Variáveis de Ambiente"],"summary":"Substituir variáveis da conta","description":"Substitui todo o conjunto de variáveis de ambiente do escopo de conta.","operationId":"setAccountEnvVars","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["vars"],"properties":{"vars":{"type":"object","additionalProperties":{"type":"string"},"description":"Mapa chave/valor com as variáveis"}}}}}},"responses":{"200":{"description":"Variáveis salvas com sucesso","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Variáveis inválidas","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Erro de autenticação","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## Remover variáveis da conta

> Remove todas as variáveis de ambiente do escopo de conta.

```json
{"openapi":"3.0.3","info":{"title":"Discloud API","version":"2.0.0"},"tags":[{"name":"Variáveis de Ambiente","description":"Operações sobre variáveis de ambiente (conta, projeto e app)"}],"servers":[{"url":"https://api.discloud.app/v2","description":"Servidor API"}],"security":[{"ApiKeyAuth":[]}],"components":{"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"api-token"}},"schemas":{"Error":{"type":"object","properties":{"code":{"type":"integer"},"message":{"type":"string"}}}}},"paths":{"/env/account":{"delete":{"tags":["Variáveis de Ambiente"],"summary":"Remover variáveis da conta","description":"Remove todas as variáveis de ambiente do escopo de conta.","operationId":"deleteAccountEnvVars","responses":{"200":{"description":"Variáveis removidas com sucesso","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Erro de autenticação","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## Listar variáveis do projeto

> Retorna as variáveis de ambiente de um projeto (descriptografadas). Requer permissão de gerenciamento do projeto.

```json
{"openapi":"3.0.3","info":{"title":"Discloud API","version":"2.0.0"},"tags":[{"name":"Variáveis de Ambiente","description":"Operações sobre variáveis de ambiente (conta, projeto e app)"}],"servers":[{"url":"https://api.discloud.app/v2","description":"Servidor API"}],"security":[{"ApiKeyAuth":[]}],"components":{"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"api-token"}},"schemas":{"Error":{"type":"object","properties":{"code":{"type":"integer"},"message":{"type":"string"}}}}},"paths":{"/env/project/{projectID}":{"get":{"tags":["Variáveis de Ambiente"],"summary":"Listar variáveis do projeto","description":"Retorna as variáveis de ambiente de um projeto (descriptografadas). Requer permissão de gerenciamento do projeto.","operationId":"getProjectEnvVars","parameters":[{"name":"projectID","in":"path","required":true,"description":"ID do projeto","schema":{"type":"string"}}],"responses":{"200":{"description":"Variáveis retornadas com sucesso","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Erro de autenticação","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Sem permissão para acessar o projeto","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Projeto não encontrado","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## Substituir variáveis do projeto

> Substitui todo o conjunto de variáveis de ambiente de um projeto.

```json
{"openapi":"3.0.3","info":{"title":"Discloud API","version":"2.0.0"},"tags":[{"name":"Variáveis de Ambiente","description":"Operações sobre variáveis de ambiente (conta, projeto e app)"}],"servers":[{"url":"https://api.discloud.app/v2","description":"Servidor API"}],"security":[{"ApiKeyAuth":[]}],"components":{"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"api-token"}},"schemas":{"Error":{"type":"object","properties":{"code":{"type":"integer"},"message":{"type":"string"}}}}},"paths":{"/env/project/{projectID}":{"put":{"tags":["Variáveis de Ambiente"],"summary":"Substituir variáveis do projeto","description":"Substitui todo o conjunto de variáveis de ambiente de um projeto.","operationId":"setProjectEnvVars","parameters":[{"name":"projectID","in":"path","required":true,"description":"ID do projeto","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["vars"],"properties":{"vars":{"type":"object","additionalProperties":{"type":"string"}}}}}}},"responses":{"200":{"description":"Variáveis salvas com sucesso","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Variáveis inválidas","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Erro de autenticação","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Sem permissão para gerenciar o projeto","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Projeto não encontrado","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## Remover variáveis do projeto

> Remove todas as variáveis de ambiente de um projeto.

```json
{"openapi":"3.0.3","info":{"title":"Discloud API","version":"2.0.0"},"tags":[{"name":"Variáveis de Ambiente","description":"Operações sobre variáveis de ambiente (conta, projeto e app)"}],"servers":[{"url":"https://api.discloud.app/v2","description":"Servidor API"}],"security":[{"ApiKeyAuth":[]}],"components":{"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"api-token"}},"schemas":{"Error":{"type":"object","properties":{"code":{"type":"integer"},"message":{"type":"string"}}}}},"paths":{"/env/project/{projectID}":{"delete":{"tags":["Variáveis de Ambiente"],"summary":"Remover variáveis do projeto","description":"Remove todas as variáveis de ambiente de um projeto.","operationId":"deleteProjectEnvVars","parameters":[{"name":"projectID","in":"path","required":true,"description":"ID do projeto","schema":{"type":"string"}}],"responses":{"200":{"description":"Variáveis removidas com sucesso","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Erro de autenticação","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Sem permissão para gerenciar o projeto","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Projeto não encontrado","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## Listar variáveis do app

> Retorna as variáveis de ambiente de um app (descriptografadas). Requer permissão config\_app.

```json
{"openapi":"3.0.3","info":{"title":"Discloud API","version":"2.0.0"},"tags":[{"name":"Variáveis de Ambiente","description":"Operações sobre variáveis de ambiente (conta, projeto e app)"}],"servers":[{"url":"https://api.discloud.app/v2","description":"Servidor API"}],"security":[{"ApiKeyAuth":[]}],"components":{"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"api-token"}},"schemas":{"Error":{"type":"object","properties":{"code":{"type":"integer"},"message":{"type":"string"}}}}},"paths":{"/env/app/{appID}":{"get":{"tags":["Variáveis de Ambiente"],"summary":"Listar variáveis do app","description":"Retorna as variáveis de ambiente de um app (descriptografadas). Requer permissão config_app.","operationId":"getAppEnvVars","parameters":[{"name":"appID","in":"path","required":true,"description":"ID da aplicação","schema":{"type":"string"}}],"responses":{"200":{"description":"Variáveis retornadas com sucesso","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Erro de autenticação","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Sem permissão para acessar o app","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Aplicação não encontrada","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## Substituir variáveis do app

> Substitui todo o conjunto de variáveis de ambiente de um app.

```json
{"openapi":"3.0.3","info":{"title":"Discloud API","version":"2.0.0"},"tags":[{"name":"Variáveis de Ambiente","description":"Operações sobre variáveis de ambiente (conta, projeto e app)"}],"servers":[{"url":"https://api.discloud.app/v2","description":"Servidor API"}],"security":[{"ApiKeyAuth":[]}],"components":{"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"api-token"}},"schemas":{"Error":{"type":"object","properties":{"code":{"type":"integer"},"message":{"type":"string"}}}}},"paths":{"/env/app/{appID}":{"put":{"tags":["Variáveis de Ambiente"],"summary":"Substituir variáveis do app","description":"Substitui todo o conjunto de variáveis de ambiente de um app.","operationId":"setAppEnvVars","parameters":[{"name":"appID","in":"path","required":true,"description":"ID da aplicação","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["vars"],"properties":{"vars":{"type":"object","additionalProperties":{"type":"string"}}}}}}},"responses":{"200":{"description":"Variáveis salvas com sucesso","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Variáveis inválidas","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Erro de autenticação","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Sem permissão para gerenciar o app","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Aplicação não encontrada","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## Remover variáveis do app

> Remove todas as variáveis de ambiente de um app.

```json
{"openapi":"3.0.3","info":{"title":"Discloud API","version":"2.0.0"},"tags":[{"name":"Variáveis de Ambiente","description":"Operações sobre variáveis de ambiente (conta, projeto e app)"}],"servers":[{"url":"https://api.discloud.app/v2","description":"Servidor API"}],"security":[{"ApiKeyAuth":[]}],"components":{"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"api-token"}},"schemas":{"Error":{"type":"object","properties":{"code":{"type":"integer"},"message":{"type":"string"}}}}},"paths":{"/env/app/{appID}":{"delete":{"tags":["Variáveis de Ambiente"],"summary":"Remover variáveis do app","description":"Remove todas as variáveis de ambiente de um app.","operationId":"deleteAppEnvVars","parameters":[{"name":"appID","in":"path","required":true,"description":"ID da aplicação","schema":{"type":"string"}}],"responses":{"200":{"description":"Variáveis removidas com sucesso","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Erro de autenticação","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Sem permissão para gerenciar o app","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Aplicação não encontrada","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```


# Equipe

Team

## Permissões de um role

> Retorna as permissões associadas a um role (admin, developer ou viewer).

```json
{"openapi":"3.0.3","info":{"title":"Discloud API","version":"2.0.0"},"tags":[{"name":"Gerenciamento de Equipe","description":"Operações sobre gerenciamento de equipe"}],"servers":[{"url":"https://api.discloud.app/v2","description":"Servidor API"}],"security":[{"ApiKeyAuth":[]}],"components":{"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"api-token"}},"schemas":{"Error":{"type":"object","properties":{"code":{"type":"integer"},"message":{"type":"string"}}}}},"paths":{"/teams/roles/{role}/permissions":{"get":{"tags":["Gerenciamento de Equipe"],"summary":"Permissões de um role","description":"Retorna as permissões associadas a um role (admin, developer ou viewer).","operationId":"teamRolePermissions","parameters":[{"name":"role","in":"path","required":true,"description":"Role (admin, developer ou viewer)","schema":{"type":"string"}}],"responses":{"200":{"description":"Permissões do role","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Role inválido","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Erro de autenticação","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## Detalhes do team

> Retorna os detalhes de um team, incluindo membros e projetos.

```json
{"openapi":"3.0.3","info":{"title":"Discloud API","version":"2.0.0"},"tags":[{"name":"Gerenciamento de Equipe","description":"Operações sobre gerenciamento de equipe"}],"servers":[{"url":"https://api.discloud.app/v2","description":"Servidor API"}],"security":[{"ApiKeyAuth":[]}],"components":{"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"api-token"}},"schemas":{"Error":{"type":"object","properties":{"code":{"type":"integer"},"message":{"type":"string"}}}}},"paths":{"/teams/{teamID}":{"get":{"tags":["Gerenciamento de Equipe"],"summary":"Detalhes do team","description":"Retorna os detalhes de um team, incluindo membros e projetos.","operationId":"getTeam","parameters":[{"name":"teamID","in":"path","required":true,"description":"ID do team","schema":{"type":"string"}}],"responses":{"200":{"description":"Detalhes do team","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Erro de autenticação","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Sem permissão para ver o team","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Team não encontrado","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## Deletar team

> Remove um team. Apenas o dono.

```json
{"openapi":"3.0.3","info":{"title":"Discloud API","version":"2.0.0"},"tags":[{"name":"Gerenciamento de Equipe","description":"Operações sobre gerenciamento de equipe"}],"servers":[{"url":"https://api.discloud.app/v2","description":"Servidor API"}],"security":[{"ApiKeyAuth":[]}],"components":{"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"api-token"}},"schemas":{"Error":{"type":"object","properties":{"code":{"type":"integer"},"message":{"type":"string"}}}}},"paths":{"/teams/{teamID}":{"delete":{"tags":["Gerenciamento de Equipe"],"summary":"Deletar team","description":"Remove um team. Apenas o dono.","operationId":"deleteTeam","parameters":[{"name":"teamID","in":"path","required":true,"description":"ID do team","schema":{"type":"string"}}],"responses":{"200":{"description":"Team deletado com sucesso","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Erro de autenticação","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Não é o dono do team","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Team não encontrado","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## Atualizar team

> Atualiza nome e/ou descrição de um team. Apenas o dono.

```json
{"openapi":"3.0.3","info":{"title":"Discloud API","version":"2.0.0"},"tags":[{"name":"Gerenciamento de Equipe","description":"Operações sobre gerenciamento de equipe"}],"servers":[{"url":"https://api.discloud.app/v2","description":"Servidor API"}],"security":[{"ApiKeyAuth":[]}],"components":{"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"api-token"}},"schemas":{"Error":{"type":"object","properties":{"code":{"type":"integer"},"message":{"type":"string"}}}}},"paths":{"/teams/{teamID}":{"patch":{"tags":["Gerenciamento de Equipe"],"summary":"Atualizar team","description":"Atualiza nome e/ou descrição de um team. Apenas o dono.","operationId":"updateTeam","parameters":[{"name":"teamID","in":"path","required":true,"description":"ID do team","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string"},"description":{"type":"string"}}}}}},"responses":{"200":{"description":"Team atualizado com sucesso","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Dados inválidos","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Erro de autenticação","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Não é o dono do team","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Team não encontrado","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## Listar membros

> Lista os membros de um team.

```json
{"openapi":"3.0.3","info":{"title":"Discloud API","version":"2.0.0"},"tags":[{"name":"Membro da Equipe","description":"Operações sobre membros da equipe"}],"servers":[{"url":"https://api.discloud.app/v2","description":"Servidor API"}],"security":[{"ApiKeyAuth":[]}],"components":{"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"api-token"}},"schemas":{"Error":{"type":"object","properties":{"code":{"type":"integer"},"message":{"type":"string"}}}}},"paths":{"/teams/{teamID}/members":{"get":{"tags":["Membro da Equipe"],"summary":"Listar membros","description":"Lista os membros de um team.","operationId":"listTeamMembers","parameters":[{"name":"teamID","in":"path","required":true,"description":"ID do team","schema":{"type":"string"}}],"responses":{"200":{"description":"Membros listados com sucesso","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Erro de autenticação","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Sem permissão para ver os membros","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Team não encontrado","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## Adicionar membro

> Adiciona um membro ao team com um role específico.

```json
{"openapi":"3.0.3","info":{"title":"Discloud API","version":"2.0.0"},"tags":[{"name":"Membro da Equipe","description":"Operações sobre membros da equipe"}],"servers":[{"url":"https://api.discloud.app/v2","description":"Servidor API"}],"security":[{"ApiKeyAuth":[]}],"components":{"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"api-token"}},"schemas":{"Error":{"type":"object","properties":{"code":{"type":"integer"},"message":{"type":"string"}}}}},"paths":{"/teams/{teamID}/members":{"post":{"tags":["Membro da Equipe"],"summary":"Adicionar membro","description":"Adiciona um membro ao team com um role específico.","operationId":"addTeamMember","parameters":[{"name":"teamID","in":"path","required":true,"description":"ID do team","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["userID","role"],"properties":{"userID":{"type":"string"},"role":{"type":"string","description":"admin, developer ou viewer"}}}}}},"responses":{"201":{"description":"Membro adicionado com sucesso","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Dados inválidos","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Erro de autenticação","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Sem permissão para gerenciar membros","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Team ou usuário não encontrado","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## Remover membro

> Remove um membro do team.

```json
{"openapi":"3.0.3","info":{"title":"Discloud API","version":"2.0.0"},"tags":[{"name":"Membro da Equipe","description":"Operações sobre membros da equipe"}],"servers":[{"url":"https://api.discloud.app/v2","description":"Servidor API"}],"security":[{"ApiKeyAuth":[]}],"components":{"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"api-token"}},"schemas":{"Error":{"type":"object","properties":{"code":{"type":"integer"},"message":{"type":"string"}}}}},"paths":{"/teams/{teamID}/members/{memberUserID}":{"delete":{"tags":["Membro da Equipe"],"summary":"Remover membro","description":"Remove um membro do team.","operationId":"removeTeamMember","parameters":[{"name":"teamID","in":"path","required":true,"description":"ID do team","schema":{"type":"string"}},{"name":"memberUserID","in":"path","required":true,"description":"ID do usuário membro","schema":{"type":"string"}}],"responses":{"200":{"description":"Membro removido com sucesso","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Erro de autenticação","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Sem permissão para gerenciar membros","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Team ou membro não encontrado","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## Atualizar role do membro

> Atualiza o role de um membro do team.

```json
{"openapi":"3.0.3","info":{"title":"Discloud API","version":"2.0.0"},"tags":[{"name":"Membro da Equipe","description":"Operações sobre membros da equipe"}],"servers":[{"url":"https://api.discloud.app/v2","description":"Servidor API"}],"security":[{"ApiKeyAuth":[]}],"components":{"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"api-token"}},"schemas":{"Error":{"type":"object","properties":{"code":{"type":"integer"},"message":{"type":"string"}}}}},"paths":{"/teams/{teamID}/members/{memberUserID}":{"patch":{"tags":["Membro da Equipe"],"summary":"Atualizar role do membro","description":"Atualiza o role de um membro do team.","operationId":"updateTeamMember","parameters":[{"name":"teamID","in":"path","required":true,"description":"ID do team","schema":{"type":"string"}},{"name":"memberUserID","in":"path","required":true,"description":"ID do usuário membro","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["role"],"properties":{"role":{"type":"string","description":"admin, developer ou viewer"}}}}}},"responses":{"200":{"description":"Role atualizado com sucesso","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Dados inválidos","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Erro de autenticação","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Sem permissão para gerenciar membros","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Team ou membro não encontrado","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## Sair do team

> Remove o próprio usuário do team. O dono não pode sair.

```json
{"openapi":"3.0.3","info":{"title":"Discloud API","version":"2.0.0"},"tags":[{"name":"Membro da Equipe","description":"Operações sobre membros da equipe"}],"servers":[{"url":"https://api.discloud.app/v2","description":"Servidor API"}],"security":[{"ApiKeyAuth":[]}],"components":{"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"api-token"}},"schemas":{"Error":{"type":"object","properties":{"code":{"type":"integer"},"message":{"type":"string"}}}}},"paths":{"/teams/{teamID}/leave":{"post":{"tags":["Membro da Equipe"],"summary":"Sair do team","description":"Remove o próprio usuário do team. O dono não pode sair.","operationId":"leaveTeam","parameters":[{"name":"teamID","in":"path","required":true,"description":"ID do team","schema":{"type":"string"}}],"responses":{"200":{"description":"Saiu do team com sucesso","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Erro de autenticação","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"O dono não pode sair do team","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Team não encontrado ou não é membro","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## Criar team

> Cria um novo team. Requer plano compatível.

```json
{"openapi":"3.0.3","info":{"title":"Discloud API","version":"2.0.0"},"tags":[{"name":"Gerenciamento de Equipe","description":"Operações sobre gerenciamento de equipe"}],"servers":[{"url":"https://api.discloud.app/v2","description":"Servidor API"}],"security":[{"ApiKeyAuth":[]}],"components":{"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"api-token"}},"schemas":{"Error":{"type":"object","properties":{"code":{"type":"integer"},"message":{"type":"string"}}}}},"paths":{"/teams":{"post":{"tags":["Gerenciamento de Equipe"],"summary":"Criar team","description":"Cria um novo team. Requer plano compatível.","operationId":"createTeam","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["name"],"properties":{"name":{"type":"string","description":"Nome do team (máx. 50 caracteres)"},"description":{"type":"string"}}}}}},"responses":{"201":{"description":"Team criado com sucesso","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Dados inválidos","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Erro de autenticação","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Plano não permite criar teams ou limite atingido","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## Listar teams

> Lista os teams do usuário (próprios e onde é membro).

```json
{"openapi":"3.0.3","info":{"title":"Discloud API","version":"2.0.0"},"tags":[{"name":"Gerenciamento de Equipe","description":"Operações sobre gerenciamento de equipe"}],"servers":[{"url":"https://api.discloud.app/v2","description":"Servidor API"}],"security":[{"ApiKeyAuth":[]}],"components":{"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"api-token"}},"schemas":{"Error":{"type":"object","properties":{"code":{"type":"integer"},"message":{"type":"string"}}}}},"paths":{"/teams":{"get":{"tags":["Gerenciamento de Equipe"],"summary":"Listar teams","description":"Lista os teams do usuário (próprios e onde é membro).","operationId":"listTeams","responses":{"200":{"description":"Teams listados com sucesso","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Erro de autenticação","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## Apps acessíveis via teams

> Lista os apps acessíveis pelo usuário através dos teams a que pertence.

```json
{"openapi":"3.0.3","info":{"title":"Discloud API","version":"2.0.0"},"tags":[{"name":"Gerenciamento de Equipe","description":"Operações sobre gerenciamento de equipe"}],"servers":[{"url":"https://api.discloud.app/v2","description":"Servidor API"}],"security":[{"ApiKeyAuth":[]}],"components":{"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"api-token"}},"schemas":{"Error":{"type":"object","properties":{"code":{"type":"integer"},"message":{"type":"string"}}}}},"paths":{"/teams/apps":{"get":{"tags":["Gerenciamento de Equipe"],"summary":"Apps acessíveis via teams","description":"Lista os apps acessíveis pelo usuário através dos teams a que pertence.","operationId":"listTeamsApps","responses":{"200":{"description":"Apps acessíveis listados com sucesso","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Erro de autenticação","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```


# Integração com GitHub

Conecte seu repositório GitHub à Discloud e faça deploy direto do seu código.

### 🧭 Visão Geral

A **Integração com GitHub** permite que você faça deploy de aplicações diretamente de um repositório GitHub para a Discloud, sem necessidade de enviar ZIPs manualmente. A Discloud puxa o código do seu repositório, lê o [`discloud.config`](https://github.com/discloud/docs/blob/portuguese/configurations/discloud.config) na raiz e compila e inicia sua aplicação automaticamente.

Este é o fluxo recomendado para equipes e para quem usa controle de versão como parte do processo de desenvolvimento.

***

### ✅ Pré-requisitos

Antes de conectar o GitHub, certifique-se de que o seguinte está em ordem:

{% hint style="success" %}
[**`discloud.config`**](https://github.com/discloud/docs/blob/portuguese/configurations/discloud.config) **na raiz** - Este arquivo deve existir na raiz do seu repositório. Sem ele, o upload falhará na validação. Saiba mais sobre a raiz do projeto.
{% endhint %}

{% hint style="danger" %}
**Nunca faça commit de arquivos** [**`.env`**](/faq/general-questions/.env-file) - Seu arquivo `.env` deve estar listado no `.gitignore`. Os segredos de produção são definidos diretamente na Discloud durante o passo de upload, não através do repositório.
{% endhint %}

***

### 🔗 Conecte sua conta GitHub

{% stepper %}
{% step %}
**🔑 Abra a Integração GitHub**

No [Painel da Discloud](https://discloud.com/dashboard), expanda **Configurações** na barra lateral esquerda e clique em [**Integração com GitHub**](https://discloud.com/dashboard/github).

Clique em **+ Adicionar conta ou organização** e siga o fluxo de OAuth do GitHub para autorizar a Discloud. Isso permite que a Discloud leia seus repositórios.

<figure><img src="/files/dFddzh4QDa2S9ewi9xQO" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}
**⚙️ Configure o acesso ao repositório**

Após autorizar, as contas e organizações conectadas aparecem na página de integração GitHub. Para gerenciar quais repositórios a Discloud pode acessar, clique em **Gerenciar instalações** (canto superior direito), isso abre as configurações do App GitHub diretamente, onde você pode escolher:

* 🔓 **Todos os repositórios** - A Discloud pode acessar todos os repositórios da sua conta
* 🔒 **Repositórios selecionados** - Escolha apenas os repositórios específicos que deseja fazer deploy

{% hint style="info" %}
Você pode alterar isso a qualquer momento voltando para **Configurações > Integração com GitHub** e clicando em **Gerenciar instalações** novamente, ou gerenciando o App GitHub da Discloud diretamente nas configurações da sua conta GitHub.
{% endhint %}
{% endstep %}
{% endstepper %}

***

### 🚀 Faça deploy pelo GitHub

{% stepper %}
{% step %}
**🚀 Inicie um novo upload**

Acesse a página **Applications** no [Painel da Discloud](https://discloud.com/dashboard), clique em **+ Upload** (canto superior direito) e selecione **GitHub** como tipo de deploy.

<figure><img src="/files/Don8aC1xNYLigwjXxiAA" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}
**🛠️ Configure o seu deploy**

**Repositório e branch** - Escolha o repositório e a branch da qual deseja fazer deploy. A Discloud vai puxar o commit mais recente dessa branch.

**Variáveis de ambiente** - Adicione os segredos de produção pelos campos `NAME` / `value.`

<figure><img src="/files/TrN4svaEft6s9FuO8pcK" alt=""><figcaption></figcaption></figure>

{% hint style="danger" %}
**Este é o único lugar para definir segredos de produção.** Arquivos `.env` não devem ser commitados no GitHub. A Discloud armazena esses valores com segurança e gera um arquivo `.env` na raiz da sua aplicação em tempo de execução, mantendo-os completamente fora do repositório.
{% endhint %}

{% hint style="warning" %}
Se você esquecer de adicionar uma variável aqui, sua aplicação vai iniciar sem ela e pode travar ou se comportar de forma incorreta. Para atualizar as variáveis de ambiente depois, você pode editá-las diretamente no painel caso tenha um plano pago. Caso contrário, será necessário fazer um novo commit com o conteúdo completo e atualizado do `.env`.
{% endhint %}
{% endstep %}

{% step %}
**✅ Confirme e faça o deploy**

Revise suas configurações e clique em **Continuar**. A Discloud irá:

1. Puxar o código do repositório e branch selecionados
2. Validar seu `discloud.config`
3. Instalar dependências e executar o comando de build (se configurado)
4. Iniciar sua aplicação

<figure><img src="/files/NZzjCwePOWvmQOwXm2mV" alt=""><figcaption></figcaption></figure>
{% endstep %}
{% endstepper %}

***

### 🔁 Atualizando sua aplicação

A Discloud faz o redeploy da sua aplicação automaticamente sempre que você fizer push de novos commits na branch configurada durante o upload inicial. Nenhuma ação manual é necessária.


# Domínio Personalizado

Configure seu domínio para sua aplicação hospedada na Discloud.

## 🧭 Visão Geral

Você pode mapear seu próprio domínio (ex. `yourdomain.com`) ou um subdomínio (ex. `dash.yourdomain.com`) para uma aplicação hospedada na Discloud. A plataforma serve o tráfego através do [subdomínio Discloud](/faq/general-questions/how-to-create-a-subdomain) da sua aplicação usando dois registros A apontando para nossos endereços IPv4 e valida a propriedade via registros TXT.

<figure><img src="/files/xTWW8YgmCxOk3iK2ZWtG" alt="Diagrama de fluxo do domínio personalizado"><figcaption></figcaption></figure>

***

## 📋 Requisitos

{% hint style="success" %}
[Plano Diamante ou superior](https://discloud.com/plans) é necessário para hospedar websites ou APIs.
{% endhint %}

{% hint style="success" %}
[Aplicação já hospedada](/how-to-host/websites-and-apis) usando um subdomínio da Discloud (ex. `exemplo.discloud.app`)
{% endhint %}

{% hint style="success" %}
Um domínio registrado que você controla (Cloudflare, Hostinger, GoDaddy, Namecheap, etc.)
{% endhint %}

{% hint style="success" %}
Capacidade de adicionar / modificar registros A
{% endhint %}

***

## 🏗️ Adicione Seu Domínio (Painel)

{% stepper %}
{% step %}
Abra o [Painel da Discloud](https://discloud.com/dashboard) → seção [`Domínios`](https://discloud.com/dashboard/domains).
{% endstep %}

{% step %}
Digite seu domínio (ex. `seudominio.com`). Opcionalmente, especifique um subdomínio (ex. `dash`).
{% endstep %}

{% step %}
Clique em **+ Adicionar domínio**, insira seu domínio e depois clique em **Ver DNS** para visualizar os registros que precisa configurar.
{% endstep %}
{% endstepper %}

<div data-full-width="false"><figure><img src="/files/mWGEHZnS2QNYpk8zRdno" alt=""><figcaption></figcaption></figure> <figure><img src="/files/C3Gfne3tFMW2iQwoWBMO" alt="Lista de registros A mostrando 75.2.96.173 e 99.83.186.151"><figcaption></figcaption></figure></div>

***

## ✅ Verificar e Configurar DNS

Embora qualquer provedor de DNS funcione, abaixo estão cenários com abas para clareza.

{% tabs %}
{% tab title="Domínio Raiz" %}
**Registros**

| Tipo         | Nome                      | Valor           |
| ------------ | ------------------------- | --------------- |
| A            | `@` (ou raiz do provedor) | `75.2.96.173`   |
| A            | `@` (ou raiz do provedor) | `99.83.186.151` |
| {% endtab %} |                           |                 |

{% tab title="Subdomínio" %}
**Exemplo: `dash.seudominio.com`**

<table><thead><tr><th width="169">Tipo</th><th width="383">Nome</th><th>Valor</th></tr></thead><tbody><tr><td>A</td><td><code>dash</code></td><td><code>75.2.96.173</code></td></tr><tr><td>A</td><td><code>dash</code></td><td><code>99.83.186.151</code></td></tr></tbody></table>

Múltiplos subdomínios (ex. `api`, `app`) repetem este padrão independentemente.
{% endtab %}
{% endtabs %}

{% hint style="warning" %}

#### **Proxy do Cloudflare**

Se você usar **Cloudflare**, é obrigatório desabilitar o **Proxy** (certifique-se de que está definido como **DNS Only** / **Nuvem Cinza**, não a Laranja). Isso garante a emissão correta do certificado SSL.
{% endhint %}

<figure><img src="/files/eJ9XeBoUHz2eRxtatw5e" alt=""><figcaption></figcaption></figure>

***

## 🔄 Reconstruir a Aplicação

Após o DNS resolver e os tokens validarem, abra a aplicação vinculada e acione a Reconstrução para que a vinculação se torne ativa.

<div data-full-width="false"><figure><img src="/files/STQRzoKDwgbtfAX1ty27" alt="Lista de aplicações mostrando domínio personalizado"><figcaption></figcaption></figure> <figure><img src="/files/LmNlkarrs6WphsNUMPpu" alt=""><figcaption></figcaption></figure></div>

***

### 📡 **Propagação DNS**

* Mudanças de DNS normalmente se propagam em alguns minutos.
* No entanto, **valores TTL** e **cache do resolvedor** podem causar alguns atrasos.
* Para verificar as mudanças em todo o mundo, confira [dnschecker.org](https://dnschecker.org/)
* Se alguns POPs ainda exibirem registros antigos, aguarde e verifique novamente mais tarde.

<figure><img src="/files/2cc3kHRnuLJuXAOUL5gJ" alt=""><figcaption></figcaption></figure>


# Bancos de Dados

Visão geral das opções de banco de dados para apps Discloud, templates integrados (MySQL, PostgreSQL, Redis, MongoDB) e configuração externa do MongoDB Atlas.

## 🧭 Visão Geral

Aplicações Discloud podem se conectar a:

<table data-card-size="large" data-view="cards"><thead><tr><th data-card-target data-type="content-ref"></th><th></th><th data-hidden></th><th data-hidden></th><th data-hidden></th></tr></thead><tbody><tr><td><a href="#catalogo-de-templates-instancias-gerenciadas">#catalogo-de-templates-instancias-gerenciadas</a></td><td>Templates de serviço gerenciado integrados que você provisiona através do catálogo de Templates.</td><td></td><td></td><td></td></tr><tr><td><a href="#usando-mongodb-atlas-externo">#usando-mongodb-atlas-externo</a></td><td>Provedor de banco de dados como serviço MongoDB Atlas externo que você configura manualmente.</td><td></td><td></td><td></td></tr></tbody></table>

***

## 📦 Catálogo de Templates (Instâncias Gerenciadas)

Provisionando um template de banco de dados (ex. MySQL, PostgreSQL, Redis, MongoDB):

{% stepper %}
{% step %}
Abra a página de Templates: <https://discloud.com/templates>
{% endstep %}

{% step %}
Escolha o template desejado (motor de banco de dados ou painel de ferramentas).
{% endstep %}

{% step %}
Forneça um nome e variáveis de ambiente necessárias (a UI indica as obrigatórias).
{% endstep %}

{% step %}
Hospede. Credenciais / strings de conexão ficam disponíveis para a configuração do seu app.
{% endstep %}
{% endstepper %}

{% hint style="info" %}

#### **Precisa de Outro Template?**

Abra um [ticket de suporte](https://discord.com/channels/@me/930852077045940224/) no [servidor Discord](https://discord.discloudbot.com/) com o nome do motor, versão e caso de uso. A equipe avalia a viabilidade e pode adicioná-lo ao catálogo.
{% endhint %}

***

## 🌍 Usando MongoDB Atlas Externo

Se você optar pelo MongoDB Atlas em vez de um template:

{% stepper %}
{% step %}
Crie um cluster gratuito ou pago em <https://www.mongodb.com/>
{% endstep %}

{% step %}
Em Network Access, adicione IP: `0.0.0.0/0` (Permitir de Qualquer Lugar) para que os contêineres Discloud possam se conectar.
{% endstep %}

{% step %}
Teste a conectividade localmente antes de fazer o upload, se possível.
{% endstep %}
{% endstepper %}

{% tabs %}
{% tab title="Vídeo explicativo recomendado" %}
{% embed url="<https://youtu.be/kGPY9ZuJ0b0>" %}
{% endtab %}
{% endtabs %}


# Lavalink

Guia passo a passo para hospedar um servidor de áudio Lavalink na Discloud.

### 🎵 O que é o Lavalink?

O **Lavalink** é um servidor de streaming de áudio independente usado por bots de música do Discord para reproduzir áudio de fontes como YouTube, SoundCloud, Bandcamp, Twitch e muito mais. Em vez de processar o áudio diretamente no bot, o Lavalink delega todo o processamento de áudio pesado para um servidor dedicado.

O Lavalink é executado como uma **aplicação Java** e expõe uma API WebSocket à qual seu bot se conecta.

***

### ✅ Requisitos

{% hint style="success" %}
[**Plano Platinum ou Superior**](https://discloud.com/plans) – Necessário para todas as aplicações `TYPE=site`.
{% endhint %}

{% hint style="success" %}
[**Subdomínio**](/faq/general-questions/how-to-create-a-subdomain) – Você deve registrar um subdomínio único na Discloud.
{% endhint %}

{% hint style="danger" %}
**Porta 8080 & Host 0.0.0.0** – Sua aplicação **deve** ouvir na porta `8080` e host `0.0.0.0` para ser acessível externamente.
{% endhint %}

{% hint style="info" %}
**RAM** – Um mínimo de **512MB** é recomendado para aplicações web.
{% endhint %}

***

### 🚀 Configuração Passo a Passo

{% stepper %}
{% step %}
**⬇️ Baixe o `Lavalink.jar`**

Baixe a versão estável mais recente do Lavalink no repositório oficial do GitHub:

👉 <https://github.com/lavalink-devs/Lavalink/releases>

Baixe o arquivo chamado `Lavalink.jar` na seção Assets do release mais recente.

{% hint style="info" %}
O Lavalink 4.x é a versão estável atual e é recomendado. Ele requer Java 17 ou superior.
{% endhint %}
{% endstep %}

{% step %}
**📝 Crie o `application.yml`**

Crie um arquivo chamado `application.yml` na mesma pasta que o `Lavalink.jar`. Este é o arquivo de configuração principal do Lavalink.

{% code title="application.yml" expandable="true" %}

```yaml
server:
  port: 8080
  address: 0.0.0.0

lavalink:
  server:
    password: "youshallnotpass"
    sources:
      youtube: false
      bandcamp: true
      soundcloud: true
      twitch: true
      vimeo: true
      http: true
      local: false

  plugins:
    # Substitua VERSION pela versao atual, conforme mostrado na guia Releases, ou por um hash de commit longo para snapshots.
    - dependency: "dev.lavalink.youtube:youtube-plugin:VERSION"
      snapshot: false

plugins:
  youtube:
    enabled: true
    allowSearch: true
    allowDirectVideoIds: true
    allowDirectPlaylistIds: true
    oauth:
      enabled: true

logging:
  level:
    root: INFO
    lavalink: INFO
```

{% endcode %}

{% hint style="danger" %}
**Defina `server.port` como `8080`** - Isso é necessário para que a Discloud roteie o tráfego externo corretamente.

**Defina `server.address` como `0.0.0.0`** - Isso permite que conexões externas alcancem o Lavalink.
{% endhint %}

{% hint style="warning" %}
**Altere a senha** - Substitua `"youshallnotpass"` por uma senha forte e única. Qualquer pessoa que souber sua senha pode usar seu servidor Lavalink.
{% endhint %}

{% hint style="info" %}
**Plugin do YouTube** - A configuração `youtube: false` em `sources` desabilita a fonte YouTube nativa (descontinuada). O `youtube-plugin` listado em `plugins` a substitui por uma implementação mais atualizada. Verifique a [página de releases do plugin](https://github.com/lavalink-devs/youtube-source/releases) para obter o número da versão mais recente.
{% endhint %}
{% endstep %}

{% step %}
**⚙️ Crie o `discloud.config`**

Crie um arquivo [`discloud.config`](https://github.com/discloud/docs/blob/portuguese/configurations/discloud.config) na mesma pasta:

```ini
NAME=MeuLavalink
TYPE=site
MAIN=Lavalink.jar
RAM=512
VERSION=17.x.x
ID=meu-subdomain-lavalink
```

* **`TYPE=site`** - Obrigatório porque o Lavalink escuta em uma porta de rede.
* **`MAIN=Lavalink.jar`** - Deve corresponder exatamente ao nome do arquivo JAR.
* **`VERSION=17.x.x`** - O Lavalink 4.x requer Java 17. Use `17.x.x` ou `latest`.
* **`ID`** - Seu subdomínio registrado (sem `.discloud.app`).
  {% endstep %}

{% step %}
**📦 Crie o arquivo ZIP**

Sua pasta deve conter exatamente estes três arquivos:

```
lavalink-upload/
├─ Lavalink.jar
├─ application.yml
└─ discloud.config
```

Compacte esses arquivos em um arquivo `.zip`. Certifique-se de que os arquivos estão [**na raiz**](/faq/general-questions/what-is-the-root-of-the-project) do ZIP, não compacte uma pasta.
{% endstep %}

{% step %}
**🚀 Envie para a Discloud**

{% content-ref url="/pages/htZKWrZhVFqFx95LF0by" %}
[Como Hospedar](/how-to-host/bots)
{% endcontent-ref %}
{% endstep %}

{% step %}
**🤖 Configure seu bot**

Conecte seu bot do Discord ao Lavalink usando seu subdomínio. Como a Discloud usa HTTPS/WSS com proxy reverso, você deve conectar na **porta 443 com `secure: true`**.

```json
{
  "host": "meu-subdomain-lavalink.discloud.app",
  "port": 443,
  "secure": true,
  "password": "youshallnotpass"
}
```

Substitua `meu-subdomain-lavalink` pelo seu subdomínio real e `youshallnotpass` pela senha que você definiu no `application.yml`.

{% hint style="warning" %}
**Não** conecte na porta `8080` a partir do seu bot. A porta `8080` é apenas para uso interno pela Discloud. Seu bot deve sempre conectar na porta `443` com `secure: true`.
{% endhint %}
{% endstep %}
{% endstepper %}

***

### 🔗 Conectando uma conta do YouTube (OAuth2)

Por padrão, o Lavalink pode exibir uma solicitação de login nos logs pedindo para você autorizar uma conta do YouTube. Isso é necessário para evitar limitações e erros de reprodução do YouTube.

{% hint style="info" %}
Se você habilitou `oauth.enabled: true` no seu `application.yml`, o Lavalink irá automaticamente gerar uma URL de autorização de dispositivo na primeira inicialização.
{% endhint %}

{% stepper %}
{% step %}
**📋 Inicie o Lavalink e verifique os logs**

Após enviar e iniciar sua instância do Lavalink, verifique os logs da aplicação. Procure por uma mensagem semelhante a:

```
Please navigate to https://www.youtube.com/device?user_code=XXXX-XXXX and grant access.
```

{% endstep %}

{% step %}
**🔑 Autorize a conta do YouTube**

Abra a URL dos logs no seu navegador (ex.: `https://www.youtube.com/device?user_code=XXXX-XXXX`).

Faça login com a conta Google / YouTube que você deseja que o Lavalink use. Uma conta pessoal funciona bem, uma conta dedicada é recomendada.

{% hint style="warning" %}
Você deve concluir esta etapa **antes que o código expire** (geralmente em poucos minutos). Se expirar, reinicie o Lavalink para gerar um novo código.
{% endhint %}
{% endstep %}

{% step %}
**✅ Confirme a autorização**

Após conceder acesso, retorne aos logs do seu Lavalink. Você deverá ver uma mensagem confirmando que a autorização foi bem-sucedida:

```
YouTube token refreshed successfully.
```

O Lavalink salvará o token e o reutilizará automaticamente em futuras reinicializações. Você não precisa repetir este processo a menos que revogue o acesso ou altere a conta.
{% endstep %}
{% endstepper %}


# Onde Obter Ajuda

Canais e melhores práticas para obter ajuda com Discloud-fóruns da comunidade, chat, áreas de doadores e suporte direto da equipe.

## 🧾 Visão Geral

Existem múltiplas superfícies de suporte dependendo do que você precisa: solução de problemas da comunidade, perguntas sobre uso da plataforma, problemas de cobrança / conta ou escalação privada. Esta página explica onde postar e como perguntar efetivamente.

{% hint style="info" %}
A equipe se concentra em problemas da plataforma Discloud (upload, comportamento de hospedagem, conta, cobrança). Perguntas gerais de codificação são orientadas pela comunidade.
{% endhint %}

***

## 🗂️ Canais de Suporte

| Canal                                                                                           | Tipo                          | Público                | Uso Típico                                                 |
| ----------------------------------------------------------------------------------------------- | ----------------------------- | ---------------------- | ---------------------------------------------------------- |
| [Ticket Modmail (Direto)](https://discord.com/channels/@me/930852077045940224/)                 | Privado                       | Você ↔ Equipe          | Cobrança, conta, dados sensíveis, preocupações de política |
| [chat](https://discord.com/channels/584490943034425391/1051122908103192636)                     | Chat público                  | Todos os usuários      | Perguntas rápidas da plataforma, discussão leve            |
| [dev-help (Fórum)](https://discord.com/channels/584490943034425391/1052629984444948501)         | Threaded público              | Todos os usuários      | Ajuda da comunidade com código / configs                   |
| [donators-chat](https://discord.com/channels/584490943034425391/1051124971763679232)            | Público (restrito a doadores) | Usuários de plano pago | Discussão da comunidade de doadores                        |
| [donators-support (Fórum)](https://discord.com/channels/584490943034425391/1051124971763679232) | Público (restrito a doadores) | Usuários de plano pago | Perguntas técnicas relacionadas ao plano                   |
| [Documentação](https://docs.discloud.com/)                                                      | Autoatendimento               | Todos                  | Guias e referências oficiais                               |

***

## 🎫 Modmail (Ticket Direto da Equipe)

Use modmail para problemas que não devem ser públicos:

* Gerenciamento de cobrança ou assinatura
* Erros específicos da conta (suspensões, anomalias de acesso)
* Relatórios de segurança ou abuso
* Logs / PII sensíveis que devem permanecer privados

{% stepper %}
{% step %}
Abra um DM com [Modmail da Discloud](https://discord.com/channels/@me/930852077045940224/) para iniciar um ticket.
{% endstep %}

{% step %}
Forneça resumo conciso: tipo de problema + ID da app afetada / plano.
{% endstep %}

{% step %}
Anexe logs ou capturas relevantes (não sensíveis).
{% endstep %}
{% endstepper %}

{% hint style="warning" %}
Não envie tokens brutos, chaves API ou dumps completos de variáveis de ambiente em tickets. Redija segredos antes de anexar.
{% endhint %}

***

## 🤝 Fórum da Comunidade: dev-help-english

Q\&A peer-to-peer. A equipe pode ocasionalmente responder, mas respostas não são garantidas.

### ✅ Poste Efetivamente

<table><thead><tr><th width="300">Elemento</th><th>Por Que Importa</th></tr></thead><tbody><tr><td>Objetivo claro</td><td>Ajuda outros a entenderem o resultado desejado</td></tr><tr><td>Passos de repro</td><td>Permite validação e reprodução</td></tr><tr><td>Snippet de erro</td><td>Foca atenção (cole porção mínima)</td></tr><tr><td>Básicos do ambiente</td><td>Linguagem, versão do runtime, nível do plano (se relevante)</td></tr><tr><td>O que você tentou</td><td>Evita sugestões duplicadas</td></tr></tbody></table>

### 🚫 Evite

<table><thead><tr><th width="300">Armadilha</th><th>Abordagem Melhor</th></tr></thead><tbody><tr><td>Vago: "Não funciona"</td><td>Descreva resultado esperado vs atual</td></tr><tr><td>Logs enormes não formatados</td><td>Forneça linhas relevantes</td></tr><tr><td>Comparações de plataforma off-topic</td><td>Mantenha escopo para resolver seu problema</td></tr><tr><td>Tags multilinguagem irrelevantes</td><td>Somente tag tecnologias realmente usadas</td></tr></tbody></table>

{% hint style="success" %}
Pesquise threads existentes primeiro, sua resposta pode já existir.
{% endhint %}

***

## 🔐 Proteja Dados Sensíveis

Nunca compartilhe publicamente:

| Tipo de Dado        | Exemplo                                          |
| ------------------- | ------------------------------------------------ |
| Tokens / Chaves API | Token de bot, chaves de serviço                  |
| Senhas              | Credenciais de banco de dados / painel           |
| URLs Privadas       | Endpoints de callback internos contendo segredos |
| Info Pessoal        | Email, identificadores de cobrança               |

Use placeholders: `SEU_TOKEN_AQUI`, `exemplo-db-host`.

{% hint style="danger" %}
Se você acidentalmente vazou uma credencial, revogue / rotacione imediatamente e notifique a equipe se o risco se estender além da sua conta.
{% endhint %}

***

## 📚 Aprenda e Desenvolva Habilidades

Parceiros / conteúdo de aprendizado recomendados gratuitos:

{% tabs %}
{% tab title="JavaScript" %}
{% embed url="<https://www.youtube.com/watch?list=PL9tY_tDo_Q0C0hs1aGgtJbEH1EBlyzZdG&v=lQAJ-T1QTYc>" %}
{% endtab %}

{% tab title="TypeScript" %}
{% embed url="<https://www.youtube.com/watch?list=PL9tY_tDo_Q0DOAzTaPnWYsryfNLsz1K6U&v=4pIo-p6pX34>" %}
{% endtab %}
{% endtabs %}

***

## 🚀 Antes de Perguntar, Verifique

| Item                                          | Por Que                                       |
| --------------------------------------------- | --------------------------------------------- |
| Docs atualizados?                             | Recurso pode já estar documentado             |
| Changelog / anúncios recentes                 | Comportamento poderia ser mudança intencional |
| Páginas FAQ / solução de problemas existentes | Respostas comuns cobertas                     |
| Limites do plano                              | Alguns erros são relacionados a quota         |


# Perguntas Gerais

Respostas rápidas para perguntas comuns de uso da Discloud (estrutura do projeto, arquivo principal, ambiente, comportamento do plano, logging, domínios e noções básicas de assinatura).

## 🧾 Propósito

Esta seção agrupa respostas curtas e autocontidas às perguntas mais frequentes da plataforma—para que você possa se desbloquear sem abrir um ticket. Para depuração mais profunda ou problemas da plataforma, veja: Onde Obter Ajuda.

{% hint style="info" %}
Se sua pergunta envolve interrupções, discrepâncias de cobrança ou preocupações de segurança, escale via modmail (ticket direto da equipe) em vez de confiar nestas páginas.
{% endhint %}


# O que é a raiz do projeto?

Entenda a raiz do projeto (diretório base) para que a Discloud possa detectar configurações, dependências e seu arquivo principal corretamente.

## 🧾 Visão Geral

A raiz do projeto ("diretório raiz") é a **pasta de nível superior da sua aplicação,** o lugar que você comprime e envia para a Discloud. Ela contém o arquivo de configuração ([`discloud.config`](https://github.com/discloud/docs/blob/portuguese/configurations/discloud.config)), manifesto de dependências (ex. [`package.json`](/development-environment/supported-languages/javascript/package-json), [`requirements.txt`](/development-environment/supported-languages/python/requirements.txt), [`Cargo.toml`](/development-environment/supported-languages/rust/cargo.toml), [`Gemfile`](/development-environment/supported-languages/ruby/gemfile)), opcional [`.env`](/faq/general-questions/.env-file), e as pastas com seu código fonte (ex. `src/`).

Se a estrutura estiver errada (por exemplo, você zipa uma pasta que contém outra pasta única que realmente contém os arquivos), a Discloud pode falhar em detectar o arquivo principal ou dependências.

***

## 🖼️ Exemplo Visual

A zona verde representa a **raiz** que você deve comprimir. Amarelo mostra uma pasta aninhada contendo arquivos de código. Tudo dentro do verde é incluído quando você zipa esse diretório.

<figure><img src="/files/PSVI0hFggj6hcNQJN3GF" alt=""><figcaption></figcaption></figure>

***

### 🚫 Erros Comuns

| Erro                                            | Resultado                                 | Correção                                                                                                                                     |
| ----------------------------------------------- | ----------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------- |
| Compactar a pasta principal em vez da raiz real | Configuração / arquivo principal ausente  | Compacte diretamente a pasta que contém [`discloud.config`](https://github.com/discloud/docs/blob/portuguese/configurations/discloud.config) |
| Incluir `node_modules`                          | Upload grande; possíveis erros de tamanho | Remova; deixe a Discloud instalar                                                                                                            |
| Tokens hardcoded no código                      | Exposição de dados sensíveis              | Use [`.env`](/faq/general-questions/.env-file) e variáveis de ambiente                                                                       |
| Múltiplos arquivos de entrada ambíguos          | Falha na inicialização                    | Defina `MAIN` em [`discloud.config`](https://github.com/discloud/docs/blob/portuguese/configurations/discloud.config) explicitamente         |


# Arquivo .env

Aprenda os fundamentos do arquivo .env, incluindo sintaxe, melhores práticas de segurança e como gerenciar com segurança variáveis de ambiente em seus projetos.

### 📄 O que é um arquivo `.env`?

Um **arquivo `.env`** é um arquivo de texto simples usado para armazenar **variáveis de ambiente**. É o padrão da indústria para manter informações sensíveis, como tokens de API, senhas de banco de dados e chaves secretas, separadas do código-fonte da sua aplicação.

Ao usar um arquivo `.env`, você garante que seus segredos não sejam codificados, tornando sua aplicação mais segura e fácil de configurar em diferentes ambientes (desenvolvimento, staging, produção).

***

## 🛠️ Como Funciona

O arquivo consiste em **pares Chave-Valor**, onde cada linha representa uma variável.

#### Regras de Sintaxe:

* **Formato:** `CHAVE=VALOR`
* **Sem Espaços:** Não coloque espaços ao redor do sinal `=`.
* **Aspas:** Valores com espaços devem ser envoltos em aspas duplas (`"`).
* **Comentários:** Use `#` para adicionar comentários.

{% code title=".env" %}

```
# Este é um comentário
DISCORD_TOKEN=seu_token_aqui
DATABASE_URL="mongodb+srv://user:pass@cluster.mongodb.net/myFirstDatabase"
PORT=8080
```

{% endcode %}

***

## 🔒 Melhores Práticas de Segurança

<details>

<summary>Nunca Faça Commit no Git</summary>

Seu arquivo `.env` contém dados sensíveis. **Nunca** faça upload para GitHub, GitLab ou qualquer repositório público. Se fizer, qualquer pessoa com acesso ao repositório pode roubar suas credenciais.

</details>

<details>

<summary>Use <code>.gitignore</code></summary>

Para evitar uploads acidentais, adicione `.env` ao seu arquivo `.gitignore`:

{% code title=".gitignore" %}

```
.env
```

{% endcode %}

</details>

<details>

<summary>Crie um Modelo</summary>

Como você não compartilhará seu arquivo `.env`, é útil fornecer um arquivo `.env.example` com as chaves, mas sem valores reais. Isso ajuda outros desenvolvedores (ou você mesmo no futuro) a saber quais variáveis são necessárias.

</details>

<details>

<summary>Evite Hardcoding</summary>

Codar informações sensíveis diretamente no código-fonte é um grande risco de segurança. Quando você "hordcoda" um segredo, ele se torna parte permanente do seu código-base, mesmo se você o deletar depois, ele permanece visível no histórico do Git.

**Por que você deve evitar:**

* **Exposição de Segurança:** Qualquer pessoa com acesso ao seu código (ou ao histórico do repositório) pode ver seus segredos.
* **Falta de Flexibilidade:** Você precisaria modificar e reimplantar seu código toda vez que quisesse alterar um token ou URL de banco de dados.
* **Vazamentos Acidentais:** É muito fácil acidentalmente enviar segredos codificados para plataformas públicas como GitHub.

Em vez disso, sempre referencie variáveis de ambiente. Isso mantém seus segredos em um arquivo separado (`.env`) que nunca é commitado no controle de versão, garantindo que seu código permaneça limpo e seguro.

**Exemplo:**

* **❌ Prática Ruim:** `const token = "MTIzNDU2Nzg5MDEyMzQ1Njc4.GbX123.abcde...";`
* **✅ Prática Boa:** `const token = process.env.DISCORD_TOKEN;`

</details>

***

## ☁️ Uso na Discloud

Na Discloud, o arquivo `.env` é a principal forma de gerenciar os segredos da sua aplicação.

* **Localização:** Seus arquivos de ambiente **devem** estar localizados na **raiz do seu projeto**, ao lado do seu `discloud.config`.
* **Carregamento:** Embora `.env` seja o nome padrão para a maioria das bibliotecas, a Discloud permite o uso de nomes de arquivo personalizados (ex.: `.env.production`), desde que seu código da aplicação esteja configurado para carregá-los.

***

## 📝 Exemplos de Linguagens

Aqui está como você pode acessar variáveis de ambiente em diferentes linguagens de programação:

{% tabs %}
{% tab title="Node.js" %}
No Node.js, você normalmente usa o pacote `dotenv`. Por padrão, ele procura por `.env`, mas você pode especificar um caminho.

```javascript
// Padrão (.env)
require('dotenv').config();

const token = process.env.DISCORD_TOKEN;
```

{% endtab %}

{% tab title="Python" %}
No Python, você pode usar `python-dotenv`.

```python
import os
from dotenv import load_dotenv

# Padrão (.env)
load_dotenv()

token = os.getenv("DISCORD_TOKEN")
```

{% endtab %}

{% tab title="Java" %}
No Java, você pode usar `System.getenv()`.

```java
public class Main {
    public static void main(String[] args) {
        String token = System.getenv("DISCORD_TOKEN");
        System.out.println("Token: " + token);
    }
}
```

{% endtab %}
{% endtabs %}


# Qual é o arquivo principal?

Saiba o que é o arquivo principal e como identificá-lo em seu projeto.

## 📂 Arquivos Principais Gerais

O **arquivo principal** (main file) é o código fundamental da sua aplicação. É o ponto de entrada que faz seu bot ficar online ou seu site começar a funcionar. Dependendo da linguagem e de como você o nomeou, exemplos comuns incluem:

* `index.js`
* `bot.js`
* `main.py`
* `index.py`
* `app.js`

***

## ⚠️ Exceções (Padrões)

Alguns softwares de criação de bots, como o **Discord Bot Maker (DBM)** e o **Discord Bot Controls**, já possuem um arquivo principal padrão configurado, que geralmente é:

* `bot.js`

***

## 🔍 Como eu sei qual é o meu arquivo principal?

O arquivo principal é aquele que você usa para iniciar sua aplicação localmente. Se você não tiver certeza, verifique os métodos comuns para cada linguagem abaixo:

{% tabs %}
{% tab title="JavaScript" %}
O arquivo principal é o que você usa para iniciar seu bot:

* Ao executar o comando `node ArquivoPrincipal.js`.
* Geralmente é definido no seu `package.json` sob o campo `"main"`.

```json
{
  "name": "meu-bot",
  "version": "1.0.0",
  "main": "index.js",
  "scripts": {
    "start": "node index.js"
  }
}
```

{% endtab %}

{% tab title="Python" %}
O arquivo principal é o que você usa para iniciar seu bot:

* Ao executar o comando `python ArquivoPrincipal.py`.
* Clicando com o botão direito no arquivo e selecionando **RUN** no PyCharm ou VS Code.
  {% endtab %}

{% tab title="Java" %}
O arquivo principal é o que você usa para iniciar seu bot:

* Ao executar o comando `java -jar ArquivoPrincipal.jar`.
* Clicando duas vezes no arquivo `.jar`.
  {% endtab %}

{% tab title="Ruby" %}
O arquivo principal é o que você usa para iniciar seu bot:

* Ao executar o comando `ruby ArquivoPrincipal.rb`.
  {% endtab %}

{% tab title="Go" %}
O arquivo principal é o que você usa para iniciar seu bot:

* Ao executar o comando `go run ArquivoPrincipal.go`.
  {% endtab %}

{% tab title="PHP" %}
O arquivo principal é o que você usa para iniciar seu bot:

* Ao executar o comando `php ArquivoPrincipal.php`.
  {% endtab %}

{% tab title="Rust" %}
Em projetos Rust, o arquivo principal geralmente está localizado em:

* `src/main.rs`
  {% endtab %}
  {% endtabs %}

***

## 🛠️ Definindo na Discloud

Depois de identificar seu arquivo principal, você deve especificá-lo em seu arquivo [**`discloud.config`**](https://github.com/discloud/docs/blob/portuguese/configurations/discloud.config) usando a propriedade `MAIN`.

```ini
MAIN=index.js
```

{% hint style="info" %}
O nome `ArquivoPrincipal.*` usado nos exemplos acima é apenas um exemplo. Seu arquivo pode ter qualquer nome que você escolher, desde que seja o ponto de entrada da sua aplicação.
{% endhint %}


# Como criar um subdomínio?

Aprenda como registrar e gerir subdomínios personalizados da Discloud para suas aplicações.

## 🌐 O que é um Subdomínio da Discloud?

Na **Discloud**, qualquer app que utiliza uma **porta** e precisa de **acesso externo** através dela para ser acessado é considerada um site. Isso inclui bots com dashboards, dashboards, APIs, sites estáticos e dinâmicos, entre muitos outros…

Para permitir acesso externo ao seu app, a Discloud oferece a opção de criar um **subdomínio personalizado**. Esse subdomínio redireciona o tráfego através do proxy da Discloud para a **porta 8080** do seu app, permitindo que você e os usuários acessem o seu site de forma **segura e confiável**.

### 📡 Como funciona

<figure><img src="/files/sLCrtiCSPScGSuRqsZg3" alt="Discloud subdomain flow"><figcaption></figcaption></figure>

***

## ✅ Requisitos

Para registrar e usar um subdomínio da Discloud, você precisa atender aos seguintes requisitos:

{% hint style="success" %}
[Plano Platinum ou superior](https://discloud.com/plans) é necessário para hospedar sites ou APIs.
{% endhint %}

{% hint style="success" %}
**Porta 8080** – Sua aplicação deve escutar na porta 8080 para receber tráfego externo.
{% endhint %}

{% hint style="success" %}
**Discloud Config** – Seu app deve incluir um arquivo [discloud.config](https://github.com/discloud/docs/blob/portuguese/configurations/discloud.config) devidamente configurado.
{% endhint %}

***

## 🚀 Registre o seu Subdomínio

{% stepper %}
{% step %}
Abra o [Discloud Dashboard](https://discloud.com/dashboard).
{% endstep %}

{% step %}
Clique na aba `Domínios` no menu lateral da página da sua conta.

<figure><img src="/files/T41yrbNjj13DX3eYgLI7" alt="Dashboard Subdomain tab"><figcaption></figcaption></figure>
{% endstep %}

{% step %}
Clique no botão `+ Criar subdomínio` para criar um novo subdomínio.

<figure><img src="/files/gw44wZBVa8WFCboTvJIn" alt="Add Subdomain button"><figcaption></figcaption></figure>
{% endstep %}

{% step %}
Insira o nome desejado para o subdomínio (ex.: `meuapp`, `dashboard`, `api`).

{% hint style="info" %}

#### **Regras para nomear o subdomínio**

* Máximo de **20 caracteres**
* Apenas caracteres alfanuméricos (A–Z, 0–9) e hífens (-)
* Não são permitidos espaços, underscores ou caracteres especiais
  {% endhint %}
  {% endstep %}

{% step %}
Seu subdomínio agora está registrado e seu estado aparecerá como **Disponível**.
{% endstep %}
{% endstepper %}

***

## 📝 Configure seu [discloud.config](https://github.com/discloud/docs/blob/portuguese/configurations/discloud.config)

Depois que o seu subdomínio estiver registrado, você deve adicioná-lo ao arquivo `discloud.config` para que a Discloud possa direcionar o tráfego para o aplicativo correto.

Abra o arquivo `discloud.config` e localize o campo `ID`:

```ini
ID=seusubdominio
```

{% hint style="warning" %}

#### **Como especificar o subdomínio no arquivo `discloud.config`?**

Use apenas o nome do subdomínio, não o domínio completo (por exemplo, use `meuapp`, e não `meuap.discloud.app`).

Exemplo:

<pre class="language-ini" data-title="discloud.config"><code class="lang-ini"><strong>ID=myapp
</strong>TYPE=site
<a data-footnote-ref href="#user-content-fn-1"># ...</a>
</code></pre>

{% endhint %}

Após atualizar o `discloud.config`, **faça o deploy da sua aplicação** para que as alterações entrem em vigor.

{% content-ref url="/pages/htZKWrZhVFqFx95LF0by" %}
[Como Hospedar](/how-to-host/bots)
{% endcontent-ref %}

***

## 🔄 Estados do Subdomínio

Seu subdomínio registrado pode ter dois estados:

{% hint style="info" %}

#### **🔵 Ativo**

* O subdomínio está **registrado e em uso**.
* Uma aplicação está atualmente em deploy e acessível em `https://seusubdominio.discloud.app`.
* O tráfego está sendo roteado para a sua aplicação na porta 8080.
  {% endhint %}

{% hint style="info" %}

#### **🟢 Disponível**

* O subdomínio está **registrado e disponível**.
* Nenhuma aplicação está usando ele no momento.
* Você pode fazer o deploy de um app para ativá-lo a qualquer momento.
  {% endhint %}

***

## 🌍 Acesse Seu Site

Quando seu subdomínio estiver **Ativado**, você pode acessá-lo em:

```
https://seusubdominio.discloud.app
```

***

## ⚙️ Domínio Personalizado

Se você quiser usar seu próprio domínio (ex.: `seudominio.com`) em vez de um subdomínio da Discloud, veja:

{% content-ref url="/pages/qjyF7yLyxPtKMXC64Z6w" %}
[Domínio Personalizado](/api-and-integrations/custom-domain)
{% endcontent-ref %}

[^1]: **Nota:** Os **`...`** apenas indicam a continuação de outras opções anteriores ou subsequentes que não são relevantes para mencionar nesta página.


# Como posso obter o ID do meu bot do Discord?

Saiba o que é o ID da Aplicação do Discord (Client ID) e como encontrá-lo no Discord Developer Portal.

### 🤖 O que é o ID da Aplicação do Discord?

O **ID da Aplicação do Discord** (também chamado de **Client ID**) é um identificador numérico único que o Discord atribui a toda aplicação criada no [Discord Developer Portal](https://discord.com/developers/applications).

{% hint style="info" %}
Este **não** é o mesmo que o **ID do App da Discloud**, que a Discloud gera internamente para sua aplicação hospedada. O **ID da Aplicação do Discord** vem do próprio Discord e identifica seu bot na plataforma do Discord, ele só é necessário para o [fluxo de Configuração Rápida via o bot do Discord da Discloud](/how-to-host-using/discord-bot#configuracao-rapida-guia-passo-a-passo).
{% endhint %}

***

### 📍 Como Obter o ID da Sua Aplicação do Discord

{% stepper %}
{% step %}
Abra o [**Discord Developer Portal**](https://discord.com/developers/applications) e faça login com sua conta do Discord.
{% endstep %}

{% step %}
Clique na aplicação do seu bot na lista.

Se ainda não criou uma aplicação, clique no botão **New Application**, dê um nome e crie-a.
{% endstep %}

{% step %}
Na página **General Information** (aberta por padrão), copie o **Client ID**, este é o ID da Aplicação do seu bot no Discord.

<figure><img src="/files/Sw1bhdpYGLAzx5rTlwdN" alt=""><figcaption></figcaption></figure>
{% endstep %}
{% endstepper %}

{% hint style="warning" %}
O **ID da Aplicação** é uma **informação pública**, não há problema em compartilhá-lo. No entanto, mantenha seu **Bot Token** (encontrado na aba **Bot**) **em privado**, pois qualquer pessoa com ele pode controlar seu bot.
{% endhint %}

***

### 🔍 Onde é Necessário?

Este ID é especificamente necessário ao usar o método de **Configuração Rápida** através do [Bot da Discloud](/how-to-host-using/discord-bot#configuracao-rapida-guia-passo-a-passo), durante o fluxo guiado, o bot solicitará que você insira o ID da Aplicação.

Se você estiver usando a **Configuração Avançada** (com um arquivo [`discloud.config`](https://github.com/discloud/docs/blob/portuguese/configurations/discloud.config)), não precisa fornecer este ID, a Discloud lida com a configuração automaticamente.


# \[EM ANDAMENTO] Como comprimir?


# \[EM ANDAMENTO] Como fazer commit?


# \[EM ANDAMENTO] Bot muito pesado


# \[EM ANDAMENTO] Por que não consigo acessar meu site?


# \[EM ANDAMENTO] Você já possui uma conta registrada no sistema


# \[EM ANDAMENTO] Como acessar os logs da aplicação?


# \[EM ANDAMENTO] Por que Aplicações Gratuitas são Encerradas?


# \[EM ANDAMENTO] Como verificar uma conta do Discord?


# Como construir e empacotar uma aplicação Java?

Entenda como compilar e empacotar seu projeto Java em um arquivo JAR hospedado usando Maven ou Gradle.

## 📌 **Por Que Preciso Construir Minha Aplicação Java?**

Discloud **não compila projetos Java** automaticamente.

Você deve:\
✔ **Compilar seu código** em arquivos `.class`.\
✔ **Empacotar tudo em um único arquivo `.jar`** (incluindo dependências).\
✔ **Garantir que o arquivo `META-INF/MANIFEST.MF`** defina corretamente a **Main-Class**.

***

## 🔧 **Escolhendo uma Ferramenta de Construção**

<table><thead><tr><th width="112">Ferramenta de Construção</th><th width="367">Melhor Para</th><th>Arquivos Necessários</th></tr></thead><tbody><tr><td><strong>Maven</strong></td><td>Grandes projetos, aplicativos com muitas dependências</td><td><code>pom.xml</code></td></tr><tr><td><strong>Gradle</strong></td><td>Projetos modernos com scripts de construção flexíveis</td><td><code>build.gradle</code> ou <code>build.gradle.kts</code></td></tr></tbody></table>

***

## 📦 **Construindo Sua Aplicação Java**

{% tabs %}
{% tab title="Maven" %}
[Apache Maven](https://maven.apache.org/guides/index.html) é uma ferramenta de automação de construção amplamente usada que gerencia construções de projetos, dependências e documentação usando um Modelo de Objeto de Projeto (POM).​

{% stepper %}
{% step %}
Adicione o Plugin do Compilador Maven\*\*.\*\*

Garanta que seu `pom.xml` inclua o **Plugin do Compilador Maven** para especificar a versão do Java para compilação. Isso evita problemas de compatibilidade ao executar o projeto.

{% code title="pom.xml" %}

```xml
<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-compiler-plugin</artifactId>
  <version>3.9.9</version>
  <configuration>
    <source>17</source>
    <target>17</target>
  </configuration>
</plugin>
```

{% endcode %}

{% hint style="info" %}

* Defina `<source>` e `<target>` para a **versão do Java** necessária para seu projeto.
  {% endhint %}
  {% endstep %}

{% step %}
Especifique a Classe Principal\*\*.\*\*

Para tornar sua aplicação executável, você precisa especificar o ponto de entrada (método `main`). Isso é feito usando o **Plugin Maven Shade**, que também garante que todas as dependências sejam agrupadas dentro de um **único arquivo JAR**.

{% code title="pom.xml" %}

```xml
<build>
  <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-shade-plugin</artifactId>
      <version>3.2.4</version>
      <executions>
        <execution>
          <phase>package</phase>
          <goals>
            <goal>shade</goal>
          </goals>
          <configuration>
            <transformers>
              <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                <!-- NOTE: Replace this with the correct path to your project's main class -->
                <mainClass>com.project.example.Main</mainClass>
              </transformer>
            </transformers>
          </configuration>
        </execution>
      </executions>
    </plugin>
  </plugins>
</build>
```

{% endcode %}

{% hint style="info" %}

* Substitua `com.project.example.Main` pelo nome **totalmente qualificado** real da sua classe `Main`.
* Garanta que a classe `Main` contenha um método `public static void main(String[] args)` válido.
  {% endhint %}
  {% endstep %}

{% step %}
Construa o Projeto\*\*.\*\*

Execute o seguinte comando para **limpar** construções antigas e gerar os novos arquivos JAR:

```bash
mvn clean package
```

Após executar `mvn package`, o Maven criará **dois** arquivos JAR diferentes dentro do diretório `target/`:

{% stepper %}
{% step %}
JAR Padrão (JAR Original do Projeto).

📌 **Nome do arquivo:** `original-<artifactId>-<version>.jar`\
📌 **Exemplo:** `original-com.maven.discordbot-0.0.1-SNAPSHOT.jar`\
📌 **Conteúdo:**

* Apenas **o código compilado do seu projeto**.
* **NÃO inclui dependências**.

{% hint style="danger" %}
**NÃO use este arquivo para execução** a menos que as dependências sejam tratadas separadamente.
{% endhint %}
{% endstep %}

{% step %}
JAR Gordo (JAR Sombreado com Dependências).

📌 **Nome do arquivo:** `<artifactId>-<version>.jar`\
📌 **Exemplo:** `com.maven.discordbot-0.0.1-SNAPSHOT.jar`\
📌 **Conteúdo:**

* Seu **código de aplicação compilado**.
* **Todas as dependências incluídas** (JDA, Apache Commons, etc.).
* **Arquivo de manifesto (`MANIFEST.MF`) com a entrada `Main-Class`**.

{% hint style="success" %}
**Use este arquivo para execução e upload.**
{% endhint %}
{% endstep %}
{% endstepper %}
{% endstep %}
{% endstepper %}
{% endtab %}

{% tab title="Gradle" %}
[Gradle](https://gradle.org/) é uma ferramenta flexível de automação de construção que usa uma DSL baseada em Groovy ou Kotlin para definir o processo de construção.​

{% stepper %}
{% step %}
Aplique o Plugin Java.

Garanta que seu `build.gradle` (Groovy) ou `build.gradle.kts` (Kotlin) aplique o **plugin Java**:

{% tabs %}
{% tab title="Groovy" %}
{% code title="build.gradle" %}

```groovy
plugins {
    id 'java'
    id 'com.gradleup.shadow' version '8.3.6' // Plugin Shadow para Fat JAR
}
```

{% endcode %}
{% endtab %}

{% tab title="Kotlin" %}
{% code title="build.gradle.kts" %}

```kotlin
plugins {
    java
    id("com.gradleup.shadow") version "8.3.6"
}
```

{% endcode %}
{% endtab %}
{% endtabs %}
{% endstep %}

{% step %}
Especifique a Classe Principal.

Para tornar a aplicação executável, defina o **ponto de entrada (método `main`)** dentro do **manifesto JAR**.

{% tabs %}
{% tab title="Groovy" %}
{% code title="build.gradle" %}

```groovy
shadowJar {
    archiveClassifier.set('all')
    manifest {
        attributes(
            'Main-Class': 'com.project.Main' // Substitua pela sua classe principal real
        )
    }
}

tasks.build.dependsOn shadowJar // Garantir que o shadowJar seja executado ao compilar
```

{% endcode %}
{% endtab %}

{% tab title="Kotlin" %}
{% code title="build.gradle.kts" %}

```kotlin
import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar

tasks.withType<ShadowJar> {
    archiveClassifier.set("all")
    manifest {
        attributes(mapOf("Main-Class" to "com.project.Main")) // Substitua pela sua classe main real
    }
}

tasks.named("build") {
    dependsOn("shadowJar")
}
```

{% endcode %}
{% endtab %}
{% endtabs %}

{% hint style="info" %}

* Substitua `"com.project.Main"` pelo nome **totalmente qualificado** da sua classe `Main`.
  {% endhint %}
  {% endstep %}

{% step %}
Construa o Projeto.

Para limpar construções antigas e gerar novos arquivos JAR, execute:

```groovy
gradle clean build
```

{% stepper %}
{% step %}
JAR Padrão (JAR Regular do Projeto).

📌 **Nome do arquivo:** `<project-name>.jar`\
📌 **Exemplo:** `discordbot.jar`\
📌 **Conteúdo:**

* Apenas **o código compilado do seu projeto**.
* **NÃO inclui dependências**.

{% hint style="danger" %}
**NÃO use este arquivo para execução** a menos que as dependências sejam tratadas separadamente.
{% endhint %}
{% endstep %}

{% step %}
JAR Gordo (Uber JAR com Dependências).

📌 **Nome do arquivo:** `<project-name>-all.jar`\
📌 **Exemplo:** `discordbot-all.jar`\
📌 **Conteúdo:**

* Seu **código de aplicação compilado**.
* **Todas as dependências incluídas** (JDA, Apache Commons, etc.).
* **Arquivo de manifesto (`MANIFEST.MF`) com a entrada `Main-Class`**.

{% hint style="success" %}
**Use este arquivo para execução e upload.**
{% endhint %}
{% endstep %}
{% endstepper %}
{% endstep %}
{% endstepper %}
{% endtab %}
{% endtabs %}

{% hint style="info" %}

#### **Recomendação**

Renomeie seu arquivo JAR para um nome simples como `app.jar` para evitar problemas com caracteres especiais.​
{% endhint %}


# Gerenciamento de Assinaturas

Gerencie sua assinatura Discloud (atualizar, cancelar, reativar) através do painel de cobrança.

## 🧾 Visão Geral

Esta página cobre como gerenciar uma assinatura paga existente adquirida através do site da Discloud (Stripe). Se você precisar comprar um plano, veja: [Planos e Suporte](/about/donations).

***

## 🔐 Acesse o Painel de Cobrança

{% stepper %}
{% step %}
Visite: <https://discloud.com/dashboard/billing> (faça login se solicitado).
{% endstep %}

{% step %}
Localize o cartão de assinatura ativa com detalhes do plano e data de renovação.
{% endstep %}
{% endstepper %}

***

## 🔄 Cancelar Assinatura

Cancelar para futuras renovações automáticas. Os benefícios do seu plano atual permanecem até o fim do período pago.

| Efeito    | Detalhe                                         |
| --------- | ----------------------------------------------- |
| Recursos  | Permanecem ativos até a expiração               |
| Renovação | Desabilitada após cancelamento                  |
| Reversão  | Você pode reativar antes ou depois da expiração |

{% hint style="warning" %}
Cancelar antecipadamente não aciona um reembolso parcial (a menos que leis locais de consumidor exijam o contrário).
{% endhint %}

<figure><img src="/files/nUucxARnz02vmlR8coHP" alt="" width="515"><figcaption></figcaption></figure>

***

## ✅ Reativar Assinatura

Se você cancelou por engano (ou deseja continuar os benefícios), use Reativar. A renovação retoma no ritmo original.

<figure><img src="/files/RUn6yhjHKtVE5puaZTqL" alt="" width="563"><figcaption></figcaption></figure>

| Cenário                     | Resultado                                                  |
| --------------------------- | ---------------------------------------------------------- |
| Reativar antes da expiração | Acesso contínuo, sem interrupção                           |
| Reativar após a expiração   | Benefícios do plano retomam assim que o pagamento processa |

***

## ❓ Perguntas Comuns

| Pergunta                                 | Resposta                                                                                                                              |
| ---------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------- |
| Cancelar remove meus apps imediatamente? | Não, os benefícios duram até o fim do período.                                                                                        |
| Posso pausar em vez de cancelar?         | Abra um [ticket](https://discord.com/channels/@me/930852077045940224/) no nosso [servidor Discord](https://discord.discloudbot.com/). |
| Onde atualizo o método de pagamento?     | Painel de cobrança / fluxo do portal Stripe.                                                                                          |


# Como obter o meu token da API da Discloud?

Saiba o que é o Token da API da Discloud e onde encontrá-lo no Dashboard.

## 🔑 O que é o Token da API da Discloud?

Seu **Token da API da Discloud** é uma **credencial pessoal e secreta** que autentica você em todas as superfícies de desenvolvedor da Discloud:

* [**Requisições à REST API**](/api-and-integrations/api-overview)
* [**CLI Oficial**](/how-to-host-using/cli)
* [**Extensão para VS Code**](/how-to-host-using/visual-studio-code)
* **SDKs / Bibliotecas** (ex.: [npm](/sdks-and-libraries/npm-library), [Python](/sdks-and-libraries/python-library))

Ele identifica sua conta de forma única, então **qualquer pessoa com esse token pode agir como você**. Trate-o como uma senha.

***

## 📍 Onde Encontrar

Siga estes passos para visualizar (ou copiar) seu token no Dashboard:

{% stepper %}
{% step %}
Abra o Dashboard: <https://discloud.com/dashboard>
{% endstep %}

{% step %}
Na barra lateral esquerda, expanda **Ferramentas** e clique em **Chaves de API**.
{% endstep %}

{% step %}
Use o botão **Copiar** para copiar o token para sua área de transferência.
{% endstep %}
{% endstepper %}

> Se o token estiver oculto, clique em **Mostrar** para revelar. Use **Redefinir** apenas se suspeitar de comprometimento.

***

## 🔒 Boas Práticas de Segurança

| Prática                                     | Por quê                                       |
| ------------------------------------------- | --------------------------------------------- |
| Mantenha privado (não compartilhe / print)  | Evita sequestro da conta                      |
| NÃO faça commit no Git                      | Repositórios públicos são escaneados por bots |
| Use variáveis de ambiente / secret managers | Rotação centralizada e logs mais seguros      |
| Recrie (Resetar Token) se exposto           | Invalida imediatamente o token antigo         |

{% hint style="danger" %}
Se você publicar ou colar seu token em algum lugar público por engano, **reinicie-o imediatamente** em **Ferramentas > Chaves de API** no Dashboard e reimplante qualquer serviço que usava o token antigo.
{% endhint %}


# Como obter o ID da minha conta Discloud?

Saiba o que é o ID da sua conta Discloud e onde encontrá-lo no Dashboard.

### 🪪 O que é o ID da Conta Discloud?

O **ID da Conta Discloud** é um identificador numérico único que a Discloud atribui à sua conta no momento do cadastro. Diferente do Token da API, o ID da conta é uma **informação pública**, ou seja, você pode compartilhá-lo sem risco.

***

### 📍 Como Encontrar o ID da Sua Conta

{% stepper %}
{% step %}
Abra o Dashboard: <https://discloud.com/dashboard>
{% endstep %}

{% step %}
No canto inferior direito, clique no **seu perfil** para abrir o menu de usuário.
{% endstep %}

{% step %}
No menu que aparecer, clique em **My account**.
{% endstep %}

{% step %}
Na página de informações da conta, o seu **ID** aparece logo abaixo do seu avatar.

<figure><img src="/files/jJTJoMiGrTpDHF0mdBtQ" alt=""><figcaption></figcaption></figure>
{% endstep %}
{% endstepper %}


# Soluções de Problemas

Centro central para diagnosticar e resolver problemas comuns de runtime, build, networking e configuração da Discloud antes de abrir um ticket.

## 🧾 Propósito

Esta seção documenta **problemas recorrentes e suas resoluções**: falhas de build, travamentos de inicialização, apps offline, erros de instalação de dependências, limites de memória e padrões de configuração incorreta. Use-a após verificações rápidas de FAQ, antes de escalar para a equipe.


# Diagnosticando Aplicações Offline

Aprenda como diagnosticar e resolver problemas comuns com aplicações que falham em permanecer online na Discloud.

Se sua aplicação **encerra inesperadamente** na Discloud, é importante analisar **o que pode estar causando o problema**. Este guia ajudará você a **identificar, depurar e resolver** problemas comuns relacionados a aplicações indo offline.

***

## 🛑 **Comportamentos Comuns de Aplicação e Causas**

Quando uma aplicação encerra inesperadamente, o **comportamento** pode fornecer pistas sobre a causa raiz.

{% stepper %}
{% step %}
Inicia e imediatamente encerra.

* Indica um **problema crítico** impedindo a inicialização adequada.
* Causas prováveis: **limitações de RAM, dependências ausentes, configurações incorretas ou erros no código de inicialização**.
  {% endstep %}

{% step %}
Encerra durante uma ação específica.

* Acontece quando a aplicação é **acionada por um comando ou evento específico**.
* Causas prováveis: **exceções não capturadas, uso alto de recursos ou falhas de API**.
  {% endstep %}

{% step %}
Vai offline após alguns dias (plano gratuito).

* Pode estar relacionado à **política anti-ghost app da Discloud** para planos gratuitos.
* Considere **atualizar para um plano pago** para manter aplicações online.
  {% endstep %}
  {% endstepper %}

***

## ⚠️ **Causas Potenciais e Correções**

{% hint style="warning" %}

#### **RAM Insuficiente**

Se sua aplicação **excede sua memória alocada**, ela pode ser **forçadamente encerrada**.

✔ **Monitore o uso de RAM** e otimize seu código.\
✔ Considere **aumentar a RAM** no seu arquivo [`discloud.config`](https://github.com/discloud/docs/blob/portuguese/configurations/discloud.config).
{% endhint %}

{% hint style="warning" %}

#### **Erros de Código e Exceções**

Exceções não tratadas ou **bugs no seu código** podem causar travamentos.

✔ Verifique os **logs** para mensagens de erro.\
✔ **Teste localmente** antes de fazer o upload na Discloud.
{% endhint %}

{% hint style="info" %}

#### **Limitações do Plano Gratuito**

O plano gratuito da Discloud **pode suspender aplicações inativas** para liberar recursos.

✔ Se sua aplicação **vai offline inesperadamente**, isso pode ser o motivo.\
✔ Considere [**atualizar para um plano pago**](https://discloud.com/plans) para mantê-la rodando.
{% endhint %}

***

## 🛠️ **Depuração Passo a Passo**

📌 **Um erro comum que desenvolvedores cometem é dizer:** *"Funciona na minha máquina mas não na Discloud."*

Lembre-se, **a Discloud opera em um ambiente Linux**. Sua aplicação deve ser **adaptada para rodar no ambiente alvo**, não apenas na sua máquina local.

***

## ⚡ **Corrigindo Aplicações Que Encerram Imediatamente**

Se sua aplicação **inicia e imediatamente encerra**, geralmente é devido a:

{% stepper %}
{% step %}
RAM insuficiente.

* Se a aplicação usa mais memória do que alocada, a Discloud **encerra forçadamente**.
* Verifique seu **uso de RAM** e **otimize operações intensivas em memória**.
  {% endstep %}

{% step %}
Erros durante a inicialização.

* Bugs na **sequência de inicialização** podem **impedir a app de rodar adequadamente**.
* Verifique **dependências ausentes**, **configurações incorretas** ou **erros não capturados** na lógica de inicialização.
  {% endstep %}
  {% endstepper %}

***

## ❗ **Corrigindo Aplicações Que Encerram Durante uma Ação Específica**

Se sua aplicação **para de rodar quando um evento ou ação específica é acionada**, siga estes passos de depuração:

{% stepper %}
{% step %}
Verifique os logs.

* Logs fornecem insights valiosos sobre o que causou o travamento.
* Procure **mensagens de erro** relacionadas a essa ação.
  {% endstep %}

{% step %}
Revise o código que trata essa ação.

* Verifique **exceções não tratadas**, **respostas de API inválidas** ou **erros de banco de dados**.
* Garanta que o **tratamento de erro** adequado esteja em vigor.
  {% endstep %}

{% step %}
Monitore o uso de recursos.

* Algumas ações **requerem mais RAM** (ex. tocar música, processar imagens).
* Se a ação for intensiva em recursos, **considere aumentar a alocação de RAM**.
  {% endstep %}
  {% endstepper %}

***

## 🎵 **Exemplos Comuns (Aplicações Discord)**

{% hint style="info" %}

#### **Bots de Música**

Se o bot **encerra ao tocar música**, pode ser devido a:\
✔ **Uso alto de RAM** → Otimize processamento de áudio.\
✔ **`ffmpeg` ausente** → Adicione `ffmpeg` nas dependências [`APT`](/configurations/discloud.config/apt).\
✔ **Limites de taxa de API** → Verifique se está atingindo limites com o provedor de música.
{% endhint %}

{% hint style="info" %}

#### **Bots de Geração de Imagens**

* **Gerar imagens consome memória**.
* Garanta que seu bot tenha **RAM suficiente** e otimize o código de processamento de imagens.
  {% endhint %}

***

## 🛰️ **Verifique o Status da Discloud**

Se nenhuma das soluções acima resolver o problema, verifique a página de status da Discloud ou o canal Discord para quaisquer problemas relatados em todo o sistema. Problemas temporários de infraestrutura podem impactar a disponibilidade da sua aplicação.

* [**Página de Status da Discloud**](https://status.discloud.app/)
* [**Canal Discord da Discloud**](https://discord.com/channels/584490943034425391/694744729731989605)


# Doações

Faça upgrade ou contribua para apoiar a sustentabilidade da plataforma e acessar níveis de recursos mais altos.

## 🧾 Visão Geral

A Discloud oferece planos pagos que expandem limites de recursos (memória, alocação de CPU), desbloqueiam hospedagem de sites / APIs com subdomínios personalizados ou fornecidos, habilitam colaboração em equipe, integração com Git e mais. Escolher um plano também financia infraestrutura e desenvolvimento contínuo.

{% hint style="info" %}
Se você só precisa gerenciar (cancelar / reativar) uma assinatura existente, veja: [Gerenciamento de Assinatura](/faq/general-questions/subscription-management)
{% endhint %}

***

## 💎 Por Que Fazer Upgrade

| Benefício                | Plano Gratuito                       | Planos Pagos                  |
| ------------------------ | ------------------------------------ | ----------------------------- |
| Espaço de Memória & CPU  | Limitado                             | Aumentado por nível           |
| Uptime persistente       | Limites de inatividade podem aplicar | Maior estabilidade            |
| Hospedagem de Site / API | Restrita                             | Habilitada (depende do plano) |
| Domínio Personalizado    | Requer plano superior                | Incluído (níveis elegíveis)   |
| Acesso à equipe          | Não disponível                       | Suportado                     |
| Integração com Git       | Limitada / nenhuma                   | Habilitada                    |

***

## 💳 Métodos de Pagamento

Dois canais de aquisição estão atualmente disponíveis.

| Método           | Disponível Via                                                                                                                       |
| ---------------- | ------------------------------------------------------------------------------------------------------------------------------------ |
| Stripe           | <ul class="contains-task-list"><li><input type="checkbox" checked>Website</li><li><input type="checkbox">Ticket de Suporte</li></ul> |
| PayPal / Revolut | <ul class="contains-task-list"><li><input type="checkbox">Website</li><li><input type="checkbox" checked>Ticket de Suporte</li></ul> |

{% hint style="warning" %}
Use um ticket apenas se o fluxo de pagamento do site estiver indisponível ou seu método suportado preferido falhar.
{% endhint %}

***

## 🛒 Compra (Website)

{% stepper %}
{% step %}
Visite: <https://discloud.com/plans>
{% endstep %}

{% step %}
Selecione o nível desejado e prossiga para o checkout (fluxo hospedado pelo Stripe).
{% endstep %}

{% step %}
Complete o pagamento. Seu plano é ativado logo após a confirmação.
{% endstep %}
{% endstepper %}

<figure><img src="/files/64RlukMdpt0xacdwLfAY" alt="Captura de tela da página de planos"><figcaption><p>Interface de seleção de plano.</p></figcaption></figure>

***

## 🎫 Compra (Ticket de Suporte)

Use este caminho apenas para PayPal ou quando encontrar problemas de pagamento.

{% stepper %}
{% step %}
Abra um [ticket de suporte](https://discord.com/channels/@me/930852077045940224/) ([servidor Discord](https://discord.discloudbot.com/)).
{% endstep %}

{% step %}
Especifique o nível do plano e o método de pagamento (ex. PayPal).
{% endstep %}

{% step %}
Siga as instruções fornecidas pela equipe de suporte para completar o pagamento.
{% endstep %}
{% endstepper %}

{% hint style="info" %}
Tickets são assíncronos; o tempo de resposta pode variar. Mantenha um ticket por solicitação para reduzir atrasos.
{% endhint %}

***

## 🙌 Apoiar Sem Fazer Upgrade

Se você não pode fazer upgrade, mas ainda quer ajudar:

| Método            | Descrição                                 |
| ----------------- | ----------------------------------------- |
| Feedback          | Relate bugs, sugira melhorias             |
| Documentação      | Contribua com esclarecimentos ou exemplos |
| Ajuda Comunitária | Ajude usuários no Discord                 |


