Apa pendekatan pengembang yang baik untuk pengembang tunggal yang menulis aplikasi web python?

8

Saya menduga pertanyaan ini akan tampak sangat sepele bagi beberapa pembaca, tetapi sebagai seseorang yang merupakan pengembang tetapi dengan sedikit pengalaman dalam menyebarkan aplikasi dalam hal lain selain manual, klik dan semacam harapan, saya harap Anda akan mengerti bahwa itu adalah cukup menakutkan untuk melihat berbagai pendekatan dan alat yang ada, sehingga saya bisa melakukan sedikit saran untuk membuat saya mulai ke arah yang benar.

Saya seorang pengembang, sekarang hanya di waktu luang saya, yang terbatas. Hingga saat ini saya telah bekerja dengan Java, membangun webapps, dan cukup senang menyebarkan file perang ke lingkungan Tomcat yang membuat semuanya terbungkus dengan baik.

Saya sekarang bekerja di Python dan Django, tetapi ketika saya semakin dekat ke titik di mana saya perlu menggunakan, saya ingin mengatur alur kerja devops yang solid untuk mengotomatisasi sebanyak yang saya bisa dan memastikan saya dapat menggunakan dengan andal, tetapi mengingat bahwa saya use case relatif sederhana, saya ingin menghindari mempelajari toolset besar yang terlalu banyak direkayasa untuk kebutuhan saya dan yang membutuhkan investasi waktu yang besar saya lebih suka menggunakan pengkodean aplikasi saya.

Jadi saya mencari jalan tengah yang memungkinkan saya untuk menyebarkan dan mengelola aplikasi secara andal tanpa menginvestasikan banyak waktu untuk menyiapkan dan mempelajari ekosistem devops besar.

Lebih detail ...

Konteks

  1. Saya mengembangkan di Mac, menggunakan PyCharm untuk membangun Django 2, Python 3.
  2. Saya menggunakan git (tetapi tidak pada github) untuk mengelola versi perangkat lunak.
  3. Saya merasa nyaman dengan bahasa lain dan bahasa scripting dan telah menulis beberapa skrip bash (mungkin cukup amatir), meskipun saya tidak menikmati bash. Saya juga mencoba-coba Perl, yang saya sadari bukan bahasa untuk berkecimpung (yaitu Anda harus menghabiskan waktu mempelajarinya dengan benar)
  4. Saya bermaksud untuk menggunakan lingkungan VPS, mungkin DigitalOcean.
  5. Aplikasi saya tidak memiliki misi kritis tetapi penting bahwa saya tahu jika situs turun, dan perlu memiliki cara memulihkan andal jika itu, apakah ini me-restart aplikasi, me-restart server, atau pindah ke server lain ( atau yang lain).

Persyaratan Khusus

  1. Kemampuan untuk mengatur lingkungan baru untuk menerima aplikasi.

    Sampai sekarang ketika saya sedang belajar, ini sudah manual, dan setiap kali saya melakukannya saya sudah mulai dari awal dengan Droplet baru. Saya ingin ini lebih sederhana (otomatis) sehingga jika saya harus mengatur lingkungan baru dalam keadaan darurat saya dapat melakukannya dengan andal.

  2. Kemampuan untuk menyebarkan aplikasi ke lingkungan pementasan yang identik dengan live mungkin, idealnya sebagai proses otomatis yang dipicu oleh dorongan git menggunakan pendekatan integrasi berkelanjutan (yang belum pernah saya lakukan sebelumnya).

  3. Kemampuan untuk "menekan tombol" ketika saya senang dengan aplikasi di lingkungan pementasan untuk mendorong ke lingkungan hidup idealnya secara otomatis.

  4. Cara untuk memantau situs (hanya polling ke halaman akan dilakukan)

  5. Cara untuk mengganti situs langsung ke server lain jika saya perlu memulihkan dari kegagalan aplikasi atau server di situs langsung. Saya pikir mungkin pendekatan Biru-Hijau akan bekerja untuk saya?

