@genezys @gmonserand Du stress à la tranquillité · 100% docker-compose : dev + test + production...

Post on 26-May-2020

9 views 0 download

Transcript of @genezys @gmonserand Du stress à la tranquillité · 100% docker-compose : dev + test + production...

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