Pantheon'da Barındırılan Web Siteleri için Otomatik Yedekleme Komut Dosyası

Yayınlanan: 2023-03-28

DigiSavvy, Pantheon'da birçok web sitesine ev sahipliği yapıyor. Ücretli plandaki sitelerde otomatik yedekleme etkindir, ancak henüz ücretli plan olmayan sitelerde bu özellik yoktur; Bu, çözdüğümüz sorunun kalbidir. Bu nedenle, otomatik yedekleme özelliği olmayan web siteleri için günlük yedekleme yapan bir komut dosyası oluşturmamız gerekiyordu.

Otomatik Pantheon yedekleme iş akışına girin

Bunun Terminus, Bash ve Linux cronjobs gibi bir araç karışımı kullanarak mümkün olduğunu biliyorduk. Biraz tartıştıktan sonra, ücretsiz Pantheon siteleri için Pantheon yedekleme sürecini otomatikleştirecek bir çözüm üzerinde çalışmaya başladık.

Çözüm

Otomatik yedekleme özelliği olmadan tüm Pantheon web sitelerinin yedeğini almak için günlük olarak çalışan bir bash betiği oluşturduk.

Ayrıca Slack kanalımıza olası hatalar veya sorunlar hakkında bizi bilgilendirmek için bir bildirim mesajı gönderilmektedir.

Gereksinimler

Bu çözümü uygulamak için bazı özel ortamlara ve araçlara ihtiyacınız olacak. Bu öğeleri ayarladığınızdan emin olun.

  • SSH erişimine sahip bir Ubuntu sunucusu : bazı araçları yüklemek ve olası sorunları çözmek için yüksek düzeyde sunucu özelleştirmesi gerekir. Ubuntu kullanıyoruz, ancak tercih ettiğiniz Linux lezzetini kullanabilirsiniz.
  • Terminus : Bu, resmi Pantheon CLI aracıdır. Ubuntu sunucunuza yüklenmesi gerekir.
  • Slack Uygulaması : İsteğe bağlıdır, ancak yedeklemeler çalıştıktan sonra bildirimi başlatmak için gereklidir. Yapılandırmak için bu öğreticiyi izleyin. Ayrıca, uygulamayı bildirimi göndermek istediğiniz kanala eklemeyi unutmayın.

Senaryoları yazmak

Komut dosyalarının bash sözdizimi kullanılarak yazılması gerekiyor çünkü bazı koşullu kontroller yapmamız ve bazı Linux ve Terminus komutlarını çalıştırmamız gerekiyor.

Yedek bash betiği

Bu bash komut dosyası, bir dizi web sitesi dize tanımlayıcısı üzerinde yinelenir ve her biri için bir yedek oluşturmak üzere Terminus komutunu terminus backup:create kullanır. --keep-for seçeneği, yedeği saklamak için saklama süresini gün cinsinden belirler.

 #!/bin/sh # Exit on error set -e # Stash list of all Pantheon sites in the org PANTHEON_SITES=("site1.env" "site2.env" "site3.env") # Loop through each site in the list for sitename in ${PANTHEON_SITES[@]}; do terminus backup:create --keep-for 30 $sitename done

Terminus komut yapısı tipik olarak <site>.<env> hedef siteyi ve karşı yürütülecek ortamı belirlemeyi içerir.

<> sembollerinin örneğin bir parçası olduğunu ve Terminus komutlarınıza dahil edilmemesi gerektiğini unutmayın.

Ayrıca, herhangi bir komut kullanılmadan önce Terminus'un kimliğinin bir makine belirteci ile doğrulanması gerekir. Uzaktan talimatları yürütmek için SSH anahtarı erişimini ayarlamanız da gerekebilir.

Bizim durumumuzda, Pantheon yedekleme sürecini otomatikleştirmek için uyguladığımız betikler Pantheon'da değil, farklı bir sunucuda barındırılıyordu. Bu nedenle, SSH anahtar erişimini ayarlamak zorunda kaldık.

Yedekleme durumunu kontrol etme

Yedekleme betiği tarafından oluşturulan tüm yedeklemelerin durumunu kontrol etmek için başka bir bash betiği yazdık.

Betikte tanımlanmış iki dizi vardır, biri yedeklenen web siteleri dize tanımlayıcıları için ve diğeri tek bir yedeğin her bir parçası için.

Her Pantheon yedeklemesi üç dosyadan oluşur.

  • Kod : Site Kontrol Paneli aracılığıyla kontrol edilen ve taahhüt edilen herhangi bir sürüm. Kodda yapılmamış SFTP değişiklikleri yedeklenmez.
  • Dosyalar : WordPress için wp-content/uploads ve Drupal için sites/all/default/files standart yükleme yolunda depolanan resimler ve varlıklar.
  • Veritabanı : sitenizin DB'sinin bir MySQL dökümüdür.

Bu üç dosya indirilebilir olduğunda yedekleme başarılı olur.

Ancak, bazen Terminus yedekleme işleminin bir noktasında başarısız olduğu için bu dosyalardan bazıları oluşturulmaz.

Komut dosyası, bu üç dosyanın varlığını kontrol etmek için Terminus komutunu terminus backup:get kullanır. Bu üç dosyadan herhangi birinin eksik olması durumunda yedekleme durumu başarısız olarak değerlendirilecektir.

