Mastodon es una red social libre y descentralizada de microblogging. Esta red social es una federación descentralizada de servidores que ejecutan el Software bajo licencia AGPL.
Eso significa que los usuarios están esparcidos en diferentes comunidades autónomos e independientes llamadas "instancias" o "nodos" cuya red se llama Fediverso
(que viene de unir Federeación + Universo
).
Pasos previos
Para realizar este tutorial será necesario tener un servidor Debian 11 con acceso a root. Además también necesitaremos tener un dominio o subdominio donde hacer la instalación de la instancia de Mastodon.
Instalación de NodeJS
Para poder instalar NodeJS
, deberás de seguir las instrucciones de este otro tutorial:

Es recomendable instalar la versión LTS.
# node -v
v16.17.0
Instalación de Yarn
También será necesario añadir el repositorio de Yarn para la versión de Mastodon.
curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add -
echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list
apt update
Y lo instalamos:
apt install yarn
Instalación de dependencias
También son necesario instalar todas estas dependencias:
apt -y install imagemagick ffmpeg libpq-dev libxml2-dev libxslt1-dev file git-core g++ libprotobuf-dev protobuf-compiler pkg-config gcc autoconf bison build-essential libssl-dev libyaml-dev libreadline-dev zlib1g-dev libncurses5-dev libffi-dev libgdbm-dev libidn11-dev libicu-dev libjemalloc-dev
Instalación de Nginx, Redis, Certbot y PostgreSQL
Software necesario para Mastodon, necesitaremos un servidor web, que en este caso será de nuevo Nginx, también usaremos Redis para la caché y luego para las bases de datos usaremos PostgreSQL.
apt install nginx redis-server redis-tools postgresql-13 certbot
Habilitamos los servicios al arranque:
systemctl enable nginx
Dependencias que deben de ser añadidas por un usuario no-root
Creamos un usuario llamado mastodon
:
adduser mastodon
Iniciamos como el usuario que hemos creado:
su - mastodon
Instalamos los siguientes paquetes rbenv
y ruby-build
:
git clone https://github.com/rbenv/rbenv.git ~/.rbenv
cd ~/.rbenv && src/configure && make -C src
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(rbenv init -)"' >> ~/.bashrc
# Reiniciamos la shell
exec bash
# Comprobamos que rbenv está bien instalado
type rbenv
# Instalamos ruby-build
git clone https://github.com/rbenv/ruby-build.git ~/.rbenv/plugins/ruby-build
Ahora que ya están instalados los paquetes rbenv
y ruby-build
podemos proceder a la instalación de la versión de Ruby que Mastodon necesita, y para habilitarlo es necesario ejecutar lo siguiente:
RUBY_CONFIGURE_OPTS=--with-jemalloc rbenv install 3.0.4
rbenv global 3.0.4
Esto llevará un tiempo seguramente, así que por ejemplo, yo me fui hacer un café y aún estaba instalando.
Dependencias para NodeJS y Ruby
Ahora que Ruby está habilitado, vamos a clonar el repositorio de Mastodon y luego instalaremos las dependencias de Ruby y NodeJS.
Primero volvemos al home de nuestro usuario mastodon:
cd
Clonamos el repositorio de Mastodon:
git clone https://github.com/tootsuite/mastodon.git live
Accedemos dentro de la carpeta creada:
cd live
Instalamos Bundler:
gem install bundler
Usamos Bundler para instalar el resto de dependencias para Ruby:
bundle config set deployment 'true'
bundle config set without 'development test'
bundle install -j$(getconf _NPROCESSORS_ONLN)
Y usamos Yarn para instalar las dependencias de NodeJS:
yarn install --pure-lockfile
Una vez hemos acabado con esto, ejecutamos exit
para salir del usuario mastodon
y volver al usuario root
.
Creación de la base de datos
Ahora crearemos la base de datos para Mastodon con PostgreSQL, para ello accederemos al prompt:
sudo -u postgres psql
Crearemos la base de datos:
CREATE USER mastodon CREATEDB;
Y salimos:
exit
La contraseña del usuario será que la hemos configurado para el propio sistema.
Configuración Nginx
En la documentación, te dan el fichero de configuración de Nginx preparado para copiar y utilizar, así que vamos a copiar el fichero directamente:
cp /home/mastodon/live/dist/nginx.conf /etc/nginx/sites-available/mastodon.conf
ln -s /etc/nginx/sites-available/mastodon.conf /etc/nginx/sites-enabled/mastodon.conf
Editamos el fichero de configuración /etc/nginx/sites-available/mastodon.conf
y modificamos example.com
por nuestro dominio.
Reiniciamos Nginx para aplicar los cambios:
systemctl reload nginx
Configuración de Nginx con SSL
El siguiente paso será crear el certificado para nuestro dominio, así que instalaremos los paquetes necesarios para hacerlo con Let's Encrypt:
apt install certbot python3-certbot-nginx
Creamos el certificado:
certbot --nginx -d nuestrodominio.com
Instalación de Mastodon
¡Venga, que ya queda poco! Volvemos a iniciar sesión como el usuario mastodon
:
su - mastodon
Ahora viene lo interesante. Iniciaremos la instalación donde tendremos una configuración interactiva donde nos pedirá información de nuestra instancia de Mastodon:
cd live
RAILS_ENV=production bundle exec rake mastodon:setup
Esta es la salida del comando y las respuestas que debéis de introducir para configurar vuestro nodo de Mastodon:
Your instance is identified by its domain name. Changing it afterward will break things.
Domain name: [NuestroDominio]
Single user mode disables registrations and redirects the landing page to your public profile.
Do you want to enable single user mode? No
Are you using Docker to run Mastodon? no
PostgreSQL host: /var/run/postgresql
PostgreSQL port: 5432
Name of PostgreSQL database: mastodon
Name of PostgreSQL user: mastodon
Password of PostgreSQL user: [Contraseña del usuario mastodon]
Database configuration works! 🎆
Redis host: localhost
Redis port: 6379
Redis password:
Redis configuration works! 🎆
Do you want to store uploaded files on the cloud? No
Do you want to send e-mails from localhost? yes
E-mail address to send e-mails "from": mastodon@[nuestroDominio]
Send a test e-mail with this configuration right now? Yes
Send test e-mail to: [TuCuentaDeCorreo]
This configuration will be written to .env.production
Save configuration? Yes
Now that configuration is saved, the database schema must be loaded.
If the database already exists, this will erase its contents.
Prepare the database now? Yes
Running `RAILS_ENV=production rails db:setup` ...
Created database 'mastodon'
Done!
The final step is compiling CSS/JS assets.
This may take a while and consume a lot of RAM.
Compile the assets now? Yes
La última pregunta que nos hace, es si queremos compilar los assets, le diremos que si para que compile todo:
Running `RAILS_ENV=production rails assets:precompile` ...
yarn install v1.22.19
[1/6] Validating package.json...
[2/6] Resolving packages...
[3/6] Fetching packages...
[4/6] Linking dependencies...
warning Workspaces can only be enabled in private projects.
[5/6] Building fresh packages...
[6/6] Cleaning modules...
Done in 8.87s.
Compiling...
Compiled all packs in /home/mastodon/live/public/packs
Browserslist: caniuse-lite is outdated. Please run:
npx browserslist@latest --update-db
Why you should do it regularly:
https://github.com/browserslist/browserslist#browsers-data-updating
Done!
All done! You can now power on the Mastodon server 🐘
Tras este proceso, tendremos Mastodon funcionando en nuestro servidor, pero antes, podemos crear un usuario admin para gestionar el nodo:
Do you want to create an admin user straight away? Yes
Username: root
E-mail: mastodon@[nuestroDominio]
You can login with the password: a17dbxxxxxxxxxxx6b2fdb5399
You can change your password once you login.
Este proceso generará una contraseña automáticamente que será la que usaremos para iniciar con nuestro usuario admin y que podemos cambiar posteriormente.
Configuración de SystemD para Mastodon
Hay que configurar tres servicios para poder iniciar el servicio de manera más sencilla. Estos son los tres ficheros y su contenido:
Para gestionar la web tendremos el fichero /etc/systemd/system/mastodon-web.service
[Unit]
Description=mastodon-web
After=network.target
[Service]
Type=simple
User=mastodon
WorkingDirectory=/home/mastodon/live
Environment="RAILS_ENV=production"
Environment="PORT=3000"
ExecStart=/home/mastodon/.rbenv/shims/bundle exec puma -C config/puma.rb
ExecReload=/bin/kill -SIGUSR1 $MAINPID
TimeoutSec=15
Restart=always
[Install]
WantedBy=multi-user.target
Para mantener el servicio en segundo plano tendremos este otro fichero /etc/systemd/system/mastodon-sidekiq.service
con el contenido:
[Unit]
Description=mastodon-sidekiq
After=network.target
[Service]
Type=simple
User=mastodon
WorkingDirectory=/home/mastodon/live
Environment="RAILS_ENV=production"
Environment="DB_POOL=5"
ExecStart=/home/mastodon/.rbenv/shims/bundle exec sidekiq -c 5 -q default -q mailers -q pull -q push
TimeoutSec=15
Restart=always
[Install]
WantedBy=multi-user.target
Y finalmente el último servicio para la API /etc/systemd/system/mastodon-streaming.service
:
[Unit]
Description=mastodon-streaming
After=network.target
[Service]
Type=simple
User=mastodon
WorkingDirectory=/home/mastodon/live
Environment="NODE_ENV=production"
Environment="PORT=4000"
ExecStart=/usr/bin/npm run start
TimeoutSec=15
Restart=always
[Install]
WantedBy=multi-user.target
Los habilitamos para el arranque:
systemctl enable /etc/systemd/system/mastodon-*.service
Y los iniciamos uno a uno:
systemctl start mastodon-web.service
systemctl start mastodon-sidekiq.service
systemctl start mastodon-streaming.service
Y una vez hemos acabado con esto… *redoble de tambores* Ta chaaaaan! Ya tenemos Mastodon en nuestro servidor y funcionando perfectamente.

Sólo faltará que la federación haga lo suyo para empezar a ver toda la red disponible 😛
Comentarios