【格安サーバの利用】
0. WebARENA Indigo サービスの利用
  ※ WebARENA Indigoのサーバは後からスケールアップができないので、スケールアップが必要になる可能性がある場合は、ConoHa VPSやさくらのVPSなど、スケールアップに対応したサービスを利用してください。

  << DEMO環境の紹介 >>    
    (スペック）WebARENA Indigo
      CPU 1vCPU
      RAM 1GB
      SSD 20GB
      OS: Ubuntu 18.04
      WEB: Nginx 1.14.0
      RDB: PostgreSQL 10.14
      Vasyworks: DB/MGR/LIST
      ディスク使用量: 約2.7GB（DEMOデータ含む）
      
    (DEMO環境URL)
      VasyworksDB   http://vacancy.yworks.net:8080/admin/  （ログインユーザ情報非公開）
      VasyworksMGR  http://vacancy.yworks.net:8081/        （ログインユーザ情報公開）
      VasyworksLIST  http://vacancy.yworks.net/             （ログインユーザ情報公開）
    

1) WebARENA Indigo インスタンスの作成
    ・サイズの選択
        KVM Instance（月額350円）：最小構成の場合
            1vCPU
            1GB RAM
            20GB SSD
    ・イメージの選択
        Ubuntu 18.04
    
    ・SSH鍵の選択
        →SSH鍵の作成で任意の鍵名で新規SSH鍵を作成する。必ずダウンロードすること。
    
    ・リージョンの選択
        日本
    
    ・インスタンス名の入力
        Vasyworks-1vCPU-1GB-20GB など
    
    →インスタンスの作成


2) ファイアウォールの作成
    ネットワーク管理→ファイアウォール→ファイアウォールの作成
    ・名前
        Vasyworks-1vCPU-1GB-20GB など
    ・インバウンドルール（下記を新規追加）
        HTTP   IPアドレス 0.0.0.0
        HTTPS   IPアドレス 0.0.0.0
        Custom  TCP  8080 IPアドレス 0.0.0.0   ← IPアドレス指定を推奨
        Custom  TCP  8081 IPアドレス 0.0.0.0   ← IPアドレス指定を推奨
        Custom  TCP  22 IPアドレス 0.0.0.0   ← IPアドレス指定を推奨
        Custom  TCP  20 IPアドレス 0.0.0.0   ← IPアドレス指定を推奨
        Custom  TCP  21 IPアドレス 0.0.0.0   ← IPアドレス指定を推奨
        Custom  TCP  60001 IPアドレス 0.0.0.0   ← IPアドレス指定を推奨
        Custom  TCP  60002 IPアドレス 0.0.0.0   ← IPアドレス指定を推奨
    ・アウトバウンドルール（下記を新規追加）
        All TCP  IPアドレス 0.0.0.0
        All UDP  IPアドレス 0.0.0.0
    ・インスタンスへの適用
        Vasyworks-1vCPU-1GB-20GB など



1.SSH接続
1) 上記でダウンロードしたSSH鍵ファイルを任意のディレクトリに保存しておく。
2) インスタンス管理画面を開く
3) 対象のインスタンスの操作で「インスタンスの起動」を実行する。
4) SSH接続ツールやTerminalを使ってSSH接続する。
     ユーザID: ubuntu  秘密鍵：1)で保存したSSH鍵ファイル



2.初期インストール
0)準備
# sudo su -       rootユーザに変更
# apt update
# apt upgrade → メッセージが出た場合はデフォルトでOKする。
# apt install language-pack-ja
# apt install fonts-ipa*
# exit    （インストールを中断する場合）

1)Nginxのインストール
# sudo su -      rootユーザに変更（インストールを再開する場合）
# apt install nginx
# systemctl enable nginx.service    ←自動起動
# exit    （インストールを中断する場合）

2)Python3.7のインストール
# sudo su -      rootユーザに変更（インストールを再開する場合）
# apt install python3.7
# apt install python3-pip python3-dev python3-venv
# apt install gettext
# exit    （インストールを中断する場合）

