diff --git a/dev-scripts/dev-clean-run-as-dev.sh b/dev-scripts/dev-clean-run-as-dev.sh index 432adc565..bc4eac0d0 100755 --- a/dev-scripts/dev-clean-run-as-dev.sh +++ b/dev-scripts/dev-clean-run-as-dev.sh @@ -11,10 +11,15 @@ sleep 1s docker secret rm captain-salt docker build -t captain-debug -f dockerfile-captain.debug . rm -rf /captain && mkdir /captain +mkdir -p /captain/data/shared-logs chmod -R 777 /captain + docker run \ -e "CAPTAIN_IS_DEBUG=1" \ -e "MAIN_NODE_IP_ADDRESS=127.0.0.1" \ + -e "CAPTAIN_HOST_HTTP_PORT=10083" \ + -e "CAPTAIN_HOST_HTTPS_PORT=10443" \ + -e "CAPTAIN_HOST_ADMIN_PORT=13000" \ -v /var/run/docker.sock:/var/run/docker.sock \ -v /captain:/captain \ -v $(pwd):/usr/src/app captain-debug diff --git a/src/app.ts b/src/app.ts index 8e10722d0..d62fe99bb 100644 --- a/src/app.ts +++ b/src/app.ts @@ -84,7 +84,7 @@ app.use(function (req, res, next) { req.secure || req.get('X-Forwarded-Proto') === 'https' if (!isRequestSsl) { - const newUrl = `https://${req.get('host')}${req.originalUrl}` + const newUrl = `https://${req.hostname}:${CaptainConstants.configs.nginxPortNumber80}${req.originalUrl}` res.redirect(302, newUrl) return } @@ -113,7 +113,8 @@ app.use(CaptainConstants.netDataRelativePath, function (req, res, next) { const newUrl = (isRequestSsl ? 'https://' : 'http://') + - req.get('host') + + req.hostname + ':' + + (isRequestSsl ? CaptainConstants.configs.nginxPortNumber443 : CaptainConstants.configs.nginxPortNumber80) + CaptainConstants.netDataRelativePath + '/' res.redirect(302, newUrl) diff --git a/src/datastore/DataStore.ts b/src/datastore/DataStore.ts index e515dd05b..48b80b99d 100644 --- a/src/datastore/DataStore.ts +++ b/src/datastore/DataStore.ts @@ -4,8 +4,8 @@ import Configstore = require('configstore') import fs = require('fs-extra') import { - AutomatedCleanupConfigsCleaner, - IAutomatedCleanupConfigs, + AutomatedCleanupConfigsCleaner, + IAutomatedCleanupConfigs, } from '../models/AutomatedCleanupConfigs' import CapRoverTheme from '../models/CapRoverTheme' import { GoAccessInfo } from '../models/GoAccessInfo' @@ -249,8 +249,11 @@ class DataStore { const goAccessInfo = (self.data.get(GOACCESS_INFO) || {}) as GoAccessInfo goAccessInfo.isEnabled = goAccessInfo.isEnabled || false - goAccessInfo.data.rotationFrequencyCron = - goAccessInfo.data.rotationFrequencyCron ?? '0 0 1 * *' // monthly + if(!goAccessInfo.data) { + goAccessInfo.data = { + rotationFrequencyCron:'0 0 1 * *' // monthly + } + } return Promise.resolve(goAccessInfo) } diff --git a/src/server.ts b/src/server.ts index 77a4736be..c59305053 100644 --- a/src/server.ts +++ b/src/server.ts @@ -30,7 +30,7 @@ function startServer() { * Get port from environment and store in Express. */ - const port = normalizePort(process.env.PORT || '3000') + const port = 3000 app.set('port', port) /** @@ -47,25 +47,6 @@ function startServer() { server.on('error', onError) server.on('listening', onListening) - /** - * Normalize a port into a number, string, or false. - */ - - function normalizePort(val: string) { - const port = parseInt(val, 10) - - if (isNaN(port)) { - // named pipe - return val - } - - if (port >= 0) { - // port number - return port - } - - return false - } /** * Event listener for HTTP server "error" event. diff --git a/src/user/system/LoadBalancerManager.ts b/src/user/system/LoadBalancerManager.ts index 1403b8c5e..5ddf0f9db 100644 --- a/src/user/system/LoadBalancerManager.ts +++ b/src/user/system/LoadBalancerManager.ts @@ -532,7 +532,7 @@ class LoadBalancerManager { serviceName: CaptainConstants.captainServiceName, domain: captainDomain, serviceExposedPort: - CaptainConstants.captainServiceExposedPort, + CaptainConstants.configs.adminPortNumber3000, defaultHtmlDir: CaptainConstants.nginxStaticRootDir + CaptainConstants.nginxDefaultHtmlDir, @@ -681,7 +681,8 @@ class LoadBalancerManager { protocol: 'udp', publishMode: 'host', containerPort: 443, - hostPort: 443, + hostPort: + CaptainConstants.configs.nginxPortNumber443, }, ], nodeId, @@ -793,6 +794,7 @@ class LoadBalancerManager { 0 ) } else { + Logger.d('Captain Nginx is NOT running.. ') return createNginxServiceOnNode(myNodeId).then(function () { return myNodeId }) diff --git a/src/utils/CaptainConstants.ts b/src/utils/CaptainConstants.ts index ce6c6caaa..f9bd84a4b 100644 --- a/src/utils/CaptainConstants.ts +++ b/src/utils/CaptainConstants.ts @@ -64,9 +64,12 @@ const configs = { // this is added in 1.13 just as a safety - remove this after 1.14 disableEncryptedCheck: false, - nginxPortNumber80: 80, - - nginxPortNumber443: 443, + // The port can be overridden via env variable CAPTAIN_HOST_HTTP_PORT + nginxPortNumber80: EnvVars.CAPTAIN_HOST_HTTP_PORT, + // The port can be overridden via env variable CAPTAIN_HOST_HTTPS_PORT + nginxPortNumber443: EnvVars.CAPTAIN_HOST_HTTPS_PORT, + // The port can be overridden via env variable CAPTAIN_HOST_ADMIN_PORT + adminPortNumber3000: EnvVars.CAPTAIN_HOST_ADMIN_PORT, } export interface CertbotCertCommandRule { @@ -89,8 +92,6 @@ const data = { isDebug: EnvVars.CAPTAIN_IS_DEBUG, - captainServiceExposedPort: 3000, - rootNameSpace: 'captain', // *********************** Disk Paths ************************ @@ -204,7 +205,7 @@ const data = { // ********************* ETC ************************ disableFirewallCommand: - 'ufw allow 80,443,3000,996,7946,4789,2377/tcp; ufw allow 7946,4789,2377/udp; ', + 'ufw allow ' + configs.nginxPortNumber80 + ',' + configs.nginxPortNumber443 + ',' + configs.adminPortNumber3000 + ',996,7946,4789,2377/tcp; ufw allow 7946,4789,2377/udp; ', gitShaEnvVarKey: 'CAPROVER_GIT_COMMIT_SHA', } @@ -246,7 +247,7 @@ if (data.isDebug) { data.debugSourceDirectory = devDirectoryOnLocalMachine data.configs.publishedNameOnDockerHub = 'captain-debug' - data.configs.nginxPortNumber80 = 80 + // data.configs.nginxPortNumber80 = 80 } export default data diff --git a/src/utils/CaptainInstaller.ts b/src/utils/CaptainInstaller.ts index 1cbe46126..409e4434d 100644 --- a/src/utils/CaptainInstaller.ts +++ b/src/utils/CaptainInstaller.ts @@ -280,13 +280,13 @@ export function install() { return startServerOnPort_80_443_3000() }) .then(function () { - return checkPortOrThrow(myIp4, 80) + return checkPortOrThrow(myIp4, CaptainConstants.configs.nginxPortNumber80 as any) }) .then(function () { - return checkPortOrThrow(myIp4, 443) + return checkPortOrThrow(myIp4, CaptainConstants.configs.nginxPortNumber443 as any) }) .then(function () { - return checkPortOrThrow(myIp4, 3000) + return checkPortOrThrow(myIp4, CaptainConstants.configs.adminPortNumber3000 as any) }) .then(function () { const imageName = CaptainConstants.configs.nginxImageName @@ -332,6 +332,18 @@ export function install() { key: EnvVar.keys.IS_CAPTAIN_INSTANCE, value: '1', }) + env.push({ + key: EnvVar.keys.CAPTAIN_HOST_ADMIN_PORT, + value: CaptainConstants.configs.adminPortNumber3000 + '', + }) + env.push({ + key: EnvVar.keys.CAPTAIN_HOST_HTTP_PORT, + value: CaptainConstants.configs.nginxPortNumber80 + '', + }) + env.push({ + key: EnvVar.keys.CAPTAIN_HOST_HTTPS_PORT, + value: CaptainConstants.configs.nginxPortNumber443 + '', + }) if (EnvVar.DEFAULT_PASSWORD) { env.push({ @@ -386,8 +398,8 @@ export function install() { ports.push({ protocol: 'tcp', publishMode: 'host', - containerPort: CaptainConstants.captainServiceExposedPort, - hostPort: CaptainConstants.captainServiceExposedPort, + containerPort: 3000, + hostPort: CaptainConstants.configs.adminPortNumber3000, }) return DockerApi.get().createServiceOnNodeId( diff --git a/src/utils/EnvVars.ts b/src/utils/EnvVars.ts index c33d3dd79..dc8e19ef1 100644 --- a/src/utils/EnvVars.ts +++ b/src/utils/EnvVars.ts @@ -1,3 +1,27 @@ + +/** + * Normalize a port into a number, string, or false. + */ + +function normalizePort(val: string | undefined, defaultPort: number): number { + if (val === undefined) { + return defaultPort + } + const port = parseInt(val, 10) + + if (isNaN(port)) { + // named pipe + return defaultPort + } + + if (port >= 0) { + // port number + return port + } + + return defaultPort +} + export default { keys: { CAPTAIN_DOCKER_API: 'CAPTAIN_DOCKER_API', @@ -6,6 +30,9 @@ export default { IS_CAPTAIN_INSTANCE: 'IS_CAPTAIN_INSTANCE', DEMO_MODE_ADMIN_IP: 'DEMO_MODE_ADMIN_IP', CAPTAIN_BASE_DIRECTORY: 'CAPTAIN_BASE_DIRECTORY', + CAPTAIN_HOST_HTTP_PORT: 'CAPTAIN_HOST_HTTP_PORT', + CAPTAIN_HOST_HTTPS_PORT: 'CAPTAIN_HOST_HTTPS_PORT', + CAPTAIN_HOST_ADMIN_PORT: 'CAPTAIN_HOST_ADMIN_PORT', }, BY_PASS_PROXY_CHECK: process.env.BY_PASS_PROXY_CHECK, @@ -14,6 +41,13 @@ export default { CAPTAIN_IS_DEBUG: !!process.env.CAPTAIN_IS_DEBUG, + // Host ports - external to container. Refer it via CaptainConstants.configs.nginxPortNumber80 + CAPTAIN_HOST_HTTP_PORT: normalizePort(process.env.CAPTAIN_HOST_HTTP_PORT, 80),//Tested with 10080 + // Host ports - external to container. Refer it via CaptainConstants.configs.nginxPortNumber443 + CAPTAIN_HOST_HTTPS_PORT: normalizePort(process.env.CAPTAIN_HOST_HTTPS_PORT, 443),//Tested with 10443 + // Host ports - external to container. Refer it via CaptainConstants.configs.adminPortNumber3000 + CAPTAIN_HOST_ADMIN_PORT: normalizePort(process.env.CAPTAIN_HOST_ADMIN_PORT, 3000),//Tested with 13000 + MAIN_NODE_IP_ADDRESS: process.env.MAIN_NODE_IP_ADDRESS, ACCEPTED_TERMS: !!process.env.ACCEPTED_TERMS,