Cách tiếp cận tín đồ tốt cho một nhà phát triển viết ứng dụng web python là gì?


8

Tôi đoán câu hỏi này có vẻ vô cùng tầm thường đối với một số độc giả, nhưng với tư cách là một nhà phát triển nhưng có ít kinh nghiệm triển khai ứng dụng trong bất kỳ điều gì khác ngoài hướng dẫn sử dụng, hãy nhấn và hy vọng một cách nào đó, tôi hy vọng bạn sẽ hiểu rằng đó là khá khó khăn khi thấy số lượng các phương pháp và công cụ khác nhau đang có, vì vậy tôi có thể làm với một chút lời khuyên để giúp tôi bắt đầu đi đúng hướng.

Tôi là một nhà phát triển, bây giờ chỉ trong thời gian rảnh rỗi, còn hạn chế. Cho đến bây giờ tôi đã làm việc với Java, xây dựng các ứng dụng web và rất hài lòng với việc triển khai tệp chiến tranh vào môi trường Tomcat, giúp mọi thứ được gói gọn.

Tôi hiện đang làm việc trong Python và Django, nhưng khi tôi đến gần điểm cần triển khai hơn, tôi muốn thiết lập một quy trình làm việc chuyên nghiệp để tự động hóa hết mức có thể và đảm bảo tôi có thể triển khai một cách đáng tin cậy, nhưng cho rằng trường hợp sử dụng tương đối đơn giản, tôi muốn tránh học một bộ công cụ to béo, được thiết kế quá mức cho nhu cầu của tôi và đòi hỏi một khoản đầu tư lớn về thời gian tôi muốn sử dụng mã hóa ứng dụng của mình.

Vì vậy, tôi đang tìm kiếm một nền tảng trung gian cho phép tôi triển khai và quản lý (các) ứng dụng của mình một cách đáng tin cậy mà không cần đầu tư một lượng lớn thời gian để thiết lập và tìm hiểu một hệ sinh thái sùng đạo lớn.

Một số chi tiết khác ...

Bối cảnh

  1. Tôi phát triển trên máy Mac, sử dụng PyCharm để xây dựng Django 2, Python 3.
  2. Tôi sử dụng git (nhưng không phải trên github) để quản lý phiên bản phần mềm.
  3. Tôi cảm thấy thoải mái với các ngôn ngữ và ngôn ngữ kịch bản khác và đã viết một vài tập lệnh bash (có lẽ khá nghiệp dư), mặc dù tôi không thích bash. Tôi cũng đã từng học hỏi về Perl, điều mà tôi nhận ra không thực sự là một ngôn ngữ để học hỏi (nghĩa là bạn cần dành thời gian để học nó đúng cách)
  4. Tôi dự định triển khai trên môi trường VPS, có thể là DigitalOcean.
  5. Ứng dụng của tôi không phải là nhiệm vụ quan trọng nhưng điều quan trọng là tôi biết nếu trang web bị sập và cần có cách phục hồi đáng tin cậy nếu có, liệu điều này có khởi động lại ứng dụng, khởi động lại máy chủ hoặc chuyển sang máy chủ khác không hoặc khác).

Yêu cầu cụ thể

  1. Khả năng thiết lập một môi trường mới để nhận ứng dụng.

    Cho đến bây giờ khi tôi đang học, điều này là thủ công và mỗi khi tôi thực hiện nó, tôi đã bắt đầu lại từ đầu với một Giọt mới. Tôi muốn điều này đơn giản hơn nhiều (tự động) để nếu tôi phải thiết lập một môi trường mới trong trường hợp khẩn cấp, tôi có thể làm điều đó một cách đáng tin cậy.

  2. Khả năng triển khai ứng dụng đến môi trường dàn dựng giống hệt với môi trường sống nhất có thể, lý tưởng nhất là quy trình tự động được kích hoạt bằng cách đẩy git bằng cách sử dụng phương pháp tích hợp liên tục (điều mà tôi chưa từng làm trước đây).

  3. Khả năng "nhấn nút" khi tôi hài lòng với ứng dụng trong môi trường dàn dựng để tự động chuyển sang môi trường sống một cách lý tưởng.

  4. Cách theo dõi trang web (chỉ cần một cuộc thăm dò ý kiến ​​cho một trang)

  5. Cách để chuyển trang web trực tiếp sang máy chủ khác nếu tôi cần khôi phục từ lỗi ứng dụng hoặc máy chủ trên trang web trực tiếp. Tôi nghĩ có lẽ một cách tiếp cận Blue-Green sẽ làm việc cho tôi?

