Déployer une instance Mastodon sur Docker

Mastodon est un réseau social de micro-blogging libre et décentralisé. Il est une bonne alternative à Twitter. Voici comment tester un peu ses possibilités.

Prérequis

Avoir installé Docker.

Installation

Pour faire simple (bien que brutal) cloner le dépôt Github du projet.

$ git clone https://github.com/tootsuite/mastodon.git

Ensuite copier et éditer le fichier de configuration.

$ cp .env.production.sample .env.production

L’éditer et remplir les champs suivants :

LOCAL_DOMAIN= # d'abord remplis avec localhost j'ai ensuite laissé vide parce que mon instance est locale (pour mes tests)
LOCAL_HTTPS=false # true si certificat

Pour la configuration SMTP utiliser Mailgun ou tout autre serveur SMTP.

SMTP_SERVER=smtp.mailgun.org
SMTP_PORT=587
SMTP_LOGIN=toto
SMTP_PASSWORD=1234
SMTP_FROM_ADDRESS=notifications@example.com
SMTP_DOMAIN=example.com

Ajouter l’option SMTP_DOMAIN ce qui vous évitera des heures de recherches.

Lancer ensuite un build

docker-compose build

Puis générer la clé secrète

docker-compose run --rm web rake secret

Si tout ce passe bien recopier la clé dans le fichier .env.production

Créer la base de données

docker-compose run --rm web rails db:migrate

Et compiler les assets

docker-compose run --rm web rails assets:precompile

Vous pouver lancer le monstre :

docker-compose up

Ou en mode démon :

docker-compose up -d

Connectez vous sur le port 3000 : http://localhost:3000

Exemple Configuration
# Service dependencies
REDIS_HOST=redis
REDIS_PORT=6379
DB_HOST=db
DB_USER=postgres
DB_NAME=postgres
DB_PASS=
DB_PORT=5432

# Federation
LOCAL_DOMAIN=
LOCAL_HTTPS=false



# Application secrets
# Generate each with the `rake secret` task (`docker-compose run --rm web rake secret` if you use docker compose)
PAPERCLIP_SECRET=
SECRET_KEY_BASE=<secret>
OTP_SECRET=

# Registrations
# Single user mode will disable registrations and redirect frontpage to the first profile
# SINGLE_USER_MODE=true
# Prevent registrations with following e-mail domains
# EMAIL_DOMAIN_BLACKLIST=example1.com|example2.de|etc
# Only allow registrations with the following e-mail domains
# EMAIL_DOMAIN_WHITELIST=example1.com|example2.de|etc

# Optionally change default language
DEFAULT_LOCALE=fr

# E-mail configuration
# Note: Mailgun and SparkPost (https://sparkpo.st/smtp) each have good free tiers
SMTP_SERVER=smtp.mailgun.org
SMTP_PORT=587
SMTP_LOGIN=
SMTP_PASSWORD=
SMTP_FROM_ADDRESS=notifications@example.com
#SMTP_DELIVERY_METHOD=smtp # delivery method can also be sendmail
#SMTP_AUTH_METHOD=plain
#SMTP_OPENSSL_VERIFY_MODE=peer
#SMTP_ENABLE_STARTTLS_AUTO=true

# Optional asset host for multi-server setups
# CDN_HOST=assets.example.com

# S3 (optional)
# S3_ENABLED=true
# S3_BUCKET=
# AWS_ACCESS_KEY_ID=
# AWS_SECRET_ACCESS_KEY=
# S3_REGION=
# S3_PROTOCOL=http
# S3_HOSTNAME=192.168.1.123:9000


# S3 (Minio Config (optional) Please check Minio instance for details)
# S3_ENABLED=true
# S3_BUCKET=
# AWS_ACCESS_KEY_ID=
# AWS_SECRET_ACCESS_KEY=
# S3_REGION=
# S3_PROTOCOL=https
# S3_HOSTNAME=
# S3_ENDPOINT=

# Optional alias for S3 if you want to use Cloudfront or Cloudflare in front
# S3_CLOUDFRONT_HOST=


