ConohaでVPSをレンタルしてからアプリケーションをデプロイするまで
使用する技術等
名称 | verstion | 用途 |
---|---|---|
Ubuntu | 20.04.2LTS | VPSのOS |
Nginx | - | リバースプロキシ |
Spring Boot | - | アプリケーション |
大きな流れ
- firewallを設定する
- OSのユーザーを作成する
- Javaをインストールする
- Spring Boot Applicationをデプロイする
- Nginxを導入する
- Nginxの設定をする
- DNSの設定をする
- SSL証明書の設定をする
以下、はUbunts OSの利用を想定している。
1. firewallを設定する
先に ssh(port:22)を許可しておくと良い。(先にfirewallを設定してログアウトすると、sshで接続出来なくなるから。)
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とは、グループを識別するための番号である。
- 所属ユーザーとは、そのグループに所属しているユーザーである。
参考
- https://jtnsaku.hatenablog.com/entry/2022/08/04/003016
- https://ubuntu.com/server/docs/security-users
- https://eng-entrance.com/linux-group
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)としてコピペする。
参考
- 公開鍵と秘密鍵については、コチラの記事を参照。
- https://ubuntu.com/server/docs/service-openssh
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
を実行する。
VPSにsshログインして、/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に設定する
この記事では、Nginx と Ubuntu を利用しているので、上記のURLのNginx on Ubuntu20 にセレクトボックスを合わせるとdocumentが表示されるので、それに従う。
8.2 nginx.conf を修正する
下記のdocumentの A single HTTP/HTTPS server に合わせると良い。 nginx.org
8.3 備考
下記の理由から、SSL対応に手こずった。