TaigaをAWSに立ち上げる

TaigaをAWSに立ち上げるまでの流れを以下記述していく。

## AWSインスタンスを借りる

1. AWSのサインアップを済ませる
2. t2.microインスタンス(以上)を契約する。その際、ディスクは最低16GB確保する。イメージはUbuntu 18.04を利用する
3. セキュリティグループは22・80・443を開ける

## ドメインを設定する(必要に応じて)

1. 適当なネームサーバーと契約する
2. ネームサーバーのAレコードとして先程契約したサーバのパブリックIPアドレスを指定して登録する

## サーバの初期設定をする

1. サーバにSSHログインする。その際、鍵はサーバを作ったときに使ったものを用いる。ユーザー名はubuntuである(AWS Linuxの場合はec2-userであるが、Ubuntuの場合ubuntuになることに注意せよ)
2. `sudo apt-get update`したあと、`sudo apt-get upgrade`する。GRUBについて聞かれたら`keep the local version currently installed`を選んでOKを選ぶ
3. カーネルが更新されたので`sudo reboot now`して再起動する
4. その後、いくつかのパッケージが未更新になっているので、`sudo apt-get upgrade`と入力して未更新のパッケージを確認。その後、それらのパッケージを明示的に指定してupgradeする。それが終わったらもう一度再起動する

## 必要なパッケージをインストールして初期設定をする

1. https://taigaio.github.io/taiga-doc/dist/setup-production.html にも書いてあるが、`sudo apt-get install build-essential binutils-doc autoconf flex bison libjpeg-dev libfreetype6-dev zlib1g-dev libzmq3-dev libgdbm-dev libncurses5-dev automake libtool libffi-dev curl git tmux gettext nginx rabbitmq-server redis-server postgresql-10 postgresql-contrib postgresql-doc-10 postgresql-server-dev-10 python3 python3-pip python-dev python3-dev python-pip virtualenvwrapper libxml2-dev libxslt-dev libssl-dev libffi-dev`で必要なパッケージをインストールする(Ubuntu 18.04ではPostgreSQLは10に変更になっているため、それに合わせて変更)
2. `sudo adduser taiga`する。パスワードを求められるが適当でよい(あとで適宜パスワードを変更する)
3. `sudo adduser taiga sudo`して、taigaユーザでsudoできるようにする
4. `sudo su - taiga`でtaigaユーザになる
5. `passwd`でパスワードを設定する
6. `sudo -u postgres createuser taiga`してtaigaユーザに紐づくデータベースユーザを作成する。sudoするときのパスワードは5で設定したものである
7. `sudo -u postgres createdb taiga -O taiga --encoding='utf-8' --locale=en_US.utf8 --template=template0`してtaigaデータベースを作成する
8. `sudo rabbitmqctl add_user taiga PASSWORD_FOR_EVENTS`でRabbitMQ上にtaigaユーザを作成する
9. `sudo rabbitmqctl add_vhost taiga`でtaiga vhostを作成する
10. `sudo rabbitmqctl set_permissions -p taiga taiga ".*" ".*" ".*"`でパーミッションを設定する

## Taigaのバックエンドをインストールする

以下の作業もtaigaユーザで行う

1. ユーザのルートディレクトリにcdした後、`git clone https://github.com/taigaio/taiga-back.git taiga-back`してtaiga-backをcloneする
2. `cd taiga-back`したあと、`git checkout stable`で安定版をチェックアウトする
3. `mkvirtualenv -p /usr/bin/python3 taiga`でPython環境をセットアップする
4. `pip install -r requirements.txt`で必要なパッケージをインストールする
5. 必要な設定を読み込むため、以下の内容を実行する

```
python manage.py migrate --noinput
python manage.py loaddata initial_user
python manage.py loaddata initial_project_templates
python manage.py compilemessages
python manage.py collectstatic --noinput
```

## Taigaのバックエンドの設定をする

taiga-back/settings/local.pyの内容を以下の通りとする