# Streaming API integration
# STREAMING_API_BASE_URL=


# Advanced settings
# If you need to use pgBouncer, you need to disable prepared statements:
# PREPARED_STATEMENTS=false
Administration

Créer un utilisateur avec l’interface de création de compte et le définir comme administrateur.

docker-compose run --rm web rails mastodon:make_admin USERNAME=<user>

 

Sources

https://angristan.fr/installer-instance-mastodon-debian-8/

https://blog.lertsenem.com/creer-son-instance-mastodon-perso-vite-fait-mal-fait-fr.html

https://github.com/tootsuite/mastodon

https://korben.info/synchroniser-mastodon-twitter.html

Installation et configuration de MongoDB sous Debian

MongoDB est une base de type NoSQL très en vogue. Cette dernière est orientée document, c’est à dire que vos données ne sont plus des tables relationnelles mais des documents.

Installation

J’ai directement installé la version disponible dans les paquets de Debian (v2.4.10).

Mais vous pouvez installer la dernière version en suivant ce lien.

apt-get update 
apt-get install mongodb 
service mongod start

Configuration

Ici la configuration peut changer avec votre version. Je détaillerai la configuration YAML plus tard.

Important

Changed in version 2.6: MongoDB 2.6 introduces a YAML-based configuration file format. The 2.4 configuration file format remains for backward compatibility.

# mongodb.conf
# Version <= 2.4.x


# Where to store the data.
dbpath=/var/lib/mongodb

#where to log
logpath=/var/log/mongodb/mongodb.log

logappend=true

#bind_ip = 127.0.0.1
bind_ip = 0.0.0.0
#port = 27017

# Enable journaling, http://www.mongodb.org/display/DOCS/Journaling
journal=true

# Enables periodic logging of CPU utilization and I/O wait
#cpu = true

# Turn on/off security.  Off is currently the default
#noauth = true
auth = true

# Verbose logging output.
#verbose = true

# Inspect all client data for validity on receipt (useful for
# developing drivers)
#objcheck = true

# Enable db quota management
#quota = true

# Set oplogging level where n is
#   0=off (default)
#   1=W
#   2=R
#   3=both
#   7=W+some reads
#oplog = 0

# Diagnostic/debugging option
#nocursors = true

# Ignore query hints
#nohints = true

# Disable the HTTP interface (Defaults to localhost:27018).
#nohttpinterface = true

# Turns off server-side scripting.  This will result in greatly limited
# functionality
#noscripting = true

# Turns off table scans.  Any query that would do a table scan fails.
#notablescan = true

# Disable data file preallocation.
#noprealloc = true

# Specify .ns file size for new databases.
# nssize = <size>

# Accout token for Mongo monitoring server.
#mms-token = <token>

# Server name for Mongo monitoring server.
#mms-name = <server-name>

# Ping interval for Mongo monitoring server.
#mms-interval = <seconds>

# Replication Options

# in replicated mongo databases, specify here whether this is a slave or master
#slave = true
#source = master.example.com
# Slave only: specify a single database to replicate
#only = master.example.com
# or
#master = true
#source = slave.example.com

# Address of a server to pair with.
#pairwith = <server:port>
# Address of arbiter server.
#arbiter = <server:port>
# Automatically resync if slave data is stale
#autoresync
# Custom size for replication operation log.
#oplogSize = <MB>
# Size limit for in-memory storage of op ids.
#opIdMem = <bytes>

# SSL options
# Enable SSL on normal ports
#sslOnNormalPorts = true
# SSL Key file and password
#sslPEMKeyFile = /etc/ssl/mongodb.pem
#sslPEMKeyPassword = pass

bind_ip – L’adresse IP d’écoute. Par défaut 127.0.0.1  ce qui signifie que l’on ne peut se connecter que localement. Pour autoriser toutes les connexions, choisir 0.0.0.0 .

port – Le port d’écoute de mongod 27017  par défaut.

quiet – Indique à mongod de ne logger que les erreurs critiques.

logpath – Chemin vers le fichier de log ou mongod va écrire son journal.

