soketi + traefik + docker

Soketi + traefik + docker

En este tutorial veremos como instalar soketi + traefik + docker con certificado SSL letsencrypt, para ello he utilizado una instancia de Oracle cloud que es gratis pero podéis realizarlo en cualquier servidor que tengáis.

Instalar traefik

Como primer paso vamos a instalar traefik a través de un contenedor de docker, de esta forma vamos a simplificar muchos pasos.

Recordar que previamente debemos tener instalado docker y docker-compose.

En nuestro servidor podemos crear una carpeta llamada docker y dentro vamos a crear una carpeta llamado traefik, dentro de ella creamos estos archivos: .env, docker-compose.yml, traefik.yml, acme.json y users.txt
Me he basado en el tutorial de la web de Atareado.
Primer paso, crear el archivo .env y su contenido:

HOSTNAME="traefik.your-url.com"
NETWORK="traefik_net"
VERSION="v2.9"

La variable HOSTNAME será nuestra url donde estará traefik, NETWORK es el nombre de la red para traefik, podéis poner el nombre que queráis y VERSION es la versión de traefik a utilizar

Segundo paso, crear el archivo docker-compose.yml y su contenido:

version: '3'

services:
  traefik:
    image: traefik:${VERSION}
    container_name: traefik
    restart: unless-stopped
    security_opt:
      - no-new-privileges:true
    ports:
      - 80:80
      - 443:443
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - ./traefik.yml:/traefik.yml:ro
      - ./users.txt:/users.txt:ro
      - ./acme.json:/acme.json
    labels:
      - traefik.enable=true
      - traefik.http.middlewares.basicauth.basicauth.usersfile=/users.txt
      - traefik.http.routers.traefik-secure.entrypoints=websecure
      - traefik.http.routers.traefik-secure.rule=Host(`${HOSTNAME}`)
      - traefik.http.routers.traefik-secure.middlewares=basicauth
      - traefik.http.routers.traefik-secure.tls=true
      - traefik.http.routers.traefik-secure.tls.certresolver=letsencrypt
      - traefik.http.routers.traefik-secure.service=api@internal


#Docker Networks
networks:
    default:
        external:
            name: ${NETWORK}        

Tercer paso, el archivo traefik.yml y su contenido:

################################################################
# Global configuration
################################################################
global:
  checkNewVersion: true
  sendAnonymousUsage: false
    
api:
  dashboard: true

entryPoints:
  web:
    address: ":80"
    http:
      redirections:
        entryPoint:
          to: websecure
          permanent: true
  websecure:
    address: ":443"

serversTransport:
  maxIdleConnsPerHost: 1

providers:
  docker:
    endpoint: "unix:///var/run/docker.sock"
    exposedByDefault: false

log:
  level: INFO

certificatesResolvers:
  letsencrypt:
    acme:
      email: your-email@example.com
      storage: acme.json
      httpChallenge:
        entryPoint: web

Recordar cambiar el valor email por el vuestro para que traefik genere los certificados SSL.

Cuarto paso, crear el archivo acme.json y cambiar los permisos

touch acme.json
chmod 600 acme.json

Quinto paso, vamos a generar un usuario y contraseña para ingresar al panel de traefik para ello debemos ejecutar estos comandos:

sudo apt install apache2-utils
htpasswd -nb usuario contraseña >> users.txt

Reemplazar usuario y contraseña por el vuestro.

Sexto paso, vamos a crear una red en docker para traefik

docker network create traefik_net

Séptimo paso, levantar el servicio

docker-compose up -d

Para comprobar que esta funcionando, podemos correr este comando

docker-compose logs -f

Nos debería mostrar algo como esto

Mostrar log de soketi + traefik + docker

Si vamos a nuestra url asignada en traefik, al entrar nos pedirá el usuario y password anteriormente creado.
tras validar los datos de acceso debería mostrarnos una pantalla como esta


Instalar soketi

Recuerdan que teníamos la carpeta docker, dentro de ella creamos otra llamada soketi, aquí realizaremos la instalación de soketi a través de docker-compose, para ello vamos crear estos archivos: .env, config.json, docker-compose.yml y docker-compose.traefik.yml

