Saya membuat aplikasi Rails, menggunakan Rails 4.1, dari awal dan saya menghadapi masalah aneh yang tidak dapat saya pecahkan.
Setiap kali saya mencoba untuk menyebarkan aplikasi saya di Heroku saya mendapatkan kesalahan 500:
Missing `secret_key_base` for 'production' environment, set this value in `config/secrets.yml`
The secret.yml
file berisi konfigurasi sebagai berikut:
secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>
Di Heroku saya mengonfigurasi SECRET_KEY_BASE
variabel lingkungan " " dengan hasil dari rake secret
perintah. Jika saya meluncurkan heroku config
, saya bisa melihat variabel dengan nama dan nilai yang benar.
Mengapa saya masih mendapatkan kesalahan ini?
ruby-on-rails
ruby
heroku
ruby-on-rails-4
Paolo Laurenti
sumber
sumber
secret.yml
atausecrets.yml
?Jawaban:
Saya memiliki masalah yang sama dan menyelesaikannya dengan membuat variabel lingkungan untuk dimuat setiap kali saya masuk ke server produksi, dan membuat mini-panduan langkah-langkah untuk mengkonfigurasinya:
Saya menggunakan Rails 4.1 dengan Unicorn v4.8.2 dan ketika saya mencoba untuk menyebarkan aplikasi saya itu tidak mulai dengan benar dan dalam
unicorn.log
file saya menemukan pesan kesalahan ini:Setelah beberapa penelitian saya menemukan bahwa Rails 4.1 mengubah cara mengelola
secret_key
, jadi jika Anda membacasecrets.yml
file yang terletak diexampleRailsProject/config/secrets.yml
Anda akan menemukan sesuatu seperti ini:Ini berarti bahwa Rails merekomendasikan Anda untuk menggunakan variabel lingkungan untuk
secret_key_base
di server produksi Anda. Untuk mengatasi kesalahan ini, Anda harus mengikuti langkah-langkah ini untuk membuat variabel lingkungan untuk Linux (dalam kasus saya Ubuntu) di server produksi Anda:Di terminal server produksi Anda jalankan:
Ini mengembalikan string besar dengan huruf dan angka. Salin itu, yang akan kita sebut kode itu sebagai
GENERATED_CODE
.Login ke server Anda
Jika Anda masuk sebagai pengguna root, cari file ini dan edit:
Buka bagian bawah file menggunakan Shift+ G(huruf besar "G") di vi.
Tulis variabel lingkungan Anda dengan
GENERATED_CODE
, tekan iuntuk menyisipkan di vi. Pastikan berada di baris baru di akhir file:Simpan perubahan dan tutup file menggunakan Esclalu "
:x
" dan Enteruntuk menyimpan dan keluar di vi.Tetapi jika Anda masuk sebagai pengguna normal, sebut saja "
example_user
" untuk inti ini, Anda perlu menemukan salah satu dari file-file ini:File-file ini dalam urutan kepentingan, yang berarti bahwa jika Anda memiliki file pertama, maka Anda tidak perlu mengedit yang lain. Jika Anda menemukan dua file ini di direktori Anda
~/.bash_profile
dan~/.profile
Anda hanya perlu menulis di yang pertama~/.bash_profile
, karena Linux hanya akan membaca yang ini dan yang lainnya akan diabaikan.Kemudian kita pergi ke bagian bawah file menggunakan Shift+ Glagi dan menulis variabel lingkungan dengan
GENERATED_CODE
menggunakan kita ilagi, dan pastikan menambahkan baris baru di akhir file:Setelah menulis kode, simpan perubahan dan tutup file menggunakan Esclagi dan "
:x
" dan Enteruntuk menyimpan dan keluar.Anda dapat memverifikasi bahwa variabel lingkungan kami diatur dengan benar di Linux dengan perintah ini:
atau dengan:
Ketika Anda menjalankan perintah ini, jika semuanya berjalan baik, itu akan menunjukkan kepada Anda
GENERATED_CODE
dari sebelumnya. Akhirnya dengan semua konfigurasi yang dilakukan Anda harus dapat menggunakan tanpa masalah aplikasi Rails Anda dengan Unicorn atau alat lainnya.Ketika Anda menutup shell dan login lagi ke server produksi, Anda akan memiliki set variabel lingkungan ini dan siap untuk menggunakannya.
Dan itu dia! Saya harap mini-guide ini membantu Anda mengatasi kesalahan ini.
Penafian: Saya bukan guru Linux atau Rails, jadi jika Anda menemukan sesuatu yang salah atau kesalahan, saya akan dengan senang hati memperbaikinya.
sumber
Saya akan berasumsi bahwa Anda tidak memiliki Anda
secrets.yml
diperiksa ke dalam kontrol sumber (mis. Itu ada di.gitignore
file). Bahkan jika ini bukan situasi Anda, itulah yang dilakukan banyak orang yang melihat pertanyaan ini karena kode mereka diekspos di Github dan tidak ingin kunci rahasia mereka mengambang.Jika tidak ada dalam kontrol sumber, Heroku tidak tahu tentang itu. Jadi Rails sedang mencari
Rails.application.secrets.secret_key_base
dan belum ditetapkan karena Rails menetapkannya dengan memeriksasecrets.yml
file yang tidak ada. Solusi sederhana adalah masuk keconfig/environments/production.rb
file Anda dan tambahkan baris berikut:Ini memberi tahu aplikasi Anda untuk mengatur kunci rahasia menggunakan variabel lingkungan alih-alih mencarinya
secrets.yml
. Itu akan menyelamatkan saya banyak waktu untuk mengetahui hal ini di muka.sumber
Figaro
danheroku_secrets
tidak melakukan apa pun kecuali Rails tahu bahwa ituSECRET_KEY_BASE
tinggal diENV
. Saya telah berjuang dengan pemikiran ini bahwa jika konfigurasi ada pada Heroku, Rails akan mengambilnya hanya karena itu ada, tetapi sekarang tampaknya sangat menyolok bahwa Rails perlu tahu di mana mencarinya. Saya bertanya-tanya bagaimana saya dapat memiliki kode pada Github tanpa harus khawatir tentang hal basis kunci rahasia; sekarang saya tahu.production: secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>
. Bukankah itu juga berarti kunci rahasia yang sebenarnya tidak terbuka. Apakah ada risiko untuk mengekspos dev dan menguji kunci dalam rahasia yang dilakukan.yml jika itu semua hanya data unggulan dan uji?Tambahkan
config/secrets.yml
ke kontrol versi dan gunakan lagi. Anda mungkin perlu menghapus satu baris dari.gitignore
sehingga Anda dapat mengkomit file.Saya memiliki masalah yang sama persis ini dan ternyata
.gitignore
Github boilerplate yang dibuat untuk aplikasi Rails saya disertakanconfig/secrets.yml
.sumber
Rails.application.config.secret_key_base = ENV["SECRET_KEY_BASE"]
akan berfungsi dan menghapus kesalahan tanpa menambahkansecrets.yml
ke sumber.rails new
(menghasilkan, dalam hal ini, Gemfile yangrails
permata memiliki versi4.2.4
), fileconfig/secrets.yml
dihasilkan. Ini termasuk pregenerated kunci rahasia untuk pengembangan dan uji lingkungan, dan membaca secretkey untuk lingkungan produksi dari variabel lingkungan:secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>
. Menurut saya itu sangat aman, dan memang bermanfaat, untuk menjagasecrets.yml
file ini dalam kontrol versi, asalkan orang tidak pernah benar-benar mendefinisikan kunci rahasia di sana.Ini berhasil untuk saya.
SSH ke server produksi Anda dan
cd
ke direktori Anda saat ini, jalankanbundle exec rake secret
ataurake secret
, Anda akan mendapatkan string panjang sebagai output, salin string itu.Sekarang jalankan
sudo nano /etc/environment
.Rekatkan di bagian bawah file
Di mana
rake secret
string yang baru saja Anda salin, tempel string yang disalin di tempatrake secret
.Mulai ulang server dan uji dengan menjalankan
echo $SECRET_KEY_BASE
.sumber
Meskipun Anda dapat menggunakan inisialisasi seperti jawaban lain, cara Rails 4.1+ konvensional adalah dengan menggunakan
config/secrets.yml
. Alasan bagi tim Rails untuk memperkenalkan ini berada di luar cakupan jawaban ini tetapi TL; DR adalah yangsecret_token.rb
mengonfigurasi konfigurasi dan kode serta menjadi risiko keamanan karena token tersebut diperiksa ke dalam sejarah kendali sumber dan satu-satunya sistem yang perlu tahu token rahasia produksi adalah infrastruktur produksi.Anda harus menambahkan file ini
.gitignore
seperti Anda tidak akan menambahkanconfig/database.yml
kontrol sumber juga.Merujuk kode Heroku sendiri untuk pengaturan
config/database.yml
dariDATABASE_URL
dalam Buildpack mereka untuk Ruby , saya akhirnya mengambil repo mereka dan memodifikasinya untuk dibuatconfig/secrets.yml
dariSECRETS_KEY_BASE
variabel lingkungan.Karena fitur ini diperkenalkan di Rails 4.1, saya merasa pantas untuk mengedit
./lib/language_pack/rails41.rb
dan menambahkan fungsi ini.Berikut ini cuplikan dari buildpack modifikasi yang saya buat di perusahaan saya:
Tentu saja Anda dapat memperluas kode ini untuk menambahkan rahasia lain (mis. Kunci API pihak ketiga, dll.) Untuk dibaca dari variabel lingkungan Anda:
Dengan cara ini, Anda dapat mengakses rahasia ini dengan cara yang sangat standar:
Sebelum mempekerjakan kembali aplikasi Anda, pastikan untuk mengatur variabel lingkungan Anda terlebih dahulu:
Kemudian tambahkan buildpack Anda yang dimodifikasi (atau Anda dipersilakan untuk menautkan ke tambang) ke aplikasi Heroku Anda (lihat dokumentasi Heroku ) dan gunakan kembali aplikasi Anda.
Buildpack akan secara otomatis membuat Anda
config/secrets.yml
dari variabel lingkungan Anda sebagai bagian dari proses pembangunan dyno setiap kali Andagit push
ke Heroku.EDIT: Dokumentasi Heroku sendiri menyarankan
config/secrets.yml
untuk membuat membaca dari variabel lingkungan tetapi ini menyiratkan Anda harus memeriksa file ini ke dalam kontrol sumber. Dalam kasus saya, ini tidak berfungsi dengan baik karena saya memiliki rahasia hardcoded untuk pengembangan dan pengujian lingkungan yang saya lebih suka tidak memeriksa.sumber
Anda dapat mengekspor kunci rahasia ke sebagai variabel lingkungan di
~/.bashrc
atau~/.bash_profile
dari server Anda:Dan kemudian, Anda dapat mengambil sumber
.bashrc
atau.bash_profile
:Jangan pernah melakukan rahasia Anda .yml
sumber
Dalam kasus saya, masalahnya adalah yang
config/master.key
tidak ada dalam kontrol versi, dan saya telah membuat proyek di komputer yang berbeda..Gitignore default yang dibuat Rails mengecualikan file ini. Karena tidak mungkin untuk menyebarkan tanpa memiliki file ini, itu perlu di kontrol versi, agar dapat digunakan dari komputer anggota tim mana pun.
Solusi: hapus
config/master.key
baris dari.gitignore
, komit file dari komputer tempat proyek itu dibuat, dan sekarang Anda dapatgit pull
di komputer lain dan menyebarkan dari itu.Orang-orang mengatakan untuk tidak melakukan beberapa file ini ke kontrol versi, tanpa menawarkan solusi alternatif. Selama Anda tidak mengerjakan proyek sumber terbuka, saya tidak melihat alasan untuk tidak melakukan semua yang diperlukan untuk menjalankan proyek, termasuk kredensial.
sumber
secrets.yml
file lama , yang telah usang untuk beberapa versi Rails sebelumnya. Pertanyaan Stack Overflow ini sendiri memiliki banyak jawaban, dan mereka hampir semuanya menggunakan API kuno ini.Untuk rails6, saya menghadapi masalah yang sama, karena saya kehilangan file berikut, setelah saya menambahkannya, masalah terselesaikan:
Pastikan Anda memiliki file ini. !!!
sumber
Apa yang saya lakukan: Di server produksi saya, saya membuat file config (confthin.yml) untuk Thin (saya menggunakannya) dan menambahkan informasi berikut:
Saya kemudian meluncurkan aplikasi dengan
Bekerja seperti jimat dan kemudian tidak perlu memiliki kunci rahasia pada kontrol versi
Semoga bisa membantu, tapi saya yakin hal yang sama bisa dilakukan dengan Unicorn dan yang lainnya.
sumber
Saya memiliki tambalan yang telah saya gunakan dalam aplikasi Rails 4.1 untuk membiarkan saya terus menggunakan generator kunci lama (dan karenanya kompatibilitas mundur sesi dengan Rails 3), dengan membiarkan secret_key_base menjadi kosong.
Saya telah sejak memformat ulang tambalan yang diserahkan ke Rails sebagai Permintaan Tarik
sumber
Saya telah membuat
config/initializers/secret_key.rb
file dan saya hanya menulis baris kode berikut:Tapi saya pikir solusi yang diposting oleh @Erik Trautman lebih elegan;)
Sunting: Oh, dan akhirnya saya menemukan saran ini di Heroku: https://devcenter.heroku.com/changelog-items/426 :)
Nikmati!
sumber
ini berfungsi baik https://gist.github.com/pablosalgadom/4d75f30517edc6230a67 untuk pengguna root harus mengedit
tetapi jika Anda bukan root harus memasukkan kode menghasilkan berikut ini
sumber
Pada Nginx / Penumpang / Ruby (2.4) / Rails (5.1.1) tidak ada yang berhasil kecuali:
passenger_env_var
di/etc/nginx/sites-available/default
dalam blok server.Sumber: https://www.phusionpassenger.com/library/config/nginx/reference/#passenger_env_var
sumber
Demi Magus menjawab bekerja untuk saya sampai Rails 5.
Di Apache2 / Penumpang / Ruby (2.4) / Rails (5.1.6), saya harus meletakkan
dari jawaban Demi Magus di / etc / apache2 / envvars, menyebabkan / etc / profile tampaknya diabaikan.
Sumber: https://www.phusionpassenger.com/library/indepth/environment_variables.html#apache
sumber
Saya memiliki masalah yang sama setelah saya menggunakan file .gitignore dari https://github.com/github/gitignore/blob/master/Rails.gitignore
Semuanya berjalan dengan baik setelah saya mengomentari baris berikut dalam file .gitignore.
sumber