Переменные окружения (environment variables) — важный механизм для настройки приложений и передачи параметров в runtime. Рассмотрим их использование в Ruby-приложениях.
# Базовый способ
db_host = ENV['DB_HOST']
# С значением по умолчанию
db_port = ENV.fetch('DB_PORT', '5432')
# Проверка наличия
unless ENV.key?('API_KEY')
raise "Не задан API_KEY в переменных окружения"
end
ENV['TMP_DIR'] = '/tmp/custom'
puts ENV['TMP_DIR'] # => "/tmp/custom"
ActiveRecord::Base.establish_connection(
adapter: ENV.fetch('DB_ADAPTER', 'postgresql'),
host: ENV['DB_HOST'],
database: ENV['DB_NAME'],
username: ENV['DB_USER'],
password: ENV['DB_PASSWORD'],
port: ENV.fetch('DB_PORT', '5432')
)
class AppConfig
def self.max_upload_size
ENV.fetch('MAX_UPLOAD_SIZE', '100').to_i * 1024 * 1024
end
def self.debug_mode?
ENV['DEBUG'] == 'true'
end
end
def get_required_env(var_name)
ENV.fetch(var_name) do
raise ArgumentError, "Необходимо задать #{var_name} в переменных окружения"
end
end
api_key = get_required_env('API_KEY')
# Никогда не логируйте секретные данные!
logger.info("Using API key: #{ENV['API_KEY']}") # ПЛОХО
logger.info("Using API key: [FILTERED]") # ХОРОШО
# Установите gem 'dotenv-rails' для Rails или 'dotenv' для других проектов
require 'dotenv'
Dotenv.load('.env.local', '.env') # Загружает файлы по порядку
# Теперь переменные доступны в ENV
puts ENV['SECRET_KEY']
Формат .env файла:
DB_HOST=localhost
DB_USER=app_user
DB_PASS=s3cr3t
# config/environments/production.env
REDIS_URL=redis://prod.example.com:6379/1
# config/environments/development.env
REDIS_URL=redis://localhost:6379/1
Dockerfile пример:
FROM ruby:3.2
ENV RAILS_ENV=production
COPY . /app
CMD ["rails", "server"]
Запуск с переменными:
docker run -e "DB_HOST=db.example.com" my_app
module AppEnv
module_function
def database_url
ENV.fetch('DATABASE_URL') do
"#{ENV['DB_ADAPTER']}://#{ENV['DB_USER']}:#{ENV['DB_PASSWORD']}@#{ENV['DB_HOST']}/#{ENV['DB_NAME']}"
end
end
def production?
ENV['RACK_ENV'] == 'production' || ENV['RAILS_ENV'] == 'production'
end
end
module EnvParser
module_function
def string(key, default = nil)
ENV.fetch(key, default)
end
def integer(key, default = 0)
ENV[key]&.to_i || default
end
def boolean(key, default = false)
val = ENV[key]
val.nil? ? default : val.downcase == 'true'
end
end
Переменные окружения в Ruby предоставляют гибкий механизм конфигурации:
ENV
fetch
со значениями по умолчаниюdotenv
Правильное использование переменных окружения делает приложения более: