Cómo instalar la red social Mastodon con Docker en Ubuntu 18.04 LTS
Mastodon es una red social libre, descentralizada y de código abierto. Se creó como alternativa a Twitter. Al igual que en Twitter, la gente puede seguirse entre sí, publicar mensajes, imágenes y vídeos. Pero a diferencia de Twitter, no hay un almacén central ni una autoridad para el contenido.
En su lugar, Mastodon opera a través de miles de servidores diferentes, cada uno de los cuales está dirigido por varios miembros de la comunidad. Los usuarios inscritos en un servidor pueden conectarse fácilmente con los usuarios de la otra red y seguirse entre instancias.
Cualquiera puede instalar su propia instancia de un servidor Mastodon. Este tutorial te enseñará a configurar tu instancia de Mastodon en un servidor con Ubuntu 18.04 utilizando Docker.
Requisitos previos
-
Un servidor basado en Ubuntu 18.04 con un usuario sudo no root.
-
Asegúrate de que tu sistema está actualizado.
$ sudo apt update $ sudo apt upgrade
-
Mastodon envía notificaciones por correo electrónico a los usuarios. Una opción para que funcione es configurar tu propio servidor de correo. Puedes hacerlo en el mismo servidor en el que vas a instalar Mastodon o en un servidor diferente. Hacerlo está fuera del alcance de esta guía.
Te recomendamos que utilices un servicio de correo transaccional de terceros como Mailgun, Sendgrid, Amazon SES o Sparkpost. Las instrucciones de la guía utilizarán Mailgun como proveedor de SMTP.
-
Asegúrate de que tienes un nombre de dominio que apunta al servidor. Para este tutorial, usaremos example.com como dominio.
Paso 1 - Instalación de las dependencias
Antes de instalar Mastodon, tenemos que asegurarnos de que nuestro servidor tiene cierto software que necesitará para instalarse correctamente. Ejecuta los siguientes comandos para instalar las dependencias.
$ sudo apt update
$ sudo apt install ca-certificates curl ufw apt-transport-https software-properties-common git -y
Algunos de los programas anteriores pueden estar preinstalados para ti.
Como hemos instalado Git, debemos configurarlo antes de continuar.
$ git config --global user.name "Your Name"
$ git config --global user.email "[email protected]"
Paso 2 - Configurar el cortafuegos
En nuestro paso anterior, instalamos, ufw (Uncomplicated Firewall). Antes de proceder a instalar Mastodon, debemos configurarlo.
Activa el SSH y el puerto que acabamos de crear para que no se nos bloquee.
$ sudo ufw allow OpenSSH
Habilitar el cortafuegos ufw.
$ sudo ufw enable
También tenemos que habilitar http y https para que Mastodon funcione.
$ sudo ufw allow http
$ sudo ufw allow https
Comprueba el estado del cortafuegos.
$ sudo ufw status
Deberías ver una salida como la siguiente.
Status: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
80/tcp ALLOW Anywhere
443/tcp ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
80/tcp (v6) ALLOW Anywhere (v6)
443/tcp (v6) ALLOW Anywhere (v6)
Paso 3 - Instalar Docker
Añade la clave GPG de Docker a tu sistema.
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
Comprueba la huella digital de la clave descargada.
$ sudo apt-key fingerprint 0EBFCD88
Deberías ver una salida como la siguiente.
pub rsa4096 2017-02-22 [SCEA]
9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88
uid [ unknown] Docker Release (CE deb) <[email protected]>
sub rsa4096 2017-02-22 [S]
Añade el repositorio de Docker.
$ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
Actualiza tu base de datos de paquetes.
$ sudo apt update
Instala Docker-CE. CE es la edición comunitaria de Docker.
$ sudo apt install docker-ce -y
Docker debería estar instalado ahora. Comprueba que se está ejecutando.
$ sudo systemctl status docker
La salida debería ser similar a la siguiente.
? docker.service - Docker Application Container Engine
Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
Active: active (running) since Tue 2019-10-22 18:26:29 UTC; 25min ago
Docs: https://docs.docker.com
Main PID: 3574 (dockerd)
Tasks: 8
CGroup: /system.slice/docker.service
??3574 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
Pulsa q para salir.
Añade tu cuenta de usuario limitado de Linux al grupo de Docker para que puedas ejecutar Docker sin sudo.
sudo usermod -aG docker $USER
La variable$USER elegirá y añadirá al grupo docker el usuario actual que haya iniciado la sesión. Sustituye $USER por el nombre de usuario real si no has iniciado la sesión con ese usuario.
Cambia al usuario que acabamos de añadir. Aunque ya hayas iniciado la sesión, tendrás que volver a cambiar a él para recargar los permisos.
$ su - ${USER}
Comprueba que todo funciona bien ejecutando el programa incorporado "Hola Mundo ".
$ docker run hello-world
Deberías ver la siguiente salida que te indicará que Docker está instalado y funciona correctamente.
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
1b930d010525: Pull complete
Digest: sha256:c3b4ada4687bbaa170745b3e4dd8ac3f194ca95b2d0518b417fb47e5879d9b5f
Status: Downloaded newer image for hello-world:latest
Hello from Docker!
This message shows that your installation appears to be working correctly.
Paso 4 - Instalar Docker Compose
Es posible saltarse este paso y continuar, pero tener instalado Docker Compose hará que la ejecución de Mastodon sea mucho más fácil, especialmente si quieres hacerlo en más de un servidor.
$ sudo curl -L "https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
En el momento de escribir este tutorial, 1.24.1 es la versión estable actual de Docker Compose. Puedes consultar la última versión en su página de Github.
Aplica los permisos de ejecución al binario de Docker Compose.
$ sudo chmod +x /usr/local/bin/docker-compose
Añade la finalización de comandos a Docker Compose.
$ sudo curl -L https://raw.githubusercontent.com/docker/compose/1.24.1/contrib/completion/bash/docker-compose -o /etc/bash_completion.d/docker-compose
Comprueba si la instalación se ha realizado correctamente.
$ docker-compose --version
Se imprimirá la siguiente salida.
docker-compose version 1.24.1, build 4667896b
Paso 5 - Instalar Mastodon
Clona el repositorio de Mastodon en tu servidor.
$ git clone https://github.com/tootsuite/mastodon
Navega hasta el directorio en el que acabamos de copiar los archivos.
$ cd mastodon
Mastodon viene con un archivo de configuración de ejemplo. Tenemos que renombrarlo para que Mastodon funcione.
$ cp .env.production.sample .env.production
Tenemos que generar claves secretas para nuestro archivo de configuración. Pero antes, tenemos que construir la imagen Docker.
$ docker-compose build
Ahora que la imagen está construida con éxito, necesitas crear varias claves que son necesarias para configurar Mastodon.
Genera primero SECRET_KEY_BASE.
$ SECRET_KEY_BASE=$(docker-compose run --rm web bundle exec rake secret)
Inserta la clave anterior en el archivo de configuración.
$ sed -i -e "s/SECRET_KEY_BASE=/&${SECRET_KEY_BASE}/" .env.production
Genera e inserta la OTP_SECRET en el archivo de configuración.
$ OTP_SECRET=$(docker-compose run --rm web bundle exec rake secret)
$ sed -i -e "s/OTP_SECRET=/&${OTP_SECRET}/" .env.production
Genera e inserta el PAPERCLIP_SECRET en el fichero de configuración.
$ PAPERCLIP_SECRET=$(docker-compose run --rm web bundle exec rake secret)
$ sed -i -e "s/PAPERCLIP_SECRET=/&${PAPERCLIP_SECRET}/" .env.production
Genera valores para VAPID_PRIVATE_KEY y VAPID_PUBLIC_KEY.
$ docker-compose run --rm web bundle exec rake mastodon:webpush:generate_vapid_key
Abre el archivo .env.production.
$ sudo nano ./.env.production
Busca VAPID_PRIVATE_KEY y VAPID_PUBLIC_KEY en el archivo y copia el resultado del comando anterior.
Busca la variable LOCAL_DOMAIN y cambia su valor de ejemplo.com al nombre de dominio que hayas elegido para tu instalación de Mastodon.
Introduce los valores que has obtenido de tu proveedor de SMTP.
SMTP_SERVER = smtp.mailgun.org
SMTP_PORT = 587
SMTP_LOGIN = username
SMTP_PASSWORD = password
SMTP_FROM_ADDRESS = [email protected]
Pulsa Ctrl + X y guarda el archivo cuando hayas terminado.
Tienes que volver a construir la imagen Docker para aplicar todos los cambios realizados anteriormente.
$ docker-compose build
Configura la base de datos.
$ docker-compose run --rm web rails db:migrate
Precompila los activos de Mastodon.
$ docker-compose run --rm web rails assets:precompile
Ejecuta el siguiente comando para ejecutar el contenedor.
$ docker-compose up -d
Paso 6 - Instalar y configurar Nginx
El siguiente paso de nuestra guía es instalar el servidor Nginx para hacer funcionar el sitio web de Mastodon.
Ejecuta el siguiente comando para instalar el servidor Nginx.
$ sudo apt install nginx -y
Nginx viene con un sitio configurado por defecto. Elimina eso.
$ sudo rm /etc/nginx/sites-available/default
Elimina también el enlace simbólico del sitio por defecto.
$ sudo rm /etc/nginx/sites-enabled/default
Crea un archivo de configuración de Nginx para Mastodon.
$ sudo touch /etc/nginx/sites-available/mastodon
Crea un enlace simbólico para la configuración de Mastodon.
$ sudo ln -s /etc/nginx/sites-available/mastodon /etc/nginx/sites-enabled/mastodon
Abre la configuración de Mastodon en el editor Nano. (Puedes elegir el editor que quieras)
$ sudo nano /etc/nginx/sites-available/mastodon
Copia y pega el siguiente texto en él.
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
server {
listen 80;
listen [::]:80;
server_name example.com;
root /home/user/mastodon/public;
# Useful for Let's Encrypt
location /.well-known/acme-challenge/ { allow all; }
location / { return 301 https://$host$request_uri; }
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name example.com;
ssl_protocols TLSv1.2;
ssl_ciphers HIGH:!MEDIUM:!LOW:!aNULL:!NULL:!SHA;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
keepalive_timeout 70;
sendfile on;
client_max_body_size 80m;
root /home/user/mastodon/public;
gzip on;
gzip_disable "msie6";
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_buffers 16 8k;
gzip_http_version 1.1;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
add_header Strict-Transport-Security "max-age=31536000";
location / {
try_files $uri @proxy;
}
location ~ ^/(emoji|packs|system/accounts/avatars|system/media_attachments/files) {
add_header Cache-Control "public, max-age=31536000, immutable";
try_files $uri @proxy;
}
location /sw.js {
add_header Cache-Control "public, max-age=0";
try_files $uri @proxy;
}
location @proxy {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto https;
proxy_set_header Proxy "";
proxy_pass_header Server;
proxy_pass http://127.0.0.1:3000;
proxy_buffering off;
proxy_redirect off;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
tcp_nodelay on;
}
location /api/v1/streaming {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto https;
proxy_set_header Proxy "";
proxy_pass http://127.0.0.1:4000;
proxy_buffering off;
proxy_redirect off;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
tcp_nodelay on;
}
error_page 500 501 502 503 504 /500.html;
}
La configuración anterior asume que estás usando Let's encrypt como tu proveedor de SSL. Si estás usando otro servicio SSL, entonces tienes que editar la ubicación de las claves y saltarte la siguiente sección del tutorial.
Paso 7 - Instalar y configurar Let's Encrypt
Asegúrate de que Nginx está parado.
$ sudo systemctl stop nginx
Añade el repositorio de Certbot.
$ sudo add-apt-repository ppa:certbot/certbot
Actualiza los paquetes del sistema.
$ sudo apt update
Instala la herramienta Certbot.
$ sudo apt install certbot
Tienes que crear el certificado dos veces: una con el método TLS SNI y la segunda con el método webroot.
sudo certbot certonly --standalone -d example.com
Ahora, crea el certificado utilizando el método webroot. Para ello necesitarás que Nginx esté en funcionamiento.
sudo systemctl start nginx
sudo certbot certonly --webroot -d example.com -w /home/user/mastodon/public/
La herramienta te preguntará si quieres mantener el certificado o renovarlo. Elige la opción de renovar.
Configurar la renovación automática de los certificados SSL
Los certificados Let's Encrypt tienen una validez de 90 días. Una vez transcurridos, deberás renovarlos de nuevo. Para ello, puedes crear una tarea cron que lo haga automáticamente por ti.
Crea una tarea cron.
$ sudo nano /etc/cron.daily/letsencrypt-renew
Copia y pega lo siguiente en el archivo.
#!/usr/bin/env bash
certbot renew
systemctl reload nginx
Guarda y sal del archivo pulsando Ctrl + X e introduciendo Y cuando te lo pida.
Haz que el script sea ejecutable y reinicia el demonio cron para que nuestro script se ejecute diariamente.
$ sudo chmod +x /etc/cron.daily/letsencrypt-renew
$ sudo systemctl restart cron
Paso 8 - Crea tu usuario Mastodon
Visita tu sitio mastodóntico en un navegador. Deberías ver la siguiente pantalla.
Introduce el nombre de usuario, la dirección de correo electrónico y la contraseña que desees para crear una nueva cuenta en tu instancia de Mastodon. El nombre de usuario completo que necesitarás para conectarte con los usuarios de otros servidores de Mastodon es
Mastodon te enviará un correo de confirmación para verificar el registro.
También puedes confirmar manualmente el registro. Para ello, tendrás que acceder por SSH a tu instancia Docker. Enumera todas las instancias Docker actuales.
$ docker ps
Verás un resultado como el siguiente.
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
32f2c4cd2598 tootsuite/mastodon "/tini -- bash -c 'r…" 16 hours ago Up 16 hours (healthy) 127.0.0.1:3000->3000/tcp mastodon_web_1
76beca2b858d tootsuite/mastodon "/tini -- node ./str…" 16 hours ago Up 16 hours (healthy) 127.0.0.1:4000->4000/tcp mastodon_streaming_1
08f7a42b75ac tootsuite/mastodon "/tini -- bundle exe…" 16 hours ago Up 16 hours mastodon_sidekiq_1
bacaa8c09a85 redis:5.0-alpine "docker-entrypoint.s…" 17 hours ago Up 17 hours (healthy) mastodon_redis_1
62e9b2175a53 postgres:9.6-alpine "docker-entrypoint.s…" 17 hours ago Up 17 hours (healthy) mastodon_db_1
Para realizar los cambios necesarios, necesitamos acceder al contenedor de streaming. Accede mediante SSH al contenedor mastodon_streaming_1.
$ docker exec -it mastodon_streaming_1 /bin/bash
Esto lanzará un shell Bash dentro de tu contenedor.
Ejecuta el siguiente comando para aprobar tu recién creado nombre de usuario.
mastodon@76beca2b858d:~$ RAILS_ENV=production bin/tootctl accounts modify howtoforge --confirm
Ejecuta el siguiente comando para convertir tu cuenta recién creada en un administrador.
mastodon@76beca2b858d:~$ RAILS_ENV=production bin/tootctl accounts modify howtoforge --role admin
Sal del contenedor.
mastodon@76beca2b858d:~$ exit
Accede a tu instancia con tu nombre de usuario y contraseña y te aparecerá la siguiente pantalla.
Haz clic en Vamos y pasarás a las siguientes páginas que te permitirán conocer algunos aspectos básicos del funcionamiento de Mastodon.
Haz clic en Finalizar el tutorial para que te aparezca la página de inicio de Mastodon, donde podrás empezar a publicar a gusto.
Puedes acceder a la configuración y al área de administración desde el menú de Preferencias.
Paso 9 - Mantenimiento
Para ver el rendimiento y los registros de tu instancia de Mastodon, dirígete a https://example.com/sidekiq/
Aquí puedes ver una lista de varios procesos y tareas programadas relacionadas con tu instancia de Mastodon. También puedes comprobar si hay tareas fallidas en la sección Muertos o Reintentos. También te indicará el uso de memoria de tu instancia.
Puedes comprobar el estado de la base de datos de tu instancia desde https://example.com/pghero/
Puedes realizar el mantenimiento de tu base de datos, ejecutar consultas SQL y eliminar los índices no utilizados.
Si tu sitio no se carga por alguna razón, puedes comprobar los registros generados por Docker.
Para ello, cierra primero tus contenedores.
$ docker-compose down
Ejecuta Docker compose en un estado adjunto para que puedas ver los registros generados por cada contenedor.
$ docker-compose up
Paso 10 Actualizar tu Mastodonte
Cambia a tu directorio Mastodon.
$ cd /home/user/mastdon
Descarga las actualizaciones del repositorio
$ git fetch
Si has cambiado tu archivo docker-compose.yml por alguna razón, tienes que ejecutar primero el siguiente comando.
$ git status
Esto te dirá todos los cambios realizados en él. Si el archivo ha sido modificado, entonces guarda tus cambios primero.
$ git stash
Comprueba la última versión de Mastodon. Comprueba la última versión en la página de versiones.
$ git checkout <version/tag>
Si has ejecutado git stash antes, entonces ejecuta el siguiente comando para rehacer tus cambios en el archivo docker-compose.yml.
$ git stash pop
Construye la imagen docker.
$ docker-compose build
Realiza las migraciones de la base de datos.
$ docker-compose run --rm web rails db:migrate
Precompila los activos de Mastodon.
$ docker-compose run --rm web rails assets:precompile
Ejecuta el siguiente comando para ejecutar el contenedor.
$ docker-compose up -d
Eso es todo para este tutorial. Para saber más sobre Mastodon sigue su documentación.