I'm deploying my rails app with Capistrano. I want to save some API keys on the server as an environment variable. Those API keys should be accessible to my rails app that is deployed with Capistrano. Those API keys should also be accessible to a separate ruby file that is run as a daemon.
setting the API keys in environment variables seems like the ideal solution, however, I can't access them in my rails app with ENV["SOME_KEY"]
.
According to this post, because capistrano runs as non interactive and non login, ~/.bashrc
and ~/.bash_profile
are not loaded. The flowchart suggests that I should use $BASH_ENV
.
Can I just add my api keys in $BASH_ENV
and access them in my rails app and in the ruby file that is a daemon with ENV["SOME_KEY"]
?
I'm also thinking of just adding the api keys to a file somewhere on the server and symlinking it to the ruby file dir and rails dir and just open and reading it. Would this be possible?
Environment variables are character strings of the form "name=value". There are two types of environment variables: Job-level environment variables. The job-level environment variables are stored in an environment space outside of the program associated with the job.
The ENV class stands for environment variables. Environment variables are used to store secrets, variables, or configurations that we don't want the public to know in our applications. They could be a database URL, API keys, and so on. The form of an environment variable is a key/value pair.
The ENV hash in your Rails application is set when your Rails application starts. Rails loads into ENV any environment variables stored in your computer and any other key-value pairs you add using Figaro gem.
There are a few ways that work well with Capistrano, in my experience.
rbenv-vars
If you use Ruby via Rbenv on your server, then you are in luck. There is a Rbenv plugin called rbenv-vars that automatically injects environment variables into any Ruby process, which would include your Rails app. Just add your variables to ~/.rbenv/vars
on the server using KEY=value
syntax. That's it.
dotenv
The dotenv gem is a similar solution, but it works as a gem you add to your Rails app and doesn't require Rbenv or any other supporting tools. Add dotenv-rails
to your Gemfile and deploy. Dotenv will automatically look for a .env.production
file in the root of your Rails app. For Capistrano, create a .env.production
file on the server inside Capistrano's shared
directory, and then add .env.production
to :linked_files
. Now every deploy will link to it. Declare your variables using KEY=value
syntax.
.bashrc
Declare your variables with export KEY=value
syntax at very top of the ~/.bashrc
file on the server. On Ubuntu, this file is evaluated even during an non-interactive SSH session. Just make sure you place the declarations on the top, before this case statement:
# If not running interactively, don't do anything
case $- in
*i*) ;;
*) return;;
esac
CentOS may be a different story, so YMMV.
I made a Capistrano plugin capistrano-env_config
some time ago for managing and syncing environment variables across a Capistrano cluster which works by modifying the /etc/environment
file to make environment variables available throughout the system. It's easy to use and is similar to how you can set environment variables with the Heroku toolbelt. Here are some examples:
cap env:list
cap env:get[VARIABLE_NAME, VARIABLE_NAME, ...]
cap env:unset[VARIABLE_NAME, VARIABLE_NAME, ...]
cap env:set[VARIABLE_NAME=VALUE, VARIABLE_NAME=VALUE, ...]
cap env:sync
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With