---
weight: 4
title: "Instalación de Rocket Chat en Docker"
date: 2021-03-07T17:24:04+0100
draft: false
summary: "Instalación de Rocket Chat en Docker"
categories:
  - notes
tags:
  - docker
  - traefik
  - rocketchat
---

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

<!--more-->

# Rocket Chat sobre Docker tras Traefik v2

[Rocketchat](https://rocket.chat/) es un interesante servicio de chat
que [es software libre y
abierto](https://github.com/RocketChat/Rocket.Chat/blob/master/LICENSE).


## Directorios de trabajo

{{< admonition type=abstract title="Referencias" state=open >}}


Para configurar el servicio _Rocketchat_ seguimos las siguientes
referencias:

- [github del proyecto rocketchat](https://github.com/RocketChat/Rocket.Chat)
- [Realtarget traefik-docker-stack](https://github.com/realtarget/traefik2-docker-stack)

{{</ admonition >}}

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í]({{< relref
"notes_traefik/#ejemplo03-una-configuraci%C3%B3n-sencilla-para-empezar-con-traefik-en-producci%C3%B3n"
>}})

Partimos del fichero `docker-compose.yml` que nos proponen en [el
github del
proyecto](https://github.com/RocketChat/Rocket.Chat/blob/develop/docker-compose.yml)

Para ello creamos un directorio para nuestra configuración _docker_ del _Rocket Chat_:

```bash
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í](https://docs.mongodb.com/manual/tutorial/deploy-replica-set/))

```yaml
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](https://cloud.rocket.chat)
  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.

{{< admonition type=warning title="Seguridad" state=open >}}

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.

{{</ admonition >}}
