Я на продкшене 

Настало время деплоя


Этап разработки

  • git repository
  • requirements.txt
  • bower

Bower

$ bower install jquery$ bower install git://github.com/components/jquery.git
{
 "name": "myProject",
 "version": "1.0.0",
 "dependencies": { "jquery": "~1.7.2" }
}


django-bower

Шаг 1

  • ssh root@example.com
  • git clone http://repo.git

FAIL

git: command not found 
apt-get install git-core 
  • debian => git-core
  • redhat => git

Попытка №2

git clone git://git@repo.git 

Failed publickey for git...

ForwardAgent yes

$ ssh-add ~/.ssh/id_rsa$ ssh -A username@example.com(username@example.com):$ git clone git://git@repo.git 

Другие проблемы

  • нету pip
  • нету virtualenv
  • старый питон

шаг 2

Устновка зависимотей питона

  • virtualenv
  • requirements.txt

virtualenvwrapper

            $ mkvirtualenv my_env(my_env)    $ python ...(my_env)    $ workon other_env
(other_env) $ workon other_env
(other_env) $ rmvirtualenv my_env

Устновка зависимостей


$ mkvirtualenv project_name$ pip install -r reqirements.txt

FAIL


???

  • mysqldb-python
  • lxml
  • PIL
 apt-get install libmysqlclient-dev python-dev libxml2-dev \                 libxslt1-dev libjpeg libjpeg-dev zlib1g-dev \                 libfreetype6-dev libfreetype6

ИЛИ


 apt-get install mysqldb-python python-imaging python-lxml

В этот момент я еще норм


ШАг 3

  • настройка
  • создание БД
  • миграция

syncdb

 $ ./manage.py syncdb

FAIL

Базу данных то никто не создал то

ОК
 mysql -u root -pCREATE DATABASE marten CHARACTER SET utf8 COLLATE utf8_bin;
GRANT ALL PRIVILEGES ON marten.* to 'root'@'localhost' identified by '';
django-extensions
 ./manage.py sqlcreate -R default | mysql -u root -p

RUN?

 ./manage.py run
50/50 FAIL
  • что-то забыли
    • memcache
    • package not found
  • что-то сломалось
    • обновилась версия и всё сломалось
    • pypi сервер вышел покурить
    • py26 django+decimal field => fail

«Я как то упустил этот момент» ©


???

  • nginx конфиг
  • uwsgi/gunicorn конфиг
  • debug=False
  • collectstatic
  • ...

И после этого мне уже не норм


решение

  • интегрировать процесс деплоя в разработку
    • тестовый сервер
    • virtualbox
    • vagrant

VAGrant

$ vagrant box add base http://files.vagrantup.com/lucid32.box
$ vagrant init
$ vagrant up
$ vagrant ssh

И чё опять всё руками делать?


Автоматизируем рутинные действия

  • bash скрипты
  • fabric
  • chef
  • puppet
  • saltstack

Fabric

  • run
  • local
  • sudo
  • mv
  • cp
  • get

FABtools

from fabtools import require

require.mysql.server(password=env.mysql_password)
require.mysql.user(env.db_user, env.db_password)
require.mysql.database(env.db_name, owner=env.db_user)

require.git.command()
require.git.working_copy(env.git_remote_url, path=env.project_root)

require.deb.packages(env.REQUIRE_PACKAGES)
require.python.virtualenv(env.venv_project_path, system_site_packages=True)
    with virtualenv(env.venv_project_path):
        require.python.requirements(env.requirements_file)

хипстокод


Лень

  • надо много знать
  • надо много писать
  • без гарантий успешного результата
  • хочу всё готовое

CHEF & puppet & saltstak


ИЛИ


paas   ???

  • Google app engin
  • Heroku
  • Dotcloud
  • Openshift
  • AWS Elastic Beanstalk
  • ...


Docker?!


Деплой

sudo docker run yurtaev/marten3000


ВСЁ!!!

Но не всё ;(

sudo docker run yurtaev/mysqlsudo docker run yurtaev/redis
  • ждать 0.8
  • https://github.com/toscanini/maestro/

docker build

# Marten3000
#
# varsion 0.0.0

FROM crosbymichael/python
MAINTAINER Egor Yurtaev "yurtaev.egor@gmail.com"
ADD .config/supervisor.conf /opt/supervisor.conf
ADD . /opt/apps/marten3000
WORKDIR /opt/apps/marten3000
RUN pip install -r requirements.txt
RUN apt-get install -y supervisor python-lxml python-mysqldb

EXPOSE 8000 CMD ["supervisord", "-c", "/opt/supervisor.conf", "-n"]

плюсы

  • везде и всегда одинаковое окружение
  • изолированность
  • легковесность
  • переносимость
  • простота
  • ...

Минусы

  • версия 0.6 сыро
  • не хватает функционала взаимодействия контейнеров
  • всякая мелочь

Процесс деплоя



У меня остались гифки


Когда мне покажут идеальный способ деплоя


и опять


deck

By Egor Yurtaev