logappend – A positionner à true pour indiquer à mongod de ne pas rincer le fichier log à chaque démarrage.

journal – A positionner à true pour être sur que mongod garantisse la consistance des données qu’il stocke.

auth – Authentification, voir le chapitre suivant sur la sécurité.

Sécurité

EN cours

Installation et quelques tricks autour de Docker sur Debian

Installation

En fonction des plateformes il existe plusieurs méthodes, j’ai choisi celle conseillée par la documentation.

Installer les dépendances :

apt-get install apt-transport-https ca-certificates

Ajouter la clé GPG

apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D

Ajouter le dépot en fonction de votre configuration dans le fichier /etc/apt/sources.list.d/docker.list

Pour Jessie : deb https://apt.dockerproject.org/repo debian-jessie main

Pour les autres distributions, se fier à la documentation.

Enfin installer les paquets…

apt-get update
apt-get install docker-engine

Pour permettre à un utilisateur autre que root de contrôler Docker

# Add the docker group if it doesn't already exist.
$ sudo groupadd docker

# Add the connected user "${USER}" to the docker group.
# Change the user name to match your preferred user.
# You may have to logout and log back in again for
# this to take effect.
$ sudo gpasswd -a ${USER} docker

# Restart the Docker daemon.
$ sudo service docker restart

Configuration

Modifier les serveurs DNS

$ vi /etc/default/docker.io
 
# Use DOCKER_OPTS to modify the daemon startup options.
DOCKER_OPTS="-dns 208.67.220.220 -dns 208.67.220.222"

Installation de Docker Compose

Télécharger la version depuis GitHub

curl -L https://github.com/docker/compose/releases/download/1.6.2/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose

Et donner les droits d’éxécution :

chmod +x /usr/local/bin/docker-compose

Ajouter l’auto-completion pour le bash

curl -L https://raw.githubusercontent.com/docker/compose/$(docker-compose version --short)/contrib/completion/bash/docker-compose > /etc/bash_completion.d/docker-compose

Commandes

Lister les images disponibles

docker images -a

Stopper un conteneur détaché (docker run -d nom_conteneur)

docker stop nom_conteneur

Lister les conteneurs

docker container ls

 

 

Suite à venir

Sources

Installation

Nicolargo

https://docs.docker.com/engine/reference/run/

Let’s Encrypt et nginx

Afin de sécuriser mes différents sites j’utilisais un certificat standard non certifié. Puis est venu Let’s Encrypt qui permet d’avoir un certification toujours à jour et valide.

Installation

J’ai choisi une installation depuis GitHub :

git clone https://github.com/letsencrypt/letsencrypt /opt/letsencrypt –depth=1

Pour mettre à jour l’outil un git pull est suffisant.

Configuration

J’ai utilisé un fichier de configuration pour lister mes domaines.

# We use a 4096 bit RSA key instead of 2048
rsa-key-size = 4096

email = your@email.com
domains = domain.fr, sub.domain.fr

authenticator = webroot

# This is the webroot directory of your domain in which
# letsencrypt will write a hash in /.well-known/acme-challenge directory.
webroot-path = /var/www/html

Ajouter la configuration pour vos sites Nginx

server { 
    # .well-known doit resté accessible
    location ~ /\.well-known/acme-challenge {
          root /var/www/html/;
          try_files $uri /$1;
          allow all;;
    }

    # On interdit l'accès au dotfiles
    location ~ /\. { deny all; access_log off; log_not_found off; }
}

Génération des clés

/opt/letsencrypt/letsencrypt-auto certonly --config /usr/local/etc/le-domaine-webroot.ini

Ajout du block serveur sécurisé dans vos sites Nginx

server {

    # spdy pour Nginx < 1.9.5
    listen 443 ssl spdy;
    listen [::]:443 ssl spdy;
    spdy_headers_comp 9;

    # http2 pour Nginx >= 1.9.5
    #listen 443 ssl http2;
    #listen [::]:443 ssl http2;

    server_name mondomaine.fr;
    root /var/www/mondomaine.fr;
    index index.html index.htm;
    error_log /var/log/nginx/mondomaine.fr.log notice;
    access_log off;

    ####    Locations
    # On cache les fichiers statiques
    location ~* \.(html|css|js|png|jpg|jpeg|gif|ico|svg|eot|woff|ttf)$ { expires max; }
    # On interdit les dotfiles
    location ~ /\. { deny all; }


    #### SSL
    ssl on;
    ssl_certificate /etc/letsencrypt/live/mondomaine.fr/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/mondomaine.fr/privkey.pem;

    ssl_stapling on;
    ssl_stapling_verify on;
    ssl_trusted_certificate /etc/letsencrypt/live/mondomaine.fr/fullchain.pem;
    # Google DNS, Open DNS, Dyn DNS
    resolver 8.8.8.8 8.8.4.4 208.67.222.222 208.67.220.220 216.146.35.35 216.146.36.36 valid=300s;
    resolver_timeout 3s;



    ####    Session Tickets
    # Session Cache doit avoir la même valeur sur tous les blocs "server".
    ssl_session_cache shared:SSL:100m;
    ssl_session_timeout 24h;
    ssl_session_tickets on;
    # [ATTENTION] il faudra générer le ticket de session.
    ssl_session_ticket_key /etc/nginx/ssl/ticket.key;

    # [ATTENTION] Les paramètres Diffie-Helman doivent être générés
    ssl_dhparam /etc/nginx/ssl/dhparam4.pem;



    ####    ECDH Curve
    ssl_ecdh_curve secp384r1;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;
    ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!3DES:!MD5:!PSK';

}

Génération des clefs utilisées pour les sessions et le Diffie-Helman

mkdir -p /etc/nginx/ssl &&
openssl rand 48 -out /etc/nginx/ssl/ticket.key &&
openssl dhparam -out /etc/nginx/ssl/dhparam4.pem 4096

Ajouter la ligne suivante dans votre crontab -e

30 3 * * 0 /opt/letsencrypt/letsencrypt-auto renew >> /var/log/letsencrypt/renewal.log

 

Sources

Grafikart

 

Limiter l’accès de certains pays avec Nginx

Je suis récemment tombé sur un article décrivant comment bloquer l’accès de certains pays avec Nginx. J’ai donc décidé de bloquer les pays responsables de spams (commentaires indésirables). Je vais ici décrire la procédure sur Debian Jessie.

Tout d’abord vérifier que le module GOIP est  activé :

nginx -V

Si c’est le cas, la commande vous retournera quelque chose comme cela. C’est normalement la configuration par défaut sur Debian :

nginx version: nginx/1.x.x 
TLS SNI support enabled 
configure arguments: [...] --with-http_geoip_module [...]

Installer GEOIP :

apt-get install geoip-database libgeoip1

Puis créer le fichier /etc/nginx/conf.d/geo.conf

geoip_country /usr/share/GeoIP/GeoIP.dat;
map $geoip_country_code $allowed_country {
    default yes;
    BE no;
    FR no;
}

Via cette configuration, la France et la Belgique (désolé amis frontaliés) sont bloquées. Je vous laisse le soin d’ajouter d’autres pays…

Dans la le fichier de configuration du site web concerné, ajouter :

if ($allowed_country = no) {
        return 444;
}

Redémarrer le serveur :

service nginx configtest
service nginx restart

Au besoin, il possible de mettre à jour la base de données GEOIP

cd /usr/share/GeoIP/
wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCountry/GeoIP.dat.gz
gunzip GeoIP.dat.gz

A surveiller dans la durée dans vos logs. La manipulation fonctionne, je l’ai tester depuis un poste extérieur.

Source : JBNet.fr

Documentation Nginx : HttpGeoipModule

Liste des codes pays : ICI

 

Serveur Gigabyte BRIX

Mon Seagate Dockstar venant de rendre l’âme j’avais besoin d’une machine de remplacement.

Critères :

  • Basse consomation
  • Silencieux
  • Petit
  • Prix inférieur à 250€

