作記録

記憶代わり

ConohaでVPSをレンタルしてからアプリケーションをデプロイするまで

使用する技術等

名称 verstion 用途
Ubuntu 20.04.2LTS VPSのOS
Nginx - リバースプロキシ
Spring Boot - アプリケーション

大きな流れ

  1. firewallを設定する
  2. OSのユーザーを作成する
  3. Javaをインストールする
  4. Spring Boot Applicationをデプロイする
  5. Nginxを導入する
  6. Nginxの設定をする
  7. DNSの設定をする
  8. SSL証明書の設定をする

以下、はUbunts OSの利用を想定している。

1. firewallを設定する

先に ssh(port:22)を許可しておくと良い。(先にfirewallを設定してログアウトすると、sshで接続出来なくなるから。)

ubuntu.com

2. OSのユーザーを作成する

2-1. ユーザーの作成

参考

2-2. ユーザーをsudoグループに追加

追加
$ sudo adduser **** sudo

sshログイン後に上記コマンドを実行する。
**** には上記で作成したユーザー名を入力する。

確認
$ less /ets/group

確認するには、/etc/group ファイルを確認する。
sshログイン後に上記コマンドを実行すると表示出来る。

表示されたファイルの内容に下記のような形式で作成したユーザーが記述されていれば良い。

sudo:x:27:****
etc/group ファイルについて
グループ名:パスワード:グループID:所属ユーザー
  • グループ名とは、グループの名称である。
  • パスワードとは、そのグループのパスワードである。x で隠されている。
  • グループIDとは、グループを識別するための番号である。
  • 所属ユーザーとは、そのグループに所属しているユーザーである。
参考

2-3. 作成したユーザーのSSHクライアント公開鍵認証が成功するように設定する

公開鍵のコピペ

ConohaでVPSを作成する際に、公開鍵は /root/.ssh/authorized_keysファイルとして自動で作成され 、秘密鍵は一度だけダウンロード出来る。
よって、下記のようにSSHクライアントの公開鍵認証のために /root/.ssh/authorized_keys ファイルを /****/.ssh/authorized_keys ファイルとしてコピーする
**** は2-1で作成した新規のユーザー名

$ cp /root/.ssh/authorized_keys /home/****/.ssh
.sshとauthorized_key の所有者の変更

.ssh ディレクトリと authorized_keys ファイルの所有者がrootのままだと下記のエラーが発生する。
**** はユーザー名、!!!IPアドレスの値。

****@!!!.!!!.!!!!.!!!: Permission denied (publickey).

よって、下記のコマンドで.sshディレクトリとauthorized_keysファイルの 所有者を新規ユーザーにする。 ****はユーザー名。

$ chown -R **** /home/****/.ssh
ssh接続テスト

下記のコマンドでssh接続出来れば完了。
####秘密鍵のパス、 **** はユーザー名、!!!IPアドレスの値。

ssh -i #### ****@!!!.!!!.!!!!.!!!
備考

今まで、新たなユーザーのために秘密鍵と公開鍵を作っていたが公開鍵は複数あって問題ない鍵なので作り直さない方法が上記である。
鍵を作り直す方法で、 ssh-copy-id が permission denied(publickey) となり出来ない場合は下記を参考にする。 - 一時的に /etc/ssh/sshd_config の PasswordAuthentication を yes にして Password入力で認証することで ssh-copy-id をやる - ssh-copy-id を使わずに手動でリモートサーバーに公開鍵(/home/***/.ssh/authorized_keys)としてコピペする。

参考

3. Java をインストールする

3-1. パッケージの更新

下記のコマンドでaptで管理しているUbuntuリポジトリのパッケージリストを更新する。

$ sudo apt update

3-2. パッケージリストの表示

下記のコマンドでaptでインストール出来るJDKパッケージのリストを表示する。

$ sudo apt search jdk

3-3. パッケージのインストール

上記3-2のコマンドで確認したJDKパッケージを、下記のコマンドでインストールする。
**はversion。

# **はversion
$ sudo apt install openjdk-**-jdk

4. Spring Boot Applicationをデプロイする

4-1. VPSにデプロイ先を作成

上記2-1で作成したユーザーとしてsshログインした後に、 /varディレクトリ配下に任意の名前のディレクトリを作成する。
その後、作成したディレクトリの所有者をsshログインしているユーザーに変更する。

# /var に移動
$ cd /var

# ディレクトリを作成する。+++ はディレクトリの名前
$ sudo mkdir +++

# ディレクトリの所有者を変更する。***はsshログインしているユーザーの名前
$ sudo chown *** +++

4-2. アプリケーションプロジェクトのディレクトリにbatchファイルを作成

アプリケーションのプロジェクトディレクトリに、/document/infrastructureを作成する。

$ cd ~アプリケーションのプロジェクトディレクトリのパス~

$ mkdir /document/infrastructure 

document/infrastructure配下に、sftpコマンドに読み込ませる為の batch_deploy_fileファイルを作成する。
ファイルの内容は下記の通り。
+++は、アプリケーションjarの名前。

put -r ../../build/libs/+++.jar /var/zenryaku

4-3. document/infrastructure/ 配下に deploy.sh ファイルを作成

document/infrastructure配下に、上記4-2で作成したbatchファイルを読み込むスクリプトファイルを作成する。
ファイルの内容は下記の通り。
+++は、秘密鍵の名称。
***は、ユーザーの名称。
!!!は、IPアドレス

echo '>>> Start Build Spring Application'
cd ../ || exit
cd ../ || exit
./gradlew -i bootjar
echo '<<< Complete Build Spring Application'

echo 'back /document/infrastructure'
cd ./document/infrastructure || exit

echo '>>> Start Deploy Spring Application'
sftp -b batch_deploy_file.sh -o StrictHostKeyChecking=no -i +++.pem ***@!!!.!!!.!!!.!!!
echo '<<< End Deploy Spring Application'

exit 0

4-4. デプロイテストをする

上記4-3で作成したdocument/infrastructure/deploy.shを実行する。
VPSsshログインして、/var/*** 配下にアプリケーションがデプロイされていればテスト成功。

4-5. Spring Boot Applicationをsystemdに登録

/etc/systemd/systemディレクトリ配下に +++.serviceファイルを作成する。 +++は、アプリケーションの名称である。
内容は下記の通り。
+++は、アプリケーションの名称。
***は、アプリケーションの実行者 = 上記2-1で作成したユーザー名。
hogeは、アプリケーションのjarファイルの名称。

[Unit]
Description=+++
After=syslog.target

[Service]
User=***
ExecStart=java -jar /var/+++/hoge.jar
SuccessExitStatus=143

[Install]
WantedBy=multi-user.target

参考

4-6. systemdのファイルの所有権を変更

上記4-5で作成した ``+++.service ファイルの所有権を、上記2-1で作成したユーザーに変更する。
コマンドは下記の通り。
+++は、アプリケーションの名前。
***は、ユーザーの名前。

$ sudo chown *** +++.service

4-7. Spring Boot Applicationを起動

下記のコマンドでSpring Boot Applicationを起動する。
+++は、systemdに記述したアプリケーション名。

$ systemctl start +++

5. Nginxをインストールする

Nginxのインストールは、下記の公式ドキュメントを参考にする。
http://nginx.org/en/linux_packages.html

6. Nginxの設定

Nginxの設定は、 /etc/nginx ディレクトリ配下で行う。

6-1. ルーティング

http://localhost:80/ のリクエストをSpring Boot Application にルーティングする。
下記のコマンドで nginx.conf ファイルを修正する。

$ sudo vi nginx.conf

上記の ***.conf ファイルを読み込むようにnginx.conf ファイルの内容は下記の通りに修正する。
修正箇所は、一番下の includ ディレクトリの箇所。
は、上記の ***.conf ファイルの

user  nginx;
worker_processes  auto;

error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    server {
        listen       80;
        server_name  localhost;

        location / {
            proxy_pass http://localhost:8080/;
        }
    }
}

6-2. sendfile を off にしてCSSの変更が即時反映されるようにする。

sendfile off;

6-3. Nginxを起動

下記のコマンドでNginxを起動する。

$ sudo nginx

下記のコマンドでNginxを再起動する。
参考

$ sudo nginx -s reload

7. DNSの設定をする

7-1. CloudFlareでドメインを購入する

7-2. CloudFlareのDNSでAレコードに名前とIP Address追加する

名前に @ を使うと、現状の名前を使える。

8. SSL対応を行う

8.1 SSL証明書の発行

下記のURLからCerbotを利用してSSL証明書を発行してNginxに設定する

https://certbot.eff.org/

この記事では、Nginx と Ubuntu を利用しているので、上記のURLのNginx on Ubuntu20 にセレクトボックスを合わせるとdocumentが表示されるので、それに従う。

8.2 nginx.conf を修正する

下記のdocumentの A single HTTP/HTTPS server に合わせると良い。 nginx.org

8.3 備考

下記の理由から、SSL対応に手こずった。