```python
from .common import *

MEDIA_URL = "https://mydomain.tld/media/"
STATIC_URL = "https://mydomain.tld/static/"
SITES["front"]["scheme"] = "https"
SITES["front"]["domain"] = "mydomain.tld"

SECRET_KEY = "theveryultratopsecretkey"

DEBUG = False
# ここは公開登録させないならFalseを指定する
PUBLIC_REGISTER_ENABLED = True

DEFAULT_FROM_EMAIL = "sender@sender.domain"
SERVER_EMAIL = DEFAULT_FROM_EMAIL

EVENTS_PUSH_BACKEND = "taiga.events.backends.rabbitmq.EventsPushBackend"
EVENTS_PUSH_BACKEND_OPTIONS = {
    "url": "amqp://taiga:PASSWORD_FOR_EVENTS@localhost:5672/taiga"
}

# Uncomment and populate with proper connection parameters
# for enable email sending. EMAIL_HOST_USER should end by @domain.tld
EMAIL_BACKEND = "django.core.mail.backends.smtp.EmailBackend"
EMAIL_USE_TLS = True
EMAIL_HOST = "mailserver.sender.domain"
EMAIL_HOST_USER = "sender_user"
EMAIL_HOST_PASSWORD = "sender_password"
# 認証がいらないメールサーバなら25になる
EMAIL_PORT = 587

# Uncomment and populate with proper connection parameters
# for enable github login/singin.
# 事前にGithubでAPIキーとシークレットを取得すること
# https://github.com/settings/applications/new から取得できる
GITHUB_API_CLIENT_ID = "yourgithubclientid"
GITHUB_API_CLIENT_SECRET = "yourgithubclientsecret"
```

ここまで終わったら`deactivate`でVirtualenvから抜ける

## Taigaのフロントエンドの設定をする

1. ユーザのルートディレクトリにcdした後、`git clone https://github.com/taigaio/taiga-front-dist.git taiga-front-dist`してtaiga-front-distをcloneする
2. `cd taiga-front-dist`した後、`git checkout stable`して安定版をチェックアウトする
3. dist/conf.example.jsonをdist/conf.jsonにcpする
4. dist/conf.jsonの設定内容は以下の通りとする
    1. `api`は`"https://mydomain.tld/api/v1/"`にする
    2. `eventsUrl`は`"wss://mydomain.tld/events"`にする
    3. `publicRegisterEnabled`は先程設定した`PUBLIC_REGISTER_ENABLED`に揃える

## TaigaのWebSocketサーバをセットアップする

1. ユーザのルートディレクトリにcdした後、`git clone https://github.com/taigaio/taiga-events.git taiga-events`してtaiga-eventsをcloneする
2. `cd taiga-events`する(masterを使うため、checkoutを要しない)
3. `curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash -`した後、`sudo apt-get install nodejs`してNode.jsをインストールする
4. `npm install`して必要なパッケージをインストールする
5. `cp config.example.json config.json`でconfigをコピーする
6. config.jsonを編集し、`url`を`"amqp://taiga:PASSWORD_FOR_EVENTS@localhost:5672/taiga"`に、`secret`を`"theveryultratopsecretkey"`に変更して保存する

## TaigaのWebSocketサーバの自動起動設定をする

/etc/systemd/system/taiga_events.serviceを以下の内容にする

```
[Unit]
Description=taiga_events
After=network.target

[Service]
User=taiga
WorkingDirectory=/home/taiga/taiga-events
ExecStart=/bin/bash -c "node_modules/coffeescript/bin/coffee index.coffee"
Restart=always
RestartSec=3

[Install]
WantedBy=default.target
```

その後、以下の手順を行う

1. `sudo systemctl daemon-reload`でデーモンのリストを再読込する
2. `sudo systemctl start taiga_events.service`で起動する
3. `sudo systemctl enable taiga_events.service`で自動起動を有効にする

## Taigaのバックエンドの自動起動を設定する

/etc/systemd/system/taiga.serviceを以下の内容にする

```
[Unit]
Description=taiga_back
After=network.target

[Service]
User=taiga
Environment=PYTHONUNBUFFERED=true
WorkingDirectory=/home/taiga/taiga-back
ExecStart=/home/taiga/.virtualenvs/taiga/bin/gunicorn --workers 4 --timeout 60 -b 127.0.0.1:8001 taiga.wsgi
Restart=always
RestartSec=3

[Install]
WantedBy=default.target
```

その後、以下の手順を行う

1. `sudo systemctl daemon-reload`でデーモンのリストを再読込する
2. `sudo systemctl start taiga.service`で起動する
3. `sudo systemctl enable taiga.service`で自動起動を有効にする

## フロントの設定をする

1. `sudo rm /etc/nginx/sites-enabled/default`でデフォルトのルート設定を削除する
2. `mkdir -p ~/logs`でログディレクトリを作成する
3. /etc/nginx/conf.d/taiga.confを以下の内容にした後、`sudo nginx -t`で設定チェックを行い、`sudo systemctl restart nginx.service`で再起動する

