GAE: Новый проект на свой домен

GAE (Google App Engine) - это сервис Google, позволяющий загружать свои приложения, которые хостятся в Google. Для разработчика это выглядит как написание плагина к большому сервису. В смысле, нет доступа к системе или диску, только те вызовы которые предоставляет Google - это минус. Плюс же заключается в том что не надо думать вообще ни о чем, просто загрузил программу как файл и все - она работает. И при этом - бесплатно! У меня так крутится программы года 3, наверное. Единственное условие - надо оставаться в пределах бесплатной квоты. У меня максимум программы съедают не больше 10% этой квоты - так что для меня, GAE очень удобна. Вот и напишу как загрузить новый проект на своем доменном имени.

У меня давно прикуплено доменное имя для url shooter, но как-то все не доходили руки сделать этот сервис для себя - надоело пользоваться публичными.

Итак, нам нужно создать новый проект в GAE на собственном доменном имени, что же поехали:
  • Заходим https://console.developers.google.com
  • Логинимся/регистрируемся
  • New Project -> задаем имя проекта ( дальше понадобиться )
  • Идем Compute -> Settings -> Custom domains -> Add custom domain, и
  • пишем свой домен рядом с кнопкой verify, жмем verify
  • Дальше в принципе все по русски, надо внести запись TXT в DNS службу.
  • Проверить наличие записи можно командой: dig @ns1.reg.ru txt <ваше доменное имя>
  • Перезагружаем страничку и выбираем ваш домен в пункте 2
  • Теперь на третьем шаге надо ввести записи A и AAAA, т.е. адреса серваков в IPv4 и IPv6
  • Жмем на кнопку похожую на Enter и все :)
Теперь надо загрузить шаблон Helloworld:
  • Идем в Home
  • Выбираем язык и фреймворк который нравиться ( я выбрал python Bottle )
  • Скачиваем пример.

Все свои проекты я предпочитаю хранить на bitbucket.org в mercurial, поэтому сразу организую дерево проекта. Теперь его надо установить SDK и задеплоить пример - проверить что все работает. Я не любитель делать все руками, поэтому я написал скрипт для скачки SDK нашего проекта ( надо же хоть один листинг привести )

#!/bin/bash
BRed='\e[1;31m'
BGreen='\e[1;32m'
Color_Off='\e[0m'
# If status is not 0, exit
set -e
GAE_DOWNLOAD_URL=https://storage.googleapis.com/appengine-sdks/featured/google_appengine_1.9.25.zip
GAE_SHA1=bbc98eb51b30fdc9500d44ab722ddcff8643089f
PRJ_DIR=`dirname $0`
echo Project Dir: $PRJ_DIR
TEMP_DIR=`mktemp -d`
echo Temp Dir: $TEMP_DIR
SAVE_TMP=0
atexit() {
  if [ $SAVE_TMP -eq 1 ]; then
    echo -e "$BRed\nPlease, look at temporary directory $Color_Off: $TEMP_DIR "
  else
    rm -rf $TEMP_DIR
    echo -e "$BGreen\nTemporary directory $TEMP_DIR was removed $Color_Off"
  fi
}
trap 'atexit' EXIT
abort() {
  echo -e "$BRed\nError: $@ $Color_Off"
  exit 1
}
notify() {
  echo -e " $BGreen\n$@ $Color_Off "
}
#
# Getting Google App Engine
#
BIN_DST=$PRJ_DIR/bin
if [ ! -d $BIN_DST ]; then
  notify "$BIN_DST doesn't exist, download and unpack GAE framework"
  GAE_TMP=$TEMP_DIR/google_appengine.zip
  echo "${GAE_SHA1}  ${GAE_TMP}" >> ${GAE_TMP}.sha1
  notify "Download GAE SDK from: $GAE_DOWNLOAD_URL"
  wget -c -O $GAE_TMP $GAE_DOWNLOAD_URL
  sha1sum -c ${GAE_TMP}.sha1
  notify "Unzip ${GAE_TMP}"
  if [ -x "$( which bar )" ]; then
    extract_size="$( unzip -l $GAE_TMP | wc -c )"
    unzip $GAE_TMP -d $TEMP_DIR | bar -s $extract_size > /dev/null
  else
    unzip $GAE_TMP -d $TEMP_DIR
  fi
  TMP_GAE_DIR=${TEMP_DIR}/google_appengine
  if [ ! -d "$TMP_GAE_DIR" ]; then
    SAVE_TMP=1
    abort "No directory ${temp_dir}/google_appengine"
  fi
  mv $TMP_GAE_DIR $BIN_DST
  rm $GAE_TMP
else
  abort "$BIN_DST exists, Please remove it first \n rm -rvf $BIN_DST"
fi

Соглашусь, что большой скриптик для скачки SDK, но все таки люблю когда все закончено и красиво, заодно и с bar немного поигрался. В интернете, я так и не нашел решения как распаковать zip и отобразить процесс в bar. Но есть здесь один недочет. Заключается он в том что прогресс по реальному unzip отличается от unzip -l, так как последний печатает список файлов с параметрами. Я подсчитал что отличие в 0.92 с копейками раза, что не столь существенно - хотя можно было это учесть. Как говориться в "Лучшее - враг хорошего", так что оставим его как есть.

Сразу помещаем bin в .hgignore:

$ echo '^bin/' > .hgignore

и дальше поток знакомых команд:

$ unzip ~/Downloads/appengine-try-python-bottle-master.zip
$ mv appengine-try-python-bottle-master/ src
$ hg add download.sh .hgignore src/
$ hg commit
$ ./bin/appcfg.py -A <имя_вашего_проекта> update src/

Все должны сказать что все обновлено, можно теперь пойти посмотреть в интернете.