pointer 0.0.2 → 0.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README.md +1 -1
- data/TODO.md +13 -6
- data/bin/pointer +1 -0
- data/config/1_as_root.sh +31 -0
- data/config/2_as_rails.sh +279 -0
- data/config/pointer.rb.default +2 -6
- data/config/variables.sh.erb +10 -0
- data/lib/pointer.rb +53 -53
- data/lib/pointer/version.rb +1 -1
- data/pointer.gemspec +1 -2
- metadata +9 -32
- data/lib/pointer/bit_bucket.rb +0 -25
- data/lib/pointer/deployer_application.rb +0 -52
- data/lib/pointer/helpers.rb +0 -23
- data/lib/pointer/mina.rb +0 -89
- data/lib/pointer/nginx_passenger.rb +0 -63
- data/lib/pointer/postgres.rb +0 -43
- data/lib/pointer/rails_user.rb +0 -48
- data/lib/pointer/rvm.rb +0 -25
- data/lib/pointer/ssh_helpers.rb +0 -84
- data/lib/pointer/variables.rb +0 -59
data/README.md
CHANGED
@@ -10,7 +10,7 @@ configures mina for deployment, deploys a simple application that exposes a WebH
|
|
10
10
|
|
11
11
|
## Assumptions (for now)
|
12
12
|
|
13
|
-
* You have a clean Ubuntu 12.10 Server (no installations of nginx, rvm or anything, just clean server)
|
13
|
+
* You have a clean Ubuntu 12.10 Server (no installations of nginx, rvm or anything, just clean server) - try DigitalOcean.com (5$/month for 512MB/20GB SSD)
|
14
14
|
* You have root password to that server
|
15
15
|
* You are ok to use RVM, nginx/Passenger (no Apache yet), mina (no Capistrano yet) to Production
|
16
16
|
* You need a Postgres database on Production
|
data/TODO.md
CHANGED
@@ -2,7 +2,6 @@
|
|
2
2
|
|
3
3
|
vagrant for tests
|
4
4
|
touch: cannot touch `tmp/restart.txt': No such file or directory (via deploy)
|
5
|
-
|
6
5
|
automate bitbicket deployment key installation
|
7
6
|
что если nginx уже поставлен?
|
8
7
|
support apache
|
@@ -21,16 +20,24 @@ Fix locales (/etc/environment) on Ubuntu
|
|
21
20
|
что может пойти не так с публично доступным deploy? add md5=...
|
22
21
|
remove all https://raw.github.com/slava-vishnyakov/useful-stuff/master/init.d-nginx.conf
|
23
22
|
detect bitbucket keys https://bitbucket.org/username/test2/admin/deploy-keys
|
24
|
-
|
25
23
|
once installed postgres will not allow second creation
|
26
24
|
local git hosting on server? bad idea, but really easy
|
27
|
-
|
28
25
|
@ssh.exec! -> expect_success
|
29
26
|
session identifier shared
|
30
27
|
"your website is at"
|
31
|
-
|
32
28
|
check for gem pg in Gemfile
|
33
|
-
|
29
|
+
publish without git? local deploy?
|
30
|
+
add info on "Use this as deploy key"
|
31
|
+
gitignored /shared folder to upload shared files?
|
32
|
+
remove application, rename
|
34
33
|
backups?
|
34
|
+
--use-existing-mina
|
35
|
+
check prereqs: postgres use can connect (bug: same host => same user, cannot connect!)
|
36
|
+
check prereqs: allowed to connect to host in paranoia mode (known hosts)
|
37
|
+
|
38
|
+
nginx.conf: http { server_names_hash_bucket_size 512;
|
39
|
+
|
40
|
+
The authenticity of host 'revolver3.slava.io (198.211.118.58)' can't be established. - не ломает приложение
|
41
|
+
CRITICAL: когда меняется deploy.rb или он не закоммичен - нужно загружать его и рестартовать deployer - может даже симлинк на SCM/deploy.rb? double deploy если поменялся? scp upload вместо деплоя?
|
35
42
|
|
36
|
-
|
43
|
+
PermitRootLogin запретить
|
data/bin/pointer
CHANGED
data/config/1_as_root.sh
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
#!/bin/bash -e
|
2
|
+
|
3
|
+
source `dirname $0`/variables.sh
|
4
|
+
|
5
|
+
if ! id -u $RAILS_USER >/dev/null 2>&1; then
|
6
|
+
echo "Create rails user: $RAILS_USER"
|
7
|
+
useradd rails -d /home/$RAILS_USER -m -s /bin/bash
|
8
|
+
usermod -a -G sudo $RAILS_USER
|
9
|
+
fi
|
10
|
+
|
11
|
+
SSH_DIR="/home/$RAILS_USER/.ssh"
|
12
|
+
AUTHORIZED_KEYS_FILE="$SSH_DIR/authorized_keys"
|
13
|
+
|
14
|
+
# def upload_public_key
|
15
|
+
if [[ ! -e $SSH_DIR ]]; then
|
16
|
+
mkdir $SSH_DIR
|
17
|
+
chown $RAILS_USER:$RAILS_USER $SSH_DIR
|
18
|
+
chmod 0700 $SSH_DIR
|
19
|
+
fi
|
20
|
+
|
21
|
+
if [[ ! -e $AUTHORIZED_KEYS_FILE ]]; then
|
22
|
+
touch $AUTHORIZED_KEYS_FILE
|
23
|
+
chown $RAILS_USER:$RAILS_USER $AUTHORIZED_KEYS_FILE
|
24
|
+
chmod 0600 $AUTHORIZED_KEYS_FILE
|
25
|
+
fi
|
26
|
+
|
27
|
+
echo "Uploading private key"
|
28
|
+
cat $PUBLIC_KEY >> $AUTHORIZED_KEYS_FILE
|
29
|
+
|
30
|
+
echo "Give sudo rights"
|
31
|
+
echo "$RAILS_USER ALL = NOPASSWD:ALL" >> /etc/sudoers
|
@@ -0,0 +1,279 @@
|
|
1
|
+
#!/bin/bash -e
|
2
|
+
|
3
|
+
source `dirname $0`/variables.sh
|
4
|
+
|
5
|
+
if [[ `whoami` != $RAILS_USER ]]; then
|
6
|
+
echo "Please run this as $RAILS_USER"
|
7
|
+
exit
|
8
|
+
fi
|
9
|
+
|
10
|
+
LOG_FILE=/home/$RAILS_USER/pointer.log
|
11
|
+
|
12
|
+
(cat /etc/environment | grep "LC_ALL=en_US.UTF-8") || (
|
13
|
+
echo "LC_ALL=en_US.UTF-8" | sudo tee -a /etc/environment
|
14
|
+
echo "LANG=en_US.UTF-8" | sudo tee -a /etc/environment
|
15
|
+
sudo locale-gen en_US en_US.UTF-8 >> $LOG_FILE 2>> $LOG_FILE
|
16
|
+
sudo dpkg-reconfigure locales >> $LOG_FILE 2>> $LOG_FILE
|
17
|
+
)
|
18
|
+
|
19
|
+
if [[ ! -e /home/$RAILS_USER/.rvm/scripts/rvm ]]; then
|
20
|
+
echo "Update system"
|
21
|
+
sudo apt-get -qq -y update >> $LOG_FILE 2>> $LOG_FILE
|
22
|
+
|
23
|
+
echo "Install RVM deps"
|
24
|
+
sudo apt-get -qq -y install curl libcurl4-gnutls-dev git nodejs build-essential openssl \
|
25
|
+
libreadline6 libreadline6-dev curl git-core zlib1g zlib1g-dev libssl-dev \
|
26
|
+
libyaml-dev libsqlite3-dev sqlite3 libxml2-dev libxslt-dev autoconf \
|
27
|
+
libc6-dev ncurses-dev automake libtool bison subversion pkg-config libgdbm-dev libffi-dev >> $LOG_FILE 2>> $LOG_FILE
|
28
|
+
|
29
|
+
echo "Install RVM"
|
30
|
+
curl -L https://get.rvm.io | bash -s stable --ruby=1.9.3 >> $LOG_FILE 2>> $LOG_FILE
|
31
|
+
fi
|
32
|
+
|
33
|
+
source "/home/$RAILS_USER/.rvm/scripts/rvm"
|
34
|
+
|
35
|
+
echo "Use 1.9.3"
|
36
|
+
rvm use 1.9.3 --default >> $LOG_FILE 2>> $LOG_FILE
|
37
|
+
|
38
|
+
echo "gem: --no-ri --no-rdoc" >> /home/$RAILS_USER/.gemrc
|
39
|
+
|
40
|
+
echo "Install Passenger"
|
41
|
+
|
42
|
+
if [[ ! -e /opt/nginx/conf/rails-sites ]]; then
|
43
|
+
(gem list | grep passenger) > /dev/null || gem install passenger >> $LOG_FILE 2>> $LOG_FILE
|
44
|
+
|
45
|
+
if [[ ! -e /opt/nginx ]]; then
|
46
|
+
sudo mkdir -p /opt/nginx
|
47
|
+
fi
|
48
|
+
sudo chown $RAILS_USER:$RAILS_USER /opt/nginx
|
49
|
+
passenger-install-nginx-module --auto --auto-download --prefix=/opt/nginx >> $LOG_FILE 2>> $LOG_FILE
|
50
|
+
|
51
|
+
echo "Installing nginx init.d"
|
52
|
+
sudo wget https://raw.github.com/slava-vishnyakov/useful-stuff/master/init.d-nginx.conf -O /etc/init.d/nginx >> $LOG_FILE 2>> $LOG_FILE
|
53
|
+
|
54
|
+
echo "Changing nginx.conf permissions"
|
55
|
+
sudo chmod o+x /etc/init.d/nginx
|
56
|
+
|
57
|
+
echo "update-rc.d"
|
58
|
+
sudo update-rc.d nginx defaults >> $LOG_FILE 2>> $LOG_FILE
|
59
|
+
|
60
|
+
echo "Installing nginx.conf"
|
61
|
+
mv /opt/nginx/conf/nginx.conf /opt/nginx/conf/nginx.conf-orig
|
62
|
+
wget https://raw.github.com/slava-vishnyakov/useful-stuff/master/nginx.conf -O /opt/nginx/conf/nginx.conf >> $LOG_FILE 2>> $LOG_FILE
|
63
|
+
|
64
|
+
echo "Replacing passenger_ruby and passenger_root with actual Passenger data"
|
65
|
+
ruby -e "
|
66
|
+
orig_file = IO.read '/opt/nginx/conf/nginx.conf-orig';
|
67
|
+
new_file = IO.read '/opt/nginx/conf/nginx.conf';
|
68
|
+
new_file.sub! /passenger_ruby (.*?);/, orig_file.match(/passenger_ruby (.*?);/)[0];
|
69
|
+
new_file.sub! /passenger_root (.*?);/, orig_file.match(/passenger_root (.*?);/)[0];
|
70
|
+
IO.write '/opt/nginx/conf/nginx.conf', new_file
|
71
|
+
"
|
72
|
+
|
73
|
+
echo "Creating /opt/nginx/conf/rails-sites"
|
74
|
+
mkdir /opt/nginx/conf/rails-sites
|
75
|
+
|
76
|
+
echo "Starting nginx"
|
77
|
+
sudo service nginx start >> $LOG_FILE 2>> $LOG_FILE
|
78
|
+
fi
|
79
|
+
|
80
|
+
### PASSENGER INSTALLED
|
81
|
+
|
82
|
+
(cat /etc/hosts | grep " $SITE_HOST") || (echo "127.0.0.1 $SITE_HOST" | sudo tee -a /etc/hosts >> $LOG_FILE 2>> $LOG_FILE)
|
83
|
+
|
84
|
+
NGINX_CONFIG="
|
85
|
+
server {\n
|
86
|
+
listen $SITE_PORT;\n
|
87
|
+
server_name $SITE_HOST;\n
|
88
|
+
passenger_enabled on;\n
|
89
|
+
root $SITE_DIR/current/public;\n
|
90
|
+
passenger_user rails;\n
|
91
|
+
passenger_max_requests 500;\n
|
92
|
+
}\n
|
93
|
+
"
|
94
|
+
|
95
|
+
CONFIG_FILE="/opt/nginx/conf/rails-sites/$SITE_HOST-$SITE_PORT.conf"
|
96
|
+
|
97
|
+
echo -e $NGINX_CONFIG > $CONFIG_FILE
|
98
|
+
|
99
|
+
(sudo /opt/nginx/sbin/nginx -t >> $LOG_FILE 2>> $LOG_FILE) && sudo service nginx reload
|
100
|
+
|
101
|
+
## SITE CONFIG INSTALLED
|
102
|
+
|
103
|
+
if [[ ! -e $SITE_DIR/data ]]; then
|
104
|
+
mkdir -p $SITE_DIR/data
|
105
|
+
fi
|
106
|
+
|
107
|
+
(gem list | grep mina) > /dev/null || gem install mina >> $LOG_FILE 2>> $LOG_FILE
|
108
|
+
|
109
|
+
if [[ ! -e $SITE_DIR/data/config/deploy.rb ]]; then
|
110
|
+
cd $SITE_DIR/data && mina init < /dev/null
|
111
|
+
fi
|
112
|
+
|
113
|
+
|
114
|
+
RVM_PROMPT=`rvm-prompt`
|
115
|
+
|
116
|
+
sed -i "s!# require 'mina/rvm'!require 'mina/rvm'!" $SITE_DIR/data/config/deploy.rb
|
117
|
+
sed -i "s!set :domain, 'foobar\.com'!set :domain, '$SITE_HOST'!" $SITE_DIR/data/config/deploy.rb
|
118
|
+
sed -i "s!set :deploy_to, '/var/www/foobar\.com'!set :deploy_to, '$SITE_DIR'!" $SITE_DIR/data/config/deploy.rb
|
119
|
+
sed -i "s!# set :user, 'foobar'! set :user, '$RAILS_USER'!" $SITE_DIR/data/config/deploy.rb
|
120
|
+
sed -i "s!# invoke :'rvm:use\[ruby-1\.9\.3-p125@default\]'!invoke :'rvm:use[$RVM_PROMPT]'!" $SITE_DIR/data/config/deploy.rb
|
121
|
+
sed -i "s!queue %\[-----> Be sure to edit 'shared/config/database\.yml'\.\]!!" $SITE_DIR/data/config/deploy.rb
|
122
|
+
sed -i "s!set :repository, 'git://\.\.\.'!set :repository, '$REMOTE_REPO'!" $SITE_DIR/data/config/deploy.rb
|
123
|
+
sed -i "s!set :shared_paths, \['config/database.yml', 'log'\]!set :shared_paths, ['config/database.yml', 'log', 'tmp']!" $SITE_DIR/data/config/deploy.rb
|
124
|
+
|
125
|
+
# cat $SITE_DIR/data/config/deploy.rb
|
126
|
+
|
127
|
+
if [[ ! -e $SITE_DIR/shared/tmp/ ]]; then
|
128
|
+
mkdir -p $SITE_DIR/shared/tmp
|
129
|
+
touch $SITE_DIR/shared/tmp/restart.txt
|
130
|
+
fi
|
131
|
+
|
132
|
+
# INSTALL POSTGRES
|
133
|
+
|
134
|
+
# unless @ssh.exec! 'which psql'
|
135
|
+
# official apt repo does not support 12.10 (quantal) yet :(
|
136
|
+
which psql || (
|
137
|
+
echo "Installing PostgreSQL..."
|
138
|
+
sudo apt-get install -y libpq-dev >> $LOG_FILE 2>> $LOG_FILE
|
139
|
+
sudo apt-get install -y software-properties-common >> $LOG_FILE 2>> $LOG_FILE
|
140
|
+
sudo add-apt-repository ppa:pitti/postgresql < /dev/null >> $LOG_FILE 2>> $LOG_FILE
|
141
|
+
sudo apt-get update >> $LOG_FILE 2>> $LOG_FILE
|
142
|
+
sudo apt-get install -y postgresql-9.2 >> $LOG_FILE 2>> $LOG_FILE
|
143
|
+
)
|
144
|
+
|
145
|
+
if [[ ! -e $SITE_DIR/data/.postgres ]]; then
|
146
|
+
echo "Generating PostgreSQL user"
|
147
|
+
USERNAME=user_`echo "$SITE_HOST.$SITE_PORT" | sed -e 's/[^a-z0-9A-Z]/_/g'`
|
148
|
+
DATABASE=database_`echo "$SITE_HOST.$SITE_PORT" | sed -e 's/[^a-z0-9A-Z]/_/g'`
|
149
|
+
PASSWORD=`< /dev/urandom tr -dc _A-Z-a-z-0-9 | head -c${1:-32}`
|
150
|
+
|
151
|
+
echo -e "USERNAME=$USERNAME\nDATABASE=$DATABASE\nPASSWORD=$PASSWORD" > $SITE_DIR/data/.postgres
|
152
|
+
chmod 0700 $SITE_DIR/data/.postgres
|
153
|
+
|
154
|
+
sudo sudo -u postgres psql -c "CREATE ROLE $USERNAME WITH CREATEDB LOGIN PASSWORD '$PASSWORD'" >> $LOG_FILE 2>> $LOG_FILE
|
155
|
+
sudo sudo -u postgres psql -c "CREATE DATABASE $DATABASE OWNER $USERNAME" >> $LOG_FILE 2>> $LOG_FILE
|
156
|
+
fi
|
157
|
+
|
158
|
+
if [[ ! -e $SITE_DIR/shared/config ]]; then
|
159
|
+
mkdir -p $SITE_DIR/shared/config
|
160
|
+
fi
|
161
|
+
|
162
|
+
if [[ ! -e $SITE_DIR/shared/config/database.yml ]]; then
|
163
|
+
. $SITE_DIR/data/.postgres
|
164
|
+
|
165
|
+
DATABASE_YML="production:
|
166
|
+
adapter: postgresql
|
167
|
+
host: 127.0.0.1
|
168
|
+
encoding: utf8
|
169
|
+
database: $DATABASE
|
170
|
+
username: $USERNAME
|
171
|
+
password: $PASSWORD
|
172
|
+
"
|
173
|
+
|
174
|
+
echo -e "$DATABASE_YML" > "$SITE_DIR/shared/config/database.yml"
|
175
|
+
fi
|
176
|
+
|
177
|
+
|
178
|
+
echo "Generate SSH key and add it to trusted"
|
179
|
+
if [[ ! -e /home/$RAILS_USER/.ssh/id_rsa ]]; then
|
180
|
+
ssh-keygen -q -t rsa -f /home/$RAILS_USER/.ssh/id_rsa -N '' >> $LOG_FILE 2>> $LOG_FILE
|
181
|
+
cat /home/$RAILS_USER/.ssh/id_rsa.pub >> /home/$RAILS_USER/.ssh/authorized_keys
|
182
|
+
ssh -o StrictHostKeyChecking=no $RAILS_USER@$SITE_HOST -p $SSH_PORT 'echo "OK"' >> $LOG_FILE 2>> $LOG_FILE
|
183
|
+
fi
|
184
|
+
|
185
|
+
echo "------ Use this as deployment key ------"
|
186
|
+
cat /home/$RAILS_USER/.ssh/id_rsa.pub
|
187
|
+
echo "------ END ------"
|
188
|
+
|
189
|
+
if [[ $BITBUCKET ]]; then
|
190
|
+
echo "Please add this key on BitBucket as you Deployment Key [BitBucket -> Your repository -> Gear Icon -> Deployment keys]..."
|
191
|
+
echo "The installer will continue as soon as key is saved (it might take up to a minute)"
|
192
|
+
FAIL=`ssh -o StrictHostKeyChecking=no git@bitbucket.org ls 2> /dev/null </dev/null || echo FAIL`
|
193
|
+
while [[ $FAIL == 'FAIL' ]]; do
|
194
|
+
FAIL=`ssh -o StrictHostKeyChecking=no git@bitbucket.org ls 2> /dev/null </dev/null || echo FAIL`
|
195
|
+
sleep 1
|
196
|
+
echo -n '.'
|
197
|
+
done
|
198
|
+
echo "Key detected!"
|
199
|
+
fi
|
200
|
+
|
201
|
+
#### MINA
|
202
|
+
|
203
|
+
if [[ ! -e $SITE_DIR/data/.mina_setup_done ]]; then
|
204
|
+
echo "Doing mina setup"
|
205
|
+
cd $SITE_DIR/data/ && (mina setup < /dev/null >> $LOG_FILE 2>> $LOG_FILE)
|
206
|
+
touch $SITE_DIR/data/.mina_setup_done
|
207
|
+
fi
|
208
|
+
|
209
|
+
echo "Doing the first deploy"
|
210
|
+
cd $SITE_DIR/data/ && (mina deploy < /dev/null >> $LOG_FILE 2>> $LOG_FILE)
|
211
|
+
|
212
|
+
### DEPLOYER APP
|
213
|
+
|
214
|
+
echo "Installing webhook"
|
215
|
+
(gem list | grep sinatra) > /dev/null || gem install sinatra >> $LOG_FILE 2>> $LOG_FILE
|
216
|
+
|
217
|
+
mkdir -p $SITE_DIR/webhook_application/public
|
218
|
+
|
219
|
+
which bc || sudo apt-get -qq -y install bc >> $LOG_FILE 2>> $LOG_FILE
|
220
|
+
|
221
|
+
DEPLOYER_PORT=`echo "$SITE_PORT+810" | bc`
|
222
|
+
|
223
|
+
NGINX_CONFIG="server {\n
|
224
|
+
listen $DEPLOYER_PORT;\n
|
225
|
+
server_name $SITE_HOST;\n
|
226
|
+
passenger_enabled on;\n
|
227
|
+
passenger_user $RAILS_USER;\n
|
228
|
+
passenger_max_requests 1;\n
|
229
|
+
root $SITE_DIR/webhook_application/public;\n}"
|
230
|
+
|
231
|
+
if [[ ! -e $SITE_DIR/data/.deployer_app ]]; then
|
232
|
+
CODE=`< /dev/urandom tr -dc A-Z-a-z-0-9 | head -c${1:-32}`
|
233
|
+
echo -e "CODE=$CODE" > $SITE_DIR/data/.deployer_app
|
234
|
+
chmod 0700 $SITE_DIR/data/.deployer_app
|
235
|
+
fi
|
236
|
+
|
237
|
+
. $SITE_DIR/data/.deployer_app
|
238
|
+
|
239
|
+
echo -e $NGINX_CONFIG > "/opt/nginx/conf/rails-sites/deployer-$SITE_HOST-$DEPLOYER_PORT.conf"
|
240
|
+
|
241
|
+
CONFIG_RU="\n
|
242
|
+
require 'sinatra'\n
|
243
|
+
\n
|
244
|
+
post '/deploy/$CODE' do\n
|
245
|
+
\`cd / && mina -f $SITE_DIR/data/config/deploy.rb deploy < /dev/null\`\n
|
246
|
+
end\n
|
247
|
+
\n
|
248
|
+
run Sinatra::Application\n
|
249
|
+
"
|
250
|
+
|
251
|
+
# TODO: detect commited config/deploy.rb
|
252
|
+
# TODO: if deploy.rb cahnged - double deploy
|
253
|
+
|
254
|
+
echo -e $CONFIG_RU > "$SITE_DIR/webhook_application/config.ru"
|
255
|
+
sudo service nginx restart >> $LOG_FILE 2>> $LOG_FILE
|
256
|
+
|
257
|
+
HOOK_URL="http://$SITE_HOST:$DEPLOYER_PORT/deploy/$CODE"
|
258
|
+
|
259
|
+
echo -e "---------------------\n\n\n"
|
260
|
+
echo "Your setup is DONE"
|
261
|
+
echo ""
|
262
|
+
echo "-------"
|
263
|
+
echo "WebHook (POST) address: $HOOK_URL"
|
264
|
+
echo "Add this to GitHub/BitBucket as WebHook/POST service, so that your code is automatically deployed on every push"
|
265
|
+
echo "Run, for example:"
|
266
|
+
echo "curl -X POST $HOOK_URL"
|
267
|
+
echo "-------"
|
268
|
+
echo
|
269
|
+
echo "------ Use this as deployment key ------"
|
270
|
+
cat /home/$RAILS_USER/.ssh/id_rsa.pub
|
271
|
+
echo "------ END ------"
|
272
|
+
echo
|
273
|
+
echo "Your app should be available on http://$SITE_HOST:$SITE_PORT/"
|
274
|
+
echo
|
275
|
+
echo "If you have any problems visit: https://github.com/slava-vishnyakov/pointer/issues"
|
276
|
+
echo
|
277
|
+
echo "- Slava"
|
278
|
+
|
279
|
+
|
data/config/pointer.rb.default
CHANGED
@@ -15,13 +15,14 @@ set :ssh_host, host
|
|
15
15
|
|
16
16
|
set :ssh_user, 'root'
|
17
17
|
set :ssh_port, 22
|
18
|
-
set :password, 'password_of_root'
|
19
18
|
|
20
19
|
# Your public and private key that will be used for deployment
|
21
20
|
|
22
21
|
set :public_key, "~/.ssh/id_rsa.pub"
|
23
22
|
set :private_key, "~/.ssh/id_rsa"
|
24
23
|
|
24
|
+
set :git_repo, 'git@bitbucket.org:repo/repo.git'
|
25
|
+
|
25
26
|
# Less privileged user that you will use to deploy the project
|
26
27
|
|
27
28
|
rails_user = 'rails'
|
@@ -33,11 +34,6 @@ set :site_host, host
|
|
33
34
|
set :site_port, 80
|
34
35
|
set :site_dir, "/home/#{rails_user}/applications/#{host}"
|
35
36
|
|
36
|
-
# Do we plan to host your site on BitBucket?
|
37
|
-
# BitBucket is the only reputable repo hosting that I know that allows free private repositories
|
38
|
-
|
39
|
-
set :git_repo, 'git@bitbucket.org:repo/repo.git'
|
40
|
-
|
41
37
|
# Currently only NginxPassenger is supported
|
42
38
|
# in future :apache will be supported too
|
43
39
|
|
@@ -0,0 +1,10 @@
|
|
1
|
+
RAILS_USER=<%= @options[:rails_user].inspect %>
|
2
|
+
PUBLIC_KEY='<%= remote_public_key_file %>'
|
3
|
+
SITE_PORT=<%= @options[:site_port].inspect %>
|
4
|
+
SITE_HOST=<%= @options[:site_host].inspect %>
|
5
|
+
SITE_DIR=<%= @options[:site_dir].inspect %>
|
6
|
+
REMOTE_REPO=<%= @options[:git_repo].inspect %>
|
7
|
+
SSH_PORT=<%= @options[:ssh_port].inspect %>
|
8
|
+
<% if bitbucket %>
|
9
|
+
BITBUCKET=1
|
10
|
+
<% end %>
|
data/lib/pointer.rb
CHANGED
@@ -1,73 +1,73 @@
|
|
1
1
|
require "pointer/version"
|
2
|
-
require '
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
2
|
+
require 'read-password'
|
3
|
+
require 'erb'
|
4
|
+
require 'net/ssh'
|
5
|
+
require 'net/scp'
|
6
|
+
require 'tempfile'
|
7
7
|
|
8
8
|
module Pointer
|
9
9
|
class EasyDeploy
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
include SshHelpers
|
14
|
-
include BitBucket
|
15
|
-
include DeployerApplication
|
16
|
-
include Mina
|
17
|
-
include NginxPassenger
|
18
|
-
include RailsUser
|
19
|
-
include Rvm
|
10
|
+
def remote_private_key_file
|
11
|
+
"/tmp/tmp_private_key"
|
12
|
+
end
|
20
13
|
|
21
|
-
def
|
22
|
-
|
14
|
+
def remote_public_key_file
|
15
|
+
"/tmp/tmp_private_key"
|
16
|
+
end
|
23
17
|
|
24
|
-
|
25
|
-
|
18
|
+
def bitbucket
|
19
|
+
@options[:git_repo].include? '@bitbucket.org:'
|
20
|
+
end
|
26
21
|
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
22
|
+
def run!(options)
|
23
|
+
@options = options
|
24
|
+
@options[:ssh_password] = Kernel.password("ssh password for user #{@options[:ssh_user]}: ")
|
25
|
+
variables = ERB.new(IO.read(File.dirname(__FILE__) + '/../config/variables.sh.erb'))
|
26
|
+
|
27
|
+
var_file = Tempfile.new('sh')
|
28
|
+
var_file.write(variables.result(binding))
|
29
|
+
var_file.rewind
|
30
|
+
|
31
|
+
Net::SSH.start(@options[:ssh_host], @options[:ssh_user], password: @options[:ssh_password], paranoid: false) do |ssh|
|
32
|
+
puts ssh.scp.upload!(var_file.path, '/tmp/variables.sh')
|
33
|
+
puts ssh.scp.upload!(File.expand_path(@options[:public_key]), remote_public_key_file)
|
34
|
+
puts ssh.scp.upload!(File.dirname(__FILE__) + '/../config/1_as_root.sh', '/tmp/1.sh')
|
35
|
+
puts ssh.scp.upload!(File.dirname(__FILE__) + '/../config/2_as_rails.sh', '/tmp/2.sh')
|
36
|
+
run_stream('bash -l -e /tmp/1.sh', ssh)
|
37
|
+
|
38
|
+
puts ssh.exec!("chown #{@options[:rails_user]}:#{@options[:rails_user]} /tmp/variables.sh")
|
39
|
+
puts ssh.exec!("chown #{@options[:rails_user]}:#{@options[:rails_user]} " + remote_public_key_file)
|
40
|
+
puts ssh.exec!("chown #{@options[:rails_user]}:#{@options[:rails_user]} /tmp/1.sh")
|
41
|
+
puts ssh.exec!("chown #{@options[:rails_user]}:#{@options[:rails_user]} /tmp/2.sh")
|
32
42
|
end
|
33
43
|
|
34
|
-
|
35
|
-
test_connection()
|
36
|
-
|
37
|
-
install_rvm()
|
38
|
-
|
39
|
-
if nginx
|
40
|
-
install_passenger()
|
41
|
-
create_site_config()
|
42
|
-
end
|
44
|
+
Net::SSH.start(@options[:ssh_host], @options[:rails_user], keys: File.expand_path(@options[:private_key]), paranoid: false) do |ssh|
|
43
45
|
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
46
|
+
run_stream('bash -l -e /tmp/2.sh', ssh)
|
47
|
+
puts "ok"
|
48
|
+
end
|
49
|
+
ensure
|
50
|
+
Net::SSH.start(@options[:ssh_host], @options[:ssh_user], password: @options[:ssh_password], paranoid: false) do |ssh|
|
51
|
+
puts ssh.exec!('rm /tmp/variables.sh')
|
52
|
+
puts ssh.exec!('rm ' + remote_public_key_file)
|
53
|
+
puts ssh.exec!('rm /tmp/1.sh')
|
54
|
+
puts ssh.exec!('rm /tmp/2.sh')
|
55
|
+
end
|
56
|
+
end
|
53
57
|
|
54
|
-
|
55
|
-
|
56
|
-
|
58
|
+
def run_stream(cmd, ssh)
|
59
|
+
ssh.exec! cmd do |ch, success|
|
60
|
+
raise "could not execute command" unless success
|
57
61
|
|
58
|
-
|
59
|
-
|
62
|
+
ch.on_data do |c, data|
|
63
|
+
STDOUT.print data
|
60
64
|
end
|
61
65
|
|
62
|
-
|
63
|
-
|
66
|
+
ch.on_extended_data do |c, type, data|
|
67
|
+
STDERR.print data
|
64
68
|
end
|
65
|
-
|
66
|
-
revoke_sudo()
|
67
69
|
end
|
68
70
|
end
|
69
|
-
|
70
|
-
|
71
71
|
end
|
72
72
|
end
|
73
73
|
|
data/lib/pointer/version.rb
CHANGED
data/pointer.gemspec
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pointer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-03-
|
12
|
+
date: 2013-03-27 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: bundler
|
@@ -76,23 +76,7 @@ dependencies:
|
|
76
76
|
- !ruby/object:Gem::Version
|
77
77
|
version: '0'
|
78
78
|
- !ruby/object:Gem::Dependency
|
79
|
-
name:
|
80
|
-
requirement: !ruby/object:Gem::Requirement
|
81
|
-
none: false
|
82
|
-
requirements:
|
83
|
-
- - ! '>='
|
84
|
-
- !ruby/object:Gem::Version
|
85
|
-
version: '0'
|
86
|
-
type: :runtime
|
87
|
-
prerelease: false
|
88
|
-
version_requirements: !ruby/object:Gem::Requirement
|
89
|
-
none: false
|
90
|
-
requirements:
|
91
|
-
- - ! '>='
|
92
|
-
- !ruby/object:Gem::Version
|
93
|
-
version: '0'
|
94
|
-
- !ruby/object:Gem::Dependency
|
95
|
-
name: active_support
|
79
|
+
name: read-password
|
96
80
|
requirement: !ruby/object:Gem::Requirement
|
97
81
|
none: false
|
98
82
|
requirements:
|
@@ -122,18 +106,11 @@ files:
|
|
122
106
|
- Rakefile
|
123
107
|
- TODO.md
|
124
108
|
- bin/pointer
|
109
|
+
- config/1_as_root.sh
|
110
|
+
- config/2_as_rails.sh
|
125
111
|
- config/pointer.rb.default
|
112
|
+
- config/variables.sh.erb
|
126
113
|
- lib/pointer.rb
|
127
|
-
- lib/pointer/bit_bucket.rb
|
128
|
-
- lib/pointer/deployer_application.rb
|
129
|
-
- lib/pointer/helpers.rb
|
130
|
-
- lib/pointer/mina.rb
|
131
|
-
- lib/pointer/nginx_passenger.rb
|
132
|
-
- lib/pointer/postgres.rb
|
133
|
-
- lib/pointer/rails_user.rb
|
134
|
-
- lib/pointer/rvm.rb
|
135
|
-
- lib/pointer/ssh_helpers.rb
|
136
|
-
- lib/pointer/variables.rb
|
137
114
|
- lib/pointer/version.rb
|
138
115
|
- pointer.gemspec
|
139
116
|
homepage: ''
|
@@ -151,7 +128,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
151
128
|
version: '0'
|
152
129
|
segments:
|
153
130
|
- 0
|
154
|
-
hash:
|
131
|
+
hash: 2754358321784396675
|
155
132
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
156
133
|
none: false
|
157
134
|
requirements:
|
@@ -160,10 +137,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
160
137
|
version: '0'
|
161
138
|
segments:
|
162
139
|
- 0
|
163
|
-
hash:
|
140
|
+
hash: 2754358321784396675
|
164
141
|
requirements: []
|
165
142
|
rubyforge_project:
|
166
|
-
rubygems_version: 1.8.
|
143
|
+
rubygems_version: 1.8.23
|
167
144
|
signing_key:
|
168
145
|
specification_version: 3
|
169
146
|
summary: Quick deploy
|
data/lib/pointer/bit_bucket.rb
DELETED
@@ -1,25 +0,0 @@
|
|
1
|
-
module Pointer
|
2
|
-
module BitBucket
|
3
|
-
def add_bit_bucket_host()
|
4
|
-
what "Use this as deploy key"
|
5
|
-
puts '----'
|
6
|
-
puts get_file_contents('/home/rails/.ssh/id_rsa.pub')
|
7
|
-
puts '----'
|
8
|
-
|
9
|
-
if bitbucket
|
10
|
-
if @ssh.exec!('bash -lc "ssh -o StrictHostKeyChecking=no git@bitbucket.org"') =~ /Permission denied/
|
11
|
-
puts "Press ENTER when you added this deploy key to repository".red
|
12
|
-
STDIN.readline()
|
13
|
-
end
|
14
|
-
else
|
15
|
-
puts "You need to ssh into your machine as 'ssh #{rails_user}@#{host} -p #{port}'"
|
16
|
-
puts "then connect via ssh to your repository hosting, like so 'ssh git@github.com' and accept the key"
|
17
|
-
puts "Then you need to install the deploy key above"
|
18
|
-
puts "Press ENTER when you added this deploy key to repository".red
|
19
|
-
STDIN.readline()
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
|
-
|
24
|
-
end
|
25
|
-
end
|
@@ -1,52 +0,0 @@
|
|
1
|
-
module Pointer
|
2
|
-
module DeployerApplication
|
3
|
-
def install_deployer()
|
4
|
-
deployer_port = site_port.to_i + 8000
|
5
|
-
# TODO: detect if mina and sinatra already installed
|
6
|
-
puts rvm! "gem install mina"
|
7
|
-
puts rvm! "gem install sinatra"
|
8
|
-
|
9
|
-
local_key = get_file_contents('/home/rails/.ssh/id_rsa.pub')
|
10
|
-
ensure_file_contains("/home/rails/.ssh/authorized_keys", local_key)
|
11
|
-
puts @ssh.exec! "ssh -o StrictHostKeyChecking=no rails@#{host} pwd"
|
12
|
-
|
13
|
-
puts @ssh.exec! "mkdir -p applications/pointer/#{host}-#{site_port}/public"
|
14
|
-
|
15
|
-
|
16
|
-
server = "
|
17
|
-
server {
|
18
|
-
listen #{deployer_port};
|
19
|
-
server_name #{host};
|
20
|
-
passenger_enabled on;
|
21
|
-
passenger_user rails;
|
22
|
-
passenger_max_requests 10;
|
23
|
-
root /home/rails/applications/pointer/#{host}-#{site_port}/public;
|
24
|
-
}
|
25
|
-
"
|
26
|
-
|
27
|
-
put_file_contents("/opt/nginx/conf/rails-sites/pointer-#{host}-#{deployer_port}.conf", server)
|
28
|
-
|
29
|
-
mtime = "#{host}-#{site_port}"
|
30
|
-
config_ru = "
|
31
|
-
require 'sinatra'
|
32
|
-
|
33
|
-
post '/deploy/#{mtime}' do
|
34
|
-
`cd / && mina -f /home/rails/applications/pointer/#{host}-#{site_port}/deploy.rb deploy` # < /dev/null > /dev/null && echo OK
|
35
|
-
end
|
36
|
-
|
37
|
-
run Sinatra::Application
|
38
|
-
"
|
39
|
-
|
40
|
-
put_file_contents("applications/pointer/#{host}-#{site_port}/deploy.rb", IO.read('./config/deploy.rb'))
|
41
|
-
put_file_contents("applications/pointer/#{host}-#{site_port}/config.ru", config_ru)
|
42
|
-
puts @ssh.exec!('sudo service nginx restart')
|
43
|
-
|
44
|
-
hook_url = "http://#{host}:#{deployer_port}/deploy/#{mtime}"
|
45
|
-
puts "WebHook (POST) address: %s" % [hook_url.green]
|
46
|
-
puts "Add this to GitHub/BitBucket as WebHook/POST service, so that your code is automatically deployed on every push"
|
47
|
-
puts "Run, for example: curl -X POST #{hook_url}"
|
48
|
-
end
|
49
|
-
|
50
|
-
|
51
|
-
end
|
52
|
-
end
|
data/lib/pointer/helpers.rb
DELETED
@@ -1,23 +0,0 @@
|
|
1
|
-
require 'colorize'
|
2
|
-
|
3
|
-
module Pointer
|
4
|
-
module Helpers
|
5
|
-
def remote_repo()
|
6
|
-
`git config --get remote.origin.url`.gsub(/^ssh:\/\/(.*?)\//, '\\1:').strip
|
7
|
-
end
|
8
|
-
|
9
|
-
def assert_git()
|
10
|
-
unless File.exists?('.git')
|
11
|
-
raise "Please run from a Git repository (use private Git hosting from bitbucket.org for example)"
|
12
|
-
end
|
13
|
-
|
14
|
-
if remote_repo.to_s == ''
|
15
|
-
raise "This tool assumes you have git remote branch, named #{'origin'.green}"
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
def what(string)
|
20
|
-
puts "# #{string}".green
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|
data/lib/pointer/mina.rb
DELETED
@@ -1,89 +0,0 @@
|
|
1
|
-
module Pointer
|
2
|
-
module Mina
|
3
|
-
def check_mina_prereqs
|
4
|
-
if File.exists?('config/deploy.rb') and not ARGV.include?('--unlink-mina')
|
5
|
-
user_has_mina_config()
|
6
|
-
end
|
7
|
-
end
|
8
|
-
|
9
|
-
def mina_deploy()
|
10
|
-
what "[local -> remote] mina setup"
|
11
|
-
|
12
|
-
mina_setup = `mina setup </dev/null || echo "[ERROR]"`
|
13
|
-
puts mina_setup
|
14
|
-
if mina_setup.include? '[ERROR]'
|
15
|
-
raise "mina setup failed"
|
16
|
-
end
|
17
|
-
|
18
|
-
remote_db_config_file = "#{@options[:site_dir]}/shared/config/database.yml"
|
19
|
-
|
20
|
-
if @db_config
|
21
|
-
puts "I have a database config, putting it there"
|
22
|
-
put_file_contents(remote_db_config_file, @db_config)
|
23
|
-
else
|
24
|
-
if file_absent(remote_db_config_file)
|
25
|
-
db_config = IO.read(@options[:site_dir] + "/shared/config/database.yml")
|
26
|
-
put_file_contents(remote_db_config_file, db_config)
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
what "[local -> remote] mina deploy"
|
31
|
-
|
32
|
-
mina_deploy = `mina deploy </dev/null || echo "[ERROR]"`
|
33
|
-
puts mina_deploy
|
34
|
-
if mina_deploy.include? '[ERROR]'
|
35
|
-
raise "mina deploy failed"
|
36
|
-
end
|
37
|
-
|
38
|
-
what "done"
|
39
|
-
end
|
40
|
-
|
41
|
-
def mina_init()
|
42
|
-
if ARGV.include? '--unlink-mina'
|
43
|
-
puts "Unlinking mina config".on_red
|
44
|
-
File.unlink('config/deploy.rb') if File.exists? 'config/deploy.rb'
|
45
|
-
end
|
46
|
-
|
47
|
-
rvm_version = rvm!('rvm-prompt').strip
|
48
|
-
|
49
|
-
#`gem install mina`
|
50
|
-
what "[local] mina init"
|
51
|
-
mina_init = `mina init </dev/null || echo "[ERROR]"`
|
52
|
-
if mina_init.include? '[ERROR]'
|
53
|
-
puts mina_init
|
54
|
-
user_has_mina_config()
|
55
|
-
end
|
56
|
-
|
57
|
-
config = IO.read('config/deploy.rb')
|
58
|
-
config = config.gsub("# require 'mina/rvm'", "require 'mina/rvm'")
|
59
|
-
config = config.gsub("set :domain, 'foobar.com'", "set :domain, #{@options[:site_host].inspect}")
|
60
|
-
config = config.gsub("set :deploy_to, '/var/www/foobar.com'", "set :deploy_to, #{@options[:site_dir].inspect}")
|
61
|
-
config = config.gsub("# set :user, 'foobar'", " set :user, '#{rails_user}'")
|
62
|
-
config = config.gsub("# invoke :'rvm:use[ruby-1.9.3-p125@default]'", "invoke :'rvm:use[#{rvm_version}]'")
|
63
|
-
config = config.gsub("queue %[-----> Be sure to edit 'shared/config/database.yml'.]", "")
|
64
|
-
puts "Be sure to edit 'shared/config/database.yml'".on_red
|
65
|
-
config = config.gsub("set :repository, 'git://...'", "set :repository, #{remote_repo.inspect}",)
|
66
|
-
#config = config.gsub("set :shared_paths, ['config/database.yml', 'log']", "set :shared_paths, ['log', 'sqlite']",)
|
67
|
-
|
68
|
-
#database_symlink = "\n" +
|
69
|
-
# ' queue %[rm "#{deploy_to}/current/config/database.yml"]' + "\n" +
|
70
|
-
# ' queue %[ln -s "#{deploy_to}/shared/config/database.yml" "#{deploy_to}/current/config/database.yml"]' + "\n" +
|
71
|
-
# #' queue %[cat "#{deploy_to}/shared/config/database.yml"]' + "\n" +
|
72
|
-
# "\n "
|
73
|
-
#
|
74
|
-
#config = config.gsub("queue 'touch tmp/restart.txt'", database_symlink + "queue 'touch tmp/restart.txt'")
|
75
|
-
config = config.gsub("queue 'touch tmp/restart.txt'", 'queue "mkdir tmp; touch tmp/restart.txt"')
|
76
|
-
IO.write('config/deploy.rb', config)
|
77
|
-
# puts "Run #{'mina setup'.red} and #{'mina deploy'.red}"
|
78
|
-
|
79
|
-
`ssh -o StrictHostKeyChecking=no #{rails_user}@#{host} pwd`
|
80
|
-
|
81
|
-
end
|
82
|
-
|
83
|
-
def user_has_mina_config
|
84
|
-
puts "Run %s if you already have everything set up" % ["mina deploy".green]
|
85
|
-
puts "or run with --unlink-mina if you want to force mina config generation"
|
86
|
-
exit
|
87
|
-
end
|
88
|
-
end
|
89
|
-
end
|
@@ -1,63 +0,0 @@
|
|
1
|
-
module Pointer
|
2
|
-
module NginxPassenger
|
3
|
-
def install_passenger()
|
4
|
-
unless file_exists('/opt/nginx')
|
5
|
-
what 'Install nginx/passenger'
|
6
|
-
rvm!('gem install passenger')
|
7
|
-
@ssh.exec!('sudo mkdir /opt')
|
8
|
-
@ssh.exec!('sudo mkdir /opt/nginx')
|
9
|
-
@ssh.exec!('sudo chown rails:rails /opt/nginx')
|
10
|
-
rvm!('passenger-install-nginx-module --auto --auto-download --prefix=/opt/nginx')
|
11
|
-
|
12
|
-
what "Installing nginx init.d"
|
13
|
-
@ssh.exec!('sudo wget https://raw.github.com/slava-vishnyakov/useful-stuff/master/init.d-nginx.conf -O /etc/init.d/nginx')
|
14
|
-
|
15
|
-
what "Changing nginx.conf permissions"
|
16
|
-
@ssh.exec!('sudo chmod o+x /etc/init.d/nginx')
|
17
|
-
|
18
|
-
what "update-rc.d"
|
19
|
-
@ssh.exec!('sudo update-rc.d nginx defaults')
|
20
|
-
|
21
|
-
what "Installing nginx.conf"
|
22
|
-
@ssh.exec!('mv /opt/nginx/conf/nginx.conf /opt/nginx/conf/nginx.conf-orig')
|
23
|
-
@ssh.exec!('wget https://raw.github.com/slava-vishnyakov/useful-stuff/master/nginx.conf -O /opt/nginx/conf/nginx.conf')
|
24
|
-
|
25
|
-
what "Replacing passenger_ruby and passenger_root with actual Passenger data"
|
26
|
-
orig_file = get_file_contents '/opt/nginx/conf/nginx.conf-orig'
|
27
|
-
new_file = get_file_contents '/opt/nginx/conf/nginx.conf'
|
28
|
-
new_file.sub! /passenger_ruby (.*?);/, orig_file.match(/passenger_ruby (.*?);/)[0]
|
29
|
-
new_file.sub! /passenger_root (.*?);/, orig_file.match(/passenger_root (.*?);/)[0]
|
30
|
-
put_file_contents '/opt/nginx/conf/nginx.conf', new_file
|
31
|
-
|
32
|
-
what "Creating /opt/nginx/conf/rails-sites"
|
33
|
-
@ssh.exec!('mkdir /opt/nginx/conf/rails-sites')
|
34
|
-
|
35
|
-
what "Starting nginx"
|
36
|
-
@ssh.exec!('sudo service nginx start')
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
|
-
def create_site_config
|
41
|
-
config = "
|
42
|
-
server {
|
43
|
-
listen #{@options[:site_port]};
|
44
|
-
server_name #{@options[:site_host]};
|
45
|
-
passenger_enabled on;
|
46
|
-
root #{@options[:site_dir]}/current/public;
|
47
|
-
passenger_user rails;
|
48
|
-
passenger_max_requests 500;
|
49
|
-
}
|
50
|
-
"
|
51
|
-
config_file = "/opt/nginx/conf/rails-sites/#{@options[:site_host]}-#{@options[:site_port]}.conf"
|
52
|
-
|
53
|
-
if file_absent(config_file)
|
54
|
-
put_file_contents(config_file, config)
|
55
|
-
end
|
56
|
-
|
57
|
-
if @ssh.exec!("sudo /opt/nginx/sbin/nginx -t") =~ /test is successful/
|
58
|
-
@ssh.exec!("sudo service nginx reload")
|
59
|
-
end
|
60
|
-
end
|
61
|
-
|
62
|
-
end
|
63
|
-
end
|
data/lib/pointer/postgres.rb
DELETED
@@ -1,43 +0,0 @@
|
|
1
|
-
module Pointer
|
2
|
-
module Postgres
|
3
|
-
def install_postgres
|
4
|
-
# install_postgres_database
|
5
|
-
unless @ssh.exec! 'which psql'
|
6
|
-
# official apt repo does not support 12.10 (quantal) yet :(
|
7
|
-
puts @ssh.exec! 'sudo apt-get install -y libpq-dev'
|
8
|
-
puts @ssh.exec! 'sudo apt-get install -y software-properties-common'
|
9
|
-
puts @ssh.exec! 'sudo add-apt-repository ppa:pitti/postgresql'
|
10
|
-
puts @ssh.exec! 'sudo apt-get update'
|
11
|
-
puts @ssh.exec! 'sudo apt-get install -y postgresql-9.2'
|
12
|
-
end
|
13
|
-
|
14
|
-
# create_database
|
15
|
-
|
16
|
-
if file_absent("#{@options[:site_dir]}/shared/config/database.yml")
|
17
|
-
o = [('a'..'z'), ('A'..'Z'), ('0'..'9')].map { |i| i.to_a }.flatten
|
18
|
-
|
19
|
-
# TODO: save these on server??
|
20
|
-
password = (0...16).map { o[rand(o.length)] }.join
|
21
|
-
username = 'user_' + host.gsub(/[^a-z0-9]/, '_')
|
22
|
-
database = 'db_' + host.gsub(/[^a-z0-9]/, '_')
|
23
|
-
|
24
|
-
# sudo sudo -u postgres - because we only have password-less sudo to root
|
25
|
-
puts @ssh.exec!("sudo sudo -u postgres psql -c \"CREATE ROLE #{username} WITH CREATEDB LOGIN PASSWORD '#{password}'\"")
|
26
|
-
puts @ssh.exec!("sudo sudo -u postgres psql -c \"CREATE DATABASE #{database} OWNER #{username}\"");
|
27
|
-
|
28
|
-
# create database.yml
|
29
|
-
"production:\n" +
|
30
|
-
" adapter: postgresql\n" +
|
31
|
-
" host: 127.0.0.1\n" +
|
32
|
-
" encoding: utf8\n" +
|
33
|
-
" database: #{database}\n" +
|
34
|
-
" username: #{username}\n" +
|
35
|
-
" password: #{password}\n" +
|
36
|
-
''
|
37
|
-
else
|
38
|
-
nil
|
39
|
-
end
|
40
|
-
|
41
|
-
end
|
42
|
-
end
|
43
|
-
end
|
data/lib/pointer/rails_user.rb
DELETED
@@ -1,48 +0,0 @@
|
|
1
|
-
module Pointer
|
2
|
-
module RailsUser
|
3
|
-
def delete_rails_user
|
4
|
-
puts @ssh.exec!("userdel rails -f -r")
|
5
|
-
end
|
6
|
-
|
7
|
-
def create_rails_user
|
8
|
-
if @ssh.exec!("id rails") =~ /No such user/
|
9
|
-
expect_empty @ssh.exec!("useradd rails -d /home/#{rails_user} -m -s /bin/bash")
|
10
|
-
expect_empty @ssh.exec!("usermod -a -G sudo rails")
|
11
|
-
what "User created: rails"
|
12
|
-
else
|
13
|
-
what "User exists: rails"
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
def upload_public_key
|
18
|
-
ssh_dir = "/home/#{rails_user}/.ssh"
|
19
|
-
authorized_keys_file = ssh_dir + '/authorized_keys'
|
20
|
-
|
21
|
-
what "Uploading private key"
|
22
|
-
@ssh.exec!("mkdir #{ssh_dir}")
|
23
|
-
ensure_file_contains(authorized_keys_file, IO.read(File.expand_path(public_key)))
|
24
|
-
expect_empty @ssh.exec!("chown rails:rails #{ssh_dir}")
|
25
|
-
expect_empty @ssh.exec!("chown rails:rails #{authorized_keys_file}")
|
26
|
-
expect_empty @ssh.exec!("chmod 0700 #{ssh_dir}")
|
27
|
-
expect_empty @ssh.exec!("chmod 0600 #{authorized_keys_file}")
|
28
|
-
end
|
29
|
-
|
30
|
-
def add_sudo
|
31
|
-
sudo_string = "rails ALL = NOPASSWD:ALL"
|
32
|
-
ensure_file_contains('/etc/sudoers', sudo_string)
|
33
|
-
end
|
34
|
-
|
35
|
-
def revoke_sudo
|
36
|
-
puts "revoke_sudo is not implemented"
|
37
|
-
end
|
38
|
-
|
39
|
-
def print_deploy_key
|
40
|
-
id_rsa = '/home/rails/.ssh/id_rsa'
|
41
|
-
if file_absent(id_rsa)
|
42
|
-
what "Generating ssh key"
|
43
|
-
puts @ssh.exec!("ssh-keygen -q -t rsa -f #{id_rsa} -N ''")
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
end
|
48
|
-
end
|
data/lib/pointer/rvm.rb
DELETED
@@ -1,25 +0,0 @@
|
|
1
|
-
module Pointer
|
2
|
-
module Rvm
|
3
|
-
def install_rvm
|
4
|
-
if file_absent("/home/#{rails_user}/.rvm/scripts/rvm")
|
5
|
-
what "Update system"
|
6
|
-
puts @ssh.exec!("sudo apt-get -qq -y update")
|
7
|
-
what "Install build stuff"
|
8
|
-
puts @ssh.exec!("sudo apt-get -qq -y install curl libcurl4-gnutls-dev git nodejs build-essential openssl " +
|
9
|
-
" libreadline6 libreadline6-dev curl git-core zlib1g zlib1g-dev libssl-dev " +
|
10
|
-
" libyaml-dev libsqlite3-dev sqlite3 libxml2-dev libxslt-dev autoconf " +
|
11
|
-
" libc6-dev ncurses-dev automake libtool bison subversion pkg-config libgdbm-dev libffi-dev"
|
12
|
-
)
|
13
|
-
what "Actually install RVM (this takes some time)"
|
14
|
-
puts @ssh.exec!("\\curl -L https://get.rvm.io | bash -s stable --ruby=#{ruby_version}")
|
15
|
-
|
16
|
-
rvm!("rvm use #{ruby_version} --default")
|
17
|
-
ensure_file_contains('/home/rails/.gemrc', 'gem: --no-ri --no-rdoc')
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
def rvm!(command)
|
22
|
-
@ssh.exec!(". /home/#{rails_user}/.rvm/scripts/rvm && (#{command})")
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|
data/lib/pointer/ssh_helpers.rb
DELETED
@@ -1,84 +0,0 @@
|
|
1
|
-
require 'tempfile'
|
2
|
-
require 'net/ssh'
|
3
|
-
require 'net/scp'
|
4
|
-
require 'shellwords'
|
5
|
-
|
6
|
-
module Pointer
|
7
|
-
module SshHelpers
|
8
|
-
def get_file_contents(file_name)
|
9
|
-
@ssh.exec!("cat #{file_name.shellescape}")
|
10
|
-
end
|
11
|
-
|
12
|
-
def put_file_contents(file_name, string)
|
13
|
-
file = Tempfile.new('ssh')
|
14
|
-
file.write(string)
|
15
|
-
file.rewind
|
16
|
-
@ssh.scp.upload!(file.path, file_name)
|
17
|
-
end
|
18
|
-
|
19
|
-
def ensure_file_contains(file_name, string)
|
20
|
-
contents = file_absent(file_name) ? '' : get_file_contents(file_name).to_s
|
21
|
-
unless contents.include? string
|
22
|
-
unless contents.end_with? "\n"
|
23
|
-
contents += "\n"
|
24
|
-
end
|
25
|
-
|
26
|
-
contents += string
|
27
|
-
|
28
|
-
put_file_contents(file_name, contents)
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
|
-
def ensure_file_not_contains(file_name, string)
|
33
|
-
contents = file_absent(file_name) ? '' : get_file_contents(file_name).to_s
|
34
|
-
|
35
|
-
if contents and contents.include? string
|
36
|
-
contents.gsub!(string, '')
|
37
|
-
put_file_contents(file_name, contents)
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
|
-
def file_absent(file_name)
|
42
|
-
@ssh.exec!("ls #{file_name.shellescape}") =~ /No such file or directory/
|
43
|
-
end
|
44
|
-
|
45
|
-
def file_exists(file_name)
|
46
|
-
not file_absent(file_name)
|
47
|
-
end
|
48
|
-
|
49
|
-
def expect_empty(string)
|
50
|
-
if string
|
51
|
-
puts string
|
52
|
-
exit
|
53
|
-
end
|
54
|
-
end
|
55
|
-
|
56
|
-
def with_ssh
|
57
|
-
Net::SSH.start(host, rails_user, port: port, :keys => [private_key], :paranoid => false) do |ssh|
|
58
|
-
@ssh = ssh
|
59
|
-
yield
|
60
|
-
@ssh = 'Connection closed'
|
61
|
-
end
|
62
|
-
end
|
63
|
-
|
64
|
-
def with_root_ssh
|
65
|
-
Net::SSH.start(host, user, port: port, :password => password, :paranoid => false) do |ssh|
|
66
|
-
@ssh = ssh
|
67
|
-
yield
|
68
|
-
@ssh = 'Connection closed'
|
69
|
-
end
|
70
|
-
end
|
71
|
-
|
72
|
-
def test_connection
|
73
|
-
connection_test = `ssh -o StrictHostKeyChecking=no #{rails_user}@#{host} -p #{port} -i #{private_key} "echo OK"`
|
74
|
-
if connection_test.strip == "OK"
|
75
|
-
what "Connected via private key OK"
|
76
|
-
else
|
77
|
-
puts connection_test.on_red
|
78
|
-
raise "I cannot connect via private key!"
|
79
|
-
end
|
80
|
-
end
|
81
|
-
|
82
|
-
|
83
|
-
end
|
84
|
-
end
|
data/lib/pointer/variables.rb
DELETED
@@ -1,59 +0,0 @@
|
|
1
|
-
module Pointer
|
2
|
-
module Variables
|
3
|
-
def rails_user
|
4
|
-
@options[:rails_user]
|
5
|
-
end
|
6
|
-
|
7
|
-
def private_key
|
8
|
-
@options[:private_key]
|
9
|
-
end
|
10
|
-
|
11
|
-
def public_key
|
12
|
-
@options[:public_key]
|
13
|
-
end
|
14
|
-
|
15
|
-
def password
|
16
|
-
@options[:password]
|
17
|
-
end
|
18
|
-
|
19
|
-
def user
|
20
|
-
@options[:ssh_user]
|
21
|
-
end
|
22
|
-
|
23
|
-
def host
|
24
|
-
@options[:ssh_host]
|
25
|
-
end
|
26
|
-
|
27
|
-
def port
|
28
|
-
@options[:ssh_port]
|
29
|
-
end
|
30
|
-
|
31
|
-
def ruby_version
|
32
|
-
@options[:ruby_version] || "1.9.3"
|
33
|
-
end
|
34
|
-
|
35
|
-
def site_port
|
36
|
-
@options[:site_port].to_i || 80
|
37
|
-
end
|
38
|
-
|
39
|
-
def nginx
|
40
|
-
@options[:web_server] == :nginx
|
41
|
-
end
|
42
|
-
|
43
|
-
def bitbucket
|
44
|
-
@options[:git_repo].include? '@bitbucket.org'
|
45
|
-
end
|
46
|
-
|
47
|
-
def mina
|
48
|
-
@options[:deployer] == :mina
|
49
|
-
end
|
50
|
-
|
51
|
-
def deployer_application
|
52
|
-
@options[:deployer_application]
|
53
|
-
end
|
54
|
-
|
55
|
-
def postgres
|
56
|
-
@options[:database] == :postgres
|
57
|
-
end
|
58
|
-
end
|
59
|
-
end
|