```
server {
    listen 80 default_server;
    server_name _;

    large_client_header_buffers 4 32k;
    client_max_body_size 50M;
    charset utf-8;

    access_log /home/taiga/logs/nginx.access.log;
    error_log /home/taiga/logs/nginx.error.log;

    # Frontend
    location / {
        root /home/taiga/taiga-front-dist/dist/;
        try_files $uri $uri/ /index.html;
    }

    # Backend
    location /api {
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Scheme $scheme;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_pass http://127.0.0.1:8001/api;
        proxy_redirect off;
    }

    # Django admin access (/admin/)
    location /admin {
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Scheme $scheme;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_pass http://127.0.0.1:8001$request_uri;
        proxy_redirect off;
    }

    # Static files
    location /static {
        alias /home/taiga/taiga-back/static;
    }

    # Media files
    location /media {
        alias /home/taiga/taiga-back/media;
    }

	# Taiga-events
	location /events {
	proxy_pass http://127.0.0.1:8888/events;
	proxy_http_version 1.1;
	proxy_set_header Upgrade $http_upgrade;
	proxy_set_header Connection "upgrade";
	proxy_connect_timeout 7d;
	proxy_send_timeout 7d;
	proxy_read_timeout 7d;
	}
}
```

## Let's Encryptの設定をする

1. `sudo apt-get install certbot`でLet's encryptのパッケージをインストールする
2. `sudo certbot certonly --webroot -w /home/taiga/taiga-front-dist/dist -d mydomain.tld`で証明書を取得する。その際、色々聞かれるが指示通りに答える
3. /etc/nginx/conf.d/taiga.confを以下の内容に書き換え、`sudo nginx -t`で設定チェックを行い、`sudo systemctl restart nginx.conf`でNginxを再起動する

```
server {
    listen 80 default_server;
    server_name _;
    return 301 https://$server_name$request_uri;
}

server {
    listen 443 default_server;
    server_name mydomain.tld;
    ssl on;
    ssl_certificate /etc/letsencrypt/live/mydomain.tld/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/mydomain.tld/privkey.pem;
    large_client_header_buffers 4 32k;
    client_max_body_size 50M;
    charset utf-8;

    access_log /home/taiga/logs/nginx.access.log;
    error_log /home/taiga/logs/nginx.error.log;

    # Frontend
    location / {
        root /home/taiga/taiga-front-dist/dist/;
        try_files $uri $uri/ /index.html;
    }

    # Backend
    location /api {
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Scheme $scheme;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_pass http://127.0.0.1:8001/api;
        proxy_redirect off;
    }

    # Django admin access (/admin/)
    location /admin {
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Scheme $scheme;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_pass http://127.0.0.1:8001$request_uri;
        proxy_redirect off;
    }

    # Static files
    location /static {
        alias /home/taiga/taiga-back/static;
    }

    # Media files
    location /media {
        alias /home/taiga/taiga-back/media;
    }

	# Taiga-events
	location /events {
	proxy_pass http://127.0.0.1:8888/events;
	proxy_http_version 1.1;
	proxy_set_header Upgrade $http_upgrade;
	proxy_set_header Connection "upgrade";
	proxy_connect_timeout 7d;
	proxy_send_timeout 7d;
	proxy_read_timeout 7d;
	}
}

```

## 現在の状況

1. ひとまず動いているようだ
2. 裏側の設定の詳細をすべて洗い出すのは難しい
3. ユーザ登録はどうやらプロジェクトオーナーがまだ登録が存在しないメールアドレスに招待状を送ってそれをAcceptすることで作れる模様
4. Githubとの連携は少し遅いようだ
5. Bitbucketとの連携はIPアドレスのホワイトリストを最新にしないと動かない
6. Slackとの連携は未検証
7. CPUクレジットは増えているので、t2.microで十分安定運転が可能そう
8. ディスクは3GB程度消費しているので、安定運転用にSwap確保するならディスクは念の為16GBあったほうが安心そう(安定運転想定しないなら8GBでも足りるかとは思う)
9. デフォルトでは管理者のアカウント名は`admin`、パスワードは`123123`、管理者メールアドレスは`admin@admin.com`だが、**アクセスしてログインしたら速やかに変更すること**。メールアドレスを変更する際にメールが飛ぶので、それでメールの試験もできる。