Réduire les risquesDu stress à la tranquillité
@genezys @gmonserand
L’apocalypse(avec un tout petit peu d’exagération)
100% docker-compose : dev + test + production
Rails, builder android, gitlab, gitlab-ci, backup, vpn
Capistrano → docker-compose + custom script pour rails
jwilder/nginx-proxy
jwilder/nginx-proxy80, 443
www (jekyll+nginx)80
dlcenter (sinatra)80
jwilder/nginx-proxy
Un conteneur par domaine$ docker ps --format "table {{.Names}}\t{{.Image}}\t{{.Ports}}"NAMES IMAGE PORTSwww_app_1 www_app 80/tcpdlcenter_app_1 dlcenter_app 80/tcpnginxproxy_app_1 nginxproxy_app 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp
Dockerfile “Site perso jekyll”from nginxADD _site /usr/share/nginx/html/
docker-compose.ymlapp: restart: unless-stopped build: . environment:
VIRTUAL_HOST: simkim.net,www.simkim.net,www.localhost,www.${USER}.tns
jwilder/nginx-proxy
bo.touch-sell.net web.touch-sell.net doc.cust.touch-sell.net
Serveur Production
jwilder/nginx-proxy
bo.server1.tns web.server1.tns appomatic.tns
Serveur Dev
jwilder/nginx-proxy
bo.localhostbo.vincent.tns
web.localhostweb.vincent.tns
appomatic.localhostappomatic.vincent.tns
Développeur
Chez Touch & Sell
Configuration DNSzone tns
*.gauthier CNAME gauthier
*.vincent CNAME vincent
*.armand CNAME armand
*.server1 CNAME server1
zone localhost
* A 127.0.0.1
D’autres services existent →
myapp.192.168.0.1.xip.io
JrCs/docker-letsencrypt-nginx-proxy-companion
Let’s encrypt
Génération automatique et gratuite de certificats SSL reconnus par les navigateurs
=Plus aucune excuse
Let’s encrypt
Oui mais …
… j’ai plusieurs applications
… mon port est déjà bindé, le client lets encrypt ne fonctionne pas
Vous me faites répéter ...
PLUS AUCUNE EXCUSE !!
docker-compose.ymlapp: restart: unless-stopped image: jwilder/nginx-proxy ports: - "80:80" - "443:443" volumes: - /var/run/docker.sock:/tmp/docker.sock - nginxproxy_certs:/etc/nginx/certs - nginxproxy_vhosts:/etc/nginx/vhost.d - nginxproxy_html:/usr/share/nginx/htmlletsencrypt: restart: unless-stopped image: jrcs/letsencrypt-nginx-proxy-companion volumes: - /var/run/docker.sock:/var/run/docker.sock:ro - nginxproxy_vhosts:/etc/nginx/vhost.d - nginxproxy_certs:/etc/nginx/certs:rw - nginxproxy_html:/usr/share/nginx/html environment: - NGINX_PROXY_CONTAINER=nginxproxy_app_1
docker-compose.ymlapp: restart: unless-stopped build: . environment:
VIRTUAL_HOST: simkim.net,www.simkim.net,www.localhost,www.${USER}.tnsLETSENCRYPT_HOST: simkim.net,www.simkim.netLETSENCRYPT_EMAIL: ***@simkim.net
Tester sa configuration SSLhttps://www.ssllabs.com/ssltest/analyze.html?d=simkim.net&latest
zero downtime deployment
ImmutabilitéImmutabilité est incompatible avec le rechargement “In process”
État final = docker-compose up
Attention1 seul noeud
Nous sommes encore en train d’apprendre et d'expérimenter
L’écosystème évolue vite
config/environments/staging.envvarsexport DOCKER_HOST=tcp://server1.tns:2376export DOCKER_TLS_VERIFY=1export COMPOSE_FILE=docker-compose.prod.ymlexport COMPOSE_PROJECT_NAME=stagingexport TASBO_HOST=staging.server1.tnsexport TASBO_PROTOCOL=httpexport PS1="$PS1\e[1;4;7;38;5;208m!!! STAGING !!!\e[0m \$ "
bin/deploy-appdocker-compose builddocker-compose run --rm app sh -c "bin/bundle check || bin/bundle install"docker-compose run --rm app bin/rake assets:precompile
TIME="Down time: %E" time bash -c “docker-compose run --rm web touch maintenance/enabled # Activation de la page de maintenance sur le front
docker-compose up -d app… while+sleep+curl : Attente du lancement effectif
docker-compose run --rm web rm maintenance/enabled # Suppression de la page de maintenance
“ → 19 secondes de downtime
Legacy → Ancienne application android wipe les données si json non valide (ex: page maintenance)
bin/deploy-fast-appdocker-compose builddocker-compose run --rm app rake db:abort_if_pending_migrations # On stoppe s’il y a des migrationsdocker-compose run --rm app sh -c "bin/bundle check || bin/bundle install"docker-compose run --rm app bin/rake assets:precompile
docker-compose run … une nouvelle instance temporaire de l’app… while+sleep+curl : Attente du lancement effectifdocker-compose exec … sed + nginx -s reload pour pointer sur la nouvelle instance temporaire
docker-compose up … pour recréer une nouvelle instance de l’application… while+sleep+curl : Attente du lancement effectifdocker-compose exec … sed + nginx -s reload pour pointer sur la nouvelle instance
… Arrêt de l’instance temporaire
simkim/tcpdam
Objectifs
Retenir pendant quelque temps les connexions tcp entrantes
Indépendant de la stack technique
Indépendant du protocole
docker-compose.yml
tcpdam -d # Lance le barrage
Ctrl-C # Ouvre le barrage, attend qu’il se vide
dam:image: simkim/tcpdamports:- "9999:9999"environment:
TCPDAM_REMOTE_ADDRESS: "localhost:80"TCPDAM_DEBUG: "1"
démo !
Encore jeuneDémarré il y a deux semaines
Intégré à notre process de déploiement rails d’ici la fin de l’été
Juste entre le premier switch de serveur nginx : tcpdam + rake db:migrate
Disponible sur githubTester
Remonter les problèmes
Challenger la scalabilité
Demander des fonctionnalités