2012-06-13 4 views
71

Есть ли простой способ экспортировать данные из установленного метеорита приложения?Есть ли простой способ экспортировать данные из приложения, развернутого метеоритом?

Так, например, если я развернула приложение по имени test.meteor.com ...

Как я мог бы легко загрузить данные, которые были собраны с помощью этого приложения - так что я мог запустить его локально с данными из развернутого приложения?

+0

доступ метеор DB непосредственно .. посмотреть http://stackoverflow.com/a/31639624/2837412 –

ответ

5

Я полагаю, что ваши данные находятся в базе данных mongodb, поэтому, если это так, вопрос более связан с mongo, чем метеор. Вы можете посмотреть mongoexport and mongoimport command line tools.

Edit (например):

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

Вам необходимо установить MongoDB на вашем компьютере, чтобы этот инструмент командной строки, и, очевидно, вам нужно проинформированым MongoDB. В приведенном выше примере я подключаюсь к MongoHQ (пламя.mongohq.com является хостом, «12345» - это порт вашего сервера mongo), но я не знаю, какой монгонский хост фактически используется метеорным хостингом. Если вы попытались использовать Meteor-примеры (TODO, Leaderboard и т. Д.) Локально, скорее всего, вы уже установили Mongo, поскольку по умолчанию использует локальный сервер.

+0

Не уверен, если я могу запустить командную строку Монго на сервере метеора. Кто-нибудь знает? –

+0

Фактически, вы запускаете его со своего компьютера, но вы указываете облачную информацию о монго (хост, порт, возможно, user & pwd). Я попробую дать вам пример через несколько минут. – mna

+0

Я отредактировал ответ, надеюсь, это вам поможет. Команда довольно проста, я показал наиболее полезные/общие аргументы, по умолчанию выводит на stdout, вы можете перенаправить его в файл или указать его непосредственно в качестве аргумента. mongoexport --help достаточно подробно. – mna

91

Чтобы получить URL для развернутого сайта в meteor.com с помощью команды (возможно, вам необходимо предоставить пароль для сайта, если защищен паролем его):

meteor mongo --url YOURSITE.meteor.com 

который будет возвращать что-то вроде:

mongodb://client:[email protected]:27017/YOURSITE_meteor_com 

Что вы можете дать программе как mongodump

mongodump -u client -h sky.member1.mongolayer.com:27017 -d YOURSITE_meteor_com\ 
      -p PASSWORD 

Пароль подходит только в течение одной минуты. Для использования:

$ meteor --help mongo 
+1

Спасибо! Это было очень полезно, но я бы добавил, что -d должен быть yoursite_meteor_com. – Erick

+0

Спасибо, я действительно искал это. В качестве примечания стороны, имя хоста для моего проекта метеора было skybreak.member1.mongolayer.com, а не sky.member1.mongolayer.com – dgraziotin

+2

Да, важно отметить здесь, что \ в конце имени базы данных позволяет вы продолжаете команду на следующей строке вашего терминала. Он не является частью имени базы данных, и вы увидите ошибку, если вы выпишите свою команду на одной строке. – Pathogen

2

meteor-backup, безусловно, самый простой способ сделать это.

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

По состоянию на март 2015 года вы все равно должны указать все коллекции, которые вы хотите, чтобы принести хотя (пока this issue не будет решена).


Материал из прошлых ниже

Я делаю

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

вместе с этим маленьким CoffeeScript, с искаженным расширением, чтобы не запутать Метеор, 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]}" 

(это будет b лучше, если meteor mongo -U -mongodumpoptions предоставит эти варианты, или если mongodump примет mongo: // URL)

10

Основываясь на решении Kasper Souren, я создал обновленный скрипт, который работает с текущими версиями Meteor, а также работает, когда вы защищаете свое удаленное приложение Meteor паролем.

Пожалуйста, создайте следующий скрипт 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 

Затем выполнить его, как это в * NIX оболочки:

mongodump `coffee parse-mongo-url.coffee` 
+0

Это невероятно полезно.Возиться с именем пользователя и паролем в одноминутном временном поле, где учетные данные действительны, чтобы собрать правильную команду mongodump или mongorestore, стареет очень быстро. – Pathogen

1

Я сделал это простой Rakefile скопировать живой дб местным.

Для восстановления живой дб на моей локальной машине я просто ...

rake copy_live_db 

Заменить myapp с именем вашего meteor.com - например myapp.meteor.com.

 
require 'rubygems' 
require 'open-uri' 

desc "Backup the live db to local ./dump folder" 
task :backup_live_db do 
    uri = `meteor mongo myapp --url` 
    pass = uri.match(/client:([^@]+)@/)[1] 
    puts "Using live db password: #{pass}" 
    `mongodump -h meteor.m0.mongolayer.com:27017 -d myapp_meteor_com -u client -p #{pass}` 
end 


desc "Copy live database to local" 
task :copy_live_db => :backup_live_db do 
    server = `meteor mongo --url` 
    uri = URI.parse(server) 
    `mongorestore --host #{uri.host} --port #{uri.port} --db meteor --drop dump/myapp_meteor_com/` 
end 

desc "Restore last backup" 
task :restore do 
    server = `meteor mongo --url` 
    uri = URI.parse(server) 
    `mongorestore --host #{uri.host} --port #{uri.port} --db meteor --drop dump/myapp_meteor_com/` 
end 
37

А вот как сделать наоборот: (загрузив локальный моного дб на метеор)

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 
mongorestore -u client -h c0.meteor.m0.mongolayer.com:27017 -d myapp_meteor_com -p 'password' folder/ 
+0

Я получаю следующие ошибки: любые идеи ОШИБКА: ОШИБКА: корневой каталог должен быть дампом одной базы данных ОШИБКА: при указании имени db с -db –

+0

@almog, убедитесь, что ваша папка 'mongorestore' указывает на где находятся файлы '.bson'. Например, с 'mongodump -h 127.0.0.1:3002 -d метеор', путь к сбрасываемому db для' mongorestore' (выполняется из того же каталога, что и 'mongodump'), это' dump/meteor/' –

3

Вот еще одно решение в Баш

#! /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://...:[email protected]:.../..." 
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} 
mongorestore --port ${LOCAL_PORT} --host ${LOCAL_HOST} --db ${LOCAL_DB} ${PROD_DUMP_DIR}/${PROD_DB} 
+0

