mirror of
https://github.com/0xJacky/nginx-ui.git
synced 2025-05-11 10:25:52 +02:00
Compare commits
47 commits
v2.0.0-rc.
...
dev
Author | SHA1 | Date | |
---|---|---|---|
|
ad00ed4045 | ||
|
bae805abec | ||
|
d263340bdf | ||
|
c241122fde | ||
|
adf6f80061 | ||
|
5b0cbf98e1 | ||
|
202ac03537 | ||
|
c59b81e4c7 | ||
|
7f6399a718 | ||
|
6b40d02b93 | ||
|
c92b31e903 | ||
|
908cb7470b | ||
|
f7ef33e8b3 | ||
|
291c7f09f8 | ||
|
e500ce98e8 | ||
|
fc3b83482b | ||
|
635b2c272b | ||
|
d7baa4d0f6 | ||
|
fd501a6d0c | ||
|
482e66b3bb | ||
|
0f09a0b03c | ||
|
c5274a7a64 | ||
|
7482be9c7a | ||
|
71bc9c1eb4 | ||
|
ed820695da | ||
|
fbc800ff22 | ||
|
b23a8fc4ad | ||
|
3bbe47e50d | ||
|
7c791f3784 | ||
|
a2e1c57eaf | ||
|
1ba1da0d5d | ||
|
1570771bf6 | ||
|
a75a5b7429 | ||
|
7718718c89 | ||
|
ed4cd13dda | ||
|
3b674fc79f | ||
|
9d39b7607d | ||
|
8246e6ee77 | ||
|
dfc131d968 | ||
|
ea0dbfe287 | ||
|
c797a1be54 | ||
|
61d9bb49e7 | ||
|
5fdd85a302 | ||
|
db29f2e9c5 | ||
|
d772dcfb95 | ||
|
13732ffb2c | ||
|
39daf0be53 |
78 changed files with 8613 additions and 5092 deletions
2
.github/workflows/build.yml
vendored
2
.github/workflows/build.yml
vendored
|
@ -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
390
README-ja_JP.md
Normal 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)によって開発されました。
|
||||
|
||||
[](https://deepwiki.com/0xJacky/nginx-ui)
|
||||
|
||||
[](https://github.com/0xJacky/nginx-ui/actions/workflows/build.yml)
|
||||
[](https://github.com/0xJacky/nginx-ui "Click to view the repo on Github")
|
||||
[](https://github.com/0xJacky/nginx-ui/releases/latest "Click to view the repo on Github")
|
||||
[](https://github.com/0xJacky/nginx-ui "Click to view the repo on Github")
|
||||
[](https://github.com/0xJacky/nginx-ui "Click to view the repo on Github")
|
||||
[](https://github.com/0xJacky/nginx-ui "Click to view the repo on Github")
|
||||
[](https://github.com/0xJacky/nginx-ui/issue "Click to view the repo on Github")
|
||||
|
||||
[](https://hub.docker.com/r/uozi/nginx-ui "Click to view the image on Docker Hub")
|
||||
[](https://hub.docker.com/r/uozi/nginx-ui "Click to view the image on Docker Hub")
|
||||
[](https://hub.docker.com/r/uozi/nginx-ui "Click to view the image on Docker Hub")
|
||||
|
||||
[](https://weblate.nginxui.com/engage/nginx-ui/)
|
||||
[](https://hellogithub.com/repository/86f3a8f779934748a34fe6f1b5cd442f)
|
||||
|
||||
## ドキュメント
|
||||
公式ドキュメントは [nginxui.com](https://nginxui.com) を参照してください。
|
||||
|
||||
## スター推移
|
||||
|
||||
[](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>
|
||||
|
||||
## プロジェクトについて
|
||||
|
||||

|
||||
|
||||
### デモ
|
||||
URL:[https://demo.nginxui.com](https://demo.nginxui.com)
|
||||
- ユーザー名:admin
|
||||
- パスワード:admin
|
||||
|
||||
### 機能
|
||||
|
||||
- サーバーの CPU 使用率、メモリ使用率、ロードアベレージ、ディスク使用率 とかの指標をオンラインで見られるんやで。
|
||||
- 設定変更したら自動でバックアップ作ってくれて、バージョン比較&復元もできるんやわ。
|
||||
- クラスタ管理で複数ノードへのミラーリング操作もサポートしてるから、大規模環境でも楽勝や。
|
||||
- 暗号化した Nginx / Nginx UI の設定をエクスポートして、新環境へのデプロイ&復旧がサクッとできるで。
|
||||
- オンライン ChatGPT アシスタント(Deepseek-R1 のチェインオブソート表示付き)で設定の最適化や理解をサポートしてくれるんや。
|
||||
- MCP(Model Context Protocol)で AI エージェントが Nginx UI と連携できる特別インターフェースもあるから、自動化もバッチリや。
|
||||
- ワンクリックで Let’s 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) ファイルをご覧ください。
|
|
@ -30,7 +30,7 @@ To check out docs, visit [nginxui.com](https://nginxui.com).
|
|||
|
||||
[](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>
|
||||
|
|
|
@ -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
17
api/nginx/modules.go
Normal 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)
|
||||
}
|
|
@ -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)
|
||||
}
|
||||
|
|
|
@ -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()
|
||||
}()
|
||||
}
|
||||
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
|
|
|
@ -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
1749
app/pnpm-lock.yaml
generated
File diff suppressed because it is too large
Load diff
|
@ -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>
|
||||
|
|
|
@ -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
|
||||
|
|
3
app/src/constants/errors/validate.ts
Normal file
3
app/src/constants/errors/validate.ts
Normal file
|
@ -0,0 +1,3 @@
|
|||
export default {
|
||||
406: () => $gettext('Requested with wrong parameters'),
|
||||
}
|
|
@ -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"
|
||||
|
|
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
@ -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)
|
||||
|
|
|
@ -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,
|
||||
}
|
||||
})
|
||||
|
|
|
@ -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'],
|
||||
},
|
||||
},
|
||||
]
|
||||
|
|
1
app/src/routes/type.d.ts
vendored
1
app/src/routes/type.d.ts
vendored
|
@ -17,5 +17,6 @@ declare module 'vue-router' {
|
|||
status_code?: number
|
||||
error?: () => string
|
||||
lastRouteName?: string
|
||||
modules?: string[]
|
||||
}
|
||||
}
|
||||
|
|
122
app/src/views/dashboard/components/ModulesTable.vue
Normal file
122
app/src/views/dashboard/components/ModulesTable.vue
Normal 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>
|
|
@ -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>
|
||||
|
|
|
@ -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'),
|
22
app/src/views/preference/components/ExternalNotify/gotify.ts
Normal file
22
app/src/views/preference/components/ExternalNotify/gotify.ts
Normal 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
|
|
@ -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,
|
||||
|
|
|
@ -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',
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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") {
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
```
|
||||
|
||||
:::
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
```
|
||||
|
|
|
@ -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
26
docs/pnpm-lock.yaml
generated
|
@ -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
|
||||
|
|
|
@ -82,7 +82,7 @@ docker run -dit \
|
|||
### 配置
|
||||
|
||||
```shell
|
||||
echo '[server]\nHttpPort = 9000' > app.ini
|
||||
echo '[server]\nPort = 9000' > app.ini
|
||||
```
|
||||
|
||||
::: tip 提示
|
||||
|
|
|
@ -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
|
||||
```
|
||||
|
||||
:::
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
```
|
||||
|
|
|
@ -82,7 +82,7 @@ docker run -dit \
|
|||
### 設定
|
||||
|
||||
```shell
|
||||
echo '[server]\nHttpPort = 9000' > app.ini
|
||||
echo '[server]\nPort = 9000' > app.ini
|
||||
```
|
||||
|
||||
::: tip 提示
|
||||
|
|
|
@ -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
|
||||
```
|
||||
|
||||
:::
|
||||
|
|
|
@ -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
90
go.mod
|
@ -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
211
go.sum
|
@ -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=
|
||||
|
|
308
install.sh
308
install.sh
|
@ -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
|
||||
}
|
||||
|
|
6
internal/cache/index.go
vendored
6
internal/cache/index.go
vendored
|
@ -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)
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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
225
internal/nginx/modules.go
Normal 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
|
||||
}
|
|
@ -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)
|
||||
|
||||
|
|
33
internal/notification/gotify.go
Normal file
33
internal/notification/gotify.go
Normal 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))
|
||||
})
|
||||
}
|
|
@ -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))
|
||||
})
|
||||
}
|
||||
|
|
|
@ -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")
|
||||
}
|
||||
|
|
|
@ -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
25
internal/process/pid.go
Normal 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)
|
||||
}
|
|
@ -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()
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
|
||||
|
|
9
main.go
9
main.go
|
@ -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",
|
||||
|
|
69
resources/services/nginx-ui.init
Normal file
69
resources/services/nginx-ui.init
Normal 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
|
39
resources/services/nginx-ui.rc
Normal file
39
resources/services/nginx-ui.rc
Normal 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
|
||||
}
|
|
@ -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())
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue