{"id":2071,"date":"2020-05-06T00:32:02","date_gmt":"2020-05-05T22:32:02","guid":{"rendered":"https:\/\/www.giannifavilli.it\/blog\/?p=2071"},"modified":"2022-02-22T16:25:53","modified_gmt":"2022-02-22T15:25:53","slug":"docker-stack-apache-php-mysql","status":"publish","type":"post","link":"https:\/\/www.giannifavilli.it\/blog\/docker-stack-apache-php-mysql\/","title":{"rendered":"Stack Docker con Apache, PHP e MySQL\/MariaDB"},"content":{"rendered":"\n<p>In questo articolo prover\u00f2 a spiegare come costruire un <strong>ambiente <\/strong>web di sviluppo o di test (sconsigliato per la produzione) attraverso container Docker. Lo stack sar\u00e0 generato attraverso <strong>Docker Compose<\/strong> e sar\u00e0 costituito da Apache, PHP e MySQL\/MariaDB.<\/p>\n\n\n\n<!--more-->\n\n\n\n<p>Prima di proseguire con la lettura di questo articolo \u00e8 bene conoscere le basi sul mondo della containerizzazione e sopratutto su cosa sia Docker in quanto questo articolo tratta un aspetto avanzato dal semplice <em>Hello Word!<\/em><\/p>\n\n\n\n<p>Lo scopo \u00e8 quello di realizzare un ambiente dove sia possibile sviluppare o testare una o pi\u00f9 webapp senza la necessit\u00e0 di utilizzare applicativi tipo XAMPP \/ WampServer \/ MAMP, o creare sul proprio host un server web\/db persistente.<br>Chi sviluppa sa bene quanto sia importante l&#8217;allineamento tra l&#8217;ambiente di sviluppo e quello di produzione e con Docker si pu\u00f2 fare.<\/p>\n\n\n\n<p>Per far ci\u00f2 utilizzeremo l&#8217;<em>orchestratore<\/em> di Docker ovvero <strong>docker-compose<\/strong>. Le immagini ufficiali prelevate dall&#8217;hub di PHP <strong>php-apache<\/strong> e <strong>mysql <\/strong>o <strong>mariadb<\/strong> a discrezione personale. <em>In questo articolo descrivo l&#8217;utilizzo di mysql ma usando mariadb cambia ben poco.<\/em><\/p>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"parte-tecnica\">Parte tecnica.<\/h2>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<div class=\"wp-block-jetpack-markdown\"><h3>Composizione dello Stack<\/h3>\n<ul>\n<li>Apache version: 2.4<\/li>\n<li>PHP version: 7.1<\/li>\n<li>MySQL version: 5.6<\/li>\n<\/ul>\n<p>Il numero di versione \u00e8 a discrezione ma va tenuto presente che ogni versione potrebbe avere la necessit\u00e0 di essere configurata in maniera diversa sul proprio Dockerfile utile alla costruzione <em>build<\/em> del container.<\/p>\n<h3>Immmagini Docker Utilizzate<\/h3>\n<p>Per avere lo stack sopra descritto useremo le seguenti immagini docker ufficiali reperibili dal Docker Hub.<\/p>\n<ul>\n<li>php:7.1-apache<\/li>\n<li>mysql:5.6<\/li>\n<\/ul>\n<h3>Alberatura cartella di progetto<\/h3>\n<pre><code>docker-amp-slim\n\u2502   .env\n\u2502   .gitignore\n\u2502   docker-compose.yml\n\u2502   LICENSE\n\u2502   Makefile\n\u2502   README.md\n\u2502   \n\u251c\u2500\u2500\u2500app\n\u2502       index.php\n\u2502       info.php\n\u2502       \n\u251c\u2500\u2500\u2500db        \n\u251c\u2500\u2500\u2500docker\n\u2502   \u251c\u2500\u2500\u2500mysql\n\u2502   \u2502   \u2502   Dockerfile\n\u2502   \u2502   \u2502   \n\u2502   \u2502   \u2514\u2500\u2500\u2500init\n|   |           000-operations.sql\n\u2502   \u2502           dbapp.sql\n|   |           zzz-operations.sql\n\u2502   \u2502       \n\u2502   \u2514\u2500\u2500\u2500php-apache\n\u2502           app.conf\n\u2502           Dockerfile\n\u2502           \n\u2514\u2500\u2500\u2500logs\n    \u251c\u2500\u2500\u2500db\n    \u2514\u2500\u2500\u2500web\n<\/code><\/pre>\n<h3>Variabili d&#8217;Ambiente<\/h3>\n<p>Per avere una maggiore versatilit\u00e0 e dinamicit\u00e0 su vari sistemi o computer sul quale verr\u00e0 svolto il lavoro le <em>best practice<\/em> sono quelle di utilizzare un file che contiene tutte le variabili d&#8217;ambiente principali (es. nome applicazione, password database, ecc.). L&#8217;utilizzo di questo file ci permette di poter modificare configurazioni fondamentali dello stack senza mettere mano ai file sorgenti applicativi.<\/p>\n<p>Il file che contiene tali variabili \u00e8 denominato semplicemente come <code>.env<\/code> \u00e8 ed presente nella cartella principale di progetto, la <em>root<\/em>.<\/p>\n<p>E&#8217; molto importante visualizzare e nel caso modificare queste variabili prima di costruire lo stack.<\/p>\n<h4>File <code>.env<\/code><\/h4>\n<pre><code>#!\/usr\/bin\/env bash\n\n#### GENERAL ####\n\nPROJECT_NAME=docker-amp-slim\nVERSION_ID=1\n\n# XDEBUG=1 \/ enabled | XDEBUG=0 \/ disabled\nXDEBUG=1\n\nTIME_ZONE=Europe\/Rome\nAPP_URL=http:\/\/localhost\/\n\nDB_USER=mysql\nDB_GROUP=mysql\n\n#### APACHE #### # APACHE_VERSION=2.4\nAPACHE_PORT_EXPOSED=80\n\n#### MYSQL #### # MYSQL_VERSION=5.6\nDB_PORT_EXPOSED=3306\nDB_ROOTPASS=pass\nDB_USER=dbuser\nDB_PASS=dbpass\nDB_NAME=dbapp\n\n#### PHP #### # PHP_VERSION=7.1\n<\/code><\/pre>\n<h4>Descrizione delle variabili d&#8217;ambiente<\/h4>\n<ul>\n<li><code>PROJECT_NAME<\/code>: Nome dello stack Docker<\/li>\n<li><code>VERSION_ID<\/code>: Identificativo del tuo stack di progetto. (Da usare solo se ritieni di lavorare con pi\u00f9 versioni differenti tra loro)<\/li>\n<li><code>XDEBUG<\/code>: Libreria PHP per il debug. Usa <code>1<\/code> se la vuoi installare ed utilizzare altrimenti usa <code>0<\/code>.<\/li>\n<li><code>TIME_ZONE<\/code>: Fuso orario, usato da PHP e MySQL.<\/li>\n<li><code>APP_URL<\/code>: Url della tua applicazione web. Usata principalmente per CMS\/Frameweork come <em>WordPress<\/em>, <em>Drupal<\/em>, <em>CodeIgniter<\/em>, etc.<\/li>\n<li><code>APACHE_PORT_EXPOSED<\/code>: Porta utilizzata da Apache.<\/li>\n<li><code>DB_PORT_EXPOSED<\/code>: Porta utilizzata dal database. Usata per installare la web app tramite eventuali <em>wizard<\/em> di CMS o usata anche per connettersi tramite client esterni come <em>HeidiSQL<\/em> o <em>MySQL Workbench<\/em> per creare database o tabelle. Per configurare la connessione su un client esterno usare come parametri <em>host<\/em> <code>127.0.0.1<\/code>, <em>username<\/em> <code>root<\/code>, per la <em>password<\/em> usa la <code>DB_ROOTPASS<\/code> impostata e per la <em>port<\/em> usa la <code>DB_PORT_EXPOSED<\/code> impostata sul file <code>.env<\/code>.<\/li>\n<li><code>DB_ROOTPASS<\/code>: Password di root. <em>Non \u00e8 un metodo sicuro da usare in produzione ma per lo sviluppo \u00e8 accettabile<\/em>.<\/li>\n<li><code>DB_USER<\/code>: Username usato dalla webapp per la connessione al database.<\/li>\n<li><code>DB_PASS<\/code>: Password usato dalla webapp per la connessione al database.<\/li>\n<li><code>DB_NAME<\/code>: Nome del database usato dalla webapp. Questo database verr\u00e0 creato durante la costruzione dello stack, altrimenti puoi creare il database tramite <em>docker exec<\/em> o tramite client esterni.<\/li>\n<\/ul>\n<p>Se vuoi approfondire il concetto del file di variabili e i parametri in esso contenuti ti consiglio di leggere <a href=\"https:\/\/docs.docker.com\/compose\/environment-variables\/#the-env-file\">questa guida<\/a>.<\/p>\n<h3>Descrizione dello spazio di lavoro <em>workspace<\/em><\/h3>\n<h4>Cartella della webapp: <code>app<\/code><\/h4>\n<p>Questa \u00e8 la cartella contenente la tua webapp. Inserisci qui i sorgenti del tuo progetto o installa qui dentro i sorgenti del CMS\/Framework.<\/p>\n<h5>Connessione al database tramite sorgenti PHP<\/h5>\n<p>Per connettersi al database dal Framework o tramite sorgenti <em>hand made<\/em> per versatilit\u00e0 usa la funzione PHP <code>getenv()<\/code> (vedi un esempio nei sorgenti di <code>index.php<\/code>).<\/p>\n<pre><code class=\"language-php\">$dbhost = getenv('DB_HOST');\n$dbuser = getenv('DB_USER');\n$dbpass = getenv('DB_PASS');\n<\/code><\/pre>\n<h5>Per installare un CMS tramite procedura guidata<\/h5>\n<p>Usa i seguenti parametri quando richiesti.<\/p>\n<ul>\n<li><em>hostname<\/em>: <code>db<\/code><\/li>\n<li><em>database<\/em>: <em><code>DB_NAME<\/code> assegnato nel file di variabili .env<\/em><\/li>\n<li><em>username<\/em>: <em><code>DB_USER<\/code> assegnato nel file di variabili .env<\/em><\/li>\n<li><em>password<\/em>: <em><code>DB_PASS<\/code> assegnato nel file di variabili .env<\/em><\/li>\n<li><em>port<\/em>: <code>3306<\/code> <em>anche se \u00e8 la porta di default \u00e8 fondamentale dichiarala<\/em><\/li>\n<\/ul>\n<h4>Cartella del database: <code>db<\/code><\/h4>\n<p>Se non hai questa cartella, essa verr\u00e0 creata alla prima costruzione dello stack.<\/p>\n<p>Contiene tutti i file sorgenti di tutti i database usati nello stack.  E&#8217; molto importante non lavorare in questa cartella e sopratutto non modificare i file al suo interno.\nE&#8217; da usare solo come archivio ma qualora hai intenzione di migrare l&#8217;ambiente su altro computer ricordati di spostare questa cartella e tutto il suo contenuto ma senza apporre alcuna modifica ai file contenuti al suo interno.<\/p>\n<p>Se non vuoi che i sorgenti dei database siano salvati all&#8217;interno di questa cartella usa i <em>volumi<\/em> nel <em>docker-compose<\/em> (vedi in seguito).<\/p>\n<h4>Cartella dei logs: <code>logs<\/code><\/h4>\n<p>La scrittura dei logs \u00e8 disabilitata di default. Se hai bisogno di abilitarla vedi nelle <em>Note aggiuntive<\/em>.<\/p>\n<h3>Note aggiuntive<\/h3>\n<hr>\n<ul>\n<li>Lo stack \u00e8 stato testato anche con <strong>PHP 7.3<\/strong>, <strong>MySQL 5.7<\/strong> e <strong>MariaDB 10.x<\/strong>. YPuoi modificare queste impostazioni direttamente dal <em>Dockerfile<\/em>.<\/li>\n<\/ul>\n<hr>\n<ul>\n<li>Al termine della prima <em>build<\/em> dovrai attendere alcuni minuti prima di poterti connettere al database. Questo accade perch\u00e8 tutti i micro servizi all&#8217;interno dei container dovranno essere inizializzati e queste operazioni effettuate in background richiedono del tempo.<\/li>\n<\/ul>\n<hr>\n<ul>\n<li>Se vuoi avere i database in un posto sicuro devi usare i volumi di docker <em>docker volumes<\/em> modificando il file <code>docker-compose.yml<\/code> come segue. Questa procedura permette di avere i database in modo persistente e criptografato ma tale opzione non permette la portabilita tra pi\u00f9 devices.<\/li>\n<\/ul>\n<pre><code class=\"language-yaml\">\n# ...\nservices:\n# ...\n  db:\n# ...\n    volumes:\n      # - .\/db:\/var\/lib\/mysql\n      - database:\/var\/lib\/mysql\n# ...\n\n# add after services\nvolumes:\n  database:\n\n<\/code><\/pre>\n<hr>\n<ul>\n<li>Se hai gi\u00e0 un dump di un database che vuoi importare puoi aggiungere il file di dump <code>.sql<\/code> o <code>.gz<\/code> dentro la cartella <code>docker\\mariadb\\init<\/code> e rimuovere il commento dalla riga seguente. Il database verr\u00e0 creato alla prima <em>build<\/em>.<\/li>\n<\/ul>\n<pre><code class=\"language-yaml\">\n# ...\nservices:\n# ...\n  db:\n# ...\n    volumes:\n      - .\/docker\/mariadb\/init:\/docker-entrypoint-initdb.d\n# ...\n\n<\/code><\/pre>\n<hr>\n<ul>\n<li>\n<p>Inoltre, se \u00e8 necessario eseguire altre operazioni sui database alla prima <em>build<\/em>, \u00e8 possibile modificare i seguenti file inserendo le query di cui si ha bisogno:<\/p>\n<ul>\n<li><code>docker\\mariadb\\init\\000-operations.sql<\/code><\/li>\n<li><code>docker\\mariadb\\init\\zzz-operations.sql<\/code><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>Queste operazioni verranno eseguite esclusivamente alla prima build, ovvero quando il contaner del database verr\u00e0 inizializzato la prima volta.<\/p>\n<hr>\n<ul>\n<li>I log di PHP e Apache possono essere seguiti e visualizzati sul terminale <em>(di default con stdout, stderr)<\/em> lanciando il comando <code>docker-compose logs -f web<\/code>.\nSe invece vuoi averli in un file, modifica il <code>docker-compose.yml<\/code> aggiungendo questa riga come sotto.<\/li>\n<\/ul>\n<pre><code class=\"language-yaml\">\n# ...\nservices:\n# ...\n  web:\n# ...\n    volumes:\n      - .\/logs\/web:\/var\/log\/apache2\n      # ...\n# ...\n\n<\/code><\/pre>\n<hr>\n<ul>\n<li>Per abilitare il logs di MySQL modifica il file  <code>docker\/mysql\/Dockerfile<\/code> togliendo il commento alle seguente riga.<\/li>\n<\/ul>\n<pre><code>RUN sed -i &quot;s\/#log-error\/log-error\/g&quot; \/etc\/mysql\/mysql.conf.d\/mysqld.cnf\n<\/code><\/pre>\n<hr>\n<ul>\n<li>Quanto lo stack \u00e8 pronto vai su <code>http:\/\/localhost<\/code>, per vedere il <em>PHPinfo<\/em> vai in <code>http:\/\/localhost\/info.php<\/code><\/li>\n<\/ul>\n<h3>Comandi utili per Build e Run<\/h3>\n<p>Se usi un sistema linux puoi eseguire direttamente il <code>make<\/code> usando i seguenti comandi:<\/p>\n<ul>\n<li><code>make install<\/code> &#8211; crea e inizializza lo stack<\/li>\n<li><code>make start<\/code> &#8211; avvia lo stack<\/li>\n<li><code>make stop<\/code> &#8211; arresta lo stack<\/li>\n<li><code>make remove<\/code> &#8211; rimuove lo stack mantenendo i databases e i logs, non rimuove i sorgenti della webapp<\/li>\n<li><code>make purge<\/code> &#8211;  rimuove completamente lo stack compresi tutti i databases e i logs ma non rimuove i sorgenti della webapp<\/li>\n<li><code>make validate<\/code> &#8211; verifica che le impostazione di ambiente e dello stack siano corrette e non ci siano errori all&#8217;interno del file <code>docker-compose.yml<\/code><\/li>\n<li><code>make bash-db<\/code> &#8211; entra con il terminale bash all&#8217;interno del contaner <em>db<\/em><\/li>\n<li><code>make bash-web<\/code> &#8211; entra con il terminale bash all&#8217;interno del contaner <em>web<\/em><\/li>\n<\/ul>\n<h4>Commandi utili in pillole<\/h4>\n<p>Da usare per creazione, avvio, arresto, rimozione e validazione dello stack docker.<\/p>\n<ul>\n<li>\n<p><code>docker-compose up -d --build<\/code> &#8211; crea e inizializza lo stack<\/p>\n<\/li>\n<li>\n<p><code>docker-compose down<\/code> &#8211; rimuove lo stack mantenendo i databases e i logs, non rimuove i sorgenti della webapp<\/p>\n<\/li>\n<li>\n<p><code>docker-compose start<\/code> &#8211; avvia lo stack<\/p>\n<\/li>\n<li>\n<p><code>docker-compose stop<\/code>  &#8211; arresta lo stack<\/p>\n<\/li>\n<li>\n<p><code>docker-compose down --volumes<\/code> &#8211; come <em>down<\/em> ma rimuove anche i volumi quindi cancella anche i databases<\/p>\n<\/li>\n<li>\n<p><code>docker-compose config<\/code> verifica che le impostazione di ambiente e dello stack siano corrette e non ci siano errori all&#8217;interno del file <code>docker-compose.yml<\/code><\/p>\n<\/li>\n<li>\n<p><code>docker-compose exec SERVICE_NAME bash<\/code> entra con il termianle bash al&#8217;interno del container dichiarato<\/p>\n<\/li>\n<\/ul>\n<\/div>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<p>L&#8217;intero repository del progetto sopra descritto \u00e8 disponibile su GitHub sotto il nome di <strong><a rel=\"noreferrer noopener\" href=\"https:\/\/github.com\/fvlgnn\/docker-amp-slim\" target=\"_blank\">Docker-AMP-Slim<\/a><\/strong><\/p>\n\n\n\n<div class=\"wp-block-group\"><div class=\"wp-block-group__inner-container is-layout-flow wp-block-group-is-layout-flow\">\n<p>Su GitHub sono disponibili anche altri repository con altri tipi di Stack.<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><strong><a rel=\"noreferrer noopener\" href=\"https:\/\/github.com\/fvlgnn\/docker-emp\" target=\"_blank\">Docker-EMP<\/a><\/strong> composto da NGINX, MYSQL (MariaDB), PHP (FPM)<\/li><li><a rel=\"noreferrer noopener\" href=\"https:\/\/github.com\/fvlgnn\/docker-amp\" target=\"_blank\"><strong>Docker-AMP<\/strong><\/a> composto da APACHE, MYSQL (MariaDB), PHP (FPM)<\/li><\/ul>\n<\/div><\/div>\n\n\n\n<ul class=\"wp-block-social-links is-layout-flex wp-block-social-links-is-layout-flex\"><li class=\"wp-social-link wp-social-link-github  wp-block-social-link\"><a href=\"https:\/\/github.com\/fvlgnn\/\" class=\"wp-block-social-link-anchor\"><svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M12,2C6.477,2,2,6.477,2,12c0,4.419,2.865,8.166,6.839,9.489c0.5,0.09,0.682-0.218,0.682-0.484 c0-0.236-0.009-0.866-0.014-1.699c-2.782,0.602-3.369-1.34-3.369-1.34c-0.455-1.157-1.11-1.465-1.11-1.465 c-0.909-0.62,0.069-0.608,0.069-0.608c1.004,0.071,1.532,1.03,1.532,1.03c0.891,1.529,2.341,1.089,2.91,0.833 c0.091-0.647,0.349-1.086,0.635-1.337c-2.22-0.251-4.555-1.111-4.555-4.943c0-1.091,0.39-1.984,1.03-2.682 C6.546,8.54,6.202,7.524,6.746,6.148c0,0,0.84-0.269,2.75,1.025C10.295,6.95,11.15,6.84,12,6.836 c0.85,0.004,1.705,0.114,2.504,0.336c1.909-1.294,2.748-1.025,2.748-1.025c0.546,1.376,0.202,2.394,0.1,2.646 c0.64,0.699,1.026,1.591,1.026,2.682c0,3.841-2.337,4.687-4.565,4.935c0.359,0.307,0.679,0.917,0.679,1.852 c0,1.335-0.012,2.415-0.012,2.741c0,0.269,0.18,0.579,0.688,0.481C19.138,20.161,22,16.416,22,12C22,6.477,17.523,2,12,2z\"><\/path><\/svg><span class=\"wp-block-social-link-label screen-reader-text\">GitHub<\/span><\/a><\/li><\/ul>\n","protected":false},"excerpt":{"rendered":"<p>In questo articolo prover\u00f2 a spiegare come costruire un ambiente web di sviluppo o di test (sconsigliato per la produzione) attraverso container Docker. Lo stack sar\u00e0 generato attraverso Docker Compose e sar\u00e0 costituito da Apache, PHP e MySQL\/MariaDB.<\/p>\n","protected":false},"author":2,"featured_media":2078,"comment_status":"closed","ping_status":"open","sticky":true,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[3,17],"tags":[74,73,76,44,43,68,75],"class_list":["post-2071","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-informatica","category-programmazione","tag-apache","tag-docker","tag-mariadb","tag-mysql","tag-php","tag-programmazione","tag-stack"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"https:\/\/www.giannifavilli.it\/blog\/wp-content\/uploads\/2020\/04\/docker-stack-amp.png","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p4SGGs-xp","_links":{"self":[{"href":"https:\/\/www.giannifavilli.it\/blog\/wp-json\/wp\/v2\/posts\/2071","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.giannifavilli.it\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.giannifavilli.it\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.giannifavilli.it\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.giannifavilli.it\/blog\/wp-json\/wp\/v2\/comments?post=2071"}],"version-history":[{"count":0,"href":"https:\/\/www.giannifavilli.it\/blog\/wp-json\/wp\/v2\/posts\/2071\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.giannifavilli.it\/blog\/wp-json\/wp\/v2\/media\/2078"}],"wp:attachment":[{"href":"https:\/\/www.giannifavilli.it\/blog\/wp-json\/wp\/v2\/media?parent=2071"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.giannifavilli.it\/blog\/wp-json\/wp\/v2\/categories?post=2071"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.giannifavilli.it\/blog\/wp-json\/wp\/v2\/tags?post=2071"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}