. killer, если удаленный url был argv скрипта bash! Большое спасибо. – gabrielhpugliese

+0

Не работает под Git Shell, поскольку, как представляется, libregex, поставляемый с msysgit, не поддерживает оператор = ~. – steph643

0

Для используйте существующую локальную базу данных mongodb на вашем meteor deploy myAppName сайт, вам нужно свалить, а затем восстановить монгодб.

Следуйте инструкциям, приведенным выше в mongodump (помните, путь), а затем запустить следующее для генерации «mongorestore» (заменяет второй шаг и копирования/вставки):

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

затем

$CMD /path/to/dump 

От Can mongorestore take a single url argument instead of separate arguments?

6

Я создал инструмент, mmongo, который обертывает все команды оболочки клиента Mongo DB для удобного использования в базе данных Meteor. Если вы используете npm (Node Manager Package), вы можете установить его с помощью:

npm install -g mmongo 

В противном случае см README.

Чтобы создать резервную копию базы данных Meteor, теперь вы можете сделать:

mmongo test.meteor.com dump 

Чтобы загрузить его на локальном метеора развития будет:

mmongo restore dump/test_meteor_com 

И если вы случайно удалить базу данных производства:

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

Вы можете легко восстановить его:

mmongo test.meteor.com restore dump/test_meteor_com 

Если вы не хотите экспортировать коллекцию (скажем tasks) к чему-то читаемом:

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

Затем вы можете открыть tasks.json в текстовом редакторе, сделать некоторые изменения и вставить изменения с:

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

Github, NPM

+1

Я просто хотел добавить, что во избежание ошибки [system.users: not authorized]] (http://docs.mlab.com/backups/) вы также можете сделать это: 'mmongo test.meteor.com dump --excludeCollection = system.users' – Giwan

2
# 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 
mongorestore -u client -h http://production-db-a2.meteor.io:27017 -d myapp_meteor_com -p 'password' folder/ 

При загрузке локальной БД с удаленной БД, имея утверждение Exception

[email protected]:$ mongorestore -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 
mongorestore(_ZN5mongo15printStackTraceERSo+0x39) [0xdcc299] 
mongorestore(_ZN5mongo10logContextEPKc+0x198) [0xd6c7c8] 
mongorestore(_ZN5mongo12verifyFailedEPKcS1_j+0x102) [0xd4bfd2] 
mongorestore(_ZN5mongo16ConnectionStringC2ENS0_14ConnectionTypeERKSsS3_+0x1c8) [0x663468] 
mongorestore(_ZN5mongo16ConnectionString5parseERKSsRSs+0x1ce) [0x65d82e] 
mongorestore(_ZN5mongo4Tool4mainEiPPcS2_+0x2c8) [0x605f98] 
mongorestore(main+0x42) [0x606442] 
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xf5) [0x7f5d102f8ec5] 
mongorestore() [0x60af41] 
terminate called after throwing an instance of 'mongo::AssertionException' 
    what(): assertion src/mongo/client/dbclientinterface.h:219 
Aborted (core dumped) 
0

Я думаю, что вы можете использовать удаленно смонтированную файловую систему с помощью sshfs, а затем rsync синхронизировать самое папку в MongoDB в или всю папку Метеора я считаю, также. Это похоже на инкрементное резервное копирование и потенциально более эффективное. Можно использовать одно и то же решение для отправки изменений вашего кода и т. Д., Так почему бы вам не вернуться к изменениям базы данных в тоже время? (убийство 2-х птиц с 1 камнем)

0

Вот простой сценарий bash, который позволяет вам сбрасывать вашу базу данных с размещенных сайтов 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]} 
Смежные вопросы