Skip to content

Commit

Permalink
Merge pull request #193 from v-ut-d/optimize-dockerfile
Browse files Browse the repository at this point in the history
Optimize Dockerfile
  • Loading branch information
cm-ayf committed Jul 30, 2022
2 parents 645ce87 + 284d19c commit e4a4dbb
Show file tree
Hide file tree
Showing 5 changed files with 90 additions and 63 deletions.
98 changes: 56 additions & 42 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,13 @@
## Setup

### commit/pushさえできればいい人

1. このリポジトリをクローンします(`main`ブランチにいることを確認してください)。
2. クローン先のディレクトリで`npm i --ignore-script`を実行し、パッケージ類をインストールします。
3. `npx prisma generate`も実行します。これによりデータベース関係の型が生成されます。

### 自分のPCで動かしたい人(VSCode DevContainerを使う)

VSCode DevContainerを用いると面倒な環境構築をスキップすることができます(Node.jsすらインストールする必要がありません)。詳細は[VSCodeのドキュメント](https://code.visualstudio.com/docs/remote/containers)を参照してください。
事前にVSCodeとDockerを入れておいてください。

Expand All @@ -25,25 +27,30 @@ Windowsを使っている場合、Hyper-Vを有効にするとDockerが効率的
8. `PUBLIC BOT``OFF`にします(別にしなくてもいいですがPUBLICにする必要はないので…)
9. `TOKEN`をコピーします。
10. `.env` というファイルをプロジェクトの最上部に作成し、トークンを次のように`.env`に追記します。
```
BOT_TOKEN=トークン
```

```text
BOT_TOKEN=トークン
```

11. `OAuth2`->`URL Generator`を開き、 `SCOPES`では`bot``applications.commands``BOT PERMISSIONS`では`Send Messages``Send Messages in Threads``Embed Links``Connect``Speak`にチェックを入れ、一番下の`GENERATED URL`をコピーします。
12. ブラウザのアドレスバーに`GENERATED URL`を貼り付けて開きます(その後は普通にテストに使うDiscordサーバーにボットを追加してください)。
13. 次にデータベースをセットアップします。`npx prisma migrate deploy`を実行してください。
14. 音声データをセットアップします。[tohoku-f01](https://github.com/icn-lab/htsvoice-tohoku-f01)を使う場合、voiceフォルダを次のように作成します。
```
/voice
└ tohoku-f01
├ tohoku-f01-angry.htsvoice
├ tohoku-f01-happy.htsvoice
├ tohoku-f01-neutral.htsvoice
└ tohoku-f01-sad.htsvoice
```
15. ここまでの作業が終われば、`npm run dev:watch`でボットを実行できるはずです。お疲れさまでした。

```text
/voice
└ tohoku-f01
├ tohoku-f01-angry.htsvoice
├ tohoku-f01-happy.htsvoice
├ tohoku-f01-neutral.htsvoice
└ tohoku-f01-sad.htsvoice
```

15. 辞書をセットアップします。`npm run compile-dict`を実行してください。
16. ここまでの作業が終われば、`npm run dev:watch`でボットを実行できるはずです。お疲れさまでした。

### 自分のPCで動かしたい人(VSCode DevContainerを使わない)

PCのパフォーマンスの都合などによりDevContainerを使わない場合はこちらを参照してください。

1. このリポジトリをクローンします(`main`ブランチにいることを確認してください)。
Expand All @@ -52,49 +59,56 @@ PCのパフォーマンスの都合などによりDevContainerを使わない場
4. (ここからは`.env`ファイルを作っていきます)
5. Postgresqlをインストール・設定します。

- dockerを使う場合(手軽だがやや重いかも)
- dockerを使う場合(手軽だがやや重いかも)

1. dockerをインストールします。
2. `docker pull postgres`でpostgresのdockerイメージを取ってきます。
3. `docker run --rm -d -p 5432:5432 -v postgres-tmp:/var/lib/postgresql/data -e POSTGRES_DB=vutd-shovel-dev -e POSTGRES_USER=vutd-shovel-devuser -e POSTGRES_PASSWORD=change_me postgres`を実行するとpostgresが動き始めます(危ないので外部からアクセスできる状態にしてはいけません)。
4. データベースの接続文字列を次のように`.env`に追記します(ユーザー名、パスワード、データベース名を変えたらそれに応じて変更してください)。
```
DATABASE_URL="postgresql://vutd-shovel-devuser:change_me@localhost:5432/vutd-shovel-dev?schema=public"
```
1. dockerをインストールします。
2. `docker pull postgres`でpostgresのdockerイメージを取ってきます。
3. `docker run --rm -d -p 5432:5432 -v postgres-tmp:/var/lib/postgresql/data -e POSTGRES_DB=vutd-shovel-dev -e POSTGRES_USER=vutd-shovel-devuser -e POSTGRES_PASSWORD=change_me postgres`を実行するとpostgresが動き始めます(危ないので外部からアクセスできる状態にしてはいけません)。
4. データベースの接続文字列を次のように`.env`に追記します(ユーザー名、パスワード、データベース名を変えたらそれに応じて変更してください)。

- dockerを使わない場合(dockerより軽く、細かい設定が可能だが面倒)
```text
DATABASE_URL="postgresql://vutd-shovel-devuser:change_me@localhost:5432/vutd-shovel-dev?schema=public"
```

1. Postgresqlをインストールします。
2. pgAdminかpsqlで
- dockerを使わない場合(dockerより軽く、細かい設定が可能だが面倒)

- ボット用のユーザー(パスワードも設定してください。ログイン権限もつけてね!)
- ボット用のデータベース(上のユーザー向けのアクセス権限をお忘れなく)
1. Postgresqlをインストールします。
2. pgAdminかpsqlで

を作成します。
3. データベースの接続文字列を次のように`.env`に追記します。
```
DATABASE_URL="postgresql://ユーザー名:パスワード@localhost:5432/データベース名?schema=public"
```
- ボット用のユーザー(パスワードも設定してください。ログイン権限もつけてね!)
- ボット用のデータベース(上のユーザー向けのアクセス権限をお忘れなく)

を作成します。
3. データベースの接続文字列を次のように`.env`に追記します。

```text
DATABASE_URL="postgresql://ユーザー名:パスワード@localhost:5432/データベース名?schema=public"
```

6. ボットを準備していきます。まずは[Discord Developer Portal](https://discord.com/developers/applications)からテスト用のボットを作成します。
7. `Bot`を開き、`Add Bot`を押します(確認画面が出たらそのまま進んで、Botを追加してください)。
8. `PUBLIC BOT``OFF`にします(別にしなくてもいいですがPUBLICにする必要はないので…)
9. `TOKEN`をコピーします。
10. トークンを次のように`.env`に追記します。
```
BOT_TOKEN=トークン
```

```text
BOT_TOKEN=トークン
```

11. (ここまでで`.env`は書き終わりました)
12. `OAuth2`->`URL Generator`を開き、 `SCOPES`では`bot``applications.commands``BOT PERMISSIONS`では`Send Messages``Send Messages in Threads``Embed Links``Connect``Speak`にチェックを入れ、一番下の`GENERATED URL`をコピーします。
13. ブラウザのアドレスバーに`GENERATED URL`を貼り付けて開きます(その後は普通にテストに使うDiscordサーバーにボットを追加してください)。
14. 次にデータベースをセットアップします。`npx prisma migrate deploy`を実行してください。
15. 音声データをセットアップします。[tohoku-f01](https://github.com/icn-lab/htsvoice-tohoku-f01)を使う場合、voiceフォルダを次のように作成します。
```
/voice
└ tohoku-f01
├ tohoku-f01-angry.htsvoice
├ tohoku-f01-happy.htsvoice
├ tohoku-f01-neutral.htsvoice
└ tohoku-f01-sad.htsvoice
```
16. ここまでの作業が終われば、`npm run dev:watch`でボットを実行できるはずです。お疲れさまでした。

```text
/voice
└ tohoku-f01
├ tohoku-f01-angry.htsvoice
├ tohoku-f01-happy.htsvoice
├ tohoku-f01-neutral.htsvoice
└ tohoku-f01-sad.htsvoice
```

16. 辞書をセットアップします。`npm run compile-dict`を実行してください。
17. ここまでの作業が終われば、`npm run dev:watch`でボットを実行できるはずです。お疲れさまでした。
51 changes: 32 additions & 19 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -1,38 +1,51 @@
FROM node:16-bullseye-slim AS base
RUN apt-get update -y&&apt-get install -y openssl\
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/*
# Please use `docker buildx build` instead of normal `docker build` to build this Dockerfile.
# e.g. `docker buildx build --platform=linux/arm64,linux/amd64 .`


FROM base AS builder
FROM --platform=$BUILDPLATFORM node:16-bullseye-slim AS builder

WORKDIR /app
COPY ./package*.json ./tsconfig.json ./prisma/schema.prisma ./

RUN apt-get update -y&&apt-get install -y curl python3 \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/*

COPY ./package*.json ./
RUN sed '/prepare/d' -i package.json

RUN npm ci --ignore-scripts

COPY ./tsconfig.json ./prisma/schema.prisma ./
COPY ./src ./src
RUN npm run build

FROM base AS runner

WORKDIR /app
ENV NODE_ENV production

COPY --from=builder /app/dist ./dist
COPY ./prisma ./prisma
FROM builder AS modules
ARG TARGETARCH
RUN npm ci --target_arch=$(echo "$TARGETARCH"|sed s/amd64/x64/)



FROM builder AS dict
RUN npm --prefix node_modules/node-openjtalk-binding/ run install
COPY ./script ./script
COPY ./package*.json ./
RUN npm run compile-dict

RUN sed '/prepare/d' -i package.json

RUN apt-get update -y&&apt-get install -y python3 curl g++ make \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/*
RUN npm ci
RUN apt-get remove -y python3 curl g++ make \

FROM node:16-bullseye-slim

WORKDIR /app
ENV NODE_ENV production

RUN apt-get update -y&&apt-get install -y openssl \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/*

COPY ./prisma ./prisma
COPY ./package*.json ./
COPY --from=builder /app/dist ./dist
COPY --from=dict /app/dictionary ./dictionary
COPY --from=modules /app/node_modules ./node_modules

CMD ["npm", "start"]
1 change: 0 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,6 @@
"test": "jest --passWithNoTests",
"compile-dict": "sh ./script/dict.sh",
"prisma-setup": "prisma generate",
"postinstall": "npm run compile-dict",
"prebuild": "npm run prisma-setup"
},
"name": "vutd-shovel",
Expand Down
1 change: 1 addition & 0 deletions prisma/schema.prisma
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
generator client {
provider = "prisma-client-js"
binaryTargets= ["native", "debian-openssl-1.1.x", "linux-arm64-openssl-1.1.x"]
}

datasource db {
Expand Down
2 changes: 1 addition & 1 deletion script/dict.sh
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
#!/bin/sh

rm -r dictionary>/dev/null
rm -r dictionary 2> /dev/null
mkdir -p dictionary/tmp
cd dictionary/tmp

Expand Down

0 comments on commit e4a4dbb

Please sign in to comment.