--- 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. # 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) {{}} 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 - 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. {{}}