mirror of
https://github.com/gethomepage/homepage.git
synced 2026-03-30 23:02:39 -07:00
Compare commits
60 Commits
v0.6.8
...
homepage-0
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
99efe2e7aa | ||
|
|
79df42a743 | ||
|
|
555e9463e8 | ||
|
|
a2424ea0bd | ||
|
|
743e9dcbf8 | ||
|
|
350bb1ff25 | ||
|
|
bf50eaff17 | ||
|
|
2594068fd0 | ||
|
|
72f66385ae | ||
|
|
9cae86d88b | ||
|
|
9f5b381b17 | ||
|
|
707bb93ad6 | ||
|
|
dfcd4d8e84 | ||
|
|
3d99302e33 | ||
|
|
a5036a701b | ||
|
|
3aa0fd594c | ||
|
|
67c60b4256 | ||
|
|
42675c2e71 | ||
|
|
35098385c0 | ||
|
|
409204c564 | ||
|
|
7ad59dc85f | ||
|
|
f87d3d4ae3 | ||
|
|
c84fecd981 | ||
|
|
321ede5297 | ||
|
|
6bea32ad83 | ||
|
|
2a73b603c9 | ||
|
|
8203537915 | ||
|
|
c56f48fb42 | ||
|
|
743267ba7b | ||
|
|
218327b4a2 | ||
|
|
7754b8b8f1 | ||
|
|
c0df7db05e | ||
|
|
2c8aea1cd9 | ||
|
|
d0ba6aebbf | ||
|
|
5ed50bbb57 | ||
|
|
311b7b1cea | ||
|
|
101b706cd9 | ||
|
|
bdfb09b1a4 | ||
|
|
65c06adb5a | ||
|
|
8c26da6655 | ||
|
|
c0d58d8206 | ||
|
|
c2136e8353 | ||
|
|
bc26d4f3b3 | ||
|
|
563cc9ce60 | ||
|
|
060d5afcaa | ||
|
|
8e9ce016b1 | ||
|
|
b65f6fca19 | ||
|
|
f8f96645b0 | ||
|
|
81a2e1e692 | ||
|
|
50a9bdbcb8 | ||
|
|
601edb8d6b | ||
|
|
9eafac346b | ||
|
|
767fc1ec39 | ||
|
|
09fa08b037 | ||
|
|
fe204dd0c3 | ||
|
|
93fe847667 | ||
|
|
f474b746d3 | ||
|
|
b69bb94253 | ||
|
|
9df4ba0881 | ||
|
|
b2f26e1a43 |
25
.github/workflows/chart-publish.yml
vendored
Normal file
25
.github/workflows/chart-publish.yml
vendored
Normal file
@@ -0,0 +1,25 @@
|
||||
name: Chart Publish
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
|
||||
jobs:
|
||||
release:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v3
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Configure Git
|
||||
run: |
|
||||
git config user.name "$GITHUB_ACTOR"
|
||||
git config user.email "$GITHUB_ACTOR@users.noreply.github.com"
|
||||
|
||||
- name: Run chart-releaser
|
||||
uses: helm/chart-releaser-action@v1.1.0
|
||||
env:
|
||||
CR_TOKEN: "${{ secrets.GITHUB_TOKEN }}"
|
||||
0
charts/homepage/.helmignore
Normal file
0
charts/homepage/.helmignore
Normal file
20
charts/homepage/Chart.yaml
Normal file
20
charts/homepage/Chart.yaml
Normal file
@@ -0,0 +1,20 @@
|
||||
---
|
||||
apiVersion: v2
|
||||
description: Chart for benphelps' Homepage
|
||||
icon: https://github.com/benphelps/homepage/blob/de584eae8f12a0d257e554e9511ef19bd2a1232c/public/mstile-150x150.png
|
||||
name: homepage
|
||||
version: 0.1.0
|
||||
appVersion: v0.6.9
|
||||
sources:
|
||||
- https://github.com/benphelps/homepage/charts/homepage
|
||||
- https://github.com/benphelps/homepage/
|
||||
maintainers:
|
||||
- name: jameswynn
|
||||
dependencies:
|
||||
- name: common
|
||||
repository: https://bjw-s.github.io/helm-charts
|
||||
version: 1.2.1
|
||||
annotations:
|
||||
artifacthub.io/changes: |-
|
||||
- kind: added
|
||||
description: Initial version
|
||||
36
charts/homepage/ci/test-values.yaml
Normal file
36
charts/homepage/ci/test-values.yaml
Normal file
@@ -0,0 +1,36 @@
|
||||
image:
|
||||
repository: ghcr.io/benphelps/homepage
|
||||
tag: kubernetes
|
||||
pullPolicy: Always
|
||||
|
||||
enableRbac: true
|
||||
|
||||
serviceAccount:
|
||||
create: true
|
||||
name: homepage-test
|
||||
|
||||
config:
|
||||
kubernetes:
|
||||
mode: cluster
|
||||
widgets:
|
||||
- resources:
|
||||
backend: kubernetes
|
||||
expanded: true
|
||||
cpu: true
|
||||
memory: true
|
||||
|
||||
ingress:
|
||||
main:
|
||||
enabled: true
|
||||
labels:
|
||||
homepage/enabled: "true"
|
||||
annotations:
|
||||
homepage/name: "Homepage"
|
||||
homepage/description: "A modern, secure, highly customizable application dashboard."
|
||||
homepage/group: "My Group"
|
||||
homepage/icon: "homepage.png"
|
||||
hosts:
|
||||
- host: &host "homepage.bogusdomain.test"
|
||||
paths:
|
||||
- path: /
|
||||
pathType: Prefix
|
||||
48
charts/homepage/readme.md
Normal file
48
charts/homepage/readme.md
Normal file
@@ -0,0 +1,48 @@
|
||||
# Homepage (benphelps)
|
||||
|
||||
A modern (fully static, fast), secure (fully proxied), highly customizable application dashboard with integrations for more than 25 services and translations for over 15 languages. Easily configured via YAML files (or discovery via docker labels).
|
||||
|
||||
[Homepage](https://github.com/benphelps/homepage)
|
||||
|
||||
## TL;DR
|
||||
|
||||
```bash
|
||||
helm repo add homepage http://benphelps.github.io/homepage
|
||||
helm install my-release homepage/homepage
|
||||
```
|
||||
|
||||
## Introduction
|
||||
|
||||
This chart bootstraps a [Homepage](https://github.com/benphelps/homepage) deployment on a [Kubernetes](https://kubernetes.io) cluster using the [Helm](https://helm.sh) package manager.
|
||||
|
||||
## Prerequisites
|
||||
|
||||
- Kubernetes 1.19+
|
||||
- Helm 3.2.0+
|
||||
|
||||
## Installing the Chart
|
||||
|
||||
To install the chart with the release name `my-release`:
|
||||
|
||||
```bash
|
||||
helm install my-release homepage/homepage
|
||||
```
|
||||
|
||||
The command deploys Homepage on the Kubernetes cluster in the default configuration. The [Parameters](#parameters) section lists the parameters that can be configured during installation.
|
||||
|
||||
> **Tip**: List all releases using `helm list`
|
||||
|
||||
## Uninstalling the Chart
|
||||
|
||||
To uninstall/delete the `my-release` deployment:
|
||||
|
||||
```console
|
||||
helm delete my-release
|
||||
```
|
||||
|
||||
## Parameters
|
||||
|
||||
This chart is based on [bjw-s library](https://bjw-s.github.io/helm-charts/docs/common-library/introduction/) and
|
||||
shares many configuration options with its derived [app-template](https://bjw-s.github.io/helm-charts/docs/app-template/introduction/).
|
||||
|
||||
See the [values files](values.yaml) for more examples.
|
||||
31
charts/homepage/templates/common.yaml
Normal file
31
charts/homepage/templates/common.yaml
Normal file
@@ -0,0 +1,31 @@
|
||||
---
|
||||
{{- include "bjw-s.common.loader.init" . }}
|
||||
|
||||
{{- define "app-template.hardcodedValues" -}}
|
||||
|
||||
# Set the nameOverride based on the release name if no override has been set
|
||||
{{ if not .Values.global.nameOverride }}
|
||||
global:
|
||||
nameOverride: "{{ .Release.Name }}"
|
||||
{{ end }}
|
||||
|
||||
{{- end -}}
|
||||
{{- $_ := mergeOverwrite .Values (include "app-template.hardcodedValues" . | fromYaml) -}}
|
||||
|
||||
{{/* Append the configMap volume to the volumes */}}
|
||||
{{- define "homepage.configVolume" -}}
|
||||
enabled: "true"
|
||||
mountPath: "/app/config"
|
||||
type: "custom"
|
||||
volumeSpec:
|
||||
configMap:
|
||||
name: {{ (default (include "bjw-s.common.lib.chart.names.fullname" .) .Values.config.useExistingConfigMap) }}
|
||||
{{- end -}}
|
||||
{{- $_ := set .Values.persistence "homepage-config" (include "homepage.configVolume" . | fromYaml) -}}
|
||||
|
||||
{{ if .Values.enableRbac }}
|
||||
{{- $_ := set .Values.serviceAccount "create" "true" -}}
|
||||
{{ end }}
|
||||
|
||||
{{/* Render the templates */}}
|
||||
{{ include "bjw-s.common.loader.generate" . }}
|
||||
34
charts/homepage/templates/configmap.yaml
Normal file
34
charts/homepage/templates/configmap.yaml
Normal file
@@ -0,0 +1,34 @@
|
||||
{{ if not .Values.config.useExistingConfigMap }}
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: ConfigMap
|
||||
metadata:
|
||||
name: {{ template "bjw-s.common.lib.chart.names.fullname" . }}
|
||||
labels:
|
||||
{{- include "bjw-s.common.lib.metadata.allLabels" . | nindent 4 }}
|
||||
data:
|
||||
bookmarks.yaml: {{- if .Values.config.bookmarks }} |
|
||||
{{- .Values.config.bookmarks | toYaml | nindent 4}}
|
||||
{{- else }} ""
|
||||
{{- end }}
|
||||
docker.yaml: {{- if .Values.config.docker }} |
|
||||
{{- .Values.config.docker | toYaml | nindent 4 }}
|
||||
{{- else }} ""
|
||||
{{- end }}
|
||||
kubernetes.yaml: {{- if .Values.config.kubernetes }} |
|
||||
{{- .Values.config.kubernetes | toYaml | nindent 4 }}
|
||||
{{- else }} ""
|
||||
{{- end }}
|
||||
services.yaml: {{- if .Values.config.services }} |
|
||||
{{- .Values.config.services | toYaml | nindent 4 }}
|
||||
{{- else }} ""
|
||||
{{- end }}
|
||||
settings.yaml: {{- if .Values.config.settings }} |
|
||||
{{- .Values.config.settings | toYaml | nindent 4 }}
|
||||
{{- else }} ""
|
||||
{{- end }}
|
||||
widgets.yaml: {{- if .Values.config.widgets }} |
|
||||
{{- .Values.config.widgets | toYaml | nindent 4 }}
|
||||
{{- else }} ""
|
||||
{{- end }}
|
||||
{{ end }}
|
||||
71
charts/homepage/templates/rbac.yaml
Normal file
71
charts/homepage/templates/rbac.yaml
Normal file
@@ -0,0 +1,71 @@
|
||||
{{- include "bjw-s.common.loader.init" . }}
|
||||
{{ if .Values.enableRbac }}
|
||||
{{- $serviceAccountName := include "bjw-s.common.lib.chart.names.serviceAccountName" . -}}
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: Secret
|
||||
type: kubernetes.io/service-account-token
|
||||
metadata:
|
||||
name: {{ $serviceAccountName }}
|
||||
{{- with (merge (.Values.labels | default dict) (include "bjw-s.common.lib.metadata.allLabels" $ | fromYaml)) }}
|
||||
labels: {{- toYaml . | nindent 4 }}
|
||||
{{- end }}
|
||||
annotations:
|
||||
kubernetes.io/service-account.name: {{ $serviceAccountName }}
|
||||
---
|
||||
apiVersion: rbac.authorization.k8s.io/v1
|
||||
kind: ClusterRole
|
||||
metadata:
|
||||
name: {{ $serviceAccountName }}
|
||||
{{- with (merge (.Values.labels | default dict) (include "bjw-s.common.lib.metadata.allLabels" $ | fromYaml)) }}
|
||||
labels: {{- toYaml . | nindent 4 }}
|
||||
{{- end }}
|
||||
{{- with (merge (.Values.annotations | default dict) (include "bjw-s.common.lib.metadata.globalAnnotations" $ | fromYaml)) }}
|
||||
annotations: {{- toYaml . | nindent 4 }}
|
||||
{{- end }}
|
||||
rules:
|
||||
- apiGroups:
|
||||
- ""
|
||||
resources:
|
||||
- namespaces
|
||||
- pods
|
||||
- nodes
|
||||
verbs:
|
||||
- get
|
||||
- list
|
||||
- apiGroups:
|
||||
- extensions
|
||||
- networking.k8s.io
|
||||
resources:
|
||||
- ingresses
|
||||
verbs:
|
||||
- get
|
||||
- list
|
||||
- apiGroups:
|
||||
- metrics.k8s.io
|
||||
resources:
|
||||
- nodes
|
||||
- pods
|
||||
verbs:
|
||||
- get
|
||||
- list
|
||||
---
|
||||
apiVersion: rbac.authorization.k8s.io/v1
|
||||
kind: ClusterRoleBinding
|
||||
metadata:
|
||||
name: {{ $serviceAccountName }}
|
||||
{{- with (merge (.Values.labels | default dict) (include "bjw-s.common.lib.metadata.allLabels" $ | fromYaml)) }}
|
||||
labels: {{- toYaml . | nindent 4 }}
|
||||
{{- end }}
|
||||
{{- with (merge (.Values.annotations | default dict) (include "bjw-s.common.lib.metadata.globalAnnotations" $ | fromYaml)) }}
|
||||
annotations: {{- toYaml . | nindent 4 }}
|
||||
{{- end }}
|
||||
roleRef:
|
||||
apiGroup: rbac.authorization.k8s.io
|
||||
kind: ClusterRole
|
||||
name: {{ $serviceAccountName }}
|
||||
subjects:
|
||||
- kind: ServiceAccount
|
||||
name: {{ $serviceAccountName }}
|
||||
namespace: {{ .Release.Namespace }}
|
||||
{{ end }}
|
||||
114
charts/homepage/values.yaml
Normal file
114
charts/homepage/values.yaml
Normal file
@@ -0,0 +1,114 @@
|
||||
image:
|
||||
repository: ghcr.io/benphelps/homepage
|
||||
# tag: v0.6.0
|
||||
|
||||
# Enable RBAC. RBAC is necessary to use Kubernetes integration
|
||||
enableRbac: false
|
||||
|
||||
serviceAccount:
|
||||
# Specify a different service account name
|
||||
name: homepage
|
||||
# Create service account. Needed when RBAC is enabled.
|
||||
create: false
|
||||
|
||||
service:
|
||||
main:
|
||||
ports:
|
||||
http:
|
||||
port: 3000
|
||||
|
||||
controller:
|
||||
strategy: RollingUpdate
|
||||
rollingUpdate:
|
||||
maxSurge: 25%
|
||||
maxUnavailable: 25%
|
||||
|
||||
# Enable the ingress to expose Homepage to the network.
|
||||
ingress:
|
||||
main:
|
||||
enabled: false
|
||||
# labels:
|
||||
# # This label will enable discover of this deployment in Homepage
|
||||
# gethomepage.dev/enabled: "true"
|
||||
# annotations:
|
||||
# # These annotations will configure how this deployment is shown in Homepage
|
||||
# gethomepage.dev/name: "Homepage"
|
||||
# gethomepage.dev/description: "A modern, secure, highly customizable application dashboard."
|
||||
# gethomepage.dev/group: "A New Group"
|
||||
# gethomepage.dev/icon: "homepage.png"
|
||||
# ingressClassName: "nginx"
|
||||
# hosts:
|
||||
# - host: &host "homepage.local"
|
||||
# paths:
|
||||
# - path: /
|
||||
# pathType: Prefix
|
||||
# tls:
|
||||
# - hosts:
|
||||
# - *host
|
||||
|
||||
# All the config files for Homepage can be specified under their relevant config block.
|
||||
config:
|
||||
# To use an existing ConfigMap uncomment this line and specify the name
|
||||
# useExistingConfigMap: existing-homepage-configmap
|
||||
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:
|
||||
- resources:
|
||||
# change backend to 'kubernetes' to use Kubernetes integration. Requires RBAC.
|
||||
backend: resources
|
||||
expanded: true
|
||||
cpu: true
|
||||
memory: true
|
||||
- search:
|
||||
provider: duckduckgo
|
||||
target: _blank
|
||||
## Uncomment to enable Kubernetes integration
|
||||
# - kubernetes:
|
||||
# cluster:
|
||||
# show: true
|
||||
# cpu: true
|
||||
# memory: true
|
||||
# showLabel: true
|
||||
# label: "cluster"
|
||||
# nodes:
|
||||
# show: true
|
||||
# cpu: true
|
||||
# memory: true
|
||||
# showLabel: true
|
||||
kubernetes:
|
||||
# change mode to 'cluster' to use RBAC service account
|
||||
mode: disable
|
||||
docker:
|
||||
settings:
|
||||
|
||||
persistence:
|
||||
logs:
|
||||
enabled: true
|
||||
type: emptyDir
|
||||
mountPath: /app/config/logs
|
||||
|
||||
# resources:
|
||||
# requests:
|
||||
# memory: 10Mi
|
||||
# cpu: 10m
|
||||
# limits:
|
||||
# memory: 200Mi
|
||||
# cpu: 500m
|
||||
@@ -508,5 +508,9 @@
|
||||
"status": "Status",
|
||||
"last_ping": "Last Ping",
|
||||
"never": "No pings yet"
|
||||
},
|
||||
"pterodactyl": {
|
||||
"servers": "Servers",
|
||||
"nodes": "Nodes"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -508,5 +508,9 @@
|
||||
"status": "Status",
|
||||
"last_ping": "Last Ping",
|
||||
"never": "No pings yet"
|
||||
},
|
||||
"pterodactyl": {
|
||||
"servers": "Servers",
|
||||
"nodes": "Nodes"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -508,5 +508,9 @@
|
||||
"status": "Status",
|
||||
"last_ping": "Last Ping",
|
||||
"never": "No pings yet"
|
||||
},
|
||||
"pterodactyl": {
|
||||
"servers": "Servers",
|
||||
"nodes": "Nodes"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -15,10 +15,10 @@
|
||||
"missing_type": "Chybí typ widgetu: {{type}}",
|
||||
"api_error": "Chyba API",
|
||||
"status": "Status",
|
||||
"information": "Information",
|
||||
"information": "Informace",
|
||||
"url": "URL",
|
||||
"raw_error": "Raw Error",
|
||||
"response_data": "Response Data"
|
||||
"response_data": "Data odpovědi"
|
||||
},
|
||||
"weather": {
|
||||
"current": "Aktuální poloha",
|
||||
@@ -52,7 +52,7 @@
|
||||
"up": "BĚŽÍ",
|
||||
"down": "NEBĚŽÍ",
|
||||
"wait": "Počkejte prosím",
|
||||
"empty_data": "Subsystem status unknown"
|
||||
"empty_data": "Status podsystému neznámý"
|
||||
},
|
||||
"docker": {
|
||||
"rx": "RX",
|
||||
@@ -60,8 +60,8 @@
|
||||
"mem": "RAM",
|
||||
"cpu": "CPU",
|
||||
"offline": "Offline",
|
||||
"error": "Error",
|
||||
"unknown": "Unknown"
|
||||
"error": "Chyba",
|
||||
"unknown": "Neznámý"
|
||||
},
|
||||
"emby": {
|
||||
"playing": "Přehrává",
|
||||
@@ -150,7 +150,7 @@
|
||||
"pending": "Čeká",
|
||||
"approved": "Schváleno",
|
||||
"available": "Dostupný",
|
||||
"processing": "Processing"
|
||||
"processing": "Zpracováváno"
|
||||
},
|
||||
"pihole": {
|
||||
"queries": "Dotazy",
|
||||
@@ -317,8 +317,8 @@
|
||||
"indexers": "Indexery"
|
||||
},
|
||||
"navidrome": {
|
||||
"nothing_streaming": "No Active Streams",
|
||||
"please_wait": "Please Wait"
|
||||
"nothing_streaming": "Žádné aktivní streams",
|
||||
"please_wait": "Prosím vyčkejte"
|
||||
},
|
||||
"pyload": {
|
||||
"speed": "Speed",
|
||||
@@ -336,8 +336,8 @@
|
||||
"hd": "HD"
|
||||
},
|
||||
"ping": {
|
||||
"error": "Error",
|
||||
"ping": "Ping"
|
||||
"error": "Chyba",
|
||||
"ping": "Odezva"
|
||||
},
|
||||
"scrutiny": {
|
||||
"passed": "Passed",
|
||||
@@ -349,22 +349,22 @@
|
||||
"total": "Total"
|
||||
},
|
||||
"deluge": {
|
||||
"upload": "Upload",
|
||||
"upload": "Nahrávání",
|
||||
"leech": "Leech",
|
||||
"seed": "Seed",
|
||||
"download": "Download"
|
||||
"download": "Stahování"
|
||||
},
|
||||
"flood": {
|
||||
"download": "Download",
|
||||
"upload": "Upload",
|
||||
"download": "Stahování",
|
||||
"upload": "Nahrávání",
|
||||
"leech": "Leech",
|
||||
"seed": "Seed"
|
||||
},
|
||||
"tdarr": {
|
||||
"queue": "Queue",
|
||||
"processed": "Processed",
|
||||
"errored": "Errored",
|
||||
"saved": "Saved"
|
||||
"queue": "Fronta",
|
||||
"processed": "Zpracováno",
|
||||
"errored": "Chybné",
|
||||
"saved": "Uložené"
|
||||
},
|
||||
"miniflux": {
|
||||
"read": "Read",
|
||||
@@ -379,15 +379,15 @@
|
||||
"bibitrate": "{{value, rate(bits: true; binary: true)}}"
|
||||
},
|
||||
"omada": {
|
||||
"connectedAp": "Connected APs",
|
||||
"activeUser": "Active devices",
|
||||
"alerts": "Alerts",
|
||||
"connectedGateway": "Connected gateways",
|
||||
"connectedSwitches": "Connected switches"
|
||||
"connectedAp": "Připojené APs",
|
||||
"activeUser": "Aktivní zařízení",
|
||||
"alerts": "Upozornění",
|
||||
"connectedGateway": "Připojené brány",
|
||||
"connectedSwitches": "Připojené přepínače"
|
||||
},
|
||||
"downloadstation": {
|
||||
"download": "Download",
|
||||
"upload": "Upload",
|
||||
"download": "Stahování",
|
||||
"upload": "Nahrávání",
|
||||
"leech": "Leech",
|
||||
"seed": "Seed"
|
||||
},
|
||||
@@ -508,5 +508,9 @@
|
||||
"status": "Status",
|
||||
"last_ping": "Last Ping",
|
||||
"never": "No pings yet"
|
||||
},
|
||||
"pterodactyl": {
|
||||
"servers": "Servers",
|
||||
"nodes": "Nodes"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -508,5 +508,9 @@
|
||||
"status": "Status",
|
||||
"last_ping": "Last Ping",
|
||||
"never": "No pings yet"
|
||||
},
|
||||
"pterodactyl": {
|
||||
"servers": "Servers",
|
||||
"nodes": "Nodes"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -508,5 +508,9 @@
|
||||
"status": "Status",
|
||||
"last_ping": "Last Ping",
|
||||
"never": "No pings yet"
|
||||
},
|
||||
"pterodactyl": {
|
||||
"servers": "Servers",
|
||||
"nodes": "Nodes"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -517,5 +517,9 @@
|
||||
"active_workers": "Active Workers",
|
||||
"total_workers": "Total Workers",
|
||||
"records_total": "Queue Length"
|
||||
},
|
||||
"pterodactyl": {
|
||||
"servers": "Servers",
|
||||
"nodes": "Nodes"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -508,5 +508,9 @@
|
||||
"status": "Status",
|
||||
"last_ping": "Last Ping",
|
||||
"never": "No pings yet"
|
||||
},
|
||||
"pterodactyl": {
|
||||
"servers": "Servers",
|
||||
"nodes": "Nodes"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -500,13 +500,17 @@
|
||||
"records_total": "Duración de la cola"
|
||||
},
|
||||
"healthchecks": {
|
||||
"new": "New",
|
||||
"up": "Online",
|
||||
"down": "Offline",
|
||||
"grace": "In Grace Period",
|
||||
"paused": "Paused",
|
||||
"status": "Status",
|
||||
"last_ping": "Last Ping",
|
||||
"never": "No pings yet"
|
||||
"new": "Nuevo",
|
||||
"up": "Conectado",
|
||||
"down": "Desconectado",
|
||||
"grace": "En Periodo de Gracia",
|
||||
"paused": "Pausado",
|
||||
"status": "Estado",
|
||||
"last_ping": "Último Ping",
|
||||
"never": "Aún no hay pings"
|
||||
},
|
||||
"pterodactyl": {
|
||||
"servers": "Servers",
|
||||
"nodes": "Nodes"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -508,5 +508,9 @@
|
||||
"status": "Status",
|
||||
"last_ping": "Last Ping",
|
||||
"never": "No pings yet"
|
||||
},
|
||||
"pterodactyl": {
|
||||
"servers": "Servers",
|
||||
"nodes": "Nodes"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -500,13 +500,17 @@
|
||||
"records_total": "En attente"
|
||||
},
|
||||
"healthchecks": {
|
||||
"new": "New",
|
||||
"up": "Online",
|
||||
"grace": "In Grace Period",
|
||||
"down": "Offline",
|
||||
"paused": "Paused",
|
||||
"status": "Status",
|
||||
"last_ping": "Last Ping",
|
||||
"never": "No pings yet"
|
||||
"new": "Nouveau",
|
||||
"up": "En ligne",
|
||||
"grace": "En Période de Grâce",
|
||||
"down": "Hors ligne",
|
||||
"paused": "En Pause",
|
||||
"status": "Statut",
|
||||
"last_ping": "Dernier Ping",
|
||||
"never": "Pas de Ping"
|
||||
},
|
||||
"pterodactyl": {
|
||||
"servers": "Servers",
|
||||
"nodes": "Nodes"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -508,5 +508,9 @@
|
||||
"grace": "In Grace Period",
|
||||
"down": "Offline",
|
||||
"never": "No pings yet"
|
||||
},
|
||||
"pterodactyl": {
|
||||
"servers": "Servers",
|
||||
"nodes": "Nodes"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -508,5 +508,9 @@
|
||||
"status": "Status",
|
||||
"last_ping": "Last Ping",
|
||||
"never": "No pings yet"
|
||||
},
|
||||
"pterodactyl": {
|
||||
"servers": "Servers",
|
||||
"nodes": "Nodes"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -508,5 +508,9 @@
|
||||
"status": "Status",
|
||||
"last_ping": "Last Ping",
|
||||
"never": "No pings yet"
|
||||
},
|
||||
"pterodactyl": {
|
||||
"servers": "Servers",
|
||||
"nodes": "Nodes"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -508,5 +508,9 @@
|
||||
"status": "Status",
|
||||
"last_ping": "Last Ping",
|
||||
"never": "No pings yet"
|
||||
},
|
||||
"pterodactyl": {
|
||||
"servers": "Servers",
|
||||
"nodes": "Nodes"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -508,5 +508,9 @@
|
||||
"status": "Status",
|
||||
"last_ping": "Last Ping",
|
||||
"never": "No pings yet"
|
||||
},
|
||||
"pterodactyl": {
|
||||
"servers": "Servers",
|
||||
"nodes": "Nodes"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -508,5 +508,9 @@
|
||||
"paused": "Paused",
|
||||
"status": "Status",
|
||||
"last_ping": "Last Ping"
|
||||
},
|
||||
"pterodactyl": {
|
||||
"servers": "Servers",
|
||||
"nodes": "Nodes"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -508,5 +508,9 @@
|
||||
"status": "Status",
|
||||
"last_ping": "Last Ping",
|
||||
"never": "No pings yet"
|
||||
},
|
||||
"pterodactyl": {
|
||||
"servers": "Servers",
|
||||
"nodes": "Nodes"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -508,5 +508,9 @@
|
||||
"status": "Status",
|
||||
"last_ping": "Last Ping",
|
||||
"never": "No pings yet"
|
||||
},
|
||||
"pterodactyl": {
|
||||
"servers": "Servers",
|
||||
"nodes": "Nodes"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -508,5 +508,9 @@
|
||||
"status": "Status",
|
||||
"last_ping": "Last Ping",
|
||||
"never": "No pings yet"
|
||||
},
|
||||
"pterodactyl": {
|
||||
"servers": "Servers",
|
||||
"nodes": "Nodes"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -508,5 +508,9 @@
|
||||
"status": "Status",
|
||||
"last_ping": "Last Ping",
|
||||
"never": "No pings yet"
|
||||
},
|
||||
"pterodactyl": {
|
||||
"servers": "Servers",
|
||||
"nodes": "Nodes"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -508,5 +508,9 @@
|
||||
"status": "Status",
|
||||
"last_ping": "Last Ping",
|
||||
"never": "No pings yet"
|
||||
},
|
||||
"pterodactyl": {
|
||||
"servers": "Servers",
|
||||
"nodes": "Nodes"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -33,14 +33,14 @@
|
||||
"status": "Status",
|
||||
"information": "Informação",
|
||||
"url": "URL",
|
||||
"raw_error": "Raw Error",
|
||||
"raw_error": "Erro Bruto",
|
||||
"response_data": "Dados de Resposta"
|
||||
},
|
||||
"weather": {
|
||||
"current": "Localização atual",
|
||||
"allow": "Clique para permitir",
|
||||
"updating": "Atualizando",
|
||||
"wait": "Aguarde, por favor"
|
||||
"wait": "Por favor aguarde"
|
||||
},
|
||||
"search": {
|
||||
"placeholder": "Buscar…"
|
||||
@@ -134,7 +134,7 @@
|
||||
},
|
||||
"pihole": {
|
||||
"queries": "Consultas",
|
||||
"blocked": "Bloquado",
|
||||
"blocked": "Bloqueados",
|
||||
"gravity": "Gravity"
|
||||
},
|
||||
"adguard": {
|
||||
@@ -182,7 +182,7 @@
|
||||
"authentik": {
|
||||
"users": "Usuários",
|
||||
"loginsLast24H": "Logins (24h)",
|
||||
"failedLoginsLast24H": "Failed Logins (24h)"
|
||||
"failedLoginsLast24H": "Logins Falhos (24h)"
|
||||
},
|
||||
"proxmox": {
|
||||
"mem": "Memória",
|
||||
@@ -199,13 +199,13 @@
|
||||
"wlan_users": "Usuarios WLAN",
|
||||
"up": "LIGADO",
|
||||
"down": "CÁIDO",
|
||||
"wait": "Por favor guarde",
|
||||
"wait": "Por favor aguarde",
|
||||
"lan": "LAN",
|
||||
"wlan": "WLAN",
|
||||
"devices": "Dispositivos",
|
||||
"lan_devices": "Dispositivos LAN",
|
||||
"wlan_devices": "Dispositivos WLAN",
|
||||
"empty_data": "Subsystem status unknown"
|
||||
"empty_data": "Status de Subsistema Desconhecido"
|
||||
},
|
||||
"plex": {
|
||||
"streams": "Transmissões ativas",
|
||||
@@ -215,81 +215,81 @@
|
||||
"glances": {
|
||||
"cpu": "CPU",
|
||||
"mem": "MEM",
|
||||
"wait": "Please wait"
|
||||
"wait": "Por favor aguarde"
|
||||
},
|
||||
"changedetectionio": {
|
||||
"totalObserved": "Observados",
|
||||
"diffsDetected": "Mudanças"
|
||||
},
|
||||
"wmo": {
|
||||
"1-night": "Mainly Clear",
|
||||
"2-day": "Partly Cloudy",
|
||||
"1-night": "Principalmente Limpo",
|
||||
"2-day": "Parcialmente Nublado",
|
||||
"2-night": "Parcialmente nublado",
|
||||
"3-day": "Nublado",
|
||||
"3-night": "Nublado",
|
||||
"45-day": "Névoa",
|
||||
"45-night": "Foggy",
|
||||
"48-day": "Foggy",
|
||||
"48-night": "Foggy",
|
||||
"56-night": "Light Freezing Drizzle",
|
||||
"57-day": "Freezing Drizzle",
|
||||
"99-day": "Thunderstorm With Hail",
|
||||
"99-night": "Thunderstorm With Hail",
|
||||
"45-night": "Névoa",
|
||||
"48-day": "Névoa",
|
||||
"48-night": "Névoa",
|
||||
"56-night": "Leve Garoa Congelante",
|
||||
"57-day": "Garoa Congelante",
|
||||
"99-day": "Trovoada Com Granizo",
|
||||
"99-night": "Trovoada Com Granizo",
|
||||
"0-day": "Ensolarado",
|
||||
"53-day": "Drizzle",
|
||||
"53-day": "Garoando",
|
||||
"0-night": "Limpo",
|
||||
"1-day": "Mainly Sunny",
|
||||
"51-day": "Light Drizzle",
|
||||
"51-night": "Light Drizzle",
|
||||
"53-night": "Drizzle",
|
||||
"55-day": "Heavy Drizzle",
|
||||
"55-night": "Heavy Drizzle",
|
||||
"56-day": "Light Freezing Drizzle",
|
||||
"57-night": "Freezing Drizzle",
|
||||
"61-day": "Light Rain",
|
||||
"61-night": "Light Rain",
|
||||
"63-day": "Rain",
|
||||
"63-night": "Rain",
|
||||
"65-day": "Heavy Rain",
|
||||
"65-night": "Heavy Rain",
|
||||
"66-day": "Freezing Rain",
|
||||
"66-night": "Freezing Rain",
|
||||
"67-day": "Freezing Rain",
|
||||
"67-night": "Freezing Rain",
|
||||
"71-day": "Light Snow",
|
||||
"71-night": "Light Snow",
|
||||
"73-day": "Snow",
|
||||
"73-night": "Snow",
|
||||
"75-day": "Heavy Snow",
|
||||
"75-night": "Heavy Snow",
|
||||
"77-day": "Snow Grains",
|
||||
"77-night": "Snow Grains",
|
||||
"80-day": "Light Showers",
|
||||
"80-night": "Light Showers",
|
||||
"81-day": "Showers",
|
||||
"81-night": "Showers",
|
||||
"82-day": "Heavy Showers",
|
||||
"82-night": "Heavy Showers",
|
||||
"85-day": "Snow Showers",
|
||||
"85-night": "Snow Showers",
|
||||
"86-day": "Snow Showers",
|
||||
"86-night": "Snow Showers",
|
||||
"95-day": "Thunderstorm",
|
||||
"95-night": "Thunderstorm",
|
||||
"96-day": "Thunderstorm With Hail",
|
||||
"1-day": "Principalmente Ensolarado",
|
||||
"51-day": "Leve Garoa",
|
||||
"51-night": "Leve Garoa",
|
||||
"53-night": "Garoando",
|
||||
"55-day": "Garoa Pesada",
|
||||
"55-night": "Garoa Pesada",
|
||||
"56-day": "Leve Garoa Congelante",
|
||||
"57-night": "Garoa Congelante",
|
||||
"61-day": "Chuva Leve",
|
||||
"61-night": "Chuva Leve",
|
||||
"63-day": "Chuva",
|
||||
"63-night": "Chuva",
|
||||
"65-day": "Chuva Pesada",
|
||||
"65-night": "Chuva Pesada",
|
||||
"66-day": "Chuva Congelante",
|
||||
"66-night": "Chuva Congelante",
|
||||
"67-day": "Chuva Congelante",
|
||||
"67-night": "Chuva Congelante",
|
||||
"71-day": "Neve Leve",
|
||||
"71-night": "Neve Leve",
|
||||
"73-day": "Neve",
|
||||
"73-night": "Neve",
|
||||
"75-day": "Neve Pesada",
|
||||
"75-night": "Neve Pesada",
|
||||
"77-day": "Grãos de Neve",
|
||||
"77-night": "Grãos de Neve",
|
||||
"80-day": "Chuviscos Leve",
|
||||
"80-night": "Chuviscos Leve",
|
||||
"81-day": "Chuviscos",
|
||||
"81-night": "Chuviscos",
|
||||
"82-day": "Chuviscos Pesado",
|
||||
"82-night": "Chuviscos Pesado",
|
||||
"85-day": "Precipitação de Neve",
|
||||
"85-night": "Precipitação de Neve",
|
||||
"86-day": "Precipitação de Neve",
|
||||
"86-night": "Precipitação de Neve",
|
||||
"95-day": "Tempestade",
|
||||
"95-night": "Trovoada",
|
||||
"96-day": "Trovoada Com Granizo",
|
||||
"96-night": "Thunderstorm With Hail"
|
||||
},
|
||||
"quicklaunch": {
|
||||
"bookmark": "Bookmark",
|
||||
"service": "Service",
|
||||
"search": "Search",
|
||||
"custom": "Custom"
|
||||
"bookmark": "Favorito",
|
||||
"service": "Serviço",
|
||||
"search": "Busca",
|
||||
"custom": "Personalizado"
|
||||
},
|
||||
"homebridge": {
|
||||
"available_update": "System",
|
||||
"updates": "Updates",
|
||||
"update_available": "Update Available",
|
||||
"up_to_date": "Up to Date",
|
||||
"available_update": "Sistema",
|
||||
"updates": "Atualizações",
|
||||
"update_available": "Atualização Disponível",
|
||||
"up_to_date": "Atualizado",
|
||||
"child_bridges": "Child Bridges",
|
||||
"child_bridges_status": "{{ok}}/{{total}}"
|
||||
},
|
||||
@@ -371,7 +371,7 @@
|
||||
"unread": "Não Lidos"
|
||||
},
|
||||
"nextdns": {
|
||||
"wait": "Please Wait",
|
||||
"wait": "Por favor aguarde",
|
||||
"no_devices": "No Device Data Received"
|
||||
},
|
||||
"common": {
|
||||
@@ -415,8 +415,8 @@
|
||||
"layers": "Layers"
|
||||
},
|
||||
"medusa": {
|
||||
"wanted": "Wanted",
|
||||
"queued": "Queued",
|
||||
"wanted": "Desejado",
|
||||
"queued": "Na fila",
|
||||
"series": "Series"
|
||||
},
|
||||
"octoprint": {
|
||||
@@ -508,5 +508,9 @@
|
||||
"status": "Status",
|
||||
"last_ping": "Last Ping",
|
||||
"never": "No pings yet"
|
||||
},
|
||||
"pterodactyl": {
|
||||
"servers": "Servers",
|
||||
"nodes": "Nodes"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -517,5 +517,9 @@
|
||||
"paused": "Paused",
|
||||
"status": "Status",
|
||||
"last_ping": "Last Ping"
|
||||
},
|
||||
"pterodactyl": {
|
||||
"servers": "Servers",
|
||||
"nodes": "Nodes"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -508,5 +508,9 @@
|
||||
"status": "Status",
|
||||
"last_ping": "Last Ping",
|
||||
"never": "No pings yet"
|
||||
},
|
||||
"pterodactyl": {
|
||||
"servers": "Servers",
|
||||
"nodes": "Nodes"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -508,5 +508,9 @@
|
||||
"status": "Status",
|
||||
"last_ping": "Last Ping",
|
||||
"never": "No pings yet"
|
||||
},
|
||||
"pterodactyl": {
|
||||
"servers": "Servers",
|
||||
"nodes": "Nodes"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -508,5 +508,9 @@
|
||||
"status": "Status",
|
||||
"last_ping": "Last Ping",
|
||||
"never": "No pings yet"
|
||||
},
|
||||
"pterodactyl": {
|
||||
"nodes": "Nodes",
|
||||
"servers": "Servers"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -508,5 +508,9 @@
|
||||
"status": "Status",
|
||||
"last_ping": "Last Ping",
|
||||
"never": "No pings yet"
|
||||
},
|
||||
"pterodactyl": {
|
||||
"servers": "Servers",
|
||||
"nodes": "Nodes"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -508,5 +508,9 @@
|
||||
"status": "Status",
|
||||
"last_ping": "Last Ping",
|
||||
"never": "No pings yet"
|
||||
},
|
||||
"pterodactyl": {
|
||||
"servers": "Servers",
|
||||
"nodes": "Nodes"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -508,5 +508,9 @@
|
||||
"status": "Status",
|
||||
"last_ping": "Last Ping",
|
||||
"never": "No pings yet"
|
||||
},
|
||||
"pterodactyl": {
|
||||
"servers": "Servers",
|
||||
"nodes": "Nodes"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -508,5 +508,9 @@
|
||||
"status": "Status",
|
||||
"last_ping": "Last Ping",
|
||||
"never": "No pings yet"
|
||||
},
|
||||
"pterodactyl": {
|
||||
"servers": "Servers",
|
||||
"nodes": "Nodes"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -500,13 +500,17 @@
|
||||
"records_total": "Довжина черги"
|
||||
},
|
||||
"healthchecks": {
|
||||
"new": "New",
|
||||
"up": "Online",
|
||||
"down": "Offline",
|
||||
"grace": "In Grace Period",
|
||||
"paused": "Paused",
|
||||
"status": "Status",
|
||||
"last_ping": "Last Ping",
|
||||
"never": "No pings yet"
|
||||
"new": "Новий",
|
||||
"up": "Онлайн",
|
||||
"down": "Офлайн",
|
||||
"grace": "У пільговий період",
|
||||
"paused": "Призупинено",
|
||||
"status": "Стан",
|
||||
"last_ping": "Останній пінг",
|
||||
"never": "Пінгів ще немає"
|
||||
},
|
||||
"pterodactyl": {
|
||||
"servers": "Servers",
|
||||
"nodes": "Nodes"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -508,5 +508,9 @@
|
||||
"status": "Status",
|
||||
"last_ping": "Last Ping",
|
||||
"never": "No pings yet"
|
||||
},
|
||||
"pterodactyl": {
|
||||
"servers": "Servers",
|
||||
"nodes": "Nodes"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -508,5 +508,9 @@
|
||||
"status": "Status",
|
||||
"last_ping": "Last Ping",
|
||||
"never": "No pings yet"
|
||||
},
|
||||
"pterodactyl": {
|
||||
"servers": "Servers",
|
||||
"nodes": "Nodes"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -508,5 +508,9 @@
|
||||
"status": "Status",
|
||||
"last_ping": "Last Ping",
|
||||
"never": "No pings yet"
|
||||
},
|
||||
"pterodactyl": {
|
||||
"servers": "Servers",
|
||||
"nodes": "Nodes"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -49,7 +49,7 @@
|
||||
"used": "已使用",
|
||||
"load": "負載",
|
||||
"cpu": "CPU",
|
||||
"mem": "MEM"
|
||||
"mem": "記憶體"
|
||||
},
|
||||
"nzbget": {
|
||||
"rate": "速率",
|
||||
@@ -197,15 +197,15 @@
|
||||
"wan": "WAN",
|
||||
"lan_users": "LAN使用者",
|
||||
"wlan_users": "WLAN使用者",
|
||||
"up": "UP",
|
||||
"down": "DOWN",
|
||||
"up": "上線",
|
||||
"down": "離線",
|
||||
"wait": "請稍後",
|
||||
"lan": "LAN",
|
||||
"wlan": "WLAN",
|
||||
"devices": "設備",
|
||||
"lan_devices": "LAN設備",
|
||||
"wlan_devices": "WLAN設備",
|
||||
"empty_data": "Subsystem status unknown"
|
||||
"empty_data": "子系統狀態未知"
|
||||
},
|
||||
"plex": {
|
||||
"streams": "正在播放",
|
||||
@@ -404,7 +404,7 @@
|
||||
},
|
||||
"opnsense": {
|
||||
"cpu": "CPU負載",
|
||||
"memory": "Active Memory",
|
||||
"memory": "記憶體",
|
||||
"wanUpload": "WAN上傳",
|
||||
"wanDownload": "WAN下載"
|
||||
},
|
||||
@@ -454,45 +454,45 @@
|
||||
"books": "書刊"
|
||||
},
|
||||
"mylar": {
|
||||
"series": "Series",
|
||||
"issues": "Issues",
|
||||
"wanted": "Wanted"
|
||||
"series": "系列",
|
||||
"issues": "出版",
|
||||
"wanted": "關注中"
|
||||
},
|
||||
"photoprism": {
|
||||
"albums": "Albums",
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"people": "People"
|
||||
"albums": "相簿",
|
||||
"photos": "照片",
|
||||
"videos": "影片",
|
||||
"people": "人物"
|
||||
},
|
||||
"diskstation": {
|
||||
"days": "Days",
|
||||
"uptime": "Uptime",
|
||||
"volumeAvailable": "Available"
|
||||
"days": "天",
|
||||
"uptime": "運行時間",
|
||||
"volumeAvailable": "剩餘容量"
|
||||
},
|
||||
"fileflows": {
|
||||
"queue": "Queue",
|
||||
"processing": "Processing",
|
||||
"processed": "Processed",
|
||||
"time": "Time"
|
||||
"queue": "佇列",
|
||||
"processing": "處理中",
|
||||
"processed": "已處理",
|
||||
"time": "時間"
|
||||
},
|
||||
"grafana": {
|
||||
"dashboards": "Dashboards",
|
||||
"datasources": "Data Sources",
|
||||
"totalalerts": "Total Alerts",
|
||||
"alertstriggered": "Alerts Triggered"
|
||||
"dashboards": "控制面板",
|
||||
"datasources": "數據來源",
|
||||
"totalalerts": "警報總數",
|
||||
"alertstriggered": "觸發的警報"
|
||||
},
|
||||
"nextcloud": {
|
||||
"cpuload": "Cpu Load",
|
||||
"memoryusage": "Memory Usage",
|
||||
"freespace": "Free Space",
|
||||
"activeusers": "Active Users"
|
||||
"cpuload": "處理器負載",
|
||||
"memoryusage": "記憶體用量",
|
||||
"freespace": "可用空間",
|
||||
"activeusers": "活躍用戶"
|
||||
},
|
||||
"kopia": {
|
||||
"status": "Status",
|
||||
"size": "Size",
|
||||
"lastrun": "Last Run",
|
||||
"nextrun": "Next Run",
|
||||
"failed": "Failed"
|
||||
"status": "狀態",
|
||||
"size": "檔案大小",
|
||||
"lastrun": "上次運行",
|
||||
"nextrun": "下次運行",
|
||||
"failed": "失敗"
|
||||
},
|
||||
"unmanic": {
|
||||
"active_workers": "Active Workers",
|
||||
@@ -500,13 +500,17 @@
|
||||
"records_total": "Queue Length"
|
||||
},
|
||||
"healthchecks": {
|
||||
"new": "New",
|
||||
"up": "Online",
|
||||
"grace": "In Grace Period",
|
||||
"down": "Offline",
|
||||
"paused": "Paused",
|
||||
"status": "Status",
|
||||
"last_ping": "Last Ping",
|
||||
"never": "No pings yet"
|
||||
"new": "新建立",
|
||||
"up": "上線",
|
||||
"grace": "延緩中",
|
||||
"down": "離線",
|
||||
"paused": "擱置中",
|
||||
"status": "狀態",
|
||||
"last_ping": "上次檢查",
|
||||
"never": "尚未檢查"
|
||||
},
|
||||
"pterodactyl": {
|
||||
"servers": "Servers",
|
||||
"nodes": "Nodes"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -91,7 +91,7 @@ export default function Item({ service }) {
|
||||
<span className="sr-only">View container stats</span>
|
||||
</button>
|
||||
)}
|
||||
{service.app && (
|
||||
{(service.app && !service.external) && (
|
||||
<button
|
||||
type="button"
|
||||
onClick={() => (statsOpen ? closeStats() : setStatsOpen(true))}
|
||||
|
||||
@@ -12,7 +12,7 @@ export default function Status({ service }) {
|
||||
</div>
|
||||
}
|
||||
|
||||
if (data && data.status.includes("running")) {
|
||||
if (data && data.status?.includes("running")) {
|
||||
if (data.health === "starting") {
|
||||
return (
|
||||
<div className="w-auto px-1.5 py-0.5 text-center bg-theme-500/10 dark:bg-theme-900/50 rounded-b-[3px] overflow-hidden" title={data.health}>
|
||||
|
||||
@@ -175,7 +175,7 @@ function Home({ initialSettings }) {
|
||||
const { data: services } = useSWR("/api/services");
|
||||
const { data: bookmarks } = useSWR("/api/bookmarks");
|
||||
const { data: widgets } = useSWR("/api/widgets");
|
||||
|
||||
|
||||
const servicesAndBookmarks = [...services.map(sg => sg.services).flat(), ...bookmarks.map(bg => bg.bookmarks).flat()]
|
||||
|
||||
useEffect(() => {
|
||||
@@ -310,7 +310,7 @@ function Home({ initialSettings }) {
|
||||
</div>
|
||||
|
||||
<div className="flex p-8 pt-4 w-full justify-end">
|
||||
<Version />
|
||||
{!initialSettings?.hideVersion && <Version />}
|
||||
</div>
|
||||
</div>
|
||||
</>
|
||||
|
||||
@@ -164,7 +164,11 @@ export async function servicesFromKubernetes() {
|
||||
weight: ingress.metadata.annotations[`${ANNOTATION_BASE}/weight`] || '0',
|
||||
icon: ingress.metadata.annotations[`${ANNOTATION_BASE}/icon`] || '',
|
||||
description: ingress.metadata.annotations[`${ANNOTATION_BASE}/description`] || '',
|
||||
external: false,
|
||||
};
|
||||
if (ingress.metadata.annotations[`${ANNOTATION_BASE}/external`]) {
|
||||
constructedService.external = String(ingress.metadata.annotations[`${ANNOTATION_BASE}/external`]).toLowerCase() === "true"
|
||||
}
|
||||
if (ingress.metadata.annotations[ANNOTATION_POD_SELECTOR]) {
|
||||
constructedService.podSelector = ingress.metadata.annotations[ANNOTATION_POD_SELECTOR];
|
||||
}
|
||||
|
||||
@@ -46,6 +46,8 @@ export default async function credentialedProxyHandler(req, res, map) {
|
||||
} else if (widget.type === "cloudflared") {
|
||||
headers["X-Auth-Email"] = `${widget.email}`;
|
||||
headers["X-Auth-Key"] = `${widget.key}`;
|
||||
} else if (widget.type === "pterodactyl") {
|
||||
headers.Authorization = `Bearer ${widget.key}`;
|
||||
} else {
|
||||
headers["X-API-Key"] = `${widget.key}`;
|
||||
}
|
||||
|
||||
@@ -52,6 +52,7 @@ const components = {
|
||||
portainer: dynamic(() => import("./portainer/component")),
|
||||
prowlarr: dynamic(() => import("./prowlarr/component")),
|
||||
proxmox: dynamic(() => import("./proxmox/component")),
|
||||
pterodactyl: dynamic(() => import("./pterodactyl/component")),
|
||||
pyload: dynamic(() => import("./pyload/component")),
|
||||
qbittorrent: dynamic(() => import("./qbittorrent/component")),
|
||||
radarr: dynamic(() => import("./radarr/component")),
|
||||
@@ -76,4 +77,4 @@ const components = {
|
||||
uptimekuma: dynamic(() => import("./uptimekuma/component")),
|
||||
};
|
||||
|
||||
export default components;
|
||||
export default components;
|
||||
|
||||
@@ -50,7 +50,7 @@ async function apiCall(widget, endpoint, service) {
|
||||
headers,
|
||||
});
|
||||
|
||||
if (status === 401) {
|
||||
if (status === 401 || status === 403) {
|
||||
logger.debug("Homebridge API rejected the request, attempting to obtain new session token");
|
||||
const { accessToken } = login(widget, service);
|
||||
headers.Authorization = `Bearer ${accessToken}`;
|
||||
@@ -63,7 +63,8 @@ async function apiCall(widget, endpoint, service) {
|
||||
}
|
||||
|
||||
if (status !== 200) {
|
||||
logger.error("Error getting data from Homebridge: %d. Data: %s", status, data);
|
||||
logger.error("Error getting data from Homebridge: %s status %d. Data: %s", url, status, data);
|
||||
return { status, contentType, data: null, responseHeaders };
|
||||
}
|
||||
|
||||
return { status, contentType, data: JSON.parse(data.toString()), responseHeaders };
|
||||
|
||||
34
src/widgets/pterodactyl/component.jsx
Normal file
34
src/widgets/pterodactyl/component.jsx
Normal file
@@ -0,0 +1,34 @@
|
||||
|
||||
import Container from "components/services/widget/container";
|
||||
import Block from "components/services/widget/block";
|
||||
import useWidgetAPI from "utils/proxy/use-widget-api";
|
||||
|
||||
export default function Component({ service }) {
|
||||
|
||||
const {widget} = service;
|
||||
|
||||
const {data: nodesData, error: nodesError} = useWidgetAPI(widget, "nodes");
|
||||
|
||||
if (nodesError) {
|
||||
return <Container error={ nodesError } />;
|
||||
}
|
||||
|
||||
if (!nodesData) {
|
||||
return (
|
||||
<Container service={service}>
|
||||
<Block label="pterodactyl.nodes" />
|
||||
<Block label="pterodactyl.servers" />
|
||||
</Container>
|
||||
);
|
||||
}
|
||||
|
||||
const totalServers = nodesData.data.reduce((total, node) =>
|
||||
node.attributes?.relationships?.servers?.data?.length ?? 0 + total, 0);
|
||||
|
||||
return (
|
||||
<Container service={service}>
|
||||
<Block label="pterodactyl.nodes" value={nodesData.data.length} />
|
||||
<Block label="pterodactyl.servers" value={totalServers} />
|
||||
</Container>
|
||||
);
|
||||
}
|
||||
17
src/widgets/pterodactyl/widget.js
Normal file
17
src/widgets/pterodactyl/widget.js
Normal file
@@ -0,0 +1,17 @@
|
||||
import credentialedProxyHandler from "utils/proxy/handlers/credentialed";
|
||||
|
||||
const widget = {
|
||||
api: "{url}/api/application/{endpoint}",
|
||||
proxyHandler: credentialedProxyHandler,
|
||||
|
||||
mappings: {
|
||||
nodes: {
|
||||
endpoint: "nodes?include=servers",
|
||||
validate: [
|
||||
"data"
|
||||
]
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
export default widget;
|
||||
@@ -46,6 +46,7 @@ import plex from "./plex/widget";
|
||||
import portainer from "./portainer/widget";
|
||||
import prowlarr from "./prowlarr/widget";
|
||||
import proxmox from "./proxmox/widget";
|
||||
import pterodactyl from "./pterodactyl/widget";
|
||||
import pyload from "./pyload/widget";
|
||||
import qbittorrent from "./qbittorrent/widget";
|
||||
import radarr from "./radarr/widget";
|
||||
@@ -119,6 +120,7 @@ const widgets = {
|
||||
portainer,
|
||||
prowlarr,
|
||||
proxmox,
|
||||
pterodactyl,
|
||||
pyload,
|
||||
qbittorrent,
|
||||
radarr,
|
||||
@@ -144,4 +146,4 @@ const widgets = {
|
||||
uptimekuma,
|
||||
};
|
||||
|
||||
export default widgets;
|
||||
export default widgets;
|
||||
|
||||
Reference in New Issue
Block a user