mirror of
https://github.com/NginxProxyManager/nginx-proxy-manager.git
synced 2025-11-13 05:45:15 +00:00
Compare commits
94 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f02145c5ef | ||
|
|
adee0e39de | ||
|
|
5dde98cf3e | ||
|
|
c41451618e | ||
|
|
1a3d45f6bc | ||
|
|
2ea54975b6 | ||
|
|
0373017a9f | ||
|
|
2b5182d339 | ||
|
|
3c5ff81a54 | ||
|
|
8aa46c1f40 | ||
|
|
b26db50ae7 | ||
|
|
d66bb2104a | ||
|
|
8e900dbc92 | ||
|
|
66aac3eb3e | ||
|
|
221c3eddbc | ||
|
|
8460b28597 | ||
|
|
0344bb3c19 | ||
|
|
1a36bdce76 | ||
|
|
06d7db43f7 | ||
|
|
4557244744 | ||
|
|
f649288098 | ||
|
|
28df6db52b | ||
|
|
eee749652c | ||
|
|
f6aa25b9b3 | ||
|
|
40db26b686 | ||
|
|
f36d4e6906 | ||
|
|
86c7cbddab | ||
|
|
e52975bf6c | ||
|
|
ff792f76af | ||
|
|
711f312b71 | ||
|
|
9f0f89ff03 | ||
|
|
f3633cb696 | ||
|
|
8773ce25d7 | ||
|
|
c3954e9845 | ||
|
|
441a7262cd | ||
|
|
1600599410 | ||
|
|
74d381e7fa | ||
|
|
ba79bbc750 | ||
|
|
a7231777aa | ||
|
|
2578105f86 | ||
|
|
3a6b221b0c | ||
|
|
12b000abb9 | ||
|
|
39c9bbb167 | ||
|
|
30c2781a02 | ||
|
|
53e78dcc17 | ||
|
|
62092b2ddc | ||
|
|
2c26ed8b11 | ||
|
|
e3f5cd9a58 | ||
|
|
fba14817e7 | ||
|
|
6825a9773b | ||
|
|
8bc3078d87 | ||
|
|
8aeb2fa661 | ||
|
|
4bd545c88e | ||
|
|
7f0cce944d | ||
|
|
7cde6ee7ca | ||
|
|
df1b414c2e | ||
|
|
311d6a1541 | ||
|
|
5e7276e65b | ||
|
|
2bcb942f93 | ||
|
|
b3dac3df08 | ||
|
|
64c5a863f8 | ||
|
|
cd94863850 | ||
|
|
fd1d33444a | ||
|
|
5aa56c63d4 | ||
|
|
8fdb6091f3 | ||
|
|
58182fcbdf | ||
|
|
b3b1e94b8c | ||
|
|
6fa2d6a98a | ||
|
|
3c252db46f | ||
|
|
8eba31913f | ||
|
|
e4e3415120 | ||
|
|
a03bb7ebce | ||
|
|
51e25d1a40 | ||
|
|
123f7d1999 | ||
|
|
9de40f067b | ||
|
|
b21d6d9d78 | ||
|
|
bf1ad15ed7 | ||
|
|
1209303a1d | ||
|
|
cd3a09ebf6 | ||
|
|
d0e20d4f1b | ||
|
|
ceb098fcfe | ||
|
|
639ba3a525 | ||
|
|
e88d55f1d2 | ||
|
|
4cb85f6480 | ||
|
|
df7dea2d16 | ||
|
|
23f4948bde | ||
|
|
0ceb7d0892 | ||
|
|
f35671db21 | ||
|
|
a3a0614948 | ||
|
|
06b67ed4bc | ||
|
|
4a0e27572e | ||
|
|
7e28d8a5d6 | ||
|
|
8991e88ff3 | ||
|
|
e2a8ffa2d3 |
285
Jenkinsfile
vendored
285
Jenkinsfile
vendored
@@ -1,285 +0,0 @@
|
||||
import groovy.transform.Field
|
||||
|
||||
@Field
|
||||
def shOutput = ""
|
||||
def buildxPushTags = ""
|
||||
|
||||
pipeline {
|
||||
agent {
|
||||
label 'docker-multiarch'
|
||||
}
|
||||
options {
|
||||
buildDiscarder(logRotator(numToKeepStr: '5'))
|
||||
disableConcurrentBuilds()
|
||||
ansiColor('xterm')
|
||||
}
|
||||
environment {
|
||||
IMAGE = 'nginx-proxy-manager'
|
||||
BUILD_VERSION = getVersion()
|
||||
MAJOR_VERSION = '2'
|
||||
BRANCH_LOWER = "${BRANCH_NAME.toLowerCase().replaceAll('\\\\', '-').replaceAll('/', '-').replaceAll('\\.', '-')}"
|
||||
BUILDX_NAME = "npm_${BRANCH_LOWER}_${BUILD_NUMBER}"
|
||||
COMPOSE_INTERACTIVE_NO_CLI = 1
|
||||
}
|
||||
stages {
|
||||
stage('Environment') {
|
||||
parallel {
|
||||
stage('Master') {
|
||||
when {
|
||||
branch 'master'
|
||||
}
|
||||
steps {
|
||||
script {
|
||||
buildxPushTags = "-t docker.io/jc21/${IMAGE}:${BUILD_VERSION} -t docker.io/jc21/${IMAGE}:${MAJOR_VERSION} -t docker.io/jc21/${IMAGE}:latest"
|
||||
}
|
||||
}
|
||||
}
|
||||
stage('Other') {
|
||||
when {
|
||||
not {
|
||||
branch 'master'
|
||||
}
|
||||
}
|
||||
steps {
|
||||
script {
|
||||
// Defaults to the Branch name, which is applies to all branches AND pr's
|
||||
buildxPushTags = "-t docker.io/nginxproxymanager/${IMAGE}-dev:${BRANCH_LOWER}"
|
||||
}
|
||||
}
|
||||
}
|
||||
stage('Versions') {
|
||||
steps {
|
||||
sh 'cat frontend/package.json | jq --arg BUILD_VERSION "${BUILD_VERSION}" \'.version = $BUILD_VERSION\' | sponge frontend/package.json'
|
||||
sh 'echo -e "\\E[1;36mFrontend Version is:\\E[1;33m $(cat frontend/package.json | jq -r .version)\\E[0m"'
|
||||
sh 'cat backend/package.json | jq --arg BUILD_VERSION "${BUILD_VERSION}" \'.version = $BUILD_VERSION\' | sponge backend/package.json'
|
||||
sh 'echo -e "\\E[1;36mBackend Version is:\\E[1;33m $(cat backend/package.json | jq -r .version)\\E[0m"'
|
||||
sh 'sed -i -E "s/(version-)[0-9]+\\.[0-9]+\\.[0-9]+(-green)/\\1${BUILD_VERSION}\\2/" README.md'
|
||||
}
|
||||
}
|
||||
stage('Docker Login') {
|
||||
steps {
|
||||
withCredentials([usernamePassword(credentialsId: 'jc21-dockerhub', passwordVariable: 'dpass', usernameVariable: 'duser')]) {
|
||||
sh 'docker login -u "${duser}" -p "${dpass}"'
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
stage('Builds') {
|
||||
parallel {
|
||||
stage('Project') {
|
||||
steps {
|
||||
script {
|
||||
// Frontend and Backend
|
||||
def shStatusCode = sh(label: 'Checking and Building', returnStatus: true, script: '''
|
||||
set -e
|
||||
./scripts/ci/frontend-build > ${WORKSPACE}/tmp-sh-build 2>&1
|
||||
./scripts/ci/test-and-build > ${WORKSPACE}/tmp-sh-build 2>&1
|
||||
''')
|
||||
shOutput = readFile "${env.WORKSPACE}/tmp-sh-build"
|
||||
if (shStatusCode != 0) {
|
||||
error "${shOutput}"
|
||||
}
|
||||
}
|
||||
}
|
||||
post {
|
||||
always {
|
||||
sh 'rm -f ${WORKSPACE}/tmp-sh-build'
|
||||
}
|
||||
failure {
|
||||
npmGithubPrComment("CI Error:\n\n```\n${shOutput}\n```", true)
|
||||
}
|
||||
}
|
||||
}
|
||||
stage('Docs') {
|
||||
steps {
|
||||
dir(path: 'docs') {
|
||||
sh 'yarn install'
|
||||
sh 'yarn build'
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
stage('Test Sqlite') {
|
||||
environment {
|
||||
COMPOSE_PROJECT_NAME = "npm_${BRANCH_LOWER}_${BUILD_NUMBER}_sqlite"
|
||||
COMPOSE_FILE = 'docker/docker-compose.ci.yml:docker/docker-compose.ci.sqlite.yml'
|
||||
}
|
||||
when {
|
||||
not {
|
||||
equals expected: 'UNSTABLE', actual: currentBuild.result
|
||||
}
|
||||
}
|
||||
steps {
|
||||
sh 'rm -rf ./test/results/junit/*'
|
||||
sh './scripts/ci/fulltest-cypress'
|
||||
}
|
||||
post {
|
||||
always {
|
||||
// Dumps to analyze later
|
||||
sh 'mkdir -p debug/sqlite'
|
||||
sh 'docker logs $(docker compose ps --all -q fullstack) > debug/sqlite/docker_fullstack.log 2>&1'
|
||||
sh 'docker logs $(docker compose ps --all -q stepca) > debug/sqlite/docker_stepca.log 2>&1'
|
||||
sh 'docker logs $(docker compose ps --all -q pdns) > debug/sqlite/docker_pdns.log 2>&1'
|
||||
sh 'docker logs $(docker compose ps --all -q pdns-db) > debug/sqlite/docker_pdns-db.log 2>&1'
|
||||
sh 'docker logs $(docker compose ps --all -q dnsrouter) > debug/sqlite/docker_dnsrouter.log 2>&1'
|
||||
junit 'test/results/junit/*'
|
||||
sh 'docker compose down --remove-orphans --volumes -t 30 || true'
|
||||
}
|
||||
unstable {
|
||||
dir(path: 'test/results') {
|
||||
archiveArtifacts(allowEmptyArchive: true, artifacts: '**/*', excludes: '**/*.xml')
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
stage('Test Mysql') {
|
||||
environment {
|
||||
COMPOSE_PROJECT_NAME = "npm_${BRANCH_LOWER}_${BUILD_NUMBER}_mysql"
|
||||
COMPOSE_FILE = 'docker/docker-compose.ci.yml:docker/docker-compose.ci.mysql.yml'
|
||||
}
|
||||
when {
|
||||
not {
|
||||
equals expected: 'UNSTABLE', actual: currentBuild.result
|
||||
}
|
||||
}
|
||||
steps {
|
||||
sh 'rm -rf ./test/results/junit/*'
|
||||
sh './scripts/ci/fulltest-cypress'
|
||||
}
|
||||
post {
|
||||
always {
|
||||
// Dumps to analyze later
|
||||
sh 'mkdir -p debug/mysql'
|
||||
sh 'docker logs $(docker compose ps --all -q fullstack) > debug/mysql/docker_fullstack.log 2>&1'
|
||||
sh 'docker logs $(docker compose ps --all -q stepca) > debug/mysql/docker_stepca.log 2>&1'
|
||||
sh 'docker logs $(docker compose ps --all -q pdns) > debug/mysql/docker_pdns.log 2>&1'
|
||||
sh 'docker logs $(docker compose ps --all -q pdns-db) > debug/mysql/docker_pdns-db.log 2>&1'
|
||||
sh 'docker logs $(docker compose ps --all -q dnsrouter) > debug/mysql/docker_dnsrouter.log 2>&1'
|
||||
junit 'test/results/junit/*'
|
||||
sh 'docker compose down --remove-orphans --volumes -t 30 || true'
|
||||
}
|
||||
unstable {
|
||||
dir(path: 'test/results') {
|
||||
archiveArtifacts(allowEmptyArchive: true, artifacts: '**/*', excludes: '**/*.xml')
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
stage('Test Postgres') {
|
||||
environment {
|
||||
COMPOSE_PROJECT_NAME = "npm_${BRANCH_LOWER}_${BUILD_NUMBER}_postgres"
|
||||
COMPOSE_FILE = 'docker/docker-compose.ci.yml:docker/docker-compose.ci.postgres.yml'
|
||||
}
|
||||
when {
|
||||
not {
|
||||
equals expected: 'UNSTABLE', actual: currentBuild.result
|
||||
}
|
||||
}
|
||||
steps {
|
||||
sh 'rm -rf ./test/results/junit/*'
|
||||
sh './scripts/ci/fulltest-cypress'
|
||||
}
|
||||
post {
|
||||
always {
|
||||
// Dumps to analyze later
|
||||
sh 'mkdir -p debug/postgres'
|
||||
sh 'docker logs $(docker compose ps --all -q fullstack) > debug/postgres/docker_fullstack.log 2>&1'
|
||||
sh 'docker logs $(docker compose ps --all -q stepca) > debug/postgres/docker_stepca.log 2>&1'
|
||||
sh 'docker logs $(docker compose ps --all -q pdns) > debug/postgres/docker_pdns.log 2>&1'
|
||||
sh 'docker logs $(docker compose ps --all -q pdns-db) > debug/postgres/docker_pdns-db.log 2>&1'
|
||||
sh 'docker logs $(docker compose ps --all -q dnsrouter) > debug/postgres/docker_dnsrouter.log 2>&1'
|
||||
sh 'docker logs $(docker compose ps --all -q db-postgres) > debug/postgres/docker_db-postgres.log 2>&1'
|
||||
sh 'docker logs $(docker compose ps --all -q authentik) > debug/postgres/docker_authentik.log 2>&1'
|
||||
sh 'docker logs $(docker compose ps --all -q authentik-redis) > debug/postgres/docker_authentik-redis.log 2>&1'
|
||||
sh 'docker logs $(docke rcompose ps --all -q authentik-ldap) > debug/postgres/docker_authentik-ldap.log 2>&1'
|
||||
|
||||
junit 'test/results/junit/*'
|
||||
sh 'docker compose down --remove-orphans --volumes -t 30 || true'
|
||||
}
|
||||
unstable {
|
||||
dir(path: 'test/results') {
|
||||
archiveArtifacts(allowEmptyArchive: true, artifacts: '**/*', excludes: '**/*.xml')
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
stage('MultiArch Build') {
|
||||
when {
|
||||
not {
|
||||
equals expected: 'UNSTABLE', actual: currentBuild.result
|
||||
}
|
||||
}
|
||||
steps {
|
||||
sh "./scripts/buildx --push ${buildxPushTags}"
|
||||
}
|
||||
}
|
||||
stage('Docs / Comment') {
|
||||
parallel {
|
||||
stage('Docs Job') {
|
||||
when {
|
||||
allOf {
|
||||
branch pattern: "^(develop|master)\$", comparator: "REGEXP"
|
||||
not {
|
||||
equals expected: 'UNSTABLE', actual: currentBuild.result
|
||||
}
|
||||
}
|
||||
}
|
||||
steps {
|
||||
build wait: false, job: 'nginx-proxy-manager-docs', parameters: [string(name: 'docs_branch', value: "$BRANCH_NAME")]
|
||||
}
|
||||
}
|
||||
stage('PR Comment') {
|
||||
when {
|
||||
allOf {
|
||||
changeRequest()
|
||||
not {
|
||||
equals expected: 'UNSTABLE', actual: currentBuild.result
|
||||
}
|
||||
}
|
||||
}
|
||||
steps {
|
||||
script {
|
||||
npmGithubPrComment("""Docker Image for build ${BUILD_NUMBER} is available on [DockerHub](https://cloud.docker.com/repository/docker/nginxproxymanager/${IMAGE}-dev):
|
||||
```
|
||||
nginxproxymanager/${IMAGE}-dev:${BRANCH_LOWER}
|
||||
```
|
||||
|
||||
> [!NOTE]
|
||||
> Ensure you backup your NPM instance before testing this image! Especially if there are database changes.
|
||||
> This is a different docker image namespace than the official image.
|
||||
|
||||
> [!WARNING]
|
||||
> Changes and additions to DNS Providers require verification by at least 2 members of the community!
|
||||
""", true)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
post {
|
||||
always {
|
||||
sh 'echo Reverting ownership'
|
||||
sh 'docker run --rm -v "$(pwd):/data" jc21/ci-tools chown -R "$(id -u):$(id -g)" /data'
|
||||
printResult(true)
|
||||
}
|
||||
failure {
|
||||
archiveArtifacts(artifacts: 'debug/**/*.*', allowEmptyArchive: true)
|
||||
}
|
||||
unstable {
|
||||
archiveArtifacts(artifacts: 'debug/**/*.*', allowEmptyArchive: true)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
def getVersion() {
|
||||
ver = sh(script: 'cat .version', returnStdout: true)
|
||||
return ver.trim()
|
||||
}
|
||||
|
||||
def getCommit() {
|
||||
ver = sh(script: 'git log -n 1 --format=%h', returnStdout: true)
|
||||
return ver.trim()
|
||||
}
|
||||
@@ -1,7 +1,7 @@
|
||||
<p align="center">
|
||||
<img src="https://nginxproxymanager.com/github.png">
|
||||
<br><br>
|
||||
<img src="https://img.shields.io/badge/version-2.13.0-green.svg?style=for-the-badge">
|
||||
<img src="https://img.shields.io/badge/version-2.13.4-green.svg?style=for-the-badge">
|
||||
<a href="https://hub.docker.com/repository/docker/jc21/nginx-proxy-manager">
|
||||
<img src="https://img.shields.io/docker/stars/jc21/nginx-proxy-manager.svg?style=for-the-badge">
|
||||
</a>
|
||||
|
||||
@@ -370,7 +370,7 @@
|
||||
"leaseweb": {
|
||||
"name": "LeaseWeb",
|
||||
"package_name": "certbot-dns-leaseweb",
|
||||
"version": "~=1.0.1",
|
||||
"version": "~=1.0.3",
|
||||
"dependencies": "",
|
||||
"credentials": "dns_leaseweb_api_token = 01234556789",
|
||||
"full_plugin_name": "dns-leaseweb"
|
||||
@@ -399,6 +399,14 @@
|
||||
"credentials": "dns_luadns_email = user@example.com\ndns_luadns_token = 0123456789abcdef0123456789abcdef",
|
||||
"full_plugin_name": "dns-luadns"
|
||||
},
|
||||
"mchost24": {
|
||||
"name": "MC-HOST24",
|
||||
"package_name": "certbot-dns-mchost24",
|
||||
"version": "",
|
||||
"dependencies": "",
|
||||
"credentials": "# Obtain API token using https://github.com/JoeJoeTV/mchost24-api-python\ndns_mchost24_api_token=<insert obtained API token here>",
|
||||
"full_plugin_name": "dns-mchost24"
|
||||
},
|
||||
"mijnhost": {
|
||||
"name": "mijn.host",
|
||||
"package_name": "certbot-dns-mijn-host",
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
import knex from "knex";
|
||||
import {configGet, configHas} from "./lib/config.js";
|
||||
|
||||
let instance = null;
|
||||
|
||||
const generateDbConfig = () => {
|
||||
if (!configHas("database")) {
|
||||
throw new Error(
|
||||
@@ -30,4 +32,11 @@ const generateDbConfig = () => {
|
||||
};
|
||||
};
|
||||
|
||||
export default knex(generateDbConfig());
|
||||
const getInstance = () => {
|
||||
if (!instance) {
|
||||
instance = knex(generateDbConfig());
|
||||
}
|
||||
return instance;
|
||||
}
|
||||
|
||||
export default getInstance;
|
||||
|
||||
@@ -4,6 +4,7 @@ import path from "path";
|
||||
import archiver from "archiver";
|
||||
import _ from "lodash";
|
||||
import moment from "moment";
|
||||
import { ProxyAgent } from "proxy-agent";
|
||||
import tempWrite from "temp-write";
|
||||
import dnsPlugins from "../certbot/dns-plugins.json" with { type: "json" };
|
||||
import { installPlugin } from "../lib/certbot.js";
|
||||
@@ -1114,6 +1115,7 @@ const internalCertificate = {
|
||||
|
||||
performTestForDomain: async (domain) => {
|
||||
logger.info(`Testing http challenge for ${domain}`);
|
||||
const agent = new ProxyAgent();
|
||||
const url = `http://${domain}/.well-known/acme-challenge/test-challenge`;
|
||||
const formBody = `method=G&url=${encodeURI(url)}&bodytype=T&requestbody=&headername=User-Agent&headervalue=None&locationid=1&ch=false&cc=false`;
|
||||
const options = {
|
||||
@@ -1123,6 +1125,7 @@ const internalCertificate = {
|
||||
"Content-Type": "application/x-www-form-urlencoded",
|
||||
"Content-Length": Buffer.byteLength(formBody),
|
||||
},
|
||||
agent,
|
||||
};
|
||||
|
||||
const result = await new Promise((resolve) => {
|
||||
|
||||
@@ -2,6 +2,7 @@ import fs from "node:fs";
|
||||
import https from "node:https";
|
||||
import { dirname } from "node:path";
|
||||
import { fileURLToPath } from "node:url";
|
||||
import { ProxyAgent } from "proxy-agent";
|
||||
import errs from "../lib/error.js";
|
||||
import utils from "../lib/utils.js";
|
||||
import { ipRanges as logger } from "../logger.js";
|
||||
@@ -29,10 +30,11 @@ const internalIpRanges = {
|
||||
},
|
||||
|
||||
fetchUrl: (url) => {
|
||||
const agent = new ProxyAgent();
|
||||
return new Promise((resolve, reject) => {
|
||||
logger.info(`Fetching ${url}`);
|
||||
return https
|
||||
.get(url, (res) => {
|
||||
.get(url, { agent }, (res) => {
|
||||
res.setEncoding("utf8");
|
||||
let raw_data = "";
|
||||
res.on("data", (chunk) => {
|
||||
|
||||
@@ -216,6 +216,11 @@ const internalNginx = {
|
||||
}
|
||||
}
|
||||
|
||||
// For redirection hosts, if the scheme is not http or https, set it to $scheme
|
||||
if (nice_host_type === "redirection_host" && ['http', 'https'].indexOf(host.forward_scheme.toLowerCase()) === -1) {
|
||||
host.forward_scheme = "$scheme";
|
||||
}
|
||||
|
||||
if (host.locations) {
|
||||
//logger.info ('host.locations = ' + JSON.stringify(host.locations, null, 2));
|
||||
origLocations = [].concat(host.locations);
|
||||
|
||||
@@ -25,6 +25,12 @@ const configure = () => {
|
||||
|
||||
if (configData?.database) {
|
||||
logger.info(`Using configuration from file: ${filename}`);
|
||||
|
||||
// Migrate those who have "mysql" engine to "mysql2"
|
||||
if (configData.database.engine === "mysql") {
|
||||
configData.database.engine = mysqlEngine;
|
||||
}
|
||||
|
||||
instance = configData;
|
||||
instance.keys = getKeys();
|
||||
return;
|
||||
@@ -33,12 +39,12 @@ const configure = () => {
|
||||
|
||||
const toBool = (v) => /^(1|true|yes|on)$/i.test((v || '').trim());
|
||||
|
||||
const envMysqlHost = process.env.DB_MYSQL_HOST || null;
|
||||
const envMysqlUser = process.env.DB_MYSQL_USER || null;
|
||||
const envMysqlName = process.env.DB_MYSQL_NAME || null;
|
||||
const envMysqlSSL = toBool(process.env.DB_MYSQL_SSL);
|
||||
const envMysqlSSLRejectUnauthorized = process.env.DB_MYSQL_SSL_REJECT_UNAUTHORIZED === undefined ? true : toBool(process.env.DB_MYSQL_SSL_REJECT_UNAUTHORIZED);
|
||||
const envMysqlSSLVerifyIdentity = process.env.DB_MYSQL_SSL_VERIFY_IDENTITY === undefined ? true : toBool(process.env.DB_MYSQL_SSL_VERIFY_IDENTITY);
|
||||
const envMysqlHost = process.env.DB_MYSQL_HOST || null;
|
||||
const envMysqlUser = process.env.DB_MYSQL_USER || null;
|
||||
const envMysqlName = process.env.DB_MYSQL_NAME || null;
|
||||
const envMysqlSSL = toBool(process.env.DB_MYSQL_SSL);
|
||||
const envMysqlSSLRejectUnauthorized = process.env.DB_MYSQL_SSL_REJECT_UNAUTHORIZED === undefined ? true : toBool(process.env.DB_MYSQL_SSL_REJECT_UNAUTHORIZED);
|
||||
const envMysqlSSLVerifyIdentity = process.env.DB_MYSQL_SSL_VERIFY_IDENTITY === undefined ? true : toBool(process.env.DB_MYSQL_SSL_VERIFY_IDENTITY);
|
||||
if (envMysqlHost && envMysqlUser && envMysqlName) {
|
||||
// we have enough mysql creds to go with mysql
|
||||
logger.info("Using MySQL configuration");
|
||||
|
||||
@@ -2,9 +2,9 @@ import db from "./db.js";
|
||||
import { migrate as logger } from "./logger.js";
|
||||
|
||||
const migrateUp = async () => {
|
||||
const version = await db.migrate.currentVersion();
|
||||
const version = await db().migrate.currentVersion();
|
||||
logger.info("Current database version:", version);
|
||||
return await db.migrate.latest({
|
||||
return await db().migrate.latest({
|
||||
tableName: "migrations",
|
||||
directory: "migrations",
|
||||
});
|
||||
|
||||
50
backend/migrations/20251111090000_redirect_auto_scheme.js
Normal file
50
backend/migrations/20251111090000_redirect_auto_scheme.js
Normal file
@@ -0,0 +1,50 @@
|
||||
import { migrate as logger } from "../logger.js";
|
||||
|
||||
const migrateName = "redirect_auto_scheme";
|
||||
|
||||
/**
|
||||
* Migrate
|
||||
*
|
||||
* @see http://knexjs.org/#Schema
|
||||
*
|
||||
* @param {Object} knex
|
||||
* @returns {Promise}
|
||||
*/
|
||||
const up = (knex) => {
|
||||
logger.info(`[${migrateName}] Migrating Up...`);
|
||||
|
||||
return knex.schema
|
||||
.table("redirection_host", async (table) => {
|
||||
// change the column default from $scheme to auto
|
||||
await table.string("forward_scheme").notNull().defaultTo("auto").alter();
|
||||
await knex('redirection_host')
|
||||
.where('forward_scheme', '$scheme')
|
||||
.update({ forward_scheme: 'auto' });
|
||||
})
|
||||
.then(() => {
|
||||
logger.info(`[${migrateName}] redirection_host Table altered`);
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* Undo Migrate
|
||||
*
|
||||
* @param {Object} knex
|
||||
* @returns {Promise}
|
||||
*/
|
||||
const down = (knex) => {
|
||||
logger.info(`[${migrateName}] Migrating Down...`);
|
||||
|
||||
return knex.schema
|
||||
.table("redirection_host", async (table) => {
|
||||
await table.string("forward_scheme").notNull().defaultTo("$scheme").alter();
|
||||
await knex('redirection_host')
|
||||
.where('forward_scheme', 'auto')
|
||||
.update({ forward_scheme: '$scheme' });
|
||||
})
|
||||
.then(() => {
|
||||
logger.info(`[${migrateName}] redirection_host Table altered`);
|
||||
});
|
||||
};
|
||||
|
||||
export { up, down };
|
||||
@@ -10,7 +10,7 @@ import now from "./now_helper.js";
|
||||
import ProxyHostModel from "./proxy_host.js";
|
||||
import User from "./user.js";
|
||||
|
||||
Model.knex(db);
|
||||
Model.knex(db());
|
||||
|
||||
const boolFields = ["is_deleted", "satisfy_any", "pass_auth"];
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@ import db from "../db.js";
|
||||
import accessListModel from "./access_list.js";
|
||||
import now from "./now_helper.js";
|
||||
|
||||
Model.knex(db);
|
||||
Model.knex(db());
|
||||
|
||||
class AccessListAuth extends Model {
|
||||
$beforeInsert() {
|
||||
|
||||
@@ -6,7 +6,7 @@ import db from "../db.js";
|
||||
import accessListModel from "./access_list.js";
|
||||
import now from "./now_helper.js";
|
||||
|
||||
Model.knex(db);
|
||||
Model.knex(db());
|
||||
|
||||
class AccessListClient extends Model {
|
||||
$beforeInsert() {
|
||||
|
||||
@@ -6,7 +6,7 @@ import db from "../db.js";
|
||||
import now from "./now_helper.js";
|
||||
import User from "./user.js";
|
||||
|
||||
Model.knex(db);
|
||||
Model.knex(db());
|
||||
|
||||
class AuditLog extends Model {
|
||||
$beforeInsert() {
|
||||
|
||||
@@ -8,7 +8,7 @@ import { convertBoolFieldsToInt, convertIntFieldsToBool } from "../lib/helpers.j
|
||||
import now from "./now_helper.js";
|
||||
import User from "./user.js";
|
||||
|
||||
Model.knex(db);
|
||||
Model.knex(db());
|
||||
|
||||
const boolFields = ["is_deleted"];
|
||||
|
||||
|
||||
@@ -11,7 +11,7 @@ import redirectionHostModel from "./redirection_host.js";
|
||||
import streamModel from "./stream.js";
|
||||
import userModel from "./user.js";
|
||||
|
||||
Model.knex(db);
|
||||
Model.knex(db());
|
||||
|
||||
const boolFields = ["is_deleted"];
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@ import Certificate from "./certificate.js";
|
||||
import now from "./now_helper.js";
|
||||
import User from "./user.js";
|
||||
|
||||
Model.knex(db);
|
||||
Model.knex(db());
|
||||
|
||||
const boolFields = ["is_deleted", "ssl_forced", "http2_support", "enabled", "hsts_enabled", "hsts_subdomains"];
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@ import { Model } from "objection";
|
||||
import db from "../db.js";
|
||||
import { isSqlite } from "../lib/config.js";
|
||||
|
||||
Model.knex(db);
|
||||
Model.knex(db());
|
||||
|
||||
export default () => {
|
||||
if (isSqlite()) {
|
||||
|
||||
@@ -9,7 +9,7 @@ import Certificate from "./certificate.js";
|
||||
import now from "./now_helper.js";
|
||||
import User from "./user.js";
|
||||
|
||||
Model.knex(db);
|
||||
Model.knex(db());
|
||||
|
||||
const boolFields = [
|
||||
"is_deleted",
|
||||
|
||||
@@ -8,7 +8,7 @@ import Certificate from "./certificate.js";
|
||||
import now from "./now_helper.js";
|
||||
import User from "./user.js";
|
||||
|
||||
Model.knex(db);
|
||||
Model.knex(db());
|
||||
|
||||
const boolFields = [
|
||||
"is_deleted",
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
import { Model } from "objection";
|
||||
import db from "../db.js";
|
||||
|
||||
Model.knex(db);
|
||||
Model.knex(db());
|
||||
|
||||
class Setting extends Model {
|
||||
$beforeInsert () {
|
||||
|
||||
@@ -5,7 +5,7 @@ import Certificate from "./certificate.js";
|
||||
import now from "./now_helper.js";
|
||||
import User from "./user.js";
|
||||
|
||||
Model.knex(db);
|
||||
Model.knex(db());
|
||||
|
||||
const boolFields = ["is_deleted", "enabled", "tcp_forwarding", "udp_forwarding"];
|
||||
|
||||
|
||||
@@ -7,7 +7,7 @@ import { convertBoolFieldsToInt, convertIntFieldsToBool } from "../lib/helpers.j
|
||||
import now from "./now_helper.js";
|
||||
import UserPermission from "./user_permission.js";
|
||||
|
||||
Model.knex(db);
|
||||
Model.knex(db());
|
||||
|
||||
const boolFields = ["is_deleted", "is_disabled"];
|
||||
|
||||
|
||||
@@ -5,7 +5,7 @@ import { Model } from "objection";
|
||||
import db from "../db.js";
|
||||
import now from "./now_helper.js";
|
||||
|
||||
Model.knex(db);
|
||||
Model.knex(db());
|
||||
|
||||
class UserPermission extends Model {
|
||||
$beforeInsert () {
|
||||
|
||||
@@ -32,6 +32,7 @@
|
||||
"objection": "3.0.1",
|
||||
"path": "^0.12.7",
|
||||
"pg": "^8.16.3",
|
||||
"proxy-agent": "^6.5.0",
|
||||
"signale": "1.4.0",
|
||||
"sqlite3": "^5.1.7",
|
||||
"temp-write": "^4.0.0"
|
||||
|
||||
@@ -37,7 +37,7 @@ const setupDefaultUser = async () => {
|
||||
|
||||
const data = {
|
||||
is_deleted: 0,
|
||||
email: email,
|
||||
email: initialAdminEmail,
|
||||
name: "Administrator",
|
||||
nickname: "Admin",
|
||||
avatar: "",
|
||||
@@ -53,7 +53,7 @@ const setupDefaultUser = async () => {
|
||||
.insert({
|
||||
user_id: user.id,
|
||||
type: "password",
|
||||
secret: password,
|
||||
secret: initialAdminPassword,
|
||||
meta: {},
|
||||
});
|
||||
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
auth_basic "Authorization required";
|
||||
auth_basic_user_file /data/access/{{ access_list_id }};
|
||||
|
||||
{% if access_list.pass_auth == 0 or access_list.pass_auth == true %}
|
||||
{% if access_list.pass_auth == 0 or access_list.pass_auth == false %}
|
||||
proxy_set_header Authorization "";
|
||||
{% endif %}
|
||||
|
||||
|
||||
@@ -143,6 +143,11 @@
|
||||
resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82"
|
||||
integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==
|
||||
|
||||
"@tootallnate/quickjs-emscripten@^0.23.0":
|
||||
version "0.23.0"
|
||||
resolved "https://registry.yarnpkg.com/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz#db4ecfd499a9765ab24002c3b696d02e6d32a12c"
|
||||
integrity sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==
|
||||
|
||||
"@types/json-schema@^7.0.15":
|
||||
version "7.0.15"
|
||||
resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841"
|
||||
@@ -168,6 +173,11 @@ agent-base@6, agent-base@^6.0.2:
|
||||
dependencies:
|
||||
debug "4"
|
||||
|
||||
agent-base@^7.1.0, agent-base@^7.1.2:
|
||||
version "7.1.4"
|
||||
resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-7.1.4.tgz#e3cd76d4c548ee895d3c3fd8dc1f6c5b9032e7a8"
|
||||
integrity sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==
|
||||
|
||||
agentkeepalive@^4.1.3:
|
||||
version "4.6.0"
|
||||
resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-4.6.0.tgz#35f73e94b3f40bf65f105219c623ad19c136ea6a"
|
||||
@@ -308,6 +318,13 @@ asn1@^0.2.4:
|
||||
dependencies:
|
||||
safer-buffer "~2.1.0"
|
||||
|
||||
ast-types@^0.13.4:
|
||||
version "0.13.4"
|
||||
resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.13.4.tgz#ee0d77b343263965ecc3fb62da16e7222b2b6782"
|
||||
integrity sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==
|
||||
dependencies:
|
||||
tslib "^2.0.1"
|
||||
|
||||
async@^3.2.4:
|
||||
version "3.2.6"
|
||||
resolved "https://registry.yarnpkg.com/async/-/async-3.2.6.tgz#1b0728e14929d51b85b449b7f06e27c1145e38ce"
|
||||
@@ -328,6 +345,11 @@ base64-js@^1.3.1:
|
||||
resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a"
|
||||
integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==
|
||||
|
||||
basic-ftp@^5.0.2:
|
||||
version "5.0.5"
|
||||
resolved "https://registry.yarnpkg.com/basic-ftp/-/basic-ftp-5.0.5.tgz#14a474f5fffecca1f4f406f1c26b18f800225ac0"
|
||||
integrity sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==
|
||||
|
||||
batchflow@^0.4.0:
|
||||
version "0.4.0"
|
||||
resolved "https://registry.yarnpkg.com/batchflow/-/batchflow-0.4.0.tgz#7d419df79b6b7587b06f9ea34f96ccef6f74e5b5"
|
||||
@@ -667,6 +689,11 @@ crc32-stream@^4.0.2:
|
||||
crc-32 "^1.2.0"
|
||||
readable-stream "^3.4.0"
|
||||
|
||||
data-uri-to-buffer@^6.0.2:
|
||||
version "6.0.2"
|
||||
resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz#8a58bb67384b261a38ef18bea1810cb01badd28b"
|
||||
integrity sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==
|
||||
|
||||
db-errors@^0.2.3:
|
||||
version "0.2.3"
|
||||
resolved "https://registry.yarnpkg.com/db-errors/-/db-errors-0.2.3.tgz#a6a38952e00b20e790f2695a6446b3c65497ffa2"
|
||||
@@ -700,6 +727,13 @@ debug@^3.2.7:
|
||||
dependencies:
|
||||
ms "^2.1.1"
|
||||
|
||||
debug@^4.3.4:
|
||||
version "4.4.3"
|
||||
resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.3.tgz#c6ae432d9bd9662582fce08709b038c58e9e3d6a"
|
||||
integrity sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==
|
||||
dependencies:
|
||||
ms "^2.1.3"
|
||||
|
||||
decamelize@^1.2.0:
|
||||
version "1.2.0"
|
||||
resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
|
||||
@@ -717,6 +751,15 @@ deep-extend@^0.6.0:
|
||||
resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac"
|
||||
integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==
|
||||
|
||||
degenerator@^5.0.0:
|
||||
version "5.0.1"
|
||||
resolved "https://registry.yarnpkg.com/degenerator/-/degenerator-5.0.1.tgz#9403bf297c6dad9a1ece409b37db27954f91f2f5"
|
||||
integrity sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==
|
||||
dependencies:
|
||||
ast-types "^0.13.4"
|
||||
escodegen "^2.1.0"
|
||||
esprima "^4.0.1"
|
||||
|
||||
delegates@^1.0.0:
|
||||
version "1.0.0"
|
||||
resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a"
|
||||
@@ -846,11 +889,37 @@ escape-string-regexp@^1.0.5:
|
||||
resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
|
||||
integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==
|
||||
|
||||
escodegen@^2.1.0:
|
||||
version "2.1.0"
|
||||
resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.1.0.tgz#ba93bbb7a43986d29d6041f99f5262da773e2e17"
|
||||
integrity sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==
|
||||
dependencies:
|
||||
esprima "^4.0.1"
|
||||
estraverse "^5.2.0"
|
||||
esutils "^2.0.2"
|
||||
optionalDependencies:
|
||||
source-map "~0.6.1"
|
||||
|
||||
esm@^3.2.25:
|
||||
version "3.2.25"
|
||||
resolved "https://registry.yarnpkg.com/esm/-/esm-3.2.25.tgz#342c18c29d56157688ba5ce31f8431fbb795cc10"
|
||||
integrity sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==
|
||||
|
||||
esprima@^4.0.1:
|
||||
version "4.0.1"
|
||||
resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71"
|
||||
integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==
|
||||
|
||||
estraverse@^5.2.0:
|
||||
version "5.3.0"
|
||||
resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123"
|
||||
integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==
|
||||
|
||||
esutils@^2.0.2:
|
||||
version "2.0.3"
|
||||
resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64"
|
||||
integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==
|
||||
|
||||
etag@~1.8.1:
|
||||
version "1.8.1"
|
||||
resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887"
|
||||
@@ -1069,6 +1138,15 @@ get-proto@^1.0.1:
|
||||
dunder-proto "^1.0.1"
|
||||
es-object-atoms "^1.0.0"
|
||||
|
||||
get-uri@^6.0.1:
|
||||
version "6.0.5"
|
||||
resolved "https://registry.yarnpkg.com/get-uri/-/get-uri-6.0.5.tgz#714892aa4a871db671abc5395e5e9447bc306a16"
|
||||
integrity sha512-b1O07XYq8eRuVzBNgJLstU6FYc1tS6wnMtF1I1D9lE8LxZSOGZ7LhxN54yPP6mGw5f2CkXY2BQUL9Fx41qvcIg==
|
||||
dependencies:
|
||||
basic-ftp "^5.0.2"
|
||||
data-uri-to-buffer "^6.0.2"
|
||||
debug "^4.3.4"
|
||||
|
||||
getopts@2.3.0:
|
||||
version "2.3.0"
|
||||
resolved "https://registry.yarnpkg.com/getopts/-/getopts-2.3.0.tgz#71e5593284807e03e2427449d4f6712a268666f4"
|
||||
@@ -1170,6 +1248,14 @@ http-proxy-agent@^4.0.1:
|
||||
agent-base "6"
|
||||
debug "4"
|
||||
|
||||
http-proxy-agent@^7.0.0, http-proxy-agent@^7.0.1:
|
||||
version "7.0.2"
|
||||
resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz#9a8b1f246866c028509486585f62b8f2c18c270e"
|
||||
integrity sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==
|
||||
dependencies:
|
||||
agent-base "^7.1.0"
|
||||
debug "^4.3.4"
|
||||
|
||||
https-proxy-agent@^5.0.0:
|
||||
version "5.0.1"
|
||||
resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6"
|
||||
@@ -1178,6 +1264,14 @@ https-proxy-agent@^5.0.0:
|
||||
agent-base "6"
|
||||
debug "4"
|
||||
|
||||
https-proxy-agent@^7.0.6:
|
||||
version "7.0.6"
|
||||
resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz#da8dfeac7da130b05c2ba4b59c9b6cd66611a6b9"
|
||||
integrity sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==
|
||||
dependencies:
|
||||
agent-base "^7.1.2"
|
||||
debug "4"
|
||||
|
||||
humanize-ms@^1.2.1:
|
||||
version "1.2.1"
|
||||
resolved "https://registry.yarnpkg.com/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed"
|
||||
@@ -1747,6 +1841,11 @@ negotiator@^0.6.2, negotiator@~0.6.4:
|
||||
resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.4.tgz#777948e2452651c570b712dd01c23e262713fff7"
|
||||
integrity sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==
|
||||
|
||||
netmask@^2.0.2:
|
||||
version "2.0.2"
|
||||
resolved "https://registry.yarnpkg.com/netmask/-/netmask-2.0.2.tgz#8b01a07644065d536383835823bc52004ebac5e7"
|
||||
integrity sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==
|
||||
|
||||
node-abi@^3.3.0:
|
||||
version "3.78.0"
|
||||
resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-3.78.0.tgz#fd0ecbd0aa89857b98da06bd3909194abb0821ba"
|
||||
@@ -1924,6 +2023,28 @@ p-try@^2.0.0:
|
||||
resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6"
|
||||
integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==
|
||||
|
||||
pac-proxy-agent@^7.1.0:
|
||||
version "7.2.0"
|
||||
resolved "https://registry.yarnpkg.com/pac-proxy-agent/-/pac-proxy-agent-7.2.0.tgz#9cfaf33ff25da36f6147a20844230ec92c06e5df"
|
||||
integrity sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA==
|
||||
dependencies:
|
||||
"@tootallnate/quickjs-emscripten" "^0.23.0"
|
||||
agent-base "^7.1.2"
|
||||
debug "^4.3.4"
|
||||
get-uri "^6.0.1"
|
||||
http-proxy-agent "^7.0.0"
|
||||
https-proxy-agent "^7.0.6"
|
||||
pac-resolver "^7.0.1"
|
||||
socks-proxy-agent "^8.0.5"
|
||||
|
||||
pac-resolver@^7.0.1:
|
||||
version "7.0.1"
|
||||
resolved "https://registry.yarnpkg.com/pac-resolver/-/pac-resolver-7.0.1.tgz#54675558ea368b64d210fd9c92a640b5f3b8abb6"
|
||||
integrity sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==
|
||||
dependencies:
|
||||
degenerator "^5.0.0"
|
||||
netmask "^2.0.2"
|
||||
|
||||
parse-json@^4.0.0:
|
||||
version "4.0.0"
|
||||
resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0"
|
||||
@@ -2120,6 +2241,25 @@ proxy-addr@~2.0.7:
|
||||
forwarded "0.2.0"
|
||||
ipaddr.js "1.9.1"
|
||||
|
||||
proxy-agent@^6.5.0:
|
||||
version "6.5.0"
|
||||
resolved "https://registry.yarnpkg.com/proxy-agent/-/proxy-agent-6.5.0.tgz#9e49acba8e4ee234aacb539f89ed9c23d02f232d"
|
||||
integrity sha512-TmatMXdr2KlRiA2CyDu8GqR8EjahTG3aY3nXjdzFyoZbmB8hrBsTyMezhULIXKnC0jpfjlmiZ3+EaCzoInSu/A==
|
||||
dependencies:
|
||||
agent-base "^7.1.2"
|
||||
debug "^4.3.4"
|
||||
http-proxy-agent "^7.0.1"
|
||||
https-proxy-agent "^7.0.6"
|
||||
lru-cache "^7.14.1"
|
||||
pac-proxy-agent "^7.1.0"
|
||||
proxy-from-env "^1.1.0"
|
||||
socks-proxy-agent "^8.0.5"
|
||||
|
||||
proxy-from-env@^1.1.0:
|
||||
version "1.1.0"
|
||||
resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2"
|
||||
integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==
|
||||
|
||||
pstree.remy@^1.1.8:
|
||||
version "1.1.8"
|
||||
resolved "https://registry.yarnpkg.com/pstree.remy/-/pstree.remy-1.1.8.tgz#c242224f4a67c21f686839bbdb4ac282b8373d3a"
|
||||
@@ -2422,7 +2562,16 @@ socks-proxy-agent@^6.0.0:
|
||||
debug "^4.3.3"
|
||||
socks "^2.6.2"
|
||||
|
||||
socks@^2.6.2:
|
||||
socks-proxy-agent@^8.0.5:
|
||||
version "8.0.5"
|
||||
resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz#b9cdb4e7e998509d7659d689ce7697ac21645bee"
|
||||
integrity sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==
|
||||
dependencies:
|
||||
agent-base "^7.1.2"
|
||||
debug "^4.3.4"
|
||||
socks "^2.8.3"
|
||||
|
||||
socks@^2.6.2, socks@^2.8.3:
|
||||
version "2.8.7"
|
||||
resolved "https://registry.yarnpkg.com/socks/-/socks-2.8.7.tgz#e2fb1d9a603add75050a2067db8c381a0b5669ea"
|
||||
integrity sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==
|
||||
@@ -2430,6 +2579,11 @@ socks@^2.6.2:
|
||||
ip-address "^10.0.1"
|
||||
smart-buffer "^4.2.0"
|
||||
|
||||
source-map@~0.6.1:
|
||||
version "0.6.1"
|
||||
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
|
||||
integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
|
||||
|
||||
split2@^4.1.0:
|
||||
version "4.2.0"
|
||||
resolved "https://registry.yarnpkg.com/split2/-/split2-4.2.0.tgz#c9c5920904d148bab0b9f67145f245a86aadbfa4"
|
||||
@@ -2609,6 +2763,11 @@ tr46@~0.0.3:
|
||||
resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a"
|
||||
integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==
|
||||
|
||||
tslib@^2.0.1:
|
||||
version "2.8.1"
|
||||
resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f"
|
||||
integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==
|
||||
|
||||
tunnel-agent@^0.6.0:
|
||||
version "0.6.0"
|
||||
resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd"
|
||||
|
||||
@@ -4,7 +4,6 @@
|
||||
# This file assumes that the frontend has been built using ./scripts/frontend-build
|
||||
|
||||
FROM nginxproxymanager/testca AS testca
|
||||
FROM letsencrypt/pebble AS pebbleca
|
||||
FROM nginxproxymanager/nginx-full:certbot-node
|
||||
|
||||
ARG TARGETPLATFORM
|
||||
@@ -46,7 +45,6 @@ RUN yarn install \
|
||||
|
||||
# add late to limit cache-busting by modifications
|
||||
COPY docker/rootfs /
|
||||
COPY --from=pebbleca /test/certs/pebble.minica.pem /etc/ssl/certs/pebble.minica.pem
|
||||
COPY --from=testca /home/step/certs/root_ca.crt /etc/ssl/certs/NginxProxyManager.crt
|
||||
|
||||
# Remove frontend service not required for prod, dev nginx config as well
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
AUTHENTIK_SECRET_KEY=gl8woZe8L6IIX8SC0c5Ocsj0xPkX5uJo5DVZCFl+L/QGbzuplfutYuua2ODNLEiDD3aFd9H2ylJmrke0
|
||||
AUTHENTIK_REDIS__HOST=authentik-redis
|
||||
AUTHENTIK_POSTGRESQL__HOST=db-postgres
|
||||
AUTHENTIK_POSTGRESQL__HOST=pgdb.internal
|
||||
AUTHENTIK_POSTGRESQL__USER=authentik
|
||||
AUTHENTIK_POSTGRESQL__NAME=authentik
|
||||
AUTHENTIK_POSTGRESQL__PASSWORD=07EKS5NLI6Tpv68tbdvrxfvj
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
FROM nginxproxymanager/testca AS testca
|
||||
FROM letsencrypt/pebble AS pebbleca
|
||||
FROM nginxproxymanager/nginx-full:certbot-node
|
||||
LABEL maintainer="Jamie Curnow <jc@jc21.com>"
|
||||
|
||||
@@ -33,7 +32,6 @@ RUN rm -f /etc/nginx/conf.d/production.conf \
|
||||
&& chmod 644 -R /root/.cache
|
||||
|
||||
# Certs for testing purposes
|
||||
COPY --from=pebbleca /test/certs/pebble.minica.pem /etc/ssl/certs/pebble.minica.pem
|
||||
COPY --from=testca /home/step/certs/root_ca.crt /etc/ssl/certs/NginxProxyManager.crt
|
||||
|
||||
EXPOSE 80 81 443
|
||||
|
||||
@@ -1,12 +0,0 @@
|
||||
{
|
||||
"pebble": {
|
||||
"listenAddress": "0.0.0.0:443",
|
||||
"managementListenAddress": "0.0.0.0:15000",
|
||||
"certificate": "test/certs/localhost/cert.pem",
|
||||
"privateKey": "test/certs/localhost/key.pem",
|
||||
"httpPort": 80,
|
||||
"tlsPort": 443,
|
||||
"ocspResponderURL": "",
|
||||
"externalAccountBindingRequired": false
|
||||
}
|
||||
}
|
||||
@@ -6,7 +6,7 @@ services:
|
||||
|
||||
fullstack:
|
||||
environment:
|
||||
DB_POSTGRES_HOST: "db-postgres"
|
||||
DB_POSTGRES_HOST: "pgdb.internal"
|
||||
DB_POSTGRES_PORT: "5432"
|
||||
DB_POSTGRES_USER: "npm"
|
||||
DB_POSTGRES_PASSWORD: "npmpass"
|
||||
@@ -27,7 +27,9 @@ services:
|
||||
- psql_vol:/var/lib/postgresql/data
|
||||
- ./ci/postgres:/docker-entrypoint-initdb.d
|
||||
networks:
|
||||
- fulltest
|
||||
fulltest:
|
||||
aliases:
|
||||
- pgdb.internal
|
||||
|
||||
authentik-redis:
|
||||
image: "redis:alpine"
|
||||
@@ -41,6 +43,8 @@ services:
|
||||
timeout: 3s
|
||||
volumes:
|
||||
- redis_vol:/data
|
||||
networks:
|
||||
- fulltest
|
||||
|
||||
authentik:
|
||||
image: ghcr.io/goauthentik/server:2024.10.1
|
||||
@@ -51,6 +55,8 @@ services:
|
||||
depends_on:
|
||||
- authentik-redis
|
||||
- db-postgres
|
||||
networks:
|
||||
- fulltest
|
||||
|
||||
authentik-worker:
|
||||
image: ghcr.io/goauthentik/server:2024.10.1
|
||||
@@ -61,6 +67,8 @@ services:
|
||||
depends_on:
|
||||
- authentik-redis
|
||||
- db-postgres
|
||||
networks:
|
||||
- fulltest
|
||||
|
||||
authentik-ldap:
|
||||
image: ghcr.io/goauthentik/ldap:2024.10.1
|
||||
@@ -71,6 +79,8 @@ services:
|
||||
restart: unless-stopped
|
||||
depends_on:
|
||||
- authentik
|
||||
networks:
|
||||
- fulltest
|
||||
|
||||
volumes:
|
||||
psql_vol:
|
||||
|
||||
@@ -3,31 +3,30 @@
|
||||
# This is a base compose file, it should be extended with a
|
||||
# docker-compose.ci.*.yml file
|
||||
services:
|
||||
|
||||
fullstack:
|
||||
image: "${IMAGE}:${BRANCH_LOWER}-ci-${BUILD_NUMBER}"
|
||||
environment:
|
||||
TZ: "${TZ:-Australia/Brisbane}"
|
||||
DEBUG: 'true'
|
||||
CI: 'true'
|
||||
DEBUG: "true"
|
||||
CI: "true"
|
||||
FORCE_COLOR: 1
|
||||
# Required for DNS Certificate provisioning in CI
|
||||
LE_SERVER: 'https://ca.internal/acme/acme/directory'
|
||||
REQUESTS_CA_BUNDLE: '/etc/ssl/certs/NginxProxyManager.crt'
|
||||
LE_SERVER: "https://ca.internal/acme/acme/directory"
|
||||
REQUESTS_CA_BUNDLE: "/etc/ssl/certs/NginxProxyManager.crt"
|
||||
volumes:
|
||||
- 'npm_data_ci:/data'
|
||||
- 'npm_le_ci:/etc/letsencrypt'
|
||||
- './dev/letsencrypt.ini:/etc/letsencrypt.ini:ro'
|
||||
- './dev/resolv.conf:/etc/resolv.conf:ro'
|
||||
- '/etc/localtime:/etc/localtime:ro'
|
||||
- "npm_data_ci:/data"
|
||||
- "npm_le_ci:/etc/letsencrypt"
|
||||
- "./dev/letsencrypt.ini:/etc/letsencrypt.ini:ro"
|
||||
- "./dev/resolv.conf:/etc/resolv.conf:ro"
|
||||
- "/etc/localtime:/etc/localtime:ro"
|
||||
healthcheck:
|
||||
test: ["CMD", "/usr/bin/check-health"]
|
||||
interval: 10s
|
||||
timeout: 3s
|
||||
expose:
|
||||
- '80-81/tcp'
|
||||
- '443/tcp'
|
||||
- '1500-1503/tcp'
|
||||
- "80-81/tcp"
|
||||
- "443/tcp"
|
||||
- "1500-1503/tcp"
|
||||
networks:
|
||||
fulltest:
|
||||
aliases:
|
||||
@@ -38,8 +37,8 @@ services:
|
||||
stepca:
|
||||
image: jc21/testca
|
||||
volumes:
|
||||
- './dev/resolv.conf:/etc/resolv.conf:ro'
|
||||
- '/etc/localtime:/etc/localtime:ro'
|
||||
- "./dev/resolv.conf:/etc/resolv.conf:ro"
|
||||
- "/etc/localtime:/etc/localtime:ro"
|
||||
networks:
|
||||
fulltest:
|
||||
aliases:
|
||||
@@ -48,18 +47,18 @@ services:
|
||||
pdns:
|
||||
image: pschiffe/pdns-mysql:4.8
|
||||
volumes:
|
||||
- '/etc/localtime:/etc/localtime:ro'
|
||||
- "/etc/localtime:/etc/localtime:ro"
|
||||
environment:
|
||||
PDNS_master: 'yes'
|
||||
PDNS_api: 'yes'
|
||||
PDNS_api_key: 'npm'
|
||||
PDNS_webserver: 'yes'
|
||||
PDNS_webserver_address: '0.0.0.0'
|
||||
PDNS_webserver_password: 'npm'
|
||||
PDNS_webserver-allow-from: '127.0.0.0/8,192.0.0.0/8,10.0.0.0/8,172.0.0.0/8'
|
||||
PDNS_version_string: 'anonymous'
|
||||
PDNS_master: "yes"
|
||||
PDNS_api: "yes"
|
||||
PDNS_api_key: "npm"
|
||||
PDNS_webserver: "yes"
|
||||
PDNS_webserver_address: "0.0.0.0"
|
||||
PDNS_webserver_password: "npm"
|
||||
PDNS_webserver-allow-from: "127.0.0.0/8,192.0.0.0/8,10.0.0.0/8,172.0.0.0/8"
|
||||
PDNS_version_string: "anonymous"
|
||||
PDNS_default_ttl: 1500
|
||||
PDNS_allow_axfr_ips: '127.0.0.0/8,192.0.0.0/8,10.0.0.0/8,172.0.0.0/8'
|
||||
PDNS_allow_axfr_ips: "127.0.0.0/8,192.0.0.0/8,10.0.0.0/8,172.0.0.0/8"
|
||||
PDNS_gmysql_host: pdns-db
|
||||
PDNS_gmysql_port: 3306
|
||||
PDNS_gmysql_user: pdns
|
||||
@@ -76,14 +75,14 @@ services:
|
||||
pdns-db:
|
||||
image: mariadb
|
||||
environment:
|
||||
MYSQL_ROOT_PASSWORD: 'pdns'
|
||||
MYSQL_DATABASE: 'pdns'
|
||||
MYSQL_USER: 'pdns'
|
||||
MYSQL_PASSWORD: 'pdns'
|
||||
MYSQL_ROOT_PASSWORD: "pdns"
|
||||
MYSQL_DATABASE: "pdns"
|
||||
MYSQL_USER: "pdns"
|
||||
MYSQL_PASSWORD: "pdns"
|
||||
volumes:
|
||||
- 'pdns_mysql_vol:/var/lib/mysql'
|
||||
- '/etc/localtime:/etc/localtime:ro'
|
||||
- './dev/pdns-db.sql:/docker-entrypoint-initdb.d/01_init.sql:ro'
|
||||
- "pdns_mysql_vol:/var/lib/mysql"
|
||||
- "/etc/localtime:/etc/localtime:ro"
|
||||
- "./dev/pdns-db.sql:/docker-entrypoint-initdb.d/01_init.sql:ro"
|
||||
networks:
|
||||
- fulltest
|
||||
|
||||
@@ -100,12 +99,12 @@ services:
|
||||
context: ../
|
||||
dockerfile: test/cypress/Dockerfile
|
||||
environment:
|
||||
HTTP_PROXY: 'squid:3128'
|
||||
HTTPS_PROXY: 'squid:3128'
|
||||
HTTP_PROXY: "squid:3128"
|
||||
HTTPS_PROXY: "squid:3128"
|
||||
volumes:
|
||||
- 'cypress_logs:/test/results'
|
||||
- './dev/resolv.conf:/etc/resolv.conf:ro'
|
||||
- '/etc/localtime:/etc/localtime:ro'
|
||||
- "cypress_logs:/test/results"
|
||||
- "./dev/resolv.conf:/etc/resolv.conf:ro"
|
||||
- "/etc/localtime:/etc/localtime:ro"
|
||||
command: cypress run --browser chrome --config-file=cypress/config/ci.js
|
||||
networks:
|
||||
- fulltest
|
||||
@@ -113,9 +112,9 @@ services:
|
||||
squid:
|
||||
image: ubuntu/squid
|
||||
volumes:
|
||||
- './dev/squid.conf:/etc/squid/squid.conf:ro'
|
||||
- './dev/resolv.conf:/etc/resolv.conf:ro'
|
||||
- '/etc/localtime:/etc/localtime:ro'
|
||||
- "./dev/squid.conf:/etc/squid/squid.conf:ro"
|
||||
- "./dev/resolv.conf:/etc/resolv.conf:ro"
|
||||
- "/etc/localtime:/etc/localtime:ro"
|
||||
networks:
|
||||
- fulltest
|
||||
|
||||
|
||||
@@ -32,7 +32,7 @@ services:
|
||||
# DB_MYSQL_PASSWORD: 'npm'
|
||||
# DB_MYSQL_NAME: 'npm'
|
||||
# db-postgres:
|
||||
DB_POSTGRES_HOST: "db-postgres"
|
||||
DB_POSTGRES_HOST: "pgdb.internal"
|
||||
DB_POSTGRES_PORT: "5432"
|
||||
DB_POSTGRES_USER: "npm"
|
||||
DB_POSTGRES_PASSWORD: "npmpass"
|
||||
@@ -81,8 +81,6 @@ services:
|
||||
db-postgres:
|
||||
image: postgres:17
|
||||
container_name: npm2dev.db-postgres
|
||||
networks:
|
||||
- nginx_proxy_manager
|
||||
environment:
|
||||
POSTGRES_USER: "npm"
|
||||
POSTGRES_PASSWORD: "npmpass"
|
||||
@@ -90,6 +88,10 @@ services:
|
||||
volumes:
|
||||
- psql_data:/var/lib/postgresql/data
|
||||
- ./ci/postgres:/docker-entrypoint-initdb.d
|
||||
networks:
|
||||
nginx_proxy_manager:
|
||||
aliases:
|
||||
- pgdb.internal
|
||||
|
||||
stepca:
|
||||
image: jc21/testca
|
||||
|
||||
@@ -8,7 +8,12 @@
|
||||
|
||||
const allLocales = [
|
||||
["en", "en-US"],
|
||||
["fa", "fa-IR"],
|
||||
["es", "es-ES"],
|
||||
["de", "de-DE"],
|
||||
["ru", "ru-RU"],
|
||||
["sk", "sk-SK"],
|
||||
["zh", "zh-CN"],
|
||||
["pl", "pl-PL"],
|
||||
];
|
||||
|
||||
const ignoreUnused = [
|
||||
|
||||
@@ -4,7 +4,7 @@ import type { ReactNode } from "react";
|
||||
import Select, { type ActionMeta, components, type OptionProps } from "react-select";
|
||||
import type { AccessList } from "src/api/backend";
|
||||
import { useAccessLists } from "src/hooks";
|
||||
import { DateTimeFormat, intl, T } from "src/locale";
|
||||
import { formatDateTime, intl, T } from "src/locale";
|
||||
|
||||
interface AccessOption {
|
||||
readonly value: number;
|
||||
@@ -48,7 +48,7 @@ export function AccessField({ name = "accessListId", label = "access-list", id =
|
||||
{
|
||||
users: item?.items?.length,
|
||||
rules: item?.clients?.length,
|
||||
date: item?.createdOn ? DateTimeFormat(item?.createdOn) : "N/A",
|
||||
date: item?.createdOn ? formatDateTime(item?.createdOn) : "N/A",
|
||||
},
|
||||
),
|
||||
icon: <IconLock size={14} className="text-lime" />,
|
||||
|
||||
@@ -3,7 +3,7 @@ import { Field, useFormikContext } from "formik";
|
||||
import Select, { type ActionMeta, components, type OptionProps } from "react-select";
|
||||
import type { Certificate } from "src/api/backend";
|
||||
import { useCertificates } from "src/hooks";
|
||||
import { DateTimeFormat, intl, T } from "src/locale";
|
||||
import { formatDateTime, intl, T } from "src/locale";
|
||||
|
||||
interface CertOption {
|
||||
readonly value: number | "new";
|
||||
@@ -75,7 +75,7 @@ export function SSLCertificateField({
|
||||
data?.map((cert: Certificate) => ({
|
||||
value: cert.id,
|
||||
label: cert.niceName,
|
||||
subLabel: `${cert.provider === "letsencrypt" ? intl.formatMessage({ id: "lets-encrypt" }) : cert.provider} — ${intl.formatMessage({ id: "expires.on" }, { date: cert.expiresOn ? DateTimeFormat(cert.expiresOn) : "N/A" })}`,
|
||||
subLabel: `${cert.provider === "letsencrypt" ? intl.formatMessage({ id: "lets-encrypt" }) : cert.provider} — ${intl.formatMessage({ id: "expires.on" }, { date: cert.expiresOn ? formatDateTime(cert.expiresOn) : "N/A" })}`,
|
||||
icon: <IconShield size={14} className="text-pink" />,
|
||||
})) || [];
|
||||
|
||||
|
||||
@@ -190,7 +190,7 @@ export function SiteMenu() {
|
||||
|
||||
return (
|
||||
<header className="navbar-expand-md">
|
||||
<div className="collapse navbar-collapse">
|
||||
<div className="collapse navbar-collapse" id="navbar-menu">
|
||||
<div className="navbar">
|
||||
<div className="container-xl">
|
||||
<div className="row flex-column flex-md-row flex-fill align-items-center">
|
||||
|
||||
@@ -5,5 +5,14 @@ interface Props {
|
||||
certificate?: Certificate;
|
||||
}
|
||||
export function CertificateFormatter({ certificate }: Props) {
|
||||
return <T id={certificate ? "lets-encrypt" : "http-only"} />;
|
||||
let translation = "http-only";
|
||||
if (certificate) {
|
||||
translation = certificate.provider;
|
||||
if (translation === "letsencrypt") {
|
||||
translation = "lets-encrypt";
|
||||
} else if (translation === "other") {
|
||||
translation = "certificates.custom";
|
||||
}
|
||||
}
|
||||
return <T id={translation} />;
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import cn from "classnames";
|
||||
import { differenceInDays, isPast, parseISO } from "date-fns";
|
||||
import { DateTimeFormat } from "src/locale";
|
||||
import { differenceInDays, isPast } from "date-fns";
|
||||
import { formatDateTime, parseDate } from "src/locale";
|
||||
|
||||
interface Props {
|
||||
value: string;
|
||||
@@ -8,11 +8,12 @@ interface Props {
|
||||
highlistNearlyExpired?: boolean;
|
||||
}
|
||||
export function DateFormatter({ value, highlightPast, highlistNearlyExpired }: Props) {
|
||||
const dateIsPast = isPast(parseISO(value));
|
||||
const days = differenceInDays(parseISO(value), new Date());
|
||||
const d = parseDate(value);
|
||||
const dateIsPast = d ? isPast(d) : false;
|
||||
const days = d ? differenceInDays(d, new Date()) : 0;
|
||||
const cl = cn({
|
||||
"text-danger": highlightPast && dateIsPast,
|
||||
"text-warning": highlistNearlyExpired && !dateIsPast && days <= 30 && days >= 0,
|
||||
});
|
||||
return <span className={cl}>{DateTimeFormat(value)}</span>;
|
||||
return <span className={cl}>{formatDateTime(value)}</span>;
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import cn from "classnames";
|
||||
import type { ReactNode } from "react";
|
||||
import { DateTimeFormat, T } from "src/locale";
|
||||
import { formatDateTime, T } from "src/locale";
|
||||
|
||||
interface Props {
|
||||
domains: string[];
|
||||
@@ -53,7 +53,7 @@ export function DomainsFormatter({ domains, createdOn, niceName, provider, color
|
||||
<div className="font-weight-medium">{...elms}</div>
|
||||
{createdOn ? (
|
||||
<div className="text-secondary mt-1">
|
||||
<T id="created-on" data={{ date: DateTimeFormat(createdOn) }} />
|
||||
<T id="created-on" data={{ date: formatDateTime(createdOn) }} />
|
||||
</div>
|
||||
) : null}
|
||||
</div>
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import { IconArrowsCross, IconBolt, IconBoltOff, IconDisc, IconLock, IconShield, IconUser } from "@tabler/icons-react";
|
||||
import cn from "classnames";
|
||||
import type { AuditLog } from "src/api/backend";
|
||||
import { DateTimeFormat, T } from "src/locale";
|
||||
import { formatDateTime, T } from "src/locale";
|
||||
|
||||
const getEventValue = (event: AuditLog) => {
|
||||
switch (event.objectType) {
|
||||
@@ -73,7 +73,7 @@ export function EventFormatter({ row }: Props) {
|
||||
<T id={`object.event.${row.action}`} tData={{ object: row.objectType }} />
|
||||
— <span className="badge">{getEventValue(row)}</span>
|
||||
</div>
|
||||
<div className="text-secondary mt-1">{DateTimeFormat(row.createdOn)}</div>
|
||||
<div className="text-secondary mt-1">{formatDateTime(row.createdOn)}</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
const defaultImg = "/images/default-avatar.jpg";
|
||||
|
||||
interface Props {
|
||||
url: string;
|
||||
url?: string;
|
||||
name?: string;
|
||||
}
|
||||
export function GravatarFormatter({ url, name }: Props) {
|
||||
@@ -9,7 +11,7 @@ export function GravatarFormatter({ url, name }: Props) {
|
||||
title={name}
|
||||
className="avatar avatar-2 me-2"
|
||||
style={{
|
||||
backgroundImage: `url(${url})`,
|
||||
backgroundImage: `url(${url || defaultImg})`,
|
||||
}}
|
||||
/>
|
||||
</div>
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { DateTimeFormat, T } from "src/locale";
|
||||
import { formatDateTime, T } from "src/locale";
|
||||
|
||||
interface Props {
|
||||
value: string;
|
||||
@@ -13,7 +13,7 @@ export function ValueWithDateFormatter({ value, createdOn, disabled }: Props) {
|
||||
</div>
|
||||
{createdOn ? (
|
||||
<div className={`text-secondary mt-1 ${disabled ? "text-red" : ""}`}>
|
||||
<T id={disabled ? "disabled" : "created-on"} data={{ date: DateTimeFormat(createdOn) }} />
|
||||
<T id={disabled ? "disabled" : "created-on"} data={{ date: formatDateTime(createdOn) }} />
|
||||
</div>
|
||||
) : null}
|
||||
</div>
|
||||
|
||||
@@ -1,15 +0,0 @@
|
||||
import { intlFormat, parseISO } from "date-fns";
|
||||
|
||||
const DateTimeFormat = (isoDate: string) =>
|
||||
intlFormat(parseISO(isoDate), {
|
||||
weekday: "long",
|
||||
year: "numeric",
|
||||
month: "numeric",
|
||||
day: "numeric",
|
||||
hour: "numeric",
|
||||
minute: "numeric",
|
||||
second: "numeric",
|
||||
hour12: true,
|
||||
});
|
||||
|
||||
export { DateTimeFormat };
|
||||
57
frontend/src/locale/IntlProvider.tsx
Normal file → Executable file
57
frontend/src/locale/IntlProvider.tsx
Normal file → Executable file
@@ -1,15 +1,45 @@
|
||||
import { createIntl, createIntlCache } from "react-intl";
|
||||
import langDe from "./lang/de.json";
|
||||
import langEn from "./lang/en.json";
|
||||
import langEs from "./lang/es.json";
|
||||
import langJa from "./lang/ja.json";
|
||||
import langList from "./lang/lang-list.json";
|
||||
import langRu from "./lang/ru.json";
|
||||
import langSk from "./lang/sk.json";
|
||||
import langZh from "./lang/zh.json";
|
||||
import langPl from "./lang/pl.json";
|
||||
|
||||
// first item of each array should be the language code,
|
||||
// not the country code
|
||||
// Remember when adding to this list, also update check-locales.js script
|
||||
const localeOptions = [["en", "en-US"]];
|
||||
const localeOptions = [
|
||||
["en", "en-US"],
|
||||
["de", "de-DE"],
|
||||
["es", "es-ES"],
|
||||
["ja", "ja-JP"],
|
||||
["ru", "ru-RU"],
|
||||
["sk", "sk-SK"],
|
||||
["zh", "zh-CN"],
|
||||
["pl", "pl-PL"],
|
||||
];
|
||||
|
||||
const loadMessages = (locale?: string): typeof langList & typeof langEn => {
|
||||
const thisLocale = locale || "en";
|
||||
switch (thisLocale.slice(0, 2)) {
|
||||
case "de":
|
||||
return Object.assign({}, langList, langEn, langDe);
|
||||
case "es":
|
||||
return Object.assign({}, langList, langEn, langEs);
|
||||
case "ja":
|
||||
return Object.assign({}, langList, langEn, langJa);
|
||||
case "ru":
|
||||
return Object.assign({}, langList, langEn, langRu);
|
||||
case "sk":
|
||||
return Object.assign({}, langList, langEn, langSk);
|
||||
case "zh":
|
||||
return Object.assign({}, langList, langEn, langZh);
|
||||
case "pl":
|
||||
return Object.assign({}, langList, langEn, langPl);
|
||||
default:
|
||||
return Object.assign({}, langList, langEn);
|
||||
}
|
||||
@@ -17,6 +47,27 @@ const loadMessages = (locale?: string): typeof langList & typeof langEn => {
|
||||
|
||||
const getFlagCodeForLocale = (locale?: string) => {
|
||||
switch (locale) {
|
||||
case "es-ES":
|
||||
case "es":
|
||||
return "ES";
|
||||
case "de-DE":
|
||||
case "de":
|
||||
return "DE";
|
||||
case "ja-JP":
|
||||
case "ja":
|
||||
return "JP";
|
||||
case "ru-RU":
|
||||
case "ru":
|
||||
return "RU";
|
||||
case "sk-SK":
|
||||
case "sk":
|
||||
return "SK";
|
||||
case "zh":
|
||||
case "zh-CN":
|
||||
return "CN";
|
||||
case "pl":
|
||||
case "pl-PL":
|
||||
return "PL";
|
||||
default:
|
||||
return "EN";
|
||||
}
|
||||
@@ -30,6 +81,10 @@ const getLocale = (short = false) => {
|
||||
if (short) {
|
||||
return loc.slice(0, 2);
|
||||
}
|
||||
// finally, fallback
|
||||
if (!loc) {
|
||||
loc = "en";
|
||||
}
|
||||
return loc;
|
||||
};
|
||||
|
||||
|
||||
74
frontend/src/locale/Utils.test.tsx
Normal file
74
frontend/src/locale/Utils.test.tsx
Normal file
@@ -0,0 +1,74 @@
|
||||
import { formatDateTime } from "src/locale";
|
||||
import { afterAll, beforeAll, describe, expect, it } from "vitest";
|
||||
|
||||
describe("DateFormatter", () => {
|
||||
// Keep a reference to the real Intl to restore later
|
||||
const RealIntl = global.Intl;
|
||||
const desiredTimeZone = "Europe/London";
|
||||
const desiredLocale = "en-GB";
|
||||
|
||||
beforeAll(() => {
|
||||
// Ensure Node-based libs using TZ behave deterministically
|
||||
try {
|
||||
process.env.TZ = desiredTimeZone;
|
||||
} catch {
|
||||
// ignore if not available
|
||||
}
|
||||
|
||||
// Mock Intl.DateTimeFormat so formatting is stable regardless of host
|
||||
const MockedDateTimeFormat = class extends RealIntl.DateTimeFormat {
|
||||
constructor(_locales?: string | string[], options?: Intl.DateTimeFormatOptions) {
|
||||
super(desiredLocale, {
|
||||
...options,
|
||||
timeZone: desiredTimeZone,
|
||||
});
|
||||
}
|
||||
} as unknown as typeof Intl.DateTimeFormat;
|
||||
|
||||
global.Intl = {
|
||||
...RealIntl,
|
||||
DateTimeFormat: MockedDateTimeFormat,
|
||||
};
|
||||
});
|
||||
|
||||
afterAll(() => {
|
||||
// Restore original Intl after tests
|
||||
global.Intl = RealIntl;
|
||||
});
|
||||
|
||||
it("format date from iso date", () => {
|
||||
const value = "2024-01-01T00:00:00.000Z";
|
||||
const text = formatDateTime(value);
|
||||
expect(text).toBe("Monday, 01/01/2024, 12:00:00 am");
|
||||
});
|
||||
|
||||
it("format date from unix timestamp number", () => {
|
||||
const value = 1762476112;
|
||||
const text = formatDateTime(value);
|
||||
expect(text).toBe("Friday, 07/11/2025, 12:41:52 am");
|
||||
});
|
||||
|
||||
it("format date from unix timestamp string", () => {
|
||||
const value = "1762476112";
|
||||
const text = formatDateTime(value);
|
||||
expect(text).toBe("Friday, 07/11/2025, 12:41:52 am");
|
||||
});
|
||||
|
||||
it("catch bad format from string", () => {
|
||||
const value = "this is not a good date";
|
||||
const text = formatDateTime(value);
|
||||
expect(text).toBe("this is not a good date");
|
||||
});
|
||||
|
||||
it("catch bad format from number", () => {
|
||||
const value = -100;
|
||||
const text = formatDateTime(value);
|
||||
expect(text).toBe("-100");
|
||||
});
|
||||
|
||||
it("catch bad format from number as string", () => {
|
||||
const value = "-100";
|
||||
const text = formatDateTime(value);
|
||||
expect(text).toBe("-100");
|
||||
});
|
||||
});
|
||||
42
frontend/src/locale/Utils.ts
Normal file
42
frontend/src/locale/Utils.ts
Normal file
@@ -0,0 +1,42 @@
|
||||
import { fromUnixTime, intlFormat, parseISO } from "date-fns";
|
||||
|
||||
const isUnixTimestamp = (value: unknown): boolean => {
|
||||
if (typeof value !== "number" && typeof value !== "string") return false;
|
||||
const num = Number(value);
|
||||
if (!Number.isFinite(num)) return false;
|
||||
// Check plausible Unix timestamp range: from 1970 to ~year 3000
|
||||
// Support both seconds and milliseconds
|
||||
if (num > 0 && num < 10000000000) return true; // seconds (<= 10 digits)
|
||||
if (num >= 10000000000 && num < 32503680000000) return true; // milliseconds (<= 13 digits)
|
||||
return false;
|
||||
};
|
||||
|
||||
const parseDate = (value: string | number): Date | null => {
|
||||
if (typeof value !== "number" && typeof value !== "string") return null;
|
||||
try {
|
||||
return isUnixTimestamp(value) ? fromUnixTime(+value) : parseISO(`${value}`);
|
||||
} catch {
|
||||
return null;
|
||||
}
|
||||
};
|
||||
|
||||
const formatDateTime = (value: string | number): string => {
|
||||
const d = parseDate(value);
|
||||
if (!d) return `${value}`;
|
||||
try {
|
||||
return intlFormat(d, {
|
||||
weekday: "long",
|
||||
year: "numeric",
|
||||
month: "numeric",
|
||||
day: "numeric",
|
||||
hour: "numeric",
|
||||
minute: "numeric",
|
||||
second: "numeric",
|
||||
hour12: true,
|
||||
});
|
||||
} catch {
|
||||
return `${value}`;
|
||||
}
|
||||
};
|
||||
|
||||
export { formatDateTime, parseDate, isUnixTimestamp };
|
||||
@@ -1,2 +1,2 @@
|
||||
export * from "./DateTimeFormat";
|
||||
export * from "./IntlProvider";
|
||||
export * from "./Utils";
|
||||
|
||||
216
frontend/src/locale/lang/de.json
Normal file
216
frontend/src/locale/lang/de.json
Normal file
@@ -0,0 +1,216 @@
|
||||
{
|
||||
"access-list": "Zugriffsliste",
|
||||
"access-list.access-count": "{count} {count, plural, one {Regel} other {Regeln}}",
|
||||
"access-list.auth-count": "{count} {count, plural, one {User} other {Users}}",
|
||||
"access-list.help-rules-last": "Wenn mindestens eine Regel vorhanden ist, wird diese Regel zum Ablehnen aller Anfragen als letzte hinzugefügt.",
|
||||
"access-list.help.rules-order": "Beachten Sie, dass die Anweisungen „Erlauben“ und „Verbieten“ in der Reihenfolge ihrer Definition angewendet werden.",
|
||||
"access-list.pass-auth": "Authentifizierung an Upstream weiterleiten",
|
||||
"access-list.public": "Öffentlich",
|
||||
"access-list.public.subtitle": "Keine Authentifizierung erforderlich",
|
||||
"access-list.satisfy-any": "Satisfy Any",
|
||||
"access-list.subtitle": "{users} {users, plural, one {User} other {Users}}, {rules} {rules, plural, one {Regel} other {Regeln}} - Erstellt: {date}",
|
||||
"access-lists": "Zugrifflisten",
|
||||
"action.add": "Hinzufügen",
|
||||
"action.add-location": "Pfad Hinzufügen",
|
||||
"action.close": "Schließen",
|
||||
"action.delete": "Löschen",
|
||||
"action.disable": "Deaktivieren",
|
||||
"action.download": "Herunterladen",
|
||||
"action.edit": "Bearbeiten",
|
||||
"action.enable": "Aktivieren",
|
||||
"action.permissions": "Berechtigungen",
|
||||
"action.renew": "Erneuert",
|
||||
"action.view-details": "Details",
|
||||
"auditlogs": "Protokoll",
|
||||
"cancel": "Abbrechen",
|
||||
"certificate": "Zertifikat",
|
||||
"certificate.custom-certificate": "Zertifikat",
|
||||
"certificate.custom-certificate-key": "Privater Schlüssel",
|
||||
"certificate.custom-intermediate": "Zwischen Zertifikat",
|
||||
"certificate.in-use": "In Benutzung",
|
||||
"certificate.none.subtitle": "Kein Zertifikat zugewiesen",
|
||||
"certificate.none.subtitle.for-http": "Dieser Host verwendet kein HTTPS.",
|
||||
"certificate.none.title": "Kein",
|
||||
"certificate.not-in-use": "Nicht in Benutzung",
|
||||
"certificate.renew": "Zertifikat erneuern",
|
||||
"certificates": "Zertifikate",
|
||||
"certificates.custom": "Benutzerdefiniertes Zertifikat",
|
||||
"certificates.custom.warning": "Mit einem Passwort geschützte Schlüsseldateien werden nicht unterstützt.",
|
||||
"certificates.dns.credentials": "Inhalt der Anmeldedaten-Datei",
|
||||
"certificates.dns.credentials-note": "Dieses Plugin erfordert eine Konfigurationsdatei, die einen API-Token oder andere Anmeldedaten für Ihren Anbieter enthält.",
|
||||
"certificates.dns.credentials-warning": "Diese Daten werden als Klartext in der Datenbank und in einer Datei gespeichert!",
|
||||
"certificates.dns.propagation-seconds": "Wartzeit in Sekunden",
|
||||
"certificates.dns.propagation-seconds-note": "Leer lassen um die Standardwartezeit des Plugins zu nutzen",
|
||||
"certificates.dns.provider": "DNS Provider",
|
||||
"certificates.dns.warning": "Dieser Abschnitt erfordert einige Kenntnisse über Certbot und seine DNS-Plugins. Bitte konsultieren Sie die jeweilige Plugin-Dokumentation.",
|
||||
"certificates.http.reachability-404": "Unter dieser Domain wurde ein Server gefunden, aber es scheint sich nicht um Nginx Proxy Manager zu handeln. Bitte stellen Sie sicher, dass Ihre Domain auf die IP-Adresse verweist, unter der Ihre NPM-Instanz ausgeführt wird.",
|
||||
"certificates.http.reachability-failed-to-check": "Die Erreichbarkeit konnte aufgrund eines Kommunikationsfehlers mit site24x7.com nicht überprüft werden.",
|
||||
"certificates.http.reachability-not-resolved": "Unter dieser Domain ist kein Server verfügbar. Bitte stellen Sie sicher, dass Ihre Domain existiert und auf die IP-Adresse verweist, unter der Ihre NPM-Instanz läuft, und dass gegebenenfalls Port 80 in Ihrem Router weitergeleitet wird.",
|
||||
"certificates.http.reachability-ok": "Ihr Server ist erreichbar und die Erstellung von Zertifikaten sollte möglich sein.",
|
||||
"certificates.http.reachability-other": "Unter dieser Domain wurde ein Server gefunden, der jedoch einen unerwarteten Statuscode {code} zurückgegeben hat. Handelt es sich um den NPM-Server? Bitte stellen Sie sicher, dass Ihre Domain auf die IP-Adresse verweist, unter der Ihre NPM-Instanz ausgeführt wird.",
|
||||
"certificates.http.reachability-wrong-data": "Unter dieser Domain wurde ein Server gefunden, der jedoch unerwartete Daten zurückgegeben hat. Handelt es sich um den NPM-Server? Bitte stellen Sie sicher, dass Ihre Domain auf die IP-Adresse verweist, unter der Ihre NPM-Instanz ausgeführt wird.",
|
||||
"certificates.http.test-results": "Test Ergeniss",
|
||||
"certificates.http.warning": "Diese Domänen müssen bereits so konfiguriert sein, dass sie auf diese Installation verweisen.",
|
||||
"certificates.request.subtitle": "Über Let's Encrypt",
|
||||
"certificates.request.title": "Anfordern eines neuen Zertifikates",
|
||||
"column.access": "Zugriff",
|
||||
"column.authorization": "Genehmigung",
|
||||
"column.authorizations": "Genehmigungen",
|
||||
"column.custom-locations": "Benutzerdefinierte Pfad",
|
||||
"column.destination": "Ziel",
|
||||
"column.details": "Details",
|
||||
"column.email": "Email",
|
||||
"column.event": "Ereignis",
|
||||
"column.expires": "Verfällt am",
|
||||
"column.http-code": "HTTP Code",
|
||||
"column.incoming-port": "Eingehender Port",
|
||||
"column.name": "Name",
|
||||
"column.protocol": "Protokoll",
|
||||
"column.provider": "Provider",
|
||||
"column.roles": "Rollen",
|
||||
"column.rules": "Regeln",
|
||||
"column.satisfy": "Satisfy",
|
||||
"column.satisfy-all": "Alle",
|
||||
"column.satisfy-any": "Jeder",
|
||||
"column.scheme": "Schema",
|
||||
"column.source": "Quelle",
|
||||
"column.ssl": "SSL",
|
||||
"column.status": "Status",
|
||||
"created-on": "Erstelldatum: {date}",
|
||||
"dashboard": "Dashboard",
|
||||
"dead-host": "404 Host",
|
||||
"dead-hosts": "404 Hosts",
|
||||
"dead-hosts.count": "{count} {count, plural, one {404 Host} other {404 Hosts}}",
|
||||
"disabled": "Deaktiviert",
|
||||
"domain-names": "Domain Names",
|
||||
"domain-names.max": "{count} Maximale Anzahl von Domainnamen",
|
||||
"domain-names.placeholder": "Eintragen der Domain...",
|
||||
"domain-names.wildcards-not-permitted": "Wildcards sind für diesen Typ nicht zulässig.",
|
||||
"domain-names.wildcards-not-supported": "Wildcards werden für diese Zertifizierungsstelle nicht unterstützt.",
|
||||
"domains.force-ssl": "Erzwinge SSL",
|
||||
"domains.hsts-enabled": "HSTS aktiviert",
|
||||
"domains.hsts-subdomains": "HSTS Sub-domains",
|
||||
"domains.http2-support": "HTTP/2 Support",
|
||||
"domains.use-dns": "Nutze DNS Challenge",
|
||||
"email-address": "Email Addresse",
|
||||
"empty-search": "Keine Ergebnisse gefunden",
|
||||
"empty-subtitle": "Warum erstellen Sie nicht eine?",
|
||||
"enabled": "aktiviert",
|
||||
"error.access.at-least-one": "Entweder eine Genehmigung oder eine Zugriffsregel ist erforderlich.",
|
||||
"error.access.duplicate-usernames": "Autorisierung Benutzernamen müssen eindeutig sein",
|
||||
"error.invalid-auth": "Ungültige E-Mail-Adresse oder Passwort",
|
||||
"error.invalid-domain": "Ungültige Domain: {domain}",
|
||||
"error.invalid-email": "Ungültige E-Mail-Adresse",
|
||||
"error.max-character-length": "Die maximale Länge beträgt {max} Zeichen{max, plural, one {} other {s}}",
|
||||
"error.max-domains": "Zu viele Domains, maximal sind {max}",
|
||||
"error.maximum": "Maximum ist {max}",
|
||||
"error.min-character-length": "Die minimale Länge beträgt {min} Zeichen{min, plural, one {} other {s}}",
|
||||
"error.minimum": "Minimum ist {min}",
|
||||
"error.passwords-must-match": "Passwörter müssen übereinstimmen",
|
||||
"error.required": "Dies ist erforderlich.",
|
||||
"expires.on": "Ablauf am: {date}",
|
||||
"footer.github-fork": "Fork me on Github",
|
||||
"host.flags.block-exploits": "Gängige Exploits blockieren",
|
||||
"host.flags.cache-assets": "Cache Assets",
|
||||
"host.flags.preserve-path": "Pfad beibehalten",
|
||||
"host.flags.protocols": "Protokole",
|
||||
"host.flags.websockets-upgrade": "Websockets Support",
|
||||
"host.forward-port": "Forward Port",
|
||||
"host.forward-scheme": "Schema",
|
||||
"hosts": "Hosts",
|
||||
"http-only": "HTTP Only",
|
||||
"lets-encrypt": "Let's Encrypt",
|
||||
"lets-encrypt-via-dns": "Let's Encrypt via DNS",
|
||||
"lets-encrypt-via-http": "Let's Encrypt via HTTP",
|
||||
"loading": "Laden…",
|
||||
"login.title": "Account Login",
|
||||
"nginx-config.label": "Benutzerdefinierte Nginx Konfiguration",
|
||||
"nginx-config.placeholder": "# Geben Sie hier Ihre benutzerdefinierte Nginx-Konfiguration auf eigene Gefahr ein!",
|
||||
"no-permission-error": "Sie haben keinen Zugriff, um dies anzuzeigen.",
|
||||
"notfound.action": "Take me home",
|
||||
"notfound.content": "We are sorry but the page you are looking for was not found",
|
||||
"notfound.title": "Oops… You just found an error page",
|
||||
"notification.error": "Error",
|
||||
"notification.object-deleted": "{object} wurde gelöscht",
|
||||
"notification.object-disabled": "{object} wurde deaktiviert",
|
||||
"notification.object-enabled": "{object} wurde aktiviert",
|
||||
"notification.object-renewed": "{object} wurde erneuert",
|
||||
"notification.object-saved": "{object} wurde gespeichert",
|
||||
"notification.success": "Erfolgreich",
|
||||
"object.actions-title": "{object} #{id}",
|
||||
"object.add": "{object} hinzufügen",
|
||||
"object.delete": "{object} löschen",
|
||||
"object.delete.content": "{object} wirklich löschen?",
|
||||
"object.edit": "{object} bearbeiten",
|
||||
"object.empty": "Keine {objects} vorhanden",
|
||||
"object.event.created": "{object} erstellt",
|
||||
"object.event.deleted": "{object} gelöscht",
|
||||
"object.event.disabled": "{object} deaktiviert",
|
||||
"object.event.enabled": "{object} aktiviert",
|
||||
"object.event.renewed": "{object} erneuert",
|
||||
"object.event.updated": "{object} aktualisiert",
|
||||
"offline": "Offline",
|
||||
"online": "Online",
|
||||
"options": "Optionen",
|
||||
"password": "Passwort",
|
||||
"password.generate": "Zufälliges Passwort generieren",
|
||||
"password.hide": "Passwort verstecken",
|
||||
"password.show": "Passwort anzeigen",
|
||||
"permissions.hidden": "Versteckt",
|
||||
"permissions.manage": "Verwalten",
|
||||
"permissions.view": "Nur anzeigen",
|
||||
"permissions.visibility.all": "Alle Elemente",
|
||||
"permissions.visibility.title": "Objekt Sichtbarkeit",
|
||||
"permissions.visibility.user": "Nur erstellte Elemente",
|
||||
"proxy-host": "Proxy Host",
|
||||
"proxy-host.forward-host": "Forward Hostname / IP",
|
||||
"proxy-hosts": "Proxy Hosts",
|
||||
"proxy-hosts.count": "{count} {count, plural, one {Proxy Host} other {Proxy Hosts}}",
|
||||
"public": "Öffentlich",
|
||||
"redirection-host": "Redirection Host",
|
||||
"redirection-host.forward-domain": "Forward Domain",
|
||||
"redirection-host.forward-http-code": "HTTP Code",
|
||||
"redirection-hosts": "Redirection Hosts",
|
||||
"redirection-hosts.count": "{count} {count, plural, one {Redirection Host} other {Redirection Hosts}}",
|
||||
"role.admin": "Administrator",
|
||||
"role.standard-user": "Standard User",
|
||||
"save": "Speichern",
|
||||
"setting": "Einstellung",
|
||||
"settings": "Einstellungen",
|
||||
"settings.default-site": "Standard Seite",
|
||||
"settings.default-site.404": "404 Page",
|
||||
"settings.default-site.444": "No Response (444)",
|
||||
"settings.default-site.congratulations": "Willkommensseite",
|
||||
"settings.default-site.description": "Was angezeigt wird, wenn der Nginx eine unbekannte Webseitenanfrage bekommt",
|
||||
"settings.default-site.html": "Benutzerdefinierte HTML",
|
||||
"settings.default-site.html.placeholder": "<!-- Geben Sie hier Ihren benutzerdefinierten HTML-Inhalt ein. -->",
|
||||
"settings.default-site.redirect": "Weiterleitung",
|
||||
"setup.preamble": "Beginnen Sie mit der Erstellung Ihres Administratorkontos.",
|
||||
"setup.title": "Willkommen!",
|
||||
"sign-in": "Login",
|
||||
"ssl-certificate": "SSL Zertifikate",
|
||||
"stream": "Stream",
|
||||
"stream.forward-host": "Forward Host",
|
||||
"stream.incoming-port": "Incoming Port",
|
||||
"streams": "Streams",
|
||||
"streams.count": "{count} {count, plural, one {Stream} other {Streams}}",
|
||||
"streams.tcp": "TCP",
|
||||
"streams.udp": "UDP",
|
||||
"test": "Test",
|
||||
"user": "User",
|
||||
"user.change-password": "Passwort ändern",
|
||||
"user.confirm-password": "Passwort wiederholen",
|
||||
"user.current-password": "Aktuelles Passwort",
|
||||
"user.edit-profile": "Profil bearbeiten",
|
||||
"user.full-name": "Name",
|
||||
"user.login-as": "Einloggen als {name}",
|
||||
"user.logout": "Ausloggen",
|
||||
"user.new-password": "Neues Password",
|
||||
"user.nickname": "Nickname",
|
||||
"user.set-password": "Passwort setzen",
|
||||
"user.set-permissions": "Berechtigungen für {name} setzen",
|
||||
"user.switch-dark": "Zum Dark Mode wechseln",
|
||||
"user.switch-light": "Zum Light Mode wechslen",
|
||||
"username": "Benutzername",
|
||||
"users": "Benutzer"
|
||||
}
|
||||
@@ -32,6 +32,7 @@
|
||||
"certificate.none.subtitle.for-http": "This host will not use HTTPS",
|
||||
"certificate.none.title": "None",
|
||||
"certificate.not-in-use": "Not Used",
|
||||
"certificate.renew": "Renew Certificate",
|
||||
"certificates": "Certificates",
|
||||
"certificates.custom": "Custom Certificate",
|
||||
"certificates.custom.warning": "Key files protected with a passphrase are not supported.",
|
||||
@@ -61,7 +62,7 @@
|
||||
"column.email": "Email",
|
||||
"column.event": "Event",
|
||||
"column.expires": "Expires",
|
||||
"column.http-code": "Access",
|
||||
"column.http-code": "HTTP Code",
|
||||
"column.incoming-port": "Incoming Port",
|
||||
"column.name": "Name",
|
||||
"column.protocol": "Protocol",
|
||||
@@ -168,6 +169,7 @@
|
||||
"public": "Public",
|
||||
"redirection-host": "Redirection Host",
|
||||
"redirection-host.forward-domain": "Forward Domain",
|
||||
"redirection-host.forward-http-code": "HTTP Code",
|
||||
"redirection-hosts": "Redirection Hosts",
|
||||
"redirection-hosts.count": "{count} {count, plural, one {Redirection Host} other {Redirection Hosts}}",
|
||||
"role.admin": "Administrator",
|
||||
|
||||
216
frontend/src/locale/lang/es.json
Normal file
216
frontend/src/locale/lang/es.json
Normal file
@@ -0,0 +1,216 @@
|
||||
{
|
||||
"access-list": "Lista de Acceso",
|
||||
"access-list.access-count": "{count} {count, plural, one {Regla} other {Reglas}}",
|
||||
"access-list.auth-count": "{count} {count, plural, one {Usuario} other {Usuarios}}",
|
||||
"access-list.help-rules-last": "Cuando exista al menos 1 regla, esta regla de denegar todo se añadirá al final",
|
||||
"access-list.help.rules-order": "Ten en cuenta que las directivas de permitir y denegar se aplicarán en el orden en que estén definidas.",
|
||||
"access-list.pass-auth": "Pasar Autenticación al Upstream",
|
||||
"access-list.public": "Accesible Públicamente",
|
||||
"access-list.public.subtitle": "No se requiere autenticación básica",
|
||||
"access-list.satisfy-any": "Satisfacer Cualquiera",
|
||||
"access-list.subtitle": "{users} {users, plural, one {Usuario} other {Usuarios}}, {rules} {rules, plural, one {Regla} other {Reglas}} - Creado: {date}",
|
||||
"access-lists": "Listas de Acceso",
|
||||
"action.add": "Añadir",
|
||||
"action.add-location": "Añadir Ubicación",
|
||||
"action.close": "Cerrar",
|
||||
"action.delete": "Eliminar",
|
||||
"action.disable": "Deshabilitar",
|
||||
"action.download": "Descargar",
|
||||
"action.edit": "Editar",
|
||||
"action.enable": "Habilitar",
|
||||
"action.permissions": "Permisos",
|
||||
"action.renew": "Renovar",
|
||||
"action.view-details": "Ver Detalles",
|
||||
"auditlogs": "Registros de Auditoría",
|
||||
"cancel": "Cancelar",
|
||||
"certificate": "Certificado",
|
||||
"certificate.custom-certificate": "Certificado",
|
||||
"certificate.custom-certificate-key": "Clave del Certificado",
|
||||
"certificate.custom-intermediate": "Certificado Intermedio",
|
||||
"certificate.in-use": "En Uso",
|
||||
"certificate.none.subtitle": "Sin certificado asignado",
|
||||
"certificate.none.subtitle.for-http": "Este host no usará HTTPS",
|
||||
"certificate.none.title": "Ninguno",
|
||||
"certificate.not-in-use": "Sin Usar",
|
||||
"certificate.renew": "Renovar Certificado",
|
||||
"certificates": "Certificados",
|
||||
"certificates.custom": "Certificado Personalizado",
|
||||
"certificates.custom.warning": "No se admiten archivos de claves protegidos con contraseña.",
|
||||
"certificates.dns.credentials": "Contenido del Archivo de Credenciales",
|
||||
"certificates.dns.credentials-note": "Este plugin requiere un archivo de configuración que contenga un token de API u otras credenciales para tu proveedor",
|
||||
"certificates.dns.credentials-warning": "¡Estos datos se almacenarán como texto plano en la base de datos y en un archivo!",
|
||||
"certificates.dns.propagation-seconds": "Segundos de Propagación",
|
||||
"certificates.dns.propagation-seconds-note": "Dejar vacío para usar el valor predeterminado del plugin. Número de segundos a esperar para la propagación DNS.",
|
||||
"certificates.dns.provider": "Proveedor DNS",
|
||||
"certificates.dns.warning": "Esta sección requiere algunos conocimientos sobre Certbot y sus plugins DNS. Consulta la documentación de los plugins respectivos.",
|
||||
"certificates.http.reachability-404": "Se encontró un servidor en este dominio pero no parece ser Nginx Proxy Manager. Asegúrate de que tu dominio apunte a la IP donde se está ejecutando tu instancia de NPM.",
|
||||
"certificates.http.reachability-failed-to-check": "No se pudo verificar la accesibilidad debido a un error de comunicación con site24x7.com.",
|
||||
"certificates.http.reachability-not-resolved": "No hay ningún servidor disponible en este dominio. Asegúrate de que tu dominio existe y apunta a la IP donde se está ejecutando tu instancia de NPM y, si es necesario, que el puerto 80 esté redirigido en tu router.",
|
||||
"certificates.http.reachability-ok": "Tu servidor es accesible y debería ser posible crear certificados.",
|
||||
"certificates.http.reachability-other": "Se encontró un servidor en este dominio pero devolvió un código de estado inesperado {code}. ¿Es el servidor NPM? Asegúrate de que tu dominio apunte a la IP donde se está ejecutando tu instancia de NPM.",
|
||||
"certificates.http.reachability-wrong-data": "Se encontró un servidor en este dominio pero devolvió datos inesperados. ¿Es el servidor NPM? Asegúrate de que tu dominio apunte a la IP donde se está ejecutando tu instancia de NPM.",
|
||||
"certificates.http.test-results": "Resultados de la Prueba",
|
||||
"certificates.http.warning": "Estos dominios ya deben estar configurados para apuntar a esta instalación.",
|
||||
"certificates.request.subtitle": "con Let's Encrypt",
|
||||
"certificates.request.title": "Solicitar un nuevo Certificado",
|
||||
"column.access": "Acceso",
|
||||
"column.authorization": "Autorización",
|
||||
"column.authorizations": "Autorizaciones",
|
||||
"column.custom-locations": "Ubicaciones Personalizadas",
|
||||
"column.destination": "Destino",
|
||||
"column.details": "Detalles",
|
||||
"column.email": "Correo Electrónico",
|
||||
"column.event": "Evento",
|
||||
"column.expires": "Expira",
|
||||
"column.http-code": "Código HTTP",
|
||||
"column.incoming-port": "Puerto de Entrada",
|
||||
"column.name": "Nombre",
|
||||
"column.protocol": "Protocolo",
|
||||
"column.provider": "Proveedor",
|
||||
"column.roles": "Roles",
|
||||
"column.rules": "Reglas",
|
||||
"column.satisfy": "Satisfacer",
|
||||
"column.satisfy-all": "Todo",
|
||||
"column.satisfy-any": "Cualquiera",
|
||||
"column.scheme": "Esquema",
|
||||
"column.source": "Origen",
|
||||
"column.ssl": "SSL",
|
||||
"column.status": "Estado",
|
||||
"created-on": "Creado: {date}",
|
||||
"dashboard": "Panel de Control",
|
||||
"dead-host": "Host 404",
|
||||
"dead-hosts": "Hosts 404",
|
||||
"dead-hosts.count": "{count} {count, plural, one {Host 404} other {Hosts 404}}",
|
||||
"disabled": "Deshabilitado",
|
||||
"domain-names": "Nombres de Dominio",
|
||||
"domain-names.max": "{count} nombres de dominio como máximo",
|
||||
"domain-names.placeholder": "Comienza a escribir para añadir dominio...",
|
||||
"domain-names.wildcards-not-permitted": "No se permiten comodines para este tipo",
|
||||
"domain-names.wildcards-not-supported": "No se admiten comodines para esta CA",
|
||||
"domains.force-ssl": "Forzar SSL",
|
||||
"domains.hsts-enabled": "HSTS Habilitado",
|
||||
"domains.hsts-subdomains": "HSTS en Subdominios",
|
||||
"domains.http2-support": "Soporte HTTP/2",
|
||||
"domains.use-dns": "Usar Desafío DNS",
|
||||
"email-address": "Dirección de correo electrónico",
|
||||
"empty-search": "No se encontraron resultados",
|
||||
"empty-subtitle": "¿Por qué no creas uno?",
|
||||
"enabled": "Habilitado",
|
||||
"error.access.at-least-one": "Se requiere al menos una Autorización o una Regla de Acceso",
|
||||
"error.access.duplicate-usernames": "Los nombres de usuario de autorización deben ser únicos",
|
||||
"error.invalid-auth": "Correo electrónico o contraseña no válidos",
|
||||
"error.invalid-domain": "Dominio no válido: {domain}",
|
||||
"error.invalid-email": "Dirección de correo electrónico no válida",
|
||||
"error.max-character-length": "La longitud máxima es {max} caracter{max, plural, one {} other {es}}",
|
||||
"error.max-domains": "Demasiados dominios, el máximo es {max}",
|
||||
"error.maximum": "El máximo es {max}",
|
||||
"error.min-character-length": "La longitud mínima es {min} caracter{min, plural, one {} other {es}}",
|
||||
"error.minimum": "El mínimo es {min}",
|
||||
"error.passwords-must-match": "Las contraseñas deben coincidir",
|
||||
"error.required": "Este campo es obligatorio",
|
||||
"expires.on": "Expira: {date}",
|
||||
"footer.github-fork": "Bifúrcame en Github",
|
||||
"host.flags.block-exploits": "Bloquear Exploits Comunes",
|
||||
"host.flags.cache-assets": "Cachear Recursos",
|
||||
"host.flags.preserve-path": "Preservar Ruta",
|
||||
"host.flags.protocols": "Protocolos",
|
||||
"host.flags.websockets-upgrade": "Soporte de Websockets",
|
||||
"host.forward-port": "Puerto de Reenvío",
|
||||
"host.forward-scheme": "Esquema",
|
||||
"hosts": "Hosts",
|
||||
"http-only": "Solo HTTP",
|
||||
"lets-encrypt": "Let's Encrypt",
|
||||
"lets-encrypt-via-dns": "Let's Encrypt vía DNS",
|
||||
"lets-encrypt-via-http": "Let's Encrypt vía HTTP",
|
||||
"loading": "Cargando…",
|
||||
"login.title": "Inicia sesión en tu cuenta",
|
||||
"nginx-config.label": "Configuración Personalizada de Nginx",
|
||||
"nginx-config.placeholder": "# ¡Introduce aquí tu configuración personalizada de Nginx bajo tu propio riesgo!",
|
||||
"no-permission-error": "No tienes acceso para ver esto.",
|
||||
"notfound.action": "Llévame al inicio",
|
||||
"notfound.content": "Lo sentimos, pero la página que buscas no fue encontrada",
|
||||
"notfound.title": "Ups… Has encontrado una página de error",
|
||||
"notification.error": "Error",
|
||||
"notification.object-deleted": "{object} ha sido eliminado",
|
||||
"notification.object-disabled": "{object} ha sido deshabilitado",
|
||||
"notification.object-enabled": "{object} ha sido habilitado",
|
||||
"notification.object-renewed": "{object} ha sido renovado",
|
||||
"notification.object-saved": "{object} ha sido guardado",
|
||||
"notification.success": "Éxito",
|
||||
"object.actions-title": "{object} #{id}",
|
||||
"object.add": "Añadir {object}",
|
||||
"object.delete": "Eliminar {object}",
|
||||
"object.delete.content": "¿Estás seguro de que quieres eliminar este {object}?",
|
||||
"object.edit": "Editar {object}",
|
||||
"object.empty": "No hay {objects}",
|
||||
"object.event.created": "{object} Creado",
|
||||
"object.event.deleted": "{object} Eliminado",
|
||||
"object.event.disabled": "{object} Deshabilitado",
|
||||
"object.event.enabled": "{object} Habilitado",
|
||||
"object.event.renewed": "{object} Renovado",
|
||||
"object.event.updated": "{object} Actualizado",
|
||||
"offline": "Desconectado",
|
||||
"online": "Conectado",
|
||||
"options": "Opciones",
|
||||
"password": "Contraseña",
|
||||
"password.generate": "Generar contraseña aleatoria",
|
||||
"password.hide": "Ocultar Contraseña",
|
||||
"password.show": "Mostrar Contraseña",
|
||||
"permissions.hidden": "Oculto",
|
||||
"permissions.manage": "Gestionar",
|
||||
"permissions.view": "Solo Ver",
|
||||
"permissions.visibility.all": "Todos los Elementos",
|
||||
"permissions.visibility.title": "Visibilidad de Elementos",
|
||||
"permissions.visibility.user": "Solo Elementos Creados",
|
||||
"proxy-host": "Host Proxy",
|
||||
"proxy-host.forward-host": "Nombre de Host / IP de Reenvío",
|
||||
"proxy-hosts": "Hosts Proxy",
|
||||
"proxy-hosts.count": "{count} {count, plural, one {Host Proxy} other {Hosts Proxy}}",
|
||||
"public": "Público",
|
||||
"redirection-host": "Host de Redirección",
|
||||
"redirection-host.forward-domain": "Dominio de Reenvío",
|
||||
"redirection-host.forward-http-code": "Código HTTP",
|
||||
"redirection-hosts": "Hosts de Redirección",
|
||||
"redirection-hosts.count": "{count} {count, plural, one {Host de Redirección} other {Hosts de Redirección}}",
|
||||
"role.admin": "Administrador",
|
||||
"role.standard-user": "Usuario Estándar",
|
||||
"save": "Guardar",
|
||||
"setting": "Configuración",
|
||||
"settings": "Configuración",
|
||||
"settings.default-site": "Sitio Predeterminado",
|
||||
"settings.default-site.404": "Página 404",
|
||||
"settings.default-site.444": "Sin Respuesta (444)",
|
||||
"settings.default-site.congratulations": "Página de Felicitaciones",
|
||||
"settings.default-site.description": "Qué mostrar cuando Nginx recibe un Host desconocido",
|
||||
"settings.default-site.html": "HTML Personalizado",
|
||||
"settings.default-site.html.placeholder": "<!-- Introduce aquí tu contenido HTML personalizado -->",
|
||||
"settings.default-site.redirect": "Redirigir",
|
||||
"setup.preamble": "Comienza creando tu cuenta de administrador.",
|
||||
"setup.title": "¡Bienvenido!",
|
||||
"sign-in": "Iniciar Sesión",
|
||||
"ssl-certificate": "Certificado SSL",
|
||||
"stream": "Stream",
|
||||
"stream.forward-host": "Host de Reenvío",
|
||||
"stream.incoming-port": "Puerto de Entrada",
|
||||
"streams": "Streams",
|
||||
"streams.count": "{count} {count, plural, one {Stream} other {Streams}}",
|
||||
"streams.tcp": "TCP",
|
||||
"streams.udp": "UDP",
|
||||
"test": "Probar",
|
||||
"user": "Usuario",
|
||||
"user.change-password": "Cambiar Contraseña",
|
||||
"user.confirm-password": "Confirmar Contraseña",
|
||||
"user.current-password": "Contraseña Actual",
|
||||
"user.edit-profile": "Editar Perfil",
|
||||
"user.full-name": "Nombre Completo",
|
||||
"user.login-as": "Iniciar sesión como {name}",
|
||||
"user.logout": "Cerrar Sesión",
|
||||
"user.new-password": "Nueva Contraseña",
|
||||
"user.nickname": "Apodo",
|
||||
"user.set-password": "Establecer Contraseña",
|
||||
"user.set-permissions": "Establecer Permisos para {name}",
|
||||
"user.switch-dark": "Cambiar a modo Oscuro",
|
||||
"user.switch-light": "Cambiar a modo Claro",
|
||||
"username": "Nombre de Usuario",
|
||||
"users": "Usuarios"
|
||||
}
|
||||
215
frontend/src/locale/lang/ja.json
Normal file
215
frontend/src/locale/lang/ja.json
Normal file
@@ -0,0 +1,215 @@
|
||||
{
|
||||
"access-list": "アクセスリスト",
|
||||
"access-list.access-count": "{count} ルール",
|
||||
"access-list.auth-count": "{count} ユーザー",
|
||||
"access-list.help-rules-last": "少なくとも 1 つのルールが存在する場合、 他のすべてを拒否するルールが最後に追加されます",
|
||||
"access-list.help.rules-order": "許可コマンドと拒否コマンドは定義された順番で適用されます",
|
||||
"access-list.pass-auth": "認証情報をアップストリームに送信する",
|
||||
"access-list.public": "公開されたアクセス",
|
||||
"access-list.public.subtitle": "ベーシック認証を使用しません",
|
||||
"access-list.satisfy-any": "いずれかを満たす",
|
||||
"access-list.subtitle": "{users} ユーザー, {rules} ルール - 作成日時: {date}",
|
||||
"access-lists": "アクセスリスト",
|
||||
"action.add": "追加",
|
||||
"action.add-location": "場所を追加",
|
||||
"action.close": "閉じる",
|
||||
"action.delete": "削除",
|
||||
"action.disable": "無効化",
|
||||
"action.download": "ダウンロード",
|
||||
"action.edit": "編集",
|
||||
"action.enable": "有効化",
|
||||
"action.permissions": "権限",
|
||||
"action.renew": "更新",
|
||||
"action.view-details": "詳細",
|
||||
"auditlogs": "監査ログ",
|
||||
"cancel": "キャンセル",
|
||||
"certificate": "証明書",
|
||||
"certificate.custom-certificate": "証明書",
|
||||
"certificate.custom-certificate-key": "証明書キー",
|
||||
"certificate.custom-intermediate": "中間証明書",
|
||||
"certificate.in-use": "使用中",
|
||||
"certificate.none.subtitle": "証明書が割り当てられていません",
|
||||
"certificate.none.subtitle.for-http": "このホストはHTTPSを使用しません",
|
||||
"certificate.none.title": "無し",
|
||||
"certificate.not-in-use": "未使用",
|
||||
"certificate.renew": "証明書を更新",
|
||||
"certificates": "証明書",
|
||||
"certificates.custom": "カスタム証明書",
|
||||
"certificates.custom.warning": "パスワードによって保護されたキーファイルはサポートされていません",
|
||||
"certificates.dns.credentials": "資格情報ファイルの内容",
|
||||
"certificates.dns.credentials-note": "このプラグインはプロバイダーのAPIキーか認証情報を含む設定ファイルが必要です",
|
||||
"certificates.dns.credentials-warning": "このデータはファイルとデータベースにプレーンテキストとして保存されます",
|
||||
"certificates.dns.propagation-seconds": "DNS伝播時間(秒)",
|
||||
"certificates.dns.propagation-seconds-note": "DNSの伝搬時間を秒で指定します。空にするとデフォルトの値を使用します。",
|
||||
"certificates.dns.provider": "DNSプロバイダー",
|
||||
"certificates.dns.warning": "このセクションはCertbotとそのDNSプラグインの知識が必要です。各プラグインのドキュメントを参照してください。",
|
||||
"certificates.http.reachability-404": "このドメインはNginx Proxy Managerではないサーバーを指しているようです。ドメインがこのNPMインスタンスを指していることを確認してください。",
|
||||
"certificates.http.reachability-failed-to-check": "site24x7.comへの接続でエラーが発生し、到達性チェックに失敗しました",
|
||||
"certificates.http.reachability-not-resolved": "このドメインには利用可能なサーバーがありません。ドメインが存在し、NPMインスタンスのIPアドレスを指していること、必要に応じてルーターでポート80が転送されていることを確認してください。",
|
||||
"certificates.http.reachability-ok": "サーバーへ到達可能であり、証明書の作成が可能です。",
|
||||
"certificates.http.reachability-other": "このドメインでサーバーが見つかりましたが予期しないステータスコード {code} を返しました. NPMサーバーが動いていますか? ドメインがこのNPMインスタンスを指していることを確認してください。",
|
||||
"certificates.http.reachability-wrong-data": "このドメインでサーバーが見つかりましたが予期しないデータを返しました. NPMサーバーが動いていますか? ドメインがこのNPMインスタンスを指していることを確認してください。",
|
||||
"certificates.http.test-results": "テスト結果",
|
||||
"certificates.http.warning": "これらのドメインは、すでにこのインストール先を指すように設定されている必要がありますあ.",
|
||||
"certificates.request.subtitle": "Let's Encryptを使用する",
|
||||
"certificates.request.title": "新しい証明書を作成",
|
||||
"column.access": "アクセス",
|
||||
"column.authorization": "認証",
|
||||
"column.authorizations": "認証",
|
||||
"column.custom-locations": "カスタムロケーション",
|
||||
"column.destination": "宛先",
|
||||
"column.details": "詳細",
|
||||
"column.email": "Email",
|
||||
"column.event": "イベント",
|
||||
"column.expires": "期限切れ",
|
||||
"column.http-code": "アクセス",
|
||||
"column.incoming-port": "受信ポート",
|
||||
"column.name": "名前",
|
||||
"column.protocol": "プロトコル",
|
||||
"column.provider": "プロバイダー",
|
||||
"column.roles": "Roles",
|
||||
"column.rules": "ルール",
|
||||
"column.satisfy": "Satisfy",
|
||||
"column.satisfy-all": "すべて",
|
||||
"column.satisfy-any": "いずれか",
|
||||
"column.scheme": "スキーム",
|
||||
"column.source": "ソース",
|
||||
"column.ssl": "SSL",
|
||||
"column.status": "ステータス",
|
||||
"created-on": "作成日時: {date}",
|
||||
"dashboard": "ダッシュボード",
|
||||
"dead-host": "404 ホスト",
|
||||
"dead-hosts": "404 ホスト",
|
||||
"dead-hosts.count": "{count} 404 ホスト",
|
||||
"disabled": "無効化",
|
||||
"domain-names": "ドメイン名",
|
||||
"domain-names.max": "{count}のドメイン名が最大です",
|
||||
"domain-names.placeholder": "追加するドメインを入力...",
|
||||
"domain-names.wildcards-not-permitted": "ワイルドカードはこのタイプでは許可されていません",
|
||||
"domain-names.wildcards-not-supported": "ワイルドカードはこのCAではサポートされていません",
|
||||
"domains.force-ssl": "SSLを強制",
|
||||
"domains.hsts-enabled": "HSTSを有効化",
|
||||
"domains.hsts-subdomains": "HSTSサブドメイン",
|
||||
"domains.http2-support": "HTTP/2サポート",
|
||||
"domains.use-dns": "DNSチャレンジを使用",
|
||||
"email-address": "Emailアドレス",
|
||||
"empty-search": "見つかりませんでした",
|
||||
"empty-subtitle": "作ってみましょう",
|
||||
"enabled": "有効",
|
||||
"error.access.at-least-one": "少なくとも一つの認証またはアクセスルールが必要です",
|
||||
"error.access.duplicate-usernames": "認証のユーザー名は他と同じ名前は使用できません",
|
||||
"error.invalid-auth": "無効なemailまたはパスワード",
|
||||
"error.invalid-domain": "無効なドメイン: {domain}",
|
||||
"error.invalid-email": "無効なemailアドレス",
|
||||
"error.max-character-length": "文字数は長くとも{max}文字です",
|
||||
"error.max-domains": "ドメインが多すぎます, 最大値は{max}です",
|
||||
"error.maximum": "最大値は{max}です",
|
||||
"error.min-character-length": "文字数は少なくとも{min}文字です",
|
||||
"error.minimum": "最小値は{min}です",
|
||||
"error.passwords-must-match": "パスワードは一致する必要があります",
|
||||
"error.required": "必須項目です",
|
||||
"expires.on": "有効期限: {date}",
|
||||
"footer.github-fork": "Fork me on Github",
|
||||
"host.flags.block-exploits": "一般的なエクスプロイトをブロックする",
|
||||
"host.flags.cache-assets": "アセットをキャッシュする",
|
||||
"host.flags.preserve-path": "パスワードは一致する必要があります",
|
||||
"host.flags.protocols": "プロトコル",
|
||||
"host.flags.websockets-upgrade": "Websocketsサポート",
|
||||
"host.forward-port": "転送ポート",
|
||||
"host.forward-scheme": "スキーム",
|
||||
"hosts": "ホスト",
|
||||
"http-only": "HTTP Only",
|
||||
"lets-encrypt": "Let's Encrypt",
|
||||
"lets-encrypt-via-dns": "Let's Encrypt via DNS",
|
||||
"lets-encrypt-via-http": "Let's Encrypt via HTTP",
|
||||
"loading": "Loading…",
|
||||
"login.title": "アカウントにログイン",
|
||||
"nginx-config.label": "カスタムNginx設定",
|
||||
"nginx-config.placeholder": "# Enter your custom Nginx configuration here at your own risk!",
|
||||
"no-permission-error": "これを表示する権限がありません",
|
||||
"notfound.action": "ホームに戻る",
|
||||
"notfound.content": "申し訳ありませんが探しているページは見つかりませんでした",
|
||||
"notfound.title": "おっと... エラーページにたどり着いてしまったようです",
|
||||
"notification.error": "エラー",
|
||||
"notification.object-deleted": "{object}は削除されました",
|
||||
"notification.object-disabled": "{object}は無効化されました",
|
||||
"notification.object-enabled": "{object}は有効化されました",
|
||||
"notification.object-renewed": "{object}は再作成されました",
|
||||
"notification.object-saved": "{object}は保存されました",
|
||||
"notification.success": "成功",
|
||||
"object.actions-title": "{object} #{id}",
|
||||
"object.add": "{object}を追加",
|
||||
"object.delete": "{object}を削除",
|
||||
"object.delete.content": "本当に{object}を削除しますか?",
|
||||
"object.edit": "{object}を編集",
|
||||
"object.empty": "{objects}はありません",
|
||||
"object.event.created": "{object}を作成済み",
|
||||
"object.event.deleted": "{object}を削除済み",
|
||||
"object.event.disabled": "{object}を無効化済み",
|
||||
"object.event.enabled": "{object}を有効化済み",
|
||||
"object.event.renewed": "{object}を再作成済み",
|
||||
"object.event.updated": "{object}を更新済み",
|
||||
"offline": "Offline",
|
||||
"online": "Online",
|
||||
"options": "Options",
|
||||
"password": "パスワード",
|
||||
"password.generate": "ランダムなパスワードを生成",
|
||||
"password.hide": "パスワードを隠す",
|
||||
"password.show": "パスワードを表示する",
|
||||
"permissions.hidden": "非公開",
|
||||
"permissions.manage": "管理",
|
||||
"permissions.view": "表示のみ",
|
||||
"permissions.visibility.all": "すべて",
|
||||
"permissions.visibility.title": "可視性",
|
||||
"permissions.visibility.user": "作成したもののみ",
|
||||
"proxy-host": "プロキシホスト",
|
||||
"proxy-host.forward-host": "転送ホスト名/IP",
|
||||
"proxy-hosts": "プロキシホスト",
|
||||
"proxy-hosts.count": "{count} プロキシホスト",
|
||||
"public": "Public",
|
||||
"redirection-host": "リダイレクトホスト",
|
||||
"redirection-host.forward-domain": "転送ホスト",
|
||||
"redirection-hosts": "リダイレクトホスト",
|
||||
"redirection-hosts.count": "{count} リダイレクトホスト",
|
||||
"role.admin": "管理者",
|
||||
"role.standard-user": "一般ユーザー",
|
||||
"save": "保存",
|
||||
"setting": "設定",
|
||||
"settings": "設定",
|
||||
"settings.default-site": "デフォルトサイト",
|
||||
"settings.default-site.404": "404ページ",
|
||||
"settings.default-site.444": "返答しない (444)",
|
||||
"settings.default-site.congratulations": "設定ページ",
|
||||
"settings.default-site.description": "不明なホストを要求されたときにNginxが何を返すかを設定します",
|
||||
"settings.default-site.html": "カスタムHTML",
|
||||
"settings.default-site.html.placeholder": "<!-- Enter your custom HTML content here -->",
|
||||
"settings.default-site.redirect": "リダイレクト",
|
||||
"setup.preamble": "管理者アカウントを作成して始めましょう",
|
||||
"setup.title": "ようこそ!",
|
||||
"sign-in": "サインイン",
|
||||
"ssl-certificate": "SSL証明書",
|
||||
"stream": "ストリーム",
|
||||
"stream.forward-host": "転送ポート",
|
||||
"stream.incoming-port": "受信ポート",
|
||||
"streams": "ストリーム",
|
||||
"streams.count": "{count} ストリーム",
|
||||
"streams.tcp": "TCP",
|
||||
"streams.udp": "UDP",
|
||||
"test": "テスト",
|
||||
"user": "ユーザー",
|
||||
"user.change-password": "変更するパスワード",
|
||||
"user.confirm-password": "変更するパスワードを確認",
|
||||
"user.current-password": "現在のパスワード",
|
||||
"user.edit-profile": "プロフィールを編集",
|
||||
"user.full-name": "フルネーム",
|
||||
"user.login-as": "{name}としてサインイン",
|
||||
"user.logout": "ログアウト",
|
||||
"user.new-password": "新しいパスワード",
|
||||
"user.nickname": "ニックネーム",
|
||||
"user.set-password": "パスワードを設定",
|
||||
"user.set-permissions": "{name}に権限を設定",
|
||||
"user.switch-dark": "ダークモードに変更",
|
||||
"user.switch-light": "ライトモードに変更",
|
||||
"username": "ユーザー名",
|
||||
"users": "ユーザー"
|
||||
}
|
||||
@@ -1,3 +1,10 @@
|
||||
{
|
||||
"locale-en-US": "English"
|
||||
"locale-de-DE": "German",
|
||||
"locale-en-US": "English",
|
||||
"locale-es-ES": "Español",
|
||||
"locale-ja-JP": "日本語",
|
||||
"locale-pl-PL": "Polski",
|
||||
"locale-ru-RU": "Русский",
|
||||
"locale-sk-SK": "Slovak",
|
||||
"locale-zh-CN": "中文"
|
||||
}
|
||||
216
frontend/src/locale/lang/pl.json
Executable file
216
frontend/src/locale/lang/pl.json
Executable file
@@ -0,0 +1,216 @@
|
||||
{
|
||||
"access-list": "Lista dostępu",
|
||||
"access-list.access-count": "{count} {count, plural, one {Reguła} few {Reguły} other {Reguł}}",
|
||||
"access-list.auth-count": "{count} {count, plural, one {Użytkownik} few {Użytkowników} other {Użytkowników}}",
|
||||
"access-list.help-rules-last": "Gdy istnieje co najmniej 1 reguła, ta reguła blokująca wszystko zostanie dodana na końcu",
|
||||
"access-list.help.rules-order": "Należy pamiętać, że dyrektywy zezwolenia i odmowy będą stosowane w kolejności, w jakiej zostały zdefiniowane.",
|
||||
"access-list.pass-auth": "Przekaż uwierzytelnienie do serwera docelowego",
|
||||
"access-list.public": "Publicznie dostępne",
|
||||
"access-list.public.subtitle": "Nie wymaga uwierzytelnienia podstawowego",
|
||||
"access-list.satisfy-any": "Spełnij dowolny warunek",
|
||||
"access-list.subtitle": "{users} {users, plural, one {Użytkownik} few {Użytkowników} other {Użytkowników}}, {rules} {rules, plural, one {Reguła} few {Reguły} other {Reguł}} - Utworzono: {date}",
|
||||
"access-lists": "Listy dostępu",
|
||||
"action.add": "Dodaj",
|
||||
"action.add-location": "Dodaj lokalizację",
|
||||
"action.close": "Zamknij",
|
||||
"action.delete": "Usuń",
|
||||
"action.disable": "Wyłącz",
|
||||
"action.download": "Pobierz",
|
||||
"action.edit": "Edytuj",
|
||||
"action.enable": "Włącz",
|
||||
"action.permissions": "Uprawnienia",
|
||||
"action.renew": "Odnów",
|
||||
"action.view-details": "Pokaż szczegóły",
|
||||
"auditlogs": "Logi audytu",
|
||||
"cancel": "Anuluj",
|
||||
"certificate": "Certyfikat",
|
||||
"certificate.custom-certificate": "Certyfikat",
|
||||
"certificate.custom-certificate-key": "Klucz certyfikatu",
|
||||
"certificate.custom-intermediate": "Certyfikat pośredni",
|
||||
"certificate.in-use": "W użyciu",
|
||||
"certificate.none.subtitle": "Nie przypisano certyfikatu",
|
||||
"certificate.none.subtitle.for-http": "Ten host nie będzie używał HTTPS",
|
||||
"certificate.none.title": "Brak",
|
||||
"certificate.not-in-use": "Nie używany",
|
||||
"certificate.renew": "Odnów certyfikat",
|
||||
"certificates": "Certyfikaty",
|
||||
"certificates.custom": "Certyfikat własny",
|
||||
"certificates.custom.warning": "Pliki kluczy chronione hasłem nie są obsługiwane.",
|
||||
"certificates.dns.credentials": "Zawartość pliku z poświadczeniami",
|
||||
"certificates.dns.credentials-note": "Ta wtyczka wymaga pliku konfiguracyjnego zawierającego token API lub inne poświadczenia dla twojego dostawcy",
|
||||
"certificates.dns.credentials-warning": "Te dane zostaną zapisane jako zwykły tekst w bazie danych i pliku!",
|
||||
"certificates.dns.propagation-seconds": "Sekundy propagacji",
|
||||
"certificates.dns.propagation-seconds-note": "Pozostaw puste, aby użyć domyślnej wartości wtyczki. Liczba sekund oczekiwania na propagację DNS.",
|
||||
"certificates.dns.provider": "Dostawca DNS",
|
||||
"certificates.dns.warning": "Ta sekcja wymaga pewnej wiedzy na temat Certbot i jego wtyczek DNS. Zapoznaj się z dokumentacją odpowiednich wtyczek.",
|
||||
"certificates.http.reachability-404": "Znaleziono serwer pod tą domeną, ale nie wygląda na to, że jest to Nginx Proxy Manager. Upewnij się, że twoja domena wskazuje na adres IP, gdzie działa twoja instancja NPM.",
|
||||
"certificates.http.reachability-failed-to-check": "Nie udało się sprawdzić dostępności z powodu błędu komunikacji z site24x7.com.",
|
||||
"certificates.http.reachability-not-resolved": "Brak dostępnego serwera pod tą domeną. Upewnij się, że twoja domena istnieje i wskazuje na adres IP, gdzie działa twoja instancja NPM, oraz w razie potrzeby, że port 80 jest przekierowany w routerze lub owarty w firewall-u.",
|
||||
"certificates.http.reachability-ok": "Twój serwer jest dostępny i tworzenie certyfikatów powinno być możliwe.",
|
||||
"certificates.http.reachability-other": "Znaleziono serwer pod tą domeną, ale zwrócił nieoczekiwany kod statusu {code}. Czy to serwer NPM? Upewnij się, że twoja domena wskazuje na adres IP, gdzie działa twoja instancja NPM.",
|
||||
"certificates.http.reachability-wrong-data": "Znaleziono serwer pod tą domeną, ale zwrócił nieoczekiwane dane. Czy to serwer NPM? Upewnij się, że twoja domena wskazuje na adres IP, gdzie działa twoja instancja NPM.",
|
||||
"certificates.http.test-results": "Wyniki testu",
|
||||
"certificates.http.warning": "Te domeny muszą być już skonfigurowane tak, aby wskazywały na ten serwer www",
|
||||
"certificates.request.subtitle": "z Let's Encrypt",
|
||||
"certificates.request.title": "Zamów nowy certyfikat",
|
||||
"column.access": "Dostęp",
|
||||
"column.authorization": "Autoryzacja",
|
||||
"column.authorizations": "Autoryzacje",
|
||||
"column.custom-locations": "Własne lokalizacje",
|
||||
"column.destination": "Cel",
|
||||
"column.details": "Szczegóły",
|
||||
"column.email": "Email",
|
||||
"column.event": "Zdarzenie",
|
||||
"column.expires": "Wygasa",
|
||||
"column.http-code": "Kod HTTP",
|
||||
"column.incoming-port": "Port przychodzący",
|
||||
"column.name": "Nazwa",
|
||||
"column.protocol": "Protokół",
|
||||
"column.provider": "Dostawca",
|
||||
"column.roles": "Role",
|
||||
"column.rules": "Reguły",
|
||||
"column.satisfy": "Spełnij",
|
||||
"column.satisfy-all": "Wszystkie",
|
||||
"column.satisfy-any": "Dowolny",
|
||||
"column.scheme": "Schemat",
|
||||
"column.source": "Źródło",
|
||||
"column.ssl": "SSL",
|
||||
"column.status": "Status",
|
||||
"created-on": "Utworzono: {date}",
|
||||
"dashboard": "Panel",
|
||||
"dead-host": "Host 404",
|
||||
"dead-hosts": "Hosty 404",
|
||||
"dead-hosts.count": "{count} {count, plural, one {Host 404} few {Hosty 404} other {Hostów 404}}",
|
||||
"disabled": "Wyłączone",
|
||||
"domain-names": "Nazwy domen",
|
||||
"domain-names.max": "Maksymalnie {count} nazw domen",
|
||||
"domain-names.placeholder": "Zacznij pisać, aby dodać domenę...",
|
||||
"domain-names.wildcards-not-permitted": "Symbole wieloznaczne nie są dozwolone dla tego typu",
|
||||
"domain-names.wildcards-not-supported": "Symbole wieloznaczne nie są obsługiwane dla tego CA",
|
||||
"domains.force-ssl": "Wymuś SSL",
|
||||
"domains.hsts-enabled": "HSTS włączone",
|
||||
"domains.hsts-subdomains": "HSTS dla subdomen",
|
||||
"domains.http2-support": "Obsługa HTTP/2",
|
||||
"domains.use-dns": "Użyj wyzwania DNS",
|
||||
"email-address": "Adres email",
|
||||
"empty-search": "Nie znaleziono wyników",
|
||||
"empty-subtitle": "Może utworzysz nowy?",
|
||||
"enabled": "Włączone",
|
||||
"error.access.at-least-one": "Wymagana jest co najmniej jedna autoryzacja lub jedna reguła dostępu",
|
||||
"error.access.duplicate-usernames": "Nazwy użytkowników autoryzacji muszą być unikalne",
|
||||
"error.invalid-auth": "Nieprawidłowy email lub hasło",
|
||||
"error.invalid-domain": "Nieprawidłowa domena: {domain}",
|
||||
"error.invalid-email": "Nieprawidłowy adres email",
|
||||
"error.max-character-length": "Maksymalna długość to {max} {max, plural, one {znak} few {znaki} other {znaków}}",
|
||||
"error.max-domains": "Zbyt wiele domen, maksimum to {max}",
|
||||
"error.maximum": "Maksimum to {max}",
|
||||
"error.min-character-length": "Minimalna długość to {min} {min, plural, one {znak} few {znaki} other {znaków}}",
|
||||
"error.minimum": "Minimum to {min}",
|
||||
"error.passwords-must-match": "Hasła muszą się zgadzać",
|
||||
"error.required": "To pole jest wymagane",
|
||||
"expires.on": "Wygasa: {date}",
|
||||
"footer.github-fork": "Forkuj mnie na Github",
|
||||
"host.flags.block-exploits": "Blokuj typowe exploity",
|
||||
"host.flags.cache-assets": "Buforuj zasoby",
|
||||
"host.flags.preserve-path": "Zachowaj ścieżkę",
|
||||
"host.flags.protocols": "Protokoły",
|
||||
"host.flags.websockets-upgrade": "Obsługa WebSockets",
|
||||
"host.forward-port": "Port przekierowania",
|
||||
"host.forward-scheme": "Schemat",
|
||||
"hosts": "Hosty",
|
||||
"http-only": "Tylko HTTP",
|
||||
"lets-encrypt": "Let's Encrypt",
|
||||
"lets-encrypt-via-dns": "Let's Encrypt przez DNS",
|
||||
"lets-encrypt-via-http": "Let's Encrypt przez HTTP",
|
||||
"loading": "Ładowanie…",
|
||||
"login.title": "Zaloguj się na swoje konto",
|
||||
"nginx-config.label": "Własna konfiguracja Nginx",
|
||||
"nginx-config.placeholder": "# Wprowadź tutaj własną konfigurację Nginx na własną odpowiedzialność!",
|
||||
"no-permission-error": "Nie masz uprawnień do wyświetlenia tego.",
|
||||
"notfound.action": "Zabierz mnie do strony głównej",
|
||||
"notfound.content": "Przepraszamy, ale strona, której szukasz, nie została znaleziona",
|
||||
"notfound.title": "Ups… Właśnie znalazłeś stronę błędu",
|
||||
"notification.error": "Błąd",
|
||||
"notification.object-deleted": "{object} został usunięty",
|
||||
"notification.object-disabled": "{object} został wyłączony",
|
||||
"notification.object-enabled": "{object} został włączony",
|
||||
"notification.object-renewed": "{object} został odnowiony",
|
||||
"notification.object-saved": "{object} został zapisany",
|
||||
"notification.success": "Sukces",
|
||||
"object.actions-title": "{object} #{id}",
|
||||
"object.add": "Dodaj {object}",
|
||||
"object.delete": "Usuń {object}",
|
||||
"object.delete.content": "Czy na pewno chcesz usunąć {object}?",
|
||||
"object.edit": "Edytuj {object}",
|
||||
"object.empty": "Brak {objects}",
|
||||
"object.event.created": "Utworzono {object}",
|
||||
"object.event.deleted": "Usunięto {object}",
|
||||
"object.event.disabled": "Wyłączono {object}",
|
||||
"object.event.enabled": "Włączono {object}",
|
||||
"object.event.renewed": "Odnowiono {object}",
|
||||
"object.event.updated": "Zaktualizowano {object}",
|
||||
"offline": "Offline",
|
||||
"online": "Online",
|
||||
"options": "Opcje",
|
||||
"password": "Hasło",
|
||||
"password.generate": "Wygeneruj losowe hasło",
|
||||
"password.hide": "Ukryj hasło",
|
||||
"password.show": "Pokaż hasło",
|
||||
"permissions.hidden": "Ukryte",
|
||||
"permissions.manage": "Zarządzaj",
|
||||
"permissions.view": "Tylko podgląd",
|
||||
"permissions.visibility.all": "Wszystkie elementy",
|
||||
"permissions.visibility.title": "Widoczność elementów",
|
||||
"permissions.visibility.user": "Tylko utworzone elementy",
|
||||
"proxy-host": "Host proxy",
|
||||
"proxy-host.forward-host": "Przekieruj na hostname / IP",
|
||||
"proxy-hosts": "Hosty proxy",
|
||||
"proxy-hosts.count": "{count} {count, plural, one {Host proxy} few {Hosty proxy} other {Hostów proxy}}",
|
||||
"public": "Publiczne",
|
||||
"redirection-host": "Host przekierowania",
|
||||
"redirection-host.forward-domain": "Domena docelowa",
|
||||
"redirection-host.forward-http-code": "Kod HTTP",
|
||||
"redirection-hosts": "Hosty przekierowań",
|
||||
"redirection-hosts.count": "{count} {count, plural, one {Host przekierowania} few {Hosty przekierowań} other {Hostów przekierowań}}",
|
||||
"role.admin": "Administrator",
|
||||
"role.standard-user": "Standardowy użytkownik",
|
||||
"save": "Zapisz",
|
||||
"setting": "Ustawienie",
|
||||
"settings": "Ustawienia",
|
||||
"settings.default-site": "Domyślna strona",
|
||||
"settings.default-site.404": "Strona 404",
|
||||
"settings.default-site.444": "Brak odpowiedzi (444)",
|
||||
"settings.default-site.congratulations": "Strona gratulacyjna",
|
||||
"settings.default-site.description": "Co wyświetlić, gdy Nginx otrzyma nieznany Host",
|
||||
"settings.default-site.html": "Własny HTML",
|
||||
"settings.default-site.html.placeholder": "<!-- Wprowadź tutaj własną zawartość HTML -->",
|
||||
"settings.default-site.redirect": "Przekierowanie",
|
||||
"setup.preamble": "Zacznij od utworzenia konta administratora.",
|
||||
"setup.title": "Witaj!",
|
||||
"sign-in": "Zaloguj się",
|
||||
"ssl-certificate": "Certyfikat SSL",
|
||||
"stream": "Strumień",
|
||||
"stream.forward-host": "Host docelowy",
|
||||
"stream.incoming-port": "Port przychodzący",
|
||||
"streams": "Strumienie",
|
||||
"streams.count": "{count} {count, plural, one {Strumień} few {Strumienie} other {Strumieni}}",
|
||||
"streams.tcp": "TCP",
|
||||
"streams.udp": "UDP",
|
||||
"test": "Test",
|
||||
"user": "Użytkownik",
|
||||
"user.change-password": "Zmień hasło",
|
||||
"user.confirm-password": "Potwierdź hasło",
|
||||
"user.current-password": "Aktualne hasło",
|
||||
"user.edit-profile": "Edytuj profil",
|
||||
"user.full-name": "Pełne imię i nazwisko",
|
||||
"user.login-as": "Zaloguj jako {name}",
|
||||
"user.logout": "Wyloguj",
|
||||
"user.new-password": "Nowe hasło",
|
||||
"user.nickname": "Pseudonim",
|
||||
"user.set-password": "Ustaw hasło",
|
||||
"user.set-permissions": "Ustaw uprawnienia dla {name}",
|
||||
"user.switch-dark": "Przełącz na tryb ciemny",
|
||||
"user.switch-light": "Przełącz na tryb jasny",
|
||||
"username": "Nazwa użytkownika",
|
||||
"users": "Użytkownicy"
|
||||
}
|
||||
216
frontend/src/locale/lang/ru.json
Normal file
216
frontend/src/locale/lang/ru.json
Normal file
@@ -0,0 +1,216 @@
|
||||
{
|
||||
"access-list": "Список доступа",
|
||||
"access-list.access-count": "{count} {count, plural, one {правило} few {правила} many {правил} other {правила}}",
|
||||
"access-list.auth-count": "{count} {count, plural, one {пользователь} few {пользователя} many {пользователей} other {пользователя}}",
|
||||
"access-list.help-rules-last": "When at least 1 rule exists, this deny all rule will be added last",
|
||||
"access-list.help.rules-order": "Note that the allow and deny directives will be applied in the order they are defined.",
|
||||
"access-list.pass-auth": "Pass Auth to Upstream",
|
||||
"access-list.public": "Публично доступен",
|
||||
"access-list.public.subtitle": "Без аутентификации",
|
||||
"access-list.satisfy-any": "Любое совпадение",
|
||||
"access-list.subtitle": "{users} {users, plural, one {User} other {Users}}, {rules} {rules, plural, one {Rule} other {Rules}} - Created: {date}",
|
||||
"access-lists": "Списки доступа",
|
||||
"action.add": "Добавить",
|
||||
"action.add-location": "Добавить маршрут",
|
||||
"action.close": "Закрыть",
|
||||
"action.delete": "Удалить",
|
||||
"action.disable": "Выключить",
|
||||
"action.download": "Скачать",
|
||||
"action.edit": "Изменить",
|
||||
"action.enable": "Включить",
|
||||
"action.permissions": "Разрешения",
|
||||
"action.renew": "Продлить",
|
||||
"action.view-details": "Просмотреть детали",
|
||||
"auditlogs": "Журнал аудита",
|
||||
"cancel": "Отменить",
|
||||
"certificate": "Сертификат",
|
||||
"certificate.custom-certificate": "Сертификат",
|
||||
"certificate.custom-certificate-key": "Ключ сертификата",
|
||||
"certificate.custom-intermediate": "Промежуточный сертификат",
|
||||
"certificate.in-use": "Используется",
|
||||
"certificate.none.subtitle": "Сертификат не назначен",
|
||||
"certificate.none.subtitle.for-http": "Этот хост не будет использовать HTTPS",
|
||||
"certificate.none.title": "Нет",
|
||||
"certificate.not-in-use": "Не используется",
|
||||
"certificate.renew": "Продлить сертификат",
|
||||
"certificates": "Сертификаты",
|
||||
"certificates.custom": "Свой сертификат",
|
||||
"certificates.custom.warning": "Файлы ключей, защищённые паролем, не поддерживаются.",
|
||||
"certificates.dns.credentials": "Credentials File Content",
|
||||
"certificates.dns.credentials-note": "This plugin requires a configuration file containing an API token or other credentials for your provider",
|
||||
"certificates.dns.credentials-warning": "This data will be stored as plaintext in the database and in a file!",
|
||||
"certificates.dns.propagation-seconds": "Propagation Seconds",
|
||||
"certificates.dns.propagation-seconds-note": "Leave empty to use the plugins default value. Number of seconds to wait for DNS propagation.",
|
||||
"certificates.dns.provider": "DNS-провайдер",
|
||||
"certificates.dns.warning": "This section requires some knowledge about Certbot and its DNS plugins. Please consult the respective plugins documentation.",
|
||||
"certificates.http.reachability-404": "There is a server found at this domain but it does not seem to be Nginx Proxy Manager. Please make sure your domain points to the IP where your NPM instance is running.",
|
||||
"certificates.http.reachability-failed-to-check": "Failed to check the reachability due to a communication error with site24x7.com.",
|
||||
"certificates.http.reachability-not-resolved": "There is no server available at this domain. Please make sure your domain exists and points to the IP where your NPM instance is running and if necessary port 80 is forwarded in your router.",
|
||||
"certificates.http.reachability-ok": "Your server is reachable and creating certificates should be possible.",
|
||||
"certificates.http.reachability-other": "There is a server found at this domain but it returned an unexpected status code {code}. Is it the NPM server? Please make sure your domain points to the IP where your NPM instance is running.",
|
||||
"certificates.http.reachability-wrong-data": "There is a server found at this domain but it returned an unexpected data. Is it the NPM server? Please make sure your domain points to the IP where your NPM instance is running.",
|
||||
"certificates.http.test-results": "Результаты проверки",
|
||||
"certificates.http.warning": "These domains must be already configured to point to this installation.",
|
||||
"certificates.request.subtitle": "через Let's Encrypt",
|
||||
"certificates.request.title": "Получить новый сертификат",
|
||||
"column.access": "Доступ",
|
||||
"column.authorization": "Авторизация",
|
||||
"column.authorizations": "Авторизации",
|
||||
"column.custom-locations": "Свои маршруты",
|
||||
"column.destination": "Назначение",
|
||||
"column.details": "Детали",
|
||||
"column.email": "Email",
|
||||
"column.event": "Событие",
|
||||
"column.expires": "Истекает",
|
||||
"column.http-code": "HTTP Code",
|
||||
"column.incoming-port": "Входящий порт",
|
||||
"column.name": "Имя",
|
||||
"column.protocol": "Протокол",
|
||||
"column.provider": "Провайдер",
|
||||
"column.roles": "Роли",
|
||||
"column.rules": "Правила",
|
||||
"column.satisfy": "Совпадение",
|
||||
"column.satisfy-all": "Все",
|
||||
"column.satisfy-any": "Любое",
|
||||
"column.scheme": "Схема",
|
||||
"column.source": "Источник",
|
||||
"column.ssl": "SSL",
|
||||
"column.status": "Статус",
|
||||
"created-on": "Создан: {date}",
|
||||
"dashboard": "Обзор",
|
||||
"dead-host": "404-хост",
|
||||
"dead-hosts": "404-хосты",
|
||||
"dead-hosts.count": "{count} {count, plural, one {404-хост} few {404-хоста} many {404-хостов} other {404-хоста}}",
|
||||
"disabled": "Выключен",
|
||||
"domain-names": "Домены",
|
||||
"domain-names.max": "Максимум доменов: {count}",
|
||||
"domain-names.placeholder": "Начните ввод, чтобы добавить домен...",
|
||||
"domain-names.wildcards-not-permitted": "Wildcard'ы не разрешены для этого типа",
|
||||
"domain-names.wildcards-not-supported": "Wildcard'ы не поддерживаются этим CA",
|
||||
"domains.force-ssl": "Всегда SSL",
|
||||
"domains.hsts-enabled": "Поддержка HSTS",
|
||||
"domains.hsts-subdomains": "Поддомены HSTS",
|
||||
"domains.http2-support": "Поддержка HTTP/2",
|
||||
"domains.use-dns": "Использовать DNS Challenge",
|
||||
"email-address": "Email-адрес",
|
||||
"empty-search": "Ничего не найдено",
|
||||
"empty-subtitle": "Почему бы не создать его?",
|
||||
"enabled": "Включен",
|
||||
"error.access.at-least-one": "Either one Authorization or one Access Rule is required",
|
||||
"error.access.duplicate-usernames": "Authorization Usernames must be unique",
|
||||
"error.invalid-auth": "Неверный email или пароль",
|
||||
"error.invalid-domain": "Неверный домен: {domain}",
|
||||
"error.invalid-email": "Неверный email-адрес",
|
||||
"error.max-character-length": "Maximum length is {max} character{max, plural, one {} other {s}}",
|
||||
"error.max-domains": "Слишком много доменов, максимум {max}",
|
||||
"error.maximum": "Максимум {max}",
|
||||
"error.min-character-length": "Minimum length is {min} character{min, plural, one {} other {s}}",
|
||||
"error.minimum": "Минимум {min}",
|
||||
"error.passwords-must-match": "Пароли должны совпадать",
|
||||
"error.required": "Обязательное поле",
|
||||
"expires.on": "Истекает: {date}",
|
||||
"footer.github-fork": "Fork me on Github",
|
||||
"host.flags.block-exploits": "Блокировать известные эксплойты",
|
||||
"host.flags.cache-assets": "Кэшировать ресурсы",
|
||||
"host.flags.preserve-path": "Сохранять путь",
|
||||
"host.flags.protocols": "Протоколы",
|
||||
"host.flags.websockets-upgrade": "Поддержка WebSocket",
|
||||
"host.forward-port": "Порт перенаправления",
|
||||
"host.forward-scheme": "Схема",
|
||||
"hosts": "Хосты",
|
||||
"http-only": "Только HTTP",
|
||||
"lets-encrypt": "Let's Encrypt",
|
||||
"lets-encrypt-via-dns": "Let's Encrypt через DNS",
|
||||
"lets-encrypt-via-http": "Let's Encrypt через HTTP",
|
||||
"loading": "Загрузка…",
|
||||
"login.title": "Авторизация",
|
||||
"nginx-config.label": "Своя Nginx-конфигурация",
|
||||
"nginx-config.placeholder": "# Введите здесь свою Nginx-конфигурацию, будьте осторожны!",
|
||||
"no-permission-error": "You do not have access to view this.",
|
||||
"notfound.action": "Вернуться на главную",
|
||||
"notfound.content": "Извините, но страница, которую вы ищете, не найдена",
|
||||
"notfound.title": "Упс… Вы попали на страницу ошибки",
|
||||
"notification.error": "Ошибка",
|
||||
"notification.object-deleted": "{object} удален",
|
||||
"notification.object-disabled": "{object} выключен",
|
||||
"notification.object-enabled": "{object} включен",
|
||||
"notification.object-renewed": "{object} продлен",
|
||||
"notification.object-saved": "{object} сохранен",
|
||||
"notification.success": "Успешно",
|
||||
"object.actions-title": "{object} #{id}",
|
||||
"object.add": "Добавить {object}",
|
||||
"object.delete": "Удалить {object}",
|
||||
"object.delete.content": "Вы уверены, что хотите удалить {object}?",
|
||||
"object.edit": "Изменить {object}",
|
||||
"object.empty": "{objects} отстутствуют",
|
||||
"object.event.created": "{object} создан",
|
||||
"object.event.deleted": "{object} удален",
|
||||
"object.event.disabled": "{object} выключен",
|
||||
"object.event.enabled": "{object} включен",
|
||||
"object.event.renewed": "{object} продлен",
|
||||
"object.event.updated": "{object} обновлен",
|
||||
"offline": "Офлайн",
|
||||
"online": "Онлайн",
|
||||
"options": "Параметры",
|
||||
"password": "Пароль",
|
||||
"password.generate": "Сгенерировать случайный пароль",
|
||||
"password.hide": "Скрыть пароль",
|
||||
"password.show": "Показать пароль",
|
||||
"permissions.hidden": "Скрыто",
|
||||
"permissions.manage": "Управление",
|
||||
"permissions.view": "Только просмотр",
|
||||
"permissions.visibility.all": "Все элементы",
|
||||
"permissions.visibility.title": "Видимость элементов",
|
||||
"permissions.visibility.user": "Созданные элементы",
|
||||
"proxy-host": "Прокси-хост",
|
||||
"proxy-host.forward-host": "Хост / IP перенаправления",
|
||||
"proxy-hosts": "Прокси-хосты",
|
||||
"proxy-hosts.count": "{count} {count, plural, one {прокси-хост} few {прокси-хоста} many {прокси-хостов} other {прокси-хоста}}",
|
||||
"public": "Публичный",
|
||||
"redirection-host": "Редирект-хост",
|
||||
"redirection-host.forward-domain": "Домен перенаправления",
|
||||
"redirection-host.forward-http-code": "HTTP Code",
|
||||
"redirection-hosts": "Редирект-хосты",
|
||||
"redirection-hosts.count": "{count} {count, plural, one {редирект-хост} few {редирект-хоста} many {редирект-хостов} other {редирект-хоста}}",
|
||||
"role.admin": "Администратор",
|
||||
"role.standard-user": "Обычный пользователь",
|
||||
"save": "Сохранить",
|
||||
"setting": "Настройка",
|
||||
"settings": "Настройки",
|
||||
"settings.default-site": "Страница по умолчанию",
|
||||
"settings.default-site.404": "404-страница",
|
||||
"settings.default-site.444": "Нет ответа (444)",
|
||||
"settings.default-site.congratulations": "Страница поздравления",
|
||||
"settings.default-site.description": "Что показывать, когда Nginx получает неизвестный хост",
|
||||
"settings.default-site.html": "Свой HTML",
|
||||
"settings.default-site.html.placeholder": "<!-- Введите здесь свой HTML-контент -->",
|
||||
"settings.default-site.redirect": "Перенаправление",
|
||||
"setup.preamble": "Начните с создания учётной записи администратора.",
|
||||
"setup.title": "Добро пожаловать!",
|
||||
"sign-in": "Войти",
|
||||
"ssl-certificate": "SSL-сертификат",
|
||||
"stream": "Поток",
|
||||
"stream.forward-host": "Хост перенаправления",
|
||||
"stream.incoming-port": "Входящий порт",
|
||||
"streams": "Потоки",
|
||||
"streams.count": "{count} {count, plural, one {поток} few {потока} many {потоков} other {потока}}",
|
||||
"streams.tcp": "TCP",
|
||||
"streams.udp": "UDP",
|
||||
"test": "Проверить",
|
||||
"user": "Пользователь",
|
||||
"user.change-password": "Изменить пароль",
|
||||
"user.confirm-password": "Повторите пароль",
|
||||
"user.current-password": "Текущий пароль",
|
||||
"user.edit-profile": "Изменить профиль",
|
||||
"user.full-name": "Полное имя",
|
||||
"user.login-as": "Войти как {name}",
|
||||
"user.logout": "Выйти",
|
||||
"user.new-password": "Новый пароль",
|
||||
"user.nickname": "Псевдоним",
|
||||
"user.set-password": "Задать пароль",
|
||||
"user.set-permissions": "Set Permissions for {name}",
|
||||
"user.switch-dark": "Включить тёмную тему",
|
||||
"user.switch-light": "Включить светлую тему",
|
||||
"username": "Логин",
|
||||
"users": "Пользователи"
|
||||
}
|
||||
216
frontend/src/locale/lang/sk.json
Normal file
216
frontend/src/locale/lang/sk.json
Normal file
@@ -0,0 +1,216 @@
|
||||
{
|
||||
"access-list": "zoznam prístupov",
|
||||
"access-list.access-count": "{count} {count, plural, one {pravidlo} few {pravidlá} other {pravidiel}}",
|
||||
"access-list.auth-count": "{count} {count, plural, one {používateľ} few {používatelia} other {používateľov}}",
|
||||
"access-list.help-rules-last": "Keď existuje aspoň jedno pravidlo, toto pravidlo „zamietnuť všetko“ bude pridané ako posledné",
|
||||
"access-list.help.rules-order": "Upozornenie: pravidlá povoliť a zamietnuť budú uplatňované v poradí, v akom sú definované.",
|
||||
"access-list.pass-auth": "Odoslať overenie na Upstream",
|
||||
"access-list.public": "Verejne prístupné",
|
||||
"access-list.public.subtitle": "Nie je potrebné základné overenie",
|
||||
"access-list.satisfy-any": "Splniť ktorékoľvek",
|
||||
"access-list.subtitle": "{users} {users, plural, one {používateľ} few {používatelia} other {používateľov}}, {rules} {rules, plural, one {pravidlo} few {pravidlá} other {pravidiel}} - Vytvorené: {date}",
|
||||
"access-lists": "Zoznamy prístupov",
|
||||
"action.add": "Pridať",
|
||||
"action.add-location": "Pridať umiestnenie",
|
||||
"action.close": "Zavrieť",
|
||||
"action.delete": "Vymazať",
|
||||
"action.disable": "Deaktivovať",
|
||||
"action.download": "Stiahnuť",
|
||||
"action.edit": "Upraviť",
|
||||
"action.enable": "Aktivovať",
|
||||
"action.permissions": "Oprávnenia",
|
||||
"action.renew": "Obnoviť",
|
||||
"action.view-details": "Zobraziť podrobnosti",
|
||||
"auditlogs": "Záznamy auditu",
|
||||
"cancel": "Zrušiť",
|
||||
"certificate": "Certifikát",
|
||||
"certificate.custom-certificate": "Certifikát",
|
||||
"certificate.custom-certificate-key": "Kľúč certifikátu",
|
||||
"certificate.custom-intermediate": "Sprostredkovateľský certifikát",
|
||||
"certificate.in-use": "Používa sa",
|
||||
"certificate.none.subtitle": "Nie je priradený žiadny certifikát",
|
||||
"certificate.none.subtitle.for-http": "Tento hostiteľ nebude používať HTTPS",
|
||||
"certificate.none.title": "Žiadny",
|
||||
"certificate.not-in-use": "Nepoužíva sa",
|
||||
"certificate.renew": "Obnoviť certifikát",
|
||||
"certificates": "Certifikáty",
|
||||
"certificates.custom": "Vlastný certifikát",
|
||||
"certificates.custom.warning": "Súbory kľúčov chránené heslom nie sú podporované.",
|
||||
"certificates.dns.credentials": "Obsah súboru s prihlasovacími údajmi",
|
||||
"certificates.dns.credentials-note": "Tento doplnok vyžaduje konfiguračný súbor obsahujúci API token alebo iné prihlasovacie údaje vášho poskytovateľa",
|
||||
"certificates.dns.credentials-warning": "Tieto údaje budú uložené v databáze a v súbore ako obyčajný text!",
|
||||
"certificates.dns.propagation-seconds": "Propagácia v sekundách",
|
||||
"certificates.dns.propagation-seconds-note": "Ponechajte prázdne pre predvolenú hodnotu doplnku. Počet sekúnd, počas ktorých sa čaká na propagáciu DNS.",
|
||||
"certificates.dns.provider": "DNS poskytovateľ",
|
||||
"certificates.dns.warning": "Táto sekcia vyžaduje znalosť Certbotu a jeho DNS doplnkov. Prosím, pozrite si dokumentáciu príslušného doplnku.",
|
||||
"certificates.http.reachability-404": "Na tejto doméne bol nájdený server, ale nezdá sa, že ide o Nginx Proxy Manager. Uistite sa, že vaša doména smeruje na IP, kde beží vaša inštancia NPM.",
|
||||
"certificates.http.reachability-failed-to-check": "Nepodarilo sa overiť dostupnosť kvôli chybe komunikácie so službou site24x7.com.",
|
||||
"certificates.http.reachability-not-resolved": "Na tejto doméne nie je dostupný žiadny server. Uistite sa, že doména existuje a smeruje na IP adresu s NPM a ak je to potrebné, port 80 je presmerovaný vo vašom smerovači.",
|
||||
"certificates.http.reachability-ok": "Váš server je dostupný a vytvorenie certifikátu by malo byť možné.",
|
||||
"certificates.http.reachability-other": "Na tejto doméne bol nájdený server, ale vrátil neočakávaný stavový kód {code}. Je to NPM server? Uistite sa prosím, že doména smeruje na IP, kde beží vaša inštancia NPM.",
|
||||
"certificates.http.reachability-wrong-data": "Na tejto doméne bol nájdený server, ale vrátil neočakávané údaje. Je to NPM server? Uistite sa, že doména smeruje na IP, kde beží vaša inštancia NPM.",
|
||||
"certificates.http.test-results": "Výsledky testu",
|
||||
"certificates.http.warning": "Tieto domény musia byť už nakonfigurované tak, aby smerovali na túto inštaláciu.",
|
||||
"certificates.request.subtitle": "pomocou Let's Encrypt",
|
||||
"certificates.request.title": "Vyžiadať nový certifikát",
|
||||
"column.access": "Prístup",
|
||||
"column.authorization": "Autorizácia",
|
||||
"column.authorizations": "Autorizácie",
|
||||
"column.custom-locations": "Vlastné umiestnenia",
|
||||
"column.destination": "Cieľ",
|
||||
"column.details": "Podrobnosti",
|
||||
"column.email": "Email",
|
||||
"column.event": "Udalosť",
|
||||
"column.expires": "Platnosť do",
|
||||
"column.http-code": "Prístup",
|
||||
"column.incoming-port": "Vstupný port",
|
||||
"column.name": "Názov",
|
||||
"column.protocol": "Protokol",
|
||||
"column.provider": "Poskytovateľ",
|
||||
"column.roles": "Roly",
|
||||
"column.rules": "Pravidlá",
|
||||
"column.satisfy": "Splniť",
|
||||
"column.satisfy-all": "Všetky",
|
||||
"column.satisfy-any": "Ktorékoľvek",
|
||||
"column.scheme": "Schéma",
|
||||
"column.source": "Zdroj",
|
||||
"column.ssl": "SSL",
|
||||
"column.status": "Stav",
|
||||
"created-on": "Vytvorené: {date}",
|
||||
"dashboard": "Panel",
|
||||
"dead-host": "404 Hostiteľ",
|
||||
"dead-hosts": "404 Hostitelia",
|
||||
"dead-hosts.count": "{count} {count, plural, one {404 hostiteľ} few {404 hostitelia} other {404 hostiteľov}}",
|
||||
"disabled": "Deaktivované",
|
||||
"domain-names": "Doménové mená",
|
||||
"domain-names.max": "Maximálne {count} doménových mien",
|
||||
"domain-names.placeholder": "Začnite písať pre pridanie domény...",
|
||||
"domain-names.wildcards-not-permitted": "Wildcards nie sú pre tento typ povolené",
|
||||
"domain-names.wildcards-not-supported": "Wildcards nie sú podporované pre túto certifikačnú autoritu",
|
||||
"domains.force-ssl": "Vynútiť SSL",
|
||||
"domains.hsts-enabled": "HSTS povolené",
|
||||
"domains.hsts-subdomains": "HSTS pre subdomény",
|
||||
"domains.http2-support": "Podpora HTTP/2",
|
||||
"domains.use-dns": "Použiť DNS výzvu",
|
||||
"email-address": "Emailová adresa",
|
||||
"empty-search": "Nenašli sa žiadne výsledky",
|
||||
"empty-subtitle": "Prečo nevytvoríte nejaký?",
|
||||
"enabled": "Aktivované",
|
||||
"error.access.at-least-one": "Je vyžadovaná aspoň jedna autorizácia alebo jedno prístupové pravidlo",
|
||||
"error.access.duplicate-usernames": "Používateľské mená pre autorizáciu musia byť jedinečné",
|
||||
"error.invalid-auth": "Neplatný email alebo heslo",
|
||||
"error.invalid-domain": "Neplatná doména: {domain}",
|
||||
"error.invalid-email": "Neplatná emailová adresa",
|
||||
"error.max-character-length": "Maximálna dĺžka je {max} znak{max, plural, one {} few {y} other {ov}}",
|
||||
"error.max-domains": "Príliš veľa domén, maximum je {max}",
|
||||
"error.maximum": "Maximum je {max}",
|
||||
"error.min-character-length": "Minimálna dĺžka je {min} znak{min, plural, one {} few {y} other {ov}}",
|
||||
"error.minimum": "Minimum je {min}",
|
||||
"error.passwords-must-match": "Heslá sa musia zhodovať",
|
||||
"error.required": "Toto pole je povinné",
|
||||
"expires.on": "Platnosť do: {date}",
|
||||
"footer.github-fork": "Forknite ma na GitHube",
|
||||
"host.flags.block-exploits": "Blokovať bežné exploity",
|
||||
"host.flags.cache-assets": "Uložiť zdroje do vyrovnávacej pamäte",
|
||||
"host.flags.preserve-path": "Zachovať cestu",
|
||||
"host.flags.protocols": "Protokoly",
|
||||
"host.flags.websockets-upgrade": "Podpora WebSockets",
|
||||
"host.forward-port": "Port presmerovania",
|
||||
"host.forward-scheme": "Schéma",
|
||||
"hosts": "Hostitelia",
|
||||
"http-only": "Len HTTP",
|
||||
"lets-encrypt": "Let's Encrypt",
|
||||
"lets-encrypt-via-dns": "Let's Encrypt cez DNS",
|
||||
"lets-encrypt-via-http": "Let's Encrypt cez HTTP",
|
||||
"loading": "Načítava sa…",
|
||||
"login.title": "Prihláste sa do svojho účtu",
|
||||
"nginx-config.label": "Vlastná Nginx konfigurácia",
|
||||
"nginx-config.placeholder": "# Zadajte vlastnú Nginx konfiguráciu na vlastné riziko!",
|
||||
"no-permission-error": "Nemáte oprávnenie na zobrazenie tohto obsahu.",
|
||||
"notfound.action": "Späť na hlavnú stránku",
|
||||
"notfound.content": "Ľutujeme, stránka, ktorú hľadáte, nebola nájdená",
|
||||
"notfound.title": "Ups… Našli ste chybovú stránku",
|
||||
"notification.error": "Chyba",
|
||||
"notification.object-deleted": "{object} bol odstránený",
|
||||
"notification.object-disabled": "{object} bol deaktivovaný",
|
||||
"notification.object-enabled": "{object} bol aktivovaný",
|
||||
"notification.object-renewed": "{object} bol obnovený",
|
||||
"notification.object-saved": "{object} bol uložené",
|
||||
"notification.success": "Úspech",
|
||||
"object.actions-title": "{object} #{id}",
|
||||
"object.add": "Pridať {object}",
|
||||
"object.delete": "Vymazať {object}",
|
||||
"object.delete.content": "Naozaj chcete vymazať tento {object}?",
|
||||
"object.edit": "Upraviť {object}",
|
||||
"object.empty": "Nie sú žiadne/y {objects}",
|
||||
"object.event.created": "Vytvorený {object}",
|
||||
"object.event.deleted": "Vymazaný {object}",
|
||||
"object.event.disabled": "Deaktivovaný {object}",
|
||||
"object.event.enabled": "Aktivovaný {object}",
|
||||
"object.event.renewed": "Obnovený {object}",
|
||||
"object.event.updated": "Aktualizovaný {object}",
|
||||
"offline": "Offline",
|
||||
"online": "Online",
|
||||
"options": "Možnosti",
|
||||
"password": "Heslo",
|
||||
"password.generate": "Vygenerovať náhodné heslo",
|
||||
"password.hide": "Skryť heslo",
|
||||
"password.show": "Zobraziť heslo",
|
||||
"permissions.hidden": "Skryté",
|
||||
"permissions.manage": "Spravovať",
|
||||
"permissions.view": "Len na zobrazenie",
|
||||
"permissions.visibility.all": "Všetky položky",
|
||||
"permissions.visibility.title": "Viditeľnosť položky",
|
||||
"permissions.visibility.user": "Len vytvorené položky",
|
||||
"proxy-host": "Proxy hostiteľa",
|
||||
"proxy-host.forward-host": "Cieľový názov hostiteľa / IP",
|
||||
"proxy-hosts": "Proxy hostitelia",
|
||||
"proxy-hosts.count": "{count} {count, plural, one {proxy hostiteľ} few {proxy hostitelia} other {proxy hostiteľov}}",
|
||||
"public": "Verejné",
|
||||
"redirection-host": "presmerovacieho hostiteľa",
|
||||
"redirection-host.forward-domain": "Cieľová doména",
|
||||
"redirection-host.forward-http-code": "HTTP kód",
|
||||
"redirection-hosts": "Presmerovací hostitelia",
|
||||
"redirection-hosts.count": "{count} {count, plural, one {presmerovací hostiteľ} few {presmerovací hostitelia} other {presmerovacích hostiteľov}}",
|
||||
"role.admin": "Administrátor",
|
||||
"role.standard-user": "Bežný používateľ",
|
||||
"save": "Uložiť",
|
||||
"setting": "Nastavenie",
|
||||
"settings": "Nastavenia",
|
||||
"settings.default-site": "Predvolená stránka",
|
||||
"settings.default-site.404": "Stránka 404",
|
||||
"settings.default-site.444": "Bez odpovede (444)",
|
||||
"settings.default-site.congratulations": "Gratulačná stránka",
|
||||
"settings.default-site.description": "Čo zobraziť, keď Nginx zachytí neznámeho hostiteľa",
|
||||
"settings.default-site.html": "Vlastné HTML",
|
||||
"settings.default-site.html.placeholder": "<!-- Sem zadajte vlastný HTML obsah -->",
|
||||
"settings.default-site.redirect": "Presmerovať",
|
||||
"setup.preamble": "Začnite vytvorením administrátorského účtu.",
|
||||
"setup.title": "Vitajte!",
|
||||
"sign-in": "Prihlásiť sa",
|
||||
"ssl-certificate": "SSL certifikát",
|
||||
"stream": "Stream",
|
||||
"stream.forward-host": "Cieľový hostiteľ",
|
||||
"stream.incoming-port": "Vstupný port",
|
||||
"streams": "Streamy",
|
||||
"streams.count": "{count} {count, plural, one {stream} few {streamy} other {streamov}}",
|
||||
"streams.tcp": "TCP",
|
||||
"streams.udp": "UDP",
|
||||
"test": "Test",
|
||||
"user": "používateľa",
|
||||
"user.change-password": "Zmeniť heslo",
|
||||
"user.confirm-password": "Potvrdiť heslo",
|
||||
"user.current-password": "Aktuálne heslo",
|
||||
"user.edit-profile": "Upraviť profil",
|
||||
"user.full-name": "Celé meno",
|
||||
"user.login-as": "Prihlásiť sa ako {name}",
|
||||
"user.logout": "Odhlásiť sa",
|
||||
"user.new-password": "Nové heslo",
|
||||
"user.nickname": "Prezývka",
|
||||
"user.set-password": "Nastaviť heslo",
|
||||
"user.set-permissions": "Nastaviť oprávnenia pre {name}",
|
||||
"user.switch-dark": "Prepnúť na tmavý režim",
|
||||
"user.switch-light": "Prepnúť na svetlý režim",
|
||||
"username": "Používateľské meno",
|
||||
"users": "Používatelia"
|
||||
}
|
||||
216
frontend/src/locale/lang/zh.json
Executable file
216
frontend/src/locale/lang/zh.json
Executable file
@@ -0,0 +1,216 @@
|
||||
{
|
||||
"access-list": "通信规则",
|
||||
"access-list.access-count": "{count} 条规则",
|
||||
"access-list.auth-count": "{count} 个用户",
|
||||
"access-list.help-rules-last": "当至少存在1条规则时,此拒绝所有规则将被添加到最后",
|
||||
"access-list.help.rules-order": " 允许 (allow) 和禁止 (deny) 规则将按照它们定义的顺序执行。",
|
||||
"access-list.pass-auth": "将认证传递给上游",
|
||||
"access-list.public": "公开可访问",
|
||||
"access-list.public.subtitle": "无需基本认证",
|
||||
"access-list.satisfy-any": "满足任意条件",
|
||||
"access-list.subtitle": "{users} 个用户, {rules} 条规则 - 创建时间: {date}",
|
||||
"access-lists": "通信规则",
|
||||
"action.add": "添加",
|
||||
"action.add-location": "添加路径规则(Location)",
|
||||
"action.close": "关闭",
|
||||
"action.delete": "删除",
|
||||
"action.disable": "禁用",
|
||||
"action.download": "下载",
|
||||
"action.edit": "编辑",
|
||||
"action.enable": "启用",
|
||||
"action.permissions": "权限",
|
||||
"action.renew": "续期",
|
||||
"action.view-details": "查看详情",
|
||||
"auditlogs": "审计日志",
|
||||
"cancel": "取消",
|
||||
"certificate": "证书",
|
||||
"certificate.custom-certificate": "证书",
|
||||
"certificate.custom-certificate-key": "证书密钥",
|
||||
"certificate.custom-intermediate": "中间证书",
|
||||
"certificate.in-use": "使用中",
|
||||
"certificate.none.subtitle": "未分配证书",
|
||||
"certificate.none.subtitle.for-http": "此主机将不使用 HTTPS",
|
||||
"certificate.none.title": "无",
|
||||
"certificate.not-in-use": "未使用",
|
||||
"certificate.renew": "续期证书",
|
||||
"certificates": "证书列表",
|
||||
"certificates.custom": "自定义证书",
|
||||
"certificates.custom.warning": "不支持受密码保护的密钥文件。",
|
||||
"certificates.dns.credentials": "凭据文件内容",
|
||||
"certificates.dns.credentials-note": "此插件需要一个包含 API 令牌或提供商其他凭证的配置文件",
|
||||
"certificates.dns.credentials-warning": "此数据将以明文形式存储在数据库和文件中!",
|
||||
"certificates.dns.propagation-seconds": "传播时间 (秒)",
|
||||
"certificates.dns.propagation-seconds-note": "留空以使用插件默认值。等待DNS传播的秒数。",
|
||||
"certificates.dns.provider": "DNS 提供商",
|
||||
"certificates.dns.warning": "本节需要您具备一些关于 Certbot 及其 DNS 插件的知识,请参阅相应插件的官方文档。",
|
||||
"certificates.http.reachability-404": "在此域名下找到了一个服务器,但它似乎不是 Nginx 代理管理器。请确保您的域名指向 NPM 实例运行的 IP 地址。",
|
||||
"certificates.http.reachability-failed-to-check": "由于与site24x7.com通信错误,无法检查可达性。",
|
||||
"certificates.http.reachability-not-resolved": "此域名下没有可用的服务器。请确保您的域名存在并指向NPM实例运行的 IP 地址,如有必要,请在路由器中转发 80 端口。",
|
||||
"certificates.http.reachability-ok": "您的服务器可以访问,应该可以创建证书。",
|
||||
"certificates.http.reachability-other": "在此域名下找到了一个服务器,但它返回了意外的状态码 {code}。它是 NPM 服务器吗?请确保您的域名指向NPM实例运行的 IP 地址。",
|
||||
"certificates.http.reachability-wrong-data": "在此域名下找到了一个服务器,但它返回了意外的数据。它是 NPM 服务器吗?请确保您的域名指向 NPM 实例运行的 IP 地址。",
|
||||
"certificates.http.test-results": "测试结果",
|
||||
"certificates.http.warning": "这些域名必须配置为指向本设备。",
|
||||
"certificates.request.subtitle": "使用 Let's Encrypt",
|
||||
"certificates.request.title": "申请新证书",
|
||||
"column.access": "访问",
|
||||
"column.authorization": "授权",
|
||||
"column.authorizations": "授权列表",
|
||||
"column.custom-locations": "自定义路径规则 (Locations)",
|
||||
"column.destination": "目标",
|
||||
"column.details": "详情",
|
||||
"column.email": "邮箱",
|
||||
"column.event": "事件",
|
||||
"column.expires": "过期时间",
|
||||
"column.http-code": "访问",
|
||||
"column.incoming-port": "入站端口",
|
||||
"column.name": "名称",
|
||||
"column.protocol": "协议",
|
||||
"column.provider": "提供商",
|
||||
"column.roles": "角色",
|
||||
"column.rules": "规则",
|
||||
"column.satisfy": "满足",
|
||||
"column.satisfy-all": "全部",
|
||||
"column.satisfy-any": "任意",
|
||||
"column.scheme": "协议",
|
||||
"column.source": "来源",
|
||||
"column.ssl": "SSL",
|
||||
"column.status": "状态",
|
||||
"created-on": "创建时间: {date}",
|
||||
"dashboard": "仪表板",
|
||||
"dead-host": "错误页面",
|
||||
"dead-hosts": "错误页面列表",
|
||||
"dead-hosts.count": "{count} 个错误页面列表",
|
||||
"disabled": "已禁用",
|
||||
"domain-names": "域名",
|
||||
"domain-names.max": "{count} 个最多域名数量",
|
||||
"domain-names.placeholder": "开始输入以添加域名...",
|
||||
"domain-names.wildcards-not-permitted": "此类型不允许使用通配符",
|
||||
"domain-names.wildcards-not-supported": "此 CA 不支持通配符",
|
||||
"domains.force-ssl": "强制 SSL",
|
||||
"domains.hsts-enabled": "HSTS 已启用",
|
||||
"domains.hsts-subdomains": "HSTS 子域名",
|
||||
"domains.http2-support": "HTTP/2 支持",
|
||||
"domains.use-dns": "使用DNS验证",
|
||||
"email-address": "邮箱地址",
|
||||
"empty-search": "未找到结果",
|
||||
"empty-subtitle": "为什么不由您来创建一个呢?",
|
||||
"enabled": "已启用",
|
||||
"error.access.at-least-one": "需要至少一个授权或访问规则",
|
||||
"error.access.duplicate-usernames": "授权用户名必须唯一",
|
||||
"error.invalid-auth": "无效的邮箱或密码",
|
||||
"error.invalid-domain": "无效的域名: {domain}",
|
||||
"error.invalid-email": "无效的邮箱地址",
|
||||
"error.max-character-length": "最大长度为 {max} 个字符",
|
||||
"error.max-domains": "域名过多,最多为 {max} 个",
|
||||
"error.maximum": "最大值为 {max}",
|
||||
"error.min-character-length": "最小长度为 {min} 个字符",
|
||||
"error.minimum": "最小值为 {min}",
|
||||
"error.passwords-must-match": "密码必须匹配",
|
||||
"error.required": "此项为必填项",
|
||||
"expires.on": "过期时间: {date}",
|
||||
"footer.github-fork": "在 Github 上复刻 (For) 本项目",
|
||||
"host.flags.block-exploits": "阻止常见攻击",
|
||||
"host.flags.cache-assets": "缓存资源",
|
||||
"host.flags.preserve-path": "保留路径",
|
||||
"host.flags.protocols": "协议",
|
||||
"host.flags.websockets-upgrade": "Websockets 支持",
|
||||
"host.forward-port": "转发端口",
|
||||
"host.forward-scheme": "协议",
|
||||
"hosts": "主机列表",
|
||||
"http-only": "仅 HTTP",
|
||||
"lets-encrypt": "Let's Encrypt",
|
||||
"lets-encrypt-via-dns": "Let's Encrypt DNS 验证",
|
||||
"lets-encrypt-via-http": "Let's Encrypt HTTP 验证",
|
||||
"loading": "加载中···",
|
||||
"login.title": "登录您的账户",
|
||||
"nginx-config.label": "自定义 Nginx 配置",
|
||||
"nginx-config.placeholder": "# 在此输入您的自定义 Nginx 配置,风险自负!",
|
||||
"no-permission-error": "您无权查看此内容。",
|
||||
"notfound.action": "返回首页",
|
||||
"notfound.content": "很抱歉,您要查找的页面未找到",
|
||||
"notfound.title": "糟糕...您刚刚找到了一个错误页面",
|
||||
"notification.error": "错误",
|
||||
"notification.object-deleted": "{object} 已被删除",
|
||||
"notification.object-disabled": "{object} 已被禁用",
|
||||
"notification.object-enabled": "{object} 已被启用",
|
||||
"notification.object-renewed": "{object} 已续期",
|
||||
"notification.object-saved": "{object} 已保存",
|
||||
"notification.success": "成功",
|
||||
"object.actions-title": "{object} #{id}",
|
||||
"object.add": "添加 {object}",
|
||||
"object.delete": "删除 {object}",
|
||||
"object.delete.content": "您确定要删除 {object} 吗?",
|
||||
"object.edit": "编辑 {object}",
|
||||
"object.empty": "没有 {objects}",
|
||||
"object.event.created": "已创建 {object}",
|
||||
"object.event.deleted": "已删除 {object}",
|
||||
"object.event.disabled": "已禁用 {object}",
|
||||
"object.event.enabled": "已启用 {object}",
|
||||
"object.event.renewed": "已续期 {object}",
|
||||
"object.event.updated": "已更新 {object}",
|
||||
"offline": "离线",
|
||||
"online": "在线",
|
||||
"options": "选项",
|
||||
"password": "密码",
|
||||
"password.generate": "生成随机密码",
|
||||
"password.hide": "隐藏密码",
|
||||
"password.show": "显示密码",
|
||||
"permissions.hidden": "隐藏",
|
||||
"permissions.manage": "管理",
|
||||
"permissions.view": "仅查看",
|
||||
"permissions.visibility.all": "所有项目",
|
||||
"permissions.visibility.title": "项目可见性",
|
||||
"permissions.visibility.user": "仅创建的项目",
|
||||
"proxy-host": "代理服务",
|
||||
"proxy-host.forward-host": "转发主机名 / IP",
|
||||
"proxy-hosts": "代理服务列表",
|
||||
"proxy-hosts.count": "{count} 个代理服务",
|
||||
"public": "公开",
|
||||
"redirection-host": "重定向主机",
|
||||
"redirection-host.forward-domain": "转发域名",
|
||||
"redirection-host.forward-http-code": "HTTP 状态码",
|
||||
"redirection-hosts": "重定向主机列表",
|
||||
"redirection-hosts.count": "{count} 个重定向主机",
|
||||
"role.admin": "管理员",
|
||||
"role.standard-user": "标准用户",
|
||||
"save": "保存",
|
||||
"setting": "设置",
|
||||
"settings": "设置列表",
|
||||
"settings.default-site": "默认站点",
|
||||
"settings.default-site.404": "错误页面",
|
||||
"settings.default-site.444": "无响应 (444)",
|
||||
"settings.default-site.congratulations": "欢迎页面",
|
||||
"settings.default-site.description": "当 Nginx 遇到未知主机时显示什么",
|
||||
"settings.default-site.html": "自定义 HTML",
|
||||
"settings.default-site.html.placeholder": "<!-- 在此输入您的自定义 HTML 内容 -->",
|
||||
"settings.default-site.redirect": "重定向",
|
||||
"setup.preamble": "通过创建您的管理员账户开始使用。",
|
||||
"setup.title": "欢迎!",
|
||||
"sign-in": "登录",
|
||||
"ssl-certificate": "SSL 证书",
|
||||
"stream": "端口转发",
|
||||
"stream.forward-host": "转发主机",
|
||||
"stream.incoming-port": "入站端口",
|
||||
"streams": "端口转发列表",
|
||||
"streams.count": "{count} 个端口转发",
|
||||
"streams.tcp": "TCP",
|
||||
"streams.udp": "UDP",
|
||||
"test": "测试",
|
||||
"user": "用户",
|
||||
"user.change-password": "修改密码",
|
||||
"user.confirm-password": "确认密码",
|
||||
"user.current-password": "当前密码",
|
||||
"user.edit-profile": "编辑资料",
|
||||
"user.full-name": "全名",
|
||||
"user.login-as": "登录用户 {name}",
|
||||
"user.logout": "退出登录",
|
||||
"user.new-password": "新密码",
|
||||
"user.nickname": "昵称",
|
||||
"user.set-password": "设置密码",
|
||||
"user.set-permissions": "为用户 {name} 设置权限",
|
||||
"user.switch-dark": "切换到深色模式",
|
||||
"user.switch-light": "切换到浅色模式",
|
||||
"username": "用户名",
|
||||
"users": "用户列表"
|
||||
}
|
||||
7
frontend/src/locale/src/HelpDoc/de/AccessLists.md
Normal file
7
frontend/src/locale/src/HelpDoc/de/AccessLists.md
Normal file
@@ -0,0 +1,7 @@
|
||||
## Was ist eine Zugriffsliste?
|
||||
|
||||
Zugriffslisten bieten eine Blacklist oder Whitelist mit bestimmten Client-IP-Adressen sowie eine Authentifizierung für die Proxy-Hosts über die grundlegende HTTP-Authentifizierung.
|
||||
|
||||
Sie können mehrere Client-Regeln, Benutzernamen und Passwörter für eine einzelne Zugriffsliste konfigurieren und diese dann auf einen oder mehrere Proxy-Hosts anwenden.
|
||||
|
||||
Dies ist besonders nützlich für weitergeleitete Webdienste, die keine integrierten Authentifizierungsmechanismen haben, oder wenn Sie sich vor unbekannten Clients schützen möchten.
|
||||
32
frontend/src/locale/src/HelpDoc/de/Certificates.md
Normal file
32
frontend/src/locale/src/HelpDoc/de/Certificates.md
Normal file
@@ -0,0 +1,32 @@
|
||||
## Hilfe zu Zertifikaten
|
||||
|
||||
### HTTP-Zertifikat
|
||||
|
||||
Ein HTTP-validiertes Zertifikat bedeutet, dass Let's Encrypt-Server
|
||||
versuchen, Ihre Domains über HTTP (nicht HTTPS!) zu erreichen, und wenn dies erfolgreich ist,
|
||||
stellen sie Ihr Zertifikat aus.
|
||||
|
||||
Für diese Methode müssen Sie einen _Proxy-Host_ für Ihre Domain(s) erstellen, der
|
||||
über HTTP zugänglich ist und auf diese Nginx-Installation verweist. Nachdem ein Zertifikat
|
||||
ausgestellt wurde, können Sie den _Proxy-Host_ so ändern, dass dieses Zertifikat auch für HTTPS-Verbindungen
|
||||
verwendet wird. Der _Proxy-Host_ muss jedoch weiterhin für den HTTP-Zugriff konfiguriert sein,
|
||||
damit das Zertifikat erneuert werden kann.
|
||||
|
||||
Dieser Prozess unterstützt keine Wildcard-Domains.
|
||||
|
||||
### DNS-Zertifikat
|
||||
|
||||
Für ein DNS-validiertes Zertifikat müssen Sie ein DNS-Provider-Plugin verwenden. Dieser DNS-
|
||||
Provider wird verwendet, um temporäre Einträge auf Ihrer Domain zu erstellen. Anschließend fragt Let's
|
||||
Encrypt diese Einträge ab, um sicherzustellen, dass Sie der Eigentümer sind. Bei Erfolg wird
|
||||
Ihr Zertifikat ausgestellt.
|
||||
|
||||
Sie müssen vor der Beantragung dieser Art von Zertifikat keinen _Proxy-Host_ erstellen.
|
||||
Sie müssen Ihren _Proxy-Host_ auch nicht für den HTTP-Zugriff konfigurieren.
|
||||
|
||||
Dieser Prozess unterstützt Wildcard-Domains.
|
||||
|
||||
### Benutzerdefiniertes Zertifikat
|
||||
|
||||
Verwenden Sie diese Option, um Ihr eigenes SSL-Zertifikat hochzuladen, das Ihnen von Ihrer eigenen
|
||||
Zertifizierungsstelle bereitgestellt wurde.
|
||||
10
frontend/src/locale/src/HelpDoc/de/DeadHosts.md
Normal file
10
frontend/src/locale/src/HelpDoc/de/DeadHosts.md
Normal file
@@ -0,0 +1,10 @@
|
||||
## Was ist ein 404-Host?
|
||||
|
||||
Ein 404-Host ist ein Host-Setup, das eine 404-Seite anzeigt.
|
||||
|
||||
Dies kann nützlich sein, wenn Ihre Domain in Suchmaschinen gelistet ist und Sie
|
||||
eine ansprechendere Fehlerseite bereitstellen oder den Suchindexern ausdrücklich mitteilen möchten, dass
|
||||
die Domain-Seiten nicht mehr existieren.
|
||||
|
||||
Ein weiterer Vorteil dieses Hosts besteht darin, dass Sie die Protokolle für Zugriffe darauf verfolgen und
|
||||
die Verweise anzeigen können.
|
||||
7
frontend/src/locale/src/HelpDoc/de/ProxyHosts.md
Normal file
7
frontend/src/locale/src/HelpDoc/de/ProxyHosts.md
Normal file
@@ -0,0 +1,7 @@
|
||||
## Was ist ein Proxy-Host?
|
||||
|
||||
Ein Proxy-Host ist der eingehende Endpunkt für einen Webdienst, den Sie weiterleiten möchten.
|
||||
|
||||
Er bietet optionale SSL-Terminierung für Ihren Dienst, der möglicherweise keine integrierte SSL-Unterstützung hat.
|
||||
|
||||
Proxy-Hosts sind die häufigste Verwendung für den Nginx Proxy Manager.
|
||||
7
frontend/src/locale/src/HelpDoc/de/RedirectionHosts.md
Normal file
7
frontend/src/locale/src/HelpDoc/de/RedirectionHosts.md
Normal file
@@ -0,0 +1,7 @@
|
||||
## Was ist ein Redirection Host?
|
||||
|
||||
Ein Redirection Host leitet Anfragen von der eingehenden Domain weiter und leitet den
|
||||
Besucher zu einer anderen Domain weiter.
|
||||
|
||||
Der häufigste Grund für die Verwendung dieses Host-Typs ist, wenn Ihre Website die
|
||||
Domain wechselt, aber Sie noch Suchmaschinen- oder Referrer-Links haben, die auf die alte Domain verweisen.
|
||||
6
frontend/src/locale/src/HelpDoc/de/Streams.md
Normal file
6
frontend/src/locale/src/HelpDoc/de/Streams.md
Normal file
@@ -0,0 +1,6 @@
|
||||
## Was ist ein Stream?
|
||||
|
||||
Ein Stream ist eine relativ neue Funktion von Nginx, die dazu dient, TCP/UDP-Datenverkehr
|
||||
direkt an einen anderen Computer im Netzwerk weiterzuleiten.
|
||||
|
||||
Wenn Sie Spielserver, FTP- oder SSH-Server betreiben, kann dies sehr nützlich sein.
|
||||
6
frontend/src/locale/src/HelpDoc/de/index.ts
Normal file
6
frontend/src/locale/src/HelpDoc/de/index.ts
Normal file
@@ -0,0 +1,6 @@
|
||||
export * as AccessLists from "./AccessLists.md";
|
||||
export * as Certificates from "./Certificates.md";
|
||||
export * as DeadHosts from "./DeadHosts.md";
|
||||
export * as ProxyHosts from "./ProxyHosts.md";
|
||||
export * as RedirectionHosts from "./RedirectionHosts.md";
|
||||
export * as Streams from "./Streams.md";
|
||||
7
frontend/src/locale/src/HelpDoc/es/AccessLists.md
Normal file
7
frontend/src/locale/src/HelpDoc/es/AccessLists.md
Normal file
@@ -0,0 +1,7 @@
|
||||
## ¿Qué es una Lista de Acceso?
|
||||
|
||||
Las Listas de Acceso proporcionan una lista negra o blanca de direcciones IP de cliente específicas junto con autenticación para los Hosts Proxy a través de Autenticación HTTP Básica.
|
||||
|
||||
Puede configurar múltiples reglas de cliente, nombres de usuario y contraseñas para una única Lista de Acceso y luego aplicarla a uno o más _Hosts Proxy_.
|
||||
|
||||
Esto es más útil para servicios web reenviados que no tienen mecanismos de autenticación integrados o cuando desea protegerse de clientes desconocidos.
|
||||
32
frontend/src/locale/src/HelpDoc/es/Certificates.md
Normal file
32
frontend/src/locale/src/HelpDoc/es/Certificates.md
Normal file
@@ -0,0 +1,32 @@
|
||||
## Ayuda de Certificados
|
||||
|
||||
### Certificado HTTP
|
||||
|
||||
Un certificado validado por HTTP significa que los servidores de Let's Encrypt
|
||||
intentarán acceder a tus dominios a través de HTTP (¡no HTTPS!) y, si tienen éxito,
|
||||
emitirán tu certificado.
|
||||
|
||||
Para este método, deberás tener un _Host Proxy_ creado para tu(s) dominio(s) que
|
||||
sea accesible por HTTP y que apunte a esta instalación de Nginx. Después de que se
|
||||
haya emitido un certificado, puedes modificar el _Host Proxy_ para que también use
|
||||
este certificado para conexiones HTTPS. Sin embargo, el _Host Proxy_ seguirá
|
||||
necesitando estar configurado para acceso HTTP para que el certificado se renueve.
|
||||
|
||||
Este proceso _no_ admite dominios comodín.
|
||||
|
||||
### Certificado DNS
|
||||
|
||||
Un certificado validado por DNS requiere que uses un complemento de Proveedor de DNS.
|
||||
Este Proveedor de DNS se usará para crear registros temporales en tu dominio y luego
|
||||
Let's Encrypt consultará esos registros para asegurarse de que eres el propietario y,
|
||||
si tiene éxito, emitirá tu certificado.
|
||||
|
||||
No necesitas tener un _Host Proxy_ creado antes de solicitar este tipo de certificado.
|
||||
Tampoco necesitas tener tu _Host Proxy_ configurado para acceso HTTP.
|
||||
|
||||
Este proceso _sí_ admite dominios comodín.
|
||||
|
||||
### Certificado Personalizado
|
||||
|
||||
Usa esta opción para cargar tu propio Certificado SSL, proporcionado por tu propia
|
||||
Autoridad de Certificación.
|
||||
10
frontend/src/locale/src/HelpDoc/es/DeadHosts.md
Normal file
10
frontend/src/locale/src/HelpDoc/es/DeadHosts.md
Normal file
@@ -0,0 +1,10 @@
|
||||
## ¿Qué es un Host 404?
|
||||
|
||||
Un Host 404 es simplemente una configuración de host que muestra una página 404.
|
||||
|
||||
Esto puede ser útil cuando tu dominio está listado en los motores de búsqueda y deseas
|
||||
proporcionar una página de error más agradable o específicamente para indicar a los indexadores de búsqueda que
|
||||
las páginas del dominio ya no existen.
|
||||
|
||||
Otro beneficio de tener este host es rastrear los registros de visitas a él y
|
||||
ver los referentes.
|
||||
7
frontend/src/locale/src/HelpDoc/es/ProxyHosts.md
Normal file
7
frontend/src/locale/src/HelpDoc/es/ProxyHosts.md
Normal file
@@ -0,0 +1,7 @@
|
||||
## ¿Qué es un Host Proxy?
|
||||
|
||||
Un Host Proxy es el punto de entrada para un servicio web que deseas reenviar.
|
||||
|
||||
Proporciona terminación SSL opcional para tu servicio que podría no tener soporte SSL integrado.
|
||||
|
||||
Los Hosts Proxy son el uso más común del Nginx Proxy Manager.
|
||||
7
frontend/src/locale/src/HelpDoc/es/RedirectionHosts.md
Normal file
7
frontend/src/locale/src/HelpDoc/es/RedirectionHosts.md
Normal file
@@ -0,0 +1,7 @@
|
||||
## ¿Qué es un Host de Redirección?
|
||||
|
||||
Un Host de Redirección redirigirá las solicitudes del dominio entrante e impulsará al
|
||||
visitante a otro dominio.
|
||||
|
||||
La razón más común para usar este tipo de host es cuando tu sitio web cambia de
|
||||
dominios pero aún tienes enlaces de motores de búsqueda o referencias apuntando al dominio anterior.
|
||||
6
frontend/src/locale/src/HelpDoc/es/Streams.md
Normal file
6
frontend/src/locale/src/HelpDoc/es/Streams.md
Normal file
@@ -0,0 +1,6 @@
|
||||
## ¿Qué es un Stream?
|
||||
|
||||
Una característica relativamente nueva para Nginx, un Stream servirá para reenviar tráfico TCP/UDP
|
||||
directamente a otra computadora en la red.
|
||||
|
||||
Si estás ejecutando servidores de juegos, FTP o servidores SSH esto puede ser muy útil.
|
||||
6
frontend/src/locale/src/HelpDoc/es/index.ts
Normal file
6
frontend/src/locale/src/HelpDoc/es/index.ts
Normal file
@@ -0,0 +1,6 @@
|
||||
export * as AccessLists from "./AccessLists.md";
|
||||
export * as Certificates from "./Certificates.md";
|
||||
export * as DeadHosts from "./DeadHosts.md";
|
||||
export * as ProxyHosts from "./ProxyHosts.md";
|
||||
export * as RedirectionHosts from "./RedirectionHosts.md";
|
||||
export * as Streams from "./Streams.md";
|
||||
@@ -1,8 +1,11 @@
|
||||
// import * as de from "./de/index";
|
||||
// import * as fa from "./fa/index";
|
||||
import * as de from "./de/index";
|
||||
import * as en from "./en/index";
|
||||
import * as ja from "./ja/index";
|
||||
import * as sk from "./sk/index";
|
||||
import * as zh from "./zh/index";
|
||||
import * as pl from "./pl/index";
|
||||
|
||||
const items: any = { en };
|
||||
const items: any = { en, de, ja, sk, zh, pl };
|
||||
|
||||
const fallbackLang = "en";
|
||||
|
||||
|
||||
8
frontend/src/locale/src/HelpDoc/ja/AccessLists.md
Normal file
8
frontend/src/locale/src/HelpDoc/ja/AccessLists.md
Normal file
@@ -0,0 +1,8 @@
|
||||
## アクセスリストとは
|
||||
|
||||
アクセスリストは特定のクライアントIPへのブラックリストとホワイトリストを提供し、ベーシック認証によるプロキシホストへの認証を可能にします。
|
||||
|
||||
複数のクライアントルールやユーザー名とパスワードを一つのアクセスリストに設定し、一つ以上の _プロキシホスト_ に適応することができます。
|
||||
|
||||
これは認証システムを持たないサービスや不明なクライアントからの保護が必要な場合に有効です。
|
||||
|
||||
21
frontend/src/locale/src/HelpDoc/ja/Certificates.md
Normal file
21
frontend/src/locale/src/HelpDoc/ja/Certificates.md
Normal file
@@ -0,0 +1,21 @@
|
||||
## 証明書
|
||||
|
||||
### HTTP 証明書
|
||||
|
||||
HTTPによって検証された証明書はLet's EncryptサーバーがHTTPでドメインにアクセスを試みサーバーを管理していることを確認できた場合に発行される証明書です。
|
||||
|
||||
この方法では、HTTPアクセス可能でこのNginxを指しているドメインに対して _プロキシホスト_ を作成する必要があります。証明書が発行された後は、 _プロキシホスト_ を編集してこの証明書をHTTPS接続に使用するように設定できます。ただし、証明書の更新には、_プロキシホスト_ がHTTP接続用に設定された状態を維持する必要があります。
|
||||
|
||||
この方法はワイルドカードのドメインをサポート _していません_ 。
|
||||
|
||||
### DNS 証明書
|
||||
|
||||
DNSによって検証された証明書にはDNSプロバイダープラグインが必要です。このプロバイダーはドメイン上に一時レコードを作成するために使用されます。その後Let's Encryptサーバーがそのレコードを参照し、あなたが所有していることを確認できると証明書が発行されます。
|
||||
|
||||
このタイプの証明書を作成する際に、 _プロキシホスト_ を作成する必要はありません。また、_プロキシホスト_ をHTTPアクセス用に設定する必要もありません。
|
||||
|
||||
この方法はワイルドカードのドメインをサポート _します_ 。
|
||||
|
||||
### カスタム証明書
|
||||
|
||||
このオプションでは、あなたの証明書認証局によって提供された自身の証明書をアップロードして使用できます。
|
||||
7
frontend/src/locale/src/HelpDoc/ja/DeadHosts.md
Normal file
7
frontend/src/locale/src/HelpDoc/ja/DeadHosts.md
Normal file
@@ -0,0 +1,7 @@
|
||||
## 404ホストとはなんですか?
|
||||
|
||||
404ホストとは、単に404ページを表示するよう設定されたホストです。
|
||||
|
||||
これは、検索エンジンに登録されたドメインに分かりやすいエラーページを提供したい場合や、検索エンジンのインデクサーにドメインページがもう存在しないことを伝えたい場合に便利です。
|
||||
|
||||
このホストを持つもう一つの利点は、アクセスログを追跡し、参照元を確認できることです。
|
||||
7
frontend/src/locale/src/HelpDoc/ja/ProxyHosts.md
Normal file
7
frontend/src/locale/src/HelpDoc/ja/ProxyHosts.md
Normal file
@@ -0,0 +1,7 @@
|
||||
## プロキシホストとは何ですか?
|
||||
|
||||
プロキシホストは転送したいwebサービスの受信エンドポイントです。
|
||||
|
||||
サービスにSSLサーバーが組み込まれていない場合でも、オプションでSSL終端機能を提供します。
|
||||
|
||||
プロキシホストはNginx Proxy Managerのもっとも一般的な使用方法です。
|
||||
5
frontend/src/locale/src/HelpDoc/ja/RedirectionHosts.md
Normal file
5
frontend/src/locale/src/HelpDoc/ja/RedirectionHosts.md
Normal file
@@ -0,0 +1,5 @@
|
||||
## リダイレクトホストとは何ですか?
|
||||
|
||||
リダイレクトホストは受信したリクエストを別のドメインにリダイレクトして訪問者に表示します。
|
||||
|
||||
このタイプのもっとも一般的な使用理由は、webサイトのドメインが変更されたが検索エンジンやリンクが古いドメインを指し続けている場合です。
|
||||
5
frontend/src/locale/src/HelpDoc/ja/Streams.md
Normal file
5
frontend/src/locale/src/HelpDoc/ja/Streams.md
Normal file
@@ -0,0 +1,5 @@
|
||||
## ストリームとは何ですか?
|
||||
|
||||
Nginxの比較的新しい機能であるストリームは、TCP/UDPトラフィックをネットワーク上の別のコンピュータに直接転送します。
|
||||
|
||||
ゲームサーバー、FTPサーバー、SSHサーバーを運用している場合に便利です。
|
||||
6
frontend/src/locale/src/HelpDoc/ja/index.ts
Normal file
6
frontend/src/locale/src/HelpDoc/ja/index.ts
Normal file
@@ -0,0 +1,6 @@
|
||||
export * as AccessLists from "./AccessLists.md";
|
||||
export * as Certificates from "./Certificates.md";
|
||||
export * as DeadHosts from "./DeadHosts.md";
|
||||
export * as ProxyHosts from "./ProxyHosts.md";
|
||||
export * as RedirectionHosts from "./RedirectionHosts.md";
|
||||
export * as Streams from "./Streams.md";
|
||||
7
frontend/src/locale/src/HelpDoc/pl/AccessLists.md
Normal file
7
frontend/src/locale/src/HelpDoc/pl/AccessLists.md
Normal file
@@ -0,0 +1,7 @@
|
||||
## Czym jest lista dostępu?
|
||||
|
||||
Listy dostępu zapewniają czarną lub białą listę określonych adresów IP klientów wraz z uwierzytelnianiem dla hostów proxy za pomocą podstawowego uwierzytelniania HTTP.
|
||||
|
||||
Możesz skonfigurować wiele reguł klienta, nazw użytkowników i haseł dla pojedynczej listy dostępu, a następnie zastosować ją do jednego lub więcej hostów proxy.
|
||||
|
||||
Jest to najbardziej przydatne w przypadku przekierowywanych usług internetowych, które nie mają wbudowanych mechanizmów uwierzytelniania lub gdy chcesz zabezpieczyć się przed nieznanymi klientami.
|
||||
22
frontend/src/locale/src/HelpDoc/pl/Certificates.md
Normal file
22
frontend/src/locale/src/HelpDoc/pl/Certificates.md
Normal file
@@ -0,0 +1,22 @@
|
||||
## Pomoc dotycząca certyfikatów
|
||||
|
||||
### Certyfikat HTTP
|
||||
|
||||
Certyfikat weryfikowany przez HTTP oznacza, że serwery Let's Encrypt będą próbowały połączyć się z twoimi domenami przez HTTP (nie HTTPS!) i jeśli się to powiedzie, wydadzą twój certyfikat.
|
||||
|
||||
W przypadku tej metody musisz mieć utworzony Host proxy dla swoich domen, który jest dostępny przez HTTP i wskazuje na tę instalację Nginx.
|
||||
Po otrzymaniu certyfikatu możesz zmodyfikować Host proxy, aby używał również tego certyfikatu do połączeń HTTPS. Jednak Host proxy nadal będzie musiał być skonfigurowany do dostępu przez HTTP, aby certyfikat mógł być odnawiany.
|
||||
|
||||
Ten proces nie obsługuje domen wieloznacznych (wildcard).
|
||||
|
||||
### Certyfikat DNS
|
||||
|
||||
Certyfikat weryfikowany przez DNS wymaga użycia wtyczki dostawcy DNS. Ten dostawca DNS zostanie użyty do utworzenia tymczasowych rekordów w twojej domenie, a następnie Let's Encrypt sprawdzi te rekordy, aby upewnić się, że jesteś właścicielem i jeśli się powiedzie, wydadzą twój certyfikat.
|
||||
|
||||
Nie musisz mieć utworzonego Hosta proxy przed wystąpieniem o ten typ certyfikatu. Nie musisz również mieć skonfigurowanego Hosta proxy do dostępu przez HTTP.
|
||||
|
||||
Ten proces obsługuje domeny wieloznaczne (wildcard).
|
||||
|
||||
### Własny certyfikat
|
||||
|
||||
Użyj tej opcji, aby przesłać własny certyfikat SSL, dostarczony przez twój własny urząd certyfikacji.
|
||||
7
frontend/src/locale/src/HelpDoc/pl/DeadHosts.md
Normal file
7
frontend/src/locale/src/HelpDoc/pl/DeadHosts.md
Normal file
@@ -0,0 +1,7 @@
|
||||
## Czym jest host 404?
|
||||
|
||||
Host 404 to po prostu konfiguracja hosta, która wyświetla stronę 404.
|
||||
|
||||
Może to być przydatne, gdy twoja domena jest indeksowana w wyszukiwarkach i chcesz zapewnić ładniejszą stronę błędu lub konkretnie poinformować roboty indeksujące, że strony domeny już nie istnieją.
|
||||
|
||||
Kolejną zaletą posiadania tego hosta jest możliwość śledzenia logów dla odwiedzin oraz przeglądania źródeł ruchu (referrerów).
|
||||
7
frontend/src/locale/src/HelpDoc/pl/ProxyHosts.md
Normal file
7
frontend/src/locale/src/HelpDoc/pl/ProxyHosts.md
Normal file
@@ -0,0 +1,7 @@
|
||||
## Czym jest host proxy?
|
||||
|
||||
Host proxy to punkt wejściowy dla usługi internetowej, którą chcesz przekierować.
|
||||
|
||||
Zapewnia opcjonalne zakończenie SSL dla twojej usługi, która może nie mieć wbudowanej obsługi SSL.
|
||||
|
||||
Hosty proxy są najpopularniejszym zastosowaniem Nginx Proxy Manager
|
||||
5
frontend/src/locale/src/HelpDoc/pl/RedirectionHosts.md
Normal file
5
frontend/src/locale/src/HelpDoc/pl/RedirectionHosts.md
Normal file
@@ -0,0 +1,5 @@
|
||||
## Czym jest host przekierowania?
|
||||
|
||||
Host przekierowania przekierowuje żądania z domeny przychodzącej i przenosi odwiedzającego na inną domenę.
|
||||
|
||||
Najczęstszym powodem używania tego typu hosta jest sytuacja, gdy twoja strona internetowa zmienia domeny, ale nadal masz linki z wyszukiwarek lub odnośniki wskazujące na starą domenę.
|
||||
5
frontend/src/locale/src/HelpDoc/pl/Streams.md
Normal file
5
frontend/src/locale/src/HelpDoc/pl/Streams.md
Normal file
@@ -0,0 +1,5 @@
|
||||
## Czym jest strumień?
|
||||
|
||||
Stosunkowo nowa funkcja dla Nginx, strumień służy do przekazywania ruchu TCP/UDP bezpośrednio na inny komputer/serwer w sieci.
|
||||
|
||||
Jeśli prowadzisz serwery gier, FTP lub SSH, może się to okazać przydatne
|
||||
6
frontend/src/locale/src/HelpDoc/pl/index.ts
Normal file
6
frontend/src/locale/src/HelpDoc/pl/index.ts
Normal file
@@ -0,0 +1,6 @@
|
||||
export * as AccessLists from "./AccessLists.md";
|
||||
export * as Certificates from "./Certificates.md";
|
||||
export * as DeadHosts from "./DeadHosts.md";
|
||||
export * as ProxyHosts from "./ProxyHosts.md";
|
||||
export * as RedirectionHosts from "./RedirectionHosts.md";
|
||||
export * as Streams from "./Streams.md";
|
||||
7
frontend/src/locale/src/HelpDoc/sk/AccessLists.md
Normal file
7
frontend/src/locale/src/HelpDoc/sk/AccessLists.md
Normal file
@@ -0,0 +1,7 @@
|
||||
## Čo je zoznam prístupov?
|
||||
|
||||
Zoznamy prístupov poskytujú čiernu alebo bielu listinu konkrétnych IP adries klientov spolu s overovaním pre proxy hostiteľov prostredníctvom základného overovania HTTP.
|
||||
|
||||
Môžete nakonfigurovať viacero pravidiel pre klientov, používateľských mien a hesiel pre jeden zoznam prístupov a potom ho použiť na jeden alebo viacero proxy hostiteľov.
|
||||
|
||||
Toto je najužitočnejšie pre presmerované webové služby, ktoré nemajú zabudované overovacie mechanizmy, alebo ak sa chcete chrániť pred neznámymi klientmi.
|
||||
32
frontend/src/locale/src/HelpDoc/sk/Certificates.md
Normal file
32
frontend/src/locale/src/HelpDoc/sk/Certificates.md
Normal file
@@ -0,0 +1,32 @@
|
||||
## Pomoc s certifikátmi
|
||||
|
||||
### Certifikát HTTP
|
||||
|
||||
Certifikát overený protokolom HTTP znamená, že servery Let's Encrypt sa
|
||||
pokúsia pripojiť k vašim doménam cez protokol HTTP (nie HTTPS!) a v prípade úspechu
|
||||
vydajú váš certifikát.
|
||||
|
||||
Pre túto metódu budete musieť mať pre svoje domény vytvorený _Proxy Host_, ktorý
|
||||
je prístupný cez HTTP a smeruje na túto inštaláciu Nginx. Po vydaní certifikátu
|
||||
môžete zmeniť _Proxy Host_ tak, aby tento certifikát používal aj pre HTTPS
|
||||
pripojenia. _Proxy Host_ však bude stále potrebné nakonfigurovať pre prístup cez HTTP,
|
||||
aby sa certifikát mohol obnoviť.
|
||||
|
||||
Tento proces _nepodporuje_ domény s divokými kartami.
|
||||
|
||||
### Certifikát DNS
|
||||
|
||||
Certifikát overený DNS vyžaduje použitie pluginu DNS Provider. Tento DNS
|
||||
Provider sa použije na vytvorenie dočasných záznamov vo vašej doméne a potom Let's
|
||||
Encrypt overí tieto záznamy, aby sa uistil, že ste vlastníkom, a ak bude úspešný,
|
||||
vydá váš certifikát.
|
||||
|
||||
Pred požiadaním o tento typ certifikátu nie je potrebné vytvoriť _Proxy Host_.
|
||||
Tiež nie je potrebné mať _Proxy Host_ nakonfigurovaný pre prístup HTTP.
|
||||
|
||||
Tento proces _podporuje_ domény s divokými kartami.
|
||||
|
||||
### Vlastný certifikát
|
||||
|
||||
Túto možnosť použite na nahratie vlastného SSL certifikátu, ktorý vám poskytla vaša
|
||||
certifikačná autorita.
|
||||
10
frontend/src/locale/src/HelpDoc/sk/DeadHosts.md
Normal file
10
frontend/src/locale/src/HelpDoc/sk/DeadHosts.md
Normal file
@@ -0,0 +1,10 @@
|
||||
## Čo je to 404 Hostiteľ?
|
||||
|
||||
404 Hostiteľ je jednoducho nastavenie hostiteľa, ktoré zobrazuje stránku 404.
|
||||
|
||||
To môže byť užitočné, ak je vaša doména uvedená vo vyhľadávačoch a chcete
|
||||
poskytnúť krajšiu stránku s chybou alebo konkrétne oznámiť vyhľadávačom, že
|
||||
stránky domény už neexistujú.
|
||||
|
||||
Ďalšou výhodou tohto hostiteľa je sledovanie protokolov o návštevách a
|
||||
zobrazenie odkazov.
|
||||
7
frontend/src/locale/src/HelpDoc/sk/ProxyHosts.md
Normal file
7
frontend/src/locale/src/HelpDoc/sk/ProxyHosts.md
Normal file
@@ -0,0 +1,7 @@
|
||||
## Čo je proxy hostiteľ?
|
||||
|
||||
Proxy hostiteľ je prichádzajúci koncový bod pre webovú službu, ktorú chcete presmerovať.
|
||||
|
||||
Poskytuje voliteľné ukončenie SSL pre vašu službu, ktorá nemusí mať zabudovanú podporu SSL.
|
||||
|
||||
Proxy hostitelia sú najbežnejším použitím pre Nginx Proxy Manager.
|
||||
7
frontend/src/locale/src/HelpDoc/sk/RedirectionHosts.md
Normal file
7
frontend/src/locale/src/HelpDoc/sk/RedirectionHosts.md
Normal file
@@ -0,0 +1,7 @@
|
||||
## Čo je presmerovací hostiteľ?
|
||||
|
||||
Presmerovací hostiteľ presmeruje požiadavky z prichádzajúcej domény a presmeruje
|
||||
návštevníka na inú doménu.
|
||||
|
||||
Najčastejším dôvodom na použitie tohto typu hostiteľa je situácia, keď vaša webová stránka zmení
|
||||
doménu, ale stále máte odkazy vo vyhľadávačoch alebo referenčné odkazy smerujúce na starú doménu.
|
||||
6
frontend/src/locale/src/HelpDoc/sk/Streams.md
Normal file
6
frontend/src/locale/src/HelpDoc/sk/Streams.md
Normal file
@@ -0,0 +1,6 @@
|
||||
## Čo je stream?
|
||||
|
||||
Stream je relatívne nová funkcia pre Nginx, ktorá slúži na presmerovanie TCP/UDP
|
||||
dátového toku priamo do iného počítača v sieti.
|
||||
|
||||
Ak prevádzkujete herné servery, FTP alebo SSH servery, táto funkcia sa vám môže hodiť.
|
||||
6
frontend/src/locale/src/HelpDoc/sk/index.ts
Normal file
6
frontend/src/locale/src/HelpDoc/sk/index.ts
Normal file
@@ -0,0 +1,6 @@
|
||||
export * as AccessLists from "./AccessLists.md";
|
||||
export * as Certificates from "./Certificates.md";
|
||||
export * as DeadHosts from "./DeadHosts.md";
|
||||
export * as ProxyHosts from "./ProxyHosts.md";
|
||||
export * as RedirectionHosts from "./RedirectionHosts.md";
|
||||
export * as Streams from "./Streams.md";
|
||||
7
frontend/src/locale/src/HelpDoc/zh/AccessLists.md
Executable file
7
frontend/src/locale/src/HelpDoc/zh/AccessLists.md
Executable file
@@ -0,0 +1,7 @@
|
||||
## 什么是通信规则?
|
||||
|
||||
通信规则提供了一个特定客户IP地址的黑名单或白名单,以及通过基本HTTP认证对代理服务的认证。
|
||||
|
||||
你可以为一个通信规则配置多个客户规则、用户名和密码,然后将其应用于代理服务。
|
||||
|
||||
这对那些没有内置认证机制的转发网络服务或你想保护其免受未知客户的访问是最有用的。
|
||||
21
frontend/src/locale/src/HelpDoc/zh/Certificates.md
Executable file
21
frontend/src/locale/src/HelpDoc/zh/Certificates.md
Executable file
@@ -0,0 +1,21 @@
|
||||
## 证书帮助
|
||||
|
||||
### HTTP 证书
|
||||
|
||||
HTTP 验证的证书表示 Let's Encrypt 服务器将尝试通过 HTTP(而非 HTTPS!)访问您的域名,如果成功,它们将为您颁发证书。
|
||||
|
||||
使用此方法时,您必须为您的域名创建一个可通过 HTTP 访问并指向此 Nginx 安装的 代理主机。在获得证书后,您可以修改该 代理主机,使其也使用此证书处理 HTTPS 连接。然而,为了证书能够续期,该 代理主机 仍需配置为支持 HTTP 访问。
|
||||
|
||||
此过程_不支持_通配符域名。
|
||||
|
||||
### DNS 证书
|
||||
|
||||
DNS 验证的证书要求您使用一个 DNS 服务商插件。该 DNS 服务商将用于在您的域名下创建临时记录,随后 Let's Encrypt 将查询这些记录以确认您是域名所有者,如果成功,它们将为您颁发证书。
|
||||
|
||||
请求此类证书前,您无需预先创建 代理主机,也无需将您的 代理主机 配置为支持 HTTP 访问。
|
||||
|
||||
此过程_支持_通配符域名。
|
||||
|
||||
### 自定义证书
|
||||
|
||||
使用此选项上传您自己的 SSL 证书,该证书由您自己的证书颁发机构提供。
|
||||
7
frontend/src/locale/src/HelpDoc/zh/DeadHosts.md
Executable file
7
frontend/src/locale/src/HelpDoc/zh/DeadHosts.md
Executable file
@@ -0,0 +1,7 @@
|
||||
## 什么是错误页面?
|
||||
|
||||
错误页面是一个简单的主机设置,显示错误页面。
|
||||
|
||||
当你的域名被列入搜索引擎,而你想提供一个更好的错误页面或特别是告诉搜索索引者域名页面不再存在时,这可能是有用的。
|
||||
|
||||
拥有这种主机的另一个好处是可以跟踪点击它的日志并查看访问来源。
|
||||
7
frontend/src/locale/src/HelpDoc/zh/ProxyHosts.md
Executable file
7
frontend/src/locale/src/HelpDoc/zh/ProxyHosts.md
Executable file
@@ -0,0 +1,7 @@
|
||||
## 什么是代理服务?
|
||||
|
||||
代理服务是你想转发网络应用的主机。
|
||||
|
||||
代理服务可以为没有SSL服务的网络应用提供SSL服务(可选)。
|
||||
|
||||
代理服务是Nginx代理管理器的最常见用途之一。
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user