{"id":3907,"date":"2017-09-05T07:00:02","date_gmt":"2017-09-05T14:00:02","guid":{"rendered":"http:\/\/www.couchbase.com\/blog\/?p=3907"},"modified":"2023-06-08T13:38:35","modified_gmt":"2023-06-08T20:38:35","slug":"continuously-deploying-nodejs-application-circleci","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/continuously-deploying-nodejs-application-circleci\/","title":{"rendered":"Continuously Deploying a Node.js Application Using CircleCI"},"content":{"rendered":"<p>A few months back I had written about <a href=\"https:\/\/www.couchbase.com\/blog\/create-continuous-deployment-pipeline-nodejs-jenkins\/\" target=\"_blank\" rel=\"noopener\">creating a continuous deployment pipeline with Node.js and Jenkins<\/a>, where the Node.js application was using <a href=\"https:\/\/www.couchbase.com\" target=\"_blank\" rel=\"noopener\">Couchbase<\/a> in some fashion. Essentially, it took a project from GitHub, installed the dependencies, ran the tests, and then ran the application on some server, where some server was the same machine that Jenkins was on.<\/p>\n<p>Jenkins is great, but it is a lot of work to get set up with and to keep going. Instead there are hosted continuous integration (CI) and continuous deployment (CD) solutions that exist, such as <a href=\"https:\/\/circleci.com\/\" target=\"_blank\" rel=\"noopener\">CircleCI<\/a>.<\/p>\n<p>We&#8217;re going to see how to take a Node.js project that is version controlled on GitHub and continuously deploy it to some remote server using CircleCI every time a push is made.<\/p>\n<p><!--more--><\/p>\n<p>Before continuing, you should already have created a CircleCI account, have a remote server available, and have a Node.js project available on GitHub.<\/p>\n<p>In this example, I&#8217;m using a Droplet that I&#8217;ve created on <a href=\"https:\/\/m.do.co\/c\/ee4903914bb4\" target=\"_blank\" rel=\"noopener\">Digital Ocean<\/a> and the <a href=\"https:\/\/www.couchbase.com\/blog\/creating-user-profile-store-with-node-js-nosql-database\/\" target=\"_blank\" rel=\"noopener\">Node.js user profile store project<\/a> I had written about a while back. Feel free to use whatever you&#8217;d like.<\/p>\n<h2>Preparing the Remote Server for SSH Connections<\/h2>\n<p>The goal in continuous deployment is to be able to automatically deploy a stable project to your server seamlessly.<\/p>\n<p>When using CircleCI, during the deployment step, we want our project to be copied after our testing workflow succeeds. This can happen via an SCP or a Git Checkout with a series of commands on the remote server. Whatever best meets your needs.<\/p>\n<p>Since we are using Node.js, it makes to use the latter because we&#8217;ll need to install dependencies, and restart the Node.js service. It has a little more depth than just copying files over. For this reason, we&#8217;ll need CircleCI to be able to connect to our remote instance via SSH.<\/p>\n<p>The safest way to do this is to create an SSH private key for CircleCI. From your server, assuming it is Linux, execute the following:<\/p>\n<pre class=\"lang:default decode:true \">ssh-keygen -t rsa -C \"circleci\"<\/pre>\n<p>You&#8217;ll be asked a series of questions regarding the key. It is important that this SSH key does not contain a password since CircleCI does not support key passwords as of right now.<\/p>\n<p>Once the key is generated, execute the following:<\/p>\n<pre class=\"lang:default decode:true\">cat ~\/.ssh\/id_rsa.pub &gt;&gt; ~\/.ssh\/authorized_keys<\/pre>\n<p>The above command assumes that you&#8217;ve named your key <strong>id_rsa<\/strong>. It will append the public key to the end of the <strong>authorized_keys<\/strong> file.<\/p>\n<p>The contents of the <strong>id_rsa<\/strong> private key file needs to be copied to our CircleCI dashboard later in this guide.<\/p>\n<p>Before designing the workflow, we need to clone the GitHub project to our server. Take the following for example:<\/p>\n<pre class=\"lang:default decode:true \">git clone https:\/\/github.com\/my-example-project .\/profile-store<\/pre>\n<p>It is important to remember where you cloned the project to because it will be used by the deployment script in our workflow. CircleCI will SSH into our server and do a <code>git pull<\/code> inside the project directory.<\/p>\n<h2>Designing the Workflow Steps<\/h2>\n<p>Before the project will be picked up by CircleCI, it needs to be altered a bit on GitHub. CircleCI, like many other CI \/ CD solutions, requires a configuration file to be placed in the project.<\/p>\n<p>Assuming that you&#8217;re looking at the <a href=\"https:\/\/www.couchbase.com\/blog\/creating-user-profile-store-with-node-js-nosql-database\/\" target=\"_blank\" rel=\"noopener\">user profile store project<\/a>, we need to create a directory called <strong>.circleci<\/strong> at the root with a file called <strong>config.yml<\/strong>.<\/p>\n<p>Open this <strong>.circleci\/config.yml<\/strong> file and add the following:<\/p>\n<pre class=\"lang:default decode:true \">version: 2\r\njobs:\r\n    build:\r\n        docker:\r\n            - image: circleci\/node:7\r\n        steps:\r\n            - checkout\r\n            - run:\r\n                name: install-dependencies\r\n                command: npm install\r\n            - run:\r\n                name: tests\r\n                command: npm test\r\n            - deploy:\r\n                name: digital-ocean\r\n                command: ssh -o \"StrictHostKeyChecking no\" user@hostname \"cd ~\/profile-store; git pull; npm install; forever start app.js\"<\/pre>\n<p>So what is happening in the above configuration?<\/p>\n<p>We&#8217;re saying that we want to spin up a Docker container running Node 7.x to perform our tests and other workflow tests. In regards to the steps, first the project is checked out from GitHub into the container. Then we install all dependencies into the project as they are not committed into GitHub. The <strong>package.json<\/strong> of our project has a script called <strong>test<\/strong> which in theory would run our tests. Our project doesn&#8217;t have any real tests.<\/p>\n<p>Provided the previous three steps were successful, a deployment happens. This command will SSH into our server, navigate to the directory of our choosing, pull changes to the project, install any potentially new dependencies, and start the <strong>forever<\/strong> process.<\/p>\n<p>We are able to deploy our project through SSH because at this point we&#8217;re sure the previous local steps had succeeded on the container.<\/p>\n<p>Commit the project changes to GitHub so we can configure the project in the CircleCI dashboard.<\/p>\n<h2>Configuring the Project within the CircleCI Dashboard<\/h2>\n<p>A few things need to be configured within CircleCI to get the CI \/ CD pipeline functional for the project. Within your <a href=\"https:\/\/circleci.com\/projects\" target=\"_blank\" rel=\"noopener\">CircleCI dashboard<\/a> find the GitHub project that you wish to manage. If you&#8217;ve linked GitHub with CircleCI, there is a good chance it will show up already because of the configuration file addition.<\/p>\n<p>Within the project settings, find the\u00a0<strong>SSH Permissions<\/strong> section.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-3910 size-full\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2017\/08\/circle-ci-ssh-key.png\" alt=\"CircleCI SSH Permissions Example\" width=\"1100\" height=\"510\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/08\/circle-ci-ssh-key.png 1100w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/08\/circle-ci-ssh-key-300x139.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/08\/circle-ci-ssh-key-1024x475.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/08\/circle-ci-ssh-key-768x356.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/08\/circle-ci-ssh-key-20x9.png 20w\" sizes=\"auto, (max-width: 1100px) 100vw, 1100px\" \/><\/p>\n<p>You&#8217;ll want to copy the private key created earlier into this section. This will allow CircleCI to connect to your server for deployment. Remember, as of right now, the SSH key must be passwordless.<\/p>\n<p>At this point, any future pushes to GitHub should result in the pipeline starting. If everything passes, you should be able to access the changes as they happen on your server running Node.js.<\/p>\n<h2>Where is the NoSQL Benefit?<\/h2>\n<p>Let&#8217;s say that your code changes involve changes to your data model. If you were using an RDBMS, you would likely have to push a SQL script with a bunch of <code>ALTER<\/code> statements every time you make a change. While possible, it definitely isn&#8217;t convenient.<\/p>\n<p>Let&#8217;s get a little more specific here.<\/p>\n<p>Say I wanted to include address information in each of my user profiles, something that wasn&#8217;t previously being collected. With NoSQL and a flexible JSON model, I could just add the information to my JavaScript objects being saved and complete the save. No need to create any migration scripts.<\/p>\n<h2>Conclusion<\/h2>\n<p>You just saw how to use CircleCI for continuous deployment of a Node.js web application. We had used a <a href=\"https:\/\/www.couchbase.com\/blog\/user-profile-store-advanced-data-modeling\/\">user profile store<\/a> application from a <a href=\"https:\/\/www.couchbase.com\/blog\/creating-user-profile-store-with-node-js-nosql-database\/\" target=\"_blank\" rel=\"noopener\">previous example<\/a>, and deployed it to a server via SSH whenever new changes were pushed to GitHub.<\/p>\n<p>There are many continuous integration and continuous deployment solutions available. If you want to host your own solution, you can check out a variation of this tutorial that uses Jenkins called,\u00a0<a href=\"https:\/\/www.couchbase.com\/blog\/create-continuous-deployment-pipeline-nodejs-jenkins\/\" target=\"_blank\" rel=\"noopener\">Create a Continuous Deployment Pipeline with Node.js and Jenkins<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>A few months back I had written about creating a continuous deployment pipeline with Node.js and Jenkins, where the Node.js application was using Couchbase in some fashion. Essentially, it took a project from GitHub, installed the dependencies, ran the tests, [&hellip;]<\/p>\n","protected":false},"author":63,"featured_media":13873,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1815,1822],"tags":[1919,2031,1567],"ppma_author":[9032],"class_list":["post-3907","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-best-practices-and-tutorials","category-node-js","tag-cd","tag-ci","tag-continuous-deployment"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v27.3 (Yoast SEO v27.3) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Continuously Deploying a Node.js Application Using CircleCI<\/title>\n<meta name=\"description\" content=\"Learn how to continuously deploy your Node.js web application changes on GitHub to a remote web server via SSH with CircleCI.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.couchbase.com\/blog\/continuously-deploying-nodejs-application-circleci\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Continuously Deploying a Node.js Application Using CircleCI\" \/>\n<meta property=\"og:description\" content=\"Learn how to continuously deploy your Node.js web application changes on GitHub to a remote web server via SSH with CircleCI.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/continuously-deploying-nodejs-application-circleci\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/thepolyglotdeveloper\" \/>\n<meta property=\"article:published_time\" content=\"2017-09-05T14:00:02+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-06-08T20:38:35+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2017\/08\/circle-ci-ssh-key.png\" \/>\n<meta name=\"author\" content=\"Nic Raboy, Developer Advocate, Couchbase\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@nraboy\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Nic Raboy, Developer Advocate, Couchbase\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"5 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/continuously-deploying-nodejs-application-circleci\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/continuously-deploying-nodejs-application-circleci\\\/\"},\"author\":{\"name\":\"Nic Raboy, Developer Advocate, Couchbase\",\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/#\\\/schema\\\/person\\\/bb545ebe83bb2d12f91095811d0a72e1\"},\"headline\":\"Continuously Deploying a Node.js Application Using CircleCI\",\"datePublished\":\"2017-09-05T14:00:02+00:00\",\"dateModified\":\"2023-06-08T20:38:35+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/continuously-deploying-nodejs-application-circleci\\\/\"},\"wordCount\":1072,\"commentCount\":1,\"publisher\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/continuously-deploying-nodejs-application-circleci\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/1\\\/2022\\\/11\\\/couchbase-nosql-dbaas.png\",\"keywords\":[\"cd\",\"ci\",\"Continuous Deployment\"],\"articleSection\":[\"Best Practices and Tutorials\",\"Node.js\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/continuously-deploying-nodejs-application-circleci\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/continuously-deploying-nodejs-application-circleci\\\/\",\"url\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/continuously-deploying-nodejs-application-circleci\\\/\",\"name\":\"Continuously Deploying a Node.js Application Using CircleCI\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/continuously-deploying-nodejs-application-circleci\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/continuously-deploying-nodejs-application-circleci\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/1\\\/2022\\\/11\\\/couchbase-nosql-dbaas.png\",\"datePublished\":\"2017-09-05T14:00:02+00:00\",\"dateModified\":\"2023-06-08T20:38:35+00:00\",\"description\":\"Learn how to continuously deploy your Node.js web application changes on GitHub to a remote web server via SSH with CircleCI.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/continuously-deploying-nodejs-application-circleci\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/continuously-deploying-nodejs-application-circleci\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/continuously-deploying-nodejs-application-circleci\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/1\\\/2022\\\/11\\\/couchbase-nosql-dbaas.png\",\"contentUrl\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/1\\\/2022\\\/11\\\/couchbase-nosql-dbaas.png\",\"width\":1800,\"height\":630},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/continuously-deploying-nodejs-application-circleci\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Continuously Deploying a Node.js Application Using CircleCI\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/\",\"name\":\"The Couchbase Blog\",\"description\":\"Couchbase, the NoSQL Database\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/#organization\",\"name\":\"The Couchbase Blog\",\"url\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/wp-content\\\/uploads\\\/2023\\\/04\\\/admin-logo.png\",\"contentUrl\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/wp-content\\\/uploads\\\/2023\\\/04\\\/admin-logo.png\",\"width\":218,\"height\":34,\"caption\":\"The Couchbase Blog\"},\"image\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/#\\\/schema\\\/person\\\/bb545ebe83bb2d12f91095811d0a72e1\",\"name\":\"Nic Raboy, Developer Advocate, Couchbase\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/bedeb68368d4681aca4c74fe5f697f0c423b80d498ec50fd915ba018b72c101f?s=96&d=mm&r=g8863514d8bed0cf6080f23db40e00354\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/bedeb68368d4681aca4c74fe5f697f0c423b80d498ec50fd915ba018b72c101f?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/bedeb68368d4681aca4c74fe5f697f0c423b80d498ec50fd915ba018b72c101f?s=96&d=mm&r=g\",\"caption\":\"Nic Raboy, Developer Advocate, Couchbase\"},\"description\":\"Nic Raboy is an advocate of modern web and mobile development technologies. He has experience in Java, JavaScript, Golang and a variety of frameworks such as Angular, NativeScript, and Apache Cordova. Nic writes about his development experiences related to making web and mobile development easier to understand.\",\"sameAs\":[\"https:\\\/\\\/www.thepolyglotdeveloper.com\",\"https:\\\/\\\/www.facebook.com\\\/thepolyglotdeveloper\",\"https:\\\/\\\/x.com\\\/nraboy\"],\"url\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/author\\\/nic-raboy-2\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Continuously Deploying a Node.js Application Using CircleCI","description":"Learn how to continuously deploy your Node.js web application changes on GitHub to a remote web server via SSH with CircleCI.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.couchbase.com\/blog\/continuously-deploying-nodejs-application-circleci\/","og_locale":"en_US","og_type":"article","og_title":"Continuously Deploying a Node.js Application Using CircleCI","og_description":"Learn how to continuously deploy your Node.js web application changes on GitHub to a remote web server via SSH with CircleCI.","og_url":"https:\/\/www.couchbase.com\/blog\/continuously-deploying-nodejs-application-circleci\/","og_site_name":"The Couchbase Blog","article_author":"https:\/\/www.facebook.com\/thepolyglotdeveloper","article_published_time":"2017-09-05T14:00:02+00:00","article_modified_time":"2023-06-08T20:38:35+00:00","og_image":[{"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2017\/08\/circle-ci-ssh-key.png","type":"","width":"","height":""}],"author":"Nic Raboy, Developer Advocate, Couchbase","twitter_card":"summary_large_image","twitter_creator":"@nraboy","twitter_misc":{"Written by":"Nic Raboy, Developer Advocate, Couchbase","Est. reading time":"5 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/continuously-deploying-nodejs-application-circleci\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/continuously-deploying-nodejs-application-circleci\/"},"author":{"name":"Nic Raboy, Developer Advocate, Couchbase","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/bb545ebe83bb2d12f91095811d0a72e1"},"headline":"Continuously Deploying a Node.js Application Using CircleCI","datePublished":"2017-09-05T14:00:02+00:00","dateModified":"2023-06-08T20:38:35+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/continuously-deploying-nodejs-application-circleci\/"},"wordCount":1072,"commentCount":1,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/continuously-deploying-nodejs-application-circleci\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","keywords":["cd","ci","Continuous Deployment"],"articleSection":["Best Practices and Tutorials","Node.js"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/continuously-deploying-nodejs-application-circleci\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/continuously-deploying-nodejs-application-circleci\/","url":"https:\/\/www.couchbase.com\/blog\/continuously-deploying-nodejs-application-circleci\/","name":"Continuously Deploying a Node.js Application Using CircleCI","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/continuously-deploying-nodejs-application-circleci\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/continuously-deploying-nodejs-application-circleci\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","datePublished":"2017-09-05T14:00:02+00:00","dateModified":"2023-06-08T20:38:35+00:00","description":"Learn how to continuously deploy your Node.js web application changes on GitHub to a remote web server via SSH with CircleCI.","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/continuously-deploying-nodejs-application-circleci\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/continuously-deploying-nodejs-application-circleci\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.couchbase.com\/blog\/continuously-deploying-nodejs-application-circleci\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","width":1800,"height":630},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/continuously-deploying-nodejs-application-circleci\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Continuously Deploying a Node.js Application Using CircleCI"}]},{"@type":"WebSite","@id":"https:\/\/www.couchbase.com\/blog\/#website","url":"https:\/\/www.couchbase.com\/blog\/","name":"The Couchbase Blog","description":"Couchbase, the NoSQL Database","publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.couchbase.com\/blog\/#organization","name":"The Couchbase Blog","url":"https:\/\/www.couchbase.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","width":218,"height":34,"caption":"The Couchbase Blog"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/bb545ebe83bb2d12f91095811d0a72e1","name":"Nic Raboy, Developer Advocate, Couchbase","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/bedeb68368d4681aca4c74fe5f697f0c423b80d498ec50fd915ba018b72c101f?s=96&d=mm&r=g8863514d8bed0cf6080f23db40e00354","url":"https:\/\/secure.gravatar.com\/avatar\/bedeb68368d4681aca4c74fe5f697f0c423b80d498ec50fd915ba018b72c101f?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/bedeb68368d4681aca4c74fe5f697f0c423b80d498ec50fd915ba018b72c101f?s=96&d=mm&r=g","caption":"Nic Raboy, Developer Advocate, Couchbase"},"description":"Nic Raboy is an advocate of modern web and mobile development technologies. He has experience in Java, JavaScript, Golang and a variety of frameworks such as Angular, NativeScript, and Apache Cordova. Nic writes about his development experiences related to making web and mobile development easier to understand.","sameAs":["https:\/\/www.thepolyglotdeveloper.com","https:\/\/www.facebook.com\/thepolyglotdeveloper","https:\/\/x.com\/nraboy"],"url":"https:\/\/www.couchbase.com\/blog\/author\/nic-raboy-2\/"}]}},"acf":[],"authors":[{"term_id":9032,"user_id":63,"is_guest":0,"slug":"nic-raboy-2","display_name":"Nic Raboy, Developer Advocate, Couchbase","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/bedeb68368d4681aca4c74fe5f697f0c423b80d498ec50fd915ba018b72c101f?s=96&d=mm&r=g","0":null,"1":"","2":"","3":"","4":"","5":"","6":"","7":"","8":""}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/posts\/3907","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/users\/63"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/comments?post=3907"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/posts\/3907\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/media\/13873"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/media?parent=3907"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/categories?post=3907"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/tags?post=3907"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/ppma_author?post=3907"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}