Início Tecnologia Como implantar Go + Templ + HTMX + Tailwindcss na produção

Como implantar Go + Templ + HTMX + Tailwindcss na produção

12
0

Neste artigo, mostrarei como implantar a pilha Gotth (Go Templ Htmx Tailwind) para a produção.

Recentemente, criei meu próprio agregador de troca de criptomoedas chamado Cyphergoat; Ele encontra a melhor taxa para trocar sua criptografia de diferentes trocas parceiras.

Tem duas partes:

  1. Uma API que interage com as trocas. Escrito em Go e usa gin.

  2. A interface do usuário da web está escrita em Go e usa uma combinação de HTML, HTMX, Tailwindcss, CSS e JavaScript em modelos de templ. AKA The Gotth Stack. Ele interage com a API para encontrar taxas etc.

O que é extremamente legal com esta pilha e configuração é que somos capazes de produzir um único binário com tudo incluído para cada peça e enviá -la para o servidor. No lado da Webui, isso é possível, pois o HTML é compilado no código GO usando o Templ e depois enviado com o binário.

Neste artigo, vou passar pela minha configuração para facilitar a criação de algo assim.

Configurar

Estou usando um servidor Debian 12 que exporá meu aplicativo via CloudFlare Tunnels. Todos os arquivos estáticos estão sendo servidos via NGINX e os binários da API e do site são executados como serviços Systemd.

Neste guia, mostrarei como configurei isso.

A configuração

Eu tenho uma única pasta na minha máquina de desenvolvimento chamada Cyphergoat: ele contém:

api/
web/
builds/

A pasta API abriga o código -fonte da API. A web abriga o código fonte do site.

E a construção abriga todas as construções que são implantadas no servidor.

Tailwind

O primeiro desafio real vem com a configuração correta do TailWindcss.

No meu projeto da web, tenho uma pasta estática especificamente para arquivos estáticos. Dentro dele, tenho dois arquivos:

/web
	styles.css
	tailwind.css

O styles.css simplesmente contém:

@import "tailwindcss";

O arquivo Tailwind.css é onde o Tailwind-Cli salvará suas coisas.

Para construir as coisas do Tailwind, eu simplesmente corro:

npx @tailwindcss/cli -i ./static/styles.css -o ./static/tailwind.css --watch

(Supondo que você tenha instalado o Tailwind-Cli)

No meu arquivo header.templ (o cabeçalho de todas as páginas), no topo que eu tenho:




E os arquivos estão sendo servidos usando o e.stático do Echo (no meu arquivo main.go).

func main(){
e := echo.New()

e.Use(middleware.Logger())
e.Use(middleware.Recover())
e.Use(middleware.Secure())


e.Static("/static", "static") // Serves content from static folder.

// Rest of the handlers
}

Servidor

No lado do meu servidor, tenho um Debian 12 VM em execução no Proxmox.

No diretório inicial dos meus usuários, tenho uma pasta com o seguinte conteúdo:

cyphergoat/
├── api
├── static/
└── web

A pasta estática contém todos os arquivos estáticos (incluindo Tailwind.css e styles.css), e o web e API são os binários.

Eu tenho então dois serviços do SystemD para esses executáveis:

O cg-api.service /etc/systemd/system/cg-api.service

[Unit]
Description=CypherGoat API
After=network.target

[Service]
User=arkal
Group=www-data
WorkingDirectory=/home/arkal/cyphergoat
ExecStart=/home/arkal/cyphergoat/api
Restart=always
RestartSec=1

[Install]
WantedBy=multi-user.target

E cg-web.service /etc/systemd/system/cg-web.service

[Unit]
Description=CypherGoat Web
After=network.target

[Service]
User=arkal
Group=www-data
WorkingDirectory=/home/arkal/cyphergoat
ExecStart=/home/arkal/cyphergoat/web


[Install]
WantedBy=multi-user.target

Ambos são de propriedade do grupo www-data (Provavelmente não é necessário para a API) para facilitar o atendimento via Nginx.

Nginx

O site está se comunicando com a API, mas ainda preciso tornar o Web-UI acessível.

Eu configurei um site nginx com a seguinte configuração: /etc/nginx/sites-available/cg

server {
    server_name cyphergoat.com;

    location / {
        proxy_pass 
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

    location /static/ {
        alias /var/www/static/;
        expires 30d;
    }
    
    # Optional robots.txt
    location = /robots.txt {
        root /var/www/static;
        access_log off;
        log_not_found off;
    }

    listen 80;
}

Também configurei o CERTBOT para ter um certificado SSL.

Você pode definir o CertBot em execução:

sudo apt install certbot python3-certbot-nginx -y

Gerar o certificado SSL:

sudo certbot --nginx -d cyphergoat.com

Leia o seu próprio site para hospedar seu próprio site para uma configuração NGINX mais aprofundada.

Túneis Cloudflare

Atualmente, estou tornando meu site acessível usando o Cloudflare Pages. É uma solução extremamente fácil de usar.

Para fazer isso, você precisará de uma conta Cloudflare e um domínio apontado para o CloudFlare.

Primeiro, vá para o painel Zero Trust.

Sob Networks Clique em Tunnels, e então Create a tunnel.

Uma vez criado, você deveria Install and run a connector; Siga as instruções na página para sua configuração específica.

Depois que o conector estiver em execução, você deve clicar no Public Hostname guia e Add a public hostname.

Agora, você deve ver algo assim:

Preencha as informações como eu tenho. O tipo de serviço deve ser HTTPe o URL deve ser 127.0.0.1:80 ou localhost:80.

Obviamente, não há razão para tornar sua API acessível publicamente ao implantar seu site.

Implantação

Para implantar meus binários, fui em frente e criei um script rápido de bash:

cd api
go build -o ../builds/ .

cd ../web

templ generate && go build -o ../builds/web cmd/main.go

cd ..
rsync -urvP ./builds/ user@SERVER:/home/user/cyphergoat
rsync -urvP ./web/static user@SERVER:/home/user/cyphergoat/
rsync -urvP ./api/coins.json user@SERVER:/user/user/cyphergoat/

O script criará a API, gerará os arquivos Templ criam o Webui e enviará tudo para o meu servidor (incluindo a pasta estática).

Eu então ssh no meu servidor:

ssh user@ip

E reinicie os serviços.

sudo systemctl restart cg-api cg-web

E é isso.

Limitação de taxa simples em Go (Gin)

Como construir um encurtador de URL em Go

Como implantar o django para a produção

© 2025 4RKAL CC BY-SA

fonte