Compare commits
39 Commits
6cae18e70c
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a4d07db766 | ||
|
|
03c940e07c | ||
|
|
fee40dd609 | ||
|
|
5671503594 | ||
|
|
0fd511cfaf | ||
|
|
9d0aa0191f | ||
|
|
9ce8928d82 | ||
|
|
abadcf5cb5 | ||
|
|
4b18df9e2c | ||
|
|
26a8d8a172 | ||
|
|
26f3493c8f | ||
|
|
fd261ef015 | ||
|
|
91201c3527 | ||
|
|
dfb4c6afa1 | ||
|
|
3b8e70208a | ||
|
|
99b60bf02c | ||
|
|
831317b9f0 | ||
|
|
2477b10900 | ||
|
|
67c29f1d72 | ||
|
|
91ed4fb1dc | ||
|
|
8ea02d1c0b | ||
|
|
b15ac7c973 | ||
|
|
c2c90019d7 | ||
|
|
686ddc8a0f | ||
|
|
463ccc1bd5 | ||
|
|
14a2b4a1b9 | ||
|
|
0c1f6cd867 | ||
|
|
7175487d77 | ||
|
|
f0eac45955 | ||
|
|
c81dce99e2 | ||
|
|
38cb1054e0 | ||
|
|
12441c5c6d | ||
|
|
1c1b071bd7 | ||
|
|
961c5c19e2 | ||
|
|
49e52d8944 | ||
|
|
63ccfa70d3 | ||
|
|
4bb8038a1d | ||
|
|
a353b9adbb | ||
|
|
bf69e93e29 |
24
.gitea/workflows/DRBv3_server_build.yaml
Normal file
24
.gitea/workflows/DRBv3_server_build.yaml
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
name: DRB Server Build
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- master
|
||||||
|
|
||||||
|
env:
|
||||||
|
NODE_ENV: production
|
||||||
|
SERVER_PORT: 3000
|
||||||
|
MONGO_URL: ${{ secrets.MONGO_URL }}
|
||||||
|
DISCORD_TOKEN: ${{ secrets.DISCORD_TOKEN }}
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
drb_server_build:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout code
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Build the latest code
|
||||||
|
working-directory: './server'
|
||||||
|
run: make build
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
name: DRB Build Tests
|
name: DRB Tests
|
||||||
|
|
||||||
on:
|
on:
|
||||||
pull_request:
|
pull_request:
|
||||||
@@ -13,16 +13,19 @@ env:
|
|||||||
MONGO_INITDB_ROOT_USERNAME: admin
|
MONGO_INITDB_ROOT_USERNAME: admin
|
||||||
MONGO_INITDB_ROOT_PASSWORD: admin
|
MONGO_INITDB_ROOT_PASSWORD: admin
|
||||||
MONGO_INITDB_DATABASE: drb
|
MONGO_INITDB_DATABASE: drb
|
||||||
SERVER_PORT: 6000
|
SERVER_PORT: 3000
|
||||||
MONGO_URL: "mongodb://mongodb:27017/drb"
|
MONGO_URL: "mongodb://mongodb:27017/drb"
|
||||||
DISCORD_CLIENT_ID: ${{ secrets.DISCORD_CLIENT_ID }}
|
DISCORD_TOKEN: ${{ secrets.DISCORD_TOKEN }}
|
||||||
TEST_CHANNEL_ID: ${{ secrets.TEST_CHANNEL_ID }}
|
|
||||||
TEST_GUILD_ID: ${{ secrets.TEST_GUILD_ID }}
|
TEST_GUILD_ID: ${{ secrets.TEST_GUILD_ID }}
|
||||||
EXPECTED_CLIENT_ID: ${{ secrets.EXPECTED_CLIENT_ID }}
|
TEST_CLIENT_TOKEN: ${{ secrets.TEST_CLIENT_TOKEN }}
|
||||||
|
TEST_CHANNEL_ID: ${{ secrets.TEST_CHANNEL_ID }}
|
||||||
|
TEST_SYSTEM: ${{ secrets.TEST_SYSTEM }}
|
||||||
|
EXPECTED_CLIENT_ID: ${{ secrets.TEST_CLIENT_ID }}
|
||||||
|
EXPECTED_USERNAME: ${{ secrets.EXPECTED_USERNAME }}
|
||||||
PDAB_PORT: ${{ vars.PDAB_PORT }}
|
PDAB_PORT: ${{ vars.PDAB_PORT }}
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
drb_build_and_test:
|
drb_mocha_tests:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
services:
|
services:
|
||||||
|
|||||||
@@ -19,6 +19,14 @@ const __dirname = dirname(__filename);
|
|||||||
|
|
||||||
let botCallback;
|
let botCallback;
|
||||||
|
|
||||||
|
export const initDiscordBotClient = (clientId, callback, runPDAB = true) => {
|
||||||
|
botCallback = callback;
|
||||||
|
|
||||||
|
if (runPDAB) launchProcess("python", [join(__dirname, "./pdab/main.py"), process.env.AUDIO_DEVICE_ID, clientId, port], false, join(__dirname, "./pdab"));
|
||||||
|
pdabProcess = true; // TODO - Make this more dynamic
|
||||||
|
}
|
||||||
|
|
||||||
|
export const startPdabSocketServer = () => {
|
||||||
const port = process.env.PDAB_PORT || 3000;
|
const port = process.env.PDAB_PORT || 3000;
|
||||||
|
|
||||||
io.on('connection', (socket) => {
|
io.on('connection', (socket) => {
|
||||||
@@ -38,12 +46,7 @@ io.on('connection', (socket) => {
|
|||||||
server.listen(port, async () => {
|
server.listen(port, async () => {
|
||||||
console.log(`Server is running on port ${port}`);
|
console.log(`Server is running on port ${port}`);
|
||||||
});
|
});
|
||||||
|
return
|
||||||
export const initDiscordBotClient = (clientId, callback, runPDAB = true) => {
|
|
||||||
botCallback = callback;
|
|
||||||
|
|
||||||
if (runPDAB) launchProcess("python", [join(__dirname, "./pdab/main.py"), process.env.AUDIO_DEVICE_ID, clientId, port], false, join(__dirname, "./pdab"));
|
|
||||||
pdabProcess = true; // TODO - Make this more dynamic
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export const closePdabSocketServer = () => {
|
export const closePdabSocketServer = () => {
|
||||||
@@ -75,6 +78,15 @@ export const leaveVoiceChannel = async (guildId) => {
|
|||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Set the presense of the discord client
|
||||||
|
export const setDiscordClientPrsense = (system) => {
|
||||||
|
return new Promise((res) => {
|
||||||
|
io.timeout(25000).emit('set_system', { system: system }, (status) => {
|
||||||
|
res();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
// Placeholder functions (replace with actual implementation)
|
// Placeholder functions (replace with actual implementation)
|
||||||
export const checkIfConnectedToVC = async (guildId) => {
|
export const checkIfConnectedToVC = async (guildId) => {
|
||||||
console.log("Pdab process var:", pdabProcess);
|
console.log("Pdab process var:", pdabProcess);
|
||||||
@@ -120,6 +132,7 @@ export const requestDiscordID = () => {
|
|||||||
export const requestDiscordClientClose = () => {
|
export const requestDiscordClientClose = () => {
|
||||||
return new Promise((res) => {
|
return new Promise((res) => {
|
||||||
io.timeout(25000).emit('request_client_close');
|
io.timeout(25000).emit('request_client_close');
|
||||||
|
pdabProcess = false;
|
||||||
res();
|
res();
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
import { connectToChannel, leaveVoiceChannel, checkIfConnectedToVC, initDiscordBotClient, requestDiscordUsername, requestDiscordID, requestDiscordClientClose, closePdabSocketServer } from './pdabHandler.mjs';
|
import { connectToChannel, leaveVoiceChannel, checkIfConnectedToVC, initDiscordBotClient, requestDiscordUsername, requestDiscordID, requestDiscordClientClose, closePdabSocketServer, setDiscordClientPrsense, startPdabSocketServer } from './pdabHandler.mjs';
|
||||||
import { openOP25, closeOP25 } from '../op25Handler/op25Handler.mjs';
|
import { openOP25, closeOP25 } from '../op25Handler/op25Handler.mjs';
|
||||||
|
|
||||||
let activeDiscordClient = undefined;
|
let activeDiscordClient = undefined;
|
||||||
@@ -8,16 +8,26 @@ let activeDiscordClient = undefined;
|
|||||||
* @param {object} joinData The object containing all the information to join the server
|
* @param {object} joinData The object containing all the information to join the server
|
||||||
*/
|
*/
|
||||||
export const joinDiscordVC = async (joinData) => {
|
export const joinDiscordVC = async (joinData) => {
|
||||||
console.log("Join requested: ", joinData)
|
console.log("Join requested: ", joinData);
|
||||||
const connection = await new Promise(async (res) => {
|
const connection = await new Promise(async (res) => {
|
||||||
// Check if a client already exists
|
// Check if a client already exists
|
||||||
|
console.log("Checking if there is a client open");
|
||||||
if (!await checkIfClientIsOpen()) {
|
if (!await checkIfClientIsOpen()) {
|
||||||
// Open a new client and join the requested channel with the requested ID
|
console.log("There is no open client, starting it now");
|
||||||
initDiscordBotClient(joinData.clientID, () => {
|
await startPdabSocketServer();
|
||||||
// Open an instance of OP25
|
// Open an instance of OP25
|
||||||
|
console.log("Starting OP25")
|
||||||
openOP25(joinData.system);
|
openOP25(joinData.system);
|
||||||
|
|
||||||
|
// Open a new client and join the requested channel with the requested ID
|
||||||
|
initDiscordBotClient(joinData.clientID, () => {
|
||||||
|
console.log("Started PDAB");
|
||||||
|
|
||||||
|
console.log("Setting the presense of the bot");
|
||||||
|
setDiscordClientPrsense(joinData.system);
|
||||||
|
|
||||||
// Add the client object to the IO instance
|
// Add the client object to the IO instance
|
||||||
|
console.log("Connecting to channel")
|
||||||
connectToChannel(joinData.channelID, (connectionStatus) => {
|
connectToChannel(joinData.channelID, (connectionStatus) => {
|
||||||
console.log("Bot Connected to VC:", connectionStatus);
|
console.log("Bot Connected to VC:", connectionStatus);
|
||||||
res(connectionStatus);
|
res(connectionStatus);
|
||||||
@@ -25,7 +35,9 @@ export const joinDiscordVC = async (joinData) => {
|
|||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
// Join the requested channel with the requested ID
|
// Join the requested channel with the requested ID
|
||||||
// Add the client object to the IO instance
|
console.log("There is an open client");
|
||||||
|
|
||||||
|
console.log("Connecting to channel")
|
||||||
const connection = connectToChannel(joinData.channelID);
|
const connection = connectToChannel(joinData.channelID);
|
||||||
console.log("Bot Connected to VC::");
|
console.log("Bot Connected to VC::");
|
||||||
res(connection);
|
res(connection);
|
||||||
|
|||||||
@@ -1,4 +1,6 @@
|
|||||||
import { spawn } from "child_process";
|
import { spawn } from "child_process";
|
||||||
|
import dotenv from 'dotenv';
|
||||||
|
dotenv.config()
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Object to store references to spawned processes.
|
* Object to store references to spawned processes.
|
||||||
@@ -25,11 +27,29 @@ export const launchProcess = (processName, args, waitForClose=false, pcwd=undefi
|
|||||||
// Store reference to the spawned process
|
// Store reference to the spawned process
|
||||||
runningProcesses[processName] = childProcess;
|
runningProcesses[processName] = childProcess;
|
||||||
|
|
||||||
|
// Output the process output in development
|
||||||
|
var scriptOutput = "";
|
||||||
|
|
||||||
|
// Get the stdout from the child process
|
||||||
|
childProcess.stdout.setEncoding('utf8');
|
||||||
|
childProcess.stdout.on('data', (data) => {
|
||||||
|
if (process.env.NODE_ENV === "development") console.log(`Data from ${processName}:`, data);
|
||||||
|
scriptOutput += data.toString();
|
||||||
|
});
|
||||||
|
|
||||||
|
// Get the stderr from the child process
|
||||||
|
childProcess.stderr.setEncoding('utf8');
|
||||||
|
childProcess.stderr.on('data', (data) => {
|
||||||
|
if (process.env.NODE_ENV === "development") console.log(`Data from ${processName}:`, data);
|
||||||
|
scriptOutput += data.toString();
|
||||||
|
})
|
||||||
|
|
||||||
let code = new Promise(res => {
|
let code = new Promise(res => {
|
||||||
childProcess.on('exit', (code, signal) => {
|
childProcess.on('exit', (code, signal) => {
|
||||||
// Remove reference to the process when it exits
|
// Remove reference to the process when it exits
|
||||||
delete runningProcesses[processName];
|
delete runningProcesses[processName];
|
||||||
console.log(`${processName} process exited with code ${code} and signal ${signal}`);
|
console.log(`${processName} process exited with code ${code} and signal ${signal}`);
|
||||||
|
console.log("Child process console output: ", scriptOutput);
|
||||||
res(code);
|
res(code);
|
||||||
})
|
})
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -4,8 +4,8 @@
|
|||||||
npm install
|
npm install
|
||||||
|
|
||||||
# Install OP25 Updates
|
# Install OP25 Updates
|
||||||
cd ./op25
|
#cd ./op25
|
||||||
bash rebuild.sh
|
#bash rebuild.sh
|
||||||
|
|
||||||
# Check for PDAB updates
|
# Check for PDAB updates
|
||||||
cd ../discordAudioBot/pdab
|
cd ../discordAudioBot/pdab
|
||||||
|
|||||||
@@ -1,8 +1,5 @@
|
|||||||
// Import necessary modules for testing
|
// Import necessary modules for testing
|
||||||
import { use, expect } from 'chai'
|
import { expect } from 'chai'
|
||||||
import chaiHttp from 'chai-http'
|
|
||||||
const chai = use(chaiHttp)
|
|
||||||
|
|
||||||
import io from 'socket.io-client';
|
import io from 'socket.io-client';
|
||||||
const ioClient = io;
|
const ioClient = io;
|
||||||
|
|
||||||
@@ -35,7 +32,7 @@ describe('Socket Server Tests', done => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
it('Should open a socket server and callback when the client is connected and ready', done => {
|
it('Should open a socket server and callback when the client is connected and ready', done => {
|
||||||
const clientId = process.env.DISCORD_CLIENT_ID;
|
const clientId = process.env.TEST_CLIENT_TOKEN;
|
||||||
|
|
||||||
const callback = () => {
|
const callback = () => {
|
||||||
done();
|
done();
|
||||||
@@ -130,19 +127,9 @@ describe('Socket Server Tests', done => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
describe('Socket Client & Python IPC Tests', done => {
|
describe('Socket Client & Python IPC Tests', done => {
|
||||||
after(async () => {
|
|
||||||
// Any teardown needed after tests
|
|
||||||
try {
|
|
||||||
await socket.close();
|
|
||||||
}
|
|
||||||
catch {
|
|
||||||
console.log("Socket already closed");
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
it('Should open a socket server and callback when the client is connected and ready', done => {
|
it('Should open a socket server and callback when the client is connected and ready', done => {
|
||||||
let clientConnected = false;
|
let clientConnected = false;
|
||||||
const clientId = process.env.DISCORD_CLIENT_ID;
|
const clientId = process.env.TEST_CLIENT_TOKEN;
|
||||||
|
|
||||||
const callback = () => {
|
const callback = () => {
|
||||||
clientConnected = true;
|
clientConnected = true;
|
||||||
@@ -165,13 +152,6 @@ describe('Socket Client & Python IPC Tests', done => {
|
|||||||
expect(status).to.be.true;
|
expect(status).to.be.true;
|
||||||
});
|
});
|
||||||
|
|
||||||
it('Should have opened OP25', async () => {
|
|
||||||
// Assuming your server is running on localhost:8081
|
|
||||||
const res = await chai.request('http://localhost:8081').get('/');
|
|
||||||
expect(res).to.have.status(200); // Assuming 200 is the expected status code
|
|
||||||
// Add more assertions if needed
|
|
||||||
});
|
|
||||||
|
|
||||||
it('Should emit command for and return status if connected to voice channel', async () => {
|
it('Should emit command for and return status if connected to voice channel', async () => {
|
||||||
// Simulate emitting 'check_discord_vc_connected' event
|
// Simulate emitting 'check_discord_vc_connected' event
|
||||||
const isConnected = await checkIfConnectedToVC(process.env.TEST_GUILD_ID);
|
const isConnected = await checkIfConnectedToVC(process.env.TEST_GUILD_ID);
|
||||||
|
|||||||
40
client/test/pdabWrappers.test.js.bak
Normal file
40
client/test/pdabWrappers.test.js.bak
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
import { use } from 'chai';
|
||||||
|
import chaiHttp from 'chai-http';
|
||||||
|
const chai = use(chaiHttp)
|
||||||
|
chai.should();
|
||||||
|
|
||||||
|
import dotenv from 'dotenv';
|
||||||
|
dotenv.config()
|
||||||
|
|
||||||
|
import { joinDiscordVC, leaveDiscordVC } from '../discordAudioBot/pdabWrappers.mjs'
|
||||||
|
|
||||||
|
before(async () => {
|
||||||
|
// Any setup needed before tests
|
||||||
|
});
|
||||||
|
|
||||||
|
after(async () => {
|
||||||
|
// Any teardown needed after tests
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('PDAB Wrapper Tests', () => {
|
||||||
|
it('Should open the discord bot, and join the first server when requested', async () => {
|
||||||
|
// Test case
|
||||||
|
const joinData = {
|
||||||
|
channelID: process.env.TEST_CHANNEL_ID,
|
||||||
|
clientID: process.env.TEST_CLIENT_TOKEN,
|
||||||
|
system: process.env.TEST_SYSTEM,
|
||||||
|
};
|
||||||
|
const connection = await joinDiscordVC(joinData);
|
||||||
|
console.log("Connection:", connection);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('Should open OP25', async () => {
|
||||||
|
const res = await chai.request('http://localhost:8081').get('/');
|
||||||
|
expect(res).to.have.status(200); // Assuming 200 is the expected status code
|
||||||
|
// Add more assertions if needed
|
||||||
|
})
|
||||||
|
|
||||||
|
it("Should disconnect from the discord server", async () => {
|
||||||
|
await leaveDiscordVC(process.env.TEST_GUILD_ID);
|
||||||
|
})
|
||||||
|
});
|
||||||
21
server/Dockerfile
Normal file
21
server/Dockerfile
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
# Use the official Node.js image as the base image
|
||||||
|
FROM node:20
|
||||||
|
|
||||||
|
# Set the working directory inside the container
|
||||||
|
WORKDIR /server
|
||||||
|
|
||||||
|
# Copy package.json and package-lock.json (if available) to the working directory
|
||||||
|
COPY package*.json ./
|
||||||
|
|
||||||
|
# Install dependencies
|
||||||
|
RUN npm install -g node-gyp
|
||||||
|
RUN npm install
|
||||||
|
|
||||||
|
# Copy the rest of the application code to the working directory
|
||||||
|
COPY . .
|
||||||
|
|
||||||
|
# Expose the port on which your Node.js application will run
|
||||||
|
EXPOSE 3000
|
||||||
|
|
||||||
|
# Command to run the Node.js application
|
||||||
|
CMD ["node", "."]
|
||||||
@@ -57,13 +57,19 @@ export async function execute(nodeIo, interaction) {
|
|||||||
const joinSelectedNode = async (selectedNodeSocketId) => {
|
const joinSelectedNode = async (selectedNodeSocketId) => {
|
||||||
const openSocket = await nodeIo.sockets.sockets.get(selectedNodeSocketId);
|
const openSocket = await nodeIo.sockets.sockets.get(selectedNodeSocketId);
|
||||||
// Get the open ID for this connection\
|
// Get the open ID for this connection\
|
||||||
const discordToken = await getAvailableTokensInGuild(nodeIo, interaction.guild.id);
|
const ss = await getAvailableTokensInGuild(nodeIo, interaction.guild.id);
|
||||||
// TODO - Implement a method to have preferred tokens (bot users) for specific systems
|
console.log("Available discord tokens: ", discordTokens);
|
||||||
|
|
||||||
console.log("Joining selected open socket:", selectedNodeSocketId, system.name, channelToJoin.id, openSocket.node.name, discordToken);
|
if (discordTokens.length >= 1) {
|
||||||
|
// TODO - Implement a method to have preferred tokens (bot users) for specific systems
|
||||||
|
console.log("Joining selected open socket:", selectedNodeSocketId, system.name, channelToJoin.id, openSocket.node.name, discordTokens[0].token);
|
||||||
|
|
||||||
// Ask the node to join the selected channel and system
|
// Ask the node to join the selected channel and system
|
||||||
await requestNodeJoinSystem(openSocket, system.name, channelToJoin.id, discordToken[0].token);
|
await requestNodeJoinSystem(openSocket, system.name, channelToJoin.id, discordTokens[0].token);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return await interaction.editReply({ content: `<@${interaction.member.id}>, there are no free bots. Free up or create a new bot ID (discord app) to listen to this system.`, ephemeral: true })
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get all open socket nodes
|
// Get all open socket nodes
|
||||||
|
|||||||
@@ -37,10 +37,7 @@ export const checkOnlineBotsInGuild = async (nodeIo, guildId) => {
|
|||||||
console.log("Online bots in the guild:", onlineBots);
|
console.log("Online bots in the guild:", onlineBots);
|
||||||
|
|
||||||
// Filter any discordIDs that are not active
|
// Filter any discordIDs that are not active
|
||||||
var availableDiscordIDs = discordIDs.filter(discordID => discordID.active == true);
|
const availableDiscordIDs = discordIDs.filter(discordID => discordID.active == true).filter(discordID => !onlineBots.some(bot => Number(bot.discord_id) == discordID.discord_id));
|
||||||
|
|
||||||
// Filter out discordIDs that are not found in onlineBots
|
|
||||||
availableDiscordIDs = availableDiscordIDs.filter(discordID => !onlineBots.some(bot => bot.discord_id === discordID.discord_id));
|
|
||||||
|
|
||||||
// Return the unavailable discordIDs
|
// Return the unavailable discordIDs
|
||||||
return availableDiscordIDs;
|
return availableDiscordIDs;
|
||||||
|
|||||||
25
server/makefile
Normal file
25
server/makefile
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
# Define variables
|
||||||
|
DOCKER_IMAGE_NAME := drb-server
|
||||||
|
|
||||||
|
# Define targets and rules
|
||||||
|
.PHONY: clean build run
|
||||||
|
|
||||||
|
clean:
|
||||||
|
@echo "Cleaning existing Docker images, containers, and builds..."
|
||||||
|
docker stop drb || true
|
||||||
|
docker rm drb || true
|
||||||
|
docker rmi $(DOCKER_IMAGE_NAME) || true
|
||||||
|
|
||||||
|
build:
|
||||||
|
@echo "Building Docker image..."
|
||||||
|
docker build -t $(DOCKER_IMAGE_NAME) .
|
||||||
|
|
||||||
|
run:
|
||||||
|
@echo "Running Docker container..."
|
||||||
|
docker run -d -e NODE_ENV=${NODE_ENV} \
|
||||||
|
-e SERVER_PORT=${SERVER_PORT} \
|
||||||
|
-e MONGO_URL=${MONGO_URL} \
|
||||||
|
-e DISCORD_TOKEN=${DISCORD_TOKEN} \
|
||||||
|
-p ${SERVER_PORT}:${SERVER_PORT} \
|
||||||
|
--name=drb \
|
||||||
|
$(DOCKER_IMAGE_NAME)
|
||||||
Reference in New Issue
Block a user