build: use pnpm for the deploy

This commit is contained in:
Rafael Taranto 2025-05-23 16:02:58 +01:00
parent 64e358f61c
commit bac8813a8d
36 changed files with 19068 additions and 29560 deletions

View file

@ -4,42 +4,48 @@ on: [ workflow_dispatch ]
jobs:
everything:
runs-on: ubuntu-latest
runs-on: ubuntu-20.04
steps:
- uses: actions/checkout@v4
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Cache Docker layers
- name: Setup Turbo cache
uses: actions/cache@v4
with:
path: /tmp/.buildx-cache
key: ${{ runner.os }}-buildx-updatetar
path: .turbo
key: ${{ runner.os }}-turbo-${{ github.sha }}
restore-keys: |
${{ runner.os }}-buildx-updatetar
- name: Build Docker image
uses: docker/build-push-action@v5
with:
context: .
file: build/ci.Dockerfile
load: true
tags: ci_image:latest
cache-from: type=local,src=/tmp/.buildx-cache
cache-to: type=local,dest=/tmp/.buildx-cache-new
${{ runner.os }}-turbo-
- name: Extract artifact from Docker image
- name: Setup pnpm
uses: pnpm/action-setup@v4
with:
version: 10.11.0
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '22'
cache: 'pnpm'
- name: Install dependencies
run: pnpm install
- name: Build packages with Turbo
run: pnpm run build
- name: Package production build
run: |
docker create --name extract_artifact ci_image:latest
docker cp extract_artifact:/lamassu-server.tar.gz ./lamassu-server.tar.gz
docker rm extract_artifact
# Create production-ready server package using pnpm deploy
pnpm deploy --filter=./packages/server --prod lamassu-server --legacy
# Copy built admin UI to public directory
cp -r packages/admin-ui/build lamassu-server/public
# Create tarball
tar -zcf lamassu-server.tar.gz lamassu-server/
- name: Upload artifact
uses: actions/upload-artifact@v4
with:
name: lamassu-server.tar.gz
path: lamassu-server.tar.gz
- name: Move cache
run: |
rm -rf /tmp/.buildx-cache
mv /tmp/.buildx-cache-new /tmp/.buildx-cache

View file

@ -17,16 +17,48 @@ jobs:
- name: Checkout code
uses: actions/checkout@v4
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Cache Docker layers
- name: Setup Turbo cache
uses: actions/cache@v4
with:
path: /tmp/.buildx-cache
key: ${{ runner.os }}-buildx-updatetar
path: .turbo
key: ${{ runner.os }}-turbo-${{ github.sha }}
restore-keys: |
${{ runner.os }}-buildx-updatetar
${{ runner.os }}-turbo-
- name: Setup pnpm
uses: pnpm/action-setup@v4
with:
version: 10.11.0
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '22'
cache: 'pnpm'
- name: Install dependencies
run: pnpm install
- name: Build packages with Turbo
run: pnpm run build
- name: Verify build artifacts
run: |
echo "=== Verifying typesafe-db build ==="
ls -la packages/typesafe-db/lib/
echo "=== Verifying admin-ui build ==="
ls -la packages/admin-ui/build/
- name: Package production build
run: |
# Create production-ready server package using pnpm deploy
pnpm deploy --filter=./packages/server --prod lamassu-server --legacy
# Copy built admin UI to public directory
cp -r packages/admin-ui/build lamassu-server/public
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Login to DockerHub
uses: docker/login-action@v3
@ -34,7 +66,7 @@ jobs:
username: ${{ secrets.DOCKER_HUB_USERNAME }}
password: ${{ secrets.DOCKER_HUB_TOKEN }}
- name: Build and push
- name: Build and push server image
uses: docker/build-push-action@v5
with:
context: .
@ -42,10 +74,8 @@ jobs:
target: l-s
file: ./build/server.Dockerfile
tags: ${{ env.DOCKERHUB_SERVER_REPO }}:latest
cache-from: type=local,src=/tmp/.buildx-cache
cache-to: type=local,dest=/tmp/.buildx-cache-new
- name: Build and push
- name: Build and push admin server image
uses: docker/build-push-action@v5
with:
context: .
@ -53,10 +83,3 @@ jobs:
target: l-a-s
file: ./build/server.Dockerfile
tags: ${{ env.DOCKERHUB_ADMIN_REPO }}:latest
cache-from: type=local,src=/tmp/.buildx-cache
cache-to: type=local,dest=/tmp/.buildx-cache-new
- name: Move cache
run: |
rm -rf /tmp/.buildx-cache
mv /tmp/.buildx-cache-new /tmp/.buildx-cache

View file

@ -3,24 +3,38 @@ name: Tests
on:
pull_request:
branches: [ dev ]
push:
branches: [ dev ]
jobs:
test:
runs-on: ubuntu-latest
runs-on: ubuntu-20.04
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Setup Turbo cache
uses: actions/cache@v4
with:
path: .turbo
key: ${{ runner.os }}-turbo-${{ github.sha }}
restore-keys: |
${{ runner.os }}-turbo-
- name: Setup pnpm
uses: pnpm/action-setup@v4
with:
version: 10.11.0
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '22'
cache: 'npm'
cache: 'pnpm'
- name: Install dependencies
run: npm ci
run: pnpm install
- name: Run admin-ui tests
working-directory: packages/admin-ui
run: npm run test:run
- name: Run tests
run: pnpm run test

3
.gitignore vendored
View file

@ -1,9 +1,12 @@
**/node_modules
**/.env
.pnpm-store/
.idea/
.settings/
.turbo/
packages/server/.lamassu
packages/server/certs/
packages/server/tests/stress/machines
packages/server/tests/stress/config.json

View file

@ -1,9 +1,5 @@
#!/usr/bin/env sh
. "$(dirname -- "$0")/_/husky.sh"
# Run tests first
echo "Running tests..."
npm run test:run --workspace=packages/admin-ui
# Run linting
npx lint-staged

View file

@ -1,114 +0,0 @@
# Install - nix
## Preliminaries for using nix
For a dev environment with nix package manager a postgres install on the base system is required, this guide does not cover a postgresql server running with nix-shell.
### Set up PostgreSQL
```
sudo -u postgres createdb lamassu
sudo -u postgres psql postgres
```
In ``psql``, run the following and set password to ``postgres123``:
```
\password postgres
ctrl-d
```
### Starting up environment
shell.nix script provided, all you need to do to setup the environment is to run `nix-shell` on the folder.
## Installation
### Install node modules
```
npm install
```
### Generate certificates
```
bash packages/server/tools/cert-gen.sh
```
Notes:
- This will create a ``.lamassu`` directory in your home directory.
### Set up database
Important: lamassu-migrate currently gripes about a QueryResultError. Ignore this, it works anyway.
```
node packages/server/bin/lamassu-migrate
```
### Run new-lamassu-admin
```
cd packages/admin-ui/
npm run start
```
### Run lamassu-admin-server
In a second terminal window:
```
node packages/server/bin/lamassu-admin-server --dev
```
### Register admin user
In a third terminal window:
```
node packages/server/bin/lamassu-register admin@example.com superuser
```
You'll use this generated URL in the brower in a moment.
### Complete configuration
Paste the URL from lamassu-register exactly as output, into a browser (chrome or firefox).
**Important**: the host must be localhost. Tell your browser to trust the certificate even though it's not signed by a recognized CA. If you get an "expired" error, try opening https://localhost:8070/graphql in another tab and trust the certificate.
Go to all the required, unconfigured red fields and choose some values. Choose mock services whenever available.
### Run lamassu-server
```
node packages/server/bin/lamassu-server --mockScoring
```
### Add a lamassu-machine
Click on ``+ Add Machine`` in the sidebar. Type in a name for your machine and click **Pair**. Open up development tools to show the JavaScript console and copy the totem. You will use this to run lamassu-machine. This pairing totem expires after an hour.
Now continue with lamassu-machine instructions from the ``INSTALL.md`` file in [lamassu-machine repository](https://github.com/lamassu/lamassu-machine).
## Subsequent runs
To start the Lamassu server run:
```
node packages/server/bin/lamassu-server --mockScoring
```
To start the Lamassu Admin run:
```
node packages/server/bin/lamassu-admin-server --dev
```
and
```
cd packages/admin-ui/
npm run start
```

View file

@ -1,126 +0,0 @@
# Install
## Preliminaries for Ubuntu 16.04
Installation for other distros may be slightly different. This assumes NodeJS 22 or higher is already installed. All of this is done in the lamassu-server directory.
### Packages
```
sudo apt-get update
sudo apt-get install postgresql postgresql-contrib postgresql-server-dev-9.5 libpq-dev git
```
### Set up PostgreSQL
```
sudo -u postgres createdb lamassu
sudo -u postgres psql postgres
```
In ``psql``, run the following and set password to ``postgres123``:
```
\password postgres
ctrl-d
```
## Installation
### Install node modules
Make sure you're running NodeJS 22 or higher. Ignore any warnings.
```
npm install
```
### Generate certificates
```
bash packages/server/tools/cert-gen.sh
```
Notes:
- This will create a ``.lamassu`` directory in your home directory.
### Set up database
Important: lamassu-migrate currently gripes about a QueryResultError. Ignore this, it works anyway.
```
node packages/server/bin/lamassu-migrate
```
### Run new-lamassu-admin
```
cd packages/admin-ui/
npm run start
```
### Run lamassu-admin-server
In a second terminal window:
```
node packages/server/bin/lamassu-admin-server --dev
```
### Register admin user
In a third terminal window:
```
node packages/server/bin/lamassu-register admin@example.com superuser
```
You'll use this generated URL in the brower in a moment.
### Complete configuration
Paste the URL from lamassu-register exactly as output, into a browser (chrome or firefox).
**Important**: the host must be localhost. Tell your browser to trust the certificate even though it's not signed by a recognized CA. If you get an "expired" error, try opening https://localhost:8070/graphql in another tab and trust the certificate.
Go to all the required, unconfigured red fields and choose some values. Choose mock services whenever available.
### Run lamassu-server
```
node packages/server/bin/lamassu-server --mockScoring
```
### Add a lamassu-machine
Click on ``+ Add Machine`` in the sidebar. Type in a name for your machine and click **Pair**. Open up development tools to show the JavaScript console and copy the totem. You will use this to run lamassu-machine. This pairing totem expires after an hour.
Now continue with lamassu-machine instructions from the ``INSTALL.md`` file in [lamassu-machine repository](https://github.com/lamassu/lamassu-machine).
### Run a local coin node (BTC supported)
Run `node packages/server/bin/lamassu-coins` in the project root and select `Bitcoin`. This process will require the existence of certain environment variables that the setup will warn about.
Once that is done, the node needs to be run in a terminal with the following command `<YOUR_BLOCKCHAIN_DIR_ENV_VAR>/bin/bitcoind -datadir=<YOUR_BLOCKCHAIN_DIR_ENV_VAR>/bitcoin`
## Subsequent runs
To start the Lamassu server run:
```
node packages/server/bin/lamassu-server --mockScoring
```
To start the Lamassu Admin run:
```
node packages/server/bin/lamassu-admin-server --dev
```
and
```
cd packages/admin-ui/
npm run start
```

View file

@ -6,14 +6,57 @@ Lamassu remote server.
We do not generally accept outside pull requests for new features. Please consult with us before putting a lot of work into a pull request.
## Installation
## Development
See [INSTALL.md](INSTALL.md), or [INSTALL-NIX.md](INSTALL-NIX.md) for nix environment.
### Requirements
## Installation on remote server (only for production)
See [lamassu-remote-install/README.md](lamassu-remote-install/README.md).
- Nodejs 22
- PNPM 10+
- Postgres Database
- Python 3 (to be deprecated, required by a single dependency installation)
- OpenSSL (for cert-gen.sh, it will set up the server self-signed certificates)
There's a shell.nix file that you can use to set up your env in case you're a nix user.
There's also a .tool-versions for asdf and mise users.
This project uses Turbo for monorepo management. Install dependencies:
## Running
```bash
node bin/lamassu-server --mockScoring
pnpm install
```
Prepare environment files:
```bash
bash packages/server/tools/cert-gen.sh
```
On packages/server/.env you can alter variables such as the postgres connection info.
After configuring the postgres connection, run:
```bash
node packages/server/bin/lamassu-migrate
```
### Start development environment:
If you've already done the setup, you can run:
```bash
pnpm run dev
```
### Creating a user
```bash
node packages/server/bin/lamassu-register admin@example.com superuser
```
### Pairing a machine
To get the pairing token from the QRCode open the browser console before picking the name of the machine, the token should appear on the terminal.
It's also possible to inspect the qrCode, the token is on the data-cy="" attr.
Lastly, you can always scan it with a phone and copy the contents over.
Now continue with lamassu-machine instructions from the `INSTALL.md` file in [lamassu-machine repository](https://github.com/lamassu/lamassu-machine).

View file

@ -1,41 +0,0 @@
FROM node:22-alpine AS build-ui
RUN apk add --no-cache npm git curl build-base python3
COPY ["packages/admin-ui/package.json", "package-lock.json", "./"]
RUN npm version --allow-same-version --git-tag-version false --commit-hooks false 1.0.0
RUN npm install
COPY packages/admin-ui/ ./
RUN npm run build
FROM ubuntu:20.04 as base
ARG VERSION
ARG DEBIAN_FRONTEND=noninteractive
ENV TZ=Europe/Lisbon
RUN apt-get update
RUN apt-get install -y -q curl \
sudo \
git \
python2-minimal \
build-essential \
libpq-dev \
net-tools \
tar
RUN curl -sL https://deb.nodesource.com/setup_22.x | sudo -E bash -
RUN apt-get install nodejs -y -q
WORKDIR lamassu-server
COPY ["packages/server/package.json", "package-lock.json", "./"]
RUN npm version --allow-same-version --git-tag-version false --commit-hooks false 1.0.0
RUN npm install --production
COPY ./packages/server/ ./
COPY --from=build-ui /build /lamassu-server/public
RUN cd .. && tar -zcvf lamassu-server.tar.gz ./lamassu-server

View file

@ -2,20 +2,16 @@ version: "3.8"
services:
lamassu-server:
build:
context: .
dockerfile: build/server.Dockerfile
target: l-s
image: lamassu/lamassu-server:latest
restart: on-failure
ports:
- 3000:3000
network_mode: host
volumes:
- ./lamassu-data:/lamassu-data
environment:
- NODE_ENV=production
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=postgres123
- POSTGRES_HOST=host.docker.internal
- POSTGRES_HOST=localhost
- POSTGRES_PORT=5432
- POSTGRES_DB=lamassu
- CA_PATH=/lamassu-data/certs/Lamassu_OP_Root_CA.pem
@ -31,20 +27,16 @@ services:
- LOG_LEVEL=info
lamassu-admin-server:
build:
context: .
dockerfile: build/server.Dockerfile
target: l-a-s
image: lamassu/lamassu-admin-server:latest
restart: on-failure
ports:
- 443:443
network_mode: host
volumes:
- ./lamassu-data:/lamassu-data
environment:
- NODE_ENV=production
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=postgres123
- POSTGRES_HOST=host.docker.internal
- POSTGRES_HOST=localhost
- POSTGRES_PORT=5432
- POSTGRES_DB=lamassu
- CA_PATH=/lamassu-data/certs/Lamassu_OP_Root_CA.pem

View file

@ -1,49 +1,20 @@
FROM node:22-alpine AS build
RUN apk add --no-cache npm git curl build-base net-tools python3 postgresql-dev
FROM node:22-alpine AS base
RUN apk add --no-cache bash libpq openssl ca-certificates
WORKDIR /lamassu-server
COPY ["packages/server/package.json", "package-lock.json", "./"]
RUN npm version --allow-same-version --git-tag-version false --commit-hooks false 1.0.0
RUN npm install --production
# Copy the pre-built production package from CI (with node_modules)
COPY lamassu-server/ ./
COPY packages/server/ ./
FROM node:22-alpine AS l-s-base
RUN apk add --no-cache npm git curl bash libpq openssl ca-certificates
COPY --from=build /lamassu-server /lamassu-server
FROM l-s-base AS l-s
# Install production dependencies in the container
RUN npm install --omit=dev --ignore-scripts
FROM base AS l-s
RUN chmod +x /lamassu-server/bin/lamassu-server-entrypoint.sh
EXPOSE 3000
ENTRYPOINT [ "/lamassu-server/bin/lamassu-server-entrypoint.sh" ]
FROM node:22-alpine AS build-ui
RUN apk add --no-cache npm git curl build-base python3
WORKDIR /app
COPY ["packages/admin-ui/package.json", "package-lock.json", "./"]
RUN npm version --allow-same-version --git-tag-version false --commit-hooks false 1.0.0
RUN npm install
COPY packages/admin-ui/ ./
RUN npm run build
FROM l-s-base AS l-a-s
COPY --from=build-ui /app/build /lamassu-server/public
FROM base AS l-a-s
RUN chmod +x /lamassu-server/bin/lamassu-admin-server-entrypoint.sh
EXPOSE 443
ENTRYPOINT [ "/lamassu-server/bin/lamassu-admin-server-entrypoint.sh" ]

View file

@ -9,6 +9,7 @@ import pluginJest from 'eslint-plugin-jest'
export default defineConfig([
globalIgnores([
'**/.lamassu',
'**/build',
'**/package.json',
'**/package-lock.json',

29092
package-lock.json generated

File diff suppressed because it is too large Load diff

View file

@ -4,15 +4,15 @@
"version": "11.0.0-beta.1",
"license": "./LICENSE",
"author": "Lamassu (https://lamassu.is)",
"packageManager": "pnpm@10.11.0",
"repository": {
"type": "git",
"url": "https://github.com/lamassu/lamassu-server.git"
},
"workspaces": [
"packages/server",
"packages/admin-ui",
"packages/typesafe-db"
],
"engines": {
"node": ">=22.0.0"
},
"workspaces": [],
"devDependencies": {
"@eslint/css": "^0.7.0",
"@eslint/js": "^9.26.0",
@ -25,10 +25,20 @@
"globals": "^16.1.0",
"husky": "^8.0.0",
"lint-staged": "^16.0.0",
"prettier": "^3.5.3"
"prettier": "^3.5.3",
"turbo": "^2.5.3"
},
"scripts": {
"prepare": "husky install"
"prepare": "husky install",
"build": "turbo build",
"dev": "turbo dev",
"start": "turbo start",
"test": "turbo test",
"clean": "turbo clean",
"server:dev": "turbo dev --filter=lamassu-server",
"admin:dev": "turbo dev --filter=lamassu-admin",
"typesafe-db:build": "turbo build --filter=typesafe-db",
"typesafe-db:dev": "turbo dev --filter=typesafe-db"
},
"husky": {
"hooks": {

View file

@ -10,31 +10,27 @@ To take advantage of that make sure to run `git commit` from within this folder.
## Available Scripts
In the project directory, you can run:
From the root directory (recommended with Turbo):
### `npm start`
- `pnpm run dev` - Start development environment
- `pnpm run build` - Build for production
- `pnpm run admin:dev` - Start only admin UI development
Runs the app in the development mode.<br>
Open [http://localhost:3000](http://localhost:3000) to view it in the browser.
In the admin-ui package directory, you can run:
The page will reload if you make edits.<br>
### `pnpm start` or `pnpm run dev`
Runs the app in development mode with Vite.
Open [http://localhost:5173](http://localhost:5173) to view it in the browser.
The page will reload if you make edits.
You will also see any lint errors in the console.
### `npm fix`
### `pnpm test`
Runs eslint --fix on the src folder
Launches the test runner with vitest.
### `npm test`
### `pnpm run build`
Launches the test runner in the interactive watch mode.<br>
See the section about [running tests](https://facebook.github.io/create-react-app/docs/running-tests) for more information.
### `npm run build`
Builds the app for production to the `build` folder.<br>
Builds the app for production to the `build` folder.
It correctly bundles React in production mode and optimizes the build for the best performance.
The build is minified and the filenames include the hashes.<br>
Your app is ready to be deployed!
See the section about [deployment](https://facebook.github.io/create-react-app/docs/deployment) for more information.

View file

@ -56,6 +56,7 @@
},
"scripts": {
"start": "vite",
"dev": "vite",
"build": "vite build",
"preview": "vite preview",
"test": "vitest",

View file

@ -1,4 +1,3 @@
import PropTypes from 'prop-types'
import React from 'react'
import Paper from '@mui/material/Paper'
@ -18,9 +17,5 @@ const CollapsibleCard = ({ className, state, shrunkComponent, children }) => {
)
}
CollapsibleCard.propTypes = {
shrunkComponent: PropTypes.node.isRequired,
}
export default CollapsibleCard
export { cardState }

View file

@ -0,0 +1,52 @@
-----BEGIN PRIVATE KEY-----
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
FMgzEYeX0l+6C9iJufa/MKhajPUtXg==
-----END PRIVATE KEY-----

View file

@ -0,0 +1,30 @@
-----BEGIN CERTIFICATE-----
MIIFNDCCAxwCFGweNB6EP0jxoN18cP4xsaQ8TfYJMA0GCSqGSIb3DQEBCwUAMF0x
CzAJBgNVBAYTAklTMRIwEAYDVQQHDAlSZXlramF2aWsxHDAaBgNVBAoME0xhbWFz
c3UgT3BlcmF0b3IgQ0ExHDAaBgNVBAMME2xhbWFzc3Utb3BlcmF0b3IuaXMwHhcN
MjUwNTEzMTIyMDE2WhcNMzUwNTExMTIyMDE2WjBQMQswCQYDVQQGEwJJUzESMBAG
A1UEBwwJUmV5a2phdmlrMRkwFwYDVQQKDBBMYW1hc3N1IE9wZXJhdG9yMRIwEAYD
VQQDDAlsb2NhbGhvc3QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCw
yTzTYjzn1un9tfiATtdVGTfnRQjTPTC8388fvhQKhF3ymdsxql7b5UPaRN3GD1V/
AVTeKRlj2heQ6Ffyi278T16moV9N11hU1I1e5TRSMKzqPwbZfyoCaSXBG9i5SnhZ
uUJz6g2JzCRB5JiXV8b1fKxRsfwJgdEp+/BZRqS1yJNMfnK3b39flFWgR375k/4L
XdGrWHQmqkCn5Mcu7RFn0/V2MbU9GdPNRDPtRdqfh9khMs1o7EBPKY9P5EyMZob0
MJ0ODA4nRFqjRvpm/I+8x0ePMOehcm612qmYc5lvZIiayonRfrt1NsUChEaGmN2a
p5UEHMll7iVXtEUdiBQYAcy36WWONzvx3NcMi+6FZ98DJ/NI4z3NwvYnbJdh+3F7
8VCQiJesqQsj3RDwL8cKohtSUMAfATXGrzymzJm6sgCaBrKy96BIWhUsu0Z/9En+
/YKJYqBBLeyuWJrTQ+1AR/pyfxmWymWWxGrN98TkEDl/gdNYg6vng17fZWwv6eL8
v5M5wYxsjlcdakHmIUEROtyQZ+IyyfGC02jPXuEGTxvpqO7J4SOqLfBTQyh1btxv
oq+PiyZayEPdfqoGma7ULng63ld0vodQW1ojlFccqJB0fBYW2lws4Z2k8vJtrq0c
AtJtSWU5H1NVaSe3YzzggjuQUqiZintqBMx4uTqG3QIDAQABMA0GCSqGSIb3DQEB
CwUAA4ICAQB0oianP/VHyMLkPzFnRxGmYw6nZDZXKCvpq1qFAm93oc3yZ/Lk7xpY
kULUaGBcSa3QBe7EBl7pumtrPVb3RNlKnrD4/d2biM+b6T43yB279AEFrOXKIGa8
ZUN1NQ1rGAQ6rA5QWDGh26VKnMts9CXqO/QXOOTG1IZpd5G+f4XQCAI+fhOi5uQG
f8oTJ6uAllCaa85mDwxo/vPyz5nR+3JtcHIUggcxvRUL9TaGf/DERZO6nILgjuws
jwSTWzTfBWRld4ZXME/e2W2T0hMUnuH/KoHGxEBgLQvwS6qmQgm9Y7eBEujEe/3O
CxfGjGlO/gxDUjL3D9bY4LD32u4vmzkHQAfDPFq+Nkd5mPupFBK5RT8AeYJpQooU
7uqr3KDa7zuUtdLpPDok5cHgw+faqoi7EhDF7b0W6IxgNpXzMliRK9zPPHRLNqus
zz+9uAO9zxfNAF1UlFXQgERe0zvalp5faGPcSUJYMLOCQJcCUWIdLxhkW5XRF5kN
pbxTE768U/iBgVT0hnV5kHyhjUdyNkdg7azj4ouOXNtNpBoY9trkXjc7aWephU06
KQOu4XPxEOTGox/fcwyzLgJBH0gXt26Ig+p+PhH+IIlwsAd4iL01XxP5z3qrEcEg
3QcWBsRrjbGX5mP8p6Sg4qF759qRGq+wpySCDeManZBtMqlkuipWhQ==
-----END CERTIFICATE-----

View file

@ -0,0 +1,52 @@
-----BEGIN PRIVATE KEY-----
MIIJQQIBADANBgkqhkiG9w0BAQEFAASCCSswggknAgEAAoICAQC0cf1TwumFeQ25
BmyTUW1sEMmPUdBh4tLKnJ/iL9uOvLICA0qYUGQ/YHtOfGxmB4jlstWE18Ep8Oib
wv3UjpDrjJuSeqPBemljNK044gWehNkReUjQOvFuYMwX77geAyzKor8o2UsOoRMO
LjINh/CNS+b+xfbP1puMw2cmjJMk5V0Qd2ZlcYkTycuqbGwNOYwAssQn3zxXE6Ym
qwhLB+xWpprs/tmnyctIixOlQW9C7y4ID4Sm+LKAUt8HMO+1qGwtesSvdVNaBf7Q
g6Mf7L8im18zVWkDvYEdtYn09iaJgan/JLdPqZdp2nWUP3cFeohXPqpVdcjx+wrR
Lv9BzBlw3c2U/FyfHy0vHTPx0n0GAe5GtACPdCmJlOfCmOmzQhjmf8/Sr0RlHB3E
NekFelsKmKmko8l+P5XJEY02fOuuKttEd+KuY7VWJf14N0OZLUoKZ7ihhT6Rywqq
UbVp6gtLAFR46li7L5ETecA/eA27azB6+A3IytObt4Le1DCFpVJ0BRLEVO46PKHL
uXt8Ia9dk75++e8cYzmtpYz5E147z4w5ubDJG6zlUQhudMXv/078p4rGuSxBF/k/
bwOCVPdUFjWIFJZiNwWuHQNMJswpphX8TNphV4fyJLCGcZcbrVwbNyNN2TV+2Xke
zlKFIGmbz5CQuHJSAZdU0phWgjyeDQIDAQABAoICAAJiwXEykgjYPWS1X4khGfvE
Sw3wjHtG1vej039Xl6UO/KGHLpzN701hNrAmd/5vWhGDaExN1/l4fHLWxKljSyo6
HTJ2GaUsu6j6oNGwN1fNtNsEygAqz1dgw0ILwtjuvNBfD3z4RoRGf+x/ktzX78fG
eaLjtiwwT7UwPjRlxmpF+BGIKpvrwN64m89AiLsyCBZYRryqOG+ETH2VZFItpCPP
Jxw8EF+mDOCEKjnUoCZ36BlmLyBQCHgm4FkFfh3eQLPnPCN/vx7hFmnmW6lH5Y0N
FdilZ/KLNmJQrKbG/GJ0Cu3bK+tLODvHjidsIWQ6pwPUScdAe+wrIAz8/JX/n1R3
bf4e0f9NlxPi32/KuFJfiRrl+sLfRn3R9moZgsmyAh16dURicYvCynryqpNy2M6o
EUXBeTEfKUCj7YCYpxNhn1yhM21508kCB7uwrP+jyz6DVn0OBsWte/fa2BvH0Mdx
xF8dIs7/GLRwdRMzgJ7aFrIoRDA50HqK+615X02lGm8BNPz2UqCwB9BpLVvBO0m8
GEQpMeJ9tAJjqCZgP/cnAAo+8eXyhPvziiR7taTv5AciX8INEK9SHSMhsffwqeOz
A3F2G/SpCfIC20CdgCXlosB7acnIPPvftgxDRFvrC/VxAtpS5D8Vn5aH+esTm4MA
xLwBhisnNyIsDkrBiZ3HAoIBAQD/BGUawsSOEwb0thPl+RTmfAxPUWTnWpkV4jGc
wtRWIIIIGVLIqqbLAsjvy0V6wAmRxy0qD8ZFImxp68EoLJMEeCiqeRSKOSFH9v+s
Yo69lFiNq2UD4iizmjRPXcgke1yzGxWJmV5vrhb5jcepijCZzMFlggG3wyDjyQMp
gfWxGbGHuSI+popanwg/LQiFeDvuiVUPN+YpuoM1iy5oPmFJByUsVD15y50PEhGL
j/GFCSNOYn47pQL6wBF4nlCQvGb50Rkn5IuThOOVHKHno75ymsO0WogB8TKVkG65
2qR5jaPBx8Q+5aqq8eUSfXhsQrbW1BW4wlqd3V/iZoqxsyRzAoIBAQC1JAU+xyrm
qu4eWewPDGiB+IaXmcpff5XPKi7F0ueMvxStQ1Luc0aQQjRmBE7d/04skwuRFK+/
17kTIRT4qmpFCoykehftf4FLHqHIkhCN4Qiv82q8y7tL1km/lVeja89qFYb59PIf
jNrFxPXKIohkgVgWgZZTaQG1FSmAND6WZVboTVKFfLc43ryvaAcCRxhfoYPj6DM+
hOZKB/x63dnx2yD3FkMgM5JCOuYKHW3ZRIMbvMO93WXDRhtAX7BS+o98EsBNn7yk
NeHIFOj0CbkdIarh/AY7zo24Nv9AMbOAEReYuT2/9bntCXgzWm0CkMcMm8DLV7mH
Y95txInVcxN/AoIBAAwYBUNzoSaruFS6nc72NQuJLnxEe+iM312uUHQCuVcsS35e
1RI3JZnTE/xrQ2xC1zFWpMmt3dVBgKq1R3/EPWSk3ijXfSXg97cV+6INOn+7HUf6
rNu2Sf/afEiXRfqU7xx/WFIiN9xMAULsel+L8ioZD8Lkm3g/hLvIuKGrTB+N/GFX
YkxeUYliqV11oUXTIeR6FtKV8BBii/5qD1VaP/ran+SuSgwQn+4rCTH5LZcFi+sX
uKzTcoS5vxpdR6zVgnyuceb2a7gfQTu9E+CMX2fH9ygCcxjEe4WkR9wAhnRNR0rV
UnU5JxLcTeTGloNr1ofxnuYYMXvzF60A9+rdeAkCggEAcPqieuFmlLCQDEYxwcEP
feEwsWWun5nIKoo42hINce/MSbTwCOHFZTylyett9XDDpXGhiT/JznIScSf1GJPR
7HYD+qJcQjmAvwXACoVv5c4xyOyd6lt32nkxTlkrbDZWC+iZY1WvnpYP7cJHO2gG
gglak88Hn8ai1fr5A4mSb+ONLR7tFW0QKlxie1T66iTFwv/Ob1voeloR+KK6izfM
M9lk2jf8bh08YCq0SCLK3PSqgaZewBFS41Tasm/8XgUBcXWQk9nJovIofM7t7SgT
WWQiXQkAKlVOd1N2KOfW+U2v1gXTyeLNsFZzrjP8QdljDS4oNavlf9h+ZyBqh8Na
qQKCAQA2nbNFD9CDTek4MyfgKj8wuCfRheqfUqoEPLl7b8qIuBPWFnEZFsdogmcK
j2M2UOHFUf0KELc9/7LN8nQIb/uAyAZc1O1R+1BxBURmpXlDGX3FYAbLx2KdZxPs
+iPtVL74NQmT/MCMvEEa2k92dusuN00bRssUUnAwqdWKEB+LjAO7/67lB0j+Sl+5
yzkfWxyulie5NXDlxRCet3bR9DbbF3MBZ79dRw8sKtGSC/SJdxrPQLw6JV97QlCz
MeTUIV1x5ZZCfLOwmx1rGCRCMThgjeoNWlr9gd62+v5E9hFYon8ZTqXyltnOunZs
LfwveRB3xlGoXUUiTxU6XT8m/5Xa
-----END PRIVATE KEY-----

View file

@ -0,0 +1,32 @@
-----BEGIN CERTIFICATE-----
MIIFmzCCA4OgAwIBAgIUHNAr9OGMPZJMa4o02pAYw1Vh9WUwDQYJKoZIhvcNAQEL
BQAwXTELMAkGA1UEBhMCSVMxEjAQBgNVBAcMCVJleWtqYXZpazEcMBoGA1UECgwT
TGFtYXNzdSBPcGVyYXRvciBDQTEcMBoGA1UEAwwTbGFtYXNzdS1vcGVyYXRvci5p
czAeFw0yNTA1MTMxMjIwMTVaFw0zNTAyMTAxMjIwMTVaMF0xCzAJBgNVBAYTAklT
MRIwEAYDVQQHDAlSZXlramF2aWsxHDAaBgNVBAoME0xhbWFzc3UgT3BlcmF0b3Ig
Q0ExHDAaBgNVBAMME2xhbWFzc3Utb3BlcmF0b3IuaXMwggIiMA0GCSqGSIb3DQEB
AQUAA4ICDwAwggIKAoICAQC0cf1TwumFeQ25BmyTUW1sEMmPUdBh4tLKnJ/iL9uO
vLICA0qYUGQ/YHtOfGxmB4jlstWE18Ep8Oibwv3UjpDrjJuSeqPBemljNK044gWe
hNkReUjQOvFuYMwX77geAyzKor8o2UsOoRMOLjINh/CNS+b+xfbP1puMw2cmjJMk
5V0Qd2ZlcYkTycuqbGwNOYwAssQn3zxXE6YmqwhLB+xWpprs/tmnyctIixOlQW9C
7y4ID4Sm+LKAUt8HMO+1qGwtesSvdVNaBf7Qg6Mf7L8im18zVWkDvYEdtYn09iaJ
gan/JLdPqZdp2nWUP3cFeohXPqpVdcjx+wrRLv9BzBlw3c2U/FyfHy0vHTPx0n0G
Ae5GtACPdCmJlOfCmOmzQhjmf8/Sr0RlHB3ENekFelsKmKmko8l+P5XJEY02fOuu
KttEd+KuY7VWJf14N0OZLUoKZ7ihhT6RywqqUbVp6gtLAFR46li7L5ETecA/eA27
azB6+A3IytObt4Le1DCFpVJ0BRLEVO46PKHLuXt8Ia9dk75++e8cYzmtpYz5E147
z4w5ubDJG6zlUQhudMXv/078p4rGuSxBF/k/bwOCVPdUFjWIFJZiNwWuHQNMJswp
phX8TNphV4fyJLCGcZcbrVwbNyNN2TV+2XkezlKFIGmbz5CQuHJSAZdU0phWgjye
DQIDAQABo1MwUTAdBgNVHQ4EFgQU6MWdCetFNYu59oXnuIXbIEWgz5IwHwYDVR0j
BBgwFoAU6MWdCetFNYu59oXnuIXbIEWgz5IwDwYDVR0TAQH/BAUwAwEB/zANBgkq
hkiG9w0BAQsFAAOCAgEALIjd9FDtsP5sIp0XMcBMpMFj7J07hUpiK0IkCEdwLEY0
K1bLzIyFvqfN7cN69QS2xyXhDsycUib4Vgt2+wX1NOw/JkLUIy/dcYcXZZZYM1fr
CI+gAzGuD1GlajBcNLFqzraFwcydRON8Hrq+y6MVOyCHSmQ6QRx0IWLBLknfkH9M
X6RywfNeOJIdA4ds1/agihaUq1V0pnsMJBxrOdOw5Pjs0LmK1PT5WJ/yOlHOy4mv
cU/PaiUQSZILVOd8pzzUKH81XqBK9QQIlABuQeFwljuTKcmC6wM6ABDJRkER3Msr
7RwvZWg/ARhF3ROIqNokQRtBoNLOSM/vaLNMZ85mRBMRnmiTAXoeRPC+2UcjWGnD
WIpP12YvX5G1xQ8pAXjAinBPCTvAUgnV3RWx69XJliOn9W5kPhpTCC1ejK+ARiyl
CwOuvrI6N5xcVJ76ZvsNOgCr2d+H6nvhyKWSaQITZuZkq1DaMWKTV8PW/w44oMpm
RJAHDeIBn99IJrTMLREflfJqlbcr3u6td+dFLqMPzKi/K3UyQdUhXdUL0mznJiEN
N9mkrjoD4gc1VxedcMKRP5voWXq6jKT3g2ho2H1/TcDAMDgI/k4iEAXX18Tjdudx
0qMsFqfQfdS1oswWr8gpw9OnWmIN1jXtkjWIYguBAJYs5p27NZwGgism6jz0Xw8=
-----END CERTIFICATE-----

View file

@ -0,0 +1 @@
6C1E341E843F48F1A0DD7C70FE31B1A43C4DF609

View file

@ -16,7 +16,9 @@ const sms = require('./sms')
const settingsLoader = require('./new-settings-loader')
const logger = require('./logger')
const externalCompliance = require('./compliance-external')
const { getCustomerList } = require('typesafe-db/lib/customers')
const {
customers: { getCustomerList },
} = require('typesafe-db')
const { APPROVED, RETRY } = require('./plugins/compliance/consts')

View file

@ -9,7 +9,6 @@ const eventBus = require('./event-bus')
const DATABASE_NOT_REACHABLE = 'Database not reachable.'
const pgp = Pgp({
pgNative: true,
schema: 'public',
error: (err, e) => {
if (e.cn) logger.error(DATABASE_NOT_REACHABLE)

View file

@ -0,0 +1,12 @@
const db = require('./db')
exports.up = next =>
db.multi(
[
`CREATE INDEX cash_in_txs_customer_id_idx ON cash_in_txs (customer_id);`,
`CREATE INDEX cash_out_txs_customer_id_idx ON cash_out_txs (customer_id);`,
],
next,
)
exports.down = next => next()

View file

@ -76,7 +76,6 @@
"p-each-series": "^1.0.0",
"p-queue": "^6.6.2",
"p-retry": "^4.4.0",
"pg-native": "^3.0.0",
"pg-promise": "^10.10.2",
"pify": "^3.0.0",
"pretty-ms": "^2.1.0",
@ -87,6 +86,7 @@
"serve-static": "^1.12.4",
"talisman": "^0.20.0",
"telnyx": "^1.25.5",
"typesafe-db": "workspace:*",
"tronweb": "^5.3.0",
"twilio": "^3.6.1",
"uuid": "8.3.2",
@ -126,7 +126,9 @@
"lamassu-clean-parsed-id": "./bin/lamassu-clean-parsed-id"
},
"scripts": {
"build": "echo 'Server requires no build step'",
"start": "node bin/lamassu-server",
"dev": "concurrently \"npm:server\" \"npm:admin-server\"",
"test": "mocha --recursive tests",
"jtest": "jest --detectOpenHandles",
"build-admin": "npm run build-admin:css && npm run build-admin:main && npm run build-admin:lamassu",

View file

@ -1,10 +1,12 @@
const fs = require('fs')
const os = require('os')
const path = require('path')
const setEnvVariable = require('./set-env-var')
fs.copyFileSync(path.resolve(__dirname, '../.sample.env'), path.resolve(__dirname, '../.env'))
fs.copyFileSync(
path.resolve(__dirname, '../.sample.env'),
path.resolve(__dirname, '../.env'),
)
setEnvVariable('NODE_ENV', 'development')
@ -18,13 +20,16 @@ setEnvVariable('CA_PATH', `${process.env.PWD}/certs/Lamassu_OP_Root_CA.pem`)
setEnvVariable('CERT_PATH', `${process.env.PWD}/certs/Lamassu_OP.pem`)
setEnvVariable('KEY_PATH', `${process.env.PWD}/certs/Lamassu_OP.key`)
setEnvVariable('MNEMONIC_PATH', `${process.env.HOME}/.lamassu/mnemonics/mnemonic.txt`)
setEnvVariable(
'MNEMONIC_PATH',
`${process.env.PWD}/.lamassu/mnemonics/mnemonic.txt`,
)
setEnvVariable('BLOCKCHAIN_DIR', `${process.env.PWD}/blockchains`)
setEnvVariable('OFAC_DATA_DIR', `${process.env.HOME}/.lamassu/ofac`)
setEnvVariable('ID_PHOTO_CARD_DIR', `${process.env.HOME}/.lamassu/idphotocard`)
setEnvVariable('FRONT_CAMERA_DIR', `${process.env.HOME}/.lamassu/frontcamera`)
setEnvVariable('OPERATOR_DATA_DIR', `${process.env.HOME}/.lamassu/operatordata`)
setEnvVariable('OFAC_DATA_DIR', `${process.env.PWD}/.lamassu/ofac`)
setEnvVariable('ID_PHOTO_CARD_DIR', `${process.env.PWD}/.lamassu/idphotocard`)
setEnvVariable('FRONT_CAMERA_DIR', `${process.env.PWD}/.lamassu/frontcamera`)
setEnvVariable('OPERATOR_DATA_DIR', `${process.env.PWD}/.lamassu/operatordata`)
setEnvVariable('BTC_NODE_LOCATION', 'remote')
setEnvVariable('BTC_WALLET_LOCATION', 'local')

View file

@ -5,11 +5,13 @@ set -e
DOMAIN=localhost
[ ! -z "$1" ] && DOMAIN=$1
CONFIG_DIR=$HOME/.lamassu
SERVER_DIR="$(cd "$(dirname "$0")/.." && pwd)"
CONFIG_DIR=$SERVER_DIR/.lamassu
LOG_FILE=/tmp/cert-gen.log
CERT_DIR=$PWD/certs
KEY_DIR=$PWD/certs
LAMASSU_CA_PATH=$PWD/Lamassu_CA.pem
CERT_DIR=$SERVER_DIR/certs
KEY_DIR=$SERVER_DIR/certs
LAMASSU_CA_PATH=$SERVER_DIR/Lamassu_CA.pem
POSTGRES_PASS=postgres123
OFAC_DATA_DIR=$CONFIG_DIR/ofac
IDPHOTOCARD_DIR=$CONFIG_DIR/idphotocard
@ -24,7 +26,7 @@ MNEMONIC_DIR=$CONFIG_DIR/mnemonics
MNEMONIC_FILE=$MNEMONIC_DIR/mnemonic.txt
mkdir -p $MNEMONIC_DIR >> $LOG_FILE 2>&1
SEED=$(openssl rand -hex 32)
MNEMONIC=$($PWD/bin/bip39 $SEED)
MNEMONIC=$($SERVER_DIR/bin/bip39 $SEED)
echo "$MNEMONIC" > $MNEMONIC_FILE
echo "Generating SSL certificates..."
@ -90,6 +92,6 @@ rm /tmp/Lamassu_OP.csr.pem
mkdir -p $OFAC_DATA_DIR/sources
touch $OFAC_DATA_DIR/etags.json
node tools/build-dev-env.js
(cd $SERVER_DIR && node tools/build-dev-env.js)
echo "Done."

View file

@ -4,14 +4,23 @@
"license": "../LICENSE",
"type": "module",
"devDependencies": {
"@types/node": "^22.0.0",
"@types/pg": "^8.11.10",
"kysely-codegen": "^0.18.5",
"typescript": "^5.8.3"
},
"exports": {
".": {
"types": "./src/index.ts",
"default": "./lib/index.js"
}
},
"scripts": {
"build": "tsc",
"build": "tsc --build",
"start": "tsc --watch",
"clean": "rm -rf lib",
"generate-types": "kysely-codegen --camel-case --out-file ./src/types/types.d.ts"
"dev": "tsc --watch",
"generate-types": "kysely-codegen --camel-case --out-file ./src/types/types.d.ts",
"postinstall": "npm run build"
},
"dependencies": {
"kysely": "^0.28.2",

View file

@ -1,7 +1,14 @@
import { DB } from './types/types.js'
import { Pool } from 'pg'
import { Kysely, PostgresDialect, CamelCasePlugin } from 'kysely'
import { PSQL_URL } from 'lamassu-server/lib/constants.js'
const POSTGRES_USER = process.env.POSTGRES_USER
const POSTGRES_PASSWORD = process.env.POSTGRES_PASSWORD
const POSTGRES_HOST = process.env.POSTGRES_HOST
const POSTGRES_PORT = process.env.POSTGRES_PORT
const POSTGRES_DB = process.env.POSTGRES_DB
const PSQL_URL = `postgres://${POSTGRES_USER}:${POSTGRES_PASSWORD}@${POSTGRES_HOST}:${POSTGRES_PORT}/${POSTGRES_DB}`
const dialect = new PostgresDialect({
pool: new Pool({
@ -13,12 +20,4 @@ const dialect = new PostgresDialect({
export default new Kysely<DB>({
dialect,
plugins: [new CamelCasePlugin()],
log(event) {
if (event.level === 'query') {
console.log('Query:', event.query.sql)
console.log('Parameters:', event.query.parameters)
console.log('Duration:', event.queryDurationMillis + 'ms')
console.log('---')
}
},
})

View file

@ -0,0 +1 @@
export * as customers from './customers.js'

View file

@ -2,18 +2,17 @@
"$schema": "https://json.schemastore.org/tsconfig",
"display": "Node 22",
"_version": "22.0.0",
"compilerOptions": {
"lib": ["es2023"],
"types": ["node"],
"module": "nodenext",
"target": "es2022",
"allowJs": true,
"strict": true,
"esModuleInterop": true,
"skipLibCheck": true,
"moduleResolution": "node16",
"noEmit": false,
"outDir": "./lib",
"declaration": true,
"declarationMap": true,

18581
pnpm-lock.yaml generated Normal file

File diff suppressed because it is too large Load diff

4
pnpm-workspace.yaml Normal file
View file

@ -0,0 +1,4 @@
packages:
- 'packages/server'
- 'packages/admin-ui'
- 'packages/typesafe-db'

View file

@ -1,18 +1,18 @@
with import (fetchTarball {
name = "nixpkgs-194846768975b7ad2c4988bdb82572c00222c0d7";
url = https://github.com/NixOS/nixpkgs/archive/194846768975b7ad2c4988bdb82572c00222c0d7.tar.gz;
sha256 = "0snj72i9dm99jlnnmk8id8ffjnfg1k81lr7aw8d01kz3hdiraqil";
name = "nixpkgs-21808d22b1cda1898b71cf1a1beb524a97add2c4";
url = "https://github.com/NixOS/nixpkgs/archive/21808d22b1cda1898b71cf1a1beb524a97add2c4.tar.gz";
sha256 = "0v2z6jphhbk1ik7fqhlfnihcyff5np9wb3pv19j9qb9mpildx0cg";
}) {};
stdenv.mkDerivation {
name = "node";
buildInputs = [
nodejs_22
python3
openssl
postgresql
];
shellHook = ''
export PATH="$PWD/node_modules/.bin/:$PATH"
'';
}
name = "node";
buildInputs = [
nodejs_22
python3
openssl
pnpm_10
];
shellHook = ''
export PATH="$PWD/node_modules/.bin/:$PATH"
'';
}

48
turbo.json Normal file
View file

@ -0,0 +1,48 @@
{
"$schema": "https://turbo.build/schema.json",
"remoteCache": {
"enabled": true
},
"tasks": {
"build": {
"dependsOn": ["^build"],
"inputs": [
"src/**",
"lib/**",
"public/**",
"index.html",
"vite.config.js",
"tsconfig.json",
"package.json"
],
"outputs": ["lib/**", "dist/**", "build/**"]
},
"start": {
"dependsOn": ["^build"],
"cache": false,
"persistent": true
},
"dev": {
"dependsOn": ["^build"],
"cache": false,
"persistent": true
},
"watch": {
"dependsOn": ["^build"],
"cache": false,
"persistent": true
},
"test": {
"dependsOn": ["^build"],
"inputs": ["src/**", "tests/**", "lib/**", "package.json"],
"outputs": []
},
"clean": {
"cache": false
},
"generate-types": {
"inputs": ["src/**", "package.json"],
"outputs": ["src/types/**"]
}
}
}