Sebagian besar waktu, saya menyimpan konfigurasi aplikasi pengembangan di direktori root proyek, seperti ini:
app
|-- config.json
Tapi itu tampaknya bukan pendekatan terbaik, karena konfigurasi ini akhirnya disimpan dalam sistem kontrol versi - mungkin mengakibatkan nama pengguna, kata sandi, dan hal-hal sensitif lainnya bocor.
12 Panduan Faktor Aplikasi merekomendasikan untuk menjatuhkan file konfigurasi sekaligus dan menggunakan variabel lingkungan untuk pengaturan konfigurasi:
... menyimpan config dalam variabel lingkungan. Env vars mudah untuk diubah di antara penyebaran tanpa mengubah kode apa pun; tidak seperti file config, ada sedikit kemungkinan mereka diperiksa ke dalam kode repo secara tidak sengaja; dan tidak seperti file konfigurasi khusus, atau mekanisme konfigurasi lainnya seperti Java System Properties, mereka adalah bahasa-dan OS-standar agnostik.
Kedengarannya sangat bagus bagi saya, tetapi di mana satu toko mengatakan variabel lingkungan, tanpa memeriksa mereka ke dalam kontrol sumber? Dan alat apa yang bisa saya gunakan untuk meneruskan variabel ke aplikasi? Mungkin ada puluhan opsi konfigurasi, dan mengetiknya dengan tangan setiap kali Anda meluncurkan aplikasi tidak bagus - jadi mereka harus disimpan dalam beberapa jenis file di suatu tempat. Dengan demikian file tersebut akan berakhir di kontrol sumber, dan kami kembali ke tempat kami mulai.
Apakah ada cara penanganan opsi konfigurasi yang diterima secara universal, yang tidak memiliki risiko menyimpan konfigurasi lokal dalam kontrol sumber?
.gitignore
mana saya dapat mendefinisikan file atau folder yang tidak boleh diperiksa ke dalam kontrol versi. Seperti yang Anda katakan saya tidak melihat di mana Env vars benar-benar harus membantu, dengan Anda memiliki skrip untuk mengaturnya dan harus disimpan bersama dengan proyek atau Anda memilikinya 'di suatu tempat' di sistem Anda (direktori home atau bahkan di permulaan mesin skrip) yang tampaknya membuat banyak masalah sendiri, terutama jika banyak konfigurasi diperlukan. Bagaimanapun saya akan membagi file konfigurasi sehingga informasi rahasia masuk dalam file yang berbeda.Jawaban:
Mungkin tidak ada jawaban yang bagus untuk ini. Tampaknya Anda perlu menyimpan data ini di tempat yang aman, karena akan diperlukan untuk keperluan pemulihan bencana suatu hari. Ini berlaku sama untuk properti file dan skrip yang mengatur variabel lingkungan.
Kami sedang mencari solusi untuk masalah ini, dan condong ke repositori kode dengan akses terbatas. Repositori ini hanya akan berisi data konfigurasi. Apakah orang lain memiliki pengalaman untuk dibagikan?
sumber
Dalam memeriksa masalah dan kemungkinan solusi, ada baiknya saya menggunakan metode yang dipopulerkan oleh Jeff Atwood : Jika Tuhan menciptakan cara untuk menyimpan informasi konfigurasi yang sensitif, bagaimana dia akan melakukannya?
Yah, dia akan tahu siapa yang membutuhkan informasi konfigurasi dan hanya memberikannya kepada orang-orang itu, dan informasi itu tidak akan pernah bisa diakses oleh orang lain.
Bagian pertama harus sudah dijaga: sistem kontrol sumber Anda harus mengotentikasi pengguna. Dan pendekatan ini juga diberikan validitas menurut # 10 di 10 Perintah Hunt Source Control Troy , "dependensi harus dalam kontrol sumber".
Tapi bagaimana cara mengamankannya jika bocor? Yah, itu tidak perlu disimpan di sana dalam teks biasa! Gunakan enkripsi. Di .NET, ada langkah-langkah yang dapat Anda lakukan untuk mengenkripsi data string koneksi dalam file konfigurasi Anda . Anda harus menemukan metode yang setara untuk melakukannya dengan teknologi pilihan Anda.
sumber
Banyak orang mengkritik menyimpan konfigurasi dalam file biasa bersama dengan kode sumber Anda, tetapi menurut pengalaman saya, ini sebenarnya solusi yang cukup bagus:
Jadi, untuk banyak kasus, konfigurasi tekstual yang disimpan dalam kontrol sumber bersama dengan kode adalah awal yang baik.
Jika Anda tertarik dengan sistem terdistribusi atau ingin dapat menukar hot-swap konfigurasi Anda tanpa menggunakan kembali aplikasi Anda, Anda mungkin menemukan solusi yang berbasis di sekitar server konfigurasi yang lebih baik. Spring Cloud memiliki dukungan untuk mekanisme tersebut , dan konfigurasi penyajian backend dapat berupa repositori git atau Eureka . Anda juga dapat menggulung sendiri menggunakan mis . Zookeeper . Salah satu dari pendekatan ini akan membuatnya lebih mudah untuk mengelola konfigurasi yang konsisten pada banyak server untuk memperbarui konfigurasi tanpa harus membangun kembali dan memindahkan kembali perangkat lunak Anda. Ini tentu saja biayanya, yaitu mempelajari server konfigurasi dan cara menggunakannya dari aplikasi Anda serta sistem lain untuk digunakan dan dipelihara.
sumber
Kami menghadapi masalah yang sama di tempat saya bekerja. Saat ini semua konfigurasi kami berbasis file dan sumber dikontrol dengan masing-masing aplikasi yang menggunakannya. Ini mengarah pada duplikasi dan pengembang memiliki akses ke kata sandi produksi / qa alih-alih hanya pengembangan.
Yang mengatakan saya pikir kami telah datang dengan solusi yang bagus untuk maju. Kami memindahkan file config kami ke repo git yang terpisah (dilabeli repo config). Kami kemudian menyiapkan server spring-cloud-config (java) yang hanya melayani file dari repo config berdasarkan profil yang diteruskan ke sana. Ini bagus untuk aplikasi Java yang dapat menggunakan klien dan mengunduhnya saat startup. Untuk aplikasi PHP / non-java, kami akan langsung menurunkan file. (Tidak ideal). Di masa depan kita dapat menulis sesuatu yang memungkinkan aplikasi PHP mengunduh konfigurasi itu sendiri dan menyimpannya di suatu tempat, tetapi itu bukan prioritas tinggi untuk dijalankan pertama kali. Saya menganggap solusi ini sebagai config-as-a-service yang tidak secara eksplisit melanggar rekomendasi aplikasi 12 faktor.
Saya percaya zookeeper dapat digunakan untuk hal yang sama (saya melihat setup dengan kubernetes + zookeeper) jadi saya tidak yakin mengapa jawaban itu mendapatkan -1 di atas.
Tautan:
https://spring.io/guides/gs/centralized-configuration/
https://cloud.spring.io/spring-cloud-config/
sumber
Alih-alih menyimpan seluruh konfigurasi dalam satu file, simpan dalam beberapa file.
README*
.01-logging.json
.02-database.json
, dll.Di kotak Linux terdekat, lihat
/etc/sudoers.d
atau/etc/nginx/conf.d
. Ini menunjukkan pola yang sama.Manajemen rahasia adalah binatang yang berbeda. Anda dapat mengelolanya sebagai langkah manual saat Anda kecil. Anda dapat menggunakan hal-hal seperti Zookeeper. Anda bahkan dapat memeriksa rahasia menjadi VCS dalam bentuk terenkripsi , dan mendekripsi mereka sebagai langkah penyebaran. Sejumlah opsi lain ada.
(Juga, sebuah opini: JSON bukan format file config yang baik, karena tidak mengizinkan komentar; komentar sangat penting. Format TOML, YAML, dan bahkan INI lebih baik dalam penggunaan praktis.)
sumber
Saya pikir opsi Anda agak ditentukan oleh OS yang Anda gunakan
Saya akan menyarankan, ya letakkan nilai-nilai dalam kontrol sumber. TAPI hanya versi 'dev'. Anda ingin kode sumber Anda dikompilasi DAN berfungsi! tidak termasuk langkah rahasia tambahan
Maka proses membangun dan menggunakan Anda harus menukar nilai-nilai ini per lingkungan selama penerapan. (Gurita memiliki model semacam ini)
sumber
Apache zookeeper memberikan opsi bagus untuk menyimpan konfigurasi aplikasi untuk sistem terdistribusi. Perubahan yang dilakukan di zookeeper dapat ditangkap dan diproses dengan memiliki kurator atau pendengar zookeeper di ujung aplikasi.
sumber