> ## Documentation Index
> Fetch the complete documentation index at: https://docs.squarecloud.app/llms.txt
> Use this file to discover all available pages before exploring further.

# SDK Go: gerenciar aplicações

> Obtenha, inspecione e controle suas aplicações com o SDK Go: detalhes, status, iniciar, parar, reiniciar, logs, métricas, domínios, load balancers e exclusão.

Todos os métodos desta página ficam em `c.Apps` e recebem o `ctx` primeiro e depois o id da aplicação. Um `appID` também pode ser o id composto `<appId>-<workspaceId>` de uma aplicação compartilhada por meio de um [workspace](/pt-br/sdks/go/workspaces).

Cada trecho abaixo roda sozinho dentro deste programa: cole um de cada vez em `main` e execute o `goimports` (veja [Executando os exemplos](/pt-br/sdks/go/client#executando-os-exemplos)).

```go theme={"system"}
package main

import (
	"context"
	"os"

	"github.com/squarecloudofc/sdk-api-go/v3"
)

var (
	ctx   = context.Background()
	c     = squarecloud.New(os.Getenv("SQUARECLOUD_API_KEY"))
	appID = "abc123def456abc123def456"
)

func main() {
	// Paste one snippet here, then run goimports.
}
```

Para listar suas aplicações, use [`c.Account.Me`](/pt-br/sdks/go/client#conta): seu slice `Applications` contém todas as aplicações que a chave pode ver.

## Obtendo uma aplicação

```go theme={"system"}
app, err := c.Apps.Get(ctx, appID)
if err != nil {
	log.Fatal(err)
}

fmt.Println(app.ID, app.Name, app.Language, app.RAM, app.Cluster, app.CreatedAt)
```

| Campo | Tipo | Descrição |
| - | - | - |
| `ID` (`id`) | `string` | Id da aplicação |
| `Name` (`name`) | `string` | Nome de exibição |
| `Description` (`desc`) | `string` | Descrição, `""` quando não definida |
| `Owner` (`owner`) | `string` | Id do usuário dono |
| `Cluster` (`cluster`) | `string` | Cluster em que a aplicação roda |
| `RAM` (`ram`) | `int` | RAM alocada em MB |
| `Language` (`language`) | `string` | Linguagem do runtime |
| `Domain` (`domain`) | `*string` | Host padrão `<subdomain>.squareweb.app`; `nil` para aplicações que não são web |
| `Custom` (`custom`) | `*string` | Domínio personalizado; `nil` quando nenhum está configurado |
| `CreatedAt` (`created_at`) | `time.Time` | Data de criação |

## Status

`Status(ctx, appID)` retorna o estado ao vivo com valores **formatados**:

```go theme={"system"}
status, err := c.Apps.Status(ctx, appID)
if err != nil {
	log.Fatal(err)
}

fmt.Println(status.Status)  // e.g. "running", "exited"
fmt.Println(status.Running) // true
fmt.Println(status.CPU)     // "0.5%"
fmt.Println(status.RAM)     // "120.4MB" (RAM in use)
fmt.Println(status.Storage, status.Network.Total, status.Network.Now)
if status.Uptime != nil {
	fmt.Println(*status.Uptime) // Unix ms of the last start; nil when stopped
}
```

`StatusRaw(ctx, appID)` retorna **números** em vez disso (`CPU` em %, `RAM` em MB, `Storage` em bytes, `Network.Total` e `Network.Now` como pares de bytes `[in, out]`):

```go theme={"system"}
raw, err := c.Apps.StatusRaw(ctx, appID)
if err != nil {
	log.Fatal(err)
}

fmt.Println(raw.CPU, raw.RAM, raw.Network.Total) // 0.5 120.4 [1024 2048]
```

<Note>
  `Uptime` é um **timestamp** (quando a aplicação iniciou), não uma duração. Use `time.Since(time.UnixMilli(*status.Uptime))` para saber há quanto tempo ela está no ar.
</Note>

### Status de todas as aplicações

`StatusAll(ctx, workspaceID)` retorna um resumo por aplicação que a chave pode ver, em uma única requisição. Passe `""` para todas as aplicações, ou o id de um workspace para ver só as aplicações desse [workspace](/pt-br/sdks/go/workspaces#atuando-sobre-uma-aplicação-compartilhada). `CPU` e `RAM` só são preenchidos (não `""`) enquanto a aplicação está rodando.

```go theme={"system"}
items, err := c.Apps.StatusAll(ctx, "")
if err != nil {
	log.Fatal(err)
}
for _, it := range items {
	if it.Running {
		fmt.Println(it.ID, it.CPU, it.RAM)
	} else {
		fmt.Println(it.ID, "stopped")
	}
}
```

## Iniciar, parar e reiniciar

```go theme={"system"}
if err := c.Apps.Start(ctx, appID); err != nil {
	log.Fatal(err)
}
if err := c.Apps.Stop(ctx, appID); err != nil {
	log.Fatal(err)
}
if err := c.Apps.Restart(ctx, appID); err != nil {
	log.Fatal(err)
}
```

O servidor mantém essas chamadas abertas até o container agir, então, sem um prazo no `ctx`, elas esperam pelo menos 2 minutos antes de expirar. Quando a plataforma recusa a ação, a chamada retorna um `*APIError` com status **409**, um `Code` e uma `Message` **vazia**:

| Código | Significado |
| - | - |
| `CONTAINER_ALREADY_STARTED` | `start` em uma aplicação em execução |
| `CONTAINER_ALREADY_STOPPED` | `stop` em uma aplicação parada |
| `CONTAINER_TEMPORARILY_SUSPENDED` | A aplicação está suspensa |
| `CONTAINER_NOT_FOUND` | O container não existe no cluster |
| `CONTAINER_INSUFFICIENT_DISK_SPACE` | Não há disco suficiente para iniciar |
| `CONTAINER_NETWORK_CONFLICT` | Conflito de rede no cluster |
| `ACTION_FAILED` | O cluster não conseguiu executar a ação |

"Já iniciada" e "já parada" também são erros. Se para você eles significam sucesso, trate-os:

```go theme={"system"}
err := c.Apps.Start(ctx, appID)

var apiErr *squarecloud.APIError
if err != nil && !(errors.As(err, &apiErr) && apiErr.Code == squarecloud.CodeContainerAlreadyStarted) {
	log.Fatal(err)
}
```

## Logs

`Logs(ctx, appID)` retorna a saída mais recente do console como uma única string (`""` quando não há nenhuma).

```go theme={"system"}
logs, err := c.Apps.Logs(ctx, appID)
if err != nil {
	log.Fatal(err)
}
fmt.Println(logs)
```

Para um stream de logs ao vivo, use [Tempo real](/pt-br/sdks/go/realtime).

## Métricas

`Metrics(ctx, appID)` retorna as últimas 24 horas, um ponto a cada 5 minutos, **do mais recente para o mais antigo**.

```go theme={"system"}
points, err := c.Apps.Metrics(ctx, appID)
if err != nil {
	log.Fatal(err)
}
if len(points) > 0 {
	latest := points[0]
	fmt.Println(latest.Date, latest.CPU, latest.RAM, latest.Net)
}
```

## Domínios e load balancers

`Domains(ctx)` lista os hostnames padrão e personalizados de todas as aplicações. `LoadBalancers(ctx)` lista os domínios compartilhados por várias aplicações, com o limite do seu plano.

```go theme={"system"}
domains, err := c.Apps.Domains(ctx)
if err != nil {
	log.Fatal(err)
}
for _, d := range domains {
	fmt.Println(d.AppID, d.Hostname, d.Type) // Type: "subdomain" | "custom"
}

lb, err := c.Apps.LoadBalancers(ctx)
if err != nil {
	log.Fatal(err)
}
fmt.Println(lb.Limit)
for _, balancer := range lb.Balancers {
	ids := make([]string, 0, len(balancer.Apps))
	for _, app := range balancer.Apps {
		ids = append(ids, app.ID)
	}
	fmt.Println(balancer.Hostname, ids)
}
```

Para configurar um domínio personalizado, veja [Rede](/pt-br/sdks/go/network#domínio-personalizado).

## Excluindo uma aplicação

```go theme={"system"}
if err := c.Apps.Delete(ctx, appID); err != nil {
	log.Fatal(err)
}
```

<Warning>
  A exclusão é permanente. Crie um [snapshot](/pt-br/sdks/go/snapshots) antes, caso você possa precisar dos arquivos novamente.
</Warning>

## Próximos passos

<CardGroup cols={3}>
  <Card title="Commit e upload" icon="upload" href="/pt-br/sdks/go/commit_and_upload">
    Crie uma aplicação a partir de um zip ou envie arquivos para uma existente.
  </Card>

  <Card title="Referência da API de aplicações" icon="code" href="/pt-br/api-reference/endpoint/apps/info">
    Os endpoints REST por trás destes métodos.
  </Card>

  <Card title="Aplicações pela CLI" icon="terminal" href="/pt-br/cli-reference/apps">
    As mesmas ações pelo terminal.
  </Card>
</CardGroup>


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.