diff --git a/.gitignore b/.gitignore index eb8ee274..d65a34da 100644 --- a/.gitignore +++ b/.gitignore @@ -9,4 +9,5 @@ build/ db.sqlite metrics.sqlite .key/ -logs \ No newline at end of file +logs +.jwt_secret \ No newline at end of file diff --git a/src/services/lnd/index.ts b/src/services/lnd/index.ts index 9b15a922..765db0e6 100644 --- a/src/services/lnd/index.ts +++ b/src/services/lnd/index.ts @@ -1,11 +1,11 @@ -import { EnvMustBeNonEmptyString, EnvMustBeInteger, EnvCanBeBoolean } from '../helpers/envParser.js' +import { EnvMustBeNonEmptyString, EnvMustBeInteger, EnvCanBeBoolean, EnvCanBeInteger } from '../helpers/envParser.js' import { LndSettings } from './settings.js' export const LoadLndSettingsFromEnv = (): LndSettings => { - const lndAddr = EnvMustBeNonEmptyString("LND_ADDRESS") - const lndCertPath = EnvMustBeNonEmptyString("LND_CERT_PATH") - const lndMacaroonPath = EnvMustBeNonEmptyString("LND_MACAROON_PATH") - const feeRateLimit = EnvMustBeInteger("OUTBOUND_MAX_FEE_BPS") / 10000 - const feeFixedLimit = EnvMustBeInteger("OUTBOUND_MAX_FEE_EXTRA_SATS") + const lndAddr = process.env.LND_ADDRESS || "127.0.0.1:10009" + const lndCertPath = process.env.LND_CERT_PATH || "~/.lnd/tls.cert" + const lndMacaroonPath = process.env.LND_MACAROON_PATH || "~/.lnd/data/chain/bitcoin/mainnet/admin.macaroon" + const feeRateLimit = EnvCanBeInteger("OUTBOUND_MAX_FEE_BPS", 60) / 10000 + const feeFixedLimit = EnvCanBeInteger("OUTBOUND_MAX_FEE_EXTRA_SATS", 100) const mockLnd = EnvCanBeBoolean("MOCK_LND") return { mainNode: { lndAddr, lndCertPath, lndMacaroonPath }, feeRateLimit, feeFixedLimit, mockLnd } } diff --git a/src/services/main/settings.ts b/src/services/main/settings.ts index 0a02d632..ee213415 100644 --- a/src/services/main/settings.ts +++ b/src/services/main/settings.ts @@ -2,7 +2,10 @@ import { LoadStorageSettingsFromEnv, StorageSettings } from '../storage/index.js import { LndSettings, NodeSettings } from '../lnd/settings.js' import { LoadWatchdogSettingsFromEnv, WatchdogSettings } from './watchdog.js' import { LoadLndSettingsFromEnv } from '../lnd/index.js' -import { EnvMustBeInteger, EnvMustBeNonEmptyString } from '../helpers/envParser.js' +import { EnvCanBeInteger, EnvMustBeInteger, EnvMustBeNonEmptyString } from '../helpers/envParser.js' +import { getLogger } from '../helpers/logger.js' +import fs from 'fs' +import crypto from 'crypto'; export type MainSettings = { storageSettings: StorageSettings, lndSettings: LndSettings, @@ -33,17 +36,17 @@ export const LoadMainSettingsFromEnv = (): MainSettings => { watchDogSettings: LoadWatchdogSettingsFromEnv(), lndSettings: LoadLndSettingsFromEnv(), storageSettings: LoadStorageSettingsFromEnv(), - jwtSecret: EnvMustBeNonEmptyString("JWT_SECRET"), - incomingTxFee: EnvMustBeInteger("INCOMING_CHAIN_FEE_ROOT_BPS") / 10000, - outgoingTxFee: EnvMustBeInteger("OUTGOING_CHAIN_FEE_ROOT_BPS") / 10000, - incomingAppInvoiceFee: EnvMustBeInteger("INCOMING_INVOICE_FEE_ROOT_BPS") / 10000, - outgoingAppInvoiceFee: EnvMustBeInteger("OUTGOING_INVOICE_FEE_ROOT_BPS") / 10000, - incomingAppUserInvoiceFee: EnvMustBeInteger("INCOMING_INVOICE_FEE_USER_BPS") / 10000, - outgoingAppUserInvoiceFee: EnvMustBeInteger("OUTGOING_INVOICE_FEE_USER_BPS") / 10000, - userToUserFee: EnvMustBeInteger("TX_FEE_INTERNAL_USER_BPS") / 10000, - appToUserFee: EnvMustBeInteger("TX_FEE_INTERNAL_ROOT_BPS") / 10000, - serviceUrl: process.env.SERVICE_URL || `http://localhost:${EnvMustBeInteger("PORT")}`, - servicePort: EnvMustBeInteger("PORT"), + jwtSecret: loadJwtSecret(), + incomingTxFee: EnvCanBeInteger("INCOMING_CHAIN_FEE_ROOT_BPS", 0) / 10000, + outgoingTxFee: EnvCanBeInteger("OUTGOING_CHAIN_FEE_ROOT_BPS", 60) / 10000, + incomingAppInvoiceFee: EnvCanBeInteger("INCOMING_INVOICE_FEE_ROOT_BPS", 0) / 10000, + outgoingAppInvoiceFee: EnvCanBeInteger("OUTGOING_INVOICE_FEE_ROOT_BPS", 60) / 10000, + incomingAppUserInvoiceFee: EnvCanBeInteger("INCOMING_INVOICE_FEE_USER_BPS", 0) / 10000, + outgoingAppUserInvoiceFee: EnvCanBeInteger("OUTGOING_INVOICE_FEE_USER_BPS", 0) / 10000, + userToUserFee: EnvCanBeInteger("TX_FEE_INTERNAL_USER_BPS", 0) / 10000, + appToUserFee: EnvCanBeInteger("TX_FEE_INTERNAL_ROOT_BPS", 0) / 10000, + serviceUrl: process.env.SERVICE_URL || `http://localhost:${EnvCanBeInteger("PORT", 1776)}`, + servicePort: EnvCanBeInteger("PORT", 1776), recordPerformance: process.env.RECORD_PERFORMANCE === 'true' || false, skipSanityCheck: process.env.SKIP_SANITY_CHECK === 'true' || false, disableExternalPayments: process.env.DISABLE_EXTERNAL_PAYMENTS === 'true' || false @@ -81,4 +84,22 @@ export const LoadTestSettingsFromEnv = (): TestSettings => { pass: EnvMustBeNonEmptyString("BITCOIN_CORE_PASS") } } +} + +export const loadJwtSecret = (): string => { + const secret = process.env["JWT_SECRET"] + const log = getLogger({}) + if (secret) { + return secret + } + log("JWT_SECRET not set in env, checking .jwt_secret file") + try { + const fileContent = fs.readFileSync(".jwt_secret", "utf-8") + return fileContent.trim() + } catch (e) { + log(".jwt_secret file not found, generating random secret") + const secret = crypto.randomBytes(32).toString('hex') + fs.writeFileSync(".jwt_secret", secret) + return secret + } } \ No newline at end of file diff --git a/src/services/storage/db.ts b/src/services/storage/db.ts index dbba9363..be18d448 100644 --- a/src/services/storage/db.ts +++ b/src/services/storage/db.ts @@ -26,9 +26,9 @@ export type DbSettings = { } export const LoadDbSettingsFromEnv = (): DbSettings => { return { - databaseFile: EnvMustBeNonEmptyString("DATABASE_FILE"), + databaseFile: process.env.DATABASE_FILE || "db.sqlite", migrate: process.env.MIGRATE_DB === 'true' || false, - metricsDatabaseFile: EnvMustBeNonEmptyString("METRICS_DATABASE_FILE") + metricsDatabaseFile: process.env.METRICS_DATABASE_FILE || "metrics.sqlite" } }