@imenam/self-register-proxy 1.0.47 → 1.0.48
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -0
- package/config.js +72 -72
- package/meta-config.js +336 -336
- package/package.json +2 -3
- package/routes/metaConfig.js +180 -180
- package/routes/registration.js +240 -240
- package/services/healthCheck.js +95 -95
- package/services/portManager.js +137 -137
- package/services/proxyRouter.js +99 -99
- package/services/registry.js +41 -41
- package/terminal-server.js +154 -154
package/README.md
CHANGED
|
@@ -585,6 +585,12 @@ Le format des logs inclut la date, l'heure, le PID et le tag `[PROXY]`.
|
|
|
585
585
|
que soit leur groupe
|
|
586
586
|
- Les applications doivent implémenter `GET /proxy/health` pour ne pas être désenregistrées automatiquement
|
|
587
587
|
|
|
588
|
+
## Publication
|
|
589
|
+
|
|
590
|
+
Chaque push sur `main`, merge de pull request compris, publie une nouvelle version de `@imenam/self-register-proxy` sur npm (`.github/workflows/publish.yml`) : `npm ci`, puis `npm version patch`, dont le commit et le tag sont poussés sur `main`, et `npm publish`. La publication passe par le trusted publishing de npm (OIDC, sans token), avec attestation de provenance.
|
|
591
|
+
|
|
592
|
+
Sur npmjs.com, le paquet déclare ce workflow comme publieur de confiance (Settings → Trusted publishing → GitHub Actions : `Matthieu-Pesnot-Pin`, `dynamic-self-register-proxy`, `publish.yml`, avec `npm publish` dans les actions autorisées). Le commit de version est poussé avec `GITHUB_TOKEN` : si `main` est protégée, la règle doit autoriser GitHub Actions à y pousser.
|
|
593
|
+
|
|
588
594
|
## Licence
|
|
589
595
|
|
|
590
596
|
ISC
|
package/config.js
CHANGED
|
@@ -1,72 +1,72 @@
|
|
|
1
|
-
const crypto = require('crypto');
|
|
2
|
-
|
|
3
|
-
const PROXY_PORT = process.env.PROXY_PORT || 3000;
|
|
4
|
-
const PROXY_NAME = process.env.PROXY_NAME || 'Proxy Server';
|
|
5
|
-
|
|
6
|
-
/**
|
|
7
|
-
* Interface d'écoute. Non définie = comportement historique : Express écoute sur
|
|
8
|
-
* **toutes** les interfaces (0.0.0.0), le dashboard et son terminal PTY sont donc
|
|
9
|
-
* joignables depuis le réseau. `PROXY_HOST=127.0.0.1` restreint l'écoute à la
|
|
10
|
-
* boucle locale — c'est ce que pose un superviseur qui démarre un proxy sans
|
|
11
|
-
* `PROXY_ADMIN_PASSWORD`.
|
|
12
|
-
*/
|
|
13
|
-
const PROXY_HOST = process.env.PROXY_HOST || undefined;
|
|
14
|
-
|
|
15
|
-
/**
|
|
16
|
-
* Plage des ports attribués aux applications enregistrées.
|
|
17
|
-
*
|
|
18
|
-
* Historiquement codée en dur à 4000-5000, ce qui rendait impossible de faire
|
|
19
|
-
* cohabiter deux proxys sur une même machine sans qu'ils se disputent les mêmes
|
|
20
|
-
* ports. Elle est désormais configurable ; **les valeurs par défaut ne changent
|
|
21
|
-
* pas**, et une valeur invalide est ignorée au profit du défaut.
|
|
22
|
-
*/
|
|
23
|
-
function readPortBound(name, fallback) {
|
|
24
|
-
const raw = process.env[name];
|
|
25
|
-
if (raw === undefined || raw === '') return fallback;
|
|
26
|
-
const value = Number.parseInt(raw, 10);
|
|
27
|
-
if (!Number.isInteger(value) || value < 1 || value > 65535) {
|
|
28
|
-
console.warn(`[CONFIG] ${name}="${raw}" invalide — valeur par défaut ${fallback} conservée.`);
|
|
29
|
-
return fallback;
|
|
30
|
-
}
|
|
31
|
-
return value;
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
let INTERNAL_PORT_START = readPortBound('PROXY_INTERNAL_PORT_START', 4000);
|
|
35
|
-
let INTERNAL_PORT_END = readPortBound('PROXY_INTERNAL_PORT_END', 5000);
|
|
36
|
-
if (INTERNAL_PORT_START > INTERNAL_PORT_END) {
|
|
37
|
-
console.warn(
|
|
38
|
-
`[CONFIG] Plage de ports internes inversée (${INTERNAL_PORT_START}-${INTERNAL_PORT_END}) — ` +
|
|
39
|
-
'retour aux valeurs par défaut 4000-5000.'
|
|
40
|
-
);
|
|
41
|
-
INTERNAL_PORT_START = 4000;
|
|
42
|
-
INTERNAL_PORT_END = 5000;
|
|
43
|
-
}
|
|
44
|
-
const HEALTH_CHECK_INTERVAL = process.env.HEALTH_CHECK_INTERVAL || 30000;
|
|
45
|
-
const HEALTH_CHECK_TIMEOUT = process.env.HEALTH_CHECK_TIMEOUT || 5000;
|
|
46
|
-
const HEALTH_CHECK_GRACE_PERIOD = process.env.HEALTH_CHECK_GRACE_PERIOD || 60000;
|
|
47
|
-
|
|
48
|
-
const ADMIN_PASSWORD = process.env.PROXY_ADMIN_PASSWORD;
|
|
49
|
-
const SESSION_SECRET = process.env.PROXY_SESSION_SECRET || crypto.randomBytes(32).toString('hex');
|
|
50
|
-
|
|
51
|
-
const TERMINAL_CWD = process.env.PROXY_TERMINAL_CWD || process.env.HOME || process.env.USERPROFILE;
|
|
52
|
-
const TERMINAL_COMMAND = process.env.PROXY_TERMINAL_COMMAND || '';
|
|
53
|
-
const OPENCODE_CLEAN_UP = process.env.PROXY_OPENCODE_CLEAN_UP || '';
|
|
54
|
-
|
|
55
|
-
const MINIMAL_DASHBOARD = process.argv.includes('--minimal-dashboard');
|
|
56
|
-
|
|
57
|
-
module.exports = {
|
|
58
|
-
PROXY_PORT,
|
|
59
|
-
PROXY_NAME,
|
|
60
|
-
PROXY_HOST,
|
|
61
|
-
INTERNAL_PORT_START,
|
|
62
|
-
INTERNAL_PORT_END,
|
|
63
|
-
HEALTH_CHECK_INTERVAL,
|
|
64
|
-
HEALTH_CHECK_TIMEOUT,
|
|
65
|
-
HEALTH_CHECK_GRACE_PERIOD,
|
|
66
|
-
ADMIN_PASSWORD,
|
|
67
|
-
SESSION_SECRET,
|
|
68
|
-
TERMINAL_CWD,
|
|
69
|
-
TERMINAL_COMMAND,
|
|
70
|
-
OPENCODE_CLEAN_UP,
|
|
71
|
-
MINIMAL_DASHBOARD,
|
|
72
|
-
};
|
|
1
|
+
const crypto = require('crypto');
|
|
2
|
+
|
|
3
|
+
const PROXY_PORT = process.env.PROXY_PORT || 3000;
|
|
4
|
+
const PROXY_NAME = process.env.PROXY_NAME || 'Proxy Server';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Interface d'écoute. Non définie = comportement historique : Express écoute sur
|
|
8
|
+
* **toutes** les interfaces (0.0.0.0), le dashboard et son terminal PTY sont donc
|
|
9
|
+
* joignables depuis le réseau. `PROXY_HOST=127.0.0.1` restreint l'écoute à la
|
|
10
|
+
* boucle locale — c'est ce que pose un superviseur qui démarre un proxy sans
|
|
11
|
+
* `PROXY_ADMIN_PASSWORD`.
|
|
12
|
+
*/
|
|
13
|
+
const PROXY_HOST = process.env.PROXY_HOST || undefined;
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Plage des ports attribués aux applications enregistrées.
|
|
17
|
+
*
|
|
18
|
+
* Historiquement codée en dur à 4000-5000, ce qui rendait impossible de faire
|
|
19
|
+
* cohabiter deux proxys sur une même machine sans qu'ils se disputent les mêmes
|
|
20
|
+
* ports. Elle est désormais configurable ; **les valeurs par défaut ne changent
|
|
21
|
+
* pas**, et une valeur invalide est ignorée au profit du défaut.
|
|
22
|
+
*/
|
|
23
|
+
function readPortBound(name, fallback) {
|
|
24
|
+
const raw = process.env[name];
|
|
25
|
+
if (raw === undefined || raw === '') return fallback;
|
|
26
|
+
const value = Number.parseInt(raw, 10);
|
|
27
|
+
if (!Number.isInteger(value) || value < 1 || value > 65535) {
|
|
28
|
+
console.warn(`[CONFIG] ${name}="${raw}" invalide — valeur par défaut ${fallback} conservée.`);
|
|
29
|
+
return fallback;
|
|
30
|
+
}
|
|
31
|
+
return value;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
let INTERNAL_PORT_START = readPortBound('PROXY_INTERNAL_PORT_START', 4000);
|
|
35
|
+
let INTERNAL_PORT_END = readPortBound('PROXY_INTERNAL_PORT_END', 5000);
|
|
36
|
+
if (INTERNAL_PORT_START > INTERNAL_PORT_END) {
|
|
37
|
+
console.warn(
|
|
38
|
+
`[CONFIG] Plage de ports internes inversée (${INTERNAL_PORT_START}-${INTERNAL_PORT_END}) — ` +
|
|
39
|
+
'retour aux valeurs par défaut 4000-5000.'
|
|
40
|
+
);
|
|
41
|
+
INTERNAL_PORT_START = 4000;
|
|
42
|
+
INTERNAL_PORT_END = 5000;
|
|
43
|
+
}
|
|
44
|
+
const HEALTH_CHECK_INTERVAL = process.env.HEALTH_CHECK_INTERVAL || 30000;
|
|
45
|
+
const HEALTH_CHECK_TIMEOUT = process.env.HEALTH_CHECK_TIMEOUT || 5000;
|
|
46
|
+
const HEALTH_CHECK_GRACE_PERIOD = process.env.HEALTH_CHECK_GRACE_PERIOD || 60000;
|
|
47
|
+
|
|
48
|
+
const ADMIN_PASSWORD = process.env.PROXY_ADMIN_PASSWORD;
|
|
49
|
+
const SESSION_SECRET = process.env.PROXY_SESSION_SECRET || crypto.randomBytes(32).toString('hex');
|
|
50
|
+
|
|
51
|
+
const TERMINAL_CWD = process.env.PROXY_TERMINAL_CWD || process.env.HOME || process.env.USERPROFILE;
|
|
52
|
+
const TERMINAL_COMMAND = process.env.PROXY_TERMINAL_COMMAND || '';
|
|
53
|
+
const OPENCODE_CLEAN_UP = process.env.PROXY_OPENCODE_CLEAN_UP || '';
|
|
54
|
+
|
|
55
|
+
const MINIMAL_DASHBOARD = process.argv.includes('--minimal-dashboard');
|
|
56
|
+
|
|
57
|
+
module.exports = {
|
|
58
|
+
PROXY_PORT,
|
|
59
|
+
PROXY_NAME,
|
|
60
|
+
PROXY_HOST,
|
|
61
|
+
INTERNAL_PORT_START,
|
|
62
|
+
INTERNAL_PORT_END,
|
|
63
|
+
HEALTH_CHECK_INTERVAL,
|
|
64
|
+
HEALTH_CHECK_TIMEOUT,
|
|
65
|
+
HEALTH_CHECK_GRACE_PERIOD,
|
|
66
|
+
ADMIN_PASSWORD,
|
|
67
|
+
SESSION_SECRET,
|
|
68
|
+
TERMINAL_CWD,
|
|
69
|
+
TERMINAL_COMMAND,
|
|
70
|
+
OPENCODE_CLEAN_UP,
|
|
71
|
+
MINIMAL_DASHBOARD,
|
|
72
|
+
};
|