A discord bot for teal.fm
discord tealfm music

docker compose mostly working

besaid.zone 875078ff dac1d2fe

verified
+3
.tangled/workflows/typecheck.yml
··· 14 14 - name: install 15 15 command: pnpm i --frozen-lockfile 16 16 17 + - name: build 18 + command: pnpm -r build 19 + 17 20 - name: typecheck 18 21 command: pnpm typecheck
Dockerfile Dockerfile.web
+18
Dockerfile.bot
··· 1 + FROM node:24-alpine AS base 2 + ENV PNPM_HOME="/pnpm" 3 + ENV PATH="$PNPM_HOME:$PATH" 4 + ENV NODE_ENV=production 5 + RUN corepack enable 6 + 7 + FROM base AS build 8 + COPY . /app 9 + WORKDIR /app 10 + 11 + RUN --mount=type=cache,id=pnpm,target=/pnpm/store pnpm install --frozen-lockfile 12 + RUN pnpm run -r build 13 + RUN pnpm deploy --filter=./apps/bot --prod /prod/bot 14 + 15 + FROM base AS bot 16 + COPY --from=build /prod/bot /prod/bot 17 + WORKDIR /prod/bot 18 + CMD ["pnpm", "start"]
+18
Dockerfile.tap
··· 1 + FROM node:24-alpine AS base 2 + ENV PNPM_HOME="/pnpm" 3 + ENV PATH="$PNPM_HOME:$PATH" 4 + ENV NODE_ENV=production 5 + RUN corepack enable 6 + 7 + FROM base AS build 8 + COPY . /app 9 + WORKDIR /app 10 + 11 + RUN --mount=type=cache,id=pnpm,target=/pnpm/store pnpm install --frozen-lockfile 12 + RUN pnpm run -r build 13 + RUN pnpm deploy --filter=./apps/tapper --prod /prod/tapper 14 + 15 + FROM base AS tapper 16 + COPY --from=build /prod/tapper /prod/tapper 17 + WORKDIR /prod/tapper 18 + CMD ["pnpm", "start"]
+1 -1
apps/bot/deploy-commands.ts
··· 8 8 import path from "node:path"; 9 9 10 10 const commands = []; 11 - const commandPaths = fs.globSync("commands/**/*.ts"); 11 + const commandPaths = fs.globSync("commands/**/*.js"); 12 12 13 13 for await (const cmdPath of commandPaths) { 14 14 const absoluteCommandPath = path.join(import.meta.dirname, cmdPath);
+1 -1
apps/bot/main.ts
··· 39 39 40 40 client.commands = new Collection(); 41 41 42 - const commandPaths = fs.globSync("commands/*.ts"); 42 + const commandPaths = fs.globSync("commands/*.js"); 43 43 for await (const file of commandPaths) { 44 44 const absoluteCommandPath = path.join(import.meta.dirname, file); 45 45 const command = await import(absoluteCommandPath);
+1
apps/bot/package.json
··· 7 7 "dev": "tsx --watch main.ts", 8 8 "deploy-commands": "tsx deploy-commands.ts", 9 9 "build": "tsc", 10 + "start": "node dist/main.js", 10 11 "typecheck": "tsc --noEmit" 11 12 }, 12 13 "dependencies": {
+1 -1
apps/tapper/package.json
··· 5 5 "type": "module", 6 6 "scripts": { 7 7 "dev": "NODE_ENV=development tsx index.ts", 8 - "start": "NODE_ENV=production tsx index.ts", 8 + "start": "NODE_ENV=production node dist/index.js", 9 9 "typecheck": "tsc --noEmit" 10 10 }, 11 11 "dependencies": {
+45
docker-compose.yml
··· 1 1 services: 2 + web: 3 + container_name: web 4 + restart: always 5 + build: 6 + context: . 7 + dockerfile: Dockerfile.web 8 + ports: 9 + - 8002:8002 10 + environment: 11 + NODE_ENV: production 12 + 13 + depends_on: 14 + db: 15 + condition: service_healthy 16 + bot: 17 + condition: service_started 18 + tapper: 19 + container_name: tapper 20 + build: 21 + context: . 22 + dockerfile: Dockerfile.tap 23 + environment: 24 + NODE_ENV: production 25 + 26 + depends_on: 27 + db: 28 + condition: service_healthy 29 + bot: 30 + container_name: bot 31 + restart: always 32 + build: 33 + context: . 34 + dockerfile: Dockerfile.bot 35 + environment: 36 + NODE_ENV: production 37 + 38 + depends_on: 39 + db: 40 + condition: service_healthy 2 41 db: 3 42 image: postgres:18.1 43 + healthcheck: 44 + test: ["CMD-SHELL", "pg_isready -U postgres -d tealfmbotdb"] 45 + interval: 10s 46 + retries: 5 47 + start_period: 30s 48 + timeout: 10s 4 49 restart: always 5 50 shm_size: 128mb 6 51 env_file: .env
+1
package.json
··· 15 15 "bot": "pnpm --filter bot dev", 16 16 "tap": "pnpm --filter tapper dev", 17 17 "web": "pnpm --filter web dev", 18 + "build": "pnpm -r build", 18 19 "docker:web": "docker build . --target web --tag web:latest", 19 20 "dev:all": "pnpm --filter './apps/**' dev", 20 21 "typecheck": "pnpm --filter './apps/**' typecheck",