You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

202 lines
7.0 KiB

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