بناءً على مستودع discourse_docker، قمت بكتابة سكريبت صغير لأتمتة استخدامه داخل آلة vagrant (شغّل مع set -x لرؤية ما يُنفَّذ فعليًا)
هل قمت بنسخ النسخة الاحتياطية إلى الموقع الخطأ؟
وماذا تعني سطر السجل هذا:
Making sure /var/www/discourse/tmp/restores/default/2020-05-13-190832 exists...
~/infra/discourse on master! ⌚ 21:14:07
$ pwd
/home/pihentagy/infra/discourse
~/infra/discourse on master! ⌚ 21:01:14
$ ./wl.sh start
+ set -e
+ VAGRANT_MACHINE_NAME=guest
+ cd discourse
+ case "$1" in
+ init
+ printf 'Checking out and updating repo…\n'
Checking out and updating repo…
+ cd ..
+ git clone https://github.com/discourse/discourse_docker.git discourse
fatal: destination path 'discourse' already exists and is not an empty directory.
+ printf 'Repo already there\n'
Repo already there
+ cd discourse
+ printf 'Updating repo…\n'
Updating repo…
+ git pull -r
remote: Enumerating objects: 6, done.
remote: Counting objects: 100% (6/6), done.
remote: Compressing objects: 100% (4/4), done.
remote: Total 6 (delta 2), reused 5 (delta 2), pack-reused 0
Unpacking objects: 100% (6/6), done.
From https://github.com/discourse/discourse_docker
3e465a2..49ed141 master -> origin/master
Created autostash: 36aae80
HEAD is now at 3e465a2 Remove all pg12 traces so pg_wrapper doesn't get confused
First, rewinding head to replay your work on top of it...
Fast-forwarded master to 49ed14152971f7f4a7437657987952be44c33c0a.
Applying autostash resulted in conflicts.
Your changes are safe in the stash.
You can run "git stash pop" or "git stash drop" at any time.
+ printf 'Copying config file…\n'
Copying config file…
+ cp ../resources/discourse.yml containers/
+ echo 'Starting Vagrant machine...'
Starting Vagrant machine...
+ vagrant up
Bringing machine 'dockerhost' up with 'virtualbox' provider...
==> dockerhost: Checking if box 'ubuntu/xenial64' is up to date...
==> dockerhost: Machine already provisioned. Run `vagrant provision` or use the `--provision`
==> dockerhost: flag to force provisioning. Provisioners marked to run always will still run.
+ vagrant ssh -c 'cd /vagrant;sudo ./launcher start discourse'
2627afdfbaac
Nothing to do, your container has already started!
Connection to 127.0.0.1 closed.
+ exit 0
~/infra/discourse on master! ⌚ 21:07:56
$ ./wl.sh restore /home/pihentagy/infra/icontest-2020-05-12-033823-v20200506044956.tar.gz
+ set -e
+ VAGRANT_MACHINE_NAME=guest
+ cd discourse
+ case "$1" in
+ shift
+ backup=/home/pihentagy/infra/icontest-2020-05-12-033823-v20200506044956.tar.gz
+ discourse_backup_dir=shared/standalone/backups/default
+ mkdir --parents shared/standalone/backups/default
+ rsync -P --verbose /home/pihentagy/infra/icontest-2020-05-12-033823-v20200506044956.tar.gz shared/standalone/backups/default
icontest-2020-05-12-033823-v20200506044956.tar.gz
390,774,609 100% 317.41MB/s 0:00:01 (xfr#1, to-chk=0/1)
sent 390,870,133 bytes received 35 bytes 156,348,067.20 bytes/sec
total size is 390,774,609 speedup is 1.00
+ vagrant ssh -c 'sudo docker exec -w /var/www/discourse -i discourse discourse enable_restore'
Restore are now permitted. Disable them with `disable_restore`
Connection to 127.0.0.1 closed.
+ vagrant ssh -c 'sudo docker exec -w /var/www/discourse -i discourse discourse restore'
You must provide a filename to restore. Did you mean one of the following?
Connection to 127.0.0.1 closed.
+ vagrant ssh -c 'sudo docker exec -w /var/www/discourse -i discourse discourse restore icontest-2020-05-12-033823-v20200506044956.tar.gz'
Starting restore: icontest-2020-05-12-033823-v20200506044956.tar.gz
[STARTED]
'system' has started the restore!
Marking restore as running...
Making sure /var/www/discourse/tmp/restores/default/2020-05-13-190832 exists...
Copying archive to tmp directory...
EXCEPTION: lib/discourse.rb:90:in `exec': Failed to copy archive to tmp directory.
cp: cannot stat '/var/www/discourse/public/backups/default/icontest-2020-05-12-033823-v20200506044956.tar.gz': No such file or directory
lib/discourse.rb:100:in `execute_command'
lib/discourse.rb:90:in `exec'
lib/discourse.rb:40:in `execute_command'
/var/www/discourse/lib/backup_restore/local_backup_store.rb:42:in `download_file'
/var/www/discourse/lib/backup_restore/backup_file_handler.rb:61:in `copy_archive_to_tmp_directory'
/var/www/discourse/lib/backup_restore/backup_file_handler.rb:21:in `decompress'
/var/www/discourse/lib/backup_restore/restorer.rb:42:in `run'
script/discourse:143:in `restore'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/thor-1.0.1/lib/thor/command.rb:27:in `run'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/thor-1.0.1/lib/thor/invocation.rb:127:in `invoke_command'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/thor-1.0.1/lib/thor.rb:392:in `dispatch'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/thor-1.0.1/lib/thor/base.rb:485:in `start'
script/discourse:284:in `<top (required)>'
/usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.4/lib/bundler/cli/exec.rb:63:in `load'
/usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.4/lib/bundler/cli/exec.rb:63:in `kernel_load'
/usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.4/lib/bundler/cli/exec.rb:28:in `run'
/usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.4/lib/bundler/cli.rb:476:in `exec'
/usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.4/lib/bundler/vendor/thor/lib/thor/command.rb:27:in `run'
/usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.4/lib/bundler/vendor/thor/lib/thor/invocation.rb:127:in `invoke_command'
/usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.4/lib/bundler/vendor/thor/lib/thor.rb:399:in `dispatch'
/usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.4/lib/bundler/cli.rb:30:in `dispatch'
/usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.4/lib/bundler/vendor/thor/lib/thor/base.rb:476:in `start'
/usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.4/lib/bundler/cli.rb:24:in `start'
/usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.4/exe/bundle:46:in `block in <top (required)>'
/usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.4/lib/bundler/friendly_errors.rb:123:in `with_friendly_errors'
/usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.4/exe/bundle:34:in `<top (required)>'
/usr/local/bin/bundle:23:in `load'
/usr/local/bin/bundle:23:in `<main>'
Trying to rollback...
There was no need to rollback
Cleaning stuff up...
Removing tmp '/var/www/discourse/tmp/restores/default/2020-05-13-190832' directory...
Unpausing sidekiq...
Marking restore as finished...
Notifying 'system' of the end of the restore...
Finished!
[FAILED]
Restore done.
Connection to 127.0.0.1 closed.
لا يتم دعم Vagrant، ولكن إليك بعض النصائح على أي حال.
لست متأكدًا من كيفية عمل rsync. هل يجب أن ينتهي المسار بشرطة مائلة؟ إذا انتهى الملف إلى المجلد الصحيح، فتأكد من أن الملف المنسوخ مقروء من قِبَل الخادم.
إذًا، هل يمكن أن يتسبب vagrant (virtualbox) في بعض المشاكل؟
~/infra/discourse on master! ⌚ 23:22:23
$ tree discourse/shared
discourse/shared
└── standalone
└── backups
└── default
└── icontest-2020-05-12-033823-v20200506044956.tar.gz
3 directories, 1 file
~/infra/discourse on master! ⌚ 23:22:27
$ ls discourse/shared/standalone/backups/default
icontest-2020-05-12-033823-v20200506044956.tar.gz
~/infra/discourse on master! ⌚ 23:22:36
$ ls -l discourse/shared/standalone/backups/default
total 381620
-rw-r--r-- 1 pihentagy pihentagy 390774609 May 13 21:08 icontest-2020-05-12-033823-v20200506044956.tar.gz
يبدو أن الملف قابل للقراءة للجميع وقد انتهى في المكان الصحيح. من داخل حاوية discourse Docker، أين يجب أن أرى النسخة الاحتياطية؟ هل سكريبت الاستعادة التلقائي الخاص بي صحيح أم يجب أن أنسخ الملف داخل حاوية Docker؟ وإذا كان الأمر كذلك، فأين؟ (ربما توجد أي أدلة حول كيفية أتمتة Discourse من خارج [Docker]؟)
+ vagrant ssh -c 'sudo docker exec -w /var/www/discourse -i discourse discourse restore'
You must provide a filename to restore. Did you mean one of the following?
Connection to 127.0.0.1 closed.
+ vagrant ssh -c 'sudo docker exec -w /var/www/discourse -i discourse discourse restore icontest-2020-05-12-033823-v20200506044956.tar.gz'
Starting restore: icontest-2020-05-12-033823-v20200506044956.tar.gz
[
ليس ذلك مطلوبًا، لكن عدم إنهاء المسار بفاصلة مائلة يُعد ممارسة سيئة لأن النتيجة تعتمد على ما إذا كان الدليل موجودًا بالفعل أم لا.
إذا كان دليل الوجهة موجودًا بالفعل، فلا حاجة لفاصلة مائلة، ويتم نسخ الملف داخل الدليل.
إذا لم يكن دليل الوجهة موجودًا ولا توجد فاصلة مائلة في النهاية، يتم نسخ الملف إلى ملف باسم ‘default’.
إذا لم يكن دليل الوجهة موجودًا وتوجد فاصلة مائلة في النهاية، يتم إنشاء الدليل ويتم نسخ الملف إليه.
في هذه الحالة، يبدو أن النسخ يتم بنجاح (عن طريق الصدفة).
ومع ذلك،
نظرًا لعدم وجود اقتراحات بعد عبارة “هل تقصد أحد الخيارات التالية؟”، فهذا يعني أن الملف ليس في المكان الصحيح. يبدو أن الأقراص مُعينة بشكل غير صحيح داخل حاوية Docker.
يمكنك بدء نسخة احتياطية من داخل Docker (discourse backup) ومعرفة أين ينتهي الملف في نظام الملفات المضيف لديك.
غريبًا، لا تظهر في نظام ملفات المضيف. هل ينبغي أن تظهر؟
vagrant@ubuntu-xenial:~$ sudo docker exec -w /var/www/discourse -i discourse discourse backup
بدء النسخة الاحتياطية...
[بدأ]
بدأت 'system' عملية النسخة الاحتياطية!
تحديد حالة النسخة الاحتياطية على أنها قيد التنفيذ...
التأكد من وجود '/var/www/discourse/tmp/backups/default/2020-05-14-121930'...
التأكد من وجود '/var/www/discourse/public/backups/default'...
تحديث البيانات الوصفية...
إيقاف sidekiq مؤقتًا...
انتظار انتهاء sidekiq من تشغيل الوظائف...
تصدير المخطط العام لقاعدة البيانات...
…
كمية هائلة من عمليات pg_dump"
…
إعادة تفعيل sidekiq...
إنهاء النسخة الاحتياطية...
إنشاء الأرشيف: discourse-2020-05-14-121930-v20200512064023.tar.gz
tأكد من عدم وجود الأرشيف مسبقًا...
إنشاء أرشيف فارغ...
أرشفة تصدير البيانات...
أرشفة الملفات المرفقة...
حذف مجلد '/var/www/discourse/tmp/backups/default/2020-05-14-121930' المؤقت...
ضغط الأرشيف، قد يستغرق هذا بعض الوقت...
تنفيذ خطاف after_create_hook للنسخة الاحتياطية...
حذف النسخ الاحتياطية القديمة...
تنظيف الأشياء...
حذف بقايا '.tar'...
تحديد حالة النسخة الاحتياطية على أنها منتهية...
تحديث إحصائيات القرص...
انتهى!
[نجاح]
تمت النسخة الاحتياطية.
ملف الإخراج موجود في: /var/www/discourse/public/backups/default/discourse-2020-05-14-121930-v20200512064023.tar.gz
vagrant@ubuntu-xenial:~$ find / -name discourse-2020-05-14-121930-v20200512064023.tar.gz 2>/dev/null
vagrant@ubuntu-xenial:~$ sudo docer exec -w /var/www/discourse -i discourse discourse enable_restore
sudo: docer: الأمر غير موجود
vagrant@ubuntu-xenial:~$ sudo docker exec -w /var/www/discourse -i discourse discourse enable_restore
تم الآن السماح بالاستعادة. يمكن تعطيلها باستخدام `disable_restore`
vagrant@ubuntu-xenial:~$ sudo docker exec -w /var/www/discourse -i discourse discourse restore
يجب تقديم اسم ملف للاستعادة. هل تقصد أحد الخيارات التالية؟
discourse restore discourse-2020-05-14-121930-v20200512064023.tar.gz
discourse restore discourse-2020-05-14-121710-v20200512064023.tar.gz
discourse restore discourse-2020-05-14-120436-v20200512064023.tar.gz
خارج الموضوع: هل هناك طريقة لتسليط الضوء على الأسطر في كتل الأكواد؟
حسنًا، عادةً ما يكون /var/discourse/shared/standalone/backups هو الدليل الذي يكون مرئيًا في الحاوية الخاصة بك كـ /var/www/discourse/public/backups (ومن هنا جاءت كلمة shared). أمر rsync الخاص بك يضع النسخة الاحتياطية داخل هذا الدليل لجعلها قابلة للوصول من داخل الحاوية.
وعكس ذلك، إذا كانت الحاوية تكتب إلى public/backups، فيجب أن تكون مرئية على المضيف في الدليل المشترك.
لقد كتبت /var/discourse/shared... أعلاه. لكن يبدو أنك تعمل في ~/infra/discourse، لذا فإنك تنسخ إلى ~/infra/discourse/shared/standalone/backups/default.
عادةً ما يتم ربط الحاوية بـ /var/discourse/shared/...
قد يكون هذا هو المشكلة. هل يمكنك التحقق مما إذا كان لديك /var/discourse/shared؟
ومع ذلك، إذا دخلت إلى آلة Docker، فإن الملف موجود هناك
root@ubuntu-xenial-discourse:/var/www/discourse/public/backups/default# ls
discourse-2020-05-14-120436-v20200512064023.tar.gz discourse-2020-05-14-121930-v20200512064023.tar.gz
discourse-2020-05-14-121710-v20200512064023.tar.gz discourse-2020-05-14-125606-v20200512064023.tar.gz
إذن سؤالي: إذا قمت بإنشاء نسخة احتياطية، هل يجب أن أراها من خارج Docker؟
في غضون ذلك، قمت للتو بإنشاء آلة vagrant، وقمت بـ git clone من الداخل في الدليل القياسي /var/discourse. الشيء “الغريب” الوحيد هو أنني أملك ملف discourse.yml داخل الحاوية، وليس app.yml.
نعم، وهذا هو نفس الشيء الذي يمثل مشكلتك الأصلية:
“إذا كانت لديك نسخة احتياطية خارج Docker وقمت بوضعها في المجلد المشترك، فيجب أن تراها داخل Docker” (وأنت لا تراها).
المشكلة تتعلق بمجلداتك المشتركة، والسبب في ذلك هو:
أقصد: حتى الآن قمت بإنشاء آلة Vagrant جديدة تمامًا، دون نسخ أي نسخ احتياطية سابقة. قمت بإجراءات التمهيد وتشغيل حاوية Docker، ثم نفذت عملية النسخ الاحتياطي.
لا يُظهر شيء في آلة Vagrant خارج حاوية Docker.
أعتقد أنني وجدت المشكلة: لقد قمت بربط مجلد discourse-shared داخل آلة Vagrant المحيطة.