mirror of
https://github.com/Cameri/nostream.git
synced 2025-07-12 14:52:20 +02:00
chore: improve docker building/running
This commit is contained in:
14
.dockerignore
Normal file
14
.dockerignore
Normal file
@ -0,0 +1,14 @@
|
||||
dist
|
||||
node_modules
|
||||
.test-report
|
||||
.coverage
|
||||
seeds
|
||||
test
|
||||
.eslint*
|
||||
.mocha*
|
||||
.nvmrc
|
||||
.nycrc*
|
||||
docker-compose.yml
|
||||
Dockerfile
|
||||
*.env
|
||||
*.md
|
@ -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
|
||||
|
||||
|
35
README.md
35
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
|
||||
|
||||
|
@ -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
89
package-lock.json
generated
@ -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": {
|
||||
|
22
package.json
22
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",
|
||||
|
@ -16,7 +16,8 @@
|
||||
"inlineSources": false,
|
||||
"resolveJsonModule": true,
|
||||
"esModuleInterop": true,
|
||||
"lib": ["ESNext"]
|
||||
"lib": ["ESNext"],
|
||||
"incremental": true
|
||||
},
|
||||
"ts-node": {
|
||||
"transpileOnly": true
|
||||
|
Reference in New Issue
Block a user