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.
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.
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
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
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.
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
13. Probar la API
Desde el mismo servidor:
curl http://localhost:7001
La respuesta correcta es:
{"status":true,"code":200,"message":"Working great!"}
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
Comentarios
Publicar un comentario