Статьи

Развертывание моего приложения Django в DotCloud

 

Этот пост устарел. Пересмотренный учебник можно найти ЗДЕСЬ .

Недавно я написал о ep.io и gondor.io , двух новых хостингах Python / Django, которые в настоящее время находятся в стадии бета-тестирования. DotCloud.comеще один новый сервис, который недавно появился на сцене и вызывает много волн . DotCloud немного отличается по ряду причин. Их сервис не нацелен на какой-либо технологический стек, такой как ep.io и gondor.io с Python / Django / wsgi.

Цель DotCloud — предоставить несколько различных независимых сервисов, которые вы можете использовать в качестве строительных блоков для создания своего приложения. Если вам нужна база данных, выберите один из множества поддерживаемых ими. Нужно приложение, которое использует Django или Rails на внешнем интерфейсе, и Java на серверном, это нормально, вы тоже можете это сделать. Они понимают, что большинство разработчиков не придерживаются одного стандартного технологического стека для всех своих приложений, поэтому это дает вам гибкость в использовании лучшего инструмента для работы. Это также дает вам прекрасную возможность попробовать новые сервисы и посмотреть, как они работают, без необходимости устанавливать, настраивать и поддерживать сервис только для тестирования.

DotCloud был частью летнего класса Y Combinator 2010 года, и они только недавно собрали 10 миллионов долларов . Имея доступ к таким деньгам, я предполагаю, что они довольно быстро будут нанимать кучу людей, и я уверен, что мы также увидим расширение их услуг.

Как и все новые технологии, я хочу поиграть с ними и посмотреть, соответствуют ли они всему обману. Мне посчастливилось получить бета-приглашение несколько недель назад, и с тех пор я играю с ним. Я решил, что лучший способ проверить это — развернуть мой блог и посмотреть, насколько это будет сложно. Вот шаги, которые я предпринял, чтобы мой блог на основе Django заработал на DotCloud. Я столкнулся с несколькими проблемами, и я позаботился о том, чтобы я их тоже исправил, чтобы, если у вас возникла та же проблема, вы могли увидеть, как я ее решил.

Документация

Прежде чем приступить к работе с любым новым сервисом, первое, что я обычно делаю, это смотрю документацию. DotCloud имеет хороший список документов, а также некоторые учебные пособия о том, как начать работу. Эти 3 документа я использовал больше всего.

http://docs.dotcloud.com/tutorials/django/

http://docs.dotcloud.com/components/mysql/

http://docs.dotcloud.com/tutorials/firststeps/

Первые шаги:

Как и все классные сервисы в наши дни, dotcloud использует CLI на основе Python, поэтому прежде чем мы сможем начать, нам нужно установить клиент dotcloud и настроить его так, чтобы мы могли начать его использовать.

# create my dotcloud virtual environment.
$ mkvirtualenv dotcloud

# install dotcloud client using pip
$ pip install dotcloud

# create our application namespace called kencochrane
$ dotcloud create kencochrane

#enter api key that we got from: http://www.dotcloud.com/account/settings when prompted
#<key goes here>

Теперь, когда у нас есть все настройки клиента и пространство имен приложения, мы можем приступить к созданию нашего сервиса. Я поместил свой репозиторий блогов на bitbucket, чтобы я мог вносить в него определенные изменения в dotcloud и не влиять на исходное репо.

# go into projects directory
cd ~/projects

# forked kencochranenet to kencochranenet_dotcloud, now clone that. locally
hg clone https://bitbucket.org/kencochrane/kencochranenet_dotcloud kencochrane_dotcloud

# go into the new directory.
cd kencochrane_dotcloud

Прочтение документации говорит мне, что мне нужно создать файл wsgi.py и поместить его в корень моего проекта. Используя http://docs.dotcloud.com/tutorials/django/#djangowsgipy в качестве шаблона, я создал свой файл wsgi.py ниже. У меня были проблемы с шаблоном по умолчанию, и мне нужно было добавить каталог в sys.path, чтобы wsgi мог правильно найти мои приложения django. Вот мой готовый файл.