Apa yang sudah saya coba atau pertimbangkan?

  • Pengaturan manual lingkungan langsung dengan aplikasi Django, lalu secara manual menyalin basis kode baru ketika ada perubahan. Ini terasa rentan terhadap kesalahan manusia dan saya takut membuat kesalahan dalam penyebaran yang menyebabkan kegagalan yang tidak dapat dipulihkan.

  • Buruh pelabuhan. Saya akui ketika saya mengetahui tentang Docker, rasanya seperti mimpi yang menjadi kenyataan, tetapi setelah sedikit bereksperimen dan meneliti, saya merasa takut dengan seberapa banyak yang perlu saya pelajari dan ketahui untuk bangkit dan menjalankannya serta mengelolanya. Mungkin ini layak dilakukan karena begitu berhasil, risikonya sangat rendah tetapi saat ini rasanya seperti investasi waktu saya yang lebih besar daripada yang saya harapkan.

  • Skrip Bash. Gunakan mereka untuk mengatur lingkungan asli dan untuk tugas-tugas tertentu seperti memperbarui aplikasi. Kekhawatiran saya tentang ini adalah bahwa skrip akan menjadi kode yang perlu pengujian dan saya khawatir akan membutuhkan banyak waktu untuk membangun toolset yang andal dengan cara ini.

  • Saya telah melihat opsi Digital Ocean untuk alamat IP mengambang dan kemampuan untuk memiliki dua server untuk pendekatan "biru hijau" yang tampaknya cukup masuk akal. Jika saya menempuh rute ini, saya masih harus dapat mengotomatiskan penyebaran.

Jadi ... Saya mencari saran tentang pendekatan devops yang menemukan keseimbangan yang tepat antara meminimalkan risiko (misalnya risiko melanggar aplikasi langsung dengan pembaruan, atau risiko tidak dapat pulih dari kegagalan) dan meminimalkan waktu investasi yang perlu saya lakukan untuk mengatur lingkungan dan alur kerja.

Pertanda baik
sumber

Jawaban:

5

Saya tidak terbiasa dengan pengembangan Python atau DigitalOcean, jadi saya hanya akan menawarkan beberapa petunjuk:

  • Tujuannya adalah untuk mengotomatisasi. Segala sesuatu. Bagaimana Anda mencapainya benar-benar terserah Anda, dan membuat alat sendiri tidak terlalu jauh, banyak yang melakukannya dengan cara itu. Satu buah beton dan cukup rendah (ish) menggantung adalah untuk mendapatkan hook git pasca-terima yang menyebarkan dan memulai kembali lingkungan pengujian Anda. Jika Anda memilikinya, sisanya harus sederhana.
  • "Kekhawatiran saya tentang ini adalah bahwa skrip akan menjadi kode yang perlu diuji" - kekhawatiran itu tidak berdasar. Anda sedang menguji skrip setiap kali Anda menyebarkan ke lingkungan pengujian Anda, setelah semua. Apalagi ditambah dengan pendekatan biru-hijau itu akan baik-baik saja untuk memiliki skrip bash.
  • "Aku tidak menikmati pesta." - lalu temukan bahasa skrip lain yang Anda sukai. Mungkin coba Ruby? Perpustakaan bahasa dan inti sangat bersih dan didokumentasikan dengan baik, dan menurut saya, agak mudah dipelajari. Atau, hanya untuk bersenang-senang, Go (lang), yang tampaknya cocok untuk tugas-tugas tooling. Dan akhirnya, karena Anda sepertinya menyukai Python, Anda tentu dapat melakukan tugas instalasi dengan itu juga. Dari ini, Go memiliki manfaat bahwa ia menciptakan binari mandiri dan tidak perlu menginstal lingkungan yang kompleks terlebih dahulu, sehingga bootstrap mungkin lebih mudah.
  • "lingkungan pementasan yang identik dengan live mungkin" - jika Anda memiliki skrip yang memutar lingkungan dari awal, yaitu dari gambar dasar yang kurang lebih kosong, maka lingkungan Anda akan sama, simpan untuk delta yang dikodekan dalam naskahmu. Itulah inti dari semua ini.
  • "Cara untuk mengubah situs langsung ke server lain" - satu-satunya hal untuk direnungkan adalah apa yang terjadi dengan data Anda yang terus-menerus. Yaitu, Anda ingin membuatnya sehingga Anda dapat menautkan aplikasi Anda dengan volume / toko persisten yang berbeda dengan cepat, untuk dapat beralih bolak-balik.
  • "Docker - gentar" - sejujurnya, seharusnya tidak seburuk itu. Jika Anda tahu cara membangun lingkungan dari awal dengan alat-alat baris perintah (tidak ada alat GUI), maka menempatkannya di Dockerfile seharusnya lebih mudah. Detail yang mengkhawatirkan muncul ketika saatnya untuk menyesuaikan (yaitu, mengurangi ukuran gambar), tetapi selain itu tidak boleh terlalu buruk. Pertama mendapatkannya bekerja entah bagaimana , kemudian mencari tahu bagaimana membuatnya indah. Hal yang baik adalah bahwa pengetahuan yang Anda peroleh akan ditransfer ke banyak lingkungan lain.

Semoga berhasil!

AnoE
sumber
3

