{"id":58,"date":"2021-02-20T11:48:50","date_gmt":"2021-02-20T10:48:50","guid":{"rendered":"https:\/\/www.webdot.fr\/blog\/?p=58"},"modified":"2021-04-30T10:46:35","modified_gmt":"2021-04-30T08:46:35","slug":"installation-de-docker-et-de-traefik","status":"publish","type":"post","link":"https:\/\/www.webdot.fr\/blog\/2021\/02\/installation-de-docker-et-de-traefik\/","title":{"rendered":"Installation de Docker et de Traefik sur un NAS ASUSTOR"},"content":{"rendered":"\n<p>La probl\u00e9matique est la suivante. Je souhaite un reverse proxy permettant d&rsquo;acc\u00e9der de l&rsquo;ext\u00e9rieur (internet) \u00e0 toutes les applications internes, sans ouvrir de ports. La solution c&rsquo;est le reverse proxy. Asus Data Master (ADM pour les intimes) a bien un outil appel\u00e9 reverse proxy qui permet d&rsquo;acc\u00e9der en <em>https<\/em> \u00e0 une application ou un service tournant en interne de fa\u00e7on non s\u00e9curis\u00e9e (<em>http<\/em>), mais pour ceci il faut ouvrir un port \u00ab\u00a0externe\u00a0\u00bb qui sera associ\u00e9 au port interne de l&rsquo;application vis\u00e9e, donc on revient quelque part au point de d\u00e9part.<\/p>\n\n\n\n<p>En fouillant un peu, j&rsquo;ai trouv\u00e9 l&rsquo;outil qu&rsquo;il me fallait : <a href=\"https:\/\/traefi.io\">Traefik<\/a>. Cet outil est nativement un reverse-proxy.<\/p>\n\n\n\n<p>Cependant, pour l&rsquo;installer de fa\u00e7on la plus pratique, il s&rsquo;av\u00e8re qu&rsquo;il est pr\u00e9f\u00e9rable de passer par <em>Docker<\/em>. <em>Docker<\/em> est une sorte d&rsquo;outil permettant de virtualiser des applications sp\u00e9cifiques, de fa\u00e7on qu&rsquo;elles tournent sur leur propre syst\u00e8me et ne d\u00e9pendent pas du syst\u00e8me sur lequel elles doivent tourner. Il se trouve que c&rsquo;est extr\u00eamement pratique pour installer sur des syst\u00e8mes \u00ab\u00a0propri\u00e9taires\u00a0\u00bb comme ce qui fait tourner un NAS (e.g. ADM pour Asustor, pour Synology ou pour QNap). On utilise pour \u00e7a des distributions ultra-l\u00e9g\u00e8res de GNU\/Linux qui sont donc des syst\u00e8mes ind\u00e9pendants. <\/p>\n\n\n\n<p><strong>  Installation de Docker<\/strong><\/p>\n\n\n\n<p>Pour installer <em>Docker<\/em> sur ADM, rien de plus simple puisque l&rsquo;application est support\u00e9e par AppCentral (le syst\u00e8me de gestion des applications de ADM). Dans la foul\u00e9e, j&rsquo;ai \u00e9galement install\u00e9 <em>Portainer CE<\/em> (Community Edition) qui est une interface graphique permettant de g\u00e9rer l&rsquo;installation et la gestion de docker divers, simple \u00e0 prendre en main, surtout pour quelqu&rsquo;un qui ne connai(ssai)t pas <em>Docker<\/em> (comme moi).<\/p>\n\n\n\n<p><strong>Installation de Traefik<\/strong><\/p>\n\n\n\n<p>Apr\u00e8s avoir tent\u00e9 d&rsquo;aller au plus simple en installer Traefik directement de Portainer, je me suis finalement convaincu de mettre un peu la main \u00e0 la p\u00e2te et l&rsquo;installer manuellement. Dans mon installation, les r\u00e9pertoires Docker install\u00e9s par ADM sont situ\u00e9s dans \/volume1\/ Docker. J&rsquo;ai cr\u00e9\u00e9 un r\u00e9pertoire \u00ab\u00a0Traefik\u00a0\u00bb dans celui-ci et cr\u00e9\u00e9 les fichiers suivants. Portainer reste un outil puissant pour la gestion des dockers, pour les arr\u00eater, les red\u00e9marrer, g\u00e9rer les volumes etc.   <\/p>\n\n\n\n<p>Dernier d\u00e9tail, mais essentiel ! En raison de cette probl\u00e9matique du serveur apache du NAS qui ne l\u00e2che pas les ports 80 et 443, mais lance une instance d&rsquo;un autre serveur (lighttpd en l&rsquo;occurrence) il faut rediriger les ports 80 et 443 de la box internet, sur des ports libres sur le NAS, par ex. 89 et 449 respectivement, et c&rsquo;est ces derniers qu&rsquo;il faut rediriger dans le docker Traefik ce qui explique les lignes dans le fichier docker-compose.yml ci-dessous :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>...\n# les ports redirig\u00e9s dans le docker\n    - \"449:443\"\n    - \"89:80\"\n...<\/code><\/pre>\n\n\n\n<p><em>Avant de se lancer dans ce qui suit, il est important de cr\u00e9er en avance de phase les domaines. Personnellement j&rsquo;ai achet\u00e9 pour trois francs six sous un nom de domaine chez OVH : www.webdot.fr. Puis j&rsquo;ai cr\u00e9\u00e9 tous les sous-domaines que j&rsquo;utilise en CNAME. Si le sous-domaine n&rsquo;existe pas lancer traefik au terme de tout ce qui suit g\u00e9r\u00e8rera une erreur.<\/em><\/p>\n\n\n\n<p>Voici le fichier <a href=\"https:\/\/www.webdot.fr\/blog\/wp-content\/uploads\/2021\/04\/docker-compose.yml_.txt\" target=\"_blank\" rel=\"noreferrer noopener\"><em>docker-compose.yml<\/em> <\/a>: j&rsquo;ai mis quelques commentaires dans le texte<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>version: '3.4'\n\nservices:\n\n  reverse-proxy:\n\n    restart: always # politique de red\u00e9marrage\n    image: traefik:latest # c'est l'image qui est t\u00e9l\u00e9charg\u00e9e et sur laquelle va se baser votre propre installation\n    container_name: Traefik # le nom du docker tel qu'il appara\u00eetra dans votre installation\nports: # les ports redirig\u00e9s dans le docker\n    - \"449:443\"\n    - \"89:80\"\n    network_mode: bridge # le nom du \"r\u00e9seau\" propre aux images docker qui tournent\n\n    environment: # tout ce bloc est destin\u00e9 \u00e0 g\u00e9rer les certificats de Let's Encrypt des diff\u00e9rents sous-domaines en une seule passe. \n\n    - \"TZ=Europe\/Paris\"\n    - \"OVH_ENDPOINT=ovh-eu\"\n    - \"OVH_APPLICATION_KEY=xxxxxxxxxxxxxxxxxxx\"\n    - \"OVH_APPLICATION_SECRET=xxxxxxxxxxxxxxxxxxxxxxxxxxx\"\n    - \"OVH_CONSUMER_KEY=xxxxxxxxxxxxxxxxxxxxxxxxxx\"\n\n    volumes: # les volumes mont\u00e9s permettent de conserver les modifications que les fichiers de configuration ou dans des r\u00e9pertoires. On peut faire un lien (bind) ou monter un vrai r\u00e9pertoire du syst\u00e8me h\u00f4te sur le r\u00e9pertoire interne du docker. \n\n    - \/volume1\/Docker\/Traefik\/traefik.log:\/traefik.log\n    - \/volume1\/Docker\/Traefik\/traefik.toml:\/etc\/traefik\/traefik.toml\n    - \/volume1\/Docker\/Traefik\/services.toml:\/etc\/traefik\/services.toml\n    - \/volume1\/Docker\/Traefik\/acme.json:\/acme.json\n    - \/var\/run\/docker.sock:\/var\/run\/docker.sock\n\n    labels:\n\n    - \"traefik.enable=true\"\n\n    # http to https redirection\n    - \"traefik.protocols=https\"\n    - \"traefik.http.middlewares.https_redirect.redirectscheme.scheme=https\"\n    - \"traefik.http.middlewares.https_redirect.redirectscheme.permanent=true\"\n    - \"traefik.http.routers.redirs.rule=hostregexp(`{host:.+}`)\"  \n    - \"traefik.http.routers.redirs.entrypoints=http\"  \n    - \"traefik.http.routers.redirs.middlewares=https_redirect\"  \n\n    # Traefik dashboard ==&gt; c'est le bloc qui permet d'acc\u00e9der \u00e0 l'interface traefik pour voir son fonctionnement et d\u00e9terminer les bugs \u00e9ventuels\n    - \"traefik.http.routers.api.rule=Host(`traefik.webdot.fr`)\"\n    - \"traefik.http.routers.api.service=api@internal\"\n    - \"traefik.http.routers.api.entrypoints=https,http\"\n    - \"traefik.http.routers.api.middlewares=https_redirect\"\n    - \"traefik.http.routers.api.tls=true\"\n    - \"traefik.http.routers.api.tls.certresolver=letsencrypt\"\n    #- \"traefik.http.middlewares.auth.basicauth.users=admin:$$apr1$$Wkc.0oXU$$wd24kJ89JhbcGoMruIynk1\"\n\n    # Docker interface ==&gt; pour acc\u00e9der \u00e0 l'interface de Portainer\n    - \"traefik.http.routers.docker.entrypoints=https,http\"\n    - \"traefik.http.routers.docker.middlewares=https_redirect\"\n    - \"traefik.http.routers.docker.rule=Host(`docker.webdot.fr`)\"\n    - \"traefik.http.routers.docker.service=docker@file\"\n    - \"traefik.http.routers.docker.tls=true\"\n    - \"traefik.http.routers.docker.tls.certresolver=letsencrypt\"\n\n    # Apache2 reverse proxy ==&gt; Permet de remplacer le serveur Apache du NAS, j'y reviendrai\n    - \"traefik.http.routers.www.entrypoints=https,http\"\n    - \"traefik.http.routers.www.middlewares=https_redirect\"\n    - \"traefik.http.routers.www.rule=Host(`www.webdot.fr`)\"\n    - \"traefik.http.routers.www.service=www@file\"\n    - \"traefik.http.routers.www.tls=true\"\n    - \"traefik.http.routers.www.tls.certresolver=letsencrypt\"\n\n    # Nextcloud service ==&gt; pour l'acc\u00e8s \u00e0 Nextcloud\n    - \"traefik.http.routers.cloud.rule=Host(`cloud.webdot.fr`)\" # ligne 1\n    - \"traefik.http.routers.cloud.entrypoints=https\" # ligne 2\n    - \"traefik.http.routers.cloud.middlewares=https_redirect\" # ligne 3\n    - \"traefik.http.routers.cloud.service=cloud@file\" # ligne 4\n    - \"traefik.http.routers.cloud.tls=true\" # ligne 5\n    - \"traefik.http.routers.cloud.tls.certresolver=letsencrypt\" # ligne 6\n\n.......... Et vous pouvez mettre plein d'autres blocs sur le sch\u00e9ma du bloc pour Nextcloud ci-dessous.<\/code><\/pre>\n\n\n\n<p>Prenons l&rsquo;exemple d&rsquo;un bloc : Nextcloud. Le bloc permet de d\u00e9terminer le sous-domaine qui permettra d&rsquo;acc\u00e9der au service (ligne #1), de sp\u00e9cifier qu&rsquo;on souhaite passer par un acc\u00e8s s\u00e9curis\u00e9 (lignes #2 et #3). Pour ceci on d\u00e9finit un \u00ab\u00a0service\u00a0\u00bb qui relie au fichier service.toml dont je parle ci-dessous et qui relie le sous-domaine \u00e0 l&rsquo;acc\u00e8s non s\u00e9curis\u00e9 du service ou de l&rsquo;application (ligne #4). Les deux derni\u00e8res lignes (lignes #5 et #6) s&rsquo;occupent de la gestion des certificats Let&rsquo;s Encrypt en passant par un \u00ab\u00a0resolver\u00a0\u00bb d\u00e9fini dans le fichier traefik.toml ci-dessous. Il faut noter que Traefik <strong>g\u00e8re automatiquement la reg\u00e9n\u00e9ration des certificats <\/strong>avant qu&rsquo;ils ne soient caduques (tous les trois mois).<\/p>\n\n\n\n<p><em>services.toml<\/em> : dans ce fichier on fait le lien entre un bloc sous-domaine du fichier <em>docker-compose.yml<\/em> et l&rsquo;acc\u00e8s non s\u00e9curis\u00e9 en interne de l&rsquo;application ou du service : par exemple, on associe le service \u00ab\u00a0cloud\u00a0\u00bb \u00e0 l&rsquo;url <em>http:\/\/192.168.1.140:32680<\/em>. Le sous-domaine qui permet d&rsquo;y acc\u00e9der est d\u00e9fini dans le bloc correspondant (cloud) dans le fichier <em>docker-compose.yml<\/em>.<\/p>\n\n\n\n<p>Le dernier bloc renvoie simplement le flux web (80\/443) sur le serveur Apache du NAS.<\/p>\n\n\n\n<pre id=\"block-5dad2f3a-167d-4e06-865f-a663be22a3a2\" class=\"wp-block-code\"><code>&#91;http]\n  &#91;http.services]\n    &#91;http.services.docker]\n      &#91;http.services.docker.loadBalancer]\n        &#91;&#91;http.services.docker.loadBalancer.servers]]\n          url = \"http:\/\/192.168.1.140:19900\"\n    &#91;http.services.cloud]\n      &#91;http.services.cloud.loadBalancer]\n        &#91;&#91;http.services.cloud.loadBalancer.servers]]\n          url = \"http:\/\/192.168.1.140:32680\"\n    &#91;http.services.www]\n      &#91;http.services.www.loadBalancer]\n        &#91;&#91;http.services.www.loadBalancer.servers]]\n          url = \"http:\/\/192.168.1.140\"\n\n.......... Et \u00e0 chaque bloc du fichier docker-compose.yml il faut associer un bloc de 4 lignes comme pour le service \"cloud\"\n<\/code><\/pre>\n\n\n\n<p>Enfin, il faut un troisi\u00e8me fichier qui permet de sp\u00e9cifier ports, fichiers, gestionnaire de certificats et niveau de log le cas \u00e9ch\u00e9ant. C&rsquo;est le fichier <em>traefik.toml<\/em>.<\/p>\n\n\n\n<pre id=\"block-bec25555-75e7-4cd9-94b9-b1fd68a896e2\" class=\"wp-block-code\"><code>&#91;entryPoints.https]\n  address = \":443\"\n\n&#91;serversTransport]\n  insecureSkipVerify = true\n\n&#91;api]\n   \n&#91;providers.docker]\n  endpoint = \"unix:\/\/\/var\/run\/docker.sock\"\n          \n&#91;providers.file]\n  filename = \"\/etc\/traefik\/services.toml\"\n\n&#91;certificatesResolvers.letsencrypt.acme]\n  email = \"xxx@webdot.fr\"\n  storage = \"\/acme.json\"\n#  caserver = \"https:\/\/acme-staging-v02.api.letsencrypt.org\/directory\"\n  &#91;certificatesResolvers.letsencrypt.acme.httpChallenge]\n    entryPoint = \"http\"\n#  &#91;certificatesResolvers.letsencrypt.acme.dnsChallenge]\n#    provider: ovh\n#    delayBeforeCheck: 0\n\n&#91;log]\n  filePath = \"\/traefik.log\"\n  level = \"ERROR\" # on peut fixer le niveau de log \u00e0 DEBUG, PANIC, FATAL, ERROR, WARN ou INFO\n<\/code><\/pre>\n\n\n\n<p>Attention : la ligne <\/p>\n\n\n\n<pre id=\"block-1131a2d7-e7c8-46d4-af90-3ea98985c616\" class=\"wp-block-code\"><code>#  caserver = \"https:\/\/acme-staging-v02.api.letsencrypt.org\/directory\"<\/code><\/pre>\n\n\n\n<p>est tr\u00e8s importante. Il est indispensable de d\u00e9commenter cette ligne pour faire des tests. Une fois d\u00e9comment\u00e9e, la g\u00e9n\u00e9ration des certificats Let&rsquo;s Encrypt se fait sur un serveur de test qui n&rsquo;a pas de limitation (ou alors tr\u00e8s \u00e9lev\u00e9e), si elle n&rsquo;est pas d\u00e9comment\u00e9e, on attaque directement le serveur de Let&rsquo;s Encrypt et s&rsquo;il y a des soucis dans la configuration, on peut consommer TRES vite la quantit\u00e9 de certificats autoris\u00e9e en une semaine (aujourd&rsquo;hui, cinquante). Une fois qu&rsquo;on est certain de la configuration, on peut commenter cette ligne, relancer Traefik, et les certificats sont g\u00e9n\u00e9r\u00e9s et enregistr\u00e9s dans un fichier <em>acme.json<\/em>, dans la racine du r\u00e9pertoire \/<em>volume1\/Docker\/Traefik<\/em>, cf. la ligne :<\/p>\n\n\n\n<pre id=\"block-5dad2f3a-167d-4e06-865f-a663be22a3a2\" class=\"wp-block-code\"><code>- \/volume1\/Docker\/Traefik\/acme.json:\/acme.json<\/code><\/pre>\n\n\n\n<p>dans le fichier <em>docker-compose.yml<\/em>.<\/p>\n\n\n\n<p>Les lignes comment\u00e9es <\/p>\n\n\n\n<pre id=\"block-c780e76f-9c3e-4715-85cc-c9927d2cc43a\" class=\"wp-block-code\"><code>#  &#91;certificatesResolvers.letsencrypt.acme.dnsChallenge]\n#    provider: ovh\n#    delayBeforeCheck: 0<\/code><\/pre>\n\n\n\n<p>Sont relatives \u00e0 la gestion des certificats Let&rsquo;s Encrypt via les SANS, mais je ne suis pas encore arriv\u00e9 \u00e0 utiliser ces particularit\u00e9s. J&rsquo;ai quand m\u00eame conserv\u00e9 ces lignes, quand j&rsquo;aurai le temps.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<p>Avant tout essai, il faut bien cr\u00e9er le fichier acme.json, et lui attribuer les droits d&rsquo;acc\u00e8s \u00ab\u00a0600\u00a0\u00bb:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>root@astorus:\/volume1\/Docker\/Traefik# touch acme.json &amp;&amp; chmod 600 acme.json<\/code><\/pre>\n\n\n\n<p>Normalement, une fois que tout est bien configur\u00e9, on peut lancer le docker Traefik avec la commande :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>root@astorus:\/volume1\/Docker\/Traefik# docker-compose up -d<\/code><\/pre>\n\n\n\n<p>Le docker se lance, va alimenter le fichier de certificats <em>acme.json<\/em>, on peut suivre les erreurs \u00e9ventuelles dans le <em>fichier traefik.log<\/em>. Les sous-domaines doivent bien entendu \u00eatre actifs comme expliqu\u00e9 ci-dessus. <\/p>\n\n\n\n<p>Maintenant, on aimerait acc\u00e9der aux certificats d&rsquo;une fa\u00e7on diff\u00e9rente que de la fa\u00e7on dont ils sont pr\u00e9sent\u00e9s dans le fichier acme.json. Pour ceci j&rsquo;ai trouv\u00e9 un outil tr\u00e8s utile : <a href=\"https:\/\/github.com\/ldez\/traefik-certs-dumper\/releases\/\">traefik-certs-dumper<\/a>. Cet outil permet d&rsquo;extraire les certificats d&rsquo;un fichier .json. Avec la commande : <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>root@astorus:\/volume1\/Docker\/Traefik#.\/traefik-certs-dumper file --version v2 --clean --crt-name cert --key-name private --source .\/acme.json --dest .\/dump\/<\/code><\/pre>\n\n\n\n<p>On extrait tous les certificats pour les r\u00e9-\u00e9crire dans le r\u00e9pertoire .\/dump. Attention, l&rsquo;option &#8211;version v2 est indispensable, sinon \u00e7a ne marchera pas.<\/p>\n\n\n\n<p>Du coup, j&rsquo;ai cr\u00e9\u00e9 un petit script qui me permet de r\u00e9cup\u00e9rer les certificats et de les ranger l\u00e0 o\u00f9 je veux \ud83d\ude42 . Cela m&rsquo;est utile essentiellement pour g\u00e9rer les certificats pour le serveur de mail (dans mon cas : mail.webdot.fr). Je les recopie (voir les lignes cp&#8230;) dans des r\u00e9pertoires persistants de postfix et dovecot dont je parlerai dans un prochain post. <\/p>\n\n\n\n<p>J&rsquo;ai mis ce script dans crontab et je le fais tourner une fois par mois, et je suis certain d&rsquo;avoir dans ce r\u00e9pertoire dump les certificats en cours (vu que les certificats Let&rsquo;s Encrypt sont g\u00e9n\u00e9r\u00e9s tous les trois mois).<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#!\/bin\/sh\n\ncd \/volume1\/Docker\/Traefik\n\n# Extract the certificates from the acme.json file\n.\/traefik-certs-dumper file --version v2 --clean --crt-name cert --key-name private --source .\/acme.json --dest .\/dump\/\n\n# Copy mail hostname certificates to Postfix docker volume ssl directory and apply r\/w rights\ncp .\/dump\/certs\/mail.webdot.fr.crt \/usr\/local\/AppCentral\/docker-ce\/docker_lib\/volumes\/postfix_conf\/_data\/ssl\/\ncp .\/dump\/private\/mail.webdot.fr.key  \/usr\/local\/AppCentral\/docker-ce\/docker_lib\/volumes\/postfix_conf\/_data\/ssl\/\nchmod 644 \/usr\/local\/AppCentral\/docker-ce\/docker_lib\/volumes\/postfix_conf\/_data\/ssl\/*.crt\nchmod 600 \/usr\/local\/AppCentral\/docker-ce\/docker_lib\/volumes\/postfix_conf\/_data\/ssl\/*.key\n\n# Copy mail hostname certificates to Dovecot docker volume ssl directory and apply r\/w rights\ncp .\/dump\/certs\/mail.webdot.fr.crt \/usr\/local\/AppCentral\/docker-ce\/docker_lib\/volumes\/a73949915e9e61ca225db3388b315f490be498483ac0e9f87ed621a37768d18b\/_data\/ssl\/cert.pem\ncp .\/dump\/private\/mail.webdot.fr.key  \/usr\/local\/AppCentral\/docker-ce\/docker_lib\/volumes\/a73949915e9e61ca225db3388b315f490be498483ac0e9f87ed621a37768d18b\/_data\/ssl\/key.pem\nchmod 644 \/usr\/local\/AppCentral\/docker-ce\/docker_lib\/volumes\/a73949915e9e61ca225db3388b315f490be498483ac0e9f87ed621a37768d18b\/_data\/ssl\/cert.pem\nchmod 600 \/usr\/local\/AppCentral\/docker-ce\/docker_lib\/volumes\/a73949915e9e61ca225db3388b315f490be498483ac0e9f87ed621a37768d18b\/_data\/ssl\/key.pem<\/code><\/pre>\n\n\n\n<p>Et voil\u00e0, normalement, les sous-domaines ont maintenant acc\u00e8s \u00e0 tout les services correspondants (sous r\u00e9serve que ces derniers soient install\u00e9s avant !).<\/p>\n","protected":false},"excerpt":{"rendered":"<p>La probl\u00e9matique est la suivante. Je souhaite un reverse proxy permettant d&rsquo;acc\u00e9der de l&rsquo;ext\u00e9rieur (internet) \u00e0 toutes les applications internes, sans ouvrir de ports. La solution c&rsquo;est le reverse proxy. Asus Data Master (ADM pour &hellip;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[6,7],"tags":[],"_links":{"self":[{"href":"https:\/\/www.webdot.fr\/blog\/wp-json\/wp\/v2\/posts\/58"}],"collection":[{"href":"https:\/\/www.webdot.fr\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.webdot.fr\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.webdot.fr\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.webdot.fr\/blog\/wp-json\/wp\/v2\/comments?post=58"}],"version-history":[{"count":28,"href":"https:\/\/www.webdot.fr\/blog\/wp-json\/wp\/v2\/posts\/58\/revisions"}],"predecessor-version":[{"id":496,"href":"https:\/\/www.webdot.fr\/blog\/wp-json\/wp\/v2\/posts\/58\/revisions\/496"}],"wp:attachment":[{"href":"https:\/\/www.webdot.fr\/blog\/wp-json\/wp\/v2\/media?parent=58"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.webdot.fr\/blog\/wp-json\/wp\/v2\/categories?post=58"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.webdot.fr\/blog\/wp-json\/wp\/v2\/tags?post=58"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}