chore: improve docker building/running

This commit is contained in:
Ricardo Arturo Cabral Mejia
2022-10-17 04:35:12 +00:00
parent 5eeaf23dda
commit 3b95db0d12
7 changed files with 133 additions and 78 deletions

14
.dockerignore Normal file
View File

@ -0,0 +1,14 @@
dist
node_modules
.test-report
.coverage
seeds
test
.eslint*
.mocha*
.nvmrc
.nycrc*
docker-compose.yml
Dockerfile
*.env
*.md

View File

@ -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

View File

@ -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

View File

@ -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:

89
package-lock.json generated
View File

@ -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": {

View File

@ -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",

View File

@ -16,7 +16,8 @@
"inlineSources": false,
"resolveJsonModule": true,
"esModuleInterop": true,
"lib": ["ESNext"]
"lib": ["ESNext"],
"incremental": true
},
"ts-node": {
"transpileOnly": true