Compare commits

...

49 commits

Author SHA1 Message Date
Jacky
af84b85b34
chore: prepare v2.0.0-rc.7
Some checks are pending
Build / build_app (push) Waiting to run
Build / build (386, linux) (push) Blocked by required conditions
Build / build (386, windows) (push) Blocked by required conditions
Build / build (amd64, darwin) (push) Blocked by required conditions
Build / build (amd64, linux) (push) Blocked by required conditions
Build / build (amd64, windows) (push) Blocked by required conditions
Build / build (arm, 5, linux) (push) Blocked by required conditions
Build / build (arm, 6, linux) (push) Blocked by required conditions
Build / build (arm, 7, linux) (push) Blocked by required conditions
Build / build (arm64, darwin) (push) Blocked by required conditions
Build / build (arm64, linux) (push) Blocked by required conditions
Build / build (arm64, windows) (push) Blocked by required conditions
Build / build (loong64, linux) (push) Blocked by required conditions
Build / build (mips, linux) (push) Blocked by required conditions
Build / build (mips64, linux) (push) Blocked by required conditions
Build / build (mips64le, linux) (push) Blocked by required conditions
Build / build (mipsle, linux) (push) Blocked by required conditions
Build / build (riscv64, linux) (push) Blocked by required conditions
Build / docker-build (push) Blocked by required conditions
CodeQL / Analyze (go) (push) Waiting to run
CodeQL / Analyze (javascript-typescript) (push) Waiting to run
Build Documents / build (push) Waiting to run
2025-05-11 21:24:42 +08:00
Jacky
37749fa563
fix(ngx-config-editor): incorrect behavior of adding directive #1038 2025-05-11 12:42:34 +00:00
Jacky
ad00ed4045
fix(cert): mutex status not broadcast
Some checks are pending
Build / build_app (push) Waiting to run
Build / build (386, linux) (push) Blocked by required conditions
Build / build (386, windows) (push) Blocked by required conditions
Build / build (amd64, darwin) (push) Blocked by required conditions
Build / build (amd64, linux) (push) Blocked by required conditions
Build / build (amd64, windows) (push) Blocked by required conditions
Build / build (arm, 5, linux) (push) Blocked by required conditions
Build / build (arm, 6, linux) (push) Blocked by required conditions
Build / build (arm, 7, linux) (push) Blocked by required conditions
Build / build (arm64, darwin) (push) Blocked by required conditions
Build / build (arm64, linux) (push) Blocked by required conditions
Build / build (arm64, windows) (push) Blocked by required conditions
Build / build (loong64, linux) (push) Blocked by required conditions
Build / build (mips, linux) (push) Blocked by required conditions
Build / build (mips64, linux) (push) Blocked by required conditions
Build / build (mips64le, linux) (push) Blocked by required conditions
Build / build (mipsle, linux) (push) Blocked by required conditions
Build / build (riscv64, linux) (push) Blocked by required conditions
Build / docker-build (push) Blocked by required conditions
CodeQL / Analyze (go) (push) Waiting to run
CodeQL / Analyze (javascript-typescript) (push) Waiting to run
2025-05-11 08:17:17 +08:00
Jacky
bae805abec
chore: update lego
Some checks are pending
Build / build_app (push) Waiting to run
Build / build (386, linux) (push) Blocked by required conditions
Build / build (386, windows) (push) Blocked by required conditions
Build / build (amd64, darwin) (push) Blocked by required conditions
Build / build (amd64, linux) (push) Blocked by required conditions
Build / build (amd64, windows) (push) Blocked by required conditions
Build / build (arm, 5, linux) (push) Blocked by required conditions
Build / build (arm, 6, linux) (push) Blocked by required conditions
Build / build (arm, 7, linux) (push) Blocked by required conditions
Build / build (arm64, darwin) (push) Blocked by required conditions
Build / build (arm64, linux) (push) Blocked by required conditions
Build / build (arm64, windows) (push) Blocked by required conditions
Build / build (loong64, linux) (push) Blocked by required conditions
Build / build (mips, linux) (push) Blocked by required conditions
Build / build (mips64, linux) (push) Blocked by required conditions
Build / build (mips64le, linux) (push) Blocked by required conditions
Build / build (mipsle, linux) (push) Blocked by required conditions
Build / build (riscv64, linux) (push) Blocked by required conditions
Build / docker-build (push) Blocked by required conditions
CodeQL / Analyze (go) (push) Waiting to run
CodeQL / Analyze (javascript-typescript) (push) Waiting to run
2025-05-10 23:16:12 +08:00
Jacky
d263340bdf
feat(nginx-dashboard): add modules table
Some checks are pending
Build / build_app (push) Waiting to run
Build / build (386, linux) (push) Blocked by required conditions
Build / build (386, windows) (push) Blocked by required conditions
Build / build (amd64, darwin) (push) Blocked by required conditions
Build / build (amd64, linux) (push) Blocked by required conditions
Build / build (amd64, windows) (push) Blocked by required conditions
Build / build (arm, 5, linux) (push) Blocked by required conditions
Build / build (arm, 6, linux) (push) Blocked by required conditions
Build / build (arm, 7, linux) (push) Blocked by required conditions
Build / build (arm64, darwin) (push) Blocked by required conditions
Build / build (arm64, linux) (push) Blocked by required conditions
Build / build (arm64, windows) (push) Blocked by required conditions
Build / build (loong64, linux) (push) Blocked by required conditions
Build / build (mips, linux) (push) Blocked by required conditions
Build / build (mips64, linux) (push) Blocked by required conditions
Build / build (mips64le, linux) (push) Blocked by required conditions
Build / build (mipsle, linux) (push) Blocked by required conditions
Build / build (riscv64, linux) (push) Blocked by required conditions
Build / docker-build (push) Blocked by required conditions
CodeQL / Analyze (go) (push) Waiting to run
CodeQL / Analyze (javascript-typescript) (push) Waiting to run
2025-05-09 21:33:44 +08:00
Jacky
c241122fde
fix(cert): maybe panic when add or modify #1034 2025-05-09 20:40:40 +08:00
Jacky
adf6f80061
feat(modules): retrieve nginx modules status 2025-05-09 18:35:00 +08:00
Jacky
5b0cbf98e1
feat: add env for ignore docker socket check #1024 2025-05-09 16:18:00 +08:00
Jacky
202ac03537
feat(self-check): check stream if stream loaded #1028
Some checks are pending
Build / build_app (push) Waiting to run
Build / build (386, linux) (push) Blocked by required conditions
Build / build (386, windows) (push) Blocked by required conditions
Build / build (amd64, darwin) (push) Blocked by required conditions
Build / build (amd64, linux) (push) Blocked by required conditions
Build / build (amd64, windows) (push) Blocked by required conditions
Build / build (arm, 5, linux) (push) Blocked by required conditions
Build / build (arm, 6, linux) (push) Blocked by required conditions
Build / build (arm, 7, linux) (push) Blocked by required conditions
Build / build (arm64, darwin) (push) Blocked by required conditions
Build / build (arm64, linux) (push) Blocked by required conditions
Build / build (arm64, windows) (push) Blocked by required conditions
Build / build (loong64, linux) (push) Blocked by required conditions
Build / build (mips, linux) (push) Blocked by required conditions
Build / build (mips64, linux) (push) Blocked by required conditions
Build / build (mips64le, linux) (push) Blocked by required conditions
Build / build (mipsle, linux) (push) Blocked by required conditions
Build / build (riscv64, linux) (push) Blocked by required conditions
Build / docker-build (push) Blocked by required conditions
CodeQL / Analyze (go) (push) Waiting to run
CodeQL / Analyze (javascript-typescript) (push) Waiting to run
2025-05-09 08:52:47 +08:00
Jacky
c59b81e4c7
feat(lark): supports custom domain #1027
Close #1027
2025-05-09 08:15:02 +08:00
Hintay
7f6399a718
chore: update selfupdate with io.TeeReader
Some checks failed
Build / build_app (push) Waiting to run
Build / build (386, linux) (push) Blocked by required conditions
Build / build (386, windows) (push) Blocked by required conditions
Build / build (amd64, darwin) (push) Blocked by required conditions
Build / build (amd64, linux) (push) Blocked by required conditions
Build / build (amd64, windows) (push) Blocked by required conditions
Build / build (arm, 5, linux) (push) Blocked by required conditions
Build / build (arm, 6, linux) (push) Blocked by required conditions
Build / build (arm, 7, linux) (push) Blocked by required conditions
Build / build (arm64, darwin) (push) Blocked by required conditions
Build / build (arm64, linux) (push) Blocked by required conditions
Build / build (arm64, windows) (push) Blocked by required conditions
Build / build (loong64, linux) (push) Blocked by required conditions
Build / build (mips, linux) (push) Blocked by required conditions
Build / build (mips64, linux) (push) Blocked by required conditions
Build / build (mips64le, linux) (push) Blocked by required conditions
Build / build (mipsle, linux) (push) Blocked by required conditions
Build / build (riscv64, linux) (push) Blocked by required conditions
Build / docker-build (push) Blocked by required conditions
CodeQL / Analyze (go) (push) Waiting to run
CodeQL / Analyze (javascript-typescript) (push) Waiting to run
Build Documents / build (push) Has been cancelled
2025-05-08 23:15:15 +09:00
Hintay
6b40d02b93
feat: add pidfile parameter to support OpenRC 2025-05-08 23:09:54 +09:00
Jacky
c92b31e903
Merge pull request #1026 from 0xJacky/renovate/all-minor-patch
Some checks failed
Build Documents / build (push) Has been cancelled
chore(deps): update all non-major dependencies
2025-05-08 21:19:08 +08:00
renovate[bot]
908cb7470b
chore(deps): update all non-major dependencies 2025-05-08 11:42:35 +00:00
Hintay
f7ef33e8b3
chore: fix build on macOS (golang/go#73617) 2025-05-08 20:40:07 +09:00
Jacky
291c7f09f8
refactor: lego without large sdk #988 2025-05-08 18:38:10 +08:00
Jacky
e500ce98e8
chore: update docs
Some checks are pending
Build / build_app (push) Waiting to run
Build / build (386, linux) (push) Blocked by required conditions
Build / build (386, windows) (push) Blocked by required conditions
Build / build (amd64, darwin) (push) Blocked by required conditions
Build / build (amd64, linux) (push) Blocked by required conditions
Build / build (amd64, windows) (push) Blocked by required conditions
Build / build (arm, 5, linux) (push) Blocked by required conditions
Build / build (arm, 6, linux) (push) Blocked by required conditions
Build / build (arm, 7, linux) (push) Blocked by required conditions
Build / build (arm64, darwin) (push) Blocked by required conditions
Build / build (arm64, linux) (push) Blocked by required conditions
Build / build (arm64, windows) (push) Blocked by required conditions
Build / build (loong64, linux) (push) Blocked by required conditions
Build / build (mips, linux) (push) Blocked by required conditions
Build / build (mips64, linux) (push) Blocked by required conditions
Build / build (mips64le, linux) (push) Blocked by required conditions
Build / build (mipsle, linux) (push) Blocked by required conditions
Build / build (riscv64, linux) (push) Blocked by required conditions
Build / docker-build (push) Blocked by required conditions
CodeQL / Analyze (go) (push) Waiting to run
CodeQL / Analyze (javascript-typescript) (push) Waiting to run
Build Documents / build (push) Waiting to run
2025-05-08 11:15:40 +08:00
Jacky
fc3b83482b
chore: update deps 2025-05-08 10:31:31 +08:00
Jacky
635b2c272b
fix: casdoor login issue #1022
Some checks failed
Build / build_app (push) Has been cancelled
Build / build (386, linux) (push) Has been cancelled
Build / build (386, windows) (push) Has been cancelled
Build / build (amd64, darwin) (push) Has been cancelled
Build / build (amd64, linux) (push) Has been cancelled
Build / build (amd64, windows) (push) Has been cancelled
Build / build (arm, 5, linux) (push) Has been cancelled
Build / build (arm, 6, linux) (push) Has been cancelled
Build / build (arm, 7, linux) (push) Has been cancelled
Build / build (arm64, darwin) (push) Has been cancelled
Build / build (arm64, linux) (push) Has been cancelled
Build / build (arm64, windows) (push) Has been cancelled
Build / build (loong64, linux) (push) Has been cancelled
Build / build (mips, linux) (push) Has been cancelled
Build / build (mips64, linux) (push) Has been cancelled
Build / build (mips64le, linux) (push) Has been cancelled
Build / build (mipsle, linux) (push) Has been cancelled
Build / build (riscv64, linux) (push) Has been cancelled
Build / docker-build (push) Has been cancelled
2025-05-08 10:10:26 +08:00
Hintay
d7baa4d0f6
feat(install-script): auto install OpenRC on Alpine Linux if needed
Some checks are pending
CodeQL / Analyze (go) (push) Waiting to run
CodeQL / Analyze (javascript-typescript) (push) Waiting to run
2025-05-08 05:07:46 +09:00
Hintay
fd501a6d0c
refactor(install-script): make compatible with ash 2025-05-08 04:42:20 +09:00
Jacky
482e66b3bb
chore: update deps
Some checks are pending
Build / build_app (push) Waiting to run
Build / build (386, linux) (push) Blocked by required conditions
Build / build (386, windows) (push) Blocked by required conditions
Build / build (amd64, darwin) (push) Blocked by required conditions
Build / build (amd64, linux) (push) Blocked by required conditions
Build / build (amd64, windows) (push) Blocked by required conditions
Build / build (arm, 5, linux) (push) Blocked by required conditions
Build / build (arm, 6, linux) (push) Blocked by required conditions
Build / build (arm, 7, linux) (push) Blocked by required conditions
Build / build (arm64, darwin) (push) Blocked by required conditions
Build / build (arm64, linux) (push) Blocked by required conditions
Build / build (arm64, windows) (push) Blocked by required conditions
Build / build (loong64, linux) (push) Blocked by required conditions
Build / build (mips, linux) (push) Blocked by required conditions
Build / build (mips64, linux) (push) Blocked by required conditions
Build / build (mips64le, linux) (push) Blocked by required conditions
Build / build (mipsle, linux) (push) Blocked by required conditions
Build / build (riscv64, linux) (push) Blocked by required conditions
Build / docker-build (push) Blocked by required conditions
CodeQL / Analyze (go) (push) Waiting to run
CodeQL / Analyze (javascript-typescript) (push) Waiting to run
Build Documents / build (push) Waiting to run
2025-05-07 20:52:15 +08:00
Jacky
0f09a0b03c
fix(external-notify): implement columns for external notification settings #1019
Some checks failed
Build / build_app (push) Waiting to run
Build / build (386, linux) (push) Blocked by required conditions
Build / build (386, windows) (push) Blocked by required conditions
Build / build (amd64, darwin) (push) Blocked by required conditions
Build / build (amd64, linux) (push) Blocked by required conditions
Build / build (amd64, windows) (push) Blocked by required conditions
Build / build (arm, 5, linux) (push) Blocked by required conditions
Build / build (arm, 6, linux) (push) Blocked by required conditions
Build / build (arm, 7, linux) (push) Blocked by required conditions
Build / build (arm64, darwin) (push) Blocked by required conditions
Build / build (arm64, linux) (push) Blocked by required conditions
Build / build (arm64, windows) (push) Blocked by required conditions
Build / build (loong64, linux) (push) Blocked by required conditions
Build / build (mips, linux) (push) Blocked by required conditions
Build / build (mips64, linux) (push) Blocked by required conditions
Build / build (mips64le, linux) (push) Blocked by required conditions
Build / build (mipsle, linux) (push) Blocked by required conditions
Build / build (riscv64, linux) (push) Blocked by required conditions
Build / docker-build (push) Blocked by required conditions
Build Documents / build (push) Has been cancelled
2025-05-07 10:00:01 +00:00
Jacky
c5274a7a64
feat(external-notify): add gotify #1018 2025-05-07 17:06:05 +08:00
Jacky
7482be9c7a
fix: add external notify error #1018 2025-05-07 08:20:14 +00:00
Hintay
71bc9c1eb4
Merge pull request #1016 from GitHub30/patch-1
Add README file in Japanese
2025-05-07 17:06:17 +09:00
Jacky
ed820695da
chore: update docs 2025-05-07 15:55:09 +08:00
Jacky
fbc800ff22
fix: site and stream unique ke y create issue #1017 2025-05-07 07:36:18 +00:00
GitHub30
b23a8fc4ad
Add README in Japanese 2025-05-07 14:54:16 +09:00
GitHub30
3bbe47e50d
Add README in Japanese 2025-05-07 13:09:55 +09:00
Jacky
7c791f3784
Merge pull request #1015 from 0xJacky/dev
Some checks are pending
Build / build_app (push) Waiting to run
Build / build (386, linux) (push) Blocked by required conditions
Build / build (386, windows) (push) Blocked by required conditions
Build / build (amd64, darwin) (push) Blocked by required conditions
Build / build (amd64, linux) (push) Blocked by required conditions
Build / build (amd64, windows) (push) Blocked by required conditions
Build / build (arm, 5, linux) (push) Blocked by required conditions
Build / build (arm, 6, linux) (push) Blocked by required conditions
Build / build (arm, 7, linux) (push) Blocked by required conditions
Build / build (arm64, darwin) (push) Blocked by required conditions
Build / build (arm64, linux) (push) Blocked by required conditions
Build / build (arm64, windows) (push) Blocked by required conditions
Build / build (loong64, linux) (push) Blocked by required conditions
Build / build (mips, linux) (push) Blocked by required conditions
Build / build (mips64, linux) (push) Blocked by required conditions
Build / build (mips64le, linux) (push) Blocked by required conditions
Build / build (mipsle, linux) (push) Blocked by required conditions
Build / build (riscv64, linux) (push) Blocked by required conditions
Build / docker-build (push) Blocked by required conditions
CodeQL / Analyze (go) (push) Waiting to run
CodeQL / Analyze (javascript-typescript) (push) Waiting to run
Build Documents / build (push) Waiting to run
chore: update install.sh
2025-05-07 11:57:58 +08:00
Jacky
a2e1c57eaf
chore: update install.sh 2025-05-07 11:57:15 +08:00
Jacky
1ba1da0d5d
chore: use nginx.GetConfEntryPath() #1013 2025-05-07 11:54:22 +08:00
Jacky
1570771bf6
Merge pull request #1014 from 0xJacky/dev
chore: update install.sh
2025-05-07 11:52:32 +08:00
Jacky
a75a5b7429
chore: update install.sh 2025-05-07 03:51:58 +00:00
Jacky
7718718c89
Merge pull request #1012 from 0xJacky/dev
chore: update install.sh
2025-05-07 11:41:26 +08:00
Jacky
ed4cd13dda
chore: update install.sh 2025-05-07 03:38:33 +00:00
Jacky
3b674fc79f
Merge pull request #1011 from 0xJacky/dev
fix(install): update Nginx UI service status check from "started" to "running"
2025-05-07 11:28:34 +08:00
Jacky
9d39b7607d
fix(install): update Nginx UI service status check from "started" to "running" 2025-05-07 03:27:07 +00:00
GitHub30
8246e6ee77
Add README in Japanese 2025-05-07 12:25:29 +09:00
Jacky
dfc131d968
Merge pull request #1010 from 0xJacky/dev
chore: update docs
2025-05-07 11:21:54 +08:00
GitHub30
ea0dbfe287
Add README in Japanese 2025-05-07 12:21:40 +09:00
Jacky
c797a1be54
chore: update docs #1009 2025-05-07 11:18:42 +08:00
Jacky
61d9bb49e7
Merge pull request #1008 from 0xJacky/dev
feat: add support for init.d and OpenRC service management
2025-05-07 11:01:59 +08:00
Jacky
5fdd85a302
feat: add support for init.d and OpenRC service management #335, #988 2025-05-07 10:57:17 +08:00
Jacky
db29f2e9c5
chore: update translations 2025-05-07 09:51:18 +08:00
Jacky
d772dcfb95
chore: update deps 2025-05-07 09:42:08 +08:00
Jacky
13732ffb2c
chore: update docs 2025-05-07 01:13:19 +00:00
Jacky
39daf0be53
fix(upgrader): remove unused settings import and simplify GitHub proxy checks 2025-05-07 01:02:54 +00:00
80 changed files with 7384 additions and 4127 deletions

View file

@ -141,7 +141,7 @@ jobs:
- name: Set up Go
uses: actions/setup-go@v5
with:
go-version: ^1.24.2
go-version: ^1.24.3
cache: false
- name: Setup environment

390
README-ja_JP.md Normal file
View file

@ -0,0 +1,390 @@
<div align="center">
<img src="resources/logo.png" alt="Nginx UI Logo">
</div>
# Nginx UI
もう一つのNginx Web UI [0xJacky](https://jackyu.cn/), [Hintay](https://blog.kugeek.com/), [Akino](https://github.com/akinoccc)によって開発されました。
[![DeepWiki](https://img.shields.io/badge/DeepWiki-0xJacky%2Fnginx--ui-blue.svg?logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACwAAAAyCAYAAAAnWDnqAAAAAXNSR0IArs4c6QAAA05JREFUaEPtmUtyEzEQhtWTQyQLHNak2AB7ZnyXZMEjXMGeK/AIi+QuHrMnbChYY7MIh8g01fJoopFb0uhhEqqcbWTp06/uv1saEDv4O3n3dV60RfP947Mm9/SQc0ICFQgzfc4CYZoTPAswgSJCCUJUnAAoRHOAUOcATwbmVLWdGoH//PB8mnKqScAhsD0kYP3j/Yt5LPQe2KvcXmGvRHcDnpxfL2zOYJ1mFwrryWTz0advv1Ut4CJgf5uhDuDj5eUcAUoahrdY/56ebRWeraTjMt/00Sh3UDtjgHtQNHwcRGOC98BJEAEymycmYcWwOprTgcB6VZ5JK5TAJ+fXGLBm3FDAmn6oPPjR4rKCAoJCal2eAiQp2x0vxTPB3ALO2CRkwmDy5WohzBDwSEFKRwPbknEggCPB/imwrycgxX2NzoMCHhPkDwqYMr9tRcP5qNrMZHkVnOjRMWwLCcr8ohBVb1OMjxLwGCvjTikrsBOiA6fNyCrm8V1rP93iVPpwaE+gO0SsWmPiXB+jikdf6SizrT5qKasx5j8ABbHpFTx+vFXp9EnYQmLx02h1QTTrl6eDqxLnGjporxl3NL3agEvXdT0WmEost648sQOYAeJS9Q7bfUVoMGnjo4AZdUMQku50McDcMWcBPvr0SzbTAFDfvJqwLzgxwATnCgnp4wDl6Aa+Ax283gghmj+vj7feE2KBBRMW3FzOpLOADl0Isb5587h/U4gGvkt5v60Z1VLG8BhYjbzRwyQZemwAd6cCR5/XFWLYZRIMpX39AR0tjaGGiGzLVyhse5C9RKC6ai42ppWPKiBagOvaYk8lO7DajerabOZP46Lby5wKjw1HCRx7p9sVMOWGzb/vA1hwiWc6jm3MvQDTogQkiqIhJV0nBQBTU+3okKCFDy9WwferkHjtxib7t3xIUQtHxnIwtx4mpg26/HfwVNVDb4oI9RHmx5WGelRVlrtiw43zboCLaxv46AZeB3IlTkwouebTr1y2NjSpHz68WNFjHvupy3q8TFn3Hos2IAk4Ju5dCo8B3wP7VPr/FGaKiG+T+v+TQqIrOqMTL1VdWV1DdmcbO8KXBz6esmYWYKPwDL5b5FA1a0hwapHiom0r/cKaoqr+27/XcrS5UwSMbQAAAABJRU5ErkJggg==)](https://deepwiki.com/0xJacky/nginx-ui)
[![Build and Publish](https://github.com/0xJacky/nginx-ui/actions/workflows/build.yml/badge.svg)](https://github.com/0xJacky/nginx-ui/actions/workflows/build.yml)
[![GitHub license](https://img.shields.io/github/license/0xJacky/nginx-ui?label=License&logo=github)](https://github.com/0xJacky/nginx-ui "Click to view the repo on Github")
[![Release Version](https://img.shields.io/github/release/0xJacky/nginx-ui?include_prereleases&label=Release&logo=github)](https://github.com/0xJacky/nginx-ui/releases/latest "Click to view the repo on Github")
[![GitHub Star](https://img.shields.io/github/stars/0xJacky/nginx-ui?label=Stars&logo=github)](https://github.com/0xJacky/nginx-ui "Click to view the repo on Github")
[![GitHub Fork](https://img.shields.io/github/forks/0xJacky/nginx-ui?label=Forks&logo=github)](https://github.com/0xJacky/nginx-ui "Click to view the repo on Github")
[![Repo Size](https://img.shields.io/github/repo-size/0xJacky/nginx-ui?label=Size&logo=github)](https://github.com/0xJacky/nginx-ui "Click to view the repo on Github")
[![GitHub Fork](https://img.shields.io/github/issues-closed-raw/0xJacky/nginx-ui?label=Closed%20Issue&logo=github)](https://github.com/0xJacky/nginx-ui/issue "Click to view the repo on Github")
[![Docker Stars](https://img.shields.io/docker/stars/uozi/nginx-ui?label=Stars&logo=docker)](https://hub.docker.com/r/uozi/nginx-ui "Click to view the image on Docker Hub")
[![Docker Pulls](https://img.shields.io/docker/pulls/uozi/nginx-ui?label=Pulls&logo=docker)](https://hub.docker.com/r/uozi/nginx-ui "Click to view the image on Docker Hub")
[![Image Size](https://img.shields.io/docker/image-size/uozi/nginx-ui/latest?label=Image%20Size&logo=docker)](https://hub.docker.com/r/uozi/nginx-ui "Click to view the image on Docker Hub")
[![Translated Status](https://weblate.nginxui.com/widget/nginx-ui/frontend/svg-badge.svg)](https://weblate.nginxui.com/engage/nginx-ui/)
[![FeaturedHelloGitHub](https://abroad.hellogithub.com/v1/widgets/recommend.svg?rid=86f3a8f779934748a34fe6f1b5cd442f&claim_uid=MOFqadzAShCBeQj&theme=small)](https://hellogithub.com/repository/86f3a8f779934748a34fe6f1b5cd442f)
## ドキュメント
公式ドキュメントは [nginxui.com](https://nginxui.com) を参照してください。
## スター推移
[![Stargazers over time](https://starchart.cc/0xJacky/nginx-ui.svg)](https://starchart.cc/0xJacky/nginx-ui)
English | [Español](README-es.md) | [简体中文](README-zh_CN.md) | [繁體中文](README-zh_TW.md) | [Tiếng Việt](README-vi_VN.md) | [日本語](README-ja_JP.md)
<details>
<summary>目次</summary>
<ol>
<li>
<a href="#about-the-project">プロジェクトについて</a>
<ul>
<li><a href="#demo">デモ</a></li>
<li><a href="#features">機能</a></li>
<li><a href="#internationalization">多言語化</a></li>
<li><a href="#built-with">主要技術</a></li>
</ul>
</li>
<li>
<a href="#getting-started">はじめに</a>
<ul>
<li><a href="#before-use">使用前の注意</a></li>
<li><a href="#installation">インストール</a></li>
<li>
<a href="#usage">使い方</a>
<ul>
<li><a href="#from-executable">実行ファイルから</a></li>
<li><a href="#with-systemd">Systemdで</a></li>
<li><a href="#with-docker">Dockerで</a></li>
</ul>
</li>
</ul>
</li>
<li>
<a href="#manual-build">手動ビルド</a>
<ul>
<li><a href="#prerequisites">前提条件</a></li>
<li><a href="#build-app">フロントエンドのビルド</a></li>
<li><a href="#build-backend">バックエンドのビルド</a></li>
</ul>
</li>
<li>
<a href="#script-for-linux">Linux用スクリプト</a>
<ul>
<li><a href="#basic-usage">基本的な使い方</a></li>
<li><a href="#more-usage">その他の使い方</a></li>
</ul>
</li>
<li><a href="#example-of-nginx-reverse-proxy-configuration">Nginx リバースプロキシ設定例</a></li>
<li><a href="#contributing">貢献方法</a></li>
<li><a href="#license">ライセンス</a></li>
</ol>
</details>
## プロジェクトについて
![ダッシュボード](resources/screenshots/dashboard_en.png)
### デモ
URL[https://demo.nginxui.com](https://demo.nginxui.com)
- ユーザー名admin
- パスワードadmin
### 機能
- サーバーの CPU 使用率、メモリ使用率、ロードアベレージ、ディスク使用率 とかの指標をオンラインで見られるんやで。
- 設定変更したら自動でバックアップ作ってくれて、バージョン比較&復元もできるんやわ。
- クラスタ管理で複数ノードへのミラーリング操作もサポートしてるから、大規模環境でも楽勝や。
- 暗号化した Nginx / Nginx UI の設定をエクスポートして、新環境へのデプロイ&復旧がサクッとできるで。
- オンライン ChatGPT アシスタントDeepseek-R1 のチェインオブソート表示付き)で設定の最適化や理解をサポートしてくれるんや。
- MCPModel Context Protocolで AI エージェントが Nginx UI と連携できる特別インターフェースもあるから、自動化もバッチリや。
- ワンクリックで Lets Encrypt 証明書の発行&自動更新もしてくれるし。
- 自社開発の **NgxConfigEditor**(ブロックエディタ)か、**Ace Code Editor**LLM コード補完&シンタックスハイライト付き)で nginx 設定を直感的に編集でけるんや。
- Nginx ログのオンライン閲覧機能もあるで。
- Go と Vue で書かれとって、配布物は単一バイナリだからセットアップも簡単や。
- 保存時に設定テスト→nginx 再読み込みまで自動でやってくれるで。
- Web ターミナル
- ダークモード対応
- レスポンシブデザイン
### 多言語化
公式でサポートしてんのは:
- 英語
- 簡体字中国語
- 繁體字中国語
非ネイティブの英語話者やから完璧ちゃうかもしれへんけど、気づいたことあったらフィードバックしてや!
コミュニティのおかげで他の言語もいろいろ揃っとるで。翻訳に参加したい人は [Weblate](https://weblate.nginxui.com) 見てみてな。
### 主要技術
- [Go言語](https://go.dev)
- [Gin Web Framework](https://gin-gonic.com)
- [GORM](http://gorm.io)
- [Vue 3](https://v3.vuejs.org)
- [Vite](https://vitejs.dev)
- [TypeScript](https://www.typescriptlang.org/)
- [Ant Design Vue](https://antdv.com)
- [vue3-gettext](https://github.com/jshmrtn/vue3-gettext)
- [vue3-ace-editor](https://github.com/CarterLi/vue3-ace-editor)
- [Gonginx](https://github.com/tufanbarisyildirim/gonginx)
- [lego](https://github.com/go-acme/lego)
## はじめに
### 使用前の注意
Nginx UIはDebian系Webサーバ設定ファイルの標準に準拠します。
作成されたサイト設定ファイルは、自動検出されたNginx設定フォルダ内の`sites-available`に配置されます。有効化されたサイトは`sites-enabled`にシンボリックリンクが作成されます。
非Debian系Ubuntu以外の場合は、以下のように`nginx.conf`をDebianスタイルに変更してください。
```nginx
http {
# ...
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}
```
詳細: [debian/conf/nginx.conf](https://salsa.debian.org/nginx-team/nginx/-/blob/master/debian/conf/nginx.conf#L59-L60)
### インストール
Nginx UIは以下のプラットフォームで利用可能です:
- macOS 11 Big Sur and later (amd64 / arm64)
- Windows 10 and later (amd64 / arm64)
- Linux 2.6.23 and later (x86 / amd64 / arm64 / armv5 / armv6 / armv7 / mips32 / mips64 / riscv64 / loongarch64)
- Including but not limited to Debian 7 / 8, Ubuntu 12.04 / 14.04 and later, CentOS 6 / 7, Arch Linux
- FreeBSD
- OpenBSD
- Dragonfly BSD
- Openwrt
最新リリースは[リリースページ](https://github.com/0xJacky/nginx-ui/releases/latest)からダウンロード、または[Linux用インストールスクリプト](#script-for-linux)を利用
### 使い方
初回起動後、ブラウザで`http://<your_server_ip>:<listen_port>`にアクセスし、初期設定を完了してください。
#### 実行ファイルから
**ターミナルでNginx UIを動かす**
```shell
nginx-ui -config app.ini
```
`Control+C`で終了します。
**バックグラウンドでNginx UIを動かす**
```shell
nohup ./nginx-ui -config app.ini &
```
以下のコマンドでNginx UIを停止する。
```shell
kill -9 $(ps -aux | grep nginx-ui | grep -v grep | awk '{print $2}')
```
#### Systemdで
[Linuxインストールスクリプト](#script-for-linux)を使うと、`nginx-ui`というsystemdサービスが作成されます。以下コマンドで操作可能:
**起動**
```shell
systemctl start nginx-ui
```
**停止**
```shell
systemctl stop nginx-ui
```
**再起動**
```shell
systemctl restart nginx-ui
```
#### Dockerで
公式イメージ [uozi/nginx-ui:latest](https://hub.docker.com/r/uozi/nginx-ui) はベースに公式 nginx イメージを利用しています。ホストの Nginx と置き換える形で利用可能です。
##### 注意
1. 初回利用時は `/etc/nginx` にマッピングするボリュームが空であることを確認してください。
2. 静的ファイルを配信する場合は、適切なディレクトリをマッピングしてください。
<details>
<summary><b>Dockerでデプロイ</b></summary>
1. [Dockerをインストール](https://docs.docker.com/install/)
2. 以下のように実行:
```bash
docker run -dit \
--name=nginx-ui \
--restart=always \
-e TZ=Asia/Shanghai \
-v /mnt/user/appdata/nginx:/etc/nginx \
-v /mnt/user/appdata/nginx-ui:/etc/nginx-ui \
-v /var/run/docker.sock:/var/run/docker.sock \
-p 8080:80 -p 8443:443 \
uozi/nginx-ui:latest
```
3. パネルには `[http://<your-ip>:8080/install](http://<your_server_ip>:8080/install)` でアクセスします。
</details>
<details>
<summary><b>Docker-Composeでデプロイ</b></summary>
1. [Docker-Composeをインストール](https://docs.docker.com/compose/install/)
2. 以下内容の`docker-compose.yml`を作成:
```yml
services:
nginx-ui:
stdin_open: true
tty: true
container_name: nginx-ui
restart: always
environment:
- TZ=Asia/Shanghai
volumes:
- '/mnt/user/appdata/nginx:/etc/nginx'
- '/mnt/user/appdata/nginx-ui:/etc/nginx-ui'
- '/var/www:/var/www'
- '/var/run/docker.sock:/var/run/docker.sock'
ports:
- 8080:80
- 8443:443
image: 'uozi/nginx-ui:latest'
```
3. コンテナの起動:
```bash
docker compose up -d
```
4. パネルには `[http://<your-ip>:8080/install](http://<your_server_ip>:8080/install)` でアクセスします。
</details>
## 手動ビルド
公式ビルドがないプラットフォーム向けに、以下の手順でビルドできます。
### 前提条件
- Make
- Golang 1.23+
- node.js 21+
```shell
npx browserslist@latest --update-db
```
### フロントエンドのビルド
`app` ディレクトリで以下を実行:
```shell
pnpm install
pnpm build
```
### バックエンドのビルド
フロントエンドビルド後、プロジェクトルートで:
```shell
go generate
go build -tags=jsoniter -ldflags "$LD_FLAGS -X 'github.com/0xJacky/Nginx-UI/settings.buildTime=$(date +%s)'" -o nginx-ui -v main.go
```
## Linux用スクリプト
### 基本的な使い方
**インストール & アップグレード**
```shell
bash -c "$(curl -L https://raw.githubusercontent.com/0xJacky/nginx-ui/main/install.sh)" @ install
```
デフォルトのリスニングポートは `9000`、HTTP チャレンジポートは `9180` です。
競合する場合は `/usr/local/etc/nginx-ui/app.ini` を編集し、`systemctl restart nginx-ui` を実行してください。
**設定・DB を残してアンインストール**
```shell
bash -c "$(curl -L https://raw.githubusercontent.com/0xJacky/nginx-ui/main/install.sh)" @ remove
```
### その他の使い方
````shell
bash -c "$(curl -L https://raw.githubusercontent.com/0xJacky/nginx-ui/main/install.sh)" @ help
````
## Nginx リバースプロキシ設定例
```nginx
server {
listen 80;
listen [::]:80;
server_name <your_server_name>;
rewrite ^(.*)$ https://$host$1 permanent;
}
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
server {
listen 443 ssl;
listen [::]:443 ssl;
http2 on;
server_name <your_server_name>;
ssl_certificate /path/to/ssl_cert;
ssl_certificate_key /path/to/ssl_cert_key;
location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_pass http://127.0.0.1:9000/;
}
}
```
## 貢献方法
オープンソースコミュニティへの貢献は**大歓迎**です。
改善提案がある場合はリポジトリをフォークし、プルリクエストを作成してください。
Issueに「enhancement」タグをつけて提案することもできます。
スターもよろしくお願いします!
1. リポジトリをフォーク
2. フィーチャーブランチ作成 (`git checkout -b feature/AmazingFeature`)
3. 変更をコミット (`git commit -m 'Add some AmazingFeature'`)
4. ブランチをプッシュ (`git push origin feature/AmazingFeature`)
5. プルリクエストを作成
## ライセンス
本プロジェクトは GNU Affero General Public License v3.0 に基づき配布されています。ライセンスの詳細は [LICENSE](LICENSE) ファイルをご覧ください。

View file

@ -30,7 +30,7 @@ To check out docs, visit [nginxui.com](https://nginxui.com).
[![Stargazers over time](https://starchart.cc/0xJacky/nginx-ui.svg)](https://starchart.cc/0xJacky/nginx-ui)
English | [Español](README-es.md) | [简体中文](README-zh_CN.md) | [繁體中文](README-zh_TW.md) | [Tiếng Việt](README-vi_VN.md)
English | [Español](README-es.md) | [简体中文](README-zh_CN.md) | [繁體中文](README-zh_TW.md) | [Tiếng Việt](README-vi_VN.md) | [日本語](README-ja_JP.md)
<details>
<summary>Table of Contents</summary>

View file

@ -103,7 +103,7 @@ func AddCert(c *gin.Context) {
"revoke_old": "omitempty",
}).
BeforeExecuteHook(func(ctx *cosy.Ctx[model.Cert]) {
sslCertificate := ctx.Payload["ssl_certificate"].(string)
sslCertificate := cast.ToString(ctx.Payload["ssl_certificate"])
// Detect and set certificate type
if sslCertificate != "" {
keyType, err := cert.GetKeyType(sslCertificate)
@ -125,18 +125,22 @@ func AddCert(c *gin.Context) {
}
}).
ExecutedHook(func(ctx *cosy.Ctx[model.Cert]) {
content := &cert.Content{
SSLCertificatePath: ctx.Model.SSLCertificatePath,
SSLCertificateKeyPath: ctx.Model.SSLCertificateKeyPath,
SSLCertificate: ctx.Payload["ssl_certificate"].(string),
SSLCertificateKey: ctx.Payload["ssl_certificate_key"].(string),
sslCertificate := cast.ToString(ctx.Payload["ssl_certificate"])
sslCertificateKey := cast.ToString(ctx.Payload["ssl_certificate_key"])
if sslCertificate != "" && sslCertificateKey != "" {
content := &cert.Content{
SSLCertificatePath: ctx.Model.SSLCertificatePath,
SSLCertificateKeyPath: ctx.Model.SSLCertificateKeyPath,
SSLCertificate: sslCertificate,
SSLCertificateKey: sslCertificateKey,
}
err := content.WriteFile()
if err != nil {
ctx.AbortWithError(err)
return
}
}
err := content.WriteFile()
if err != nil {
ctx.AbortWithError(err)
return
}
err = cert.SyncToRemoteServer(&ctx.Model)
err := cert.SyncToRemoteServer(&ctx.Model)
if err != nil {
notification.Error("Sync Certificate Error", err.Error(), nil)
return
@ -165,7 +169,7 @@ func ModifyCert(c *gin.Context) {
"revoke_old": "omitempty",
}).
BeforeExecuteHook(func(ctx *cosy.Ctx[model.Cert]) {
sslCertificate := ctx.Payload["ssl_certificate"].(string)
sslCertificate := cast.ToString(ctx.Payload["ssl_certificate"])
// Detect and set certificate type
if sslCertificate != "" {
keyType, err := cert.GetKeyType(sslCertificate)
@ -187,11 +191,14 @@ func ModifyCert(c *gin.Context) {
}
}).
ExecutedHook(func(ctx *cosy.Ctx[model.Cert]) {
sslCertificate := cast.ToString(ctx.Payload["ssl_certificate"])
sslCertificateKey := cast.ToString(ctx.Payload["ssl_certificate_key"])
content := &cert.Content{
SSLCertificatePath: ctx.Model.SSLCertificatePath,
SSLCertificateKeyPath: ctx.Model.SSLCertificateKeyPath,
SSLCertificate: ctx.Payload["ssl_certificate"].(string),
SSLCertificateKey: ctx.Payload["ssl_certificate_key"].(string),
SSLCertificate: sslCertificate,
SSLCertificateKey: sslCertificateKey,
}
err := content.WriteFile()
if err != nil {
@ -203,7 +210,6 @@ func ModifyCert(c *gin.Context) {
notification.Error("Sync Certificate Error", err.Error(), nil)
return
}
}).
SetNextHandler(GetCert).
Modify()

17
api/nginx/modules.go Normal file
View file

@ -0,0 +1,17 @@
package nginx
import (
"net/http"
"github.com/0xJacky/Nginx-UI/internal/nginx"
"github.com/gin-gonic/gin"
)
func GetModules(c *gin.Context) {
modules := nginx.GetModules()
modulesList := make([]*nginx.Module, 0, modules.Len())
for _, module := range modules.AllFromFront() {
modulesList = append(modulesList, module)
}
c.JSON(http.StatusOK, modulesList)
}

View file

@ -27,4 +27,6 @@ func InitRouter(r *gin.RouterGroup) {
// Performance optimization endpoints
r.GET("nginx/performance", GetPerformanceSettings)
r.POST("nginx/performance", UpdatePerformanceSettings)
r.GET("nginx/modules", GetModules)
}

View file

@ -8,10 +8,10 @@ import (
"strings"
"time"
"code.pfad.fr/risefront"
"github.com/0xJacky/Nginx-UI/internal/backup"
"github.com/0xJacky/Nginx-UI/internal/nginx"
"github.com/gin-gonic/gin"
"github.com/jpillora/overseer"
"github.com/uozi-tech/cosy"
)
@ -123,7 +123,7 @@ func RestoreBackup(c *gin.Context) {
go func() {
time.Sleep(2 * time.Second)
// gracefully restart
overseer.Restart()
risefront.Restart()
}()
}

View file

@ -28,15 +28,16 @@ func InitPrivateRouter(r *gin.RouterGroup) {
}
func InitSelfCheckRouter(r *gin.RouterGroup) {
g := r.Group("self_check")
g.GET("", authIfInstalled, SelfCheck)
g.POST("/:name/fix", authIfInstalled, SelfCheckFix)
g.GET("websocket", authIfInstalled, CheckWebSocket)
g := r.Group("self_check", authIfInstalled)
g.GET("", middleware.Proxy(), SelfCheck)
g.POST("/:name/fix", middleware.Proxy(), SelfCheckFix)
g.GET("websocket", middleware.ProxyWs(), CheckWebSocket)
}
func InitBackupRestoreRouter(r *gin.RouterGroup) {
r.POST("system/backup/restore",
authIfInstalled,
middleware.Proxy(),
middleware.EncryptedForm(),
RestoreBackup)
}

View file

@ -1,7 +1,7 @@
{
"name": "nginx-ui-app-next",
"type": "module",
"version": "2.0.0-rc.6",
"version": "2.0.0-rc.7",
"packageManager": "pnpm@10.10.0+sha512.d615db246fe70f25dcfea6d8d73dee782ce23e2245e3c4f6f888249fb568149318637dca73c2c5c8ef2a4ca0d5657fb9567188bfab47f566d1ee6ce987815c39",
"scripts": {
"dev": "vite --host",
@ -17,6 +17,7 @@
"@ant-design/icons-vue": "^7.0.1",
"@formkit/auto-animate": "^0.8.2",
"@simplewebauthn/browser": "^13.1.0",
"@uozi-admin/curd": "^4.1.3",
"@vue/reactivity": "^3.5.13",
"@vue/shared": "^3.5.13",
"@vueuse/components": "^13.1.0",
@ -36,17 +37,17 @@
"marked-highlight": "^2.2.1",
"nprogress": "^0.2.0",
"pinia": "^3.0.2",
"pinia-plugin-persistedstate": "^4.2.0",
"pinia-plugin-persistedstate": "^4.3.0",
"reconnecting-websocket": "^4.4.0",
"sortablejs": "^1.15.6",
"splitpanes": "^4.0.3",
"sse.js": "^2.6.0",
"universal-cookie": "^8.0.1",
"unocss": "^66.0.0",
"unocss": "^66.1.1",
"uuid": "^11.1.0",
"vite-plugin-build-id": "0.5.0",
"vue": "^3.5.13",
"vue-dompurify-html": "^5.2.0",
"vue-dompurify-html": "^5.3.0",
"vue-router": "^4.5.1",
"vue3-ace-editor": "2.2.4",
"vue3-apexcharts": "1.5.3",
@ -55,7 +56,7 @@
"vuedraggable": "^4.1.0"
},
"devDependencies": {
"@antfu/eslint-config": "^4.12.0",
"@antfu/eslint-config": "^4.13.0",
"@iconify-json/fa": "1.2.1",
"@iconify-json/tabler": "^1.2.17",
"@iconify/tools": "^4.1.2",
@ -65,21 +66,21 @@
"@types/lodash": "^4.17.16",
"@types/nprogress": "^0.2.3",
"@types/sortablejs": "^1.15.8",
"@vitejs/plugin-vue": "^5.2.3",
"@vitejs/plugin-vue": "^5.2.4",
"@vitejs/plugin-vue-jsx": "^4.1.2",
"@vue/compiler-sfc": "^3.5.13",
"@vue/tsconfig": "^0.7.0",
"ace-builds": "^1.41.0",
"autoprefixer": "^10.4.21",
"eslint": "9.25.1",
"eslint": "9.26.0",
"eslint-plugin-sonarjs": "^3.0.2",
"less": "^4.3.0",
"postcss": "^8.5.3",
"typescript": "5.8.3",
"unplugin-auto-import": "^19.1.2",
"unplugin-auto-import": "^19.2.0",
"unplugin-vue-components": "^28.5.0",
"unplugin-vue-define-options": "^1.5.5",
"vite": "^6.3.4",
"vite": "^6.3.5",
"vite-plugin-inspect": "^11.0.1",
"vite-svg-loader": "^5.1.0",
"vue-tsc": "^2.2.10"

1888
app/pnpm-lock.yaml generated

File diff suppressed because it is too large Load diff

View file

@ -1,17 +1,14 @@
<script setup lang="ts">
import loadTranslations from '@/api/translations'
import gettext from '@/gettext'
import { useSettingsStore } from '@/pinia'
import { useSettingsStore, useUserStore } from '@/pinia'
import { theme } from 'ant-design-vue'
import en_US from 'ant-design-vue/es/locale/en_US'
import zh_CN from 'ant-design-vue/es/locale/zh_CN'
import zh_TW from 'ant-design-vue/es/locale/zh_TW'
// This starter template is using Vue 3 <script setup> SFCs
// Check out https://vuejs.org/api/sfc-script-setup.html#script-setup
import { computed, provide } from 'vue'
import router from './routes'
const route = useRoute()
const router = useRouter()
const media = window.matchMedia('(prefers-color-scheme: dark)')
@ -50,17 +47,20 @@ const lang = computed(() => {
})
const settings = useSettingsStore()
const user = useUserStore()
const is_theme_dark = computed(() => settings.theme === 'dark')
loadTranslations(route)
watch(route, () => {
settings.route_path = route.path
})
if (user.isLogin) {
watch(route, () => {
settings.route_path = route.path
})
onMounted(() => {
router.push(settings.route_path)
})
onMounted(() => {
router.push(settings.route_path)
})
}
</script>
<template>

View file

@ -104,6 +104,13 @@ export interface NginxPerfOpt {
proxy_cache: ProxyCacheConfig
}
export interface NgxModule {
name: string
params?: string
dynamic: boolean
loaded: boolean
}
const ngx = {
build_config(ngxConfig: NgxConfig) {
return http.post('/ngx/build_config', ngxConfig)
@ -152,6 +159,10 @@ const ngx = {
update_performance(params: NginxPerfOpt): Promise<NginxConfigInfo> {
return http.post('/nginx/performance', params)
},
get_modules(): Promise<NgxModule[]> {
return http.get('/nginx/modules')
},
}
export default ngx

View file

@ -22,10 +22,7 @@ onMounted(() => {
})
function addDirective(directive: NgxDirective) {
if (curIdx.value >= 0)
ngxDirectives.value.splice(curIdx.value + 1, 0, directive)
else
ngxDirectives.value.push(directive)
ngxDirectives.value.push(directive)
}
function removeDirective(index: number) {

View file

@ -0,0 +1,3 @@
export default {
406: () => $gettext('Requested with wrong parameters'),
}

File diff suppressed because it is too large Load diff

View file

@ -57,4 +57,7 @@ export const msg = [
$gettext('All Recovery Codes Have Been Used'),
$gettext('Please generate new recovery codes in the preferences immediately to prevent lockout.'),
$gettext('Search module name'),
$gettext('Search'),
]

File diff suppressed because it is too large Load diff

View file

@ -1,85 +1,85 @@
#: src/language/generate.ts:23
#: src/language/generate.ts:40
msgid "[Nginx UI] ACME User: %{name}, Email: %{email}, CA Dir: %{caDir}"
msgstr ""
#: src/language/generate.ts:12
#: src/language/generate.ts:26
msgid "[Nginx UI] Backing up current certificate for later revocation"
msgstr ""
#: src/language/generate.ts:41
#: src/language/generate.ts:43
msgid "[Nginx UI] Certificate renewed successfully"
msgstr ""
#: src/language/generate.ts:31
#: src/language/generate.ts:8
msgid "[Nginx UI] Certificate successfully revoked"
msgstr ""
#: src/language/generate.ts:25
#: src/language/generate.ts:27
msgid ""
"[Nginx UI] Certificate was used for server, reloading server TLS certificate"
msgstr ""
#: src/language/generate.ts:49
#: src/language/generate.ts:41
msgid "[Nginx UI] Creating client facilitates communication with the CA server"
msgstr ""
#: src/language/generate.ts:24
#: src/language/generate.ts:42
msgid "[Nginx UI] Environment variables cleaned"
msgstr ""
#: src/language/generate.ts:51
#: src/language/generate.ts:5
msgid "[Nginx UI] Finished"
msgstr ""
#: src/language/generate.ts:37
#: src/language/generate.ts:47
msgid "[Nginx UI] Issued certificate successfully"
msgstr ""
#: src/language/generate.ts:46
#: src/language/generate.ts:6
msgid "[Nginx UI] Obtaining certificate"
msgstr ""
#: src/language/generate.ts:42
#: src/language/generate.ts:44
msgid "[Nginx UI] Preparing for certificate revocation"
msgstr ""
#: src/language/generate.ts:48
#: src/language/generate.ts:12
msgid "[Nginx UI] Preparing lego configurations"
msgstr ""
#: src/language/generate.ts:8
#: src/language/generate.ts:4
msgid "[Nginx UI] Reloading nginx"
msgstr ""
#: src/language/generate.ts:4
#: src/language/generate.ts:20
msgid "[Nginx UI] Revocation completed"
msgstr ""
#: src/language/generate.ts:5
#: src/language/generate.ts:7
msgid "[Nginx UI] Revoking certificate"
msgstr ""
#: src/language/generate.ts:9
#: src/language/generate.ts:49
msgid "[Nginx UI] Revoking old certificate"
msgstr ""
#: src/language/generate.ts:40
#: src/language/generate.ts:48
msgid "[Nginx UI] Setting DNS01 challenge provider"
msgstr ""
#: src/language/generate.ts:50
#: src/language/generate.ts:31
msgid "[Nginx UI] Setting environment variables"
msgstr ""
#: src/language/generate.ts:18
#: src/language/generate.ts:13
msgid "[Nginx UI] Setting HTTP01 challenge provider"
msgstr ""
#: src/language/generate.ts:30
#: src/language/generate.ts:32
msgid "[Nginx UI] Writing certificate private key to disk"
msgstr ""
#: src/language/generate.ts:10
#: src/language/generate.ts:50
msgid "[Nginx UI] Writing certificate to disk"
msgstr ""
@ -121,7 +121,7 @@ msgstr ""
#: src/views/environments/list/envColumns.tsx:97
#: src/views/nginx_log/NginxLogList.vue:46
#: src/views/notification/notificationColumns.tsx:66
#: src/views/preference/components/ExternalNotify/columns.ts:46
#: src/views/preference/components/ExternalNotify/columns.tsx:59
#: src/views/preference/tabs/AuthSettings.vue:30
#: src/views/site/site_list/columns.tsx:120 src/views/stream/StreamList.vue:74
#: src/views/user/userColumns.tsx:60
@ -129,7 +129,7 @@ msgid "Action"
msgstr ""
#: src/composables/usePerformanceMetrics.ts:84
#: src/views/dashboard/components/PerformanceTablesCard.vue:43
#: src/views/dashboard/components/PerformanceTablesCard.vue:44
msgid "Active connections"
msgstr ""
@ -341,7 +341,7 @@ msgstr ""
msgid "Auto"
msgstr ""
#: src/views/dashboard/components/PerformanceTablesCard.vue:200
#: src/views/dashboard/components/PerformanceTablesCard.vue:201
msgid "auto = CPU cores"
msgstr ""
@ -479,7 +479,7 @@ msgid "Cache loader processing time threshold"
msgstr ""
#: src/composables/usePerformanceMetrics.ts:139
#: src/views/dashboard/components/PerformanceTablesCard.vue:94
#: src/views/dashboard/components/PerformanceTablesCard.vue:95
msgid "Cache manager processes"
msgstr ""
@ -509,7 +509,7 @@ msgid "CADir"
msgstr ""
#: src/views/dashboard/components/PerformanceStatisticsCard.vue:43
#: src/views/dashboard/components/PerformanceTablesCard.vue:190
#: src/views/dashboard/components/PerformanceTablesCard.vue:191
msgid ""
"Calculated based on worker_processes * worker_connections. Actual "
"performance depends on hardware, configuration, and workload"
@ -587,7 +587,7 @@ msgstr ""
msgid "Certificate Expiring Soon"
msgstr ""
#: src/language/generate.ts:38
#: src/language/generate.ts:18
msgid "Certificate not found: %{error}"
msgstr ""
@ -670,37 +670,63 @@ msgstr ""
msgid "Check again"
msgstr ""
#: src/language/generate.ts:17
msgid ""
"Check if /var/run/docker.sock exists. If you are using Nginx UI Official "
"Docker Image, please make sure the docker socket is mounted like this: `-v /"
"var/run/docker.sock:/var/run/docker.sock`. Nginx UI official image uses /var/"
"run/docker.sock to communicate with the host Docker Engine via Docker Client "
"API. This feature is used to control Nginx in another container and perform "
"container replacement rather than binary replacement during OTA upgrades of "
"Nginx UI to ensure container dependencies are also upgraded. If you don't "
"need this feature, please add the environment variable "
"NGINX_UI_IGNORE_DOCKER_SOCKET=true to the container."
msgstr ""
#: src/components/SelfCheck/tasks/frontend/https-check.ts:14
msgid ""
"Check if HTTPS is enabled. Using HTTP outside localhost is insecure and "
"prevents using Passkeys and clipboard features"
msgstr ""
#: src/language/generate.ts:28
msgid "Check if the docker socket exists."
msgstr ""
#: src/language/generate.ts:44
msgid "Check if the nginx access log path exists"
msgstr ""
#: src/language/generate.ts:35
msgid "Check if the nginx configuration directory exists"
msgstr ""
#: src/language/generate.ts:43
msgid "Check if the nginx configuration entry file exists"
msgstr ""
#: src/language/generate.ts:20
msgid "Check if the nginx error log path exists"
msgstr ""
#: src/language/generate.ts:7
msgid "Check if the nginx PID path exists"
#: src/language/generate.ts:45
msgid ""
"Check if the nginx access log path exists. By default, this path is obtained "
"from 'nginx -V'. If it cannot be obtained or the obtained path does not "
"point to a valid, existing file, an error will be reported. In this case, "
"you need to modify the configuration file to specify the access log path."
"Refer to the docs for more details: https://nginxui.com/zh_CN/guide/config-"
"nginx.html#accesslogpath"
msgstr ""
#: src/language/generate.ts:34
msgid "Check if the nginx configuration directory exists"
msgstr ""
#: src/language/generate.ts:30
msgid "Check if the nginx configuration entry file exists"
msgstr ""
#: src/language/generate.ts:15
msgid ""
"Check if the nginx error log path exists. By default, this path is obtained "
"from 'nginx -V'. If it cannot be obtained or the obtained path does not "
"point to a valid, existing file, an error will be reported. In this case, "
"you need to modify the configuration file to specify the error log path."
"Refer to the docs for more details: https://nginxui.com/zh_CN/guide/config-"
"nginx.html#errorlogpath"
msgstr ""
#: src/language/generate.ts:10
msgid ""
"Check if the nginx PID path exists. By default, this path is obtained from "
"'nginx -V'. If it cannot be obtained, an error will be reported. In this "
"case, you need to modify the configuration file to specify the Nginx PID "
"path.Refer to the docs for more details: https://nginxui.com/zh_CN/guide/"
"config-nginx.html#pidpath"
msgstr ""
#: src/language/generate.ts:22
msgid "Check if the nginx.conf includes the conf.d directory"
msgstr ""
@ -708,17 +734,17 @@ msgstr ""
msgid "Check if the nginx.conf includes the sites-enabled directory"
msgstr ""
#: src/language/generate.ts:47
#: src/language/generate.ts:46
msgid "Check if the nginx.conf includes the streams-enabled directory"
msgstr ""
#: src/language/generate.ts:13
#: src/language/generate.ts:21
msgid ""
"Check if the sites-available and sites-enabled directories are under the "
"nginx configuration directory"
msgstr ""
#: src/language/generate.ts:32
#: src/language/generate.ts:23
msgid ""
"Check if the streams-available and streams-enabled directories are under the "
"nginx configuration directory"
@ -843,7 +869,7 @@ msgstr ""
msgid "Configuration History"
msgstr ""
#: src/views/dashboard/components/PerformanceTablesCard.vue:167
#: src/views/dashboard/components/PerformanceTablesCard.vue:168
msgid "Configuration information"
msgstr ""
@ -953,7 +979,7 @@ msgstr ""
#: src/views/environments/group/columns.ts:31
#: src/views/notification/notificationColumns.tsx:45
#: src/views/preference/components/AuthSettings/Passkey.vue:95
#: src/views/preference/components/ExternalNotify/columns.ts:41
#: src/views/preference/components/ExternalNotify/columns.tsx:54
#: src/views/user/userColumns.tsx:48
msgid "Created at"
msgstr ""
@ -1014,10 +1040,6 @@ msgstr ""
msgid "Dashboard"
msgstr ""
#: src/views/install/components/InstallForm.vue:109
msgid "Database (Optional, default: database)"
msgstr ""
#: src/views/preference/tabs/CertSettings.vue:32
msgid "Days"
msgstr ""
@ -1292,7 +1314,7 @@ msgstr ""
msgid "Docker client not initialized"
msgstr ""
#: src/language/generate.ts:17
#: src/language/generate.ts:16
msgid "Docker socket exists"
msgstr ""
@ -1346,6 +1368,11 @@ msgstr ""
msgid "Duplicate to local successfully"
msgstr ""
#: src/views/dashboard/components/ModulesTable.vue:88
#: src/views/dashboard/components/ModulesTable.vue:93
msgid "Dynamic"
msgstr ""
#: src/components/StdDesign/StdDetail/StdDetail.vue:110
msgid "Edit"
msgstr ""
@ -1363,7 +1390,7 @@ msgstr ""
msgid "Edit Site"
msgstr ""
#: src/routes/modules/streams.ts:19
#: src/routes/modules/streams.ts:20
msgid "Edit Stream"
msgstr ""
@ -1372,7 +1399,7 @@ msgstr ""
msgid "Email"
msgstr ""
#: src/views/install/components/InstallForm.vue:78
#: src/views/install/components/InstallForm.vue:75
msgid "Email (*)"
msgstr ""
@ -1556,7 +1583,7 @@ msgid "External Docker Container"
msgstr ""
#: src/views/preference/Preference.vue:58
#: src/views/preference/tabs/ExternalNotify.vue:10
#: src/views/preference/tabs/ExternalNotify.vue:9
msgid "External Notify"
msgstr ""
@ -1692,7 +1719,7 @@ msgstr ""
msgid "Failed to delete certificate"
msgstr ""
#: src/language/generate.ts:22
#: src/language/generate.ts:19
msgid "Failed to delete certificate from database: %{error}"
msgstr ""
@ -1836,7 +1863,7 @@ msgstr ""
msgid "Failed to revoke certificate"
msgstr ""
#: src/language/generate.ts:45
#: src/language/generate.ts:24
msgid "Failed to revoke certificate: %{error}"
msgstr ""
@ -1957,6 +1984,10 @@ msgstr ""
msgid "Github Proxy"
msgstr ""
#: src/views/preference/components/ExternalNotify/gotify.ts:5
msgid "Gotify"
msgstr ""
#: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:67
msgid "GZIP Compression"
msgstr ""
@ -2064,7 +2095,7 @@ msgstr ""
msgid "Indexing..."
msgstr ""
#: src/views/dashboard/components/PerformanceTablesCard.vue:15
#: src/views/dashboard/components/PerformanceTablesCard.vue:16
msgid "Indicator"
msgstr ""
@ -2094,13 +2125,13 @@ msgid "Insecure Skip Verify"
msgstr ""
#: src/routes/modules/auth.ts:8
#: src/views/install/components/InstallForm.vue:124
#: src/views/install/components/InstallForm.vue:110
#: src/views/install/components/InstallHeader.vue:9
#: src/views/system/Upgrade.vue:150
msgid "Install"
msgstr ""
#: src/views/install/components/InstallForm.vue:60
#: src/views/install/components/InstallForm.vue:57
msgid "Install successfully"
msgstr ""
@ -2218,7 +2249,7 @@ msgstr ""
msgid "Key Type"
msgstr ""
#: src/views/preference/components/ExternalNotify/columns.ts:29
#: src/views/preference/components/ExternalNotify/columns.tsx:30
msgid "Language"
msgstr ""
@ -2296,6 +2327,11 @@ msgstr ""
msgid "Load successfully"
msgstr ""
#: src/views/dashboard/components/ModulesTable.vue:101
#: src/views/dashboard/components/ModulesTable.vue:106
msgid "Loaded"
msgstr ""
#: src/views/dashboard/components/ParamsOpt/ProxyCacheConfig.vue:313
msgid "Loader Files"
msgstr ""
@ -2334,7 +2370,7 @@ msgstr ""
msgid "Log"
msgstr ""
#: src/language/generate.ts:29
#: src/language/generate.ts:25
msgid ""
"Log file %{log_path} is not a regular file. If you are using nginx-ui in "
"docker container, please refer to https://nginxui.com/zh_CN/guide/config-"
@ -2428,7 +2464,7 @@ msgstr ""
msgid "Manual"
msgstr ""
#: src/views/dashboard/components/PerformanceTablesCard.vue:201
#: src/views/dashboard/components/PerformanceTablesCard.vue:202
msgid "manually set"
msgstr ""
@ -2437,7 +2473,7 @@ msgid "Master"
msgstr ""
#: src/composables/usePerformanceMetrics.ts:134
#: src/views/dashboard/components/PerformanceTablesCard.vue:89
#: src/views/dashboard/components/PerformanceTablesCard.vue:90
msgid "Master process"
msgstr ""
@ -2471,7 +2507,7 @@ msgid "Maximum number of concurrent connections"
msgstr ""
#: src/composables/usePerformanceMetrics.ts:174
#: src/views/dashboard/components/PerformanceTablesCard.vue:125
#: src/views/dashboard/components/PerformanceTablesCard.vue:126
msgid "Maximum number of connections per worker process"
msgstr ""
@ -2479,7 +2515,7 @@ msgstr ""
msgid "Maximum total size of the cache"
msgstr ""
#: src/views/dashboard/components/PerformanceTablesCard.vue:195
#: src/views/dashboard/components/PerformanceTablesCard.vue:196
msgid "Maximum worker process number:"
msgstr ""
@ -2540,6 +2576,14 @@ msgstr ""
msgid "Modify Mode"
msgstr ""
#: src/views/dashboard/components/ModulesTable.vue:28
msgid "Module"
msgstr ""
#: src/views/dashboard/components/PerformanceTablesCard.vue:215
msgid "Modules"
msgstr ""
#: src/components/NgxConfigEditor/directive/DirectiveAdd.vue:51
msgid "Multi-line Directive"
msgstr ""
@ -2615,7 +2659,7 @@ msgstr ""
msgid "Nginx Access Log Path"
msgstr ""
#: src/language/generate.ts:27
#: src/language/generate.ts:36
msgid "Nginx access log path exists"
msgstr ""
@ -2643,11 +2687,11 @@ msgstr ""
msgid "Nginx config directory is not set"
msgstr ""
#: src/language/generate.ts:16
#: src/language/generate.ts:14
msgid "Nginx configuration directory exists"
msgstr ""
#: src/language/generate.ts:36
#: src/language/generate.ts:9
msgid "Nginx configuration entry file exists"
msgstr ""
@ -2677,7 +2721,7 @@ msgid "Nginx Control Mode"
msgstr ""
#: src/composables/usePerformanceMetrics.ts:149
#: src/views/dashboard/components/PerformanceTablesCard.vue:104
#: src/views/dashboard/components/PerformanceTablesCard.vue:105
msgid "Nginx CPU usage rate"
msgstr ""
@ -2685,7 +2729,7 @@ msgstr ""
msgid "Nginx Error Log Path"
msgstr ""
#: src/language/generate.ts:19
#: src/language/generate.ts:51
msgid "Nginx error log path exists"
msgstr ""
@ -2714,7 +2758,7 @@ msgid "Nginx Log Directory Whitelist"
msgstr ""
#: src/composables/usePerformanceMetrics.ts:154
#: src/views/dashboard/components/PerformanceTablesCard.vue:109
#: src/views/dashboard/components/PerformanceTablesCard.vue:110
msgid "Nginx Memory usage"
msgstr ""
@ -2722,7 +2766,7 @@ msgstr ""
msgid "Nginx PID Path"
msgstr ""
#: src/language/generate.ts:26
#: src/language/generate.ts:35
msgid "Nginx PID path exists"
msgstr ""
@ -2764,7 +2808,7 @@ msgstr ""
msgid "Nginx test failed: {0}"
msgstr ""
#: src/views/dashboard/components/PerformanceTablesCard.vue:180
#: src/views/dashboard/components/PerformanceTablesCard.vue:181
msgid "Nginx theoretical maximum performance"
msgstr ""
@ -2782,11 +2826,11 @@ msgid ""
"few seconds."
msgstr ""
#: src/language/generate.ts:15
#: src/language/generate.ts:38
msgid "Nginx.conf includes conf.d directory"
msgstr ""
#: src/language/generate.ts:6
#: src/language/generate.ts:29
msgid "Nginx.conf includes sites-enabled directory"
msgstr ""
@ -2862,6 +2906,11 @@ msgstr ""
msgid "Not Found"
msgstr ""
#: src/views/dashboard/components/ModulesTable.vue:102
#: src/views/dashboard/components/ModulesTable.vue:106
msgid "Not Loaded"
msgstr ""
#: src/components/CertInfo/CertInfo.vue:41
msgid "Not Valid Before: %{date}"
msgstr ""
@ -2905,8 +2954,8 @@ msgstr ""
#: src/composables/usePerformanceMetrics.ts:129
#: src/composables/usePerformanceMetrics.ts:169
#: src/views/dashboard/components/PerformanceTablesCard.vue:120
#: src/views/dashboard/components/PerformanceTablesCard.vue:84
#: src/views/dashboard/components/PerformanceTablesCard.vue:121
#: src/views/dashboard/components/PerformanceTablesCard.vue:85
msgid "Number of worker processes"
msgstr ""
@ -3011,7 +3060,7 @@ msgid "OS:"
msgstr ""
#: src/composables/usePerformanceMetrics.ts:144
#: src/views/dashboard/components/PerformanceTablesCard.vue:99
#: src/views/dashboard/components/PerformanceTablesCard.vue:100
msgid "Other Nginx processes"
msgstr ""
@ -3064,7 +3113,7 @@ msgstr ""
msgid "Password"
msgstr ""
#: src/views/install/components/InstallForm.vue:98
#: src/views/install/components/InstallForm.vue:95
msgid "Password (*)"
msgstr ""
@ -3072,7 +3121,7 @@ msgstr ""
msgid "Password incorrect"
msgstr ""
#: src/views/install/components/InstallForm.vue:42
#: src/views/install/components/InstallForm.vue:45
msgid "Password length cannot exceed 20 characters"
msgstr ""
@ -3192,15 +3241,15 @@ msgid ""
"configuration."
msgstr ""
#: src/views/install/components/InstallForm.vue:26
#: src/views/install/components/InstallForm.vue:25
msgid "Please input your E-mail!"
msgstr ""
#: src/views/install/components/InstallForm.vue:38 src/views/other/Login.vue:47
#: src/views/install/components/InstallForm.vue:41 src/views/other/Login.vue:47
msgid "Please input your password!"
msgstr ""
#: src/views/install/components/InstallForm.vue:32 src/views/other/Login.vue:41
#: src/views/install/components/InstallForm.vue:31 src/views/other/Login.vue:41
msgid "Please input your username!"
msgstr ""
@ -3271,7 +3320,7 @@ msgstr ""
msgid "Process Distribution"
msgstr ""
#: src/views/dashboard/components/PerformanceTablesCard.vue:154
#: src/views/dashboard/components/PerformanceTablesCard.vue:155
msgid "Process information"
msgstr ""
@ -3304,7 +3353,7 @@ msgid "Read dir failed: {0}"
msgstr ""
#: src/composables/usePerformanceMetrics.ts:104
#: src/views/dashboard/components/PerformanceTablesCard.vue:63
#: src/views/dashboard/components/PerformanceTablesCard.vue:64
msgid "Read requests"
msgstr ""
@ -3540,7 +3589,7 @@ msgstr ""
msgid "Renew successfully"
msgstr ""
#: src/views/dashboard/components/PerformanceTablesCard.vue:141
#: src/views/dashboard/components/PerformanceTablesCard.vue:142
msgid "Request statistics"
msgstr ""
@ -3548,7 +3597,7 @@ msgstr ""
msgid "Request timeout"
msgstr ""
#: src/language/constants.ts:33
#: src/constants/errors/validate.ts:2 src/language/constants.ts:33
msgid "Requested with wrong parameters"
msgstr ""
@ -3572,7 +3621,7 @@ msgid ""
msgstr ""
#: src/composables/usePerformanceMetrics.ts:109
#: src/views/dashboard/components/PerformanceTablesCard.vue:68
#: src/views/dashboard/components/PerformanceTablesCard.vue:69
msgid "Responses"
msgstr ""
@ -3756,6 +3805,14 @@ msgstr ""
msgid "SDK"
msgstr ""
#: src/language/constants.ts:62
msgid "Search"
msgstr ""
#: src/language/constants.ts:61
msgid "Search module name"
msgstr ""
#: src/views/preference/components/AuthSettings/TOTP.vue:109
msgid "Secret has been copied"
msgstr ""
@ -3893,7 +3950,7 @@ msgstr ""
msgid "Site not found"
msgstr ""
#: src/language/generate.ts:21
#: src/language/generate.ts:28
msgid "Sites directory exists"
msgstr ""
@ -3981,8 +4038,14 @@ msgstr ""
msgid "Start Restore"
msgstr ""
#: src/views/dashboard/components/ModulesTable.vue:89
#: src/views/dashboard/components/ModulesTable.vue:93
msgid "Static"
msgstr ""
#: src/views/certificate/ACMEUser.vue:65
#: src/views/certificate/CertificateList/certColumns.tsx:65
#: src/views/dashboard/components/ModulesTable.vue:97
#: src/views/environments/list/envColumns.tsx:44
#: src/views/site/site_edit/components/RightPanel/Basic.vue:28
#: src/views/site/site_list/columns.tsx:90 src/views/stream/StreamList.vue:47
@ -4006,7 +4069,7 @@ msgstr ""
msgid "Stream not found"
msgstr ""
#: src/language/generate.ts:14
#: src/language/generate.ts:37
msgid "Streams directory exists"
msgstr ""
@ -4165,10 +4228,6 @@ msgid ""
"since it was last issued."
msgstr ""
#: src/views/install/components/InstallForm.vue:48
msgid "The filename cannot contain the following characters: %{c}"
msgstr ""
#: src/views/preference/tabs/NodeSettings.vue:37
msgid ""
"The ICP Number should only contain letters, unicode, numbers, hyphens, "
@ -4251,11 +4310,11 @@ msgstr ""
msgid "The username or password is incorrect"
msgstr ""
#: src/views/dashboard/components/PerformanceTablesCard.vue:184
#: src/views/dashboard/components/PerformanceTablesCard.vue:185
msgid "Theoretical maximum concurrent connections:"
msgstr ""
#: src/views/dashboard/components/PerformanceTablesCard.vue:188
#: src/views/dashboard/components/PerformanceTablesCard.vue:189
msgid "Theoretical maximum RPS (Requests Per Second):"
msgstr ""
@ -4349,7 +4408,7 @@ msgstr ""
msgid "Tips"
msgstr ""
#: src/views/dashboard/components/PerformanceTablesCard.vue:206
#: src/views/dashboard/components/PerformanceTablesCard.vue:207
msgid ""
"Tips: You can increase the concurrency processing capacity by increasing "
"worker_processes or worker_connections"
@ -4407,12 +4466,12 @@ msgstr[0] ""
msgstr[1] ""
#: src/composables/usePerformanceMetrics.ts:94
#: src/views/dashboard/components/PerformanceTablesCard.vue:53
#: src/views/dashboard/components/PerformanceTablesCard.vue:54
msgid "Total connections"
msgstr ""
#: src/composables/usePerformanceMetrics.ts:89
#: src/views/dashboard/components/PerformanceTablesCard.vue:48
#: src/views/dashboard/components/PerformanceTablesCard.vue:49
msgid "Total handshakes"
msgstr ""
@ -4425,7 +4484,7 @@ msgid "Total Nginx Processes"
msgstr ""
#: src/composables/usePerformanceMetrics.ts:99
#: src/views/dashboard/components/PerformanceTablesCard.vue:58
#: src/views/dashboard/components/PerformanceTablesCard.vue:59
msgid "Total requests"
msgstr ""
@ -4452,9 +4511,10 @@ msgid "Two-factor authentication required"
msgstr ""
#: src/views/certificate/CertificateList/certColumns.tsx:25
#: src/views/dashboard/components/ModulesTable.vue:84
#: src/views/nginx_log/NginxLogList.vue:14
#: src/views/notification/notificationColumns.tsx:9
#: src/views/preference/components/ExternalNotify/columns.ts:17
#: src/views/preference/components/ExternalNotify/columns.tsx:18
msgid "Type"
msgstr ""
@ -4542,17 +4602,21 @@ msgstr ""
msgid "Username"
msgstr ""
#: src/views/install/components/InstallForm.vue:88
#: src/views/install/components/InstallForm.vue:85
msgid "Username (*)"
msgstr ""
#: src/views/install/components/InstallForm.vue:35
msgid "Username length cannot exceed 255 characters"
msgstr ""
#: src/components/CertInfo/CertInfo.vue:24
#: src/views/certificate/ACMEUser.vue:124
#: src/views/certificate/CertificateList/certColumns.tsx:78
msgid "Valid"
msgstr ""
#: src/views/dashboard/components/PerformanceTablesCard.vue:21
#: src/views/dashboard/components/PerformanceTablesCard.vue:22
msgid "Value"
msgstr ""
@ -4596,7 +4660,7 @@ msgid "Viewed"
msgstr ""
#: src/composables/usePerformanceMetrics.ts:114
#: src/views/dashboard/components/PerformanceTablesCard.vue:73
#: src/views/dashboard/components/PerformanceTablesCard.vue:74
msgid "Waiting processes"
msgstr ""

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -1,52 +1,52 @@
// This file is auto-generated. DO NOT EDIT MANUALLY.
export const msg = [
$gettext('[Nginx UI] Revocation completed'),
$gettext('[Nginx UI] Revoking certificate'),
$gettext('Nginx.conf includes sites-enabled directory'),
$gettext('Check if the nginx PID path exists'),
$gettext('[Nginx UI] Reloading nginx'),
$gettext('[Nginx UI] Revoking old certificate'),
$gettext('[Nginx UI] Writing certificate to disk'),
$gettext('Nginx.conf includes streams-enabled directory'),
$gettext('[Nginx UI] Backing up current certificate for later revocation'),
$gettext('Check if the sites-available and sites-enabled directories are under the nginx configuration directory'),
$gettext('Streams directory exists'),
$gettext('Nginx.conf includes conf.d directory'),
$gettext('Nginx configuration directory exists'),
$gettext('Docker socket exists'),
$gettext('[Nginx UI] Setting HTTP01 challenge provider'),
$gettext('Nginx error log path exists'),
$gettext('Check if the nginx error log path exists'),
$gettext('Sites directory exists'),
$gettext('Failed to delete certificate from database: %{error}'),
$gettext('[Nginx UI] ACME User: %{name}, Email: %{email}, CA Dir: %{caDir}'),
$gettext('[Nginx UI] Environment variables cleaned'),
$gettext('[Nginx UI] Certificate was used for server, reloading server TLS certificate'),
$gettext('Nginx PID path exists'),
$gettext('Nginx access log path exists'),
$gettext('Check if the docker socket exists.'),
$gettext('Log file %{log_path} is not a regular file. If you are using nginx-ui in docker container, please refer to https://nginxui.com/zh_CN/guide/config-nginx-log.html for more information.'),
$gettext('[Nginx UI] Finished'),
$gettext('[Nginx UI] Writing certificate private key to disk'),
$gettext('[Nginx UI] Certificate successfully revoked'),
$gettext('Check if the streams-available and streams-enabled directories are under the nginx configuration directory'),
$gettext('Check if the nginx.conf includes the sites-enabled directory'),
$gettext('Check if the nginx.conf includes the conf.d directory'),
$gettext('[Nginx UI] Certificate was used for server, reloading server TLS certificate'),
$gettext('Nginx configuration directory exists'),
$gettext('Check if the nginx configuration directory exists'),
$gettext('Failed to delete certificate from database: %{error}'),
$gettext('[Nginx UI] Environment variables cleaned'),
$gettext('[Nginx UI] Backing up current certificate for later revocation'),
$gettext('[Nginx UI] Revoking old certificate'),
$gettext('[Nginx UI] Preparing for certificate revocation'),
$gettext('[Nginx UI] Certificate successfully revoked'),
$gettext('Streams directory exists'),
$gettext('Certificate revoked successfully'),
$gettext('Log file %{log_path} is not a regular file. If you are using nginx-ui in docker container, please refer to https://nginxui.com/zh_CN/guide/config-nginx-log.html for more information.'),
$gettext('[Nginx UI] ACME User: %{name}, Email: %{email}, CA Dir: %{caDir}'),
$gettext('[Nginx UI] Creating client facilitates communication with the CA server'),
$gettext('[Nginx UI] Writing certificate to disk'),
$gettext('Nginx configuration entry file exists'),
$gettext('Nginx.conf includes streams-enabled directory'),
$gettext('Check if the nginx.conf includes the streams-enabled directory'),
$gettext('[Nginx UI] Issued certificate successfully'),
$gettext('Certificate not found: %{error}'),
$gettext('Certificate revoked successfully'),
$gettext('[Nginx UI] Setting DNS01 challenge provider'),
$gettext('[Nginx UI] Certificate renewed successfully'),
$gettext('[Nginx UI] Preparing for certificate revocation'),
$gettext('Check if the nginx configuration entry file exists'),
$gettext('Check if the nginx access log path exists'),
$gettext('Nginx.conf includes sites-enabled directory'),
$gettext('Nginx error log path exists'),
$gettext('Failed to revoke certificate: %{error}'),
$gettext('[Nginx UI] Revocation completed'),
$gettext('Sites directory exists'),
$gettext('Check if the nginx.conf includes the sites-enabled directory'),
$gettext('Nginx.conf includes conf.d directory'),
$gettext('Check if the nginx.conf includes the conf.d directory'),
$gettext('Check if the streams-available and streams-enabled directories are under the nginx configuration directory'),
$gettext('Check if /var/run/docker.sock exists. If you are using Nginx UI Official Docker Image, please make sure the docker socket is mounted like this: `-v /var/run/docker.sock:/var/run/docker.sock`. Nginx UI official image uses /var/run/docker.sock to communicate with the host Docker Engine via Docker Client API. This feature is used to control Nginx in another container and perform container replacement rather than binary replacement during OTA upgrades of Nginx UI to ensure container dependencies are also upgraded. If you don\'t need this feature, please add the environment variable NGINX_UI_IGNORE_DOCKER_SOCKET=true to the container.'),
$gettext('[Nginx UI] Reloading nginx'),
$gettext('[Nginx UI] Obtaining certificate'),
$gettext('Check if the nginx.conf includes the streams-enabled directory'),
$gettext('[Nginx UI] Preparing lego configurations'),
$gettext('[Nginx UI] Creating client facilitates communication with the CA server'),
$gettext('[Nginx UI] Certificate renewed successfully'),
$gettext('[Nginx UI] Revoking certificate'),
$gettext('Docker socket exists'),
$gettext('[Nginx UI] Setting HTTP01 challenge provider'),
$gettext('[Nginx UI] Setting environment variables'),
$gettext('[Nginx UI] Finished'),
$gettext('Check if the sites-available and sites-enabled directories are under the nginx configuration directory'),
$gettext('Check if the nginx configuration entry file exists'),
$gettext('Nginx PID path exists'),
$gettext('Check if the nginx access log path exists. By default, this path is obtained from \'nginx -V\'. If it cannot be obtained or the obtained path does not point to a valid, existing file, an error will be reported. In this case, you need to modify the configuration file to specify the access log path.Refer to the docs for more details: https://nginxui.com/zh_CN/guide/config-nginx.html#accesslogpath'),
$gettext('[Nginx UI] Preparing lego configurations'),
$gettext('[Nginx UI] Setting DNS01 challenge provider'),
$gettext('Check if the nginx PID path exists. By default, this path is obtained from \'nginx -V\'. If it cannot be obtained, an error will be reported. In this case, you need to modify the configuration file to specify the Nginx PID path.Refer to the docs for more details: https://nginxui.com/zh_CN/guide/config-nginx.html#pidpath'),
$gettext('Nginx access log path exists'),
$gettext('Check if the nginx error log path exists. By default, this path is obtained from \'nginx -V\'. If it cannot be obtained or the obtained path does not point to a valid, existing file, an error will be reported. In this case, you need to modify the configuration file to specify the error log path.Refer to the docs for more details: https://nginxui.com/zh_CN/guide/config-nginx.html#errorlogpath'),
]

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -2,87 +2,87 @@ msgid ""
msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
#: src/language/generate.ts:23
#: src/language/generate.ts:40
msgid "[Nginx UI] ACME User: %{name}, Email: %{email}, CA Dir: %{caDir}"
msgstr ""
#: src/language/generate.ts:12
#: src/language/generate.ts:26
msgid "[Nginx UI] Backing up current certificate for later revocation"
msgstr ""
#: src/language/generate.ts:41
#: src/language/generate.ts:43
msgid "[Nginx UI] Certificate renewed successfully"
msgstr ""
#: src/language/generate.ts:31
#: src/language/generate.ts:8
msgid "[Nginx UI] Certificate successfully revoked"
msgstr ""
#: src/language/generate.ts:25
#: src/language/generate.ts:27
msgid "[Nginx UI] Certificate was used for server, reloading server TLS certificate"
msgstr ""
#: src/language/generate.ts:49
#: src/language/generate.ts:41
msgid "[Nginx UI] Creating client facilitates communication with the CA server"
msgstr ""
#: src/language/generate.ts:24
#: src/language/generate.ts:42
msgid "[Nginx UI] Environment variables cleaned"
msgstr ""
#: src/language/generate.ts:51
#: src/language/generate.ts:5
msgid "[Nginx UI] Finished"
msgstr ""
#: src/language/generate.ts:37
#: src/language/generate.ts:47
msgid "[Nginx UI] Issued certificate successfully"
msgstr ""
#: src/language/generate.ts:46
#: src/language/generate.ts:6
msgid "[Nginx UI] Obtaining certificate"
msgstr ""
#: src/language/generate.ts:42
#: src/language/generate.ts:44
msgid "[Nginx UI] Preparing for certificate revocation"
msgstr ""
#: src/language/generate.ts:48
#: src/language/generate.ts:12
msgid "[Nginx UI] Preparing lego configurations"
msgstr ""
#: src/language/generate.ts:8
#: src/language/generate.ts:4
msgid "[Nginx UI] Reloading nginx"
msgstr ""
#: src/language/generate.ts:4
#: src/language/generate.ts:20
msgid "[Nginx UI] Revocation completed"
msgstr ""
#: src/language/generate.ts:5
#: src/language/generate.ts:7
msgid "[Nginx UI] Revoking certificate"
msgstr ""
#: src/language/generate.ts:9
#: src/language/generate.ts:49
msgid "[Nginx UI] Revoking old certificate"
msgstr ""
#: src/language/generate.ts:40
#: src/language/generate.ts:48
msgid "[Nginx UI] Setting DNS01 challenge provider"
msgstr ""
#: src/language/generate.ts:50
#: src/language/generate.ts:31
msgid "[Nginx UI] Setting environment variables"
msgstr ""
#: src/language/generate.ts:18
#: src/language/generate.ts:13
msgid "[Nginx UI] Setting HTTP01 challenge provider"
msgstr ""
#: src/language/generate.ts:30
#: src/language/generate.ts:32
msgid "[Nginx UI] Writing certificate private key to disk"
msgstr ""
#: src/language/generate.ts:10
#: src/language/generate.ts:50
msgid "[Nginx UI] Writing certificate to disk"
msgstr ""
@ -125,7 +125,7 @@ msgstr ""
#: src/views/environments/list/envColumns.tsx:97
#: src/views/nginx_log/NginxLogList.vue:46
#: src/views/notification/notificationColumns.tsx:66
#: src/views/preference/components/ExternalNotify/columns.ts:46
#: src/views/preference/components/ExternalNotify/columns.tsx:59
#: src/views/preference/tabs/AuthSettings.vue:30
#: src/views/site/site_list/columns.tsx:120
#: src/views/stream/StreamList.vue:74
@ -134,7 +134,7 @@ msgid "Action"
msgstr ""
#: src/composables/usePerformanceMetrics.ts:84
#: src/views/dashboard/components/PerformanceTablesCard.vue:43
#: src/views/dashboard/components/PerformanceTablesCard.vue:44
msgid "Active connections"
msgstr ""
@ -348,7 +348,7 @@ msgstr ""
msgid "Auto"
msgstr ""
#: src/views/dashboard/components/PerformanceTablesCard.vue:200
#: src/views/dashboard/components/PerformanceTablesCard.vue:201
msgid "auto = CPU cores"
msgstr ""
@ -488,7 +488,7 @@ msgid "Cache loader processing time threshold"
msgstr ""
#: src/composables/usePerformanceMetrics.ts:139
#: src/views/dashboard/components/PerformanceTablesCard.vue:94
#: src/views/dashboard/components/PerformanceTablesCard.vue:95
msgid "Cache manager processes"
msgstr ""
@ -518,7 +518,7 @@ msgid "CADir"
msgstr ""
#: src/views/dashboard/components/PerformanceStatisticsCard.vue:43
#: src/views/dashboard/components/PerformanceTablesCard.vue:190
#: src/views/dashboard/components/PerformanceTablesCard.vue:191
msgid "Calculated based on worker_processes * worker_connections. Actual performance depends on hardware, configuration, and workload"
msgstr ""
@ -594,7 +594,7 @@ msgstr ""
msgid "Certificate Expiring Soon"
msgstr ""
#: src/language/generate.ts:38
#: src/language/generate.ts:18
msgid "Certificate not found: %{error}"
msgstr ""
@ -677,35 +677,35 @@ msgstr ""
msgid "Check again"
msgstr ""
#: src/language/generate.ts:17
msgid "Check if /var/run/docker.sock exists. If you are using Nginx UI Official Docker Image, please make sure the docker socket is mounted like this: `-v /var/run/docker.sock:/var/run/docker.sock`. Nginx UI official image uses /var/run/docker.sock to communicate with the host Docker Engine via Docker Client API. This feature is used to control Nginx in another container and perform container replacement rather than binary replacement during OTA upgrades of Nginx UI to ensure container dependencies are also upgraded. If you don't need this feature, please add the environment variable NGINX_UI_IGNORE_DOCKER_SOCKET=true to the container."
msgstr ""
#: src/components/SelfCheck/tasks/frontend/https-check.ts:14
msgid "Check if HTTPS is enabled. Using HTTP outside localhost is insecure and prevents using Passkeys and clipboard features"
msgstr ""
#: src/language/generate.ts:28
msgid "Check if the docker socket exists."
msgstr ""
#: src/language/generate.ts:44
msgid "Check if the nginx access log path exists"
msgstr ""
#: src/language/generate.ts:35
msgid "Check if the nginx configuration directory exists"
msgstr ""
#: src/language/generate.ts:43
msgid "Check if the nginx configuration entry file exists"
msgstr ""
#: src/language/generate.ts:20
msgid "Check if the nginx error log path exists"
msgstr ""
#: src/language/generate.ts:7
msgid "Check if the nginx PID path exists"
#: src/language/generate.ts:45
msgid "Check if the nginx access log path exists. By default, this path is obtained from 'nginx -V'. If it cannot be obtained or the obtained path does not point to a valid, existing file, an error will be reported. In this case, you need to modify the configuration file to specify the access log path.Refer to the docs for more details: https://nginxui.com/zh_CN/guide/config-nginx.html#accesslogpath"
msgstr ""
#: src/language/generate.ts:34
msgid "Check if the nginx configuration directory exists"
msgstr ""
#: src/language/generate.ts:30
msgid "Check if the nginx configuration entry file exists"
msgstr ""
#: src/language/generate.ts:15
msgid "Check if the nginx error log path exists. By default, this path is obtained from 'nginx -V'. If it cannot be obtained or the obtained path does not point to a valid, existing file, an error will be reported. In this case, you need to modify the configuration file to specify the error log path.Refer to the docs for more details: https://nginxui.com/zh_CN/guide/config-nginx.html#errorlogpath"
msgstr ""
#: src/language/generate.ts:10
msgid "Check if the nginx PID path exists. By default, this path is obtained from 'nginx -V'. If it cannot be obtained, an error will be reported. In this case, you need to modify the configuration file to specify the Nginx PID path.Refer to the docs for more details: https://nginxui.com/zh_CN/guide/config-nginx.html#pidpath"
msgstr ""
#: src/language/generate.ts:22
msgid "Check if the nginx.conf includes the conf.d directory"
msgstr ""
@ -713,15 +713,15 @@ msgstr ""
msgid "Check if the nginx.conf includes the sites-enabled directory"
msgstr ""
#: src/language/generate.ts:47
#: src/language/generate.ts:46
msgid "Check if the nginx.conf includes the streams-enabled directory"
msgstr ""
#: src/language/generate.ts:13
#: src/language/generate.ts:21
msgid "Check if the sites-available and sites-enabled directories are under the nginx configuration directory"
msgstr ""
#: src/language/generate.ts:32
#: src/language/generate.ts:23
msgid "Check if the streams-available and streams-enabled directories are under the nginx configuration directory"
msgstr ""
@ -844,7 +844,7 @@ msgstr ""
msgid "Configuration History"
msgstr ""
#: src/views/dashboard/components/PerformanceTablesCard.vue:167
#: src/views/dashboard/components/PerformanceTablesCard.vue:168
msgid "Configuration information"
msgstr ""
@ -953,7 +953,7 @@ msgstr ""
#: src/views/environments/group/columns.ts:31
#: src/views/notification/notificationColumns.tsx:45
#: src/views/preference/components/AuthSettings/Passkey.vue:95
#: src/views/preference/components/ExternalNotify/columns.ts:41
#: src/views/preference/components/ExternalNotify/columns.tsx:54
#: src/views/user/userColumns.tsx:48
msgid "Created at"
msgstr ""
@ -1014,10 +1014,6 @@ msgstr ""
msgid "Dashboard"
msgstr ""
#: src/views/install/components/InstallForm.vue:109
msgid "Database (Optional, default: database)"
msgstr ""
#: src/views/preference/tabs/CertSettings.vue:32
msgid "Days"
msgstr ""
@ -1298,7 +1294,7 @@ msgstr ""
msgid "Docker client not initialized"
msgstr ""
#: src/language/generate.ts:17
#: src/language/generate.ts:16
msgid "Docker socket exists"
msgstr ""
@ -1350,6 +1346,11 @@ msgstr ""
msgid "Duplicate to local successfully"
msgstr ""
#: src/views/dashboard/components/ModulesTable.vue:88
#: src/views/dashboard/components/ModulesTable.vue:93
msgid "Dynamic"
msgstr ""
#: src/components/StdDesign/StdDetail/StdDetail.vue:110
msgid "Edit"
msgstr ""
@ -1368,7 +1369,7 @@ msgstr ""
msgid "Edit Site"
msgstr ""
#: src/routes/modules/streams.ts:19
#: src/routes/modules/streams.ts:20
msgid "Edit Stream"
msgstr ""
@ -1377,7 +1378,7 @@ msgstr ""
msgid "Email"
msgstr ""
#: src/views/install/components/InstallForm.vue:78
#: src/views/install/components/InstallForm.vue:75
msgid "Email (*)"
msgstr ""
@ -1565,7 +1566,7 @@ msgid "External Docker Container"
msgstr ""
#: src/views/preference/Preference.vue:58
#: src/views/preference/tabs/ExternalNotify.vue:10
#: src/views/preference/tabs/ExternalNotify.vue:9
msgid "External Notify"
msgstr ""
@ -1701,7 +1702,7 @@ msgstr ""
msgid "Failed to delete certificate"
msgstr ""
#: src/language/generate.ts:22
#: src/language/generate.ts:19
msgid "Failed to delete certificate from database: %{error}"
msgstr ""
@ -1845,7 +1846,7 @@ msgstr ""
msgid "Failed to revoke certificate"
msgstr ""
#: src/language/generate.ts:45
#: src/language/generate.ts:24
msgid "Failed to revoke certificate: %{error}"
msgstr ""
@ -1965,6 +1966,10 @@ msgstr ""
msgid "Github Proxy"
msgstr ""
#: src/views/preference/components/ExternalNotify/gotify.ts:5
msgid "Gotify"
msgstr ""
#: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:67
msgid "GZIP Compression"
msgstr ""
@ -2064,7 +2069,7 @@ msgstr ""
msgid "Indexing..."
msgstr ""
#: src/views/dashboard/components/PerformanceTablesCard.vue:15
#: src/views/dashboard/components/PerformanceTablesCard.vue:16
msgid "Indicator"
msgstr ""
@ -2095,13 +2100,13 @@ msgid "Insecure Skip Verify"
msgstr ""
#: src/routes/modules/auth.ts:8
#: src/views/install/components/InstallForm.vue:124
#: src/views/install/components/InstallForm.vue:110
#: src/views/install/components/InstallHeader.vue:9
#: src/views/system/Upgrade.vue:150
msgid "Install"
msgstr ""
#: src/views/install/components/InstallForm.vue:60
#: src/views/install/components/InstallForm.vue:57
msgid "Install successfully"
msgstr ""
@ -2215,7 +2220,7 @@ msgstr ""
msgid "Key Type"
msgstr ""
#: src/views/preference/components/ExternalNotify/columns.ts:29
#: src/views/preference/components/ExternalNotify/columns.tsx:30
msgid "Language"
msgstr ""
@ -2293,6 +2298,11 @@ msgstr ""
msgid "Load successfully"
msgstr ""
#: src/views/dashboard/components/ModulesTable.vue:101
#: src/views/dashboard/components/ModulesTable.vue:106
msgid "Loaded"
msgstr ""
#: src/views/dashboard/components/ParamsOpt/ProxyCacheConfig.vue:313
msgid "Loader Files"
msgstr ""
@ -2331,7 +2341,7 @@ msgstr ""
msgid "Log"
msgstr ""
#: src/language/generate.ts:29
#: src/language/generate.ts:25
msgid "Log file %{log_path} is not a regular file. If you are using nginx-ui in docker container, please refer to https://nginxui.com/zh_CN/guide/config-nginx-log.html for more information."
msgstr ""
@ -2422,7 +2432,7 @@ msgstr ""
msgid "Manual"
msgstr ""
#: src/views/dashboard/components/PerformanceTablesCard.vue:201
#: src/views/dashboard/components/PerformanceTablesCard.vue:202
msgid "manually set"
msgstr ""
@ -2431,7 +2441,7 @@ msgid "Master"
msgstr ""
#: src/composables/usePerformanceMetrics.ts:134
#: src/views/dashboard/components/PerformanceTablesCard.vue:89
#: src/views/dashboard/components/PerformanceTablesCard.vue:90
msgid "Master process"
msgstr ""
@ -2465,7 +2475,7 @@ msgid "Maximum number of concurrent connections"
msgstr ""
#: src/composables/usePerformanceMetrics.ts:174
#: src/views/dashboard/components/PerformanceTablesCard.vue:125
#: src/views/dashboard/components/PerformanceTablesCard.vue:126
msgid "Maximum number of connections per worker process"
msgstr ""
@ -2473,7 +2483,7 @@ msgstr ""
msgid "Maximum total size of the cache"
msgstr ""
#: src/views/dashboard/components/PerformanceTablesCard.vue:195
#: src/views/dashboard/components/PerformanceTablesCard.vue:196
msgid "Maximum worker process number:"
msgstr ""
@ -2534,6 +2544,14 @@ msgstr ""
msgid "Modify Mode"
msgstr ""
#: src/views/dashboard/components/ModulesTable.vue:28
msgid "Module"
msgstr ""
#: src/views/dashboard/components/PerformanceTablesCard.vue:215
msgid "Modules"
msgstr ""
#: src/components/NgxConfigEditor/directive/DirectiveAdd.vue:51
msgid "Multi-line Directive"
msgstr ""
@ -2612,7 +2630,7 @@ msgstr ""
msgid "Nginx Access Log Path"
msgstr ""
#: src/language/generate.ts:27
#: src/language/generate.ts:36
msgid "Nginx access log path exists"
msgstr ""
@ -2640,11 +2658,11 @@ msgstr ""
msgid "Nginx config directory is not set"
msgstr ""
#: src/language/generate.ts:16
#: src/language/generate.ts:14
msgid "Nginx configuration directory exists"
msgstr ""
#: src/language/generate.ts:36
#: src/language/generate.ts:9
msgid "Nginx configuration entry file exists"
msgstr ""
@ -2674,7 +2692,7 @@ msgid "Nginx Control Mode"
msgstr ""
#: src/composables/usePerformanceMetrics.ts:149
#: src/views/dashboard/components/PerformanceTablesCard.vue:104
#: src/views/dashboard/components/PerformanceTablesCard.vue:105
msgid "Nginx CPU usage rate"
msgstr ""
@ -2682,7 +2700,7 @@ msgstr ""
msgid "Nginx Error Log Path"
msgstr ""
#: src/language/generate.ts:19
#: src/language/generate.ts:51
msgid "Nginx error log path exists"
msgstr ""
@ -2712,7 +2730,7 @@ msgid "Nginx Log Directory Whitelist"
msgstr ""
#: src/composables/usePerformanceMetrics.ts:154
#: src/views/dashboard/components/PerformanceTablesCard.vue:109
#: src/views/dashboard/components/PerformanceTablesCard.vue:110
msgid "Nginx Memory usage"
msgstr ""
@ -2720,7 +2738,7 @@ msgstr ""
msgid "Nginx PID Path"
msgstr ""
#: src/language/generate.ts:26
#: src/language/generate.ts:35
msgid "Nginx PID path exists"
msgstr ""
@ -2764,7 +2782,7 @@ msgstr ""
msgid "Nginx test failed: {0}"
msgstr ""
#: src/views/dashboard/components/PerformanceTablesCard.vue:180
#: src/views/dashboard/components/PerformanceTablesCard.vue:181
msgid "Nginx theoretical maximum performance"
msgstr ""
@ -2780,11 +2798,11 @@ msgstr ""
msgid "Nginx UI configuration has been restored and will restart automatically in a few seconds."
msgstr ""
#: src/language/generate.ts:15
#: src/language/generate.ts:38
msgid "Nginx.conf includes conf.d directory"
msgstr ""
#: src/language/generate.ts:6
#: src/language/generate.ts:29
msgid "Nginx.conf includes sites-enabled directory"
msgstr ""
@ -2860,6 +2878,11 @@ msgstr ""
msgid "Not Found"
msgstr ""
#: src/views/dashboard/components/ModulesTable.vue:102
#: src/views/dashboard/components/ModulesTable.vue:106
msgid "Not Loaded"
msgstr ""
#: src/components/CertInfo/CertInfo.vue:41
msgid "Not Valid Before: %{date}"
msgstr ""
@ -2901,8 +2924,8 @@ msgstr ""
#: src/composables/usePerformanceMetrics.ts:129
#: src/composables/usePerformanceMetrics.ts:169
#: src/views/dashboard/components/PerformanceTablesCard.vue:120
#: src/views/dashboard/components/PerformanceTablesCard.vue:84
#: src/views/dashboard/components/PerformanceTablesCard.vue:121
#: src/views/dashboard/components/PerformanceTablesCard.vue:85
msgid "Number of worker processes"
msgstr ""
@ -3006,7 +3029,7 @@ msgid "OS:"
msgstr ""
#: src/composables/usePerformanceMetrics.ts:144
#: src/views/dashboard/components/PerformanceTablesCard.vue:99
#: src/views/dashboard/components/PerformanceTablesCard.vue:100
msgid "Other Nginx processes"
msgstr ""
@ -3057,7 +3080,7 @@ msgstr ""
msgid "Password"
msgstr ""
#: src/views/install/components/InstallForm.vue:98
#: src/views/install/components/InstallForm.vue:95
msgid "Password (*)"
msgstr ""
@ -3065,7 +3088,7 @@ msgstr ""
msgid "Password incorrect"
msgstr ""
#: src/views/install/components/InstallForm.vue:42
#: src/views/install/components/InstallForm.vue:45
msgid "Password length cannot exceed 20 characters"
msgstr ""
@ -3172,16 +3195,16 @@ msgstr ""
msgid "Please input name, this will be used as the filename of the new configuration."
msgstr ""
#: src/views/install/components/InstallForm.vue:26
#: src/views/install/components/InstallForm.vue:25
msgid "Please input your E-mail!"
msgstr ""
#: src/views/install/components/InstallForm.vue:38
#: src/views/install/components/InstallForm.vue:41
#: src/views/other/Login.vue:47
msgid "Please input your password!"
msgstr ""
#: src/views/install/components/InstallForm.vue:32
#: src/views/install/components/InstallForm.vue:31
#: src/views/other/Login.vue:41
msgid "Please input your username!"
msgstr ""
@ -3254,7 +3277,7 @@ msgstr ""
msgid "Process Distribution"
msgstr ""
#: src/views/dashboard/components/PerformanceTablesCard.vue:154
#: src/views/dashboard/components/PerformanceTablesCard.vue:155
msgid "Process information"
msgstr ""
@ -3288,7 +3311,7 @@ msgid "Read dir failed: {0}"
msgstr ""
#: src/composables/usePerformanceMetrics.ts:104
#: src/views/dashboard/components/PerformanceTablesCard.vue:63
#: src/views/dashboard/components/PerformanceTablesCard.vue:64
msgid "Read requests"
msgstr ""
@ -3522,7 +3545,7 @@ msgstr ""
msgid "Renew successfully"
msgstr ""
#: src/views/dashboard/components/PerformanceTablesCard.vue:141
#: src/views/dashboard/components/PerformanceTablesCard.vue:142
msgid "Request statistics"
msgstr ""
@ -3530,6 +3553,7 @@ msgstr ""
msgid "Request timeout"
msgstr ""
#: src/constants/errors/validate.ts:2
#: src/language/constants.ts:33
msgid "Requested with wrong parameters"
msgstr ""
@ -3551,7 +3575,7 @@ msgid "Resident Set Size: Actual memory resident in physical memory, including a
msgstr ""
#: src/composables/usePerformanceMetrics.ts:109
#: src/views/dashboard/components/PerformanceTablesCard.vue:68
#: src/views/dashboard/components/PerformanceTablesCard.vue:69
msgid "Responses"
msgstr ""
@ -3734,6 +3758,14 @@ msgstr ""
msgid "SDK"
msgstr ""
#: src/language/constants.ts:62
msgid "Search"
msgstr ""
#: src/language/constants.ts:61
msgid "Search module name"
msgstr ""
#: src/views/preference/components/AuthSettings/TOTP.vue:109
msgid "Secret has been copied"
msgstr ""
@ -3867,7 +3899,7 @@ msgstr ""
msgid "Site not found"
msgstr ""
#: src/language/generate.ts:21
#: src/language/generate.ts:28
msgid "Sites directory exists"
msgstr ""
@ -3956,8 +3988,14 @@ msgstr ""
msgid "Start Restore"
msgstr ""
#: src/views/dashboard/components/ModulesTable.vue:89
#: src/views/dashboard/components/ModulesTable.vue:93
msgid "Static"
msgstr ""
#: src/views/certificate/ACMEUser.vue:65
#: src/views/certificate/CertificateList/certColumns.tsx:65
#: src/views/dashboard/components/ModulesTable.vue:97
#: src/views/environments/list/envColumns.tsx:44
#: src/views/site/site_edit/components/RightPanel/Basic.vue:28
#: src/views/site/site_list/columns.tsx:90
@ -3982,7 +4020,7 @@ msgstr ""
msgid "Stream not found"
msgstr ""
#: src/language/generate.ts:14
#: src/language/generate.ts:37
msgid "Streams directory exists"
msgstr ""
@ -4140,10 +4178,6 @@ msgstr ""
msgid "The certificate for the domain will be checked 30 minutes, and will be renewed if it has been more than 1 week or the period you set in settings since it was last issued."
msgstr ""
#: src/views/install/components/InstallForm.vue:48
msgid "The filename cannot contain the following characters: %{c}"
msgstr ""
#: src/views/preference/tabs/NodeSettings.vue:37
msgid "The ICP Number should only contain letters, unicode, numbers, hyphens, dashes, colons, and dots."
msgstr ""
@ -4211,11 +4245,11 @@ msgstr ""
msgid "The username or password is incorrect"
msgstr ""
#: src/views/dashboard/components/PerformanceTablesCard.vue:184
#: src/views/dashboard/components/PerformanceTablesCard.vue:185
msgid "Theoretical maximum concurrent connections:"
msgstr ""
#: src/views/dashboard/components/PerformanceTablesCard.vue:188
#: src/views/dashboard/components/PerformanceTablesCard.vue:189
msgid "Theoretical maximum RPS (Requests Per Second):"
msgstr ""
@ -4294,7 +4328,7 @@ msgstr ""
msgid "Tips"
msgstr ""
#: src/views/dashboard/components/PerformanceTablesCard.vue:206
#: src/views/dashboard/components/PerformanceTablesCard.vue:207
msgid "Tips: You can increase the concurrency processing capacity by increasing worker_processes or worker_connections"
msgstr ""
@ -4338,12 +4372,12 @@ msgstr[0] ""
msgstr[1] ""
#: src/composables/usePerformanceMetrics.ts:94
#: src/views/dashboard/components/PerformanceTablesCard.vue:53
#: src/views/dashboard/components/PerformanceTablesCard.vue:54
msgid "Total connections"
msgstr ""
#: src/composables/usePerformanceMetrics.ts:89
#: src/views/dashboard/components/PerformanceTablesCard.vue:48
#: src/views/dashboard/components/PerformanceTablesCard.vue:49
msgid "Total handshakes"
msgstr ""
@ -4356,7 +4390,7 @@ msgid "Total Nginx Processes"
msgstr ""
#: src/composables/usePerformanceMetrics.ts:99
#: src/views/dashboard/components/PerformanceTablesCard.vue:58
#: src/views/dashboard/components/PerformanceTablesCard.vue:59
msgid "Total requests"
msgstr ""
@ -4381,9 +4415,10 @@ msgid "Two-factor authentication required"
msgstr ""
#: src/views/certificate/CertificateList/certColumns.tsx:25
#: src/views/dashboard/components/ModulesTable.vue:84
#: src/views/nginx_log/NginxLogList.vue:14
#: src/views/notification/notificationColumns.tsx:9
#: src/views/preference/components/ExternalNotify/columns.ts:17
#: src/views/preference/components/ExternalNotify/columns.tsx:18
msgid "Type"
msgstr ""
@ -4475,17 +4510,21 @@ msgstr ""
msgid "Username"
msgstr ""
#: src/views/install/components/InstallForm.vue:88
#: src/views/install/components/InstallForm.vue:85
msgid "Username (*)"
msgstr ""
#: src/views/install/components/InstallForm.vue:35
msgid "Username length cannot exceed 255 characters"
msgstr ""
#: src/components/CertInfo/CertInfo.vue:24
#: src/views/certificate/ACMEUser.vue:124
#: src/views/certificate/CertificateList/certColumns.tsx:78
msgid "Valid"
msgstr ""
#: src/views/dashboard/components/PerformanceTablesCard.vue:21
#: src/views/dashboard/components/PerformanceTablesCard.vue:22
msgid "Value"
msgstr ""
@ -4529,7 +4568,7 @@ msgid "Viewed"
msgstr ""
#: src/composables/usePerformanceMetrics.ts:114
#: src/views/dashboard/components/PerformanceTablesCard.vue:73
#: src/views/dashboard/components/PerformanceTablesCard.vue:74
msgid "Waiting processes"
msgstr ""

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -19,87 +19,87 @@ msgstr ""
"X-Generator: Weblate 5.10.4\n"
"Generated-By: easygettext\n"
#: src/language/generate.ts:23
#: src/language/generate.ts:40
msgid "[Nginx UI] ACME User: %{name}, Email: %{email}, CA Dir: %{caDir}"
msgstr "[Nginx UI] ACME 使用者:%{name},電子郵件:%{email}CA 目錄:%{caDir}"
#: src/language/generate.ts:12
#: src/language/generate.ts:26
msgid "[Nginx UI] Backing up current certificate for later revocation"
msgstr "[Nginx UI] 正在備份當前憑證以便後續撤銷"
#: src/language/generate.ts:41
#: src/language/generate.ts:43
msgid "[Nginx UI] Certificate renewed successfully"
msgstr "[Nginx UI] 憑證更新成功"
#: src/language/generate.ts:31
#: src/language/generate.ts:8
msgid "[Nginx UI] Certificate successfully revoked"
msgstr "[Nginx UI] 證書已成功撤銷"
#: src/language/generate.ts:25
#: src/language/generate.ts:27
msgid "[Nginx UI] Certificate was used for server, reloading server TLS certificate"
msgstr "[Nginx UI] 憑證已用於伺服器,正在重新載入伺服器 TLS 憑證"
#: src/language/generate.ts:49
#: src/language/generate.ts:41
msgid "[Nginx UI] Creating client facilitates communication with the CA server"
msgstr "[Nginx UI] 創建客戶端以促進與 CA 伺服器的通信"
#: src/language/generate.ts:24
#: src/language/generate.ts:42
msgid "[Nginx UI] Environment variables cleaned"
msgstr "[Nginx UI] 環境變數已清理"
#: src/language/generate.ts:51
#: src/language/generate.ts:5
msgid "[Nginx UI] Finished"
msgstr "[Nginx UI] 已完成"
#: src/language/generate.ts:37
#: src/language/generate.ts:47
msgid "[Nginx UI] Issued certificate successfully"
msgstr "[Nginx UI] 證書簽發成功"
#: src/language/generate.ts:46
#: src/language/generate.ts:6
msgid "[Nginx UI] Obtaining certificate"
msgstr "[Nginx UI] 正在取得憑證"
#: src/language/generate.ts:42
#: src/language/generate.ts:44
msgid "[Nginx UI] Preparing for certificate revocation"
msgstr "[Nginx UI] 準備撤銷憑證"
#: src/language/generate.ts:48
#: src/language/generate.ts:12
msgid "[Nginx UI] Preparing lego configurations"
msgstr "[Nginx UI] 正在準備 lego 配置"
#: src/language/generate.ts:8
#: src/language/generate.ts:4
msgid "[Nginx UI] Reloading nginx"
msgstr "[Nginx UI] 重新載入 Nginx"
#: src/language/generate.ts:4
#: src/language/generate.ts:20
msgid "[Nginx UI] Revocation completed"
msgstr "[Nginx UI] 撤銷完成"
#: src/language/generate.ts:5
#: src/language/generate.ts:7
msgid "[Nginx UI] Revoking certificate"
msgstr "[Nginx UI] 正在撤銷證書"
#: src/language/generate.ts:9
#: src/language/generate.ts:49
msgid "[Nginx UI] Revoking old certificate"
msgstr "[Nginx UI] 正在撤銷舊憑證"
#: src/language/generate.ts:40
#: src/language/generate.ts:48
msgid "[Nginx UI] Setting DNS01 challenge provider"
msgstr "[Nginx UI] 正在設定 DNS01 驗證提供者"
#: src/language/generate.ts:50
#: src/language/generate.ts:31
msgid "[Nginx UI] Setting environment variables"
msgstr "[Nginx UI] 設定環境變數"
#: src/language/generate.ts:18
#: src/language/generate.ts:13
msgid "[Nginx UI] Setting HTTP01 challenge provider"
msgstr "[Nginx UI] 正在設定 HTTP01 驗證提供者"
#: src/language/generate.ts:30
#: src/language/generate.ts:32
msgid "[Nginx UI] Writing certificate private key to disk"
msgstr "[Nginx UI] 正在將證書私鑰寫入磁碟"
#: src/language/generate.ts:10
#: src/language/generate.ts:50
msgid "[Nginx UI] Writing certificate to disk"
msgstr "[Nginx UI] 正在將憑證寫入磁碟"
@ -141,7 +141,7 @@ msgstr "ACME 使用者"
#: src/views/environments/list/envColumns.tsx:97
#: src/views/nginx_log/NginxLogList.vue:46
#: src/views/notification/notificationColumns.tsx:66
#: src/views/preference/components/ExternalNotify/columns.ts:46
#: src/views/preference/components/ExternalNotify/columns.tsx:59
#: src/views/preference/tabs/AuthSettings.vue:30
#: src/views/site/site_list/columns.tsx:120 src/views/stream/StreamList.vue:74
#: src/views/user/userColumns.tsx:60
@ -149,7 +149,7 @@ msgid "Action"
msgstr "操作"
#: src/composables/usePerformanceMetrics.ts:84
#: src/views/dashboard/components/PerformanceTablesCard.vue:43
#: src/views/dashboard/components/PerformanceTablesCard.vue:44
msgid "Active connections"
msgstr "活躍連線"
@ -361,7 +361,7 @@ msgstr "作者"
msgid "Auto"
msgstr "自動"
#: src/views/dashboard/components/PerformanceTablesCard.vue:200
#: src/views/dashboard/components/PerformanceTablesCard.vue:201
msgid "auto = CPU cores"
msgstr "auto = CPU 核心數"
@ -499,7 +499,7 @@ msgid "Cache loader processing time threshold"
msgstr "快取載入器處理時間門檻"
#: src/composables/usePerformanceMetrics.ts:139
#: src/views/dashboard/components/PerformanceTablesCard.vue:94
#: src/views/dashboard/components/PerformanceTablesCard.vue:95
msgid "Cache manager processes"
msgstr "快取管理行程"
@ -529,7 +529,7 @@ msgid "CADir"
msgstr "CADir"
#: src/views/dashboard/components/PerformanceStatisticsCard.vue:43
#: src/views/dashboard/components/PerformanceTablesCard.vue:190
#: src/views/dashboard/components/PerformanceTablesCard.vue:191
msgid ""
"Calculated based on worker_processes * worker_connections. Actual "
"performance depends on hardware, configuration, and workload"
@ -607,7 +607,7 @@ msgstr "憑證已過期"
msgid "Certificate Expiring Soon"
msgstr "憑證即將到期"
#: src/language/generate.ts:38
#: src/language/generate.ts:18
msgid "Certificate not found: %{error}"
msgstr "找不到證書: %{error}"
@ -688,37 +688,78 @@ msgstr "檢查"
msgid "Check again"
msgstr "再次檢查"
#: src/language/generate.ts:17
msgid ""
"Check if /var/run/docker.sock exists. If you are using Nginx UI Official "
"Docker Image, please make sure the docker socket is mounted like this: `-v "
"/var/run/docker.sock:/var/run/docker.sock`. Nginx UI official image uses "
"/var/run/docker.sock to communicate with the host Docker Engine via Docker "
"Client API. This feature is used to control Nginx in another container and "
"perform container replacement rather than binary replacement during OTA "
"upgrades of Nginx UI to ensure container dependencies are also upgraded. If "
"you don't need this feature, please add the environment variable "
"NGINX_UI_IGNORE_DOCKER_SOCKET=true to the container."
msgstr ""
"檢查 /var/run/docker.sock 是否存在。如果您使用的是 Nginx UI 官方 Docker 映像,請確保以這種方式掛載 "
"Docker 通訊端:`-v /var/run/docker.sock:/var/run/docker.sock`。Nginx UI 官方映像使用 "
"/var/run/docker.sock 通過 Docker Client API 與主機 Docker Engine "
"通訊。此功能用於在另一個容器中控制 Nginx並在 Nginx UI 的 OTA "
"升級期間執行容器替換而非二進位替換,以確保容器依賴項也得到升級。如果您不需要此功能,請向容器新增環境變數 "
"NGINX_UI_IGNORE_DOCKER_SOCKET=true。"
#: src/components/SelfCheck/tasks/frontend/https-check.ts:14
msgid ""
"Check if HTTPS is enabled. Using HTTP outside localhost is insecure and "
"prevents using Passkeys and clipboard features"
msgstr "檢查是否啟用了 HTTPS。在 localhost 之外使用 HTTP 不安全,並且會阻止使用 Passkeys 和剪貼簿功能"
#: src/language/generate.ts:28
msgid "Check if the docker socket exists."
msgstr "檢查 Docker 通訊端是否存在。"
#: src/language/generate.ts:45
msgid ""
"Check if the nginx access log path exists. By default, this path is "
"obtained from 'nginx -V'. If it cannot be obtained or the obtained path "
"does not point to a valid, existing file, an error will be reported. In "
"this case, you need to modify the configuration file to specify the access "
"log path.Refer to the docs for more details: "
"https://nginxui.com/zh_CN/guide/config-nginx.html#accesslogpath"
msgstr ""
"檢查 nginx 訪問日誌路徑是否存在。預設情況下,此路徑從 'nginx -V' "
"獲取。如果無法獲取或獲取的路徑未指向有效的現有文件將報告錯誤。在這種情況下您需要修改配置文件以指定訪問日誌路徑。更多詳情請參閱文檔https://"
"nginxui.com/zh_CN/guide/config-nginx.html#accesslogpath"
#: src/language/generate.ts:44
msgid "Check if the nginx access log path exists"
msgstr "檢查 Nginx 存取日誌路徑是否存在"
#: src/language/generate.ts:35
#: src/language/generate.ts:34
msgid "Check if the nginx configuration directory exists"
msgstr "檢查 nginx 配置目錄是否存在"
#: src/language/generate.ts:43
#: src/language/generate.ts:30
msgid "Check if the nginx configuration entry file exists"
msgstr "檢查 nginx 配置入口文件是否存在"
#: src/language/generate.ts:20
msgid "Check if the nginx error log path exists"
msgstr "檢查 Nginx 錯誤日誌路徑是否存在"
#: src/language/generate.ts:15
msgid ""
"Check if the nginx error log path exists. By default, this path is obtained "
"from 'nginx -V'. If it cannot be obtained or the obtained path does not "
"point to a valid, existing file, an error will be reported. In this case, "
"you need to modify the configuration file to specify the error log "
"path.Refer to the docs for more details: "
"https://nginxui.com/zh_CN/guide/config-nginx.html#errorlogpath"
msgstr ""
"檢查 nginx 錯誤日誌路徑是否存在。預設情況下,此路徑從 'nginx -V' "
"獲取。如果無法獲取或獲取的路徑未指向有效的現有文件將報告錯誤。在這種情況下您需要修改配置文件以指定錯誤日誌路徑。有關更多詳細信息請參閱文檔htt"
"ps://nginxui.com/zh_CN/guide/config-nginx.html#errorlogpath"
#: src/language/generate.ts:7
msgid "Check if the nginx PID path exists"
msgstr "檢查 Nginx PID 路徑是否存在"
#: src/language/generate.ts:10
msgid ""
"Check if the nginx PID path exists. By default, this path is obtained from "
"'nginx -V'. If it cannot be obtained, an error will be reported. In this "
"case, you need to modify the configuration file to specify the Nginx PID "
"path.Refer to the docs for more details: "
"https://nginxui.com/zh_CN/guide/config-nginx.html#pidpath"
msgstr ""
"檢查 Nginx PID 路徑是否存在。預設情況下,該路徑是從 'nginx -V' "
"獲取的。如果無法獲取,將會報錯。在這種情況下,您需要修改設定檔以指定 Nginx PID "
"路徑。更多詳情請參閱文件https://nginxui.com/zh_CN/guide/config-nginx.html#pidpath"
#: src/language/generate.ts:34
#: src/language/generate.ts:22
msgid "Check if the nginx.conf includes the conf.d directory"
msgstr "檢查 nginx.conf 是否包含 conf.d 目錄"
@ -726,17 +767,17 @@ msgstr "檢查 nginx.conf 是否包含 conf.d 目錄"
msgid "Check if the nginx.conf includes the sites-enabled directory"
msgstr "檢查 nginx.conf 是否包含 sites-enabled 目錄"
#: src/language/generate.ts:47
#: src/language/generate.ts:46
msgid "Check if the nginx.conf includes the streams-enabled directory"
msgstr "檢查 nginx.conf 是否包含 streams-enabled 目錄"
#: src/language/generate.ts:13
#: src/language/generate.ts:21
msgid ""
"Check if the sites-available and sites-enabled directories are under the "
"nginx configuration directory"
msgstr "檢查 sites-available 和 sites-enabled 目錄是否位於 nginx 配置目錄下"
#: src/language/generate.ts:32
#: src/language/generate.ts:23
msgid ""
"Check if the streams-available and streams-enabled directories are under "
"the nginx configuration directory"
@ -861,7 +902,7 @@ msgstr "設定檔案測試成功"
msgid "Configuration History"
msgstr "設定歷史記錄"
#: src/views/dashboard/components/PerformanceTablesCard.vue:167
#: src/views/dashboard/components/PerformanceTablesCard.vue:168
msgid "Configuration information"
msgstr "設定資訊"
@ -971,7 +1012,7 @@ msgstr "建立系統備份,包括 Nginx 設定與 Nginx UI 設定。備份檔
#: src/views/environments/group/columns.ts:31
#: src/views/notification/notificationColumns.tsx:45
#: src/views/preference/components/AuthSettings/Passkey.vue:95
#: src/views/preference/components/ExternalNotify/columns.ts:41
#: src/views/preference/components/ExternalNotify/columns.tsx:54
#: src/views/user/userColumns.tsx:48
msgid "Created at"
msgstr "建立時間"
@ -1032,10 +1073,6 @@ msgstr "自訂顯示在環境指示器中的本機節點名稱。"
msgid "Dashboard"
msgstr "儀錶板"
#: src/views/install/components/InstallForm.vue:109
msgid "Database (Optional, default: database)"
msgstr "資料庫 (可選預設database)"
#: src/views/preference/tabs/CertSettings.vue:32
msgid "Days"
msgstr "天"
@ -1310,7 +1347,7 @@ msgstr "您要移除這個 Upstream 嗎?"
msgid "Docker client not initialized"
msgstr "Docker 客戶端未初始化"
#: src/language/generate.ts:17
#: src/language/generate.ts:16
msgid "Docker socket exists"
msgstr "Docker 套接字存在"
@ -1363,6 +1400,11 @@ msgstr "複製"
msgid "Duplicate to local successfully"
msgstr "成功複製至本機"
#: src/views/dashboard/components/ModulesTable.vue:88
#: src/views/dashboard/components/ModulesTable.vue:93
msgid "Dynamic"
msgstr "動態"
#: src/components/StdDesign/StdDetail/StdDetail.vue:110
msgid "Edit"
msgstr "編輯"
@ -1380,7 +1422,7 @@ msgstr "編輯設定"
msgid "Edit Site"
msgstr "編輯網站"
#: src/routes/modules/streams.ts:19
#: src/routes/modules/streams.ts:20
msgid "Edit Stream"
msgstr "編輯 Stream"
@ -1389,7 +1431,7 @@ msgstr "編輯 Stream"
msgid "Email"
msgstr "電子郵件"
#: src/views/install/components/InstallForm.vue:78
#: src/views/install/components/InstallForm.vue:75
msgid "Email (*)"
msgstr "電子郵件 (*)"
@ -1573,7 +1615,7 @@ msgid "External Docker Container"
msgstr "外部 Docker 容器"
#: src/views/preference/Preference.vue:58
#: src/views/preference/tabs/ExternalNotify.vue:10
#: src/views/preference/tabs/ExternalNotify.vue:9
msgid "External Notify"
msgstr "外部通知"
@ -1709,7 +1751,7 @@ msgstr "解密 Nginx UI 目錄失敗:{0}"
msgid "Failed to delete certificate"
msgstr "憑證刪除失敗"
#: src/language/generate.ts:22
#: src/language/generate.ts:19
msgid "Failed to delete certificate from database: %{error}"
msgstr "從資料庫刪除憑證失敗: %{error}"
@ -1853,7 +1895,7 @@ msgstr "還原 Nginx UI 檔案失敗:{0}"
msgid "Failed to revoke certificate"
msgstr "撤銷憑證失敗"
#: src/language/generate.ts:45
#: src/language/generate.ts:24
msgid "Failed to revoke certificate: %{error}"
msgstr "撤銷憑證失敗: %{error}"
@ -1974,6 +2016,10 @@ msgstr "正在取得憑證,請稍候..."
msgid "Github Proxy"
msgstr "Github 代理"
#: src/views/preference/components/ExternalNotify/gotify.ts:5
msgid "Gotify"
msgstr "Gotify"
#: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:67
msgid "GZIP Compression"
msgstr "GZIP 壓縮"
@ -2081,7 +2127,7 @@ msgstr "包含 Master 行程、工作行程、快取行程,以及其他 Nginx
msgid "Indexing..."
msgstr "建立索引中..."
#: src/views/dashboard/components/PerformanceTablesCard.vue:15
#: src/views/dashboard/components/PerformanceTablesCard.vue:16
msgid "Indicator"
msgstr "指標"
@ -2111,13 +2157,13 @@ msgid "Insecure Skip Verify"
msgstr "不安全跳過驗證"
#: src/routes/modules/auth.ts:8
#: src/views/install/components/InstallForm.vue:124
#: src/views/install/components/InstallForm.vue:110
#: src/views/install/components/InstallHeader.vue:9
#: src/views/system/Upgrade.vue:150
msgid "Install"
msgstr "安裝"
#: src/views/install/components/InstallForm.vue:60
#: src/views/install/components/InstallForm.vue:57
msgid "Install successfully"
msgstr "安裝成功"
@ -2235,7 +2281,7 @@ msgstr "Keepalive 逾時時間"
msgid "Key Type"
msgstr "金鑰類型"
#: src/views/preference/components/ExternalNotify/columns.ts:29
#: src/views/preference/components/ExternalNotify/columns.tsx:30
msgid "Language"
msgstr "語言"
@ -2313,6 +2359,11 @@ msgstr "從設定載入"
msgid "Load successfully"
msgstr "載入成功"
#: src/views/dashboard/components/ModulesTable.vue:101
#: src/views/dashboard/components/ModulesTable.vue:106
msgid "Loaded"
msgstr "已加載"
#: src/views/dashboard/components/ParamsOpt/ProxyCacheConfig.vue:313
msgid "Loader Files"
msgstr "載入器檔案"
@ -2351,7 +2402,7 @@ msgstr "Locations"
msgid "Log"
msgstr "日誌"
#: src/language/generate.ts:29
#: src/language/generate.ts:25
msgid ""
"Log file %{log_path} is not a regular file. If you are using nginx-ui in "
"docker container, please refer to "
@ -2450,7 +2501,7 @@ msgstr "管理器門檻值"
msgid "Manual"
msgstr "手動"
#: src/views/dashboard/components/PerformanceTablesCard.vue:201
#: src/views/dashboard/components/PerformanceTablesCard.vue:202
msgid "manually set"
msgstr "手動設定"
@ -2459,7 +2510,7 @@ msgid "Master"
msgstr "主行程"
#: src/composables/usePerformanceMetrics.ts:134
#: src/views/dashboard/components/PerformanceTablesCard.vue:89
#: src/views/dashboard/components/PerformanceTablesCard.vue:90
msgid "Master process"
msgstr "主行程"
@ -2493,7 +2544,7 @@ msgid "Maximum number of concurrent connections"
msgstr "最大同時連線數"
#: src/composables/usePerformanceMetrics.ts:174
#: src/views/dashboard/components/PerformanceTablesCard.vue:125
#: src/views/dashboard/components/PerformanceTablesCard.vue:126
msgid "Maximum number of connections per worker process"
msgstr "每個 worker 行程最大連線數"
@ -2501,7 +2552,7 @@ msgstr "每個 worker 行程最大連線數"
msgid "Maximum total size of the cache"
msgstr "快取總容量上限"
#: src/views/dashboard/components/PerformanceTablesCard.vue:195
#: src/views/dashboard/components/PerformanceTablesCard.vue:196
msgid "Maximum worker process number:"
msgstr "最大 worker 行程數:"
@ -2562,6 +2613,14 @@ msgstr "修改設定"
msgid "Modify Mode"
msgstr "修改模式"
#: src/views/dashboard/components/ModulesTable.vue:28
msgid "Module"
msgstr "模組"
#: src/views/dashboard/components/PerformanceTablesCard.vue:215
msgid "Modules"
msgstr "模組"
#: src/components/NgxConfigEditor/directive/DirectiveAdd.vue:51
msgid "Multi-line Directive"
msgstr "多行指令"
@ -2637,7 +2696,7 @@ msgstr "Nginx"
msgid "Nginx Access Log Path"
msgstr "Nginx 存取日誌路徑"
#: src/language/generate.ts:27
#: src/language/generate.ts:36
msgid "Nginx access log path exists"
msgstr "Nginx 訪問日誌路徑存在"
@ -2665,11 +2724,11 @@ msgstr "Nginx 設定檔未包含 stream-enabled"
msgid "Nginx config directory is not set"
msgstr "Nginx 設定目錄未設定"
#: src/language/generate.ts:16
#: src/language/generate.ts:14
msgid "Nginx configuration directory exists"
msgstr "Nginx 配置目錄存在"
#: src/language/generate.ts:36
#: src/language/generate.ts:9
msgid "Nginx configuration entry file exists"
msgstr "Nginx 設定入口檔案存在"
@ -2699,7 +2758,7 @@ msgid "Nginx Control Mode"
msgstr "Nginx 控制模式"
#: src/composables/usePerformanceMetrics.ts:149
#: src/views/dashboard/components/PerformanceTablesCard.vue:104
#: src/views/dashboard/components/PerformanceTablesCard.vue:105
msgid "Nginx CPU usage rate"
msgstr "Nginx CPU 使用率"
@ -2707,7 +2766,7 @@ msgstr "Nginx CPU 使用率"
msgid "Nginx Error Log Path"
msgstr "Nginx 錯誤日誌路徑"
#: src/language/generate.ts:19
#: src/language/generate.ts:51
msgid "Nginx error log path exists"
msgstr "Nginx 錯誤日誌路徑存在"
@ -2736,7 +2795,7 @@ msgid "Nginx Log Directory Whitelist"
msgstr "Nginx 日誌目錄白名單"
#: src/composables/usePerformanceMetrics.ts:154
#: src/views/dashboard/components/PerformanceTablesCard.vue:109
#: src/views/dashboard/components/PerformanceTablesCard.vue:110
msgid "Nginx Memory usage"
msgstr "Nginx 記憶體使用量"
@ -2744,7 +2803,7 @@ msgstr "Nginx 記憶體使用量"
msgid "Nginx PID Path"
msgstr "Nginx PID 路徑"
#: src/language/generate.ts:26
#: src/language/generate.ts:35
msgid "Nginx PID path exists"
msgstr "Nginx PID 路徑存在"
@ -2786,7 +2845,7 @@ msgstr "Nginx 測試設定指令"
msgid "Nginx test failed: {0}"
msgstr "Nginx 測試失敗: {0}"
#: src/views/dashboard/components/PerformanceTablesCard.vue:180
#: src/views/dashboard/components/PerformanceTablesCard.vue:181
msgid "Nginx theoretical maximum performance"
msgstr "Nginx 理論最大效能"
@ -2804,11 +2863,11 @@ msgid ""
"a few seconds."
msgstr "Nginx UI 設定已恢復,將在幾秒後自動重新啟動。"
#: src/language/generate.ts:15
#: src/language/generate.ts:38
msgid "Nginx.conf includes conf.d directory"
msgstr "Nginx.conf 包含 conf.d 目錄"
#: src/language/generate.ts:6
#: src/language/generate.ts:29
msgid "Nginx.conf includes sites-enabled directory"
msgstr "Nginx.conf 包含 sites-enabled 目錄"
@ -2884,6 +2943,11 @@ msgstr "不晚於"
msgid "Not Found"
msgstr "找不到頁面"
#: src/views/dashboard/components/ModulesTable.vue:102
#: src/views/dashboard/components/ModulesTable.vue:106
msgid "Not Loaded"
msgstr "未載入"
#: src/components/CertInfo/CertInfo.vue:41
msgid "Not Valid Before: %{date}"
msgstr "此前無效:%{date}"
@ -2927,8 +2991,8 @@ msgstr "快取管理器每次處理的檔案數量"
#: src/composables/usePerformanceMetrics.ts:129
#: src/composables/usePerformanceMetrics.ts:169
#: src/views/dashboard/components/PerformanceTablesCard.vue:120
#: src/views/dashboard/components/PerformanceTablesCard.vue:84
#: src/views/dashboard/components/PerformanceTablesCard.vue:121
#: src/views/dashboard/components/PerformanceTablesCard.vue:85
msgid "Number of worker processes"
msgstr "worker 行程數"
@ -3033,7 +3097,7 @@ msgid "OS:"
msgstr "作業系統:"
#: src/composables/usePerformanceMetrics.ts:144
#: src/views/dashboard/components/PerformanceTablesCard.vue:99
#: src/views/dashboard/components/PerformanceTablesCard.vue:100
msgid "Other Nginx processes"
msgstr "其他 Nginx 行程"
@ -3088,7 +3152,7 @@ msgstr ""
msgid "Password"
msgstr "密碼"
#: src/views/install/components/InstallForm.vue:98
#: src/views/install/components/InstallForm.vue:95
msgid "Password (*)"
msgstr "密碼 (*)"
@ -3096,7 +3160,7 @@ msgstr "密碼 (*)"
msgid "Password incorrect"
msgstr "密碼錯誤"
#: src/views/install/components/InstallForm.vue:42
#: src/views/install/components/InstallForm.vue:45
msgid "Password length cannot exceed 20 characters"
msgstr "密碼長度不能超過 20 個字元"
@ -3216,15 +3280,15 @@ msgid ""
"configuration."
msgstr "請輸入名稱,此名稱將用作新設定的檔案名稱。"
#: src/views/install/components/InstallForm.vue:26
#: src/views/install/components/InstallForm.vue:25
msgid "Please input your E-mail!"
msgstr "請輸入您的電子郵件!"
#: src/views/install/components/InstallForm.vue:38 src/views/other/Login.vue:47
#: src/views/install/components/InstallForm.vue:41 src/views/other/Login.vue:47
msgid "Please input your password!"
msgstr "請輸入您的密碼!"
#: src/views/install/components/InstallForm.vue:32 src/views/other/Login.vue:41
#: src/views/install/components/InstallForm.vue:31 src/views/other/Login.vue:41
msgid "Please input your username!"
msgstr "請輸入您的使用者名稱!"
@ -3294,7 +3358,7 @@ msgstr "準備 Lego 設定"
msgid "Process Distribution"
msgstr "行程分布"
#: src/views/dashboard/components/PerformanceTablesCard.vue:154
#: src/views/dashboard/components/PerformanceTablesCard.vue:155
msgid "Process information"
msgstr "行程資訊"
@ -3327,7 +3391,7 @@ msgid "Read dir failed: {0}"
msgstr "讀取目錄失敗: {0}"
#: src/composables/usePerformanceMetrics.ts:104
#: src/views/dashboard/components/PerformanceTablesCard.vue:63
#: src/views/dashboard/components/PerformanceTablesCard.vue:64
msgid "Read requests"
msgstr "讀取請求"
@ -3563,7 +3627,7 @@ msgstr "更新憑證成功"
msgid "Renew successfully"
msgstr "更新成功"
#: src/views/dashboard/components/PerformanceTablesCard.vue:141
#: src/views/dashboard/components/PerformanceTablesCard.vue:142
msgid "Request statistics"
msgstr "請求統計"
@ -3571,7 +3635,7 @@ msgstr "請求統計"
msgid "Request timeout"
msgstr "請求逾時"
#: src/language/constants.ts:33
#: src/constants/errors/validate.ts:2 src/language/constants.ts:33
msgid "Requested with wrong parameters"
msgstr "請求參數錯誤"
@ -3595,7 +3659,7 @@ msgid ""
msgstr "常駐集大小:實際存在於實體記憶體中的記憶體,包含所有共用函式庫記憶體,這些記憶體會在多個行程間重複計算"
#: src/composables/usePerformanceMetrics.ts:109
#: src/views/dashboard/components/PerformanceTablesCard.vue:68
#: src/views/dashboard/components/PerformanceTablesCard.vue:69
msgid "Responses"
msgstr "回應"
@ -3779,6 +3843,14 @@ msgstr "用手機掃描二維碼將賬戶新增到應用程式中。"
msgid "SDK"
msgstr "SDK"
#: src/language/constants.ts:62
msgid "Search"
msgstr "搜尋"
#: src/language/constants.ts:61
msgid "Search module name"
msgstr "搜尋模組名稱"
#: src/views/preference/components/AuthSettings/TOTP.vue:109
msgid "Secret has been copied"
msgstr "金鑰已複製"
@ -3920,7 +3992,7 @@ msgstr "網站日誌"
msgid "Site not found"
msgstr "站點未找到"
#: src/language/generate.ts:21
#: src/language/generate.ts:28
msgid "Sites directory exists"
msgstr "站點目錄存在"
@ -4008,8 +4080,14 @@ msgstr "穩定"
msgid "Start Restore"
msgstr "開始恢復"
#: src/views/dashboard/components/ModulesTable.vue:89
#: src/views/dashboard/components/ModulesTable.vue:93
msgid "Static"
msgstr "靜態"
#: src/views/certificate/ACMEUser.vue:65
#: src/views/certificate/CertificateList/certColumns.tsx:65
#: src/views/dashboard/components/ModulesTable.vue:97
#: src/views/environments/list/envColumns.tsx:44
#: src/views/site/site_edit/components/RightPanel/Basic.vue:28
#: src/views/site/site_list/columns.tsx:90 src/views/stream/StreamList.vue:47
@ -4033,7 +4111,7 @@ msgstr "串流已啟用"
msgid "Stream not found"
msgstr "串流未找到"
#: src/language/generate.ts:14
#: src/language/generate.ts:37
msgid "Streams directory exists"
msgstr "Streams 目錄存在"
@ -4194,10 +4272,6 @@ msgid ""
"since it was last issued."
msgstr "網域憑證將在 30 分鐘內接受檢查,如果自上次簽發以來已超過 1 週或您在設定中設定的時間,憑證將會自動更新。"
#: src/views/install/components/InstallForm.vue:48
msgid "The filename cannot contain the following characters: %{c}"
msgstr "檔名不能包含以下字元:%{c}"
#: src/views/preference/tabs/NodeSettings.vue:37
msgid ""
"The ICP Number should only contain letters, unicode, numbers, hyphens, "
@ -4280,11 +4354,11 @@ msgstr "網址無效。"
msgid "The username or password is incorrect"
msgstr "使用者名稱或密碼不正確"
#: src/views/dashboard/components/PerformanceTablesCard.vue:184
#: src/views/dashboard/components/PerformanceTablesCard.vue:185
msgid "Theoretical maximum concurrent connections:"
msgstr "理論最大並發連接數:"
#: src/views/dashboard/components/PerformanceTablesCard.vue:188
#: src/views/dashboard/components/PerformanceTablesCard.vue:189
msgid "Theoretical maximum RPS (Requests Per Second):"
msgstr "理論最大 RPS每秒請求數"
@ -4376,7 +4450,7 @@ msgstr "節流"
msgid "Tips"
msgstr "提示"
#: src/views/dashboard/components/PerformanceTablesCard.vue:206
#: src/views/dashboard/components/PerformanceTablesCard.vue:207
msgid ""
"Tips: You can increase the concurrency processing capacity by increasing "
"worker_processes or worker_connections"
@ -4437,12 +4511,12 @@ msgid_plural "Total %{total} items"
msgstr[0] "總計 %{total} 項"
#: src/composables/usePerformanceMetrics.ts:94
#: src/views/dashboard/components/PerformanceTablesCard.vue:53
#: src/views/dashboard/components/PerformanceTablesCard.vue:54
msgid "Total connections"
msgstr "總連線數"
#: src/composables/usePerformanceMetrics.ts:89
#: src/views/dashboard/components/PerformanceTablesCard.vue:48
#: src/views/dashboard/components/PerformanceTablesCard.vue:49
msgid "Total handshakes"
msgstr "總握手次數"
@ -4455,7 +4529,7 @@ msgid "Total Nginx Processes"
msgstr "Nginx 行程總數"
#: src/composables/usePerformanceMetrics.ts:99
#: src/views/dashboard/components/PerformanceTablesCard.vue:58
#: src/views/dashboard/components/PerformanceTablesCard.vue:59
msgid "Total requests"
msgstr "總請求數"
@ -4482,9 +4556,10 @@ msgid "Two-factor authentication required"
msgstr "需要多重因素驗證"
#: src/views/certificate/CertificateList/certColumns.tsx:25
#: src/views/dashboard/components/ModulesTable.vue:84
#: src/views/nginx_log/NginxLogList.vue:14
#: src/views/notification/notificationColumns.tsx:9
#: src/views/preference/components/ExternalNotify/columns.ts:17
#: src/views/preference/components/ExternalNotify/columns.tsx:18
msgid "Type"
msgstr "類型"
@ -4572,17 +4647,21 @@ msgstr "使用者未啟用 OTP 作為雙重身份驗證 (2FA)"
msgid "Username"
msgstr "使用者名稱"
#: src/views/install/components/InstallForm.vue:88
#: src/views/install/components/InstallForm.vue:85
msgid "Username (*)"
msgstr "使用者名稱 (*)"
#: src/views/install/components/InstallForm.vue:35
msgid "Username length cannot exceed 255 characters"
msgstr "使用者名稱長度不能超過255個字元"
#: src/components/CertInfo/CertInfo.vue:24
#: src/views/certificate/ACMEUser.vue:124
#: src/views/certificate/CertificateList/certColumns.tsx:78
msgid "Valid"
msgstr "有效"
#: src/views/dashboard/components/PerformanceTablesCard.vue:21
#: src/views/dashboard/components/PerformanceTablesCard.vue:22
msgid "Value"
msgstr "數值"
@ -4626,7 +4705,7 @@ msgid "Viewed"
msgstr "已檢視"
#: src/composables/usePerformanceMetrics.ts:114
#: src/views/dashboard/components/PerformanceTablesCard.vue:73
#: src/views/dashboard/components/PerformanceTablesCard.vue:74
msgid "Waiting processes"
msgstr "等待過程"
@ -4708,8 +4787,7 @@ msgstr "worker 行程"
msgid "Workers"
msgstr "worker"
#: src/layouts/HeaderLayout.vue:62
#: src/routes/index.ts:56
#: src/layouts/HeaderLayout.vue:62 src/routes/index.ts:56
#: src/views/workspace/WorkSpace.vue:52
msgid "Workspace"
msgstr "工作區"
@ -4787,6 +4865,32 @@ msgstr "您的舊代碼將不再有效。"
msgid "Your passkeys"
msgstr "您的通行金鑰"
#~ msgid ""
#~ "Check if /var/run/docker.sock exists. If you are using Nginx UI Official "
#~ "Docker Image, please make sure the docker socket is mounted like this: `-v "
#~ "/var/run/docker.sock:/var/run/docker.sock`."
#~ msgstr ""
#~ "檢查 /var/run/docker.sock 是否存在。如果您正在使用 Nginx UI 官方 Docker 映像,請確保 Docker "
#~ "通訊端已掛載如下:`-v /var/run/docker.sock:/var/run/docker.sock`。"
#~ msgid "Check if the nginx access log path exists"
#~ msgstr "檢查 Nginx 存取日誌路徑是否存在"
#~ msgid "Check if the nginx error log path exists"
#~ msgstr "檢查 Nginx 錯誤日誌路徑是否存在"
#~ msgid "Check if the nginx PID path exists"
#~ msgstr "檢查 Nginx PID 路徑是否存在"
#~ msgid "Check if the docker socket exists."
#~ msgstr "檢查 Docker 通訊端是否存在。"
#~ msgid "Database (Optional, default: database)"
#~ msgstr "資料庫 (可選預設database)"
#~ msgid "The filename cannot contain the following characters: %{c}"
#~ msgstr "檔名不能包含以下字元:%{c}"
#~ msgid "Unknown issue"
#~ msgstr "未知問題"
@ -4809,14 +4913,6 @@ msgstr "您的通行金鑰"
#~ msgid "Indexed"
#~ msgstr "已建立索引"
#~ msgid ""
#~ "Check if /var/run/docker.sock exists. If you are using Nginx UI Official "
#~ "Docker Image, please make sure the docker socket is mounted like this: `-v "
#~ "/var/run/docker.sock:/var/run/docker.sock`."
#~ msgstr ""
#~ "檢查 /var/run/docker.sock 是否存在。如果您正在使用 Nginx UI 官方 Docker 映像,請確保 Docker "
#~ "通訊端已掛載如下:`-v /var/run/docker.sock:/var/run/docker.sock`。"
#, fuzzy
#~ msgid "Nginx Conf Include Conf.d"
#~ msgstr "Nginx 設定檔包含 Conf.d"

View file

@ -1,10 +1,12 @@
<script setup lang="ts">
import type { NgxModule } from '@/api/ngx'
import type { IconComponentProps } from '@ant-design/icons-vue/es/components/Icon'
import type { AntdIconType } from '@ant-design/icons-vue/lib/components/AntdIcon'
import type { Key } from 'ant-design-vue/es/_util/type'
import type { ComputedRef, Ref } from 'vue'
import EnvIndicator from '@/components/EnvIndicator/EnvIndicator.vue'
import Logo from '@/components/Logo/Logo.vue'
import ngx from '@/api/ngx'
import EnvIndicator from '@/components/EnvIndicator'
import Logo from '@/components/Logo'
import { useGlobalStore } from '@/pinia/moudule/global'
import { routes } from '@/routes'
const route = useRoute()
@ -47,6 +49,19 @@ interface Sidebar {
children: Sidebar[]
}
const globalStore = useGlobalStore()
const { modules, modulesMap } = storeToRefs(globalStore)
onMounted(() => {
ngx.get_modules().then(r => {
modules.value = r
modulesMap.value = r.reduce((acc, m) => {
acc[m.name] = m
return acc
}, {} as Record<string, NgxModule>)
})
})
const visible: ComputedRef<Sidebar[]> = computed(() => {
const res: Sidebar[] = [];
@ -56,6 +71,11 @@ const visible: ComputedRef<Sidebar[]> = computed(() => {
return
}
if (s.meta && s.meta.modules && s.meta.modules?.length > 0
&& !s.meta.modules.every(m => modulesMap.value[m]?.loaded)) {
return
}
const t: Sidebar = {
path: s.path,
name: s.name as string,
@ -69,6 +89,11 @@ const visible: ComputedRef<Sidebar[]> = computed(() => {
return
}
if (c.meta && c.meta.modules && c.meta.modules?.length > 0
&& !c.meta.modules.every(m => modulesMap.value[m]?.loaded)) {
return
}
t.children.push((c as unknown as Sidebar))
})
res.push(t)

View file

@ -1,3 +1,4 @@
import type { NgxModule } from '@/api/ngx'
import type { NginxStatus } from '@/constants'
import { defineStore } from 'pinia'
@ -15,8 +16,14 @@ export const useGlobalStore = defineStore('global', () => {
index_scanning: false,
auto_cert_processing: false,
})
const modules = ref<NgxModule[]>([])
const modulesMap = ref<Record<string, NgxModule>>({})
return {
nginxStatus,
processingStatus,
modules,
modulesMap,
}
})

View file

@ -9,6 +9,7 @@ export const streamsRoutes: RouteRecordRaw[] = [
meta: {
name: () => $gettext('Manage Streams'),
icon: ShareAltOutlined,
modules: ['stream'],
},
},
{
@ -19,6 +20,7 @@ export const streamsRoutes: RouteRecordRaw[] = [
name: () => $gettext('Edit Stream'),
hiddenInSidebar: true,
lastRouteName: 'Manage Streams',
modules: ['stream'],
},
},
]

View file

@ -17,5 +17,6 @@ declare module 'vue-router' {
status_code?: number
error?: () => string
lastRouteName?: string
modules?: string[]
}
}

View file

@ -1 +1 @@
{"version":"2.0.0-rc.6","build_id":2,"total_build":418}
{"version":"2.0.0-rc.7","build_id":1,"total_build":419}

View file

@ -0,0 +1,122 @@
<script setup lang="tsx">
import type { CustomRender } from '@/components/StdDesign/StdDataDisplay/StdTableTransformer'
import type { TableColumnType } from 'ant-design-vue'
import type { FilterResetProps } from 'ant-design-vue/es/table/interface'
import { useGlobalStore } from '@/pinia'
import { SearchOutlined } from '@ant-design/icons-vue'
import { Button as AButton, Input as AInput } from 'ant-design-vue'
const globalStore = useGlobalStore()
const { modules } = storeToRefs(globalStore)
const searchText = ref('')
const searchInput = ref<HTMLInputElement>()
function handleSearch(selectedKeys: string[], confirm: () => void) {
confirm()
searchText.value = selectedKeys[0]
}
function handleReset(clearFilters?: (param?: FilterResetProps) => void) {
clearFilters?.({ confirm: true })
searchText.value = ''
}
// Modules columns
const modulesColumns: TableColumnType[] = [
{
title: $gettext('Module'),
dataIndex: 'name',
width: '800px',
filterDropdown: ({ setSelectedKeys, selectedKeys, confirm, clearFilters }) => (
<div style="padding: 8px">
<AInput
ref={searchInput}
value={selectedKeys[0]}
placeholder={$gettext('Search module name')}
style="width: 188px; margin-bottom: 8px; display: block;"
onInput={e => setSelectedKeys(e.target.value ? [e.target.value] : [])}
onPressEnter={() => handleSearch(selectedKeys as string[], confirm)}
class="mb-2"
/>
<div class="flex justify-between">
<AButton
type="primary"
onClick={() => handleSearch(selectedKeys as string[], confirm)}
size="small"
class="mr-2"
>
{$gettext('Search')}
</AButton>
<AButton
onClick={() => handleReset(clearFilters)}
size="small"
>
{$gettext('Reset')}
</AButton>
</div>
</div>
),
filterIcon: filtered => (
<SearchOutlined style={{ color: filtered ? '#1890ff' : undefined }} />
),
onFilter: (value, record) =>
record.name && record.name.toString().toLowerCase().includes((value as string).toLowerCase()),
onFilterDropdownVisibleChange: visible => {
if (visible) {
setTimeout(() => {
if (searchInput.value) {
searchInput.value.focus()
}
}, 100)
}
},
customRender: (args: CustomRender) => {
return (
<div>
<div>{args.record.name}</div>
<div class="text-sm text-gray-500">{args.record.params}</div>
</div>
)
},
},
{
title: $gettext('Type'),
dataIndex: 'dynamic',
width: '100px',
filters: [
{ text: $gettext('Dynamic'), value: true },
{ text: $gettext('Static'), value: false },
],
onFilter: (value, record) => record.dynamic === value,
customRender: ({ record }) => {
return <span>{record.dynamic ? $gettext('Dynamic') : $gettext('Static')}</span>
},
},
{
title: $gettext('Status'),
dataIndex: 'loaded',
width: '100px',
filters: [
{ text: $gettext('Loaded'), value: true },
{ text: $gettext('Not Loaded'), value: false },
],
onFilter: (value, record) => record.loaded === value,
customRender: ({ record }) => {
return <span>{record.loaded ? $gettext('Loaded') : $gettext('Not Loaded')}</span>
},
},
]
</script>
<template>
<div class="overflow-x-auto">
<ATable
:columns="modulesColumns"
:data-source="modules"
:pagination="false"
size="middle"
:scroll="{ x: '100%' }"
/>
</div>
</template>

View file

@ -1,7 +1,8 @@
<script setup lang="ts">
<script setup lang="tsx">
import type { NginxPerformanceInfo } from '@/api/ngx'
import type { TableColumnType } from 'ant-design-vue'
import { InfoCircleOutlined } from '@ant-design/icons-vue'
import ModulesTable from './ModulesTable.vue'
const props = defineProps<{
nginxInfo: NginxPerformanceInfo
@ -209,6 +210,17 @@ const maxRPS = computed(() => {
</AAlert>
</div>
</ATabPane>
<!-- Modules information -->
<ATabPane key="modules" :tab="$gettext('Modules')">
<ModulesTable />
</ATabPane>
</ATabs>
</ACard>
</template>
<style lang="less" scoped>
:deep(.ant-tabs-tab) {
padding-top: 0;
}
</style>

View file

@ -2,6 +2,7 @@ import type { Column } from '@/components/StdDesign/types'
import { datetime, mask } from '@/components/StdDesign/StdDataDisplay/StdTableTransformer'
import { select } from '@/components/StdDesign/StdDataEntry'
import gettext from '@/gettext'
import ExternalNotifyEditor from './ExternalNotifyEditor.vue'
import configMap from './index'
const languageAvailable = gettext.available
@ -36,6 +37,18 @@ const columns: Column[] = [
},
},
},
{
dataIndex: 'config',
edit: {
type: (_, record) => {
if (!record.config) {
record.config = {}
}
return <ExternalNotifyEditor v-model={record.config} type={record.type} />
},
},
hiddenInTable: true,
},
{
dataIndex: 'created_at',
title: () => $gettext('Created at'),

View file

@ -0,0 +1,22 @@
// This file is auto-generated by notification generator. DO NOT EDIT.
import type { ExternalNotifyConfig } from './types'
const GotifyConfig: ExternalNotifyConfig = {
name: () => $gettext('Gotify'),
config: [
{
key: 'url',
label: 'URL',
},
{
key: 'token',
label: 'Token',
},
{
key: 'priority',
label: 'Priority',
},
],
}
export default GotifyConfig

View file

@ -1,6 +1,7 @@
// This file is auto-generated by notification generator. DO NOT EDIT.
import BarkConfig from './bark'
import DingTalkConfig from './dingtalk'
import GotifyConfig from './gotify'
import LarkConfig from './lark'
import LarkCustomConfig from './lark_custom'
import TelegramConfig from './telegram'
@ -8,6 +9,7 @@ import TelegramConfig from './telegram'
const configMap = {
bark: BarkConfig,
dingtalk: DingTalkConfig,
gotify: GotifyConfig,
lark: LarkConfig,
lark_custom: LarkCustomConfig,
telegram: TelegramConfig,

View file

@ -4,6 +4,10 @@ import type { ExternalNotifyConfig } from './types'
const LarkCustomConfig: ExternalNotifyConfig = {
name: () => $gettext('Lark Custom'),
config: [
{
key: 'domain',
label: 'Domain',
},
{
key: 'app_id',
label: 'App ID',

View file

@ -1,7 +1,6 @@
<script setup lang="ts">
import externalNotify from '@/api/external_notify'
import { StdCurd } from '@/components/StdDesign/StdDataDisplay'
import ExternalNotifyEditor from '../components/ExternalNotify'
import columns from '../components/ExternalNotify/columns'
</script>
@ -12,14 +11,7 @@ import columns from '../components/ExternalNotify/columns'
:api="externalNotify"
disable-view
disable-query-params
>
<template #edit="{ data }">
<ExternalNotifyEditor
v-model="data.config"
:type="data.type"
/>
</template>
</StdCurd>
/>
</template>
<style scoped lang="less"></style>

View file

@ -3,6 +3,7 @@ package main
import (
"archive/zip"
"encoding/json"
"fmt"
"io"
"net/http"
@ -17,9 +18,14 @@ import (
"github.com/uozi-tech/cosy/logger"
)
// GitHubRelease represents the structure of GitHub's release API response
type GitHubRelease struct {
TagName string `json:"tag_name"`
}
const (
repoURL = "https://github.com/go-acme/lego/archive/refs/heads/master.zip"
configDir = "internal/cert/config"
githubAPIURL = "https://api.github.com/repos/go-acme/lego/releases/latest"
configDir = "internal/cert/config"
)
func main() {
@ -32,13 +38,21 @@ func main() {
}
basePath := filepath.Join(filepath.Dir(file), "../../")
zipFile, err := downloadAndExtract()
// Get the latest release tag
tag, err := getLatestReleaseTag()
if err != nil {
logger.Errorf("Error getting latest release tag: %v\n", err)
os.Exit(1)
}
logger.Infof("Latest release tag: %s", tag)
zipFile, err := downloadAndExtract(tag)
if err != nil {
logger.Errorf("Error downloading and extracting: %v\n", err)
os.Exit(1)
}
if err := copyTomlFiles(zipFile, basePath); err != nil {
if err := copyTomlFiles(zipFile, basePath, tag); err != nil {
logger.Errorf("Error copying TOML files: %v\n", err)
os.Exit(1)
}
@ -46,11 +60,48 @@ func main() {
logger.Info("Successfully updated provider config")
}
// downloadAndExtract downloads the lego repository and extracts it
func downloadAndExtract() (string, error) {
// getLatestReleaseTag fetches the latest release tag from GitHub API
func getLatestReleaseTag() (string, error) {
logger.Info("Fetching latest release tag...")
req, err := http.NewRequest("GET", githubAPIURL, nil)
if err != nil {
return "", err
}
// Add User-Agent header to avoid GitHub API limitations
req.Header.Set("User-Agent", "NGINX-UI-LegoConfigure")
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
return "", err
}
defer resp.Body.Close()
if resp.StatusCode != http.StatusOK {
return "", fmt.Errorf("bad status from GitHub API: %s", resp.Status)
}
var release GitHubRelease
if err := json.NewDecoder(resp.Body).Decode(&release); err != nil {
return "", err
}
if release.TagName == "" {
return "", fmt.Errorf("no tag name found in the latest release")
}
return release.TagName, nil
}
// downloadAndExtract downloads the lego repository for a specific tag and extracts it
func downloadAndExtract(tag string) (string, error) {
downloadURL := fmt.Sprintf("https://github.com/go-acme/lego/archive/refs/tags/%s.zip", tag)
// Download the file
logger.Info("Downloading lego repository...")
resp, err := http.Get(repoURL)
logger.Infof("Downloading lego repository for tag %s...", tag)
resp, err := http.Get(downloadURL)
if err != nil {
return "", err
}
@ -61,7 +112,7 @@ func downloadAndExtract() (string, error) {
}
// Create the file
out, err := os.CreateTemp("", "lego-master.zip")
out, err := os.CreateTemp("", "lego-"+tag+".zip")
if err != nil {
return "", err
}
@ -76,7 +127,7 @@ func downloadAndExtract() (string, error) {
return out.Name(), nil
}
func copyTomlFiles(zipFile, basePath string) error {
func copyTomlFiles(zipFile, basePath, tag string) error {
// Open the zip file
logger.Info("Extracting files...")
zipReader, err := zip.OpenReader(zipFile)
@ -86,9 +137,10 @@ func copyTomlFiles(zipFile, basePath string) error {
defer zipReader.Close()
// Extract files
tag = strings.TrimPrefix(tag, "v")
zfs := zipfs.New(&zipReader.Reader)
afero.Walk(zfs, "./lego-master/providers", func(path string, info os.FileInfo, err error) error {
if info.IsDir() {
afero.Walk(zfs, "./lego-"+tag+"/providers", func(path string, info os.FileInfo, err error) error {
if info == nil || info.IsDir() {
return nil
}
if !strings.HasSuffix(info.Name(), ".toml") {

View file

@ -90,7 +90,7 @@ We recommend configuring it as a daemon or using the [installation script](./ins
### Config
```shell
echo '[server]\nHttpPort = 9000' > app.ini
echo '[server]\nPort = 9000' > app.ini
```
::: tip

View file

@ -90,8 +90,11 @@ bash -c "$(curl -L https://raw.githubusercontent.com/0xJacky/nginx-ui/main/insta
## Control Service
By this script, the Nginx UI will be installed as `nginx-ui` service in systemd.
Please use the follow `systemctl` command to control it.
By this script, the Nginx UI will be installed as a service. The installation script detects your system's service manager and sets up the appropriate service control mechanism.
### Systemd
If your system uses systemd, please use the following `systemctl` commands to control it:
::: code-group
@ -111,4 +114,60 @@ systemctl restart nginx-ui
systemctl status nginx-ui
```
```shell [Enable at Boot]
systemctl enable nginx-ui
```
:::
### OpenRC
If your system uses OpenRC, please use the following `rc-service` commands to control it:
::: code-group
```shell [Start]
rc-service nginx-ui start
```
```shell [Stop]
rc-service nginx-ui stop
```
```shell [Restart]
rc-service nginx-ui restart
```
```shell [Show Status]
rc-service nginx-ui status
```
```shell [Enable at Boot]
rc-update add nginx-ui default
```
:::
### Init.d
If your system uses traditional init.d scripts, please use the following commands to control it:
::: code-group
```shell [Start]
/etc/init.d/nginx-ui start
```
```shell [Stop]
/etc/init.d/nginx-ui stop
```
```shell [Restart]
/etc/init.d/nginx-ui restart
```
```shell [Show Status]
/etc/init.d/nginx-ui status
```
:::

View file

@ -36,6 +36,7 @@ server {
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_pass http://127.0.0.1:9000/;
proxy_buffering off;
}
}
```

View file

@ -11,7 +11,7 @@
"vue": "^3.5.13"
},
"devDependencies": {
"@types/node": "^22.15.3",
"@types/node": "^22.15.16",
"less": "^4.3.0"
},
"license": "AGPL-3.0",

26
docs/pnpm-lock.yaml generated
View file

@ -10,14 +10,14 @@ importers:
dependencies:
vitepress:
specifier: ^1.6.3
version: 1.6.3(@algolia/client-search@5.15.0)(@types/node@22.15.3)(less@4.3.0)(postcss@8.4.49)(search-insights@2.13.0)
version: 1.6.3(@algolia/client-search@5.15.0)(@types/node@22.15.16)(less@4.3.0)(postcss@8.4.49)(search-insights@2.13.0)
vue:
specifier: ^3.5.13
version: 3.5.13
devDependencies:
'@types/node':
specifier: ^22.15.3
version: 22.15.3
specifier: ^22.15.16
version: 22.15.16
less:
specifier: ^4.3.0
version: 4.3.0
@ -415,8 +415,8 @@ packages:
'@types/mdurl@2.0.0':
resolution: {integrity: sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==}
'@types/node@22.15.3':
resolution: {integrity: sha512-lX7HFZeHf4QG/J7tBZqrCAXwz9J5RD56Y6MpP0eJkka8p+K0RY/yBTW7CYFJ4VGCclxqOLKmiGP5juQc6MKgcw==}
'@types/node@22.15.16':
resolution: {integrity: sha512-3pr+KjwpVujqWqOKT8mNR+rd09FqhBLwg+5L/4t0cNYBzm/yEiYGCxWttjaPBsLtAo+WFNoXzGJfolM1JuRXoA==}
'@types/unist@3.0.3':
resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==}
@ -1176,7 +1176,7 @@ snapshots:
'@types/mdurl@2.0.0': {}
'@types/node@22.15.3':
'@types/node@22.15.16':
dependencies:
undici-types: 6.21.0
@ -1186,9 +1186,9 @@ snapshots:
'@ungap/structured-clone@1.2.0': {}
'@vitejs/plugin-vue@5.2.1(vite@5.4.14(@types/node@22.15.3)(less@4.3.0))(vue@3.5.13)':
'@vitejs/plugin-vue@5.2.1(vite@5.4.14(@types/node@22.15.16)(less@4.3.0))(vue@3.5.13)':
dependencies:
vite: 5.4.14(@types/node@22.15.3)(less@4.3.0)
vite: 5.4.14(@types/node@22.15.16)(less@4.3.0)
vue: 3.5.13
'@vue/compiler-core@3.5.13':
@ -1629,17 +1629,17 @@ snapshots:
'@types/unist': 3.0.3
vfile-message: 4.0.2
vite@5.4.14(@types/node@22.15.3)(less@4.3.0):
vite@5.4.14(@types/node@22.15.16)(less@4.3.0):
dependencies:
esbuild: 0.21.5
postcss: 8.4.49
rollup: 4.27.4
optionalDependencies:
'@types/node': 22.15.3
'@types/node': 22.15.16
fsevents: 2.3.3
less: 4.3.0
vitepress@1.6.3(@algolia/client-search@5.15.0)(@types/node@22.15.3)(less@4.3.0)(postcss@8.4.49)(search-insights@2.13.0):
vitepress@1.6.3(@algolia/client-search@5.15.0)(@types/node@22.15.16)(less@4.3.0)(postcss@8.4.49)(search-insights@2.13.0):
dependencies:
'@docsearch/css': 3.8.2
'@docsearch/js': 3.8.2(@algolia/client-search@5.15.0)(search-insights@2.13.0)
@ -1648,7 +1648,7 @@ snapshots:
'@shikijs/transformers': 2.1.0
'@shikijs/types': 2.1.0
'@types/markdown-it': 14.1.2
'@vitejs/plugin-vue': 5.2.1(vite@5.4.14(@types/node@22.15.3)(less@4.3.0))(vue@3.5.13)
'@vitejs/plugin-vue': 5.2.1(vite@5.4.14(@types/node@22.15.16)(less@4.3.0))(vue@3.5.13)
'@vue/devtools-api': 7.7.0
'@vue/shared': 3.5.13
'@vueuse/core': 12.5.0
@ -1657,7 +1657,7 @@ snapshots:
mark.js: 8.11.1
minisearch: 7.1.1
shiki: 2.1.0
vite: 5.4.14(@types/node@22.15.3)(less@4.3.0)
vite: 5.4.14(@types/node@22.15.16)(less@4.3.0)
vue: 3.5.13
optionalDependencies:
postcss: 8.4.49

View file

@ -82,7 +82,7 @@ docker run -dit \
### 配置
```shell
echo '[server]\nHttpPort = 9000' > app.ini
echo '[server]\nPort = 9000' > app.ini
```
::: tip 提示

View file

@ -22,20 +22,10 @@ install.sh install [OPTIONS]
| `-p, --proxy <url>` | 通过代理服务器下载 (`string`)<br/>例如:`-p http://127.0.0.1:8118``-p socks5://127.0.0.1:1080` |
| `-r, --reverse-proxy` | 通过反向代理服务器下载 (`string`)<br/>例如:`-r https://cloud.nginxui.com/` |
### 使用反向代理加速
如果您在中国大陆,可能会遇到 GitHub 的网络问题。您可以通过以下命令设置代理服务器下载 Nginx UI以加快下载速度。
```bash
export GH_PROXY=https://ghfast.top/
```
当以上地址不可用时,请检视 [GitHub Proxy](https://ghproxy.link/) 获得最新地址,或根据实际情况选择其他代理。
### 快速使用
```shell
bash -c "$(curl -L ${GH_PROXY}https://raw.githubusercontent.com/0xJacky/nginx-ui/main/install.sh)" @ install
bash -c "$(curl -L https://cloud.nginxui.com/https://raw.githubusercontent.com/0xJacky/nginx-ui/main/install.sh)" @ install -r https://cloud.nginxui.com/
```
一键安装脚本默认设置的监听端口为 `9000`HTTP Challenge 端口默认为 `9180`。如果有端口冲突,请手动修改 `/usr/local/etc/nginx-ui/app.ini`
@ -65,12 +55,12 @@ install.sh remove [OPTIONS]
```shell [移除]
# 删除 Nginx UI但不包括配置和数据库文件
bash -c "$(curl -L ${GH_PROXY}https://raw.githubusercontent.com/0xJacky/nginx-ui/main/install.sh)" @ remove
bash -c "$(curl -L https://cloud.nginxui.com/https://raw.githubusercontent.com/0xJacky/nginx-ui/main/install.sh)" @ remove
```
```shell [清除]
# 删除所有 Nginx UI 文件,包括配置和数据库文件
bash -c "$(curl -L ${GH_PROXY}https://raw.githubusercontent.com/0xJacky/nginx-ui/main/install.sh)" @ remove --purge
bash -c "$(curl -L https://cloud.nginxui.com/https://raw.githubusercontent.com/0xJacky/nginx-ui/main/install.sh)" @ remove --purge
```
:::
@ -90,12 +80,16 @@ install.sh help
### 快速使用
```shell
bash -c "$(curl -L -s ${GH_PROXY}https://raw.githubusercontent.com/0xJacky/nginx-ui/main/install.sh)" @ help
bash -c "$(curl -L -s https://cloud.nginxui.com/https://raw.githubusercontent.com/0xJacky/nginx-ui/main/install.sh)" @ help
```
## 控制服务
通过此脚本Nginx UI 将作为 `nginx-ui` 服务安装在 systemd 中。请使用以下 `systemctl` 命令对其进行控制。
通过此脚本Nginx UI 将作为服务安装。安装脚本会检测您系统的服务管理器并设置相应的服务控制机制。
### Systemd
如果您的系统使用 systemd请使用以下 `systemctl` 命令对其进行控制:
::: code-group
@ -115,4 +109,60 @@ systemctl restart nginx-ui
systemctl status nginx-ui
```
```shell [开机启动]
systemctl enable nginx-ui
```
:::
### OpenRC
如果您的系统使用 OpenRC请使用以下 `rc-service` 命令对其进行控制:
::: code-group
```shell [启动]
rc-service nginx-ui start
```
```shell [停止]
rc-service nginx-ui stop
```
```shell [重启]
rc-service nginx-ui restart
```
```shell [显示状态]
rc-service nginx-ui status
```
```shell [开机启动]
rc-update add nginx-ui default
```
:::
### Init.d
如果您的系统使用传统的 init.d 脚本,请使用以下命令对其进行控制:
::: code-group
```shell [启动]
/etc/init.d/nginx-ui start
```
```shell [停止]
/etc/init.d/nginx-ui stop
```
```shell [重启]
/etc/init.d/nginx-ui restart
```
```shell [显示状态]
/etc/init.d/nginx-ui status
```
:::

View file

@ -36,6 +36,7 @@ server {
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_pass http://127.0.0.1:9000/;
proxy_buffering off;
}
}
```

View file

@ -82,7 +82,7 @@ docker run -dit \
### 設定
```shell
echo '[server]\nHttpPort = 9000' > app.ini
echo '[server]\nPort = 9000' > app.ini
```
::: tip 提示

View file

@ -86,7 +86,11 @@ bash -c "$(curl -L https://raw.githubusercontent.com/0xJacky/nginx-ui/main/insta
## 控制服務
透過此指令碼Nginx UI 將作為 `nginx-ui` 守護行程安裝在 systemd 中。請使用以下 `systemctl` 指令控制。
透過此指令碼Nginx UI 將作為服務安裝。安裝指令碼會檢測您系統的服務管理器並設置相應的服務控制機制。
### Systemd
如果您的系統使用 systemd請使用以下 `systemctl` 指令控制:
::: code-group
@ -106,4 +110,60 @@ systemctl restart nginx-ui
systemctl status nginx-ui
```
```shell [開機啟動]
systemctl enable nginx-ui
```
:::
### OpenRC
如果您的系統使用 OpenRC請使用以下 `rc-service` 指令控制:
::: code-group
```shell [啟動]
rc-service nginx-ui start
```
```shell [停止]
rc-service nginx-ui stop
```
```shell [重啟]
rc-service nginx-ui restart
```
```shell [顯示狀態]
rc-service nginx-ui status
```
```shell [開機啟動]
rc-update add nginx-ui default
```
:::
### Init.d
如果您的系統使用傳統的 init.d 指令碼,請使用以下指令控制:
::: code-group
```shell [啟動]
/etc/init.d/nginx-ui start
```
```shell [停止]
/etc/init.d/nginx-ui stop
```
```shell [重啟]
/etc/init.d/nginx-ui restart
```
```shell [顯示狀態]
/etc/init.d/nginx-ui status
```
:::

View file

@ -36,6 +36,7 @@ server {
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_pass http://127.0.0.1:9000/;
proxy_buffering off;
}
}
```

90
go.mod
View file

@ -1,6 +1,6 @@
module github.com/0xJacky/Nginx-UI
go 1.24.2
go 1.24.3
require (
code.pfad.fr/risefront v1.0.0
@ -26,9 +26,8 @@ require (
github.com/golang-jwt/jwt/v5 v5.2.2
github.com/google/uuid v1.6.0
github.com/gorilla/websocket v1.5.3
github.com/jpillora/overseer v1.1.6
github.com/lib/pq v1.10.9
github.com/mark3labs/mcp-go v0.25.0
github.com/mark3labs/mcp-go v0.26.0
github.com/minio/selfupdate v0.6.0
github.com/nikoksr/notify v1.3.0
github.com/nxadm/tail v1.4.11
@ -45,12 +44,12 @@ require (
github.com/uozi-tech/cosy v1.21.1
github.com/uozi-tech/cosy-driver-sqlite v0.2.1
github.com/urfave/cli/v3 v3.3.2
golang.org/x/crypto v0.37.0
golang.org/x/net v0.39.0
golang.org/x/crypto v0.38.0
golang.org/x/net v0.40.0
gopkg.in/ini.v1 v1.67.0
gorm.io/driver/sqlite v1.5.7
gorm.io/gen v0.3.27
gorm.io/gorm v1.26.0
gorm.io/gorm v1.26.1
gorm.io/plugin/dbresolver v1.6.0
)
@ -80,9 +79,7 @@ require (
github.com/AzureAD/microsoft-authentication-library-for-go v1.4.2 // indirect
github.com/Microsoft/go-winio v0.6.2 // indirect
github.com/OpenDNS/vegadns2client v0.0.0-20180418235048-a3fa4a771d87 // indirect
github.com/StackExchange/wmi v1.2.1 // indirect
github.com/akamai/AkamaiOPEN-edgegrid-golang v1.2.2 // indirect
github.com/aliyun/alibaba-cloud-sdk-go v1.63.107 // indirect
github.com/aws/aws-sdk-go-v2 v1.36.3 // indirect
github.com/aws/aws-sdk-go-v2/config v1.29.14 // indirect
github.com/aws/aws-sdk-go-v2/credentials v1.17.67 // indirect
@ -97,9 +94,8 @@ require (
github.com/aws/aws-sdk-go-v2/service/sso v1.25.3 // indirect
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.30.1 // indirect
github.com/aws/aws-sdk-go-v2/service/sts v1.33.19 // indirect
github.com/aws/smithy-go v1.22.3 // indirect
github.com/aws/smithy-go v1.22.2 // indirect
github.com/baidubce/bce-sdk-go v0.9.225 // indirect
github.com/benbjohnson/clock v1.3.5 // indirect
github.com/blinkbean/dingtalk v1.1.3 // indirect
github.com/boombuler/barcode v1.0.2 // indirect
github.com/bsm/redislock v0.9.4 // indirect
@ -108,24 +104,22 @@ require (
github.com/cenkalti/backoff/v4 v4.3.0 // indirect
github.com/cespare/xxhash/v2 v2.3.0 // indirect
github.com/civo/civogo v0.4.1 // indirect
github.com/cloudflare/cloudflare-go v0.115.0 // indirect
github.com/cloudwego/base64x v0.1.5 // indirect
github.com/containerd/log v0.1.0 // indirect
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect
github.com/dimchansky/utfbom v1.1.1 // indirect
github.com/distribution/reference v0.6.0 // indirect
github.com/dnsimple/dnsimple-go v1.7.0 // indirect
github.com/dnsimple/dnsimple-go/v4 v4.0.0 // indirect
github.com/docker/go-connections v0.5.0 // indirect
github.com/docker/go-units v0.5.0 // indirect
github.com/ebitengine/purego v0.8.2 // indirect
github.com/exoscale/egoscale/v3 v3.1.16 // indirect
github.com/ebitengine/purego v0.9.0-alpha.3.0.20250507171635-5047c08daa38 // indirect
github.com/exoscale/egoscale/v3 v3.1.17 // indirect
github.com/fatih/color v1.18.0 // indirect
github.com/fatih/structs v1.1.0 // indirect
github.com/felixge/httpsnoop v1.0.4 // indirect
github.com/fxamacker/cbor/v2 v2.8.0 // indirect
github.com/gabriel-vasile/mimetype v1.4.9 // indirect
github.com/ghodss/yaml v1.0.0 // indirect
github.com/gin-contrib/sse v1.1.0 // indirect
github.com/go-errors/errors v1.5.1 // indirect
github.com/go-jose/go-jose/v4 v4.1.0 // indirect
@ -140,7 +134,6 @@ require (
github.com/go-viper/mapstructure/v2 v2.2.1 // indirect
github.com/go-webauthn/x v0.1.20 // indirect
github.com/goccy/go-json v0.10.5 // indirect
github.com/gofrs/flock v0.12.1 // indirect
github.com/gogo/protobuf v1.3.2 // indirect
github.com/golang-jwt/jwt/v4 v4.5.2 // indirect
github.com/google/go-querystring v1.1.0 // indirect
@ -151,12 +144,9 @@ require (
github.com/gophercloud/gophercloud v1.14.1 // indirect
github.com/gophercloud/utils v0.0.0-20231010081019-80377eca5d56 // indirect
github.com/guregu/null/v6 v6.0.0 // indirect
github.com/hashicorp/errwrap v1.1.0 // indirect
github.com/hashicorp/go-cleanhttp v0.5.2 // indirect
github.com/hashicorp/go-multierror v1.1.1 // indirect
github.com/hashicorp/go-retryablehttp v0.7.7 // indirect
github.com/hashicorp/go-uuid v1.0.3 // indirect
github.com/huaweicloud/huaweicloud-sdk-go-v3 v0.1.147 // indirect
github.com/iij/doapi v0.0.0-20190504054126-0bbf12d6d7df // indirect
github.com/imega/luaformatter v0.0.0-20211025140405-86b0a68d6bef // indirect
github.com/infobloxopen/infoblox-go-client/v2 v2.10.0 // indirect
@ -169,9 +159,7 @@ require (
github.com/jackc/puddle/v2 v2.2.2 // indirect
github.com/jinzhu/inflection v1.0.0 // indirect
github.com/jinzhu/now v1.1.5 // indirect
github.com/jmespath/go-jmespath v0.4.0 // indirect
github.com/jonboulle/clockwork v0.5.0 // indirect
github.com/jpillora/s3 v1.1.4 // indirect
github.com/json-iterator/go v1.1.12 // indirect
github.com/k0kubun/go-ansi v0.0.0-20180517002512-3bf9e2903213 // indirect
github.com/klauspost/cpuid/v2 v2.2.10 // indirect
@ -180,14 +168,19 @@ require (
github.com/labbsr0x/bindman-dns-webhook v1.0.2 // indirect
github.com/labbsr0x/goh v1.0.1 // indirect
github.com/leodido/go-urn v1.4.0 // indirect
github.com/linode/linodego v1.49.0 // indirect
github.com/libdns/alidns v1.0.4 // indirect
github.com/libdns/cloudflare v0.2.1 // indirect
github.com/libdns/huaweicloud v1.0.0-beta.2 // indirect
github.com/libdns/libdns v1.0.0 // indirect
github.com/libdns/tencentcloud v1.4.1 // indirect
github.com/linode/linodego v1.50.0 // indirect
github.com/liquidweb/liquidweb-cli v0.7.0 // indirect
github.com/liquidweb/liquidweb-go v1.6.4 // indirect
github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 // indirect
github.com/mattn/go-colorable v0.1.14 // indirect
github.com/mattn/go-isatty v0.0.20 // indirect
github.com/mattn/go-sqlite3 v1.14.28 // indirect
github.com/miekg/dns v1.1.65 // indirect
github.com/miekg/dns v1.1.66 // indirect
github.com/mimuret/golang-iij-dpf v0.9.1 // indirect
github.com/mitchellh/go-homedir v1.1.0 // indirect
github.com/mitchellh/mapstructure v1.5.0 // indirect
@ -197,7 +190,7 @@ require (
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/modern-go/reflect2 v1.0.2 // indirect
github.com/morikuni/aec v1.0.0 // indirect
github.com/namedotcom/go v0.0.0-20180403034216-08470befbe04 // indirect
github.com/namedotcom/go/v4 v4.0.2 // indirect
github.com/nrdcg/auroradns v1.1.0 // indirect
github.com/nrdcg/bunny-go v0.0.0-20250327222614-988a091fc7ea // indirect
github.com/nrdcg/desec v0.11.0 // indirect
@ -212,8 +205,6 @@ require (
github.com/nzdjb/go-metaname v1.0.0 // indirect
github.com/opencontainers/go-digest v1.0.0 // indirect
github.com/opencontainers/image-spec v1.1.1 // indirect
github.com/opentracing/opentracing-go v1.2.1-0.20220228012449-10b1cf09e00b // indirect
github.com/oracle/oci-go-sdk/v65 v65.89.3 // indirect
github.com/ovh/go-ovh v1.7.0 // indirect
github.com/patrickmn/go-cache v2.1.0+incompatible // indirect
github.com/pelletier/go-toml/v2 v2.2.4 // indirect
@ -224,20 +215,16 @@ require (
github.com/redis/go-redis/v9 v9.8.0 // indirect
github.com/regfish/regfish-dnsapi-go v0.1.1 // indirect
github.com/robfig/cron/v3 v3.0.1 // indirect
github.com/sacloud/api-client-go v0.2.10 // indirect
github.com/sacloud/go-http v0.1.9 // indirect
github.com/sacloud/iaas-api-go v1.14.0 // indirect
github.com/sacloud/packages-go v0.0.11 // indirect
github.com/sagikazarmark/locafero v0.9.0 // indirect
github.com/scaleway/scaleway-sdk-go v1.0.0-beta.33 // indirect
github.com/selectel/domains-go v1.1.0 // indirect
github.com/selectel/go-selvpcclient/v3 v3.2.1 // indirect
github.com/selectel/go-selvpcclient/v4 v4.1.0 // indirect
github.com/shopspring/decimal v1.4.0 // indirect
github.com/sirupsen/logrus v1.9.3 // indirect
github.com/smartystreets/go-aws-auth v0.0.0-20180515143844-0c1422d1fdb9 // indirect
github.com/smartystreets/gunit v1.1.3 // indirect
github.com/softlayer/softlayer-go v1.1.7 // indirect
github.com/softlayer/xmlrpc v0.0.0-20200409220501-5f089df7cb7e // indirect
github.com/sony/gobreaker v1.0.0 // indirect
github.com/sony/sonyflake v1.2.1 // indirect
github.com/sourcegraph/conc v0.3.0 // indirect
github.com/spf13/pflag v1.0.6 // indirect
@ -245,11 +232,8 @@ require (
github.com/stretchr/objx v0.5.2 // indirect
github.com/subosito/gotenv v1.6.0 // indirect
github.com/technoweenie/multipartstreamer v1.0.1 // indirect
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1158 // indirect
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/dnspod v1.0.1136 // indirect
github.com/timtadh/data-structures v0.6.2 // indirect
github.com/timtadh/lexmachine v0.2.3 // indirect
github.com/tjfoc/gmsm v1.4.1 // indirect
github.com/tklauser/go-sysconf v0.3.15 // indirect
github.com/tklauser/numcpus v0.10.0 // indirect
github.com/transip/gotransip/v6 v6.26.0 // indirect
@ -260,36 +244,30 @@ require (
github.com/uozi-tech/cosy-driver-postgres v0.2.1 // indirect
github.com/vinyldns/go-vinyldns v0.9.16 // indirect
github.com/volcengine/volc-sdk-golang v1.0.206 // indirect
github.com/vultr/govultr/v3 v3.19.1 // indirect
github.com/vultr/govultr/v3 v3.20.0 // indirect
github.com/x448/float16 v0.8.4 // indirect
github.com/yandex-cloud/go-genproto v0.1.0 // indirect
github.com/yandex-cloud/go-sdk v0.3.0 // indirect
github.com/yosida95/uritemplate/v3 v3.0.2 // indirect
github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78 // indirect
github.com/yusufpapurcu/wmi v1.2.4 // indirect
go.mongodb.org/mongo-driver v1.17.3 // indirect
go.opentelemetry.io/auto/sdk v1.1.0 // indirect
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.60.0 // indirect
go.opentelemetry.io/otel v1.35.0 // indirect
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.35.0 // indirect
go.opentelemetry.io/otel/metric v1.35.0 // indirect
go.opentelemetry.io/otel/trace v1.35.0 // indirect
go.uber.org/atomic v1.11.0 // indirect
go.uber.org/multierr v1.11.0 // indirect
go.uber.org/ratelimit v0.3.1 // indirect
go.uber.org/zap v1.27.0 // indirect
golang.org/x/arch v0.16.0 // indirect
golang.org/x/arch v0.17.0 // indirect
golang.org/x/mod v0.24.0 // indirect
golang.org/x/oauth2 v0.29.0 // indirect
golang.org/x/sync v0.13.0 // indirect
golang.org/x/sys v0.32.0 // indirect
golang.org/x/text v0.24.0 // indirect
golang.org/x/oauth2 v0.30.0 // indirect
golang.org/x/sync v0.14.0 // indirect
golang.org/x/sys v0.33.0 // indirect
golang.org/x/text v0.25.0 // indirect
golang.org/x/time v0.11.0 // indirect
golang.org/x/tools v0.32.0 // indirect
google.golang.org/api v0.231.0 // indirect
google.golang.org/genproto v0.0.0-20250428153025-10db94c68c34 // indirect
google.golang.org/genproto/googleapis/api v0.0.0-20250428153025-10db94c68c34 // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20250428153025-10db94c68c34 // indirect
golang.org/x/tools v0.33.0 // indirect
google.golang.org/api v0.232.0 // indirect
google.golang.org/genproto/googleapis/api v0.0.0-20250505200425-f936aa4a68b2 // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20250505200425-f936aa4a68b2 // indirect
google.golang.org/grpc v1.72.0 // indirect
google.golang.org/protobuf v1.36.6 // indirect
gopkg.in/inf.v0 v0.9.1 // indirect
@ -314,7 +292,11 @@ require (
replace (
code.pfad.fr/risefront => github.com/nginxui/risefront v1.2.2
github.com/tufanbarisyildirim/gonginx => github.com/0xJacky/gonginx v0.0.0-20250420001451-d120448e89a4
gorm.io/gorm => gorm.io/gorm v1.25.12
gorm.io/plugin/dbresolver => gorm.io/plugin/dbresolver v1.5.3
github.com/go-acme/lego/v4 => github.com/nginxui/lego/v4 v4.0.1-0.20250510143905-a6a4dc162d06
github.com/libdns/alidns => github.com/nginxui/alidns v0.0.0-20250510034447-7783387a1f8d
github.com/libdns/cloudflare => github.com/nginxui/cloudflare v0.0.0-20250508084008-f31918fec5ab
github.com/libdns/tencentcloud => github.com/nginxui/tencentcloud v0.0.0-20250510022134-62ee21b1b93a
github.com/minio/selfupdate => github.com/nginxui/selfupdate v0.0.0-20250508140228-a7dab39cec4a
github.com/nikoksr/notify => github.com/nginxui/notify v0.0.0-20250509000747-c76622723eb1
github.com/tufanbarisyildirim/gonginx => github.com/0xJacky/gonginx v0.0.0-20250421073240-35877245a353
)

211
go.sum
View file

@ -606,8 +606,8 @@ filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA=
filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4=
gioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8=
git.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc=
github.com/0xJacky/gonginx v0.0.0-20250420001451-d120448e89a4 h1:lhAg1yZARWyTBREHjwlzp7Gb/wz9w/e//rAruyqT26c=
github.com/0xJacky/gonginx v0.0.0-20250420001451-d120448e89a4/go.mod h1:LHFsaWic3COhC8xXZR5jZ8EVsVU+IhQnN5W7YVdDTuI=
github.com/0xJacky/gonginx v0.0.0-20250421073240-35877245a353 h1:NAQf4g4OikKf9wP6nJLeLQ/yUjIbLKXFX2QZA0ASAhw=
github.com/0xJacky/gonginx v0.0.0-20250421073240-35877245a353/go.mod h1:ALbEe81QPWOZjDKCKNWodG2iqCMtregG8+ebQgjx2+4=
github.com/0xJacky/pofile v1.0.0 h1:ZjfpvLlouhnzOsSGhJ/dmqp5DkKg7XGjuulAAXVnhkE=
github.com/0xJacky/pofile v1.0.0/go.mod h1:qq7YtcX4V35EBfOypsYLuLO7hCBExAH9q7xOxTqv2lQ=
github.com/AdamSLevy/jsonrpc2/v14 v14.1.0 h1:Dy3M9aegiI7d7PF1LUdjbVigJReo+QOceYsMyFh9qoE=
@ -686,9 +686,6 @@ github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWX
github.com/Shopify/sarama v1.30.1/go.mod h1:hGgx05L/DiW8XYBXeJdKIN6V2QUy2H6JqME5VT1NLRw=
github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI=
github.com/Shopify/toxiproxy/v2 v2.1.6-0.20210914104332-15ea381dcdae/go.mod h1:/cvHQkZ1fst0EmZnA5dFtiQdWCNCFYzb+uE2vqVgvx0=
github.com/StackExchange/wmi v0.0.0-20190523213315-cbe66965904d/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg=
github.com/StackExchange/wmi v1.2.1 h1:VIkavFPXSjcnS+O8yTq7NI32k0R5Aj+v39y29VYDOSA=
github.com/StackExchange/wmi v1.2.1/go.mod h1:rcmrprowKIVzvc+NUiLncP2uuArMWLCbu9SBzvHz7e8=
github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g=
github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c=
github.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY=
@ -702,8 +699,6 @@ github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuy
github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho=
github.com/aliyun/alibaba-cloud-sdk-go v1.63.107 h1:qagvUyrgOnBIlVRQWOyCZGVKUIYbMBdGdJ104vBpRFU=
github.com/aliyun/alibaba-cloud-sdk-go v1.63.107/go.mod h1:SOSDHfe1kX91v3W5QiBsWSLqeLxImobbMX1mxrFHsVQ=
github.com/andybalholm/brotli v1.0.4/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig=
github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=
github.com/apache/arrow/go/v10 v10.0.1/go.mod h1:YvhnlEePVnBS4+0z3fhPfUy7W1Ikj0Ih0vcRo/gZ1M0=
@ -748,13 +743,11 @@ github.com/aws/aws-sdk-go-v2/service/ssooidc v1.30.1/go.mod h1:MlYRNmYu/fGPoxBQV
github.com/aws/aws-sdk-go-v2/service/sts v1.33.19 h1:1XuUZ8mYJw9B6lzAkXhqHlJd/XvaX32evhproijJEZY=
github.com/aws/aws-sdk-go-v2/service/sts v1.33.19/go.mod h1:cQnB8CUnxbMU82JvlqjKR2HBOm3fe9pWorWBza6MBJ4=
github.com/aws/smithy-go v1.8.0/go.mod h1:SObp3lf9smib00L/v3U2eAKG8FyQ7iLrJnQiAmR5n+E=
github.com/aws/smithy-go v1.22.3 h1:Z//5NuZCSW6R4PhQ93hShNbyBbn8BWCmCVCt+Q8Io5k=
github.com/aws/smithy-go v1.22.3/go.mod h1:t1ufH5HMublsJYulve2RKmHDC15xu1f26kHCp/HgceI=
github.com/aws/smithy-go v1.22.2 h1:6D9hW43xKFrRx/tXXfAlIZc4JI+yQe6snnWcQyxSyLQ=
github.com/aws/smithy-go v1.22.2/go.mod h1:irrKGvNn1InZwb2d7fkIRNucdfwR8R+Ts3wxYa/cJHg=
github.com/baidubce/bce-sdk-go v0.9.225 h1:4zz/cGgrEpAIOM6pkEU3UnlNgEcpO4SV2oVpa0gAZKI=
github.com/baidubce/bce-sdk-go v0.9.225/go.mod h1:zbYJMQwE4IZuyrJiFO8tO8NbtYiKTFTbwh4eIsqjVdg=
github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
github.com/benbjohnson/clock v1.3.5 h1:VvXlSJBzZpA/zum6Sj74hxwYI2DIxRWuNIoXAzHZz5o=
github.com/benbjohnson/clock v1.3.5/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
@ -807,8 +800,6 @@ github.com/civo/civogo v0.4.1 h1:C+lwZ7hBqKy6eKy6qgviuselF0V5Z/um0x7X/eLEQ64=
github.com/civo/civogo v0.4.1/go.mod h1:LaEbkszc+9nXSh4YNG0sYXFGYqdQFmXXzQg0gESs2hc=
github.com/clbanning/mxj v1.8.4/go.mod h1:BVjHeAH+rl9rs6f+QIpeRl0tfu10SXn1pUSa5PVGJng=
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
github.com/cloudflare/cloudflare-go v0.115.0 h1:84/dxeeXweCc0PN5Cto44iTA8AkG1fyT11yPO5ZB7sM=
github.com/cloudflare/cloudflare-go v0.115.0/go.mod h1:Ds6urDwn/TF2uIU24mu7H91xkKP8gSAHxQ44DSZgVmU=
github.com/cloudwego/base64x v0.1.5 h1:XPciSp1xaq2VCSt6lF0phncD4koWyULpl5bUxbfCyP4=
github.com/cloudwego/base64x v0.1.5/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w=
github.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY=
@ -858,8 +849,8 @@ github.com/dimchansky/utfbom v1.1.1 h1:vV6w1AhK4VMnhBno/TPVCoK9U/LP0PkLCS9tbxHdi
github.com/dimchansky/utfbom v1.1.1/go.mod h1:SxdoEBH5qIqFocHMyGOXVAybYJdr71b1Q/j0mACtrfE=
github.com/distribution/reference v0.6.0 h1:0IXCQ5g4/QMHHkarYzh5l+u8T3t73zM5QvfrDyIgxBk=
github.com/distribution/reference v0.6.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E=
github.com/dnsimple/dnsimple-go v1.7.0 h1:JKu9xJtZ3SqOC+BuYgAWeab7+EEx0sz422vu8j611ZY=
github.com/dnsimple/dnsimple-go v1.7.0/go.mod h1:EKpuihlWizqYafSnQHGCd/gyvy3HkEQJ7ODB4KdV8T8=
github.com/dnsimple/dnsimple-go/v4 v4.0.0 h1:nUCICZSyZDiiqimAAL+E8XL+0sKGks5VRki5S8XotRo=
github.com/dnsimple/dnsimple-go/v4 v4.0.0/go.mod h1:AXT2yfAFOntJx6iMeo1J/zKBw0ggXFYBt4e97dqqPnc=
github.com/docker/docker v28.1.1+incompatible h1:49M11BFLsVO1gxY9UX9p/zwkE/rswggs8AdFmXQw51I=
github.com/docker/docker v28.1.1+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
github.com/docker/go-connections v0.5.0 h1:USnMq7hx7gwdVZq1L49hLXaFtUdTADjXGp+uj1Br63c=
@ -874,8 +865,8 @@ github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5m
github.com/eapache/go-resiliency v1.2.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs=
github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU=
github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I=
github.com/ebitengine/purego v0.8.2 h1:jPPGWs2sZ1UgOSgD2bClL0MJIqu58nOmIcBuXr62z1I=
github.com/ebitengine/purego v0.8.2/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ=
github.com/ebitengine/purego v0.9.0-alpha.3.0.20250507171635-5047c08daa38 h1:61WY14WhyU89bEJCjegpt6b8wDNsU+Z1416JGwfEKwI=
github.com/ebitengine/purego v0.9.0-alpha.3.0.20250507171635-5047c08daa38/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ=
github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M=
github.com/elliotchance/orderedmap/v3 v3.1.0 h1:j4DJ5ObEmMBt/lcwIecKcoRxIQUEnw0L804lXYDt/pg=
github.com/elliotchance/orderedmap/v3 v3.1.0/go.mod h1:G+Hc2RwaZvJMcS4JpGCOyViCnGeKf0bTYCGTO4uhjSo=
@ -894,8 +885,8 @@ github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7
github.com/envoyproxy/protoc-gen-validate v0.6.7/go.mod h1:dyJXwwfPK2VSqiB9Klm1J6romD608Ba7Hij42vrOBCo=
github.com/envoyproxy/protoc-gen-validate v0.9.1/go.mod h1:OKNgG7TCp5pF4d6XftA0++PMirau2/yoOwVac3AbF2w=
github.com/envoyproxy/protoc-gen-validate v0.10.0/go.mod h1:DRjgyB0I43LtJapqN6NiRwroiAU2PaFuvk/vjgh61ss=
github.com/exoscale/egoscale/v3 v3.1.16 h1:JaAjY9uHLw9K5jA6kVenbTkJxgds3IU2RkrXXWV+d9s=
github.com/exoscale/egoscale/v3 v3.1.16/go.mod h1:t9+MpSEam94na48O/xgvvPFpQPRiwZ3kBN4/UuQtKco=
github.com/exoscale/egoscale/v3 v3.1.17 h1:+T6+GP/k3tFNsYIQzpF3Sou4ecH//FkERDsJze/OZ00=
github.com/exoscale/egoscale/v3 v3.1.17/go.mod h1:t9+MpSEam94na48O/xgvvPFpQPRiwZ3kBN4/UuQtKco=
github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=
github.com/fatih/color v1.12.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM=
@ -925,7 +916,6 @@ github.com/fxamacker/cbor/v2 v2.8.0 h1:fFtUGXUzXPHTIUdne5+zzMPTfffl3RD5qYnkY40vt
github.com/fxamacker/cbor/v2 v2.8.0/go.mod h1:vM4b+DJCtHn+zz7h3FFp/hDAI9WNWCsZj23V5ytsSxQ=
github.com/gabriel-vasile/mimetype v1.4.9 h1:5k+WDwEsD9eTLL8Tz3L0VnmVh9QxGjRmjBvAG7U/oYY=
github.com/gabriel-vasile/mimetype v1.4.9/go.mod h1:WnSQhFKJuBlRyLiKohA/2DtIlPFAbguNaG7QCHcyGok=
github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk=
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
github.com/gin-contrib/pprof v1.5.3 h1:Bj5SxJ3kQDVez/s/+f9+meedJIqLS+xlkIVDe/lcvgM=
github.com/gin-contrib/pprof v1.5.3/go.mod h1:0+LQSZ4SLO0B6+2n6JBzaEygpTBxe/nI+YEYpfQQ6xY=
@ -935,8 +925,6 @@ github.com/gin-contrib/static v1.1.5 h1:bAPqT4KTZN+4uDY1b90eSrD1t8iNzod7Jj8njwmn
github.com/gin-contrib/static v1.1.5/go.mod h1:8JSEXwZHcQ0uCrLPcsvnAJ4g+ODxeupP8Zetl9fd8wM=
github.com/gin-gonic/gin v1.10.0 h1:nTuyha1TYqgedzytsKYqna+DfLos46nTv2ygFy86HFU=
github.com/gin-gonic/gin v1.10.0/go.mod h1:4PMNQiOhvDRa013RKVbsiNwoyezlm2rm0uX/T7kzp5Y=
github.com/go-acme/lego/v4 v4.23.1 h1:lZ5fGtGESA2L9FB8dNTvrQUq3/X4QOb8ExkKyY7LSV4=
github.com/go-acme/lego/v4 v4.23.1/go.mod h1:7UMVR7oQbIYw6V7mTgGwi4Er7B6Ww0c+c8feiBM0EgI=
github.com/go-cmd/cmd v1.0.5/go.mod h1:y8q8qlK5wQibcw63djSl/ntiHUHXHGdCkPk0j4QeW4s=
github.com/go-co-op/gocron/v2 v2.16.1 h1:ux/5zxVRveCaCuTtNI3DiOk581KC1KpJbpJFYUEVYwo=
github.com/go-co-op/gocron/v2 v2.16.1/go.mod h1:opexeOFy5BplhsKdA7bzY9zeYih8I8/WNJ4arTIFPVc=
@ -973,8 +961,6 @@ github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY=
github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
github.com/go-ole/go-ole v1.2.4/go.mod h1:XCwSNxSkXRo4vlyPy93sltvi/qJq0jqQhjqQNIwKuxM=
github.com/go-ole/go-ole v1.2.5/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0=
github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0=
github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE=
github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78=
@ -1013,15 +999,11 @@ github.com/goccy/go-json v0.9.11/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MG
github.com/goccy/go-json v0.10.5 h1:Fq85nIqj+gXn/S5ahsiTlK3TmC85qgirsdTP/+DeaC4=
github.com/goccy/go-json v0.10.5/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M=
github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU=
github.com/gofrs/flock v0.12.1 h1:MTLVXXHf8ekldpJk3AKicLij9MdwOWkZ+a/jHHZby9E=
github.com/gofrs/flock v0.12.1/go.mod h1:9zxTsyu5xtJ9DK+1tFZyibEV7y3uwDxPPfbxeeHCoD0=
github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM=
github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4=
github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
github.com/goji/httpauth v0.0.0-20160601135302-2da839ab0f4d/go.mod h1:nnjvkQ9ptGaCkuDUx6wNykzzlUixGxvkme+H/lnzb+A=
github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg=
github.com/golang-jwt/jwt/v4 v4.2.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg=
github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0=
@ -1072,7 +1054,6 @@ github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiu
github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=
github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=
github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
@ -1192,8 +1173,6 @@ github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyN
github.com/hashicorp/consul/sdk v0.8.0/go.mod h1:GBvyrGALthsZObzUGsfgHZQDXjg4lOjagTIwIR1vPms=
github.com/hashicorp/consul/sdk v0.13.1/go.mod h1:SW/mM4LbKfqmMvcFu8v+eiQQ7oitXEFeiBe9StxERb0=
github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I=
github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=
github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=
github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ=
@ -1208,8 +1187,6 @@ github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjh
github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=
github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=
github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA=
github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo=
github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM=
github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs=
github.com/hashicorp/go-retryablehttp v0.7.7 h1:C8hUCYzor8PIfXHa4UrZkU4VvK8o9ISHxT2Q8+VepXU=
github.com/hashicorp/go-retryablehttp v0.7.7/go.mod h1:pkQpWZeYWskR+D1tR2O5OcBFOxfA7DoAO6xtkuQnHTk=
@ -1240,8 +1217,6 @@ github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/J
github.com/hashicorp/serf v0.9.5/go.mod h1:UWDWwZeL5cuWDJdl0C6wrvrUwEqtQ4ZKBKKENpqIUyk=
github.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4=
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
github.com/huaweicloud/huaweicloud-sdk-go-v3 v0.1.147 h1:ip9+1n9+THhYgChlQpgDLVDVTv4LVJ7AoyPBJBaX2MY=
github.com/huaweicloud/huaweicloud-sdk-go-v3 v0.1.147/go.mod h1:Y/+YLCFCJtS29i2MbYPTUlNNfwXvkzEsZKR0imY/2aY=
github.com/hudl/fargo v1.4.0/go.mod h1:9Ai6uvFy5fQNq6VPKtg+Ceq1+eTY4nKUlR2JElEOcDo=
github.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=
github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
@ -1313,8 +1288,8 @@ github.com/jackc/puddle v1.3.0/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dv
github.com/jackc/puddle/v2 v2.2.2 h1:PR8nw+E/1w0GLuRFSmiioY6UooMp6KJv0/61nB7icHo=
github.com/jackc/puddle/v2 v2.2.2/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4=
github.com/jarcoal/httpmock v1.0.8/go.mod h1:ATjnClrvW/3tijVmpL/va5Z3aAyGvqU3gCT8nX0Txik=
github.com/jarcoal/httpmock v1.3.1 h1:iUx3whfZWVf3jT01hQTO/Eo5sAYtB2/rqaUuOtpInww=
github.com/jarcoal/httpmock v1.3.1/go.mod h1:3yb8rc4BI7TCBhFY8ng0gjuLKJNquuDNiPaZjnENuYg=
github.com/jarcoal/httpmock v1.4.0 h1:BvhqnH0JAYbNudL2GMJKgOHe2CtKlzJ/5rWKyp+hc2k=
github.com/jarcoal/httpmock v1.4.0/go.mod h1:ftW1xULwo+j0R0JJkJIIi7UKigZUXCLLanykgjwBXL0=
github.com/jcmturner/aescts/v2 v2.0.0/go.mod h1:AiaICIRyfYg35RUkr8yESTqvSy7csK90qZ5xfvvsoNs=
github.com/jcmturner/dnsutils/v2 v2.0.0/go.mod h1:b0TnjGOvI/n42bZa+hmXL+kFJZsFT7G4t3HTlQ184QM=
github.com/jcmturner/gofork v1.0.0/go.mod h1:MK8+TM0La+2rjBD4jE12Kj1pCCxK7d2LK/UM3ncEo0o=
@ -1325,9 +1300,7 @@ github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD
github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=
github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=
github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=
github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg=
github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo=
github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8=
github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U=
github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg=
github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=
@ -1338,10 +1311,6 @@ github.com/jonboulle/clockwork v0.5.0/go.mod h1:3mZlmanh0g2NDKO5TWZVJAfofYk64M7X
github.com/jordan-wright/email v4.0.1-0.20210109023952-943e75fe5223+incompatible h1:jdpOPRN1zP63Td1hDQbZW73xKmzDvZHzVdNYxhnTMDA=
github.com/jordan-wright/email v4.0.1-0.20210109023952-943e75fe5223+incompatible/go.mod h1:1c7szIrayyPPB/987hsnvNzLushdWf4o/79s3P08L8A=
github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4=
github.com/jpillora/overseer v1.1.6 h1:3ygYfNcR3FfOr22miu3vR1iQcXKMHbmULBh98rbkIyo=
github.com/jpillora/overseer v1.1.6/go.mod h1:aPXQtxuVb9PVWRWTXpo+LdnC/YXQ0IBLNXqKMJmgk88=
github.com/jpillora/s3 v1.1.4 h1:YCCKDWzb/Ye9EBNd83ATRF/8wPEy0xd43Rezb6u6fzc=
github.com/jpillora/s3 v1.1.4/go.mod h1:yedE603V+crlFi1Kl/5vZJaBu9pUzE9wvKegU/lF2zs=
github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
@ -1404,8 +1373,12 @@ github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
github.com/lib/pq v1.10.2/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw=
github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
github.com/linode/linodego v1.49.0 h1:MNd3qwvQzbXB5mCpvdCqlUIu1RPA9oC+50LyB9kK+GQ=
github.com/linode/linodego v1.49.0/go.mod h1:B+HAM3//4w1wOS0BwdaQBKwBxlfe6kYJ7bSC6jJ/xtc=
github.com/libdns/huaweicloud v1.0.0-beta.2 h1:50gUOOj5suqZtC2Cj6fAnjFgXboWgT6O8aHa+6BNy7s=
github.com/libdns/huaweicloud v1.0.0-beta.2/go.mod h1:MQ+HiuzS6RjqBaZquZICMM9rEfKPTRuo+MhIJ05m8Bw=
github.com/libdns/libdns v1.0.0 h1:IvYaz07JNz6jUQ4h/fv2R4sVnRnm77J/aOuC9B+TQTA=
github.com/libdns/libdns v1.0.0/go.mod h1:4Bj9+5CQiNMVGf87wjX4CY3HQJypUHRuLvlsfsZqLWQ=
github.com/linode/linodego v1.50.0 h1:5y79VvvQnWb5JyPIjTwyUrU3ArHcs7XZQFdkPS/lNpw=
github.com/linode/linodego v1.50.0/go.mod h1:9S+REoPCtUNWCm63D1vjjxIJZfwEL2t2kTDnwt620FM=
github.com/liquidweb/go-lwApi v0.0.0-20190605172801-52a4864d2738/go.mod h1:0sYF9rMXb0vlG+4SzdiGMXHheCZxjguMq+Zb4S2BfBs=
github.com/liquidweb/go-lwApi v0.0.5/go.mod h1:0sYF9rMXb0vlG+4SzdiGMXHheCZxjguMq+Zb4S2BfBs=
github.com/liquidweb/liquidweb-cli v0.6.9/go.mod h1:cE1uvQ+x24NGUL75D0QagOFCG8Wdvmwu8aL9TLmA/eQ=
@ -1421,8 +1394,8 @@ github.com/lyft/protoc-gen-star/v2 v2.0.1/go.mod h1:RcCdONR2ScXaYnQC5tUzxzlpA3WV
github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
github.com/magiconair/properties v1.8.4/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60=
github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0=
github.com/mark3labs/mcp-go v0.25.0 h1:UUpcMT3L5hIhuDy7aifj4Bphw4Pfx1Rf8mzMXDe8RQw=
github.com/mark3labs/mcp-go v0.25.0/go.mod h1:rXqOudj/djTORU/ThxYx8fqEVj/5pvTuuebQ2RC7uk4=
github.com/mark3labs/mcp-go v0.26.0 h1:xz/Kv1cHLYovF8txv6btBM39/88q3YOjnxqhi51jB0w=
github.com/mark3labs/mcp-go v0.26.0/go.mod h1:rXqOudj/djTORU/ThxYx8fqEVj/5pvTuuebQ2RC7uk4=
github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ=
github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
@ -1462,24 +1435,20 @@ github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKju
github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI=
github.com/miekg/dns v1.1.43/go.mod h1:+evo5L0630/F6ca/Z9+GAqzhjGyn8/c+TBaOyfEl0V4=
github.com/miekg/dns v1.1.47/go.mod h1:e3IlAVfNqAllflbibAZEWOXOQ+Ynzk/dDozDxY7XnME=
github.com/miekg/dns v1.1.65 h1:0+tIPHzUW0GCge7IiK3guGP57VAw7hoPDfApjkMD1Fc=
github.com/miekg/dns v1.1.65/go.mod h1:Dzw9769uoKVaLuODMDZz9M6ynFU6Em65csPuoi8G0ck=
github.com/miekg/dns v1.1.66 h1:FeZXOS3VCVsKnEAd+wBkjMC3D2K+ww66Cq3VnCINuJE=
github.com/miekg/dns v1.1.66/go.mod h1:jGFzBsSNbJw6z1HYut1RKBKHA9PBdxeHrZG8J+gC2WE=
github.com/mimuret/golang-iij-dpf v0.9.1 h1:Gj6EhHJkOhr+q2RnvRPJsPMcjuVnWPSccEHyoEehU34=
github.com/mimuret/golang-iij-dpf v0.9.1/go.mod h1:sl9KyOkESib9+KRD3HaGpgi1xk7eoN2+d96LCLsME2M=
github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8/go.mod h1:mC1jAcsrzbxHt8iiaC+zU4b1ylILSosueou12R++wfY=
github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3/go.mod h1:RagcQ7I8IeTMnF8JTXieKnO4Z6JCsikNEzj0DwauVzE=
github.com/minio/highwayhash v1.0.1/go.mod h1:BQskDq+xkJ12lmlUUi7U0M5Swg3EWR+dLTk+kldvVxY=
github.com/minio/highwayhash v1.0.2/go.mod h1:BQskDq+xkJ12lmlUUi7U0M5Swg3EWR+dLTk+kldvVxY=
github.com/minio/selfupdate v0.6.0 h1:i76PgT0K5xO9+hjzKcacQtO7+MjJ4JKA8Ak8XQ9DDwU=
github.com/minio/selfupdate v0.6.0/go.mod h1:bO02GTIPCMQFTEvE5h4DjYB58bCoZ35XLeBf0buTDdM=
github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=
github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI=
github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=
github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI=
github.com/mitchellh/go-testing-interface v1.14.1 h1:jrgshOhYAUVNMAJiKbEu7EqAwgJJ2JqpQmpLJOu07cU=
github.com/mitchellh/go-testing-interface v1.14.1/go.mod h1:gfgS7OtZj6MA4U1UrDRp04twqAjfvlZyCfX3sDjEym8=
github.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo=
github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg=
github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY=
@ -1505,13 +1474,12 @@ github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lN
github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=
github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc=
github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A=
github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc=
github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
github.com/namedotcom/go v0.0.0-20180403034216-08470befbe04 h1:o6uBwrhM5C8Ll3MAAxrQxRHEu7FkapwTuI2WmL1rw4g=
github.com/namedotcom/go v0.0.0-20180403034216-08470befbe04/go.mod h1:5sN+Lt1CaY4wsPvgQH/jsuJi4XO2ssZbdsIizr4CVC8=
github.com/namedotcom/go/v4 v4.0.2 h1:4gNkPaPRG/2tqFNUUof7jAVsA6vDutFutEOd7ivnDwA=
github.com/namedotcom/go/v4 v4.0.2/go.mod h1:J6sVueHMb0qbarPgdhrzEVhEaYp+R1SCaTGl2s6/J1Q=
github.com/nats-io/jwt v1.2.2/go.mod h1:/xX356yQA6LuXI9xWW7mZNpxgF2mBmGecH+Fj34sP5Q=
github.com/nats-io/jwt/v2 v2.0.3/go.mod h1:VRP+deawSXyhNjXmxPCHskrR6Mq50BqpEI5SEcNiGlY=
github.com/nats-io/nats-server/v2 v2.5.0/go.mod h1:Kj86UtrXAL6LwYRA6H4RqzkHhK0Vcv2ZnKD5WbQ1t3g=
@ -1520,13 +1488,21 @@ github.com/nats-io/nkeys v0.2.0/go.mod h1:XdZpAbhgyyODYqjTawOnIOI7VlbKSarI9Gfy1t
github.com/nats-io/nkeys v0.3.0/go.mod h1:gvUNGjVcM2IPr5rCsRsC6Wb3Hr2CQAm08dsxtV6A5y4=
github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c=
github.com/nbio/st v0.0.0-20140626010706-e9e8d9816f32/go.mod h1:9wM+0iRr9ahx58uYLpLIr5fm8diHn0JbqRycJi6w0Ms=
github.com/nginxui/risefront v1.2.1 h1:CXu4c+bM6iBRVZHXQTUy9ceQa2p3YqIPNEdTPeCjIQ0=
github.com/nginxui/risefront v1.2.1/go.mod h1:QX3OyvazX3Mi/X2NZKl9ylDrFVUeaogwSMKyEsnRCHE=
github.com/nginxui/alidns v0.0.0-20250510034447-7783387a1f8d h1:d3GirItQOIcp45ZBnbZd6acOkZZcK1X9hK3xtWZiPL0=
github.com/nginxui/alidns v0.0.0-20250510034447-7783387a1f8d/go.mod h1:nluLPCeflqaXDdPTpGD/wes5C+Occ1FgQUSR0AX4SnM=
github.com/nginxui/cloudflare v0.0.0-20250508084008-f31918fec5ab h1:zed1zmcQd9pTvVA8+fmcjdGlB5vXS+rW0vxLKjyrOp0=
github.com/nginxui/cloudflare v0.0.0-20250508084008-f31918fec5ab/go.mod h1:Aq4IXdjalB6mD0ELvKqJiIGim8zSC6mlIshRPMOAb5w=
github.com/nginxui/lego/v4 v4.0.1-0.20250510143905-a6a4dc162d06 h1:zq9fqTfy80zn/AlCwd4oKSlB6OMjAsG1WVBhXnp2A0g=
github.com/nginxui/lego/v4 v4.0.1-0.20250510143905-a6a4dc162d06/go.mod h1:lRohXd8BqQEhwHRhz37cZcpmJo9B7LoHfCAr1IAQdAg=
github.com/nginxui/notify v0.0.0-20250509000747-c76622723eb1 h1:tTFu+N3ukz73Lv4LKLdNAL6EItcdn31vpy12SLwLjlU=
github.com/nginxui/notify v0.0.0-20250509000747-c76622723eb1/go.mod h1:5xiIPJd5HveRkca2gA8K//HLdupJuB7uHHBdzDQQN6g=
github.com/nginxui/risefront v1.2.2 h1:mcKWv+2DnZBC97IwqWQQOXrTvqVWHWGCOEvjdM8Zv8o=
github.com/nginxui/risefront v1.2.2/go.mod h1:QX3OyvazX3Mi/X2NZKl9ylDrFVUeaogwSMKyEsnRCHE=
github.com/nginxui/selfupdate v0.0.0-20250508140228-a7dab39cec4a h1:KNDT8WAMtclTjmHtlqvy02sXUPNxErKNcyB3bjTRsEM=
github.com/nginxui/selfupdate v0.0.0-20250508140228-a7dab39cec4a/go.mod h1:bO02GTIPCMQFTEvE5h4DjYB58bCoZ35XLeBf0buTDdM=
github.com/nginxui/tencentcloud v0.0.0-20250510022134-62ee21b1b93a h1:T1NrD1DZ+jHuvHRwIEg77V4WIfvKg1SPLbC8UAyjQD8=
github.com/nginxui/tencentcloud v0.0.0-20250510022134-62ee21b1b93a/go.mod h1:Be9gY3tDa12DuAPU79RV9NZIcjY6qg5s7zKPsP26yAM=
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
github.com/nikoksr/notify v1.3.0 h1:UxzfxzAYGQD9a5JYLBTVx0lFMxeHCke3rPCkfWdPgLs=
github.com/nikoksr/notify v1.3.0/go.mod h1:Xor2hMmkvrCfkCKvXGbcrESez4brac2zQjhd6U2BbeM=
github.com/nrdcg/auroradns v1.1.0 h1:KekGh8kmf2MNwqZVVYo/fw/ZONt8QMEmbMFOeljteWo=
github.com/nrdcg/auroradns v1.1.0/go.mod h1:O7tViUZbAcnykVnrGkXzIJTHoQCHcgalgAe6X1mzHfk=
github.com/nrdcg/bunny-go v0.0.0-20250327222614-988a091fc7ea h1:OSgRS4kqOs/WuxuFOObP2gwrenL4/qiKXQbQugr/Two=
@ -1580,11 +1556,7 @@ github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3I
github.com/opencontainers/image-spec v1.1.1 h1:y0fUlFfIZhPF1W537XOLg0/fcx6zcHCJwooC2xJA040=
github.com/opencontainers/image-spec v1.1.1/go.mod h1:qpqAh3Dmcf36wStyyWU+kCeDgrGnAve2nCC8+7h8Q0M=
github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc=
github.com/opentracing/opentracing-go v1.2.1-0.20220228012449-10b1cf09e00b h1:FfH+VrHHk6Lxt9HdVS0PXzSXFyS2NbZKXv33FYPol0A=
github.com/opentracing/opentracing-go v1.2.1-0.20220228012449-10b1cf09e00b/go.mod h1:AC62GU6hc0BrNm+9RK9VSiwa/EUe1bkIeFORAMcHvJU=
github.com/openzipkin/zipkin-go v0.2.5/go.mod h1:KpXfKdgRDnnhsxw4pNIH9Md5lyFqKUa4YDFlwRYAMyE=
github.com/oracle/oci-go-sdk/v65 v65.89.3 h1:KSUykb5Ou54jF4SeJNjBwcDg+umbAwcvT+xhrvNDog0=
github.com/oracle/oci-go-sdk/v65 v65.89.3/go.mod h1:u6XRPsw9tPziBh76K7GrrRXPa8P8W3BQeqJ6ZZt9VLA=
github.com/ovh/go-ovh v1.7.0 h1:V14nF7FwDjQrZt9g7jzcvAAQ3HN6DNShRFRMC3jLoPw=
github.com/ovh/go-ovh v1.7.0/go.mod h1:cTVDnl94z4tl8pP1uZ/8jlVxntjSIf09bNcQ5TJSC7c=
github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
@ -1683,14 +1655,6 @@ github.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfF
github.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk=
github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=
github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=
github.com/sacloud/api-client-go v0.2.10 h1:+rv3jDohD+pkdYwOTBiB+jZsM0xK3AxadXRzhp3q66c=
github.com/sacloud/api-client-go v0.2.10/go.mod h1:Jj3CTy2+O4bcMedVDXlbHuqqche85HEPuVXoQFhLaRc=
github.com/sacloud/go-http v0.1.9 h1:Xa5PY8/pb7XWhwG9nAeXSrYXPbtfBWqawgzxD5co3VE=
github.com/sacloud/go-http v0.1.9/go.mod h1:DpDG+MSyxYaBwPJ7l3aKLMzwYdTVtC5Bo63HActcgoE=
github.com/sacloud/iaas-api-go v1.14.0 h1:xjkFWqdo4ilTrKPNNYBNWR/CZ/kVRsJrdAHAad6J/AQ=
github.com/sacloud/iaas-api-go v1.14.0/go.mod h1:C8os2Mnj0TOmMdSllwhaDWKMVG2ysFnpe69kyA4M3V0=
github.com/sacloud/packages-go v0.0.11 h1:hrRWLmfPM9w7GBs6xb5/ue6pEMl8t1UuDKyR/KfteHo=
github.com/sacloud/packages-go v0.0.11/go.mod h1:XNF5MCTWcHo9NiqWnYctVbASSSZR3ZOmmQORIzcurJ8=
github.com/sagikazarmark/crypt v0.10.0/go.mod h1:gwTNHQVoOS3xp9Xvz5LLR+1AauC5M6880z5NWzdhOyQ=
github.com/sagikazarmark/locafero v0.9.0 h1:GbgQGNtTrEmddYDSAH9QLRyfAHY12md+8YFTqyMTC9k=
github.com/sagikazarmark/locafero v0.9.0/go.mod h1:UBUyz37V+EdMS3hDF3QWIiVr/2dPrx49OMO0Bn0hJqk=
@ -1704,8 +1668,8 @@ github.com/scaleway/scaleway-sdk-go v1.0.0-beta.33/go.mod h1:792k1RTU+5JeMXm35/e
github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=
github.com/selectel/domains-go v1.1.0 h1:futG50J43ALLKQAnZk9H9yOtLGnSUh7c5hSvuC5gSHo=
github.com/selectel/domains-go v1.1.0/go.mod h1:SugRKfq4sTpnOHquslCpzda72wV8u0cMBHx0C0l+bzA=
github.com/selectel/go-selvpcclient/v3 v3.2.1 h1:ny6WIAMiHzKxOgOEnwcWE79wIQij1AHHylzPA41MXCw=
github.com/selectel/go-selvpcclient/v3 v3.2.1/go.mod h1:3EfSf8aEWyhspOGbvZ6mvnFg7JN5uckxNyBFPGWsXNQ=
github.com/selectel/go-selvpcclient/v4 v4.1.0 h1:22lBp+rzg9g2MP4iiGhpVAcCt0kMv7I7uV1W3taLSvQ=
github.com/selectel/go-selvpcclient/v4 v4.1.0/go.mod h1:eFhL1KUW159KOJVeGO7k/Uxl0TYd/sBkWXjuF5WxmYk=
github.com/shirou/gopsutil/v4 v4.25.4 h1:cdtFO363VEOOFrUCjZRh4XVJkb548lyF0q0uTeMqYPw=
github.com/shirou/gopsutil/v4 v4.25.4/go.mod h1:xbuxyoZj+UsgnZrENu3lQivsngRR5BdjbJwf2fv4szA=
github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4=
@ -1734,9 +1698,6 @@ github.com/softlayer/xmlrpc v0.0.0-20200409220501-5f089df7cb7e h1:3OgWYFw7jxCZPc
github.com/softlayer/xmlrpc v0.0.0-20200409220501-5f089df7cb7e/go.mod h1:fKZCUVdirrxrBpwd9wb+lSoVixvpwAu8eHzbQB2tums=
github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM=
github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY=
github.com/sony/gobreaker v0.5.0/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY=
github.com/sony/gobreaker v1.0.0 h1:feX5fGGXSl3dYd4aHZItw+FpHLvvoaqkawKjVNiFMNQ=
github.com/sony/gobreaker v1.0.0/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY=
github.com/sony/sonyflake v1.2.1 h1:Jzo4abS84qVNbYamXZdrZF1/6TzNJjEogRfXv7TsG48=
github.com/sony/sonyflake v1.2.1/go.mod h1:LORtCywH/cq10ZbyfhKrHYgAUGH7mOBa76enV9txy/Y=
github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo=
@ -1790,7 +1751,6 @@ github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO
github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=
github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw=
@ -1799,11 +1759,6 @@ github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8
github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU=
github.com/technoweenie/multipartstreamer v1.0.1 h1:XRztA5MXiR1TIRHxH2uNxXxaIkKQDeX7m2XsSOlQEnM=
github.com/technoweenie/multipartstreamer v1.0.1/go.mod h1:jNVxdtShOxzAsukZwTSw6MDx5eUJoiEBsSvzDU9uzog=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1136/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1158 h1:N+C8Tz6JKGwnDFDfd3g5CkTsiKTa6/Uia0uAL0OhimE=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1158/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/dnspod v1.0.1136 h1:kMIdSU5IvpOROh27ToVQ3hlm6ym3lCRs9tnGCOBoZqk=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/dnspod v1.0.1136/go.mod h1:FpyIz3mymKaExVs6Fz27kxDBS42jqZn7vbACtxdeEH4=
github.com/timtadh/data-structures v0.5.3/go.mod h1:9R4XODhJ8JdWFEI8P/HJKqxuJctfBQw6fDibMQny2oU=
github.com/timtadh/data-structures v0.6.1/go.mod h1:uYUnI1cQi/5yMCc7s23I+x8Mn8BCMf4WgK+7/4QSEk4=
github.com/timtadh/data-structures v0.6.2 h1:zybDnU5NLjJ7WKMDJpvVwczQuf1wSLBgdRHZ9O4AqJ0=
@ -1812,8 +1767,6 @@ github.com/timtadh/getopt v1.0.0/go.mod h1:L3EL6YN2G0eIAhYBo9b7SB9d/kEQmdnwthIlM
github.com/timtadh/lexmachine v0.2.2/go.mod h1:GBJvD5OAfRn/gnp92zb9KTgHLB7akKyxmVivoYCcjQI=
github.com/timtadh/lexmachine v0.2.3 h1:ZqlfHnfMcAygtbNM5Gv7jQf8hmM8LfVzDjfCrq235NQ=
github.com/timtadh/lexmachine v0.2.3/go.mod h1:oK1NW+93fQSIF6s+J6sXBFWsCPCFbNmrwKV1i0aqvW0=
github.com/tjfoc/gmsm v1.4.1 h1:aMe1GlZb+0bLjn+cKTPEvvn9oUEBlJitaZiiBwsbgho=
github.com/tjfoc/gmsm v1.4.1/go.mod h1:j4INPkHWMrhJb38G+J6W4Tw0AbuN8Thu3PbdVYhVcTE=
github.com/tklauser/go-sysconf v0.3.15 h1:VE89k0criAymJ/Os65CSn1IXaol+1wrsFHEB8Ol49K4=
github.com/tklauser/go-sysconf v0.3.15/go.mod h1:Dmjwr6tYFIseJw7a3dRLJfsHAMXZ3nEnL/aZY+0IuI4=
github.com/tklauser/numcpus v0.10.0 h1:18njr6LDBk1zuna922MgdjQuJFjrdppsZG60sHGfjso=
@ -1824,10 +1777,6 @@ github.com/transip/gotransip/v6 v6.26.0/go.mod h1:x0/RWGRK/zob817O3tfO2xhFoP1vu8
github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM=
github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=
github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=
github.com/uber/jaeger-client-go v2.30.0+incompatible h1:D6wyKGCecFaSRUpo8lCVbaOOb6ThwMmTEbhRwtKR97o=
github.com/uber/jaeger-client-go v2.30.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk=
github.com/uber/jaeger-lib v2.4.1+incompatible h1:td4jdvLcExb4cBISKIpHuGoVXh+dVKhn2Um6rjCsSsg=
github.com/uber/jaeger-lib v2.4.1+incompatible/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U=
github.com/ugorji/go/codec v1.2.12 h1:9LC83zGrHhuUA9l16C9AHXAqEV/2wBQ4nkvumAE65EE=
github.com/ugorji/go/codec v1.2.12/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg=
github.com/ultradns/ultradns-go-sdk v1.8.0-20241010134910-243eeec h1:2s/ghQ8wKE+UzD/hf3P4Gd1j0JI9ncbxv+nsypPoUYI=
@ -1847,26 +1796,19 @@ github.com/vinyldns/go-vinyldns v0.9.16 h1:GZJStDkcCk1F1AcRc64LuuMh+ENL8pHA0CVd4
github.com/vinyldns/go-vinyldns v0.9.16/go.mod h1:5qIJOdmzAnatKjurI+Tl4uTus7GJKJxb+zitufjHs3Q=
github.com/volcengine/volc-sdk-golang v1.0.206 h1:7NG8FCpvu9wbx+Z4I/p3tcTS2zdBqTZtJXgydunGy6g=
github.com/volcengine/volc-sdk-golang v1.0.206/go.mod h1:stZX+EPgv1vF4nZwOlEe8iGcriUPRBKX8zA19gXycOQ=
github.com/vultr/govultr/v3 v3.19.1 h1:31rOP5Tz40AOc8h6Ws4ryzqAniUBffgRhy9uMG/EFvs=
github.com/vultr/govultr/v3 v3.19.1/go.mod h1:q34Wd76upKmf+vxFMgaNMH3A8BbsPBmSYZUGC8oZa5w=
github.com/vultr/govultr/v3 v3.20.0 h1:O+Om6gXpN6ehwAIIKq5DyGuekpyHaoRlwrxTb44bDzA=
github.com/vultr/govultr/v3 v3.20.0/go.mod h1:q34Wd76upKmf+vxFMgaNMH3A8BbsPBmSYZUGC8oZa5w=
github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM=
github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg=
github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI=
github.com/xdg-go/scram v1.0.2/go.mod h1:1WAq6h33pAW+iRreB34OORO2Nf7qel3VV3fjBj+hCSs=
github.com/xdg-go/scram v1.1.2/go.mod h1:RT/sEzTbU5y00aCK8UOx6R7YryM0iF1N2MOmC3kKLN4=
github.com/xdg-go/stringprep v1.0.2/go.mod h1:8F9zXuvzgwmyT5DUm4GUfZGDdT3W+LCvS6+da4O5kxM=
github.com/xdg-go/stringprep v1.0.4/go.mod h1:mPGuuIYwz7CmR2bT9j4GbQqutWS1zV24gijq1dTyGkM=
github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU=
github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ=
github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y=
github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU=
github.com/yandex-cloud/go-genproto v0.1.0 h1:X/z0b1BdkZxJnJFh1enoGxuKENFaeGQJ2gjIZtGSajU=
github.com/yandex-cloud/go-genproto v0.1.0/go.mod h1:0LDD/IZLIUIV4iPH+YcF+jysO3jkSvADFGm4dCAuwQo=
github.com/yandex-cloud/go-sdk v0.3.0 h1:1lRrzBbcTpX4ZFXJnJZyCkNKWDvtiFC4USrbuNQUEQQ=
github.com/yandex-cloud/go-sdk v0.3.0/go.mod h1:dx7ojE5bXWhvsWWJ8kvgvb35X5bbNS3RNgBSgaTW9jA=
github.com/yosida95/uritemplate/v3 v3.0.2 h1:Ed3Oyj9yrmi9087+NczuL5BwkIc4wvTb5zIM+UJPGz4=
github.com/yosida95/uritemplate/v3 v3.0.2/go.mod h1:ILOh0sOhIJR3+L/8afwt/kE++YT040gmv5BQTMR2HP4=
github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA=
github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78 h1:ilQV1hzziu+LLM3zUTJ0trRztfwgjqKnBWNtSRkbmwM=
github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78/go.mod h1:aL8wCCfTfSfmXjznFBSZNN13rSJjlIOI1fUNAtF7rmI=
github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
@ -1892,9 +1834,6 @@ go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsX
go.etcd.io/etcd/client/v2 v2.305.7/go.mod h1:GQGT5Z3TBuAQGvgPfhR7VPySu/SudxmEkRq9BgzFU6s=
go.etcd.io/etcd/client/v3 v3.5.0/go.mod h1:AIKXXVX/DQXtfTEqBryiLTUXwON+GuvO6Z7lLS/oTh0=
go.etcd.io/etcd/client/v3 v3.5.9/go.mod h1:i/Eo5LrZ5IKqpbtpPDuaUnDOUv471oDg8cjQaUr2MbA=
go.mongodb.org/mongo-driver v1.13.1/go.mod h1:wcDf1JBCXy2mOW0bWHwO/IOYqdca1MPCwDtFu/Z9+eo=
go.mongodb.org/mongo-driver v1.17.3 h1:TQyXhnsWfWtgAhMtOgtYHMTkZIfBTpMTsMnd9ZBeHxQ=
go.mongodb.org/mongo-driver v1.17.3/go.mod h1:Hy04i7O2kC4RS06ZrhPRqj/u4DTYkFDAAccj+rVKqgQ=
go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=
go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
@ -1932,8 +1871,6 @@ go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ=
go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ=
go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE=
go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0=
go.uber.org/goleak v1.1.11-0.20210813005559-691160354723/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ=
go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ=
go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
@ -1946,8 +1883,6 @@ go.uber.org/multierr v1.7.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95a
go.uber.org/multierr v1.8.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak=
go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=
go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=
go.uber.org/ratelimit v0.3.1 h1:K4qVE+byfv/B3tC+4nYWP7v/6SimcO7HzHekoMNBma0=
go.uber.org/ratelimit v0.3.1/go.mod h1:6euWsTB6U/Nb3X++xEUXA8ciPJvr19Q/0h1+oDcJhRk=
go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA=
go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
@ -1957,8 +1892,8 @@ go.uber.org/zap v1.19.1/go.mod h1:j3DNczoxDZroyBnOT1L/Q79cfUMGZxlv/9dzN7SM1rI=
go.uber.org/zap v1.21.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw=
go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8=
go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=
golang.org/x/arch v0.16.0 h1:foMtLTdyOmIniqWCHjY6+JxuC54XP1fDwx4N0ASyW+U=
golang.org/x/arch v0.16.0/go.mod h1:JmwW7aLIoRUKgaTzhkiEFxvcEiQGyOg9BMonBJUS7EE=
golang.org/x/arch v0.17.0 h1:4O3dfLzd+lQewptAHqjewQZQDyEdejz3VwgeYwkZneU=
golang.org/x/arch v0.17.0/go.mod h1:bdwinDaKcfZUGpH09BB7ZmOfhalA8lQdzl62l8gGWsk=
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
@ -1970,7 +1905,6 @@ golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20200323165209-0ec3e9974c59/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20201012173705-84dcc777aaee/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20201112155050-0c6587e931a9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20201203163018-be400aefbc4c/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=
@ -1985,7 +1919,6 @@ golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5y
golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
golang.org/x/crypto v0.0.0-20211209193657-4570a0811e8b/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
golang.org/x/crypto v0.0.0-20220314234659-1baeb1ce4c0b/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
golang.org/x/crypto v0.0.0-20220829220503-c86fa9a7ed90/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw=
@ -1995,9 +1928,8 @@ golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliY
golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4=
golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU=
golang.org/x/crypto v0.20.0/go.mod h1:Xwo95rrVNIoSMx9wa1JroENMToLWn3RNVrTBpLHgZPQ=
golang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M=
golang.org/x/crypto v0.37.0 h1:kJNSjF/Xp7kU0iB2Z+9viTPMW4EqqsrywMXLJOOsXSE=
golang.org/x/crypto v0.37.0/go.mod h1:vg+k43peMZ0pUMhYmVAWysMK35e6ioLh3wB8ZCAfbVc=
golang.org/x/crypto v0.38.0 h1:jt+WWG8IZlBnVbomuhg2Mdq0+BBQaHbtqHEFEigjUV8=
golang.org/x/crypto v0.38.0/go.mod h1:MvrbAqul58NNYPKnOra203SB9vpuZW0e+RRZV+Ggqjw=
golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
@ -2092,7 +2024,6 @@ golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/
golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
golang.org/x/net v0.0.0-20201010224723-4f7140c49acb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
@ -2136,8 +2067,8 @@ golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns=
golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
golang.org/x/net v0.12.0/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA=
golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=
golang.org/x/net v0.39.0 h1:ZCu7HMWDxpXpaiKdhzIfaltL9Lp31x/3fCP11bc6/fY=
golang.org/x/net v0.39.0/go.mod h1:X7NRbYVEA+ewNkCNyJ513WmMdQ3BineSwVtN2zD/d+E=
golang.org/x/net v0.40.0 h1:79Xs7wF06Gbdcg4kdCCIQArK11Z1hr5POQ6+fIYHNuY=
golang.org/x/net v0.40.0/go.mod h1:y0hY0exeL2Pku80/zKK7tpntoX23cqL3Oa6njdgRtds=
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
@ -2167,8 +2098,8 @@ golang.org/x/oauth2 v0.4.0/go.mod h1:RznEsdpjGAINPTOF0UH/t+xJ75L18YO3Ho6Pyn+uRec
golang.org/x/oauth2 v0.5.0/go.mod h1:9/XBHVqLaWO3/BRHs5jbpYCnOZVjj5V0ndyaAM7KB4I=
golang.org/x/oauth2 v0.6.0/go.mod h1:ycmewcwgD4Rpr3eZJLSB4Kyyljb3qDh40vJ8STE5HKw=
golang.org/x/oauth2 v0.7.0/go.mod h1:hPLQkd9LyjfXTiRohC/41GhcFqxisoUQ99sCUOHO9x4=
golang.org/x/oauth2 v0.29.0 h1:WdYw2tdTK1S8olAzWHdgeqfy+Mtm9XNhv/xJsY65d98=
golang.org/x/oauth2 v0.29.0/go.mod h1:onh5ek6nERTohokkhCD/y2cV4Do3fxFHFuAejCkRWT8=
golang.org/x/oauth2 v0.30.0 h1:dnDm7JmhM45NNpd8FDDeLhK6FwqbOf4MLCM9zb1BOHI=
golang.org/x/oauth2 v0.30.0/go.mod h1:B++QgG3ZKulg6sRPGD/mqlHQs5rB3Ml9erfeDY7xKlU=
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
@ -2185,8 +2116,8 @@ golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJ
golang.org/x/sync v0.0.0-20220819030929-7fc1605a5dde/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20220929204114-8fcdb60fdcc0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.13.0 h1:AauUjRAJ9OSnvULf/ARrrVywoJDy0YS2AwQ98I37610=
golang.org/x/sync v0.13.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
golang.org/x/sync v0.14.0 h1:woo0S4Yywslg6hp4eUFjTVOyKt0RookbpAHG4c1HmhQ=
golang.org/x/sync v0.14.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@ -2308,9 +2239,8 @@ golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.32.0 h1:s77OFDvIQeibCmezSnk/q6iAfkdiQaJi4VzroCFrN20=
golang.org/x/sys v0.32.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw=
golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
@ -2326,9 +2256,6 @@ golang.org/x/term v0.10.0/go.mod h1:lpqdcUyK/oCiQxvxVrppt5ggO2KCZ5QblwqPnfZ6d5o=
golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU=
golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0=
golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk=
golang.org/x/term v0.19.0/go.mod h1:2CuTdWZ7KHSQwUzKva0cbMg6q2DMI3Mmxp+gKJbskEk=
golang.org/x/term v0.31.0 h1:erwDkOK1Msy6offm1mOgvspSkslFnIGsFnxOKoufg3o=
golang.org/x/term v0.31.0/go.mod h1:R4BeIy7D95HzImkxGkTW1UQTtP54tio2RyHz7PwK0aw=
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
@ -2348,8 +2275,8 @@ golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
golang.org/x/text v0.24.0 h1:dd5Bzh4yt5KYA8f9CJHCP4FB4D51c2c6JvN37xJJkJ0=
golang.org/x/text v0.24.0/go.mod h1:L8rBsPeo2pSS+xqN0d5u2ikmjtmoJbDBT1b7nHvFCdU=
golang.org/x/text v0.25.0 h1:qVyWApTSYLk/drJRO5mDlNYskwQznZmkpV2c8q9zls4=
golang.org/x/text v0.25.0/go.mod h1:WEdwpYrmk1qmdHvhkSTNPm3app7v4rsT8F2UD6+VHIA=
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
@ -2434,8 +2361,8 @@ golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc
golang.org/x/tools v0.3.0/go.mod h1:/rWhSS2+zyEVwoJf8YAX6L2f0ntZ7Kn/mGgAWcipA5k=
golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s=
golang.org/x/tools v0.32.0 h1:Q7N1vhpkQv7ybVzLFtTjvQya2ewbwNDZzUgfXGqtMWU=
golang.org/x/tools v0.32.0/go.mod h1:ZxrU41P/wAbZD8EDa6dDCa6XfpkhJ7HFMjHJXfBDu8s=
golang.org/x/tools v0.33.0 h1:4qz2S3zmRxbGIhDIAgjxvFutSvH5EfnsYrRBj0UI0bc=
golang.org/x/tools v0.33.0/go.mod h1:CIJMaWEY88juyUfo7UbgPqbC8rU2OqfAV1h2Qp0oMYI=
golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
@ -2512,8 +2439,8 @@ google.golang.org/api v0.110.0/go.mod h1:7FC4Vvx1Mooxh8C5HWjzZHcavuS2f6pmJpZx60c
google.golang.org/api v0.111.0/go.mod h1:qtFHvU9mhgTJegR31csQ+rwxyUTHOKFqCKWp1J0fdw0=
google.golang.org/api v0.114.0/go.mod h1:ifYI2ZsFK6/uGddGfAD5BMxlnkBqCmqHSDUVi45N5Yg=
google.golang.org/api v0.122.0/go.mod h1:gcitW0lvnyWjSp9nKxAbdHKIZ6vF4aajGueeslZOyms=
google.golang.org/api v0.231.0 h1:LbUD5FUl0C4qwia2bjXhCMH65yz1MLPzA/0OYEsYY7Q=
google.golang.org/api v0.231.0/go.mod h1:H52180fPI/QQlUc0F4xWfGZILdv09GCWKt2bcsn164A=
google.golang.org/api v0.232.0 h1:qGnmaIMf7KcuwHOlF3mERVzChloDYwRfOJOrHt8YC3I=
google.golang.org/api v0.232.0/go.mod h1:p9QCfBWZk1IJETUdbTKloR5ToFdKbYh2fkjsUL6vNoY=
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
@ -2654,12 +2581,10 @@ google.golang.org/genproto v0.0.0-20230323212658-478b75c54725/go.mod h1:UUQDJDOl
google.golang.org/genproto v0.0.0-20230330154414-c0448cd141ea/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak=
google.golang.org/genproto v0.0.0-20230331144136-dcfb400f0633/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak=
google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1/go.mod h1:nKE/iIaLqn2bQwXBg8f1g2Ylh6r5MN5CmZvuzZCgsCU=
google.golang.org/genproto v0.0.0-20250428153025-10db94c68c34 h1:oklGWmm0ZiCw4efmdYZo5MF9t6nRvGzM5+0klSjOmGM=
google.golang.org/genproto v0.0.0-20250428153025-10db94c68c34/go.mod h1:hiH/EqX5GBdTyIpkqMqDGUHDiBniln8b4FCw+NzPxQY=
google.golang.org/genproto/googleapis/api v0.0.0-20250428153025-10db94c68c34 h1:0PeQib/pH3nB/5pEmFeVQJotzGohV0dq4Vcp09H5yhE=
google.golang.org/genproto/googleapis/api v0.0.0-20250428153025-10db94c68c34/go.mod h1:0awUlEkap+Pb1UMeJwJQQAdJQrt3moU7J2moTy69irI=
google.golang.org/genproto/googleapis/rpc v0.0.0-20250428153025-10db94c68c34 h1:h6p3mQqrmT1XkHVTfzLdNz1u7IhINeZkz67/xTbOuWs=
google.golang.org/genproto/googleapis/rpc v0.0.0-20250428153025-10db94c68c34/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A=
google.golang.org/genproto/googleapis/api v0.0.0-20250505200425-f936aa4a68b2 h1:vPV0tzlsK6EzEDHNNH5sa7Hs9bd7iXR7B1tSiPepkV0=
google.golang.org/genproto/googleapis/api v0.0.0-20250505200425-f936aa4a68b2/go.mod h1:pKLAc5OolXC3ViWGI62vvC0n10CpwAtRcTNCFwTKBEw=
google.golang.org/genproto/googleapis/rpc v0.0.0-20250505200425-f936aa4a68b2 h1:IqsN8hx+lWLqlN+Sc3DoMy/watjofWiU8sRFgQ8fhKM=
google.golang.org/genproto/googleapis/rpc v0.0.0-20250505200425-f936aa4a68b2/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A=
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
@ -2766,7 +2691,6 @@ gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gorm.io/datatypes v1.2.5 h1:9UogU3jkydFVW1bIVVeoYsTpLRgwDVW3rHfJG6/Ek9I=
@ -2782,12 +2706,15 @@ gorm.io/driver/sqlserver v1.5.4 h1:xA+Y1KDNspv79q43bPyjDMUgHoYHLhXYmdFcYPobg8g=
gorm.io/driver/sqlserver v1.5.4/go.mod h1:+frZ/qYmuna11zHPlh5oc2O6ZA/lS88Keb0XSH1Zh/g=
gorm.io/gen v0.3.27 h1:ziocAFLpE7e0g4Rum69pGfB9S6DweTxK8gAun7cU8as=
gorm.io/gen v0.3.27/go.mod h1:9zquz2xD1f3Eb/eHq4oLn2z6vDVvQlCY5S3uMBLv4EA=
gorm.io/gorm v1.25.12 h1:I0u8i2hWQItBq1WfE0o2+WuL9+8L21K9e2HHSTE/0f8=
gorm.io/gorm v1.25.12/go.mod h1:xh7N7RHfYlNc5EmcI/El95gXusucDrQnHXe0+CgWcLQ=
gorm.io/gorm v1.24.7-0.20230306060331-85eaf9eeda11/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k=
gorm.io/gorm v1.25.0/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k=
gorm.io/gorm v1.25.7/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=
gorm.io/gorm v1.26.1 h1:ghB2gUI9FkS46luZtn6DLZ0f6ooBJ5IbVej2ENFDjRw=
gorm.io/gorm v1.26.1/go.mod h1:8Z33v652h4//uMA76KjeDH8mJXPm1QNCYrMeatR0DOE=
gorm.io/hints v1.1.2 h1:b5j0kwk5p4+3BtDtYqqfY+ATSxjj+6ptPgVveuynn9o=
gorm.io/hints v1.1.2/go.mod h1:/ARdpUHAtyEMCh5NNi3tI7FsGh+Cj/MIUlvNxCNCFWg=
gorm.io/plugin/dbresolver v1.5.3 h1:wFwINGZZmttuu9h7XpvbDHd8Lf9bb8GNzp/NpAMV2wU=
gorm.io/plugin/dbresolver v1.5.3/go.mod h1:TSrVhaUg2DZAWP3PrHlDlITEJmNOkL0tFTjvTEsQ4XE=
gorm.io/plugin/dbresolver v1.6.0 h1:XvKDeOtTn1EIX6s4SrKpEH82q0gXVemhYjbYZFGFVcw=
gorm.io/plugin/dbresolver v1.6.0/go.mod h1:tctw63jdrOezFR9HmrKnPkmig3m5Edem9fdxk9bQSzM=
gotest.tools/v3 v3.5.1 h1:EENdUnS3pdur5nybKYIh2Vfgc8IUNBjxDPSjtiJcOzU=
gotest.tools/v3 v3.5.1/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU=
honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=

View file

@ -6,6 +6,13 @@ DataPath=${DATA_PATH:-/usr/local/etc/nginx-ui}
# Service Path
ServicePath="/etc/systemd/system/nginx-ui.service"
# Init.d Path
InitPath="/etc/init.d/nginx-ui"
# OpenRC Path
OpenRCPath="/etc/init.d/nginx-ui"
# Service Type (systemd, openrc, initd)
SERVICE_TYPE=''
# Latest release version
RELEASE_LATEST=''
@ -44,8 +51,8 @@ FontSkyBlue="\033[36m";
FontWhite="\033[37m";
FontSuffix="\033[0m";
curl() {
$(type -P curl) -L -q --retry 5 --retry-delay 10 --retry-max-time 60 "$@"
curl_with_retry() {
$(type -P curl) -x "${PROXY}" -L -q --retry 5 --retry-delay 10 --retry-max-time 60 "$@"
}
## Demo function for processing parameters
@ -95,9 +102,9 @@ judgment_parameters() {
esac
shift
done
if ((INSTALL+HELP+REMOVE==0)); then
if [ "$(expr $INSTALL + $HELP + $REMOVE)" -eq 0 ]; then
INSTALL='1'
elif ((INSTALL+HELP+REMOVE>1)); then
elif [ "$(expr $INSTALL + $HELP + $REMOVE)" -gt 1 ]; then
echo 'You can only choose one action.'
exit 1
fi
@ -126,7 +133,7 @@ systemd_cat_config() {
check_if_running_as_root() {
# If you want to run as another user, please modify $EUID to be owned by this user
if [[ "$EUID" -ne '0' ]]; then
if [ "$(id -u)" != "0" ]; then
echo -e "${FontRed}error: You must run this script as root!${FontSuffix}"
exit 1
fi
@ -164,17 +171,7 @@ identify_the_operating_system_and_architecture() {
echo -e "${FontRed}error: Don't use outdated Linux distributions.${FontSuffix}"
exit 1
fi
# Do not combine this judgment condition with the following judgment condition.
## Be aware of Linux distribution like Gentoo, which kernel supports switch between Systemd and OpenRC.
if [[ -f /.dockerenv ]] || grep -q 'docker\|lxc' /proc/1/cgroup && [[ "$(type -P systemctl)" ]]; then
true
elif [[ -d /run/systemd/system ]] || grep -q systemd <(ls -l /sbin/init); then
true
else
echo -e "${FontRed}error: Only Linux distributions using systemd are supported by this script."
echo -e "${FontRed}error: Please download the pre-built binary from the release page or build it manually.${FontSuffix}"
exit 1
fi
if [[ "$(type -P apt)" ]]; then
PACKAGE_MANAGEMENT_INSTALL='apt -y --no-install-recommends install'
PACKAGE_MANAGEMENT_REMOVE='apt purge'
@ -190,10 +187,29 @@ identify_the_operating_system_and_architecture() {
elif [[ "$(type -P pacman)" ]]; then
PACKAGE_MANAGEMENT_INSTALL='pacman -Syu --noconfirm'
PACKAGE_MANAGEMENT_REMOVE='pacman -Rsn'
elif [[ "$(type -P opkg)" ]]; then
PACKAGE_MANAGEMENT_INSTALL='opkg install'
PACKAGE_MANAGEMENT_REMOVE='opkg remove'
elif [[ "$(type -P apk)" ]]; then
PACKAGE_MANAGEMENT_INSTALL='apk add --no-cache'
PACKAGE_MANAGEMENT_REMOVE='apk del'
else
echo -e "${FontRed}error: This script does not support the package manager in this operating system.${FontSuffix}"
exit 1
fi
# Do not combine this judgment condition with the following judgment condition.
## Be aware of Linux distribution like Gentoo, which kernel supports switch between Systemd and OpenRC.
if [[ -f /.dockerenv ]] || grep -q 'docker\|lxc' /proc/1/cgroup && [[ "$(type -P systemctl)" ]]; then
SERVICE_TYPE='systemd'
elif [[ -d /run/systemd/system ]] || grep -q systemd <(ls -l /sbin/init); then
SERVICE_TYPE='systemd'
elif [[ "$(type -P rc-update)" ]] || [[ "$(type -P apk)" ]]; then
SERVICE_TYPE='openrc'
else
SERVICE_TYPE='initd'
echo -e "${FontYellow}warning: No systemd or OpenRC detected, falling back to init.d.${FontSuffix}"
fi
else
echo -e "${FontRed}error: This operating system is not supported by this script.${FontSuffix}"
exit 1
@ -215,7 +231,7 @@ install_software() {
get_latest_version() {
# Get latest release version number
local latest_release
if ! latest_release=$(curl -x "${PROXY}" -sS -H "Accept: application/vnd.github.v3+json" "https://api.github.com/repos/0xJacky/nginx-ui/releases/latest"); then
if ! latest_release=$(curl_with_retry -sS -H "Accept: application/vnd.github.v3+json" "https://api.github.com/repos/0xJacky/nginx-ui/releases/latest"); then
echo -e "${FontRed}error: Failed to get release list, please check your network.${FontSuffix}"
exit 1
fi
@ -238,7 +254,7 @@ download_nginx_ui() {
download_link="${RPROXY}https://github.com/0xJacky/nginx-ui/releases/download/$RELEASE_LATEST/nginx-ui-linux-$MACHINE.tar.gz"
echo "Downloading Nginx UI archive: $download_link"
if ! curl -x "${PROXY}" -R -H 'Cache-Control: no-cache' -L -o "$TAR_FILE" "$download_link"; then
if ! curl_with_retry -R -H 'Cache-Control: no-cache' -L -o "$TAR_FILE" "$download_link"; then
echo 'error: Download failed! Please check your network or try again.'
return 1
fi
@ -258,29 +274,35 @@ decompression() {
install_bin() {
NAME="nginx-ui"
install -m 755 "${TMP_DIRECTORY}/$NAME" "/usr/local/bin/$NAME"
if command -v install >/dev/null 2>&1; then
install -m 755 "${TMP_DIRECTORY}/$NAME" "/usr/local/bin/$NAME"
else
cp "${TMP_DIRECTORY}/$NAME" "/usr/bin/$NAME"
chmod 755 "/usr/bin/$NAME"
fi
}
install_service() {
if [[ "$SERVICE_TYPE" == "systemd" ]]; then
install_systemd_service
elif [[ "$SERVICE_TYPE" == "openrc" ]]; then
install_openrc_service
else
install_initd_service
fi
}
install_systemd_service() {
mkdir -p '/etc/systemd/system/nginx-ui.service.d'
cat > "$ServicePath" << EOF
[Unit]
Description=Yet another WebUI for Nginx
Documentation=https://github.com/0xJacky/nginx-ui
After=network.target
local service_download_link="${RPROXY}https://raw.githubusercontent.com/0xJacky/nginx-ui/main/resources/services/nginx-ui.service"
[Service]
Type=simple
ExecStart=/usr/local/bin/nginx-ui -config /usr/local/etc/nginx-ui/app.ini
RuntimeDirectory=nginx-ui
WorkingDirectory=/var/run/nginx-ui
Restart=on-failure
TimeoutStopSec=5
KillMode=mixed
echo "Downloading Nginx UI service file: $service_download_link"
if ! curl_with_retry -R -H 'Cache-Control: no-cache' -L -o "$ServicePath" "$service_download_link"; then
echo -e "${FontRed}error: Download service file failed! Please check your network or try again.${FontSuffix}"
return 1
fi
[Install]
WantedBy=multi-user.target
EOF
chmod 644 "$ServicePath"
echo "info: Systemd service files have been installed successfully!"
echo -e "${FontGreen}note: The following are the actual parameters for the nginx-ui service startup."
@ -290,6 +312,51 @@ EOF
SYSTEMD='1'
}
install_openrc_service() {
local openrc_download_link="${RPROXY}https://raw.githubusercontent.com/0xJacky/nginx-ui/main/resources/services/nginx-ui.rc"
echo "Downloading Nginx UI OpenRC file: $openrc_download_link"
if ! curl_with_retry -R -H 'Cache-Control: no-cache' -L -o "$OpenRCPath" "$openrc_download_link"; then
echo -e "${FontRed}error: Download OpenRC file failed! Please check your network or try again.${FontSuffix}"
return 1
fi
chmod 755 "$OpenRCPath"
echo "info: OpenRC service file has been installed successfully!"
echo -e "${FontGreen}note: The OpenRC service is installed to '$OpenRCPath'.${FontSuffix}"
cat_file_with_name "$OpenRCPath"
# Add to default runlevel
rc-update add nginx-ui default
OPENRC='1'
}
install_initd_service() {
# Download init.d script
local initd_download_link="${RPROXY}https://raw.githubusercontent.com/0xJacky/nginx-ui/main/resources/services/nginx-ui.init"
echo "Downloading Nginx UI init.d file: $initd_download_link"
if ! curl_with_retry -R -H 'Cache-Control: no-cache' -L -o "$InitPath" "$initd_download_link"; then
echo -e "${FontRed}error: Download init.d file failed! Please check your network or try again.${FontSuffix}"
exit 1
fi
chmod 755 "$InitPath"
echo "info: Init.d service file has been installed successfully!"
echo -e "${FontGreen}note: The init.d service is installed to '$InitPath'.${FontSuffix}"
cat_file_with_name "$InitPath"
# Add service to startup based on distro
if [ -x /sbin/chkconfig ]; then
/sbin/chkconfig --add nginx-ui
elif [ -x /usr/sbin/update-rc.d ]; then
/usr/sbin/update-rc.d nginx-ui defaults
fi
INITD='1'
}
install_config() {
mkdir -p "$DataPath"
if [[ ! -f "$DataPath/app.ini" ]]; then
@ -317,7 +384,7 @@ EOF
}
start_nginx_ui() {
if [[ -f "$ServicePath" ]]; then
if [[ "$SERVICE_TYPE" == "systemd" ]]; then
systemctl start nginx-ui
sleep 1s
if systemctl -q is-active nginx-ui; then
@ -326,34 +393,66 @@ start_nginx_ui() {
echo -e "${FontRed}error: Failed to start the Nginx UI service.${FontSuffix}"
exit 1
fi
elif [[ "$SERVICE_TYPE" == "openrc" ]]; then
rc-service nginx-ui start
sleep 1s
if rc-service nginx-ui status | grep -q "started"; then
echo 'info: Start the Nginx UI service.'
else
echo -e "${FontRed}error: Failed to start the Nginx UI service.${FontSuffix}"
exit 1
fi
else
# init.d
$InitPath start
sleep 1s
if $InitPath status >/dev/null 2>&1; then
echo 'info: Start the Nginx UI service.'
else
echo -e "${FontRed}error: Failed to start the Nginx UI service.${FontSuffix}"
exit 1
fi
fi
}
stop_nginx_ui() {
if ! systemctl stop nginx-ui; then
echo -e "${FontRed}error: Failed to stop the Nginx UI service.${FontSuffix}"
exit 1
if [[ "$SERVICE_TYPE" == "systemd" ]]; then
if ! systemctl stop nginx-ui; then
echo -e "${FontRed}error: Failed to stop the Nginx UI service.${FontSuffix}"
exit 1
fi
elif [[ "$SERVICE_TYPE" == "openrc" ]]; then
if ! rc-service nginx-ui stop; then
echo -e "${FontRed}error: Failed to stop the Nginx UI service.${FontSuffix}"
exit 1
fi
else
# init.d
if ! $InitPath stop; then
echo -e "${FontRed}error: Failed to stop the Nginx UI service.${FontSuffix}"
exit 1
fi
fi
echo "info: Nginx UI service Stopped."
}
remove_nginx_ui() {
if systemctl list-unit-files | grep -qw 'nginx-ui'; then
if [[ "$SERVICE_TYPE" == "systemd" && $(systemctl list-unit-files | grep -qw 'nginx-ui') ]]; then
if [[ -n "$(pidof nginx-ui)" ]]; then
stop_nginx_ui
fi
local delete_files=('/usr/local/bin/nginx-ui' '/etc/systemd/system/nginx-ui.service' '/etc/systemd/system/nginx-ui.service.d')
delete_files="/usr/local/bin/nginx-ui /etc/systemd/system/nginx-ui.service /etc/systemd/system/nginx-ui.service.d"
if [[ "$PURGE" -eq '1' ]]; then
[[ -d "$DataPath" ]] && delete_files+=("$DataPath")
[[ -d "$DataPath" ]] && delete_files="$delete_files $DataPath"
fi
systemctl disable nginx-ui
if ! ("rm" -r "${delete_files[@]}"); then
if ! ("rm" -r $delete_files); then
echo -e "${FontRed}error: Failed to remove Nginx UI.${FontSuffix}"
exit 1
else
for i in "${!delete_files[@]}"
for file in $delete_files
do
echo "removed: ${delete_files[$i]}"
echo "removed: $file"
done
systemctl daemon-reload
echo "You may need to execute a command to remove dependent software: $PACKAGE_MANAGEMENT_REMOVE curl"
@ -364,6 +463,66 @@ remove_nginx_ui() {
fi
exit 0
fi
elif [[ "$SERVICE_TYPE" == "openrc" && -f "$OpenRCPath" ]]; then
if rc-service nginx-ui status | grep -q "started"; then
stop_nginx_ui
fi
delete_files="/usr/local/bin/nginx-ui $OpenRCPath"
if [[ "$PURGE" -eq '1' ]]; then
[[ -d "$DataPath" ]] && delete_files="$delete_files $DataPath"
fi
# Remove from runlevels
rc-update del nginx-ui default
if ! ("rm" -r $delete_files); then
echo -e "${FontRed}error: Failed to remove Nginx UI.${FontSuffix}"
exit 1
else
for file in $delete_files
do
echo "removed: $file"
done
echo "You may need to execute a command to remove dependent software: $PACKAGE_MANAGEMENT_REMOVE curl"
echo 'info: Nginx UI has been removed.'
if [[ "$PURGE" -eq '0' ]]; then
echo 'info: If necessary, manually delete the configuration and log files.'
echo "info: e.g., $DataPath ..."
fi
exit 0
fi
elif [[ "$SERVICE_TYPE" == "initd" && -f "$InitPath" ]]; then
if [[ -n "$(pidof nginx-ui)" ]]; then
stop_nginx_ui
fi
delete_files="/usr/local/bin/nginx-ui $InitPath"
if [[ "$PURGE" -eq '1' ]]; then
[[ -d "$DataPath" ]] && delete_files="$delete_files $DataPath"
fi
# Remove from startup based on distro
if [ -x /sbin/chkconfig ]; then
/sbin/chkconfig --del nginx-ui
elif [ -x /usr/sbin/update-rc.d ]; then
/usr/sbin/update-rc.d -f nginx-ui remove
fi
if ! ("rm" -r $delete_files); then
echo -e "${FontRed}error: Failed to remove Nginx UI.${FontSuffix}"
exit 1
else
for file in $delete_files
do
echo "removed: $file"
done
echo "You may need to execute a command to remove dependent software: $PACKAGE_MANAGEMENT_REMOVE curl"
echo 'info: Nginx UI has been removed.'
if [[ "$PURGE" -eq '0' ]]; then
echo 'info: If necessary, manually delete the configuration and log files.'
echo "info: e.g., $DataPath ..."
fi
exit 0
fi
else
echo 'error: Nginx UI is not installed.'
exit 1
@ -403,6 +562,10 @@ main() {
TMP_DIRECTORY="$(mktemp -d)"
TAR_FILE="${TMP_DIRECTORY}/nginx-ui-linux-$MACHINE.tar.gz"
# Auto install OpenRC on Alpine Linux if needed
if [[ "$(type -P apk)" ]]; then
install_software 'openrc' 'openrc'
fi
install_software 'curl' 'curl'
# Install from a local file
@ -421,18 +584,34 @@ main() {
fi
# Determine if nginx-ui is running
if systemctl list-unit-files | grep -qw 'nginx-ui'; then
NGINX_UI_RUNNING='0'
if [[ "$SERVICE_TYPE" == "systemd" && $(systemctl list-unit-files | grep -qw 'nginx-ui') ]]; then
if [[ -n "$(pidof nginx-ui)" ]]; then
stop_nginx_ui
NGINX_UI_RUNNING='1'
fi
elif [[ "$SERVICE_TYPE" == "openrc" && -f "$OpenRCPath" ]]; then
if rc-service nginx-ui status | grep -q "started"; then
stop_nginx_ui
NGINX_UI_RUNNING='1'
fi
elif [[ "$SERVICE_TYPE" == "initd" && -f "$InitPath" ]]; then
if [[ -n "$(pidof nginx-ui)" ]]; then
stop_nginx_ui
NGINX_UI_RUNNING='1'
fi
fi
install_bin
echo 'installed: /usr/local/bin/nginx-ui'
install_service
if [[ "$SYSTEMD" -eq '1' ]]; then
if [[ "$SERVICE_TYPE" == "systemd" && "$SYSTEMD" -eq '1' ]]; then
echo "installed: ${ServicePath}"
elif [[ "$SERVICE_TYPE" == "openrc" && "$OPENRC" -eq '1' ]]; then
echo "installed: ${OpenRCPath}"
elif [[ "$SERVICE_TYPE" == "initd" && "$INITD" -eq '1' ]]; then
echo "installed: ${InitPath}"
fi
"rm" -r "$TMP_DIRECTORY"
@ -444,14 +623,35 @@ main() {
if [[ "$NGINX_UI_RUNNING" -eq '1' ]]; then
start_nginx_ui
else
systemctl start nginx-ui
systemctl enable nginx-ui
sleep 1s
if [[ "$SERVICE_TYPE" == "systemd" ]]; then
systemctl start nginx-ui
systemctl enable nginx-ui
sleep 1s
if systemctl -q is-active nginx-ui; then
echo "info: Start and enable the Nginx UI service."
else
echo -e "${FontYellow}warning: Failed to enable and start the Nginx UI service.${FontSuffix}"
if systemctl -q is-active nginx-ui; then
echo "info: Start and enable the Nginx UI service."
else
echo -e "${FontYellow}warning: Failed to enable and start the Nginx UI service.${FontSuffix}"
fi
elif [[ "$SERVICE_TYPE" == "openrc" ]]; then
rc-service nginx-ui start
rc-update add nginx-ui default
sleep 1s
if rc-service nginx-ui status | grep -q "running"; then
echo "info: Started and added the Nginx UI service to default runlevel."
else
echo -e "${FontYellow}warning: Failed to start the Nginx UI service.${FontSuffix}"
fi
elif [[ "$SERVICE_TYPE" == "initd" ]]; then
$InitPath start
sleep 1s
if $InitPath status >/dev/null 2>&1; then
echo "info: Started the Nginx UI service."
else
echo -e "${FontYellow}warning: Failed to start the Nginx UI service.${FontSuffix}"
fi
fi
fi
}

View file

@ -348,7 +348,7 @@ func (s *Scanner) scanSingleFile(filePath string) error {
if strings.Contains(includePath, "*") {
// If it's a relative path, make it absolute based on nginx config dir
if !filepath.IsAbs(includePath) {
configDir := filepath.Dir(nginx.GetConfPath("", ""))
configDir := filepath.Dir(nginx.GetConfPath())
includePath = filepath.Join(configDir, includePath)
}
@ -373,7 +373,7 @@ func (s *Scanner) scanSingleFile(filePath string) error {
// Handle single file include
// If it's a relative path, make it absolute based on nginx config dir
if !filepath.IsAbs(includePath) {
configDir := filepath.Dir(nginx.GetConfPath("", ""))
configDir := filepath.Dir(nginx.GetConfPath())
includePath = filepath.Join(configDir, includePath)
}
@ -413,7 +413,7 @@ func (s *Scanner) ScanAllConfigs() error {
}()
// Get the main config file
mainConfigPath := nginx.GetConfPath("", "nginx.conf")
mainConfigPath := nginx.GetConfEntryPath()
err := s.scanSingleFile(mainConfigPath)
if err != nil {
logger.Error("Failed to scan main config:", err)

View file

@ -13,6 +13,8 @@ import (
// InitRegister init the default user for acme
func InitRegister(ctx context.Context) {
initBroadcastStatus(ctx)
email := settings.CertSettings.Email
if settings.CertSettings.Email == "" {
return
@ -52,8 +54,6 @@ func InitRegister(ctx context.Context) {
}
logger.Info("ACME Default User registered")
initBroadcastStatus(ctx)
}
func GetDefaultACMEUser() (user *model.AcmeUser, err error) {

View file

@ -24,6 +24,22 @@ func NewAppCmd() *cli.Command {
serve = true
return nil
},
Flags: []cli.Flag{
&cli.StringFlag{
Name: "pidfile",
Usage: "`PATH` to the PID file",
Action: func(ctx context.Context, command *cli.Command, s string) error {
// remove `pidfile` parameter from os.Args
for i, arg := range os.Args {
if arg == "--pidfile" || arg == "-p" {
os.Args = append(os.Args[:i], os.Args[i+2:]...)
break
}
}
return nil
},
},
},
},
{
Name: "reset-password",

View file

@ -7,7 +7,8 @@ import (
)
func InNginxUIOfficialDocker() bool {
return cast.ToBool(os.Getenv("NGINX_UI_OFFICIAL_DOCKER"))
return cast.ToBool(os.Getenv("NGINX_UI_OFFICIAL_DOCKER")) &&
!cast.ToBool(os.Getenv("NGINX_UI_IGNORE_DOCKER_SOCKET"))
}
func DockerSocketExists() bool {

View file

@ -19,6 +19,7 @@ import (
"github.com/0xJacky/Nginx-UI/internal/helper"
"github.com/0xJacky/Nginx-UI/internal/mcp"
"github.com/0xJacky/Nginx-UI/internal/passkey"
"github.com/0xJacky/Nginx-UI/internal/self_check"
"github.com/0xJacky/Nginx-UI/internal/validation"
"github.com/0xJacky/Nginx-UI/model"
"github.com/0xJacky/Nginx-UI/query"
@ -43,6 +44,7 @@ func Boot(ctx context.Context) {
InitNodeSecret,
InitCryptoSecret,
validation.Init,
self_check.Init,
func() {
InitDatabase(ctx)
cache.Init(ctx)

View file

@ -7,7 +7,7 @@ import (
)
var FixSiteAndStreamPathUnique = &gormigrate.Migration{
ID: "20250405000003",
ID: "202505070000001",
Migrate: func(tx *gorm.DB) error {
// Check if sites table exists
if tx.Migrator().HasTable(&model.Site{}) {
@ -19,36 +19,38 @@ var FixSiteAndStreamPathUnique = &gormigrate.Migration{
if err := tx.Model(&model.Site{}).
Select("path, count(*) as count").
Group("path").
Having("count(*) > 1").
Find(&siteDuplicates).Error; err != nil {
return err
}
// For each duplicated path, delete all but the one with max id
for _, dup := range siteDuplicates {
if err := tx.Exec(`DELETE FROM sites WHERE path = ? AND id NOT IN
(SELECT max(id) FROM sites WHERE path = ?)`, dup.Path, dup.Path).Error; err != nil {
Group("path").
Having("count(*) > 1").
Unscoped().
Find(&siteDuplicates).Error; err != nil {
return err
}
// For each duplicated path, delete all but the one with max id
for _, dup := range siteDuplicates {
if err := tx.Exec(`DELETE FROM sites WHERE path = ? AND id NOT IN
(SELECT max(id) FROM sites WHERE path = ?)`, dup.Path, dup.Path).Error; err != nil {
return err
}
}
}
}
// Check if streams table exists
if tx.Migrator().HasTable(&model.Stream{}) {
// Find duplicated paths in streams table
var streamDuplicates []struct {
Path string
Count int
}
Count int
}
if err := tx.Model(&model.Stream{}).
Select("path, count(*) as count").
Group("path").
Having("count(*) > 1").
Find(&streamDuplicates).Error; err != nil {
return err
}
if err := tx.Model(&model.Stream{}).
Select("path, count(*) as count").
Group("path").
Having("count(*) > 1").
Unscoped().
Find(&streamDuplicates).Error; err != nil {
return err
}
// For each duplicated path, delete all but the one with max id
for _, dup := range streamDuplicates {

View file

@ -49,6 +49,17 @@ func getNginxV() string {
return string(out)
}
// getNginxT executes nginx -T and returns the output
func getNginxT() string {
exePath := getNginxExePath()
out, err := execCommand(exePath, "-T")
if err != nil {
logger.Error(err)
return ""
}
return out
}
// Resolves relative paths by joining them with the nginx executable directory on Windows
func resolvePath(path string) string {
if path == "" {

225
internal/nginx/modules.go Normal file
View file

@ -0,0 +1,225 @@
package nginx
import (
"os"
"regexp"
"strings"
"sync"
"time"
"github.com/elliotchance/orderedmap/v3"
)
const (
ModuleStream = "stream"
)
type Module struct {
Name string `json:"name"`
Params string `json:"params,omitempty"`
Dynamic bool `json:"dynamic"`
Loaded bool `json:"loaded"`
}
// modulesCache stores the cached modules list and related metadata
var (
modulesCache = orderedmap.NewOrderedMap[string, *Module]()
modulesCacheLock sync.RWMutex
lastPIDPath string
lastPIDModTime time.Time
lastPIDSize int64
)
// clearModulesCache clears the modules cache
func clearModulesCache() {
modulesCacheLock.Lock()
defer modulesCacheLock.Unlock()
modulesCache = orderedmap.NewOrderedMap[string, *Module]()
lastPIDPath = ""
lastPIDModTime = time.Time{}
lastPIDSize = 0
}
// isPIDFileChanged checks if the PID file has changed since the last check
func isPIDFileChanged() bool {
pidPath := GetPIDPath()
// If PID path has changed, consider it changed
if pidPath != lastPIDPath {
return true
}
// If Nginx is not running, consider PID changed
if !IsNginxRunning() {
return true
}
// Check if PID file has changed (modification time or size)
fileInfo, err := os.Stat(pidPath)
if err != nil {
return true
}
modTime := fileInfo.ModTime()
size := fileInfo.Size()
return modTime != lastPIDModTime || size != lastPIDSize
}
// updatePIDFileInfo updates the stored PID file information
func updatePIDFileInfo() {
pidPath := GetPIDPath()
if fileInfo, err := os.Stat(pidPath); err == nil {
modulesCacheLock.Lock()
defer modulesCacheLock.Unlock()
lastPIDPath = pidPath
lastPIDModTime = fileInfo.ModTime()
lastPIDSize = fileInfo.Size()
}
}
// updateDynamicModulesStatus checks which dynamic modules are actually loaded in the running Nginx
func updateDynamicModulesStatus() {
modulesCacheLock.Lock()
defer modulesCacheLock.Unlock()
// If cache is empty, there's nothing to update
if modulesCache.Len() == 0 {
return
}
// Get nginx -T output to check for loaded modules
out := getNginxT()
if out == "" {
return
}
// Regular expression to find loaded dynamic modules in nginx -T output
// Look for lines like "load_module modules/ngx_http_image_filter_module.so;"
loadModuleRe := regexp.MustCompile(`load_module\s+(?:modules/|/.*/)([a-zA-Z0-9_-]+)\.so;`)
matches := loadModuleRe.FindAllStringSubmatch(out, -1)
// Create a map of loaded dynamic modules
loadedDynamicModules := make(map[string]bool)
for _, match := range matches {
if len(match) > 1 {
// Extract the module name without path and suffix
moduleName := match[1]
// Some normalization to match format in GetModules
moduleName = strings.TrimPrefix(moduleName, "ngx_")
moduleName = strings.TrimSuffix(moduleName, "_module")
loadedDynamicModules[moduleName] = true
}
}
// Update the status for each module in the cache
for key := range modulesCache.Keys() {
// If the module is already marked as dynamic, check if it's actually loaded
if loadedDynamicModules[key] {
module, ok := modulesCache.Get(key)
if ok {
module.Loaded = true
}
}
}
}
func GetModules() *orderedmap.OrderedMap[string, *Module] {
modulesCacheLock.RLock()
cachedModules := modulesCache
modulesCacheLock.RUnlock()
// If we have cached modules and PID file hasn't changed, return cached modules
if cachedModules.Len() > 0 && !isPIDFileChanged() {
return cachedModules
}
// If PID has changed or we don't have cached modules, get fresh modules
out := getNginxV()
// Regular expression to find module parameters with values
paramRe := regexp.MustCompile(`--with-([a-zA-Z0-9_-]+)(?:_module)?(?:=([^"'\s]+|"[^"]*"|'[^']*'))?`)
paramMatches := paramRe.FindAllStringSubmatch(out, -1)
// Update cache
modulesCacheLock.Lock()
modulesCache = orderedmap.NewOrderedMap[string, *Module]()
// Extract module names and parameters from matches
for _, match := range paramMatches {
if len(match) > 1 {
module := match[1]
var params string
// Check if there's a parameter value
if len(match) > 2 && match[2] != "" {
params = match[2]
// Remove surrounding quotes if present
params = strings.TrimPrefix(params, "'")
params = strings.TrimPrefix(params, "\"")
params = strings.TrimSuffix(params, "'")
params = strings.TrimSuffix(params, "\"")
}
// Special handling for configuration options like cc-opt, not actual modules
if module == "cc-opt" || module == "ld-opt" || module == "prefix" {
modulesCache.Set(module, &Module{
Name: module,
Params: params,
Dynamic: false,
Loaded: true,
})
continue
}
// Determine if the module is dynamic
isDynamic := false
if strings.Contains(out, "--with-"+module+"=dynamic") ||
strings.Contains(out, "--with-"+module+"_module=dynamic") {
isDynamic = true
}
if params == "dynamic" {
params = ""
}
modulesCache.Set(module, &Module{
Name: module,
Params: params,
Dynamic: isDynamic,
Loaded: !isDynamic || isDynamic, // Static modules are always loaded, dynamic need to be checked
})
}
}
modulesCacheLock.Unlock()
// Update dynamic modules status by checking if they're actually loaded
updateDynamicModulesStatus()
// Update PID file info
updatePIDFileInfo()
return modulesCache
}
// IsModuleLoaded checks if a module is loaded in Nginx
func IsModuleLoaded(module string) bool {
// Ensure modules are in the cache
if modulesCache.Len() == 0 {
GetModules()
}
modulesCacheLock.RLock()
defer modulesCacheLock.RUnlock()
status, exists := modulesCache.Get(module)
if !exists {
return false
}
return status.Loaded
}

View file

@ -29,6 +29,10 @@ func TestConfig() (stdOut string, stdErr error) {
func Reload() (stdOut string, stdErr error) {
mutex.Lock()
defer mutex.Unlock()
// Clear the modules cache when reloading Nginx
clearModulesCache()
if settings.NginxSettings.ReloadCmd != "" {
return execShell(settings.NginxSettings.ReloadCmd)
}
@ -40,6 +44,9 @@ func Restart() {
mutex.Lock()
defer mutex.Unlock()
// Clear the modules cache when restarting Nginx
clearModulesCache()
// fix(docker): nginx restart always output network error
time.Sleep(500 * time.Millisecond)

View file

@ -0,0 +1,33 @@
package notification
import (
"context"
"github.com/0xJacky/Nginx-UI/model"
"github.com/nikoksr/notify/service/gotify"
"github.com/uozi-tech/cosy/map2struct"
)
// @external_notifier(Gotify)
type Gotify struct {
URL string `json:"url" title:"URL"`
Token string `json:"token" title:"Token"`
Priority int `json:"priority" title:"Priority"`
}
func init() {
RegisterExternalNotifier("gotify", func(ctx context.Context, n *model.ExternalNotify, msg *ExternalMessage) error {
gotifyConfig := &Gotify{}
err := map2struct.WeakDecode(n.Config, gotifyConfig)
if err != nil {
return err
}
if gotifyConfig.URL == "" || gotifyConfig.Token == "" {
return ErrInvalidNotifierConfig
}
gotifyService := gotify.NewWithPriority(gotifyConfig.Token, gotifyConfig.URL, gotifyConfig.Priority)
return gotifyService.Send(ctx, msg.GetTitle(n.Language), msg.GetContent(n.Language))
})
}

View file

@ -10,6 +10,7 @@ import (
// @external_notifier(Lark Custom)
type LarkCustom struct {
Domain string `json:"domain" title:"Domain"`
AppID string `json:"app_id" title:"App ID"`
AppSecret string `json:"app_secret" title:"App Secret"`
OpenID string `json:"open_id" title:"Open ID"`
@ -38,6 +39,13 @@ func init() {
lark.Email(larkCustomConfig.Email),
lark.ChatID(larkCustomConfig.ChatID),
)
if larkCustomConfig.Domain != "" {
larkCustomAppService.AddReceivers(
lark.Domain(larkCustomConfig.Domain),
)
}
return larkCustomAppService.Send(ctx, msg.GetTitle(n.Language), msg.GetContent(n.Language))
})
}

View file

@ -51,7 +51,7 @@ func GetNginxWorkerConfigInfo() (*NginxConfigInfo, error) {
},
}
confPath := nginx.GetConfPath("nginx.conf")
confPath := nginx.GetConfEntryPath()
if confPath == "" {
return nil, errors.New("failed to get nginx.conf path")
}

View file

@ -53,7 +53,7 @@ type PerfOpt struct {
// UpdatePerfOpt updates the Nginx performance optimization settings
func UpdatePerfOpt(opt *PerfOpt) error {
confPath := nginx.GetConfPath("nginx.conf")
confPath := nginx.GetConfEntryPath()
if confPath == "" {
return errors.New("failed to get nginx.conf path")
}

25
internal/process/pid.go Normal file
View file

@ -0,0 +1,25 @@
package process
import (
"fmt"
"os"
"strconv"
)
func WritePIDFile(pidFile string) error {
pid := os.Getpid()
if pid == 0 {
return fmt.Errorf("failed to get process ID")
}
pidStr := strconv.Itoa(pid)
if err := os.WriteFile(pidFile, []byte(pidStr), 0644); err != nil {
return fmt.Errorf("failed to write PID file: %w", err)
}
return nil
}
func RemovePIDFile(pidFile string) {
_ = os.Remove(pidFile)
}

View file

@ -38,18 +38,6 @@ func CheckPIDPath() error {
return nil
}
// CheckSbinPath checks if the sbin path exists
func CheckSbinPath() error {
path := nginx.GetSbinPath()
if path == "" {
return ErrSbinPathNotExist
}
if !helper.FileExists(path) {
return ErrSbinPathNotExist
}
return nil
}
// CheckAccessLogPath checks if the access log path exists
func CheckAccessLogPath() error {
path := nginx.GetAccessLogPath()

View file

@ -5,6 +5,7 @@ import (
"github.com/0xJacky/Nginx-UI/internal/translation"
"github.com/elliotchance/orderedmap/v3"
"github.com/uozi-tech/cosy"
"github.com/0xJacky/Nginx-UI/internal/nginx"
)
type Task struct {
@ -44,15 +45,6 @@ var selfCheckTasks = []*Task{
CheckFunc: CheckSitesDirectory,
FixFunc: FixSitesDirectory,
},
{
Key: "Directory-Streams",
Name: translation.C("Streams directory exists"),
Description: translation.C("Check if the " +
"streams-available and streams-enabled directories are " +
"under the nginx configuration directory"),
CheckFunc: CheckStreamDirectory,
FixFunc: FixStreamDirectory,
},
{
Key: "NginxConf-Sites-Enabled",
Name: translation.C("Nginx.conf includes sites-enabled directory"),
@ -61,14 +53,6 @@ var selfCheckTasks = []*Task{
CheckFunc: CheckNginxConfIncludeSites,
FixFunc: FixNginxConfIncludeSites,
},
{
Key: "NginxConf-Streams-Enabled",
Name: translation.C("Nginx.conf includes streams-enabled directory"),
Description: translation.C("Check if the nginx.conf includes the " +
"streams-enabled directory"),
CheckFunc: CheckNginxConfIncludeStreams,
FixFunc: FixNginxConfIncludeStreams,
},
{
Key: "NginxConf-ConfD",
Name: translation.C("Nginx.conf includes conf.d directory"),
@ -92,34 +76,70 @@ var selfCheckTasks = []*Task{
{
Key: "NginxPID-Path",
Name: translation.C("Nginx PID path exists"),
Description: translation.C("Check if the nginx PID path exists"),
Description: translation.C("Check if the nginx PID path exists. "+
"By default, this path is obtained from 'nginx -V'. If it cannot be obtained, an error will be reported. "+
"In this case, you need to modify the configuration file to specify the Nginx PID path." +
"Refer to the docs for more details: https://nginxui.com/zh_CN/guide/config-nginx.html#pidpath"),
CheckFunc: CheckPIDPath,
},
{
Key: "NginxAccessLog-Path",
Name: translation.C("Nginx access log path exists"),
Description: translation.C("Check if the nginx access log path exists"),
Description: translation.C("Check if the nginx access log path exists. "+
"By default, this path is obtained from 'nginx -V'. If it cannot be obtained or the obtained path does not point to a valid, "+
"existing file, an error will be reported. In this case, you need to modify the configuration file to specify the access log path." +
"Refer to the docs for more details: https://nginxui.com/zh_CN/guide/config-nginx.html#accesslogpath"),
CheckFunc: CheckAccessLogPath,
},
{
Key: "NginxErrorLog-Path",
Name: translation.C("Nginx error log path exists"),
Description: translation.C("Check if the nginx error log path exists"),
Description: translation.C("Check if the nginx error log path exists. "+
"By default, this path is obtained from 'nginx -V'. If it cannot be obtained or the obtained path does not point to a valid, "+
"existing file, an error will be reported. In this case, you need to modify the configuration file to specify the error log path." +
"Refer to the docs for more details: https://nginxui.com/zh_CN/guide/config-nginx.html#errorlogpath"),
CheckFunc: CheckErrorLogPath,
},
}
var selfCheckTaskMap = orderedmap.NewOrderedMap[string, *Task]()
func init() {
for _, task := range selfCheckTasks {
selfCheckTaskMap.Set(task.Key, task)
func Init() {
if nginx.IsModuleLoaded(nginx.ModuleStream) {
selfCheckTasks = append(selfCheckTasks, &Task{
Key: "Directory-Streams",
Name: translation.C("Streams directory exists"),
Description: translation.C("Check if the " +
"streams-available and streams-enabled directories are " +
"under the nginx configuration directory"),
CheckFunc: CheckStreamDirectory,
FixFunc: FixStreamDirectory,
}, &Task{
Key: "NginxConf-Streams-Enabled",
Name: translation.C("Nginx.conf includes streams-enabled directory"),
Description: translation.C("Check if the nginx.conf includes the " +
"streams-enabled directory"),
CheckFunc: CheckNginxConfIncludeStreams,
FixFunc: FixNginxConfIncludeStreams,
})
}
if helper.InNginxUIOfficialDocker() {
selfCheckTasks = append(selfCheckTasks, &Task{
Name: translation.C("Docker socket exists"),
Description: translation.C("Check if the docker socket exists."),
CheckFunc: CheckDockerSocket,
Description: translation.C("Check if /var/run/docker.sock exists. "+
"If you are using Nginx UI Official " +
"Docker Image, please make sure the docker socket is mounted like this: `-" +
"v /var/run/docker.sock:/var/run/docker.sock`. "+
"Nginx UI official image uses /var/run/docker.sock to communicate with the host Docker Engine via Docker Client API. "+
"This feature is used to control Nginx in another container and perform container replacement rather than binary replacement "+
"during OTA upgrades of Nginx UI to ensure container dependencies are also upgraded. "+
"If you don't need this feature, please add the environment variable NGINX_UI_IGNORE_DOCKER_SOCKET=true to the container."),
CheckFunc: CheckDockerSocket,
})
}
for _, task := range selfCheckTasks {
selfCheckTaskMap.Set(task.Key, task)
}
}

View file

@ -17,7 +17,6 @@ import (
_github "github.com/0xJacky/Nginx-UI/.github"
"github.com/0xJacky/Nginx-UI/internal/helper"
"github.com/0xJacky/Nginx-UI/internal/version"
"github.com/0xJacky/Nginx-UI/settings"
"github.com/minio/selfupdate"
"github.com/pkg/errors"
"github.com/uozi-tech/cosy/logger"
@ -154,8 +153,7 @@ func (u *Upgrader) DownloadLatestRelease(progressChan chan float64) (tarName str
return
}
githubProxy := settings.HTTPSettings.GithubProxy
if githubProxy != "" && u.Channel != string(version.ReleaseTypeDev) {
if u.Channel != string(version.ReleaseTypeDev) {
digest.BrowserDownloadUrl = version.GetUrl(digest.BrowserDownloadUrl)
}
@ -169,7 +167,7 @@ func (u *Upgrader) DownloadLatestRelease(progressChan chan float64) (tarName str
dir := filepath.Dir(u.ExPath)
if githubProxy != "" && u.Channel != string(version.ReleaseTypeDev) {
if u.Channel != string(version.ReleaseTypeDev) {
downloadUrl = version.GetUrl(downloadUrl)
}

View file

@ -11,6 +11,7 @@ import (
"github.com/0xJacky/Nginx-UI/internal/cert"
"github.com/0xJacky/Nginx-UI/internal/cmd"
"github.com/0xJacky/Nginx-UI/internal/process"
"code.pfad.fr/risefront"
"github.com/0xJacky/Nginx-UI/internal/kernel"
@ -106,6 +107,14 @@ func main() {
ctx, cancel := signal.NotifyContext(context.Background(), syscall.SIGHUP, syscall.SIGINT, syscall.SIGTERM)
defer cancel()
pidPath := appCmd.String("pidfile")
if pidPath != "" {
if err := process.WritePIDFile(pidPath); err != nil {
logger.Fatalf("Failed to write PID file: %v", err)
}
defer process.RemovePIDFile(pidPath)
}
err := risefront.New(ctx, risefront.Config{
Run: Program(ctx, confPath),
Name: "nginx-ui",

View file

@ -0,0 +1,69 @@
#!/bin/sh
### BEGIN INIT INFO
# Provides: nginx-ui
# Required-Start: $network $remote_fs $local_fs
# Required-Stop: $network $remote_fs $local_fs
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Start or stop the Nginx UI
### END INIT INFO
NAME="nginx-ui"
DAEMON="/usr/bin/$NAME"
PIDFILE="/var/run/$NAME.pid"
CONFIG="/usr/local/etc/nginx-ui/app.ini"
[ -x "$DAEMON" ] || exit 0
start() {
echo "Starting $NAME..."
# BusyBox compatible syntax
start-stop-daemon -S -b -p $PIDFILE -m -x $DAEMON -- $CONFIG
echo "$NAME started"
}
stop() {
echo "Stopping $NAME..."
# BusyBox compatible syntax
start-stop-daemon -K -p $PIDFILE -R 10
rm -f $PIDFILE
echo "$NAME stopped"
}
status() {
if [ -f $PIDFILE ]; then
PID=$(cat $PIDFILE)
if kill -0 $PID > /dev/null 2>&1; then
echo "$NAME is running (PID: $PID)"
exit 0
else
echo "$NAME is not running (stale PID file)"
exit 1
fi
else
echo "$NAME is not running"
exit 3
fi
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
stop
start
;;
status)
status
;;
*)
echo "Usage: $0 {start|stop|restart|status}"
exit 1
;;
esac
exit 0

View file

@ -0,0 +1,39 @@
#!/sbin/openrc-run
name="nginx-ui"
description="Nginx UI - Yet another WebUI for Nginx"
supervisor=supervise-daemon
pidfile="/run/${RC_SVCNAME}.pid"
command="/usr/local/bin/nginx-ui"
command_args="serve --config /usr/local/etc/nginx-ui/app.ini --pidfile ${pidfile}"
command_user="root:root"
extra_commands="status"
depend() {
need net
after logger firewall
use dns
after nginx
}
start_pre() {
checkpath --directory --owner $command_user --mode 0755 /run
checkpath --directory --owner $command_user --mode 0755 /usr/local/etc/nginx-ui
}
status() {
if [ -f "${pidfile}" ]; then
PID=$(cat "${pidfile}")
if kill -0 $PID >/dev/null 2>&1; then
einfo "${name} is running (PID: $PID)"
return 0
else
ewarn "${name} is not running (stale PID file)"
return 1
fi
else
einfo "${name} is not running"
return 3
fi
}

View file

@ -51,10 +51,11 @@ func InitRouter() {
{
public.InitRouter(root)
crypto.InitPublicRouter(root)
user.InitAuthRouter(root)
system.InitPublicRouter(root)
system.InitBackupRestoreRouter(root)
system.InitSelfCheckRouter(root)
user.InitAuthRouter(root)
// Authorization required and not websocket request
g := root.Group("/", middleware.AuthRequired(), middleware.Proxy())