Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .env.local.example
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,8 @@ DISCORD_TOKEN=your_bot_token_here
CLIENT_ID=your_client_id_here
SERVER_ID=your_server_id_here

# Database Configuration (Optional - uncomment and add to config.ts when needed)
# DATABASE_URL=postgresql://user:password@localhost:5432/botdb
# Database Configuration (Required)
DATABASE_URL=file:../data/moderation.db

# API Keys (Optional - uncomment and add to config.ts when needed)
# FOO_API_KEY=sk-1234567890abcdef
Expand Down
1 change: 1 addition & 0 deletions .github/workflows/deploy.yml
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,7 @@ jobs:
DISCORD_TOKEN=${{ secrets.DISCORD_TOKEN }}
CLIENT_ID=${{ secrets.CLIENT_ID }}
SERVER_ID=${{ secrets.SERVER_ID }}
DATABASE_URL=file:../data/moderation.db
EOF

echo "🐳 Stopping existing containers..."
Expand Down
5 changes: 2 additions & 3 deletions Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -45,15 +45,14 @@ COPY --from=build /app/dist ./dist
COPY --from=build /app/generated ./generated
COPY --from=build /app/prisma ./prisma
COPY package.json ./
COPY prisma.config.ts ./

# Create data directory and set permissions for node user
RUN mkdir -p /app/data && chown -R node:node /app/data

# Run as non-root user for security
USER node

CMD ["node", "dist/index.js"]
CMD ["sh", "-c", "npx prisma migrate deploy && node dist/index.js"]

# Development stage - Full dev environment with hot reload
FROM deps-dev AS development
Expand All @@ -71,4 +70,4 @@ RUN mkdir -p /app/data && chown -R node:node /app/data
# Run as non-root user for security
USER node

CMD ["pnpm", "run", "dev"]
CMD ["sh", "-c", "npx prisma migrate deploy && pnpm run dev"]
4 changes: 4 additions & 0 deletions docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ services:
- .env.local
environment:
- NODE_ENV=production
- DATABASE_URL=file:../data/moderation.db
volumes:
- prod_logs:/app/logs
- prod_data:/app/data # Named volume - persists outside repo
Expand All @@ -29,6 +30,7 @@ services:
- .env.local
environment:
- NODE_ENV=development
- DATABASE_URL=file:../data/moderation.db
volumes:
- .:/app
- ./logs:/app/logs
Expand All @@ -46,6 +48,8 @@ services:
profiles: ["tools"]
env_file:
- .env.local
environment:
- DATABASE_URL=file:../data/moderation.db
volumes:
- prod_data:/app/data # Use same named volume as production
command: npx prisma migrate deploy
Expand Down
8 changes: 7 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,13 @@
"check:fix": "biome check --write .",
"prepare": "husky",
"pre-commit": "lint-staged",
"typecheck": "tsc --noEmit"
"typecheck": "tsc --noEmit",

"db:migrate": "npx prisma migrate deploy",
"db:migrate:dev": "npx prisma migrate dev",
"db:generate": "npx prisma generate",
"db:studio": "npx prisma studio",
"db:reset": "npx prisma migrate reset"
},
"license": "MIT",
"packageManager": "[email protected]",
Expand Down
3 changes: 2 additions & 1 deletion prisma.config.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { defineConfig } from "prisma/config";
import "./src/loadEnvFile.js";

export default defineConfig({
schema: "prisma/schema.prisma",
Expand All @@ -7,6 +8,6 @@ export default defineConfig({
},
engine: "classic",
datasource: {
url: "file:../data/moderation.db", // Match schema.prisma
url: process.env.DATABASE_URL!,
},
});
30 changes: 15 additions & 15 deletions prisma/schema.prisma
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,13 @@
// learn more about it in the docs: https://pris.ly/d/prisma-schema

generator client {
provider = "prisma-client-js"
provider = "prisma-client-js"
output = "../generated/prisma"
}

datasource db {
provider = "sqlite"
url = "file:../data/moderation.db"
url = env("DATABASE_URL")
}

enum Role {
Expand Down Expand Up @@ -54,13 +54,13 @@ enum ActionReason {
}

model User {
userId Int @id @default(autoincrement())
discordUserId String @unique
role Role @default(MEMBER)
userId Int @id @default(autoincrement())
discordUserId String @unique
role Role @default(MEMBER)

// A user can have many actions performed on them
actions Action[] @relation("UserActions")
actions Action[] @relation("UserActions")

// A user (as moderator) can perform many moderation actions
moderatedActions Action[] @relation("ModeratorActions")
}
Expand All @@ -78,14 +78,14 @@ model Action {
revertingActionId Int? @unique

// Relationship to the user this action was performed on
user User @relation("UserActions", fields: [userId], references: [userId])
user User @relation("UserActions", fields: [userId], references: [userId])

// Relationship to the moderator who performed this action
moderator User @relation("ModeratorActions", fields: [moderatorUserId], references: [userId])
moderator User @relation("ModeratorActions", fields: [moderatorUserId], references: [userId])

// Self-referential relationship: this action reverts another action
revertingAction Action? @relation("ActionCorrections", fields: [revertingActionId], references: [actionId])
revertingAction Action? @relation("ActionCorrections", fields: [revertingActionId], references: [actionId])

// Self-referential relationship: actions that revert this action
revertedByActions Action[] @relation("ActionCorrections")
}
revertedByActions Action[] @relation("ActionCorrections")
}
7 changes: 4 additions & 3 deletions src/env.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,10 @@ export const config = {
clientId: requireEnv("CLIENT_ID"),
serverId: requireEnv("SERVER_ID"),
},
database: {
url: requireEnv("DATABASE_URL"),
},
// Add more config sections as needed:
// database: {
// url: requireEnv('DATABASE_URL'),
// },
// api: {
// openaiKey: optionalEnv('OPENAI_API_KEY'),
// },
Expand All @@ -33,3 +33,4 @@ console.log("✅ Configuration loaded successfully");
console.log(`📋 Client ID: ${config.discord.clientId ? config.discord.clientId : "❌ missing"}`);
console.log(`🔑 Token: ${config.discord.token ? "***configured***" : "❌ missing"}`);
console.log(`🔑 Guild ID: ${config.discord.serverId ? config.discord.serverId : "Global"}`);
console.log(`🗄️ Database: ${config.database.url ? "***configured***" : "❌ missing"}`);