From 24049c2c1dd8ac56c5d94f3ff0a57181755204da Mon Sep 17 00:00:00 2001 From: Andrew Cantino Date: Sun, 31 Mar 2013 22:08:54 -0700 Subject: [PATCH] make more things configurable with .env and pull out deployment defaults --- .env.example | 39 +++++++++++++++++-- Gemfile | 7 ---- Gemfile.lock | 28 ------------- README.md | 30 +------------- app/models/user.rb | 2 +- config/database.yml | 32 +++++++-------- config/environments/development.rb | 14 +++---- config/environments/production.rb | 14 +++---- .../deployment/backup}/example_backup.rb | 18 +++------ .../deployment/capistrano}/deploy.rb | 28 ++++++++----- .../deployment}/nginx/production.conf | 0 .../deployment}/unicorn/production.rb | 0 12 files changed, 93 insertions(+), 119 deletions(-) rename {config => doc/deployment/backup}/example_backup.rb (77%) rename {config => doc/deployment/capistrano}/deploy.rb (58%) rename {config => doc/deployment}/nginx/production.conf (100%) rename {config => doc/deployment}/unicorn/production.rb (100%) diff --git a/.env.example b/.env.example index d538f438..758fc8fe 100644 --- a/.env.example +++ b/.env.example @@ -1,6 +1,37 @@ +# ==== Required configuration settings for Huginn ==== + +# Replace the following with the output from "rake secret" APP_SECRET_TOKEN=REPLACE_ME_NOW! + +# This is the domain where your Huginn instance will be running. The default should work +# for development, but it needs to be changed when you deploy to a production environment. DOMAIN=localhost:3000 -GOOGLE_APPS_DOMAIN=your-domain-here.com -GMAIL_USERNAME=you@gmail.com -GMAIL_PASSWORD=somepassword -EMAIL_FROM_ADDRESS=from_address@gmail.com \ No newline at end of file + +# Database Setup +DATABASE_ADAPTER=mysql2 +DATABASE_ENCODING=utf8 +DATABASE_RECONNECT=true +DATABASE_NAME=huginn_development +DATABASE_POOL=5 +DATABASE_USERNAME=root +DATABASE_PASSWORD= +DATABASE_SOCKET=/tmp/mysql.sock + +# ==== Additional required production settings ==== + +# Outgoing email settings. To use Gmail or Google Apps, put your Google Apps domain or gmail.com +# as the SMTP_DOMAIN and your Gmail username and password as the SMTP_USER_NAME and SMTP_PASSWORD. +SMTP_DOMAIN=your-domain-here.com +SMTP_USER_NAME=you@gmail.com +SMTP_PASSWORD=somepassword +SMTP_SERVER=smtp.gmail.com +SMTP_PORT=587 +SMTP_AUTHENTICATION=plain +SMTP_ENABLE_STARTTLS_AUTO=true + +# The address from which system emails will appear to be sent. +EMAIL_FROM_ADDRESS=from_address@gmail.com + +# This invitation code will be required for users to signup with your Huginn installation. +# You can see its use in user.rb. +INVITATION_CODE=try-huginn diff --git a/Gemfile b/Gemfile index 18037906..51827b51 100644 --- a/Gemfile +++ b/Gemfile @@ -40,14 +40,7 @@ platforms :ruby_18 do gem 'fastercsv' end -group :production do - gem 'unicorn' -end - group :development do - gem 'capistrano' - gem 'capistrano-unicorn', :require => false - gem 'rvm-capistrano' gem 'pry' end diff --git a/Gemfile.lock b/Gemfile.lock index 1facf319..079d6d52 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -44,14 +44,6 @@ GEM bootstrap-sass (2.3.0.1) sass (~> 3.2) builder (3.0.4) - capistrano (2.14.2) - highline - net-scp (>= 1.0.0) - net-sftp (>= 2.0.0) - net-ssh (>= 2.0.14) - net-ssh-gateway (>= 1.1.0) - capistrano-unicorn (0.1.6) - capistrano coderay (1.0.9) coffee-rails (3.2.2) coffee-script (>= 2.2.0) @@ -103,7 +95,6 @@ GEM rails (~> 3.0) haml (4.0.0) tilt - highline (1.6.15) hike (1.2.1) http_parser.rb (0.5.3) httparty (0.10.2) @@ -123,7 +114,6 @@ GEM kaminari (0.14.1) actionpack (>= 3.0.0) activesupport (>= 3.0.0) - kgio (2.8.0) kramdown (0.14.2) mail (2.4.4) i18n (>= 0.4.0) @@ -136,13 +126,6 @@ GEM multipart-post (1.2.0) mysql2 (0.3.11) nested_form (0.3.1) - net-scp (1.0.4) - net-ssh (>= 1.99.1) - net-sftp (2.1.1) - net-ssh (>= 2.6.5) - net-ssh (2.6.6) - net-ssh-gateway (1.2.0) - net-ssh (>= 2.6.5) nokogiri (1.5.6) orm_adapter (0.4.0) polyglot (0.3.3) @@ -190,7 +173,6 @@ GEM rake (>= 0.8.7) rdoc (~> 3.4) thor (>= 0.14.6, < 2.0) - raindrops (0.10.0) rake (10.0.3) rdoc (3.12.2) json (~> 1.4) @@ -213,8 +195,6 @@ GEM rspec-mocks (~> 2.13.0) rufus-scheduler (2.0.18) tzinfo (>= 0.3.23) - rvm-capistrano (1.2.7) - capistrano (>= 2.0.0) safe_yaml (0.8.4) sass (3.2.7) sass-rails (3.2.6) @@ -251,10 +231,6 @@ GEM uglifier (1.3.0) execjs (>= 0.3.0) multi_json (~> 1.0, >= 1.0.2) - unicorn (4.6.2) - kgio (~> 2.6) - rack - raindrops (~> 0.7) warden (1.2.1) rack (>= 1.0) webmock (1.11.0) @@ -270,8 +246,6 @@ PLATFORMS DEPENDENCIES bootstrap-kaminari-views - capistrano - capistrano-unicorn coffee-rails (~> 3.2.1) daemons delayed_job! @@ -296,7 +270,6 @@ DEPENDENCIES rspec rspec-rails rufus-scheduler - rvm-capistrano sass-rails (~> 3.2.3) select2-rails system_timer @@ -304,6 +277,5 @@ DEPENDENCIES twitter-stream (>= 0.1.16) typhoeus uglifier (>= 1.0.3) - unicorn webmock wunderground diff --git a/README.md b/README.md index d73bb9ef..881a32fb 100644 --- a/README.md +++ b/README.md @@ -39,12 +39,9 @@ And now, some example screenshots. Below them are instructions to get you start If you just want to play around, you can simply clone this repository, then perform the following steps: -* Copy .env.example to .env `cp .env.example .env` -* Edit the configuration options in .env -* Edit the APP_SECRET_TOKEN environment variable and replace `REPLACE_ME_NOW!` with the output of `rake secret`. +* Copy `.env.example` to `.env` (`cp .env.example .env`) and edit `.env`, at least updating the `APP_SECRET_TOKEN` variable. * Run `rake db:create`, `rake db:migrate`, and then `rake db:seed` to create a development MySQL database with some example seed data. * Run `foreman start`, visit `http://localhost:5000`, and login with the username of `admin` and the password of `password`. -* Make some extra Terminal windows and run `bundle exec rails runner bin/schedule.rb`, `bundle exec rails runner bin/twitter_stream.rb`, and `script/delayed_job run` in separate windows. * Setup some Agents! ### Real Start @@ -70,26 +67,7 @@ Follow these instructions if you wish to deploy your own version of Huginn or co ## Deployment -Deployment right now is configured with Capistrano, Unicorn, and nginx. You should feel free to deploy in a different way, however, and please submit your deployment solutions back! - -### Required Setup - -In your private copy of Huginn, do the following: - -* Edit `app/models/user.rb` and change the invitation code(s) in `INVITATION_CODES`. This controls who can signup to use your installation. -* Edit `app/mailers/system_mailer.rb` and set your default from address. -* Edit `config/environments/production.rb` and change the value of `DOMAIN` and the `config.action_mailer.smtp_settings` setup, which is currently setup for sending email through a Google Apps account on Gmail. -* Setup a place for Huginn to run. I recommend making a dedicated user on your server for Huginn, but this is not required. Setup nginx or Apache to proxy pass to unicorn. There is an example nginx script in `config/nginx/production.conf`. -* Setup a production MySQL database for your installation. -* Edit `config/unicorn/production.rb` and replace instances of *you* with the correct username for your server. -* Edit `config/deploy.rb` and change all instances of `you` and `yourdomain` to the appropriate values for your server setup. If you want RVM to be used and installed, uncomment the appropriate lines. Then, run `cap deploy:setup` followed by `cap deploy`. If everything goes well, this should start some unicorn workers on your server to run the Huginn web app. -* After deploying with capistrano, SSH into your server, go to the deployment directory, and run `RAILS_ENV=production bundle exec rake db:seed` to generate your admin user. Immediately login to your new Huginn installation with the username of `admin` and the password of `password` and change your email and password! -* You'll need to run bin/schedule.rb and bin/twitter_stream.rb in a daemonized way. I've just been using screen sessions, but please contribute something better! - - - RAILS_ENV=production bundle exec rails runner bin/schedule.rb - RAILS_ENV=production bundle exec rails runner bin/twitter_stream.rb - +Please see [the Huginn Wiki](https://github.com/cantino/huginn/wiki#deploying-huginn) for detailed deployment strategies for different providers. ### Optional Setup @@ -111,10 +89,6 @@ You can use [Post Location](https://github.com/cantino/post_location) on your iP We assume your deployment will run over SSL. This is a very good idea! However, if you wish to turn this off, you'll probably need to edit `config/initializers/devise.rb` and modify the line containing `config.rememberable_options = { :secure => true }`. You will also need to edit `config/environments/production.rb` and modify the value of `config.force_ssl`. -#### Setup Backups - -Checkout `config/example_backup.rb` for an example script that you can use with the Backup gem. - ## License Huginn is provided under the MIT License. diff --git a/app/models/user.rb b/app/models/user.rb index 1ff237f5..433fc102 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -5,7 +5,7 @@ class User < ActiveRecord::Base devise :database_authenticatable, :registerable, :recoverable, :rememberable, :trackable, :validatable, :lockable - INVITATION_CODES = %w[try-huginn] + INVITATION_CODES = [ENV['INVITATION_CODE'] || 'try-huginn'] # Virtual attribute for authenticating by either username or email # This is in addition to a real persisted field like 'username' diff --git a/config/database.yml b/config/database.yml index 6099ad3a..cb71c0d1 100644 --- a/config/database.yml +++ b/config/database.yml @@ -1,12 +1,12 @@ development: - adapter: mysql2 - database: huginn_development - username: root - password: - socket: <%= ["/var/run/mysqld/mysqld.sock", "/opt/local/var/run/mysql5/mysqld.sock", "/tmp/mysql.sock"].find{ |path| File.exist? path } %> - encoding: utf8 - reconnect: true - pool: 5 + adapter: <%= ENV['DATABASE_ADAPTER'] || "mysql2" %> + encoding: <%= ENV['DATABASE_ENCODING'] || "utf8" %> + reconnect: <%= ENV['DATABASE_RECONNECT'] || "true" %> + database: <%= ENV['DATABASE_NAME'] || "huginn_development" %> + pool: <%= ENV['DATABASE_POOL'] || "5" %> + username: <%= ENV['DATABASE_USERNAME'] || "root" %> + password: <%= ENV['DATABASE_PASSWORD'] || "" %> + socket: <%= ENV['DATABASE_SOCKET'] || ["/var/run/mysqld/mysqld.sock", "/opt/local/var/run/mysql5/mysqld.sock", "/tmp/mysql.sock"].find{ |path| File.exist? path } %> # Warning: The database defined as "test" will be erased and # re-generated from your development database when you run "rake". @@ -22,11 +22,11 @@ test: pool: 5 production: - adapter: mysql2 - encoding: utf8 - reconnect: true - database: huginn_production - pool: 5 - username: root - password: password - socket: /var/run/mysqld/mysqld.sock \ No newline at end of file + adapter: <%= ENV['DATABASE_ADAPTER'] || "mysql2" %> + encoding: <%= ENV['DATABASE_ENCODING'] || "utf8" %> + reconnect: <%= ENV['DATABASE_RECONNECT'] || "true" %> + database: <%= ENV['DATABASE_NAME'] || "huginn_production" %> + pool: <%= ENV['DATABASE_POOL'] || "5" %> + username: <%= ENV['DATABASE_USERNAME'] || "root" %> + password: <%= ENV['DATABASE_PASSWORD'] || "password" %> + socket: <%= ENV['DATABASE_SOCKET'] || ["/var/run/mysqld/mysqld.sock", "/opt/local/var/run/mysql5/mysqld.sock", "/tmp/mysql.sock"].find{ |path| File.exist? path } %> \ No newline at end of file diff --git a/config/environments/development.rb b/config/environments/development.rb index 3cdbb927..c038863a 100644 --- a/config/environments/development.rb +++ b/config/environments/development.rb @@ -38,12 +38,12 @@ Huginn::Application.configure do config.action_mailer.raise_delivery_errors = true config.action_mailer.delivery_method = :smtp config.action_mailer.smtp_settings = { - address: "smtp.gmail.com", - port: 587, - domain: ENV['GOOGLE_APPS_DOMAIN'], - authentication: "plain", - enable_starttls_auto: true, - user_name: ENV['GMAIL_USERNAME'], - password: ENV['GMAIL_PASSWORD'] + address: ENV['SMTP_SERVER'] || 'smtp.gmail.com', + port: ENV['SMTP_PORT'] || 587, + domain: ENV['SMTP_DOMAIN'], + authentication: ENV['SMTP_AUTHENTICATION'] || 'plain', + enable_starttls_auto: ENV['SMTP_ENABLE_STARTTLS_AUTO'] == 'true' ? true : false, + user_name: ENV['SMTP_USER_NAME'], + password: ENV['SMTP_PASSWORD'] } end \ No newline at end of file diff --git a/config/environments/production.rb b/config/environments/production.rb index 422dd1fc..ff60b479 100644 --- a/config/environments/production.rb +++ b/config/environments/production.rb @@ -68,12 +68,12 @@ Huginn::Application.configure do config.action_mailer.raise_delivery_errors = true config.action_mailer.delivery_method = :smtp config.action_mailer.smtp_settings = { - address: "smtp.gmail.com", - port: 587, - domain: ENV['GOOGLE_APPS_DOMAIN'], - authentication: "plain", - enable_starttls_auto: true, - user_name: ENV['GMAIL_USERNAME'], - password: ENV['GMAIL_PASSWORD'] + address: ENV['SMTP_SERVER'] || 'smtp.gmail.com', + port: ENV['SMTP_PORT'] || 587, + domain: ENV['SMTP_DOMAIN'], + authentication: ENV['SMTP_AUTHENTICATION'] || 'plain', + enable_starttls_auto: ENV['SMTP_ENABLE_STARTTLS_AUTO'] == 'true' ? true : false, + user_name: ENV['SMTP_USER_NAME'], + password: ENV['SMTP_PASSWORD'] } end \ No newline at end of file diff --git a/config/example_backup.rb b/doc/deployment/backup/example_backup.rb similarity index 77% rename from config/example_backup.rb rename to doc/deployment/backup/example_backup.rb index 3f89001c..fec08ea5 100644 --- a/config/example_backup.rb +++ b/doc/deployment/backup/example_backup.rb @@ -10,23 +10,17 @@ # You'll also need to install the backup gem on your server, as well as the net-ssh, excon, net-scp, and fog gems. -database_yml = '/home/you/app/current/config/database.yml' -rails_env = ENV['RAILS_ENV'] || 'production' - -require 'yaml' -config = YAML.load_file(database_yml) - Backup::Model.new(:huginn_backup, 'The Huginn backup configuration') do split_into_chunks_of 4000 database MySQL do |database| - database.name = config[rails_env]["database"] - database.username = config[rails_env]["username"] - database.password = config[rails_env]["password"] - database.host = config[rails_env]["host"] - database.port = config[rails_env]["port"] - database.socket = config[rails_env]["socket"] + database.name = "your-database-name" + database.username = "your-database-username" + database.password = "your-database-password" + database.host = "your-database-host" + database.port = "your-database-port" + database.socket = "your-database-socket" database.additional_options = ['--single-transaction', '--quick', '--hex-blob', '--add-drop-table'] end diff --git a/config/deploy.rb b/doc/deployment/capistrano/deploy.rb similarity index 58% rename from config/deploy.rb rename to doc/deployment/capistrano/deploy.rb index 1176b32c..e390cee8 100644 --- a/config/deploy.rb +++ b/doc/deployment/capistrano/deploy.rb @@ -25,21 +25,31 @@ after 'deploy', 'deploy:cleanup' set :bundle_without, [:development, :test] -after "deploy:stop", "delayed_job:stop" -after "deploy:start", "delayed_job:start" -after "deploy:restart", "delayed_job:restart" +after 'deploy:stop', 'delayed_job:stop' +after 'deploy:start', 'delayed_job:start' +after 'deploy:restart', 'delayed_job:restart' +after 'deploy:update_code', 'deploy:symlink_env_config' + +namespace :deploy do + desc 'Link the environment file from shared/config/.env into the new deploy directory' + task :symlink_env_config, :roles => :app do + run <<-CMD + cd #{latest_release} && ln -nfs #{shared_path}/config/.env #{latest_release}/.env + CMD + end +end # If you want to use command line options, for example to start multiple workers, # define a Capistrano variable delayed_job_args: # # set :delayed_job_args, "-n 2" -# If you want to use rvm on the server: -# set :rvm_ruby_string, '1.9.3-p286@huginn' -# set :rvm_type, :user -# before 'deploy', 'rvm:install_rvm' -# before 'deploy', 'rvm:install_ruby' -# require "rvm/capistrano" +# If you want to use rvm on your server and have it maintained by Capistrano, uncomment these lines: +# set :rvm_ruby_string, '1.9.3-p286@huginn' +# set :rvm_type, :user +# before 'deploy', 'rvm:install_rvm' +# before 'deploy', 'rvm:install_ruby' +# require "rvm/capistrano" # Load Capistrano additions Dir[File.expand_path("../../lib/capistrano/*.rb", __FILE__)].each{|f| load f } diff --git a/config/nginx/production.conf b/doc/deployment/nginx/production.conf similarity index 100% rename from config/nginx/production.conf rename to doc/deployment/nginx/production.conf diff --git a/config/unicorn/production.rb b/doc/deployment/unicorn/production.rb similarity index 100% rename from config/unicorn/production.rb rename to doc/deployment/unicorn/production.rb