Isolate API process from mining workers

This commit is contained in:
Ben
2026-06-07 22:53:15 -04:00
parent 51e3afb7e7
commit f14d76c2ea
4 changed files with 49 additions and 11 deletions
+17
View File
@@ -1,12 +1,28 @@
module.exports = {
apps: [
// API instance
{
name: 'api',
script: './dist/main.js',
instances: 1,
exec_mode: 'fork',
env: {
MASTER: 'false',
API_ONLY: 'true',
API_ENABLED: 'true',
NODE_CLUSTER_SCHED_POLICY: 'none',
},
time: true
},
// Master instance
{
name: 'master',
script: './dist/main.js',
instances: 1,
exec_mode: 'fork',
env: {
MASTER: 'true',
API_ENABLED: 'false',
NODE_CLUSTER_SCHED_POLICY: 'none',
},
time: true
@@ -19,6 +35,7 @@ module.exports = {
exec_mode: "cluster",
env: {
MASTER: 'false',
API_ENABLED: 'false',
NODE_CLUSTER_SCHED_POLICY: 'none',
},
time: true
+2 -1
View File
@@ -15,7 +15,8 @@ async function bootstrap() {
return;
}
const serveApi = process.env.MASTER !== 'false';
const apiEnabled = process.env.API_ENABLED?.toLowerCase();
const serveApi = apiEnabled == null ? process.env.MASTER !== 'false' : apiEnabled === 'true';
const secure = serveApi && process.env.API_SECURE?.toLowerCase() === 'true';
const currentDirectory = process.cwd();
const keyPath = path.join(currentDirectory, 'secrets', 'key.pem');
+25 -10
View File
@@ -47,22 +47,30 @@ export class BitcoinRpcService implements OnModuleInit {
}
});
this.callRpc('getrpcinfo').then((res) => {
console.log('Bitcoin RPC connected');
}, () => {
console.error('Could not reach RPC host');
});
this.miningInfo = await this.getMiningInfo();
console.log(`MASTER? ${process.env.MASTER}`)
if (process.env.MASTER != 'true') {
await this.loadLatestTemplateForWorker();
await this.loadLatestMiningInfoForReplayProcess();
if (process.env.API_ONLY != 'true') {
await this.loadLatestTemplateForWorker();
}
await this.redisMessagingService.subscribeMiningInfoUpdates(async (miningInfo: IMiningInfo) => {
this.miningInfo = miningInfo;
await this.loadTemplateForWorker(miningInfo.blocks);
if (process.env.API_ONLY != 'true') {
await this.loadTemplateForWorker(miningInfo.blocks);
}
});
if (process.env.API_ONLY == 'true') {
console.log('API-only process using Redis mining info replay');
}
return;
} else {
this.callRpc('getrpcinfo').then((res) => {
console.log('Bitcoin RPC connected');
}, () => {
console.error('Could not reach RPC host');
});
this.miningInfo = await this.getMiningInfo();
console.log('Using ZMQ');
const sock = new zmq.Subscriber;
@@ -91,6 +99,13 @@ export class BitcoinRpcService implements OnModuleInit {
}
private async loadLatestMiningInfoForReplayProcess() {
const latestMiningInfo = await this.redisMessagingService.getLatestMiningInfo();
if (latestMiningInfo != null) {
this.miningInfo = latestMiningInfo;
}
}
private async listenForNewBlocks(sock: zmq.Subscriber) {
for await (const [topic, msg] of sock) {
console.log("New Block");
+5
View File
@@ -68,6 +68,11 @@ export class StratumV1Service implements OnModuleInit {
async onModuleInit(): Promise<void> {
if (process.env.API_ONLY == 'true') {
console.log('API-only process skipping Stratum socket listeners');
return;
}
if (process.env.MASTER == 'true') {
await this.clientService.deleteAll();
await this.redisMessagingService?.clearClientPresence();