Những gì tôi đã cố gắng hoặc xem xét?

  • Hướng dẫn thiết lập môi trường trực tiếp với ứng dụng Django, sau đó sao chép thủ công cơ sở mã mới vào đó khi có thay đổi. Điều này cảm thấy dễ bị lỗi của con người và tôi sợ phạm sai lầm trong việc triển khai gây ra một thất bại không thể phục hồi.

  • Docker. Tôi thừa nhận khi tôi phát hiện ra Docker, nó dường như là một giấc mơ trở thành sự thật nhưng sau một chút thử nghiệm và nghiên cứu, tôi cảm thấy thất vọng bởi mình cần phải học và biết bao nhiêu để có được điều này và chạy và quản lý nó. Có thể điều này đáng giá bởi vì một khi nó hoạt động thì rủi ro rất thấp nhưng hiện tại nó cảm thấy như một khoản đầu tư lớn hơn trong thời gian của tôi hơn tôi hy vọng.

  • Kịch bản Bash. Sử dụng chúng để thiết lập môi trường ban đầu và cho các tác vụ cụ thể như cập nhật ứng dụng. Tôi lo lắng về điều này là các tập lệnh sẽ là mã cần thử nghiệm và tôi sợ rằng sẽ mất rất nhiều thời gian để xây dựng một bộ công cụ đáng tin cậy theo cách này.

  • Tôi đã xem xét các tùy chọn của Digital Ocean cho các địa chỉ IP nổi và khả năng có hai máy chủ cho cách tiếp cận "xanh lục" có vẻ khá hợp lý. Nếu tôi đi theo con đường này, tôi vẫn cần có thể tự động hóa việc triển khai.

Vì vậy, ... tôi đang tìm kiếm lời khuyên về cách tiếp cận của các tín đồ tìm thấy sự cân bằng phù hợp giữa việc giảm thiểu rủi ro (ví dụ: rủi ro phá vỡ ứng dụng trực tiếp bằng bản cập nhật hoặc rủi ro không thể phục hồi sau thất bại) và giảm thiểu thời gian Tôi cần đầu tư để thiết lập môi trường và quy trình làm việc.

Câu trả lời:


5

