คุณพร้อมที่จะเปิดตัวแอป production แรกแล้ว และถึงเวลาให้มันพูดคุยกับบริการภายนอกบางอย่าง คุณยังต้องทำให้ทุกอย่างเชื่อมต่อ ดังนั้น วิธีที่ดีที่สุดในการกำหนดค่าบริการของคุณใน production โดยไม่ทำให้เครื่องพัฒนาของคุณซับซ้อนขึ้นคืออะไร?
ตั้งค่า Environment ของคุณ
สำหรับการกำหนดค่า production apps แนวทางปฏิบัติที่ดีที่สุดในวันนี้คือใช้ environment variables (สิ่งที่ดูเหมือน ENV["REDIS_HOST"])
แต่ทำไม?
-
ยากกว่าที่จะ commit production keys ของคุณโดยไม่ได้ตั้งใจ
หากคุณไม่ระมัดระวัง คุณอาจ
git pushไฟล์ที่มี secret keys สำคัญอยู่ และนั่นอาจเป็นข้อผิดพลาดที่มีค่าใช้จ่ายสูง -
Configuration คือสิ่งที่ environment variables อยู่ที่นั่นเพื่อ
Environment variables เป็นวิธีทั่วไปในการกำหนดค่าแอปบนเกือบทุกประเภทของระบบ โปรแกรมอื่นๆ หลายตัว (เช่น Ruby) ใช้ environment variables สำหรับ configuration ดังนั้นจึงสมเหตุสมผลที่จะลองในแอปของคุณเอง
-
Environment variables ง่ายต่อการตั้งค่าใน production
Heroku มี web UI และ command line tool สำหรับตั้งค่า environment variables อย่างง่าย และหากคุณสร้าง server ของตัวเอง เครื่องมือจัดการ server เช่น Chef และ Docker ทำให้การตั้งค่า environment variables ง่าย
มันดูอย่างไรบนฝั่ง Rails?
นี่คือวิธีที่แอปที่ขึ้นอยู่กับ environment variables สามารถกำหนดค่าตัวเองได้:
production: host: <%= ENV["MY_SERVICE_HOST"] %> port: <%= ENV["MY_SERVICE_PORT"] %> my_service_config = Rails.application.config_for(:my_service) my_service = MyService.new(my_service_config["host"], my_service_config["port"]) Initializer ใช้เมธอด config_for ของ Rails 4.2 เพื่อหาไฟล์ .yml ที่ถูกต้องและเลือก environment ที่ถูกต้อง
จากนั้น config_for รันโค้ด ERB ภายใน my_service.yml และดึง MY_SERVICE_HOST และ MY_SERVICE_PORT ออกจาก environment มันส่งค่าเหล่านั้นไปยัง MyService
คุณอาจเพียงแค่ให้ initializer อ่านจาก ENV["MY_SERVICE_HOST"] โดยตรง แต่ผมชอบเก็บไว้ในไฟล์ .yml เพราะเหตุผลที่คุณจะเห็นในหนึ่งนาที
การกำหนดค่าของแอปคุณใน development
Environment variables เหมาะสำหรับ production แต่เมื่อคุณตั้งค่า production config แล้ว คุณจัดการ development และ test mode อย่างไร?
คุณมีตัวเลือกสองสาม แต่ผมมักปฏิบัติตาม convention ใน config/secrets.yml ของ Rails: ใช้ environment variables ใน production และ hardcode ค่า non-secret ใน development และ test
ด้วย development และ test environments 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 Awesome มากที่ initializer สามารถคงเดิมได้ทั้งหมด ค่าในไฟล์นี้จะถูกใช้ใน development และ test environments และ production environment จะได้ค่าจาก environment variables
แต่ทำไมคุณจะ hardcode ค่าเหล่านี้?
-
ค่าการกำหนดค่ายิ่งง่ายต่อการมองเห็นและเปลี่ยนแปลง
คุณสามารถปรับ config ได้ขณะทดลองฟีเจอร์ใหม่ ซึ่งเป็นสิ่งที่คุณต้องการใน development แต่ไม่ค่อยต้องการใน production
-
ง่ายกว่าสำหรับผู้ใหม่ในการเริ่มต้น
หาก sample config ทั้งหมดที่คุณต้องการถูก check เข้า git repository นักพัฒนาใหม่แค่ clone และรันแอป พวกเขาไม่ต้องมุ่งมั่นตั้งค่าแค่ค่าที่ถูกต้องเพื่อให้แอปทำงาน
-
คุณไม่ต้องกังวลเกี่ยวกับ environment variables ที่ขัดแย้งกัน
คุณอาจจะทำงานบนแอปมากกว่าบน dev machine ของคุณมากกว่าที่คุณจะ deploy ไป production machine เดียว หากคุณใช้ system-wide environment variables เพื่อกำหนดค่าแอปทั้งหมด มีโอกาสดีที่สองตัวจะเหยียบย่ากัน
ดังนั้น ลองใช้ environment variables ใน production และ hardcoded .yml config ใน development มันง่าย อ่านง่าย และ Rails มี built-in support สำหรับการจัดการ config files แบบนั้นพอดี
ตัวเลือกอื่นสำหรับ development
มีอีกวิธีหนึ่งในการจัดการ configuration ใน development mode: dotenv มันดูสะอาดแตผมยังไม่ได้ลองในแอปของตัวเอง
ด้วย dotenv คุณสามารถวาง environment variables ในไฟล์ชื่อ .env ใน root directory ของ Rails app ของคุณ และค่าเหล่านั้นจะถูกดึงขึ้นมาระบบของแอป นี่ดีเพราะ development environment ของคุณทำงานคล้าย production environment มากขึ้น นั่นเป็นวิธีที่ดีในการหลีกเลี่ยง bugs ที่เกิดขึ้นเฉพาะใน production
มันเป็นสิ่งที่ผมจะลองเมื่อวานนี้ แต่ตอนนี้ผมยังไม่พบอะไรสะดวกกว่า .yml และ config_for
แอป production ส่วนใหญ่ต้องการการกำหนดค่าบางประเภท ดังนั้นเมื่อคุณ deploy แอปครั้งหน้า ลองใช้ไฟล์ .yml ที่ถูก populate โดย environment variables ใน production เพื่อกำหนดค่ามัน คุณจะได้ความยืดหยุ่น ความเรียบง่าย และความน่าเชื่อถือที่คุณหวัง
คุณมีวิธีต่างที่คุณชอบในการกำหนดค่า production apps ของคุณไหม? ทิ้ง comment ไว้ ผมอยากรู้!