【失敗】Stack OverflowのClone AskbotをCentOS6.4にインストール

Stack Overflow風のサービスを使いたかったので頑張りましたが失敗しました。
代わりにPHPの Question2Answer を使えばそこまでの苦労なく成功。

以下は結局無駄に終わった記録です。


さくらのVPSのCentOS上でStack Overflowのクローンを動かしたかったのでRailsで書かれてて開発もアクティブなShapadoを入れようとしたけど失敗したので、今度はPythonのフレームワークDjangoで書かれてるAskBotを使うことにした。今度こそインストールがうまくいきますように。

## Python のパッケージ管理

どうやらインストールには`pip` か `easy_install` を使うらしいけど、俺はそんなもん知らん！

調べてみると両方共Pythonのパッケージ管理コマンドみたいだけど easy_install とか他に被りそうな名前はやめて欲しい。 easy_install の機能を拡張したのが pip なので特に理由がなければ pip を使うのが良さげ。

Pythonは2.7.3が入ってるのに `$ which pip` や `$ which easy_install` しても何も出てこないのでデフォルトでは入ってないらしい。なので

```shell-session
$ wget http://peak.telecommunity.com/dist/ez_setup.py
$ sudo python ez_setup.py
$ sudo easy_install pip
```

で easy_install と pip を入れておく。

## Askbot のインストール

準備ができたので Askbot をインストールする。
```shell-session
$ sudo pip install askbot
```

