<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Gabriel Brocco de Oliveira</title>
    <description>The latest articles on DEV Community by Gabriel Brocco de Oliveira (@gaabrielbrocco).</description>
    <link>https://dev.to/gaabrielbrocco</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2093232%2Fd72fcc79-c96a-4a90-8718-32a3fcca9394.png</url>
      <title>DEV Community: Gabriel Brocco de Oliveira</title>
      <link>https://dev.to/gaabrielbrocco</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/gaabrielbrocco"/>
    <language>en</language>
    <item>
      <title>Como configurar deploy automático da sua API (GO) + Postgres com Docker via GitHub Actions e SSH</title>
      <dc:creator>Gabriel Brocco de Oliveira</dc:creator>
      <pubDate>Fri, 30 May 2025 13:24:28 +0000</pubDate>
      <link>https://dev.to/gaabrielbrocco/como-configurar-deploy-automatico-da-sua-api-go-postgres-com-docker-via-github-actions-e-ssh-5a61</link>
      <guid>https://dev.to/gaabrielbrocco/como-configurar-deploy-automatico-da-sua-api-go-postgres-com-docker-via-github-actions-e-ssh-5a61</guid>
      <description>&lt;p&gt;Nesta publicação, vou te mostrar passo a passo como estruturar seu projeto em Go, configurar o deploy automático com GitHub Actions e subir sua API — utilizando Docker. Ao final, você terá tudo rodando em um servidor remoto via SSH e realizando o deploy de forma automatizada.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Arquitetura do projeto
&lt;/h2&gt;

&lt;p&gt;O projeto utilizado como exemplo é um CRUD simples de usuários, bancos e contas bancárias. Porém estruturado utilizando o padrão de arquitetura Ports and Adapters, também conhecido como Arquitetura Hexagonal.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.github/
├── workflows/
│   └── deploy.yml
cmd/
├── config/
│   └── database/
│       └── migrations/
└── main.go
internal/
├── core/
│   ├── domain/
│   │   ├── banco.go
│   │   ├── conta.go
│   │   └── usuario.go
│   ├── dto/
│   │   ├── banco.go
│   │   ├── conta.go
│   │   └── usuario.go
│   └── usecase/
│       ├── banco.go
│       ├── conta.go
│       └── usuario.go
├── infra/
│   ├── controller/
│   │   ├── banco.go
│   │   ├── conta.go
│   │   └── usuario.go
│   ├── repository/
│   │   ├── banco.go
│   │   ├── conta.go
│   │   └── usuario.go
│   └── server/
│       └── server.go
pkg/
└── di/
├── banco.go
├── conta.go
└── usuario.go
.env
.env-example
.gitignore
docker-compose.yml
Dockerfile
go.mod
go.sum
README.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Dockerfile:&lt;/strong&gt; este arquivo cria a imagem Docker da nossa API escrita em Go. Ele utiliza uma imagem base (Golang + Alpine), instala as dependências do projeto, compila o código-fonte em um executável e define os comandos para iniciar a aplicação automaticamente quando o contêiner for iniciado.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;./Dockerfile&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; golang:1.24.2-alpine&lt;/span&gt;

&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="s"&gt; /app&lt;/span&gt;

&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; go.mod go.sum ./&lt;/span&gt;

&lt;span class="k"&gt;RUN &lt;/span&gt;go mod download

&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; . .&lt;/span&gt;

&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="s"&gt; /app/cmd&lt;/span&gt;

&lt;span class="k"&gt;RUN &lt;/span&gt;go build &lt;span class="nt"&gt;-o&lt;/span&gt; main .

&lt;span class="k"&gt;EXPOSE&lt;/span&gt;&lt;span class="s"&gt; 8080&lt;/span&gt;

&lt;span class="k"&gt;CMD&lt;/span&gt;&lt;span class="s"&gt; ["./main"]&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;docker-compose.yml:&lt;/strong&gt; Define dois serviços principais que rodam em seus próprios contêineres Docker: api (nossa aplicação Go) e db (o banco de dados PostgreSQL). Ele configura a comunicação entre eles, garante que o banco de dados esteja totalmente operacional antes de iniciar a API, expõe as portas necessárias e gerencia as credenciais e dados de forma eficiente.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;./docker-compose.yml&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;3.8'&lt;/span&gt;

