AppFog и Django. С чего начать?

    Доброго времени суток, уважаемые хабровчане! Недавно я заинтересовался Python и, в частности, веб-фреймворком Django. После ознакомления с основными возможностями захотелось найти бесплатный хостинг с поддержкой Django. Каюсь, в тот момент напрочь забыл про GAE, но, почитав вчера про оный, понял, что выбор получился ничуть не хуже. Итак, встречайте, AppFog! (осторожно, под катом картинки!)


    Что нам позволяет беслатный аккаунт?


    • Два гб. дискогового пространства, которое делится на все ваши приложения
    • Подключение до 8 сервисов
    • 100 мб. для базы данных MySQL или PostgreSQL
    • 10 мб. RAM и до 6 одновременным подключений для Redis, MongoDB и RabbitMQ
    • 5 гб. трафика в месяц
    • 100 запросов в секунду
    • Помощь в рамках сообщества
    • Приложения располагаются на доменах *.af.cm

    К сожалению, за плюшки вроде SSH нужно платить. Сам прайс. Ну а мы регистрируем бесплатный аккаунт и получаем на мыло сообщение с ключом подтверждения (у меня уже второй день с данным этапом какая-то лажа). После этого нас должно перекинуть по адресу https://console.appfog.com/, где мы и будем создавать наше приложение.
    http://console.appfog.com


    Создаем приложение


    Нажимаем на кнопку New App и выбираем нужную нам платформу. В принципе, тут я испытал вау-эффект, ибо список впечатляет. Выбираем Django.
    Выбираем платформу

    Далее нам нужно выбрать расположение сервера. Как вы видите, не все сервера поддерживают разные платформы. Я выбрал AWS Europe West. Далее вводим имя домена для нашего сайта.
    Выбираем сервер и вводим имя домена

    Нажимаем Create App. Попадаем на страницу, где нам покажут «лог» создания приложения.
    Создание приложения

    После создания нас автоматически перекинет на страницу приложения
    Страница приложения

    Services — мы можем управлять сервисами нашего приложения.
    Services

    Add-ons — можно установить дополнительные возможности. Страница большая, поэтому я просто дам их список:
    Logentries, Redis Cloud, Xeround, Searchify, MongoHQ, MongoLab, Blitz, ClearDB, MemCachier, Cloudinary, IronMQ, Nexmo, IronWorker, CloudMailin, Mailgun

    Update source code — немного ниже.
    Domain names — позволяет добавлять собственные домены. Но… *барабанная дробь* Недоступно на бесплатном аккаунте.
    Env variables — позволяет добавлять переменные окружения.
    SSL — недоступно на бесплатном аккаунте.
    Clone — клонирует приложение на другой сервер.
    Settings — одна единственная кнопка — Delete App.

    А теперь снова ложка дегтя (хотя, кому как) — для обновления кода приложения нам нужен Ruby и гем af. Так как у меня стоит винда, тянем установщик. Идем на страницу Ruby Installer и качаем инсталятор. В процессе установки он спросит, нужно ли добавлять путь к руби в переменную Path — ставим галку (для неискушенных пользователей, «профи» могут и не делать). И, да, ВНИМАНИЕ — гем AppFog не работает под Cygwin — зависает после ввода логина (их трабла).

    Итак, после установки руби открываем консоль и вводим
    gem update --system
    gem install af

    Далее, заходим на страницу Update source code и нажимаем на кнопку Download source code (внимательные люди уже заметили, что эта кнопка присутствует и в шапке косоли). Нам отдадут zip с кодом. Распаковываем его в какую-нибудь папку и заходим в нее через консоль. Теперь нам надо залогиниться в AppFog:
    af login
    
    [WARNING] DL is deprecated, please use Fiddle
    Attempting login to [https://api.appfog.com]
    Email: youremail@example.com
    Password: **************
    Successfully logged into [https://api.appfog.com]


    Нижесказанное будет написанно для таких же раков, как и я :)


    А теперь давайте изменим наш код. Для начала откроем setting.py и сделаем следующие изменения:
    • Поставим DEBUG в False
    • Найдем строку PROJECT_ROOT = os.path.abspath(os.path.dirname(__file__)) и переместим ее в начало, под строку MANAGERS = ADMINS
    • После предыдущей строки добавим список разрешенных хостов, в который добавим наш домен: ALLOWED_HOSTS = ['habratest.eu01.aws.af.cm/',]
    • Заменим STATIC_ROOT = '' на STATIC_ROOT = os.path.join(PROJECT_ROOT, 'static')

    Далее создадим views.py и впишем в него:
    views.py
    from django.shortcuts import render_to_response
    
    def index(request):
        return render_to_response('index.html')

    Откроем urls.py и сделаем следующие изменения:
    urls.py
    from django.conf.urls.defaults import patterns, include, url
    import settings
    from views import *
    
    urlpatterns = patterns('',
        url(r'^$', index),
        (r'^static/(?P<path>.*)$', 'django.views.static.serve', {'document_root': settings.STATIC_ROOT}), #это нужно для доступа к статическим файлам
    )

    Создадим файл base.html в папке templates, приведем его к виду
    base.html
    <!doctype html>
    <html lang="ru">
    <head>
        <meta charset="UTF-8">
        <title>{% block title %}{% endblock %}</title>
    </head>
    <body>
    	{% block content %}{% endblock %}
    </body>
    </html>

    Изменим файл index.html
    index.html
    {% extends "base.html" %}
    
    {% block title %}Django page{% endblock %}
    
    {% block content %}
        <h1>Welcome to habratest Django page!</h1>
    {% endblock %}

    И создадим файл 404.html
    404.html
    {% extends "base.html" %}
    
    {% block title %}404{% endblock %}
    
    {% block content %}
        <h1>404 ERROR</h1>
    {% endblock %}

    По аналогии можно создать шаблон для 500 ошибки.

    Апдейтим приложение


    После всех манипуляций нам надо загрузить приложение обратно в облако. Снова заходим в консоль и пишем
    af update habratest
    
    [WARNING] DL is deprecated, please use Fiddle
    Uploading Application:
      Checking for available resources: OK
      Packing application: OK
      Uploading (5K): Push Status: OK
    Stopping Application 'habratest': OK
    Staging Application 'habratest': ...
                                                                                    
    Staging Application 'habratest': OK
    Starting Application 'habratest': ..
                                                                                    
    Starting Application 'habratest': OK
    
    

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

    Вместо послесловия


    Я прошу прощения за отсутствие информации про подключение базы данных и работу с ней — я только начал изучать Django и пока еще не взялся за базу данных.
    Если кто-то не хочет регать аккаунт — я могу дать данные от этой тестовой учетки, пишите в личку.
    Большое спасибо за ваше внимание, надеюсь не утомил.
    Share post

    Similar posts

    Comments 19

      +1
      Сервис хороший, давненько юзаю. Но не нравится то, что для не нагруженных сайтов скрипты исполнятся раз в несколько минут. Из-за этого приходится добавлять дату в параметры. Но это кажется проблема амазона. Да и проблема ли?

      Ещё можно зарегать бесплатный домен первого уровня тут.
        0
        Его подцепить на AppFog нельзя. :(
          0
          Можно. Сам давно юзал эту связку, пока домен не отобрали)
            0
            Можно в личку инструкцию?
          +1
          может, вы имели ввиду, бесплатно зарегить домен второго уровня?
            0
            Да, точно, второго. Глупая ошибка.
          0
          Как с дисковым пространством? Вижу только
          100 мб. для базы данных MySQL или PostgreSQL

            0
            2 гига, сейчас добавлю. Спасибо за сигнал.
            +1
            Использую Django на webfaction.com. Бесплатных аккаунтов нет, но платный дешевле. В целом все прикольно.
              +1
              Кстати, переползли туда с GAE как раз по причине высокой стоимости… Google вконец ошалел.
              0
              Я может чего не понял, но чем это лучше OpenShift? Больше трафика/мощности на бесплатном аккаунте? Зато надо всякие сторонние утилиты использовать вместо православного Гита.
                0
                как альтернатива www.pythonanywhere.com и никаких рубей
                  0
                  Не нашел способа загрузки кода к себе в приложение. :(
                  0
                  Может я чего-то не понял в этом сервисе… но:

                  Unlimited apps within 2GB RAM
                  Up to 8 service instances
                  500MB storage per MySQL or PostgreSQL instance
                  1 dedicated SSL endpoint*
                  Unlimited custom domains
                  Ticket-based support
                  10MB RAM & 6 concurrent connections for Redis, MongoDB, and RabbitMQ instances
                  15GB data transfer per month
                  400 requests per second

                  И эта вот балалайка за 50$/мес?????
                  Фришный акк, еще понятно для чего с его ограничениями, но если у вас реальный проект, то на мой взгляд это просто конские цены за такие слабые ресурсы.
                    0
                    Я рассматривал бесплатный вариант. :)
                    0
                    Я давно пользуюсь данным сервисом и именно бесплатным. Вы написали 10мб оперативы, тогда как там дается 2 гига на все приложения(тоесть можно одному приложению дать все 2 гига или двум например по 1ГБ) вы это обозначили не как оперативку а как дисковое место.
                      0
                      10 метров оперативы для Redis, MongoDB и RabbitMQ.
                      0
                      А можете туда запилить какое-нибудь мало-мальски реальное приложение (можно на не главный урл), и потестить loadimpact'ом?
                        0
                        Прошу прощения, но, как уже было мною сказано, я полное днище в Django и вебе в целом.

                      Only users with full accounts can post comments. Log in, please.