Instalar un nodo de mastodon en Debian Jessie

¿Que es mastodon Ultimamente mastodon, parece haberse puesto de moda entre los mass medias, como un “fuerte” competidor de twitter. Mastodon es un software para crear una red abierta y descentralizada al estilo de gnusocial, pero sin utilizar su software, aunque es totalmente compatible con ella. Si queréis una explicación mas detallada, echarle un vistazo a el articulo que ya hizo victorhck en su blog https://victorhckinthefreeworld.com/2016/11/22/mastodon-un-nuevo-servidor-compatible-con-gnusocial que el lo explica mucho mejor que yo ;)

Instalando y configurando mastodon

El software de mastodon esta escrito en ruby, por lo que necesita una serie de dependencias para funcionar, aunque la documentación oficial esta muy bien documentada, faltan algunos pasos, por lo que creo que este articulo puede servir para tener una completa guía de instalación, para que cualquiera que quiera instalar un nodo pueda hacerlo sin complicaciones.

Instalación de dependencias

apt-get install imagemagick libpq-dev libxml2-dev libxslt1-dev nodejs file git curl

El paquete ffmpeg tambien necesitamos instalarlo , pero para ello tendremos que añadir los repositorios de jessie-backport, con lo que solo tendremos que añadir a nuestro archivo /etc/apt/sources.list, la siguiente linea:

deb http://ftp.debian.org/debian jessie-backports main
  • Actualizamos

apt-get update

  • Lo instalamos con apt-get -t jessie-backports install ffmpeg

Instalacion node – Descargamos y instalamos node con los siguiente comandos:

curl -sL https://deb.nodesource.com/setup_4.x | bash -
apt-get intall nodejs
npm install -g yarn

Instalacion Redis

apt-get install redis-server redis-tools

Instalacion y configuracion Postgres

apt-get install postgresql postgresql-contrib
  • Creamos un usuario y base de datos para nuestra aplicacion, con el nombre de mastodon
  • Entramos con el usuario postgres

         su - postgres
    
  • Ejecutamos postgres

          psql
    
  • Creamos un usuario con permisos para crear base de datos.

       CREATE USER mastodon CREATEDB; 
    
  • Salimos \q

Instalacion Rbenv

Primero necesitamos instalar las siguientes dependencias:

apt-get install autoconf bison build-essential libssl-dev libyaml-dev libreadline6-dev zlib1g-dev libncurses5-dev libffi-dev libgdbm3 libgdbm-dev

Clonamos Rbend desde el repositorio a nuestro home

 git clone https://github.com/rbenv/rbenv.git ~/.rbenv 

Añadimos rbend al path

echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc echo'export PATH="$HOME/.rbenv/shims:$PATH"'>> ~/.bashrc

Reiniciamos nuestra bash, para que se apliquen los cambios Una vez echo esto, comprobamos que tenemos correctamente el path de rbenv con:

 type rbenv

Os tiene que salir algo como esto:

Instalacion ruby-build

Vamos a instalarlo como un plugin de rbenv para poder usar el comando install

Clonamos el repo git en la misma ruta donde instalamos rbenv

git clone https://github.com/rbenv/ruby-build.git ~/.rbenv/plugins/ruby-build

Instalacion de ruby

Ahora que tenemos rbenv y el plugin de install instalados, tan solo tenemos que ejecutar el siguiente comando, para instalar ruby:

rbenv install 2.4.1

Instalando y configurando mastodon

  • Bajamos mastodon del repositorio

     git clone https://github.com/tootsuite/mastodon.git live
    
  • Accedemos a la carpeta del proyecto y instalamos y configuramos las dependencias del mismo

          gem install bundler
    
          bundle install --deployment --without development test
    
           yarn install
    

  • Una vez instaladas todas las dependencias, vamos a configurar el archivo de nuestra instancia

  • Cogemos el archivo de configuración por defecto y hacemos una copia para producción

            cp .env.production.sample .env.production
    

Lo editamos y lo dejamos como indica la documentación:

Ojo: Es muy importante que en tu sistema exista un usuario llamado mastodon y que toda la instalación del proyecto este en su home, ya que la autenticacion, se basa en una mapeo de este con el usuario de postgres que creaste.

  • Generamos un “secret” para nuestra aplicacion

            bundle exec rake secret
    
  • Copiamos nuestro “secret” y lo introducimos en config/initializers/devise.rb y en config/secrets.yml

  • Generamos la bd

            RAILS_ENV=production bundle exec rails db:setup
    

  • Compilamos css y javascript

       RAILS_ENV=production bundle exec rails assets:precompile
    

  • Necesitamos crear varios servicios en systemd para poner la aplicación a funcionar, para ello creamos los siguientes archivos:

servicio: /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 TimeoutSec=15 Restart=always

[Install] WantedBy=multi-user.target

servicio: /etc/systemd/system/mastodon-sidekiq.service

[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

servicio: /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
  • Les damos permiso

       systemctl enable /etc/systemd/system/mastodon-*.service
    
  • Los iniciamos

       systemctl start mastodon-web.service mastodon-sidekiq.service mastodon-streaming.service
    

Nginx

Ahora que tenemos nuestros servicios instalados y corriendo, necesitamos montar el frontal de la web en nginx.

  • Instalamos nginx

    apt-get install nginx

cd /etc/nginx/sites-avaliable

  • Creamos un nuevo fichero de configuración mastodon.conf

map $http_upgrade $connection_upgrade {
default upgrade;
” close;
}

server {
listen 80;
listen [::]:80;
server_name example.com;
# Useful for Let’s Encrypt
location /.well-known/acme-challenge/ { allow all; }
location / { return 301 https://$host$request_uri; }
}

server {
listen 443 ssl;
listen [::]:443 ssl;
server_name example.com;

ssl_protocols TLSv1.2;
ssl_ciphers EECDH+AESGCM:EECDH+AES;
ssl_ecdh_curve prime256v1;
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;
ssl_dhparam /etc/ssl/certs/dhparam.pem;

keepalive_timeout 70;
sendfile on;
client_max_body_size 0;

root /home/mastodon/live/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 /assets {
add_header Cache-Control “public, max-age=31536000, immutable”;
}

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://localhost: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;
}

  • Accedemos al directorio, y activamos el sitio creando un enlace:

         cd ../sites-enable
         ln -s ../sites-avaliable/mastodon.conf .
    
  • Reinicias nginx

    nginx -s reload

Y ya tendréis vuestro sitio funcionando.

Happy fediverse ;)

11 Comments

  1. En la config de Nginx no debería cambiarse el server_name por el dominio que tengamos nosotros?

    1. Claro, el ejemplo es solo un nodo que monte en local, no esta accesible desde Internet.

      Un saludo

  2. Eso es, buena info me la guardo . Saludos dende Portugal al equipo y a los compañeros que van poniendo estos temas por aqui que son de lo mejor a seguir asi .

  3. “Clonamos Rbend desde el repositorio o nuestro home” te referis a un usuario, por ejemplo “mastodon” creado para eso? o el home del root? Buen artículo!

    1. Si es un error(lo acabo de cambiar) venia a decir “Clonamos Rbend desde el repositorio a nuestro home”, quiere decir que tenemos que crear un usuario y su home y clonar el repositorio en el mismo, yo he usado /home/mastodon.

      Gracias, un saludo

  4. Buen artículo….gracias

    Tengo una duda existencial.. Mira yo quiero crear una instancia de Mastodon, pero que no sea accesible por otros nodos de Mastodon, luego modificar las interfaces y con el tiempo unir otros nodos propios… ¿cómo lo hago?, es necesario establecer una configuración especifica para evitar que otros nodos se conecten a mi instancia?….

    Se que eso de cerrar las puertas a otros va en contra de la filosofía de Mastodon, pero necesito tener el control-

    Gracias.

  5. Buen manual, pero creo que te caes en que no especificas los usuarios con el cual se instala cada componente…

  6. El archivo de configuración Nginx está entero mal, faltan muchos pasos, como los certificados, etc.

    He perdido el tiempo… :(((

    1. Creo que no has debido leer todo el articulo, porque en la configuración de nginx se indica estas lineas:

      ssl_protocols TLSv1.2;
      ssl_ciphers EECDH+AESGCM:EECDH+AES;
      ssl_ecdh_curve prime256v1;
      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;
      ssl_dhparam /etc/ssl/certs/dhparam.pem;
      

      *
      Cualquier duda no duces en comentar

Leave a Reply

Your email address will not be published. Required fields are marked *

To create code blocks or other preformatted text, indent by four spaces:

    This will be displayed in a monospaced font. The first four 
    spaces will be stripped off, but all other whitespace
    will be preserved.
    
    Markdown is turned off in code blocks:
     [This is not a link](http://example.com)

To create not a block, but an inline code span, use backticks:

Here is some inline `code`.

For more help see http://daringfireball.net/projects/markdown/syntax