import os
import sys

# Ken added this, only thing that is different from the example template (not counting settings file name)
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__),'mysite')))
os.environ['DJANGO_SETTINGS_MODULE'] = 'mysite.settings'

import django.core.handlers.wsgi
djangoapplication = django.core.handlers.wsgi.WSGIHandler()
def application(environ, start_response):
    if 'SCRIPT_NAME' in environ:
        del environ['SCRIPT_NAME']
    return djangoapplication(environ, start_response)

DotCloud использует файлы требований PIP для управления зависимостями вашего проекта. У нас уже есть наш файл требований к пипсам, где он должен быть и назван правильно, поэтому нам не нужно ничего делать, но если бы у нас его не было, нам нужно было бы создать его, поместить в корень и вызвать его requirements.txt

DotCloud требует, чтобы мы поместили все наши статические носители в каталог с именем «static» в корне нашего проекта. Поскольку мой статический носитель уже найден в другом месте, мне нужно создать каталог с именем static и переместить в него все мои файлы.

# we need to create a static directory to serve static media from (/static) .
mkdir -p static

Если вы используете администратор django, вам нужно будет создать скрипт postinstall, который создаст символическую ссылку под static для ваших медиа-файлов администратора django. Вот как выглядит моя. Если вы используете это как шаблон, не забудьте изменить переменную DJANGO_SETTINGS_MODULE, чтобы она соответствовала вашему проекту.

#!/usr/bin/env python
import os
# To import anything under django.*, we must set this variable.
os.environ['DJANGO_SETTINGS_MODULE'] = 'mysite.settings'
# Import the admin module. The media directory is right under it!
import django.contrib.admin
# Retrieve the absolute path of the admin module.
admindir = os.path.dirname(django.contrib.admin.__file__)
# Add /media behind it.
mediadir = os.path.join(admindir, 'media')
# Compute the path of the symlink under the static directory.
staticlink = os.path.join('static', 'admin_media')
# If the link already exists, delete it.
if os.path.islink(staticlink):
    os.unlink(staticlink)
# Install the correct link.

os.symlink(mediadir, staticlink)

 

# make the script executable.
chmod +x postinstall

Поскольку мы изменили наше местоположение статического носителя, нам нужно не забыть обновить наш файл settings.py новыми настройками. Вот мои изменения.

# edit settings.py file to the following.
ADMIN_MEDIA_PREFIX = '/static/admin_media/'

# change MEDIA_URL
MEDIA_URL = '/static/'

развертывание

Теперь, когда структура проекта нашего приложения полностью настроена и настроена так, как этого хочет dotcloud, мы можем запустить некоторые службы и затем развернуть наше приложение. Если вы хотите узнать, какие сервисы у них доступны, вы можете выполнить следующую команду.

# find out which services that are available.
dotcloud deploy -h

You can chose among the following services:
  java          host any Java servlet (also Clojure, Play!, and much more)
  mysql         the worlds most popular open source database
  nodejs        run JavaScript processes (including web apps)
  php           host any PHP web app: Drupal, WordPress...
  php-worker    run background PHP processes
  postgresql    the worlds most advanced open source database
  python        host any Python/WSGI web app: Django, Pylons, Web2py...
  python-worker run background Python processes
  rabbitmq      AMQP message queue server
  redis         advanced key-value store
  ruby          host any Ruby/Rack web app: Rails, Sinatra...
  ruby-worker   run background Ruby processes
  smtp          authenticated SMTP relay to send e-mails reliably
  static        host static HTTP content

Нам нужна база данных для нашего блога, так как она изначально была настроена для использования mysql, давайте используем ее здесь. Запустите новый сервис MySQL под названием «kencochrane.mysql»

# start up the database service.
$ dotcloud deploy -t mysql kencochrane.mysql
Created "kencochrane.mysql".

Давайте удостоверимся, что это было создано, и узнаем немного больше о нашем новом экземпляре базы данных.

# get the information about our new service
$ dotcloud info kencochrane.mysqlcluster: wolverine
config:
    mysql_password: password_was_changed