&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;api&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;.&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;8080:8080"&lt;/span&gt;
    &lt;span class="na"&gt;depends_on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;db&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;condition&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;service_healthy&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;DB_HOST=db&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;DB_PORT=5432&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;DB_USER=postgres&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;DB_PASSWORD=${DB_PASSWORD}&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;DB_NAME=banco&lt;/span&gt;
    &lt;span class="na"&gt;env_file&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;.env&lt;/span&gt; 

  &lt;span class="na"&gt;db&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;postgres:16-alpine&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;5432:5432"&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;POSTGRES_USER=postgres&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;POSTGRES_PASSWORD=${DB_PASSWORD}&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;POSTGRES_DB=banco&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;postgres_data:/var/lib/postgresql/data&lt;/span&gt;
    &lt;span class="na"&gt;healthcheck&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;test&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;CMD-SHELL"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;pg_isready&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;-U&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;postgres"&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
      &lt;span class="na"&gt;interval&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;10s&lt;/span&gt;
      &lt;span class="na"&gt;timeout&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;5s&lt;/span&gt;
      &lt;span class="na"&gt;retries&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;5&lt;/span&gt;
    &lt;span class="na"&gt;env_file&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;.env&lt;/span&gt; 

&lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;postgres_data&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  2. Configurando o GitHub Secrets
&lt;/h2&gt;

&lt;p&gt;No repositório do GitHub, clique em &lt;strong&gt;Settings&lt;/strong&gt; &amp;gt; &lt;strong&gt;Secrets and variables&lt;/strong&gt; &amp;gt; &lt;strong&gt;Actions&lt;/strong&gt; &amp;gt; &lt;strong&gt;New repository secret&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Adicione uma SECRET para cada variável abaixo:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;ENV&lt;/code&gt; → Variáveis do seu .env que não serão expostas&lt;br&gt;
&lt;code&gt;SSH_HOST&lt;/code&gt; → IP ou domínio do seu servidor&lt;br&gt;
&lt;code&gt;SSH_USER&lt;/code&gt; → Usuário SSH no servidor (ex: ubuntu)&lt;br&gt;
&lt;code&gt;SSH_PRIVATE_KEY&lt;/code&gt; → Conteúdo da chave privada SSH (sem senha)&lt;/p&gt;
&lt;h2&gt;
  
  
  3. Workflow GitHub Actions para deploy automático
&lt;/h2&gt;

&lt;p&gt;O workflow a seguir realiza os seguintes passos:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Clona o repositório&lt;/strong&gt; com o código mais recente da branch &lt;code&gt;master&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cria o arquivo &lt;code&gt;.env&lt;/code&gt;&lt;/strong&gt; dinamicamente, utilizando as variáveis sensíveis armazenadas nos &lt;em&gt;Secrets&lt;/em&gt; do GitHub (como senhas e configurações de banco).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Constrói a imagem Docker&lt;/strong&gt; da aplicação, passando as variáveis do &lt;code&gt;.env&lt;/code&gt; como argumentos de build (&lt;code&gt;--build-arg&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Salva a imagem como um arquivo &lt;code&gt;.tar&lt;/code&gt;&lt;/strong&gt;, o que permite transportá-la para o servidor.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Envia a imagem Docker para o servidor remoto&lt;/strong&gt; via SCP.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Acessa o servidor via SSH&lt;/strong&gt;, carrega a imagem Docker, remove o container antigo (caso exista), e &lt;strong&gt;sobe um novo container com a versão atualizada da API&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;deploy.yml:&lt;/strong&gt; Automatiza a entrega contínua da nossa API Go. Ele serve para garantir que cada nova versão da aplicação seja automaticamente compilada, empacotada em um contêiner Docker e implantada em nosso servidor, minimizando erros manuais e agilizando o ciclo de desenvolvimento.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;.github/workflows/deploy.yml&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Build and Deploy Go API via SSH&lt;/span&gt;

&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;push&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;branches&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;master&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;build-and-deploy&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;

    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Checkout do repositório&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v3&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Criar o arquivo .env com os valores do secret&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
          &lt;span class="s"&gt;echo "${{ secrets.ENV }}" &amp;gt; .env&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Construir a imagem Docker&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
          &lt;span class="s"&gt;export $(grep -v '^#' .env | xargs) &lt;/span&gt;

          &lt;span class="s"&gt;docker build \&lt;/span&gt;
            &lt;span class="s"&gt;--build-arg DB_PASSWORD=$DB_PASSWORD \&lt;/span&gt;
            &lt;span class="s"&gt;--build-arg DB_PORT=$DB_PORT \&lt;/span&gt;
            &lt;span class="s"&gt;--build-arg DB_SSL_MODE=$DB_SSL_MODE \&lt;/span&gt;
            &lt;span class="s"&gt;-t go-api-banco:latest .&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Salvar imagem como .tar&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;docker save -o go-api-banco.tar go-api-banco:latest&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Enviar imagem para o servidor via SCP&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;appleboy/scp-action@master&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;host&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.SSH_HOST }}&lt;/span&gt;
          &lt;span class="na"&gt;username&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.SSH_USER }}&lt;/span&gt;
          &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.SSH_PRIVATE_KEY }}&lt;/span&gt;
          &lt;span class="na"&gt;source&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;go-api-banco.tar"&lt;/span&gt;
          &lt;span class="na"&gt;target&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;~/"&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Fazer deploy da imagem via SSH&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;appleboy/ssh-action@master&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;host&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.SSH_HOST }}&lt;/span&gt;
          &lt;span class="na"&gt;username&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.SSH_USER }}&lt;/span&gt;
          &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.SSH_PRIVATE_KEY }}&lt;/span&gt;
          &lt;span class="na"&gt;script&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
            &lt;span class="s"&gt;docker load -i ~/go-api-banco.tar&lt;/span&gt;
            &lt;span class="s"&gt;docker stop go-api-banco || true&lt;/span&gt;
            &lt;span class="s"&gt;docker rm go-api-banco || true&lt;/span&gt;
            &lt;span class="s"&gt;docker run -d --name go-api-banco -p 8080:8080 go-api-banco:latest&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  4. Configurando o servidor remoto
