Computer >> Máy Tính >  >> Lập trình >> Ruby

Cách cấu hình ứng dụng Rails của bạn để vận chuyển

Bạn đã sẵn sàng khởi chạy ứng dụng sản xuất đầu tiên của mình và đã đến lúc để ứng dụng này giao tiếp với một số dịch vụ bên ngoài. Bạn vẫn phải kết nối mọi thứ với nhau. Vậy cách tốt nhất để định cấu hình dịch vụ của bạn trong sản xuất mà không làm cho mọi thứ phức tạp hơn trên máy phát triển của bạn là gì?

Thiết lập Môi trường của bạn

Để định cấu hình ứng dụng sản xuất, phương pháp hay nhất hiện nay là sử dụng các biến môi trường (ENV["REDIS_HOST"] -sinh vật).

Nhưng tại sao?

  • Việc vô tình xác nhận khóa sản xuất của bạn sẽ khó hơn.

    Nếu không chú ý, bạn có thể git push một tệp có các khóa bí mật quan trọng trong đó. Và đó có thể là một sai lầm đắt giá.

  • Cấu hình là biến môi trường dùng để làm gì.

    Các biến môi trường là một cách phổ biến để định cấu hình ứng dụng trên hầu hết mọi loại hệ thống. Nhiều chương trình khác (như Ruby) sử dụng các biến môi trường để cấu hình, vì vậy bạn chỉ nên thử trong ứng dụng của riêng mình.

  • Các biến môi trường rất dễ thiết lập trong quá trình sản xuất.

    Heroku có giao diện người dùng web và công cụ dòng lệnh để dễ dàng thiết lập các biến môi trường. Và nếu bạn đang xây dựng máy chủ của riêng mình, các công cụ quản lý máy chủ như Chef và Docker giúp việc thiết lập các biến môi trường trở nên dễ dàng.

Bên Rails trông như thế nào?

Đây là cách một ứng dụng phụ thuộc vào các biến môi trường có thể tự định cấu hình:

config / my_service.yml
production:
  host: <%= ENV["MY_SERVICE_HOST"] %>
  port: <%= ENV["MY_SERVICE_PORT"] %>
config / initializers / my_service.rb
my_service_config = Rails.application.config_for(:my_service)
    
my_service = MyService.new(my_service_config["host"], my_service_config["port"])

Trình khởi tạo sử dụng config_for của Rails 4.2 để tìm đúng .yml gửi và chọn môi trường phù hợp.

Sau đó, config_for chạy ERB mã bên trong my_service.yml và lấy MY_SERVICE_HOSTMY_SERVICE_PORT ngoài môi trường. Nó chuyển các giá trị đó đến MyService .

Bạn cũng có thể chỉ cần đọc trình khởi tạo từ ENV["MY_SERVICE_HOST"] trực tiếp. Nhưng tôi thích giữ chúng trong .yml vì những lý do bạn sẽ thấy sau một phút.

Cấu hình ứng dụng của bạn đang được phát triển

Các biến môi trường tốt cho quá trình sản xuất. Nhưng sau khi thiết lập cấu hình sản xuất, bạn xử lý chế độ phát triển và thử nghiệm như thế nào?

Bạn có một vài lựa chọn. Nhưng tôi thường tuân theo quy ước trong Rails ’config/secrets.yml :sử dụng các biến môi trường trong quá trình sản xuất và mã hóa các giá trị không bí mật trong quá trình phát triển và thử nghiệm.

Với môi trường phát triển và thử nghiệm, config/my_service.yml có thể trông như thế này:

config / my_service.yml
production:
  host: <%= ENV["MY_SERVICE_HOST"] %>
  port: <%= ENV["MY_SERVICE_PORT"] %>
  
development:
  host: localhost
  port: 8081
  
test:
  host: localhost
  port: 8081

Thật tuyệt vời, trình khởi tạo có thể giữ nguyên như cũ. Các giá trị trong tệp này sẽ được sử dụng trong môi trường phát triển và thử nghiệm và môi trường sản xuất sẽ nhận các giá trị của nó từ các biến môi trường.

Nhưng tại sao bạn lại mã hóa các giá trị này?

  • Các giá trị cấu hình dễ thấy và dễ thay đổi hơn.

    Bạn có thể điều chỉnh cấu hình của mình khi thử nghiệm với các tính năng mới, đây là thứ bạn muốn trong quá trình phát triển, nhưng không quá nhiều trong quá trình sản xuất.

  • Người mới bắt đầu dễ dàng hơn.

    Nếu tất cả cấu hình mẫu bạn cần được kiểm tra trong kho lưu trữ git của bạn, một nhà phát triển mới chỉ cần sao chép và chạy ứng dụng của bạn. Họ sẽ không cần phải loay hoay với việc chỉ đặt các giá trị phù hợp để ứng dụng hoạt động.

  • Bạn không phải lo lắng về các biến môi trường xung đột.

    Bạn có thể sẽ làm việc trên nhiều ứng dụng hơn trên máy phát triển của mình so với việc bạn sẽ triển khai cho một máy sản xuất duy nhất. Nếu bạn đã sử dụng các biến môi trường trên toàn hệ thống để định cấu hình tất cả các ứng dụng đó, thì rất có thể hai trong số chúng sẽ lấn át lẫn nhau.

Vì vậy, hãy thử sử dụng các biến môi trường trong sản xuất và mã hóa cứng .yml cấu hình trong quá trình phát triển. Nó dễ dàng, có thể đọc được và Rails có hỗ trợ tích hợp để xử lý chính xác những loại tệp cấu hình đó.

Một tùy chọn khác để phát triển

Có một cách khác để xử lý cấu hình trong chế độ phát triển:dotenv. Nó trông gọn gàng, nhưng tôi chưa thử nó trong một ứng dụng của riêng mình.

Với dotenv, bạn có thể đặt các biến môi trường trong một tệp có tên .env trong thư mục gốc của ứng dụng Rails và những giá trị đó sẽ được ứng dụng của bạn chọn. Điều này thật hay, bởi vì môi trường phát triển của bạn hoạt động giống như môi trường sản xuất của bạn hơn. Đó là một cách hay để tránh những lỗi chỉ xảy ra trong quá trình sản xuất.

Đó là thứ mà tôi sẽ thử vào một ngày nào đó. Nhưng hiện tại, tôi không tìm thấy thứ gì tiện lợi hơn .ymlconfig_for .

Hầu hết các ứng dụng sản xuất cần một số loại cấu hình. Vì vậy, khi bạn triển khai ứng dụng tiếp theo của mình, hãy thử sử dụng .yml , được điền bởi các biến môi trường trong sản xuất, để định cấu hình nó. Bạn sẽ có được sự linh hoạt, đơn giản và độ tin cậy như mong đợi.

Bạn có cách nào khác mà bạn muốn để định cấu hình ứng dụng sản xuất của mình không? Hãy để lại một bình luận, tôi rất muốn nghe về nó!