Ir al contenido principal

Tutorial: GWMS + PostgreSQL 16 + Docker

Instalar GWMS con Docker y PostgreSQL 16

Guía paso a paso para instalar Go WhatsApp Multi-Session REST API (GWMS) utilizando Docker y una instalación nativa de PostgreSQL 16.

Entorno utilizado: GWMS ejecutándose en Docker y PostgreSQL 16.14 instalado directamente en Ubuntu.

1. Arquitectura utilizada

En esta instalación no utilizaremos un contenedor independiente para PostgreSQL. GWMS funcionará dentro de Docker y se conectará al PostgreSQL instalado directamente en el sistema.

┌──────────────────────────────┐
│          Ubuntu              │
│                              │
│  ┌────────────────────────┐  │
│  │ PostgreSQL 16.14       │  │
│  │ Puerto: 5432            │  │
│  │ Base: gwms              │  │
│  └───────────▲────────────┘  │
│              │               │
│              │               │
│  ┌───────────┴────────────┐  │
│  │ Docker                 │  │
│  │                        │  │
│  │  GWMS                  │  │
│  │  Puerto: 7001          │  │
│  └────────────────────────┘  │
│                              │
└──────────────────────────────┘

2. Crear la carpeta de GWMS

mkdir -p /home/docker/gwms
cd /home/docker/gwms

3. Crear la base de datos PostgreSQL

Primero comprobamos que PostgreSQL esté funcionando.

psql -h localhost -p 5432 -U postgres

Dentro de PostgreSQL creamos la base de datos:

CREATE DATABASE gwms;

Podemos comprobar que fue creada:

\l

Para salir:

\q
Configuración Valor
Motor PostgreSQL 16.14
Host localhost
Puerto 5432
Usuario postgres
Base de datos gwms

4. Descargar el código fuente

En lugar de utilizar directamente la imagen Docker oficial, descargaremos el código fuente porque necesitamos realizar una pequeña corrección antes de construir nuestra propia imagen.

cd /home/docker/gwms

git clone https://github.com/gdbrns/go-whatsapp-multi-session-rest-api.git source

5. Problema encontrado con PostgreSQL 16

Durante la primera ejecución, GWMS mostraba el siguiente error:

FATAL: unrecognized configuration parameter "prefer_simple_protocol"

Al revisar el código encontramos que GWMS agregaba automáticamente el parámetro:

dsn = appendParam(dsn, "default_query_exec_mode", "simple_protocol")

Este comportamiento provocaba el problema durante la conexión con nuestro PostgreSQL.

Importante: PostgreSQL no estaba caído ni había un problema con el usuario, contraseña o puerto. El problema estaba relacionado con la configuración que GWMS agregaba a la conexión mediante pgx.

6. Modificar GWMS

Abrimos el archivo:

nano /home/docker/gwms/source/pkg/whatsapp/whatsapp.go

En Nano utilizamos:

Ctrl + W

Buscamos:

default_query_exec_mode

Encontraremos:

dsn = appendParam(dsn, "default_query_exec_mode", "simple_protocol")

Eliminamos esa línea con:

Ctrl + K

Guardamos:

Ctrl + O
Enter

Y salimos:

Ctrl + X
Resultado: GWMS continuará utilizando pgx, pero ya no agregará el parámetro default_query_exec_mode=simple_protocol.

7. Crear el Dockerfile

Creamos nuestro propio Dockerfile:

nano /home/docker/gwms/Dockerfile

Contenido:

FROM golang:1.25-alpine AS builder

WORKDIR /app

RUN apk add --no-cache git ca-certificates tzdata

COPY source/go.mod source/go.sum ./
RUN go mod download

COPY source/ ./

RUN CGO_ENABLED=0 GOOS=linux go build \
    -ldflags="-s -w" \
    -trimpath \
    -o gowam-rest \
    cmd/main/main.go


FROM alpine:3.21

RUN apk add --no-cache ca-certificates tzdata wget

RUN addgroup -g 1001 -S appgroup && \
    adduser -u 1001 -S appuser -G appgroup

WORKDIR /usr/app/gowam-rest

RUN mkdir -p dbs && \
    chown -R appuser:appgroup /usr/app/gowam-rest

