{"id":5334,"date":"2018-06-18T06:26:51","date_gmt":"2018-06-18T13:26:51","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=5334"},"modified":"2025-06-13T22:39:42","modified_gmt":"2025-06-14T05:39:42","slug":"couchbase-data-platform-action-setup-steps","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/couchbase-data-platform-action-setup-steps\/","title":{"rendered":"The Couchbase Data Platform in Action: Step-by-Step Setup"},"content":{"rendered":"<div id=\"content\">\n<div id=\"preamble\">\n<div class=\"sectionbody\">\n<div class=\"paragraph\">\n<p><strong>Note:<\/strong> This post uses the the Couchbase Analytics Data Definition Language as of the version 5.5 preview release.\u00a0 For updates and information on breaking changes in newer versions, please refer to\u00a0<a href=\"https:\/\/www.couchbase.com\/blog\/couchbase-analytics-service-changes\/\">Changes to the Couchbase Analytics Service<\/a>.<\/p>\n<p>The application built for the Couchbase Connect Silicon Valley conference last fall incorporates dynamic N1QL queries, offline mobile, IoT sensors, ad hoc queries with analytics, cross-data center replication, failover, fuzzy text matching, and a slew of other features.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>You can watch the keynote demonstration <a title=\"https:\/\/youtu.be\/-U_UjqnhMBI\" href=\"https:\/\/youtu.be\/-U_UjqnhMBI\">here<\/a>, find out about the high-level architecture <a title=\"https:\/\/www.couchbase.com\/blog\/couchbase-connect-2017-demo-technical-overview\/\" href=\"https:\/\/www.couchbase.com\/blog\/couchbase-connect-2017-demo-technical-overview\/\">here<\/a>, and watch a full walk-through of how to set up the demo <a title=\"https:\/\/youtu.be\/RlSMLkd9vrg\" href=\"https:\/\/youtu.be\/RlSMLkd9vrg\">here<\/a>.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>In this post, I\u2019ll go through all the steps to configure and run the demo. We\u2019ll do this through the command line. (Some steps require the <a title=\"https:\/\/curl.haxx.se\/\" href=\"https:\/\/curl.haxx.se\/\">cURL<\/a> tool.)<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Throughout I include direct links to video that goes over similar material.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"sect1\">\n<h2 id=\"_clone_repository_and_set_working_directory\">Clone Repository and Set Working Directory<\/h2>\n<div class=\"sectionbody\">\n<div class=\"paragraph\">\n<p>You can find the code for the demo on <a title=\"https:\/\/github.com\/couchbaselabs\/connect-fall-2017-demo\" href=\"https:\/\/github.com\/couchbaselabs\/connect-fall-2017-demo\">GitHub<\/a>. Clone the repo and change directories to the top level.<\/p>\n<\/div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"pygments highlight\"><code>git clone https:\/\/github.com\/couchbaselabs\/connect-fall-2017-demo.git\r\ncd connect-fall-2017-demo<\/code><\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"sect1\">\n<h2 id=\"_configuring_couchbase_server\">Configuring Couchbase Server<\/h2>\n<div class=\"sectionbody\">\n<div class=\"paragraph\">\n<p>The demo project depends on new capabilities slated for Couchbase 5.5. As of this writing, 5.5 is in beta. Download and install Couchbase 5.5 for your platform <a title=\"https:\/\/www.couchbase.com\/downloads\" href=\"https:\/\/www.couchbase.com\/downloads\/\">here<\/a>. Start a node running.<\/p>\n<\/div>\n<div class=\"sect2\">\n<h3 id=\"_preparing\">Preparing<\/h3>\n<div class=\"paragraph\">\n<p>The following assumes you\u2019re running on <code>localhost<\/code>. You can adjust to a remote host as necessary. The command executables are included in your Couchbase installation. You may want to add the tools directory to your command path. For example, on a Mac, you can do something like this.<\/p>\n<\/div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"pygments highlight\"><code>export PATH=\"$PATH:\/path\/to\/install\/Couchbase Server.app\/Contents\/Resources\/couchbase-core\/bin\"<\/code><\/pre>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"sect2\">\n<h3 id=\"_initialize_the_node\">Initialize the Node<\/h3>\n<div class=\"paragraph\">\n<p>To initialize the first node, we need three steps.<\/p>\n<\/div>\n<div class=\"ulist\">\n<ul>\n<li>Basic setup of the administrative user, services to run, and memory allocations<\/li>\n<li>Creation of the main application bucket<\/li>\n<li>Adding a separate user for role-based access control.<\/li>\n<\/ul>\n<\/div>\n<div class=\"paragraph\">\n<p>Run the following commands to perform these steps.<\/p>\n<\/div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"pygments highlight\"><code># Basic memory and service configuration\r\ncouchbase-cli cluster-init --cluster couchbase:\/\/127.0.0.1 --cluster-name cluster \\\r\n  --cluster-username Administrator --cluster-password password \\\r\n  --services data,index,query,fts,analytics,eventing --cluster-ramsize 256 --cluster-analytics-ramsize 1024 \\\r\n  --cluster-index-ramsize 256 --cluster-fts-ramsize 256 --index-storage-setting default\r\n# Main bucket creation\r\ncouchbase-cli bucket-create --cluster couchbase:\/\/127.0.0.1 -u Administrator -p password \\\r\n  --bucket health --bucket-type couchbase --bucket-ramsize 100\r\n# Role-Based Access Control\r\ncouchbase-cli user-manage --cluster couchbase:\/\/127.0.0.1 -u Administrator -p password \\\r\n  --set --rbac-username admin --rbac-password password \\\r\n  --rbac-name \"J. R. Admin\" --roles \"Admin\" --auth-domain local<\/code><\/pre>\n<\/div>\n<\/div>\n<div class=\"paragraph\">\n<p>Most of the parameters for these commands should be fairly straight-forward to figure out.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Couchbase Server nodes can be dedicated to running a subset of all available services, part of what\u2019s referred to as <a title=\"https:\/\/developer.couchbase.com\/documentation\/server\/current\/architecture\/services-archi-multi-dimensional-scaling.html\" href=\"https:\/\/developer.couchbase.com\/documentation\/server\/current\/architecture\/services-archi-multi-dimensional-scaling.html\">Multidimensional Scaling<\/a>. Here, we\u2019re configuring the node with all the services needed by the application.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>The RAM allocations are all set to their minimum values. These aren\u2019t typically what you\u2019d use in production, but are plenty for data included here.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Note the cluster specification uses a custom URL, <code>couchbase:\/\/127.0.0.1<\/code>. There are other ways to specify it, but this is the easiest. This is telling the commands to connect to Couchbase Server on the local machine.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>After running these commands, it will typically take a few moments to warm the node up. Give it a short pause before proceeding with the next steps.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Related video:<\/p>\n<\/div>\n<div class=\"ulist\">\n<ul>\n<li><a title=\"https:\/\/www.youtube.com\/watch?v=RlSMLkd9vrg&amp;t=111s\" href=\"https:\/\/www.youtube.com\/watch?v=RlSMLkd9vrg&amp;t=111s\">Couchbase Server Basic Setup<\/a><\/li>\n<li><a title=\"https:\/\/www.youtube.com\/watch?v=RlSMLkd9vrg&amp;t=184s\" href=\"https:\/\/www.youtube.com\/watch?v=RlSMLkd9vrg&amp;t=184s\">Bucket Creation<\/a><\/li>\n<li><a title=\"https:\/\/www.youtube.com\/watch?v=RlSMLkd9vrg&amp;t=214s\" href=\"https:\/\/www.youtube.com\/watch?v=RlSMLkd9vrg&amp;t=214s\">Role-Based Access Control<\/a><\/li>\n<\/ul>\n<\/div>\n<\/div>\n<div class=\"sect2\">\n<h3 id=\"_data\">Data<\/h3>\n<div class=\"paragraph\">\n<p>We generated realistic synthetic patient data using the <a title=\"https:\/\/github.com\/synthetichealth\/synthea\" href=\"https:\/\/github.com\/synthetichealth\/synthea\">Synthea<\/a> tool (Copyright \u00a9 2018 The MITRE Corporation). Synthea is open source and free to use. The full demo at Connect 2017 used hundreds of millions of records. A dataset more suitable for running on a single machine has been included in the demo source repository. To load it, execute the following.<\/p>\n<\/div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"pygments highlight\"><code># Load sample data\r\nfor file in data\/*.json\r\ndo\r\n  cbimport json -c couchbase:\/\/127.0.0.1:8091 -d file:\/\/${file} -g '%id%' -f lines -b health -u admin -p password\r\ndone<\/code><\/pre>\n<\/div>\n<\/div>\n<div class=\"paragraph\">\n<p>The options tell <code>cbimport<\/code> to expect one record per line, and to auto-generate the document key from the id field of each record.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Related video:<\/p>\n<\/div>\n<div class=\"ulist\">\n<ul>\n<li><a title=\"https:\/\/www.youtube.com\/watch?v=RlSMLkd9vrg&amp;t=622s\" href=\"https:\/\/www.youtube.com\/watch?v=RlSMLkd9vrg&amp;t=622s\">Importing Data<\/a><\/li>\n<\/ul>\n<\/div>\n<\/div>\n<div class=\"sect2\">\n<h3 id=\"_eventing_service\">Eventing Service<\/h3>\n<div class=\"paragraph\">\n<p>The <a title=\"https:\/\/developer.couchbase.com\/documentation\/server\/5.5\/eventing\/eventing-overview.html\" href=\"https:\/\/developer.couchbase.com\/documentation\/server\/5.5\/eventing\/eventing-overview.html\">Couchbase Eventing Service<\/a> is one of the new features being added in release 5.5. It allows you to monitor changes in the database and run JavaScript functions in response.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>In this application we use it to monitor incoming patient data. This lets us push the data to the web app, rather than relying on polling. This happens using the <a title=\"https:\/\/developer.couchbase.com\/documentation\/server\/current\/n1ql\/n1ql-language-reference\/curl.html\" href=\"https:\/\/developer.couchbase.com\/documentation\/server\/current\/n1ql\/n1ql-language-reference\/curl.html\">cURL capabilities<\/a> built into <a title=\"https:\/\/www.couchbase.com\/n1ql\" href=\"https:\/\/www.couchbase.com\/n1ql\/\">N1QL<\/a>.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>To do this, we need to set up a JavaScript function that watches changes in the database. Currently the Eventing Service needs its own meta-data bucket as well. Configure this part with the following commands.<\/p>\n<\/div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"pygments highlight\"><code># Eventing Service meta-data bucket creation\r\ncouchbase-cli bucket-create --cluster couchbase:\/\/127.0.0.1 -u Administrator -p password \\\r\n  --bucket eventing --bucket-type couchbase --bucket-ramsize 100\r\n# Eventing Service function\r\ncurl -X POST -u admin:password -d \"@scripts\/config\/eventing\" https:\/\/127.0.0.1:8096\/api\/v1\/functions\/monitor<\/code><\/pre>\n<\/div>\n<\/div>\n<div class=\"paragraph\">\n<p>Here\u2019s the actual JavaScript.<\/p>\n<\/div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"pygments highlight\"><code>function OnUpdate(doc, meta) {\r\n  if (doc.resourceType != 'Observation') return;\r\n\r\n  let reference = doc.subject.reference;\r\n  let url = \"https:\/\/localhost:8080\/events\/\" + reference.substr(9);\r\n  let data = JSON.stringify({\r\n    \"reference\": doc.subject.reference,\r\n    \"code\": doc.code.coding[0].code,\r\n    \"recordedAt\": doc.issued,\r\n    \"value\": doc.valueQuantity.value\r\n  });\r\n\r\n  let curl = SELECT CURL($url, {\r\n    \"request\": \"POST\",\r\n    \"header\": [ \"Content-Type: application\/json\", \"accept: application\/json\" ],\r\n    \"data\": $data\r\n  });\r\n\r\n  curl.execQuery();\r\n}\r\n\r\nfunction OnDelete(meta) {}<\/code><\/pre>\n<\/div>\n<\/div>\n<div class=\"paragraph\">\n<p>This function only processes &#8220;Observation&#8221; documents. It extracts a few elements we want to display on in the web console. It then uses a <code>cURL<\/code> call to post that data to a REST endpoint on the web server.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Related video:<\/p>\n<\/div>\n<div class=\"ulist\">\n<ul>\n<li><a title=\"https:\/\/www.youtube.com\/watch?v=RlSMLkd9vrg&amp;t=282s\" href=\"https:\/\/www.youtube.com\/watch?v=RlSMLkd9vrg&amp;t=282s\">Eventing Service<\/a><\/li>\n<\/ul>\n<\/div>\n<\/div>\n<div class=\"sect2\">\n<h3 id=\"_query_indexes\">Query Indexes<\/h3>\n<div class=\"paragraph\">\n<p>The application relies on a number of <a title=\"https:\/\/www.couchbase.com\/n1ql\" href=\"https:\/\/www.couchbase.com\/n1ql\/\">N1QL<\/a> queries. These would run if you define a primary index, but they would be slow. Instead, add three <a title=\"https:\/\/docs.couchbase.com\/server\/6.0\/indexes\/gsi-for-n1ql.html\" href=\"https:\/\/docs.couchbase.com\/server\/6.0\/indexes\/gsi-for-n1ql.html\">Global Secondary Indexes<\/a>.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>The data used in the application follows the <a title=\"https:\/\/www.hl7.org\/fhir\/overview.html\" href=\"https:\/\/www.hl7.org\/fhir\/overview.html\">FHIR<\/a> specification. Records include a <code>resourceType<\/code> field. For example, &#8220;Observation&#8221;, &#8220;Condition&#8221;, and &#8220;Practitioner&#8221; are all resource types. The first index optimizes queries against this field.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>In the dashboard we show graphs of temperatures. The are recorded as &#8220;Observation&#8221; documents. The second index pulls out the main information we care about displaying. (Compare the fields here with what gets pushed by the Eventing code.) This makes lookups and retrieval of the relevant data fast, since everything we need is stored in the index.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>The last index is built against &#8220;Location&#8221; records. This is used to allow us to connect patients with their nearest hospital.<\/p>\n<\/div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"pygments highlight\"><code># Indexes for query optimization\r\ncbq -u admin -p password -q --script=\"CREATE INDEX \\\\`resource-idx\\\\` ON health(resourceType, id);\"\r\ncbq -u admin -p password -q --script=\"CREATE INDEX \\\\`observation-idx\\\\` ON health(subject.reference, issued DESC, valueQuantity.\\\\`value\\\\`)\"\r\ncbq -u admin -p password -q --script=\"CREATE INDEX \\\\`location-idx\\\\` ON health(type.coding[0].code) WHERE resourceType = 'Location';\"<\/code><\/pre>\n<\/div>\n<\/div>\n<div class=\"paragraph\">\n<p>Related video:<\/p>\n<\/div>\n<div class=\"ulist\">\n<ul>\n<li><a title=\"https:\/\/www.youtube.com\/watch?v=RlSMLkd9vrg&amp;t=240s\" href=\"https:\/\/www.youtube.com\/watch?v=RlSMLkd9vrg&amp;t=240s\">Query Index Creation<\/a><\/li>\n<\/ul>\n<\/div>\n<\/div>\n<div class=\"sect2\">\n<h3 id=\"_analytics\">Analytics<\/h3>\n<div class=\"paragraph\">\n<p>The application can examine some case history data. This kind of free-form analysis is better suited to the new <a title=\"https:\/\/developer.couchbase.com\/documentation\/server\/5.5\/analytics\/introduction.html\" href=\"https:\/\/developer.couchbase.com\/documentation\/server\/5.5\/analytics\/introduction.html\">Couchbase Analytics Service<\/a> (currently in preview).<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>The Analytics Service works by automatically importing data from the operational database buckets into its own special-purpose buckets. You then define what are known as shadow datasets. Finally, you must issue an instruction to connect the analytics to your operational data. After that, queries are done using SQL++, an superset of SQL similar to N1QL. You can read more in <a title=\"https:\/\/developer.couchbase.com\/documentation\/server\/5.5\/analytics\/primer-beer.html\" href=\"https:\/\/developer.couchbase.com\/documentation\/server\/5.5\/analytics\/primer-beer.html\">this tutorial<\/a>.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>All the configuration is done by issuing commands through the analytics query engine. Configure the necessary pieces for the demo with the following command.<\/p>\n<\/div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"pygments highlight\"><code># Analytics Service configuration\r\ncat scripts\/config\/analytics | while read query\r\ndo\r\n  curl -u admin:password --data-urlencode \"statement=${query}\" https:\/\/127.0.0.1:8095\/analytics\/service\r\ndone<\/code><\/pre>\n<\/div>\n<\/div>\n<div class=\"paragraph\">\n<p>Here are the actual commands being run.<\/p>\n<\/div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"pygments highlight\"><code>CREATE BUCKET ha WITH {\"name\":\"health\"}\r\nCREATE SHADOW DATASET patient ON ha WHERE resourceType = \"Patient\"\r\nCREATE SHADOW DATASET condition ON ha WHERE resourceType = \"Condition\"\r\nCREATE SHADOW DATASET encounter ON ha WHERE resourceType = \"Encounter\"\r\nCONNECT BUCKET ha<\/code><\/pre>\n<\/div>\n<\/div>\n<div class=\"paragraph\">\n<p>You could do this just as well from the query interface on the Couchbase Server web console, using the lines exactly as shown above.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Related video:<\/p>\n<\/div>\n<div class=\"ulist\">\n<ul>\n<li><a title=\"https:\/\/www.youtube.com\/watch?v=RlSMLkd9vrg&amp;t=380s\" href=\"https:\/\/www.youtube.com\/watch?v=RlSMLkd9vrg&amp;t=380s\">Configuring Analytics<\/a><\/li>\n<\/ul>\n<\/div>\n<\/div>\n<div class=\"sect2\">\n<h3 id=\"_full_text_search\">Full-Text Search<\/h3>\n<div class=\"paragraph\">\n<p>Couchbase Server Full-Text Search allows language aware matching based both on indexed fields and the input search terms. It provides a great deal of power when searching free-form text. For this application, we use it to pull out records based on just that: entries in FHIR documents set aside for unstructured notes.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Configure the needed indexes as follows.<\/p>\n<\/div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"pygments highlight\"><code># Full-Text Search index\r\ncurl -u admin:password -T \"scripts\/config\/fts-index.json\" https:\/\/127.0.0.1:8094\/api\/index\/diagnosis<\/code><\/pre>\n<\/div>\n<\/div>\n<div class=\"paragraph\">\n<p>The index is too complicated to go through here in full. I&#8217;ll just touch on some main points.<\/p>\n<div>\n<p>Most importantly, we\u2019re doing language aware analysis of the <code>note<\/code> field of an &#8220;Observation&#8221; document, and the <code>reason<\/code> field of an &#8220;Encounter&#8221; document. These are the fields where a care provider might enter free form text.<\/p>\n<\/div>\n<\/div>\n<div class=\"paragraph\">\n<p>Other entries are there to pull data in simply to display or for use in faceting. Faceting lets a user restrict and refine searches. It\u2019s a powerful way to allow structured drilling down into data.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Look for a future post going through the index and the FTS code for more details.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Related video:<\/p>\n<\/div>\n<div class=\"ulist\">\n<ul>\n<li><a title=\"https:\/\/www.youtube.com\/watch?v=RlSMLkd9vrg&amp;t=422s\" href=\"https:\/\/www.youtube.com\/watch?v=RlSMLkd9vrg&amp;t=422s\">Full-Text Search<\/a><\/li>\n<\/ul>\n<\/div>\n<\/div>\n<div class=\"sect2\">\n<h3 id=\"_curl_access_restrictions\">cURL Access Restrictions<\/h3>\n<div class=\"paragraph\">\n<p><a title=\"https:\/\/www.couchbase.com\/n1ql\" href=\"https:\/\/www.couchbase.com\/n1ql\/\">N1QL<\/a> queries can include <code>cURL<\/code>-style network calls. We use these for pushing updates to the web app, and for obtaining geomapping data via Google.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Since these calls originate from a query service node, they have important security implications. Therefore, by default, it\u2019s turned off.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>We need to authorize calls to the Google endpoint and to an api on the web server. Do that with the following command.<\/p>\n<\/div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"pygments highlight\"><code># cURL site whitelist\r\ncurl -X POST -u admin:password -d \"@scripts\/config\/curl\" https:\/\/127.0.0.1:8091\/settings\/querySettings\/curlWhitelist<\/code><\/pre>\n<\/div>\n<\/div>\n<div class=\"paragraph\">\n<p>Related video:<\/p>\n<\/div>\n<div class=\"ulist\">\n<ul>\n<li><a title=\"https:\/\/www.youtube.com\/watch?v=RlSMLkd9vrg&amp;t=354s\" href=\"https:\/\/www.youtube.com\/watch?v=RlSMLkd9vrg&amp;t=354s\">cURL Access Restrictions<\/a><\/li>\n<\/ul>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"sect1\">\n<h2 id=\"_sync_gateway\">Sync Gateway<\/h2>\n<div class=\"sectionbody\">\n<div class=\"paragraph\">\n<p><a title=\"https:\/\/developer.couchbase.com\/documentation\/mobile\/current\/guides\/sync-gateway\/index.html\" href=\"https:\/\/developer.couchbase.com\/documentation\/mobile\/current\/guides\/sync-gateway\/index.html\">Sync Gateway<\/a> provides the glue between Couchbase Server and the mobile application. It also provides some of the business logic. In this case, we simply need to connect to Coucbase Server, configure basic authentication, and create a channel for our primary user.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Run Sync Gateway directly as follows.<\/p>\n<\/div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"pygments highlight\"><code>\/path\/to\/couchbase-sync-gateway\/bin\/sync_gateway sync-gateway\/cc-2017-sg-config.json<\/code><\/pre>\n<\/div>\n<\/div>\n<div class=\"paragraph\">\n<p>We\u2019re not using a filtered document import here, so this can take a little while the first time to create all the needed meta-data.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Related video:<\/p>\n<\/div>\n<div class=\"ulist\">\n<ul>\n<li><a title=\"https:\/\/www.youtube.com\/watch?v=RlSMLkd9vrg&amp;t=712s\" href=\"https:\/\/www.youtube.com\/watch?v=RlSMLkd9vrg&amp;t=712s\">Sync Gateway<\/a><\/li>\n<\/ul>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"sect1\">\n<h2 id=\"_web_client_and_server\">Web Client and Server<\/h2>\n<div class=\"sectionbody\">\n<div class=\"paragraph\">\n<p>Install <a title=\"https:\/\/nodejs.org\/en\/\" href=\"https:\/\/nodejs.org\/en\/\">Node.js<\/a>. The server requires version 7 or higher. I recommend using <a title=\"https:\/\/github.com\/creationix\/nvm\/blob\/master\/README.md\" href=\"https:\/\/github.com\/creationix\/nvm\/blob\/master\/README.md\">nvm<\/a> to manage Node versions if you have an existing installation. (The nvm installation guide can be found <a title=\"https:\/\/github.com\/creationix\/nvm\/blob\/master\/README.md=install-script\" href=\"https:\/\/github.com\/creationix\/nvm\/blob\/master\/README.md=install-script\">here<\/a>.)<\/p>\n<\/div>\n<div class=\"sect2\">\n<h3 id=\"_configuring_the_web_client\">Configuring the Web Client<\/h3>\n<div class=\"paragraph\">\n<p>The web client code is under <code>web\/client<\/code>. Under <code>src\/config<\/code> in the client code, update <code>serverURI<\/code> in the <code>index.js<\/code>file to point to your web server. This is the host the <strong>web server<\/strong> is running on. This may be different from where you run Couchbase. By default it uses <code>localhost<\/code>, so if you plan to run everything on one machine you can just leave it as is.<\/p>\n<\/div>\n<\/div>\n<div class=\"sect2\">\n<h3 id=\"_building_the_client\">Building the Client<\/h3>\n<div class=\"paragraph\">\n<p>Change directories to <code>web\/client<\/code>. Install the Node packages.<\/p>\n<\/div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"pygments highlight\"><code>npm install<\/code><\/pre>\n<\/div>\n<\/div>\n<div class=\"paragraph\">\n<p>You can run in one of two modes, development or production. Development allows easier debugging, and supports hot reloading, but is more complicated to set up. This mode requires running separate servers, one that serves the client pages and the other to expose the API we need.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Here I\u2019m only going to describe running in production mode. For the client, this just means running a build.<\/p>\n<\/div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"pygments highlight\"><code>npm run build<\/code><\/pre>\n<\/div>\n<\/div>\n<div class=\"paragraph\">\n<p>When finished, this will copy the final client files over to a subdirectory of the server directory. The Node server will pull app content from there.<\/p>\n<\/div>\n<\/div>\n<div class=\"sect2\">\n<h3 id=\"_configuring_and_running_the_web_server\">Configuring and Running the Web Server<\/h3>\n<div class=\"paragraph\">\n<p>Change directories to <code>web\/server<\/code>. Install the Node packages.<\/p>\n<\/div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"pygments highlight\"><code>npm install<\/code><\/pre>\n<\/div>\n<\/div>\n<div class=\"paragraph\">\n<p>The server has a few parameters that need setting. I included a package that will pull these either from environment variables or a file named .env in the server directory. The parameters break into two groups, those needed for <a href=\"https:\/\/www.couchbase.com\/blog\/getting-started-with-urban-airship-push-notifications\/\">Urban Airship push notifications<\/a>, and those needed to connect to Couchbase.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>The parameters are<\/p>\n<\/div>\n<div class=\"ulist\">\n<ul>\n<li>An Urban Airship application key<\/li>\n<li>An Urban Airship master secret<\/li>\n<li>The Couchbase Server cluster URL<\/li>\n<li>The username and password of a user on the CB Server cluster with appropriate privileges<\/li>\n<li>A URL for connecting to a Couchbase Server Analytics Service node.<\/li>\n<\/ul>\n<\/div>\n<div class=\"paragraph\">\n<p>This set of Bash shell commands will create a template for you.<\/p>\n<pre class=\"lang:sh decode:true\">cat &gt; .env &lt;&lt;EOF\r\nUA_APPLICATION_KEY='&lt;your app key&gt;'\r\nUA_APPLICATION_MASTER_SECRET='&lt;Your app master secret&gt;'\r\nCLUSTER='couchbase:\/\/localhost'\r\nCLUSTER_USER='admin'\r\nCLUSTER_PASSWORD='password'\r\nCLUSTER_CBAS='localhost:8095'\r\nPORT=8080\r\nEOF<\/pre>\n<\/div>\n<div class=\"paragraph\">\n<p>Alternatively, you can just set environment variables. For example, you could leave the Urban Airship parameters out, and configure them like this instead.<\/p>\n<pre class=\"lang:sh decode:true\">export UA_APPLICATION_KEY=&lt;your application key&gt;\r\nexport UA_APPLICATION_MASTER_SECRET=&lt;your application master secret&gt;<\/pre>\n<\/div>\n<div class=\"paragraph\">\n<p>If you don\u2019t want to use the Urban Airship push notification feature, set the UA keys to something arbitrary.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>You can now run the server.<\/p>\n<\/div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"pygments highlight\"><code>npm start<\/code><\/pre>\n<\/div>\n<\/div>\n<div class=\"paragraph\">\n<p>Open a browser and navigate to <code>localhost:8080<\/code>. You should see the web console.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Related video:<\/p>\n<\/div>\n<div class=\"ulist\">\n<ul>\n<li><a title=\"https:\/\/www.youtube.com\/watch?v=RlSMLkd9vrg&amp;t=33s\" href=\"https:\/\/www.youtube.com\/watch?v=RlSMLkd9vrg&amp;t=33s\">Web Server and Client Setup<\/a><\/li>\n<li><a title=\"https:\/\/www.youtube.com\/watch?v=RlSMLkd9vrg&amp;t=75s\" href=\"https:\/\/www.youtube.com\/watch?v=RlSMLkd9vrg&amp;t=75s\">Server-Side Urban Airship Configuration<\/a><\/li>\n<\/ul>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"sect1\">\n<h2 id=\"_android_mobile_application\">Android Mobile Application<\/h2>\n<div class=\"sectionbody\">\n<div class=\"paragraph\">\n<p>Open <code>mobile\/android\/CBCHealth<\/code> in Android Studio to build the application.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>The Android mobile app uses Urban Airship for push notifications. If you want to include this feature, you must fill out the Urban Airship configuration with your own keys. See <code>mobile\/android\/CBCHealth\/app\/src\/main\/assets\/airshipconfig.properties.sample<\/code>.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>If you don\u2019t want to include push notifications, remove the following line from the application\u2019s <code>AndroidManifest.xml<\/code> file.<\/p>\n<pre class=\"lang:default decode:true \">&lt;meta-data\r\n  android:name=\"com.urbanairship.autopilot\"\r\n  android:value=\"com.couchbase.mobile.notifications.Autopilot\" \/&gt;<\/pre>\n<\/div>\n<div class=\"paragraph\">\n<p>By default, this builds a version of the application for use with the Android emulator. There\u2019s a soft entry dialog for entering temperature readings.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>If you want to use the actual patch with a real device, you need to make two changes.<\/p>\n<\/div>\n<div class=\"olist arabic\">\n<ol class=\"arabic\" start=\"https:\/\/www.couchbase.com\/get-started\">\n<li>In <code>mobile\/android\/CBCHealth\/app\/build.gradle<\/code> change <code>def parameters = \".EMULATOR\"<\/code> to <code>def parameters = \".DEFAULT\"<\/code> (See <code>mobile\/android\/CBCHealth\/app\/src\/main\/java\/com\/couchbase\/mobile\/app\/launch\/Parameters.java<\/code> for definitions of these entries)<\/li>\n<li>In <code>mobile\/android\/CBCHealth\/app\/src\/main\/resources\/META-INF\/services\/com.couchbase.mobile.collectors.Collector<\/code> change <code>com.couchbase.mobile.collectors.temperature.ManualEntry<\/code> to <code>com.couchbase.mobile.collectors.temperature.RF430_TMPSNS_EVM<\/code><\/li>\n<\/ol>\n<\/div>\n<div class=\"paragraph\">\n<p>Related video:<\/p>\n<\/div>\n<div class=\"ulist\">\n<ul>\n<li><a title=\"https:\/\/www.youtube.com\/watch?v=RlSMLkd9vrg&amp;t=749s\" href=\"https:\/\/www.youtube.com\/watch?v=RlSMLkd9vrg&amp;t=749s\">Mobile Application<\/a><\/li>\n<\/ul>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"sect1\">\n<h2 id=\"_wrapping_up\">Wrapping up<\/h2>\n<div class=\"sectionbody\">\n<div class=\"paragraph\">\n<p>There\u2019s a lot going on here. The purpose of this post is primarily to get you up and running with a full-featured app you can use to try various aspects of Couchbase out.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Look for deeper dives into the code and configuration coming up.<\/p>\n<\/div>\n<div class=\"sect2\">\n<h3 id=\"_postscript\">Postscript<\/h3>\n<div class=\"paragraph\">\n<p>Couchbase is open source and <a title=\"https:\/\/www.couchbase.com\/downloads\" href=\"https:\/\/www.couchbase.com\/downloads\/\">free to try out<\/a>.<br \/>\n<strong>Get started<\/strong> with <a title=\"https:\/\/www.couchbase.com\/get-started\" href=\"https:\/\/developer.couchbase.com\/tutorials\">sample code, example queries, tutorials, and more<\/a>.<br \/>\nFind other resources on our <a title=\"https:\/\/www.couchbase.com\/developers\/community\/\" href=\"https:\/\/www.couchbase.com\/developers\/community\/\">developer portal<\/a>.<br \/>\nFollow us on Twitter <a title=\"https:\/\/twitter.com\/CouchbaseDev\" href=\"https:\/\/twitter.com\/CouchbaseDev\">@CouchbaseDev<\/a>.<br \/>\nYou can post questions on our <a title=\"https:\/\/www.couchbase.com\/forums\/\" href=\"https:\/\/www.couchbase.com\/forums\/\">forums<\/a>.<br \/>\nWe actively participate on <a title=\"https:\/\/stackoverflow.com\/questions\/tagged\/couchbase\" href=\"https:\/\/stackoverflow.com\/questions\/tagged\/couchbase\">Stack Overflow<\/a>.<br \/>\nHit me up on Twitter with any questions, comments, topics you\u2019d like to see, etc. <a title=\"https:\/\/twitter.com\/HodGreeley\" href=\"https:\/\/twitter.com\/HodGreeley\">@HodGreeley<\/a><\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Note: This post uses the the Couchbase Analytics Data Definition Language as of the version 5.5 preview release.\u00a0 For updates and information on breaking changes in newer versions, please refer to\u00a0Changes to the Couchbase Analytics Service. The application built for [&hellip;]<\/p>\n","protected":false},"author":73,"featured_media":5194,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1814,1815,2294,7667,1810,1816,2273,2165,1812],"tags":[1998,2241,2255,1996,2177,1771,2239,2240,1337,1725],"ppma_author":[9042],"class_list":["post-5334","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-application-design","category-best-practices-and-tutorials","category-analytics","category-couchbase-lite","category-couchbase-mobile","category-couchbase-server","category-eventing","category-full-text-search","category-n1ql-query","tag-application","tag-configure","tag-connect-sv-2017-demo","tag-couchbase-connect","tag-couchbase-data-platform","tag-curl","tag-demo","tag-demonstration","tag-iot","tag-nosql-database"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v25.7.1 (Yoast SEO v25.7) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>The Couchbase Data Platform in Action: Step-by-Step Setup<\/title>\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\/couchbase-data-platform-action-setup-steps\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"The Couchbase Data Platform in Action: Step-by-Step Setup\" \/>\n<meta property=\"og:description\" content=\"Note: This post uses the the Couchbase Analytics Data Definition Language as of the version 5.5 preview release.\u00a0 For updates and information on breaking changes in newer versions, please refer to\u00a0Changes to the Couchbase Analytics Service. The application built for [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/couchbase-data-platform-action-setup-steps\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2018-06-18T13:26:51+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-06-14T05:39:42+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/05\/DemoShort_720.gif\" \/>\n\t<meta property=\"og:image:width\" content=\"720\" \/>\n\t<meta property=\"og:image:height\" content=\"385\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/gif\" \/>\n<meta name=\"author\" content=\"Hod Greeley, Developer Advocate, Couchbase\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@HodGreeley\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Hod Greeley, Developer Advocate, Couchbase\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"9 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-data-platform-action-setup-steps\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-data-platform-action-setup-steps\/\"},\"author\":{\"name\":\"Hod Greeley, Developer Advocate, Couchbase\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/9b62593c8a13531e53d52fcd5aabbca4\"},\"headline\":\"The Couchbase Data Platform in Action: Step-by-Step Setup\",\"datePublished\":\"2018-06-18T13:26:51+00:00\",\"dateModified\":\"2025-06-14T05:39:42+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-data-platform-action-setup-steps\/\"},\"wordCount\":1929,\"commentCount\":1,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-data-platform-action-setup-steps\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/05\/DemoShort_720.gif\",\"keywords\":[\"application\",\"Configure\",\"Connect SV 2017 Demo\",\"Couchbase Connect\",\"Couchbase Data Platform\",\"curl\",\"Demo\",\"Demonstration\",\"IoT\",\"NoSQL Database\"],\"articleSection\":[\"Application Design\",\"Best Practices and Tutorials\",\"Couchbase Analytics\",\"Couchbase Lite\",\"Couchbase Mobile\",\"Couchbase Server\",\"Eventing\",\"Full-Text Search\",\"SQL++ \/ N1QL Query\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/couchbase-data-platform-action-setup-steps\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-data-platform-action-setup-steps\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/couchbase-data-platform-action-setup-steps\/\",\"name\":\"The Couchbase Data Platform in Action: Step-by-Step Setup\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-data-platform-action-setup-steps\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-data-platform-action-setup-steps\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/05\/DemoShort_720.gif\",\"datePublished\":\"2018-06-18T13:26:51+00:00\",\"dateModified\":\"2025-06-14T05:39:42+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-data-platform-action-setup-steps\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/couchbase-data-platform-action-setup-steps\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-data-platform-action-setup-steps\/#primaryimage\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/05\/DemoShort_720.gif\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/05\/DemoShort_720.gif\",\"width\":720,\"height\":385,\"caption\":\"Short animation of demo screens\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-data-platform-action-setup-steps\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"The Couchbase Data Platform in Action: Step-by-Step Setup\"}]},{\"@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\/9b62593c8a13531e53d52fcd5aabbca4\",\"name\":\"Hod Greeley, Developer Advocate, Couchbase\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/21eb69cb5d4a401fb23b149e4f4e9e87\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/52d0018695c0ced0d1c68cf64a6195c81dbac03dce5983f98eb209e7c84350df?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/52d0018695c0ced0d1c68cf64a6195c81dbac03dce5983f98eb209e7c84350df?s=96&d=mm&r=g\",\"caption\":\"Hod Greeley, Developer Advocate, Couchbase\"},\"description\":\"Hod Greeley is a Developer Advocate for Couchbase, living in Silicon Valley. He has over two decades of experience as a software engineer and engineering manager. He has worked in a variety of software fields, including computational physics and chemistry, computer and network security, finance, and mobile. Prior to joining Couchbase in 2016, Hod led developer relations for mobile at Samsung. Hod holds a Ph.D. in chemical physics from Columbia University.\",\"sameAs\":[\"https:\/\/hod.greeley.org\/blog\",\"https:\/\/x.com\/HodGreeley\"],\"url\":\"https:\/\/www.couchbase.com\/blog\/author\/hod-greeley\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"The Couchbase Data Platform in Action: Step-by-Step Setup","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\/couchbase-data-platform-action-setup-steps\/","og_locale":"en_US","og_type":"article","og_title":"The Couchbase Data Platform in Action: Step-by-Step Setup","og_description":"Note: This post uses the the Couchbase Analytics Data Definition Language as of the version 5.5 preview release.\u00a0 For updates and information on breaking changes in newer versions, please refer to\u00a0Changes to the Couchbase Analytics Service. The application built for [&hellip;]","og_url":"https:\/\/www.couchbase.com\/blog\/couchbase-data-platform-action-setup-steps\/","og_site_name":"The Couchbase Blog","article_published_time":"2018-06-18T13:26:51+00:00","article_modified_time":"2025-06-14T05:39:42+00:00","og_image":[{"width":720,"height":385,"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/05\/DemoShort_720.gif","type":"image\/gif"}],"author":"Hod Greeley, Developer Advocate, Couchbase","twitter_card":"summary_large_image","twitter_creator":"@HodGreeley","twitter_misc":{"Written by":"Hod Greeley, Developer Advocate, Couchbase","Est. reading time":"9 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/couchbase-data-platform-action-setup-steps\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/couchbase-data-platform-action-setup-steps\/"},"author":{"name":"Hod Greeley, Developer Advocate, Couchbase","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/9b62593c8a13531e53d52fcd5aabbca4"},"headline":"The Couchbase Data Platform in Action: Step-by-Step Setup","datePublished":"2018-06-18T13:26:51+00:00","dateModified":"2025-06-14T05:39:42+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/couchbase-data-platform-action-setup-steps\/"},"wordCount":1929,"commentCount":1,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/couchbase-data-platform-action-setup-steps\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/05\/DemoShort_720.gif","keywords":["application","Configure","Connect SV 2017 Demo","Couchbase Connect","Couchbase Data Platform","curl","Demo","Demonstration","IoT","NoSQL Database"],"articleSection":["Application Design","Best Practices and Tutorials","Couchbase Analytics","Couchbase Lite","Couchbase Mobile","Couchbase Server","Eventing","Full-Text Search","SQL++ \/ N1QL Query"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/couchbase-data-platform-action-setup-steps\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/couchbase-data-platform-action-setup-steps\/","url":"https:\/\/www.couchbase.com\/blog\/couchbase-data-platform-action-setup-steps\/","name":"The Couchbase Data Platform in Action: Step-by-Step Setup","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/couchbase-data-platform-action-setup-steps\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/couchbase-data-platform-action-setup-steps\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/05\/DemoShort_720.gif","datePublished":"2018-06-18T13:26:51+00:00","dateModified":"2025-06-14T05:39:42+00:00","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/couchbase-data-platform-action-setup-steps\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/couchbase-data-platform-action-setup-steps\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.couchbase.com\/blog\/couchbase-data-platform-action-setup-steps\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/05\/DemoShort_720.gif","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/05\/DemoShort_720.gif","width":720,"height":385,"caption":"Short animation of demo screens"},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/couchbase-data-platform-action-setup-steps\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"The Couchbase Data Platform in Action: Step-by-Step Setup"}]},{"@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\/9b62593c8a13531e53d52fcd5aabbca4","name":"Hod Greeley, Developer Advocate, Couchbase","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/21eb69cb5d4a401fb23b149e4f4e9e87","url":"https:\/\/secure.gravatar.com\/avatar\/52d0018695c0ced0d1c68cf64a6195c81dbac03dce5983f98eb209e7c84350df?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/52d0018695c0ced0d1c68cf64a6195c81dbac03dce5983f98eb209e7c84350df?s=96&d=mm&r=g","caption":"Hod Greeley, Developer Advocate, Couchbase"},"description":"Hod Greeley is a Developer Advocate for Couchbase, living in Silicon Valley. He has over two decades of experience as a software engineer and engineering manager. He has worked in a variety of software fields, including computational physics and chemistry, computer and network security, finance, and mobile. Prior to joining Couchbase in 2016, Hod led developer relations for mobile at Samsung. Hod holds a Ph.D. in chemical physics from Columbia University.","sameAs":["https:\/\/hod.greeley.org\/blog","https:\/\/x.com\/HodGreeley"],"url":"https:\/\/www.couchbase.com\/blog\/author\/hod-greeley\/"}]}},"authors":[{"term_id":9042,"user_id":73,"is_guest":0,"slug":"hod-greeley","display_name":"Hod Greeley, Developer Advocate, Couchbase","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/52d0018695c0ced0d1c68cf64a6195c81dbac03dce5983f98eb209e7c84350df?s=96&d=mm&r=g","author_category":"","last_name":"Greeley","first_name":"Hod","job_title":"","user_url":"https:\/\/hod.greeley.org\/blog","description":"Hod Greeley is a Developer Advocate for Couchbase, living in Silicon Valley. He has over two decades of experience as a software engineer and engineering manager. He has worked in a variety of software fields, including computational physics and chemistry, computer and network security, finance, and mobile. Prior to joining Couchbase in 2016, Hod led developer relations for mobile at Samsung. Hod holds a Ph.D. in chemical physics from Columbia University."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/posts\/5334","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\/73"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/comments?post=5334"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/posts\/5334\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/media\/5194"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/media?parent=5334"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/categories?post=5334"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/tags?post=5334"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/ppma_author?post=5334"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}