Tôi không quen với việc phát triển Python cũng như DigitalOcean, vì vậy tôi sẽ chỉ cung cấp một vài gợi ý:

  • Mục tiêu là tự động hóa. Mọi điều. Làm thế nào bạn đạt được điều đó thực sự là tùy thuộc vào bạn và việc tạo ra công cụ của riêng bạn không phải là quá xa vời, nhiều người làm theo cách đó. Một quả treo cụ thể và khá thấp (ish) là để có được một cái móc sau nhận git đang chạy, triển khai và khởi động lại môi trường thử nghiệm của bạn. Nếu bạn có điều đó, phần còn lại nên đơn giản.
  • "Lo lắng của tôi về điều này là các tập lệnh sẽ là mã cần thử nghiệm" - lo lắng đó là không có cơ sở. Rốt cuộc, bạn đang kiểm tra các tập lệnh đó mỗi khi bạn triển khai vào môi trường thử nghiệm của mình. Đặc biệt kết hợp với cách tiếp cận xanh lam, sẽ rất tốt nếu có các tập lệnh bash.
  • "Tôi không thích bash." - sau đó tìm một ngôn ngữ kịch bản khác mà bạn thích. Có thể thử Ruby? Các thư viện ngôn ngữ và cốt lõi rất sạch sẽ và được ghi chép tốt, và tôi nói, khá dễ học. Hoặc, chỉ để giải trí, Go (lang), dường như rất phù hợp để sùng bái các công cụ. Và cuối cùng, vì bạn có vẻ thích Python, bạn chắc chắn cũng có thể thực hiện các tác vụ cài đặt với điều đó. Từ những điều này, Go có lợi ích là nó tạo ra các nhị phân độc lập và không cần một môi trường phức tạp được cài đặt trước, vì vậy việc bootstrapping có thể dễ dàng hơn.
  • "một môi trường dàn dựng giống hệt với môi trường sống nhất có thể" - nếu bạn có một tập lệnh tạo ra một môi trường từ đầu, tức là từ một hình ảnh cơ sở trống rỗng ít nhiều, thì môi trường của bạn sẽ giống hệt nhau, hãy lưu lại cho deltas được mã hóa kịch bản của bạn. Đó là điểm của tất cả những điều này.
  • "Cách chuyển trang web trực tiếp sang máy chủ khác" - điều duy nhất cần suy ngẫm là những gì xảy ra với dữ liệu liên tục của bạn. Tức là, bạn sẽ muốn làm cho nó để bạn có thể liên kết các ứng dụng của mình với các khối lượng / cửa hàng liên tục khác nhau một cách nhanh chóng, để có thể chuyển đổi qua lại.
  • "Docker - nản chí" - thành thật mà nói, nó không nên tệ đến thế. Nếu bạn biết cách xây dựng một môi trường từ đầu bằng các công cụ dòng lệnh (không có công cụ GUI), thì việc đặt chúng vào Dockerfile sẽ khá dễ dàng. Các chi tiết đáng lo ngại xuất hiện khi đến lúc phải điều chỉnh (nghĩa là giảm kích thước hình ảnh), nhưng ngoài ra nó không quá tệ. Đầu tiên hãy làm cho nó hoạt động bằng cách nào đó , sau đó tìm ra cách làm cho nó đẹp. Điều tốt là kiến ​​thức bạn có được sẽ chuyển sang nhiều môi trường khác.

Chúc may mắn!


3

Cảm ơn vì câu hỏi tuyệt vời của bạn. Không có gì là tầm thường khi lần đầu tiên bạn làm điều đó và tất cả chúng ta đều mới mẻ với một cái gì đó một lần.

Đề nghị đầu tiên của tôi là xem lại docker. Hãy thử một số hướng dẫn và hướng dẫn khác nhau. Nó thực sự đơn giản. Bạn có một tệp docker được "dựng", theo nghĩa đen chỉ là các lệnh bạn muốn chạy trên "container" hoặc "image". Bạn đẩy hình ảnh đó đến một sổ đăng ký có thể là công khai hoặc riêng tư. Sau đó, bạn chạy hình ảnh đó trên một máy chủ. Docker thực sự quan trọng với node.js và python nơi bạn có rất nhiều phụ thuộc và đôi khi thực sự khó có thể quản lý chúng. Nếu bạn đang sử dụng pip, và bạn nên, bạn có thể tạo một requirements.txttệp để cung cấp cho bộ chứa docker của bạn.

Bây giờ bạn nói bạn đang sử dụng git, vì vậy tôi sẽ sử dụng móc git cục bộ. Bạn có thể sử dụng những thứ này để xây dựng container docker, chạy thử nghiệm tự động và sau đó triển khai container của bạn. Bạn có thể tra cứu rất nhiều hướng dẫn và hướng dẫn khác nhau về chủ đề này.

Để quản lý cơ sở hạ tầng của bạn, tôi sẽ sử dụng Terraform. Terraform là tuyệt vời vì bạn có thể tạo ra một môi trường theo yêu cầu và xóa nó khi hoàn thành. Đề xuất của tôi sẽ là bắt đầu đơn giản và một khi bạn thành thạo docker và terraform, bạn có thể thử triển khai màu xanh / xanh.

