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:
-
Uma API que interage com as trocas. Escrito em Go e usa gin.
-
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 HTTP
e 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.
Artigos relacionados
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