Terima kasih atas pertanyaannya. Tidak ada yang benar-benar sepele saat pertama kali Anda melakukannya dan kami semua baru sekali pada sesuatu.

Rekomendasi pertama saya adalah mengunjungi kembali buruh pelabuhan. Cobalah beberapa panduan dan tutorial berbeda. Sangat sederhana. Anda memiliki file buruh pelabuhan yang "dibangun", secara harfiah hanya perintah yang ingin Anda jalankan di "wadah" atau "gambar". Anda mendorong gambar itu ke registri yang bisa publik atau pribadi. Anda kemudian menjalankan gambar itu di mesin host. Docker sangat penting dengan node.js dan python di mana Anda memiliki banyak dependensi dan terkadang sangat sulit untuk mengelolanya. Jika Anda menggunakan pip, dan memang seharusnya begitu, Anda dapat membuat requirements.txtfile untuk diumpankan ke wadah buruh pelabuhan.

Sekarang Anda bilang Anda menggunakan git, jadi saya akan menggunakan kait git lokal. Anda dapat menggunakan ini untuk membangun wadah buruh pelabuhan, menjalankan tes otomatis dan kemudian menggunakan wadah Anda. Anda dapat melihat banyak panduan dan tutorial berbeda tentang hal ini.

Untuk mengelola infrastruktur Anda, saya ingin Anda menggunakan Terraform. Terraform sangat bagus karena Anda dapat memutar lingkungan sesuai permintaan dan menghapusnya saat selesai. Rekomendasi saya adalah memulai dengan sederhana dan setelah Anda menguasai buruh pelabuhan dan terraform, Anda dapat mencoba penyebaran biru / hijau.

Sekarang jika Anda menggunakan Gitlab atau bersedia untuk beralih, itu juga menawarkan layanan ci / cd gratis. Ini termasuk banyak fitur keren dan sangat mudah digunakan. Saya menggunakannya secara pribadi untuk semua aplikasi saya. Anda dapat sepenuhnya melewatkan kait git lokal dan menguji dalam pipa gitlab atau menyimpannya untuk menguji setiap komit secara lokal dan menggunakan gitlab untuk membangun dan menyebarkan.

Saya harap ini agak membantu.

Retribusi
sumber
1
Dengan Docker apa yang saya anggap sedikit menakutkan adalah prinsip memiliki komponen dalam wadah yang berbeda. Jadi satu untuk aplikasi, satu untuk Gunicorn, satu untuk Nginx dll. Anda kemudian harus memasukkan konfigurasi tambahan untuk membuat mereka berbicara satu sama lain. Tampaknya untuk mengalahkan objek memiliki wadah enkapsulasi tunggal yang dapat ditransfer ke lingkungan apa pun. Namun karena balasan ini dan @ Anoe merekomendasikan untuk memberikan tampilan lain, saya akan melakukannya.
Auspice
1
@Appice Itu lebih dari pendekatan "layanan mikro". Meskipun ini adalah praktik terbaik untuk wadah buruh pelabuhan untuk hanya memiliki satu proses, sering kali bukan itu yang saya lihat. Periksa "Cara Docker?" di sini github.com/just-containers/s6-overlay . Saya pribadi akan memunculkan infra saya menggunakan Ansible. Saya akan menggunakan yang mungkin untuk memanggil Terraform untuk membuatnya. Kemudian saya akan menggunakan yang mungkin untuk memperbarui server saya, menginstal buruh pelabuhan, menginstal nginx dan membuatnya memulai aplikasi buruh pelabuhan saya sebagai layanan. Saya mungkin akan mengkonfigurasi nginx ke proxy ke wadah di mana aplikasi dan gunicorn berada.
Levi
0

Jawaban yang diposting sangat membantu dalam memungkinkan saya untuk memikirkan kembali masalah saya dan berbagai pendekatan. Saya belum mengimplementasikan solusi tetapi saya telah memutuskan pendekatan jadi saya mendokumentasikannya dan memilihnya sebagai jawabannya. Singkatnya begini:

Pendekatan Pilihan Saya

  • Untuk lingkungan hidup saya akan menggunakan dua Mesin Virtual (mungkin menggunakan tetesan DigitalOcean) yang menjalankan Ubuntu dan dikonfigurasi persis sama.
  • Saya akan menggunakan pendekatan Biru-Hijau menggunakan fasilitas IP Terapung dalam DO untuk mempertahankan dua server saya yang identik sebagai Live dan Pra-Prod / Cadangan.
  • Saya akan membuat VM (mungkin menggunakan VirtualBox) dalam pengembangan saya diatur untuk digunakan sebagai lingkungan pementasan. VM ini akan disetel sama persis dengan dua server langsung saya.
  • Saya akan menulis satu skrip umum dalam Python untuk mengatur lingkungan dari awal dan saya akan menggunakan ini untuk mengkonfigurasi lingkungan pementasan saya dan pasangan live / pre-prod saya.
  • Saya akan menggunakan kait git untuk memicu pembaruan ke lingkungan (mungkin dipicu secara manual).

