Skip to content

Instantly share code, notes, and snippets.

@the-teacher
Created September 25, 2015 16:45
Show Gist options
  • Save the-teacher/dd27b269e6538648fe8b to your computer and use it in GitHub Desktop.
Save the-teacher/dd27b269e6538648fe8b to your computer and use it in GitHub Desktop.
Vagrant.startup

HOST MACHINE

  brew cask install virtualbox
  brew cask install vagrant
  brew cask install vagrant-manager
  vagrant plugin install vagrant-vbguest
  vagrant plugin install vagrant-librarian-chef-nochef
  git clone git@github.com:the_teacher/PROJECT
  cd PROJECT

Place config files:

  >> PROJECT/config/database.yml
  >> PROJECT/config/settings/development.local.yml
  >> PROJECT/DeployTool/settings/production.yml
  vagrant up
  vagrant ssh

VAGRANT MACHINE

  cd /vagrant
  bundle
  rake db:create && rake db:migrate
  ssh-keygen -t rsa -b 4096 -C "vagrant@open-cook.ru"
  >>
  >>
  >>

  ssh-add ~/.ssh/id_rsa && ssh-add -L

  cat ~/.ssh/id_rsa.pub | ssh deployer@server.com 'cat >> ~/.ssh/authorized_keys'
  >> password
  cd /vagrant/DeployTool/

  bundle

  mkdir -p ~/DUMPS

  cap production db:dump
  >> YES

  mysql -u root -pqwerty project_db_dev -S /run/mysql-vagrant/mysqld.sock < ~/DUMPS/project_production.XXX.mysql.sql

  cap production rsync:files
  >> YES

PROXY ASSETS VIA NGINX

  sudo apt-get install nginx
  sudo nano /etc/nginx/nginx.conf
  ##
  # Logging Settings
  ##

  # access_log /var/log/nginx/access.log;
  # error_log /var/log/nginx/error.log;
  # include /etc/nginx/conf.d/*.conf;
  # include /etc/nginx/sites-enabled/*;
  include /vagrant/config/nginx.development.conf;
  sudo /etc/init.d/nginx restart
  sudo service nginx restart
  nginx -t
  cd /vagrant

  |=> rails s -b 0.0.0.0
  -- or --
  |=> unicorn_rails -c ./config/unicorn.development.rb
  -- or --
  |=> ( sudo /etc/init.d/nginx restart ) && ( unicorn_rails -c ./config/unicorn.development.rb )

@the-teacher
Copy link
Author

Gheffile

# encoding: utf-8

site 'http://community.opscode.com/api/v1'

cookbook 'apt', '~> 2.8.2'
cookbook 'build-essential', '~> 2.2.3'

cookbook 'git',    '~> 4.3.4'
cookbook 'tmux',   '~> 1.5.0'
cookbook 'rvm',    '~> 0.9.4'

cookbook 'nodejs', '~> 2.4.2'
cookbook 'redis',  '~> 3.0.4'
cookbook 'mysql',  '~> 6.1.0'
cookbook 'sphinx', '~> 1.1.0'

cookbook 'current_project',
  path: './cookbooks_addons/current_project'

@the-teacher
Copy link
Author

Vagrantfile

# encoding: utf-8
# This file originally created at http://rove.io/6e712d6c9c42b179359d6444a85e048c

# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.configure("2") do |config|
  config.vm.box = "ubuntu/trusty64"

  # Note: Version of VBox addons have be equal with VBox version
  # config.vm.box = "debian/jessie64"

  config.vm.network :forwarded_port, guest: 80, host: 3000

  config.ssh.forward_agent = true
  # config.ssh.username = 'vagrant'
  # config.ssh.password = 'vagrant'

  # Before NFS mounting
  # vagrant ssh + sudo passwd root + >> qwerty + exit
  #
  # config.vm.synced_folder '.', '/vagrant', nfs: true
  # config.vm.network "private_network", ip: "192.168.50.4" #, type: :dhcp

  config.vm.provider :virtualbox do |vb|
    vb.customize ["modifyvm", :id, "--memory", "2048"]
    vb.cpus = 4
  end

  config.vm.provision "shell", inline: "echo Hello from Shell"

  config.vm.provision :chef_solo do |chef|
    # chef.log_level = :debug

    chef.version = "11.18"
    chef.cookbooks_path = ["cookbooks", "cookbooks_addons"]

    chef.add_recipe 'apt'
    chef.add_recipe 'build-essential'

    chef.add_recipe 'rvm::vagrant'
    chef.add_recipe 'rvm::system'
    chef.add_recipe 'rvm::user'

    chef.add_recipe 'git::source'

    chef.add_recipe 'tmux'
    chef.add_recipe 'redis'

    chef.add_recipe 'current_project::mysql'
    chef.add_recipe 'current_project::mysql_devel'

    chef.add_recipe 'sphinx::source'
    chef.add_recipe 'nodejs'

    chef.json = {
      rvm: {
        vagrant: {
          system_chef_client: '/opt/chef/bin/chef-client',
          system_chef_solo:   '/opt/chef/bin/chef-solo'
        },

        version: 'head',
        default_ruby: 'ruby-1.9.3-p547',
        user_default_ruby: 'ruby-1.9.3-p547',

        user_installs: [
          {
            user:   "vagrant",
            global: "ruby-2.2.1",
            default_ruby: "ruby-2.2.1",

            rubies: [
              "ruby-2.2.1",
              "ruby-2.2-head"
            ]
          }
        ]
      },

      git: {
        version: '2.5.3',
        url: 'https://nodeload.github.com/git/git/tar.gz/v2.5.3',
        checksum: ''
      },

      redis: {
        version:     '3.0.4',
        release_url: 'http://download.redis.io/releases/redis-3.0.4.tar.gz'
      },

      nodejs: {
        version: '4.1.1',
        install_method: 'source'
      },

      sphinx: {
        install_method: 'source',

        source: {
          url: 'http://sphinxsearch.com/files/sphinx-2.2.10-release.tar.gz'
        },

        group: 'vagrant',
        user:  'vagrant',

        use_mysql:   true,
        use_stemmer: false
      }
    }
  end
end

@the-teacher
Copy link
Author

/cookbooks_addons/current_project/recipes/mysql_devel.rb

# Vagrant
# chef.add_recipe 'current_project::mysql_devel'

# easy_install_package 'mysql-devel'

package 'libmysqlclient-dev' do
  action :install
end

@the-teacher
Copy link
Author

/cookbooks_addons/current_project/recipes/mysql.rb

# Vagrant
# chef.add_recipe 'current_project::mysql'

# mysql -u root -pqwerty -S /run/mysql-vagrant/mysqld.sock
# /usr/sbin/mysqld --defaults-file=/etc/mysql-vagrant/my.cnf

mysql_service 'vagrant' do
  version '5.5'
  initial_root_password 'qwerty'

  run_group 'vagrant'
  run_user  'vagrant'

  action [:create, :start]
end

@the-teacher
Copy link
Author

config/unicorn.development.rb

timeout 60
preload_app true
worker_processes 4

working_directory '/vagrant'

# listen "0.0.0.0:3000"
pid '/vagrant/tmp/pids/unicorn.dev.pid'

# not `/vagrant` because of Vagrant sockets problem
# for sockets you have to use /tmp folder
listen '/tmp/unicorn.dev.sock', backlog: 1024

# stdout_path '/vagrant/log/unicorn.dev.log'
stderr_path '/vagrant/log/unicorn.dev.error.log'

before_fork do |server, worker|
  Signal.trap 'TERM' do
    puts 'Unicorn master intercepting TERM and sending myself QUIT instead'
    Process.kill 'QUIT', Process.pid
  end

  defined?(ActiveRecord::Base) and
    ActiveRecord::Base.connection.disconnect!
end

after_fork do |server, worker|
  Signal.trap 'TERM' do
    puts 'Unicorn worker intercepting TERM and doing nothing. Wait for master to send QUIT'
  end

  defined?(ActiveRecord::Base) and
    ActiveRecord::Base.establish_connection
end

@the-teacher
Copy link
Author

config/nginx.development.conf

upstream vagrant_project {
  server unix:/tmp/unicorn.dev.sock fail_timeout=60;
}

server{
  listen 80 default_server;
  server_name  localhost;

  error_log  /vagrant/log/nginx.dev.err;
  access_log /vagrant/log/nginx.dev.acc;

  charset utf-8;
  proxy_intercept_errors on;

  root /vagrant/public;

  client_max_body_size 256m;

  error_page 403 /403.html;
  error_page 500 501 502 503 504 /500.html;

  location ~ ^/(uploads|special_posts|images|system|default_images)/ {
    expires max;
    gzip_static on;
    add_header Cache-Control public;
  }

  location / {
    try_files $uri @web_site;
  }

  location @web_site {
    proxy_pass http://vagrant_project;

    proxy_redirect off;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

    proxy_read_timeout 300;
    proxy_buffer_size 16k;
    proxy_buffers 32 16k;

    proxy_set_header X-Forwarded-Proto $scheme;
  }
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment