If you're working on an open source project, committing API keys or secrets to your repo is a big no-no. You wouldn't want anyone else making request with your keys, right?
So instead of putting those keys in app/config/initializers set then as environment variables in your shell. Here's an example for a Facebook API key:
export FB_API_KEY=3629346238763284623874623
Then in your app, load the variable via your environment:
Facebook::Api::KEY = ENV['FB_API_KEY']
All environment variables are available via the constant ENV
. You can see all the currently set environment variables in your shell by running the command env
:
$ env
SHELL=/opt/boxen/homebrew/bin/zsh
HOME=/Users/nate
USER=nate
LOGNAME=nate
DISPLAY=/tmp/launch-GHgzYV/org.macosforge.xquartz:0
COMMAND_MODE=unix2003
__CF_USER_TEXT_ENCODING=0x1F5:0:0
TERM_PROGRAM=iTerm.app
COLORFGBG=7;0
LANG=en_US.UTF-8
ITERM_PROFILE=Default
TERM=xterm-color
FB_API_KEY=3629346238763284623874623
Remembering to set a collection of environment variables locally can be a real pain. What if you open a new shell? Time to set each variable again! Ain't nobody got time for that!
dotenv is a great Ruby gem that automatically loads in keys & values from a yaml file, making them available via the ENV
hash we used earlier. With dotenv, you'll set all of your config in a file .env
. Don't commit this file (add it to your .gitignore).
On the server, you'll need to repeat the same process, setting the necessary environment variables. You might decide to edit the .bash_profile
or .bashrc
for the user that runs your app.
Heroku doesn't give you access to a shell, but they do provide a mechanism for setting environment variables:
heroku config:set FB_API_KEY=3629346238763284623874623
You can see all the environment variables currently set for your app by running heroku config
$ heroku config
FB_API_KEY: 3629346238763284623874623
See the following article for more details on setting and managing environment variables with Heroku Configuration and Config Vars
If you've already committed sensitive data to your repo, here's a helpful article on how to remove it: Remove Sensitive Data
Be very careful with removing data from a Git repo. Work on a separate branch of course and have a peer review your commit before pushing/merging any changes.