Golang on さくらVPS

[株式会社アクシス](https://mediaxis.jp/)のアドベントカレンダー5日目担当のヤマウチです！
さくらVPSを契約して遊んでみたので、それを記事にしました！

ということでさっそく本題。

---

先日作成した記事「[【Go】標準入力から受け取ったポケモンの種族値を返すツールを作成](https://qiita.com/yamauchi_kkk/items/9705ea3aaec86a0a8945)」のAPI部分をさくらVPSに乗せました。

いつでもどこからでもAPIを叩きたい衝動に駆られて、VPS契約しました。
固定IP最高＼(^o^)／
まあ、一番安いプランですが。

ということで、今回はさくらVPSにOSをインストールした直後から、GoのAPIを叩ける状態にする、という部分の記事です。

## 前提条件

- centos8
- rootユーザーにSSH接続ができる
- xxx.xxx.xxx.xxx はIPアドレスを意味する
- wsl2

さて、始めます。


## ユーザー作成

VPSにSSH接続を行い、`keisuke`という一般ユーザーを作成する。

```bash
# ユーザー作成
$ adduser keisuke

# パスワード設定
$ passwd keisuke
```

### sudo権限を付与

作成したユーザーにsudo権限を付与する。

```bash
$ visudo
```

以下の2行のコメントアウトを外す。

- %wheel  ALL=(ALL)       ALL
- %wheel        ALL=(ALL)       NOPASSWD: ALL

ユーザーをwheelグループに追加する。

```bash
$ usermod -aG wheel keisuke
```

wheelに追加されたか確認する。

```bash
# 作成したユーザーにログイン
$ su keisuke

# 所属しているグループを確認
$ groups
# wheelと表示されればOK
```

もしwheelと表示されない場合は、ターミナルを再起動して、再度`groups`を実行。


## ユーザーでSSH接続

続いて作成したユーザーでSSH接続できるようにする。
（必要あるかわかんないけど）一般ユーザーに切り替える。

```bash
$ su keisuke
```

### .sshを作成

ユーザーを作成したばかりで.sshディレクトリが存在しないので、作成する。

```bash
# ホームディレクトリに移動
$ cd ~

# .sshを作成
$ mkdir .ssh

# パーミッションを700に変更
$ chmod 700 .ssh
```

SSHするためには.sshディレクトリのパーミッションを700にする必要がある。

### 公開鍵を登録する

一旦`exit`でSSH接続から抜け、`scp`を使って公開鍵をVPSにコピーする。
※事前に各自、公開鍵を置いているディレクトリに移動

```bash
$ scp id_rsa.pub xxx.xxx.xxx.xxx:~/.ssh
```

`scp`で公開鍵をコピーしたらSSH接続をする。

```bash
# 作成したkeisukeでSSH接続
$ ssh keisuke@xxx.xxx.xxx.xxx

# .sshに移動
$ cd .ssh

# id_rsa.pubがあるか確認
$ ls

# 公開鍵を登録
$ cat id_rsa.pub >> authorized_keys

# パーミッションを変更
$ chmod 600 authorized_keys
```

公開鍵の登録が完了したら、一度exitでSSHから抜け、再度SSH接続をする。
その際にパスワードを求められなければ、公開鍵でのSSH接続が成功している。

## SSH接続の設定を変更する

設定ファイルをいじるので、rootユーザーでログインする。

```bash
$ su -
```

### SSH接続のパスワード認証を禁止

`/etc/ssh/sshd_config`を編集する。

```bash
#PasswordAuthentication yes
↓
PasswordAuthentication no
```

### rootユーザーでのSSH接続を禁止

引き続き`/etc/ssh/sshd_config`を編集する。

```bash
PermitRootLogin yes
↓
PermitRootLogin no
```

### sshdを再起動

設定ファイルを反映させるため、sshdを再起動する。

```bash
$ systemctl restart sshd
```

## GoのバイナリファイルをSCP

ここまでで基本的な設定は完了したので、次にGoのバイナリファイルをさくらVPSに置く。
まずはローカルのプロジェクト配下に移動する。

```bash
$ cd project
```

### バイナリファイルを作成

まずは`go build`を行い、バイナリファイルを作成する。
普通に`go build`をすると自分の開発環境にあったバイナリファイルが作成されるため、実行環境に合わせたバイナリファイルを生成する必要がある。
今回の僕のパターンだと、windows端末で開発をして、実行する環境はさくらVPSのCentOSなので、CentOSで動くバイナリファイルを生成する。
とはいえ、WSL2を使用しているので今回は気にしなくて良さげ。

一応現状を確認

```bash
$ go env GOOS
# linux

$ go env GOARCH
# amd64
```

うむ、そのままbuildする。

```bash
$ go build main.go

# mainというファイルが生成されていることを確認する
$ ls
```

### scpでファイルをサーバーにコピー

どこに置くのが正解かわかってないので、とりあえず今回はユーザーのディレクトリにコピーする。

```bash
# vpsはssh_configで設定している
$ scp main vps:~

# これも必要なのでscp
$ scp pokedex.json vps:~
```

## バイナリファイルを実行する

ファイルのコピーが完了したので、実行する。
まずはSSH接続。

```bash
$ ssh vps
```

`main`がコピーされていることを確認する。

```bash
$ ls
```

確認ができたら`main`を実行する。

```bash
$ ./main&
```

実行状態をlsofコマンドで確認する。
今回のアプリがLISTENしているのは18888なので、そのポートを確認する。
※lsofのインストール手順等は省略

```bash
# ポート18888をLISTENしていることを確認する
$ lsof -i:18888

# こんな表示が出る
COMMAND   PID    USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
main    22373 keisuke    3u  IPv6 135702      0t0  TCP *:apc-necmp (LISTEN)
```

問題なさそう。
ということで`xxx.xxx.xxx.xxx:18888`にアクセスしてみる。







**このサイトにアクセスできません**








![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281895/975d253d-da8e-a8c0-a08e-c44de9b06126.png)


ここがハマりポイント。

今回書いてはいないがfirewallの設定もしており、そこに原因があると思って一生懸命調べていたが、
原因はさくらVPSのパケットフィルタの設定だった。。。

ということでさくらVPSのコンソールへGO！
パケットフィルタの設定を追加する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281895/36b96f61-ea2e-7940-f517-e958079b926a.png)
これ↑をこう↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281895/d48e54bd-8ae4-4e93-6eb7-a2923d446f24.png)

これで再度APIを叩いてみる。
`xxx.xxx.xxx.xxx:18888`にアクセス。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281895/2a968c89-6fed-8a86-c65e-4f8a0d837852.png)

よし、返ってきてる。

## まとめ

ということで無事さくらVPSにGoのバイナリファイルを置いて、APIを叩くことができました。
バイナリファイルを置くだけでAPIを叩けるってのがすごい。
nginxとか、webサーバーがなくてもいいってのが、その辺の知識が弱いせいで「マジかよ」ってなってます。

firewallの設定を間違ったせいでSSH接続が一切できなくなるというのも経験しました。。。ｗ
それを自分のVPSで経験できただけでも、良かったかなぁって感じです。
github actionsを使用して、自動デプロイもできるようにしたので、気が向けば記事にしますｗ

おしまい。