Я на продкшене
Настало время деплоя
Этап разработки
- 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 -p
CREATE 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
- что-то забыли
- 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/mysql
sudo 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
deck
- 456