¿Existe una forma simple de exportar los datos desde una aplicación desplegada por meteors?

¿Existe una forma simple de exportar los datos desde una aplicación desplegada por meteors?

Entonces, por ejemplo, si hubiera desplegado una aplicación llamada test.meteor.com …

¿Cómo podría descargar fácilmente los datos que esa aplicación ha recostackdo, para poder ejecutarlos localmente con los datos de la aplicación implementada?

Y he aquí cómo hacer lo contrario: (cargando su db monogo local a meteoro)

https://gist.github.com/IslamMagdy/5519514

 # How to upload local db to meteor: # -h = host, -d = database name, -o = dump folder name mongodump -h 127.0.0.1:3002 -d meteor -o meteor # get meteor db url, username, and password meteor mongo --url myapp.meteor.com # -h = host, -d = database name (app domain), -p = password, folder = the path to the dumped db mongorestre -u client -h c0.meteor.m0.mongolayer.com:27017 -d myapp_meteor_com -p 'password' folder/ 

Basado en la solución de Kasper Souren, creé un script actualizado que funciona con las versiones actuales de Meteor y también funciona cuando protege su aplicación Meteor remota con una contraseña.

Por favor crea el siguiente script parse-mongo-url.coffee :

 spawn = require('child_process').spawn mongo = spawn 'meteor', ['mongo', '--url', 'YOURPROJECT.meteor.com'], stdio: [process.stdin, 'pipe', process.stderr] mongo.stdout.on 'data', (data) -> data = data.toString() m = data.match /mongodb:\/\/([^:]+):([^@]+)@([^:]+):27017\/([^\/]+)/ if m? process.stdout.write "-u #{m[1]} -p #{m[2]} -h #{m[3]} -d #{m[4]}" else if data == 'Password: ' process.stderr.write data 

Luego ejecútelo así en un shell * nix:

 mongodump `coffee parse-mongo-url.coffee` 

He creado una herramienta, mmongo , que envuelve todos los comandos del shell del cliente Mongo DB para un uso conveniente en una base de datos Meteor. Si usa npm (Node Package Manager), puede instalarlo con:

 npm install -g mmongo 

De lo contrario, vea README .

Para realizar una copia de seguridad de su base de datos Meteor, puede hacer lo siguiente:

 mmongo test.meteor.com dump 

Para subirlo a su meteor de desarrollo local sería:

 mmongo restre dump/test_meteor_com 

Y si elimina accidentalmente su base de datos de producción:

 mmongo test.meteor.com --eval 'db.dropDatabase()' # whoops! 

Puedes restaurarlo fácilmente:

 mmongo test.meteor.com restre dump/test_meteor_com 

Si prefiere exportar una colección (digamos tasks ) a algo legible:

 mmongo test.meteor.com export -c tasks -o tasks.json 

Luego puede abrir tasks.json en su editor de texto, hacer algunos cambios e insertar los cambios con:

 mmongo test.meteor.com import tasks.json -c tasks --upsert 

Github , NPM

Supongo que sus datos están en una base de datos de mongodb, así que si ese es el caso, la pregunta está más relacionada con el mongo que el meteoro. Puede echar un vistazo a las herramientas de línea de comando mongoexport y mongoimport .

Editar (por ejemplo):

mongoexport -h flame.mongohq.com:12345 -u my_user -p my_pwd -d my_db -c my_coll

Necesitas instalar mongodb en tu computadora para tener esta herramienta de línea de comandos, y obviamente necesitas tu información de mongodb. En el ejemplo anterior, me conecto a MongoHQ (flame.mongohq.com es el anfitrión, ‘12345’ es el puerto de tu servidor de mongo), pero no sé qué host de Mongo realmente utiliza el meteoro. Si ha probado los ejemplos de Meteor (TODO, Leaderboard, etc.) localmente, es probable que ya haya instalado Mongo, ya que utiliza un servidor local de manera predeterminada.