「おっ、こりゃ簡単だ。やほーいヽ(=´▽`=)ﾉ」と思ってたら

>  Could not find a version that satisfies the requirement pytz (from askbot) (from versions: 2011h, 2010b, 2012f, 2010e, 2005m, 2011e, 2010l, 2011k, 2010e, 2009u, 2008c, 2006j, 2009f, 2005m, 2009j, 2009g, 2005k, 2010g, 2010h, 2007c, 2009i, 2007k, 2008g, 2008g, 2009j, 2007i, 2006g, 2008h, 2008i, 2009i, 2006p, 2009p, 2010k, 2007f, 2008i, 2009l, 2009i, 2008g, 2007d, 2010l, 2007k, 2007g, 2009g, 2007c, 2009n, 2009e, 2008c, 2007i, 2008a, 2010o, 2006g, 2009a, 2009p, 2009a, 2010l, 2007k, 2010h, 2007c, 2009r, 2006j, 2011c, 2011j, 2012h, 2009u, 2006g, 2009g, 2005r, 2010b, 2009n, 2009u, 2010g, 2005k, 2007i, 2006p, 2011b, 2013b, 2005k, 2005m, 2006p, 2005r, 2009r, 2009f, 2006j, 2009p, 2009n, 2009l, 2009j, 2008h, 2009e, 2009d, 2008b, 2010o, 2008b, 2008i, 2011k, 2009d, 2009a, 2009r, 2010k, 2010e, 2007f, 2008a, 2008a, 2009d, 2008h, 2012j, 2008b, 2009e, 2007f, 2010k, 2010g, 2011e, 2012h, 2011g, 2012g, 2011g, 2011c, 2013d, 2011e, 2011h, 2012j, 2011n, 2007d, 2012g, 2011j, 2008c, 2009f, 2013b, 2007g, 2005r, 2012c, 2012j, 2010b, 2009l, 2007g, 2012b, 2011c, 2011g, 2012c, 2011d, 2011d, 2012d, 2011k, 2012b, 2011n, 2012f, 2012f, 2010o, 2007d, 2012b, 2012c, 2011h, 2013d, 2013b, 2010h, 2011d, 2012d, 2011n, 2013d, 2011j, 2012g, 2012d, 2004b)
Cleaning up...
No distributions matching the version for pytz (from askbot)

と妙に長いエラーメッセージに怒られて凹む。

pipは標準では stable のパッケージしか利用しないのが原因らしいので

```shell-session
$ sudo pip install --pre askbot
```

とするとOKらしい。

## DBをインストール

推奨はPostgreSQLらしい。 既にPostgreSQLは入ってるのでpythonの関連パッケージだけインストール

```shell-session
$ sudo pip install psycopg2
```
すると

`UnicodeDecodeError: 'ascii' codec can't decode`

とかエラーが出たので調べてみると python-devel を入れとかないと出るらしい、なので

```
$ sudo yum install python-devel
```

したあとにもう一度 psycopg2 をインストールしたら無事成功

## データベースを作成

```
psql -U username -d postgres
```

でログインして

```psql
postgres=> create database database_no_namae with owner=username;
CREATE DATABASE
postgres=> alter user username with password 'himitsu_no_pass';
postgres=> \q
```

Askbot用のデータベースを作成して、それからパスワードを決めてなかったらユーザーにちゃんとパスワードを設定しておく。

そして `pg_hba.conf` の一番上の方に以下の記述を追加

`local database_no_namae username md5`

ただしこの pg_hba.conf がどこにあるかを探すのは結構めんどくさいらしい。
自分の環境では `/var/lib/pgsql/9.2/data/pg_hba.conf`にあったけど、別の所にあるかも知れない。
詳しくは参考のリンクを見てください。


んで postgresql を再起動

```
$ sudo /etc/init.d/postgresql-9.2 restart
```

## Askbotの初期設定

……疲れた。さてここからがやっと Askbot自体の設定の始まりです。

まずAskbotを置くディレクトリを作成。この時に `.` を含まないように注意する。(Pythonのモジュール名の規則に違反するため。)

自分の場合は `/home/username/apps/askbotnobasyo` な感じで作成。

※ここで少し飛ばして下の『再トライ』ぐらいまで移動したほうが幸せになれます。

作ったディレクトリ内に移動して、そこで `$ askbot-setup` を叩く。

そうするとセッてアップのためのファイルが作成されるのでインストールコマンドの collectstatic を使う
```
$ python manage.py collectstatic
```

そしてデータベースの初期化

```
$ python manage.py syncdb
```

したところまた`TypeError: Item in ``from list'' not a string` なんて出てきて心が折れそうになる。

何でもDjangoのバージョンが1.4だと出るデラーで 1.4.2 にアップデートすればいいという情報を見つけたけどアップデートの方法どころかDjangoのバージョンを調べる方法さえわかんねえ。


## Django のバージョンの調べ方

```
$ python
Python 2.6.6 (r266:84292, Jul 10 2013, 22:48:45) 
[GCC 4.4.7 20120313 (Red Hat 4.4.7-3)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import django
>>> django.get_version()
'1.5.2'
```

せめてこれが1.4 ならアップデートを試せたのに…。

-- 時間経過 --

どうやら1.5は新しすぎてダメなので 1.4 にダウングレードするとよいらしい。
ただ、どうも調べてると virtualenv という特定のディレクトリにPythonの環境を構築するモジュールを使うのが常識らしく、それを前提にした回答しか出てこない。

## virtualenv 環境にAskbotを入れなおす

仕方がないのでvirtualenvで環境を作ってそこにAskbotを入れなおすことにする。
まずはvirtualenv をインストール

```
$ sudo pip install virtualenv
```

仮想環境を作って、仮想環境を activate して、それからDjango1.4.5をインストール
```
$ virtualenv askbotnobasyo
$ cd askbotnobasyo
$ . /bin/activate
$ pip install django==1.4.5
```

askbot の初期化ファイルを作成

```
$ askbot-setup
```

聞かれたことに答えてると終了。んで

```
$ python manage.py collectstatic
```

すると .css や .js などの全ての静的ファイルが一つのフォルダに生成され……


…ないっ！！ またエラーだよ！ ふぁーーっく！！


## 再トライ

やっぱり virtualenv 使うのはやめとこう。どうせ一個しか環境ないんだし。
なので`$ deactivate` でvirtualenv から脱出しておく。

Djangoのダウングレード方法がわからなかったのでvirtualenv使ったけど、よく考えたら「uninstall -> install でええやん。」ということに気付く。

```
$ sudo pip uninstall django
$ sudo pip install django==1.4.5
```

んでプロジェクトフォルダ作ってそこに移動して

```
$ askbot-setup
$ python manage.py collectstatic
$ python manage.py syncdb
```

で今まではエラーで躓いてしまってたけどやっとできたー！！！ やったー！！

## Nginx と uWSGI で公開する

まずドメインをとっといてそのドメインにさくらのVPSを登録しておく。ココらへんが分からなかったらほかのサイトを参照してください。

んで、Nginxも自分の環境では既に動いてるのでスルー。とりあえずドメインでNginxで動いてるサーバーにアクセスできるように設定しておく。

uWGSI のインストールには pypi が使えるらしい。pypi のコマンドが pip なんだと思う。

```
$ sudo pip install uwgsi
```

そして当然のように帰ってくる UnicodeDecodeError
> UnicodeDecodeError: 'ascii' codec can't decode byte 0xe3 in position 17: ordinal not in range(128)

これは *-devel パッケージが足りないから起きるらしいんだけど、それならちゃんとエラーメッセージもそういう風に書いて欲しい。

uwgsi には python-devel だけじゃなくて libevent-devel も必要らしいので入れる。

```
$ yum install libevent-devel
```

んで、`$ sudo pip install uwgsi` してみたけどやっぱりこける。ほかのサイトの情報によると `libxml2-devel` や `python-pip` もいるらしいので `$ sudo yum install libxml2-devel python-pip` で入れてみる。

3度めの `$ sudo pip install uwgsi` でやっと成功！

で Nginx の設定 /etc/nginx/site-available/example.com.conf を作って
`$ sudo ln -s /etc/nginx/site-available/example.com.conf /etc/nginx/site-enabled/exsample.com.conf`

んで `$ sudo vi exsample.com.conf` で設定ファイルを開いて

```
server {
  listen 80;
  server_name exmaple.com; 
  access_log /var/log/nginx/example.com.access.log;
  error_log /var/log/nginx/exmaple.com.error.log info;
  location / {
    include uwsgi_params;
    uwsgi_pass localhost:44863
    #uwsgi_param UWSGI_PYHOME /path/to/your/virtualenv;
    uwsgi_param UWSGI_SCRIPT wsgi; #this is the name of the script 
    uwsgi_param UWSGI_CHDIR /home/username/apps/appname;
  }
  location /m/ {
    #use this for askbot <= 0.7.39
    #alias /path/to/your/virtualenv/lib/python2.7/site-packages/askbot/skins/;
    alias /home/username/apps/appname/static/;
    autoindex off;
  }
  location /upfiles/ {
    alias /home/username/apps/appname/askbot/upfiles/;
    autoindex off;
  }
  location /admin/media {
    alias /home/username/apps/appname/static/admin; #or path to admin media in <= 0.7.39
    autoindex off;
  }
}
```

んで `$ sudo service nginx restart` で再起動。設定にミスがあったらここでエラー。

プロジェクトフォルダにある django.wsgi を wsgi.py にリネームしてから uwsgi を色々オプションつけながら起動。

```
$ sudo uwsgi --chdir=/home/username/apps/appname \
--module='appname.wsgi:application' \
--env DJANGO_SETTINGS_MODULE=appname.settings \
--master --pidfile=/tmp/project-master.pid \
--socket=127.0.0.1:44863 \
--processes=5 \
--harakiri=20 \
--limit-as=128 \
--max-requests=5000 \
--vacuum --daemonize=/var/log/uwsgi/appname.log
```






## 参考

python - Why is pip not listed in easy_install on CentOS 6? Where to get it? - Super User
http://superuser.com/questions/407926/why-is-pip-not-listed-in-easy-install-on-centos-6-where-to-get-it

python - Could not find a version that satisfies the requirement pytz - Stack Overflow
http://stackoverflow.com/questions/18230956/could-not-find-a-version-that-satisfies-the-requirement-pytz

Create database for Askbot — Askbot 0.7.48 documentation
http://askbot.org/doc/create-database.html

virtualenv - How to install psycopg2 with "pip" on Python? - Stack Overflow
http://stackoverflow.com/questions/5420789/how-to-install-psycopg2-with-pip-on-python

python - can't install psycopg2 on centos - Stack Overflow
http://stackoverflow.com/questions/12908807/cant-install-psycopg2-on-centos

postgresql - How do I find the path to pg_hba.conf from the shell? - Ask Ubuntu
http://askubuntu.com/questions/256534/how-do-i-find-the-path-to-pg-hba-conf-from-the-shell

Re: I need to know password for postgres
http://www.postgresql.org/message-id/1029274812.1353.648.camel@linda

Trying AGAIN to install askbot on a clean server and getting TypeError - Askbot: Open Source Q&A Forum
http://askbot.org/en/question/11071/trying-again-to-install-askbot-on-a-clean-server-and-getting-typeerror/

python - How to know what django version i use? is it 1.0, 1.1, or 1.2? - Stack Overflow
http://stackoverflow.com/questions/4151788/how-to-know-what-django-version-i-use-is-it-1-0-1-1-or-1-2?answertab=votes#tab-top

On syncdb getting TypeError: Item in ``from list'' not a string - Askbot: Open Source Q&A Forum
http://askbot.org/en/question/10153/on-syncdb-getting-typeerror-item-in-from-list-not-a-string/

Generics 3.0: Downgrade the pip installed package
http://generics7.blogspot.jp/2013/05/downgrade-pip-installed-package.html

今日のPython: VIRTUALENV について
http://blog1.erp2py.com/2011/07/virtualenv.html

virtualenv 1.10.1 : Python Package Index
https://pypi.python.org/pypi/virtualenv

How to leave a python virtualenv? - Stack Overflow
http://stackoverflow.com/questions/990754/how-to-leave-a-python-virtualenv

How to Step by Step Deploy Askbot uWSGI Nginx on CentOS 6 64bit? - Askbot: Open Source Q&A Forum
http://askbot.org/en/question/7829/how-to-step-by-step-deploy-askbot-uwsgi-nginx-on-centos-6-64bit/

How to deploy on nginx webserver using uwsgi? - Askbot: Open Source Q&A Forum
http://askbot.org/en/question/7492/how-to-deploy-on-nginx-webserver-using-uwsgi/

python - 'ascii' codec can't decode error when use pip to install uwsgi - Stack Overflow http://stackoverflow.com/questions/17931726/ascii-codec-cant-decode-error-when-use-pip-to-install-uwsgi

Django + uWSGI + NGINX 環境構築メモ on Ubuntu 12.04 | とある Vimmer のブログ http://shu-b10g.blogspot.jp/2012/08/django-uwsgi-nginx-on-ubuntu-1204.html