Compare commits

..

No commits in common. "e39eaa632db16c0d2abdd78710467639e74ddcf4" and "711a017e8cf774e5a81c7b88b88e558443efc7ca" have entirely different histories.

4 changed files with 11 additions and 36 deletions

View file

@ -1,32 +1,20 @@
# Patched from upstream kind-0/nsecbunkerd Dockerfile to use pnpm — the
# upstream version uses `npm install` but package.json declares
# `@nostr-dev-kit/ndk` as `workspace:*`, which only pnpm understands.
# A clean clone of upstream fails to build with `EUNSUPPORTEDPROTOCOL`
# under npm. Switching to pnpm matches the lockfile that ships in-repo.
# Also drops `--frozen-lockfile` because the upstream pnpm-lock.yaml is
# out of date vs. package.json (ERR_PNPM_OUTDATED_LOCKFILE) — bug to
# file upstream once we've verified the rest of the stack works.
FROM node:20.11-bullseye AS build FROM node:20.11-bullseye AS build
WORKDIR /app WORKDIR /app
RUN npm install -g pnpm@9 # Copy package files and install dependencies
COPY package*.json ./
# Copy lockfile + manifest first so the install layer caches across RUN npm install
# source changes.
COPY package.json pnpm-lock.yaml ./
RUN pnpm install --no-frozen-lockfile
# Copy application files # Copy application files
COPY . . COPY . .
# Generate prisma client and build the application # Generate prisma client and build the application
RUN npx prisma generate RUN npx prisma generate
RUN pnpm run build RUN npm run build
# Runtime stage # Runtime stage
FROM node:20.11-alpine AS runtime FROM node:20.11-alpine as runtime
WORKDIR /app WORKDIR /app
@ -34,13 +22,11 @@ RUN apk update && \
apk add --no-cache openssl && \ apk add --no-cache openssl && \
rm -rf /var/cache/apk/* rm -rf /var/cache/apk/*
RUN npm install -g pnpm@9
# Copy built files from the build stage # Copy built files from the build stage
COPY --from=build /app . COPY --from=build /app .
# Install only runtime dependencies (pnpm respects the workspace protocol) # Install only runtime dependencies
RUN pnpm install --prod --no-frozen-lockfile RUN npm install --only=production
EXPOSE 3000 EXPOSE 3000

View file

@ -39,7 +39,7 @@
"@fastify/view": "^8.2.0", "@fastify/view": "^8.2.0",
"@inquirer/password": "^1.1.2", "@inquirer/password": "^1.1.2",
"@inquirer/prompts": "^1.2.3", "@inquirer/prompts": "^1.2.3",
"@nostr-dev-kit/ndk": "2.8.1", "@nostr-dev-kit/ndk": "workspace:*",
"@prisma/client": "^5.4.1", "@prisma/client": "^5.4.1",
"@scure/base": "^1.1.1", "@scure/base": "^1.1.1",
"@types/yargs": "^17.0.24", "@types/yargs": "^17.0.24",

View file

@ -122,12 +122,7 @@ class AdminInterface {
this.rpc.on('request', (req) => this.handleRequest(req)); this.rpc.on('request', (req) => this.handleRequest(req));
// pingOrDie disabled — NDK 2.8.1 outbox model doesn't echo pingOrDie(this.ndk);
// self-published events back through subscriptions on
// non-public relay channels, so the watchdog fires false
// positives and exits the bunker every 50s on private relays.
// See aiolabs/nsecbunkerd#4 + #7.
// pingOrDie(this.ndk);
}).catch((err) => { }).catch((err) => {
console.log('❌ admin connection failed'); console.log('❌ admin connection failed');
console.log(err); console.log(err);

View file

@ -230,14 +230,8 @@ class Daemon {
if (nsec.startsWith('nsec1')) { if (nsec.startsWith('nsec1')) {
try { try {
// NDK 2.8.1's NDKPrivateKeySigner constructor passes its const key = new NDKPrivateKeySigner(nsec);
// arg straight to nostr-tools getPublicKey() which requires hexpk = key.privateKey!;
// 32-byte hex / bytes / bigint, not bech32. Without this
// decode, every key created via create_new_key fails to
// load with the nostr-tools getPublicKey type error, so
// the bunker can never sign for any target it provisions.
// See aiolabs/nsecbunkerd#8.
hexpk = nip19.decode(nsec).data as string;
} catch(e) { } catch(e) {
console.error(`Error loading key ${name}:`, e); console.error(`Error loading key ${name}:`, e);
return return