Her yedekleme kontrolünün sonucu backups_results.txt adlı bir dosyaya kaydedilir. backups_results.txt dosyası, bir JSON nesnesinin dize temsilini içerir. Bu nesnenin yedeklenen her web sitesi için bir girişi vardır.

 #!/bin/sh # Stash list of all Pantheon sites in the org PANTHEON_SITES=("site1.env" "site2.env" "site3.env") FILES=("code" "files" "database") backups_checks='{' # JSON file with all the websites with a true variable. This file will save the backup status of each website # Loop through each site in the list to check the backups for sitename in ${PANTHEON_SITES[@]}; do check_result=true # Assume the backup was sucefully made # Each backup has a code, files and database file. If one of these is missing, Pantheon reports the back as failed. for file_type in ${FILES[@]}; do result=$(terminus backup:get --no-ansi --element $file_type $sitename) if [ -z "$result" ] then # Edit the corresponding JSON entry to false. check_result=false fi done # Save true or false in a json file. That file will be used by a php script to generate the Slack notification backups_checks+="\\"$sitename\\":\\"$check_result\\"," done # Remove last character ',' backups_checks=${backups_checks:0:-1} backups_checks+="}" echo $backups_checks > backups_results.txt

Slack Bildirimi – İsteğe bağlı

Son olarak, Slack API kullanarak bildirim göndermek için bir PHP dosyası oluşturduk. İlk olarak, 'backups_results.txt' içindeki dize file_get_contents() işlevi kullanılarak çekilir ve json_decode() işlevi kullanılarak geçerli bir PHP değişkenine dönüştürülür. Bu değişken, Slack mesajını oluşturmak için gereken mantığın kurulmasına yardımcı olacaktır. Kod, aşırı erişim web sitesini yineler ve her biri için bir bildirim oluşturur. Mesaj, son yedeğinin durumuna göre değişir.

Mesaj, chat.postMessage bitiş noktası kullanılarak belirli bir Slack kanalına gönderilir. Mesajı göndermek istediğiniz kanal kimliğini bulmak için uç nokta conversations.list de kullanabilirsiniz.

 <?php $backups_results_file = file_get_contents( 'backups_results.txt' ); $backups_results = json_decode( $backups_results_file, true ); slack_post( $backups_results ); /** * POST the message to the Slack channel named 'client-support' */ function slack_post( $backups_results ) { $ch = curl_init(); curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 ); curl_setopt( $ch, CURLOPT_TIMEOUT, 10 ); curl_setopt( $ch, CURLOPT_HTTPHEADER, array( 'Content-Type: application/json', 'Authorization: Bearer your-slack-token', ) ); # The id of the client-support channel. The channel id could be retrieved using this function $channel_; # Prepare the slack message $slack_blocks = array( array( 'type' => 'section', 'text' => array( 'type' => 'plain_text', 'emoji' => true, 'text' => 'Some Pantheon backups were made', ), ), array( 'type' => 'divider', ), ); foreach ( $backups_results as $website_name => $website_backup_status ) { $website_dashboard = shell_exec( "terminus dashboard:view --print -- $website_name" ); if ( $website_backup_status ) { $status_icon = ':white_check_mark:'; $status_text = "*Website $website_name* \\n The backup was successfully made $status_icon \\n Visit $website_dashboard to download the backup"; } else { $status_icon = ':x:'; $status_text = "*Website $website_name* \\n The backup could not be completed $status_icon \\n Visit $website_dashboard to manually create the backup"; } $slack_blocks[] = array( 'type' => 'section', 'text' => array( 'type' => 'mrkdwn', 'text' => $status_text, ), ); } $payload = json_encode( array( 'channel' => $channel_id, 'text' => 'Posting to Digisavy client-support channel', 'blocks' => $slack_blocks, ) ); curl_setopt( $ch, CURLOPT_URL, '<https://slack.com/api/chat.postMessage>' ); curl_setopt( $ch, CURLOPT_CUSTOMREQUEST, 'POST' ); curl_setopt( $ch, CURLOPT_POSTFIELDS, $payload ); $result = curl_exec( $ch ); $result_encode = json_decode( $result ); curl_close( $ch ); }

cronjob'u kurmak

Cronjob, yedekleme otomasyon sürecinin büyük bir parçasıdır. Ayarlamak için sonraki adımları izleyin. Sunucunuza SHH kullanarak erişin ve cronjob yapılandırma dosyasını açmak için crontab -e komutunu çalıştırın.

Bir crontab dosyası, her komut satırının ilk beş alanı tarafından belirtilen zamanda otomatik olarak yürütülen, her satıra bir komut olmak üzere komutlardan oluşur. Bir crontab dosyasındaki her komut, bu satır çok uzun olsa bile bir satırdan oluşmalıdır. Crontab dosyası fazladan satır başlarını tanımıyor.

Cron komutunuzu oluşturmak ve zamanlama için sözdizimini yapılandırmak için yardıma ihtiyacınız varsa, bu crontab oluşturucu yardımcı olabilir.

Cron satırınız şunu içermelidir:

  • Komut dosyalarının yaşadığı klasöre erişme komutu
  • Komut dosyalarını yürütmek için bir komut.

PATH değişkeninin amacı, crontab'ın betiklerdeki kitaplıkların nerede olduğunu, örneğin Terminus'u bilmesini sağlamaktır.

Bu, sunucu crontab dosyamıza eklediğimiz satırın bir örneğidir.

 PATH="/path/to/backup/scripts/.local/bin:/usr/bin:/bin:/usr/local/bin" #Pantheon backups 0 11 * * * cd /path/to/backup/scripts/; bash pantheon-backups.sh; bash pantheon-backups-check.sh; php slack-notification.php >/dev/null 2>&1

İşlem tamamen otomatik olduğundan artık tüm yedeklemeleri eskisi gibi manuel olarak yapmamıza gerek yok. Ayrıca, günlük iş akışımız için biraz zaman kazanıyoruz.