Compare commits

..

293 Commits

Author SHA1 Message Date
耗子 f6c5805ef6 fix: lint 2026-02-12 23:33:06 +08:00
耗子 c2001a477c fix: lint 2026-02-12 22:33:22 +08:00
耗子 8e76c6c3b2 fix: 不迁移443 2026-02-12 22:28:37 +08:00
耗子 4ff67bca0d fix: webserver 2026-02-12 22:08:39 +08:00
耗子 8f3eb90c2b fix: build 2026-02-12 21:51:49 +08:00
耗子 ccf696dc55 feat: 迁移至3.0 2026-02-12 21:48:46 +08:00
耗子 6f23f3f3a9 feat: 迁移至3.0 2026-02-12 21:47:52 +08:00
耗子 5576426f33 fix: 修复防火墙端口放行 2025-08-23 15:35:54 +08:00
耗子 d81ed39459 fix: 优化描述 2025-08-22 23:02:21 +08:00
耗子 f9238b6b59 fix: 修复下载 2025-08-22 23:01:14 +08:00
耗子 34df623e0c feat: 添加更新通知 2025-08-22 21:47:18 +08:00
renovate[bot] c87f52f696 chore(deps): Update non-major dependencies (#945)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-08-21 18:32:03 +08:00
renovate[bot] bc573dca1a chore(deps): Update non-major dependencies (#944)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-08-21 01:10:37 +00:00
renovate[bot] ecd23f4733 chore(deps): Update non-major dependencies (#943)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-08-19 16:41:34 +00:00
renovate[bot] 19ef9f4a14 chore(deps): Update non-major dependencies (#942)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-08-18 14:26:20 +00:00
renovate[bot] aacb01e731 chore(deps): Update dependency marked to v16.2.0 (#941)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-08-18 15:21:30 +08:00
renovate[bot] ec3c508b88 chore(deps): Lock file maintenance (#940)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-08-18 05:49:28 +00:00
renovate[bot] e0cd0e390c chore(deps): Update dependency @iconify/json to v2.2.375 (#939)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-08-17 08:53:08 +00:00
renovate[bot] b690779caa chore(deps): Update dependency @iconify/json to v2.2.374 (#938)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-08-16 13:11:56 +00:00
renovate[bot] 3a1997d1f8 chore(deps): Update non-major dependencies (#936)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-08-15 17:28:24 +00:00
renovate[bot] dd5c201d92 chore(deps): Update module github.com/expr-lang/expr to v1.17.6 (#935)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-08-13 02:04:03 +00:00
renovate[bot] e23847148e chore(deps): Update non-major dependencies (#934)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-08-12 22:58:05 +08:00
renovate[bot] 19ca32f2b4 chore(deps): Update non-major dependencies (#933)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-08-12 11:35:29 +00:00
renovate[bot] 2c018c9faa chore(deps): Update non-major dependencies (#932)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-08-11 20:52:39 +00:00
renovate[bot] d527a5170b chore(deps): Update actions/checkout action to v5 (#931)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-08-12 02:19:58 +08:00
renovate[bot] 2e6c8324f1 chore(deps): Update dependency @iconify/json to v2.2.371 (#930)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-08-11 13:29:55 +00:00
renovate[bot] 2892b4f35b chore(deps): Lock file maintenance (#927)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-08-11 06:05:50 +00:00
renovate[bot] 84c4bb71be chore(deps): Update dependency @iconify/json to v2.2.369 (#926)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-08-10 20:54:32 +00:00
renovate[bot] 0e74344280 chore(deps): Update dependency @iconify/json to v2.2.368 (#925)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-08-10 14:52:06 +00:00
renovate[bot] 8d5d0ac90d chore(deps): Update non-major dependencies (#922)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-08-09 00:23:02 +00:00
renovate[bot] 96454df9a5 chore(deps): Update dependency unplugin-vue-components to v29 (#917)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-08-08 18:55:07 +08:00
renovate[bot] 4674cdd34c chore(deps): Update non-major dependencies to v66.4.2 (#921)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-08-08 18:54:57 +08:00
耗子 1beb2b26b7 ci: 优化工作流权限 2025-08-08 18:48:42 +08:00
耗子 726e937779 fix: Workflow does not contain permissions
Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com>
2025-08-08 18:46:20 +08:00
耗子 c82c68da9d fix: Workflow does not contain permissions
Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com>
2025-08-08 18:45:43 +08:00
耗子 e1274c28f7 fix: Workflow does not contain permissions
Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com>
2025-08-08 18:45:21 +08:00
耗子 afa40be261 fix: Workflow does not contain permissions
Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com>
2025-08-08 18:44:28 +08:00
耗子 ccd73ebd0d Merge remote-tracking branch 'origin/main' 2025-08-08 18:42:38 +08:00
耗子 1917f8e8d4 feat: 优化使用安全随机数生成器 2025-08-08 18:42:30 +08:00
renovate[bot] 072d847190 chore(deps): Update non-major dependencies (#920)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-08-08 04:50:39 +00:00
renovate[bot] 29d32a099d chore(deps): Update non-major dependencies (#918)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-08-07 13:02:01 +00:00
renovate[bot] 0854c3b053 chore(deps): Update actions/download-artifact action to v5 (#915)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-08-06 12:46:34 +08:00
renovate[bot] 9967b469f1 chore(deps): Update dependency sass to v1.90.0 (#914)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-08-06 04:24:31 +00:00
renovate[bot] a0a7656a30 chore(deps): Update dependency unplugin-auto-import to v20 (#913)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-08-05 18:34:29 +08:00
耗子 32a68b9a0b feat: 更新一键脚本 2025-08-04 23:42:37 +08:00
耗子 6926753f93 feat: 更新安装脚本 2025-08-04 23:19:51 +08:00
耗子 b2158eb8da feat: 更新协议 2025-08-04 23:02:35 +08:00
耗子 f29b5357e7 l10n: update translations (#912)
* 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-08-04 18:21:34 +08:00
renovate[bot] 822d550760 chore(deps): Update non-major dependencies (#908)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-08-04 18:19:19 +08:00
devhaozi aa420de64e chore(l10n): update pot files 2025-08-04 10:06:02 +00:00
耗子 e398654bb8 Merge remote-tracking branch 'origin/main' 2025-08-04 18:05:10 +08:00
耗子 2cd9596a58 feat: 移除 Godaddy DNS 2025-08-04 18:05:03 +08:00
devhaozi 138f681260 chore(l10n): update pot files 2025-08-04 09:53:00 +00:00
耗子 61bb7c86ec Merge remote-tracking branch 'origin/main' 2025-08-04 17:52:06 +08:00
耗子 14d4b53369 feat: 更新 libdns 到 v1 2025-08-04 17:51:59 +08:00
devhaozi 3d585df346 chore(l10n): update pot files 2025-08-04 09:12:51 +00:00
耗子 fa9d1feffd Merge remote-tracking branch 'origin/main' 2025-08-04 17:11:55 +08:00
耗子 81f75f0852 feat: 移除 Name.com、Linode 和 Vercel DNS 2025-08-04 17:11:47 +08:00
renovate[bot] f63f8bccaf chore(deps): Lock file maintenance (#909)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-08-04 07:11:42 +00:00
renovate[bot] e35a09c1ef chore(deps): Update dependency vue-tsc to v3.0.5 (#907)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-08-02 03:35:18 +08:00
耗子 4b98079778 refactor: rename go-rat to libtnb 2025-08-02 03:33:20 +08:00
renovate[bot] 4ea4f0c455 chore(deps): Update non-major dependencies (#906)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-08-01 14:48:36 +08:00
renovate[bot] 30e54f59eb chore(deps): Update dependency eslint-plugin-vue to v10.4.0 (#905)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-31 16:59:06 +00:00
renovate[bot] abfa10323c chore(deps): Update dependency @iconify/json to v2.2.364 (#904)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-30 22:33:33 +08:00
耗子 7b66868b80 feat: update ci 2025-07-30 22:23:36 +08:00
renovate[bot] ebe9cf53c8 chore(deps): Update dependency echarts to v6 (#903)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-30 22:02:53 +08:00
renovate[bot] 4ec683ba69 chore(deps): Update non-major dependencies (#902)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-30 04:44:01 +00:00
renovate[bot] 6cc9cdc15c chore(deps): Update non-major dependencies (#900)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-29 02:06:00 +00:00
renovate[bot] 8907adf967 chore(deps): Update dependency @vitejs/plugin-vue to v6.0.1 (#899)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-28 16:45:09 +08:00
renovate[bot] 1fd42eb55f chore(deps): Update dependency vite-plugin-vue-devtools to v8 (#897)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-28 16:44:57 +08:00
renovate[bot] 55979ed385 chore(deps): Lock file maintenance (#898)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-28 06:37:53 +00:00
renovate[bot] eaa79126db chore(deps): Update dependency @iconify/json to v2.2.363 (#896)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-26 13:51:21 +00:00
renovate[bot] 6d4b0628d0 chore(deps): Update dependency eslint to v9.32.0 (#895)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-26 00:52:42 +00:00
renovate[bot] e1af869ee4 chore(deps): Update dependency vue-tsc to v3.0.4 (#892)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-25 04:27:53 +00:00
renovate[bot] 3a73192fac chore(deps): Update non-major dependencies (#891)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-24 16:57:58 +00:00
renovate[bot] fdc1dace8f chore(deps): Update non-major dependencies (#890)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-24 00:44:43 +00:00
renovate[bot] 21167c392f chore(deps): Update dependency vue to v3.5.18 (#889)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-23 14:00:26 +08:00
耗子 5584cc18cb refactor: 重命名项目 2025-07-23 04:50:25 +08:00
renovate[bot] 596c8c8385 chore(deps): Update dependency prettier-plugin-organize-imports to v4.2.0 (#888)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-22 17:33:26 +00:00
renovate[bot] c4704614de chore(deps): Lock file maintenance (#887)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-21 05:56:59 +00:00
renovate[bot] c57d12d53a chore(deps): Update dependency @iconify/json to v2.2.360 (#886)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-20 14:33:13 +00:00
devhaozi 28d0bb4707 chore(l10n): update pot files 2025-07-19 16:44:10 +00:00
耗子 29b8dda4ac feat(#878): 安装时随机默认端口 2025-07-20 00:43:24 +08:00
renovate[bot] b74adcf174 chore(deps): Update dependency @types/node to v22.16.5 (#884)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-19 04:55:11 +00:00
renovate[bot] 268ce78cda chore(deps): Update non-major dependencies (#883)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-18 23:36:05 +00:00
renovate[bot] 831b73f91a chore(deps): Update non-major dependencies (#882)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-18 05:40:14 +00:00
renovate[bot] 31d1bb0ebe chore(deps): Update non-major dependencies (#881)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-17 14:29:21 +00:00
devhaozi 307099db4e chore(l10n): update pot files 2025-07-16 11:16:35 +00:00
耗子 8daeedf2fa feat: ftp不再修改目录权限 2025-07-16 19:15:49 +08:00
renovate[bot] 23570d143b chore(deps): Update non-major dependencies (#879)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-16 04:38:35 +00:00
renovate[bot] 5ee8a36d75 chore(deps): Update non-major dependencies (#877)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-14 22:34:20 +00:00
devhaozi 507e90168d chore(l10n): update pot files 2025-07-14 13:26:45 +00:00
耗子 62780777b7 fix: 防火墙添加规则时,不添加地址无法添加 2025-07-14 21:25:56 +08:00
renovate[bot] 796b48ca8b chore(deps): Lock file maintenance (#876)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-14 04:50:05 +00:00
renovate[bot] 7d80e874f1 chore(deps): Update dependency vite-plugin-static-copy to v3.1.1 (#875)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-13 13:39:14 +00:00
renovate[bot] 93e0ca6a57 chore(deps): Update non-major dependencies (#874)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-12 03:03:21 +00:00
renovate[bot] 73f5a05811 chore(deps): Update non-major dependencies (#873)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-11 03:13:00 +00:00
renovate[bot] db6f362cce chore(deps): Update non-major dependencies (#872)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-10 16:21:17 +08:00
renovate[bot] 4d7018876c chore(deps): Update dependency @types/node to v22.16.2 (#871)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-09 05:27:27 +00:00
renovate[bot] bba7e89e53 chore(deps): Update dependency @types/node to v22.16.1 (#870)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-08 23:52:28 +00:00
renovate[bot] c3eeffc780 chore(deps): Update dependency vite to v7.0.3 (#869)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-08 15:47:28 +00:00
renovate[bot] c547b00a5f chore(deps): Update module github.com/tnb-labs/acmez/v3 to v3.0.0-20250707093727-dc5aedd96413 (#868)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-07 20:07:40 +08:00
耗子 e5f837799f l10n: update translations (#867)
* 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 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
2025-07-07 18:35:01 +08:00
devhaozi 25194d8c50 chore: update mocks 2025-07-07 09:29:34 +00:00
devhaozi e1f6b291bb chore(l10n): update pot files 2025-07-07 09:29:31 +00:00
耗子 df9425b202 Merge remote-tracking branch 'origin/main' 2025-07-07 17:28:46 +08:00
耗子 c50a33f323 feat: 支持修改用户名,close #803 2025-07-07 17:28:40 +08:00
devhaozi b264381b84 chore(l10n): update pot files 2025-07-07 09:19:25 +00:00
耗子 d5ee789a61 Merge remote-tracking branch 'origin/main' 2025-07-07 17:18:40 +08:00
耗子 5fa4219a31 feat: 新增证书到期时间显示,close #836 2025-07-07 17:18:35 +08:00
devhaozi 430640e93c chore(l10n): update pot files 2025-07-07 08:50:36 +00:00
耗子 135c5c844f Merge remote-tracking branch 'origin/main' 2025-07-07 16:49:59 +08:00
耗子 05721dbb47 feat: 优化注销时session处理 2025-07-07 16:49:53 +08:00
renovate[bot] 0235679821 chore(deps): Update dependency @iconify/json to v2.2.356 (#866)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-07 15:59:50 +08:00
devhaozi 11e206b41a chore(l10n): update pot files 2025-07-07 07:19:51 +00:00
耗子 4985eb2e1f feat: remove CleanPath middleware 2025-07-07 15:19:15 +08:00
耗子 2181653ff7 Merge remote-tracking branch 'origin/main' 2025-07-07 15:01:37 +08:00
耗子 26f7edaa24 feat: remove CleanPath middleware 2025-07-07 15:01:31 +08:00
renovate[bot] 75078c88d9 chore(deps): Lock file maintenance (#865)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-07 05:28:46 +00:00
耗子 329aecb444 chore: fix typo 2025-07-07 04:27:53 +08:00
耗子 1559c9f8d3 chore: Update SECURITY.md 2025-07-07 04:26:00 +08:00
renovate[bot] 26add61117 chore(deps): Update dependency vue-tsc to v3.0.1 (#864)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-07 03:59:10 +08:00
renovate[bot] 763c625b83 chore(deps): Update dependency vue-tsc to v3 (#857)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-07 03:44:01 +08:00
renovate[bot] 1375de2caa chore(deps): Update dependency cronstrue to v3 (#856)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-07 03:43:51 +08:00
耗子 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
耗子 7f223812dc ci: 优化l10n工作流 2025-05-31 19:55:39 +08:00
耗子 0e86c77d6d Merge remote-tracking branch 'origin/main' 2025-05-31 19:54:29 +08:00
耗子 fb24407cd1 ci: 优化l10n工作流 2025-05-31 19:54:24 +08:00
devhaozi ec7791b73d chore(l10n): update frontend pot files 2025-05-31 11:51:39 +00:00
耗子 7987cec9b9 feat: 优化编排删除 2025-05-31 19:51:09 +08:00
耗子 7be3e799be l10n: update translations (#789)
* 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 frontend.pot (Chinese Simplified)
Update translations (Chinese Simplified) 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

* 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 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 19:41:34 +08:00
devhaozi 5667bb236f chore(l10n): update backend pot files 2025-05-31 11:25:35 +00:00
devhaozi 5a391a459e chore(l10n): update frontend pot files 2025-05-31 11:22:36 +00:00
耗子 60b0761de2 Merge remote-tracking branch 'origin/main' 2025-05-31 19:22:07 +08:00
耗子 952546f845 fix: 优化编排显示 2025-05-31 19:22:01 +08:00
devhaozi b7c055c43f chore(l10n): update backend pot files 2025-05-31 10:48:42 +00:00
耗子 ba4df0c76f feat: 调试模式下安装应用不检查面板版本 2025-05-31 18:48:06 +08:00
耗子 dfae3f1d8d Merge remote-tracking branch 'origin/main' 2025-05-31 17:35:43 +08:00
耗子 310d83a2aa fix: 面板容器管理界面无法删除卷,close #786 2025-05-31 17:35:37 +08:00
devhaozi 77eb802076 chore(l10n): update frontend pot files 2025-05-31 09:24:21 +00:00
耗子 913a6776dc Merge remote-tracking branch 'origin/main' 2025-05-31 17:23:53 +08:00
耗子 f245ff06c5 fix: 创建数据库用户时如果赋予权限的数据库不存在时显示异常,close #785 2025-05-31 17:23:47 +08:00
devhaozi 79901878e6 chore(l10n): update frontend pot files 2025-05-31 08:37:59 +00:00
耗子 c597e6b99c fix: 创建用户界面里的服务器数据库选择列表重复显示,close #784 2025-05-31 16:37:24 +08:00
devhaozi 3c98e6ff37 chore(l10n): update frontend pot files 2025-05-31 07:43:11 +00:00
耗子 447b0332e3 fix: 容器端口映射显示相反,close #788 2025-05-31 15:42:40 +08:00
renovate[bot] 1459b287fa chore(deps): Update non-major dependencies (#783)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-05-31 04:44:27 +00:00
renovate[bot] 252b67ce36 chore(deps): Update dependency @types/node to v22.15.28 (#782)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-05-31 01:46:07 +08:00
renovate[bot] 8119eca0c6 chore(deps): Update non-major dependencies to v66.1.3 (#781)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-05-31 01:30:04 +08:00
renovate[bot] f0b96417bf chore(deps): Update non-major dependencies (#779)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-05-30 15:06:46 +08:00
renovate[bot] b8018284c6 chore(deps): Update dependency vue to v3.5.16 (#778)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-05-29 05:22:29 +00:00
renovate[bot] 737986f218 chore(deps): Update dependency @types/node to v22.15.24 (#777)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-05-29 04:13:25 +08:00
renovate[bot] 200815bf10 chore(deps): Update non-major dependencies (#775)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-05-28 14:01:11 +08:00
renovate[bot] 8cff4e3575 chore(deps): Update non-major dependencies (#772)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-05-28 03:27:10 +00:00
耗子 64c39bd462 Merge remote-tracking branch 'origin/main' 2025-05-27 00:02:22 +08:00
耗子 4a5e629ab1 feat: 更新文档链接 2025-05-27 00:02:16 +08:00
renovate[bot] 368519f3fa chore(deps): Update dependency vue to v3.5.15 (#771)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-05-26 23:59:12 +08:00
耗子 8fa7f4a22b l10n: update translations (#770)
* 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
2025-05-26 23:37:38 +08:00
耗子 a8e4360c29 feat: 调整排版 2025-05-26 20:19:50 +08:00
耗子 719a9a580d feat: 添加安装脚本到文档 2025-05-26 20:18:44 +08:00
耗子 fb32151b76 feat: 优化排版 2025-05-26 20:15:09 +08:00
耗子 c50d892e52 Merge remote-tracking branch 'origin/main' 2025-05-26 20:11:32 +08:00
耗子 b31ccace85 feat: 更新logo 2025-05-26 20:11:27 +08:00
耗子 e57da7e41a l10n: update translations (#769)
* 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-26 19:59:53 +08:00
耗子 38141c3f4e l10n: update translations (#768)
* 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-05-26 16:29:23 +08:00
renovate[bot] 69d39e6c67 chore(deps): Update non-major dependencies (#767)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-05-26 15:50:46 +08:00
devhaozi 4d8a330644 chore(l10n): update frontend pot files 2025-05-26 07:36:35 +00:00
耗子 26c417f18d ci: fix pnpm 2025-05-26 15:36:05 +08:00
耗子 f6b7fcb4af Merge remote-tracking branch 'origin/main' 2025-05-26 15:32:29 +08:00
耗子 212e989782 feat: 更新包 2025-05-26 15:32:23 +08:00
devhaozi d0ece55dd1 chore(l10n): update backend pot files 2025-05-25 16:35:01 +00:00
耗子 03c0b191fe feat: 支持cidr,close #764 2025-05-26 00:34:24 +08:00
耗子 adacee1851 l10n: update translations (#763)
* 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-05-24 23:48:42 +08:00
devhaozi 2725c4902d chore(l10n): update frontend pot files 2025-05-24 14:44:55 +00:00
耗子 77d7539880 feat: 优化登录翻译 2025-05-24 22:44:24 +08:00
耗子 560b80038e fix: 404时标题为undefined 2025-05-24 22:38:12 +08:00
耗子 c9d4c79bf8 l10n: update translations (#761)
* 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-24 15:29:53 +08:00
devhaozi 905f13f0d3 chore(l10n): update backend pot files 2025-05-24 07:16:29 +00:00
耗子 e7128c65d9 Merge remote-tracking branch 'origin/main' 2025-05-24 15:16:02 +08:00
耗子 c15e3cc3ae fix: 优化访问入口检查 2025-05-24 15:15:57 +08:00
devhaozi d9f1145d93 chore(l10n): update backend pot files 2025-05-24 07:10:58 +00:00
耗子 0aafe8baa3 fix: 优化访问入口检查 2025-05-24 15:10:30 +08:00
devhaozi 7b0e9db8dc chore(l10n): update backend pot files 2025-05-24 06:58:24 +00:00
耗子 07881311b3 fix: 优化访问入口检查,fix #760 2025-05-24 14:57:53 +08:00
devhaozi 7d9b84c746 chore(l10n): update backend pot files 2025-05-23 02:25:09 +00:00
耗子 548165ab4a fix: 两步验证使用SHA1算法(为了兼容性) 2025-05-23 10:24:37 +08:00
耗子 a997d548f7 feat: 优化菜单排序 2025-05-19 02:15:15 +08:00
耗子 aab5cf7e94 l10n: update translations (#754)
* 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

* 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-05-19 02:03:49 +08:00
devhaozi 382bf4daaa chore(l10n): update backend pot files 2025-05-18 17:59:56 +00:00
耗子 3e048a8683 Merge remote-tracking branch 'origin/main' 2025-05-19 01:59:23 +08:00
耗子 7fa7bb4bd0 fix: lint 2025-05-19 01:59:18 +08:00
devhaozi d41ddb0ad0 chore(l10n): update backend pot files 2025-05-18 17:54:41 +00:00
耗子 cdbadcbb65 fix: lint 2025-05-19 01:54:12 +08:00
devhaozi b14d63c54c chore(l10n): update frontend pot files 2025-05-18 17:49:24 +00:00
耗子 3d47855cc1 feat: 优化跑分算法 2025-05-19 01:48:48 +08:00
devhaozi 819db43aaa chore(l10n): update frontend pot files 2025-05-18 16:35:34 +00:00
devhaozi de859afbe7 chore(l10n): update backend pot files 2025-05-18 16:35:28 +00:00
耗子 066c840efe feat: 移动工具箱和跑分为独立应用 2025-05-19 00:34:53 +08:00
耗子 bc4fcfe6ed feat: 移除工具箱和跑分应用 2025-05-19 00:09:29 +08:00
devhaozi d43090b84f chore(l10n): update backend pot files 2025-05-18 14:45:49 +00:00
耗子 919c37d1f9 fix: 两步验证算法错误 2025-05-18 22:44:43 +08:00
耗子 319b689d79 Merge remote-tracking branch 'origin/main' 2025-05-17 21:07:19 +08:00
耗子 9a6badd46c feat: 优化日志清理使用cat /dev/null 2025-05-17 21:07:14 +08:00
devhaozi ee94b01c2d chore(l10n): update backend pot files 2025-05-17 13:04:36 +00:00
耗子 7b471967a2 feat: 移除日志切割后自动重载nginx 2025-05-17 21:04:05 +08:00
devhaozi 6e039a7fad chore(l10n): update backend pot files 2025-05-17 11:03:26 +00:00
耗子 2f56606789 feat: 用户信息取首用户 2025-05-17 19:02:52 +08:00
耗子 a3210c0a92 feat: 证书账户表单默认使用letsencrypt 2025-05-17 19:01:16 +08:00
261 changed files with 8156 additions and 7227 deletions
Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 42 KiB

+13 -12
View File
@@ -1,18 +1,19 @@
name: Build
on:
push:
branches:
- main
pull_request:
permissions:
contents: read
jobs:
frontend:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
uses: actions/checkout@v5
- name: Setup pnpm
uses: pnpm/action-setup@v4
with:
version: latest
run_install: true
package_json_file: web/package.json
- name: Setup Node.js
@@ -42,7 +43,7 @@ jobs:
fail-fast: true
steps:
- name: Checkout
uses: actions/checkout@v4
uses: actions/checkout@v5
with:
fetch-depth: 0
- name: Setup Go
@@ -53,7 +54,7 @@ jobs:
- name: Install dependencies
run: go mod tidy
- name: Download frontend
uses: actions/download-artifact@v4
uses: actions/download-artifact@v5
with:
name: frontend
path: pkg/embed/frontend
@@ -73,13 +74,13 @@ jobs:
GOARCH: ${{ matrix.goarch }}
run: |
LDFLAGS="-s -w --extldflags '-static'"
LDFLAGS="${LDFLAGS} -X 'github.com/tnb-labs/panel/internal/app.Version=${VERSION}'"
LDFLAGS="${LDFLAGS} -X 'github.com/tnb-labs/panel/internal/app.BuildTime=${BUILD_TIME}'"
LDFLAGS="${LDFLAGS} -X 'github.com/tnb-labs/panel/internal/app.CommitHash=${COMMIT_HASH}'"
LDFLAGS="${LDFLAGS} -X 'github.com/tnb-labs/panel/internal/app.GoVersion=${GO_VERSION}'"
LDFLAGS="${LDFLAGS} -X 'github.com/tnb-labs/panel/internal/app.BuildID=${BUILD_ID}'"
LDFLAGS="${LDFLAGS} -X 'github.com/tnb-labs/panel/internal/app.BuildUser=${BUILD_USER}'"
LDFLAGS="${LDFLAGS} -X 'github.com/tnb-labs/panel/internal/app.BuildHost=${BUILD_HOST}'"
LDFLAGS="${LDFLAGS} -X 'github.com/tnborg/panel/internal/app.Version=${VERSION}'"
LDFLAGS="${LDFLAGS} -X 'github.com/tnborg/panel/internal/app.BuildTime=${BUILD_TIME}'"
LDFLAGS="${LDFLAGS} -X 'github.com/tnborg/panel/internal/app.CommitHash=${COMMIT_HASH}'"
LDFLAGS="${LDFLAGS} -X 'github.com/tnborg/panel/internal/app.GoVersion=${GO_VERSION}'"
LDFLAGS="${LDFLAGS} -X 'github.com/tnborg/panel/internal/app.BuildID=${BUILD_ID}'"
LDFLAGS="${LDFLAGS} -X 'github.com/tnborg/panel/internal/app.BuildUser=${BUILD_USER}'"
LDFLAGS="${LDFLAGS} -X 'github.com/tnborg/panel/internal/app.BuildHost=${BUILD_HOST}'"
go build -ldflags "${LDFLAGS}" -o web-${{ matrix.goarch }} ./cmd/web
go build -ldflags "${LDFLAGS}" -o cli-${{ matrix.goarch }} ./cmd/cli
- name: Compress ${{ matrix.goarch }}
+2 -1
View File
@@ -10,7 +10,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
uses: actions/checkout@v5
with:
fetch-depth: 0
- name: Setup Go
@@ -21,6 +21,7 @@ jobs:
- name: Setup pnpm
uses: pnpm/action-setup@v4
with:
version: latest
run_install: true
package_json_file: web/package.json
- name: Setup Node.js
+1
View File
@@ -11,6 +11,7 @@ permissions:
jobs:
issue-lock:
runs-on: ubuntu-latest
continue-on-error: true
steps:
- name: Set GH_REPO
run: echo "GH_REPO=${{ github.repository }}" >> $GITHUB_ENV
-27
View File
@@ -1,27 +0,0 @@
name: Issue Auto Reply
on:
issues:
types: [ labeled ]
permissions:
contents: read
jobs:
issue-reply:
permissions:
issues: write
pull-requests: write
runs-on: ubuntu-latest
steps:
- name: ☢️ Bug
if: github.event.label.name == '☢️ Bug'
uses: actions-cool/issues-helper@v3
with:
actions: 'create-comment'
token: ${{ secrets.GITHUB_TOKEN }}
issue-number: ${{ github.event.issue.number }}
body: |
Hi @${{ github.event.issue.user.login }} 👋
感谢提交 Bug,请确保您的描述清晰,日志完整,最好能提供复现步骤,以便我们更快定位问题并解决。
Thanks for submitting a bug, please make sure your description is clear, log is complete, and it is best to provide a reproduction step so that we can locate and solve the problem faster.
![Log](https://github.com/user-attachments/assets/0ce7a32d-cc79-4bef-91fc-5bec1d0ed376)
+19 -30
View File
@@ -3,12 +3,26 @@ on:
push:
branches:
- main
permissions:
contents: write
jobs:
xgotext:
l10n:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
uses: actions/checkout@v5
- name: Setup pnpm
uses: pnpm/action-setup@v4
with:
version: latest
run_install: true
package_json_file: web/package.json
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: 22
cache: 'pnpm'
cache-dependency-path: web/pnpm-lock.yaml
- name: Setup Go
uses: actions/setup-go@v5
with:
@@ -20,33 +34,8 @@ jobs:
- name: Generate pot files
run: |
~/go/bin/xgotext -default backend -pkg-tree ./cmd/web -out ./pkg/embed/locales
git pull
- uses: stefanzweifel/git-auto-commit-action@v5
cd web && pnpm run gettext:extract
- uses: stefanzweifel/git-auto-commit-action@v6
name: Commit changes
with:
commit_message: "chore(l10n): update backend pot files"
vue3-gettext:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Setup pnpm
uses: pnpm/action-setup@v4
with:
run_install: true
package_json_file: web/package.json
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: 22
cache: 'pnpm'
cache-dependency-path: web/pnpm-lock.yaml
- name: Generate pot files and merge po files
working-directory: web
run: |
pnpm run gettext:extract
git pull
- uses: stefanzweifel/git-auto-commit-action@v5
name: Commit changes
with:
commit_message: "chore(l10n): update frontend pot files"
commit_message: "chore(l10n): update pot files"
+4 -3
View File
@@ -12,7 +12,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
uses: actions/checkout@v5
- name: Setup Go
uses: actions/setup-go@v5
with:
@@ -28,7 +28,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
uses: actions/checkout@v5
- name: Setup Go
uses: actions/setup-go@v5
with:
@@ -42,10 +42,11 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
uses: actions/checkout@v5
- name: Setup pnpm
uses: pnpm/action-setup@v4
with:
version: latest
run_install: true
package_json_file: web/package.json
- name: Setup Node.js
+4 -2
View File
@@ -3,12 +3,14 @@ on:
push:
branches:
- main
permissions:
contents: write
jobs:
mockery:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
uses: actions/checkout@v5
- name: Setup Go
uses: actions/setup-go@v5
with:
@@ -21,7 +23,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"
+3 -1
View File
@@ -4,12 +4,14 @@ on:
branches:
- main
pull_request:
permissions:
contents: read
jobs:
unit:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
uses: actions/checkout@v5
- name: Setup Go
uses: actions/setup-go@v5
with:
+15 -15
View File
@@ -14,13 +14,13 @@ builds:
- arm64
ldflags:
- -s -w --extldflags "-static"
- -X 'github.com/tnb-labs/panel/internal/app.Version={{ .Version }}'
- -X 'github.com/tnb-labs/panel/internal/app.BuildTime={{ .Now.Format "2006-01-02 15:04:05 MST" }}'
- -X 'github.com/tnb-labs/panel/internal/app.CommitHash={{ .ShortCommit }}'
- -X 'github.com/tnb-labs/panel/internal/app.GoVersion={{ .Env.GOVERSION }}'
- -X 'github.com/tnb-labs/panel/internal/app.BuildID={{ .Env.GITHUB_RUN_ID }}'
- -X 'github.com/tnb-labs/panel/internal/app.BuildUser={{ .Env.USER }}'
- -X 'github.com/tnb-labs/panel/internal/app.BuildHost={{ .Env.HOSTNAME }}'
- -X 'github.com/tnborg/panel/internal/app.Version={{ .Version }}'
- -X 'github.com/tnborg/panel/internal/app.BuildTime={{ .Now.Format "2006-01-02 15:04:05 MST" }}'
- -X 'github.com/tnborg/panel/internal/app.CommitHash={{ .ShortCommit }}'
- -X 'github.com/tnborg/panel/internal/app.GoVersion={{ .Env.GOVERSION }}'
- -X 'github.com/tnborg/panel/internal/app.BuildID={{ .Env.GITHUB_RUN_ID }}'
- -X 'github.com/tnborg/panel/internal/app.BuildUser={{ .Env.USER }}'
- -X 'github.com/tnborg/panel/internal/app.BuildHost={{ .Env.HOSTNAME }}'
- id: cli
main: ./cmd/cli
binary: cli
@@ -33,13 +33,13 @@ builds:
- arm64
ldflags:
- -s -w --extldflags "-static"
- -X 'github.com/tnb-labs/panel/internal/app.Version={{ .Version }}'
- -X 'github.com/tnb-labs/panel/internal/app.BuildTime={{ .Now.Format "2006-01-02 15:04:05 MST" }}'
- -X 'github.com/tnb-labs/panel/internal/app.CommitHash={{ .ShortCommit }}'
- -X 'github.com/tnb-labs/panel/internal/app.GoVersion={{ .Env.GOVERSION }}'
- -X 'github.com/tnb-labs/panel/internal/app.BuildID={{ .Env.GITHUB_RUN_ID }}'
- -X 'github.com/tnb-labs/panel/internal/app.BuildUser={{ .Env.USER }}'
- -X 'github.com/tnb-labs/panel/internal/app.BuildHost={{ .Env.HOSTNAME }}'
- -X 'github.com/tnborg/panel/internal/app.Version={{ .Version }}'
- -X 'github.com/tnborg/panel/internal/app.BuildTime={{ .Now.Format "2006-01-02 15:04:05 MST" }}'
- -X 'github.com/tnborg/panel/internal/app.CommitHash={{ .ShortCommit }}'
- -X 'github.com/tnborg/panel/internal/app.GoVersion={{ .Env.GOVERSION }}'
- -X 'github.com/tnborg/panel/internal/app.BuildID={{ .Env.GITHUB_RUN_ID }}'
- -X 'github.com/tnborg/panel/internal/app.BuildUser={{ .Env.USER }}'
- -X 'github.com/tnborg/panel/internal/app.BuildHost={{ .Env.HOSTNAME }}'
upx:
- enabled: true
@@ -57,7 +57,7 @@ upx:
archives:
- id: panel
builds:
ids:
- web
- cli
formats: ["zip"]
+1 -1
View File
@@ -6,6 +6,6 @@ outpkg: "{{.PackageName}}"
filename: "{{.InterfaceName}}.go"
all: True
packages:
github.com/tnb-labs/panel/internal/biz:
github.com/tnborg/panel/internal/biz:
config:
recursive: True
+12
View File
@@ -659,3 +659,15 @@ specific requirements.
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU AGPL, see
<https://www.gnu.org/licenses/>.
免责声明
本软件是按照现有技术和条件所能达到的现状提供的,用户出于自愿而使用本软件,树新峰(耗子科技)不作任何形式的保证,包括但不限于:
1. 树新峰不对于因使用或无法使用本软件而造成的任何直接、间接、偶然、附带、特殊及后续的「损害」承担责任,即使已被告知此类「损害」的可能性;
2. 树新峰无组织本软件的交流社区的义务与责任,不承担因技术交流导致某一方故障而产生的「损害」;
3. 树新峰不对本软件的无故障、适用性、可用性、准确性、质量满意度等做任何形式的保证;
4. 树新峰不保证本软件可以满足您的要求,也不保证其内容、服务或功能无任何错误或不会中断,不保证任何缺陷将得到更正;
5. 树新峰对本软件提供的任何信息或建议均不构成任何担保;
6. 用户因使用本软件违反国家法律法规的,树新峰不承担任何责任;
7. 本条款所指的「损害」包括但不限于经济损失、利润损失、收入损失、业务中断、数据丢失等。
+39 -41
View File
@@ -6,12 +6,12 @@
<div align="center">
[![Go](https://img.shields.io/github/go-mod/go-version/tnb-labs/panel)](https://go.dev/)
[![Release](https://img.shields.io/github/release/tnb-labs/panel.svg)](https://github.com/tnb-labs/panel/releases)
[![Test](https://github.com/tnb-labs/panel/actions/workflows/test.yml/badge.svg)](https://github.com/tnb-labs/panel/actions)
[![Report Card](https://goreportcard.com/badge/github.com/tnb-labs/panel)](https://goreportcard.com/report/github.com/tnb-labs/panel)
[![Stars](https://img.shields.io/github/stars/tnb-labs/panel?style=flat)](https://github.com/tnb-labs/panel)
[![License](https://img.shields.io/github/license/tnb-labs/panel)](https://www.gnu.org/licenses/agpl-3.0.html)
[![Go](https://img.shields.io/github/go-mod/go-version/tnborg/panel)](https://go.dev/)
[![Release](https://img.shields.io/github/release/tnborg/panel.svg)](https://github.com/tnborg/panel/releases)
[![Test](https://github.com/tnborg/panel/actions/workflows/test.yml/badge.svg)](https://github.com/tnborg/panel/actions)
[![Report Card](https://goreportcard.com/badge/github.com/tnborg/panel)](https://goreportcard.com/report/github.com/tnborg/panel)
[![Stars](https://img.shields.io/github/stars/tnborg/panel?style=flat)](https://github.com/tnborg/panel)
[![License](https://img.shields.io/github/license/tnborg/panel)](https://www.gnu.org/licenses/agpl-3.0.html)
</div>
@@ -26,58 +26,56 @@
3. **追随时代:** 整体设计走在时代前沿,对新系统兼容性好,在同类产品中处于领先地位
4. **高效运维:** 功能完善,自定义能力强,既可快速部署小型网站,也可基于定制化需求部署复杂应用
5. **离线运行:** 支持离线模式,甚至可以在部署完成后停止面板进程,不会对已有服务造成任何影响
6. **安全稳定:** 面板采用业界多种技术保障本体安全性,已在我们的多个生环境中长期稳定运行
6. **安全稳定:** 面板采用业界多种技术保障本体安全性,已在我们的多个生环境中长期稳定运行
7. **全面开源:** 少有的全开源面板,您可以在遵守开源协议的前提下对面板自由修改、二次开发
8. **全面开源:** 承诺面板本体未来不会引入任何收费/授权功能,永久免费使用
8. **永久免费:** 承诺面板本体未来不会引入任何收费/授权功能,永久免费使用
## 快速安装
支持 `amd64` | `arm64` 架构下的干净的主流系统,具体支持的系统请参考[安装文档](https://ratpanel.github.io/zh_CN/quickstart/install)。
```shell
curl -sSLOm 10 https://dl.cdn.haozi.net/panel/install.sh && bash install.sh
```
## UI 截图
![UI 截图](.github/assets/ui.png)
## 快速安装
[https://ratpanel.github.io/quickstart/install.html](https://ratpanel.github.io/quickstart/install.html)
## 合作伙伴
如果耗子面板对您有帮助,欢迎赞助我们,同时感谢以下支持者/赞助商的支持:
如果耗子面板对您有帮助,欢迎[赞助我们](https://github.com/tnborg/panel/issues/90),同时感谢以下支持者/赞助商的支持:
![支付宝](https://github.com/user-attachments/assets/d000b147-6da1-467a-9d80-9a3e8078602a) ![微信](https://github.com/user-attachments/assets/a53ff212-7076-487e-88bd-c93f6e98df1d)
<a href="https://www.weixiaoduo.com/">
<img height="80" src=".github/assets/wxd.png" alt="微晓朵">
</a>
<a href="https://www.dkdun.cn/aff/MQZZNVHQ">
<img height="80" src=".github/assets/dk.png" alt="林枫云">
</a>
<a href="https://su.sctes.com/register?code=8st689ujpmm2p">
<img height="80" src=".github/assets/sctes.png" alt="无畏云加速">
</a>
<a href="https://su.sctes.com/register?code=8st689ujpmm2p">
<img height="80" src=".github/assets/wafpro.png" alt="WAFPRO">
</a>
<a href="https://scdn.ddunyun.com/">
<img height="80" src=".github/assets/ddunyun.png" alt="盾云SCDN">
</a>
<a href="https://hongtoutong.com">
<img height="80" src=".github/assets/htt.png" alt="红透通">
</a>
<a href="https://1ms.run">
<img height="80" src=".github/assets/1ms.svg" alt="毫秒镜像提供经过审核的 Docker 镜像加速服务">
</a>
<p align="center">
<a href="https://www.weixiaoduo.com/">
<img height="60" src=".github/assets/wxd.png" alt="微晓朵">
</a>
<a href="https://www.dkdun.cn/aff/MQZZNVHQ">
<img height="60" src=".github/assets/dk.png" alt="林枫云">
</a>
<a href="https://waf.pro/">
<img height="60" src=".github/assets/wafpro.png" alt="WAFPRO">
</a>
<a href="https://scdn.ddunyun.com/">
<img height="60" src=".github/assets/ddunyun.png" alt="盾云SCDN">
</a>
<a href="https://1ms.run/">
<img height="60" src=".github/assets/1ms.svg" alt="毫秒镜像">
</a>
</p>
<p align="center">
<a target="_blank" href="https://afdian.com/a/tnblabs">
<img alt="sponsors" src="https://github.com/tnb-labs/sponsor/blob/main/sponsors.svg?raw=true"/>
<img alt="sponsors" src="https://github.com/tnborg/sponsor/blob/main/sponsors.svg?raw=true"/>
</a>
</p>
## Star 历史
<a href="https://star-history.com/#tnb-labs/panel&Date">
<a href="https://star-history.com/#tnborg/panel&Date">
<picture>
<source media="(prefers-color-scheme: dark)" srcset="https://api.star-history.com/svg?repos=tnb-labs/panel&type=Date&theme=dark" />
<source media="(prefers-color-scheme: light)" srcset="https://api.star-history.com/svg?repos=tnb-labs/panel&type=Date" />
<img alt="Star History Chart" src="https://api.star-history.com/svg?repos=tnb-labs/panel&type=Date" />
<source media="(prefers-color-scheme: dark)" srcset="https://api.star-history.com/svg?repos=tnborg/panel&type=Date&theme=dark" />
<source media="(prefers-color-scheme: light)" srcset="https://api.star-history.com/svg?repos=tnborg/panel&type=Date" />
<img alt="Star History Chart" src="https://api.star-history.com/svg?repos=tnborg/panel&type=Date" />
</picture>
</a>
+37 -39
View File
@@ -6,12 +6,12 @@
<div align="center">
[![Go](https://img.shields.io/github/go-mod/go-version/tnb-labs/panel)](https://go.dev/)
[![Release](https://img.shields.io/github/release/tnb-labs/panel.svg)](https://github.com/tnb-labs/panel/releases)
[![Test](https://github.com/tnb-labs/panel/actions/workflows/test.yml/badge.svg)](https://github.com/tnb-labs/panel/actions)
[![Report Card](https://goreportcard.com/badge/github.com/tnb-labs/panel)](https://goreportcard.com/report/github.com/tnb-labs/panel)
[![Stars](https://img.shields.io/github/stars/tnb-labs/panel?style=flat)](https://github.com/tnb-labs/panel)
[![License](https://img.shields.io/github/license/tnb-labs/panel)](https://www.gnu.org/licenses/agpl-3.0.html)
[![Go](https://img.shields.io/github/go-mod/go-version/tnborg/panel)](https://go.dev/)
[![Release](https://img.shields.io/github/release/tnborg/panel.svg)](https://github.com/tnborg/panel/releases)
[![Test](https://github.com/tnborg/panel/actions/workflows/test.yml/badge.svg)](https://github.com/tnborg/panel/actions)
[![Report Card](https://goreportcard.com/badge/github.com/tnborg/panel)](https://goreportcard.com/report/github.com/tnborg/panel)
[![Stars](https://img.shields.io/github/stars/tnborg/panel?style=flat)](https://github.com/tnborg/panel)
[![License](https://img.shields.io/github/license/tnborg/panel)](https://www.gnu.org/licenses/agpl-3.0.html)
</div>
@@ -30,54 +30,52 @@ Website: [panel.haozi.net](https://panel.haozi.net) | QQ group: [12370907](https
7. **Fully Open Source:** Few fully open source panels, you can freely modify and develop the panel on the premise of complying with the open source agreement
8. **Permanently free:** Commit to the panel body will not introduce any charging/authorization functions in the future, and will be permanently free to use
## Quick Install
Supported clean mainstream systems under `amd64` | `arm64` architecture, please refer to the [installation documentation](https://ratpanel.github.io/quickstart/install) for specific supported systems.
```shell
curl -sSLOm 10 https://dl.cdn.haozi.net/panel/install.sh && bash install.sh
```
## UI Screenshots
![UI Screenshots](.github/assets/ui.png)
## Quick Install
[https://ratpanel.github.io/quickstart/install.html](https://ratpanel.github.io/quickstart/install.html)
## Partners
If the Rat Panel is helpful to you, welcome to sponsor us, also thanks to the following supporters/sponsors:
If the Rat Panel is helpful to you, welcome to [sponsor us](https://github.com/tnborg/panel/issues/90), also thanks to the following supporters/sponsors:
![Alipay](https://github.com/user-attachments/assets/d000b147-6da1-467a-9d80-9a3e8078602a) ![WeChat](https://github.com/user-attachments/assets/a53ff212-7076-487e-88bd-c93f6e98df1d)
<a href="https://www.weixiaoduo.com/">
<img height="80" src=".github/assets/wxd.png" alt="微晓朵">
</a>
<a href="https://www.dkdun.cn/aff/MQZZNVHQ">
<img height="80" src=".github/assets/dk.png" alt="林枫云">
</a>
<a href="https://su.sctes.com/register?code=8st689ujpmm2p">
<img height="80" src=".github/assets/sctes.png" alt="无畏云加速">
</a>
<a href="https://su.sctes.com/register?code=8st689ujpmm2p">
<img height="80" src=".github/assets/wafpro.png" alt="WAFPRO">
</a>
<a href="https://scdn.ddunyun.com/">
<img height="80" src=".github/assets/ddunyun.png" alt="盾云SCDN">
</a>
<a href="https://hongtoutong.com">
<img height="80" src=".github/assets/htt.png" alt="红透通">
</a>
<a href="https://1ms.run">
<img height="80" src=".github/assets/1ms.svg" alt="毫秒镜像提供经过审核的 Docker 镜像加速服务">
</a>
<p align="center">
<a href="https://www.weixiaoduo.com/">
<img height="60" src=".github/assets/wxd.png" alt="微晓朵">
</a>
<a href="https://www.dkdun.cn/aff/MQZZNVHQ">
<img height="60" src=".github/assets/dk.png" alt="林枫云">
</a>
<a href="https://waf.pro/">
<img height="60" src=".github/assets/wafpro.png" alt="WAFPRO">
</a>
<a href="https://scdn.ddunyun.com/">
<img height="60" src=".github/assets/ddunyun.png" alt="盾云SCDN">
</a>
<a href="https://1ms.run/">
<img height="60" src=".github/assets/1ms.svg" alt="毫秒镜像">
</a>
</p>
<p align="center">
<a target="_blank" href="https://afdian.com/a/tnblabs">
<img alt="sponsors" src="https://github.com/tnb-labs/sponsor/blob/main/sponsors.svg?raw=true"/>
<img alt="sponsors" src="https://github.com/tnborg/sponsor/blob/main/sponsors.svg?raw=true"/>
</a>
</p>
## Star History
<a href="https://star-history.com/#tnb-labs/panel&Date">
<a href="https://star-history.com/#tnborg/panel&Date">
<picture>
<source media="(prefers-color-scheme: dark)" srcset="https://api.star-history.com/svg?repos=tnb-labs/panel&type=Date&theme=dark" />
<source media="(prefers-color-scheme: light)" srcset="https://api.star-history.com/svg?repos=tnb-labs/panel&type=Date" />
<img alt="Star History Chart" src="https://api.star-history.com/svg?repos=tnb-labs/panel&type=Date" />
<source media="(prefers-color-scheme: dark)" srcset="https://api.star-history.com/svg?repos=tnborg/panel&type=Date&theme=dark" />
<source media="(prefers-color-scheme: light)" srcset="https://api.star-history.com/svg?repos=tnborg/panel&type=Date" />
<img alt="Star History Chart" src="https://api.star-history.com/svg?repos=tnborg/panel&type=Date" />
</picture>
</a>
+19 -14
View File
@@ -1,25 +1,30 @@
## 安全说明
## Supported Versions
**我们不对面板的安全性做任何保证**,但安全性是我们最关心的问题之一,我们已在多个不同应用的生产环境广泛应用耗子面板,至今无任何安全事故。
如果您在面板中发现任何安全问题,请勿提交 Issue,可通过以下方式直接联系我们:
- 邮箱:[admin@haozi.net](mailto:admin@haozi.net)
- QQ826896000
提前感谢您的支持与帮助!
致某些安全初学者:通过面板 `session` / `access_token` 执行的任何操作(包括且不限于:获取 root 权限、读取/写入系统敏感文件、执行任意 shell 命令等)均不被认为是安全问题,请不要刷此类报告浪费彼此的时间,这类低水平的报告对你的简历也没有任何帮助。
| Version | Supported |
|---------|--------------------|
| v2.x | :white_check_mark: |
| v1.x | :x: |
## Security Policy
**We do not make any guarantees about the security of the panel**, but security is one of our top concerns. We have widely used the Rat panel in the production environment of multiple different applications, and there has been no security incidents to date.
If you find any security issues while using the panel, please do not submit an Issue. You can contact us directly through the following methods:
- (Recommend) [GitHub Security Advisories](https://github.com/tnborg/panel/security/advisories/new)
- Email: [admin@haozi.net](mailto:admin@haozi.net)
- Telegram: @devhaozi
Thank you in advance for your support and help!
To some security beginners: Any operation performed through the panel `session` / `access_token` (including but not limited to: obtaining root permissions, reading/writing sensitive system files, executing arbitrary shell commands, etc.) is not considered a security issue. Please do not waste each other's time by submitting such reports. Such low-level reports are of no help to your resume.
To some security beginners: Any operation performed through an already logged-in panel's `session` / `access_token` (including but not limited to: obtaining root permissions, reading/writing sensitive system files, executing arbitrary shell commands, etc.) is not considered a security issue. Please do not waste each other's time by submitting such reports.
## 安全说明
如果您在面板中发现任何安全问题,请勿提交 Issue,可通过以下方式直接联系我们:
- (推荐)[GitHub 安全公告](https://github.com/tnborg/panel/security/advisories/new)
- 邮箱:[admin@haozi.net](mailto:admin@haozi.net)
- QQ826896000
提前感谢您的支持与帮助!
致某些安全初学者:通过已登录面板的 `session` / `access_token` 执行的任何操作(包括且不限于:获取 root 权限、读取/写入系统敏感文件、执行任意 shell 命令等)均不被认为是安全问题,请不要刷此类报告浪费彼此的时间。
-3
View File
@@ -1,3 +0,0 @@
# cmd
cmd 目录存放应用的入口文件。
+6 -6
View File
@@ -5,12 +5,12 @@ package main
import (
"github.com/google/wire"
"github.com/tnb-labs/panel/internal/app"
"github.com/tnb-labs/panel/internal/apps"
"github.com/tnb-labs/panel/internal/bootstrap"
"github.com/tnb-labs/panel/internal/data"
"github.com/tnb-labs/panel/internal/route"
"github.com/tnb-labs/panel/internal/service"
"github.com/tnborg/panel/internal/app"
"github.com/tnborg/panel/internal/apps"
"github.com/tnborg/panel/internal/bootstrap"
"github.com/tnborg/panel/internal/data"
"github.com/tnborg/panel/internal/route"
"github.com/tnborg/panel/internal/service"
)
// initCli init command line.
+30 -34
View File
@@ -7,36 +7,34 @@
package main
import (
"github.com/tnb-labs/panel/internal/app"
"github.com/tnb-labs/panel/internal/apps/benchmark"
"github.com/tnb-labs/panel/internal/apps/codeserver"
"github.com/tnb-labs/panel/internal/apps/docker"
"github.com/tnb-labs/panel/internal/apps/fail2ban"
"github.com/tnb-labs/panel/internal/apps/frp"
"github.com/tnb-labs/panel/internal/apps/gitea"
"github.com/tnb-labs/panel/internal/apps/memcached"
"github.com/tnb-labs/panel/internal/apps/minio"
"github.com/tnb-labs/panel/internal/apps/mysql"
"github.com/tnb-labs/panel/internal/apps/nginx"
"github.com/tnb-labs/panel/internal/apps/php74"
"github.com/tnb-labs/panel/internal/apps/php80"
"github.com/tnb-labs/panel/internal/apps/php81"
"github.com/tnb-labs/panel/internal/apps/php82"
"github.com/tnb-labs/panel/internal/apps/php83"
"github.com/tnb-labs/panel/internal/apps/php84"
"github.com/tnb-labs/panel/internal/apps/phpmyadmin"
"github.com/tnb-labs/panel/internal/apps/podman"
"github.com/tnb-labs/panel/internal/apps/postgresql"
"github.com/tnb-labs/panel/internal/apps/pureftpd"
"github.com/tnb-labs/panel/internal/apps/redis"
"github.com/tnb-labs/panel/internal/apps/rsync"
"github.com/tnb-labs/panel/internal/apps/s3fs"
"github.com/tnb-labs/panel/internal/apps/supervisor"
"github.com/tnb-labs/panel/internal/apps/toolbox"
"github.com/tnb-labs/panel/internal/bootstrap"
"github.com/tnb-labs/panel/internal/data"
"github.com/tnb-labs/panel/internal/route"
"github.com/tnb-labs/panel/internal/service"
"github.com/tnborg/panel/internal/app"
"github.com/tnborg/panel/internal/apps/codeserver"
"github.com/tnborg/panel/internal/apps/docker"
"github.com/tnborg/panel/internal/apps/fail2ban"
"github.com/tnborg/panel/internal/apps/frp"
"github.com/tnborg/panel/internal/apps/gitea"
"github.com/tnborg/panel/internal/apps/memcached"
"github.com/tnborg/panel/internal/apps/minio"
"github.com/tnborg/panel/internal/apps/mysql"
"github.com/tnborg/panel/internal/apps/nginx"
"github.com/tnborg/panel/internal/apps/php74"
"github.com/tnborg/panel/internal/apps/php80"
"github.com/tnborg/panel/internal/apps/php81"
"github.com/tnborg/panel/internal/apps/php82"
"github.com/tnborg/panel/internal/apps/php83"
"github.com/tnborg/panel/internal/apps/php84"
"github.com/tnborg/panel/internal/apps/phpmyadmin"
"github.com/tnborg/panel/internal/apps/podman"
"github.com/tnborg/panel/internal/apps/postgresql"
"github.com/tnborg/panel/internal/apps/pureftpd"
"github.com/tnborg/panel/internal/apps/redis"
"github.com/tnborg/panel/internal/apps/rsync"
"github.com/tnborg/panel/internal/apps/s3fs"
"github.com/tnborg/panel/internal/apps/supervisor"
"github.com/tnborg/panel/internal/bootstrap"
"github.com/tnborg/panel/internal/data"
"github.com/tnborg/panel/internal/route"
"github.com/tnborg/panel/internal/service"
)
import (
@@ -63,7 +61,7 @@ func initCli() (*app.Cli, error) {
cacheRepo := data.NewCacheRepo(db)
queue := bootstrap.NewQueue()
taskRepo := data.NewTaskRepo(locale, db, logger, queue)
appRepo := data.NewAppRepo(locale, db, cacheRepo, taskRepo)
appRepo := data.NewAppRepo(locale, koanf, db, cacheRepo, taskRepo)
userRepo := data.NewUserRepo(locale, db)
settingRepo := data.NewSettingRepo(locale, db, koanf, taskRepo)
databaseServerRepo := data.NewDatabaseServerRepo(locale, db, logger)
@@ -77,7 +75,6 @@ func initCli() (*app.Cli, error) {
cli := route.NewCli(locale, cliService)
command := bootstrap.NewCli(locale, cli)
gormigrate := bootstrap.NewMigrate(db)
benchmarkApp := benchmark.NewApp(locale)
codeserverApp := codeserver.NewApp()
dockerApp := docker.NewApp()
fail2banApp := fail2ban.NewApp(locale, websiteRepo)
@@ -101,8 +98,7 @@ func initCli() (*app.Cli, error) {
rsyncApp := rsync.NewApp(locale)
s3fsApp := s3fs.NewApp(locale)
supervisorApp := supervisor.NewApp(locale)
toolboxApp := toolbox.NewApp(locale)
loader := bootstrap.NewLoader(benchmarkApp, codeserverApp, dockerApp, fail2banApp, frpApp, giteaApp, memcachedApp, minioApp, mysqlApp, nginxApp, php74App, php80App, php81App, php82App, php83App, php84App, phpmyadminApp, podmanApp, postgresqlApp, pureftpdApp, redisApp, rsyncApp, s3fsApp, supervisorApp, toolboxApp)
loader := bootstrap.NewLoader(codeserverApp, dockerApp, fail2banApp, frpApp, giteaApp, memcachedApp, minioApp, mysqlApp, nginxApp, php74App, php80App, php81App, php82App, php83App, php84App, phpmyadminApp, podmanApp, postgresqlApp, pureftpdApp, redisApp, rsyncApp, s3fsApp, supervisorApp)
appCli := app.NewCli(command, gormigrate, loader)
return appCli, nil
}
+8 -8
View File
@@ -5,14 +5,14 @@ package main
import (
"github.com/google/wire"
"github.com/tnb-labs/panel/internal/app"
"github.com/tnb-labs/panel/internal/apps"
"github.com/tnb-labs/panel/internal/bootstrap"
"github.com/tnb-labs/panel/internal/data"
"github.com/tnb-labs/panel/internal/http/middleware"
"github.com/tnb-labs/panel/internal/job"
"github.com/tnb-labs/panel/internal/route"
"github.com/tnb-labs/panel/internal/service"
"github.com/tnborg/panel/internal/app"
"github.com/tnborg/panel/internal/apps"
"github.com/tnborg/panel/internal/bootstrap"
"github.com/tnborg/panel/internal/data"
"github.com/tnborg/panel/internal/http/middleware"
"github.com/tnborg/panel/internal/job"
"github.com/tnborg/panel/internal/route"
"github.com/tnborg/panel/internal/service"
)
// initWeb init application.
+37 -38
View File
@@ -7,38 +7,36 @@
package main
import (
"github.com/tnb-labs/panel/internal/app"
"github.com/tnb-labs/panel/internal/apps/benchmark"
"github.com/tnb-labs/panel/internal/apps/codeserver"
"github.com/tnb-labs/panel/internal/apps/docker"
"github.com/tnb-labs/panel/internal/apps/fail2ban"
"github.com/tnb-labs/panel/internal/apps/frp"
"github.com/tnb-labs/panel/internal/apps/gitea"
"github.com/tnb-labs/panel/internal/apps/memcached"
"github.com/tnb-labs/panel/internal/apps/minio"
"github.com/tnb-labs/panel/internal/apps/mysql"
"github.com/tnb-labs/panel/internal/apps/nginx"
"github.com/tnb-labs/panel/internal/apps/php74"
"github.com/tnb-labs/panel/internal/apps/php80"
"github.com/tnb-labs/panel/internal/apps/php81"
"github.com/tnb-labs/panel/internal/apps/php82"
"github.com/tnb-labs/panel/internal/apps/php83"
"github.com/tnb-labs/panel/internal/apps/php84"
"github.com/tnb-labs/panel/internal/apps/phpmyadmin"
"github.com/tnb-labs/panel/internal/apps/podman"
"github.com/tnb-labs/panel/internal/apps/postgresql"
"github.com/tnb-labs/panel/internal/apps/pureftpd"
"github.com/tnb-labs/panel/internal/apps/redis"
"github.com/tnb-labs/panel/internal/apps/rsync"
"github.com/tnb-labs/panel/internal/apps/s3fs"
"github.com/tnb-labs/panel/internal/apps/supervisor"
"github.com/tnb-labs/panel/internal/apps/toolbox"
"github.com/tnb-labs/panel/internal/bootstrap"
"github.com/tnb-labs/panel/internal/data"
"github.com/tnb-labs/panel/internal/http/middleware"
"github.com/tnb-labs/panel/internal/job"
"github.com/tnb-labs/panel/internal/route"
"github.com/tnb-labs/panel/internal/service"
"github.com/tnborg/panel/internal/app"
"github.com/tnborg/panel/internal/apps/codeserver"
"github.com/tnborg/panel/internal/apps/docker"
"github.com/tnborg/panel/internal/apps/fail2ban"
"github.com/tnborg/panel/internal/apps/frp"
"github.com/tnborg/panel/internal/apps/gitea"
"github.com/tnborg/panel/internal/apps/memcached"
"github.com/tnborg/panel/internal/apps/minio"
"github.com/tnborg/panel/internal/apps/mysql"
"github.com/tnborg/panel/internal/apps/nginx"
"github.com/tnborg/panel/internal/apps/php74"
"github.com/tnborg/panel/internal/apps/php80"
"github.com/tnborg/panel/internal/apps/php81"
"github.com/tnborg/panel/internal/apps/php82"
"github.com/tnborg/panel/internal/apps/php83"
"github.com/tnborg/panel/internal/apps/php84"
"github.com/tnborg/panel/internal/apps/phpmyadmin"
"github.com/tnborg/panel/internal/apps/podman"
"github.com/tnborg/panel/internal/apps/postgresql"
"github.com/tnborg/panel/internal/apps/pureftpd"
"github.com/tnborg/panel/internal/apps/redis"
"github.com/tnborg/panel/internal/apps/rsync"
"github.com/tnborg/panel/internal/apps/s3fs"
"github.com/tnborg/panel/internal/apps/supervisor"
"github.com/tnborg/panel/internal/bootstrap"
"github.com/tnborg/panel/internal/data"
"github.com/tnborg/panel/internal/http/middleware"
"github.com/tnborg/panel/internal/job"
"github.com/tnborg/panel/internal/route"
"github.com/tnborg/panel/internal/service"
)
import (
@@ -69,7 +67,7 @@ func initWeb() (*app.Web, error) {
cacheRepo := data.NewCacheRepo(db)
queue := bootstrap.NewQueue()
taskRepo := data.NewTaskRepo(locale, db, logger, queue)
appRepo := data.NewAppRepo(locale, db, cacheRepo, taskRepo)
appRepo := data.NewAppRepo(locale, koanf, db, cacheRepo, taskRepo)
userTokenRepo := data.NewUserTokenRepo(locale, db)
middlewares := middleware.NewMiddlewares(koanf, logger, manager, appRepo, userTokenRepo)
userRepo := data.NewUserRepo(locale, db)
@@ -118,7 +116,9 @@ func initWeb() (*app.Web, error) {
monitorService := service.NewMonitorService(settingRepo, monitorRepo)
settingService := service.NewSettingService(settingRepo)
systemctlService := service.NewSystemctlService(locale)
benchmarkApp := benchmark.NewApp(locale)
toolboxSystemService := service.NewToolboxSystemService(locale)
toolboxBenchmarkService := service.NewToolboxBenchmarkService(locale)
toolboxMigrationService := service.NewToolboxMigrationService(locale, koanf, logger, settingRepo, websiteRepo, databaseRepo, databaseServerRepo, databaseUserRepo, appRepo)
codeserverApp := codeserver.NewApp()
dockerApp := docker.NewApp()
fail2banApp := fail2ban.NewApp(locale, websiteRepo)
@@ -142,11 +142,10 @@ func initWeb() (*app.Web, error) {
rsyncApp := rsync.NewApp(locale)
s3fsApp := s3fs.NewApp(locale)
supervisorApp := supervisor.NewApp(locale)
toolboxApp := toolbox.NewApp(locale)
loader := bootstrap.NewLoader(benchmarkApp, codeserverApp, dockerApp, fail2banApp, frpApp, giteaApp, memcachedApp, minioApp, mysqlApp, nginxApp, php74App, php80App, php81App, php82App, php83App, php84App, phpmyadminApp, podmanApp, postgresqlApp, pureftpdApp, redisApp, rsyncApp, s3fsApp, supervisorApp, toolboxApp)
http := route.NewHttp(userService, userTokenService, dashboardService, taskService, websiteService, databaseService, databaseServerService, databaseUserService, backupService, certService, certDNSService, certAccountService, appService, cronService, processService, safeService, firewallService, sshService, containerService, containerComposeService, containerNetworkService, containerImageService, containerVolumeService, fileService, monitorService, settingService, systemctlService, loader)
loader := bootstrap.NewLoader(codeserverApp, dockerApp, fail2banApp, frpApp, giteaApp, memcachedApp, minioApp, mysqlApp, nginxApp, php74App, php80App, php81App, php82App, php83App, php84App, phpmyadminApp, podmanApp, postgresqlApp, pureftpdApp, redisApp, rsyncApp, s3fsApp, supervisorApp)
http := route.NewHttp(userService, userTokenService, dashboardService, taskService, websiteService, databaseService, databaseServerService, databaseUserService, backupService, certService, certDNSService, certAccountService, appService, cronService, processService, safeService, firewallService, sshService, containerService, containerComposeService, containerNetworkService, containerImageService, containerVolumeService, fileService, monitorService, settingService, systemctlService, toolboxSystemService, toolboxBenchmarkService, toolboxMigrationService, loader)
wsService := service.NewWsService(locale, koanf, sshRepo)
ws := route.NewWs(wsService)
ws := route.NewWs(wsService, toolboxMigrationService)
mux, err := bootstrap.NewRouter(locale, middlewares, http, ws)
if err != nil {
return nil, err
+53 -62
View File
@@ -1,109 +1,100 @@
module github.com/tnb-labs/panel
module github.com/tnborg/panel
go 1.24.0
require (
github.com/bddjr/hlfhr v1.3.8
github.com/beevik/ntp v1.4.3
github.com/coder/websocket v1.8.14
github.com/creack/pty v1.1.24
github.com/devhaozi/westcn v0.0.0-20250407083704-b49375823872
github.com/expr-lang/expr v1.17.2
github.com/go-chi/chi/v5 v5.2.1
github.com/expr-lang/expr v1.17.6
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.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.2
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
github.com/libdns/cloudns v1.0.0
github.com/libdns/duckdns v0.2.0
github.com/libdns/gcore v0.0.0-20250127070537-4a9d185c9d20
github.com/libdns/godaddy v1.0.3
github.com/libdns/hetzner v0.0.1
github.com/libdns/huaweicloud v0.3.5
github.com/libdns/libdns v0.2.3
github.com/libdns/linode v0.4.1
github.com/libdns/namecheap v0.0.0-20250228022813-d8b4b66c5072
github.com/libdns/namedotcom v0.3.3
github.com/libdns/namesilo v0.1.2
github.com/libdns/porkbun v0.2.0
github.com/libdns/tencentcloud v1.2.0
github.com/libdns/vercel v0.0.2
github.com/libdns/alidns v1.0.5-libdns.v1.beta1
github.com/libdns/cloudflare v0.2.2-0.20250708034226-c574dccb31a6
github.com/libdns/cloudns v1.1.0
github.com/libdns/gcore v0.0.0-20250427050847-9964da923833
github.com/libdns/hetzner v1.0.0
github.com/libdns/huaweicloud v1.0.0
github.com/libdns/libdns v1.1.0
github.com/libdns/namesilo v1.0.0
github.com/libdns/porkbun v1.1.0
github.com/libdns/tencentcloud v1.4.2
github.com/libdns/westcn v1.0.2
github.com/libtnb/chix v1.3.0
github.com/libtnb/gormstore v1.1.0
github.com/libtnb/sessions v1.2.0
github.com/libtnb/utils v1.2.0
github.com/mholt/acmez/v3 v3.1.2
github.com/ncruces/go-sqlite3 v0.25.2
github.com/ncruces/go-sqlite3 v0.27.1
github.com/ncruces/go-sqlite3/gormlite v0.24.0
github.com/orandin/slog-gorm v1.4.0
github.com/pquerna/otp v1.4.1-0.20241231231527-5971b1ef1d66
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.4.1
go.yaml.in/yaml/v3 v3.0.4
golang.org/x/crypto v0.41.0
golang.org/x/net v0.43.0
gopkg.in/natefinch/lumberjack.v2 v2.2.1
gopkg.in/yaml.v3 v3.0.1
gorm.io/gorm v1.26.1
gorm.io/gorm v1.30.1
resty.dev/v3 v3.0.0-beta.6
)
require (
filippo.io/edwards25519 v1.1.0 // indirect
github.com/G-Core/gcore-dns-sdk-go v0.2.9 // indirect
github.com/boombuler/barcode v1.0.2 // indirect
github.com/G-Core/gcore-dns-sdk-go v0.3.2 // indirect
github.com/boombuler/barcode v1.1.0 // indirect
github.com/davecgh/go-spew v1.1.1 // indirect
github.com/fsnotify/fsnotify v1.9.0 // indirect
github.com/gabriel-vasile/mimetype v1.4.8 // indirect
github.com/gabriel-vasile/mimetype v1.4.9 // indirect
github.com/go-ole/go-ole v1.3.0 // indirect
github.com/go-rat/securecookie v1.1.0 // indirect
github.com/go-viper/mapstructure/v2 v2.2.1 // indirect
github.com/gofiber/schema v1.3.0 // indirect
github.com/google/go-querystring v1.1.0 // indirect
github.com/go-viper/mapstructure/v2 v2.4.0 // indirect
github.com/gofiber/schema v1.6.0 // indirect
github.com/gookit/filter v1.2.2 // indirect
github.com/gookit/goutil v0.6.18 // indirect
github.com/gookit/goutil v0.7.0 // indirect
github.com/imega/luaformatter v0.0.0-20211025140405-86b0a68d6bef // indirect
github.com/jaevor/go-nanoid v1.4.0 // indirect
github.com/jinzhu/inflection v1.0.0 // indirect
github.com/jinzhu/now v1.1.5 // indirect
github.com/knadh/koanf/maps v0.1.2 // indirect
github.com/linode/linodego v1.23.0 // indirect
github.com/miekg/dns v1.1.40 // indirect
github.com/libtnb/securecookie v1.2.0 // indirect
github.com/mitchellh/copystructure v1.2.0 // indirect
github.com/mitchellh/reflectwalk v1.0.2 // indirect
github.com/ncruces/julianday v1.0.0 // indirect
github.com/pkg/errors v0.9.1 // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect
github.com/stretchr/objx v0.5.2 // indirect
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1096 // indirect
github.com/tetratelabs/wazero v1.9.0 // indirect
github.com/timtadh/data-structures v0.5.3 // indirect
github.com/timtadh/lexmachine v0.2.2 // indirect
github.com/tklauser/go-sysconf v0.3.14 // indirect
github.com/tklauser/numcpus v0.9.0 // indirect
github.com/timtadh/data-structures v0.6.2 // indirect
github.com/timtadh/lexmachine v0.2.3 // indirect
github.com/tklauser/go-sysconf v0.3.15 // indirect
github.com/tklauser/numcpus v0.10.0 // indirect
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/sys v0.33.0 // indirect
golang.org/x/text v0.25.0 // indirect
gopkg.in/ini.v1 v1.67.0 // indirect
golang.org/x/exp v0.0.0-20250718183923-645b1fa84792 // indirect
golang.org/x/sync v0.16.0 // indirect
golang.org/x/sys v0.35.0 // indirect
golang.org/x/text v0.28.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
replace github.com/mholt/acmez/v3 => github.com/libtnb/acmez/v3 v3.0.0-20250707093727-dc5aedd96413
+109 -134
View File
@@ -15,8 +15,8 @@ filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA=
filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4=
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
github.com/G-Core/gcore-dns-sdk-go v0.2.9 h1:LMMZIRX8y3aJJuAviNSpFmLbovZUw+6Om+8VElp1F90=
github.com/G-Core/gcore-dns-sdk-go v0.2.9/go.mod h1:35t795gOfzfVanhzkFyUXEzaBuMXwETmJldPpP28MN4=
github.com/G-Core/gcore-dns-sdk-go v0.3.2 h1:WCTKmoJ5uND69UFE318yxWuHy/h3AA28Z1OnqSYUxRk=
github.com/G-Core/gcore-dns-sdk-go v0.3.2/go.mod h1:35t795gOfzfVanhzkFyUXEzaBuMXwETmJldPpP28MN4=
github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
@@ -32,10 +32,12 @@ github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+Ce
github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=
github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84=
github.com/boombuler/barcode v1.0.1-0.20190219062509-6c824513bacc/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=
github.com/boombuler/barcode v1.0.2 h1:79yrbttoZrLGkL/oOI8hBrUKucwOL0oOjUgEguGMcJ4=
github.com/boombuler/barcode v1.0.2/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=
github.com/boombuler/barcode v1.1.0 h1:ChaYjBR63fr4LFyGn8E8nt7dBSt3MiU3zMOZqFvVkHo=
github.com/boombuler/barcode v1.1.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=
github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
github.com/coder/websocket v1.8.14 h1:9L0p0iKiNOibykf283eHkKUHHrpG7f65OE3BhhO7v9g=
github.com/coder/websocket v1.8.14/go.mod h1:NX3SzP+inril6yawo5CQXx8+fk145lPDC6pumgx0mVg=
github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk=
github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
@@ -47,23 +49,21 @@ github.com/creack/pty v1.1.24/go.mod h1:08sCNb52WyoAwi2QDyzUCTgcvVFhUzewun7wtTfv
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/devhaozi/westcn v0.0.0-20250407083704-b49375823872 h1:cns0Vj69pUuQ+bfS3KQrZyQycjZRxyPMiF3Njjz5Voc=
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.2 h1:o0A99O/Px+/DTjEnQiodAgOIK9PPxL8DtXhBRKC+Iso=
github.com/expr-lang/expr v1.17.2/go.mod h1:8/vRC7+7HBzESEqt5kKpYXxrxkr31SaO8r40VO/1IT4=
github.com/expr-lang/expr v1.17.6 h1:1h6i8ONk9cexhDmowO/A64VPxHScu7qfSl2k8OlINec=
github.com/expr-lang/expr v1.17.6/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=
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
github.com/fsnotify/fsnotify v1.9.0 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S9k=
github.com/fsnotify/fsnotify v1.9.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0=
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/gabriel-vasile/mimetype v1.4.9 h1:5k+WDwEsD9eTLL8Tz3L0VnmVh9QxGjRmjBvAG7U/oYY=
github.com/gabriel-vasile/mimetype v1.4.9/go.mod h1:WnSQhFKJuBlRyLiKohA/2DtIlPFAbguNaG7QCHcyGok=
github.com/ghodss/yaml v1.0.0/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=
@@ -73,29 +73,19 @@ github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V
github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0=
github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE=
github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78=
github.com/go-rat/chix v1.2.0 h1:/pOkt2S1+VTfyS43EyZ35uVi8vssCPqQg1j/bORIk5M=
github.com/go-rat/chix v1.2.0/go.mod h1:YQP0YT0x/U3Xx5uQe2jfyMiS/bA732Nunnii6MG0wos=
github.com/go-rat/gormstore v1.0.6 h1:YxmaY6n3JoTk6o9RXoZ1+cQ6HQL+ayf/6d8D76ydCAc=
github.com/go-rat/gormstore v1.0.6/go.mod h1:xG/n+Du8baWf7ptiafiHLWBZWVXrYIPC42CsoEbfr4M=
github.com/go-rat/securecookie v1.1.0 h1:bvwE9n6X3a4eazOIevEvZghkvZ3OpY4BX1cnH/1/x0s=
github.com/go-rat/securecookie v1.1.0/go.mod h1:Z870TcL7ktAjRuhPeQXYuQcA6/DdzKwwqSwDQuPmufI=
github.com/go-rat/sessions v1.1.0 h1:5zCySVVxNE6xLymf5F2u4TQPKIM7kz1MuD4TwIb/7Do=
github.com/go-rat/sessions v1.1.0/go.mod h1:ofnsWh7JoAApzCfIGd60xEyT5HlJY+Nx8zpWcwUXSHc=
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=
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/go-viper/mapstructure/v2 v2.4.0 h1:EBsztssimR/CONLSZZ04E8qAkxNYq4Qp9LvH92wZUgs=
github.com/go-viper/mapstructure/v2 v2.4.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM=
github.com/gofiber/schema v1.6.0 h1:rAgVDFwhndtC+hgV7Vu5ItQCn7eC2mBA4Eu1/ZTiEYY=
github.com/gofiber/schema v1.6.0/go.mod h1:WNZWpQx8LlPSK7ZaX0OqOh+nQo/eW2OevsXs1VZfs/s=
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=
@@ -110,11 +100,8 @@ github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Z
github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8=
github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU=
github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0=
github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
@@ -130,10 +117,10 @@ github.com/gookit/color v1.5.4 h1:FZmqs7XOyGgCAxmWyPslpiok1k05wmY3SJTytgvYFs0=
github.com/gookit/color v1.5.4/go.mod h1:pZJOeOS8DM43rXbp4AZo1n9zCU2qjpcRko0b6/QJi9w=
github.com/gookit/filter v1.2.2 h1:LSBQLk4M4fpfhaOG0hJ/GJ+qu+2+lLddgxlGfzcd8VQ=
github.com/gookit/filter v1.2.2/go.mod h1:y4xpiqM/fV9g9yT/Vg5OWUq4q9siPj0UlH9O57xYuGs=
github.com/gookit/goutil v0.6.18 h1:MUVj0G16flubWT8zYVicIuisUiHdgirPAkmnfD2kKgw=
github.com/gookit/goutil v0.6.18/go.mod h1:AY/5sAwKe7Xck+mEbuxj0n/bc3qwrGNe3Oeulln7zBA=
github.com/gookit/validate v1.5.4 h1:nwBo6vULnVUeNFCOde6RKFRbOCKJXVMnWR0ghedacLg=
github.com/gookit/validate v1.5.4/go.mod h1:p9sRPfpvYB4vXICBpEPzv8FoAky+XhUOhWQghgmmat4=
github.com/gookit/goutil v0.7.0 h1:HD4PUDW2LOSKIEBJPFD8PzNGLsL46ztpfXWVU+WtAxk=
github.com/gookit/goutil v0.7.0/go.mod h1:vJS9HXctYTCLtCsZot5L5xF+O1oR17cDYO9R0HxBmnU=
github.com/gookit/validate v1.5.5 h1:jzMrwAYy9tbQa0mH8YFnv3C3JQR/0N4pRTsYiySwRJM=
github.com/gookit/validate v1.5.5/go.mod h1:p9sRPfpvYB4vXICBpEPzv8FoAky+XhUOhWQghgmmat4=
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg=
@@ -183,12 +170,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.2 h1:ghbduIkpFui3L587wavneC9e3WIliCgiCgdxYO/wd7A=
github.com/knadh/koanf/v2 v2.2.2/go.mod h1:abWQc0cBXLSF/PSOMCB/SK+T13NXDsPvOksbpi5e/9Q=
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,53 +186,50 @@ 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=
github.com/libdns/alidns v1.0.4/go.mod h1:e18uAG6GanfRhcJj6/tps2rCMzQJaYVcGKT+ELjdjGE=
github.com/libdns/cloudflare v0.1.3 h1:XPFa2f3Mm/3FDNwl9Ki2bfAQJ0Cm5GQB0e8PQVy25Us=
github.com/libdns/cloudflare v0.1.3/go.mod h1:XbvSCSMcxspwpSialM3bq0LsS3/Houy9WYxW8Ok8b6M=
github.com/libdns/cloudns v1.0.0 h1:Qrf8TepFnXVhQJi+IwCa/TXhaDy0RXZIXf+DGD/bcE4=
github.com/libdns/cloudns v1.0.0/go.mod h1:3bx4a2XxtgXcaDzTHktQqPNC4rghXAcSDd+GNPkhvjs=
github.com/libdns/duckdns v0.2.0 h1:vd3pE09G2qTx1Zh1o3LmrivWSByD3Z5FbL7csX5vDgE=
github.com/libdns/duckdns v0.2.0/go.mod h1:jCQ/7+qvhLK39+28qXvKEYGBBvmHBCmIwNqdJTCUmVs=
github.com/libdns/gcore v0.0.0-20250127070537-4a9d185c9d20 h1:bQwFw+C9sX/zYZlV53ey0KnNkxrfWYIFpvptuAVhJ1Y=
github.com/libdns/gcore v0.0.0-20250127070537-4a9d185c9d20/go.mod h1:JGoT1mbmqQwtYQqN5F/vGc9j4TTTMKw/hDm5vXADHUI=
github.com/libdns/godaddy v1.0.3 h1:PX1FOYDQ1HGQzz8mVOmtwm3aa6Sv5MwCkNzivUUTA44=
github.com/libdns/godaddy v1.0.3/go.mod h1:vuKWUXnvblDvcaiRwutOoLl7DuB21x8tI06owsF/JTM=
github.com/libdns/hetzner v0.0.1 h1:WsmcsOKnfpKmzwhfyqhGQEIlEeEaEUvb7ezoJgBKaqU=
github.com/libdns/hetzner v0.0.1/go.mod h1:Jj12aJipO9Ir7OGaXueJ5J1RnerFMD0auGa6k9kujG4=
github.com/libdns/huaweicloud v0.3.5 h1:TXv0QKkqgzEMSfqNUbAhoBj/2nrsiu1W6R0lKKH2vfc=
github.com/libdns/huaweicloud v0.3.5/go.mod h1:fadizEwwxdO/+Owy5VVdnpm7rMRrbo/B9ofBAH5UN5M=
github.com/libdns/libdns v0.1.0/go.mod h1:yQCXzk1lEZmmCPa857bnk4TsOiqYasqpyOEeSObbb40=
github.com/libdns/libdns v0.2.0/go.mod h1:yQCXzk1lEZmmCPa857bnk4TsOiqYasqpyOEeSObbb40=
github.com/libdns/libdns v0.2.3 h1:ba30K4ObwMGB/QTmqUxf3H4/GmUrCAIkMWejeGl12v8=
github.com/libdns/libdns v0.2.3/go.mod h1:4Bj9+5CQiNMVGf87wjX4CY3HQJypUHRuLvlsfsZqLWQ=
github.com/libdns/linode v0.4.1 h1:Fr22y3aWBzaj3AlFbCQ743eC+5Hss+sJ+OEjtlK61AA=
github.com/libdns/linode v0.4.1/go.mod h1:BqAJnQxzpnQgy4GDVYf3hQvhLGDc3n8BRwMZ0/9m2y0=
github.com/libdns/namecheap v0.0.0-20250228022813-d8b4b66c5072 h1:hCPOoLd9Mr5kAWLofhSCuGYZxAVVy0CV9zgbahzIeSg=
github.com/libdns/namecheap v0.0.0-20250228022813-d8b4b66c5072/go.mod h1:jo2LWZSD/g/scevxNSp2kWtdMIXfsgWxrtSc3Z0Yy/I=
github.com/libdns/namedotcom v0.3.3 h1:R10C7+IqQGVeC4opHHMiFNBxdNBg1bi65ZwqLESl+jE=
github.com/libdns/namedotcom v0.3.3/go.mod h1:GbYzsAF2yRUpI0WgIK5fs5UX+kDVUPaYCFLpTnKQm0s=
github.com/libdns/namesilo v0.1.2 h1:ySW4QiWx2vMWw1xBD7kTnTWVY/CLIaCgko6ZbmOufbk=
github.com/libdns/namesilo v0.1.2/go.mod h1:Mk+6XAOCWYaHF3V/oMVP6g96qpoQtj2PzrSz2NpKq4Q=
github.com/libdns/porkbun v0.2.0 h1:oa2F0doE93RiJkauVVbM+P2AZ7jovDSiH6u3aaQezvQ=
github.com/libdns/porkbun v0.2.0/go.mod h1:mwrhwXpsSA2Xw23t9+qmgFnz+erkn25Sxuh7IBA+x2I=
github.com/libdns/tencentcloud v1.2.0 h1:SBbZ9gUZ+ba/p2d8NpiOcj+WZTdYqB5Fz7zypdbK3YU=
github.com/libdns/tencentcloud v1.2.0/go.mod h1:o0+WCxQ7LGLtyjnjYU4HbGW9uVjN44SdUDhxdUYLGPw=
github.com/libdns/vercel v0.0.2 h1:slfQWxgUdYFgKfPbK1vLE7k1CZSspHFlwC+nEWlm79w=
github.com/libdns/vercel v0.0.2/go.mod h1:z2NBq/OQ8G0JPglZmit0YnqHm/k+eOz8s4XyLvYxhQo=
github.com/linode/linodego v1.23.0 h1:s0ReCZtuN9Z1IoUN9w1RLeYO1dMZUGPwOQ/IBFsBHtU=
github.com/linode/linodego v1.23.0/go.mod h1:0U7wj/UQOqBNbKv1FYTXiBUXueR8DY4HvIotwE0ENgg=
github.com/libdns/alidns v1.0.5-libdns.v1.beta1 h1:txHK7UxDed3WFBDjrTZPuMn8X+WmhjBTTAMW5xdy5pQ=
github.com/libdns/alidns v1.0.5-libdns.v1.beta1/go.mod h1:ystHmPwcGoWjPrGpensQSMY9VoCx4cpR2hXNlwk9H/g=
github.com/libdns/cloudflare v0.2.2-0.20250708034226-c574dccb31a6 h1:3MGrVWs2COjMkQR17oUw1zMIPbm2YAzxDC3oGVZvQs8=
github.com/libdns/cloudflare v0.2.2-0.20250708034226-c574dccb31a6/go.mod h1:w9uTmRCDlAoafAsTPnn2nJ0XHK/eaUMh86DUk8BWi60=
github.com/libdns/cloudns v1.1.0 h1:W+1MadtxKySn3b5RITFTsXgTIvr5VoO5x97cewjlDcs=
github.com/libdns/cloudns v1.1.0/go.mod h1:/22V6tYYDALDpM4pw/RGGJ+X2F1Luibty9kKpKvkqBM=
github.com/libdns/gcore v0.0.0-20250427050847-9964da923833 h1:/gsawtsq03cI7qgK65v16tYHIh40omL9YEzHWqnc63I=
github.com/libdns/gcore v0.0.0-20250427050847-9964da923833/go.mod h1:jZJEV7pCTOJFlaUhHty+YwR05dzoSmInXK/vT3wOeVg=
github.com/libdns/hetzner v1.0.0 h1:dFcgqTIfdiKQTqoqBBtgU9CewD8JSnB7p6BKxQ5kheM=
github.com/libdns/hetzner v1.0.0/go.mod h1:OmuTyXMHTfy2nCqbt9KYkf0KwQSvo0ZeFGxEQSl3r2w=
github.com/libdns/huaweicloud v1.0.0 h1:BQUIkOAjF++ouiANRIE3jdMlCfeiAAr6tGqb+8hM1jo=
github.com/libdns/huaweicloud v1.0.0/go.mod h1:W+XywkW+C93fM50Ayklf6KuoCHZTqbrmFUEtpQnVvcU=
github.com/libdns/libdns v1.0.0-beta.1/go.mod h1:4Bj9+5CQiNMVGf87wjX4CY3HQJypUHRuLvlsfsZqLWQ=
github.com/libdns/libdns v1.1.0 h1:9ze/tWvt7Df6sbhOJRB8jT33GHEHpEQXdtkE3hPthbU=
github.com/libdns/libdns v1.1.0/go.mod h1:4Bj9+5CQiNMVGf87wjX4CY3HQJypUHRuLvlsfsZqLWQ=
github.com/libdns/namesilo v1.0.0 h1:Shwbj9YnSp4NR617sBOSfDkFozEnWInWCxNwrDvPkCg=
github.com/libdns/namesilo v1.0.0/go.mod h1:qdojVsogA6eZDjDPdpIUIfv4ymiX+FuqcVV1eNmHDss=
github.com/libdns/porkbun v1.1.0 h1:X763NqXjW26VEl7GvBtF/3CGeuGt9JqoQ35mwIlx40E=
github.com/libdns/porkbun v1.1.0/go.mod h1:JL6NfXkkSlLr24AI5Fv0t3/Oa6PXOSOerVsOmr8+URs=
github.com/libdns/tencentcloud v1.4.2 h1:UXvNISlwmdAapYxMgwDZW7uvn8+Bor+puLx1p6VH0c0=
github.com/libdns/tencentcloud v1.4.2/go.mod h1:Be9gY3tDa12DuAPU79RV9NZIcjY6qg5s7zKPsP26yAM=
github.com/libdns/westcn v1.0.2 h1:PA2M3tME5/0T3klPMzSHvGk1EWnGNNkJiKxaJjFalnM=
github.com/libdns/westcn v1.0.2/go.mod h1:iKpk8jjOU+793Yp8nHoihPTCR6N1KWtm4/r8BB9mVnk=
github.com/libtnb/acmez/v3 v3.0.0-20250707093727-dc5aedd96413 h1:q6Qttk+i7r8JWw1kvt0gBkCa+9mEUZ3KV25rBs2Kiik=
github.com/libtnb/acmez/v3 v3.0.0-20250707093727-dc5aedd96413/go.mod h1:L1wOU06KKvq7tswuMDwKdcHeKpFFgkppZy/y0DFxagQ=
github.com/libtnb/chix v1.3.0 h1:/U+CyuxI41ooeB6M/762PHOjQlfHRg6BQjHKLZarlrM=
github.com/libtnb/chix v1.3.0/go.mod h1:o8nQLEp/UrUojBKYzw8K8sltU/h0XxI2VLZ/z7AQCQg=
github.com/libtnb/gormstore v1.1.0 h1:VbX8u0hhyl2YFSGfkSlF/xSfFG/LE29DCLrY8MJ+uxM=
github.com/libtnb/gormstore v1.1.0/go.mod h1:8A5QzeZxi1MpSmjUVsHTDAL6KnU84feIXMutFLPawwA=
github.com/libtnb/securecookie v1.2.0 h1:2uc0PBDm0foeSTrcZ9QTX1IEjf6kFEwfgEYSIXQSKrA=
github.com/libtnb/securecookie v1.2.0/go.mod h1:ja+wNGnQzYqcqXQnJWu6icsaWi5JEBwNEMJ2ReTVDxA=
github.com/libtnb/sessions v1.2.0 h1:g/RMcfGTC5P2BQE1IqrgppPEQ++x/QjOuiwbN9Frke8=
github.com/libtnb/sessions v1.2.0/go.mod h1:45Bn9d6PseDINLIM1QaJrlCMbzSZ0NWpDbWkdrKJKw0=
github.com/libtnb/utils v1.2.0 h1:6bTZrWn2OkNrODpCY4dhuHwbhsVRV7HICIgmZ31we98=
github.com/libtnb/utils v1.2.0/go.mod h1:9gSEuhkADlvYbM3qJRQUAMC5ypMrhrYpX9YMuYJ6ws8=
github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg=
github.com/miekg/dns v1.1.40 h1:pyyPFfGMnciYUk/mXpKkVmeMQjfXqt3FAJ2hy7tPiLA=
github.com/miekg/dns v1.1.40/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM=
github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=
github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw=
github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s=
@@ -261,14 +245,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.25.2 h1:suu3C7y92hPqozqO8+w3K333Q1VhWyN6K3JJKXdtC2U=
github.com/ncruces/go-sqlite3 v0.25.2/go.mod h1:46HIzeCQQ+aNleAxCli+vpA2tfh7ttSnw24kQahBc1o=
github.com/ncruces/go-sqlite3 v0.27.1 h1:suqlM7xhSyDVMV9RgX99MCPqt9mB6YOCzHZuiI36K34=
github.com/ncruces/go-sqlite3 v0.27.1/go.mod h1:gpF5s+92aw2MbDmZK0ZOnCdFlpe11BH20CTspVqri0c=
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=
@@ -276,14 +258,12 @@ github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FI
github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=
github.com/pquerna/otp v1.4.1-0.20241231231527-5971b1ef1d66 h1:7pccJSb6/BRgd5BKejX/dgzinfq0K5HPwj35+saHuCU=
github.com/pquerna/otp v1.4.1-0.20241231231527-5971b1ef1d66/go.mod h1:dkJfzwRKNiegxyNb54X/3fLwhCynbMspSyWKnvi1AEg=
github.com/pquerna/otp v1.5.0 h1:NMMR+WrmaqXU4EzdGJEE1aUUI0AMRzsp96fFFWNPwxs=
github.com/pquerna/otp v1.5.0/go.mod h1:dkJfzwRKNiegxyNb54X/3fLwhCynbMspSyWKnvi1AEg=
github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso=
github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
@@ -301,8 +281,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 +297,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=
@@ -335,25 +315,25 @@ github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/
github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=
github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1096 h1:DMokC7T0UF8wMfT1kD+mX3M+hc2C06gmFvQ9gsfRPmI=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1096/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0=
github.com/tetratelabs/wazero v1.9.0 h1:IcZ56OuxrtaEz8UYNRHBrUa9bYeX9oVY93KspZZBf/I=
github.com/tetratelabs/wazero v1.9.0/go.mod h1:TSbcXCfFP0L2FGkRPxHphadXPjo1T6W+CseNNY7EkjM=
github.com/timtadh/data-structures v0.5.3 h1:F2tEjoG9qWIyUjbvXVgJqEOGJPMIiYn7U5W5mE+i/vQ=
github.com/timtadh/data-structures v0.5.3/go.mod h1:9R4XODhJ8JdWFEI8P/HJKqxuJctfBQw6fDibMQny2oU=
github.com/timtadh/lexmachine v0.2.2 h1:g55RnjdYazm5wnKv59pwFcBJHOyvTPfDEoz21s4PHmY=
github.com/timtadh/data-structures v0.6.1/go.mod h1:uYUnI1cQi/5yMCc7s23I+x8Mn8BCMf4WgK+7/4QSEk4=
github.com/timtadh/data-structures v0.6.2 h1:zybDnU5NLjJ7WKMDJpvVwczQuf1wSLBgdRHZ9O4AqJ0=
github.com/timtadh/data-structures v0.6.2/go.mod h1:uYUnI1cQi/5yMCc7s23I+x8Mn8BCMf4WgK+7/4QSEk4=
github.com/timtadh/getopt v1.0.0/go.mod h1:L3EL6YN2G0eIAhYBo9b7SB9d/kEQmdnwthIlMJfj210=
github.com/timtadh/lexmachine v0.2.2/go.mod h1:GBJvD5OAfRn/gnp92zb9KTgHLB7akKyxmVivoYCcjQI=
github.com/tklauser/go-sysconf v0.3.14 h1:g5vzr9iPFFz24v2KZXs/pvpvh8/V9Fw6vQK5ZZb78yU=
github.com/tklauser/go-sysconf v0.3.14/go.mod h1:1ym4lWMLUOhuBOPGtRcJm7tEGX4SCYNEEEtghGG/8uY=
github.com/tklauser/numcpus v0.9.0 h1:lmyCHtANi8aRUgkckBgoDk1nHCux3n2cgkJLXdQGPDo=
github.com/tklauser/numcpus v0.9.0/go.mod h1:SN6Nq1O3VychhC1npsWostA+oW+VOQTxZrS604NSRyI=
github.com/timtadh/lexmachine v0.2.3 h1:ZqlfHnfMcAygtbNM5Gv7jQf8hmM8LfVzDjfCrq235NQ=
github.com/timtadh/lexmachine v0.2.3/go.mod h1:oK1NW+93fQSIF6s+J6sXBFWsCPCFbNmrwKV1i0aqvW0=
github.com/tklauser/go-sysconf v0.3.15 h1:VE89k0criAymJ/Os65CSn1IXaol+1wrsFHEB8Ol49K4=
github.com/tklauser/go-sysconf v0.3.15/go.mod h1:Dmjwr6tYFIseJw7a3dRLJfsHAMXZ3nEnL/aZY+0IuI4=
github.com/tklauser/numcpus v0.10.0 h1:18njr6LDBk1zuna922MgdjQuJFjrdppsZG60sHGfjso=
github.com/tklauser/numcpus v0.10.0/go.mod h1:BiTKazU708GQTYF4mB+cmlpT2Is1gLk7XVuEeem8LsQ=
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.4.1 h1:1M9UOCy5bLmGnuu1yn3t3CB4rG79Rtoxuv1sPhnm6qM=
github.com/urfave/cli/v3 v3.4.1/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,25 +346,26 @@ 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=
golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
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.41.0 h1:WKYxWedPGCTVVl5+WHSSrOBT0O8lx32+zxmHxijgXp4=
golang.org/x/crypto v0.41.0/go.mod h1:pO5AFd7FA68rFak7rOAGVuygIISepHftHnr8dr6+sUc=
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=
golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek=
golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY=
golang.org/x/exp v0.0.0-20250305212735-054e65f0b394 h1:nDVHiLt8aIbd/VzvPWN6kSOPE7+F/fNFDSXLVYkE/Iw=
golang.org/x/exp v0.0.0-20250305212735-054e65f0b394/go.mod h1:sIifuuw/Yco/y6yb6+bDNfyeQ/MdPUy/hKEMYQV17cM=
golang.org/x/exp v0.0.0-20250718183923-645b1fa84792 h1:R9PFI6EUdfVKgwKjZef7QIwGcBKu86OEFpJ9nUEP2l4=
golang.org/x/exp v0.0.0-20250718183923-645b1fa84792/go.mod h1:A+z0yzpGtvnG90cToK5n2tu8UJVP2XUATh+r+sfOOOc=
golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
@@ -398,7 +379,6 @@ golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU
golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=
golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=
golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=
golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
@@ -417,15 +397,14 @@ golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn
golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
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.43.0 h1:lat02VYK2j4aLzMzecihNvTlJNQUq316m2Mr9rnM6YE=
golang.org/x/net v0.43.0/go.mod h1:vhO1fvI4dGsIjh73sWfUVjj3N7CA9WkKJNQm2svM6Jg=
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 +417,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.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=
golang.org/x/sync v0.16.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=
@@ -454,7 +433,6 @@ golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7w
golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
@@ -464,16 +442,16 @@ golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw=
golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
golang.org/x/sys v0.35.0 h1:vz1N37gP5bs89s7He8XuIYXpyY0+QlsKmzipCbUtyxI=
golang.org/x/sys v0.35.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=
golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU=
golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY=
golang.org/x/term v0.32.0 h1:DR4lr0TjUs3epypdhTOkMmuF5CDFJ/8pOnbzMZPQ7bg=
golang.org/x/term v0.32.0/go.mod h1:uZG1FhGx848Sqfsq4/DlJr3xGGsYMu/L5GW4abiaEPQ=
golang.org/x/term v0.34.0 h1:O/2T7POpk0ZZ7MAzMeWFSg6S5IpWd/RXDlM9hgM3DR4=
golang.org/x/term v0.34.0/go.mod h1:5jC53AEywhIVebHgPVeg0mj8OD3VO9OzclacVrqpaAw=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
@@ -483,8 +461,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.28.0 h1:rhazDwis8INMIwQ4tpjLDzUhx6RlXqZNPEM0huQojng=
golang.org/x/text v0.28.0/go.mod h1:U8nCwOR8jO/marOQ0QbDiOngZVEBB7MAiitBuMjXiNU=
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=
@@ -507,14 +485,11 @@ golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtn
golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191216052735-49a3e744a425/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58=
golang.org/x/tools v0.17.0/go.mod h1:xsh6VxdV005rRVaS6SSAf9oiAqljS7UZUacMZ8Bnsps=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=
google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=
google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
@@ -539,12 +514,10 @@ 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=
gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc=
gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc=
gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo=
@@ -557,12 +530,14 @@ gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C
gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gorm.io/gorm v1.26.1 h1:ghB2gUI9FkS46luZtn6DLZ0f6ooBJ5IbVej2ENFDjRw=
gorm.io/gorm v1.26.1/go.mod h1:8Z33v652h4//uMA76KjeDH8mJXPm1QNCYrMeatR0DOE=
gorm.io/gorm v1.30.1 h1:lSHg33jJTBxs2mgJRfRZeLDG+WZaHYCk3Wtfl6Ngzo4=
gorm.io/gorm v1.30.1/go.mod h1:8Z33v652h4//uMA76KjeDH8mJXPm1QNCYrMeatR0DOE=
gotest.tools/v3 v3.5.1 h1:EENdUnS3pdur5nybKYIh2Vfgc8IUNBjxDPSjtiJcOzU=
gotest.tools/v3 v3.5.1/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU=
honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
resty.dev/v3 v3.0.0-beta.6 h1:ghRdNpoE8/wBCv+kTKIOauW1aCrSIeTq7GxtfYgtevU=
resty.dev/v3 v3.0.0-beta.6/go.mod h1:NTOerrC/4T7/FE6tXIZGIysXXBdgNqwMZuKtxpea9NM=
rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
+1 -1
View File
@@ -8,7 +8,7 @@ import (
"github.com/gookit/color"
"github.com/urfave/cli/v3"
"github.com/tnb-labs/panel/pkg/apploader"
"github.com/tnborg/panel/pkg/apploader"
)
type Cli struct {
+1 -1
View File
@@ -14,7 +14,7 @@ import (
"github.com/knadh/koanf/v2"
"github.com/robfig/cron/v3"
"github.com/tnb-labs/panel/pkg/queue"
"github.com/tnborg/panel/pkg/queue"
)
type Web struct {
+23 -27
View File
@@ -3,35 +3,32 @@ package apps
import (
"github.com/google/wire"
"github.com/tnb-labs/panel/internal/apps/benchmark"
"github.com/tnb-labs/panel/internal/apps/codeserver"
"github.com/tnb-labs/panel/internal/apps/docker"
"github.com/tnb-labs/panel/internal/apps/fail2ban"
"github.com/tnb-labs/panel/internal/apps/frp"
"github.com/tnb-labs/panel/internal/apps/gitea"
"github.com/tnb-labs/panel/internal/apps/memcached"
"github.com/tnb-labs/panel/internal/apps/minio"
"github.com/tnb-labs/panel/internal/apps/mysql"
"github.com/tnb-labs/panel/internal/apps/nginx"
"github.com/tnb-labs/panel/internal/apps/php74"
"github.com/tnb-labs/panel/internal/apps/php80"
"github.com/tnb-labs/panel/internal/apps/php81"
"github.com/tnb-labs/panel/internal/apps/php82"
"github.com/tnb-labs/panel/internal/apps/php83"
"github.com/tnb-labs/panel/internal/apps/php84"
"github.com/tnb-labs/panel/internal/apps/phpmyadmin"
"github.com/tnb-labs/panel/internal/apps/podman"
"github.com/tnb-labs/panel/internal/apps/postgresql"
"github.com/tnb-labs/panel/internal/apps/pureftpd"
"github.com/tnb-labs/panel/internal/apps/redis"
"github.com/tnb-labs/panel/internal/apps/rsync"
"github.com/tnb-labs/panel/internal/apps/s3fs"
"github.com/tnb-labs/panel/internal/apps/supervisor"
"github.com/tnb-labs/panel/internal/apps/toolbox"
"github.com/tnborg/panel/internal/apps/codeserver"
"github.com/tnborg/panel/internal/apps/docker"
"github.com/tnborg/panel/internal/apps/fail2ban"
"github.com/tnborg/panel/internal/apps/frp"
"github.com/tnborg/panel/internal/apps/gitea"
"github.com/tnborg/panel/internal/apps/memcached"
"github.com/tnborg/panel/internal/apps/minio"
"github.com/tnborg/panel/internal/apps/mysql"
"github.com/tnborg/panel/internal/apps/nginx"
"github.com/tnborg/panel/internal/apps/php74"
"github.com/tnborg/panel/internal/apps/php80"
"github.com/tnborg/panel/internal/apps/php81"
"github.com/tnborg/panel/internal/apps/php82"
"github.com/tnborg/panel/internal/apps/php83"
"github.com/tnborg/panel/internal/apps/php84"
"github.com/tnborg/panel/internal/apps/phpmyadmin"
"github.com/tnborg/panel/internal/apps/podman"
"github.com/tnborg/panel/internal/apps/postgresql"
"github.com/tnborg/panel/internal/apps/pureftpd"
"github.com/tnborg/panel/internal/apps/redis"
"github.com/tnborg/panel/internal/apps/rsync"
"github.com/tnborg/panel/internal/apps/s3fs"
"github.com/tnborg/panel/internal/apps/supervisor"
)
var ProviderSet = wire.NewSet(
benchmark.NewApp,
codeserver.NewApp,
docker.NewApp,
fail2ban.NewApp,
@@ -55,5 +52,4 @@ var ProviderSet = wire.NewSet(
rsync.NewApp,
s3fs.NewApp,
supervisor.NewApp,
toolbox.NewApp,
)
-701
View File
@@ -1,701 +0,0 @@
package benchmark
import (
"bytes"
"compress/gzip"
"crypto/aes"
"crypto/cipher"
cryptorand "crypto/rand"
"encoding/json"
"fmt"
"image"
"image/color"
"io"
"math"
"math/big"
"math/rand/v2"
"net/http"
"os"
"runtime"
"strings"
"sync"
"time"
"github.com/go-chi/chi/v5"
"github.com/leonelquinteros/gotext"
"github.com/tnb-labs/panel/internal/service"
)
type App struct {
t *gotext.Locale
}
func NewApp(t *gotext.Locale) *App {
return &App{
t: t,
}
}
func (s *App) Route(r chi.Router) {
r.Post("/test", s.Test)
}
// Test 运行测试
func (s *App) Test(w http.ResponseWriter, r *http.Request) {
req, err := service.Bind[Test](r)
if err != nil {
service.Error(w, http.StatusUnprocessableEntity, "%v", err)
return
}
switch req.Name {
case "image":
result := s.imageProcessing(req.Multi)
service.Success(w, result)
case "machine":
result := s.machineLearning(req.Multi)
service.Success(w, result)
case "compile":
result := s.compileSimulationSingle(req.Multi)
service.Success(w, result)
case "encryption":
result := s.encryptionTest(req.Multi)
service.Success(w, result)
case "compression":
result := s.compressionTest(req.Multi)
service.Success(w, result)
case "physics":
result := s.physicsSimulation(req.Multi)
service.Success(w, result)
case "json":
result := s.jsonProcessing(req.Multi)
service.Success(w, result)
case "disk":
result := s.diskTestTask()
service.Success(w, result)
case "memory":
result := s.memoryTestTask()
service.Success(w, result)
default:
service.Error(w, http.StatusUnprocessableEntity, s.t.Get("unknown test type"))
}
}
// calculateCpuScore 计算CPU成绩
func (s *App) calculateCpuScore(duration time.Duration) int {
score := int((10 / duration.Seconds()) * float64(3000))
if score < 0 {
score = 0
}
return score
}
// calculateScore 计算内存/硬盘成绩
func (s *App) calculateScore(duration time.Duration) int {
score := int((20 / duration.Seconds()) * float64(30000))
if score < 0 {
score = 0
}
return score
}
// 图像处理
func (s *App) imageProcessing(multi bool) int {
n := 1
if multi {
n = runtime.NumCPU()
}
start := time.Now()
if err := s.imageProcessingTask(n); err != nil {
return 0
}
duration := time.Since(start)
return s.calculateCpuScore(duration)
}
func (s *App) imageProcessingTask(numThreads int) error {
img := image.NewRGBA(image.Rect(0, 0, 4000, 4000))
for x := 0; x < 4000; x++ {
for y := 0; y < 4000; y++ {
img.Set(x, y, color.RGBA{R: uint8(x % 256), G: uint8(y % 256), A: 255})
}
}
var wg sync.WaitGroup
dx := img.Bounds().Dx()
dy := img.Bounds().Dy()
chunkSize := dy / numThreads
for i := 0; i < numThreads; i++ {
wg.Add(1)
go func(i int) {
defer wg.Done()
startY := i * chunkSize
endY := startY + chunkSize
if i == numThreads-1 {
endY = dy
}
for x := 1; x < dx-1; x++ {
for y := startY + 1; y < endY-1; y++ {
// 卷积操作(模糊)
rTotal, gTotal, bTotal := 0, 0, 0
for k := -1; k <= 1; k++ {
for l := -1; l <= 1; l++ {
r, g, b, _ := img.At(x+k, y+l).RGBA()
rTotal += int(r)
gTotal += int(g)
bTotal += int(b)
}
}
rAvg := uint8(rTotal / 9 / 256)
gAvg := uint8(gTotal / 9 / 256)
bAvg := uint8(bTotal / 9 / 256)
img.Set(x, y, color.RGBA{R: rAvg, G: gAvg, B: bAvg, A: 255})
}
}
}(i)
}
wg.Wait()
return nil
}
// 机器学习(矩阵乘法)
func (s *App) machineLearning(multi bool) int {
n := 1
if multi {
n = runtime.NumCPU()
}
start := time.Now()
s.machineLearningTask(n)
duration := time.Since(start)
return s.calculateCpuScore(duration)
}
func (s *App) machineLearningTask(numThreads int) {
size := 900
a := make([][]float64, size)
b := make([][]float64, size)
for i := 0; i < size; i++ {
a[i] = make([]float64, size)
b[i] = make([]float64, size)
for j := 0; j < size; j++ {
a[i][j] = rand.Float64()
b[i][j] = rand.Float64()
}
}
c := make([][]float64, size)
for i := 0; i < size; i++ {
c[i] = make([]float64, size)
}
var wg sync.WaitGroup
chunkSize := size / numThreads
for k := 0; k < numThreads; k++ {
wg.Add(1)
go func(k int) {
defer wg.Done()
start := k * chunkSize
end := start + chunkSize
if k == numThreads-1 {
end = size
}
for i := start; i < end; i++ {
for j := 0; j < size; j++ {
sum := 0.0
for l := 0; l < size; l++ {
sum += a[i][l] * b[l][j]
}
c[i][j] = sum
}
}
}(k)
}
wg.Wait()
}
// 数学问题(计算斐波那契数)
func (s *App) compileSimulationSingle(multi bool) int {
n := 1
if multi {
n = runtime.NumCPU()
}
start := time.Now()
totalCalculations := 1000
fibNumber := 20000
calculationsPerThread := totalCalculations / n
remainder := totalCalculations % n
var wg sync.WaitGroup
for i := 0; i < n; i++ {
tasks := calculationsPerThread
if i < remainder {
tasks++ // 处理无法均分的剩余任务
}
wg.Add(1)
go func(tasks int) {
defer wg.Done()
for j := 0; j < tasks; j++ {
s.fib(fibNumber)
}
}(tasks)
}
wg.Wait()
duration := time.Since(start)
return s.calculateCpuScore(duration)
}
// 斐波那契函数
func (s *App) fib(n int) *big.Int {
if n < 2 {
return big.NewInt(int64(n))
}
a := big.NewInt(0)
b := big.NewInt(1)
temp := big.NewInt(0)
for i := 2; i <= n; i++ {
temp.Add(a, b)
a.Set(b)
b.Set(temp)
}
return b
}
// AES加密
func (s *App) encryptionTest(multi bool) int {
n := 1
if multi {
n = runtime.NumCPU()
}
start := time.Now()
if err := s.encryptionTestTask(n); err != nil {
return 0
}
duration := time.Since(start)
return s.calculateCpuScore(duration)
}
func (s *App) encryptionTestTask(numThreads int) error {
key := []byte("abcdefghijklmnopqrstuvwxyz123456")
dataSize := 1024 * 1024 * 512 // 512 MB
plaintext := []byte(strings.Repeat("A", dataSize))
block, err := aes.NewCipher(key)
if err != nil {
return err
}
aesGCM, err := cipher.NewGCM(block)
if err != nil {
return err
}
chunkSize := dataSize / numThreads
var wg sync.WaitGroup
for i := 0; i < numThreads; i++ {
wg.Add(1)
go func(i int) {
defer wg.Done()
start := i * chunkSize
end := start + chunkSize
if i == numThreads-1 {
end = dataSize
}
nonce := make([]byte, aesGCM.NonceSize())
if _, err = cryptorand.Read(nonce); err != nil {
return
}
aesGCM.Seal(nil, nonce, plaintext[start:end], nil)
}(i)
}
wg.Wait()
return nil
}
// 压缩/解压缩
func (s *App) compressionTest(multi bool) int {
n := 1
if multi {
n = runtime.NumCPU()
}
start := time.Now()
s.compressionTestTask(n)
duration := time.Since(start)
return s.calculateCpuScore(duration)
}
func (s *App) compressionTestTask(numThreads int) {
data := []byte(strings.Repeat("耗子面板", 50000000))
chunkSize := len(data) / numThreads
var wg sync.WaitGroup
compressedChunks := make([]bytes.Buffer, numThreads)
// 压缩
for i := 0; i < numThreads; i++ {
wg.Add(1)
go func(i int) {
defer wg.Done()
start := i * chunkSize
end := start + chunkSize
if i == numThreads-1 {
end = len(data)
}
var buf bytes.Buffer
w := gzip.NewWriter(&buf)
_, _ = w.Write(data[start:end])
_ = w.Close()
compressedChunks[i] = buf
}(i)
}
wg.Wait()
// 解压缩
for i := 0; i < numThreads; i++ {
wg.Add(1)
go func(i int) {
defer wg.Done()
r, err := gzip.NewReader(&compressedChunks[i])
if err != nil {
return
}
_, err = io.Copy(io.Discard, r)
if err != nil {
return
}
_ = r.Close()
}(i)
}
wg.Wait()
}
// 物理仿真(N体问题)
func (s *App) physicsSimulation(multi bool) int {
n := 1
if multi {
n = runtime.NumCPU()
}
start := time.Now()
s.physicsSimulationTask(n)
duration := time.Since(start)
return s.calculateCpuScore(duration)
}
func (s *App) physicsSimulationTask(numThreads int) {
const (
numBodies = 4000
steps = 30
)
type Body struct {
x, y, z, vx, vy, vz float64
}
bodies := make([]Body, numBodies)
for i := 0; i < numBodies; i++ {
bodies[i] = Body{
x: rand.Float64(),
y: rand.Float64(),
z: rand.Float64(),
vx: rand.Float64(),
vy: rand.Float64(),
vz: rand.Float64(),
}
}
chunkSize := numBodies / numThreads
for step := 0; step < steps; step++ {
var wg sync.WaitGroup
// 更新速度
for k := 0; k < numThreads; k++ {
wg.Add(1)
go func(k int) {
defer wg.Done()
start := k * chunkSize
end := start + chunkSize
if k == numThreads-1 {
end = numBodies
}
for i := start; i < end; i++ {
bi := &bodies[i]
for j := 0; j < numBodies; j++ {
if i == j {
continue
}
bj := &bodies[j]
dx := bj.x - bi.x
dy := bj.y - bi.y
dz := bj.z - bi.z
dist := math.Sqrt(dx*dx + dy*dy + dz*dz)
if dist == 0 {
continue
}
force := 1 / (dist * dist)
bi.vx += force * dx / dist
bi.vy += force * dy / dist
bi.vz += force * dz / dist
}
}
}(k)
}
wg.Wait()
// 更新位置
for k := 0; k < numThreads; k++ {
wg.Add(1)
go func(k int) {
defer wg.Done()
start := k * chunkSize
end := start + chunkSize
if k == numThreads-1 {
end = numBodies
}
for i := start; i < end; i++ {
bi := &bodies[i]
bi.x += bi.vx
bi.y += bi.vy
bi.z += bi.vz
}
}(k)
}
wg.Wait()
}
}
// JSON解析
func (s *App) jsonProcessing(multi bool) int {
n := 1
if multi {
n = runtime.NumCPU()
}
start := time.Now()
s.jsonProcessingTask(n)
duration := time.Since(start)
return s.calculateCpuScore(duration)
}
func (s *App) jsonProcessingTask(numThreads int) {
numElements := 1000000
elementsPerThread := numElements / numThreads
var wg sync.WaitGroup
for i := 0; i < numThreads; i++ {
wg.Add(1)
go func(i int) {
defer wg.Done()
start := i * elementsPerThread
end := start + elementsPerThread
if i == numThreads-1 {
end = numElements
}
elements := make([]map[string]any, 0, end-start)
for j := start; j < end; j++ {
elements = append(elements, map[string]any{
"id": j,
"value": fmt.Sprintf("Value%d", j),
})
}
encoded, err := json.Marshal(elements)
if err != nil {
return
}
var parsed []map[string]any
err = json.Unmarshal(encoded, &parsed)
if err != nil {
return
}
}(i)
}
wg.Wait()
}
// 内存性能
func (s *App) memoryTestTask() map[string]any {
results := make(map[string]any)
dataSize := 500 * 1024 * 1024 // 500 MB
data := make([]byte, dataSize)
_, _ = cryptorand.Read(data)
start := time.Now()
// 内存读写速度
results["bandwidth"] = s.memoryBandwidthTest(data)
// 内存访问延迟
data = data[:100*1024*1024] // 100 MB
results["latency"] = s.memoryLatencyTest(data)
duration := time.Since(start)
results["score"] = s.calculateScore(duration)
return results
}
func (s *App) memoryBandwidthTest(data []byte) string {
dataSize := len(data)
startTime := time.Now()
for i := 0; i < dataSize; i++ {
data[i] ^= 0xFF
}
duration := time.Since(startTime).Seconds()
if duration == 0 {
return "N/A"
}
speed := float64(dataSize) / duration / (1024 * 1024)
return fmt.Sprintf("%.2f MB/s", speed)
}
func (s *App) memoryLatencyTest(data []byte) string {
dataSize := len(data)
indices := rand.Perm(dataSize)
startTime := time.Now()
sum := byte(0)
for _, idx := range indices {
sum ^= data[idx]
}
duration := time.Since(startTime).Seconds()
if duration == 0 {
return "N/A"
}
avgLatency := duration * 1e9 / float64(dataSize)
return fmt.Sprintf("%.2f ns", avgLatency)
}
// 硬盘IO
func (s *App) diskTestTask() map[string]any {
results := make(map[string]any)
blockSizes := []int64{4 * 1024, 64 * 1024, 512 * 1024, 1 * 1024 * 1024} // 4K, 64K, 512K, 1M
fileSize := int64(100 * 1024 * 1024) // 100MB 文件
start := time.Now()
for _, blockSize := range blockSizes {
result := s.diskIOTest(blockSize, fileSize)
results[fmt.Sprintf("%d", blockSize/1024)] = result
}
duration := time.Since(start)
results["score"] = s.calculateScore(duration)
return results
}
func (s *App) diskIOTest(blockSize int64, fileSize int64) map[string]any {
result := make(map[string]any)
tempFile := fmt.Sprintf("tempfile_%d", blockSize)
defer func(name string) {
_ = os.Remove(name)
}(tempFile)
// 写测试
writeSpeed, writeIOPS := s.diskWriteTest(tempFile, blockSize, fileSize)
// 读测试
readSpeed, readIOPS := s.diskReadTest(tempFile, blockSize, fileSize)
result["write_speed"] = fmt.Sprintf("%.2f MB/s", writeSpeed)
result["write_iops"] = fmt.Sprintf("%.2f IOPS", writeIOPS)
result["read_speed"] = fmt.Sprintf("%.2f MB/s", readSpeed)
result["read_iops"] = fmt.Sprintf("%.2f IOPS", readIOPS)
return result
}
func (s *App) diskWriteTest(fileName string, blockSize int64, fileSize int64) (float64, float64) {
totalBlocks := fileSize / blockSize
data := make([]byte, blockSize)
_, _ = cryptorand.Read(data)
file, err := os.OpenFile(fileName, os.O_CREATE|os.O_WRONLY|os.O_SYNC, 0644)
if err != nil {
return 0, 0
}
defer func(file *os.File) {
_ = file.Close()
}(file)
start := time.Now()
for i := int64(0); i < totalBlocks; i++ {
// 生成随机偏移
offset := rand.Int64N(fileSize - blockSize + 1)
_, err := file.WriteAt(data, offset)
if err != nil {
return 0, 0
}
}
_ = file.Sync()
duration := time.Since(start).Seconds()
if duration == 0 {
duration = 1
}
speed := float64(totalBlocks*blockSize) / duration / (1024 * 1024)
iops := float64(totalBlocks) / duration
return speed, iops
}
func (s *App) diskReadTest(fileName string, blockSize int64, fileSize int64) (float64, float64) {
totalBlocks := fileSize / blockSize
data := make([]byte, blockSize)
file, err := os.OpenFile(fileName, os.O_RDONLY|os.O_SYNC, 0644)
if err != nil {
return 0, 0
}
defer func(file *os.File) {
_ = file.Close()
}(file)
start := time.Now()
for i := int64(0); i < totalBlocks; i++ {
// 生成随机偏移
offset := rand.Int64N(fileSize - blockSize + 1)
_, err := file.ReadAt(data, offset)
if err != nil && err != io.EOF {
return 0, 0
}
}
duration := time.Since(start).Seconds()
if duration == 0 {
duration = 1
}
speed := float64(totalBlocks*blockSize) / duration / (1024 * 1024)
iops := float64(totalBlocks) / duration
return speed, iops
}
-6
View File
@@ -1,6 +0,0 @@
package benchmark
type Test struct {
Name string `json:"name" validate:"required|in:image,machine,compile,encryption,compression,physics,json,memory,disk"`
Multi bool `json:"multi"`
}
+3 -3
View File
@@ -5,9 +5,9 @@ import (
"github.com/go-chi/chi/v5"
"github.com/tnb-labs/panel/internal/service"
"github.com/tnb-labs/panel/pkg/io"
"github.com/tnb-labs/panel/pkg/systemctl"
"github.com/tnborg/panel/internal/service"
"github.com/tnborg/panel/pkg/io"
"github.com/tnborg/panel/pkg/systemctl"
)
type App struct{}
+3 -3
View File
@@ -5,9 +5,9 @@ import (
"github.com/go-chi/chi/v5"
"github.com/tnb-labs/panel/internal/service"
"github.com/tnb-labs/panel/pkg/io"
"github.com/tnb-labs/panel/pkg/systemctl"
"github.com/tnborg/panel/internal/service"
"github.com/tnborg/panel/pkg/io"
"github.com/tnborg/panel/pkg/systemctl"
)
type App struct{}
+7 -7
View File
@@ -7,16 +7,16 @@ import (
"strings"
"github.com/go-chi/chi/v5"
"github.com/go-rat/chix"
"github.com/go-rat/utils/str"
"github.com/leonelquinteros/gotext"
"github.com/libtnb/chix"
"github.com/libtnb/utils/str"
"github.com/spf13/cast"
"github.com/tnb-labs/panel/internal/app"
"github.com/tnb-labs/panel/internal/biz"
"github.com/tnb-labs/panel/internal/service"
"github.com/tnb-labs/panel/pkg/io"
"github.com/tnb-labs/panel/pkg/shell"
"github.com/tnborg/panel/internal/app"
"github.com/tnborg/panel/internal/biz"
"github.com/tnborg/panel/internal/service"
"github.com/tnborg/panel/pkg/io"
"github.com/tnborg/panel/pkg/shell"
)
type App struct {
+4 -4
View File
@@ -6,10 +6,10 @@ import (
"github.com/go-chi/chi/v5"
"github.com/tnb-labs/panel/internal/app"
"github.com/tnb-labs/panel/internal/service"
"github.com/tnb-labs/panel/pkg/io"
"github.com/tnb-labs/panel/pkg/systemctl"
"github.com/tnborg/panel/internal/app"
"github.com/tnborg/panel/internal/service"
"github.com/tnborg/panel/pkg/io"
"github.com/tnborg/panel/pkg/systemctl"
)
type App struct{}
+4 -4
View File
@@ -6,10 +6,10 @@ import (
"github.com/go-chi/chi/v5"
"github.com/tnb-labs/panel/internal/app"
"github.com/tnb-labs/panel/internal/service"
"github.com/tnb-labs/panel/pkg/io"
"github.com/tnb-labs/panel/pkg/systemctl"
"github.com/tnborg/panel/internal/app"
"github.com/tnborg/panel/internal/service"
"github.com/tnborg/panel/pkg/io"
"github.com/tnborg/panel/pkg/systemctl"
)
type App struct{}
+4 -4
View File
@@ -9,10 +9,10 @@ import (
"github.com/go-chi/chi/v5"
"github.com/leonelquinteros/gotext"
"github.com/tnb-labs/panel/internal/service"
"github.com/tnb-labs/panel/pkg/io"
"github.com/tnb-labs/panel/pkg/systemctl"
"github.com/tnb-labs/panel/pkg/types"
"github.com/tnborg/panel/internal/service"
"github.com/tnborg/panel/pkg/io"
"github.com/tnborg/panel/pkg/systemctl"
"github.com/tnborg/panel/pkg/types"
)
type App struct {
+3 -3
View File
@@ -5,9 +5,9 @@ import (
"github.com/go-chi/chi/v5"
"github.com/tnb-labs/panel/internal/service"
"github.com/tnb-labs/panel/pkg/io"
"github.com/tnb-labs/panel/pkg/systemctl"
"github.com/tnborg/panel/internal/service"
"github.com/tnborg/panel/pkg/io"
"github.com/tnborg/panel/pkg/systemctl"
)
type App struct{}
+14 -11
View File
@@ -10,15 +10,15 @@ import (
"github.com/leonelquinteros/gotext"
"github.com/spf13/cast"
"github.com/tnb-labs/panel/internal/app"
"github.com/tnb-labs/panel/internal/biz"
"github.com/tnb-labs/panel/internal/service"
"github.com/tnb-labs/panel/pkg/db"
"github.com/tnb-labs/panel/pkg/io"
"github.com/tnb-labs/panel/pkg/shell"
"github.com/tnb-labs/panel/pkg/systemctl"
"github.com/tnb-labs/panel/pkg/tools"
"github.com/tnb-labs/panel/pkg/types"
"github.com/tnborg/panel/internal/app"
"github.com/tnborg/panel/internal/biz"
"github.com/tnborg/panel/internal/service"
"github.com/tnborg/panel/pkg/db"
"github.com/tnborg/panel/pkg/io"
"github.com/tnborg/panel/pkg/shell"
"github.com/tnborg/panel/pkg/systemctl"
"github.com/tnborg/panel/pkg/tools"
"github.com/tnborg/panel/pkg/types"
)
type App struct {
@@ -104,7 +104,10 @@ func (s *App) Load(w http.ResponseWriter, r *http.Request) {
service.Error(w, http.StatusInternalServerError, s.t.Get("failed to get MySQL status: %v", err))
return
}
_ = os.Unsetenv("MYSQL_PWD")
if err = os.Unsetenv("MYSQL_PWD"); err != nil {
service.Error(w, http.StatusInternalServerError, s.t.Get("failed to unset MYSQL_PWD env: %v", err))
return
}
var load []map[string]string
expressions := []struct {
@@ -173,7 +176,7 @@ func (s *App) SlowLog(w http.ResponseWriter, r *http.Request) {
// ClearSlowLog 清空慢查询日志
func (s *App) ClearSlowLog(w http.ResponseWriter, r *http.Request) {
if _, err := shell.Execf("echo '' > %s/server/mysql/mysql-slow.log", app.Root); err != nil {
if _, err := shell.Execf("cat /dev/null > %s/server/mysql/mysql-slow.log", app.Root); err != nil {
service.Error(w, http.StatusInternalServerError, "%v", err)
return
}
+8 -8
View File
@@ -11,13 +11,13 @@ import (
"github.com/leonelquinteros/gotext"
"github.com/spf13/cast"
"github.com/tnb-labs/panel/internal/app"
"github.com/tnb-labs/panel/internal/service"
"github.com/tnb-labs/panel/pkg/io"
"github.com/tnb-labs/panel/pkg/shell"
"github.com/tnb-labs/panel/pkg/systemctl"
"github.com/tnb-labs/panel/pkg/tools"
"github.com/tnb-labs/panel/pkg/types"
"github.com/tnborg/panel/internal/app"
"github.com/tnborg/panel/internal/service"
"github.com/tnborg/panel/pkg/io"
"github.com/tnborg/panel/pkg/shell"
"github.com/tnborg/panel/pkg/systemctl"
"github.com/tnborg/panel/pkg/tools"
"github.com/tnborg/panel/pkg/types"
)
type App struct {
@@ -74,7 +74,7 @@ func (s *App) ErrorLog(w http.ResponseWriter, r *http.Request) {
}
func (s *App) ClearErrorLog(w http.ResponseWriter, r *http.Request) {
if _, err := shell.Execf("echo '' > %s/%s", app.Root, "wwwlogs/nginx-error.log"); err != nil {
if _, err := shell.Execf("cat /dev/null > %s/%s", app.Root, "wwwlogs/nginx-error.log"); err != nil {
service.Error(w, http.StatusInternalServerError, "%v", err)
return
}
+12 -12
View File
@@ -13,12 +13,12 @@ import (
"github.com/leonelquinteros/gotext"
"github.com/spf13/cast"
"github.com/tnb-labs/panel/internal/app"
"github.com/tnb-labs/panel/internal/biz"
"github.com/tnb-labs/panel/internal/service"
"github.com/tnb-labs/panel/pkg/io"
"github.com/tnb-labs/panel/pkg/shell"
"github.com/tnb-labs/panel/pkg/types"
"github.com/tnborg/panel/internal/app"
"github.com/tnborg/panel/internal/biz"
"github.com/tnborg/panel/internal/service"
"github.com/tnborg/panel/pkg/io"
"github.com/tnborg/panel/pkg/shell"
"github.com/tnborg/panel/pkg/types"
)
type App struct {
@@ -178,7 +178,7 @@ func (s *App) SlowLog(w http.ResponseWriter, r *http.Request) {
}
func (s *App) ClearErrorLog(w http.ResponseWriter, r *http.Request) {
if _, err := shell.Execf("echo '' > %s/server/php/%d/var/log/php-fpm.log", app.Root, s.version); err != nil {
if _, err := shell.Execf("cat /dev/null > %s/server/php/%d/var/log/php-fpm.log", app.Root, s.version); err != nil {
service.Error(w, http.StatusInternalServerError, "%v", err)
return
}
@@ -187,7 +187,7 @@ func (s *App) ClearErrorLog(w http.ResponseWriter, r *http.Request) {
}
func (s *App) ClearSlowLog(w http.ResponseWriter, r *http.Request) {
if _, err := shell.Execf("echo '' > %s/server/php/%d/var/log/slow.log", app.Root, s.version); err != nil {
if _, err := shell.Execf("cat /dev/null > %s/server/php/%d/var/log/slow.log", app.Root, s.version); err != nil {
service.Error(w, http.StatusInternalServerError, "%v", err)
return
}
@@ -230,10 +230,10 @@ func (s *App) InstallExtension(w http.ResponseWriter, r *http.Request) {
return
}
cmd := fmt.Sprintf(`curl -fsLm 10 --retry 3 'https://dl.cdn.haozi.net/panel/php_exts/%s.sh' | bash -s -- 'install' '%d' >> '/tmp/%s.log' 2>&1`, url.PathEscape(req.Slug), s.version, req.Slug)
cmd := fmt.Sprintf(`curl -sSLm 10 --retry 3 'https://dl.cdn.haozi.net/panel/php_exts/%s.sh' | bash -s -- 'install' '%d' >> '/tmp/%s.log' 2>&1`, url.PathEscape(req.Slug), s.version, req.Slug)
officials := []string{"fileinfo", "exif", "imap", "pgsql", "pdo_pgsql", "zip", "bz2", "readline", "snmp", "ldap", "enchant", "pspell", "calendar", "gmp", "sysvmsg", "sysvsem", "sysvshm", "xsl", "intl", "gettext"}
if slices.Contains(officials, req.Slug) {
cmd = fmt.Sprintf(`curl -fsLm 10 --retry 3 'https://dl.cdn.haozi.net/panel/php_exts/official.sh' | bash -s -- 'install' '%d' '%s' >> '/tmp/%s.log' 2>&1`, s.version, req.Slug, req.Slug)
cmd = fmt.Sprintf(`curl -sSLm 10 --retry 3 'https://dl.cdn.haozi.net/panel/php_exts/official.sh' | bash -s -- 'install' '%d' '%s' >> '/tmp/%s.log' 2>&1`, s.version, req.Slug, req.Slug)
}
task := new(biz.Task)
@@ -261,10 +261,10 @@ func (s *App) UninstallExtension(w http.ResponseWriter, r *http.Request) {
return
}
cmd := fmt.Sprintf(`curl -fsLm 10 --retry 3 'https://dl.cdn.haozi.net/panel/php_exts/%s.sh' | bash -s -- 'uninstall' '%d' >> '/tmp/%s.log' 2>&1`, url.PathEscape(req.Slug), s.version, req.Slug)
cmd := fmt.Sprintf(`curl -sSLm 10 --retry 3 'https://dl.cdn.haozi.net/panel/php_exts/%s.sh' | bash -s -- 'uninstall' '%d' >> '/tmp/%s.log' 2>&1`, url.PathEscape(req.Slug), s.version, req.Slug)
officials := []string{"fileinfo", "exif", "imap", "pgsql", "pdo_pgsql", "zip", "bz2", "readline", "snmp", "ldap", "enchant", "pspell", "calendar", "gmp", "sysvmsg", "sysvsem", "sysvshm", "xsl", "intl", "gettext"}
if slices.Contains(officials, req.Slug) {
cmd = fmt.Sprintf(`curl -fsLm 10 --retry 3 'https://dl.cdn.haozi.net/panel/php_exts/official.sh' | bash -s -- 'uninstall' '%d' '%s' >> '/tmp/%s.log' 2>&1`, s.version, req.Slug, req.Slug)
cmd = fmt.Sprintf(`curl -sSLm 10 --retry 3 'https://dl.cdn.haozi.net/panel/php_exts/official.sh' | bash -s -- 'uninstall' '%d' '%s' >> '/tmp/%s.log' 2>&1`, s.version, req.Slug, req.Slug)
}
task := new(biz.Task)
+2 -2
View File
@@ -4,8 +4,8 @@ import (
"github.com/go-chi/chi/v5"
"github.com/leonelquinteros/gotext"
"github.com/tnb-labs/panel/internal/apps/php"
"github.com/tnb-labs/panel/internal/biz"
"github.com/tnborg/panel/internal/apps/php"
"github.com/tnborg/panel/internal/biz"
)
type App struct {
+2 -2
View File
@@ -4,8 +4,8 @@ import (
"github.com/go-chi/chi/v5"
"github.com/leonelquinteros/gotext"
"github.com/tnb-labs/panel/internal/apps/php"
"github.com/tnb-labs/panel/internal/biz"
"github.com/tnborg/panel/internal/apps/php"
"github.com/tnborg/panel/internal/biz"
)
type App struct {
+2 -2
View File
@@ -4,8 +4,8 @@ import (
"github.com/go-chi/chi/v5"
"github.com/leonelquinteros/gotext"
"github.com/tnb-labs/panel/internal/apps/php"
"github.com/tnb-labs/panel/internal/biz"
"github.com/tnborg/panel/internal/apps/php"
"github.com/tnborg/panel/internal/biz"
)
type App struct {
+2 -2
View File
@@ -4,8 +4,8 @@ import (
"github.com/go-chi/chi/v5"
"github.com/leonelquinteros/gotext"
"github.com/tnb-labs/panel/internal/apps/php"
"github.com/tnb-labs/panel/internal/biz"
"github.com/tnborg/panel/internal/apps/php"
"github.com/tnborg/panel/internal/biz"
)
type App struct {
+2 -2
View File
@@ -4,8 +4,8 @@ import (
"github.com/go-chi/chi/v5"
"github.com/leonelquinteros/gotext"
"github.com/tnb-labs/panel/internal/apps/php"
"github.com/tnb-labs/panel/internal/biz"
"github.com/tnborg/panel/internal/apps/php"
"github.com/tnborg/panel/internal/biz"
)
type App struct {
+2 -2
View File
@@ -4,8 +4,8 @@ import (
"github.com/go-chi/chi/v5"
"github.com/leonelquinteros/gotext"
"github.com/tnb-labs/panel/internal/apps/php"
"github.com/tnb-labs/panel/internal/biz"
"github.com/tnborg/panel/internal/apps/php"
"github.com/tnborg/panel/internal/biz"
)
type App struct {
+7 -7
View File
@@ -8,16 +8,16 @@ import (
"strings"
"github.com/go-chi/chi/v5"
"github.com/go-rat/chix"
"github.com/leonelquinteros/gotext"
"github.com/libtnb/chix"
"github.com/spf13/cast"
"github.com/tnb-labs/panel/internal/app"
"github.com/tnb-labs/panel/internal/service"
"github.com/tnb-labs/panel/pkg/firewall"
"github.com/tnb-labs/panel/pkg/io"
"github.com/tnb-labs/panel/pkg/shell"
"github.com/tnb-labs/panel/pkg/systemctl"
"github.com/tnborg/panel/internal/app"
"github.com/tnborg/panel/internal/service"
"github.com/tnborg/panel/pkg/firewall"
"github.com/tnborg/panel/pkg/io"
"github.com/tnborg/panel/pkg/shell"
"github.com/tnborg/panel/pkg/systemctl"
)
type App struct {
+3 -3
View File
@@ -5,9 +5,9 @@ import (
"github.com/go-chi/chi/v5"
"github.com/tnb-labs/panel/internal/service"
"github.com/tnb-labs/panel/pkg/io"
"github.com/tnb-labs/panel/pkg/systemctl"
"github.com/tnborg/panel/internal/service"
"github.com/tnborg/panel/pkg/io"
"github.com/tnborg/panel/pkg/systemctl"
)
type App struct{}
+6 -6
View File
@@ -8,12 +8,12 @@ import (
"github.com/go-chi/chi/v5"
"github.com/leonelquinteros/gotext"
"github.com/tnb-labs/panel/internal/app"
"github.com/tnb-labs/panel/internal/service"
"github.com/tnb-labs/panel/pkg/io"
"github.com/tnb-labs/panel/pkg/shell"
"github.com/tnb-labs/panel/pkg/systemctl"
"github.com/tnb-labs/panel/pkg/types"
"github.com/tnborg/panel/internal/app"
"github.com/tnborg/panel/internal/service"
"github.com/tnborg/panel/pkg/io"
"github.com/tnborg/panel/pkg/shell"
"github.com/tnborg/panel/pkg/systemctl"
"github.com/tnborg/panel/pkg/types"
)
type App struct {
+7 -15
View File
@@ -6,16 +6,16 @@ import (
"strings"
"github.com/go-chi/chi/v5"
"github.com/go-rat/chix"
"github.com/leonelquinteros/gotext"
"github.com/libtnb/chix"
"github.com/spf13/cast"
"github.com/tnb-labs/panel/internal/app"
"github.com/tnb-labs/panel/internal/service"
"github.com/tnb-labs/panel/pkg/firewall"
"github.com/tnb-labs/panel/pkg/io"
"github.com/tnb-labs/panel/pkg/shell"
"github.com/tnb-labs/panel/pkg/systemctl"
"github.com/tnborg/panel/internal/app"
"github.com/tnborg/panel/internal/service"
"github.com/tnborg/panel/pkg/firewall"
"github.com/tnborg/panel/pkg/io"
"github.com/tnborg/panel/pkg/shell"
"github.com/tnborg/panel/pkg/systemctl"
)
type App struct {
@@ -85,14 +85,6 @@ func (s *App) Create(w http.ResponseWriter, r *http.Request) {
return
}
if err = io.Chmod(req.Path, 0755); err != nil {
service.Error(w, http.StatusUnprocessableEntity, "%v", err)
return
}
if err = io.Chown(req.Path, "www", "www"); err != nil {
service.Error(w, http.StatusUnprocessableEntity, "%v", err)
return
}
if _, err = shell.Execf(`yes '%s' | pure-pw useradd '%s' -u www -g www -d '%s'`, req.Password, req.Username, req.Path); err != nil {
service.Error(w, http.StatusInternalServerError, "%v", err)
return
+6 -6
View File
@@ -9,12 +9,12 @@ import (
"github.com/go-chi/chi/v5"
"github.com/leonelquinteros/gotext"
"github.com/tnb-labs/panel/internal/app"
"github.com/tnb-labs/panel/internal/service"
"github.com/tnb-labs/panel/pkg/io"
"github.com/tnb-labs/panel/pkg/shell"
"github.com/tnb-labs/panel/pkg/systemctl"
"github.com/tnb-labs/panel/pkg/types"
"github.com/tnborg/panel/internal/app"
"github.com/tnborg/panel/internal/service"
"github.com/tnborg/panel/pkg/io"
"github.com/tnborg/panel/pkg/shell"
"github.com/tnborg/panel/pkg/systemctl"
"github.com/tnborg/panel/pkg/types"
)
type App struct {
+6 -6
View File
@@ -7,14 +7,14 @@ import (
"strings"
"github.com/go-chi/chi/v5"
"github.com/go-rat/chix"
"github.com/go-rat/utils/str"
"github.com/leonelquinteros/gotext"
"github.com/libtnb/chix"
"github.com/libtnb/utils/str"
"github.com/tnb-labs/panel/internal/service"
"github.com/tnb-labs/panel/pkg/io"
"github.com/tnb-labs/panel/pkg/shell"
"github.com/tnb-labs/panel/pkg/systemctl"
"github.com/tnborg/panel/internal/service"
"github.com/tnborg/panel/pkg/io"
"github.com/tnborg/panel/pkg/shell"
"github.com/tnborg/panel/pkg/systemctl"
)
type App struct {
+4 -4
View File
@@ -8,13 +8,13 @@ import (
"time"
"github.com/go-chi/chi/v5"
"github.com/go-rat/chix"
"github.com/leonelquinteros/gotext"
"github.com/libtnb/chix"
"github.com/spf13/cast"
"github.com/tnb-labs/panel/internal/service"
"github.com/tnb-labs/panel/pkg/io"
"github.com/tnb-labs/panel/pkg/shell"
"github.com/tnborg/panel/internal/service"
"github.com/tnborg/panel/pkg/io"
"github.com/tnborg/panel/pkg/shell"
)
type App struct {
+8 -8
View File
@@ -5,15 +5,15 @@ import (
"strings"
"github.com/go-chi/chi/v5"
"github.com/go-rat/chix"
"github.com/leonelquinteros/gotext"
"github.com/libtnb/chix"
"github.com/spf13/cast"
"github.com/tnb-labs/panel/internal/service"
"github.com/tnb-labs/panel/pkg/io"
"github.com/tnb-labs/panel/pkg/os"
"github.com/tnb-labs/panel/pkg/shell"
"github.com/tnb-labs/panel/pkg/systemctl"
"github.com/tnborg/panel/internal/service"
"github.com/tnborg/panel/pkg/io"
"github.com/tnborg/panel/pkg/os"
"github.com/tnborg/panel/pkg/shell"
"github.com/tnborg/panel/pkg/systemctl"
)
type App struct {
@@ -59,7 +59,7 @@ func (s *App) Service(w http.ResponseWriter, r *http.Request) {
// ClearLog 清空日志
func (s *App) ClearLog(w http.ResponseWriter, r *http.Request) {
if _, err := shell.Execf(`echo "" > /var/log/supervisor/supervisord.log`); err != nil {
if _, err := shell.Execf(`cat /dev/null > /var/log/supervisor/supervisord.log`); err != nil {
service.Error(w, http.StatusInternalServerError, "%v", err)
return
}
@@ -242,7 +242,7 @@ func (s *App) ClearProcessLog(w http.ResponseWriter, r *http.Request) {
return
}
if _, err = shell.Execf(`echo "" > '%s'`, logPath); err != nil {
if _, err = shell.Execf(`cat /dev/null > '%s'`, logPath); err != nil {
service.Error(w, http.StatusInternalServerError, "%v", err)
return
}
+1 -1
View File
@@ -3,7 +3,7 @@ package biz
import (
"time"
"github.com/tnb-labs/panel/pkg/api"
"github.com/tnborg/panel/pkg/api"
)
type App struct {
+1 -1
View File
@@ -1,6 +1,6 @@
package biz
import "github.com/tnb-labs/panel/pkg/types"
import "github.com/tnborg/panel/pkg/types"
type BackupType string
+3 -3
View File
@@ -3,9 +3,9 @@ package biz
import (
"time"
"github.com/tnb-labs/panel/internal/http/request"
"github.com/tnb-labs/panel/pkg/acme"
"github.com/tnb-labs/panel/pkg/types"
"github.com/tnborg/panel/internal/http/request"
"github.com/tnborg/panel/pkg/acme"
"github.com/tnborg/panel/pkg/types"
)
type Cert struct {
+1 -1
View File
@@ -3,7 +3,7 @@ package biz
import (
"time"
"github.com/tnb-labs/panel/internal/http/request"
"github.com/tnborg/panel/internal/http/request"
)
type CertAccount struct {
+2 -2
View File
@@ -3,8 +3,8 @@ package biz
import (
"time"
"github.com/tnb-labs/panel/internal/http/request"
"github.com/tnb-labs/panel/pkg/acme"
"github.com/tnborg/panel/internal/http/request"
"github.com/tnborg/panel/pkg/acme"
)
type CertDNS struct {
+2 -2
View File
@@ -1,8 +1,8 @@
package biz
import (
"github.com/tnb-labs/panel/internal/http/request"
"github.com/tnb-labs/panel/pkg/types"
"github.com/tnborg/panel/internal/http/request"
"github.com/tnborg/panel/pkg/types"
)
type ContainerRepo interface {
+1 -1
View File
@@ -1,6 +1,6 @@
package biz
import "github.com/tnb-labs/panel/pkg/types"
import "github.com/tnborg/panel/pkg/types"
type ContainerComposeRepo interface {
List() ([]types.ContainerCompose, error)
+2 -2
View File
@@ -1,8 +1,8 @@
package biz
import (
"github.com/tnb-labs/panel/internal/http/request"
"github.com/tnb-labs/panel/pkg/types"
"github.com/tnborg/panel/internal/http/request"
"github.com/tnborg/panel/pkg/types"
)
type ContainerImageRepo interface {
+2 -2
View File
@@ -1,8 +1,8 @@
package biz
import (
"github.com/tnb-labs/panel/internal/http/request"
"github.com/tnb-labs/panel/pkg/types"
"github.com/tnborg/panel/internal/http/request"
"github.com/tnborg/panel/pkg/types"
)
type ContainerNetworkRepo interface {
+2 -2
View File
@@ -1,8 +1,8 @@
package biz
import (
"github.com/tnb-labs/panel/internal/http/request"
"github.com/tnb-labs/panel/pkg/types"
"github.com/tnborg/panel/internal/http/request"
"github.com/tnborg/panel/pkg/types"
)
type ContainerVolumeRepo interface {
+1 -1
View File
@@ -3,7 +3,7 @@ package biz
import (
"time"
"github.com/tnb-labs/panel/internal/http/request"
"github.com/tnborg/panel/internal/http/request"
)
type Cron struct {
+1 -1
View File
@@ -1,7 +1,7 @@
package biz
import (
"github.com/tnb-labs/panel/internal/http/request"
"github.com/tnborg/panel/internal/http/request"
)
type DatabaseType string
+3 -3
View File
@@ -3,11 +3,11 @@ package biz
import (
"time"
"github.com/go-rat/utils/crypt"
"github.com/libtnb/utils/crypt"
"gorm.io/gorm"
"github.com/tnb-labs/panel/internal/app"
"github.com/tnb-labs/panel/internal/http/request"
"github.com/tnborg/panel/internal/app"
"github.com/tnborg/panel/internal/http/request"
)
type DatabaseServerStatus string
+3 -3
View File
@@ -3,11 +3,11 @@ package biz
import (
"time"
"github.com/go-rat/utils/crypt"
"github.com/libtnb/utils/crypt"
"gorm.io/gorm"
"github.com/tnb-labs/panel/internal/app"
"github.com/tnb-labs/panel/internal/http/request"
"github.com/tnborg/panel/internal/app"
"github.com/tnborg/panel/internal/http/request"
)
type DatabaseUserStatus string
+2 -2
View File
@@ -3,8 +3,8 @@ package biz
import (
"time"
"github.com/tnb-labs/panel/internal/http/request"
"github.com/tnb-labs/panel/pkg/types"
"github.com/tnborg/panel/internal/http/request"
"github.com/tnborg/panel/pkg/types"
)
type Monitor struct {
+1 -1
View File
@@ -3,7 +3,7 @@ package biz
import (
"time"
"github.com/tnb-labs/panel/internal/http/request"
"github.com/tnborg/panel/internal/http/request"
)
type SettingKey string
+4 -4
View File
@@ -3,12 +3,12 @@ package biz
import (
"time"
"github.com/go-rat/utils/crypt"
"github.com/libtnb/utils/crypt"
"gorm.io/gorm"
"github.com/tnb-labs/panel/internal/app"
"github.com/tnb-labs/panel/internal/http/request"
"github.com/tnb-labs/panel/pkg/ssh"
"github.com/tnborg/panel/internal/app"
"github.com/tnborg/panel/internal/http/request"
"github.com/tnborg/panel/pkg/ssh"
)
type SSH struct {
+1
View File
@@ -24,6 +24,7 @@ type UserRepo interface {
List(page, limit uint) ([]*User, int64, error)
Get(id uint) (*User, error)
Create(username, password, email string) (*User, error)
UpdateUsername(id uint, username string) error
UpdatePassword(id uint, password string) error
UpdateEmail(id uint, email string) error
Delete(id uint) error
+2 -2
View File
@@ -4,10 +4,10 @@ import (
"net/http"
"time"
"github.com/go-rat/utils/crypt"
"github.com/libtnb/utils/crypt"
"gorm.io/gorm"
"github.com/tnb-labs/panel/internal/app"
"github.com/tnborg/panel/internal/app"
)
type UserToken struct {
+4 -2
View File
@@ -4,8 +4,8 @@ import (
"context"
"time"
"github.com/tnb-labs/panel/internal/http/request"
"github.com/tnb-labs/panel/pkg/types"
"github.com/tnborg/panel/internal/http/request"
"github.com/tnborg/panel/pkg/types"
)
type Website struct {
@@ -19,6 +19,8 @@ type Website struct {
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
CertExpire string `gorm:"-:all" json:"cert_expire"` // 仅显示
Cert *Cert `gorm:"foreignKey:WebsiteID" json:"cert"`
}
+25 -29
View File
@@ -1,36 +1,33 @@
package bootstrap
import (
"github.com/tnb-labs/panel/internal/apps/benchmark"
"github.com/tnb-labs/panel/internal/apps/codeserver"
"github.com/tnb-labs/panel/internal/apps/docker"
"github.com/tnb-labs/panel/internal/apps/fail2ban"
"github.com/tnb-labs/panel/internal/apps/frp"
"github.com/tnb-labs/panel/internal/apps/gitea"
"github.com/tnb-labs/panel/internal/apps/memcached"
"github.com/tnb-labs/panel/internal/apps/minio"
"github.com/tnb-labs/panel/internal/apps/mysql"
"github.com/tnb-labs/panel/internal/apps/nginx"
"github.com/tnb-labs/panel/internal/apps/php74"
"github.com/tnb-labs/panel/internal/apps/php80"
"github.com/tnb-labs/panel/internal/apps/php81"
"github.com/tnb-labs/panel/internal/apps/php82"
"github.com/tnb-labs/panel/internal/apps/php83"
"github.com/tnb-labs/panel/internal/apps/php84"
"github.com/tnb-labs/panel/internal/apps/phpmyadmin"
"github.com/tnb-labs/panel/internal/apps/podman"
"github.com/tnb-labs/panel/internal/apps/postgresql"
"github.com/tnb-labs/panel/internal/apps/pureftpd"
"github.com/tnb-labs/panel/internal/apps/redis"
"github.com/tnb-labs/panel/internal/apps/rsync"
"github.com/tnb-labs/panel/internal/apps/s3fs"
"github.com/tnb-labs/panel/internal/apps/supervisor"
"github.com/tnb-labs/panel/internal/apps/toolbox"
"github.com/tnb-labs/panel/pkg/apploader"
"github.com/tnborg/panel/internal/apps/codeserver"
"github.com/tnborg/panel/internal/apps/docker"
"github.com/tnborg/panel/internal/apps/fail2ban"
"github.com/tnborg/panel/internal/apps/frp"
"github.com/tnborg/panel/internal/apps/gitea"
"github.com/tnborg/panel/internal/apps/memcached"
"github.com/tnborg/panel/internal/apps/minio"
"github.com/tnborg/panel/internal/apps/mysql"
"github.com/tnborg/panel/internal/apps/nginx"
"github.com/tnborg/panel/internal/apps/php74"
"github.com/tnborg/panel/internal/apps/php80"
"github.com/tnborg/panel/internal/apps/php81"
"github.com/tnborg/panel/internal/apps/php82"
"github.com/tnborg/panel/internal/apps/php83"
"github.com/tnborg/panel/internal/apps/php84"
"github.com/tnborg/panel/internal/apps/phpmyadmin"
"github.com/tnborg/panel/internal/apps/podman"
"github.com/tnborg/panel/internal/apps/postgresql"
"github.com/tnborg/panel/internal/apps/pureftpd"
"github.com/tnborg/panel/internal/apps/redis"
"github.com/tnborg/panel/internal/apps/rsync"
"github.com/tnborg/panel/internal/apps/s3fs"
"github.com/tnborg/panel/internal/apps/supervisor"
"github.com/tnborg/panel/pkg/apploader"
)
func NewLoader(
benchmark *benchmark.App,
codeserver *codeserver.App,
docker *docker.App,
fail2ban *fail2ban.App,
@@ -54,9 +51,8 @@ func NewLoader(
rsync *rsync.App,
s3fs *s3fs.App,
supervisor *supervisor.App,
toolbox *toolbox.App,
) *apploader.Loader {
loader := new(apploader.Loader)
loader.Add(benchmark, codeserver, docker, fail2ban, frp, gitea, memcached, minio, mysql, nginx, php74, php80, php81, php82, php83, php84, phpmyadmin, podman, postgresql, pureftpd, redis, rsync, s3fs, supervisor, toolbox)
loader.Add(codeserver, docker, fail2ban, frp, gitea, memcached, minio, mysql, nginx, php74, php80, php81, php82, php83, php84, phpmyadmin, podman, postgresql, pureftpd, redis, rsync, s3fs, supervisor)
return loader
}
+2 -2
View File
@@ -6,8 +6,8 @@ import (
"github.com/leonelquinteros/gotext"
"github.com/urfave/cli/v3"
"github.com/tnb-labs/panel/internal/app"
"github.com/tnb-labs/panel/internal/route"
"github.com/tnborg/panel/internal/app"
"github.com/tnborg/panel/internal/route"
)
func NewCli(t *gotext.Locale, cmd *route.Cli) *cli.Command {
+2 -2
View File
@@ -8,8 +8,8 @@ import (
"github.com/knadh/koanf/providers/file"
"github.com/knadh/koanf/v2"
"github.com/tnb-labs/panel/internal/app"
"github.com/tnb-labs/panel/pkg/io"
"github.com/tnborg/panel/internal/app"
"github.com/tnborg/panel/pkg/io"
)
func NewConf() (*koanf.Koanf, error) {
+2 -2
View File
@@ -6,8 +6,8 @@ import (
"github.com/knadh/koanf/v2"
"github.com/robfig/cron/v3"
"github.com/tnb-labs/panel/internal/job"
pkgcron "github.com/tnb-labs/panel/pkg/cron"
"github.com/tnborg/panel/internal/job"
pkgcron "github.com/tnborg/panel/pkg/cron"
)
func NewCron(conf *koanf.Koanf, log *slog.Logger, jobs *job.Jobs) (*cron.Cron, error) {
+3 -3
View File
@@ -11,13 +11,13 @@ import (
sloggorm "github.com/orandin/slog-gorm"
"gorm.io/gorm"
"github.com/tnb-labs/panel/internal/app"
"github.com/tnb-labs/panel/internal/migration"
"github.com/tnborg/panel/internal/app"
"github.com/tnborg/panel/internal/migration"
)
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,
+2 -2
View File
@@ -10,8 +10,8 @@ import (
"github.com/knadh/koanf/v2"
"github.com/leonelquinteros/gotext"
"github.com/tnb-labs/panel/internal/http/middleware"
"github.com/tnb-labs/panel/internal/route"
"github.com/tnborg/panel/internal/http/middleware"
"github.com/tnborg/panel/internal/route"
)
func NewRouter(t *gotext.Locale, middlewares *middleware.Middlewares, http *route.Http, ws *route.Ws) (*chi.Mux, error) {
+1 -1
View File
@@ -7,7 +7,7 @@ import (
"github.com/knadh/koanf/v2"
"gopkg.in/natefinch/lumberjack.v2"
"github.com/tnb-labs/panel/internal/app"
"github.com/tnborg/panel/internal/app"
)
func NewLog(conf *koanf.Koanf) *slog.Logger {
+1 -1
View File
@@ -1,7 +1,7 @@
package bootstrap
import (
"github.com/tnb-labs/panel/pkg/queue"
"github.com/tnborg/panel/pkg/queue"
)
func NewQueue() *queue.Queue {
+2 -2
View File
@@ -1,9 +1,9 @@
package bootstrap
import (
"github.com/go-rat/gormstore"
"github.com/go-rat/sessions"
"github.com/knadh/koanf/v2"
"github.com/libtnb/gormstore"
"github.com/libtnb/sessions"
"gorm.io/gorm"
)
+1 -1
View File
@@ -4,7 +4,7 @@ import (
"github.com/knadh/koanf/v2"
"github.com/leonelquinteros/gotext"
"github.com/tnb-labs/panel/pkg/embed"
"github.com/tnborg/panel/pkg/embed"
)
func NewT(conf *koanf.Koanf) (*gotext.Locale, error) {
+1 -1
View File
@@ -8,7 +8,7 @@ import (
"github.com/knadh/koanf/v2"
"gorm.io/gorm"
"github.com/tnb-labs/panel/internal/http/rule"
"github.com/tnborg/panel/internal/http/rule"
)
// NewValidator just for register global rules
+18 -15
View File
@@ -7,28 +7,31 @@ import (
"slices"
"github.com/expr-lang/expr"
"github.com/go-rat/utils/collect"
"github.com/hashicorp/go-version"
"github.com/knadh/koanf/v2"
"github.com/leonelquinteros/gotext"
"github.com/libtnb/utils/collect"
"github.com/spf13/cast"
"gorm.io/gorm"
"github.com/tnb-labs/panel/internal/app"
"github.com/tnb-labs/panel/internal/biz"
"github.com/tnb-labs/panel/pkg/api"
"github.com/tnb-labs/panel/pkg/shell"
"github.com/tnborg/panel/internal/app"
"github.com/tnborg/panel/internal/biz"
"github.com/tnborg/panel/pkg/api"
"github.com/tnborg/panel/pkg/shell"
)
type appRepo struct {
t *gotext.Locale
conf *koanf.Koanf
db *gorm.DB
cache biz.CacheRepo
task biz.TaskRepo
}
func NewAppRepo(t *gotext.Locale, db *gorm.DB, cache biz.CacheRepo, task biz.TaskRepo) biz.AppRepo {
func NewAppRepo(t *gotext.Locale, conf *koanf.Koanf, db *gorm.DB, cache biz.CacheRepo, task biz.TaskRepo) biz.AppRepo {
return &appRepo{
t: t,
conf: conf,
db: db,
cache: cache,
task: task,
@@ -166,7 +169,7 @@ func (r *appRepo) Install(channel, slug string) error {
continue
}
if ch.Slug == channel {
if vs.GreaterThan(panel) {
if vs.GreaterThan(panel) && !r.conf.Bool("app.debug") {
return errors.New(r.t.Get("app %s requires panel version %s, current version %s", item.Name, ch.Panel, app.Version))
}
shellUrl = ch.Install
@@ -184,13 +187,13 @@ func (r *appRepo) Install(channel, slug string) error {
}
if app.IsCli {
return shell.ExecfWithOutput(`curl -fsLm 10 --retry 3 "%s" | bash -s -- "%s" "%s"`, shellUrl, shellChannel, shellVersion)
return shell.ExecfWithOutput(`curl -sSLm 10 --retry 3 "%s" | bash -s -- "%s" "%s"`, shellUrl, shellChannel, shellVersion)
}
task := new(biz.Task)
task.Name = r.t.Get("Install app %s", item.Name)
task.Status = biz.TaskStatusWaiting
task.Shell = fmt.Sprintf(`curl -fsLm 10 --retry 3 "%s" | bash -s -- "%s" "%s" >> /tmp/%s.log 2>&1`, shellUrl, shellChannel, shellVersion, item.Slug)
task.Shell = fmt.Sprintf(`curl -sSLm 10 --retry 3 "%s" | bash -s -- "%s" "%s" >> /tmp/%s.log 2>&1`, shellUrl, shellChannel, shellVersion, item.Slug)
task.Log = "/tmp/" + item.Slug + ".log"
return r.task.Push(task)
@@ -221,7 +224,7 @@ func (r *appRepo) UnInstall(slug string) error {
continue
}
if ch.Slug == installed.Channel {
if vs.GreaterThan(panel) {
if vs.GreaterThan(panel) && !r.conf.Bool("app.debug") {
return errors.New(r.t.Get("app %s requires panel version %s, current version %s", item.Name, ch.Panel, app.Version))
}
shellUrl = ch.Uninstall
@@ -239,13 +242,13 @@ func (r *appRepo) UnInstall(slug string) error {
}
if app.IsCli {
return shell.ExecfWithOutput(`curl -fsLm 10 --retry 3 "%s" | bash -s -- "%s" "%s"`, shellUrl, shellChannel, shellVersion)
return shell.ExecfWithOutput(`curl -sSLm 10 --retry 3 "%s" | bash -s -- "%s" "%s"`, shellUrl, shellChannel, shellVersion)
}
task := new(biz.Task)
task.Name = r.t.Get("Uninstall app %s", item.Name)
task.Status = biz.TaskStatusWaiting
task.Shell = fmt.Sprintf(`curl -fsLm 10 --retry 3 "%s" | bash -s -- "%s" "%s" >> /tmp/%s.log 2>&1`, shellUrl, shellChannel, shellVersion, item.Slug)
task.Shell = fmt.Sprintf(`curl -sSLm 10 --retry 3 "%s" | bash -s -- "%s" "%s" >> /tmp/%s.log 2>&1`, shellUrl, shellChannel, shellVersion, item.Slug)
task.Log = "/tmp/" + item.Slug + ".log"
return r.task.Push(task)
@@ -276,7 +279,7 @@ func (r *appRepo) Update(slug string) error {
continue
}
if ch.Slug == installed.Channel {
if vs.GreaterThan(panel) {
if vs.GreaterThan(panel) && !r.conf.Bool("app.debug") {
return errors.New(r.t.Get("app %s requires panel version %s, current version %s", item.Name, ch.Panel, app.Version))
}
shellUrl = ch.Update
@@ -294,13 +297,13 @@ func (r *appRepo) Update(slug string) error {
}
if app.IsCli {
return shell.ExecfWithOutput(`curl -fsLm 10 --retry 3 "%s" | bash -s -- "%s" "%s"`, shellUrl, shellChannel, shellVersion)
return shell.ExecfWithOutput(`curl -sSLm 10 --retry 3 "%s" | bash -s -- "%s" "%s"`, shellUrl, shellChannel, shellVersion)
}
task := new(biz.Task)
task.Name = r.t.Get("Update app %s", item.Name)
task.Status = biz.TaskStatusWaiting
task.Shell = fmt.Sprintf(`curl -fsLm 10 --retry 3 "%s" | bash -s -- "%s" "%s" >> /tmp/%s.log 2>&1`, shellUrl, shellChannel, shellVersion, item.Slug)
task.Shell = fmt.Sprintf(`curl -sSLm 10 --retry 3 "%s" | bash -s -- "%s" "%s" >> /tmp/%s.log 2>&1`, shellUrl, shellChannel, shellVersion, item.Slug)
task.Log = "/tmp/" + item.Slug + ".log"
return r.task.Push(task)
+8 -8
View File
@@ -13,13 +13,13 @@ import (
"github.com/shirou/gopsutil/disk"
"gorm.io/gorm"
"github.com/tnb-labs/panel/internal/app"
"github.com/tnb-labs/panel/internal/biz"
"github.com/tnb-labs/panel/pkg/db"
"github.com/tnb-labs/panel/pkg/io"
"github.com/tnb-labs/panel/pkg/shell"
"github.com/tnb-labs/panel/pkg/tools"
"github.com/tnb-labs/panel/pkg/types"
"github.com/tnborg/panel/internal/app"
"github.com/tnborg/panel/internal/biz"
"github.com/tnborg/panel/pkg/db"
"github.com/tnborg/panel/pkg/io"
"github.com/tnborg/panel/pkg/shell"
"github.com/tnborg/panel/pkg/tools"
"github.com/tnborg/panel/pkg/types"
)
type backupRepo struct {
@@ -798,7 +798,7 @@ func (r *backupRepo) UpdatePanel(version, url, checksum string) error {
if app.IsCli {
fmt.Println(r.t.Get("|-Run post-update script..."))
}
if _, err := shell.Execf("curl -fsLm 10 https://dl.cdn.haozi.net/panel/auto_update.sh | bash"); err != nil {
if _, err := shell.Execf("curl -sSLm 10 https://dl.cdn.haozi.net/panel/auto_update.sh | bash"); err != nil {
return errors.New(r.t.Get("|-Run post-update script failed: %v", err))
}
if _, err := shell.Execf(`wget -O /etc/systemd/system/panel.service https://dl.cdn.haozi.net/panel/panel.service && sed -i "s|/www|%s|g" /etc/systemd/system/panel.service`, app.Root); err != nil {
+4 -4
View File
@@ -7,10 +7,10 @@ import (
"gorm.io/gorm"
"github.com/tnb-labs/panel/internal/app"
"github.com/tnb-labs/panel/internal/biz"
"github.com/tnb-labs/panel/pkg/api"
"github.com/tnb-labs/panel/pkg/apploader"
"github.com/tnborg/panel/internal/app"
"github.com/tnborg/panel/internal/biz"
"github.com/tnborg/panel/pkg/api"
"github.com/tnborg/panel/pkg/apploader"
)
type cacheRepo struct {
+10 -10
View File
@@ -13,15 +13,15 @@ import (
"github.com/leonelquinteros/gotext"
"gorm.io/gorm"
"github.com/tnb-labs/panel/internal/app"
"github.com/tnb-labs/panel/internal/biz"
"github.com/tnb-labs/panel/internal/http/request"
"github.com/tnb-labs/panel/pkg/acme"
pkgcert "github.com/tnb-labs/panel/pkg/cert"
"github.com/tnb-labs/panel/pkg/io"
"github.com/tnb-labs/panel/pkg/shell"
"github.com/tnb-labs/panel/pkg/systemctl"
"github.com/tnb-labs/panel/pkg/types"
"github.com/tnborg/panel/internal/app"
"github.com/tnborg/panel/internal/biz"
"github.com/tnborg/panel/internal/http/request"
"github.com/tnborg/panel/pkg/acme"
pkgcert "github.com/tnborg/panel/pkg/cert"
"github.com/tnborg/panel/pkg/io"
"github.com/tnborg/panel/pkg/shell"
"github.com/tnborg/panel/pkg/systemctl"
"github.com/tnborg/panel/pkg/types"
)
type certRepo struct {
@@ -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
+4 -4
View File
@@ -10,10 +10,10 @@ import (
"github.com/leonelquinteros/gotext"
"gorm.io/gorm"
"github.com/tnb-labs/panel/internal/biz"
"github.com/tnb-labs/panel/internal/http/request"
"github.com/tnb-labs/panel/pkg/acme"
"github.com/tnb-labs/panel/pkg/cert"
"github.com/tnborg/panel/internal/biz"
"github.com/tnborg/panel/internal/http/request"
"github.com/tnborg/panel/pkg/acme"
"github.com/tnborg/panel/pkg/cert"
)
type certAccountRepo struct {
+2 -2
View File
@@ -3,8 +3,8 @@ package data
import (
"gorm.io/gorm"
"github.com/tnb-labs/panel/internal/biz"
"github.com/tnb-labs/panel/internal/http/request"
"github.com/tnborg/panel/internal/biz"
"github.com/tnborg/panel/internal/http/request"
)
type certDNSRepo struct {
+5 -5
View File
@@ -8,11 +8,11 @@ import (
"github.com/go-resty/resty/v2"
"github.com/tnb-labs/panel/internal/biz"
"github.com/tnb-labs/panel/internal/http/request"
"github.com/tnb-labs/panel/pkg/shell"
"github.com/tnb-labs/panel/pkg/types"
"github.com/tnb-labs/panel/pkg/types/docker/container"
"github.com/tnborg/panel/internal/biz"
"github.com/tnborg/panel/internal/http/request"
"github.com/tnborg/panel/pkg/shell"
"github.com/tnborg/panel/pkg/types"
"github.com/tnborg/panel/pkg/types/docker/container"
)
type containerRepo struct {
+14 -5
View File
@@ -7,10 +7,10 @@ import (
"strings"
"time"
"github.com/tnb-labs/panel/internal/app"
"github.com/tnb-labs/panel/internal/biz"
"github.com/tnb-labs/panel/pkg/shell"
"github.com/tnb-labs/panel/pkg/types"
"github.com/tnborg/panel/internal/app"
"github.com/tnborg/panel/internal/biz"
"github.com/tnborg/panel/pkg/shell"
"github.com/tnborg/panel/pkg/types"
)
type containerComposeRepo struct{}
@@ -19,9 +19,11 @@ func NewContainerComposeRepo() biz.ContainerComposeRepo {
return &containerComposeRepo{}
}
// List 列出所有编排文件名
// List 列出所有编排
func (r *containerComposeRepo) List() ([]types.ContainerCompose, error) {
_ = os.Setenv("PODMAN_COMPOSE_WARNING_LOGS", "false") // 禁用 Podman Compose 的警告日志
raw, err := shell.Execf("docker compose ls -a --format json")
_ = os.Unsetenv("PODMAN_COMPOSE_WARNING_LOGS")
if err != nil {
return nil, err
}
@@ -142,19 +144,26 @@ func (r *containerComposeRepo) Up(name string, force bool) error {
if force {
cmd += " --pull always" // 强制拉取镜像
}
_ = os.Setenv("PODMAN_COMPOSE_WARNING_LOGS", "false") // 禁用 Podman Compose 的警告日志
_, err := shell.Execf(cmd, file)
_ = os.Unsetenv("PODMAN_COMPOSE_WARNING_LOGS")
return err
}
// Down 停止编排
func (r *containerComposeRepo) Down(name string) error {
file := filepath.Join(app.Root, "server", "compose", name, "docker-compose.yml")
_ = os.Setenv("PODMAN_COMPOSE_WARNING_LOGS", "false") // 禁用 Podman Compose 的警告日志
_, err := shell.Execf("docker compose -f %s down", file)
_ = os.Unsetenv("PODMAN_COMPOSE_WARNING_LOGS")
return err
}
// Remove 删除编排
func (r *containerComposeRepo) Remove(name string) error {
if err := r.Down(name); err != nil {
return err
}
dir := filepath.Join(app.Root, "server", "compose", name)
return os.RemoveAll(dir)
}
+6 -6
View File
@@ -8,12 +8,12 @@ import (
"github.com/go-resty/resty/v2"
"github.com/tnb-labs/panel/internal/biz"
"github.com/tnb-labs/panel/internal/http/request"
"github.com/tnb-labs/panel/pkg/shell"
"github.com/tnb-labs/panel/pkg/tools"
"github.com/tnb-labs/panel/pkg/types"
"github.com/tnb-labs/panel/pkg/types/docker/image"
"github.com/tnborg/panel/internal/biz"
"github.com/tnborg/panel/internal/http/request"
"github.com/tnborg/panel/pkg/shell"
"github.com/tnborg/panel/pkg/tools"
"github.com/tnborg/panel/pkg/types"
"github.com/tnborg/panel/pkg/types/docker/image"
)
type containerImageRepo struct {
+5 -5
View File
@@ -8,11 +8,11 @@ import (
"github.com/go-resty/resty/v2"
"github.com/tnb-labs/panel/internal/biz"
"github.com/tnb-labs/panel/internal/http/request"
"github.com/tnb-labs/panel/pkg/shell"
"github.com/tnb-labs/panel/pkg/types"
"github.com/tnb-labs/panel/pkg/types/docker/network"
"github.com/tnborg/panel/internal/biz"
"github.com/tnborg/panel/internal/http/request"
"github.com/tnborg/panel/pkg/shell"
"github.com/tnborg/panel/pkg/types"
"github.com/tnborg/panel/pkg/types/docker/network"
)
type containerNetworkRepo struct {
+6 -6
View File
@@ -8,12 +8,12 @@ import (
"github.com/go-resty/resty/v2"
"github.com/tnb-labs/panel/internal/biz"
"github.com/tnb-labs/panel/internal/http/request"
"github.com/tnb-labs/panel/pkg/shell"
"github.com/tnb-labs/panel/pkg/tools"
"github.com/tnb-labs/panel/pkg/types"
"github.com/tnb-labs/panel/pkg/types/docker/volume"
"github.com/tnborg/panel/internal/biz"
"github.com/tnborg/panel/internal/http/request"
"github.com/tnborg/panel/pkg/shell"
"github.com/tnborg/panel/pkg/tools"
"github.com/tnborg/panel/pkg/types"
"github.com/tnborg/panel/pkg/types/docker/volume"
)
type containerVolumeRepo struct {
+8 -9
View File
@@ -7,17 +7,17 @@ import (
"strconv"
"time"
"github.com/go-rat/utils/str"
"github.com/leonelquinteros/gotext"
"github.com/libtnb/utils/str"
"gorm.io/gorm"
"github.com/tnb-labs/panel/internal/app"
"github.com/tnb-labs/panel/internal/biz"
"github.com/tnb-labs/panel/internal/http/request"
"github.com/tnb-labs/panel/pkg/io"
"github.com/tnb-labs/panel/pkg/os"
"github.com/tnb-labs/panel/pkg/shell"
"github.com/tnb-labs/panel/pkg/systemctl"
"github.com/tnborg/panel/internal/app"
"github.com/tnborg/panel/internal/biz"
"github.com/tnborg/panel/internal/http/request"
"github.com/tnborg/panel/pkg/io"
"github.com/tnborg/panel/pkg/os"
"github.com/tnborg/panel/pkg/shell"
"github.com/tnborg/panel/pkg/systemctl"
)
type cronRepo struct {
@@ -66,7 +66,6 @@ export PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:$PATH
panel-cli backup website -n '%s' -p '%s'
panel-cli backup clear -t website -f '%s' -s '%d' -p '%s'
systemctl reload nginx
`, req.Target, req.BackupPath, req.Target, req.Save, req.BackupPath)
}
if req.BackupType == "mysql" || req.BackupType == "postgres" {
+3 -3
View File
@@ -8,9 +8,9 @@ import (
"github.com/leonelquinteros/gotext"
"gorm.io/gorm"
"github.com/tnb-labs/panel/internal/biz"
"github.com/tnb-labs/panel/internal/http/request"
"github.com/tnb-labs/panel/pkg/db"
"github.com/tnborg/panel/internal/biz"
"github.com/tnborg/panel/internal/http/request"
"github.com/tnborg/panel/pkg/db"
)
type databaseRepo struct {
+3 -3
View File
@@ -9,9 +9,9 @@ import (
"github.com/leonelquinteros/gotext"
"gorm.io/gorm"
"github.com/tnb-labs/panel/internal/biz"
"github.com/tnb-labs/panel/internal/http/request"
"github.com/tnb-labs/panel/pkg/db"
"github.com/tnborg/panel/internal/biz"
"github.com/tnborg/panel/internal/http/request"
"github.com/tnborg/panel/pkg/db"
)
type databaseServerRepo struct {
+15 -3
View File
@@ -7,9 +7,9 @@ import (
"github.com/leonelquinteros/gotext"
"gorm.io/gorm"
"github.com/tnb-labs/panel/internal/biz"
"github.com/tnb-labs/panel/internal/http/request"
"github.com/tnb-labs/panel/pkg/db"
"github.com/tnborg/panel/internal/biz"
"github.com/tnborg/panel/internal/http/request"
"github.com/tnborg/panel/pkg/db"
)
type databaseUserRepo struct {
@@ -78,6 +78,9 @@ func (r databaseUserRepo) Create(req *request.DatabaseUserCreate) error {
return err
}
for name := range slices.Values(req.Privileges) {
if err = mysql.DatabaseCreate(name); err != nil {
return err
}
if err = mysql.PrivilegesGrant(req.Username, name, req.Host); err != nil {
return err
}
@@ -99,6 +102,9 @@ func (r databaseUserRepo) Create(req *request.DatabaseUserCreate) error {
return err
}
for name := range slices.Values(req.Privileges) {
if err = postgres.DatabaseCreate(name); err != nil {
return err
}
if err = postgres.PrivilegesGrant(req.Username, name); err != nil {
return err
}
@@ -145,6 +151,9 @@ func (r databaseUserRepo) Update(req *request.DatabaseUserUpdate) error {
}
}
for name := range slices.Values(req.Privileges) {
if err = mysql.DatabaseCreate(name); err != nil {
return err
}
if err = mysql.PrivilegesGrant(user.Username, name, user.Host); err != nil {
return err
}
@@ -163,6 +172,9 @@ func (r databaseUserRepo) Update(req *request.DatabaseUserUpdate) error {
}
}
for name := range slices.Values(req.Privileges) {
if err = postgres.DatabaseCreate(name); err != nil {
return err
}
if err = postgres.PrivilegesGrant(user.Username, name); err != nil {
return err
}
+2 -2
View File
@@ -6,8 +6,8 @@ import (
"github.com/spf13/cast"
"gorm.io/gorm"
"github.com/tnb-labs/panel/internal/biz"
"github.com/tnb-labs/panel/internal/http/request"
"github.com/tnborg/panel/internal/biz"
"github.com/tnborg/panel/internal/http/request"
)
type monitorRepo struct {
+5 -5
View File
@@ -6,11 +6,11 @@ import (
"github.com/spf13/cast"
"github.com/tnb-labs/panel/internal/biz"
"github.com/tnb-labs/panel/pkg/firewall"
"github.com/tnb-labs/panel/pkg/os"
"github.com/tnb-labs/panel/pkg/shell"
"github.com/tnb-labs/panel/pkg/systemctl"
"github.com/tnborg/panel/internal/biz"
"github.com/tnborg/panel/pkg/firewall"
"github.com/tnborg/panel/pkg/os"
"github.com/tnborg/panel/pkg/shell"
"github.com/tnborg/panel/pkg/systemctl"
)
type safeRepo struct {

Some files were not shown because too many files have changed in this diff Show More