Moi choix s’est porté sur le Gigabyte Brix GB-BXBT-J1900GB-XM33. Vendu 145€ chez LDLC, je lui ai ajouté un SSD Sandisk de 120Go et une barrette de 8Go (DDR3 lowvoltage) de mémoire (pour voir large). Un disque dur mécanique de 500Go (celui du Dockstar) vient conserver les données.

Gigabyte Brix J1900
Gigabyte Brix J1900

L’installation de Debian Jessie ne pose aucun problème. Niveau puissance c’est le jour et la nuit par rapport au Dockstar.

Pour le moment les services installés sont :

  • Serveur DNS
  • Serveur NGINX
  • MariaDb SQL
  • Subversion
  • Git
  • VPN

Celui-ci servira peut-être à terme de média center. Je dois encore faire quelques tests.

 

Matomo encountered an error: Uncaught Error: Class "Piwik\Plugins\CustomVariables\CustomVariables" not found in /var/www/piwik/core/Tracker/TrackerCodeGenerator.php:98 Stack trace: #0 /var/www/piwik/plugins/SitesManager/API.php(159): Piwik\Tracker\TrackerCodeGenerator->generate() #1 [internal function]: Piwik\Plugins\SitesManager\API->getJavascriptTag() #2 /var/www/piwik/core/API/Proxy.php(255): call_user_func_array() #3 /var/www/piwik/core/Context.php(28): Piwik\API\Proxy->Piwik\API\{closure}() #4 /var/www/piwik/core/API/Proxy.php(158): Piwik\Context::executeWithQueryParameters() #5 /var/www/piwik/core/API/Request.php(272): Piwik\API\Proxy->call() #6 /var/www/thegtricks/wp-content/plugins/wp-piwik/classes/WP_Piwik/Request/Php.php(46): Piwik\API\Request->process() #7 /var/www/thegtricks/wp-content/plugins/wp-piwik/classes/WP_Piwik/Request/Php.php(18): WP_Piwik\Request\Php->call() #8 /var/www/thegtricks/wp-content/plugins/wp-piwik/classes/WP_Piwik/Request.php(63): WP_Piwik\Request\Php->request() #9 /var/www/thegtricks/wp-content/plugins/wp-piwik/classes/WP_Piwik.php(1038): WP_Piwik\Request->perform() #10 /var/www/thegtricks/wp-content/plugins/wp-piwik/classes/WP_Piwik.php(1205): WP_Piwik->request() #11 /var/www/thegtricks/wp-content/plugins/wp-piwik/classes/WP_Piwik/TrackingCode.php(16): WP_Piwik->updateTrackingCode() #12 /var/www/thegtricks/wp-content/plugins/wp-piwik/classes/WP_Piwik.php(296): WP_Piwik\TrackingCode->__construct() #13 /var/www/thegtricks/wp-includes/class-wp-hook.php(324): WP_Piwik->addJavascriptCode() #14 /var/www/thegtricks/wp-includes/class-wp-hook.php(348): WP_Hook->apply_filters() #15 /var/www/thegtricks/wp-includes/plugin.php(517): WP_Hook->do_action() #16 /var/www/thegtricks/wp-includes/general-template.php(3066): do_action() #17 /var/www/thegtricks/wp-content/themes/twentyfifteen-child/footer.php(45): wp_footer() #18 /var/www/thegtricks/wp-includes/template.php(810): require_once('...') #19 /var/www/thegtricks/wp-includes/template.php(745): load_template() #20 /var/www/thegtricks/wp-includes/general-template.php(92): locate_template() #21 /var/www/thegtricks/wp-content/themes/twentyfifteen/archive.php(68): get_footer() #22 /var/www/thegtricks/wp-includes/template-loader.php(106): include('...') #23 /var/www/thegtricks/wp-blog-header.php(19): require_once('...') #24 /var/www/thegtricks/index.php(17): require('...') #25 {main} thrown (which lead to: Session must be started before any output has been sent to the browser; output started in /var/www/thegtricks/wp-includes/script-loader.php/2938)