Com desplegar Go amb Templ, HTMX i TailwindCSS

Descobreix com desplegar la pila GoTTH (Go, Templ, HTMX, Tailwind) en producció amb una configuració optimitzada que inclou Cloudflare Tunnels, Nginx i systemd per a una implementació eficient i segura.

domingo, 9 de marzo de 2025 • 3 min de lectura • Equip Q2BSTUDIO

Empresa-Software-Apps

En aquest article, et mostrarem com desplegar la pila GoTTH (Go, Templ, HTMX, Tailwind) en producció.

Recentment, vam desenvolupar una plataforma d'agregació per a l'intercanvi de criptomonedes que troba les millors taxes d'intercanvi entre diferents proveïdors associats.

El projecte consta de dues parts:

  1. Una API escrita en Go utilitzant el framework Gin per interactuar amb els intercanvis.

  2. Una interfície web desenvolupada en Go que empra HTML, HTMX, TailwindCSS, CSS i Javascript en plantilles Templ, cosa que conforma la pila GoTTH.

Un dels principals avantatges d'aquesta configuració és que podem generar un sol binari compilat amb tots els elements necessaris per a cada part del sistema i desplegar-lo fàcilment al servidor. En el cas de la interfície web, això és possible gràcies al fet que les plantilles HTML es converteixen en codi Go i s'integren al binari final.

En aquest article, detallem la nostra configuració per facilitar-ne la implementació.

Configuració del servidor

Utilitzem un servidor Debian 12 per allotjar la nostra aplicació, que s'exposa a través de Cloudflare Tunnels. Els fitxers estàtics són servits mitjançant Nginx i tant l'API com l'aplicació web s'executen com a serveis administrats per systemd.

L'estructura del projecte en l'entorn de desenvolupament és la següent:

api/
web/
builds/

El directori `api/` conté el codi font de l'API, `web/` alberga el codi font de la interfície web, i `builds/` emmagatzema els binaris llestos per al desplegament al servidor.

Configuració de Tailwind

Per gestionar TailwindCSS, disposem d'una carpeta `static/` dins del directori `web/`, on es troben dos fitxers:

/web/static/
    styles.css
    tailwind.css

El fitxer `styles.css` simplement importa TailwindCSS:

@import 'tailwindcss';

Mentre que `tailwind.css` és generat per TailwindCLI utilitzant la següent ordre:

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

Ambdós fitxers són referenciats a la plantilla HTML principal utilitzant:



Per servir aquests fitxers estàtics al servidor, utilitzem Echo al nostre `main.go`:

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

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

    e.Static('/static', 'static') // Servir contingut estàtic.

    // Resta de handlers
}

Configuració de serveis al servidor

Al servidor, tenim una estructura de carpetes similar a:

cyphergoat/
+-- api
+-- static/
+-- web

Els binaris `api` i `web` són gestionats per systemd mitjançant els següents serveis:

cg-api.service:

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

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

[Install]
WantedBy=multi-user.target

cg-web.service:

[Unit]
Description=Interfície Web de CypherGoat
After=network.target

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

[Install]
WantedBy=multi-user.target

Configuració de Nginx

Per servir la interfície d'usuari mitjançant Nginx, utilitzem la següent configuració:

server {
    server_name domini.com;

    location / {
        proxy_pass https://127.0.0.1:4200;
        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;
    }

    listen 80;
}

Per habilitar HTTPS, utilitzem Certbot amb:

sudo apt install certbot python3-certbot-nginx -y
sudo certbot --nginx -d domini.com

Desplegament

Per automatitzar la generació i trasllat dels binaris, vam crear un script bash:

cd api
go build -o ../builds/

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

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

Després, accedim al servidor i reiniciem els serveis:

ssh usuari@ip
sudo systemctl restart cg-api cg-web

A Q2BSTUDIO ens especialitzem en el desenvolupament i desplegament de solucions tecnològiques, oferint serveis a mida per implementar infraestructures eficients i escalables. Si estàs buscant experts en desenvolupament i desplegament d'aplicacions modernes, contacta'ns.

UNA PAUSA?

Juga una estona abans de marxar

ELS NOSTRES SERVEIS

Com et podem ajudar

Tens un projecte en ment?

Explica'ns la teva visió i la convertim en una solució de programari. Sigui quin sigui l'abast, fem realitat la teva idea.