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
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
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.