created_at: 1303671517.96066
name: kencochrane.mysql
namespace: kencochrane
ports:
-   name: ssh
    url: ssh://[email protected]:3912
-   name: mysql
    url: mysql://root:[email protected]:3913
state: running
type: mysql

Как видно из вышеизложенного, у нас есть база данных mysql, она работает и позволяет узнать URL-адреса и порты ssh и mysql, а также пароль пользователя root. Давайте создадим нашу базу данных. Для этого мы войдем на сервер и запустим несколько команд sql. (конфиденциальная информация была изменена)

# connect to dotcloud mysql server instance
$ dotcloud run kencochrane.mysql -- mysql -u root -p

# mysql -u root -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 34
Server version: 5.1.41-3ubuntu12.10 (Ubuntu)

# create the user and database and give user permissions to database.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> create database blogdb;
Query OK, 1 row affected (0.00 sec)

mysql> create user 'blog_username' identified by 'strong_password';
Query OK, 0 rows affected (0.05 sec)

mysql> grant all on blogdb.* to 'blog_user'@'%';
Query OK, 0 rows affected (0.04 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

mysql> exit;Bye
Shared connection to mysql.kencochrane.dotcloud.com closed.

Теперь, когда наша база данных полностью настроена, нам нужно изменить наш файл настроек, чтобы он содержал всю новую информацию. Вот как выглядит моя.

# update your settings.py file.

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'blogdb',
        'USER': 'blog_username',
        'PASSWORD': 'strong_password',
        'HOST': 'mysql.kencochrane.dotcloud.com',
        'PORT': '3913',
    }
}

Теперь мы готовы развернуть наше приложение Django, но прежде чем идти дальше, важно знать следующее. Dotcloud обратит внимание на ваши файлы .hgignore. Если у вас есть файл настроек в вашем файле .hgignore, чтобы он не сохранялся в репозитории, он не перенесет эти изменения в облако. Вам нужно будет удалить его из .hgignore, чтобы получить эти файлы. Также важно помнить, что передаются только зафиксированные изменения, поэтому не забудьте зафиксировать их. Если вы хотите быть хитрым, вы можете использовать скрипт постустановки, чтобы вытащить файл из безопасного места и установить его таким образом, если вы хотите сделать вещи сверхбезопасными.

Теперь, когда у нас есть это позади, давайте начнем. Сначала нам нужно создать новый сервис Python.

# deploy a new python app called kencochrane.blog
$ dotcloud deploy --type python kencochrane.blog

Сервис теперь создан, поэтому все, что нам нужно сделать, это подтолкнуть наше приложение к новому сервису.

# push out your changes to the server
$ dotcloud push kencochrane.blog .

Теперь ваш код находится в облаке, вам просто нужно синхронизировать базу данных и запустить миграцию, чтобы полностью настроить базу данных, и вы должны быть готовы к работе.

# sync the database
$ dotcloud run kencochrane.blog python current/mysite/manage.py syncdb

# we use south so run migrate
$ dotcloud run kencochrane.blog python current/mysite/manage.py migrate

теперь это работает, просто зайдите на http://blog.kencochrane.dotcloud.com/, чтобы увидеть.

Если вам нужно посмотреть журналы, чтобы увидеть, как это происходит, вы можете сделать это двумя способами. Первый способ привязывает ваши логи для вас к вашей консоли.

# look at logs of your service, it will tail them to your console. ctrl-c to stop.
$ dotcloud logs kencochrane.blog

Или войдите через ssh и посмотрите ваши логи.

# Open up a shell
$ dotcloud ssh kencochrane.blog

Вот те, которые вам, скорее всего, небезразличны.

# nginx access and error logs.
/var/log/nginx/<app_name>.{access,error}.log

# wsgi error logs
/var/log/supervisor/uswgi.log

Если вам нужно перезапустить службу, просто введите эту команду.

# restart the service
dotcloud restart kencochrane.blog

