keephq/keepをNginxを前に置いてdocker composeで起動する

アラート管理にkeepを使いたかったので環境構築しました。

https://www.keephq.dev/

手元ではEKSで構築していてそちらはうまくいったのですが、docker compose版を起動しようとして、ドキュメントにある定義ファイルを見るとFront/Backend/Websocketでそれぞれのポートが必要でした。

```yaml
services:
  keep-frontend:
    extends:
      file: docker-compose.common.yml
      service: keep-frontend-common
    image: us-central1-docker.pkg.dev/keephq/keep/keep-ui
    environment:
      - AUTH_TYPE=NO_AUTH
      - API_URL=http://keep-backend:8080
    volumes:
      - ./state:/state
    depends_on:
      - keep-backend

  keep-backend:
    extends:
      file: docker-compose.common.yml
      service: keep-backend-common
    image: us-central1-docker.pkg.dev/keephq/keep/keep-api
    environment:
      - AUTH_TYPE=NO_AUTH
    volumes:
      - ./state:/state

  keep-websocket-server:
    extends:
      file: docker-compose.common.yml
      service: keep-websocket-server-common
```

以下のkeepのK8s版のようにパスを分けて、Nginxを前に置く構成を取ってExposeするポートを一つにしてみました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116068/fc6382a7-5f65-6031-28e6-02a6fdc4d396.png)


[こちらの元のDockerの記事](https://docs.keephq.dev/deployment/docker)と同じように、sqliteのデータを保存するstateディレクトリを作成していおきます。

```sh
mkdir -p state
chown -R 999:999 state
```








Nginxの設定ファイルは以下のようにしています。（最小限構成です）

```nginx.conf
server {
        server_name _ ;

        http2 on;

        listen 80;
        listen [::]:80;

        # Websocket
        location /websocket/ {
            proxy_http_version 1.1;
            proxy_set_header Upgrade upgrade;
            proxy_set_header Connection upgrade;

            rewrite ^/websocket(/|$)(.*) /$2 break;
            proxy_pass http://keep-websocket-server:6001;
        }

        # Backend
        location /backend/ {
            rewrite ^/backend(/|$)(.*) /$2 break;
            proxy_pass http://keep-backend:8080;
        }

        # Frontend
        location / {
            proxy_pass http://keep-frontend:3000;
        }
}
```

後はNginxの設定どおり、以下のような構成でdocker-compose定義を書き換えます。

起動することでNginxの `3000` ポートにアクセス可能です。


```docker-compose.yaml
services:
  keep-frontend:
    image: us-central1-docker.pkg.dev/keephq/keep/keep-ui
    environment:
      - NEXTAUTH_SECRET=secret
      - PUSHER_HOST=/websocket
      - PUSHER_APP_KEY=keepappkey
      - AUTH_TYPE=NO_AUTH
    volumes:
      - ./state:/state
    depends_on:
      - keep-backend

  keep-backend:
    image: us-central1-docker.pkg.dev/keephq/keep/keep-api
    environment:
      - PORT=8080
      - SECRET_MANAGER_TYPE=FILE
      - SECRET_MANAGER_DIRECTORY=/state
      - DATABASE_CONNECTION_STRING=sqlite:////state/db.sqlite3?check_same_thread=False
      - PUSHER_APP_ID=1
      - PUSHER_APP_KEY=keepappkey
      - PUSHER_APP_SECRET=keepappsecret
      - PUSHER_HOST=keep-websocket-server
      - PUSHER_PORT=6001
      - USE_NGROK=false
      - AUTH_TYPE=NO_AUTH
    volumes:
      - ./state:/state

  keep-websocket-server:
    image: quay.io/soketi/soketi:1.4-16-debian
    environment:
      - SOKETI_USER_AUTHENTICATION_TIMEOUT=3000
      - SOKETI_DEFAULT_APP_ID=1
      - SOKETI_DEFAULT_APP_KEY=keepappkey
      - SOKETI_DEFAULT_APP_SECRET=keepappsecret

  keep-nginx:
      image: nginx:alpine
      ports:
        - "3000:80"
      depends_on:
        - keep-frontend
        - keep-backend
        - keep-websocket-server
      volumes:
        - ./nginx.conf:/etc/nginx/conf.d/default.conf:ro
```


最小限の構成にしているので必要に応じて以下などを参考に調整して使ってください。

特にbackendに以下のように `KEEP_API_URL` を指定するとWebhoook利用できるようになります。※ ホスト名は適当に変更してください。

```
KEEP_API_URL=http://localhost:3000/backend
```

## 参考資料

https://docs.keephq.dev/deployment/kubernetes/architecture

https://docs.keephq.dev/deployment/configuration