Aquí hay otra solución en bash

 #! /bin/bash # inspired by http://stackoverflow.com/questions/11353547/bash-string-extraction-manipulation # http://www.davidpashley.com/articles/writing-robust-shell-scripts/ set -o nounset set -o errexit set -o pipefail set -x # stackoverflow.com/questions/7216358/date-command-on-os-x-doesnt-have-iso-8601-i-option function nowString { date -u +"%Y-%m-%dT%H:%M:%SZ" } NOW=$(nowString) # prod_url="mongodb://...:...@...:.../..." prod_pattern="mongodb://([^:]+):([^@]+)@([^:]+):([^/]+)/(.*)" prod_url=$(meteor mongo katapoolt --url | tr -d '\n') [[ ${prod_url} =~ ${prod_pattern} ]] PROD_USER="${BASH_REMATCH[1]}" PROD_PASSWORD="${BASH_REMATCH[2]}" PROD_HOST="${BASH_REMATCH[3]}" PROD_PORT="${BASH_REMATCH[4]}" PROD_DB="${BASH_REMATCH[5]}" PROD_DUMP_DIR=dumps/${NOW} mkdir -p dumps # local_url="mongodb://...:.../..." local_pattern="mongodb://([^:]+):([^/]+)/(.*)" local_url=$(meteor mongo --url | tr -d '\n') [[ ${local_url} =~ ${local_pattern} ]] LOCAL_HOST="${BASH_REMATCH[1]}" LOCAL_PORT="${BASH_REMATCH[2]}" LOCAL_DB="${BASH_REMATCH[3]}" mongodump --host ${PROD_HOST} --port ${PROD_PORT} --username ${PROD_USER} --password ${PROD_PASSWORD} --db ${PROD_DB} --out ${PROD_DUMP_DIR} mongorestre --port ${LOCAL_PORT} --host ${LOCAL_HOST} --db ${LOCAL_DB} ${PROD_DUMP_DIR}/${PROD_DB} 

meteor-backup es, de lejos, la forma más fácil de hacer esto.

 sudo npm install -g meteor-db-utils meteor-backup [domain] [collection...] 

A partir de marzo de 2015, aún debe especificar todas las colecciones que desea recuperar (hasta que se resuelva este problema ).


Cosas del pasado a continuación

estoy haciendo

 mongodump $(meteor mongo -U example.meteor.com | coffee url2args.cfee) 

junto con este pequeño coffeescript, con una extensión mutilada para no confundir a Meteor, url2args.cfee :

 stdin = process.openStdin() stdin.setEncoding 'utf8' stdin.on 'data', (input) -> m = input.match /mongodb:\/\/(\w+):((\w+-)+\w+)@((\w+\.)+\w+):27017\/(\w+)/ console.log "-u #{m[1]} -h #{m[4]} -p #{m[2]} -d #{m[6]}" 

