En los últimos días he estado realizado la migración de mi viejo servidor a uno más nuevo y me tocó migrar Sublime POS 3. Quiero compartirte cómo montar el sistema programado con Go para que los usuarios puedan acceder y beneficiarse del certificado SSL de Let’s encrypt previamente configurado con Nginx.
Recuerda que Golang crea su propio servidor web, no necesita Nginx ni Apache para ejecutarse. Lo expuesto aquí te enseña a usar Nginx para no exponer directamente el servidor de Golang.
Sublime POS 3 sin Nginx
Antes de la migración, lo hacía así:
- Abría un puerto en mi servidor configurando el Firewall de ser necesario
- En Sublime POS 3 leía el certificado que tenía con Apache. Lo tenía que hacer con permisos de root
- Así ya podía acceder a mi sitio en el puerto 2106 con HTTPS. A esto le encontraba dos desventajas que son el riesgo de ejecutar el programa con root y el problema de estar reiniciando el servidor cada vez que el certificado se renovaba.
Usando proxy_pass de Nginx
Yo ya sabía que Nginx (y otros servidores incluyendo Apache) podían actuar como proxys y reenviar toda la información a un puerto local. La manera que yo usaba antes era la siguiente:
Cliente en navegador web -> Sublime POS 3 en puerto 2106 de mi navegador con HTTPS
Y no había ningún problema porque todo era totalmente seguro ya que tenía certificado, pero como lo mencioné arriba, esto presenta algunas desventajas. Con Nginx pude configurar así:
Cliente en navegador web -> Nginx en el puerto por defecto usando HTTPS -> Sublime POS 3 en localhost:2106 sin certificado
De este modo solamente me preocupaba por un certificado que era el de Nginx, no tenía que abrir mi firewall para el 2106 porque solo iba a escuchar de manera local y aunque SPOS3 no tiene certificado la información ya ha llegado segura al servidor a través de Nginx. Dicho con otras palabras, todo estuvo seguro hasta llegar al servidor, y al llegar al servidor simplemente se reenvía.
Lo que cambié fue las rutas en Sublime POS 3 ya que mi Nginx estaba así:
location /sublime-pos-3-nube/{
proxy_pass http://localhost:2106/;
}
Así que para acceder se apunta a https://parzibyte.me/sublime-pos-3-nube/static/ y entonces tuve que cambiar la ruta de la API en el cliente HTTP, quedando así:
export const RUTA_SERVIDOR_CON_AUTH = `${window.document.location.origin}/sublime-pos-3-nube/auth/`;
const RUTA_SERVIDOR_SIN_AUTH = `${window.document.location.origin}/sublime-pos-3-nube/`;
Fíjate en que el sublime-pos-3-nube
coincide con el location /sublime-pos-3-nube/
ya que SPOS3 va a exponer la ruta
static
, auth
y otras a partir de esa ruta base.
Más puertos y mayor seguridad
Con lo que he puesto en práctica usando Nginx sé que ahora podré ejecutar cualquier cantidad de programas que escuchen en otro puerto y no tendré que preocuparme por el certificado SSL, pues todo pasará por Nginx.
Confiabilidad de Sublime POS 3
Me da mucho gusto que Sublime POS 3, a pesar de ser un sistema antiguo, sigue funcionando y sigue teniendo esa flexibilidad para ser montado en varios servidores sin modificar mucho código.
Prácticamente solo tuve que modificar el JavaScript para que apuntara a la nueva ruta API
Go con certificado de Apache
Por cierto, para acceder antes de ello leía el certificado así:
certFile, keyFile:= "/etc/letsencrypt/live/parzibyte.me/fullchain.pem", "/etc/letsencrypt/live/parzibyte.me/privkey.pem"
// Preparar y encender servidor
servidor := &http.Server{
Handler: enrutador,
Addr: PuertoServidor,
// Timeouts para evitar que el servidor se quede "colgado" por siempre
WriteTimeout: 15 * time.Second,
ReadTimeout: 15 * time.Second,
}
log.Fatal(servidor.ListenAndServeTLS(certFile, keyFile))