Allow specifying interface with -p and --app-port

The syntax is "--port host:port".

Not implemented for test-packages. No control is available over mongo
ports (port or host).

Fixes #469 and #1105.
This commit is contained in:
David Glasser
2014-04-18 14:15:14 -07:00
parent a4a66aeede
commit 9b8bd31a7b
5 changed files with 62 additions and 12 deletions

View File

@@ -153,8 +153,8 @@ main.registerCommand({
name: 'run', name: 'run',
requiresApp: true, requiresApp: true,
options: { options: {
port: { type: Number, short: "p", default: 3000 }, port: { type: String, short: "p", default: '3000' },
'app-port': { type: Number }, 'app-port': { type: String },
production: { type: Boolean }, production: { type: Boolean },
'raw-logs': { type: Boolean }, 'raw-logs': { type: Boolean },
settings: { type: String }, settings: { type: String },
@@ -166,6 +166,32 @@ main.registerCommand({
once: { type: Boolean } once: { type: Boolean }
} }
}, function (options) { }, function (options) {
// XXX factor this out into a {type: host/port}?
var portMatch = options.port.match(/^(?:(.+):)?([0-9]+)$/);
if (!portMatch) {
process.stderr.write(
"run: --port (-p) must be a number or be of the form 'host:port' where\n" +
"port is a number. Try 'meteor help run' for help.\n");
return 1;
}
var proxyHost = portMatch[1] || null;
var proxyPort = parseInt(portMatch[2]);
var appHost, appPort;
if (options['app-port']) {
var appPortMatch = options['app-port'].match(/^(?:(.+):)?([0-9]+)?$/);
if (!appPortMatch) {
process.stderr.write(
"run: --app-port must be a number or be of the form 'host:port' where\n" +
"port is a number. Try 'meteor help run' for help.\n");
return 1;
}
appHost = appPortMatch[1] || null;
// It's legit to specify `--app-port host:` and still let the port be
// randomized.
appPort = appPortMatch[2] ? parseInt(appPortMatch[2]) : null;
}
if (release.forced) { if (release.forced) {
var appRelease = project.getMeteorReleaseVersion(options.appDir); var appRelease = project.getMeteorReleaseVersion(options.appDir);
if (release.current.name !== appRelease) { if (release.current.name !== appRelease) {
@@ -182,8 +208,10 @@ main.registerCommand({
var runAll = require('./run-all.js'); var runAll = require('./run-all.js');
return runAll.run(options.appDir, { return runAll.run(options.appDir, {
proxyPort: options.port, proxyPort: proxyPort,
appPort: options['app-port'], proxyHost: proxyHost,
appPort: appPort,
appHost: appHost,
settingsFile: options.settings, settingsFile: options.settings,
program: options.program || undefined, program: options.program || undefined,
buildOptions: { buildOptions: {

View File

@@ -34,6 +34,7 @@ the .meteor directory in the root of the project.
Options: Options:
--port, -p Port to listen on (instead of the default 3000). Also --port, -p Port to listen on (instead of the default 3000). Also
uses port N+1 and a port specified by --app-port. uses port N+1 and a port specified by --app-port.
Specify as --port=host:port to bind to a specific interface.
--production Simulate production mode. Minify and bundle CSS and JS files. --production Simulate production mode. Minify and bundle CSS and JS files.
--raw-logs Run without parsing logs from stdout and stderr. --raw-logs Run without parsing logs from stdout and stderr.
--settings Set optional data for Meteor.settings on the server --settings Set optional data for Meteor.settings on the server

View File

@@ -29,11 +29,19 @@ var Runner = function (appDir, options) {
self.stopped = false; self.stopped = false;
self.quiet = options.quiet; self.quiet = options.quiet;
self.banner = options.banner || files.prettyPath(self.appDir); self.banner = options.banner || files.prettyPath(self.appDir);
self.rootUrl = options.rootUrl || ('http://localhost:' + listenPort + '/'); if (options.rootUrl) {
self.rootUrl = options.rootUrl;
} else if (options.proxyHost) {
self.rootUrl = 'http://' + options.proxyHost + ':' + listenPort + '/';
} else {
self.rootUrl = 'http://localhost:' + listenPort + '/';
}
self.proxy = new Proxy({ self.proxy = new Proxy({
listenPort: listenPort, listenPort: listenPort,
listenHost: options.proxyHost,
proxyToPort: self.appPort, proxyToPort: self.appPort,
proxyToHost: options.appHost,
onFailure: options.onFailure onFailure: options.onFailure
}); });
@@ -61,6 +69,7 @@ var Runner = function (appDir, options) {
self.appRunner = new AppRunner(appDir, { self.appRunner = new AppRunner(appDir, {
appDirForVersionCheck: options.appDirForVersionCheck, appDirForVersionCheck: options.appDirForVersionCheck,
port: self.appPort, port: self.appPort,
listenHost: options.appHost,
mongoUrl: mongoUrl, mongoUrl: mongoUrl,
oplogUrl: oplogUrl, oplogUrl: oplogUrl,
buildOptions: options.buildOptions, buildOptions: options.buildOptions,

View File

@@ -51,6 +51,7 @@ var AppProcess = function (options) {
self.bundlePath = options.bundlePath; self.bundlePath = options.bundlePath;
self.port = options.port; self.port = options.port;
self.listenHost = options.listenHost;
self.rootUrl = options.rootUrl; self.rootUrl = options.rootUrl;
self.mongoUrl = options.mongoUrl; self.mongoUrl = options.mongoUrl;
self.oplogUrl = options.oplogUrl; self.oplogUrl = options.oplogUrl;
@@ -168,12 +169,19 @@ _.extend(AppProcess.prototype, {
env.PORT = self.port; env.PORT = self.port;
env.ROOT_URL = self.rootUrl; env.ROOT_URL = self.rootUrl;
env.MONGO_URL = self.mongoUrl; env.MONGO_URL = self.mongoUrl;
if (self.oplogUrl) if (self.oplogUrl) {
env.MONGO_OPLOG_URL = self.oplogUrl; env.MONGO_OPLOG_URL = self.oplogUrl;
if (self.settings) }
if (self.settings) {
env.METEOR_SETTINGS = self.settings; env.METEOR_SETTINGS = self.settings;
else } else {
delete env.METEOR_SETTINGS; delete env.METEOR_SETTINGS;
}
if (self.listenHost) {
env.BIND_IP = self.listenHost;
} else {
delete env.BIND_IP;
}
// Display errors from (eg) the NPM connect module over the network. // Display errors from (eg) the NPM connect module over the network.
env.NODE_ENV = 'development'; env.NODE_ENV = 'development';
@@ -306,6 +314,7 @@ var AppRunner = function (appDir, options) {
self.appDirForVersionCheck = options.appDirForVersionCheck || self.appDir; self.appDirForVersionCheck = options.appDirForVersionCheck || self.appDir;
// note: run-all.js updates port directly // note: run-all.js updates port directly
self.port = options.port; self.port = options.port;
self.listenHost = options.listenHost;
self.mongoUrl = options.mongoUrl; self.mongoUrl = options.mongoUrl;
self.oplogUrl = options.oplogUrl; self.oplogUrl = options.oplogUrl;
self.buildOptions = options.buildOptions; self.buildOptions = options.buildOptions;
@@ -444,6 +453,7 @@ _.extend(AppRunner.prototype, {
var appProcess = new AppProcess({ var appProcess = new AppProcess({
bundlePath: bundlePath, bundlePath: bundlePath,
port: self.port, port: self.port,
listenHost: self.listenHost,
rootUrl: self.rootUrl, rootUrl: self.rootUrl,
mongoUrl: self.mongoUrl, mongoUrl: self.mongoUrl,
oplogUrl: self.oplogUrl, oplogUrl: self.oplogUrl,

View File

@@ -2,13 +2,15 @@ var _ = require('underscore');
var Future = require('fibers/future'); var Future = require('fibers/future');
var runLog = require('./run-log.js'); var runLog = require('./run-log.js');
// options: listenPort, proxyToPort, onFailure // options: listenPort, proxyToPort, proxyToHost, onFailure
var Proxy = function (options) { var Proxy = function (options) {
var self = this; var self = this;
self.listenPort = options.listenPort; self.listenPort = options.listenPort;
self.listenHost = options.listenHost;
// note: run-all.js updates proxyToPort directly // note: run-all.js updates proxyToPort directly
self.proxyToPort = options.proxyToPort; self.proxyToPort = options.proxyToPort;
self.proxyToHost = options.proxyToHost || '127.0.0.1';
self.onFailure = options.onFailure || function () {}; self.onFailure = options.onFailure || function () {};
self.mode = "hold"; self.mode = "hold";
@@ -91,7 +93,7 @@ _.extend(Proxy.prototype, {
} }
}); });
self.server.listen(self.listenPort, function () { self.server.listen(self.listenPort, self.listenHost || '0.0.0.0', function () {
if (self.server) { if (self.server) {
self.started = true; self.started = true;
} else { } else {
@@ -167,7 +169,7 @@ _.extend(Proxy.prototype, {
c.res.end(); c.res.end();
} else { } else {
self.proxy.web(c.req, c.res, { self.proxy.web(c.req, c.res, {
target: 'http://127.0.0.1:' + self.proxyToPort target: 'http://' + self.proxyToHost + ':' + self.proxyToPort
}); });
} }
} }
@@ -178,7 +180,7 @@ _.extend(Proxy.prototype, {
var c = self.websocketQueue.shift(); var c = self.websocketQueue.shift();
self.proxy.ws(c.req, c.socket, c.head, { self.proxy.ws(c.req, c.socket, c.head, {
target: 'http://127.0.0.1:' + self.proxyToPort target: 'http://' + self.proxyToHost + ':' + self.proxyToPort
}); });
} }
}, },