Cách giải quyết lỗi Lỗi thiếu `secret_key_base` cho môi trường 'sản xuất', (Rails 4.1)


169

Tôi đã tạo một ứng dụng Rails, sử dụng Rails 4.1, từ đầu và tôi đang đối mặt với một vấn đề kỳ lạ mà tôi không thể giải quyết.

Mỗi lần tôi cố gắng triển khai ứng dụng của mình trên Heroku, tôi gặp lỗi 500:

Missing `secret_key_base` for 'production' environment, set this value in `config/secrets.yml`

Tập secret.ymltin chứa cấu hình sau:

secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>

Trên Heroku tôi đã cấu hình SECRET_KEY_BASEbiến môi trường "" với kết quả của rake secretlệnh. Nếu tôi khởi chạy heroku config, tôi có thể thấy biến có tên và giá trị chính xác.

Tại sao tôi vẫn nhận được lỗi này?


1
Tôi đang có cùng một vấn đề và cũng rất muốn biết tại sao điều này cũng xảy ra. Nếu tôi tìm hiểu tại sao, tôi sẽ đăng lại với giải pháp của mình.
danielricecodes

Là tập tin cấu hình của bạn được gọi là secret.ymlhay secrets.yml?
James

2
Tôi đã cấu hình lại tệp .gitignore với tệp được tạo bởi đường ray và bây giờ mọi thứ đều hoạt động tốt
Paolo Laurenti

Chúng tôi cũng gặp vấn đề này khi chúng tôi nâng cấp lên Rails 4. Trong trường hợp của chúng tôi, đó là vì chúng tôi có tên môi trường tùy chỉnh và điều đó không được phản ánh trong secret.yml. Tôi chỉ cần thêm một dòng vào tệp với tên không chuẩn, cam kết và triển khai lại.
whognu

Đối với độc giả tương lai: câu trả lời này có lẽ là dễ nhất và chính xác nhất: stackoverflow.com/a/26541742/4880924
BKSpurgeon

Câu trả lời:


208

Tôi đã có cùng một vấn đề và giải quyết nó bằng cách tạo một biến môi trường để được tải mỗi lần tôi đăng nhập vào máy chủ sản xuất và thực hiện một hướng dẫn nhỏ về các bước để định cấu hình nó:

Tôi đã sử dụng Rails 4.1 với Unicorn v4.8.2 và khi tôi cố gắng triển khai ứng dụng của mình, nó đã không khởi động đúng cách và trong unicorn.logtệp tôi đã tìm thấy thông báo lỗi này:

app error: Missing `secret_key_base` for 'production' environment, set this value in `config/secrets.yml` (RuntimeError)

Sau một số nghiên cứu, tôi phát hiện ra rằng Rails 4.1 đã thay đổi cách quản lý secret_key, vì vậy nếu bạn đọc secrets.ymltệp nằm ở đó, exampleRailsProject/config/secrets.ymlbạn sẽ tìm thấy một cái gì đó như thế này:

# Do not keep production secrets in the repository,
# instead read values from the environment.
production:
  secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>

