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:
Una API escrita en Go utilitzant el framework Gin per interactuar amb els intercanvis.
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.





