diff --git a/Dockerfile b/Dockerfile
index 2c15dc6c0..7963407c3 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -56,12 +56,12 @@ COPY --link --chmod=755 docker-entrypoint.sh /usr/local/bin/
RUN apk add --no-cache su-exec
-ENV HOSTNAME=::
+ENV HOSTNAME=0.0.0.0
ENV PORT=3000
EXPOSE $PORT
HEALTHCHECK --interval=10s --timeout=3s --start-period=20s \
- CMD wget --no-verbose --tries=1 --spider --no-check-certificate http://localhost:$PORT/api/healthcheck || exit 1
+ CMD wget --no-verbose --tries=1 --spider --no-check-certificate http://127.0.0.1:$PORT/api/healthcheck || exit 1
ENTRYPOINT ["docker-entrypoint.sh"]
CMD ["node", "server.js"]
diff --git a/docs/installation/index.md b/docs/installation/index.md
index dd8c18f3d..cc5f7a078 100644
--- a/docs/installation/index.md
+++ b/docs/installation/index.md
@@ -29,4 +29,8 @@ You have a few options for deploying homepage, depending on your needs. We offer
### `HOMEPAGE_ALLOWED_HOSTS`
-As of v1.0 there is one required environment variable when deploying via a public URL, HOMEPAGE_ALLOWED_HOSTS
. This is a comma separated (no spaces) list of allowed hosts (sometimes with the port) that can access your homepage. See the [docker](docker.md) and [source](source.md) installation pages for examples.
+As of v1.0 there is one required environment variable when deploying via a public URL, HOMEPAGE_ALLOWED_HOSTS
. This is a comma separated (no spaces) list of allowed hosts (sometimes with the port) that can access your homepage. See the [docker](docker.md) and [source](source.md) installation pages for more information.
+
+`localhost:3000` and `127.0.0.1:3000` are always allowed, but you can add a domain or IP address to this list to allow access from that host such as `HOMEPAGE_ALLOWED_HOSTS=gethomepage.dev,192.168.1.2:1234`, etc.
+
+This can be disabled by setting `HOMEPAGE_ALLOWED_HOSTS` to `*` but this is not recommended.
diff --git a/docs/installation/k8s.md b/docs/installation/k8s.md
index a8cdc8d67..87112f0fc 100644
--- a/docs/installation/k8s.md
+++ b/docs/installation/k8s.md
@@ -223,6 +223,9 @@ spec:
- name: homepage
image: "ghcr.io/gethomepage/homepage:latest"
imagePullPolicy: Always
+ env:
+ - name: HOMEPAGE_ALLOWED_HOSTS
+ value: gethomepage.dev # required, may need port
ports:
- name: http
containerPort: 3000
diff --git a/src/components/bookmarks/item.jsx b/src/components/bookmarks/item.jsx
index dd18bb71a..4208f0701 100644
--- a/src/components/bookmarks/item.jsx
+++ b/src/components/bookmarks/item.jsx
@@ -22,7 +22,7 @@ export default function Item({ bookmark, iconOnly = false }) {
className={classNames(
settings.cardBlur !== undefined && `backdrop-blur${settings.cardBlur.length ? "-" : ""}${settings.cardBlur}`,
"text-left cursor-pointer transition-all rounded-md font-medium text-theme-700 dark:text-theme-200 dark:hover:text-theme-300 shadow-md shadow-theme-900/10 dark:shadow-theme-900/20 bg-theme-100/20 hover:bg-theme-300/20 dark:bg-white/5 dark:hover:bg-white/10",
- iconOnly ? "h-[60px] w-[60px] grid" : "block w-full h-8 mb-3",
+ iconOnly ? "h-[60px] w-[60px] grid" : "block w-full h-full mb-3",
)}
>
{iconOnly ? (
diff --git a/src/middleware.js b/src/middleware.js
index f20119031..bb9fbea52 100644
--- a/src/middleware.js
+++ b/src/middleware.js
@@ -4,11 +4,12 @@ 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}`];
+ let allowedHosts = [`localhost:${port}`, `127.0.0.1:${port}`];
+ const allowAll = process.env.HOMEPAGE_ALLOWED_HOSTS === "*";
if (process.env.HOMEPAGE_ALLOWED_HOSTS) {
allowedHosts = allowedHosts.concat(process.env.HOMEPAGE_ALLOWED_HOSTS.split(","));
}
- if (!host || !allowedHosts.includes(host)) {
+ if (!allowAll && (!host || !allowedHosts.includes(host))) {
// eslint-disable-next-line no-console
console.error(
`Host validation failed for: ${host}. Hint: Set the HOMEPAGE_ALLOWED_HOSTS environment variable to allow requests from this host / port.`,
diff --git a/src/widgets/emby/component.jsx b/src/widgets/emby/component.jsx
index b37b50187..41220e227 100644
--- a/src/widgets/emby/component.jsx
+++ b/src/widgets/emby/component.jsx
@@ -35,8 +35,8 @@ function generateStreamTitle(session, enableUser, showEpisodeNumber) {
let streamTitle = "";
if (Type === "Episode" && showEpisodeNumber) {
- const seasonStr = `S${ParentIndexNumber.toString().padStart(2, "0")}`;
- const episodeStr = `E${IndexNumber.toString().padStart(2, "0")}`;
+ const seasonStr = ParentIndexNumber ? `S${ParentIndexNumber.toString().padStart(2, "0")}` : "";
+ const episodeStr = IndexNumber ? `E${IndexNumber.toString().padStart(2, "0")}` : "";
streamTitle = `${SeriesName}: ${seasonStr} ยท ${episodeStr} - ${Name}`;
} else {
streamTitle = `${Name}${SeriesName ? ` - ${SeriesName}` : ""}`;
diff --git a/src/widgets/kavita/proxy.js b/src/widgets/kavita/proxy.js
index af29d048a..842e4b875 100644
--- a/src/widgets/kavita/proxy.js
+++ b/src/widgets/kavita/proxy.js
@@ -14,7 +14,11 @@ async function login(widget, service) {
const endpoint = "Account/login";
const api = widgets?.[widget.type]?.api;
const loginUrl = new URL(formatApiCall(api, { endpoint, ...widget }));
- const loginBody = {};
+ const loginBody = {
+ username: "",
+ password: "",
+ apiKey: "",
+ };
if (widget.username && widget.password) {
loginBody.username = widget.username;
loginBody.password = widget.password;
diff --git a/src/widgets/speedtest/component.jsx b/src/widgets/speedtest/component.jsx
index b4fbeaa6a..e34f53aca 100644
--- a/src/widgets/speedtest/component.jsx
+++ b/src/widgets/speedtest/component.jsx
@@ -36,14 +36,14 @@ export default function Component({ service }) {