Điều này có nghĩa là Rails khuyên bạn nên sử dụng biến môi trường cho secret_key_basemáy chủ sản xuất của mình. Để giải quyết lỗi này, bạn nên làm theo các bước sau để tạo biến môi trường cho Linux (trong trường hợp của tôi là Ubuntu) trong máy chủ sản xuất của bạn:

  1. Trong thiết bị đầu cuối của máy chủ sản xuất của bạn thực thi:

    $ RAILS_ENV=production rake secret

    Điều này trả về một chuỗi lớn với các chữ cái và số. Sao chép cái mà chúng ta sẽ gọi mã đó là GENERATED_CODE.

  2. Đăng nhập vào máy chủ của bạn

    • Nếu bạn đăng nhập với tư cách người dùng root, hãy tìm tệp này và chỉnh sửa nó:

      $ vi /etc/profile

      Đi đến cuối tệp bằng Shift+ G(viết hoa "G") trong vi.

      Viết biến môi trường của bạn với GENERATED_CODE, nhấn iđể chèn vào vi. Hãy chắc chắn ở một dòng mới ở cuối tệp:

      $ export SECRET_KEY_BASE=GENERATED_CODE

      Lưu các thay đổi và đóng tệp bằng cách sử dụng Escvà sau đó " :x" và Enterđể lưu và thoát trong vi.

    • Nhưng nếu bạn đăng nhập như người dùng bình thường, hãy gọi nó là " example_user" cho ý chính này, bạn sẽ cần tìm một trong những tệp khác:

      $ vi ~/.bash_profile
      $ vi ~/.bash_login
      $ vi ~/.profile

      Các tệp này theo thứ tự quan trọng, có nghĩa là nếu bạn có tệp đầu tiên, thì bạn sẽ không cần phải chỉnh sửa các tệp khác. Nếu bạn tìm thấy hai tệp này trong thư mục của mình ~/.bash_profile~/.profilebạn sẽ chỉ phải ghi vào tệp đầu tiên ~/.bash_profile, bởi vì Linux sẽ chỉ đọc tệp này và tệp kia sẽ bị bỏ qua.

      Sau đó, chúng tôi đi đến cuối tệp bằng cách sử dụng Shift+ Glần nữa và viết biến môi trường GENERATED_CODEbằng cách sử dụng ilại và chắc chắn thêm một dòng mới ở cuối tệp:

      $ export SECRET_KEY_BASE=GENERATED_CODE

      Sau khi viết mã, lưu các thay đổi và đóng tệp bằng cách sử dụng Esclại và " :x" và Enterđể lưu và thoát.

  3. Bạn có thể xác minh rằng biến môi trường của chúng tôi được đặt đúng trong Linux bằng lệnh này:

    $ printenv | grep SECRET_KEY_BASE

    Hoặc với:

    $ echo $SECRET_KEY_BASE

    Khi bạn thực hiện lệnh này, nếu mọi thứ đều ổn, nó sẽ hiển thị cho bạn GENERATED_CODEtừ trước đó. Cuối cùng, với tất cả các cấu hình được thực hiện, bạn sẽ có thể triển khai mà không gặp vấn đề gì với ứng dụng Rails của bạn với Unicorn hoặc một số công cụ khác.

Khi bạn đóng shell của mình và đăng nhập lại vào máy chủ sản xuất, bạn sẽ đặt biến môi trường này và sẵn sàng sử dụng nó.

Và đó là nó! Tôi hy vọng hướng dẫn nhỏ này sẽ giúp bạn giải quyết lỗi này.

Tuyên bố miễn trừ trách nhiệm: Tôi không phải là chuyên gia về Linux hoặc Rails, vì vậy nếu bạn thấy có gì đó không đúng hoặc có bất kỳ lỗi nào, tôi sẽ vui lòng sửa nó.


11
Dường như, Rails không thấy biến môi trường SECRET_KEY_BASE. printenv cho thấy nó, sản xuất rails c cũng hiển thị nó, nếu tôi kiểm tra ENV. Nhưng, tôi không có tác dụng, khi tôi khởi động lại Unicorn. Cách duy nhất, hiện đang hoạt động, là dán trực tiếp vào
secret.yml

1
Điều này làm việc cho tôi. Cảm ơn bạn đã giải thích đầy đủ của bạn. Tôi mới biết rằng có những viên ngọc tồn tại để quản lý các biến môi trường của ứng dụng. 'Dotenv' là một và 'đốc công' cho heroku. Mặc dù cách giáo dục là sửa lỗi theo cách này, nhưng có thể sử dụng một trong những viên đá quý đó sẽ hợp lý hóa quy trình?
Nick Res

Tôi rất vui vì câu trả lời của tôi rất hữu ích, cảm ơn các tùy chọn đá quý @ ninja08, họ chắc chắn làm cho quá trình dễ dàng hơn, chủ yếu dành cho những người sử dụng capistrano hoặc công cụ gia tăng khác để quản lý máy chủ :)
Demi Magus

Theo hướng dẫn tuyệt vời của Demi Magus, tôi đã làm một cái gì đó như thế này: cd / var / www / rails; rvm sử dụng ext-rbx-2.5.2@rails; SKB_FILE = / var / www / .secret_key_base; echo "export SECRET_KEY_BASE = $ (RAILS_ENV = bí mật cào sản xuất)"> $ SKB_FILE; . $ SKB_FILE; tiếng vang ". $ SKB_FILE" | tee -a ~ / .bashrc ~ / .bash_profile; chmod o-rwx $ SKB_FILE;
David Winiecki