Primer paso, crear el archivo .env y su contenido

HOSTNAME="soketi.your-url.com"
NETWORK="traefik_net"

Segundo paso, crear el archivo docker-compose.yml y su contenido

version: "3"
services:
  soketi:
    image: quay.io/soketi/soketi:latest-16-alpine
    volumes:
        - './config.json:/opt/config.json'
    command: ["node", "/app/bin/server.js", "start", "--config=/opt/config.json"]
    container_name: soketi
    restart: unless-stopped
    tty: true

#Volumes
volumes:
  dbdata:
    driver: local

En el caso de no querer usar el archivo de configuración podemos eliminar del docker-compose la parte de volumes y command

Tercer paso, crear el archivo docker-compose.traefik.yml y su contenido

version: "3"
services:
  soketi:
    labels:
        - traefik.enable=true
        - traefik.http.services.soketi.loadbalancer.server.port=6001
        - traefik.http.routers.soketi.entrypoints=web
        - traefik.http.routers.soketi.rule=Host(`${HOSTNAME}`)
        - traefik.http.middlewares.soketi-https-redirect.redirectscheme.scheme=websecure
        - traefik.http.routers.soketi.middlewares=soketi-https-redirect
        - traefik.http.routers.soketi-secure.entrypoints=websecure
        - traefik.http.routers.soketi-secure.rule=Host(`${HOSTNAME}`)
        - traefik.http.routers.soketi-secure.tls=true
        - traefik.http.routers.soketi-secure.tls.certresolver=letsencrypt
#Docker Networks
networks:
  default:
    external:
      name: ${NETWORK}

Cuarto paso, crear el archivo config.json y su contenido

{
    "debug": false,    
    "appManager.array.apps": [
        {
            "id": "YOUR-CODE",
            "key": "YOUR-KEY",
            "secret": "YOUR-SECRET"
        }
    ]
}

Quinto paso, levantar el servicio

docker-compose -f docker-compose.yml -f docker-compose.traefik.yml up -d

Comentar que podíamos realizar toda la configuración en un único archivo, por ejemplo en docker-compose.yml

Pero lo separamos en 2 archivos para que luego al ejecutar el comando internamente se mezclan en una sola configuración.
Esto lo hacemos por si más adelante tenemos otro tipo de configuración que queremos usar por ejemplo con el proxy Caddy

Para comprobar que esta funcionando, podemos correr este comando

docker-compose logs -f

Nos debería mostrar algo como esto

Mostrar log de soketi + traefik + docker

Configurar con Laravel

Esto es una mini guía, a modo de apunte.
Primer paso, en nuestro archivo .env debemos configurar esta parte

PUSHER_HOST="soketi.your-url.com"
PUSHER_PORT=443
PUSHER_SCHEME='https'
PUSHER_TLS=true

Segundo paso, en nuestro archivo de configuración broadcasting.php debemos hacer estos cambios.

'pusher' => [
            'driver' => 'pusher',
            'key' => env('PUSHER_APP_KEY'),
            'secret' => env('PUSHER_APP_SECRET'),
            'app_id' => env('PUSHER_APP_ID'),
            'options' => [
                'cluster' => env('PUSHER_APP_CLUSTER'),
                'encrypted' => true,
                'useTLS' => env('PUSHER_TLS', false),
                'host' => env('PUSHER_HOST', '127.0.0.1'),
                'port' => env('PUSHER_PORT', 6001),
                'scheme' =>  env('PUSHER_SCHEME', 'http'),
                'curl_options' => [
                    CURLOPT_SSL_VERIFYHOST => 0,
                    CURLOPT_SSL_VERIFYPEER => 0,
                ]
            ],
        ],

Ya solo nos quedaría crear un evento implementando ShouldBroadcast, tenéis muchos ejemplos que podéis encontrar en la red.

Eso sería todo en este tutorial de instalación de soketi + traefik + docker, os dejo el enlace del repositorio en github.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *