Legacy Pre-3.0 Configuration

    • Legacy Content

    Configuring Sync Gateway Pre-3.0 to provide secure cloud-to-edge synchronization of enterprise data using the standard, static, configuration file.

    Legacy Configuration
    You cannot use collections in Sync Gateway’s legacy Pre-3.0 configuration method. For current configuration details, see: Configuration Overview and-or Bootstrap Configuration.

    Introduction

    This page describes Sync Gateway’s legacy Pre-3.0 configuration method. It uses a centralized configuration file to hold all configuration settings in JSON form — see:the schema for the file contents.

    Persistent Configuration is enabled by default from 3.0.

    To continue using legacy Pre-3.0 configuration you should start sync gateway with disable_persistent_config set true either in the configuration file or in Command Line Options.

    You can change many configuration settings using the Admin REST API but Sync Gateway does not persist these beyond a restart. To make persistent changes you must edit the central Configuration Properties file — or switch to the 3.x persistent configuration — see: Configuration Overview

    File Format

    The Configuration Properties file defines sync gateway’s runtime behavior. Its contents include, for example:

    • Details of the connected Couchbase databases

    • How sync gateway conducts replications

    • What security to use

    • What logging options to apply, and

    • Any customization of import filtering and synchronization.

    You achieve the majority of the configuration using standard JSON syntax — see the schema for more.

    The sync-gateway-config.json file relies on the use of one relaxed JSON feature; the use of back ticks (`). Text between back ticks is treated as a string. It can span multiple lines and contain double-quotes. Those features make it ideal for incorporating inline JavaScript, which you can use to provision, for example, sync and import_filter functions.

    Running

    Use the following command to run Sync Gateway with a configuration file:

    Run Sync Gateway
    sync_gateway -disable_persistent_config sync-gateway-config.json

    See also — Command Line Options

    Schema

    Example

    {
      "interface":":5984",
      "adminInterface":":5985",
      "logging": {
        "log_file_path": "/var/tmp/sglogs",
        "console": {
          "log_level": "debug",
          "log_keys": ["*"]
        },
        "error": {
          "enabled": true,
          "rotation": {
            "max_size": 20,
            "max_age": 180
          }
        },
        "warn": {
          "enabled": true,
          "rotation": {
            "max_size": 20,
            "max_age": 90
          }
        },
        "info": {
          "enabled": false
        },
        "debug": {
          "enabled": false
        }
      },
      "databases": {
           "db1-local": {
                "import_docs": true,
                "bucket":"db1-local",
                "server": "couchbase://cb-server",
                "enable_shared_bucket_access":true,
                "delta_sync": {
                  "enabled": true
                },
                "import_filter": `
                  function(doc) {
                    return true;
                  }
                  `,
                "username": "admin",
                "password": "password",
                "users":{
                    "admin": {"password": "password", "admin_channels": ["*"]},
                    "user1": {"password": "password", "admin_channels":["channel.user1"]}
                },
               "num_index_replicas":0,
               "sgreplicate_enabled":false,
               "replications":{
                   "db1-rep-id1" : {
                       "direction": "pushAndPull",
                       "conflict_resolution_type":"custom",
                        "custom_conflict_resolver":`
                          function(conflict) {
                              if (  (conflict.LocalDocument.type != null) &&
                                    (conflict.RemoteDocument.type != null) &&
                                    (conflict.LocalDocument.type == "usedefault"))
                              {
                                  console.log("Will use default policy");
                                  // Resolve using built-in policy
                                  return defaultPolicy(conflict);
                              }
                              else
                              {
                                // Merge local and remote docs
                                var remoteDoc = conflict.RemoteDocument;
                                console.log("full remoteDoc doc: "+JSON.stringify(remoteDoc));
                                var localDoc = conflict.LocalDocument;
                                console.log("full localDoc doc: "+JSON.stringify(localDoc));
                                var mergedDoc = extend({}, localDoc, remoteDoc);
                                delete mergedDoc._rev (1)
                                delete mergedDoc._cv (2)
    
                                console.log("full mergedDoc doc: "+JSON.stringify(mergedDoc));
                                // Resolve using this merged doc as the winner
                                return mergedDoc;
    
                                function extend(target) {
                                    var sources = [].slice.call(arguments, 1);
                                    sources.forEach(function (source) {
                                        for (var prop in source) {
                                          if (prop.indexOf('_') != 0) { (3)
                                            target[prop] = source[prop];
                                          }
                                        }
                                    });
                                    return target;
                                } // end function extend()
                              } // end if
                          }` // end function()
                        , // end custom_conflict_resolver
                       "purge_on_removal":true,
                       "remote": "http://user1:password@example.com:4984/db1-remote",
                       "filter":"sync_gateway/bychannel",
                       "query_params": {
                           "channels":["channel.user1"]
                       },
                       "enable_delta_sync":  true,
                        "batch_size" :1000,
                        "continuous": true,
                        "state": "running"
                   }
               },
              "sync": `
          function sync(doc, oldDoc) {
            /* sanity check */
            // check if document was removed from server or via SDK
            // In this case, just return
            if (isRemoved()) {
              return;
            }
    
            /* Routing */
            // Add doc to the user's channel.
            channel("channel.user1");
    
            // This is when document is removed via SDK or directly on server
            function isRemoved() {
              return( isDelete() && oldDoc == null);
            }
    
            function isDelete() {
              return (doc._deleted == true);
            }
    
          }
                `
              },
        "db2-local": {
          "import_docs": true,
          "bucket":"db2-local",
          "server": "couchbase://cb-server",
          "enable_shared_bucket_access":true,
          "delta_sync": {
            "enabled": true
          },
          "import_filter": `
            function(doc) {
              return true;
            }
            `,
          "username": "admin",
          "password": "password",
          "users":{
            "admin": {"password": "password", "admin_channels": ["*"]},
            "user1": {"password": "password", "admin_channels":["channel.user1"]}
          },
          "num_index_replicas":0,
          "sgreplicate_enabled":true,
          "replications":{
            "db2-rep-id1-pull" : {
              "direction": "pull",
              "purge_on_removal":true,
              "remote": "http://user1:password@example2.com:4984/db2-remote",
              "conflict_resolution_type":"remoteWins",
              "filter":"sync_gateway/bychannel",
              "query_params": {
                "channels":["channel.user1"]
              },
              "enable_delta_sync":  true,
              "batch_size" :1000,
              "continuous": true,
              "state": "stopped"
                }
              },
              "sync": `
              function sync(doc, oldDoc) {
                // . . . code as required
              `
            }
          }
        }