Introducción: por qué Go y VPS son la pareja ideal para tu proyecto
\n\nGo (Golang) es un lenguaje compilado, creado para el rendimiento y la simplicidad. Su principal ventaja en el despliegue es la compilación estática. No necesitas instalar un intérprete o una máquina virtual en el servidor. Simplemente cargas un único archivo binario y lo ejecutas. Esto hace que el despliegue de una aplicación Go en VPS sea increíblemente rápido y confiable.
\n\nEn esta guía, recorreremos el camino completo: desde escribir un servidor HTTP simple en Go hasta ejecutarlo en un servidor VPS real con Ubuntu 22.04. Configuraremos systemd para el inicio automático, Nginx como proxy inverso y Let's Encrypt para HTTPS. Todos los ejemplos de código están listos para usar.
\n\n1. Preparación del VPS y escritura de la aplicación Go
\n\n1.1. Configuración inicial del servidor
\n\nDespués de comprar un VPS (por ejemplo, en DigitalOcean, Timeweb o Hetzner), conéctate por SSH:
\n\nssh root@tu_IP_del_servidor\n\nRealiza la configuración básica de seguridad:
\n\napt update && apt upgrade -y\nadduser deployer\nusermod -aG sudo deployer\n# Deshabilitar el inicio de sesión de root en /etc/ssh/sshd_config\n# PermitRootLogin no\nsystemctl restart sshd\n\nAsegúrate de que los puertos 80 y 443 estén abiertos en el firewall (UFW):
\n\nufw allow 22\nufw allow 80\nufw allow 443\nufw enable\n\n1.2. Aplicación Go simple para el despliegue
\n\nCrea en tu máquina local el archivo main.go:
package main\n\nimport (\n\t"fmt"\n\t"log"\n\t"net/http"\n\t"os"\n)\n\nfunc main() {\n\tport := os.Getenv("PORT")\n\tif port == "" {\n\t\tport = "8080"\n\t}\n\n\thttp.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {\n\t\tfmt.Fprintf(w, "¡Hola desde Go! El servidor funciona en el puerto %s", port)\n\t})\n\n\thttp.HandleFunc("/health", func(w http.ResponseWriter, r *http.Request) {\n\t\tw.WriteHeader(http.StatusOK)\n\t\tw.Write([]byte("OK"))\n\t})\n\n\tlog.Printf("Iniciando servidor en :%s", port)\n\tlog.Fatal(http.ListenAndServe(":"+port, nil))\n}\n\nVerifica localmente:
\n\ngo run main.go\n\nAbre el navegador en http://localhost:8080. Si ves el saludo, todo funciona.
2. Compilación y carga del binario al servidor
\n\n2.1. Compilación cruzada para Linux
\n\nEn tu máquina local (incluso si tienes Windows o macOS), ejecuta:
\n\nGOOS=linux GOARCH=amd64 go build -o myapp main.go\n\nLa bandera -o myapp establece el nombre del archivo de salida. Las variables de entorno GOOS y GOARCH indican la arquitectura de destino (Linux de 64 bits).
Después de la compilación, tendrás un archivo binario myapp de aproximadamente 10-15 MB.
2.2. Carga al VPS
\n\nUsa scp para copiar el archivo:
scp myapp deployer@tu_IP_del_servidor:/home/deployer/myapp\n\nO, si usas rsync:
\n\nrsync -avz myapp deployer@tu_IP_del_servidor:/home/deployer/myapp\n\nEn el servidor, mueve el binario a un directorio del sistema y hazlo ejecutable:
\n\nsudo mv /home/deployer/myapp /usr/local/bin/myapp\nsudo chmod +x /usr/local/bin/myapp\n\n3. Configuración de systemd y arranque automático
\n\n3.1. Creación del archivo de servicio
\n\nSystemd gestionará nuestra aplicación: la iniciará al arrancar el sistema, la reiniciará si falla y recopilará los registros.
\n\nCrea el archivo /etc/systemd/system/myapp.service:
sudo nano /etc/systemd/system/myapp.service\n\nInserta la siguiente configuración:
\n\n[Unit]\nDescription=Servidor de Aplicación Go\nAfter=network.target\n\n[Service]\nType=simple\nUser=deployer\nGroup=deployer\nWorkingDirectory=/usr/local/bin\nExecStart=/usr/local/bin/myapp\nRestart=always\nRestartSec=5\nEnvironment=PORT=8080\nEnvironment=GIN_MO