Bây giờ nếu bạn đang sử dụng Gitlab hoặc sẵn sàng chuyển đổi, nó cũng cung cấp dịch vụ ci / cd miễn phí. Điều này bao gồm rất nhiều tính năng thú vị và thực sự dễ sử dụng. Tôi sử dụng nó cho tất cả các ứng dụng của tôi. Bạn hoàn toàn có thể bỏ qua các móc git cục bộ và kiểm tra trong đường ống gitlab hoặc giữ chúng để kiểm tra từng cam kết cục bộ và sử dụng gitlab để xây dựng và triển khai.

Tôi hy vọng điều này có phần hữu ích.


1
Với Docker, điều tôi thấy hơi nản chí là nguyên tắc có các thành phần trong các thùng chứa khác nhau. Vì vậy, một cho ứng dụng, một cho Gunicorn, một cho Nginx, v.v. Sau đó, bạn phải đặt cấu hình bổ sung để khiến họ nói chuyện với nhau. Nó dường như đánh bại đối tượng có một container được đóng gói duy nhất có thể chuyển sang bất kỳ môi trường nào. Tuy nhiên, vì câu trả lời này và @ Anoe đã đề nghị đưa ra một cái nhìn khác mà tôi sẽ làm.
Kiết tường

1
@Auspice Đó là một cách tiếp cận "dịch vụ vi mô". Mặc dù đó là cách tốt nhất để container docker chỉ có một quy trình duy nhất, nhưng đó thường không phải là những gì tôi thấy. Kiểm tra "Cách Docker?" đây github.com/just-containers/s6-overlay . Cá nhân tôi sẽ đưa ra thông tin của mình bằng Ansible. Tôi sẽ sử dụng ansible để gọi Terraform để tạo ra nó. Sau đó, tôi sẽ sử dụng ansible để cập nhật máy chủ của mình, cài đặt docker, cài đặt nginx và để nó khởi động các ứng dụng docker của tôi dưới dạng dịch vụ. Tôi sẽ có cấu hình nginx ansible để ủy quyền cho các thùng chứa ứng dụng và gunicorn.
Levi

0

Các câu trả lời được đăng rất hữu ích trong việc cho phép tôi suy nghĩ lại vấn đề của mình và các cách tiếp cận khác nhau. Tôi chưa thực hiện một giải pháp nào nhưng tôi đã quyết định một cách tiếp cận vì vậy tôi đang ghi chép lại và chọn nó làm câu trả lời. Tóm lại, đây là:

Phương pháp lựa chọn của tôi

  • Đối với môi trường trực tiếp, tôi sẽ sử dụng hai Máy ảo (có thể sử dụng các giọt DigitalOcean) chạy Ubuntu và được cấu hình giống hệt nhau.
  • Tôi sẽ sử dụng cách tiếp cận Blue-Green bằng cách sử dụng tiện ích IP nổi trong DO để duy trì hai máy chủ giống hệt của tôi là Live và Pre-Prod / Backup.
  • Tôi sẽ tạo một VM (có thể sử dụng VirtualBox) trong quá trình phát triển của tôi được thiết lập để sử dụng làm môi trường dàn dựng. VM này sẽ được thiết lập giống hệt như hai máy chủ trực tiếp của tôi.
  • Tôi sẽ viết một tập lệnh phổ biến duy nhất trong Python để thiết lập môi trường từ đầu và tôi sẽ sử dụng tập lệnh này để định cấu hình môi trường dàn dựng và cặp trực tiếp / tiền sản xuất của tôi.
  • Tôi sẽ sử dụng git hook để kích hoạt cập nhật cho các môi trường (có thể được kích hoạt bằng tay).

Những cân nhắc nào bỏ qua cách tiếp cận này

  • Docker: Tôi đã quyết định chống lại nó. Mặc dù tôi rất nghiêm túc trả lời (cảm ơn bạn @Levi và @Dan) nói rằng tôi nên ghé thăm lại và điều đó không tệ lắm, tôi đã có quá nhiều kinh nghiệm trong quá khứ bắt tay vào một điều gì đó mới và nhận ra mình đã ngã xuống một cái hố thỏ ăn hết thời gian và mất một tuổi để đi. Tôi nghĩ sẽ khác nếu tôi thậm chí làm việc với một người khác nhưng vì ai đó làm việc hoàn toàn một mình mỗi phút là điều quý giá.

  • Máy ảo: Tôi đã không thực sự xem xét điều này cho đến khi tôi bắt đầu làm việc với một số hướng dẫn Docker sử dụng máy ảo để thể hiện chức năng Swarm. Ý tưởng về việc có thể tạo ra một môi trường hoàn toàn mới mà tôi có toàn quyền kiểm soát rất hấp dẫn.

  • Viết kịch bản: Được thúc đẩy bởi câu trả lời hữu ích của @ AnoE Tôi đã đào sâu hơn một chút và dường như Python được công nhận là một lựa chọn khả thi cho kịch bản và vì đó là những gì tôi đang viết ứng dụng của mình trong đó nên có vẻ như sẽ có một sức mạnh tổng hợp (Nếu tôi cần để học một cái gì đó mới cho kịch bản của tôi, đó sẽ là kiến ​​thức tôi có thể sử dụng khi viết ứng dụng của mình)

Tôi sẽ cập nhật một khi tôi đã đạt được một số tiến bộ với điều này và nếu nó sai lầm khủng khiếp tôi sẽ thừa nhận tôi có thể đã lựa chọn sai!).

Cập nhật ngày 20 tháng 10 năm 2018.

Tôi bắt đầu viết một kịch bản Python nhưng điều này thường liên quan đến việc gọi lệnh bash từ Python và sau đó nhận được phản hồi và tôi thấy điều này được thêm vào thời gian phát triển khá nhiều. Sau một vài tuần tiến triển chậm, tôi tìm nơi khác. Tôi thừa nhận tôi có thể đã tiếp cận nó sai nhưng tôi cần một cái gì đó sẽ nhanh hơn.

Cuối cùng tôi đã giải quyết được Vagrant / Ansible / VirtualBox và sau nhiều tháng tôi muốn thừa nhận đã có thứ gì đó hoạt động tốt, nhưng sau rất nhiều công việc học một số kỹ năng mới (Vagrant và Ansible hoàn toàn mới đối với tôi). Sau đó, tôi đã áp dụng tập lệnh Ansible để cung cấp một giọt DigitalOcean và thấy điều này hoạt động rất tốt. Tôi đã trở thành một fan hâm mộ của Ansible nhưng mặc dù tôi đồng ý (với những người đánh giá) rằng nó tương đối dễ sử dụng, nó vẫn là một mô hình mới và một đường cong học tập khá dốc.

Tại thời điểm viết bài, tôi đã cung cấp hai Giọt riêng biệt trên DigitalOcean trong cấu hình màu xanh lam, sử dụng địa chỉ IP nổi DO để chuyển đổi giữa hai và trên mỗi ứng dụng nằm trong một bản sao hoạt động của git vì vậy tôi chỉ cần làm mới Làm chủ để cập nhật một môi trường.

Tôi đang gặp vấn đề khi các IP nổi hoạt động như tôi mong đợi nhưng tôi hy vọng sẽ giải quyết sớm và sau đó tôi sẽ có một môi trường DevOps hoạt động.

Ưu điểm lớn của phương pháp này là cách Ansible hoạt động, một khi bạn có một thứ gì đó hoạt động thì tương đối dễ dàng để làm cho nó hoạt động trong một môi trường khác và điều này có thể không dễ dàng đạt được với một kịch bản python (hoặc ít nhất là bạn phải xây dựng đây là công việc làm thêm)

Tôi nghĩ rằng bài học lớn là mọi thứ mất nhiều thời gian hơn tôi mong đợi và học một công nghệ mới luôn mang đến những điều chưa biết. Điều này không phải là một điều ngạc nhiên đối với tôi - nhưng nó luôn luôn và hoạt động như một nhà phát triển đơn độc, điều này xảy ra với tôi rất nhiều.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.