<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="uk">
	<id>https://mediawiki.zina.run/index.php?action=history&amp;feed=atom&amp;title=Deploy</id>
	<title>Deploy - Історія редагувань</title>
	<link rel="self" type="application/atom+xml" href="https://mediawiki.zina.run/index.php?action=history&amp;feed=atom&amp;title=Deploy"/>
	<link rel="alternate" type="text/html" href="https://mediawiki.zina.run/index.php?title=Deploy&amp;action=history"/>
	<updated>2026-10-12T09:07:26Z</updated>
	<subtitle>Історія редагувань цієї сторінки в вікі</subtitle>
	<generator>MediaWiki 1.44.2</generator>
	<entry>
		<id>https://mediawiki.zina.run/index.php?title=Deploy&amp;diff=569&amp;oldid=prev</id>
		<title>&gt;Zina: /* Скрипт */</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.zina.run/index.php?title=Deploy&amp;diff=569&amp;oldid=prev"/>
		<updated>2019-04-11T12:43:48Z</updated>

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