From b98cef6e533b998c7f24f6f5e6177816ec63af42 Mon Sep 17 00:00:00 2001 From: Harald Eilertsen Date: Fri, 25 Jan 2013 22:59:21 +0100 Subject: Add deploy script to set up production database. --- config/deploy/database.rb | 158 +++++++++++++++++++++++++++++++++++++++ config/deploy/database.yml.mysql | 21 ++++++ 2 files changed, 179 insertions(+) create mode 100644 config/deploy/database.rb create mode 100644 config/deploy/database.yml.mysql (limited to 'config') diff --git a/config/deploy/database.rb b/config/deploy/database.rb new file mode 100644 index 0000000..68236d1 --- /dev/null +++ b/config/deploy/database.rb @@ -0,0 +1,158 @@ +# +# = Capistrano database.yml task +# +# Provides a couple of tasks for creating the database.yml +# configuration file dynamically when deploy:setup is run. +# +# Category:: Capistrano +# Package:: Database +# Author:: Simone Carletti +# Copyright:: 2007-2010 The Authors +# License:: MIT License +# Link:: http://www.simonecarletti.com/ +# Source:: http://gist.github.com/2769 +# +# +# == Requirements +# +# This extension requires the original config/database.yml to be excluded +# from source code checkout. You can easily accomplish this by renaming +# the file (for example to database.example.yml) and appending database.yml +# value to your SCM ignore list. +# +# # Example for Subversion +# +# $ svn mv config/database.yml config/database.example.yml +# $ svn propset svn:ignore 'database.yml' config +# +# # Example for Git +# +# $ git mv config/database.yml config/database.example.yml +# $ echo 'config/database.yml' >> .gitignore +# +# +# == Usage +# +# Include this file in your deploy.rb configuration file. +# Assuming you saved this recipe as capistrano_database_yml.rb: +# +# require "capistrano_database_yml" +# +# Now, when deploy:setup is called, this script will automatically +# create the database.yml file in the shared folder. +# Each time you run a deploy, this script will also create a symlink +# from your application config/database.yml pointing to the shared configuration file. +# +# == Custom template +# +# By default, this script creates an exact copy of the default +# database.yml file shipped with a new Rails 2.x application. +# If you want to overwrite the default template, simply create a custom Erb template +# called database.yml.erb and save it into config/deploy folder. +# +# Although the name of the file can't be changed, you can customize the directory +# where it is stored defining a variable called :template_dir. +# +# # store your custom template at foo/bar/database.yml.erb +# set :template_dir, "foo/bar" +# +# # example of database template +# +# base: &base +# adapter: sqlite3 +# timeout: 5000 +# development: +# database: #{shared_path}/db/development.sqlite3 +# <<: *base +# test: +# database: #{shared_path}/db/test.sqlite3 +# <<: *base +# production: +# adapter: mysql +# database: #{application}_production +# username: #{user} +# password: #{Capistrano::CLI.ui.ask("Enter MySQL database password: ")} +# encoding: utf8 +# timeout: 5000 +# +# Because this is an Erb template, you can place variables and Ruby scripts +# within the file. +# For instance, the template above takes advantage of Capistrano CLI +# to ask for a MySQL database password instead of hard coding it into the template. +# +# === Password prompt +# +# For security reasons, in the example below the password is not +# hard coded (or stored in a variable) but asked on setup. +# I don't like to store passwords in files under version control +# because they will live forever in your history. +# This is why I use the Capistrano::CLI utility. +# + +unless Capistrano::Configuration.respond_to?(:instance) + abort "This extension requires Capistrano 2" +end + +Capistrano::Configuration.instance.load do + + namespace :deploy do + + namespace :db do + + desc <<-DESC + Creates the database.yml configuration file in shared path. + + By default, this task uses a template unless a template \ + called database.yml.erb is found either is :template_dir \ + or /config/deploy folders. The default template matches \ + the template for config/database.yml file shipped with Rails. + + When this recipe is loaded, db:setup is automatically configured \ + to be invoked after deploy:setup. You can skip this task setting \ + the variable :skip_db_setup to true. This is especially useful \ + if you are using this recipe in combination with \ + capistrano-ext/multistaging to avoid multiple db:setup calls \ + when running deploy:setup for all stages one by one. + DESC + task :setup, :except => { :no_release => true } do + + default_template = <<-EOF + base: &base + adapter: sqlite3 + timeout: 5000 + development: + database: #{shared_path}/db/development.sqlite3 + <<: *base + test: + database: #{shared_path}/db/test.sqlite3 + <<: *base + production: + database: #{shared_path}/db/production.sqlite3 + <<: *base + EOF + + location = fetch(:template_dir, "config/deploy") + '/database.yml.mysql' + template = File.file?(location) ? File.read(location) : default_template + + config = ERB.new(template) + + run "mkdir -p #{shared_path}/db" + run "mkdir -p #{shared_path}/config" + put config.result(binding), "#{shared_path}/config/database.yml" + end + + desc <<-DESC + [internal] Updates the symlink for database.yml file to the just deployed release. + DESC + task :symlink, :except => { :no_release => true } do + run "ln -nfs #{shared_path}/config/database.yml #{release_path}/config/database.yml" + end + + end + + after "deploy:setup", "deploy:db:setup" unless fetch(:skip_db_setup, false) + after "deploy:finalize_update", "deploy:db:symlink" + + end + +end diff --git a/config/deploy/database.yml.mysql b/config/deploy/database.yml.mysql new file mode 100644 index 0000000..ce28c6a --- /dev/null +++ b/config/deploy/database.yml.mysql @@ -0,0 +1,21 @@ +development: &development + adapter: mysql2 + host: localhost + username: root + password: + database: your_local_database + +test: &test + adapter: mysql2 + host: localhost + username: root + password: + database: your_test_database + +production: &production + adapter: mysql2 + host: localhost + database: religionsfrihet_i_praksis + username: rip_admin + password: <%= Capistrano::CLI.ui.ask("Enter MySQL password: ") %> + encoding: utf8 -- cgit v1.2.3