From 3b95db0d12cf1d9ae31dc94f2a0c488f7812bfc5 Mon Sep 17 00:00:00 2001 From: Ricardo Arturo Cabral Mejia Date: Mon, 17 Oct 2022 04:35:12 +0000 Subject: [PATCH] chore: improve docker building/running --- .dockerignore | 14 +++++++ Dockerfile | 6 +-- README.md | 35 +++++++++++++++--- docker-compose.yml | 42 +++++++++++---------- package-lock.json | 89 ++++++++++++++++++++++++--------------------- package.json | 22 ++++++----- tsconfig.build.json | 3 +- 7 files changed, 133 insertions(+), 78 deletions(-) create mode 100644 .dockerignore diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..b1cf0cd --- /dev/null +++ b/.dockerignore @@ -0,0 +1,14 @@ +dist +node_modules +.test-report +.coverage +seeds +test +.eslint* +.mocha* +.nvmrc +.nycrc* +docker-compose.yml +Dockerfile +*.env +*.md diff --git a/Dockerfile b/Dockerfile index ae01445..6bb80d5 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,10 +1,10 @@ -FROM node:18-alpine3.15 as build +FROM node:18-alpine3.16 as build WORKDIR /build COPY ["package.json", "package-lock.json", "./"] -RUN npm install +RUN npm install --quiet COPY . . @@ -24,7 +24,7 @@ WORKDIR /app COPY --from=build /build/dist . -RUN npm install --omit=dev +RUN npm install --omit=dev --quiet USER 1000:1000 diff --git a/README.md b/README.md index 2d9d128..0014c5a 100644 --- a/README.md +++ b/README.md @@ -3,6 +3,8 @@ This is a [nostr](https://github.com/fiatjaf/nostr) relay, written in Typescript. +This implementation is production-ready. See below for supported features. + The project master repository is available on [GitHub](https://github.com/Cameri/nostr-ts-relay). ## Features @@ -27,30 +29,38 @@ NIPs with a relay-specific implementation are listed here. - PostgreSQL - Node - Typescript +- Docker (optional, version 20 or higher) -## Quick Start +## Quick Start (Docker) + + ``` + npm run docker:compose:up + ``` + +## Quick Start (Standalone) Set the following environment variables: ``` DB_HOST=localhost DB_PORT=5432 - DB_NAME=nostr-ts-relay + DB_NAME=nostr_ts_relay DB_USER=postgres DB_PASSWORD=postgres ``` -Create `nostr-ts-relay` database: +Create `nostr_ts_relay` database: ``` $ psql -h $DB_HOST -p $DB_PORT -U $DB_USER -W - postgres=# create database nostr-ts-relay; + postgres=# create database nostr_ts_relay; postgres=# quit ``` Install dependencies: ``` + npm install -g knex npm install ``` @@ -60,15 +70,30 @@ Run migrations: npm run db:migrate ``` +Create ~/.nostr folder: + + ``` + mkdir ~/.nostr + ``` + To start in development mode: ``` npm run dev ``` +Or, start in production mode: + + ``` + npm run start + ``` + ## Configuration -TBD +You can change the default folder by setting the `NOSTR_CONFIG_DIR` environment variable to a different path. + +Run nostr-ts-relay using one of the quick-start guides at least once and `~/.nostr/settings.json` will be created. +Any changes made to the settings file will be read on the next start. ## Dev Channel diff --git a/docker-compose.yml b/docker-compose.yml index 851f93e..d2bbcaa 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,55 +1,60 @@ services: relay: build: . + container_name: nostr-ts-relay environment: DB_HOST: db DB_PORT: 5432 - DB_USER: nostr-ts-relay - DB_PASSWORD: nostr-ts-relay - DB_NAME: nostr-ts-relay - NOSTR_CONFIG_DIR: /nostr + DB_USER: nostr_ts_relay + DB_PASSWORD: nostr_ts_relay + DB_NAME: nostr_ts_relay + NOSTR_CONFIG_DIR: /home/node/ + user: node:node volumes: - - nostr-config:/nostr + - $HOME/.nostr:/home/node/ ports: - "8008:8008" depends_on: db: condition: service_healthy - migration: + migrations: condition: service_completed_successfully networks: - nostr-ts-relay restart: always db: image: postgres + container_name: db environment: - POSTGRES_USER: nostr-ts-relay - POSTGRES_PASSWORD: nostr-ts-relay + POSTGRES_USER: nostr_ts_relay + POSTGRES_PASSWORD: nostr_ts_relay volumes: - - postgres-data:/var/lib/postgresql/data/ + - pgdata:/var/lib/postgresql/data/ networks: - nostr-ts-relay restart: always healthcheck: - test: ["CMD-SHELL", "pg_isready -U nostr-ts-relay"] + test: ["CMD-SHELL", "pg_isready -U nostr_ts_relay"] interval: 5s timeout: 5s retries: 5 - migration: + migrations: image: node:18-alpine3.15 + container_name: migrations environment: DB_HOST: db DB_PORT: 5432 - DB_USER: nostr-ts-relay - DB_PASSWORD: nostr-ts-relay - DB_NAME: nostr-ts-relay + DB_USER: nostr_ts_relay + DB_PASSWORD: nostr_ts_relay + DB_NAME: nostr_ts_relay entrypoint: - sh - -c - - 'sleep 5s && cd code/ && npm install -g knex && npm run db:migrate' - restart: on-failure + - 'cd code && npm install -g knex@2.3.0 && npm install knex --quiet && npm run db:migrate' volumes: - - .:/code + - ./package.json:/code/package.json + - ./migrations:/code/migrations + - ./knexfile.js:/code/knexfile.js depends_on: - db networks: @@ -59,5 +64,4 @@ networks: nostr-ts-relay: volumes: - postgres-data: - nostr-config: + pgdata: diff --git a/package-lock.json b/package-lock.json index be9d574..2b148e1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -38,9 +38,9 @@ "rimraf": "^3.0.2", "sinon-chai": "^3.7.0", "source-map-support": "^0.5.21", - "ts-node": "^10.7.0", + "ts-node": "^10.9.1", "ts-node-dev": "^1.1.8", - "typescript": "^4.6.3", + "typescript": "4.6", "uuid": "^8.3.2" } }, @@ -457,27 +457,28 @@ "node": ">=6.9.0" } }, - "node_modules/@cspotcode/source-map-consumer": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-consumer/-/source-map-consumer-0.8.0.tgz", - "integrity": "sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg==", - "dev": true, - "engines": { - "node": ">= 12" - } - }, "node_modules/@cspotcode/source-map-support": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.7.0.tgz", - "integrity": "sha512-X4xqRHqN8ACt2aHVe51OxeA2HjbcL4MqFqXkrmQszJ1NOUuUu5u6Vqx/0lZSVNku7velL5FC/s5uEAj1lsBMhA==", + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", "dev": true, "dependencies": { - "@cspotcode/source-map-consumer": "0.8.0" + "@jridgewell/trace-mapping": "0.3.9" }, "engines": { "node": ">=12" } }, + "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, "node_modules/@eslint/eslintrc": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.2.1.tgz", @@ -4407,12 +4408,12 @@ } }, "node_modules/ts-node": { - "version": "10.7.0", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.7.0.tgz", - "integrity": "sha512-TbIGS4xgJoX2i3do417KSaep1uRAW/Lu+WAL2doDHC0D6ummjirVOXU5/7aiZotbQ5p1Zp9tP7U6cYhA0O7M8A==", + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", + "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", "dev": true, "dependencies": { - "@cspotcode/source-map-support": "0.7.0", + "@cspotcode/source-map-support": "^0.8.0", "@tsconfig/node10": "^1.0.7", "@tsconfig/node12": "^1.0.7", "@tsconfig/node14": "^1.0.0", @@ -4423,7 +4424,7 @@ "create-require": "^1.1.0", "diff": "^4.0.1", "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.0", + "v8-compile-cache-lib": "^3.0.1", "yn": "3.1.1" }, "bin": { @@ -4612,9 +4613,9 @@ } }, "node_modules/typescript": { - "version": "4.6.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.3.tgz", - "integrity": "sha512-yNIatDa5iaofVozS/uQJEl3JRWLKKGJKh6Yaiv0GLGSuhpFJe7P3SbHZ8/yjAHRQwKRoA6YZqlfjXWmVzoVSMw==", + "version": "4.6.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.4.tgz", + "integrity": "sha512-9ia/jWHIEbo49HfjrLGfKbZSuWo9iTMwXO+Ca3pRsSpbsMbc7/IU8NKdCZVRRBafVPGnoJeFL76ZOAA84I9fEg==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -5197,19 +5198,25 @@ "to-fast-properties": "^2.0.0" } }, - "@cspotcode/source-map-consumer": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-consumer/-/source-map-consumer-0.8.0.tgz", - "integrity": "sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg==", - "dev": true - }, "@cspotcode/source-map-support": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.7.0.tgz", - "integrity": "sha512-X4xqRHqN8ACt2aHVe51OxeA2HjbcL4MqFqXkrmQszJ1NOUuUu5u6Vqx/0lZSVNku7velL5FC/s5uEAj1lsBMhA==", + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", "dev": true, "requires": { - "@cspotcode/source-map-consumer": "0.8.0" + "@jridgewell/trace-mapping": "0.3.9" + }, + "dependencies": { + "@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + } } }, "@eslint/eslintrc": { @@ -8141,12 +8148,12 @@ "dev": true }, "ts-node": { - "version": "10.7.0", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.7.0.tgz", - "integrity": "sha512-TbIGS4xgJoX2i3do417KSaep1uRAW/Lu+WAL2doDHC0D6ummjirVOXU5/7aiZotbQ5p1Zp9tP7U6cYhA0O7M8A==", + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", + "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", "dev": true, "requires": { - "@cspotcode/source-map-support": "0.7.0", + "@cspotcode/source-map-support": "^0.8.0", "@tsconfig/node10": "^1.0.7", "@tsconfig/node12": "^1.0.7", "@tsconfig/node14": "^1.0.0", @@ -8157,7 +8164,7 @@ "create-require": "^1.1.0", "diff": "^4.0.1", "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.0", + "v8-compile-cache-lib": "^3.0.1", "yn": "3.1.1" } }, @@ -8276,9 +8283,9 @@ } }, "typescript": { - "version": "4.6.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.3.tgz", - "integrity": "sha512-yNIatDa5iaofVozS/uQJEl3JRWLKKGJKh6Yaiv0GLGSuhpFJe7P3SbHZ8/yjAHRQwKRoA6YZqlfjXWmVzoVSMw==", + "version": "4.6.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.4.tgz", + "integrity": "sha512-9ia/jWHIEbo49HfjrLGfKbZSuWo9iTMwXO+Ca3pRsSpbsMbc7/IU8NKdCZVRRBafVPGnoJeFL76ZOAA84I9fEg==", "dev": true }, "universalify": { diff --git a/package.json b/package.json index f5c08fb..d4af0cb 100644 --- a/package.json +++ b/package.json @@ -17,28 +17,32 @@ "main": "src/index.ts", "scripts": { "dev": "ts-node src/index.ts", - "dev:watch": "nodemon --watch src src/index.ts", "clean": "rimraf ./dist", "build": "tsc --project tsconfig.build.json", - "build:check": "tsc --noEmit", + "prestart": "npm run build", + "start": "cd dist && node src/index.js", + "build:check": "npm run build -- --noEmit", "lint": "eslint ./src ./test --ext .ts", "lint:fix": "npm run lint -- --fix", "db:migrate": "knex migrate:latest", "db:migrate:rollback": "knex migrate:rollback", "db:seed": "knex seed:run", - "start": "node dist/index.js", "test": "mocha 'test/**/*.spec.ts'", "test:watch": "npm run test -- --min --watch --watch-files src/**/*,test/**/*", "cover": "nyc npm run test", - "cover:watch": "nyc npm run test", - "docker:build": "docker build -t nostr-ts-relay ." + "docker:build": "docker build -t nostr-ts-relay .", + "predocker:compose:up": "[ -d \"$HOME/.nostr\" ] || mkdir -p $HOME/.nostr", + "docker:compose:up": "NOSTR_CONFIG_DIR=$HOME/.nostrx docker compose up --build", + "docker:compose:down": "docker compose down", + "docker:compose:rm": "docker compose rm" }, "repository": { "type": "git", "url": "git+https://github.com/Cameri/nostr-ts-relay.git" }, "keywords": [ - "nostr" + "nostr", + "relay" ], "author": "Ricardo Arturo Cabral Mejía", "license": "MIT", @@ -67,15 +71,15 @@ "rimraf": "^3.0.2", "sinon-chai": "^3.7.0", "source-map-support": "^0.5.21", - "ts-node": "^10.7.0", + "ts-node": "^10.9.1", "ts-node-dev": "^1.1.8", - "typescript": "^4.6.3", + "typescript": "4.6", "uuid": "^8.3.2" }, "dependencies": { "@noble/secp256k1": "1.7.0", "joi": "17.6.1", - "knex": "2.3.0", + "knex": "^2.3.0", "pg": "8.8.0", "pg-query-stream": "4.2.3", "ramda": "0.28.0", diff --git a/tsconfig.build.json b/tsconfig.build.json index b429aaf..ec7a8e2 100644 --- a/tsconfig.build.json +++ b/tsconfig.build.json @@ -16,7 +16,8 @@ "inlineSources": false, "resolveJsonModule": true, "esModuleInterop": true, - "lib": ["ESNext"] + "lib": ["ESNext"], + "incremental": true }, "ts-node": { "transpileOnly": true