(Sería más agradable si meteor mongo -U –mongodumpoptions daría estas opciones, o si mongodump aceptaría el mongo: // URL)

 # How to upload local db to meteor: # -h = host, -d = database name, -o = dump folder name mongodump -h 127.0.0.1:3001 -d meteor -o meteor # get meteor db url, username, and password meteor mongo --url myapp.meteor.com # -h = host, -d = database name (app domain), -p = password, folder = the path to the dumped db mongorestre -u client -h http://production-db-a2.meteor.io:27017 -d myapp_meteor_com -p 'password' folder/ 

Al cargar db local a db remoto, con una aserción Excepción

 shubham@shubham-PC:$ mongorestre -u client -h http://production-db-a2.meteor.io:27017 -d myapp_meteor_com -p my_password local/ 2015-04-22T16:37:38.504+0530 Assertion failure _setName.size() src/mongo/client/dbclientinterface.h 219 2015-04-22T16:37:38.506+0530 0xdcc299 0xd6c7c8 0xd4bfd2 0x663468 0x65d82e 0x605f98 0x606442 0x7f5d102f8ec5 0x60af41 mongorestre(_ZN5mongo15printStackTraceERSo+0x39) [0xdcc299] mongorestre(_ZN5mongo10logContextEPKc+0x198) [0xd6c7c8] mongorestre(_ZN5mongo12verifyFailedEPKcS1_j+0x102) [0xd4bfd2] mongorestre(_ZN5mongo16ConnectionStringC2ENS0_14ConnectionTypeERKSsS3_+0x1c8) [0x663468] mongorestre(_ZN5mongo16ConnectionString5parseERKSsRSs+0x1ce) [0x65d82e] mongorestre(_ZN5mongo4Tool4mainEiPPcS2_+0x2c8) [0x605f98] mongorestre(main+0x42) [0x606442] /lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xf5) [0x7f5d102f8ec5] mongorestre() [0x60af41] terminate called after throwing an instance of 'mongo::AssertionException' what(): assertion src/mongo/client/dbclientinterface.h:219 Aborted (core dumped) 

Hice este sencillo Rakefile para copiar el db en vivo a local.

Para restaurar el db en vivo a mi máquina local, solo hago …

 rake copy_live_db 

Reemplace myapp con el nombre de su meteor.com – por ejemplo myapp.meteor.com .

 requiere 'rubygems'
 requiere 'open-uri'

 desc "Hacer una copia de seguridad del archivo db en vivo en la carpeta local ./dump"
 tarea: backup_live_db do
   uri = `meteor mongo myapp --url`
   pass = uri.match (/ client: ([^ @] +) @ /) [1]
   pone "Using live db password: # {pass}"
   `mongodump -h meteor.m0.mongolayer.com:27017 -d myapp_meteor_com -u cliente -p # {pass}`
 fin


 desc "Copiar la base de datos en vivo a local"
 tarea: copy_live_db =>: backup_live_db do
   servidor = `meteor mongo --url`
   uri = URI.parse (servidor)
   `mongorestre --host # {uri.host} --port # {uri.port} --db meteor --drop dump / myapp_meteor_com /`
 fin

 desc "Restaurar la última copia de seguridad"
 tarea: restaurar hacer
   servidor = `meteor mongo --url`
   uri = URI.parse (servidor)
   `mongorestre --host # {uri.host} --port # {uri.port} --db meteor --drop dump / myapp_meteor_com /`
 fin

Para usar una base de datos mongodb local existente en su sitio de meteor deploy myAppName , necesita volcar y restaurar el mongodb.

Siga las instrucciones anteriores para mongodump (recuerde la ruta) y luego ejecute lo siguiente para generar su ‘ mongorestre ‘ (reemplaza el segundo paso y copiar / pegar):

CMD=meteor mongo -U myAppName.meteor.com | tail -1 | sed 's_mongodb://\([a-z0-9\-]*\):\([a-f0-9\-]*\)@\(.*\)/\(.*\)_mongorestre -u \1 -p \2 -h \3 -d \4_'

entonces

 $CMD /path/to/dump 

Desde Can mongorestre, ¿puedes tomar un solo argumento de URL en lugar de argumentos separados?

Creo que puede usar un sistema de archivos montado a distancia a través de sshfs y luego rsync para sincronizar la carpeta del mongodb o toda su carpeta de Meteor, creo también. Esto es como hacer una copia de seguridad incremental y potencialmente más eficiente. Es posible utilizar la misma solución para enviar cambios de código, etc. ¿Por qué no recuperar los cambios en la base de datos al mismo tiempo también? (matando 2 pájaros con 1 piedra)

Aquí hay un script bash simple que le permite volcar su base de datos de los sitios alojados de meteor.com.

 #!/bin/bash site="rankz.meteor.com" name="$(meteor mongo --url $site)" echo $name IFS='@' read -a mongoString <<< "$name" echo "HEAD: ${mongoString[0]}" echo "TAIL: ${mongoString[1]}" IFS=':' read -a pwd <<< "${mongoString[0]}" echo "${pwd[1]}" echo "${pwd[1]:2}" echo "${pwd[2]}" IFS='/' read -a site <<< "${mongoString[1]}" echo "${site[0]}" echo "${site[1]}" mongodump -u ${pwd[1]:2} -h ${site[0]} -d ${site[1]}\ -p ${pwd[2]}