Oracle無料ティアでDjango+Nginx+uWSGIでサーバを立ててみる

Oracle Cloudで常時無料サービスが開始されたので使ってみた。
構成は、Django+nginx+uWSGI+Oracle Database+Oracle Linux

以下の3つの環境を作ってみたので、その時の備忘録。

- ローカルの開発環境
- ローカルでDockerを使った開発環境
- コンピュート・インスタンスでの本番環境

とりあえず、Djangoの雛形アプリにアクセスできるまでの簡易なので、
SSL対応などは省いてます。

### Oracle Cloudの常時無料サービス(無料ティア)について

新しく常時無料で利用できるようになったサービスたち。
・[Oracle Cloud無償ティア | オラクル | Oracle 日本](https://www.oracle.com/jp/cloud/free/)

利用できるのは、以下のようなもの。

- データベース ... 20GBを2つまで
- コンピュート ... 仮想マシン。1/8 OCPU・1GBを2つまで
- ストレージ ... 合計100GBの2つのブロック・ボリューム。10GBのオブジェクト・ストレージ

ほかにもロードバランサや監視・通知などある。

仮想マシンもデータベースも1アカウントにつき2つまでなので、
1サービスであれば、ステージング環境と本番環境を用意できそう。

---

### とりあえずDBを作ってみる

トップ画面から。

<img width="1367" alt="oracle_1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478782/dde42040-2f99-5a2a-4824-5894bd4ce59d.png">

名前とAdminのパスワードを設定する。
Always FreeもONにしておく。

![oracle_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478782/ce050658-f517-7338-ef93-cd0d07893e16.png)

「Autonomous Databaseの作成」をクリックすると、プロビジョンがはじまる。
プロビジョンが終わるとこんな感じに。

<img width="1436" alt="スクリーンショット 2019-11-10 15.59.16.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478782/0df9b110-5004-76cd-f942-10780d1c1e39.png">


##### WebブラウザでDBにアクセスしてみる

SQL Developer Webからアクセスできる。

「DB接続」>「アプリケーション接続」>「SQL Developer Web」にある。
「アクセスURL」をコピーして、ブラウザに貼り付け。

<img width="742" alt="oracle_3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478782/8795616a-9ab4-87a2-cc78-460e9680f30d.png">

ログイン画面が表示されるので、DBを作ったときのパスワードを入力。
アカウントは「admin」

<img width="490" alt="スクリーンショット 2019-11-10 16.00.58.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478782/003a489d-23f3-3f50-4cff-a49f674fe002.png">

ログインできるとこんな感じ

<img width="843" alt="スクリーンショット 2019-11-10 16.01.15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478782/485c6462-de41-ad35-6829-33292cce2129.png">

---

### ローカルの開発環境を作ってみる

とりあえず、開発用にローカル環境で`python manage.py runserver`できるようにする。
ローカルの環境はmacOS Mojave(10.14.6)

#### まずは、Djangoの雛形を作成する

```shell
# pythonのバージョンは3.7.3
$ python3 -V
Python 3.7.3

# ディレクトリの作成
$ mkdir sample
$ cd sample/

# 仮想環境の作成
$ python3 -m venv venv
$ source venv/bin/activate

# djangoのインストール
$ pip install --upgrade pip
$ pip install django

# djangoプロジェクトの作成
$ django-admin startproject myproject
$ cd myproject
$ python manage.py migrate

# 起動
$ python manage.py runserver
```

これでとりあえず、デフォルトのデータベース(SQLite)で立ち上がるとこまで完成。

<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478782/e2a487cd-a318-d09c-e9f3-899f598eee09.png" />


#### ローカルでOracleDBを使えるようにする

##### Oracle Instant Clientのインストール
OracleDBを使うためには、Oracle Instant Clientが必要なので、
以下からダウンロードしてインストールする。
・[Oracle Instant Client Downloads](https://www.oracle.com/database/technologies/instant-client/downloads.html)

Macだったので、「[Instant Client for macOS (Intel x86)](https://www.oracle.com/database/technologies/instant-client/macos-intel-x86-downloads.html)」の「Basic Light Package」を選択

```sh
## インストールするディレクトリを作成
$ sudo mkdir -p /opt/oracle

## インストールしたファイルを展開
$ sudo unzip ~/Downloads/instantclient-basiclite-macos.x64-19.3.0.0.0dbru.zip -d /opt/oracle

## ライブラリを参照できるように${HOME}/libにリンクを追加
$ mkdir ~/lib
$ ls -s /opt/oracle/instantclient_19_3/libclntsh.dylib ~/lib/
$ cp /opt/oracle/instantclient_19_3/lib* ~/lib/
```

##### 環境変数にインストールした場所を設定

```shell
echo "export ORACLE_HOME=/opt/oracle/instantclient_19_3" >> ~/.bashrc
source ~/.bashrc
```

##### 認証情報の配置

Oracle Cloudの「Autonomous Database」>「Autonomous Databaseの詳細」にある
「DB接続」からウォレットをダウンロードしてくる。

<img width="753" alt="oracle_4.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478782/6b23b62d-623d-2fad-ea3b-a95c11d4d605.png">

ファイル名は「`Wallet_<データベース名>.zip`」。
今回はデータベース名が`sample`なので、`Wallet_sample.zip`となる。

```shell
## 認証ファイルを配置するディレクトリを作成
$ mkdir -p /opt/oracle/instantclient_19_3/network/admin

## ダウンロードしたウォレットを展開して配置
$ sudo unzip ~/Downloads/Wallet_sample.zip -d ${ORACLE_HOME}/network/admin
Archive:  ~/Downloads/Wallet_sample.zip
  inflating: /opt/oracle/instantclient_19_3/network/admin/cwallet.sso  
  inflating: /opt/oracle/instantclient_19_3/network/admin/tnsnames.ora  
  inflating: /opt/oracle/instantclient_19_3/network/admin/truststore.jks  
  inflating: /opt/oracle/instantclient_19_3/network/admin/ojdbc.properties  
  inflating: /opt/oracle/instantclient_19_3/network/admin/sqlnet.ora  
  inflating: /opt/oracle/instantclient_19_3/network/admin/ewallet.p12  
  inflating: /opt/oracle/instantclient_19_3/network/admin/keystore.jks
```


##### cx_Oracle(pythonライブラリ)のインストール

Oracle Databaseのpythonライブラリをインストールする

```
$ pip install cx_Oracle
```

##### settings.pyの設定

settings.pyをOracleように変更。
`NAME`には、TNS名のどれかを指定する。

<img width="753" alt="oracle_4.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478782/6b23b62d-623d-2fad-ea3b-a95c11d4d605.png">

今回は一番上の`sample_HIGH`を選択。

```python
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.oracle',
        'NAME': 'sample_HIGH',
        'USER': 'admin',
        'PASSWORD': '<DB作成時に入力したパスワード>',
    }
}
```

マイグレーションをもう一度実行してみて、接続できるか確認。

```shell
$ python manage.py migrate
```

マイグレーションが成功すると、Webブラウザ上のSQL Developerでも確認できる。

<img width="926" alt="スクリーンショット 2019-11-10 16.35.58.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478782/53393a83-0772-2f8e-9814-6d2ddbe203bd.png">

これで、とりあえず、開発できるようになった(*´ω｀*)

---

### ローカルでDockerを使った開発環境を作ってみる

実際にデプロイする際は、NginxとuWSGIを利用するので、
それを試せる環境をDockerで構築する。

#### Django側の変更

nginx+uWSGIで動かすために、いくつか変更。

##### 1. STATIC_ROOTとALLOWED_HOSTS設定

settings.pyを以下の感じに変更。
ログファイルも出るように変更。

```diff
-ALLOWED_HOSTS = []
+ALLOWED_HOSTS = ["127.0.0.1"]

 ...

 STATIC_URL = '/static/'
+STATIC_ROOT = os.path.join(BASE_DIR, "static/")

+# for logging
+LOGGING = {
+    'version': 1,
+    'disable_existing_loggers': False,
+
+    'formatters': {
+        'standard': {
+            'format': "[%(asctime)s] %(levelname)s [%(name)s:%(lineno)s] %(message)s",
+            'datefmt': "%d/%b/%Y %H:%M:%S"
+        },
+    },
+    'handlers': {
+        'file': {
+            'level': 'INFO',
+            'class': 'logging.handlers.RotatingFileHandler',
+            'filename': 'django.log',
+            'maxBytes': 50000,
+            'backupCount': 2,
+            'formatter': 'standard',
+        },
+    },
+    'loggers': {
+        'django': {
+            'handlers': ['file'],
+            'level': 'DEBUG',
+            'propagate': True,
+        },
+    },
+}

```

##### 2. staticディレクトリを作成&配置

manage.pyと同じ場所に作成し、
django-adminのcssとかを配置

```shell
$ mkdir static

$ python manage.py collectstatic
```

#### Docker用の資材を配置

```shell
# Docker用の資材の配置場所を作成
$ mkdir docker

# 資格情報の配置
$ mkdir docker/wallet
$ unzip ~/Downloads/Wallet_sample.zip -d docker/wallet/
Archive:  ~/Downloads/Wallet_sample.zip
  inflating: wallet/cwallet.sso      
  inflating: wallet/tnsnames.ora     
  inflating: wallet/truststore.jks   
  inflating: wallet/ojdbc.properties  
  inflating: wallet/sqlnet.ora       
  inflating: wallet/ewallet.p12      
  inflating: wallet/keystore.jks     

# NginxやuWSGIの設定ファイルは以下に配置
$ mkdir docker/conf
$ touch docker/conf/requirements.txt
$ touch docker/conf/myproject_nginx.conf
$ touch docker/conf/myproject_uwsgi.ini
$ touch docker/conf/uwsgi.service

# Dockerfireとdocker-compose.ymlを配置
$ touch docker/Dockerfile
$ touch docker-compose.yml
```

ディレクトリ的にはこんな感じ。

```
.
├── docker/
│   ├── conf/
│   │   ├── myproject_nginx.conf
│   │   ├── myproject_uwsgi.ini
│   │   └── uwsgi.service
│   ├── wallet
│   │   ├── ...
│   │   └── tnsnames.ora
│   ├── Dockerfile
│   └── requirements.txt
├── myproject/
│   ├── myproject/
│   │   ├── settings.py
│   │   └── wsgi.py
│   ├── static/
│   └── manage.py
├── venv/
└── docker-compose.yml
```

各ファイルの中身は以下の感じ。

##### docker-compose.yml

```yml
version: '2'

services:
  web:
    build: "./docker"
    volumes: # djangoアプリを/var/www配下にマウント
      - ./myproject:/var/www/myproject
    ports: # 80および8000ポートを開けておく
      - "80:80"
      - "8000:8000"
    # systemctlを使うので特権を有効にしておく
    privileged: true
    command: /sbin/init
```

##### docker/Dockerfile

```dockerfile
# Oracle Cloud Infrastructureでも
# OracleLinuxを使うのでoraclelinuxのイメージを使う
FROM oraclelinux:7

### ENV
ENV ORACLE_HOME "/usr/lib/oracle/18.3"


### INSTALL ORACLE DATABASE
# oracle-instantclientを利用するために、2つリポジトリを有効化
RUN yum install -y oracle-release-el7 oracle-softwarecollection-release-el7
RUN yum install -y oracle-instantclient18.3-basiclite
RUN echo /usr/lib/oracle/18.3/client64/lib > /etc/ld.so.conf.d/oracle-instantclient.conf

RUN mkdir -p ${ORACLE_HOME}/network/admin
COPY wallet/* ${ORACLE_HOME}/network/admin/


### INSTALL PYTHON
# python3-develを利用するために、ol7_optional_latestを有効化
RUN yum-config-manager --enable ol7_optional_latest
RUN yum install -y python3 python3-devel gcc


### CREATE VIRTUAL ENV
RUN mkdir /var/www/
RUN mkdir /var/www/myproject

WORKDIR /var/www/

RUN python3 -m venv venv

# 作成した仮想環境(venv)にactivateする
ENV PATH="/var/www/venv/bin:$PATH"
COPY requirements.txt /var/www/
RUN pip install -r requirements.txt

#### INSTALL NGINX
RUN yum install -y nginx

COPY conf/myproject_nginx.conf /etc/nginx/conf.d/ 
RUN systemctl enable nginx

RUN chown -R nginx.nginx /var/www
RUN chmod 755 /var/www

### SETUP uWSGI Emperor mode
RUN mkdir /etc/uwsgi
RUN mkdir /etc/uwsgi/vassals
COPY conf/myproject_uwsgi.ini /etc/uwsgi/vassals

# uWSGIのログディレクトリを作成
RUN mkdir /var/log/uwsgi
RUN chown -R nginx:nginx /var/log/uwsgi

# uWSGIをサービスに登録
COPY conf/uwsgi.service /etc/systemd/system/
RUN systemctl enable uwsgi
```


##### docker/conf/requirements.txt

```txt
Django==2.2.7
cx-Oracle==7.2.3
uWSGI==2.0.18
```

##### docker/conf/myproject_nginx.conf

```nginx
# the upstream component nginx needs to connect to
upstream django {
    # myproject_uwsgi.iniで設定したsocketファイルを指定
    # unix://<socketファイルのパス>
    server unix:///var/www/myproject.sock;
}

# configuration of the server
server {
    listen      80;
    # IPアドレスを指定。ローカルなので、127.0.0.1を設定
    server_name 127.0.0.1;
    charset     utf-8;

    # Django static
    location /static {
        alias /var/www/myproject/static;
    }

    # Finally, send all non-media requests to the Django server.
    location / {
        include     uwsgi_params;
        uwsgi_pass  django;
    }
}
```

##### docker/conf/myproject_uwsgi.ini

```ini
[uwsgi]

# Djangoプロジェクトのパスを指定
chdir           = /var/www/myproject
# Djangoプロジェクトのwsgi.pyを指定
module          = myproject.wsgi
# venvのパスを指定
home            = /var/www/venv
# process-related settings: master
master          = true
# maximum number of worker processes
processes       = 10
# socketファイルののパス
socket          = /var/www/myproject.sock
# socketファイルのユーザと権限を設定
chown-socket    = nginx:nginx
chmod-socket    = 666
# clear environment on exit
vacuum          = true
# logfile
logto           = /var/log/uwsgi/%n.log
```

##### docker/conf/uwsgi.service

```
[Unit]
Description=uWSGI Emperor
After=syslog.target

[Service]
User=nginx
Group=nginx

# 環境変数の設定
Environment="ORACLE_HOME=/usr/lib/oracle/18.3"
Environment="LD_LIBRARY_PAT=${ORACLE_HOME}/client64/lib:$LD_LIBRARY_PATH"
Environment="PATH=$PATH:${ORACLE_HOME}/client64/lib"

# EmperorモードでuWSGIを実行。venvにあるuwsgiを使う
ExecStart=/var/www/venv/bin/uwsgi --master --emperor /etc/uwsgi/vassals --die-on-term --uid nginx --gid nginx --logto /var/log/uwsgi/emperor.log
Restart=always
KillSignal=SIGQUIT
Type=notify
StandardError=syslog
NotifyAccess=all

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

#### Dockerを起動

```shell
# dockerを立ち上げ
$ docker-compose up -d
```

これでうまくビルドされて立ち上がれば、
`http://127.0.0.1`にアクセスできる。

`myproject_nginx.conf`の`server_name`で、`127.0.0.1`を指定しているので、
`http://127.0.0.1`じゃないとDjangoアプリにアクセスできないので注意。

`http://localhost`だと、`myproject_nginx.conf`の設定が適用されず、
nginxのデフォルトページが表示される。

##### よく使うログインとか停止とかはこんな感じ。

```shell
# コンテナにログイン
$ docker-compose exec web /bin/bash

# 停止
$ docker-compose stop

# 削除
$ docker-compose rm

# Dockerfile ビルド
$ docker-compose build

# Dockerfile ビルド(キャッシュなし)
$ docker-compose build --no-cache

# コンテナをせんぶ削除
$ docker rm `docker ps -a -q`
```

##### うまくいかないときにみるところ

以下の場所にログファイルが出力されるので見てみる。

- `/var/log/messages` ... systemdのログ
- `/var/log/nginx/error.log` ... nginxのエラーログ
- `/var/log/uwsgi/emperor.log` ... uWSGI Emperorのログ
- `/var/log/uwsgi/myproject_uwsgi.log` ... myproject_uwsgi.iniのログ
- `/var/www/myproject/django.log` ... Djangoプロジェクトのログ

あとは、「パスが正しいか」「権限、オーナーが正しいか」などを見てみるといいかも。

---

### コンピュート・インスタンスで公開してみる

#### 仮想インスタンスの作成

ここから選択。

<img width="1367" alt="oracle_5.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478782/58f5c6f6-a84b-435e-eadf-96a795fe8ba8.png">

こんな感じで入力。
「**パブリックIPアドレスの割当**」を選択しておく。

![oracle_6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478782/71e54b71-dad2-9b33-3120-73ef26aae734.png)

ちゃんと「パブリックIPアドレスの割当」を選択していると、
ここにIPアドレスが表示される

![oracle_7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478782/2a714a85-2389-506d-4a8c-9197fb9ca208.png)

デフォルトのユーザは`opc`なので、
こんな感じで、sshでログインできる。

```shell
$ ssh opc@<IPアドレス>
```

#### セキュリティルールを設定

HTTP(ポート80)でアクセスできるようにセキュリティルールを設定する
ただ、セキュリティルールを設定する場所は少しわかりにくい。。

仮想インスタンスの詳細にアクセスして、
「仮想クラウド・ネットワーク」を選択

![oracle_8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478782/8c83e806-cb22-481f-a7c4-1903c7766685.png)


左下に「ネットワーク・セキュリティ・グループ」を選択。
「ネットワーク・セキュリティ・グループの作成」を選択すると、追加できるようになる。

![oracle_9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478782/107254d4-5c9f-155d-5fb2-f9ba13c9d621.png)

「名前」と「コンパートメント」に作成を設定

![oracle_10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478782/4464efc9-a245-3858-707c-811f12a166d9.png)

ルールの追加を以下のように設定して、「作成」をクリック

<img width="1404" alt="oracle_11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478782/f604553d-7ea4-925d-944b-2410bd920e91.png">

これで作成できたので、仮想インスタンスの詳細にもどって、
「ネットワーク・セキュリティ・グループ」の「編集」を選択

![oracle_12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478782/8c96405c-539f-9197-40b0-782c30b85079.png)

さっき作ったセキュリティグループを設定

<img width="783" alt="スクリーンショット 2019-11-11 0.19.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478782/12823048-83d2-1278-68a6-dcd45dace136.png">

#### 環境構築

Dockerfileでやったような感じで、
Django+nginx+uWSGIな環境を構築してく。

DockerイメージのOracleLinuxとは違い、

1. リポジトリが最初から有効化されている
2. SELinuxが有効化されている

という感じなので、ちょっと変更が必要。

##### 資材を仮想インスタンスに送る

Dockerのときに使った資材を仮想インスタンスに送る。

```shell
$ scp -r docker opc@<IPアドレス>:~/
$ scp -r myproject/ opc@<IPアドレス>:~/
```

送信したら、ログインして確認。

```shell
$ ssh opc@<IPアドレス>

$ pwd
/home/opc

$ ls 
docker  myproject
```

ログイン後のディレクトリ構成はこんな感じ

```
/home/opc
├── docker/
│   ├── conf/
│   │   ├── myproject_nginx.conf
│   │   ├── myproject_uwsgi.ini
│   │   └── uwsgi.service
│   ├── wallet
│   │   ├── ...
│   │   └── tnsnames.ora
│   ├── Dockerfile
│   └── requirements.txt
├── myproject/
│   ├── myproject/
│   │   ├── settings.py
│   │   └── wsgi.py
│   ├── static/
│   └── manage.py
├── venv/
└── docker-compose.yml
```

##### 設定ファイルの変更

IPアドレスと`127.0.0.1`にしていたので変更する。

###### ~/docker/conf/myproject_nginx.conf

```diff
  server {
-     server_name 127.0.0.1;
+     server_name <IPアドレス>;
  }
```


###### ~/myproject/myproject/settings.py

```diff
-ALLOWED_HOSTS = ["127.0.0.1"]
+ALLOWED_HOSTS = ["<IPアドレス>"]
```

##### 環境構築の実施

```shell
$ sudo -s

### INSTALL ORACLE DATABASE
$ yum install -y oracle-instantclient18.3-basiclite
$ echo /usr/lib/oracle/18.3/client64/lib > /etc/ld.so.conf.d/oracle-instantclient.conf

$ mkdir -p /usr/lib/oracle/18.3/network/admin
$ /home/opc/docker/wallet/* /usr/lib/oracle/18.3/network/admin/


### INSTALL PYTHON
$ yum install -y python3 python3-devel gcc


### CREATE VIRTUAL ENV
$ mkdir /var/www/
$ cp -r /home/opc/myproject /var/www

$ cd /var/www/

$ python3 -m venv venv

# 作成した仮想環境(venv)にactivateする
$ source venv/bin/activate
$ pip install -r /home/opc/docker/requirements.txt

#### INSTALL NGINX
$ yum install -y nginx

$ cp /home/opc/docker/conf/myproject_nginx.conf /etc/nginx/conf.d/ 
$ systemctl enable nginx

$ chown -R nginx.nginx /var/www
# $ chmod 755 /var/www

### SETUP uWSGI Emperor mode
$ mkdir -p /etc/uwsgi/vassals
$ cp /home/opc/docker/conf/myproject_uwsgi.ini /etc/uwsgi/vassals

# uWSGIのログディレクトリを作成
$ mkdir /var/log/uwsgi
$ chown -R nginx:nginx /var/log/uwsgi

# uWSGIをサービスに登録
$ cp /home/opc/docker/conf/uwsgi.service /etc/systemd/system/
$ systemctl enable uwsgi

##### ここから仮想インスタンス独自の設定

### Firewallの設定
# httpを追加する
$ firewall-cmd --permanent --add-service=http
# firewallを再起動して変更を反映
$ systemctl restart firewalld.service

### SELinuxの設定
$ restorecon -RF /var/www

### サービスの起動
$ systemctl restart nginx
$ systemctl restart uwsgi
```

一度、`http://<IPアドレス>`にアクセスして確認してみる。
エラーページが出ていたら、以下を実行

```shell
# 監査ログを確認
$ cat /var/log/audit/audit.log | grep nginx | audit2allow -m nginx
# ポリシーファイルを作成
$ cat /var/log/audit/audit.log | audit2allow -M nginx
# ポリシーファイルを適用
$ semodule -i nginx.pp
```

これで、`http://<IPアドレス>`にアクセスして、
Djangoの画面が表示されて、django-adminの画面が操作できればOK

# おわりに

とりあえず、ローカルとインスタンス上の環境が作れたので、
色々することはできそう(*´ω｀*)

SSL対応、権限周りなど、本番としては足りないところがあるので、
そのあたりは他の記事を参照ください〜ヽ(=´▽`=)ﾉ


## こんなのつくってます!!

積読用の読書管理アプリ 『積読ハウマッチ』をリリースしました！
[積読ハウマッチ](https://tsundoku.site)は、Nuxt.js+Firebaseで開発してます!

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478782/572d4947-f40b-e4dc-1c9c-bc584cd2a66c.png" width="200"/>

もしよかったら、遊んでみてくださいヽ(=´▽`=)ﾉ

要望・感想・アドバイスなどあれば、
公式アカウント([@MemoryLoverz](https://twitter.com/MemoryLoverz))や開発者([@kira_puka](https://twitter.com/kira_puka))まで♪

# 参考にしたサイトさま
- [データベース | Django ドキュメント | Django](https://docs.djangoproject.com/ja/2.2/ref/databases/#oracle-notes)
- [cx_Oracle - Python Interface for Oracle Database](https://oracle.github.io/python-cx_Oracle/)
- [cx_Oracle 7 Installation — cx_Oracle 7.3.0-dev documentation](https://cx-oracle.readthedocs.io/en/latest/user_guide/installation.html)
- [Instant Client for macOS (Intel x86)](https://www.oracle.com/database/technologies/instant-client/macos-intel-x86-downloads.html#ic_osx_inst)
- [ODPI-C Installation — ODPI-C v3.2.2](https://oracle.github.io/odpi/doc/installation.html#macos)
- [Macでsqlplus使えるようにするメモ - ビットの海](https://shase428.hatenablog.jp/entry/2018/01/31/201543)
- [trouble running Oracle_cx on macOS · Issue #56 · oracle/python-cx_Oracle](https://github.com/oracle/python-cx_Oracle/issues/56)
- [SSHを使用したOracle Linuxインスタンスへのアクセス](https://docs.oracle.com/cd/E83857_01/iaas/compute-iaas-cloud/stcsg/accessing-oracle-linux-instance-using-ssh.html#GUID-D313B1A1-FB67-42C7-A7CC-958656A5207F)
- [コンピュート・インスタンスに予約済パブリックIPを付与する - Cloudii blog](https://cloudii.atomitech.jp/entry/20190417/1555464532)
- [SELinux を使おう．使ってくれ． - Qiita](https://qiita.com/chi9rin/items/af532d0dd9237cc65741#selinux-%E3%81%AE%E5%8B%95%E4%BD%9C%E3%83%A2%E3%83%BC%E3%83%89)
- [arch linux - How to set environment variable in systemd service? - Server Fault](https://serverfault.com/questions/413397/how-to-set-environment-variable-in-systemd-service)
- [EC2にnginx+uwsgi+python でHello World - Qiita](https://qiita.com/cof123/items/6c9d4b01f0057a9a8de0)
- [uwsgiのsystemd化(pyenv環境) - Qiita](https://qiita.com/takahirono7/items/fd6f9239f0f88eb65a7c)
- [ちゃんと運用するときのuWSGI設定メモ - Qiita](https://qiita.com/yasunori/items/64606e63b36b396cf695#%E3%83%AD%E3%82%B0%E3%83%AD%E3%83%BC%E3%83%86%E3%83%BC%E3%83%88%E3%81%A7%E3%83%AD%E3%82%B0%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E8%A6%8B%E5%A4%B1%E3%82%8F%E3%81%AA%E3%81%84)
- [Nginx に uWSGI + Django アプリ を組み込む | SaintSouth.NET](https://www.saintsouth.net/blog/setup-django-app-with-uwsgi-and-nginx/#toc-9)
- [Ubuntu 12.04でpyenvを利用して速攻でPython3.4 + Nginx + uWSGI + FlaskなWebアプリケーション実行環境を作る - Qiita](https://qiita.com/5t111111/items/e170fead91261621b054#uwsgi-emperor)
- [nginxでDjangoを使うときの設定ファイル：クライアント、nginx、uwsgiの流れを整理しよう - MathPython](https://www.mathpython.com/ja/django-nginx-conf/)
- [Setting up Django and your web server with uWSGI and nginx — uWSGI 2.0 documentation](https://uwsgi-docs.readthedocs.io/en/latest/tutorials/Django_and_nginx.html)
- [Elegantly activating a virtualenv in a Dockerfile](https://pythonspeed.com/articles/activate-virtualenv-dockerfile/)
- [firewall-cmdコマンドの使い方 - Qiita](https://qiita.com/hana_shin/items/bd9ba363ba06882e1fab)
- [Oracle Cloud で Compute にWebサーバーを立てたメモ - Qiita](https://qiita.com/yakumo/items/8ac195337414aabd39c0)
- [venv: Python 仮想環境管理 - Qiita](https://qiita.com/fiftystorm36/items/b2fd47cf32c7694adc2e)
- [SELinux + Nginx ポリシー設定 - URAGAMI](http://blog.higty.xyz/archives/242/)
- [[CentOS7][Nginx] SELinuxを設定しホームディレクトリ配下のWebコンテンツを公開を許可 | from umentu import stupid](https://www.blog.umentu.work/centos7nginx-selinux%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%97%E3%83%9B%E3%83%BC%E3%83%A0%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%E9%85%8D%E4%B8%8B%E3%81%AEweb%E3%82%B3%E3%83%B3%E3%83%86/)
- [Dockerイメージとコンテナの削除方法 - Qiita](https://qiita.com/tifa2chan/items/e9aa408244687a63a0ae#%E5%81%9C%E6%AD%A2%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B%E3%82%B3%E3%83%B3%E3%83%86%E3%83%8A%E3%81%AE%E7%A2%BA%E8%AA%8D)
- [いまさらDockerに入門したので分かりやすくまとめます - Qiita](https://qiita.com/gold-kou/items/44860fbda1a34a001fc1#rm)
- [Dockerネットワーク設定 - Qiita](https://qiita.com/okhrn/items/d8580e66546d166f489a)
- [Docker Compose - docker-compose.yml リファレンス - Qiita](https://qiita.com/zembutsu/items/9e9d80e05e36e882caaa)
- [Dockerイメージとコンテナの削除方法 - Qiita](https://qiita.com/tifa2chan/items/e9aa408244687a63a0ae)
- [Docker Compose で複数コンテナ構築＆管理 - Qiita](https://qiita.com/prgseek/items/e557a371d7bd1f57b9b1#-docker-composeyml)