3) FTPサーバのインストール
# sudo su -      rootユーザに変更（インストールを再開する場合）
# adduser web     ←ファイルアップロード用、パスワードは任意
# apt install vsftpd
# systemctl enable vsftpd.service   ←自動起動

# vi /etc/vsftpd.conf
-----
listen=YES        （変更）
#listen_ipv6=YES        （コメントアウトする）
write_enable=YES     （コメントを外す）
local_umask=022        （コメントを外す）
ascii_upload_enable=YES        （コメントを外す）
ascii_download_enable=YES        （コメントを外す）
chroot_local_user=YES        （コメントを外す）
ls_recurse_enable=YES        （コメントを外す）
seccomp_sandbox=NO        （追加）
allow_writeable_chroot=YES        （追加）
pasv_enable=YES        （追加）
pasv_min_port=60001        （追加）
pasv_max_port=60002        （追加）
-----

# service vsftpd restart
# exit    （インストールを中断する場合）
※ web ユーザでFTP接続を確認する。

4) PostgraSQLのインストールとデータベース作成
# sudo su -      rootユーザに変更（インストールを再開する場合）
# apt install postgresql-10
# passwd postgres    ←PostgreSQL用ユーザのパスワード設定、パスワードは任意
# exit
# su postgres     postgresユーザに変更
# createdb rent_db --encoding=UTF-8 --locale=ja_JP.UTF-8 --template=template0
# psql rent_db
-----
rent_db=# alter role postgres with password '任意のパスワード';
rent_db=# create role yworks with login;
rent_db=# alter role yworks superuser;
rent_db=# alter role yworks with password '任意のパスワード';
rent_db=# alter database rent_db owner to yworks;
rent_db=# set time zone 'Asia/Tokyo';

rent_db=# \q
-----
# exit
# sudo su -      rootユーザに変更
# vi /etc/postgresql/10/main/postgresql.conf
-----
listen_addresses = '*'         （変更）
autovacuum = on        （コメントを外す）
  ※ 以下、autovacuum関連の設定のコメントを外す。
timezone = 'Asia/Tokyo'         （変更）
-----

# vi /etc/postgresql/10/main/pg_hba.conf
-----
# IPv4 local connections:
host    all    all  127.0.0.1/32    password        （変更）
-----

# service postgresql restart
# exit



3.Vasyworks用のWEBサーバ設定
1)プロジェクト設定準備
# sudo su -      rootユーザに変更

# vi /etc/nginx/nginx.conf
------
client_max_body_size 20M;        （Basic Settingsに追加）
------
# service nginx restart
#exit

# su web     webユーザに変更
# cd ~
# mkdir html
# cd html
# mkdir vacancy_model
# mkdir vacancy_model/static
# mkdir vacancy_mgr
# mkdir vacancy_mgr/static
# mkdir vacancy
# mkdir vacancy/static

2)vacancy_modelのバックエンドサーバ設定
# cd ~/html/vacancy_model
# python3 -m venv venv
# source venv/bin/activate        ←venv環境に移行

※ 以下のライブラリは各プロジェクト共通
-----
(venv) pip3 install django==2.2.14
(venv) pip3 install pillow==6.2.2
(venv) pip3 install django-bootstrap4==2.1.1
(venv) pip3 install django-filter==2.2.0
(venv) pip3 install djangorestframework==3.10.3
(venv) pip3 install gunicorn==20.0.4
(venv) pip3 install psycopg2==2.7.7
(venv) pip3 install psycopg2-binary==2.7.7
(venv) pip3 install pycryptodome==3.9.4
(venv) pip3 install python-dateutil==2.8.1
(venv) pip3 install qrcode==6.1
-----

(venv) cd ~/html
(venv) django-admin startproject vacancy_model ./vacancy_model
(venv) cd vacancy_model

(venv) vi vacancy_model/settings.py
-----
ALLOWED_HOSTS = ['*']        （変更）
-----