&lt;/h2&gt;

&lt;p&gt;No seu servidor (exemplo Ubuntu):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Instale o Docker&lt;/li&gt;
&lt;li&gt;Garanta que seu usuário SSH tenha permissão para rodar Docker (geralmente adicionado ao grupo docker)&lt;/li&gt;
&lt;li&gt;Configure sua chave pública SSH no ~/.ssh/authorized_keys do usuário&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  5. Testando o Deploy
&lt;/h2&gt;

&lt;p&gt;Após fazer o push para o branch &lt;code&gt;master&lt;/code&gt;, o GitHub Actions irá iniciar o processo de deploy.&lt;/p&gt;

&lt;p&gt;Para verificar se tudo ocorreu como esperado:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Acesse o GitHub → seu repositório → &lt;strong&gt;Actions&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Veja se o workflow &lt;strong&gt;“Build and Deploy Go API via SSH”&lt;/strong&gt; foi executado com sucesso&lt;/li&gt;
&lt;li&gt;Acesse seu servidor no navegador: &lt;code&gt;http://&amp;lt;IP_DO_SERVIDOR&amp;gt;:8080&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Sua API Go estará rodando 🎉&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  6. O que você ganha com essa automação?
&lt;/h2&gt;

&lt;p&gt;Ao automatizar o processo de deploy, você transforma algo que poderia levar vários minutos (ou até horas) em um fluxo confiável de poucos cliques ou um simples git push.&lt;/p&gt;

&lt;p&gt;Essa integração entre GitHub Actions, Docker e seu servidor remoto &lt;strong&gt;garante&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Segurança:&lt;/strong&gt; nenhuma senha ou dado sensível é exposto — tudo é gerenciado via GitHub Secrets.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Consistência:&lt;/strong&gt; o mesmo ambiente é reproduzido em cada deploy, reduzindo erros por diferenças de ambiente.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Velocidade:&lt;/strong&gt; o deploy leva apenas alguns minutos e requer zero intervenção manual.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rastreabilidade:&lt;/strong&gt; cada execução fica registrada nos Actions do GitHub, permitindo rastrear mudanças e reverter se necessário.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;Com isso, você tem uma pipeline de deploy automatizada, segura e baseada em tecnologias sólidas como Go, Docker, PostgreSQL e GitHub Actions.&lt;/p&gt;

&lt;p&gt;Esse processo elimina deploys manuais, acelera o desenvolvimento e garante que sua API esteja sempre atualizada no servidor.&lt;/p&gt;

</description>
      <category>go</category>
      <category>docker</category>
      <category>githubactions</category>
      <category>ssh</category>
    </item>
  </channel>
</rss>
