2014-06-23 11:10:09 -07:00
from fabric . api import cd , lcd , env , local , parallel , serial
2012-07-09 15:49:57 -07:00
from fabric . api import put , run , settings , sudo
2013-03-22 13:36:32 -07:00
from fabric . operations import prompt
2012-07-09 15:49:57 -07:00
# from fabric.colors import red, green, blue, cyan, magenta, white, yellow
2012-10-15 16:32:32 -07:00
from boto . s3 . connection import S3Connection
from boto . s3 . key import Key
from boto . ec2 . connection import EC2Connection
2010-12-16 13:54:09 -05:00
from fabric . contrib import django
2013-06-02 18:35:26 -07:00
from fabric . state import connections
2013-05-15 17:52:35 -07:00
from vendor import yaml
2013-05-20 13:40:46 -07:00
from pprint import pprint
2013-08-12 14:21:07 -07:00
from collections import defaultdict
2012-07-09 15:49:57 -07:00
import os
2012-10-15 16:32:32 -07:00
import time
import sys
2013-01-07 11:33:24 -08:00
import re
2013-08-23 17:29:32 -07:00
2013-03-18 09:51:20 +00:00
try :
import dop . client
except ImportError :
print " Digital Ocean ' s API not loaded "
2010-12-16 13:54:09 -05:00
django . settings_module ( ' settings ' )
2011-07-17 11:31:07 -07:00
try :
from django . conf import settings as django_settings
except ImportError :
print " ---> Django not installed yet. "
2011-07-17 15:30:25 -07:00
django_settings = None
2011-07-17 11:31:07 -07:00
2010-07-30 23:50:49 -04:00
2011-07-17 15:52:06 -07:00
# ============
# = DEFAULTS =
# ============
2013-08-20 13:21:44 -07:00
env . NEWSBLUR_PATH = " /srv/newsblur "
env . SECRETS_PATH = " /srv/secrets-newsblur "
env . VENDOR_PATH = " /srv/code "
2013-05-15 17:46:45 -07:00
env . user = ' sclay '
2013-08-12 11:58:23 -07:00
env . key_filename = os . path . join ( env . SECRETS_PATH , ' keys/newsblur.key ' )
2015-03-09 18:20:49 -07:00
env . connection_attempts = 10
2013-05-08 01:59:33 -07:00
2010-07-30 23:50:49 -04:00
# =========
# = Roles =
# =========
2013-03-24 22:31:46 -07:00
try :
hosts_path = os . path . expanduser ( os . path . join ( env . SECRETS_PATH , ' configs/hosts.yml ' ) )
roles = yaml . load ( open ( hosts_path ) )
for role_name , hosts in roles . items ( ) :
if isinstance ( hosts , dict ) :
2013-03-25 09:46:43 -07:00
roles [ role_name ] = [ host for host in hosts . keys ( ) ]
2013-03-24 22:31:46 -07:00
env . roledefs = roles
except :
print " ***> No role definitions found in %s . Using default roles. " % hosts_path
env . roledefs = {
' app ' : [ ' app01.newsblur.com ' ] ,
' db ' : [ ' db01.newsblur.com ' ] ,
' task ' : [ ' task01.newsblur.com ' ] ,
}
2010-07-30 23:50:49 -04:00
2013-05-20 13:40:46 -07:00
def do_roledefs ( split = False ) :
2013-05-20 12:03:04 -07:00
doapi = dop . client . Client ( django_settings . DO_CLIENT_KEY , django_settings . DO_API_KEY )
droplets = doapi . show_active_droplets ( )
2013-06-02 18:35:26 -07:00
hostnames = { }
2013-05-20 13:40:46 -07:00
for droplet in droplets :
roledef = re . split ( r " ([0-9]+) " , droplet . name ) [ 0 ]
if roledef not in env . roledefs :
env . roledefs [ roledef ] = [ ]
2013-06-02 18:35:26 -07:00
if roledef not in hostnames :
hostnames [ roledef ] = [ ]
if droplet . ip_address not in hostnames [ roledef ] :
hostnames [ roledef ] . append ( { ' name ' : droplet . name , ' address ' : droplet . ip_address } )
if droplet . ip_address not in env . roledefs [ roledef ] :
2013-05-20 13:40:46 -07:00
env . roledefs [ roledef ] . append ( droplet . ip_address )
2013-06-02 18:35:26 -07:00
if split :
return hostnames
2013-05-20 12:57:45 -07:00
return droplets
2013-05-20 13:40:46 -07:00
def list_do ( ) :
2013-06-14 12:29:19 -07:00
droplets = do ( split = True )
pprint ( droplets )
2015-05-06 19:22:53 -07:00
2013-08-12 14:21:07 -07:00
doapi = dop . client . Client ( django_settings . DO_CLIENT_KEY , django_settings . DO_API_KEY )
droplets = doapi . show_active_droplets ( )
sizes = doapi . sizes ( )
sizes = dict ( ( size . id , re . split ( r " ([^0-9]+) " , size . name ) [ 0 ] ) for size in sizes )
role_costs = defaultdict ( int )
total_cost = 0
for droplet in droplets :
roledef = re . split ( r " ([0-9]+) " , droplet . name ) [ 0 ]
2015-05-06 19:22:53 -07:00
size = int ( sizes . get ( droplet . size_id , 96 ) )
if size == 512 :
size = .5
cost = int ( size * 10 )
2013-08-12 14:21:07 -07:00
role_costs [ roledef ] + = cost
total_cost + = cost
print " \n \n Costs: "
pprint ( dict ( role_costs ) )
print " ---> Total cost: $ %s /month " % total_cost
2013-06-14 12:29:19 -07:00
2013-06-02 18:35:26 -07:00
def host ( * names ) :
env . hosts = [ ]
2014-01-28 15:14:23 -08:00
env . doname = ' , ' . join ( names )
2013-06-02 18:35:26 -07:00
hostnames = do ( split = True )
2013-07-17 13:40:45 -07:00
for role , hosts in hostnames . items ( ) :
for host in hosts :
2013-06-16 08:16:14 -07:00
if isinstance ( host , dict ) and host [ ' name ' ] in names :
2013-06-02 18:35:26 -07:00
env . hosts . append ( host [ ' address ' ] )
print " ---> Using %s as hosts " % env . hosts
2013-05-20 12:03:04 -07:00
2011-03-24 09:27:05 -04:00
# ================
# = Environments =
# ================
2010-07-30 23:50:49 -04:00
2013-06-02 18:35:26 -07:00
def server ( ) :
2013-03-13 19:17:45 -07:00
env . NEWSBLUR_PATH = " /srv/newsblur "
env . VENDOR_PATH = " /srv/code "
2013-06-02 18:35:26 -07:00
def do ( split = False ) :
server ( )
2013-05-20 13:40:46 -07:00
droplets = do_roledefs ( split = split )
2013-06-12 13:52:43 -07:00
if split :
for roledef , hosts in env . roledefs . items ( ) :
if roledef not in droplets :
droplets [ roledef ] = hosts
2013-05-20 13:40:46 -07:00
return droplets
2011-08-29 18:43:17 -07:00
2010-12-16 13:54:09 -05:00
def app ( ) :
2013-05-20 12:03:04 -07:00
do ( )
2010-12-16 13:54:09 -05:00
env . roles = [ ' app ' ]
2013-04-15 18:32:13 -07:00
2013-06-23 13:47:19 -07:00
def web ( ) :
do ( )
env . roles = [ ' app ' , ' push ' , ' work ' ]
2013-04-15 18:32:13 -07:00
def work ( ) :
2013-05-20 12:03:04 -07:00
do ( )
2013-04-15 18:32:13 -07:00
env . roles = [ ' work ' ]
2013-05-08 01:59:33 -07:00
2013-05-20 15:52:11 -07:00
def www ( ) :
do ( )
env . roles = [ ' www ' ]
2012-03-29 13:57:38 -07:00
def dev ( ) :
2013-05-20 12:03:04 -07:00
do ( )
2012-03-29 13:57:38 -07:00
env . roles = [ ' dev ' ]
2011-07-17 15:52:06 -07:00
2013-05-14 16:01:06 -07:00
def debug ( ) :
2013-05-20 12:03:04 -07:00
do ( )
2013-05-14 16:01:06 -07:00
env . roles = [ ' debug ' ]
def node ( ) :
2013-05-20 12:03:04 -07:00
do ( )
2013-05-14 16:01:06 -07:00
env . roles = [ ' node ' ]
2013-08-12 14:21:07 -07:00
def push ( ) :
do ( )
env . roles = [ ' push ' ]
2010-12-16 13:54:09 -05:00
def db ( ) :
2013-05-20 12:03:04 -07:00
do ( )
2010-12-16 13:54:09 -05:00
env . roles = [ ' db ' ]
2013-05-08 01:59:33 -07:00
2010-12-16 13:54:09 -05:00
def task ( ) :
2013-05-20 12:03:04 -07:00
do ( )
2010-12-16 13:54:09 -05:00
env . roles = [ ' task ' ]
2013-05-08 01:59:33 -07:00
2012-10-25 14:20:36 -07:00
def ec2task ( ) :
ec2 ( )
env . roles = [ ' ec2task ' ]
2013-05-08 01:59:33 -07:00
2012-09-18 13:08:25 -07:00
def ec2 ( ) :
env . user = ' ubuntu '
env . key_filename = [ ' /Users/sclay/.ec2/sclay.pem ' ]
2013-05-20 12:03:04 -07:00
do ( )
2013-05-04 23:27:36 -07:00
def all ( ) :
2013-05-20 12:03:04 -07:00
do ( )
2015-06-14 22:20:40 -07:00
env . roles = [ ' app ' , ' db ' , ' task ' , ' debug ' , ' node ' , ' push ' , ' work ' ]
2013-05-08 01:59:33 -07:00
2011-02-08 22:07:59 -05:00
# =============
# = Bootstrap =
# =============
2011-03-24 09:27:05 -04:00
def setup_common ( ) :
setup_installs ( )
2013-05-08 01:59:33 -07:00
change_shell ( )
2011-03-24 09:27:05 -04:00
setup_user ( )
2011-12-13 17:50:33 -08:00
setup_sudoers ( )
2013-03-20 15:05:52 -07:00
setup_ulimit ( )
2011-03-24 09:27:05 -04:00
setup_repo ( )
2011-07-17 15:52:06 -07:00
setup_repo_local_settings ( )
2011-03-24 09:27:05 -04:00
setup_local_files ( )
2013-05-20 13:40:46 -07:00
setup_time_calibration ( )
2013-05-29 18:00:09 -07:00
setup_psql_client ( )
2011-03-24 09:27:05 -04:00
setup_libxml ( )
setup_python ( )
setup_supervisor ( )
setup_hosts ( )
config_pgbouncer ( )
2013-06-17 16:16:43 -07:00
setup_mongoengine_repo ( )
2013-06-20 13:17:18 -07:00
# setup_forked_mongoengine()
2015-03-09 18:20:49 -07:00
# setup_pymongo_repo()
2011-03-24 09:27:05 -04:00
setup_logrotate ( )
setup_nginx ( )
2013-06-21 13:21:52 -07:00
# setup_imaging()
2012-12-24 20:24:45 -08:00
setup_munin ( )
2011-03-24 09:27:05 -04:00
2013-01-16 11:06:59 -08:00
def setup_all ( ) :
2011-02-09 15:45:41 -05:00
setup_common ( )
2013-01-16 11:06:59 -08:00
setup_app ( skip_common = True )
setup_db ( skip_common = True )
setup_task ( skip_common = True )
2013-05-08 01:59:33 -07:00
2013-01-16 11:06:59 -08:00
def setup_app ( skip_common = False ) :
if not skip_common :
setup_common ( )
2011-09-07 22:35:20 -07:00
setup_app_firewall ( )
2015-05-06 19:22:53 -07:00
setup_motd ( ' app ' )
2012-05-02 16:46:00 -07:00
copy_app_settings ( )
2013-06-23 13:47:19 -07:00
config_nginx ( )
2011-07-17 20:53:30 -07:00
setup_gunicorn ( supervisor = True )
2013-06-23 13:47:19 -07:00
# setup_node_app()
# config_node()
deploy_web ( )
2012-12-10 10:49:36 -08:00
config_monit_app ( )
2015-03-09 18:20:49 -07:00
setup_usage_monitor ( )
2013-06-02 18:35:26 -07:00
done ( )
2011-02-09 15:45:41 -05:00
2013-07-01 08:06:45 -07:00
def setup_app_image ( ) :
copy_app_settings ( )
setup_hosts ( )
config_pgbouncer ( )
deploy_web ( )
2013-06-23 13:47:19 -07:00
def setup_node ( ) :
setup_node_app ( )
config_node ( )
2013-03-26 16:27:01 -07:00
def setup_db ( engine = None , skip_common = False ) :
2015-05-06 22:36:43 -07:00
if not skip_common :
setup_common ( )
2015-07-06 19:09:13 -07:00
setup_db_firewall ( )
2015-05-06 22:36:43 -07:00
setup_motd ( ' db ' )
copy_db_settings ( )
if engine == " memcached " :
setup_memcached ( )
elif engine == " postgres " :
2013-03-15 17:05:44 -07:00
setup_postgres ( standby = False )
2015-03-09 14:50:07 -07:00
setup_postgres_backups ( )
2013-03-20 12:24:36 -07:00
elif engine == " postgres_slave " :
2013-03-15 17:05:44 -07:00
setup_postgres ( standby = True )
2013-06-02 18:35:26 -07:00
elif engine . startswith ( " mongo " ) :
2015-05-10 12:12:53 -07:00
setup_mongo ( )
2014-05-30 12:01:04 -07:00
setup_mongo_mms ( )
2015-03-09 14:50:07 -07:00
setup_mongo_backups ( )
2013-03-20 12:24:36 -07:00
elif engine == " redis " :
2013-03-15 17:05:44 -07:00
setup_redis ( )
2015-03-09 14:50:07 -07:00
setup_redis_backups ( )
2013-04-07 17:19:59 -07:00
elif engine == " redis_slave " :
setup_redis ( slave = True )
2014-04-22 15:15:42 -07:00
elif engine == " elasticsearch " :
setup_elasticsearch ( )
setup_db_search ( )
2013-01-16 11:06:59 -08:00
setup_gunicorn ( supervisor = False )
2012-03-30 14:56:16 -07:00
setup_db_munin ( )
2015-03-09 18:20:49 -07:00
setup_usage_monitor ( )
2013-06-02 18:35:26 -07:00
done ( )
2013-05-08 01:59:33 -07:00
2013-01-16 11:06:59 -08:00
# if env.user == 'ubuntu':
# setup_db_mdadm()
2011-03-14 21:44:30 -04:00
2013-04-03 16:23:55 -07:00
def setup_task ( queue = None , skip_common = False ) :
2013-01-16 11:06:59 -08:00
if not skip_common :
setup_common ( )
2011-09-07 22:35:20 -07:00
setup_task_firewall ( )
2015-05-06 19:22:53 -07:00
setup_motd ( ' task ' )
2012-05-02 16:46:00 -07:00
copy_task_settings ( )
2013-04-03 16:23:55 -07:00
enable_celery_supervisor ( queue )
2011-03-19 18:35:44 -04:00
setup_gunicorn ( supervisor = False )
2012-08-15 17:02:55 -07:00
config_monit_task ( )
2015-03-09 18:20:49 -07:00
setup_usage_monitor ( )
2013-06-02 18:35:26 -07:00
done ( )
2011-02-09 15:45:41 -05:00
2013-07-01 11:50:30 -07:00
def setup_task_image ( ) :
2014-08-22 08:17:53 -07:00
setup_installs ( )
2013-07-01 11:50:30 -07:00
copy_task_settings ( )
setup_hosts ( )
config_pgbouncer ( )
2014-01-28 15:14:23 -08:00
pull ( )
pip ( )
2015-05-10 12:12:53 -07:00
deploy ( reload = True )
2014-01-28 15:14:23 -08:00
done ( )
2013-07-01 11:50:30 -07:00
2011-03-14 21:44:30 -04:00
# ==================
# = Setup - Common =
# ==================
2013-05-08 01:59:33 -07:00
2013-07-17 13:40:45 -07:00
def done ( ) :
print " \n \n \n \n ----------------------------------------------------- "
2014-05-29 17:53:16 -07:00
print " \n \n %s IS SUCCESSFULLY BOOTSTRAPPED " % ( env . get ( ' doname ' ) or env . host_string )
2013-07-17 13:40:45 -07:00
print " \n \n ----------------------------------------------------- \n \n \n \n "
2011-02-08 22:07:59 -05:00
def setup_installs ( ) :
2013-07-17 13:40:45 -07:00
packages = [
' build-essential ' ,
' gcc ' ,
' scons ' ,
' libreadline-dev ' ,
' sysstat ' ,
' iotop ' ,
' git ' ,
' python-dev ' ,
' locate ' ,
' python-software-properties ' ,
' software-properties-common ' ,
' libpcre3-dev ' ,
' libncurses5-dev ' ,
' libdbd-pg-perl ' ,
' libssl-dev ' ,
2014-05-22 11:28:45 -07:00
' libffi-dev ' ,
2013-07-17 13:40:45 -07:00
' make ' ,
2015-02-23 13:31:05 -08:00
' pgbouncer ' ,
2013-07-17 13:40:45 -07:00
' python-setuptools ' ,
' python-psycopg2 ' ,
' libyaml-0-2 ' ,
' python-yaml ' ,
' python-numpy ' ,
' python-scipy ' ,
' curl ' ,
' monit ' ,
' ufw ' ,
' libjpeg8 ' ,
' libjpeg62-dev ' ,
' libfreetype6 ' ,
' libfreetype6-dev ' ,
' python-imaging ' ,
]
2014-09-24 17:00:33 -07:00
# sudo("sed -i -e 's/archive.ubuntu.com\|security.ubuntu.com/old-releases.ubuntu.com/g' /etc/apt/sources.list")
put ( " config/apt_sources.conf " , " /etc/apt/sources.list " , use_sudo = True )
2011-02-09 15:45:41 -05:00
sudo ( ' apt-get -y update ' )
2014-09-24 17:00:33 -07:00
sudo ( ' DEBIAN_FRONTEND=noninteractive apt-get -y --force-yes -o Dpkg::Options::= " --force-confdef " -o Dpkg::Options::= " --force-confold " dist-upgrade ' )
sudo ( ' DEBIAN_FRONTEND=noninteractive apt-get -y --force-yes -o Dpkg::Options::= " --force-confdef " -o Dpkg::Options::= " --force-confold " install %s ' % ' ' . join ( packages ) )
2013-06-21 13:11:54 -07:00
2013-06-24 00:43:07 -07:00
with settings ( warn_only = True ) :
sudo ( " ln -s /usr/lib/x86_64-linux-gnu/libjpeg.so /usr/lib " )
sudo ( " ln -s /usr/lib/x86_64-linux-gnu/libfreetype.so /usr/lib " )
sudo ( " ln -s /usr/lib/x86_64-linux-gnu/libz.so /usr/lib " )
2013-06-21 13:11:54 -07:00
2013-03-20 12:24:36 -07:00
with settings ( warn_only = True ) :
sudo ( ' mkdir -p %s ' % env . VENDOR_PATH )
2013-03-20 15:05:52 -07:00
sudo ( ' chown %s . %s %s ' % ( env . user , env . user , env . VENDOR_PATH ) )
2013-05-08 01:59:33 -07:00
def change_shell ( ) :
sudo ( ' apt-get -y install zsh ' )
with settings ( warn_only = True ) :
run ( ' git clone git://github.com/robbyrussell/oh-my-zsh.git ~/.oh-my-zsh ' )
sudo ( ' chsh %s -s /bin/zsh ' % env . user )
2011-03-14 21:44:30 -04:00
def setup_user ( ) :
2012-09-18 13:08:25 -07:00
# run('useradd -c "NewsBlur" -m newsblur -s /bin/zsh')
2011-03-14 21:44:30 -04:00
# run('openssl rand -base64 8 | tee -a ~conesus/.password | passwd -stdin conesus')
run ( ' mkdir -p ~/.ssh && chmod 700 ~/.ssh ' )
2011-03-15 10:02:13 -04:00
run ( ' rm -fr ~/.ssh/id_dsa* ' )
2011-03-14 21:44:30 -04:00
run ( ' ssh-keygen -t dsa -f ~/.ssh/id_dsa -N " " ' )
2011-03-15 10:02:13 -04:00
run ( ' touch ~/.ssh/authorized_keys ' )
put ( " ~/.ssh/id_dsa.pub " , " authorized_keys " )
2013-08-12 11:58:23 -07:00
run ( " echo \" \n \" >> ~sclay/.ssh/authorized_keys " )
run ( ' echo `cat authorized_keys` >> ~sclay/.ssh/authorized_keys ' )
2012-09-18 13:08:25 -07:00
run ( ' rm authorized_keys ' )
2013-05-08 01:59:33 -07:00
2013-07-17 13:40:45 -07:00
def copy_ssh_keys ( ) :
put ( os . path . join ( env . SECRETS_PATH , ' keys/newsblur.key.pub ' ) , " local_keys " )
2013-08-12 11:58:23 -07:00
run ( " echo \" \n \" >> ~sclay/.ssh/authorized_keys " )
run ( " echo `cat local_keys` >> ~sclay/.ssh/authorized_keys " )
2011-12-13 17:50:33 -08:00
run ( " rm local_keys " )
2013-05-08 01:59:33 -07:00
2011-02-09 15:45:41 -05:00
def setup_repo ( ) :
2012-10-15 16:32:32 -07:00
sudo ( ' mkdir -p /srv ' )
2013-05-20 19:27:10 -07:00
sudo ( ' chown -R %s . %s /srv ' % ( env . user , env . user ) )
2013-05-20 13:40:46 -07:00
with settings ( warn_only = True ) :
2013-05-20 19:27:10 -07:00
run ( ' git clone https://github.com/samuelclay/NewsBlur.git %s ' % env . NEWSBLUR_PATH )
2013-05-20 13:40:46 -07:00
with settings ( warn_only = True ) :
2013-05-20 19:27:10 -07:00
sudo ( ' ln -sfn /srv/code /home/ %s /code ' % env . user )
sudo ( ' ln -sfn /srv/newsblur /home/ %s /newsblur ' % env . user )
2011-07-17 15:52:06 -07:00
def setup_repo_local_settings ( ) :
2011-07-17 15:56:28 -07:00
with cd ( env . NEWSBLUR_PATH ) :
2011-02-09 15:45:41 -05:00
run ( ' cp local_settings.py.template local_settings.py ' )
run ( ' mkdir -p logs ' )
2011-03-19 18:35:44 -04:00
run ( ' touch logs/newsblur.log ' )
2011-02-09 15:45:41 -05:00
2011-03-15 10:02:13 -04:00
def setup_local_files ( ) :
put ( " config/toprc " , " ./.toprc " )
put ( " config/zshrc " , " ./.zshrc " )
2011-03-19 19:24:14 -04:00
put ( ' config/gitconfig.txt ' , ' ./.gitconfig ' )
2011-04-02 00:31:43 -04:00
put ( ' config/ssh.conf ' , ' ./.ssh/config ' )
2011-03-15 10:02:13 -04:00
2013-05-29 18:00:09 -07:00
def setup_psql_client ( ) :
2013-06-24 20:56:22 -07:00
sudo ( ' apt-get -y --force-yes install postgresql-client ' )
2013-05-29 18:00:09 -07:00
sudo ( ' mkdir -p /var/run/postgresql ' )
2015-02-23 13:31:05 -08:00
with settings ( warn_only = True ) :
sudo ( ' chown postgres.postgres /var/run/postgresql ' )
2013-05-29 18:00:09 -07:00
2011-02-09 15:45:41 -05:00
def setup_libxml ( ) :
sudo ( ' apt-get -y install libxml2-dev libxslt1-dev python-lxml ' )
2011-03-24 09:27:05 -04:00
def setup_libxml_code ( ) :
2011-07-17 15:56:28 -07:00
with cd ( env . VENDOR_PATH ) :
2011-03-24 09:27:05 -04:00
run ( ' git clone git://git.gnome.org/libxml2 ' )
run ( ' git clone git://git.gnome.org/libxslt ' )
2013-05-08 01:59:33 -07:00
2011-07-17 20:53:30 -07:00
with cd ( os . path . join ( env . VENDOR_PATH , ' libxml2 ' ) ) :
2011-03-24 09:27:05 -04:00
run ( ' ./configure && make && sudo make install ' )
2013-05-08 01:59:33 -07:00
2011-07-17 20:53:30 -07:00
with cd ( os . path . join ( env . VENDOR_PATH , ' libxslt ' ) ) :
2011-03-24 09:27:05 -04:00
run ( ' ./configure && make && sudo make install ' )
2011-07-17 12:08:24 -07:00
def setup_psycopg ( ) :
2012-02-23 13:20:10 -08:00
sudo ( ' easy_install -U psycopg2 ' )
2013-03-19 18:06:01 +00:00
2011-03-14 21:44:30 -04:00
def setup_python ( ) :
2014-01-21 16:56:03 -08:00
sudo ( ' easy_install -U pip ' )
2014-01-28 15:14:23 -08:00
# sudo('easy_install -U $(<%s)' %
# os.path.join(env.NEWSBLUR_PATH, 'config/requirements.txt'))
pip ( )
2011-07-17 15:30:25 -07:00
put ( ' config/pystartup.py ' , ' .pystartup ' )
2013-03-19 18:06:01 +00:00
2012-07-17 12:07:26 -07:00
# with cd(os.path.join(env.NEWSBLUR_PATH, 'vendor/cjson')):
# sudo('python setup.py install')
2013-03-19 18:06:01 +00:00
2011-09-07 22:35:20 -07:00
with settings ( warn_only = True ) :
2012-05-17 12:42:15 -07:00
sudo ( ' su -c \' echo " import sys; sys.setdefaultencoding( \\ \\ " utf-8 \\ \\ " ) " > /usr/lib/python2.7/sitecustomize.py \' ' )
2013-06-17 16:16:43 -07:00
sudo ( " chmod a+r /usr/local/lib/python2.7/dist-packages/httplib2-0.8-py2.7.egg/EGG-INFO/top_level.txt " )
2013-06-23 13:47:19 -07:00
sudo ( " chmod a+r /usr/local/lib/python2.7/dist-packages/python_dateutil-2.1-py2.7.egg/EGG-INFO/top_level.txt " )
2013-06-26 14:50:15 -07:00
sudo ( " chmod a+r /usr/local/lib/python2.7/dist-packages/httplib2-0.8-py2.7.egg/httplib2/cacerts.txt " )
2013-06-17 16:16:43 -07:00
2013-03-29 16:36:13 -07:00
if env . user == ' ubuntu ' :
2013-04-03 16:48:42 -07:00
with settings ( warn_only = True ) :
sudo ( ' chown -R ubuntu.ubuntu /home/ubuntu/.python-eggs ' )
2011-07-17 21:29:25 -07:00
2014-01-21 16:56:03 -08:00
def pip ( ) :
2014-04-11 18:09:23 -07:00
pull ( )
2014-01-21 17:27:15 -08:00
with cd ( env . NEWSBLUR_PATH ) :
sudo ( ' easy_install -U pip ' )
2014-01-21 17:30:20 -08:00
sudo ( ' pip install --upgrade pip ' )
2014-09-18 10:07:21 -07:00
sudo ( ' pip install --upgrade six ' ) # Stupid cryptography bug requires upgraded six
2014-01-21 17:27:15 -08:00
sudo ( ' pip install -r requirements.txt ' )
2014-01-21 16:56:03 -08:00
2011-07-17 21:29:25 -07:00
# PIL - Only if python-imaging didn't install through apt-get, like on Mac OS X.
def setup_imaging ( ) :
2013-06-21 13:21:52 -07:00
sudo ( ' easy_install --always-unzip pil ' )
2013-05-08 01:59:33 -07:00
2011-03-14 21:44:30 -04:00
def setup_supervisor ( ) :
sudo ( ' apt-get -y install supervisor ' )
2013-04-07 17:19:59 -07:00
put ( ' config/supervisord.conf ' , ' /etc/supervisor/supervisord.conf ' , use_sudo = True )
sudo ( ' /etc/init.d/supervisor stop ' )
2013-04-06 12:31:51 -07:00
sudo ( ' sleep 2 ' )
2013-05-29 18:00:09 -07:00
sudo ( ' ulimit -n 100000 && /etc/init.d/supervisor start ' )
2013-03-14 18:43:01 -07:00
2013-04-21 06:07:01 -07:00
@parallel
2011-03-15 18:06:24 -04:00
def setup_hosts ( ) :
2013-07-17 13:40:45 -07:00
put ( os . path . join ( env . SECRETS_PATH , ' configs/hosts ' ) , ' /etc/hosts ' , use_sudo = True )
2013-08-23 17:29:32 -07:00
sudo ( ' echo " \n \n 127.0.0.1 `hostname` " >> /etc/hosts ' )
2011-03-19 16:19:53 -04:00
2011-03-23 15:43:15 -04:00
def config_pgbouncer ( ) :
2015-02-23 13:31:05 -08:00
put ( ' config/pgbouncer.conf ' , ' pgbouncer.conf ' )
sudo ( ' mv pgbouncer.conf /etc/pgbouncer/pgbouncer.ini ' )
put ( os . path . join ( env . SECRETS_PATH , ' configs/pgbouncer_auth.conf ' ) , ' userlist.txt ' )
sudo ( ' mv userlist.txt /etc/pgbouncer/userlist.txt ' )
2011-12-27 21:38:32 -08:00
sudo ( ' echo " START=1 " > /etc/default/pgbouncer ' )
2012-07-20 01:26:56 -07:00
sudo ( ' su postgres -c " /etc/init.d/pgbouncer stop " ' , pty = False )
2011-09-09 17:43:56 -07:00
with settings ( warn_only = True ) :
2013-10-11 19:46:33 -07:00
sudo ( ' pkill -9 pgbouncer -e ' )
2012-05-15 15:25:01 -07:00
run ( ' sleep 2 ' )
2012-07-20 01:26:56 -07:00
sudo ( ' /etc/init.d/pgbouncer start ' , pty = False )
def bounce_pgbouncer ( ) :
sudo ( ' su postgres -c " /etc/init.d/pgbouncer stop " ' , pty = False )
2013-06-24 00:12:10 -07:00
run ( ' sleep 2 ' )
2012-07-20 01:26:56 -07:00
with settings ( warn_only = True ) :
2015-04-16 19:07:37 -07:00
sudo ( ' pkill -9 pgbouncer ' )
2013-06-24 00:12:10 -07:00
run ( ' sleep 2 ' )
2012-07-20 01:26:56 -07:00
run ( ' sudo /etc/init.d/pgbouncer start ' , pty = False )
2013-05-08 01:59:33 -07:00
2012-08-15 17:02:55 -07:00
def config_monit_task ( ) :
put ( ' config/monit_task.conf ' , ' /etc/monit/conf.d/celery.conf ' , use_sudo = True )
2013-07-06 00:56:13 -07:00
sudo ( ' echo " START=yes " > /etc/default/monit ' )
2012-08-15 17:02:55 -07:00
sudo ( ' /etc/init.d/monit restart ' )
2013-05-08 01:59:33 -07:00
2013-05-28 18:21:55 -07:00
def config_monit_node ( ) :
put ( ' config/monit_node.conf ' , ' /etc/monit/conf.d/node.conf ' , use_sudo = True )
2013-07-06 00:56:13 -07:00
sudo ( ' echo " START=yes " > /etc/default/monit ' )
2013-05-28 18:21:55 -07:00
sudo ( ' /etc/init.d/monit restart ' )
2014-09-18 10:12:19 -07:00
def config_monit_original ( ) :
put ( ' config/monit_original.conf ' , ' /etc/monit/conf.d/node_original.conf ' , use_sudo = True )
sudo ( ' echo " START=yes " > /etc/default/monit ' )
sudo ( ' /etc/init.d/monit restart ' )
2012-12-10 10:49:36 -08:00
def config_monit_app ( ) :
put ( ' config/monit_app.conf ' , ' /etc/monit/conf.d/gunicorn.conf ' , use_sudo = True )
2013-07-06 00:56:13 -07:00
sudo ( ' echo " START=yes " > /etc/default/monit ' )
2012-12-10 10:49:36 -08:00
sudo ( ' /etc/init.d/monit restart ' )
2013-05-08 01:59:33 -07:00
2013-12-22 15:17:13 -08:00
def config_monit_work ( ) :
put ( ' config/monit_work.conf ' , ' /etc/monit/conf.d/work.conf ' , use_sudo = True )
sudo ( ' echo " START=yes " > /etc/default/monit ' )
sudo ( ' /etc/init.d/monit restart ' )
2013-07-05 23:24:13 -07:00
def config_monit_redis ( ) :
2013-09-17 15:56:16 -07:00
sudo ( ' chown root.root /etc/init.d/redis ' )
sudo ( ' chmod a+x /etc/init.d/redis ' )
put ( ' config/monit_debug.sh ' , ' /etc/monit/monit_debug.sh ' , use_sudo = True )
sudo ( ' chmod a+x /etc/monit/monit_debug.sh ' )
2013-07-05 23:24:13 -07:00
put ( ' config/monit_redis.conf ' , ' /etc/monit/conf.d/redis.conf ' , use_sudo = True )
2013-07-06 00:56:13 -07:00
sudo ( ' echo " START=yes " > /etc/default/monit ' )
2011-03-28 10:07:45 -04:00
sudo ( ' /etc/init.d/monit restart ' )
2013-05-08 01:59:33 -07:00
2013-06-17 16:16:43 -07:00
def setup_mongoengine_repo ( ) :
2013-03-20 16:06:02 -07:00
with cd ( env . VENDOR_PATH ) , settings ( warn_only = True ) :
run ( ' rm -fr mongoengine ' )
run ( ' git clone https://github.com/MongoEngine/mongoengine.git ' )
sudo ( ' rm -fr /usr/local/lib/python2.7/dist-packages/mongoengine ' )
sudo ( ' rm -fr /usr/local/lib/python2.7/dist-packages/mongoengine-* ' )
2013-05-20 19:27:10 -07:00
sudo ( ' ln -sfn %s /usr/local/lib/python2.7/dist-packages/mongoengine ' %
2013-03-20 16:06:02 -07:00
os . path . join ( env . VENDOR_PATH , ' mongoengine/mongoengine ' ) )
2013-06-17 16:16:43 -07:00
with cd ( os . path . join ( env . VENDOR_PATH , ' mongoengine ' ) ) , settings ( warn_only = True ) :
run ( ' git co v0.8.2 ' )
2013-05-08 01:59:33 -07:00
2015-03-09 18:20:49 -07:00
def clear_pymongo_repo ( ) :
sudo ( ' rm -fr /usr/local/lib/python2.7/dist-packages/pymongo* ' )
sudo ( ' rm -fr /usr/local/lib/python2.7/dist-packages/bson* ' )
sudo ( ' rm -fr /usr/local/lib/python2.7/dist-packages/gridfs* ' )
2011-03-19 16:19:53 -04:00
def setup_pymongo_repo ( ) :
2013-03-20 16:06:02 -07:00
with cd ( env . VENDOR_PATH ) , settings ( warn_only = True ) :
run ( ' git clone git://github.com/mongodb/mongo-python-driver.git pymongo ' )
2012-11-06 11:28:36 -08:00
# with cd(os.path.join(env.VENDOR_PATH, 'pymongo')):
# sudo('python setup.py install')
2015-03-09 18:20:49 -07:00
clear_pymongo_repo ( )
2013-05-20 19:27:10 -07:00
sudo ( ' ln -sfn %s /usr/local/lib/python2.7/dist-packages/ ' %
2012-11-06 11:28:36 -08:00
os . path . join ( env . VENDOR_PATH , ' pymongo/ { pymongo,bson,gridfs} ' ) )
2013-05-08 01:59:33 -07:00
2011-03-19 16:19:53 -04:00
def setup_forked_mongoengine ( ) :
2013-03-20 16:06:02 -07:00
with cd ( os . path . join ( env . VENDOR_PATH , ' mongoengine ' ) ) , settings ( warn_only = True ) :
run ( ' git remote add clay https://github.com/samuelclay/mongoengine.git ' )
run ( ' git pull ' )
run ( ' git fetch clay ' )
run ( ' git checkout -b clay_master clay/master ' )
2011-05-18 14:23:43 -04:00
def switch_forked_mongoengine ( ) :
2011-07-17 20:53:30 -07:00
with cd ( os . path . join ( env . VENDOR_PATH , ' mongoengine ' ) ) :
2011-05-20 09:51:56 -04:00
run ( ' git co dev ' )
2012-09-18 13:08:25 -07:00
run ( ' git pull %s dev --force ' % env . user )
2011-05-20 09:51:56 -04:00
# run('git checkout .')
# run('git checkout master')
# run('get branch -D dev')
# run('git checkout -b dev origin/dev')
2013-05-08 01:59:33 -07:00
2013-08-13 15:45:40 -07:00
def setup_logrotate ( clear = True ) :
2014-02-20 14:52:11 -08:00
if clear :
run ( ' find /srv/newsblur/logs/*.log | xargs tee ' )
2011-03-23 15:43:15 -04:00
put ( ' config/logrotate.conf ' , ' /etc/logrotate.d/newsblur ' , use_sudo = True )
2013-04-02 15:41:50 -07:00
put ( ' config/logrotate.mongo.conf ' , ' /etc/logrotate.d/mongodb ' , use_sudo = True )
2013-07-30 13:39:19 -07:00
sudo ( ' chown root.root /etc/logrotate.d/ { newsblur,mongodb} ' )
sudo ( ' chmod 644 /etc/logrotate.d/ { newsblur,mongodb} ' )
2014-02-20 14:52:11 -08:00
with settings ( warn_only = True ) :
sudo ( ' chown sclay.sclay /srv/newsblur/logs/*.log ' )
2013-08-13 15:45:40 -07:00
sudo ( ' logrotate -f /etc/logrotate.d/newsblur ' )
2013-03-17 20:14:55 -07:00
def setup_ulimit ( ) :
2013-03-26 16:55:29 -07:00
# Increase File Descriptor limits.
2013-03-20 15:05:52 -07:00
run ( ' export FILEMAX=`sysctl -n fs.file-max` ' , pty = False )
sudo ( ' mv /etc/security/limits.conf /etc/security/limits.conf.bak ' , pty = False )
sudo ( ' touch /etc/security/limits.conf ' , pty = False )
sudo ( ' chmod 666 /etc/security/limits.conf ' , pty = False )
2013-04-30 10:26:13 -07:00
run ( ' echo " root soft nofile 100000 " >> /etc/security/limits.conf ' , pty = False )
run ( ' echo " root hard nofile 100000 " >> /etc/security/limits.conf ' , pty = False )
run ( ' echo " * soft nofile 100000 " >> /etc/security/limits.conf ' , pty = False )
run ( ' echo " * hard nofile 100090 " >> /etc/security/limits.conf ' , pty = False )
2013-03-20 15:05:52 -07:00
sudo ( ' chmod 644 /etc/security/limits.conf ' , pty = False )
2013-04-23 17:58:25 -07:00
sudo ( ' chmod 666 /etc/sysctl.conf ' , pty = False )
2013-04-30 10:26:13 -07:00
run ( ' echo " fs.file-max = 100000 " >> /etc/sysctl.conf ' , pty = False )
2013-04-23 17:58:25 -07:00
sudo ( ' chmod 644 /etc/sysctl.conf ' , pty = False )
sudo ( ' sysctl -p ' )
2013-06-02 18:35:26 -07:00
sudo ( ' ulimit -n 100000 ' )
connections . connect ( env . host_string )
2015-02-11 17:30:15 -08:00
2013-03-17 20:14:55 -07:00
# run('touch /home/ubuntu/.bash_profile')
# run('echo "ulimit -n $FILEMAX" >> /home/ubuntu/.bash_profile')
# Increase Ephemeral Ports.
# sudo chmod 666 /etc/sysctl.conf
# echo "net.ipv4.ip_local_port_range = 1024 65535" >> /etc/sysctl.conf
# sudo chmod 644 /etc/sysctl.conf
2013-05-08 01:59:33 -07:00
2013-08-12 11:58:23 -07:00
def setup_syncookies ( ) :
sudo ( ' echo 1 > /proc/sys/net/ipv4/tcp_syncookies ' )
sudo ( ' sudo /sbin/sysctl -w net.ipv4.tcp_syncookies=1 ' )
2013-03-14 18:43:01 -07:00
def setup_sudoers ( user = None ) :
sudo ( ' su - root -c " echo \\ \\ " %s ALL=(ALL) NOPASSWD: ALL \\ \\ " >> /etc/sudoers " ' % ( user or env . user ) )
2011-02-09 15:45:41 -05:00
def setup_nginx ( ) :
2015-01-07 13:49:53 -08:00
NGINX_VERSION = ' 1.6.2 '
2013-03-20 16:06:02 -07:00
with cd ( env . VENDOR_PATH ) , settings ( warn_only = True ) :
sudo ( " groupadd nginx " )
sudo ( " useradd -g nginx -d /var/www/htdocs -s /bin/false nginx " )
run ( ' wget http://nginx.org/download/nginx- %s .tar.gz ' % NGINX_VERSION )
run ( ' tar -xzf nginx- %s .tar.gz ' % NGINX_VERSION )
run ( ' rm nginx- %s .tar.gz ' % NGINX_VERSION )
with cd ( ' nginx- %s ' % NGINX_VERSION ) :
2014-05-22 09:21:38 -07:00
run ( ' ./configure --with-http_ssl_module --with-http_stub_status_module --with-http_gzip_static_module --with-http_realip_module ' )
2013-03-20 16:06:02 -07:00
run ( ' make ' )
sudo ( ' make install ' )
2013-06-23 13:47:19 -07:00
config_nginx ( )
2013-05-08 01:59:33 -07:00
2013-06-23 13:47:19 -07:00
def config_nginx ( ) :
2011-03-21 20:07:24 -04:00
put ( " config/nginx.conf " , " /usr/local/nginx/conf/nginx.conf " , use_sudo = True )
sudo ( " mkdir -p /usr/local/nginx/conf/sites-enabled " )
sudo ( " mkdir -p /var/log/nginx " )
2011-08-26 09:34:30 -07:00
put ( " config/nginx.newsblur.conf " , " /usr/local/nginx/conf/sites-enabled/newsblur.conf " , use_sudo = True )
2011-03-21 20:07:24 -04:00
put ( " config/nginx-init " , " /etc/init.d/nginx " , use_sudo = True )
2013-03-25 11:53:31 -07:00
sudo ( ' sed -i -e s/nginx_none/`cat /etc/hostname`/g /usr/local/nginx/conf/sites-enabled/newsblur.conf ' )
2011-03-21 20:07:24 -04:00
sudo ( " chmod 0755 /etc/init.d/nginx " )
sudo ( " /usr/sbin/update-rc.d -f nginx defaults " )
2011-03-31 18:51:23 -04:00
sudo ( " /etc/init.d/nginx restart " )
2012-09-19 12:00:41 -07:00
copy_certificates ( )
2012-04-23 13:18:50 -07:00
2011-03-24 09:27:05 -04:00
# ===============
# = Setup - App =
# ===============
2011-09-07 22:35:20 -07:00
def setup_app_firewall ( ) :
sudo ( ' ufw default deny ' )
2013-05-08 01:59:33 -07:00
sudo ( ' ufw allow ssh ' ) # ssh
sudo ( ' ufw allow 80 ' ) # http
sudo ( ' ufw allow 8000 ' ) # gunicorn
sudo ( ' ufw allow 8888 ' ) # socket.io
sudo ( ' ufw allow 8889 ' ) # socket.io ssl
sudo ( ' ufw allow 443 ' ) # https
2011-09-07 22:35:20 -07:00
sudo ( ' ufw --force enable ' )
2014-12-30 14:40:06 -08:00
def remove_gunicorn ( ) :
with cd ( env . VENDOR_PATH ) :
sudo ( ' rm -fr gunicorn ' )
2011-09-07 22:35:20 -07:00
def setup_gunicorn ( supervisor = True ) :
2011-03-24 09:27:05 -04:00
if supervisor :
put ( ' config/supervisor_gunicorn.conf ' , ' /etc/supervisor/conf.d/gunicorn.conf ' , use_sudo = True )
2015-05-06 19:22:53 -07:00
sudo ( ' supervisorctl reread ' )
restart_gunicorn ( )
2014-12-30 14:40:06 -08:00
# with cd(env.VENDOR_PATH):
# sudo('rm -fr gunicorn')
# run('git clone git://github.com/benoitc/gunicorn.git')
# with cd(os.path.join(env.VENDOR_PATH, 'gunicorn')):
# run('git pull')
# sudo('python setup.py develop')
2013-05-08 01:59:33 -07:00
2011-03-24 09:27:05 -04:00
def update_gunicorn ( ) :
2011-07-17 20:53:30 -07:00
with cd ( os . path . join ( env . VENDOR_PATH , ' gunicorn ' ) ) :
2011-03-24 09:27:05 -04:00
run ( ' git pull ' )
sudo ( ' python setup.py develop ' )
2011-03-14 21:44:30 -04:00
2011-04-15 11:34:41 -04:00
def setup_staging ( ) :
run ( ' git clone https://github.com/samuelclay/NewsBlur.git staging ' )
with cd ( ' ~/staging ' ) :
run ( ' cp ../newsblur/local_settings.py local_settings.py ' )
run ( ' mkdir -p logs ' )
run ( ' touch logs/newsblur.log ' )
2012-01-02 18:22:06 -08:00
2013-06-23 13:47:19 -07:00
def setup_node_app ( ) :
2012-05-21 09:40:44 -07:00
sudo ( ' add-apt-repository -y ppa:chris-lea/node.js ' )
2012-01-02 18:22:06 -08:00
sudo ( ' apt-get update ' )
2012-03-29 17:24:23 -07:00
sudo ( ' apt-get install -y nodejs ' )
2013-01-07 11:33:24 -08:00
run ( ' curl -L https://npmjs.org/install.sh | sudo sh ' )
2012-01-02 18:22:06 -08:00
sudo ( ' npm install -g supervisor ' )
2012-01-13 22:25:06 -08:00
sudo ( ' ufw allow 8888 ' )
2012-04-07 14:44:52 -07:00
2013-06-23 13:47:19 -07:00
def config_node ( ) :
2012-04-07 14:44:52 -07:00
sudo ( ' rm -fr /etc/supervisor/conf.d/node.conf ' )
put ( ' config/supervisor_node_unread.conf ' , ' /etc/supervisor/conf.d/node_unread.conf ' , use_sudo = True )
2015-07-06 19:09:13 -07:00
put ( ' config/supervisor_node_unread_ssl.conf ' , ' /etc/supervisor/conf.d/node_unread_ssl.conf ' , use_sudo = True )
2013-03-28 18:13:08 -07:00
put ( ' config/supervisor_node_favicons.conf ' , ' /etc/supervisor/conf.d/node_favicons.conf ' , use_sudo = True )
2012-03-29 17:24:23 -07:00
sudo ( ' supervisorctl reload ' )
2012-01-14 18:54:59 -08:00
2013-03-18 13:14:37 -07:00
@parallel
2012-05-02 16:46:00 -07:00
def copy_app_settings ( ) :
2013-07-17 13:40:45 -07:00
put ( os . path . join ( env . SECRETS_PATH , ' settings/app_settings.py ' ) ,
' %s /local_settings.py ' % env . NEWSBLUR_PATH )
2012-05-02 16:46:00 -07:00
run ( ' echo " \n SERVER_NAME = \\ \\ " `hostname` \\ \\ " " >> %s /local_settings.py ' % env . NEWSBLUR_PATH )
2012-05-21 09:40:44 -07:00
2014-06-23 11:10:09 -07:00
def assemble_certificates ( ) :
with lcd ( os . path . join ( env . SECRETS_PATH , ' certificates/comodo ' ) ) :
local ( ' pwd ' )
local ( ' cat STAR_newsblur_com.crt EssentialSSLCA_2.crt ComodoUTNSGCCA.crt UTNAddTrustSGCCA.crt AddTrustExternalCARoot.crt > newsblur.com.crt ' )
2012-05-21 09:40:44 -07:00
def copy_certificates ( ) :
2013-05-16 18:20:54 -07:00
cert_path = ' %s /config/certificates/ ' % env . NEWSBLUR_PATH
run ( ' mkdir -p %s ' % cert_path )
2013-07-17 13:40:45 -07:00
put ( os . path . join ( env . SECRETS_PATH , ' certificates/newsblur.com.crt ' ) , cert_path )
put ( os . path . join ( env . SECRETS_PATH , ' certificates/newsblur.com.key ' ) , cert_path )
2013-05-16 18:20:54 -07:00
run ( ' cat %s /newsblur.com.crt > %s /newsblur.pem ' % ( cert_path , cert_path ) )
run ( ' cat %s /newsblur.com.key >> %s /newsblur.pem ' % ( cert_path , cert_path ) )
2012-06-26 11:19:53 -07:00
2012-12-25 15:09:46 -08:00
@parallel
2012-06-26 11:19:53 -07:00
def maintenance_on ( ) :
2012-12-21 15:05:38 -08:00
put ( ' templates/maintenance_off.html ' , ' %s /templates/maintenance_off.html ' % env . NEWSBLUR_PATH )
2012-06-26 11:19:53 -07:00
with cd ( env . NEWSBLUR_PATH ) :
2012-12-21 15:05:38 -08:00
run ( ' mv templates/maintenance_off.html templates/maintenance_on.html ' )
2012-12-25 15:09:46 -08:00
2013-03-20 22:00:03 -07:00
@parallel
2012-06-26 11:19:53 -07:00
def maintenance_off ( ) :
2013-03-20 22:00:03 -07:00
with cd ( env . NEWSBLUR_PATH ) :
2013-03-20 16:06:02 -07:00
run ( ' mv templates/maintenance_on.html templates/maintenance_off.html ' )
2012-12-21 15:05:38 -08:00
run ( ' git checkout templates/maintenance_off.html ' )
2013-03-14 21:40:14 -07:00
2013-04-23 18:35:37 -07:00
def setup_haproxy ( debug = False ) :
2015-05-07 10:59:38 -07:00
version = " 1.5.12 "
2013-05-09 16:54:29 -07:00
sudo ( ' ufw allow 81 ' ) # nginx moved
sudo ( ' ufw allow 1936 ' ) # haproxy stats
2014-10-27 16:32:10 -07:00
# sudo('apt-get install -y haproxy')
# sudo('apt-get remove -y haproxy')
2013-03-17 10:28:26 -07:00
with cd ( env . VENDOR_PATH ) :
2015-05-07 10:59:38 -07:00
run ( ' wget http://www.haproxy.org/download/1.5/src/haproxy- %s .tar.gz ' % version )
run ( ' tar -xf haproxy- %s .tar.gz ' % version )
with cd ( ' haproxy- %s ' % version ) :
2013-03-17 10:28:26 -07:00
run ( ' make TARGET=linux2628 USE_PCRE=1 USE_OPENSSL=1 USE_ZLIB=1 ' )
sudo ( ' make install ' )
2013-03-14 21:40:14 -07:00
put ( ' config/haproxy-init ' , ' /etc/init.d/haproxy ' , use_sudo = True )
sudo ( ' chmod u+x /etc/init.d/haproxy ' )
2013-04-01 14:41:54 -07:00
sudo ( ' mkdir -p /etc/haproxy ' )
2013-04-23 18:35:37 -07:00
if debug :
put ( ' config/debug_haproxy.conf ' , ' /etc/haproxy/haproxy.cfg ' , use_sudo = True )
else :
2013-07-17 13:40:45 -07:00
put ( os . path . join ( env . SECRETS_PATH , ' configs/haproxy.conf ' ) ,
' /etc/haproxy/haproxy.cfg ' , use_sudo = True )
2013-03-14 22:39:58 -07:00
sudo ( ' echo " ENABLED=1 " > /etc/default/haproxy ' )
2013-03-17 10:28:26 -07:00
cert_path = " %s /config/certificates " % env . NEWSBLUR_PATH
2013-03-14 22:39:58 -07:00
run ( ' cat %s /newsblur.com.crt > %s /newsblur.pem ' % ( cert_path , cert_path ) )
run ( ' cat %s /newsblur.com.key >> %s /newsblur.pem ' % ( cert_path , cert_path ) )
2013-03-17 12:39:05 -07:00
put ( ' config/haproxy_rsyslog.conf ' , ' /etc/rsyslog.d/49-haproxy.conf ' , use_sudo = True )
sudo ( ' restart rsyslog ' )
2013-05-08 01:59:33 -07:00
2013-03-14 22:39:58 -07:00
sudo ( ' /etc/init.d/haproxy stop ' )
2015-05-07 10:59:38 -07:00
run ( ' sleep 1 ' )
2013-03-14 22:39:58 -07:00
sudo ( ' /etc/init.d/haproxy start ' )
2013-03-14 21:40:14 -07:00
2013-03-17 10:28:26 -07:00
def config_haproxy ( debug = False ) :
if debug :
put ( ' config/debug_haproxy.conf ' , ' /etc/haproxy/haproxy.cfg ' , use_sudo = True )
else :
2013-07-17 13:40:45 -07:00
put ( os . path . join ( env . SECRETS_PATH , ' configs/haproxy.conf ' ) ,
' /etc/haproxy/haproxy.cfg ' , use_sudo = True )
2013-03-15 11:11:47 -07:00
sudo ( ' /etc/init.d/haproxy reload ' )
2013-05-08 01:59:33 -07:00
2013-03-20 15:43:35 -07:00
def upgrade_django ( ) :
with cd ( env . NEWSBLUR_PATH ) , settings ( warn_only = True ) :
2013-03-20 16:13:10 -07:00
sudo ( ' supervisorctl stop gunicorn ' )
2013-03-20 15:43:35 -07:00
run ( ' ./utils/kill_gunicorn.sh ' )
2013-03-20 16:13:10 -07:00
sudo ( ' easy_install -U django gunicorn ' )
2013-03-20 15:43:35 -07:00
pull ( )
2013-03-20 16:13:10 -07:00
sudo ( ' supervisorctl reload ' )
2014-05-16 12:18:59 -07:00
2013-03-22 15:27:10 -07:00
def upgrade_pil ( ) :
with cd ( env . NEWSBLUR_PATH ) :
2013-03-22 16:12:01 -07:00
pull ( )
2014-05-16 12:39:18 -07:00
sudo ( ' pip install --upgrade pillow ' )
# celery_stop()
2013-03-22 16:12:01 -07:00
sudo ( ' apt-get remove -y python-imaging ' )
2014-05-16 13:07:12 -07:00
sudo ( ' supervisorctl reload ' )
# kill()
2013-03-22 17:16:16 -07:00
def downgrade_pil ( ) :
with cd ( env . NEWSBLUR_PATH ) :
sudo ( ' apt-get install -y python-imaging ' )
sudo ( ' rm -fr /usr/local/lib/python2.7/dist-packages/Pillow* ' )
pull ( )
2014-05-16 13:07:12 -07:00
sudo ( ' supervisorctl reload ' )
# kill()
2013-05-08 01:59:33 -07:00
2011-03-14 21:44:30 -04:00
# ==============
# = Setup - DB =
2013-05-08 01:59:33 -07:00
# ==============
2011-03-14 21:44:30 -04:00
2013-05-15 17:46:45 -07:00
@parallel
2011-03-19 18:35:44 -04:00
def setup_db_firewall ( ) :
2012-12-17 18:42:55 -08:00
ports = [
5432 , # PostgreSQL
27017 , # MongoDB
2013-01-07 10:48:42 -08:00
28017 , # MongoDB web
2013-06-02 18:35:26 -07:00
27019 , # MongoDB config
2012-12-17 18:42:55 -08:00
6379 , # Redis
2013-04-01 12:30:37 -07:00
# 11211, # Memcached
2012-12-17 18:42:55 -08:00
3060 , # Node original page server
2013-01-07 10:48:42 -08:00
9200 , # Elasticsearch
2012-12-17 18:42:55 -08:00
]
2013-06-02 18:35:26 -07:00
sudo ( ' ufw --force reset ' )
2011-03-19 18:35:44 -04:00
sudo ( ' ufw default deny ' )
2011-09-07 22:35:20 -07:00
sudo ( ' ufw allow ssh ' )
sudo ( ' ufw allow 80 ' )
2013-05-08 01:59:33 -07:00
2013-03-14 12:41:24 -07:00
# DigitalOcean
2013-05-08 01:59:33 -07:00
for ip in set ( env . roledefs [ ' app ' ] +
env . roledefs [ ' db ' ] +
env . roledefs [ ' debug ' ] +
env . roledefs [ ' task ' ] +
2013-06-02 18:35:26 -07:00
env . roledefs [ ' work ' ] +
env . roledefs [ ' push ' ] +
env . roledefs [ ' www ' ] +
2013-04-22 10:38:53 -07:00
env . roledefs [ ' node ' ] ) :
2013-03-14 12:41:24 -07:00
sudo ( ' ufw allow proto tcp from %s to any port %s ' % (
ip ,
' , ' . join ( map ( str , ports ) )
) )
2013-05-08 01:59:33 -07:00
2012-09-18 13:08:25 -07:00
# EC2
2013-03-15 17:05:44 -07:00
for host in set ( env . roledefs [ ' ec2task ' ] ) :
2013-01-07 11:33:24 -08:00
ip = re . search ( ' ec2-( \ d+- \ d+- \ d+- \ d+) ' , host ) . group ( 1 ) . replace ( ' - ' , ' . ' )
2012-12-17 18:42:55 -08:00
sudo ( ' ufw allow proto tcp from %s to any port %s ' % (
2013-01-07 11:33:24 -08:00
ip ,
' , ' . join ( map ( str , ports ) )
2012-12-17 18:42:55 -08:00
) )
2013-01-07 10:48:42 -08:00
2011-08-24 21:41:44 -07:00
sudo ( ' ufw --force enable ' )
2013-05-08 01:59:33 -07:00
2011-03-15 10:02:13 -04:00
def setup_rabbitmq ( ) :
2011-03-19 19:24:14 -04:00
sudo ( ' echo " deb http://www.rabbitmq.com/debian/ testing main " >> /etc/apt/sources.list ' )
run ( ' wget http://www.rabbitmq.com/rabbitmq-signing-key-public.asc ' )
sudo ( ' apt-key add rabbitmq-signing-key-public.asc ' )
run ( ' rm rabbitmq-signing-key-public.asc ' )
sudo ( ' apt-get update ' )
2011-03-15 10:02:13 -04:00
sudo ( ' apt-get install -y rabbitmq-server ' )
2011-03-17 19:26:21 -04:00
sudo ( ' rabbitmqctl add_user newsblur newsblur ' )
sudo ( ' rabbitmqctl add_vhost newsblurvhost ' )
sudo ( ' rabbitmqctl set_permissions -p newsblurvhost newsblur " .* " " .* " " .* " ' )
2011-03-15 10:02:13 -04:00
2013-04-01 12:30:37 -07:00
# def setup_memcached():
# sudo('apt-get -y install memcached')
2011-11-08 14:46:30 -08:00
2012-05-15 15:25:01 -07:00
def setup_postgres ( standby = False ) :
2013-06-23 16:43:37 -07:00
shmmax = 2300047872
2015-07-06 19:09:13 -07:00
sudo ( ' su root -c " echo \" deb http://apt.postgresql.org/pub/repos/apt/ trusty-pgdg main \" > /etc/apt/sources.list.d/pgdg.list " ' ) # You might have to run this manually
sudo ( ' wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add - ' )
2013-03-29 17:39:35 -07:00
sudo ( ' apt-get update ' )
2015-05-06 21:53:11 -07:00
sudo ( ' apt-get -y install postgresql-9.4 postgresql-client-9.4 postgresql-contrib-9.4 libpq-dev ' )
2012-05-15 15:25:01 -07:00
put ( ' config/postgresql %s .conf ' % (
( ' _standby ' if standby else ' ' ) ,
2015-05-06 21:53:11 -07:00
) , ' /etc/postgresql/9.4/main/postgresql.conf ' , use_sudo = True )
2013-06-23 16:43:37 -07:00
sudo ( ' echo " %s " > /proc/sys/kernel/shmmax ' % shmmax )
sudo ( ' echo " \n kernel.shmmax = %s " > /etc/sysctl.conf ' % shmmax )
sudo ( ' sysctl -p ' )
2013-05-08 01:59:33 -07:00
2012-05-15 15:25:01 -07:00
if standby :
2015-05-06 21:53:11 -07:00
put ( ' config/postgresql_recovery.conf ' , ' /var/lib/postgresql/9.4/recovery.conf ' , use_sudo = True )
2013-05-08 01:59:33 -07:00
2012-05-04 13:37:01 -07:00
sudo ( ' /etc/init.d/postgresql stop ' )
sudo ( ' /etc/init.d/postgresql start ' )
2011-03-15 18:06:24 -04:00
2015-07-06 19:09:13 -07:00
def copy_postgres_to_standby ( master = ' db01 ' ) :
# http://www.rassoc.com/gregr/weblog/2013/02/16/zero-to-postgresql-streaming-replication-in-10-mins/
# Make sure you can ssh from master to slave and back with the postgres user account.
2012-07-20 01:26:56 -07:00
# Need to give postgres accounts keys in authroized_keys.
2013-05-08 01:59:33 -07:00
2013-06-23 16:43:37 -07:00
# sudo('su postgres -c "psql -c \"SELECT pg_start_backup(\'label\', true)\""', pty=False)
2015-07-06 19:09:13 -07:00
# sudo('su postgres -c \"rsync -a --stats --progress /var/lib/postgresql/9.2/main postgres@%s:/var/lib/postgresql/9.2/ --exclude postmaster.pid\"' % slave, pty=False)
2013-06-24 00:12:10 -07:00
# sudo('su postgres -c "psql -c \"SELECT pg_stop_backup()\""', pty=False)
2013-05-08 01:59:33 -07:00
2015-07-06 19:09:13 -07:00
sudo ( ' su postgres pg_basebackup -h %s -D /var/lib/postgresql/9.2/main -v -P -X fetch ' % master )
sudo ( ' cp /var/lib/postgresql/9.2/recovery.conf /var/lib/postgresql/9.2/main/ ' )
2011-03-14 21:44:30 -04:00
def setup_mongo ( ) :
2011-03-15 10:02:13 -04:00
sudo ( ' apt-key adv --keyserver keyserver.ubuntu.com --recv 7F0CEB10 ' )
2011-08-27 13:22:56 -07:00
# sudo('echo "deb http://downloads.mongodb.org/distros/ubuntu 10.10 10gen" >> /etc/apt/sources.list.d/10gen.list')
sudo ( ' echo " deb http://downloads-distro.mongodb.org/repo/debian-sysvinit dist 10gen " >> /etc/apt/sources.list ' )
2011-03-15 10:02:13 -04:00
sudo ( ' apt-get update ' )
2013-03-20 15:05:52 -07:00
sudo ( ' apt-get -y install mongodb-10gen ' )
2013-05-08 01:59:33 -07:00
put ( ' config/mongodb. %s .conf ' % ( ' prod ' if env . user != ' ubuntu ' else ' ec2 ' ) ,
2012-09-18 13:08:25 -07:00
' /etc/mongodb.conf ' , use_sudo = True )
2013-06-02 18:35:26 -07:00
run ( ' echo " ulimit -n 100000 " > mongodb.defaults ' )
2013-03-22 15:04:34 -07:00
sudo ( ' mv mongodb.defaults /etc/default/mongodb ' )
2012-06-27 00:23:17 -07:00
sudo ( ' /etc/init.d/mongodb restart ' )
2013-04-02 15:41:50 -07:00
put ( ' config/logrotate.mongo.conf ' , ' /etc/logrotate.d/mongodb ' , use_sudo = True )
2011-11-06 15:18:44 -08:00
2015-02-11 17:30:15 -08:00
# Reclaim 5% disk space used for root logs. Set to 1%.
2015-05-06 22:36:43 -07:00
with settings ( warn_only = True ) :
sudo ( ' tune2fs -m 1 /dev/vda ' )
2015-02-11 17:30:15 -08:00
2013-06-02 18:35:26 -07:00
def setup_mongo_configsvr ( ) :
sudo ( ' mkdir -p /var/lib/mongodb_configsvr ' )
sudo ( ' chown mongodb.mongodb /var/lib/mongodb_configsvr ' )
put ( ' config/mongodb.configsvr.conf ' , ' /etc/mongodb.configsvr.conf ' , use_sudo = True )
put ( ' config/mongodb.configsvr-init ' , ' /etc/init.d/mongodb-configsvr ' , use_sudo = True )
sudo ( ' chmod u+x /etc/init.d/mongodb-configsvr ' )
run ( ' echo " ulimit -n 100000 " > mongodb_configsvr.defaults ' )
sudo ( ' mv mongodb_configsvr.defaults /etc/default/mongodb_configsvr ' )
sudo ( ' update-rc.d -f mongodb-configsvr defaults ' )
sudo ( ' /etc/init.d/mongodb-configsvr start ' )
def setup_mongo_mongos ( ) :
put ( ' config/mongodb.mongos.conf ' , ' /etc/mongodb.mongos.conf ' , use_sudo = True )
put ( ' config/mongodb.mongos-init ' , ' /etc/init.d/mongodb-mongos ' , use_sudo = True )
sudo ( ' chmod u+x /etc/init.d/mongodb-mongos ' )
run ( ' echo " ulimit -n 100000 " > mongodb_mongos.defaults ' )
sudo ( ' mv mongodb_mongos.defaults /etc/default/mongodb_mongos ' )
sudo ( ' update-rc.d -f mongodb-mongos defaults ' )
sudo ( ' /etc/init.d/mongodb-mongos restart ' )
2013-03-29 11:04:46 -07:00
def setup_mongo_mms ( ) :
pull ( )
2014-05-30 12:01:04 -07:00
sudo ( ' rm -f /etc/supervisor/conf.d/mongomms.conf ' )
2013-03-29 11:04:46 -07:00
sudo ( ' supervisorctl reread ' )
sudo ( ' supervisorctl update ' )
2014-05-30 12:01:04 -07:00
with cd ( env . VENDOR_PATH ) :
sudo ( ' apt-get remove -y mongodb-mms-monitoring-agent ' )
run ( ' curl -OL https://mms.mongodb.com/download/agent/monitoring/mongodb-mms-monitoring-agent_2.2.0.70-1_amd64.deb ' )
sudo ( ' dpkg -i mongodb-mms-monitoring-agent_2.2.0.70-1_amd64.deb ' )
run ( ' rm mongodb-mms-monitoring-agent_2.2.0.70-1_amd64.deb ' )
put ( os . path . join ( env . SECRETS_PATH , ' settings/mongo_mms_config.txt ' ) ,
' mongo_mms_config.txt ' )
sudo ( " echo \" \n \" >> /etc/mongodb-mms/monitoring-agent.config " )
sudo ( ' cat mongo_mms_config.txt >> /etc/mongodb-mms/monitoring-agent.config ' )
sudo ( ' start mongodb-mms-monitoring-agent ' )
2013-03-29 11:04:46 -07:00
2013-04-07 17:19:59 -07:00
def setup_redis ( slave = False ) :
2015-01-07 13:49:53 -08:00
redis_version = ' 2.8.19 '
2011-11-06 15:18:44 -08:00
with cd ( env . VENDOR_PATH ) :
2013-10-01 14:19:12 -07:00
run ( ' wget http://download.redis.io/releases/redis- %s .tar.gz ' % redis_version )
2012-05-03 18:33:29 -07:00
run ( ' tar -xzf redis- %s .tar.gz ' % redis_version )
run ( ' rm redis- %s .tar.gz ' % redis_version )
with cd ( os . path . join ( env . VENDOR_PATH , ' redis- %s ' % redis_version ) ) :
2011-11-18 10:13:39 -08:00
sudo ( ' make install ' )
2011-11-06 15:18:44 -08:00
put ( ' config/redis-init ' , ' /etc/init.d/redis ' , use_sudo = True )
sudo ( ' chmod u+x /etc/init.d/redis ' )
put ( ' config/redis.conf ' , ' /etc/redis.conf ' , use_sudo = True )
2013-04-07 17:19:59 -07:00
if slave :
put ( ' config/redis_slave.conf ' , ' /etc/redis_server.conf ' , use_sudo = True )
else :
put ( ' config/redis_master.conf ' , ' /etc/redis_server.conf ' , use_sudo = True )
2013-06-18 13:22:31 -07:00
# sudo('chmod 666 /proc/sys/vm/overcommit_memory', pty=False)
# run('echo "1" > /proc/sys/vm/overcommit_memory', pty=False)
# sudo('chmod 644 /proc/sys/vm/overcommit_memory', pty=False)
sudo ( " su root -c \" echo \\ \" 1 \\ \" > /proc/sys/vm/overcommit_memory \" " )
2015-03-10 13:45:15 -07:00
sudo ( ' chmod 666 /etc/sysctl.conf ' , pty = False )
run ( ' echo " vm.overcommit_memory = 1 " >> /etc/sysctl.conf ' , pty = False )
sudo ( ' chmod 644 /etc/sysctl.conf ' , pty = False )
2013-06-18 13:22:31 -07:00
sudo ( " sysctl vm.overcommit_memory=1 " )
2015-03-10 13:45:15 -07:00
put ( ' config/redis_rclocal.txt ' , ' /etc/rc.local ' , use_sudo = True )
sudo ( " su root -c \" echo \\ \" never \\ \" > /sys/kernel/mm/transparent_hugepage/enabled \" " )
2011-11-06 15:18:44 -08:00
sudo ( ' mkdir -p /var/lib/redis ' )
sudo ( ' update-rc.d redis defaults ' )
2012-05-03 18:33:29 -07:00
sudo ( ' /etc/init.d/redis stop ' )
2011-11-18 10:13:39 -08:00
sudo ( ' /etc/init.d/redis start ' )
2013-08-12 11:58:23 -07:00
setup_syncookies ( )
2013-09-17 15:56:16 -07:00
config_monit_redis ( )
2015-03-09 14:50:07 -07:00
2012-12-24 20:24:45 -08:00
def setup_munin ( ) :
2015-05-12 08:41:14 -07:00
sudo ( ' apt-get update ' )
sudo ( ' apt-get install -y munin munin-node munin-plugins-extra spawn-fcgi ' )
2012-12-24 20:24:45 -08:00
put ( ' config/munin.conf ' , ' /etc/munin/munin.conf ' , use_sudo = True )
put ( ' config/spawn_fcgi_munin_graph.conf ' , ' /etc/init.d/spawn_fcgi_munin_graph ' , use_sudo = True )
2013-03-28 11:16:43 -07:00
put ( ' config/spawn_fcgi_munin_html.conf ' , ' /etc/init.d/spawn_fcgi_munin_html ' , use_sudo = True )
2012-12-24 20:24:45 -08:00
sudo ( ' chmod u+x /etc/init.d/spawn_fcgi_munin_graph ' )
2013-03-28 11:16:43 -07:00
sudo ( ' chmod u+x /etc/init.d/spawn_fcgi_munin_html ' )
with settings ( warn_only = True ) :
2013-06-16 08:16:14 -07:00
sudo ( ' chown nginx.www-data /var/log/munin/munin-cgi* ' )
sudo ( ' chown nginx.www-data /usr/lib/cgi-bin/munin-cgi* ' )
sudo ( ' chown nginx.www-data /usr/lib/munin/cgi/munin-cgi* ' )
2013-03-28 11:16:43 -07:00
with settings ( warn_only = True ) :
sudo ( ' /etc/init.d/spawn_fcgi_munin_graph stop ' )
sudo ( ' /etc/init.d/spawn_fcgi_munin_graph start ' )
sudo ( ' update-rc.d spawn_fcgi_munin_graph defaults ' )
sudo ( ' /etc/init.d/spawn_fcgi_munin_html stop ' )
sudo ( ' /etc/init.d/spawn_fcgi_munin_html start ' )
sudo ( ' update-rc.d spawn_fcgi_munin_html defaults ' )
2014-04-17 12:10:04 -07:00
sudo ( ' /etc/init.d/munin-node stop ' )
time . sleep ( 2 )
sudo ( ' /etc/init.d/munin-node start ' )
2013-03-28 11:16:43 -07:00
with settings ( warn_only = True ) :
2013-06-16 08:16:14 -07:00
sudo ( ' chown nginx.www-data /var/log/munin/munin-cgi* ' )
sudo ( ' chown nginx.www-data /usr/lib/cgi-bin/munin-cgi* ' )
sudo ( ' chown nginx.www-data /usr/lib/munin/cgi/munin-cgi* ' )
2013-04-15 17:59:06 -07:00
sudo ( ' chmod a+rw /var/log/munin/* ' )
2013-03-28 11:16:43 -07:00
with settings ( warn_only = True ) :
sudo ( ' /etc/init.d/spawn_fcgi_munin_graph start ' )
sudo ( ' /etc/init.d/spawn_fcgi_munin_html start ' )
2013-05-08 01:59:33 -07:00
2015-05-06 21:53:11 -07:00
def copy_munin_data ( from_server ) :
put ( os . path . join ( env . SECRETS_PATH , ' keys/newsblur.key ' ) , ' ~/.ssh/newsblur.key ' )
put ( os . path . join ( env . SECRETS_PATH , ' keys/newsblur.key.pub ' ) , ' ~/.ssh/newsblur.key.pub ' )
run ( ' chmod 600 ~/.ssh/newsblur* ' )
put ( " config/munin.nginx.conf " , " /usr/local/nginx/conf/sites-enabled/munin.conf " , use_sudo = True )
sudo ( ' /etc/init.d/nginx reload ' )
run ( " rsync -az -e \" ssh -i /home/sclay/.ssh/newsblur.key \" --stats --progress %s :/var/lib/munin/ /srv/munin " % from_server )
sudo ( " mv /var/lib/munin /var/lib/bak-munin " )
sudo ( " mv /srv/munin /var/lib/ " )
sudo ( " chown munin.munin -R /var/lib/munin " )
2015-07-06 19:09:13 -07:00
# run("rsync -az -e \"ssh -i /home/sclay/.ssh/newsblur.key\" --stats --progress %s:/etc/munin/ /srv/munin-etc" % from_server)
# sudo("mv /srv/munin-etc /etc/munin")
# sudo("chown munin.munin -R /etc/munin")
2015-05-06 21:53:11 -07:00
sudo ( " /etc/init.d/munin restart " )
sudo ( " /etc/init.d/munin-node restart " )
2013-05-08 01:59:33 -07:00
2012-03-05 09:24:32 -08:00
def setup_db_munin ( ) :
2012-07-20 08:19:44 -07:00
sudo ( ' cp -frs %s /config/munin/mongo* /etc/munin/plugins/ ' % env . NEWSBLUR_PATH )
sudo ( ' cp -frs %s /config/munin/pg_* /etc/munin/plugins/ ' % env . NEWSBLUR_PATH )
2013-06-24 00:12:10 -07:00
sudo ( ' cp -frs %s /config/munin/redis_* /etc/munin/plugins/ ' % env . NEWSBLUR_PATH )
2013-03-20 16:06:02 -07:00
with cd ( env . VENDOR_PATH ) , settings ( warn_only = True ) :
run ( ' git clone git://github.com/samuel/python-munin.git ' )
2012-09-19 12:00:41 -07:00
with cd ( os . path . join ( env . VENDOR_PATH , ' python-munin ' ) ) :
run ( ' sudo python setup.py install ' )
2014-04-17 12:10:04 -07:00
sudo ( ' /etc/init.d/munin-node stop ' )
time . sleep ( 2 )
sudo ( ' /etc/init.d/munin-node start ' )
2012-03-05 09:24:32 -08:00
2012-07-17 00:06:41 -07:00
def enable_celerybeat ( ) :
with cd ( env . NEWSBLUR_PATH ) :
run ( ' mkdir -p data ' )
put ( ' config/supervisor_celerybeat.conf ' , ' /etc/supervisor/conf.d/celerybeat.conf ' , use_sudo = True )
2013-04-01 12:21:20 -07:00
put ( ' config/supervisor_celeryd_work_queue.conf ' , ' /etc/supervisor/conf.d/celeryd_work_queue.conf ' , use_sudo = True )
2012-07-17 00:06:41 -07:00
put ( ' config/supervisor_celeryd_beat.conf ' , ' /etc/supervisor/conf.d/celeryd_beat.conf ' , use_sudo = True )
2013-03-14 12:55:10 -07:00
put ( ' config/supervisor_celeryd_beat_feeds.conf ' , ' /etc/supervisor/conf.d/celeryd_beat_feeds.conf ' , use_sudo = True )
2012-07-17 00:06:41 -07:00
sudo ( ' supervisorctl reread ' )
sudo ( ' supervisorctl update ' )
2013-05-08 01:59:33 -07:00
2012-09-19 12:00:41 -07:00
def setup_db_mdadm ( ) :
sudo ( ' apt-get -y install xfsprogs mdadm ' )
sudo ( ' yes | mdadm --create /dev/md0 --level=0 -c256 --raid-devices=4 /dev/xvdf /dev/xvdg /dev/xvdh /dev/xvdi ' )
sudo ( ' mkfs.xfs /dev/md0 ' )
sudo ( ' mkdir -p /srv/db ' )
sudo ( ' mount -t xfs -o rw,nobarrier,noatime,nodiratime /dev/md0 /srv/db ' )
sudo ( ' mkdir -p /srv/db/mongodb ' )
sudo ( ' chown mongodb.mongodb /srv/db/mongodb ' )
sudo ( " echo ' DEVICE /dev/xvdf /dev/xvdg /dev/xvdh /dev/xvdi ' | sudo tee -a /etc/mdadm/mdadm.conf " )
sudo ( " mdadm --examine --scan | sudo tee -a /etc/mdadm/mdadm.conf " )
sudo ( " echo ' /dev/md0 /srv/db xfs rw,nobarrier,noatime,nodiratime,noauto 0 0 ' | sudo tee -a /etc/fstab " )
sudo ( " sudo update-initramfs -u -v -k `uname -r` " )
2012-12-17 18:42:55 -08:00
def setup_original_page_server ( ) :
2013-06-23 13:47:19 -07:00
setup_node_app ( )
2013-01-07 11:16:52 -08:00
sudo ( ' mkdir -p /srv/originals ' )
2013-05-08 01:59:33 -07:00
sudo ( ' chown %s . %s -R /srv/originals ' % ( env . user , env . user ) ) # We assume that the group is the same name as the user. It's common on linux
2014-09-18 10:12:19 -07:00
config_monit_original ( )
2013-05-08 01:59:33 -07:00
put ( ' config/supervisor_node_original.conf ' ,
2012-12-17 18:42:55 -08:00
' /etc/supervisor/conf.d/node_original.conf ' , use_sudo = True )
sudo ( ' supervisorctl reread ' )
sudo ( ' supervisorctl reload ' )
2012-12-20 16:19:27 -08:00
def setup_elasticsearch ( ) :
2015-05-06 22:45:23 -07:00
ES_VERSION = " 0.90.13 "
2012-12-20 16:19:27 -08:00
sudo ( ' apt-get update ' )
sudo ( ' apt-get install openjdk-7-jre -y ' )
2013-05-08 01:59:33 -07:00
2012-12-20 16:19:27 -08:00
with cd ( env . VENDOR_PATH ) :
2015-05-06 22:36:43 -07:00
run ( ' mkdir -p elasticsearch- %s ' % ES_VERSION )
2012-12-20 16:19:27 -08:00
with cd ( os . path . join ( env . VENDOR_PATH , ' elasticsearch- %s ' % ES_VERSION ) ) :
run ( ' wget http://download.elasticsearch.org/elasticsearch/elasticsearch/elasticsearch- %s .deb ' % ES_VERSION )
sudo ( ' dpkg -i elasticsearch- %s .deb ' % ES_VERSION )
2015-01-05 16:38:20 -08:00
sudo ( ' /usr/share/elasticsearch/bin/plugin -install mobz/elasticsearch-head ' )
2013-05-08 01:59:33 -07:00
2014-04-22 15:19:11 -07:00
def setup_db_search ( ) :
put ( ' config/supervisor_celeryd_search_indexer.conf ' , ' /etc/supervisor/conf.d/celeryd_search_indexer.conf ' , use_sudo = True )
2014-04-22 18:33:08 -07:00
put ( ' config/supervisor_celeryd_search_indexer_tasker.conf ' , ' /etc/supervisor/conf.d/celeryd_search_indexer_tasker.conf ' , use_sudo = True )
2014-04-22 15:19:11 -07:00
sudo ( ' supervisorctl reread ' )
sudo ( ' supervisorctl update ' )
2015-02-11 17:30:15 -08:00
2015-02-12 11:51:08 -08:00
@parallel
2015-02-11 17:30:15 -08:00
def setup_usage_monitor ( ) :
2015-02-11 17:37:41 -08:00
sudo ( ' ln -fs %s /utils/monitor_disk_usage.py /etc/cron.daily/monitor_disk_usage ' % env . NEWSBLUR_PATH )
2015-02-12 11:51:08 -08:00
sudo ( ' /etc/cron.daily/monitor_disk_usage ' )
2014-04-22 15:19:11 -07:00
2011-03-14 21:44:30 -04:00
# ================
# = Setup - Task =
# ================
2011-09-07 22:35:20 -07:00
def setup_task_firewall ( ) :
sudo ( ' ufw default deny ' )
sudo ( ' ufw allow ssh ' )
sudo ( ' ufw allow 80 ' )
sudo ( ' ufw --force enable ' )
2015-05-06 19:22:53 -07:00
def setup_motd ( role = ' app ' ) :
motd = ' /etc/update-motd.d/22-newsblur-motd '
put ( ' config/motd_ %s .txt ' % role , motd , use_sudo = True )
sudo ( ' chown root.root %s ' % motd )
sudo ( ' chmod a+x %s ' % motd )
2013-05-08 01:59:33 -07:00
2013-04-03 16:23:55 -07:00
def enable_celery_supervisor ( queue = None ) :
if not queue :
put ( ' config/supervisor_celeryd.conf ' , ' /etc/supervisor/conf.d/celeryd.conf ' , use_sudo = True )
else :
put ( ' config/supervisor_celeryd_ %s .conf ' % queue , ' /etc/supervisor/conf.d/celeryd.conf ' , use_sudo = True )
2013-05-08 01:59:33 -07:00
2012-12-26 02:41:13 -08:00
sudo ( ' supervisorctl reread ' )
sudo ( ' supervisorctl update ' )
2014-06-18 13:31:29 -07:00
@parallel
def copy_db_settings ( ) :
return copy_task_settings ( )
2013-03-18 13:14:37 -07:00
@parallel
2012-05-02 16:46:00 -07:00
def copy_task_settings ( ) :
2013-04-03 18:11:23 -07:00
server_hostname = run ( ' hostname ' )
if ' task ' in server_hostname :
host = server_hostname
elif env . host :
2013-04-03 17:22:45 -07:00
host = env . host . split ( ' . ' , 2 ) [ 0 ]
else :
host = env . host_string . split ( ' . ' , 2 ) [ 0 ]
2013-05-08 01:59:33 -07:00
2012-07-06 20:53:27 -07:00
with settings ( warn_only = True ) :
2013-07-17 13:40:45 -07:00
put ( os . path . join ( env . SECRETS_PATH , ' settings/task_settings.py ' ) ,
' %s /local_settings.py ' % env . NEWSBLUR_PATH )
2013-04-03 16:48:42 -07:00
run ( ' echo " \n SERVER_NAME = \\ \\ " %s \\ \\ " " >> %s /local_settings.py ' % ( host , env . NEWSBLUR_PATH ) )
2012-05-02 16:46:00 -07:00
2014-10-16 17:17:35 -07:00
@parallel
def copy_spam ( ) :
put ( os . path . join ( env . SECRETS_PATH , ' spam/spam.py ' ) , ' %s /apps/social/spam.py ' % env . NEWSBLUR_PATH )
2013-03-14 18:43:01 -07:00
# =========================
# = Setup - Digital Ocean =
# =========================
2013-07-01 08:06:45 -07:00
def setup_do ( name , size = 2 , image = None ) :
2013-03-20 12:24:36 -07:00
INSTANCE_SIZE = " %s GB " % size
2013-03-14 18:43:01 -07:00
doapi = dop . client . Client ( django_settings . DO_CLIENT_KEY , django_settings . DO_API_KEY )
sizes = dict ( ( s . name , s . id ) for s in doapi . sizes ( ) )
size_id = sizes [ INSTANCE_SIZE ]
2013-08-12 11:58:23 -07:00
ssh_key_ids = [ str ( k . id ) for k in doapi . all_ssh_keys ( ) ]
2013-03-14 18:43:01 -07:00
region_id = doapi . regions ( ) [ 0 ] . id
2013-07-01 08:06:45 -07:00
if not image :
2015-01-10 12:01:29 -08:00
IMAGE_NAME = " 14.04 x64 "
2013-07-01 08:06:45 -07:00
images = dict ( ( s . name , s . id ) for s in doapi . images ( ) )
2015-01-10 12:01:29 -08:00
print images
2013-07-01 08:06:45 -07:00
image_id = images [ IMAGE_NAME ]
else :
2015-05-08 15:34:35 -07:00
if image == " task " :
2015-07-09 15:17:16 -07:00
image = " task_07-2015 "
2013-07-01 08:06:45 -07:00
IMAGE_NAME = image
images = dict ( ( s . name , s . id ) for s in doapi . images ( show_all = False ) )
image_id = images [ IMAGE_NAME ]
2013-05-20 12:57:45 -07:00
name = do_name ( name )
2014-01-28 15:14:23 -08:00
env . doname = name
print " Creating droplet: %s " % name
2013-05-08 01:59:33 -07:00
instance = doapi . create_droplet ( name = name ,
size_id = size_id ,
image_id = image_id ,
region_id = region_id ,
2013-08-12 11:58:23 -07:00
ssh_key_ids = ssh_key_ids ,
2013-03-26 16:55:29 -07:00
virtio = True )
2013-03-14 18:43:01 -07:00
print " Booting droplet: %s / %s (size: %s ) " % ( instance . id , IMAGE_NAME , INSTANCE_SIZE )
2013-05-08 01:59:33 -07:00
2013-03-14 18:43:01 -07:00
instance = doapi . show_droplet ( instance . id )
i = 0
while True :
if instance . status == ' active ' :
print " ...booted: %s " % instance . ip_address
time . sleep ( 5 )
break
elif instance . status == ' new ' :
print " . " ,
sys . stdout . flush ( )
instance = doapi . show_droplet ( instance . id )
i + = 1
time . sleep ( i )
else :
print " !!! Error: %s " % instance . status
return
2013-05-08 01:59:33 -07:00
2013-03-14 18:43:01 -07:00
host = instance . ip_address
env . host_string = host
2015-02-23 13:31:05 -08:00
time . sleep ( 20 )
2013-03-14 20:38:24 -07:00
add_user_to_do ( )
2013-05-24 15:15:16 -07:00
do ( )
2013-05-08 01:59:33 -07:00
2013-05-20 12:57:45 -07:00
def do_name ( name ) :
if re . search ( r " [0-9] " , name ) :
print " ---> Using %s as hostname " % name
return name
else :
2013-05-20 13:40:46 -07:00
hosts = do_roledefs ( split = False )
2013-05-20 12:57:45 -07:00
hostnames = [ host . name for host in hosts ]
existing_hosts = [ hostname for hostname in hostnames if name in hostname ]
2014-01-28 15:14:23 -08:00
for i in range ( 1 , 100 ) :
2013-05-20 12:57:45 -07:00
try_host = " %s %02d " % ( name , i )
if try_host not in existing_hosts :
print " ---> %s hosts in %s ( %s ). %s is unused. " % ( len ( existing_hosts ) , name ,
' , ' . join ( existing_hosts ) , try_host )
return try_host
2013-03-14 20:38:24 -07:00
def add_user_to_do ( ) :
2013-03-14 18:43:01 -07:00
env . user = " root "
2013-05-09 01:27:53 -07:00
repo_user = " sclay "
2013-03-14 18:43:01 -07:00
with settings ( warn_only = True ) :
2013-05-09 01:27:53 -07:00
run ( ' useradd -m %s ' % ( repo_user ) )
setup_sudoers ( " %s " % ( repo_user ) )
run ( ' mkdir -p ~ %s /.ssh && chmod 700 ~ %s /.ssh ' % ( repo_user , repo_user ) )
run ( ' rm -fr ~ %s /.ssh/id_dsa* ' % ( repo_user ) )
2013-05-15 17:46:45 -07:00
run ( ' ssh-keygen -t dsa -f ~ %s /.ssh/id_dsa -N " " ' % ( repo_user ) )
run ( ' touch ~ %s /.ssh/authorized_keys ' % ( repo_user ) )
2013-07-17 13:40:45 -07:00
copy_ssh_keys ( )
2013-05-09 01:27:53 -07:00
run ( ' chown %s . %s -R ~ %s /.ssh ' % ( repo_user , repo_user , repo_user ) )
env . user = repo_user
2013-03-14 18:43:01 -07:00
2012-10-15 16:32:32 -07:00
# ===============
# = Setup - EC2 =
# ===============
2012-05-03 18:33:29 -07:00
2013-03-13 19:17:45 -07:00
def setup_ec2 ( ) :
2013-05-08 01:59:33 -07:00
AMI_NAME = ' ami-834cf1ea ' # Ubuntu 64-bit 12.04 LTS
2012-10-15 16:32:32 -07:00
# INSTANCE_TYPE = 'c1.medium'
2012-10-22 11:22:28 -07:00
INSTANCE_TYPE = ' c1.medium '
2012-10-15 16:32:32 -07:00
conn = EC2Connection ( django_settings . AWS_ACCESS_KEY_ID , django_settings . AWS_SECRET_ACCESS_KEY )
reservation = conn . run_instances ( AMI_NAME , instance_type = INSTANCE_TYPE ,
2013-05-15 17:46:45 -07:00
key_name = env . user ,
2012-10-15 16:32:32 -07:00
security_groups = [ ' db-mongo ' ] )
instance = reservation . instances [ 0 ]
print " Booting reservation: %s / %s (size: %s ) " % ( reservation , instance , INSTANCE_TYPE )
2012-10-22 16:25:36 -07:00
i = 0
2012-10-15 16:32:32 -07:00
while True :
if instance . state == ' pending ' :
print " . " ,
sys . stdout . flush ( )
instance . update ( )
2012-10-22 16:25:36 -07:00
i + = 1
time . sleep ( i )
2012-10-15 16:32:32 -07:00
elif instance . state == ' running ' :
print " ...booted: %s " % instance . public_dns_name
time . sleep ( 5 )
break
else :
print " !!! Error: %s " % instance . state
return
2013-05-08 01:59:33 -07:00
2012-10-15 16:32:32 -07:00
host = instance . public_dns_name
env . host_string = host
2013-05-08 01:59:33 -07:00
2013-05-29 18:00:09 -07:00
# ==========
# = Deploy =
# ==========
@parallel
def pull ( ) :
with cd ( env . NEWSBLUR_PATH ) :
run ( ' git pull ' )
def pre_deploy ( ) :
compress_assets ( bundle = True )
@serial
def post_deploy ( ) :
cleanup_assets ( )
@parallel
2014-12-30 14:40:06 -08:00
def deploy ( fast = False , reload = False ) :
deploy_code ( copy_assets = False , fast = fast , reload = reload )
2013-05-29 18:00:09 -07:00
@parallel
def deploy_web ( fast = False ) :
deploy_code ( copy_assets = True , fast = fast , full = False )
@parallel
def deploy_full ( fast = False ) :
deploy_code ( copy_assets = True , fast = fast , full = True )
2013-05-08 01:59:33 -07:00
2013-10-11 19:46:33 -07:00
@parallel
def kill_gunicorn ( ) :
with cd ( env . NEWSBLUR_PATH ) :
2014-03-28 12:53:01 -07:00
sudo ( ' pkill -9 -u %s -f gunicorn_django ' % env . user )
2013-10-11 19:46:33 -07:00
2013-05-29 18:00:09 -07:00
@parallel
2014-12-30 14:40:06 -08:00
def deploy_code ( copy_assets = False , full = False , fast = False , reload = False ) :
2013-05-29 18:00:09 -07:00
with cd ( env . NEWSBLUR_PATH ) :
run ( ' git pull ' )
run ( ' mkdir -p static ' )
if full :
run ( ' rm -fr static/* ' )
if copy_assets :
transfer_assets ( )
2015-05-06 19:22:53 -07:00
with settings ( warn_only = True ) :
if reload :
sudo ( ' supervisorctl reload ' )
elif fast :
kill_gunicorn ( )
else :
sudo ( ' kill -HUP `cat /srv/newsblur/logs/gunicorn.pid` ' )
2013-05-29 18:00:09 -07:00
@parallel
def kill ( ) :
sudo ( ' supervisorctl reload ' )
with settings ( warn_only = True ) :
if env . user == ' ubuntu ' :
sudo ( ' ./utils/kill_gunicorn.sh ' )
else :
run ( ' ./utils/kill_gunicorn.sh ' )
def deploy_node ( ) :
with cd ( env . NEWSBLUR_PATH ) :
run ( ' sudo supervisorctl restart node_unread ' )
run ( ' sudo supervisorctl restart node_favicons ' )
def gunicorn_restart ( ) :
restart_gunicorn ( )
def restart_gunicorn ( ) :
with cd ( env . NEWSBLUR_PATH ) , settings ( warn_only = True ) :
run ( ' sudo supervisorctl restart gunicorn ' )
def gunicorn_stop ( ) :
with cd ( env . NEWSBLUR_PATH ) , settings ( warn_only = True ) :
run ( ' sudo supervisorctl stop gunicorn ' )
def staging ( ) :
with cd ( ' ~/staging ' ) :
run ( ' git pull ' )
run ( ' kill -HUP `cat logs/gunicorn.pid` ' )
run ( ' curl -s http://dev.newsblur.com > /dev/null ' )
run ( ' curl -s http://dev.newsblur.com/m/ > /dev/null ' )
def staging_full ( ) :
with cd ( ' ~/staging ' ) :
run ( ' git pull ' )
run ( ' ./manage.py migrate ' )
run ( ' kill -HUP `cat logs/gunicorn.pid` ' )
run ( ' curl -s http://dev.newsblur.com > /dev/null ' )
run ( ' curl -s http://dev.newsblur.com/m/ > /dev/null ' )
2013-08-06 13:38:35 -07:00
@parallel
2013-05-29 18:00:09 -07:00
def celery ( ) :
celery_slow ( )
def celery_slow ( ) :
with cd ( env . NEWSBLUR_PATH ) :
run ( ' git pull ' )
celery_stop ( )
celery_start ( )
@parallel
def celery_fast ( ) :
with cd ( env . NEWSBLUR_PATH ) :
run ( ' git pull ' )
celery_reload ( )
@parallel
def celery_stop ( ) :
with cd ( env . NEWSBLUR_PATH ) :
sudo ( ' supervisorctl stop celery ' )
with settings ( warn_only = True ) :
if env . user == ' ubuntu ' :
sudo ( ' ./utils/kill_celery.sh ' )
else :
run ( ' ./utils/kill_celery.sh ' )
@parallel
def celery_start ( ) :
with cd ( env . NEWSBLUR_PATH ) :
run ( ' sudo supervisorctl start celery ' )
run ( ' tail logs/newsblur.log ' )
@parallel
def celery_reload ( ) :
with cd ( env . NEWSBLUR_PATH ) :
run ( ' sudo supervisorctl reload celery ' )
run ( ' tail logs/newsblur.log ' )
def kill_celery ( ) :
with cd ( env . NEWSBLUR_PATH ) :
with settings ( warn_only = True ) :
if env . user == ' ubuntu ' :
sudo ( ' ./utils/kill_celery.sh ' )
else :
run ( ' ./utils/kill_celery.sh ' )
def compress_assets ( bundle = False ) :
local ( ' jammit -c assets.yml --base-url http://www.newsblur.com --output static ' )
local ( ' tar -czf static.tgz static/* ' )
2013-07-29 15:36:57 -07:00
tries_left = 5
while True :
try :
2013-07-30 17:20:13 -07:00
success = False
with settings ( warn_only = True ) :
local ( ' PYTHONPATH=/srv/newsblur python utils/backups/s3.py set static.tgz ' )
success = True
if not success :
raise Exception ( " Ack! " )
2013-07-29 15:36:57 -07:00
break
except Exception , e :
print " ***> %s . Trying %s more time %s ... " % ( e , tries_left , ' ' if tries_left == 1 else ' s ' )
tries_left - = 1
if tries_left < = 0 : break
2013-06-11 19:58:21 -07:00
2013-05-29 18:00:09 -07:00
def transfer_assets ( ) :
2013-06-11 19:58:21 -07:00
# filename = "deploy_%s.tgz" % env.commit # Easy rollback? Eh, can just upload it again.
# run('PYTHONPATH=/srv/newsblur python s3.py get deploy_%s.tgz' % filename)
run ( ' PYTHONPATH=/srv/newsblur python utils/backups/s3.py get static.tgz ' )
# run('mv %s static/static.tgz' % filename)
run ( ' mv static.tgz static/static.tgz ' )
2013-05-29 18:00:09 -07:00
run ( ' tar -xzf static/static.tgz ' )
run ( ' rm -f static/static.tgz ' )
def cleanup_assets ( ) :
local ( ' rm -f static.tgz ' )
# ===========
# = Backups =
# ===========
2015-03-09 14:50:07 -07:00
def setup_redis_backups ( name = None ) :
# crontab for redis backups
crontab = ( " 0 4 * * * python /srv/newsblur/utils/backups/backup_redis %s .py " %
( ( " _ %s " % name ) if name else " " ) )
run ( ' (crontab -l ; echo " %s " ) | sort - | uniq - | crontab - ' % crontab )
run ( ' crontab -l ' )
def setup_mongo_backups ( ) :
# crontab for mongo backups
crontab = " 0 4 * * * python /srv/newsblur/utils/backups/backup_mongo.py "
run ( ' (crontab -l ; echo " %s " ) | sort - | uniq - | crontab - ' % crontab )
run ( ' crontab -l ' )
def setup_postgres_backups ( ) :
# crontab for postgres backups
crontab = """
0 4 * * * python / srv / newsblur / utils / backups / backup_psql . py
0 * * * * sudo find / var / lib / postgresql / 9.2 / archive - mtime + 1 - exec rm { } \;
0 * * * * sudo find / var / lib / postgresql / 9.2 / archive - type f - mmin + 180 - delete """
run ( ' (crontab -l ; echo " %s " ) | sort - | uniq - | crontab - ' % crontab )
run ( ' crontab -l ' )
def backup_redis ( name = None ) :
2015-03-10 12:02:23 -07:00
run ( ' python /srv/newsblur/utils/backups/backup_redis %s .py ' % ( ( " _ %s " % name ) if name else " " ) )
2015-03-09 14:50:07 -07:00
2013-05-29 18:00:09 -07:00
def backup_mongo ( ) :
2015-03-10 12:02:23 -07:00
run ( ' python /srv/newsblur/utils/backups/backup_mongo.py ' )
2013-05-29 18:00:09 -07:00
def backup_postgresql ( ) :
2015-03-10 12:02:23 -07:00
run ( ' python /srv/newsblur/utils/backups/backup_psql.py ' )
2013-05-29 18:00:09 -07:00
# ===============
# = Calibration =
# ===============
def sync_time ( ) :
with settings ( warn_only = True ) :
sudo ( " /etc/init.d/ntp stop " )
sudo ( " ntpdate pool.ntp.org " )
sudo ( " /etc/init.d/ntp start " )
def setup_time_calibration ( ) :
sudo ( ' apt-get -y install ntp ' )
put ( ' config/ntpdate.cron ' , ' %s / ' % env . NEWSBLUR_PATH )
sudo ( ' chown root.root %s /ntpdate.cron ' % env . NEWSBLUR_PATH )
sudo ( ' chmod 755 %s /ntpdate.cron ' % env . NEWSBLUR_PATH )
sudo ( ' mv %s /ntpdate.cron /etc/cron.hourly/ntpdate ' % env . NEWSBLUR_PATH )
with settings ( warn_only = True ) :
sudo ( ' /etc/cron.hourly/ntpdate ' )
2013-05-08 01:59:33 -07:00
2012-05-03 18:33:29 -07:00
# ==============
# = Tasks - DB =
# ==============
2013-03-22 13:36:32 -07:00
def restore_postgres ( port = 5433 ) :
backup_date = ' 2013-01-29-09-00 '
yes = prompt ( " Dropping and creating NewsBlur PGSQL db. Sure? " )
2013-05-08 01:59:33 -07:00
if yes != ' y ' :
return
2012-08-17 23:29:17 -07:00
# run('PYTHONPATH=%s python utils/backups/s3.py get backup_postgresql_%s.sql.gz' % (env.NEWSBLUR_PATH, backup_date))
# sudo('su postgres -c "createuser -p %s -U newsblur"' % (port,))
2013-03-22 13:36:32 -07:00
run ( ' dropdb newsblur -p %s -U postgres ' % ( port , ) , pty = False )
run ( ' createdb newsblur -p %s -O newsblur ' % ( port , ) , pty = False )
run ( ' pg_restore -p %s --role=newsblur --dbname=newsblur /Users/sclay/Documents/backups/backup_postgresql_ %s .sql.gz ' % ( port , backup_date ) , pty = False )
2013-05-08 01:59:33 -07:00
2012-07-24 23:36:20 -07:00
def restore_mongo ( ) :
backup_date = ' 2012-07-24-09-00 '
2013-06-11 19:58:21 -07:00
run ( ' PYTHONPATH=/srv/newsblur python s3.py get backup_mongo_ %s .tgz ' % ( backup_date ) )
2012-07-24 23:36:20 -07:00
run ( ' tar -xf backup_mongo_ %s .tgz ' % backup_date )
run ( ' mongorestore backup_mongo_ %s ' % backup_date )
2013-05-08 01:59:33 -07:00
2010-12-15 22:26:05 -05:00
# ======
# = S3 =
# ======
2010-09-08 18:30:33 -07:00
2011-07-17 11:31:07 -07:00
if django_settings :
2011-07-17 15:30:25 -07:00
try :
ACCESS_KEY = django_settings . S3_ACCESS_KEY
SECRET = django_settings . S3_SECRET
BUCKET_NAME = django_settings . S3_BACKUP_BUCKET # Note that you need to create this bucket first
except :
print " ---> You need to fix django ' s settings. Enter python and type `import settings`. "
2010-09-08 18:30:33 -07:00
2010-12-15 22:26:05 -05:00
def save_file_in_s3 ( filename ) :
conn = S3Connection ( ACCESS_KEY , SECRET )
bucket = conn . get_bucket ( BUCKET_NAME )
k = Key ( bucket )
k . key = filename
2010-07-30 23:50:49 -04:00
2010-12-15 22:26:05 -05:00
k . set_contents_from_filename ( filename )
2010-07-30 23:50:49 -04:00
2010-12-15 22:26:05 -05:00
def get_file_from_s3 ( filename ) :
conn = S3Connection ( ACCESS_KEY , SECRET )
bucket = conn . get_bucket ( BUCKET_NAME )
k = Key ( bucket )
k . key = filename
2010-09-08 18:30:33 -07:00
2010-12-15 22:26:05 -05:00
k . get_contents_to_filename ( filename )
2010-09-08 18:30:33 -07:00
2010-12-15 22:26:05 -05:00
def list_backup_in_s3 ( ) :
conn = S3Connection ( ACCESS_KEY , SECRET )
bucket = conn . get_bucket ( BUCKET_NAME )
2010-09-08 18:30:33 -07:00
2010-12-15 22:26:05 -05:00
for i , key in enumerate ( bucket . get_all_keys ( ) ) :
print " [ %s ] %s " % ( i , key . name )
2010-09-08 18:30:33 -07:00
2010-12-15 22:26:05 -05:00
def delete_all_backups ( ) :
#FIXME: validate filename exists
conn = S3Connection ( ACCESS_KEY , SECRET )
bucket = conn . get_bucket ( BUCKET_NAME )
2010-09-08 18:30:33 -07:00
2010-12-15 22:26:05 -05:00
for i , key in enumerate ( bucket . get_all_keys ( ) ) :
print " deleting %s " % ( key . name )
2013-03-20 12:24:36 -07:00
key . delete ( )
def add_revsys_keys ( ) :
put ( " ~/Downloads/revsys-keys.pub " , " revsys_keys " )
run ( ' cat revsys_keys >> ~/.ssh/authorized_keys ' )
run ( ' rm revsys_keys ' )