Computer >> 컴퓨터 >  >> 프로그램 작성 >> Ruby

Rails 앱을 배송하도록 구성하는 방법

첫 번째 프로덕션 앱을 시작할 준비가 되었습니다. 이제 일부 외부 서비스와 통신할 시간입니다. 여전히 모든 것을 연결해야 합니다. 개발 시스템에서 작업을 더 복잡하게 만들지 않고 프로덕션 환경에서 서비스를 구성하는 가장 좋은 방법은 무엇입니까?

환경 설정

프로덕션 앱을 구성하기 위해 오늘날의 모범 사례는 환경 변수(ENV["REDIS_HOST"] -보고있는 것들).

그런데 왜요?

  • 실수로 프로덕션 키를 커밋하기가 더 어렵습니다.

    주의를 기울이지 않으면 git push 중요한 비밀 키가 있는 파일. 그리고 그것은 값비싼 실수가 될 수 있습니다.

  • 구성은 환경 변수를 위한 것입니다.

    환경 변수는 거의 모든 종류의 시스템에서 앱을 구성하는 일반적인 방법입니다. Ruby와 같은 다른 많은 프로그램은 환경 변수를 구성에 사용하므로 자신의 앱에서만 시도하는 것이 좋습니다.

  • 환경 변수는 프로덕션 환경에서 쉽게 설정할 수 있습니다.

    Heroku에는 환경 변수를 쉽게 설정할 수 있는 웹 UI와 명령줄 도구가 있습니다. 또한 자체 서버를 구축하는 경우 Chef 및 Docker와 같은 서버 관리 도구를 사용하면 환경 변수를 쉽게 설정할 수 있습니다.

Rails 측면에서 어떻게 보입니까?

환경 변수에 의존하는 앱이 스스로를 구성하는 방법은 다음과 같습니다.

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"])

이니셜라이저는 Rails 4.2의 config_for를 사용합니다. 올바른 .yml을 찾는 방법 파일을 만들고 올바른 환경을 선택하십시오.

그런 다음 config_for ERB 실행 my_service.yml 내부의 코드 , 그리고 MY_SERVICE_HOST를 가져옵니다. 및 MY_SERVICE_PORT 환경에서. 이러한 값을 MyService에 전달합니다. .

ENV["MY_SERVICE_HOST"]에서 초기화 프로그램을 읽도록 할 수도 있습니다. 곧장. 하지만 .yml에 보관하는 것을 선호합니다. 몇 분 안에 볼 수 있는 이유입니다.

개발 중인 앱 구성

환경 변수는 프로덕션에 적합합니다. 하지만 프로덕션 구성을 설정한 후에는 개발 및 테스트 모드를 어떻게 처리합니까?

몇 가지 옵션이 있습니다. 하지만 저는 보통 Rails의 config/secrets.yml 규칙을 따릅니다. :프로덕션에서는 환경 변수를 사용하고 개발 및 테스트에서는 비밀이 아닌 값을 하드코딩합니다.

개발 및 테스트 환경에서 config/my_service.yml 다음과 같이 보일 수 있습니다.

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

훌륭하게도 초기화 프로그램은 정확히 동일하게 유지될 수 있습니다. 이 파일의 값은 개발 및 테스트 환경에서 사용되며 프로덕션 환경은 환경 변수에서 값을 가져옵니다.

그런데 왜 이러한 값을 하드코딩할까요?

  • 구성 값을 보고 변경하기가 더 쉽습니다.

    새로운 기능을 실험하면서 구성을 조정할 수 있습니다. 이는 개발 단계에서는 원하지만 프로덕션 단계에서는 그리 많지 않은 것입니다.

  • 초보자가 시작하기가 더 쉽습니다.

    필요한 모든 샘플 구성이 git 리포지토리에 체크인되면 새 개발자는 앱을 복제하고 실행하기만 하면 됩니다. 앱이 작동하도록 하기 위해 올바른 값을 설정하는 데 애쓸 필요가 없습니다.

  • 충돌하는 환경 변수에 대해 걱정할 필요가 없습니다.

    단일 프로덕션 머신에 배포하는 것보다 더 많은 앱을 개발 머신에서 작업하게 될 것입니다. 시스템 전체 환경 변수를 사용하여 이러한 모든 앱을 구성했다면 두 앱이 서로를 밟을 가능성이 큽니다.

따라서 프로덕션 환경 변수를 사용하고 하드코딩된 .yml 구성 중입니다. 쉽고 가독성이 높으며 Rails에는 이러한 종류의 구성 파일을 정확히 처리할 수 있도록 지원 기능이 내장되어 있습니다.

개발을 위한 또 다른 옵션

개발 모드에서 구성을 처리하는 또 다른 방법은 dotenv입니다. 깔끔해보이지만 아직 제 앱에서는 해보지 못했습니다.

dotenv를 사용하면 .env라는 파일에 환경 변수를 넣을 수 있습니다. Rails 앱의 루트 디렉토리에 있고 해당 값은 앱에서 선택합니다. 개발 환경이 프로덕션 환경처럼 작동하기 때문에 이것은 좋습니다. 이는 프로덕션에서만 발생하는 버그를 방지하는 좋은 방법입니다.

언젠가 시도해 볼 일입니다. 하지만 현재로서는 .yml보다 더 편리한 것을 찾지 못했습니다. 및 config_for .

대부분의 프로덕션 앱에는 일종의 구성이 필요합니다. 따라서 다음 앱을 배포할 때 .yml을 사용해 보세요. 프로덕션 환경 변수로 채워진 파일을 구성합니다. 원하는 유연성, 단순성 및 안정성을 얻을 수 있습니다.

프로덕션 앱을 구성하는 다른 방법이 있습니까? 의견을 남겨주세요. 듣고 싶습니다!