Introducción: por qué desplegar una aplicación Go en VPS es simple y confiable
Go (Golang) es uno de los lenguajes más eficientes para crear aplicaciones de servidor. Su principal ventaja es la compilación en un único binario estático que no requiere la instalación de un intérprete o máquina virtual en el servidor. Esto hace que el despliegue de una aplicación Go en VPS (Virtual Private Server) sea increíblemente simple y rápido en comparación con Python, Node.js o Java.
En este artículo, desplegaremos paso a paso una aplicación Go en VPS: desde la configuración inicial del servidor hasta la ejecución a través de systemd y la publicación mediante Nginx con HTTPS. Aprenderá cómo minimizar los riesgos y garantizar el funcionamiento estable de su servicio 24/7.
1. Preparación del VPS e instalación del software necesario
Antes de comenzar el despliegue, asegúrese de tener acceso al VPS (por ejemplo, Ubuntu 22.04 LTS) por SSH. Usaremos un conjunto básico de herramientas.
1.1. Configuración inicial del servidor
Conéctese al servidor y ejecute la actualización de paquetes:
ssh root@su-ip-del-servidorapt update && apt upgrade -yCree un usuario separado para la aplicación (no trabaje como root):
adduser deployerusermod -aG sudo deployersu - deployer1.2. Instalación de Go (si necesita compilar en el servidor)
Aunque la mayoría de las veces el binario se compila localmente, a veces es conveniente compilar directamente en el VPS. Instale la última versión de Go:
wget https://go.dev/dl/go1.22.2.linux-amd64.tar.gzsudo tar -C /usr/local -xzf go1.22.2.linux-amd64.tar.gzecho 'export PATH=$PATH:/usr/local/go/bin' >> ~/.bashrcsource ~/.bashrcgo version1.3. Instalación de Git y Nginx
Git será necesario para clonar el repositorio, y Nginx para el proxy inverso y SSL:
sudo apt install git nginx -y2. Compilación de la aplicación Go y preparación para el despliegue
2.1. Ejemplo de una aplicación Go simple
Crearemos un servidor HTTP mínimo en Go. Puede usar su propio proyecto, pero para la demostración servirá este código (main.go):
package main
import ( "fmt" "net/http" "os")
func main() { port := os.Getenv("PORT") if port == "" { port = "8080" }
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "Hello from Go! Server time: %s", time.Now().Format(time.RFC1123)) })
fmt.Printf("Server starting on port %s", port) http.ListenAndServe(":"+port, nil)}2.2. Compilación del binario para Linux
En su máquina local (o en el servidor), compile el binario para la arquitectura objetivo del VPS (generalmente amd64):
GOOS=linux GOARCH=amd64 go build -o myapp main.goVerifique que el binario sea estático y no requiera bibliotecas:
ldd myapp # Debe mostrar "not a dynamic executable"2.3. Carga al servidor
Copie el binario al VPS mediante SCP:
scp myapp deployer@su-ip-del-servidor:/home/deployer/En el servidor, muévalo a un directorio adecuado y otorgue permisos de ejecución:
sudo mkdir -p /opt/myappsudo mv /home/deployer/myapp /opt/myapp/sudo chmod +x /opt/myapp/myapp3. Configuración de systemd para inicio automático y monitoreo
systemd es el administrador de servicios estándar en Linux. Permitirá que su aplicación se inicie al arrancar el sistema y se reinicie automáticamente en caso de fallos.
3.1. Creación del archivo unit
Cree el archivo /etc/systemd/system/myapp.service:
sudo nano /etc/systemd/system/myapp.serviceInserte la siguiente configuración:
[Unit]Description=My Go ApplicationAfter=network.target
[Service]Type=simpleUser=deployerGroup=deployerWorkingDirectory=/opt/myappExecStart=/opt/myapp/myappRestart=alwaysRestartSec=5Environment=PORT=80