COPY --from=builder --chown=appuser:appgroup /app/gowam-rest .

USER appuser

EXPOSE 7001

CMD ["./gowam-rest"]

8. Crear Docker Compose

Creamos:

nano /home/docker/gwms/docker-compose.yml

Utilizamos la siguiente configuración:

services:
  gwms:
    build:
      context: .
      dockerfile: Dockerfile

    image: gwms:local

    container_name: gwms

    ports:
      - "7001:7001"

    environment:
      SERVER_ADDRESS: 0.0.0.0
      SERVER_PORT: 7001

      ADMIN_SECRET_KEY: "admin123"
      JWT_SECRET_KEY: "jwt123456789"

      WHATSAPP_DATASTORE_TYPE: postgres

      WHATSAPP_DATASTORE_URI: "postgres://postgres:TU_PASSWORD@host.docker.internal:5432/gwms?sslmode=disable"

    extra_hosts:
      - "host.docker.internal:host-gateway"

    volumes:
      - ./data:/usr/app/gowam-rest/dbs
Importante: Reemplaza TU_PASSWORD por la contraseña real del usuario postgres.

9. Claves de seguridad

Para las pruebas podemos utilizar claves sencillas:

ADMIN_SECRET_KEY: "admin123"
JWT_SECRET_KEY: "jwt123456789"

Para producción es recomendable utilizar claves aleatorias.

openssl rand -hex 32

El comando genera una cadena aleatoria que podemos utilizar como clave. Conviene ejecutarlo dos veces para obtener dos claves diferentes.

Consejo: No utilices las claves de ejemplo en una instalación pública o de producción.

10. Construir la imagen Docker

Como modificamos el código fuente, construiremos nuestra propia imagen:

cd /home/docker/gwms

docker compose build --no-cache

Al finalizar tendremos:

gwms:local

11. Iniciar GWMS

docker compose up -d

Comprobamos el contenedor:

docker compose ps

Debemos obtener un estado similar a:

NAME   IMAGE       STATUS
gwms   gwms:local  Up

12. Revisar los logs

docker logs gwms --tail 100

Una instalación correcta debe mostrar:

INFO [sys] init-db pgx
INFO [sys] db-ready

También veremos que Fiber está escuchando en el puerto 7001:

bound on host 0.0.0.0 and port 7001
db-ready confirma que GWMS consiguió conectarse correctamente a PostgreSQL.

13. Probar la API

Desde el mismo servidor:

curl http://localhost:7001

La respuesta correcta es:

{"status":true,"code":200,"message":"Working great!"}
¡Instalación completada! GWMS está funcionando dentro de Docker, conectado a PostgreSQL 16.14 instalado de forma nativa en Ubuntu.

14. Estructura final

/home/docker/gwms/
├── Dockerfile
├── docker-compose.yml
├── source/
│ ├── cmd/
│ ├── pkg/
│ ├── go.mod
│ ├── go.sum
│ └── ...
└── data/

15. Arquitectura final

                    Ubuntu
                       │
          ┌────────────┴────────────┐
          │                         │
          ▼                         │
 ┌─────────────────┐               │
 │ PostgreSQL 16.14│               │
 │     :5432       │               │
 │      gwms       │               │
 └────────▲────────┘               │
          │                         │
          │ host.docker.internal    │
          │                         │
 ┌────────┴─────────────────────┐  │
 │           Docker             │  │
 │                              │  │
 │   ┌──────────────────────┐   │  │
 │   │        GWMS          │   │  │
 │   │      :7001           │   │  │
 │   │     gwms:local       │   │  │
 │   └──────────────────────┘   │  │
 │                              │  │
 └──────────────┬───────────────┘  │
                │                  │
                ▼                  │
          REST API :7001           │
                                   │
 ──────────────────────────────────┘

16. Iniciar y detener GWMS

Como queremos iniciar el contenedor manualmente, no utilizamos restart: always.

Para iniciar:

cd /home/docker/gwms
docker compose start

Para detener:

docker compose stop

También podemos iniciar el servicio con:

docker compose up -d

Y detenerlo y eliminar el contenedor:

docker compose down

17. Cuando modificamos el código