(venv) which gunicorn     (gunicornのパスを確認)

(venv) python manage.py runserver 0.0.0.0:8080
↑ブラウザで表示確認、Ctrl+Cでプロセス停止

(venv) gunicorn vacancy_model.wsgi --bind=0.0.0.0:8080
↑ブラウザで表示確認、Ctrl+Cでプロセス停止

(venv) deactivate        ←venv環境終了

3)vacancy_mgrのバックエンドサーバ設定
# cd ~/html/vacancy_mgr
# python3 -m venv venv
# source venv/bin/activate        ←venv環境に移行

※ vacancy_modelと同じライブラリを組み込み
-----
(venv) pip3 install django==
・・・
-----

(venv) cd ~/html
(venv) django-admin startproject vacancy_mgr ./vacancy_mgr
(venv) cd vacancy_mgr

(venv) vi vacancy_mgr/settings.py
-----
ALLOWED_HOSTS = ['*']        （変更）
-----

(venv) which gunicorn     (gunicornのパスを確認)

(venv) python manage.py runserver 0.0.0.0:8080
↑ブラウザで表示確認、Ctrl+Cでプロセス停止

(venv) gunicorn vacancy_mgr.wsgi --bind=0.0.0.0:8080
↑ブラウザで表示確認、Ctrl+Cでプロセス停止

(venv) deactivate        ←venv環境終了

3)vacancyのバックエンドサーバ設定
# cd ~/html/vacancy
# python3 -m venv venv
# source venv/bin/activate        ←venv環境に移行

※ vacancy_modelと同じライブラリを組み込み
-----
(venv) pip3 install django==
・・・
-----

(venv) cd ~/html
(venv) django-admin startproject vacancy ./vacancy
(venv) cd vacancy_mgr

(venv) vi vacancy/settings.py
-----
ALLOWED_HOSTS = ['*']        （変更）
-----

(venv) which gunicorn     (gunicornのパスを確認)

(venv) python manage.py runserver 0.0.0.0:8080
↑ブラウザで表示確認、Ctrl+Cでプロセス停止

(venv) gunicorn vacancy.wsgi --bind=0.0.0.0:8080
↑ブラウザで表示確認、Ctrl+Cでプロセス停止

(venv) deactivate        ←venv環境終了

5) Nginx の設定
# exit
# sudo su -      rootユーザに変更

# cd /etc/systemd/system/
# vi gunicorn_vacancy_model.socket
-----
[Unit]
Description=gunicorn socket vacancy model

[Socket]
ListenStream=/run/gunicorn_vacancy_model/socket

[Install]
WantedBy=sockets.target
-----

# cp gunicorn_vacancy_model.socket gunicorn_vacancy_mgr.socket        ←コピーして修正
# cp guicorn_vacancy_model.socket gunicorn_vacancy.socket       ←コピーして修正

# vi gunicorn_vacancy_mgr.socket        ←異なる箇所だけ修正
-----
[Unit]
Description=gunicorn socket vacancy manager        （変更）

[Socket]
ListenStream=/run/gunicorn_vacancy_mgr/socket       （変更）

[Install]
WantedBy=sockets.target
-----

# vi gunicorn_vacancy.socket       ←異なる箇所だけ修正
-----
[Unit]
Description=gunicorn socket vacancy       （変更）

[Socket]
ListenStream=/run/gunicorn_vacancy/socket       （変更）

[Install]
WantedBy=sockets.target
-----

#vi gunicorn_vacancy_model.service
-----
[Unit]
Description=gunicorn daemon vacancy model
Requires=gunicorn_vacancy_model.socket
After=network.target

[Service]
PIDFile=/run/gunicorn_vacancy_model/pid
User=web
Group=web
RuntimeDirectory=gunicorn_vacancy_model
WorkingDirectory=/home/web/html/vacancy_model
ExecStart=/home/web/html/vacancy_model/venv/bin/gunicorn -w 3 -b 0.0.0.0:8000 vacancy_model.wsgi
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s TERM $MAINPID
PrivateTmp=true

