Deploy
Перейти до навігації
Перейти до пошуку
sudo apt-get install gcc python-dev python-setuptools python-virtualenv
virtualenv venv
venv/bin/pip install -r deploy_requirements.txt
или руками если такого файла нет
venv/bin/pip install Fabric==1.14.1 mysqlclient==1.4.2.post1 pytz==2018.9
venv/bin/pip freeze > deploy_requirements.txt
Называем скрипт fabfile.py и модифицируем его под проект
# -*- coding: utf-8 -*-
import os
import json
import six
from uuid import uuid4
from fabric.api import run, local, cd, settings, env, abort
from fabric.contrib.console import confirm
from fabric import operations
sites = {
'beta': {
'host': '37.53.93.49',
'port': 850,
'user': 'zina',
'password': 'bGs5.Wzq,_c8&Y,^',
'site_root': '/var/www/zina/data/www/site-domain',
'remote_db_name': '',
'remote_db_host': 'localhost',
'remote_db_login': '',
'remote_db_password': '',
'local_db_password': '',
# DRUPAL 8 'static_root': '/var/www/zina/data/www/site-domain/sites/default/files',
'static_root': '/var/www/zina/data/www/site-domain/public/media',
# DRUPAL 8 'static_root_copy_to': 'sites/default',
'static_root_copy_to': 'public',
'repo_clone_url': 'https://{git_login}:{git_password}@bitbucket.org/zinadz/rud-garden.com.git', # example: https://{git_login}:{git_password}@bitbucket.org/zinadz/rud-garden.com.git
'drush': 'drush9',
'role': 'beta',
},
'prod': {
'host': '77.120.105.84',
'port': 22,
'user': '',
'password': '',
'site_root': '/var/www/username/data/www/site-domain',
'remote_db_name': '',
'remote_db_host': 'localhost',
'remote_db_login': '',
'remote_db_password': '',
'local_db_password': '',
# DRUPAL 8 'static_root': '/var/www/zina/data/www/site-domain/sites/default/files',
'static_root': '/var/www/zina/data/www/site-domain/public/media',
# DRUPAL 8 'static_root_copy_to': 'sites/default',
'static_root_copy_to': 'public',
'repo_clone_url': 'https://{git_login}:{git_password}@bitbucket.org/zinadz/rud-garden.com.git', # example: https://{git_login}:{git_password}@bitbucket.org/zinadz/rud-garden.com.git
'drush': 'env PATH="/opt/php71/bin:$PATH" drush9',
'role': 'production',
},
}
env.password = ''
env.roledefs = {
'beta': [],
'production': [],
}
local_root = os.path.dirname(__file__)
try:
settings_file_path = os.path.join(local_root, 'fabric_settings.json')
open(settings_file_path, 'a').close()
except IOError:
print(u'Невозможно создать файл настроек. Проверьте права')
raise
with open(settings_file_path, 'r+') as settings_file:
try:
fabric_settings = json.load(settings_file)
except ValueError:
fabric_settings = {}
def deploy():
role_list = env.roles if env.roles else env.roledefs.keys()
if not fabric_settings.get('git_login'):
fabric_settings['git_login'] = raw_input(u'Git login> ')
if not fabric_settings.get('git_password'):
fabric_settings['git_password'] = raw_input(u'Git password> ')
with open(settings_file_path, 'r+') as settings_file:
json.dump(fabric_settings, settings_file)
for role_name in role_list:
for site in six.itervalues(sites):
if site['role'] == role_name:
env.host = site['host']
env.port = site['port']
env.user = site['user']
env.password = site['password']
env.host_string = '{}@{}'.format(site['user'], site['host'])
site_root = site['site_root']
repository = site['repo_clone_url'].format(**fabric_settings)
with settings(warn_only=True):
if run('test -d {}'.format(site_root)).failed:
run('git clone {} {}'.format(repository, site_root))
#если движок не django то заменить src/manage.py на index.php
elif run('test -f {}'.format(os.path.join(site_root, 'src/manage.py'))).failed:
if not confirm(u'Дирректория {} сайта не содержит движок django. Удалить ее и склонировать репозиторий?'.format(site_root).encode('utf-8'), False):
abort(u'Выход')
run('rm -rf {}'.format(site_root))
run('mkdir {}'.format(site_root))
run('git clone {} {}'.format(repository, site_root))
with cd(site_root):
run('git pull {} master'.format(repository))
#START Для движка django
run('venv/bin/pip install -r requirements.txt')
run('venv/bin/python src/manage.py migrate')
run('venv/bin/python src/manage.py collectstatic -c -v 0 --noinput')
run('touch logs/reload.txt')
#END Для движка django
#START Для движка drupal
run('%s cache-rebuild' % site['drush'])
#END Для движка drupal
def update_local_db():
role_list = env.roles if env.roles else ['beta']
for role_name in role_list:
for site in six.itervalues(sites):
if site['role'] == role_name:
env.host = site['host']
env.port = site['port']
env.user = site['user']
env.password = site['password']
env.host_string = '{}@{}'.format(site['user'], site['host'])
backup_filepath = '/tmp/{remote_db_name}-{hash}.sql'.format(remote_db_name=site['remote_db_name'], hash=uuid4().hex)
run('mysqldump -u{remote_db_login} -p\'{remote_db_password}\' -h{remote_db_host} {remote_db_name} > {backup_filepath}'.format(backup_filepath=backup_filepath, **site))
operations.get(remote_path=backup_filepath,
local_path=os.path.join(local_root, '{remote_db_name}.sql'.format(**site)))
run('rm -f %s' % backup_filepath)
local('mysql -uroot -p{local_db_password} -hlocalhost --execute="DROP DATABASE IF EXISTS {remote_db_name};CREATE DATABASE {remote_db_name} CHARACTER SET utf8 COLLATE utf8_general_ci;" && mysql -uroot -p{local_db_password} -hlocalhost {remote_db_name} < {remote_db_name}.sql && rm {remote_db_name}.sql'.format(**site))
def update_local_static():
role_list = env.roles if env.roles else ['beta']
for role_name in role_list:
for site in six.itervalues(sites):
if site['role'] == role_name:
env.host = site['host']
env.port = site['port']
env.user = site['user']
env.password = site['password']
env.host_string = '{}@{}'.format(site['user'], site['host'])
local('rsync -amv -e "ssh -p{port}" --delete {user}@{host}:{static_root} {copy_to}'.format(**{
'port': site['port'],
'user': site['user'],
'host': site['host'],
'static_root': site['static_root'],
'copy_to': site['static_root_copy_to'],
}))
Добавляем в .gitignore
/venv/
/fabric_settings.json
*.py[co]
venv/bin/fab -R beta deploy
venv/bin/fab -R production deploy
##обновляем базу
venv/bin/fab -R beta update_local_db
venv/bin/fab -R production update_local_db
- логинимся по ssh на сервер
ssh username@77.120.120.73
- переходим в дирректорию сайта
cd www/site.com.ua
- ставим свой bitbucket login в remote url .git/config
vim .git/config
[remote "origin"] fetch = +refs/heads/*:refs/remotes/origin/* url = https://shmel210@bitbucket.org/zinadz/tmm.git