Compare commits

..

86 Commits

Author SHA1 Message Date
耗子 c4b84632b4 Merge remote-tracking branch 'origin/main' 2025-07-07 03:04:26 +08:00
耗子 c20bfdc3ea fix: sqlite dsn error 2025-07-07 03:04:20 +08:00
devhaozi cc55aef306 chore(l10n): update pot files 2025-07-06 18:48:45 +00:00
耗子 ed5c74c753 fix: 优化路由路径获取方式 2025-07-07 02:47:59 +08:00
renovate[bot] 5a9ccddabd chore(deps): Update non-major dependencies to v66.3.3 (#863)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-06 12:50:23 +00:00
renovate[bot] e6b82ab9ae chore(deps): Update non-major dependencies (#861)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-04 16:35:31 +00:00
renovate[bot] 8868a125e2 chore(deps): Update non-major dependencies (#860)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-03 19:53:11 +00:00
renovate[bot] 04474acf5f chore(deps): Update non-major dependencies (#859)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-02 21:51:46 +00:00
renovate[bot] 6a17173b3b chore(deps): Update non-major dependencies (#858)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-02 07:13:02 +00:00
renovate[bot] 711fb33b48 chore(deps): Update non-major dependencies (#855)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-06-30 23:30:16 +00:00
renovate[bot] 3ed8fb4f95 chore(deps): Lock file maintenance (#854)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-06-30 06:26:07 +00:00
renovate[bot] 65944a72ec chore(deps): Update module go.yaml.in/yaml/v3 to v3.0.4 (#853)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-06-30 03:41:36 +08:00
renovate[bot] 24d18df86b chore(deps): Update dependency unplugin-vue-components to v28.8.0 (#852)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-06-29 06:12:30 +00:00
renovate[bot] b330763746 chore(deps): Update dependency pinia-plugin-persistedstate to v4.4.0 (#851)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-06-28 22:27:00 +00:00
renovate[bot] 2e914ea41a chore(deps): Update dependency @types/node to v22.15.34 (#850)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-06-28 12:40:54 +00:00
renovate[bot] 85a5d22861 chore(deps): Update dependency eslint to v9.30.0 (#849)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-06-28 02:13:54 +00:00
renovate[bot] 9f31a2061d chore(deps): Update non-major dependencies (#847)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-06-27 22:14:08 +08:00
renovate[bot] d1b54c2690 chore(deps): Update dependency marked to v16 (#848)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-06-27 22:13:59 +08:00
renovate[bot] 029f86d9d5 chore(deps): Update non-major dependencies (#846)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-06-26 21:56:28 +00:00
renovate[bot] 9de30f30b8 chore(deps): Update non-major dependencies to v66.3.2 (#845)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-06-26 06:10:46 +00:00
renovate[bot] 8582bfc36b chore(deps): Update non-major dependencies (#844)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-06-25 19:22:49 +00:00
renovate[bot] 4a2af3434c chore(deps): Update dependency @types/node to v22.15.33 (#843)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-06-25 01:10:46 +00:00
renovate[bot] 7f697ca734 chore(deps): Update dependency @vitejs/plugin-vue to v6 (#841)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-06-24 23:15:50 +08:00
renovate[bot] 7f08ee92ff chore(deps): Update dependency vite to v7 (#842)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-06-24 22:30:31 +08:00
renovate[bot] 2f09043915 chore(deps): Update dependency @iconify/json to v2.2.352 (#840)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-06-24 13:58:06 +00:00
renovate[bot] 50aab262a8 chore(deps): Update module github.com/ncruces/go-sqlite3 to v0.26.2 (#839)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-06-24 16:08:41 +08:00
renovate[bot] 99b033f070 chore(deps): Update non-major dependencies (#838)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-06-23 10:49:59 +00:00
renovate[bot] 6277a17d53 chore(deps): Lock file maintenance (#837)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-06-23 15:25:46 +08:00
耗子 8bb6bd1882 feat: 替换弃用的gopkg.in/yaml.v3包 2025-06-22 20:14:27 +08:00
dependabot[bot] 3161c61001 chore(deps): bump github.com/go-chi/chi/v5 (#834)
Bumps the go_modules group with 1 update in the / directory: [github.com/go-chi/chi/v5](https://github.com/go-chi/chi).


Updates `github.com/go-chi/chi/v5` from 5.2.1 to 5.2.2
- [Release notes](https://github.com/go-chi/chi/releases)
- [Changelog](https://github.com/go-chi/chi/blob/master/CHANGELOG.md)
- [Commits](https://github.com/go-chi/chi/compare/v5.2.1...v5.2.2)

---
updated-dependencies:
- dependency-name: github.com/go-chi/chi/v5
  dependency-version: 5.2.2
  dependency-type: direct:production
  dependency-group: go_modules
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-06-21 03:25:49 +08:00
renovate[bot] e68a882e75 chore(deps): Update non-major dependencies (#833)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-06-20 17:01:30 +00:00
耗子 24066f05fc l10n: update translations (#832)
* New translations backend.pot (Chinese Simplified)
Update translations (Chinese Simplified) backend.pot

* New translations backend.pot (Chinese Traditional)
Update translations (Chinese Traditional) backend.pot
2025-06-20 13:36:39 +08:00
renovate[bot] 28325f4af6 chore(deps): Update non-major dependencies (#831)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-06-19 23:04:31 +00:00
renovate[bot] 0c57e9d628 chore(deps): Update dependency vue to v3.5.17 (#830)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-06-19 03:14:04 +00:00
renovate[bot] 8fb7ddcf7a chore(deps): Update dependency @iconify/json to v2.2.350 (#829)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-06-18 12:56:47 +00:00
renovate[bot] 76185a97f3 chore(deps): Update non-major dependencies to v66.2.3 (#828)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-06-18 01:11:14 +00:00
renovate[bot] 567ef561c7 chore(deps): Update non-major dependencies to v66.2.2 (#827)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-06-17 21:03:27 +08:00
renovate[bot] b70b9df0b7 chore(deps): Update dependency @vue/eslint-config-typescript to v14.5.1 (#826)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-06-17 20:56:24 +08:00
耗子 0e4fbea166 Merge remote-tracking branch 'origin/main' 2025-06-17 20:03:26 +08:00
耗子 6cf4e0c0cc feat: 数据库添加_txlock=immediate参数 2025-06-17 20:03:07 +08:00
耗子 68da337cc0 Merge remote-tracking branch 'origin/main' 2025-06-17 09:06:23 +08:00
耗子 c492639897 fix: 优化手动dns签发 2025-06-17 09:06:05 +08:00
renovate[bot] 5e10b2267e chore(deps): Update non-major dependencies (#824)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-06-16 22:43:54 +00:00
renovate[bot] 68bbbc76e2 chore(deps): Lock file maintenance (#823)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-06-16 05:34:04 +00:00
renovate[bot] 7cd1c764d2 chore(deps): Update non-major dependencies (#821)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-06-16 00:06:33 +08:00
耗子 a053a4212a feat: 屏蔽github.com/libdns/cloudns更新 2025-06-15 23:54:34 +08:00
耗子 2d0974a5d5 Merge remote-tracking branch 'origin/main' 2025-06-14 18:00:35 +08:00
耗子 d90396c8ea fix: 出站规则下,必须指定具体的地址,否则会添加成入站规则,close #822 2025-06-14 18:00:28 +08:00
renovate[bot] 877d9c57c8 chore(deps): Update non-major dependencies (#820)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-06-13 21:32:05 +00:00
devhaozi 275760c18a chore(l10n): update pot files 2025-06-13 05:35:09 +00:00
dependabot[bot] 9dd6063611 chore(deps): bump brace-expansion (#817)
Bumps the npm_and_yarn group with 1 update in the /web directory: [brace-expansion](https://github.com/juliangruber/brace-expansion).


Updates `brace-expansion` from 1.1.11 to 1.1.12
- [Release notes](https://github.com/juliangruber/brace-expansion/releases)
- [Commits](https://github.com/juliangruber/brace-expansion/compare/1.1.11...v1.1.12)

---
updated-dependencies:
- dependency-name: brace-expansion
  dependency-version: 1.1.12
  dependency-type: indirect
  dependency-group: npm_and_yarn
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-06-13 13:34:32 +08:00
耗子 0acbb05d3f fix: 安全登录启用时,可能出现反复跳转登录页的问题 2025-06-13 02:42:20 +08:00
renovate[bot] d860e9361a chore(deps): Update non-major dependencies (#819)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-06-13 00:56:30 +08:00
renovate[bot] 97d76f62ae chore(deps): Update non-major dependencies (#816)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-06-12 12:51:30 +00:00
renovate[bot] 910a2d92cc chore(deps): Update non-major dependencies (#815)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-06-11 17:05:57 +08:00
renovate[bot] 76ef54fe0e chore(deps): Update stefanzweifel/git-auto-commit-action action to v6 (#813)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-06-11 16:42:36 +08:00
renovate[bot] bf41b98339 chore(deps): Update dependency tsx to v4.20.0 (#814)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-06-11 06:54:10 +00:00
renovate[bot] f3cec5e476 chore(deps): Update non-major dependencies (#812)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-06-10 13:28:58 +00:00
renovate[bot] bb5b66958c chore(deps): Update non-major dependencies (#811)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-06-09 22:59:48 +00:00
renovate[bot] 04fb0a1de8 chore(deps): Lock file maintenance (#810)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-06-09 07:43:45 +00:00
renovate[bot] f7752387da chore(deps): Update non-major dependencies (#809)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-06-09 00:28:06 +00:00
耗子 a7420eef34 l10n: update translations (#808)
* New translations frontend.pot (Chinese Simplified)
Update translations (Chinese Simplified) frontend.pot

* New translations frontend.pot (Chinese Traditional)
Update translations (Chinese Traditional) frontend.pot
2025-06-08 15:54:56 +08:00
耗子 28847bcc1f l10n: update translations (#807)
* New translations frontend.pot (Chinese Simplified)
Update translations (Chinese Simplified) frontend.pot

* New translations frontend.pot (Chinese Traditional)
Update translations (Chinese Traditional) frontend.pot

* New translations backend.pot (Chinese Simplified)
Update translations (Chinese Simplified) backend.pot

* New translations backend.pot (Chinese Traditional)
Update translations (Chinese Traditional) backend.pot

* New translations frontend.pot (Chinese Simplified)
Update translations (Chinese Simplified) frontend.pot

* New translations frontend.pot (Chinese Traditional)
Update translations (Chinese Traditional) frontend.pot
2025-06-08 15:53:38 +08:00
devhaozi cb24946aea chore(l10n): update pot files 2025-06-08 07:37:44 +00:00
耗子 371424114a Merge remote-tracking branch 'origin/main' 2025-06-08 15:36:57 +08:00
耗子 60086b9839 fix: 优化翻译 2025-06-08 15:36:50 +08:00
devhaozi 6d55088a0d chore(l10n): update pot files 2025-06-08 07:33:51 +00:00
耗子 c4234a11f2 Merge remote-tracking branch 'origin/main' 2025-06-08 15:32:51 +08:00
耗子 7644e1a5f6 feat: 优化防火墙创建规则 2025-06-08 15:32:45 +08:00
renovate[bot] f8a54b2860 chore(deps): Update non-major dependencies (#805)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-06-08 06:41:01 +00:00
renovate[bot] 8c1813b9e5 chore(deps): Update non-major dependencies (#804)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-06-08 01:45:07 +08:00
renovate[bot] 7a9a803451 chore(deps): Update non-major dependencies (#802)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-06-07 02:49:15 +00:00
renovate[bot] 681d0b5324 chore(deps): Update dependency @iconify/json to v2.2.346 (#801)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-06-05 16:24:31 +00:00
devhaozi a33490b316 chore(l10n): update pot files 2025-06-05 03:24:31 +00:00
耗子 fb95ff2861 fix: 登录后访问安全入口404 2025-06-05 11:23:18 +08:00
renovate[bot] 326c2585f3 chore(deps): Update module github.com/golang-cz/httplog to v0.0.2 (#800)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-06-04 20:57:18 +00:00
renovate[bot] 61cc26cdb0 chore(deps): Update non-major dependencies (#798)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-06-05 00:38:46 +08:00
devhaozi 2ecd3a020b chore(l10n): update pot files 2025-06-03 20:21:46 +00:00
耗子 c5b23feeac fix: 模态窗点击遮罩关闭时自动重置数据 2025-06-04 04:20:51 +08:00
renovate[bot] 4f39f62208 chore(deps): Update module github.com/expr-lang/expr to v1.17.5 (#797)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-06-04 03:46:32 +08:00
renovate[bot] 146401e9f9 chore(deps): Update github.com/golang-cz/httplog digest to 1a554d4 (#796)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-06-03 22:53:14 +08:00
renovate[bot] d544ca6a90 chore(deps): Update dependency md-editor-v3 to v5.6.1 (#795)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-06-03 22:27:14 +08:00
renovate[bot] 43248c1d88 chore(deps): Update non-major dependencies (#794)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-06-02 21:59:27 +00:00
renovate[bot] 2b5bb04bbd chore(deps): Lock file maintenance (#793)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-06-02 21:46:38 +08:00
renovate[bot] 30a5427778 chore(deps): Update non-major dependencies (#792)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-06-02 21:36:42 +08:00
耗子 c547200c05 l10n: update translations (#790)
* New translations backend.pot (Chinese Simplified)
Update translations (Chinese Simplified) backend.pot

* New translations backend.pot (Chinese Traditional)
Update translations (Chinese Traditional) backend.pot
2025-05-31 20:45:22 +08:00
30 changed files with 1606 additions and 1799 deletions
+1 -1
View File
@@ -33,7 +33,7 @@ jobs:
run: |
~/go/bin/xgotext -default backend -pkg-tree ./cmd/web -out ./pkg/embed/locales
cd web && pnpm run gettext:extract
- uses: stefanzweifel/git-auto-commit-action@v5
- uses: stefanzweifel/git-auto-commit-action@v6
name: Commit changes
with:
commit_message: "chore(l10n): update pot files"
+1 -1
View File
@@ -21,7 +21,7 @@ jobs:
run: |
~/go/bin/mockery
git pull
- uses: stefanzweifel/git-auto-commit-action@v5
- uses: stefanzweifel/git-auto-commit-action@v6
name: Commit changes
with:
commit_message: "chore: update mocks"
+18 -17
View File
@@ -7,26 +7,26 @@ require (
github.com/beevik/ntp v1.4.3
github.com/creack/pty v1.1.24
github.com/devhaozi/westcn v0.0.0-20250407083704-b49375823872
github.com/expr-lang/expr v1.17.4
github.com/go-chi/chi/v5 v5.2.1
github.com/expr-lang/expr v1.17.5
github.com/go-chi/chi/v5 v5.2.2
github.com/go-gormigrate/gormigrate/v2 v2.1.4
github.com/go-rat/chix v1.2.0
github.com/go-rat/gormstore v1.0.6
github.com/go-rat/sessions v1.1.0
github.com/go-rat/utils v1.1.5
github.com/go-resty/resty/v2 v2.16.5
github.com/go-sql-driver/mysql v1.9.2
github.com/golang-cz/httplog v0.0.0-20241002114323-98e09d6f537a
github.com/go-sql-driver/mysql v1.9.3
github.com/golang-cz/httplog v0.0.2
github.com/gomodule/redigo v1.9.2
github.com/google/wire v0.6.0
github.com/gookit/color v1.5.4
github.com/gookit/validate v1.5.5
github.com/gorilla/websocket v1.5.3
github.com/hashicorp/go-version v1.7.0
github.com/knadh/koanf/parsers/yaml v1.0.0
github.com/knadh/koanf/parsers/yaml v1.1.0
github.com/knadh/koanf/providers/file v1.2.0
github.com/knadh/koanf/v2 v2.2.0
github.com/leonelquinteros/gotext v1.7.1
github.com/knadh/koanf/v2 v2.2.1
github.com/leonelquinteros/gotext v1.7.2
github.com/lib/pq v1.10.9
github.com/libdns/alidns v1.0.4
github.com/libdns/cloudflare v0.1.3
@@ -45,22 +45,22 @@ require (
github.com/libdns/tencentcloud v1.2.0
github.com/libdns/vercel v0.0.2
github.com/mholt/acmez/v3 v3.1.2
github.com/ncruces/go-sqlite3 v0.26.0
github.com/ncruces/go-sqlite3 v0.26.3
github.com/ncruces/go-sqlite3/gormlite v0.24.0
github.com/orandin/slog-gorm v1.4.0
github.com/pquerna/otp v1.5.0
github.com/robfig/cron/v3 v3.0.1
github.com/samber/lo v1.50.0
github.com/samber/lo v1.51.0
github.com/sethvargo/go-limiter v1.0.1-0.20250412144437-fa26982c7e1a
github.com/shirou/gopsutil v3.21.11+incompatible
github.com/spf13/cast v1.8.0
github.com/spf13/cast v1.9.2
github.com/stretchr/testify v1.10.0
github.com/tufanbarisyildirim/gonginx v0.0.0-20250429180229-7e931b1d4276
github.com/urfave/cli/v3 v3.3.3
golang.org/x/crypto v0.38.0
golang.org/x/net v0.40.0
github.com/tufanbarisyildirim/gonginx v0.0.0-20250620092546-c3e307e36701
github.com/urfave/cli/v3 v3.3.8
go.yaml.in/yaml/v3 v3.0.4
golang.org/x/crypto v0.39.0
golang.org/x/net v0.41.0
gopkg.in/natefinch/lumberjack.v2 v2.2.1
gopkg.in/yaml.v3 v3.0.1
gorm.io/gorm v1.30.0
)
@@ -100,10 +100,11 @@ require (
github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e // indirect
github.com/yusufpapurcu/wmi v1.2.4 // indirect
golang.org/x/exp v0.0.0-20250305212735-054e65f0b394 // indirect
golang.org/x/sync v0.14.0 // indirect
golang.org/x/sync v0.15.0 // indirect
golang.org/x/sys v0.33.0 // indirect
golang.org/x/text v0.25.0 // indirect
golang.org/x/text v0.26.0 // indirect
gopkg.in/ini.v1 v1.67.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
)
replace github.com/mholt/acmez/v3 => github.com/tnb-labs/acmez/v3 v3.0.0-20250416074048-0e9f6b5f8ec5
+36 -36
View File
@@ -51,8 +51,8 @@ github.com/devhaozi/westcn v0.0.0-20250407083704-b49375823872 h1:cns0Vj69pUuQ+bf
github.com/devhaozi/westcn v0.0.0-20250407083704-b49375823872/go.mod h1:3DfSvYwyUHt1JtN+JCWAGtOLFWlRXz19wJa/Xk159ao=
github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no=
github.com/expr-lang/expr v1.17.4 h1:qhTVftZ2Z3WpOEXRHWErEl2xf1Kq011MnQmWgLq06CY=
github.com/expr-lang/expr v1.17.4/go.mod h1:8/vRC7+7HBzESEqt5kKpYXxrxkr31SaO8r40VO/1IT4=
github.com/expr-lang/expr v1.17.5 h1:i1WrMvcdLF249nSNlpQZN1S6NXuW9WaOfF5tPi3aw3k=
github.com/expr-lang/expr v1.17.5/go.mod h1:8/vRC7+7HBzESEqt5kKpYXxrxkr31SaO8r40VO/1IT4=
github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8=
github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0=
@@ -62,8 +62,8 @@ github.com/fsnotify/fsnotify v1.9.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8
github.com/gabriel-vasile/mimetype v1.4.8 h1:FfZ3gj38NjllZIeJAmMhr+qKL8Wu+nOoI3GqacKw1NM=
github.com/gabriel-vasile/mimetype v1.4.8/go.mod h1:ByKUIKGjh1ODkGM1asKUbQZOLGrPjydw3hYPU2YU9t8=
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
github.com/go-chi/chi/v5 v5.2.1 h1:KOIHODQj58PmL80G2Eak4WdvUzjSJSm0vG72crDCqb8=
github.com/go-chi/chi/v5 v5.2.1/go.mod h1:L2yAIGWB3H+phAw1NxKwWM+7eUH/lU8pOMm5hHcoops=
github.com/go-chi/chi/v5 v5.2.2 h1:CMwsvRVTbXVytCk1Wd72Zy1LAsAh9GxMmSNWLHCG618=
github.com/go-chi/chi/v5 v5.2.2/go.mod h1:L2yAIGWB3H+phAw1NxKwWM+7eUH/lU8pOMm5hHcoops=
github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
github.com/go-gormigrate/gormigrate/v2 v2.1.4 h1:KOPEt27qy1cNzHfMZbp9YTmEuzkY4F4wrdsJW9WFk1U=
github.com/go-gormigrate/gormigrate/v2 v2.1.4/go.mod h1:y/6gPAH6QGAgP1UfHMiXcqGeJ88/GRQbfCReE1JJD5Y=
@@ -85,8 +85,8 @@ github.com/go-rat/utils v1.1.5 h1:nB5qNU4TxqG9BJe7PdeDzznmh6lk+GIWb7hZcvAY4FQ=
github.com/go-rat/utils v1.1.5/go.mod h1:SUy4Xw44VkZvo2FaURgiIiJlL6Kukll85fVKMp/50+8=
github.com/go-resty/resty/v2 v2.16.5 h1:hBKqmWrr7uRc3euHVqmh1HTHcKn99Smr7o5spptdhTM=
github.com/go-resty/resty/v2 v2.16.5/go.mod h1:hkJtXbA2iKHzJheXYvQ8snQES5ZLGKMwQ07xAwp/fiA=
github.com/go-sql-driver/mysql v1.9.2 h1:4cNKDYQ1I84SXslGddlsrMhc8k4LeDVj6Ad6WRjiHuU=
github.com/go-sql-driver/mysql v1.9.2/go.mod h1:qn46aNg1333BRMNU69Lq93t8du/dwxI64Gl8i5p1WMU=
github.com/go-sql-driver/mysql v1.9.3 h1:U/N249h2WzJ3Ukj8SowVFjdtZKfu9vlLZxjPXV1aweo=
github.com/go-sql-driver/mysql v1.9.3/go.mod h1:qn46aNg1333BRMNU69Lq93t8du/dwxI64Gl8i5p1WMU=
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss=
github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM=
@@ -94,8 +94,8 @@ github.com/gofiber/schema v1.3.0 h1:K3F3wYzAY+aivfCCEHPufCthu5/13r/lzp1nuk6mr3Q=
github.com/gofiber/schema v1.3.0/go.mod h1:YYwj01w3hVfaNjhtJzaqetymL56VW642YS3qZPhuE6c=
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/golang-cz/httplog v0.0.0-20241002114323-98e09d6f537a h1:BAyyIK6rc6Tq9vT2KVlPJXD8EVv/LpaFwn4fgfLwtHg=
github.com/golang-cz/httplog v0.0.0-20241002114323-98e09d6f537a/go.mod h1:bgk4Ij/0OQ89UeoFFAQrSNhbbr4rKJ0fwWfo7wc+TCc=
github.com/golang-cz/httplog v0.0.2 h1:3d8iScWLeMWQG5/bfMZ5Dizh+zvRfNmLBZMe5N2HrGU=
github.com/golang-cz/httplog v0.0.2/go.mod h1:bgk4Ij/0OQ89UeoFFAQrSNhbbr4rKJ0fwWfo7wc+TCc=
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
@@ -183,12 +183,12 @@ github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvW
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
github.com/knadh/koanf/maps v0.1.2 h1:RBfmAW5CnZT+PJ1CVc1QSJKf4Xu9kxfQgYVQSu8hpbo=
github.com/knadh/koanf/maps v0.1.2/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI=
github.com/knadh/koanf/parsers/yaml v1.0.0 h1:PXyeHCRhAMKyfLJaoTWsqUTxIFeDMmdAKz3XVEslZV4=
github.com/knadh/koanf/parsers/yaml v1.0.0/go.mod h1:Q63VAOh/s6XaQs6a0TB2w9GFUuuPGvfYrCSWb9eWAQU=
github.com/knadh/koanf/parsers/yaml v1.1.0 h1:3ltfm9ljprAHt4jxgeYLlFPmUaunuCgu1yILuTXRdM4=
github.com/knadh/koanf/parsers/yaml v1.1.0/go.mod h1:HHmcHXUrp9cOPcuC+2wrr44GTUB0EC+PyfN3HZD9tFg=
github.com/knadh/koanf/providers/file v1.2.0 h1:hrUJ6Y9YOA49aNu/RSYzOTFlqzXSCpmYIDXI7OJU6+U=
github.com/knadh/koanf/providers/file v1.2.0/go.mod h1:bp1PM5f83Q+TOUu10J/0ApLBd9uIzg+n9UgthfY+nRA=
github.com/knadh/koanf/v2 v2.2.0 h1:FZFwd9bUjpb8DyCWARUBy5ovuhDs1lI87dOEn2K8UVU=
github.com/knadh/koanf/v2 v2.2.0/go.mod h1:PSFru3ufQgTsI7IF+95rf9s8XA1+aHxKuO/W+dPoHEY=
github.com/knadh/koanf/v2 v2.2.1 h1:jaleChtw85y3UdBnI0wCqcg1sj1gPoz6D3caGNHtrNE=
github.com/knadh/koanf/v2 v2.2.1/go.mod h1:PSFru3ufQgTsI7IF+95rf9s8XA1+aHxKuO/W+dPoHEY=
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg=
github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
@@ -199,8 +199,8 @@ github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
github.com/leonelquinteros/gotext v1.7.1 h1:/JNPeE3lY5JeVYv2+KBpz39994W3W9fmZCGq3eO9Ri8=
github.com/leonelquinteros/gotext v1.7.1/go.mod h1:I0WoFDn9u2D3VbPnnDPT8mzZu0iSXG8iih+AH2fHHqg=
github.com/leonelquinteros/gotext v1.7.2 h1:bDPndU8nt+/kRo1m4l/1OXiiy2v7Z7dfPQ9+YP7G1Mc=
github.com/leonelquinteros/gotext v1.7.2/go.mod h1:9/haCkm5P7Jay1sxKDGJ5WIg4zkz8oZKw4ekNpALob8=
github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw=
github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
github.com/libdns/alidns v1.0.4 h1:Rc3Yy2SzMoho+3q3+fNy9vOVr2h9dcL8OLTgNKgxYbU=
@@ -261,14 +261,12 @@ github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
github.com/ncruces/go-sqlite3 v0.26.0 h1:dY6ASfuhSEbtSge6kJwjyJVC7bXCpgEVOycmdboKJek=
github.com/ncruces/go-sqlite3 v0.26.0/go.mod h1:46HIzeCQQ+aNleAxCli+vpA2tfh7ttSnw24kQahBc1o=
github.com/ncruces/go-sqlite3 v0.26.3 h1:WFkQj4KNMhbqiBPGDrVpK74w1DzcxQu3wYpmdWAvfYM=
github.com/ncruces/go-sqlite3 v0.26.3/go.mod h1:XFTPtFIo1DmGCh+XVP8KGn9b/o2f+z0WZuT09x2N6eo=
github.com/ncruces/go-sqlite3/gormlite v0.24.0 h1:81sHeq3CCdhjoqAB650n5wEdRlLO9VBvosArskcN3+c=
github.com/ncruces/go-sqlite3/gormlite v0.24.0/go.mod h1:vXfVWdBfg7qOgqQqHpzUWl9LLswD0h+8mK4oouaV2oc=
github.com/ncruces/julianday v1.0.0 h1:fH0OKwa7NWvniGQtxdJRxAgkBMolni2BjDHaWTxqt7M=
github.com/ncruces/julianday v1.0.0/go.mod h1:Dusn2KvZrrovOMJuOt0TNXL6tB7U2E8kvza5fFc9G7g=
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs=
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U=
github.com/orandin/slog-gorm v1.4.0 h1:FgA8hJufF9/jeNSYoEXmHPPBwET2gwlF3B85JdpsTUU=
github.com/orandin/slog-gorm v1.4.0/go.mod h1:MoZ51+b7xE9lwGNPYEhxcUtRNrYzjdcKvA8QXQQGEPA=
@@ -301,8 +299,8 @@ github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZV
github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=
github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=
github.com/samber/lo v1.50.0 h1:XrG0xOeHs+4FQ8gJR97zDz5uOFMW7OwFWiFVzqopKgY=
github.com/samber/lo v1.50.0/go.mod h1:RjZyNk6WSnUFRKK6EyOhsRJMqft3G+pg7dCWHQCWvsc=
github.com/samber/lo v1.51.0 h1:kysRYLbHy/MB7kQZf5DSN50JHmMsNEdeY24VzJFu7wI=
github.com/samber/lo v1.51.0/go.mod h1:4+MXEGsJzbKGaUEQFKBq2xtfuznW9oz/WrgyzMzRoM0=
github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=
github.com/sethvargo/go-limiter v1.0.1-0.20250412144437-fa26982c7e1a h1:CdCoDHVynJVAQWN7ZQrAUOp0SV5TmRwNOSkF5KedDko=
github.com/sethvargo/go-limiter v1.0.1-0.20250412144437-fa26982c7e1a/go.mod h1:01b6tW25Ap+MeLYBuD4aHunMrJoNO5PVUFdS9rac3II=
@@ -317,8 +315,8 @@ github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasO
github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ=
github.com/spf13/afero v1.4.1/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I=
github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
github.com/spf13/cast v1.8.0 h1:gEN9K4b8Xws4EX0+a0reLmhq8moKn7ntRlQYgjPeCDk=
github.com/spf13/cast v1.8.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo=
github.com/spf13/cast v1.9.2 h1:SsGfm7M8QOFtEzumm7UZrZdLLquNdzFYfIbEXntcFbE=
github.com/spf13/cast v1.9.2/go.mod h1:jNfB8QC9IA6ZuY2ZjDp0KtFO2LZZlg4S/7bzP6qqeHo=
github.com/spf13/cobra v1.1.1/go.mod h1:WnodtKOvamDL/PwE2M4iKs8aMDBZ5Q5klgD3qfVJQMI=
github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo=
github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
@@ -350,10 +348,10 @@ github.com/tklauser/numcpus v0.9.0/go.mod h1:SN6Nq1O3VychhC1npsWostA+oW+VOQTxZrS
github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
github.com/tnb-labs/acmez/v3 v3.0.0-20250416074048-0e9f6b5f8ec5 h1:eeJt90c4buPPC4JjfP5EaTFwlARgOaaXqewHFqZJJag=
github.com/tnb-labs/acmez/v3 v3.0.0-20250416074048-0e9f6b5f8ec5/go.mod h1:L1wOU06KKvq7tswuMDwKdcHeKpFFgkppZy/y0DFxagQ=
github.com/tufanbarisyildirim/gonginx v0.0.0-20250429180229-7e931b1d4276 h1:928VpvLiMWSulfjhKUYj57f70HhOE1ImsQHaeDC2jVc=
github.com/tufanbarisyildirim/gonginx v0.0.0-20250429180229-7e931b1d4276/go.mod h1:ALbEe81QPWOZjDKCKNWodG2iqCMtregG8+ebQgjx2+4=
github.com/urfave/cli/v3 v3.3.3 h1:byCBaVdIXuLPIDm5CYZRVG6NvT7tv1ECqdU4YzlEa3I=
github.com/urfave/cli/v3 v3.3.3/go.mod h1:FJSKtM/9AiiTOJL4fJ6TbMUkxBXn7GO9guZqoZtpYpo=
github.com/tufanbarisyildirim/gonginx v0.0.0-20250620092546-c3e307e36701 h1:JgeHIJzRSEdcuLXufZrni5+a4yDnBhQG+DdKhqCFhq0=
github.com/tufanbarisyildirim/gonginx v0.0.0-20250620092546-c3e307e36701/go.mod h1:ALbEe81QPWOZjDKCKNWodG2iqCMtregG8+ebQgjx2+4=
github.com/urfave/cli/v3 v3.3.8 h1:BzolUExliMdet9NlJ/u4m5vHSotJ3PzEqSAZ1oPMa/E=
github.com/urfave/cli/v3 v3.3.8/go.mod h1:FJSKtM/9AiiTOJL4fJ6TbMUkxBXn7GO9guZqoZtpYpo=
github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU=
github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e h1:JVG44RsyaB9T2KIHavMF/ppJZNG9ZpyihvCd0w101no=
github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e/go.mod h1:RbqR21r5mrJuqunuUZ/Dhy/avygyECGrLceyNeo4LiM=
@@ -366,6 +364,8 @@ go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=
go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc=
go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg=
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=
@@ -376,8 +376,8 @@ golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8U
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc=
golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg=
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/crypto v0.39.0 h1:SHs+kF4LP+f+p14esP5jAoDpHU8Gu/v9lFRK6IT5imM=
golang.org/x/crypto v0.39.0/go.mod h1:L+Xg3Wf6HoL4Bn4238Z6ft6KfEpN0tJGo53AAPC632U=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
@@ -424,8 +424,8 @@ golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk=
golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY=
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/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw=
golang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA=
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=
@@ -438,8 +438,8 @@ golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJ
golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y=
golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
golang.org/x/sync v0.14.0 h1:woo0S4Yywslg6hp4eUFjTVOyKt0RookbpAHG4c1HmhQ=
golang.org/x/sync v0.14.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
golang.org/x/sync v0.15.0 h1:KWH3jNZsfyT6xfAfKiz6MRNmd46ByHDYaZ7KSkCtdW8=
golang.org/x/sync v0.15.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=
@@ -483,8 +483,8 @@ golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
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.25.0 h1:qVyWApTSYLk/drJRO5mDlNYskwQznZmkpV2c8q9zls4=
golang.org/x/text v0.25.0/go.mod h1:WEdwpYrmk1qmdHvhkSTNPm3app7v4rsT8F2UD6+VHIA=
golang.org/x/text v0.26.0 h1:P42AVeLghgTYr4+xUnTRKDMqpar+PtX7KWuNQL21L8M=
golang.org/x/text v0.26.0/go.mod h1:QK15LZJUUQVJxhz7wXgxSy/CJaTFjd0G+YLonydOVQA=
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.6.0 h1:eTDhh4ZXt5Qf0augr54TN6suAUudPcawVZeIAPU7D4U=
@@ -539,8 +539,8 @@ google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ij
gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU=
gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo=
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA=
+1 -1
View File
@@ -17,7 +17,7 @@ import (
func NewDB(conf *koanf.Koanf, log *slog.Logger) (*gorm.DB, error) {
// You can use any other database, like MySQL or PostgreSQL.
return gorm.Open(gormlite.Open(filepath.Join(app.Root, "panel/storage/app.db")), &gorm.Config{
return gorm.Open(gormlite.Open("file:"+filepath.Join(app.Root, "panel/storage/app.db?_txlock=immediate")), &gorm.Config{
Logger: sloggorm.New(sloggorm.WithHandler(log.Handler())),
SkipDefaultTransaction: true,
DisableForeignKeyConstraintWhenMigrating: true,
+1 -1
View File
@@ -326,7 +326,7 @@ func (r *certRepo) ManualDNS(id uint) ([]acme.DNSRecord, error) {
return nil, err
}
client.UseManualDns(len(cert.Domains))
client.UseManualDns()
records, err := client.GetDNSRecords(context.Background(), cert.Domains, acme.KeyType(cert.Type))
if err != nil {
return nil, err
+1 -1
View File
@@ -9,7 +9,7 @@ import (
"github.com/knadh/koanf/v2"
"github.com/leonelquinteros/gotext"
"github.com/spf13/cast"
"gopkg.in/yaml.v3"
"go.yaml.in/yaml/v3"
"gorm.io/gorm"
"github.com/tnb-labs/panel/internal/app"
+7 -6
View File
@@ -29,6 +29,8 @@ func Entrance(t *gotext.Locale, conf *koanf.Koanf, session *sessions.Manager) fu
entrance = "/" + entrance
}
routePath := chi.RouteContext(r.Context()).RoutePath
// 情况一:设置了绑定域名、IP、UA,且请求不符合要求,返回错误
host, _, err := net.SplitHostPort(r.Host)
if err != nil {
@@ -78,8 +80,7 @@ func Entrance(t *gotext.Locale, conf *koanf.Koanf, session *sessions.Manager) fu
}
// 情况二:请求路径与入口路径相同或者未设置访问入口,标记通过验证并重定向到登录页面
if (strings.TrimSuffix(r.URL.Path, "/") == entrance || entrance == "/") &&
sess.Missing("verify_entrance") &&
if (strings.TrimSuffix(routePath, "/") == entrance || entrance == "/") &&
r.Header.Get("Authorization") == "" {
sess.Put("verify_entrance", true)
render := chix.NewRender(w, r)
@@ -89,12 +90,12 @@ func Entrance(t *gotext.Locale, conf *koanf.Koanf, session *sessions.Manager) fu
}
// 情况三:通过APIKey+入口路径访问,重写请求路径并跳过验证
if strings.HasPrefix(r.URL.Path, entrance) && r.Header.Get("Authorization") != "" {
if strings.HasPrefix(routePath, entrance) && r.Header.Get("Authorization") != "" {
// 只在设置了入口路径的情况下,才进行重写
if entrance != "/" {
if rctx := chi.RouteContext(r.Context()); rctx != nil {
rctx.RoutePath = strings.TrimPrefix(rctx.RoutePath, entrance)
r.URL.Path = strings.TrimPrefix(r.URL.Path, entrance)
rctx.RoutePath = strings.TrimPrefix(routePath, entrance)
r.URL.Path = strings.TrimPrefix(routePath, entrance)
}
}
next.ServeHTTP(w, r)
@@ -104,7 +105,7 @@ func Entrance(t *gotext.Locale, conf *koanf.Koanf, session *sessions.Manager) fu
// 情况四:非调试模式且未通过验证的请求,返回错误
if !conf.Bool("app.debug") &&
sess.Missing("verify_entrance") &&
r.URL.Path != "/robots.txt" {
routePath != "/robots.txt" {
Abort(w, http.StatusTeapot, t.Get("invalid access entrance"))
return
}
+3 -3
View File
@@ -39,16 +39,16 @@ func NewMiddlewares(conf *koanf.Koanf, log *slog.Logger, session *sessions.Manag
// Globals is a collection of global middleware that will be applied to every request.
func (r *Middlewares) Globals(t *gotext.Locale, mux *chi.Mux) []func(http.Handler) http.Handler {
return []func(http.Handler) http.Handler{
sessionmiddleware.StartSession(r.session),
middleware.Recoverer,
//middleware.SupressNotFound(mux),// bug https://github.com/go-chi/chi/pull/940
middleware.CleanPath,
middleware.StripSlashes,
middleware.Compress(5),
httplog.RequestLogger(r.log, &httplog.Options{
Level: slog.LevelInfo,
LogRequestHeaders: []string{"User-Agent"},
}),
middleware.Recoverer,
middleware.Compress(5),
sessionmiddleware.StartSession(r.session),
Status(t),
Entrance(t, r.conf, r.session),
MustLogin(t, r.session, r.userToken),
+7 -4
View File
@@ -4,6 +4,7 @@ import (
"net/http"
"strings"
"github.com/go-chi/chi/v5"
"github.com/leonelquinteros/gotext"
"github.com/tnb-labs/panel/internal/biz"
@@ -13,13 +14,15 @@ import (
func MustInstall(t *gotext.Locale, app biz.AppRepo) func(next http.Handler) http.Handler {
return func(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
routePath := chi.RouteContext(r.Context()).RoutePath
var slugs []string
if strings.HasPrefix(r.URL.Path, "/api/website") {
if strings.HasPrefix(routePath, "/api/website") {
slugs = append(slugs, "nginx")
} else if strings.HasPrefix(r.URL.Path, "/api/container") {
} else if strings.HasPrefix(routePath, "/api/container") {
slugs = append(slugs, "podman", "docker")
} else if strings.HasPrefix(r.URL.Path, "/api/apps/") {
pathArr := strings.Split(r.URL.Path, "/")
} else if strings.HasPrefix(routePath, "/api/apps/") {
pathArr := strings.Split(routePath, "/")
if len(pathArr) < 4 {
Abort(w, http.StatusForbidden, t.Get("app not found"))
return
+6 -2
View File
@@ -9,6 +9,7 @@ import (
"slices"
"strings"
"github.com/go-chi/chi/v5"
"github.com/go-rat/sessions"
"github.com/leonelquinteros/gotext"
"github.com/spf13/cast"
@@ -35,8 +36,10 @@ func MustLogin(t *gotext.Locale, session *sessions.Manager, userToken biz.UserTo
return
}
routePath := chi.RouteContext(r.Context()).RoutePath
// 对白名单和非 API 请求放行
if slices.Contains(whiteList, r.URL.Path) || !strings.HasPrefix(r.URL.Path, "/api") {
if slices.Contains(whiteList, routePath) || !strings.HasPrefix(routePath, "/api") {
next.ServeHTTP(w, r)
return
}
@@ -44,7 +47,7 @@ func MustLogin(t *gotext.Locale, session *sessions.Manager, userToken biz.UserTo
userID := uint(0)
if r.Header.Get("Authorization") != "" {
// 禁止访问 ws 相关的接口
if strings.HasPrefix(r.URL.Path, "/api/ws") {
if strings.HasPrefix(routePath, "/api/ws") {
Abort(w, http.StatusForbidden, t.Get("ws not allowed"))
return
}
@@ -65,6 +68,7 @@ func MustLogin(t *gotext.Locale, session *sessions.Manager, userToken biz.UserTo
ip, _, _ := net.SplitHostPort(strings.TrimSpace(r.RemoteAddr))
clientHash := fmt.Sprintf("%x", sha256.Sum256([]byte(ip)))
if safeClientHash != clientHash || safeClientHash == "" {
sess.Forget("user_id") // 清除 user_id,否则会来回跳转
Abort(w, http.StatusUnauthorized, t.Get("client ip/ua changed, please login again"))
return
}
+1 -1
View File
@@ -17,7 +17,7 @@ import (
"github.com/leonelquinteros/gotext"
"github.com/spf13/cast"
"github.com/urfave/cli/v3"
"gopkg.in/yaml.v3"
"go.yaml.in/yaml/v3"
"gorm.io/gorm"
"github.com/tnb-labs/panel/internal/app"
+5 -10
View File
@@ -3,7 +3,6 @@ package service
import (
"net/http"
"slices"
"strings"
"github.com/go-rat/chix"
@@ -179,15 +178,11 @@ func (s *FirewallService) CreateIPRule(w http.ResponseWriter, r *http.Request) {
return
}
// rich rule 下,address 不支持多个地址,需要单独添加
addresses := strings.Split(req.Address, ",")
for address := range slices.Values(addresses) {
if err = s.firewall.RichRules(firewall.FireInfo{
Family: req.Family, Address: address, Protocol: firewall.Protocol(req.Protocol), Strategy: firewall.Strategy(req.Strategy), Direction: firewall.Direction(req.Direction),
}, firewall.OperationAdd); err != nil {
Error(w, http.StatusInternalServerError, "%v", err)
return
}
if err = s.firewall.RichRules(firewall.FireInfo{
Family: req.Family, Address: req.Address, Protocol: firewall.Protocol(req.Protocol), Strategy: firewall.Strategy(req.Strategy), Direction: firewall.Direction(req.Direction),
}, firewall.OperationAdd); err != nil {
Error(w, http.StatusInternalServerError, "%v", err)
return
}
Success(w, nil)
+14 -12
View File
@@ -35,14 +35,16 @@ func (c *Client) UseDns(dnsType DnsType, param DNSParam) {
}
// UseManualDns 使用手动 DNS 验证
func (c *Client) UseManualDns(total int, check ...bool) {
func (c *Client) UseManualDns(check ...bool) {
c.controlChan = make(chan struct{})
c.dataChan = make(chan any)
c.dnsChan = make(chan any)
c.certChan = make(chan any)
c.zClient.ChallengeSolvers = map[string]acmez.Solver{
acme.ChallengeTypeDNS01: &manualDNSSolver{
check: len(check) > 0 && check[0],
controlChan: c.controlChan,
dataChan: c.dataChan,
dnsChan: c.dnsChan,
certChan: c.certChan,
records: []DNSRecord{},
},
}
@@ -84,13 +86,13 @@ func (c *Client) ObtainCertificateManual() (Certificate, error) {
// 发送信号,开始验证
c.controlChan <- struct{}{}
// 等待验证完成
data := <-c.dataChan
certs := <-c.certChan
if err, ok := data.(error); ok {
if err, ok := certs.(error); ok {
return Certificate{}, err
}
return data.(Certificate), nil
return certs.(Certificate), nil
}
// RenewCertificate 续签 SSL 证书
@@ -107,22 +109,22 @@ func (c *Client) RenewCertificate(ctx context.Context, certUrl string, domains [
func (c *Client) GetDNSRecords(ctx context.Context, domains []string, keyType KeyType) ([]DNSRecord, error) {
go func(ctx context.Context, domains []string, keyType KeyType) {
certs, err := c.ObtainCertificate(ctx, domains, keyType)
// 将证书和错误信息发送到 dataChan
// 将证书和错误信息发送到 certChan
if err != nil {
c.dataChan <- err
c.certChan <- err
return
}
c.dataChan <- certs
c.certChan <- certs
}(ctx, domains, keyType)
// 这里要少一次循环,因为需要卡住最后一次的 dataChan,等待手动 DNS 验证完成
// 这里要少一次循环,因为需要卡住最后一次的 dnsChan,等待手动 DNS 验证完成
for i := 1; i < len(domains); i++ {
<-c.dataChan
<-c.dnsChan
c.controlChan <- struct{}{}
}
// 因为上面少了一次循环,所以这里接收到的即为完整的 DNS 记录切片
data := <-c.dataChan
data := <-c.dnsChan
if err, ok := data.(error); ok {
return nil, err
}
+6 -4
View File
@@ -267,9 +267,10 @@ type DNSProvider interface {
}
type manualDNSSolver struct {
check bool
check bool // 是否检查 DNS 解析,目前没写
controlChan chan struct{}
dataChan chan any
dnsChan chan any
certChan chan any
records []DNSRecord
}
@@ -286,7 +287,7 @@ func (s *manualDNSSolver) Present(ctx context.Context, challenge acme.Challenge)
Domain: domain,
Value: keyAuth,
})
s.dataChan <- s.records
s.dnsChan <- s.records
select {
case <-s.controlChan:
@@ -301,7 +302,8 @@ func (s *manualDNSSolver) CleanUp(_ context.Context, _ acme.Challenge) error {
_ = recover()
}()
close(s.controlChan)
close(s.dataChan)
close(s.dnsChan)
close(s.certChan)
return nil
}
+10 -10
View File
@@ -1280,7 +1280,7 @@ msgstr ""
#: internal/data/app.go:213
#: internal/data/app.go:268
#: internal/http/middleware/must_install.go:38
#: internal/http/middleware/must_install.go:41
msgid "app %s not installed"
msgstr ""
@@ -1295,7 +1295,7 @@ msgstr ""
msgid "app %s requires panel version %s, current version %s"
msgstr ""
#: internal/http/middleware/must_install.go:24
#: internal/http/middleware/must_install.go:27
msgid "app not found"
msgstr ""
@@ -1332,7 +1332,7 @@ msgstr ""
msgid "check server connection failed"
msgstr ""
#: internal/http/middleware/must_login.go:68
#: internal/http/middleware/must_login.go:72
msgid "client ip/ua changed, please login again"
msgstr ""
@@ -1727,7 +1727,7 @@ msgstr ""
msgid "invalid 2FA code"
msgstr ""
#: internal/http/middleware/entrance.go:108
#: internal/http/middleware/entrance.go:109
msgid "invalid access entrance"
msgstr ""
@@ -1739,16 +1739,16 @@ msgstr ""
msgid "invalid key, please refresh the page"
msgstr ""
#: internal/http/middleware/entrance.go:43
#: internal/http/middleware/entrance.go:45
msgid "invalid request domain: %s"
msgstr ""
#: internal/data/user_token.go:167
#: internal/http/middleware/entrance.go:71
#: internal/http/middleware/entrance.go:73
msgid "invalid request ip: %s"
msgstr ""
#: internal/http/middleware/entrance.go:76
#: internal/http/middleware/entrance.go:78
msgid "invalid request user agent: %s"
msgstr ""
@@ -1758,7 +1758,7 @@ msgstr ""
msgid "invalid signature"
msgstr ""
#: internal/http/middleware/must_login.go:77
#: internal/http/middleware/must_login.go:81
msgid "invalid user id, please login again"
msgstr ""
@@ -1888,7 +1888,7 @@ msgstr ""
msgid "runtime directory does not exist"
msgstr ""
#: internal/http/middleware/must_login.go:58
#: internal/http/middleware/must_login.go:61
msgid "session expired, please login again"
msgstr ""
@@ -2009,7 +2009,7 @@ msgstr ""
msgid "write file error: %v"
msgstr ""
#: internal/http/middleware/must_login.go:48
#: internal/http/middleware/must_login.go:51
msgid "ws not allowed"
msgstr ""
+5 -5
View File
@@ -13,7 +13,7 @@ msgstr ""
"X-Crowdin-File-ID: 922\n"
"Project-Id-Version: ratpanel\n"
"Language-Team: Chinese Simplified\n"
"PO-Revision-Date: 2025-05-31 11:39\n"
"PO-Revision-Date: 2025-06-20 05:19\n"
#: internal/data/website.go:270
#: internal/data/website.go:643
@@ -1340,7 +1340,7 @@ msgstr "找不到 %s 数据库服务器,请先添加"
msgid "check server connection failed"
msgstr "检查服务器连接失败"
#: internal/http/middleware/must_login.go:68
#: internal/http/middleware/must_login.go:69
msgid "client ip/ua changed, please login again"
msgstr "客户端 IP/UA 已更改,请重新登录"
@@ -1735,7 +1735,7 @@ msgstr "获取服务端口失败,请检查是否安装"
msgid "invalid 2FA code"
msgstr "无效的两步验证代码"
#: internal/http/middleware/entrance.go:108
#: internal/http/middleware/entrance.go:107
msgid "invalid access entrance"
msgstr "无效的访问入口"
@@ -1766,7 +1766,7 @@ msgstr "无效的请求UA%s"
msgid "invalid signature"
msgstr "无效的签名"
#: internal/http/middleware/must_login.go:77
#: internal/http/middleware/must_login.go:78
msgid "invalid user id, please login again"
msgstr "无效的用户ID,请重新登录"
@@ -2198,7 +2198,7 @@ msgstr "|-运行更新后脚本……"
#: internal/data/backup.go:684
#: internal/data/backup.go:815
msgid "|-Set key file permissions..."
msgstr "|-设置密钥文件权限……"
msgstr "|-设置关键文件权限……"
#: internal/data/backup.go:577
msgid "|-Start fixing the panel..."
+5 -5
View File
@@ -13,7 +13,7 @@ msgstr ""
"X-Crowdin-File-ID: 922\n"
"Project-Id-Version: ratpanel\n"
"Language-Team: Chinese Traditional\n"
"PO-Revision-Date: 2025-05-31 11:39\n"
"PO-Revision-Date: 2025-06-20 05:19\n"
#: internal/data/website.go:270
#: internal/data/website.go:643
@@ -1340,7 +1340,7 @@ msgstr "找不到 %s 數據庫服務器,請先添加"
msgid "check server connection failed"
msgstr "檢查伺服器連接失敗"
#: internal/http/middleware/must_login.go:68
#: internal/http/middleware/must_login.go:69
msgid "client ip/ua changed, please login again"
msgstr "客戶端 IP/UA 已更改,請重新登入"
@@ -1735,7 +1735,7 @@ msgstr "獲取服務端口失敗,請檢查是否安裝"
msgid "invalid 2FA code"
msgstr "無效的兩步驗證代碼"
#: internal/http/middleware/entrance.go:108
#: internal/http/middleware/entrance.go:107
msgid "invalid access entrance"
msgstr "無效的訪問入口"
@@ -1766,7 +1766,7 @@ msgstr "無效的請求UA%s"
msgid "invalid signature"
msgstr "無效的簽名"
#: internal/http/middleware/must_login.go:77
#: internal/http/middleware/must_login.go:78
msgid "invalid user id, please login again"
msgstr "無效的用戶ID,請重新登錄"
@@ -2198,7 +2198,7 @@ msgstr "|-執行更新後腳本……"
#: internal/data/backup.go:684
#: internal/data/backup.go:815
msgid "|-Set key file permissions..."
msgstr "|-設定金鑰檔案權限……"
msgstr "|-設定關鍵檔案權限……"
#: internal/data/backup.go:577
msgid "|-Start fixing the panel..."
+5
View File
@@ -207,6 +207,11 @@ func (r *Firewall) Port(rule FireInfo, operation Operation) error {
}
func (r *Firewall) RichRules(rule FireInfo, operation Operation) error {
// 出站规则下,必须指定具体的地址,否则会添加成入站规则
if rule.Direction == "out" && rule.Address == "" {
return fmt.Errorf("outbound rules must specify an address")
}
protocols := strings.Split(string(rule.Protocol), "/")
for protocol := range slices.Values(protocols) {
var ruleBuilder strings.Builder
+2 -1
View File
@@ -34,6 +34,7 @@
"github.com/libdns/cloudflare",
"github.com/libdns/tencentcloud",
"github.com/libdns/duckdns",
"github.com/libdns/gcore"
"github.com/libdns/gcore",
"github.com/libdns/cloudns"
]
}
+3 -3
View File
@@ -45,7 +45,7 @@
"install": "^0.13.0",
"lodash-es": "^4.17.21",
"luxon": "^3.6.1",
"marked": "^15.0.12",
"marked": "^16.0.0",
"mitt": "^3.0.1",
"node-forge": "^1.3.1",
"pinia": "^3.0.2",
@@ -66,7 +66,7 @@
"@types/node": "^22.15.21",
"@types/node-forge": "^1.3.11",
"@unocss/eslint-config": "^66.1.2",
"@vitejs/plugin-vue": "^5.2.4",
"@vitejs/plugin-vue": "^6.0.0",
"@vue/eslint-config-prettier": "^10.2.0",
"@vue/eslint-config-typescript": "^14.5.0",
"@vue/tsconfig": "^0.7.0",
@@ -87,7 +87,7 @@
"unplugin-auto-import": "^19.3.0",
"unplugin-icons": "^22.1.0",
"unplugin-vue-components": "^28.7.0",
"vite": "^6.3.5",
"vite": "^7.0.0",
"vite-plugin-html": "^3.2.2",
"vite-plugin-mock": "^3.0.2",
"vite-plugin-static-copy": "^3.0.0",
+1201 -1404
View File
File diff suppressed because it is too large Load Diff
+66 -66
View File
@@ -149,7 +149,6 @@ msgstr ""
#: src/views/database/CreateUserModal.vue:28
#: src/views/file/ToolBar.vue:45
#: src/views/firewall/CreateForwardModal.vue:41
#: src/views/firewall/CreateModal.vue:84
#: src/views/setting/CreateModal.vue:19
#: src/views/setting/TokenModal.vue:127
#: src/views/ssh/CreateModal.vue:38
@@ -181,7 +180,7 @@ msgid "Root Directory"
msgstr ""
#: src/components/common/PathSelector.vue:335
#: src/views/app/VersionModal.vue:96
#: src/views/app/VersionModal.vue:97
#: src/views/apps/fail2ban/IndexView.vue:375
#: src/views/apps/pureftpd/IndexView.vue:249
#: src/views/apps/pureftpd/IndexView.vue:271
@@ -201,7 +200,7 @@ msgstr ""
#: src/views/cert/UploadCertModal.vue:55
#: src/views/container/ComposeView.vue:348
#: src/views/container/ComposeView.vue:378
#: src/views/container/ContainerCreate.vue:370
#: src/views/container/ContainerCreate.vue:371
#: src/views/container/ContainerView.vue:485
#: src/views/container/ImageView.vue:217
#: src/views/container/NetworkView.vue:313
@@ -214,8 +213,8 @@ msgstr ""
#: src/views/file/ToolBar.vue:261
#: src/views/file/ToolBar.vue:282
#: src/views/firewall/CreateForwardModal.vue:88
#: src/views/firewall/CreateIpModal.vue:122
#: src/views/firewall/CreateModal.vue:147
#: src/views/firewall/CreateIpModal.vue:118
#: src/views/firewall/CreateModal.vue:142
#: src/views/setting/CreateModal.vue:64
#: src/views/setting/PasswordModal.vue:44
#: src/views/setting/TwoFaModal.vue:87
@@ -501,7 +500,7 @@ msgstr ""
#: src/locales/menu.ts:9
#: src/views/cert/CertView.vue:497
#: src/views/cert/CertView.vue:573
#: src/views/cert/CertView.vue:574
#: src/views/cert/UploadCertModal.vue:38
#: src/views/setting/SettingSafe.vue:54
#: src/views/website/EditView.vue:355
@@ -647,8 +646,8 @@ msgstr ""
#: src/views/cert/CertView.vue:181
#: src/views/cert/DnsView.vue:64
#: src/views/container/ComposeView.vue:74
#: src/views/container/ContainerCreate.vue:174
#: src/views/container/ContainerCreate.vue:255
#: src/views/container/ContainerCreate.vue:175
#: src/views/container/ContainerCreate.vue:256
#: src/views/container/ContainerView.vue:91
#: src/views/container/ImageView.vue:69
#: src/views/container/NetworkView.vue:109
@@ -708,15 +707,15 @@ msgstr ""
msgid "Before updating apps, it is strongly recommended to backup/snapshot first, so you can roll back immediately if there are any issues!"
msgstr ""
#: src/views/app/VersionModal.vue:73
#: src/views/app/VersionModal.vue:74
msgid "Channel"
msgstr ""
#: src/views/app/VersionModal.vue:80
#: src/views/app/VersionModal.vue:81
msgid "Version"
msgstr ""
#: src/views/app/VersionModal.vue:83
#: src/views/app/VersionModal.vue:84
msgid "Please select a channel"
msgstr ""
@@ -839,8 +838,8 @@ msgstr ""
#: src/views/cert/CertView.vue:314
#: src/views/cert/DnsView.vue:111
#: src/views/container/ComposeView.vue:228
#: src/views/container/ContainerCreate.vue:235
#: src/views/container/ContainerCreate.vue:286
#: src/views/container/ContainerCreate.vue:236
#: src/views/container/ContainerCreate.vue:287
#: src/views/container/ContainerView.vue:160
#: src/views/container/ContainerView.vue:418
#: src/views/container/ImageView.vue:94
@@ -1045,7 +1044,7 @@ msgstr ""
#: src/views/apps/minio/IndexView.vue:39
#: src/views/container/ComposeView.vue:338
#: src/views/container/ComposeView.vue:368
#: src/views/container/ContainerCreate.vue:352
#: src/views/container/ContainerCreate.vue:353
msgid "Environment Variables"
msgstr ""
@@ -1842,7 +1841,7 @@ msgid "Enter the content of the PEM certificate file"
msgstr ""
#: src/views/cert/CertView.vue:509
#: src/views/cert/CertView.vue:585
#: src/views/cert/CertView.vue:586
#: src/views/cert/UploadCertModal.vue:46
#: src/views/setting/SettingSafe.vue:61
#: src/views/ssh/CreateModal.vue:78
@@ -2181,13 +2180,13 @@ msgstr ""
#: src/views/container/ComposeView.vue:342
#: src/views/container/ComposeView.vue:372
#: src/views/container/ContainerCreate.vue:356
#: src/views/container/ContainerCreate.vue:357
msgid "Variable Name"
msgstr ""
#: src/views/container/ComposeView.vue:343
#: src/views/container/ComposeView.vue:373
#: src/views/container/ContainerCreate.vue:357
#: src/views/container/ContainerCreate.vue:358
msgid "Variable Value"
msgstr ""
@@ -2212,82 +2211,82 @@ msgstr ""
msgid "Create Container"
msgstr ""
#: src/views/container/ContainerCreate.vue:137
#: src/views/container/ContainerCreate.vue:138
#: src/views/container/ContainerView.vue:25
msgid "Container Name"
msgstr ""
#: src/views/container/ContainerCreate.vue:140
#: src/views/container/ContainerCreate.vue:141
#: src/views/container/ContainerView.vue:52
#: src/views/container/ImageView.vue:36
msgid "Image"
msgstr ""
#: src/views/container/ContainerCreate.vue:143
#: src/views/container/ContainerCreate.vue:144
msgid "Ports"
msgstr ""
#: src/views/container/ContainerCreate.vue:149
#: src/views/container/ContainerCreate.vue:150
msgid "Map Ports"
msgstr ""
#: src/views/container/ContainerCreate.vue:156
#: src/views/container/ContainerCreate.vue:157
msgid "Expose All"
msgstr ""
#: src/views/container/ContainerCreate.vue:161
#: src/views/container/ContainerCreate.vue:162
msgid "Port Mapping"
msgstr ""
#: src/views/container/ContainerCreate.vue:169
#: src/views/container/ContainerCreate.vue:170
msgid "Host (Start)"
msgstr ""
#: src/views/container/ContainerCreate.vue:170
#: src/views/container/ContainerCreate.vue:171
msgid "Host (End)"
msgstr ""
#: src/views/container/ContainerCreate.vue:171
#: src/views/container/ContainerCreate.vue:172
msgid "Container (Start)"
msgstr ""
#: src/views/container/ContainerCreate.vue:172
#: src/views/container/ContainerCreate.vue:173
msgid "Container (End)"
msgstr ""
#: src/views/container/ContainerCreate.vue:173
#: src/views/container/ContainerCreate.vue:174
msgid "Protocol"
msgstr ""
#: src/views/container/ContainerCreate.vue:184
#: src/views/container/ContainerCreate.vue:185
msgid "Optional"
msgstr ""
#: src/views/container/ContainerCreate.vue:241
#: src/views/container/ContainerCreate.vue:292
#: src/views/container/ContainerCreate.vue:242
#: src/views/container/ContainerCreate.vue:293
msgid "Add"
msgstr ""
#: src/views/container/ContainerCreate.vue:244
#: src/views/container/ContainerCreate.vue:245
#: src/views/dashboard/IndexView.vue:141
#: src/views/dashboard/IndexView.vue:797
#: src/views/monitor/IndexView.vue:286
msgid "Network"
msgstr ""
#: src/views/container/ContainerCreate.vue:247
#: src/views/container/ContainerCreate.vue:248
msgid "Mount"
msgstr ""
#: src/views/container/ContainerCreate.vue:252
#: src/views/container/ContainerCreate.vue:253
msgid "Host Directory"
msgstr ""
#: src/views/container/ContainerCreate.vue:253
#: src/views/container/ContainerCreate.vue:254
msgid "Container Directory"
msgstr ""
#: src/views/container/ContainerCreate.vue:254
#: src/views/container/ContainerCreate.vue:255
#: src/views/file/ListTable.vue:73
#: src/views/file/ListTable.vue:145
#: src/views/file/ListTable.vue:300
@@ -2296,25 +2295,25 @@ msgstr ""
msgid "Permission"
msgstr ""
#: src/views/container/ContainerCreate.vue:273
#: src/views/container/ContainerCreate.vue:274
msgid "Read-Write"
msgstr ""
#: src/views/container/ContainerCreate.vue:281
#: src/views/container/ContainerCreate.vue:282
msgid "Read-Only"
msgstr ""
#: src/views/container/ContainerCreate.vue:295
#: src/views/container/ContainerCreate.vue:296
#: src/views/container/ContainerCreate.vue:297
msgid "Command"
msgstr ""
#: src/views/container/ContainerCreate.vue:298
#: src/views/container/ContainerCreate.vue:301
#: src/views/container/ContainerCreate.vue:299
#: src/views/container/ContainerCreate.vue:302
msgid "Entrypoint"
msgstr ""
#: src/views/container/ContainerCreate.vue:306
#: src/views/container/ContainerCreate.vue:307
#: src/views/dashboard/IndexView.vue:533
#: src/views/monitor/IndexView.vue:205
#: src/views/monitor/IndexView.vue:216
@@ -2324,48 +2323,48 @@ msgstr ""
msgid "Memory"
msgstr ""
#: src/views/container/ContainerCreate.vue:316
#: src/views/container/ContainerCreate.vue:317
msgid "CPU Shares"
msgstr ""
#: src/views/container/ContainerCreate.vue:323
#: src/views/container/ContainerCreate.vue:324
msgid "TTY (-t)"
msgstr ""
#: src/views/container/ContainerCreate.vue:328
#: src/views/container/ContainerCreate.vue:329
msgid "STDIN (-i)"
msgstr ""
#: src/views/container/ContainerCreate.vue:333
#: src/views/container/ContainerCreate.vue:334
msgid "Auto Remove"
msgstr ""
#: src/views/container/ContainerCreate.vue:338
#: src/views/container/ContainerCreate.vue:339
msgid "Privileged Mode"
msgstr ""
#: src/views/container/ContainerCreate.vue:343
#: src/views/container/ContainerCreate.vue:344
msgid "Restart Policy"
msgstr ""
#: src/views/container/ContainerCreate.vue:346
#: src/views/container/ContainerCreate.vue:349
#: src/views/container/ContainerCreate.vue:347
#: src/views/container/ContainerCreate.vue:350
msgid "Select restart policy"
msgstr ""
#: src/views/container/ContainerCreate.vue:360
#: src/views/container/ContainerCreate.vue:361
#: src/views/container/NetworkView.vue:295
#: src/views/container/VolumeView.vue:195
msgid "Labels"
msgstr ""
#: src/views/container/ContainerCreate.vue:364
#: src/views/container/ContainerCreate.vue:365
#: src/views/container/NetworkView.vue:299
#: src/views/container/VolumeView.vue:199
msgid "Label Name"
msgstr ""
#: src/views/container/ContainerCreate.vue:365
#: src/views/container/ContainerCreate.vue:366
#: src/views/container/NetworkView.vue:300
#: src/views/container/VolumeView.vue:200
msgid "Label Value"
@@ -3423,7 +3422,7 @@ msgstr ""
#: src/views/firewall/CreateForwardModal.vue:58
#: src/views/firewall/CreateIpModal.vue:97
#: src/views/firewall/CreateModal.vue:101
#: src/views/firewall/CreateModal.vue:99
#: src/views/firewall/ForwardView.vue:15
#: src/views/firewall/IpRuleView.vue:15
#: src/views/firewall/RuleView.vue:15
@@ -3480,18 +3479,19 @@ msgid "Outbound"
msgstr ""
#: src/views/firewall/CreateIpModal.vue:78
#: src/views/firewall/CreateModal.vue:80
msgid "%{ address } created successfully"
msgstr ""
#: src/views/firewall/CreateIpModal.vue:89
#: src/views/firewall/CreateModal.vue:93
#: src/views/firewall/CreateModal.vue:91
#: src/views/firewall/IpRuleView.vue:208
#: src/views/firewall/RuleView.vue:245
msgid "Create Rule"
msgstr ""
#: src/views/firewall/CreateIpModal.vue:100
#: src/views/firewall/CreateModal.vue:104
#: src/views/firewall/CreateModal.vue:102
#: src/views/firewall/IpRuleView.vue:32
#: src/views/firewall/RuleView.vue:32
msgid "Network Protocol"
@@ -3501,34 +3501,34 @@ msgstr ""
msgid "IP Address"
msgstr ""
#: src/views/firewall/CreateIpModal.vue:108
#: src/views/firewall/CreateModal.vue:133
msgid "Optional IP or IP range: 127.0.0.1 or 172.16.0.0/24 (multiple separated by commas)"
#: src/views/firewall/CreateIpModal.vue:107
#: src/views/firewall/CreateModal.vue:131
msgid "IP or IP range: 172.16.0.1 or 172.16.0.0/16"
msgstr ""
#: src/views/firewall/CreateIpModal.vue:114
#: src/views/firewall/CreateModal.vue:139
#: src/views/firewall/CreateIpModal.vue:110
#: src/views/firewall/CreateModal.vue:134
#: src/views/firewall/IpRuleView.vue:49
#: src/views/firewall/RuleView.vue:83
msgid "Strategy"
msgstr ""
#: src/views/firewall/CreateIpModal.vue:117
#: src/views/firewall/CreateModal.vue:142
#: src/views/firewall/CreateIpModal.vue:113
#: src/views/firewall/CreateModal.vue:137
#: src/views/firewall/IpRuleView.vue:85
#: src/views/firewall/RuleView.vue:119
msgid "Direction"
msgstr ""
#: src/views/firewall/CreateModal.vue:109
#: src/views/firewall/CreateModal.vue:107
msgid "Start Port"
msgstr ""
#: src/views/firewall/CreateModal.vue:119
#: src/views/firewall/CreateModal.vue:117
msgid "End Port"
msgstr ""
#: src/views/firewall/CreateModal.vue:129
#: src/views/firewall/CreateModal.vue:127
#: src/views/firewall/IpRuleView.vue:110
#: src/views/firewall/RuleView.vue:144
msgid "Target"
+91 -90
View File
@@ -10,7 +10,7 @@ msgstr ""
"Project-Id-Version: ratpanel\n"
"Language-Team: Chinese Simplified\n"
"Language: zh_CN\n"
"PO-Revision-Date: 2025-05-31 11:30\n"
"PO-Revision-Date: 2025-06-08 07:54\n"
#: src/components/common/AppFooter.vue:13
#: src/views/dashboard/IndexView.vue:439
@@ -151,7 +151,7 @@ msgstr "无效的名称"
#: src/views/cert/CreateCertModal.vue:50
#: src/views/cert/CreateDnsModal.vue:35
#: src/views/cert/UploadCertModal.vue:21
#: src/views/container/ComposeView.vue:246
#: src/views/container/ComposeView.vue:254
#: src/views/container/ContainerCreate.vue:106
#: src/views/container/NetworkView.vue:174
#: src/views/container/VolumeView.vue:128
@@ -159,7 +159,6 @@ msgstr "无效的名称"
#: src/views/database/CreateUserModal.vue:28
#: src/views/file/ToolBar.vue:45
#: src/views/firewall/CreateForwardModal.vue:41
#: src/views/firewall/CreateModal.vue:84
#: src/views/setting/CreateModal.vue:19
#: src/views/setting/TokenModal.vue:127
#: src/views/ssh/CreateModal.vue:38
@@ -191,7 +190,7 @@ msgid "Root Directory"
msgstr "根目录"
#: src/components/common/PathSelector.vue:335
#: src/views/app/VersionModal.vue:96
#: src/views/app/VersionModal.vue:97
#: src/views/apps/fail2ban/IndexView.vue:375
#: src/views/apps/pureftpd/IndexView.vue:249
#: src/views/apps/pureftpd/IndexView.vue:271
@@ -209,9 +208,9 @@ msgstr "根目录"
#: src/views/cert/DnsView.vue:373
#: src/views/cert/ObtainModal.vue:130
#: src/views/cert/UploadCertModal.vue:55
#: src/views/container/ComposeView.vue:340
#: src/views/container/ComposeView.vue:370
#: src/views/container/ContainerCreate.vue:370
#: src/views/container/ComposeView.vue:348
#: src/views/container/ComposeView.vue:378
#: src/views/container/ContainerCreate.vue:371
#: src/views/container/ContainerView.vue:485
#: src/views/container/ImageView.vue:217
#: src/views/container/NetworkView.vue:313
@@ -224,8 +223,8 @@ msgstr "根目录"
#: src/views/file/ToolBar.vue:261
#: src/views/file/ToolBar.vue:282
#: src/views/firewall/CreateForwardModal.vue:88
#: src/views/firewall/CreateIpModal.vue:122
#: src/views/firewall/CreateModal.vue:147
#: src/views/firewall/CreateIpModal.vue:118
#: src/views/firewall/CreateModal.vue:142
#: src/views/setting/CreateModal.vue:64
#: src/views/setting/PasswordModal.vue:44
#: src/views/setting/TwoFaModal.vue:87
@@ -288,6 +287,7 @@ msgid "Started successfully"
msgstr "启动成功"
#: src/components/common/ServiceStatus.vue:57
#: src/views/container/ComposeView.vue:168
msgid "Stopping..."
msgstr "停止中..."
@@ -364,7 +364,7 @@ msgstr "启动"
#: src/components/common/ServiceStatus.vue:158
#: src/views/apps/supervisor/IndexView.vue:145
#: src/views/container/ComposeView.vue:189
#: src/views/container/ComposeView.vue:197
#: src/views/container/ContainerView.vue:135
#: src/views/container/ContainerView.vue:413
msgid "Stop"
@@ -510,7 +510,7 @@ msgstr "备份"
#: src/locales/menu.ts:9
#: src/views/cert/CertView.vue:497
#: src/views/cert/CertView.vue:573
#: src/views/cert/CertView.vue:574
#: src/views/cert/UploadCertModal.vue:38
#: src/views/setting/SettingSafe.vue:54
#: src/views/website/EditView.vue:355
@@ -656,8 +656,8 @@ msgstr "在主页显示"
#: src/views/cert/CertView.vue:181
#: src/views/cert/DnsView.vue:64
#: src/views/container/ComposeView.vue:74
#: src/views/container/ContainerCreate.vue:174
#: src/views/container/ContainerCreate.vue:255
#: src/views/container/ContainerCreate.vue:175
#: src/views/container/ContainerCreate.vue:256
#: src/views/container/ContainerView.vue:91
#: src/views/container/ImageView.vue:69
#: src/views/container/NetworkView.vue:109
@@ -717,15 +717,15 @@ msgstr "更新缓存"
msgid "Before updating apps, it is strongly recommended to backup/snapshot first, so you can roll back immediately if there are any issues!"
msgstr "在更新应用前,强烈建议先进行备份/快照,这样如果出现任何问题,可以第一时间回滚!"
#: src/views/app/VersionModal.vue:73
#: src/views/app/VersionModal.vue:74
msgid "Channel"
msgstr "渠道"
#: src/views/app/VersionModal.vue:80
#: src/views/app/VersionModal.vue:81
msgid "Version"
msgstr "版本"
#: src/views/app/VersionModal.vue:83
#: src/views/app/VersionModal.vue:84
msgid "Please select a channel"
msgstr "请选择一个渠道"
@@ -847,9 +847,9 @@ msgstr "您确定要删除规则 %{ name } 吗?"
#: src/views/cert/AccountView.vue:127
#: src/views/cert/CertView.vue:314
#: src/views/cert/DnsView.vue:111
#: src/views/container/ComposeView.vue:220
#: src/views/container/ContainerCreate.vue:235
#: src/views/container/ContainerCreate.vue:286
#: src/views/container/ComposeView.vue:228
#: src/views/container/ContainerCreate.vue:236
#: src/views/container/ContainerCreate.vue:287
#: src/views/container/ContainerView.vue:160
#: src/views/container/ContainerView.vue:418
#: src/views/container/ImageView.vue:94
@@ -1052,9 +1052,9 @@ msgid "Load Status"
msgstr "负载状态"
#: src/views/apps/minio/IndexView.vue:39
#: src/views/container/ComposeView.vue:330
#: src/views/container/ComposeView.vue:360
#: src/views/container/ContainerCreate.vue:352
#: src/views/container/ComposeView.vue:338
#: src/views/container/ComposeView.vue:368
#: src/views/container/ContainerCreate.vue:353
msgid "Environment Variables"
msgstr "环境变量"
@@ -1675,7 +1675,7 @@ msgstr "正在向 CA 注册账户,请耐心等待"
#: src/views/cert/CertView.vue:348
#: src/views/cert/CertView.vue:365
#: src/views/cert/DnsView.vue:139
#: src/views/container/ComposeView.vue:264
#: src/views/container/ComposeView.vue:272
msgid "Update successful"
msgstr "更新成功"
@@ -1851,7 +1851,7 @@ msgid "Enter the content of the PEM certificate file"
msgstr "输入 PEM 证书文件的内容"
#: src/views/cert/CertView.vue:509
#: src/views/cert/CertView.vue:585
#: src/views/cert/CertView.vue:586
#: src/views/cert/UploadCertModal.vue:46
#: src/views/setting/SettingSafe.vue:61
#: src/views/ssh/CreateModal.vue:78
@@ -2150,17 +2150,17 @@ msgstr "您确定要启动编排 %{ name } 吗?"
msgid "Force pull images"
msgstr "强制拉取镜像"
#: src/views/container/ComposeView.vue:170
#: src/views/container/ComposeView.vue:175
#: src/views/container/ContainerView.vue:248
#: src/views/container/ContainerView.vue:319
msgid "Stop successful"
msgstr "停止成功"
#: src/views/container/ComposeView.vue:176
#: src/views/container/ComposeView.vue:184
msgid "Are you sure you want to stop compose %{ name }?"
msgstr "您确定要停止编排 %{ name } 吗?"
#: src/views/container/ComposeView.vue:201
#: src/views/container/ComposeView.vue:209
#: src/views/container/ContainerView.vue:283
#: src/views/container/ContainerView.vue:361
#: src/views/container/ImageView.vue:118
@@ -2169,38 +2169,38 @@ msgstr "您确定要停止编排 %{ name } 吗?"
msgid "Delete successful"
msgstr "删除成功"
#: src/views/container/ComposeView.vue:207
#: src/views/container/ComposeView.vue:215
msgid "Are you sure you want to delete compose %{ name }?"
msgstr "您确定要删除编排 %{ name } 吗?"
#: src/views/container/ComposeView.vue:286
#: src/views/container/ComposeView.vue:313
#: src/views/container/ComposeView.vue:294
#: src/views/container/ComposeView.vue:321
msgid "Create Compose"
msgstr "创建编排"
#: src/views/container/ComposeView.vue:320
#: src/views/container/ComposeView.vue:328
msgid "Compose Name"
msgstr "编排名称"
#: src/views/container/ComposeView.vue:323
#: src/views/container/ComposeView.vue:353
#: src/views/container/ComposeView.vue:331
#: src/views/container/ComposeView.vue:361
#: src/views/container/IndexView.vue:24
msgid "Compose"
msgstr "编排"
#: src/views/container/ComposeView.vue:334
#: src/views/container/ComposeView.vue:364
#: src/views/container/ContainerCreate.vue:356
#: src/views/container/ComposeView.vue:342
#: src/views/container/ComposeView.vue:372
#: src/views/container/ContainerCreate.vue:357
msgid "Variable Name"
msgstr "变量名"
#: src/views/container/ComposeView.vue:335
#: src/views/container/ComposeView.vue:365
#: src/views/container/ContainerCreate.vue:357
#: src/views/container/ComposeView.vue:343
#: src/views/container/ComposeView.vue:373
#: src/views/container/ContainerCreate.vue:358
msgid "Variable Value"
msgstr "变量值"
#: src/views/container/ComposeView.vue:346
#: src/views/container/ComposeView.vue:354
msgid "Edit Compose"
msgstr "编辑编排"
@@ -2221,82 +2221,82 @@ msgstr "除非停止"
msgid "Create Container"
msgstr "创建容器"
#: src/views/container/ContainerCreate.vue:137
#: src/views/container/ContainerCreate.vue:138
#: src/views/container/ContainerView.vue:25
msgid "Container Name"
msgstr "容器名称"
#: src/views/container/ContainerCreate.vue:140
#: src/views/container/ContainerCreate.vue:141
#: src/views/container/ContainerView.vue:52
#: src/views/container/ImageView.vue:36
msgid "Image"
msgstr "镜像"
#: src/views/container/ContainerCreate.vue:143
#: src/views/container/ContainerCreate.vue:144
msgid "Ports"
msgstr "端口"
#: src/views/container/ContainerCreate.vue:149
#: src/views/container/ContainerCreate.vue:150
msgid "Map Ports"
msgstr "映射端口"
#: src/views/container/ContainerCreate.vue:156
#: src/views/container/ContainerCreate.vue:157
msgid "Expose All"
msgstr "全部暴露"
#: src/views/container/ContainerCreate.vue:161
#: src/views/container/ContainerCreate.vue:162
msgid "Port Mapping"
msgstr "端口映射"
#: src/views/container/ContainerCreate.vue:169
#: src/views/container/ContainerCreate.vue:170
msgid "Host (Start)"
msgstr "主机(起始)"
#: src/views/container/ContainerCreate.vue:170
#: src/views/container/ContainerCreate.vue:171
msgid "Host (End)"
msgstr "主机(结束)"
#: src/views/container/ContainerCreate.vue:171
#: src/views/container/ContainerCreate.vue:172
msgid "Container (Start)"
msgstr "容器(起始)"
#: src/views/container/ContainerCreate.vue:172
#: src/views/container/ContainerCreate.vue:173
msgid "Container (End)"
msgstr "容器(结束)"
#: src/views/container/ContainerCreate.vue:173
#: src/views/container/ContainerCreate.vue:174
msgid "Protocol"
msgstr "协议"
#: src/views/container/ContainerCreate.vue:184
#: src/views/container/ContainerCreate.vue:185
msgid "Optional"
msgstr "可选"
#: src/views/container/ContainerCreate.vue:241
#: src/views/container/ContainerCreate.vue:292
#: src/views/container/ContainerCreate.vue:242
#: src/views/container/ContainerCreate.vue:293
msgid "Add"
msgstr "添加"
#: src/views/container/ContainerCreate.vue:244
#: src/views/container/ContainerCreate.vue:245
#: src/views/dashboard/IndexView.vue:141
#: src/views/dashboard/IndexView.vue:797
#: src/views/monitor/IndexView.vue:286
msgid "Network"
msgstr "网络"
#: src/views/container/ContainerCreate.vue:247
#: src/views/container/ContainerCreate.vue:248
msgid "Mount"
msgstr "挂载"
#: src/views/container/ContainerCreate.vue:252
#: src/views/container/ContainerCreate.vue:253
msgid "Host Directory"
msgstr "主机目录"
#: src/views/container/ContainerCreate.vue:253
#: src/views/container/ContainerCreate.vue:254
msgid "Container Directory"
msgstr "容器目录"
#: src/views/container/ContainerCreate.vue:254
#: src/views/container/ContainerCreate.vue:255
#: src/views/file/ListTable.vue:73
#: src/views/file/ListTable.vue:145
#: src/views/file/ListTable.vue:300
@@ -2305,25 +2305,25 @@ msgstr "容器目录"
msgid "Permission"
msgstr "权限"
#: src/views/container/ContainerCreate.vue:273
#: src/views/container/ContainerCreate.vue:274
msgid "Read-Write"
msgstr "读写"
#: src/views/container/ContainerCreate.vue:281
#: src/views/container/ContainerCreate.vue:282
msgid "Read-Only"
msgstr "只读"
#: src/views/container/ContainerCreate.vue:295
#: src/views/container/ContainerCreate.vue:296
#: src/views/container/ContainerCreate.vue:297
msgid "Command"
msgstr "命令"
#: src/views/container/ContainerCreate.vue:298
#: src/views/container/ContainerCreate.vue:301
#: src/views/container/ContainerCreate.vue:299
#: src/views/container/ContainerCreate.vue:302
msgid "Entrypoint"
msgstr "入口点"
#: src/views/container/ContainerCreate.vue:306
#: src/views/container/ContainerCreate.vue:307
#: src/views/dashboard/IndexView.vue:533
#: src/views/monitor/IndexView.vue:205
#: src/views/monitor/IndexView.vue:216
@@ -2333,48 +2333,48 @@ msgstr "入口点"
msgid "Memory"
msgstr "内存"
#: src/views/container/ContainerCreate.vue:316
#: src/views/container/ContainerCreate.vue:317
msgid "CPU Shares"
msgstr "CPU 份额"
#: src/views/container/ContainerCreate.vue:323
#: src/views/container/ContainerCreate.vue:324
msgid "TTY (-t)"
msgstr "TTY (-t)"
#: src/views/container/ContainerCreate.vue:328
#: src/views/container/ContainerCreate.vue:329
msgid "STDIN (-i)"
msgstr "STDIN (-i)"
#: src/views/container/ContainerCreate.vue:333
#: src/views/container/ContainerCreate.vue:334
msgid "Auto Remove"
msgstr "自动移除"
#: src/views/container/ContainerCreate.vue:338
#: src/views/container/ContainerCreate.vue:339
msgid "Privileged Mode"
msgstr "特权模式"
#: src/views/container/ContainerCreate.vue:343
#: src/views/container/ContainerCreate.vue:344
msgid "Restart Policy"
msgstr "重启策略"
#: src/views/container/ContainerCreate.vue:346
#: src/views/container/ContainerCreate.vue:349
#: src/views/container/ContainerCreate.vue:347
#: src/views/container/ContainerCreate.vue:350
msgid "Select restart policy"
msgstr "选择重启策略"
#: src/views/container/ContainerCreate.vue:360
#: src/views/container/ContainerCreate.vue:361
#: src/views/container/NetworkView.vue:295
#: src/views/container/VolumeView.vue:195
msgid "Labels"
msgstr "标签"
#: src/views/container/ContainerCreate.vue:364
#: src/views/container/ContainerCreate.vue:365
#: src/views/container/NetworkView.vue:299
#: src/views/container/VolumeView.vue:199
msgid "Label Name"
msgstr "标签名称"
#: src/views/container/ContainerCreate.vue:365
#: src/views/container/ContainerCreate.vue:366
#: src/views/container/NetworkView.vue:300
#: src/views/container/VolumeView.vue:200
msgid "Label Value"
@@ -3432,7 +3432,7 @@ msgstr "创建转发"
#: src/views/firewall/CreateForwardModal.vue:58
#: src/views/firewall/CreateIpModal.vue:97
#: src/views/firewall/CreateModal.vue:101
#: src/views/firewall/CreateModal.vue:99
#: src/views/firewall/ForwardView.vue:15
#: src/views/firewall/IpRuleView.vue:15
#: src/views/firewall/RuleView.vue:15
@@ -3489,18 +3489,19 @@ msgid "Outbound"
msgstr "出站"
#: src/views/firewall/CreateIpModal.vue:78
#: src/views/firewall/CreateModal.vue:80
msgid "%{ address } created successfully"
msgstr "%{ address } 创建成功"
#: src/views/firewall/CreateIpModal.vue:89
#: src/views/firewall/CreateModal.vue:93
#: src/views/firewall/CreateModal.vue:91
#: src/views/firewall/IpRuleView.vue:208
#: src/views/firewall/RuleView.vue:245
msgid "Create Rule"
msgstr "创建规则"
#: src/views/firewall/CreateIpModal.vue:100
#: src/views/firewall/CreateModal.vue:104
#: src/views/firewall/CreateModal.vue:102
#: src/views/firewall/IpRuleView.vue:32
#: src/views/firewall/RuleView.vue:32
msgid "Network Protocol"
@@ -3510,34 +3511,34 @@ msgstr "网络协议"
msgid "IP Address"
msgstr "IP 地址"
#: src/views/firewall/CreateIpModal.vue:108
#: src/views/firewall/CreateModal.vue:133
msgid "Optional IP or IP range: 127.0.0.1 or 172.16.0.0/24 (multiple separated by commas)"
msgstr "可选 IP 或 IP 范围:127.0.0.1 或 172.16.0.0/24(多个用逗号分隔)"
#: src/views/firewall/CreateIpModal.vue:107
#: src/views/firewall/CreateModal.vue:131
msgid "IP or IP range: 172.16.0.1 or 172.16.0.0/16"
msgstr "IP 或 IP 范围:172.16.0.1 或 172.16.0.0/16"
#: src/views/firewall/CreateIpModal.vue:114
#: src/views/firewall/CreateModal.vue:139
#: src/views/firewall/CreateIpModal.vue:110
#: src/views/firewall/CreateModal.vue:134
#: src/views/firewall/IpRuleView.vue:49
#: src/views/firewall/RuleView.vue:83
msgid "Strategy"
msgstr "策略"
#: src/views/firewall/CreateIpModal.vue:117
#: src/views/firewall/CreateModal.vue:142
#: src/views/firewall/CreateIpModal.vue:113
#: src/views/firewall/CreateModal.vue:137
#: src/views/firewall/IpRuleView.vue:85
#: src/views/firewall/RuleView.vue:119
msgid "Direction"
msgstr "方向"
#: src/views/firewall/CreateModal.vue:109
#: src/views/firewall/CreateModal.vue:107
msgid "Start Port"
msgstr "起始端口"
#: src/views/firewall/CreateModal.vue:119
#: src/views/firewall/CreateModal.vue:117
msgid "End Port"
msgstr "结束端口"
#: src/views/firewall/CreateModal.vue:129
#: src/views/firewall/CreateModal.vue:127
#: src/views/firewall/IpRuleView.vue:110
#: src/views/firewall/RuleView.vue:144
msgid "Target"
+91 -90
View File
@@ -10,7 +10,7 @@ msgstr ""
"Project-Id-Version: ratpanel\n"
"Language-Team: Chinese Traditional\n"
"Language: zh_TW\n"
"PO-Revision-Date: 2025-05-31 11:30\n"
"PO-Revision-Date: 2025-06-08 07:54\n"
#: src/components/common/AppFooter.vue:13
#: src/views/dashboard/IndexView.vue:439
@@ -151,7 +151,7 @@ msgstr "無效的名稱"
#: src/views/cert/CreateCertModal.vue:50
#: src/views/cert/CreateDnsModal.vue:35
#: src/views/cert/UploadCertModal.vue:21
#: src/views/container/ComposeView.vue:246
#: src/views/container/ComposeView.vue:254
#: src/views/container/ContainerCreate.vue:106
#: src/views/container/NetworkView.vue:174
#: src/views/container/VolumeView.vue:128
@@ -159,7 +159,6 @@ msgstr "無效的名稱"
#: src/views/database/CreateUserModal.vue:28
#: src/views/file/ToolBar.vue:45
#: src/views/firewall/CreateForwardModal.vue:41
#: src/views/firewall/CreateModal.vue:84
#: src/views/setting/CreateModal.vue:19
#: src/views/setting/TokenModal.vue:127
#: src/views/ssh/CreateModal.vue:38
@@ -191,7 +190,7 @@ msgid "Root Directory"
msgstr "根目錄"
#: src/components/common/PathSelector.vue:335
#: src/views/app/VersionModal.vue:96
#: src/views/app/VersionModal.vue:97
#: src/views/apps/fail2ban/IndexView.vue:375
#: src/views/apps/pureftpd/IndexView.vue:249
#: src/views/apps/pureftpd/IndexView.vue:271
@@ -209,9 +208,9 @@ msgstr "根目錄"
#: src/views/cert/DnsView.vue:373
#: src/views/cert/ObtainModal.vue:130
#: src/views/cert/UploadCertModal.vue:55
#: src/views/container/ComposeView.vue:340
#: src/views/container/ComposeView.vue:370
#: src/views/container/ContainerCreate.vue:370
#: src/views/container/ComposeView.vue:348
#: src/views/container/ComposeView.vue:378
#: src/views/container/ContainerCreate.vue:371
#: src/views/container/ContainerView.vue:485
#: src/views/container/ImageView.vue:217
#: src/views/container/NetworkView.vue:313
@@ -224,8 +223,8 @@ msgstr "根目錄"
#: src/views/file/ToolBar.vue:261
#: src/views/file/ToolBar.vue:282
#: src/views/firewall/CreateForwardModal.vue:88
#: src/views/firewall/CreateIpModal.vue:122
#: src/views/firewall/CreateModal.vue:147
#: src/views/firewall/CreateIpModal.vue:118
#: src/views/firewall/CreateModal.vue:142
#: src/views/setting/CreateModal.vue:64
#: src/views/setting/PasswordModal.vue:44
#: src/views/setting/TwoFaModal.vue:87
@@ -288,6 +287,7 @@ msgid "Started successfully"
msgstr "啟動成功"
#: src/components/common/ServiceStatus.vue:57
#: src/views/container/ComposeView.vue:168
msgid "Stopping..."
msgstr "停止中..."
@@ -364,7 +364,7 @@ msgstr "開始"
#: src/components/common/ServiceStatus.vue:158
#: src/views/apps/supervisor/IndexView.vue:145
#: src/views/container/ComposeView.vue:189
#: src/views/container/ComposeView.vue:197
#: src/views/container/ContainerView.vue:135
#: src/views/container/ContainerView.vue:413
msgid "Stop"
@@ -510,7 +510,7 @@ msgstr "備份"
#: src/locales/menu.ts:9
#: src/views/cert/CertView.vue:497
#: src/views/cert/CertView.vue:573
#: src/views/cert/CertView.vue:574
#: src/views/cert/UploadCertModal.vue:38
#: src/views/setting/SettingSafe.vue:54
#: src/views/website/EditView.vue:355
@@ -656,8 +656,8 @@ msgstr "在主頁顯示"
#: src/views/cert/CertView.vue:181
#: src/views/cert/DnsView.vue:64
#: src/views/container/ComposeView.vue:74
#: src/views/container/ContainerCreate.vue:174
#: src/views/container/ContainerCreate.vue:255
#: src/views/container/ContainerCreate.vue:175
#: src/views/container/ContainerCreate.vue:256
#: src/views/container/ContainerView.vue:91
#: src/views/container/ImageView.vue:69
#: src/views/container/NetworkView.vue:109
@@ -717,15 +717,15 @@ msgstr "更新快取"
msgid "Before updating apps, it is strongly recommended to backup/snapshot first, so you can roll back immediately if there are any issues!"
msgstr "在更新應用程式之前,強烈建議先進行備份/快照,這樣如果出現任何問題,可以立即回滾!"
#: src/views/app/VersionModal.vue:73
#: src/views/app/VersionModal.vue:74
msgid "Channel"
msgstr "渠道"
#: src/views/app/VersionModal.vue:80
#: src/views/app/VersionModal.vue:81
msgid "Version"
msgstr "版本"
#: src/views/app/VersionModal.vue:83
#: src/views/app/VersionModal.vue:84
msgid "Please select a channel"
msgstr "請選擇一個渠道"
@@ -847,9 +847,9 @@ msgstr "您確定要刪除規則 %{ name } 嗎?"
#: src/views/cert/AccountView.vue:127
#: src/views/cert/CertView.vue:314
#: src/views/cert/DnsView.vue:111
#: src/views/container/ComposeView.vue:220
#: src/views/container/ContainerCreate.vue:235
#: src/views/container/ContainerCreate.vue:286
#: src/views/container/ComposeView.vue:228
#: src/views/container/ContainerCreate.vue:236
#: src/views/container/ContainerCreate.vue:287
#: src/views/container/ContainerView.vue:160
#: src/views/container/ContainerView.vue:418
#: src/views/container/ImageView.vue:94
@@ -1052,9 +1052,9 @@ msgid "Load Status"
msgstr "負載狀態"
#: src/views/apps/minio/IndexView.vue:39
#: src/views/container/ComposeView.vue:330
#: src/views/container/ComposeView.vue:360
#: src/views/container/ContainerCreate.vue:352
#: src/views/container/ComposeView.vue:338
#: src/views/container/ComposeView.vue:368
#: src/views/container/ContainerCreate.vue:353
msgid "Environment Variables"
msgstr "環境變數"
@@ -1675,7 +1675,7 @@ msgstr "正在向 CA 註冊賬戶,請耐心等待"
#: src/views/cert/CertView.vue:348
#: src/views/cert/CertView.vue:365
#: src/views/cert/DnsView.vue:139
#: src/views/container/ComposeView.vue:264
#: src/views/container/ComposeView.vue:272
msgid "Update successful"
msgstr "更新成功"
@@ -1851,7 +1851,7 @@ msgid "Enter the content of the PEM certificate file"
msgstr "輸入 PEM 證書文件的內容"
#: src/views/cert/CertView.vue:509
#: src/views/cert/CertView.vue:585
#: src/views/cert/CertView.vue:586
#: src/views/cert/UploadCertModal.vue:46
#: src/views/setting/SettingSafe.vue:61
#: src/views/ssh/CreateModal.vue:78
@@ -2150,17 +2150,17 @@ msgstr "您確定要啟動編排 %{ name } 嗎?"
msgid "Force pull images"
msgstr "強制拉取鏡像"
#: src/views/container/ComposeView.vue:170
#: src/views/container/ComposeView.vue:175
#: src/views/container/ContainerView.vue:248
#: src/views/container/ContainerView.vue:319
msgid "Stop successful"
msgstr "停止成功"
#: src/views/container/ComposeView.vue:176
#: src/views/container/ComposeView.vue:184
msgid "Are you sure you want to stop compose %{ name }?"
msgstr "您確定要停止編排 %{ name } 嗎?"
#: src/views/container/ComposeView.vue:201
#: src/views/container/ComposeView.vue:209
#: src/views/container/ContainerView.vue:283
#: src/views/container/ContainerView.vue:361
#: src/views/container/ImageView.vue:118
@@ -2169,38 +2169,38 @@ msgstr "您確定要停止編排 %{ name } 嗎?"
msgid "Delete successful"
msgstr "刪除成功"
#: src/views/container/ComposeView.vue:207
#: src/views/container/ComposeView.vue:215
msgid "Are you sure you want to delete compose %{ name }?"
msgstr "您確定要刪除編排 %{ name } 嗎?"
#: src/views/container/ComposeView.vue:286
#: src/views/container/ComposeView.vue:313
#: src/views/container/ComposeView.vue:294
#: src/views/container/ComposeView.vue:321
msgid "Create Compose"
msgstr "創建編排"
#: src/views/container/ComposeView.vue:320
#: src/views/container/ComposeView.vue:328
msgid "Compose Name"
msgstr "編排名稱"
#: src/views/container/ComposeView.vue:323
#: src/views/container/ComposeView.vue:353
#: src/views/container/ComposeView.vue:331
#: src/views/container/ComposeView.vue:361
#: src/views/container/IndexView.vue:24
msgid "Compose"
msgstr "編排"
#: src/views/container/ComposeView.vue:334
#: src/views/container/ComposeView.vue:364
#: src/views/container/ContainerCreate.vue:356
#: src/views/container/ComposeView.vue:342
#: src/views/container/ComposeView.vue:372
#: src/views/container/ContainerCreate.vue:357
msgid "Variable Name"
msgstr "變數名稱"
#: src/views/container/ComposeView.vue:335
#: src/views/container/ComposeView.vue:365
#: src/views/container/ContainerCreate.vue:357
#: src/views/container/ComposeView.vue:343
#: src/views/container/ComposeView.vue:373
#: src/views/container/ContainerCreate.vue:358
msgid "Variable Value"
msgstr "變數值"
#: src/views/container/ComposeView.vue:346
#: src/views/container/ComposeView.vue:354
msgid "Edit Compose"
msgstr "編輯編排"
@@ -2221,82 +2221,82 @@ msgstr "除非停止"
msgid "Create Container"
msgstr "創建容器"
#: src/views/container/ContainerCreate.vue:137
#: src/views/container/ContainerCreate.vue:138
#: src/views/container/ContainerView.vue:25
msgid "Container Name"
msgstr "容器名稱"
#: src/views/container/ContainerCreate.vue:140
#: src/views/container/ContainerCreate.vue:141
#: src/views/container/ContainerView.vue:52
#: src/views/container/ImageView.vue:36
msgid "Image"
msgstr "鏡像"
#: src/views/container/ContainerCreate.vue:143
#: src/views/container/ContainerCreate.vue:144
msgid "Ports"
msgstr "端口"
#: src/views/container/ContainerCreate.vue:149
#: src/views/container/ContainerCreate.vue:150
msgid "Map Ports"
msgstr "映射端口"
#: src/views/container/ContainerCreate.vue:156
#: src/views/container/ContainerCreate.vue:157
msgid "Expose All"
msgstr "全部暴露"
#: src/views/container/ContainerCreate.vue:161
#: src/views/container/ContainerCreate.vue:162
msgid "Port Mapping"
msgstr "端口映射"
#: src/views/container/ContainerCreate.vue:169
#: src/views/container/ContainerCreate.vue:170
msgid "Host (Start)"
msgstr "主機(起始)"
#: src/views/container/ContainerCreate.vue:170
#: src/views/container/ContainerCreate.vue:171
msgid "Host (End)"
msgstr "主機(結束)"
#: src/views/container/ContainerCreate.vue:171
#: src/views/container/ContainerCreate.vue:172
msgid "Container (Start)"
msgstr "容器(起始)"
#: src/views/container/ContainerCreate.vue:172
#: src/views/container/ContainerCreate.vue:173
msgid "Container (End)"
msgstr "容器(結束)"
#: src/views/container/ContainerCreate.vue:173
#: src/views/container/ContainerCreate.vue:174
msgid "Protocol"
msgstr "協議"
#: src/views/container/ContainerCreate.vue:184
#: src/views/container/ContainerCreate.vue:185
msgid "Optional"
msgstr "可選"
#: src/views/container/ContainerCreate.vue:241
#: src/views/container/ContainerCreate.vue:292
#: src/views/container/ContainerCreate.vue:242
#: src/views/container/ContainerCreate.vue:293
msgid "Add"
msgstr "添加"
#: src/views/container/ContainerCreate.vue:244
#: src/views/container/ContainerCreate.vue:245
#: src/views/dashboard/IndexView.vue:141
#: src/views/dashboard/IndexView.vue:797
#: src/views/monitor/IndexView.vue:286
msgid "Network"
msgstr "網絡"
#: src/views/container/ContainerCreate.vue:247
#: src/views/container/ContainerCreate.vue:248
msgid "Mount"
msgstr "掛載"
#: src/views/container/ContainerCreate.vue:252
#: src/views/container/ContainerCreate.vue:253
msgid "Host Directory"
msgstr "主機目錄"
#: src/views/container/ContainerCreate.vue:253
#: src/views/container/ContainerCreate.vue:254
msgid "Container Directory"
msgstr "容器目錄"
#: src/views/container/ContainerCreate.vue:254
#: src/views/container/ContainerCreate.vue:255
#: src/views/file/ListTable.vue:73
#: src/views/file/ListTable.vue:145
#: src/views/file/ListTable.vue:300
@@ -2305,25 +2305,25 @@ msgstr "容器目錄"
msgid "Permission"
msgstr "權限"
#: src/views/container/ContainerCreate.vue:273
#: src/views/container/ContainerCreate.vue:274
msgid "Read-Write"
msgstr "讀寫"
#: src/views/container/ContainerCreate.vue:281
#: src/views/container/ContainerCreate.vue:282
msgid "Read-Only"
msgstr "唯讀"
#: src/views/container/ContainerCreate.vue:295
#: src/views/container/ContainerCreate.vue:296
#: src/views/container/ContainerCreate.vue:297
msgid "Command"
msgstr "命令"
#: src/views/container/ContainerCreate.vue:298
#: src/views/container/ContainerCreate.vue:301
#: src/views/container/ContainerCreate.vue:299
#: src/views/container/ContainerCreate.vue:302
msgid "Entrypoint"
msgstr "進入點"
#: src/views/container/ContainerCreate.vue:306
#: src/views/container/ContainerCreate.vue:307
#: src/views/dashboard/IndexView.vue:533
#: src/views/monitor/IndexView.vue:205
#: src/views/monitor/IndexView.vue:216
@@ -2333,48 +2333,48 @@ msgstr "進入點"
msgid "Memory"
msgstr "記憶體"
#: src/views/container/ContainerCreate.vue:316
#: src/views/container/ContainerCreate.vue:317
msgid "CPU Shares"
msgstr "CPU 份額"
#: src/views/container/ContainerCreate.vue:323
#: src/views/container/ContainerCreate.vue:324
msgid "TTY (-t)"
msgstr "TTY (-t)"
#: src/views/container/ContainerCreate.vue:328
#: src/views/container/ContainerCreate.vue:329
msgid "STDIN (-i)"
msgstr "STDIN (-i)"
#: src/views/container/ContainerCreate.vue:333
#: src/views/container/ContainerCreate.vue:334
msgid "Auto Remove"
msgstr "自動移除"
#: src/views/container/ContainerCreate.vue:338
#: src/views/container/ContainerCreate.vue:339
msgid "Privileged Mode"
msgstr "特權模式"
#: src/views/container/ContainerCreate.vue:343
#: src/views/container/ContainerCreate.vue:344
msgid "Restart Policy"
msgstr "重啟策略"
#: src/views/container/ContainerCreate.vue:346
#: src/views/container/ContainerCreate.vue:349
#: src/views/container/ContainerCreate.vue:347
#: src/views/container/ContainerCreate.vue:350
msgid "Select restart policy"
msgstr "選擇重啟策略"
#: src/views/container/ContainerCreate.vue:360
#: src/views/container/ContainerCreate.vue:361
#: src/views/container/NetworkView.vue:295
#: src/views/container/VolumeView.vue:195
msgid "Labels"
msgstr "標籤"
#: src/views/container/ContainerCreate.vue:364
#: src/views/container/ContainerCreate.vue:365
#: src/views/container/NetworkView.vue:299
#: src/views/container/VolumeView.vue:199
msgid "Label Name"
msgstr "標籤名稱"
#: src/views/container/ContainerCreate.vue:365
#: src/views/container/ContainerCreate.vue:366
#: src/views/container/NetworkView.vue:300
#: src/views/container/VolumeView.vue:200
msgid "Label Value"
@@ -3432,7 +3432,7 @@ msgstr "創建轉發"
#: src/views/firewall/CreateForwardModal.vue:58
#: src/views/firewall/CreateIpModal.vue:97
#: src/views/firewall/CreateModal.vue:101
#: src/views/firewall/CreateModal.vue:99
#: src/views/firewall/ForwardView.vue:15
#: src/views/firewall/IpRuleView.vue:15
#: src/views/firewall/RuleView.vue:15
@@ -3489,18 +3489,19 @@ msgid "Outbound"
msgstr "出站"
#: src/views/firewall/CreateIpModal.vue:78
#: src/views/firewall/CreateModal.vue:80
msgid "%{ address } created successfully"
msgstr "%{ address } 創建成功"
#: src/views/firewall/CreateIpModal.vue:89
#: src/views/firewall/CreateModal.vue:93
#: src/views/firewall/CreateModal.vue:91
#: src/views/firewall/IpRuleView.vue:208
#: src/views/firewall/RuleView.vue:245
msgid "Create Rule"
msgstr "創建規則"
#: src/views/firewall/CreateIpModal.vue:100
#: src/views/firewall/CreateModal.vue:104
#: src/views/firewall/CreateModal.vue:102
#: src/views/firewall/IpRuleView.vue:32
#: src/views/firewall/RuleView.vue:32
msgid "Network Protocol"
@@ -3510,34 +3511,34 @@ msgstr "網路協議"
msgid "IP Address"
msgstr "IP 地址"
#: src/views/firewall/CreateIpModal.vue:108
#: src/views/firewall/CreateModal.vue:133
msgid "Optional IP or IP range: 127.0.0.1 or 172.16.0.0/24 (multiple separated by commas)"
msgstr "可選 IP 或 IP 範圍:127.0.0.1 或 172.16.0.0/24(多個用逗號分隔)"
#: src/views/firewall/CreateIpModal.vue:107
#: src/views/firewall/CreateModal.vue:131
msgid "IP or IP range: 172.16.0.1 or 172.16.0.0/16"
msgstr "IP 或 IP 範圍:172.16.0.1 或 172.16.0.0/16"
#: src/views/firewall/CreateIpModal.vue:114
#: src/views/firewall/CreateModal.vue:139
#: src/views/firewall/CreateIpModal.vue:110
#: src/views/firewall/CreateModal.vue:134
#: src/views/firewall/IpRuleView.vue:49
#: src/views/firewall/RuleView.vue:83
msgid "Strategy"
msgstr "策略"
#: src/views/firewall/CreateIpModal.vue:117
#: src/views/firewall/CreateModal.vue:142
#: src/views/firewall/CreateIpModal.vue:113
#: src/views/firewall/CreateModal.vue:137
#: src/views/firewall/IpRuleView.vue:85
#: src/views/firewall/RuleView.vue:119
msgid "Direction"
msgstr "方向"
#: src/views/firewall/CreateModal.vue:109
#: src/views/firewall/CreateModal.vue:107
msgid "Start Port"
msgstr "起始端口"
#: src/views/firewall/CreateModal.vue:119
#: src/views/firewall/CreateModal.vue:117
msgid "End Port"
msgstr "結束連接埠"
#: src/views/firewall/CreateModal.vue:129
#: src/views/firewall/CreateModal.vue:127
#: src/views/firewall/IpRuleView.vue:110
#: src/views/firewall/RuleView.vue:144
msgid "Target"
+1
View File
@@ -68,6 +68,7 @@ const handleClose = () => {
:bordered="false"
:segmented="false"
@close="handleClose"
@mask-click="handleClose"
>
<n-form :model="model">
<n-form-item path="channel" :label="$gettext('Channel')">
+1
View File
@@ -568,6 +568,7 @@ onUnmounted(() => {
:bordered="false"
:segmented="false"
@close="handleShowModalClose"
@mask-click="handleShowModalClose"
>
<n-tabs type="line" animated>
<n-tab-pane name="cert" :tab="$gettext('Certificate')">
@@ -132,6 +132,7 @@ onMounted(() => {
:bordered="false"
:segmented="false"
@close="handleClose"
@mask-click="handleClose"
>
<n-form :model="createModel">
<n-form-item path="name" :label="$gettext('Container Name')">
+1 -5
View File
@@ -104,11 +104,7 @@ const handleCreate = async () => {
<n-dynamic-input
v-model:value="createModel.address"
show-sort-button
:placeholder="
$gettext(
'Optional IP or IP range: 127.0.0.1 or 172.16.0.0/24 (multiple separated by commas)'
)
"
:placeholder="$gettext('IP or IP range: 172.16.0.1 or 172.16.0.0/16')"
/>
</n-form-item>
<n-form-item path="strategy" :label="$gettext('Strategy')">
+15 -20
View File
@@ -64,25 +64,23 @@ const createModel = ref({
protocol: 'tcp',
port_start: 80,
port_end: 80,
address: '',
address: [],
strategy: 'accept',
direction: 'in'
})
const handleCreate = async () => {
useRequest(firewall.createRule(createModel.value)).onSuccess(() => {
show.value = false
createModel.value = {
family: 'ipv4',
protocol: 'tcp',
port_start: 80,
port_end: 80,
address: '',
strategy: 'accept',
direction: 'in'
}
window.$message.success($gettext('Created successfully'))
})
for (const address of createModel.value.address) {
useRequest(
firewall.createRule({
...createModel.value,
address
})
).onSuccess(() => {
window.$message.success($gettext('%{ address } created successfully', { address: address }))
show.value = false
})
}
}
</script>
@@ -127,13 +125,10 @@ const handleCreate = async () => {
</n-col>
</n-row>
<n-form-item path="address" :label="$gettext('Target')">
<n-input
<n-dynamic-input
v-model:value="createModel.address"
:placeholder="
$gettext(
'Optional IP or IP range: 127.0.0.1 or 172.16.0.0/24 (multiple separated by commas)'
)
"
show-sort-button
:placeholder="$gettext('IP or IP range: 172.16.0.1 or 172.16.0.0/16')"
/>
</n-form-item>
<n-form-item path="strategy" :label="$gettext('Strategy')">