Hoy vamos a aprender cómo tener nuestro propio servidor de mastodon con docker usando ubuntu 22.04.
Como ya intenté una vez por mastodon (pero no era el lugar la verdad), vamos a aprender a desplegar y construir el contenedor de mastodon en Docker.
Lo harémos siguiendo los siguientes pasos:
- Preparar el equipo
- Bajar repositorio de mastodon
- Cambiar permisos a carpetas
- Configurar el entorno
- Configurar nginx
- Elasticsearch (opcional)
- Fin
1. Preparar el equipo
El paso mas importante de todos para preparar el servidor necesitamos primero es hacer todo el proceso con este video de fondo. Si no no funciona.
Asumimos que tenemos un correo para el SMTP y un dominio (si no es así mal empezamos, cierra esta web y empieza por ahí)
Ahora necesitaríamos:
- Instalar docker
- Configurar las reglas de salida del cortafuegos
- Instalar certbot
Al lio.
Instalar Docker
No os dejeis engañar por los cantos de sirena de instalar el servicio cuando instales ubuntu server. A la minima te dará problemas.
Seguimos los pasos que aparecen en la página oficial
Que son, añadir el repositorio
1 | # Add Docker's official GPG key: |
E instalarlo
1 | sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin |
Configurar las reglas de salida del cortafuegos
Usaremos ufw, aka Uncomplicated Firewall (siempre me hago un lio con iptables)
1 | # Activar cortafuegos |
Instalar certbot
Si queremos que funcione nuestro servidor de mastodon tenemos que tener un certificado para que funcione el https. Así que primero, actualizamos el sistema e instalamos
1 | # Actualizamos el sistema (aunque puede que lo hicieramos en el paso anterior, si es asi saltatelo) |
Por ultimo instalamos el certificado.
Nota: Si has sido muy rápido y has instalado nginx primero, lanza sudo “systemctl stop nginx” para pararlo, ya que imagino que estará tocando las narices en el puerto 80
1 | sudo certbot certonly --standalone -d tu.dominio |
(cambia “tu.dominio” por tu puto dominio, no me seas cabestro)
Y con eso ya tendriamos el certbot funcionando así como los puertos abiertos. Ya estamos listos para la acción.
2. Bajar el repositorio de mastodon
Este es el paso mas corto (mira que bien), en primer lugar necesitamos elegir el directorio donde vamos a instalar mastodon.
No ese no, ojo cuidao que por defecto todos los archivos de tus usuarios y los federados se van a almacenar ahí, busca una partición con espacio de sobra al menos 100GB para ir moviendote.
¿Ese? ¿seguro? bueeno, pues ahora, clonas el repositorio
¿que como? a ver que te lo tengo que dar todo hecho…
1 | cd /tu/directorio/elegido |
¿Cómo? ¿que no tienes git? Bueno, si es el caso vete aqui que tampoco te lo tengo que dar todo todo hecho
Si tienes que modificar el limite de caracteres te recomiendo un post anterior, concretamente este
Y con eso ya estaríamos. No es estrictamente necesario construir la imagen de docker, ya que si no la construimos la bajará cuando lancemos el server, pero si modificamos algo que no sea .env.production o docker-compose.yml no nos olvidemos de lanzar
1 | docker build . -t "ghcr.io/mastodon/mastodon:v4.2.0" |
3. Cambiar permisos a carpetas
Algunas carpetas necesitan algunos permisos especiales para la imagen de docker, si da problemas podemos cambiar los permisos de la carpeta /public
1 | sudo chown -R 991:991 public/* |
Y si usamos elasticsearch
1 | sudo chown -R 1000:1000 elasticsearch/* |
4. Configurar el entorno
Aqui tenemos dos opciones, o crear nuestro .env.production desde 0, para lo cual copiaremos .env.production.sample a .env.production
Desde la carpeta donde tenemos el repositorio
1 | cp .env.production.sample .env.production |
y rellenamos la configuración que queramos, o bien lanzamos
1 | docker-compose run --rm web bundle exec rake mastodon:setup |
Lo cual lanzara el asistente de configuración de mastodon.
Teneis más información en (la web oficial de mastodon)[https://docs.joinmastodon.org/admin/config/]
NOTA: Muy importante cuando relleneis la configuración, la dirección del host de postgresql es “db”, la de redis es “redis” y la de elasticsearch es “es” sin mas.
Hay que tener en cuenta que los contenedores se reconocen entre si con esos aliases y es la dirección que necesitan para comunicarse
5. Configurar nginx
Ya va quedando menos, configuremos nginx.
Primero copiamos el archivo nginx que tenemos en el repositorio de mastodon a nuestro directorio de configuración de nginx.
1 | sudo cp /tu/directorio/elegido/mastodon/dist/nginx.conf /etc/nginx/sites-available/mastodon |
Y ahora editamos:
Si buscamos hay dos secciones donde pone “server_name”
1 | server { |
hay que sustituir donde pone example.com por “tu.dominio” (de nuevo, tu puto dominio, no me seas merluzo)
Luego, hay una parte comentada con los certificados
1 | # Uncomment these lines once you acquire a certificate: |
Descomentandola y añadiendo tu dominio en el path quedaría en nuestro ejemplo algo así
1 | # Uncomment these lines once you acquire a certificate: |
(no me hagas repetirte lo mismo)
Ojo cuidao que si no hemos instalado el certificado digital nos fallará nginx cuando lo lancemos
Ahora tenemos una serie de “locations” que son algo asi:
1 | location = /sw.js { |
En todos ellos, al usar docker tenemos que sustituir el try_files $uri =404 por try_files $uri @proxy;
Quedando así
1 | location = /sw.js { |
Y ya para terminar al final del todo, hay dos “location” que tienen proxy_pass estas reglas son las rutas hacia el servicio de streaming de mastodon y el de la web hay que sustituir donde pone “https://backend“ por nuestro backend quedando mas o menos así
1 | location ^~ /api/v1/streaming { |
Ya casi estamos
6. Elasticsearch (opcional)
Para añadir elasticsearch a la mezcla, en nuestro repositorio de mastodon tenemos un docker-compose.yml
En ese archivo veremos una seccion “es:” comentada, tiene que quedar así:
1 | es: |
Es muy posible que elasticsearch os falle porque necesita una configuración de memoria virtual extra, en ese caso podemos lanzar
1 | sysctl -w vm.max_map_count=262144 |
Pero en el siguiente reinicio la configuración se irá. Para ello editamos el fichero /etc/sysctl.conf y añadimos al final
1 | vm.max_map_count=262144 |
7. Fin
Bueno, ha sido un largo y extraño viaje. Una vez aquí ya podemos lanzar el servidor de mastodon “sin miedo”*
Desde la carpeta del repositorio:
Empezaremos migrando la base de datos (para construir las estructuras)
1 | docker-compose run --rm web rake db:migrate |
Y si queremos podemos construir los indices de elasticsearch (aunque van a estar vacíos la verdad) y solo si usamos elasticsearch
1 | docker-compose run --rm web bin/tootctl search deploy |
Y por último lanzamos los contenedores.
1 | docker-compose up -d |
Con esto ya deberias poder acceder “sin miedo”* a tu.dominio (ejem… que no me entere yo que sigues usandolo literal) y empezar a disfrutar de un nodo descentralizado.
En fin, ¡hasta luego! y gracias por el pescado.
*El miedo existe y existirá porque ni siquiera he validado la guía apropiadamente