مشاكل الاستعادة

بناءً على مستودع 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، ولكن إليك بعض النصائح على أي حال. :wink:

لست متأكدًا من كيفية عمل rsync. هل يجب أن ينتهي المسار بشرطة مائلة؟ إذا انتهى الملف إلى المجلد الصحيح، فتأكد من أن الملف المنسوخ مقروء من قِبَل الخادم.

4 إعجابات

إذًا، هل يمكن أن يتسبب 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) ومعرفة أين ينتهي الملف في نظام الملفات المضيف لديك.

3 إعجابات

غريبًا، لا تظهر في نظام ملفات المضيف. هل ينبغي أن تظهر؟

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

خارج الموضوع: هل هناك طريقة لتسليط الضوء على الأسطر في كتل الأكواد؟

```bash

الافتراضي هنا هو النص. أعتقد أن الافتراضي في التثبيتات الجديدة هو “التخمين بناءً على اللغة”,

أقصد “انظروا يا رفاق، السطر الخامس مهم!”، أي التمييز (تظليل) لسطر أو أسطر محددة.

حسنًا، عادةً ما يكون /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، ولم يتم العثور عليه.

vagrant@ubuntu-xenial:~$ sudo docker inspect -f "{{.Mounts}}" discourse
[{bind  /var/discourse/shared/standalone /shared   true rprivate} {bind  /var/discourse/shared/standalone/log/var-log /var/log   true rprivate}]

صحيح، لكنني تجاهلت ذلك مؤقتًا. بالمناسبة، تم تنفيذ أمر rsync هذا خارج آلة (vagrant) التي شغلت فيها discourse.

لكن في الوقت الحالي، كما اقترحت، قمت بالخطوات التالية:

  • قمت بالاتصال بآلة vagrant عبر ssh ومن داخلها:
    • قمت بنسخ احتياطي باستخدام الأمر sudo docker exec -w /var/www/discourse -i discourse discourse backup
    • لاحظت مسار الملف:
      Output file is in: /var/www/discourse/public/backups/default/discourse-2020-05-14-125606-v20200512064023.tar.gz
      
    • بحثت في آلة vagrant بأكملها عن هذا الملف المحدد، لكنني لم أعثر على شيء
      find / -name discourse-2020-05-14-125606-v20200512064023.tar.gz 2>/dev/null
      
    • ومع ذلك، إذا دخلت إلى آلة 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 المحيطة.

config.vm.synced_folder "discourse/", "/var/discourse"

إذا قمت بإلغاء التعليق عن هذا السطر في ملف Vagrantfile الخاص بي، فإن النسخ الاحتياطية ستظهر “بشكل سحري”.

إذن كانت المشكلة أن مجلد Vagrant المشترك (لـ “up”) ومجلد Docker المشترك (لـ “down”) يتنافسان مما يجعلهما غير صالحين.

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.