Compare commits

...

47 commits

Author SHA1 Message Date
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
78 changed files with 8613 additions and 5092 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

@ -42,11 +42,11 @@
"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 +55,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",
@ -71,15 +71,15 @@
"@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"

1749
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

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

View file

@ -13,90 +13,90 @@ msgstr ""
"&& n%100<=10 ? 3 : n%100>=11 ? 4 : 5;\n"
"X-Generator: Weblate 5.6.2\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] إعداد تكوينات ليغو"
#: 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] كتابة الشهادة على القرص"
@ -138,7 +138,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
@ -146,7 +146,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 "الاتصالات النشطة"
@ -358,7 +358,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 Cores"
@ -497,7 +497,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 "عمليات مدير الذاكرة المؤقتة"
@ -527,7 +527,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}"
@ -698,6 +698,27 @@ 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 موجودًا. إذا كنت تستخدم صورة Docker "
"الرسمية لـ Nginx UI، يرجى التأكد من توصيل مقبس Docker بهذه الطريقة: `-v /var/"
"run/docker.sock:/var/run/docker.sock`. تستخدم صورة Nginx UI الرسمية /var/run/"
"docker.sock للتواصل مع محرك Docker المضيف عبر واجهة برمجة تطبيقات Docker "
"Client. تُستخدم هذه الميزة للتحكم في Nginx في حاوية أخرى وإجراء استبدال "
"الحاوية بدلاً من استبدال الثنائي أثناء التحديثات OTA لـ Nginx UI لضمان تحديث "
"تبعيات الحاوية أيضًا. إذا كنت لا تحتاج إلى هذه الميزة، يرجى إضافة متغير "
"البيئة 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 "
@ -706,31 +727,60 @@ msgstr ""
"تحقق مما إذا كان HTTPS مفعلاً. استخدام HTTP خارج localhost غير آمن ويمنع "
"استخدام ميزات 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'. إذا تعذر الحصول عليه أو إذا كان المسار الذي تم "
"الحصول عليه لا يشير إلى ملف صالح موجود، فسيتم الإبلاغ عن خطأ. في هذه الحالة، "
"تحتاج إلى تعديل ملف التكوين لتحديد مسار سجل الأخطاء. راجع الوثائق لمزيد من "
"التفاصيل: https://nginxui.com/zh_CN/guide/config-nginx.html#errorlogpath"
#: src/language/generate.ts:7
msgid "Check if the nginx PID path exists"
msgstr "تحقق مما إذا كان مسار معرف عملية Nginx موجودًا"
#: 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 موجودًا. بشكل افتراضي، يتم الحصول على "
"هذا المسار من الأمر 'nginx -V'. إذا تعذر الحصول عليه، سيتم الإبلاغ عن خطأ. "
"في هذه الحالة، تحتاج إلى تعديل ملف التكوين لتحديد مسار معرف عملية Nginx. "
"راجع الوثائق لمزيد من التفاصيل: 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"
@ -738,11 +788,11 @@ msgstr "تحقق مما إذا كان ملف nginx.conf يتضمن دليل conf
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"
@ -750,7 +800,7 @@ 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"
@ -877,7 +927,7 @@ msgstr "تم اختبار ملف التكوين بنجاح"
msgid "Configuration History"
msgstr "سجل التكوين"
#: src/views/dashboard/components/PerformanceTablesCard.vue:167
#: src/views/dashboard/components/PerformanceTablesCard.vue:168
msgid "Configuration information"
msgstr "معلومات التكوين"
@ -989,7 +1039,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 "تم الإنشاء في"
@ -1050,10 +1100,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 "أيام"
@ -1328,7 +1374,7 @@ msgstr "هل تريد إزالة هذا المصدر؟"
msgid "Docker client not initialized"
msgstr "عميل Docker غير مهيأ"
#: src/language/generate.ts:17
#: src/language/generate.ts:16
msgid "Docker socket exists"
msgstr "مقبس Docker موجود"
@ -1383,6 +1429,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 "تعديل"
@ -1400,7 +1451,7 @@ msgstr "تعديل التكوين"
msgid "Edit Site"
msgstr "تعديل الموقع"
#: src/routes/modules/streams.ts:19
#: src/routes/modules/streams.ts:20
msgid "Edit Stream"
msgstr "تعديل البث"
@ -1409,7 +1460,7 @@ msgstr "تعديل البث"
msgid "Email"
msgstr "بريد إلكتروني"
#: src/views/install/components/InstallForm.vue:78
#: src/views/install/components/InstallForm.vue:75
msgid "Email (*)"
msgstr "البريد الإلكتروني (*)"
@ -1593,7 +1644,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 "إشعار خارجي"
@ -1729,7 +1780,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}"
@ -1873,7 +1924,7 @@ msgstr "فشل استعادة ملفات واجهة NGINX: {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}"
@ -1994,6 +2045,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"
@ -2107,7 +2162,7 @@ msgstr ""
msgid "Indexing..."
msgstr "جاري الفهرسة..."
#: src/views/dashboard/components/PerformanceTablesCard.vue:15
#: src/views/dashboard/components/PerformanceTablesCard.vue:16
msgid "Indicator"
msgstr "المؤشر"
@ -2137,13 +2192,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 "تم التثبيت بنجاح"
@ -2265,7 +2320,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 "اللغة"
@ -2343,6 +2398,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 "ملفات المحمل"
@ -2381,7 +2441,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-"
@ -2486,7 +2546,7 @@ msgstr "عتبة المدير"
msgid "Manual"
msgstr "يدوي"
#: src/views/dashboard/components/PerformanceTablesCard.vue:201
#: src/views/dashboard/components/PerformanceTablesCard.vue:202
msgid "manually set"
msgstr "تم تعيينه يدويًا"
@ -2495,7 +2555,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 "العملية الرئيسية"
@ -2529,7 +2589,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 "الحد الأقصى لعدد الاتصالات لكل عملية عامل"
@ -2537,7 +2597,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 "الحد الأقصى لعدد عمليات العامل:"
@ -2598,6 +2658,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 "توجيه متعدد الأسطر"
@ -2673,7 +2741,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 موجود"
@ -2701,11 +2769,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 موجود"
@ -2735,7 +2803,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"
@ -2743,7 +2811,7 @@ msgstr "معدل استخدام وحدة المعالجة المركزية لـ
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 موجود"
@ -2772,7 +2840,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"
@ -2780,7 +2848,7 @@ msgstr "استخدام ذاكرة Nginx"
msgid "Nginx PID Path"
msgstr "مسار PID لـ Nginx"
#: src/language/generate.ts:26
#: src/language/generate.ts:35
msgid "Nginx PID path exists"
msgstr "مسار معرف عملية Nginx موجود"
@ -2822,7 +2890,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"
@ -2840,11 +2908,11 @@ msgid ""
"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"
@ -2920,6 +2988,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}"
@ -2967,8 +3040,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 "عدد عمليات العامل"
@ -3075,7 +3148,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 الأخرى"
@ -3131,7 +3204,7 @@ msgstr ""
msgid "Password"
msgstr "كلمة المرور"
#: src/views/install/components/InstallForm.vue:98
#: src/views/install/components/InstallForm.vue:95
msgid "Password (*)"
msgstr "كلمة المرور (*)"
@ -3139,7 +3212,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 حرفًا"
@ -3264,15 +3337,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 "يرجى إدخال اسم المستخدم الخاص بك!"
@ -3343,7 +3416,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 "معلومات العملية"
@ -3376,7 +3449,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 "طلبات القراءة"
@ -3614,7 +3687,7 @@ msgstr "تجديد الشهادة بنجاح"
msgid "Renew successfully"
msgstr "تم التجديد بنجاح"
#: src/views/dashboard/components/PerformanceTablesCard.vue:141
#: src/views/dashboard/components/PerformanceTablesCard.vue:142
msgid "Request statistics"
msgstr "إحصائيات الطلبات"
@ -3622,7 +3695,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 "تم الطلب باستخدام عوامل خاطئة"
@ -3648,7 +3721,7 @@ msgstr ""
"ذاكرة المكتبة المشتركة، والتي سيتم حسابها بشكل متكرر للعديد من العمليات"
#: src/composables/usePerformanceMetrics.ts:109
#: src/views/dashboard/components/PerformanceTablesCard.vue:68
#: src/views/dashboard/components/PerformanceTablesCard.vue:69
msgid "Responses"
msgstr "الردود"
@ -3834,6 +3907,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 "تم نسخ السر"
@ -3977,7 +4058,7 @@ msgstr "سجلات الموقع"
msgid "Site not found"
msgstr "الموقع غير موجود"
#: src/language/generate.ts:21
#: src/language/generate.ts:28
msgid "Sites directory exists"
msgstr "دليل المواقع موجود"
@ -4065,8 +4146,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
@ -4090,7 +4177,7 @@ msgstr "تم تمكين البث"
msgid "Stream not found"
msgstr "البث غير موجود"
#: src/language/generate.ts:14
#: src/language/generate.ts:37
msgid "Streams directory exists"
msgstr "دليل Streams موجود"
@ -4254,10 +4341,6 @@ msgstr ""
"سيتم فحص شهادة النطاق لمدة 30 دقيقة، وسيتم تجديدها إذا مر أكثر من أسبوع أو "
"الفترة التي حددتها في الإعدادات منذ إصدارها الأخير."
#: 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, "
@ -4356,11 +4439,11 @@ msgstr "عنوان URL غير صالح."
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):"
@ -4467,7 +4550,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"
@ -4536,12 +4619,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 "إجمالي المصافحات"
@ -4554,7 +4637,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 "إجمالي الطلبات"
@ -4583,9 +4666,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 "نوع"
@ -4673,17 +4757,21 @@ msgstr "المستخدم لم يتم تفعيل OTP كعامل ثنائي"
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 "القيمة"
@ -4727,7 +4815,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 "عمليات الانتظار"
@ -4903,6 +4991,33 @@ 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 موجودًا. إذا كنت تستخدم صورة Docker "
#~ "الرسمية لـ Nginx UI، يرجى التأكد من أن مقبس 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 موجودًا"
#~ msgid "Check if the docker socket exists."
#~ msgstr "تحقق مما إذا كان مقبس Docker موجودًا."
#~ msgid "Database (Optional, default: database)"
#~ msgstr "قاعدة البيانات (اختياري، الافتراضي: قاعدة البيانات)"
#~ msgid "The filename cannot contain the following characters: %{c}"
#~ msgstr "لا يمكن أن يحتوي اسم الملف على الأحرف التالية: %{c}"
#~ msgid "Unknown issue"
#~ msgstr "مشكلة غير معروفة"
@ -4917,15 +5032,6 @@ msgstr "مفاتيح المرور الخاصة بك"
#~ msgid "Automatically indexed from site and stream configurations."
#~ 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 موجودًا. إذا كنت تستخدم صورة Docker "
#~ "الرسمية لـ Nginx UI، يرجى التأكد من أن مقبس Docker مثبت بهذه الطريقة: `-"
#~ "v /var/run/docker.sock:/var/run/docker.sock`."
#, fuzzy
#~ msgid "Nginx Conf Include Conf.d"
#~ msgstr "أمر إعادة تشغيل Nginx"

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 UI] Finished'),
$gettext('[Nginx UI] Obtaining certificate'),
$gettext('[Nginx UI] Revoking certificate'),
$gettext('[Nginx UI] Certificate successfully revoked'),
$gettext('Nginx configuration entry file exists'),
$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.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] Preparing lego configurations'),
$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('Nginx configuration directory 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'),
$gettext('Docker socket exists'),
$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('Certificate not found: %{error}'),
$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] Revocation completed'),
$gettext('Check if the sites-available and sites-enabled directories are under the nginx configuration 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('Failed to revoke certificate: %{error}'),
$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] Backing up current certificate for later revocation'),
$gettext('[Nginx UI] Certificate was used for server, reloading server TLS certificate'),
$gettext('Sites directory exists'),
$gettext('Nginx.conf includes sites-enabled directory'),
$gettext('Check if the nginx configuration entry file exists'),
$gettext('[Nginx UI] Setting environment variables'),
$gettext('[Nginx UI] Writing certificate private key to disk'),
$gettext('Check if the nginx.conf includes the sites-enabled directory'),
$gettext('Check if the nginx configuration directory exists'),
$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] 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('Check if the nginx configuration directory exists'),
$gettext('Nginx configuration entry file exists'),
$gettext('[Nginx UI] Issued certificate successfully'),
$gettext('Certificate not found: %{error}'),
$gettext('Streams directory exists'),
$gettext('Nginx.conf includes conf.d directory'),
$gettext('Certificate revoked successfully'),
$gettext('[Nginx UI] Setting DNS01 challenge provider'),
$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] Environment variables cleaned'),
$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('Failed to revoke certificate: %{error}'),
$gettext('[Nginx UI] Obtaining certificate'),
$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('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] Setting environment variables'),
$gettext('[Nginx UI] Finished'),
$gettext('[Nginx UI] Issued certificate successfully'),
$gettext('[Nginx UI] Setting DNS01 challenge provider'),
$gettext('[Nginx UI] Revoking old certificate'),
$gettext('[Nginx UI] Writing certificate to disk'),
$gettext('Nginx error log path exists'),
]

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

File diff suppressed because it is too large Load diff

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

@ -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())