def setup_server(*roles): """Install packages and add configurations for server given roles.""" require('environment') # Set server locale sudo('/usr/sbin/update-locale LANG=en_US.UTF-8') roles = list(roles) if roles == ['all', ]: roles = SERVER_ROLES if 'base' not in roles: roles.insert(0, 'base') install_packages(*roles) _load_passwords(env.password_names, generate=True) with settings(warn_only=True): supervisor_command('stop all') sudo('killall -vw django-admin.py') if 'db' in roles: if console.confirm(u"Do you want to reset the Postgres cluster?.", default=False): # Ensure the cluster is using UTF-8 pg_version = postgres.detect_version() with settings(warn_only=True): sudo('pg_dropcluster --stop %s main' % pg_version, user='******') sudo('pg_createcluster --start -e UTF-8 --locale=en_US.utf8 %s main' % pg_version, user='******') postgres.create_db_user(username=env.project_user) postgres.create_db(name=env.db, owner=env.project_user) if 'app' in roles: # Create project directories and install Python requirements project_run('mkdir -p %(root)s' % env) project_run('mkdir -p %(log_dir)s' % env) # FIXME: update to SSH as normal user and use sudo # we ssh as the project_user here to maintain ssh agent # forwarding, because it doesn't work with sudo. read: # http://serverfault.com/questions/107187/sudo-su-username-while-keeping-ssh-key-forwarding with settings(user=env.project_user): # TODO: Add known hosts prior to clone. # i.e. ssh -o StrictHostKeyChecking=no [email protected] run('git clone %(repo)s %(code_root)s' % env) with cd(env.code_root): run('git checkout %(branch)s' % env) # Install and create virtualenv with settings(hide('everything'), warn_only=True): test_for_pip = run('which pip') if not test_for_pip: sudo("easy_install -U pip") with settings(hide('everything'), warn_only=True): test_for_virtualenv = run('which virtualenv') if not test_for_virtualenv: sudo("pip install -U virtualenv") project_run('virtualenv -p python2.6 --clear --distribute %s' % env.virtualenv_root) path_file = os.path.join(env.virtualenv_root, 'lib', 'python2.6', 'site-packages', 'project.pth') files.append(path_file, env.code_root, use_sudo=True) sudo('chown %s:%s %s' % (env.project_user, env.project_user, path_file)) sudo('npm install less -g') upload_local_settings() update_requirements() upload_supervisor_app_conf(app_name=u'gunicorn') if 'lb' in roles: nginx.remove_default_site() nginx.upload_nginx_site_conf(site_name=u'%(project)s-%(environment)s.conf' % env) if 'queue' in roles: with settings(warn_only=True): rabbitmq.rabbitmq_command('delete_user %s' % env.project_user) rabbitmq.create_user(env.project_user, env.broker_password) with settings(warn_only=True): rabbitmq.rabbitmq_command('delete_vhost %s' % env.vhost) rabbitmq.create_vhost(env.vhost) rabbitmq.set_vhost_permissions(env.vhost, env.project_user) upload_supervisor_app_conf(app_name=u'celery') # Restart services to pickup changes upload_supervisor_app_conf(app_name=u'group') supervisor_command('reload') supervisor_command('restart %(environment)s:*' % env)