mirror of
https://github.com/gethomepage/homepage.git
synced 2025-12-07 21:59:50 +01:00
Compare commits
2 Commits
4031178831
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0d788e3d06 | ||
|
|
8887281246 |
@@ -571,18 +571,3 @@ or per service widget (`services.yaml`) with:
|
||||
```
|
||||
|
||||
If either value is set to true, the error message will be hidden.
|
||||
|
||||
## Disable Search Engine Indexing
|
||||
|
||||
You can request that search engines not to index your Homepage instance by enabling the `disableIndexing` setting.
|
||||
|
||||
```yaml
|
||||
disableIndexing: true
|
||||
```
|
||||
|
||||
When enabled, this will:
|
||||
|
||||
- Disallow all crawlers in `robots.txt`
|
||||
- Add `<meta name="robots" content="noindex, nofollow">` tags to prevent indexing
|
||||
|
||||
By default this feature is disabled.
|
||||
|
||||
@@ -14,7 +14,7 @@ services:
|
||||
- 3000:3000
|
||||
volumes:
|
||||
- /path/to/config:/app/config # Make sure your local config directory exists
|
||||
- /var/run/docker.sock:/var/run/docker.sock # (optional) For docker integrations
|
||||
- /var/run/docker.sock:/var/run/docker.sock:ro # (optional) For docker integrations
|
||||
environment:
|
||||
HOMEPAGE_ALLOWED_HOSTS: gethomepage.dev # required, may need port. See gethomepage.dev/installation/#homepage_allowed_hosts
|
||||
```
|
||||
@@ -36,7 +36,7 @@ services:
|
||||
- 3000:3000
|
||||
volumes:
|
||||
- /path/to/config:/app/config # Make sure your local config directory exists
|
||||
- /var/run/docker.sock:/var/run/docker.sock # (optional) For docker integrations, see alternative methods
|
||||
- /var/run/docker.sock:/var/run/docker.sock:ro # (optional) For docker integrations, see alternative methods
|
||||
environment:
|
||||
HOMEPAGE_ALLOWED_HOSTS: gethomepage.dev # required, may need port. See gethomepage.dev/installation/#homepage_allowed_hosts
|
||||
PUID: $PUID
|
||||
|
||||
@@ -68,7 +68,19 @@ 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.
|
||||
|
||||
## Disabling IPv6
|
||||
## 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.
|
||||
|
||||
|
||||
@@ -8,9 +8,6 @@ Learn more about [Crowdsec](https://crowdsec.net).
|
||||
See the [crowdsec docs](https://docs.crowdsec.net/docs/local_api/intro/#machines) for information about registering a machine,
|
||||
in most instances you can use the default credentials (`/etc/crowdsec/local_api_credentials.yaml`).
|
||||
|
||||
!!! note
|
||||
Without the `limit24h` option, the widget will fetch all alerts which is limited to 100 by the API to avoid performance issues.
|
||||
|
||||
Allowed fields: `["alerts", "bans"]`.
|
||||
|
||||
```yaml
|
||||
@@ -19,5 +16,4 @@ widget:
|
||||
url: http://crowdsechostorip:port
|
||||
username: localhost # machine_id in crowdsec
|
||||
password: password
|
||||
limit24h: true # optional, limits alerts to last 24h. Default: false
|
||||
```
|
||||
|
||||
@@ -15,7 +15,7 @@ See the [official docs](https://github.com/ghostfolio/ghostfolio#authorization-b
|
||||
|
||||
_Note that the Bearer token is valid for 6 months, after which a new one must be generated._
|
||||
|
||||
Allowed fields: `["gross_percent_today", "gross_percent_1y", "gross_percent_max", "net_worth"]`
|
||||
Allowed fields: `["gross_percent_today", "gross_percent_1y", "gross_percent_max"]`
|
||||
|
||||
```yaml
|
||||
widget:
|
||||
|
||||
@@ -759,8 +759,7 @@
|
||||
"ghostfolio": {
|
||||
"gross_percent_today": "Today",
|
||||
"gross_percent_1y": "One year",
|
||||
"gross_percent_max": "All time",
|
||||
"net_worth": "Net Worth"
|
||||
"gross_percent_max": "All time"
|
||||
},
|
||||
"audiobookshelf": {
|
||||
"podcasts": "Podcasts",
|
||||
|
||||
@@ -14,8 +14,6 @@ export default function Error({ error }) {
|
||||
|
||||
if (typeof error === "string") {
|
||||
error = { message: error }; // eslint-disable-line no-param-reassign
|
||||
} else if (typeof error === "number") {
|
||||
error = { message: `Error ${error}` }; // eslint-disable-line no-param-reassign
|
||||
}
|
||||
|
||||
if (error?.data?.error) {
|
||||
|
||||
@@ -400,7 +400,6 @@ function Home({ initialSettings }) {
|
||||
"A highly customizable homepage (or startpage / application dashboard) with Docker and service API integrations."
|
||||
}
|
||||
/>
|
||||
{settings.disableIndexing && <meta name="robots" content="noindex, nofollow" />}
|
||||
{settings.base && <base href={settings.base} />}
|
||||
{settings.favicon ? (
|
||||
<>
|
||||
|
||||
@@ -1,19 +0,0 @@
|
||||
import { getSettings } from "utils/config/config";
|
||||
|
||||
export async function getServerSideProps({ res }) {
|
||||
const settings = getSettings();
|
||||
const content = ["User-agent: *", !!settings.disableIndexing ? "Disallow: /" : "Allow: /"].join("\n");
|
||||
|
||||
res.setHeader("Content-Type", "text/plain");
|
||||
res.write(content);
|
||||
res.end();
|
||||
|
||||
return {
|
||||
props: {},
|
||||
};
|
||||
}
|
||||
|
||||
export default function RobotsTxt() {
|
||||
// placeholder component
|
||||
return null;
|
||||
}
|
||||
@@ -279,9 +279,6 @@ export function cleanServiceGroups(groups) {
|
||||
slugs,
|
||||
symbols,
|
||||
|
||||
// crowdsec
|
||||
limit24h,
|
||||
|
||||
// customapi
|
||||
mappings,
|
||||
display,
|
||||
@@ -476,10 +473,6 @@ export function cleanServiceGroups(groups) {
|
||||
if (defaultinterval) widget.defaultinterval = defaultinterval;
|
||||
}
|
||||
|
||||
if (limit24h !== undefined) {
|
||||
widget.limit24h = !!limit24h;
|
||||
}
|
||||
|
||||
if (type === "docker") {
|
||||
if (server) widget.server = server;
|
||||
if (container) widget.container = container;
|
||||
|
||||
@@ -9,7 +9,7 @@ export default function Component({ service }) {
|
||||
|
||||
const { widget } = service;
|
||||
|
||||
const { data: alerts, error: alertsError } = useWidgetAPI(widget, !!widget.limit24h ? "alerts24h" : "alerts");
|
||||
const { data: alerts, error: alertsError } = useWidgetAPI(widget, "alerts");
|
||||
const { data: bans, error: bansError } = useWidgetAPI(widget, "bans");
|
||||
|
||||
if (alertsError || bansError) {
|
||||
|
||||
@@ -9,9 +9,6 @@ const widget = {
|
||||
alerts: {
|
||||
endpoint: "alerts",
|
||||
},
|
||||
alerts24h: {
|
||||
endpoint: "alerts?limit=0&since=24h",
|
||||
},
|
||||
bans: {
|
||||
endpoint: "alerts?decision_type=ban&origin=crowdsec&has_active_decision=1",
|
||||
},
|
||||
|
||||
@@ -166,11 +166,7 @@ export default function Component({ service }) {
|
||||
refreshInterval: Math.max(1000, refreshInterval),
|
||||
});
|
||||
|
||||
// if mappings includes an error field and the data contains an error field then show data even if there is an error
|
||||
const mappingsIncludesError = Array.isArray(mappings) && mappings.find((mapping) => mapping.field === "error");
|
||||
const errorIsData = customData && typeof customData === "object" && "error" in customData;
|
||||
|
||||
if (customError && !(mappingsIncludesError && errorIsData)) {
|
||||
if (customError) {
|
||||
return <Container service={service} error={customError} />;
|
||||
}
|
||||
|
||||
|
||||
@@ -20,15 +20,13 @@ function getPerformancePercent(t, performanceRange) {
|
||||
export default function Component({ service }) {
|
||||
const { t } = useTranslation();
|
||||
const { widget } = service;
|
||||
const includeNetWorth = widget.fields?.includes("net_worth");
|
||||
|
||||
const { data: performanceToday, error: ghostfolioErrorToday } = useWidgetAPI(widget, "today");
|
||||
const { data: performanceYear, error: ghostfolioErrorYear } = useWidgetAPI(widget, "year");
|
||||
const { data: performanceMax, error: ghostfolioErrorMax } = useWidgetAPI(widget, "max");
|
||||
const { data: userInfo, error: ghostfolioErrorUserInfo } = useWidgetAPI(widget, includeNetWorth ? "userInfo" : "");
|
||||
|
||||
if (ghostfolioErrorToday || ghostfolioErrorYear || ghostfolioErrorMax || ghostfolioErrorUserInfo) {
|
||||
const finalError = ghostfolioErrorToday ?? ghostfolioErrorYear ?? ghostfolioErrorMax ?? ghostfolioErrorUserInfo;
|
||||
if (ghostfolioErrorToday || ghostfolioErrorYear || ghostfolioErrorMax) {
|
||||
const finalError = ghostfolioErrorToday ?? ghostfolioErrorYear ?? ghostfolioErrorMax;
|
||||
return <Container service={service} error={finalError} />;
|
||||
}
|
||||
|
||||
@@ -36,13 +34,12 @@ export default function Component({ service }) {
|
||||
return <Container service={service} error={performanceToday} />;
|
||||
}
|
||||
|
||||
if (!performanceToday || !performanceYear || !performanceMax || (includeNetWorth && !userInfo)) {
|
||||
if (!performanceToday || !performanceYear || !performanceMax) {
|
||||
return (
|
||||
<Container service={service}>
|
||||
<Block label="ghostfolio.gross_percent_today" />
|
||||
<Block label="ghostfolio.gross_percent_1y" />
|
||||
<Block label="ghostfolio.gross_percent_max" />
|
||||
{includeNetWorth && <Block label="ghostfolio.net_worth" />}
|
||||
</Container>
|
||||
);
|
||||
}
|
||||
@@ -52,12 +49,6 @@ export default function Component({ service }) {
|
||||
<Block label="ghostfolio.gross_percent_today" value={getPerformancePercent(t, performanceToday)} />
|
||||
<Block label="ghostfolio.gross_percent_1y" value={getPerformancePercent(t, performanceYear)} />
|
||||
<Block label="ghostfolio.gross_percent_max" value={getPerformancePercent(t, performanceMax)} />
|
||||
{includeNetWorth && (
|
||||
<Block
|
||||
label="ghostfolio.net_worth"
|
||||
value={`${performanceToday.performance.currentNetWorth.toFixed(2)} ${userInfo?.settings?.currency ?? ""}`}
|
||||
/>
|
||||
)}
|
||||
</Container>
|
||||
);
|
||||
}
|
||||
|
||||
@@ -1,21 +1,18 @@
|
||||
import credentialedProxyHandler from "utils/proxy/handlers/credentialed";
|
||||
|
||||
const widget = {
|
||||
api: "{url}/api/{endpoint}",
|
||||
api: "{url}/api/v2/portfolio/performance?range={endpoint}",
|
||||
proxyHandler: credentialedProxyHandler,
|
||||
|
||||
mappings: {
|
||||
today: {
|
||||
endpoint: "v2/portfolio/performance?range=1d",
|
||||
endpoint: "1d",
|
||||
},
|
||||
year: {
|
||||
endpoint: "v2/portfolio/performance?range=1y",
|
||||
endpoint: "1y",
|
||||
},
|
||||
max: {
|
||||
endpoint: "v2/portfolio/performance?range=max",
|
||||
},
|
||||
userInfo: {
|
||||
endpoint: "v1/user",
|
||||
endpoint: "max",
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
@@ -24,9 +24,9 @@ export default function Component({ service }) {
|
||||
if (!data || (data && data.length === 0)) {
|
||||
return (
|
||||
<Container service={service}>
|
||||
<Block label="myspeed.ping" />
|
||||
<Block label="myspeed.download" />
|
||||
<Block label="myspeed.upload" />
|
||||
<Block label="myspeed.ping" />
|
||||
</Container>
|
||||
);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user