DotCloud работает на сервисе Amazon EC2, и на прошлой неделе, когда я проводил тестирование, я получал кучу ошибок, я не был уверен, были ли ошибки, потому что это бета-сервис, и они все еще являются ошибками в нем, или если это было связано с проблемами амазонки. В любом случае, я перечислил эти ошибки ниже, если их получит кто-то другой. Если бы я получил ошибку, я просто запустил бы команду снова, пока она не заработала, иногда это занимало 3 раза, пока все не работало нормально.

# attempt 1
$ dotcloud push kencochrane.blog .DotCloud service unavailable ("No JSON object could be decoded").
Please try again later. If the problem persists, send an email to [email protected].

# attempt 2
$ dotcloud push kencochrane.blog .
# upload . ssh://[email protected]:1060/kencochrane.blog
# hg
remote: Warning: Permanently added '[uploader.dotcloud.com]:1060,[174.129.15.77]:1060' (RSA) to the list of known hosts.
pushing to ssh://[email protected]:1060/kencochrane.blog
searching for changes
remote: adding changesets
remote: adding manifests
remote: adding file changes
remote: added 1 changesets with 3 changes to 3 files
Scheduling build
Fetching logs...
Build started...
mkdir: cannot create directory `126:afdea9036e83': File exists
Failed to fetch tarball (<type 'exceptions.ValueError'>: Failed to extract the tarball, abort.)
Build finished.
Shared connection to blog.kencochrane.dotcloud.com closed.

# 3rd time is a charm, it finally works.
$ dotcloud push kencochrane.blog .# upload . ssh://[email protected]:1060/kencochrane.blog
# hg
remote: Warning: Permanently added '[uploader.dotcloud.com]:1060,[174.129.15.77]:1060' (RSA) to the list of known hosts.
pushing to ssh://[email protected]:1060/kencochrane.blog
searching for changes
no changes found
Scheduling build
Fetching logs...
Build started...
.
. all of the files (trimmed for space)
.
Fetched code revision 126:afdea9036e83
.
. all the requirments (trimmed for space)
.
Cleaning up...
Reloading nginx configuration: nginx.
uwsgi: stopped
uwsgi: started
Build finished.

Shared connection to blog.kencochrane.dotcloud.com closed.

Вывод:

Настройка моего блога на DotCloud была довольно простой, документация помогла мне в этом. Я наткнулся на несколько дорожных преград, которые ненадолго остановили меня на пути, но после некоторых раскопок я смог преодолеть эти проблемы. Надеюсь, этот пост поможет вам преодолеть те же проблемы, что и у меня, и сделает ваше развертывание более плавным.

Служба очень гибкая, что будет хорошо для большинства разработчиков, но с добавленной гибкостью они добавили некоторую сложность, которой нет в других службах. Например, ep.io и gondor.io обрабатывают всю базу данных и создание пользователей за вас, поэтому вам не нужно знать, какие команды нужно запускать для создания базы данных и пользователя, а также они автоматически добавляют строки подключения к базе данных в ваши настройки файл. Я, например, не против дополнительной сложности, учитывая, что я получу возможность иметь прямой доступ к моей базе данных, чтобы я мог делать то, что я хочу. Другие, возможно, не захотят беспокоиться об этом. Если вы создаете приложение для клиента, который не очень разбирается в технологиях, чем больше автоматизировано, тем лучше.

DotCloud все еще находится в бета-версии, и если вы посмотрите на их план , у них есть очень амбициозные цели. Я, например, не могу дождаться, чтобы увидеть, как они прогрессируют. Я только вошел в некоторые из многих вещей, которые может предложить dotcloud, я рекомендую вам попробовать и оставить мне комментарий, дающий мне знать, как вам понравилось.

В следующий раз:

Мне повезло, что на http://apphosted.com хостинг-сервис python / django, похожий на gondor.io и ep.io, достиг пика. Сейчас я играю с сервисом, а когда закончу, я опубликую свои выводы.

Обновить:

Прочитайте, как этот сервис сопоставляется с другими сервисами, подобными этому, в моем обзоре хостинга Django.

Источник: http://kencochrane.net/blog/2011/04/deploying-my-django-application-to-dotcloud/