Câu trả lời tốt đẹp !! Tôi không biết lý do tại sao điều này không được giải quyết cho tôi, tôi tạo câu hỏi stackoverflow.com/questions/33117318/iêu
Adriano Resende

84

Tôi sẽ giả định rằng bạn không secrets.ymlkiểm tra nguồn của mình (ví dụ: nó có trong .gitignoretệp). Ngay cả khi đây không phải là tình huống của bạn, đó là điều mà nhiều người khác đang xem câu hỏi này đã làm vì mã của họ bị lộ trên Github và không muốn khóa bí mật của họ trôi nổi xung quanh.

Nếu nó không được kiểm soát nguồn, Heroku sẽ không biết về nó. Vì vậy, Rails đang tìm kiếm Rails.application.secrets.secret_key_basevà nó chưa được thiết lập vì Rails thiết lập nó bằng cách kiểm tra secrets.ymltệp không tồn tại. Cách giải quyết đơn giản là vào config/environments/production.rbtệp của bạn và thêm dòng sau:

Rails.application.configure do
    ...
    config.secret_key_base = ENV["SECRET_KEY_BASE"]
    ...
end

Điều này cho biết ứng dụng của bạn đặt khóa bí mật bằng cách sử dụng biến môi trường thay vì tìm kiếm nó secrets.yml. Nó sẽ giúp tôi tiết kiệm rất nhiều thời gian để biết điều này.


15
Đây là câu trả lời tốt nhất. Figaroheroku_secretsđừng làm bất cứ điều gì trừ khi Rails biết rằng SECRET_KEY_BASEsống trong đó ENV. Tôi đã phải vật lộn với suy nghĩ này rằng nếu var cấu hình tồn tại trên Heroku, Rails sẽ chọn nó chỉ nhờ vào sự tồn tại của nó, nhưng bây giờ có vẻ rõ ràng rằng Rails sẽ cần biết nơi để tìm. Tôi đã tự hỏi làm thế nào tôi có thể có mã trên Github mà không phải lo lắng về điều cơ bản bí mật; bây giờ tôi biết
flanger001

1
Đồng ý, tôi nghĩ rằng secret.yml là không cần thiết với những viên đá quý tuyệt vời như Figaro.
Joe

2
Có vẻ như là lựa chọn tốt nhất nếu bạn sử dụng github và heroku cho dự án của bạn.
flexus

1
Có gì sai khi cam kết bí mật của bạn production: secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>. Điều đó cũng không có nghĩa là khóa bí mật thực tế không bị lộ. Có rủi ro để lộ dev và khóa kiểm tra trong secret.yml đã cam kết nếu tất cả chỉ là dữ liệu thử nghiệm và hạt giống?
Jay Killeen

Điều này hoạt động ngay cả trong Rails 6.0.2, khi không còn secret.yml nữa.
Ken Tsoi

54

Thêm config/secrets.ymlvào kiểm soát phiên bản và triển khai lại. Bạn có thể cần xóa một dòng từ .gitignoređó để bạn có thể cam kết tệp.

Tôi đã có vấn đề chính xác tương tự và nó chỉ ra rằng .gitignoreGithub soạn sẵn được tạo cho ứng dụng Rails của tôi config/secrets.yml.


140
config / secret.yml KHÔNG BAO GIỜ nên ở trong repo mà bạn có thể làm.yml.sample và điền nó vào dữ liệu giả nhưng để bảo mật, đừng bao giờ làm .yml trong repos
user3379926 7/07/14

9
@ user3379926, trong ngữ cảnh của ứng dụng Rails trên Heroku, bạn không thể chọn và chọn tệp nào được bao gồm trong kiểm soát phiên bản và tệp nào không. Rails 4.1 hy vọng cấu hình bí mật tồn tại nếu không ứng dụng sẽ không chạy. Nếu bạn có cách giải quyết vấn đề được đặt ra trong Câu hỏi trên mà không cần dùng đến tệp secret.yml trong Git, vui lòng giúp cải thiện chủ đề này bằng cách cung cấp lời khuyên đó.
danielricecodes

