Instalación de Rocket Chat en Docker

Nota
Este artículo se actualizó por última vez el 2022-04-22, es posible que el contenido no esté actualizado.

Como instalar el servicio Rocket.Chat sobre Docker con Traefik v2.

Rocket Chat sobre Docker tras Traefik v2

Rocketchat es un interesante servicio de chat que es software libre y abierto.

Directorios de trabajo

Referencias

Para configurar el servicio Rocketchat seguimos las siguientes referencias:

Para realizar la instalación de Rocketchat suponemos que tenemos un servicio Docker instalado con Traefik v2 funcionando como proxy inverso. Por ejemplo como describimos aquí

Partimos del fichero docker-compose.yml que nos proponen en el github del proyecto

Para ello creamos un directorio para nuestra configuración docker del Rocket Chat:

1
2
mkdir -p ~/work/010_rocketchat/{mongo, rocketchat}
touch ~/work/010_rocketchat/docker-compose.yml

Configuración del contenedor Docker

Modificamos el fichero que nos proponen en el github:

  • Fijamos las versiones concretas a utilizar de las imágenes Rocket.Chat y Mongodb
  • Configuramos el host para que use HTTPS
  • Conectamos los contenedores de Rocket.Chat y Mongodb a la red backend y les asignamos direcciones IP manualmente (backend es una red interna de nuestra configuración Docker)
  • Conectamos el contenedor de Rocket.Chat a la red frontend (puesto que tendrá que comunicarse con Traefik), asignando la dirección IP explicitamente.
  • El servicio estará disponible a través de Traefik así que quitamos la sección ports (no queremos puertos mapeados a nuestro host) y …
  • añadimos la sección labels a la definición del servicio rocketchat en nuestro fichero docker-compose.yml para definir los enrutamientos Traefik al servicio Rocket.Chat
  • No es necesario añadir el servidor de correo SMTP al entorno, podremos configurarlo sin problemas desde el interfaz de administración del chat una vez lanzados los contenedores de servicios.
  • Hemos corregido la activación de la replica de la base de datos Mongo, en realidad no estamos replicando nada, pero queda todo listo para dar redundancia en el futuro si así lo decidimos. (Más info aquí)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
version: '3'

services:
  rocketchat:
    image: rocketchat/rocket.chat:3.12.0
    container_name: rocketchat
    networks:
      frontend:
        ipv4_address: 172.21.0.100
      backend:
        ipv4_address: 172.20.0.100
    command: >
      bash -c
        "for i in `seq 1 30`; do
          node main.js &&
          s=$$? && break || s=$$?;
          echo \"Tried $$i times. Waiting 5 secs...\";
          sleep 5;
        done; (exit $$s)"      
    restart: unless-stopped
    volumes:
      - ./rocketchat/uploads:/app/uploads
    environment:
      - PORT=3000
      - ROOT_URL=https://chat.comacero.com
      - MONGO_URL=mongodb://mongo:27017/rocketchat
      - MONGO_OPLOG_URL=mongodb://mongo:27017/local
#      - MAIL_URL=smtp://mail.server.com
#       - HTTP_PROXY=http://proxy.domain.com
#       - HTTPS_PROXY=http://proxy.domain.com
    depends_on:
      - mongo
#     ports:
#       - 80:3000
    labels:
      - traefik.enable=true
      - traefik.http.routers.rocket.entrypoints=https
      - traefik.http.routers.rocket.rule=Host(`chat.yourdomain.com`)
      - traefik.http.routers.rocket.tls.certresolver=letsencrypt
      - traefik.http.services.rocket.loadbalancer.server.port=3000
      - traefik.docker.network=frontend

  mongo:
    image: mongo:4.0
    container_name: mongo
    networks:
      backend:
        ipv4_address: 172.20.0.110
    restart: unless-stopped
    volumes:
     - ./mongo/data/db:/data/db
     - ./mongo/data/dump:/dump
    command: mongod --smallfiles --oplogSize 128 --replSet rs0 --storageEngine=mmapv1

  # this container's job is just run the command to initialize the replica set.
  # it will run the command and remove himself (it will not stay running)
  mongo-init-replica:
    image: mongo:4.0
    container_name: mongo_replica
    networks:
      - backend
    command: >
      bash -c
        "for i in `seq 1 30`; do
          mongo mongo/rocketchat --eval \"
            rs.initiate({
              _id: 'rs0',
              members: [ { _id: 0, host: 'mongo:27017' } ]})\" &&
          s=$$? && break || s=$$?;
          echo \"Tried $$i times. Waiting 5 secs...\";
          sleep 5;
        done; (exit $$s)"      
    depends_on:
      - mongo

networks:
  frontend:
    external: true
  backend:
    external: true

Configuraciones adicionales

  • Evidentemente necesitamos una entrada en nuestra zona DNS que apunte al chat ya que hemos usado un subdominio.
  • En la documentación de Rocket Chat nos recomiendan añadir la linea chat.yourdomain.com a nuestro fichero /etc/hosts de forma que apunte a 127.0.0.1 (localhost)
  • Necesitamos un servidor SMTP de correo. Nuestro proveedor del dominio lo da gratis para volúmenes bajos de correo y es el que hemos usado, pero también hay algunas opciones en Internet que se pueden usar.
  • Una vez arrancado el servicio daremos de alta un usuario administrador para el Rocket Chat conectando a https://chat.yourdomain.com
  • Configuramos las opciones del servidor de correo (para poder verificar las direcciones de correo de los usuarios que se registren y poder enviar contraseñas en caso de reseteo)
  • Nos damos de alta en Rocket Chat Cloud que nos proporcionará gratis servicios de doble factor de autenticación (via correo), para nuestro servicio.
  • Configuramos la conexión de nuestro servidor Rocket Chat con el cloud.rocket.chat. Basta con añadir el token, que nos dan en el paso anterior, mediante el interfaz de administración de nuestro servicio.
  • Revisamos cuidadosamente como queremos dejar la configuración para el registro de nuevos usuarios. Parece recomendable activar al menos que solo se puedan loguear usuarios con el correo verificado y probablemente deberíamos activar la aprobación manual de nuevos usuarios.
Seguridad
Como siempre que abrimos servicios a internet, conviene ir con cuidado y tomar todo tipo de precauciones. Si dejamos abierto el registro de nuevos usuarios nos podemos encontrar con una avalancha de peticiones de nuevos usuarios por parte de bots.