Merge pull request #2096 from erikarvstedt/backend-packaging
Simplify packaging for backend
This commit is contained in:
		
						commit
						11d6b372ba
					
				@ -110,6 +110,11 @@ Run the Mempool backend:
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
npm run start
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
You can also set env var `MEMPOOL_CONFIG_FILE` to specify a custom config file location:
 | 
			
		||||
```
 | 
			
		||||
MEMPOOL_CONFIG_FILE=/path/to/mempool-config.json npm run start
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
When it's running, you should see output like this:
 | 
			
		||||
 | 
			
		||||
@ -22,7 +22,10 @@
 | 
			
		||||
  "main": "index.ts",
 | 
			
		||||
  "scripts": {
 | 
			
		||||
    "tsc": "./node_modules/typescript/bin/tsc -p tsconfig.build.json",
 | 
			
		||||
    "build": "npm run tsc",
 | 
			
		||||
    "build": "npm run tsc && npm run create-resources",
 | 
			
		||||
    "create-resources": "cp ./src/tasks/price-feeds/mtgox-weekly.json ./dist/tasks && node dist/api/fetch-version.js",
 | 
			
		||||
    "package": "npm run build && rm -rf package && mv dist package && mv node_modules package && npm run package-rm-build-deps",
 | 
			
		||||
    "package-rm-build-deps": "(cd package/node_modules; rm -r typescript @typescript-eslint)",
 | 
			
		||||
    "start": "node --max-old-space-size=2048 dist/index.js",
 | 
			
		||||
    "start-production": "node --max-old-space-size=4096 dist/index.js",
 | 
			
		||||
    "test": "./node_modules/.bin/jest --coverage",
 | 
			
		||||
 | 
			
		||||
@ -1,60 +1,37 @@
 | 
			
		||||
import * as fs from 'fs';
 | 
			
		||||
import * as os from 'os';
 | 
			
		||||
import logger from '../logger';
 | 
			
		||||
import fs from 'fs';
 | 
			
		||||
import path from 'path';
 | 
			
		||||
import os from 'os';
 | 
			
		||||
import { IBackendInfo } from '../mempool.interfaces';
 | 
			
		||||
const { spawnSync } = require('child_process');
 | 
			
		||||
 | 
			
		||||
class BackendInfo {
 | 
			
		||||
  private gitCommitHash = '';
 | 
			
		||||
  private hostname = '';
 | 
			
		||||
  private version = '';
 | 
			
		||||
  private backendInfo: IBackendInfo;
 | 
			
		||||
 | 
			
		||||
  constructor() {
 | 
			
		||||
    this.setLatestCommitHash();
 | 
			
		||||
    this.setVersion();
 | 
			
		||||
    this.hostname = os.hostname();
 | 
			
		||||
    // This file is created by ./fetch-version.ts during building
 | 
			
		||||
    const versionFile = path.join(__dirname, 'version.json')
 | 
			
		||||
    var versionInfo;
 | 
			
		||||
    if (fs.existsSync(versionFile)) {
 | 
			
		||||
      versionInfo = JSON.parse(fs.readFileSync(versionFile).toString());
 | 
			
		||||
    } else {
 | 
			
		||||
      // Use dummy values if `versionFile` doesn't exist (e.g., during testing)
 | 
			
		||||
      versionInfo = {
 | 
			
		||||
        version: '?',
 | 
			
		||||
        gitCommit: '?'
 | 
			
		||||
      };
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  public getBackendInfo(): IBackendInfo {
 | 
			
		||||
    return {
 | 
			
		||||
      hostname: this.hostname,
 | 
			
		||||
      gitCommit: this.gitCommitHash,
 | 
			
		||||
      version: this.version,
 | 
			
		||||
    this.backendInfo = {
 | 
			
		||||
      hostname: os.hostname(),
 | 
			
		||||
      version: versionInfo.version,
 | 
			
		||||
      gitCommit: versionInfo.gitCommit
 | 
			
		||||
    };
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  public getBackendInfo(): IBackendInfo {
 | 
			
		||||
    return this.backendInfo;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  public getShortCommitHash() {
 | 
			
		||||
    return this.gitCommitHash.slice(0, 7);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  private setLatestCommitHash(): void {
 | 
			
		||||
    //TODO: share this logic with `generate-config.js`
 | 
			
		||||
    if (process.env.DOCKER_COMMIT_HASH) {
 | 
			
		||||
      this.gitCommitHash = process.env.DOCKER_COMMIT_HASH;
 | 
			
		||||
    } else {
 | 
			
		||||
      try {
 | 
			
		||||
        const gitRevParse = spawnSync('git', ['rev-parse', '--short', 'HEAD']);
 | 
			
		||||
        if (!gitRevParse.error) {
 | 
			
		||||
          const output = gitRevParse.stdout.toString('utf-8').replace(/[\n\r\s]+$/, '');
 | 
			
		||||
          this.gitCommitHash = output ? output : '?';
 | 
			
		||||
        } else if (gitRevParse.error.code === 'ENOENT') {
 | 
			
		||||
          console.log('git not found, cannot parse git hash');
 | 
			
		||||
          this.gitCommitHash = '?';
 | 
			
		||||
        }
 | 
			
		||||
      } catch (e: any) {
 | 
			
		||||
        console.log('Could not load git commit info: ' + e.message);
 | 
			
		||||
        this.gitCommitHash = '?';
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  private setVersion(): void {
 | 
			
		||||
    try {
 | 
			
		||||
      const packageJson = fs.readFileSync('package.json').toString();
 | 
			
		||||
      this.version = JSON.parse(packageJson).version;
 | 
			
		||||
    } catch (e) {
 | 
			
		||||
      throw new Error(e instanceof Error ? e.message : 'Error');
 | 
			
		||||
    }
 | 
			
		||||
    return this.backendInfo.gitCommit.slice(0, 7);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										37
									
								
								backend/src/api/fetch-version.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										37
									
								
								backend/src/api/fetch-version.ts
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,37 @@
 | 
			
		||||
import fs from 'fs';
 | 
			
		||||
import path from "path";
 | 
			
		||||
const { spawnSync } = require('child_process');
 | 
			
		||||
 | 
			
		||||
function getVersion(): string {
 | 
			
		||||
  const packageJson = fs.readFileSync('package.json').toString();
 | 
			
		||||
  return JSON.parse(packageJson).version;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function getGitCommit(): string {
 | 
			
		||||
  if (process.env.MEMPOOL_COMMIT_HASH) {
 | 
			
		||||
    return process.env.MEMPOOL_COMMIT_HASH;
 | 
			
		||||
  } else {
 | 
			
		||||
    const gitRevParse = spawnSync('git', ['rev-parse', '--short', 'HEAD']);
 | 
			
		||||
    if (!gitRevParse.error) {
 | 
			
		||||
      const output = gitRevParse.stdout.toString('utf-8').replace(/[\n\r\s]+$/, '');
 | 
			
		||||
      if (output) {
 | 
			
		||||
        return output;
 | 
			
		||||
      } else {
 | 
			
		||||
        console.log('Could not fetch git commit: No repo available');
 | 
			
		||||
      }
 | 
			
		||||
    } else if (gitRevParse.error.code === 'ENOENT') {
 | 
			
		||||
      console.log('Could not fetch git commit: Command `git` is unavailable');
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  return '?';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const versionInfo = {
 | 
			
		||||
  version: getVersion(),
 | 
			
		||||
  gitCommit: getGitCommit()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fs.writeFileSync(
 | 
			
		||||
  path.join(__dirname, 'version.json'),
 | 
			
		||||
  JSON.stringify(versionInfo, null, 2) + "\n"
 | 
			
		||||
);
 | 
			
		||||
@ -1,4 +1,6 @@
 | 
			
		||||
const configFile = require('../mempool-config.json');
 | 
			
		||||
const configFromFile = require(
 | 
			
		||||
    process.env.MEMPOOL_CONFIG_FILE ? process.env.MEMPOOL_CONFIG_FILE : '../mempool-config.json'
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
interface IConfig {
 | 
			
		||||
  MEMPOOL: {
 | 
			
		||||
@ -249,7 +251,7 @@ class Config implements IConfig {
 | 
			
		||||
  MAXMIND: IConfig['MAXMIND'];
 | 
			
		||||
 | 
			
		||||
  constructor() {
 | 
			
		||||
    const configs = this.merge(configFile, defaults);
 | 
			
		||||
    const configs = this.merge(configFromFile, defaults);
 | 
			
		||||
    this.MEMPOOL = configs.MEMPOOL;
 | 
			
		||||
    this.ESPLORA = configs.ESPLORA;
 | 
			
		||||
    this.ELECTRUM = configs.ELECTRUM;
 | 
			
		||||
 | 
			
		||||
@ -1,4 +1,5 @@
 | 
			
		||||
import * as fs from 'fs';
 | 
			
		||||
import path from "path";
 | 
			
		||||
import { Common } from '../api/common';
 | 
			
		||||
import config from '../config';
 | 
			
		||||
import logger from '../logger';
 | 
			
		||||
@ -159,7 +160,7 @@ class PriceUpdater {
 | 
			
		||||
    const existingPriceTimes = await PricesRepository.$getPricesTimes();
 | 
			
		||||
 | 
			
		||||
    // Insert MtGox weekly prices
 | 
			
		||||
    const pricesJson: any[] = JSON.parse(fs.readFileSync('./src/tasks/price-feeds/mtgox-weekly.json').toString());
 | 
			
		||||
    const pricesJson: any[] = JSON.parse(fs.readFileSync(path.join(__dirname, 'mtgox-weekly.json')).toString());
 | 
			
		||||
    const prices = this.getEmptyPricesObj();
 | 
			
		||||
    let insertedCount: number = 0;
 | 
			
		||||
    for (const price of pricesJson) {
 | 
			
		||||
 | 
			
		||||
@ -1,7 +1,7 @@
 | 
			
		||||
FROM node:16.16.0-buster-slim AS builder
 | 
			
		||||
 | 
			
		||||
ARG commitHash
 | 
			
		||||
ENV DOCKER_COMMIT_HASH=${commitHash}
 | 
			
		||||
ENV MEMPOOL_COMMIT_HASH=${commitHash}
 | 
			
		||||
 | 
			
		||||
WORKDIR /build
 | 
			
		||||
COPY . .
 | 
			
		||||
@ -9,18 +9,15 @@ COPY . .
 | 
			
		||||
RUN apt-get update
 | 
			
		||||
RUN apt-get install -y build-essential python3 pkg-config
 | 
			
		||||
RUN npm install --omit=dev --omit=optional
 | 
			
		||||
RUN npm run build
 | 
			
		||||
RUN npm run package
 | 
			
		||||
 | 
			
		||||
FROM node:16.16.0-buster-slim
 | 
			
		||||
 | 
			
		||||
WORKDIR /backend
 | 
			
		||||
 | 
			
		||||
COPY --from=builder /build/ .
 | 
			
		||||
 | 
			
		||||
RUN chmod +x /backend/start.sh
 | 
			
		||||
RUN chmod +x /backend/wait-for-it.sh
 | 
			
		||||
 | 
			
		||||
RUN chown -R 1000:1000 /backend && chmod -R 755 /backend
 | 
			
		||||
RUN chown 1000:1000 ./
 | 
			
		||||
COPY --from=builder --chown=1000:1000 /build/package ./package/
 | 
			
		||||
COPY --from=builder --chown=1000:1000 /build/mempool-config.json /build/start.sh /build/wait-for-it.sh ./
 | 
			
		||||
 | 
			
		||||
USER 1000
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										2
									
								
								docker/backend/start.sh
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							
							
						
						
									
										2
									
								
								docker/backend/start.sh
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							@ -205,4 +205,4 @@ sed -i "s!__LND_REST_API_URL__!${__LND_REST_API_URL__}!g" mempool-config.json
 | 
			
		||||
# CLN
 | 
			
		||||
sed -i "s!__CLN_SOCKET__!${__CLN_SOCKET__}!g" mempool-config.json
 | 
			
		||||
 | 
			
		||||
node /backend/dist/index.js
 | 
			
		||||
node /backend/package/index.js
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										0
									
								
								docker/backend/wait-for-it.sh
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							
							
						
						
									
										0
									
								
								docker/backend/wait-for-it.sh
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							@ -1,10 +1,7 @@
 | 
			
		||||
#!/bin/sh
 | 
			
		||||
 | 
			
		||||
#backend
 | 
			
		||||
gitMaster="\.\.\/\.git\/refs\/heads\/master"
 | 
			
		||||
git ls-remote https://github.com/mempool/mempool.git "$1^{}" | awk '{ print $1}' > ./backend/master
 | 
			
		||||
cp ./docker/backend/* ./backend/
 | 
			
		||||
sed -i "s/${gitMaster}/master/g" ./backend/src/api/backend-info.ts
 | 
			
		||||
 | 
			
		||||
#frontend
 | 
			
		||||
localhostIP="127.0.0.1"
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user