Pertimbangan Yang Mengerjakan Pendekatan Ini

  • Docker: Saya telah memutuskan untuk tidak melakukannya. Meskipun saya menanggapi dengan serius tanggapan (terima kasih @Levi dan @Dan) yang mengatakan saya harus mengunjungi kembali dan seharusnya tidak seburuk itu, saya telah memiliki terlalu banyak pengalaman di masa lalu dalam memulai sesuatu yang baru dan menyadari bahwa saya telah jatuh menyusuri lubang kelinci yang memakan waktu dan membutuhkan waktu untuk bisa berjalan. Saya pikir itu akan berbeda jika saya bahkan bekerja dengan satu orang lain tetapi sebagai seseorang yang bekerja sepenuhnya sendirian setiap menit sangat berharga.

  • Mesin Virtual: Saya belum mempertimbangkan hal ini sampai saya mulai bekerja dengan beberapa tutorial Docker yang menggunakan VM untuk mendemonstrasikan fungsi Swarm. Gagasan untuk dapat menciptakan lingkungan baru yang saya kendalikan sepenuhnya sangat menarik.

  • Scripting: Prompted by @ AnoE's reply bermanfaat Saya telah melakukan penggalian sedikit lebih dan sepertinya Python diakui sebagai opsi yang layak untuk scripting dan karena itulah yang saya tulis aplikasi saya di dalamnya sepertinya harus ada sinergi (Jika saya perlu untuk mempelajari sesuatu yang baru untuk skrip saya, itu akan menjadi pengetahuan yang dapat saya gunakan dalam menulis aplikasi saya)

Saya akan memperbarui setelah saya membuat beberapa kemajuan dengan ini dan jika itu salah besar saya akan mengakui saya mungkin membuat pilihan yang salah!).

Pembaruan pada 20 Oktober 2018.

Saya mulai menulis skrip Python tetapi ini sering melibatkan memohon perintah bash dari Python dan kemudian mendapatkan respons kembali dan saya menemukan ini ditambahkan ke waktu pengembangan cukup banyak. Setelah beberapa minggu mengalami kemajuan yang lambat, saya mencari di tempat lain. Saya akui saya mungkin salah mendekati, tetapi saya membutuhkan sesuatu yang akan lebih cepat.

Saya akhirnya memilih Vagrant / Ansible / VirtualBox dan setelah berbulan-bulan lebih daripada saya ingin mengakui mendapat sesuatu yang bekerja dengan baik, tetapi setelah banyak pekerjaan belajar beberapa keterampilan baru (Vagrant dan Ansible benar-benar baru bagi saya). Saya kemudian menerapkan skrip Ansible untuk menyediakan DigitalOcean Droplet dan menemukan ini berfungsi dengan sangat baik. Saya telah menjadi penggemar Ansible tetapi meskipun saya setuju (dengan pengulas) bahwa itu relatif mudah digunakan, itu masih merupakan paradigma baru dan kurva pembelajaran yang cukup curam.

Pada saat penulisan, saya telah menyediakan dua Tetesan terpisah pada DigitalOcean dalam konfigurasi biru-hijau, menggunakan DO Floating IP address untuk beralih di antara keduanya, dan pada setiap aplikasi ada dalam copy git yang berfungsi jadi saya hanya perlu menyegarkan kembali Master untuk memperbarui lingkungan.

Saya mengalami masalah dalam membuat IP Terapung berfungsi seperti yang saya harapkan, tetapi saya berharap untuk menyelesaikannya segera dan kemudian saya akan memiliki lingkungan DevOps yang berfungsi.

Keuntungan besar dari pendekatan ini adalah bahwa cara Ansible bekerja, setelah Anda memiliki sesuatu yang bekerja itu relatif mudah untuk membuatnya bekerja di lingkungan yang berbeda dan ini mungkin tidak begitu mudah dicapai dengan skrip python (atau setidaknya Anda harus membangun ini adalah pekerjaan tambahan).

Saya pikir pelajaran besarnya adalah bahwa hal-hal memakan waktu lebih lama daripada yang saya harapkan dan mempelajari teknologi baru selalu membawa hal-hal yang tidak diketahui. Ini seharusnya tidak menjadi kejutan bagi saya - tetapi selalu dan bekerja sebagai pengembang tunggal, ini sering terjadi pada saya.

Pertanda baik
sumber