{"id":3131,"date":"2019-11-19T15:30:18","date_gmt":"2019-11-19T14:30:18","guid":{"rendered":"https:\/\/blog.alwaysdata.com\/?p=3131"},"modified":"2019-11-19T17:59:54","modified_gmt":"2019-11-19T16:59:54","slug":"applications-multi-plateformes-avec-alwaysdata","status":"publish","type":"post","link":"https:\/\/blog.alwaysdata.com\/fr\/2019\/11\/19\/applications-multi-plateformes-avec-alwaysdata\/","title":{"rendered":"Applications multi-plateformes avec alwaysdata"},"content":{"rendered":"<p>Nous sommes parfois confront\u00e9s \u00e0&nbsp;des cas d\u2019utilisation o\u00f9 nous avons besoin de m\u00e9langer diff\u00e9rentes technologies pour ex\u00e9cuter nos applications. C\u2019est devenu un cas d\u2019utilisation si commun qu\u2019on le trouve \u00e0&nbsp;la base de l\u2019architecture <em>micro-services<\/em>. Nous avons tendance \u00e0&nbsp;m\u00e9langer les technologies pour obtenir l\u2019environnement le plus puissant qu\u2019elles peuvent offrir.<\/p>\n<figure class=\"embed-media__giphy\" style=\"width:65%; padding-bottom:calc(65% * (270 + 12) \/ (480 + 12))\">\n    <video id=\"giphy-${token}\" autoplay loop muted playsinline>\n        <source src=\"https:\/\/media.giphy.com\/media\/P4TqKx6NHyLnO\/giphy.mp4\" type=\"video\/mp4\">\n        <img decoding=\"async\" src=\"https:\/\/media.giphy.com\/media\/P4TqKx6NHyLnO\/giphy.gif\" alt=\" @Giphy\">\n    <\/video>\n<\/figure>\n<h2 id=\"ex\u00e9cuter-diff\u00e9rentes-versions-du-m\u00eame-interpr\u00e9teur\">Ex\u00e9cuter diff\u00e9rentes versions du m\u00eame interpr\u00e9teur<\/h2>\n<p>L\u2019une des fonctionnalit\u00e9s les plus puissantes (et, malheureusement, l\u2019une des moins connues) de l\u2019architecture d\u2019alwaysdata est le <strong>commutateur de versions<\/strong>&nbsp;!<\/p>\n<p>alwaysdata a&nbsp;toujours eu pour objectif de vous fournir un large \u00e9ventail d\u2019interpr\u00e9teurs&nbsp;: <em>PHP<\/em>, <em>Python<\/em>, <em>Node.js<\/em>, <em>Ruby<\/em>, <em>Erlang<\/em>\u2026 m\u00eame <em>Perl<\/em> sont support\u00e9s dans votre compte alwaysdata. Mais nous avons parfois besoin d\u2019une version sp\u00e9cifique. Qu\u2019en est-il si vous avez besoin d\u2019ex\u00e9cuter une application qui n\u00e9cessite une version minimale&nbsp;? Disons, <em>Node.js 10<\/em>&nbsp;? Votre compte est <em>pr\u00e9-provisionn\u00e9<\/em> avec un large \u00e9ventail de versions pour chaque langage. Par exemple, <em>Node.js<\/em> est livr\u00e9 avec toutes les versions suivantes (au moment o\u00f9 j\u2019\u00e9cris ces lignes)&nbsp;:<\/p>\n<ul>\n<li>12.0.0<\/li>\n<li>11.12.0<\/li>\n<li>11.8.0<\/li>\n<li>11.1.0<\/li>\n<li>11.0.0<\/li>\n<li>10.15.3<\/li>\n<li>10.15.1<\/li>\n<li>10.13.0<\/li>\n<li>10.12.0<\/li>\n<li>10.9.0<\/li>\n<li>9.11.2<\/li>\n<li>8.15.1<\/li>\n<li>8.15.0<\/li>\n<li>8.12.0<\/li>\n<li>8.11.4<\/li>\n<li>6.17.0<\/li>\n<li>6.16.0<\/li>\n<li>6.14.4<\/li>\n<\/ul>\n<p>Wow. \u00c7a fait\u2026 <em>beaucoup<\/em>&nbsp;!<\/p>\n<p>Nous pouvons donc sp\u00e9cifier la version \u00e0&nbsp;utiliser gr\u00e2ce au commutateur de versions, sous forme d\u2019une <em>variable d\u2019environnement<\/em>&nbsp;:<\/p>\n<pre><code>$ NODEJS_VERSION=11.8.0 node --version\nv11.8.0<\/code><\/pre>\n<p>Il est \u00e9galement possible d\u2019\u00eatre moins sp\u00e9cifique pour s\u2019en tenir \u00e0&nbsp;la derni\u00e8re <em>release majeure<\/em> d\u2019une version donn\u00e9e&nbsp;:<\/p>\n<pre><code>$ NODEJS_VERSION=11 node --version\nv11.12.0<\/code><\/pre>\n<p>Le <em>commutateur de versions<\/em> est disponible pour <strong>tous<\/strong> les interpr\u00e9teurs int\u00e9gr\u00e9s dans votre compte&nbsp;: <code>PYTHON_VERSION<\/code>,<code>PHP_VERSION<\/code>, <em>etc<\/em>. Vous pouvez r\u00e9cup\u00e9rer une liste de toutes les versions disponibles dans la page d\u00e9di\u00e9e au langage concern\u00e9 dans votre interface d\u2019administration&nbsp;: Environnement &gt; <em>[Langage]<\/em>.<\/p>\n<h2 id=\"m\u00e9langez-les-tous-le-cas-dutilisation-kresus1\">M\u00e9langez-les tous&nbsp;: le cas d\u2019utilisation <a href=\"https:\/\/kresus.org\">Kresus<\/a><\/h2>\n<p>Cas pratique avec le projet <a href=\"https:\/\/kresus.org\">Kresus<\/a>. <em>Kresus<\/em> est un gestionnaire de finances personnelles qui peut se connecter \u00e0&nbsp;votre compte bancaire en ligne en utilisant une biblioth\u00e8que d\u00e9di\u00e9e&nbsp;: <a href=\"http:\/\/weboob.org\">Weboob<\/a>. L\u2019ensemble de mani\u00e8re auto-h\u00e9berg\u00e9e, puisque, nous l\u2019avons d\u00e9j\u00e0 dit&nbsp;: <a href=\"https:\/\/blog.alwaysdata.com\/fr\/2018\/01\/28\/pourquoi-la-vie-privee-est-elle-importante\/\">la vie priv\u00e9e est importante<\/a>.<\/p>\n<p>Mais <em>Kresus<\/em> est \u00e9crit en <em>Node.js<\/em> et attend une version de <code>node<\/code> &gt;= 10, quand <em>Weboob<\/em> est \u00e9crit en <em>Python<\/em> et n\u00e9cessite <code>python<\/code> &gt;= 3. Alors m\u00e9langeons-les&nbsp;!<\/p>\n<figure class=\"embed-media__ad__medium embed-media__ad__\">\n    <img decoding=\"async\" src=\"\/wp-content\/uploads\/2019\/11\/kresus_view-all-accounts.png\" alt=\"Kresus : Vue des comptes\" class=\"aligncenter size-full wp-image-\">\n    <figcaption>Kresus&nbsp;: Vue des comptes<\/figcaption>\n<\/figure>\n<p>Connectez-vous \u00e0&nbsp;votre compte en utilisant <em>SSH<\/em>, et cr\u00e9ez un r\u00e9pertoire pour h\u00e9berger le projet&nbsp;:<\/p>\n<pre class><code>$ mkdir ~\/kresus\n$ cd ~\/kresus<\/code><\/pre>\n<h3 id=\"installer-weboob\">Installer Weboob<\/h3>\n<p>Nous allons cr\u00e9er un <code>virtualenv<\/code> Python pour <em>Weboob<\/em> qui h\u00e9bergera la biblioth\u00e8que et ses composants&nbsp;:<\/p>\n<pre><code>$ PYTHON_VERSION=3 python -m venv ~\/kresus\/weboob\n$ source ~\/kresus\/weboob\/bin\/activate\n(weboob) $ pip install git+https:\/\/git.weboob.org\/weboob\/weboob.git\n(weboob) $ weboob-config update\n(weboob) $ deactivate<\/code><\/pre>\n<h3 id=\"installer-kresus\">Installer Kresus<\/h3>\n<p>Nous sommes maintenant pr\u00eats \u00e0&nbsp;installer le gestionnaire <em>Kresus<\/em>. Nous devons d\u2019abord installer le gestionnaire de paquets <code>yarn<\/code>, car <em>Kresus<\/em> s\u2019en sert pour les t\u00e2ches de compilation&nbsp;:<\/p>\n<pre><code>$ NODEJS_VERSION=12 npm install --global yarn<\/code><\/pre>\n<p>C\u2019est une <em>autre puissante fonctionnalit\u00e9<\/em> du PaaS alwaysdata&nbsp;: m\u00eame si vous n\u2019\u00eates pas <code>root<\/code>, vous pouvez installer les d\u00e9pendances <strong>de mani\u00e8re globale<\/strong>&nbsp;! Gr\u00e2ce \u00e0&nbsp;nos fonctionnalit\u00e9s de <em>wrapping<\/em>, tout est isol\u00e9 dans votre compte, et consid\u00e9r\u00e9 comme un outil syst\u00e8me par vos gestionnaires de paquets&nbsp;!<\/p>\n<p>Installons maintenant le projet&nbsp;:<\/p>\n<pre class><code>$ git clone https:\/\/framagit.org\/kresusapp\/kresus.git ~\/kresus\/app\n$ cd ~\/kresus\/app\n$ NODEJS_VERSION=12 npm install\n$ NODEJS_VERSION=12 npm run build:prod<\/code><\/pre>\n<h3 id=\"lancer-le-service\">Lancer le service<\/h3>\n<p>Nous sommes pr\u00eats \u00e0&nbsp;faire fonctionner le service&nbsp;!<\/p>\n<p>Cr\u00e9ez un <a href=\"https:\/\/admin.alwaysdata.com\/site\/add\/\">nouveau site<\/a> dans votre panneau d\u2019administration \u00e0&nbsp;<em>Web &gt; Sites &gt; Ajouter un site<\/em>. S\u00e9lectionnez un site <em>Node.js<\/em> et sp\u00e9cifiez la version <code>12.0.0<\/code>.<\/p>\n<figure class=\"embed-media__ad__medium embed-media__ad__\">\n    <img decoding=\"async\" src=\"\/wp-content\/uploads\/2019\/11\/Screenshot_2019-11-18-administration-alwaysdata.png\" alt=\"Interface d'administration : site Node.js\" class=\"aligncenter size-full wp-image-\">\n    <figcaption>Interface d\u2019administration&nbsp;: site Node.js<\/figcaption>\n<\/figure>\n<p>Voici les param\u00e8tres&nbsp;:<\/p>\n<ul>\n<li>Commande&nbsp;: <code>node bin\/kresus<\/code><\/li>\n<li>R\u00e9pertoire de travail&nbsp;: <code>kresus\/app<\/code>.<\/li>\n<li>Environnement&nbsp;: <code>NODE_ENV=production HOST=[IP] KRESUS_DIR=\/home\/[username]\/kresus\/data KRESUS_PYTHON_EXEC=\/home\/[username]\/kresus\/weboob\/bin\/python KRESUS_SALT=[longue cha\u00eene al\u00e9atoire]<\/code><\/li>\n<\/ul>\n<p>Veillez \u00e0&nbsp;remplacer les valeurs suivantes&nbsp;:<\/p>\n<ul>\n<li><code>IP<\/code>&nbsp;: l\u2019<em>IPv4<\/em> sur laquelle l\u2019application doit \u00e9couter, indiqu\u00e9 sous le champ <em>Commande<\/em>. Cette adresse est sp\u00e9cifique \u00e0&nbsp;chaque application, et les outils Node.js s\u2019attendent g\u00e9n\u00e9ralement \u00e0&nbsp;ce qu\u2019elle soit expos\u00e9e par la variable d\u2019environnement <code>HOST<\/code> (nous travaillons sur ce&nbsp;point).<\/li>\n<li><code>nom d'utilisateur<\/code>&nbsp;: le nom de votre compte alwaysdata<\/li>\n<li><code>longue cha\u00eene al\u00e9atoire<\/code>&nbsp;: une cha\u00eene al\u00e9atoire d\u2019au moins 16 caract\u00e8res utilis\u00e9e par <em>Kresus<\/em> pour s\u00e9curiser les sessions.<\/li>\n<\/ul>\n<p>Vous pouvez \u00e9galement v\u00e9rifier l\u2019option <em>Forcer le HTTPS<\/em> dans l\u2019onglet SSL pour assurer une connexion s\u00e9curis\u00e9e.<\/p>\n<p>Termin\u00e9&nbsp;! Lancez votre application en visitant l\u2019URL du site. La premi\u00e8re connexion peut prendre un peu de temps en raison de l\u2019initialisation de la base de donn\u00e9es, ainsi que la r\u00e9cup\u00e9ration du premier compte bancaire. Prenez un caf\u00e9 et soyez patient.<\/p>\n<figure class=\"embed-media__giphy\" style=\"width:65%; padding-bottom:calc(65% * (500 + 12) \/ (500 + 12))\">\n    <video id=\"giphy-${token}\" autoplay loop muted playsinline>\n        <source src=\"https:\/\/media.giphy.com\/media\/687qS11pXwjCM\/giphy.mp4\" type=\"video\/mp4\">\n        <img decoding=\"async\" src=\"https:\/\/media.giphy.com\/media\/687qS11pXwjCM\/giphy.gif\" alt=\" @Giphy\">\n    <\/video>\n<\/figure>\n<hr>\n<p>Ce n\u2019est qu\u2019un petit exemple des puissantes fonctionnalit\u00e9s que nous offrons sur alwaysdata.<\/p>\n<p>Au cours des prochaines semaines, nous migrerons notre plateforme vers une nouvelle version et nous introduirons une nouvelle fonctionnalit\u00e9 \u00e0&nbsp;la surcouche de <em>wrapping<\/em> pour vous permettre d\u2019acc\u00e9der \u00e0&nbsp;la version de votre choix de n\u2019importe quel interpr\u00e9teur. Le <em>commutateur de versions<\/em> reste disponible, mais vous pourrez utiliser directement <code>node12<\/code> ou <code>python3.7<\/code> plut\u00f4t que de passer par les variables d\u2019environnement.<\/p>\n<p>Rendez-vous dans quelques semaines pour ces nouvelles fonctionnalit\u00e9s&nbsp;! D\u2019ici l\u00e0, <a href=\"https:\/\/www.alwaysdata.com\/fr\/inscription\/\">lancez votre propre instance de <em>Kresus<\/em><\/a>&nbsp;!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Propulsez des architectures en #microservices chez alwaysdata&nbsp;?&nbsp;Bien s\u00fbr que c\u2019est possible&nbsp;!&nbsp;L\u2019exemple avec @kresusapp et le commutateur de #versions.<\/p>\n","protected":false},"author":12,"featured_media":3138,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"wp_typography_post_enhancements_disabled":false,"footnotes":""},"categories":[1],"tags":[11,228,111,118,103,93,94,74],"class_list":["post-3131","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized","tag-dedicated-servers","tag-features","tag-free-offer","tag-languages","tag-security","tag-shared-servers","tag-vps-servers","tag-websites"],"acf":[],"_links":{"self":[{"href":"https:\/\/blog.alwaysdata.com\/fr\/wp-json\/wp\/v2\/posts\/3131","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.alwaysdata.com\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.alwaysdata.com\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.alwaysdata.com\/fr\/wp-json\/wp\/v2\/users\/12"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.alwaysdata.com\/fr\/wp-json\/wp\/v2\/comments?post=3131"}],"version-history":[{"count":0,"href":"https:\/\/blog.alwaysdata.com\/fr\/wp-json\/wp\/v2\/posts\/3131\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.alwaysdata.com\/fr\/wp-json\/wp\/v2\/media\/3138"}],"wp:attachment":[{"href":"https:\/\/blog.alwaysdata.com\/fr\/wp-json\/wp\/v2\/media?parent=3131"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.alwaysdata.com\/fr\/wp-json\/wp\/v2\/categories?post=3131"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.alwaysdata.com\/fr\/wp-json\/wp\/v2\/tags?post=3131"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}