9
@danielricecodes bạn có thể tự đặt giá trị trong trình khởi tạo. Một cái gì đó như Rails.application.config.secret_key_base = ENV["SECRET_KEY_BASE"]sẽ làm việc và loại bỏ lỗi mà không cần thêm secrets.ymlvào nguồn.
joshhepworth

11
@ user3379926: Khi tôi tạo một ứng dụng Rails mới với rails new(sản xuất, trong trường hợp này, Gemfile có railsgem có phiên bản 4.2.4), tệp config/secrets.ymlsẽ được tạo. Nó bao gồm các khóa bí mật được tạo trước cho các môi trường phát triển và thử nghiệm và đọc khóa bí mật cho môi trường sản xuất từ ​​một biến môi trường : secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>. Dường như với tôi rằng nó hoàn toàn an toàn và thực sự hữu ích, để giữ secrets.ymltệp này trong kiểm soát phiên bản, miễn là người ta không bao giờ thực sự xác định khóa bí mật ở đó.
Teemu Leisti

2
@jasonleonhard tại sao? nếu bạn đang đọc khóa bí mật từ env vars, thì vấn đề lớn là gì? không có bí mật nào được tiết lộ.
Horseyguy

13

Điều này làm việc cho tôi.

SSH vào máy chủ sản xuất của bạn và cdvào thư mục hiện tại của bạn, chạy bundle exec rake secrethoặc rake secret, bạn sẽ nhận được một chuỗi dài làm đầu ra, sao chép chuỗi đó.

Bây giờ chạy sudo nano /etc/environment.

Dán ở dưới cùng của tập tin

export SECRET_KEY_BASE=rake secret
ruby -e 'p ENV["SECRET_KEY_BASE"]'

Trường hợp rake secretchuỗi bạn vừa sao chép, dán chuỗi sao chép đó vào vị trí rake secret.

Khởi động lại máy chủ và kiểm tra bằng cách chạy echo $SECRET_KEY_BASE.


3

Mặc dù bạn có thể sử dụng các công cụ khởi tạo như các câu trả lời khác, cách Rails 4.1+ thông thường là sử dụng config/secrets.yml. Lý do để nhóm Rails giới thiệu điều này nằm ngoài phạm vi của câu trả lời này, nhưng TL; DR là secret_token.rbliên kết cấu hình và mã cũng như rủi ro bảo mật vì mã thông báo được kiểm tra trong lịch sử kiểm soát nguồn và hệ thống duy nhất cần phải biết mã thông báo bí mật sản xuất là cơ sở hạ tầng sản xuất.

Bạn nên thêm tệp này vào .gitignoregiống như bạn sẽ không thêm config/database.ymlvào kiểm soát nguồn.

Tham khảo mã riêng Heroku của lập config/database.ymltừ DATABASE_URLtrong họ Buildpack cho Ruby , tôi đã kết thúc forking repo của họ và sửa đổi nó để tạo ra config/secrets.ymltừ SECRETS_KEY_BASEbiến môi trường.

Vì tính năng này được giới thiệu trong Rails 4.1, tôi cảm thấy nó phù hợp để chỉnh sửa ./lib/language_pack/rails41.rbvà thêm chức năng này.

Sau đây là đoạn trích từ gói xây dựng đã sửa đổi mà tôi đã tạo tại công ty của mình:

class LanguagePack::Rails41 < LanguagePack::Rails4

  # ...

  def compile
    instrument "rails41.compile" do
      super
      allow_git do
        create_secrets_yml
      end
    end
  end

  # ...

  # writes ERB based secrets.yml for Rails 4.1+
  def create_secrets_yml
    instrument 'ruby.create_secrets_yml' do
      log("create_secrets_yml") do
        return unless File.directory?("config")
        topic("Writing config/secrets.yml to read from SECRET_KEY_BASE")
        File.open("config/secrets.yml", "w") do |file|
          file.puts <<-SECRETS_YML
<%
raise "No RACK_ENV or RAILS_ENV found" unless ENV["RAILS_ENV"] || ENV["RACK_ENV"]
%>

<%= ENV["RAILS_ENV"] || ENV["RACK_ENV"] %>:
  secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>
          SECRETS_YML
        end
      end
    end
  end

  # ...

end

