DebianでpostgreSQLを使ったspringbootを動かす

## 目標
Windowsで作ったspringbootプロジェクトをDebian上で動かしたい。

## 基本情報
- **Java バージョン**：17  
- **Spring Boot バージョン**：3.3.6  
- **PostgreSQL バージョン**：17.2  
- **Debian バージョン**：12.8
**バージョンはこれに合わせて設定します。他のバージョンを使いたい場合はそれに合わせて適宜変更しながら行ってください**

## 手順の概要
1. サーバーに **Java** と **PostgreSQL** をインストールする。  
2. **Spring Boot** アプリケーションの `jar` ファイルを配置する。  
3. ローカル環境のデータベースを **dumpファイル** を使って移行する。  
4. 実行する


## Javaのインストール

まずは、サーバーに **Java** をインストールします。  
以下のコマンドを実行してください：

```bash
apt update
apt install openjdk-17-jdk
```
Yes,NOを聞かれたらyと答えてください。

## postgreSQLのインストール

次にpostgreSQLをインストールします。

### 公開鍵の取得

まずはPostgreSQLのリポジトリから取得するための公開鍵を取得します。
wget等をインストールして公開鍵を取得します。
以下のコマンドを実行してください

```bash
apt install wget
apt install gnupg
wget -qO - https://www.postgresql.org/media/keys/ACCC4CF8.asc | gpg --dearmor -o /usr/share/keyrings/postgresql-keyring.gpg
```

### PostgreSQLのリポジトリをシステムに追加

次はシステムにPostgreSQLのリポジトリを追加していきます。
以下のコマンドを実行してください

```bash
echo "deb [signed-by=/usr/share/keyrings/postgresql-keyring.gpg] http://apt.postgresql.org/pub/repos/apt/ bookworm-pgdg main" > /etc/apt/sources.list.d/postgresql.list
```

その後更新します。

```bash
apt update
```

### PostgreSQLをインストール

最後にPostgreSQLをインストールします。
以下のコマンドを実行してください：

```bash
apt install postgresql-17
```

以上で、postgeSQLのインストール完了です。

**これでできない場合**
 - Debianのバージョンを確認してください。Debian12に対応する方法（追加しているPostgreSQLのリポジトリがDebian12用）なのでほかのバージョンだと、実行できないかもしれません。

## jarファイルの配置
jarとは、javaのプロジェクトを一つのファイルにまとめて実行できるものです。
springbootのjarファイルを作成し、FTPソフトなどを使ってDebian上に配置します。
今回は、Debian上にhome/user/javaのディレクトリを作成しそこに配置します。

### jarファイルの作成
JavaプロジェクトをVScode上で作成しかつMavenを使っているので、VScode上でターミナルを開き以下のコマンドを実行します。

```bash
./mvnw package
```
これで、targetディレクトリの直下に作成されます。
jarファイルの作成方法はいろいろありますが、これでできない人は調べてください。

参考までに、
- [SpringBootで実行可能JARを作る | SpringHack](https://springhack.com/springboot%E3%81%A7%E5%AE%9F%E8%A1%8C%E5%8F%AF%E8%83%BDjar%E3%82%92%E4%BD%9C%E3%82%8B/)
- [SpringBootのJARファイル作成 | Skill-for-IT](https://skill-for-it.com/jar_create/)
- [Spring Bootアプリケーションのビルドとデプロイ方法 | Kohei Life](https://kohei.life/spring-boot-build-deploy/)

その後FTPソフト等でファイルを配置してください、FTPの使い方は説明省略します。

## DBの作成
ローカルのDBの内容をそのままDebian上にコピーする手順です。

### postgreSQLの設定
まず、postgresユーザーにパスワードを設定します。
設定ファイルをテキストエディタで開いて設定を変更します。
今回はvimを使います
以下のコマンドで設定ファイルを開けます。

```bash
vim /etc/postgresql/17/main/pg_hba.conf
```
以下の行を見つけたら、**peerをtrustに変換**します。

```bash
local   all             postgres                                peer
```

その後再起動します。
```bash
service postgresql restart
```

今の作業で、postgres内にパスワードなしで接続することができます。
以下のコマンドでpostgresに接続します。

```bash
psql -U postgres
```
そして以下のコマンドを実行し、接続のためのパスワードを設定します。
なお、今回はパスワードに'postgres'としましたが、各自パスワードを設定してください。

```sql
ALTER USER postgres PASSWORD 'postgres';
```

パスワードを設定後、接続を解除し（\qを入力し接続解除）、先ほどと同じ方法で再度設定ファイルを開きます。
そして、先ほど変更した以下の行をもう一度変更し、**trustをmd5に変換**します。

```bash
local   all             postgres                                trust
```

最後に、先ほどと同じ方法で再起動します。
今の設定で、postgresに設定したパスワードをもとに接続できます。

### DBの作成

ローカルのDBのバックアップを作成します。

```bash
pg_dump -U postgres -d DBname -F c -b -v -f　"C:\path\to\backup\dumpname.dump"
```

-dにコピーしたいDB名を入力し、dumpファイル作成先のパスとdumpファイル名は各自で決めてください。
dumpファイルを作成したら、それをFTPソフト等を使ってDebian上に配置します。今回は先ほど作成したhome/user/javaに配置しようと思います。別にどこ置いたっていいです。

配置完了後、一度postgreSQLに接続し、バックアップしたDBと同じ名前のDBを作成します。
```bash
psql -U postgres　
CREATE DATABASE DBname;
```
DB作成後、接続を解除し、以下のコマンドを実行しDBをコピーします。
DB名dumpファイル名は各自設定したものにしてください。
```bash
pg_restore -U postgres -d DBname -v /home/user/java/dumpname.dump
```
これで、DBがコピーされました。

## 実行
以下のコマンドを実行しjarファイルを実行します
実行時に、jarファイルの配置している階層に移動するか、パスを指定するかして実行してください。
実行時には、自分のjarファイル名を指定してください。
```bash
java -jar jarname.jar
```
これで完了です。