diff --git a/Dockerfile b/Dockerfile index 2e5ff0339..ec4dbfff0 100644 --- a/Dockerfile +++ b/Dockerfile @@ -54,7 +54,7 @@ RUN apk add --no-cache su-exec iputils-ping shadow USER root ENV NODE_ENV=production -ENV HOSTNAME=0.0.0.0 +ENV HOSTNAME=:: ENV PORT=3000 EXPOSE $PORT diff --git a/docker-entrypoint.sh b/docker-entrypoint.sh index 5e8f7aa56..03b410f4d 100755 --- a/docker-entrypoint.sh +++ b/docker-entrypoint.sh @@ -12,6 +12,15 @@ export PGID=${PGID:-0} export HOMEPAGE_BUILDTIME=$(date +%s) +# Try IPv6 first (dual stack when available), but fall back to IPv4 if the bind fails +export HOSTNAME=${HOSTNAME:-::} +if [ "$HOSTNAME" = "::" ]; then + if ! node -e "const server = require('http').createServer(() => {}); const host = '::'; const port = process.env.PORT || 3000; server.once('error', (err) => { console.error('IPv6 bind failed:', err.message); process.exit(1); }); server.listen(port, host, () => server.close(() => process.exit(0)));"; then + echo "Falling back to IPv4 bind at 0.0.0.0" + export HOSTNAME=0.0.0.0 + fi +fi + # Check ownership before chown if [ -e /app/config ]; then CURRENT_UID=$(stat -c %u /app/config) diff --git a/docs/troubleshooting/index.md b/docs/troubleshooting/index.md index e5dc83df8..7324031d4 100644 --- a/docs/troubleshooting/index.md +++ b/docs/troubleshooting/index.md @@ -68,18 +68,6 @@ All service widgets work essentially the same, that is, homepage makes a proxied If, after correctly adding and mapping your custom icons via the [Icons](../configs/services.md#icons) instructions, you are still unable to see your icons please try recreating your container. -## Enabling IPv6 for the homepage container - -To enable IPv6 support for the homepage container, you can set the `HOSTNAME` environment variable, for example: - -```yaml -services: - homepage: - ... - environment: - - HOSTNAME=:: -``` - ## Disabling IPv6 for http requests {#disabling-ipv6} If you are having issues with certain widgets that are unable to reach public APIs (e.g. weather), in certain setups you may need to disable IPv6. You can set the environment variable `HOMEPAGE_PROXY_DISABLE_IPV6` to `true` to disable IPv6 for the homepage proxy. diff --git a/src/middleware.js b/src/middleware.js index bb9fbea52..f16b51745 100644 --- a/src/middleware.js +++ b/src/middleware.js @@ -4,7 +4,7 @@ export function middleware(req) { // Check the Host header, if HOMEPAGE_ALLOWED_HOSTS is set const host = req.headers.get("host"); const port = process.env.PORT || 3000; - let allowedHosts = [`localhost:${port}`, `127.0.0.1:${port}`]; + let allowedHosts = [`localhost:${port}`, `127.0.0.1:${port}`, `[::1]:${port}`]; const allowAll = process.env.HOMEPAGE_ALLOWED_HOSTS === "*"; if (process.env.HOMEPAGE_ALLOWED_HOSTS) { allowedHosts = allowedHosts.concat(process.env.HOMEPAGE_ALLOWED_HOSTS.split(","));