forked from extern/dockge
Compare commits
28 Commits
Author | SHA1 | Date | |
---|---|---|---|
34af500b66 | |||
56eb46150f | |||
f6fffcc064 | |||
457f038108 | |||
f862bbc7cd | |||
3d56846cd6 | |||
cff929c69d | |||
766e751522 | |||
45ab36db98 | |||
47435d41cd | |||
ee8f39699a | |||
204c776b0d | |||
724b5d6d7e | |||
766ecb070d | |||
d1d3a54377 | |||
d17a63fcab | |||
5454b44a1c | |||
9e8bccbf2f | |||
866fa380dd | |||
49b28d0e36 | |||
1e7dd0504b | |||
05191b14de | |||
81cacbdddd | |||
0279d431e0 | |||
0e768abfb4 | |||
62e952f1e6 | |||
f044c2e328 | |||
dc8787d204 |
72
.github/DISCUSSION_TEMPLATE/ask-for-help.yml
vendored
Normal file
72
.github/DISCUSSION_TEMPLATE/ask-for-help.yml
vendored
Normal file
@ -0,0 +1,72 @@
|
|||||||
|
title: "❓ Ask for help"
|
||||||
|
labels: [help]
|
||||||
|
body:
|
||||||
|
- type: checkboxes
|
||||||
|
id: no-duplicate-issues
|
||||||
|
attributes:
|
||||||
|
label: "⚠️ Please verify that this bug has NOT been raised before."
|
||||||
|
description: "Search in the issues sections by clicking [HERE](https://github.com/louislam/dockge/discussions/categories/ask-for-help)"
|
||||||
|
options:
|
||||||
|
- label: "I checked and didn't find similar issue"
|
||||||
|
required: true
|
||||||
|
- type: checkboxes
|
||||||
|
attributes:
|
||||||
|
label: "🛡️ Security Policy"
|
||||||
|
description: Please review the security policy before reporting security related issues/bugs.
|
||||||
|
options:
|
||||||
|
- label: I agree to have read this project [Security Policy](https://github.com/louislam/dockge/security/policy)
|
||||||
|
required: true
|
||||||
|
- type: textarea
|
||||||
|
id: steps-to-reproduce
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
attributes:
|
||||||
|
label: "📝 Describe your problem"
|
||||||
|
description: "Please walk us through it step by step."
|
||||||
|
placeholder: "Describe what are you asking for..."
|
||||||
|
- type: textarea
|
||||||
|
id: error-msg
|
||||||
|
validations:
|
||||||
|
required: false
|
||||||
|
attributes:
|
||||||
|
label: "📝 Error Message(s) or Log"
|
||||||
|
- type: input
|
||||||
|
id: dockge-version
|
||||||
|
attributes:
|
||||||
|
label: "🐻 Dockge Version"
|
||||||
|
description: "Which version of Dockge are you running? Please do NOT provide the docker tag such as latest or 1"
|
||||||
|
placeholder: "Ex. 1.10.0"
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: input
|
||||||
|
id: operating-system
|
||||||
|
attributes:
|
||||||
|
label: "💻 Operating System and Arch"
|
||||||
|
description: "Which OS is your server/device running on? (For Replit, please do not report this bug)"
|
||||||
|
placeholder: "Ex. Ubuntu 20.04 x86"
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: input
|
||||||
|
id: browser-vendor
|
||||||
|
attributes:
|
||||||
|
label: "🌐 Browser"
|
||||||
|
description: "Which browser are you running on? (For Replit, please do not report this bug)"
|
||||||
|
placeholder: "Ex. Google Chrome 95.0.4638.69"
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: input
|
||||||
|
id: docker-version
|
||||||
|
attributes:
|
||||||
|
label: "🐋 Docker Version"
|
||||||
|
description: "If running with Docker, which version are you running?"
|
||||||
|
placeholder: "Ex. Docker 20.10.9 / K8S / Podman"
|
||||||
|
validations:
|
||||||
|
required: false
|
||||||
|
- type: input
|
||||||
|
id: nodejs-version
|
||||||
|
attributes:
|
||||||
|
label: "🟩 NodeJS Version"
|
||||||
|
description: "If running with Node.js? which version are you running?"
|
||||||
|
placeholder: "Ex. 14.18.0"
|
||||||
|
validations:
|
||||||
|
required: false
|
55
.github/DISCUSSION_TEMPLATE/feature-request.yml
vendored
Normal file
55
.github/DISCUSSION_TEMPLATE/feature-request.yml
vendored
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
title: 🚀 Feature Request
|
||||||
|
labels: [feature-request]
|
||||||
|
body:
|
||||||
|
- type: checkboxes
|
||||||
|
id: no-duplicate-issues
|
||||||
|
attributes:
|
||||||
|
label: "⚠️ Please verify that this feature request has NOT been suggested before."
|
||||||
|
description: "Search in the issues sections by clicking [HERE](https://github.com/louislam/dockge/discussions/categories/feature-request)"
|
||||||
|
options:
|
||||||
|
- label: "I checked and didn't find similar feature request"
|
||||||
|
required: true
|
||||||
|
- type: dropdown
|
||||||
|
id: feature-area
|
||||||
|
attributes:
|
||||||
|
label: "🏷️ Feature Request Type"
|
||||||
|
description: "What kind of feature request is this?"
|
||||||
|
multiple: true
|
||||||
|
options:
|
||||||
|
- API
|
||||||
|
- UI Feature
|
||||||
|
- Other
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: textarea
|
||||||
|
id: feature-description
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
attributes:
|
||||||
|
label: "🔖 Feature description"
|
||||||
|
description: "A clear and concise description of what the feature request is."
|
||||||
|
placeholder: "You should add ..."
|
||||||
|
- type: textarea
|
||||||
|
id: solution
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
attributes:
|
||||||
|
label: "✔️ Solution"
|
||||||
|
description: "A clear and concise description of what you want to happen."
|
||||||
|
placeholder: "In my use-case, ..."
|
||||||
|
- type: textarea
|
||||||
|
id: alternatives
|
||||||
|
validations:
|
||||||
|
required: false
|
||||||
|
attributes:
|
||||||
|
label: "❓ Alternatives"
|
||||||
|
description: "A clear and concise description of any alternative solutions or features you've considered."
|
||||||
|
placeholder: "I have considered ..."
|
||||||
|
- type: textarea
|
||||||
|
id: additional-context
|
||||||
|
validations:
|
||||||
|
required: false
|
||||||
|
attributes:
|
||||||
|
label: "📝 Additional Context"
|
||||||
|
description: "Add any other context or screenshots about the feature request here."
|
||||||
|
placeholder: "..."
|
14
.github/ISSUE_TEMPLATE/ask-for-help.yaml
vendored
Normal file
14
.github/ISSUE_TEMPLATE/ask-for-help.yaml
vendored
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
name: "❓ Ask for help"
|
||||||
|
description: "Please go to the Discussions tab to submit a Help Request"
|
||||||
|
body:
|
||||||
|
- type: markdown
|
||||||
|
attributes:
|
||||||
|
value: |
|
||||||
|
Please go to https://github.com/louislam/dockge/discussions/new?category=ask-for-help
|
||||||
|
- type: checkboxes
|
||||||
|
id: no-duplicate-issues
|
||||||
|
attributes:
|
||||||
|
label: "Issues are for bug reports only"
|
||||||
|
options:
|
||||||
|
- label: "I understand"
|
||||||
|
required: true
|
99
.github/ISSUE_TEMPLATE/bug_report.yaml
vendored
Normal file
99
.github/ISSUE_TEMPLATE/bug_report.yaml
vendored
Normal file
@ -0,0 +1,99 @@
|
|||||||
|
name: "🐛 Bug Report"
|
||||||
|
description: "Submit a bug report to help us improve"
|
||||||
|
#title: "[Bug] "
|
||||||
|
labels: [bug]
|
||||||
|
body:
|
||||||
|
- type: checkboxes
|
||||||
|
id: no-duplicate-issues
|
||||||
|
attributes:
|
||||||
|
label: "⚠️ Please verify that this bug has NOT been reported before."
|
||||||
|
description: "Search in the issues sections by clicking [HERE](https://github.com/louislam/dockge/issues?q=)"
|
||||||
|
options:
|
||||||
|
- label: "I checked and didn't find similar issue"
|
||||||
|
required: true
|
||||||
|
- type: checkboxes
|
||||||
|
attributes:
|
||||||
|
label: "🛡️ Security Policy"
|
||||||
|
description: Please review the security policy before reporting security related issues/bugs.
|
||||||
|
options:
|
||||||
|
- label: I agree to have read this project [Security Policy](https://github.com/louislam/dockge/security/policy)
|
||||||
|
required: true
|
||||||
|
- type: textarea
|
||||||
|
id: description
|
||||||
|
validations:
|
||||||
|
required: false
|
||||||
|
attributes:
|
||||||
|
label: "Description"
|
||||||
|
description: "You could also upload screenshots"
|
||||||
|
- type: textarea
|
||||||
|
id: steps-to-reproduce
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
attributes:
|
||||||
|
label: "👟 Reproduction steps"
|
||||||
|
description: "How do you trigger this bug? Please walk us through it step by step."
|
||||||
|
placeholder: "..."
|
||||||
|
- type: textarea
|
||||||
|
id: expected-behavior
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
attributes:
|
||||||
|
label: "👀 Expected behavior"
|
||||||
|
description: "What did you think would happen?"
|
||||||
|
placeholder: "..."
|
||||||
|
- type: textarea
|
||||||
|
id: actual-behavior
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
attributes:
|
||||||
|
label: "😓 Actual Behavior"
|
||||||
|
description: "What actually happen?"
|
||||||
|
placeholder: "..."
|
||||||
|
- type: input
|
||||||
|
id: dockge-version
|
||||||
|
attributes:
|
||||||
|
label: "Dockge Version"
|
||||||
|
description: "Which version of Dockge are you running? Please do NOT provide the docker tag such as latest or 1"
|
||||||
|
placeholder: "Ex. 1.1.1"
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: input
|
||||||
|
id: operating-system
|
||||||
|
attributes:
|
||||||
|
label: "💻 Operating System and Arch"
|
||||||
|
description: "Which OS is your server/device running on?"
|
||||||
|
placeholder: "Ex. Ubuntu 20.04 x64 "
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: input
|
||||||
|
id: browser-vendor
|
||||||
|
attributes:
|
||||||
|
label: "🌐 Browser"
|
||||||
|
description: "Which browser are you running on?"
|
||||||
|
placeholder: "Ex. Google Chrome 95.0.4638.69"
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: input
|
||||||
|
id: docker-version
|
||||||
|
attributes:
|
||||||
|
label: "🐋 Docker Version"
|
||||||
|
description: "If running with Docker, which version are you running?"
|
||||||
|
placeholder: "Ex. Docker 20.10.9 / K8S / Podman"
|
||||||
|
validations:
|
||||||
|
required: false
|
||||||
|
- type: input
|
||||||
|
id: nodejs-version
|
||||||
|
attributes:
|
||||||
|
label: "🟩 NodeJS Version"
|
||||||
|
description: "If running with Node.js? which version are you running?"
|
||||||
|
placeholder: "Ex. 14.18.0"
|
||||||
|
validations:
|
||||||
|
required: false
|
||||||
|
- type: textarea
|
||||||
|
id: logs
|
||||||
|
attributes:
|
||||||
|
label: "📝 Relevant log output"
|
||||||
|
description: Please copy and paste any relevant log output. This will be automatically formatted into code, so no need for backticks.
|
||||||
|
render: shell
|
||||||
|
validations:
|
||||||
|
required: false
|
14
.github/ISSUE_TEMPLATE/feature_request.yaml
vendored
Normal file
14
.github/ISSUE_TEMPLATE/feature_request.yaml
vendored
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
name: 🚀 Feature Request
|
||||||
|
description: "Please go to the Discussions tab to submit a Feature Request"
|
||||||
|
body:
|
||||||
|
- type: markdown
|
||||||
|
attributes:
|
||||||
|
value: |
|
||||||
|
Please go to https://github.com/louislam/dockge/discussions/new?category=feature-request
|
||||||
|
- type: checkboxes
|
||||||
|
id: no-duplicate-issues
|
||||||
|
attributes:
|
||||||
|
label: "Issues are for bug reports only"
|
||||||
|
options:
|
||||||
|
- label: "I understand"
|
||||||
|
required: true
|
19
.github/ISSUE_TEMPLATE/security.md
vendored
Normal file
19
.github/ISSUE_TEMPLATE/security.md
vendored
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
---
|
||||||
|
|
||||||
|
name: "Security Issue"
|
||||||
|
about: "Just for alerting @louislam, do not provide any details here"
|
||||||
|
title: "Security Issue"
|
||||||
|
ref: "main"
|
||||||
|
labels:
|
||||||
|
|
||||||
|
- security
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
DO NOT PROVIDE ANY DETAILS HERE. Please privately report to https://github.com/louislam/dockge/security/advisories/new.
|
||||||
|
|
||||||
|
|
||||||
|
Why need this issue? It is because GitHub Advisory do not send a notification to @louislam, it is a workaround to do so.
|
||||||
|
|
||||||
|
Your GitHub Advisory URL:
|
||||||
|
|
34
.github/PULL_REQUEST_TEMPLATE.md
vendored
Normal file
34
.github/PULL_REQUEST_TEMPLATE.md
vendored
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
⚠️⚠️⚠️ Since we do not accept all types of pull requests and do not want to waste your time. Please be sure that you have read pull request rules:
|
||||||
|
https://github.com/louislam/dockge/blob/master/CONTRIBUTING.md
|
||||||
|
|
||||||
|
Tick the checkbox if you understand [x]:
|
||||||
|
- [ ] I have read and understand the pull request rules.
|
||||||
|
|
||||||
|
# Description
|
||||||
|
|
||||||
|
Fixes #(issue)
|
||||||
|
|
||||||
|
## Type of change
|
||||||
|
|
||||||
|
Please delete any options that are not relevant.
|
||||||
|
|
||||||
|
- Bug fix (non-breaking change which fixes an issue)
|
||||||
|
- User interface (UI)
|
||||||
|
- New feature (non-breaking change which adds functionality)
|
||||||
|
- Breaking change (fix or feature that would cause existing functionality to not work as expected)
|
||||||
|
- Other
|
||||||
|
- This change requires a documentation update
|
||||||
|
|
||||||
|
## Checklist
|
||||||
|
|
||||||
|
- [ ] My code follows the style guidelines of this project
|
||||||
|
- [ ] I ran ESLint and other linters for modified files
|
||||||
|
- [ ] I have performed a self-review of my own code and tested it
|
||||||
|
- [ ] I have commented my code, particularly in hard-to-understand areas
|
||||||
|
(including JSDoc for methods)
|
||||||
|
- [ ] My changes generate no new warnings
|
||||||
|
- [ ] My code needed automated testing. I have added them (this is optional task)
|
||||||
|
|
||||||
|
## Screenshots (if any)
|
||||||
|
|
||||||
|
Please do not use any external image service. Instead, just paste in or drag and drop the image here, and it will be uploaded automatically.
|
1
.github/config/exclude.txt
vendored
Normal file
1
.github/config/exclude.txt
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
# This is a .gitignore style file for 'GrantBirki/json-yaml-validate' Action workflow
|
3
.github/workflows/ci.yml
vendored
3
.github/workflows/ci.yml
vendored
@ -56,5 +56,8 @@ jobs:
|
|||||||
|
|
||||||
- name: Check Typescript
|
- name: Check Typescript
|
||||||
run: pnpm run check-ts
|
run: pnpm run check-ts
|
||||||
|
|
||||||
|
- name: Build
|
||||||
|
run: pnpm run build:frontend
|
||||||
# more things can be add later like tests etc..
|
# more things can be add later like tests etc..
|
||||||
|
|
||||||
|
42
.github/workflows/close-incorrect-issue.yml
vendored
Normal file
42
.github/workflows/close-incorrect-issue.yml
vendored
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
name: Close Incorrect Issue
|
||||||
|
|
||||||
|
on:
|
||||||
|
issues:
|
||||||
|
types: [opened]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
close-incorrect-issue:
|
||||||
|
runs-on: ${{ matrix.os }}
|
||||||
|
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
os: [ubuntu-latest]
|
||||||
|
node-version: [16]
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
|
||||||
|
- uses: pnpm/action-setup@v2
|
||||||
|
name: Install pnpm
|
||||||
|
with:
|
||||||
|
version: 8
|
||||||
|
run_install: false
|
||||||
|
|
||||||
|
- name: Get pnpm store directory
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
echo "STORE_PATH=$(pnpm store path --silent)" >> $GITHUB_ENV
|
||||||
|
|
||||||
|
- uses: actions/cache@v3
|
||||||
|
name: Setup pnpm cache
|
||||||
|
with:
|
||||||
|
path: ${{ env.STORE_PATH }}
|
||||||
|
key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
|
||||||
|
restore-keys: |
|
||||||
|
${{ runner.os }}-pnpm-store-
|
||||||
|
|
||||||
|
- name: Install dependencies
|
||||||
|
run: pnpm install
|
||||||
|
|
||||||
|
- name: Close Incorrect Issue
|
||||||
|
run: node extra/close-incorrect-issue.js ${{ secrets.GITHUB_TOKEN }} ${{ github.event.issue.number }} ${{ github.event.issue.user.login }}
|
27
.github/workflows/json-yaml-validate.yml
vendored
Normal file
27
.github/workflows/json-yaml-validate.yml
vendored
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
name: json-yaml-validate
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- master
|
||||||
|
pull_request:
|
||||||
|
branches:
|
||||||
|
- master
|
||||||
|
- 2.0.X
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
pull-requests: write # enable write permissions for pull request comments
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
json-yaml-validate:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
|
||||||
|
- name: json-yaml-validate
|
||||||
|
id: json-yaml-validate
|
||||||
|
uses: GrantBirki/json-yaml-validate@v1.3.0
|
||||||
|
with:
|
||||||
|
comment: "false" # enable comment mode
|
||||||
|
exclude_file: ".github/config/exclude.txt" # gitignore style file for exclusions
|
139
CONTRIBUTING.md
Normal file
139
CONTRIBUTING.md
Normal file
@ -0,0 +1,139 @@
|
|||||||
|
## Can I create a pull request for Dockge?
|
||||||
|
|
||||||
|
Yes or no, it depends on what you will try to do. Since I don't want to waste your time, be sure to **create open a discussion, so we can have a discussion first**. Especially for a large pull request or you don't know if it will be merged or not.
|
||||||
|
|
||||||
|
Here are some references:
|
||||||
|
|
||||||
|
### ✅ Usually accepted:
|
||||||
|
- Bug fix
|
||||||
|
- Security fix
|
||||||
|
- Translation
|
||||||
|
|
||||||
|
### ⚠️ Discussion required:
|
||||||
|
- Large pull requests
|
||||||
|
- New features
|
||||||
|
|
||||||
|
### ❌ Won't be merged:
|
||||||
|
- Do not pass the auto-test
|
||||||
|
- Any breaking changes
|
||||||
|
- Duplicated pull requests
|
||||||
|
- Buggy
|
||||||
|
- UI/UX is not close to Dockge
|
||||||
|
- Modifications or deletions of existing logic without a valid reason.
|
||||||
|
- Adding functions that is completely out of scope
|
||||||
|
- Converting existing code into other programming languages
|
||||||
|
- Unnecessarily large code changes that are hard to review and cause conflicts with other PRs.
|
||||||
|
|
||||||
|
The above cases may not cover all possible situations.
|
||||||
|
|
||||||
|
I (@louislam) have the final say. If your pull request does not meet my expectations, I will reject it, no matter how much time you spend on it. Therefore, it is essential to have a discussion beforehand.
|
||||||
|
|
||||||
|
I will assign your pull request to a [milestone](https://github.com/louislam/dockge/milestones), if I plan to review and merge it.
|
||||||
|
|
||||||
|
Also, please don't rush or ask for an ETA, because I have to understand the pull request, make sure it is no breaking changes and stick to my vision of this project, especially for large pull requests.
|
||||||
|
|
||||||
|
## Project Styles
|
||||||
|
|
||||||
|
I personally do not like something that requires so many configurations before you can finally start the app.
|
||||||
|
|
||||||
|
- Settings should be configurable in the frontend. Environment variables are discouraged, unless it is related to startup such as `DOCKGE_STACKS_DIR`
|
||||||
|
- Easy to use
|
||||||
|
- The web UI styling should be consistent and nice
|
||||||
|
- No native build dependency
|
||||||
|
|
||||||
|
## Coding Styles
|
||||||
|
|
||||||
|
- 4 spaces indentation
|
||||||
|
- Follow `.editorconfig`
|
||||||
|
- Follow ESLint
|
||||||
|
- Methods and functions should be documented with JSDoc
|
||||||
|
|
||||||
|
## Name Conventions
|
||||||
|
|
||||||
|
- Javascript/Typescript: camelCaseType
|
||||||
|
- SQLite: snake_case (Underscore)
|
||||||
|
- CSS/SCSS: kebab-case (Dash)
|
||||||
|
|
||||||
|
## Tools
|
||||||
|
|
||||||
|
- [`Node.js`](https://nodejs.org/) >= 20
|
||||||
|
- [`pnpm`](https://pnpm.io/)
|
||||||
|
- [`git`](https://git-scm.com/)
|
||||||
|
- IDE that supports [`ESLint`](https://eslint.org/) and EditorConfig (I am using [`IntelliJ IDEA`](https://www.jetbrains.com/idea/))
|
||||||
|
- A SQLite GUI tool (f.ex. [`SQLite Expert Personal`](https://www.sqliteexpert.com/download.html) or [`DBeaver Community`](https://dbeaver.io/download/))
|
||||||
|
|
||||||
|
## Install Dependencies for Development
|
||||||
|
|
||||||
|
```bash
|
||||||
|
pnpm install
|
||||||
|
```
|
||||||
|
|
||||||
|
## Dev Server
|
||||||
|
|
||||||
|
```
|
||||||
|
pnpm run dev:frontend
|
||||||
|
pnpm run dev:backend
|
||||||
|
```
|
||||||
|
|
||||||
|
## Backend Dev Server
|
||||||
|
|
||||||
|
It binds to `0.0.0.0:5001` by default.
|
||||||
|
|
||||||
|
It is mainly a socket.io app + express.js.
|
||||||
|
|
||||||
|
## Frontend Dev Server
|
||||||
|
|
||||||
|
It binds to `0.0.0.0:5000` by default. The frontend dev server is used for development only.
|
||||||
|
|
||||||
|
For production, it is not used. It will be compiled to `frontend-dist` directory instead.
|
||||||
|
|
||||||
|
You can use Vue.js devtools Chrome extension for debugging.
|
||||||
|
|
||||||
|
### Build the frontend
|
||||||
|
|
||||||
|
```bash
|
||||||
|
pnpm run build
|
||||||
|
```
|
||||||
|
|
||||||
|
## Database Migration
|
||||||
|
|
||||||
|
TODO
|
||||||
|
|
||||||
|
## Dependencies
|
||||||
|
|
||||||
|
Both frontend and backend share the same package.json. However, the frontend dependencies are eventually not used in the production environment, because it is usually also baked into dist files. So:
|
||||||
|
|
||||||
|
- Frontend dependencies = "devDependencies"
|
||||||
|
- Examples: vue, chart.js
|
||||||
|
- Backend dependencies = "dependencies"
|
||||||
|
- Examples: socket.io, sqlite3
|
||||||
|
- Development dependencies = "devDependencies"
|
||||||
|
- Examples: eslint, sass
|
||||||
|
|
||||||
|
### Update Dependencies
|
||||||
|
|
||||||
|
Should only be done by the maintainer.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
pnpm update
|
||||||
|
````
|
||||||
|
|
||||||
|
It should update the patch release version only.
|
||||||
|
|
||||||
|
Patch release = the third digit ([Semantic Versioning](https://semver.org/))
|
||||||
|
|
||||||
|
If for security / bug / other reasons, a library must be updated, breaking changes need to be checked by the person proposing the change.
|
||||||
|
|
||||||
|
## Translations
|
||||||
|
|
||||||
|
Please add **all** the strings which are translatable to `src/lang/en.json` (If translation keys are omitted, they can not be translated).
|
||||||
|
|
||||||
|
**Don't include any other languages in your initial Pull-Request** (even if this is your mother tongue), to avoid merge-conflicts between weblate and `master`.
|
||||||
|
The translations can then (after merging a PR into `master`) be translated by awesome people donating their language skills.
|
||||||
|
|
||||||
|
If you want to help by translating Uptime Kuma into your language, please visit the [instructions on how to translate using weblate](https://github.com/louislam/uptime-kuma/blob/master/src/lang/README.md).
|
||||||
|
|
||||||
|
## Spelling & Grammar
|
||||||
|
|
||||||
|
Feel free to correct the grammar in the documentation or code.
|
||||||
|
My mother language is not English and my grammar is not that great.
|
@ -75,19 +75,19 @@ services:
|
|||||||
image: louislam/dockge:1
|
image: louislam/dockge:1
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
ports:
|
ports:
|
||||||
# Host Port:Container Port
|
# Host Port : Container Port
|
||||||
- 5001:5001
|
- 5001:5001
|
||||||
volumes:
|
volumes:
|
||||||
- /var/run/docker.sock:/var/run/docker.sock
|
- /var/run/docker.sock:/var/run/docker.sock
|
||||||
- ./data:/app/data
|
- ./data:/app/data
|
||||||
|
|
||||||
# If you want to use private registries, you need to share the auth file with Dockge:
|
# If you want to use private registries, you need to share the auth file with Dockge:
|
||||||
# - /root/.docker/:/root/.docker
|
# - /root/.docker/:/root/.docker
|
||||||
|
|
||||||
# Your stacks directory in the host (The paths inside container must be the same as the host)
|
# Your stacks directory in the host (The paths inside container must be the same as the host)
|
||||||
# ⚠️⚠️ If you did it wrong, your data could end up be written into a wrong path.
|
# ⚠️⚠️ If you did it wrong, your data could end up be written into a wrong path.
|
||||||
# ✔️✔️✔️✔️ CORRECT EXAMPLE: - /my-stacks:/my-stacks (Both paths match)
|
# ✔️✔️✔️✔️ CORRECT: - /my-stacks:/my-stacks (Both paths match)
|
||||||
# ❌❌❌❌ WRONG EXAMPLE: - /docker:/my-stacks (Both paths do not match)
|
# ❌❌❌❌ WRONG: - /docker:/my-stacks (Both paths do not match)
|
||||||
- /opt/stacks:/opt/stacks
|
- /opt/stacks:/opt/stacks
|
||||||
environment:
|
environment:
|
||||||
# Tell Dockge where is your stacks directory
|
# Tell Dockge where is your stacks directory
|
||||||
|
12
SECURITY.md
Normal file
12
SECURITY.md
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
# Security Policy
|
||||||
|
|
||||||
|
## Reporting a Vulnerability
|
||||||
|
|
||||||
|
1. Please report security issues to https://github.com/louislam/dockge/security/advisories/new.
|
||||||
|
1. Please also create an empty security issue to alert me, as GitHub Advisories do not send a notification, I probably will miss it without this. https://github.com/louislam/dockge/issues/new?assignees=&labels=help&template=security.md
|
||||||
|
|
||||||
|
Do not use the public issue tracker or discuss it in public as it will cause more damage.
|
||||||
|
|
||||||
|
## Do you accept other 3rd-party bug bounty platforms?
|
||||||
|
|
||||||
|
At this moment, I DO NOT accept other bug bounty platforms, because I am not familiar with these platforms and someone has tried to send a phishing link to me by doing this already. To minimize my own risk, please report through GitHub Advisories only. I will ignore all 3rd-party bug bounty platforms emails.
|
@ -30,6 +30,7 @@ import { Cron } from "croner";
|
|||||||
import gracefulShutdown from "http-graceful-shutdown";
|
import gracefulShutdown from "http-graceful-shutdown";
|
||||||
import User from "./models/user";
|
import User from "./models/user";
|
||||||
import childProcess from "child_process";
|
import childProcess from "child_process";
|
||||||
|
import { Terminal } from "./terminal";
|
||||||
|
|
||||||
export class DockgeServer {
|
export class DockgeServer {
|
||||||
app : Express;
|
app : Express;
|
||||||
@ -194,6 +195,7 @@ export class DockgeServer {
|
|||||||
// Create Socket.io
|
// Create Socket.io
|
||||||
this.io = new socketIO.Server(this.httpServer, {
|
this.io = new socketIO.Server(this.httpServer, {
|
||||||
cors,
|
cors,
|
||||||
|
transports: [ "websocket" ],
|
||||||
});
|
});
|
||||||
|
|
||||||
this.io.on("connection", async (socket: Socket) => {
|
this.io.on("connection", async (socket: Socket) => {
|
||||||
@ -230,6 +232,11 @@ export class DockgeServer {
|
|||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
|
if (isDev) {
|
||||||
|
setInterval(() => {
|
||||||
|
log.debug("terminal", "Terminal count: " + Terminal.getTerminalCount());
|
||||||
|
}, 5000);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async afterLogin(socket : DockgeSocket, user : User) {
|
async afterLogin(socket : DockgeSocket, user : User) {
|
||||||
@ -285,18 +292,18 @@ export class DockgeServer {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Listen
|
// Listen
|
||||||
this.httpServer.listen(5001, this.config.hostname, () => {
|
this.httpServer.listen(this.config.port, this.config.hostname, () => {
|
||||||
if (this.config.hostname) {
|
if (this.config.hostname) {
|
||||||
log.info( "server", `Listening on ${this.config.hostname}:${this.config.port}`);
|
log.info( "server", `Listening on ${this.config.hostname}:${this.config.port}`);
|
||||||
} else {
|
} else {
|
||||||
log.info("server", `Listening on ${this.config.port}`);
|
log.info("server", `Listening on ${this.config.port}`);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Run every 5 seconds
|
// Run every 10 seconds
|
||||||
Cron("*/2 * * * * *", {
|
Cron("*/10 * * * * *", {
|
||||||
protect: true, // Enabled over-run protection.
|
protect: true, // Enabled over-run protection.
|
||||||
}, () => {
|
}, () => {
|
||||||
log.debug("server", "Cron job running");
|
//log.debug("server", "Cron job running");
|
||||||
this.sendStackList(true);
|
this.sendStackList(true);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -75,7 +75,9 @@ export class DockerSocketHandler extends SocketHandler {
|
|||||||
|
|
||||||
const stack = Stack.getStack(server, stackName);
|
const stack = Stack.getStack(server, stackName);
|
||||||
|
|
||||||
stack.joinCombinedTerminal(socket);
|
if (stack.isManagedByDockge) {
|
||||||
|
stack.joinCombinedTerminal(socket);
|
||||||
|
}
|
||||||
|
|
||||||
callback({
|
callback({
|
||||||
ok: true,
|
ok: true,
|
||||||
|
@ -140,9 +140,26 @@ export class TerminalSocketHandler extends SocketHandler {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
// Close Terminal
|
// Leave Combined Terminal
|
||||||
socket.on("terminalClose", async (terminalName : unknown, callback : unknown) => {
|
socket.on("leaveCombinedTerminal", async (stackName : unknown, callback) => {
|
||||||
|
try {
|
||||||
|
checkLogin(socket);
|
||||||
|
|
||||||
|
log.debug("leaveCombinedTerminal", "Stack name: " + stackName);
|
||||||
|
|
||||||
|
if (typeof(stackName) !== "string") {
|
||||||
|
throw new ValidationError("Stack name must be a string.");
|
||||||
|
}
|
||||||
|
|
||||||
|
const stack = Stack.getStack(server, stackName);
|
||||||
|
await stack.leaveCombinedTerminal(socket);
|
||||||
|
|
||||||
|
callback({
|
||||||
|
ok: true,
|
||||||
|
});
|
||||||
|
} catch (e) {
|
||||||
|
callbackError(e, callback);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
// TODO: Resize Terminal
|
// TODO: Resize Terminal
|
||||||
|
@ -191,6 +191,7 @@ export class Stack {
|
|||||||
let stacksDir = server.stacksDir;
|
let stacksDir = server.stacksDir;
|
||||||
let stackList : Map<string, Stack>;
|
let stackList : Map<string, Stack>;
|
||||||
|
|
||||||
|
// Use cached stack list?
|
||||||
if (useCacheForManaged && this.managedStackList.size > 0) {
|
if (useCacheForManaged && this.managedStackList.size > 0) {
|
||||||
stackList = this.managedStackList;
|
stackList = this.managedStackList;
|
||||||
} else {
|
} else {
|
||||||
@ -220,22 +221,19 @@ export class Stack {
|
|||||||
this.managedStackList = new Map(stackList);
|
this.managedStackList = new Map(stackList);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Also get the list from `docker compose ls --all --format json`
|
// Get status from docker compose ls
|
||||||
let res = childProcess.execSync("docker compose ls --all --format json");
|
let res = childProcess.execSync("docker compose ls --all --format json");
|
||||||
let composeList = JSON.parse(res.toString());
|
let composeList = JSON.parse(res.toString());
|
||||||
|
|
||||||
for (let composeStack of composeList) {
|
for (let composeStack of composeList) {
|
||||||
|
|
||||||
// Skip the dockge stack
|
|
||||||
// TODO: Could be self managed?
|
|
||||||
if (composeStack.Name === "dockge") {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
let stack = stackList.get(composeStack.Name);
|
let stack = stackList.get(composeStack.Name);
|
||||||
|
|
||||||
// This stack probably is not managed by Dockge, but we still want to show it
|
// This stack probably is not managed by Dockge, but we still want to show it
|
||||||
if (!stack) {
|
if (!stack) {
|
||||||
|
// Skip the dockge stack if it is not managed by Dockge
|
||||||
|
if (composeStack.Name === "dockge") {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
stack = new Stack(server, composeStack.Name);
|
stack = new Stack(server, composeStack.Name);
|
||||||
stackList.set(composeStack.Name, stack);
|
stackList.set(composeStack.Name, stack);
|
||||||
}
|
}
|
||||||
@ -300,7 +298,7 @@ export class Stack {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
log.debug("getStack", "Skip FS operations");
|
//log.debug("getStack", "Skip FS operations");
|
||||||
}
|
}
|
||||||
|
|
||||||
let stack : Stack;
|
let stack : Stack;
|
||||||
@ -376,12 +374,21 @@ export class Stack {
|
|||||||
async joinCombinedTerminal(socket: DockgeSocket) {
|
async joinCombinedTerminal(socket: DockgeSocket) {
|
||||||
const terminalName = getCombinedTerminalName(this.name);
|
const terminalName = getCombinedTerminalName(this.name);
|
||||||
const terminal = Terminal.getOrCreateTerminal(this.server, terminalName, "docker", [ "compose", "logs", "-f", "--tail", "100" ], this.path);
|
const terminal = Terminal.getOrCreateTerminal(this.server, terminalName, "docker", [ "compose", "logs", "-f", "--tail", "100" ], this.path);
|
||||||
|
terminal.enableKeepAlive = true;
|
||||||
terminal.rows = COMBINED_TERMINAL_ROWS;
|
terminal.rows = COMBINED_TERMINAL_ROWS;
|
||||||
terminal.cols = COMBINED_TERMINAL_COLS;
|
terminal.cols = COMBINED_TERMINAL_COLS;
|
||||||
terminal.join(socket);
|
terminal.join(socket);
|
||||||
terminal.start();
|
terminal.start();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async leaveCombinedTerminal(socket: DockgeSocket) {
|
||||||
|
const terminalName = getCombinedTerminalName(this.name);
|
||||||
|
const terminal = Terminal.getTerminal(terminalName);
|
||||||
|
if (terminal) {
|
||||||
|
terminal.leave(socket);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
async joinContainerTerminal(socket: DockgeSocket, serviceName: string, shell : string = "sh", index: number = 0) {
|
async joinContainerTerminal(socket: DockgeSocket, serviceName: string, shell : string = "sh", index: number = 0) {
|
||||||
const terminalName = getContainerExecTerminalName(this.name, serviceName, index);
|
const terminalName = getContainerExecTerminalName(this.name, serviceName, index);
|
||||||
let terminal = Terminal.getTerminal(terminalName);
|
let terminal = Terminal.getTerminal(terminalName);
|
||||||
|
@ -34,6 +34,9 @@ export class Terminal {
|
|||||||
protected _rows : number = TERMINAL_ROWS;
|
protected _rows : number = TERMINAL_ROWS;
|
||||||
protected _cols : number = TERMINAL_COLS;
|
protected _cols : number = TERMINAL_COLS;
|
||||||
|
|
||||||
|
public enableKeepAlive : boolean = false;
|
||||||
|
protected keepAliveInterval? : NodeJS.Timeout;
|
||||||
|
|
||||||
constructor(server : DockgeServer, name : string, file : string, args : string | string[], cwd : string) {
|
constructor(server : DockgeServer, name : string, file : string, args : string | string[], cwd : string) {
|
||||||
this.server = server;
|
this.server = server;
|
||||||
this._name = name;
|
this._name = name;
|
||||||
@ -80,6 +83,25 @@ export class Terminal {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (this.enableKeepAlive) {
|
||||||
|
log.debug("Terminal", "Keep alive enabled for terminal " + this.name);
|
||||||
|
|
||||||
|
// Close if there is no clients
|
||||||
|
this.keepAliveInterval = setInterval(() => {
|
||||||
|
const clients = this.server.io.sockets.adapter.rooms.get(this.name);
|
||||||
|
const numClients = clients ? clients.size : 0;
|
||||||
|
|
||||||
|
if (numClients === 0) {
|
||||||
|
log.debug("Terminal", "Terminal " + this.name + " has no client, closing...");
|
||||||
|
this.close();
|
||||||
|
} else {
|
||||||
|
log.debug("Terminal", "Terminal " + this.name + " has " + numClients + " client(s)");
|
||||||
|
}
|
||||||
|
}, 60 * 1000);
|
||||||
|
} else {
|
||||||
|
log.debug("Terminal", "Keep alive disabled for terminal " + this.name);
|
||||||
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
this._ptyProcess = pty.spawn(this.file, this.args, {
|
this._ptyProcess = pty.spawn(this.file, this.args, {
|
||||||
name: this.name,
|
name: this.name,
|
||||||
@ -100,6 +122,8 @@ export class Terminal {
|
|||||||
this._ptyProcess.onExit(this.exit);
|
this._ptyProcess.onExit(this.exit);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
if (error instanceof Error) {
|
if (error instanceof Error) {
|
||||||
|
clearInterval(this.keepAliveInterval);
|
||||||
|
|
||||||
log.error("Terminal", "Failed to start terminal: " + error.message);
|
log.error("Terminal", "Failed to start terminal: " + error.message);
|
||||||
const exitCode = Number(error.message.split(" ").pop());
|
const exitCode = Number(error.message.split(" ").pop());
|
||||||
this.exit({
|
this.exit({
|
||||||
@ -122,6 +146,8 @@ export class Terminal {
|
|||||||
Terminal.terminalMap.delete(this.name);
|
Terminal.terminalMap.delete(this.name);
|
||||||
log.debug("Terminal", "Terminal " + this.name + " exited with code " + res.exitCode);
|
log.debug("Terminal", "Terminal " + this.name + " exited with code " + res.exitCode);
|
||||||
|
|
||||||
|
clearInterval(this.keepAliveInterval);
|
||||||
|
|
||||||
if (this.callback) {
|
if (this.callback) {
|
||||||
this.callback(res.exitCode);
|
this.callback(res.exitCode);
|
||||||
}
|
}
|
||||||
@ -158,7 +184,9 @@ export class Terminal {
|
|||||||
}
|
}
|
||||||
|
|
||||||
close() {
|
close() {
|
||||||
this._ptyProcess?.kill();
|
clearInterval(this.keepAliveInterval);
|
||||||
|
// Send Ctrl+C to the terminal
|
||||||
|
this.ptyProcess?.write("\x03");
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -193,6 +221,10 @@ export class Terminal {
|
|||||||
terminal.start();
|
terminal.start();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static getTerminalCount() {
|
||||||
|
return Terminal.terminalMap.size;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
57
extra/close-incorrect-issue.js
Normal file
57
extra/close-incorrect-issue.js
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
import github from "@actions/github";
|
||||||
|
|
||||||
|
(async () => {
|
||||||
|
try {
|
||||||
|
const token = process.argv[2];
|
||||||
|
const issueNumber = process.argv[3];
|
||||||
|
const username = process.argv[4];
|
||||||
|
|
||||||
|
const client = github.getOctokit(token).rest;
|
||||||
|
|
||||||
|
const issue = {
|
||||||
|
owner: "louislam",
|
||||||
|
repo: "dockge",
|
||||||
|
number: issueNumber,
|
||||||
|
};
|
||||||
|
|
||||||
|
const labels = (
|
||||||
|
await client.issues.listLabelsOnIssue({
|
||||||
|
owner: issue.owner,
|
||||||
|
repo: issue.repo,
|
||||||
|
issue_number: issue.number
|
||||||
|
})
|
||||||
|
).data.map(({ name }) => name);
|
||||||
|
|
||||||
|
if (labels.length === 0) {
|
||||||
|
console.log("Bad format here");
|
||||||
|
|
||||||
|
await client.issues.addLabels({
|
||||||
|
owner: issue.owner,
|
||||||
|
repo: issue.repo,
|
||||||
|
issue_number: issue.number,
|
||||||
|
labels: [ "invalid-format" ]
|
||||||
|
});
|
||||||
|
|
||||||
|
// Add the issue closing comment
|
||||||
|
await client.issues.createComment({
|
||||||
|
owner: issue.owner,
|
||||||
|
repo: issue.repo,
|
||||||
|
issue_number: issue.number,
|
||||||
|
body: `@${username}: Hello! :wave:\n\nThis issue is being automatically closed because it does not follow the issue template. Please DO NOT open a blank issue.`
|
||||||
|
});
|
||||||
|
|
||||||
|
// Close the issue
|
||||||
|
await client.issues.update({
|
||||||
|
owner: issue.owner,
|
||||||
|
repo: issue.repo,
|
||||||
|
issue_number: issue.number,
|
||||||
|
state: "closed"
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
console.log("Pass!");
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
console.log(e);
|
||||||
|
}
|
||||||
|
|
||||||
|
})();
|
1
frontend/components.d.ts
vendored
1
frontend/components.d.ts
vendored
@ -12,7 +12,6 @@ declare module 'vue' {
|
|||||||
ArrayInput: typeof import('./src/components/ArrayInput.vue')['default']
|
ArrayInput: typeof import('./src/components/ArrayInput.vue')['default']
|
||||||
ArraySelect: typeof import('./src/components/ArraySelect.vue')['default']
|
ArraySelect: typeof import('./src/components/ArraySelect.vue')['default']
|
||||||
BDropdown: typeof import('bootstrap-vue-next')['BDropdown']
|
BDropdown: typeof import('bootstrap-vue-next')['BDropdown']
|
||||||
BDropdownDivider: typeof import('bootstrap-vue-next')['BDropdownDivider']
|
|
||||||
BDropdownItem: typeof import('bootstrap-vue-next')['BDropdownItem']
|
BDropdownItem: typeof import('bootstrap-vue-next')['BDropdownItem']
|
||||||
BModal: typeof import('bootstrap-vue-next')['BModal']
|
BModal: typeof import('bootstrap-vue-next')['BModal']
|
||||||
Confirm: typeof import('./src/components/Confirm.vue')['default']
|
Confirm: typeof import('./src/components/Confirm.vue')['default']
|
||||||
|
@ -45,11 +45,12 @@ export default {
|
|||||||
<style scoped>
|
<style scoped>
|
||||||
.badge {
|
.badge {
|
||||||
min-width: 62px;
|
min-width: 62px;
|
||||||
overflow: hidden;
|
|
||||||
text-overflow: ellipsis;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.fixed-width {
|
.fixed-width {
|
||||||
width: 62px;
|
width: 62px;
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
@ -9,12 +9,20 @@ const languageList = {
|
|||||||
"fr": "Français",
|
"fr": "Français",
|
||||||
"pl-PL": "Polski",
|
"pl-PL": "Polski",
|
||||||
"pt": "Português",
|
"pt": "Português",
|
||||||
|
"pt-BR": "Português-Brasil",
|
||||||
"sl": "Slovenščina",
|
"sl": "Slovenščina",
|
||||||
"tr": "Türkçe",
|
"tr": "Türkçe",
|
||||||
"zh-CN": "简体中文",
|
"zh-CN": "简体中文",
|
||||||
|
"zh-TW": "繁體中文(台灣)",
|
||||||
"ur": "Urdu",
|
"ur": "Urdu",
|
||||||
"ko-KR": "한국어",
|
"ko-KR": "한국어",
|
||||||
"ru": "Русский"
|
"ru": "Русский",
|
||||||
|
"cs-CZ": "Čeština",
|
||||||
|
"ar": "العربية",
|
||||||
|
"th":"ไทย",
|
||||||
|
"it-IT":"Italiano",
|
||||||
|
"sv-SE":"Svenska",
|
||||||
|
"uk-UA":"Українська"
|
||||||
};
|
};
|
||||||
|
|
||||||
let messages = {
|
let messages = {
|
||||||
|
95
frontend/src/lang/ar.json
Normal file
95
frontend/src/lang/ar.json
Normal file
@ -0,0 +1,95 @@
|
|||||||
|
{
|
||||||
|
"languageName": "العربية",
|
||||||
|
"Create your admin account": "إنشاء حساب المشرف",
|
||||||
|
"authIncorrectCreds": "اسم المستخدم أو كلمة المرور غير صحيحة.",
|
||||||
|
"PasswordsDoNotMatch": "كلمة المرور غير مطابقة.",
|
||||||
|
"Repeat Password": "أعد كتابة كلمة السر",
|
||||||
|
"Create": "إنشاء",
|
||||||
|
"signedInDisp": "تم تسجيل الدخول باسم {0}",
|
||||||
|
"signedInDispDisabled": "تم تعطيل المصادقة.",
|
||||||
|
"home": "الرئيسية",
|
||||||
|
"console": "سطر الأوامر",
|
||||||
|
"registry": "السجل",
|
||||||
|
"compose": "أنشاء كمبوز",
|
||||||
|
"addFirstStackMsg": "أنشيء أول كمبوز!",
|
||||||
|
"stackName" : "اسم المكدسة",
|
||||||
|
"deployStack": "شنر",
|
||||||
|
"deleteStack": "حذف",
|
||||||
|
"stopStack": "إيقاف",
|
||||||
|
"restartStack": "إعادة تشغيل",
|
||||||
|
"updateStack": "تحديث",
|
||||||
|
"startStack": "تشغيل",
|
||||||
|
"downStack": "أيقاف",
|
||||||
|
"editStack": "تعديل",
|
||||||
|
"discardStack": "إهمال",
|
||||||
|
"saveStackDraft": "حفظ",
|
||||||
|
"notAvailableShort" : "غير متوفر",
|
||||||
|
"deleteStackMsg": "هل أنت متأكد أنك تريد حذف هذه المكدسة؟",
|
||||||
|
"stackNotManagedByDockgeMsg": "لا يتم إدارة هذه المكدس بواسطة Dockge.",
|
||||||
|
"primaryHostname": "اسم المضيف الرئيسي",
|
||||||
|
"general": "عام",
|
||||||
|
"container": "حاوية | حاويات",
|
||||||
|
"scanFolder": "مسح مجلد المكدسات",
|
||||||
|
"dockerImage": "صورة",
|
||||||
|
"restartPolicyUnlessStopped": "ما لم يوقف",
|
||||||
|
"restartPolicyAlways": "دائماً",
|
||||||
|
"restartPolicyOnFailure": "عند الفشل",
|
||||||
|
"restartPolicyNo": "لا",
|
||||||
|
"environmentVariable": "متغير البيئة | متغيرات البيئة",
|
||||||
|
"restartPolicy": "سياسة إعادة التشغيل",
|
||||||
|
"containerName": "اسم الحاوية",
|
||||||
|
"port": "منفذ | منافذ",
|
||||||
|
"volume": "مجلد | مجلدات",
|
||||||
|
"network": "شبكة | شبكات",
|
||||||
|
"dependsOn": "تبعية الحاوية | تبعية الحاويات",
|
||||||
|
"addListItem": "إضافة {0}",
|
||||||
|
"deleteContainer": "حذف",
|
||||||
|
"addContainer": "أضافة حاوية",
|
||||||
|
"addNetwork": "أضافة شبكة",
|
||||||
|
"disableauth.message1": "هل أنت متأكد أنك تريد <strong>تعطيل المصادقة</strong>?",
|
||||||
|
"disableauth.message2": "إنه مصمم للحالات <strong>التي تنوي فيها مصادقة الطرف الثالث</strong> أمام Dockge مثل Cloudflare Access, Authelia أو أي من آليات المصادقة الأخرى.",
|
||||||
|
"passwordNotMatchMsg": "كلمة المرور المكررة غير متطابقة.",
|
||||||
|
"autoGet": "الجلب التلقائي",
|
||||||
|
"add": "إضافة",
|
||||||
|
"Edit": "تعديل",
|
||||||
|
"applyToYAML": "تطبيق على YAML",
|
||||||
|
"createExternalNetwork": "إنشاء",
|
||||||
|
"addInternalNetwork": "إضافة",
|
||||||
|
"Save": "حفظ",
|
||||||
|
"Language": "اللغة",
|
||||||
|
"Current User": "المستخدم الحالي",
|
||||||
|
"Change Password": "تعديل كلمة المرور",
|
||||||
|
"Current Password": "كلمة المرور الحالية",
|
||||||
|
"New Password": "كلمة مرور جديدة",
|
||||||
|
"Repeat New Password": "أعد تكرار كلمة المرور",
|
||||||
|
"Update Password": "تحديث كلمة المرور",
|
||||||
|
"Advanced": "متقدم",
|
||||||
|
"Please use this option carefully!": "من فضلك استخدم هذا الخيار بعناية!",
|
||||||
|
"Enable Auth": "تفعيل المصادقة",
|
||||||
|
"Disable Auth": "تعطيل المصادقة",
|
||||||
|
"I understand, please disable": "أتفهم, أرجو التعطيل",
|
||||||
|
"Leave": "مغادرة",
|
||||||
|
"Frontend Version": "لإصدار الواجهة الأمامية",
|
||||||
|
"Check Update On GitHub": "تحق من التحديث على GitHub",
|
||||||
|
"Show update if available": "اعرض التحديث إذا كان متاحًا",
|
||||||
|
"Also check beta release": "تحقق أيضًا من إصدار النسخة التجريبية",
|
||||||
|
"Remember me": "تذكرني",
|
||||||
|
"Login": "تسجيل الدخول",
|
||||||
|
"Username": "اسم المستخدم",
|
||||||
|
"Password": "كلمة المرور",
|
||||||
|
"Settings": "الاعدادات",
|
||||||
|
"Logout": "تسجيل الخروج",
|
||||||
|
"Lowercase only": "أحرف صغيرة فقط",
|
||||||
|
"Convert to Compose": "تحويل إلى كومبوز",
|
||||||
|
"Docker Run": "تشغيل Docker",
|
||||||
|
"active": "نشيط",
|
||||||
|
"exited": "تم الخروج",
|
||||||
|
"inactive": "غير نشيط",
|
||||||
|
"Appearance": "المظهر",
|
||||||
|
"Security": "الأمان",
|
||||||
|
"About": "حول",
|
||||||
|
"Allowed commands:": "الأوامر المسموح بها:",
|
||||||
|
"Internal Networks": "الشبكات الداخلية",
|
||||||
|
"External Networks": "الشبكات الخارجية",
|
||||||
|
"No External Networks": "لا توجد شبكات خارجية"
|
||||||
|
}
|
95
frontend/src/lang/cs-CZ.json
Normal file
95
frontend/src/lang/cs-CZ.json
Normal file
@ -0,0 +1,95 @@
|
|||||||
|
{
|
||||||
|
"languageName": "Čeština",
|
||||||
|
"Create your admin account": "Vytvořit účet administrátora",
|
||||||
|
"authIncorrectCreds": "Nesprávné uživatelské jméno nebo heslo.",
|
||||||
|
"PasswordsDoNotMatch": "Hesla se neshodují.",
|
||||||
|
"Repeat Password": "Opakujte heslo",
|
||||||
|
"Create": "Vytvořit",
|
||||||
|
"signedInDisp": "Přihlášen jako {0}",
|
||||||
|
"signedInDispDisabled": "Ověření zakázáno.",
|
||||||
|
"home": "Domů",
|
||||||
|
"console": "Konzole",
|
||||||
|
"registry": "Registry",
|
||||||
|
"compose": "Compose",
|
||||||
|
"addFirstStackMsg": "Vytvořte svůj první stack!",
|
||||||
|
"stackName": "Název stacku",
|
||||||
|
"deployStack": "Nainstalovat",
|
||||||
|
"deleteStack": "Smazat",
|
||||||
|
"stopStack": "Zastavit",
|
||||||
|
"restartStack": "Restartovat",
|
||||||
|
"updateStack": "Aktualizovat",
|
||||||
|
"startStack": "Spustit",
|
||||||
|
"downStack": "Zastavit a vypnout",
|
||||||
|
"editStack": "Upravit",
|
||||||
|
"discardStack": "Zahodit",
|
||||||
|
"saveStackDraft": "Uložit",
|
||||||
|
"notAvailableShort": "N/A",
|
||||||
|
"deleteStackMsg": "Opravdu chcete smazat tento stack?",
|
||||||
|
"stackNotManagedByDockgeMsg": "Tento stack není spravován systémem Dockge.",
|
||||||
|
"primaryHostname": "Primární název hostitele",
|
||||||
|
"general": "Obecné",
|
||||||
|
"container": "Kontejner | Kontejnery",
|
||||||
|
"scanFolder": "Prohledat složku se stacky",
|
||||||
|
"dockerImage": "Obrázek",
|
||||||
|
"restartPolicyUnlessStopped": "Pokud není zastaveno",
|
||||||
|
"restartPolicyAlways": "Vždy",
|
||||||
|
"restartPolicyOnFailure": "Při selhání",
|
||||||
|
"restartPolicyNo": "Ne",
|
||||||
|
"environmentVariable": "Proměnná prostředí | Proměnné prostředí",
|
||||||
|
"restartPolicy": "Politika restartu",
|
||||||
|
"containerName": "Název kontejneru",
|
||||||
|
"port": "Port | Porty",
|
||||||
|
"volume": "Svazek | Svazky",
|
||||||
|
"network": "Síť | Sítě",
|
||||||
|
"dependsOn": "Závisí na kontejneru | Závislosti na kontejneru",
|
||||||
|
"addListItem": "Přidat {0}",
|
||||||
|
"deleteContainer": "Smazat",
|
||||||
|
"addContainer": "Přidat kontejner",
|
||||||
|
"addNetwork": "Přidat síť",
|
||||||
|
"disableauth.message1": "Opravdu chcete <strong>zakázat ověřování</strong>?",
|
||||||
|
"disableauth.message2": "Je navrženo pro scénáře, kde <strong>plánujete implementovat ověřování třetí strany</strong> před Dockge, například Cloudflare Access, Authelia nebo jiné ověřovací mechanismy.",
|
||||||
|
"passwordNotMatchMsg": "Hesla se neshodují.",
|
||||||
|
"autoGet": "Automaticky získat",
|
||||||
|
"add": "Přidat",
|
||||||
|
"Edit": "Upravit",
|
||||||
|
"applyToYAML": "Použít na YAML",
|
||||||
|
"createExternalNetwork": "Vytvořit",
|
||||||
|
"addInternalNetwork": "Přidat",
|
||||||
|
"Save": "Uložit",
|
||||||
|
"Language": "Jazyk",
|
||||||
|
"Current User": "Aktuální uživatel",
|
||||||
|
"Change Password": "Změnit heslo",
|
||||||
|
"Current Password": "Aktuální heslo",
|
||||||
|
"New Password": "Nové heslo",
|
||||||
|
"Repeat New Password": "Opakujte nové heslo",
|
||||||
|
"Update Password": "Aktualizovat heslo",
|
||||||
|
"Advanced": "Pokročilé",
|
||||||
|
"Please use this option carefully!": "Používejte tuto možnost opatrně!",
|
||||||
|
"Enable Auth": "Povolit ověřování",
|
||||||
|
"Disable Auth": "Zakázat ověřování",
|
||||||
|
"I understand, please disable": "Rozumím, prosím zakážte",
|
||||||
|
"Leave": "Opustit",
|
||||||
|
"Frontend Version": "Verze rozhraní",
|
||||||
|
"Check Update On GitHub": "Zkontrolovat aktualizaci na GitHubu",
|
||||||
|
"Show update if available": "Zobrazit aktualizaci, pokud je k dispozici",
|
||||||
|
"Also check beta release": "Zkontrolovat také beta verzi",
|
||||||
|
"Remember me": "Zapamatovat údaje",
|
||||||
|
"Login": "Přihlásit se",
|
||||||
|
"Username": "Uživatelské jméno",
|
||||||
|
"Password": "Heslo",
|
||||||
|
"Settings": "Nastavení",
|
||||||
|
"Logout": "Odhlásit se",
|
||||||
|
"Lowercase only": "Pouze malá písmena",
|
||||||
|
"Convert to Compose": "Převést na Compose",
|
||||||
|
"Docker Run": "Docker Run",
|
||||||
|
"active": "Aktivní",
|
||||||
|
"exited": "Ukončený",
|
||||||
|
"inactive": "Neaktivní",
|
||||||
|
"Appearance": "Vzhled",
|
||||||
|
"Security": "Zabezpečení",
|
||||||
|
"About": "O aplikaci",
|
||||||
|
"Allowed commands:": "Povolené příkazy:",
|
||||||
|
"Internal Networks": "Interní sítě",
|
||||||
|
"External Networks": "Externí sítě",
|
||||||
|
"No External Networks": "Žádné externí sítě"
|
||||||
|
}
|
@ -91,5 +91,10 @@
|
|||||||
"Allowed commands:": "Allowed commands:",
|
"Allowed commands:": "Allowed commands:",
|
||||||
"Internal Networks": "Internal Networks",
|
"Internal Networks": "Internal Networks",
|
||||||
"External Networks": "External Networks",
|
"External Networks": "External Networks",
|
||||||
"No External Networks": "No External Networks"
|
"No External Networks": "No External Networks",
|
||||||
|
"reverseProxyMsg1": "Using a Reverse Proxy?",
|
||||||
|
"reverseProxyMsg2": "Check how to config it for WebSocket",
|
||||||
|
"Cannot connect to the socket server.": "Cannot connect to the socket server.",
|
||||||
|
"reconnecting...": "Reconnecting...",
|
||||||
|
"connecting...": "Connecting to the socket server..."
|
||||||
}
|
}
|
||||||
|
95
frontend/src/lang/it-IT.json
Normal file
95
frontend/src/lang/it-IT.json
Normal file
@ -0,0 +1,95 @@
|
|||||||
|
{
|
||||||
|
"languageName": "Italiano",
|
||||||
|
"Create your admin account": "Crea il tuo account amministratore",
|
||||||
|
"authIncorrectCreds": "Username e/o password errati.",
|
||||||
|
"PasswordsDoNotMatch": "Le password non corrispondono.",
|
||||||
|
"Repeat Password": "Ripetere la password",
|
||||||
|
"Create": "Crea",
|
||||||
|
"signedInDisp": "Autenticato come {0}",
|
||||||
|
"signedInDispDisabled": "Autenticazione disabilitata.",
|
||||||
|
"home": "Home",
|
||||||
|
"console": "Console",
|
||||||
|
"registry": "Registro",
|
||||||
|
"compose": "Compose",
|
||||||
|
"addFirstStackMsg": "Componi il tuo primo stack!",
|
||||||
|
"stackName" : "Nome dello stack",
|
||||||
|
"deployStack": "Deploy",
|
||||||
|
"deleteStack": "Cancella",
|
||||||
|
"stopStack": "Stop",
|
||||||
|
"restartStack": "Riavvia",
|
||||||
|
"updateStack": "Aggiorna",
|
||||||
|
"startStack": "Avvia",
|
||||||
|
"downStack": "Stop & Down",
|
||||||
|
"editStack": "Modifica",
|
||||||
|
"discardStack": "Annulla",
|
||||||
|
"saveStackDraft": "Salva",
|
||||||
|
"notAvailableShort" : "N/D",
|
||||||
|
"deleteStackMsg": "Sei sicuro di voler eliminare questo stack?",
|
||||||
|
"stackNotManagedByDockgeMsg": "Questo stack non è gestito da Dockge.",
|
||||||
|
"primaryHostname": "Hostname primario",
|
||||||
|
"general": "Generale",
|
||||||
|
"container": "Container | Container",
|
||||||
|
"scanFolder": "Scansiona la cartella degli stack",
|
||||||
|
"dockerImage": "Immagine",
|
||||||
|
"restartPolicyUnlessStopped": "A meno che non venga fermato",
|
||||||
|
"restartPolicyAlways": "Sempre",
|
||||||
|
"restartPolicyOnFailure": "Quando fallisce",
|
||||||
|
"restartPolicyNo": "No",
|
||||||
|
"environmentVariable": "Variabile d'ambiente | Variabili d'ambiente",
|
||||||
|
"restartPolicy": "Politica di riavvio",
|
||||||
|
"containerName": "Nome del container",
|
||||||
|
"port": "Porta | Porte",
|
||||||
|
"volume": "Volume | Volumi",
|
||||||
|
"network": "Rete | Reti",
|
||||||
|
"dependsOn": "Dipendenza del container | Dipendenze del container",
|
||||||
|
"addListItem": "Aggiungi {0}",
|
||||||
|
"deleteContainer": "Elimina",
|
||||||
|
"addContainer": "Aggiungi container",
|
||||||
|
"addNetwork": "Aggiungi rete",
|
||||||
|
"disableauth.message1": "Sei sicuro di voler <strong>disabilitare l'autenticazione</strong>?",
|
||||||
|
"disableauth.message2": "È stato progettato per scenari <strong>in cui intendi implementare un'autenticazione di terze parti</strong> davanti a Dockge come ad esempio Cloudflare Access, Authelia o altri meccanismi di autenticazione.",
|
||||||
|
"passwordNotMatchMsg": "La password ripetuta non corrisponde.",
|
||||||
|
"autoGet": "Ottieni automaticamente",
|
||||||
|
"add": "Aggiungi",
|
||||||
|
"Edit": "Modifica",
|
||||||
|
"applyToYAML": "Applica al file YAML",
|
||||||
|
"createExternalNetwork": "Crea",
|
||||||
|
"addInternalNetwork": "Aggiungi",
|
||||||
|
"Save": "Salva",
|
||||||
|
"Language": "Lingua",
|
||||||
|
"Current User": "Utente corrente",
|
||||||
|
"Change Password": "Cambia la password",
|
||||||
|
"Current Password": "Password corrente",
|
||||||
|
"New Password": "Nuova password",
|
||||||
|
"Repeat New Password": "Ripeti la nuova password",
|
||||||
|
"Update Password": "Aggiornamento password",
|
||||||
|
"Advanced": "Avanzato",
|
||||||
|
"Please use this option carefully!": "Per favore usa questa opzione con cautela!",
|
||||||
|
"Enable Auth": "Abilita l'autenticazione",
|
||||||
|
"Disable Auth": "Disabilita l'autenticazione",
|
||||||
|
"I understand, please disable": "Lo capisco, disabilita",
|
||||||
|
"Leave": "Lascia",
|
||||||
|
"Frontend Version": "Versione del frontend",
|
||||||
|
"Check Update On GitHub": "Controlla la presenza di aggiornamenti su GitHub",
|
||||||
|
"Show update if available": "Mostra l'aggiornamento se è disponibile",
|
||||||
|
"Also check beta release": "Controlla anche le release in beta",
|
||||||
|
"Remember me": "Ricordami",
|
||||||
|
"Login": "Login",
|
||||||
|
"Username": "Username",
|
||||||
|
"Password": "Password",
|
||||||
|
"Settings": "Impostazioni",
|
||||||
|
"Logout": "Logout",
|
||||||
|
"Lowercase only": "Solo lettere minuscole",
|
||||||
|
"Convert to Compose": "Converti a Compose",
|
||||||
|
"Docker Run": "Docker Run",
|
||||||
|
"active": "attivo",
|
||||||
|
"exited": "uscito",
|
||||||
|
"inactive": "inattivo",
|
||||||
|
"Appearance": "Aspetto",
|
||||||
|
"Security": "Sicurezza",
|
||||||
|
"About": "Informazioni su",
|
||||||
|
"Allowed commands:": "Comandi permessi:",
|
||||||
|
"Internal Networks": "Reti interne",
|
||||||
|
"External Networks": "Reti esterne",
|
||||||
|
"No External Networks": "Nessuna rete esterna"
|
||||||
|
}
|
94
frontend/src/lang/pt-BR.json
Normal file
94
frontend/src/lang/pt-BR.json
Normal file
@ -0,0 +1,94 @@
|
|||||||
|
{
|
||||||
|
"languageName": "Português-Brasil",
|
||||||
|
"Create your admin account": "Crie sua conta de administrador",
|
||||||
|
"authIncorrectCreds": "Nome de usuário ou senha incorretos.",
|
||||||
|
"PasswordsDoNotMatch": "As senhas não correspondem.",
|
||||||
|
"Repeat Password": "Repetir a senha",
|
||||||
|
"Create": "Criar",
|
||||||
|
"signedInDisp": "Logado como {0}",
|
||||||
|
"signedInDispDisabled": "Autenticação desativada.",
|
||||||
|
"home": "Início",
|
||||||
|
"console": "Console",
|
||||||
|
"registry": "Registro",
|
||||||
|
"compose": "Compose",
|
||||||
|
"addFirstStackMsg": "Crie sua primeira stack!",
|
||||||
|
"stackName" : "Nome da stack",
|
||||||
|
"deployStack": "Deploy",
|
||||||
|
"deleteStack": "Excluir",
|
||||||
|
"stopStack": "Parar",
|
||||||
|
"restartStack": "Reiniciar",
|
||||||
|
"updateStack": "Atualizar",
|
||||||
|
"startStack": "Iniciar",
|
||||||
|
"editStack": "Editar",
|
||||||
|
"discardStack": "Descartar",
|
||||||
|
"saveStackDraft": "Salvar",
|
||||||
|
"notAvailableShort" : "N/D",
|
||||||
|
"deleteStackMsg": "Tem certeza que deseja excluir esta stack?",
|
||||||
|
"stackNotManagedByDockgeMsg": "Esta stack não é gerenciada pelo Dockge.",
|
||||||
|
"primaryHostname": "Nome do Host Primário",
|
||||||
|
"general": "Geral",
|
||||||
|
"container": "Contêiner | Contêineres",
|
||||||
|
"scanFolder": "Pesquisar na pasta de stacks",
|
||||||
|
"dockerImage": "Imagem",
|
||||||
|
"restartPolicyUnlessStopped": "A menos que seja parado",
|
||||||
|
"restartPolicyAlways": "Sempre",
|
||||||
|
"restartPolicyOnFailure": "Em caso de falha",
|
||||||
|
"restartPolicyNo": "Não",
|
||||||
|
"environmentVariable": "Variável de ambiente | Variáveis de ambiente",
|
||||||
|
"restartPolicy": "Política de reinicialização",
|
||||||
|
"containerName": "Nome do contêiner",
|
||||||
|
"port": "Porta | Portas",
|
||||||
|
"volume": "Volume | Volumes",
|
||||||
|
"network": "Rede | Redes",
|
||||||
|
"dependsOn": "Dependência do contêiner | Dependências do contêiner",
|
||||||
|
"addListItem": "Adicionar {0}",
|
||||||
|
"deleteContainer": "Excluir",
|
||||||
|
"addContainer": "Adicionar contêiner",
|
||||||
|
"addNetwork": "Adicionar rede",
|
||||||
|
"disableauth.message1": "Tem certeza que deseja <strong>desativar a autenticação</strong>?",
|
||||||
|
"disableauth.message2": "Isso foi projetado para ambientes <strong>onde você pretende implementar autenticação de terceiros</strong> no Dockge, como Cloudflare Access, Authelia entre outros mecanismos de autenticação.",
|
||||||
|
"passwordNotMatchMsg": "A senha repetida não corresponde.",
|
||||||
|
"autoGet": "Obter automaticamente",
|
||||||
|
"add": "Adicionar",
|
||||||
|
"Edit": "Editar",
|
||||||
|
"applyToYAML": "Aplicar ao YAML",
|
||||||
|
"createExternalNetwork": "Criar",
|
||||||
|
"addInternalNetwork": "Adicionar",
|
||||||
|
"Save": "Salvar",
|
||||||
|
"Language": "Idioma",
|
||||||
|
"Current User": "Usuário atual",
|
||||||
|
"Change Password": "Alterar senha",
|
||||||
|
"Current Password": "Senha atual",
|
||||||
|
"New Password": "Nova senha",
|
||||||
|
"Repeat New Password": "Repetir nova senha",
|
||||||
|
"Update Password": "Atualizar senha",
|
||||||
|
"Advanced": "Avançado",
|
||||||
|
"Please use this option carefully!": "Por favor, use esta opção com atenção!",
|
||||||
|
"Enable Auth": "Habilitar autenticação",
|
||||||
|
"Disable Auth": "Desabilitar autenticação",
|
||||||
|
"I understand, please disable": "Entendido, por favor desabilitar",
|
||||||
|
"Leave": "Sair",
|
||||||
|
"Frontend Version": "Versão da interface",
|
||||||
|
"Check Update On GitHub": "Verificar atualização no GitHub",
|
||||||
|
"Show update if available": "Mostrar atualização se disponível",
|
||||||
|
"Also check beta release": "Também verificar versão beta",
|
||||||
|
"Remember me": "Lembrar-me",
|
||||||
|
"Login": "Entrar",
|
||||||
|
"Username": "Nome de usuário",
|
||||||
|
"Password": "Senha",
|
||||||
|
"Settings": "Configurações",
|
||||||
|
"Logout": "Sair",
|
||||||
|
"Lowercase only": "Somente minúsculas",
|
||||||
|
"Convert to Compose": "Converter para compose",
|
||||||
|
"Docker Run": "Executar Docker",
|
||||||
|
"active": "ativo",
|
||||||
|
"exited": "encerrado",
|
||||||
|
"inactive": "inativo",
|
||||||
|
"Appearance": "Aparência",
|
||||||
|
"Security": "Segurança",
|
||||||
|
"About": "Sobre",
|
||||||
|
"Allowed commands:": "Comandos permitidos:",
|
||||||
|
"Internal Networks": "Redes internas",
|
||||||
|
"External Networks": "Redes externas",
|
||||||
|
"No External Networks": "Sem redes externas"
|
||||||
|
}
|
95
frontend/src/lang/sv-SE.json
Normal file
95
frontend/src/lang/sv-SE.json
Normal file
@ -0,0 +1,95 @@
|
|||||||
|
{
|
||||||
|
"languageName": "Svenska",
|
||||||
|
"Create your admin account": "Skapa ditt Admin-konto.",
|
||||||
|
"authIncorrectCreds": "Fel användarnamn eller lösenord.",
|
||||||
|
"PasswordsDoNotMatch": "Lösenorden matchar inte.",
|
||||||
|
"Repeat Password": "Repetera lösenord",
|
||||||
|
"Create": "Skapa",
|
||||||
|
"signedInDisp": "Inloggad som {0}",
|
||||||
|
"signedInDispDisabled": "Auth inaktiverad.",
|
||||||
|
"home": "Hem",
|
||||||
|
"console": "Konsol",
|
||||||
|
"registry": "Register",
|
||||||
|
"compose": "Komponera",
|
||||||
|
"addFirstStackMsg": "Komponera din första stack!",
|
||||||
|
"stackName" : "Stacknamn",
|
||||||
|
"deployStack": "Distribuera",
|
||||||
|
"deleteStack": "Radera",
|
||||||
|
"stopStack": "Stop",
|
||||||
|
"restartStack": "Starta om",
|
||||||
|
"updateStack": "Uppdatera",
|
||||||
|
"startStack": "Starta",
|
||||||
|
"downStack": "Stop & Ner",
|
||||||
|
"editStack": "Redigera",
|
||||||
|
"discardStack": "Kasta",
|
||||||
|
"saveStackDraft": "Spara",
|
||||||
|
"notAvailableShort" : "N/A",
|
||||||
|
"deleteStackMsg": "Är du säker på att du vill radera stacken?",
|
||||||
|
"stackNotManagedByDockgeMsg": "Denna stacken hanteras inte av Dockge.",
|
||||||
|
"primaryHostname": "Primärt värdnamn",
|
||||||
|
"general": "Allmän",
|
||||||
|
"container": "Container | Containrar",
|
||||||
|
"scanFolder": "Scanna Stackfolder",
|
||||||
|
"dockerImage": "Bild",
|
||||||
|
"restartPolicyUnlessStopped": "Om inte stoppas",
|
||||||
|
"restartPolicyAlways": "Alltid",
|
||||||
|
"restartPolicyOnFailure": "Vid Misslyckande",
|
||||||
|
"restartPolicyNo": "Nej",
|
||||||
|
"environmentVariable": "Miljövariabel | Miljövariabler",
|
||||||
|
"restartPolicy": "Omstartspolicy",
|
||||||
|
"containerName": "Containernamn",
|
||||||
|
"port": "Port | Portar",
|
||||||
|
"volume": "Volym | Volymer",
|
||||||
|
"network": "Nätverk | Nätverk",
|
||||||
|
"dependsOn": "Containerberoende | Containerberoenden",
|
||||||
|
"addListItem": "Lägg till {0}",
|
||||||
|
"deleteContainer": "Radera",
|
||||||
|
"addContainer": "Lägg till Container",
|
||||||
|
"addNetwork": "Lägg till Nätverk",
|
||||||
|
"disableauth.message1": "Är du säker på att du vill <strong>inaktivera autentisering</strong>?",
|
||||||
|
"disableauth.message2": "Det är designat för senarion <stong>när du ska implementera tredjeparts autentisering</strong> framör Dockge som Cloudflare Access, Authelia eller andra autentiseringsmekanismer.",
|
||||||
|
"passwordNotMatchMsg": "Det upprepade lösenordet matchar inte",
|
||||||
|
"autoGet": "Auto Hämta",
|
||||||
|
"add": "Lägg till",
|
||||||
|
"Edit": "Redigera",
|
||||||
|
"applyToYAML": "Lägg till i YAML",
|
||||||
|
"createExternalNetwork": "Skapa",
|
||||||
|
"addInternalNetwork": "Lägg till",
|
||||||
|
"Save": "Spara",
|
||||||
|
"Language": "Språk",
|
||||||
|
"Current User": "Nuvarande användaren",
|
||||||
|
"Change Password": "Byt lösenord",
|
||||||
|
"Current Password": "Nuvarande lösenord",
|
||||||
|
"New Password": "Nytt lösenord",
|
||||||
|
"Repeat New Password": "Upprepa nytt lösenord",
|
||||||
|
"Update Password": "Uppdatera lösenord",
|
||||||
|
"Advanced": "Avancerat",
|
||||||
|
"Please use this option carefully!": "Använd detta alternativ försiktigt!",
|
||||||
|
"Enable Auth": "Aktivera Auth",
|
||||||
|
"Disable Auth": "Avaktivera Auth",
|
||||||
|
"I understand, please disable": "Jag förstår, vänligen inaktivera",
|
||||||
|
"Leave": "Lämna",
|
||||||
|
"Frontend Version": "Frontendversion",
|
||||||
|
"Check Update On GitHub": "Kontrollera Uppdatering på GitHub",
|
||||||
|
"Show update if available": "Visa uppdatering om tillgänglig",
|
||||||
|
"Also check beta release": "Kontrollera även betaversionen",
|
||||||
|
"Remember me": "Kom ihåg mig",
|
||||||
|
"Login": "Logga in",
|
||||||
|
"Username": "Användarnamn",
|
||||||
|
"Password": "Lösenord",
|
||||||
|
"Settings": "Inställningar",
|
||||||
|
"Logout": "Logga ut",
|
||||||
|
"Lowercase only": "Endast små tecken",
|
||||||
|
"Convert to Compose": "Omvandla till Compose",
|
||||||
|
"Docker Run": "Docker Run",
|
||||||
|
"active": "aktiv",
|
||||||
|
"exited": "avslutad",
|
||||||
|
"inactive": "inaktiv",
|
||||||
|
"Appearance": "Utseende",
|
||||||
|
"Security": "Säkerhet",
|
||||||
|
"About": "Om",
|
||||||
|
"Allowed commands:": "Tillåtna kommandon:",
|
||||||
|
"Internal Networks": "Interna Nätverk",
|
||||||
|
"External Networks": "Externa Nätverk",
|
||||||
|
"No External Networks": "Inga Externa Nätverk"
|
||||||
|
}
|
95
frontend/src/lang/th.json
Normal file
95
frontend/src/lang/th.json
Normal file
@ -0,0 +1,95 @@
|
|||||||
|
{
|
||||||
|
"languageName": "ไทย",
|
||||||
|
"Create your admin account": "สร้างบัญชีผู้ดูแลระบบของคุณ",
|
||||||
|
"authIncorrectCreds": "ชื่อผู้ใช้หรือรหัสผ่านไม่ถูกต้อง",
|
||||||
|
"PasswordsDoNotMatch": "รหัสผ่านไม่ตรงกัน",
|
||||||
|
"Repeat Password": "ยืนยันรหัสผ่าน",
|
||||||
|
"Create": "สร้าง",
|
||||||
|
"signedInDisp": "ลงชื่อเข้าใช้ในชื่อ {0}",
|
||||||
|
"signedInDispDisabled": "ปิดใช้งาน Auth",
|
||||||
|
"home": "หน้าหลักe",
|
||||||
|
"console": "คอนโซล",
|
||||||
|
"registry": "Registry",
|
||||||
|
"compose": "Compose",
|
||||||
|
"addFirstStackMsg": "Compose stack แรกของคุณ",
|
||||||
|
"stackName": "ชื่อ Stack",
|
||||||
|
"deployStack": "ปรับใช้",
|
||||||
|
"deleteStack": "ลบ",
|
||||||
|
"stopStack": "หยุด",
|
||||||
|
"restartStack": "เริ่มใหม่",
|
||||||
|
"updateStack": "อัปเดต",
|
||||||
|
"startStack": "เริ่มต้น",
|
||||||
|
"downStack": "หยุดและปิด",
|
||||||
|
"editStack": "แก้ไข",
|
||||||
|
"discardStack": "ยกเลิก",
|
||||||
|
"saveStackDraft": "บันทึก",
|
||||||
|
"notAvailableShort": "N/A",
|
||||||
|
"deleteStackMsg": "คุณแน่ใจหรือไม่ว่าต้องการลบ stack นี้",
|
||||||
|
"stackNotManagedByDockgeMsg": "stack นี้ไม่ได้รับการจัดการโดย Dockge",
|
||||||
|
"primaryHostname": "ชื่อโฮสต์หลัก",
|
||||||
|
"general": "ทั่วไป",
|
||||||
|
"container": "Container | Containers",
|
||||||
|
"scanFolder": "สแกนโฟลเดอร์ Stacks",
|
||||||
|
"dockerImage": "Image",
|
||||||
|
"restartPolicyUnlessStopped": "Unless Stopped",
|
||||||
|
"restartPolicyAlways": "Always",
|
||||||
|
"restartPolicyOnFailure": "On Failure",
|
||||||
|
"restartPolicyNo": "No",
|
||||||
|
"environmentVariable": "Environment Variable | Environment Variables",
|
||||||
|
"restartPolicy": "เริ่มต้น Policy ใหม่",
|
||||||
|
"containerName": "ชื่อ Container",
|
||||||
|
"port": "พอร์ต | พอร์ต",
|
||||||
|
"volume": "ปริมาณ | ปริมาณ",
|
||||||
|
"network": "เครือข่าย | เครือข่าย",
|
||||||
|
"dependsOn": "Container Dependency | Container Dependencies",
|
||||||
|
"addListItem": "เพิ่ม {0}",
|
||||||
|
"deleteContainer": "ลบ",
|
||||||
|
"addContainer": "เพิ่ม Container",
|
||||||
|
"addNetwork": "เพิ่ม เครือข่าย",
|
||||||
|
"disableauth.message1": "คุณแน่ใจหรือไม่ว่าต้องการ <strong>ปิดใช้งานการตรวจสอบสิทธิ์</strong>?",
|
||||||
|
"disableauth.message2": "ได้รับการออกแบบมาสำหรับสถานการณ์ <strong>ที่คุณตั้งใจจะใช้การตรวจสอบสิทธิ์ของบุคคลที่สาม</strong> หน้า Dockge เช่น Cloudflare Access, Authelia หรือกลไกการตรวจสอบสิทธิ์อื่นๆ",
|
||||||
|
"passwordNotMatchMsg": "รหัสผ่านซ้ำไม่ตรงกัน",
|
||||||
|
"autoGet": "รับอัตโนมัติ",
|
||||||
|
"add": "เพิ่ม",
|
||||||
|
"Edit": "แก้ไข",
|
||||||
|
"applyToYAML": "นำไปใช้เป็น YAML",
|
||||||
|
"createExternalNetwork": "สร้าง",
|
||||||
|
"addInternalNetwork": "เพิ่ม",
|
||||||
|
"Save": "บันทึก",
|
||||||
|
"Language": "ภาษา",
|
||||||
|
"Current User": "ผู้ใช้งานปัจจุบัน",
|
||||||
|
"Change Password": "เปลี่ยนรหัสผ่าน",
|
||||||
|
"Current Password": "รหัสผ่านปัจจุบัน",
|
||||||
|
"New Password": "รหัสผ่านใหม่",
|
||||||
|
"Repeat New Password": "รหัสผ่านใหม่ซ้ำ",
|
||||||
|
"Update Password": "อัปเดตรหัสผ่าน",
|
||||||
|
"Advanced": "ขั้นสูง",
|
||||||
|
"Please use this option carefully!": "โปรดใช้ตัวเลือกนี้อย่างระมัดระวัง!",
|
||||||
|
"Enable Auth": "เปิดใช้งาน Auth",
|
||||||
|
"Disable Auth": "ปิดใช้งาน Auth",
|
||||||
|
"I understand, please disable": "ฉันเข้าใจ กรุณาปิดการใช้งาน",
|
||||||
|
"Leave": "ออก",
|
||||||
|
"Frontend Version": "เวอร์ชัน Frontend",
|
||||||
|
"Check Update On GitHub": "ตรวจสอบการอัปเดตบน GitHub",
|
||||||
|
"Show update if available": "แสดงการอัปเดตหากมี",
|
||||||
|
"Also check beta release": "สามารถตรวจสอบรุ่นเบต้าได้",
|
||||||
|
"Remember me": "จดจำฉัน",
|
||||||
|
"Login": "เข้าสู่ระบบ",
|
||||||
|
"Username": "ชื่อผู้ใช้",
|
||||||
|
"Password": "รหัสผ่าน",
|
||||||
|
"Settings": "การตั้งค่า",
|
||||||
|
"Logout": "ออกจากระบบ",
|
||||||
|
"Lowercase only": "ตัวเล็กทั้งหมด",
|
||||||
|
"Convert to Compose": "แปลงเป็น Compose",
|
||||||
|
"Docker Run": "เรียกใช้ Docker",
|
||||||
|
"active": "ใช้งานอยู่",
|
||||||
|
"exited": "ปิดลงแล้ว",
|
||||||
|
"inactive": "ไม่ได้ใช้งาน",
|
||||||
|
"Appearance": "รูปลักษณ์",
|
||||||
|
"Security": "ความปลอดภัย",
|
||||||
|
"About": "เกี่ยวกับ",
|
||||||
|
"Allowed commands:": "คำสั่งที่อนุญาต:",
|
||||||
|
"Internal Networks": "เครือข่ายภายใน",
|
||||||
|
"External Networks": "เครือข่ายภายนอก",
|
||||||
|
"No External Networks": "ไม่มีเครือข่ายภายนอก"
|
||||||
|
}
|
94
frontend/src/lang/uk-UA.json
Normal file
94
frontend/src/lang/uk-UA.json
Normal file
@ -0,0 +1,94 @@
|
|||||||
|
{
|
||||||
|
"languageName": "Українська",
|
||||||
|
"Create your admin account": "Створити акаунт адміністратора",
|
||||||
|
"authIncorrectCreds": "Невірний логін чи пароль",
|
||||||
|
"PasswordsDoNotMatch": "Паролі не співпадають.",
|
||||||
|
"Repeat Password": "Повторіть пароль",
|
||||||
|
"Create": "Створити",
|
||||||
|
"signedInDisp": "Авторизовано як {0}",
|
||||||
|
"signedInDispDisabled": "Авторизацію вимкнено.",
|
||||||
|
"home": "Головна",
|
||||||
|
"console": "Консоль",
|
||||||
|
"registry": "Registry",
|
||||||
|
"compose": "Compose",
|
||||||
|
"addFirstStackMsg": "Додайте свій перший стек!",
|
||||||
|
"stackName" : "Назва стеку",
|
||||||
|
"deployStack": "Розрознути",
|
||||||
|
"deleteStack": "Видалити",
|
||||||
|
"stopStack": "Зупинити",
|
||||||
|
"restartStack": "Перезапустити",
|
||||||
|
"updateStack": "Оновити",
|
||||||
|
"startStack": "Запустити",
|
||||||
|
"editStack": "Редагувати",
|
||||||
|
"discardStack": "Відмінити",
|
||||||
|
"saveStackDraft": "Зберегти",
|
||||||
|
"notAvailableShort" : "Н/Д",
|
||||||
|
"deleteStackMsg": "Ви впевнені що хочете видалити цей стек?",
|
||||||
|
"stackNotManagedByDockgeMsg": "Даний стек не управляється Dockge.",
|
||||||
|
"primaryHostname": "Назва хосту",
|
||||||
|
"general": "Загальне",
|
||||||
|
"container": "Контейнер | Контейнери",
|
||||||
|
"scanFolder": "Сканувати папку зі стеками",
|
||||||
|
"dockerImage": "Образ",
|
||||||
|
"restartPolicyUnlessStopped": "Доки не буде зупинено",
|
||||||
|
"restartPolicyAlways": "Завжди",
|
||||||
|
"restartPolicyOnFailure": "При падінні",
|
||||||
|
"restartPolicyNo": "Ніколи",
|
||||||
|
"environmentVariable": "Змінна середовища | змінні середовища",
|
||||||
|
"restartPolicy": "Перезапуск",
|
||||||
|
"containerName": "Назва контейнеру",
|
||||||
|
"port": "Порт | Порти",
|
||||||
|
"volume": "Сховище | Сховища",
|
||||||
|
"network": "Мережа | Мережі",
|
||||||
|
"dependsOn": "Залежність контейнера | Залежності контейнеру",
|
||||||
|
"addListItem": "Додати {0}",
|
||||||
|
"deleteContainer": "Видалити",
|
||||||
|
"addContainer": "Додати Контейнер",
|
||||||
|
"addNetwork": "Додати Мережу",
|
||||||
|
"disableauth.message1": "Ви впевнені що хочете <strong>вимкнути авторизацію</strong>?",
|
||||||
|
"disableauth.message2": "Це призначено для сценаріїв, <strong>де ви збираєтесь використати сторонню авторизацію</strong> перед Dockge, наприклад Cloudflare Access, Authelia чи інші.",
|
||||||
|
"passwordNotMatchMsg": "Паролі не співпадають.",
|
||||||
|
"autoGet": "Отримати",
|
||||||
|
"add": "Додати",
|
||||||
|
"Edit": "Змінити",
|
||||||
|
"applyToYAML": "Застосувати для YAML",
|
||||||
|
"createExternalNetwork": "Створити",
|
||||||
|
"addInternalNetwork": "Додати",
|
||||||
|
"Save": "Зберегти",
|
||||||
|
"Language": "Мова",
|
||||||
|
"Current User": "Користувач",
|
||||||
|
"Change Password": "Змінити пароль",
|
||||||
|
"Current Password": "Поточний пароль",
|
||||||
|
"New Password": "Новий пароль",
|
||||||
|
"Repeat New Password": "Повторіть новий пароль",
|
||||||
|
"Update Password": "Оновити пароль",
|
||||||
|
"Advanced": "Розширені опції",
|
||||||
|
"Please use this option carefully!": "Будь-ласка, використовуйте цю опцію з обережністю!",
|
||||||
|
"Enable Auth": "Увімкнути автентифікацію",
|
||||||
|
"Disable Auth": "Вимкнути автентифікацію",
|
||||||
|
"I understand, please disable": "Зрозуміло, все-одно вимкнути",
|
||||||
|
"Leave": "Покинути",
|
||||||
|
"Frontend Version": "Версія інтерфейсу",
|
||||||
|
"Check Update On GitHub": "Перевірити оновлення на GitHub",
|
||||||
|
"Show update if available": "Показати оновлення, якщо доступно",
|
||||||
|
"Also check beta release": "Перевіряти оновлення до бета-версії",
|
||||||
|
"Remember me": "Запамʼятати мене",
|
||||||
|
"Login": "Логін",
|
||||||
|
"Username": "Імʼя користувача",
|
||||||
|
"Password": "Пароль",
|
||||||
|
"Settings": "Налаштування",
|
||||||
|
"Logout": "Вийти",
|
||||||
|
"Lowercase only": "Тільки нижній регістр",
|
||||||
|
"Convert to Compose": "Конвертувати в Compose",
|
||||||
|
"Docker Run": "Запустити Docker",
|
||||||
|
"active": "активно",
|
||||||
|
"exited": "завершено",
|
||||||
|
"inactive": "неактивно",
|
||||||
|
"Appearance": "Зовнішній вигляд",
|
||||||
|
"Security": "Безпека",
|
||||||
|
"About": "Про продукт",
|
||||||
|
"Allowed commands:": "Дозволені команди:",
|
||||||
|
"Internal Networks": "Внутрішні мережі",
|
||||||
|
"External Networks": "Зовнішні мережі",
|
||||||
|
"No External Networks": "Немає зовнішніх мереж"
|
||||||
|
}
|
94
frontend/src/lang/zh-TW.json
Normal file
94
frontend/src/lang/zh-TW.json
Normal file
@ -0,0 +1,94 @@
|
|||||||
|
{
|
||||||
|
"languageName": "繁體中文(台灣)",
|
||||||
|
"Create your admin account": "建立您的管理員帳號",
|
||||||
|
"authIncorrectCreds": "使用者名稱或密碼錯誤",
|
||||||
|
"PasswordsDoNotMatch": "兩次輸入的密碼不一致。",
|
||||||
|
"Repeat Password": "重複以確認密碼",
|
||||||
|
"Create": "建立",
|
||||||
|
"signedInDisp": "目前使用者:{0}",
|
||||||
|
"signedInDispDisabled": "已停用身份驗證",
|
||||||
|
"home": "首頁",
|
||||||
|
"console": "主控台",
|
||||||
|
"registry": "映像倉庫",
|
||||||
|
"compose": "Compose",
|
||||||
|
"addFirstStackMsg": "組合您的第一個堆疊!",
|
||||||
|
"stackName": "堆疊名稱",
|
||||||
|
"deployStack": "部署",
|
||||||
|
"deleteStack": "刪除",
|
||||||
|
"stopStack": "停止",
|
||||||
|
"restartStack": "重啟",
|
||||||
|
"updateStack": "更新",
|
||||||
|
"startStack": "啟動",
|
||||||
|
"editStack": "編輯",
|
||||||
|
"discardStack": "捨棄",
|
||||||
|
"saveStackDraft": "儲存",
|
||||||
|
"notAvailableShort": "不可用",
|
||||||
|
"deleteStackMsg": "您確定要刪除這個堆疊嗎?",
|
||||||
|
"stackNotManagedByDockgeMsg": "這個堆疊不由 Dockge 管理",
|
||||||
|
"primaryHostname": "主機名稱",
|
||||||
|
"general": "一般",
|
||||||
|
"container": "容器 | 容器群組",
|
||||||
|
"scanFolder": "掃描堆疊資料夾",
|
||||||
|
"dockerImage": "映像",
|
||||||
|
"restartPolicyUnlessStopped": "除非手動停止",
|
||||||
|
"restartPolicyAlways": "始終",
|
||||||
|
"restartPolicyOnFailure": "在失敗時",
|
||||||
|
"restartPolicyNo": "不重啟",
|
||||||
|
"environmentVariable": "環境變數 | 環境變數群組",
|
||||||
|
"restartPolicy": "重啟策略",
|
||||||
|
"containerName": "容器名稱",
|
||||||
|
"port": "連接埠 | 連接埠群組",
|
||||||
|
"volume": "資料卷 | 資料卷群組",
|
||||||
|
"network": "網路 | 網路群組",
|
||||||
|
"dependsOn": "容器依賴 | 容器依賴關係",
|
||||||
|
"addListItem": "新增 {0}",
|
||||||
|
"deleteContainer": "刪除容器",
|
||||||
|
"addContainer": "新增容器",
|
||||||
|
"addNetwork": "新增網路",
|
||||||
|
"disableauth.message1": "您確定要<strong>停用身份驗證</strong>嗎?",
|
||||||
|
"disableauth.message2": "該選項設計用於某些場景,<strong>例如在 Dockge 之上接入第三方認證</strong>,如 Cloudflare Access、Authelia 或其他認證機制。如果您不清楚這個選項的作用,請不要停用驗證!",
|
||||||
|
"passwordNotMatchMsg": "兩次輸入的密碼不一致。",
|
||||||
|
"autoGet": "自動取得",
|
||||||
|
"add": "新增",
|
||||||
|
"Edit": "編輯",
|
||||||
|
"applyToYAML": "應用到YAML",
|
||||||
|
"createExternalNetwork": "建立",
|
||||||
|
"addInternalNetwork": "新增",
|
||||||
|
"Save": "儲存",
|
||||||
|
"Language": "語言",
|
||||||
|
"Current User": "目前使用者",
|
||||||
|
"Change Password": "更換密碼",
|
||||||
|
"Current Password": "目前密碼",
|
||||||
|
"New Password": "新密碼",
|
||||||
|
"Repeat New Password": "重複以確認新密碼",
|
||||||
|
"Update Password": "更新密碼",
|
||||||
|
"Advanced": "進階",
|
||||||
|
"Please use this option carefully!": "請謹慎使用該選項!",
|
||||||
|
"Enable Auth": "啟用驗證",
|
||||||
|
"Disable Auth": "停用驗證",
|
||||||
|
"I understand, please disable": "我已了解風險,確認停用",
|
||||||
|
"Leave": "離開",
|
||||||
|
"Frontend Version": "前端版本",
|
||||||
|
"Check Update On GitHub": "在 GitHub 上檢查更新",
|
||||||
|
"Show update if available": "有更新時提醒我",
|
||||||
|
"Also check beta release": "同時檢查 Beta 渠道更新",
|
||||||
|
"Remember me": "記住我",
|
||||||
|
"Login": "登入",
|
||||||
|
"Username": "使用者名稱",
|
||||||
|
"Password": "密碼",
|
||||||
|
"Settings": "設定",
|
||||||
|
"Logout": "登出",
|
||||||
|
"Lowercase only": "僅小寫字母",
|
||||||
|
"Convert to Compose": "轉換為 Compose 格式",
|
||||||
|
"Docker Run": "Docker 啟動",
|
||||||
|
"active": "已啟動",
|
||||||
|
"exited": "已退出",
|
||||||
|
"inactive": "未啟動",
|
||||||
|
"Appearance": "外觀",
|
||||||
|
"Security": "安全",
|
||||||
|
"About": "關於",
|
||||||
|
"Allowed commands:": "允許使用的指令:",
|
||||||
|
"Internal Networks": "內部網路",
|
||||||
|
"External Networks": "外部網路",
|
||||||
|
"No External Networks": "無外部網路"
|
||||||
|
}
|
@ -3,6 +3,9 @@
|
|||||||
<div v-if="! $root.socketIO.connected && ! $root.socketIO.firstConnect" class="lost-connection">
|
<div v-if="! $root.socketIO.connected && ! $root.socketIO.firstConnect" class="lost-connection">
|
||||||
<div class="container-fluid">
|
<div class="container-fluid">
|
||||||
{{ $root.socketIO.connectionErrorMsg }}
|
{{ $root.socketIO.connectionErrorMsg }}
|
||||||
|
<div v-if="$root.socketIO.showReverseProxyGuide">
|
||||||
|
{{ $t("reverseProxyMsg1") }} <a href="https://github.com/louislam/uptime-kuma/wiki/Reverse-Proxy" target="_blank">{{ $t("reverseProxyMsg2") }}</a>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@ -82,6 +85,10 @@
|
|||||||
</header>
|
</header>
|
||||||
|
|
||||||
<main>
|
<main>
|
||||||
|
<div v-if="$root.socketIO.connecting" class="container mt-5">
|
||||||
|
<h4>{{ $t("connecting...") }}</h4>
|
||||||
|
</div>
|
||||||
|
|
||||||
<router-view v-if="$root.loggedIn" />
|
<router-view v-if="$root.loggedIn" />
|
||||||
<Login v-if="! $root.loggedIn && $root.allowLoginDialog" />
|
<Login v-if="! $root.loggedIn && $root.allowLoginDialog" />
|
||||||
</main>
|
</main>
|
||||||
|
@ -19,6 +19,7 @@ export default defineComponent({
|
|||||||
initedSocketIO: false,
|
initedSocketIO: false,
|
||||||
connectionErrorMsg: `${this.$t("Cannot connect to the socket server.")} ${this.$t("Reconnecting...")}`,
|
connectionErrorMsg: `${this.$t("Cannot connect to the socket server.")} ${this.$t("Reconnecting...")}`,
|
||||||
showReverseProxyGuide: true,
|
showReverseProxyGuide: true,
|
||||||
|
connecting: false,
|
||||||
},
|
},
|
||||||
info: {
|
info: {
|
||||||
|
|
||||||
@ -103,13 +104,20 @@ export default defineComponent({
|
|||||||
url = location.protocol + "//" + location.host;
|
url = location.protocol + "//" + location.host;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let connectingMsgTimeout = setTimeout(() => {
|
||||||
|
this.socketIO.connecting = true;
|
||||||
|
}, 1500);
|
||||||
|
|
||||||
socket = io(url, {
|
socket = io(url, {
|
||||||
transports: [ "websocket", "polling" ]
|
transports: [ "websocket" ]
|
||||||
});
|
});
|
||||||
|
|
||||||
socket.on("connect", () => {
|
socket.on("connect", () => {
|
||||||
console.log("Connected to the socket server");
|
console.log("Connected to the socket server");
|
||||||
|
|
||||||
|
clearTimeout(connectingMsgTimeout);
|
||||||
|
this.socketIO.connecting = false;
|
||||||
|
|
||||||
this.socketIO.connectCount++;
|
this.socketIO.connectCount++;
|
||||||
this.socketIO.connected = true;
|
this.socketIO.connected = true;
|
||||||
this.socketIO.showReverseProxyGuide = false;
|
this.socketIO.showReverseProxyGuide = false;
|
||||||
@ -143,10 +151,11 @@ export default defineComponent({
|
|||||||
|
|
||||||
socket.on("connect_error", (err) => {
|
socket.on("connect_error", (err) => {
|
||||||
console.error(`Failed to connect to the backend. Socket.io connect_error: ${err.message}`);
|
console.error(`Failed to connect to the backend. Socket.io connect_error: ${err.message}`);
|
||||||
this.socketIO.connectionErrorMsg = `${this.$t("Cannot connect to the socket server.")} [${err}] ${this.$t("Reconnecting...")}`;
|
this.socketIO.connectionErrorMsg = `${this.$t("Cannot connect to the socket server.")} [${err}] ${this.$t("reconnecting...")}`;
|
||||||
this.socketIO.showReverseProxyGuide = true;
|
this.socketIO.showReverseProxyGuide = true;
|
||||||
this.socketIO.connected = false;
|
this.socketIO.connected = false;
|
||||||
this.socketIO.firstConnect = false;
|
this.socketIO.firstConnect = false;
|
||||||
|
this.socketIO.connecting = false;
|
||||||
});
|
});
|
||||||
|
|
||||||
// Custom Events
|
// Custom Events
|
||||||
|
@ -41,7 +41,7 @@
|
|||||||
{{ $t("stopStack") }}
|
{{ $t("stopStack") }}
|
||||||
</button>
|
</button>
|
||||||
|
|
||||||
<BDropdown v-if="!isEditMode && active" right text="" variant="normal">
|
<BDropdown right text="" variant="normal">
|
||||||
<BDropdownItem @click="downStack">
|
<BDropdownItem @click="downStack">
|
||||||
<font-awesome-icon icon="stop" class="me-1" />
|
<font-awesome-icon icon="stop" class="me-1" />
|
||||||
{{ $t("downStack") }}
|
{{ $t("downStack") }}
|
||||||
@ -319,6 +319,12 @@ export default {
|
|||||||
},
|
},
|
||||||
deep: true,
|
deep: true,
|
||||||
},
|
},
|
||||||
|
|
||||||
|
$route(to, from) {
|
||||||
|
// Leave Combined Terminal
|
||||||
|
console.debug("leaveCombinedTerminal", from.params.stackName);
|
||||||
|
this.$root.getSocket().emit("leaveCombinedTerminal", this.stack.name, () => {});
|
||||||
|
}
|
||||||
},
|
},
|
||||||
mounted() {
|
mounted() {
|
||||||
if (this.isAdd) {
|
if (this.isAdd) {
|
||||||
@ -361,7 +367,7 @@ export default {
|
|||||||
clearTimeout(serviceStatusTimeout);
|
clearTimeout(serviceStatusTimeout);
|
||||||
serviceStatusTimeout = setTimeout(async () => {
|
serviceStatusTimeout = setTimeout(async () => {
|
||||||
this.requestServiceStatus();
|
this.requestServiceStatus();
|
||||||
}, 2000);
|
}, 5000);
|
||||||
},
|
},
|
||||||
|
|
||||||
requestServiceStatus() {
|
requestServiceStatus() {
|
||||||
@ -544,10 +550,6 @@ export default {
|
|||||||
throw new Error("Services must be an object");
|
throw new Error("Services must be an object");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!config.version) {
|
|
||||||
config.version = "3.8";
|
|
||||||
}
|
|
||||||
|
|
||||||
this.yamlDoc = doc;
|
this.yamlDoc = doc;
|
||||||
this.jsonConfig = config;
|
this.jsonConfig = config;
|
||||||
|
|
||||||
|
@ -46,6 +46,7 @@
|
|||||||
"yaml": "~2.3.4"
|
"yaml": "~2.3.4"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
"@actions/github": "^6.0.0",
|
||||||
"@fontsource/jetbrains-mono": "^5.0.17",
|
"@fontsource/jetbrains-mono": "^5.0.17",
|
||||||
"@fortawesome/fontawesome-svg-core": "6.4.2",
|
"@fortawesome/fontawesome-svg-core": "6.4.2",
|
||||||
"@fortawesome/free-regular-svg-icons": "6.4.2",
|
"@fortawesome/free-regular-svg-icons": "6.4.2",
|
||||||
|
139
pnpm-lock.yaml
generated
139
pnpm-lock.yaml
generated
@ -82,6 +82,9 @@ dependencies:
|
|||||||
version: 2.3.4
|
version: 2.3.4
|
||||||
|
|
||||||
devDependencies:
|
devDependencies:
|
||||||
|
'@actions/github':
|
||||||
|
specifier: ^6.0.0
|
||||||
|
version: 6.0.0
|
||||||
'@fontsource/jetbrains-mono':
|
'@fontsource/jetbrains-mono':
|
||||||
specifier: ^5.0.17
|
specifier: ^5.0.17
|
||||||
version: 5.0.17
|
version: 5.0.17
|
||||||
@ -192,6 +195,22 @@ packages:
|
|||||||
engines: {node: '>=0.10.0'}
|
engines: {node: '>=0.10.0'}
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
|
/@actions/github@6.0.0:
|
||||||
|
resolution: {integrity: sha512-alScpSVnYmjNEXboZjarjukQEzgCRmjMv6Xj47fsdnqGS73bjJNDpiiXmp8jr0UZLdUB6d9jW63IcmddUP+l0g==}
|
||||||
|
dependencies:
|
||||||
|
'@actions/http-client': 2.2.0
|
||||||
|
'@octokit/core': 5.0.1
|
||||||
|
'@octokit/plugin-paginate-rest': 9.1.4(@octokit/core@5.0.1)
|
||||||
|
'@octokit/plugin-rest-endpoint-methods': 10.1.5(@octokit/core@5.0.1)
|
||||||
|
dev: true
|
||||||
|
|
||||||
|
/@actions/http-client@2.2.0:
|
||||||
|
resolution: {integrity: sha512-q+epW0trjVUUHboliPb4UF9g2msf+w61b32tAkFEwL/IwP0DQWgbCMM0Hbe3e3WXSKz5VcUXbzJQgy8Hkra/Lg==}
|
||||||
|
dependencies:
|
||||||
|
tunnel: 0.0.6
|
||||||
|
undici: 5.27.2
|
||||||
|
dev: true
|
||||||
|
|
||||||
/@antfu/utils@0.7.6:
|
/@antfu/utils@0.7.6:
|
||||||
resolution: {integrity: sha512-pvFiLP2BeOKA/ZOS6jxx4XhKzdVLHDhGlFEaZ2flWWYf2xOqVniqpk38I04DFRyz+L0ASggl7SkItTc+ZLju4w==}
|
resolution: {integrity: sha512-pvFiLP2BeOKA/ZOS6jxx4XhKzdVLHDhGlFEaZ2flWWYf2xOqVniqpk38I04DFRyz+L0ASggl7SkItTc+ZLju4w==}
|
||||||
dev: true
|
dev: true
|
||||||
@ -665,6 +684,11 @@ packages:
|
|||||||
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
|
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
|
/@fastify/busboy@2.1.0:
|
||||||
|
resolution: {integrity: sha512-+KpH+QxZU7O4675t3mnkQKcZZg56u+K/Ct2K+N2AZYNVK8kyeo/bI18tI8aPm3tvNNRyTWfj6s5tnGNlcbQRsA==}
|
||||||
|
engines: {node: '>=14'}
|
||||||
|
dev: true
|
||||||
|
|
||||||
/@floating-ui/core@1.5.0:
|
/@floating-ui/core@1.5.0:
|
||||||
resolution: {integrity: sha512-kK1h4m36DQ0UHGj5Ah4db7R0rHemTqqO0QLvUqi1/mUUp3LuAWbWxdxSIf/XsnH9VS6rRVPLJCncjRzUvyCLXg==}
|
resolution: {integrity: sha512-kK1h4m36DQ0UHGj5Ah4db7R0rHemTqqO0QLvUqi1/mUUp3LuAWbWxdxSIf/XsnH9VS6rRVPLJCncjRzUvyCLXg==}
|
||||||
dependencies:
|
dependencies:
|
||||||
@ -884,6 +908,92 @@ packages:
|
|||||||
dev: false
|
dev: false
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
|
/@octokit/auth-token@4.0.0:
|
||||||
|
resolution: {integrity: sha512-tY/msAuJo6ARbK6SPIxZrPBms3xPbfwBrulZe0Wtr/DIY9lje2HeV1uoebShn6mx7SjCHif6EjMvoREj+gZ+SA==}
|
||||||
|
engines: {node: '>= 18'}
|
||||||
|
dev: true
|
||||||
|
|
||||||
|
/@octokit/core@5.0.1:
|
||||||
|
resolution: {integrity: sha512-lyeeeZyESFo+ffI801SaBKmCfsvarO+dgV8/0gD8u1d87clbEdWsP5yC+dSj3zLhb2eIf5SJrn6vDz9AheETHw==}
|
||||||
|
engines: {node: '>= 18'}
|
||||||
|
dependencies:
|
||||||
|
'@octokit/auth-token': 4.0.0
|
||||||
|
'@octokit/graphql': 7.0.2
|
||||||
|
'@octokit/request': 8.1.5
|
||||||
|
'@octokit/request-error': 5.0.1
|
||||||
|
'@octokit/types': 12.3.0
|
||||||
|
before-after-hook: 2.2.3
|
||||||
|
universal-user-agent: 6.0.1
|
||||||
|
dev: true
|
||||||
|
|
||||||
|
/@octokit/endpoint@9.0.2:
|
||||||
|
resolution: {integrity: sha512-qhKW8YLIi+Kmc92FQUFGr++DYtkx/1fBv+Thua6baqnjnOsgBYJDCvWZR1YcINuHGOEQt416WOfE+A/oG60NBQ==}
|
||||||
|
engines: {node: '>= 18'}
|
||||||
|
dependencies:
|
||||||
|
'@octokit/types': 12.3.0
|
||||||
|
is-plain-object: 5.0.0
|
||||||
|
universal-user-agent: 6.0.1
|
||||||
|
dev: true
|
||||||
|
|
||||||
|
/@octokit/graphql@7.0.2:
|
||||||
|
resolution: {integrity: sha512-OJ2iGMtj5Tg3s6RaXH22cJcxXRi7Y3EBqbHTBRq+PQAqfaS8f/236fUrWhfSn8P4jovyzqucxme7/vWSSZBX2Q==}
|
||||||
|
engines: {node: '>= 18'}
|
||||||
|
dependencies:
|
||||||
|
'@octokit/request': 8.1.5
|
||||||
|
'@octokit/types': 12.3.0
|
||||||
|
universal-user-agent: 6.0.1
|
||||||
|
dev: true
|
||||||
|
|
||||||
|
/@octokit/openapi-types@19.0.2:
|
||||||
|
resolution: {integrity: sha512-8li32fUDUeml/ACRp/njCWTsk5t17cfTM1jp9n08pBrqs5cDFJubtjsSnuz56r5Tad6jdEPJld7LxNp9dNcyjQ==}
|
||||||
|
dev: true
|
||||||
|
|
||||||
|
/@octokit/plugin-paginate-rest@9.1.4(@octokit/core@5.0.1):
|
||||||
|
resolution: {integrity: sha512-MvZx4WvfhBnt7PtH5XE7HORsO7bBk4er1FgRIUr1qJ89NR2I6bWjGyKsxk8z42FPQ34hFQm0Baanh4gzdZR4gQ==}
|
||||||
|
engines: {node: '>= 18'}
|
||||||
|
peerDependencies:
|
||||||
|
'@octokit/core': '>=5'
|
||||||
|
dependencies:
|
||||||
|
'@octokit/core': 5.0.1
|
||||||
|
'@octokit/types': 12.3.0
|
||||||
|
dev: true
|
||||||
|
|
||||||
|
/@octokit/plugin-rest-endpoint-methods@10.1.5(@octokit/core@5.0.1):
|
||||||
|
resolution: {integrity: sha512-LMEdsMV8TTMjMTqVoqMzV95XTbv0ZsWxCxQtjAunQOCdwoDH4BVF/Ke5JMSZEVCWGI2kzxnUNbFnK/MxwV7NjA==}
|
||||||
|
engines: {node: '>= 18'}
|
||||||
|
peerDependencies:
|
||||||
|
'@octokit/core': '>=5'
|
||||||
|
dependencies:
|
||||||
|
'@octokit/core': 5.0.1
|
||||||
|
'@octokit/types': 12.3.0
|
||||||
|
dev: true
|
||||||
|
|
||||||
|
/@octokit/request-error@5.0.1:
|
||||||
|
resolution: {integrity: sha512-X7pnyTMV7MgtGmiXBwmO6M5kIPrntOXdyKZLigNfQWSEQzVxR4a4vo49vJjTWX70mPndj8KhfT4Dx+2Ng3vnBQ==}
|
||||||
|
engines: {node: '>= 18'}
|
||||||
|
dependencies:
|
||||||
|
'@octokit/types': 12.3.0
|
||||||
|
deprecation: 2.3.1
|
||||||
|
once: 1.4.0
|
||||||
|
dev: true
|
||||||
|
|
||||||
|
/@octokit/request@8.1.5:
|
||||||
|
resolution: {integrity: sha512-zVKbNbX1xUluD9ZR4/tPs1yuYrK9xeh5fGZUXA6u04XGsTvomg0YO8/ZUC0FqAd49hAOEMFPAVUTh+2lBhOhLA==}
|
||||||
|
engines: {node: '>= 18'}
|
||||||
|
dependencies:
|
||||||
|
'@octokit/endpoint': 9.0.2
|
||||||
|
'@octokit/request-error': 5.0.1
|
||||||
|
'@octokit/types': 12.3.0
|
||||||
|
is-plain-object: 5.0.0
|
||||||
|
universal-user-agent: 6.0.1
|
||||||
|
dev: true
|
||||||
|
|
||||||
|
/@octokit/types@12.3.0:
|
||||||
|
resolution: {integrity: sha512-nJ8X2HRr234q3w/FcovDlA+ttUU4m1eJAourvfUUtwAWeqL8AsyRqfnLvVnYn3NFbUnsmzQCzLNdFerPwdmcDQ==}
|
||||||
|
dependencies:
|
||||||
|
'@octokit/openapi-types': 19.0.2
|
||||||
|
dev: true
|
||||||
|
|
||||||
/@pkgjs/parseargs@0.11.0:
|
/@pkgjs/parseargs@0.11.0:
|
||||||
resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==}
|
resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==}
|
||||||
engines: {node: '>=14'}
|
engines: {node: '>=14'}
|
||||||
@ -1567,6 +1677,10 @@ packages:
|
|||||||
resolution: {integrity: sha512-V/Hy/X9Vt7f3BbPJEi8BdVFMByHi+jNXrYkW3huaybV/kQ0KJg0Y6PkEMbn+zeT+i+SiKZ/HMqJGIIt4LZDqNQ==}
|
resolution: {integrity: sha512-V/Hy/X9Vt7f3BbPJEi8BdVFMByHi+jNXrYkW3huaybV/kQ0KJg0Y6PkEMbn+zeT+i+SiKZ/HMqJGIIt4LZDqNQ==}
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
|
/before-after-hook@2.2.3:
|
||||||
|
resolution: {integrity: sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==}
|
||||||
|
dev: true
|
||||||
|
|
||||||
/binary-extensions@2.2.0:
|
/binary-extensions@2.2.0:
|
||||||
resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==}
|
resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==}
|
||||||
engines: {node: '>=8'}
|
engines: {node: '>=8'}
|
||||||
@ -2005,6 +2119,10 @@ packages:
|
|||||||
engines: {node: '>= 0.8'}
|
engines: {node: '>= 0.8'}
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
|
/deprecation@2.3.1:
|
||||||
|
resolution: {integrity: sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==}
|
||||||
|
dev: true
|
||||||
|
|
||||||
/destroy@1.2.0:
|
/destroy@1.2.0:
|
||||||
resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==}
|
resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==}
|
||||||
engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16}
|
engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16}
|
||||||
@ -2924,6 +3042,11 @@ packages:
|
|||||||
engines: {node: '>=8'}
|
engines: {node: '>=8'}
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
|
/is-plain-object@5.0.0:
|
||||||
|
resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==}
|
||||||
|
engines: {node: '>=0.10.0'}
|
||||||
|
dev: true
|
||||||
|
|
||||||
/is-property@1.0.2:
|
/is-property@1.0.2:
|
||||||
resolution: {integrity: sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==}
|
resolution: {integrity: sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==}
|
||||||
dev: false
|
dev: false
|
||||||
@ -4408,6 +4531,11 @@ packages:
|
|||||||
safe-buffer: 5.2.1
|
safe-buffer: 5.2.1
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
|
/tunnel@0.0.6:
|
||||||
|
resolution: {integrity: sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==}
|
||||||
|
engines: {node: '>=0.6.11 <=0.7.0 || >=0.7.3'}
|
||||||
|
dev: true
|
||||||
|
|
||||||
/type-check@0.4.0:
|
/type-check@0.4.0:
|
||||||
resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==}
|
resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==}
|
||||||
engines: {node: '>= 0.8.0'}
|
engines: {node: '>= 0.8.0'}
|
||||||
@ -4452,6 +4580,13 @@ packages:
|
|||||||
/undici-types@5.26.5:
|
/undici-types@5.26.5:
|
||||||
resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==}
|
resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==}
|
||||||
|
|
||||||
|
/undici@5.27.2:
|
||||||
|
resolution: {integrity: sha512-iS857PdOEy/y3wlM3yRp+6SNQQ6xU0mmZcwRSriqk+et/cwWAtwmIGf6WkoDN2EK/AMdCO/dfXzIwi+rFMrjjQ==}
|
||||||
|
engines: {node: '>=14.0'}
|
||||||
|
dependencies:
|
||||||
|
'@fastify/busboy': 2.1.0
|
||||||
|
dev: true
|
||||||
|
|
||||||
/unique-filename@1.1.1:
|
/unique-filename@1.1.1:
|
||||||
resolution: {integrity: sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==}
|
resolution: {integrity: sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==}
|
||||||
requiresBuild: true
|
requiresBuild: true
|
||||||
@ -4468,6 +4603,10 @@ packages:
|
|||||||
dev: false
|
dev: false
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
|
/universal-user-agent@6.0.1:
|
||||||
|
resolution: {integrity: sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==}
|
||||||
|
dev: true
|
||||||
|
|
||||||
/universalify@2.0.1:
|
/universalify@2.0.1:
|
||||||
resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==}
|
resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==}
|
||||||
engines: {node: '>= 10.0.0'}
|
engines: {node: '>= 10.0.0'}
|
||||||
|
@ -8,5 +8,5 @@
|
|||||||
},
|
},
|
||||||
"include": [
|
"include": [
|
||||||
"backend/**/*"
|
"backend/**/*"
|
||||||
],
|
]
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user