() translation by (you can also view the original English article)
Jadi Anda baru saja membangun aplikasi web yang mewah dan Anda berencana untuk memasangnya secara online. Ini bisa dilakukan dengan banyak cara. Dalam artikel ini saya ingin membahas satu pendekatan untuk menerapkan sistem backend Anda ke server produksi Anda. Kami akan melalui langkah-langkah berikut dengan contoh aplikasi Laravel, tetapi ini dapat diterapkan ke bahasa atau teknologi lain
Memperbarui
Artikel ini telah diperbarui ke Capistrano 3. Lebih lanjut tentang versi baru dapat ditemukan di situs web capistrano.
Masa lalu
Mungkin Anda telah menaruh beberapa situs web online di masa lalu. Mungkin Anda telah menggunakan klien FTP dan mengunggah bit dan byte dengan tangan. Atau mungkin Anda selalu masuk ke server Anda melalui ssh dan menarik perubahan secara manual.
Gagasan
Tujuan kami adalah untuk menyederhanakan proses ini semaksimal mungkin. Idenya adalah menggunakan repositori kode Anda sebagai sumber untuk setiap penyebaran. Alat penyebaran, dalam kapitrano kasus kami, akan secara otomatis masuk ke server Anda dan membangun sistem Anda langsung dari repositori Anda.
Pengerahan perangkat lunak adalah semua kegiatan yang membuat sistem perangkat lunak tersedia untuk digunakan. - Wikipedia
Apa yang Anda Butuhkan ...
... di Server Jarak Jauh Anda
Server jauh Anda perlu menyediakan akses ssh. Ini juga harus menginstal semua dependensi yang diperlukan untuk proyek Anda seperti GIT, PHP, MySQL, Komposer, ... Selain itu, Anda tidak memerlukan perangkat lunak tambahan pada server produksi Anda.
... di Mesin Lokal Anda
Untuk menginstal dan menggunakan capistrano, Anda memerlukan setidaknya Ruby 1.9 (jika Anda tidak menginstal Ruby, saya sarankan menginstalnya menggunakan rbenv). Untuk menginstal capistrano, Anda cukup menjalankan:
1 |
|
2 |
$ gem install capistrano |
Jadi mengapa capistrano, Anda mungkin bertanya. Seperti biasa, ada banyak cara untuk menyelesaikan tugas, tetapi dalam kasus saya, capistrano sepertinya selalu menjadi pendekatan yang paling mudah dan fleksibel. Anda dapat mengkonfigurasinya untuk semua kebutuhan Anda dan ada banyak plugin di luar sana yang menyederhanakan pekerjaan Anda lagi.
Capistrano adalah utilitas dan kerangka kerja untuk menjalankan perintah secara paralel pada beberapa mesin jarak jauh, melalui SSH. Ini menggunakan DSL sederhana (dipinjam sebagian dari Rake) yang memungkinkan Anda untuk menentukan tugas, yang dapat diterapkan pada mesin dalam peran tertentu. Ini juga mendukung koneksi tunneling melalui beberapa mesin gateway untuk memungkinkan operasi dilakukan di belakang VPN dan firewall.
Mempersiapkan
Sekarang kami memiliki semua yang kami butuhkan, jadi mari siapkan setelan penerapan kami. Tapi pertama-tama kita harus membuat folder di server jauh di mana semua file harus dikerahkan. Masuk ke server Anda dengan SSH dan buat folder. Tempat umum adalah / var / www /. Jadi mari kita lakukan ini:
1 |
|
2 |
$ sudo mkdir /var/www/my-app |
3 |
$ sudo chown -R username:group /var/www/my-app |
Itu dia. Tidak ada yang bisa dilakukan di server jauh, sehingga Anda dapat menutup koneksi ssh dan melanjutkan. Pergilah ke proyek Anda (atau folder lain, itu tidak masalah sekarang) dan jalankan:
1 |
|
2 |
$ cd my-project |
3 |
$ cap install |
Perintah ini akan membuat file-file dasar yang kita butuhkan. Setelah itu folder Anda akan terlihat seperti ini.
1 |
|
2 |
. |
3 |
├── Capfile |
4 |
├── config |
5 |
│ ├── deploy |
6 |
│ │ ├── production.rb |
7 |
│ │ └── staging.rb |
8 |
│ └── deploy.rb |
9 |
└── lib |
10 |
└── capistrano |
11 |
└── tasks |
Capfile seperti titik mount untuk capistrano tetapi untuk saat ini kita hanya perlu mengedit config / deploy.rb dan config / deploy / production.rb. File pertama bertanggung jawab untuk semua langkah membangun, file kedua mewakili "tahap". Anda dapat memiliki beberapa tahapan seperti produksi, pementasan, pengujian ... Di setiap file konfigurasi tahap, Anda dapat menentukan server Anda. Mari buka dua file tersebut di editor teks favorit Anda dan ganti konten dengan cuplikan berikut. Kami akan pergi melalui kode sesudahnya.
Kami akan mulai dengan konfigurasi / deploy / production.rb:
1 |
|
2 |
role :app, %w{username@123.456.789.123} # EDIT your ssh username and server ip address |
3 |
|
4 |
set :ssh_options, { |
5 |
auth_methods: %w(password), |
6 |
password: "" # EDIT your ssh password |
7 |
}
|
Selanjutnya kita akan mengubah konfigurasi / deploy.rb:
1 |
|
2 |
set :application, "Your app name" # EDIT your app name |
3 |
set :repo_url, "https://github.com/laravel/laravel.git" # EDIT your git repository |
4 |
set :deploy_to, "/var/www/my-app" # EDIT folder where files should be deployed to |
5 |
|
6 |
namespace :deploy do |
7 |
|
8 |
desc "Build" |
9 |
after :updated, :build do |
10 |
on roles(:app) do |
11 |
within release_path do |
12 |
execute :composer, "install --no-dev --quiet" # install dependencies |
13 |
execute :chmod, "u+x artisan" # make artisan executable |
14 |
end
|
15 |
end
|
16 |
end
|
17 |
|
18 |
desc "Restart" |
19 |
task :restart do |
20 |
on roles(:app) do |
21 |
within release_path do |
22 |
execute :chmod, "-R 777 app/storage/cache" |
23 |
execute :chmod, "-R 777 app/storage/logs" |
24 |
execute :chmod, "-R 777 app/storage/meta" |
25 |
execute :chmod, "-R 777 app/storage/sessions" |
26 |
execute :chmod, "-R 777 app/storage/views" |
27 |
end
|
28 |
end
|
29 |
end
|
30 |
|
31 |
end
|
Anda sekarang harus meletakkan data Anda di setiap baris dengan komentar #EDIT (alamat ip, git repo, ssh user, kata sandi, dll). The: deploy_to variable seharusnya adalah folder yang baru kita buat. Server web Anda (Apache, Nginx, ...) harus mengarah ke / var / www / my-app / current / public.
Di ruang nama: gunakan blokir file deploy.rb yang Anda tentukan apa yang sebenarnya harus terjadi untuk setiap penerapan. Jadi ada dua tugas. Dalam tugas membangun kami menginstal semua dependensi PHP Anda, sama seperti Anda terbiasa selama pengembangan. Setelah itu kita membuat file pengrajin dieksekusi untuk menggunakannya untuk migrasi. Dalam tugas restart kami perbaiki izin untuk folder penyimpanan.
Semua tugas tersebut dijalankan dalam urutan berikut. Anda dapat menghubungkan setiap tugas jika perlu tetapi untuk saat ini kami tetap dengan konfigurasi sederhana kami.
1 |
|
2 |
deploy:starting - start a deployment, make sure everything is ready |
3 |
deploy:started - started hook (for custom tasks) |
4 |
deploy:updating - update server(s) with a new release |
5 |
deploy:updated - updated hook |
6 |
deploy:publishing - publish the new release |
7 |
deploy:published - published hook |
8 |
deploy:finishing - finish the deployment, clean up everything |
9 |
deploy:finished - finished hook |
Setiap penyebaran disimpan di / var / www / my-app / releases /. Tugas built-in menyebar: penerbitan menciptakan tautan simbolis dari penyebaran baru-baru ini ke folder saat ini. Dengan cara ini Anda dapat menyimpan rilis yang lebih lama dan beralih versi tanpa offline untuk kedua. Ketika tugas ini berjalan, versi terbaru Anda sedang online.
Anda dapat dengan mudah menambahkan tugas Anda sendiri jika proses pembuatan Anda memerlukan beberapa langkah tambahan. Untuk informasi lebih rinci, saya sarankan Anda membaca dokumentasi resmi.
Setelah langkah konfigurasi dasar ini, kami siap untuk penerapan pertama kami.
Api!
Jadi itulah saat yang Anda tunggu. Bagian tersulit dilakukan. Untuk saat ini setiap kali Anda ingin mengirim pembaruan aplikasi, Anda hanya perlu menjalankan perintah magis berikut. Capistrano akan membaca file config / deploy.rb config / deploy / production.rb Anda dan menjalankan setiap tugas. Jika tugas gagal, penyebaran akan berhenti dan versi lama masih online.
1 |
|
2 |
$ cap production deploy
|
Anda akan melihat banyak output teks dan setelah sedikit waktu (tergantung pada server Anda) semuanya harus lengkap. Itu mudah, bukan?
Catatan: Untuk saat ini kami hanya menyiapkan tahap produksi kami, tetapi Anda dapat mengganti production dengan tahap lain, misalnya server pengujian Anda dan jalankan $ cap staging deploy.
Pemikiran Lebih Lanjut
Keamanan
Mungkin Anda mungkin sedikit khawatir jika Anda harus memasukkan kata sandi plaintext Anda di file konfigurasi. Saya hanya memilih cara itu untuk membuat demonstrasi sesederhana mungkin, tetapi di dunia nyata Anda mungkin ingin menggunakan kunci SSH. Anda dapat mengimpor yang seperti ini:
1 |
|
2 |
set :ssh_options, { |
3 |
keys: %w("/path/to/your/key.pem"), # EDIT your ssh key |
4 |
auth_methods: %w(publickey) |
5 |
}
|
Database
Untuk saat ini kami baru saja fokus pada penggelaran file yang sebenarnya ke rumah baru mereka tetapi dalam banyak skenario Anda mungkin juga melakukan sesuatu dengan database Anda. Laravel memiliki alat yang sempurna untuk itu: migrations. Anda bisa menambahkan langkah baru di mana Anda menjalankan migrations ini. Setelah itu tugas membangun kami mungkin terlihat seperti ini:
1 |
|
2 |
desc "Build" |
3 |
after :updated, :build do |
4 |
on roles(:app) do |
5 |
within release_path do |
6 |
execute :composer, "install --no-dev --quiet" # install dependencies |
7 |
execute :chmod, "u+x artisan" # make artisan executable |
8 |
execute :php, "artisan migrate" # run migrations |
9 |
end
|
10 |
end
|
11 |
end
|
Anda juga harus menambahkan tugas ini di blok transaction
dari tugas update
. Sekarang setiap kali Anda menyebarkan, database akan diperbarui ke migrasi terbaru Anda.
Rollback
Terkadang Anda menerapkan versi aplikasi yang tidak berfungsi dan Anda perlu membatalkan perubahan ini. Capistrano memiliki fitur built-in untuk itu yang disebut "rollback". jalankan saja:
1 |
|
2 |
$ cap production deploy:rollback
|
Conclusion
Anda baru saja belajar cara yang sangat sederhana untuk menerapkan aplikasi Anda ke server (s) produksi Anda dengan Capistrano. Setelah pekerjaan konfigurasi selesai, hanya dibutuhkan satu perintah untuk menerapkan versi terbaru Anda dalam hitungan detik. Tetapi seperti yang disebutkan sebelumnya, ini bukan satu-satunya cara untuk melakukan ini.
Anda juga harus memeriksa grunt pelari tugas yang cocok untuk membangun dan menyebarkan aplikasi JavaScript. Pendekatan berbeda yang lengkap membutuhkan docker pelabuhan yang bertindak seperti VM ringan. Idenya di sini adalah untuk menyebarkan seluruh lingkungan Anda sebagai mesin virtual. Periksa mereka!