Compare commits

...

6 Commits

Author SHA1 Message Date
shamoon
9bcbb94523 Update index.md 2025-05-09 01:22:06 -07:00
shamoon
b118fa1204 Update http.js 2025-05-09 01:16:32 -07:00
shamoon
b430a6f515 rename var 2025-05-09 01:15:49 -07:00
shamoon
8ba3cae921 Log 2025-05-09 01:14:02 -07:00
shamoon
8f25bf5427 fix request 2025-05-09 01:12:41 -07:00
shamoon
da823ad7e8 Enhancement: support running behind proxy 2025-05-09 01:11:20 -07:00
4 changed files with 65 additions and 14 deletions

View File

@@ -81,3 +81,15 @@ services:
sysctls: sysctls:
- net.ipv6.conf.all.disable_ipv6=1 - net.ipv6.conf.all.disable_ipv6=1
``` ```
## Running homepage behind a proxy
If you are running homepage behind e.g. squid proxy, you can set the environment variable `HOMEPAGE_HTTP_PROXY` to the URL of your proxy. This will allow homepage to use the proxy for all outgoing requests.
```yaml
services:
homepage:
...
environment:
- HOMEPAGE_HTTP_PROXY=http://proxy.local:3128
```

View File

@@ -18,6 +18,8 @@
"dockerode": "^4.0.4", "dockerode": "^4.0.4",
"follow-redirects": "^1.15.9", "follow-redirects": "^1.15.9",
"gamedig": "^5.2.0", "gamedig": "^5.2.0",
"http-proxy-agent": "^7.0.2",
"https-proxy-agent": "^7.0.6",
"i18next": "^24.2.3", "i18next": "^24.2.3",
"ical.js": "^2.1.0", "ical.js": "^2.1.0",
"js-yaml": "^4.1.0", "js-yaml": "^4.1.0",

42
pnpm-lock.yaml generated
View File

@@ -29,6 +29,12 @@ importers:
gamedig: gamedig:
specifier: ^5.2.0 specifier: ^5.2.0
version: 5.2.0 version: 5.2.0
http-proxy-agent:
specifier: ^7.0.2
version: 7.0.2
https-proxy-agent:
specifier: ^7.0.6
version: 7.0.6
i18next: i18next:
specifier: ^24.2.3 specifier: ^24.2.3
version: 24.2.3(typescript@5.7.3) version: 24.2.3(typescript@5.7.3)
@@ -98,10 +104,6 @@ importers:
xml-js: xml-js:
specifier: ^1.6.11 specifier: ^1.6.11
version: 1.6.11 version: 1.6.11
optionalDependencies:
osx-temperature-sensor:
specifier: ^1.0.8
version: 1.0.8
devDependencies: devDependencies:
'@tailwindcss/forms': '@tailwindcss/forms':
specifier: ^0.5.10 specifier: ^0.5.10
@@ -151,6 +153,10 @@ importers:
typescript: typescript:
specifier: ^5.7.3 specifier: ^5.7.3
version: 5.7.3 version: 5.7.3
optionalDependencies:
osx-temperature-sensor:
specifier: ^1.0.8
version: 1.0.8
packages: packages:
@@ -824,6 +830,10 @@ packages:
engines: {node: '>=0.4.0'} engines: {node: '>=0.4.0'}
hasBin: true hasBin: true
agent-base@7.1.3:
resolution: {integrity: sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==}
engines: {node: '>= 14'}
ajv@6.12.6: ajv@6.12.6:
resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==}
@@ -1646,10 +1656,18 @@ packages:
resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==}
engines: {node: '>= 0.8'} engines: {node: '>= 0.8'}
http-proxy-agent@7.0.2:
resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==}
engines: {node: '>= 14'}
http2-wrapper@2.2.1: http2-wrapper@2.2.1:
resolution: {integrity: sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==} resolution: {integrity: sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==}
engines: {node: '>=10.19.0'} engines: {node: '>=10.19.0'}
https-proxy-agent@7.0.6:
resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==}
engines: {node: '>= 14'}
i18next-fs-backend@1.2.0: i18next-fs-backend@1.2.0:
resolution: {integrity: sha512-pUx3AcgXCbur0jpFA7U67Z2RJflAcIi698Y8VL+phdOqUchahxriV3Cs+M6UkPNQSS/zPEzWLfdJ8EgjB7HVxg==} resolution: {integrity: sha512-pUx3AcgXCbur0jpFA7U67Z2RJflAcIi698Y8VL+phdOqUchahxriV3Cs+M6UkPNQSS/zPEzWLfdJ8EgjB7HVxg==}
@@ -3501,6 +3519,8 @@ snapshots:
acorn@8.14.1: {} acorn@8.14.1: {}
agent-base@7.1.3: {}
ajv@6.12.6: ajv@6.12.6:
dependencies: dependencies:
fast-deep-equal: 3.1.3 fast-deep-equal: 3.1.3
@@ -4526,11 +4546,25 @@ snapshots:
statuses: 2.0.1 statuses: 2.0.1
toidentifier: 1.0.1 toidentifier: 1.0.1
http-proxy-agent@7.0.2:
dependencies:
agent-base: 7.1.3
debug: 4.4.0
transitivePeerDependencies:
- supports-color
http2-wrapper@2.2.1: http2-wrapper@2.2.1:
dependencies: dependencies:
quick-lru: 5.1.1 quick-lru: 5.1.1
resolve-alpn: 1.2.1 resolve-alpn: 1.2.1
https-proxy-agent@7.0.6:
dependencies:
agent-base: 7.1.3
debug: 4.4.0
transitivePeerDependencies:
- supports-color
i18next-fs-backend@1.2.0: {} i18next-fs-backend@1.2.0: {}
i18next@21.10.0: i18next@21.10.0:

View File

@@ -110,21 +110,24 @@ export async function cachedRequest(url, duration = 5, ua = "homepage") {
export async function httpProxy(url, params = {}) { export async function httpProxy(url, params = {}) {
const constructedUrl = new URL(url); const constructedUrl = new URL(url);
const proxyUrl = process.env.HOMEPAGE_HTTP_PROXY; // e.g. http://proxy.local:3128
const disableIpv6 = process.env.HOMEPAGE_PROXY_DISABLE_IPV6 === "true"; const disableIpv6 = process.env.HOMEPAGE_PROXY_DISABLE_IPV6 === "true";
const agentOptions = disableIpv6 ? { family: 4, autoSelectFamily: false } : {}; const agentOptions = disableIpv6 ? { family: 4, autoSelectFamily: false } : {};
let request = null; let agent;
if (constructedUrl.protocol === "https:") { if (proxyUrl) {
request = httpsRequest(constructedUrl, { agent = constructedUrl.protocol === "https:" ? new HttpsProxyAgent(proxyUrl) : new HttpProxyAgent(proxyUrl);
agent: new https.Agent({ ...agentOptions, rejectUnauthorized: false }), logger.debug("Using proxy for request to %s: %s", constructedUrl.href, proxyUrl);
...params,
});
} else { } else {
request = httpRequest(constructedUrl, { agent =
agent: new http.Agent(agentOptions), constructedUrl.protocol === "https:"
...params, ? new https.Agent({ ...agentOptions, rejectUnauthorized: false })
}); : new http.Agent(agentOptions);
} }
const request =
constructedUrl.protocol === "https:"
? httpsRequest(constructedUrl, { agent, ...params })
: httpRequest(constructedUrl, { agent, ...params });
try { try {
const [status, contentType, data, responseHeaders] = await request; const [status, contentType, data, responseHeaders] = await request;