{"id":3553,"date":"2017-05-10T05:21:49","date_gmt":"2017-05-10T12:21:49","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=3553"},"modified":"2025-06-13T19:58:32","modified_gmt":"2025-06-14T02:58:32","slug":"fakeit-series-5-5-rapid-mobile-development-sync-gateway","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/es\/fakeit-series-5-5-rapid-mobile-development-sync-gateway\/","title":{"rendered":"FakeIt Series 5 de 5: Desarrollo m\u00f3vil r\u00e1pido con Sync-Gateway"},"content":{"rendered":"<p><a href=\"https:\/\/twitter.com\/bentonam\">Aaron Benton<\/a> es un arquitecto experimentado especializado en soluciones creativas para desarrollar aplicaciones m\u00f3viles innovadoras. Tiene m\u00e1s de 10 a\u00f1os de experiencia en desarrollo full stack, incluyendo ColdFusion, SQL, NoSQL, JavaScript, HTML y CSS. Aaron es actualmente Arquitecto de Aplicaciones para Shop.com en Greensboro, Carolina del Norte y es un <a href=\"https:\/\/developer.couchbase.com\/experts-and-champions\">Campe\u00f3n de la comunidad Couchbase<\/a>.<\/p>\n<p class=\"no-underline\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-2974\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2017\/03\/aaronb-benton-headshot_1000x1000-300x300.jpg\" alt=\"Aaron Benton\" width=\"300\" height=\"300\" data-attachment-id=\"2974\" data-permalink=\"https:\/\/www.couchbase.com\/blog\/fakeit-series-generating-fake-data\/aaronb-benton-headshot_1000x1000\/\" data-orig-file=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2017\/03\/aaronb-benton-headshot_1000x1000.jpg\" data-orig-size=\"1000,1000\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;1&quot;}\" data-image-title=\"\" data-image-description=\"\" data-medium-file=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2017\/03\/aaronb-benton-headshot_1000x1000-300x300.jpg\" data-large-file=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2017\/03\/aaronb-benton-headshot_1000x1000.jpg\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/03\/aaronb-benton-headshot_1000x1000-300x300.jpg 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/03\/aaronb-benton-headshot_1000x1000-150x150.jpg 150w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/03\/aaronb-benton-headshot_1000x1000-768x768.jpg 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/03\/aaronb-benton-headshot_1000x1000-65x65.jpg 65w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/03\/aaronb-benton-headshot_1000x1000-50x50.jpg 50w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/03\/aaronb-benton-headshot_1000x1000-20x20.jpg 20w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/03\/aaronb-benton-headshot_1000x1000.jpg 1000w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/p>\n<p>Para nuestro \u00faltimo post en el <u><a href=\"https:\/\/github.com\/bentonam\/fakeit\" target=\"_blank\" rel=\"noopener\">FakeIt<\/a><\/u>\u00a0serie vamos a explorar c\u00f3mo podemos aprovechar <u><a href=\"https:\/\/github.com\/bentonam\/fakeit\" target=\"_blank\" rel=\"noopener\">FakeIt<\/a><\/u>\u00a0+ <u><a href=\"https:\/\/www.couchbase.com\/blog\/es\/nosql-databases\/couchbase-server\/\" target=\"_blank\" rel=\"noopener\">Servidor Couchbase<\/a><\/u>\u00a0+ <u><a href=\"https:\/\/www.couchbase.com\/blog\/es\/nosql-databases\/couchbase-mobile\/\" target=\"_blank\" rel=\"noopener\">Pasarela de sincronizaci\u00f3n<\/a><\/u>\u00a0para poner en marcha nuestro entorno local para el desarrollo m\u00f3vil. Para ello utilizaremos <u><a href=\"https:\/\/www.docker.com\/\" target=\"_blank\" rel=\"noopener\">Docker<\/a><\/u>\u00a0y <u><a href=\"https:\/\/docs.docker.com\/compose\/\" target=\"_blank\" rel=\"noopener\">docker-compose<\/a><\/u>. <em>Descargo de responsabilidad: No soy en absoluto un experto en Docker, esto es simplemente un ejemplo de lo que he hecho para configurar r\u00e1pidamente un entorno de desarrollo y un conjunto de datos.<\/em><\/p>\n<h3><strong>Docker<\/strong><\/h3>\n<p>Utilizaremos dos contenedores Docker, uno para <u><a href=\"https:\/\/www.couchbase.com\/blog\/es\/nosql-databases\/couchbase-server\/\" target=\"_blank\" rel=\"noopener\">Servidor Couchbase<\/a><\/u>\u00a0y uno para <u><a href=\"https:\/\/www.couchbase.com\/blog\/es\/nosql-databases\/couchbase-mobile\/\" target=\"_blank\" rel=\"noopener\">Pasarela de sincronizaci\u00f3n<\/a><\/u>. Podr\u00edamos definir un archivo docker-compose.yaml que simplemente tirara de couchbase:latest y couchbase\/sync-gateway:latest pero a\u00fan habr\u00eda necesidad de configuraci\u00f3n manual y queremos ser capaces de automatizar tanto como sea posible para nuestra aplicaci\u00f3n. Para ello tendremos que construir nuestros propios contenedores a partir de ambos a\u00f1adiendo nuestros propios scripts y configuraci\u00f3n.<\/p>\n<pre class=\"lang:default decode:true\">.\/docker-compose.yaml\r\n\r\nversion:\u00a0'2'\r\nservices:\r\n\u00a0 fakeit-couchbase:\r\n\u00a0 \u00a0 build:\r\n\u00a0 \u00a0 \u00a0 context:\u00a0.\/.docker\/couchbase\/\r\n\u00a0 \u00a0 container_name:\u00a0fakeit-couchbase\r\n\u00a0 \u00a0 ports:\r\n\u00a0 \u00a0 \u00a0 -\u00a0\"8091-8094:8091-8094\"\r\n\u00a0 \u00a0 \u00a0 -\u00a0\"11210:11210\"\r\n\u00a0 \u00a0 volumes:\r\n\u00a0 \u00a0 \u00a0 -\u00a0.\/:\/app\r\n\u00a0 fakeit-syncgatway:\r\n\u00a0 \u00a0 build:\r\n\u00a0 \u00a0 \u00a0 context:\u00a0.\/.docker\/sync-gateway\/\r\n\u00a0 \u00a0 container_name:\u00a0fakeit-syncgateway\r\n\u00a0 \u00a0 depends_on:\r\n\u00a0 \u00a0 \u00a0 -\u00a0fakeit-couchbase\r\n\u00a0 \u00a0 ports:\r\n\u00a0 \u00a0 \u00a0 -\u00a0\"4984-4985:4984-4985\"\r\n\u00a0 \u00a0 volumes:\r\n\u00a0 \u00a0 \u00a0 -\u00a0.\/:\/app<\/pre>\n<p>Nuestro archivo docker-compose.yaml primero construye un contenedor en el Dockerfile desde .\/.docker\/couchbase\/Dockerfile que se ve as\u00ed.<\/p>\n<pre class=\"lang:default decode:true\">.\/.docker\/couchbase\/Dockerfile\r\n\r\n# start with couchbase\r\nFROM\u00a0couchbase:latest\r\n\r\n# copy the configure script\r\nCOPY\u00a0scripts\/configure-node.sh \/opt\/couchbase\r\n\r\n# execute the configure-node.sh script \r\nCMD [\"\/opt\/couchbase\/configure-node.sh\"]\r\n\r\n<\/pre>\n<p>Este Dockerfile en realidad s\u00f3lo hace dos cosas, copiar un script de configuraci\u00f3n y ejecutar ese script. El script configure-node.sh tiene este aspecto.<\/p>\n<pre class=\"lang:default decode:true\">.\/.docker\/couchbase\/scripts\/configure-node.sh\r\n\r\nset\u00a0-m\r\n\r\n\/entrypoint.sh couchbase-server &amp;\r\n\r\necho\u00a0'Waiting 20 seconds for Couchbase service to start'\r\nsleep 20\r\n\r\n# configure the cluster\r\necho\u00a0'Configuring Cluster'\r\n\/opt\/couchbase\/bin\/couchbase-cli cluster-init -c localhost:8091 --cluster-username=Administrator --cluster-password=password --cluster-port=8091 --cluster-ramsize=500 --service=data\r\n\r\n# create the ecommerce bucket\r\necho\u00a0'Creating ecommerce bucket'\r\n\/opt\/couchbase\/bin\/couchbase-cli bucket-create -c localhost:8091 -u Administrator -p password --bucket=ecommerce --bucket-eviction-policy=fullEviction --bucket-type=membase --bucket-priority=high --enable-index-replica=0 --bucket-port=11211 --enable-flush=1 --bucket-replica=1 --bucket-ramsize=200\r\n\r\necho\u00a0'Couchbase server is ready'\r\n\r\nfg\u00a01\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p>El script configure-node.sh est\u00e1 haciendo un par de cosas:<\/p>\n<ol>\n<li>Esperando a que se inicie el servicio Couchbase para poder configurarlo.<\/li>\n<li>Inicializar la configuraci\u00f3n del Cluster<\/li>\n<li>Crear nuestro cubo de comercio electr\u00f3nico<\/li>\n<\/ol>\n<p>El contenedor Couchbase ya est\u00e1 construido, el siguiente contenedor que necesita ser construido es el contenedor Sync Gateway. Por defecto el contenedor Sync Gateway utiliza el bucket sync gateway de s\u00f3lo memoria walrus. Tendremos que actualizar esta configuraci\u00f3n proporcionando nuestro propio archivo sync-gateway.json para que podamos actualizar la configuraci\u00f3n de almacenamiento y acceso. Por \u00faltimo, el contenedor Sync Gateway s\u00f3lo expone el puerto 4984, que es el puerto p\u00fablico, como esto es para fines de desarrollo vamos a seguir adelante y exponer el puerto 4985 que es el puerto de administrador.<\/p>\n<pre class=\"lang:default decode:true\">.\/.docker\/sync-gateway\/Dockerfile\r\n\r\n# Start with the base sync gateway\r\nFROM\u00a0couchbase\/sync-gateway:latest\r\n\r\n# Copy the sync-gateway.json into the container\r\nCOPY\u00a0sync-gateway.json \/opt\/sync_gateway\/sync-gateway.json\r\n\r\n# Create Volume for data to persist\r\nRUN mkdir -p \/opt\/sync_gateway\/data\r\n\r\n# Copy Entry Point\r\nCOPY scripts\/entrypoint.sh \/\r\nENTRYPOINT [\"\/entrypoint.sh\"]\r\n\r\n# Copy the configure script\r\nCOPY scripts\/configure-node.sh \/opt\/sync_gateway\r\n\r\n# Configure the Sync Gateway and Start it\r\nCMD [\"\/opt\/sync_gateway\/configure-node.sh\"]\r\n\r\n# \u00a0port 4984: public port\r\n# \u00a0port 4985: admin port\r\nEXPOSE 4984 4985\r\n\r\n.\/.docker\/sync-gateway\/sync-gateway.json\r\n\r\n{\r\n\u00a0\"interface\": \"0.0.0.0:4984\",\r\n\u00a0\"adminInterface\": \"0.0.0.0:4985\",\r\n\u00a0\"log\": [\"CRUD+\", \"REST+\", \"Changes+\", \"Attach+\"],\r\n\u00a0\"CORS\": {\r\n\u00a0 \u00a0\"Origin\":[\r\n\u00a0 \u00a0\u00a0 \"https:\/\/localhost:8000\",\r\n\u00a0 \u00a0 \"*\"\r\n\u00a0 \u00a0 ],\r\n\u00a0 \u00a0\"LoginOrigin\":[\r\n\u00a0 \u00a0 \u00a0\"https:\/\/localhost:8000\",\r\n\u00a0 \u00a0 \u00a0\"*\"\r\n\u00a0 \u00a0],\r\n\u00a0 \u00a0\"Headers\":[\"Content-Type\"],\r\n\u00a0 \u00a0\"MaxAge\": 1728000\r\n\u00a0},\r\n\u00a0\"databases\": {\r\n\u00a0 \u00a0\"ecommerce\": {\r\n\u00a0 \u00a0 \u00a0\"server\": \"https:\/\/fakeit-couchbase:8091\",\r\n\u00a0 \u00a0 \u00a0\"bucket\": \"ecommerce\",\r\n\u00a0 \u00a0 \u00a0\"users\": {\r\n\u00a0 \u00a0 \u00a0 \u00a0\"GUEST\": {\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0\"disabled\": false\r\n\u00a0 \u00a0 \u00a0 \u00a0}\r\n\u00a0 \u00a0 \u00a0},\r\n\u00a0 \u00a0 \u00a0\"sync\": \"function(doc, oldDoc) { channel(doc.channels); }\"\r\n\u00a0 \u00a0}\r\n\u00a0}\r\n}\r\n\r\n.\/.docker\/sync-gateway\/scripts\/configure-node.sh\r\n\r\n#!\/bin\/bash\r\n\r\nset\u00a0-m\r\n\r\necho\u00a0'Waiting 20 seconds for Couchbase service to start and warm up'\r\n\r\nsleep 20\r\n\r\necho\u00a0'Starting the Sync Gateway Service'\r\n\/entrypoint.sh sync_gateway \/opt\/sync_gateway\/sync-gateway.json\r\n\r\necho\u00a0'Couchbase Sync Gateway is ready'<\/pre>\n<p>&nbsp;<\/p>\n<p>Una vez m\u00e1s, esto es s\u00f3lo para fines de desarrollo. Usted nunca debe permitir el acceso desde cualquier lugar a su adminInterface o habilitar <strong>INVITADO<\/strong>\u00a0acceso a tu sync-gateway a menos que haya una muy buena raz\u00f3n para hacerlo.<\/p>\n<p>La estructura de nuestra aplicaci\u00f3n tiene ahora este aspecto:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2017\/05\/app-structure.jpg\" alt=\"app structure\" \/><\/p>\n<p>Ahora que hemos configurado nuestros contenedores Docker y nuestro archivo docker-compose.yaml necesitamos construir e iniciar los contenedores. Para ello, ejecutamos el siguiente comando desde nuestro directorio de aplicaciones:<\/p>\n<pre class=\"lang:default decode:true\">docker-compose up -d\r\n\r\n<\/pre>\n<p><em>Nota:<\/em>\u00a0para los prop\u00f3sitos del screencast, se omite el par\u00e1metro -d para ejecutar los contenedores en modo separado.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-5677 size-full\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2017\/05\/blog5-example1-compressor.gif\" alt=\"\" width=\"800\" height=\"443\" \/><\/p>\n<h3><strong>Modelos<\/strong><\/h3>\n<p>Nuestros contenedores ya est\u00e1n iniciados, lo siguiente que tenemos que hacer antes de generar nuestro conjunto de datos es actualizar los modelos para que admitan el atributo channels.<\/p>\n<pre class=\"lang:default decode:true\">usuarios.yaml\r\n\r\n<\/pre>\n<p>Este modelo s\u00f3lo se sincronizar\u00e1 con canales espec\u00edficos del usuario.<\/p>\n<pre class=\"lang:default decode:true\">name:\u00a0Users\r\ntype:\u00a0object\r\nkey:\u00a0_id\r\ndata:\r\n\u00a0 min:\u00a01000\r\n\u00a0 max:\u00a02000\r\n\u00a0 inputs:\u00a0.\/countries.json\r\nproperties:\r\n\u00a0 _id:\r\n\u00a0 \u00a0 type:\u00a0string\r\n\u00a0 \u00a0 description:\u00a0The document id built by the prefix \"user_\"\u00a0and the users id\r\n\u00a0 \u00a0 data:\r\n\u00a0 \u00a0 \u00a0 post_build:\u00a0`user_${this.user_id}`\r\n\u00a0 channels:\r\n\u00a0 \u00a0 type:\u00a0array\r\n\u00a0 \u00a0 data:\r\n\u00a0 \u00a0 \u00a0 post_build:\u00a0|\r\n\u00a0 \u00a0 \u00a0 \u00a0return [ `channel-user-${this.user_id}` ];\r\n\u00a0 doc_type:\r\n\u00a0 \u00a0 type:\u00a0string\r\n\u00a0 \u00a0 description:\u00a0The document type\r\n\u00a0 \u00a0 data:\r\n\u00a0 \u00a0 \u00a0 value:\u00a0\"user\"\r\n...\r\n\r\nproducts.yaml<\/pre>\n<p>S\u00f3lo por diversi\u00f3n publicaremos este modelo en un canal global al que estar\u00e1n suscritos todos nuestros usuarios.<\/p>\n<pre class=\"lang:default decode:true\">name:\u00a0Products\r\ntype:\u00a0object\r\nkey:\u00a0_id\r\ndata:\r\n\u00a0 min:\u00a0500\r\n\u00a0 max:\u00a01000\r\n\u00a0 inputs:\r\n\u00a0 \u00a0 -\u00a0.\/categories.csv\r\n\u00a0 pre_build:\u00a0globals.current_category = faker.random.arrayElement(inputs.categories);\r\nproperties:\r\n\u00a0 _id:\r\n\u00a0 \u00a0 type:\u00a0string\r\n\u00a0 \u00a0 description:\u00a0The document id\r\n\u00a0 \u00a0 data:\r\n\u00a0 \u00a0 \u00a0 post_build:\u00a0`product_${this.product_id}`\r\n\u00a0 channels:\r\n\u00a0 \u00a0 type:\u00a0array\r\n\u00a0 \u00a0 data:\r\n\u00a0 \u00a0 \u00a0 build:\u00a0|\r\n\u00a0 \u00a0 \u00a0 \u00a0return [ `channel-products` ];\r\n\u00a0 doc_type:\r\n\u00a0 \u00a0 type:\u00a0string\r\n\u00a0 \u00a0 description:\u00a0The document type\r\n\u00a0 \u00a0 data:\r\n\u00a0 \u00a0 \u00a0 value:\u00a0product\r\n...\r\n\r\norders.yaml<\/pre>\n<p>Este modelo s\u00f3lo se sincronizar\u00e1 con canales espec\u00edficos del usuario.<\/p>\n<pre class=\"lang:default decode:true\">name:\u00a0Orders\r\ntype:\u00a0object\r\nkey:\u00a0_id\r\ndata:\r\n\u00a0 dependencies:\r\n\u00a0 \u00a0 -\u00a0products.yaml\r\n\u00a0 \u00a0 -\u00a0users.yaml\r\n\u00a0 min:\u00a05000\r\n\u00a0 max:\u00a06000\r\nproperties:\r\n\u00a0 _id:\r\n\u00a0 \u00a0 type:\u00a0string\r\n\u00a0 \u00a0 description:\u00a0The document id\r\n\u00a0 \u00a0 data:\r\n\u00a0 \u00a0 \u00a0 post_build:\u00a0`order_${this.order_id}`\r\n\u00a0 channels:\r\n\u00a0 \u00a0 type:\u00a0array\r\n\u00a0 \u00a0 data:\r\n\u00a0 \u00a0 \u00a0 build:\u00a0|\r\n\u00a0 \u00a0 \u00a0 \u00a0return [ `channel-user-${this.user_id}` ];\r\n\u00a0 doc_type:\r\n\u00a0 \u00a0 type:\u00a0string\r\n\u00a0 \u00a0 description:\u00a0The document type\r\n\u00a0 \u00a0 data:\r\n\u00a0 \u00a0 \u00a0 value:\u00a0\"order\"\r\n...\r\n\r\n<\/pre>\n<p>Ahora que nuestros modelos han sido actualizados para soportar canales, podemos generar nuestro conjunto de datos aleatorios e introducirlo en <u><a href=\"https:\/\/www.couchbase.com\/blog\/es\/nosql-databases\/couchbase-server\/\" target=\"_blank\" rel=\"noopener\">Servidor Couchbase<\/a><\/u>\u00a0a trav\u00e9s de la <u><a href=\"https:\/\/www.couchbase.com\/blog\/es\/nosql-databases\/couchbase-mobile\/\" target=\"_blank\" rel=\"noopener\">Pasarela de sincronizaci\u00f3n<\/a><\/u>\u00a0API REST. Le decimos <u><a href=\"https:\/\/github.com\/bentonam\/fakeit\" target=\"_blank\" rel=\"noopener\">FakeIt<\/a><\/u>\u00a0para ello, utilice el siguiente comando:<\/p>\n<pre class=\"lang:default decode:true\">fakeit sync-gateway --server https:\/\/localhost:4984 --bucket ecommerce --verbose models\/*\r\n\r\n<\/pre>\n<p>Para fines de desarrollo hemos permitido el acceso de invitados a nuestro <u><a href=\"https:\/\/www.couchbase.com\/blog\/es\/nosql-databases\/couchbase-mobile\/\" target=\"_blank\" rel=\"noopener\">Pasarela de sincronizaci\u00f3n<\/a><\/u>. Sin embargo, si tiene desactivado el acceso de invitados, puede seguir utilizando <u><a href=\"https:\/\/github.com\/bentonam\/fakeit\" target=\"_blank\" rel=\"noopener\">FakeIt<\/a><\/u>\u00a0especificando un nombre de usuario y una contrase\u00f1a a un usuario existente mediante el siguiente comando:<\/p>\n<pre class=\"lang:default decode:true\">fakeit sync-gateway --server https:\/\/localhost:4984 --bucket ecommerce --username YOURUSERNAME --password YOURPASSWORD --verbose models\/*<\/pre>\n<p>Antes de dar salida al conjunto de datos generado, <u><a href=\"https:\/\/github.com\/bentonam\/fakeit\" target=\"_blank\" rel=\"noopener\">FakeIt<\/a><\/u>\u00a0se autenticar\u00e1 contra el <u><a href=\"https:\/\/www.couchbase.com\/blog\/es\/nosql-databases\/couchbase-mobile\/\" target=\"_blank\" rel=\"noopener\">Pasarela de sincronizaci\u00f3n<\/a><\/u>\u00a0para recuperar la informaci\u00f3n de sesi\u00f3n necesaria.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-5673 size-full\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2017\/05\/blog5-example2-compressor.gif\" alt=\"\" width=\"800\" height=\"450\" \/><\/p>\n<h3><strong>Pruebas<\/strong><\/h3>\n<p>Lo siguiente que tenemos que hacer es crear un usuario de pasarela de sincronizaci\u00f3n para que podamos sincronizar sus documentos localmente. Para esta prueba, vamos a coger un documento de usuario aleatorio de nuestro modelo Users y crearemos un usuario a partir de ese documento. En este ejemplo ser\u00e1 user_1001, y crearemos el usuario usando el comando curl:<\/p>\n<pre class=\"lang:default decode:true\">curl --silent --show-error \\\r\n\u00a0-H \"Content-Type: application\/json; charset=UTF-8\"\u00a0\\\r\n\u00a0-H \"Content-type: application\/json\"\u00a0\\\r\n\u00a0-X PUT \\\r\n\u00a0-d '{\"name\":\"Domenic81\",\"password\":\"pgid_Tubn0qoEtZ\",\"admin_channels\":[\"channel-user-1001\", \"channel-products\"]}'\u00a0\\\r\n\u00a0'https:\/\/localhost:4985\/ecommerce\/_user\/Domenic81'<\/pre>\n<p>&nbsp;<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2017\/05\/blog5-example3.gif\" alt=\"blog5 example3\" \/><\/p>\n<h3><strong>Aplicaci\u00f3n<\/strong><\/h3>\n<p>Hemos creado un peque\u00f1o <u><a href=\"https:\/\/vuejs.org\/\" target=\"_blank\" rel=\"noopener\">VueJS<\/a><\/u>\u00a0proyecto que utiliza <u><a href=\"https:\/\/pouchdb.com\/\" target=\"_blank\" rel=\"noopener\">PouchDB<\/a><\/u>\u00a0para conectarse al Sync Gateway y extraer los documentos de un usuario autenticado. Nuestra aplicaci\u00f3n s\u00f3lo va a mostrar los diferentes tipos de documentos disponibles, sus IDs y contenido.<\/p>\n<pre class=\"lang:default decode:true\">\/\/ register highlight.js vue component\r\nVue.use(VueHighlightJS)\r\n\r\n\/\/ create local ecommerce database\r\nvar\u00a0db = new\u00a0PouchDB('local_ecommerce', {\r\n\u00a0auto_compaction: true,\r\n\u00a0revs_limit: 3\r\n});\r\n\/\/ create remote ecommerce database\r\nvar\u00a0remote_db = new\u00a0PouchDB('https:\/\/localhost:4984\/ecommerce\/', {\r\n\u00a0auth: {\r\n\u00a0 \u00a0username: 'Domenic81',\r\n\u00a0 \u00a0password: 'pgid_Tubn0qoEtZ'\r\n\u00a0},\r\n\u00a0skip_setup: true\r\n});\r\n\/\/ merge remote database with local database\r\nPouchDB.sync(db, remote_db, { live: true, retry: true\u00a0})\r\n\r\nvar\u00a0app = new\u00a0Vue({\r\n\u00a0el: '#app',\r\n\u00a0data: {\r\n\u00a0 \u00a0current_type: '',\r\n\u00a0 \u00a0items: [],\r\n\u00a0 \u00a0id: '',\r\n\u00a0 \u00a0current: JSON.stringify({}),\r\n\u00a0 \u00a0types: [],\r\n\u00a0},\r\n\u00a0watch: {\r\n\u00a0 \u00a0id(id) {\r\n\u00a0 \u00a0 \u00a0if\u00a0(id) {\r\n\u00a0 \u00a0 \u00a0 \u00a0db.get(id).then((current) =&gt; this.current = JSON.stringify(current, null, 2))\r\n\u00a0 \u00a0 \u00a0}\r\n\u00a0 \u00a0},\r\n\u00a0 \u00a0current_type(type) {\r\n\u00a0 \u00a0 \u00a0this.id = ''\r\n\u00a0 \u00a0 \u00a0\/\/ update the current item to be blank\r\n\u00a0 \u00a0 \u00a0this.current = JSON.stringify({})\r\n\r\n\u00a0 \u00a0 \u00a0\/\/ when `current_type` changes update the items list with the current types list\r\n\u00a0 \u00a0 \u00a0this.updateItems(type)\r\n\u00a0 \u00a0 \u00a0 \u00a0.then(() =&gt; {\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0if\u00a0(!this.id) {\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0this.id = this.items[0]\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0}\r\n\u00a0 \u00a0 \u00a0 \u00a0})\r\n\u00a0 \u00a0}\r\n\u00a0},\r\n\u00a0methods: {\r\n\u00a0 \u00a0updateItems(type) {\r\n\u00a0 \u00a0 \u00a0return\u00a0db.query('ecommerce\/by_doc_type', { key: type, reduce: false\u00a0})\r\n\u00a0 \u00a0 \u00a0 \u00a0.then((result) =&gt; {\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0this.items = result.rows.map((item) =&gt; item.id)\r\n\u00a0 \u00a0 \u00a0 \u00a0})\r\n\u00a0 \u00a0},\r\n\u00a0 \u00a0removeStyle(el) {\r\n\u00a0 \u00a0 \u00a0setTimeout(() =&gt; {\r\n\u00a0 \u00a0 \u00a0 \u00a0el.style = ''\r\n\u00a0 \u00a0 \u00a0}, 1000)\r\n\u00a0 \u00a0}\r\n\u00a0},\r\n\u00a0created() {\r\n\u00a0 \u00a0\/\/ create the view to be queried\r\n\u00a0 \u00a0var\u00a0ddoc = {\r\n\u00a0 \u00a0 \u00a0_id: '_design\/ecommerce',\r\n\u00a0 \u00a0 \u00a0views: {\r\n\u00a0 \u00a0 \u00a0 \u00a0by_doc_type: {\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0map: function(doc) {\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0if\u00a0(doc.doc_type) {\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0emit(doc.doc_type);\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0}\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0}.toString(),\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0reduce: '_count'\r\n\u00a0 \u00a0 \u00a0 \u00a0}\r\n\u00a0 \u00a0 \u00a0}\r\n\u00a0 \u00a0}\r\n\r\n\u00a0 \u00a0db.put(ddoc)\r\n\u00a0 \u00a0 \u00a0\/\/ design document created\r\n\u00a0 \u00a0 \u00a0\/\/ call the design document view index immediately to trigger a build\r\n\u00a0 \u00a0 \u00a0.then(() =&gt; db.query('ecommerce\/by_doc_type', { limit: 0\u00a0}))\r\n\u00a0 \u00a0 \u00a0.catch((err) =&gt; { \/\/ it is fine if this fails and returns a document conflict that just means it doesnt need to be created\r\n\u00a0 \u00a0 \u00a0 \u00a0if\u00a0(err.status !== 409) {\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0throw\u00a0err;\r\n\u00a0 \u00a0 \u00a0 \u00a0}\r\n\u00a0 \u00a0 \u00a0})\r\n\r\n\u00a0 \u00a0 \u00a0\/\/ get all of the doc types available\r\n\u00a0 \u00a0 \u00a0.then(() =&gt; db.query('ecommerce\/by_doc_type', { reduce: true, group: true\u00a0}))\r\n\u00a0 \u00a0 \u00a0.then((types) =&gt; {\r\n\u00a0 \u00a0 \u00a0 \u00a0this.types = types.rows.map((type) =&gt; type.key)\r\n\u00a0 \u00a0 \u00a0 \u00a0this.current_type = this.types[0]\r\n\u00a0 \u00a0 \u00a0})\r\n\u00a0}\r\n})<\/pre>\n<p>&nbsp;<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-5675 size-full\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2017\/05\/blog5-example4-compressor.gif\" alt=\"\" width=\"800\" height=\"505\" \/><\/p>\n<p>La aplicaci\u00f3n de muestra completa puede consultarse en <u><a href=\"https:\/\/github.com\/bentonam\/fakeit-couchbase-mobile-example\" target=\"_blank\" rel=\"noopener\">https:\/\/github.com\/bentonam\/fakeit-couchbase-mobile-example<\/a><\/u><\/p>\n<h3><strong>Conclusi\u00f3n<\/strong><\/h3>\n<p>A lo largo de esta serie han visto c\u00f3mo <u><a href=\"https:\/\/github.com\/bentonam\/fakeit\" target=\"_blank\" rel=\"noopener\">FakeIt<\/a><\/u>\u00a0puede tomar simples modelos YAML y generar grandes cantidades de datos falsos y enviar esos datos a m\u00faltiples destinos diferentes. Por favor, consulte el repositorio, pull requests son bienvenidos, siempre estamos buscando mejoras y mejoras para hacer la herramienta m\u00e1s \u00fatil para la comunidad. Tambi\u00e9n me gustar\u00eda aprovechar este momento para agradecer a aquellos que han hecho contribuciones al proyecto. La versi\u00f3n 1.0 no se habr\u00eda publicado sin la ayuda de \u00a0<u><a href=\"https:\/\/github.com\/tjbenton\" target=\"_blank\" rel=\"noopener\">Tyler Benton<\/a><\/u>\u00a0(<u><a href=\"https:\/\/twitter.com\/tjbenton21\" target=\"_blank\" rel=\"noopener\">@tjbenton21<\/a><\/u>), tambi\u00e9n <u><a href=\"https:\/\/github.com\/tabrindle\" target=\"_blank\" rel=\"noopener\">Trevor Brindle<\/a><\/u>\u00a0(<u><a href=\"https:\/\/twitter.com\/VinceKerrazzi\" target=\"_blank\" rel=\"noopener\">@VinceKerrazzi<\/a><\/u>), <u><a href=\"https:\/\/github.com\/mistersender\" target=\"_blank\" rel=\"noopener\">Jessica Kennedy<\/a><\/u>\u00a0(<u><a href=\"https:\/\/twitter.com\/mistersender\" target=\"_blank\" rel=\"noopener\">@mistersender<\/a><\/u>), <u><a href=\"https:\/\/github.com\/alburdette619\" target=\"_blank\" rel=\"noopener\">Adam Burdette<\/a><\/u>\u00a0(<u><a href=\"https:\/\/twitter.com\/RavenStorms619\" target=\"_blank\" rel=\"noopener\">@RavenStorms619<\/a><\/u>) y <u><a href=\"https:\/\/github.com\/brantburnett\" target=\"_blank\" rel=\"noopener\">Brant Burnett<\/a><\/u>\u00a0(<u><a href=\"https:\/\/twitter.com\/btburnett3\" target=\"_blank\" rel=\"noopener\">@btburnett3<\/a><\/u>)<\/p>\n<h4><strong>Anterior<\/strong><\/h4>\n<ul>\n<li><u><a href=\"https:\/\/www.couchbase.com\/blog\/es\/fakeit-series-generating-fake-data\/\" target=\"_blank\" rel=\"noopener\">FakeIt Serie 1 de 5: Generaci\u00f3n de datos falsos<\/a><\/u><\/li>\n<li><u><a href=\"https:\/\/www.couchbase.com\/blog\/es\/fakeit-series-shared-data-dependencies\/\" target=\"_blank\" rel=\"noopener\">FakeIt Serie 2 de 5: Datos compartidos y dependencias<\/a><\/u><\/li>\n<li><u><a href=\"https:\/\/www.couchbase.com\/blog\/es\/fakeit-series-3-5-lean-models-through-definitions\/\" target=\"_blank\" rel=\"noopener\">FakeIt Series 3 de 5: Modelos Lean a trav\u00e9s de definiciones<\/a><\/u><\/li>\n<li><u><a href=\"https:\/\/www.couchbase.com\/blog\/es\/fakeit-series-working-existing-data\/\" target=\"_blank\" rel=\"noopener\">FakeIt Series 4 de 5: Trabajar con datos existentes<\/a><\/u><\/li>\n<\/ul>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-2966 aligncenter\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2017\/03\/brand.devCommChampionLogo.champion.FINAL_-300x300.png\" alt=\"Couchbase Champion\" width=\"300\" height=\"300\" \/><\/p>","protected":false},"excerpt":{"rendered":"<p>C\u00f3mo podemos aprovechar FakeIt + Couchbase Server + Sync Gateway para poner en marcha nuestro entorno local para el desarrollo m\u00f3vil. Vamos a hacer esto mediante el uso de Docker y docker-compose. <\/p>","protected":false},"author":53,"featured_media":13873,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1810,1816,2366],"tags":[1883,1519,1884],"ppma_author":[9026],"class_list":["post-3553","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-couchbase-mobile","category-couchbase-server","category-sync-gateway","tag-data-modelling","tag-docker","tag-document-patterns"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v25.8 (Yoast SEO v25.8) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>FakeIt Series: Rapid Mobile Development with Sync-Gateway<\/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\/es\/fakeit-series-5-5-rapid-mobile-development-sync-gateway\/\" \/>\n<meta property=\"og:locale\" content=\"es_MX\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"FakeIt Series 5 of 5: Rapid Mobile Development with Sync-Gateway\" \/>\n<meta property=\"og:description\" content=\"How we can leverage FakeIt + Couchbase Server + Sync Gateway to get our local environment up and running for mobile development. We will be doing this by using Docker and docker-compose.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/es\/fakeit-series-5-5-rapid-mobile-development-sync-gateway\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2017-05-10T12:21:49+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-06-14T02:58:32+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/03\/aaronb-benton-headshot_1000x1000.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1000\" \/>\n\t<meta property=\"og:image:height\" content=\"1000\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Laura Czajkowski, Developer Community Manager, Couchbase\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Laura Czajkowski, Developer Community Manager, Couchbase\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"9 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/fakeit-series-5-5-rapid-mobile-development-sync-gateway\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/fakeit-series-5-5-rapid-mobile-development-sync-gateway\/\"},\"author\":{\"name\":\"Laura Czajkowski, Developer Community Manager, Couchbase\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/5f1a0ece4e644bc8c037686fbc8f3220\"},\"headline\":\"FakeIt Series 5 of 5: Rapid Mobile Development with Sync-Gateway\",\"datePublished\":\"2017-05-10T12:21:49+00:00\",\"dateModified\":\"2025-06-14T02:58:32+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/fakeit-series-5-5-rapid-mobile-development-sync-gateway\/\"},\"wordCount\":879,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/fakeit-series-5-5-rapid-mobile-development-sync-gateway\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"keywords\":[\"data modelling\",\"docker\",\"document patterns\"],\"articleSection\":[\"Couchbase Mobile\",\"Couchbase Server\",\"Sync Gateway\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/fakeit-series-5-5-rapid-mobile-development-sync-gateway\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/fakeit-series-5-5-rapid-mobile-development-sync-gateway\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/fakeit-series-5-5-rapid-mobile-development-sync-gateway\/\",\"name\":\"FakeIt Series: Rapid Mobile Development with Sync-Gateway\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/fakeit-series-5-5-rapid-mobile-development-sync-gateway\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/fakeit-series-5-5-rapid-mobile-development-sync-gateway\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"datePublished\":\"2017-05-10T12:21:49+00:00\",\"dateModified\":\"2025-06-14T02:58:32+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/fakeit-series-5-5-rapid-mobile-development-sync-gateway\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/fakeit-series-5-5-rapid-mobile-development-sync-gateway\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/fakeit-series-5-5-rapid-mobile-development-sync-gateway\/#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\/fakeit-series-5-5-rapid-mobile-development-sync-gateway\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"FakeIt Series 5 of 5: Rapid Mobile Development with Sync-Gateway\"}]},{\"@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\":\"es\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\",\"name\":\"The Couchbase Blog\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@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\/5f1a0ece4e644bc8c037686fbc8f3220\",\"name\":\"Laura Czajkowski, Developer Community Manager, Couchbase\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/9deb07d5daaa00220534c31768bc4409\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/bc8eebaf25cbe39bc12fd7b1ef92550becc3953ab877a3f0285a59ec2d30b754?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/bc8eebaf25cbe39bc12fd7b1ef92550becc3953ab877a3f0285a59ec2d30b754?s=96&d=mm&r=g\",\"caption\":\"Laura Czajkowski, Developer Community Manager, Couchbase\"},\"description\":\"Laura Czajkowski is the Snr. Developer Community Manager at Couchbase overseeing the community. She\u2019s responsible for our monthly developer newsletter.\",\"url\":\"https:\/\/www.couchbase.com\/blog\/es\/author\/laura-czajkowski\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"FakeIt Series: Rapid Mobile Development with Sync-Gateway","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\/es\/fakeit-series-5-5-rapid-mobile-development-sync-gateway\/","og_locale":"es_MX","og_type":"article","og_title":"FakeIt Series 5 of 5: Rapid Mobile Development with Sync-Gateway","og_description":"How we can leverage FakeIt + Couchbase Server + Sync Gateway to get our local environment up and running for mobile development. We will be doing this by using Docker and docker-compose.","og_url":"https:\/\/www.couchbase.com\/blog\/es\/fakeit-series-5-5-rapid-mobile-development-sync-gateway\/","og_site_name":"The Couchbase Blog","article_published_time":"2017-05-10T12:21:49+00:00","article_modified_time":"2025-06-14T02:58:32+00:00","og_image":[{"width":1000,"height":1000,"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/03\/aaronb-benton-headshot_1000x1000.jpg","type":"image\/jpeg"}],"author":"Laura Czajkowski, Developer Community Manager, Couchbase","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Laura Czajkowski, Developer Community Manager, Couchbase","Est. reading time":"9 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/fakeit-series-5-5-rapid-mobile-development-sync-gateway\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/fakeit-series-5-5-rapid-mobile-development-sync-gateway\/"},"author":{"name":"Laura Czajkowski, Developer Community Manager, Couchbase","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/5f1a0ece4e644bc8c037686fbc8f3220"},"headline":"FakeIt Series 5 of 5: Rapid Mobile Development with Sync-Gateway","datePublished":"2017-05-10T12:21:49+00:00","dateModified":"2025-06-14T02:58:32+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/fakeit-series-5-5-rapid-mobile-development-sync-gateway\/"},"wordCount":879,"commentCount":0,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/fakeit-series-5-5-rapid-mobile-development-sync-gateway\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","keywords":["data modelling","docker","document patterns"],"articleSection":["Couchbase Mobile","Couchbase Server","Sync Gateway"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/fakeit-series-5-5-rapid-mobile-development-sync-gateway\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/fakeit-series-5-5-rapid-mobile-development-sync-gateway\/","url":"https:\/\/www.couchbase.com\/blog\/fakeit-series-5-5-rapid-mobile-development-sync-gateway\/","name":"FakeIt Series: Rapid Mobile Development with Sync-Gateway","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/fakeit-series-5-5-rapid-mobile-development-sync-gateway\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/fakeit-series-5-5-rapid-mobile-development-sync-gateway\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","datePublished":"2017-05-10T12:21:49+00:00","dateModified":"2025-06-14T02:58:32+00:00","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/fakeit-series-5-5-rapid-mobile-development-sync-gateway\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/fakeit-series-5-5-rapid-mobile-development-sync-gateway\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/fakeit-series-5-5-rapid-mobile-development-sync-gateway\/#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\/fakeit-series-5-5-rapid-mobile-development-sync-gateway\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"FakeIt Series 5 of 5: Rapid Mobile Development with Sync-Gateway"}]},{"@type":"WebSite","@id":"https:\/\/www.couchbase.com\/blog\/#website","url":"https:\/\/www.couchbase.com\/blog\/","name":"El blog de Couchbase","description":"Couchbase, la base de datos NoSQL","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":"es"},{"@type":"Organization","@id":"https:\/\/www.couchbase.com\/blog\/#organization","name":"El blog de Couchbase","url":"https:\/\/www.couchbase.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"es","@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\/5f1a0ece4e644bc8c037686fbc8f3220","name":"Laura Czajkowski, Directora de la Comunidad de Desarrolladores, Couchbase","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/9deb07d5daaa00220534c31768bc4409","url":"https:\/\/secure.gravatar.com\/avatar\/bc8eebaf25cbe39bc12fd7b1ef92550becc3953ab877a3f0285a59ec2d30b754?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/bc8eebaf25cbe39bc12fd7b1ef92550becc3953ab877a3f0285a59ec2d30b754?s=96&d=mm&r=g","caption":"Laura Czajkowski, Developer Community Manager, Couchbase"},"description":"Laura Czajkowski es la Snr. Developer Community Manager en Couchbase supervisando la comunidad. Es responsable de nuestro bolet\u00edn mensual para desarrolladores.","url":"https:\/\/www.couchbase.com\/blog\/es\/author\/laura-czajkowski\/"}]}},"authors":[{"term_id":9026,"user_id":53,"is_guest":0,"slug":"laura-czajkowski","display_name":"Laura Czajkowski, Developer Community Manager, Couchbase","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/bc8eebaf25cbe39bc12fd7b1ef92550becc3953ab877a3f0285a59ec2d30b754?s=96&d=mm&r=g","author_category":"","last_name":"Czajkowski","first_name":"Laura","job_title":"","user_url":"","description":"Laura Czajkowski es la Snr. Developer Community Manager en Couchbase supervisando la comunidad. Es responsable de nuestro bolet\u00edn mensual para desarrolladores."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/3553","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/users\/53"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/comments?post=3553"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/3553\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media\/13873"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media?parent=3553"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/categories?post=3553"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/tags?post=3553"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/ppma_author?post=3553"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}