[Install]
WantedBy=multi-user.target
-----

# cp gunicorn_vacancy_model.service gunicorn_vacancy_mgr.service        ←コピーして修正
# cp guicorn_vacancy_model.service gunicorn_vacancy.service       ←コピーして修正

# vi gunicorn_vacancy_mgr.service        ←異なる箇所だけ修正
-----
[Unit]
Description=gunicorn daemon vacancy manager       （変更）
Requires=gunicorn_vacancy_mgr.socket       （変更）
After=network.target

[Service]
PIDFile=/run/gunicorn_vacancy_mgr/pid       （変更）
User=web
Group=web
RuntimeDirectory=gunicorn_vacancy_mgr       （変更）
WorkingDirectory=/home/web/html/vacancy_mgr      （変更）
ExecStart=/home/web/html/vacancy_mgr/venv/bin/gunicorn -w 3 -b 0.0.0.0:8001 vacancy_mgr.wsgi       （変更）
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s TERM $MAINPID
PrivateTmp=true

[Install]
WantedBy=multi-user.target
-----

# vi gunicorn_vacancy.service        ←異なる箇所だけ修正
-----
[Unit]
Description=gunicorn daemon vacancy       （変更）
Requires=gunicorn_vacancy.socket       （変更）
After=network.target

[Service]
PIDFile=/run/gunicorn_vacancy/pid      （変更）
User=web
Group=web
RuntimeDirectory=gunicorn_vacancy       （変更）
WorkingDirectory=/home/web/html/vacancy      （変更）
ExecStart=/home/web/html/vacancy/venv/bin/gunicorn -w 3 -b 0.0.0.0:8002 vacancy.wsgi       （変更）
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s TERM $MAINPID
PrivateTmp=true

[Install]
WantedBy=multi-user.target
-----

# cd /etc/nginx/conf.d
# vi vacancy_model.conf
-----
server {
    listen  8080; 
    server_name     vacancy.yworks.net;        ←空室情報用のURLまたはIPアドレス（例：vacancy.yworks.net）
    
    location /static {
        alias /home/web/html/vacancy_model/static;
    }
    
    location /robots.txt {
        alias /home/web/html/vacancy_model/robots.txt;
    }
    
    location / {
        proxy_pass http://unix:/run/gunicorn_vacancy_model/socket;
        proxy_set_header Host $http_host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}
-----

# cp vacancy_model.conf vacancy_mgr.conf        ←コピーして修正
# cp vacancy_model.conf vacancy.conf        ←コピーして修正

# vi vacancy_mgr.conf
-----
server {
    listen  8081;         （変更）
    server_name     vacancy.yworks.net;        ←空室情報用のURLまたはIPアドレス
    
    location /static {
        alias /home/web/html/vacancy_mgr/static;         （変更）
    }
    
    location /media{                                                      （追加）
        alias /home/web/html/vacancy_mgr/media; 
    }
    
    location /robots.txt {
        alias /home/web/html/vacancy_mgr/robots.txt;         （変更）
    }
    
    location / {
        proxy_pass http://unix:/run/gunicorn_vacancy_mgr/socket;         （変更）
        proxy_set_header Host $http_host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}
-----

# vi vacancy.conf
-----
server {
    listen  80;         （変更）
    server_name     vacancy.yworks.net;        ←空室情報用のURLまたはIPアドレス
    
    location /static {
        alias /home/web/html/vacancy/static;         （変更）
    }
    
    location /robots.txt {
        alias /home/web/html/vacancy/robots.txt;         （変更）
    }
    
    location / {
        proxy_pass http://unix:/run/gunicorn_vacancy/socket;         （変更）
        proxy_set_header Host $http_host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}
-----

# systemctl daemon-reload
# systemctl enable gunicorn_vacancy_model.service
# systemctl enable gunicorn_vacancy_mgr.service
# systemctl enable gunicorn_vacancy.service

# nginx -t        Nginx設定のテスト

# service gunicorn_vacancy_model stop
# service gunicorn_vacancy_model start
# service gunicorn_vacancy_mgr stop
# service gunicorn_vacancy_mgr start
# service gunicorn_vacancy stop
# service gunicorn_vacancy start
# service nginx restart

※ gunicorn系のserviceコマンドはrestartでうまく動かない場合があります。

→ブラウザで表示を確認


********** 参考 **********
gunicorn
        -w 3   ←ワーカープロセス（2〜4で設定）
        -b 0.0.0.0:8000    ←ポート番号8000でバインド、各プロジェクトでポートを分ける。


********** 参考 **********
Nginxがうまく動かない時の調査用コマンド    
        cat /var/log/nginx/error.log
        systemctl status gunicorn
        file /run/gunicorn/socket



4. VasyworksDB（データベース構築プロジェクト）のデプロイ
1) web ユーザでサーバにFTP接続する。
2) web ユーザのホームディレクトリの/html/vacacancy_model/ を開く
3) db.sqllite3 ファイルがあれば削除する。
4) vacancy_model プロジェクトの下記をコピーする。
  ※ vacancy_model ディレクトリのsettings.pyのSECRET_KEYはファイルコピーの前に保管しておく。
  ・vacancy_model ディレクトリのsettings.pyとurls.py
  ・rent_db ディレクトリの全て
  ・static ディレクトリのadmin ディレクトリの全て
