Skip to content

Instantly share code, notes, and snippets.

@zhangyuan
Last active November 9, 2020 06:44

Revisions

  1. zhangyuan revised this gist Mar 27, 2014. 1 changed file with 2 additions and 0 deletions.
    2 changes: 2 additions & 0 deletions rails3_template.rb
    Original file line number Diff line number Diff line change
    @@ -73,6 +73,8 @@
    gem 'better_errors'
    end

    run "bundle"

    run "cp config/database.yml config/database.yml.example"

    generate("rails_config:install")
  2. zhangyuan revised this gist Mar 27, 2014. 1 changed file with 2 additions and 1 deletion.
    3 changes: 2 additions & 1 deletion rails3_template.rb
    Original file line number Diff line number Diff line change
    @@ -1,3 +1,4 @@
    # encoding: utf-8
    git :init

    remove_file ".gitignore"
    @@ -116,7 +117,7 @@
    gzip_http_version 1.1;
    gzip_vary on;
    gzip_comp_level 6;
    gzip_disable MSIE [1-6].(?!.*SV1);
    gzip_disable "MSIE [1-6].(?!.*SV1)";
    location / {
    proxy_set_header Host $host;
  3. zhangyuan revised this gist Feb 24, 2014. 1 changed file with 0 additions and 1 deletion.
    1 change: 0 additions & 1 deletion rails3_template.rb
    Original file line number Diff line number Diff line change
    @@ -55,7 +55,6 @@
    gem 'kaminari-bootstrap', '~> 3.0.1'
    gem 'capistrano', '~> 3.0.1', require: false
    gem 'capistrano-bundler', require: false
    gem 'jbuilder'

    gem_group :development, :test do
    gem 'rspec-rails'
  4. zhangyuan created this gist Jan 26, 2014.
    611 changes: 611 additions & 0 deletions rails3_template.rb
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,611 @@
    git :init

    remove_file ".gitignore"

    file '.gitignore', <<-IGNORE
    *.rbc
    *.sassc
    .sass-cache
    capybara-*.html
    .rspec
    /log
    /tmp
    /db/*.sqlite3
    /public/system
    /coverage/
    /spec/tmp
    **.orig
    rerun.txt
    pickle-email-*.html
    config/secrets.yml
    ## Environment normalisation:
    /.bundle
    /vendor/bundle
    # these should all be checked in to normalise the environment:
    # Gemfile.lock, .ruby-version, .ruby-gemset
    *.swo
    *.swp
    db/schema.rb
    config/settings.local.yml
    config/settings/*.local.yml
    config/environments/*.local.yml
    public/uploads/
    config/database.yml
    public/assets
    config/unicorn.rb
    config/nginx.conf
    config/unicorn_init
    /tags
    IGNORE

    remove_file "app/assets/images/rails.png"

    gem 'slim-rails'
    gem 'rails_config'
    gem 'carrierwave'
    gem 'mini_magick'
    gem 'unicorn', require: false
    gem 'kaminari-bootstrap', '~> 3.0.1'
    gem 'capistrano', '~> 3.0.1', require: false
    gem 'capistrano-bundler', require: false
    gem 'jbuilder'

    gem_group :development, :test do
    gem 'rspec-rails'
    gem 'factory_girl_rails'
    end

    gem_group :assets do
    gem 'bootstrap-sass', '~> 3.0.3.0'
    gem 'compass-rails'
    end

    gem_group :development do
    gem 'thin'
    gem 'quiet_assets'
    gem 'better_errors'
    end

    run "cp config/database.yml config/database.yml.example"

    generate("rails_config:install")
    generate("rspec:install")

    environment %q(config.autoload_paths += %W(#{config.root}/lib #{config.root}/app/workers/))
    environment %q(config.time_zone = 'Beijing')
    environment %q(config.active_record.default_timezone = :local)
    environment %q(config.active_record.time_zone_aware_attributes = false)
    environment %q(config.i18n.load_path += Dir[Rails.root.join('config', 'locales', '**', '*.{rb,yml}').to_s])
    environment %q(config.i18n.default_locale = 'zh-CN')
    environment %q(config.action_controller.include_all_helpers = false)

    remove_file ".rspec"
    file ".rspec", <<-RSPEC
    --color --format documentation
    RSPEC

    run "bundle exec cap install"

    uncomment_lines "Capfile", /require.*capistrano\/bundler/

    file 'config/nginx.conf.example', <<-NGINX
    upstream #{app_name}_unicorn_server {
    server unix:/tmp/#{app_name}.sock fail_timeout=0;
    }
    server {
    listen 80;
    server_name www.example.com;
    client_max_body_size 5M;
    root /home/deployer/apps/#{app_path}/current/public;
    location ~ ^/(assets)/ {
    gzip_static on; # to serve pre-gzipped version
    expires max;
    add_header Cache-Control public;
    }
    gzip on;
    gzip_http_version 1.1;
    gzip_vary on;
    gzip_comp_level 6;
    gzip_disable “MSIE [1-6].(?!.*SV1)”;
    location / {
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-Host $host;
    proxy_set_header X-Forwarded-Server $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_buffering on;
    if (!-f $request_filename) {
    proxy_pass http://#{app_name}_unicorn_server;
    break;
    }
    }
    access_log /home/deployer/apps/#{app_name}/shared/log/access.log;
    error_log /home/deployer/apps/#{app_name}/shared/log/error.log;
    }
    NGINX

    file "config/unicorn.rb.example", <<-UNICORN
    # -*- encoding : utf-8 -*-
    worker_processes 3
    timeout 30
    listen File.expand_path("/tmp/#{app_name}.sock"), :backlog => 64
    preload_app true
    pid File.expand_path('../../tmp/pids/unicorn.pid', __FILE__)
    before_exec do |server|
    ENV["BUNDLE_GEMFILE"] = File.expand_path('../../Gemfile', __FILE__)
    end
    before_fork do |server, worker|
    defined?(ActiveRecord::Base) and
    ActiveRecord::Base.connection.disconnect!
    defined?(Redis) and
    Redis.current.client.disconnect
    old_pid = "\#{server.config[:pid]}.oldbin"
    if File.exists?(old_pid) && server.pid != old_pid
    begin
    Process.kill("QUIT", File.read(old_pid).to_i)
    rescue Errno::ENOENT, Errno::ESRCH
    end
    end
    end
    after_fork do |server, worker|
    defined?(ActiveRecord::Base) and
    ActiveRecord::Base.establish_connection
    defined?(Redis) and
    Redis.current.client.reconnect
    end
    UNICORN

    file "config/unicorn_init.example", <<-INIT
    #!/bin/sh
    ### BEGIN INIT INFO
    # Provides: unicorn_#{app_name}
    # Required-Start: $remote_fs $syslog
    # Required-Stop: $remote_fs $syslog
    # Default-Start: 2 3 4 5
    # Default-Stop: 0 1 6
    # Short-Description: Manage unicorn server
    # Description: Start, stop, restart unicorn server for a specific application.
    ### END INIT INFO
    set -e
    # Feel free to change any of the following variables for your app:
    TIMEOUT=${TIMEOUT-60}
    APP_ROOT=/home/deployer/apps/#{app_name}/current
    PID=$APP_ROOT/tmp/pids/unicorn.pid
    CMD="cd $APP_ROOT; bundle exec unicorn -D -c $APP_ROOT/config/unicorn.rb -E production"
    AS_USER=deployer
    set -u
    OLD_PIN="$PID.oldbin"
    sig () {
    test -s "$PID" && kill -$1 `cat $PID`
    }
    oldsig () {
    test -s $OLD_PIN && kill -$1 `cat $OLD_PIN`
    }
    run () {
    if [ "$(id -un)" = "$AS_USER" ]; then
    eval $1
    else
    su -c "$1" - $AS_USER
    fi
    }
    case "$1" in
    start)
    sig 0 && echo >&2 "Already running" && exit 0
    run "$CMD"
    ;;
    stop)
    sig QUIT && exit 0
    echo >&2 "Not running"
    ;;
    force-stop)
    sig TERM && exit 0
    echo >&2 "Not running"
    ;;
    restart|reload)
    sig HUP && echo reloaded OK && exit 0
    echo >&2 "Couldn't reload, starting '$CMD' instead"
    run "$CMD"
    ;;
    upgrade)
    if sig USR2 && sleep 2 && sig 0 && oldsig QUIT
    then
    n=$TIMEOUT
    while test -s $OLD_PIN && test $n -ge 0
    do
    printf '.' && sleep 1 && n=$(( $n - 1 ))
    done
    echo
    if test $n -lt 0 && test -s $OLD_PIN
    then
    echo >&2 "$OLD_PIN still exists after $TIMEOUT seconds"
    exit 1
    fi
    exit 0
    fi
    echo >&2 "Couldn't upgrade, starting '$CMD' instead"
    run "$CMD"
    ;;
    reopen-logs)
    sig USR1
    ;;
    *)
    echo >&2 "Usage: $0 <start|stop|restart|upgrade|force-stop|reopen-logs>"
    exit 1
    ;;
    esac
    INIT

    remove_file "config/deploy.rb"

    file "config/deploy.rb", <<-DEPLOY
    set :application, '#{app_name}'
    # set :repo_url, ''
    # ask :branch, proc { `git rev-parse --abbrev-ref HEAD`.chomp }
    set :user, 'deployer'
    set :use_sudo, false
    set :deploy_to, "/home/\#{fetch :user}/apps/\#{fetch :application}"
    set :scm, :git
    set :format, :pretty
    set :log_level, :debug
    set :pty, true
    set :linked_files, %w{
    config/settings.local.yml config/database.yml config/unicorn.rb
    config/unicorn_init config/nginx.conf
    }
    set :linked_dirs, %w{bin log tmp/pids tmp/cache tmp/sockets vendor/bundle public/system public/uploads}
    set :default_env, { path: "$HOME/.rbenv/shims:$HOME/.rbenv/bin:$PATH" }
    set :keep_releases, 5
    remote_file "config/settings.local.yml" => "config/settings.local.yml.example"
    remote_file "config/database.yml" => "config/database.yml.example"
    remote_file "config/unicorn.rb" => "config/unicorn.rb.example"
    remote_file "config/unicorn_init" => "config/unicorn_init.example"
    remote_file "config/nginx.conf" => "config/nginx.conf.example"
    namespace :deploy do
    namespace :check do
    task :linked_files => fetch(:linked_files)
    end
    desc "precompile asseets and sync to web server"
    task :assets_sync do
    system('bundle exec rake assets:precompile')
    on roles(:web) do |server|
    system "rsync -vr --exclude='.DS_Store' public/assets \#{fetch :user}@\#{server}:\#{release_path}/public/"
    end
    system('rm -rf public/assets')
    end
    desc "rake db:migrate"
    task :db_migrate do
    on roles(:db) do
    execute "cd \#{release_path} && bundle exec rake db:migrate RAILS_ENV=production"
    end
    end
    after 'deploy:updated', 'deploy:db_migrate'
    after 'deploy:updated', 'deploy:assets_sync'
    desc "Start application"
    task :start do
    on roles(:app) do
    execute "cd \#{deploy_to}/current && bundle exec unicorn_rails -c config/unicorn.rb -E production -D"
    end
    end
    desc 'Restart application'
    task :restart do
    on roles(:app), in: :sequence, wait: 5 do
    execute "kill -s USR2 `cat \#{deploy_to}/current/tmp/pids/unicorn.pid`"
    end
    end
    desc 'Stop application'
    task :stop do
    on roles(:app), in: :sequence, wait: 5 do
    execute "kill -s QUIT `cat \#{deploy_to}/current/tmp/pids/unicorn.pid`"
    end
    end
    after :finishing, 'deploy:cleanup'
    end
    DEPLOY

    remove_file "public/index.html"
    remove_file "app/views/layouts/application.html.erb"

    file "app/views/layouts/application.html.slim", <<-LAYOUT
    doctype html
    html lang="zh_CN"
    head
    meta charset="utf-8"
    meta http-equiv="X-UA-Compatible" content="IE=edge"
    meta name="viewport" content="width=device-width, initial-scale=1.0"
    = csrf_meta_tags
    = stylesheet_link_tag "application"
    = javascript_include_tag "application"
    = yield :header
    title #{app_name}
    body
    .navbar.navbar-inverse.navbar-fixed-top role="navigation"
    .container
    .navbar-header
    button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse"
    span class="sr-only" Toggle navigation
    span class="icon-bar"
    span class="icon-bar"
    span class="icon-bar"
    .navbar-collapse.collapse
    = link_to 'Home', '/', class: 'navbar-brand'
    .row
    - if flash[:notice]
    .win-row
    .alert.alert-info= flash[:notice]
    - if flash[:alert]
    .win-row
    .alert.alert-danger= flash[:alert]
    .col-md-3
    = yield :left
    .col-md-9
    = yield
    .row
    LAYOUT

    remove_file "app/assets/stylesheets/application.css"

    file "app/assets/stylesheets/application.css.scss", <<-APPLICATION
    @import "bootstrap";
    @import "bootstrap/theme";
    body {
    position: relative;
    padding-top: 50px;
    }
    APPLICATION

    remove_file "app/assets/javascripts/application.js"

    file "app/assets/javascripts/application.js", <<-APPLICATION
    //= require jquery
    //= require jquery_ujs
    APPLICATION

    file "config/locales/zh-CN.yml", <<-I18N
    zh-CN:
    date:
    abbr_day_names:
    - 日
    - 一
    - 二
    - 三
    - 四
    - 五
    - 六
    abbr_month_names:
    -
    - 1月
    - 2月
    - 3月
    - 4月
    - 5月
    - 6月
    - 7月
    - 8月
    - 9月
    - 10月
    - 11月
    - 12月
    day_names:
    - 星期日
    - 星期一
    - 星期二
    - 星期三
    - 星期四
    - 星期五
    - 星期六
    formats:
    default: ! '%Y-%m-%d'
    long: ! '%Y年%b%d日'
    short: ! '%b%d日'
    month_names:
    -
    - 一月
    - 二月
    - 三月
    - 四月
    - 五月
    - 六月
    - 七月
    - 八月
    - 九月
    - 十月
    - 十一月
    - 十二月
    order:
    - :year
    - :month
    - :day
    datetime:
    distance_in_words:
    about_x_hours:
    one: 大约一小时
    other: 大约 %{count} 小时
    about_x_months:
    one: 大约一个月
    other: 大约 %{count} 个月
    about_x_years:
    one: 大约一年
    other: 大约 %{count} 年
    almost_x_years:
    one: 接近一年
    other: 接近 %{count} 年
    half_a_minute: 半分钟
    less_than_x_minutes:
    one: 不到一分钟
    other: 不到 %{count} 分钟
    less_than_x_seconds:
    one: 不到一秒
    other: 不到 %{count} 秒
    over_x_years:
    one: 一年多
    other: ! '%{count} 年多'
    x_days:
    one: 一天
    other: ! '%{count} 天'
    x_minutes:
    one: 一分钟
    other: ! '%{count} 分钟'
    x_months:
    one: 一个月
    other: ! '%{count} 个月'
    x_seconds:
    one: 一秒
    other: ! '%{count} 秒'
    prompts:
    day: 日
    hour: 时
    minute: 分
    month: 月
    second: 秒
    year: 年
    errors: &errors
    format: ! '%{attribute}%{message}'
    messages:
    accepted: 必须是可被接受的
    blank: 不能为空字符
    confirmation: 与确认值不匹配
    empty: 不能留空
    equal_to: 必须等于 %{count}
    even: 必须为双数
    exclusion: 是保留关键字
    greater_than: 必须大于 %{count}
    greater_than_or_equal_to: 必须大于或等于 %{count}
    inclusion: 不包含于列表中
    invalid: 是无效的
    less_than: 必须小于 %{count}
    less_than_or_equal_to: 必须小于或等于 %{count}
    not_a_number: 不是数字
    not_an_integer: 必须是整数
    odd: 必须为单数
    record_invalid: ! '验证失败: %{errors}'
    taken: 已经被使用
    too_long: 过长(最长为 %{count} 个字符)
    too_short: 过短(最短为 %{count} 个字符)
    wrong_length: 长度非法(必须为 %{count} 个字符)
    template:
    body: 如下字段出现错误:
    header:
    one: 有 1 个错误发生导致「%{model}」无法被保存。
    other: 有 %{count} 个错误发生导致「%{model}」无法被保存。
    helpers:
    select:
    prompt: 请选择
    submit:
    create: 新增%{model}
    submit: 储存%{model}
    update: 更新%{model}
    number:
    currency:
    format:
    delimiter: ! ','
    format: ! '%u %n'
    precision: 2
    separator: .
    significant: false
    strip_insignificant_zeros: false
    unit: CN¥
    format:
    delimiter: ! ','
    precision: 3
    separator: .
    significant: false
    strip_insignificant_zeros: false
    human:
    decimal_units:
    format: ! '%n %u'
    units:
    billion: 十亿
    million: 百万
    quadrillion: 千兆
    thousand: 千
    trillion: 兆
    unit: ''
    format:
    delimiter: ''
    precision: 1
    significant: false
    strip_insignificant_zeros: false
    storage_units:
    format: ! '%n %u'
    units:
    byte:
    one: Byte
    other: Bytes
    gb: GB
    kb: KB
    mb: MB
    tb: TB
    percentage:
    format:
    delimiter: ''
    precision:
    format:
    delimiter: ''
    support:
    array:
    last_word_connector: ! ', 和 '
    two_words_connector: ! ' 和 '
    words_connector: ! ', '
    time:
    am: 上午
    formats:
    default: ! '%Y年%b%d日 %A %H:%M:%S %Z'
    long: ! '%Y年%b%d日 %H:%M'
    short: ! '%b%d日 %H:%M'
    pm: 下午
    # remove these aliases after 'activemodel' and 'activerecord' namespaces are removed from Rails repository
    activemodel:
    errors:
    <<: *errors
    activerecord:
    errors:
    <<: *errors
    I18N

    git add: "."
    git commit: %Q{ -m 'Initial commit' }