Есть ли простой способ экспортировать данные из приложения, развернутого метеоритом?
Есть ли простой способ экспортировать данные из развернутого приложения с метеоритом?
Так, например, если бы я развернул приложение с именем test.meteor.com...
Как я могу легко загрузить данные, которые были собраны этим приложением, чтобы я мог локально запускать их с помощью данных из развернутого приложения?
Ответы
Ответ 1
Чтобы получить 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
Ответ 2
А вот как сделать обратное: (выгружаете свой локальный monogo db в метеор)
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/
Ответ 3
На основе решения Kasper Souren я создал обновленный script, который работает с текущими версиями Meteor, а также работает, когда вы защищаете свое удаленное приложение Meteor паролем.
Создайте следующие 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
Затем выполните это как в оболочке * nix:
mongodump `coffee parse-mongo-url.coffee`
Ответ 4
Я создал инструмент mmongo
, который обертывает все команды оболочки клиента Mongo DB для удобного использования в базе данных Meteor. Если вы используете npm
(Node Менеджер пакетов), вы можете установить его с помощью:
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
Ответ 5
Я полагаю, что ваши данные находятся в базе данных mongodb, поэтому, если это так, вопрос более связан с mongo, чем метеор. Вы можете взглянуть на инструменты командной строки mongoexport и mongoimport.
Изменить (например):
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, поскольку по умолчанию он использует локальный сервер.
Ответ 6
Вот еще одно решение в 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://...:[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}
Ответ 7
meteor-backup - это самый простой способ сделать это.
sudo npm install -g meteor-db-utils
meteor-backup [domain] [collection...]
По состоянию на март 2015 года вам все равно нужно указать все коллекции, которые вы хотите извлечь (до тех пор, пока эта проблема не будет устранена).
Материал из прошлого ниже
Я делаю
mongodump $(meteor mongo -U example.meteor.com | coffee url2args.cfee)
вместе с этим маленьким кофейником, с искаженным расширением, чтобы не путать Метеор, 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]}"
(было бы лучше, если бы meteor mongo -U -mongodumpoptions предоставили эти параметры, или если mongodump примет mongo://URL)
Ответ 8
# 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/
При загрузке локального db на удаленный db с утверждением 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)
Ответ 9
Я сделал этот простой Rakefile, чтобы скопировать live db на локальный.
Чтобы восстановить live db на моем локальном компьютере, я просто делаю...
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
Ответ 10
Чтобы использовать существующую локальную базу данных mongodb на вашем сайте meteor deploy myAppName
, вам нужно сбросить, а затем восстановить mongodb.
Следуйте инструкциям выше 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
Из Может ли mongorestore взять один аргумент url вместо отдельных аргументов?
Ответ 11
Я думаю, вы можете использовать удаленно смонтированную файловую систему через sshfs, а затем rsync для синхронизации самой папки mongodb или всей папки Meteor, которую я считаю. Это похоже на инкрементное резервное копирование и потенциально более эффективное.
Можно использовать одно и то же решение для отправки изменений вашего кода и т.д., Так почему бы вам не вернуться к изменениям базы данных в тоже время? (убивая 2 птицы с 1 камнем)
Ответ 12
Вот простой bash script, который позволяет вам удалять базу данных с размещенных сайтов 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]}