5) vacancy_model プロジェクトのvacancy_model ディレクトリのsettings.pyを修正する。
  ・SECRET_KEY='保管しておいたSECRET_KEY'
  ・DEBUG=False
  ・データベースの設定
        HOSTは127.0.0.1
        PASSWORDは設定済みのyworksのパスワード
6) web ユーザのホームディレクトリにinitial_dataディレクトリを全てコピーする。
7) サーバにSSH接続する。
8) rent_dbを構築する。
    # sudo su web → ユーザをwebに変更
    # cd ~/html/vacancy_model
    # source venv/bin/activate
    (venv) python manage.py migrate
    (venv) python manage.py createsuperuser
       ユーザ名: root
       メールアドレス: 任意のメールアドレス
       Password: 任意のパスワード
    (venv) deactivate
    # psql -h 127.0.0.1 -U yworks -d rent_db
    rent_db=# \cd /home/web/initial_data/sql/import
    rent_db=# \i import_enum_data.sql
    ※ 京都市商圏用の場合は、import_kyoto_data.sql と improt_sample_data.sql も実行する。
    rent_db=# \q
    # exit
9) プロジェクトを再起動する。
   # sudo su -
   # serive gunicorn_vacancy_model stop
   # service gunicorn_vacancy_model start
   # service nginx restart
10) ブラウザで管理サイトを表示する。
     例: http://vacancy.yworks.net:8080/admin
11) rootユーザでログインし、ユーザーのテーブルに会社の管理者ユーザを登録する。
     例：
     ユーザ名: Administrator
     パスワード: 任意のパスワード
     → 保存して編集を続ける。
      姓: 任意の会社名
      名: システム管理者
      メールアドレス: 任意のメールアドレス
      パーミッション： 有効・is_company・is_company_admin にチェック
      → 保存
12) その他、管理サイト用のユーザ等が必要な場合は登録する。
13) 管理サイトを利用して、各種マスタのレコードを登録する。
14) SSH接続をexitする。



5. VasyworksMGR（空室情報データ管理プロジェクト）のデプロイ
1) web ユーザでサーバにFTP接続する。
2) web ユーザのホームディレクトリの/html/vacacancy_mgr/ を開く
3) db.sqllite3 ファイルがあれば削除する。
4) vacancy_mgr プロジェクトの下記をコピーする。
  ※ vacancy_mgr ディレクトリのsettings.pyのSECRET_KEYはファイルコピーの前に保管しておく。
  ・vacancy_mgrディレクトリのsettings.pyとurls.py
  ・ api ディレクトリの全て
  ・ common ディレクトリの全て
  ・ company ディレクトリの全て
  ・ documents ディレクトリの全て
  ・ enums ディレクトリの全て
  ・ infoディレクトリの全て
  ・ libディレクトリの全て
  ・ masters ディレクトリの全て
  ・ menu ディレクトリの全て
  ・ owner ディレクトリの全て
  ・ property ディレクトリの全て
  ・ search ディレクトリの全て
  ・ trader ディレクトリの全て
  ・ users ディレクトリの全て
  ・ vacancy_item ディレクトリの全て
  ・ static ディレクトリの全て
  ・ templates ディレクトリの全て
5) vacancy_mgr プロジェクトのvacancy_mgr ディレクトリのsettings.pyを修正する。
  ・SECRET_KEY='保管しておいたSECRET_KEY'
  ・DEBUG=False
  ・データベースの設定
        HOSTは127.0.0.1
        PASSWORDは設定済みのyworksのパスワード
6) 画像データ等の保存用ディレクトリ（media）を作成する。
  ・FTP接続で web ユーザのホームディレクトリにvacancy_data ディレクトリを作成する。
  ・vacancy_data ディレクトリの下に media ディレクトリを作成する。
7) media ディレクトリのシンボリックリンクを作成する。
   # sudo su web 
   # cd ~/html/vacancy_mgr
   # ln -s /home/web/vacancy_data/media media
   # exit
8) プロジェクトを再起動する。
   # sudo su -
   # serive gunicorn_vacancy_mgr stop
   # service gunicorn_vacancy_mgr start
   # service nginx restart
9) ブラウザで管理サイトを表示する。
     例: http://vacancy.yworks.net:8081/
10) 会社の管理者ユーザ（Administrator）でログインし、会社情報の登録を行う。
11) 「システム管理」の「システムユーザ」を実行し、管理部署の実務者ユーザを作成する。
13) 「システム管理」の「空室情報ユーザ」を実行し、空室情報の閲覧ユーザを作成する。
13) その他、マスタ登録等を必要に応じて行う。



6. VasyworksLIST（空室情報一覧プロジェクト）のデプロイ
1) web ユーザでサーバにFTP接続する。
2) web ユーザのホームディレクトリの/html/vacacancy/ を開く
3) db.sqllite3 ファイルがあれば削除する。
4) vacancy プロジェクトの下記をコピーする。
  ※ vacancy ディレクトリのsettings.pyのSECRET_KEYはファイルコピーの前に保管しておく。
  ・vacancy ディレクトリのsettings.pyとurls.py
  ・api ディレクトリの全て
  ・building ディレクトリの全て
  ・documents ディレクトリの全て
  ・garage ディレクトリの全て
  ・libディレクトリの全て
  ・menu ディレクトリの全て
  ・movie ディレクトリの全て
  ・panorama ディレクトリの全て
  ・rent_db ディレクトリの全て
  ・room ディレクトリの全て
  ・users ディレクトリの全て
  ・ static ディレクトリの全て
  ・ templates ディレクトリの全て
5) vacancy プロジェクトのvacancy ディレクトリのsettings.pyを修正する。
  ・SECRET_KEY='保管しておいたSECRET_KEY'
  ・DEBUG=False
  ・データベースの設定
        HOSTは127.0.0.1
        PASSWORDは設定済みのyworksのパスワード
6) media ディレクトリのシンボリックリンクを作成する。
   # sudo su web 
   # cd ~/html/vacancy
   # ln -s /home/web/vacancy_data/media media
   # exit
7) プロジェクトを再起動する。
   # sudo su -
   # serive gunicorn_vacancy stop
   # service gunicorn_vacancy start
   # service nginx restart
8) ブラウザで管理サイトを表示する。
     例: http://vacancy.yworks.net/
9) 空室情報の閲覧ユーザでログインし、表示を確認する。



