{"id":1365,"date":"2019-02-25T01:26:26","date_gmt":"2019-02-25T01:26:26","guid":{"rendered":"https:\/\/www.appservgrid.com\/paw93\/?p=1365"},"modified":"2019-03-07T20:26:30","modified_gmt":"2019-03-07T20:26:30","slug":"nodejs-application-using-mongodb-and-rancher","status":"publish","type":"post","link":"https:\/\/www.appservgrid.com\/paw93\/index.php\/2019\/02\/25\/nodejs-application-using-mongodb-and-rancher\/","title":{"rendered":"NodeJS Application Using MongoDB and Rancher"},"content":{"rendered":"<p>So last week I finally got out from my \u201ctech\u201d comfort zone, and tried<br \/>\nto set up a Node.js application which uses a MongoDB database, and to<br \/>\nadd an extra layer of fun I used Rancher to set up the<br \/>\nwhole application stack using Docker containers.<\/p>\n<p>I designed a small application with Node, its only function is to<br \/>\ncalculate the number of hits on the website, you can find the code at<br \/>\n<a href=\"https:\/\/github.com\/galal-hussein\/hitcntr-nodejs\">Github<\/a><\/p>\n<p>The setup was to add an Nginx container as a load balancer at the<br \/>\nfront-end to serve two back-end Node application containers, and then<br \/>\nhave the two Node servers connect to a MongoDB database container. In<br \/>\nthis setup I will use 5 machines from Digital Ocean, 4 to build the<br \/>\napplication stack with the highest availability, and the 5th as a<br \/>\nRancher server.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/lh5.googleusercontent.com\/dnKNEKSUa9aIPnxj5TaVd1WNcasSrNRoyX-4Rc16IJqoFgamAZoB4Fgwr3xLD_b3nU736fY2syfynDv7-MuEwopA2p6cFsk3mMAn1432zxAVr_td3ekxrY6beDhwn-ychL0\" alt=\"nodejs_app.png\" \/><\/p>\n<h3>[]Set Up A Rancher Server<\/h3>\n<p>On a Digital Ocean machine with Docker 1.4 installed we will apply the<br \/>\nfollowing command to set up a Rancher platform on the port 8000:<\/p>\n<p>root@Rancher-Mngmt:~# docker run -d &#8211;name rancher-server -p 8080:8080 rancher\/server<\/p>\n<p>The previous command will run a docker instance with rancher platform,<br \/>\nand proxy the port 8080 on the instance to the same port on the Digital<br \/>\nOcean machine. To make sure that the server is running type this<br \/>\ncommand:<\/p>\n<p>root@Rancher-io-Mngmt:~# docker logs rancher-server<\/p>\n<p>You should see something like the following output:<\/p>\n<p>20:02:41.943 [main] INFO ConsoleStatus &#8211; [DONE ] [68461ms] Startup Succeeded, Listening on port 8080<\/p>\n<p>To access Rancher now, type the following url in your browser:<\/p>\n<p><a href=\"http:\/\/DO-ip-address:8080\/\">http:\/\/DO-ip-address:8080\/<\/a><br \/>\nyou should see something like the following:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/lh5.googleusercontent.com\/zRFk1ILDTclMyv7G_f4Jn_iGzM8zA770EDAlc_ZHeG5Qs1t3u3a-1ou9oyUCzdlWRAxcLaXrgxh-_4YtBiQAlxyUQwq60N5ejX3aGeF9NQFtKt9UR4W_lOschEjVHhoM6OQ\" alt=\"rancher-mngmt.png\" \/><\/p>\n<h3>[]Register Digital Ocean\u2019s instances With Rancher<\/h3>\n<p>To register the Digital Ocean machines with docker 1.4 installed with<br \/>\nRancher, type the following on each machine:<\/p>\n<p>root@Rancher-Test-Instance-X# docker run -it &#8211;privileged -v \/var\/run\/docker.sock:\/var\/run\/docker.sock rancher\/agent http:\/\/rancher-server-ip:8080<\/p>\n<p>where rancher-server-ip is the ip address of the<br \/>\nRancher server we just installed, or you can click on \u201cRegister a New<br \/>\nHost \u201c on Rancher platform and copy the command shown.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/lh3.googleusercontent.com\/zoQbH4nK07-6KFMRzg9x8vKR_tgJimMxTj1JtpKeoP0vvagxFsfwMxYsWZbp7nePA3A1B3SZFE-W-ccLNdmuf8yKiOGH0UHr716hxhNJ57qrSTluYHtqIYSk0zb4xTQxSNk\" alt=\"registernewhost.png\" \/><\/p>\n<p>After applying the previous command on each machine you should see<br \/>\nsomething like the following when you access the Rancher management<br \/>\nserver:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/lh4.googleusercontent.com\/-1q82MEPpbierVEIcw7buNUefzm7w8TyOazCl2YbHZqCXdY3Ei6gh3iZr2GEef9w7w88Gh9GgrdFnXKZKZHY5Ne06XHIvbg7bzNzAZVMkJYceyDXyNeTlwg4xZuNKlpq57c\" alt=\"RInstances.png\" \/><\/p>\n<p>If you are familiar with Ansible as a configuration management<br \/>\ntool, you can use it to register the Digital Ocean machines with Rancher<br \/>\nin one command:<\/p>\n<ul>\n<li>First, add the ips of the Digital Ocean machines in<br \/>\n\/etc\/ansible\/hosts under one group name:<\/li>\n<\/ul>\n<p>[DO]<br \/>\n178.62.101.243<br \/>\n178.62.27.24<br \/>\n178.62.98.242<br \/>\n178.62.11.154<\/p>\n<ul>\n<li>Now, run the following command to register all machines at<br \/>\nonce:<\/li>\n<\/ul>\n<p>$ ansible DO -u root -a \u201cdocker run -it &#8211;privileged -v \/var\/run\/docker.sock:\/var\/run\/docker.sock rancher\/agent http:\/\/rancher-server-ip:8080\u201d<\/p>\n<h3>MongoDB Docker Container<\/h3>\n<p>After Registering the 4 machines with Rancher, its time to start<br \/>\nbuilding our application stack.<\/p>\n<p>The <em>node.js<\/em> application will calculate the number of hits on a<br \/>\nwebsite, so it needs to store this data somewhere. I will use <em>MongoDB<\/em><br \/>\ncontainer to store the number of hits.<\/p>\n<p>The Dockerfile will be like the following:<\/p>\n<p>FROM ubuntu:14.04<br \/>\nMAINTAINER hussein.galal.ahmed.11@gmail.com<br \/>\nENV chached_FLAG 0<br \/>\nRUN apt-get -qq update &amp;&amp; apt-get -yqq upgrade<br \/>\nRUN apt-key adv &#8211;keyserver hkp:\/\/keyserver.ubuntu.com:80 &#8211;recv 7F0CEB10<br \/>\nRUN echo &#8216;deb http:\/\/downloads-distro.mongodb.org\/repo\/ubuntu-upstart dist 10gen&#8217; | tee \/etc\/apt\/sources.list.d\/10gen.list<br \/>\nRUN apt-get update &amp;&amp; apt-get install -yqq mongodb-org<br \/>\nRUN mkdir -p \/data\/db<br \/>\nEXPOSE 27017<br \/>\nADD run.sh \/tmp\/run.sh<br \/>\nADD init.json \/tmp\/init.json<br \/>\nENTRYPOINT [&#8220;\/bin\/bash&#8221;, &#8220;\/tmp\/run.sh&#8221;]<\/p>\n<p>The previous Docker file is really simple, lets explain it line by<br \/>\nline:<\/p>\n<ul>\n<li>First update the apt cache and install latest updates:<\/li>\n<\/ul>\n<p>RUN apt-get -qq update &amp;&amp; apt-get -yqq upgrade<\/p>\n<ul>\n<li>Add the key and the mongodb repo to apt sources.list:<\/li>\n<\/ul>\n<p>RUN apt-key adv &#8211;keyserver hkp:\/\/keyserver.ubuntu.com:80 &#8211;recv 7F0CEB10<br \/>\nRUN echo &#8216;deb http:\/\/downloads-distro.mongodb.org\/repo\/ubuntu-upstart dist 10gen&#8217; | tee \/etc\/apt\/sources.list.d\/10gen.list<\/p>\n<ul>\n<li>Install the MongoDB package which installs the server and the<br \/>\nclient:<\/li>\n<\/ul>\n<p>RUN apt-get update &amp;&amp; apt-get install -yqq mongodb-org<\/p>\n<ul>\n<li>Create the directory which will store the MongoDB files:<\/li>\n<\/ul>\n<ul>\n<li>Expose the port 27017, which is the default port to connect to<br \/>\nMongoDB:<\/li>\n<\/ul>\n<ul>\n<li>Add two files to the container:<\/li>\n<\/ul>\n<ul>\n<li>init.json: the initial database to start the<br \/>\napplication.<\/li>\n<li>run.sh: will import the init.json database to the<br \/>\nMongoDB server and ran the server.<\/li>\n<\/ul>\n<p>ADD run.sh \/tmp\/run.sh<br \/>\nADD init.json \/tmp\/init.json<\/p>\n<ul>\n<li>Finally, it will add entrypoint to the container to be started with<br \/>\nexecuting the run.sh file:<\/li>\n<\/ul>\n<p>ENTRYPOINT [&#8220;\/bin\/bash&#8221;, &#8220;\/tmp\/run.sh&#8221;]<\/p>\n<p>Let\u2019s take a look at the run.sh file:<\/p>\n<p>#!\/bin\/bash<br \/>\n\/usr\/bin\/mongod &amp;<br \/>\nsleep 3<br \/>\nmongoimport &#8211;db countdb &#8211;collection hits &#8211;type json &#8211;file \/tmp\/init.json<br \/>\n\/usr\/bin\/mongod &#8211;shutdown<br \/>\nsleep 3<br \/>\n\/usr\/bin\/mongod<\/p>\n<p>The server started first to be able to import the init.json database to<br \/>\nthe countdb database and hits collection, then shutdown the server and<br \/>\nstart it up again but in the foreground this time.<\/p>\n<p>The init.json database file:<\/p>\n<h3>Node.js Application Container<\/h3>\n<p>The Node.js container will install <em>node.js<\/em> and <em>git<\/em> packages, and<br \/>\nthen will run a simple script to update the \/etc\/hosts file with the ip of the MongoDB container provided by the<br \/>\nenvironment variable: $MONGO_IP.<\/p>\n<p>FROM ubuntu:14.04<br \/>\nMAINTAINER hussein.galal.ahmed.11@gmail.com<br \/>\nENV CACHED_FLAG 1<\/p>\n<p># Install node<br \/>\nRUN apt-get update -qq &amp;&amp; apt-get -y upgrade<br \/>\nRUN apt-get install -yqq nodejs git git-core<br \/>\nVOLUME [ &#8220;\/var\/www\/nodeapp&#8221; ]<br \/>\nADD .\/run.sh \/tmp\/run.sh# Install Dependencies<br \/>\nWORKDIR \/var\/www\/nodeapp<\/p>\n<p># Run The App<br \/>\nENTRYPOINT [&#8220;\/bin\/bash&#8221;, &#8220;\/tmp\/run.sh&#8221;]<\/p>\n<p>The ENTRYPOINT of the Docker container is executing the<br \/>\n\/tmp\/run.sh script:<\/p>\n<p>MONGO_DN=mongo<br \/>\nif [ -n &#8220;$MONGO_IP&#8221; ]<br \/>\nthen<br \/>\necho &#8220;$MONGO_IP $MONGO_DN&#8221; &gt;&gt; \/etc\/hosts<br \/>\nfi<\/p>\n<p># Fetch the application<br \/>\ngit clone https:\/\/github.com\/galal-hussein\/hitcntr-nodejs.git<br \/>\nmv hitcntr-nodejs\/* .<br \/>\nrm -rf hitcntr-nodejs<\/p>\n<p># Run the Application<br \/>\nnodejs index.js<\/p>\n<p>The previous script will check for the MONGO_IP environment variable and if it is set, it will add the content of<br \/>\nthis variable to \/etc\/hosts, then pull the code from<br \/>\nGithub Repo, and finally run the node application.<\/p>\n<h3>Nginx Container<\/h3>\n<p>The Dockerfile of the Nginx container will install nginx webserver and<br \/>\nadd the configuration files, and ran a script to update \/etc\/hosts file<br \/>\nlike the Node.js container, and finally run the web server.<\/p>\n<p>Nginx Dockerfile:<\/p>\n<p>#dockerfile for nginx\/nodejs<br \/>\nFROM ubuntu:14.04<br \/>\nMAINTAINER hussein.galal.ahmed.11@gmail.com<br \/>\nENV CACHED_FLAG 0<\/p>\n<p># Install nginx<br \/>\nRUN apt-get update -qq &amp;&amp; apt-get -y upgrade<br \/>\nRUN apt-get -y -qq install nginx<\/p>\n<p># Adding the configuration files<br \/>\nADD conf\/nginx.conf \/etc\/nginx\/nginx.conf<br \/>\nADD conf\/default \/etc\/nginx\/conf.d\/default<br \/>\nADD .\/run.sh \/tmp\/run.sh<\/p>\n<p># Expose the port 80<br \/>\nEXPOSE 80<\/p>\n<p># Run nginx<br \/>\nENTRYPOINT [ &#8220;\/bin\/bash&#8221;, &#8220;\/tmp\/run.sh&#8221; ]<\/p>\n<p>The Dockerfile is very simple and use the same commands like the<br \/>\nprevious images.<\/p>\n<p>run.sh:<\/p>\n<p>NODE_1_DN=node_app1<br \/>\nNODE_2_DN=node_app2<br \/>\nif [ -n &#8220;$NODE_APP1_IP&#8221; ]<br \/>\nthen<br \/>\necho &#8220;$NODE_APP1_IP $NODE_1_DN&#8221; &gt;&gt; \/etc\/hosts<br \/>\nfi<br \/>\nif [ -n &#8220;$NODE_APP2_IP&#8221; ]<br \/>\nthen<br \/>\necho &#8220;$NODE_APP2_IP $NODE_2_DN&#8221; &gt;&gt; \/etc\/hosts<br \/>\nfi<br \/>\n# Run Nginx<br \/>\n\/usr\/sbin\/nginx<\/p>\n<p>Since we are using two Node application servers, we need to proxy the<br \/>\nhttp requests received by Nginx to those servers and to do that we need<br \/>\nto add the ips of the Node.js containers to the hosts file.<\/p>\n<p>The ips of the Node.js containers are defined by the two environment<br \/>\nvariables (NODE_APP1_IP, and NODE_APP2_IP).<\/p>\n<h3>Build And Push The Images<\/h3>\n<p>Now for the final step, build and then push the images to Docker<br \/>\nhup:<\/p>\n<p>~\/rancher_vm# docker build -t husseingalal\/nodeapp_mongo mongo\/<br \/>\n~\/rancher_vm# docker build -t husseingalal\/nodeapp_node node\/<br \/>\n~\/rancher_vm# docker build -t husseingalal\/nodeapp_nginx nginx\/<br \/>\n~\/rancher_vm# docker push husseingalal\/nodeapp_mongo<br \/>\n~\/rancher_vm# docker push husseingalal\/nodeapp_node<br \/>\n~\/rancher_vm# docker push husseingalal\/nodeapp_nginx<\/p>\n<p>Now Docker will ask you for your account credentials, then the images<br \/>\nwill be pushed to the Docker hub to be used later with Rancher.<\/p>\n<h3>Set Up The Application Stack<\/h3>\n<ol>\n<li>At Rancher platform, create at the first host a Docker container<br \/>\nusing the MongoDB image we just created:<\/li>\n<\/ol>\n<p><img decoding=\"async\" src=\"https:\/\/lh3.googleusercontent.com\/4HsOfniVS0ZTDfdROeiA8vlEGlfTCpI5GseBhTSymY0E_t6fb3T1HzaFm3HFQf2oaAEtJ8jk-Qb4UM2uAUKFBRY6lc5-pWinWIjxAj0gze4_lIq6XwuYhLsP_cno5jFAkK8\" alt=\"Rmongo1.png\" \/><\/p>\n<p>Note that the option \u201c<em>Manage Network on docker0<\/em>\u201c<br \/>\nwas chosen to make sure that we will enable one of the unique features<br \/>\nof Rancher which is cross container networking, this feature enables<br \/>\nDocker containers on different hosts to communicate in a virtual private<br \/>\nnetwork.<\/p>\n<p>After clicking Create, you should see that the machine is started to<br \/>\ndownload the image and install it along with another docker instance<br \/>\ncalled Network Agent which is used to create the virtual private network<br \/>\nwe just talked about.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/lh3.googleusercontent.com\/kHYcXVzfQe138VMOlC8aXvYa_4Z3Q1T4JQS1dquuNJGpgwfAK3_1T51voExh9urysGTCjk7jJ4TqBeZmp2UraULL2SRA7SccQYhRtfwgKzxivmnF1ohGGUYSIuDS9EhigUE\" alt=\"RMongo2.png\" \/><\/p>\n<ol>\n<li>The second step is to add the the two Node.js Application servers<br \/>\nwhich are connected to the MongoDB database:<\/li>\n<\/ol>\n<p><img decoding=\"async\" src=\"https:\/\/lh4.googleusercontent.com\/F6dJHYr-1p3nUHlKj82K2fU1AyKbTzYYQLgoGXjZtUAdCShcDLN3JcoJojkqEdVNa0BOxoaBXKYbsYVGLb4GJOr2hvw1ajGKgcdBZPpSL5Pj5UVfYPzjHCvBryHoSA6e_5E\" alt=\"Rnode1_1.png\" \/><\/p>\n<p>Note that we used the Node.js image we just created, before creating<br \/>\nthe container make sure to add the MONGO_IP environment variable to add the ip of the MongoDB server, you can<br \/>\nget the private ip of the MongoDB server from the Rancher panel:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/lh3.googleusercontent.com\/KjO9RWdy5vEAJfvg4szaQLNuyaZ2wg2k6mjZTFaA416bnAo1nn02IbR-_3qXkmK607OUSjIRcBaHJE_Y1G6obmrjSHOoxOUUwjTtVhqLkVXIroiwV5_3WmkqkVL-kdzXxZA\" alt=\"Rnode1_2.png\" \/><\/p>\n<p>After that click Create to begin the creation process of the Node.js<br \/>\ncontainer. On the second host create the second Node.js Application<br \/>\ncontainer using the same steps.<\/p>\n<ol>\n<li>The final step is to create the Nginx webserver container on the<br \/>\nlast host:<\/li>\n<\/ol>\n<p><img decoding=\"async\" src=\"https:\/\/lh4.googleusercontent.com\/wSz3wKt-xYu1ujdqUjdkWeXFZRfEJr-TLEGcTa7uVNZrKagWPcujJbiOUs04K8vHl_k_0u2bcA-1kldAtbZGHIlUxzNgBIgZMfW6d-uaMyiScZrPZ44HQ21_RzerPIA-LyI\" alt=\"Rnginx1.png\" \/><\/p>\n<p>Since the nginx instance will be facing the internet, we should proxy<br \/>\nthe port 80 from inside the container to the port 80 of the Digital<br \/>\nOcean machine:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/lh5.googleusercontent.com\/HeoAdbCLetBCgntJr9Lz3l1XOe9wMwdIsmDNFWPGKprQYLmcdPKOdN7ccH22XeB47BKJ0t4T1jWPslDe6FAy4HgSgdir-DamtjnU1sCRRBP3EO1bmYB-DpIQpvzgCYBX2Mw\" alt=\"Rnginx2.png\" \/><\/p>\n<p>We need also to add the ips of the two Node.js application servers<br \/>\nwhich are connected to Nginx, you can add the ips through creating two<br \/>\nenvironment variables (NODE_APP1_IP, NODE_APP2_IP):<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/lh5.googleusercontent.com\/O20hzjE5ueo1zag69L0oJAhkEbKxHsHVUc1yVFE5LR8o8xU9rtR_b8Yu2DZEQMtfRxaiDQh3ua63_gRnfoqQa0fkHiJ_MtfSNqdt_L_Idji5gLcZD5mu3StgDj_HTargJgw\" alt=\"Screenshot from 2015-02-04\n22:50:13.png\" \/><\/p>\n<p>Now wecan access the application using the ip address of the Host<br \/>\nmachine http:\/\/&lt;the-ip-address&gt;.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/lh5.googleusercontent.com\/A0kAWavgsbwm6kIegGGIq3D_PD2x-Q1DzE4z4g_n7UU1Lx05w2t2nGefungSotkNJhPcFlnEh12MJxjqy1cdO8Yo8NuE3pyonGr0gi2Gk_MhCFJXNJHEciSTm9Z_WX2JHqs\" alt=\"Rsuccess.png\" \/><\/p>\n<h3>Conclusion<\/h3>\n<p>In part 1 of this series, I created a Node.js application stack using<br \/>\nDocker containers and Rancher platform. The stack consists of Nginx<br \/>\ncontainer which balances the load between two Node.js application<br \/>\ncontainers and using MongoDB as our database.<\/p>\n<p>In <a href=\"http:\/\/rancher.com\/nodejs-mongodb-application-with-rancher-part-2\/\">part 2<\/a><br \/>\nI introduce one of the newest features of Rancher: Github<br \/>\nAuthentication, also I will use Github WebHooks feature for automatic deployment of the web application.<\/p>\n<p>If you\u2019d like to learn more about Rancher, please schedule a<br \/>\ndemo:<\/p>\n<p>Hussein Galal is a Linux System Administrator, with experience in<br \/>\nLinux, Unix, Networking, and open source technologies like Nginx,<br \/>\nApache, PHP-FPM, Passenger, MySQL, LXC, and Docker. You can follow<br \/>\nHussein<br \/>\non Twitter <a href=\"http:\/\/twitter.com\/galal_hussein\">@galal_hussein<\/a>.*<\/p>\n<p><a href=\"https:\/\/rancher.com\/building-a-nodejs-app-using-mongodb-and-rancher-part-1\/\" target=\"_blank\" rel=\"noopener\">Source<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>So last week I finally got out from my \u201ctech\u201d comfort zone, and tried to set up a Node.js application which uses a MongoDB database, and to add an extra layer of fun I used Rancher to set up the whole application stack using Docker containers. I designed a small application with Node, its only &hellip; <\/p>\n<p class=\"link-more\"><a href=\"https:\/\/www.appservgrid.com\/paw93\/index.php\/2019\/02\/25\/nodejs-application-using-mongodb-and-rancher\/\" class=\"more-link\">Continue reading<span class=\"screen-reader-text\"> &#8220;NodeJS Application Using MongoDB and Rancher&#8221;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3],"tags":[],"class_list":["post-1365","post","type-post","status-publish","format-standard","hentry","category-kubernetes"],"_links":{"self":[{"href":"https:\/\/www.appservgrid.com\/paw93\/index.php\/wp-json\/wp\/v2\/posts\/1365","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.appservgrid.com\/paw93\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.appservgrid.com\/paw93\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.appservgrid.com\/paw93\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.appservgrid.com\/paw93\/index.php\/wp-json\/wp\/v2\/comments?post=1365"}],"version-history":[{"count":1,"href":"https:\/\/www.appservgrid.com\/paw93\/index.php\/wp-json\/wp\/v2\/posts\/1365\/revisions"}],"predecessor-version":[{"id":1438,"href":"https:\/\/www.appservgrid.com\/paw93\/index.php\/wp-json\/wp\/v2\/posts\/1365\/revisions\/1438"}],"wp:attachment":[{"href":"https:\/\/www.appservgrid.com\/paw93\/index.php\/wp-json\/wp\/v2\/media?parent=1365"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.appservgrid.com\/paw93\/index.php\/wp-json\/wp\/v2\/categories?post=1365"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.appservgrid.com\/paw93\/index.php\/wp-json\/wp\/v2\/tags?post=1365"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}