[release] v0.16.0-unstable26

This commit is contained in:
Yann Stepienik
2024-09-09 22:43:31 +01:00
parent 6f632e99d4
commit 2f6660b98c
22 changed files with 322 additions and 111 deletions
+2
View File
@@ -1,6 +1,8 @@
## Version 0.16.0
- Multilanguage support (Thanks @madejackson)
- Improve offline mode with Constellation
- Add automatic sync of Constellation nodes
- Constellation is now paid
- Fix issues where it was impossible to login with insecure local IPs
- Default networks to 16 Ips instead of 8
- Added automatic mDNS publishing for local network
+9 -5
View File
@@ -2,6 +2,7 @@ import { CheckOutlined, ClockCircleOutlined, CopyOutlined, DashboardOutlined, De
import { Card, Chip, Stack, Tooltip } from "@mui/material";
import { useState } from "react";
import { useTheme } from '@mui/material/styles';
import { Trans, useTranslation } from 'react-i18next';
let routeImages = {
"TUNNEL": {
@@ -74,8 +75,10 @@ export const RouteMode = ({route}) => {
}
export const RouteSecurity = ({route}) => {
const { t } = useTranslation();
return <div style={{fontWeight: 'bold', fontSize: '110%'}}>
<Tooltip title={route.SmartShield && route.SmartShield.Enabled ? "Smart Shield is enabled" : "Smart Shield is disabled"}>
<Tooltip title={route.SmartShield && route.SmartShield.Enabled ? t('tooltip.route.SmartShield.enabled') : t('tooltip.route.SmartShield.disabled')}>
<div style={{display: 'inline-block'}}>
{route.SmartShield && route.SmartShield.Enabled ?
<SafetyOutlined style={{color: 'green'}} /> :
@@ -84,7 +87,7 @@ export const RouteSecurity = ({route}) => {
</div>
</Tooltip>
&nbsp;
<Tooltip title={route.AuthEnabled ? "Authentication is enabled" : "Authentication is disabled"}>
<Tooltip title={route.AuthEnabled ? t('tooltip.route.authentication.enabled') : t('tooltip.route.authentication.disabled')}>
<div style={{display: 'inline-block'}}>
{route.AuthEnabled ?
<LockOutlined style={{color: 'green'}} /> :
@@ -93,7 +96,7 @@ export const RouteSecurity = ({route}) => {
</div>
</Tooltip>
&nbsp;
<Tooltip title={route.ThrottlePerMinute ? "Throttling is enabled" : "Throttling is disabled"}>
<Tooltip title={route.ThrottlePerMinute ? t('tooltip.route.throttling.enabled') : t('tooltip.route.throttling.disabled')}>
<div style={{display: 'inline-block'}}>
{route.ThrottlePerMinute ?
<DashboardOutlined style={{color: 'green'}} /> :
@@ -102,7 +105,7 @@ export const RouteSecurity = ({route}) => {
</div>
</Tooltip>
&nbsp;
<Tooltip title={route.Timeout ? "Timeout is enabled" : "Timeout is disabled"}>
<Tooltip title={route.Timeout ? t('tooltip.route.timeout.enabled') : t('tooltip.route.timeout.disabled')}>
<div style={{display: 'inline-block'}}>
{route.Timeout ?
<ClockCircleOutlined style={{color: 'green'}} /> :
@@ -118,6 +121,7 @@ export const RouteActions = ({route, routeKey, up, down, deleteRoute, duplicateR
const [confirmDelete, setConfirmDelete] = useState(false);
const theme = useTheme();
const isDark = theme.palette.mode === 'dark';
const { t } = useTranslation();
const miniChip = {
width: '30px',
@@ -145,7 +149,7 @@ export const RouteActions = ({route, routeKey, up, down, deleteRoute, duplicateR
<Chip label={<CopyOutlined />} onClick={(event) => duplicateRoute(event)}/>
<Tooltip title='Routes with the lowest priority are matched first'>
<Tooltip title={t('tooltip.route.move')}>
<Stack direction={'column'} spacing={0}>
<Card sx={{...miniChip, borderBottom: 'none'}} onClick={(event) => up(event)}><UpOutlined /></Card>
<Card sx={{...miniChip, cursor: 'auto'}}>{routeKey}</Card>
+11 -6
View File
@@ -106,6 +106,7 @@ const MFASetup = () => {
const canvasRef = useRef(null);
const theme = useTheme();
const isDark = theme.palette.mode === 'dark';
const { t, Trans } = useTranslation();
const getCode = () => {
return API.users.new2FA().then(({data}) => {
@@ -165,8 +166,10 @@ const MFASetup = () => {
);
}
const NewMFA = () => (
<AuthWrapper>
const NewMFA = () => {
const { t } = useTranslation();
return <AuthWrapper>
<Grid container spacing={3}>
<Grid item xs={12}>
<Stack direction="row" justifyContent="space-between" alignItems="baseline" sx={{ mb: { xs: -0.5, sm: 0.5 } }}>
@@ -178,10 +181,12 @@ const NewMFA = () => (
</Grid>
</Grid>
</AuthWrapper>
);
}
const MFALogin = () => (
<AuthWrapper>
const MFALogin = () => {
const { t } = useTranslation();
return <AuthWrapper>
<Grid container spacing={3}>
<Grid item xs={12}>
<Stack direction="row" justifyContent="space-between" alignItems="baseline" sx={{ mb: { xs: -0.5, sm: 0.5 } }}>
@@ -193,7 +198,7 @@ const MFALogin = () => (
</Grid>
</Grid>
</AuthWrapper>
);
}
export default NewMFA;
+2 -2
View File
@@ -301,7 +301,7 @@ const RouteManagement = ({ routeConfig, routeNames, config, TargetContainer, noC
{(formik.values.TunnelVia || tunnels.length > 0) && (<>
<CosmosSelect
name="TunnelVia"
label="Tunnel via another Constellation Cosmos node"
label={t('mgmt.urls.edit.tunnelViaSelection.tunnelViaLabel')}
formik={formik}
onChange={(e) => {
const newHostname = tunnels.find((t) => t.deviceName === e.target.value)?.publicHostname;
@@ -315,7 +315,7 @@ const RouteManagement = ({ routeConfig, routeNames, config, TargetContainer, noC
{formik.values.TunnelVia && <CosmosInputText
name="TunneledHost"
label="Hostname to tunnel from (what is the user facing hostname of the tunnel)"
label={t('mgmt.urls.edit.tunneledHostInput.tunneledHostLabel')}
placeholder="other-host.com"
formik={formik}
/>}
+4 -5
View File
@@ -429,7 +429,7 @@ const ConfigManagement = () => {
<CosmosInputPassword
noStrength
label="Licence Key"
label={t('mgmt.config.general.licenceInput.licenceLabel')}
name="Licence"
formik={formik}
helperText="Licence Key"
@@ -442,7 +442,7 @@ const ConfigManagement = () => {
<Stack spacing={1}><Button
href='https://billing.stripe.com/p/login/28obMlc7X1jgeqY144'
target="_blank"
variant="outlined">Manage Licence</Button>
variant="outlined">{t('mgmt.config.general.licenceInput.manageLicenceButton')}</Button>
</Stack>
</Grid>
}
@@ -624,7 +624,7 @@ const ConfigManagement = () => {
</Grid>
<Grid item xs={12}>
<Alert severity="info">
This allows you to publish your server on your local network using mDNS. This means all your .local domains will be available on your local network with no additional config.
{t('mgmt.config.http.publishMDNSCheckbox')}
</Alert>
<CosmosCheckbox
label="Publish .local domains on your local network with mDNS"
@@ -701,10 +701,9 @@ const ConfigManagement = () => {
)}
<CosmosCheckbox
label="Notify Users upon Successful Login"
label={t('mgmt.config.email.notifyLoginCheckbox.notifyLoginLabel')}
name="Email_NotifyLogin"
formik={formik}
helperText="Notify Users upon Successful Login"
/>
</>)}
</Stack>
+1 -1
View File
@@ -241,7 +241,7 @@ const ProxyManagement = () => {
{ title: t('global.target'), screenMin: 'md', search: (r) => r.Target, field: (r) => <><RouteMode route={r} /> <Chip label={r.Target} /></> },
{ title: t('global.securityTitle'), screenMin: 'lg', field: (r) => <RouteSecurity route={r} />,
style: {minWidth: '70px'} },
{ title: '', clickable:true, field: (r, k) => r._IsTunnel ? <Tooltip title="This route is tunneled to your main Cosmos server, you have to edit it from there.">
{ title: '', clickable:true, field: (r, k) => r._IsTunnel ? <Tooltip title={t('tooltip.route.tunnelWarn')}>
<QuestionCircleOutlined style={{
// color: 'gray',
fontSize: '20px',
+47 -39
View File
@@ -1,4 +1,5 @@
import React, { useState } from 'react';
import { useTranslation } from 'react-i18next';
import {
Button,
Card,
@@ -16,78 +17,84 @@ import {
} from '@mui/material';
import { Warning as WarningIcon, Check as CheckIcon } from '@mui/icons-material';
import banner from '../../assets/images/const_banner.png';
import { getCurrencyFromLanguage } from '../../utils/indexs';
const VPNSalesPage = () => {
const [isYearly, setIsYearly] = useState(true);
const { t, i18n } = useTranslation();
const currency = getCurrencyFromLanguage(i18n.language);
const monthlyPrice = 10.30;
const yearlyPrice = 8.25;
const monthlyPrices = {
"USD": 10.30,
"EUR": 9.90,
"GBP": 8.90
}
const yearlyPrices = {
"USD": 99.00,
"EUR": 93.00,
"GBP": 88.00
}
const monthlyPrice = monthlyPrices[currency];
const yearlyPrice = yearlyPrices[currency];
const discountedMonthlyPrice = (monthlyPrice * 0.85).toFixed(2);
const discountedYearlyPrice = (yearlyPrice * 0.85).toFixed(2);
const monthlyLink = "https://buy.stripe.com/5kAbMN4qrbkVcBGcMR?prefilled_promo_code=EARLY15";
const yearlyLink = "https://buy.stripe.com/cN2bMN9KLbkV59e9AE?prefilled_promo_code=EARLY15";
const featureKeys = Array.from({ length: 8 }, (_, i) => `mgmt.constellation.features.${i}`);
const planFeatureKeys = Array.from({ length: 4 }, (_, i) => `mgmt.constellation.plan_features.${i}`);
return (
<Container maxWidth="md">
<Box my={4}>
<img src={banner} alt="Constellation VPN Banner" style={{ width: '100%', borderRadius: '8px', boxShadow: '0 4px 6px rgba(0,0,0,0.1)' }} />
<img src={banner} alt={t('mgmt.constellation.banner_alt')} style={{ width: '100%', borderRadius: '8px', boxShadow: '0 4px 6px rgba(0,0,0,0.1)' }} />
</Box>
<Typography variant="h3" gutterBottom>Unlock Constellation: Your Secure Gateway Home</Typography>
<Typography variant="h3" gutterBottom>{t('mgmt.constellation.title')}</Typography>
<Typography variant="body1" paragraph>
Constellation is a powerful VPN based technology that allows you to securely access your home server from anywhere, without the need to open ports on your router. Keep your data safe and your connections secure with our state-of-the-art encryption technology.
{t('mgmt.constellation.description')}
</Typography>
<Card variant="outlined" sx={{ mb: 4 }}>
<CardHeader
title={<Typography variant="h5">Why Constellation VPN</Typography>}
title={<Typography variant="h5">{t('mgmt.constellation.why_title')}</Typography>}
/>
<CardContent>
<List>
{[
'Securely access your home server from anywhere in the world',
'No need to open ports, reducing potential security vulnerabilities*',
'Encrypted connections keep your data safe from prying eyes*',
'Easy setup and management through the Cosmos interface',
'Automatically switches from internet to local network when you get home',
'Automatic DNS rewrite',
'Block ads and trackers on all devices',
'Support the ongoing development of new features and improvements of Cosmos'
].map((item, index) => (
{featureKeys.map((key, index) => (
<ListItem key={index}>
<ListItemIcon>
{index === 7 && <span>❤️</span>}
{index !== 7 &&
<CheckIcon color="primary" />}
{index === 7 ? <span>❤️</span> : <CheckIcon color="primary" />}
</ListItemIcon>
<ListItemText primary={item} />
<ListItemText primary={t(key)} />
</ListItem>
))}
</List>
<span>
<Typography variant="body2" color="text.secondary">
* The lighthouses (the tunnel) is selfhosted, and requires you to install it on a server that is reachable from the internet.
</Typography>
</span>
<Typography variant="body2" color="text.secondary">
{t('mgmt.constellation.lighthouse_note')}
</Typography>
</CardContent>
</Card>
<Box display="flex" justifyContent="center" alignItems="center" mb={4}>
<Typography>Monthly</Typography>
<Typography>{t('mgmt.constellation.monthly')}</Typography>
<Switch
checked={isYearly}
onChange={() => setIsYearly(!isYearly)}
color="primary"
/>
<Typography>Yearly</Typography>
<Typography>{t('mgmt.constellation.yearly')}</Typography>
</Box>
<Card variant="outlined" sx={{ maxWidth: 400, margin: 'auto' }}>
<CardHeader
title={<Typography variant="h4" align="center">{isYearly ? 'Yearly Plan' : 'Monthly Plan'}</Typography>}
title={<Typography variant="h4" align="center">{t(isYearly ? 'mgmt.constellation.yearly_plan' : 'mgmt.constellation.monthly_plan')}</Typography>}
/>
<CardContent>
<Box textAlign="center" mb={2}>
@@ -98,34 +105,35 @@ const VPNSalesPage = () => {
${isYearly ? discountedYearlyPrice : discountedMonthlyPrice}
</Typography>
<Typography variant="body2" color="text.secondary">
per month
{t('mgmt.constellation.per_month')}
</Typography>
<Chip
label="EARLY15: 15% OFF FOR LIFE"
label={t('mgmt.constellation.discount_chip')}
color="secondary"
sx={{ mt: 1 }}
/>
<Typography variant="body2" color="text.secondary" mt={1}>
Limited time offer until Febrary 2025 for <strong>early adopters!</strong>
{t('mgmt.constellation.early_adopter_offer')}
</Typography>
</Box>
<List>
{[
'Unlimited devices',
'All VPN features',
isYearly ? 'Save 17% compared to monthly' : 'Flexible monthly billing',
'15% lifetime discount applied'
].map((item, index) => (
{planFeatureKeys.map((key, index) => (
<ListItem key={index}>
<ListItemIcon>
<CheckIcon color="primary" />
</ListItemIcon>
<ListItemText primary={item} />
<ListItemText
primary={
isYearly && index === 2
? t('mgmt.constellation.yearly_savings')
: t(key)
}
/>
</ListItem>
))}
</List>
<Button variant="contained" color="primary" target='_blank' fullWidth href={isYearly ? yearlyLink : monthlyLink}>
Upgrade Now
{t('mgmt.constellation.upgrade_button')}
</Button>
</CardContent>
</Card>
@@ -16,10 +16,12 @@ import { CosmosCheckbox, CosmosFormDivider, CosmosInputText, CosmosSelect } from
import { DownloadFile } from '../../api/downloadButton';
import QRCode from 'qrcode';
import { useClientInfos } from '../../utils/hooks';
import { Trans, useTranslation } from 'react-i18next';
const ResyncDeviceModal = ({ nickname, deviceName, OnClose }) => {
const canvasRef = React.useRef(null);
const [data, setData] = useState(null);
const { t } = useTranslation();
const renderCanvas = (data) => {
if (!canvasRef.current) return setTimeout(() => {
@@ -51,14 +53,12 @@ const ResyncDeviceModal = ({ nickname, deviceName, OnClose }) => {
return <>
<Dialog open={true} onClose={OnClose}>
<DialogTitle>Resync Device</DialogTitle>
<DialogTitle>{t('mgmt.constellation.resyncDeviceModal.title')}</DialogTitle>
<DialogContent>
<DialogContentText>
<p>
Use this to resync a client that lost connection to the server.
In your client, click on "Resync Device" and follow the process.
<strong>Do not use this on a new device, use the "Add Device" button instead.</strong>
<Trans i18nKey="mgmt.constellation.resyncDeviceModal.description" />
</p>
<Stack spacing={2} direction={"column"}>
@@ -71,7 +71,7 @@ const ResyncDeviceModal = ({ nickname, deviceName, OnClose }) => {
<DownloadFile
filename={`constellation.resync.yml`}
content={data}
label={"Download constellation.resync.yml"}
label={t('mgmt.constellation.resyncDeviceModal.button')}
/>
</Stack>
</DialogContentText>
+1
View File
@@ -16,6 +16,7 @@ import ConfirmModal from "../../components/confirmModal";
import UploadButtons from "../../components/fileUpload";
import { useClientInfos } from "../../utils/hooks";
import { Trans, useTranslation } from 'react-i18next';
import ResyncDeviceModal from "./resyncDevice";
const getDefaultConstellationHostname = (config) => {
// if domain is set, use it
+2 -2
View File
@@ -94,9 +94,9 @@ const NewInstall = () => {
if(hostname.match(hostnameIsDomainReg) && !hostname.endsWith('.local')) {
return [
["", t('mgmt.config.security.encryption.httpsCertSelection.httpsCertSelection')],
["LETSENCRYPT", t('mgmt.config.security.encryption.httpsCertSelection.sslLetsEncryptChoice')],
["SELFSIGNED", t('mgmt.config.security.encryption.httpsCertSelection.sslSelfSignedChoice')],
["PROVIDED", t('mgmt.config.security.encryption.httpsCertSelection.sslProvidedChoice')],
["LETSENCRYPT", t('mgmt.config.security.encryption.httpsCertSelection.sslLetsEncryptChoice')],
["DISABLED", t('mgmt.config.security.encryption.httpsCertSelection.sslDisabledChoice')],
]
} else {
@@ -375,7 +375,7 @@ const NewInstall = () => {
}
<CosmosSelect
name="HTTPSCertificateMode"
label={t('auth.selectOption')}
label={t('auth.selectHTTPSMode')}
formik={formik}
options={getHTTPSOptions(formik.values.Hostname && formik.values.Hostname)}
/>
@@ -834,7 +834,7 @@ const DockerComposeImport = ({ refresh, dockerComposeInit, installerInit, defaul
})}
{service && service.services && Object.values(service.services).map((value) => {
return <CosmosCollapse title={t('mgmt.servApps.newContainer.customize')+`${value.container_name}`+t('mgmt.servApps.newContainer.customize2')}>
return <CosmosCollapse title={t('mgmt.servApps.newContainer.customize', {container_name: value.container_name})}>
<Stack spacing={2}>
<DockerContainerSetup
newContainer
+1 -1
View File
@@ -72,7 +72,7 @@ const FormatButton = ({disk, refresh, disabled}) => {
setPasswordConfirm(false);
setLoading(false);
}}
textInfos={`Enter your password to confirm you want to format ${disk.name}`}
textInfos={t('mgmt.storage.formatModalText', {disk: disk.name})}
cb={async (values) => {
setPasswordConfirm(false);
setFormatting(values);
+4 -2
View File
@@ -1,8 +1,10 @@
import { Alert } from "@mui/material";
import { useTranslation } from "react-i18next";
export default function VMWarning() {
const { t } = useTranslation();
return (<Alert severity="warning">
You are running Cosmos inside a Docker container or a VM. As such, it only has limited access to your disks and their informations.
For your safety, potentially destructive operations such as formatting, mounting, RAIDing, are disabled as your VM/Docker setup could vary and potentially mislead you, causing irreversible damages.
{t("mgmt.storage.vmWarning")}
</Alert>);
}
+17 -1
View File
@@ -173,4 +173,20 @@ export const PascalToSnake = (str) => {
return str.replace(/[\w]([A-Z])/g, function(m) {
return m[0] + "_" + m[1];
}).toLowerCase();
}
}
export const getCurrencyFromLanguage = (language) => {
const currencyMap = {
en: 'USD', // English (assuming US English as default)
'en-US': 'USD', // US English
'en-GB': 'GBP', // British English
de: 'EUR', // German
fr: 'EUR', // French
es: 'EUR', // Spanish
it: 'EUR', // Italian
pt: 'EUR', // Portuguese
nl: 'EUR', // Dutch
};
return currencyMap[language] || 'USD'; // Default to USD if no match
};
+57 -11
View File
@@ -21,7 +21,7 @@
"auth.pwd": "Passwort",
"auth.pwdRequired": "Passwort ist erforderlich",
"auth.pwdResetNotAllowed": "Auf diesem Server kann das Passwort nicht zurückgesetzt werden.",
"auth.selectOption": "Wählen Sie eine Option",
"auth.selectHTTPSMode": "Wählen Sie Ihren HTTP(S)-Modus aus",
"auth.unexpectedErrorValidation": "Unerwarteter Fehler. Überprüfen Sie Ihre Daten oder versuchen Sie es später noch einmal.",
"auth.usernameInput": "Bitte Benutzername eigeben",
"auth.wrongCredError": "Falscher Benutzername oder falsches Passwort. Versuchen Sie es erneut oder setzen Sie Ihr Passwort zurück",
@@ -175,8 +175,10 @@
"mgmt.config.http.allowSearchIndexCheckbox.allowSearchIndexLabel": "Erlauben Sie Suchmaschinen, Ihren Server zu indizieren",
"mgmt.config.http.hostnameInput.HostnameLabel": "Hostname: Dies wird verwendet, um den Zugang zu Ihrem Cosmos-Server zu beschränken (Ihre IP oder Ihr Domainname)",
"mgmt.config.http.hostnameInput.HostnameValidation": "Hostname ist erforderlich",
"mgmt.config.http.publishMDNSCheckbox": "Dies ermöglicht es Ihnen, Ihren Server über mDNS im lokalen Netzwerk zu veröffentlichen. Das bedeutet, dass alle Ihre .local-Domains im lokalen Netzwerk ohne zusätzliche Konfiguration verfügbar sind.",
"mgmt.config.proxy.noRoutesConfiguredText": "Keine Routen konfiguriert",
"mgmt.config.proxy.originTitle": "Ursprung",
"mgmt.config.email.notifyLoginCheckbox.notifyLoginLabel": "Benutzer bei erfolgreicher Anmeldung benachrichtigen",
"mgmt.config.proxy.refreshNeededWarning.notDomain": "Wenn Sie keinen Domänennamen verwenden, kann der Server für einige Sekunden offline gehen, um die Docker-Ports neu zuzuordnen.",
"mgmt.config.proxy.refreshNeededWarning.selfSigned": "Sie müssen die Seite aktualisieren, da Sie ein selbstsigniertes Zertifikat verwenden, falls Sie neue Zertifikate akzeptieren müssen. Um dies in Zukunft zu vermeiden, verwenden Sie bitte Let's Encrypt.",
"mgmt.config.proxy.saveChangesButton": "Änderungen Speichern",
@@ -198,10 +200,10 @@
"mgmt.config.security.encryption.genMissingAuthCheckbox.genMissingAuthLabel": "Fehlende Authentifizierungszertifikate automatisch generieren (Standard: Ja)",
"mgmt.config.security.encryption.httpsCertSelection.httpsCertLabel": "HTTPS-Zertifikate",
"mgmt.config.security.encryption.httpsCertSelection.httpsCertSelection": "Wählen Sie Ihren HTTP(S)-Modus",
"mgmt.config.security.encryption.httpsCertSelection.sslDisabledChoice": "Verwenden Sie kein HTTPS (sehr unsicher)",
"mgmt.config.security.encryption.httpsCertSelection.sslDisabledChoice": "Verwenden Sie kein HTTPS",
"mgmt.config.security.encryption.httpsCertSelection.sslLetsEncryptChoice": "Automatisches Erstellen von Zertifikaten mit Let's Encrypt (empfohlen)",
"mgmt.config.security.encryption.httpsCertSelection.sslProvidedChoice": "Ich habe meine eigenen Zertifikate",
"mgmt.config.security.encryption.httpsCertSelection.sslSelfSignedChoice": "Lokale, selbstsignierte Zertifikate (unsicher)",
"mgmt.config.security.encryption.httpsCertSelection.sslSelfSignedChoice": "Lokale, selbstsignierte Zertifikate",
"mgmt.config.security.encryption.overwriteWildcardInput.overwriteWildcardLabel": "(optional, nur für fortgeschrittene Nutzer) Überschreibe Wildcard Domains (Syntax wie im Platzhalter, durch komma getrennt)",
"mgmt.config.security.encryption.rootHttpsPubKeyTitle": "Öffentlicher HTTPS-Root-Schlüssel",
"mgmt.config.security.encryption.sslCertForceRenewCheckbox.sslCertForceRenewLabel": "Erneuerung des HTTPS-Zertifikats beim nächsten Speichern erzwingen",
@@ -239,21 +241,50 @@
"mgmt.constellation.setup.externalConfig.label": "Externe Constellation-Netzwerk-Datei hochladen",
"mgmt.constellation.setup.externalConfig.slaveMode.label": "Externe Constellation-Netzwerk-Datei neu synchronisieren",
"mgmt.constellation.setup.firewallInfo": "Demnächst verfügbar. Diese Funktion wird es Ihnen ermöglichen, Ports auf jedem Gerät einzeln zu öffnen und zu schließen und festzulegen, wer auf sie zugreifen darf.",
"mgmt.constellation.setup.hostnameInfo": "Dies ist Ihr Constellation-Hostname, den Sie für die Verbindung verwenden werden. Wenn Sie einen Domänennamen verwenden, muss sich dieser vom Hostnamen Ihres Servers unterscheiden. Unabhängig von der von Ihnen gewählten Domain ist es sehr wichtig, dass Sie sicherstellen, dass ein A-Eintrag in Ihrem Domain-DNS auf diesen Server verweist. <strong>Wenn Sie diesen Wert ändern, müssen Sie Ihr Netzwerk zurücksetzen und alle Clients neu verbinden!</strong>",
"mgmt.constellation.setup.hostnameInfo": "Dies sind die Constellation-Hostnamen, die die App verwenden wird, um eine Verbindung herzustellen. Dies kann eine Mischung aus Domainnamen (für dynamische IPs) und IPs sein.<br />Wenn Sie einen Domainnamen verwenden, muss dieser sich vom Hostnamen Ihres Servers unterscheiden. Unabhängig davon, welche Domain Sie wählen, ist es sehr wichtig, sicherzustellen, dass im DNS Ihrer Domain ein A-Eintrag vorhanden ist, der auf diesen Server zeigt. <strong>Wenn Sie diesen Wert ändern, müssen Sie Ihr Netzwerk zurücksetzen und alle Clients erneut verbinden!</strong>",
"mgmt.constellation.setup.ip.label": "Constellation IP-Addresse",
"mgmt.constellation.setup.ipTitle": "Constellation-IP",
"mgmt.constellation.setup.owner.label": "Besitzer",
"mgmt.constellation.setup.privNode.label": "Dieser Knoten ist privat (keine öffentliche IP)",
"mgmt.constellation.setup.privNode.label": "Dieser Server ist kein Lighthouse (Sie werden nicht in der Lage sein, sich direkt damit zu verbinden, ohne ein weiteres Lighthouse)",
"mgmt.constellation.setup.pubHostname.label": "Öffentlicher Hostname",
"mgmt.constellation.setup.pubKey.label": "Öffentlicher Schlüssel (optional)",
"mgmt.constellation.setup.relayRequests.label": "Anfragen über diesen Knoten weiterleiten",
"mgmt.constellation.setup.unsafeRoutesText": "Demnächst verfügbar. Diese Funktion wird es Ihnen ermöglichen, Ihren Datenverkehr über Ihre Geräte zu Dingen außerhalb Ihrer Constellation zu tunneln.",
"mgmt.constellation.setup.unsafeRoutesTitle": "Unsichere Routen",
"mgmt.constellation.setupText": "Constellation ist ein VPN, das innerhalb Ihres Cosmos-Netzwerks läuft. Es verbindet automatisch alle Ihre Geräte miteinander und ermöglicht Ihnen den Zugriff von überall. Bitte lesen Sie die <0>Dokumentation</0> für weitere Informationen. Um eine Verbindung herzustellen, verwenden Sie bitte die <1>Constellation App</1>. Constellation ist derzeit bis zum Ende der Beta-Phase, die für Januar 2024 geplant ist, kostenlos nutzbar.",
"mgmt.constellation.setupText": "Constellation ist ein VPN, das innerhalb Ihres Cosmos-Netzwerks läuft. Es verbindet automatisch alle Ihre Geräte miteinander und ermöglicht Ihnen den Zugriff von überall. Bitte lesen Sie die <0>Dokumentation</0> für weitere Informationen. Um eine Verbindung herzustellen, verwenden Sie bitte die <1>Constellation App</1>.",
"mgmt.constellation.setupTitle": "Constellation einrichten",
"mgmt.constellation.setuplighthouseTitle": "Lighthouse Einrichtung",
"mgmt.constellation.showConfigButton": "VPN-Konfiguration anzeigen",
"mgmt.constellation.showLogsButton": "VPN-Protokolle anzeigen",
"mgmt.constellation.resyncDeviceModal.title": "Gerät erneut synchronisieren",
"mgmt.constellation.resyncDeviceModal.description": "Verwenden Sie dies, um einen Client, der die Verbindung zum Server verloren hat, erneut zu synchronisieren. Klicken Sie in Ihrem Client auf \"Gerät erneut synchronisieren\" und folgen Sie dem Prozess. <strong>Verwenden Sie dies nicht auf einem neuen Gerät, sondern benutzen Sie stattdessen die Schaltfläche \"Gerät hinzufügen\".</strong>",
"mgmt.constellation.resyncDeviceModal.button": "Laden Sie constellation.resync.yml herunter",
"mgmt.constellation.banner_alt": "Constellation VPN Banner",
"mgmt.constellation.title": "Entdecken Sie Constellation: Ihr sicheres Tor nach Hause",
"mgmt.constellation.description": "Constellation ist eine leistungsstarke VPN-basierte Technologie, die Ihnen ermöglicht, von überall sicher auf Ihren Heimserver zuzugreifen, ohne dass Sie Ports an Ihrem Router öffnen müssen. Schützen Sie Ihre Daten und halten Sie Ihre Verbindungen mit unserer hochmodernen Verschlüsselungstechnologie sicher.",
"mgmt.constellation.why_title": "Warum Constellation VPN",
"mgmt.constellation.features.0": "Sicherer Zugriff auf Ihren Heimserver von überall auf der Welt",
"mgmt.constellation.features.1": "Keine Notwendigkeit, Ports zu öffnen, reduziert potenzielle Sicherheitslücken*",
"mgmt.constellation.features.2": "Verschlüsselte Verbindungen halten Ihre Daten sicher vor neugierigen Blicken*",
"mgmt.constellation.features.3": "Einfache Einrichtung und Verwaltung über die Cosmos-Oberfläche",
"mgmt.constellation.features.4": "Automatische Umschaltung von Internet auf lokales Netzwerk bei Ihrer Heimkehr",
"mgmt.constellation.features.5": "Automatische DNS-Umschreibung",
"mgmt.constellation.features.6": "Blockieren Sie Werbung und Tracker auf allen Geräten",
"mgmt.constellation.features.7": "Unterstützen Sie die laufende Entwicklung neuer Funktionen und Verbesserungen von Cosmos",
"mgmt.constellation.lighthouse_note": "* Die Leuchttürme (der Tunnel) werden selbst gehostet und erfordern die Installation auf einem Server, der vom Internet aus erreichbar ist.",
"mgmt.constellation.monthly": "Monatlich",
"mgmt.constellation.yearly": "Jährlich",
"mgmt.constellation.monthly_plan": "Monatsplan",
"mgmt.constellation.yearly_plan": "Jahresplan",
"mgmt.constellation.per_month": "pro Monat",
"mgmt.constellation.discount_chip": "EARLY15: 15% RABATT AUF LEBENSZEIT",
"mgmt.constellation.early_adopter_offer": "Zeitlich begrenztes Angebot bis Februar 2025 für Early Adopters!",
"mgmt.constellation.plan_features.0": "Unbegrenzte Geräte",
"mgmt.constellation.plan_features.1": "Alle VPN-Funktionen",
"mgmt.constellation.plan_features.2": "Flexible monatliche Abrechnung",
"mgmt.constellation.plan_features.3": "15% lebenslanger Rabatt angewendet",
"mgmt.constellation.yearly_savings": "Sparen Sie 17% im Vergleich zur monatlichen Zahlung",
"mgmt.constellation.upgrade_button": "Jetzt upgraden",
"mgmt.cron.editCron.customText": "Erstellen Sie einen benutzerdefinierten Auftrag zur Ausführung eines Shell-Befehls in einem Container. Lassen Sie das Feld \"Container\" leer, um den Auftrag auf dem Host auszuführen",
"mgmt.cron.editCron.customText.onHostOnly": "Die Ausführung auf dem Host funktioniert nur, wenn Cosmos selbst nicht in einem Container ausgeführt wird.",
"mgmt.cron.editCronTitle": "Aufgabe bearbeiten",
@@ -334,8 +365,7 @@
"mgmt.servApps.newChip.newLabel": "Neu",
"mgmt.servApps.newContainer.chooseUrl": "Wählen Sie eine URL für",
"mgmt.servApps.newContainer.cosmosOutdatedError": "Dieser Dienst erfordert eine neuere Version von Cosmos. Bitte aktualisieren Sie Cosmos, um diesen Dienst zu installieren.",
"mgmt.servApps.newContainer.customize": " ",
"mgmt.servApps.newContainer.customize2": " anpassen",
"mgmt.servApps.newContainer.customize": "{{container_name}} anpassen",
"mgmt.servApps.newContainer.networkSettingsTitle": "Netzwerkeinstellungen",
"mgmt.servApps.newContainer.serviceNameInput": "Wählen Sie Ihren Servicenamen",
"mgmt.servApps.notRunningWarning": "Dieser Container ist nicht in Betrieb. Wenn Sie die Einstellungen ändern, wird der Container wieder gestartet.",
@@ -486,6 +516,8 @@
"mgmt.storage.unMountDiskText": "Sie sind dabei, die Festplatte <strong>{{disk}}</strong>{{mountpoint}} zu {{unMount}}. Dadurch wird der Inhalt {{unMount}} im Dateiexplorer angezeigt. Permanentes {{unMount}} bleibt nach dem Neustart bestehen.",
"mgmt.storage.unMountText": "Sie sind dabei, einen Ordner {{mountpoint}} zu {{unMount}}. Dadurch wird der Inhalt {{unAvailable}}, um im Datei-Explorer angezeigt zu werden. Permanentes {{unMount}} bleibt nach dem Neustart bestehen.",
"mgmt.storage.unavailable": "unverfügbar",
"mgmt.storage.formatModalText": "Geben Sie Ihr Passwort ein, um zu bestätigen, dass Sie {{disk}} formatieren möchten",
"mgmt.storage.vmWarning": "Sie führen Cosmos in einem Docker-Container oder einer VM aus. Daher hat es nur begrenzten Zugriff auf Ihre Festplatten und deren Informationen. Zu Ihrer Sicherheit sind potenziell destruktive Vorgänge wie Formatieren, Einbinden oder RAIDing deaktiviert, da Ihre VM-/Docker-Konfiguration variieren und Sie möglicherweise in die Irre führen könnte, was zu irreversiblen Schäden führen kann.",
"mgmt.urls.edit.advancedSettings.advancedSettingsInfo": "Diese Einstellungen sind nur für fortgeschrittene Benutzer gedacht. Bitte ändern Sie diese nicht, wenn Sie nicht wissen, was Sie tun.",
"mgmt.urls.edit.advancedSettings.filterIpWarning": "Mit dieser Einstellung werden alle Anfragen herausgefiltert, die nicht von den angegebenen IPs stammen. Dies erfordert, dass Ihr Setup die wahre IP des Clients meldet. Standardmäßig wird dies der Fall sein, aber einige exotische Einstellungen (wie die Installation von docker/Cosmos unter Windows oder hinter Cloudlfare) verhindern, dass Cosmos die wahre IP des Clients kennt. Wenn Sie oben \"Restrict to Constellation\" verwendet haben, werden Constellation-IPs unabhängig von dieser Einstellung immer zugelassen.",
"mgmt.urls.edit.advancedSettings.hideFromDashboardCheckbox.hideFromDashboardLabel": "Aus dem Dashboard ausblenden",
@@ -637,7 +669,7 @@
"newInstall.dbInstalling": "Datenbank wird installiert...",
"newInstall.dbNotConnected": "Die Datenbank ist nicht verbunden.",
"newInstall.dbSelection.createChoice": "Automatisches Erstellen einer sicheren Datenbank (empfohlen)",
"newInstall.dbSelection.dbLabel": "Bitte wählen Sie einen Datenbankmodus",
"newInstall.dbSelection.dbLabel": "Bitte wählen Sie Ihre Auswahl",
"newInstall.dbSelection.disabledChoice": "Benutzerverwaltung und UI deaktivieren",
"newInstall.dbSelection.providedChoice": "Eigene Datenbankzugangsdaten bereitstellen",
"newInstall.dbText": "Cosmos verwendet eine MongoDB-Datenbank, um alle Daten zu speichern. Die Datenbank ist optional, aber die Authentifizierung und die Benutzeroberfläche funktionieren nicht ohne eine Datenbank.",
@@ -660,7 +692,7 @@
"newInstall.letsEncryptChoiceOnlyfqdnValidation": "Let\\'s Encrypt akzeptiert nur Domainnamen",
"newInstall.linkToDocs": "Link zur Dokumentation",
"newInstall.loading": "wird geladen",
"newInstall.localAutoSelfSignedInfo": "Sie scheinen eine IP-Adresse oder eine lokale Domäne zu verwenden.<br />Sie können automatische selbstsignierte Zertifikate verwenden (Verwenden Sie selbstsigniert nur wenn Sie wissen, was Sie tun, da dies bei einigen Anwendungen zu Problemen führt, insbesondere bei IOS).",
"newInstall.localAutoSelfSignedInfo": "Es scheint, dass Sie eine IP-Adresse oder eine lokale Domain verwenden.<br />Sie können nur einfaches HTTP oder selbstsignierte Zertifikate verwenden (verwenden Sie selbstsignierte Zertifikate nur, wenn Sie wissen, was Sie tun, da dies bei einigen Apps, insbesondere auf iOS, zu Problemen führen kann).",
"newInstall.previousButton": "Zurück",
"newInstall.privCertInput.privCertLabel": "Privates Zertifikat",
"newInstall.pubCertInput.pubCertLabel": "Öffentliches Zertifikat",
@@ -674,5 +706,19 @@
"newInstall.welcomeTitle": "Willkommen! 💖",
"newInstall.whatIsCosmos": "Cosmos verwendet Docker, um Anwendungen auszuführen. Docker ist optional, wenn Cosmos keine Verbindung zu Docker herstellen kann, wird es im Reverse-Proxy-Modus ausgeführt.",
"newInstall.wildcardLetsEncryptCheckbox.wildcardLetsEncryptLabel": "Verwenden Sie Wildcard-Zertifikate für *.",
"newInstall.wildcardLetsEncryptError": "Sie haben Wildcard-Zertifikate mit Let's Encrypt aktiviert. Dies funktioniert nur, wenn Sie die DNS-Herausforderung verwenden! Bitte bearbeiten Sie die DNS Provider Texteingabe."
"newInstall.wildcardLetsEncryptError": "Sie haben Wildcard-Zertifikate mit Let's Encrypt aktiviert. Dies funktioniert nur, wenn Sie die DNS-Herausforderung verwenden! Bitte bearbeiten Sie die DNS Provider Texteingabe.",
"tooltip.route.SmartShield.enabled": "Smart Shield ist aktiviert",
"tooltip.route.SmartShield.disabled": "Smart Shield ist deaktiviert",
"tooltip.route.authentication.enabled": "Authentifizierung ist aktiviert",
"tooltip.route.authentication.disabled": "Authentifizierung ist deaktiviert",
"tooltip.route.throttling.enabled": "Drosselung ist aktiviert",
"tooltip.route.throttling.disabled": "Drosselung ist deaktiviert",
"tooltip.route.timeout.enabled": "Zeitüberschreitung ist aktiviert",
"tooltip.route.timeout.disabled": "Zeitüberschreitung ist deaktiviert",
"tooltip.route.move": "Routen mit der niedrigsten Priorität werden zuerst abgeglichen",
"tooltip.route.tunnelWarn": "Diese Route wird zu Ihrem Haupt-Cosmos-Server getunnelt, Sie müssen sie von dort aus bearbeiten.",
"mgmt.urls.edit.tunnelViaSelection.tunnelViaLabel": "Tunnel über einen anderen Constellation Cosmos-Knoten",
"mgmt.urls.edit.tunneledHostInput.tunneledHostLabel": "Hostname, von dem aus getunnelt wird (welcher Hostname ist benutzerseitig sichtbar für den Tunnel)",
"mgmt.config.general.licenceInput.licenceLabel": "Lizenzschlüssel",
"mgmt.config.general.licenceInput.manageLicenceButton": "Lizenz verwalten"
}
+58 -12
View File
@@ -21,7 +21,7 @@
"auth.pwd": "Password",
"auth.pwdRequired": "Password is required",
"auth.pwdResetNotAllowed": "This server does not allow password reset.",
"auth.selectOption": "Select an option",
"auth.selectHTTPSMode": "Select your HTTP(S) mode",
"auth.unexpectedErrorValidation": "Unexpected error. Check your infos or try again later.",
"auth.usernameInput": "Enter your nickname",
"auth.wrongCredError": "Wrong nickname or password. Try again or try resetting your password",
@@ -175,6 +175,8 @@
"mgmt.config.http.allowSearchIndexCheckbox.allowSearchIndexLabel": "Allow search engines to index your server",
"mgmt.config.http.hostnameInput.HostnameLabel": "Hostname: This will be used to restrict access to your Cosmos Server (Your IP, or your domain name)",
"mgmt.config.http.hostnameInput.HostnameValidation": "Hostname is required",
"mgmt.config.http.publishMDNSCheckbox": "This allows you to publish your server on your local network using mDNS. This means all your .local domains will be available on your local network with no additional config.",
"mgmt.config.email.notifyLoginCheckbox.notifyLoginLabel": "Notify Users upon Successful Login",
"mgmt.config.proxy.noRoutesConfiguredText": "No routes configured.",
"mgmt.config.proxy.originTitle": "Origin",
"mgmt.config.proxy.refreshNeededWarning.notDomain": "You are also not using a domain name, the server might go offline for a few seconds to remap your docker ports.",
@@ -198,10 +200,10 @@
"mgmt.config.security.encryption.genMissingAuthCheckbox.genMissingAuthLabel": "Generate missing Authentication Certificates automatically (Default: true)",
"mgmt.config.security.encryption.httpsCertSelection.httpsCertLabel": "HTTPS Certificates",
"mgmt.config.security.encryption.httpsCertSelection.httpsCertSelection": "Select your HTTP(S) mode",
"mgmt.config.security.encryption.httpsCertSelection.sslDisabledChoice": "Do not use HTTPS (very unsecure)",
"mgmt.config.security.encryption.httpsCertSelection.sslDisabledChoice": "Use HTTP Only",
"mgmt.config.security.encryption.httpsCertSelection.sslLetsEncryptChoice": "Automatically generate certificates using Let's Encrypt (Recommended)",
"mgmt.config.security.encryption.httpsCertSelection.sslProvidedChoice": "I have my own certificates",
"mgmt.config.security.encryption.httpsCertSelection.sslSelfSignedChoice": "Locally self-sign certificates (unsecure)",
"mgmt.config.security.encryption.httpsCertSelection.sslSelfSignedChoice": "Locally self-sign certificates",
"mgmt.config.security.encryption.overwriteWildcardInput.overwriteWildcardLabel": "(optional, only if you know what you are doing) Override Wildcard Domains (comma separated, need to add both wildcard AND root domain like in the placeholder)",
"mgmt.config.security.encryption.rootHttpsPubKeyTitle": "Root HTTPS Public Key",
"mgmt.config.security.encryption.sslCertForceRenewCheckbox.sslCertForceRenewLabel": "Force HTTPS Certificate Renewal On Next Save",
@@ -239,21 +241,50 @@
"mgmt.constellation.setup.externalConfig.label": "Upload External Constellation Network File",
"mgmt.constellation.setup.externalConfig.slaveMode.label": "Resync External Constellation Network File",
"mgmt.constellation.setup.firewallInfo": "Coming soon. This feature will allow you to open and close ports individually on each device and decide who can access them.",
"mgmt.constellation.setup.hostnameInfo": "This is your Constellation hostname, that you will use to connect. If you are using a domain name, this needs to be different from your server's hostname. Whatever the domain you choose, it is very important that you make sure there is a A entry in your domain DNS pointing to this server. <strong>If you change this value, you will need to reset your network and reconnect all the clients!</strong>",
"mgmt.constellation.setup.hostnameInfo": "This are your Constellation hostnames, that the app will use to connect. This can be a mixed of domain name (for dynamic IPs) and IPs.<br />If you are using a domain name, this needs to be different from your server's hostname. Whatever the domain you choose, it is very important that you make sure there is a A entry in your domain DNS pointing to this server. <strong>If you change this value, you will need to reset your network and reconnect all the clients!</strong>",
"mgmt.constellation.setup.ip.label": "Constellation IP Address",
"mgmt.constellation.setup.ipTitle": "Constellation IP",
"mgmt.constellation.setup.owner.label": "Owner",
"mgmt.constellation.setup.privNode.label": "This node is Private (no public IP)",
"mgmt.constellation.setup.privNode.label": "This server is not a lighthouse (you wont be able to connect to it directly without another lighthouse)",
"mgmt.constellation.setup.pubHostname.label": "Public Hostname",
"mgmt.constellation.setup.pubKey.label": "Public Key (Optional)",
"mgmt.constellation.setup.relayRequests.label": "Relay requests via this Node",
"mgmt.constellation.setup.unsafeRoutesText": "Coming soon. This feature will allow you to tunnel your traffic through your devices to things outside of your constellation.",
"mgmt.constellation.setup.unsafeRoutesTitle": "Unsafe Routes",
"mgmt.constellation.setupText": "Constellation is a VPN that runs inside your Cosmos network. It automatically connects all your devices together, and allows you to access them from anywhere. Please refer to the <0>documentation</0> for more information. In order to connect, please use the <1>Constellation App</1>. Constellation is currently free to use until the end of the beta, planned January 2024.",
"mgmt.constellation.setupText": "Constellation is a VPN that runs inside your Cosmos network. It automatically connects all your devices together, and allows you to access them from anywhere. Please refer to the <0>documentation</0> for more information. In order to connect, please use the <1>Constellation App</1>",
"mgmt.constellation.setupTitle": "Constellation Setup",
"mgmt.constellation.setuplighthouseTitle": "Lighthouse Setup",
"mgmt.constellation.showConfigButton": "Show VPN Config",
"mgmt.constellation.showLogsButton": "Show VPN logs",
"mgmt.constellation.resyncDeviceModal.title": "Resync Device",
"mgmt.constellation.resyncDeviceModal.description": "Use this to resync a client that lost connection to the server. In your client, click on \"Resync Device\" and follow the process. <strong>Do not use this on a new device, use the \"Add Device\" button instead.</strong>",
"mgmt.constellation.resyncDeviceModal.button": "Download constellation.resync.yml",
"mgmt.constellation.banner_alt": "Constellation VPN Banner",
"mgmt.constellation.title": "Unlock Constellation: Your Secure Gateway Home",
"mgmt.constellation.description": "Constellation is a powerful VPN based technology that allows you to securely access your home server from anywhere, without the need to open ports on your router. Keep your data safe and your connections secure with our state-of-the-art encryption technology.",
"mgmt.constellation.why_title": "Why Constellation VPN",
"mgmt.constellation.features.0": "Securely access your home server from anywhere in the world",
"mgmt.constellation.features.1": "No need to open ports, reducing potential security vulnerabilities*",
"mgmt.constellation.features.2": "Encrypted connections keep your data safe from prying eyes*",
"mgmt.constellation.features.3": "Easy setup and management through the Cosmos interface",
"mgmt.constellation.features.4": "Automatically switches from internet to local network when you get home",
"mgmt.constellation.features.5": "Automatic DNS rewrite",
"mgmt.constellation.features.6": "Block ads and trackers on all devices",
"mgmt.constellation.features.7": "Support the ongoing development of new features and improvements of Cosmos",
"mgmt.constellation.lighthouse_note": "* The lighthouses (the tunnel) is selfhosted, and requires you to install it on a server that is reachable from the internet.",
"mgmt.constellation.monthly": "Monthly",
"mgmt.constellation.yearly": "Yearly",
"mgmt.constellation.monthly_plan": "Monthly Plan",
"mgmt.constellation.yearly_plan": "Yearly Plan",
"mgmt.constellation.per_month": "per month",
"mgmt.constellation.discount_chip": "EARLY15: 15% OFF FOR LIFE",
"mgmt.constellation.early_adopter_offer": "Limited time offer until February 2025 for early adopters!",
"mgmt.constellation.plan_features.0": "Unlimited devices",
"mgmt.constellation.plan_features.1": "All VPN features",
"mgmt.constellation.plan_features.2": "Flexible monthly billing",
"mgmt.constellation.plan_features.3": "15% lifetime discount applied",
"mgmt.constellation.yearly_savings": "Save 17% compared to monthly",
"mgmt.constellation.upgrade_button": "Upgrade Now",
"mgmt.cron.editCron.customText": "Create a custom job to run a shell command in a container. Leave the container field empty to run on the host",
"mgmt.cron.editCron.customText.onHostOnly": "Running on the host only works if Cosmos is not itself running in a container",
"mgmt.cron.editCronTitle": "Edit Job",
@@ -319,7 +350,7 @@
"mgmt.servApps.createNetwork.parentReqForMacvlan": "Parent interface is required for MACVLAN",
"mgmt.servApps.createdChip.createdLabel": "\"Created\"",
"mgmt.servApps.deadChip.deadLabel": "Dead",
"mgmt.servApps.driver.none": "mgmt.servApps.driver.none",
"mgmt.servApps.driver.none": "None",
"mgmt.servApps.exitedChip.exitedLabel": "Exited",
"mgmt.servApps.exportDockerBackupButton.exportDockerBackupLabel": "Export Docker Backup",
"mgmt.servApps.networks.containerPortInput.containerPortLabel": "Container Port",
@@ -334,8 +365,7 @@
"mgmt.servApps.newChip.newLabel": "New",
"mgmt.servApps.newContainer.chooseUrl": "Choose URL for",
"mgmt.servApps.newContainer.cosmosOutdatedError": "This service requires a newer version of Cosmos. Please update Cosmos to install this service.",
"mgmt.servApps.newContainer.customize": "Customize ",
"mgmt.servApps.newContainer.customize2": " ",
"mgmt.servApps.newContainer.customize": "Customize {{container_name}}",
"mgmt.servApps.newContainer.networkSettingsTitle": "Network Settings",
"mgmt.servApps.newContainer.serviceNameInput": "Choose your service name",
"mgmt.servApps.notRunningWarning": "This container is not running. Editing any settings will cause the container to start again.",
@@ -486,6 +516,8 @@
"mgmt.storage.unMountDiskText": "You are about to {{unMount}} the disk <strong>{{disk}}</strong>{{mountpoint}}. This will make the content {{unAvailable}} to be viewed in the file explorer. Permanent {{unMount}} will persist after reboot.",
"mgmt.storage.unMountText": "You are about to {{unMount}} a folder {{mountpoint}}. This will make the content {{unAvailable}} to be viewed in the file explorer. Permanent {{unMount}} will persist after reboot.",
"mgmt.storage.unavailable": "unavailable",
"mgmt.storage.formatModalText": "Enter your password to confirm you want to format {{disk}}",
"mgmt.storage.vmWarning": "You are running Cosmos inside a Docker container or a VM. As such, it only has limited access to your disks and their informations. For your safety, potentially destructive operations such as formatting, mounting, RAIDing, are disabled as your VM/Docker setup could vary and potentially mislead you, causing irreversible damages.",
"mgmt.urls.edit.advancedSettings.advancedSettingsInfo": "These settings are for advanced users only. Please do not change these unless you know what you are doing.",
"mgmt.urls.edit.advancedSettings.filterIpWarning": "This setting will filter out all requests that do not come from the specified IPs. This requires your setup to report the true IP of the client. By default it will, but some exotic setup (like installing docker/Cosmos on Windows, or behind Cloudlfare) will prevent Cosmos from knowing what is the client's real IP. If you used \"Restrict to Constellation\" above, Constellation IPs will always be allowed regardless of this setting.",
"mgmt.urls.edit.advancedSettings.hideFromDashboardCheckbox.hideFromDashboardLabel": "Hide from Dashboard",
@@ -637,7 +669,7 @@
"newInstall.dbInstalling": "Installing Database...",
"newInstall.dbNotConnected": "Database is not connected!",
"newInstall.dbSelection.createChoice": "Automatically create a secure database (recommended)",
"newInstall.dbSelection.dbLabel": "Select your encryption",
"newInstall.dbSelection.dbLabel": "Select your choice",
"newInstall.dbSelection.disabledChoice": "Disable User Management and UI",
"newInstall.dbSelection.providedChoice": "Supply my own database credentials",
"newInstall.dbText": "Cosmos is using a MongoDB database to store all the data. It is optional, but Authentication as well as the UI will not work without a database.",
@@ -660,7 +692,7 @@
"newInstall.letsEncryptChoiceOnlyfqdnValidation": "Let\\'s Encrypt only accepts domain names",
"newInstall.linkToDocs": "Link to documentation",
"newInstall.loading": "Loading",
"newInstall.localAutoSelfSignedInfo": "You seem to be using an IP address or local domain.<br />You can use automatic Self-Signed certificates (use self-signed if you know what you are doing, as it causes issues with some apps, especially on IOS).",
"newInstall.localAutoSelfSignedInfo": "You seem to be using an IP address or local domain. <br />You can only use plain HTTP or self-signed certificates (use self-signed if you know what you are doing, as it causes issues with some apps, especially on IOS).",
"newInstall.previousButton": "Previous",
"newInstall.privCertInput.privCertLabel": "Private Certificate",
"newInstall.pubCertInput.pubCertLabel": "PublicCertificate",
@@ -674,5 +706,19 @@
"newInstall.welcomeTitle": "Welcome! 💖",
"newInstall.whatIsCosmos": "Cosmos is using docker to run applications. It is optional, but Cosmos will run in reverse-proxy-only mode if it cannot connect to Docker.",
"newInstall.wildcardLetsEncryptCheckbox.wildcardLetsEncryptLabel": "Use Wildcard Certificate for *.",
"newInstall.wildcardLetsEncryptError": "You have enabled wildcard certificates with Let's Encrypt. This only works if you use the DNS challenge! Please edit the DNS Provider text input."
"newInstall.wildcardLetsEncryptError": "You have enabled wildcard certificates with Let's Encrypt. This only works if you use the DNS challenge! Please edit the DNS Provider text input.",
"tooltip.route.SmartShield.enabled": "Smart Shield is Enabled",
"tooltip.route.SmartShield.disabled": "Smart Shield is Disabled",
"tooltip.route.authentication.enabled": "Authentication is Enabled",
"tooltip.route.authentication.disabled": "Authentication is Disabled",
"tooltip.route.throttling.enabled": "Throttling is Enabled",
"tooltip.route.throttling.disabled": "Throttling is Disabled",
"tooltip.route.timeout.enabled": "timeout is Enabled",
"tooltip.route.timeout.disabled": "timeout is Disabled",
"tooltip.route.move": "Routes with the lowest priority are matched first",
"tooltip.route.tunnelWarn": "This route is tunneled to your main Cosmos server, you have to edit it from there.",
"mgmt.urls.edit.tunnelViaSelection.tunnelViaLabel": "Tunnel via another Constellation Cosmos node",
"mgmt.urls.edit.tunneledHostInput.tunneledHostLabel": "Hostname to tunnel from (what is the user facing hostname of the tunnel)",
"mgmt.config.general.licenceInput.licenceLabel": "Licence Key",
"mgmt.config.general.licenceInput.manageLicenceButton": "Manage Licence"
}
+84 -5
View File
@@ -1,12 +1,12 @@
{
"name": "cosmos-server",
"version": "0.16.0-unstable16",
"version": "0.16.0-unstable25",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "cosmos-server",
"version": "0.16.0-unstable16",
"version": "0.16.0-unstable25",
"dependencies": {
"@ant-design/colors": "^6.0.0",
"@ant-design/icons": "^4.7.0",
@@ -34,6 +34,9 @@
"formik": "^2.2.9",
"framer-motion": "^7.3.6",
"history": "^5.3.0",
"i18next": "^23.11.5",
"i18next-browser-languagedetector": "^8.0.0",
"i18next-resources-to-backend": "^1.2.1",
"js-yaml": "^4.1.0",
"lodash.map": "^4.6.0",
"lodash.merge": "^4.6.2",
@@ -50,6 +53,7 @@
"react-dom": "^18.2.0",
"react-draggable": "^4.4.5",
"react-element-to-jsx-string": "^15.0.0",
"react-i18next": "^14.1.2",
"react-intersection-observer": "^9.5.2",
"react-lazyload": "^3.2.0",
"react-material-ui-carousel": "^3.4.2",
@@ -2117,9 +2121,9 @@
"dev": true
},
"node_modules/@babel/runtime": {
"version": "7.23.2",
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.2.tgz",
"integrity": "sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg==",
"version": "7.25.6",
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.6.tgz",
"integrity": "sha512-VBj9MYyDb9tuLq7yzqjgzt6Q+IBQLrGZfdjOekyEirZPHxXWoTSGUTMrpsfi58Up73d13NfYLv8HT9vmznjzhQ==",
"dependencies": {
"regenerator-runtime": "^0.14.0"
},
@@ -7100,6 +7104,14 @@
"resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
"integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="
},
"node_modules/html-parse-stringify": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/html-parse-stringify/-/html-parse-stringify-3.0.1.tgz",
"integrity": "sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg==",
"dependencies": {
"void-elements": "3.1.0"
}
},
"node_modules/http-errors": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
@@ -7124,6 +7136,44 @@
"node": ">=14.18.0"
}
},
"node_modules/i18next": {
"version": "23.14.0",
"resolved": "https://registry.npmjs.org/i18next/-/i18next-23.14.0.tgz",
"integrity": "sha512-Y5GL4OdA8IU2geRrt2+Uc1iIhsjICdHZzT9tNwQ3TVqdNzgxHToGCKf/TPRP80vTCAP6svg2WbbJL+Gx5MFQVA==",
"funding": [
{
"type": "individual",
"url": "https://locize.com"
},
{
"type": "individual",
"url": "https://locize.com/i18next.html"
},
{
"type": "individual",
"url": "https://www.i18next.com/how-to/faq#i18next-is-awesome.-how-can-i-support-the-project"
}
],
"dependencies": {
"@babel/runtime": "^7.23.2"
}
},
"node_modules/i18next-browser-languagedetector": {
"version": "8.0.0",
"resolved": "https://registry.npmjs.org/i18next-browser-languagedetector/-/i18next-browser-languagedetector-8.0.0.tgz",
"integrity": "sha512-zhXdJXTTCoG39QsrOCiOabnWj2jecouOqbchu3EfhtSHxIB5Uugnm9JaizenOy39h7ne3+fLikIjeW88+rgszw==",
"dependencies": {
"@babel/runtime": "^7.23.2"
}
},
"node_modules/i18next-resources-to-backend": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/i18next-resources-to-backend/-/i18next-resources-to-backend-1.2.1.tgz",
"integrity": "sha512-okHbVA+HZ7n1/76MsfhPqDou0fptl2dAlhRDu2ideXloRRduzHsqDOznJBef+R3DFZnbvWoBW+KxJ7fnFjd6Yw==",
"dependencies": {
"@babel/runtime": "^7.23.2"
}
},
"node_modules/iconv-lite": {
"version": "0.4.24",
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
@@ -9217,6 +9267,27 @@
"resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-2.0.4.tgz",
"integrity": "sha512-suNP+J1VU1MWFKcyt7RtjiSWUjvidmQSlqu+eHslq+342xCbGTYmC0mEhPCOHxlW0CywylOC1u2DFAT+bv4dBw=="
},
"node_modules/react-i18next": {
"version": "14.1.3",
"resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-14.1.3.tgz",
"integrity": "sha512-wZnpfunU6UIAiJ+bxwOiTmBOAaB14ha97MjOEnLGac2RJ+h/maIYXZuTHlmyqQVX1UVHmU1YDTQ5vxLmwfXTjw==",
"dependencies": {
"@babel/runtime": "^7.23.9",
"html-parse-stringify": "^3.0.1"
},
"peerDependencies": {
"i18next": ">= 23.2.3",
"react": ">= 16.8.0"
},
"peerDependenciesMeta": {
"react-dom": {
"optional": true
},
"react-native": {
"optional": true
}
}
},
"node_modules/react-intersection-observer": {
"version": "9.5.2",
"resolved": "https://registry.npmjs.org/react-intersection-observer/-/react-intersection-observer-9.5.2.tgz",
@@ -10787,6 +10858,14 @@
}
}
},
"node_modules/void-elements": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/void-elements/-/void-elements-3.1.0.tgz",
"integrity": "sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/web-vitals": {
"version": "3.3.2",
"resolved": "https://registry.npmjs.org/web-vitals/-/web-vitals-3.3.2.tgz",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "cosmos-server",
"version": "0.16.0-unstable25",
"version": "0.16.0-unstable26",
"description": "",
"main": "test-server.js",
"bugs": {
+1
View File
@@ -18,6 +18,7 @@
<a href="https://github.com/rdawman"><img src="https://avatars.githubusercontent.com/rdawman" style="border-radius:48px" width="48" height="48" alt="null" title="null" /></a>
<a href="https://github.com/furu00"><img src="https://avatars.githubusercontent.com/furu00" style="border-radius:48px" width="48" height="48" alt="null" title="null" /></a>
<a href="https://github.com/rpschube"><img src="https://avatars.githubusercontent.com/rpschube" style="border-radius:48px" width="48" height="48" alt="Ryan Schubert" title="Ryan Schubert" /></a>
<a href="https://github.com/madejackson"><img src="https://avatars.githubusercontent.com/madejackson" style="border-radius:48px" width="48" height="48" alt="null" title="null" /></a>
</p><!-- /sponsors -->
---
+3 -3
View File
@@ -157,7 +157,7 @@ func GetDeviceConfigSync(w http.ResponseWriter, req *http.Request) {
PublicHostname: d.PublicHostname,
Port: d.Port,
APIKey: "",
}, false)
}, false, false)
if err != nil {
utils.Error("DeviceConfigSync: Error marshalling nebula.yml", err)
@@ -229,7 +229,7 @@ func GetDeviceConfigForSync(nickname, deviceName string) ([]byte, error) {
PublicHostname: d.PublicHostname,
Port: d.Port,
APIKey: "",
}, false)
}, false, false)
if err != nil {
utils.Error("DeviceConfigSync: Error marshalling nebula.yml", err)
@@ -321,7 +321,7 @@ func GetDeviceConfigManualSync(w http.ResponseWriter, req *http.Request) {
PublicHostname: d.PublicHostname,
Port: d.Port,
APIKey: "",
}, true)
}, true, true)
if err != nil {
utils.Error("DeviceConfigSync: Error marshalling nebula.yml", err)
+1 -1
View File
@@ -141,7 +141,7 @@ func DeviceCreate(w http.ResponseWriter, req *http.Request) {
PublicHostname: request.PublicHostname,
Port: request.Port,
APIKey: APIKey,
}, true)
}, true, true)
if err != nil {
+10 -8
View File
@@ -333,7 +333,7 @@ func ExportConfigToYAML(overwriteConfig utils.ConstellationConfig, outputPath st
return nil
}
func getYAMLClientConfig(name, configPath, capki, cert, key, APIKey string, device utils.ConstellationDevice, lite bool) (string, error) {
func getYAMLClientConfig(name, configPath, capki, cert, key, APIKey string, device utils.ConstellationDevice, lite bool, getLicence bool) (string, error) {
utils.Log("Exporting YAML config for " + name + " with file " + configPath)
// Read the YAML config file
@@ -477,14 +477,16 @@ func getYAMLClientConfig(name, configPath, capki, cert, key, APIKey string, devi
configMap["cstln_config_endpoint"] = configEndpoint
configMap["cstln_https_insecure"] = utils.GetMainConfig().HTTPConfig.HTTPSCertificateMode == "PROVIDED" || !utils.IsDomain(configHostname)
// get client licence
utils.Log("Creating client license for " + name)
lic, err := utils.FBL.CreateClientLicense(name + " // " + configEndpoint)
if err != nil {
return "", err
if getLicence {
// get client licence
utils.Log("Creating client license for " + name)
lic, err := utils.FBL.CreateClientLicense(name + " // " + configEndpoint)
if err != nil {
return "", err
}
configMap["cstln_licence"] = lic
utils.Log("Client license created for " + name)
}
configMap["cstln_licence"] = lic
utils.Log("Client license created for " + name)
// list routes with a tunnel property matching the device name