Mencadangkan situs Anda menggunakan git dan Makefile

Menerjemahkan suatu situs ke dalam satu set halaman web statis memungkinkan Anda untuk mengurangi beban di server atau bahkan memanfaatkan penyimpanan gratis, serta meningkatkan keandalan, kecepatan, dan keamanan situs. Pada artikel ini, saya akan berbicara tentang bagaimana melakukan ini dengan alat git dan Makefile yang sudah dikenal. Kelebihan dari pendekatan ini adalah kemampuan untuk mengontrol versi konten halaman web.


Artikel ini menjelaskan cara membuat versi statis halaman web untuk penerbitan server dan cara menempatkannya di repositori untuk kontrol versi dan cadangan. Pada saat yang sama, file statis dan media dapat disimpan secara terpisah dan diarsipkan dengan cara lain (statis biasanya ditempatkan di repositori untuk kode program situs). Metode ini juga berfungsi untuk halaman dengan nama Unicode (misalnya, untuk domain Cyrillic). Pada akhirnya adalah Makefile yang berfungsi.


Penulis menggunakan tumpukan django / uwsgi / nginx, server khusus virtual yang menjalankan GNU / Linux, tetapi konten artikel hampir tidak tergantung pada teknologi tertentu.


Memuat halaman


Kami akan menyimpan halaman situs menggunakan program standar wget . Kami akan menyimpan setiap situs dalam direktori terpisah (yang mungkin tidak terkait dengan nama domain situs).


Dalam setiap direktori, halaman akan disimpan secara rekursif menggunakan kunci wget -r (diasumsikan bahwa semua halaman dapat diakses melalui tautan dari halaman utama). Secara default, penyalinan rekursif naik ke level 5, tetapi ini dapat diubah menggunakan -l switch.


Jika kita menyimpan file media dan statis secara terpisah dari halaman teks, maka direktori terkait diabaikan dengan saklar -X .


Perintah lengkapnya terlihat seperti ini:


mkdir primer cd primer wget -r -nH -X ,static --restrict-file-names=nocontrol . 

-nH berarti direktori --no-host- . Secara default, wget -r example.com akan meletakkan semuanya di direktori example.com/ , dan opsi ini membatalkan pembuatan direktori dengan nama host.


Opsi --restrict-file-names menunjukkan pelarian karakter dalam URL saat membuat file lokal. Nilai nocontrol berarti menonaktifkan pelarian dan sangat penting untuk menyimpan halaman dengan tautan Cyrillic. Tanpa itu, halaman disimpan dalam file dengan nama yang sedikit berubah, dan tidak sepenuhnya jelas bagaimana mengeluarkannya ke server. Sayangnya untuk pengguna Windows, --restrict-file-names = nocontrol tidak akan berfungsi untuk mereka, ini adalah masalah yang diketahui.


Tambahkan ke git


Repositori baru dibuat menggunakan perintah git init . Secara default, ini dibuat di dalam direktori saat ini di folder .git, namun kami ingin server hanya memiliki akses ke file yang sesuai dengan nama-nama halaman situs yang terbuka. Oleh karena itu, perintah lengkap yang membuat repositori bersih (kosong) di folder ../.git-primer terlihat seperti ini:


 git init --bare ../.git-primer 

Untuk lebih lanjut menggunakan repositori non-standar ini, Anda harus memberikan opsi git-dir dan work-tree git :


 git --git-dir=../.git-primer --work-tree=. add . 

Menulis Makefile


Mari kita mulai dengan pengumuman proyek kami:


 SITES := example primer all : $(SITES) .PHONY : $(SITES) 

Variabel SITUS berisi nama-nama proyek kami. Tujuan default adalah tujuan pertama, semua , yaitu, untuk menyelesaikan semua langkah, cukup ketik satu perintah make . Semua sasaran dalam SITUS fiktif ( PHONY ): resep untuk masing-masing akan dieksekusi terlepas dari keberadaan direktori dan waktu itu diubah.
Pendahuluan dasar untuk membuat dapat dibaca, misalnya, di sini , dan panduan dasarnya adalah info make ( asli , terjemahan ).


Aturan untuk masing-masing proyek terlihat seperti ini:


 $(SITES) : if [[ -d .git-$@ ]]; \ then \ $(get-data); \ $(mgit) add . && \ if [[ -n "`$(mgit) status --porcelain`" ]]; then \ $(mgit) commit -m "Update $@."; \ fi \ else \ $(init-git); \ fi 

Aturan ini pada dasarnya adalah perintah shell tunggal.
$ @ Adalah variabel otomatis yang berisi nama target saat ini (misalnya, primer).
Pertama kita periksa apakah direktori .git-primer ada. Jika demikian, buka direktori proyek, unduh halaman, tambahkan ke git.
Jika konten halaman tidak berubah, maka git tidak akan menambahkan apa pun, tetapi dalam kasus ini, komit akan menyebabkan kesalahan dan eksekusi Makefile berhenti. Karena itu, pertama-tama kita memanggil status git dengan opsi - porselen , yang dimaksudkan untuk digunakan dalam skrip. Jika panjang garis keluaran status git --porcelain tidak nol, maka kita dapat melakukan commit ( dari sini ).


get-data, mgit, dan init-git adalah resep kalengan di Makefile. Misalnya, mgit adalah panggilan git yang menentukan direktori dengan repositori dan file direktori kerja:


 define mgit = git --git-dir=../.git-$@ --work-tree=. endef 

Resep kalengan dibuat ketika satu urutan perintah dapat digunakan dalam beberapa resep. Mereka dapat terdiri dari beberapa baris, yang masing-masing secara otomatis disorot dengan tab di resep (lebih tepatnya, dengan simbol .RIPPREFREXX ). Dalam contoh kita, lekukan dibuat hanya untuk keterbacaan Makefile.
Selama pelaksanaan resep, setiap baris urutan yang disiapkan ditafsirkan sebagai baris terpisah dari resep, yaitu, khususnya, mereka dapat menggunakan variabel otomatis untuk tujuan ini.


Makefile lengkapnya terlihat seperti ini:


 SITES := primer example SERVERHOST := example # .  punicode SERVERHOSTNAME := xn--e1afmkfd.xn--p1ai SERVERPATH := ~/archive all : $(SITES) .PHONY : $(SITES) # target-specific variables primer : DOMAIN := . primer : EXCLUDEDIRS := ,static example : DOMAIN := example.com ifeq ($(SERVERHOSTNAME),$(shell hostname)) # Server define mgit = git --git-dir=../.git-$@ --work-tree=. endef define init-git = mkdir -p $@ && \ $(get-data) && \ git init --bare ../.git-$@ && \ $(mgit) add . && \ $(mgit) commit -m "Initial commit of $@." endef define get-data = cd $@ && \ wget -r -nH -X $(EXCLUDEDIRS) --restrict-file-names=nocontrol $(DOMAIN) endef else # Workstation define init-git = git clone $(SERVERHOST):$(SERVERPATH)/.git-$@ $@ endef endif $(SITES) : ifeq ($(SERVERHOSTNAME),$(shell hostname)) # Server if [[ -d .git-$@ ]]; \ then \ $(get-data); \ $(mgit) add . && \ if [[ -n "`$(mgit) status --porcelain`" ]]; then \ $(mgit) commit -m "Update $@."; \ fi \ else \ $(init-git); \ fi else # Workstation if [[ -d $@/.git ]]; \ then \ cd $@ && git pull; \ else \ $(init-git); \ fi endif 

Di paragraf keempat ada variabel target-spesifik : untuk setiap sasaran, Anda dapat menetapkan nilai Anda sendiri untuk variabel ini. Nilai-nilai ini juga ditransmisikan tergantung pada prasyarat masing - masing tujuan dan resep yang disiapkan yang digunakan, yaitu, kita dapat yakin bahwa resep untuk setiap situs akan dieksekusi dengan nama situs dan direktori yang benar.
Untuk setiap proyek, kami dapat mentransfer direktori yang tidak diarsipkan kami melalui variabel EXCLUDEDIRS atau membiarkannya kosong. Demikian pula, Anda dapat mengubah nama server untuk pengarsipan dari komputer yang berfungsi ( SERVERHOST ) dan jalur di server ke direktori dengan arsip situs ( SERVERPATH ). Untuk mempermudah, dalam contoh ini, semua situs berada di server yang sama dan diarsipkan di direktori yang sama.
Karena setiap baris resep (termasuk yang disiapkan) dieksekusi dalam shell terpisah, sehingga transisi ke direktori tetap valid untuk perintah berikut, kami menggunakan operator "dan" && dan keluar dari baris \.


Berikutnya adalah konstruksi Makefile bersyarat : menggunakan perintah shell hostname , kami memeriksa apakah make berjalan di server atau di komputer lokal. Garis-garis yang tidak memenuhi cabang saat ini dari arahan bersyarat sepenuhnya diabaikan oleh Makefile.


Perbedaan antara repositori lokal dan server