Tất nhiên, bạn có thể mở rộng mã này để thêm các bí mật khác (ví dụ: khóa API của bên thứ ba, v.v.) để được đọc khỏi biến môi trường của bạn:

...
<%= ENV["RAILS_ENV"] || ENV["RACK_ENV"] %>:
  secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>
  third_party_api_key: <%= ENV["THIRD_PARTY_API"] %>

Bằng cách này, bạn có thể truy cập bí mật này theo một cách rất chuẩn:

Rails.application.secrets.third_party_api_key

Trước khi triển khai lại ứng dụng của bạn, hãy đảm bảo đặt biến môi trường của bạn trước: Đặt SECRET_KEY_BASE trong Bảng điều khiển Heroku

Sau đó, thêm gói xây dựng đã sửa đổi của bạn (hoặc bạn được chào đón để liên kết với tôi) vào ứng dụng Heroku của bạn (xem tài liệu của Heroku ) và triển khai lại ứng dụng của bạn.

Buildpack sẽ tự động tạo của bạn config/secrets.ymltừ biến môi trường của bạn như là một phần của quy trình xây dựng dyno mỗi khi bạn git pushđến Heroku.

EDIT: Tài liệu riêng của Heroku đề nghị tạo config/secrets.ymlđể đọc từ biến môi trường nhưng điều này ngụ ý bạn nên kiểm tra tệp này trong kiểm soát nguồn. Trong trường hợp của tôi, điều này không hoạt động tốt vì tôi có các bí mật được mã hóa cứng cho các môi trường phát triển và thử nghiệm mà tôi không muốn kiểm tra.


Trong khi một giải pháp tuyệt vời, đá quý .dotenv và .foreman giải quyết vấn đề này: "Tôi có các bí mật được mã hóa cứng cho môi trường phát triển và thử nghiệm" - vì vậy sử dụng các đá quý đó có nghĩa là bạn không cần buildpack vì bạn có thể sử dụng ENV_VAR trong tệp bí mật của mình cho dev và kiểm tra cũng
rmcsharry

Lưu ý rằng các biến môi trường được ghi lại bởi hầu hết các cơ sở hạ tầng, điều đó có nghĩa là các biến môi trường không được mã hóa sẽ ở dạng văn bản thuần trong nhật ký. Tôi không sử dụng Heroku cho các ứng dụng Rails của mình, vì vậy không có khuyến nghị nào cho nó, nhưng với AWS, chúng tôi lấy các giá trị được mã hóa từ Parameter Store trong quá trình xây dựng từ bên trong thùng chứa bản dựng và giải mã chúng để đưa vào các loại tài sản bảo mật này.
Daniel Nalbach

1

Bạn có thể xuất các khóa bí mật thành các biến môi trường trên ~/.bashrchoặc ~/.bash_profiletrên máy chủ của mình:

export SECRET_KEY_BASE = "YOUR_SECRET_KEY"

Và sau đó, bạn có thể nguồn .bashrchoặc .bash_profile:

source ~/.bashrc 
source ~/.bash_profile

Không bao giờ cam kết bí mật của bạn.yml


1

Trong trường hợp của tôi, vấn đề là config/master.keykhông nằm trong kiểm soát phiên bản và tôi đã tạo dự án trên một máy tính khác.

.Gitignore mặc định mà Rails tạo ra loại trừ tệp này. Vì không thể triển khai mà không có tệp này, nên nó cần được kiểm soát phiên bản, để có thể triển khai từ máy tính của bất kỳ thành viên nào trong nhóm.

Giải pháp: xóa config/master.keydòng khỏi .gitignore, xác nhận tệp từ máy tính nơi dự án được tạo và bây giờ bạn có thể git pulltrên máy tính khác và triển khai từ đó.

Mọi người đang nói không cam kết một số các tệp này để kiểm soát phiên bản, mà không đưa ra một giải pháp thay thế. Miễn là bạn không làm việc với một dự án nguồn mở, tôi thấy không có lý do gì để không cam kết mọi thứ cần thiết để chạy dự án, bao gồm cả thông tin đăng nhập.


