Compare commits

...

1491 Commits

Author SHA1 Message Date
Owen
3af1e0ef56 Delete all before migrating 2025-10-17 11:56:19 -07:00
Owen
08b7d6735c Priority needs to be def 2025-10-16 14:52:14 -07:00
Milo Schwartz
a91ebd1e91 Update README.md 2025-10-16 17:45:11 -04:00
Owen
312e03b4eb Fix typo 2025-10-16 14:43:11 -07:00
miloschwartz
e8a57e432c hide path match and rewrite in raw resource 2025-10-16 14:30:22 -07:00
Owen
bca2eef2e8 Show ssl toggle 2025-10-16 14:24:36 -07:00
Owen
ec7211a15d Handle updating exit node and fix raw resource issues 2025-10-16 13:55:08 -07:00
Owen
46807c6477 Fix various bugs 2025-10-16 10:23:25 -07:00
miloschwartz
b578786e62 add empty state to sites table cols 2025-10-16 10:11:50 -07:00
miloschwartz
2e0ad8d262 branding only works when licensed 2025-10-15 22:07:33 -07:00
miloschwartz
003f0cfa6d fix target validation on create site 2025-10-15 20:43:59 -07:00
Owen
ee3df081ef Fix docker button and positioning 2025-10-15 20:21:15 -07:00
Owen
08eeb12519 Fix going away when creating target
cd8062ada3
2025-10-15 17:48:31 -07:00
Owen
e66c6b2505 remove volumes for remote nodes 2025-10-15 17:44:03 -07:00
miloschwartz
d2a880d9c8 update docker command in makefile 2025-10-15 17:36:09 -07:00
miloschwartz
edc0b86470 add translation and update url 2025-10-15 17:32:39 -07:00
Owen
aebe6b80b7 Make private file optional 2025-10-15 17:22:43 -07:00
Owen
4d87333b43 Merge branch 'main' into dev 2025-10-15 17:15:48 -07:00
Owen
ef32f3ed5a Load encryption file dynamically 2025-10-15 17:14:24 -07:00
Owen
216ded3034 Merge branch 'main' of github.com:fosrl/pangolin 2025-10-15 17:14:14 -07:00
miloschwartz
cb59fe2cee update readme 2025-10-15 16:34:06 -07:00
miloschwartz
7776f6d09c disable branding 2025-10-15 16:32:16 -07:00
Owen
c50392c947 Remove logging 2025-10-15 13:57:42 -07:00
Owen
ceee978fcd Merge branch 'dev' 2025-10-15 12:13:15 -07:00
Owen
c5a73dc87e Try to handle the certs better 2025-10-15 12:12:59 -07:00
Owen
7198ef2774 Merge branch 'dev' of github.com:fosrl/pangolin into dev 2025-10-15 11:12:38 -07:00
miloschwartz
7e9a066797 update form 2025-10-15 11:10:37 -07:00
Milo Schwartz
ba96332313 Update README.md 2025-10-15 14:02:28 -04:00
Owen
e2d0338b0b Merge branch 'dev' 2025-10-15 10:39:50 -07:00
Owen
59ecab5738 Dont ping remote nodes; handle certs better 2025-10-15 10:39:45 -07:00
miloschwartz
721bf3403d fix form 2025-10-15 10:21:00 -07:00
Owen
3b8ba47377 Update package lock 2025-10-14 18:00:46 -07:00
Milo Schwartz
e752929f69 Update README.md 2025-10-14 20:50:41 -04:00
Milo Schwartz
e41c3e6f54 Update README.md 2025-10-14 20:48:44 -04:00
Milo Schwartz
9dedd1a8de Update README.md 2025-10-14 20:41:14 -04:00
Owen
c4a5fae28f Update workflow and add runner 2025-10-14 17:34:47 -07:00
Owen
5f95a3233f Merge branch 'dev' 2025-10-14 17:05:40 -07:00
Owen Schwartz
d3174d0196 Merge pull request #1671 from fosrl/crowdin_dev
New Crowdin updates
2025-10-14 17:03:22 -07:00
Owen Schwartz
3710d71974 New translations en-us.json (Spanish) 2025-10-14 17:02:54 -07:00
Owen Schwartz
f62e88eb67 New translations en-us.json (Norwegian Bokmal) 2025-10-14 17:02:53 -07:00
Owen Schwartz
904b302fb6 New translations en-us.json (Chinese Simplified) 2025-10-14 17:02:52 -07:00
Owen Schwartz
5fc096f2d5 New translations en-us.json (Turkish) 2025-10-14 17:02:50 -07:00
Owen Schwartz
87668c492f New translations en-us.json (Russian) 2025-10-14 17:02:49 -07:00
Owen Schwartz
6d7a8b97ad New translations en-us.json (Portuguese) 2025-10-14 17:02:48 -07:00
Owen Schwartz
282d444933 New translations en-us.json (Polish) 2025-10-14 17:02:46 -07:00
Owen Schwartz
f3d7d97fb9 New translations en-us.json (Dutch) 2025-10-14 17:02:45 -07:00
Owen Schwartz
de857a7c4e New translations en-us.json (Korean) 2025-10-14 17:02:44 -07:00
Owen Schwartz
20a0ebfc9d New translations en-us.json (Italian) 2025-10-14 17:02:43 -07:00
Owen Schwartz
ba8166bdeb New translations en-us.json (German) 2025-10-14 17:02:41 -07:00
Owen Schwartz
2b634fc6c5 New translations en-us.json (Czech) 2025-10-14 17:02:40 -07:00
Owen Schwartz
5429bc03ab New translations en-us.json (Bulgarian) 2025-10-14 17:02:38 -07:00
Owen Schwartz
a558b34608 New translations en-us.json (French) 2025-10-14 17:02:37 -07:00
Owen Schwartz
1850d56977 Merge pull request #1669 from fosrl/dev
Dev
2025-10-14 16:57:01 -07:00
Owen
61b4c62824 Merge branch 'main' into dev 2025-10-14 16:55:12 -07:00
Owen
10e5ccfe86 Handle tsconfig 2025-10-14 16:34:11 -07:00
Owen
9f5d475e80 Migrations work 2025-10-14 16:34:11 -07:00
Milo Schwartz
9bb9a3acbe Update README.md 2025-10-14 19:04:09 -04:00
Milo Schwartz
0923b7e3c5 Update README.md 2025-10-14 18:59:31 -04:00
Owen
ccd81f6fe2 Adjust migration 2025-10-14 15:31:56 -07:00
miloschwartz
0f74107e86 add links to license 2025-10-14 14:39:05 -07:00
Owen
8377434c08 Add update database to installer 2025-10-14 14:23:18 -07:00
Owen
1fbf2bfb8d Remove managed add maxmind 2025-10-14 14:15:33 -07:00
Owen
42facf8e12 Add pg migration 2025-10-14 12:11:17 -07:00
Owen
4bb3d85c25 Add sqlite migration 2025-10-14 12:04:02 -07:00
Owen
c0039190bd Fix frontend type imports 2025-10-14 11:28:56 -07:00
Owen
a8d00a47cd Remote nodes working 2025-10-14 10:58:51 -07:00
Owen
57bcbf6c48 Include traefik config when sending to remote nodes 2025-10-14 10:38:41 -07:00
Owen
c57db1479e Update language for local sites 2025-10-14 10:25:03 -07:00
Owen
cd8062ada3 Fix various bugs 2025-10-14 10:25:03 -07:00
Owen
244d05adb1 Import the right customer 2025-10-14 10:25:03 -07:00
miloschwartz
812bd64325 improve docker container selector button placement 2025-10-13 18:33:55 -07:00
miloschwartz
276d1361ac move billing and and licenses up in sidebar 2025-10-13 18:07:00 -07:00
miloschwartz
881eac4722 fix tier and remove test interval 2025-10-13 17:01:32 -07:00
Owen
2a2a550a6a Merge branch 'distribution' of github.com:fosrl/pangolin-saas into distribution 2025-10-13 17:00:37 -07:00
miloschwartz
e75001080a update license terminateAt and update word mark 2025-10-13 16:45:19 -07:00
miloschwartz
6fbba38a76 fix license type and default selected domain type 2025-10-13 16:45:19 -07:00
Owen
902b413881 Path rewriting working? 2025-10-13 16:41:14 -07:00
Owen
8b2f8ad3ef Add rewriting to traefik config 2025-10-13 15:53:17 -07:00
Owen
377cb77307 Returning unauthorized 2025-10-13 15:34:26 -07:00
miloschwartz
733bf0b169 set wildcard domain verified to true 2025-10-13 15:31:34 -07:00
miloschwartz
8faff3e075 hide provided domains if not using dns 2025-10-13 15:21:59 -07:00
Owen
48af91c976 Return unauthorized if header auth is the only one 2025-10-13 15:20:53 -07:00
Owen
6664efaa13 Fix up UI around resource auth headers 2025-10-13 15:20:53 -07:00
miloschwartz
e5ee96cf52 fix create domain 2025-10-13 15:08:57 -07:00
Owen
38faf1f905 Add header auth so it does not allow passing 2025-10-13 14:59:54 -07:00
Owen
2cff142266 Use Pangolin DNS fix 2025-10-13 14:42:40 -07:00
miloschwartz
2c99cfacc0 fix header auth formatting 2025-10-13 14:39:41 -07:00
miloschwartz
0c63ea1f50 remove log 2025-10-13 14:28:23 -07:00
Owen
f50df66e3a Fix use_pangolin_dns 2025-10-13 14:27:51 -07:00
Owen
4b93491160 rename generateOwnCertificates and check in resource header 2025-10-13 14:26:36 -07:00
Owen
19210cbf7d Hide cname and ns if not using dns 2025-10-13 14:22:06 -07:00
miloschwartz
9af206b69a move schemas to folder 2025-10-13 14:13:26 -07:00
Owen
b6b9c71c5e Pass this middleware correctly in saas 2025-10-13 12:27:45 -07:00
Owen
c000c4502f Fix instance name 2025-10-13 12:13:04 -07:00
Owen
b6c1d9a592 Merge branch 'dev' into distribution 2025-10-13 12:04:41 -07:00
Owen Schwartz
7a75fe0cad Merge pull request #1658 from fosrl/dependabot/npm_and_yarn/dev-patch-updates-6f2a42a27f
Bump @types/node from 24.7.0 to 24.7.2 in the dev-patch-updates group
2025-10-13 12:03:21 -07:00
Owen Schwartz
a83e660902 Merge pull request #1659 from fosrl/dependabot/npm_and_yarn/prod-minor-updates-9b5291575b
Bump the prod-minor-updates group with 2 updates
2025-10-13 12:03:09 -07:00
Owen Schwartz
65eb3e4b95 Merge pull request #1612 from Pallavikumarimdb/fix/UI-adjustment
UI Adjustments
2025-10-13 12:02:55 -07:00
Pallavi Kumari
093fb419f3 add en-US 2025-10-14 00:28:00 +05:30
Pallavi Kumari
026e56aead fix lint 2025-10-14 00:28:00 +05:30
Pallavi Kumari
fa9bc59f62 match create resource ui with proxy ui 2025-10-14 00:28:00 +05:30
Pallavi Kumari
06ec80db42 replace dialog with credenza 2025-10-14 00:28:00 +05:30
miloschwartz
24d564b79b add advanced toggle to targets table 2025-10-14 00:28:00 +05:30
Owen
2f5e6248cd Small ui adjustments 2025-10-14 00:27:24 +05:30
Pallavi Kumari
c0cc81ed96 standardizing the targets input table 2025-10-14 00:27:24 +05:30
Pallavi Kumari
b33a54a449 remove unused 2025-10-14 00:27:24 +05:30
Pallavi Kumari
94137e587c change target config ui for create resource 2025-10-14 00:27:24 +05:30
Pallavi Kumari
a6086d3724 address input design 2025-10-14 00:27:24 +05:30
Pallavi Kumari
0a377150e3 reorder columns 2025-10-14 00:27:24 +05:30
Pallavi Kumari
d20e0a228a adjust target config ui inside create resource 2025-10-14 00:27:24 +05:30
Pallavi Kumari
ca146a1b57 adjust target config column 2025-10-14 00:27:24 +05:30
Pallavi Kumari
c7c3e3ee73 refresh button inside admin 2025-10-14 00:27:24 +05:30
Pallavi Kumari
cd27f6459c refresh button 2025-10-14 00:27:24 +05:30
Pallavi Kumari
b1e212721e refresh button for role, user, share-link, invitation table 2025-10-14 00:27:24 +05:30
Pallavi Kumari
ccd2773331 refresh button on resources page 2025-10-14 00:27:23 +05:30
Pallavi Kumari
cfa82b51fb refresh button in clients page 2025-10-14 00:27:23 +05:30
Owen
9c91a8db46 Update build process 2025-10-13 11:49:48 -07:00
miloschwartz
b160eee8d2 Merge branch 'dev' into distribution 2025-10-13 11:06:14 -07:00
miloschwartz
37ceabdf5d add enterprise license system 2025-10-13 10:41:10 -07:00
Owen
e7828a43fa Add flag for generate own certs 2025-10-13 10:32:41 -07:00
dependabot[bot]
ccb1f04ad8 Bump the prod-minor-updates group with 2 updates
Bumps the prod-minor-updates group with 2 updates: [@aws-sdk/client-s3](https://github.com/aws/aws-sdk-js-v3/tree/HEAD/clients/client-s3) and [react-hook-form](https://github.com/react-hook-form/react-hook-form).


Updates `@aws-sdk/client-s3` from 3.906.0 to 3.908.0
- [Release notes](https://github.com/aws/aws-sdk-js-v3/releases)
- [Changelog](https://github.com/aws/aws-sdk-js-v3/blob/main/clients/client-s3/CHANGELOG.md)
- [Commits](https://github.com/aws/aws-sdk-js-v3/commits/v3.908.0/clients/client-s3)

Updates `react-hook-form` from 7.64.0 to 7.65.0
- [Release notes](https://github.com/react-hook-form/react-hook-form/releases)
- [Changelog](https://github.com/react-hook-form/react-hook-form/blob/master/CHANGELOG.md)
- [Commits](https://github.com/react-hook-form/react-hook-form/compare/v7.64.0...v7.65.0)

---
updated-dependencies:
- dependency-name: "@aws-sdk/client-s3"
  dependency-version: 3.908.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: prod-minor-updates
- dependency-name: react-hook-form
  dependency-version: 7.65.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: prod-minor-updates
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-10-13 01:38:51 +00:00
dependabot[bot]
4c14ccbb63 Bump @types/node from 24.7.0 to 24.7.2 in the dev-patch-updates group
Bumps the dev-patch-updates group with 1 update: [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node).


Updates `@types/node` from 24.7.0 to 24.7.2
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

---
updated-dependencies:
- dependency-name: "@types/node"
  dependency-version: 24.7.2
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dev-patch-updates
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-10-13 01:33:47 +00:00
Owen Schwartz
25c24ca9cf Merge pull request #1639 from fosrl/dependabot/go_modules/install/prod-minor-updates-cf68330517
Bump golang.org/x/term from 0.35.0 to 0.36.0 in /install in the prod-minor-updates group
2025-10-12 17:08:31 -07:00
Owen Schwartz
787869fe21 Merge pull request #1641 from fosrl/dependabot/npm_and_yarn/prod-minor-updates-7acd695279
Bump the prod-minor-updates group with 2 updates
2025-10-12 17:08:20 -07:00
Owen Schwartz
b51c27a823 Merge pull request #1646 from fosrl/dependabot/npm_and_yarn/prod-patch-updates-942db9cd59
Bump the prod-patch-updates group across 1 directory with 3 updates
2025-10-12 17:08:11 -07:00
Owen
5917881b47 Remove dev image for now #1625 2025-10-12 17:06:41 -07:00
Owen
c7a40d59b7 Seperate managed node code to fosrl/pangolin-node 2025-10-12 16:34:36 -07:00
Owen
a50c0d84e9 Make easier to run in dev - fix a couple of things 2025-10-12 16:23:38 -07:00
Owen
f17a957058 Cleaning up more imports 2025-10-11 20:46:49 -07:00
Owen
2c63851130 Separate types & fix #private import 2025-10-11 19:02:15 -07:00
miloschwartz
6b125bba7c reject user if no policies match and remove root user in auto provision 2025-10-10 11:52:45 -07:00
Owen
d92b87b7c8 Chungus 2.0 2025-10-10 11:27:15 -07:00
miloschwartz
f64a477c3d fix spacing issue in strategy select 2025-10-09 20:21:16 -07:00
dependabot[bot]
b6f8ed1e4a Bump the prod-patch-updates group across 1 directory with 3 updates
Bumps the prod-patch-updates group with 3 updates in the / directory: [next-intl](https://github.com/amannn/next-intl), [npm](https://github.com/npm/cli) and [posthog-node](https://github.com/PostHog/posthog-js/tree/HEAD/packages/node).


Updates `next-intl` from 4.3.11 to 4.3.12
- [Release notes](https://github.com/amannn/next-intl/releases)
- [Changelog](https://github.com/amannn/next-intl/blob/main/CHANGELOG.md)
- [Commits](https://github.com/amannn/next-intl/compare/v4.3.11...v4.3.12)

Updates `npm` from 11.6.1 to 11.6.2
- [Release notes](https://github.com/npm/cli/releases)
- [Changelog](https://github.com/npm/cli/blob/latest/CHANGELOG.md)
- [Commits](https://github.com/npm/cli/compare/v11.6.1...v11.6.2)

Updates `posthog-node` from 5.9.3 to 5.9.5
- [Release notes](https://github.com/PostHog/posthog-js/releases)
- [Changelog](https://github.com/PostHog/posthog-js/blob/main/packages/node/CHANGELOG.md)
- [Commits](https://github.com/PostHog/posthog-js/commits/posthog-node@5.9.5/packages/node)

---
updated-dependencies:
- dependency-name: next-intl
  dependency-version: 4.3.12
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: prod-patch-updates
- dependency-name: npm
  dependency-version: 11.6.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: prod-patch-updates
- dependency-name: posthog-node
  dependency-version: 5.9.5
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: prod-patch-updates
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-10-10 01:21:19 +00:00
dependabot[bot]
bad88e4741 Bump the prod-minor-updates group with 2 updates
Bumps the prod-minor-updates group with 2 updates: [@aws-sdk/client-s3](https://github.com/aws/aws-sdk-js-v3/tree/HEAD/clients/client-s3) and [react-easy-sort](https://github.com/ValentinH/react-easy-sort).


Updates `@aws-sdk/client-s3` from 3.901.0 to 3.906.0
- [Release notes](https://github.com/aws/aws-sdk-js-v3/releases)
- [Changelog](https://github.com/aws/aws-sdk-js-v3/blob/main/clients/client-s3/CHANGELOG.md)
- [Commits](https://github.com/aws/aws-sdk-js-v3/commits/v3.906.0/clients/client-s3)

Updates `react-easy-sort` from 1.7.0 to 1.8.0
- [Release notes](https://github.com/ValentinH/react-easy-sort/releases)
- [Commits](https://github.com/ValentinH/react-easy-sort/compare/v1.7.0...v1.8.0)

---
updated-dependencies:
- dependency-name: "@aws-sdk/client-s3"
  dependency-version: 3.906.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: prod-minor-updates
- dependency-name: react-easy-sort
  dependency-version: 1.8.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: prod-minor-updates
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-10-09 01:26:12 +00:00
dependabot[bot]
01db519691 Bump golang.org/x/term in /install in the prod-minor-updates group
Bumps the prod-minor-updates group in /install with 1 update: [golang.org/x/term](https://github.com/golang/term).


Updates `golang.org/x/term` from 0.35.0 to 0.36.0
- [Commits](https://github.com/golang/term/compare/v0.35.0...v0.36.0)

---
updated-dependencies:
- dependency-name: golang.org/x/term
  dependency-version: 0.36.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: prod-minor-updates
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-10-09 01:22:20 +00:00
miloschwartz
e601038c0f fix role extraction in idp form 2025-10-08 17:49:30 -07:00
miloschwartz
e0996a17ef rename managed nodes 2025-10-08 17:35:08 -07:00
Owen
526307e192 Fix ssl undefined issue 2025-10-08 16:43:40 -07:00
miloschwartz
1b01c4f053 fix idp infinite redirect closes #1540 2025-10-08 14:00:26 -07:00
Owen Schwartz
a184e23f16 Merge pull request #1634 from fosrl/dependabot/npm_and_yarn/prod-minor-updates-f2d0e72ffc
Bump the prod-minor-updates group with 8 updates
2025-10-08 13:57:14 -07:00
Owen Schwartz
06156e0ca6 Merge pull request #1633 from fosrl/dependabot/npm_and_yarn/prod-patch-updates-831eaa71e3
Bump the prod-patch-updates group with 3 updates
2025-10-08 13:56:33 -07:00
Owen
02b1de3266 Make sure siteIds are numbers
Fixes PAN-145
2025-10-08 12:06:48 -07:00
Owen
c5b3d92466 Update lock 2025-10-07 21:11:29 -07:00
miloschwartz
186a78b064 Merge branch 'dev' of https://github.com/fosrl/pangolin into dev 2025-10-07 20:33:42 -07:00
miloschwartz
9a808dc139 fix invite flow 2025-10-07 20:32:44 -07:00
dependabot[bot]
977404b8c3 Bump the prod-minor-updates group with 8 updates
Bumps the prod-minor-updates group with 8 updates:

| Package | From | To |
| --- | --- | --- |
| [@aws-sdk/client-s3](https://github.com/aws/aws-sdk-js-v3/tree/HEAD/clients/client-s3) | `3.837.0` | `3.901.0` |
| [eslint](https://github.com/eslint/eslint) | `9.35.0` | `9.37.0` |
| [ioredis](https://github.com/luin/ioredis) | `5.6.1` | `5.8.1` |
| [lucide-react](https://github.com/lucide-icons/lucide/tree/HEAD/packages/lucide-react) | `0.544.0` | `0.545.0` |
| [react](https://github.com/facebook/react/tree/HEAD/packages/react) | `19.1.1` | `19.2.0` |
| [react-dom](https://github.com/facebook/react/tree/HEAD/packages/react-dom) | `19.1.1` | `19.2.0` |
| [react-hook-form](https://github.com/react-hook-form/react-hook-form) | `7.62.0` | `7.64.0` |
| [winston](https://github.com/winstonjs/winston) | `3.17.0` | `3.18.3` |


Updates `@aws-sdk/client-s3` from 3.837.0 to 3.901.0
- [Release notes](https://github.com/aws/aws-sdk-js-v3/releases)
- [Changelog](https://github.com/aws/aws-sdk-js-v3/blob/main/clients/client-s3/CHANGELOG.md)
- [Commits](https://github.com/aws/aws-sdk-js-v3/commits/v3.901.0/clients/client-s3)

Updates `eslint` from 9.35.0 to 9.37.0
- [Release notes](https://github.com/eslint/eslint/releases)
- [Commits](https://github.com/eslint/eslint/compare/v9.35.0...v9.37.0)

Updates `ioredis` from 5.6.1 to 5.8.1
- [Release notes](https://github.com/luin/ioredis/releases)
- [Changelog](https://github.com/redis/ioredis/blob/main/CHANGELOG.md)
- [Commits](https://github.com/luin/ioredis/compare/v5.6.1...v5.8.1)

Updates `lucide-react` from 0.544.0 to 0.545.0
- [Release notes](https://github.com/lucide-icons/lucide/releases)
- [Commits](https://github.com/lucide-icons/lucide/commits/0.545.0/packages/lucide-react)

Updates `react` from 19.1.1 to 19.2.0
- [Release notes](https://github.com/facebook/react/releases)
- [Changelog](https://github.com/facebook/react/blob/main/CHANGELOG.md)
- [Commits](https://github.com/facebook/react/commits/v19.2.0/packages/react)

Updates `react-dom` from 19.1.1 to 19.2.0
- [Release notes](https://github.com/facebook/react/releases)
- [Changelog](https://github.com/facebook/react/blob/main/CHANGELOG.md)
- [Commits](https://github.com/facebook/react/commits/v19.2.0/packages/react-dom)

Updates `react-hook-form` from 7.62.0 to 7.64.0
- [Release notes](https://github.com/react-hook-form/react-hook-form/releases)
- [Changelog](https://github.com/react-hook-form/react-hook-form/blob/master/CHANGELOG.md)
- [Commits](https://github.com/react-hook-form/react-hook-form/compare/v7.62.0...v7.64.0)

Updates `winston` from 3.17.0 to 3.18.3
- [Release notes](https://github.com/winstonjs/winston/releases)
- [Changelog](https://github.com/winstonjs/winston/blob/master/CHANGELOG.md)
- [Commits](https://github.com/winstonjs/winston/compare/v3.17.0...v3.18.3)

---
updated-dependencies:
- dependency-name: "@aws-sdk/client-s3"
  dependency-version: 3.901.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: prod-minor-updates
- dependency-name: eslint
  dependency-version: 9.37.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: prod-minor-updates
- dependency-name: ioredis
  dependency-version: 5.8.1
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: prod-minor-updates
- dependency-name: lucide-react
  dependency-version: 0.545.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: prod-minor-updates
- dependency-name: react
  dependency-version: 19.2.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: prod-minor-updates
- dependency-name: react-dom
  dependency-version: 19.2.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: prod-minor-updates
- dependency-name: react-hook-form
  dependency-version: 7.64.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: prod-minor-updates
- dependency-name: winston
  dependency-version: 3.18.3
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: prod-minor-updates
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-10-08 01:29:00 +00:00
dependabot[bot]
b00143ce9b Bump the prod-patch-updates group with 3 updates
Bumps the prod-patch-updates group with 3 updates: [next-intl](https://github.com/amannn/next-intl), [nodemailer](https://github.com/nodemailer/nodemailer) and [semver](https://github.com/npm/node-semver).


Updates `next-intl` from 4.3.9 to 4.3.11
- [Release notes](https://github.com/amannn/next-intl/releases)
- [Changelog](https://github.com/amannn/next-intl/blob/main/CHANGELOG.md)
- [Commits](https://github.com/amannn/next-intl/compare/v4.3.9...v4.3.11)

Updates `nodemailer` from 7.0.7 to 7.0.9
- [Release notes](https://github.com/nodemailer/nodemailer/releases)
- [Changelog](https://github.com/nodemailer/nodemailer/blob/master/CHANGELOG.md)
- [Commits](https://github.com/nodemailer/nodemailer/compare/v7.0.7...v7.0.9)

Updates `semver` from 7.7.2 to 7.7.3
- [Release notes](https://github.com/npm/node-semver/releases)
- [Changelog](https://github.com/npm/node-semver/blob/main/CHANGELOG.md)
- [Commits](https://github.com/npm/node-semver/compare/v7.7.2...v7.7.3)

---
updated-dependencies:
- dependency-name: next-intl
  dependency-version: 4.3.11
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: prod-patch-updates
- dependency-name: nodemailer
  dependency-version: 7.0.9
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: prod-patch-updates
- dependency-name: semver
  dependency-version: 7.7.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: prod-patch-updates
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-10-08 01:25:17 +00:00
Owen
4435d9a248 Merge branch 'dev' 2025-10-07 15:08:32 -07:00
Owen
7d0303e2be Add postgres pool info to config 2025-10-07 15:06:42 -07:00
Owen Schwartz
a0da9c1129 Merge pull request #1625 from Lokowitz/add-dev-images
Add docker dev image creation workflow for PRs
2025-10-07 12:15:54 -07:00
Owen Schwartz
5e73690570 Merge pull request #1627 from fosrl/dependabot/npm_and_yarn/prod-patch-updates-d783df5103
Bump the prod-patch-updates group with 7 updates
2025-10-06 21:32:14 -07:00
Owen Schwartz
b0409b7d52 Merge pull request #1626 from fosrl/dependabot/npm_and_yarn/dev-minor-updates-75f37cbce1
Bump the dev-minor-updates group with 4 updates
2025-10-06 21:32:02 -07:00
dependabot[bot]
fe474b3989 Bump the prod-patch-updates group with 7 updates
Bumps the prod-patch-updates group with 7 updates:

| Package | From | To |
| --- | --- | --- |
| [@react-email/components](https://github.com/resend/react-email/tree/HEAD/packages/components) | `0.5.5` | `0.5.6` |
| [@react-email/render](https://github.com/resend/react-email/tree/HEAD/packages/render) | `1.3.1` | `1.3.2` |
| [@simplewebauthn/browser](https://github.com/MasterKale/SimpleWebAuthn/tree/HEAD/packages/browser) | `13.2.0` | `13.2.2` |
| [@simplewebauthn/server](https://github.com/MasterKale/SimpleWebAuthn/tree/HEAD/packages/server) | `13.2.1` | `13.2.2` |
| [nodemailer](https://github.com/nodemailer/nodemailer) | `7.0.6` | `7.0.7` |
| [posthog-node](https://github.com/PostHog/posthog-js/tree/HEAD/packages/node) | `5.9.2` | `5.9.3` |
| [resend](https://github.com/resendlabs/resend-node) | `6.1.1` | `6.1.2` |


Updates `@react-email/components` from 0.5.5 to 0.5.6
- [Release notes](https://github.com/resend/react-email/releases)
- [Changelog](https://github.com/resend/react-email/blob/canary/packages/components/CHANGELOG.md)
- [Commits](https://github.com/resend/react-email/commits/@react-email/components@0.5.6/packages/components)

Updates `@react-email/render` from 1.3.1 to 1.3.2
- [Release notes](https://github.com/resend/react-email/releases)
- [Changelog](https://github.com/resend/react-email/blob/canary/packages/render/CHANGELOG.md)
- [Commits](https://github.com/resend/react-email/commits/@react-email/render@1.3.2/packages/render)

Updates `@simplewebauthn/browser` from 13.2.0 to 13.2.2
- [Release notes](https://github.com/MasterKale/SimpleWebAuthn/releases)
- [Changelog](https://github.com/MasterKale/SimpleWebAuthn/blob/master/CHANGELOG.md)
- [Commits](https://github.com/MasterKale/SimpleWebAuthn/commits/v13.2.2/packages/browser)

Updates `@simplewebauthn/server` from 13.2.1 to 13.2.2
- [Release notes](https://github.com/MasterKale/SimpleWebAuthn/releases)
- [Changelog](https://github.com/MasterKale/SimpleWebAuthn/blob/master/CHANGELOG.md)
- [Commits](https://github.com/MasterKale/SimpleWebAuthn/commits/v13.2.2/packages/server)

Updates `nodemailer` from 7.0.6 to 7.0.7
- [Release notes](https://github.com/nodemailer/nodemailer/releases)
- [Changelog](https://github.com/nodemailer/nodemailer/blob/master/CHANGELOG.md)
- [Commits](https://github.com/nodemailer/nodemailer/compare/v7.0.6...v7.0.7)

Updates `posthog-node` from 5.9.2 to 5.9.3
- [Release notes](https://github.com/PostHog/posthog-js/releases)
- [Changelog](https://github.com/PostHog/posthog-js/blob/main/packages/node/CHANGELOG.md)
- [Commits](https://github.com/PostHog/posthog-js/commits/posthog-node@5.9.3/packages/node)

Updates `resend` from 6.1.1 to 6.1.2
- [Release notes](https://github.com/resendlabs/resend-node/releases)
- [Commits](https://github.com/resendlabs/resend-node/compare/v6.1.1...v6.1.2)

---
updated-dependencies:
- dependency-name: "@react-email/components"
  dependency-version: 0.5.6
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: prod-patch-updates
- dependency-name: "@react-email/render"
  dependency-version: 1.3.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: prod-patch-updates
- dependency-name: "@simplewebauthn/browser"
  dependency-version: 13.2.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: prod-patch-updates
- dependency-name: "@simplewebauthn/server"
  dependency-version: 13.2.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: prod-patch-updates
- dependency-name: nodemailer
  dependency-version: 7.0.7
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: prod-patch-updates
- dependency-name: posthog-node
  dependency-version: 5.9.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: prod-patch-updates
- dependency-name: resend
  dependency-version: 6.1.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: prod-patch-updates
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-10-07 01:28:25 +00:00
dependabot[bot]
5154d5d3ee Bump the dev-minor-updates group with 4 updates
Bumps the dev-minor-updates group with 4 updates: [@react-email/preview-server](https://github.com/resend/react-email/tree/HEAD/packages/preview-server), [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node), [react-email](https://github.com/resend/react-email/tree/HEAD/packages/react-email) and [typescript-eslint](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/typescript-eslint).


Updates `@react-email/preview-server` from 4.2.12 to 4.3.0
- [Release notes](https://github.com/resend/react-email/releases)
- [Changelog](https://github.com/resend/react-email/blob/canary/packages/preview-server/CHANGELOG.md)
- [Commits](https://github.com/resend/react-email/commits/@react-email/preview-server@4.3.0/packages/preview-server)

Updates `@types/node` from 24.6.2 to 24.7.0
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

Updates `react-email` from 4.2.12 to 4.3.0
- [Release notes](https://github.com/resend/react-email/releases)
- [Changelog](https://github.com/resend/react-email/blob/canary/packages/react-email/CHANGELOG.md)
- [Commits](https://github.com/resend/react-email/commits/react-email@4.3.0/packages/react-email)

Updates `typescript-eslint` from 8.45.0 to 8.46.0
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/typescript-eslint/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.46.0/packages/typescript-eslint)

---
updated-dependencies:
- dependency-name: "@react-email/preview-server"
  dependency-version: 4.3.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: dev-minor-updates
- dependency-name: "@types/node"
  dependency-version: 24.7.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: dev-minor-updates
- dependency-name: react-email
  dependency-version: 4.3.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: dev-minor-updates
- dependency-name: typescript-eslint
  dependency-version: 8.46.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: dev-minor-updates
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-10-07 01:23:26 +00:00
Marvin
62df92f63a Update dev-image.yml 2025-10-06 21:37:22 +02:00
Marvin
e2534af40e Create dev-image.yml 2025-10-06 20:42:24 +02:00
Owen
b627e391ac Add tsc test 2025-10-06 11:29:34 -07:00
Owen
40a3eac704 Adjust tag match to exclude s. 2025-10-06 11:28:26 -07:00
Owen Schwartz
2ee3f10e02 Merge pull request #1522 from jln-brtn/feature-header-authentication
Feature HTTP Basic Authentication support  #226 #937
2025-10-06 11:14:46 -07:00
Owen
5a3bf2f758 Fix import issue 2025-10-06 11:06:41 -07:00
Owen
e121dd0d1d Add to blueprints 2025-10-06 11:02:08 -07:00
Owen
2c46a37a53 Include in hybrid 2025-10-06 10:31:31 -07:00
Owen
23f05d7f4e Add translations to EN 2025-10-06 10:20:01 -07:00
Owen
6105eea7a9 Fix rebase 2025-10-06 10:16:29 -07:00
Owen
850e9a734a Adding HTTP Header Authentication 2025-10-06 10:14:02 -07:00
dependabot[bot]
2d30b155f2 Bump @types/node from 24.6.1 to 24.6.2 in the dev-patch-updates group
Bumps the dev-patch-updates group with 1 update: [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node).


Updates `@types/node` from 24.6.1 to 24.6.2
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

---
updated-dependencies:
- dependency-name: "@types/node"
  dependency-version: 24.6.2
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dev-patch-updates
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-10-06 09:55:35 -07:00
dependabot[bot]
1333e21553 Bump @react-email/preview-server in the dev-minor-updates group
Bumps the dev-minor-updates group with 1 update: [@react-email/preview-server](https://github.com/resend/react-email/tree/HEAD/packages/preview-server).


Updates `@react-email/preview-server` from 4.1.0 to 4.2.12
- [Release notes](https://github.com/resend/react-email/releases)
- [Changelog](https://github.com/resend/react-email/blob/canary/packages/preview-server/CHANGELOG.md)
- [Commits](https://github.com/resend/react-email/commits/@react-email/preview-server@4.2.12/packages/preview-server)

---
updated-dependencies:
- dependency-name: "@react-email/preview-server"
  dependency-version: 4.2.12
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: dev-minor-updates
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-10-06 09:55:35 -07:00
Owen
4c412528f5 Clean up and copy to getTraefikConfig 2025-10-06 09:55:35 -07:00
OddMagnet
a8fce47ba0 Update traefik dynamic config to also use resource name 2025-10-06 09:55:35 -07:00
Owen Schwartz
cb7c57fd03 Merge pull request #1621 from fosrl/dependabot/npm_and_yarn/dev-patch-updates-5e2570e910
Bump @types/node from 24.6.1 to 24.6.2 in the dev-patch-updates group
2025-10-06 09:52:18 -07:00
Owen Schwartz
494d0f7c14 Merge pull request #1622 from fosrl/dependabot/npm_and_yarn/dev-minor-updates-44a7c5045b
Bump @react-email/preview-server from 4.1.0 to 4.2.12 in the dev-minor-updates group
2025-10-06 09:52:07 -07:00
Owen Schwartz
a4e480e02b Merge pull request #1539 from OddMagnet/feature-add-resource-name-to-resource-id
[Feature] Update traefik dynamic config to also use resource name
2025-10-06 09:51:22 -07:00
Owen
cd285cc019 Clean up and copy to getTraefikConfig 2025-10-06 09:50:18 -07:00
OddMagnet
9e8e00d4bb Update traefik dynamic config to also use resource name 2025-10-06 17:33:08 +02:00
dependabot[bot]
389834f735 Bump @react-email/preview-server in the dev-minor-updates group
Bumps the dev-minor-updates group with 1 update: [@react-email/preview-server](https://github.com/resend/react-email/tree/HEAD/packages/preview-server).


Updates `@react-email/preview-server` from 4.1.0 to 4.2.12
- [Release notes](https://github.com/resend/react-email/releases)
- [Changelog](https://github.com/resend/react-email/blob/canary/packages/preview-server/CHANGELOG.md)
- [Commits](https://github.com/resend/react-email/commits/@react-email/preview-server@4.2.12/packages/preview-server)

---
updated-dependencies:
- dependency-name: "@react-email/preview-server"
  dependency-version: 4.2.12
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: dev-minor-updates
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-10-06 01:26:52 +00:00
dependabot[bot]
b14ddc07fb Bump @types/node from 24.6.1 to 24.6.2 in the dev-patch-updates group
Bumps the dev-patch-updates group with 1 update: [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node).


Updates `@types/node` from 24.6.1 to 24.6.2
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

---
updated-dependencies:
- dependency-name: "@types/node"
  dependency-version: 24.6.2
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dev-patch-updates
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-10-06 01:24:59 +00:00
Owen Schwartz
4447fb8202 Merge pull request #1459 from SigmaSquadron/revert-1281-push-nymutulytrsq
Revert "fix: change default integration_api to 3004"
2025-10-05 17:41:15 -07:00
Owen Schwartz
1c9c4b1802 Merge pull request #1619 from fosrl/crowdin_dev
New Crowdin updates
2025-10-05 17:19:23 -07:00
Owen Schwartz
19e15f4ef5 New translations en-us.json (Chinese Simplified) 2025-10-05 17:16:34 -07:00
Owen Schwartz
c2c29e2cd2 New translations en-us.json (Portuguese) 2025-10-05 17:16:31 -07:00
Owen Schwartz
7b33dc591d New translations en-us.json (Dutch) 2025-10-05 17:16:29 -07:00
Owen Schwartz
a95f2e76f4 New translations en-us.json (Italian) 2025-10-05 17:16:27 -07:00
Owen Schwartz
979860a951 New translations en-us.json (Czech) 2025-10-05 17:16:25 -07:00
Owen Schwartz
9e9a81d9e8 New translations en-us.json (Bulgarian) 2025-10-05 17:16:24 -07:00
Owen Schwartz
8f09561114 Merge pull request #1592 from Pallavikumarimdb/ordered-priority-in-path-routing-rules
Add ordered priority for path-based routing rules
2025-10-05 17:10:26 -07:00
miloschwartz
b167d94ead update cors to check array 2025-10-05 16:50:46 -07:00
Owen
e4c0a157e3 Add to oss traefik config and fix create/update 2025-10-05 15:46:46 -07:00
miloschwartz
956869ab58 add strip duplicate sesion middleware 2025-10-05 15:41:05 -07:00
Owen
e5f4da9a99 Fix lint errors 2025-10-05 15:22:54 -07:00
miloschwartz
9649d9a46b fix redirect issue in firefox and safari 2025-10-05 14:59:46 -07:00
Pallavi Kumari
22477b7e81 add removed rewrite schema 2025-10-06 02:16:06 +05:30
Pallavi Kumari
b6c76a2164 add priority type 2025-10-06 02:08:41 +05:30
Pallavi Kumari
043834274d fix priority inside blueprints 2025-10-06 02:08:41 +05:30
Owen
1e4ca69c89 priority add for traefik config setup 2025-10-06 02:08:41 +05:30
Owen
ff2bcfb0e7 backend setup 2025-10-06 02:08:41 +05:30
Owen
b47fc9f901 frontend for ordered priority 2025-10-06 02:08:41 +05:30
Owen Schwartz
165f4023d0 Merge pull request #1617 from fosrl/crowdin_dev
New Crowdin updates
2025-10-05 10:59:34 -07:00
Owen
d51053ce86 Merge branch 'main' into dev 2025-10-05 10:57:15 -07:00
Owen Schwartz
229872589c Merge pull request #1608 from iconoclasthero/patch-logger-docker
Patch logger for ISO8601 TZ offsets and Docker build fix
2025-10-05 10:52:51 -07:00
Owen
e4c47c46a6 Restore npm ci and add tzdata 2025-10-05 10:48:34 -07:00
Owen
84fe2fb92e Remove domains from price 2025-10-05 10:36:59 -07:00
miloschwartz
076912c648 fix hostname in set cookie 2025-10-05 10:26:14 -07:00
Owen Schwartz
033653e234 New translations en-us.json (Spanish) 2025-10-04 22:17:09 -07:00
Owen Schwartz
0624087373 New translations en-us.json (Norwegian Bokmal) 2025-10-04 22:17:08 -07:00
Owen Schwartz
346d886f8a New translations en-us.json (Chinese Simplified) 2025-10-04 22:17:06 -07:00
Owen Schwartz
67ac01b31a New translations en-us.json (Turkish) 2025-10-04 22:17:05 -07:00
Owen Schwartz
87f1cf6730 New translations en-us.json (Russian) 2025-10-04 22:17:04 -07:00
Owen Schwartz
0f46651500 New translations en-us.json (Portuguese) 2025-10-04 22:17:03 -07:00
Owen Schwartz
65bf055e0f New translations en-us.json (Polish) 2025-10-04 22:17:01 -07:00
Owen Schwartz
4c995f786b New translations en-us.json (Dutch) 2025-10-04 22:17:00 -07:00
Owen Schwartz
4853c8c872 New translations en-us.json (Korean) 2025-10-04 22:16:59 -07:00
Owen Schwartz
170da08001 New translations en-us.json (Italian) 2025-10-04 22:16:58 -07:00
Owen Schwartz
a39a133ee5 New translations en-us.json (German) 2025-10-04 22:16:57 -07:00
Owen Schwartz
1251b1e870 New translations en-us.json (Czech) 2025-10-04 22:16:56 -07:00
Owen Schwartz
418120196f New translations en-us.json (Bulgarian) 2025-10-04 22:16:55 -07:00
Owen Schwartz
759661420e New translations en-us.json (French) 2025-10-04 22:16:53 -07:00
Owen
bb28f856da Merge branch 'main' into dev 2025-10-04 21:32:50 -07:00
Owen Schwartz
f90e6bef9e New translations en-us.json (Spanish) 2025-10-04 21:10:27 -07:00
Owen Schwartz
cabaa2e6d6 New translations en-us.json (Norwegian Bokmal) 2025-10-04 21:10:26 -07:00
Owen Schwartz
c8bddd4289 New translations en-us.json (Chinese Simplified) 2025-10-04 21:10:25 -07:00
Owen Schwartz
71ba980757 New translations en-us.json (Turkish) 2025-10-04 21:10:24 -07:00
Owen Schwartz
38c3c49778 New translations en-us.json (Russian) 2025-10-04 21:10:23 -07:00
Owen Schwartz
ab7ac9cb60 New translations en-us.json (Portuguese) 2025-10-04 21:10:22 -07:00
Owen Schwartz
e4787924e7 New translations en-us.json (Polish) 2025-10-04 21:10:21 -07:00
Owen Schwartz
3385a92b0f New translations en-us.json (Dutch) 2025-10-04 21:10:20 -07:00
Owen Schwartz
e73e6956a5 New translations en-us.json (Korean) 2025-10-04 21:10:19 -07:00
Owen Schwartz
024eb2b157 New translations en-us.json (Italian) 2025-10-04 21:10:18 -07:00
Owen Schwartz
ccff0592ca New translations en-us.json (German) 2025-10-04 21:10:17 -07:00
Owen Schwartz
942f7c2bc9 New translations en-us.json (Czech) 2025-10-04 21:10:16 -07:00
Owen Schwartz
b3a6cd0660 New translations en-us.json (Bulgarian) 2025-10-04 21:10:15 -07:00
Owen Schwartz
c5569fccf1 New translations en-us.json (French) 2025-10-04 21:10:14 -07:00
Owen
cc7c443145 Update test 2025-10-04 21:07:59 -07:00
Owen
8d7e5baf9d Update ignore 2025-10-04 21:02:30 -07:00
miloschwartz
ed64d4b5ae update gitignore 2025-10-04 21:01:15 -07:00
Owen
8fe42bc6aa Update gitignore 2025-10-04 20:57:32 -07:00
Owen
a67aa3852d Remove config 2025-10-04 20:57:11 -07:00
Owen
c2c907852d Chungus 2025-10-04 18:36:44 -07:00
Owen Schwartz
3123f858bb Merge pull request #1611 from fosrl/crowdin_dev
New Crowdin updates
2025-10-04 16:53:42 -07:00
Owen Schwartz
6a18369891 New translations en-us.json (Spanish) 2025-10-03 19:07:44 -07:00
Owen Schwartz
0f4ef40600 New translations en-us.json (Norwegian Bokmal) 2025-10-03 19:07:43 -07:00
Owen Schwartz
42a7fb949a New translations en-us.json (Chinese Simplified) 2025-10-03 19:07:42 -07:00
Owen Schwartz
bbfa6e9c82 New translations en-us.json (Turkish) 2025-10-03 19:07:40 -07:00
Owen Schwartz
0d8ae0d615 New translations en-us.json (Russian) 2025-10-03 19:07:39 -07:00
Owen Schwartz
7bbbc88c34 New translations en-us.json (Portuguese) 2025-10-03 19:07:38 -07:00
Owen Schwartz
e2ad197d7e New translations en-us.json (Polish) 2025-10-03 19:07:37 -07:00
Owen Schwartz
ca8f52d304 New translations en-us.json (Dutch) 2025-10-03 19:07:35 -07:00
Owen Schwartz
7395a64b26 New translations en-us.json (Korean) 2025-10-03 19:07:34 -07:00
Owen Schwartz
4dd672a590 New translations en-us.json (Italian) 2025-10-03 19:07:33 -07:00
Owen Schwartz
cff3f739db New translations en-us.json (German) 2025-10-03 19:07:32 -07:00
Owen Schwartz
7fb35cfebb New translations en-us.json (Czech) 2025-10-03 19:07:30 -07:00
Owen Schwartz
ddfda31924 New translations en-us.json (Bulgarian) 2025-10-03 19:07:29 -07:00
Owen Schwartz
353e085b0e New translations en-us.json (French) 2025-10-03 19:07:28 -07:00
Owen Schwartz
989b548ef9 Merge pull request #1580 from Pallavikumarimdb/feature/path-rewriting-rules
Rules for rewriting requests to another path
2025-10-03 18:16:56 -07:00
Owen Schwartz
8f60e7e200 Merge pull request #1597 from fosrl/crowdin_dev
New Crowdin updates
2025-10-03 17:59:00 -07:00
Owen Schwartz
ec74525fde Merge pull request #1605 from fosrl/dependabot/npm_and_yarn/prod-patch-updates-f04ca2729e
Bump the prod-patch-updates group across 1 directory with 5 updates
2025-10-03 17:51:16 -07:00
Owen Schwartz
a317c50737 Merge pull request #1602 from fosrl/dependabot/npm_and_yarn/dev-patch-updates-bfc23b1742
Bump the dev-patch-updates group across 1 directory with 4 updates
2025-10-03 17:51:03 -07:00
Owen Schwartz
c62b46268a Merge pull request #1610 from Pallavikumarimdb/fix/QR-code-issue-on-dark-themes
Set the QR code background to white in dark mode.
2025-10-03 17:50:34 -07:00
Pallavi Kumari
42ef075d4f white background 2025-10-03 20:42:58 +05:30
iconoclast hero
f52605289b Patch logger for ISO8601 TZ offsets and fix Docker build
- server/logger.ts: timestamps now use local TZ offset instead of Z
- Dockerfile: replaced 'npm ci --omit=dev' with 'npm install --omit=dev' to fix Alpine build failure
- References discussion: https://github.com/orgs/fosrl/discussions/1025
- Note: timestamps default to +00:00 (UTC) unless the user sets environment: TZ=<timezone> in docker-compose.yaml

Optional future improvement: include tzdata in the container for shell/date consistency.
2025-10-03 09:33:43 -04:00
iconoclast hero
68e0911866 Patch logger for ISO8601 TZ offsets and fix Docker build
- server/logger.ts: timestamps now use local TZ offset instead of Z
- Dockerfile: replaced 'npm ci --omit=dev' with 'npm install --omit=dev' to fix Alpine build failure
- References discussion: https://github.com/orgs/fosrl/discussions/1025
- Note: timestamps default to +00:00 (UTC) unless the user sets environment: TZ=<timezone> in docker-compose.yaml

Optional future improvement: include tzdata in the container for shell/date consistency.
2025-10-03 09:25:45 -04:00
dependabot[bot]
756fcbb590 Bump the prod-patch-updates group across 1 directory with 5 updates
Bumps the prod-patch-updates group with 5 updates in the / directory:

| Package | From | To |
| --- | --- | --- |
| [@react-email/components](https://github.com/resend/react-email/tree/HEAD/packages/components) | `0.5.3` | `0.5.5` |
| [drizzle-orm](https://github.com/drizzle-team/drizzle-orm) | `0.44.5` | `0.44.6` |
| [eslint-config-next](https://github.com/vercel/next.js/tree/HEAD/packages/eslint-config-next) | `15.5.3` | `15.5.4` |
| [next](https://github.com/vercel/next.js) | `15.5.3` | `15.5.4` |
| [npm](https://github.com/npm/cli) | `11.6.0` | `11.6.1` |



Updates `@react-email/components` from 0.5.3 to 0.5.5
- [Release notes](https://github.com/resend/react-email/releases)
- [Changelog](https://github.com/resend/react-email/blob/canary/packages/components/CHANGELOG.md)
- [Commits](https://github.com/resend/react-email/commits/@react-email/components@0.5.5/packages/components)

Updates `drizzle-orm` from 0.44.5 to 0.44.6
- [Release notes](https://github.com/drizzle-team/drizzle-orm/releases)
- [Commits](https://github.com/drizzle-team/drizzle-orm/compare/0.44.5...0.44.6)

Updates `eslint-config-next` from 15.5.3 to 15.5.4
- [Release notes](https://github.com/vercel/next.js/releases)
- [Changelog](https://github.com/vercel/next.js/blob/canary/release.js)
- [Commits](https://github.com/vercel/next.js/commits/v15.5.4/packages/eslint-config-next)

Updates `next` from 15.5.3 to 15.5.4
- [Release notes](https://github.com/vercel/next.js/releases)
- [Changelog](https://github.com/vercel/next.js/blob/canary/release.js)
- [Commits](https://github.com/vercel/next.js/compare/v15.5.3...v15.5.4)

Updates `npm` from 11.6.0 to 11.6.1
- [Release notes](https://github.com/npm/cli/releases)
- [Changelog](https://github.com/npm/cli/blob/latest/CHANGELOG.md)
- [Commits](https://github.com/npm/cli/compare/v11.6.0...v11.6.1)

---
updated-dependencies:
- dependency-name: "@react-email/components"
  dependency-version: 0.5.5
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: prod-patch-updates
- dependency-name: drizzle-orm
  dependency-version: 0.44.6
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: prod-patch-updates
- dependency-name: eslint-config-next
  dependency-version: 15.5.4
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: prod-patch-updates
- dependency-name: next
  dependency-version: 15.5.4
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: prod-patch-updates
- dependency-name: npm
  dependency-version: 11.6.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: prod-patch-updates
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-10-03 01:21:48 +00:00
dependabot[bot]
a49d900951 Bump the dev-patch-updates group across 1 directory with 4 updates
Bumps the dev-patch-updates group with 3 updates in the / directory: [@tailwindcss/postcss](https://github.com/tailwindlabs/tailwindcss/tree/HEAD/packages/@tailwindcss-postcss), [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) and [typescript](https://github.com/microsoft/TypeScript).


Updates `@tailwindcss/postcss` from 4.1.13 to 4.1.14
- [Release notes](https://github.com/tailwindlabs/tailwindcss/releases)
- [Changelog](https://github.com/tailwindlabs/tailwindcss/blob/main/CHANGELOG.md)
- [Commits](https://github.com/tailwindlabs/tailwindcss/commits/v4.1.14/packages/@tailwindcss-postcss)

Updates `@types/node` from 24.6.0 to 24.6.1
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

Updates `tailwindcss` from 4.1.13 to 4.1.14
- [Release notes](https://github.com/tailwindlabs/tailwindcss/releases)
- [Changelog](https://github.com/tailwindlabs/tailwindcss/blob/main/CHANGELOG.md)
- [Commits](https://github.com/tailwindlabs/tailwindcss/commits/v4.1.14/packages/tailwindcss)

Updates `typescript` from 5.9.2 to 5.9.3
- [Release notes](https://github.com/microsoft/TypeScript/releases)
- [Changelog](https://github.com/microsoft/TypeScript/blob/main/azure-pipelines.release-publish.yml)
- [Commits](https://github.com/microsoft/TypeScript/compare/v5.9.2...v5.9.3)

---
updated-dependencies:
- dependency-name: "@tailwindcss/postcss"
  dependency-version: 4.1.14
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dev-patch-updates
- dependency-name: "@types/node"
  dependency-version: 24.6.1
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dev-patch-updates
- dependency-name: tailwindcss
  dependency-version: 4.1.14
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dev-patch-updates
- dependency-name: typescript
  dependency-version: 5.9.3
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dev-patch-updates
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-10-02 01:18:15 +00:00
Owen Schwartz
38f212d632 New translations en-us.json (Dutch) 2025-10-01 14:02:59 -07:00
Owen Schwartz
204fdfd233 New translations en-us.json (Dutch) 2025-10-01 12:45:15 -07:00
Owen
b5e04e8111 Add exit node name 2025-10-01 09:49:29 -07:00
Owen Schwartz
21fc829766 New translations en-us.json (Norwegian Bokmal) 2025-10-01 01:02:51 -07:00
Owen Schwartz
39851c3412 New translations en-us.json (Chinese Simplified) 2025-10-01 01:02:50 -07:00
Owen Schwartz
21811465b6 New translations en-us.json (Turkish) 2025-10-01 01:02:48 -07:00
Owen Schwartz
7574726815 New translations en-us.json (Russian) 2025-10-01 01:02:47 -07:00
Owen Schwartz
236e0f9ab6 New translations en-us.json (Portuguese) 2025-10-01 01:02:46 -07:00
Owen Schwartz
8e95f0b73f New translations en-us.json (Polish) 2025-10-01 01:02:44 -07:00
Owen Schwartz
bed45a5fbd New translations en-us.json (Dutch) 2025-10-01 01:02:43 -07:00
Owen Schwartz
c50c2e2b01 New translations en-us.json (Korean) 2025-10-01 01:02:42 -07:00
Owen Schwartz
adf982fcd6 New translations en-us.json (Italian) 2025-10-01 01:02:41 -07:00
Owen Schwartz
9b4103be75 New translations en-us.json (German) 2025-10-01 01:02:39 -07:00
Owen Schwartz
672eec0c33 New translations en-us.json (Czech) 2025-10-01 01:02:38 -07:00
Owen Schwartz
0d8c06595e New translations en-us.json (Bulgarian) 2025-10-01 01:02:37 -07:00
Owen Schwartz
a5a7ca5fcc New translations en-us.json (French) 2025-10-01 01:02:35 -07:00
Pallavi Kumari
8767d20c47 add missing path / validation 2025-10-01 13:06:09 +05:30
Owen
4cbf3fffb1 Quiet up logs 2025-10-01 13:06:09 +05:30
Owen
51fad19d0d Sanitize all keys 2025-10-01 13:06:09 +05:30
Pallavi Kumari
664aa6ed2a update blueprints 2025-10-01 13:06:09 +05:30
Pallavi Kumari
574cd2a754 make rewrite data null if no match added 2025-10-01 13:06:09 +05:30
Pallavi Kumari
1b34ee7369 match and rewrite path ui improve for create resource 2025-10-01 13:06:09 +05:30
Pallavi Kumari
7b2f1dd4c6 button fix 2025-10-01 13:06:09 +05:30
Pallavi Kumari
a97b6efe9c redesign path match and rewrite modal 2025-10-01 13:06:09 +05:30
Pallavi Kumari
3722b67724 preserves the rest of the path after the matched prefix 2025-10-01 13:06:09 +05:30
Pallavi Kumari
218a5ec9e4 fix traefik config file 2025-10-01 13:06:09 +05:30
Pallavi Kumari
90d3ac07a9 add rewrite path to create resource page 2025-10-01 13:06:09 +05:30
Pallavi Kumari
149a4b916b basic setup for rewriting requests to another path 2025-10-01 13:06:08 +05:30
Owen
70914e836f Add headers description 2025-09-30 21:46:44 -07:00
Owen
a2dae8aa13 Fix updating sites on exit nodes 2025-09-30 17:34:26 -07:00
Owen
b6ea0808e4 Merge branch 'dev' of github.com:fosrl/pangolin into dev 2025-09-30 14:00:27 -07:00
Owen
089e43e1ce Update migration 2025-09-30 13:59:12 -07:00
Owen Schwartz
42936ab8dc Merge pull request #1594 from fosrl/dependabot/npm_and_yarn/dev-patch-updates-cccdb78c39
Bump the dev-patch-updates group across 1 directory with 2 updates
2025-09-30 13:50:45 -07:00
dependabot[bot]
411fa9345f Bump the dev-patch-updates group across 1 directory with 2 updates
Bumps the dev-patch-updates group with 2 updates in the / directory: [@types/nodemailer](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/nodemailer) and [@types/react](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/react).


Updates `@types/nodemailer` from 7.0.1 to 7.0.2
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/nodemailer)

Updates `@types/react` from 19.1.15 to 19.1.16
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/react)

---
updated-dependencies:
- dependency-name: "@types/nodemailer"
  dependency-version: 7.0.2
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dev-patch-updates
- dependency-name: "@types/react"
  dependency-version: 19.1.16
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dev-patch-updates
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-09-30 19:25:14 +00:00
Owen Schwartz
336e118096 Merge pull request #1591 from fosrl/dependabot/npm_and_yarn/dev-minor-updates-308b41d39d
Bump the dev-minor-updates group with 2 updates
2025-09-30 12:23:17 -07:00
dependabot[bot]
d1707801bf Bump the dev-minor-updates group with 2 updates
Bumps the dev-minor-updates group with 2 updates: [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) and [typescript-eslint](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/typescript-eslint).


Updates `@types/node` from 24.5.2 to 24.6.0
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

Updates `typescript-eslint` from 8.44.1 to 8.45.0
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/typescript-eslint/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.45.0/packages/typescript-eslint)

---
updated-dependencies:
- dependency-name: "@types/node"
  dependency-version: 24.6.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: dev-minor-updates
- dependency-name: typescript-eslint
  dependency-version: 8.45.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: dev-minor-updates
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-09-30 03:40:16 +00:00
miloschwartz
71bcf25718 move table unique constraint 2025-09-29 17:07:38 -07:00
Owen
288da0ef05 Merge branch 'main' into dev 2025-09-29 16:57:06 -07:00
miloschwartz
fec29eb349 update templates 2025-09-29 16:39:36 -07:00
miloschwartz
032d48e394 add period to cookie 2025-09-29 16:12:17 -07:00
Owen
a433d97573 Make proxy port optional
Fixes #1585
2025-09-29 14:21:23 -07:00
Owen Schwartz
6bd571f1b3 Merge pull request #1583 from fosrl/dependabot/npm_and_yarn/dev-patch-updates-509b2f8484
Bump the dev-patch-updates group with 3 updates
2025-09-29 11:50:23 -07:00
Owen Schwartz
1dd89601ad Merge pull request #1584 from fosrl/dependabot/npm_and_yarn/dev-minor-updates-a0244f92d6
Bump @dotenvx/dotenvx from 1.49.1 to 1.51.0 in the dev-minor-updates group
2025-09-29 11:50:07 -07:00
Owen Schwartz
a7cf359672 Merge pull request #1589 from fosrl/revert-1588-patch-1
Revert "Update de-DE.json: Server-Administrator->Administration"
2025-09-29 11:38:14 -07:00
Owen Schwartz
baa98952fa Revert "Update de-DE.json: Server-Administrator->Administration" 2025-09-29 11:38:04 -07:00
Owen Schwartz
55afbf4db5 Merge pull request #1588 from nicolaus-hee/patch-1
Update de-DE.json: Server-Administrator->Administration
2025-09-29 10:46:27 -07:00
nicolaus-hee
dca0fb327b Update de-DE.json: Server-Administrator->Administration
Menu item "Server Admin" --> "Server-Administation" the activity / section not "Server-Administratior" (the person)
2025-09-29 19:41:24 +02:00
Owen
e34a31941d Add org settings column 2025-09-29 09:54:17 -07:00
Milo Schwartz
dbba5002d9 Merge pull request #1586 from Pallavikumarimdb/fix/resource-auth-param-handling
Fix resource auth API call to use resourceGuid instead of resourceid
2025-09-29 12:53:41 -04:00
Pallavi Kumari
4dd9e34a11 use resourceGuid instead of resourceid 2025-09-29 14:46:59 +05:30
miloschwartz
a30222a13e add templates 2025-09-28 22:18:18 -07:00
miloschwartz
5797144083 add favicon back 2025-09-28 20:40:27 -07:00
Owen
db513b43e7 Make postgres connection string also a ENV var 2025-09-28 20:34:27 -07:00
dependabot[bot]
d387fa3bfb Bump @dotenvx/dotenvx in the dev-minor-updates group
Bumps the dev-minor-updates group with 1 update: [@dotenvx/dotenvx](https://github.com/dotenvx/dotenvx).


Updates `@dotenvx/dotenvx` from 1.49.1 to 1.51.0
- [Release notes](https://github.com/dotenvx/dotenvx/releases)
- [Changelog](https://github.com/dotenvx/dotenvx/blob/main/CHANGELOG.md)
- [Commits](https://github.com/dotenvx/dotenvx/compare/v1.49.1...v1.51.0)

---
updated-dependencies:
- dependency-name: "@dotenvx/dotenvx"
  dependency-version: 1.51.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: dev-minor-updates
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-09-29 01:21:37 +00:00
dependabot[bot]
1bff9f550e Bump the dev-patch-updates group with 3 updates
Bumps the dev-patch-updates group with 3 updates: [@types/react](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/react), [drizzle-kit](https://github.com/drizzle-team/drizzle-orm) and [react-email](https://github.com/resend/react-email/tree/HEAD/packages/react-email).


Updates `@types/react` from 19.1.13 to 19.1.15
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/react)

Updates `drizzle-kit` from 0.31.4 to 0.31.5
- [Release notes](https://github.com/drizzle-team/drizzle-orm/releases)
- [Commits](https://github.com/drizzle-team/drizzle-orm/compare/drizzle-kit@0.31.4...drizzle-kit@0.31.5)

Updates `react-email` from 4.2.11 to 4.2.12
- [Release notes](https://github.com/resend/react-email/releases)
- [Changelog](https://github.com/resend/react-email/blob/canary/packages/react-email/CHANGELOG.md)
- [Commits](https://github.com/resend/react-email/commits/react-email@4.2.12/packages/react-email)

---
updated-dependencies:
- dependency-name: "@types/react"
  dependency-version: 19.1.15
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dev-patch-updates
- dependency-name: drizzle-kit
  dependency-version: 0.31.5
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dev-patch-updates
- dependency-name: react-email
  dependency-version: 4.2.12
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dev-patch-updates
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-09-29 01:20:51 +00:00
Owen
0167b30bf1 Fixes PAN-122 2025-09-28 18:18:03 -07:00
Owen
bf993d04f1 Fix FOU-106 2025-09-28 18:08:10 -07:00
miloschwartz
be2b2c6c77 add robots.txt 2025-09-28 16:43:42 -07:00
miloschwartz
8851156f23 use resource guid in url closes #1517 2025-09-28 16:22:26 -07:00
miloschwartz
1a13694843 gray out time selector in share links if never expire is checked 2025-09-28 12:23:30 -07:00
miloschwartz
3872831bd7 clean up sidebar 2025-09-28 12:21:15 -07:00
Owen
ef4ce115ff Merge branch 'main' into dev 2025-09-28 11:39:38 -07:00
Owen
516b300731 Use olm install script 2025-09-28 11:39:18 -07:00
Owen
88d97dd49b Fix migration 2025-09-28 11:12:41 -07:00
Owen Schwartz
be9494dd54 Merge pull request #1519 from Lokowitz/webauth
Fix upgrade @simplewebauthn/server from 9.0.3 to 13.2.1
2025-09-28 10:47:06 -07:00
Owen
e43fc59634 Use double quotes 2025-09-28 10:42:29 -07:00
Owen
4523a8df0f Bump build 2025-09-28 10:36:03 -07:00
Owen
2c8082451f Add where clause to sql migrations 2025-09-28 10:32:46 -07:00
Owen Schwartz
7ab498702c Merge pull request #1550 from Shamilius/add-minor-image-tags
Add minor version tags to Docker build commands in Makefile
2025-09-28 10:13:20 -07:00
sh.nurmagomedov
a06e8c8f83 Add major version tags to Docker build commands in Makefile 2025-09-28 12:17:29 +03:00
Owen
1a01e8d53a Update readme crowdin 2025-09-27 16:59:41 -07:00
Owen
5ce60cf1cd Merge branch 'main' of github.com:fosrl/pangolin 2025-09-27 16:59:29 -07:00
Owen Schwartz
de1a6025d0 Merge pull request #1572 from vmfventura/fix-portuguese-typo
fix portuguese typo
2025-09-27 16:20:10 -07:00
Vitor Ventura
ca6ae53fe6 fix portuguese typo 2025-09-27 23:26:47 +01:00
sh.nurmagomedov
4eff52ab62 Add minor version tags to Docker build commands in Makefile 2025-09-27 10:54:14 +03:00
Owen Schwartz
e5c5780547 Bump tar-fs from 2.1.3 to 2.1.4 (#1549)
Bumps [tar-fs](https://github.com/mafintosh/tar-fs) from 2.1.3 to 2.1.4.
- [Commits](https://github.com/mafintosh/tar-fs/compare/v2.1.3...v2.1.4)

---
updated-dependencies:
- dependency-name: tar-fs
  dependency-version: 2.1.4
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-26 13:53:18 -07:00
dependabot[bot]
f348c9daa7 Bump tar-fs from 2.1.3 to 2.1.4
Bumps [tar-fs](https://github.com/mafintosh/tar-fs) from 2.1.3 to 2.1.4.
- [Commits](https://github.com/mafintosh/tar-fs/compare/v2.1.3...v2.1.4)

---
updated-dependencies:
- dependency-name: tar-fs
  dependency-version: 2.1.4
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-09-26 20:23:01 +00:00
Owen Schwartz
e1dd29dd0b Merge pull request #1548 from fosrl/crowdin_dev
New Crowdin updates
2025-09-26 10:39:46 -07:00
Owen Schwartz
558f302342 New translations en-us.json (French) 2025-09-26 10:30:06 -07:00
Owen Schwartz
5fee1c3ebd New translations en-us.json (Norwegian Bokmal) 2025-09-26 10:30:05 -07:00
Owen Schwartz
248debb7c4 New translations en-us.json (Chinese Simplified) 2025-09-26 10:30:04 -07:00
Owen Schwartz
8504fd8d9d New translations en-us.json (Turkish) 2025-09-26 10:30:02 -07:00
Owen Schwartz
e360a5323d New translations en-us.json (Russian) 2025-09-26 10:30:01 -07:00
Owen Schwartz
1ad5eb010a New translations en-us.json (Portuguese) 2025-09-26 10:30:00 -07:00
Owen Schwartz
ca7f1e5db8 New translations en-us.json (Polish) 2025-09-26 10:29:58 -07:00
Owen Schwartz
2981e35c75 New translations en-us.json (Dutch) 2025-09-26 10:29:57 -07:00
Owen Schwartz
f3e8677ae4 New translations en-us.json (Korean) 2025-09-26 10:29:56 -07:00
Owen Schwartz
d209c8af9d New translations en-us.json (Italian) 2025-09-26 10:29:55 -07:00
Owen Schwartz
26b2233168 New translations en-us.json (German) 2025-09-26 10:29:54 -07:00
Owen Schwartz
b2669aaa34 New translations en-us.json (Czech) 2025-09-26 10:29:52 -07:00
Owen Schwartz
1438eef62b New translations en-us.json (Bulgarian) 2025-09-26 10:29:51 -07:00
Owen Schwartz
a92f7dbb7c New translations en-us.json (Spanish) 2025-09-26 10:29:50 -07:00
miloschwartz
4710bab697 pull hostname from dashboard url in crowdsec install 2025-09-26 09:57:35 -07:00
dependabot[bot]
52aa27025d Bump the dev-patch-updates group across 1 directory with 2 updates (#1543)
Bumps the dev-patch-updates group with 2 updates in the / directory: [tsx](https://github.com/privatenumber/tsx) and [typescript-eslint](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/typescript-eslint).


Updates `tsx` from 4.20.5 to 4.20.6
- [Release notes](https://github.com/privatenumber/tsx/releases)
- [Changelog](https://github.com/privatenumber/tsx/blob/master/release.config.cjs)
- [Commits](https://github.com/privatenumber/tsx/compare/v4.20.5...v4.20.6)

Updates `typescript-eslint` from 8.44.0 to 8.44.1
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/typescript-eslint/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.44.1/packages/typescript-eslint)

---
updated-dependencies:
- dependency-name: tsx
  dependency-version: 4.20.6
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dev-patch-updates
- dependency-name: typescript-eslint
  dependency-version: 8.44.1
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dev-patch-updates
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-26 09:15:42 -07:00
Owen Schwartz
8e544c056f Merge pull request #1542 from fosrl/crowdin_dev
New Crowdin updates
2025-09-26 09:12:28 -07:00
Owen Schwartz
3c2a8b9031 Merge pull request #1545 from Pallavikumarimdb/fix/view-settings-in-manage-API-keys
Link to View Settings in API Keys
2025-09-26 09:08:00 -07:00
Pallavi Kumari
fff4883bca Link to View Settings in API Keys 2025-09-26 18:25:19 +05:30
Owen Schwartz
dc234beab1 New translations en-us.json (French) 2025-09-25 17:15:35 -07:00
Owen Schwartz
66d310fcca New translations en-us.json (Norwegian Bokmal) 2025-09-25 17:15:34 -07:00
Owen Schwartz
702b5eb3dd New translations en-us.json (Chinese Simplified) 2025-09-25 17:15:32 -07:00
Owen Schwartz
06477b6e7f New translations en-us.json (Turkish) 2025-09-25 17:15:31 -07:00
Owen Schwartz
fc76899384 New translations en-us.json (Russian) 2025-09-25 17:15:30 -07:00
Owen Schwartz
97102b9be9 New translations en-us.json (Portuguese) 2025-09-25 17:15:28 -07:00
Owen Schwartz
1c0dfa830e New translations en-us.json (Polish) 2025-09-25 17:15:27 -07:00
Owen Schwartz
53bfaac0c0 New translations en-us.json (Dutch) 2025-09-25 17:15:26 -07:00
Owen Schwartz
30790fdcb6 New translations en-us.json (Korean) 2025-09-25 17:15:24 -07:00
Owen Schwartz
b8b256da2e New translations en-us.json (Italian) 2025-09-25 17:15:23 -07:00
Owen Schwartz
0472dc1b25 New translations en-us.json (German) 2025-09-25 17:15:22 -07:00
Owen Schwartz
1ec3e53e11 New translations en-us.json (Czech) 2025-09-25 17:15:20 -07:00
Owen Schwartz
9f66e09e44 New translations en-us.json (Bulgarian) 2025-09-25 17:15:19 -07:00
Owen Schwartz
a71b0a8924 New translations en-us.json (Spanish) 2025-09-25 17:15:18 -07:00
miloschwartz
e555d3c496 add server action proxies 2025-09-25 17:14:36 -07:00
Lokowitz
df92e41384 added migration for simplewebauthn 2025-09-25 19:55:36 +00:00
Owen
d10fdac670 Merge branch 'dev' 2025-09-23 14:36:46 -07:00
Owen Schwartz
b63bffa524 Merge pull request #1529 from Tim5965/patch-5
Update nl-NL.json
2025-09-23 16:43:47 -04:00
Tim
957cfdd5d7 Update nl-NL.json
Minor changes (probably missed)
2025-09-23 21:42:48 +02:00
Lokowitz
1352316492 update securityKey 2025-09-23 17:44:34 +00:00
Lokowitz
73cd82081a fix securitykey 2025-09-23 16:51:08 +00:00
Marvin
812820472f Merge branch 'fosrl:main' into webauth 2025-09-23 17:32:53 +02:00
Owen
21f0cd6e3f Fix #1527 2025-09-23 09:30:18 -04:00
Owen Schwartz
b2ee8ef7de Merge pull request #1525 from Lokowitz/Resolver
Fix upgrade @hookform/resolvers from 4.1.3 to 5.2.2
2025-09-23 09:19:08 -04:00
Marvin
1e066cbabd fix components 2025-09-22 20:22:31 +00:00
Marvin
4cc38d44e0 Merge branch 'Resolver' of https://github.com/Lokowitz/pangolin into Resolver 2025-09-22 20:10:21 +00:00
Marvin
dcf7393259 update resolver 2025-09-22 20:06:55 +00:00
Marvin
bab070b09c page.tsx aktualisieren 2025-09-22 17:34:52 +02:00
Marvin
2bd4ad5770 page.tsx aktualisieren 2025-09-22 17:20:32 +02:00
Marvin
61ecebf911 bbbv 2025-09-22 15:13:29 +00:00
Marvin
33c8663a5b package.json aktualisieren 2025-09-22 17:04:30 +02:00
Marvin
76da2ee324 cleanup 2025-09-22 12:19:35 +00:00
Marvin
31896c9be9 cleanup 2025-09-22 12:12:46 +00:00
Marvin
f61d722aee Merge branch 'fosrl:main' into webauth 2025-09-22 12:36:06 +02:00
Owen
1f9f3fdede Merge branch 'dev' 2025-09-21 22:25:09 -04:00
Owen
a778109214 Fix using wrong protocol when creating resource 2025-09-21 22:25:05 -04:00
Owen
cb7fa9375b Make sure to process headers correctly in blueprint 2025-09-21 22:25:05 -04:00
Owen
515ecb09e7 Update url and remove example token 2025-09-21 22:25:04 -04:00
Owen
a12a620697 Fix using wrong protocol when creating resource 2025-09-21 22:24:54 -04:00
Owen
0c3b2bc2f5 Make sure to process headers correctly in blueprint 2025-09-21 22:24:53 -04:00
Owen
78ba27dc63 Update url and remove example token 2025-09-21 22:24:53 -04:00
Owen Schwartz
dc20b863ed Merge pull request #1512 from fosrl/dev
1.10.2
2025-09-21 22:24:29 -04:00
Owen Schwartz
c9a211d5cf Merge pull request #1505 from fosrl/crowdin_dev
New Crowdin updates
2025-09-21 21:01:25 -04:00
Owen
95f94cffd2 Fix lint 2025-09-21 20:50:01 -04:00
Owen
0da95cbdb8 Version correctly 2025-09-21 20:48:13 -04:00
Owen
dadd1e3101 Add migration to manager 2025-09-21 16:44:08 -04:00
Owen
d523ae3ffa Fix input overwriting value 2025-09-21 16:39:40 -04:00
Owen
9a41cac6e1 Remove port checks 2025-09-21 16:16:41 -04:00
Owen
5d3c5ab7cc Store headers as json 2025-09-21 15:49:50 -04:00
Marvin
08c930e6cf update webauthen 2025-09-21 18:32:18 +00:00
Owen
e94ded920b Fix #1501 2025-09-21 11:42:51 -04:00
Owen Schwartz
c882fbd59a New translations en-us.json (German) 2025-09-20 09:51:23 -04:00
Owen
46b50a042e Merge branch 'dev' of github.com:fosrl/pangolin into dev 2025-09-18 21:52:56 -04:00
Owen
fda9e95786 Add header for host all the time 2025-09-18 21:52:02 -04:00
Milo Schwartz
ea1ad23bff Merge pull request #1497 from fosrl/dev
Dev
2025-09-18 16:22:02 -04:00
miloschwartz
7ffc5e0212 fix 1.10.1 migration script 2025-09-18 16:19:23 -04:00
Owen Schwartz
acba9444f4 Merge pull request #1495 from Tim5965/patch-3
Update nl-NL.json
2025-09-18 15:06:44 -04:00
Tim
f7e3671801 Update nl-NL.json
I think the file was accidentally reverted to the version that contained errors. The errors that were in that version have been updated again.
2025-09-18 21:04:48 +02:00
miloschwartz
a1b2e36a5d fix installer 2025-09-18 11:55:01 -04:00
Owen Schwartz
44e96942b3 Merge pull request #1484 from fosrl/dependabot/npm_and_yarn/dev-patch-updates-2c7447d29a
Bump the dev-patch-updates group with 2 updates
2025-09-18 11:52:37 -04:00
Owen Schwartz
f2efa760ff Merge pull request #1488 from cku-heise/patch-1
Update de-DE.json
2025-09-18 11:52:18 -04:00
cku-heise
256df9042b Update de-DE.json
"Spielpfad" is literal, but wrong translation (not a word in German). "Unterverzeichnis" would be the best approximation of the UI label here.
2025-09-18 10:52:01 +02:00
miloschwartz
6d7091fb5c migrate siteId on targets table to delete on cascade 2025-09-17 22:54:29 -04:00
dependabot[bot]
0d1f88a368 Bump the dev-patch-updates group with 2 updates
Bumps the dev-patch-updates group with 2 updates: [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) and [esbuild](https://github.com/evanw/esbuild).


Updates `@types/node` from 24.5.0 to 24.5.2
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

Updates `esbuild` from 0.25.9 to 0.25.10
- [Release notes](https://github.com/evanw/esbuild/releases)
- [Changelog](https://github.com/evanw/esbuild/blob/main/CHANGELOG.md)
- [Commits](https://github.com/evanw/esbuild/compare/v0.25.9...v0.25.10)

---
updated-dependencies:
- dependency-name: "@types/node"
  dependency-version: 24.5.2
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dev-patch-updates
- dependency-name: esbuild
  dependency-version: 0.25.10
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dev-patch-updates
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-09-18 01:16:29 +00:00
Owen Schwartz
2ae601717d Merge pull request #1483 from barnabehvrd/patch-1
fr-fr language translation improvement
2025-09-17 17:11:03 -04:00
Barnabé Havard
c7c8b463b4 Remove customHeadersDescription from fr-FR.json
Removed translation that doesn't appear anywhere
2025-09-17 23:06:13 +02:00
Barnabé Havard
282f839211 Fix typo in French translation for 'dataIn' 2025-09-17 22:53:12 +02:00
Barnabé Havard
b2eb846b69 Update French translations in fr-FR.json 2025-09-17 22:50:41 +02:00
Owen Schwartz
62cf925dcf Merge pull request #1482 from fosrl/crowdin_dev
New Crowdin updates
2025-09-17 16:45:29 -04:00
Owen Schwartz
e699f84c4d New translations en-us.json (Dutch) 2025-09-17 16:44:45 -04:00
Owen Schwartz
c1189dadc5 New translations en-us.json (German) 2025-09-17 16:44:42 -04:00
Owen
76bc080a6d Merge branch 'main' into dev 2025-09-17 16:41:54 -04:00
miloschwartz
7f989f77ac fix type and fix redirect to resource niceId on create 2025-09-17 16:27:22 -04:00
Owen
b916f768fe Quiet debug logs 2025-09-17 16:19:07 -04:00
Owen
e4509c5714 Merge branch 'main' into dev 2025-09-17 15:54:10 -04:00
miloschwartz
ddb6893a64 ask for container type in crowdsec installer 2025-09-17 15:52:40 -04:00
dependabot[bot]
248751ba1d Bump the dev-minor-updates group with 2 updates
Bumps the dev-minor-updates group with 2 updates: [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) and [typescript-eslint](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/typescript-eslint).


Updates `@types/node` from 24.4.0 to 24.5.0
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

Updates `typescript-eslint` from 8.43.0 to 8.44.0
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/typescript-eslint/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.44.0/packages/typescript-eslint)

---
updated-dependencies:
- dependency-name: "@types/node"
  dependency-version: 24.5.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: dev-minor-updates
- dependency-name: typescript-eslint
  dependency-version: 8.44.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: dev-minor-updates
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-09-17 09:06:13 -07:00
dependabot[bot]
b4b74ed53a Bump @dotenvx/dotenvx in the dev-patch-updates group
Bumps the dev-patch-updates group with 1 update: [@dotenvx/dotenvx](https://github.com/dotenvx/dotenvx).


Updates `@dotenvx/dotenvx` from 1.49.0 to 1.49.1
- [Release notes](https://github.com/dotenvx/dotenvx/releases)
- [Changelog](https://github.com/dotenvx/dotenvx/blob/main/CHANGELOG.md)
- [Commits](https://github.com/dotenvx/dotenvx/compare/v1.49.0...v1.49.1)

---
updated-dependencies:
- dependency-name: "@dotenvx/dotenvx"
  dependency-version: 1.49.1
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dev-patch-updates
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-09-17 09:05:57 -07:00
dependabot[bot]
76903cd67f Bump next-intl from 4.3.8 to 4.3.9 in the prod-patch-updates group
Bumps the prod-patch-updates group with 1 update: [next-intl](https://github.com/amannn/next-intl).


Updates `next-intl` from 4.3.8 to 4.3.9
- [Release notes](https://github.com/amannn/next-intl/releases)
- [Changelog](https://github.com/amannn/next-intl/blob/main/CHANGELOG.md)
- [Commits](https://github.com/amannn/next-intl/compare/v4.3.8...v4.3.9)

---
updated-dependencies:
- dependency-name: next-intl
  dependency-version: 4.3.9
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: prod-patch-updates
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-09-17 09:05:42 -07:00
Tim
e4f2eac703 Update nl-NL.json
It currently contains several errors. I believe I've fixed the major ones now, but there are probably still things I've overlooked.

Incidentally, there's no option to edit the main headings for General, Access Control, and Organization. This also applies to Manage Clients (beta) page.
2025-09-17 09:01:46 -07:00
Oliver Antwerpen
3aa45007a7 Update de-DE.json
Corrected different translations to real german
2025-09-17 09:01:09 -07:00
miloschwartz
f452892c88 fix cant create oidc user closes #1472 2025-09-16 17:29:45 -07:00
miloschwartz
a0fece8a0e print failed crowdsec install error 2025-09-16 17:17:41 -07:00
Owen Schwartz
e3d493209b Merge pull request #1475 from Pallavikumarimdb/Fix/frontend-resource-niceid
Use niceId for resource URLs to prevent 307 redirects
2025-09-16 12:22:54 -07:00
Pallavi
2e8b63553d resource links from id to niceId 2025-09-16 23:46:21 +05:30
Owen
fb8f4b95b7 Make sure to default the match 2025-09-15 22:06:50 -07:00
miloschwartz
83e107c713 migrate autoProvisioned on user based on idp autoProvision 2025-09-15 21:52:35 -07:00
Owen
e97642a790 Filter out duplicates 2025-09-15 21:50:21 -07:00
Owen
426d8684bf Merge branch 'dev' 2025-09-15 15:22:06 -07:00
Owen
5e7409a4f0 Make sure to allow targets only 2025-09-15 15:21:53 -07:00
Owen Schwartz
c225a4cd48 Merge pull request #1467 from fosrl/dev
1.10.0
2025-09-15 14:44:04 -07:00
Owen Schwartz
24df9e1ce6 Merge pull request #1466 from fosrl/crowdin_dev
New Crowdin updates
2025-09-15 14:34:59 -07:00
Owen Schwartz
eab1fd3722 New translations en-us.json (Norwegian Bokmal) 2025-09-15 14:34:40 -07:00
Owen Schwartz
93bd041693 New translations en-us.json (Chinese Simplified) 2025-09-15 14:34:39 -07:00
Owen Schwartz
665ebe993c New translations en-us.json (Turkish) 2025-09-15 14:34:38 -07:00
Owen Schwartz
4086130371 New translations en-us.json (Russian) 2025-09-15 14:34:36 -07:00
Owen Schwartz
29aacf5238 New translations en-us.json (Portuguese) 2025-09-15 14:34:35 -07:00
Owen Schwartz
497e6a8422 New translations en-us.json (Polish) 2025-09-15 14:34:34 -07:00
Owen Schwartz
af8572add9 New translations en-us.json (Dutch) 2025-09-15 14:34:33 -07:00
Owen Schwartz
d6aea96400 New translations en-us.json (Korean) 2025-09-15 14:34:31 -07:00
Owen Schwartz
17e26ff1a6 New translations en-us.json (Italian) 2025-09-15 14:34:30 -07:00
Owen Schwartz
f5f223348d New translations en-us.json (German) 2025-09-15 14:34:28 -07:00
Owen Schwartz
e4f90fd7ea New translations en-us.json (Czech) 2025-09-15 14:34:27 -07:00
Owen Schwartz
96dff20760 New translations en-us.json (Bulgarian) 2025-09-15 14:34:26 -07:00
Owen Schwartz
d639f7f6de New translations en-us.json (Spanish) 2025-09-15 14:34:25 -07:00
Owen Schwartz
5b35ec2ea2 New translations en-us.json (French) 2025-09-15 14:34:23 -07:00
Owen
bc78b95265 Remove toast 2025-09-15 14:32:36 -07:00
Owen
97f22eccbb Merge branch 'dev' of github.com:fosrl/pangolin into dev 2025-09-15 14:26:47 -07:00
Owen Schwartz
a4fe86e38a Merge pull request #1406 from Pallavikumarimdb/enhancement-#906/enter-key-form-behavior
Enter key handling & hostname field reset in resource create
2025-09-15 14:26:29 -07:00
Owen
4bc1e10ecb Adjust default to prefix 2025-09-15 14:17:41 -07:00
Owen Schwartz
5b840d73bb Merge pull request #1465 from marcschaeferger/dev
feat(sites): adding official kubernetes helm install command for newt
2025-09-15 14:01:35 -07:00
Marc Schäfer
afa9acfb1e feat(sites): adding official kubernetes helm install command for newt 2025-09-15 20:27:03 +02:00
Owen
7b7f65da39 Add default to siteResources niceId 2025-09-15 11:13:31 -07:00
Owen Schwartz
806da59f47 Merge pull request #1449 from fosrl/declare
Add declareivie config for resources, path matching, custom headers
2025-09-14 22:06:33 -07:00
Owen
9a009a4ea3 Adjust headers to work as name value 2025-09-14 22:06:05 -07:00
Owen
083d890053 Merge branch 'dev' into declare 2025-09-14 21:54:39 -07:00
Owen
e693a8aeb8 Merge remote-tracking branch 'refs/remotes/origin/dev' into dev 2025-09-14 21:30:10 -07:00
Owen
831b46d7b5 Merge branch 'main' into dev 2025-09-14 21:29:43 -07:00
Owen
8dd3022b94 Merge branch 'Lokowitz-main' 2025-09-14 20:34:34 -07:00
Owen
b278eb7110 Merge branch 'main' of github.com:Lokowitz/pangolin into Lokowitz-main 2025-09-14 20:33:20 -07:00
Owen
7a66163216 Working on making blueprints work 2025-09-14 20:33:06 -07:00
Owen Schwartz
dda2043401 Merge pull request #1450 from fosrl/crowdin_dev
New Crowdin updates
2025-09-14 20:31:05 -07:00
Owen
08d6183c9b Update migrations 2025-09-14 17:35:21 -07:00
Owen
eea0b86d6d Rules, client resources working 2025-09-14 17:27:21 -07:00
Owen
58c04fd196 Site resources for the blueprint 2025-09-14 15:57:41 -07:00
Lokowitz
09de6f6b5f modified: package-lock.json
modified:   package.json
2025-09-14 18:50:28 +00:00
Lokowitz
d0bbd2b539 modified: package-lock.json
modified:   package.json
2025-09-14 18:33:34 +00:00
Fernando Rodrigues
ee8952de10 Revert "fix: change default integration_api to 3004" 2025-09-14 13:07:08 +00:00
Lokowitz
134595a6b7 modified: package-lock.json
modified:   package.json
2025-09-14 09:44:04 +00:00
Milo Schwartz
4ff46f1650 Update README.md 2025-09-13 19:15:52 -04:00
Lokowitz
4779201d4c modified: src/app/[orgId]/settings/access/layout.tsx 2025-09-13 15:06:34 +00:00
dependabot[bot]
3a8643d83c Bump next in the npm_and_yarn group across 1 directory (#336)
Bumps the npm_and_yarn group with 1 update in the / directory: [next](https://github.com/vercel/next.js).


Updates `next` from 15.4.6 to 15.5.3
- [Release notes](https://github.com/vercel/next.js/releases)
- [Changelog](https://github.com/vercel/next.js/blob/canary/release.js)
- [Commits](https://github.com/vercel/next.js/compare/v15.4.6...v15.5.3)

---
updated-dependencies:
- dependency-name: next
  dependency-version: 15.5.3
  dependency-type: direct:production
  dependency-group: npm_and_yarn
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-13 16:49:21 +02:00
Marvin
806a49b822 Update page.tsx 2025-09-13 16:42:37 +02:00
Marvin
95d74825ee Update layout.tsx 2025-09-13 16:42:22 +02:00
Marvin
e4960909ed layout.tsx aktualisieren 2025-09-13 10:18:43 +02:00
dependabot[bot]
6cb36aaf13 Bump the prod-minor-updates group across 1 directory with 7 updates (#335) 2025-09-13 10:08:40 +02:00
dependabot[bot]
cb06e93650 Bump uuid from 11.1.0 to 13.0.0 (#334) 2025-09-13 09:43:59 +02:00
dependabot[bot]
e3a2f7a514 Bump the dev-patch-updates group with 6 updates (#329)
Bumps the dev-patch-updates group with 6 updates:

| Package | From | To |
| --- | --- | --- |
| [@tailwindcss/postcss](https://github.com/tailwindlabs/tailwindcss/tree/HEAD/packages/@tailwindcss-postcss) | `4.1.12` | `4.1.13` |
| [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) | `24.3.0` | `24.3.3` |
| [@types/react](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/react) | `19.1.12` | `19.1.13` |
| [@types/semver](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/semver) | `7.7.0` | `7.7.1` |
| [react-email](https://github.com/resend/react-email/tree/HEAD/packages/react-email) | `4.2.8` | `4.2.11` |
| [tailwindcss](https://github.com/tailwindlabs/tailwindcss/tree/HEAD/packages/tailwindcss) | `4.1.12` | `4.1.13` |


Updates `@tailwindcss/postcss` from 4.1.12 to 4.1.13
- [Release notes](https://github.com/tailwindlabs/tailwindcss/releases)
- [Changelog](https://github.com/tailwindlabs/tailwindcss/blob/main/CHANGELOG.md)
- [Commits](https://github.com/tailwindlabs/tailwindcss/commits/v4.1.13/packages/@tailwindcss-postcss)

Updates `@types/node` from 24.3.0 to 24.3.3
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

Updates `@types/react` from 19.1.12 to 19.1.13
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/react)

Updates `@types/semver` from 7.7.0 to 7.7.1
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/semver)

Updates `react-email` from 4.2.8 to 4.2.11
- [Release notes](https://github.com/resend/react-email/releases)
- [Changelog](https://github.com/resend/react-email/blob/canary/packages/react-email/CHANGELOG.md)
- [Commits](https://github.com/resend/react-email/commits/react-email@4.2.11/packages/react-email)

Updates `tailwindcss` from 4.1.12 to 4.1.13
- [Release notes](https://github.com/tailwindlabs/tailwindcss/releases)
- [Changelog](https://github.com/tailwindlabs/tailwindcss/blob/main/CHANGELOG.md)
- [Commits](https://github.com/tailwindlabs/tailwindcss/commits/v4.1.13/packages/tailwindcss)

---
updated-dependencies:
- dependency-name: "@tailwindcss/postcss"
  dependency-version: 4.1.13
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dev-patch-updates
- dependency-name: "@types/node"
  dependency-version: 24.3.3
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dev-patch-updates
- dependency-name: "@types/react"
  dependency-version: 19.1.13
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dev-patch-updates
- dependency-name: "@types/semver"
  dependency-version: 7.7.1
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dev-patch-updates
- dependency-name: react-email
  dependency-version: 4.2.11
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dev-patch-updates
- dependency-name: tailwindcss
  dependency-version: 4.1.13
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dev-patch-updates
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-13 09:37:17 +02:00
dependabot[bot]
01b1e817d8 Bump the prod-patch-updates group with 7 updates (#332)
Bumps the prod-patch-updates group with 7 updates:

| Package | From | To |
| --- | --- | --- |
| [@react-email/components](https://github.com/resend/react-email/tree/HEAD/packages/components) | `0.5.0` | `0.5.3` |
| [@react-email/render](https://github.com/resend/react-email/tree/HEAD/packages/render) | `1.2.0` | `1.2.3` |
| [drizzle-orm](https://github.com/drizzle-team/drizzle-orm) | `0.44.4` | `0.44.5` |
| [next-intl](https://github.com/amannn/next-intl) | `4.3.4` | `4.3.8` |
| [nodemailer](https://github.com/nodemailer/nodemailer) | `7.0.5` | `7.0.6` |
| [@types/nodemailer](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/nodemailer) | `6.4.17` | `7.0.1` |
| [tw-animate-css](https://github.com/Wombosvideo/tw-animate-css) | `1.3.7` | `1.3.8` |


Updates `@react-email/components` from 0.5.0 to 0.5.3
- [Release notes](https://github.com/resend/react-email/releases)
- [Changelog](https://github.com/resend/react-email/blob/canary/packages/components/CHANGELOG.md)
- [Commits](https://github.com/resend/react-email/commits/@react-email/components@0.5.3/packages/components)

Updates `@react-email/render` from 1.2.0 to 1.2.3
- [Release notes](https://github.com/resend/react-email/releases)
- [Changelog](https://github.com/resend/react-email/blob/canary/packages/render/CHANGELOG.md)
- [Commits](https://github.com/resend/react-email/commits/@react-email/render@1.2.3/packages/render)

Updates `drizzle-orm` from 0.44.4 to 0.44.5
- [Release notes](https://github.com/drizzle-team/drizzle-orm/releases)
- [Commits](https://github.com/drizzle-team/drizzle-orm/compare/0.44.4...0.44.5)

Updates `next-intl` from 4.3.4 to 4.3.8
- [Release notes](https://github.com/amannn/next-intl/releases)
- [Changelog](https://github.com/amannn/next-intl/blob/main/CHANGELOG.md)
- [Commits](https://github.com/amannn/next-intl/compare/v4.3.4...v4.3.8)

Updates `nodemailer` from 7.0.5 to 7.0.6
- [Release notes](https://github.com/nodemailer/nodemailer/releases)
- [Changelog](https://github.com/nodemailer/nodemailer/blob/master/CHANGELOG.md)
- [Commits](https://github.com/nodemailer/nodemailer/compare/v7.0.5...v7.0.6)

Updates `@types/nodemailer` from 6.4.17 to 7.0.1
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/nodemailer)

Updates `tw-animate-css` from 1.3.7 to 1.3.8
- [Release notes](https://github.com/Wombosvideo/tw-animate-css/releases)
- [Commits](https://github.com/Wombosvideo/tw-animate-css/compare/v1.3.7...v1.3.8)

---
updated-dependencies:
- dependency-name: "@react-email/components"
  dependency-version: 0.5.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: prod-patch-updates
- dependency-name: "@react-email/render"
  dependency-version: 1.2.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: prod-patch-updates
- dependency-name: drizzle-orm
  dependency-version: 0.44.5
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: prod-patch-updates
- dependency-name: next-intl
  dependency-version: 4.3.8
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: prod-patch-updates
- dependency-name: nodemailer
  dependency-version: 7.0.6
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: prod-patch-updates
- dependency-name: "@types/nodemailer"
  dependency-version: 7.0.1
  dependency-type: direct:development
  update-type: version-update:semver-major
  dependency-group: prod-patch-updates
- dependency-name: tw-animate-css
  dependency-version: 1.3.8
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: prod-patch-updates
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-13 09:36:52 +02:00
dependabot[bot]
c3a5195575 Bump typescript-eslint in the dev-minor-updates group (#331)
Bumps the dev-minor-updates group with 1 update: [typescript-eslint](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/typescript-eslint).


Updates `typescript-eslint` from 8.40.0 to 8.43.0
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/typescript-eslint/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.43.0/packages/typescript-eslint)

---
updated-dependencies:
- dependency-name: typescript-eslint
  dependency-version: 8.43.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: dev-minor-updates
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-13 09:34:35 +02:00
Marvin
99765c7bd5 Update index.ts 2025-09-13 09:32:01 +02:00
Owen
8929f389f4 Adjust styling to make it more clear 2025-09-12 11:45:03 -07:00
Owen Schwartz
4141d91f1b New translations en-us.json (Norwegian Bokmal) 2025-09-11 21:55:28 -07:00
Owen Schwartz
90272c84d2 New translations en-us.json (Chinese Simplified) 2025-09-11 21:55:27 -07:00
Owen Schwartz
3006a8e58c New translations en-us.json (Turkish) 2025-09-11 21:55:26 -07:00
Owen Schwartz
52a9dbd45d New translations en-us.json (Russian) 2025-09-11 21:55:25 -07:00
Owen Schwartz
b2fb55d2c1 New translations en-us.json (Portuguese) 2025-09-11 21:55:23 -07:00
Owen Schwartz
a1c16d22d8 New translations en-us.json (Polish) 2025-09-11 21:55:22 -07:00
Owen Schwartz
0e9504ee4d New translations en-us.json (Dutch) 2025-09-11 21:55:21 -07:00
Owen Schwartz
e8cad6fc20 New translations en-us.json (Korean) 2025-09-11 21:55:20 -07:00
Owen Schwartz
bc261f7739 New translations en-us.json (Italian) 2025-09-11 21:55:19 -07:00
Owen Schwartz
0b8983a86b New translations en-us.json (German) 2025-09-11 21:55:17 -07:00
Owen Schwartz
5a61da3c53 New translations en-us.json (Czech) 2025-09-11 21:55:16 -07:00
Owen Schwartz
800fe6244c New translations en-us.json (Bulgarian) 2025-09-11 21:55:15 -07:00
Owen Schwartz
9e1fec812c New translations en-us.json (Spanish) 2025-09-11 21:55:14 -07:00
Owen Schwartz
61632f9c97 New translations en-us.json (French) 2025-09-11 21:55:12 -07:00
Owen
f5e44129d8 Eslint fix 2025-09-11 21:32:12 -07:00
Owen
3eaca924da Update migrations 2025-09-11 21:28:15 -07:00
Owen
da1c706334 Translate 2025-09-11 21:26:13 -07:00
Owen
3b726dfb1e Merge branch 'dev' into declare 2025-09-11 21:24:27 -07:00
Owen
d51e7f7e40 Add prefix to ui and resource 2025-09-11 21:20:33 -07:00
Owen
2551e0c291 Handle different routers based on target path 2025-09-11 15:30:07 -07:00
Owen
2efd5c31ab Headers input working on resource 2025-09-11 13:58:12 -07:00
Owen
1eacb8ff36 Get the headers into the traefik config 2025-09-11 12:20:50 -07:00
Owen
612446c3c9 Work accross sites? 2025-09-11 11:42:37 -07:00
Owen Schwartz
e121e16ad9 Merge pull request #1441 from fosrl/dependabot/go_modules/install/prod-minor-updates-f3fcceee1e
Bump golang.org/x/term from 0.34.0 to 0.35.0 in /install in the prod-minor-updates group
2025-09-11 10:38:17 -07:00
Owen Schwartz
23616b41be Merge pull request #1445 from fosrl/crowdin_dev
New Crowdin updates
2025-09-11 10:36:04 -07:00
Owen Schwartz
1778ba49b2 New translations en-us.json (Norwegian Bokmal) 2025-09-11 10:35:39 -07:00
Owen Schwartz
b6f2bd4703 New translations en-us.json (Chinese Simplified) 2025-09-11 10:35:38 -07:00
Owen Schwartz
5fd67224f6 New translations en-us.json (Turkish) 2025-09-11 10:35:37 -07:00
Owen Schwartz
c9d21dde0c New translations en-us.json (Russian) 2025-09-11 10:35:35 -07:00
Owen Schwartz
de2c5aa068 New translations en-us.json (Portuguese) 2025-09-11 10:35:34 -07:00
Owen Schwartz
ad01cecae6 New translations en-us.json (Polish) 2025-09-11 10:35:33 -07:00
Owen Schwartz
75ef14c75b New translations en-us.json (Dutch) 2025-09-11 10:35:32 -07:00
Owen Schwartz
03a5a0eddb New translations en-us.json (Korean) 2025-09-11 10:35:30 -07:00
Owen Schwartz
66befd35eb New translations en-us.json (Italian) 2025-09-11 10:35:29 -07:00
Owen Schwartz
3cbad16c30 New translations en-us.json (German) 2025-09-11 10:35:27 -07:00
Owen Schwartz
3bba7c5956 New translations en-us.json (Czech) 2025-09-11 10:35:26 -07:00
Owen Schwartz
0daa84c583 New translations en-us.json (Bulgarian) 2025-09-11 10:35:25 -07:00
Owen Schwartz
92358a52c0 New translations en-us.json (Spanish) 2025-09-11 10:35:23 -07:00
Owen Schwartz
faf17e9e86 New translations en-us.json (French) 2025-09-11 10:35:22 -07:00
Owen
ef6efe94b4 Eslint fix 2025-09-11 10:27:02 -07:00
Owen
819d7ea23e Merge branch 'main' into dev 2025-09-11 10:25:21 -07:00
Owen Schwartz
61ff192cfd Merge pull request #1444 from hetlelid/patch-1
Update page.tsx
2025-09-11 10:24:55 -07:00
Owen
ceb1b07ce2 Just style it a bit 2025-09-11 10:24:40 -07:00
Owen
90188d4358 Testing cross site issue 2025-09-11 10:12:27 -07:00
hetlelid
35aa0ab4e7 Update page.tsx
Added default location for the config files, for reference
2025-09-11 11:11:36 +02:00
Owen
14dd76db8b Apply blueprint over api call 2025-09-10 17:28:00 -07:00
Owen
fb26dfad65 Add migrations for 1.10.0 2025-09-10 17:15:54 -07:00
miloschwartz
bedc5adb75 add hide free domain option to domain picker 2025-09-10 15:36:05 -07:00
Owen
800b1f1520 Add basic blueprints 2025-09-10 15:33:56 -07:00
miloschwartz
a4571a80ae Merge branch 'patch' into dev 2025-09-10 14:44:25 -07:00
miloschwartz
a0a612618e fixed email undefined error on request email code 2025-09-10 14:20:25 -07:00
dependabot[bot]
db94728a5b Bump golang.org/x/term in /install in the prod-minor-updates group
Bumps the prod-minor-updates group in /install with 1 update: [golang.org/x/term](https://github.com/golang/term).


Updates `golang.org/x/term` from 0.34.0 to 0.35.0
- [Commits](https://github.com/golang/term/compare/v0.34.0...v0.35.0)

---
updated-dependencies:
- dependency-name: golang.org/x/term
  dependency-version: 0.35.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: prod-minor-updates
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-09-09 01:18:58 +00:00
Owen
04352a670a Merge branch 'dev' of github.com:fosrl/pangolin into dev 2025-09-08 17:50:57 -07:00
Owen
fe6e3b013e Resource identified with niceId now 2025-09-08 17:50:07 -07:00
Owen
a947a74194 Add resource niceId 2025-09-08 17:37:30 -07:00
miloschwartz
06055ff62b add common domain validation func 2025-09-08 17:25:01 -07:00
miloschwartz
45cb1562e5 pull api base url from config for axios 2025-09-08 16:55:40 -07:00
Pallavi
2f89a16852 minor fix to domain sanitize when create resources 2025-09-08 11:26:54 +05:30
Pallavi
86956b8cac fix enter key reload issue 2025-09-08 11:26:54 +05:30
Pallavi
84fb3add33 Enter key handling & hostname field reset in resource create 2025-09-08 11:26:54 +05:30
Owen Schwartz
56ee68d9f3 Merge pull request #1434 from fosrl/dependabot/github_actions/actions/setup-node-5
Bump actions/setup-node from 4 to 5
2025-09-07 22:01:36 -07:00
Owen Schwartz
e81fd3bb31 Merge pull request #1435 from fosrl/dependabot/github_actions/actions/setup-go-6
Bump actions/setup-go from 5 to 6
2025-09-07 22:01:28 -07:00
Owen Schwartz
938ca29777 Merge pull request #1436 from fosrl/dependabot/github_actions/actions/stale-10
Bump actions/stale from 9 to 10
2025-09-07 22:01:21 -07:00
Owen Schwartz
122902968f Merge pull request #1415 from fosrl/crowdin_dev
New Crowdin updates
2025-09-07 22:01:12 -07:00
Owen Schwartz
b55c30065f Merge pull request #1431 from Pallavikumarimdb/Fix/site-resource-destinationip-validation
Fix inconsistent destinationIp validation between create and update APIs
2025-09-07 21:11:32 -07:00
dependabot[bot]
92ac2dbac2 Bump actions/stale from 9 to 10
Bumps [actions/stale](https://github.com/actions/stale) from 9 to 10.
- [Release notes](https://github.com/actions/stale/releases)
- [Changelog](https://github.com/actions/stale/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/stale/compare/v9...v10)

---
updated-dependencies:
- dependency-name: actions/stale
  dependency-version: '10'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-09-08 01:32:59 +00:00
dependabot[bot]
d3e6decef9 Bump actions/setup-go from 5 to 6
Bumps [actions/setup-go](https://github.com/actions/setup-go) from 5 to 6.
- [Release notes](https://github.com/actions/setup-go/releases)
- [Commits](https://github.com/actions/setup-go/compare/v5...v6)

---
updated-dependencies:
- dependency-name: actions/setup-go
  dependency-version: '6'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-09-08 01:32:10 +00:00
dependabot[bot]
579cd9d338 Bump actions/setup-node from 4 to 5
Bumps [actions/setup-node](https://github.com/actions/setup-node) from 4 to 5.
- [Release notes](https://github.com/actions/setup-node/releases)
- [Commits](https://github.com/actions/setup-node/compare/v4...v5)

---
updated-dependencies:
- dependency-name: actions/setup-node
  dependency-version: '5'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-09-08 01:32:04 +00:00
Pallavi
9e2a58dd46 inconsistent destinationIp validation between create and update 2025-09-07 23:45:35 +05:30
Owen
64722617c1 Fix #1423 2025-09-07 10:47:08 -07:00
Owen Schwartz
5845ddbdda Merge pull request #1430 from Pallavikumarimdb/Fix/include-region-in-exitnode-query
Fix: Include "region" field in ExitNode query to match schema
2025-09-07 10:25:00 -07:00
Pallavi
bf9ce0df9b Include region field in ExitNode query to match schema 2025-09-07 22:47:06 +05:30
miloschwartz
8aee2ec3a1 update install link 2025-09-06 22:37:02 -07:00
Milo Schwartz
3292eafe4a Update README.md 2025-09-07 01:36:37 -04:00
miloschwartz
9ad31b2c81 auto detect public ip 2025-09-06 22:24:22 -07:00
miloschwartz
374ed79a18 remove extra components 2025-09-06 21:38:17 -07:00
miloschwartz
3d5f73e344 fix listIdp query error 2025-09-06 17:26:44 -07:00
Owen
6761428a96 Add region 2025-09-06 16:54:16 -07:00
Owen Schwartz
0a9b463eaa New translations en-us.json (Norwegian Bokmal) 2025-09-05 17:16:59 -07:00
Owen Schwartz
c219256fff New translations en-us.json (Chinese Simplified) 2025-09-05 17:16:58 -07:00
Owen Schwartz
7e48803dc5 New translations en-us.json (Turkish) 2025-09-05 17:16:57 -07:00
Owen Schwartz
d496b8a414 New translations en-us.json (Russian) 2025-09-05 17:16:55 -07:00
Owen Schwartz
4825129560 New translations en-us.json (Portuguese) 2025-09-05 17:16:54 -07:00
Owen Schwartz
adc54b2582 New translations en-us.json (Polish) 2025-09-05 17:16:53 -07:00
Owen Schwartz
863567c9b6 New translations en-us.json (Dutch) 2025-09-05 17:16:52 -07:00
Owen Schwartz
102555023b New translations en-us.json (Korean) 2025-09-05 17:16:51 -07:00
Owen Schwartz
f1a9eef531 New translations en-us.json (Italian) 2025-09-05 17:16:49 -07:00
Owen Schwartz
5f007a5b0f New translations en-us.json (German) 2025-09-05 17:16:48 -07:00
Owen Schwartz
9455141262 New translations en-us.json (Czech) 2025-09-05 17:16:47 -07:00
Owen Schwartz
37e1379c88 New translations en-us.json (Bulgarian) 2025-09-05 17:16:46 -07:00
Owen Schwartz
55d597e519 New translations en-us.json (Spanish) 2025-09-05 17:16:45 -07:00
Owen Schwartz
da5ee5c951 New translations en-us.json (French) 2025-09-05 17:16:43 -07:00
miloschwartz
b0bd9279fc add idp auto provision override on user 2025-09-05 16:14:25 -07:00
Owen
90456339ca Add node env for react email issue back 2025-09-05 11:51:44 -07:00
Owen
a653c8bad7 Update start command one more time 2025-09-05 11:45:42 -07:00
Owen
c4fa6cf458 Remove source map support 2025-09-05 11:25:13 -07:00
Owen
268fc7b923 Update build process 2025-09-05 11:23:43 -07:00
miloschwartz
02604f5290 increase telemetry report interval 2025-09-04 20:17:59 -07:00
miloschwartz
1dad7e86a0 add optional icon to strategy select 2025-09-04 18:02:42 -07:00
Owen
838e3efbca Pass in db to pickPort 2025-09-04 18:01:33 -07:00
miloschwartz
3e353717f5 add oidc variant 2025-09-04 17:52:52 -07:00
miloschwartz
0a4b74b91a scope user id check to idp in create idp user 2025-09-04 15:23:51 -07:00
miloschwartz
e69fbf3ccf Merge branch 'dev' of https://github.com/fosrl/pangolin into dev 2025-09-04 15:23:48 -07:00
miloschwartz
0b2349d6bf fix delete idp user 2025-09-04 15:15:10 -07:00
Owen
3a8f04cf14 Add transaction type 2025-09-04 14:01:12 -07:00
Owen
e941cf956f Fix typo in response 2025-09-04 14:01:11 -07:00
Owen Schwartz
29f7bcf6f5 New translations en-us.json (Norwegian Bokmal) 2025-09-04 11:40:07 -07:00
Owen Schwartz
1cf1e0dc57 New translations en-us.json (Chinese Simplified) 2025-09-04 11:40:06 -07:00
Owen Schwartz
175283805e New translations en-us.json (Portuguese) 2025-09-04 11:40:02 -07:00
Owen Schwartz
063c0405e8 New translations en-us.json (Dutch) 2025-09-04 11:40:00 -07:00
Owen Schwartz
947cb77753 New translations en-us.json (Korean) 2025-09-04 11:39:58 -07:00
miloschwartz
28b3b305ea remove special char domain placeholders 2025-09-04 11:27:06 -07:00
miloschwartz
df85f13aea move all components to components dir 2025-09-04 11:18:42 -07:00
Owen Schwartz
042e2c1390 Merge pull request #1413 from AstralDestiny/traefik-dynamic_config-cleanup
Update Traefik to not declare an unnecessary path and make the config cleaner.
2025-09-04 10:46:42 -07:00
AstralDestiny
e6314bee35 Update Traefik to not declare an unnecessary path and make the config cleaner. 2025-09-04 11:44:20 -04:00
Owen
4292d3262e Add niceId to resource 2025-09-03 17:34:16 -07:00
Owen
35d070ad29 Convert to exitNodeComm function 2025-09-02 16:11:08 -07:00
Owen Schwartz
cd79e77576 Merge pull request #1397 from fosrl/dev
1.9.4
2025-09-01 17:47:01 -07:00
Owen Schwartz
1f1c20d637 Merge pull request #1396 from fosrl/crowdin_dev
New Crowdin updates
2025-09-01 17:46:22 -07:00
Owen Schwartz
e87b3b1b54 New translations en-us.json (Norwegian Bokmal) 2025-09-01 17:46:02 -07:00
Owen Schwartz
a6f7b65625 New translations en-us.json (Chinese Simplified) 2025-09-01 17:46:01 -07:00
Owen Schwartz
722fa47132 New translations en-us.json (Turkish) 2025-09-01 17:46:00 -07:00
Owen Schwartz
f83e290b4c New translations en-us.json (Russian) 2025-09-01 17:45:59 -07:00
Owen Schwartz
11b4047283 New translations en-us.json (Portuguese) 2025-09-01 17:45:57 -07:00
Owen Schwartz
69b2032a86 New translations en-us.json (Polish) 2025-09-01 17:45:56 -07:00
Owen Schwartz
636298569f New translations en-us.json (Dutch) 2025-09-01 17:45:55 -07:00
Owen Schwartz
ed8a282d35 New translations en-us.json (Korean) 2025-09-01 17:45:54 -07:00
Owen Schwartz
3bd5e850e0 New translations en-us.json (Italian) 2025-09-01 17:45:52 -07:00
Owen Schwartz
070f1f9159 New translations en-us.json (German) 2025-09-01 17:45:51 -07:00
Owen Schwartz
195644cca5 New translations en-us.json (Czech) 2025-09-01 17:45:50 -07:00
Owen Schwartz
8092c86ecd New translations en-us.json (Bulgarian) 2025-09-01 17:45:49 -07:00
Owen Schwartz
28f33702da New translations en-us.json (Spanish) 2025-09-01 17:45:48 -07:00
Owen Schwartz
570632b8be New translations en-us.json (French) 2025-09-01 17:45:46 -07:00
Owen
f2881e1b31 Merge branch 'Pallavikumarimdb-enhancement-#906/persist-amount-of-entries' into dev 2025-09-01 17:40:02 -07:00
Owen
dad35e37ef Merge branch 'enhancement-#906/persist-amount-of-entries' of github.com:Pallavikumarimdb/pangolin into Pallavikumarimdb-enhancement-#906/persist-amount-of-entries 2025-09-01 17:39:16 -07:00
Owen
39afabd60e Source maps as js 2025-09-01 14:03:32 -07:00
Owen
dc7e14a34b Limit saas 2025-09-01 11:39:30 -07:00
Owen
1dca71a779 Try to include source maps 2025-09-01 11:29:49 -07:00
Pallavi
e9494efa8e quick fix 2025-09-01 23:06:39 +05:30
Owen Schwartz
8159a0f13d Merge pull request #1394 from Pallavikumarimdb/Fix/hostname-field-reset-port-and-method
Fix/hostname field reset port and method
2025-09-01 10:21:31 -07:00
Pallavi
ee9101e738 Save Amount of Entries 2025-09-01 22:26:12 +05:30
Pallavi
b670e6e3dc update parser to handle h2c 2025-09-01 21:47:50 +05:30
Pallavi
5e5754fa62 preserve port and method on host change 2025-09-01 21:22:18 +05:30
Owen Schwartz
5fcf76066f Merge pull request #1391 from fosrl/dev
1.9.3
2025-08-31 20:58:35 -07:00
Owen
601645fa72 Fix translations
Fix #1355
2025-08-31 20:56:49 -07:00
Owen
12765ad675 Merge branch 'Pallavikumarimdb-Fix/allow-unicode-domain-name' into dev 2025-08-31 19:41:35 -07:00
Owen
ad3383d23d Merge branch 'Fix/allow-unicode-domain-name' of github.com:Pallavikumarimdb/pangolin into Pallavikumarimdb-Fix/allow-unicode-domain-name 2025-08-31 19:40:13 -07:00
Pallavi
7d5961cf50 Support unicode with subdomain sanitized 2025-08-31 22:45:42 +05:30
Owen
864aa052f1 Merge branch 'Hetav21-enhancement-1318' into dev 2025-08-31 09:50:47 -07:00
Hetav21
be16196058 feat: make version numbers link to GitHub releases and add Discord link 2025-08-31 21:19:34 +05:30
Pallavi
8a62f12e8b fix lint 2025-08-31 17:53:36 +05:30
Pallavi
78f464f6ca Show/allow unicode domain name 2025-08-31 17:53:35 +05:30
Owen
f37eda4739 Fix #1376 2025-08-30 22:28:37 -07:00
Owen
4e106e9e5a Make more explicit in config telemetry
Fixes #1374
2025-08-30 22:22:42 -07:00
Owen
ccf8e5e6f4 Dont pull org from api key
Fixes #1361
2025-08-30 22:12:35 -07:00
Owen
9455adf61f Add list invitations to integration api
Fixes #1364
2025-08-30 21:18:22 -07:00
miloschwartz
970ab9818a translate managed page 2025-08-30 16:51:44 -07:00
Owen Schwartz
7848cf7141 Merge pull request #1377 from fosrl/dependabot/npm_and_yarn/dev-patch-updates-f90e31e16c
Bump the dev-patch-updates group across 1 directory with 2 updates
2025-08-30 16:12:29 -07:00
Owen
8e5aa9c195 Merge branch 'Pallavikumarimdb-feature-906/smart-host-parsing' into dev 2025-08-30 15:52:45 -07:00
Owen
a03e9ba7dd Merge branch 'feature-906/smart-host-parsing' of github.com:Pallavikumarimdb/pangolin into Pallavikumarimdb-feature-906/smart-host-parsing 2025-08-30 15:51:15 -07:00
Owen
9e646ba385 Merge branch 'Pallavikumarimdb-Fix/domain-picker-issue' into dev 2025-08-30 15:24:15 -07:00
Owen
d9a4f20fe6 Merge branch 'Fix/domain-picker-issue' of github.com:Pallavikumarimdb/pangolin into Pallavikumarimdb-Fix/domain-picker-issue 2025-08-30 15:22:02 -07:00
Owen
e659f0e75d Fix type 2025-08-29 15:39:06 -07:00
Owen
8891d6239f Handle wildcard certs 2025-08-29 15:35:57 -07:00
Pallavi
e3bd3fb985 consistent full domain 2025-08-30 02:59:23 +05:30
Pallavi
54764dfacd unify subdomain validation schema to handle edge cases 2025-08-30 01:14:03 +05:30
Owen
b156b5ff2d Make /32 to not mess with newt 2025-08-28 22:42:27 -07:00
Owen
d8e547c9a0 Configure if allow raw resources 2025-08-28 22:11:24 -07:00
dependabot[bot]
a0b93377a4 Bump the dev-patch-updates group across 1 directory with 2 updates
Bumps the dev-patch-updates group with 2 updates in the / directory: [@types/react](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/react) and [@types/react-dom](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/react-dom).


Updates `@types/react` from 19.1.11 to 19.1.12
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/react)

Updates `@types/react-dom` from 19.1.8 to 19.1.9
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/react-dom)

---
updated-dependencies:
- dependency-name: "@types/react"
  dependency-version: 19.1.12
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dev-patch-updates
- dependency-name: "@types/react-dom"
  dependency-version: 19.1.9
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dev-patch-updates
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-08-29 01:23:18 +00:00
Pallavi
e8a6efd079 subdomain validation consistent 2025-08-29 03:58:49 +05:30
Pallavi
18bb6caf8f allows typing flow while providing helpful validation 2025-08-29 02:44:39 +05:30
Pallavi
bc335d15c0 preserve subdomain with sanitizeSubdomain and validateSubdomain 2025-08-29 01:12:12 +05:30
Owen Schwartz
2a0d440a34 Merge pull request #1366 from fosrl/dev
1.9.2
2025-08-27 12:02:21 -07:00
Owen Schwartz
b0500fac29 Merge pull request #1367 from fosrl/crowdin_dev
New Crowdin updates
2025-08-27 11:59:06 -07:00
Owen Schwartz
af16e6423a New translations en-us.json (Norwegian Bokmal) 2025-08-27 11:58:46 -07:00
Owen Schwartz
ff90471f0f New translations en-us.json (Chinese Simplified) 2025-08-27 11:58:44 -07:00
Owen Schwartz
bcc501c524 New translations en-us.json (Turkish) 2025-08-27 11:58:43 -07:00
Owen Schwartz
c4ef211a3e New translations en-us.json (Russian) 2025-08-27 11:58:42 -07:00
Owen Schwartz
592c0eb7ab New translations en-us.json (Portuguese) 2025-08-27 11:58:41 -07:00
Owen Schwartz
880a000865 New translations en-us.json (Polish) 2025-08-27 11:58:40 -07:00
Owen Schwartz
a9571f6adf New translations en-us.json (Dutch) 2025-08-27 11:58:38 -07:00
Owen Schwartz
ca91f313bc New translations en-us.json (Korean) 2025-08-27 11:58:37 -07:00
Owen Schwartz
76b9753916 New translations en-us.json (Italian) 2025-08-27 11:58:36 -07:00
Owen Schwartz
cd8bbe28bf New translations en-us.json (German) 2025-08-27 11:58:35 -07:00
Owen Schwartz
9550c11594 New translations en-us.json (Spanish) 2025-08-27 11:58:32 -07:00
Owen Schwartz
7ac21cad25 New translations en-us.json (French) 2025-08-27 11:58:30 -07:00
Owen
2008a3955a Change destructuring 2025-08-27 11:31:15 -07:00
Owen
f1641c9f3e Dont create exit node on new key
Fixes #1347
Fixes #776
Fixes #1090
2025-08-27 11:25:10 -07:00
Owen Schwartz
bec5bbd033 Merge pull request #1329 from fosrl/dependabot/go_modules/install/prod-minor-updates-b66dbea3a9
Bump golang.org/x/term from 0.33.0 to 0.34.0 in /install in the prod-minor-updates group
2025-08-27 10:55:48 -07:00
Owen Schwartz
ae11f72e28 Merge pull request #1362 from fosrl/dependabot/npm_and_yarn/dev-patch-updates-43a727f364
Bump the dev-patch-updates group across 1 directory with 3 updates
2025-08-27 10:50:20 -07:00
Owen Schwartz
6b88cb3920 Merge pull request #1354 from fosrl/crowdin_dev
New Crowdin updates
2025-08-27 10:47:58 -07:00
dependabot[bot]
38772111e8 Bump the dev-patch-updates group across 1 directory with 3 updates
Bumps the dev-patch-updates group with 3 updates in the / directory: [@types/react](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/react), [@types/react-dom](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/react-dom) and [tsx](https://github.com/privatenumber/tsx).


Updates `@types/react` from 19.1.10 to 19.1.11
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/react)

Updates `@types/react-dom` from 19.1.7 to 19.1.8
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/react-dom)

Updates `tsx` from 4.20.4 to 4.20.5
- [Release notes](https://github.com/privatenumber/tsx/releases)
- [Changelog](https://github.com/privatenumber/tsx/blob/master/release.config.cjs)
- [Commits](https://github.com/privatenumber/tsx/compare/v4.20.4...v4.20.5)

---
updated-dependencies:
- dependency-name: "@types/react"
  dependency-version: 19.1.11
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dev-patch-updates
- dependency-name: "@types/react-dom"
  dependency-version: 19.1.8
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dev-patch-updates
- dependency-name: tsx
  dependency-version: 4.20.5
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dev-patch-updates
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-08-27 11:45:42 +00:00
Owen Schwartz
14f50c3e66 New translations en-us.json (Czech) 2025-08-27 02:22:26 -07:00
Owen
b89a2c9e49 Trust the gerbil proxy for proxyProtcol 2025-08-26 22:36:33 -07:00
Owen Schwartz
2d2eda988c New translations en-us.json (Norwegian Bokmal) 2025-08-26 22:34:55 -07:00
Owen Schwartz
432033969b New translations en-us.json (Chinese Simplified) 2025-08-26 22:34:54 -07:00
Owen Schwartz
1fbf74e1f7 New translations en-us.json (Turkish) 2025-08-26 22:34:53 -07:00
Owen Schwartz
93648ff00b New translations en-us.json (Russian) 2025-08-26 22:34:52 -07:00
Owen Schwartz
9513136610 New translations en-us.json (Portuguese) 2025-08-26 22:34:50 -07:00
Owen Schwartz
43a2a39f8d New translations en-us.json (Polish) 2025-08-26 22:34:49 -07:00
Owen Schwartz
218351de9a New translations en-us.json (Dutch) 2025-08-26 22:34:48 -07:00
Owen Schwartz
b92b922eee New translations en-us.json (Korean) 2025-08-26 22:34:46 -07:00
Owen Schwartz
91be4937ee New translations en-us.json (Italian) 2025-08-26 22:34:45 -07:00
Owen Schwartz
19b36a5fae New translations en-us.json (German) 2025-08-26 22:34:44 -07:00
Owen Schwartz
bb9ee7dfd2 New translations en-us.json (Czech) 2025-08-26 22:34:42 -07:00
Owen Schwartz
ac0351b525 New translations en-us.json (Bulgarian) 2025-08-26 22:34:41 -07:00
Owen Schwartz
405f5ad7cc New translations en-us.json (Spanish) 2025-08-26 22:34:40 -07:00
Owen Schwartz
8cc2712da3 New translations en-us.json (French) 2025-08-26 22:34:39 -07:00
Owen
c02ac8d1bf Seperate out function 2025-08-26 17:19:04 -07:00
Owen
a1802add19 Geoblocking works 2025-08-26 17:14:55 -07:00
Owen
218a6642a2 Merge branch 'dev' into geoip 2025-08-25 21:07:17 -07:00
dependabot[bot]
21a83a5755 Bump golang.org/x/term in /install in the prod-minor-updates group
Bumps the prod-minor-updates group in /install with 1 update: [golang.org/x/term](https://github.com/golang/term).


Updates `golang.org/x/term` from 0.33.0 to 0.34.0
- [Commits](https://github.com/golang/term/compare/v0.33.0...v0.34.0)

---
updated-dependencies:
- dependency-name: golang.org/x/term
  dependency-version: 0.34.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: prod-minor-updates
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-08-26 02:12:49 +00:00
Owen Schwartz
bec75e51f6 New translations en-us.json (French) 2025-08-25 17:41:14 -07:00
Owen Schwartz
6c9b445be6 Merge pull request #1353 from fosrl/dev
1.9.1
2025-08-25 17:13:33 -07:00
Owen
06b17fa941 Merge branch 'main' into dev 2025-08-25 17:07:28 -07:00
Owen
e1d4c029e7 Remove cancel button
Fixes #1312
2025-08-25 17:00:51 -07:00
Owen
293fd70ccb Remove bad file 2025-08-25 16:51:33 -07:00
Owen Schwartz
4ee863db5a Merge pull request #1352 from fosrl/crowdin_dev
New Crowdin updates
2025-08-25 16:42:41 -07:00
Owen Schwartz
2717be0fed New translations en-us.json (Norwegian Bokmal) 2025-08-25 16:42:22 -07:00
Owen Schwartz
1f312e146f New translations en-us.json (Chinese Simplified) 2025-08-25 16:42:21 -07:00
Owen Schwartz
b91557ebb0 New translations en-us.json (Turkish) 2025-08-25 16:42:20 -07:00
Owen Schwartz
465380b5a3 New translations en-us.json (Russian) 2025-08-25 16:42:19 -07:00
Owen Schwartz
60af901feb New translations en-us.json (Portuguese) 2025-08-25 16:42:17 -07:00
Owen Schwartz
ea78a654ff New translations en-us.json (Polish) 2025-08-25 16:42:16 -07:00
Owen Schwartz
f28b6ad0a5 New translations en-us.json (Dutch) 2025-08-25 16:42:15 -07:00
Owen Schwartz
a3bdab1318 New translations en-us.json (Korean) 2025-08-25 16:42:14 -07:00
Owen Schwartz
f8c5d01e3c New translations en-us.json (Italian) 2025-08-25 16:42:13 -07:00
Owen Schwartz
3ebe218b7f New translations en-us.json (German) 2025-08-25 16:42:12 -07:00
Owen Schwartz
7d039ab729 New translations en-us.json (Czech) 2025-08-25 16:42:10 -07:00
Owen Schwartz
b2b6c8c268 New translations en-us.json (Bulgarian) 2025-08-25 16:42:09 -07:00
Owen Schwartz
4950f25063 New translations en-us.json (Spanish) 2025-08-25 16:42:08 -07:00
Owen Schwartz
524d6b48d9 New translations en-us.json (French) 2025-08-25 16:42:07 -07:00
Owen
29fb5735e2 Add missing api endpoints to integration
Fixes #1344
2025-08-25 16:23:22 -07:00
Owen
247fc85440 Fix #1339 2025-08-25 16:08:37 -07:00
Owen
2b4302572c Fix #1343 2025-08-25 13:58:21 -07:00
Owen
9b28780e62 Merge branch 'main' of github.com:fosrl/pangolin 2025-08-25 13:56:34 -07:00
Owen Schwartz
8656f68008 Merge pull request #1341 from SINF-KEN/main
fix typos french.
2025-08-25 11:10:35 -07:00
SINF-KEN
15651b6919 fix typos french. 2025-08-25 12:33:45 +02:00
Owen
78d3861382 Add pass rule 2025-08-24 22:20:09 -07:00
Owen
72f19274cd Add ip lookup 2025-08-24 21:58:52 -07:00
Owen
adbcd1a2e0 Add missing cols 2025-08-24 13:51:03 -07:00
Owen
5b7727fab4 Fix #1332 2025-08-24 12:22:54 -07:00
Owen
9627dfa90c Add ipKeyGenerator 2025-08-24 12:18:34 -07:00
Owen
50022c9fc8 Update readme 2025-08-24 10:33:03 -07:00
Owen Schwartz
e0b76ffebc Merge pull request #1322 from fosrl/dev
1.9.0
2025-08-24 10:31:23 -07:00
Owen Schwartz
be5a9a840c Merge pull request #1323 from fosrl/crowdin_dev
New Crowdin updates
2025-08-23 15:51:54 -07:00
Owen Schwartz
6e5f429e0a New translations en-us.json (Norwegian Bokmal) 2025-08-23 15:51:05 -07:00
Owen Schwartz
e9d9d6e2f4 New translations en-us.json (Chinese Simplified) 2025-08-23 15:51:04 -07:00
Owen Schwartz
b4a57e630c New translations en-us.json (Turkish) 2025-08-23 15:51:03 -07:00
Owen Schwartz
1062e33dc8 New translations en-us.json (Russian) 2025-08-23 15:51:02 -07:00
Owen Schwartz
0e14441f73 New translations en-us.json (Portuguese) 2025-08-23 15:51:01 -07:00
Owen Schwartz
a6a909ae4f New translations en-us.json (Polish) 2025-08-23 15:51:00 -07:00
Owen Schwartz
2b4a39e64c New translations en-us.json (Dutch) 2025-08-23 15:50:59 -07:00
Owen Schwartz
82b4921602 New translations en-us.json (Korean) 2025-08-23 15:50:58 -07:00
Owen Schwartz
4229324a5d New translations en-us.json (Italian) 2025-08-23 15:50:57 -07:00
Owen Schwartz
34d3ca9c51 New translations en-us.json (German) 2025-08-23 15:50:55 -07:00
Owen Schwartz
9bd7002917 New translations en-us.json (Spanish) 2025-08-23 15:50:53 -07:00
Owen Schwartz
ebed9f7a68 New translations en-us.json (French) 2025-08-23 15:50:52 -07:00
Owen
5d34bd82c0 Adjust const one more time 2025-08-23 15:36:19 -07:00
Owen
8bcb2b3b0f Fix type error 2025-08-23 15:30:03 -07:00
Owen
32ba17cf91 Fix linter errors 2025-08-23 15:26:43 -07:00
Owen
704ded4410 Merge branch 'dev' of github.com:fosrl/pangolin into dev 2025-08-23 15:23:09 -07:00
Owen
88277976c6 Merge branch 'main' into dev 2025-08-23 15:21:32 -07:00
Owen Schwartz
cb95f02912 Merge pull request #1308 from fosrl/dependabot/npm_and_yarn/dev-minor-updates-65c0d343c4
Bump the dev-minor-updates group with 3 updates
2025-08-23 15:20:25 -07:00
Owen Schwartz
928b406359 Merge pull request #1310 from fosrl/crowdin_dev
New Crowdin updates
2025-08-23 15:16:26 -07:00
Owen Schwartz
4757c7db8c Merge pull request #1281 from jackrosenberg/push-nymutulytrsq
fix: change default integration_api to 3004
2025-08-23 15:16:03 -07:00
Owen
5df87641a1 Fix #1321 2025-08-23 15:13:44 -07:00
Owen
04077c53fd Update url to cloud 2025-08-23 12:31:16 -07:00
Owen
574be52b84 Revert b4be620a5b 2025-08-22 10:43:04 -07:00
Owen Schwartz
a66613c5ca New translations en-us.json (Czech) 2025-08-22 09:05:46 -07:00
Owen Schwartz
01b3b19715 New translations en-us.json (Czech) 2025-08-22 07:34:03 -07:00
Pallavi
fb1481c69c fix lint issue 2025-08-22 19:18:47 +05:30
Pallavi
9557f755a5 Add Smart Host Parsing 2025-08-22 13:07:03 +05:30
Owen
60d8831399 Rename hybrid to managed 2025-08-21 14:19:21 -07:00
Owen
5ff5660db3 Add key 2025-08-21 14:12:09 -07:00
Owen Schwartz
d62c359452 New translations en-us.json (Bulgarian) 2025-08-21 00:53:41 -07:00
Owen Schwartz
ec0b6b64fe New translations en-us.json (Bulgarian) 2025-08-20 23:16:40 -07:00
Owen
c53eac76f8 Bug fixes around hybrid 2025-08-20 18:50:39 -07:00
Owen
49cb2ae260 Fixes for siteResources with clients 2025-08-20 18:49:58 -07:00
Owen
77796e8a75 Adjust again for uncertian config 2025-08-20 17:48:55 -07:00
Owen
49f0f6ec7d Installer working with hybrid 2025-08-20 17:00:52 -07:00
Owen Schwartz
2c273a85d8 New translations en-us.json (Bulgarian) 2025-08-20 14:56:23 -07:00
Owen
8273554a1c Hybrid install mode done? 2025-08-20 12:40:21 -07:00
Owen
ad8ab63fd5 Reorging functions 2025-08-20 11:20:46 -07:00
Owen
7de0761329 Rename function 2025-08-20 11:20:46 -07:00
Owen
907dab7d05 Move docker podman question and add hybird question
Allow empty config

Continue to adjust config for hybrid
2025-08-20 11:20:34 -07:00
Owen
2907f22200 Fix server component issue 2025-08-19 22:20:11 -07:00
Owen
7bbe1b2dbe Align correctly 2025-08-19 22:18:42 -07:00
Owen Schwartz
099513072c Merge pull request #1306 from fosrl/crowdin_dev
New Crowdin updates
2025-08-19 22:13:21 -07:00
Owen
7de8bb00e7 Use the sites if they are offline for now 2025-08-19 22:07:52 -07:00
dependabot[bot]
12d44696e8 Bump the dev-minor-updates group with 3 updates
Bumps the dev-minor-updates group with 3 updates: [@dotenvx/dotenvx](https://github.com/dotenvx/dotenvx), [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) and [typescript-eslint](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/typescript-eslint).


Updates `@dotenvx/dotenvx` from 1.48.4 to 1.49.0
- [Release notes](https://github.com/dotenvx/dotenvx/releases)
- [Changelog](https://github.com/dotenvx/dotenvx/blob/main/CHANGELOG.md)
- [Commits](https://github.com/dotenvx/dotenvx/compare/v1.48.4...v1.49.0)

Updates `@types/node` from 24.2.1 to 24.3.0
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

Updates `typescript-eslint` from 8.39.1 to 8.40.0
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/typescript-eslint/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.40.0/packages/typescript-eslint)

---
updated-dependencies:
- dependency-name: "@dotenvx/dotenvx"
  dependency-version: 1.49.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: dev-minor-updates
- dependency-name: "@types/node"
  dependency-version: 24.3.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: dev-minor-updates
- dependency-name: typescript-eslint
  dependency-version: 8.40.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: dev-minor-updates
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-08-20 04:47:04 +00:00
Owen
25cef26251 Fix ws reconnect and change create site 2025-08-19 21:29:56 -07:00
Owen Schwartz
dceb398695 New translations en-us.json (Chinese Simplified) 2025-08-19 12:13:19 -07:00
Owen Schwartz
f60599abd3 New translations en-us.json (Turkish) 2025-08-19 12:13:18 -07:00
Owen Schwartz
44f8098e4a New translations en-us.json (Russian) 2025-08-19 12:13:16 -07:00
Owen Schwartz
747979f939 New translations en-us.json (Portuguese) 2025-08-19 12:13:15 -07:00
Owen Schwartz
b3083ae779 New translations en-us.json (Polish) 2025-08-19 12:13:14 -07:00
Owen Schwartz
67580a8b69 New translations en-us.json (Norwegian Bokmal) 2025-08-19 12:13:11 -07:00
Owen Schwartz
291c7aaf0b New translations en-us.json (Dutch) 2025-08-19 12:13:10 -07:00
Owen Schwartz
1a098eecf6 New translations en-us.json (Korean) 2025-08-19 12:13:08 -07:00
Owen Schwartz
0a05bdba1d New translations en-us.json (Italian) 2025-08-19 12:13:07 -07:00
Owen Schwartz
37bfc07ffb New translations en-us.json (German) 2025-08-19 12:13:06 -07:00
Owen Schwartz
eae3ab2dc1 New translations en-us.json (Czech) 2025-08-19 12:13:04 -07:00
Owen Schwartz
1665bf6515 New translations en-us.json (Bulgarian) 2025-08-19 12:13:03 -07:00
Owen Schwartz
0383ffb7f3 New translations en-us.json (Spanish) 2025-08-19 12:13:02 -07:00
Owen Schwartz
a0d6646e49 New translations en-us.json (French) 2025-08-19 12:13:01 -07:00
Owen
254b3a0fc8 Also filer out offline sites? 2025-08-19 11:26:37 -07:00
Owen
21743e5a23 Clarify site address 2025-08-19 11:26:37 -07:00
Owen Schwartz
0550924e08 Merge pull request #1278 from fosrl/dependabot/npm_and_yarn/express-rate-limit-8.0.1
Bump express-rate-limit from 7.5.1 to 8.0.1
2025-08-18 22:18:05 -07:00
Owen Schwartz
7867302be5 Merge pull request #1297 from fosrl/dependabot/npm_and_yarn/dev-patch-updates-1706bce14d
Bump the dev-patch-updates group with 2 updates
2025-08-18 22:17:20 -07:00
Owen Schwartz
14815b388d Merge pull request #1298 from fosrl/dependabot/npm_and_yarn/prod-patch-updates-c7b744908a
Bump the prod-patch-updates group across 1 directory with 13 updates
2025-08-18 22:17:08 -07:00
Owen Schwartz
92cc82220e Merge pull request #1299 from fosrl/dependabot/github_actions/actions/checkout-5
Bump actions/checkout from 4 to 5
2025-08-18 22:16:16 -07:00
Owen Schwartz
da1fae6016 Merge pull request #1304 from Pallavikumarimdb/Fix/Manage-resources-cardheader-responsive
Fix: responsive layout for CardHeader (small/medium/large screens)  inside manage resources page.
2025-08-18 22:09:12 -07:00
miloschwartz
34002470a5 add migration to scirpts 2025-08-18 16:27:51 -07:00
miloschwartz
49f84bccad migrations 2025-08-18 15:43:48 -07:00
Owen
4bcb4a1590 Merge branch 'hybrid' into dev 2025-08-18 15:29:23 -07:00
miloschwartz
378de19f41 add pg 1.9.0 migration 2025-08-18 15:29:04 -07:00
Owen
ffe2512734 Update 2025-08-18 15:27:59 -07:00
Pallavi
b4be620a5b Fix: responsive layout for CardHeader (small/medium/large screens) 2025-08-19 03:53:49 +05:30
miloschwartz
ac8b546393 add sqlite 1.9.0 migration 2025-08-18 14:29:06 -07:00
Owen
9bdf31ee97 Add csrf to auth 2025-08-18 12:22:45 -07:00
Owen
c29cd05db8 Update to pull defaults from var 2025-08-18 12:22:45 -07:00
miloschwartz
cd34820138 prompt for convert node in installer 2025-08-18 12:06:59 -07:00
miloschwartz
d207318494 remove org from get client route 2025-08-18 12:06:01 -07:00
Owen
117062f1d1 One start command 2025-08-17 22:18:25 -07:00
Owen
9d561ba94d Remove bad import 2025-08-17 22:01:30 -07:00
Owen
97fcaed9b4 Optionally use file mode 2025-08-17 21:58:27 -07:00
Owen
5e53ea3607 Merge branch 'hybrid' of github.com:fosrl/pangolin into hybrid 2025-08-17 21:47:13 -07:00
Owen
7dc74cb61b Fix import for traefikConfig 2025-08-17 21:45:17 -07:00
Owen
fbefcfedb9 Also allow local traefikConfig 2025-08-17 21:44:28 -07:00
miloschwartz
36c0d9aba2 add hybrid splash 2025-08-17 21:29:21 -07:00
Owen
8c8a981452 Make more efficient the cert get 2025-08-17 20:18:10 -07:00
dependabot[bot]
7dd586e31d Bump actions/checkout from 4 to 5
Bumps [actions/checkout](https://github.com/actions/checkout) from 4 to 5.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/checkout/compare/v4...v5)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-version: '5'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-08-18 02:32:20 +00:00
dependabot[bot]
366a31b41b Bump the prod-patch-updates group across 1 directory with 13 updates
Bumps the prod-patch-updates group with 13 updates in the / directory:

| Package | From | To |
| --- | --- | --- |
| [@radix-ui/react-checkbox](https://github.com/radix-ui/primitives) | `1.3.2` | `1.3.3` |
| [@radix-ui/react-collapsible](https://github.com/radix-ui/primitives) | `1.1.11` | `1.1.12` |
| [@radix-ui/react-dialog](https://github.com/radix-ui/primitives) | `1.1.14` | `1.1.15` |
| [@radix-ui/react-dropdown-menu](https://github.com/radix-ui/primitives) | `2.1.15` | `2.1.16` |
| [@radix-ui/react-popover](https://github.com/radix-ui/primitives) | `1.1.14` | `1.1.15` |
| [@radix-ui/react-radio-group](https://github.com/radix-ui/primitives) | `1.3.7` | `1.3.8` |
| [@radix-ui/react-scroll-area](https://github.com/radix-ui/primitives) | `1.2.9` | `1.2.10` |
| [@radix-ui/react-select](https://github.com/radix-ui/primitives) | `2.2.5` | `2.2.6` |
| [@radix-ui/react-switch](https://github.com/radix-ui/primitives) | `1.2.5` | `1.2.6` |
| [@radix-ui/react-tabs](https://github.com/radix-ui/primitives) | `1.1.12` | `1.1.13` |
| [@radix-ui/react-toast](https://github.com/radix-ui/primitives) | `1.2.14` | `1.2.15` |
| [@radix-ui/react-tooltip](https://github.com/radix-ui/primitives) | `1.2.7` | `1.2.8` |
| [tw-animate-css](https://github.com/Wombosvideo/tw-animate-css) | `1.3.6` | `1.3.7` |



Updates `@radix-ui/react-checkbox` from 1.3.2 to 1.3.3
- [Changelog](https://github.com/radix-ui/primitives/blob/main/release-process.md)
- [Commits](https://github.com/radix-ui/primitives/commits)

Updates `@radix-ui/react-collapsible` from 1.1.11 to 1.1.12
- [Changelog](https://github.com/radix-ui/primitives/blob/main/release-process.md)
- [Commits](https://github.com/radix-ui/primitives/commits)

Updates `@radix-ui/react-dialog` from 1.1.14 to 1.1.15
- [Changelog](https://github.com/radix-ui/primitives/blob/main/release-process.md)
- [Commits](https://github.com/radix-ui/primitives/commits)

Updates `@radix-ui/react-dropdown-menu` from 2.1.15 to 2.1.16
- [Changelog](https://github.com/radix-ui/primitives/blob/main/release-process.md)
- [Commits](https://github.com/radix-ui/primitives/commits)

Updates `@radix-ui/react-popover` from 1.1.14 to 1.1.15
- [Changelog](https://github.com/radix-ui/primitives/blob/main/release-process.md)
- [Commits](https://github.com/radix-ui/primitives/commits)

Updates `@radix-ui/react-radio-group` from 1.3.7 to 1.3.8
- [Changelog](https://github.com/radix-ui/primitives/blob/main/release-process.md)
- [Commits](https://github.com/radix-ui/primitives/commits)

Updates `@radix-ui/react-scroll-area` from 1.2.9 to 1.2.10
- [Changelog](https://github.com/radix-ui/primitives/blob/main/release-process.md)
- [Commits](https://github.com/radix-ui/primitives/commits)

Updates `@radix-ui/react-select` from 2.2.5 to 2.2.6
- [Changelog](https://github.com/radix-ui/primitives/blob/main/release-process.md)
- [Commits](https://github.com/radix-ui/primitives/commits)

Updates `@radix-ui/react-switch` from 1.2.5 to 1.2.6
- [Changelog](https://github.com/radix-ui/primitives/blob/main/release-process.md)
- [Commits](https://github.com/radix-ui/primitives/commits)

Updates `@radix-ui/react-tabs` from 1.1.12 to 1.1.13
- [Changelog](https://github.com/radix-ui/primitives/blob/main/release-process.md)
- [Commits](https://github.com/radix-ui/primitives/commits)

Updates `@radix-ui/react-toast` from 1.2.14 to 1.2.15
- [Changelog](https://github.com/radix-ui/primitives/blob/main/release-process.md)
- [Commits](https://github.com/radix-ui/primitives/commits)

Updates `@radix-ui/react-tooltip` from 1.2.7 to 1.2.8
- [Changelog](https://github.com/radix-ui/primitives/blob/main/release-process.md)
- [Commits](https://github.com/radix-ui/primitives/commits)

Updates `tw-animate-css` from 1.3.6 to 1.3.7
- [Release notes](https://github.com/Wombosvideo/tw-animate-css/releases)
- [Commits](https://github.com/Wombosvideo/tw-animate-css/compare/v1.3.6...v1.3.7)

---
updated-dependencies:
- dependency-name: "@radix-ui/react-checkbox"
  dependency-version: 1.3.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: prod-patch-updates
- dependency-name: "@radix-ui/react-collapsible"
  dependency-version: 1.1.12
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: prod-patch-updates
- dependency-name: "@radix-ui/react-dialog"
  dependency-version: 1.1.15
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: prod-patch-updates
- dependency-name: "@radix-ui/react-dropdown-menu"
  dependency-version: 2.1.16
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: prod-patch-updates
- dependency-name: "@radix-ui/react-popover"
  dependency-version: 1.1.15
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: prod-patch-updates
- dependency-name: "@radix-ui/react-radio-group"
  dependency-version: 1.3.8
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: prod-patch-updates
- dependency-name: "@radix-ui/react-scroll-area"
  dependency-version: 1.2.10
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: prod-patch-updates
- dependency-name: "@radix-ui/react-select"
  dependency-version: 2.2.6
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: prod-patch-updates
- dependency-name: "@radix-ui/react-switch"
  dependency-version: 1.2.6
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: prod-patch-updates
- dependency-name: "@radix-ui/react-tabs"
  dependency-version: 1.1.13
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: prod-patch-updates
- dependency-name: "@radix-ui/react-toast"
  dependency-version: 1.2.15
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: prod-patch-updates
- dependency-name: "@radix-ui/react-tooltip"
  dependency-version: 1.2.8
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: prod-patch-updates
- dependency-name: tw-animate-css
  dependency-version: 1.3.7
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: prod-patch-updates
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-08-18 02:22:55 +00:00
dependabot[bot]
f09557d73c Bump the dev-patch-updates group with 2 updates
Bumps the dev-patch-updates group with 2 updates: [@tailwindcss/postcss](https://github.com/tailwindlabs/tailwindcss/tree/HEAD/packages/@tailwindcss-postcss) and [tailwindcss](https://github.com/tailwindlabs/tailwindcss/tree/HEAD/packages/tailwindcss).


Updates `@tailwindcss/postcss` from 4.1.11 to 4.1.12
- [Release notes](https://github.com/tailwindlabs/tailwindcss/releases)
- [Changelog](https://github.com/tailwindlabs/tailwindcss/blob/main/CHANGELOG.md)
- [Commits](https://github.com/tailwindlabs/tailwindcss/commits/v4.1.12/packages/@tailwindcss-postcss)

Updates `tailwindcss` from 4.1.11 to 4.1.12
- [Release notes](https://github.com/tailwindlabs/tailwindcss/releases)
- [Changelog](https://github.com/tailwindlabs/tailwindcss/blob/main/CHANGELOG.md)
- [Commits](https://github.com/tailwindlabs/tailwindcss/commits/v4.1.12/packages/tailwindcss)

---
updated-dependencies:
- dependency-name: "@tailwindcss/postcss"
  dependency-version: 4.1.12
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dev-patch-updates
- dependency-name: tailwindcss
  dependency-version: 4.1.12
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dev-patch-updates
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-08-18 02:18:49 +00:00
Owen
33a2ac402c Fix " 2025-08-17 18:36:23 -07:00
Owen
632333c49f Fix build args again 2025-08-17 18:31:08 -07:00
Owen
c8bea4d7de Finish adding arg 2025-08-17 18:20:53 -07:00
Owen
c1d75d32c2 Remove old docker files 2025-08-17 18:19:33 -07:00
Owen
b805daec51 Move to build arg 2025-08-17 18:18:26 -07:00
Owen
af2088df4e Control which types of sites work and tell user 2025-08-17 18:01:36 -07:00
Owen
3b8d1f40a7 Include get hostname, filter sites fix gerbil conf 2025-08-17 11:23:43 -07:00
Owen
8355d3664e Retry the token request 2025-08-16 17:53:33 -07:00
Owen
83a696f743 Make traefik config wor 2025-08-16 17:29:27 -07:00
Owen
7ca507b1ce Fixing traefik problems 2025-08-16 17:16:19 -07:00
Owen
609435328e Smoothing over initial connection issues 2025-08-16 16:42:34 -07:00
Owen
d771317e3f Fix traefik config 2025-08-16 14:57:19 -07:00
Owen
d548563e65 Export the right thing 2025-08-16 14:54:16 -07:00
Owen
f07cd8aee3 Fix traefik config merge 2025-08-16 12:07:15 -07:00
miloschwartz
48963f24df add oss check 2025-08-16 12:06:42 -07:00
Owen
7bf98c0c40 Merge branch 'dev' into hybrid 2025-08-16 12:04:16 -07:00
Owen
e73383cc79 Add auth to gerbil calls 2025-08-15 16:53:30 -07:00
miloschwartz
79ce93d578 Merge branch 'site-targets-auto-login' into dev 2025-08-15 16:42:09 -07:00
miloschwartz
200a7fcd40 fix sidebar spacing 2025-08-15 16:00:58 -07:00
Owen
e043d0e654 Use new function 2025-08-15 15:59:38 -07:00
Owen
21ce678e5b Move exit node function 2025-08-15 15:52:09 -07:00
Owen
5c94887949 Use new exit node functions 2025-08-15 15:45:45 -07:00
Owen
69a9bcb3da Add exit node helper functions 2025-08-15 15:34:31 -07:00
Owen
2fea091e1f Move newt version 2025-08-15 12:24:54 -07:00
Owen Schwartz
24314a103f Merge pull request #1284 from Pallavikumarimdb/Fix/missing-hostmeta-export-PG
add missing hostmeta export for PG schema
2025-08-15 10:55:22 -07:00
Pallavi
b56db41d0b add missing hostmeta export for PG schema 2025-08-15 21:23:07 +05:30
Owen
825bff5d60 Badger & traefik working now? 2025-08-14 21:48:14 -07:00
Owen
f9184cf489 Handle badger config correctly 2025-08-14 20:30:07 -07:00
miloschwartz
5c04b1e14a add site targets, client resources, and auto login 2025-08-14 18:24:21 -07:00
Owen
2c96eb7851 Adding and removing peers working; better axios errors 2025-08-14 17:57:50 -07:00
miloschwartz
67ba225003 add statistics 2025-08-14 17:06:07 -07:00
Owen
04ecf41c5a Move exit node comms to new file 2025-08-14 15:39:05 -07:00
Owen
6600de7320 Traefik config & gerbil config working? 2025-08-14 14:47:07 -07:00
Owen
f7b82f0a7a Work on pulling in remote traefik 2025-08-14 12:35:33 -07:00
Owen
65bdb232f4 Use right logging 2025-08-14 12:01:07 -07:00
Owen
200e3af384 Websocket connects 2025-08-14 11:58:08 -07:00
Owen
aabfa91f80 Fix ping new integer 2025-08-14 11:11:01 -07:00
Jack Rosenberg
e5468a7391 fix: change default integration_api to 3004 2025-08-14 19:53:25 +02:00
Owen
d5a11edd0c Remove orgId 2025-08-14 10:38:22 -07:00
Owen
fcc86b07ba Break out hole punch 2025-08-13 22:05:26 -07:00
miloschwartz
74d2527af5 make email lower case in pangctl reset password closes #1210 2025-08-13 22:00:20 -07:00
Owen
50cf284273 Break out bandwidth 2025-08-13 21:45:44 -07:00
Owen
aaddde0a9b Add export 2025-08-13 21:41:33 -07:00
Owen
ac87345b7a Seperate get relays 2025-08-13 21:35:06 -07:00
Owen
23079d9ac0 Fix exit node ping message 2025-08-13 20:48:54 -07:00
Owen
b573d63648 Add cols to exit node 2025-08-13 20:41:29 -07:00
Owen
34d705a54e Rename olm offline 2025-08-13 20:31:48 -07:00
Owen
eeb1d4954d Use an epoch number for the clients online to fix query 2025-08-13 20:27:57 -07:00
Owen
b638adedff Seperate get gerbil config 2025-08-13 20:27:48 -07:00
Owen
285e24cdc7 Use an epoch number for the clients online to fix query 2025-08-13 20:26:50 -07:00
dependabot[bot]
396e643b06 Bump express-rate-limit from 7.5.1 to 8.0.1
Bumps [express-rate-limit](https://github.com/express-rate-limit/express-rate-limit) from 7.5.1 to 8.0.1.
- [Release notes](https://github.com/express-rate-limit/express-rate-limit/releases)
- [Commits](https://github.com/express-rate-limit/express-rate-limit/compare/v7.5.1...v8.0.1)

---
updated-dependencies:
- dependency-name: express-rate-limit
  dependency-version: 8.0.1
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-08-14 02:08:28 +00:00
Owen
dc50190dc3 Handle token 2025-08-13 17:30:59 -07:00
Owen
2c8bf4f18c Handle oss tls 2025-08-13 16:23:24 -07:00
Owen
1f6379a7e6 Break out traefik config 2025-08-13 16:15:23 -07:00
Owen
ddd8eb1da0 Change sni proxy url 2025-08-13 16:02:03 -07:00
Owen
4c463de45f Version does not need to be notNull 2025-08-13 14:47:03 -07:00
Owen
1f4a7a7f6f Add olm version 2025-08-13 12:35:09 -07:00
Owen
e7df29104e Fix backwards compat path 2025-08-13 12:28:45 -07:00
Owen
9987b35b60 Update package lock again 2025-08-13 12:26:38 -07:00
Owen
16e876ab68 Clean up checkbox 2025-08-13 12:13:47 -07:00
Owen
50fc2fc74e Add newt install command 2025-08-13 11:30:21 -07:00
Owen
c244dc9c0c Add accept clients to install 2025-08-13 11:15:14 -07:00
Owen
0f50981573 Update lock 2025-08-13 11:15:06 -07:00
Owen
0c1cb20936 Merge branch 'main' into dev 2025-08-13 10:58:04 -07:00
Owen Schwartz
192617a884 Merge pull request #1268 from fosrl/crowdin_dev
New Crowdin updates
2025-08-13 10:18:21 -07:00
Owen Schwartz
297991ef5f New translations en-us.json (Chinese Simplified) 2025-08-12 22:16:21 -07:00
Owen Schwartz
75f97c4a31 New translations en-us.json (Turkish) 2025-08-12 22:16:20 -07:00
Owen Schwartz
40f520086c New translations en-us.json (Russian) 2025-08-12 22:16:18 -07:00
Owen Schwartz
c8dda4f90d New translations en-us.json (Portuguese) 2025-08-12 22:16:17 -07:00
Owen Schwartz
5f09f97032 New translations en-us.json (Polish) 2025-08-12 22:16:15 -07:00
Owen Schwartz
168056d595 New translations en-us.json (Dutch) 2025-08-12 22:16:14 -07:00
Owen Schwartz
c70eaa0096 New translations en-us.json (Korean) 2025-08-12 22:16:13 -07:00
Owen Schwartz
5f36b13408 New translations en-us.json (Italian) 2025-08-12 22:16:11 -07:00
Owen Schwartz
9dc73efa3a New translations en-us.json (German) 2025-08-12 22:16:10 -07:00
Owen Schwartz
e9c2868998 New translations en-us.json (Czech) 2025-08-12 22:16:09 -07:00
Owen Schwartz
0a13b04c55 New translations en-us.json (Bulgarian) 2025-08-12 22:16:07 -07:00
Owen Schwartz
cf12d3ee56 New translations en-us.json (Spanish) 2025-08-12 22:16:06 -07:00
Owen Schwartz
cea7190453 New translations en-us.json (French) 2025-08-12 22:16:04 -07:00
Owen Schwartz
c6d78680fb New translations en-us.json (Norwegian Bokmal) 2025-08-12 22:16:03 -07:00
Owen Schwartz
0bf302e013 Merge pull request #1129 from adrianeastles/feature/form-signup-improvements
Form Signup Improvements - Password Requirements & Pre-Filled Email on signup form Invite
2025-08-12 21:52:44 -07:00
Owen
1351fb6689 Merge branch 'feature/form-signup-improvements' of github.com:adrianeastles/pangolin into adrianeastles-feature/form-signup-improvements 2025-08-12 21:40:55 -07:00
Owen
af638d666c Dont look for port if not root; causes permission 2025-08-12 21:34:24 -07:00
Owen Schwartz
e4fe601d9d Merge pull request #1208 from adrianeastles/feature/setup-token-security
Add setup token security for initial server setup
2025-08-12 21:31:58 -07:00
Owen
4f3cd71e1e Merge branch 'feature/setup-token-security' of github.com:adrianeastles/pangolin into adrianeastles-feature/setup-token-security 2025-08-12 21:12:55 -07:00
Owen Schwartz
9c0295db9f Merge pull request #1246 from Lokowitz/update-express
Update express to version 5
2025-08-12 20:38:02 -07:00
Owen Schwartz
3fc2d1df80 Merge pull request #1252 from fosrl/dependabot/npm_and_yarn/prod-minor-updates-ce9f23b7ef
Bump the prod-minor-updates group with 2 updates
2025-08-12 20:37:13 -07:00
Owen Schwartz
4a6747dcc7 Merge pull request #1266 from fosrl/dependabot/npm_and_yarn/dev-patch-updates-eb33d068de
Bump the dev-patch-updates group across 1 directory with 6 updates
2025-08-12 20:36:51 -07:00
Owen Schwartz
54b3c92953 Merge pull request #1262 from jackrosenberg/patch-1
fix: fixed api error message in createSite.ts
2025-08-12 20:36:26 -07:00
dependabot[bot]
a4d460e850 Bump the dev-patch-updates group across 1 directory with 6 updates
Bumps the dev-patch-updates group with 6 updates in the / directory:

| Package | From | To |
| --- | --- | --- |
| [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) | `24.2.0` | `24.2.1` |
| [@types/pg](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/pg) | `8.15.4` | `8.15.5` |
| [@types/react](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/react) | `19.1.9` | `19.1.10` |
| [esbuild](https://github.com/evanw/esbuild) | `0.25.6` | `0.25.9` |
| [tsx](https://github.com/privatenumber/tsx) | `4.20.3` | `4.20.4` |
| [typescript-eslint](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/typescript-eslint) | `8.39.0` | `8.39.1` |



Updates `@types/node` from 24.2.0 to 24.2.1
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

Updates `@types/pg` from 8.15.4 to 8.15.5
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/pg)

Updates `@types/react` from 19.1.9 to 19.1.10
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/react)

Updates `esbuild` from 0.25.6 to 0.25.9
- [Release notes](https://github.com/evanw/esbuild/releases)
- [Changelog](https://github.com/evanw/esbuild/blob/main/CHANGELOG.md)
- [Commits](https://github.com/evanw/esbuild/compare/v0.25.6...v0.25.9)

Updates `tsx` from 4.20.3 to 4.20.4
- [Release notes](https://github.com/privatenumber/tsx/releases)
- [Changelog](https://github.com/privatenumber/tsx/blob/master/release.config.cjs)
- [Commits](https://github.com/privatenumber/tsx/compare/v4.20.3...v4.20.4)

Updates `typescript-eslint` from 8.39.0 to 8.39.1
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/typescript-eslint/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.39.1/packages/typescript-eslint)

---
updated-dependencies:
- dependency-name: "@types/node"
  dependency-version: 24.2.1
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dev-patch-updates
- dependency-name: "@types/pg"
  dependency-version: 8.15.5
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dev-patch-updates
- dependency-name: "@types/react"
  dependency-version: 19.1.10
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dev-patch-updates
- dependency-name: esbuild
  dependency-version: 0.25.9
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dev-patch-updates
- dependency-name: tsx
  dependency-version: 4.20.4
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dev-patch-updates
- dependency-name: typescript-eslint
  dependency-version: 8.39.1
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dev-patch-updates
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-08-13 02:39:05 +00:00
Owen
3d8869066a Adjust pulling in config 2025-08-12 16:47:59 -07:00
Owen
880a123149 Import tcm 2025-08-12 16:31:53 -07:00
Owen
39e35bc1d6 Add traefik config management 2025-08-12 16:27:41 -07:00
Owen
f219f1e36b Move remote proxy 2025-08-12 16:27:34 -07:00
Owen
25ed3d65f8 Make the proxy more general 2025-08-12 15:58:20 -07:00
Owen
30dbabd73d Add internal proxy for gerbil endpoints 2025-08-12 15:27:03 -07:00
Owen
ea2e5bf486 Merge branch 'dev' into hybrid 2025-08-12 15:02:43 -07:00
Owen
ae52fcc757 Merge branch 'dev' into clients-multi-pop 2025-08-12 15:01:00 -07:00
Owen
b6c2f123e8 Add basic ws client 2025-08-12 14:30:23 -07:00
Owen
15f900317a Basic client 2025-08-12 13:53:57 -07:00
Owen
22545cac8b Basic verify session breakout 2025-08-12 13:40:59 -07:00
jack rosenberg
03c8d82471 fix: fixed api error message in createSite.ts 2025-08-12 17:34:40 +02:00
dependabot[bot]
14d7a138a5 Bump the prod-minor-updates group with 2 updates
Bumps the prod-minor-updates group with 2 updates: [eslint](https://github.com/eslint/eslint) and [lucide-react](https://github.com/lucide-icons/lucide/tree/HEAD/packages/lucide-react).


Updates `eslint` from 9.32.0 to 9.33.0
- [Release notes](https://github.com/eslint/eslint/releases)
- [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md)
- [Commits](https://github.com/eslint/eslint/compare/v9.32.0...v9.33.0)

Updates `lucide-react` from 0.536.0 to 0.539.0
- [Release notes](https://github.com/lucide-icons/lucide/releases)
- [Commits](https://github.com/lucide-icons/lucide/commits/0.539.0/packages/lucide-react)

---
updated-dependencies:
- dependency-name: eslint
  dependency-version: 9.33.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: prod-minor-updates
- dependency-name: lucide-react
  dependency-version: 0.539.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: prod-minor-updates
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-08-11 02:26:46 +00:00
Marvin
a829eb949b modified: package-lock.json
modified:   package.json
	modified:   server/nextServer.ts
2025-08-10 19:02:50 +00:00
Owen Schwartz
fd605d9c81 Merge pull request #1244 from fosrl/crowdin_dev
New Crowdin updates
2025-08-10 10:17:31 -07:00
Owen
55b4a9eddb Merge branch 'main' into dev 2025-08-10 10:16:47 -07:00
Owen Schwartz
9ccf77b99c Merge pull request #1113 from fosrl/copilot/fix-1112
Fix ESLint issues: prefer-const warnings and missing semicolons
2025-08-10 10:15:58 -07:00
Owen
ea27075bab Lint fix 2025-08-10 10:14:45 -07:00
Owen
c3723d0fce Add semi 2025-08-10 10:14:04 -07:00
Owen
0edb3cd316 Merge branch 'main' of github.com:fosrl/pangolin into copilot/fix-1112 2025-08-10 10:11:19 -07:00
Owen
e9e6b0bc4f Merge branch 'main' into copilot/fix-1112 2025-08-10 10:10:10 -07:00
Owen
4701da201d Fix a few consts to lets 2025-08-10 10:09:52 -07:00
Owen
d6d2e052dd Fix missing bracket 2025-08-10 10:04:41 -07:00
Owen Schwartz
d3d1dcfe1d New translations en-us.json (Norwegian Bokmal) 2025-08-09 12:24:58 -07:00
Owen Schwartz
918ebf5e65 Merge pull request #1228 from fosrl/dependabot/npm_and_yarn/prod-patch-updates-7f7b11108e
Bump the prod-patch-updates group across 1 directory with 7 updates
2025-08-09 10:13:26 -07:00
Owen Schwartz
67184b88a8 Merge pull request #1134 from Lokowitz/update-node-version
update node to LTS 22
2025-08-09 10:12:57 -07:00
dependabot[bot]
fb0f4c3939 Bump the prod-patch-updates group across 1 directory with 7 updates
Bumps the prod-patch-updates group with 7 updates in the / directory:

| Package | From | To |
| --- | --- | --- |
| [@react-email/tailwind](https://github.com/resend/react-email/tree/HEAD/packages/tailwind) | `1.2.1` | `1.2.2` |
| [drizzle-orm](https://github.com/drizzle-team/drizzle-orm) | `0.44.2` | `0.44.4` |
| [react](https://github.com/facebook/react/tree/HEAD/packages/react) | `19.1.0` | `19.1.1` |
| [@types/react](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/react) | `19.1.8` | `19.1.9` |
| [react-dom](https://github.com/facebook/react/tree/HEAD/packages/react-dom) | `19.1.0` | `19.1.1` |
| [@types/react-dom](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/react-dom) | `19.1.6` | `19.1.7` |
| [tw-animate-css](https://github.com/Wombosvideo/tw-animate-css) | `1.3.5` | `1.3.6` |



Updates `@react-email/tailwind` from 1.2.1 to 1.2.2
- [Release notes](https://github.com/resend/react-email/releases)
- [Changelog](https://github.com/resend/react-email/blob/@react-email/tailwind@1.2.2/packages/tailwind/CHANGELOG.md)
- [Commits](https://github.com/resend/react-email/commits/@react-email/tailwind@1.2.2/packages/tailwind)

Updates `drizzle-orm` from 0.44.2 to 0.44.4
- [Release notes](https://github.com/drizzle-team/drizzle-orm/releases)
- [Commits](https://github.com/drizzle-team/drizzle-orm/compare/0.44.2...0.44.4)

Updates `react` from 19.1.0 to 19.1.1
- [Release notes](https://github.com/facebook/react/releases)
- [Changelog](https://github.com/facebook/react/blob/main/CHANGELOG.md)
- [Commits](https://github.com/facebook/react/commits/v19.1.1/packages/react)

Updates `@types/react` from 19.1.8 to 19.1.9
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/react)

Updates `react-dom` from 19.1.0 to 19.1.1
- [Release notes](https://github.com/facebook/react/releases)
- [Changelog](https://github.com/facebook/react/blob/main/CHANGELOG.md)
- [Commits](https://github.com/facebook/react/commits/v19.1.1/packages/react-dom)

Updates `@types/react-dom` from 19.1.6 to 19.1.7
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/react-dom)

Updates `tw-animate-css` from 1.3.5 to 1.3.6
- [Release notes](https://github.com/Wombosvideo/tw-animate-css/releases)
- [Commits](https://github.com/Wombosvideo/tw-animate-css/compare/v1.3.5...v1.3.6)

---
updated-dependencies:
- dependency-name: "@react-email/tailwind"
  dependency-version: 1.2.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: prod-patch-updates
- dependency-name: drizzle-orm
  dependency-version: 0.44.4
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: prod-patch-updates
- dependency-name: react
  dependency-version: 19.1.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: prod-patch-updates
- dependency-name: "@types/react"
  dependency-version: 19.1.9
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: prod-patch-updates
- dependency-name: react-dom
  dependency-version: 19.1.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: prod-patch-updates
- dependency-name: "@types/react-dom"
  dependency-version: 19.1.7
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: prod-patch-updates
- dependency-name: tw-animate-css
  dependency-version: 1.3.6
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: prod-patch-updates
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-08-09 17:09:19 +00:00
Owen Schwartz
aae5343543 Merge pull request #1192 from fosrl/dependabot/npm_and_yarn/dev-minor-updates-157f1fe21d
Bump the dev-minor-updates group across 1 directory with 5 updates
2025-08-09 10:06:16 -07:00
Owen Schwartz
51e9762ca8 Merge pull request #1229 from fosrl/dependabot/npm_and_yarn/prod-minor-updates-12f913bac4
Bump the prod-minor-updates group across 1 directory with 9 updates
2025-08-09 10:05:47 -07:00
Owen Schwartz
330dafc652 Merge pull request #1242 from EliasTors/translation-nb-NO
Translation nb no
2025-08-09 10:02:47 -07:00
Owen Schwartz
7ddf9fa54e Merge pull request #1234 from fosrl/crowdin_dev
New Crowdin updates
2025-08-09 10:02:21 -07:00
Owen Schwartz
f2ca09eedd Merge pull request #1237 from adrianeastles/feature/passkey-pangctl-support
Pangctl command to reset a user’s passkeys (WebAuthn credentials)
2025-08-09 10:01:40 -07:00
Elias Torstensen
f0e2c8416d Merge branch 'dev' into translation-nb-NO 2025-08-08 21:41:43 +02:00
EliasT05
338b7a8c13 Added nb-NO to list of locals 2025-08-08 21:33:11 +02:00
EliasT05
b4284f82f3 Added nb-NO translation 2025-08-08 21:23:09 +02:00
Owen Schwartz
0ce430cab5 New translations en-us.json (Bulgarian) 2025-08-07 15:04:32 -07:00
Owen Schwartz
95c0f6c093 New translations en-us.json (Russian) 2025-08-07 15:04:30 -07:00
Owen Schwartz
387dbc360e New translations en-us.json (Chinese Simplified) 2025-08-07 15:04:29 -07:00
Owen Schwartz
a88be89c2f New translations en-us.json (Turkish) 2025-08-07 15:04:24 -07:00
Owen Schwartz
8bc353442f New translations en-us.json (Portuguese) 2025-08-07 15:04:22 -07:00
Owen Schwartz
b3502bd627 New translations en-us.json (Polish) 2025-08-07 15:04:21 -07:00
Owen Schwartz
56da7c242d New translations en-us.json (Dutch) 2025-08-07 15:04:20 -07:00
Owen Schwartz
fa8f49e87d New translations en-us.json (Korean) 2025-08-07 15:04:18 -07:00
Owen Schwartz
6e08a70afc New translations en-us.json (Italian) 2025-08-07 15:04:17 -07:00
Owen Schwartz
bd4be2b05c New translations en-us.json (German) 2025-08-07 15:04:16 -07:00
Owen Schwartz
6b6ff0a95e New translations en-us.json (Czech) 2025-08-07 15:04:15 -07:00
Owen Schwartz
4755cae5cb New translations en-us.json (Spanish) 2025-08-07 15:04:14 -07:00
Owen Schwartz
b2384ccc06 New translations en-us.json (French) 2025-08-07 15:04:12 -07:00
Owen
e6589308dd Update readme 2025-08-07 14:53:46 -07:00
dependabot[bot]
879b25be9f Bump the prod-minor-updates group across 1 directory with 9 updates
Bumps the prod-minor-updates group with 9 updates in the / directory:

| Package | From | To |
| --- | --- | --- |
| [@react-email/components](https://github.com/resend/react-email/tree/HEAD/packages/components) | `0.3.1` | `0.5.0` |
| [@react-email/render](https://github.com/resend/react-email/tree/HEAD/packages/render) | `1.1.3` | `1.2.0` |
| [axios](https://github.com/axios/axios) | `1.10.0` | `1.11.0` |
| [eslint](https://github.com/eslint/eslint) | `9.31.0` | `9.32.0` |
| [eslint-config-next](https://github.com/vercel/next.js/tree/HEAD/packages/eslint-config-next) | `15.3.5` | `15.4.6` |
| [lucide-react](https://github.com/lucide-icons/lucide/tree/HEAD/packages/lucide-react) | `0.525.0` | `0.536.0` |
| [next](https://github.com/vercel/next.js) | `15.3.5` | `15.4.6` |
| [npm](https://github.com/npm/cli) | `11.4.2` | `11.5.2` |
| [react-hook-form](https://github.com/react-hook-form/react-hook-form) | `7.60.0` | `7.62.0` |



Updates `@react-email/components` from 0.3.1 to 0.5.0
- [Release notes](https://github.com/resend/react-email/releases)
- [Changelog](https://github.com/resend/react-email/blob/@react-email/components@0.5.0/packages/components/CHANGELOG.md)
- [Commits](https://github.com/resend/react-email/commits/@react-email/components@0.5.0/packages/components)

Updates `@react-email/render` from 1.1.3 to 1.2.0
- [Release notes](https://github.com/resend/react-email/releases)
- [Changelog](https://github.com/resend/react-email/blob/@react-email/render@1.2.0/packages/render/CHANGELOG.md)
- [Commits](https://github.com/resend/react-email/commits/@react-email/render@1.2.0/packages/render)

Updates `axios` from 1.10.0 to 1.11.0
- [Release notes](https://github.com/axios/axios/releases)
- [Changelog](https://github.com/axios/axios/blob/v1.x/CHANGELOG.md)
- [Commits](https://github.com/axios/axios/compare/v1.10.0...v1.11.0)

Updates `eslint` from 9.31.0 to 9.32.0
- [Release notes](https://github.com/eslint/eslint/releases)
- [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md)
- [Commits](https://github.com/eslint/eslint/compare/v9.31.0...v9.32.0)

Updates `eslint-config-next` from 15.3.5 to 15.4.6
- [Release notes](https://github.com/vercel/next.js/releases)
- [Changelog](https://github.com/vercel/next.js/blob/canary/release.js)
- [Commits](https://github.com/vercel/next.js/commits/v15.4.6/packages/eslint-config-next)

Updates `lucide-react` from 0.525.0 to 0.536.0
- [Release notes](https://github.com/lucide-icons/lucide/releases)
- [Commits](https://github.com/lucide-icons/lucide/commits/0.536.0/packages/lucide-react)

Updates `next` from 15.3.5 to 15.4.6
- [Release notes](https://github.com/vercel/next.js/releases)
- [Changelog](https://github.com/vercel/next.js/blob/canary/release.js)
- [Commits](https://github.com/vercel/next.js/compare/v15.3.5...v15.4.6)

Updates `npm` from 11.4.2 to 11.5.2
- [Release notes](https://github.com/npm/cli/releases)
- [Changelog](https://github.com/npm/cli/blob/latest/CHANGELOG.md)
- [Commits](https://github.com/npm/cli/compare/v11.4.2...v11.5.2)

Updates `react-hook-form` from 7.60.0 to 7.62.0
- [Release notes](https://github.com/react-hook-form/react-hook-form/releases)
- [Changelog](https://github.com/react-hook-form/react-hook-form/blob/master/CHANGELOG.md)
- [Commits](https://github.com/react-hook-form/react-hook-form/compare/v7.60.0...v7.62.0)

---
updated-dependencies:
- dependency-name: "@react-email/components"
  dependency-version: 0.5.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: prod-minor-updates
- dependency-name: "@react-email/render"
  dependency-version: 1.2.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: prod-minor-updates
- dependency-name: axios
  dependency-version: 1.11.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: prod-minor-updates
- dependency-name: eslint
  dependency-version: 9.32.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: prod-minor-updates
- dependency-name: eslint-config-next
  dependency-version: 15.4.6
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: prod-minor-updates
- dependency-name: lucide-react
  dependency-version: 0.536.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: prod-minor-updates
- dependency-name: next
  dependency-version: 15.4.6
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: prod-minor-updates
- dependency-name: npm
  dependency-version: 11.5.2
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: prod-minor-updates
- dependency-name: react-hook-form
  dependency-version: 7.62.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: prod-minor-updates
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-08-07 01:42:42 +00:00
dependabot[bot]
d3ad941b30 Bump the dev-minor-updates group across 1 directory with 5 updates
Bumps the dev-minor-updates group with 5 updates in the / directory:

| Package | From | To |
| --- | --- | --- |
| [@dotenvx/dotenvx](https://github.com/dotenvx/dotenvx) | `1.47.6` | `1.48.4` |
| [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) | `24.0.14` | `24.1.0` |
| [react-email](https://github.com/resend/react-email/tree/HEAD/packages/react-email) | `4.1.0` | `4.2.6` |
| [typescript](https://github.com/microsoft/TypeScript) | `5.8.3` | `5.9.2` |
| [typescript-eslint](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/typescript-eslint) | `8.37.0` | `8.38.0` |



Updates `@dotenvx/dotenvx` from 1.47.6 to 1.48.4
- [Release notes](https://github.com/dotenvx/dotenvx/releases)
- [Changelog](https://github.com/dotenvx/dotenvx/blob/main/CHANGELOG.md)
- [Commits](https://github.com/dotenvx/dotenvx/compare/v1.47.6...v1.48.4)

Updates `@types/node` from 24.0.14 to 24.1.0
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

Updates `react-email` from 4.1.0 to 4.2.6
- [Release notes](https://github.com/resend/react-email/releases)
- [Changelog](https://github.com/resend/react-email/blob/react-email@4.2.6/packages/react-email/CHANGELOG.md)
- [Commits](https://github.com/resend/react-email/commits/react-email@4.2.6/packages/react-email)

Updates `typescript` from 5.8.3 to 5.9.2
- [Release notes](https://github.com/microsoft/TypeScript/releases)
- [Changelog](https://github.com/microsoft/TypeScript/blob/main/azure-pipelines.release-publish.yml)
- [Commits](https://github.com/microsoft/TypeScript/compare/v5.8.3...v5.9.2)

Updates `typescript-eslint` from 8.37.0 to 8.38.0
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/typescript-eslint/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.38.0/packages/typescript-eslint)

---
updated-dependencies:
- dependency-name: "@dotenvx/dotenvx"
  dependency-version: 1.48.4
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: dev-minor-updates
- dependency-name: "@types/node"
  dependency-version: 24.1.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: dev-minor-updates
- dependency-name: react-email
  dependency-version: 4.2.6
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: dev-minor-updates
- dependency-name: typescript
  dependency-version: 5.9.2
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: dev-minor-updates
- dependency-name: typescript-eslint
  dependency-version: 8.38.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: dev-minor-updates
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-08-07 01:40:47 +00:00
Owen Schwartz
f077fbc3f5 Merge pull request #1219 from aclfe/port-check80443
Added checks for port 80 and 443
2025-08-06 10:33:24 -07:00
Owen
4679ce968b Merge branch 'Xentrice-IPv6_optional' into dev 2025-08-06 10:22:19 -07:00
Owen
101e462649 Merge branch 'main' into dev 2025-08-06 10:21:54 -07:00
Owen
5d93ab9b9e Merge branch 'IPv6_optional' of github.com:Xentrice/pangolin into Xentrice-IPv6_optional 2025-08-06 10:19:51 -07:00
Owen
d557832509 Send this right IP this time 2025-08-05 11:37:45 -07:00
Owen
fe5c91db29 Change how you send the desitnations 2025-08-05 11:25:54 -07:00
Adrian Astles
b2947193ec Integrate setup token into installer, this will now parse the container logs to extract setup token automatically. Displays token with clear instructions and URL for initial admin setup. 2025-08-05 17:35:22 +08:00
Owen
f6440753b6 Only update proxy mapping if there is an existing 2025-08-04 21:34:07 -07:00
Owen
17cf903804 publicKey optional 2025-08-04 21:29:40 -07:00
Owen
dcf530d237 Add backward compatability 2025-08-04 20:36:25 -07:00
Owen
6b1808dab1 Handle multiple hp messages 2025-08-04 20:34:27 -07:00
Owen
5889efd74a Send all hp data now 2025-08-04 20:22:13 -07:00
Owen
1a9de1e5c5 Move endpoint to per site 2025-08-04 20:17:35 -07:00
Owen
d1404a2b07 Merge branch 'dev' of github.com:fosrl/pangolin into dev 2025-08-04 20:02:08 -07:00
Sebastian Felber
664dbf3f4c make IPv6 optional during install 2025-08-04 15:45:33 +00:00
Owen Schwartz
f32a8e26b6 Merge pull request #1209 from fosrl/crowdin_dev
New Crowdin updates
2025-08-03 11:42:10 -07:00
Owen Schwartz
b1a92fd4e0 New translations en-us.json (Bulgarian) 2025-08-03 11:40:48 -07:00
Owen Schwartz
1ea9fd2d49 New translations en-us.json (Russian) 2025-08-03 11:40:47 -07:00
Owen Schwartz
f31e4e3176 New translations en-us.json (Chinese Simplified) 2025-08-03 11:40:46 -07:00
Owen Schwartz
e3287a7e9f New translations en-us.json (Turkish) 2025-08-03 11:40:45 -07:00
Owen Schwartz
ec21153d4b New translations en-us.json (Portuguese) 2025-08-03 11:40:44 -07:00
Owen Schwartz
917e7a8c1d New translations en-us.json (Polish) 2025-08-03 11:40:43 -07:00
Owen Schwartz
8e0a8dc272 New translations en-us.json (Dutch) 2025-08-03 11:40:41 -07:00
Owen Schwartz
91bac29ea3 New translations en-us.json (Korean) 2025-08-03 11:40:40 -07:00
Owen Schwartz
3e333769bb New translations en-us.json (Italian) 2025-08-03 11:40:39 -07:00
Owen Schwartz
b4bde6660a New translations en-us.json (German) 2025-08-03 11:40:38 -07:00
Owen Schwartz
917f752081 New translations en-us.json (Czech) 2025-08-03 11:40:37 -07:00
Owen Schwartz
915d561286 New translations en-us.json (Spanish) 2025-08-03 11:40:36 -07:00
Owen Schwartz
01ef809fd3 New translations en-us.json (French) 2025-08-03 11:40:35 -07:00
Owen Schwartz
19902092ce Merge pull request #1177 from Error-Gap/portbinding-fixes
Portbinding fixes
2025-08-03 11:37:30 -07:00
Owen Schwartz
39603b6e53 Merge pull request #1205 from Pallavikumarimdb/feature-default-language
System wide default language detection via browser language header
2025-08-03 11:35:41 -07:00
Adrian Astles
9c85a09d3e revert: package-lock.json to original state 2025-08-03 21:20:25 +08:00
Adrian Astles
69baa6785f feat: Add setup token security for initial server setup
- Add setupTokens database table with proper schema
- Implement setup token generation on first server startup
- Add token validation endpoint and modify admin creation
- Update initial setup page to require setup token
- Add migration scripts for both SQLite and PostgreSQL
- Add internationalization support for setup token fields
- Implement proper error handling and logging
- Add CLI command for resetting user security keys

This prevents unauthorized access during initial server setup by requiring
a token that is generated and displayed in the server console.
2025-08-03 21:17:18 +08:00
Adrian Astles
bb84d01e14 Reset a user's security keys (passkeys) by deleting all their webauthn credentials.
pangctl reset-user-security-keys --email user@example.com

This command will:
1. Find the user by email address
2. Check if they have any registered security keys
3. Delete all their security keys from the database
4. Provide feedback on the operation
2025-08-03 20:47:27 +08:00
Pallavi
616dae2d8b code format 2025-08-03 12:26:21 +05:30
Pallavi
3fbfe50e09 Default language detection via browser language header 2025-08-03 12:21:41 +05:30
Kairav Mittal
c0c8edb9d1 Added checks for port 80 and 443
In my issue #1203, I noticed there was a problem when ports 80 and 443 were already in use. This caused the docker containers to be created but not running
2025-08-03 11:30:33 +05:30
miloschwartz
84268e484d update docs links 2025-08-01 22:34:02 -07:00
Owen Schwartz
c473c2fa81 Merge pull request #1200 from Lokowitz/update-versions
Update versions
2025-08-01 21:24:39 -07:00
miloschwartz
7402590f49 remove api-key-org association for root keys 2025-08-01 15:56:03 -07:00
Marvin
529d1c9f66 modified: .github/workflows/cicd.yml 2025-08-01 18:37:08 +00:00
Marvin
e85b772ca5 update versions 2025-08-01 18:33:25 +00:00
Owen
f75169fc26 Add missing langs 2025-08-01 11:08:30 -07:00
Owen Schwartz
07b86521a5 Merge pull request #1196 from confusedalex/fix-nix
fix: adapt nix run command
2025-08-01 09:34:02 -07:00
confusedalex
961008bbe1 fix: adapt nix run command 2025-08-01 11:31:29 +02:00
Owen
6d359b6bb9 Add createdAt to org insert 2025-07-31 17:53:11 -07:00
Owen
ea6f803e78 Add createdAt to org 2025-07-31 17:51:30 -07:00
Owen
0151f8a6a9 Fix bad sourcePort 2025-07-31 15:57:30 -07:00
Owen
39c5101957 Merge branch 'main' into dev 2025-07-31 15:55:54 -07:00
Owen
9b1cd5f79c Ignore the config dir 2025-07-31 15:01:29 -07:00
Owen
36d0b83ed3 Fix errors again 2025-07-31 15:00:17 -07:00
Owen
f0138fad4f Improve gerbil logging 2025-07-31 14:25:22 -07:00
Owen
69802e78f8 Org is not optional 2025-07-31 11:06:07 -07:00
Owen
92e69f561f Org is not optional 2025-07-31 11:05:24 -07:00
miloschwartz
b351520e92 add clients enabled middleware 2025-07-30 23:18:51 -07:00
T Aviss
481714f095 Fix for issues with binding ports other than 80/443
server/routers/badger/verifySession.ts : verifyResourceSession() updated code behind "cleanHost" var to a regex which strips the trailing :port for any port (rather than a string match for 80/443)
src/app/auth/resource/[resourceId]/page.tsx : ResourceAuthPage() added a secondary match for serverResourceHost and redirectHost that accounts for ports
server/routers/badger/exchangeSession.ts : Updated exchangeSession() to use the same "cleanHost" type var (with port-stripping) as in verifyResourceSession(), replaced references to "host" with "cleanHost"
2025-07-30 22:16:46 -07:00
miloschwartz
d38656e026 add clients to int api 2025-07-30 21:31:16 -07:00
Owen
69b28b9b02 Merge branch 'dev' 2025-07-30 15:19:27 -07:00
Owen Schwartz
35a68703c2 Merge pull request #1173 from fosrl/crowdin_dev
New Crowdin updates
2025-07-30 15:19:04 -07:00
Owen Schwartz
c49fe04750 New translations en-us.json (Russian) 2025-07-30 15:18:36 -07:00
Owen Schwartz
31feabbec7 New translations en-us.json (Chinese Simplified) 2025-07-30 15:18:35 -07:00
Owen Schwartz
bc3cb2c3c9 New translations en-us.json (Turkish) 2025-07-30 15:18:34 -07:00
Owen Schwartz
5ec4481c92 New translations en-us.json (Portuguese) 2025-07-30 15:18:32 -07:00
Owen Schwartz
be5cb48dfe New translations en-us.json (Polish) 2025-07-30 15:18:31 -07:00
Owen Schwartz
48ff1ece16 New translations en-us.json (Dutch) 2025-07-30 15:18:30 -07:00
Owen Schwartz
ed20ed592f New translations en-us.json (Italian) 2025-07-30 15:18:28 -07:00
Owen Schwartz
4fb3435c29 New translations en-us.json (German) 2025-07-30 15:18:27 -07:00
Owen Schwartz
37eb14a01a New translations en-us.json (Spanish) 2025-07-30 15:18:25 -07:00
Owen Schwartz
d403bc86e3 New translations en-us.json (French) 2025-07-30 15:18:24 -07:00
Owen Schwartz
0e2f0f2a4d Merge pull request #1150 from fosrl/crowdin_dev
New Crowdin updates
2025-07-30 15:11:48 -07:00
Owen Schwartz
1a4d34a802 Merge pull request #1172 from fosrl/dev
1.8.0
2025-07-30 15:07:47 -07:00
Owen
bb15af9954 Add ports warn at start 2025-07-30 10:23:52 -07:00
Owen
8a250d1011 rm YC 2025-07-30 10:23:44 -07:00
Owen
2f9994f600 Merge branch 'dev' of github.com:fosrl/pangolin into dev 2025-07-30 10:09:34 -07:00
Owen
1cca06a274 Add note about wintun 2025-07-29 23:09:49 -07:00
miloschwartz
8fdb3ea631 hide favicon 2025-07-29 10:46:08 -07:00
Owen
35823d5751 Fix adding sites to client 2025-07-28 22:40:27 -07:00
Owen
66f90a542a Rename to pg 2025-07-28 18:34:23 -07:00
Owen
49981c4bee Add 21820 to docker 2025-07-28 18:34:01 -07:00
Owen
d732c1a845 Clean up migrations 2025-07-28 17:32:15 -07:00
Owen
4d7e25f97b Complete migrations 2025-07-28 17:22:53 -07:00
Owen
80656f48e0 Sqlite migration done 2025-07-28 17:18:51 -07:00
Owen
ebde149980 Merge branch 'main' into dev 2025-07-28 17:15:05 -07:00
miloschwartz
adc0a81592 delete org domains and resources on org delete 2025-07-28 15:34:56 -07:00
Owen Schwartz
b596f00ce5 New translations en-us.json (Chinese Simplified) 2025-07-28 14:16:24 -07:00
Owen Schwartz
448442f92b New translations en-us.json (Turkish) 2025-07-28 14:16:23 -07:00
Owen Schwartz
8518201562 New translations en-us.json (Portuguese) 2025-07-28 14:16:21 -07:00
Owen Schwartz
17586c4559 New translations en-us.json (Polish) 2025-07-28 14:16:19 -07:00
Owen Schwartz
f8622da7d4 New translations en-us.json (Dutch) 2025-07-28 14:16:18 -07:00
Owen Schwartz
b1a27e9060 New translations en-us.json (Korean) 2025-07-28 14:16:17 -07:00
Owen Schwartz
3c6423d444 New translations en-us.json (Italian) 2025-07-28 14:16:15 -07:00
Owen Schwartz
91b03160ea New translations en-us.json (German) 2025-07-28 14:16:14 -07:00
Owen Schwartz
0c1e20ba48 New translations en-us.json (Czech) 2025-07-28 14:16:13 -07:00
Owen Schwartz
1dcac85c0d New translations en-us.json (Spanish) 2025-07-28 14:16:12 -07:00
Owen Schwartz
3fc72dbec2 New translations en-us.json (French) 2025-07-28 14:16:11 -07:00
miloschwartz
494329f568 delete resources on delete org 2025-07-28 12:55:20 -07:00
Owen
a1e8211ba7 Dont send enableProxy 2025-07-28 12:53:13 -07:00
miloschwartz
80aa7502af fix resource domain not required 2025-07-28 12:52:44 -07:00
miloschwartz
67bae76048 minor visual tweaks to member landing 2025-07-28 12:21:15 -07:00
Milo Schwartz
bda2aa46b6 Merge pull request #1124 from adrianeastles/feature/member-resouce-landing-page
New Member Resource Landing Page
2025-07-28 14:33:09 -04:00
copilot-swe-agent[bot]
27ac204bb6 Fix variables incorrectly changed from let to const - revert to let where variables are reassigned
Co-authored-by: oschwartz10612 <4999704+oschwartz10612@users.noreply.github.com>
2025-07-28 17:43:40 +00:00
copilot-swe-agent[bot]
a2526ea244 Revert mappings variable from const to let in getAllRelays.ts
Co-authored-by: oschwartz10612 <4999704+oschwartz10612@users.noreply.github.com>
2025-07-28 17:30:21 +00:00
Owen Schwartz
6d9ba8dd2f Merge pull request #1104 from jackrosenberg/nixos_newt
add nixos option for newt in site creation
2025-07-28 10:19:23 -07:00
Owen
2ca8febff7 We dont need this config 2025-07-27 14:12:01 -07:00
Owen
e105a523e4 Add log and fix default 2025-07-27 14:11:36 -07:00
Owen
28f8b05dbc Basic clients working 2025-07-27 10:21:27 -07:00
Owen Schwartz
d95286db0e Merge pull request #1139 from SigmaSquadron/push-xlmpuutwtnuy
add shebangs to migration and server scripts
2025-07-27 10:11:17 -07:00
Owen Schwartz
8e45c34e8e Merge pull request #1138 from SigmaSquadron/push-uolqlutswopp
add an environment variable for the smtp_pass config option
2025-07-27 10:09:25 -07:00
Fernando Rodrigues
9e87c42d0c add shebangs to migration and server scripts
In NixOS, we wrap these files in a bash script to allow users to just run them as normal executables, instead of calling them as arguments to Node.JS. In our build scripts, we just add the shebang after the files have been compiled, but adding it upstream will allow all Pangolin users to just run ./server.mjs to start their Pangolin instances.

Signed-off-by: Fernando Rodrigues <alpha@sigmasquadron.net>
2025-07-27 13:10:18 +10:00
Fernando Rodrigues
0b52cd002e add an environment variable for the smtp_pass config option
The password for secure authentication may be sensitive, so it is best
to not leave it lying around in a config file. This commit introduces
the EMAIL_SMTP_PASS environment variable, which can be set to configure
the SMTP password without writing it to the configuration file.

Signed-off-by: Fernando Rodrigues <alpha@sigmasquadron.net>
2025-07-27 13:03:29 +10:00
Marvin
39c43c0c09 modified: .github/workflows/cicd.yml
modified:   .github/workflows/linting.yml
	modified:   .github/workflows/test.yml
	modified:   .nvmrc
	modified:   Dockerfile.dev
	modified:   Dockerfile.pg
	modified:   Dockerfile.sqlite
	modified:   esbuild.mjs
	modified:   package-lock.json
	modified:   tsconfig.json
2025-07-26 14:17:55 +00:00
Adrian Astles
350485612e This improves the user experience by automatically filling the email field
and preventing users from changing the email they were invited with.

- Update invite link generation to include email parameter in URL
- Modify signup form to pre-fill and lock email field when provided via invite
- Update invite page and status card to preserve email through redirect chain
- Ensure existing invite URLs continue to work without breaking changes
2025-07-25 22:46:40 +08:00
Adrian Astles
df31c13912 added real-time password validation to signup form. 2025-07-25 21:59:25 +08:00
Owen
15adfcca8c Add remote subnets to ui 2025-07-24 22:01:22 -07:00
Owen
1466788f77 Clients ui done 2025-07-24 21:42:44 -07:00
Owen
760fe3aca9 Create client component done 2025-07-24 21:26:02 -07:00
Owen
5f75813e84 Handle relaying change values in gerbil 2025-07-24 20:47:39 -07:00
Owen
59cb06acf4 Support relaying on register 2025-07-24 14:48:24 -07:00
Adrian Astles
6349406523 Removed member resouce sidebar to work with new sidebar. 2025-07-24 21:30:20 +08:00
Adrian Astles
bcc2c59f08 Add member portal functionality - extracted from feature/member-landing-page 2025-07-24 21:04:55 +08:00
jack
52d46f9879 add nixos option for newt in site creation 2025-07-23 10:02:58 +02:00
Owen Schwartz
0b50a5474d Merge pull request #1041 from wayneyaoo/feature/podman-installer
Add podman support to the installer
2025-07-22 21:41:32 -07:00
copilot-swe-agent[bot]
2259879595 Fix ESLint issues: prefer-const warnings and missing semicolons
Co-authored-by: oschwartz10612 <4999704+oschwartz10612@users.noreply.github.com>
2025-07-22 19:07:43 +00:00
copilot-swe-agent[bot]
4f5091ed7f Initial commit: Document plan to fix ESLint issues
Co-authored-by: oschwartz10612 <4999704+oschwartz10612@users.noreply.github.com>
2025-07-22 18:56:04 +00:00
copilot-swe-agent[bot]
b5afd73024 Initial plan 2025-07-22 18:47:17 +00:00
Owen
5c929badeb Send endpoint 2025-07-22 11:21:39 -07:00
Owen Schwartz
3f2de333fb Merge pull request #1111 from Xentrice/main
add IPv6 support for docker network
2025-07-22 11:06:06 -07:00
Sebastian Felber
7c12b8ae25 add IPv6 support for docker network 2025-07-22 16:20:02 +02:00
miloschwartz
b54ccbfa2f fix log in loading button 2025-07-21 17:26:02 -07:00
miloschwartz
114ce8997f add tos and pp consent 2025-07-21 16:57:21 -07:00
Owen
f1bba3b958 Fix issues in pg schema 2025-07-21 16:32:13 -07:00
miloschwartz
053acef728 allow using password to log in if security keys are available 2025-07-21 14:28:32 -07:00
miloschwartz
9f2710185b center toast 2025-07-21 13:10:39 -07:00
Owen
d000879c01 Add config for domains 2025-07-21 12:42:50 -07:00
Owen
25ae169fee Merge branch 'dev' of github.com:fosrl/pangolin into dev 2025-07-21 11:48:32 -07:00
Wayne Yao
4443dda0f6 Fix a bug that error check prevents port configuration 2025-07-21 22:48:10 +08:00
Wayne Yao
c484e989a9 Merge branch 'fosrl:main' into feature/podman-installer 2025-07-21 21:36:10 +08:00
miloschwartz
86a4656651 fix multi level subdomain conflict bug 2025-07-19 22:54:30 -07:00
Owen
f25aefeb11 Merge branch 'main' of github.com:fosrl/pangolin 2025-07-19 10:33:49 -07:00
Owen Schwartz
228643c7d7 Merge pull request #1097 from ivenos/patch-1
Replace .io domain with .com domain in README
2025-07-19 10:32:08 -07:00
Owen Schwartz
072d6d7094 Merge pull request #1095 from Lokowitz/fix-test
fix test
2025-07-19 10:29:20 -07:00
Iven
de3ce672b8 Replace .io domain with .com domain 2025-07-19 18:31:08 +02:00
Marvin
6f5c191998 Update test.yml 2025-07-19 11:09:19 +02:00
Owen
bbaea4def0 Handle peer relay dynamically now 2025-07-18 21:42:12 -07:00
Milo Schwartz
54f9282166 Merge pull request #1091 from fosrl/dev
Dev
2025-07-18 18:53:45 -04:00
miloschwartz
a39b1db266 bump version 2025-07-18 15:50:55 -07:00
miloschwartz
2ddb4ec905 allow multi level sudomains in domain picker 2025-07-18 15:48:23 -07:00
miloschwartz
7a59e3acf7 fix external user select box 2025-07-18 14:45:16 -07:00
miloschwartz
b34c3db956 fix redirect bug for some accounts when disable create org is enabled 2025-07-18 12:59:57 -07:00
Owen
afea958aca Also limit to org 2025-07-18 11:48:14 -07:00
Owen
dca2a29865 Fix #1085 2025-07-18 11:32:07 -07:00
Owen
97b8e84143 Fix #1085 2025-07-18 11:16:10 -07:00
Owen Schwartz
23eb0da7d7 Merge pull request #1089 from tomribbens/unauthenticated_email
test if smtp user/pass config is set and if not set auth: null
2025-07-18 10:28:17 -07:00
Owen Schwartz
2edda471e7 Merge pull request #1087 from itsbhanusharma/patch-1
Small Typo causes crowdsec to fail
2025-07-18 10:26:20 -07:00
Tom Ribbens
676aa1358d test if user/pass config is set and if not set auth: null 2025-07-18 17:09:22 +02:00
Bhanu
87a36d6ae3 Small Typo causes crowdsec to fail
first rule is named iame instead of name. seems like a recent typo. I edited file manually and it seems to have allowed crowdsec to boot up.
2025-07-18 18:40:15 +05:30
Owen
b67611094e YC 2025-07-18 00:28:10 -07:00
Owen
2e986def78 const 2025-07-17 23:15:16 -07:00
miloschwartz
d16a05959d Merge branch 'main' into dev 2025-07-17 23:14:50 -07:00
Owen
7e58e0b490 Correctly handle ssl on new domains 2025-07-17 22:57:47 -07:00
Owen
9b01aecf3c Add default cert resovler 2025-07-17 22:37:33 -07:00
miloschwartz
86043fd5f8 add defaults for domain cert resolver and prefer wildcard cert 2025-07-17 22:35:07 -07:00
Milo Schwartz
372a1758e9 Update README.md 2025-07-17 19:35:27 -04:00
Owen
0a2b1d9e53 Use a records for the wildcard 2025-07-17 16:17:01 -07:00
Owen
e562946308 Fix logic 2025-07-17 16:03:34 -07:00
Owen
398e15b3c6 Format 2025-07-17 15:59:28 -07:00
miloschwartz
c225a54dbe Merge branch 'dev' 2025-07-17 15:05:02 -07:00
Owen
5148988dcc Also dont return if you are passing an exit node 2025-07-17 14:59:49 -07:00
Owen
28b57ba652 Allow null exit node id as well 2025-07-17 14:57:09 -07:00
Owen
9c7e74ef37 Remove ping logic 2025-07-17 14:43:47 -07:00
Owen
330b28ad9c Fix local sites 2025-07-17 14:35:22 -07:00
miloschwartz
da7166a7ea fix config 2025-07-17 14:34:57 -07:00
Milo Schwartz
e8793c5d8d Update README.md 2025-07-17 16:35:00 -04:00
miloschwartz
c63d45e344 Merge branch 'main' into dev 2025-07-17 13:20:34 -07:00
miloschwartz
1159a79410 fix emails 2025-07-17 13:20:27 -07:00
Milo Schwartz
5b5e65ac08 Merge pull request #1074 from fosrl/dev
1.7.0
2025-07-17 15:47:52 -04:00
Owen
417811e94f Merge branch 'dev' of github.com:fosrl/pangolin into dev 2025-07-17 12:26:51 -07:00
Owen Schwartz
9c40057c51 Merge pull request #1072 from fosrl/crowdin_dev
New Crowdin updates
2025-07-17 12:26:05 -07:00
Owen Schwartz
a6409c16c3 New translations en-us.json (Chinese Simplified) 2025-07-17 12:25:16 -07:00
Owen
ba4667528c Merge branch 'main' of github.com:fosrl/pangolin into dev 2025-07-17 12:25:15 -07:00
Owen Schwartz
a2368d7c3f New translations en-us.json (Turkish) 2025-07-17 12:25:15 -07:00
Owen Schwartz
e90b203a7d New translations en-us.json (Portuguese) 2025-07-17 12:25:14 -07:00
Owen Schwartz
b7389d74db New translations en-us.json (Dutch) 2025-07-17 12:25:13 -07:00
Owen Schwartz
24321521c7 New translations en-us.json (Italian) 2025-07-17 12:25:11 -07:00
Owen Schwartz
f85497d446 New translations en-us.json (German) 2025-07-17 12:25:10 -07:00
Owen Schwartz
1f9e92fdb7 New translations en-us.json (Spanish) 2025-07-17 12:25:09 -07:00
Owen Schwartz
b66d2b95c5 New translations en-us.json (French) 2025-07-17 12:25:08 -07:00
Owen Schwartz
6f013b3bc4 New translations en-us.json (Polish) 2025-07-17 12:25:06 -07:00
miloschwartz
cdf8a01c14 readme adjustments 2025-07-17 12:19:06 -07:00
Owen
547923bbb4 Update cloud links 2025-07-17 12:17:27 -07:00
Owen Schwartz
a8c3c1bece New translations en-us.json (Korean) 2025-07-17 12:14:53 -07:00
Owen Schwartz
0f47a5d51e New translations en-us.json (Czech) 2025-07-17 12:14:52 -07:00
Owen Schwartz
9f9196427f New translations en-us.json (Chinese Simplified) 2025-07-17 12:14:51 -07:00
Owen Schwartz
341d688e79 New translations en-us.json (Turkish) 2025-07-17 12:14:49 -07:00
Owen Schwartz
92c5d1ed46 New translations en-us.json (Portuguese) 2025-07-17 12:14:48 -07:00
Owen Schwartz
55d8579b1a New translations en-us.json (Dutch) 2025-07-17 12:14:47 -07:00
Owen Schwartz
51a74c5045 New translations en-us.json (Italian) 2025-07-17 12:14:45 -07:00
Owen Schwartz
64f1af4d0b New translations en-us.json (German) 2025-07-17 12:14:44 -07:00
Owen Schwartz
8dd5daf495 New translations en-us.json (Spanish) 2025-07-17 12:14:43 -07:00
Owen Schwartz
0ee87d736c New translations en-us.json (French) 2025-07-17 12:14:41 -07:00
Owen Schwartz
ba822af355 New translations en-us.json (Polish) 2025-07-17 12:14:40 -07:00
Owen Schwartz
78c1990b42 New translations en-us.json (Russian) 2025-07-17 12:14:39 -07:00
Owen
768179a664 Rename file 2025-07-17 12:10:37 -07:00
Owen
1268c46f02 Update diagram 2025-07-17 12:08:56 -07:00
miloschwartz
d870a49381 change domain picker description and fix metadata title 2025-07-17 12:05:08 -07:00
Owen
8e476cc07e Update readme 2025-07-17 11:58:28 -07:00
Owen Schwartz
ea54fd6e98 New translations en-us.json (Korean) 2025-07-16 23:06:51 -07:00
Owen Schwartz
ea001cc0db New translations en-us.json (Czech) 2025-07-16 23:06:49 -07:00
Owen Schwartz
2378343c74 New translations en-us.json (Chinese Simplified) 2025-07-16 23:06:48 -07:00
Owen Schwartz
018b3346bb New translations en-us.json (Turkish) 2025-07-16 23:06:47 -07:00
Owen Schwartz
d104829a6d New translations en-us.json (Portuguese) 2025-07-16 23:06:46 -07:00
Owen Schwartz
0035460712 New translations en-us.json (Dutch) 2025-07-16 23:06:45 -07:00
Owen Schwartz
cae57ffcd8 New translations en-us.json (Italian) 2025-07-16 23:06:43 -07:00
Owen Schwartz
b587ff663c New translations en-us.json (German) 2025-07-16 23:06:42 -07:00
Owen Schwartz
531a888592 New translations en-us.json (Spanish) 2025-07-16 23:06:41 -07:00
Owen Schwartz
a13b167c41 New translations en-us.json (French) 2025-07-16 23:06:40 -07:00
Owen Schwartz
c1f9195a38 New translations en-us.json (Polish) 2025-07-16 23:06:38 -07:00
Owen Schwartz
e1ea7c6986 New translations en-us.json (Russian) 2025-07-16 23:06:37 -07:00
Owen
bd21927069 Working on readme 2025-07-16 22:31:15 -07:00
Owen
f1f4f7e5f3 Working on adjusting readme 2025-07-16 22:30:20 -07:00
miloschwartz
ccdcda7f1d add screenshots and minor fixes 2025-07-16 22:18:11 -07:00
dependabot[bot]
e9586b7336 Bump the dev-patch-updates group across 1 directory with 2 updates
Bumps the dev-patch-updates group with 2 updates in the / directory: [@dotenvx/dotenvx](https://github.com/dotenvx/dotenvx) and [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node).


Updates `@dotenvx/dotenvx` from 1.47.3 to 1.47.6
- [Release notes](https://github.com/dotenvx/dotenvx/releases)
- [Changelog](https://github.com/dotenvx/dotenvx/blob/main/CHANGELOG.md)
- [Commits](https://github.com/dotenvx/dotenvx/compare/v1.47.3...v1.47.6)

Updates `@types/node` from 24.0.12 to 24.0.14
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

---
updated-dependencies:
- dependency-name: "@dotenvx/dotenvx"
  dependency-version: 1.47.6
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dev-patch-updates
- dependency-name: "@types/node"
  dependency-version: 24.0.14
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dev-patch-updates
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-07-16 22:01:58 -07:00
Owen Schwartz
da36a218df Merge pull request #1069 from fosrl/dependabot/npm_and_yarn/dev-patch-updates-5cee210a78
Bump the dev-patch-updates group across 1 directory with 2 updates
2025-07-16 22:01:25 -07:00
Owen Schwartz
1723089844 Merge pull request #1071 from fosrl/crowdin_dev
New Crowdin updates
2025-07-16 22:01:07 -07:00
Owen Schwartz
e99eb04e2f New translations en-us.json (Korean) 2025-07-16 22:00:38 -07:00
Owen Schwartz
5fddd71fc2 New translations en-us.json (Czech) 2025-07-16 22:00:37 -07:00
Owen Schwartz
c682b03736 New translations en-us.json (Chinese Simplified) 2025-07-16 22:00:36 -07:00
Owen Schwartz
4008767e1b New translations en-us.json (Turkish) 2025-07-16 22:00:35 -07:00
Owen Schwartz
74c768e2fb New translations en-us.json (Portuguese) 2025-07-16 22:00:34 -07:00
Owen Schwartz
03b883c320 New translations en-us.json (Dutch) 2025-07-16 22:00:33 -07:00
Owen Schwartz
807ddaa0bb New translations en-us.json (Italian) 2025-07-16 22:00:32 -07:00
Owen Schwartz
da9d555168 New translations en-us.json (German) 2025-07-16 22:00:31 -07:00
Owen Schwartz
05ba2c0103 New translations en-us.json (Spanish) 2025-07-16 22:00:29 -07:00
Owen Schwartz
de96b722d5 New translations en-us.json (French) 2025-07-16 22:00:28 -07:00
Owen Schwartz
afde493040 New translations en-us.json (Polish) 2025-07-16 22:00:27 -07:00
Owen Schwartz
cce440cf49 New translations en-us.json (Russian) 2025-07-16 22:00:26 -07:00
Owen
e96dbdb026 Working on readm 2025-07-16 21:58:52 -07:00
Owen
f4cd163c34 Fix get config for gerbil 2025-07-16 21:15:19 -07:00
Owen
0af9bdc964 Move ws 2025-07-16 19:07:25 -07:00
Owen
71bb1105f7 a 2025-07-16 18:20:05 -07:00
Owen
84c28645be Merge branch 'dev' of github.com:fosrl/pangolin into dev 2025-07-16 18:13:25 -07:00
miloschwartz
665ef08733 minor fixes for release 2025-07-16 18:09:17 -07:00
Owen
b3e63a5f8a Merge branch 'dev' of github.com:fosrl/pangolin into dev 2025-07-16 17:26:27 -07:00
miloschwartz
92c09b8843 fix sqlite crash on code 13 bug 2025-07-16 17:26:15 -07:00
Owen
7b726a41ef Remove extra try catch 2025-07-16 16:56:05 -07:00
miloschwartz
a1a0587a2b add build file 2025-07-16 16:41:59 -07:00
miloschwartz
98be9cee83 Merge branch 'dev' of https://github.com/fosrl/pangolin into dev 2025-07-16 15:50:14 -07:00
miloschwartz
0646934c9d add stores 2025-07-16 15:50:03 -07:00
Owen
f0f68632ff Add transaction 2025-07-16 12:34:53 -07:00
Owen
e557bda48e Fix default 2025-07-16 12:34:42 -07:00
Owen
2992de5139 Add basic org subnet thing to postgres
T#
2025-07-16 12:00:38 -07:00
Owen
779532b1c9 Generate the initial subnets for sites and orgs 2025-07-16 11:56:26 -07:00
Owen
300175ac67 Defaults for org 2025-07-16 11:56:26 -07:00
miloschwartz
a356147164 remove not null from orgs 2025-07-16 11:52:36 -07:00
miloschwartz
d1489a9a78 fixes to sqlite migration 2025-07-16 11:47:59 -07:00
Owen
021bc073a2 Make org subnet optional 2025-07-16 11:35:38 -07:00
dependabot[bot]
4e571e1e4d Bump the dev-patch-updates group across 1 directory with 2 updates
Bumps the dev-patch-updates group with 2 updates in the / directory: [@dotenvx/dotenvx](https://github.com/dotenvx/dotenvx) and [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node).


Updates `@dotenvx/dotenvx` from 1.47.3 to 1.47.6
- [Release notes](https://github.com/dotenvx/dotenvx/releases)
- [Changelog](https://github.com/dotenvx/dotenvx/blob/main/CHANGELOG.md)
- [Commits](https://github.com/dotenvx/dotenvx/compare/v1.47.3...v1.47.6)

Updates `@types/node` from 24.0.12 to 24.0.14
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

---
updated-dependencies:
- dependency-name: "@dotenvx/dotenvx"
  dependency-version: 1.47.6
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dev-patch-updates
- dependency-name: "@types/node"
  dependency-version: 24.0.14
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dev-patch-updates
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-07-16 01:43:17 +00:00
miloschwartz
1dff9baa61 Merge branch 'dev' of https://github.com/fosrl/pangolin into dev 2025-07-15 16:24:26 -07:00
miloschwartz
19d54778f5 add branding logo component 2025-07-15 16:24:16 -07:00
Owen
99d0fa974b Remove breakpoints 2025-07-15 16:17:31 -07:00
Owen
84ca275f1e Remove subnet check on the org for now 2025-07-15 16:15:22 -07:00
Owen
963bc5f0bc Add migrations to the callers 2025-07-15 15:59:37 -07:00
Owen
b446c2ce4b Add initial migration 2025-07-15 15:58:01 -07:00
Owen
65a4f7af28 Merge branch 'dev' of github.com:fosrl/pangolin into dev 2025-07-15 15:52:37 -07:00
Owen
f6b2c5bbf3 Initial migration created for sqlite 2025-07-15 15:52:15 -07:00
miloschwartz
e99905e3c9 translate domains and prevent delete config domain 2025-07-15 15:51:37 -07:00
miloschwartz
5c0b42446d Merge branch 'dev' of https://github.com/fosrl/pangolin into dev 2025-07-15 15:27:38 -07:00
miloschwartz
a3be0d4655 ensure subdomain is null if is base domain 2025-07-15 15:27:23 -07:00
Owen
47729c2348 Remove reference to deleted site form 2025-07-15 15:13:50 -07:00
Owen
78bfcf5b1c Fix some clients address showing issues 2025-07-15 15:11:30 -07:00
miloschwartz
f1291d4d7d remove is base domain resource and flag 2025-07-15 15:07:34 -07:00
Owen
ff809416f5 Regenerate package lock 2025-07-15 14:44:08 -07:00
miloschwartz
83a4677026 don't allow deleting config managed domains 2025-07-15 13:20:44 -07:00
Owen
ffe8593a07 Remove create site modal 2025-07-15 12:07:25 -07:00
Owen
60e4db16ff Fix dockerfiles 2025-07-15 11:39:19 -07:00
miloschwartz
2e510778be fix header 2025-07-14 22:37:08 -07:00
miloschwartz
c492559010 fix profile icon merge issue 2025-07-14 22:32:42 -07:00
miloschwartz
a8dc36b6d2 Merge branch 'dev' of https://github.com/fosrl/pangolin into dev 2025-07-14 22:21:12 -07:00
miloschwartz
379d31aac6 Merge branch 'dev' of https://github.com/fosrl/pangolin into dev 2025-07-14 22:21:04 -07:00
Owen
28fc1ab063 Rename to sqlite 2025-07-14 18:27:06 -07:00
Owen
75e01018a5 Add docker file for dev 2025-07-14 18:24:37 -07:00
miloschwartz
b7df0b122d introduce strict rate limitso on auth router endpoints 2025-07-14 18:00:41 -07:00
Owen
f9798a8d86 Redis 2025-07-14 17:10:26 -07:00
Owen
7691bdd181 Add back "swagger-ui-express": "^5.0.1", 2025-07-14 17:00:34 -07:00
Owen
3dc79da2fa Merge branch 'dev' into clients-pops-dev 2025-07-14 16:59:00 -07:00
Owen
83b00c1cfa Fix domain picker build and copy in for domains 2025-07-14 16:37:54 -07:00
miloschwartz
d6fdb38c22 remove vacuum 2025-07-14 16:27:18 -07:00
miloschwartz
3505342a8d style consistency changes to add security key form 2025-07-14 15:43:33 -07:00
Owen
78661799f2 Resources working with new picker 2025-07-14 15:36:15 -07:00
Owen
ec57996b01 Hide license 2025-07-14 14:56:03 -07:00
miloschwartz
0a97d91aed restore migrations and fix rate limit 2025-07-14 14:55:09 -07:00
Owen
753027ffc7 Translate missing translations 2025-07-14 14:45:46 -07:00
Milo Schwartz
d3383f0f1a Merge pull request #1011 from adrianeastles/feat/internal-user-passkey-support
Internal User - Passwordless Login for Org Members
2025-07-14 17:43:20 -04:00
Milo Schwartz
9075ecb007 Merge branch 'dev' into feat/internal-user-passkey-support 2025-07-14 17:43:01 -04:00
Owen
4b8cc7c4d3 Control with build 2025-07-14 12:46:47 -07:00
Owen
2f20397c60 Flag deleting orgs 2025-07-14 12:38:58 -07:00
Owen
7f227932da Domain picker support wildcard 2025-07-14 12:24:38 -07:00
Owen
69d253fba3 Create wildcard domains 2025-07-14 12:18:12 -07:00
Owen
b75800c583 Reintroduce clients conditionally 2025-07-14 11:43:13 -07:00
Owen
a35add3fc6 Consolidate imports 2025-07-14 10:56:24 -07:00
Owen
b17ff57582 Add missing new domain cols 2025-07-14 10:56:10 -07:00
miloschwartz
915ccdc007 server admin enforce 2fa per user 2025-07-13 21:58:37 -07:00
Owen
98a261e38c Pull up downstream changes 2025-07-13 21:57:24 -07:00
Adrian Astles
c9f5ffae42 Merge branch 'dev' into feat/internal-user-passkey-support 2025-07-14 07:20:33 +08:00
Owen
342675276b Add type & cap 2025-07-13 15:58:58 -07:00
Milo Schwartz
590296e64d Merge pull request #1035 from jnewing/feature-manage-2fa
Feature Manage Users 2fa
2025-07-13 18:33:36 -04:00
Milo Schwartz
17b39d16a3 Merge branch 'dev' into feature-manage-2fa 2025-07-13 18:33:27 -04:00
Owen
515a621eb4 Merge branch 'feature/podman-installer' of github.com:wayneyaoo/pangolin into wayneyaoo-feature/podman-installer 2025-07-13 15:09:39 -07:00
Owen Schwartz
ca0e950cdf Merge pull request #1038 from fosrl/dependabot/npm_and_yarn/prod-minor-updates-3b5c1dc64f
Bump the prod-minor-updates group across 1 directory with 5 updates
2025-07-13 11:47:58 -07:00
dependabot[bot]
cec9e4101d Bump the prod-minor-updates group across 1 directory with 5 updates
Bumps the prod-minor-updates group with 5 updates in the / directory:

| Package | From | To |
| --- | --- | --- |
| [@react-email/components](https://github.com/resend/react-email/tree/HEAD/packages/components) | `0.1.0` | `0.2.0` |
| [@react-email/tailwind](https://github.com/resend/react-email/tree/HEAD/packages/tailwind) | `1.0.5` | `1.1.0` |
| [eslint](https://github.com/eslint/eslint) | `9.29.0` | `9.30.1` |
| [lucide-react](https://github.com/lucide-icons/lucide/tree/HEAD/packages/lucide-react) | `0.522.0` | `0.525.0` |
| [react-hook-form](https://github.com/react-hook-form/react-hook-form) | `7.58.1` | `7.60.0` |



Updates `@react-email/components` from 0.1.0 to 0.2.0
- [Release notes](https://github.com/resend/react-email/releases)
- [Changelog](https://github.com/resend/react-email/blob/canary/packages/components/CHANGELOG.md)
- [Commits](https://github.com/resend/react-email/commits/@react-email/components@0.2.0/packages/components)

Updates `@react-email/tailwind` from 1.0.5 to 1.1.0
- [Release notes](https://github.com/resend/react-email/releases)
- [Changelog](https://github.com/resend/react-email/blob/canary/packages/tailwind/CHANGELOG.md)
- [Commits](https://github.com/resend/react-email/commits/@react-email/tailwind@1.1.0/packages/tailwind)

Updates `eslint` from 9.29.0 to 9.30.1
- [Release notes](https://github.com/eslint/eslint/releases)
- [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md)
- [Commits](https://github.com/eslint/eslint/compare/v9.29.0...v9.30.1)

Updates `lucide-react` from 0.522.0 to 0.525.0
- [Release notes](https://github.com/lucide-icons/lucide/releases)
- [Commits](https://github.com/lucide-icons/lucide/commits/0.525.0/packages/lucide-react)

Updates `react-hook-form` from 7.58.1 to 7.60.0
- [Release notes](https://github.com/react-hook-form/react-hook-form/releases)
- [Changelog](https://github.com/react-hook-form/react-hook-form/blob/master/CHANGELOG.md)
- [Commits](https://github.com/react-hook-form/react-hook-form/compare/v7.58.1...v7.60.0)

---
updated-dependencies:
- dependency-name: "@react-email/components"
  dependency-version: 0.2.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: prod-minor-updates
- dependency-name: "@react-email/tailwind"
  dependency-version: 1.1.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: prod-minor-updates
- dependency-name: eslint
  dependency-version: 9.30.1
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: prod-minor-updates
- dependency-name: lucide-react
  dependency-version: 0.525.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: prod-minor-updates
- dependency-name: react-hook-form
  dependency-version: 7.60.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: prod-minor-updates
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-07-13 18:47:45 +00:00
Owen Schwartz
862fabf6ad Merge pull request #1054 from daeho-ro/weblate
feat: Add Korean translations
2025-07-13 11:46:28 -07:00
Owen Schwartz
128a9aae4e Merge pull request #1045 from fosrl/dependabot/npm_and_yarn/dev-minor-updates-4850a154df
Bump the dev-minor-updates group with 3 updates
2025-07-13 11:40:38 -07:00
Daeho Ro
1983d0067d Add Korean translations 2025-07-12 13:21:14 +09:00
Daeho Ro
bdaf48da20 Translated using Weblate (Korean)
Currently translated at 100.0% (1134 of 1134 strings)

Translated using Weblate (Korean)

Currently translated at 2.9% (33 of 1134 strings)

Translated using Weblate (Korean)

Currently translated at 2.9% (33 of 1134 strings)

Translated using Weblate (Korean)

Currently translated at 2.9% (33 of 1134 strings)

Added translation using Weblate (Korean)

Co-authored-by: Daeho Ro <40587651+daeho-ro@users.noreply.github.com>
Co-authored-by: Daeho Ro <email@daeho.ro>
Co-authored-by: OpenAI <noreply-mt-openai@weblate.org>
Co-authored-by: Weblate <noreply-mt-weblate@weblate.org>
Translate-URL: https://mini-i18n.daeho.ro/projects/pangolin/main/ko/
Translation: pangolin/main
2025-07-12 04:15:35 +00:00
dependabot[bot]
09024a93e9 Bump the dev-minor-updates group with 3 updates
Bumps the dev-minor-updates group with 3 updates: [@dotenvx/dotenvx](https://github.com/dotenvx/dotenvx), [react-email](https://github.com/resend/react-email/tree/HEAD/packages/react-email) and [typescript-eslint](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/typescript-eslint).


Updates `@dotenvx/dotenvx` from 1.45.1 to 1.47.3
- [Release notes](https://github.com/dotenvx/dotenvx/releases)
- [Changelog](https://github.com/dotenvx/dotenvx/blob/main/CHANGELOG.md)
- [Commits](https://github.com/dotenvx/dotenvx/compare/v1.45.1...v1.47.3)

Updates `react-email` from 4.0.16 to 4.1.0
- [Release notes](https://github.com/resend/react-email/releases)
- [Changelog](https://github.com/resend/react-email/blob/canary/packages/react-email/CHANGELOG.md)
- [Commits](https://github.com/resend/react-email/commits/react-email@4.1.0/packages/react-email)

Updates `typescript-eslint` from 8.35.1 to 8.36.0
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/typescript-eslint/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.36.0/packages/typescript-eslint)

---
updated-dependencies:
- dependency-name: "@dotenvx/dotenvx"
  dependency-version: 1.47.3
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: dev-minor-updates
- dependency-name: react-email
  dependency-version: 4.1.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: dev-minor-updates
- dependency-name: typescript-eslint
  dependency-version: 8.36.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: dev-minor-updates
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-07-10 01:57:05 +00:00
Owen Schwartz
064e7071b2 Merge pull request #1037 from fosrl/dependabot/npm_and_yarn/dev-patch-updates-47326aa7c5
Bump the dev-patch-updates group across 1 directory with 3 updates
2025-07-09 10:03:30 -07:00
Owen Schwartz
2b2fedb380 Merge pull request #1039 from fosrl/dependabot/npm_and_yarn/prod-patch-updates-2cef69bbab
Bump the prod-patch-updates group across 1 directory with 7 updates
2025-07-09 10:02:58 -07:00
dependabot[bot]
5ff7c216b9 Bump the prod-patch-updates group across 1 directory with 7 updates
Bumps the prod-patch-updates group with 7 updates in the / directory:

| Package | From | To |
| --- | --- | --- |
| [eslint-config-next](https://github.com/vercel/next.js/tree/HEAD/packages/eslint-config-next) | `15.3.4` | `15.3.5` |
| [next](https://github.com/vercel/next.js) | `15.3.4` | `15.3.5` |
| [next-intl](https://github.com/amannn/next-intl) | `4.3.1` | `4.3.4` |
| [nodemailer](https://github.com/nodemailer/nodemailer) | `7.0.3` | `7.0.5` |
| [tw-animate-css](https://github.com/Wombosvideo/tw-animate-css) | `1.3.4` | `1.3.5` |
| [ws](https://github.com/websockets/ws) | `8.18.2` | `8.18.3` |
| [zod](https://github.com/colinhacks/zod) | `3.25.67` | `3.25.76` |



Updates `eslint-config-next` from 15.3.4 to 15.3.5
- [Release notes](https://github.com/vercel/next.js/releases)
- [Changelog](https://github.com/vercel/next.js/blob/canary/release.js)
- [Commits](https://github.com/vercel/next.js/commits/v15.3.5/packages/eslint-config-next)

Updates `next` from 15.3.4 to 15.3.5
- [Release notes](https://github.com/vercel/next.js/releases)
- [Changelog](https://github.com/vercel/next.js/blob/canary/release.js)
- [Commits](https://github.com/vercel/next.js/compare/v15.3.4...v15.3.5)

Updates `next-intl` from 4.3.1 to 4.3.4
- [Release notes](https://github.com/amannn/next-intl/releases)
- [Changelog](https://github.com/amannn/next-intl/blob/main/CHANGELOG.md)
- [Commits](https://github.com/amannn/next-intl/compare/v4.3.1...v4.3.4)

Updates `nodemailer` from 7.0.3 to 7.0.5
- [Release notes](https://github.com/nodemailer/nodemailer/releases)
- [Changelog](https://github.com/nodemailer/nodemailer/blob/master/CHANGELOG.md)
- [Commits](https://github.com/nodemailer/nodemailer/compare/v7.0.3...v7.0.5)

Updates `tw-animate-css` from 1.3.4 to 1.3.5
- [Release notes](https://github.com/Wombosvideo/tw-animate-css/releases)
- [Commits](https://github.com/Wombosvideo/tw-animate-css/compare/v1.3.4...v1.3.5)

Updates `ws` from 8.18.2 to 8.18.3
- [Release notes](https://github.com/websockets/ws/releases)
- [Commits](https://github.com/websockets/ws/compare/8.18.2...8.18.3)

Updates `zod` from 3.25.67 to 3.25.76
- [Release notes](https://github.com/colinhacks/zod/releases)
- [Commits](https://github.com/colinhacks/zod/compare/v3.25.67...v3.25.76)

---
updated-dependencies:
- dependency-name: eslint-config-next
  dependency-version: 15.3.5
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: prod-patch-updates
- dependency-name: next
  dependency-version: 15.3.5
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: prod-patch-updates
- dependency-name: next-intl
  dependency-version: 4.3.4
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: prod-patch-updates
- dependency-name: nodemailer
  dependency-version: 7.0.5
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: prod-patch-updates
- dependency-name: tw-animate-css
  dependency-version: 1.3.5
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: prod-patch-updates
- dependency-name: ws
  dependency-version: 8.18.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: prod-patch-updates
- dependency-name: zod
  dependency-version: 3.25.76
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: prod-patch-updates
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-07-09 01:20:06 +00:00
dependabot[bot]
c476ac7bc5 Bump the dev-patch-updates group across 1 directory with 3 updates
Bumps the dev-patch-updates group with 3 updates in the / directory: [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node), [drizzle-kit](https://github.com/drizzle-team/drizzle-orm) and [esbuild](https://github.com/evanw/esbuild).


Updates `@types/node` from 24.0.7 to 24.0.12
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

Updates `drizzle-kit` from 0.31.2 to 0.31.4
- [Release notes](https://github.com/drizzle-team/drizzle-orm/releases)
- [Commits](https://github.com/drizzle-team/drizzle-orm/compare/drizzle-kit@0.31.2...drizzle-kit@0.31.4)

Updates `esbuild` from 0.25.5 to 0.25.6
- [Release notes](https://github.com/evanw/esbuild/releases)
- [Changelog](https://github.com/evanw/esbuild/blob/main/CHANGELOG.md)
- [Commits](https://github.com/evanw/esbuild/compare/v0.25.5...v0.25.6)

---
updated-dependencies:
- dependency-name: "@types/node"
  dependency-version: 24.0.12
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dev-patch-updates
- dependency-name: drizzle-kit
  dependency-version: 0.31.4
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dev-patch-updates
- dependency-name: esbuild
  dependency-version: 0.25.6
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dev-patch-updates
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-07-09 01:18:19 +00:00
Wayne Yao
e83e8c2ee4 Add podman support to the installer. 2025-07-08 23:14:42 +08:00
Wayne Yao
607b168b56 Use explicity FQDN image path because Podman by default doesn't have unqualified-search, and we don't bother configuring it for users. Being explicit is also a good practice 2025-07-08 23:14:23 +08:00
Wayne Yao
e0cf0916dd Add a few targets to the Makefile to ease local development 2025-07-08 23:13:00 +08:00
J. Newing
0f3a5ce8ba Added users 2FA statsu to userstable 2025-07-08 10:21:24 -04:00
J. Newing
2a6298e9eb Admins can enable 2FA
Added the feature for admins to force 2FA on accounts. The next time the
user logs in they will have to setup 2FA on their account.
2025-07-08 10:21:24 -04:00
Adrian Astles
f97b133c8c Resolved build error. 2025-07-08 22:04:24 +08:00
Owen Schwartz
f11fa4f32d Merge pull request #1023 from Burzhui34/fix-russian-plural-forms
Fix plural forms for Russian language
2025-07-07 09:08:32 -07:00
Adrian Astles
f0a1c10ec5 fix(auth): improve security key login flow.
- Fix login to verify password before showing security key prompt
- Add proper 2FA verification flow when deleting security keys

Previously, users with security keys would see the security key prompt
even if they entered an incorrect password. Now the password is verified
first. Additionally, security key deletion now properly handles 2FA
verification when enabled.
2025-07-07 17:48:23 +08:00
Burzhui34
08fed8fe93 Fix plural forms for Russian language
Change =1/other to one/other format to support proper grammar in Russian
2025-07-06 21:04:27 +03:00
Adrian Astles
813992141a Fix version mismatch with package-lock.json with package.json 2025-07-07 01:08:01 +08:00
Owen Schwartz
f90129213e Merge pull request #1021 from fosrl/dependabot/github_actions/docker/setup-buildx-action-3
Bump docker/setup-buildx-action from 2 to 3
2025-07-06 10:07:50 -07:00
dependabot[bot]
838af30a38 Bump docker/setup-buildx-action from 2 to 3
Bumps [docker/setup-buildx-action](https://github.com/docker/setup-buildx-action) from 2 to 3.
- [Release notes](https://github.com/docker/setup-buildx-action/releases)
- [Commits](https://github.com/docker/setup-buildx-action/compare/v2...v3)

---
updated-dependencies:
- dependency-name: docker/setup-buildx-action
  dependency-version: '3'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-07-06 17:02:46 +00:00
Owen Schwartz
13ff15311a Merge pull request #1019 from fosrl/dependabot/github_actions/actions/setup-go-5
Bump actions/setup-go from 4 to 5
2025-07-06 10:02:29 -07:00
Owen Schwartz
56e237c479 Merge pull request #1020 from fosrl/dependabot/github_actions/docker/login-action-3
Bump docker/login-action from 2 to 3
2025-07-06 10:01:49 -07:00
Owen Schwartz
ff1e10a025 Merge pull request #1022 from fosrl/dependabot/github_actions/actions/checkout-4
Bump actions/checkout from 3 to 4
2025-07-06 10:00:51 -07:00
dependabot[bot]
c259037dbf Bump actions/checkout from 3 to 4
Bumps [actions/checkout](https://github.com/actions/checkout) from 3 to 4.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/checkout/compare/v3...v4)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-version: '4'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-07-06 16:38:48 +00:00
dependabot[bot]
7b4878620f Bump docker/login-action from 2 to 3
Bumps [docker/login-action](https://github.com/docker/login-action) from 2 to 3.
- [Release notes](https://github.com/docker/login-action/releases)
- [Commits](https://github.com/docker/login-action/compare/v2...v3)

---
updated-dependencies:
- dependency-name: docker/login-action
  dependency-version: '3'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-07-06 16:38:42 +00:00
dependabot[bot]
38fd58c173 Bump actions/setup-go from 4 to 5
Bumps [actions/setup-go](https://github.com/actions/setup-go) from 4 to 5.
- [Release notes](https://github.com/actions/setup-go/releases)
- [Commits](https://github.com/actions/setup-go/compare/v4...v5)

---
updated-dependencies:
- dependency-name: actions/setup-go
  dependency-version: '5'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-07-06 16:38:40 +00:00
Owen Schwartz
d1185d43f7 Merge pull request #1018 from Lokowitz/update-dependabot
Update dependabot with github-actions
2025-07-06 09:38:02 -07:00
Adrian Astles
a093c54b16 simplified security key management interface. 2025-07-06 20:41:26 +08:00
Marvin
30cc85b793 Update dependabot.yml 2025-07-06 13:12:43 +02:00
Adrian Astles
5009906385 renamed passkey to security key to stay aligned with the UI and other backend naming. 2025-07-05 21:51:31 +08:00
Adrian Astles
6ccc05b183 Update security key error handling and user feedback. Improve user guidance for security key interactions and Implement proper error handling for permission denials and timing issues. 2025-07-05 18:56:32 +08:00
Adrian Astles
3994b25a71 Merge branch 'dev' into feat/internal-user-passkey-support 2025-07-05 18:36:44 +08:00
Adrian Astles
5130071a60 improved security key management interface, also updated locales 2025-07-05 18:27:04 +08:00
Adrian Astles
d5e67835aa improved WebAuthn error messages and session handling. Compatibility guidance in error states, and Improve user guidance for common authentication issues. 2025-07-05 16:52:56 +08:00
Adrian Astles
bf8078ed66 enhance WebAuthn implementation and error handling. 2025-07-05 16:48:37 +08:00
Adrian Astles
1559a2a943 Fixed database dependencies. 2025-07-05 16:32:04 +08:00
Owen Schwartz
e2d5301376 Merge pull request #990 from Lokowitz/fix-test
Fix test
2025-07-04 08:57:56 -07:00
Adrian Astles
f31717145f feat(passkeys): Add password verification for passkey management
- Add password verification requirement when registering passkeys
- Add password verification requirement when deleting passkeys
- Add support for 2FA verification if enabled
- Add new delete confirmation dialog with password field
- Add recommendation message when only one passkey is registered
- Improve dialog styling and user experience
- Fix type issues with WebAuthn credential descriptors

Security: This change ensures that sensitive passkey operations require
password verification, similar to 2FA management, preventing unauthorized
modifications to authentication methods.
2025-07-03 22:57:29 +08:00
Adrian Astles
db76558944 refactor: rename passkeyChallenge to webauthnChallenge
- Renamed table for consistency with webauthnCredentials
- Created migration script 1.8.1.ts for table rename
- Updated schema definitions in SQLite and PostgreSQL
- Maintains WebAuthn standard naming convention
2025-07-03 21:53:07 +08:00
Owen
1bcb027e05 Fix translation issue with targets 2025-07-01 21:04:40 -07:00
miloschwartz
719d75f8a6 fix pg migration for >1.6.0 2025-07-01 21:03:10 -07:00
miloschwartz
c679875273 add inset shadow 2025-06-30 14:18:17 -07:00
miloschwartz
1e5141c27c add newt version update available to table 2025-06-30 13:59:30 -07:00
Lokowitz
e56330be47 modified: Makefile 2025-06-30 20:08:44 +00:00
Lokowitz
764a63d784 modified: Makefile 2025-06-30 20:04:51 +00:00
Lokowitz
6f280c4664 modified: package-lock.json 2025-06-30 20:03:22 +00:00
Lokowitz
9b29f38d10 modified: package-lock.json 2025-06-30 19:54:59 +00:00
Marvin
6b60410791 modified: package-lock.json 2025-06-30 19:42:25 +00:00
Marvin
dffaceba6f modified: package-lock.json 2025-06-30 19:40:45 +00:00
miloschwartz
4ffdd6f74f clean up a few save buttons 2025-06-30 12:28:27 -07:00
Marvin
3499dd4f56 Update test.yml 2025-06-30 21:25:52 +02:00
Marvin
7004820326 Update Makefile 2025-06-30 21:25:16 +02:00
Marvin
24a17235ae Update test.yml 2025-06-30 21:24:32 +02:00
miloschwartz
a0381eb2c6 clean up ui pass 1 2025-06-30 09:34:14 -07:00
Owen
3b6a44e683 Merge branch 'dev' into clients-pops 2025-06-27 18:01:21 -04:00
miloschwartz
cc930ebf53 prevent site name from wrapping 2025-06-27 16:46:03 -04:00
miloschwartz
809a135721 add refresh sites button 2025-06-27 16:43:14 -04:00
Owen
073c318f12 Improve bandiwdth update 2025-06-27 10:36:58 -04:00
miloschwartz
8f1cfd8037 toggle clients with feature flag 2025-06-26 15:09:16 -04:00
miloschwartz
7bf9cccbf6 show account already exists if email not verified 2025-06-25 16:54:33 -04:00
miloschwartz
d194e230de option to log out if on verify email screen 2025-06-25 16:44:23 -04:00
miloschwartz
bd3d9d2da3 adjust ring offset 2025-06-25 15:29:32 -04:00
miloschwartz
e694817b57 add server init method to config 2025-06-25 12:18:29 -04:00
miloschwartz
66191a9610 fix org selector overflow 2025-06-24 17:19:03 -04:00
miloschwartz
9bb4d8b2a3 store last visited org in cookie 2025-06-24 14:54:07 -04:00
miloschwartz
34180ca454 set trust proxy for int api 2025-06-22 20:01:31 -04:00
miloschwartz
fb5010a2b5 use redis store in rate limiters 2025-06-22 19:55:05 -04:00
miloschwartz
0e87b6e48b Merge branch 'dev' into clients-pops 2025-06-22 17:50:39 -04:00
miloschwartz
d45443258b update selection algorithm 2025-06-22 17:19:40 -04:00
Owen
f3b44a3085 Add default type 2025-06-22 15:48:47 -04:00
Owen
9680260104 Add domain type 2025-06-22 12:58:33 -04:00
miloschwartz
317a15b649 Merge branch 'dev' into clients-pops 2025-06-20 16:34:49 -04:00
Owen
2fd8134a57 Dont go over capacity or accept no capacity 2025-06-19 18:04:52 -04:00
miloschwartz
494b54ac32 add redis rate limiter 2025-06-19 16:58:03 -04:00
Owen
377eb2b851 Handle version in db 2025-06-19 16:40:20 -04:00
Owen
bd7e96b8af Send version and try to be reverse compatible 2025-06-19 16:40:02 -04:00
miloschwartz
acf25e8ad7 Merge branch 'dev' into clients-pops 2025-06-19 16:34:06 -04:00
Owen
a0ac757982 Exit node filtering 2025-06-19 09:30:02 -04:00
miloschwartz
3b3d7b134a mark exit node as was previously connected 2025-06-18 15:57:45 -04:00
miloschwartz
b84b78a34d add server/db/index.ts to gitignore 2025-06-18 14:20:55 -04:00
miloschwartz
17ac5a5e81 add flag to disable config managed domains 2025-06-17 17:25:41 -04:00
miloschwartz
a24431bc3b fix hide raw resources again 2025-06-17 17:03:08 -04:00
Owen
cdfeb2ff86 Filter by exit node 2025-06-17 17:00:11 -04:00
miloschwartz
8199202dc3 fix hide raw resource option 2025-06-17 16:53:57 -04:00
miloschwartz
7fd1fb89f1 disable local and wg sites with flag 2025-06-17 16:35:05 -04:00
miloschwartz
32e54d0f94 hide raw resources ui if disabled 2025-06-17 16:23:33 -04:00
miloschwartz
21e9edd201 move max connections from config to db 2025-06-17 15:53:57 -04:00
miloschwartz
a0001aaa74 add max connection and weight calculation 2025-06-17 15:51:32 -04:00
miloschwartz
753307bb99 use new exit node info 2025-06-16 22:07:03 -04:00
Owen
970feb75dd Add priority 100 2025-06-16 17:41:40 -04:00
miloschwartz
08556789f9 add exit node name 2025-06-16 17:32:38 -04:00
miloschwartz
72d8ad3204 disable migrations 2025-06-16 15:23:28 -04:00
miloschwartz
6cdf53e262 use sqlite db 2025-06-16 15:19:37 -04:00
miloschwartz
f6d81c3a23 update schema 2025-06-16 12:30:15 -04:00
miloschwartz
4d7b905e98 fix typo 2025-06-16 11:33:24 -04:00
Owen
8c42dee5de Remove unneeded clientType 2025-06-15 18:18:28 -04:00
miloschwartz
23d529bb31 Merge branch 'dev' into clients-pops 2025-06-15 18:04:44 -04:00
miloschwartz
7bbb687047 make exit node name backwards compatible 2025-06-15 18:02:31 -04:00
miloschwartz
b39708700d add exit node name and fix db import issues 2025-06-15 17:49:27 -04:00
miloschwartz
d46b9eaf87 Merge branch 'redis' into clients-pops 2025-06-15 13:26:48 -04:00
miloschwartz
3e60a2bd6f Merge branch 'dev' into clients-pops 2025-06-15 13:25:21 -04:00
miloschwartz
4e2e434947 Merge branch 'dev' into redis 2025-06-15 13:25:04 -04:00
miloschwartz
af32dfbbcd move enable redis to flag 2025-06-15 13:24:51 -04:00
miloschwartz
83c10166e2 Merge branch 'redis' into clients-pops 2025-06-15 11:54:55 -04:00
miloschwartz
8bb0401c25 Merge branch 'dev' into clients-pops 2025-06-13 16:43:33 -04:00
miloschwartz
139c9d2ce3 add redis conn to config 2025-06-13 16:42:15 -04:00
miloschwartz
21f4623e3e Merge branch 'dev' into redis 2025-06-13 13:05:24 -04:00
Owen
8266c26ef1 Merge branch 'dev' into clients-pops 2025-06-11 11:38:01 -04:00
Owen
a59222cabb Merge branch 'dev' into clients-pops 2025-06-11 11:15:54 -04:00
Owen
459bc32f9d Merge branch 'dev' into clients-pops 2025-06-11 11:13:40 -04:00
Owen
9a2022a4fe Working on new exit node picking 2025-06-11 09:13:38 -04:00
Owen
0537992603 Merge branch 'dev' into clients-pops 2025-06-10 13:00:20 -04:00
Owen
1c18b2bffb Create redis connection 2025-05-28 20:59:06 -04:00
Owen
d523ebe0e0 Merge branch 'dev' into auth-providers-clients 2025-05-27 20:46:09 -04:00
miloschwartz
d3b9363392 Merge branch 'dev' into auth-providers-clients 2025-05-13 15:08:46 -04:00
Owen
285b99f1b7 Can adjust sites 2025-05-11 12:29:58 -04:00
Owen
8ad8f98f48 Able to update sites from the frontend 2025-05-11 11:11:27 -04:00
Owen
160a7ff3db Merge branch 'dev' into auth-providers-clients 2025-05-11 10:31:29 -04:00
Owen
a76dd9c9d1 Merge branch 'dev' into auth-providers-clients 2025-05-03 11:45:11 -04:00
Owen
752c474983 Merge branch 'dev' into auth-providers-clients 2025-04-29 11:39:12 -04:00
Owen
02ccb029ae Merge branch 'hp-multi-client' into auth-providers-clients 2025-04-29 11:34:32 -04:00
miloschwartz
b01fa82627 Merge branch 'auth-providers' into auth-providers-clients 2025-04-22 22:58:06 -04:00
Owen
0c370e4299 Scope down the allowedIps so there are no conflicts 2025-04-22 22:18:50 -04:00
miloschwartz
d737fda8bc Merge branch 'auth-providers' into auth-providers-clients 2025-04-20 22:51:05 -04:00
Owen
475a431859 Add TODO 2025-04-20 21:07:22 -04:00
miloschwartz
490ddfcd88 add clients openapi registries 2025-04-20 17:00:45 -04:00
miloschwartz
fa6fc9e80d small clients ui tweaks 2025-04-20 16:49:48 -04:00
miloschwartz
f960fb7d67 Merge branch 'hp-multi-client' into auth-providers-clients 2025-04-20 16:15:40 -04:00
Owen
f6a19631dc Still working on stability 2025-04-20 14:25:53 -04:00
Owen
e2efd0e65a Make sure to add the subnet 2025-04-18 16:44:03 -04:00
Owen
361f487384 Add back removed section 2025-04-18 16:21:06 -04:00
Owen
dc49027b30 Edit client page done 2025-04-18 15:32:20 -04:00
Owen
581fdd67b1 Allow picking ips when creating stuff 2025-04-18 14:41:27 -04:00
Owen
d664aa204f Handle cidrs correctly 2025-04-16 22:07:07 -04:00
Owen
db0328fa71 Allow configuration of client and org subnets 2025-04-16 22:00:24 -04:00
Owen
569635f3ed newts not being on when olm is started 2025-04-13 21:28:11 -04:00
Owen
b7ae712b63 Add ping; working on newt tunnel reliability 2025-04-13 17:27:53 -04:00
Owen
8398f7b7c0 Relaying working 2025-04-11 20:52:45 -04:00
Owen
e57574ba9c Solve olm not having chance to send hp message 2025-04-11 10:33:20 -04:00
Owen
68ebdda1ff Start new relay method 2025-04-07 09:55:39 -04:00
Owen
410207f3ca Working on htp 2025-04-04 10:59:22 -04:00
Owen
7faf1fba8b Move up client reject 2025-04-01 22:49:08 -04:00
Owen
8c267489c7 Add exit node to create site 2025-04-01 21:52:03 -04:00
Owen
fb5c428147 Add logging to not sending because endpoint 2025-04-01 21:28:16 -04:00
Owen
5ff4215bde Able to connect multi site on olm - POC 1 2025-04-01 12:49:02 -04:00
Owen
96d6ad8142 Create clients working again 2025-04-01 10:13:20 -04:00
Owen
875fa215c5 Update create client form 2025-03-31 16:27:40 -04:00
Owen
bcd80e19d4 Update list clients 2025-03-31 16:23:02 -04:00
Owen
56e1684e2e Update api endpoints for new association 2025-03-31 16:21:01 -04:00
Owen
1baa02de89 Fix relay ws message 2025-03-31 15:45:51 -04:00
Owen
11cdfa7557 Merge branch 'holepunch' into hp-multi-client 2025-03-31 15:34:35 -04:00
Owen
8fbd8a905f We do not need to send any message back 2025-03-31 15:34:18 -04:00
Owen
cd059728fd Put back handle relay message 2025-03-31 15:25:30 -04:00
Owen
473b5bd3db Merge branch 'holepunch' into hp-multi-client 2025-03-31 15:24:33 -04:00
Owen
81c7954e0c Remove unused argon 2025-03-31 15:19:37 -04:00
Owen
a665e3aae9 Fix issues with relaying and holepunching 2025-03-27 22:13:57 -04:00
Owen
4b6985718a Fix ip picking from subnet in exclusion 2025-03-27 22:13:39 -04:00
Owen
619cfef1c7 Working on multi client 2025-03-27 14:27:41 -04:00
Owen
15eb666394 Remove olm/wg/relay message 2025-03-26 21:41:20 -04:00
Owen
dac49f7fdc Converting more multi site 2025-03-26 21:39:12 -04:00
Owen
926ec831e2 Finish conversion of olm reg to multi site 2025-03-26 21:23:26 -04:00
Owen
87012c47ea Start changes for multi site clients
- Org subnet and assign sites and clients out of the same subnet group
  on each org
- Add join table for client on multiple sites
- Start to handle websocket endpoints for these multiple connections
2025-03-25 22:01:08 -04:00
Owen
fbe7e0a427 Merge branch 'dev' into holepunch 2025-03-25 20:42:14 -04:00
Owen
779a1c303f Verify holepunch token and send gerbil pub key 2025-03-15 21:45:53 -04:00
Owen
14e6136683 Send down gerbil pub so it can encrypt 2025-03-14 09:18:13 -04:00
Owen
1f11a1df02 Merge branch 'main' into holepunch 2025-03-10 21:13:05 -04:00
Owen
8e4bccffbf Dont use bytes out for online
Persistant keep alive means that this will always increase
2025-02-27 23:54:24 -05:00
Owen
733e0e07c3 Fix subnet issues 2025-02-24 20:21:57 -05:00
Owen
8ee6a3f134 Add bruno 2025-02-23 21:35:13 -05:00
Owen
bacc5e4213 Add relay message 2025-02-23 20:18:03 -05:00
Owen
afd87d07a3 Basic relay working! 2025-02-23 16:49:41 -05:00
Owen
bebe40c8e8 HP works! 2025-02-22 12:53:35 -05:00
Owen
e4c5be4350 Initial hp working? 2025-02-22 11:20:56 -05:00
Owen
a9a9391b39 Receive new holepunch info 2025-02-21 22:29:48 -05:00
miloschwartz
9f54f4d81a show site link in clients table 2025-02-21 22:20:19 -05:00
miloschwartz
1a63669805 Merge branch 'clients' of https://github.com/fosrl/pangolin_dg into clients 2025-02-21 18:51:43 -05:00
miloschwartz
fcf6abd36e delete client instead of site 2025-02-21 18:51:27 -05:00
Owen
b9080a1ec1 Working! 2025-02-21 18:51:16 -05:00
Owen
450b0bf4fa Use the right ip 2025-02-21 18:16:07 -05:00
miloschwartz
a4d3a5ad4d don't sent orgId in createClient 2025-02-21 17:30:15 -05:00
miloschwartz
6c22a2aeb4 Merge branch 'clients' of https://github.com/fosrl/pangolin_dg into clients 2025-02-21 17:25:05 -05:00
miloschwartz
2e36c97d1c set checked 2025-02-21 17:24:54 -05:00
Owen
f99efbb1e9 Update the public key and the endpoint 2025-02-21 17:23:22 -05:00
Owen
6cf3bf0255 Not optional 2025-02-21 17:22:05 -05:00
Owen
a0abe41c8a Fix up ws messages 2025-02-21 17:13:54 -05:00
miloschwartz
3830ad65fc more frontend for clients 2025-02-21 17:13:23 -05:00
miloschwartz
204403da67 Merge branch 'clients' of https://github.com/fosrl/pangolin_dg into clients 2025-02-21 16:58:39 -05:00
miloschwartz
098723b88d clients frontend demo first pass 2025-02-21 16:58:30 -05:00
Owen
b21e758eb8 Initial olm test working 2025-02-21 16:19:12 -05:00
Owen
b1f4971f25 Get new api endpoints working 2025-02-21 16:12:44 -05:00
miloschwartz
6e1bfdac58 add listClients endpoint 2025-02-21 15:45:34 -05:00
miloschwartz
11920ca997 add deleteClient endpoint 2025-02-21 15:26:48 -05:00
miloschwartz
255e29d9c8 Merge branch 'clients' of https://github.com/fosrl/pangolin_dg into clients 2025-02-21 14:39:31 -05:00
miloschwartz
35ccdd3014 add createClient for testing 2025-02-21 14:39:10 -05:00
Owen
757d628bc8 Handle port correctly 2025-02-21 12:52:24 -05:00
Owen
a57d32d05d Add receive bandwidth 2025-02-21 12:41:02 -05:00
Owen
ef69bf9256 Update ws paths 2025-02-21 12:34:05 -05:00
Owen
bec303821b Handle types in handlers 2025-02-21 12:17:56 -05:00
miloschwartz
346f2db5fb add client olm relationship 2025-02-21 11:57:01 -05:00
Owen
b9de0f8e38 Working on handlers 2025-02-21 10:55:38 -05:00
Owen
e112fcba29 Move things around; rename to olm 2025-02-21 10:13:41 -05:00
miloschwartz
41983ce356 add wg site get config and pick client defaults 2025-02-20 22:34:51 -05:00
Owen
fb49fb8ddd Initial schema 2025-02-20 18:10:52 -05:00
770 changed files with 98493 additions and 16721 deletions

View File

@@ -27,3 +27,8 @@ bruno/
LICENSE
CONTRIBUTING.md
dist
.git
migrations/
config/
build.ts
tsconfig.json

View File

@@ -0,0 +1,47 @@
body:
- type: textarea
attributes:
label: Summary
description: A clear and concise summary of the requested feature.
validations:
required: true
- type: textarea
attributes:
label: Motivation
description: |
Why is this feature important?
Explain the problem this feature would solve or what use case it would enable.
validations:
required: true
- type: textarea
attributes:
label: Proposed Solution
description: |
How would you like to see this feature implemented?
Provide as much detail as possible about the desired behavior, configuration, or changes.
validations:
required: true
- type: textarea
attributes:
label: Alternatives Considered
description: Describe any alternative solutions or workarounds you've thought about.
validations:
required: false
- type: textarea
attributes:
label: Additional Context
description: Add any other context, mockups, or screenshots about the feature request here.
validations:
required: false
- type: markdown
attributes:
value: |
Before submitting, please:
- Check if there is an existing issue for this feature.
- Clearly explain the benefit and use case.
- Be as specific as possible to help contributors evaluate and implement.

51
.github/ISSUE_TEMPLATE/1.bug_report.yml vendored Normal file
View File

@@ -0,0 +1,51 @@
name: Bug Report
description: Create a bug report
labels: []
body:
- type: textarea
attributes:
label: Describe the Bug
description: A clear and concise description of what the bug is.
validations:
required: true
- type: textarea
attributes:
label: Environment
description: Please fill out the relevant details below for your environment.
value: |
- OS Type & Version: (e.g., Ubuntu 22.04)
- Pangolin Version:
- Gerbil Version:
- Traefik Version:
- Newt Version:
- Olm Version: (if applicable)
validations:
required: true
- type: textarea
attributes:
label: To Reproduce
description: |
Steps to reproduce the behavior, please provide a clear description of how to reproduce the issue, based on the linked minimal reproduction. Screenshots can be provided in the issue body below.
If using code blocks, make sure syntax highlighting is correct and double-check that the rendered preview is not broken.
validations:
required: true
- type: textarea
attributes:
label: Expected Behavior
description: A clear and concise description of what you expected to happen.
validations:
required: true
- type: markdown
attributes:
value: |
Before posting the issue go through the steps you've written down to make sure the steps provided are detailed and clear.
- type: markdown
attributes:
value: |
Contributors should be able to follow the steps provided in order to reproduce the bug.

8
.github/ISSUE_TEMPLATE/config.yml vendored Normal file
View File

@@ -0,0 +1,8 @@
blank_issues_enabled: false
contact_links:
- name: Need help or have questions?
url: https://github.com/orgs/fosrl/discussions
about: Ask questions, get help, and discuss with other community members
- name: Request a Feature
url: https://github.com/orgs/fosrl/discussions/new?category=feature-requests
about: Feature requests should be opened as discussions so others can upvote and comment

View File

@@ -33,3 +33,30 @@ updates:
minor-updates:
update-types:
- "minor"
- package-ecosystem: "github-actions"
directory: "/"
schedule:
interval: "weekly"
- package-ecosystem: "gomod"
directory: "/install"
schedule:
interval: "daily"
groups:
dev-patch-updates:
dependency-type: "development"
update-types:
- "patch"
dev-minor-updates:
dependency-type: "development"
update-types:
- "minor"
prod-patch-updates:
dependency-type: "production"
update-types:
- "patch"
prod-minor-updates:
dependency-type: "production"
update-types:
- "minor"

View File

@@ -3,22 +3,22 @@ name: CI/CD Pipeline
on:
push:
tags:
- "*"
- "[0-9]+.[0-9]+.[0-9]+"
jobs:
release:
name: Build and Release
runs-on: ubuntu-latest
runs-on: amd64-runner
steps:
- name: Checkout code
uses: actions/checkout@v3
uses: actions/checkout@v5
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2
uses: docker/setup-buildx-action@v3
- name: Log in to Docker Hub
uses: docker/login-action@v2
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKER_HUB_USERNAME }}
password: ${{ secrets.DOCKER_HUB_ACCESS_TOKEN }}
@@ -28,9 +28,9 @@ jobs:
run: echo "TAG=${GITHUB_REF#refs/tags/}" >> $GITHUB_ENV
- name: Install Go
uses: actions/setup-go@v4
uses: actions/setup-go@v6
with:
go-version: 1.23.0
go-version: 1.24
- name: Update version in package.json
run: |

View File

@@ -18,17 +18,18 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
uses: actions/checkout@v5
- name: Set up Node.js
uses: actions/setup-node@v4
uses: actions/setup-node@v5
with:
node-version: '20'
node-version: '22'
- name: Install dependencies
run: |
npm ci
run: npm ci
- name: Create build file
run: npm run set:oss
- name: Run ESLint
run: |
npx eslint . --ext .js,.jsx,.ts,.tsx
run: npx eslint . --ext .js,.jsx,.ts,.tsx

View File

@@ -14,7 +14,7 @@ jobs:
stale:
runs-on: ubuntu-latest
steps:
- uses: actions/stale@v9
- uses: actions/stale@v10
with:
days-before-stale: 14
days-before-close: 14

View File

@@ -11,11 +11,11 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v5
- uses: actions/setup-node@v4
- uses: actions/setup-node@v5
with:
node-version: '20'
node-version: '22'
- name: Copy config file
run: cp config/config.example.yml config/config.yml
@@ -23,12 +23,21 @@ jobs:
- name: Install dependencies
run: npm ci
- name: Create database index.ts
run: npm run set:sqlite
- name: Create build file
run: npm run set:oss
- name: Generate database migrations
run: npm run db:sqlite:generate
- name: Apply database migrations
run: npm run db:sqlite:push
- name: Test with tsc
run: npx tsc --noEmit
- name: Start app in background
run: nohup npm run dev &
@@ -45,5 +54,8 @@ jobs:
echo "App failed to start"
exit 1
- name: Build Docker image
run: make build
- name: Build Docker image sqlite
run: make build-sqlite
- name: Build Docker image pg
run: make build-pg

16
.gitignore vendored
View File

@@ -18,6 +18,7 @@ yarn-error.log*
next-env.d.ts
*.db
*.sqlite
!Dockerfile.sqlite
*.sqlite3
*.log
.machinelogs*.json
@@ -25,6 +26,14 @@ next-env.d.ts
migrations
tsconfig.tsbuildinfo
config/config.yml
config/config.saas.yml
config/config.oss.yml
config/config.enterprise.yml
config/privateConfig.yml
config/postgres
config/postgres*
config/openapi.yaml
config/key
dist
.dist
installer
@@ -33,4 +42,11 @@ bin
.secrets
test_event.json
.idea/
public/branding
server/db/index.ts
server/build.ts
postgres/
dynamic/
*.mmdb
scratch/
tsconfig.json

2
.nvmrc
View File

@@ -1 +1 @@
20
22

View File

@@ -4,11 +4,7 @@ Contributions are welcome!
Please see the contribution and local development guide on the docs page before getting started:
https://docs.fossorial.io/development
For ideas about what features to work on and our future plans, please see the roadmap:
https://docs.fossorial.io/roadmap
https://docs.digpangolin.com/development/contributing
### Licensing Considerations

View File

@@ -1,29 +1,55 @@
FROM node:20-alpine AS builder
FROM node:22-alpine AS builder
WORKDIR /app
ARG BUILD=oss
ARG DATABASE=sqlite
# COPY package.json package-lock.json ./
COPY package*.json ./
RUN npm ci
COPY . .
RUN echo 'export * from "./sqlite";' > server/db/index.ts
RUN echo "export * from \"./$DATABASE\";" > server/db/index.ts
RUN npx drizzle-kit generate --dialect sqlite --schema ./server/db/sqlite/schema.ts --out init
RUN echo "export const build = \"$BUILD\" as any;" > server/build.ts
# Copy the appropriate TypeScript configuration based on build type
RUN if [ "$BUILD" = "oss" ]; then cp tsconfig.oss.json tsconfig.json; \
elif [ "$BUILD" = "saas" ]; then cp tsconfig.saas.json tsconfig.json; \
elif [ "$BUILD" = "enterprise" ]; then cp tsconfig.enterprise.json tsconfig.json; \
fi
# if the build is oss then remove the server/private directory
RUN if [ "$BUILD" = "oss" ]; then rm -rf server/private; fi
RUN if [ "$DATABASE" = "pg" ]; then npx drizzle-kit generate --dialect postgresql --schema ./server/db/pg/schema --out init; else npx drizzle-kit generate --dialect $DATABASE --schema ./server/db/$DATABASE/schema --out init; fi
RUN mkdir -p dist
RUN npm run next:build
RUN node esbuild.mjs -e server/index.ts -o dist/server.mjs -b $BUILD
RUN if [ "$DATABASE" = "pg" ]; then \
node esbuild.mjs -e server/setup/migrationsPg.ts -o dist/migrations.mjs; \
else \
node esbuild.mjs -e server/setup/migrationsSqlite.ts -o dist/migrations.mjs; \
fi
# test to make sure the build output is there and error if not
RUN test -f dist/server.mjs
RUN npm run build:sqlite
RUN npm run build:cli
FROM node:20-alpine AS runner
FROM node:22-alpine AS runner
WORKDIR /app
# Curl used for the health checks
RUN apk add --no-cache curl
RUN apk add --no-cache curl tzdata
# COPY package.json package-lock.json ./
COPY package*.json ./
RUN npm ci --omit=dev && npm cache clean --force
COPY --from=builder /app/.next/standalone ./
@@ -35,7 +61,6 @@ COPY ./cli/wrapper.sh /usr/local/bin/pangctl
RUN chmod +x /usr/local/bin/pangctl ./dist/cli.mjs
COPY server/db/names.json ./dist/names.json
COPY public ./public
CMD ["npm", "run", "start:sqlite"]
CMD ["npm", "run", "start"]

14
Dockerfile.dev Normal file
View File

@@ -0,0 +1,14 @@
FROM node:22-alpine
WORKDIR /app
COPY package*.json ./
# Install dependencies
RUN npm ci
# Copy source code
COPY . .
# Use tsx watch for development with hot reload
CMD ["npm", "run", "dev"]

View File

@@ -1,41 +0,0 @@
FROM node:20-alpine AS builder
WORKDIR /app
# COPY package.json package-lock.json ./
COPY package*.json ./
RUN npm ci
COPY . .
RUN echo 'export * from "./pg";' > server/db/index.ts
RUN npx drizzle-kit generate --dialect postgresql --schema ./server/db/pg/schema.ts --out init
RUN npm run build:pg
RUN npm run build:cli
FROM node:20-alpine AS runner
WORKDIR /app
# Curl used for the health checks
RUN apk add --no-cache curl
# COPY package.json package-lock.json ./
COPY package*.json ./
RUN npm ci --omit=dev && npm cache clean --force
COPY --from=builder /app/.next/standalone ./
COPY --from=builder /app/.next/static ./.next/static
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/init ./dist/init
COPY ./cli/wrapper.sh /usr/local/bin/pangctl
RUN chmod +x /usr/local/bin/pangctl ./dist/cli.mjs
COPY server/db/names.json ./dist/names.json
COPY public ./public
CMD ["npm", "run", "start:pg"]

31
LICENSE
View File

@@ -1,3 +1,34 @@
Copyright (c) 2025 Fossorial, Inc.
Portions of this software are licensed as follows:
* All files that include a header specifying they are licensed under the
"Fossorial Commercial License" are governed by the Fossorial Commercial
License terms. The specific terms applicable to each customer depend on the
commercial license tier agreed upon in writing with Fossorial, Inc.
Unauthorized use, copying, modification, or distribution is strictly
prohibited.
* All files that include a header specifying they are licensed under the GNU
Affero General Public License, Version 3 ("AGPL-3"), are governed by the
AGPL-3 terms. A full copy of the AGPL-3 license is provided below. However,
these files are also available under the Fossorial Commercial License if a
separate commercial license agreement has been executed between the customer
and Fossorial, Inc.
* All files without a license header are, by default, licensed under the GNU
Affero General Public License, Version 3 (AGPL-3). These files may also be
made available under the Fossorial Commercial License upon agreement with
Fossorial, Inc.
* All third-party components included in this repository are licensed under
their respective original licenses, as provided by their authors.
Please consult the header of each individual file to determine the applicable
license. For AGPL-3 licensed files, dual-licensing under the Fossorial
Commercial License is available subject to written agreement with Fossorial,
Inc.
GNU AFFERO GENERAL PUBLIC LICENSE
Version 3, 19 November 2007

View File

@@ -1,14 +1,48 @@
.PHONY: build build-release build-arm build-x86 test clean
.PHONY: build build-pg build-release build-arm build-x86 test clean
major_tag := $(shell echo $(tag) | cut -d. -f1)
minor_tag := $(shell echo $(tag) | cut -d. -f1,2)
build-release:
@if [ -z "$(tag)" ]; then \
echo "Error: tag is required. Usage: make build-release tag=<tag>"; \
exit 1; \
fi
docker buildx build --platform linux/arm64,linux/amd64 -t fosrl/pangolin:latest -f Dockerfile --push .
docker buildx build --platform linux/arm64,linux/amd64 -t fosrl/pangolin:$(tag) -f Dockerfile --push .
docker buildx build --platform linux/arm64,linux/amd64 -t fosrl/pangolin:postgresql-latest -f Dockerfile.pg --push .
docker buildx build --platform linux/arm64,linux/amd64 -t fosrl/pangolin:postgresql-$(tag) -f Dockerfile.pg --push .
docker buildx build \
--build-arg BUILD=oss \
--build-arg DATABASE=sqlite \
--platform linux/arm64,linux/amd64 \
--tag fosrl/pangolin:latest \
--tag fosrl/pangolin:$(major_tag) \
--tag fosrl/pangolin:$(minor_tag) \
--tag fosrl/pangolin:$(tag) \
--push .
docker buildx build \
--build-arg BUILD=oss \
--build-arg DATABASE=pg \
--platform linux/arm64,linux/amd64 \
--tag fosrl/pangolin:postgresql-latest \
--tag fosrl/pangolin:postgresql-$(major_tag) \
--tag fosrl/pangolin:postgresql-$(minor_tag) \
--tag fosrl/pangolin:postgresql-$(tag) \
--push .
docker buildx build \
--build-arg BUILD=enterprise \
--build-arg DATABASE=sqlite \
--platform linux/arm64,linux/amd64 \
--tag fosrl/pangolin:ee-latest \
--tag fosrl/pangolin:ee-$(major_tag) \
--tag fosrl/pangolin:ee-$(minor_tag) \
--tag fosrl/pangolin:ee-$(tag) \
--push .
docker buildx build \
--build-arg BUILD=enterprise \
--build-arg DATABASE=pg \
--platform linux/arm64,linux/amd64 \
--tag fosrl/pangolin:ee-postgresql-latest \
--tag fosrl/pangolin:ee-postgresql-$(major_tag) \
--tag fosrl/pangolin:ee-postgresql-$(minor_tag) \
--tag fosrl/pangolin:ee-postgresql-$(tag) \
--push .
build-arm:
docker buildx build --platform linux/arm64 -t fosrl/pangolin:latest .
@@ -16,8 +50,11 @@ build-arm:
build-x86:
docker buildx build --platform linux/amd64 -t fosrl/pangolin:latest .
build:
docker build -t fosrl/pangolin:latest .
build-sqlite:
docker build --build-arg DATABASE=sqlite -t fosrl/pangolin:latest .
build-pg:
docker build --build-arg DATABASE=pg -t fosrl/pangolin:postgresql-latest .
test:
docker run -it -p 3000:3000 -p 3001:3001 -p 3002:3002 -v ./config:/app/config fosrl/pangolin:latest

161
README.md
View File

@@ -1,153 +1,88 @@
<div align="center">
<h2>
<picture>
<source media="(prefers-color-scheme: dark)" srcset="public/logo/word_mark_white.png">
<img alt="Pangolin Logo" src="public/logo/word_mark_black.png" width="250">
<a href="https://digpangolin.com">
<picture>
<source media="(prefers-color-scheme: dark)" srcset="public/logo/word_mark_white.png">
<img alt="Pangolin Logo" src="public/logo/word_mark_black.png" width="350">
</picture>
</a>
</h2>
</div>
<h4 align="center">Tunneled Reverse Proxy Server with Access Control</h4>
<div align="center">
_Your own self-hosted zero trust tunnel._
</div>
<div align="center">
<h5>
<a href="https://fossorial.io">
<a href="https://digpangolin.com">
Website
</a>
<span> | </span>
<a href="https://docs.fossorial.io/Getting%20Started/quick-install">
Install Guide
<a href="https://docs.digpangolin.com/">
Documentation
</a>
<span> | </span>
<a href="mailto:numbat@fossorial.io">
<a href="mailto:contact@fossorial.io">
Contact Us
</a>
</h5>
</div>
<div align="center">
[![Discord](https://img.shields.io/discord/1325658630518865980?logo=discord&style=flat-square)](https://discord.gg/HCJR8Xhme4)
[![Slack](https://img.shields.io/badge/chat-slack-yellow?style=flat-square&logo=slack)](https://digpangolin.com/slack)
[![Docker](https://img.shields.io/docker/pulls/fosrl/pangolin?style=flat-square)](https://hub.docker.com/r/fosrl/pangolin)
![Stars](https://img.shields.io/github/stars/fosrl/pangolin?style=flat-square)
[![Discord](https://img.shields.io/discord/1325658630518865980?logo=discord&style=flat-square)](https://discord.gg/HCJR8Xhme4)
[![Youtube](https://img.shields.io/badge/YouTube-red?logo=youtube&logoColor=white&style=flat-square)](https://www.youtube.com/@fossorial-app)
[![YouTube](https://img.shields.io/badge/YouTube-red?logo=youtube&logoColor=white&style=flat-square)](https://www.youtube.com/@fossorial-app)
</div>
Pangolin is a self-hosted tunneled reverse proxy server with identity and access control, designed to securely expose private resources on distributed networks. Acting as a central hub, it connects isolated networks — even those behind restrictive firewalls — through encrypted tunnels, enabling easy access to remote services without opening ports.
<p align="center">
<strong>
Start testing Pangolin at <a href="https://pangolin.fossorial.io/auth/signup">pangolin.fossorial.io</a>
</strong>
</p>
<img src="public/screenshots/hero.png" alt="Preview"/>
Pangolin is a self-hosted tunneled reverse proxy server with identity and context aware access control, designed to easily expose and protect applications running anywhere. Pangolin acts as a central hub and connects isolated networks — even those behind restrictive firewalls — through encrypted tunnels, enabling easy access to remote services without opening ports or requiring a VPN.
_Resources page of Pangolin dashboard (dark mode) showing multiple resources available to connect._
## Installation
Check out the [quick install guide](https://docs.digpangolin.com/self-host/quick-install) for how to install and set up Pangolin.
## Deployment Options
| <img width=500 /> | Description |
|-----------------|--------------|
| **Self-Host: Community Edition** | Free, open source, and licensed under AGPL-3. |
| **Self-Host: Enterprise Edition** | Licensed under Fossorial Commercial License. Free for personal and hobbyist use, and for businesses earning under \$100K USD annually. |
| **Pangolin Cloud** | Fully managed service with instant setup and pay-as-you-go pricing — no infrastructure required. Or, self-host your own [remote node](https://docs.digpangolin.com/manage/remote-node/nodes) and connect to our control plane. |
## Key Features
### Reverse Proxy Through WireGuard Tunnel
Pangolin packages everything you need for seamless application access and exposure into one cohesive platform.
- Expose private resources on your network **without opening ports** (firewall punching).
- Secure and easy to configure site-to-site connectivity via a custom **user space WireGuard client**, [Newt](https://github.com/fosrl/newt).
- Built-in support for any WireGuard client.
- Automated **SSL certificates** (https) via [LetsEncrypt](https://letsencrypt.org/).
- Support for HTTP/HTTPS and **raw TCP/UDP services**.
- Load balancing.
| <img width=500 /> | <img width=500 /> |
|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------|
| **Manage applications in one place**<br /><br /> Pangolin provides a unified dashboard where you can monitor, configure, and secure all of your services regardless of where they are hosted. | <img src="public/screenshots/hero.png" width=500 /><tr></tr> |
| **Reverse proxy across networks anywhere**<br /><br />Route traffic via tunnels to any private network. Pangolin works like a reverse proxy that spans multiple networks and handles routing, load balancing, health checking, and more to the right services on the other end. | <img src="public/screenshots/sites.png" width=500 /><tr></tr> |
| **Enforce identity and context aware rules**<br /><br />Protect your applications with identity and context aware rules such as SSO, OIDC, PIN, password, temporary share links, geolocation, IP, and more. | <img src="public/auth-diagram1.png" width=500 /><tr></tr> |
| **Quickly connect Pangolin sites**<br /><br />Pangolin's lightweight [Newt](https://github.com/fosrl/newt) client runs in userspace and can run anywhere. Use it as a site connector to route traffic to backends across all of your environments. | <img src="public/clip.gif" width=500 /><tr></tr> |
### Identity & Access Management
## Get Started
- Centralized authentication system using platform SSO. **Users will only have to manage one login.**
- **Define access control rules for IPs, IP ranges, and URL paths per resource.**
- TOTP with backup codes for two-factor authentication.
- Create organizations, each with multiple sites, users, and roles.
- **Role-based access control** to manage resource access permissions.
- Additional authentication options include:
- Email whitelisting with **one-time passcodes.**
- **Temporary, self-destructing share links.**
- Resource specific pin codes.
- Resource specific passwords.
- External identity provider (IdP) support with OAuth2/OIDC, such as Authentik, Keycloak, Okta, and others.
- Auto-provision users and roles from your IdP.
### Check out the docs
### Simple Dashboard UI
We encourage everyone to read the full documentation first, which is
available at [docs.digpangolin.com](https://docs.digpangolin.com). This README provides only a very brief subset of
the docs to illustrate some basic ideas.
- Manage sites, users, and roles with a clean and intuitive UI.
- Monitor site usage and connectivity.
- Light and dark mode options.
- Mobile friendly.
### Sign up and try now
### Easy Deployment
- Run on any cloud provider or on-premises.
- **Docker Compose based setup** for simplified deployment.
- Future-proof installation script for streamlined setup and feature additions.
- Use any WireGuard client to connect, or use **Newt, our custom user space client** for the best experience.
- Use the API to create custom integrations and scripts.
- Fine-grained access control to the API via scoped API keys.
- Comprehensive Swagger documentation for the API.
### Modular Design
- Extend functionality with existing [Traefik](https://github.com/traefik/traefik) plugins, such as [CrowdSec](https://plugins.traefik.io/plugins/6335346ca4caa9ddeffda116/crowdsec-bouncer-traefik-plugin) and [Geoblock](https://github.com/PascalMinder/geoblock).
- **Automatically install and configure Crowdsec via Pangolin's installer script.**
- Attach as many sites to the central server as you wish.
<img src="public/screenshots/collage.png" alt="Collage"/>
## Deployment and Usage Example
1. **Deploy the Central Server**:
- Deploy the Docker Compose stack onto a VPS hosted on a cloud platform like RackNerd, Amazon EC2, DigitalOcean Droplet, or similar. There are many cheap VPS hosting options available to suit your needs.
> [!TIP]
> Many of our users have had a great experience with [RackNerd](https://my.racknerd.com/aff.php?aff=13788). Depending on promotions, you can get a [**VPS with 1 vCPU, 1GB RAM, and ~20GB SSD for just around $12/year**](https://my.racknerd.com/aff.php?aff=13788&pid=912). That's a great deal!
> We are part of the [RackNerd](https://my.racknerd.com/aff.php?aff=13788) affiliate program, so if you purchase through [our link](https://my.racknerd.com/aff.php?aff=13788), we receive a small commission which helps us maintain the project and keep it free for everyone.
1. **Domain Configuration**:
- Point your domain name to the VPS and configure Pangolin with your preferred settings.
2. **Connect Private Sites**:
- Install Newt or use another WireGuard client on private sites.
- Automatically establish a connection from these sites to the central server.
3. **Expose Resources**:
- Add resources to the central server and configure access control rules.
- Access these resources securely from anywhere.
**Use Case Example - Bypassing Port Restrictions in Home Lab**:
Imagine private sites where the ISP restricts port forwarding. By connecting these sites to Pangolin via WireGuard, you can securely expose HTTP and HTTPS resources on the private network without any networking complexity.
**Use Case Example - Deploying Services For Your Business**:
You can use Pangolin as an easy way to expose your business applications to your users behind a safe authentication portal you can integrate into your IdP solution. Expose resources on prem and on the cloud.
**Use Case Example - IoT Networks**:
IoT networks are often fragmented and difficult to manage. By deploying Pangolin on a central server, you can connect all your IoT sites via Newt or another WireGuard client. This creates a simple, secure, and centralized way to access IoT resources without the need for intricate networking setups.
## Similar Projects and Inspirations
**Cloudflare Tunnels**:
A similar approach to proxying private resources securely, but Pangolin is a self-hosted alternative, giving you full control over your infrastructure.
**Authelia**:
This inspired Pangolins centralized authentication system for proxies, enabling robust user and role management.
## Project Development / Roadmap
> [!NOTE]
> Pangolin is under heavy development. The roadmap is subject to change as we fix bugs, add new features, and make improvements.
View the [project board](https://github.com/orgs/fosrl/projects/1) for more detailed info.
For Pangolin's managed service, you will first need to create an account at
[pangolin.fossorial.io](https://pangolin.fossorial.io). We have a generous free tier to get started.
## Licensing
Pangolin is dual licensed under the AGPL-3 and the Fossorial Commercial license. Please see the [LICENSE](./LICENSE) file in the repository for details. For inquiries about commercial licensing, please contact us at [numbat@fossorial.io](mailto:numbat@fossorial.io).
Pangolin is dual licensed under the AGPL-3 and the [Fossorial Commercial License](https://digpangolin.com/fcl.html). For inquiries about commercial licensing, please contact us at [contact@fossorial.io](mailto:contact@fossorial.io).
## Contributions
Please see [CONTRIBUTING](./CONTRIBUTING.md) in the repository for guidelines and best practices.
Please post bug reports and other functional issues in the [Issues](https://github.com/fosrl/pangolin/issues) section of the repository.
For all feature requests, or other ideas, please use the [Discussions](https://github.com/orgs/fosrl/discussions) section.

72
blueprint.py Normal file
View File

@@ -0,0 +1,72 @@
import requests
import yaml
import json
import base64
# The file path for the YAML file to be read
# You can change this to the path of your YAML file
YAML_FILE_PATH = 'blueprint.yaml'
# The API endpoint and headers from the curl request
API_URL = 'http://api.pangolin.fossorial.io/v1/org/test/blueprint'
HEADERS = {
'accept': '*/*',
'Authorization': 'Bearer <your_token_here>',
'Content-Type': 'application/json'
}
def convert_and_send(file_path, url, headers):
"""
Reads a YAML file, converts its content to a JSON payload,
and sends it via a PUT request to a specified URL.
"""
try:
# Read the YAML file content
with open(file_path, 'r') as file:
yaml_content = file.read()
# Parse the YAML string to a Python dictionary
# This will be used to ensure the YAML is valid before sending
parsed_yaml = yaml.safe_load(yaml_content)
# convert the parsed YAML to a JSON string
json_payload = json.dumps(parsed_yaml)
print("Converted JSON payload:")
print(json_payload)
# Encode the JSON string to Base64
encoded_json = base64.b64encode(json_payload.encode('utf-8')).decode('utf-8')
# Create the final payload with the base64 encoded data
final_payload = {
"blueprint": encoded_json
}
print("Sending the following Base64 encoded JSON payload:")
print(final_payload)
print("-" * 20)
# Make the PUT request with the base64 encoded payload
response = requests.put(url, headers=headers, json=final_payload)
# Print the API response for debugging
print(f"API Response Status Code: {response.status_code}")
print("API Response Content:")
print(response.text)
# Raise an exception for bad status codes (4xx or 5xx)
response.raise_for_status()
except FileNotFoundError:
print(f"Error: The file '{file_path}' was not found.")
except yaml.YAMLError as e:
print(f"Error parsing YAML file: {e}")
except requests.exceptions.RequestException as e:
print(f"An error occurred during the API request: {e}")
except Exception as e:
print(f"An unexpected error occurred: {e}")
# Run the function
if __name__ == "__main__":
convert_and_send(YAML_FILE_PATH, API_URL, HEADERS)

69
blueprint.yaml Normal file
View File

@@ -0,0 +1,69 @@
client-resources:
client-resource-nice-id-uno:
name: this is my resource
protocol: tcp
proxy-port: 3001
hostname: localhost
internal-port: 3000
site: lively-yosemite-toad
client-resource-nice-id-duce:
name: this is my resource
protocol: udp
proxy-port: 3000
hostname: localhost
internal-port: 3000
site: lively-yosemite-toad
proxy-resources:
resource-nice-id-uno:
name: this is my resource
protocol: http
full-domain: duce.test.example.com
host-header: example.com
tls-server-name: example.com
# auth:
# pincode: 123456
# password: sadfasdfadsf
# sso-enabled: true
# sso-roles:
# - Member
# sso-users:
# - owen@fossorial.io
# whitelist-users:
# - owen@fossorial.io
headers:
- name: X-Example-Header
value: example-value
- name: X-Another-Header
value: another-value
rules:
- action: allow
match: ip
value: 1.1.1.1
- action: deny
match: cidr
value: 2.2.2.2/32
- action: pass
match: path
value: /admin
targets:
- site: lively-yosemite-toad
path: /path
pathMatchType: prefix
hostname: localhost
method: http
port: 8000
- site: slim-alpine-chipmunk
hostname: localhost
path: /yoman
pathMatchType: exact
method: http
port: 8001
resource-nice-id-duce:
name: this is other resource
protocol: tcp
proxy-port: 3000
targets:
- site: lively-yosemite-toad
hostname: localhost
port: 3000

View File

@@ -0,0 +1,17 @@
meta {
name: Create API Key
type: http
seq: 1
}
put {
url: http://localhost:3000/api/v1/api-key
body: json
auth: inherit
}
body:json {
{
"isRoot": true
}
}

View File

@@ -0,0 +1,11 @@
meta {
name: Delete API Key
type: http
seq: 2
}
delete {
url: http://localhost:3000/api/v1/api-key/dm47aacqxxn3ubj
body: none
auth: inherit
}

View File

@@ -0,0 +1,11 @@
meta {
name: List API Key Actions
type: http
seq: 6
}
get {
url: http://localhost:3000/api/v1/api-key/ex0izu2c37fjz9x/actions
body: none
auth: inherit
}

View File

@@ -0,0 +1,11 @@
meta {
name: List Org API Keys
type: http
seq: 4
}
get {
url: http://localhost:3000/api/v1/org/home-lab/api-keys
body: none
auth: inherit
}

View File

@@ -0,0 +1,11 @@
meta {
name: List Root API Keys
type: http
seq: 3
}
get {
url: http://localhost:3000/api/v1/root/api-keys
body: none
auth: inherit
}

View File

@@ -0,0 +1,17 @@
meta {
name: Set API Key Actions
type: http
seq: 5
}
post {
url: http://localhost:3000/api/v1/api-key/ex0izu2c37fjz9x/actions
body: json
auth: inherit
}
body:json {
{
"actionIds": ["listSites"]
}
}

View File

@@ -0,0 +1,17 @@
meta {
name: Set API Key Orgs
type: http
seq: 7
}
post {
url: http://localhost:3000/api/v1/api-key/ex0izu2c37fjz9x/orgs
body: json
auth: inherit
}
body:json {
{
"orgIds": ["home-lab"]
}
}

View File

@@ -0,0 +1,3 @@
meta {
name: API Keys
}

View File

@@ -5,14 +5,14 @@ meta {
}
post {
url: http://localhost:3000/api/v1/auth/login
url: http://localhost:4000/api/v1/auth/login
body: json
auth: none
}
body:json {
{
"email": "admin@fosrl.io",
"email": "owen@fossorial.io",
"password": "Password123!"
}
}

View File

@@ -5,7 +5,7 @@ meta {
}
post {
url: http://localhost:3000/api/v1/auth/logout
url: http://localhost:4000/api/v1/auth/logout
body: none
auth: none
}

View File

@@ -0,0 +1,22 @@
meta {
name: createClient
type: http
seq: 1
}
put {
url: http://localhost:3000/api/v1/site/1/client
body: json
auth: none
}
body:json {
{
"siteId": 1,
"name": "test",
"type": "olm",
"subnet": "100.90.129.4/30",
"olmId": "029yzunhx6nh3y5",
"secret": "l0ymp075y3d4rccb25l6sqpgar52k09etunui970qq5gj7x6"
}
}

View File

@@ -0,0 +1,11 @@
meta {
name: pickClientDefaults
type: http
seq: 2
}
get {
url: http://localhost:3000/api/v1/site/1/pick-client-defaults
body: none
auth: none
}

View File

@@ -0,0 +1,22 @@
meta {
name: Create OIDC Provider
type: http
seq: 1
}
put {
url: http://localhost:3000/api/v1/org/home-lab/idp/oidc
body: json
auth: inherit
}
body:json {
{
"clientId": "JJoSvHCZcxnXT2sn6CObj6a21MuKNRXs3kN5wbys",
"clientSecret": "2SlGL2wOGgMEWLI9yUuMAeFxre7qSNJVnXMzyepdNzH1qlxYnC4lKhhQ6a157YQEkYH3vm40KK4RCqbYiF8QIweuPGagPX3oGxEj2exwutoXFfOhtq4hHybQKoFq01Z3",
"authUrl": "http://localhost:9000/application/o/authorize/",
"tokenUrl": "http://localhost:9000/application/o/token/",
"scopes": ["email", "openid", "profile"],
"userIdentifier": "email"
}
}

View File

@@ -0,0 +1,11 @@
meta {
name: Generate OIDC URL
type: http
seq: 2
}
get {
url: http://localhost:3000/api/v1
body: none
auth: inherit
}

3
bruno/IDP/folder.bru Normal file
View File

@@ -0,0 +1,3 @@
meta {
name: IDP
}

View File

@@ -0,0 +1,11 @@
meta {
name: Traefik Config
type: http
seq: 1
}
get {
url: http://localhost:3001/api/v1/traefik-config
body: none
auth: inherit
}

View File

@@ -0,0 +1,3 @@
meta {
name: Internal
}

View File

@@ -0,0 +1,11 @@
meta {
name: createRemoteExitNode
type: http
seq: 1
}
put {
url: http://localhost:4000/api/v1/org/org_i21aifypnlyxur2/remote-exit-node
body: none
auth: none
}

11
bruno/Test.bru Normal file
View File

@@ -0,0 +1,11 @@
meta {
name: Test
type: http
seq: 2
}
get {
url: http://localhost:3000/api/v1
body: none
auth: inherit
}

View File

@@ -1,6 +1,6 @@
{
"version": "1",
"name": "Pangolin",
"name": "Pangolin Saas",
"type": "collection",
"ignore": [
"node_modules",

View File

@@ -0,0 +1,72 @@
import { CommandModule } from "yargs";
import { db, users, securityKeys } from "@server/db";
import { eq } from "drizzle-orm";
type ResetUserSecurityKeysArgs = {
email: string;
};
export const resetUserSecurityKeys: CommandModule<
{},
ResetUserSecurityKeysArgs
> = {
command: "reset-user-security-keys",
describe:
"Reset a user's security keys (passkeys) by deleting all their webauthn credentials",
builder: (yargs) => {
return yargs.option("email", {
type: "string",
demandOption: true,
describe: "User email address"
});
},
handler: async (argv: { email: string }) => {
try {
const { email } = argv;
console.log(`Looking for user with email: ${email}`);
// Find the user by email
const [user] = await db
.select()
.from(users)
.where(eq(users.email, email))
.limit(1);
if (!user) {
console.error(`User with email '${email}' not found`);
process.exit(1);
}
console.log(`Found user: ${user.email} (ID: ${user.userId})`);
// Check if user has any security keys
const userSecurityKeys = await db
.select()
.from(securityKeys)
.where(eq(securityKeys.userId, user.userId));
if (userSecurityKeys.length === 0) {
console.log(`User '${email}' has no security keys to reset`);
process.exit(0);
}
console.log(
`Found ${userSecurityKeys.length} security key(s) for user '${email}'`
);
// Delete all security keys for the user
await db
.delete(securityKeys)
.where(eq(securityKeys.userId, user.userId));
console.log(`Successfully reset security keys for user '${email}'`);
console.log(`Deleted ${userSecurityKeys.length} security key(s)`);
process.exit(0);
} catch (error) {
console.error("Error:", error);
process.exit(1);
}
}
};

View File

@@ -32,7 +32,9 @@ export const setAdminCredentials: CommandModule<{}, SetAdminCredentialsArgs> = {
},
handler: async (argv: { email: string; password: string }) => {
try {
const { email, password } = argv;
const { password } = argv;
let { email } = argv;
email = email.trim().toLowerCase();
const parsed = passwordSchema.safeParse(password);

View File

@@ -3,9 +3,11 @@
import yargs from "yargs";
import { hideBin } from "yargs/helpers";
import { setAdminCredentials } from "@cli/commands/setAdminCredentials";
import { resetUserSecurityKeys } from "@cli/commands/resetUserSecurityKeys";
yargs(hideBin(process.argv))
.scriptName("pangctl")
.command(setAdminCredentials)
.command(resetUserSecurityKeys)
.demandCommand()
.help().argv;

View File

@@ -1,49 +1,28 @@
# To see all available options, please visit the docs:
# https://docs.fossorial.io/Pangolin/Configuration/config
# https://docs.digpangolin.com/self-host/advanced/config-file
app:
dashboard_url: "http://localhost:3002"
log_level: "info"
save_logs: false
dashboard_url: http://localhost:3002
log_level: debug
domains:
domain1:
base_domain: "example.com"
cert_resolver: "letsencrypt"
domain1:
base_domain: example.com
server:
external_port: 3000
internal_port: 3001
next_port: 3002
internal_hostname: "pangolin"
session_cookie_name: "p_session_token"
resource_access_token_param: "p_token"
secret: "your_secret_key_here"
resource_access_token_headers:
id: "P-Access-Token-Id"
token: "P-Access-Token"
resource_session_request_param: "p_session_request"
traefik:
http_entrypoint: "web"
https_entrypoint: "websecure"
secret: my_secret_key
gerbil:
start_port: 51820
base_endpoint: "localhost"
block_size: 24
site_block_size: 30
subnet_group: 100.89.137.0/20
use_subdomain: true
base_endpoint: example.com
rate_limits:
global:
window_minutes: 1
max_requests: 500
orgs:
block_size: 24
subnet_group: 100.90.137.0/20
flags:
require_email_verification: false
disable_signup_without_invite: true
disable_user_create_org: true
allow_raw_resources: true
allow_base_domain_resources: true
require_email_verification: false
disable_signup_without_invite: true
disable_user_create_org: true
allow_raw_resources: true
enable_integration_api: true
enable_clients: true

View File

@@ -0,0 +1,46 @@
http:
middlewares:
redirect-to-https:
redirectScheme:
scheme: https
routers:
# HTTP to HTTPS redirect router
main-app-router-redirect:
rule: "Host(`{{.DashboardDomain}}`)"
service: next-service
entryPoints:
- web
middlewares:
- redirect-to-https
# Next.js router (handles everything except API and WebSocket paths)
next-router:
rule: "Host(`{{.DashboardDomain}}`)"
service: next-service
priority: 10
entryPoints:
- websecure
tls:
certResolver: letsencrypt
# API router (handles /api/v1 paths)
api-router:
rule: "Host(`{{.DashboardDomain}}`) && PathPrefix(`/api/v1`)"
service: api-service
priority: 100
entryPoints:
- websecure
tls:
certResolver: letsencrypt
services:
next-service:
loadBalancer:
servers:
- url: "http://pangolin:3002" # Next.js server
api-service:
loadBalancer:
servers:
- url: "http://pangolin:3000" # API/WebSocket server

View File

@@ -0,0 +1,34 @@
api:
insecure: true
dashboard: true
providers:
file:
directory: "/var/dynamic"
watch: true
experimental:
plugins:
badger:
moduleName: "github.com/fosrl/badger"
version: "v1.2.0"
log:
level: "DEBUG"
format: "common"
maxSize: 100
maxBackups: 3
maxAge: 3
compress: true
entryPoints:
web:
address: ":80"
websecure:
address: ":9443"
transport:
respondingTimeouts:
readTimeout: "30m"
serversTransport:
insecureSkipVerify: true

View File

@@ -20,10 +20,9 @@ services:
pangolin:
condition: service_healthy
command:
- --reachableAt=http://gerbil:3003
- --reachableAt=http://gerbil:3004
- --generateAndSaveKeyTo=/var/config/key
- --remoteConfig=http://pangolin:3001/api/v1/gerbil/get-config
- --reportBandwidthTo=http://pangolin:3001/api/v1/gerbil/receive-bandwidth
- --remoteConfig=http://pangolin:3001/api/v1/
volumes:
- ./config/:/var/config
cap_add:
@@ -31,11 +30,12 @@ services:
- SYS_MODULE
ports:
- 51820:51820/udp
- 21820:21820/udp
- 443:443 # Port for traefik because of the network_mode
- 80:80 # Port for traefik because of the network_mode
traefik:
image: traefik:v3.4.0
image: traefik:v3.5
container_name: traefik
restart: unless-stopped
network_mode: service:gerbil # Ports appear on the gerbil service
@@ -51,4 +51,5 @@ services:
networks:
default:
driver: bridge
name: pangolin
name: pangolin
enable_ipv6: true

21
docker-compose.pgr.yml Normal file
View File

@@ -0,0 +1,21 @@
services:
# PostgreSQL Service
db:
image: postgres:17 # Use the PostgreSQL 17 image
container_name: dev_postgres # Name your PostgreSQL container
environment:
POSTGRES_DB: postgres # Default database name
POSTGRES_USER: postgres # Default user
POSTGRES_PASSWORD: password # Default password (change for production!)
volumes:
- ./config/postgres:/var/lib/postgresql/data
ports:
- "5432:5432" # Map host port 5432 to container port 5432
restart: no
redis:
image: redis:latest # Use the latest Redis image
container_name: dev_redis # Name your Redis container
ports:
- "6379:6379" # Map host port 6379 to container port 6379
restart: no

29
docker-compose.yml Normal file
View File

@@ -0,0 +1,29 @@
services:
# Development application service
app:
build:
context: .
dockerfile: Dockerfile.dev
container_name: dev_pangolin
ports:
- "3000:3000"
- "3001:3001"
- "3002:3002"
- "3003:3003"
environment:
- NODE_ENV=development
- ENVIRONMENT=dev
volumes:
# Mount source code for hot reload
- ./src:/app/src
- ./server:/app/server
- ./public:/app/public
- ./messages:/app/messages
- ./components.json:/app/components.json
- ./next.config.mjs:/app/next.config.mjs
- ./tsconfig.json:/app/tsconfig.json
- ./tailwind.config.js:/app/tailwind.config.js
- ./postcss.config.mjs:/app/postcss.config.mjs
- ./eslint.config.js:/app/eslint.config.js
- ./config:/app/config
restart: no

View File

@@ -1,9 +1,13 @@
import { defineConfig } from "drizzle-kit";
import path from "path";
const schema = [
path.join("server", "db", "pg", "schema"),
];
export default defineConfig({
dialect: "postgresql",
schema: path.join("server", "db", "pg", "schema.ts"),
schema: schema,
out: path.join("server", "migrations"),
verbose: true,
dbCredentials: {

View File

@@ -2,9 +2,13 @@ import { APP_PATH } from "@server/lib/consts";
import { defineConfig } from "drizzle-kit";
import path from "path";
const schema = [
path.join("server", "db", "sqlite", "schema"),
];
export default defineConfig({
dialect: "sqlite",
schema: path.join("server", "db", "sqlite", "schema.ts"),
schema: schema,
out: path.join("server", "migrations"),
verbose: true,
dbCredentials: {

View File

@@ -2,8 +2,9 @@ import esbuild from "esbuild";
import yargs from "yargs";
import { hideBin } from "yargs/helpers";
import { nodeExternalsPlugin } from "esbuild-node-externals";
import path from "path";
import fs from "fs";
// import { glob } from "glob";
// import path from "path";
const banner = `
// patch __dirname
@@ -18,7 +19,7 @@ const require = topLevelCreateRequire(import.meta.url);
`;
const argv = yargs(hideBin(process.argv))
.usage("Usage: $0 -entry [string] -out [string]")
.usage("Usage: $0 -entry [string] -out [string] -build [string]")
.option("entry", {
alias: "e",
describe: "Entry point file",
@@ -31,6 +32,13 @@ const argv = yargs(hideBin(process.argv))
type: "string",
demandOption: true,
})
.option("build", {
alias: "b",
describe: "Build type (oss, saas, enterprise)",
type: "string",
choices: ["oss", "saas", "enterprise"],
default: "oss",
})
.help()
.alias("help", "h").argv;
@@ -46,27 +54,223 @@ function getPackagePaths() {
return ["package.json"];
}
// Plugin to guard against bad imports from #private
function privateImportGuardPlugin() {
return {
name: "private-import-guard",
setup(build) {
const violations = [];
build.onResolve({ filter: /^#private\// }, (args) => {
const importingFile = args.importer;
// Check if the importing file is NOT in server/private
const normalizedImporter = path.normalize(importingFile);
const isInServerPrivate = normalizedImporter.includes(path.normalize("server/private"));
if (!isInServerPrivate) {
const violation = {
file: importingFile,
importPath: args.path,
resolveDir: args.resolveDir
};
violations.push(violation);
console.log(`PRIVATE IMPORT VIOLATION:`);
console.log(` File: ${importingFile}`);
console.log(` Import: ${args.path}`);
console.log(` Resolve dir: ${args.resolveDir || 'N/A'}`);
console.log('');
}
// Return null to let the default resolver handle it
return null;
});
build.onEnd((result) => {
if (violations.length > 0) {
console.log(`\nSUMMARY: Found ${violations.length} private import violation(s):`);
violations.forEach((v, i) => {
console.log(` ${i + 1}. ${path.relative(process.cwd(), v.file)} imports ${v.importPath}`);
});
console.log('');
result.errors.push({
text: `Private import violations detected: ${violations.length} violation(s) found`,
location: null,
notes: violations.map(v => ({
text: `${path.relative(process.cwd(), v.file)} imports ${v.importPath}`,
location: null
}))
});
}
});
}
};
}
// Plugin to guard against bad imports from #private
function dynamicImportGuardPlugin() {
return {
name: "dynamic-import-guard",
setup(build) {
const violations = [];
build.onResolve({ filter: /^#dynamic\// }, (args) => {
const importingFile = args.importer;
// Check if the importing file is NOT in server/private
const normalizedImporter = path.normalize(importingFile);
const isInServerPrivate = normalizedImporter.includes(path.normalize("server/private"));
if (isInServerPrivate) {
const violation = {
file: importingFile,
importPath: args.path,
resolveDir: args.resolveDir
};
violations.push(violation);
console.log(`DYNAMIC IMPORT VIOLATION:`);
console.log(` File: ${importingFile}`);
console.log(` Import: ${args.path}`);
console.log(` Resolve dir: ${args.resolveDir || 'N/A'}`);
console.log('');
}
// Return null to let the default resolver handle it
return null;
});
build.onEnd((result) => {
if (violations.length > 0) {
console.log(`\nSUMMARY: Found ${violations.length} dynamic import violation(s):`);
violations.forEach((v, i) => {
console.log(` ${i + 1}. ${path.relative(process.cwd(), v.file)} imports ${v.importPath}`);
});
console.log('');
result.errors.push({
text: `Dynamic import violations detected: ${violations.length} violation(s) found`,
location: null,
notes: violations.map(v => ({
text: `${path.relative(process.cwd(), v.file)} imports ${v.importPath}`,
location: null
}))
});
}
});
}
};
}
// Plugin to dynamically switch imports based on build type
function dynamicImportSwitcherPlugin(buildValue) {
return {
name: "dynamic-import-switcher",
setup(build) {
const switches = [];
build.onStart(() => {
console.log(`Dynamic import switcher using build type: ${buildValue}`);
});
build.onResolve({ filter: /^#dynamic\// }, (args) => {
// Extract the path after #dynamic/
const dynamicPath = args.path.replace(/^#dynamic\//, '');
// Determine the replacement based on build type
let replacement;
if (buildValue === "oss") {
replacement = `#open/${dynamicPath}`;
} else if (buildValue === "saas" || buildValue === "enterprise") {
replacement = `#closed/${dynamicPath}`; // We use #closed here so that the route guards dont complain after its been changed but this is the same as #private
} else {
console.warn(`Unknown build type '${buildValue}', defaulting to #open/`);
replacement = `#open/${dynamicPath}`;
}
const switchInfo = {
file: args.importer,
originalPath: args.path,
replacementPath: replacement,
buildType: buildValue
};
switches.push(switchInfo);
console.log(`DYNAMIC IMPORT SWITCH:`);
console.log(` File: ${args.importer}`);
console.log(` Original: ${args.path}`);
console.log(` Switched to: ${replacement} (build: ${buildValue})`);
console.log('');
// Rewrite the import path and let the normal resolution continue
return build.resolve(replacement, {
importer: args.importer,
namespace: args.namespace,
resolveDir: args.resolveDir,
kind: args.kind
});
});
build.onEnd((result) => {
if (switches.length > 0) {
console.log(`\nDYNAMIC IMPORT SUMMARY: Switched ${switches.length} import(s) for build type '${buildValue}':`);
switches.forEach((s, i) => {
console.log(` ${i + 1}. ${path.relative(process.cwd(), s.file)}`);
console.log(` ${s.originalPath}${s.replacementPath}`);
});
console.log('');
}
});
}
};
}
esbuild
.build({
entryPoints: [argv.entry],
bundle: true,
outfile: argv.out,
format: "esm",
minify: true,
minify: false,
banner: {
js: banner,
},
platform: "node",
external: ["body-parser"],
plugins: [
privateImportGuardPlugin(),
dynamicImportGuardPlugin(),
dynamicImportSwitcherPlugin(argv.build),
nodeExternalsPlugin({
packagePath: getPackagePaths(),
}),
],
sourcemap: true,
target: "node20",
sourcemap: "inline",
target: "node22",
})
.then(() => {
.then((result) => {
// Check if there were any errors in the build result
if (result.errors && result.errors.length > 0) {
console.error(`Build failed with ${result.errors.length} error(s):`);
result.errors.forEach((error, i) => {
console.error(`${i + 1}. ${error.text}`);
if (error.notes) {
error.notes.forEach(note => {
console.error(` - ${note.text}`);
});
}
});
// remove the output file if it was created
if (fs.existsSync(argv.out)) {
fs.unlinkSync(argv.out);
}
process.exit(1);
}
console.log("Build completed successfully");
})
.catch((error) => {

View File

@@ -1,4 +1,5 @@
all: update-versions go-build-release put-back
dev-all: dev-update-versions dev-build dev-clean
go-build-release:
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o bin/installer_linux_amd64
@@ -11,6 +12,12 @@ clean:
update-versions:
@echo "Fetching latest versions..."
cp main.go main.go.bak && \
$(MAKE) dev-update-versions
put-back:
mv main.go.bak main.go
dev-update-versions:
PANGOLIN_VERSION=$$(curl -s https://api.github.com/repos/fosrl/pangolin/tags | jq -r '.[0].name') && \
GERBIL_VERSION=$$(curl -s https://api.github.com/repos/fosrl/gerbil/tags | jq -r '.[0].name') && \
BADGER_VERSION=$$(curl -s https://api.github.com/repos/fosrl/badger/tags | jq -r '.[0].name') && \
@@ -20,5 +27,11 @@ update-versions:
sed -i "s/config.BadgerVersion = \".*\"/config.BadgerVersion = \"$$BADGER_VERSION\"/" main.go && \
echo "Updated main.go with latest versions"
put-back:
mv main.go.bak main.go
dev-build: go-build-release
dev-clean:
@echo "Restoring version values ..."
sed -i "s/config.PangolinVersion = \".*\"/config.PangolinVersion = \"replaceme\"/" main.go && \
sed -i "s/config.GerbilVersion = \".*\"/config.GerbilVersion = \"replaceme\"/" main.go && \
sed -i "s/config.BadgerVersion = \".*\"/config.BadgerVersion = \"replaceme\"/" main.go
@echo "Restored version strings in main.go"

View File

@@ -37,15 +37,28 @@ type DynamicConfig struct {
} `yaml:"http"`
}
// ConfigValues holds the extracted configuration values
type ConfigValues struct {
// TraefikConfigValues holds the extracted configuration values
type TraefikConfigValues struct {
DashboardDomain string
LetsEncryptEmail string
BadgerVersion string
}
// AppConfig represents the app section of the config.yml
type AppConfig struct {
App struct {
DashboardURL string `yaml:"dashboard_url"`
LogLevel string `yaml:"log_level"`
} `yaml:"app"`
}
type AppConfigValues struct {
DashboardURL string
LogLevel string
}
// ReadTraefikConfig reads and extracts values from Traefik configuration files
func ReadTraefikConfig(mainConfigPath, dynamicConfigPath string) (*ConfigValues, error) {
func ReadTraefikConfig(mainConfigPath string) (*TraefikConfigValues, error) {
// Read main config file
mainConfigData, err := os.ReadFile(mainConfigPath)
if err != nil {
@@ -57,48 +70,33 @@ func ReadTraefikConfig(mainConfigPath, dynamicConfigPath string) (*ConfigValues,
return nil, fmt.Errorf("error parsing main config file: %w", err)
}
// Read dynamic config file
dynamicConfigData, err := os.ReadFile(dynamicConfigPath)
if err != nil {
return nil, fmt.Errorf("error reading dynamic config file: %w", err)
}
var dynamicConfig DynamicConfig
if err := yaml.Unmarshal(dynamicConfigData, &dynamicConfig); err != nil {
return nil, fmt.Errorf("error parsing dynamic config file: %w", err)
}
// Extract values
values := &ConfigValues{
values := &TraefikConfigValues{
BadgerVersion: mainConfig.Experimental.Plugins.Badger.Version,
LetsEncryptEmail: mainConfig.CertificatesResolvers.LetsEncrypt.Acme.Email,
}
// Extract DashboardDomain from router rules
// Look for it in the main router rules
for _, router := range dynamicConfig.HTTP.Routers {
if router.Rule != "" {
// Extract domain from Host(`mydomain.com`)
if domain := extractDomainFromRule(router.Rule); domain != "" {
values.DashboardDomain = domain
break
}
}
}
return values, nil
}
// extractDomainFromRule extracts the domain from a router rule
func extractDomainFromRule(rule string) string {
// Look for the Host(`mydomain.com`) pattern
if start := findPattern(rule, "Host(`"); start != -1 {
end := findPattern(rule[start:], "`)")
if end != -1 {
return rule[start+6 : start+end]
}
func ReadAppConfig(configPath string) (*AppConfigValues, error) {
// Read config file
configData, err := os.ReadFile(configPath)
if err != nil {
return nil, fmt.Errorf("error reading config file: %w", err)
}
return ""
var appConfig AppConfig
if err := yaml.Unmarshal(configData, &appConfig); err != nil {
return nil, fmt.Errorf("error parsing config file: %w", err)
}
values := &AppConfigValues{
DashboardURL: appConfig.App.DashboardURL,
LogLevel: appConfig.App.LogLevel,
}
return values, nil
}
// findPattern finds the start of a pattern in a string

View File

@@ -1,9 +1,15 @@
# To see all available options, please visit the docs:
# https://docs.fossorial.io/Pangolin/Configuration/config
# https://docs.digpangolin.com/
gerbil:
start_port: 51820
base_endpoint: "{{.DashboardDomain}}"
app:
dashboard_url: "https://{{.DashboardDomain}}"
log_level: "info"
telemetry:
anonymous_usage: true
domains:
domain1:
@@ -17,11 +23,7 @@ server:
methods: ["GET", "POST", "PUT", "DELETE", "PATCH"]
allowed_headers: ["X-CSRF-Token", "Content-Type"]
credentials: false
gerbil:
start_port: 51820
base_endpoint: "{{.DashboardDomain}}"
{{if .EnableGeoblocking}}maxmind_db_path: "./config/GeoLite2-Country.mmdb"{{end}}
{{if .EnableEmail}}
email:
smtp_host: "{{.EmailSMTPHost}}"
@@ -30,10 +32,8 @@ email:
smtp_pass: "{{.EmailSMTPPass}}"
no_reply: "{{.EmailNoReply}}"
{{end}}
flags:
require_email_verification: {{.EnableEmail}}
disable_signup_without_invite: true
disable_user_create_org: false
allow_raw_resources: true
allow_base_domain_resources: true
allow_raw_resources: true

View File

@@ -1,6 +1,6 @@
services:
crowdsec:
image: crowdsecurity/crowdsec:latest
image: docker.io/crowdsecurity/crowdsec:latest
container_name: crowdsec
environment:
GID: "1000"

View File

@@ -22,4 +22,4 @@ filters:
decisions:
- type: ban
duration: 4h
on_success: break
on_success: break

View File

@@ -16,7 +16,7 @@ experimental:
version: "{{.BadgerVersion}}"
crowdsec: # CrowdSec plugin configuration added
moduleName: "github.com/maxlerebourg/crowdsec-bouncer-traefik-plugin"
version: "v1.4.2"
version: "v1.4.4"
log:
level: "INFO"

View File

@@ -1,7 +1,7 @@
name: pangolin
services:
pangolin:
image: fosrl/pangolin:{{.PangolinVersion}}
image: docker.io/fosrl/pangolin:{{.PangolinVersion}}
container_name: pangolin
restart: unless-stopped
volumes:
@@ -13,17 +13,16 @@ services:
retries: 15
{{if .InstallGerbil}}
gerbil:
image: fosrl/gerbil:{{.GerbilVersion}}
image: docker.io/fosrl/gerbil:{{.GerbilVersion}}
container_name: gerbil
restart: unless-stopped
depends_on:
pangolin:
condition: service_healthy
command:
- --reachableAt=http://gerbil:3003
- --reachableAt=http://gerbil:3004
- --generateAndSaveKeyTo=/var/config/key
- --remoteConfig=http://pangolin:3001/api/v1/gerbil/get-config
- --reportBandwidthTo=http://pangolin:3001/api/v1/gerbil/receive-bandwidth
- --remoteConfig=http://pangolin:3001/api/v1/
volumes:
- ./config/:/var/config
cap_add:
@@ -31,11 +30,12 @@ services:
- SYS_MODULE
ports:
- 51820:51820/udp
- 443:443 # Port for traefik because of the network_mode
- 80:80 # Port for traefik because of the network_mode
- 21820:21820/udp
- 443:443
- 80:80
{{end}}
traefik:
image: traefik:v3.4.1
image: docker.io/traefik:v3.5
container_name: traefik
restart: unless-stopped
{{if .InstallGerbil}}
@@ -59,3 +59,4 @@ networks:
default:
driver: bridge
name: pangolin
{{if .EnableIPv6}} enable_ipv6: true{{end}}

View File

@@ -46,3 +46,6 @@ entryPoints:
serversTransport:
insecureSkipVerify: true
ping:
entryPoint: "web"

332
install/containers.go Normal file
View File

@@ -0,0 +1,332 @@
package main
import (
"bytes"
"fmt"
"os"
"os/exec"
"os/user"
"runtime"
"strconv"
"strings"
"time"
)
func waitForContainer(containerName string, containerType SupportedContainer) error {
maxAttempts := 30
retryInterval := time.Second * 2
for attempt := 0; attempt < maxAttempts; attempt++ {
// Check if container is running
cmd := exec.Command(string(containerType), "container", "inspect", "-f", "{{.State.Running}}", containerName)
var out bytes.Buffer
cmd.Stdout = &out
if err := cmd.Run(); err != nil {
// If the container doesn't exist or there's another error, wait and retry
time.Sleep(retryInterval)
continue
}
isRunning := strings.TrimSpace(out.String()) == "true"
if isRunning {
return nil
}
// Container exists but isn't running yet, wait and retry
time.Sleep(retryInterval)
}
return fmt.Errorf("container %s did not start within %v seconds", containerName, maxAttempts*int(retryInterval.Seconds()))
}
func installDocker() error {
// Detect Linux distribution
cmd := exec.Command("cat", "/etc/os-release")
output, err := cmd.Output()
if err != nil {
return fmt.Errorf("failed to detect Linux distribution: %v", err)
}
osRelease := string(output)
// Detect system architecture
archCmd := exec.Command("uname", "-m")
archOutput, err := archCmd.Output()
if err != nil {
return fmt.Errorf("failed to detect system architecture: %v", err)
}
arch := strings.TrimSpace(string(archOutput))
// Map architecture to Docker's architecture naming
var dockerArch string
switch arch {
case "x86_64":
dockerArch = "amd64"
case "aarch64":
dockerArch = "arm64"
default:
return fmt.Errorf("unsupported architecture: %s", arch)
}
var installCmd *exec.Cmd
switch {
case strings.Contains(osRelease, "ID=ubuntu"):
installCmd = exec.Command("bash", "-c", fmt.Sprintf(`
apt-get update &&
apt-get install -y apt-transport-https ca-certificates curl software-properties-common &&
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg &&
echo "deb [arch=%s signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" > /etc/apt/sources.list.d/docker.list &&
apt-get update &&
apt-get install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
`, dockerArch))
case strings.Contains(osRelease, "ID=debian"):
installCmd = exec.Command("bash", "-c", fmt.Sprintf(`
apt-get update &&
apt-get install -y apt-transport-https ca-certificates curl software-properties-common &&
curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg &&
echo "deb [arch=%s signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian $(lsb_release -cs) stable" > /etc/apt/sources.list.d/docker.list &&
apt-get update &&
apt-get install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
`, dockerArch))
case strings.Contains(osRelease, "ID=fedora"):
// Detect Fedora version to handle DNF 5 changes
versionCmd := exec.Command("bash", "-c", "grep VERSION_ID /etc/os-release | cut -d'=' -f2 | tr -d '\"'")
versionOutput, err := versionCmd.Output()
var fedoraVersion int
if err == nil {
if v, parseErr := strconv.Atoi(strings.TrimSpace(string(versionOutput))); parseErr == nil {
fedoraVersion = v
}
}
// Use appropriate DNF syntax based on version
var repoCmd string
if fedoraVersion >= 41 {
// DNF 5 syntax for Fedora 41+
repoCmd = "dnf config-manager addrepo --from-repofile=https://download.docker.com/linux/fedora/docker-ce.repo"
} else {
// DNF 4 syntax for Fedora < 41
repoCmd = "dnf config-manager --add-repo https://download.docker.com/linux/fedora/docker-ce.repo"
}
installCmd = exec.Command("bash", "-c", fmt.Sprintf(`
dnf -y install dnf-plugins-core &&
%s &&
dnf install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
`, repoCmd))
case strings.Contains(osRelease, "ID=opensuse") || strings.Contains(osRelease, "ID=\"opensuse-"):
installCmd = exec.Command("bash", "-c", `
zypper install -y docker docker-compose &&
systemctl enable docker
`)
case strings.Contains(osRelease, "ID=rhel") || strings.Contains(osRelease, "ID=\"rhel"):
installCmd = exec.Command("bash", "-c", `
dnf remove -y runc &&
dnf -y install yum-utils &&
dnf config-manager --add-repo https://download.docker.com/linux/rhel/docker-ce.repo &&
dnf install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin &&
systemctl enable docker
`)
case strings.Contains(osRelease, "ID=amzn"):
installCmd = exec.Command("bash", "-c", `
yum update -y &&
yum install -y docker &&
systemctl enable docker &&
usermod -a -G docker ec2-user
`)
default:
return fmt.Errorf("unsupported Linux distribution")
}
installCmd.Stdout = os.Stdout
installCmd.Stderr = os.Stderr
return installCmd.Run()
}
func startDockerService() error {
if runtime.GOOS == "linux" {
cmd := exec.Command("systemctl", "enable", "--now", "docker")
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
return cmd.Run()
} else if runtime.GOOS == "darwin" {
// On macOS, Docker is usually started via the Docker Desktop application
fmt.Println("Please start Docker Desktop manually on macOS.")
return nil
}
return fmt.Errorf("unsupported operating system for starting Docker service")
}
func isDockerInstalled() bool {
return isContainerInstalled("docker")
}
func isPodmanInstalled() bool {
return isContainerInstalled("podman") && isContainerInstalled("podman-compose")
}
func isContainerInstalled(container string) bool {
cmd := exec.Command(container, "--version")
if err := cmd.Run(); err != nil {
return false
}
return true
}
func isUserInDockerGroup() bool {
if runtime.GOOS == "darwin" {
// Docker group is not applicable on macOS
// So we assume that the user can run Docker commands
return true
}
if os.Geteuid() == 0 {
return true // Root user can run Docker commands anyway
}
// Check if the current user is in the docker group
if dockerGroup, err := user.LookupGroup("docker"); err == nil {
if currentUser, err := user.Current(); err == nil {
if currentUserGroupIds, err := currentUser.GroupIds(); err == nil {
for _, groupId := range currentUserGroupIds {
if groupId == dockerGroup.Gid {
return true
}
}
}
}
}
// Eventually, if any of the checks fail, we assume the user cannot run Docker commands
return false
}
// isDockerRunning checks if the Docker daemon is running by using the `docker info` command.
func isDockerRunning() bool {
cmd := exec.Command("docker", "info")
if err := cmd.Run(); err != nil {
return false
}
return true
}
// executeDockerComposeCommandWithArgs executes the appropriate docker command with arguments supplied
func executeDockerComposeCommandWithArgs(args ...string) error {
var cmd *exec.Cmd
var useNewStyle bool
if !isDockerInstalled() {
return fmt.Errorf("docker is not installed")
}
checkCmd := exec.Command("docker", "compose", "version")
if err := checkCmd.Run(); err == nil {
useNewStyle = true
} else {
checkCmd = exec.Command("docker-compose", "version")
if err := checkCmd.Run(); err == nil {
useNewStyle = false
} else {
return fmt.Errorf("neither 'docker compose' nor 'docker-compose' command is available")
}
}
if useNewStyle {
cmd = exec.Command("docker", append([]string{"compose"}, args...)...)
} else {
cmd = exec.Command("docker-compose", args...)
}
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
return cmd.Run()
}
// pullContainers pulls the containers using the appropriate command.
func pullContainers(containerType SupportedContainer) error {
fmt.Println("Pulling the container images...")
if containerType == Podman {
if err := run("podman-compose", "-f", "docker-compose.yml", "pull"); err != nil {
return fmt.Errorf("failed to pull the containers: %v", err)
}
return nil
}
if containerType == Docker {
if err := executeDockerComposeCommandWithArgs("-f", "docker-compose.yml", "pull", "--policy", "always"); err != nil {
return fmt.Errorf("failed to pull the containers: %v", err)
}
return nil
}
return fmt.Errorf("Unsupported container type: %s", containerType)
}
// startContainers starts the containers using the appropriate command.
func startContainers(containerType SupportedContainer) error {
fmt.Println("Starting containers...")
if containerType == Podman {
if err := run("podman-compose", "-f", "docker-compose.yml", "up", "-d", "--force-recreate"); err != nil {
return fmt.Errorf("failed start containers: %v", err)
}
return nil
}
if containerType == Docker {
if err := executeDockerComposeCommandWithArgs("-f", "docker-compose.yml", "up", "-d", "--force-recreate"); err != nil {
return fmt.Errorf("failed to start containers: %v", err)
}
return nil
}
return fmt.Errorf("Unsupported container type: %s", containerType)
}
// stopContainers stops the containers using the appropriate command.
func stopContainers(containerType SupportedContainer) error {
fmt.Println("Stopping containers...")
if containerType == Podman {
if err := run("podman-compose", "-f", "docker-compose.yml", "down"); err != nil {
return fmt.Errorf("failed to stop containers: %v", err)
}
return nil
}
if containerType == Docker {
if err := executeDockerComposeCommandWithArgs("-f", "docker-compose.yml", "down"); err != nil {
return fmt.Errorf("failed to stop containers: %v", err)
}
return nil
}
return fmt.Errorf("Unsupported container type: %s", containerType)
}
// restartContainer restarts a specific container using the appropriate command.
func restartContainer(container string, containerType SupportedContainer) error {
fmt.Println("Restarting containers...")
if containerType == Podman {
if err := run("podman-compose", "-f", "docker-compose.yml", "restart"); err != nil {
return fmt.Errorf("failed to stop the container \"%s\": %v", container, err)
}
return nil
}
if containerType == Docker {
if err := executeDockerComposeCommandWithArgs("-f", "docker-compose.yml", "restart", container); err != nil {
return fmt.Errorf("failed to stop the container \"%s\": %v", container, err)
}
return nil
}
return fmt.Errorf("Unsupported container type: %s", containerType)
}

View File

@@ -13,7 +13,7 @@ import (
func installCrowdsec(config Config) error {
if err := stopContainers(); err != nil {
if err := stopContainers(config.InstallationContainerType); err != nil {
return fmt.Errorf("failed to stop containers: %v", err)
}
@@ -72,12 +72,12 @@ func installCrowdsec(config Config) error {
os.Exit(1)
}
if err := startContainers(); err != nil {
if err := startContainers(config.InstallationContainerType); err != nil {
return fmt.Errorf("failed to start containers: %v", err)
}
// get API key
apiKey, err := GetCrowdSecAPIKey()
apiKey, err := GetCrowdSecAPIKey(config.InstallationContainerType)
if err != nil {
return fmt.Errorf("failed to get API key: %v", err)
}
@@ -87,7 +87,7 @@ func installCrowdsec(config Config) error {
return fmt.Errorf("failed to replace bouncer key: %v", err)
}
if err := restartContainer("traefik"); err != nil {
if err := restartContainer("traefik", config.InstallationContainerType); err != nil {
return fmt.Errorf("failed to restart containers: %v", err)
}
@@ -110,9 +110,9 @@ func checkIsCrowdsecInstalledInCompose() bool {
return bytes.Contains(content, []byte("crowdsec:"))
}
func GetCrowdSecAPIKey() (string, error) {
func GetCrowdSecAPIKey(containerType SupportedContainer) (string, error) {
// First, ensure the container is running
if err := waitForContainer("crowdsec"); err != nil {
if err := waitForContainer("crowdsec", containerType); err != nil {
return "", fmt.Errorf("waiting for container: %w", err)
}

180
install/get-installer.sh Normal file
View File

@@ -0,0 +1,180 @@
#!/bin/bash
# Get installer - Cross-platform installation script
# Usage: curl -fsSL https://raw.githubusercontent.com/fosrl/installer/refs/heads/main/get-installer.sh | bash
set -e
# Colors for output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color
# GitHub repository info
REPO="fosrl/pangolin"
GITHUB_API_URL="https://api.github.com/repos/${REPO}/releases/latest"
# Function to print colored output
print_status() {
echo -e "${GREEN}[INFO]${NC} $1"
}
print_warning() {
echo -e "${YELLOW}[WARN]${NC} $1"
}
print_error() {
echo -e "${RED}[ERROR]${NC} $1"
}
# Function to get latest version from GitHub API
get_latest_version() {
local latest_info
if command -v curl >/dev/null 2>&1; then
latest_info=$(curl -fsSL "$GITHUB_API_URL" 2>/dev/null)
elif command -v wget >/dev/null 2>&1; then
latest_info=$(wget -qO- "$GITHUB_API_URL" 2>/dev/null)
else
print_error "Neither curl nor wget is available. Please install one of them." >&2
exit 1
fi
if [ -z "$latest_info" ]; then
print_error "Failed to fetch latest version information" >&2
exit 1
fi
# Extract version from JSON response (works without jq)
local version=$(echo "$latest_info" | grep '"tag_name"' | head -1 | sed 's/.*"tag_name": *"\([^"]*\)".*/\1/')
if [ -z "$version" ]; then
print_error "Could not parse version from GitHub API response" >&2
exit 1
fi
# Remove 'v' prefix if present
version=$(echo "$version" | sed 's/^v//')
echo "$version"
}
# Detect OS and architecture
detect_platform() {
local os arch
# Detect OS - only support Linux
case "$(uname -s)" in
Linux*) os="linux" ;;
*)
print_error "Unsupported operating system: $(uname -s). Only Linux is supported."
exit 1
;;
esac
# Detect architecture - only support amd64 and arm64
case "$(uname -m)" in
x86_64|amd64) arch="amd64" ;;
arm64|aarch64) arch="arm64" ;;
*)
print_error "Unsupported architecture: $(uname -m). Only amd64 and arm64 are supported on Linux."
exit 1
;;
esac
echo "${os}_${arch}"
}
# Get installation directory
get_install_dir() {
# Install to the current directory
local install_dir="$(pwd)"
if [ ! -d "$install_dir" ]; then
print_error "Installation directory does not exist: $install_dir"
exit 1
fi
echo "$install_dir"
}
# Download and install installer
install_installer() {
local platform="$1"
local install_dir="$2"
local binary_name="installer_${platform}"
local download_url="${BASE_URL}/${binary_name}"
local temp_file="/tmp/installer"
local final_path="${install_dir}/installer"
print_status "Downloading installer from ${download_url}"
# Download the binary
if command -v curl >/dev/null 2>&1; then
curl -fsSL "$download_url" -o "$temp_file"
elif command -v wget >/dev/null 2>&1; then
wget -q "$download_url" -O "$temp_file"
else
print_error "Neither curl nor wget is available. Please install one of them."
exit 1
fi
# Create install directory if it doesn't exist
mkdir -p "$install_dir"
# Move binary to install directory
mv "$temp_file" "$final_path"
# Make executable
chmod +x "$final_path"
print_status "Installer downloaded to ${final_path}"
}
# Verify installation
verify_installation() {
local install_dir="$1"
local installer_path="${install_dir}/installer"
if [ -f "$installer_path" ] && [ -x "$installer_path" ]; then
print_status "Installation successful!"
return 0
else
print_error "Installation failed. Binary not found or not executable."
return 1
fi
}
# Main installation process
main() {
print_status "Installing latest version of installer..."
# Get latest version
print_status "Fetching latest version from GitHub..."
VERSION=$(get_latest_version)
print_status "Latest version: v${VERSION}"
# Set base URL with the fetched version
BASE_URL="https://github.com/${REPO}/releases/download/${VERSION}"
# Detect platform
PLATFORM=$(detect_platform)
print_status "Detected platform: ${PLATFORM}"
# Get install directory
INSTALL_DIR=$(get_install_dir)
print_status "Install directory: ${INSTALL_DIR}"
# Install installer
install_installer "$PLATFORM" "$INSTALL_DIR"
# Verify installation
if verify_installation "$INSTALL_DIR"; then
print_status "Installer is ready to use!"
else
exit 1
fi
}
# Run main function
main "$@"

View File

@@ -1,10 +1,10 @@
module installer
go 1.23.0
go 1.24.0
require (
golang.org/x/term v0.28.0
golang.org/x/term v0.36.0
gopkg.in/yaml.v3 v3.0.1
)
require golang.org/x/sys v0.29.0 // indirect
require golang.org/x/sys v0.37.0 // indirect

View File

@@ -1,7 +1,7 @@
golang.org/x/sys v0.29.0 h1:TPYlXGxvx1MGTn2GiZDhnjPA9wZzZeGKHHmKhHYvgaU=
golang.org/x/sys v0.29.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/term v0.28.0 h1:/Ts8HFuMR2E6IP/jlo7QVLZHggjKQbhu/7H0LJFr3Gg=
golang.org/x/term v0.28.0/go.mod h1:Sw/lC2IAUZ92udQNf3WodGtn4k/XoLyZoh8v/8uiwek=
golang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ=
golang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
golang.org/x/term v0.36.0 h1:zMPR+aF8gfksFprF/Nc/rd1wRS1EI6nDBGyWAvDzx2Q=
golang.org/x/term v0.36.0/go.mod h1:Qu394IJq6V6dCBRgwqshf3mPF85AqzYEzofzRdZkWss=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=

74
install/input.go Normal file
View File

@@ -0,0 +1,74 @@
package main
import (
"bufio"
"fmt"
"strings"
"syscall"
"golang.org/x/term"
)
func readString(reader *bufio.Reader, prompt string, defaultValue string) string {
if defaultValue != "" {
fmt.Printf("%s (default: %s): ", prompt, defaultValue)
} else {
fmt.Print(prompt + ": ")
}
input, _ := reader.ReadString('\n')
input = strings.TrimSpace(input)
if input == "" {
return defaultValue
}
return input
}
func readStringNoDefault(reader *bufio.Reader, prompt string) string {
fmt.Print(prompt + ": ")
input, _ := reader.ReadString('\n')
return strings.TrimSpace(input)
}
func readPassword(prompt string, reader *bufio.Reader) string {
if term.IsTerminal(int(syscall.Stdin)) {
fmt.Print(prompt + ": ")
// Read password without echo if we're in a terminal
password, err := term.ReadPassword(int(syscall.Stdin))
fmt.Println() // Add a newline since ReadPassword doesn't add one
if err != nil {
return ""
}
input := strings.TrimSpace(string(password))
if input == "" {
return readPassword(prompt, reader)
}
return input
} else {
// Fallback to reading from stdin if not in a terminal
return readString(reader, prompt, "")
}
}
func readBool(reader *bufio.Reader, prompt string, defaultValue bool) bool {
defaultStr := "no"
if defaultValue {
defaultStr = "yes"
}
input := readString(reader, prompt+" (yes/no)", defaultStr)
return strings.ToLower(input) == "yes"
}
func readBoolNoDefault(reader *bufio.Reader, prompt string) bool {
input := readStringNoDefault(reader, prompt+" (yes/no)")
return strings.ToLower(input) == "yes"
}
func readInt(reader *bufio.Reader, prompt string, defaultValue int) int {
input := readString(reader, prompt, fmt.Sprintf("%d", defaultValue))
if input == "" {
return defaultValue
}
value := defaultValue
fmt.Sscanf(input, "%d", &value)
return value
}

View File

@@ -1,5 +1,7 @@
docker
example.com
pangolin.example.com
yes
admin@example.com
yes
admin@example.com

View File

@@ -2,24 +2,21 @@ package main
import (
"bufio"
"bytes"
"embed"
"fmt"
"io"
"io/fs"
"math/rand"
"net"
"net/http"
"net/url"
"os"
"os/exec"
"os/user"
"path/filepath"
"runtime"
"strings"
"syscall"
"text/template"
"time"
"math/rand"
"strconv"
"golang.org/x/term"
)
// DO NOT EDIT THIS FUNCTION; IT MATCHED BY REGEX IN CICD
@@ -33,43 +30,60 @@ func loadVersions(config *Config) {
var configFiles embed.FS
type Config struct {
PangolinVersion string
GerbilVersion string
BadgerVersion string
BaseDomain string
DashboardDomain string
LetsEncryptEmail string
EnableEmail bool
EmailSMTPHost string
EmailSMTPPort int
EmailSMTPUser string
EmailSMTPPass string
EmailNoReply string
InstallGerbil bool
TraefikBouncerKey string
DoCrowdsecInstall bool
Secret string
InstallationContainerType SupportedContainer
PangolinVersion string
GerbilVersion string
BadgerVersion string
BaseDomain string
DashboardDomain string
EnableIPv6 bool
LetsEncryptEmail string
EnableEmail bool
EmailSMTPHost string
EmailSMTPPort int
EmailSMTPUser string
EmailSMTPPass string
EmailNoReply string
InstallGerbil bool
TraefikBouncerKey string
DoCrowdsecInstall bool
EnableGeoblocking bool
Secret string
}
func main() {
reader := bufio.NewReader(os.Stdin)
type SupportedContainer string
// check if docker is not installed and the user is root
if !isDockerInstalled() {
if os.Geteuid() != 0 {
fmt.Println("Docker is not installed. Please install Docker manually or run this installer as root.")
os.Exit(1)
const (
Docker SupportedContainer = "docker"
Podman SupportedContainer = "podman"
Undefined SupportedContainer = "undefined"
)
func main() {
// print a banner about prerequisites - opening port 80, 443, 51820, and 21820 on the VPS and firewall and pointing your domain to the VPS IP with a records. Docs are at http://localhost:3000/Getting%20Started/dns-networking
fmt.Println("Welcome to the Pangolin installer!")
fmt.Println("This installer will help you set up Pangolin on your server.")
fmt.Println("\nPlease make sure you have the following prerequisites:")
fmt.Println("- Open TCP ports 80 and 443 and UDP ports 51820 and 21820 on your VPS and firewall.")
fmt.Println("\nLets get started!")
if os.Geteuid() == 0 { // WE NEED TO BE SUDO TO CHECK THIS
for _, p := range []int{80, 443} {
if err := checkPortsAvailable(p); err != nil {
fmt.Fprintln(os.Stderr, err)
fmt.Printf("Please close any services on ports 80/443 in order to run the installation smoothly. If you already have the Pangolin stack running, shut them down before proceeding.\n")
os.Exit(1)
}
}
}
// check if the user is in the docker group (linux only)
if !isUserInDockerGroup() {
fmt.Println("You are not in the docker group.")
fmt.Println("The installer will not be able to run docker commands without running it as root.")
os.Exit(1)
}
reader := bufio.NewReader(os.Stdin)
var config Config
var alreadyInstalled = false
// check if there is already a config file
if _, err := os.Stat("config/config.yml"); err != nil {
@@ -79,6 +93,8 @@ func main() {
config.DoCrowdsecInstall = false
config.Secret = generateRandomSecretKey()
fmt.Println("\n=== Generating Configuration Files ===")
if err := createConfigFiles(config); err != nil {
fmt.Printf("Error creating config files: %v\n", err)
os.Exit(1)
@@ -86,50 +102,89 @@ func main() {
moveFile("config/docker-compose.yml", "docker-compose.yml")
if !isDockerInstalled() && runtime.GOOS == "linux" {
if readBool(reader, "Docker is not installed. Would you like to install it?", true) {
installDocker()
// try to start docker service but ignore errors
if err := startDockerService(); err != nil {
fmt.Println("Error starting Docker service:", err)
} else {
fmt.Println("Docker service started successfully!")
}
// wait 10 seconds for docker to start checking if docker is running every 2 seconds
fmt.Println("Waiting for Docker to start...")
for i := 0; i < 5; i++ {
if isDockerRunning() {
fmt.Println("Docker is running!")
break
}
fmt.Println("Docker is not running yet, waiting...")
time.Sleep(2 * time.Second)
}
if !isDockerRunning() {
fmt.Println("Docker is still not running after 10 seconds. Please check the installation.")
os.Exit(1)
}
fmt.Println("Docker installed successfully!")
fmt.Println("\nConfiguration files created successfully!")
// Download MaxMind database if requested
if config.EnableGeoblocking {
fmt.Println("\n=== Downloading MaxMind Database ===")
if err := downloadMaxMindDatabase(); err != nil {
fmt.Printf("Error downloading MaxMind database: %v\n", err)
fmt.Println("You can download it manually later if needed.")
}
}
fmt.Println("\n=== Starting installation ===")
if isDockerInstalled() {
if readBool(reader, "Would you like to install and start the containers?", true) {
if err := pullContainers(); err != nil {
fmt.Println("Error: ", err)
return
}
if readBool(reader, "Would you like to install and start the containers?", true) {
if err := startContainers(); err != nil {
fmt.Println("Error: ", err)
return
config.InstallationContainerType = podmanOrDocker(reader)
if !isDockerInstalled() && runtime.GOOS == "linux" && config.InstallationContainerType == Docker {
if readBool(reader, "Docker is not installed. Would you like to install it?", true) {
installDocker()
// try to start docker service but ignore errors
if err := startDockerService(); err != nil {
fmt.Println("Error starting Docker service:", err)
} else {
fmt.Println("Docker service started successfully!")
}
// wait 10 seconds for docker to start checking if docker is running every 2 seconds
fmt.Println("Waiting for Docker to start...")
for i := 0; i < 5; i++ {
if isDockerRunning() {
fmt.Println("Docker is running!")
break
}
fmt.Println("Docker is not running yet, waiting...")
time.Sleep(2 * time.Second)
}
if !isDockerRunning() {
fmt.Println("Docker is still not running after 10 seconds. Please check the installation.")
os.Exit(1)
}
fmt.Println("Docker installed successfully!")
}
}
if err := pullContainers(config.InstallationContainerType); err != nil {
fmt.Println("Error: ", err)
return
}
if err := startContainers(config.InstallationContainerType); err != nil {
fmt.Println("Error: ", err)
return
}
}
} else {
fmt.Println("Looks like you already installed, so I am going to do the setup...")
alreadyInstalled = true
fmt.Println("Looks like you already installed Pangolin!")
// Check if MaxMind database exists and offer to update it
fmt.Println("\n=== MaxMind Database Update ===")
if _, err := os.Stat("config/GeoLite2-Country.mmdb"); err == nil {
fmt.Println("MaxMind GeoLite2 Country database found.")
if readBool(reader, "Would you like to update the MaxMind database to the latest version?", false) {
if err := downloadMaxMindDatabase(); err != nil {
fmt.Printf("Error updating MaxMind database: %v\n", err)
fmt.Println("You can try updating it manually later if needed.")
}
}
} else {
fmt.Println("MaxMind GeoLite2 Country database not found.")
if readBool(reader, "Would you like to download the MaxMind GeoLite2 database for geoblocking functionality?", false) {
if err := downloadMaxMindDatabase(); err != nil {
fmt.Printf("Error downloading MaxMind database: %v\n", err)
fmt.Println("You can try downloading it manually later if needed.")
}
// Now you need to update your config file accordingly to enable geoblocking
fmt.Println("Please remember to update your config/config.yml file to enable geoblocking! \n")
// add maxmind_db_path: "./config/GeoLite2-Country.mmdb" under server
fmt.Println("Add the following line under the 'server' section:")
fmt.Println(" maxmind_db_path: \"./config/GeoLite2-Country.mmdb\"")
}
}
}
if !checkIsCrowdsecInstalledInCompose() {
@@ -137,14 +192,28 @@ func main() {
// check if crowdsec is installed
if readBool(reader, "Would you like to install CrowdSec?", false) {
fmt.Println("This installer constitutes a minimal viable CrowdSec deployment. CrowdSec will add extra complexity to your Pangolin installation and may not work to the best of its abilities out of the box. Users are expected to implement configuration adjustments on their own to achieve the best security posture. Consult the CrowdSec documentation for detailed configuration instructions.")
// BUG: crowdsec installation will be skipped if the user chooses to install on the first installation.
if readBool(reader, "Are you willing to manage CrowdSec?", false) {
if config.DashboardDomain == "" {
traefikConfig, err := ReadTraefikConfig("config/traefik/traefik_config.yml", "config/traefik/dynamic_config.yml")
traefikConfig, err := ReadTraefikConfig("config/traefik/traefik_config.yml")
if err != nil {
fmt.Printf("Error reading config: %v\n", err)
return
}
config.DashboardDomain = traefikConfig.DashboardDomain
appConfig, err := ReadAppConfig("config/config.yml")
if err != nil {
fmt.Printf("Error reading config: %v\n", err)
return
}
parsedURL, err := url.Parse(appConfig.DashboardURL)
if err != nil {
fmt.Printf("Error parsing URL: %v\n", err)
return
}
config.DashboardDomain = parsedURL.Hostname()
config.LetsEncryptEmail = traefikConfig.LetsEncryptEmail
config.BadgerVersion = traefikConfig.BadgerVersion
@@ -159,67 +228,110 @@ func main() {
}
}
config.InstallationContainerType = podmanOrDocker(reader)
config.DoCrowdsecInstall = true
installCrowdsec(config)
err := installCrowdsec(config)
if err != nil {
fmt.Printf("Error installing CrowdSec: %v\n", err)
return
}
fmt.Println("CrowdSec installed successfully!")
return
}
}
}
fmt.Println("Installation complete!")
if !alreadyInstalled {
// Setup Token Section
fmt.Println("\n=== Setup Token ===")
// Check if containers were started during this installation
containersStarted := false
if (isDockerInstalled() && config.InstallationContainerType == Docker) ||
(isPodmanInstalled() && config.InstallationContainerType == Podman) {
// Try to fetch and display the token if containers are running
containersStarted = true
printSetupToken(config.InstallationContainerType, config.DashboardDomain)
}
// If containers weren't started or token wasn't found, show instructions
if !containersStarted {
showSetupTokenInstructions(config.InstallationContainerType, config.DashboardDomain)
}
}
fmt.Println("\nInstallation complete!")
fmt.Printf("\nTo complete the initial setup, please visit:\nhttps://%s/auth/initial-setup\n", config.DashboardDomain)
}
func readString(reader *bufio.Reader, prompt string, defaultValue string) string {
if defaultValue != "" {
fmt.Printf("%s (default: %s): ", prompt, defaultValue)
func podmanOrDocker(reader *bufio.Reader) SupportedContainer {
inputContainer := readString(reader, "Would you like to run Pangolin as Docker or Podman containers?", "docker")
chosenContainer := Docker
if strings.EqualFold(inputContainer, "docker") {
chosenContainer = Docker
} else if strings.EqualFold(inputContainer, "podman") {
chosenContainer = Podman
} else {
fmt.Print(prompt + ": ")
fmt.Printf("Unrecognized container type: %s. Valid options are 'docker' or 'podman'.\n", inputContainer)
os.Exit(1)
}
input, _ := reader.ReadString('\n')
input = strings.TrimSpace(input)
if input == "" {
return defaultValue
}
return input
}
func readPassword(prompt string, reader *bufio.Reader) string {
if term.IsTerminal(int(syscall.Stdin)) {
fmt.Print(prompt + ": ")
// Read password without echo if we're in a terminal
password, err := term.ReadPassword(int(syscall.Stdin))
fmt.Println() // Add a newline since ReadPassword doesn't add one
if err != nil {
return ""
if chosenContainer == Podman {
if !isPodmanInstalled() {
fmt.Println("Podman or podman-compose is not installed. Please install both manually. Automated installation will be available in a later release.")
os.Exit(1)
}
input := strings.TrimSpace(string(password))
if input == "" {
return readPassword(prompt, reader)
if err := exec.Command("bash", "-c", "cat /etc/sysctl.conf | grep 'net.ipv4.ip_unprivileged_port_start='").Run(); err != nil {
fmt.Println("Would you like to configure ports >= 80 as unprivileged ports? This enables podman containers to listen on low-range ports.")
fmt.Println("Pangolin will experience startup issues if this is not configured, because it needs to listen on port 80/443 by default.")
approved := readBool(reader, "The installer is about to execute \"echo 'net.ipv4.ip_unprivileged_port_start=80' >> /etc/sysctl.conf && sysctl -p\". Approve?", true)
if approved {
if os.Geteuid() != 0 {
fmt.Println("You need to run the installer as root for such a configuration.")
os.Exit(1)
}
// Podman containers are not able to listen on privileged ports. The official recommendation is to
// container low-range ports as unprivileged ports.
// Linux only.
if err := run("bash", "-c", "echo 'net.ipv4.ip_unprivileged_port_start=80' >> /etc/sysctl.conf && sysctl -p"); err != nil {
fmt.Sprintf("failed to configure unprivileged ports: %v.\n", err)
os.Exit(1)
}
} else {
fmt.Println("You need to configure port forwarding or adjust the listening ports before running pangolin.")
}
} else {
fmt.Println("Unprivileged ports have been configured.")
}
} else if chosenContainer == Docker {
// check if docker is not installed and the user is root
if !isDockerInstalled() {
if os.Geteuid() != 0 {
fmt.Println("Docker is not installed. Please install Docker manually or run this installer as root.")
os.Exit(1)
}
}
// check if the user is in the docker group (linux only)
if !isUserInDockerGroup() {
fmt.Println("You are not in the docker group.")
fmt.Println("The installer will not be able to run docker commands without running it as root.")
os.Exit(1)
}
return input
} else {
// Fallback to reading from stdin if not in a terminal
return readString(reader, prompt, "")
// This shouldn't happen unless there's a third container runtime.
os.Exit(1)
}
}
func readBool(reader *bufio.Reader, prompt string, defaultValue bool) bool {
defaultStr := "no"
if defaultValue {
defaultStr = "yes"
}
input := readString(reader, prompt+" (yes/no)", defaultStr)
return strings.ToLower(input) == "yes"
}
func readInt(reader *bufio.Reader, prompt string, defaultValue int) int {
input := readString(reader, prompt, fmt.Sprintf("%d", defaultValue))
if input == "" {
return defaultValue
}
value := defaultValue
fmt.Sscanf(input, "%d", &value)
return value
return chosenContainer
}
func collectUserInput(reader *bufio.Reader) Config {
@@ -227,8 +339,15 @@ func collectUserInput(reader *bufio.Reader) Config {
// Basic configuration
fmt.Println("\n=== Basic Configuration ===")
config.BaseDomain = readString(reader, "Enter your base domain (no subdomain e.g. example.com)", "")
config.DashboardDomain = readString(reader, "Enter the domain for the Pangolin dashboard", "pangolin."+config.BaseDomain)
// Set default dashboard domain after base domain is collected
defaultDashboardDomain := ""
if config.BaseDomain != "" {
defaultDashboardDomain = "pangolin." + config.BaseDomain
}
config.DashboardDomain = readString(reader, "Enter the domain for the Pangolin dashboard", defaultDashboardDomain)
config.LetsEncryptEmail = readString(reader, "Enter email for Let's Encrypt certificates", "")
config.InstallGerbil = readBool(reader, "Do you want to use Gerbil to allow tunneled connections", true)
@@ -240,7 +359,7 @@ func collectUserInput(reader *bufio.Reader) Config {
config.EmailSMTPHost = readString(reader, "Enter SMTP host", "")
config.EmailSMTPPort = readInt(reader, "Enter SMTP port (default 587)", 587)
config.EmailSMTPUser = readString(reader, "Enter SMTP username", "")
config.EmailSMTPPass = readString(reader, "Enter SMTP password", "")
config.EmailSMTPPass = readString(reader, "Enter SMTP password", "") // Should this be readPassword?
config.EmailNoReply = readString(reader, "Enter no-reply email address", "")
}
@@ -249,15 +368,23 @@ func collectUserInput(reader *bufio.Reader) Config {
fmt.Println("Error: Domain name is required")
os.Exit(1)
}
if config.DashboardDomain == "" {
fmt.Println("Error: Dashboard Domain name is required")
os.Exit(1)
}
if config.LetsEncryptEmail == "" {
fmt.Println("Error: Let's Encrypt email is required")
os.Exit(1)
}
// Advanced configuration
fmt.Println("\n=== Advanced Configuration ===")
config.EnableIPv6 = readBool(reader, "Is your server IPv6 capable?", true)
config.EnableGeoblocking = readBool(reader, "Do you want to download the MaxMind GeoLite2 database for geoblocking functionality?", false)
if config.DashboardDomain == "" {
fmt.Println("Error: Dashboard Domain name is required")
os.Exit(1)
}
return config
}
@@ -330,7 +457,6 @@ func createConfigFiles(config Config) error {
return nil
})
if err != nil {
return fmt.Errorf("error walking config files: %v", err)
}
@@ -338,243 +464,6 @@ func createConfigFiles(config Config) error {
return nil
}
func installDocker() error {
// Detect Linux distribution
cmd := exec.Command("cat", "/etc/os-release")
output, err := cmd.Output()
if err != nil {
return fmt.Errorf("failed to detect Linux distribution: %v", err)
}
osRelease := string(output)
// Detect system architecture
archCmd := exec.Command("uname", "-m")
archOutput, err := archCmd.Output()
if err != nil {
return fmt.Errorf("failed to detect system architecture: %v", err)
}
arch := strings.TrimSpace(string(archOutput))
// Map architecture to Docker's architecture naming
var dockerArch string
switch arch {
case "x86_64":
dockerArch = "amd64"
case "aarch64":
dockerArch = "arm64"
default:
return fmt.Errorf("unsupported architecture: %s", arch)
}
var installCmd *exec.Cmd
switch {
case strings.Contains(osRelease, "ID=ubuntu"):
installCmd = exec.Command("bash", "-c", fmt.Sprintf(`
apt-get update &&
apt-get install -y apt-transport-https ca-certificates curl software-properties-common &&
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg &&
echo "deb [arch=%s signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" > /etc/apt/sources.list.d/docker.list &&
apt-get update &&
apt-get install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
`, dockerArch))
case strings.Contains(osRelease, "ID=debian"):
installCmd = exec.Command("bash", "-c", fmt.Sprintf(`
apt-get update &&
apt-get install -y apt-transport-https ca-certificates curl software-properties-common &&
curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg &&
echo "deb [arch=%s signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian $(lsb_release -cs) stable" > /etc/apt/sources.list.d/docker.list &&
apt-get update &&
apt-get install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
`, dockerArch))
case strings.Contains(osRelease, "ID=fedora"):
// Detect Fedora version to handle DNF 5 changes
versionCmd := exec.Command("bash", "-c", "grep VERSION_ID /etc/os-release | cut -d'=' -f2 | tr -d '\"'")
versionOutput, err := versionCmd.Output()
var fedoraVersion int
if err == nil {
if v, parseErr := strconv.Atoi(strings.TrimSpace(string(versionOutput))); parseErr == nil {
fedoraVersion = v
}
}
// Use appropriate DNF syntax based on version
var repoCmd string
if fedoraVersion >= 41 {
// DNF 5 syntax for Fedora 41+
repoCmd = "dnf config-manager addrepo --from-repofile=https://download.docker.com/linux/fedora/docker-ce.repo"
} else {
// DNF 4 syntax for Fedora < 41
repoCmd = "dnf config-manager --add-repo https://download.docker.com/linux/fedora/docker-ce.repo"
}
installCmd = exec.Command("bash", "-c", fmt.Sprintf(`
dnf -y install dnf-plugins-core &&
%s &&
dnf install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
`, repoCmd))
case strings.Contains(osRelease, "ID=opensuse") || strings.Contains(osRelease, "ID=\"opensuse-"):
installCmd = exec.Command("bash", "-c", `
zypper install -y docker docker-compose &&
systemctl enable docker
`)
case strings.Contains(osRelease, "ID=rhel") || strings.Contains(osRelease, "ID=\"rhel"):
installCmd = exec.Command("bash", "-c", `
dnf remove -y runc &&
dnf -y install yum-utils &&
dnf config-manager --add-repo https://download.docker.com/linux/rhel/docker-ce.repo &&
dnf install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin &&
systemctl enable docker
`)
case strings.Contains(osRelease, "ID=amzn"):
installCmd = exec.Command("bash", "-c", `
yum update -y &&
yum install -y docker &&
systemctl enable docker &&
usermod -a -G docker ec2-user
`)
default:
return fmt.Errorf("unsupported Linux distribution")
}
installCmd.Stdout = os.Stdout
installCmd.Stderr = os.Stderr
return installCmd.Run()
}
func startDockerService() error {
if runtime.GOOS == "linux" {
cmd := exec.Command("systemctl", "enable", "--now", "docker")
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
return cmd.Run()
} else if runtime.GOOS == "darwin" {
// On macOS, Docker is usually started via the Docker Desktop application
fmt.Println("Please start Docker Desktop manually on macOS.")
return nil
}
return fmt.Errorf("unsupported operating system for starting Docker service")
}
func isDockerInstalled() bool {
cmd := exec.Command("docker", "--version")
if err := cmd.Run(); err != nil {
return false
}
return true
}
func isUserInDockerGroup() bool {
if runtime.GOOS == "darwin" {
// Docker group is not applicable on macOS
// So we assume that the user can run Docker commands
return true
}
if os.Geteuid() == 0 {
return true // Root user can run Docker commands anyway
}
// Check if the current user is in the docker group
if dockerGroup, err := user.LookupGroup("docker"); err == nil {
if currentUser, err := user.Current(); err == nil {
if currentUserGroupIds, err := currentUser.GroupIds(); err == nil {
for _, groupId := range currentUserGroupIds {
if groupId == dockerGroup.Gid {
return true
}
}
}
}
}
// Eventually, if any of the checks fail, we assume the user cannot run Docker commands
return false
}
// isDockerRunning checks if the Docker daemon is running by using the `docker info` command.
func isDockerRunning() bool {
cmd := exec.Command("docker", "info")
if err := cmd.Run(); err != nil {
return false
}
return true
}
// executeDockerComposeCommandWithArgs executes the appropriate docker command with arguments supplied
func executeDockerComposeCommandWithArgs(args ...string) error {
var cmd *exec.Cmd
var useNewStyle bool
if !isDockerInstalled() {
return fmt.Errorf("docker is not installed")
}
checkCmd := exec.Command("docker", "compose", "version")
if err := checkCmd.Run(); err == nil {
useNewStyle = true
} else {
checkCmd = exec.Command("docker-compose", "version")
if err := checkCmd.Run(); err == nil {
useNewStyle = false
} else {
return fmt.Errorf("neither 'docker compose' nor 'docker-compose' command is available")
}
}
if useNewStyle {
cmd = exec.Command("docker", append([]string{"compose"}, args...)...)
} else {
cmd = exec.Command("docker-compose", args...)
}
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
return cmd.Run()
}
// pullContainers pulls the containers using the appropriate command.
func pullContainers() error {
fmt.Println("Pulling the container images...")
if err := executeDockerComposeCommandWithArgs("-f", "docker-compose.yml", "pull", "--policy", "always"); err != nil {
return fmt.Errorf("failed to pull the containers: %v", err)
}
return nil
}
// startContainers starts the containers using the appropriate command.
func startContainers() error {
fmt.Println("Starting containers...")
if err := executeDockerComposeCommandWithArgs("-f", "docker-compose.yml", "up", "-d", "--force-recreate"); err != nil {
return fmt.Errorf("failed to start containers: %v", err)
}
return nil
}
// stopContainers stops the containers using the appropriate command.
func stopContainers() error {
fmt.Println("Stopping containers...")
if err := executeDockerComposeCommandWithArgs("-f", "docker-compose.yml", "down"); err != nil {
return fmt.Errorf("failed to stop containers: %v", err)
}
return nil
}
// restartContainer restarts a specific container using the appropriate command.
func restartContainer(container string) error {
fmt.Println("Restarting containers...")
if err := executeDockerComposeCommandWithArgs("-f", "docker-compose.yml", "restart", container); err != nil {
return fmt.Errorf("failed to stop the container \"%s\": %v", container, err)
}
return nil
}
func copyFile(src, dst string) error {
source, err := os.Open(src)
if err != nil {
@@ -600,32 +489,91 @@ func moveFile(src, dst string) error {
return os.Remove(src)
}
func waitForContainer(containerName string) error {
maxAttempts := 30
retryInterval := time.Second * 2
func printSetupToken(containerType SupportedContainer, dashboardDomain string) {
fmt.Println("Waiting for Pangolin to generate setup token...")
for attempt := 0; attempt < maxAttempts; attempt++ {
// Check if container is running
cmd := exec.Command("docker", "container", "inspect", "-f", "{{.State.Running}}", containerName)
var out bytes.Buffer
cmd.Stdout = &out
if err := cmd.Run(); err != nil {
// If the container doesn't exist or there's another error, wait and retry
time.Sleep(retryInterval)
continue
}
isRunning := strings.TrimSpace(out.String()) == "true"
if isRunning {
return nil
}
// Container exists but isn't running yet, wait and retry
time.Sleep(retryInterval)
// Wait for Pangolin to be healthy
if err := waitForContainer("pangolin", containerType); err != nil {
fmt.Println("Warning: Pangolin container did not become healthy in time.")
return
}
return fmt.Errorf("container %s did not start within %v seconds", containerName, maxAttempts*int(retryInterval.Seconds()))
// Give a moment for the setup token to be generated
time.Sleep(2 * time.Second)
// Fetch logs
var cmd *exec.Cmd
if containerType == Docker {
cmd = exec.Command("docker", "logs", "pangolin")
} else {
cmd = exec.Command("podman", "logs", "pangolin")
}
output, err := cmd.Output()
if err != nil {
fmt.Println("Warning: Could not fetch Pangolin logs to find setup token.")
return
}
// Parse for setup token
lines := strings.Split(string(output), "\n")
for i, line := range lines {
if strings.Contains(line, "=== SETUP TOKEN GENERATED ===") || strings.Contains(line, "=== SETUP TOKEN EXISTS ===") {
// Look for "Token: ..." in the next few lines
for j := i + 1; j < i+5 && j < len(lines); j++ {
trimmedLine := strings.TrimSpace(lines[j])
if strings.Contains(trimmedLine, "Token:") {
// Extract token after "Token:"
tokenStart := strings.Index(trimmedLine, "Token:")
if tokenStart != -1 {
token := strings.TrimSpace(trimmedLine[tokenStart+6:])
fmt.Printf("Setup token: %s\n", token)
fmt.Println("")
fmt.Println("This token is required to register the first admin account in the web UI at:")
fmt.Printf("https://%s/auth/initial-setup\n", dashboardDomain)
fmt.Println("")
fmt.Println("Save this token securely. It will be invalid after the first admin is created.")
return
}
}
}
}
}
fmt.Println("Warning: Could not find a setup token in Pangolin logs.")
}
func showSetupTokenInstructions(containerType SupportedContainer, dashboardDomain string) {
fmt.Println("\n=== Setup Token Instructions ===")
fmt.Println("To get your setup token, you need to:")
fmt.Println("")
fmt.Println("1. Start the containers")
if containerType == Docker {
fmt.Println(" docker compose up -d")
} else if containerType == Podman {
fmt.Println(" podman-compose up -d")
} else {
}
fmt.Println("")
fmt.Println("2. Wait for the Pangolin container to start and generate the token")
fmt.Println("")
fmt.Println("3. Check the container logs for the setup token")
if containerType == Docker {
fmt.Println(" docker logs pangolin | grep -A 2 -B 2 'SETUP TOKEN'")
} else if containerType == Podman {
fmt.Println(" podman logs pangolin | grep -A 2 -B 2 'SETUP TOKEN'")
} else {
}
fmt.Println("")
fmt.Println("4. Look for output like")
fmt.Println(" === SETUP TOKEN GENERATED ===")
fmt.Println(" Token: [your-token-here]")
fmt.Println(" Use this token on the initial setup page")
fmt.Println("")
fmt.Println("5. Use the token to complete initial setup at")
fmt.Printf(" https://%s/auth/initial-setup\n", dashboardDomain)
fmt.Println("")
fmt.Println("The setup token is required to register the first admin account.")
fmt.Println("Save it securely - it will be invalid after the first admin is created.")
fmt.Println("================================")
}
func generateRandomSecretKey() string {
@@ -641,3 +589,83 @@ func generateRandomSecretKey() string {
}
return string(b)
}
func getPublicIP() string {
client := &http.Client{
Timeout: 10 * time.Second,
}
resp, err := client.Get("https://ifconfig.io/ip")
if err != nil {
return ""
}
defer resp.Body.Close()
body, err := io.ReadAll(resp.Body)
if err != nil {
return ""
}
ip := strings.TrimSpace(string(body))
// Validate that it's a valid IP address
if net.ParseIP(ip) != nil {
return ip
}
return ""
}
// Run external commands with stdio/stderr attached.
func run(name string, args ...string) error {
cmd := exec.Command(name, args...)
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
return cmd.Run()
}
func checkPortsAvailable(port int) error {
addr := fmt.Sprintf(":%d", port)
ln, err := net.Listen("tcp", addr)
if err != nil {
return fmt.Errorf(
"ERROR: port %d is occupied or cannot be bound: %w\n\n",
port, err,
)
}
if closeErr := ln.Close(); closeErr != nil {
fmt.Fprintf(os.Stderr,
"WARNING: failed to close test listener on port %d: %v\n",
port, closeErr,
)
}
return nil
}
func downloadMaxMindDatabase() error {
fmt.Println("Downloading MaxMind GeoLite2 Country database...")
// Download the GeoLite2 Country database
if err := run("curl", "-L", "-o", "GeoLite2-Country.tar.gz",
"https://github.com/GitSquared/node-geolite2-redist/raw/refs/heads/master/redist/GeoLite2-Country.tar.gz"); err != nil {
return fmt.Errorf("failed to download GeoLite2 database: %v", err)
}
// Extract the database
if err := run("tar", "-xzf", "GeoLite2-Country.tar.gz"); err != nil {
return fmt.Errorf("failed to extract GeoLite2 database: %v", err)
}
// Find the .mmdb file and move it to the config directory
if err := run("bash", "-c", "mv GeoLite2-Country_*/GeoLite2-Country.mmdb config/"); err != nil {
return fmt.Errorf("failed to move GeoLite2 database to config directory: %v", err)
}
// Clean up the downloaded files
if err := run("rm", "-rf", "GeoLite2-Country.tar.gz", "GeoLite2-Country_*"); err != nil {
fmt.Printf("Warning: failed to clean up temporary files: %v\n", err)
}
fmt.Println("MaxMind GeoLite2 Country database downloaded successfully!")
return nil
}

1897
messages/bg-BG.json Normal file

File diff suppressed because it is too large Load Diff

1897
messages/cs-CZ.json Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -10,9 +10,10 @@
"setupErrorIdentifier": "Organization ID is already taken. Please choose a different one.",
"componentsErrorNoMemberCreate": "You are not currently a member of any organizations. Create an organization to get started.",
"componentsErrorNoMember": "You are not currently a member of any organizations.",
"welcome": "Welcome to Pangolin",
"welcome": "Welcome!",
"welcomeTo": "Welcome to",
"componentsCreateOrg": "Create an Organization",
"componentsMember": "You're a member of {count, plural, =0 {no organization} =1 {one organization} other {# organizations}}.",
"componentsMember": "You're a member of {count, plural, =0 {no organization} one {one organization} other {# organizations}}.",
"componentsInvalidKey": "Invalid or expired license keys detected. Follow license terms to continue using all features.",
"dismiss": "Dismiss",
"componentsLicenseViolation": "License Violation: This server is using {usedSites} sites which exceeds its licensed limit of {maxSites} sites. Follow license terms to continue using all features.",
@@ -58,7 +59,6 @@
"siteErrorCreate": "Error creating site",
"siteErrorCreateKeyPair": "Key pair or site defaults not found",
"siteErrorCreateDefaults": "Site defaults not found",
"siteNameDescription": "This is the display name for the site.",
"method": "Method",
"siteMethodDescription": "This is how you will expose connections.",
"siteLearnNewt": "Learn how to install Newt on your system",
@@ -94,7 +94,9 @@
"siteNewtTunnelDescription": "Easiest way to create an entrypoint into your network. No extra setup.",
"siteWg": "Basic WireGuard",
"siteWgDescription": "Use any WireGuard client to establish a tunnel. Manual NAT setup required.",
"siteWgDescriptionSaas": "Use any WireGuard client to establish a tunnel. Manual NAT setup required.",
"siteLocalDescription": "Local resources only. No tunneling.",
"siteLocalDescriptionSaas": "Local resources only. No tunneling. Only available on remote nodes.",
"siteSeeAll": "See All Sites",
"siteTunnelDescription": "Determine how you want to connect to your site",
"siteNewtCredentials": "Newt Credentials",
@@ -157,7 +159,7 @@
"resourceHTTP": "HTTPS Resource",
"resourceHTTPDescription": "Proxy requests to your app over HTTPS using a subdomain or base domain.",
"resourceRaw": "Raw TCP/UDP Resource",
"resourceRawDescription": "Proxy requests to your app over TCP/UDP using a port number.",
"resourceRawDescription": "Proxy requests to your app over TCP/UDP using a port number. This only works when sites are connected to nodes.",
"resourceCreate": "Create Resource",
"resourceCreateDescription": "Follow the steps below to create a new resource",
"resourceSeeAll": "See All Resources",
@@ -166,7 +168,10 @@
"siteSelect": "Select site",
"siteSearch": "Search site",
"siteNotFound": "No site found.",
"siteSelectionDescription": "This site will provide connectivity to the resource.",
"selectCountry": "Select country",
"searchCountries": "Search countries...",
"noCountryFound": "No country found.",
"siteSelectionDescription": "This site will provide connectivity to the target.",
"resourceType": "Resource Type",
"resourceTypeDescription": "Determine how you want to access your resource",
"resourceHTTPSSettings": "HTTPS Settings",
@@ -197,15 +202,18 @@
"general": "General",
"generalSettings": "General Settings",
"proxy": "Proxy",
"internal": "Internal",
"rules": "Rules",
"resourceSettingDescription": "Configure the settings on your resource",
"resourceSetting": "{resourceName} Settings",
"alwaysAllow": "Always Allow",
"alwaysDeny": "Always Deny",
"passToAuth": "Pass to Auth",
"orgSettingsDescription": "Configure your organization's general settings",
"orgGeneralSettings": "Organization Settings",
"orgGeneralSettingsDescription": "Manage your organization details and configuration",
"saveGeneralSettings": "Save General Settings",
"saveSettings": "Save Settings",
"orgDangerZone": "Danger Zone",
"orgDangerZoneDescription": "Once you delete this org, there is no going back. Please be certain.",
"orgDelete": "Delete Organization",
@@ -249,7 +257,7 @@
"weeks": "Weeks",
"months": "Months",
"years": "Years",
"day": "{count, plural, =1 {# day} other {# days}}",
"day": "{count, plural, one {# day} other {# days}}",
"apiKeysTitle": "API Key Information",
"apiKeysConfirmCopy2": "You must confirm that you have copied the API key.",
"apiKeysErrorCreate": "Error creating API key",
@@ -347,7 +355,7 @@
"licensePurchase": "Purchase License",
"licensePurchaseSites": "Purchase Additional Sites",
"licenseSitesUsedMax": "{usedSites} of {maxSites} sites used",
"licenseSitesUsed": "{count, plural, =0 {# sites} =1 {# site} other {# sites}} in system.",
"licenseSitesUsed": "{count, plural, =0 {# sites} one {# site} other {# sites}} in system.",
"licensePurchaseDescription": "Choose how many sites you want to {selectedMode, select, license {purchase a license for. You can always add more sites later.} other {add to your existing license.}}",
"licenseFee": "License fee",
"licensePriceSite": "Price per site",
@@ -436,7 +444,7 @@
"accessRoleSelect": "Select role",
"inviteEmailSentDescription": "An email has been sent to the user with the access link below. They must access the link to accept the invitation.",
"inviteSentDescription": "The user has been invited. They must access the link below to accept the invitation.",
"inviteExpiresIn": "The invite will expire in {days, plural, =1 {# day} other {# days}}.",
"inviteExpiresIn": "The invite will expire in {days, plural, one {# day} other {# days}}.",
"idpTitle": "Identity Provider",
"idpSelect": "Select the identity provider for the external user",
"idpNotConfigured": "No identity providers are configured. Please configure an identity provider before creating external users.",
@@ -449,6 +457,8 @@
"accessRoleErrorAddDescription": "An error occurred while adding user to the role.",
"userSaved": "User saved",
"userSavedDescription": "The user has been updated.",
"autoProvisioned": "Auto Provisioned",
"autoProvisionedDescription": "Allow this user to be automatically managed by identity provider",
"accessControlsDescription": "Manage what this user can access and do in the organization",
"accessControlsSubmit": "Save Access Controls",
"roles": "Roles",
@@ -458,7 +468,10 @@
"createdAt": "Created At",
"proxyErrorInvalidHeader": "Invalid custom Host Header value. Use domain name format, or save empty to unset custom Host Header.",
"proxyErrorTls": "Invalid TLS Server Name. Use domain name format, or save empty to remove the TLS Server Name.",
"proxyEnableSSL": "Enable SSL (https)",
"proxyEnableSSL": "Enable SSL",
"proxyEnableSSLDescription": "Enable SSL/TLS encryption for secure HTTPS connections to your targets.",
"target": "Target",
"configureTarget": "Configure Targets",
"targetErrorFetch": "Failed to fetch targets",
"targetErrorFetchDescription": "An error occurred while fetching targets",
"siteErrorFetch": "Failed to fetch resource",
@@ -485,18 +498,30 @@
"targetTlsSettings": "Secure Connection Configuration",
"targetTlsSettingsDescription": "Configure SSL/TLS settings for your resource",
"targetTlsSettingsAdvanced": "Advanced TLS Settings",
"targetTlsSni": "TLS Server Name (SNI)",
"targetTlsSni": "TLS Server Name",
"targetTlsSniDescription": "The TLS Server Name to use for SNI. Leave empty to use the default.",
"targetTlsSubmit": "Save Settings",
"targets": "Targets Configuration",
"targetsDescription": "Set up targets to route traffic to your services",
"targetsDescription": "Set up targets to route traffic to your backend services",
"targetStickySessions": "Enable Sticky Sessions",
"targetStickySessionsDescription": "Keep connections on the same backend target for their entire session.",
"methodSelect": "Select method",
"targetSubmit": "Add Target",
"targetNoOne": "No targets. Add a target using the form.",
"targetNoOne": "This resource doesn't have any targets. Add a target to configure where to send requests to your backend.",
"targetNoOneDescription": "Adding more than one target above will enable load balancing.",
"targetsSubmit": "Save Targets",
"addTarget": "Add Target",
"targetErrorInvalidIp": "Invalid IP address",
"targetErrorInvalidIpDescription": "Please enter a valid IP address or hostname",
"targetErrorInvalidPort": "Invalid port",
"targetErrorInvalidPortDescription": "Please enter a valid port number",
"targetErrorNoSite": "No site selected",
"targetErrorNoSiteDescription": "Please select a site for the target",
"targetCreated": "Target created",
"targetCreatedDescription": "Target has been created successfully",
"targetErrorCreate": "Failed to create target",
"targetErrorCreateDescription": "An error occurred while creating the target",
"save": "Save",
"proxyAdditional": "Additional Proxy Settings",
"proxyAdditionalDescription": "Configure how your resource handles proxy settings",
"proxyCustomHeader": "Custom Host Header",
@@ -506,6 +531,7 @@
"ipAddressErrorInvalidFormat": "Invalid IP address format",
"ipAddressErrorInvalidOctet": "Invalid IP address octet",
"path": "Path",
"matchPath": "Match Path",
"ipAddressRange": "IP Range",
"rulesErrorFetch": "Failed to fetch rules",
"rulesErrorFetchDescription": "An error occurred while fetching rules",
@@ -541,6 +567,7 @@
"rulesActions": "Actions",
"rulesActionAlwaysAllow": "Always Allow: Bypass all authentication methods",
"rulesActionAlwaysDeny": "Always Deny: Block all requests; no authentication can be attempted",
"rulesActionPassToAuth": "Pass to Auth: Allow authentication methods to be attempted",
"rulesMatchCriteria": "Matching Criteria",
"rulesMatchCriteriaIpAddress": "Match a specific IP address",
"rulesMatchCriteriaIpAddressRange": "Match a range of IP addresses in CIDR notation",
@@ -703,7 +730,7 @@
"pangolinServerAdmin": "Server Admin - Pangolin",
"licenseTierProfessional": "Professional License",
"licenseTierEnterprise": "Enterprise License",
"licenseTierCommercial": "Commercial License",
"licenseTierPersonal": "Personal License",
"licensed": "Licensed",
"yes": "Yes",
"no": "No",
@@ -738,7 +765,7 @@
"idpDisplayName": "A display name for this identity provider",
"idpAutoProvisionUsers": "Auto Provision Users",
"idpAutoProvisionUsersDescription": "When enabled, users will be automatically created in the system upon first login with the ability to map users to roles and organizations.",
"licenseBadge": "Professional",
"licenseBadge": "EE",
"idpType": "Provider Type",
"idpTypeDescription": "Select the type of identity provider you want to configure",
"idpOidcConfigure": "OAuth2/OIDC Configuration",
@@ -832,6 +859,24 @@
"pincodeRequirementsLength": "PIN must be exactly 6 digits",
"pincodeRequirementsChars": "PIN must only contain numbers",
"passwordRequirementsLength": "Password must be at least 1 character long",
"passwordRequirementsTitle": "Password requirements:",
"passwordRequirementLength": "At least 8 characters long",
"passwordRequirementUppercase": "At least one uppercase letter",
"passwordRequirementLowercase": "At least one lowercase letter",
"passwordRequirementNumber": "At least one number",
"passwordRequirementSpecial": "At least one special character",
"passwordRequirementsMet": "✓ Password meets all requirements",
"passwordStrength": "Password strength",
"passwordStrengthWeak": "Weak",
"passwordStrengthMedium": "Medium",
"passwordStrengthStrong": "Strong",
"passwordRequirements": "Requirements:",
"passwordRequirementLengthText": "8+ characters",
"passwordRequirementUppercaseText": "Uppercase letter (A-Z)",
"passwordRequirementLowercaseText": "Lowercase letter (a-z)",
"passwordRequirementNumberText": "Number (0-9)",
"passwordRequirementSpecialText": "Special character (!@#$%...)",
"passwordsDoNotMatch": "Passwords do not match",
"otpEmailRequirementsLength": "OTP must be at least 1 character long",
"otpEmailSent": "OTP Sent",
"otpEmailSentDescription": "An OTP has been sent to your email",
@@ -951,19 +996,28 @@
"logoutError": "Error logging out",
"signingAs": "Signed in as",
"serverAdmin": "Server Admin",
"managedSelfhosted": "Managed Self-Hosted",
"otpEnable": "Enable Two-factor",
"otpDisable": "Disable Two-factor",
"logout": "Log Out",
"licenseTierProfessionalRequired": "Professional Edition Required",
"licenseTierProfessionalRequiredDescription": "This feature is only available in the Professional Edition.",
"actionGetOrg": "Get Organization",
"updateOrgUser": "Update Org User",
"createOrgUser": "Create Org User",
"actionUpdateOrg": "Update Organization",
"actionUpdateUser": "Update User",
"actionGetUser": "Get User",
"actionGetOrgUser": "Get Organization User",
"actionListOrgDomains": "List Organization Domains",
"actionCreateSite": "Create Site",
"actionDeleteSite": "Delete Site",
"actionGetSite": "Get Site",
"actionListSites": "List Sites",
"actionApplyBlueprint": "Apply Blueprint",
"setupToken": "Setup Token",
"setupTokenDescription": "Enter the setup token from the server console.",
"setupTokenRequired": "Setup token is required",
"actionUpdateSite": "Update Site",
"actionListSiteRoles": "List Allowed Site Roles",
"actionCreateResource": "Create Resource",
@@ -1019,6 +1073,17 @@
"actionDeleteIdpOrg": "Delete IDP Org Policy",
"actionListIdpOrgs": "List IDP Orgs",
"actionUpdateIdpOrg": "Update IDP Org",
"actionCreateClient": "Create Client",
"actionDeleteClient": "Delete Client",
"actionUpdateClient": "Update Client",
"actionListClients": "List Clients",
"actionGetClient": "Get Client",
"actionCreateSiteResource": "Create Site Resource",
"actionDeleteSiteResource": "Delete Site Resource",
"actionGetSiteResource": "Get Site Resource",
"actionListSiteResources": "List Site Resources",
"actionUpdateSiteResource": "Update Site Resource",
"actionListInvitations": "List Invitations",
"noneSelected": "None selected",
"orgNotFound2": "No organizations found.",
"searchProgress": "Search...",
@@ -1034,7 +1099,6 @@
"navbar": "Navigation Menu",
"navbarDescription": "Main navigation menu for the application",
"navbarDocsLink": "Documentation",
"commercialEdition": "Commercial Edition",
"otpErrorEnable": "Unable to enable 2FA",
"otpErrorEnableDescription": "An error occurred while enabling 2FA",
"otpSetupCheckCode": "Please enter a 6-digit code",
@@ -1090,8 +1154,10 @@
"sidebarAllUsers": "All Users",
"sidebarIdentityProviders": "Identity Providers",
"sidebarLicense": "License",
"enableDockerSocket": "Enable Docker Socket",
"enableDockerSocketDescription": "Enable Docker Socket discovery for populating container information. Socket path must be provided to Newt.",
"sidebarClients": "Clients",
"sidebarDomains": "Domains",
"enableDockerSocket": "Enable Docker Blueprint",
"enableDockerSocketDescription": "Enable Docker Socket label scraping for blueprint labels. Socket path must be provided to Newt.",
"enableDockerSocketLink": "Learn More",
"viewDockerContainers": "View Docker Containers",
"containersIn": "Containers in {siteName}",
@@ -1102,7 +1168,7 @@
"containerNetworks": "Networks",
"containerHostnameIp": "Hostname/IP",
"containerLabels": "Labels",
"containerLabelsCount": "{count} label{s,plural,one{} other{s}}",
"containerLabelsCount": "{count, plural, one {# label} other {# labels}}",
"containerLabelsTitle": "Container Labels",
"containerLabelEmpty": "<empty>",
"containerPorts": "Ports",
@@ -1114,7 +1180,7 @@
"showStoppedContainers": "Show stopped containers",
"noContainersFound": "No containers found. Make sure Docker containers are running.",
"searchContainersPlaceholder": "Search across {count} containers...",
"searchResultsCount": "{count} result{s,plural,one{} other{s}}",
"searchResultsCount": "{count, plural, one {# result} other {# results}}",
"filters": "Filters",
"filterOptions": "Filter Options",
"filterPorts": "Ports",
@@ -1129,8 +1195,704 @@
"dark": "dark",
"system": "system",
"theme": "Theme",
"subnetRequired": "Subnet is required",
"initialSetupTitle": "Initial Server Setup",
"initialSetupDescription": "Create the intial server admin account. Only one server admin can exist. You can always change these credentials later.",
"createAdminAccount": "Create Admin Account",
"setupErrorCreateAdmin": "An error occurred while creating the server admin account."
"setupErrorCreateAdmin": "An error occurred while creating the server admin account.",
"certificateStatus": "Certificate Status",
"loading": "Loading",
"restart": "Restart",
"domains": "Domains",
"domainsDescription": "Manage domains for your organization",
"domainsSearch": "Search domains...",
"domainAdd": "Add Domain",
"domainAddDescription": "Register a new domain with your organization",
"domainCreate": "Create Domain",
"domainCreatedDescription": "Domain created successfully",
"domainDeletedDescription": "Domain deleted successfully",
"domainQuestionRemove": "Are you sure you want to remove the domain {domain} from your account?",
"domainMessageRemove": "Once removed, the domain will no longer be associated with your account.",
"domainMessageConfirm": "To confirm, please type the domain name below.",
"domainConfirmDelete": "Confirm Delete Domain",
"domainDelete": "Delete Domain",
"domain": "Domain",
"selectDomainTypeNsName": "Domain Delegation (NS)",
"selectDomainTypeNsDescription": "This domain and all its subdomains. Use this when you want to control an entire domain zone.",
"selectDomainTypeCnameName": "Single Domain (CNAME)",
"selectDomainTypeCnameDescription": "Just this specific domain. Use this for individual subdomains or specific domain entries.",
"selectDomainTypeWildcardName": "Wildcard Domain",
"selectDomainTypeWildcardDescription": "This domain and its subdomains.",
"domainDelegation": "Single Domain",
"selectType": "Select a type",
"actions": "Actions",
"refresh": "Refresh",
"refreshError": "Failed to refresh data",
"verified": "Verified",
"pending": "Pending",
"sidebarBilling": "Billing",
"billing": "Billing",
"orgBillingDescription": "Manage your billing information and subscriptions",
"github": "GitHub",
"pangolinHosted": "Pangolin Hosted",
"fossorial": "Fossorial",
"completeAccountSetup": "Complete Account Setup",
"completeAccountSetupDescription": "Set your password to get started",
"accountSetupSent": "We'll send an account setup code to this email address.",
"accountSetupCode": "Setup Code",
"accountSetupCodeDescription": "Check your email for the setup code.",
"passwordCreate": "Create Password",
"passwordCreateConfirm": "Confirm Password",
"accountSetupSubmit": "Send Setup Code",
"completeSetup": "Complete Setup",
"accountSetupSuccess": "Account setup completed! Welcome to Pangolin!",
"documentation": "Documentation",
"saveAllSettings": "Save All Settings",
"settingsUpdated": "Settings updated",
"settingsUpdatedDescription": "All settings have been updated successfully",
"settingsErrorUpdate": "Failed to update settings",
"settingsErrorUpdateDescription": "An error occurred while updating settings",
"sidebarCollapse": "Collapse",
"sidebarExpand": "Expand",
"newtUpdateAvailable": "Update Available",
"newtUpdateAvailableInfo": "A new version of Newt is available. Please update to the latest version for the best experience.",
"domainPickerEnterDomain": "Domain",
"domainPickerPlaceholder": "myapp.example.com",
"domainPickerDescription": "Enter the full domain of the resource to see available options.",
"domainPickerDescriptionSaas": "Enter a full domain, subdomain, or just a name to see available options",
"domainPickerTabAll": "All",
"domainPickerTabOrganization": "Organization",
"domainPickerTabProvided": "Provided",
"domainPickerSortAsc": "A-Z",
"domainPickerSortDesc": "Z-A",
"domainPickerCheckingAvailability": "Checking availability...",
"domainPickerNoMatchingDomains": "No matching domains found. Try a different domain or check your organization's domain settings.",
"domainPickerOrganizationDomains": "Organization Domains",
"domainPickerProvidedDomains": "Provided Domains",
"domainPickerSubdomain": "Subdomain: {subdomain}",
"domainPickerNamespace": "Namespace: {namespace}",
"domainPickerShowMore": "Show More",
"regionSelectorTitle": "Select Region",
"regionSelectorInfo": "Selecting a region helps us provide better performance for your location. You do not have to be in the same region as your server.",
"regionSelectorPlaceholder": "Choose a region",
"regionSelectorComingSoon": "Coming Soon",
"billingLoadingSubscription": "Loading subscription...",
"billingFreeTier": "Free Tier",
"billingWarningOverLimit": "Warning: You have exceeded one or more usage limits. Your sites will not connect until you modify your subscription or adjust your usage.",
"billingUsageLimitsOverview": "Usage Limits Overview",
"billingMonitorUsage": "Monitor your usage against configured limits. If you need limits increased please contact us support@fossorial.io.",
"billingDataUsage": "Data Usage",
"billingOnlineTime": "Site Online Time",
"billingUsers": "Active Users",
"billingDomains": "Active Domains",
"billingRemoteExitNodes": "Active Self-hosted Nodes",
"billingNoLimitConfigured": "No limit configured",
"billingEstimatedPeriod": "Estimated Billing Period",
"billingIncludedUsage": "Included Usage",
"billingIncludedUsageDescription": "Usage included with your current subscription plan",
"billingFreeTierIncludedUsage": "Free tier usage allowances",
"billingIncluded": "included",
"billingEstimatedTotal": "Estimated Total:",
"billingNotes": "Notes",
"billingEstimateNote": "This is an estimate based on your current usage.",
"billingActualChargesMayVary": "Actual charges may vary.",
"billingBilledAtEnd": "You will be billed at the end of the billing period.",
"billingModifySubscription": "Modify Subscription",
"billingStartSubscription": "Start Subscription",
"billingRecurringCharge": "Recurring Charge",
"billingManageSubscriptionSettings": "Manage your subscription settings and preferences",
"billingNoActiveSubscription": "You don't have an active subscription. Start your subscription to increase usage limits.",
"billingFailedToLoadSubscription": "Failed to load subscription",
"billingFailedToLoadUsage": "Failed to load usage",
"billingFailedToGetCheckoutUrl": "Failed to get checkout URL",
"billingPleaseTryAgainLater": "Please try again later.",
"billingCheckoutError": "Checkout Error",
"billingFailedToGetPortalUrl": "Failed to get portal URL",
"billingPortalError": "Portal Error",
"billingDataUsageInfo": "You're charged for all data transferred through your secure tunnels when connected to the cloud. This includes both incoming and outgoing traffic across all your sites. When you reach your limit, your sites will disconnect until you upgrade your plan or reduce usage. Data is not charged when using nodes.",
"billingOnlineTimeInfo": "You're charged based on how long your sites stay connected to the cloud. For example, 44,640 minutes equals one site running 24/7 for a full month. When you reach your limit, your sites will disconnect until you upgrade your plan or reduce usage. Time is not charged when using nodes.",
"billingUsersInfo": "You're charged for each user in your organization. Billing is calculated daily based on the number of active user accounts in your org.",
"billingDomainInfo": "You're charged for each domain in your organization. Billing is calculated daily based on the number of active domain accounts in your org.",
"billingRemoteExitNodesInfo": "You're charged for each managed Node in your organization. Billing is calculated daily based on the number of active managed Nodes in your org.",
"domainNotFound": "Domain Not Found",
"domainNotFoundDescription": "This resource is disabled because the domain no longer exists our system. Please set a new domain for this resource.",
"failed": "Failed",
"createNewOrgDescription": "Create a new organization",
"organization": "Organization",
"port": "Port",
"securityKeyManage": "Manage Security Keys",
"securityKeyDescription": "Add or remove security keys for passwordless authentication",
"securityKeyRegister": "Register New Security Key",
"securityKeyList": "Your Security Keys",
"securityKeyNone": "No security keys registered yet",
"securityKeyNameRequired": "Name is required",
"securityKeyRemove": "Remove",
"securityKeyLastUsed": "Last used: {date}",
"securityKeyNameLabel": "Security Key Name",
"securityKeyRegisterSuccess": "Security key registered successfully",
"securityKeyRegisterError": "Failed to register security key",
"securityKeyRemoveSuccess": "Security key removed successfully",
"securityKeyRemoveError": "Failed to remove security key",
"securityKeyLoadError": "Failed to load security keys",
"securityKeyLogin": "Continue with security key",
"securityKeyAuthError": "Failed to authenticate with security key",
"securityKeyRecommendation": "Register a backup security key on another device to ensure you always have access to your account.",
"registering": "Registering...",
"securityKeyPrompt": "Please verify your identity using your security key. Make sure your security key is connected and ready.",
"securityKeyBrowserNotSupported": "Your browser doesn't support security keys. Please use a modern browser like Chrome, Firefox, or Safari.",
"securityKeyPermissionDenied": "Please allow access to your security key to continue signing in.",
"securityKeyRemovedTooQuickly": "Please keep your security key connected until the sign-in process completes.",
"securityKeyNotSupported": "Your security key may not be compatible. Please try a different security key.",
"securityKeyUnknownError": "There was a problem using your security key. Please try again.",
"twoFactorRequired": "Two-factor authentication is required to register a security key.",
"twoFactor": "Two-Factor Authentication",
"adminEnabled2FaOnYourAccount": "Your administrator has enabled two-factor authentication for {email}. Please complete the setup process to continue.",
"securityKeyAdd": "Add Security Key",
"securityKeyRegisterTitle": "Register New Security Key",
"securityKeyRegisterDescription": "Connect your security key and enter a name to identify it",
"securityKeyTwoFactorRequired": "Two-Factor Authentication Required",
"securityKeyTwoFactorDescription": "Please enter your two-factor authentication code to register the security key",
"securityKeyTwoFactorRemoveDescription": "Please enter your two-factor authentication code to remove the security key",
"securityKeyTwoFactorCode": "Two-Factor Code",
"securityKeyRemoveTitle": "Remove Security Key",
"securityKeyRemoveDescription": "Enter your password to remove the security key \"{name}\"",
"securityKeyNoKeysRegistered": "No security keys registered",
"securityKeyNoKeysDescription": "Add a security key to enhance your account security",
"createDomainRequired": "Domain is required",
"createDomainAddDnsRecords": "Add DNS Records",
"createDomainAddDnsRecordsDescription": "Add the following DNS records to your domain provider to complete the setup.",
"createDomainNsRecords": "NS Records",
"createDomainRecord": "Record",
"createDomainType": "Type:",
"createDomainName": "Name:",
"createDomainValue": "Value:",
"createDomainCnameRecords": "CNAME Records",
"createDomainARecords": "A Records",
"createDomainRecordNumber": "Record {number}",
"createDomainTxtRecords": "TXT Records",
"createDomainSaveTheseRecords": "Save These Records",
"createDomainSaveTheseRecordsDescription": "Make sure to save these DNS records as you will not see them again.",
"createDomainDnsPropagation": "DNS Propagation",
"createDomainDnsPropagationDescription": "DNS changes may take some time to propagate across the internet. This can take anywhere from a few minutes to 48 hours, depending on your DNS provider and TTL settings.",
"resourcePortRequired": "Port number is required for non-HTTP resources",
"resourcePortNotAllowed": "Port number should not be set for HTTP resources",
"billingPricingCalculatorLink": "Pricing Calculator",
"signUpTerms": {
"IAgreeToThe": "I agree to the",
"termsOfService": "terms of service",
"and": "and",
"privacyPolicy": "privacy policy"
},
"siteRequired": "Site is required.",
"olmTunnel": "Olm Tunnel",
"olmTunnelDescription": "Use Olm for client connectivity",
"errorCreatingClient": "Error creating client",
"clientDefaultsNotFound": "Client defaults not found",
"createClient": "Create Client",
"createClientDescription": "Create a new client for connecting to your sites",
"seeAllClients": "See All Clients",
"clientInformation": "Client Information",
"clientNamePlaceholder": "Client name",
"address": "Address",
"subnetPlaceholder": "Subnet",
"addressDescription": "The address that this client will use for connectivity",
"selectSites": "Select sites",
"sitesDescription": "The client will have connectivity to the selected sites",
"clientInstallOlm": "Install Olm",
"clientInstallOlmDescription": "Get Olm running on your system",
"clientOlmCredentials": "Olm Credentials",
"clientOlmCredentialsDescription": "This is how Olm will authenticate with the server",
"olmEndpoint": "Olm Endpoint",
"olmId": "Olm ID",
"olmSecretKey": "Olm Secret Key",
"clientCredentialsSave": "Save Your Credentials",
"clientCredentialsSaveDescription": "You will only be able to see this once. Make sure to copy it to a secure place.",
"generalSettingsDescription": "Configure the general settings for this client",
"clientUpdated": "Client updated",
"clientUpdatedDescription": "The client has been updated.",
"clientUpdateFailed": "Failed to update client",
"clientUpdateError": "An error occurred while updating the client.",
"sitesFetchFailed": "Failed to fetch sites",
"sitesFetchError": "An error occurred while fetching sites.",
"olmErrorFetchReleases": "An error occurred while fetching Olm releases.",
"olmErrorFetchLatest": "An error occurred while fetching the latest Olm release.",
"remoteSubnets": "Remote Subnets",
"enterCidrRange": "Enter CIDR range",
"remoteSubnetsDescription": "Add CIDR ranges that can be accessed from this site remotely using clients. Use format like 10.0.0.0/24. This ONLY applies to VPN client connectivity.",
"resourceEnableProxy": "Enable Public Proxy",
"resourceEnableProxyDescription": "Enable public proxying to this resource. This allows access to the resource from outside the network through the cloud on an open port. Requires Traefik config.",
"externalProxyEnabled": "External Proxy Enabled",
"addNewTarget": "Add New Target",
"targetsList": "Targets List",
"advancedMode": "Advanced Mode",
"targetErrorDuplicateTargetFound": "Duplicate target found",
"healthCheckHealthy": "Healthy",
"healthCheckUnhealthy": "Unhealthy",
"healthCheckUnknown": "Unknown",
"healthCheck": "Health Check",
"configureHealthCheck": "Configure Health Check",
"configureHealthCheckDescription": "Set up health monitoring for {target}",
"enableHealthChecks": "Enable Health Checks",
"enableHealthChecksDescription": "Monitor the health of this target. You can monitor a different endpoint than the target if required.",
"healthScheme": "Method",
"healthSelectScheme": "Select Method",
"healthCheckPath": "Path",
"healthHostname": "IP / Host",
"healthPort": "Port",
"healthCheckPathDescription": "The path to check for health status.",
"healthyIntervalSeconds": "Healthy Interval",
"unhealthyIntervalSeconds": "Unhealthy Interval",
"IntervalSeconds": "Healthy Interval",
"timeoutSeconds": "Timeout",
"timeIsInSeconds": "Time is in seconds",
"retryAttempts": "Retry Attempts",
"expectedResponseCodes": "Expected Response Codes",
"expectedResponseCodesDescription": "HTTP status code that indicates healthy status. If left blank, 200-300 is considered healthy.",
"customHeaders": "Custom Headers",
"customHeadersDescription": "Headers new line separated: Header-Name: value",
"headersValidationError": "Headers must be in the format: Header-Name: value",
"saveHealthCheck": "Save Health Check",
"healthCheckSaved": "Health Check Saved",
"healthCheckSavedDescription": "Health check configuration has been saved successfully",
"healthCheckError": "Health Check Error",
"healthCheckErrorDescription": "An error occurred while saving the health check configuration",
"healthCheckPathRequired": "Health check path is required",
"healthCheckMethodRequired": "HTTP method is required",
"healthCheckIntervalMin": "Check interval must be at least 5 seconds",
"healthCheckTimeoutMin": "Timeout must be at least 1 second",
"healthCheckRetryMin": "Retry attempts must be at least 1",
"httpMethod": "HTTP Method",
"selectHttpMethod": "Select HTTP method",
"domainPickerSubdomainLabel": "Subdomain",
"domainPickerBaseDomainLabel": "Base Domain",
"domainPickerSearchDomains": "Search domains...",
"domainPickerNoDomainsFound": "No domains found",
"domainPickerLoadingDomains": "Loading domains...",
"domainPickerSelectBaseDomain": "Select base domain...",
"domainPickerNotAvailableForCname": "Not available for CNAME domains",
"domainPickerEnterSubdomainOrLeaveBlank": "Enter subdomain or leave blank to use base domain.",
"domainPickerEnterSubdomainToSearch": "Enter a subdomain to search and select from available free domains.",
"domainPickerFreeDomains": "Free Domains",
"domainPickerSearchForAvailableDomains": "Search for available domains",
"domainPickerNotWorkSelfHosted": "Note: Free provided domains are not available for self-hosted instances right now.",
"resourceDomain": "Domain",
"resourceEditDomain": "Edit Domain",
"siteName": "Site Name",
"proxyPort": "Port",
"resourcesTableProxyResources": "Proxy Resources",
"resourcesTableClientResources": "Client Resources",
"resourcesTableNoProxyResourcesFound": "No proxy resources found.",
"resourcesTableNoInternalResourcesFound": "No internal resources found.",
"resourcesTableDestination": "Destination",
"resourcesTableTheseResourcesForUseWith": "These resources are for use with",
"resourcesTableClients": "Clients",
"resourcesTableAndOnlyAccessibleInternally": "and are only accessible internally when connected with a client.",
"editInternalResourceDialogEditClientResource": "Edit Client Resource",
"editInternalResourceDialogUpdateResourceProperties": "Update the resource properties and target configuration for {resourceName}.",
"editInternalResourceDialogResourceProperties": "Resource Properties",
"editInternalResourceDialogName": "Name",
"editInternalResourceDialogProtocol": "Protocol",
"editInternalResourceDialogSitePort": "Site Port",
"editInternalResourceDialogTargetConfiguration": "Target Configuration",
"editInternalResourceDialogCancel": "Cancel",
"editInternalResourceDialogSaveResource": "Save Resource",
"editInternalResourceDialogSuccess": "Success",
"editInternalResourceDialogInternalResourceUpdatedSuccessfully": "Internal resource updated successfully",
"editInternalResourceDialogError": "Error",
"editInternalResourceDialogFailedToUpdateInternalResource": "Failed to update internal resource",
"editInternalResourceDialogNameRequired": "Name is required",
"editInternalResourceDialogNameMaxLength": "Name must be less than 255 characters",
"editInternalResourceDialogProxyPortMin": "Proxy port must be at least 1",
"editInternalResourceDialogProxyPortMax": "Proxy port must be less than 65536",
"editInternalResourceDialogInvalidIPAddressFormat": "Invalid IP address format",
"editInternalResourceDialogDestinationPortMin": "Destination port must be at least 1",
"editInternalResourceDialogDestinationPortMax": "Destination port must be less than 65536",
"createInternalResourceDialogNoSitesAvailable": "No Sites Available",
"createInternalResourceDialogNoSitesAvailableDescription": "You need to have at least one Newt site with a subnet configured to create internal resources.",
"createInternalResourceDialogClose": "Close",
"createInternalResourceDialogCreateClientResource": "Create Client Resource",
"createInternalResourceDialogCreateClientResourceDescription": "Create a new resource that will be accessible to clients connected to the selected site.",
"createInternalResourceDialogResourceProperties": "Resource Properties",
"createInternalResourceDialogName": "Name",
"createInternalResourceDialogSite": "Site",
"createInternalResourceDialogSelectSite": "Select site...",
"createInternalResourceDialogSearchSites": "Search sites...",
"createInternalResourceDialogNoSitesFound": "No sites found.",
"createInternalResourceDialogProtocol": "Protocol",
"createInternalResourceDialogTcp": "TCP",
"createInternalResourceDialogUdp": "UDP",
"createInternalResourceDialogSitePort": "Site Port",
"createInternalResourceDialogSitePortDescription": "Use this port to access the resource on the site when connected with a client.",
"createInternalResourceDialogTargetConfiguration": "Target Configuration",
"createInternalResourceDialogDestinationIPDescription": "The IP or hostname address of the resource on the site's network.",
"createInternalResourceDialogDestinationPortDescription": "The port on the destination IP where the resource is accessible.",
"createInternalResourceDialogCancel": "Cancel",
"createInternalResourceDialogCreateResource": "Create Resource",
"createInternalResourceDialogSuccess": "Success",
"createInternalResourceDialogInternalResourceCreatedSuccessfully": "Internal resource created successfully",
"createInternalResourceDialogError": "Error",
"createInternalResourceDialogFailedToCreateInternalResource": "Failed to create internal resource",
"createInternalResourceDialogNameRequired": "Name is required",
"createInternalResourceDialogNameMaxLength": "Name must be less than 255 characters",
"createInternalResourceDialogPleaseSelectSite": "Please select a site",
"createInternalResourceDialogProxyPortMin": "Proxy port must be at least 1",
"createInternalResourceDialogProxyPortMax": "Proxy port must be less than 65536",
"createInternalResourceDialogInvalidIPAddressFormat": "Invalid IP address format",
"createInternalResourceDialogDestinationPortMin": "Destination port must be at least 1",
"createInternalResourceDialogDestinationPortMax": "Destination port must be less than 65536",
"siteConfiguration": "Configuration",
"siteAcceptClientConnections": "Accept Client Connections",
"siteAcceptClientConnectionsDescription": "Allow other devices to connect through this Newt instance as a gateway using clients.",
"siteAddress": "Site Address",
"siteAddressDescription": "Specify the IP address of the host for clients to connect to. This is the internal address of the site in the Pangolin network for clients to address. Must fall within the Org subnet.",
"autoLoginExternalIdp": "Auto Login with External IDP",
"autoLoginExternalIdpDescription": "Immediately redirect the user to the external IDP for authentication.",
"selectIdp": "Select IDP",
"selectIdpPlaceholder": "Choose an IDP...",
"selectIdpRequired": "Please select an IDP when auto login is enabled.",
"autoLoginTitle": "Redirecting",
"autoLoginDescription": "Redirecting you to the external identity provider for authentication.",
"autoLoginProcessing": "Preparing authentication...",
"autoLoginRedirecting": "Redirecting to login...",
"autoLoginError": "Auto Login Error",
"autoLoginErrorNoRedirectUrl": "No redirect URL received from the identity provider.",
"autoLoginErrorGeneratingUrl": "Failed to generate authentication URL.",
"remoteExitNodeManageRemoteExitNodes": "Remote Nodes",
"remoteExitNodeDescription": "Self-host one or more remote nodes to extend your network connectivity and reduce reliance on the cloud",
"remoteExitNodes": "Nodes",
"searchRemoteExitNodes": "Search nodes...",
"remoteExitNodeAdd": "Add Node",
"remoteExitNodeErrorDelete": "Error deleting node",
"remoteExitNodeQuestionRemove": "Are you sure you want to remove the node {selectedNode} from the organization?",
"remoteExitNodeMessageRemove": "Once removed, the node will no longer be accessible.",
"remoteExitNodeMessageConfirm": "To confirm, please type the name of the node below.",
"remoteExitNodeConfirmDelete": "Confirm Delete Node",
"remoteExitNodeDelete": "Delete Node",
"sidebarRemoteExitNodes": "Remote Nodes",
"remoteExitNodeCreate": {
"title": "Create Node",
"description": "Create a new node to extend your network connectivity",
"viewAllButton": "View All Nodes",
"strategy": {
"title": "Creation Strategy",
"description": "Choose this to manually configure your node or generate new credentials.",
"adopt": {
"title": "Adopt Node",
"description": "Choose this if you already have the credentials for the node."
},
"generate": {
"title": "Generate Keys",
"description": "Choose this if you want to generate new keys for the node"
}
},
"adopt": {
"title": "Adopt Existing Node",
"description": "Enter the credentials of the existing node you want to adopt",
"nodeIdLabel": "Node ID",
"nodeIdDescription": "The ID of the existing node you want to adopt",
"secretLabel": "Secret",
"secretDescription": "The secret key of the existing node",
"submitButton": "Adopt Node"
},
"generate": {
"title": "Generated Credentials",
"description": "Use these generated credentials to configure your node",
"nodeIdTitle": "Node ID",
"secretTitle": "Secret",
"saveCredentialsTitle": "Add Credentials to Config",
"saveCredentialsDescription": "Add these credentials to your self-hosted Pangolin node configuration file to complete the connection.",
"submitButton": "Create Node"
},
"validation": {
"adoptRequired": "Node ID and Secret are required when adopting an existing node"
},
"errors": {
"loadDefaultsFailed": "Failed to load defaults",
"defaultsNotLoaded": "Defaults not loaded",
"createFailed": "Failed to create node"
},
"success": {
"created": "Node created successfully"
}
},
"remoteExitNodeSelection": "Node Selection",
"remoteExitNodeSelectionDescription": "Select a node to route traffic through for this local site",
"remoteExitNodeRequired": "A node must be selected for local sites",
"noRemoteExitNodesAvailable": "No Nodes Available",
"noRemoteExitNodesAvailableDescription": "No nodes are available for this organization. Create a node first to use local sites.",
"exitNode": "Exit Node",
"country": "Country",
"rulesMatchCountry": "Currently based on source IP",
"managedSelfHosted": {
"title": "Managed Self-Hosted",
"description": "More reliable and low-maintenance self-hosted Pangolin server with extra bells and whistles",
"introTitle": "Managed Self-Hosted Pangolin",
"introDescription": "is a deployment option designed for people who want simplicity and extra reliability while still keeping their data private and self-hosted.",
"introDetail": "With this option, you still run your own Pangolin node — your tunnels, SSL termination, and traffic all stay on your server. The difference is that management and monitoring are handled through our cloud dashboard, which unlocks a number of benefits:",
"benefitSimplerOperations": {
"title": "Simpler operations",
"description": "No need to run your own mail server or set up complex alerting. You'll get health checks and downtime alerts out of the box."
},
"benefitAutomaticUpdates": {
"title": "Automatic updates",
"description": "The cloud dashboard evolves quickly, so you get new features and bug fixes without having to manually pull new containers every time."
},
"benefitLessMaintenance": {
"title": "Less maintenance",
"description": "No database migrations, backups, or extra infrastructure to manage. We handle that in the cloud."
},
"benefitCloudFailover": {
"title": "Cloud failover",
"description": "If your node goes down, your tunnels can temporarily fail over to our cloud points of presence until you bring it back online."
},
"benefitHighAvailability": {
"title": "High availability (PoPs)",
"description": "You can also attach multiple nodes to your account for redundancy and better performance."
},
"benefitFutureEnhancements": {
"title": "Future enhancements",
"description": "We're planning to add more analytics, alerting, and management tools to make your deployment even more robust."
},
"docsAlert": {
"text": "Learn more about the Managed Self-Hosted option in our",
"documentation": "documentation"
},
"convertButton": "Convert This Node to Managed Self-Hosted"
},
"internationaldomaindetected": "International Domain Detected",
"willbestoredas": "Will be stored as:",
"roleMappingDescription": "Determine how roles are assigned to users when they sign in when Auto Provision is enabled.",
"selectRole": "Select a Role",
"roleMappingExpression": "Expression",
"selectRolePlaceholder": "Choose a role",
"selectRoleDescription": "Select a role to assign to all users from this identity provider",
"roleMappingExpressionDescription": "Enter a JMESPath expression to extract role information from the ID token",
"idpTenantIdRequired": "Tenant ID is required",
"invalidValue": "Invalid value",
"idpTypeLabel": "Identity Provider Type",
"roleMappingExpressionPlaceholder": "e.g., contains(groups, 'admin') && 'Admin' || 'Member'",
"idpGoogleConfiguration": "Google Configuration",
"idpGoogleConfigurationDescription": "Configure your Google OAuth2 credentials",
"idpGoogleClientIdDescription": "Your Google OAuth2 Client ID",
"idpGoogleClientSecretDescription": "Your Google OAuth2 Client Secret",
"idpAzureConfiguration": "Azure Entra ID Configuration",
"idpAzureConfigurationDescription": "Configure your Azure Entra ID OAuth2 credentials",
"idpTenantId": "Tenant ID",
"idpTenantIdPlaceholder": "your-tenant-id",
"idpAzureTenantIdDescription": "Your Azure tenant ID (found in Azure Active Directory overview)",
"idpAzureClientIdDescription": "Your Azure App Registration Client ID",
"idpAzureClientSecretDescription": "Your Azure App Registration Client Secret",
"idpGoogleTitle": "Google",
"idpGoogleAlt": "Google",
"idpAzureTitle": "Azure Entra ID",
"idpAzureAlt": "Azure",
"idpGoogleConfigurationTitle": "Google Configuration",
"idpAzureConfigurationTitle": "Azure Entra ID Configuration",
"idpTenantIdLabel": "Tenant ID",
"idpAzureClientIdDescription2": "Your Azure App Registration Client ID",
"idpAzureClientSecretDescription2": "Your Azure App Registration Client Secret",
"idpGoogleDescription": "Google OAuth2/OIDC provider",
"idpAzureDescription": "Microsoft Azure OAuth2/OIDC provider",
"subnet": "Subnet",
"subnetDescription": "The subnet for this organization's network configuration.",
"authPage": "Auth Page",
"authPageDescription": "Configure the auth page for your organization",
"authPageDomain": "Auth Page Domain",
"noDomainSet": "No domain set",
"changeDomain": "Change Domain",
"selectDomain": "Select Domain",
"restartCertificate": "Restart Certificate",
"editAuthPageDomain": "Edit Auth Page Domain",
"setAuthPageDomain": "Set Auth Page Domain",
"failedToFetchCertificate": "Failed to fetch certificate",
"failedToRestartCertificate": "Failed to restart certificate",
"addDomainToEnableCustomAuthPages": "Add a domain to enable custom authentication pages for your organization",
"selectDomainForOrgAuthPage": "Select a domain for the organization's authentication page",
"domainPickerProvidedDomain": "Provided Domain",
"domainPickerFreeProvidedDomain": "Free Provided Domain",
"domainPickerVerified": "Verified",
"domainPickerUnverified": "Unverified",
"domainPickerInvalidSubdomainStructure": "This subdomain contains invalid characters or structure. It will be sanitized automatically when you save.",
"domainPickerError": "Error",
"domainPickerErrorLoadDomains": "Failed to load organization domains",
"domainPickerErrorCheckAvailability": "Failed to check domain availability",
"domainPickerInvalidSubdomain": "Invalid subdomain",
"domainPickerInvalidSubdomainRemoved": "The input \"{sub}\" was removed because it's not valid.",
"domainPickerInvalidSubdomainCannotMakeValid": "\"{sub}\" could not be made valid for {domain}.",
"domainPickerSubdomainSanitized": "Subdomain sanitized",
"domainPickerSubdomainCorrected": "\"{sub}\" was corrected to \"{sanitized}\"",
"orgAuthSignInTitle": "Sign in to your organization",
"orgAuthChooseIdpDescription": "Choose your identity provider to continue",
"orgAuthNoIdpConfigured": "This organization doesn't have any identity providers configured. You can log in with your Pangolin identity instead.",
"orgAuthSignInWithPangolin": "Sign in with Pangolin",
"subscriptionRequiredToUse": "A subscription is required to use this feature.",
"idpDisabled": "Identity providers are disabled.",
"orgAuthPageDisabled": "Organization auth page is disabled.",
"domainRestartedDescription": "Domain verification restarted successfully",
"resourceAddEntrypointsEditFile": "Edit file: config/traefik/traefik_config.yml",
"resourceExposePortsEditFile": "Edit file: docker-compose.yml",
"emailVerificationRequired": "Email verification is required. Please log in again via {dashboardUrl}/auth/login complete this step. Then, come back here.",
"twoFactorSetupRequired": "Two-factor authentication setup is required. Please log in again via {dashboardUrl}/auth/login complete this step. Then, come back here.",
"authPageErrorUpdateMessage": "An error occurred while updating the auth page settings",
"authPageUpdated": "Auth page updated successfully",
"healthCheckNotAvailable": "Local",
"rewritePath": "Rewrite Path",
"rewritePathDescription": "Optionally rewrite the path before forwarding to the target.",
"continueToApplication": "Continue to application",
"checkingInvite": "Checking Invite",
"setResourceHeaderAuth": "setResourceHeaderAuth",
"resourceHeaderAuthRemove": "Remove Header Auth",
"resourceHeaderAuthRemoveDescription": "Header authentication removed successfully.",
"resourceErrorHeaderAuthRemove": "Failed to remove Header Authentication",
"resourceErrorHeaderAuthRemoveDescription": "Could not remove header authentication for the resource.",
"resourceHeaderAuthProtectionEnabled": "Header Authentication Enabled",
"resourceHeaderAuthProtectionDisabled": "Header Authentication Disabled",
"headerAuthRemove": "Remove Header Auth",
"headerAuthAdd": "Add Header Auth",
"resourceErrorHeaderAuthSetup": "Failed to set Header Authentication",
"resourceErrorHeaderAuthSetupDescription": "Could not set header authentication for the resource.",
"resourceHeaderAuthSetup": "Header Authentication set successfully",
"resourceHeaderAuthSetupDescription": "Header authentication has been successfully set.",
"resourceHeaderAuthSetupTitle": "Set Header Authentication",
"resourceHeaderAuthSetupTitleDescription": "Set the basic auth credentials (username and password) to protect this resource with HTTP Header Authentication. Access it using the format https://username:password@resource.example.com",
"resourceHeaderAuthSubmit": "Set Header Authentication",
"actionSetResourceHeaderAuth": "Set Header Authentication",
"enterpriseEdition": "Enterprise Edition",
"unlicensed": "Unlicensed",
"beta": "Beta",
"manageClients": "Manage Clients",
"manageClientsDescription": "Clients are devices that can connect to your sites",
"licenseTableValidUntil": "Valid Until",
"saasLicenseKeysSettingsTitle": "Enterprise Licenses",
"saasLicenseKeysSettingsDescription": "Generate and manage Enterprise license keys for self-hosted Pangolin instances",
"sidebarEnterpriseLicenses": "Licenses",
"generateLicenseKey": "Generate License Key",
"generateLicenseKeyForm": {
"validation": {
"emailRequired": "Please enter a valid email address",
"useCaseTypeRequired": "Please select a use case type",
"firstNameRequired": "First name is required",
"lastNameRequired": "Last name is required",
"primaryUseRequired": "Please describe your primary use",
"jobTitleRequiredBusiness": "Job title is required for business use",
"industryRequiredBusiness": "Industry is required for business use",
"stateProvinceRegionRequired": "State/Province/Region is required",
"postalZipCodeRequired": "Postal/ZIP Code is required",
"companyNameRequiredBusiness": "Company name is required for business use",
"countryOfResidenceRequiredBusiness": "Country of residence is required for business use",
"countryRequiredPersonal": "Country is required for personal use",
"agreeToTermsRequired": "You must agree to the terms",
"complianceConfirmationRequired": "You must confirm compliance with the Fossorial Commercial License"
},
"useCaseOptions": {
"personal": {
"title": "Personal Use",
"description": "For individual, non-commercial use such as learning, personal projects, or experimentation."
},
"business": {
"title": "Business Use",
"description": "For use within organizations, companies, or commercial or revenue-generating activities."
}
},
"steps": {
"emailLicenseType": {
"title": "Email & License Type",
"description": "Enter your email and choose your license type"
},
"personalInformation": {
"title": "Personal Information",
"description": "Tell us about yourself"
},
"contactInformation": {
"title": "Contact Information",
"description": "Your contact details"
},
"termsGenerate": {
"title": "Terms & Generate",
"description": "Review and accept terms to generate your license"
}
},
"alerts": {
"commercialUseDisclosure": {
"title": "Usage Disclosure",
"description": "Select the license tier that accurately reflects your intended use. The Personal License permits free use of the Software for individual, non-commercial or small-scale commercial activities with annual gross revenue under $100,000 USD. Any use beyond these limits — including use within a business, organization, or other revenue-generating environment — requires a valid Enterprise License and payment of the applicable licensing fee. All users, whether Personal or Enterprise, must comply with the Fossorial Commercial License Terms."
},
"trialPeriodInformation": {
"title": "Trial Period Information",
"description": "This License Key enables Enterprise features for a 7-day evaluation period. Continued access to Paid Features beyond the evaluation period requires activation under a valid Personal or Enterprise License. For Enterprise licensing, contact sales@fossorial.io."
}
},
"form": {
"useCaseQuestion": "Are you using Pangolin for personal or business use?",
"firstName": "First Name",
"lastName": "Last Name",
"jobTitle": "Job Title",
"primaryUseQuestion": "What do you primarily plan to use Pangolin for?",
"industryQuestion": "What is your industry?",
"prospectiveUsersQuestion": "How many prospective users do you expect to have?",
"prospectiveSitesQuestion": "How many prospective sites (tunnels) do you expect to have?",
"companyName": "Company name",
"countryOfResidence": "Country of residence",
"stateProvinceRegion": "State / Province / Region",
"postalZipCode": "Postal / ZIP Code",
"companyWebsite": "Company website",
"companyPhoneNumber": "Company phone number",
"country": "Country",
"phoneNumberOptional": "Phone number (optional)",
"complianceConfirmation": "I confirm that the information I provided is accurate and that I am in compliance with the Fossorial Commercial License. Reporting inaccurate information or misidentifying use of the product is a violation of the license and may result in your key getting revoked."
},
"buttons": {
"close": "Close",
"previous": "Previous",
"next": "Next",
"generateLicenseKey": "Generate License Key"
},
"toasts": {
"success": {
"title": "License key generated successfully",
"description": "Your license key has been generated and is ready to use."
},
"error": {
"title": "Failed to generate license key",
"description": "An error occurred while generating the license key."
}
}
},
"priority": "Priority",
"priorityDescription": "Higher priority routes are evaluated first. Priority = 100 means automatic ordering (system decides). Use another number to enforce manual priority.",
"instanceName": "Instance Name",
"pathMatchModalTitle": "Configure Path Matching",
"pathMatchModalDescription": "Set up how incoming requests should be matched based on their path.",
"pathMatchType": "Match Type",
"pathMatchPrefix": "Prefix",
"pathMatchExact": "Exact",
"pathMatchRegex": "Regex",
"pathMatchValue": "Path Value",
"clear": "Clear",
"saveChanges": "Save Changes",
"pathMatchRegexPlaceholder": "^/api/.*",
"pathMatchDefaultPlaceholder": "/path",
"pathMatchPrefixHelp": "Example: /api matches /api, /api/users, etc.",
"pathMatchExactHelp": "Example: /api matches only /api",
"pathMatchRegexHelp": "Example: ^/api/.* matches /api/anything",
"pathRewriteModalTitle": "Configure Path Rewriting",
"pathRewriteModalDescription": "Transform the matched path before forwarding to the target.",
"pathRewriteType": "Rewrite Type",
"pathRewritePrefixOption": "Prefix - Replace prefix",
"pathRewriteExactOption": "Exact - Replace entire path",
"pathRewriteRegexOption": "Regex - Pattern replacement",
"pathRewriteStripPrefixOption": "Strip Prefix - Remove prefix",
"pathRewriteValue": "Rewrite Value",
"pathRewriteRegexPlaceholder": "/new/$1",
"pathRewriteDefaultPlaceholder": "/new-path",
"pathRewritePrefixHelp": "Replace the matched prefix with this value",
"pathRewriteExactHelp": "Replace the entire path with this value when the path matches exactly",
"pathRewriteRegexHelp": "Use capture groups like $1, $2 for replacement",
"pathRewriteStripPrefixHelp": "Leave empty to strip prefix or provide new prefix",
"pathRewritePrefix": "Prefix",
"pathRewriteExact": "Exact",
"pathRewriteRegex": "Regex",
"pathRewriteStrip": "Strip",
"pathRewriteStripLabel": "strip",
"sidebarEnableEnterpriseLicense": "Enable Enterprise License"
}

View File

@@ -11,8 +11,9 @@
"componentsErrorNoMemberCreate": "Actualmente no eres miembro de ninguna organización. Crea una organización para empezar.",
"componentsErrorNoMember": "Actualmente no eres miembro de ninguna organización.",
"welcome": "Bienvenido a Pangolin",
"welcomeTo": "Bienvenido a",
"componentsCreateOrg": "Crear una organización",
"componentsMember": "¡Eres un miembro de {count, plural, =0 {¡Ninguna organización} =1 {¡una organización} other {# organizaciones}}.",
"componentsMember": "Eres un miembro de {count, plural, =0 {ninguna organización} one {una organización} other {# organizaciones}}.",
"componentsInvalidKey": "Se han detectado claves de licencia inválidas o caducadas. Siga los términos de licencia para seguir usando todas las características.",
"dismiss": "Descartar",
"componentsLicenseViolation": "Violación de la Licencia: Este servidor está usando sitios {usedSites} que exceden su límite de licencias de sitios {maxSites} . Siga los términos de licencia para seguir usando todas las características.",
@@ -58,7 +59,6 @@
"siteErrorCreate": "Error al crear el sitio",
"siteErrorCreateKeyPair": "Por defecto no se encuentra el par de claves o el sitio",
"siteErrorCreateDefaults": "Sitio por defecto no encontrado",
"siteNameDescription": "Este es el nombre para mostrar el sitio.",
"method": "Método",
"siteMethodDescription": "Así es como se expondrán las conexiones.",
"siteLearnNewt": "Aprende cómo instalar Newt en tu sistema",
@@ -67,7 +67,7 @@
"siteDocker": "Expandir para detalles de despliegue de Docker",
"toggle": "Cambiar",
"dockerCompose": "Componer Docker",
"dockerRun": "Docker Run",
"dockerRun": "Ejecutar Docker",
"siteLearnLocal": "Los sitios locales no tienen túnel, aprender más",
"siteConfirmCopy": "He copiado la configuración",
"searchSitesProgress": "Buscar sitios...",
@@ -94,7 +94,9 @@
"siteNewtTunnelDescription": "La forma más fácil de crear un punto de entrada en tu red. Sin configuración adicional.",
"siteWg": "Wirex Guardia Básica",
"siteWgDescription": "Utilice cualquier cliente Wirex Guard para establecer un túnel. Se requiere una configuración manual de NAT.",
"siteWgDescriptionSaas": "Utilice cualquier cliente de WireGuard para establecer un túnel. Se requiere configuración manual de NAT. SOLO FUNCIONA EN NODOS AUTOGESTIONADOS",
"siteLocalDescription": "Solo recursos locales. Sin túneles.",
"siteLocalDescriptionSaas": "Local resources only. No tunneling. Only available on remote nodes.",
"siteSeeAll": "Ver todos los sitios",
"siteTunnelDescription": "Determina cómo quieres conectarte a tu sitio",
"siteNewtCredentials": "Credenciales nuevas",
@@ -166,7 +168,10 @@
"siteSelect": "Seleccionar sitio",
"siteSearch": "Buscar sitio",
"siteNotFound": "Sitio no encontrado.",
"siteSelectionDescription": "Este sitio proporcionará conectividad al recurso.",
"selectCountry": "Seleccionar país",
"searchCountries": "Buscar países...",
"noCountryFound": "Ningún país encontrado.",
"siteSelectionDescription": "Este sitio proporcionará conectividad al objetivo.",
"resourceType": "Tipo de recurso",
"resourceTypeDescription": "Determina cómo quieres acceder a tu recurso",
"resourceHTTPSSettings": "Configuración HTTPS",
@@ -197,15 +202,18 @@
"general": "General",
"generalSettings": "Configuración General",
"proxy": "Proxy",
"internal": "Interno",
"rules": "Reglas",
"resourceSettingDescription": "Configure la configuración de su recurso",
"resourceSetting": "Ajustes {resourceName}",
"alwaysAllow": "Permitir siempre",
"alwaysDeny": "Denegar siempre",
"passToAuth": "Pasar a Autenticación",
"orgSettingsDescription": "Configurar la configuración general de su organización",
"orgGeneralSettings": "Configuración de la organización",
"orgGeneralSettingsDescription": "Administra los detalles y la configuración de tu organización",
"saveGeneralSettings": "Guardar ajustes generales",
"saveSettings": "Guardar ajustes",
"orgDangerZone": "Zona de peligro",
"orgDangerZoneDescription": "Una vez que elimines este órgano, no hay vuelta atrás. Por favor, asegúrate de ello.",
"orgDelete": "Eliminar organización",
@@ -249,7 +257,7 @@
"weeks": "Semanas",
"months": "Meses",
"years": "Años",
"day": "{count, plural, =1 {# día} other {# días}}",
"day": "{count, plural, one {# día} other {# días}}",
"apiKeysTitle": "Información de Clave API",
"apiKeysConfirmCopy2": "Debes confirmar que has copiado la clave API.",
"apiKeysErrorCreate": "Error al crear la clave API",
@@ -347,7 +355,7 @@
"licensePurchase": "Comprar Licencia",
"licensePurchaseSites": "Comprar sitios adicionales",
"licenseSitesUsedMax": "{usedSites} de {maxSites} sitios usados",
"licenseSitesUsed": "{count, plural, =0 {# sitios} =1 {# sitio} other {# sitios}} en el sistema.",
"licenseSitesUsed": "{count, plural, =0 {# sitios} one {# sitio} other {# sitios}} en el sistema.",
"licensePurchaseDescription": "Elige cuántos sitios quieres {selectedMode, select, license {compra una licencia para. Siempre puedes añadir más sitios más tarde.} other {añadir a tu licencia existente.}}",
"licenseFee": "Tarifa de licencia",
"licensePriceSite": "Precio por sitio",
@@ -436,7 +444,7 @@
"accessRoleSelect": "Seleccionar rol",
"inviteEmailSentDescription": "Se ha enviado un correo electrónico al usuario con el siguiente enlace de acceso. Debe acceder al enlace para aceptar la invitación.",
"inviteSentDescription": "El usuario ha sido invitado. Debe acceder al enlace de abajo para aceptar la invitación.",
"inviteExpiresIn": "La invitación expirará en {days, plural, =1 {# día} other {# días}}.",
"inviteExpiresIn": "La invitación expirará en {days, plural, one {# día} other {# días}}.",
"idpTitle": "Proveedor de identidad",
"idpSelect": "Seleccione el proveedor de identidad para el usuario externo",
"idpNotConfigured": "No hay proveedores de identidad configurados. Por favor, configure un proveedor de identidad antes de crear usuarios externos.",
@@ -449,6 +457,8 @@
"accessRoleErrorAddDescription": "Ocurrió un error mientras se añadía el usuario al rol.",
"userSaved": "Usuario guardado",
"userSavedDescription": "El usuario ha sido actualizado.",
"autoProvisioned": "Auto asegurado",
"autoProvisionedDescription": "Permitir a este usuario ser administrado automáticamente por el proveedor de identidad",
"accessControlsDescription": "Administrar lo que este usuario puede acceder y hacer en la organización",
"accessControlsSubmit": "Guardar controles de acceso",
"roles": "Roles",
@@ -458,7 +468,10 @@
"createdAt": "Creado el",
"proxyErrorInvalidHeader": "Valor de cabecera de host personalizado no válido. Utilice el formato de nombre de dominio, o guarde en blanco para desestablecer cabecera de host personalizada.",
"proxyErrorTls": "Nombre de servidor TLS inválido. Utilice el formato de nombre de dominio o guarde en blanco para eliminar el nombre de servidor TLS.",
"proxyEnableSSL": "Habilitar SSL (https)",
"proxyEnableSSL": "Activar SSL",
"proxyEnableSSLDescription": "Activa el cifrado SSL/TLS para conexiones seguras HTTPS a tus objetivos.",
"target": "Target",
"configureTarget": "Configurar objetivos",
"targetErrorFetch": "Error al recuperar los objetivos",
"targetErrorFetchDescription": "Se ha producido un error al recuperar los objetivos",
"siteErrorFetch": "No se pudo obtener el recurso",
@@ -485,7 +498,7 @@
"targetTlsSettings": "Configuración de conexión segura",
"targetTlsSettingsDescription": "Configurar ajustes SSL/TLS para su recurso",
"targetTlsSettingsAdvanced": "Ajustes avanzados de TLS",
"targetTlsSni": "Nombre del servidor TLS (SNI)",
"targetTlsSni": "Nombre del servidor TLS",
"targetTlsSniDescription": "El nombre del servidor TLS a usar para SNI. Deje en blanco para usar el valor predeterminado.",
"targetTlsSubmit": "Guardar ajustes",
"targets": "Configuración de objetivos",
@@ -494,9 +507,21 @@
"targetStickySessionsDescription": "Mantener conexiones en el mismo objetivo de backend para toda su sesión.",
"methodSelect": "Seleccionar método",
"targetSubmit": "Añadir destino",
"targetNoOne": "No hay objetivos. Agregue un objetivo usando el formulario.",
"targetNoOne": "Este recurso no tiene ningún objetivo. Agrega un objetivo para configurar dónde enviar peticiones al backend.",
"targetNoOneDescription": "Si se añade más de un objetivo anterior se activará el balance de carga.",
"targetsSubmit": "Guardar objetivos",
"addTarget": "Añadir destino",
"targetErrorInvalidIp": "Dirección IP inválida",
"targetErrorInvalidIpDescription": "Por favor, introduzca una dirección IP válida o nombre de host",
"targetErrorInvalidPort": "Puerto inválido",
"targetErrorInvalidPortDescription": "Por favor, introduzca un número de puerto válido",
"targetErrorNoSite": "Ningún sitio seleccionado",
"targetErrorNoSiteDescription": "Por favor, seleccione un sitio para el objetivo",
"targetCreated": "Objetivo creado",
"targetCreatedDescription": "El objetivo se ha creado correctamente",
"targetErrorCreate": "Error al crear el objetivo",
"targetErrorCreateDescription": "Se ha producido un error al crear el objetivo",
"save": "Guardar",
"proxyAdditional": "Ajustes adicionales del proxy",
"proxyAdditionalDescription": "Configura cómo tu recurso maneja la configuración del proxy",
"proxyCustomHeader": "Cabecera de host personalizada",
@@ -506,6 +531,7 @@
"ipAddressErrorInvalidFormat": "Formato de dirección IP inválido",
"ipAddressErrorInvalidOctet": "Octet de dirección IP no válido",
"path": "Ruta",
"matchPath": "Coincidir ruta",
"ipAddressRange": "Rango IP",
"rulesErrorFetch": "Error al obtener las reglas",
"rulesErrorFetchDescription": "Se ha producido un error al recuperar las reglas",
@@ -541,6 +567,7 @@
"rulesActions": "Acciones",
"rulesActionAlwaysAllow": "Permitir siempre: pasar todos los métodos de autenticación",
"rulesActionAlwaysDeny": "Denegar siempre: Bloquear todas las peticiones; no se puede intentar autenticación",
"rulesActionPassToAuth": "Pasar a Autenticación: Permitir que se intenten los métodos de autenticación",
"rulesMatchCriteria": "Criterios coincidentes",
"rulesMatchCriteriaIpAddress": "Coincidir con una dirección IP específica",
"rulesMatchCriteriaIpAddressRange": "Coincide con un rango de direcciones IP en notación CIDR",
@@ -703,7 +730,7 @@
"pangolinServerAdmin": "Admin Servidor - Pangolin",
"licenseTierProfessional": "Licencia profesional",
"licenseTierEnterprise": "Licencia Enterprise",
"licenseTierCommercial": "Licencia comercial",
"licenseTierPersonal": "Personal License",
"licensed": "Licenciado",
"yes": "Sí",
"no": "Nu",
@@ -738,7 +765,7 @@
"idpDisplayName": "Un nombre mostrado para este proveedor de identidad",
"idpAutoProvisionUsers": "Auto-Provisión de Usuarios",
"idpAutoProvisionUsersDescription": "Cuando está habilitado, los usuarios serán creados automáticamente en el sistema al iniciar sesión con la capacidad de asignar a los usuarios a roles y organizaciones.",
"licenseBadge": "Profesional",
"licenseBadge": "EE",
"idpType": "Tipo de proveedor",
"idpTypeDescription": "Seleccione el tipo de proveedor de identidad que desea configurar",
"idpOidcConfigure": "Configuración OAuth2/OIDC",
@@ -805,7 +832,7 @@
"redirectUrl": "URL de redirección",
"redirectUrlAbout": "Acerca de la URL de redirección",
"redirectUrlAboutDescription": "Esta es la URL a la que los usuarios serán redireccionados después de la autenticación. Necesitas configurar esta URL en la configuración de tu proveedor de identidad.",
"pangolinAuth": "Auth - Pangolin",
"pangolinAuth": "Autenticación - Pangolin",
"verificationCodeLengthRequirements": "Tu código de verificación debe tener 8 caracteres.",
"errorOccurred": "Se ha producido un error",
"emailErrorVerify": "No se pudo verificar el email:",
@@ -832,6 +859,24 @@
"pincodeRequirementsLength": "El PIN debe tener exactamente 6 dígitos",
"pincodeRequirementsChars": "El PIN sólo debe contener números",
"passwordRequirementsLength": "La contraseña debe tener al menos 1 carácter",
"passwordRequirementsTitle": "Requisitos de la contraseña:",
"passwordRequirementLength": "Al menos 8 caracteres de largo",
"passwordRequirementUppercase": "Al menos una letra mayúscula",
"passwordRequirementLowercase": "Al menos una letra minúscula",
"passwordRequirementNumber": "Al menos un número",
"passwordRequirementSpecial": "Al menos un carácter especial",
"passwordRequirementsMet": "✓ La contraseña cumple con todos los requisitos",
"passwordStrength": "Seguridad de la contraseña",
"passwordStrengthWeak": "Débil",
"passwordStrengthMedium": "Media",
"passwordStrengthStrong": "Fuerte",
"passwordRequirements": "Requisitos:",
"passwordRequirementLengthText": "8+ caracteres",
"passwordRequirementUppercaseText": "Letra mayúscula (A-Z)",
"passwordRequirementLowercaseText": "Letra minúscula (a-z)",
"passwordRequirementNumberText": "Número (0-9)",
"passwordRequirementSpecialText": "Caracter especial (!@#$%...)",
"passwordsDoNotMatch": "Las contraseñas no coinciden",
"otpEmailRequirementsLength": "OTP debe tener al menos 1 carácter",
"otpEmailSent": "OTP enviado",
"otpEmailSentDescription": "Un OTP ha sido enviado a tu correo electrónico",
@@ -951,19 +996,28 @@
"logoutError": "Error al cerrar sesión",
"signingAs": "Conectado como",
"serverAdmin": "Admin Servidor",
"managedSelfhosted": "Autogestionado",
"otpEnable": "Activar doble factor",
"otpDisable": "Desactivar doble factor",
"logout": "Cerrar sesión",
"licenseTierProfessionalRequired": "Edición Profesional requerida",
"licenseTierProfessionalRequiredDescription": "Esta característica sólo está disponible en la Edición Profesional.",
"actionGetOrg": "Obtener organización",
"updateOrgUser": "Actualizar usuario Org",
"createOrgUser": "Crear usuario Org",
"actionUpdateOrg": "Actualizar organización",
"actionUpdateUser": "Actualizar usuario",
"actionGetUser": "Obtener usuario",
"actionGetOrgUser": "Obtener usuario de la organización",
"actionListOrgDomains": "Listar dominios de la organización",
"actionCreateSite": "Crear sitio",
"actionDeleteSite": "Eliminar sitio",
"actionGetSite": "Obtener sitio",
"actionListSites": "Listar sitios",
"actionApplyBlueprint": "Aplicar plano",
"setupToken": "Configuración de token",
"setupTokenDescription": "Ingrese el token de configuración desde la consola del servidor.",
"setupTokenRequired": "Se requiere el token de configuración",
"actionUpdateSite": "Actualizar sitio",
"actionListSiteRoles": "Lista de roles permitidos del sitio",
"actionCreateResource": "Crear Recurso",
@@ -1019,6 +1073,17 @@
"actionDeleteIdpOrg": "Eliminar política de IDP Org",
"actionListIdpOrgs": "Listar Orgs IDP",
"actionUpdateIdpOrg": "Actualizar IDP Org",
"actionCreateClient": "Crear cliente",
"actionDeleteClient": "Eliminar cliente",
"actionUpdateClient": "Actualizar cliente",
"actionListClients": "Listar clientes",
"actionGetClient": "Obtener cliente",
"actionCreateSiteResource": "Crear Recurso del Sitio",
"actionDeleteSiteResource": "Eliminar recurso del sitio",
"actionGetSiteResource": "Obtener recurso del sitio",
"actionListSiteResources": "Listar recursos del sitio",
"actionUpdateSiteResource": "Actualizar recurso del sitio",
"actionListInvitations": "Listar invitaciones",
"noneSelected": "Ninguno seleccionado",
"orgNotFound2": "No se encontraron organizaciones.",
"searchProgress": "Buscar...",
@@ -1034,7 +1099,6 @@
"navbar": "Menú de navegación",
"navbarDescription": "Menú de navegación principal para la aplicación",
"navbarDocsLink": "Documentación",
"commercialEdition": "Edición Comercial",
"otpErrorEnable": "No se puede habilitar 2FA",
"otpErrorEnableDescription": "Se ha producido un error al habilitar 2FA",
"otpSetupCheckCode": "Por favor, introduzca un código de 6 dígitos",
@@ -1090,8 +1154,10 @@
"sidebarAllUsers": "Todos los usuarios",
"sidebarIdentityProviders": "Proveedores de identidad",
"sidebarLicense": "Licencia",
"enableDockerSocket": "Habilitar conector Docker",
"enableDockerSocketDescription": "Habilitar el descubrimiento de Docker Socket para completar la información del contenedor. La ruta del socket debe proporcionarse a Newt.",
"sidebarClients": "Clients",
"sidebarDomains": "Dominios",
"enableDockerSocket": "Habilitar Plano Docker",
"enableDockerSocketDescription": "Activar el raspado de etiquetas de Socket Docker para etiquetas de planos. La ruta del Socket debe proporcionarse a Newt.",
"enableDockerSocketLink": "Saber más",
"viewDockerContainers": "Ver contenedores Docker",
"containersIn": "Contenedores en {siteName}",
@@ -1102,7 +1168,7 @@
"containerNetworks": "Redes",
"containerHostnameIp": "Nombre del host/IP",
"containerLabels": "Etiquetas",
"containerLabelsCount": "{count} etiqueta{s,plural,one{} other{s}}",
"containerLabelsCount": "{count, plural, one {# etiqueta} other {# etiquetas}}",
"containerLabelsTitle": "Etiquetas de contenedor",
"containerLabelEmpty": "<vacío>",
"containerPorts": "Puertos",
@@ -1114,7 +1180,7 @@
"showStoppedContainers": "Mostrar contenedores parados",
"noContainersFound": "No se han encontrado contenedores. Asegúrate de que los contenedores Docker se estén ejecutando.",
"searchContainersPlaceholder": "Buscar a través de contenedores {count}...",
"searchResultsCount": "{count} resultado{s,plural,one{} other{s}}",
"searchResultsCount": "{count, plural, one {# resultado} other {# resultados}}",
"filters": "Filtros",
"filterOptions": "Opciones de filtro",
"filterPorts": "Puertos",
@@ -1129,8 +1195,703 @@
"dark": "oscuro",
"system": "sistema",
"theme": "Tema",
"subnetRequired": "Se requiere subred",
"initialSetupTitle": "Configuración inicial del servidor",
"initialSetupDescription": "Cree la cuenta de administrador del servidor inicial. Solo puede existir un administrador del servidor. Siempre puede cambiar estas credenciales más tarde.",
"createAdminAccount": "Crear cuenta de administrador",
"setupErrorCreateAdmin": "Se produjo un error al crear la cuenta de administrador del servidor."
"setupErrorCreateAdmin": "Se produjo un error al crear la cuenta de administrador del servidor.",
"certificateStatus": "Estado del certificado",
"loading": "Cargando",
"restart": "Reiniciar",
"domains": "Dominios",
"domainsDescription": "Administrar dominios de tu organización",
"domainsSearch": "Buscar dominios...",
"domainAdd": "Agregar dominio",
"domainAddDescription": "Registrar un nuevo dominio con tu organización",
"domainCreate": "Crear dominio",
"domainCreatedDescription": "Dominio creado con éxito",
"domainDeletedDescription": "Dominio eliminado exitosamente",
"domainQuestionRemove": "¿Está seguro de que desea eliminar el dominio {domain} de su cuenta?",
"domainMessageRemove": "Una vez eliminado, el dominio ya no estará asociado con su cuenta.",
"domainMessageConfirm": "Para confirmar, por favor escriba el nombre del dominio abajo.",
"domainConfirmDelete": "Confirmar eliminación del dominio",
"domainDelete": "Eliminar dominio",
"domain": "Dominio",
"selectDomainTypeNsName": "Delegación de dominio (NS)",
"selectDomainTypeNsDescription": "Este dominio y todos sus subdominios. Usa esto cuando quieras controlar una zona de dominio completa.",
"selectDomainTypeCnameName": "Dominio único (CNAME)",
"selectDomainTypeCnameDescription": "Solo este dominio específico. Úsalo para subdominios individuales o entradas específicas de dominio.",
"selectDomainTypeWildcardName": "Dominio comodín",
"selectDomainTypeWildcardDescription": "Este dominio y sus subdominios.",
"domainDelegation": "Dominio único",
"selectType": "Selecciona un tipo",
"actions": "Acciones",
"refresh": "Actualizar",
"refreshError": "Error al actualizar datos",
"verified": "Verificado",
"pending": "Pendiente",
"sidebarBilling": "Facturación",
"billing": "Facturación",
"orgBillingDescription": "Gestiona tu información de facturación y suscripciones",
"github": "GitHub",
"pangolinHosted": "Pangolin Alojado",
"fossorial": "Fossorial",
"completeAccountSetup": "Completar configuración de cuenta",
"completeAccountSetupDescription": "Establece tu contraseña para comenzar",
"accountSetupSent": "Enviaremos un código de configuración de cuenta a esta dirección de correo electrónico.",
"accountSetupCode": "Código de configuración",
"accountSetupCodeDescription": "Revisa tu correo para el código de configuración.",
"passwordCreate": "Crear contraseña",
"passwordCreateConfirm": "Confirmar contraseña",
"accountSetupSubmit": "Enviar código de configuración",
"completeSetup": "Completar configuración",
"accountSetupSuccess": "¡Configuración de cuenta completada! ¡Bienvenido a Pangolin!",
"documentation": "Documentación",
"saveAllSettings": "Guardar todos los ajustes",
"settingsUpdated": "Ajustes actualizados",
"settingsUpdatedDescription": "Todos los ajustes han sido actualizados exitosamente",
"settingsErrorUpdate": "Error al actualizar ajustes",
"settingsErrorUpdateDescription": "Ocurrió un error al actualizar ajustes",
"sidebarCollapse": "Colapsar",
"sidebarExpand": "Expandir",
"newtUpdateAvailable": "Nueva actualización disponible",
"newtUpdateAvailableInfo": "Hay una nueva versión de Newt disponible. Actualice a la última versión para la mejor experiencia.",
"domainPickerEnterDomain": "Dominio",
"domainPickerPlaceholder": "miapp.ejemplo.com",
"domainPickerDescription": "Ingresa el dominio completo del recurso para ver las opciones disponibles.",
"domainPickerDescriptionSaas": "Ingresa un dominio completo, subdominio o simplemente un nombre para ver las opciones disponibles",
"domainPickerTabAll": "Todo",
"domainPickerTabOrganization": "Organización",
"domainPickerTabProvided": "Proporcionado",
"domainPickerSortAsc": "A-Z",
"domainPickerSortDesc": "Z-A",
"domainPickerCheckingAvailability": "Comprobando disponibilidad...",
"domainPickerNoMatchingDomains": "No se encontraron dominios que coincidan. Intente con un dominio diferente o verifique la configuración de dominios de su organización.",
"domainPickerOrganizationDomains": "Dominios de la organización",
"domainPickerProvidedDomains": "Dominios proporcionados",
"domainPickerSubdomain": "Subdominio: {subdomain}",
"domainPickerNamespace": "Espacio de nombres: {namespace}",
"domainPickerShowMore": "Mostrar más",
"regionSelectorTitle": "Seleccionar Región",
"regionSelectorInfo": "Seleccionar una región nos ayuda a brindar un mejor rendimiento para tu ubicación. No tienes que estar en la misma región que tu servidor.",
"regionSelectorPlaceholder": "Elige una región",
"regionSelectorComingSoon": "Próximamente",
"billingLoadingSubscription": "Cargando suscripción...",
"billingFreeTier": "Nivel Gratis",
"billingWarningOverLimit": "Advertencia: Has excedido uno o más límites de uso. Tus sitios no se conectarán hasta que modifiques tu suscripción o ajustes tu uso.",
"billingUsageLimitsOverview": "Descripción general de los límites de uso",
"billingMonitorUsage": "Monitorea tu uso comparado con los límites configurados. Si necesitas que aumenten los límites, contáctanos a soporte@fossorial.io.",
"billingDataUsage": "Uso de datos",
"billingOnlineTime": "Tiempo en línea del sitio",
"billingUsers": "Usuarios activos",
"billingDomains": "Dominios activos",
"billingRemoteExitNodes": "Nodos autogestionados activos",
"billingNoLimitConfigured": "No se ha configurado ningún límite",
"billingEstimatedPeriod": "Período de facturación estimado",
"billingIncludedUsage": "Uso incluido",
"billingIncludedUsageDescription": "Uso incluido con su plan de suscripción actual",
"billingFreeTierIncludedUsage": "Permisos de uso del nivel gratuito",
"billingIncluded": "incluido",
"billingEstimatedTotal": "Total Estimado:",
"billingNotes": "Notas",
"billingEstimateNote": "Esta es una estimación basada en tu uso actual.",
"billingActualChargesMayVary": "Los cargos reales pueden variar.",
"billingBilledAtEnd": "Se te facturará al final del período de facturación.",
"billingModifySubscription": "Modificar Suscripción",
"billingStartSubscription": "Iniciar Suscripción",
"billingRecurringCharge": "Cargo Recurrente",
"billingManageSubscriptionSettings": "Administra la configuración y preferencias de tu suscripción",
"billingNoActiveSubscription": "No tienes una suscripción activa. Inicia tu suscripción para aumentar los límites de uso.",
"billingFailedToLoadSubscription": "Error al cargar la suscripción",
"billingFailedToLoadUsage": "Error al cargar el uso",
"billingFailedToGetCheckoutUrl": "Error al obtener la URL de pago",
"billingPleaseTryAgainLater": "Por favor, inténtelo de nuevo más tarde.",
"billingCheckoutError": "Error de pago",
"billingFailedToGetPortalUrl": "Error al obtener la URL del portal",
"billingPortalError": "Error del portal",
"billingDataUsageInfo": "Se le cobran todos los datos transferidos a través de sus túneles seguros cuando se conectan a la nube. Esto incluye tanto tráfico entrante como saliente a través de todos sus sitios. Cuando alcance su límite, sus sitios se desconectarán hasta que actualice su plan o reduzca el uso. Los datos no se cargan cuando se usan nodos.",
"billingOnlineTimeInfo": "Se te cobrará en función del tiempo que tus sitios permanezcan conectados a la nube. Por ejemplo, 44.640 minutos equivale a un sitio que funciona 24/7 durante un mes completo. Cuando alcance su límite, sus sitios se desconectarán hasta que mejore su plan o reduzca el uso. No se cargará el tiempo al usar nodos.",
"billingUsersInfo": "Se te cobra por cada usuario en tu organización. La facturación se calcula diariamente según la cantidad de cuentas de usuario activas en tu organización.",
"billingDomainInfo": "Se te cobra por cada dominio en tu organización. La facturación se calcula diariamente según la cantidad de cuentas de dominio activas en tu organización.",
"billingRemoteExitNodesInfo": "Se te cobra por cada nodo gestionado en tu organización. La facturación se calcula diariamente según la cantidad de nodos gestionados activos en tu organización.",
"domainNotFound": "Dominio no encontrado",
"domainNotFoundDescription": "Este recurso está deshabilitado porque el dominio ya no existe en nuestro sistema. Por favor, establece un nuevo dominio para este recurso.",
"failed": "Fallido",
"createNewOrgDescription": "Crear una nueva organización",
"organization": "Organización",
"port": "Puerto",
"securityKeyManage": "Gestionar llaves de seguridad",
"securityKeyDescription": "Agregar o eliminar llaves de seguridad para autenticación sin contraseña",
"securityKeyRegister": "Registrar nueva llave de seguridad",
"securityKeyList": "Tus llaves de seguridad",
"securityKeyNone": "No hay llaves de seguridad registradas",
"securityKeyNameRequired": "El nombre es requerido",
"securityKeyRemove": "Eliminar",
"securityKeyLastUsed": "Último uso: {date}",
"securityKeyNameLabel": "Nombre",
"securityKeyRegisterSuccess": "Llave de seguridad registrada exitosamente",
"securityKeyRegisterError": "Error al registrar la llave de seguridad",
"securityKeyRemoveSuccess": "Llave de seguridad eliminada exitosamente",
"securityKeyRemoveError": "Error al eliminar la llave de seguridad",
"securityKeyLoadError": "Error al cargar las llaves de seguridad",
"securityKeyLogin": "Continuar con clave de seguridad",
"securityKeyAuthError": "Error al autenticar con llave de seguridad",
"securityKeyRecommendation": "Considere registrar otra llave de seguridad en un dispositivo diferente para asegurarse de no quedar bloqueado de su cuenta.",
"registering": "Registrando...",
"securityKeyPrompt": "Por favor, verifica tu identidad usando tu llave de seguridad. Asegúrate de que tu llave de seguridad esté conectada y lista.",
"securityKeyBrowserNotSupported": "Tu navegador no admite llaves de seguridad. Por favor, usa un navegador moderno como Chrome, Firefox o Safari.",
"securityKeyPermissionDenied": "Por favor, permite el acceso a tu llave de seguridad para continuar iniciando sesión.",
"securityKeyRemovedTooQuickly": "Por favor, mantén tu llave de seguridad conectada hasta que el proceso de inicio de sesión se complete.",
"securityKeyNotSupported": "Tu llave de seguridad puede no ser compatible. Por favor, prueba con una llave de seguridad diferente.",
"securityKeyUnknownError": "Hubo un problema al usar tu llave de seguridad. Por favor, inténtalo de nuevo.",
"twoFactorRequired": "Se requiere autenticación de dos factores para registrar una llave de seguridad.",
"twoFactor": "Autenticación de dos factores",
"adminEnabled2FaOnYourAccount": "Su administrador ha habilitado la autenticación de dos factores para {email}. Por favor, complete el proceso de configuración para continuar.",
"securityKeyAdd": "Agregar llave de seguridad",
"securityKeyRegisterTitle": "Registrar nueva llave de seguridad",
"securityKeyRegisterDescription": "Conecta tu llave de seguridad y escribe un nombre para identificarla",
"securityKeyTwoFactorRequired": "Se requiere autenticación de dos factores",
"securityKeyTwoFactorDescription": "Por favor, ingresa tu código de autenticación de dos factores para registrar la llave de seguridad",
"securityKeyTwoFactorRemoveDescription": "Por favor, ingresa tu código de autenticación de dos factores para eliminar la llave de seguridad",
"securityKeyTwoFactorCode": "Código de autenticación de dos factores",
"securityKeyRemoveTitle": "Eliminar llave de seguridad",
"securityKeyRemoveDescription": "Ingresa tu contraseña para eliminar la llave de seguridad \"{name}\"",
"securityKeyNoKeysRegistered": "No hay llaves de seguridad registradas",
"securityKeyNoKeysDescription": "Agrega una llave de seguridad para mejorar la seguridad de tu cuenta",
"createDomainRequired": "Se requiere dominio",
"createDomainAddDnsRecords": "Agregar registros DNS",
"createDomainAddDnsRecordsDescription": "Agrega los siguientes registros DNS a tu proveedor de dominios para completar la configuración.",
"createDomainNsRecords": "Registros NS",
"createDomainRecord": "Registro",
"createDomainType": "Tipo:",
"createDomainName": "Nombre:",
"createDomainValue": "Valor:",
"createDomainCnameRecords": "Registros CNAME",
"createDomainARecords": "Registros A",
"createDomainRecordNumber": "Registro {number}",
"createDomainTxtRecords": "Registros TXT",
"createDomainSaveTheseRecords": "Guardar estos registros",
"createDomainSaveTheseRecordsDescription": "Asegúrate de guardar estos registros DNS ya que no los verás de nuevo.",
"createDomainDnsPropagation": "Propagación DNS",
"createDomainDnsPropagationDescription": "Los cambios de DNS pueden tardar un tiempo en propagarse a través de internet. Esto puede tardar desde unos pocos minutos hasta 48 horas, dependiendo de tu proveedor de DNS y la configuración de TTL.",
"resourcePortRequired": "Se requiere número de puerto para recursos no HTTP",
"resourcePortNotAllowed": "El número de puerto no debe establecerse para recursos HTTP",
"billingPricingCalculatorLink": "Calculadora de Precios",
"signUpTerms": {
"IAgreeToThe": "Estoy de acuerdo con los",
"termsOfService": "términos del servicio",
"and": "y",
"privacyPolicy": "política de privacidad"
},
"siteRequired": "El sitio es requerido.",
"olmTunnel": "Túnel Olm",
"olmTunnelDescription": "Usar Olm para la conectividad del cliente",
"errorCreatingClient": "Error al crear el cliente",
"clientDefaultsNotFound": "Configuración predeterminada del cliente no encontrada",
"createClient": "Crear cliente",
"createClientDescription": "Crear un cliente nuevo para conectar a sus sitios",
"seeAllClients": "Ver todos los clientes",
"clientInformation": "Información del cliente",
"clientNamePlaceholder": "Nombre del cliente",
"address": "Dirección",
"subnetPlaceholder": "Subred",
"addressDescription": "La dirección que este cliente utilizará para la conectividad",
"selectSites": "Seleccionar sitios",
"sitesDescription": "El cliente tendrá conectividad con los sitios seleccionados",
"clientInstallOlm": "Instalar Olm",
"clientInstallOlmDescription": "Obtén Olm funcionando en tu sistema",
"clientOlmCredentials": "Credenciales Olm",
"clientOlmCredentialsDescription": "Así es como Olm se autentificará con el servidor",
"olmEndpoint": "Punto final Olm",
"olmId": "ID de Olm",
"olmSecretKey": "Clave secreta de Olm",
"clientCredentialsSave": "Guarda tus credenciales",
"clientCredentialsSaveDescription": "Sólo podrás verlo una vez. Asegúrate de copiarlo a un lugar seguro.",
"generalSettingsDescription": "Configura la configuración general para este cliente",
"clientUpdated": "Cliente actualizado",
"clientUpdatedDescription": "El cliente ha sido actualizado.",
"clientUpdateFailed": "Error al actualizar el cliente",
"clientUpdateError": "Se ha producido un error al actualizar el cliente.",
"sitesFetchFailed": "Error al obtener los sitios",
"sitesFetchError": "Se ha producido un error al recuperar los sitios.",
"olmErrorFetchReleases": "Se ha producido un error al recuperar las versiones de Olm.",
"olmErrorFetchLatest": "Se ha producido un error al recuperar la última versión de Olm.",
"remoteSubnets": "Subredes remotas",
"enterCidrRange": "Ingresa el rango CIDR",
"remoteSubnetsDescription": "Agregue rangos CIDR que se puedan acceder desde este sitio de forma remota usando clientes. Utilice el formato como 10.0.0.0/24. Esto SOLO se aplica a la conectividad del cliente VPN.",
"resourceEnableProxy": "Habilitar proxy público",
"resourceEnableProxyDescription": "Habilite el proxy público para este recurso. Esto permite el acceso al recurso desde fuera de la red a través de la nube en un puerto abierto. Requiere configuración de Traefik.",
"externalProxyEnabled": "Proxy externo habilitado",
"addNewTarget": "Agregar nuevo destino",
"targetsList": "Lista de destinos",
"advancedMode": "Modo avanzado",
"targetErrorDuplicateTargetFound": "Se encontró un destino duplicado",
"healthCheckHealthy": "Saludable",
"healthCheckUnhealthy": "No saludable",
"healthCheckUnknown": "Desconocido",
"healthCheck": "Chequeo de salud",
"configureHealthCheck": "Configurar Chequeo de Salud",
"configureHealthCheckDescription": "Configura la monitorización de salud para {target}",
"enableHealthChecks": "Activar Chequeos de Salud",
"enableHealthChecksDescription": "Controlar la salud de este objetivo. Puedes supervisar un punto final diferente al objetivo si es necesario.",
"healthScheme": "Método",
"healthSelectScheme": "Seleccionar método",
"healthCheckPath": "Ruta",
"healthHostname": "IP / Nombre del host",
"healthPort": "Puerto",
"healthCheckPathDescription": "La ruta para comprobar el estado de salud.",
"healthyIntervalSeconds": "Intervalo Saludable",
"unhealthyIntervalSeconds": "Intervalo No Saludable",
"IntervalSeconds": "Intervalo Saludable",
"timeoutSeconds": "Tiempo de Espera",
"timeIsInSeconds": "El tiempo está en segundos",
"retryAttempts": "Intentos de Reintento",
"expectedResponseCodes": "Códigos de respuesta esperados",
"expectedResponseCodesDescription": "Código de estado HTTP que indica un estado saludable. Si se deja en blanco, se considera saludable de 200 a 300.",
"customHeaders": "Cabeceras personalizadas",
"customHeadersDescription": "Nueva línea de cabeceras separada: Nombre de cabecera: valor",
"headersValidationError": "Los encabezados deben estar en el formato: Nombre de cabecera: valor.",
"saveHealthCheck": "Guardar Chequeo de Salud",
"healthCheckSaved": "Chequeo de Salud Guardado",
"healthCheckSavedDescription": "La configuración del chequeo de salud se ha guardado correctamente",
"healthCheckError": "Error en el Chequeo de Salud",
"healthCheckErrorDescription": "Ocurrió un error al guardar la configuración del chequeo de salud",
"healthCheckPathRequired": "Se requiere la ruta del chequeo de salud",
"healthCheckMethodRequired": "Se requiere el método HTTP",
"healthCheckIntervalMin": "El intervalo de comprobación debe ser de al menos 5 segundos",
"healthCheckTimeoutMin": "El tiempo de espera debe ser de al menos 1 segundo",
"healthCheckRetryMin": "Los intentos de reintento deben ser de al menos 1",
"httpMethod": "Método HTTP",
"selectHttpMethod": "Seleccionar método HTTP",
"domainPickerSubdomainLabel": "Subdominio",
"domainPickerBaseDomainLabel": "Dominio base",
"domainPickerSearchDomains": "Buscar dominios...",
"domainPickerNoDomainsFound": "No se encontraron dominios",
"domainPickerLoadingDomains": "Cargando dominios...",
"domainPickerSelectBaseDomain": "Seleccionar dominio base...",
"domainPickerNotAvailableForCname": "No disponible para dominios CNAME",
"domainPickerEnterSubdomainOrLeaveBlank": "Ingrese subdominio o deje en blanco para usar dominio base.",
"domainPickerEnterSubdomainToSearch": "Ingrese un subdominio para buscar y seleccionar entre dominios gratuitos disponibles.",
"domainPickerFreeDomains": "Dominios gratuitos",
"domainPickerSearchForAvailableDomains": "Buscar dominios disponibles",
"domainPickerNotWorkSelfHosted": "Nota: Los dominios gratuitos proporcionados no están disponibles para instancias autogestionadas por ahora.",
"resourceDomain": "Dominio",
"resourceEditDomain": "Editar dominio",
"siteName": "Nombre del sitio",
"proxyPort": "Puerto",
"resourcesTableProxyResources": "Recursos de proxy",
"resourcesTableClientResources": "Recursos del cliente",
"resourcesTableNoProxyResourcesFound": "No se encontraron recursos de proxy.",
"resourcesTableNoInternalResourcesFound": "No se encontraron recursos internos.",
"resourcesTableDestination": "Destino",
"resourcesTableTheseResourcesForUseWith": "Estos recursos son para uso con",
"resourcesTableClients": "Clientes",
"resourcesTableAndOnlyAccessibleInternally": "y solo son accesibles internamente cuando se conectan con un cliente.",
"editInternalResourceDialogEditClientResource": "Editar recurso del cliente",
"editInternalResourceDialogUpdateResourceProperties": "Actualizar las propiedades del recurso y la configuración del objetivo para {resourceName}.",
"editInternalResourceDialogResourceProperties": "Propiedades del recurso",
"editInternalResourceDialogName": "Nombre",
"editInternalResourceDialogProtocol": "Protocolo",
"editInternalResourceDialogSitePort": "Puerto del sitio",
"editInternalResourceDialogTargetConfiguration": "Configuración de objetivos",
"editInternalResourceDialogCancel": "Cancelar",
"editInternalResourceDialogSaveResource": "Guardar recurso",
"editInternalResourceDialogSuccess": "Éxito",
"editInternalResourceDialogInternalResourceUpdatedSuccessfully": "Recurso interno actualizado con éxito",
"editInternalResourceDialogError": "Error",
"editInternalResourceDialogFailedToUpdateInternalResource": "Error al actualizar el recurso interno",
"editInternalResourceDialogNameRequired": "El nombre es requerido",
"editInternalResourceDialogNameMaxLength": "El nombre no debe tener más de 255 caracteres",
"editInternalResourceDialogProxyPortMin": "El puerto del proxy debe ser al menos 1",
"editInternalResourceDialogProxyPortMax": "El puerto del proxy debe ser menor de 65536",
"editInternalResourceDialogInvalidIPAddressFormat": "Formato de dirección IP inválido",
"editInternalResourceDialogDestinationPortMin": "El puerto de destino debe ser al menos 1",
"editInternalResourceDialogDestinationPortMax": "El puerto de destino debe ser menor de 65536",
"createInternalResourceDialogNoSitesAvailable": "No hay sitios disponibles",
"createInternalResourceDialogNoSitesAvailableDescription": "Necesita tener al menos un sitio de Newt con una subred configurada para crear recursos internos.",
"createInternalResourceDialogClose": "Cerrar",
"createInternalResourceDialogCreateClientResource": "Crear recurso del cliente",
"createInternalResourceDialogCreateClientResourceDescription": "Crear un nuevo recurso que será accesible para los clientes conectados al sitio seleccionado.",
"createInternalResourceDialogResourceProperties": "Propiedades del recurso",
"createInternalResourceDialogName": "Nombre",
"createInternalResourceDialogSite": "Sitio",
"createInternalResourceDialogSelectSite": "Seleccionar sitio...",
"createInternalResourceDialogSearchSites": "Buscar sitios...",
"createInternalResourceDialogNoSitesFound": "Sitios no encontrados.",
"createInternalResourceDialogProtocol": "Protocolo",
"createInternalResourceDialogTcp": "TCP",
"createInternalResourceDialogUdp": "UDP",
"createInternalResourceDialogSitePort": "Puerto del sitio",
"createInternalResourceDialogSitePortDescription": "Use este puerto para acceder al recurso en el sitio cuando se conecta con un cliente.",
"createInternalResourceDialogTargetConfiguration": "Configuración de objetivos",
"createInternalResourceDialogDestinationIPDescription": "La dirección IP o nombre de host del recurso en la red del sitio.",
"createInternalResourceDialogDestinationPortDescription": "El puerto en la IP de destino donde el recurso es accesible.",
"createInternalResourceDialogCancel": "Cancelar",
"createInternalResourceDialogCreateResource": "Crear recurso",
"createInternalResourceDialogSuccess": "Éxito",
"createInternalResourceDialogInternalResourceCreatedSuccessfully": "Recurso interno creado con éxito",
"createInternalResourceDialogError": "Error",
"createInternalResourceDialogFailedToCreateInternalResource": "Error al crear recurso interno",
"createInternalResourceDialogNameRequired": "El nombre es requerido",
"createInternalResourceDialogNameMaxLength": "El nombre debe ser menor de 255 caracteres",
"createInternalResourceDialogPleaseSelectSite": "Por favor seleccione un sitio",
"createInternalResourceDialogProxyPortMin": "El puerto del proxy debe ser al menos 1",
"createInternalResourceDialogProxyPortMax": "El puerto del proxy debe ser menor de 65536",
"createInternalResourceDialogInvalidIPAddressFormat": "Formato de dirección IP inválido",
"createInternalResourceDialogDestinationPortMin": "El puerto de destino debe ser al menos 1",
"createInternalResourceDialogDestinationPortMax": "El puerto de destino debe ser menor de 65536",
"siteConfiguration": "Configuración",
"siteAcceptClientConnections": "Aceptar conexiones de clientes",
"siteAcceptClientConnectionsDescription": "Permitir que otros dispositivos se conecten a través de esta instancia Newt como una puerta de enlace utilizando clientes.",
"siteAddress": "Dirección del sitio",
"siteAddressDescription": "Especifique la dirección IP del host que los clientes deben usar para conectarse. Esta es la dirección interna del sitio en la red de Pangolín para que los clientes dirijan. Debe estar dentro de la subred de la organización.",
"autoLoginExternalIdp": "Inicio de sesión automático con IDP externo",
"autoLoginExternalIdpDescription": "Redirigir inmediatamente al usuario al IDP externo para autenticación.",
"selectIdp": "Seleccionar IDP",
"selectIdpPlaceholder": "Elegir un IDP...",
"selectIdpRequired": "Por favor seleccione un IDP cuando el inicio de sesión automático esté habilitado.",
"autoLoginTitle": "Redirigiendo",
"autoLoginDescription": "Te estamos redirigiendo al proveedor de identidad externo para autenticación.",
"autoLoginProcessing": "Preparando autenticación...",
"autoLoginRedirecting": "Redirigiendo al inicio de sesión...",
"autoLoginError": "Error de inicio de sesión automático",
"autoLoginErrorNoRedirectUrl": "No se recibió URL de redirección del proveedor de identidad.",
"autoLoginErrorGeneratingUrl": "Error al generar URL de autenticación.",
"remoteExitNodeManageRemoteExitNodes": "Nodos remotos",
"remoteExitNodeDescription": "Self-host one or more remote nodes to extend your network connectivity and reduce reliance on the cloud",
"remoteExitNodes": "Nodos",
"searchRemoteExitNodes": "Buscar nodos...",
"remoteExitNodeAdd": "Añadir Nodo",
"remoteExitNodeErrorDelete": "Error al eliminar el nodo",
"remoteExitNodeQuestionRemove": "¿Está seguro de que desea eliminar el nodo {selectedNode} de la organización?",
"remoteExitNodeMessageRemove": "Una vez eliminado, el nodo ya no será accesible.",
"remoteExitNodeMessageConfirm": "Para confirmar, por favor escriba el nombre del nodo a continuación.",
"remoteExitNodeConfirmDelete": "Confirmar eliminar nodo",
"remoteExitNodeDelete": "Eliminar Nodo",
"sidebarRemoteExitNodes": "Nodos remotos",
"remoteExitNodeCreate": {
"title": "Crear Nodo",
"description": "Crear un nuevo nodo para extender la conectividad de red",
"viewAllButton": "Ver todos los nodos",
"strategy": {
"title": "Estrategia de Creación",
"description": "Elija esto para configurar manualmente su nodo o generar nuevas credenciales.",
"adopt": {
"title": "Adoptar Nodo",
"description": "Elija esto si ya tiene las credenciales para el nodo."
},
"generate": {
"title": "Generar Claves",
"description": "Elija esto si desea generar nuevas claves para el nodo"
}
},
"adopt": {
"title": "Adoptar Nodo Existente",
"description": "Introduzca las credenciales del nodo existente que desea adoptar",
"nodeIdLabel": "ID del nodo",
"nodeIdDescription": "El ID del nodo existente que desea adoptar",
"secretLabel": "Secreto",
"secretDescription": "La clave secreta del nodo existente",
"submitButton": "Adoptar Nodo"
},
"generate": {
"title": "Credenciales Generadas",
"description": "Utilice estas credenciales generadas para configurar su nodo",
"nodeIdTitle": "ID del nodo",
"secretTitle": "Secreto",
"saveCredentialsTitle": "Agregar Credenciales a la Configuración",
"saveCredentialsDescription": "Agrega estas credenciales a tu archivo de configuración del nodo Pangolin autogestionado para completar la conexión.",
"submitButton": "Crear Nodo"
},
"validation": {
"adoptRequired": "El ID del nodo y el secreto son necesarios al adoptar un nodo existente"
},
"errors": {
"loadDefaultsFailed": "Falló al cargar los valores predeterminados",
"defaultsNotLoaded": "Valores predeterminados no cargados",
"createFailed": "Error al crear el nodo"
},
"success": {
"created": "Nodo creado correctamente"
}
},
"remoteExitNodeSelection": "Selección de nodo",
"remoteExitNodeSelectionDescription": "Seleccione un nodo a través del cual enrutar el tráfico para este sitio local",
"remoteExitNodeRequired": "Un nodo debe ser seleccionado para sitios locales",
"noRemoteExitNodesAvailable": "No hay nodos disponibles",
"noRemoteExitNodesAvailableDescription": "No hay nodos disponibles para esta organización. Crea un nodo primero para usar sitios locales.",
"exitNode": "Nodo de Salida",
"country": "País",
"rulesMatchCountry": "Actualmente basado en IP de origen",
"managedSelfHosted": {
"title": "Autogestionado",
"description": "Servidor Pangolin autoalojado más fiable y de bajo mantenimiento con campanas y silbidos extra",
"introTitle": "Pangolin autogestionado",
"introDescription": "es una opción de despliegue diseñada para personas que quieren simplicidad y fiabilidad extra mientras mantienen sus datos privados y autoalojados.",
"introDetail": "Con esta opción, todavía ejecuta su propio nodo Pangolin, sus túneles, terminación SSL y tráfico permanecen en su servidor. La diferencia es que la gestión y el control se gestionan a través de nuestro panel de control en la nube, que desbloquea una serie de ventajas:",
"benefitSimplerOperations": {
"title": "Operaciones simples",
"description": "No necesitas ejecutar tu propio servidor de correo o configurar alertas complejas. Recibirás cheques de salud y alertas de tiempo de inactividad."
},
"benefitAutomaticUpdates": {
"title": "Actualizaciones automáticas",
"description": "El tablero de la nube evolucionará rápidamente, por lo que obtendrá nuevas características y correcciones de errores sin tener que extraer manualmente nuevos contenedores cada vez."
},
"benefitLessMaintenance": {
"title": "Menos mantenimiento",
"description": "No hay migraciones de base de datos, copias de seguridad o infraestructura extra para administrar. Lo manejamos en la nube."
},
"benefitCloudFailover": {
"title": "Fallo en la nube",
"description": "Si tu nodo cae, tus túneles pueden fallar temporalmente a nuestros puntos de presencia en la nube hasta que lo vuelvas a conectar."
},
"benefitHighAvailability": {
"title": "Alta disponibilidad (PoPs)",
"description": "También puede adjuntar múltiples nodos a su cuenta para redundancia y mejor rendimiento."
},
"benefitFutureEnhancements": {
"title": "Mejoras futuras",
"description": "Estamos planeando añadir más herramientas analíticas, alertas y de administración para hacer su despliegue aún más robusto."
},
"docsAlert": {
"text": "Aprenda más acerca de la opción de autoalojamiento administrado en nuestra",
"documentation": "documentación"
},
"convertButton": "Convierte este nodo a autoalojado administrado"
},
"internationaldomaindetected": "Dominio Internacional detectado",
"willbestoredas": "Se almacenará como:",
"roleMappingDescription": "Determinar cómo se asignan los roles a los usuarios cuando se registran cuando está habilitada la provisión automática.",
"selectRole": "Seleccione un rol",
"roleMappingExpression": "Expresión",
"selectRolePlaceholder": "Elija un rol",
"selectRoleDescription": "Seleccione un rol para asignar a todos los usuarios de este proveedor de identidad",
"roleMappingExpressionDescription": "Introduzca una expresión JMESPath para extraer información de rol del token de ID",
"idpTenantIdRequired": "El ID del cliente es obligatorio",
"invalidValue": "Valor inválido",
"idpTypeLabel": "Tipo de proveedor de identidad",
"roleMappingExpressionPlaceholder": "e.g., contiene(grupos, 'administrador') && 'administrador' || 'miembro'",
"idpGoogleConfiguration": "Configuración de Google",
"idpGoogleConfigurationDescription": "Configura tus credenciales de Google OAuth2",
"idpGoogleClientIdDescription": "Tu ID de cliente de Google OAuth2",
"idpGoogleClientSecretDescription": "Tu secreto de cliente de Google OAuth2",
"idpAzureConfiguration": "Configuración de Azure Entra ID",
"idpAzureConfigurationDescription": "Configure sus credenciales de Azure Entra ID OAuth2",
"idpTenantId": "ID del inquilino",
"idpTenantIdPlaceholder": "su-inquilino-id",
"idpAzureTenantIdDescription": "Su ID de inquilino de Azure (encontrado en el resumen de Azure Active Directory)",
"idpAzureClientIdDescription": "Tu ID de Cliente de Registro de Azure App",
"idpAzureClientSecretDescription": "Tu Azure App Registro Cliente secreto",
"idpGoogleTitle": "Google",
"idpGoogleAlt": "Google",
"idpAzureTitle": "Azure Entra ID",
"idpAzureAlt": "Azure",
"idpGoogleConfigurationTitle": "Configuración de Google",
"idpAzureConfigurationTitle": "Configuración de Azure Entra ID",
"idpTenantIdLabel": "ID del inquilino",
"idpAzureClientIdDescription2": "Tu ID de Cliente de Registro de Azure App",
"idpAzureClientSecretDescription2": "Tu Azure App Registro Cliente secreto",
"idpGoogleDescription": "Proveedor OAuth2/OIDC de Google",
"idpAzureDescription": "Microsoft Azure OAuth2/OIDC provider",
"subnet": "Subred",
"subnetDescription": "La subred para la configuración de red de esta organización.",
"authPage": "Página Auth",
"authPageDescription": "Configurar la página de autenticación de su organización",
"authPageDomain": "Dominio de la página Auth",
"noDomainSet": "Ningún dominio establecido",
"changeDomain": "Cambiar dominio",
"selectDomain": "Seleccionar dominio",
"restartCertificate": "Reiniciar certificado",
"editAuthPageDomain": "Editar dominio Auth Page",
"setAuthPageDomain": "Establecer dominio Auth Page",
"failedToFetchCertificate": "Error al obtener el certificado",
"failedToRestartCertificate": "Error al reiniciar el certificado",
"addDomainToEnableCustomAuthPages": "Añadir un dominio para habilitar páginas de autenticación personalizadas para su organización",
"selectDomainForOrgAuthPage": "Seleccione un dominio para la página de autenticación de la organización",
"domainPickerProvidedDomain": "Dominio proporcionado",
"domainPickerFreeProvidedDomain": "Dominio proporcionado gratis",
"domainPickerVerified": "Verificado",
"domainPickerUnverified": "Sin verificar",
"domainPickerInvalidSubdomainStructure": "Este subdominio contiene caracteres o estructura no válidos. Se limpiará automáticamente al guardar.",
"domainPickerError": "Error",
"domainPickerErrorLoadDomains": "Error al cargar los dominios de la organización",
"domainPickerErrorCheckAvailability": "No se pudo comprobar la disponibilidad del dominio",
"domainPickerInvalidSubdomain": "Subdominio inválido",
"domainPickerInvalidSubdomainRemoved": "La entrada \"{sub}\" fue eliminada porque no es válida.",
"domainPickerInvalidSubdomainCannotMakeValid": "No se ha podido hacer válido \"{sub}\" para {domain}.",
"domainPickerSubdomainSanitized": "Subdominio saneado",
"domainPickerSubdomainCorrected": "\"{sub}\" fue corregido a \"{sanitized}\"",
"orgAuthSignInTitle": "Inicia sesión en tu organización",
"orgAuthChooseIdpDescription": "Elige tu proveedor de identidad para continuar",
"orgAuthNoIdpConfigured": "Esta organización no tiene ningún proveedor de identidad configurado. En su lugar puedes iniciar sesión con tu identidad de Pangolin.",
"orgAuthSignInWithPangolin": "Iniciar sesión con Pangolin",
"subscriptionRequiredToUse": "Se requiere una suscripción para utilizar esta función.",
"idpDisabled": "Los proveedores de identidad están deshabilitados.",
"orgAuthPageDisabled": "La página de autenticación de la organización está deshabilitada.",
"domainRestartedDescription": "Verificación de dominio reiniciada con éxito",
"resourceAddEntrypointsEditFile": "Editar archivo: config/traefik/traefik_config.yml",
"resourceExposePortsEditFile": "Editar archivo: docker-compose.yml",
"emailVerificationRequired": "Se requiere verificación de correo electrónico. Por favor, inicie sesión de nuevo a través de {dashboardUrl}/auth/login complete este paso. Luego, vuelva aquí.",
"twoFactorSetupRequired": "La configuración de autenticación de doble factor es requerida. Por favor, inicia sesión de nuevo a través de {dashboardUrl}/auth/login completa este paso. Luego, vuelve aquí.",
"authPageErrorUpdateMessage": "Ocurrió un error mientras se actualizaban los ajustes de la página auth",
"authPageUpdated": "Página auth actualizada correctamente",
"healthCheckNotAvailable": "Local",
"rewritePath": "Reescribir Ruta",
"rewritePathDescription": "Opcionalmente reescribe la ruta antes de reenviar al destino.",
"continueToApplication": "Continuar a la aplicación",
"checkingInvite": "Comprobando invitación",
"setResourceHeaderAuth": "set-Resource HeaderAuth",
"resourceHeaderAuthRemove": "Eliminar Auth del Encabezado",
"resourceHeaderAuthRemoveDescription": "Autenticación de cabecera eliminada correctamente.",
"resourceErrorHeaderAuthRemove": "Error al eliminar autenticación de cabecera",
"resourceErrorHeaderAuthRemoveDescription": "No se pudo eliminar la autenticación de cabecera del recurso.",
"resourceHeaderAuthProtectionEnabled": "Header Authentication Enabled",
"resourceHeaderAuthProtectionDisabled": "Header Authentication Disabled",
"headerAuthRemove": "Remove Header Auth",
"headerAuthAdd": "Add Header Auth",
"resourceErrorHeaderAuthSetup": "Error al establecer autenticación de cabecera",
"resourceErrorHeaderAuthSetupDescription": "No se pudo establecer autenticación de cabecera para el recurso.",
"resourceHeaderAuthSetup": "Autenticación de cabecera establecida correctamente",
"resourceHeaderAuthSetupDescription": "La autenticación de cabecera se ha establecido correctamente.",
"resourceHeaderAuthSetupTitle": "Establecer autenticación de cabecera",
"resourceHeaderAuthSetupTitleDescription": "Set the basic auth credentials (username and password) to protect this resource with HTTP Header Authentication. Access it using the format https://username:password@resource.example.com",
"resourceHeaderAuthSubmit": "Establecer autenticación de cabecera",
"actionSetResourceHeaderAuth": "Establecer autenticación de cabecera",
"enterpriseEdition": "Enterprise Edition",
"unlicensed": "Unlicensed",
"beta": "Beta",
"manageClients": "Manage Clients",
"manageClientsDescription": "Clients are devices that can connect to your sites",
"licenseTableValidUntil": "Valid Until",
"saasLicenseKeysSettingsTitle": "Enterprise Licenses",
"saasLicenseKeysSettingsDescription": "Generate and manage Enterprise license keys for self-hosted Pangolin instances",
"sidebarEnterpriseLicenses": "Licenses",
"generateLicenseKey": "Generate License Key",
"generateLicenseKeyForm": {
"validation": {
"emailRequired": "Please enter a valid email address",
"useCaseTypeRequired": "Please select a use case type",
"firstNameRequired": "First name is required",
"lastNameRequired": "Last name is required",
"primaryUseRequired": "Please describe your primary use",
"jobTitleRequiredBusiness": "Job title is required for business use",
"industryRequiredBusiness": "Industry is required for business use",
"stateProvinceRegionRequired": "State/Province/Region is required",
"postalZipCodeRequired": "Postal/ZIP Code is required",
"companyNameRequiredBusiness": "Company name is required for business use",
"countryOfResidenceRequiredBusiness": "Country of residence is required for business use",
"countryRequiredPersonal": "Country is required for personal use",
"agreeToTermsRequired": "You must agree to the terms",
"complianceConfirmationRequired": "You must confirm compliance with the Fossorial Commercial License"
},
"useCaseOptions": {
"personal": {
"title": "Personal Use",
"description": "For individual, non-commercial use such as learning, personal projects, or experimentation."
},
"business": {
"title": "Business Use",
"description": "For use within organizations, companies, or commercial or revenue-generating activities."
}
},
"steps": {
"emailLicenseType": {
"title": "Email & License Type",
"description": "Enter your email and choose your license type"
},
"personalInformation": {
"title": "Personal Information",
"description": "Tell us about yourself"
},
"contactInformation": {
"title": "Contact Information",
"description": "Your contact details"
},
"termsGenerate": {
"title": "Terms & Generate",
"description": "Review and accept terms to generate your license"
}
},
"alerts": {
"commercialUseDisclosure": {
"title": "Usage Disclosure",
"description": "Select the license tier that accurately reflects your intended use. The Personal License permits free use of the Software for individual, non-commercial or small-scale commercial activities with annual gross revenue under $100,000 USD. Any use beyond these limits — including use within a business, organization, or other revenue-generating environment — requires a valid Enterprise License and payment of the applicable licensing fee. All users, whether Personal or Enterprise, must comply with the Fossorial Commercial License Terms."
},
"trialPeriodInformation": {
"title": "Trial Period Information",
"description": "This License Key enables Enterprise features for a 7-day evaluation period. Continued access to Paid Features beyond the evaluation period requires activation under a valid Personal or Enterprise License. For Enterprise licensing, contact sales@fossorial.io."
}
},
"form": {
"useCaseQuestion": "Are you using Pangolin for personal or business use?",
"firstName": "First Name",
"lastName": "Last Name",
"jobTitle": "Job Title",
"primaryUseQuestion": "What do you primarily plan to use Pangolin for?",
"industryQuestion": "What is your industry?",
"prospectiveUsersQuestion": "How many prospective users do you expect to have?",
"prospectiveSitesQuestion": "How many prospective sites (tunnels) do you expect to have?",
"companyName": "Company name",
"countryOfResidence": "Country of residence",
"stateProvinceRegion": "State / Province / Region",
"postalZipCode": "Postal / ZIP Code",
"companyWebsite": "Company website",
"companyPhoneNumber": "Company phone number",
"country": "Country",
"phoneNumberOptional": "Phone number (optional)",
"complianceConfirmation": "I confirm that I am in compliance with the Fossorial Commercial License and that reporting inaccurate information or misidentifying use of the product is a violation of the license."
},
"buttons": {
"close": "Close",
"previous": "Previous",
"next": "Next",
"generateLicenseKey": "Generate License Key"
},
"toasts": {
"success": {
"title": "License key generated successfully",
"description": "Your license key has been generated and is ready to use."
},
"error": {
"title": "Failed to generate license key",
"description": "An error occurred while generating the license key."
}
}
},
"priority": "Prioridad",
"priorityDescription": "Las rutas de prioridad más alta son evaluadas primero. Prioridad = 100 significa orden automático (decisiones del sistema). Utilice otro número para hacer cumplir la prioridad manual.",
"instanceName": "Instance Name",
"pathMatchModalTitle": "Configure Path Matching",
"pathMatchModalDescription": "Set up how incoming requests should be matched based on their path.",
"pathMatchType": "Match Type",
"pathMatchPrefix": "Prefix",
"pathMatchExact": "Exact",
"pathMatchRegex": "Regex",
"pathMatchValue": "Path Value",
"clear": "Clear",
"saveChanges": "Save Changes",
"pathMatchRegexPlaceholder": "^/api/.*",
"pathMatchDefaultPlaceholder": "/path",
"pathMatchPrefixHelp": "Example: /api matches /api, /api/users, etc.",
"pathMatchExactHelp": "Example: /api matches only /api",
"pathMatchRegexHelp": "Example: ^/api/.* matches /api/anything",
"pathRewriteModalTitle": "Configure Path Rewriting",
"pathRewriteModalDescription": "Transform the matched path before forwarding to the target.",
"pathRewriteType": "Rewrite Type",
"pathRewritePrefixOption": "Prefix - Replace prefix",
"pathRewriteExactOption": "Exact - Replace entire path",
"pathRewriteRegexOption": "Regex - Pattern replacement",
"pathRewriteStripPrefixOption": "Strip Prefix - Remove prefix",
"pathRewriteValue": "Rewrite Value",
"pathRewriteRegexPlaceholder": "/new/$1",
"pathRewriteDefaultPlaceholder": "/new-path",
"pathRewritePrefixHelp": "Replace the matched prefix with this value",
"pathRewriteExactHelp": "Replace the entire path with this value when the path matches exactly",
"pathRewriteRegexHelp": "Use capture groups like $1, $2 for replacement",
"pathRewriteStripPrefixHelp": "Leave empty to strip prefix or provide new prefix",
"pathRewritePrefix": "Prefix",
"pathRewriteExact": "Exact",
"pathRewriteRegex": "Regex",
"pathRewriteStrip": "Strip",
"pathRewriteStripLabel": "strip"
}

View File

@@ -11,8 +11,9 @@
"componentsErrorNoMemberCreate": "Vous n'êtes actuellement membre d'aucune organisation. Créez une organisation pour commencer.",
"componentsErrorNoMember": "Vous n'êtes actuellement membre d'aucune organisation.",
"welcome": "Bienvenue à Pangolin",
"welcomeTo": "Bienvenue chez",
"componentsCreateOrg": "Créer une organisation",
"componentsMember": "Vous êtes membre de {count, plural, =0 {aucune organisation} =1 {Une organisation} other {# organisations}}.",
"componentsMember": "Vous êtes membre de {count, plural, =0 {aucune organisation} one {une organisation} other {# organisations}}.",
"componentsInvalidKey": "Clés de licence invalides ou expirées détectées. Suivez les conditions de licence pour continuer à utiliser toutes les fonctionnalités.",
"dismiss": "Refuser",
"componentsLicenseViolation": "Violation de licence : Ce serveur utilise des sites {usedSites} qui dépassent la limite autorisée des sites {maxSites} . Suivez les conditions de licence pour continuer à utiliser toutes les fonctionnalités.",
@@ -58,7 +59,6 @@
"siteErrorCreate": "Erreur lors de la création du site",
"siteErrorCreateKeyPair": "Paire de clés ou site par défaut introuvable",
"siteErrorCreateDefaults": "Les valeurs par défaut du site sont introuvables",
"siteNameDescription": "Ceci est le nom d'affichage du site.",
"method": "Méthode",
"siteMethodDescription": "C'est ainsi que vous exposerez les connexions.",
"siteLearnNewt": "Apprenez à installer Newt sur votre système",
@@ -94,7 +94,9 @@
"siteNewtTunnelDescription": "La façon la plus simple de créer un point d'entrée dans votre réseau. Pas de configuration supplémentaire.",
"siteWg": "WireGuard basique",
"siteWgDescription": "Utilisez n'importe quel client WireGuard pour établir un tunnel. Configuration NAT manuelle requise.",
"siteWgDescriptionSaas": "Utilisez n'importe quel client WireGuard pour établir un tunnel. Configuration NAT manuelle requise. FONCTIONNE UNIQUEMENT SUR DES NŒUDS AUTONOMES",
"siteLocalDescription": "Ressources locales seulement. Pas de tunneling.",
"siteLocalDescriptionSaas": "Local resources only. No tunneling. Only available on remote nodes.",
"siteSeeAll": "Voir tous les sites",
"siteTunnelDescription": "Déterminez comment vous voulez vous connecter à votre site",
"siteNewtCredentials": "Identifiants Newt",
@@ -166,7 +168,10 @@
"siteSelect": "Sélectionner un site",
"siteSearch": "Chercher un site",
"siteNotFound": "Aucun site trouvé.",
"siteSelectionDescription": "Ce site fournira la connectivité à la ressource.",
"selectCountry": "Sélectionnez un pays",
"searchCountries": "Recherchez des pays...",
"noCountryFound": "Aucun pays trouvé.",
"siteSelectionDescription": "Ce site fournira la connectivité à la cible.",
"resourceType": "Type de ressource",
"resourceTypeDescription": "Déterminer comment vous voulez accéder à votre ressource",
"resourceHTTPSSettings": "Paramètres HTTPS",
@@ -184,7 +189,7 @@
"cancel": "Abandonner",
"resourceConfig": "Snippets de configuration",
"resourceConfigDescription": "Copiez et collez ces modules de configuration pour configurer votre ressource TCP/UDP",
"resourceAddEntrypoints": "Traefik: Ajouter des points dentrée",
"resourceAddEntrypoints": "Traefik: Ajouter des points d'entrée",
"resourceExposePorts": "Gerbil: Exposer des ports dans Docker Compose",
"resourceLearnRaw": "Apprenez à configurer les ressources TCP/UDP",
"resourceBack": "Retour aux ressources",
@@ -197,15 +202,18 @@
"general": "Généraux",
"generalSettings": "Paramètres généraux",
"proxy": "Proxy",
"internal": "Interne",
"rules": "Règles",
"resourceSettingDescription": "Configurer les paramètres de votre ressource",
"resourceSetting": "Réglages {resourceName}",
"alwaysAllow": "Toujours autoriser",
"alwaysDeny": "Toujours refuser",
"passToAuth": "Paser à l'authentification",
"orgSettingsDescription": "Configurer les paramètres généraux de votre organisation",
"orgGeneralSettings": "Paramètres de l'organisation",
"orgGeneralSettingsDescription": "Gérer les détails et la configuration de votre organisation",
"saveGeneralSettings": "Enregistrer les paramètres généraux",
"saveSettings": "Enregistrer les paramètres",
"orgDangerZone": "Zone de danger",
"orgDangerZoneDescription": "Une fois que vous supprimez cette organisation, il n'y a pas de retour en arrière. Soyez certain.",
"orgDelete": "Supprimer l'organisation",
@@ -249,7 +257,7 @@
"weeks": "Semaines",
"months": "Mois",
"years": "Années",
"day": "{count, plural, =1 {# jour} other {# jours}}",
"day": "{count, plural, one {# jour} other {# jours}}",
"apiKeysTitle": "Informations sur la clé API",
"apiKeysConfirmCopy2": "Vous devez confirmer que vous avez copié la clé API.",
"apiKeysErrorCreate": "Erreur lors de la création de la clé API",
@@ -347,7 +355,7 @@
"licensePurchase": "Acheter une licence",
"licensePurchaseSites": "Acheter des sites supplémentaires",
"licenseSitesUsedMax": "{usedSites} des sites {maxSites} utilisés",
"licenseSitesUsed": "{count, plural, =0 {# sites} =1 {# site} other {# sites}} dans le système.",
"licenseSitesUsed": "{count, plural, =0 {# sites} one {# site} other {# sites}} dans le système.",
"licensePurchaseDescription": "Choisissez le nombre de sites que vous voulez {selectedMode, select, license {achetez une licence. Vous pouvez toujours ajouter plus de sites plus tard.} other {ajouter à votre licence existante.}}",
"licenseFee": "Frais de licence",
"licensePriceSite": "Prix par site",
@@ -436,7 +444,7 @@
"accessRoleSelect": "Sélectionner un rôle",
"inviteEmailSentDescription": "Un e-mail a été envoyé à l'utilisateur avec le lien d'accès ci-dessous. Ils doivent accéder au lien pour accepter l'invitation.",
"inviteSentDescription": "L'utilisateur a été invité. Ils doivent accéder au lien ci-dessous pour accepter l'invitation.",
"inviteExpiresIn": "L'invitation expirera dans {days, plural, =1 {# jour} other {# jours}}.",
"inviteExpiresIn": "L'invitation expirera dans {days, plural, one {# jour} other {# jours}}.",
"idpTitle": "Informations générales",
"idpSelect": "Sélectionnez le fournisseur d'identité pour l'utilisateur externe",
"idpNotConfigured": "Aucun fournisseur d'identité n'est configuré. Veuillez configurer un fournisseur d'identité avant de créer des utilisateurs externes.",
@@ -449,6 +457,8 @@
"accessRoleErrorAddDescription": "Une erreur s'est produite lors de l'ajout de l'utilisateur au rôle.",
"userSaved": "Utilisateur enregistré",
"userSavedDescription": "L'utilisateur a été mis à jour.",
"autoProvisioned": "Auto-provisionné",
"autoProvisionedDescription": "Permettre à cet utilisateur d'être géré automatiquement par le fournisseur d'identité",
"accessControlsDescription": "Gérer ce que cet utilisateur peut accéder et faire dans l'organisation",
"accessControlsSubmit": "Enregistrer les contrôles d'accès",
"roles": "Rôles",
@@ -458,7 +468,10 @@
"createdAt": "Créé le",
"proxyErrorInvalidHeader": "Valeur d'en-tête Host personnalisée invalide. Utilisez le format de nom de domaine, ou laissez vide pour désactiver l'en-tête Host personnalisé.",
"proxyErrorTls": "Nom de serveur TLS invalide. Utilisez le format de nom de domaine, ou laissez vide pour supprimer le nom de serveur TLS.",
"proxyEnableSSL": "Activer SSL (https)",
"proxyEnableSSL": "Activer SSL",
"proxyEnableSSLDescription": "Activez le cryptage SSL/TLS pour des connexions HTTPS sécurisées vers vos cibles.",
"target": "Target",
"configureTarget": "Configurer les cibles",
"targetErrorFetch": "Échec de la récupération des cibles",
"targetErrorFetchDescription": "Une erreur s'est produite lors de la récupération des cibles",
"siteErrorFetch": "Échec de la récupération de la ressource",
@@ -485,18 +498,30 @@
"targetTlsSettings": "Configuration sécurisée de connexion",
"targetTlsSettingsDescription": "Configurer les paramètres SSL/TLS pour votre ressource",
"targetTlsSettingsAdvanced": "Paramètres TLS avancés",
"targetTlsSni": "Nom de serveur TLS (SNI)",
"targetTlsSni": "Nom du serveur TLS",
"targetTlsSniDescription": "Le nom de serveur TLS à utiliser pour SNI. Laissez vide pour utiliser la valeur par défaut.",
"targetTlsSubmit": "Enregistrer les paramètres",
"targets": "Configuration des cibles",
"targetsDescription": "Configurez les cibles pour router le trafic vers vos services",
"targetsDescription": "Configurez les cibles pour router le trafic vers vos services.",
"targetStickySessions": "Activer les sessions persistantes",
"targetStickySessionsDescription": "Maintenir les connexions sur la même cible backend pendant toute leur session.",
"methodSelect": "Sélectionner la méthode",
"targetSubmit": "Ajouter une cible",
"targetNoOne": "Aucune cible. Ajoutez une cible en utilisant le formulaire.",
"targetNoOne": "Cette ressource n'a aucune cible. Ajoutez une cible pour configurer où envoyer des requêtes à votre backend.",
"targetNoOneDescription": "L'ajout de plus d'une cible ci-dessus activera l'équilibrage de charge.",
"targetsSubmit": "Enregistrer les cibles",
"addTarget": "Ajouter une cible",
"targetErrorInvalidIp": "Adresse IP invalide",
"targetErrorInvalidIpDescription": "Veuillez entrer une adresse IP ou un nom d'hôte valide",
"targetErrorInvalidPort": "Port invalide",
"targetErrorInvalidPortDescription": "Veuillez entrer un numéro de port valide",
"targetErrorNoSite": "Aucun site sélectionné",
"targetErrorNoSiteDescription": "Veuillez sélectionner un site pour la cible",
"targetCreated": "Cible créée",
"targetCreatedDescription": "La cible a été créée avec succès",
"targetErrorCreate": "Impossible de créer la cible",
"targetErrorCreateDescription": "Une erreur s'est produite lors de la création de la cible",
"save": "Enregistrer",
"proxyAdditional": "Paramètres de proxy supplémentaires",
"proxyAdditionalDescription": "Configurer la façon dont votre ressource gère les paramètres de proxy",
"proxyCustomHeader": "En-tête Host personnalisé",
@@ -506,6 +531,7 @@
"ipAddressErrorInvalidFormat": "Format d'adresse IP invalide",
"ipAddressErrorInvalidOctet": "Octet d'adresse IP invalide",
"path": "Chemin",
"matchPath": "Chemin de correspondance",
"ipAddressRange": "Plage IP",
"rulesErrorFetch": "Échec de la récupération des règles",
"rulesErrorFetchDescription": "Une erreur s'est produite lors de la récupération des règles",
@@ -541,6 +567,7 @@
"rulesActions": "Actions",
"rulesActionAlwaysAllow": "Toujours autoriser : Contourner toutes les méthodes d'authentification",
"rulesActionAlwaysDeny": "Toujours refuser : Bloquer toutes les requêtes ; aucune authentification ne peut être tentée",
"rulesActionPassToAuth": "Passer à l'authentification : Autoriser les méthodes d'authentification à être tentées",
"rulesMatchCriteria": "Critères de correspondance",
"rulesMatchCriteriaIpAddress": "Correspondre à une adresse IP spécifique",
"rulesMatchCriteriaIpAddressRange": "Correspondre à une plage d'adresses IP en notation CIDR",
@@ -703,7 +730,7 @@
"pangolinServerAdmin": "Admin Serveur - Pangolin",
"licenseTierProfessional": "Licence Professionnelle",
"licenseTierEnterprise": "Licence Entreprise",
"licenseTierCommercial": "Licence commerciale",
"licenseTierPersonal": "Personal License",
"licensed": "Sous licence",
"yes": "Oui",
"no": "Non",
@@ -738,7 +765,7 @@
"idpDisplayName": "Un nom d'affichage pour ce fournisseur d'identité",
"idpAutoProvisionUsers": "Approvisionnement automatique des utilisateurs",
"idpAutoProvisionUsersDescription": "Lorsque cette option est activée, les utilisateurs seront automatiquement créés dans le système lors de leur première connexion avec la possibilité de mapper les utilisateurs aux rôles et aux organisations.",
"licenseBadge": "Professionnel",
"licenseBadge": "EE",
"idpType": "Type de fournisseur",
"idpTypeDescription": "Sélectionnez le type de fournisseur d'identité que vous souhaitez configurer",
"idpOidcConfigure": "Configuration OAuth2/OIDC",
@@ -832,6 +859,24 @@
"pincodeRequirementsLength": "Le code PIN doit comporter exactement 6 chiffres",
"pincodeRequirementsChars": "Le code PIN ne doit contenir que des chiffres",
"passwordRequirementsLength": "Le mot de passe doit comporter au moins 1 caractère",
"passwordRequirementsTitle": "Exigences relatives au mot de passe :",
"passwordRequirementLength": "Au moins 8 caractères",
"passwordRequirementUppercase": "Au moins une lettre majuscule",
"passwordRequirementLowercase": "Au moins une lettre minuscule",
"passwordRequirementNumber": "Au moins un chiffre",
"passwordRequirementSpecial": "Au moins un caractère spécial",
"passwordRequirementsMet": "✓ Le mot de passe répond à toutes les exigences",
"passwordStrength": "Solidité du mot de passe",
"passwordStrengthWeak": "Faible",
"passwordStrengthMedium": "Moyen",
"passwordStrengthStrong": "Fort",
"passwordRequirements": "Exigences :",
"passwordRequirementLengthText": "8+ caractères",
"passwordRequirementUppercaseText": "Lettre majuscule (A-Z)",
"passwordRequirementLowercaseText": "Lettre minuscule (a-z)",
"passwordRequirementNumberText": "Nombre (0-9)",
"passwordRequirementSpecialText": "Caractère spécial (!@#$%...)",
"passwordsDoNotMatch": "Les mots de passe ne correspondent pas",
"otpEmailRequirementsLength": "L'OTP doit comporter au moins 1 caractère",
"otpEmailSent": "OTP envoyé",
"otpEmailSentDescription": "Un OTP a été envoyé à votre e-mail",
@@ -951,19 +996,28 @@
"logoutError": "Erreur lors de la déconnexion",
"signingAs": "Connecté en tant que",
"serverAdmin": "Admin Serveur",
"managedSelfhosted": "Gestion autonome",
"otpEnable": "Activer l'authentification à deux facteurs",
"otpDisable": "Désactiver l'authentification à deux facteurs",
"logout": "Déconnexion",
"licenseTierProfessionalRequired": "Édition Professionnelle Requise",
"licenseTierProfessionalRequiredDescription": "Cette fonctionnalité n'est disponible que dans l'Édition Professionnelle.",
"actionGetOrg": "Obtenir l'organisation",
"updateOrgUser": "Mise à jour de l'utilisateur Org",
"createOrgUser": "Créer un utilisateur Org",
"actionUpdateOrg": "Mettre à jour l'organisation",
"actionUpdateUser": "Mettre à jour l'utilisateur",
"actionGetUser": "Obtenir l'utilisateur",
"actionGetOrgUser": "Obtenir l'utilisateur de l'organisation",
"actionListOrgDomains": "Lister les domaines de l'organisation",
"actionCreateSite": "Créer un site",
"actionDeleteSite": "Supprimer un site",
"actionGetSite": "Obtenir un site",
"actionListSites": "Lister les sites",
"actionApplyBlueprint": "Appliquer le Plan",
"setupToken": "Jeton de configuration",
"setupTokenDescription": "Entrez le jeton de configuration depuis la console du serveur.",
"setupTokenRequired": "Le jeton de configuration est requis.",
"actionUpdateSite": "Mettre à jour un site",
"actionListSiteRoles": "Lister les rôles autorisés du site",
"actionCreateResource": "Créer une ressource",
@@ -1019,6 +1073,17 @@
"actionDeleteIdpOrg": "Supprimer une politique d'organisation IDP",
"actionListIdpOrgs": "Lister les organisations IDP",
"actionUpdateIdpOrg": "Mettre à jour une organisation IDP",
"actionCreateClient": "Créer un client",
"actionDeleteClient": "Supprimer le client",
"actionUpdateClient": "Mettre à jour le client",
"actionListClients": "Liste des clients",
"actionGetClient": "Obtenir le client",
"actionCreateSiteResource": "Créer une ressource de site",
"actionDeleteSiteResource": "Supprimer une ressource de site",
"actionGetSiteResource": "Obtenir une ressource de site",
"actionListSiteResources": "Lister les ressources de site",
"actionUpdateSiteResource": "Mettre à jour une ressource de site",
"actionListInvitations": "Lister les invitations",
"noneSelected": "Aucune sélection",
"orgNotFound2": "Aucune organisation trouvée.",
"searchProgress": "Rechercher...",
@@ -1034,7 +1099,6 @@
"navbar": "Menu de navigation",
"navbarDescription": "Menu de navigation principal de l'application",
"navbarDocsLink": "Documentation",
"commercialEdition": "Édition Commerciale",
"otpErrorEnable": "Impossible d'activer l'A2F",
"otpErrorEnableDescription": "Une erreur s'est produite lors de l'activation de l'A2F",
"otpSetupCheckCode": "Veuillez entrer un code à 6 chiffres",
@@ -1090,8 +1154,10 @@
"sidebarAllUsers": "Tous les utilisateurs",
"sidebarIdentityProviders": "Fournisseurs d'identité",
"sidebarLicense": "Licence",
"enableDockerSocket": "Activer Docker Socket",
"enableDockerSocketDescription": "Activer la découverte Docker Socket pour remplir les informations du conteneur. Le chemin du socket doit être fourni à Newt.",
"sidebarClients": "Clients",
"sidebarDomains": "Domaines",
"enableDockerSocket": "Activer le Plan Docker",
"enableDockerSocketDescription": "Activer le ramassage d'étiquettes de socket Docker pour les étiquettes de plan. Le chemin de socket doit être fourni à Newt.",
"enableDockerSocketLink": "En savoir plus",
"viewDockerContainers": "Voir les conteneurs Docker",
"containersIn": "Conteneurs en {siteName}",
@@ -1102,7 +1168,7 @@
"containerNetworks": "Réseaux",
"containerHostnameIp": "Nom d'hôte/IP",
"containerLabels": "Étiquettes",
"containerLabelsCount": "{count} étiquette{s,plural,one{} other{s}}",
"containerLabelsCount": "{count, plural, one {# étiquette} other {# étiquettes}}",
"containerLabelsTitle": "Étiquettes de conteneur",
"containerLabelEmpty": "<vide>",
"containerPorts": "Ports",
@@ -1114,7 +1180,7 @@
"showStoppedContainers": "Afficher les conteneurs arrêtés",
"noContainersFound": "Aucun conteneur trouvé. Assurez-vous que les conteneurs Docker sont en cours d'exécution.",
"searchContainersPlaceholder": "Rechercher dans les conteneurs {count}...",
"searchResultsCount": "{count} résultat{s,plural,one{} other{s}}",
"searchResultsCount": "{count, plural, one {# résultat} other {# résultats}}",
"filters": "Filtres",
"filterOptions": "Options de filtre",
"filterPorts": "Ports",
@@ -1129,8 +1195,703 @@
"dark": "sombre",
"system": "système",
"theme": "Thème",
"subnetRequired": "Le sous-réseau est requis",
"initialSetupTitle": "Configuration initiale du serveur",
"initialSetupDescription": "Créer le compte administrateur du serveur initial. Un seul administrateur serveur peut exister. Vous pouvez toujours changer ces informations d'identification plus tard.",
"createAdminAccount": "Créer un compte administrateur",
"setupErrorCreateAdmin": "Une erreur s'est produite lors de la création du compte administrateur du serveur."
"setupErrorCreateAdmin": "Une erreur s'est produite lors de la création du compte administrateur du serveur.",
"certificateStatus": "Statut du certificat",
"loading": "Chargement",
"restart": "Redémarrer",
"domains": "Domaines",
"domainsDescription": "Gérer les domaines de votre organisation",
"domainsSearch": "Rechercher des domaines...",
"domainAdd": "Ajouter un domaine",
"domainAddDescription": "Enregistrez un nouveau domaine avec votre organisation",
"domainCreate": "Créer un domaine",
"domainCreatedDescription": "Domaine créé avec succès",
"domainDeletedDescription": "Domaine supprimé avec succès",
"domainQuestionRemove": "Êtes-vous sûr de vouloir supprimer le domaine {domain} de votre compte ?",
"domainMessageRemove": "Une fois supprimé, le domaine ne sera plus associé à votre compte.",
"domainMessageConfirm": "Pour confirmer, veuillez taper le nom du domaine ci-dessous.",
"domainConfirmDelete": "Confirmer la suppression du domaine",
"domainDelete": "Supprimer le domaine",
"domain": "Domaine",
"selectDomainTypeNsName": "Délégation de domaine (NS)",
"selectDomainTypeNsDescription": "Ce domaine et tous ses sous-domaines. Utilisez cela lorsque vous souhaitez contrôler une zone de domaine entière.",
"selectDomainTypeCnameName": "Domaine unique (CNAME)",
"selectDomainTypeCnameDescription": "Juste ce domaine spécifique. Utilisez ce paramètre pour des sous-domaines individuels ou des entrées de domaine spécifiques.",
"selectDomainTypeWildcardName": "Domaine Générique",
"selectDomainTypeWildcardDescription": "Ce domaine et ses sous-domaines.",
"domainDelegation": "Domaine Unique",
"selectType": "Sélectionnez un type",
"actions": "Actions",
"refresh": "Actualiser",
"refreshError": "Échec de l'actualisation des données",
"verified": "Vérifié",
"pending": "En attente",
"sidebarBilling": "Facturation",
"billing": "Facturation",
"orgBillingDescription": "Gérez vos informations de facturation et vos abonnements",
"github": "GitHub",
"pangolinHosted": "Pangolin Hébergement",
"fossorial": "Fossorial",
"completeAccountSetup": "Complétez la configuration du compte",
"completeAccountSetupDescription": "Définissez votre mot de passe pour commencer",
"accountSetupSent": "Nous enverrons un code de configuration de compte à cette adresse e-mail.",
"accountSetupCode": "Code de configuration",
"accountSetupCodeDescription": "Vérifiez votre e-mail pour le code de configuration.",
"passwordCreate": "Créer un mot de passe",
"passwordCreateConfirm": "Confirmer le mot de passe",
"accountSetupSubmit": "Envoyer le code de configuration",
"completeSetup": "Configuration complète",
"accountSetupSuccess": "Configuration du compte terminée! Bienvenue chez Pangolin !",
"documentation": "Documentation",
"saveAllSettings": "Enregistrer tous les paramètres",
"settingsUpdated": "Paramètres mis à jour",
"settingsUpdatedDescription": "Tous les paramètres ont été mis à jour avec succès",
"settingsErrorUpdate": "Échec de la mise à jour des paramètres",
"settingsErrorUpdateDescription": "Une erreur s'est produite lors de la mise à jour des paramètres",
"sidebarCollapse": "Réduire",
"sidebarExpand": "Développer",
"newtUpdateAvailable": "Mise à jour disponible",
"newtUpdateAvailableInfo": "Une nouvelle version de Newt est disponible. Veuillez mettre à jour vers la dernière version pour une meilleure expérience.",
"domainPickerEnterDomain": "Domaine",
"domainPickerPlaceholder": "monapp.exemple.com",
"domainPickerDescription": "Entrez le domaine complet de la ressource pour voir les options disponibles.",
"domainPickerDescriptionSaas": "Entrez un domaine complet, un sous-domaine ou juste un nom pour voir les options disponibles",
"domainPickerTabAll": "Tous",
"domainPickerTabOrganization": "Organisation",
"domainPickerTabProvided": "Fournis",
"domainPickerSortAsc": "A-Z",
"domainPickerSortDesc": "Z-A",
"domainPickerCheckingAvailability": "Vérification de la disponibilité...",
"domainPickerNoMatchingDomains": "Aucun domaine correspondant trouvé. Essayez un autre domaine ou vérifiez les paramètres de domaine de votre organisation.",
"domainPickerOrganizationDomains": "Domaines de l'organisation",
"domainPickerProvidedDomains": "Domaines fournis",
"domainPickerSubdomain": "Sous-domaine : {subdomain}",
"domainPickerNamespace": "Espace de noms : {namespace}",
"domainPickerShowMore": "Afficher plus",
"regionSelectorTitle": "Sélectionner Région",
"regionSelectorInfo": "Sélectionner une région nous aide à offrir de meilleures performances pour votre localisation. Vous n'avez pas besoin d'être dans la même région que votre serveur.",
"regionSelectorPlaceholder": "Choisissez une région",
"regionSelectorComingSoon": "Bientôt disponible",
"billingLoadingSubscription": "Chargement de l'abonnement...",
"billingFreeTier": "Niveau gratuit",
"billingWarningOverLimit": "Attention : Vous avez dépassé une ou plusieurs limites d'utilisation. Vos sites ne se connecteront pas tant que vous n'avez pas modifié votre abonnement ou ajusté votre utilisation.",
"billingUsageLimitsOverview": "Vue d'ensemble des limites d'utilisation",
"billingMonitorUsage": "Surveillez votre consommation par rapport aux limites configurées. Si vous avez besoin d'une augmentation des limites, veuillez nous contacter à support@fossorial.io.",
"billingDataUsage": "Utilisation des données",
"billingOnlineTime": "Temps en ligne du site",
"billingUsers": "Utilisateurs actifs",
"billingDomains": "Domaines actifs",
"billingRemoteExitNodes": "Nœuds auto-hébergés actifs",
"billingNoLimitConfigured": "Aucune limite configurée",
"billingEstimatedPeriod": "Période de facturation estimée",
"billingIncludedUsage": "Utilisation incluse",
"billingIncludedUsageDescription": "Utilisation incluse dans votre plan d'abonnement actuel",
"billingFreeTierIncludedUsage": "Tolérances d'utilisation du niveau gratuit",
"billingIncluded": "inclus",
"billingEstimatedTotal": "Total estimé :",
"billingNotes": "Notes",
"billingEstimateNote": "Ceci est une estimation basée sur votre utilisation actuelle.",
"billingActualChargesMayVary": "Les frais réels peuvent varier.",
"billingBilledAtEnd": "Vous serez facturé à la fin de la période de facturation.",
"billingModifySubscription": "Modifier l'abonnement",
"billingStartSubscription": "Démarrer l'abonnement",
"billingRecurringCharge": "Frais récurrents",
"billingManageSubscriptionSettings": "Gérez les paramètres et préférences de votre abonnement",
"billingNoActiveSubscription": "Vous n'avez pas d'abonnement actif. Commencez votre abonnement pour augmenter les limites d'utilisation.",
"billingFailedToLoadSubscription": "Échec du chargement de l'abonnement",
"billingFailedToLoadUsage": "Échec du chargement de l'utilisation",
"billingFailedToGetCheckoutUrl": "Échec pour obtenir l'URL de paiement",
"billingPleaseTryAgainLater": "Veuillez réessayer plus tard.",
"billingCheckoutError": "Erreur de paiement",
"billingFailedToGetPortalUrl": "Échec pour obtenir l'URL du portail",
"billingPortalError": "Erreur du portail",
"billingDataUsageInfo": "Vous êtes facturé pour toutes les données transférées via vos tunnels sécurisés lorsque vous êtes connecté au cloud. Cela inclut le trafic entrant et sortant sur tous vos sites. Lorsque vous atteignez votre limite, vos sites se déconnecteront jusqu'à ce que vous mettiez à niveau votre plan ou réduisiez l'utilisation. Les données ne sont pas facturées lors de l'utilisation de nœuds.",
"billingOnlineTimeInfo": "Vous êtes facturé en fonction de la durée de connexion de vos sites au cloud. Par exemple, 44 640 minutes équivaut à un site fonctionnant 24/7 pendant un mois complet. Lorsque vous atteignez votre limite, vos sites se déconnecteront jusqu'à ce que vous mettiez à niveau votre forfait ou réduisiez votre consommation. Le temps n'est pas facturé lors de l'utilisation de nœuds.",
"billingUsersInfo": "Vous êtes facturé pour chaque utilisateur dans votre organisation. La facturation est calculée quotidiennement en fonction du nombre de comptes utilisateurs actifs dans votre organisation.",
"billingDomainInfo": "Vous êtes facturé pour chaque domaine dans votre organisation. La facturation est calculée quotidiennement en fonction du nombre de comptes de domaine actifs dans votre organisation.",
"billingRemoteExitNodesInfo": "Vous êtes facturé pour chaque nœud géré dans votre organisation. La facturation est calculée quotidiennement en fonction du nombre de nœuds gérés actifs dans votre organisation.",
"domainNotFound": "Domaine introuvable",
"domainNotFoundDescription": "Cette ressource est désactivée car le domaine n'existe plus dans notre système. Veuillez définir un nouveau domaine pour cette ressource.",
"failed": "Échec",
"createNewOrgDescription": "Créer une nouvelle organisation",
"organization": "Organisation",
"port": "Port",
"securityKeyManage": "Gérer les clés de sécurité",
"securityKeyDescription": "Ajouter ou supprimer des clés de sécurité pour l'authentification sans mot de passe",
"securityKeyRegister": "Enregistrer une nouvelle clé de sécurité",
"securityKeyList": "Vos clés de sécurité",
"securityKeyNone": "Aucune clé de sécurité enregistrée",
"securityKeyNameRequired": "Le nom est requis",
"securityKeyRemove": "Supprimer",
"securityKeyLastUsed": "Dernière utilisation : {date}",
"securityKeyNameLabel": "Nom",
"securityKeyRegisterSuccess": "Clé de sécurité enregistrée avec succès",
"securityKeyRegisterError": "Échec de l'enregistrement de la clé de sécurité",
"securityKeyRemoveSuccess": "Clé de sécurité supprimée avec succès",
"securityKeyRemoveError": "Échec de la suppression de la clé de sécurité",
"securityKeyLoadError": "Échec du chargement des clés de sécurité",
"securityKeyLogin": "Continuer avec une clé de sécurité",
"securityKeyAuthError": "Échec de l'authentification avec la clé de sécurité",
"securityKeyRecommendation": "Envisagez d'enregistrer une autre clé de sécurité sur un appareil différent pour vous assurer de ne pas être bloqué de votre compte.",
"registering": "Enregistrement...",
"securityKeyPrompt": "Veuillez vérifier votre identité à l'aide de votre clé de sécurité. Assurez-vous que votre clé de sécurité est connectée et prête.",
"securityKeyBrowserNotSupported": "Votre navigateur ne prend pas en charge les clés de sécurité. Veuillez utiliser un navigateur moderne comme Chrome, Firefox ou Safari.",
"securityKeyPermissionDenied": "Veuillez autoriser l'accès à votre clé de sécurité pour continuer la connexion.",
"securityKeyRemovedTooQuickly": "Veuillez garder votre clé de sécurité connectée jusqu'à ce que le processus de connexion soit terminé.",
"securityKeyNotSupported": "Votre clé de sécurité peut ne pas être compatible. Veuillez essayer une clé de sécurité différente.",
"securityKeyUnknownError": "Un problème est survenu avec votre clé de sécurité. Veuillez réessayer.",
"twoFactorRequired": "L'authentification à deux facteurs est requise pour enregistrer une clé de sécurité.",
"twoFactor": "Authentification à deux facteurs",
"adminEnabled2FaOnYourAccount": "Votre administrateur a activé l'authentification à deux facteurs pour {email}. Veuillez terminer le processus d'installation pour continuer.",
"securityKeyAdd": "Ajouter une clé de sécurité",
"securityKeyRegisterTitle": "Enregistrer une nouvelle clé de sécurité",
"securityKeyRegisterDescription": "Connectez votre clé de sécurité et saisissez un nom pour l'identifier",
"securityKeyTwoFactorRequired": "Authentification à deux facteurs requise",
"securityKeyTwoFactorDescription": "Veuillez entrer votre code d'authentification à deux facteurs pour enregistrer la clé de sécurité",
"securityKeyTwoFactorRemoveDescription": "Veuillez entrer votre code d'authentification à deux facteurs pour supprimer la clé de sécurité",
"securityKeyTwoFactorCode": "Code à deux facteurs",
"securityKeyRemoveTitle": "Supprimer la clé de sécurité",
"securityKeyRemoveDescription": "Saisissez votre mot de passe pour supprimer la clé de sécurité \"{name}\"",
"securityKeyNoKeysRegistered": "Aucune clé de sécurité enregistrée",
"securityKeyNoKeysDescription": "Ajoutez une clé de sécurité pour améliorer la sécurité de votre compte",
"createDomainRequired": "Le domaine est requis",
"createDomainAddDnsRecords": "Ajouter des enregistrements DNS",
"createDomainAddDnsRecordsDescription": "Ajouter les enregistrements DNS suivants à votre fournisseur de domaine pour compléter la configuration.",
"createDomainNsRecords": "Enregistrements NS",
"createDomainRecord": "Enregistrement",
"createDomainType": "Type :",
"createDomainName": "Nom :",
"createDomainValue": "Valeur :",
"createDomainCnameRecords": "Enregistrements CNAME",
"createDomainARecords": "Enregistrements A",
"createDomainRecordNumber": "Enregistrement {number}",
"createDomainTxtRecords": "Enregistrements TXT",
"createDomainSaveTheseRecords": "Enregistrez ces enregistrements",
"createDomainSaveTheseRecordsDescription": "Assurez-vous de sauvegarder ces enregistrements DNS car vous ne les reverrez pas.",
"createDomainDnsPropagation": "Propagation DNS",
"createDomainDnsPropagationDescription": "Les modifications DNS peuvent mettre du temps à se propager sur internet. Cela peut prendre de quelques minutes à 48 heures selon votre fournisseur DNS et les réglages TTL.",
"resourcePortRequired": "Le numéro de port est requis pour les ressources non-HTTP",
"resourcePortNotAllowed": "Le numéro de port ne doit pas être défini pour les ressources HTTP",
"billingPricingCalculatorLink": "Calculateur de prix",
"signUpTerms": {
"IAgreeToThe": "Je suis d'accord avec",
"termsOfService": "les conditions d'utilisation",
"and": "et",
"privacyPolicy": "la politique de confidentialité"
},
"siteRequired": "Le site est requis.",
"olmTunnel": "Tunnel Olm",
"olmTunnelDescription": "Utilisez Olm pour la connectivité client",
"errorCreatingClient": "Erreur lors de la création du client",
"clientDefaultsNotFound": "Les paramètres par défaut du client sont introuvables",
"createClient": "Créer un client",
"createClientDescription": "Créez un nouveau client pour vous connecter à vos sites",
"seeAllClients": "Voir tous les clients",
"clientInformation": "Informations client",
"clientNamePlaceholder": "Nom du client",
"address": "Adresse",
"subnetPlaceholder": "Sous-réseau",
"addressDescription": "L'adresse que ce client utilisera pour la connectivité",
"selectSites": "Sélectionner des sites",
"sitesDescription": "Le client aura une connectivité vers les sites sélectionnés",
"clientInstallOlm": "Installer Olm",
"clientInstallOlmDescription": "Faites fonctionner Olm sur votre système",
"clientOlmCredentials": "Identifiants Olm",
"clientOlmCredentialsDescription": "C'est ainsi qu'Olm s'authentifiera auprès du serveur",
"olmEndpoint": "Point de terminaison Olm",
"olmId": "ID Olm",
"olmSecretKey": "Clé secrète Olm",
"clientCredentialsSave": "Enregistrez vos identifiants",
"clientCredentialsSaveDescription": "Vous ne pourrez voir cela qu'une seule fois. Assurez-vous de la copier dans un endroit sécurisé.",
"generalSettingsDescription": "Configurez les paramètres généraux pour ce client",
"clientUpdated": "Client mis à jour",
"clientUpdatedDescription": "Le client a été mis à jour.",
"clientUpdateFailed": "Échec de la mise à jour du client",
"clientUpdateError": "Une erreur s'est produite lors de la mise à jour du client.",
"sitesFetchFailed": "Échec de la récupération des sites",
"sitesFetchError": "Une erreur s'est produite lors de la récupération des sites.",
"olmErrorFetchReleases": "Une erreur s'est produite lors de la récupération des versions d'Olm.",
"olmErrorFetchLatest": "Une erreur s'est produite lors de la récupération de la dernière version d'Olm.",
"remoteSubnets": "Sous-réseaux distants",
"enterCidrRange": "Entrez la plage CIDR",
"remoteSubnetsDescription": "Ajoutez des plages CIDR accessibles à distance depuis ce site à l'aide de clients. Utilisez le format comme 10.0.0.0/24. Cela s'applique UNIQUEMENT à la connectivité des clients VPN.",
"resourceEnableProxy": "Activer le proxy public",
"resourceEnableProxyDescription": "Activez le proxy public vers cette ressource. Cela permet d'accéder à la ressource depuis l'extérieur du réseau via le cloud sur un port ouvert. Nécessite la configuration de Traefik.",
"externalProxyEnabled": "Proxy externe activé",
"addNewTarget": "Ajouter une nouvelle cible",
"targetsList": "Liste des cibles",
"advancedMode": "Mode Avancé",
"targetErrorDuplicateTargetFound": "Cible en double trouvée",
"healthCheckHealthy": "Sain",
"healthCheckUnhealthy": "En mauvaise santé",
"healthCheckUnknown": "Inconnu",
"healthCheck": "Vérification de l'état de santé",
"configureHealthCheck": "Configurer la vérification de l'état de santé",
"configureHealthCheckDescription": "Configurer la surveillance de la santé pour {target}",
"enableHealthChecks": "Activer les vérifications de santé",
"enableHealthChecksDescription": "Surveiller la vie de cette cible. Vous pouvez surveiller un point de terminaison différent de la cible si nécessaire.",
"healthScheme": "Méthode",
"healthSelectScheme": "Sélectionnez la méthode",
"healthCheckPath": "Chemin d'accès",
"healthHostname": "IP / Hôte",
"healthPort": "Port",
"healthCheckPathDescription": "Le chemin à vérifier pour le statut de santé.",
"healthyIntervalSeconds": "Intervalle sain",
"unhealthyIntervalSeconds": "Intervalle en mauvaise santé",
"IntervalSeconds": "Intervalle sain",
"timeoutSeconds": "Délai",
"timeIsInSeconds": "Le temps est exprimé en secondes",
"retryAttempts": "Tentatives de réessai",
"expectedResponseCodes": "Codes de réponse attendus",
"expectedResponseCodesDescription": "Code de statut HTTP indiquant un état de santé satisfaisant. Si non renseigné, 200-300 est considéré comme satisfaisant.",
"customHeaders": "En-têtes personnalisés",
"customHeadersDescription": "En-têtes séparés par une nouvelle ligne: En-nom: valeur",
"headersValidationError": "Les entêtes doivent être au format : Header-Name: valeur.",
"saveHealthCheck": "Sauvegarder la vérification de l'état de santé",
"healthCheckSaved": "Vérification de l'état de santé enregistrée",
"healthCheckSavedDescription": "La configuration de la vérification de l'état de santé a été enregistrée avec succès",
"healthCheckError": "Erreur de vérification de l'état de santé",
"healthCheckErrorDescription": "Une erreur s'est produite lors de l'enregistrement de la configuration de la vérification de l'état de santé",
"healthCheckPathRequired": "Le chemin de vérification de l'état de santé est requis",
"healthCheckMethodRequired": "La méthode HTTP est requise",
"healthCheckIntervalMin": "L'intervalle de vérification doit être d'au moins 5 secondes",
"healthCheckTimeoutMin": "Le délai doit être d'au moins 1 seconde",
"healthCheckRetryMin": "Les tentatives de réessai doivent être d'au moins 1",
"httpMethod": "Méthode HTTP",
"selectHttpMethod": "Sélectionnez la méthode HTTP",
"domainPickerSubdomainLabel": "Sous-domaine",
"domainPickerBaseDomainLabel": "Domaine de base",
"domainPickerSearchDomains": "Rechercher des domaines...",
"domainPickerNoDomainsFound": "Aucun domaine trouvé",
"domainPickerLoadingDomains": "Chargement des domaines...",
"domainPickerSelectBaseDomain": "Sélectionnez le domaine de base...",
"domainPickerNotAvailableForCname": "Non disponible pour les domaines CNAME",
"domainPickerEnterSubdomainOrLeaveBlank": "Entrez un sous-domaine ou laissez vide pour utiliser le domaine de base.",
"domainPickerEnterSubdomainToSearch": "Entrez un sous-domaine pour rechercher et sélectionner parmi les domaines gratuits disponibles.",
"domainPickerFreeDomains": "Domaines gratuits",
"domainPickerSearchForAvailableDomains": "Rechercher des domaines disponibles",
"domainPickerNotWorkSelfHosted": "Remarque : Les domaines fournis gratuitement ne sont pas disponibles pour les instances auto-hébergées pour le moment.",
"resourceDomain": "Domaine",
"resourceEditDomain": "Modifier le domaine",
"siteName": "Nom du site",
"proxyPort": "Port",
"resourcesTableProxyResources": "Ressources proxy",
"resourcesTableClientResources": "Ressources client",
"resourcesTableNoProxyResourcesFound": "Aucune ressource proxy trouvée.",
"resourcesTableNoInternalResourcesFound": "Aucune ressource interne trouvée.",
"resourcesTableDestination": "Destination",
"resourcesTableTheseResourcesForUseWith": "Ces ressources sont à utiliser avec",
"resourcesTableClients": "Clients",
"resourcesTableAndOnlyAccessibleInternally": "et sont uniquement accessibles en interne lorsqu'elles sont connectées avec un client.",
"editInternalResourceDialogEditClientResource": "Modifier la ressource client",
"editInternalResourceDialogUpdateResourceProperties": "Mettez à jour les propriétés de la ressource et la configuration de la cible pour {resourceName}.",
"editInternalResourceDialogResourceProperties": "Propriétés de la ressource",
"editInternalResourceDialogName": "Nom",
"editInternalResourceDialogProtocol": "Protocole",
"editInternalResourceDialogSitePort": "Port du site",
"editInternalResourceDialogTargetConfiguration": "Configuration de la cible",
"editInternalResourceDialogCancel": "Abandonner",
"editInternalResourceDialogSaveResource": "Enregistrer la ressource",
"editInternalResourceDialogSuccess": "Succès",
"editInternalResourceDialogInternalResourceUpdatedSuccessfully": "Ressource interne mise à jour avec succès",
"editInternalResourceDialogError": "Erreur",
"editInternalResourceDialogFailedToUpdateInternalResource": "Échec de la mise à jour de la ressource interne",
"editInternalResourceDialogNameRequired": "Le nom est requis",
"editInternalResourceDialogNameMaxLength": "Le nom doit être inférieur à 255 caractères",
"editInternalResourceDialogProxyPortMin": "Le port proxy doit être d'au moins 1",
"editInternalResourceDialogProxyPortMax": "Le port proxy doit être inférieur à 65536",
"editInternalResourceDialogInvalidIPAddressFormat": "Format d'adresse IP invalide",
"editInternalResourceDialogDestinationPortMin": "Le port de destination doit être d'au moins 1",
"editInternalResourceDialogDestinationPortMax": "Le port de destination doit être inférieur à 65536",
"createInternalResourceDialogNoSitesAvailable": "Aucun site disponible",
"createInternalResourceDialogNoSitesAvailableDescription": "Vous devez avoir au moins un site Newt avec un sous-réseau configuré pour créer des ressources internes.",
"createInternalResourceDialogClose": "Fermer",
"createInternalResourceDialogCreateClientResource": "Créer une ressource client",
"createInternalResourceDialogCreateClientResourceDescription": "Créez une ressource accessible aux clients connectés au site sélectionné.",
"createInternalResourceDialogResourceProperties": "Propriétés de la ressource",
"createInternalResourceDialogName": "Nom",
"createInternalResourceDialogSite": "Site",
"createInternalResourceDialogSelectSite": "Sélectionner un site...",
"createInternalResourceDialogSearchSites": "Rechercher des sites...",
"createInternalResourceDialogNoSitesFound": "Aucun site trouvé.",
"createInternalResourceDialogProtocol": "Protocole",
"createInternalResourceDialogTcp": "TCP",
"createInternalResourceDialogUdp": "UDP",
"createInternalResourceDialogSitePort": "Port du site",
"createInternalResourceDialogSitePortDescription": "Utilisez ce port pour accéder à la ressource sur le site lors de la connexion avec un client.",
"createInternalResourceDialogTargetConfiguration": "Configuration de la cible",
"createInternalResourceDialogDestinationIPDescription": "L'adresse IP ou le nom d'hôte de la ressource sur le réseau du site.",
"createInternalResourceDialogDestinationPortDescription": "Le port sur l'IP de destination où la ressource est accessible.",
"createInternalResourceDialogCancel": "Abandonner",
"createInternalResourceDialogCreateResource": "Créer une ressource",
"createInternalResourceDialogSuccess": "Succès",
"createInternalResourceDialogInternalResourceCreatedSuccessfully": "Ressource interne créée avec succès",
"createInternalResourceDialogError": "Erreur",
"createInternalResourceDialogFailedToCreateInternalResource": "Échec de la création de la ressource interne",
"createInternalResourceDialogNameRequired": "Le nom est requis",
"createInternalResourceDialogNameMaxLength": "Le nom doit être inférieur à 255 caractères",
"createInternalResourceDialogPleaseSelectSite": "Veuillez sélectionner un site",
"createInternalResourceDialogProxyPortMin": "Le port proxy doit être d'au moins 1",
"createInternalResourceDialogProxyPortMax": "Le port proxy doit être inférieur à 65536",
"createInternalResourceDialogInvalidIPAddressFormat": "Format d'adresse IP invalide",
"createInternalResourceDialogDestinationPortMin": "Le port de destination doit être d'au moins 1",
"createInternalResourceDialogDestinationPortMax": "Le port de destination doit être inférieur à 65536",
"siteConfiguration": "Configuration",
"siteAcceptClientConnections": "Accepter les connexions client",
"siteAcceptClientConnectionsDescription": "Permet à d'autres appareils de se connecter via cette instance de Newt en tant que passerelle utilisant des clients.",
"siteAddress": "Adresse du site",
"siteAddressDescription": "Spécifiez l'adresse IP de l'hôte pour que les clients puissent s'y connecter. C'est l'adresse interne du site dans le réseau Pangolin pour que les clients puissent s'adresser. Doit être dans le sous-réseau de l'organisation.",
"autoLoginExternalIdp": "Connexion automatique avec IDP externe",
"autoLoginExternalIdpDescription": "Rediriger immédiatement l'utilisateur vers l'IDP externe pour l'authentification.",
"selectIdp": "Sélectionner l'IDP",
"selectIdpPlaceholder": "Choisissez un IDP...",
"selectIdpRequired": "Veuillez sélectionner un IDP lorsque la connexion automatique est activée.",
"autoLoginTitle": "Redirection",
"autoLoginDescription": "Redirection vers le fournisseur d'identité externe pour l'authentification.",
"autoLoginProcessing": "Préparation de l'authentification...",
"autoLoginRedirecting": "Redirection vers la connexion...",
"autoLoginError": "Erreur de connexion automatique",
"autoLoginErrorNoRedirectUrl": "Aucune URL de redirection reçue du fournisseur d'identité.",
"autoLoginErrorGeneratingUrl": "Échec de la génération de l'URL d'authentification.",
"remoteExitNodeManageRemoteExitNodes": "Nœuds distants",
"remoteExitNodeDescription": "Self-host one or more remote nodes to extend your network connectivity and reduce reliance on the cloud",
"remoteExitNodes": "Nœuds",
"searchRemoteExitNodes": "Rechercher des nœuds...",
"remoteExitNodeAdd": "Ajouter un noeud",
"remoteExitNodeErrorDelete": "Erreur lors de la suppression du noeud",
"remoteExitNodeQuestionRemove": "Êtes-vous sûr de vouloir supprimer le noeud {selectedNode} de l'organisation ?",
"remoteExitNodeMessageRemove": "Une fois supprimé, le noeud ne sera plus accessible.",
"remoteExitNodeMessageConfirm": "Pour confirmer, veuillez saisir le nom du noeud ci-dessous.",
"remoteExitNodeConfirmDelete": "Confirmer la suppression du noeud",
"remoteExitNodeDelete": "Supprimer le noeud",
"sidebarRemoteExitNodes": "Nœuds distants",
"remoteExitNodeCreate": {
"title": "Créer un noeud",
"description": "Créer un nouveau nœud pour étendre votre connectivité réseau",
"viewAllButton": "Voir tous les nœuds",
"strategy": {
"title": "Stratégie de création",
"description": "Choisissez ceci pour configurer manuellement votre nœud ou générer de nouveaux identifiants.",
"adopt": {
"title": "Adopter un nœud",
"description": "Choisissez ceci si vous avez déjà les identifiants pour le noeud."
},
"generate": {
"title": "Générer des clés",
"description": "Choisissez ceci si vous voulez générer de nouvelles clés pour le noeud"
}
},
"adopt": {
"title": "Adopter un nœud existant",
"description": "Entrez les identifiants du noeud existant que vous souhaitez adopter",
"nodeIdLabel": "Nœud ID",
"nodeIdDescription": "L'ID du noeud existant que vous voulez adopter",
"secretLabel": "Secret",
"secretDescription": "La clé secrète du noeud existant",
"submitButton": "Noeud d'Adopt"
},
"generate": {
"title": "Informations d'identification générées",
"description": "Utilisez ces identifiants générés pour configurer votre noeud",
"nodeIdTitle": "Nœud ID",
"secretTitle": "Secret",
"saveCredentialsTitle": "Ajouter des identifiants à la config",
"saveCredentialsDescription": "Ajoutez ces informations d'identification à votre fichier de configuration du nœud Pangolin auto-hébergé pour compléter la connexion.",
"submitButton": "Créer un noeud"
},
"validation": {
"adoptRequired": "ID de nœud et secret sont requis lors de l'adoption d'un noeud existant"
},
"errors": {
"loadDefaultsFailed": "Échec du chargement des valeurs par défaut",
"defaultsNotLoaded": "Valeurs par défaut non chargées",
"createFailed": "Impossible de créer le noeud"
},
"success": {
"created": "Noeud créé avec succès"
}
},
"remoteExitNodeSelection": "Sélection du noeud",
"remoteExitNodeSelectionDescription": "Sélectionnez un nœud pour acheminer le trafic pour ce site local",
"remoteExitNodeRequired": "Un noeud doit être sélectionné pour les sites locaux",
"noRemoteExitNodesAvailable": "Aucun noeud disponible",
"noRemoteExitNodesAvailableDescription": "Aucun noeud n'est disponible pour cette organisation. Créez d'abord un noeud pour utiliser des sites locaux.",
"exitNode": "Nœud de sortie",
"country": "Pays",
"rulesMatchCountry": "Actuellement basé sur l'IP source",
"managedSelfHosted": {
"title": "Gestion autonome",
"description": "Serveur Pangolin auto-hébergé avec des cloches et des sifflets supplémentaires",
"introTitle": "Pangolin auto-hébergé géré",
"introDescription": "est une option de déploiement conçue pour les personnes qui veulent de la simplicité et de la fiabilité tout en gardant leurs données privées et auto-hébergées.",
"introDetail": "Avec cette option, vous exécutez toujours votre propre nœud Pangolin — vos tunnels, la terminaison SSL et le trafic restent sur votre serveur. La différence est que la gestion et la surveillance sont gérées via notre tableau de bord du cloud, qui déverrouille un certain nombre d'avantages :",
"benefitSimplerOperations": {
"title": "Opérations plus simples",
"description": "Pas besoin de faire tourner votre propre serveur de messagerie ou de configurer des alertes complexes. Vous obtiendrez des contrôles de santé et des alertes de temps d'arrêt par la suite."
},
"benefitAutomaticUpdates": {
"title": "Mises à jour automatiques",
"description": "Le tableau de bord du cloud évolue rapidement, de sorte que vous obtenez de nouvelles fonctionnalités et des corrections de bugs sans avoir à extraire manuellement de nouveaux conteneurs à chaque fois."
},
"benefitLessMaintenance": {
"title": "Moins de maintenance",
"description": "Aucune migration de base de données, sauvegarde ou infrastructure supplémentaire à gérer. Nous gérons cela dans le cloud."
},
"benefitCloudFailover": {
"title": "Basculement du Cloud",
"description": "Si votre nœud descend, vos tunnels peuvent temporairement échouer jusqu'à ce que vous le rapatriez en ligne."
},
"benefitHighAvailability": {
"title": "Haute disponibilité (PoPs)",
"description": "Vous pouvez également attacher plusieurs nœuds à votre compte pour une redondance et de meilleures performances."
},
"benefitFutureEnhancements": {
"title": "Améliorations futures",
"description": "Nous prévoyons d'ajouter plus d'outils d'analyse, d'alerte et de gestion pour rendre votre déploiement encore plus robuste."
},
"docsAlert": {
"text": "En savoir plus sur l'option Auto-Hébergement géré dans notre",
"documentation": "documentation"
},
"convertButton": "Convertir ce noeud en auto-hébergé géré"
},
"internationaldomaindetected": "Domaine international détecté",
"willbestoredas": "Sera stocké comme :",
"roleMappingDescription": "Détermine comment les rôles sont assignés aux utilisateurs lorsqu'ils se connectent lorsque la fourniture automatique est activée.",
"selectRole": "Sélectionnez un rôle",
"roleMappingExpression": "Expression",
"selectRolePlaceholder": "Choisir un rôle",
"selectRoleDescription": "Sélectionnez un rôle à assigner à tous les utilisateurs de ce fournisseur d'identité",
"roleMappingExpressionDescription": "Entrez une expression JMESPath pour extraire les informations du rôle du jeton ID",
"idpTenantIdRequired": "L'ID du locataire est requis",
"invalidValue": "Valeur non valide",
"idpTypeLabel": "Type de fournisseur d'identité",
"roleMappingExpressionPlaceholder": "ex: contenu(groupes) && 'admin' || 'membre'",
"idpGoogleConfiguration": "Configuration Google",
"idpGoogleConfigurationDescription": "Configurer vos identifiants Google OAuth2",
"idpGoogleClientIdDescription": "Votre identifiant client Google OAuth2",
"idpGoogleClientSecretDescription": "Votre secret client Google OAuth2",
"idpAzureConfiguration": "Configuration de l'entra ID Azure",
"idpAzureConfigurationDescription": "Configurer vos identifiants OAuth2 Azure Entra",
"idpTenantId": "ID du locataire",
"idpTenantIdPlaceholder": "votre-locataire-id",
"idpAzureTenantIdDescription": "Votre ID de locataire Azure (trouvé dans l'aperçu Azure Active Directory)",
"idpAzureClientIdDescription": "Votre ID client d'enregistrement de l'application Azure",
"idpAzureClientSecretDescription": "Le secret de votre client d'enregistrement Azure App",
"idpGoogleTitle": "Google",
"idpGoogleAlt": "Google",
"idpAzureTitle": "Azure Entra ID",
"idpAzureAlt": "Azure",
"idpGoogleConfigurationTitle": "Configuration Google",
"idpAzureConfigurationTitle": "Configuration de l'entra ID Azure",
"idpTenantIdLabel": "ID du locataire",
"idpAzureClientIdDescription2": "Votre ID client d'enregistrement de l'application Azure",
"idpAzureClientSecretDescription2": "Le secret de votre client d'enregistrement Azure App",
"idpGoogleDescription": "Fournisseur Google OAuth2/OIDC",
"idpAzureDescription": "Microsoft Azure OAuth2/OIDC provider",
"subnet": "Sous-réseau",
"subnetDescription": "Le sous-réseau de la configuration réseau de cette organisation.",
"authPage": "Page d'authentification",
"authPageDescription": "Configurer la page d'authentification de votre organisation",
"authPageDomain": "Domaine de la page d'authentification",
"noDomainSet": "Aucun domaine défini",
"changeDomain": "Changer de domaine",
"selectDomain": "Sélectionner un domaine",
"restartCertificate": "Redémarrer le certificat",
"editAuthPageDomain": "Modifier le domaine de la page d'authentification",
"setAuthPageDomain": "Définir le domaine de la page d'authentification",
"failedToFetchCertificate": "Impossible de récupérer le certificat",
"failedToRestartCertificate": "Échec du redémarrage du certificat",
"addDomainToEnableCustomAuthPages": "Ajouter un domaine pour activer les pages d'authentification personnalisées pour votre organisation",
"selectDomainForOrgAuthPage": "Sélectionnez un domaine pour la page d'authentification de l'organisation",
"domainPickerProvidedDomain": "Domaine fourni",
"domainPickerFreeProvidedDomain": "Domaine fourni gratuitement",
"domainPickerVerified": "Vérifié",
"domainPickerUnverified": "Non vérifié",
"domainPickerInvalidSubdomainStructure": "Ce sous-domaine contient des caractères ou une structure non valide. Il sera automatiquement nettoyé lorsque vous enregistrez.",
"domainPickerError": "Erreur",
"domainPickerErrorLoadDomains": "Impossible de charger les domaines de l'organisation",
"domainPickerErrorCheckAvailability": "Impossible de vérifier la disponibilité du domaine",
"domainPickerInvalidSubdomain": "Sous-domaine invalide",
"domainPickerInvalidSubdomainRemoved": "L'entrée \"{sub}\" a été supprimée car elle n'est pas valide.",
"domainPickerInvalidSubdomainCannotMakeValid": "La «{sub}» n'a pas pu être validée pour {domain}.",
"domainPickerSubdomainSanitized": "Sous-domaine nettoyé",
"domainPickerSubdomainCorrected": "\"{sub}\" a été corrigé à \"{sanitized}\"",
"orgAuthSignInTitle": "Connectez-vous à votre organisation",
"orgAuthChooseIdpDescription": "Choisissez votre fournisseur d'identité pour continuer",
"orgAuthNoIdpConfigured": "Cette organisation n'a aucun fournisseur d'identité configuré. Vous pouvez vous connecter avec votre identité Pangolin à la place.",
"orgAuthSignInWithPangolin": "Se connecter avec Pangolin",
"subscriptionRequiredToUse": "Un abonnement est requis pour utiliser cette fonctionnalité.",
"idpDisabled": "Les fournisseurs d'identité sont désactivés.",
"orgAuthPageDisabled": "La page d'authentification de l'organisation est désactivée.",
"domainRestartedDescription": "La vérification du domaine a été redémarrée avec succès",
"resourceAddEntrypointsEditFile": "Modifier le fichier : config/traefik/traefik_config.yml",
"resourceExposePortsEditFile": "Modifier le fichier : docker-compose.yml",
"emailVerificationRequired": "La vérification de l'e-mail est requise. Veuillez vous reconnecter via {dashboardUrl}/auth/login terminé cette étape. Puis revenez ici.",
"twoFactorSetupRequired": "La configuration d'authentification à deux facteurs est requise. Veuillez vous reconnecter via {dashboardUrl}/auth/login terminé cette étape. Puis revenez ici.",
"authPageErrorUpdateMessage": "Une erreur s'est produite lors de la mise à jour de la page d\u000027authentification",
"authPageUpdated": "Page d\u000027authentification mise à jour avec succès",
"healthCheckNotAvailable": "Locale",
"rewritePath": "Réécrire le chemin",
"rewritePathDescription": "Réécrivez éventuellement le chemin avant de le transmettre à la cible.",
"continueToApplication": "Continuer vers l'application",
"checkingInvite": "Vérification de l'invitation",
"setResourceHeaderAuth": "Définir l\\'authentification d\\'en-tête de la ressource",
"resourceHeaderAuthRemove": "Supprimer l'authentification de l'en-tête",
"resourceHeaderAuthRemoveDescription": "Authentification de l'en-tête supprimée avec succès.",
"resourceErrorHeaderAuthRemove": "Échec de la suppression de l'authentification de l'en-tête",
"resourceErrorHeaderAuthRemoveDescription": "Impossible de supprimer l'authentification de l'en-tête de la ressource.",
"resourceHeaderAuthProtectionEnabled": "Header Authentication Enabled",
"resourceHeaderAuthProtectionDisabled": "Header Authentication Disabled",
"headerAuthRemove": "Remove Header Auth",
"headerAuthAdd": "Add Header Auth",
"resourceErrorHeaderAuthSetup": "Impossible de définir l'authentification de l'en-tête",
"resourceErrorHeaderAuthSetupDescription": "Impossible de définir l'authentification de l'en-tête pour la ressource.",
"resourceHeaderAuthSetup": "Authentification de l'en-tête définie avec succès",
"resourceHeaderAuthSetupDescription": "L'authentification de l'en-tête a été définie avec succès.",
"resourceHeaderAuthSetupTitle": "Authentification de l'en-tête",
"resourceHeaderAuthSetupTitleDescription": "Set the basic auth credentials (username and password) to protect this resource with HTTP Header Authentication. Access it using the format https://username:password@resource.example.com",
"resourceHeaderAuthSubmit": "Authentification de l'en-tête",
"actionSetResourceHeaderAuth": "Authentification de l'en-tête",
"enterpriseEdition": "Enterprise Edition",
"unlicensed": "Unlicensed",
"beta": "Beta",
"manageClients": "Manage Clients",
"manageClientsDescription": "Clients are devices that can connect to your sites",
"licenseTableValidUntil": "Valid Until",
"saasLicenseKeysSettingsTitle": "Enterprise Licenses",
"saasLicenseKeysSettingsDescription": "Generate and manage Enterprise license keys for self-hosted Pangolin instances",
"sidebarEnterpriseLicenses": "Licenses",
"generateLicenseKey": "Generate License Key",
"generateLicenseKeyForm": {
"validation": {
"emailRequired": "Please enter a valid email address",
"useCaseTypeRequired": "Please select a use case type",
"firstNameRequired": "First name is required",
"lastNameRequired": "Last name is required",
"primaryUseRequired": "Please describe your primary use",
"jobTitleRequiredBusiness": "Job title is required for business use",
"industryRequiredBusiness": "Industry is required for business use",
"stateProvinceRegionRequired": "State/Province/Region is required",
"postalZipCodeRequired": "Postal/ZIP Code is required",
"companyNameRequiredBusiness": "Company name is required for business use",
"countryOfResidenceRequiredBusiness": "Country of residence is required for business use",
"countryRequiredPersonal": "Country is required for personal use",
"agreeToTermsRequired": "You must agree to the terms",
"complianceConfirmationRequired": "You must confirm compliance with the Fossorial Commercial License"
},
"useCaseOptions": {
"personal": {
"title": "Personal Use",
"description": "For individual, non-commercial use such as learning, personal projects, or experimentation."
},
"business": {
"title": "Business Use",
"description": "For use within organizations, companies, or commercial or revenue-generating activities."
}
},
"steps": {
"emailLicenseType": {
"title": "Email & License Type",
"description": "Enter your email and choose your license type"
},
"personalInformation": {
"title": "Personal Information",
"description": "Tell us about yourself"
},
"contactInformation": {
"title": "Contact Information",
"description": "Your contact details"
},
"termsGenerate": {
"title": "Terms & Generate",
"description": "Review and accept terms to generate your license"
}
},
"alerts": {
"commercialUseDisclosure": {
"title": "Usage Disclosure",
"description": "Select the license tier that accurately reflects your intended use. The Personal License permits free use of the Software for individual, non-commercial or small-scale commercial activities with annual gross revenue under $100,000 USD. Any use beyond these limits — including use within a business, organization, or other revenue-generating environment — requires a valid Enterprise License and payment of the applicable licensing fee. All users, whether Personal or Enterprise, must comply with the Fossorial Commercial License Terms."
},
"trialPeriodInformation": {
"title": "Trial Period Information",
"description": "This License Key enables Enterprise features for a 7-day evaluation period. Continued access to Paid Features beyond the evaluation period requires activation under a valid Personal or Enterprise License. For Enterprise licensing, contact sales@fossorial.io."
}
},
"form": {
"useCaseQuestion": "Are you using Pangolin for personal or business use?",
"firstName": "First Name",
"lastName": "Last Name",
"jobTitle": "Job Title",
"primaryUseQuestion": "What do you primarily plan to use Pangolin for?",
"industryQuestion": "What is your industry?",
"prospectiveUsersQuestion": "How many prospective users do you expect to have?",
"prospectiveSitesQuestion": "How many prospective sites (tunnels) do you expect to have?",
"companyName": "Company name",
"countryOfResidence": "Country of residence",
"stateProvinceRegion": "State / Province / Region",
"postalZipCode": "Postal / ZIP Code",
"companyWebsite": "Company website",
"companyPhoneNumber": "Company phone number",
"country": "Country",
"phoneNumberOptional": "Phone number (optional)",
"complianceConfirmation": "I confirm that I am in compliance with the Fossorial Commercial License and that reporting inaccurate information or misidentifying use of the product is a violation of the license."
},
"buttons": {
"close": "Close",
"previous": "Previous",
"next": "Next",
"generateLicenseKey": "Generate License Key"
},
"toasts": {
"success": {
"title": "License key generated successfully",
"description": "Your license key has been generated and is ready to use."
},
"error": {
"title": "Failed to generate license key",
"description": "An error occurred while generating the license key."
}
}
},
"priority": "Priorité",
"priorityDescription": "Les routes de haute priorité sont évaluées en premier. La priorité = 100 signifie l'ordre automatique (décision du système). Utilisez un autre nombre pour imposer la priorité manuelle.",
"instanceName": "Instance Name",
"pathMatchModalTitle": "Configure Path Matching",
"pathMatchModalDescription": "Set up how incoming requests should be matched based on their path.",
"pathMatchType": "Match Type",
"pathMatchPrefix": "Prefix",
"pathMatchExact": "Exact",
"pathMatchRegex": "Regex",
"pathMatchValue": "Path Value",
"clear": "Clear",
"saveChanges": "Save Changes",
"pathMatchRegexPlaceholder": "^/api/.*",
"pathMatchDefaultPlaceholder": "/path",
"pathMatchPrefixHelp": "Example: /api matches /api, /api/users, etc.",
"pathMatchExactHelp": "Example: /api matches only /api",
"pathMatchRegexHelp": "Example: ^/api/.* matches /api/anything",
"pathRewriteModalTitle": "Configure Path Rewriting",
"pathRewriteModalDescription": "Transform the matched path before forwarding to the target.",
"pathRewriteType": "Rewrite Type",
"pathRewritePrefixOption": "Prefix - Replace prefix",
"pathRewriteExactOption": "Exact - Replace entire path",
"pathRewriteRegexOption": "Regex - Pattern replacement",
"pathRewriteStripPrefixOption": "Strip Prefix - Remove prefix",
"pathRewriteValue": "Rewrite Value",
"pathRewriteRegexPlaceholder": "/new/$1",
"pathRewriteDefaultPlaceholder": "/new-path",
"pathRewritePrefixHelp": "Replace the matched prefix with this value",
"pathRewriteExactHelp": "Replace the entire path with this value when the path matches exactly",
"pathRewriteRegexHelp": "Use capture groups like $1, $2 for replacement",
"pathRewriteStripPrefixHelp": "Leave empty to strip prefix or provide new prefix",
"pathRewritePrefix": "Prefix",
"pathRewriteExact": "Exact",
"pathRewriteRegex": "Regex",
"pathRewriteStrip": "Strip",
"pathRewriteStripLabel": "strip"
}

View File

@@ -11,8 +11,9 @@
"componentsErrorNoMemberCreate": "Al momento non sei un membro di nessuna organizzazione. Crea un'organizzazione per iniziare.",
"componentsErrorNoMember": "Attualmente non sei membro di nessuna organizzazione.",
"welcome": "Benvenuti a Pangolin",
"welcomeTo": "Benvenuto a",
"componentsCreateOrg": "Crea un'organizzazione",
"componentsMember": "Sei un membro di {count, plural, =0 {nessuna organizzazione} =1 {una organizzazione} other {# organizzazioni}}.",
"componentsMember": "Sei un membro di {count, plural, =0 {nessuna organizzazione} one {un'organizzazione} other {# organizzazioni}}.",
"componentsInvalidKey": "Rilevata chiave di licenza non valida o scaduta. Segui i termini di licenza per continuare a utilizzare tutte le funzionalità.",
"dismiss": "Ignora",
"componentsLicenseViolation": "Violazione della licenza: Questo server sta usando i siti {usedSites} che superano il suo limite concesso in licenza per i siti {maxSites} . Segui i termini di licenza per continuare a usare tutte le funzionalità.",
@@ -35,8 +36,8 @@
"viewSettings": "Visualizza impostazioni",
"delete": "Elimina",
"name": "Nome",
"online": "Online",
"offline": "Offline",
"online": "In linea",
"offline": "Non in linea",
"site": "Sito",
"dataIn": "Dati In",
"dataOut": "Dati Fuori",
@@ -58,7 +59,6 @@
"siteErrorCreate": "Errore nella creazione del sito",
"siteErrorCreateKeyPair": "Coppia di chiavi o valori predefiniti del sito non trovati",
"siteErrorCreateDefaults": "Predefiniti del sito non trovati",
"siteNameDescription": "Questo è il nome visualizzato per il sito.",
"method": "Metodo",
"siteMethodDescription": "Questo è il modo in cui esporrete le connessioni.",
"siteLearnNewt": "Scopri come installare Newt sul tuo sistema",
@@ -94,7 +94,9 @@
"siteNewtTunnelDescription": "Modo più semplice per creare un entrypoint nella rete. Nessuna configurazione aggiuntiva.",
"siteWg": "WireGuard Base",
"siteWgDescription": "Usa qualsiasi client WireGuard per stabilire un tunnel. Impostazione NAT manuale richiesta.",
"siteWgDescriptionSaas": "Usa qualsiasi client WireGuard per stabilire un tunnel. Impostazione NAT manuale richiesta. FUNZIONA SOLO SU NODI AUTO-OSPITATI",
"siteLocalDescription": "Solo risorse locali. Nessun tunneling.",
"siteLocalDescriptionSaas": "Local resources only. No tunneling. Only available on remote nodes.",
"siteSeeAll": "Vedi Tutti I Siti",
"siteTunnelDescription": "Determina come vuoi connetterti al tuo sito",
"siteNewtCredentials": "Credenziali Newt",
@@ -166,7 +168,10 @@
"siteSelect": "Seleziona sito",
"siteSearch": "Cerca sito",
"siteNotFound": "Nessun sito trovato.",
"siteSelectionDescription": "Questo sito fornirà connettività alla risorsa.",
"selectCountry": "Seleziona paese",
"searchCountries": "Cerca paesi...",
"noCountryFound": "Nessun paese trovato.",
"siteSelectionDescription": "Questo sito fornirà connettività all'obiettivo.",
"resourceType": "Tipo Di Risorsa",
"resourceTypeDescription": "Determina come vuoi accedere alla tua risorsa",
"resourceHTTPSSettings": "Impostazioni HTTPS",
@@ -197,15 +202,18 @@
"general": "Generale",
"generalSettings": "Impostazioni Generali",
"proxy": "Proxy",
"internal": "Interno",
"rules": "Regole",
"resourceSettingDescription": "Configura le impostazioni sulla tua risorsa",
"resourceSetting": "Impostazioni {resourceName}",
"alwaysAllow": "Consenti Sempre",
"alwaysDeny": "Nega Sempre",
"passToAuth": "Passa all'autenticazione",
"orgSettingsDescription": "Configura le impostazioni generali della tua organizzazione",
"orgGeneralSettings": "Impostazioni Organizzazione",
"orgGeneralSettingsDescription": "Gestisci i dettagli dell'organizzazione e la configurazione",
"saveGeneralSettings": "Salva Impostazioni Generali",
"saveSettings": "Salva Impostazioni",
"orgDangerZone": "Zona Pericolosa",
"orgDangerZoneDescription": "Una volta che si elimina questo org, non c'è ritorno. Si prega di essere certi.",
"orgDelete": "Elimina Organizzazione",
@@ -249,7 +257,7 @@
"weeks": "Settimane",
"months": "Mesi",
"years": "Anni",
"day": "{count, plural, =1 {# giorno} other {# giorni}}",
"day": "{count, plural, one {# giorno} other {# giorni}}",
"apiKeysTitle": "Informazioni Chiave API",
"apiKeysConfirmCopy2": "Devi confermare di aver copiato la chiave API.",
"apiKeysErrorCreate": "Errore nella creazione della chiave API",
@@ -347,7 +355,7 @@
"licensePurchase": "Acquista Licenza",
"licensePurchaseSites": "Acquista Siti Aggiuntivi",
"licenseSitesUsedMax": "{usedSites} di {maxSites} siti utilizzati",
"licenseSitesUsed": "{count, plural, =0 {# siti} =1 {# sito} other {# siti}} nel sistema.",
"licenseSitesUsed": "{count, plural, =0 {# siti} one {# sito} other {# siti}} nel sistema.",
"licensePurchaseDescription": "Scegli quanti siti vuoi {selectedMode, select, license {acquista una licenza. Puoi sempre aggiungere altri siti più tardi.} other {aggiungi alla tua licenza esistente.}}",
"licenseFee": "Costo della licenza",
"licensePriceSite": "Prezzo per sito",
@@ -436,7 +444,7 @@
"accessRoleSelect": "Seleziona ruolo",
"inviteEmailSentDescription": "È stata inviata un'email all'utente con il link di accesso qui sotto. Devono accedere al link per accettare l'invito.",
"inviteSentDescription": "L'utente è stato invitato. Deve accedere al link qui sotto per accettare l'invito.",
"inviteExpiresIn": "L'invito scadrà tra {days, plural, =1 {# giorno} other {# giorni}}.",
"inviteExpiresIn": "L'invito scadrà tra {days, plural, one {# giorno} other {# giorni}}.",
"idpTitle": "Informazioni Generali",
"idpSelect": "Seleziona il provider di identità per l'utente esterno",
"idpNotConfigured": "Nessun provider di identità configurato. Configura un provider di identità prima di creare utenti esterni.",
@@ -449,6 +457,8 @@
"accessRoleErrorAddDescription": "Si è verificato un errore durante l'aggiunta dell'utente al ruolo.",
"userSaved": "Utente salvato",
"userSavedDescription": "L'utente è stato aggiornato.",
"autoProvisioned": "Auto Provisioned",
"autoProvisionedDescription": "Permetti a questo utente di essere gestito automaticamente dal provider di identità",
"accessControlsDescription": "Gestisci cosa questo utente può accedere e fare nell'organizzazione",
"accessControlsSubmit": "Salva Controlli di Accesso",
"roles": "Ruoli",
@@ -458,7 +468,10 @@
"createdAt": "Creato Il",
"proxyErrorInvalidHeader": "Valore dell'intestazione Host personalizzata non valido. Usa il formato nome dominio o salva vuoto per rimuovere l'intestazione Host personalizzata.",
"proxyErrorTls": "Nome Server TLS non valido. Usa il formato nome dominio o salva vuoto per rimuovere il Nome Server TLS.",
"proxyEnableSSL": "Abilita SSL (https)",
"proxyEnableSSL": "Abilita SSL",
"proxyEnableSSLDescription": "Abilita la crittografia SSL/TLS per connessioni HTTPS sicure ai tuoi obiettivi.",
"target": "Target",
"configureTarget": "Configura Obiettivi",
"targetErrorFetch": "Impossibile recuperare i target",
"targetErrorFetchDescription": "Si è verificato un errore durante il recupero dei target",
"siteErrorFetch": "Impossibile recuperare la risorsa",
@@ -485,18 +498,30 @@
"targetTlsSettings": "Configurazione Connessione Sicura",
"targetTlsSettingsDescription": "Configura le impostazioni SSL/TLS per la tua risorsa",
"targetTlsSettingsAdvanced": "Impostazioni TLS Avanzate",
"targetTlsSni": "Nome Server TLS (SNI)",
"targetTlsSni": "Nome Server Tls",
"targetTlsSniDescription": "Il Nome Server TLS da usare per SNI. Lascia vuoto per usare quello predefinito.",
"targetTlsSubmit": "Salva Impostazioni",
"targets": "Configurazione Target",
"targetsDescription": "Configura i target per instradare il traffico ai tuoi servizi",
"targetsDescription": "Configura i target per instradare il traffico ai tuoi servizi backend",
"targetStickySessions": "Abilita Sessioni Persistenti",
"targetStickySessionsDescription": "Mantieni le connessioni sullo stesso target backend per l'intera sessione.",
"methodSelect": "Seleziona metodo",
"targetSubmit": "Aggiungi Target",
"targetNoOne": "Nessun target. Aggiungi un target usando il modulo.",
"targetNoOne": "Questa risorsa non ha bersagli. Aggiungi un obiettivo per configurare dove inviare le richieste al tuo backend.",
"targetNoOneDescription": "L'aggiunta di più di un target abiliterà il bilanciamento del carico.",
"targetsSubmit": "Salva Target",
"addTarget": "Aggiungi Target",
"targetErrorInvalidIp": "Indirizzo IP non valido",
"targetErrorInvalidIpDescription": "Inserisci un indirizzo IP o un hostname valido",
"targetErrorInvalidPort": "Porta non valida",
"targetErrorInvalidPortDescription": "Inserisci un numero di porta valido",
"targetErrorNoSite": "Nessun sito selezionato",
"targetErrorNoSiteDescription": "Si prega di selezionare un sito per l'obiettivo",
"targetCreated": "Destinazione creata",
"targetCreatedDescription": "L'obiettivo è stato creato con successo",
"targetErrorCreate": "Impossibile creare l'obiettivo",
"targetErrorCreateDescription": "Si è verificato un errore durante la creazione del target",
"save": "Salva",
"proxyAdditional": "Impostazioni Proxy Aggiuntive",
"proxyAdditionalDescription": "Configura come la tua risorsa gestisce le impostazioni proxy",
"proxyCustomHeader": "Intestazione Host Personalizzata",
@@ -506,6 +531,7 @@
"ipAddressErrorInvalidFormat": "Formato indirizzo IP non valido",
"ipAddressErrorInvalidOctet": "Ottetto indirizzo IP non valido",
"path": "Percorso",
"matchPath": "Corrispondenza Tracciato",
"ipAddressRange": "Intervallo IP",
"rulesErrorFetch": "Impossibile recuperare le regole",
"rulesErrorFetchDescription": "Si è verificato un errore durante il recupero delle regole",
@@ -541,6 +567,7 @@
"rulesActions": "Azioni",
"rulesActionAlwaysAllow": "Consenti Sempre: Ignora tutti i metodi di autenticazione",
"rulesActionAlwaysDeny": "Nega Sempre: Blocca tutte le richieste; nessuna autenticazione può essere tentata",
"rulesActionPassToAuth": "Passa all'autenticazione: Consenti di tentare i metodi di autenticazione",
"rulesMatchCriteria": "Criteri di Corrispondenza",
"rulesMatchCriteriaIpAddress": "Corrisponde a un indirizzo IP specifico",
"rulesMatchCriteriaIpAddressRange": "Corrisponde a un intervallo di indirizzi IP in notazione CIDR",
@@ -703,7 +730,7 @@
"pangolinServerAdmin": "Server Admin - Pangolina",
"licenseTierProfessional": "Licenza Professional",
"licenseTierEnterprise": "Licenza Enterprise",
"licenseTierCommercial": "Licenza Commerciale",
"licenseTierPersonal": "Personal License",
"licensed": "Con Licenza",
"yes": "Sì",
"no": "No",
@@ -738,7 +765,7 @@
"idpDisplayName": "Un nome visualizzato per questo provider di identità",
"idpAutoProvisionUsers": "Provisioning Automatico Utenti",
"idpAutoProvisionUsersDescription": "Quando abilitato, gli utenti verranno creati automaticamente nel sistema al primo accesso con la possibilità di mappare gli utenti a ruoli e organizzazioni.",
"licenseBadge": "Professionista",
"licenseBadge": "EE",
"idpType": "Tipo di Provider",
"idpTypeDescription": "Seleziona il tipo di provider di identità che desideri configurare",
"idpOidcConfigure": "Configurazione OAuth2/OIDC",
@@ -832,6 +859,24 @@
"pincodeRequirementsLength": "Il PIN deve essere esattamente di 6 cifre",
"pincodeRequirementsChars": "Il PIN deve contenere solo numeri",
"passwordRequirementsLength": "La password deve essere lunga almeno 1 carattere",
"passwordRequirementsTitle": "Requisiti della password:",
"passwordRequirementLength": "Almeno 8 caratteri",
"passwordRequirementUppercase": "Almeno una lettera maiuscola",
"passwordRequirementLowercase": "Almeno una lettera minuscola",
"passwordRequirementNumber": "Almeno un numero",
"passwordRequirementSpecial": "Almeno un carattere speciale",
"passwordRequirementsMet": "✓ La password soddisfa tutti i requisiti",
"passwordStrength": "Forza della password",
"passwordStrengthWeak": "Debole",
"passwordStrengthMedium": "Media",
"passwordStrengthStrong": "Forte",
"passwordRequirements": "Requisiti:",
"passwordRequirementLengthText": "8+ caratteri",
"passwordRequirementUppercaseText": "Lettera maiuscola (A-Z)",
"passwordRequirementLowercaseText": "Lettera minuscola (a-z)",
"passwordRequirementNumberText": "Numero (0-9)",
"passwordRequirementSpecialText": "Carattere speciale (!@#$%...)",
"passwordsDoNotMatch": "Le password non coincidono",
"otpEmailRequirementsLength": "L'OTP deve essere lungo almeno 1 carattere",
"otpEmailSent": "OTP Inviato",
"otpEmailSentDescription": "Un OTP è stato inviato alla tua email",
@@ -951,19 +996,28 @@
"logoutError": "Errore durante il logout",
"signingAs": "Accesso come",
"serverAdmin": "Amministratore Server",
"managedSelfhosted": "Gestito Auto-Ospitato",
"otpEnable": "Abilita Autenticazione a Due Fattori",
"otpDisable": "Disabilita Autenticazione a Due Fattori",
"logout": "Disconnetti",
"licenseTierProfessionalRequired": "Edizione Professional Richiesta",
"licenseTierProfessionalRequiredDescription": "Questa funzionalità è disponibile solo nell'Edizione Professional.",
"actionGetOrg": "Ottieni Organizzazione",
"updateOrgUser": "Aggiorna Utente Org",
"createOrgUser": "Crea Utente Org",
"actionUpdateOrg": "Aggiorna Organizzazione",
"actionUpdateUser": "Aggiorna Utente",
"actionGetUser": "Ottieni Utente",
"actionGetOrgUser": "Ottieni Utente Organizzazione",
"actionListOrgDomains": "Elenca Domini Organizzazione",
"actionCreateSite": "Crea Sito",
"actionDeleteSite": "Elimina Sito",
"actionGetSite": "Ottieni Sito",
"actionListSites": "Elenca Siti",
"actionApplyBlueprint": "Applica Progetto",
"setupToken": "Configura Token",
"setupTokenDescription": "Inserisci il token di configurazione dalla console del server.",
"setupTokenRequired": "Il token di configurazione è richiesto",
"actionUpdateSite": "Aggiorna Sito",
"actionListSiteRoles": "Elenca Ruoli Sito Consentiti",
"actionCreateResource": "Crea Risorsa",
@@ -1019,6 +1073,17 @@
"actionDeleteIdpOrg": "Elimina Politica Org IDP",
"actionListIdpOrgs": "Elenca Org IDP",
"actionUpdateIdpOrg": "Aggiorna Org IDP",
"actionCreateClient": "Crea Client",
"actionDeleteClient": "Elimina Client",
"actionUpdateClient": "Aggiorna Client",
"actionListClients": "Elenco Clienti",
"actionGetClient": "Ottieni Client",
"actionCreateSiteResource": "Crea Risorsa del Sito",
"actionDeleteSiteResource": "Elimina Risorsa del Sito",
"actionGetSiteResource": "Ottieni Risorsa del Sito",
"actionListSiteResources": "Elenca Risorse del Sito",
"actionUpdateSiteResource": "Aggiorna Risorsa del Sito",
"actionListInvitations": "Elenco Inviti",
"noneSelected": "Nessuna selezione",
"orgNotFound2": "Nessuna organizzazione trovata.",
"searchProgress": "Ricerca...",
@@ -1034,7 +1099,6 @@
"navbar": "Menu di Navigazione",
"navbarDescription": "Menu di navigazione principale dell'applicazione",
"navbarDocsLink": "Documentazione",
"commercialEdition": "Edizione Commerciale",
"otpErrorEnable": "Impossibile abilitare 2FA",
"otpErrorEnableDescription": "Si è verificato un errore durante l'abilitazione di 2FA",
"otpSetupCheckCode": "Inserisci un codice a 6 cifre",
@@ -1090,8 +1154,10 @@
"sidebarAllUsers": "Tutti Gli Utenti",
"sidebarIdentityProviders": "Fornitori Di Identità",
"sidebarLicense": "Licenza",
"enableDockerSocket": "Abilita Docker Socket",
"enableDockerSocketDescription": "Abilita il rilevamento Docker Socket per popolare le informazioni del contenitore. Il percorso del socket deve essere fornito a Newt.",
"sidebarClients": "Clients",
"sidebarDomains": "Domini",
"enableDockerSocket": "Abilita Progetto Docker",
"enableDockerSocketDescription": "Abilita la raschiatura dell'etichetta Docker Socket per le etichette dei progetti. Il percorso del socket deve essere fornito a Newt.",
"enableDockerSocketLink": "Scopri di più",
"viewDockerContainers": "Visualizza Contenitori Docker",
"containersIn": "Contenitori in {siteName}",
@@ -1102,7 +1168,7 @@
"containerNetworks": "Reti",
"containerHostnameIp": "Hostname/IP",
"containerLabels": "Etichette",
"containerLabelsCount": "{count} etichetta{s,plural,one{} other{s}}",
"containerLabelsCount": "{count, plural, one {# etichetta} other {# etichette}}",
"containerLabelsTitle": "Etichette Del Contenitore",
"containerLabelEmpty": "<vuoto>",
"containerPorts": "Porte",
@@ -1114,7 +1180,7 @@
"showStoppedContainers": "Mostra contenitori fermati",
"noContainersFound": "Nessun contenitore trovato. Assicurarsi che i contenitori Docker siano in esecuzione.",
"searchContainersPlaceholder": "Cerca tra i contenitori {count}...",
"searchResultsCount": "{count} risultato{s,plural,one{} other{s}}",
"searchResultsCount": "{count, plural, one {# risultato} other {# risultati}}",
"filters": "Filtri",
"filterOptions": "Opzioni Filtro",
"filterPorts": "Porte",
@@ -1129,8 +1195,703 @@
"dark": "scuro",
"system": "sistema",
"theme": "Tema",
"subnetRequired": "Sottorete richiesta",
"initialSetupTitle": "Impostazione Iniziale del Server",
"initialSetupDescription": "Crea l'account amministratore del server iniziale. Può esistere solo un amministratore del server. È sempre possibile modificare queste credenziali in seguito.",
"createAdminAccount": "Crea Account Admin",
"setupErrorCreateAdmin": "Si è verificato un errore durante la creazione dell'account amministratore del server."
"setupErrorCreateAdmin": "Si è verificato un errore durante la creazione dell'account amministratore del server.",
"certificateStatus": "Stato del Certificato",
"loading": "Caricamento",
"restart": "Riavvia",
"domains": "Domini",
"domainsDescription": "Gestisci domini per la tua organizzazione",
"domainsSearch": "Cerca domini...",
"domainAdd": "Aggiungi Dominio",
"domainAddDescription": "Registra un nuovo dominio con la tua organizzazione",
"domainCreate": "Crea Dominio",
"domainCreatedDescription": "Dominio creato con successo",
"domainDeletedDescription": "Dominio eliminato con successo",
"domainQuestionRemove": "Sei sicuro di voler rimuovere il dominio {domain} dal tuo account?",
"domainMessageRemove": "Una volta rimosso, il dominio non sarà più associato al tuo account.",
"domainMessageConfirm": "Per confermare, digita il nome del dominio qui sotto.",
"domainConfirmDelete": "Conferma Eliminazione Dominio",
"domainDelete": "Elimina Dominio",
"domain": "Dominio",
"selectDomainTypeNsName": "Delega Dominio (NS)",
"selectDomainTypeNsDescription": "Questo dominio e tutti i suoi sottodomini. Usa questo quando desideri controllare un'intera zona di dominio.",
"selectDomainTypeCnameName": "Dominio Singolo (CNAME)",
"selectDomainTypeCnameDescription": "Solo questo dominio specifico. Usa questo per sottodomini individuali o specifiche voci di dominio.",
"selectDomainTypeWildcardName": "Dominio Jolly",
"selectDomainTypeWildcardDescription": "Questo dominio e i suoi sottodomini.",
"domainDelegation": "Dominio Singolo",
"selectType": "Seleziona un tipo",
"actions": "Azioni",
"refresh": "Aggiorna",
"refreshError": "Impossibile aggiornare i dati",
"verified": "Verificato",
"pending": "In attesa",
"sidebarBilling": "Fatturazione",
"billing": "Fatturazione",
"orgBillingDescription": "Gestisci le tue informazioni di fatturazione e abbonamenti",
"github": "GitHub",
"pangolinHosted": "Pangolin Hosted",
"fossorial": "Fossoriale",
"completeAccountSetup": "Completa la Configurazione dell'Account",
"completeAccountSetupDescription": "Imposta la tua password per iniziare",
"accountSetupSent": "Invieremo un codice di configurazione dell'account a questo indirizzo email.",
"accountSetupCode": "Codice di Configurazione",
"accountSetupCodeDescription": "Controlla la tua email per il codice di configurazione.",
"passwordCreate": "Crea Password",
"passwordCreateConfirm": "Conferma Password",
"accountSetupSubmit": "Invia Codice di Configurazione",
"completeSetup": "Completa la Configurazione",
"accountSetupSuccess": "Configurazione dell'account completata! Benvenuto su Pangolin!",
"documentation": "Documentazione",
"saveAllSettings": "Salva Tutte le Impostazioni",
"settingsUpdated": "Impostazioni aggiornate",
"settingsUpdatedDescription": "Tutte le impostazioni sono state aggiornate con successo",
"settingsErrorUpdate": "Impossibile aggiornare le impostazioni",
"settingsErrorUpdateDescription": "Si è verificato un errore durante l'aggiornamento delle impostazioni",
"sidebarCollapse": "Comprimi",
"sidebarExpand": "Espandi",
"newtUpdateAvailable": "Aggiornamento Disponibile",
"newtUpdateAvailableInfo": "È disponibile una nuova versione di Newt. Si prega di aggiornare all'ultima versione per la migliore esperienza.",
"domainPickerEnterDomain": "Dominio",
"domainPickerPlaceholder": "myapp.example.com",
"domainPickerDescription": "Inserisci il dominio completo della risorsa per vedere le opzioni disponibili.",
"domainPickerDescriptionSaas": "Inserisci un dominio completo, un sottodominio o semplicemente un nome per vedere le opzioni disponibili",
"domainPickerTabAll": "Tutti",
"domainPickerTabOrganization": "Organizzazione",
"domainPickerTabProvided": "Fornito",
"domainPickerSortAsc": "A-Z",
"domainPickerSortDesc": "Z-A",
"domainPickerCheckingAvailability": "Controllando la disponibilità...",
"domainPickerNoMatchingDomains": "Nessun dominio corrispondente trovato. Prova un dominio diverso o verifica le impostazioni del dominio della tua organizzazione.",
"domainPickerOrganizationDomains": "Domini dell'Organizzazione",
"domainPickerProvidedDomains": "Domini Forniti",
"domainPickerSubdomain": "Sottodominio: {subdomain}",
"domainPickerNamespace": "Namespace: {namespace}",
"domainPickerShowMore": "Mostra Altro",
"regionSelectorTitle": "Seleziona regione",
"regionSelectorInfo": "Selezionare una regione ci aiuta a fornire migliori performance per la tua posizione. Non devi necessariamente essere nella stessa regione del tuo server.",
"regionSelectorPlaceholder": "Scegli una regione",
"regionSelectorComingSoon": "Prossimamente",
"billingLoadingSubscription": "Caricamento abbonamento...",
"billingFreeTier": "Piano Gratuito",
"billingWarningOverLimit": "Avviso: Hai superato uno o più limiti di utilizzo. I tuoi siti non si connetteranno finché non modifichi il tuo abbonamento o non adegui il tuo utilizzo.",
"billingUsageLimitsOverview": "Panoramica dei Limiti di Utilizzo",
"billingMonitorUsage": "Monitora il tuo utilizzo rispetto ai limiti configurati. Se hai bisogno di aumentare i limiti, contattaci all'indirizzo support@fossorial.io.",
"billingDataUsage": "Utilizzo dei Dati",
"billingOnlineTime": "Tempo Online del Sito",
"billingUsers": "Utenti Attivi",
"billingDomains": "Domini Attivi",
"billingRemoteExitNodes": "Nodi Self-hosted Attivi",
"billingNoLimitConfigured": "Nessun limite configurato",
"billingEstimatedPeriod": "Periodo di Fatturazione Stimato",
"billingIncludedUsage": "Utilizzo Incluso",
"billingIncludedUsageDescription": "Utilizzo incluso nel tuo piano di abbonamento corrente",
"billingFreeTierIncludedUsage": "Elenchi di utilizzi inclusi nel piano gratuito",
"billingIncluded": "incluso",
"billingEstimatedTotal": "Totale Stimato:",
"billingNotes": "Note",
"billingEstimateNote": "Questa è una stima basata sul tuo utilizzo attuale.",
"billingActualChargesMayVary": "I costi effettivi possono variare.",
"billingBilledAtEnd": "Sarai fatturato alla fine del periodo di fatturazione.",
"billingModifySubscription": "Modifica Abbonamento",
"billingStartSubscription": "Inizia Abbonamento",
"billingRecurringCharge": "Addebito Ricorrente",
"billingManageSubscriptionSettings": "Gestisci impostazioni e preferenze dell'abbonamento",
"billingNoActiveSubscription": "Non hai un abbonamento attivo. Avvia il tuo abbonamento per aumentare i limiti di utilizzo.",
"billingFailedToLoadSubscription": "Caricamento abbonamento fallito",
"billingFailedToLoadUsage": "Caricamento utilizzo fallito",
"billingFailedToGetCheckoutUrl": "Errore durante l'ottenimento dell'URL di pagamento",
"billingPleaseTryAgainLater": "Per favore, riprova più tardi.",
"billingCheckoutError": "Errore di Pagamento",
"billingFailedToGetPortalUrl": "Errore durante l'ottenimento dell'URL del portale",
"billingPortalError": "Errore del Portale",
"billingDataUsageInfo": "Hai addebitato tutti i dati trasferiti attraverso i tunnel sicuri quando sei connesso al cloud. Questo include sia il traffico in entrata e in uscita attraverso tutti i siti. Quando si raggiunge il limite, i siti si disconnetteranno fino a quando non si aggiorna il piano o si riduce l'utilizzo. I dati non vengono caricati quando si utilizzano nodi.",
"billingOnlineTimeInfo": "Ti viene addebitato in base al tempo in cui i tuoi siti rimangono connessi al cloud. Ad esempio, 44,640 minuti è uguale a un sito in esecuzione 24/7 per un mese intero. Quando raggiungi il tuo limite, i tuoi siti si disconnetteranno fino a quando non aggiorni il tuo piano o riduci l'utilizzo. Il tempo non viene caricato quando si usano i nodi.",
"billingUsersInfo": "Sei addebitato per ogni utente nella tua organizzazione. La fatturazione viene calcolata giornalmente in base al numero di account utente attivi nella tua organizzazione.",
"billingDomainInfo": "Sei addebitato per ogni dominio nella tua organizzazione. La fatturazione viene calcolata giornalmente in base al numero di account dominio attivi nella tua organizzazione.",
"billingRemoteExitNodesInfo": "Sei addebitato per ogni nodo gestito nella tua organizzazione. La fatturazione viene calcolata giornalmente in base al numero di nodi gestiti attivi nella tua organizzazione.",
"domainNotFound": "Domini Non Trovati",
"domainNotFoundDescription": "Questa risorsa è disabilitata perché il dominio non esiste più nel nostro sistema. Si prega di impostare un nuovo dominio per questa risorsa.",
"failed": "Fallito",
"createNewOrgDescription": "Crea una nuova organizzazione",
"organization": "Organizzazione",
"port": "Porta",
"securityKeyManage": "Gestisci chiavi di sicurezza",
"securityKeyDescription": "Aggiungi o rimuovi chiavi di sicurezza per l'autenticazione senza password",
"securityKeyRegister": "Registra nuova chiave di sicurezza",
"securityKeyList": "Le tue chiavi di sicurezza",
"securityKeyNone": "Nessuna chiave di sicurezza registrata",
"securityKeyNameRequired": "Il nome è obbligatorio",
"securityKeyRemove": "Rimuovi",
"securityKeyLastUsed": "Ultimo utilizzo: {date}",
"securityKeyNameLabel": "Nome",
"securityKeyRegisterSuccess": "Chiave di sicurezza registrata con successo",
"securityKeyRegisterError": "Errore durante la registrazione della chiave di sicurezza",
"securityKeyRemoveSuccess": "Chiave di sicurezza rimossa con successo",
"securityKeyRemoveError": "Errore durante la rimozione della chiave di sicurezza",
"securityKeyLoadError": "Errore durante il caricamento delle chiavi di sicurezza",
"securityKeyLogin": "Continua con la chiave di sicurezza",
"securityKeyAuthError": "Errore durante l'autenticazione con chiave di sicurezza",
"securityKeyRecommendation": "Considera di registrare un'altra chiave di sicurezza su un dispositivo diverso per assicurarti di non rimanere bloccato fuori dal tuo account.",
"registering": "Registrazione in corso...",
"securityKeyPrompt": "Verifica la tua identità usando la chiave di sicurezza. Assicurati che sia connessa e pronta.",
"securityKeyBrowserNotSupported": "Il tuo browser non supporta le chiavi di sicurezza. Per favore, usa un browser moderno come Chrome, Firefox o Safari.",
"securityKeyPermissionDenied": "Consenti accesso alla tua chiave di sicurezza per continuare ad accedere.",
"securityKeyRemovedTooQuickly": "Mantieni la chiave di sicurezza connessa fino a quando il processo di accesso non è completato.",
"securityKeyNotSupported": "La tua chiave di sicurezza potrebbe non essere compatibile. Prova un'altra chiave di sicurezza.",
"securityKeyUnknownError": "Si è verificato un problema con la tua chiave di sicurezza. Riprova.",
"twoFactorRequired": "È richiesta l'autenticazione a due fattori per registrare una chiave di sicurezza.",
"twoFactor": "Autenticazione a Due Fattori",
"adminEnabled2FaOnYourAccount": "Il tuo amministratore ha abilitato l'autenticazione a due fattori per {email}. Completa il processo di configurazione per continuare.",
"securityKeyAdd": "Aggiungi Chiave di Sicurezza",
"securityKeyRegisterTitle": "Registra Nuova Chiave di Sicurezza",
"securityKeyRegisterDescription": "Collega la tua chiave di sicurezza e inserisci un nome per identificarla",
"securityKeyTwoFactorRequired": "Autenticazione a Due Fattori Richiesta",
"securityKeyTwoFactorDescription": "Inserisci il codice di autenticazione a due fattori per registrare la chiave di sicurezza",
"securityKeyTwoFactorRemoveDescription": "Inserisci il codice di autenticazione a due fattori per rimuovere la chiave di sicurezza",
"securityKeyTwoFactorCode": "Codice a Due Fattori",
"securityKeyRemoveTitle": "Rimuovi Chiave di Sicurezza",
"securityKeyRemoveDescription": "Inserisci la tua password per rimuovere la chiave di sicurezza \"{name}\"",
"securityKeyNoKeysRegistered": "Nessuna chiave di sicurezza registrata",
"securityKeyNoKeysDescription": "Aggiungi una chiave di sicurezza per migliorare la sicurezza del tuo account",
"createDomainRequired": "Dominio richiesto",
"createDomainAddDnsRecords": "Aggiungi Record DNS",
"createDomainAddDnsRecordsDescription": "Aggiungi i seguenti record DNS al tuo provider di domini per completare la configurazione.",
"createDomainNsRecords": "Record NS",
"createDomainRecord": "Record",
"createDomainType": "Tipo:",
"createDomainName": "Nome:",
"createDomainValue": "Valore:",
"createDomainCnameRecords": "Record CNAME",
"createDomainARecords": "Record A",
"createDomainRecordNumber": "Record {number}",
"createDomainTxtRecords": "Record TXT",
"createDomainSaveTheseRecords": "Salva Questi Record",
"createDomainSaveTheseRecordsDescription": "Assicurati di salvare questi record DNS poiché non li vedrai più.",
"createDomainDnsPropagation": "Propagazione DNS",
"createDomainDnsPropagationDescription": "Le modifiche DNS possono richiedere del tempo per propagarsi in Internet. Questo può richiedere da pochi minuti a 48 ore, a seconda del tuo provider DNS e delle impostazioni TTL.",
"resourcePortRequired": "Numero di porta richiesto per risorse non-HTTP",
"resourcePortNotAllowed": "Il numero di porta non deve essere impostato per risorse HTTP",
"billingPricingCalculatorLink": "Calcolatore di Prezzi",
"signUpTerms": {
"IAgreeToThe": "Accetto i",
"termsOfService": "termini di servizio",
"and": "e",
"privacyPolicy": "informativa sulla privacy"
},
"siteRequired": "Il sito è richiesto.",
"olmTunnel": "Tunnel Olm",
"olmTunnelDescription": "Usa Olm per la connettività client",
"errorCreatingClient": "Errore nella creazione del client",
"clientDefaultsNotFound": "Impostazioni predefinite del client non trovate",
"createClient": "Crea Cliente",
"createClientDescription": "Crea un nuovo cliente per connettersi ai tuoi siti",
"seeAllClients": "Vedi Tutti i Clienti",
"clientInformation": "Informazioni sul Cliente",
"clientNamePlaceholder": "Nome Cliente",
"address": "Indirizzo",
"subnetPlaceholder": "Sottorete",
"addressDescription": "L'indirizzo che questo cliente utilizzerà per la connettività",
"selectSites": "Seleziona siti",
"sitesDescription": "Il cliente avrà connettività ai siti selezionati",
"clientInstallOlm": "Installa Olm",
"clientInstallOlmDescription": "Avvia Olm sul tuo sistema",
"clientOlmCredentials": "Credenziali Olm",
"clientOlmCredentialsDescription": "Ecco come Olm si autenticherà con il server",
"olmEndpoint": "Endpoint Olm",
"olmId": "ID Olm",
"olmSecretKey": "Chiave Segreta Olm",
"clientCredentialsSave": "Salva le Tue Credenziali",
"clientCredentialsSaveDescription": "Potrai vederlo solo una volta. Assicurati di copiarlo in un luogo sicuro.",
"generalSettingsDescription": "Configura le impostazioni generali per questo cliente",
"clientUpdated": "Cliente aggiornato",
"clientUpdatedDescription": "Il cliente è stato aggiornato.",
"clientUpdateFailed": "Impossibile aggiornare il cliente",
"clientUpdateError": "Si è verificato un errore durante l'aggiornamento del cliente.",
"sitesFetchFailed": "Impossibile recuperare i siti",
"sitesFetchError": "Si è verificato un errore durante il recupero dei siti.",
"olmErrorFetchReleases": "Si è verificato un errore durante il recupero delle versioni di Olm.",
"olmErrorFetchLatest": "Si è verificato un errore durante il recupero dell'ultima versione di Olm.",
"remoteSubnets": "Sottoreti Remote",
"enterCidrRange": "Inserisci l'intervallo CIDR",
"remoteSubnetsDescription": "Aggiungi intervalli CIDR che possono essere accessibili da questo sito in remoto utilizzando i client. Usa il formato come 10.0.0.0/24. Questo si applica SOLO alla connettività del client VPN.",
"resourceEnableProxy": "Abilita Proxy Pubblico",
"resourceEnableProxyDescription": "Abilita il proxy pubblico a questa risorsa. Consente l'accesso alla risorsa dall'esterno della rete tramite il cloud su una porta aperta. Richiede la configurazione di Traefik.",
"externalProxyEnabled": "Proxy Esterno Abilitato",
"addNewTarget": "Aggiungi Nuovo Target",
"targetsList": "Elenco dei Target",
"advancedMode": "Modalità Avanzata",
"targetErrorDuplicateTargetFound": "Target duplicato trovato",
"healthCheckHealthy": "Sano",
"healthCheckUnhealthy": "Non Sano",
"healthCheckUnknown": "Sconosciuto",
"healthCheck": "Controllo Salute",
"configureHealthCheck": "Configura Controllo Salute",
"configureHealthCheckDescription": "Imposta il monitoraggio della salute per {target}",
"enableHealthChecks": "Abilita i Controlli di Salute",
"enableHealthChecksDescription": "Monitorare lo stato di salute di questo obiettivo. Se necessario, è possibile monitorare un endpoint diverso da quello del bersaglio.",
"healthScheme": "Metodo",
"healthSelectScheme": "Seleziona Metodo",
"healthCheckPath": "Percorso",
"healthHostname": "IP / Nome host",
"healthPort": "Porta",
"healthCheckPathDescription": "Percorso per verificare lo stato di salute.",
"healthyIntervalSeconds": "Intervallo Sano",
"unhealthyIntervalSeconds": "Intervallo Non Sano",
"IntervalSeconds": "Intervallo Sano",
"timeoutSeconds": "Timeout",
"timeIsInSeconds": "Il tempo è in secondi",
"retryAttempts": "Tentativi di Riprova",
"expectedResponseCodes": "Codici di Risposta Attesi",
"expectedResponseCodesDescription": "Codice di stato HTTP che indica lo stato di salute. Se lasciato vuoto, considerato sano è compreso tra 200-300.",
"customHeaders": "Intestazioni Personalizzate",
"customHeadersDescription": "Intestazioni nuova riga separate: Intestazione-Nome: valore",
"headersValidationError": "Le intestazioni devono essere nel formato: Intestazione-Nome: valore.",
"saveHealthCheck": "Salva Controllo Salute",
"healthCheckSaved": "Controllo Salute Salvato",
"healthCheckSavedDescription": "La configurazione del controllo salute è stata salvata con successo",
"healthCheckError": "Errore Controllo Salute",
"healthCheckErrorDescription": "Si è verificato un errore durante il salvataggio della configurazione del controllo salute.",
"healthCheckPathRequired": "Il percorso del controllo salute è richiesto",
"healthCheckMethodRequired": "Metodo HTTP richiesto",
"healthCheckIntervalMin": "L'intervallo del controllo deve essere almeno di 5 secondi",
"healthCheckTimeoutMin": "Il timeout deve essere di almeno 1 secondo",
"healthCheckRetryMin": "I tentativi di riprova devono essere almeno 1",
"httpMethod": "Metodo HTTP",
"selectHttpMethod": "Seleziona metodo HTTP",
"domainPickerSubdomainLabel": "Sottodominio",
"domainPickerBaseDomainLabel": "Dominio Base",
"domainPickerSearchDomains": "Cerca domini...",
"domainPickerNoDomainsFound": "Nessun dominio trovato",
"domainPickerLoadingDomains": "Caricamento domini...",
"domainPickerSelectBaseDomain": "Seleziona dominio base...",
"domainPickerNotAvailableForCname": "Non disponibile per i domini CNAME",
"domainPickerEnterSubdomainOrLeaveBlank": "Inserisci un sottodominio o lascia vuoto per utilizzare il dominio base.",
"domainPickerEnterSubdomainToSearch": "Inserisci un sottodominio per cercare e selezionare dai domini gratuiti disponibili.",
"domainPickerFreeDomains": "Domini Gratuiti",
"domainPickerSearchForAvailableDomains": "Cerca domini disponibili",
"domainPickerNotWorkSelfHosted": "Nota: I domini forniti gratuitamente non sono disponibili per le istanze self-hosted al momento.",
"resourceDomain": "Dominio",
"resourceEditDomain": "Modifica Dominio",
"siteName": "Nome del Sito",
"proxyPort": "Porta",
"resourcesTableProxyResources": "Risorse Proxy",
"resourcesTableClientResources": "Risorse Client",
"resourcesTableNoProxyResourcesFound": "Nessuna risorsa proxy trovata.",
"resourcesTableNoInternalResourcesFound": "Nessuna risorsa interna trovata.",
"resourcesTableDestination": "Destinazione",
"resourcesTableTheseResourcesForUseWith": "Queste risorse sono per uso con",
"resourcesTableClients": "Client",
"resourcesTableAndOnlyAccessibleInternally": "e sono accessibili solo internamente quando connessi con un client.",
"editInternalResourceDialogEditClientResource": "Modifica Risorsa Client",
"editInternalResourceDialogUpdateResourceProperties": "Aggiorna le proprietà della risorsa e la configurazione del target per {resourceName}.",
"editInternalResourceDialogResourceProperties": "Proprietà della Risorsa",
"editInternalResourceDialogName": "Nome",
"editInternalResourceDialogProtocol": "Protocollo",
"editInternalResourceDialogSitePort": "Porta del Sito",
"editInternalResourceDialogTargetConfiguration": "Configurazione Target",
"editInternalResourceDialogCancel": "Annulla",
"editInternalResourceDialogSaveResource": "Salva Risorsa",
"editInternalResourceDialogSuccess": "Successo",
"editInternalResourceDialogInternalResourceUpdatedSuccessfully": "Risorsa interna aggiornata con successo",
"editInternalResourceDialogError": "Errore",
"editInternalResourceDialogFailedToUpdateInternalResource": "Impossibile aggiornare la risorsa interna",
"editInternalResourceDialogNameRequired": "Il nome è obbligatorio",
"editInternalResourceDialogNameMaxLength": "Il nome deve essere inferiore a 255 caratteri",
"editInternalResourceDialogProxyPortMin": "La porta proxy deve essere almeno 1",
"editInternalResourceDialogProxyPortMax": "La porta proxy deve essere inferiore a 65536",
"editInternalResourceDialogInvalidIPAddressFormat": "Formato dell'indirizzo IP non valido",
"editInternalResourceDialogDestinationPortMin": "La porta di destinazione deve essere almeno 1",
"editInternalResourceDialogDestinationPortMax": "La porta di destinazione deve essere inferiore a 65536",
"createInternalResourceDialogNoSitesAvailable": "Nessun Sito Disponibile",
"createInternalResourceDialogNoSitesAvailableDescription": "Devi avere almeno un sito Newt con una subnet configurata per creare risorse interne.",
"createInternalResourceDialogClose": "Chiudi",
"createInternalResourceDialogCreateClientResource": "Crea Risorsa Client",
"createInternalResourceDialogCreateClientResourceDescription": "Crea una nuova risorsa che sarà accessibile ai client connessi al sito selezionato.",
"createInternalResourceDialogResourceProperties": "Proprietà della Risorsa",
"createInternalResourceDialogName": "Nome",
"createInternalResourceDialogSite": "Sito",
"createInternalResourceDialogSelectSite": "Seleziona sito...",
"createInternalResourceDialogSearchSites": "Cerca siti...",
"createInternalResourceDialogNoSitesFound": "Nessun sito trovato.",
"createInternalResourceDialogProtocol": "Protocollo",
"createInternalResourceDialogTcp": "TCP",
"createInternalResourceDialogUdp": "UDP",
"createInternalResourceDialogSitePort": "Porta del Sito",
"createInternalResourceDialogSitePortDescription": "Usa questa porta per accedere alla risorsa nel sito quando sei connesso con un client.",
"createInternalResourceDialogTargetConfiguration": "Configurazione Target",
"createInternalResourceDialogDestinationIPDescription": "L'indirizzo IP o hostname della risorsa nella rete del sito.",
"createInternalResourceDialogDestinationPortDescription": "La porta sull'IP di destinazione dove la risorsa è accessibile.",
"createInternalResourceDialogCancel": "Annulla",
"createInternalResourceDialogCreateResource": "Crea Risorsa",
"createInternalResourceDialogSuccess": "Successo",
"createInternalResourceDialogInternalResourceCreatedSuccessfully": "Risorsa interna creata con successo",
"createInternalResourceDialogError": "Errore",
"createInternalResourceDialogFailedToCreateInternalResource": "Impossibile creare la risorsa interna",
"createInternalResourceDialogNameRequired": "Il nome è obbligatorio",
"createInternalResourceDialogNameMaxLength": "Il nome non deve superare i 255 caratteri",
"createInternalResourceDialogPleaseSelectSite": "Si prega di selezionare un sito",
"createInternalResourceDialogProxyPortMin": "La porta proxy deve essere almeno 1",
"createInternalResourceDialogProxyPortMax": "La porta proxy deve essere inferiore a 65536",
"createInternalResourceDialogInvalidIPAddressFormat": "Formato dell'indirizzo IP non valido",
"createInternalResourceDialogDestinationPortMin": "La porta di destinazione deve essere almeno 1",
"createInternalResourceDialogDestinationPortMax": "La porta di destinazione deve essere inferiore a 65536",
"siteConfiguration": "Configurazione",
"siteAcceptClientConnections": "Accetta Connessioni Client",
"siteAcceptClientConnectionsDescription": "Permetti ad altri dispositivi di connettersi attraverso questa istanza Newt come gateway utilizzando i client.",
"siteAddress": "Indirizzo del Sito",
"siteAddressDescription": "Specifica l'indirizzo IP dell'host a cui i client si collegano. Questo è l'indirizzo interno del sito nella rete Pangolin per indirizzare i client. Deve rientrare nella subnet dell'Organizzazione.",
"autoLoginExternalIdp": "Accesso Automatico con IDP Esterno",
"autoLoginExternalIdpDescription": "Reindirizzare immediatamente l'utente all'IDP esterno per l'autenticazione.",
"selectIdp": "Seleziona IDP",
"selectIdpPlaceholder": "Scegli un IDP...",
"selectIdpRequired": "Si prega di selezionare un IDP quando l'accesso automatico è abilitato.",
"autoLoginTitle": "Reindirizzamento",
"autoLoginDescription": "Reindirizzandoti al provider di identità esterno per l'autenticazione.",
"autoLoginProcessing": "Preparazione dell'autenticazione...",
"autoLoginRedirecting": "Reindirizzamento al login...",
"autoLoginError": "Errore di Accesso Automatico",
"autoLoginErrorNoRedirectUrl": "Nessun URL di reindirizzamento ricevuto dal provider di identità.",
"autoLoginErrorGeneratingUrl": "Impossibile generare l'URL di autenticazione.",
"remoteExitNodeManageRemoteExitNodes": "Nodi Remoti",
"remoteExitNodeDescription": "Self-host one or more remote nodes to extend your network connectivity and reduce reliance on the cloud",
"remoteExitNodes": "Nodi",
"searchRemoteExitNodes": "Cerca nodi...",
"remoteExitNodeAdd": "Aggiungi Nodo",
"remoteExitNodeErrorDelete": "Errore nell'eliminare il nodo",
"remoteExitNodeQuestionRemove": "Sei sicuro di voler rimuovere il nodo {selectedNode} dall'organizzazione?",
"remoteExitNodeMessageRemove": "Una volta rimosso, il nodo non sarà più accessibile.",
"remoteExitNodeMessageConfirm": "Per confermare, digita il nome del nodo qui sotto.",
"remoteExitNodeConfirmDelete": "Conferma Eliminazione Nodo",
"remoteExitNodeDelete": "Elimina Nodo",
"sidebarRemoteExitNodes": "Nodi Remoti",
"remoteExitNodeCreate": {
"title": "Crea Nodo",
"description": "Crea un nuovo nodo per estendere la connettività di rete",
"viewAllButton": "Visualizza Tutti I Nodi",
"strategy": {
"title": "Strategia di Creazione",
"description": "Scegli questa opzione per configurare manualmente il nodo o generare nuove credenziali.",
"adopt": {
"title": "Adotta Nodo",
"description": "Scegli questo se hai già le credenziali per il nodo."
},
"generate": {
"title": "Genera Chiavi",
"description": "Scegli questa opzione se vuoi generare nuove chiavi per il nodo"
}
},
"adopt": {
"title": "Adotta Nodo Esistente",
"description": "Inserisci le credenziali del nodo esistente che vuoi adottare",
"nodeIdLabel": "ID Nodo",
"nodeIdDescription": "L'ID del nodo esistente che si desidera adottare",
"secretLabel": "Segreto",
"secretDescription": "La chiave segreta del nodo esistente",
"submitButton": "Adotta Nodo"
},
"generate": {
"title": "Credenziali Generate",
"description": "Usa queste credenziali generate per configurare il nodo",
"nodeIdTitle": "ID Nodo",
"secretTitle": "Segreto",
"saveCredentialsTitle": "Aggiungi Credenziali alla Configurazione",
"saveCredentialsDescription": "Aggiungi queste credenziali al tuo file di configurazione del nodo self-hosted Pangolin per completare la connessione.",
"submitButton": "Crea Nodo"
},
"validation": {
"adoptRequired": "L'ID del nodo e il segreto sono necessari quando si adotta un nodo esistente"
},
"errors": {
"loadDefaultsFailed": "Caricamento impostazioni predefinite fallito",
"defaultsNotLoaded": "Impostazioni predefinite non caricate",
"createFailed": "Impossibile creare il nodo"
},
"success": {
"created": "Nodo creato con successo"
}
},
"remoteExitNodeSelection": "Selezione Nodo",
"remoteExitNodeSelectionDescription": "Seleziona un nodo per instradare il traffico per questo sito locale",
"remoteExitNodeRequired": "Un nodo deve essere selezionato per i siti locali",
"noRemoteExitNodesAvailable": "Nessun Nodo Disponibile",
"noRemoteExitNodesAvailableDescription": "Non ci sono nodi disponibili per questa organizzazione. Crea un nodo prima per usare i siti locali.",
"exitNode": "Nodo di Uscita",
"country": "Paese",
"rulesMatchCountry": "Attualmente basato sull'IP di origine",
"managedSelfHosted": {
"title": "Gestito Auto-Ospitato",
"description": "Server Pangolin self-hosted più affidabile e a bassa manutenzione con campanelli e fischietti extra",
"introTitle": "Managed Self-Hosted Pangolin",
"introDescription": "è un'opzione di distribuzione progettata per le persone che vogliono la semplicità e l'affidabilità extra mantenendo i loro dati privati e self-hosted.",
"introDetail": "Con questa opzione, esegui ancora il tuo nodo Pangolin — i tunnel, la terminazione SSL e il traffico rimangono tutti sul tuo server. La differenza è che la gestione e il monitoraggio sono gestiti attraverso il nostro cruscotto cloud, che sblocca una serie di vantaggi:",
"benefitSimplerOperations": {
"title": "Operazioni più semplici",
"description": "Non è necessario eseguire il proprio server di posta o impostare un avviso complesso. Otterrai controlli di salute e avvisi di inattività fuori dalla casella."
},
"benefitAutomaticUpdates": {
"title": "Aggiornamenti automatici",
"description": "Il cruscotto cloud si evolve rapidamente, in modo da ottenere nuove funzionalità e correzioni di bug senza dover tirare manualmente nuovi contenitori ogni volta."
},
"benefitLessMaintenance": {
"title": "Meno manutenzione",
"description": "Nessuna migrazione di database, backup o infrastruttura extra da gestire. Gestiamo questo problema nel cloud."
},
"benefitCloudFailover": {
"title": "failover del cloud",
"description": "Se il tuo nodo scende, i tuoi tunnel possono temporaneamente fallire nei nostri punti di presenza cloud fino a quando non lo riporti online."
},
"benefitHighAvailability": {
"title": "Alta disponibilità (PoPs)",
"description": "Puoi anche allegare più nodi al tuo account per ridondanza e prestazioni migliori."
},
"benefitFutureEnhancements": {
"title": "Miglioramenti futuri",
"description": "Stiamo pianificando di aggiungere più strumenti di analisi, allerta e gestione per rendere la tua distribuzione ancora più robusta."
},
"docsAlert": {
"text": "Scopri di più sull'opzione Managed Self-Hosted nella nostra",
"documentation": "documentazione"
},
"convertButton": "Converti questo nodo in auto-ospitato gestito"
},
"internationaldomaindetected": "Dominio Internazionale Rilevato",
"willbestoredas": "Verrà conservato come:",
"roleMappingDescription": "Determinare come i ruoli sono assegnati agli utenti quando accedono quando è abilitata la fornitura automatica.",
"selectRole": "Seleziona un ruolo",
"roleMappingExpression": "Espressione",
"selectRolePlaceholder": "Scegli un ruolo",
"selectRoleDescription": "Seleziona un ruolo da assegnare a tutti gli utenti da questo provider di identità",
"roleMappingExpressionDescription": "Inserire un'espressione JMESPath per estrarre le informazioni sul ruolo dal token ID",
"idpTenantIdRequired": "L'ID dell'inquilino è obbligatorio",
"invalidValue": "Valore non valido",
"idpTypeLabel": "Tipo Provider Identità",
"roleMappingExpressionPlaceholder": "es. contiene(gruppi, 'admin') && 'Admin' <unk> <unk> 'Membro'",
"idpGoogleConfiguration": "Configurazione Google",
"idpGoogleConfigurationDescription": "Configura le tue credenziali di Google OAuth2",
"idpGoogleClientIdDescription": "Il Tuo Client Id Google OAuth2",
"idpGoogleClientSecretDescription": "Il Tuo Client Google OAuth2 Secret",
"idpAzureConfiguration": "Configurazione Azure Entra ID",
"idpAzureConfigurationDescription": "Configura le credenziali OAuth2 di Azure Entra ID",
"idpTenantId": "ID Tenant",
"idpTenantIdPlaceholder": "iltuo-inquilino-id",
"idpAzureTenantIdDescription": "Il tuo ID del tenant Azure (trovato nella panoramica di Azure Active Directory)",
"idpAzureClientIdDescription": "Il Tuo Id Client Registrazione App Azure",
"idpAzureClientSecretDescription": "Il Tuo Client Di Registrazione App Azure Secret",
"idpGoogleTitle": "Google",
"idpGoogleAlt": "Google",
"idpAzureTitle": "Azure Entra ID",
"idpAzureAlt": "Azure",
"idpGoogleConfigurationTitle": "Configurazione Google",
"idpAzureConfigurationTitle": "Configurazione Azure Entra ID",
"idpTenantIdLabel": "ID Tenant",
"idpAzureClientIdDescription2": "Il Tuo Id Client Registrazione App Azure",
"idpAzureClientSecretDescription2": "Il Tuo Client Di Registrazione App Azure Secret",
"idpGoogleDescription": "Google OAuth2/OIDC provider",
"idpAzureDescription": "Microsoft Azure OAuth2/OIDC provider",
"subnet": "Sottorete",
"subnetDescription": "La sottorete per la configurazione di rete di questa organizzazione.",
"authPage": "Pagina Autenticazione",
"authPageDescription": "Configura la pagina di autenticazione per la tua organizzazione",
"authPageDomain": "Dominio Pagina Auth",
"noDomainSet": "Nessun dominio impostato",
"changeDomain": "Cambia Dominio",
"selectDomain": "Seleziona Dominio",
"restartCertificate": "Riavvia Certificato",
"editAuthPageDomain": "Modifica Dominio Pagina Auth",
"setAuthPageDomain": "Imposta Dominio Pagina Autenticazione",
"failedToFetchCertificate": "Recupero del certificato non riuscito",
"failedToRestartCertificate": "Riavvio del certificato non riuscito",
"addDomainToEnableCustomAuthPages": "Aggiungi un dominio per abilitare le pagine di autenticazione personalizzate per la tua organizzazione",
"selectDomainForOrgAuthPage": "Seleziona un dominio per la pagina di autenticazione dell'organizzazione",
"domainPickerProvidedDomain": "Dominio Fornito",
"domainPickerFreeProvidedDomain": "Dominio Fornito Gratuito",
"domainPickerVerified": "Verificato",
"domainPickerUnverified": "Non Verificato",
"domainPickerInvalidSubdomainStructure": "Questo sottodominio contiene caratteri o struttura non validi. Sarà sanificato automaticamente quando si salva.",
"domainPickerError": "Errore",
"domainPickerErrorLoadDomains": "Impossibile caricare i domini dell'organizzazione",
"domainPickerErrorCheckAvailability": "Impossibile verificare la disponibilità del dominio",
"domainPickerInvalidSubdomain": "Sottodominio non valido",
"domainPickerInvalidSubdomainRemoved": "L'input \"{sub}\" è stato rimosso perché non è valido.",
"domainPickerInvalidSubdomainCannotMakeValid": "\"{sub}\" non può essere reso valido per {domain}.",
"domainPickerSubdomainSanitized": "Sottodominio igienizzato",
"domainPickerSubdomainCorrected": "\"{sub}\" è stato corretto in \"{sanitized}\"",
"orgAuthSignInTitle": "Accedi alla tua organizzazione",
"orgAuthChooseIdpDescription": "Scegli il tuo provider di identità per continuare",
"orgAuthNoIdpConfigured": "Questa organizzazione non ha nessun provider di identità configurato. Puoi accedere con la tua identità Pangolin.",
"orgAuthSignInWithPangolin": "Accedi con Pangolino",
"subscriptionRequiredToUse": "Per utilizzare questa funzionalità è necessario un abbonamento.",
"idpDisabled": "I provider di identità sono disabilitati.",
"orgAuthPageDisabled": "La pagina di autenticazione dell'organizzazione è disabilitata.",
"domainRestartedDescription": "Verifica del dominio riavviata con successo",
"resourceAddEntrypointsEditFile": "Modifica file: config/traefik/traefik_config.yml",
"resourceExposePortsEditFile": "Modifica file: docker-compose.yml",
"emailVerificationRequired": "Verifica via email. Effettua nuovamente il login via {dashboardUrl}/auth/login completa questo passaggio. Quindi, torna qui.",
"twoFactorSetupRequired": "È richiesta la configurazione di autenticazione a due fattori. Effettua nuovamente l'accesso tramite {dashboardUrl}/auth/login completa questo passaggio. Quindi, torna qui.",
"authPageErrorUpdateMessage": "Si è verificato un errore durante l'aggiornamento delle impostazioni della pagina di autenticazione",
"authPageUpdated": "Pagina di autenticazione aggiornata con successo",
"healthCheckNotAvailable": "Locale",
"rewritePath": "Riscrivi percorso",
"rewritePathDescription": "Riscrivi eventualmente il percorso prima di inoltrarlo al target.",
"continueToApplication": "Continua con l'applicazione",
"checkingInvite": "Controllo Invito",
"setResourceHeaderAuth": "setResourceHeaderAuth",
"resourceHeaderAuthRemove": "Rimuovi Autenticazione Intestazione",
"resourceHeaderAuthRemoveDescription": "Autenticazione intestazione rimossa con successo.",
"resourceErrorHeaderAuthRemove": "Impossibile rimuovere l'autenticazione dell'intestazione",
"resourceErrorHeaderAuthRemoveDescription": "Impossibile rimuovere l'autenticazione dell'intestazione per la risorsa.",
"resourceHeaderAuthProtectionEnabled": "Header Authentication Enabled",
"resourceHeaderAuthProtectionDisabled": "Header Authentication Disabled",
"headerAuthRemove": "Remove Header Auth",
"headerAuthAdd": "Add Header Auth",
"resourceErrorHeaderAuthSetup": "Impossibile impostare l'autenticazione dell'intestazione",
"resourceErrorHeaderAuthSetupDescription": "Impossibile impostare l'autenticazione dell'intestazione per la risorsa.",
"resourceHeaderAuthSetup": "Autenticazione intestazione impostata con successo",
"resourceHeaderAuthSetupDescription": "L'autenticazione dell'intestazione è stata impostata correttamente.",
"resourceHeaderAuthSetupTitle": "Imposta Autenticazione Intestazione",
"resourceHeaderAuthSetupTitleDescription": "Set the basic auth credentials (username and password) to protect this resource with HTTP Header Authentication. Access it using the format https://username:password@resource.example.com",
"resourceHeaderAuthSubmit": "Imposta Autenticazione Intestazione",
"actionSetResourceHeaderAuth": "Imposta Autenticazione Intestazione",
"enterpriseEdition": "Enterprise Edition",
"unlicensed": "Unlicensed",
"beta": "Beta",
"manageClients": "Manage Clients",
"manageClientsDescription": "Clients are devices that can connect to your sites",
"licenseTableValidUntil": "Valid Until",
"saasLicenseKeysSettingsTitle": "Enterprise Licenses",
"saasLicenseKeysSettingsDescription": "Generate and manage Enterprise license keys for self-hosted Pangolin instances",
"sidebarEnterpriseLicenses": "Licenses",
"generateLicenseKey": "Generate License Key",
"generateLicenseKeyForm": {
"validation": {
"emailRequired": "Please enter a valid email address",
"useCaseTypeRequired": "Please select a use case type",
"firstNameRequired": "First name is required",
"lastNameRequired": "Last name is required",
"primaryUseRequired": "Please describe your primary use",
"jobTitleRequiredBusiness": "Job title is required for business use",
"industryRequiredBusiness": "Industry is required for business use",
"stateProvinceRegionRequired": "State/Province/Region is required",
"postalZipCodeRequired": "Postal/ZIP Code is required",
"companyNameRequiredBusiness": "Company name is required for business use",
"countryOfResidenceRequiredBusiness": "Country of residence is required for business use",
"countryRequiredPersonal": "Country is required for personal use",
"agreeToTermsRequired": "You must agree to the terms",
"complianceConfirmationRequired": "You must confirm compliance with the Fossorial Commercial License"
},
"useCaseOptions": {
"personal": {
"title": "Personal Use",
"description": "For individual, non-commercial use such as learning, personal projects, or experimentation."
},
"business": {
"title": "Business Use",
"description": "For use within organizations, companies, or commercial or revenue-generating activities."
}
},
"steps": {
"emailLicenseType": {
"title": "Email & License Type",
"description": "Enter your email and choose your license type"
},
"personalInformation": {
"title": "Personal Information",
"description": "Tell us about yourself"
},
"contactInformation": {
"title": "Contact Information",
"description": "Your contact details"
},
"termsGenerate": {
"title": "Terms & Generate",
"description": "Review and accept terms to generate your license"
}
},
"alerts": {
"commercialUseDisclosure": {
"title": "Usage Disclosure",
"description": "Select the license tier that accurately reflects your intended use. The Personal License permits free use of the Software for individual, non-commercial or small-scale commercial activities with annual gross revenue under $100,000 USD. Any use beyond these limits — including use within a business, organization, or other revenue-generating environment — requires a valid Enterprise License and payment of the applicable licensing fee. All users, whether Personal or Enterprise, must comply with the Fossorial Commercial License Terms."
},
"trialPeriodInformation": {
"title": "Trial Period Information",
"description": "This License Key enables Enterprise features for a 7-day evaluation period. Continued access to Paid Features beyond the evaluation period requires activation under a valid Personal or Enterprise License. For Enterprise licensing, contact sales@fossorial.io."
}
},
"form": {
"useCaseQuestion": "Are you using Pangolin for personal or business use?",
"firstName": "First Name",
"lastName": "Last Name",
"jobTitle": "Job Title",
"primaryUseQuestion": "What do you primarily plan to use Pangolin for?",
"industryQuestion": "What is your industry?",
"prospectiveUsersQuestion": "How many prospective users do you expect to have?",
"prospectiveSitesQuestion": "How many prospective sites (tunnels) do you expect to have?",
"companyName": "Company name",
"countryOfResidence": "Country of residence",
"stateProvinceRegion": "State / Province / Region",
"postalZipCode": "Postal / ZIP Code",
"companyWebsite": "Company website",
"companyPhoneNumber": "Company phone number",
"country": "Country",
"phoneNumberOptional": "Phone number (optional)",
"complianceConfirmation": "I confirm that I am in compliance with the Fossorial Commercial License and that reporting inaccurate information or misidentifying use of the product is a violation of the license."
},
"buttons": {
"close": "Close",
"previous": "Previous",
"next": "Next",
"generateLicenseKey": "Generate License Key"
},
"toasts": {
"success": {
"title": "License key generated successfully",
"description": "Your license key has been generated and is ready to use."
},
"error": {
"title": "Failed to generate license key",
"description": "An error occurred while generating the license key."
}
}
},
"priority": "Priorità",
"priorityDescription": "I percorsi prioritari più alti sono valutati prima. Priorità = 100 significa ordinamento automatico (decidi di sistema). Usa un altro numero per applicare la priorità manuale.",
"instanceName": "Instance Name",
"pathMatchModalTitle": "Configure Path Matching",
"pathMatchModalDescription": "Set up how incoming requests should be matched based on their path.",
"pathMatchType": "Match Type",
"pathMatchPrefix": "Prefix",
"pathMatchExact": "Exact",
"pathMatchRegex": "Regex",
"pathMatchValue": "Path Value",
"clear": "Clear",
"saveChanges": "Save Changes",
"pathMatchRegexPlaceholder": "^/api/.*",
"pathMatchDefaultPlaceholder": "/path",
"pathMatchPrefixHelp": "Example: /api matches /api, /api/users, etc.",
"pathMatchExactHelp": "Example: /api matches only /api",
"pathMatchRegexHelp": "Example: ^/api/.* matches /api/anything",
"pathRewriteModalTitle": "Configure Path Rewriting",
"pathRewriteModalDescription": "Transform the matched path before forwarding to the target.",
"pathRewriteType": "Rewrite Type",
"pathRewritePrefixOption": "Prefix - Replace prefix",
"pathRewriteExactOption": "Exact - Replace entire path",
"pathRewriteRegexOption": "Regex - Pattern replacement",
"pathRewriteStripPrefixOption": "Strip Prefix - Remove prefix",
"pathRewriteValue": "Rewrite Value",
"pathRewriteRegexPlaceholder": "/new/$1",
"pathRewriteDefaultPlaceholder": "/new-path",
"pathRewritePrefixHelp": "Replace the matched prefix with this value",
"pathRewriteExactHelp": "Replace the entire path with this value when the path matches exactly",
"pathRewriteRegexHelp": "Use capture groups like $1, $2 for replacement",
"pathRewriteStripPrefixHelp": "Leave empty to strip prefix or provide new prefix",
"pathRewritePrefix": "Prefix",
"pathRewriteExact": "Exact",
"pathRewriteRegex": "Regex",
"pathRewriteStrip": "Strip",
"pathRewriteStripLabel": "strip"
}

1897
messages/ko-KR.json Normal file

File diff suppressed because it is too large Load Diff

1897
messages/nb-NO.json Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -11,8 +11,9 @@
"componentsErrorNoMemberCreate": "Nie jesteś obecnie członkiem żadnej organizacji. Aby rozpocząć, utwórz organizację.",
"componentsErrorNoMember": "Nie jesteś obecnie członkiem żadnej organizacji.",
"welcome": "Witaj w Pangolinie",
"welcomeTo": "Witaj w",
"componentsCreateOrg": "Utwórz organizację",
"componentsMember": "Jesteś członkiem {count, plural, =0 {Żadna organizacja} =1 {Jedna organizacja} other {# organizacji}}.",
"componentsMember": "Jesteś członkiem {count, plural, =0 {żadna organizacja} one {jedna organizacja} few {# organizacje} many {# organizacji} other {# organizacji}}.",
"componentsInvalidKey": "Wykryto nieprawidłowe lub wygasłe klucze licencyjne. Postępuj zgodnie z warunkami licencji, aby kontynuować korzystanie ze wszystkich funkcji.",
"dismiss": "Odrzuć",
"componentsLicenseViolation": "Naruszenie licencji: Ten serwer używa stron {usedSites} , które przekraczają limit licencyjny stron {maxSites} . Postępuj zgodnie z warunkami licencji, aby kontynuować korzystanie ze wszystkich funkcji.",
@@ -34,7 +35,7 @@
"createAccount": "Utwórz konto",
"viewSettings": "Pokaż ustawienia",
"delete": "Usuń",
"name": "Nazwisko",
"name": "Nazwa",
"online": "Dostępny",
"offline": "Offline",
"site": "Witryna",
@@ -58,7 +59,6 @@
"siteErrorCreate": "Błąd podczas tworzenia witryny",
"siteErrorCreateKeyPair": "Nie znaleziono pary kluczy lub domyślnych ustawień witryny",
"siteErrorCreateDefaults": "Nie znaleziono domyślnych ustawień witryny",
"siteNameDescription": "To jest wyświetlana nazwa witryny.",
"method": "Metoda",
"siteMethodDescription": "W ten sposób ujawnisz połączenia.",
"siteLearnNewt": "Dowiedz się, jak zainstalować Newt w systemie",
@@ -94,7 +94,9 @@
"siteNewtTunnelDescription": "Łatwiejszy sposób na stworzenie punktu wejścia w sieci. Nie ma dodatkowej konfiguracji.",
"siteWg": "Podstawowy WireGuard",
"siteWgDescription": "Użyj dowolnego klienta WireGuard do utworzenia tunelu. Wymagana jest ręczna konfiguracja NAT.",
"siteWgDescriptionSaas": "Użyj dowolnego klienta WireGuard do utworzenia tunelu. Wymagana ręczna konfiguracja NAT. DZIAŁA TYLKO NA SAMODZIELNIE HOSTOWANYCH WĘZŁACH",
"siteLocalDescription": "Tylko lokalne zasoby. Brak tunelu.",
"siteLocalDescriptionSaas": "Local resources only. No tunneling. Only available on remote nodes.",
"siteSeeAll": "Zobacz wszystkie witryny",
"siteTunnelDescription": "Określ jak chcesz połączyć się ze swoją stroną",
"siteNewtCredentials": "Aktualne dane logowania",
@@ -138,7 +140,7 @@
"resourceSearch": "Szukaj zasobów",
"openMenu": "Otwórz menu",
"resource": "Zasoby",
"title": "Rozporządzenie Rady (EWG) nr 2658/87 z dnia 23 lipca 1987 r. w sprawie nomenklatury taryfowej i statystycznej oraz w sprawie Wspólnej Taryfy Celnej (Dz.U. L 256 z 7.9.1987, s. 1).",
"title": "Tytuł",
"created": "Utworzono",
"expires": "Wygasa",
"never": "Nigdy",
@@ -166,7 +168,10 @@
"siteSelect": "Wybierz witrynę",
"siteSearch": "Szukaj witryny",
"siteNotFound": "Nie znaleziono witryny.",
"siteSelectionDescription": "Ta strona zapewni połączenie z zasobem.",
"selectCountry": "Wybierz kraj",
"searchCountries": "Szukaj krajów...",
"noCountryFound": "Nie znaleziono kraju.",
"siteSelectionDescription": "Ta strona zapewni połączenie z celem.",
"resourceType": "Typ zasobu",
"resourceTypeDescription": "Określ jak chcesz uzyskać dostęp do swojego zasobu",
"resourceHTTPSSettings": "Ustawienia HTTPS",
@@ -197,15 +202,18 @@
"general": "Ogólny",
"generalSettings": "Ustawienia ogólne",
"proxy": "Serwer pośredniczący",
"internal": "Wewętrzny",
"rules": "Regulamin",
"resourceSettingDescription": "Skonfiguruj ustawienia zasobu",
"resourceSetting": "Ustawienia {resourceName}",
"alwaysAllow": "Zawsze zezwalaj",
"alwaysDeny": "Zawsze odmawiaj",
"passToAuth": "Przekaż do Autoryzacji",
"orgSettingsDescription": "Skonfiguruj ustawienia ogólne swojej organizacji",
"orgGeneralSettings": "Ustawienia organizacji",
"orgGeneralSettingsDescription": "Zarządzaj szczegółami swojej organizacji i konfiguracją",
"saveGeneralSettings": "Zapisz ustawienia ogólne",
"saveSettings": "Zapisz ustawienia",
"orgDangerZone": "Strefa zagrożenia",
"orgDangerZoneDescription": "Po usunięciu tego organa nie ma odwrotu. Upewnij się.",
"orgDelete": "Usuń organizację",
@@ -249,7 +257,7 @@
"weeks": "Tygodnie",
"months": "Miesiące",
"years": "Lata",
"day": "{count, plural, =1 {# dzień} other {# dni}}",
"day": "{count, plural, one {# dzień} few {# dni} many {# dni} other {# dni}}",
"apiKeysTitle": "Informacje o kluczu API",
"apiKeysConfirmCopy2": "Musisz potwierdzić, że skopiowałeś klucz API.",
"apiKeysErrorCreate": "Błąd podczas tworzenia klucza API",
@@ -347,7 +355,7 @@
"licensePurchase": "Kup licencję",
"licensePurchaseSites": "Kup dodatkowe witryny",
"licenseSitesUsedMax": "Użyte strony {usedSites} z {maxSites}",
"licenseSitesUsed": "{count, plural, =0 {# witryn} =1 {# witryn} other {# witryn}} w systemie.",
"licenseSitesUsed": "{count, plural, =0 {# witryn} one {# witryna} few {# witryny} many {# witryn} other {# witryn}} w systemie.",
"licensePurchaseDescription": "Wybierz ile witryn chcesz {selectedMode, select, license {kupić licencję. Zawsze możesz dodać więcej witryn później.} other {dodaj do swojej istniejącej licencji.}}",
"licenseFee": "Opłata licencyjna",
"licensePriceSite": "Cena za witrynę",
@@ -436,7 +444,7 @@
"accessRoleSelect": "Wybierz rolę",
"inviteEmailSentDescription": "Email został wysłany do użytkownika z linkiem dostępu poniżej. Musi on uzyskać dostęp do linku, aby zaakceptować zaproszenie.",
"inviteSentDescription": "Użytkownik został zaproszony. Musi uzyskać dostęp do poniższego linku, aby zaakceptować zaproszenie.",
"inviteExpiresIn": "Zaproszenie wygaśnie za {days, plural, =1 {# dzień} other {# dni}}.",
"inviteExpiresIn": "Zaproszenie wygaśnie za {days, plural, one {# dzień} few {# dni} many {# dni} other {# dni}}.",
"idpTitle": "Informacje ogólne",
"idpSelect": "Wybierz dostawcę tożsamości dla użytkownika zewnętrznego",
"idpNotConfigured": "Nie skonfigurowano żadnych dostawców tożsamości. Skonfiguruj dostawcę tożsamości przed utworzeniem użytkowników zewnętrznych.",
@@ -449,6 +457,8 @@
"accessRoleErrorAddDescription": "Wystąpił błąd podczas dodawania użytkownika do roli.",
"userSaved": "Użytkownik zapisany",
"userSavedDescription": "Użytkownik został zaktualizowany.",
"autoProvisioned": "Przesłane automatycznie",
"autoProvisionedDescription": "Pozwól temu użytkownikowi na automatyczne zarządzanie przez dostawcę tożsamości",
"accessControlsDescription": "Zarządzaj tym, do czego użytkownik ma dostęp i co może robić w organizacji",
"accessControlsSubmit": "Zapisz kontrole dostępu",
"roles": "Role",
@@ -458,7 +468,10 @@
"createdAt": "Utworzono",
"proxyErrorInvalidHeader": "Nieprawidłowa wartość niestandardowego nagłówka hosta. Użyj formatu nazwy domeny lub zapisz pusty, aby usunąć niestandardowy nagłówek hosta.",
"proxyErrorTls": "Nieprawidłowa nazwa serwera TLS. Użyj formatu nazwy domeny lub zapisz pusty, aby usunąć nazwę serwera TLS.",
"proxyEnableSSL": "Włącz SSL (https)",
"proxyEnableSSL": "Włącz SSL",
"proxyEnableSSLDescription": "Włącz szyfrowanie SSL/TLS dla bezpiecznych połączeń HTTPS z Twoimi celami.",
"target": "Target",
"configureTarget": "Konfiguruj Targety",
"targetErrorFetch": "Nie udało się pobrać celów",
"targetErrorFetchDescription": "Wystąpił błąd podczas pobierania celów",
"siteErrorFetch": "Nie udało się pobrać zasobu",
@@ -485,18 +498,30 @@
"targetTlsSettings": "Konfiguracja bezpiecznego połączenia",
"targetTlsSettingsDescription": "Skonfiguruj ustawienia SSL/TLS dla twojego zasobu",
"targetTlsSettingsAdvanced": "Zaawansowane ustawienia TLS",
"targetTlsSni": "Nazwa serwera TLS (SNI)",
"targetTlsSni": "Nazwa serwera TLS",
"targetTlsSniDescription": "Nazwa serwera TLS do użycia dla SNI. Pozostaw puste, aby użyć domyślnej.",
"targetTlsSubmit": "Zapisz ustawienia",
"targets": "Konfiguracja celów",
"targetsDescription": "Skonfiguruj cele do kierowania ruchu do swoich usług",
"targetsDescription": "Skonfiguruj cele do kierowania ruchu do usług zaplecza",
"targetStickySessions": "Włącz sesje trwałe",
"targetStickySessionsDescription": "Utrzymuj połączenia na tym samym celu backendowym przez całą sesję.",
"methodSelect": "Wybierz metodę",
"targetSubmit": "Dodaj cel",
"targetNoOne": "Brak celów. Dodaj cel używając formularza.",
"targetNoOne": "Ten zasób nie ma żadnych celów. Dodaj cel, aby skonfigurować miejsce wysyłania żądań do twojego backendu.",
"targetNoOneDescription": "Dodanie więcej niż jednego celu powyżej włączy równoważenie obciążenia.",
"targetsSubmit": "Zapisz cele",
"addTarget": "Dodaj cel",
"targetErrorInvalidIp": "Nieprawidłowy adres IP",
"targetErrorInvalidIpDescription": "Wprowadź prawidłowy adres IP lub nazwę hosta",
"targetErrorInvalidPort": "Nieprawidłowy port",
"targetErrorInvalidPortDescription": "Wprowadź prawidłowy numer portu",
"targetErrorNoSite": "Nie wybrano witryny",
"targetErrorNoSiteDescription": "Wybierz witrynę docelową",
"targetCreated": "Cel utworzony",
"targetCreatedDescription": "Cel został utworzony pomyślnie",
"targetErrorCreate": "Nie udało się utworzyć celu",
"targetErrorCreateDescription": "Wystąpił błąd podczas tworzenia celu",
"save": "Zapisz",
"proxyAdditional": "Dodatkowe ustawienia proxy",
"proxyAdditionalDescription": "Skonfiguruj jak twój zasób obsługuje ustawienia proxy",
"proxyCustomHeader": "Niestandardowy nagłówek hosta",
@@ -506,6 +531,7 @@
"ipAddressErrorInvalidFormat": "Nieprawidłowy format adresu IP",
"ipAddressErrorInvalidOctet": "Nieprawidłowy oktet adresu IP",
"path": "Ścieżka",
"matchPath": "Ścieżka dopasowania",
"ipAddressRange": "Zakres IP",
"rulesErrorFetch": "Nie udało się pobrać reguł",
"rulesErrorFetchDescription": "Wystąpił błąd podczas pobierania reguł",
@@ -541,6 +567,7 @@
"rulesActions": "Akcje",
"rulesActionAlwaysAllow": "Zawsze zezwalaj: Pomiń wszystkie metody uwierzytelniania",
"rulesActionAlwaysDeny": "Zawsze odmawiaj: Blokuj wszystkie żądania; nie można próbować uwierzytelniania",
"rulesActionPassToAuth": "Przekaż do Autoryzacji: Zezwól na próby metod uwierzytelniania",
"rulesMatchCriteria": "Kryteria dopasowania",
"rulesMatchCriteriaIpAddress": "Dopasuj konkretny adres IP",
"rulesMatchCriteriaIpAddressRange": "Dopasuj zakres adresów IP w notacji CIDR",
@@ -703,7 +730,7 @@
"pangolinServerAdmin": "Administrator serwera - Pangolin",
"licenseTierProfessional": "Licencja Professional",
"licenseTierEnterprise": "Licencja Enterprise",
"licenseTierCommercial": "Licencja handlowa",
"licenseTierPersonal": "Personal License",
"licensed": "Licencjonowany",
"yes": "Tak",
"no": "Nie",
@@ -738,7 +765,7 @@
"idpDisplayName": "Nazwa wyświetlana dla tego dostawcy tożsamości",
"idpAutoProvisionUsers": "Automatyczne tworzenie użytkowników",
"idpAutoProvisionUsersDescription": "Gdy włączone, użytkownicy będą automatycznie tworzeni w systemie przy pierwszym logowaniu z możliwością mapowania użytkowników do ról i organizacji.",
"licenseBadge": "Profesjonalny",
"licenseBadge": "EE",
"idpType": "Typ dostawcy",
"idpTypeDescription": "Wybierz typ dostawcy tożsamości, który chcesz skonfigurować",
"idpOidcConfigure": "Konfiguracja OAuth2/OIDC",
@@ -832,6 +859,24 @@
"pincodeRequirementsLength": "PIN musi składać się dokładnie z 6 cyfr",
"pincodeRequirementsChars": "PIN może zawierać tylko cyfry",
"passwordRequirementsLength": "Hasło musi mieć co najmniej 1 znak",
"passwordRequirementsTitle": "Wymagania dotyczące hasła:",
"passwordRequirementLength": "Przynajmniej 8 znaków długości",
"passwordRequirementUppercase": "Przynajmniej jedna wielka litera",
"passwordRequirementLowercase": "Przynajmniej jedna mała litera",
"passwordRequirementNumber": "Przynajmniej jedna cyfra",
"passwordRequirementSpecial": "Przynajmniej jeden znak specjalny",
"passwordRequirementsMet": "✓ Hasło spełnia wszystkie wymagania",
"passwordStrength": "Siła hasła",
"passwordStrengthWeak": "Słabe",
"passwordStrengthMedium": "Średnie",
"passwordStrengthStrong": "Silne",
"passwordRequirements": "Wymagania:",
"passwordRequirementLengthText": "8+ znaków",
"passwordRequirementUppercaseText": "Wielka litera (A-Z)",
"passwordRequirementLowercaseText": "Mała litera (a-z)",
"passwordRequirementNumberText": "Cyfra (0-9)",
"passwordRequirementSpecialText": "Znak specjalny (!@#$%...)",
"passwordsDoNotMatch": "Hasła nie są zgodne",
"otpEmailRequirementsLength": "Kod jednorazowy musi mieć co najmniej 1 znak",
"otpEmailSent": "Kod jednorazowy wysłany",
"otpEmailSentDescription": "Kod jednorazowy został wysłany na Twój e-mail",
@@ -951,19 +996,28 @@
"logoutError": "Błąd podczas wylogowywania",
"signingAs": "Zalogowany jako",
"serverAdmin": "Administrator serwera",
"managedSelfhosted": "Zarządzane Samodzielnie-Hostingowane",
"otpEnable": "Włącz uwierzytelnianie dwuskładnikowe",
"otpDisable": "Wyłącz uwierzytelnianie dwuskładnikowe",
"logout": "Wyloguj się",
"licenseTierProfessionalRequired": "Wymagana edycja Professional",
"licenseTierProfessionalRequiredDescription": "Ta funkcja jest dostępna tylko w edycji Professional.",
"actionGetOrg": "Pobierz organizację",
"updateOrgUser": "Aktualizuj użytkownika Org",
"createOrgUser": "Utwórz użytkownika Org",
"actionUpdateOrg": "Aktualizuj organizację",
"actionUpdateUser": "Zaktualizuj użytkownika",
"actionGetUser": "Pobierz użytkownika",
"actionGetOrgUser": "Pobierz użytkownika organizacji",
"actionListOrgDomains": "Lista domen organizacji",
"actionCreateSite": "Utwórz witrynę",
"actionDeleteSite": "Usuń witrynę",
"actionGetSite": "Pobierz witrynę",
"actionListSites": "Lista witryn",
"actionApplyBlueprint": "Zastosuj schemat",
"setupToken": "Skonfiguruj token",
"setupTokenDescription": "Wprowadź token konfiguracji z konsoli serwera.",
"setupTokenRequired": "Wymagany jest token konfiguracji",
"actionUpdateSite": "Aktualizuj witrynę",
"actionListSiteRoles": "Lista dozwolonych ról witryny",
"actionCreateResource": "Utwórz zasób",
@@ -1019,6 +1073,17 @@
"actionDeleteIdpOrg": "Usuń politykę organizacji IDP",
"actionListIdpOrgs": "Lista organizacji IDP",
"actionUpdateIdpOrg": "Aktualizuj organizację IDP",
"actionCreateClient": "Utwórz klienta",
"actionDeleteClient": "Usuń klienta",
"actionUpdateClient": "Aktualizuj klienta",
"actionListClients": "Lista klientów",
"actionGetClient": "Pobierz klienta",
"actionCreateSiteResource": "Utwórz zasób witryny",
"actionDeleteSiteResource": "Usuń zasób strony",
"actionGetSiteResource": "Pobierz zasób strony",
"actionListSiteResources": "Lista zasobów strony",
"actionUpdateSiteResource": "Aktualizuj zasób strony",
"actionListInvitations": "Lista zaproszeń",
"noneSelected": "Nie wybrano",
"orgNotFound2": "Nie znaleziono organizacji.",
"searchProgress": "Szukaj...",
@@ -1034,7 +1099,6 @@
"navbar": "Menu nawigacyjne",
"navbarDescription": "Główne menu nawigacyjne aplikacji",
"navbarDocsLink": "Dokumentacja",
"commercialEdition": "Edycja komercyjna",
"otpErrorEnable": "Nie można włączyć 2FA",
"otpErrorEnableDescription": "Wystąpił błąd podczas włączania 2FA",
"otpSetupCheckCode": "Wprowadź 6-cyfrowy kod",
@@ -1090,21 +1154,23 @@
"sidebarAllUsers": "Wszyscy użytkownicy",
"sidebarIdentityProviders": "Dostawcy tożsamości",
"sidebarLicense": "Licencja",
"enableDockerSocket": "Włącz gniazdo dokera",
"enableDockerSocketDescription": "Włącz wykrywanie Docker Socket w celu wypełnienia informacji o kontenerach. Ścieżka gniazda musi być dostarczona do Newt.",
"sidebarClients": "Clients",
"sidebarDomains": "Domeny",
"enableDockerSocket": "Włącz schemat dokera",
"enableDockerSocketDescription": "Włącz etykietowanie kieszeni dokującej dla etykiet schematów. Ścieżka do gniazda musi być dostarczona do Newt.",
"enableDockerSocketLink": "Dowiedz się więcej",
"viewDockerContainers": "Zobacz kontenery dokujące",
"containersIn": "Pojemniki w {siteName}",
"selectContainerDescription": "Wybierz dowolny kontener do użycia jako nazwa hosta dla tego celu. Kliknij port, aby użyć portu.",
"containerName": "Nazwisko",
"containerName": "Nazwa",
"containerImage": "Obraz",
"containerState": "Stan",
"containerNetworks": "Sieci",
"containerHostnameIp": "Nazwa hosta/IP",
"containerLabels": "Etykiety",
"containerLabelsCount": "{count} etykieta{s,plural,one{} other{s}}",
"containerLabelsCount": "{count, plural, one {# etykieta} few {# etykiety} many {# etykiet} other {# etykiet}}",
"containerLabelsTitle": "Etykiety kontenera",
"containerLabelEmpty": "<empty>",
"containerLabelEmpty": "<pusty>",
"containerPorts": "Porty",
"containerPortsMore": "+{count} więcej",
"containerActions": "Akcje",
@@ -1114,7 +1180,7 @@
"showStoppedContainers": "Pokaż zatrzymane kontenery",
"noContainersFound": "Nie znaleziono kontenerów. Upewnij się, że kontenery dokujące są uruchomione.",
"searchContainersPlaceholder": "Szukaj w {count} kontenerach...",
"searchResultsCount": "{count} wynik{s,plural,one{} other{s}}",
"searchResultsCount": "{count, plural, one {# wynik} few {# wyniki} many {# wyników} other {# wyników}}",
"filters": "Filtry",
"filterOptions": "Opcje filtru",
"filterPorts": "Porty",
@@ -1129,8 +1195,703 @@
"dark": "ciemny",
"system": "System",
"theme": "Motyw",
"subnetRequired": "Podsieć jest wymagana",
"initialSetupTitle": "Wstępna konfiguracja serwera",
"initialSetupDescription": "Utwórz początkowe konto administratora serwera. Może istnieć tylko jeden administrator serwera. Zawsze można zmienić te dane uwierzytelniające.",
"createAdminAccount": "Utwórz konto administratora",
"setupErrorCreateAdmin": "Wystąpił błąd podczas tworzenia konta administratora serwera."
"setupErrorCreateAdmin": "Wystąpił błąd podczas tworzenia konta administratora serwera.",
"certificateStatus": "Status certyfikatu",
"loading": "Ładowanie",
"restart": "Uruchom ponownie",
"domains": "Domeny",
"domainsDescription": "Zarządzaj domenami swojej organizacji",
"domainsSearch": "Szukaj domen...",
"domainAdd": "Dodaj domenę",
"domainAddDescription": "Zarejestruj nową domenę w swojej organizacji",
"domainCreate": "Utwórz domenę",
"domainCreatedDescription": "Domena utworzona pomyślnie",
"domainDeletedDescription": "Domena usunięta pomyślnie",
"domainQuestionRemove": "Czy na pewno chcesz usunąć domenę {domain} ze swojego konta?",
"domainMessageRemove": "Po usunięciu domena nie będzie już powiązana z twoim kontem.",
"domainMessageConfirm": "Aby potwierdzić, wpisz nazwę domeny poniżej.",
"domainConfirmDelete": "Potwierdź usunięcie domeny",
"domainDelete": "Usuń domenę",
"domain": "Domena",
"selectDomainTypeNsName": "Delegacja domeny (NS)",
"selectDomainTypeNsDescription": "Ta domena i wszystkie jej subdomeny. Użyj tego, gdy chcesz kontrolować całą strefę domeny.",
"selectDomainTypeCnameName": "Pojedyncza domena (CNAME)",
"selectDomainTypeCnameDescription": "Tylko ta pojedyncza domena. Użyj tego dla poszczególnych subdomen lub wpisów specyficznych dla domeny.",
"selectDomainTypeWildcardName": "Domena wieloznaczna",
"selectDomainTypeWildcardDescription": "Ta domena i jej subdomeny.",
"domainDelegation": "Pojedyncza domena",
"selectType": "Wybierz typ",
"actions": "Akcje",
"refresh": "Odśwież",
"refreshError": "Nie udało się odświeżyć danych",
"verified": "Zatwierdzony",
"pending": "Oczekuje",
"sidebarBilling": "Fakturowanie",
"billing": "Fakturowanie",
"orgBillingDescription": "Zarządzaj swoimi informacjami rozliczeniowymi i subskrypcjami",
"github": "GitHub",
"pangolinHosted": "Logo Pangolin",
"fossorial": "Fossorial",
"completeAccountSetup": "Zakończ konfigurację konta",
"completeAccountSetupDescription": "Ustaw swoje hasło, aby rozpocząć",
"accountSetupSent": "Wyślemy kod konfiguracji konta na ten adres e-mail.",
"accountSetupCode": "Kod konfiguracji",
"accountSetupCodeDescription": "Sprawdź swój e-mail, aby znaleźć kod konfiguracji.",
"passwordCreate": "Utwórz hasło",
"passwordCreateConfirm": "Potwierdź hasło",
"accountSetupSubmit": "Wyślij kod konfiguracji",
"completeSetup": "Zakończ konfigurację",
"accountSetupSuccess": "Konfiguracja konta zakończona! Witaj w Pangolin!",
"documentation": "Dokumentacja",
"saveAllSettings": "Zapisz wszystkie ustawienia",
"settingsUpdated": "Ustawienia zaktualizowane",
"settingsUpdatedDescription": "Wszystkie ustawienia zostały pomyślnie zaktualizowane",
"settingsErrorUpdate": "Nie udało się zaktualizować ustawień",
"settingsErrorUpdateDescription": "Wystąpił błąd podczas aktualizacji ustawień",
"sidebarCollapse": "Zwiń",
"sidebarExpand": "Rozwiń",
"newtUpdateAvailable": "Dostępna aktualizacja",
"newtUpdateAvailableInfo": "Nowa wersja Newt jest dostępna. Prosimy o aktualizację do najnowszej wersji dla najlepszej pracy.",
"domainPickerEnterDomain": "Domena",
"domainPickerPlaceholder": "mojapp.example.com",
"domainPickerDescription": "Wpisz pełną domenę zasobu, aby zobaczyć dostępne opcje.",
"domainPickerDescriptionSaas": "Wprowadź pełną domenę, subdomenę lub po prostu nazwę, aby zobaczyć dostępne opcje",
"domainPickerTabAll": "Wszystko",
"domainPickerTabOrganization": "Organizacja",
"domainPickerTabProvided": "Dostarczona",
"domainPickerSortAsc": "A-Z",
"domainPickerSortDesc": "Z-A",
"domainPickerCheckingAvailability": "Sprawdzanie dostępności...",
"domainPickerNoMatchingDomains": "Nie znaleziono pasujących domen. Spróbuj innej domeny lub sprawdź ustawienia domeny swojej organizacji.",
"domainPickerOrganizationDomains": "Domeny organizacji",
"domainPickerProvidedDomains": "Dostarczone domeny",
"domainPickerSubdomain": "Subdomena: {subdomain}",
"domainPickerNamespace": "Przestrzeń nazw: {namespace}",
"domainPickerShowMore": "Pokaż więcej",
"regionSelectorTitle": "Wybierz region",
"regionSelectorInfo": "Wybór regionu pomaga nam zapewnić lepszą wydajność dla Twojej lokalizacji. Nie musisz być w tym samym regionie co Twój serwer.",
"regionSelectorPlaceholder": "Wybierz region",
"regionSelectorComingSoon": "Wkrótce dostępne",
"billingLoadingSubscription": "Ładowanie subskrypcji...",
"billingFreeTier": "Darmowy pakiet",
"billingWarningOverLimit": "Ostrzeżenie: Przekroczyłeś jeden lub więcej limitów użytkowania. Twoje witryny nie połączą się, dopóki nie zmienisz subskrypcji lub nie dostosujesz użytkowania.",
"billingUsageLimitsOverview": "Przegląd Limitów Użytkowania",
"billingMonitorUsage": "Monitoruj swoje wykorzystanie w porównaniu do skonfigurowanych limitów. Jeśli potrzebujesz zwiększenia limitów, skontaktuj się z nami pod adresem support@fossorial.io.",
"billingDataUsage": "Użycie danych",
"billingOnlineTime": "Czas Online Strony",
"billingUsers": "Aktywni użytkownicy",
"billingDomains": "Aktywne domeny",
"billingRemoteExitNodes": "Aktywne samodzielnie-hostowane węzły",
"billingNoLimitConfigured": "Nie skonfigurowano limitu",
"billingEstimatedPeriod": "Szacowany Okres Rozliczeniowy",
"billingIncludedUsage": "Zawarte użycie",
"billingIncludedUsageDescription": "Użycie zawarte w obecnym planie subskrypcji",
"billingFreeTierIncludedUsage": "Limity użycia dla darmowego pakietu",
"billingIncluded": "zawarte",
"billingEstimatedTotal": "Szacowana Całkowita:",
"billingNotes": "Notatki",
"billingEstimateNote": "To jest szacunkowe, oparte na Twoim obecnym użyciu.",
"billingActualChargesMayVary": "Rzeczywiste opłaty mogą się różnić.",
"billingBilledAtEnd": "Zostaniesz obciążony na koniec okresu rozliczeniowego.",
"billingModifySubscription": "Modyfikuj Subskrypcję",
"billingStartSubscription": "Rozpocznij Subskrypcję",
"billingRecurringCharge": "Opłata Cyklowa",
"billingManageSubscriptionSettings": "Zarządzaj ustawieniami i preferencjami subskrypcji",
"billingNoActiveSubscription": "Nie masz aktywnej subskrypcji. Rozpocznij subskrypcję, aby zwiększyć limity użytkowania.",
"billingFailedToLoadSubscription": "Nie udało się załadować subskrypcji",
"billingFailedToLoadUsage": "Nie udało się załadować użycia",
"billingFailedToGetCheckoutUrl": "Nie udało się uzyskać adresu URL zakupu",
"billingPleaseTryAgainLater": "Spróbuj ponownie później.",
"billingCheckoutError": "Błąd przy kasie",
"billingFailedToGetPortalUrl": "Nie udało się uzyskać adresu URL portalu",
"billingPortalError": "Błąd Portalu",
"billingDataUsageInfo": "Jesteś obciążony za wszystkie dane przesyłane przez bezpieczne tunele, gdy jesteś podłączony do chmury. Obejmuje to zarówno ruch przychodzący, jak i wychodzący we wszystkich Twoich witrynach. Gdy osiągniesz swój limit, twoje strony zostaną rozłączone, dopóki nie zaktualizujesz planu lub nie ograniczysz użycia. Dane nie będą naliczane przy użyciu węzłów.",
"billingOnlineTimeInfo": "Opłata zależy od tego, jak długo twoje strony pozostają połączone z chmurą. Na przykład 44,640 minut oznacza jedną stronę działającą 24/7 przez cały miesiąc. Kiedy osiągniesz swój limit, twoje strony zostaną rozłączone, dopóki nie zaktualizujesz planu lub nie zmniejsz jego wykorzystania. Czas nie będzie naliczany przy użyciu węzłów.",
"billingUsersInfo": "Jesteś obciążany za każdego użytkownika w twojej organizacji. Rozliczenia są obliczane codziennie na podstawie liczby aktywnych kont użytkowników w twojej organizacji.",
"billingDomainInfo": "Jesteś obciążany za każdą domenę w twojej organizacji. Rozliczenia są obliczane codziennie na podstawie liczby aktywnych kont domen w twojej organizacji.",
"billingRemoteExitNodesInfo": "Jesteś obciążany za każdy zarządzany węzeł w twojej organizacji. Rozliczenia są obliczane codziennie na podstawie liczby aktywnych zarządzanych węzłów w twojej organizacji.",
"domainNotFound": "Nie znaleziono domeny",
"domainNotFoundDescription": "Zasób jest wyłączony, ponieważ domena nie istnieje już w naszym systemie. Proszę ustawić nową domenę dla tego zasobu.",
"failed": "Niepowodzenie",
"createNewOrgDescription": "Utwórz nową organizację",
"organization": "Organizacja",
"port": "Port",
"securityKeyManage": "Zarządzaj kluczami bezpieczeństwa",
"securityKeyDescription": "Dodaj lub usuń klucze bezpieczeństwa do uwierzytelniania bez hasła",
"securityKeyRegister": "Zarejestruj nowy klucz bezpieczeństwa",
"securityKeyList": "Twoje klucze bezpieczeństwa",
"securityKeyNone": "Brak zarejestrowanych kluczy bezpieczeństwa",
"securityKeyNameRequired": "Nazwa jest wymagana",
"securityKeyRemove": "Usuń",
"securityKeyLastUsed": "Ostatnio używany: {date}",
"securityKeyNameLabel": "Nazwa",
"securityKeyRegisterSuccess": "Klucz bezpieczeństwa został pomyślnie zarejestrowany",
"securityKeyRegisterError": "Błąd podczas rejestracji klucza bezpieczeństwa",
"securityKeyRemoveSuccess": "Klucz bezpieczeństwa został pomyślnie usunięty",
"securityKeyRemoveError": "Błąd podczas usuwania klucza bezpieczeństwa",
"securityKeyLoadError": "Błąd podczas ładowania kluczy bezpieczeństwa",
"securityKeyLogin": "Zaloguj się kluczem bezpieczeństwa",
"securityKeyAuthError": "Błąd podczas uwierzytelniania kluczem bezpieczeństwa",
"securityKeyRecommendation": "Rozważ zarejestrowanie innego klucza bezpieczeństwa na innym urządzeniu, aby upewnić się, że nie zostaniesz zablokowany z dostępu do swojego konta.",
"registering": "Rejestracja...",
"securityKeyPrompt": "Proszę zweryfikować swoją tożsamość, używając klucza bezpieczeństwa. Upewnij się, że twój klucz bezpieczeństwa jest podłączony i gotowy.",
"securityKeyBrowserNotSupported": "Twoja przeglądarka nie obsługuje kluczy bezpieczeństwa. Proszę użyć nowoczesnej przeglądarki, takiej jak Chrome, Firefox lub Safari.",
"securityKeyPermissionDenied": "Proszę umożliwić dostęp do klucza bezpieczeństwa, aby kontynuować logowanie.",
"securityKeyRemovedTooQuickly": "Proszę utrzymać klucz bezpieczeństwa podłączony, dopóki proces logowania się nie zakończy.",
"securityKeyNotSupported": "Twój klucz bezpieczeństwa może być niekompatybilny. Proszę spróbować innego klucza bezpieczeństwa.",
"securityKeyUnknownError": "Wystąpił problem z używaniem klucza bezpieczeństwa. Proszę spróbować ponownie.",
"twoFactorRequired": "Uwierzytelnianie dwuskładnikowe jest wymagane do zarejestrowania klucza bezpieczeństwa.",
"twoFactor": "Uwierzytelnianie dwuskładnikowe",
"adminEnabled2FaOnYourAccount": "Twój administrator włączył uwierzytelnianie dwuskładnikowe dla {email}. Proszę ukończyć proces konfiguracji, aby kontynuować.",
"securityKeyAdd": "Dodaj klucz bezpieczeństwa",
"securityKeyRegisterTitle": "Zarejestruj nowy klucz bezpieczeństwa",
"securityKeyRegisterDescription": "Podłącz swój klucz bezpieczeństwa i wprowadź nazwę, aby go zidentyfikować",
"securityKeyTwoFactorRequired": "Wymagane uwierzytelnianie dwuskładnikowe",
"securityKeyTwoFactorDescription": "Proszę wprowadzić kod uwierzytelnienia dwuskładnikowego, aby zarejestrować klucz bezpieczeństwa",
"securityKeyTwoFactorRemoveDescription": "Proszę wprowadzić kod uwierzytelnienia dwuskładnikowego, aby usunąć klucz bezpieczeństwa",
"securityKeyTwoFactorCode": "Kod dwuskładnikowy",
"securityKeyRemoveTitle": "Usuń klucz bezpieczeństwa",
"securityKeyRemoveDescription": "Wprowadź hasło, aby usunąć klucz bezpieczeństwa \"{name}\"",
"securityKeyNoKeysRegistered": "Nie zarejestrowano kluczy bezpieczeństwa",
"securityKeyNoKeysDescription": "Dodaj klucz bezpieczeństwa, aby zwiększyć swoje zabezpieczenia konta",
"createDomainRequired": "Domena jest wymagana",
"createDomainAddDnsRecords": "Dodaj rekordy DNS",
"createDomainAddDnsRecordsDescription": "Dodaj poniższe rekordy DNS do swojego dostawcy domeny, aby zakończyć konfigurację.",
"createDomainNsRecords": "Rekordy NS",
"createDomainRecord": "Rekord",
"createDomainType": "Typ:",
"createDomainName": "Nazwa:",
"createDomainValue": "Wartość:",
"createDomainCnameRecords": "Rekordy CNAME",
"createDomainARecords": "Rekordy A",
"createDomainRecordNumber": "Rekord {number}",
"createDomainTxtRecords": "Rekordy TXT",
"createDomainSaveTheseRecords": "Zapisz te rekordy",
"createDomainSaveTheseRecordsDescription": "Upewnij się, że zapiszesz te rekordy DNS, ponieważ nie będziesz mieć ich ponownie na ekranie.",
"createDomainDnsPropagation": "Propagacja DNS",
"createDomainDnsPropagationDescription": "Zmiany DNS mogą zająć trochę czasu na rozpropagowanie się w Internecie. Może to potrwać od kilku minut do 48 godzin, w zależności od dostawcy DNS i ustawień TTL.",
"resourcePortRequired": "Numer portu jest wymagany dla zasobów non-HTTP",
"resourcePortNotAllowed": "Numer portu nie powinien być ustawiony dla zasobów HTTP",
"billingPricingCalculatorLink": "Kalkulator Cen",
"signUpTerms": {
"IAgreeToThe": "Zgadzam się z",
"termsOfService": "warunkami usługi",
"and": "oraz",
"privacyPolicy": "polityką prywatności"
},
"siteRequired": "Strona jest wymagana.",
"olmTunnel": "Tunel Olm",
"olmTunnelDescription": "Użyj Olm do łączności klienta",
"errorCreatingClient": "Błąd podczas tworzenia klienta",
"clientDefaultsNotFound": "Nie znaleziono domyślnych ustawień klienta",
"createClient": "Utwórz Klienta",
"createClientDescription": "Utwórz nowego klienta do łączenia się z Twoimi witrynami",
"seeAllClients": "Zobacz Wszystkich Klientów",
"clientInformation": "Informacje o Kliencie",
"clientNamePlaceholder": "Nazwa klienta",
"address": "Adres",
"subnetPlaceholder": "Podsieć",
"addressDescription": "Adres, którego ten klient będzie używać do łączności",
"selectSites": "Wybierz witryny",
"sitesDescription": "Klient będzie miał łączność z wybranymi witrynami",
"clientInstallOlm": "Zainstaluj Olm",
"clientInstallOlmDescription": "Uruchom Olm na swoim systemie",
"clientOlmCredentials": "Poświadczenia Olm",
"clientOlmCredentialsDescription": "To jest sposób, w jaki Olm będzie się uwierzytelniać z serwerem",
"olmEndpoint": "Punkt Końcowy Olm",
"olmId": "Identyfikator Olm",
"olmSecretKey": "Tajny Klucz Olm",
"clientCredentialsSave": "Zapisz swoje poświadczenia",
"clientCredentialsSaveDescription": "Będziesz mógł zobaczyć to tylko raz. Upewnij się, że skopiujesz go w bezpieczne miejsce.",
"generalSettingsDescription": "Skonfiguruj ogólne ustawienia dla tego klienta",
"clientUpdated": "Klient zaktualizowany",
"clientUpdatedDescription": "Klient został zaktualizowany.",
"clientUpdateFailed": "Nie udało się zaktualizować klienta",
"clientUpdateError": "Wystąpił błąd podczas aktualizacji klienta.",
"sitesFetchFailed": "Nie udało się pobrać witryn",
"sitesFetchError": "Wystąpił błąd podczas pobierania witryn.",
"olmErrorFetchReleases": "Wystąpił błąd podczas pobierania wydań Olm.",
"olmErrorFetchLatest": "Wystąpił błąd podczas pobierania najnowszego wydania Olm.",
"remoteSubnets": "Zdalne Podsieci",
"enterCidrRange": "Wprowadź zakres CIDR",
"remoteSubnetsDescription": "Dodaj zakresy CIDR, które można uzyskać zdalnie z tej strony za pomocą klientów. Użyj formatu jak 10.0.0.0/24. Dotyczy to WYŁĄCZNIE łączności klienta VPN.",
"resourceEnableProxy": "Włącz publiczny proxy",
"resourceEnableProxyDescription": "Włącz publiczne proxy dla tego zasobu. To umożliwia dostęp do zasobu spoza sieci przez chmurę na otwartym porcie. Wymaga konfiguracji Traefik.",
"externalProxyEnabled": "Zewnętrzny Proxy Włączony",
"addNewTarget": "Dodaj nowy cel",
"targetsList": "Lista celów",
"advancedMode": "Tryb zaawansowany",
"targetErrorDuplicateTargetFound": "Znaleziono duplikat celu",
"healthCheckHealthy": "Zdrowy",
"healthCheckUnhealthy": "Niezdrowy",
"healthCheckUnknown": "Nieznany",
"healthCheck": "Kontrola Zdrowia",
"configureHealthCheck": "Skonfiguruj Kontrolę Zdrowia",
"configureHealthCheckDescription": "Skonfiguruj monitorowanie zdrowia dla {target}",
"enableHealthChecks": "Włącz Kontrole Zdrowia",
"enableHealthChecksDescription": "Monitoruj zdrowie tego celu. Możesz monitorować inny punkt końcowy niż docelowy w razie potrzeby.",
"healthScheme": "Metoda",
"healthSelectScheme": "Wybierz metodę",
"healthCheckPath": "Ścieżka",
"healthHostname": "IP / Nazwa hosta",
"healthPort": "Port",
"healthCheckPathDescription": "Ścieżka do sprawdzania stanu zdrowia.",
"healthyIntervalSeconds": "Interwał Zdrowy",
"unhealthyIntervalSeconds": "Interwał Niezdrowy",
"IntervalSeconds": "Interwał Zdrowy",
"timeoutSeconds": "Limit Czasu",
"timeIsInSeconds": "Czas w sekundach",
"retryAttempts": "Próby Ponowienia",
"expectedResponseCodes": "Oczekiwane Kody Odpowiedzi",
"expectedResponseCodesDescription": "Kod statusu HTTP, który wskazuje zdrowy status. Jeśli pozostanie pusty, uznaje się 200-300 za zdrowy.",
"customHeaders": "Niestandardowe nagłówki",
"customHeadersDescription": "Nagłówki oddzielone: Nazwa nagłówka: wartość",
"headersValidationError": "Nagłówki muszą być w formacie: Nazwa nagłówka: wartość.",
"saveHealthCheck": "Zapisz Kontrolę Zdrowia",
"healthCheckSaved": "Kontrola Zdrowia Zapisana",
"healthCheckSavedDescription": "Konfiguracja kontroli zdrowia została zapisana pomyślnie",
"healthCheckError": "Błąd Kontroli Zdrowia",
"healthCheckErrorDescription": "Wystąpił błąd podczas zapisywania konfiguracji kontroli zdrowia",
"healthCheckPathRequired": "Ścieżka kontroli zdrowia jest wymagana",
"healthCheckMethodRequired": "Metoda HTTP jest wymagana",
"healthCheckIntervalMin": "Interwał sprawdzania musi wynosić co najmniej 5 sekund",
"healthCheckTimeoutMin": "Limit czasu musi wynosić co najmniej 1 sekundę",
"healthCheckRetryMin": "Liczba prób ponowienia musi wynosić co najmniej 1",
"httpMethod": "Metoda HTTP",
"selectHttpMethod": "Wybierz metodę HTTP",
"domainPickerSubdomainLabel": "Poddomena",
"domainPickerBaseDomainLabel": "Domen bazowa",
"domainPickerSearchDomains": "Szukaj domen...",
"domainPickerNoDomainsFound": "Nie znaleziono domen",
"domainPickerLoadingDomains": "Ładowanie domen...",
"domainPickerSelectBaseDomain": "Wybierz domenę bazową...",
"domainPickerNotAvailableForCname": "Niedostępne dla domen CNAME",
"domainPickerEnterSubdomainOrLeaveBlank": "Wprowadź poddomenę lub pozostaw puste, aby użyć domeny bazowej.",
"domainPickerEnterSubdomainToSearch": "Wprowadź poddomenę, aby wyszukać i wybrać z dostępnych darmowych domen.",
"domainPickerFreeDomains": "Darmowe domeny",
"domainPickerSearchForAvailableDomains": "Szukaj dostępnych domen",
"domainPickerNotWorkSelfHosted": "Uwaga: Darmowe domeny nie są obecnie dostępne dla instancji samodzielnie-hostowanych.",
"resourceDomain": "Domena",
"resourceEditDomain": "Edytuj domenę",
"siteName": "Nazwa strony",
"proxyPort": "Port",
"resourcesTableProxyResources": "Zasoby proxy",
"resourcesTableClientResources": "Zasoby klienta",
"resourcesTableNoProxyResourcesFound": "Nie znaleziono zasobów proxy.",
"resourcesTableNoInternalResourcesFound": "Nie znaleziono wewnętrznych zasobów.",
"resourcesTableDestination": "Miejsce docelowe",
"resourcesTableTheseResourcesForUseWith": "Te zasoby są do użytku z",
"resourcesTableClients": "Klientami",
"resourcesTableAndOnlyAccessibleInternally": "i są dostępne tylko wewnętrznie po połączeniu z klientem.",
"editInternalResourceDialogEditClientResource": "Edytuj zasób klienta",
"editInternalResourceDialogUpdateResourceProperties": "Zaktualizuj właściwości zasobu i konfigurację celu dla {resourceName}.",
"editInternalResourceDialogResourceProperties": "Właściwości zasobów",
"editInternalResourceDialogName": "Nazwa",
"editInternalResourceDialogProtocol": "Protokół",
"editInternalResourceDialogSitePort": "Port witryny",
"editInternalResourceDialogTargetConfiguration": "Konfiguracja celu",
"editInternalResourceDialogCancel": "Anuluj",
"editInternalResourceDialogSaveResource": "Zapisz zasób",
"editInternalResourceDialogSuccess": "Sukces",
"editInternalResourceDialogInternalResourceUpdatedSuccessfully": "Wewnętrzny zasób zaktualizowany pomyślnie",
"editInternalResourceDialogError": "Błąd",
"editInternalResourceDialogFailedToUpdateInternalResource": "Nie udało się zaktualizować wewnętrznego zasobu",
"editInternalResourceDialogNameRequired": "Nazwa jest wymagana",
"editInternalResourceDialogNameMaxLength": "Nazwa nie może mieć więcej niż 255 znaków",
"editInternalResourceDialogProxyPortMin": "Port proxy musi wynosić przynajmniej 1",
"editInternalResourceDialogProxyPortMax": "Port proxy nie może być większy niż 65536",
"editInternalResourceDialogInvalidIPAddressFormat": "Nieprawidłowy format adresu IP",
"editInternalResourceDialogDestinationPortMin": "Port docelowy musi wynosić przynajmniej 1",
"editInternalResourceDialogDestinationPortMax": "Port docelowy nie może być większy niż 65536",
"createInternalResourceDialogNoSitesAvailable": "Brak dostępnych stron",
"createInternalResourceDialogNoSitesAvailableDescription": "Musisz mieć co najmniej jedną stronę Newt z skonfigurowanym podsiecią, aby tworzyć wewnętrzne zasoby.",
"createInternalResourceDialogClose": "Zamknij",
"createInternalResourceDialogCreateClientResource": "Utwórz zasób klienta",
"createInternalResourceDialogCreateClientResourceDescription": "Utwórz nowy zasób, który będzie dostępny dla klientów połączonych z wybraną stroną.",
"createInternalResourceDialogResourceProperties": "Właściwości zasobów",
"createInternalResourceDialogName": "Nazwa",
"createInternalResourceDialogSite": "Witryna",
"createInternalResourceDialogSelectSite": "Wybierz stronę...",
"createInternalResourceDialogSearchSites": "Szukaj stron...",
"createInternalResourceDialogNoSitesFound": "Nie znaleziono stron.",
"createInternalResourceDialogProtocol": "Protokół",
"createInternalResourceDialogTcp": "TCP",
"createInternalResourceDialogUdp": "UDP",
"createInternalResourceDialogSitePort": "Port witryny",
"createInternalResourceDialogSitePortDescription": "Użyj tego portu, aby uzyskać dostęp do zasobu na stronie, gdy połączony z klientem.",
"createInternalResourceDialogTargetConfiguration": "Konfiguracja celu",
"createInternalResourceDialogDestinationIPDescription": "Adres IP lub nazwa hosta zasobu w sieci witryny.",
"createInternalResourceDialogDestinationPortDescription": "Port na docelowym IP, gdzie zasób jest dostępny.",
"createInternalResourceDialogCancel": "Anuluj",
"createInternalResourceDialogCreateResource": "Utwórz zasób",
"createInternalResourceDialogSuccess": "Sukces",
"createInternalResourceDialogInternalResourceCreatedSuccessfully": "Wewnętrzny zasób utworzony pomyślnie",
"createInternalResourceDialogError": "Błąd",
"createInternalResourceDialogFailedToCreateInternalResource": "Nie udało się utworzyć wewnętrznego zasobu",
"createInternalResourceDialogNameRequired": "Nazwa jest wymagana",
"createInternalResourceDialogNameMaxLength": "Nazwa nie może mieć więcej niż 255 znaków",
"createInternalResourceDialogPleaseSelectSite": "Proszę wybrać stronę",
"createInternalResourceDialogProxyPortMin": "Port proxy musi wynosić przynajmniej 1",
"createInternalResourceDialogProxyPortMax": "Port proxy nie może być większy niż 65536",
"createInternalResourceDialogInvalidIPAddressFormat": "Nieprawidłowy format adresu IP",
"createInternalResourceDialogDestinationPortMin": "Port docelowy musi wynosić przynajmniej 1",
"createInternalResourceDialogDestinationPortMax": "Port docelowy nie może być większy niż 65536",
"siteConfiguration": "Konfiguracja",
"siteAcceptClientConnections": "Akceptuj połączenia klienta",
"siteAcceptClientConnectionsDescription": "Pozwól innym urządzeniom połączyć się przez tę instancję Newt jako bramę za pomocą klientów.",
"siteAddress": "Adres strony",
"siteAddressDescription": "Podaj adres IP hosta, do którego klienci będą się łączyć. Jest to wewnętrzny adres strony w sieci Pangolin dla klientów do adresowania. Musi zawierać się w podsieci organizacji.",
"autoLoginExternalIdp": "Automatyczny login z zewnętrznym IDP",
"autoLoginExternalIdpDescription": "Natychmiastowe przekierowanie użytkownika do zewnętrznego IDP w celu uwierzytelnienia.",
"selectIdp": "Wybierz IDP",
"selectIdpPlaceholder": "Wybierz IDP...",
"selectIdpRequired": "Proszę wybrać IDP, gdy aktywne jest automatyczne logowanie.",
"autoLoginTitle": "Przekierowywanie",
"autoLoginDescription": "Przekierowanie do zewnętrznego dostawcy tożsamości w celu uwierzytelnienia.",
"autoLoginProcessing": "Przygotowywanie uwierzytelniania...",
"autoLoginRedirecting": "Przekierowanie do logowania...",
"autoLoginError": "Błąd automatycznego logowania",
"autoLoginErrorNoRedirectUrl": "Nie otrzymano URL przekierowania od dostawcy tożsamości.",
"autoLoginErrorGeneratingUrl": "Nie udało się wygenerować URL uwierzytelniania.",
"remoteExitNodeManageRemoteExitNodes": "Zdalne węzły",
"remoteExitNodeDescription": "Self-host one or more remote nodes to extend your network connectivity and reduce reliance on the cloud",
"remoteExitNodes": "Węzły",
"searchRemoteExitNodes": "Szukaj węzłów...",
"remoteExitNodeAdd": "Dodaj węzeł",
"remoteExitNodeErrorDelete": "Błąd podczas usuwania węzła",
"remoteExitNodeQuestionRemove": "Czy na pewno chcesz usunąć węzeł {selectedNode} z organizacji?",
"remoteExitNodeMessageRemove": "Po usunięciu, węzeł nie będzie już dostępny.",
"remoteExitNodeMessageConfirm": "Aby potwierdzić, wpisz nazwę węzła poniżej.",
"remoteExitNodeConfirmDelete": "Potwierdź usunięcie węzła",
"remoteExitNodeDelete": "Usuń węzeł",
"sidebarRemoteExitNodes": "Zdalne węzły",
"remoteExitNodeCreate": {
"title": "Utwórz węzeł",
"description": "Utwórz nowy węzeł, aby rozszerzyć połączenie z siecią",
"viewAllButton": "Zobacz wszystkie węzły",
"strategy": {
"title": "Strategia Tworzenia",
"description": "Wybierz to, aby ręcznie skonfigurować węzeł lub wygenerować nowe poświadczenia.",
"adopt": {
"title": "Zaadoptuj Węzeł",
"description": "Wybierz to, jeśli masz już dane logowania dla węzła."
},
"generate": {
"title": "Generuj Klucze",
"description": "Wybierz to, jeśli chcesz wygenerować nowe klucze dla węzła"
}
},
"adopt": {
"title": "Zaadoptuj Istniejący Węzeł",
"description": "Wprowadź dane logowania istniejącego węzła, który chcesz przyjąć",
"nodeIdLabel": "ID węzła",
"nodeIdDescription": "ID istniejącego węzła, który chcesz przyjąć",
"secretLabel": "Sekret",
"secretDescription": "Sekretny klucz istniejącego węzła",
"submitButton": "Przyjmij węzeł"
},
"generate": {
"title": "Wygenerowane Poświadczenia",
"description": "Użyj tych danych logowania, aby skonfigurować węzeł",
"nodeIdTitle": "ID węzła",
"secretTitle": "Sekret",
"saveCredentialsTitle": "Dodaj Poświadczenia do Konfiguracji",
"saveCredentialsDescription": "Dodaj te poświadczenia do pliku konfiguracyjnego swojego samodzielnie-hostowanego węzła Pangolin, aby zakończyć połączenie.",
"submitButton": "Utwórz węzeł"
},
"validation": {
"adoptRequired": "Identyfikator węzła i sekret są wymagane podczas przyjmowania istniejącego węzła"
},
"errors": {
"loadDefaultsFailed": "Nie udało się załadować domyślnych ustawień",
"defaultsNotLoaded": "Domyślne ustawienia nie zostały załadowane",
"createFailed": "Nie udało się utworzyć węzła"
},
"success": {
"created": "Węzeł utworzony pomyślnie"
}
},
"remoteExitNodeSelection": "Wybór węzła",
"remoteExitNodeSelectionDescription": "Wybierz węzeł do przekierowania ruchu dla tej lokalnej witryny",
"remoteExitNodeRequired": "Węzeł musi być wybrany dla lokalnych witryn",
"noRemoteExitNodesAvailable": "Brak dostępnych węzłów",
"noRemoteExitNodesAvailableDescription": "Węzły nie są dostępne dla tej organizacji. Utwórz węzeł, aby używać lokalnych witryn.",
"exitNode": "Węzeł Wyjściowy",
"country": "Kraj",
"rulesMatchCountry": "Obecnie bazuje na adresie IP źródła",
"managedSelfHosted": {
"title": "Zarządzane Samodzielnie-Hostingowane",
"description": "Większa niezawodność i niska konserwacja serwera Pangolin z dodatkowymi dzwonkami i sygnałami",
"introTitle": "Zarządzany samowystarczalny Pangolin",
"introDescription": "jest opcją wdrażania zaprojektowaną dla osób, które chcą prostoty i dodatkowej niezawodności, przy jednoczesnym utrzymaniu swoich danych prywatnych i samodzielnych.",
"introDetail": "Z tą opcją nadal obsługujesz swój własny węzeł Pangolin — tunele, zakończenie SSL i ruch na Twoim serwerze. Różnica polega na tym, że zarządzanie i monitorowanie odbywa się za pomocą naszej tablicy rozdzielczej, która odblokowuje szereg korzyści:",
"benefitSimplerOperations": {
"title": "Uproszczone operacje",
"description": "Nie ma potrzeby uruchamiania własnego serwera pocztowego lub ustawiania skomplikowanych powiadomień. Będziesz mieć kontrolę zdrowia i powiadomienia o przestoju."
},
"benefitAutomaticUpdates": {
"title": "Automatyczne aktualizacje",
"description": "Panel chmury rozwija się szybko, więc otrzymujesz nowe funkcje i poprawki błędów bez konieczności ręcznego ciągnięcia nowych kontenerów za każdym razem."
},
"benefitLessMaintenance": {
"title": "Mniej konserwacji",
"description": "Brak migracji bazy danych, kopii zapasowych lub dodatkowej infrastruktury do zarządzania. Obsługujemy to w chmurze."
},
"benefitCloudFailover": {
"title": "Przegrywanie w chmurze",
"description": "Jeśli Twój węzeł zostanie wyłączony, tunele mogą tymczasowo zawieść do naszych punktów w chmurze, dopóki nie przyniesiesz go z powrotem do trybu online."
},
"benefitHighAvailability": {
"title": "Wysoka dostępność (PoPs)",
"description": "Możesz również dołączyć wiele węzłów do swojego konta w celu nadmiarowości i lepszej wydajności."
},
"benefitFutureEnhancements": {
"title": "Przyszłe ulepszenia",
"description": "Planujemy dodać więcej narzędzi analitycznych, ostrzegawczych i zarządzania, aby zwiększyć odporność wdrożenia."
},
"docsAlert": {
"text": "Dowiedz się więcej o opcji zarządzania samodzielnym hostingiem w naszym",
"documentation": "dokumentacja"
},
"convertButton": "Konwertuj ten węzeł do zarządzanego samodzielnie"
},
"internationaldomaindetected": "Wykryto międzynarodową domenę",
"willbestoredas": "Będą przechowywane jako:",
"roleMappingDescription": "Określ jak role są przypisywane do użytkowników podczas logowania się, gdy automatyczne świadczenie jest włączone.",
"selectRole": "Wybierz rolę",
"roleMappingExpression": "Wyrażenie",
"selectRolePlaceholder": "Wybierz rolę",
"selectRoleDescription": "Wybierz rolę do przypisania wszystkim użytkownikom od tego dostawcy tożsamości",
"roleMappingExpressionDescription": "Wprowadź wyrażenie JMESŚcieżki, aby wyodrębnić informacje o roli z tokenu ID",
"idpTenantIdRequired": "ID lokatora jest wymagane",
"invalidValue": "Nieprawidłowa wartość",
"idpTypeLabel": "Typ dostawcy tożsamości",
"roleMappingExpressionPlaceholder": "np. zawiera(grupy, 'admin') && 'Admin' || 'Członek'",
"idpGoogleConfiguration": "Konfiguracja Google",
"idpGoogleConfigurationDescription": "Skonfiguruj swoje poświadczenia Google OAuth2",
"idpGoogleClientIdDescription": "Twój identyfikator klienta Google OAuth2",
"idpGoogleClientSecretDescription": "Twój klucz klienta Google OAuth2",
"idpAzureConfiguration": "Konfiguracja Azure Entra ID",
"idpAzureConfigurationDescription": "Skonfiguruj swoje dane logowania OAuth2 Azure Entra",
"idpTenantId": "ID Najemcy",
"idpTenantIdPlaceholder": "twoj-lokator",
"idpAzureTenantIdDescription": "Twój identyfikator dzierżawcy Azure (znaleziony w Podglądzie Azure Active Directory",
"idpAzureClientIdDescription": "Twój identyfikator klienta rejestracji aplikacji Azure",
"idpAzureClientSecretDescription": "Klucz tajny Twojego klienta rejestracji aplikacji Azure",
"idpGoogleTitle": "Google",
"idpGoogleAlt": "Google",
"idpAzureTitle": "Azure Entra ID",
"idpAzureAlt": "Azure",
"idpGoogleConfigurationTitle": "Konfiguracja Google",
"idpAzureConfigurationTitle": "Konfiguracja Azure Entra ID",
"idpTenantIdLabel": "ID Najemcy",
"idpAzureClientIdDescription2": "Twój identyfikator klienta rejestracji aplikacji Azure",
"idpAzureClientSecretDescription2": "Klucz tajny Twojego klienta rejestracji aplikacji Azure",
"idpGoogleDescription": "Dostawca Google OAuth2/OIDC",
"idpAzureDescription": "Microsoft Azure OAuth2/OIDC provider",
"subnet": "Podsieć",
"subnetDescription": "Podsieć dla konfiguracji sieci tej organizacji.",
"authPage": "Strona uwierzytelniania",
"authPageDescription": "Skonfiguruj stronę uwierzytelniania dla swojej organizacji",
"authPageDomain": "Domena strony uwierzytelniania",
"noDomainSet": "Nie ustawiono domeny",
"changeDomain": "Zmień domenę",
"selectDomain": "Wybierz domenę",
"restartCertificate": "Uruchom ponownie certyfikat",
"editAuthPageDomain": "Edytuj domenę strony uwierzytelniania",
"setAuthPageDomain": "Ustaw domenę strony uwierzytelniania",
"failedToFetchCertificate": "Nie udało się pobrać certyfikatu",
"failedToRestartCertificate": "Nie udało się ponownie uruchomić certyfikatu",
"addDomainToEnableCustomAuthPages": "Dodaj domenę, aby włączyć niestandardowe strony uwierzytelniania dla Twojej organizacji",
"selectDomainForOrgAuthPage": "Wybierz domenę dla strony uwierzytelniania organizacji",
"domainPickerProvidedDomain": "Dostarczona domena",
"domainPickerFreeProvidedDomain": "Darmowa oferowana domena",
"domainPickerVerified": "Zweryfikowano",
"domainPickerUnverified": "Niezweryfikowane",
"domainPickerInvalidSubdomainStructure": "Ta subdomena zawiera nieprawidłowe znaki lub strukturę. Zostanie ona automatycznie oczyszczona po zapisaniu.",
"domainPickerError": "Błąd",
"domainPickerErrorLoadDomains": "Nie udało się załadować domen organizacji",
"domainPickerErrorCheckAvailability": "Nie udało się sprawdzić dostępności domeny",
"domainPickerInvalidSubdomain": "Nieprawidłowa subdomena",
"domainPickerInvalidSubdomainRemoved": "Wejście \"{sub}\" zostało usunięte, ponieważ jest nieprawidłowe.",
"domainPickerInvalidSubdomainCannotMakeValid": "\"{sub}\" nie może być poprawne dla {domain}.",
"domainPickerSubdomainSanitized": "Poddomena oczyszczona",
"domainPickerSubdomainCorrected": "\"{sub}\" został skorygowany do \"{sanitized}\"",
"orgAuthSignInTitle": "Zaloguj się do swojej organizacji",
"orgAuthChooseIdpDescription": "Wybierz swojego dostawcę tożsamości, aby kontynuować",
"orgAuthNoIdpConfigured": "Ta organizacja nie ma skonfigurowanych żadnych dostawców tożsamości. Zamiast tego możesz zalogować się za pomocą swojej tożsamości Pangolin.",
"orgAuthSignInWithPangolin": "Zaloguj się używając Pangolin",
"subscriptionRequiredToUse": "Do korzystania z tej funkcji wymagana jest subskrypcja.",
"idpDisabled": "Dostawcy tożsamości są wyłączeni",
"orgAuthPageDisabled": "Strona autoryzacji organizacji jest wyłączona.",
"domainRestartedDescription": "Weryfikacja domeny zrestartowana pomyślnie",
"resourceAddEntrypointsEditFile": "Edytuj plik: config/traefik/traefik_config.yml",
"resourceExposePortsEditFile": "Edytuj plik: docker-compose.yml",
"emailVerificationRequired": "Weryfikacja adresu e-mail jest wymagana. Zaloguj się ponownie przez {dashboardUrl}/auth/login zakończył ten krok. Następnie wróć tutaj.",
"twoFactorSetupRequired": "Konfiguracja uwierzytelniania dwuskładnikowego jest wymagana. Zaloguj się ponownie przez {dashboardUrl}/auth/login dokończ ten krok. Następnie wróć tutaj.",
"authPageErrorUpdateMessage": "Wystąpił błąd podczas aktualizacji ustawień strony uwierzytelniania",
"authPageUpdated": "Strona uwierzytelniania została pomyślnie zaktualizowana",
"healthCheckNotAvailable": "Lokalny",
"rewritePath": "Przepis Ścieżki",
"rewritePathDescription": "Opcjonalnie przepisz ścieżkę przed przesłaniem do celu.",
"continueToApplication": "Kontynuuj do aplikacji",
"checkingInvite": "Sprawdzanie zaproszenia",
"setResourceHeaderAuth": "setResourceHeaderAuth",
"resourceHeaderAuthRemove": "Usuń autoryzację nagłówka",
"resourceHeaderAuthRemoveDescription": "Uwierzytelnianie nagłówka zostało pomyślnie usunięte.",
"resourceErrorHeaderAuthRemove": "Nie udało się usunąć uwierzytelniania nagłówka",
"resourceErrorHeaderAuthRemoveDescription": "Nie można usunąć uwierzytelniania nagłówka zasobu.",
"resourceHeaderAuthProtectionEnabled": "Header Authentication Enabled",
"resourceHeaderAuthProtectionDisabled": "Header Authentication Disabled",
"headerAuthRemove": "Remove Header Auth",
"headerAuthAdd": "Add Header Auth",
"resourceErrorHeaderAuthSetup": "Nie udało się ustawić uwierzytelniania nagłówka",
"resourceErrorHeaderAuthSetupDescription": "Nie można ustawić uwierzytelniania nagłówka dla zasobu.",
"resourceHeaderAuthSetup": "Uwierzytelnianie nagłówka ustawione pomyślnie",
"resourceHeaderAuthSetupDescription": "Uwierzytelnianie nagłówka zostało ustawione.",
"resourceHeaderAuthSetupTitle": "Ustaw uwierzytelnianie nagłówka",
"resourceHeaderAuthSetupTitleDescription": "Set the basic auth credentials (username and password) to protect this resource with HTTP Header Authentication. Access it using the format https://username:password@resource.example.com",
"resourceHeaderAuthSubmit": "Ustaw uwierzytelnianie nagłówka",
"actionSetResourceHeaderAuth": "Ustaw uwierzytelnianie nagłówka",
"enterpriseEdition": "Enterprise Edition",
"unlicensed": "Unlicensed",
"beta": "Beta",
"manageClients": "Manage Clients",
"manageClientsDescription": "Clients are devices that can connect to your sites",
"licenseTableValidUntil": "Valid Until",
"saasLicenseKeysSettingsTitle": "Enterprise Licenses",
"saasLicenseKeysSettingsDescription": "Generate and manage Enterprise license keys for self-hosted Pangolin instances",
"sidebarEnterpriseLicenses": "Licenses",
"generateLicenseKey": "Generate License Key",
"generateLicenseKeyForm": {
"validation": {
"emailRequired": "Please enter a valid email address",
"useCaseTypeRequired": "Please select a use case type",
"firstNameRequired": "First name is required",
"lastNameRequired": "Last name is required",
"primaryUseRequired": "Please describe your primary use",
"jobTitleRequiredBusiness": "Job title is required for business use",
"industryRequiredBusiness": "Industry is required for business use",
"stateProvinceRegionRequired": "State/Province/Region is required",
"postalZipCodeRequired": "Postal/ZIP Code is required",
"companyNameRequiredBusiness": "Company name is required for business use",
"countryOfResidenceRequiredBusiness": "Country of residence is required for business use",
"countryRequiredPersonal": "Country is required for personal use",
"agreeToTermsRequired": "You must agree to the terms",
"complianceConfirmationRequired": "You must confirm compliance with the Fossorial Commercial License"
},
"useCaseOptions": {
"personal": {
"title": "Personal Use",
"description": "For individual, non-commercial use such as learning, personal projects, or experimentation."
},
"business": {
"title": "Business Use",
"description": "For use within organizations, companies, or commercial or revenue-generating activities."
}
},
"steps": {
"emailLicenseType": {
"title": "Email & License Type",
"description": "Enter your email and choose your license type"
},
"personalInformation": {
"title": "Personal Information",
"description": "Tell us about yourself"
},
"contactInformation": {
"title": "Contact Information",
"description": "Your contact details"
},
"termsGenerate": {
"title": "Terms & Generate",
"description": "Review and accept terms to generate your license"
}
},
"alerts": {
"commercialUseDisclosure": {
"title": "Usage Disclosure",
"description": "Select the license tier that accurately reflects your intended use. The Personal License permits free use of the Software for individual, non-commercial or small-scale commercial activities with annual gross revenue under $100,000 USD. Any use beyond these limits — including use within a business, organization, or other revenue-generating environment — requires a valid Enterprise License and payment of the applicable licensing fee. All users, whether Personal or Enterprise, must comply with the Fossorial Commercial License Terms."
},
"trialPeriodInformation": {
"title": "Trial Period Information",
"description": "This License Key enables Enterprise features for a 7-day evaluation period. Continued access to Paid Features beyond the evaluation period requires activation under a valid Personal or Enterprise License. For Enterprise licensing, contact sales@fossorial.io."
}
},
"form": {
"useCaseQuestion": "Are you using Pangolin for personal or business use?",
"firstName": "First Name",
"lastName": "Last Name",
"jobTitle": "Job Title",
"primaryUseQuestion": "What do you primarily plan to use Pangolin for?",
"industryQuestion": "What is your industry?",
"prospectiveUsersQuestion": "How many prospective users do you expect to have?",
"prospectiveSitesQuestion": "How many prospective sites (tunnels) do you expect to have?",
"companyName": "Company name",
"countryOfResidence": "Country of residence",
"stateProvinceRegion": "State / Province / Region",
"postalZipCode": "Postal / ZIP Code",
"companyWebsite": "Company website",
"companyPhoneNumber": "Company phone number",
"country": "Country",
"phoneNumberOptional": "Phone number (optional)",
"complianceConfirmation": "I confirm that I am in compliance with the Fossorial Commercial License and that reporting inaccurate information or misidentifying use of the product is a violation of the license."
},
"buttons": {
"close": "Close",
"previous": "Previous",
"next": "Next",
"generateLicenseKey": "Generate License Key"
},
"toasts": {
"success": {
"title": "License key generated successfully",
"description": "Your license key has been generated and is ready to use."
},
"error": {
"title": "Failed to generate license key",
"description": "An error occurred while generating the license key."
}
}
},
"priority": "Priorytet",
"priorityDescription": "Najpierw oceniane są trasy priorytetowe. Priorytet = 100 oznacza automatyczne zamawianie (decyzje systemowe). Użyj innego numeru, aby wyegzekwować ręczny priorytet.",
"instanceName": "Instance Name",
"pathMatchModalTitle": "Configure Path Matching",
"pathMatchModalDescription": "Set up how incoming requests should be matched based on their path.",
"pathMatchType": "Match Type",
"pathMatchPrefix": "Prefix",
"pathMatchExact": "Exact",
"pathMatchRegex": "Regex",
"pathMatchValue": "Path Value",
"clear": "Clear",
"saveChanges": "Save Changes",
"pathMatchRegexPlaceholder": "^/api/.*",
"pathMatchDefaultPlaceholder": "/path",
"pathMatchPrefixHelp": "Example: /api matches /api, /api/users, etc.",
"pathMatchExactHelp": "Example: /api matches only /api",
"pathMatchRegexHelp": "Example: ^/api/.* matches /api/anything",
"pathRewriteModalTitle": "Configure Path Rewriting",
"pathRewriteModalDescription": "Transform the matched path before forwarding to the target.",
"pathRewriteType": "Rewrite Type",
"pathRewritePrefixOption": "Prefix - Replace prefix",
"pathRewriteExactOption": "Exact - Replace entire path",
"pathRewriteRegexOption": "Regex - Pattern replacement",
"pathRewriteStripPrefixOption": "Strip Prefix - Remove prefix",
"pathRewriteValue": "Rewrite Value",
"pathRewriteRegexPlaceholder": "/new/$1",
"pathRewriteDefaultPlaceholder": "/new-path",
"pathRewritePrefixHelp": "Replace the matched prefix with this value",
"pathRewriteExactHelp": "Replace the entire path with this value when the path matches exactly",
"pathRewriteRegexHelp": "Use capture groups like $1, $2 for replacement",
"pathRewriteStripPrefixHelp": "Leave empty to strip prefix or provide new prefix",
"pathRewritePrefix": "Prefix",
"pathRewriteExact": "Exact",
"pathRewriteRegex": "Regex",
"pathRewriteStrip": "Strip",
"pathRewriteStripLabel": "strip"
}

File diff suppressed because it is too large Load Diff

1897
messages/ru-RU.json Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -11,8 +11,9 @@
"componentsErrorNoMemberCreate": "Şu anda herhangi bir organizasyona üye değilsiniz. Başlamak için bir organizasyon oluşturun.",
"componentsErrorNoMember": "Şu anda herhangi bir organizasyona üye değilsiniz.",
"welcome": "Pangolin'e hoş geldiniz",
"welcomeTo": "Hoş geldiniz",
"componentsCreateOrg": "Bir Organizasyon Oluşturun",
"componentsMember": "You're a member of {count, plural, =0 {no organization} =1 {one organization} other {# organizations}}.",
"componentsMember": "{count, plural, =0 {hiçbir organizasyon} one {bir organizasyon} other {# organizasyon}} üyesisiniz.",
"componentsInvalidKey": "Geçersiz veya süresi dolmuş lisans anahtarları tespit edildi. Tüm özellikleri kullanmaya devam etmek için lisans koşullarına uyun.",
"dismiss": "Kapat",
"componentsLicenseViolation": "Lisans İhlali: Bu sunucu, lisanslı sınırı olan {maxSites} sitesini aşarak {usedSites} site kullanmaktadır. Tüm özellikleri kullanmaya devam etmek için lisans koşullarına uyun.",
@@ -58,7 +59,6 @@
"siteErrorCreate": "Site oluşturulurken hata",
"siteErrorCreateKeyPair": "Anahtar çifti veya site varsayılanları bulunamadı",
"siteErrorCreateDefaults": "Site varsayılanları bulunamadı",
"siteNameDescription": "Bu, site için görünen addır.",
"method": "Yöntem",
"siteMethodDescription": "Bağlantıları nasıl açığa çıkaracağınız budur.",
"siteLearnNewt": "Newt'i sisteminize nasıl kuracağınızı öğrenin",
@@ -94,7 +94,9 @@
"siteNewtTunnelDescription": "Ağınıza giriş noktası oluşturmanın en kolay yolu. Ekstra kurulum gerekmez.",
"siteWg": "Temel WireGuard",
"siteWgDescription": "Bir tünel oluşturmak için herhangi bir WireGuard istemcisi kullanın. Manuel NAT kurulumu gereklidir.",
"siteWgDescriptionSaas": "Bir tünel oluşturmak için herhangi bir WireGuard istemcisi kullanın. Manuel NAT kurulumu gereklidir. YALNIZCA SELF HOSTED DÜĞÜMLERDE ÇALIŞIR",
"siteLocalDescription": "Yalnızca yerel kaynaklar. Tünelleme yok.",
"siteLocalDescriptionSaas": "Local resources only. No tunneling. Only available on remote nodes.",
"siteSeeAll": "Tüm Siteleri Gör",
"siteTunnelDescription": "Sitenize nasıl bağlanmak istediğinizi belirleyin",
"siteNewtCredentials": "Newt Kimlik Bilgileri",
@@ -166,7 +168,10 @@
"siteSelect": "Site seç",
"siteSearch": "Site ara",
"siteNotFound": "Herhangi bir site bulunamadı.",
"siteSelectionDescription": "Bu site, kaynağa bağlanabilirliği sağlayacaktır.",
"selectCountry": "Ülke Seç",
"searchCountries": "Ülkeleri ara...",
"noCountryFound": "Ülke bulunamadı.",
"siteSelectionDescription": "Bu site hedefe bağlantı sağlayacaktır.",
"resourceType": "Kaynak Türü",
"resourceTypeDescription": "Kaynağınıza nasıl erişmek istediğinizi belirleyin",
"resourceHTTPSSettings": "HTTPS Ayarları",
@@ -197,15 +202,18 @@
"general": "Genel",
"generalSettings": "Genel Ayarlar",
"proxy": "Vekil Sunucu",
"internal": "Dahili",
"rules": "Kurallar",
"resourceSettingDescription": "Kaynağınızdaki ayarları yapılandırın",
"resourceSetting": "{resourceName} Ayarları",
"alwaysAllow": "Her Zaman İzin Ver",
"alwaysDeny": "Her Zaman Reddet",
"passToAuth": "Kimlik Doğrulamasına Geç",
"orgSettingsDescription": "Organizasyonunuzun genel ayarlarını yapılandırın",
"orgGeneralSettings": "Organizasyon Ayarları",
"orgGeneralSettingsDescription": "Organizasyon detaylarınızı ve yapılandırmanızı yönetin",
"saveGeneralSettings": "Genel Ayarları Kaydet",
"saveSettings": "Ayarları Kaydet",
"orgDangerZone": "Tehlike Alanı",
"orgDangerZoneDescription": "Bu organizasyonu sildikten sonra geri dönüş yoktur. Emin olun.",
"orgDelete": "Organizasyonu Sil",
@@ -249,7 +257,7 @@
"weeks": "Hafta",
"months": "Ay",
"years": "Yıl",
"day": "{count, plural, =1 {# day} other {# days}}",
"day": "{count, plural, one {# gün} other {# gün}}",
"apiKeysTitle": "API Anahtar Bilgilendirmesi",
"apiKeysConfirmCopy2": "API anahtarını kopyaladığınızı onaylamanız gerekmektedir.",
"apiKeysErrorCreate": "API anahtarı oluşturulurken hata",
@@ -347,7 +355,7 @@
"licensePurchase": "Lisans Satın Al",
"licensePurchaseSites": "Ek Siteler Satın Al",
"licenseSitesUsedMax": "{usedSites} / {maxSites} siteleri kullanıldı",
"licenseSitesUsed": "{count, plural, =0 {# site} =1 {# site} other {# site}} sistemde bulunmaktadır.",
"licenseSitesUsed": "{count, plural, =0 {# site} one {# site} other {# site}} sistemde bulunmaktadır.",
"licensePurchaseDescription": "{selectedMode, select, license {Lisans satın almak için kaç site istediğinizi seçin. Daha sonra daha fazla site ekleyebilirsiniz.} other {mevcut lisansınıza kaç site ekleneceğini seçin.}}",
"licenseFee": "Lisans ücreti",
"licensePriceSite": "Site başına fiyat",
@@ -436,7 +444,7 @@
"accessRoleSelect": "Rol seçin",
"inviteEmailSentDescription": "Kullanıcıya erişim bağlantısı ile bir e-posta gönderildi. Daveti kabul etmek için bağlantıya erişmelidirler.",
"inviteSentDescription": "Kullanıcı davet edilmiştir. Daveti kabul etmek için aşağıdaki bağlantıya erişmelidirler.",
"inviteExpiresIn": "The invite will expire in {days, plural, =1 {# day} other {# days}}.",
"inviteExpiresIn": "Davetiye {days, plural, one {# gün} other {# gün}} içinde sona erecektir.",
"idpTitle": "General Information",
"idpSelect": "Dış kullanıcı için kimlik sağlayıcıyı seçin",
"idpNotConfigured": "Herhangi bir kimlik sağlayıcı yapılandırılmamış. Harici kullanıcılar oluşturulmadan önce lütfen bir kimlik sağlayıcı yapılandırın.",
@@ -449,6 +457,8 @@
"accessRoleErrorAddDescription": "Kullanıcı role eklenirken bir hata oluştu.",
"userSaved": "Kullanıcı kaydedildi",
"userSavedDescription": "Kullanıcı güncellenmiştir.",
"autoProvisioned": "Otomatik Sağlandı",
"autoProvisionedDescription": "Bu kullanıcının kimlik sağlayıcısı tarafından otomatik olarak yönetilmesine izin ver",
"accessControlsDescription": "Bu kullanıcının organizasyonda neleri erişebileceğini ve yapabileceğini yönetin",
"accessControlsSubmit": "Erişim Kontrollerini Kaydet",
"roles": "Roller",
@@ -458,7 +468,10 @@
"createdAt": "Oluşturulma Tarihi",
"proxyErrorInvalidHeader": "Geçersiz özel Ana Bilgisayar Başlığı değeri. Alan adı formatını kullanın veya özel Ana Bilgisayar Başlığını ayarlamak için boş bırakın.",
"proxyErrorTls": "Geçersiz TLS Sunucu Adı. Alan adı formatını kullanın veya TLS Sunucu Adını kaldırmak için boş bırakılsın.",
"proxyEnableSSL": "SSL'yi Etkinleştir (https)",
"proxyEnableSSL": "SSL Etkinleştir",
"proxyEnableSSLDescription": "Hedeflerinize güvenli HTTPS bağlantıları için SSL/TLS şifrelemesi etkinleştirin.",
"target": "Hedef",
"configureTarget": "Hedefleri Yapılandır",
"targetErrorFetch": "Hedefleri alamadı",
"targetErrorFetchDescription": "Hedefler alınırken bir hata oluştu",
"siteErrorFetch": "kaynağa ulaşılamadı",
@@ -485,18 +498,30 @@
"targetTlsSettings": "HTTPS & TLS Settings",
"targetTlsSettingsDescription": "Configure TLS settings for your resource",
"targetTlsSettingsAdvanced": "Gelişmiş TLS Ayarları",
"targetTlsSni": "TLS Sunucu Adı (SNI)",
"targetTlsSni": "TLS Sunucu Adı",
"targetTlsSniDescription": "SNI için kullanılacak TLS Sunucu Adı'",
"targetTlsSubmit": "Ayarları Kaydet",
"targets": "Hedefler Konfigürasyonu",
"targetsDescription": "Trafiği hizmetlerinize yönlendirmek için hedefleri ayarlayın",
"targetsDescription": "Trafiği arka uç hizmetlerinize yönlendirmek için hedefleri ayarlayın",
"targetStickySessions": "Yapışkan Oturumları Etkinleştir",
"targetStickySessionsDescription": "Bağlantıları oturum süresince aynı arka uç hedef üzerinde tutun.",
"methodSelect": "Yöntemi Seç",
"targetSubmit": "Hedef Ekle",
"targetNoOne": "Hiçbir hedef yok. Formu kullanarak bir hedef ekleyin.",
"targetNoOne": "Bu kaynağın hedefi yok. Arka planınıza istek göndereceğiniz bir hedef yapılandırmak için hedef ekleyin.",
"targetNoOneDescription": "Yukarıdaki birden fazla hedef ekleyerek yük dengeleme etkinleştirilecektir.",
"targetsSubmit": "Hedefleri Kaydet",
"addTarget": "Hedef Ekle",
"targetErrorInvalidIp": "Geçersiz IP adresi",
"targetErrorInvalidIpDescription": "Lütfen geçerli bir IP adresi veya host adı girin",
"targetErrorInvalidPort": "Geçersiz port",
"targetErrorInvalidPortDescription": "Lütfen geçerli bir port numarası girin",
"targetErrorNoSite": "Hiçbir site seçili değil",
"targetErrorNoSiteDescription": "Lütfen hedef için bir site seçin",
"targetCreated": "Hedef oluşturuldu",
"targetCreatedDescription": "Hedef başarıyla oluşturuldu",
"targetErrorCreate": "Hedef oluşturma başarısız oldu",
"targetErrorCreateDescription": "Hedef oluşturulurken bir hata oluştu",
"save": "Kaydet",
"proxyAdditional": "Ek Proxy Ayarları",
"proxyAdditionalDescription": "Kaynağınızın proxy ayarlarını nasıl yöneteceğini yapılandırın",
"proxyCustomHeader": "Özel Ana Bilgisayar Başlığı",
@@ -506,6 +531,7 @@
"ipAddressErrorInvalidFormat": "Geçersiz IP adresi formatı",
"ipAddressErrorInvalidOctet": "Geçersiz IP adresi okteti",
"path": "Yol",
"matchPath": "Yol Eşleştir",
"ipAddressRange": "IP Aralığı",
"rulesErrorFetch": "Kurallar alınamadı",
"rulesErrorFetchDescription": "Kurallar alınırken bir hata oluştu",
@@ -541,6 +567,7 @@
"rulesActions": "Aksiyonlar",
"rulesActionAlwaysAllow": "Her Zaman İzin Ver: Tüm kimlik doğrulama yöntemlerini atlayın",
"rulesActionAlwaysDeny": "Her Zaman Reddedin: Tüm istekleri engelleyin; kimlik doğrulaması yapılamaz",
"rulesActionPassToAuth": "Kimlik Doğrulamasına Geç: Kimlik doğrulama yöntemlerinin denenmesine izin ver",
"rulesMatchCriteria": "Eşleşme Kriterleri",
"rulesMatchCriteriaIpAddress": "Belirli bir IP adresi ile eşleşme",
"rulesMatchCriteriaIpAddressRange": "CIDR gösteriminde bir IP adresi aralığı ile eşleşme",
@@ -703,7 +730,7 @@
"pangolinServerAdmin": "Sunucu Yöneticisi - Pangolin",
"licenseTierProfessional": "Profesyonel Lisans",
"licenseTierEnterprise": "Kurumsal Lisans",
"licenseTierCommercial": "Ticari Lisans",
"licenseTierPersonal": "Personal License",
"licensed": "Lisanslı",
"yes": "Evet",
"no": "Hayır",
@@ -738,7 +765,7 @@
"idpDisplayName": "Bu kimlik sağlayıcı için bir görüntü adı",
"idpAutoProvisionUsers": "Kullanıcıları Otomatik Sağla",
"idpAutoProvisionUsersDescription": "Etkinleştirildiğinde, kullanıcılar rol ve organizasyonlara eşleme yeteneğiyle birlikte sistemde otomatik olarak oluşturulacak.",
"licenseBadge": "Profesyonel",
"licenseBadge": "EE",
"idpType": "Sağlayıcı Türü",
"idpTypeDescription": "Yapılandırmak istediğiniz kimlik sağlayıcısı türünü seçin",
"idpOidcConfigure": "OAuth2/OIDC Yapılandırması",
@@ -805,7 +832,7 @@
"redirectUrl": "Yönlendirme URL'si",
"redirectUrlAbout": "Yönlendirme URL'si Hakkında",
"redirectUrlAboutDescription": "Bu, kimlik doğrulamasından sonra kullanıcıların yönlendirileceği URL'dir. Bu URL'yi kimlik sağlayıcınızın ayarlarında yapılandırmanız gerekir.",
"pangolinAuth": "Auth - Pangolin",
"pangolinAuth": "Yetkilendirme - Pangolin",
"verificationCodeLengthRequirements": "Doğrulama kodunuz 8 karakter olmalıdır.",
"errorOccurred": "Bir hata oluştu",
"emailErrorVerify": "E-posta doğrulanamadı: ",
@@ -832,6 +859,24 @@
"pincodeRequirementsLength": "PIN kesinlikle 6 haneli olmalıdır",
"pincodeRequirementsChars": "PIN sadece numaralardan oluşmalıdır",
"passwordRequirementsLength": "Şifre en az 1 karakter uzunluğunda olmalıdır",
"passwordRequirementsTitle": "Şifre gereksinimleri:",
"passwordRequirementLength": "En az 8 karakter uzunluğunda",
"passwordRequirementUppercase": "En az bir büyük harf",
"passwordRequirementLowercase": "En az bir küçük harf",
"passwordRequirementNumber": "En az bir sayı",
"passwordRequirementSpecial": "En az bir özel karakter",
"passwordRequirementsMet": "✓ Şifre tüm gereksinimleri karşılıyor",
"passwordStrength": "Şifre gücü",
"passwordStrengthWeak": "Zayıf",
"passwordStrengthMedium": "Orta",
"passwordStrengthStrong": "Güçlü",
"passwordRequirements": "Gereksinimler:",
"passwordRequirementLengthText": "8+ karakter",
"passwordRequirementUppercaseText": "Büyük harf (A-Z)",
"passwordRequirementLowercaseText": "Küçük harf (a-z)",
"passwordRequirementNumberText": "Sayı (0-9)",
"passwordRequirementSpecialText": "Özel karakter (!@#$%...)",
"passwordsDoNotMatch": "Parolalar eşleşmiyor",
"otpEmailRequirementsLength": "OTP en az 1 karakter uzunluğunda olmalıdır",
"otpEmailSent": "OTP Gönderildi",
"otpEmailSentDescription": "E-posta adresinize bir OTP gönderildi",
@@ -951,19 +996,28 @@
"logoutError": ıkış yaparken hata",
"signingAs": "Olarak giriş yapıldı",
"serverAdmin": "Sunucu Yöneticisi",
"managedSelfhosted": "Yönetilen Self-Hosted",
"otpEnable": "İki faktörlü özelliğini etkinleştir",
"otpDisable": "İki faktörlü özelliğini devre dışı bırak",
"logout": ıkış Yap",
"licenseTierProfessionalRequired": "Profesyonel Sürüme Gereklidir",
"licenseTierProfessionalRequiredDescription": "Bu özellik yalnızca Professional Edition'da kullanılabilir.",
"actionGetOrg": "Kuruluşu Al",
"updateOrgUser": "Organizasyon Kullanıcısını Güncelle",
"createOrgUser": "Organizasyon Kullanıcısı Oluştur",
"actionUpdateOrg": "Kuruluşu Güncelle",
"actionUpdateUser": "Kullanıcıyı Güncelle",
"actionGetUser": "Kullanıcıyı Getir",
"actionGetOrgUser": "Kuruluş Kullanıcısını Al",
"actionListOrgDomains": "Kuruluş Alan Adlarını Listele",
"actionCreateSite": "Site Oluştur",
"actionDeleteSite": "Siteyi Sil",
"actionGetSite": "Siteyi Al",
"actionListSites": "Siteleri Listele",
"actionApplyBlueprint": "Planı Uygula",
"setupToken": "Kurulum Simgesi",
"setupTokenDescription": "Sunucu konsolundan kurulum simgesini girin.",
"setupTokenRequired": "Kurulum simgesi gerekli",
"actionUpdateSite": "Siteyi Güncelle",
"actionListSiteRoles": "İzin Verilen Site Rolleri Listele",
"actionCreateResource": "Kaynak Oluştur",
@@ -1019,6 +1073,17 @@
"actionDeleteIdpOrg": "Kimlik Sağlayıcı Organizasyon Politikasını Sil",
"actionListIdpOrgs": "Kimlik Sağlayıcı Organizasyonları Listele",
"actionUpdateIdpOrg": "Kimlik Sağlayıcı Organizasyonu Güncelle",
"actionCreateClient": "Müşteri Oluştur",
"actionDeleteClient": "Müşteri Sil",
"actionUpdateClient": "Müşteri Güncelle",
"actionListClients": "Müşterileri Listele",
"actionGetClient": "Müşteriyi Al",
"actionCreateSiteResource": "Site Kaynağı Oluştur",
"actionDeleteSiteResource": "Site Kaynağını Sil",
"actionGetSiteResource": "Site Kaynağını Al",
"actionListSiteResources": "Site Kaynaklarını Listele",
"actionUpdateSiteResource": "Site Kaynağını Güncelle",
"actionListInvitations": "Davetiyeleri Listele",
"noneSelected": "Hiçbiri seçili değil",
"orgNotFound2": "Hiçbir organizasyon bulunamadı.",
"searchProgress": "Ara...",
@@ -1034,7 +1099,6 @@
"navbar": "Navigasyon Menüsü",
"navbarDescription": "Uygulamanın ana navigasyon menüsü",
"navbarDocsLink": "Dokümantasyon",
"commercialEdition": "Ticari Sürüm",
"otpErrorEnable": "2FA etkinleştirilemedi",
"otpErrorEnableDescription": "2FA etkinleştirilirken bir hata oluştu",
"otpSetupCheckCode": "6 haneli bir kod girin",
@@ -1090,8 +1154,10 @@
"sidebarAllUsers": "Tüm Kullanıcılar",
"sidebarIdentityProviders": "Kimlik Sağlayıcılar",
"sidebarLicense": "Lisans",
"enableDockerSocket": "Docker Soketi Etkinleştir",
"enableDockerSocketDescription": "Konteyner bilgilerini doldurmak için Docker Socket keşfini etkinleştirin. Socket yolu Newt'e sağlanmalıdır.",
"sidebarClients": "Clients",
"sidebarDomains": "Alan Adları",
"enableDockerSocket": "Docker Soketini Etkinleştir",
"enableDockerSocketDescription": "Plan etiketleri için Docker Socket etiket toplamasını etkinleştirin. Newt'e soket yolu sağlanmalıdır.",
"enableDockerSocketLink": "Daha fazla bilgi",
"viewDockerContainers": "Docker Konteynerlerini Görüntüle",
"containersIn": "{siteName} içindeki konteynerler",
@@ -1102,7 +1168,7 @@
"containerNetworks": "Ağlar",
"containerHostnameIp": "Ana Makine/IP",
"containerLabels": "Etiketler",
"containerLabelsCount": "{count} etiket{s,plural,one{} other{ler}}",
"containerLabelsCount": "{count, plural, one {# etiket} other {# etiketler}}",
"containerLabelsTitle": "Konteyner Etiketleri",
"containerLabelEmpty": "<boş>",
"containerPorts": "Bağlantı Noktaları",
@@ -1114,7 +1180,7 @@
"showStoppedContainers": "Durdurulmuş konteynerleri göster",
"noContainersFound": "Konteyner bulunamadı. Docker konteynerlerinin çalıştığından emin olun.",
"searchContainersPlaceholder": "{count} konteyner arasında arama yapın...",
"searchResultsCount": "{count} sonuç{s,plural,one{} other{lar}}",
"searchResultsCount": "{count, plural, one {# sonuç} other {# sonuçlar}}",
"filters": "Filtreler",
"filterOptions": "Filtre Seçenekleri",
"filterPorts": "Bağlantı Noktaları",
@@ -1129,8 +1195,703 @@
"dark": "koyu",
"system": "sistem",
"theme": "Tema",
"subnetRequired": "Alt ağ gereklidir",
"initialSetupTitle": "İlk Sunucu Kurulumu",
"initialSetupDescription": "İlk sunucu yönetici hesabını oluşturun. Yalnızca bir sunucu yöneticisi olabilir. Bu kimlik bilgilerini daha sonra her zaman değiştirebilirsiniz.",
"createAdminAccount": "Yönetici Hesabı Oluştur",
"setupErrorCreateAdmin": "Sunucu yönetici hesabı oluşturulurken bir hata oluştu."
"setupErrorCreateAdmin": "Sunucu yönetici hesabı oluşturulurken bir hata oluştu.",
"certificateStatus": "Sertifika Durumu",
"loading": "Yükleniyor",
"restart": "Yeniden Başlat",
"domains": "Alan Adları",
"domainsDescription": "Organizasyonunuz için alan adlarını yönetin",
"domainsSearch": "Alan adlarını ara...",
"domainAdd": "Alan Adı Ekle",
"domainAddDescription": "Organizasyonunuz için yeni bir alan adı kaydedin",
"domainCreate": "Alan Adı Oluştur",
"domainCreatedDescription": "Alan adı başarıyla oluşturuldu",
"domainDeletedDescription": "Alan adı başarıyla silindi",
"domainQuestionRemove": "{domain} alan adını hesabınızdan kaldırmak istediğinizden emin misiniz?",
"domainMessageRemove": "Kaldırıldığında, alan adı hesabınızla ilişkilendirilmeyecek.",
"domainMessageConfirm": "Onaylamak için lütfen aşağıya alan adını yazın.",
"domainConfirmDelete": "Alan Adı Silinmesini Onayla",
"domainDelete": "Alan Adını Sil",
"domain": "Alan Adı",
"selectDomainTypeNsName": "Alan Adı Delege Etme (NS)",
"selectDomainTypeNsDescription": "Bu alan adı ve tüm alt alan adları. Tüm bir alan adı bölgesini kontrol etmek istediğinizde bunu kullanın.",
"selectDomainTypeCnameName": "Tekil Alan Adı (CNAME)",
"selectDomainTypeCnameDescription": "Sadece bu belirli alan adı. Bireysel alt alan adları veya belirli alan adı girişleri için bunu kullanın.",
"selectDomainTypeWildcardName": "Wildcard Alan Adı",
"selectDomainTypeWildcardDescription": "Bu domain ve alt alan adları.",
"domainDelegation": "Tekil Alan Adı",
"selectType": "Bir tür seçin",
"actions": "İşlemler",
"refresh": "Yenile",
"refreshError": "Veriler yenilenemedi",
"verified": "Doğrulandı",
"pending": "Beklemede",
"sidebarBilling": "Faturalama",
"billing": "Faturalama",
"orgBillingDescription": "Fatura bilgilerinizi ve aboneliklerinizi yönetin",
"github": "GitHub",
"pangolinHosted": "Pangolin Barındırılan",
"fossorial": "Fossorial",
"completeAccountSetup": "Hesap Kurulumunu Tamamla",
"completeAccountSetupDescription": "Başlamak için şifrenizi ayarlayın",
"accountSetupSent": "Bu e-posta adresine bir hesap kurulum kodu göndereceğiz.",
"accountSetupCode": "Kurulum Kodu",
"accountSetupCodeDescription": "Kurulum kodu için e-posta gelen kutunuzu kontrol edin.",
"passwordCreate": "Parola Oluştur",
"passwordCreateConfirm": "Şifreyi Onayla",
"accountSetupSubmit": "Kurulum Kodunu Gönder",
"completeSetup": "Kurulumu Tamamla",
"accountSetupSuccess": "Hesap kurulumu tamamlandı! Pangolin'e hoş geldiniz!",
"documentation": "Dokümantasyon",
"saveAllSettings": "Tüm Ayarları Kaydet",
"settingsUpdated": "Ayarlar güncellendi",
"settingsUpdatedDescription": "Tüm ayarlar başarıyla güncellendi",
"settingsErrorUpdate": "Ayarlar güncellenemedi",
"settingsErrorUpdateDescription": "Ayarları güncellerken bir hata oluştu",
"sidebarCollapse": "Daralt",
"sidebarExpand": "Genişlet",
"newtUpdateAvailable": "Güncelleme Mevcut",
"newtUpdateAvailableInfo": "Newt'in yeni bir versiyonu mevcut. En iyi deneyim için lütfen en son sürüme güncelleyin.",
"domainPickerEnterDomain": "Alan Adı",
"domainPickerPlaceholder": "myapp.example.com",
"domainPickerDescription": "Mevcut seçenekleri görmek için kaynağın tam etki alanını girin.",
"domainPickerDescriptionSaas": "Mevcut seçenekleri görmek için tam etki alanı, alt etki alanı veya sadece bir isim girin",
"domainPickerTabAll": "Tümü",
"domainPickerTabOrganization": "Organizasyon",
"domainPickerTabProvided": "Sağlanan",
"domainPickerSortAsc": "A-Z",
"domainPickerSortDesc": "Z-A",
"domainPickerCheckingAvailability": "Kullanılabilirlik kontrol ediliyor...",
"domainPickerNoMatchingDomains": "Eşleşen domain bulunamadı. Farklı bir domain deneyin veya organizasyonunuzun domain ayarlarını kontrol edin.",
"domainPickerOrganizationDomains": "Organizasyon Alan Adları",
"domainPickerProvidedDomains": "Sağlanan Alan Adları",
"domainPickerSubdomain": "Alt Alan: {subdomain}",
"domainPickerNamespace": "Ad Alanı: {namespace}",
"domainPickerShowMore": "Daha Fazla Göster",
"regionSelectorTitle": "Bölge Seç",
"regionSelectorInfo": "Bir bölge seçmek, konumunuz için daha iyi performans sağlamamıza yardımcı olur. Sunucunuzla aynı bölgede olmanıza gerek yoktur.",
"regionSelectorPlaceholder": "Bölge Seçin",
"regionSelectorComingSoon": "Yakında Geliyor",
"billingLoadingSubscription": "Abonelik yükleniyor...",
"billingFreeTier": "Ücretsiz Dilim",
"billingWarningOverLimit": "Uyarı: Bir veya daha fazla kullanım limitini aştınız. Aboneliğinizi değiştirmediğiniz veya kullanımı ayarlamadığınız sürece siteleriniz bağlanmayacaktır.",
"billingUsageLimitsOverview": "Kullanım Limitleri Genel Görünümü",
"billingMonitorUsage": "Kullanımınızı yapılandırılmış limitlerle karşılaştırın. Limitlerin artırılmasına ihtiyacınız varsa, lütfen support@fossorial.io adresinden bizimle iletişime geçin.",
"billingDataUsage": "Veri Kullanımı",
"billingOnlineTime": "Site Çevrimiçi Süresi",
"billingUsers": "Aktif Kullanıcılar",
"billingDomains": "Aktif Alanlar",
"billingRemoteExitNodes": "Aktif Öz-Host Düğümleri",
"billingNoLimitConfigured": "Hiçbir limit yapılandırılmadı",
"billingEstimatedPeriod": "Tahmini Fatura Dönemi",
"billingIncludedUsage": "Dahil Kullanım",
"billingIncludedUsageDescription": "Mevcut abonelik planınıza bağlı kullanım",
"billingFreeTierIncludedUsage": "Ücretsiz dilim kullanım hakları",
"billingIncluded": "dahil",
"billingEstimatedTotal": "Tahmini Toplam:",
"billingNotes": "Notlar",
"billingEstimateNote": "Bu, mevcut kullanımınıza dayalı bir tahmindir.",
"billingActualChargesMayVary": "Asıl ücretler farklılık gösterebilir.",
"billingBilledAtEnd": "Fatura döneminin sonunda fatura düzenlenecektir.",
"billingModifySubscription": "Aboneliği Düzenle",
"billingStartSubscription": "Aboneliği Başlat",
"billingRecurringCharge": "Yinelenen Ücret",
"billingManageSubscriptionSettings": "Abonelik ayarlarınızı ve tercihlerinizi yönetin",
"billingNoActiveSubscription": "Aktif bir aboneliğiniz yok. Kullanım limitlerini artırmak için aboneliğinizi başlatın.",
"billingFailedToLoadSubscription": "Abonelik yüklenemedi",
"billingFailedToLoadUsage": "Kullanım yüklenemedi",
"billingFailedToGetCheckoutUrl": "Ödeme URL'si alınamadı",
"billingPleaseTryAgainLater": "Lütfen daha sonra tekrar deneyin.",
"billingCheckoutError": "Ödeme Hatası",
"billingFailedToGetPortalUrl": "Portal URL'si alınamadı",
"billingPortalError": "Portal Hatası",
"billingDataUsageInfo": "Buluta bağlandığınızda, güvenli tünellerinizden aktarılan tüm verilerden ücret alınırsınız. Bu, tüm sitelerinizdeki gelen ve giden trafiği içerir. Limitinize ulaştığınızda, planınızı yükseltmeli veya kullanımı azaltmalısınız, aksi takdirde siteleriniz bağlantıyı keser. Düğümler kullanırken verilerden ücret alınmaz.",
"billingOnlineTimeInfo": "Sitelerinizin buluta ne kadar süre bağlı kaldığına göre ücretlendirilirsiniz. Örneğin, 44,640 dakika, bir sitenin 24/7 boyunca tam bir ay boyunca çalışması anlamına gelir. Limitinize ulaştığınızda, planınızı yükseltmeyip kullanımı azaltmazsanız siteleriniz bağlantıyı keser. Düğümler kullanırken zamandan ücret alınmaz.",
"billingUsersInfo": "Kuruluşunuzdaki her kullanıcı için ücretlendirilirsiniz. Faturalandırma, hesabınızdaki aktif kullanıcı hesaplarının sayısına göre günlük olarak hesaplanır.",
"billingDomainInfo": "Kuruluşunuzdaki her alan adı için ücretlendirilirsiniz. Faturalandırma, hesabınızdaki aktif alan adları hesaplarının sayısına göre günlük olarak hesaplanır.",
"billingRemoteExitNodesInfo": "Kuruluşunuzdaki her yönetilen Düğüm için ücretlendirilirsiniz. Faturalandırma, hesabınızdaki aktif yönetilen Düğümler sayısına göre günlük olarak hesaplanır.",
"domainNotFound": "Alan Adı Bulunamadı",
"domainNotFoundDescription": "Bu kaynak devre dışıdır çünkü alan adı sistemimizde artık mevcut değil. Bu kaynak için yeni bir alan adı belirleyin.",
"failed": "Başarısız",
"createNewOrgDescription": "Yeni bir organizasyon oluşturun",
"organization": "Kuruluş",
"port": "Bağlantı Noktası",
"securityKeyManage": "Güvenlik Anahtarlarını Yönet",
"securityKeyDescription": "Şifresiz kimlik doğrulama için güvenlik anahtarları ekleyin veya kaldırın",
"securityKeyRegister": "Yeni Güvenlik Anahtarı Kaydet",
"securityKeyList": "Güvenlik Anahtarlarınız",
"securityKeyNone": "Henüz kayıtlı güvenlik anahtarı yok",
"securityKeyNameRequired": "İsim gerekli",
"securityKeyRemove": "Kaldır",
"securityKeyLastUsed": "Son kullanım: {date}",
"securityKeyNameLabel": "İsim",
"securityKeyRegisterSuccess": "Güvenlik anahtarı başarıyla kaydedildi",
"securityKeyRegisterError": "Güvenlik anahtarı kaydedilirken hata oluştu",
"securityKeyRemoveSuccess": "Güvenlik anahtarı başarıyla kaldırıldı",
"securityKeyRemoveError": "Güvenlik anahtarı kaldırılırken hata oluştu",
"securityKeyLoadError": "Güvenlik anahtarları yüklenirken hata oluştu",
"securityKeyLogin": "Güvenlik anahtarı ile devam edin",
"securityKeyAuthError": "Güvenlik anahtarı ile kimlik doğrulama başarısız oldu",
"securityKeyRecommendation": "Hesabınızdan kilitlenmediğinizden emin olmak için farklı bir cihazda başka bir güvenlik anahtarı kaydetmeyi düşünün.",
"registering": "Kaydediliyor...",
"securityKeyPrompt": "Lütfen güvenlik anahtarınızı kullanarak kimliğinizi doğrulayın. Güvenlik anahtarınızın bağlı ve hazır olduğundan emin olun.",
"securityKeyBrowserNotSupported": "Tarayıcınız güvenlik anahtarlarını desteklemiyor. Lütfen Chrome, Firefox veya Safari gibi modern bir tarayıcı kullanın.",
"securityKeyPermissionDenied": "Giriş yapmaya devam etmek için lütfen güvenlik anahtarınıza erişime izin verin.",
"securityKeyRemovedTooQuickly": "Güvenlik anahtarınızın bağlantısını kesmeden önce oturum açma işlemi tamamlanana kadar bağlı kalmasını sağlayın.",
"securityKeyNotSupported": "Güvenlik anahtarınız uyumlu olmayabilir. Lütfen farklı bir güvenlik anahtarı deneyin.",
"securityKeyUnknownError": "Güvenlik anahtarınızı kullanırken bir sorun oluştu. Lütfen tekrar deneyin.",
"twoFactorRequired": "Güvenlik anahtarını kaydetmek için iki faktörlü kimlik doğrulama gereklidir.",
"twoFactor": "İki Faktörlü Kimlik Doğrulama",
"adminEnabled2FaOnYourAccount": "Yöneticiniz {email} için iki faktörlü kimlik doğrulamayı etkinleştirdi. Devam etmek için kurulum işlemini tamamlayın.",
"securityKeyAdd": "Güvenlik Anahtarı Ekle",
"securityKeyRegisterTitle": "Yeni Güvenlik Anahtarı Kaydet",
"securityKeyRegisterDescription": "Güvenlik anahtarınızı bağlayın ve tanımlamak için bir ad girin",
"securityKeyTwoFactorRequired": "İki Faktörlü Kimlik Doğrulama Gereklidir",
"securityKeyTwoFactorDescription": "Güvenlik anahtarını kaydetmek için lütfen iki faktörlü kimlik doğrulama kodunuzu girin",
"securityKeyTwoFactorRemoveDescription": "Güvenlik anahtarını kaldırmak için lütfen iki faktörlü kimlik doğrulama kodunuzu girin",
"securityKeyTwoFactorCode": "İki Faktörlü Kod",
"securityKeyRemoveTitle": "Güvenlik Anahtarını Kaldır",
"securityKeyRemoveDescription": "Güvenlik anahtarını \"{name}\" kaldırmak için şifrenizi girin",
"securityKeyNoKeysRegistered": "Kayıtlı güvenlik anahtarı yok",
"securityKeyNoKeysDescription": "Hesabınızın güvenliğini artırmak için bir güvenlik anahtarı ekleyin",
"createDomainRequired": "Alan adı gereklidir",
"createDomainAddDnsRecords": "DNS Kayıtlarını Ekle",
"createDomainAddDnsRecordsDescription": "Kurulumu tamamlamak için alan sağlayıcınıza şu DNS kayıtlarını ekleyin.",
"createDomainNsRecords": "NS Kayıtları",
"createDomainRecord": "Kayıt",
"createDomainType": "Tür:",
"createDomainName": "Ad:",
"createDomainValue": "Değer:",
"createDomainCnameRecords": "CNAME Kayıtları",
"createDomainARecords": "A Kayıtları",
"createDomainRecordNumber": "Kayıt {number}",
"createDomainTxtRecords": "TXT Kayıtları",
"createDomainSaveTheseRecords": "Bu Kayıtları Kaydet",
"createDomainSaveTheseRecordsDescription": "Bu DNS kayıtlarını kaydettiğinizden emin olun çünkü tekrar görmeyeceksiniz.",
"createDomainDnsPropagation": "DNS Yayılması",
"createDomainDnsPropagationDescription": "DNS değişikliklerinin internet genelinde yayılması zaman alabilir. DNS sağlayıcınız ve TTL ayarlarına bağlı olarak bu birkaç dakika ile 48 saat arasında değişebilir.",
"resourcePortRequired": "HTTP dışı kaynaklar için bağlantı noktası numarası gereklidir",
"resourcePortNotAllowed": "HTTP kaynakları için bağlantı noktası numarası ayarlanmamalı",
"billingPricingCalculatorLink": "Fiyat Hesaplayıcı",
"signUpTerms": {
"IAgreeToThe": "Kabul ediyorum",
"termsOfService": "hizmet şartları",
"and": "ve",
"privacyPolicy": "gizlilik politikası"
},
"siteRequired": "Site gerekli.",
"olmTunnel": "Olm Tüneli",
"olmTunnelDescription": "Müşteri bağlantıları için Olm kullanın",
"errorCreatingClient": "Müşteri oluşturulurken hata oluştu",
"clientDefaultsNotFound": "Müşteri varsayılanları bulunamadı",
"createClient": "Müşteri Oluştur",
"createClientDescription": "Sitelerinize bağlanmak için yeni bir müşteri oluşturun",
"seeAllClients": "Tüm Müşterileri Gör",
"clientInformation": "Müşteri Bilgileri",
"clientNamePlaceholder": "Müşteri adı",
"address": "Adres",
"subnetPlaceholder": "Alt ağ",
"addressDescription": "Bu müşteri için bağlantıda kullanılacak adres",
"selectSites": "Siteleri seçin",
"sitesDescription": "Müşteri seçilen sitelere bağlantı kuracaktır",
"clientInstallOlm": "Olm Yükle",
"clientInstallOlmDescription": "Sisteminizde Olm çalıştırın",
"clientOlmCredentials": "Olm Kimlik Bilgileri",
"clientOlmCredentialsDescription": "Bu, Olm'in sunucu ile kimlik doğrulaması yapacağı yöntemdir",
"olmEndpoint": "Olm Uç Noktası",
"olmId": "Olm Kimliği",
"olmSecretKey": "Olm Gizli Anahtarı",
"clientCredentialsSave": "Kimlik Bilgilerinizi Kaydedin",
"clientCredentialsSaveDescription": "Bunu yalnızca bir kez görebileceksiniz. Güvenli bir yere kopyaladığınızdan emin olun.",
"generalSettingsDescription": "Bu müşteri için genel ayarları yapılandırın",
"clientUpdated": "Müşteri güncellendi",
"clientUpdatedDescription": "Müşteri güncellenmiştir.",
"clientUpdateFailed": "Müşteri güncellenemedi",
"clientUpdateError": "Müşteri güncellenirken bir hata oluştu.",
"sitesFetchFailed": "Siteler alınamadı",
"sitesFetchError": "Siteler alınırken bir hata oluştu.",
"olmErrorFetchReleases": "Olm yayınları alınırken bir hata oluştu.",
"olmErrorFetchLatest": "En son Olm yayını alınırken bir hata oluştu.",
"remoteSubnets": "Uzak Alt Ağlar",
"enterCidrRange": "CIDR aralığını girin",
"remoteSubnetsDescription": "Bu siteye uzaktan erişilebilen CIDR aralıklarını ekleyin. 10.0.0.0/24 formatını kullanın. Bu YALNIZCA VPN istemci bağlantıları için geçerlidir.",
"resourceEnableProxy": "Genel Proxy'i Etkinleştir",
"resourceEnableProxyDescription": "Bu kaynağa genel proxy erişimini etkinleştirin. Bu sayede ağ dışından açık bir port üzerinden kaynağa bulut aracılığıyla erişim sağlanır. Traefik yapılandırması gereklidir.",
"externalProxyEnabled": "Dış Proxy Etkinleştirildi",
"addNewTarget": "Yeni Hedef Ekle",
"targetsList": "Hedefler Listesi",
"advancedMode": "Gelişmiş Mod",
"targetErrorDuplicateTargetFound": "Yinelenen hedef bulundu",
"healthCheckHealthy": "Sağlıklı",
"healthCheckUnhealthy": "Sağlıksız",
"healthCheckUnknown": "Bilinmiyor",
"healthCheck": "Sağlık Kontrolü",
"configureHealthCheck": "Sağlık Kontrolünü Yapılandır",
"configureHealthCheckDescription": "{hedef} için sağlık izleme kurun",
"enableHealthChecks": "Sağlık Kontrollerini Etkinleştir",
"enableHealthChecksDescription": "Bu hedefin sağlığını izleyin. Gerekirse hedef dışındaki bir son noktayı izleyebilirsiniz.",
"healthScheme": "Yöntem",
"healthSelectScheme": "Yöntem Seç",
"healthCheckPath": "Yol",
"healthHostname": "IP / Hostname",
"healthPort": "Bağlantı Noktası",
"healthCheckPathDescription": "Sağlık durumunu kontrol etmek için yol.",
"healthyIntervalSeconds": "Sağlıklı Aralık",
"unhealthyIntervalSeconds": "Sağlıksız Aralık",
"IntervalSeconds": "Sağlıklı Aralık",
"timeoutSeconds": "Zaman Aşımı",
"timeIsInSeconds": "Zaman saniye cinsindendir",
"retryAttempts": "Tekrar Deneme Girişimleri",
"expectedResponseCodes": "Beklenen Yanıt Kodları",
"expectedResponseCodesDescription": "Sağlıklı durumu gösteren HTTP durum kodu. Boş bırakılırsa, 200-300 arası sağlıklı kabul edilir.",
"customHeaders": "Özel Başlıklar",
"customHeadersDescription": "Başlıklar yeni satırla ayrılmış: Başlık-Adı: değer",
"headersValidationError": "Başlıklar şu formatta olmalıdır: Başlık-Adı: değer.",
"saveHealthCheck": "Sağlık Kontrolünü Kaydet",
"healthCheckSaved": "Sağlık Kontrolü Kaydedildi",
"healthCheckSavedDescription": "Sağlık kontrol yapılandırması başarıyla kaydedildi",
"healthCheckError": "Sağlık Kontrol Hatası",
"healthCheckErrorDescription": "Sağlık kontrol yapılandırması kaydedilirken bir hata oluştu",
"healthCheckPathRequired": "Sağlık kontrol yolu gereklidir",
"healthCheckMethodRequired": "HTTP yöntemi gereklidir",
"healthCheckIntervalMin": "Kontrol aralığı en az 5 saniye olmalıdır",
"healthCheckTimeoutMin": "Zaman aşımı en az 1 saniye olmalıdır",
"healthCheckRetryMin": "Tekrar deneme girişimleri en az 1 olmalıdır",
"httpMethod": "HTTP Yöntemi",
"selectHttpMethod": "HTTP yöntemini seçin",
"domainPickerSubdomainLabel": "Alt Alan Adı",
"domainPickerBaseDomainLabel": "Temel Alan Adı",
"domainPickerSearchDomains": "Alan adlarını ara...",
"domainPickerNoDomainsFound": "Hiçbir alan adı bulunamadı",
"domainPickerLoadingDomains": "Alan adları yükleniyor...",
"domainPickerSelectBaseDomain": "Temel alan adını seçin...",
"domainPickerNotAvailableForCname": "CNAME alan adları için kullanılabilir değil",
"domainPickerEnterSubdomainOrLeaveBlank": "Alt alan adını girin veya temel alan adını kullanmak için boş bırakın.",
"domainPickerEnterSubdomainToSearch": "Mevcut ücretsiz alan adları arasından aramak ve seçmek için bir alt alan adı girin.",
"domainPickerFreeDomains": "Ücretsiz Alan Adları",
"domainPickerSearchForAvailableDomains": "Mevcut alan adlarını ara",
"domainPickerNotWorkSelfHosted": "Not: Ücretsiz sağlanan alan adları şu anda öz-host edilmiş örnekler için kullanılabilir değildir.",
"resourceDomain": "Alan Adı",
"resourceEditDomain": "Alan Adını Düzenle",
"siteName": "Site Adı",
"proxyPort": "Bağlantı Noktası",
"resourcesTableProxyResources": "Proxy Kaynaklar",
"resourcesTableClientResources": "İstemci Kaynaklar",
"resourcesTableNoProxyResourcesFound": "Hiçbir proxy kaynağı bulunamadı.",
"resourcesTableNoInternalResourcesFound": "Hiçbir dahili kaynak bulunamadı.",
"resourcesTableDestination": "Hedef",
"resourcesTableTheseResourcesForUseWith": "Bu kaynaklar ile kullanılmak için",
"resourcesTableClients": "İstemciler",
"resourcesTableAndOnlyAccessibleInternally": "veyalnızca bir istemci ile bağlandığında dahili olarak erişilebilir.",
"editInternalResourceDialogEditClientResource": "İstemci Kaynağı Düzenleyin",
"editInternalResourceDialogUpdateResourceProperties": "{resourceName} için kaynak özelliklerini ve hedef yapılandırmasını güncelleyin.",
"editInternalResourceDialogResourceProperties": "Kaynak Özellikleri",
"editInternalResourceDialogName": "Ad",
"editInternalResourceDialogProtocol": "Protokol",
"editInternalResourceDialogSitePort": "Site Bağlantı Noktası",
"editInternalResourceDialogTargetConfiguration": "Hedef Yapılandırma",
"editInternalResourceDialogCancel": "İptal",
"editInternalResourceDialogSaveResource": "Kaynağı Kaydet",
"editInternalResourceDialogSuccess": "Başarı",
"editInternalResourceDialogInternalResourceUpdatedSuccessfully": "Dahili kaynak başarıyla güncellendi",
"editInternalResourceDialogError": "Hata",
"editInternalResourceDialogFailedToUpdateInternalResource": "Dahili kaynak güncellenemedi",
"editInternalResourceDialogNameRequired": "Ad gerekli",
"editInternalResourceDialogNameMaxLength": "Ad 255 karakterden kısa olmalıdır",
"editInternalResourceDialogProxyPortMin": "Proxy bağlantı noktası en az 1 olmalıdır",
"editInternalResourceDialogProxyPortMax": "Proxy bağlantı noktası 65536'dan küçük olmalıdır",
"editInternalResourceDialogInvalidIPAddressFormat": "Geçersiz IP adresi formatı",
"editInternalResourceDialogDestinationPortMin": "Hedef bağlantı noktası en az 1 olmalıdır",
"editInternalResourceDialogDestinationPortMax": "Hedef bağlantı noktası 65536'dan küçük olmalıdır",
"createInternalResourceDialogNoSitesAvailable": "Site Bulunamadı",
"createInternalResourceDialogNoSitesAvailableDescription": "Dahili kaynak oluşturmak için en az bir Newt sitesine ve alt ağa sahip olmalısınız.",
"createInternalResourceDialogClose": "Kapat",
"createInternalResourceDialogCreateClientResource": "İstemci Kaynağı Oluştur",
"createInternalResourceDialogCreateClientResourceDescription": "Seçilen siteye bağlı istemciler için erişilebilir olacak yeni bir kaynak oluşturun.",
"createInternalResourceDialogResourceProperties": "Kaynak Özellikleri",
"createInternalResourceDialogName": "Ad",
"createInternalResourceDialogSite": "Site",
"createInternalResourceDialogSelectSite": "Site seç...",
"createInternalResourceDialogSearchSites": "Siteleri ara...",
"createInternalResourceDialogNoSitesFound": "Site bulunamadı.",
"createInternalResourceDialogProtocol": "Protokol",
"createInternalResourceDialogTcp": "TCP",
"createInternalResourceDialogUdp": "UDP",
"createInternalResourceDialogSitePort": "Site Bağlantı Noktası",
"createInternalResourceDialogSitePortDescription": "İstemci ile bağlanıldığında site üzerindeki kaynağa erişmek için bu bağlantı noktasını kullanın.",
"createInternalResourceDialogTargetConfiguration": "Hedef Yapılandırma",
"createInternalResourceDialogDestinationIPDescription": "Kaynağın site ağındaki IP veya ana bilgisayar adresi.",
"createInternalResourceDialogDestinationPortDescription": "Kaynağa erişilebilecek hedef IP üzerindeki bağlantı noktası.",
"createInternalResourceDialogCancel": "İptal",
"createInternalResourceDialogCreateResource": "Kaynak Oluştur",
"createInternalResourceDialogSuccess": "Başarı",
"createInternalResourceDialogInternalResourceCreatedSuccessfully": "Dahili kaynak başarıyla oluşturuldu",
"createInternalResourceDialogError": "Hata",
"createInternalResourceDialogFailedToCreateInternalResource": "Dahili kaynak oluşturulamadı",
"createInternalResourceDialogNameRequired": "Ad gerekli",
"createInternalResourceDialogNameMaxLength": "Ad 255 karakterden kısa olmalıdır",
"createInternalResourceDialogPleaseSelectSite": "Lütfen bir site seçin",
"createInternalResourceDialogProxyPortMin": "Proxy bağlantı noktası en az 1 olmalıdır",
"createInternalResourceDialogProxyPortMax": "Proxy bağlantı noktası 65536'dan küçük olmalıdır",
"createInternalResourceDialogInvalidIPAddressFormat": "Geçersiz IP adresi formatı",
"createInternalResourceDialogDestinationPortMin": "Hedef bağlantı noktası en az 1 olmalıdır",
"createInternalResourceDialogDestinationPortMax": "Hedef bağlantı noktası 65536'dan küçük olmalıdır",
"siteConfiguration": "Yapılandırma",
"siteAcceptClientConnections": "İstemci Bağlantılarını Kabul Et",
"siteAcceptClientConnectionsDescription": "Bu Newt örneğini bir geçit olarak kullanarak diğer cihazların bağlanmasına izin verin.",
"siteAddress": "Site Adresi",
"siteAddressDescription": "İstemcilerin bağlanması için hostun IP adresini belirtin. Bu, Pangolin ağındaki sitenin iç adresidir ve istemciler için atlas olmalıdır. Org alt ağına düşmelidir.",
"autoLoginExternalIdp": "Harici IDP ile Otomatik Giriş",
"autoLoginExternalIdpDescription": "Kullanıcıyı kimlik doğrulama için otomatik olarak harici IDP'ye yönlendirin.",
"selectIdp": "IDP Seç",
"selectIdpPlaceholder": "IDP seçin...",
"selectIdpRequired": "Otomatik giriş etkinleştirildiğinde lütfen bir IDP seçin.",
"autoLoginTitle": "Yönlendiriliyor",
"autoLoginDescription": "Kimlik doğrulama için harici kimlik sağlayıcıya yönlendiriliyorsunuz.",
"autoLoginProcessing": "Kimlik doğrulama hazırlanıyor...",
"autoLoginRedirecting": "Girişe yönlendiriliyorsunuz...",
"autoLoginError": "Otomatik Giriş Hatası",
"autoLoginErrorNoRedirectUrl": "Kimlik sağlayıcıdan yönlendirme URL'si alınamadı.",
"autoLoginErrorGeneratingUrl": "Kimlik doğrulama URL'si oluşturulamadı.",
"remoteExitNodeManageRemoteExitNodes": "Uzak Düğümler",
"remoteExitNodeDescription": "Self-host one or more remote nodes to extend your network connectivity and reduce reliance on the cloud",
"remoteExitNodes": "Düğümler",
"searchRemoteExitNodes": "Düğüm ara...",
"remoteExitNodeAdd": "Düğüm Ekle",
"remoteExitNodeErrorDelete": "Düğüm silinirken hata oluştu",
"remoteExitNodeQuestionRemove": "{selectedNode} düğümünü organizasyondan kaldırmak istediğinizden emin misiniz?",
"remoteExitNodeMessageRemove": "Kaldırıldığında, düğüm artık erişilebilir olmayacaktır.",
"remoteExitNodeMessageConfirm": "Onaylamak için lütfen aşağıya düğümün adını yazın.",
"remoteExitNodeConfirmDelete": "Düğüm Silmeyi Onayla",
"remoteExitNodeDelete": "Düğümü Sil",
"sidebarRemoteExitNodes": "Uzak Düğümler",
"remoteExitNodeCreate": {
"title": "Düğüm Oluştur",
"description": "Ağ bağlantınızı genişletmek için yeni bir düğüm oluşturun",
"viewAllButton": "Tüm Düğümleri Gör",
"strategy": {
"title": "Oluşturma Stratejisi",
"description": "Düğümünüzü manuel olarak yapılandırmak veya yeni kimlik bilgileri oluşturmak için bunu seçin.",
"adopt": {
"title": "Düğüm Benimse",
"description": "Zaten düğüm için kimlik bilgilerine sahipseniz bunu seçin."
},
"generate": {
"title": "Anahtarları Oluştur",
"description": "Düğüm için yeni anahtarlar oluşturmak istiyorsanız bunu seçin"
}
},
"adopt": {
"title": "Mevcut Düğümü Benimse",
"description": "Adayacağınız mevcut düğümün kimlik bilgilerini girin",
"nodeIdLabel": "Düğüm ID",
"nodeIdDescription": "Adayacağınız mevcut düğümün ID'si",
"secretLabel": "Gizli",
"secretDescription": "Mevcut düğümün gizli anahtarı",
"submitButton": "Düğümü Benimse"
},
"generate": {
"title": "Oluşturulan Kimlik Bilgileri",
"description": "Düğümünüzü yapılandırmak için oluşturulan bu kimlik bilgilerini kullanın",
"nodeIdTitle": "Düğüm ID",
"secretTitle": "Gizli",
"saveCredentialsTitle": "Kimlik Bilgilerini Yapılandırmaya Ekle",
"saveCredentialsDescription": "Bağlantıyı tamamlamak için bu kimlik bilgilerini öz-host Pangolin düğüm yapılandırma dosyanıza ekleyin.",
"submitButton": "Düğüm Oluştur"
},
"validation": {
"adoptRequired": "Mevcut bir düğümü benimserken Düğüm ID ve Gizli anahtar gereklidir"
},
"errors": {
"loadDefaultsFailed": "Varsayılanlar yüklenemedi",
"defaultsNotLoaded": "Varsayılanlar yüklenmedi",
"createFailed": "Düğüm oluşturulamadı"
},
"success": {
"created": "Düğüm başarıyla oluşturuldu"
}
},
"remoteExitNodeSelection": "Düğüm Seçimi",
"remoteExitNodeSelectionDescription": "Yerel site için trafiği yönlendirecek düğümü seçin",
"remoteExitNodeRequired": "Yerel siteler için bir düğüm seçilmelidir",
"noRemoteExitNodesAvailable": "Düğüm Bulunamadı",
"noRemoteExitNodesAvailableDescription": "Bu organizasyon için düğüm mevcut değil. Yerel siteleri kullanmak için önce bir düğüm oluşturun.",
"exitNode": ıkış Düğümü",
"country": "Ülke",
"rulesMatchCountry": "Şu anda kaynak IP'ye dayanarak",
"managedSelfHosted": {
"title": "Yönetilen Self-Hosted",
"description": "Daha güvenilir ve düşük bakım gerektiren, ekstra özelliklere sahip kendi kendine barındırabileceğiniz Pangolin sunucusu",
"introTitle": "Yönetilen Kendi Kendine Barındırılan Pangolin",
"introDescription": "Bu, basitlik ve ekstra güvenilirlik arayan, ancak verilerini gizli tutmak ve kendi sunucularında barındırmak isteyen kişiler için tasarlanmış bir dağıtım seçeneğidir.",
"introDetail": "Bu seçenekle, kendi Pangolin düğümünüzü çalıştırmaya devam edersiniz — tünelleriniz, SSL bitişiniz ve trafiğiniz tamamen sunucunuzda kalır. Fark, yönetim ve izlemeyi bulut panomuz üzerinden gerçekleştiririz, bu da bir dizi avantaj sağlar:",
"benefitSimplerOperations": {
"title": "Daha basit işlemler",
"description": "Kendi e-posta sunucunuzu çalıştırmanıza veya karmaşık uyarılar kurmanıza gerek yok. Sağlık kontrolleri ve kesinti uyarılarını kutudan çıktığı gibi alırsınız."
},
"benefitAutomaticUpdates": {
"title": "Otomatik güncellemeler",
"description": "Bulut panosu hızla gelişir, böylece her seferinde yeni konteynerler manuel olarak çekmeden yeni özellikler ve hata düzeltmeleri alırsınız."
},
"benefitLessMaintenance": {
"title": "Daha az bakım",
"description": "Veritabanı geçişleri, yedeklemeler veya ekstra altyapı yönetimi yok. Biz bunu bulutta hallederiz."
},
"benefitCloudFailover": {
"title": "Bulut yedekleme",
"description": "Düğümünüz kapandığında, tünelleriniz geçici olarak bulut bağlantı noktalarımıza geçebilir, böylece tekrar çevrimiçi hale getirene kadar tünelleriniz kesintiye uğramaz."
},
"benefitHighAvailability": {
"title": "Yüksek kullanılabilirlik (Bağlantı Noktaları)",
"description": "Yedeklilik ve daha iyi performans için hesabınıza birden fazla düğüm bağlayabilirsiniz."
},
"benefitFutureEnhancements": {
"title": "Gelecek iyileştirmeler",
"description": "Dağıtımınızı daha sağlam hale getirmek amacıyla daha fazla analiz, uyarı ve yönetim aracı eklemeyi planlıyoruz."
},
"docsAlert": {
"text": "Yönetilen Kendi Kendine Barındırılan seçeneği hakkında daha fazla bilgi edinin",
"documentation": "dokümantasyon"
},
"convertButton": "Bu Düğümü Yönetilen Kendi Kendine Barındırma Dönüştürün"
},
"internationaldomaindetected": "Uluslararası Alan Adı Tespit Edildi",
"willbestoredas": "Şu şekilde depolanacak:",
"roleMappingDescription": "Otomatik Sağlama etkinleştirildiğinde kullanıcıların oturum açarken rollerin nasıl atandığını belirleyin.",
"selectRole": "Bir Rol Seçin",
"roleMappingExpression": "İfade",
"selectRolePlaceholder": "Bir rol seçin",
"selectRoleDescription": "Bu kimlik sağlayıcısından tüm kullanıcılara atanacak bir rol seçin",
"roleMappingExpressionDescription": "Rol bilgilerini ID tokeninden çıkarmak için bir JMESPath ifadesi girin",
"idpTenantIdRequired": "Kiracı Kimliği gereklidir",
"invalidValue": "Geçersiz değer",
"idpTypeLabel": "Kimlik Sağlayıcı Türü",
"roleMappingExpressionPlaceholder": "örn., contains(gruplar, 'yönetici') && 'Yönetici' || 'Üye'",
"idpGoogleConfiguration": "Google Yapılandırması",
"idpGoogleConfigurationDescription": "Google OAuth2 kimlik bilgilerinizi yapılandırın",
"idpGoogleClientIdDescription": "Google OAuth2 İstemci Kimliğiniz",
"idpGoogleClientSecretDescription": "Google OAuth2 İstemci Sırrınız",
"idpAzureConfiguration": "Azure Entra ID Yapılandırması",
"idpAzureConfigurationDescription": "Azure Entra ID OAuth2 kimlik bilgilerinizi yapılandırın",
"idpTenantId": "Kiracı Kimliği",
"idpTenantIdPlaceholder": "kiraci-kimliginiz",
"idpAzureTenantIdDescription": "Azure kiracı kimliğiniz (Azure Active Directory genel bakışında bulunur)",
"idpAzureClientIdDescription": "Azure Uygulama Kaydı İstemci Kimliğiniz",
"idpAzureClientSecretDescription": "Azure Uygulama Kaydı İstemci Sırrınız",
"idpGoogleTitle": "Google",
"idpGoogleAlt": "Google",
"idpAzureTitle": "Azure Entra ID",
"idpAzureAlt": "Azure",
"idpGoogleConfigurationTitle": "Google Yapılandırması",
"idpAzureConfigurationTitle": "Azure Entra ID Yapılandırması",
"idpTenantIdLabel": "Kiracı Kimliği",
"idpAzureClientIdDescription2": "Azure Uygulama Kaydı İstemci Kimliğiniz",
"idpAzureClientSecretDescription2": "Azure Uygulama Kaydı İstemci Sırrınız",
"idpGoogleDescription": "Google OAuth2/OIDC sağlayıcısı",
"idpAzureDescription": "Microsoft Azure OAuth2/OIDC sağlayıcısı",
"subnet": "Alt ağ",
"subnetDescription": "Bu organizasyonun ağ yapılandırması için alt ağ.",
"authPage": "Yetkilendirme Sayfası",
"authPageDescription": "Kuruluşunuz için yetkilendirme sayfasını yapılandırın",
"authPageDomain": "Yetkilendirme Sayfası Alanı",
"noDomainSet": "Alan belirlenmedi",
"changeDomain": "Alanı Değiştir",
"selectDomain": "Alan Seçin",
"restartCertificate": "Sertifikayı Yenile",
"editAuthPageDomain": "Yetkilendirme Sayfası Alanını Düzenle",
"setAuthPageDomain": "Yetkilendirme Sayfası Alanını Ayarla",
"failedToFetchCertificate": "Sertifika getirilemedi",
"failedToRestartCertificate": "Sertifika yeniden başlatılamadı",
"addDomainToEnableCustomAuthPages": "Kuruluşunuz için özel kimlik doğrulama sayfalarını etkinleştirmek için bir alan ekleyin",
"selectDomainForOrgAuthPage": "Kuruluşun kimlik doğrulama sayfası için bir alan seçin",
"domainPickerProvidedDomain": "Sağlanan Alan Adı",
"domainPickerFreeProvidedDomain": "Ücretsiz Sağlanan Alan Adı",
"domainPickerVerified": "Doğrulandı",
"domainPickerUnverified": "Doğrulanmadı",
"domainPickerInvalidSubdomainStructure": "Bu alt alan adı geçersiz karakterler veya yapı içeriyor. Kaydettiğinizde otomatik olarak temizlenecektir.",
"domainPickerError": "Hata",
"domainPickerErrorLoadDomains": "Organizasyon alan adları yüklenemedi",
"domainPickerErrorCheckAvailability": "Alan adı kullanılabilirliği kontrol edilemedi",
"domainPickerInvalidSubdomain": "Geçersiz alt alan adı",
"domainPickerInvalidSubdomainRemoved": "Girdi \"{sub}\" geçersiz olduğu için kaldırıldı.",
"domainPickerInvalidSubdomainCannotMakeValid": "\"{sub}\" {domain} için geçerli yapılamadı.",
"domainPickerSubdomainSanitized": "Alt alan adı temizlendi",
"domainPickerSubdomainCorrected": "\"{sub}\" \"{sanitized}\" olarak düzeltildi",
"orgAuthSignInTitle": "Kuruluşunuza giriş yapın",
"orgAuthChooseIdpDescription": "Devam etmek için kimlik sağlayıcınızı seçin",
"orgAuthNoIdpConfigured": "Bu kuruluşta yapılandırılmış kimlik sağlayıcı yok. Bunun yerine Pangolin kimliğinizle giriş yapabilirsiniz.",
"orgAuthSignInWithPangolin": "Pangolin ile Giriş Yap",
"subscriptionRequiredToUse": "Bu özelliği kullanmak için abonelik gerekmektedir.",
"idpDisabled": "Kimlik sağlayıcılar devre dışı bırakılmıştır.",
"orgAuthPageDisabled": "Kuruluş kimlik doğrulama sayfası devre dışı bırakılmıştır.",
"domainRestartedDescription": "Alan doğrulaması başarıyla yeniden başlatıldı",
"resourceAddEntrypointsEditFile": "Dosyayı düzenle: config/traefik/traefik_config.yml",
"resourceExposePortsEditFile": "Dosyayı düzenle: docker-compose.yml",
"emailVerificationRequired": "E-posta doğrulaması gereklidir. Bu adımı tamamlamak için lütfen tekrar {dashboardUrl}/auth/login üzerinden oturum açın. Sonra buraya geri dönün.",
"twoFactorSetupRequired": "İki faktörlü kimlik doğrulama ayarı gereklidir. Bu adımı tamamlamak için lütfen tekrar {dashboardUrl}/auth/login üzerinden oturum açın. Sonra buraya geri dönün.",
"authPageErrorUpdateMessage": "Kimlik doğrulama sayfası ayarları güncellenirken bir hata oluştu.",
"authPageUpdated": "Kimlik doğrulama sayfası başarıyla güncellendi",
"healthCheckNotAvailable": "Yerel",
"rewritePath": "Yolu Yeniden Yaz",
"rewritePathDescription": "Seçenek olarak hedefe iletmeden önce yolu yeniden yazın.",
"continueToApplication": "Uygulamaya Devam Et",
"checkingInvite": "Davet Kontrol Ediliyor",
"setResourceHeaderAuth": "setResourceHeaderAuth",
"resourceHeaderAuthRemove": "Başlık Kimlik Doğrulama Kaldır",
"resourceHeaderAuthRemoveDescription": "Başlık kimlik doğrulama başarıyla kaldırıldı.",
"resourceErrorHeaderAuthRemove": "Başlık Kimlik Doğrulama kaldırılamadı",
"resourceErrorHeaderAuthRemoveDescription": "Kaynak için başlık kimlik doğrulaması kaldırılamadı.",
"resourceHeaderAuthProtectionEnabled": "Header Authentication Enabled",
"resourceHeaderAuthProtectionDisabled": "Header Authentication Disabled",
"headerAuthRemove": "Remove Header Auth",
"headerAuthAdd": "Add Header Auth",
"resourceErrorHeaderAuthSetup": "Başlık Kimlik Doğrulama ayarlanamadı",
"resourceErrorHeaderAuthSetupDescription": "Kaynak için başlık kimlik doğrulaması ayarlanamadı.",
"resourceHeaderAuthSetup": "Başlık Kimlik Doğrulama başarıyla ayarlandı",
"resourceHeaderAuthSetupDescription": "Başlık kimlik doğrulaması başarıyla ayarlandı.",
"resourceHeaderAuthSetupTitle": "Başlık Kimlik Doğrulama Ayarla",
"resourceHeaderAuthSetupTitleDescription": "Set the basic auth credentials (username and password) to protect this resource with HTTP Header Authentication. Access it using the format https://username:password@resource.example.com",
"resourceHeaderAuthSubmit": "Başlık Kimlik Doğrulama Ayarla",
"actionSetResourceHeaderAuth": "Başlık Kimlik Doğrulama Ayarla",
"enterpriseEdition": "Enterprise Edition",
"unlicensed": "Unlicensed",
"beta": "Beta",
"manageClients": "Manage Clients",
"manageClientsDescription": "Clients are devices that can connect to your sites",
"licenseTableValidUntil": "Valid Until",
"saasLicenseKeysSettingsTitle": "Enterprise Licenses",
"saasLicenseKeysSettingsDescription": "Generate and manage Enterprise license keys for self-hosted Pangolin instances",
"sidebarEnterpriseLicenses": "Licenses",
"generateLicenseKey": "Generate License Key",
"generateLicenseKeyForm": {
"validation": {
"emailRequired": "Please enter a valid email address",
"useCaseTypeRequired": "Please select a use case type",
"firstNameRequired": "First name is required",
"lastNameRequired": "Last name is required",
"primaryUseRequired": "Please describe your primary use",
"jobTitleRequiredBusiness": "Job title is required for business use",
"industryRequiredBusiness": "Industry is required for business use",
"stateProvinceRegionRequired": "State/Province/Region is required",
"postalZipCodeRequired": "Postal/ZIP Code is required",
"companyNameRequiredBusiness": "Company name is required for business use",
"countryOfResidenceRequiredBusiness": "Country of residence is required for business use",
"countryRequiredPersonal": "Country is required for personal use",
"agreeToTermsRequired": "You must agree to the terms",
"complianceConfirmationRequired": "You must confirm compliance with the Fossorial Commercial License"
},
"useCaseOptions": {
"personal": {
"title": "Personal Use",
"description": "For individual, non-commercial use such as learning, personal projects, or experimentation."
},
"business": {
"title": "Business Use",
"description": "For use within organizations, companies, or commercial or revenue-generating activities."
}
},
"steps": {
"emailLicenseType": {
"title": "Email & License Type",
"description": "Enter your email and choose your license type"
},
"personalInformation": {
"title": "Personal Information",
"description": "Tell us about yourself"
},
"contactInformation": {
"title": "Contact Information",
"description": "Your contact details"
},
"termsGenerate": {
"title": "Terms & Generate",
"description": "Review and accept terms to generate your license"
}
},
"alerts": {
"commercialUseDisclosure": {
"title": "Usage Disclosure",
"description": "Select the license tier that accurately reflects your intended use. The Personal License permits free use of the Software for individual, non-commercial or small-scale commercial activities with annual gross revenue under $100,000 USD. Any use beyond these limits — including use within a business, organization, or other revenue-generating environment — requires a valid Enterprise License and payment of the applicable licensing fee. All users, whether Personal or Enterprise, must comply with the Fossorial Commercial License Terms."
},
"trialPeriodInformation": {
"title": "Trial Period Information",
"description": "This License Key enables Enterprise features for a 7-day evaluation period. Continued access to Paid Features beyond the evaluation period requires activation under a valid Personal or Enterprise License. For Enterprise licensing, contact sales@fossorial.io."
}
},
"form": {
"useCaseQuestion": "Are you using Pangolin for personal or business use?",
"firstName": "First Name",
"lastName": "Last Name",
"jobTitle": "Job Title",
"primaryUseQuestion": "What do you primarily plan to use Pangolin for?",
"industryQuestion": "What is your industry?",
"prospectiveUsersQuestion": "How many prospective users do you expect to have?",
"prospectiveSitesQuestion": "How many prospective sites (tunnels) do you expect to have?",
"companyName": "Company name",
"countryOfResidence": "Country of residence",
"stateProvinceRegion": "State / Province / Region",
"postalZipCode": "Postal / ZIP Code",
"companyWebsite": "Company website",
"companyPhoneNumber": "Company phone number",
"country": "Country",
"phoneNumberOptional": "Phone number (optional)",
"complianceConfirmation": "I confirm that I am in compliance with the Fossorial Commercial License and that reporting inaccurate information or misidentifying use of the product is a violation of the license."
},
"buttons": {
"close": "Close",
"previous": "Previous",
"next": "Next",
"generateLicenseKey": "Generate License Key"
},
"toasts": {
"success": {
"title": "License key generated successfully",
"description": "Your license key has been generated and is ready to use."
},
"error": {
"title": "Failed to generate license key",
"description": "An error occurred while generating the license key."
}
}
},
"priority": "Öncelik",
"priorityDescription": "Daha yüksek öncelikli rotalar önce değerlendirilir. Öncelik = 100, otomatik sıralama anlamına gelir (sistem karar verir). Manuel öncelik uygulamak için başka bir numara kullanın.",
"instanceName": "Instance Name",
"pathMatchModalTitle": "Configure Path Matching",
"pathMatchModalDescription": "Set up how incoming requests should be matched based on their path.",
"pathMatchType": "Match Type",
"pathMatchPrefix": "Prefix",
"pathMatchExact": "Exact",
"pathMatchRegex": "Regex",
"pathMatchValue": "Path Value",
"clear": "Clear",
"saveChanges": "Save Changes",
"pathMatchRegexPlaceholder": "^/api/.*",
"pathMatchDefaultPlaceholder": "/path",
"pathMatchPrefixHelp": "Example: /api matches /api, /api/users, etc.",
"pathMatchExactHelp": "Example: /api matches only /api",
"pathMatchRegexHelp": "Example: ^/api/.* matches /api/anything",
"pathRewriteModalTitle": "Configure Path Rewriting",
"pathRewriteModalDescription": "Transform the matched path before forwarding to the target.",
"pathRewriteType": "Rewrite Type",
"pathRewritePrefixOption": "Prefix - Replace prefix",
"pathRewriteExactOption": "Exact - Replace entire path",
"pathRewriteRegexOption": "Regex - Pattern replacement",
"pathRewriteStripPrefixOption": "Strip Prefix - Remove prefix",
"pathRewriteValue": "Rewrite Value",
"pathRewriteRegexPlaceholder": "/new/$1",
"pathRewriteDefaultPlaceholder": "/new-path",
"pathRewritePrefixHelp": "Replace the matched prefix with this value",
"pathRewriteExactHelp": "Replace the entire path with this value when the path matches exactly",
"pathRewriteRegexHelp": "Use capture groups like $1, $2 for replacement",
"pathRewriteStripPrefixHelp": "Leave empty to strip prefix or provide new prefix",
"pathRewritePrefix": "Prefix",
"pathRewriteExact": "Exact",
"pathRewriteRegex": "Regex",
"pathRewriteStrip": "Strip",
"pathRewriteStripLabel": "strip"
}

File diff suppressed because it is too large Load Diff

9511
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -19,46 +19,55 @@
"db:sqlite:studio": "drizzle-kit studio --config=./drizzle.sqlite.config.ts",
"db:pg:studio": "drizzle-kit studio --config=./drizzle.pg.config.ts",
"db:clear-migrations": "rm -rf server/migrations",
"set:oss": "echo 'export const build = \"oss\" as any;' > server/build.ts && cp tsconfig.oss.json tsconfig.json",
"set:saas": "echo 'export const build = \"saas\" as any;' > server/build.ts && cp tsconfig.saas.json tsconfig.json",
"set:enterprise": "echo 'export const build = \"enterprise\" as any;' > server/build.ts && cp tsconfig.enterprise.json tsconfig.json",
"set:sqlite": "echo 'export * from \"./sqlite\";' > server/db/index.ts",
"set:pg": "echo 'export * from \"./pg\";' > server/db/index.ts",
"next:build": "next build",
"build:sqlite": "mkdir -p dist && next build && node esbuild.mjs -e server/index.ts -o dist/server.mjs && node esbuild.mjs -e server/setup/migrationsSqlite.ts -o dist/migrations.mjs",
"build:pg": "mkdir -p dist && next build && node esbuild.mjs -e server/index.ts -o dist/server.mjs && node esbuild.mjs -e server/setup/migrationsPg.ts -o dist/migrations.mjs",
"start:sqlite": "DB_TYPE=sqlite NODE_OPTIONS=--enable-source-maps NODE_ENV=development ENVIRONMENT=prod sh -c 'node dist/migrations.mjs && node dist/server.mjs'",
"start:pg": "DB_TYPE=pg NODE_OPTIONS=--enable-source-maps NODE_ENV=development ENVIRONMENT=prod sh -c 'node dist/migrations.mjs && node dist/server.mjs'",
"start": "ENVIRONMENT=prod node dist/migrations.mjs && ENVIRONMENT=prod NODE_ENV=development node --enable-source-maps dist/server.mjs",
"email": "email dev --dir server/emails/templates --port 3005",
"build:cli": "node esbuild.mjs -e cli/index.ts -o dist/cli.mjs"
},
"dependencies": {
"@asteasolutions/zod-to-openapi": "^7.3.4",
"@hookform/resolvers": "3.9.1",
"@aws-sdk/client-s3": "3.908.0",
"@hookform/resolvers": "5.2.2",
"@node-rs/argon2": "^2.0.2",
"@oslojs/crypto": "1.0.1",
"@oslojs/encoding": "1.1.0",
"@radix-ui/react-avatar": "1.1.10",
"@radix-ui/react-checkbox": "1.3.2",
"@radix-ui/react-collapsible": "1.1.11",
"@radix-ui/react-dialog": "1.1.14",
"@radix-ui/react-dropdown-menu": "2.1.15",
"@radix-ui/react-checkbox": "1.3.3",
"@radix-ui/react-collapsible": "1.1.12",
"@radix-ui/react-dialog": "1.1.15",
"@radix-ui/react-dropdown-menu": "2.1.16",
"@radix-ui/react-icons": "1.3.2",
"@radix-ui/react-label": "2.1.7",
"@radix-ui/react-popover": "1.1.14",
"@radix-ui/react-popover": "1.1.15",
"@radix-ui/react-progress": "^1.1.7",
"@radix-ui/react-radio-group": "1.3.7",
"@radix-ui/react-scroll-area": "^1.2.9",
"@radix-ui/react-select": "2.2.5",
"@radix-ui/react-radio-group": "1.3.8",
"@radix-ui/react-scroll-area": "^1.2.10",
"@radix-ui/react-select": "2.2.6",
"@radix-ui/react-separator": "1.1.7",
"@radix-ui/react-slot": "1.2.3",
"@radix-ui/react-switch": "1.2.5",
"@radix-ui/react-tabs": "1.1.12",
"@radix-ui/react-toast": "1.2.14",
"@react-email/components": "0.1.0",
"@react-email/render": "^1.1.2",
"@react-email/tailwind": "1.0.5",
"@radix-ui/react-switch": "1.2.6",
"@radix-ui/react-tabs": "1.1.13",
"@radix-ui/react-toast": "1.2.15",
"@radix-ui/react-tooltip": "^1.2.8",
"@react-email/components": "0.5.6",
"@react-email/render": "^1.3.2",
"@react-email/tailwind": "1.2.2",
"@simplewebauthn/browser": "^13.2.2",
"@simplewebauthn/server": "^13.2.2",
"@tailwindcss/forms": "^0.5.10",
"@tanstack/react-table": "8.21.3",
"arctic": "^3.7.0",
"axios": "1.10.0",
"axios": "^1.12.2",
"better-sqlite3": "11.7.0",
"canvas-confetti": "1.9.3",
"class-variance-authority": "0.7.1",
"class-variance-authority": "^0.7.1",
"clsx": "2.1.1",
"cmdk": "1.1.1",
"cookie": "^1.0.2",
@@ -66,80 +75,89 @@
"cookies": "^0.9.1",
"cors": "2.8.5",
"crypto-js": "^4.2.0",
"drizzle-orm": "0.44.2",
"eslint": "9.29.0",
"eslint-config-next": "15.3.4",
"express": "4.21.2",
"express-rate-limit": "7.5.1",
"drizzle-orm": "0.44.6",
"eslint": "9.37.0",
"eslint-config-next": "15.5.4",
"express": "5.1.0",
"express-rate-limit": "8.1.0",
"glob": "11.0.3",
"helmet": "8.1.0",
"http-errors": "2.0.0",
"i": "^0.3.7",
"input-otp": "1.4.2",
"ioredis": "5.8.1",
"jmespath": "^0.16.0",
"js-yaml": "4.1.0",
"jsonwebtoken": "^9.0.2",
"lucide-react": "0.522.0",
"lucide-react": "^0.545.0",
"maxmind": "5.0.0",
"moment": "2.30.1",
"next": "15.3.4",
"next-intl": "^4.1.0",
"next": "15.5.4",
"next-intl": "^4.3.12",
"next-themes": "0.4.6",
"node-cache": "5.1.2",
"node-fetch": "3.3.2",
"nodemailer": "7.0.3",
"npm": "^11.4.2",
"nodemailer": "7.0.9",
"npm": "^11.6.2",
"oslo": "1.2.1",
"pg": "^8.16.2",
"posthog-node": "^5.9.5",
"qrcode.react": "4.2.0",
"react": "19.1.0",
"react-dom": "19.1.0",
"react-easy-sort": "^1.6.0",
"react-hook-form": "7.58.1",
"react": "19.2.0",
"react-dom": "19.2.0",
"react-easy-sort": "^1.8.0",
"react-hook-form": "7.65.0",
"react-icons": "^5.5.0",
"rebuild": "0.1.2",
"semver": "7.7.2",
"reodotdev": "^1.0.0",
"resend": "^6.1.2",
"semver": "^7.7.3",
"stripe": "18.2.1",
"swagger-ui-express": "^5.0.1",
"tailwind-merge": "3.3.1",
"tw-animate-css": "^1.3.3",
"uuid": "^11.1.0",
"tw-animate-css": "^1.3.8",
"uuid": "^13.0.0",
"vaul": "1.1.2",
"winston": "3.17.0",
"winston": "3.18.3",
"winston-daily-rotate-file": "5.0.0",
"ws": "8.18.2",
"zod": "3.25.67",
"zod-validation-error": "3.5.2",
"yargs": "18.0.0"
"ws": "8.18.3",
"yargs": "18.0.0",
"zod": "3.25.76",
"zod-validation-error": "3.5.2"
},
"devDependencies": {
"@dotenvx/dotenvx": "1.45.1",
"@dotenvx/dotenvx": "1.51.0",
"@esbuild-plugins/tsconfig-paths": "0.1.2",
"@tailwindcss/postcss": "^4.1.10",
"@react-email/preview-server": "4.3.0",
"@tailwindcss/postcss": "^4.1.14",
"@types/better-sqlite3": "7.6.12",
"@types/cookie-parser": "1.4.9",
"@types/cors": "2.8.19",
"@types/crypto-js": "^4.2.2",
"@types/express": "5.0.0",
"@types/express": "5.0.3",
"@types/express-session": "^1.18.2",
"@types/jmespath": "^0.15.2",
"@types/js-yaml": "4.0.9",
"@types/jsonwebtoken": "^9.0.10",
"@types/node": "^24",
"@types/nodemailer": "6.4.17",
"@types/react": "19.1.8",
"@types/react-dom": "19.1.6",
"@types/semver": "7.7.0",
"@types/node": "24.7.2",
"@types/nodemailer": "7.0.2",
"@types/pg": "8.15.5",
"@types/react": "19.2.2",
"@types/react-dom": "19.2.1",
"@types/semver": "^7.7.1",
"@types/swagger-ui-express": "^4.1.8",
"@types/ws": "8.18.1",
"@types/yargs": "17.0.33",
"drizzle-kit": "0.31.2",
"esbuild": "0.25.5",
"drizzle-kit": "0.31.5",
"esbuild": "0.25.10",
"esbuild-node-externals": "1.18.0",
"postcss": "^8",
"react-email": "4.0.16",
"react-email": "4.3.0",
"tailwindcss": "^4.1.4",
"tsc-alias": "1.8.16",
"tsx": "4.20.3",
"tsx": "4.20.6",
"typescript": "^5",
"typescript-eslint": "^8.35.0"
"typescript-eslint": "^8.46.0"
},
"overrides": {
"emblor": {

BIN
public/auth-diagram1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 647 KiB

BIN
public/clip.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 500 KiB

132
public/diagram-dark.svg Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 52 KiB

132
public/diagram.svg Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 52 KiB

BIN
public/idp/azure.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 65 KiB

BIN
public/idp/google.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 34 KiB

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 33 KiB

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 574 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 748 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 688 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 687 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 669 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 713 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 636 KiB

Some files were not shown because too many files have changed in this diff Show More