Komputer lokal terutama digunakan untuk menyimpan data, jadi kami hanya menyalin data dari server ( git pull ) ke dalamnya, dan untuk kenyamanan pekerjaan lokal dengan git (melihat log atau versi file) kami menggunakan struktur repositori default (repositori yang biasa di folder .git )
Dalam kedua kasus, perintah make tunggal sudah cukup. Untuk menyalin otomatis, Anda dapat menggunakan penjadwal cron . Agar tidak memasukkan kata sandi untuk akses ke server setiap kali, kunci ssh dihasilkan.


Untuk kenyamanan bekerja di server, Anda dapat membuat alias git dari direktori situs saat ini dengan konfigurasi yang ditentukan:


 alias mgit="git --work-tree=. --git-dir=../.git-${PWD##*/}" 

Variabel $ {PWD ## * /} berisi nama direktori saat ini tanpa path ke sana dan merupakan bagian dari standar POSIX , yang dapat digunakan di semua shell yang berkemampuan POSIX.


Arahan bersyarat juga dapat digunakan dalam resep, satu-satunya batasan adalah bahwa awal dan akhir tidak dapat di file yang berbeda.


Server

Setelah menjalankan make, direktori arsip terlihat seperti ini:


 $ ls -a . .. .git-example .git-primer Makefile example primer $ ls -a primer . .. index.html - - $ # ,     .    ./-  ./- 

File konfigurasi nginx untuk example.rf mungkin terlihat seperti ini:


 server { server_name xn--e1afmkfd.xn--p1ai; charset utf-8; location = / { root /home/user/archive/primer; try_files /index.html =404; } location / { root /home/user/archive/primer; default_type "text/html"; try_files $uri =404; } location = /index.html { return 404; } } 

Lokasi pertama berhubungan dengan halaman utama situs, example.rf. Itu disimpan oleh wget sebagai file index.html. Jika tidak, kesalahan 404 dikeluarkan.


Untuk semua URI lain, file dalam direktori primer dengan nama URI diperiksa. Jika mereka tidak ditemukan, maka 404 dikembalikan.


Pada akhirnya, untuk menghindari duplikasi konten, kami secara eksplisit menolak akses ke tautan example.rf / index.html (404). Sedikit lebih detail tentang konfigurasi ini ditulis di sini .


Kesimpulan


Mencadangkan situs dapat dilakukan dengan menggunakan alat standar wget , git , make . Anda dapat menyalin semua halaman situs atau mengecualikan media dan sejumlah file lainnya seakurat memungkinkan. Demikian pula, dengan .gitignore , Anda dapat mengontrol halaman statis mana yang akan ditambahkan ke repositori untuk cadangan dan mana yang tidak. Makefile memungkinkan Anda mengelola berbagai konfigurasi secara fleksibel untuk berbagai proyek. Contoh Makefile lengkap untuk klien dan untuk server di atas hanya berisi sekitar 60 baris.


Diasumsikan bahwa perubahan dan penambahan konten situs terjadi melalui mekanisme standar, yaitu, CMS atau CMF diluncurkan untuk ini. Jika ini jarang terjadi, maka setelah bekerja mereka dapat dimatikan, membebaskan sumber daya sistem dan menampilkan halaman statis yang disimpan. Contoh otomatisasi yang lebih lengkap mungkin pantas mendapatkan artikel terpisah.


Metode yang diusulkan terutama cocok untuk proyek-proyek kecil yang jarang diperbarui, sehingga masalah kinerja dan keamanan sulit dipertimbangkan di sini. Karena kami menginstruksikan wget untuk tidak melarikan diri karakter dari URI, maka jika pengguna sewenang-wenang dapat menambahkan file ke situs, melarikan diri atau melarang penambahan mereka harus segera terjadi.


Menyimpan versi konten situs juga dapat dilakukan melalui database saat mengubah halamannya. Tetapi ini membutuhkan dukungan versi oleh model CMF, serta kontrol yang lebih besar atas dump basis data (salin sepenuhnya setelah setiap halaman diedit). Dalam metode yang diusulkan, jika terjadi perubahan kecil pada konten, hanya perubahan ini akan ditambahkan ke repositori, dan penggunaan salinan lengkap dari database tidak diperlukan. Selain itu, halaman statis yang dihasilkan dapat langsung digunakan oleh server atau dilihat di browser (mengubah desain atau kode situs lainnya juga akan disalin).


Program cadangan alternatif tercantum di sini . Untuk menyimpan dan menyinkronkan file media, Anda harus memperhatikan git-annex . Memisahkan repositori .git dari pohon kerja juga telah berhasil digunakan untuk mengelola file konfigurasi pengguna ( dotfiles ). Saat ini ada server yang secara langsung mendukung bekerja dengan repositori git.

Source: https://habr.com/ru/post/id425259/


All Articles