Add dockerfile

This commit is contained in:
kimpure 2026-02-10 10:09:25 +00:00
parent dcf0853e20
commit 12397abf5a
16 changed files with 3332 additions and 2363 deletions

View file

@ -1,5 +1,6 @@
dist
node_modules
cache
.env
.git
.trash

1
.gitignore vendored
View file

@ -7,3 +7,4 @@ packages/generated
.env
cache
docker-compose.yml

View file

@ -1,9 +1,19 @@
FROM node:24-slim
FROM node:24-slim AS builder
WORKDIR /app
COPY package*.json ./
RUN npm install
RUN --mount=type=cache,target=/root/.npm,sharing=locked npm ci --include=dev
COPY . .
RUN npm run init
RUN npm run build
CMD [ "node", "dist" ]
FROM node:24-slim AS app
WORKDIR /app
COPY package*.json ./
COPY --from=builder /app/dist ./
RUN --mount=type=cache,target=/root/.npm,sharing=locked npm ci --include=prod
CMD [ "npm", "start" ]

View file

@ -0,0 +1,32 @@
networks:
discord-bot-internal:
internal: true
discord-bot-external:
internal: false
services:
discord-bot:
build: .
container_name: discord_bot
restart: unless-stopped
networks:
- discord-bot-internal
- discord-bot-external
environment:
DISCORD_TOKEN: "${DISCORD_TOKEN}"
APPLICATION_ID: "${APPLICATION_ID}"
GUILD_ID: "${GUILD_ID}"
TYPECAST_TOKEN: "${TYPECAST_TOKEN}"
DATABASE_URL: "postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@$discord-db:5432/${POSTGRES_DB}?schema=public"
discord-db:
container_name: discord-db
image: postgres:17
restart: unless-stopped
networks:
- discord-bot-internal
volumes:
- postgres_data:/var/lib/postgresql/data
environment:
POSTGRES_PASSWORD: "${POSTGRES_PASSWORD}"
POSTGRES_USER: "${POSTGRES_USER}"
POSTGRES_DB: "${POSTGRES_DB}"

View file

@ -1,19 +0,0 @@
services:
discord-bot:
build: .
environment:
- DISCORD_TOKEN=MTQ2MDU5NTMyMzczODI2MzU3Mg.Gn2Mn-.dIRJ9MGKRs9mmUkDbDpZ4h_NSjiNVquKk9VPpo
- APPLICATION_ID=1460595323738263572
- TYPECAST_TOKEN=__pltP9LVqfCqTGAk353JZsEKey49ivoWw799Lp9CM7Ru
- DATABASE_URL=postgresql://yaeju:251205Yaeji@localhost:5432/discord_bot?schema=public
db:
image: postgres:17
restart: always
environment:
POSTGRES_USER: yaejy
POSTGRES_PASSWORD: 251205Yaeji
POSTGRES_DB: yaejudb
ports:
- "5432:5432"
volumes:
- postgres_data:/var/lib/postgresql/data

3221
package-lock.json generated Normal file

File diff suppressed because it is too large Load diff

View file