Si solamente detenemos y volvemos a iniciar GWMS, no necesitamos recompilar.

docker compose stop
docker compose start

Si modificamos el código fuente, debemos volver a construir la imagen:

docker compose build
docker compose up -d
Nota sobre PostgreSQL 15: El ejemplo oficial de GWMS utiliza PostgreSQL 15 en Docker. Para una instalación futura podemos probar PostgreSQL 15 en un contenedor separado y comparar su comportamiento con PostgreSQL 16.14.

Comentarios

Entradas populares de este blog

Instalar Evolution API en Docker con Redis y PostgreSQL Local

Instalar Evolution API en Docker con Redis y PostgreSQL Local En este tutorial vamos a levantar Evolution API usando Docker , con soporte de Redis para sesiones y PostgreSQL local para almacenar datos de manera persistente y compartida entre varios usuarios. 1. Estructura del proyecto Crea una carpeta para tu proyecto y colócate en ella: mkdir -p ~/docker/evolution-api cd ~/docker/evolution-api 2. Archivo docker-compose.yml Este compose levanta Redis y Evolution API : version: "3.9" services: # ✅ SERVICIO REDIS redis: container_name: evolution_redis image: redis:7-alpine restart: unless-stopped ports: - "6379:6379" volumes: - redis_data:/data command: redis-server --save 60 1 --loglevel warning # ✅ SERVICIO EVOLUTION API evolution-api: container_name: evolution_api image: atendai/evolution-api restart: unless-stopped ports: - "8085:8080" env_file: - .env ...

Instalación y Configuración de MySQL 5.7 en Ubuntu 24.04 LTS

Instalar MySQL 5.7 en Ubuntu 24.04 1. Descargar e instalar MySQL Copiar mkdir ~/mysql57 cd ~/mysql57 wget https://cdn.mysql.com/archives/mysql-5.7/mysql-5.7.44-linux-glibc2.12-x86_64.tar.gz tar -zxvf mysql-5.7.44-linux-glibc2.12-x86_64.tar.gz sudo mv mysql-5.7.44-linux-glibc2.12-x86_64 /usr/local/mysql sudo ln -s /usr/local/mysql/bin/mysql /usr/local/bin/mysql 2. Instalar dependencias necesarias IMPORTANTE: Se descargan las versiones nuevas de las librerías y se las vincula con las librerías que necesita MySQL. Copiar sudo apt update # Reemplazo de libaio sudo apt install libaio1t64 # Reemplazo de libtinfo y ncurses sudo apt install libtinfo6 libncurses6 Copiar # Crear los enlaces simbólicos sudo ln -sf /usr/lib/x86_64-linux-gnu/libaio.so.1t64 /usr/lib/libaio.so.1 sudo ln -sf /usr/lib/x86_64-linux-gnu/libtinfo.so.6 /usr/lib/x86_64-linux-gnu/libtinfo.so.5 sudo ln -sf /usr/lib/x86_64-linux-gnu/libncurses.so.6 /usr/lib/x86_64...

Instalar Jasper Studio 6.21 para Ubuntu 24.04

Instalar js-studiocomm_6.21.3 en Ubuntu 24.4 Para instalar Jaspersoft Studio en Ubuntu 24.4, sigue estos pasos: 1. Descargar Jasper Studio Descarga la versión js-studiocomm_6.21.3 desde el siguiente enlace: Jaspersoft Studio 6.21.3 2. Crear el directorio de instalación mkdir /opt/jasperstudio 3. Mover el archivo descargado mv /dir_descarga/js-studiocomm_6.21.3_linux_x86_64.tgz /opt/jasperstudio/ cd /opt/jasperstudio 4. Extraer el archivo tar -xvzf js-studiocomm_6.21.3_linux_x86_64.tgz cd js-studiocomm_6.21.3 5. Ejecutar Jaspersoft Studio ./Jaspersoft\ Studio 6. Crear acceso directo en el escritorio Para facilitar el acceso, crea un archivo .desktop en el escritorio: gedit ~/Escritorio/jaspersoft-studio.desktop En el archivo jaspersoft-studio.desktop , agrega lo siguiente: [Desktop Entry] Version=1.0 Ty...