mirror of
https://github.com/gethomepage/homepage.git
synced 2025-12-05 21:47:48 +01:00
Compare commits
14 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6292a0709c | ||
|
|
42af93bef3 | ||
|
|
964991781c | ||
|
|
607a14083e | ||
|
|
133a0a6539 | ||
|
|
0d0f465e16 | ||
|
|
16c1b2da9b | ||
|
|
4761a56b3d | ||
|
|
9d40b67d49 | ||
|
|
97f4bcbdb0 | ||
|
|
ea1375e575 | ||
|
|
733a3140d1 | ||
|
|
b5ac617597 | ||
|
|
9b06212a92 |
@@ -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"]
|
||||
|
||||
@@ -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, <code>HOMEPAGE_ALLOWED_HOSTS</code>. 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, <code>HOMEPAGE_ALLOWED_HOSTS</code>. 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.
|
||||
|
||||
@@ -3,85 +3,6 @@ title: Kubernetes Installation
|
||||
description: Install on Kubernetes
|
||||
---
|
||||
|
||||
## Install with Helm
|
||||
|
||||
There is an [unofficial helm chart](https://github.com/jameswynn/helm-charts/tree/main/charts/homepage) that creates all the necessary manifests, including the service account and RBAC entities necessary for service discovery.
|
||||
|
||||
```sh
|
||||
helm repo add jameswynn https://jameswynn.github.io/helm-charts
|
||||
helm install homepage jameswynn/homepage -f values.yaml
|
||||
```
|
||||
|
||||
The helm chart allows for all the configurations to be inlined directly in your `values.yaml`:
|
||||
|
||||
```yaml
|
||||
config:
|
||||
bookmarks:
|
||||
- Developer:
|
||||
- Github:
|
||||
- abbr: GH
|
||||
href: https://github.com/
|
||||
services:
|
||||
- My First Group:
|
||||
- My First Service:
|
||||
href: http://localhost/
|
||||
description: Homepage is awesome
|
||||
|
||||
- My Second Group:
|
||||
- My Second Service:
|
||||
href: http://localhost/
|
||||
description: Homepage is the best
|
||||
|
||||
- My Third Group:
|
||||
- My Third Service:
|
||||
href: http://localhost/
|
||||
description: Homepage is 😎
|
||||
widgets:
|
||||
# show the kubernetes widget, with the cluster summary and individual nodes
|
||||
- kubernetes:
|
||||
cluster:
|
||||
show: true
|
||||
cpu: true
|
||||
memory: true
|
||||
showLabel: true
|
||||
label: "cluster"
|
||||
nodes:
|
||||
show: true
|
||||
cpu: true
|
||||
memory: true
|
||||
showLabel: true
|
||||
- search:
|
||||
provider: duckduckgo
|
||||
target: _blank
|
||||
kubernetes:
|
||||
mode: cluster
|
||||
settings:
|
||||
|
||||
# The service account is necessary to allow discovery of other services
|
||||
serviceAccount:
|
||||
create: true
|
||||
name: homepage
|
||||
|
||||
# This enables the service account to access the necessary resources
|
||||
enableRbac: true
|
||||
|
||||
ingress:
|
||||
main:
|
||||
enabled: true
|
||||
annotations:
|
||||
# Example annotations to add Homepage to your Homepage!
|
||||
gethomepage.dev/enabled: "true"
|
||||
gethomepage.dev/name: "Homepage"
|
||||
gethomepage.dev/description: "Dynamically Detected Homepage"
|
||||
gethomepage.dev/group: "Dynamic"
|
||||
gethomepage.dev/icon: "homepage.png"
|
||||
hosts:
|
||||
- host: homepage.example.com
|
||||
paths:
|
||||
- path: /
|
||||
pathType: Prefix
|
||||
```
|
||||
|
||||
## Install with Kubernetes Manifests
|
||||
|
||||
If you don't want to use the unofficial Helm chart, you can also create your own Kubernetes manifest(s) and apply them with `kubectl apply -f filename.yaml`.
|
||||
@@ -302,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
|
||||
|
||||
@@ -12,6 +12,7 @@ hide:
|
||||
- Check config/logs/homepage.log, on docker simply e.g. `docker logs homepage`. This may provide some insight into the reason for an error.
|
||||
- Check the browser error console, this can also sometimes provide useful information.
|
||||
- Consider setting the `ENV` variable `LOG_LEVEL` to `debug`.
|
||||
- If certain widgets are failing when connecting to public APIs, consider [disabling IPv6](#disabling-ipv6).
|
||||
|
||||
## Service Widget Errors
|
||||
|
||||
@@ -66,3 +67,24 @@ All service widgets work essentially the same, that is, homepage makes a proxied
|
||||
## Missing custom icons
|
||||
|
||||
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.
|
||||
|
||||
## Disabling IPv6
|
||||
|
||||
If you are having issues with certain widgets that are unable to reach public APIs (e.g. weather), you may need to disable IPv6 on your host machine. This can be done by adding the following to your `docker-compose.yml` file (or for docker run, the equivalent flag):
|
||||
|
||||
```yaml
|
||||
services:
|
||||
homepage:
|
||||
...
|
||||
sysctls:
|
||||
- net.ipv6.conf.all.disable_ipv6=1
|
||||
```
|
||||
|
||||
or disable IPv6 for the docker network:
|
||||
|
||||
```yaml
|
||||
networks:
|
||||
some_network:
|
||||
driver: bridge
|
||||
enable_ipv6: false
|
||||
```
|
||||
|
||||
@@ -20,4 +20,5 @@ widget:
|
||||
url: http://komga.host.or.ip:port
|
||||
username: username
|
||||
password: password
|
||||
key: komgaapikey # optional
|
||||
```
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "homepage",
|
||||
"version": "1.0.2",
|
||||
"version": "1.0.3",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"preinstall": "npx only-allow pnpm",
|
||||
|
||||
@@ -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 ? (
|
||||
|
||||
@@ -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.`,
|
||||
|
||||
@@ -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}` : ""}`;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -36,14 +36,14 @@ export default function Component({ service }) {
|
||||
<Block
|
||||
label="speedtest.download"
|
||||
value={t("common.bitrate", {
|
||||
value: speedtestData.data.download * 1000 * 1000,
|
||||
value: widget.version === 2 ? speedtestData.data.download * 8 : speedtestData.data.download * 1000 * 1000,
|
||||
decimals: bitratePrecision,
|
||||
})}
|
||||
/>
|
||||
<Block
|
||||
label="speedtest.upload"
|
||||
value={t("common.bitrate", {
|
||||
value: speedtestData.data.upload * 1000 * 1000,
|
||||
value: widget.version === 2 ? speedtestData.data.upload * 8 : speedtestData.data.upload * 1000 * 1000,
|
||||
decimals: bitratePrecision,
|
||||
})}
|
||||
/>
|
||||
|
||||
Reference in New Issue
Block a user