Không bao giờ cam kết tập tin khóa chủ của bạn để git. Đây là một lỗ hổng bảo mật khổng lồ cho ứng dụng của bạn. Đối với nguồn mở, điều đó thật khó khăn, nhưng tạo một hầm mật khẩu bằng trình quản lý mật khẩu ưa thích của bạn là một lựa chọn tốt hơn.
wsizoo

Tại sao nó sẽ là một lỗ hổng bảo mật, nếu repo là riêng tư? Nếu một người không được ủy quyền có quyền truy cập vào repo riêng của tôi, thì tôi gặp vấn đề lớn hơn là chỉ bị rò rỉ khóa API. Không phải mọi dự án đều là nguồn mở.
Andrew Koster

Tôi cảm thấy như mọi người chỉ lặp lại điều này bởi vì họ đã thấy nó trong một hướng dẫn cho một dự án nguồn mở.
Andrew Koster

Toàn bộ điều này là thêm khó hiểu bởi vì có quá nhiều tài liệu lỗi thời về secrets.ymltập tin cũ , đã bị phản đối trong một số phiên bản Rails trước đây. Bản thân câu hỏi Stack Overflow này có rất nhiều câu trả lời và hầu như tất cả họ đều sử dụng API cổ này.
Andrew Koster

1

Đối với rails6, tôi đã gặp phải vấn đề tương tự, vì tôi bị thiếu các tệp sau, khi tôi thêm chúng, vấn đề đã được giải quyết:

1. config/master.key
2. config/credentials.yml.enc

Hãy chắc chắn rằng bạn có tập tin này. !!!


0

Tôi đã làm gì: Trên máy chủ sản xuất của mình, tôi tạo một tệp cấu hình (confthin.yml) cho Thin (Tôi đang sử dụng nó) và thêm thông tin sau:

environment: production
user: www-data
group: www-data
SECRET_KEY_BASE: mysecretkeyproduction

Sau đó tôi khởi chạy ứng dụng với

thin start -C /whereeveristhefieonprod/configthin.yml

Làm việc như một bùa mê và sau đó không cần phải có khóa bí mật về kiểm soát phiên bản

Hy vọng nó có thể giúp ích, nhưng tôi chắc chắn điều tương tự có thể được thực hiện với Unicorn và những người khác.


1
bạn có thể giải thích tại sao / làm thế nào điều này đang làm việc? Câu hỏi là dành cho heroku. Là mỏng thay thế, hoặc nó tương thích với heroku?
ahnbizcad

-1

Tôi có một bản vá mà tôi đã sử dụng trong ứng dụng Rails 4.1 để cho phép tôi tiếp tục sử dụng trình tạo khóa kế thừa (và do đó tương thích phiên ngược với Rails 3), bằng cách cho phép secret_key_base để trống.

Rails::Application.class_eval do
  # the key_generator will then use ActiveSupport::LegacyKeyGenerator.new(config.secret_token)
  fail "I'm sorry, Dave, there's no :validate_secret_key_config!" unless instance_method(:validate_secret_key_config!)
  def validate_secret_key_config! #:nodoc:
    config.secret_token = secrets.secret_token
    if config.secret_token.blank?
      raise "Missing `secret_token` for '#{Rails.env}' environment, set this value in `config/secrets.yml`"
    end 
  end 
end

Kể từ khi tôi định dạng lại các bản vá được gửi đến Rails dưới dạng Yêu cầu Kéo


-1

Tôi đã tạo config/initializers/secret_key.rbtập tin và tôi chỉ viết dòng mã sau:

Rails.application.config.secret_key_base = ENV["SECRET_KEY_BASE"]

Nhưng tôi nghĩ rằng giải pháp được đăng bởi @Erik Trautman thanh lịch hơn;)

Chỉnh sửa: Ồ, và cuối cùng tôi đã tìm thấy lời khuyên này trên Heroku: https://devcenter.heroku.com/changelog-items/426 :)

Thưởng thức!





-3

Tôi gặp vấn đề tương tự sau khi tôi sử dụng tệp .gitignore từ https://github.com/github/gitignore/blob/master/Rails.gitignore

Mọi thứ đều ổn sau khi tôi nhận xét các dòng sau trong tệp .gitignore.

config/initializers/secret_token.rb
config/secrets.yml

1
Như được lặp đi lặp lại ở mọi nơi, không nên dùng secret.yml hoặc secret_token.rb cho git.
cofiem
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.