@ -1,9 +1,14 @@
{
"main": "dist",
"scripts": {
"init": "prisma db push && npm run build",
"prismabuild": "prisma format && prisma generate",
"build": "npm run prismabuild && tsc",
"start": "npm run build && node dist"
"prisma:push": "prisma db push",
"format:prisma": "prisma format",
"format": "npm run format:prisma",
"build:prisma": "prisma generate",
"build:tsc": "tsc",
"build": "npm run build:tsc && npm run build:prisma",
"start": "node .",
"dev": "npm run build && npm run start"
},
"dependencies": {
"@discordjs/opus": "^0.10.0",
@ -20,7 +25,6 @@
"opusscript": "^0.0.8",
"pg": "^8.17.1",
"play-dl": "^1.9.7",
"pnpm": "^10.28.0",
"prism-media": "^1.3.5",
"prisma": "^7.2.0",
"typescript": "^5.9.3"

View file

@ -76,7 +76,7 @@ export async function playVoice(guild: Guild, profile: DiscordUserProfile, text:
if (profile.canTypecast) {
voiceBuffer = await createVoiceBuffer(profile.voice, text);
} else {
throw new Error(`the user ${profile.userId} is not admin`);
throw new Error(`the user ${profile.userId} is can't use typecast voice`);
}
} else {
voiceBuffer = await createVoiceBuffer(profile.voice, text);

View file

@ -17,10 +17,10 @@ import type * as Prisma from "./prismaNamespace"
const config: runtime.GetPrismaClientConfig = {
"previewFeatures": [],
"clientVersion": "7.2.0",
"engineVersion": "0c8ef2ce45c83248ab3df073180d5eda9e8be7a3",
"clientVersion": "7.3.0",
"engineVersion": "9d6ad21cbbceab97458517b147a6a09ff43aa735",
"activeProvider": "postgresql",
"inlineSchema": "// This is your Prisma schema file,\n// learn more about it in the docs: https://pris.ly/d/prisma-schema\n\n// Looking for ways to speed up your queries, or scale easily with your serverless or edge functions?\n// Try Prisma Accelerate: https://pris.ly/cli/accelerate-init\n\ngenerator client {\n provider = \"prisma-client\"\n specifying = [\"prismaSchemaFolder\"]\n output = \"../packages/db/generated/prisma\"\n}\n\ndatasource db {\n provider = \"postgresql\"\n}\n\nenum Voice {\n TypeCast\n Papago\n}\n\nmodel DiscordUserProfile {\n id String @id @default(cuid())\n userId String @unique\n voice Voice @default(Papago)\n nya Boolean @default(false)\n canTypecast Boolean @default(false)\n}\n\nmodel DiscordGuildProfile {\n id String @id @default(cuid())\n guildId String @unique\n readChannel String[] @default([])\n}\n",
"inlineSchema": "generator client {\n provider = \"prisma-client\"\n output = \"../packages/db/generated/prisma\"\n specifying = [\"prismaSchemaFolder\"]\n}\n\ndatasource db {\n provider = \"postgresql\"\n}\n\nmodel DiscordUserProfile {\n id String @id @default(cuid())\n userId String @unique\n voice Voice @default(Papago)\n nya Boolean @default(false)\n canTypecast Boolean @default(false)\n}\n\nmodel DiscordGuildProfile {\n id String @id @default(cuid())\n guildId String @unique\n readChannel String[] @default([])\n}\n\nenum Voice {\n TypeCast\n Papago\n}\n",
"runtimeDataModel": {
"models": {},
"enums": {},
@ -37,12 +37,14 @@ async function decodeBase64AsWasm(wasmBase64: string): Promise<WebAssembly.Modul
}
config.compilerWasm = {
getRuntime: async () => await import("@prisma/client/runtime/query_compiler_bg.postgresql.js"),
getRuntime: async () => await import("@prisma/client/runtime/query_compiler_fast_bg.postgresql.js"),
getQueryCompilerWasmModule: async () => {
const { wasm } = await import("@prisma/client/runtime/query_compiler_bg.postgresql.wasm-base64.js")
const { wasm } = await import("@prisma/client/runtime/query_compiler_fast_bg.postgresql.wasm-base64.js")
return await decodeBase64AsWasm(wasm)
}
},
importName: "./query_compiler_fast_bg.js"
}

View file

@ -80,12 +80,12 @@ export type PrismaVersion = {
}
/**
* Prisma Client JS version: 7.2.0
* Query Engine version: 0c8ef2ce45c83248ab3df073180d5eda9e8be7a3
* Prisma Client JS version: 7.3.0
* Query Engine version: 9d6ad21cbbceab97458517b147a6a09ff43aa735
*/
export const prismaVersion: PrismaVersion = {
client: "7.2.0",
engine: "0c8ef2ce45c83248ab3df073180d5eda9e8be7a3"
client: "7.3.0",
engine: "9d6ad21cbbceab97458517b147a6a09ff43aa735"
}
/**

View file

@ -61,12 +61,12 @@ export type ModelName = (typeof ModelName)[keyof typeof ModelName]
* Enums
*/
export const TransactionIsolationLevel = {
export const TransactionIsolationLevel = runtime.makeStrictEnum({
ReadUncommitted: 'ReadUncommitted',
ReadCommitted: 'ReadCommitted',
RepeatableRead: 'RepeatableRead',
Serializable: 'Serializable'
} as const
} as const)
export type TransactionIsolationLevel = (typeof TransactionIsolationLevel)[keyof typeof TransactionIsolationLevel]

View file

@ -1,14 +1,11 @@
import { Response as NodeFetchResponse, RequestInit, RequestInfo } from "node-fetch";
import defaultFetch from "node-fetch";
export default async function(url: URL | RequestInfo, request: RequestInit={}, time: number=5000): Promise<NodeFetchResponse | Response> {
export default async function(url: URL | RequestInfo, request: RequestInit={}, time: number=5000): Promise<Response> {
const controller = new AbortController();
const timeout = setTimeout(() => controller.abort(), time);
request.signal ??= controller.signal;
try {
return await defaultFetch(url, request);;
return await fetch(url, request);;
} finally {
clearTimeout(timeout);
}

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,28 @@
-- CreateEnum
CREATE TYPE "Voice" AS ENUM ('TypeCast', 'Papago');
-- CreateTable
CREATE TABLE "DiscordUserProfile" (
"id" TEXT NOT NULL,
"userId" TEXT NOT NULL,
"voice" "Voice" NOT NULL DEFAULT 'Papago',
"nya" BOOLEAN NOT NULL DEFAULT false,
"canTypecast" BOOLEAN NOT NULL DEFAULT false,
CONSTRAINT "DiscordUserProfile_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "DiscordGuildProfile" (
"id" TEXT NOT NULL,
"guildId" TEXT NOT NULL,
"readChannel" TEXT[] DEFAULT ARRAY[]::TEXT[],
CONSTRAINT "DiscordGuildProfile_pkey" PRIMARY KEY ("id")
);
-- CreateIndex
CREATE UNIQUE INDEX "DiscordUserProfile_userId_key" ON "DiscordUserProfile"("userId");
-- CreateIndex
CREATE UNIQUE INDEX "DiscordGuildProfile_guildId_key" ON "DiscordGuildProfile"("guildId");

View file

@ -0,0 +1,3 @@
# Please do not edit this file manually
# It should be added in your version-control system (e.g., Git)
provider = "postgresql"

View file

@ -1,24 +1,13 @@
// This is your Prisma schema file,
// learn more about it in the docs: https://pris.ly/d/prisma-schema
// Looking for ways to speed up your queries, or scale easily with your serverless or edge functions?
// Try Prisma Accelerate: https://pris.ly/cli/accelerate-init
generator client {
provider = "prisma-client"
specifying = ["prismaSchemaFolder"]
output = "../packages/db/generated/prisma"
specifying = ["prismaSchemaFolder"]
}
datasource db {
provider = "postgresql"
}
enum Voice {
TypeCast
Papago
}
model DiscordUserProfile {
id String @id @default(cuid())
userId String @unique
@ -32,3 +21,8 @@ model DiscordGuildProfile {
guildId String @unique
readChannel String[] @default([])
}
enum Voice {
TypeCast
Papago
}