Compare commits

..
818 Commits
Author SHA1 Message Date
蘭 0cfdf0f335 feat: alert count limit (#9621) 2025-07-23 21:34:20 +08:00
蘭 cca1863b63 feat: Adjust alarm settings (#9616) 2025-07-23 08:58:24 +00:00
CityFun 033f08a6d2 fix: Fix the issue where an error occurs on the runtime environment page when Docker is not installed. (#9615) 2025-07-23 15:39:48 +08:00
CityFun a83a6690ff fix: Fix the issue where application labels are displayed incorrectly… (#9611) 2025-07-23 04:04:23 +00:00
ssongliu 83df457379 fix: Add backup master missing alert (#9610) 2025-07-23 04:02:23 +00:00
蘭 657e55cde3 fix: Fix offline alert issue (#9608) 2025-07-22 18:39:26 +08:00
ssongliu 90e76e3a0f fix: Fix Redis performance tuning abnormalities (#9607) 2025-07-22 10:00:07 +00:00
CityFun 2af1993383 fix: Fix the issue of stale data caused by node deletion (#9606) 2025-07-22 16:12:00 +08:00
蘭 6e650d977e fix: Fix some issues with the alert (#9605) 2025-07-22 07:10:06 +00:00
ssongliu 8a76171dbe fix: Resolve backup to server disk failure for cronjob (#9603) 2025-07-22 14:56:13 +08:00
ssongliu 949b6fe944 fix: Fix node state synchronization issues (#9599) 2025-07-22 03:48:06 +00:00
CityFun 3f90333090 feat: Application installation supports using existing remote databases (#9598) 2025-07-22 03:20:05 +00:00
ssongliu aeaca0c5cd fix: Change container creation to asynchronous operation (#9597) 2025-07-22 11:00:16 +08:00
ssongliu fb7f638a54 fix: Optimize container filter component for cronjob (#9595)
<img width="633" height="304" alt="image" src="https://github.com/user-attachments/assets/b5077719-ddf8-438c-9ce4-ca6bb76d7217" />
2025-07-22 02:34:05 +00:00
CityFun 7994193a39 feat: Added Docker detection to the runtime environment (#9596) 2025-07-22 10:32:14 +08:00
蘭 3334bf594d fix: Fix some issues with the alert (#9594) 2025-07-22 02:11:59 +00:00
蘭 71193cc912 ref: Optimize IPv4 forwarding and preset chain existence check (#9592) 2025-07-21 11:04:42 +00:00
蘭 9fde8c447d fix: Improve alert notifications (#9591) 2025-07-21 11:02:42 +00:00
ssongliu 117faa952e fix: Fix container edit task log abnormalities (#9590) 2025-07-21 10:14:41 +00:00
CityFun 6427337728 feat: Adapt to Redis Cluster (#9588) 2025-07-21 09:56:42 +00:00
ssongliu 81f97f6f88 fix: Fix overview page load metrics localization issues (#9587) 2025-07-21 09:54:42 +00:00
ssongliu b3b472d711 fix: Optimize container creation page exit behavior (#9586)
Refs #9424
2025-07-21 09:52:43 +00:00
CityFun 1c22e1cf99 fix: Fix the issue where remote databases cannot be selected during application installation (#9589) 2025-07-21 17:52:35 +08:00
ssongliu 3110d91bf6 fix: Fix app upload/restore failure issues (#9583)
Refs #9572
2025-07-21 09:50:43 +00:00
ssongliu 624a11407a fix: Fix data synchronization during backup account modification (#9585) 2025-07-21 17:49:56 +08:00
ssongliu ead6d1268f feat: Optimize node addition notification messages (#9582) 2025-07-21 15:53:23 +08:00
CityFun 80c00c5a8c fix: fix some bugs with app-cluster (#9581) 2025-07-21 15:53:11 +08:00
ssongliu da0f6acd01 fix: Optimize snapshot synchronization options (#9579) 2025-07-21 02:36:41 +00:00
ssongliu 485aa99dea fix: Fix DNS configuration editing issue for containers (#9578)
Refs #9570
2025-07-21 02:34:41 +00:00
蘭 5f68d7ce90 feat: Dealing with compatibility issues with alert history data (#9571) 2025-07-18 22:43:19 +08:00
ssongliu 685fca6c8c fix: Add 'Deleted' Node State (#9569) 2025-07-18 22:43:07 +08:00
蘭 9c609da332 refactor: Improve alarm prompt information (#9564) 2025-07-18 07:43:22 +00:00
蘭 84608b7d42 feat: Alert notification supports email service (#9554) 2025-07-18 11:44:20 +08:00
CityFun 02cf2a80cb fix: Fixed issue with install Mailserver failed (#9562)
Refs https://github.com/1Panel-dev/1Panel/issues/9539
2025-07-18 03:43:23 +00:00
CityFun a74c6dd522 feat: Add installation support for Redis Cluster (#9561) 2025-07-18 03:41:23 +00:00
ssongliu 5d4ab23d95 style: Optimize node switching transition effects (#9560)
Refs #9556
2025-07-18 03:39:23 +00:00
ssongliu a8faba3206 style: Optimize drawer closing mechanism (#9559)
Refs #9371
2025-07-18 03:37:22 +00:00
ssongliu c603495b12 fix: Fix container log filtering anddownload issues (#9553)
Refs #9269 #9457
2025-07-17 10:13:21 +00:00
ssongliu adce6103bd fix: Fix log printing issues caused by container log tracking switches (#9552) 2025-07-17 17:51:23 +08:00
ssongliu 6b673017c5 fix: Fix the problem of abnormal request forwarding (#9548) 2025-07-17 07:43:20 +00:00
ssongliu e66bd43fc6 feat: Add customizable snapshot timeout support (#9537)
Refs #9502
2025-07-16 10:43:52 +00:00
CityFun ff5cdb9a02 feat: The container-compose module is adapted for Docker Compose. (#9536) 2025-07-16 10:41:52 +00:00
CityFun 1aec5e443d fix: Fix the issue where some applications incorrectly displayed a redirect button on error (#9535)
Refs https://github.com/1Panel-dev/1Panel/issues/9477
2025-07-16 10:17:53 +00:00
ssongliu 0b1f7e9322 fix: Change backup temporary file directory (#9533)
Refs #9428
2025-07-16 10:15:52 +00:00
CityFun 3ec2dec49b feat: Remove the required field prompt for HSTS in the website HTTPS … (#9532)
Refs https://github.com/1Panel-dev/1Panel/issues/9465
2025-07-16 09:59:52 +00:00
ssongliu 7cbebc8236 feat: Support backup for master (#9498) 2025-07-16 17:53:04 +08:00
CityFun 700076f278 feat: Application installation supports existing remote databases (#9531) 2025-07-16 17:47:27 +08:00
ssongliu 7bf1bf61a7 fix: Fix memory usage display issue on dashboard (#9530)
Refs #9497
2025-07-16 09:45:53 +00:00
CityFun ef2cb1b315 feat: Adapt to PostgreSQL cluster (#9529) 2025-07-16 17:44:20 +08:00
CityFun 75bfc3a114 feat: Scheduled tasks support backing up MySQL cluster databases (#9526) 2025-07-16 15:52:04 +08:00
CityFun 70f63090fe fix: Resolve the issue of failed slave installation (#9519) 2025-07-15 07:39:56 +00:00
CityFun ab2cf0d0c3 feat: add cluster status page (#9514) 2025-07-14 19:08:57 +08:00
CityFun ea1a34f57a feat: Optimize node management logic (#9510) 2025-07-14 18:59:26 +08:00
CityFun 765add6184 fix: Fix the issue where some applications fail to execute scripts (#9508) 2025-07-14 04:21:51 +00:00
CityFun e5263d6c05 fix: Modify the header of the application logs page (#9507)
Refs https://github.com/1Panel-dev/1Panel/issues/9501
2025-07-14 04:19:51 +00:00
CityFun c391177d34 feat: Add MySQL master-slave installation feature (#9505) 2025-07-13 22:36:21 +08:00
CityFun 7d5f0aa906 fix: Fix the issue of failing to save IPv6 self-signed certificate (#9495) 2025-07-11 17:35:39 +08:00
CityFun 2694a725d6 feat: Add quick installation for the sodium extension (#9481) 2025-07-10 06:27:19 +00:00
蘭 54ca40bbcd fix: Fix container log download ANSI control code garbled issue (#9479) 2025-07-10 11:21:13 +08:00
蘭 b20411f8f1 fix: Fix the issue of calculating size incorrectly during sorting (#9474) 2025-07-09 11:02:55 +00:00
ssongliu 355e656caa fix: Fix the issue where the demo configuration takes effect (#9468) 2025-07-09 02:10:49 +00:00
ssongliu 383bdd5f15 fix: Change container image building to asynchronous operation (#9462)
Refs #8463
2025-07-08 11:06:47 +00:00
CityFun 96208c786d feat: The runtime terminal supports specifying a user (#9461) 2025-07-08 10:34:14 +00:00
蘭 4c7b04cf27 feat: Perfect Türkiye language configuration (#9458) 2025-07-08 10:20:51 +00:00
蘭 a067a97e21 fix: Fix the issue of garbled characters when opening UTF-8 encoded files (#9454)
refs: #9411
2025-07-08 06:09:54 +00:00
CityFun 4a07603a7c Fix: change loadBalanceHelper translate (#9453) 2025-07-08 06:07:54 +00:00
ssongliu 7196c5b656 fix: Fix https image registry deletion failure (#9451) 2025-07-08 06:05:55 +00:00
CityFun b5de2df119 Fix: change loadBalance translate (#9448) 2025-07-08 02:47:54 +00:00
Sinan Eldem 2f72eb37ee Turkish Language Files for v.dev-v2 (#9390) 2025-07-08 10:45:19 +08:00
CityFun 0128cd3138 Fix: fix issue with element-plus tab style wrong (#9441) 2025-07-07 18:34:00 +08:00
ssongliu 157d3093f8 fix: Update license validation error messages (#9438) 2025-07-07 08:17:50 +00:00
ssongliu 4ca188973e fix: Add rule validation for FTP account creation (#9437) 2025-07-07 06:25:49 +00:00
wanghe-fit2cloud f387d89a45 docs: Optimize README 2025-07-07 12:09:52 +08:00
CityFun 54567db22f Fix: Resolved issue where domain binding failed in MCP due to OpenResty not using 80 port (#9435)
Refs https://github.com/1Panel-dev/1Panel/issues/9431
2025-07-07 04:07:50 +00:00
ssongliu 2bee68dd40 fix: Fix timezone modification reboot exception (#9432)
Refs #9422
2025-07-07 04:05:50 +00:00
CityFun e2b6ea5253 Fix: Resolved unInstall app failed due to run compose down timeout (#9436) 2025-07-07 04:03:49 +00:00
CityFun 9974c5fa20 feat: add DownloadCallBack for install php runtime (#9430) 2025-07-07 03:05:50 +00:00
ssongliu 997b706d8a fix: Fix dashboard refresh exception issue (#9429) 2025-07-07 03:03:49 +00:00
ssongliu 3f26412585 fix: Modify OneDrive default connection settings (#9403) 2025-07-04 09:03:41 +00:00
ssongliu ac99d77fbb fix: Fix snap docker startup failure due to empty configuration (#9402) 2025-07-04 07:21:40 +00:00
ssongliu 4f6f7632f5 fix: Fix the problem of re-logging during the snapshot recovery process (#9401) 2025-07-04 03:59:40 +00:00
CityFun f74248f0d7 fix: Fixed issue with open app log failed with docker-compose (#9400) 2025-07-04 10:23:02 +08:00
ssongliu bb8a15ca56 fix: Fix system load spike during disk mount failures (#9399)
Refs #8827
2025-07-04 02:19:39 +00:00
ssongliu 52432002c7 fix: Fix port acquisition exception issue (#9398) 2025-07-03 16:31:34 +08:00
ssongliu 3fade48f8f fix: Add error ignore functionality to cronjob backups (#9396) 2025-07-03 16:31:25 +08:00
ssongliu fc81801c4c fix: Fix user settings loading failure after reinstallation (#9395) 2025-07-03 14:52:04 +08:00
ssongliu c23c5b2859 style: Add more pagination options to table (#9392)
Refs #5621
2025-07-03 05:55:38 +00:00
ssongliu ccec57e32d fix: Fix user settings loading failure after reinstallation (#9391) 2025-07-03 02:49:37 +00:00
CityFun 56ae5fbf70 fix: Fixed issue with build core failed (#9387) 2025-07-02 23:32:26 +08:00
CityFun 735b44856e style: Fix the problem where dropdown text is too long to display properly. (#9378) 2025-07-02 10:49:34 +00:00
ssongliu 1f6ea9f494 fix: Support docker configuration modifications for snap installations (#9377) 2025-07-02 09:43:35 +00:00
ssongliu afa643519f fix: Modify default values for recommended apps on dashboard (#9375) 2025-07-02 09:41:36 +00:00
ssongliu 1767b84026 fix: Fix overview page data loading/closing exception (#9373) 2025-07-02 09:39:35 +00:00
ssongliu e855e7692e fix: Fix permission errors when running script library as non-root User (#9370) 2025-07-02 04:25:34 +00:00
CityFun 94d37eb68a fix: Resolve the php runtime start failed (#9369) 2025-07-02 04:23:35 +00:00
CityFun e10b19bcde fix: Fixed issue with the mounted directory configuration cannot be displayed in runtime (#9368)
Refs https://github.com/1Panel-dev/1Panel/issues/9293
2025-07-02 04:21:35 +00:00
ssongliu e9192e75ea fix: Fix file existence check when deleting node upgrade records (#9365) 2025-07-01 14:29:33 +00:00
ssongliu 2fa4f68b1e fix: Update backup account documentation links (#9364) 2025-07-01 10:13:32 +00:00
ssongliu 08f53a4a37 fix: Support configurable docker config file snapshotting (#9363) 2025-07-01 07:49:32 +00:00
CityFun c522295c56 fix: Resolve the issue of database uninstallation failure (#9361) 2025-07-01 15:46:21 +08:00
BugKing 7a45548387 feat: add terminal icon for installed App (#9331)
* feat: add terminal icon for installed App

* refactor: 应用卡片打开容器终端,适配多个容器情况
2025-07-01 15:45:57 +08:00
ssongliu 810ea9c421 style: Handle overflow for node names with ellipsis truncation (#9360) 2025-07-01 07:45:32 +00:00
CityFun ba6a4fe6d7 fix: Resolve the issue of lost GPU configuration after upgrade ollama (#9359) 2025-07-01 07:43:32 +00:00
ssongliu 4d144f7a8e fix: Optimize backup account switching logic (#9358) 2025-07-01 06:31:32 +00:00
ssongliu 45c41184c1 fix: Optimize 1pctl restore command output (#9355) 2025-07-01 03:51:33 +00:00
ssongliu 5c29c5e7dd fix: Implement chunked upload for google drive file transfers (#9354) 2025-07-01 03:49:32 +00:00
蘭 4da9a84363 fix: Disable button when clearing cache and selecting size 0B (#9349) 2025-06-30 14:29:31 +00:00
蘭 22d8fb7867 fix: Fix the display error of the sub node website icon (#9348) 2025-06-30 11:11:31 +00:00
ssongliu c7058cb3e6 fix: Optimize container image repo restart detection logic (#9347)
Refs #8978
2025-06-30 11:09:30 +00:00
ssongliu e6092b2658 fix: Fix the compilation exception problem caused by dependencies (#9345) 2025-06-30 08:49:30 +00:00
ssongliu ae19b72e61 feat: Add root/sudo password-free access check for ssh (#9344) 2025-06-30 08:21:30 +00:00
dependabot[bot] da117582d6 build(deps): bump github.com/go-viper/mapstructure/v2 in /agent (#9343)
Bumps [github.com/go-viper/mapstructure/v2](https://github.com/go-viper/mapstructure) from 2.2.1 to 2.3.0.
- [Release notes](https://github.com/go-viper/mapstructure/releases)
- [Changelog](https://github.com/go-viper/mapstructure/blob/main/CHANGELOG.md)
- [Commits](https://github.com/go-viper/mapstructure/compare/v2.2.1...v2.3.0)

---
updated-dependencies:
- dependency-name: github.com/go-viper/mapstructure/v2
  dependency-version: 2.3.0
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-06-30 12:00:18 +08:00
CityFun c7ca1ccbd7 core: Remove unused code (#9342) 2025-06-30 03:55:30 +00:00
ssongliu 911b5c406d style: Optimize cronjob report page styling (#9341) 2025-06-30 03:53:30 +00:00
wanghe-fit2cloud 71ed4b946a feat: Adjust the logo’s aspect ratio to prevent it from appearing stretched 2025-06-29 23:19:55 +08:00
蘭 4ef9fcde59 fix: Default display of hidden files (#9327)
#9325 
#9324
2025-06-27 10:23:24 +00:00
ssongliu 7889b5ad69 fix: Optimize script-type cronjob execution output (#9326) 2025-06-27 17:57:40 +08:00
ssongliu be6d3ea337 fix: Update compression backup exclusion rules (#9323) 2025-06-27 09:25:23 +00:00
CityFun 64fd715973 perf: optimization php config (#9321) 2025-06-27 16:56:13 +08:00
ssongliu 315f99a03a feat: Add application exclusion for cronjob snapshots (#9320)
Refs #8914
2025-06-27 08:47:26 +00:00
ssongliu 7e1351c543 fix: resolve code warnings and improve code quality (#9322) 2025-06-27 16:47:01 +08:00
CityFun bd3c829653 fix: translate the requestTimeout msg for frontend (#9316)
Refs https://github.com/1Panel-dev/1Panel/issues/9308
2025-06-27 05:49:24 +00:00
蘭 4f6dde02d2 fix: Fix the issue of missing line breaks in copied log content (#9314)
#9099
2025-06-27 05:47:25 +00:00
蘭 8cc7d1f67f fix: Fix the issue of multiple selection moving folder errors (#9317) 2025-06-27 05:45:23 +00:00
ssongliu 2bbba9d755 style: Adjust node option popup interaction (#9312)
Refs #9290
2025-06-27 02:23:23 +00:00
CityFun e9e4755348 Revert "fix: Fix missing line breaks in copied logs on the log page (… (#9311) 2025-06-27 02:19:26 +00:00
CityFun 9fbb63df95 fix: Resolve command execution failures in the PHP runtime environmen… (#9299)
Refs https://github.com/1Panel-dev/1Panel/issues/9286
2025-06-26 08:31:23 +00:00
ssongliu 5b5a649589 fix: resolve Google Drive token refresh failure (#9298)
Refs #9223
2025-06-26 07:37:22 +00:00
蘭 79556affbd fix: Fix the preview image error of child nodes (#9296)
#9245
2025-06-26 06:43:22 +00:00
蘭 9cba19d4db fix: Fix the process status error issue (#9285) 2025-06-25 22:05:29 +08:00
蘭 4f377c04b8 fix: Fix missing line breaks in copied logs on the log page (#9283) 2025-06-25 22:05:12 +08:00
ssongliu 763df5606b fix: Fix snapshot restoration missing website backup detection (#9282) 2025-06-25 22:04:53 +08:00
ssongliu e1d20e3ec9 fix: Optimize snapshot and snapshot recovery mechanism (#9279) 2025-06-25 16:29:15 +08:00
CityFun 215c082a04 perf: add some config for website_default.conf (#9278)
Refs https://github.com/1Panel-dev/1Panel/issues/8837
2025-06-25 08:23:21 +00:00
ssongliu 984985e650 fix: Fix snapshot restoration for container configuration errors (#9277)
Refs #9216
2025-06-25 08:21:21 +00:00
蘭 249b3c3245 fix: Fixed logging errors for uploaded files (#9273) 2025-06-25 08:19:20 +00:00
Swt242 725786d6aa fix: Fixed logging errors for uploaded files (#9204) 2025-06-25 11:46:27 +08:00
蘭 2edddaf487 feat: Specify the interpretation code based on the file content (#9267) 2025-06-24 14:17:14 +00:00
ssongliu 49cbab08c1 fix: Modify snapshot synchronization and import name restrictions (#9266) 2025-06-24 18:43:56 +08:00
ssongliu a75df66151 fix: Rollback snapshot code (#9263) 2025-06-24 10:41:14 +00:00
CityFun 43e9c13c5e perf: Optimize and Edit PHP Runtime Environment Version Switching (#9265) 2025-06-24 18:40:53 +08:00
CityFun 5ad06f121b fix: fix issue with subsite dir error (#9259) 2025-06-24 10:39:14 +00:00
wanghe-fit2cloud 0eaaf7aacb feat: Adjust the logo’s aspect ratio to prevent it from appearing stretched 2025-06-24 17:29:15 +08:00
CityFun dd44fdd1f2 fix: Fixed issue with tar file failed with exist 1 (#9261) 2025-06-24 16:57:27 +08:00
CityFun 669855de70 fix: Fixed the issue that caused the error (bufio.Scanner: token too long) when viewing container log (#9256)
Refs https://github.com/1Panel-dev/1Panel/issues/9241
2025-06-24 05:53:13 +00:00
CityFun 193ae2b7d6 fix: fix issue with enable website ssl with ipv6 failed (#9255) 2025-06-24 13:44:17 +08:00
Alan af4b23e0e0 fix: fixed dashboard operating system platform Version (#9247) 2025-06-24 09:31:14 +08:00
蘭 c35991315d fix: Fix page loading issue with no data status (#9248) 2025-06-23 22:14:48 +08:00
ssongliu 9aa852370c fix: Split snapshot application backup (#9244) 2025-06-23 10:40:13 +00:00
CityFun 8f18497551 feat: add remark for runtime (#9242) 2025-06-23 18:37:37 +08:00
CityFun 4c59951e8c style: change dnsAccount select option style in create ssl page (#9239) 2025-06-23 06:48:12 +00:00
CityFun eb2a80d216 style: hightlight ipv6 address in task log (#9238)
Refs https://github.com/1Panel-dev/1Panel/issues/9118
2025-06-23 06:46:13 +00:00
CityFun 41d0175a6d style: change show diff button style for upgrade app (#9237)
Refs https://github.com/1Panel-dev/1Panel/issues/9207
2025-06-23 06:44:11 +00:00
igophper 2f6aa0f45b fix: Fix docker status flicker issue (#9218) 2025-06-23 13:46:03 +08:00
igophper 17c685bc4c fix: Fix the apps store docker status error (#9217) 2025-06-23 13:44:09 +08:00
ssongliu cf230ca6e7 fix: Fix the problem of the failure of 1pctl update port (#9199) 2025-06-20 06:45:13 +00:00
蘭 bb99853000 fix: File content support GBK encoding (#9198) 2025-06-20 06:43:13 +00:00
ssongliu 0c64c8ff52 fix: Fix the problem of incomplete printing of the cronjob (#9197) 2025-06-20 14:25:35 +08:00
ssongliu e3e2006c19 fix: Solve the problem of failed binding and synchronization of Ali Pan (#9195) 2025-06-20 11:12:49 +08:00
蘭 eddc1b6a8d fix: Fix hidden file flipping issue (#9189) 2025-06-19 11:51:00 +00:00
ssongliu 83e1db723e fix: Optimize the synchronization log information of the script library (#9188) 2025-06-19 10:42:59 +00:00
ssongliu 76c608c703 style: Adjust the style of the cronjob status button (#9185) 2025-06-19 09:49:01 +00:00
CityFun d61a77bec7 feat: add core debug cmd for cpu/mem analysis (#9186) 2025-06-19 17:48:51 +08:00
ssongliu a6a2d9991c fix: Remove the redis password restriction (#9184) 2025-06-19 08:36:59 +00:00
CityFun 060dd08167 fix: fix issue with http3 config not work in proxy website (#9183) 2025-06-19 15:12:29 +08:00
CityFun dd1d93e096 fix: fix issue with docker cmd not close (#9182) 2025-06-19 07:06:59 +00:00
蘭 e4b24f51fc feat: Add cache to query SMS records (#9180) 2025-06-19 07:01:00 +00:00
CityFun e472269a4e feat: add agent debug cmd for cpu/mem analysis (#9181) 2025-06-19 14:59:51 +08:00
CityFun 4032276556 feat: update demo handle (#9175) 2025-06-18 09:58:56 +00:00
ssongliu 420537f092 fix: Fix the problem of abnormal addition of remote connections to th… (#9174)
Refs #9151
2025-06-18 09:20:57 +00:00
蘭 3867e536b2 fix: Fix menu sorting (#9172) 2025-06-18 09:18:57 +00:00
CityFun 4bc7b96ae4 style: change button style (#9171) 2025-06-18 08:48:58 +00:00
ssongliu 9f0338382f feat: Script within the container support the selection of users (#9170)
Refs #8766
2025-06-18 08:46:58 +00:00
蘭 692c77eb1a fix: Service status acquisition compatible with snap (#9169) 2025-06-18 16:45:22 +08:00
CityFun 0778e3e81d feat: add baidu and rynu dns provider for ssl (#9167)
Refs https://github.com/1Panel-dev/1Panel/issues/9160
2025-06-18 07:20:57 +00:00
CityFun 80e217e839 feat: Adopt temporary container adaptation for app store status verification (#9165)
Refs https://github.com/1Panel-dev/1Panel/issues/8973
2025-06-18 07:18:57 +00:00
蘭 47547ad4e1 fix: Fix image loading issue (#9164) 2025-06-18 07:16:57 +00:00
CityFun 8b22acce27 fix: fix issue with open container log failed (#9163) 2025-06-18 07:14:56 +00:00
ssongliu 754ac64bf6 fix: Increase the timeout period of the swap setting (#9162)
Refs #9142
2025-06-18 03:50:56 +00:00
ssongliu 3b37d5ae72 fix: Upgrade the element version to 2.9.9 (#9158) 2025-06-18 03:48:57 +00:00
ssongliu 4e2f24a8f0 fix: Fix the problem of failed Google drive backup (#9156)
Refs #9129
2025-06-17 10:48:55 +00:00
蘭 23a1fbdd4b fix: Clear cache by specifying default values (#9154)
#8933
2025-06-17 10:42:54 +00:00
蘭 795223e7fa fix: Fix the issue of interface image loss caused by clearing cache (#9149)
Refs: #9050
2025-06-17 09:00:54 +00:00
ssongliu 10039c6173 fix: Optimize the script library to synchronize the task log (#9148) 2025-06-17 16:59:34 +08:00
CityFun 146b628cc1 feat: Restrict the size of log files to read. (#9147) 2025-06-17 16:59:23 +08:00
CityFun 0c31fcc8a3 fix: fix issue with local app can not open port (#9145) 2025-06-17 08:36:53 +00:00
蘭 2c290dbbf7 fix: hide menu and sorting (#9141) 2025-06-17 16:14:28 +08:00
ssongliu 0df8a33b9e fix: Fix the problem of failed start of swap in the toolbox (#9143)
Refs #9142
2025-06-17 08:08:53 +00:00
ssongliu 1278e910f5 fix: Fix the issue of abnormal login log recording (#9139)
Refs #9054
2025-06-17 08:06:55 +00:00
ssongliu 429e2c6cbe feat: Optimize the node to add inspection items (#9138) 2025-06-17 08:04:54 +00:00
CityFun 00a5cc654a fix: fix issue with run script with no return (#9137) 2025-06-17 16:04:02 +08:00
蘭 d68a0b076b feat: transfer some code (#9124)
refs #9067
2025-06-17 03:56:53 +00:00
CityFun 99ef8e9310 fix: fix issue with edit dotnet environment failed (#9121)
Refs https://github.com/1Panel-dev/1Panel/issues/9083
2025-06-16 08:50:51 +00:00
Process Xie 5e549fdb71 fix: terminate Docker logs process when client disconnects (#9091)
* Update container.go

* Update container.go
2025-06-16 16:07:13 +08:00
CityFun 8f7b026f0e feat: Add quick installation for PHP extension pcntl (#9119) 2025-06-16 07:38:51 +00:00
CityFun fabf33a83b feat: Ensure compatibility with docker-compose commands. (#9117) 2025-06-16 07:14:51 +00:00
CityFun 211c956c4b fix: Fix input field validation error when editing installed application (#9115) 2025-06-16 06:44:51 +00:00
CityFun 55d966a52e fix: fix issue with php install swoole failed (#9113)
Refs https://github.com/1Panel-dev/1Panel/issues/9080
2025-06-16 06:42:51 +00:00
ssongliu a0d5319cd9 fix: Modify the license binding node filtering (#9111) 2025-06-16 06:40:52 +00:00
ssongliu d9358b87c4 style: Optimize the closing method of the right drawer (#9108) 2025-06-16 06:38:51 +00:00
CityFun 89526d9075 feat: add docker status for appstore (#9058) 2025-06-13 10:00:42 +00:00
ssongliu b1799d8c06 style: Modify the prompt message for License exists (#9057) 2025-06-13 07:42:42 +00:00
ssongliu 185eaf1211 style: Optimize the internationalization of the cronjob report (#9055) 2025-06-13 07:26:42 +00:00
CityFun 4aa7dbfa9f feat: change runtime timezone helper (#9053) 2025-06-13 03:46:41 +00:00
ssongliu daef59b568 fix: The snapshot increases the number of retries (#9045)
Refs #9026
2025-06-12 14:48:41 +00:00
ssongliu be2c30c9e0 fix: Fix the problem of abnormal reserved copies for cronjob (#9044)
Refs #9042
2025-06-12 14:46:41 +00:00
蘭 3b166801d6 fix: Fix the issue of homepage color after switching themes (#9041) 2025-06-12 10:54:39 +00:00
igophper c289a5f14f fix: Remove proxy settings from Google Drive client (#9040)
Refs #9034
2025-06-12 18:20:21 +08:00
蘭 5dfb4def56 feat: Add AI website building menu (#9039) 2025-06-12 09:04:40 +00:00
蘭 c6d70f4dc8 refactor: update docs url (#9038) 2025-06-12 07:34:40 +00:00
CityFun 254a6e6dbf perf: remove "TLSv1.1", "TLSv1" for create website (#9033)
Refs https://github.com/1Panel-dev/1Panel/issues/9030
2025-06-12 05:52:39 +00:00
蘭 62c010ce13 fix: Fixed the restart panel theme switching issue (#9031) 2025-06-12 13:33:02 +08:00
CityFun 272536a3b5 fix: fix issue with build frontend failed (#9023) 2025-06-11 14:54:37 +00:00
蘭 13dc94aca5 feat: Create a container and use a terminal to execute commands (#9022)
Refs: #8795
2025-06-11 13:38:38 +00:00
蘭 b9a80f15e6 refactor: update docs url (#9021) 2025-06-11 13:36:38 +00:00
david082321 5cab80d842 feat: Update zh-Hant translation (#9020)
* Update zh-Hant.yaml

* Update zh-Hant.yaml
2025-06-11 21:34:12 +08:00
John Niang 8a4ff3c809 Refine English translation for v2 (#9016) 2025-06-11 17:53:13 +08:00
CityFun 5b9e13f35b fxo: fix issue with get php runtime version failed (#9017) 2025-06-11 17:52:43 +08:00
John Niang fd5437139b Revert "Refine English translation (#8991)" (#9015)
This reverts commit f843438baf.
2025-06-11 17:03:13 +08:00
CityFun 26852b6676 feat: add reg.ru DNS provider for website ssl (#9014)
Refs https://github.com/1Panel-dev/1Panel/issues/8889
2025-06-11 08:02:36 +00:00
CityFun b8a02cc094 update go module (#9013) 2025-06-11 06:52:37 +00:00
CityFun f7fa6cf567 fix: fix issue with clean supervisor log failed (#9012) 2025-06-11 06:44:37 +00:00
CityFun 64e74e87c4 feat: Add directory redirection on the PHP runtime environment page (#9010) 2025-06-11 06:42:39 +00:00
John Niang f843438baf Refine English translation (#8991)
* Refine English translation (#7232)

* Refine English translation  (#7247)

* Refine pluralization of some English words (#7318)

* Refine plural translation of English words

* Remove useless i18n modifier

* Refine English translation again and again (#7353)

* Replace whitelist and blacklist with allowlist and blocklist (#7358)

* Refine English translation and UI style (#7399)

* Resolve build error

* Fix build error
2025-06-11 14:41:29 +08:00
CityFun 4528f1feaf feat: update docs url (#8997) 2025-06-10 10:30:35 +00:00
ssongliu 1eae519e1a fix: Fix the problem of failed backup of all databases for cronjob (#8990)
Refs #8982
2025-06-10 06:32:34 +00:00
ssongliu 1416fb0f6e fix: Fix the problem of abnormal acquisition of system update versions (#8988) 2025-06-10 06:30:35 +00:00
CityFun e9257735ba fix: fix issue with change ssl_protocols failed (#8985)
Refs https://github.com/1Panel-dev/1Panel/issues/8981
2025-06-10 06:28:34 +00:00
Halo Dev BotandJohn Niang 81caf126f7 Fix invalid postion of before content in home page in Firefox Linux (#8980)
Co-authored-by: John Niang <johnniang@foxmail.com>
2025-06-10 14:25:55 +08:00
CityFun 8b9337b45a feat: change default proxy.conf (#8971) 2025-06-09 14:31:05 +00:00
CityFun 24d909d285 style: change import license button style (#8969) 2025-06-09 08:25:04 +00:00
ssongliu fa8f7f83af fix: Delete the redundant migrations (#8968) 2025-06-09 08:07:04 +00:00
CityFun 3af68cdb54 fix: Resolve the error in file management (#8966) 2025-06-09 07:13:04 +00:00
CityFun ed2e305508 fix: Resolve the error in reading container logs (#8965) 2025-06-09 05:37:04 +00:00
igophper 46a2c3f81b fix: Fix the issue of mysql status page empty data (#8946)
Refs #8945
2025-06-07 23:01:47 +08:00
蘭 b786d507e0 feat: The file list does not display hidden files by default (#8943)
Refs: #5702
2025-06-06 09:22:55 +00:00
CityFun 8acf8b0b96 fix: add port check for php runtime port config (#8941) 2025-06-06 12:15:25 +08:00
CityFun 721e370ad3 feat: add domain validate for appinstall webUI (#8939)
Refs https://github.com/1Panel-dev/1Panel/issues/8936
2025-06-06 02:10:55 +00:00
ssongliu 349c97f06f fix: Modify the license sorting method (#8935) 2025-06-05 13:34:54 +00:00
蘭 4074b94800 feat: Preview the current directory image (#8930)
Refs: #6117
2025-06-05 11:24:53 +00:00
CityFun 7f823ecd7c fix: Fix issue with custom rules being lost after restarting OpenResty. (#8929)
Refs https://github.com/1Panel-dev/1Panel/issues/8923
2025-06-05 11:02:53 +00:00
ssongliu 2ae5c9f0d4 fix: Fix some snapshot anomaly issues (#8926)
Refs #8917
Refs #8924
Refs #8897
2025-06-05 08:20:53 +00:00
CityFun 8614e63b86 feat: PHP runtime add php config (#8922) 2025-06-05 08:18:52 +00:00
蘭 470d7881cd feat: Move current status to first position in MySQL and Redis settings and set as default tab (#8910) 2025-06-04 14:40:52 +00:00
蘭 067a5f8415 feat: Mobile app module (#8909) 2025-06-04 14:38:51 +00:00
CityFun da8c52da37 fix: fix issue with apply ssl use http mode failed (#8906) 2025-06-04 09:32:51 +00:00
Alan c021e4322a feat: added new php extensions template "Dev" (#8903) 2025-06-04 17:31:37 +08:00
ssongliu 705642c3c3 fix: Fix the problem of abnormal acquisition of user-info (#8902) 2025-06-04 09:30:52 +00:00
CityFun 1d58810a78 fix: fix issue with clean runtime lop failed (#8900) 2025-06-04 17:29:36 +08:00
wanghe-fit2cloud 109dc26281 feat: Modify some prompt messages 2025-06-04 11:02:04 +08:00
ssongliu 7bc2bbc1d7 fix: Fix the problem of failed creation of child node snapshots (#8898)
Refs #8897
2025-06-03 14:52:49 +00:00
ssongliu a7ec06e066 fix: Fix the problem of unfiltered types in the backup database of cr… (#8896)
…onjob
2025-06-03 09:12:48 +00:00
ssongliu a9e8c79e09 fix: Node creation adds geo ip initialization (#8895) 2025-06-03 17:10:40 +08:00
蘭 ce86e8c31f fix: Remote Redis connection (#8881) 2025-05-30 08:44:27 +00:00
CityFun 36b81f6dba fix: fix issue with can not delete web ui (#8878) 2025-05-30 11:36:03 +08:00
CityFun 8c8a4d2881 feat: change default runtime php image name (#8876) 2025-05-30 03:18:27 +00:00
CityFun 93d45bf36f fix: fix issue with install sg16 error (#8869)
Refs https://github.com/1Panel-dev/1Panel/issues/8817
2025-05-29 08:02:25 +00:00
CityFun 71d92c30e3 feat: add openBaseDir for php website config (#8866) 2025-05-28 10:20:22 +00:00
蘭 a4d63434cb fix: code editor tab close (#8863) 2025-05-28 03:22:21 +00:00
CityFun 1771bc7dc8 fix: Resolve popup caused by node switching. (#8862) 2025-05-28 03:18:21 +00:00
蘭 0a5f62fe4b feat: Optimize file management style and increase file calculation (#8851)
Refs: #6878
2025-05-27 08:56:20 +00:00
CityFun 27836742a8 fix: add restart-docker option when adding system proxy for the first… (#8845) 2025-05-27 03:52:18 +00:00
CityFun 610be1755a fix: change logic for the system proxy setting (#8839) 2025-05-26 11:12:18 +00:00
CityFun ee04f4afc8 fix: fix issue with add node do not restart docker (#8838) 2025-05-26 10:56:18 +00:00
CityFun 7bcfa78573 fix: fix issue with ubind license restart docker (#8836) 2025-05-26 10:24:18 +00:00
蘭 5d25f972ee fix: compose file edit env (#8833)
Refs: #8826
2025-05-26 09:34:17 +00:00
蘭 1716e42ffe fix: code editor tab close (#8832) 2025-05-26 16:02:06 +08:00
CityFun a36c0eb22f fix: Fix issue with duplicate nodes appearing after adding a node. (#8828) 2025-05-26 13:33:39 +08:00
CityFun 06d88219c2 fix: Fix issue with update loadbalance error (#8829)
Refs #8809
2025-05-26 03:58:15 +00:00
ssongliu 548929b2e8 fix: Alibaba Cloud Disk ignores tls verification (#8812) 2025-05-25 16:15:34 +08:00
ssongliu c65eb7fac8 fix: Fix the problem of Docker restarting caused by proxy sync (#8811) 2025-05-25 16:15:17 +08:00
CityFun c323db7e01 fix: fix issue with reload monitor page failed (#8804)
Refs https://github.com/1Panel-dev/1Panel/issues/8803
2025-05-23 14:30:11 +00:00
CityFun 9cf3db8d81 feat: Add some prompts. (#8800) 2025-05-23 10:54:12 +00:00
CityFun 61ef754a1d feat: Refactor manual mode certificate application to increase succes rate (#8799) 2025-05-23 10:52:13 +00:00
蘭 9d692b76bf fix: fix close docker proxy (#8798) 2025-05-23 10:50:11 +00:00
CityFun 69e143845a feat: change cmd timeout handle for core (#8796) 2025-05-23 06:58:12 +00:00
CityFun 433a911ef6 fix: fix issue with agent cpu usage error (#8792)
Refs https://github.com/1Panel-dev/1Panel/issues/8742
2025-05-23 06:50:12 +00:00
蘭 28ab4e2527 ref: api auth (#8791) 2025-05-23 06:48:12 +00:00
ssongliu 38a668fbeb fix: Fix the issue of abnormal parsing of Chinese nodes (#8790) 2025-05-23 06:46:15 +00:00
ssongliu fe6c2a2c76 fix: Fix the problem of abnormal deletion of manual backup records (#8787)
Refs #8788
2025-05-23 06:44:12 +00:00
蘭 6ee2bf2bca fix: code editor font color (#8784) 2025-05-22 18:04:31 +08:00
蘭 aa8277dc03 fix: Fixed the issue of switching file highlighting (#8783) 2025-05-22 08:41:59 +00:00
CityFun 6bd9bb7c06 feat: add .user.ini for php website (#8782) 2025-05-22 07:17:59 +00:00
蘭 8e808903fc feat: Current directory and file numbers (#8781) 2025-05-22 07:05:59 +00:00
ssongliu 3d1f1a8379 fix: Fix the problem of abnormal display on the docker state switch (#8775)
Refs #8769
2025-05-21 14:26:00 +00:00
蘭 eac4e15ef5 feat: Support compress 7z and rar format files (#8776) 2025-05-21 22:25:40 +08:00
CityFun 80475bd8db fix: fix issue with sync app failed with docker stop (#8774) 2025-05-21 17:24:11 +08:00
ssongliu b4ce1febd5 fix: Improve the task log for adding nodes (#8773) 2025-05-21 17:01:08 +08:00
CityFun d2cd5e226a feat: Refactor reverse proxy to reuse Transport and enable connection pooling (#8772) 2025-05-21 17:00:50 +08:00
ssongliu e2876ed1c5 style: Modify the node to add prompt information (#8767) 2025-05-21 17:00:40 +08:00
ssongliu f445959269 style: Modify the node to add prompt information (#8763) 2025-05-21 11:57:24 +08:00
CityFun b308e4632a style: change runtime terminal style (#8764) 2025-05-21 11:56:12 +08:00
蘭 057dcaf2e5 feat: Multi directory calculation size (#8762)
* feat: Multi directory calculation size

* feat: optimize code editor

* feat: directory calculation size
2025-05-21 11:55:37 +08:00
ssongliu 58d9c068e4 fix: Fix the issue of abnormal logs in Cronjob backup directory (#8759) 2025-05-20 15:01:23 +00:00
CityFun 41b2dd82f0 feat: add terminal for runtimes (#8758) 2025-05-20 18:34:17 +08:00
CityFun 6d8d6f05f1 feat: Optimize the manual certificate application process (#8755)
Refs https://github.com/1Panel-dev/1Panel/issues/7885
2025-05-20 08:39:18 +00:00
ssongliu c2101824ed fix: Fix the problem of failed application backup (#8752) 2025-05-20 15:05:22 +08:00
CityFun 538468a81d fix: fix issue with build failed (#8753) 2025-05-20 15:05:10 +08:00
蘭 431f6aa966 feat: code editor tab component (#8751) 2025-05-20 06:45:08 +00:00
蘭 8080ae1fb3 fix: code editor (#8749) 2025-05-20 06:03:09 +00:00
ssongliu 9822427de8 fix: Fix the issue of abnormal token refreshing on alipan (#8747) 2025-05-20 13:42:01 +08:00
CityFun 658db55d91 feat: add bind_domain and ip_limit res (#8741) 2025-05-19 22:46:29 +08:00
ssongliu 1336b93efa fix: Fix the problem of abnormal default check items in snapshots (#8740) 2025-05-19 22:46:16 +08:00
蘭 bf7935e313 feat: Multi tab editing file (#8738)
* feat: Multi tab editing file

* feat: link underline
2025-05-19 17:41:51 +08:00
ssongliu 9732b09cf0 fix: Fix the problem of the exclusion directory failure in cronjob (#8736) 2025-05-19 17:23:17 +08:00
CityFun 80c7d68cf4 fix: fix issue with add supervisor config error (#8734) 2025-05-19 15:43:42 +08:00
ssongliu 5892ef222f fix: Modify the default timeout of the planned task (#8733) 2025-05-19 15:42:51 +08:00
CityFun 1735baf657 fix: fix issue with re-enable the website failed (#8731) 2025-05-19 15:41:47 +08:00
ssongliu 8e5e0b0d88 fix: Fix the issue of abnormal display of the professional version of… (#8723)
Refs #8722
2025-05-19 03:15:39 +00:00
CityFun 12eb00d638 fix: fix issue with set default group (#8717)
Refs https://github.com/1Panel-dev/1Panel/issues/8712
2025-05-18 03:21:58 +00:00
ssongliu 8c46078b03 fix: Set the default value of DeveloperMode to enable (#8698) 2025-05-16 17:41:45 +08:00
ssongliu c7c3572ecd fix: Cronjob backup supports multiple selections (#8691)
Refs #8669 #8694
2025-05-16 06:30:14 +00:00
CityFun f9ccd10cc9 fix: fix error translate from website (#8688) 2025-05-16 11:57:18 +08:00
蘭 9a0488628a style: Mobile style optimization (#8689) 2025-05-16 11:57:06 +08:00
CityFun b47308cd71 feat: update WebsiteTypes usage (#8687) 2025-05-16 11:15:11 +08:00
ssongliu 64e4c23d12 fix: Fix the problem of abnormal switching of Chinese nodes (#8685) 2025-05-16 10:47:21 +08:00
CityFun 7ad31f532a feat: change docker pull process log (#8680) 2025-05-15 21:40:39 +08:00
CityFun 7210cd15f2 feat: fix issue with error domain match (#8677)
Refs https://github.com/1Panel-dev/1Panel/issues/8671
2025-05-15 10:47:12 +00:00
ssongliu c72bbaa5f7 fix: Fix the problem of abnormal display of snapshot task logs (#8676)
Refs #8657
2025-05-15 10:10:35 +00:00
CityFun b817f13212 feat: remove \n with mcp command (#8664) 2025-05-15 06:01:01 +00:00
CityFun b4581714fe fix: fix issue with set default website error (#8658) 2025-05-15 11:15:18 +08:00
ssongliu e2ce52f580 fix: Remove the redundant log print content (#8651) 2025-05-14 14:40:35 +00:00
ssongliu 41b9087110 fix: Fix the problem of failed quick command editing (#8650)
refs #8641
2025-05-14 14:38:34 +00:00
ssongliu d6723e20b8 fix: Fix the abnormal problems that occur when the license is unbound (#8640) 2025-05-14 10:54:34 +00:00
ssongliu 93f80e64cf fix: Delete the unused fields (#8639) 2025-05-14 10:52:34 +00:00
ssongliu 5d579660e3 fix: Modify the container jump path (#8638) 2025-05-14 10:50:35 +00:00
CityFun ebaa629342 fix: fix issue with clear the reverse proxy cache (#8637)
Refs https://github.com/1Panel-dev/1Panel/issues/8635
2025-05-14 10:48:34 +00:00
ssongliu c9f8c93083 fix: Fix the problem of abnormal synchronization of the script library (#8631) 2025-05-14 14:09:54 +08:00
CityFun 0941b0aad3 fix: fix issue with install runtime (#8630) 2025-05-14 06:06:25 +00:00
CityFun 7fc829d3a6 style: change some style (#8629) 2025-05-14 04:58:26 +00:00
ssongliu 9d198f7dfe style: Limit the display length of the node (#8627) 2025-05-14 04:48:26 +00:00
ssongliu 404e551f7b fix: Initialize the script library when the service starts (#8626) 2025-05-14 04:18:27 +00:00
ssongliu 6ecfb1f239 fix: The version upgrade adds internationalization processing (#8621) 2025-05-13 14:14:06 +00:00
ssongliu 300680d08e style: Adjust the order of the drop-down boxes for backup accounts (#8620) 2025-05-13 09:56:06 +00:00
ssongliu 4bed644a71 fix: Supplement the proxy Settings field (#8619) 2025-05-13 09:54:06 +00:00
CityFun a9e25889dd fix: fix issue with blank php app (#8618) 2025-05-13 17:52:41 +08:00
CityFun 788e7e6261 fix: fix issue with blank description (#8617) 2025-05-13 08:16:04 +00:00
CityFun 8a9f70851b feat: add some translate (#8615) 2025-05-13 08:14:03 +00:00
ssongliu 8a85fe6461 style: Adjust the display of license binding information (#8616) 2025-05-13 16:13:18 +08:00
ssongliu db02dbed16 fix: Simplify the migration information (#8614) 2025-05-13 15:17:08 +08:00
ssongliu d3dfd72a39 fix: Disable the free license editing button (#8613) 2025-05-13 06:22:02 +00:00
CityFun 27d7844004 fix: fix issue with update website config (#8611) 2025-05-12 10:41:59 +00:00
蘭 cd395b31bd feat: Adjust offline alert settings (#8607) 2025-05-12 17:11:08 +08:00
ssongliu 6d908a2d11 fix: Adjust the order and name of the menu (#8605) 2025-05-12 08:47:59 +00:00
ssongliu 02a9267fa1 fix: Fix the problem of failed task log acquisition (#8604) 2025-05-12 08:45:58 +00:00
CityFun bb5f04a9b0 fix: fix somme issue with system proxy (#8603) 2025-05-12 07:59:59 +00:00
ssongliu 32b9b3f31f fix: Merge dev code up to pr-8598 (#8602) 2025-05-12 15:59:45 +08:00
wanghe-fit2cloud ac922ae879 build: Remove source installation of upx 2025-05-12 15:51:55 +08:00
wanghe-fit2cloud d6af9cd088 build: Add upx compression 2025-05-12 15:48:33 +08:00
ssongliu a0dfbde0d3 feat: Support downloading scheduled task website log rotation files (#8597) 2025-05-12 05:57:59 +00:00
ssongliu 746882bc73 fix: Modify system version upgrade restrictions (#8598) 2025-05-12 05:47:57 +00:00
ssongliu 55bab2e255 fix: Fix the problem of eliminating file exceptions in the backup dir… (#8596) 2025-05-11 14:57:56 +00:00
CityFun 633dbe1aec fix: fix somme issue with website (#8594) 2025-05-11 13:49:55 +00:00
ssongliu fff7bfc3d2 style: Optimization of the loading style of the overview page (#8592) 2025-05-10 14:35:52 +00:00
ssongliu 6fdddc201f fix: Snapshots ignore the original existing snapshot files (#8591) 2025-05-10 14:33:51 +00:00
ssongliu f0375a83bb fix: Fix the problem of adding exceptions to the image repository (#8585) 2025-05-09 22:50:20 +08:00
ssongliu 123a2e8998 feat: The script library synchronizes and adds task logs (#8584) 2025-05-09 09:13:47 +00:00
CityFun f9a035f380 fix: fix somme issue with runtime (#8583)
#### What this PR does / why we need it?

#### Summary of your change

#### Please indicate you've done the following:

- [ ] Made sure tests are passing and test coverage is added if needed.
- [ ] Made sure commit message follow the rule of [Conventional Commits specification](https://www.conventionalcommits.org/).
- [ ] Considered the docs impact and opened a new docs issue or PR with docs changes if needed.
2025-05-09 08:53:48 +00:00
ssongliu 48575f5691 fix: Modify the license import logic (#8582) 2025-05-09 08:43:47 +00:00
蘭 3afef6fa99 refactor: Improve optimize code (#8581) 2025-05-09 07:57:48 +00:00
ssongliu e1635aa39d fix: Modify the execution mode of the planned tasks (#8580) 2025-05-09 07:55:48 +00:00
wanghe-fit2cloud 6dd99dbb25 build: optimize build script 2025-05-09 14:14:46 +08:00
CityFun a401829ff3 fix: change some translate (#8576) 2025-05-08 10:43:42 +00:00
CityFun 55ee480ba1 fix: fix some bugs with appstore (#8574) 2025-05-08 18:02:25 +08:00
ssongliu 69d24a8b90 fix: Fix some of the problems of node switching (#8573) 2025-05-08 10:01:42 +00:00
ssongliu 099ca7ff6c fix: Modify the planned task script display (#8569) 2025-05-08 06:47:42 +00:00
蘭 2b0e932ca5 feat: Improve alert (#8568) 2025-05-07 14:17:40 +00:00
CityFun f1cd0927d8 fix: fix some bugs with appstore (#8567) 2025-05-07 10:05:40 +00:00
蘭 af2b53412d style: Optimize page style (#8562) 2025-05-07 09:41:39 +00:00
ChengPlay a400caa114 feat: sync i18n setting to agent (#8561) 2025-05-07 10:51:22 +08:00
ssongliu 36e0aece06 style: Adjust the style of the ssh configuration page (#8560) 2025-05-07 08:03:41 +08:00
ssongliu 7534b680a7 fix: Fix the problem of snapshot synchronization failure (#8559) 2025-05-07 08:03:28 +08:00
ssongliu 74708dfa7a fix: Fix the problem of snapshot timeout (#8555) 2025-05-06 10:35:36 +00:00
ChengPlay 3c81aced62 fix: fix issue with appstore (#8554) 2025-05-06 18:33:07 +08:00
ssongliu bdeff3d281 fix: Fix the problem of abnormal display of database connection infor… (#8553) 2025-05-06 10:11:37 +00:00
ssongliu 64a14a6b2a feat: Support the selection of scripts from the script library for cr… (#8552) 2025-05-06 10:09:37 +00:00
ChengPlay 91843382c3 feat: Update agent appstore setting to core (#8550) 2025-05-06 10:07:37 +00:00
ChengPlay 16ec5fb997 feat: Fix issue where added certificate domains become ineffective. (#8549) 2025-05-06 18:05:29 +08:00
ChengPlay 47d9c996aa feat: Add demo mode handling (#8548) 2025-05-06 18:05:16 +08:00
ssongliu c460d9fd7d fix: Modify the script and upload the file name (#8538) 2025-05-04 13:20:06 +00:00
ssongliu 3533eed5f4 feat: Add the cleaning of the execution script (#8540) 2025-05-04 21:20:01 +08:00
ChengPlay 4b5526a028 feat: install openresty with default ssl (#8534) 2025-05-02 13:37:57 +00:00
ssongliu b382bd922b feat: Supports agents for the synchronous script library (#8527) 2025-04-30 10:43:52 +00:00
ChengPlay 043bfc8b45 feat: sync appstore use proxy (#8525) 2025-04-30 10:41:52 +00:00
ChengPlay f94a04b067 feat: add config for appstore (#8524) 2025-04-30 10:39:53 +00:00
ssongliu 4ecdbcb01f fix: Fix the problem of abnormal logs when error reports occur during… (#8522) 2025-04-30 10:37:52 +00:00
ssongliu a3f6dc334f fix: Fix the problem of abnormal operation of the script library (#8517) 2025-04-29 14:45:57 +00:00
ChengPlay b0a7efe9c3 feat: apply acme account use proxy (#8516) 2025-04-29 19:13:00 +08:00
ssongliu 4dfa421c1a fix: Fix the problem of abnormal container port jumps (#8514) 2025-04-29 11:07:57 +00:00
ChengPlay ea12a22575 feat: add some prompt (#8513) 2025-04-29 08:21:56 +00:00
蘭 9cc4f25185 fix: Dealing with some issues (#8511) 2025-04-29 08:01:59 +00:00
ssongliu 1b8e049ad3 fix: Fix the problem of abnormal script execution (#8510) 2025-04-29 07:59:57 +00:00
ssongliu 8bd712d891 fix: Fix the problem of abnormal recovery of the application state (#8512) 2025-04-29 15:58:21 +08:00
ChengPlay 0b581b748b feat: Change sync customAppConfig logic (#8509) 2025-04-29 07:57:56 +00:00
wanghe-fit2cloud 01578092e2 feat: Optimize versionNotSame 2025-04-29 11:21:29 +08:00
ssongliu e44a56e301 fix: Fix the problem of abnormal display of license import (#8506) 2025-04-28 14:45:48 +00:00
ChengPlay 2bde755fc4 feat: merge code from dev (#8504) 2025-04-28 14:43:48 +00:00
ssongliu 3f9eaecf37 fix: Fix the problem of abnormal menu display and hide switching (#8503) 2025-04-28 10:47:52 +00:00
ssongliu 48dc8dcebf fix: Add architectural judgment for node creation upgrade (#8502) 2025-04-28 10:45:48 +00:00
ChengPlay d6fde84dc9 feat: add spaceship dns provider (#8501)
Refs https://github.com/1Panel-dev/1Panel/issues/8494
2025-04-28 10:43:48 +00:00
ChengPlay e5bd5d17ba feat: merge mcp server from dev (#8499) 2025-04-28 07:21:47 +00:00
蘭 8338582051 feat: File management mounting directory (#8498) 2025-04-28 07:01:49 +00:00
蘭 6eacf0738e feat: Login page style optimization (#8497) 2025-04-28 06:59:47 +00:00
ssongliu 937ab76183 fix: Fix the problem of abnormal script execution (#8496) 2025-04-28 06:05:48 +00:00
ssongliu 39502b355f fix: Modify the license import method (#8495) 2025-04-28 06:03:48 +00:00
ssongliu e75449f19d fix: Fix the problem of abnormal terminal connection (#8493) 2025-04-27 15:21:45 +00:00
ChengPlay d025fc6abd feat: handle exist env file for app install (#8491) 2025-04-27 13:45:45 +00:00
ChengPlay 147db1ac0d feat: Remove drawer exit prompt. (#8490) 2025-04-27 10:54:51 +00:00
ChengPlay 3fc4d9557d feat: refreshTask when open task log (#8489) 2025-04-27 10:52:50 +00:00
ChengPlay cad4ee824a feat: Hide the favorites button for installed items. (#8488) 2025-04-27 17:16:49 +08:00
ssongliu ec1db8b5e9 fix: Fix the problem of abnormal system version detection (#8487) 2025-04-27 09:14:50 +00:00
ChengPlay f4038e879e feat(ssl): add vercel dns provider (#8485) 2025-04-27 14:51:38 +08:00
ssongliu 4aa628121c feat: Complete the Docker proxy synchronization function (#8480) 2025-04-25 14:37:54 +00:00
ChengPlay f485b1729c feat(website): Automatically create an ACME account on Start (#8479) 2025-04-25 10:55:52 +00:00
ChengPlay d8f1c462f1 feat(app): Add a favorite feature for installed applications (#8477)
Refs https://github.com/1Panel-dev/1Panel/issues/5903
2025-04-25 08:51:53 +00:00
ChengPlay 46120a74ed feat(website): Certificate application supports custom ACME addresses. (#8475) 2025-04-25 16:49:22 +08:00
ssongliu f367a6eaaf fix: Modify the node synchronization description information (#8473) 2025-04-25 10:48:10 +08:00
ssongliu 929da600a2 style: Optimize the node switching style (#8471) 2025-04-24 07:03:14 +00:00
ChengPlay b4cc3e4ab8 feat(website): Certificate application supports using a proxy. (#8469)
Refs https://github.com/1Panel-dev/1Panel/issues/4828
2025-04-24 07:01:14 +00:00
ssongliu c5c5addcb3 feat: Improve the license binding logic (#8466) 2025-04-23 23:03:36 +08:00
ssongliu 7dd39fa363 fix: Improve the node synchronization logic (#8467) 2025-04-23 14:55:12 +00:00
ChengPlay 9d48e591af fix(website): Add pinning feature for websites. (#8462) 2025-04-23 15:44:59 +08:00
ChengPlay 86cef9803c fix(app): Applications support single quotes in env files. (#8460)
Refs https://github.com/1Panel-dev/1Panel/issues/657
2025-04-23 07:31:10 +00:00
ssongliu 176a78ced6 feat: Improve the license binding logic (#8457) 2025-04-22 10:23:07 +00:00
蘭 3b6bb9bd22 feat: File management optimization (#8452)
Refs: #3545 #3387
2025-04-22 09:11:06 +00:00
ChengPlay 3370bac67a fix(app): Fix issue with leading zero parameter loss in applications. (#8450)
Refs https://github.com/1Panel-dev/1Panel/issues/6557
2025-04-22 09:09:07 +00:00
ChengPlay 86e6721be5 feat: Application installation supports limiting port binding to a sp… (#8440)
Refs https://github.com/1Panel-dev/1Panel/issues/3058
2025-04-21 09:52:48 +00:00
ChengPlay 9ee8cc86aa feat: Applications support setting a description field. (#8437)
Refs https://github.com/1Panel-dev/1Panel/issues/7065
2025-04-21 08:12:49 +00:00
ChengPlay 0d857d2f0c style: Optimize page styles. (#8436) 2025-04-21 08:10:49 +00:00
ChengPlay c29c00f4b7 feat: When creating files/folders, use the parent directory's user an… (#8419)
Refs https://github.com/1Panel-dev/1Panel/issues/6332
2025-04-18 08:52:27 +00:00
ChengPlay 66aeb38419 feat: Ignore application upgrades to bypass all subsequent versions (#8418)
Refs https://github.com/1Panel-dev/1Panel/issues/6978
2025-04-18 07:44:28 +00:00
ssongliu 5a1e010788 fix: Modify the terminal connection method (#8415) 2025-04-17 14:26:23 +00:00
ChengPlay 779260145c feat: Website list supports filtering by type. (#8414)
Refs https://github.com/1Panel-dev/1Panel/issues/6409
2025-04-17 14:24:24 +00:00
ChengPlay 52ec3b9887 feat: Supervisor supports automatic restart configuration. (#8413)
Refs https://github.com/1Panel-dev/1Panel/issues/7406
2025-04-17 14:22:24 +00:00
ChengPlay b520b748c6 feat: Certificate list supports search by name and hides specified co… (#8410)
Refs https://github.com/1Panel-dev/1Panel/issues/7550
2025-04-16 09:38:19 +00:00
ssongliu 9ffc601cf0 feat: Change the local connection mode of the terminal (#8409) 2025-04-16 17:37:07 +08:00
ssongliu 0ee7e1d675 style: Adjust the global interval style (#8408) 2025-04-16 08:20:20 +00:00
ChengPlay dafeab8704 feat: Add Node File Exchange (#8407) 2025-04-16 16:18:51 +08:00
ssongliu d10d83b648 feat: Modify the way of creating cronjob (#8403) 2025-04-16 06:00:17 +00:00
ssongliu c59105f050 feat: Encapsulate command execution methods (#8401) 2025-04-15 22:15:18 +08:00
蘭 e6433d6fbc feat: customize login page images and backgrounds (#8398) 2025-04-14 10:54:13 +00:00
ChengPlay 981037e250 fix(website): fix issue with create website with local php-fpm failed (#8379) 2025-04-11 07:10:01 +00:00
ssongliu ce4a770e23 feat: Support remote synchronization of script library scripts (#8371) 2025-04-11 07:08:02 +00:00
zhengkunwang 04f1722cce feat(monitor): add websites list display for monitor (#8361) 2025-04-09 10:27:56 +00:00
蘭 898be9e420 feat: Sync docker proxy to nodes (#8359) 2025-04-09 10:25:56 +00:00
ssongliu 0934534ac5 feat: Support user-defined description for backup (#8354)
Refs #4735
2025-04-09 02:15:54 +00:00
zhengkunwang d67dfe2dfd feat(app): delete parent dir after uninstall app (#8350) 2025-04-08 17:21:16 +08:00
ssongliu 00885c5c97 feat: Unify the encapsulation of the component for 'service not exist' (#8348) 2025-04-08 07:49:53 +00:00
ssongliu a5de96e08a fix: Node switchover information Added the node mode (#8347) 2025-04-08 07:47:53 +00:00
ssongliu 45dadc60e4 fix: Improve the script library script content (#8345) 2025-04-08 03:33:52 +00:00
ssongliu f5c174b839 fix: Fix the problem that the agent remembers the password invalid (#8334) 2025-04-07 08:53:50 +00:00
ssongliu b41afc152a style: Fixed an issue with autofill style exceptions in dark backgrounds (#8333) 2025-04-07 08:51:50 +00:00
ssongliu afbfd6b66c fix: Fix the problem that the theme color display is abnormal after t… (#8330)
…he upgrade
2025-04-07 07:41:51 +00:00
ssongliu 5cdc316293 fix: Fix the problem that some request connections are not released (#8329) 2025-04-07 07:39:50 +00:00
ssongliu e352de6744 fix: Fix the problem that the verification code is not displayed when… (#8325) 2025-04-07 02:23:49 +00:00
ssongliu 949e3c25a7 feat: The application installation jumps to the script library (#8317) 2025-04-03 16:15:57 +00:00
zhengkunwang fdf95297a5 feat(system): fix issue with upgrade redirect (#8316) 2025-04-03 16:14:30 +00:00
ssongliu 7364d580d7 style: Menu expansion and collapse changed to regular display (#8315) 2025-04-03 16:11:58 +00:00
ssongliu 4669be6669 fix: Modify the pure-ftpd encryption method (#8312) 2025-04-03 16:09:58 +00:00
zhengkunwang 4a249ba772 feat(app): fix sync custom app failed (#8310) 2025-04-03 16:07:58 +00:00
蘭 c93d229bae feat: Agent nodes offline, alert through the main node (#8303) 2025-04-02 10:23:53 +00:00
ssongliu eaefac4be4 fix: Fix the exception of refreshing the token of Ali Cloud Disk (#8288) 2025-04-01 09:25:52 +00:00
ssongliu 578fa45bb3 fix: Enable the ping ban function to be compatible with some IPv6 mac… (#8285) 2025-04-01 09:23:52 +00:00
ssongliu 4fd50cc3ad style: Adjust the home page recommended application style (#8284) 2025-04-01 10:21:13 +08:00
ssongliu 302877771c fix: Fix the problem of recovering application and website task logs (#8281) 2025-03-31 17:36:33 +08:00
ssongliu ac722054d2 fix: Fix the problem that the website directory is not backed up duri… (#8280) 2025-03-31 09:35:49 +00:00
zhengkunwang c7b6e15c1d feat(website): fix issues with create website with ftp failed (#8272) 2025-03-28 22:46:55 +08:00
ssongliu 5ee392b11e fix: Cancel synchronization between recommended nodes on dashboard (#8270) 2025-03-28 08:57:40 +00:00
zhengkunwang 076f3f0e0a feat(website): Restrict unhealthy application selection during websit… (#8269) 2025-03-28 08:55:39 +00:00
ssongliu 79c8349747 fix: Fix the exception of some 1pctl commands (#8268) 2025-03-27 14:49:37 +00:00
zhengkunwang 1908a59174 fix(app): fix issue with reinstall openresty failed (#8265) 2025-03-27 08:55:36 +00:00
ssongliu d09a3d82b9 fix: Fix the failure to back up file names containing Spaces for scheduled jobs (#8263) 2025-03-26 22:54:53 +08:00
ssongliu d4213daa58 fix: Optimize script library scripts and execution methods (#8262) 2025-03-26 10:07:35 +00:00
zhengkunwang 220b6223a3 feat(system): add session check for agent api (#8258) 2025-03-26 08:47:35 +00:00
ssongliu 732bbd8951 fix: Node switchover is cancelled when the master node unbinds the li… (#8253) 2025-03-26 07:47:34 +00:00
ssongliu 1b2f19560e feat: Added a reminder when the drawer is closed (#8248) 2025-03-25 19:11:25 +08:00
zhengkunwang f13d496b35 fix(system): fix issue with change system ssl failed (#8247) 2025-03-25 19:11:02 +08:00
ssongliu b3cd10b743 fix: Delete the data generated by the current snapshot (#8245) 2025-03-25 18:18:41 +08:00
zhengkunwang 0425cdcbb3 fix(app): fix issue with sync custom-app failed (#8246) 2025-03-25 09:31:33 +00:00
ssongliu 11349642da fix: Remove the jwt login mode (#8242) 2025-03-25 09:29:34 +00:00
zhengkunwang b871c710b2 fix(file): fix issue with download process not work (#8237) 2025-03-25 09:27:34 +00:00
ssongliu 06b7ae2a38 fix: Fix backup compression failure (#8234) 2025-03-25 02:11:32 +00:00
zhengkunwang 0bddeef63e feat(runtime): fix issue with install php runtime failed (#8230) 2025-03-24 10:41:30 +00:00
ssongliu a617424786 fix: fix some snapshot problems (#8228) 2025-03-24 17:38:45 +08:00
zhengkunwang 6a2ab8598b feat(website): fix issue with create load-balance failed (#8224) 2025-03-24 09:37:31 +00:00
ssongliu 7d81dad822 fix: Fix the abnormal status of the ollama model (#8223) 2025-03-24 09:35:31 +00:00
ssongliu 818ef0e1f0 fix: Fixed an issue where no default button is set for groups (#8217) 2025-03-21 10:49:25 +00:00
ssongliu 49d42061be fix: Fix the problem that the snapshot file download path is incorrect (#8216) 2025-03-21 10:43:25 +00:00
ssongliu 7c8e233bb1 fix: Modify session verification on the interface (#8213) 2025-03-21 09:19:25 +00:00
ssongliu 337dad2ca6 fix: Operation logs Add node information (#8212) 2025-03-21 09:17:24 +00:00
ssongliu 57f7cb30b4 fix: Adjust menu and node switching styles (#8206) 2025-03-21 08:47:46 +08:00
ssongliu f3369e8a9b fix: Modify the loading mode of container construction and push log (#8200) 2025-03-20 11:01:40 +08:00
ssongliu c05d5e0238 fix: Node update Added detection information (#8197) 2025-03-19 14:37:23 +00:00
ssongliu 4470b13d18 fix: Fix the problem that some Settings on the panel are abnormal (#8195) 2025-03-19 09:17:22 +00:00
ssongliu eeda0125bb feat: Add the default script information of the script library system (#8190) 2025-03-19 03:43:21 +00:00
zhengkunwang b4f7549b7c feat(ssl): update lego version (#8186) 2025-03-18 23:03:21 +08:00
zhengkunwang be76d25b58 fix(appstore): Handle redirection in app store (#8184) 2025-03-18 18:07:01 +08:00
蘭 727c6e6d32 feat: API interface IP whitelist supports IPv6 (#8182) 2025-03-18 17:16:44 +08:00
蘭 47d5e919a2 feat: Check for duplicate files before uploading/copying/moving (#8177) 2025-03-18 17:16:15 +08:00
zhengkunwang e7124b26df feat(supervisor): fix issue with open supervisor failed (#8176) 2025-03-18 11:12:26 +08:00
ssongliu ba1d5bfbc0 fix: Fix the problem that the local backup account modification does not take effect (#8175) 2025-03-18 11:12:06 +08:00
ssongliu 9cd83cd5dc fix: Fix log file generation failure (#8172) 2025-03-18 11:11:33 +08:00
zhengkunwang 5c048a590d fix(website): fix issue with change default website failed (#8171) 2025-03-18 11:11:15 +08:00
zhengkunwang cfb48b95e4 style(system): fix issue with enable ssl failed (#8159) 2025-03-14 22:38:51 +08:00
蘭 23f83068f1 feat: Unify the response body of the API interface (#8158) 2025-03-14 22:38:40 +08:00
ssongliu e64b3f2d7d fix: Modify the default group value (#8157) 2025-03-14 10:13:09 +00:00
zhengkunwang af5d12bfee style(website): optimize website config page logic (#8156) 2025-03-14 10:11:08 +00:00
ssongliu e9e425038c fix: Fix the abnormal display of system upgrade loading (#8154) 2025-03-14 06:53:08 +00:00
zhengkunwang 80a0afc135 fix(file): fix issue with copy file failed (#8153) 2025-03-14 06:51:08 +00:00
zhengkunwang 7eeca73337 fix(file): fix issue with file recycle bin delete failed (#8152) 2025-03-14 06:49:08 +00:00
ssongliu 35f384a0f6 feat: Improve international language and style (#8150) 2025-03-14 14:30:02 +08:00
ssongliu 1220a0c1ae fix: Fix the recommended application display exception (#8148) 2025-03-14 10:09:04 +08:00
ssongliu 47d8c405dd fix: Merge dev code up to pr #8141 (#8147) 2025-03-14 10:08:31 +08:00
zhengkunwang 4ff06401d9 fix(database): Fix missing database logs (#8145) 2025-03-13 18:25:01 +08:00
zhengkunwang c2dc38f02f fix(cronjob): fix issue with run cut website log failed (#8144) 2025-03-13 18:19:14 +08:00
ssongliu 2ed3aaa99b fix: Fix the firewall startup failure (#8141) 2025-03-13 07:09:06 +00:00
zhengkunwang fc649ded94 feat(container): optimize image pull display (#8140) 2025-03-13 14:53:42 +08:00
zhengkunwang 0d4abe8e8f feat(runtime): Add port validation when creating runtime environment (#8139) 2025-03-13 14:53:29 +08:00
zhengkunwang 0e1046c0a5 fix(appstore): Fix issue where uninstalling an application fails when selecting 'delete image'. (#8138) 2025-03-13 14:53:19 +08:00
ssongliu 2dfccdd2a9 fix: Fix the problem that the cache clears deleted log files by mistake (#8135) 2025-03-12 22:47:03 +08:00
zhengkunwang ce22f8a2d8 feat(appstore): Optimize custom application repository logic (#8133) 2025-03-12 17:44:03 +08:00
ssongliu 6ba44a239d fix: Modify the license promp (#8134) 2025-03-12 17:43:50 +08:00
zhengkunwang fa8f90c493 fix(website): fix issue with change website type failed (#8126) 2025-03-12 11:16:38 +08:00
ssongliu 99d3e65df5 fix: Modify the node initialization logic (#8124) 2025-03-11 23:08:32 +08:00
zhengkunwang 6ae1eea7b1 feat: Handle websocket and eventsource requests (#8121) 2025-03-11 18:25:16 +08:00
zhengkunwang fcc82360b2 fix:fix issue with enable system ssl failed (#8119) 2025-03-11 18:24:54 +08:00
zhengkunwang c56456203f fix:Fix issue with error during OpenResty reinstallation (#8117) 2025-03-11 13:45:50 +08:00
ssongliu 6c251e1a49 fix: Fix an exception caused by insufficient encryption string length (#8114) 2025-03-10 22:18:57 +08:00
zhengkunwang 1f842b49cc fix: Fix issue with failure to disable website cache (#8113) 2025-03-10 18:36:46 +08:00
zhengkunwang 63631b1118 feat: Add validation when applying wildcard domain certificates in HTTP mode (#8112) 2025-03-10 18:29:06 +08:00
zhengkunwang f4685b2831 fix: fix issue with download container log (#8111) 2025-03-10 17:29:11 +08:00
zhengkunwang c3ab1bde7e fix: fix issue with enable ai https failed (#8109) 2025-03-10 09:29:01 +00:00
ssongliu cd019750b4 fix: Adjust the 1panel service name (#8108) 2025-03-10 14:17:07 +08:00
ssongliu 7ef81bd9c7 feat: Container editing and upgrade support task log display (#8107) 2025-03-10 11:57:09 +08:00
ssongliu 08e2a70206 fix: Fix the display exception problem when the database application does not exist (#8094) 2025-03-07 15:43:58 +08:00
ssongliu f80dffd908 fix: Fix the restart panel exception (#8088) 2025-03-06 14:38:58 +00:00
zhengkunwang dd66622be1 feat(runtime): Optimize port selection for runtime environments (#8086) 2025-03-06 10:04:57 +00:00
ssongliu 07f2a34373 fix: Split the system log files (#8085) 2025-03-06 17:40:07 +08:00
ssongliu b13302775e fix: Fix the backup account synchronization exception (#8083) 2025-03-06 16:25:05 +08:00
zhengkunwang 9c238ce7aa fix: fix issue with run cronjob failed (#8082) 2025-03-06 16:24:43 +08:00
wanghe-fit2cloud e4c096295f feat: Optimize the packaging process 2025-03-06 15:22:44 +08:00
zhengkunwang e118a51ae0 feat(style): Update some prompt messages (#8081) 2025-03-06 14:28:53 +08:00
zhengkunwang 7f7731a52e fix(runtime): fix issue with install extensions failed in php runtime (#8071) 2025-03-05 11:20:58 +00:00
ssongliu d3efd02d69 fix: Modify the information about the upper limit of free nodes (#8070) 2025-03-05 11:18:57 +00:00
wanghe-fit2cloud 80e3693c5f feat: edit v2 goreleaser 2025-03-05 19:16:02 +08:00
王贺 858322e1fa Merge from dev to dev-v2 (#8069) 2025-03-05 17:47:19 +08:00
zhengkunwang 53a99400c0 fix(website): fix issue with backup failed in websites (#8068) 2025-03-05 15:37:18 +08:00
ssongliu a37fa5c77c feat: Support script library management (#8067) 2025-03-05 14:21:06 +08:00
zhengkunwang 8d2ea2f233 style(common): (#8064)
Adjust file selection UI
2025-03-05 14:20:21 +08:00
zhengkunwang 4b1154209b fix(file): Fix issue with abnormal display when calculating sizes of multiple folders simultaneously (#8065) 2025-03-05 14:20:05 +08:00
zhengkunwang 7a6e5376c4 feat(system): Fix issue with certificate failure in settings panel (#8063) 2025-03-04 22:37:20 +08:00
zhengkunwang 6092e768ef feat(file): Prevent progress display after file download completion (#8062) 2025-03-04 10:00:57 +00:00
zhengkunwang 9ee3832cda feat(website): Optimize website expiration time setting (#8061) 2025-03-04 09:58:57 +00:00
zhengkunwang f71ff7d80c feat: Restrict abnormal database selection during application installation (#8059) 2025-03-04 15:18:04 +08:00
zhengkunwang f242f71661 fix: Add length limit to comments (#8055) 2025-03-03 10:46:56 +00:00
zhengkunwang 660dc62f3c fix: Standardize logging component (#8054) 2025-03-03 17:35:29 +08:00
ssongliu 4cfc3439cb fix: Modify the recommended application synchronization mode (#8050) 2025-03-03 17:05:29 +08:00
zhengkunwang adbf44a176 fix: Fix issue where website group can still be deleted even if it contains other websites (#8049) 2025-03-03 16:18:47 +08:00
zhengkunwang 451b69072d fix: Fix issue with certificate application failure (#8048) 2025-03-03 06:32:56 +00:00
zhengkunwang a2716ef62f fix: Fix issue where editing source text during website redirection r… (#8046) 2025-03-03 06:30:56 +00:00
zhengkunwang 569aaf3c0a fix: Fix issue where website auth_basic is not effective (#8045) 2025-03-03 06:28:56 +00:00
ssongliu c3bd196a23 fix: Fix the problem of terminal saving failure (#8043) 2025-03-03 02:18:55 +00:00
ssongliu 5963e28b25 fix: Fix ollama model log exception (#8037) 2025-02-28 07:26:56 +00:00
zhengkunwang 2dec061603 fix: Fix some display errors (#8031) 2025-02-27 14:44:55 +00:00
ssongliu 6b0445763b fix: Fix scheduled task execution exceptions (#8030) 2025-02-27 14:42:54 +00:00
zhengkunwang 9a597adff3 feat: Update translations (#8029) 2025-02-27 17:54:19 +08:00
ssongliu 36c5e648e5 fix: Fix the monitoring data exception (#8028) 2025-02-27 17:51:09 +08:00
zhengkunwang 3de37a7cba feat: Optimize file selection UI (#8027) 2025-02-27 09:50:54 +00:00
zhengkunwang 7b1980f7b7 feat: Standardize runtime environment status handling (#8026) 2025-02-27 15:40:10 +08:00
ssongliu aae839f921 fix: Adjust the container task log (#8025) 2025-02-27 15:04:25 +08:00
zhengkunwang 24cabd214b fix: Fix issue with application recovery failure (#8024) 2025-02-27 14:37:42 +08:00
ssongliu 189ba73f51 feat: Support custom display of the global menu (#8023) 2025-02-27 03:04:54 +00:00
zhengkunwang 50979f69eb feat: Update translations (#8017) 2025-02-27 03:02:54 +00:00
zhengkunwang 19a3967603 feat: Fix issue where accessing with an unbound domain returns an error (#8014) 2025-02-26 17:02:17 +08:00
ssongliu d36311cff1 fix: Fix the problem of abnormal theme color switching (#8012) 2025-02-26 08:20:54 +00:00
zhengkunwang a81d5645ea feat: Change frontend locale code from 'tw' to 'zh-Hant' (#8010) 2025-02-26 08:18:53 +00:00
ssongliu 1289e15776 fix: Fix the issue of abnormal display on the monitoring page (#8007) 2025-02-26 14:05:10 +08:00
zhengkunwang 1f716cb85d Fix issue with runtime environment restart failure (#8008) 2025-02-26 14:04:23 +08:00
zhengkunwang 5e2bb27a47 feat:Update translations (#8004) 2025-02-26 13:52:03 +08:00
zhengkunwang 109c77a4b6 fix: Fix issue where saving throws an error after entering a decimal in frequency access limit (#7997) 2025-02-25 18:46:18 +08:00
ssongliu fb299179e8 fix: Improve some internationalized content (#7996) 2025-02-25 18:45:54 +08:00
zhengkunwang 51bb42c493 feat: Add download task button to view current ongoing download tasks (#7995) 2025-02-25 16:39:12 +08:00
zhengkunwang f18a37ad47 feat: Resolve issue with bulk domain generation failure (#7992) 2025-02-25 14:34:29 +08:00
ssongliu df156ad1f6 fix: Remove unused code (#7991) 2025-02-25 14:28:37 +08:00
ssongliu d64ed8c718 fix: Fix the issue of the container creation not popping up the task box (#7989) 2025-02-25 14:16:47 +08:00
ssongliu 79b8d17887 feat: Support gpu of schema v11 (#7987) 2025-02-25 14:16:22 +08:00
zhengkunwang ec746c021a feat: merge ai from dev (#7986) 2025-02-25 14:16:10 +08:00
ssongliu 90eca45347 feat: Merge code of gpu from dev (#7982) 2025-02-24 18:48:47 +08:00
zhengkunwang efa2fa9eac fix: Fix issue with .NET environment creation failure (#7980) 2025-02-24 10:17:52 +00:00
ssongliu 68146ec70b fix: Fix the style anomaly issue that occurs when the drawer is fully… (#7977) 2025-02-24 09:21:14 +00:00
zhengkunwang e6c1094c08 feat: Unified runtime environment status (#7978) 2025-02-24 17:20:07 +08:00
ssongliu ff32281257 fix: Modify the logic for adding hosts (#7976) 2025-02-24 17:19:28 +08:00
zhengkunwang 4087a7af3c feat: Added progress display for image pulling (#7955) 2025-02-24 10:42:51 +08:00
ssongliu b80c55c59c feat: Add the display of details for backup accounts. (#7941) 2025-02-21 10:17:09 +08:00
ssongliu 8e645d97b3 fix: Fix the issue of obtaining errors in global configuration. (#7924) 2025-02-20 13:30:05 +08:00
zhengkunwang 48abf71b29 fix: Fixed the issue with incorrect routing for quick jump during app… (#7916) 2025-02-19 10:16:35 +00:00
ssongliu 736200bd57 fix: Fix the issue of abnormal display of recommended applications on… (#7914) 2025-02-19 09:08:34 +00:00
zhengkunwang 33e23655d3 fix: Fixed the issue of failing to update reverse proxy files (#7910) 2025-02-19 07:42:30 +00:00
ssongliu 79ecd60ea8 feat: Optimize encryption method (#7908) 2025-02-19 15:38:14 +08:00
zhengkunwang b6dcf33114 feat: Updated partial translations. (#7905) 2025-02-19 05:38:51 +00:00
zhengkunwang 4da557fada feat(docker): The default network of 1panel-network supports IPv6. (#7857) 2025-02-12 13:51:31 +00:00
ssongliu ab03d5e40e feat: Improve the name of the professional version (#7855) 2025-02-12 13:50:15 +00:00
zhengkunwang 9a73537dfb feat(system): Modify the login page style (#7852) 2025-02-11 10:13:49 +00:00
ssongliu 9020110328 feat: add details of license error messages (#7851) 2025-02-11 10:11:48 +00:00
zhengkunwang e7cb8e2417 feat(website): Manually request certificates using a custom nameserver. (#7840) 2025-02-11 10:36:39 +08:00
ssongliu a0d01d9a55 feat: support adding license modification feature (#7838) 2025-02-10 18:17:11 +08:00
ssongliu 364edbe2ca fix: fix the issue of abnormal display of backup account size (#7833) 2025-02-10 03:18:32 +00:00
zhengkunwang 8c2bb231c6 feat(system): Optimize the logic of the login page (#7828) 2025-02-08 22:57:08 +08:00
ssongliu 368203443f fix: fix the issue of abnormal display of backup account size (#7827) 2025-02-08 22:56:57 +08:00
zhengkunwang 8b30308a4b feat(system): Password encryption for login API. (#7825) 2025-02-08 08:43:55 +00:00
zhengkunwang a86d56bef5 feat: Modify some translations. (#7824) 2025-02-08 08:41:28 +00:00
ssongliu 8440d77fd7 fix: Fix the issue of backup account synchronization failure (#7821) 2025-02-08 14:25:26 +08:00
ssongliu 6cd72f1a56 feat: Support for modifying host information (#7816) 2025-02-07 10:17:21 +00:00
zhengkunwang 88684c7cf0 feat: Update Login Page (#7815) 2025-02-07 10:15:20 +00:00
ssongliu b2fa0aa2d4 style: Optimize the styles of dashboard, container, and other pages (#7811) 2025-02-06 18:17:36 +08:00
zhengkunwang 46967db3ae feat: Merge from dev (#7808) 2025-02-06 10:15:06 +00:00
zhengkunwang 6744504443 feat: Running environment website adapts to multiple ports (#7805) 2025-02-06 13:55:37 +08:00
zhengkunwang d093c0b25b feat: Updated partial translations (#7802) 2025-02-05 22:41:09 +08:00
zhengkunwang 55592dbf1d feat: Updated partial translations (#7800) 2025-02-05 10:07:16 +00:00
ssongliu 40b099a978 feat: Improve the internationalization of the frontend. (#7778) 2025-01-27 11:06:26 +00:00
zhengkunwang edf24dbc49 feat: Runtime environment supports running without port configuration (#7775) 2025-01-26 22:29:20 +08:00
zhengkunwang 90354451d2 feat: Standardized interface name capitalization (#7770) 2025-01-24 14:38:10 +00:00
ssongliu 6a8e41937d fix: complete the missing international content (#7769) 2025-01-24 14:36:09 +00:00
zhengkunwang 77f8db7d38 feat: Installed Openresty and added automatic directory creation. (#7768) 2025-01-24 15:59:13 +08:00
ssongliu 8283cd7d02 feat: adjust internationalization errors and the positions of global … (#7767) 2025-01-24 03:00:07 +00:00
ssongliu d6b21f4ab5 fix: remove duplicate code (#7763) 2025-01-23 08:28:04 +00:00
ssongliu e66eb00bd0 feat: delete the test upload file of the backup account (#7758) 2025-01-22 22:26:51 +08:00
ssongliu 680e237ef3 fix: fix the issue of import cycle (#7757) 2025-01-22 15:52:45 +08:00
ssongliu fcc3f8e216 feat: optimize the invocation of proxy servers (#7755) 2025-01-22 14:28:22 +08:00
zhengkunwang 0d15a28f93 fix: Fix OpenResty Installation Failure (#7754) 2025-01-22 14:27:20 +08:00
ssongliu 4f1a56e66c feat: merge code from dev (#7750) 2025-01-21 10:32:14 +00:00
zhengkunwang 31057377c8 feat: merge from dev (#7729) 2025-01-15 18:25:59 +08:00
ssongliu b90a90c0c8 feat: Merge code from dev (#7726) 2025-01-15 06:24:24 +00:00
ssongliu bb250557a2 feat: Add node information synchronization steps (#7723) 2025-01-15 10:07:15 +08:00
ssongliu 78199a49ed feat: Add usage scope for backup accounts (#7716)
* feat: Add usage scope for backup accounts

* fix: 解决计划任务列表不显示备份账号的问题

* feat: 统一备份文件大小获取接口
2025-01-14 14:27:51 +08:00
zhengkunwang c4f9d29bcb feat(log): Handle Errors in Event Stream (#7708) 2025-01-13 15:08:05 +00:00
zhengkunwang e2354b8528 feat(log): Add Highlighting to Logs (#7707) 2025-01-13 15:54:59 +08:00
zhengkunwang 2185c3d2e0 feat(appstore): Handle container restarting status for App (#7676) 2025-01-09 17:02:22 +08:00
zhengkunwang 022580bbb2 feat(common): Standardize Event Bus (#7650) 2025-01-06 10:16:22 +00:00
zhengkunwang b1adafec2d feat(appstore): Handle Website Directory During Second Installation of OpenResty (#7649) 2025-01-06 17:09:48 +08:00
zhengkunwang dc020499b8 feat(files): Fix Issue with Recycle Bin Failing to Enable (#7636) 2025-01-03 14:38:10 +00:00
zhengkunwang 8e4b162b59 feat(website): Fix Issue with Creating Reverse Proxy Website (#7633) 2025-01-03 08:54:09 +00:00
ssongliu 6122aa3a3d feat: Increase version restrictions for node switching (#7631) 2025-01-03 08:52:08 +00:00
zhengkunwang c7936e656b feat(appstore): Add MD5 Checksum for Custom Application Store Packages (#7629) 2025-01-03 11:22:54 +08:00
zhengkunwang 992fecb16a feat(common): Optimize commonRepo Invocation (#7621) 2025-01-02 09:20:03 +00:00
zhengkunwang b1fbdcc566 feat(appstore): Add Synchronization of Main Node Application Store Pa… (#7612) 2024-12-31 09:57:55 +00:00
zhengkunwang 68698217ee feat(appstore): Optimize Custom Application Logic (#7603) 2024-12-30 21:04:11 +08:00
zhengkunwang 79fea272aa feat(task): Replace QQWry with GeoIP.mmdb (#7599) 2024-12-30 05:37:49 +00:00
ssongliu ba1d65f35f feat: The result of the scheduled task execution is based on the task (#7586) 2024-12-28 13:09:26 +00:00
ssongliu 72c86c3525 feat: Support modifying the node port (#7576) 2024-12-28 17:58:43 +08:00
ssongliu 4d548adbf7 feat: Uniform compression method (#7581) 2024-12-27 18:34:06 +08:00
zhengkunwang 554d2ab177 feat(task): Optimize Container Log Reading (#7575) 2024-12-27 06:55:03 +00:00
ssongliu 8fe40b7a97 feat: Complete the node initialization logic (#7571) 2024-12-26 07:38:56 +00:00
ssongliu 5dbd16a28d feat: Complete the node initialization logic (#7570) 2024-12-26 14:13:41 +08:00
zhengkunwang e56c0c7fba feat(task): Add Global Task List (#7569) 2024-12-26 14:13:28 +08:00
zhengkunwang 008c369a9b feat(task): fix Issue Where Task Logs Continue Periodic Requests After Being Opened (#7567) 2024-12-26 10:18:47 +08:00
zhengkunwang 4a4e568d4a feat(task): Add Display for Number of Running Tasks (#7564) 2024-12-26 10:15:57 +08:00
zhengkunwang e11a0d5766 feat(task): Add Execution Validation for Tasks (#7559) 2024-12-25 17:38:46 +08:00
ssongliu 42c97f6eeb feat: Add dialog component (#7553) 2024-12-24 14:22:47 +00:00
zhengkunwang b719383943 feat(website): Add Cache Clearing Functionality for Website Reverse P… (#7551) 2024-12-24 09:24:47 +00:00
ssongliu 542512fc58 feat: Support fix node (#7549) 2024-12-24 09:22:47 +00:00
zhengkunwang c6346b7b6f feat(runtime): Optimize Runtime Module Components (#7548) 2024-12-24 09:20:46 +00:00
zhengkunwang 18321d6e5a feat(system-security): Add new routes to whitelisted (#7543) 2024-12-24 06:50:46 +00:00
ssongliu 9e551edf31 feat: Add node service detection (#7545) 2024-12-24 06:48:45 +00:00
zhengkunwang da73f26ebe feat(system-security): Optimize Route Matching for Secure Entry (#7537) 2024-12-23 22:05:44 +08:00
ssongliu cd266d2567 feat: Synchronously update the firewall when modifying connection information (#7536) 2024-12-23 22:05:31 +08:00
zhengkunwang d103813311 feat(system-security): Add API for Synchronizing System Certificates (#7533) 2024-12-23 16:59:46 +08:00
ssongliu ddd8b6b63d feat: Add non-professional version node management page (#7529) 2024-12-23 15:51:46 +08:00
zhengkunwang 909b10f422 feat(system-security): Optimized unauthenticated settings to enhance system security (#7532) 2024-12-23 15:49:57 +08:00
zhengkunwang223 75142b33a4 feat(common): Standardize Permissions for Creating Folders and Files 2024-12-20 16:13:23 +08:00
ssongliu 7008774bb5 feat: merge code from dev (#7439) 2024-12-19 22:21:00 +08:00
ssongliu 7631c237e9 feat: Uniform state style (#7436) 2024-12-19 06:30:20 +00:00
zhengkunwang 7cb987434e feat(container): Align Container Memory Usage Display with Docker Stats (#7435) 2024-12-19 14:24:29 +08:00
zhengkunwang 07e4f34913 feat(component): Replace Drawer Component (#7428) 2024-12-18 10:08:16 +00:00
ssongliu 55a6cdcf10 feat: uniform application service status return (#7426) 2024-12-18 10:06:15 +00:00
zhengkunwang f6475e7c7f style(website): Update Nginx Status Page Styling (#7423) 2024-12-18 08:48:15 +00:00
zhengkunwang 05a92f0b0d feat: Remove Unnecessary Code Segments (#7420) 2024-12-18 07:08:15 +00:00
ssongliu 524c7144d3 feat: Optimize mobile style (#7417) 2024-12-18 06:32:14 +00:00
zhengkunwang d1feb502df feat: move cmd dir to core (#7389) 2024-12-17 12:48:10 +00:00
ssongliu a627aa9915 feat: merge from dev (#7366)
* feat: merge from dev

* feat: Merge mobile style code from the dev branch
2024-12-17 15:59:21 +08:00
ssongliu a8170a499a feat: Add support for multiple host license (#7296) 2024-12-10 05:57:38 +00:00
zhengkunwang e5660a0d91 feat: merge from dev (#7238) 2024-12-03 10:12:02 +08:00
ssongliu 841d1a31bf pref: Adjust node editing logic (#7217) 2024-11-30 19:42:41 +08:00
zhengkunwang 9b0916f0ed feat: merge from dev (#7216) 2024-11-30 19:42:10 +08:00
ssongliu 943cf2f9f9 pref: Improve the logic of basic node information (#7207) 2024-11-28 10:42:40 +00:00
zhengkunwang cfa08556fa feat(website): Handle uppercase domain names (#7191) 2024-11-27 08:02:35 +00:00
zhengkunwang 14c4d3c862 feat(file): Optimize file download progress tracking (#7186) 2024-11-26 14:04:31 +00:00
zhengkunwang ff0606b896 feat(session): Refactor session storage implementation (#7185) 2024-11-26 08:00:29 +00:00
ssongliu 45362a9819 feat(system-upgrade): Added support for multi-host upgrade and rollback (#7178)
* feat(system-upgrade): Added support for multi-host upgrade

* feat: Add supports of task display for node upgrade
2024-11-26 14:34:47 +08:00
liqiang-fit2cloud df3f105cf0 Update llm-code-review.yml 2024-11-22 10:11:48 +08:00
ssongliu b6641b2776 feat: optimize the SSH connection method for the host (#7126) 2024-11-19 10:24:05 +00:00
ssongliu 7067da7a8a feat: 完成 v2 构建 Makefile (#7120) 2024-11-18 14:58:05 +00:00
zhengkunwang a16810ed6d feat:WAF 拦截日志支持导出 (#7076) 2024-11-15 08:06:01 +00:00
zhengkunwang 82e15cb3e1 feat:WAF、网站监控增加日志定时清理 (#7057) 2024-11-14 10:38:01 +00:00
ssongliu 03e9077c9a feat: 备份账号增加 Google Drive (#7004) 2024-11-12 13:35:12 +08:00
ssongliu 9e82e2837d feat: 增加阿里云盘备份账号 (#6961) 2024-11-06 17:37:14 +08:00
liqiang-fit2cloud b721050c4d Update llm-code-review.yml 2024-11-05 14:57:48 +08:00
zhengkunwang b31ed9b920 feat: 优化缓存二级路由方式 (#6944) 2024-11-04 10:56:17 +00:00
liqiang-fit2cloud eab475a631 build: add code review action. 2024-11-04 18:35:08 +08:00
ssongliu 25311a729d feat: 备份账号增加又拍云 (#6911)
Refs #2698
2024-10-31 14:22:03 +00:00
zhengkunwang 638f390308 feat: 增加更新恶意IP组、蜘蛛IP池、IP地址库功能 (#6910) 2024-10-31 14:20:02 +00:00
zhengkunwang c52dddfa67 feat: 缓存上次访问的路由菜单 (#6897)
Refs https://github.com/1Panel-dev/1Panel/issues/6868
2024-10-30 09:18:40 +00:00
ssongliu f79adc9bc0 feat: 概览页支持调整应用显示 (#6892)
Refs #4862 #3819
2024-10-30 07:58:40 +00:00
zhengkunwang ef793f278a feat: 更换 IP 库 (#6890) 2024-10-30 07:02:40 +00:00
zhengkunwang a03b131057 feat: 统一后端错误处理 (#6882) 2024-10-29 10:42:12 +00:00
ssongliu 4b84124801 feat: 完成操作日志功能 (#6870) 2024-10-28 10:52:05 +00:00
ssongliu 4bb0974c4a feat: 优化防篡改拒绝操作提示信息 (#6797)
Refs #6062 #4710
2024-10-22 07:18:28 +00:00
ssongliu 810891236b feat: 增加容器创建表单内容 (#6772) 2024-10-18 08:43:37 +00:00
ssongliu 5821cf0061 feat: 概览页磁盘支持跳转挂载路径 (#6756)
Refs #4281
2024-10-17 09:25:30 +00:00
ssongliu f50c473cf6 feat: 容器镜像支持多选删除 (#6748)
Refs #6562
2024-10-17 07:27:31 +00:00
ssongliu 9c5da23a38 feat: 支持直接从命令创建容器,表单样式优化 (#6741) 2024-10-16 14:19:28 +00:00
ssongliu 14bbb8c65d feat: 容器列表支持搜索镜像 (#6736) 2024-10-16 17:36:43 +08:00
ssongliu bfa111541b feat: 计划任务增加文件备份 (#6732)
Refs #6703
2024-10-16 06:29:27 +00:00
ssongliu c8971dd0ef feat: 计划任务列表增加上次执行状态 (#6722)
Refs #6212 #6197
2024-10-15 08:07:22 +00:00
ssongliu 86bf7ea73a feat: 计划任务脚本支持选择用户及解释器 (#6721)
Refs #3933 #2738
2024-10-15 08:05:21 +00:00
ssongliu f3fd02fcb3 feat: 计划任务备份数据库增加任务日志 (#6717) 2024-10-15 08:03:21 +00:00
zhengkunwang 07bdcdc91b feat: 应用商店支持使用自定的应用包 (#6697) 2024-10-14 10:37:34 +08:00
ssongliu 72311617d9 feat: 计划任务支持自定义表达式,预览最近五次执行时间 (#6685)
Refs #4831
2024-10-10 14:11:01 +00:00
zhengkunwang 1184c7d60e feat: 运行环境增加 Python (#6679) 2024-10-10 18:12:05 +08:00
ssongliu d027a9a2ba feat: sftp 备份账号支持密钥添加 (#6677) 2024-10-10 18:11:51 +08:00
ssongliu b6aac773ea feat: 表格增加手动刷新按钮 (#6680)
Refs #6203
2024-10-10 10:05:02 +00:00
zhengkunwang 2565373db6 feat: 伪静态支持保存为模版 (#6663)
Refs https://github.com/1Panel-dev/1Panel/issues/705
2024-10-09 13:56:58 +00:00
zhengkunwang 958993f81f feat: 运行环境支持增加挂载 (#6662)
Refs https://github.com/1Panel-dev/1Panel/issues/5837
2024-10-09 09:26:57 +00:00
ssongliu e359e1c544 feat: 快照列表改为异步获取大小 (#6653)
Refs #6540
2024-10-08 13:58:55 +00:00
zhengkunwang e3329597bc feat: 运行环境支持增加环境变量 (#6652)
Refs https://github.com/1Panel-dev/1Panel/issues/4262
2024-10-08 13:56:55 +00:00
zhengkunwang 6c3311ba3c feat: 统一抽屉样式 (#6650) 2024-10-08 14:54:04 +08:00
zhengkunwang 5beb93dde2 feat: 备份恢复应用增加任务日志 (#6619) 2024-09-29 10:03:46 +00:00
zhengkunwang 4d560a3764 feat: 备份运行环境/静态网站时支持同步备份数据库 (#6618) 2024-09-29 16:00:00 +08:00
ssongliu 53e9af1a62 feat: 增加容器概览页面 (#6614) 2024-09-29 06:27:45 +00:00
zhengkunwang ed75ecc63b feat: 网站备份/恢复增加任务日志 (#6603) 2024-09-27 14:23:38 +00:00
ssongliu 4f1bdf5338 feat: 容器列表缓存是否显示应用商店容器 (#6599)
Refs #5885
2024-09-27 09:25:37 +00:00
ssongliuandssonglius11 157fff8481 feat: 镜像拉取、推送、构建改为任务方式实现 (#6598)
Co-authored-by: ssonglius11 <ssonglius11@163.com>
2024-09-27 14:33:32 +08:00
ssongliu c101dfb694 feat: 增加容器状态统计及状态快速切换 (#6594) 2024-09-26 14:01:32 +00:00
zhengkunwang 1e1fce4c77 feat: 网站增加切换数据库功能 (#6592) 2024-09-26 13:59:32 +00:00
ssongliu f8431c787f feat: 优化快照功能 (#6583) 2024-09-25 13:59:29 +00:00
zhengkunwang 7add6ab190 feat: PHP 运行环境增加进程守护管理 (#6580) 2024-09-25 21:58:55 +08:00
zhengkunwang 4720bda29b feat: OpenResty 增加默认扩展 (#6556) 2024-09-23 18:32:20 +08:00
zhengkunwang 3c0dca6992 feat: OpenResty 支持新增扩展 (#6543) 2024-09-20 17:24:57 +08:00
zhengkunwang 6a4897b0aa feat: openresty 异常状态下支持修改配置文件 (#6538) 2024-09-19 18:53:59 +08:00
zhengkunwang 8a5cb6c946 feat: 网站支持启动 http3 (#6501)
Refs https://github.com/1Panel-dev/1Panel/issues/3641
2024-09-14 10:12:32 +00:00
zhengkunwang 1bca3a182e feat: 优化 nginx 编辑器代码高亮 (#6497) 2024-09-14 16:03:33 +08:00
zhengkunwang 417ad81aa4 feat: 网站增加真实 IP 配置 (#6488)
Refs https://github.com/1Panel-dev/1Panel/issues/1028
2024-09-13 10:42:27 +00:00
zhengkunwang 68433c922b feat: 网站增加反代缓存配置 (#6473)
Refs https://github.com/1Panel-dev/1Panel/issues/3060
2024-09-12 10:06:22 +00:00
zhengkunwang 88961e4ab7 feat: 增加静态网站和 PHP 运行环境网站互相切换功能 (#6452)
Refs https://github.com/1Panel-dev/1Panel/issues/2532
2024-09-11 08:20:15 +00:00
zhengkunwang ad3670c9ad feat: PHP 增加性能调整配置 (#6420) 2024-09-09 09:08:04 +00:00
zhengkunwang 7aefd0df1a feat: 优化 PHP 运行环境扩展安装 (#6401) 2024-09-06 10:37:51 +00:00
zhengkunwang 1af83c1aeb feat: PHP 运行环境增加配置修改 (#6384) 2024-09-05 13:55:47 +00:00
zhengkunwang 44336c2ea2 feat: PHP 运行环境增加操作 (#6377) 2024-09-05 08:27:47 +00:00
zhengkunwang ba9feb0941 feat: PHP 运行环境增加扩展管理 (#6352) 2024-09-03 13:45:41 +00:00
zhengkunwang 2538944701 feat: PHP 多网站使用一个 PHP 容器 (#6338) 2024-09-02 21:56:24 +08:00
zhengkunwang 42f904e25a feat: 删除证书自动吊销证书 (#6300)
Refs https://github.com/1Panel-dev/1Panel/issues/4781
2024-08-29 10:45:25 +00:00
zhengkunwang c492796cf8 feat: OpenResty 卸载不删除网站 (#6297)
Refs https://github.com/1Panel-dev/1Panel/issues/5726
2024-08-29 10:39:25 +00:00
zhengkunwang bc8a2511d1 feat: OpenResty 安装支持指定网站目录 (#6277) 2024-08-28 17:48:16 +08:00
zhengkunwang 6f1e5074ed feat: 应用增加面板版本限制 (#6264) 2024-08-27 14:39:24 +08:00
zhengkunwang 7b9456453c feat: 应用商店设置增加默认访问地址 (#6250) 2024-08-26 18:34:34 +08:00
zhengkunwang 53cfb2e755 feat: 应用增加 Web 访问地址 (#6248) 2024-08-26 07:37:13 +00:00
zhengkunwang 4ac5ff7cf0 feat: 应用支持启用 GPU (#6246) 2024-08-26 13:40:27 +08:00
zhengkunwang 3c19a07226 feat: 应用增加内存需求展示 (#6224) 2024-08-23 09:38:58 +00:00
zhengkunwang 034645f50c feat: 增加同步本地应用接口 (#6217) 2024-08-23 17:22:05 +08:00
zhengkunwang 5865a958fc feat: 同步远程应用增加日志 (#6209) 2024-08-22 10:48:55 +00:00
ssongliu cfe4fa7a92 feat: 增加终端自定义配置 (#6208) 2024-08-22 10:46:54 +00:00
zhengkunwang 12b7f806f9 feat: 应用详情增加架构信息 (#6204)
Refs https://github.com/1Panel-dev/1Panel/issues/3026
2024-08-22 07:08:55 +00:00
ssongliu a44c4d96d8 fix: 优化 repo 部分公共方法 (#6200) 2024-08-21 10:04:51 +00:00
ssongliu 1215e3bb30 fix: 切换子节点请求方式 (#6195) 2024-08-21 07:14:50 +00:00
zhengkunwang 6dec845848 feat: 优化应用启动 (#6193) 2024-08-21 03:46:49 +00:00
ssongliu 37df602ae8 feat: 提取分组及快速命令功能 (#6169) 2024-08-19 10:04:43 +00:00
zhengkunwang 7fb42d7b47 feat: 负载均衡增加源文编辑 (#6153) 2024-08-16 18:09:00 +08:00
zhengkunwang bf82fe743c feat: 网站增加负载均衡管理 (#6144) 2024-08-15 23:15:29 +08:00
ssongliu 2c2228192f feat: 完善节点管理功能 (#6139) 2024-08-15 17:06:50 +08:00
zhengkunwang 226bf9d8d2 style: 部分页面增加自适应 (#6127) 2024-08-14 10:29:59 +00:00
ssongliu 46fda7ecfb fix: 移除 gorm 类型参数 (#6123) 2024-08-14 10:43:32 +08:00
ssongliu 6da0445509 feat: 修改备份账号同步方式 (#6120) 2024-08-14 02:15:55 +00:00
ssongliu f0274701cf feat: 修改备份账号同步方式 (#6108) 2024-08-13 15:33:34 +08:00
zhengkunwang d100edb75b feat: 优化应用安装和删除逻辑 (#6112) 2024-08-13 15:28:39 +08:00
zhengkunwang c7c5f75d17 feat: 网站子目录绑定域名 (#6098)
Refs https://github.com/1Panel-dev/1Panel/issues/2336
Refs https://github.com/1Panel-dev/1Panel/issues/6024
2024-08-12 09:08:52 +00:00
zhengkunwang e0f628c59f feat: 网站列可编辑显示 (#6090) 2024-08-11 14:42:48 +00:00
zhengkunwang 62dfae8fc8 feat: 网站域名增加快速跳转 (#6086) 2024-08-10 23:48:59 +08:00
ssongliu fecba858a5 feat: 备份账号增删改查操作同步到节点 (#6081) 2024-08-09 10:30:39 +00:00
zhengkunwang 9114df9c2a feat: 网站密码认证支持子目录 (#6078)
Refs https://github.com/1Panel-dev/1Panel/issues/5863
2024-08-09 10:00:39 +00:00
zhengkunwang e003d74506 feat: 网站 HTTPS 逻辑优化 (#6074) 2024-08-09 17:05:13 +08:00
zhengkunwang a225d2d79a feat: 优化网站域名添加 (#6069) 2024-08-08 10:26:36 +00:00
ssongliu 94b5a7fae4 feat: 同类备份账号支持添加多条 (#6061) 2024-08-08 07:38:37 +00:00
zhengkunwang 3d2d4318c7 feat: 网站支持设置 HTTPS 端口 (#6056) 2024-08-08 10:14:28 +08:00
zhengkunwang 2f34e1727f feat: 创建网站支持直接选择 SSL 证书并启用 HTTPS (#6053) 2024-08-07 08:40:35 +00:00
zhengkunwang b359c7d990 feat: 创建 PHP 运行环境网站支持同步创建数据库 (#6051) 2024-08-07 05:52:34 +00:00
zhengkunwang 5cf174be84 feat: 创建反代网站支持直接选择应用 (#6044) 2024-08-06 09:30:30 +00:00
zhengkunwang f2a2c7996f feat: 卸载应用增加任务日志 (#6043) 2024-08-06 08:28:30 +00:00
ssongliu d005e7b4c9 feat: 优化接口文档生成 (#6042) 2024-08-06 08:20:31 +00:00
zhengkunwang e59072e5a7 feat: 卸载应用支持删除镜像 (#6040) 2024-08-06 14:41:40 +08:00
ssongliu 370463366b feat: 修改部分监控接口 (#6033) 2024-08-05 10:22:25 +00:00
ssonglius11 9f4d9a3f00 fix: 修改提交忽略项 2024-08-02 18:33:06 +08:00
ssonglius11 9b36f047fd fix: 修改文件引用 2024-08-02 18:26:14 +08:00
ssongliu 0f70d37950 fix: 解决本地服务启动失败的问题 2024-08-02 17:29:04 +08:00
ssongliu 1ae5f945b1 feat: 完成节点添加及删除功能 (#6013) 2024-08-02 16:49:43 +08:00
zhengkunwang 25b189069c feat: 应用升级增加日志 (#6011) 2024-08-02 08:00:15 +00:00
zhengkunwang bdece10868 feat: 增加任务日志列表 (#5999) 2024-08-01 17:37:36 +08:00
zhengkunwang 636e149b29 feat: 应用安装增加日志展示 (#5996) 2024-08-01 15:31:44 +08:00
zhengkunwang 82d8997217 style: 应用商店样式调整 (#5993) 2024-08-01 10:59:43 +08:00
ssongliu 256c4ceecc Merge branch 'dev-v2' of github.com:1Panel-dev/1Panel into dev-v2 2024-07-31 18:31:37 +08:00
ssongliu 1e9494fa2b feat: 节点证书验证启动 2024-07-31 18:29:41 +08:00
zhengkunwang223 0e5d6e825e feat: 创建网站、应用任务化 2024-07-29 18:09:57 +08:00
ssongliu 865b6cba3f feat: 增加节点切换 2024-07-29 14:13:47 +08:00
ssongliu d6c5cab08d feat: 修改数据库名称 2024-07-26 15:35:35 +08:00
ssongliu c0b39ffcbf feat: 修改路由中间件 2024-07-25 18:13:57 +08:00
ssongliu fafa042ee9 feat: core 增加 xpack 节点管理 2024-07-25 14:43:41 +08:00
zhengkunwang223 cabca70ee5 feat: 本地 agent 使用 unix 通信 2024-07-23 18:14:20 +08:00
ssongliu 8d28b7db94 pref: backend 重命名 agent 2024-07-23 14:48:37 +08:00
ssongliu 45c9aaa591 pref: 修改目录结构 2024-07-23 14:48:05 +08:00
ssongliu b277fc0fa5 feat: 部分接口增加代理设置 2024-07-23 10:11:43 +08:00
ssongliu 9cdc4a7303 feat: agent 功能代码拆分 2024-07-22 16:14:59 +08:00
zhengkunwang223 ef03a75aea feat: 增加节点管理 demo 页面 2024-07-22 13:51:14 +08:00
ssongliu 2ef7b8b3b1 feat: core 功能代码拆分 2024-07-19 19:04:11 +08:00
zhengkunwang afcf509ec0 feat: 增加任务引擎 (#5763) 2024-07-17 17:16:11 +08:00
zhengkunwang f3fac23a84 feat: 统一日志组件 (#5727) 2024-07-17 17:16:11 +08:00
zhengkunwang d91ce3da65 feat: 统一 CodeMirror 组件 (#5716) 2024-07-17 17:16:11 +08:00
zhengkunwang ed2f5c42d0 feat: 统一抽屉组件 (#5691) 2024-07-17 17:16:08 +08:00
zhengkunwang a1b1790935 style: 统一优化页面布局 (#5654) 2024-07-17 17:13:56 +08:00
zhengkunwang 87be4af655 feat: 删除部分无用代码 (#5637) 2024-07-17 17:13:56 +08:00
1392 changed files with 168669 additions and 128479 deletions
+1 -1
View File
@@ -47,4 +47,4 @@ body:
- type: textarea
attributes:
label: "Additional Information"
description: "If you have any additional information to provide, you can include it here (screenshots, videos, etc., are welcome)."
description: "If you have any additional information to provide, you can include it here (screenshots, videos, etc., are welcome)."
+1 -1
View File
@@ -2,4 +2,4 @@ blank_issues_enabled: false
contact_links:
- name: Questions & Discussions
url: https://github.com/1Panel-dev/1Panel/discussions
about: Raise questions about the installation, deployment, use and other aspects of the project.
about: Raise questions about the installation, deployment, use and other aspects of the project.
+1
View File
@@ -1,3 +1,4 @@
name: General PR Handling for 1Panel
on: pull_request
permissions:
+1 -1
View File
@@ -44,4 +44,4 @@ jobs:
access-key-secret: ${{ secrets.OSS_ACCESS_KEY_SECRET }}
ossutil-version: '1.7.18'
- name: Upload Assets to OSS
run: ossutil cp -r dist/ oss://resource-fit2cloud-com/1panel/package/stable/${{ github.ref_name }}/release/ --include "*.tar.gz" --include "checksums.txt" --only-current-dir --force
run: ossutil cp -r dist/ oss://resource-fit2cloud-com/1panel/package/v2/stable/${{ github.ref_name }}/release/ --include "*.tar.gz" --include "checksums.txt" --only-current-dir --force
+1 -1
View File
@@ -42,4 +42,4 @@ jobs:
rclone_config: ${{ secrets.RCLONE_CONFIG }}
- name: Upload to Cloudflare R2
run: |
rclone copy dist/ cloudflare_r2:package/stable/${{ github.ref_name }}/release/ --include "*.tar.gz" --include "checksums.txt" --progress
rclone copy dist/ cloudflare_r2:package/v2/stable/${{ github.ref_name }}/release/ --include "*.tar.gz" --include "checksums.txt" --progress
+1 -1
View File
@@ -11,4 +11,4 @@ jobs:
- uses: usthe/issues-translate-action@v2.7
with:
IS_MODIFY_TITLE: true
BOT_GITHUB_TOKEN: ${{ secrets.ISSUE_TRANSLATOR_TOKEN }}
BOT_GITHUB_TOKEN: ${{ secrets.ISSUE_TRANSLATOR_TOKEN }}
+1 -1
View File
@@ -22,4 +22,4 @@ jobs:
# max_tokens: 10000
MAX_PATCH_LENGTH: 10000
IGNORE_PATTERNS: "/node_modules,*.md,/dist,/.github"
FILE_PATTERNS: "*.java,*.go,*.py,*.vue,*.ts,*.js,*.css,*.scss,*.html"
FILE_PATTERNS: "*.java,*.go,*.py,*.vue,*.ts,*.js,*.css,*.scss,*.html"
+1 -1
View File
@@ -17,4 +17,4 @@ jobs:
uses: SonarSource/sonarcloud-github-action@master
env:
GITHUB_TOKEN: ${{ secrets.GITHUBTOKEN }}
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
+1 -1
View File
@@ -12,4 +12,4 @@ jobs:
dst_key: ${{ secrets.GITEE_PRIVATE_KEY }}
dst_token: ${{ secrets.GITEE_TOKEN }}
static_list: "1Panel"
force_update: true
force_update: true
+1 -1
View File
@@ -8,4 +8,4 @@ jobs:
- name: Checkout Actions Repository
uses: actions/checkout@v2
- name: Check spelling
uses: crate-ci/typos@master
uses: crate-ci/typos@master
+21 -7
View File
@@ -4,7 +4,8 @@
*.dll
*.so
*.dylib
build/1panel
build/1panel-agent
build/1panel-core
# Mac
.DS_Store
@@ -14,6 +15,7 @@ build/1panel
.vscode
*.project
*.factorypath
__debug*
# IntelliJ IDEA
.idea/*
@@ -22,6 +24,7 @@ build/1panel
*.iml
*.ipr
# Test binary, built with `go test -c`
*.test
@@ -31,15 +34,23 @@ build/1panel
# Dependency directories
/pkg/
backend/__debug_bin
cmd/server/__debug_bin
cmd/server/web/assets
cmd/server/web/monacoeditorwork
cmd/server/web/index.html
core/cmd/server/__debug_bin
core/cmd/server/web/assets
core/cmd/server/web/monacoeditorwork
core/cmd/server/web/index.html
frontend/auto-imports.d.ts
frontend/components.d.ts
frontend/src/xpack
backend/xpack
*_xpack.go
agent/xpack
agent/router/entry_xpack.go
agent/server/init_xpack.go
agent/utils/xpack/xpack_xpack.go
core/xpack
core/router/entry_xpack.go
core/server/init_xpack.go
core/utils/xpack/xpack_xpack.go
xpack
.history/
dist/
1pctl
@@ -49,3 +60,6 @@ quick_start.sh
cmd/server/fileList.txt
.fileList.txt
1Panel.code-workspace
core/.golangci.yml
agent/.golangci.yml
+35 -4
View File
@@ -9,11 +9,12 @@ before:
- chmod +x ./ci/script.sh
- ./ci/script.sh
- sed -i 's@ORIGINAL_VERSION=.*@ORIGINAL_VERSION=v{{ .Version }}@g' 1pctl
- go mod tidy
builds:
- main: ./cmd/server/main.go
binary: 1panel
- id: agent
dir: agent
main: cmd/server/main.go
binary: 1panel-agent
flags:
- -tags=xpack
- -trimpath
@@ -31,14 +32,44 @@ builds:
- arm
- ppc64le
- s390x
hooks:
post:
- ./ci/script.sh compress_binary {{ .Path }} {{ .Arch }}
- id: core
dir: core
main: cmd/server/main.go
binary: 1panel-core
flags:
- -tags=xpack
- -trimpath
ldflags:
- -w -s
env:
- CGO_ENABLED=0
goos:
- linux
goarm:
- 7
goarch:
- amd64
- arm64
- arm
- ppc64le
- s390x
hooks:
post:
- ./ci/script.sh compress_binary {{ .Path }} {{ .Arch }}
archives:
- formats: [ 'tar.gz' ]
ids: [core, agent]
name_template: "1panel-v{{ .Version }}-{{ .Os }}-{{ .Arch }}{{- if .Arm }}v{{ .Arm }}{{ end }}"
wrap_in_directory: true
files:
- 1pctl
- 1panel.service
- 1panel-core.service
- 1panel-agent.service
- install.sh
- GeoIP.mmdb
- lang/*
BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.3 KiB

After

Width:  |  Height:  |  Size: 6.1 KiB

+3
View File
@@ -0,0 +1,3 @@
{
"ansible.python.interpreterPath": "/opt/homebrew/bin/python3"
}
+29 -14
View File
@@ -2,33 +2,48 @@ GOCMD=go
GOBUILD=$(GOCMD) build
GOCLEAN=$(GOCMD) clean
GOARCH=$(shell go env GOARCH)
GOOS=$(shell go env GOOS)
GOOS=$(shell go env GOOS )
BASE_PATH := $(shell pwd)
BUILD_PATH = $(BASE_PATH)/build
WEB_PATH=$(BASE_PATH)/frontend
SERVER_PATH=$(BASE_PATH)/backend
MAIN= $(BASE_PATH)/cmd/server/main.go
APP_NAME=1panel
ASSERT_PATH= $(BASE_PATH)/cmd/server/web/assets
ASSERT_PATH= $(BASE_PATH)/core/cmd/server/web/assets
CORE_PATH=$(BASE_PATH)/core
CORE_MAIN=$(CORE_PATH)/cmd/server/main.go
CORE_NAME=1panel-core
AGENT_PATH=$(BASE_PATH)/agent
AGENT_MAIN=$(AGENT_PATH)/cmd/server/main.go
AGENT_NAME=1panel-agent
clean_assets:
rm -rf $(ASSERT_PATH)
upx_bin:
upx $(BUILD_PATH)/$(APP_NAME)
upx $(BUILD_PATH)/$(CORE_NAME)
upx $(BUILD_PATH)/$(AGENT_NAME)
build_frontend:
cd $(WEB_PATH) && npm install && npm run build:pro
build_backend_on_linux:
cd $(SERVER_PATH) \
&& GOOS=$(GOOS) GOARCH=$(GOARCH) $(GOBUILD) -trimpath -ldflags '-s -w' -o $(BUILD_PATH)/$(APP_NAME) $(MAIN)
build_core_on_linux:
cd $(CORE_PATH) \
&& GOOS=$(GOOS) GOARCH=$(GOARCH) $(GOBUILD) -trimpath -ldflags '-s -w' -o $(BUILD_PATH)/$(CORE_NAME) $(CORE_MAIN)
build_backend_on_darwin:
cd $(SERVER_PATH) \
&& GOOS=linux GOARCH=amd64 $(GOBUILD) -trimpath -ldflags '-s -w' -o $(BUILD_PATH)/$(APP_NAME) $(MAIN)
build_agent_on_linux:
cd $(AGENT_PATH) \
&& GOOS=$(GOOS) GOARCH=$(GOARCH) $(GOBUILD) -trimpath -ldflags '-s -w' -o $(BUILD_PATH)/$(AGENT_NAME) $(AGENT_MAIN)
build_all: build_frontend build_backend_on_linux
build_core_on_darwin:
cd $(CORE_PATH) \
&& GOOS=linux GOARCH=amd64 $(GOBUILD) -trimpath -ldflags '-s -w' -o $(BUILD_PATH)/$(CORE_NAME) $(CORE_MAIN)
build_on_local: clean_assets build_frontend build_backend_on_darwin upx_bin
build_agent_on_darwin:
cd $(AGENT_PATH) \
&& GOOS=linux GOARCH=amd64 $(GOBUILD) -trimpath -ldflags '-s -w' -o $(BUILD_PATH)/$(AGENT_NAME) $(AGENT_MAIN)
build_all: build_frontend build_core_on_linux build_agent_on_linux
build_on_local: clean_assets build_frontend build_core_on_darwin build_agent_on_darwin upx_bin
+2 -4
View File
@@ -61,9 +61,7 @@ Please refer to our [documentation](https://docs.1panel.pro/quick_start/) for mo
## Pro Edition
Compared to the OSS Edition, 1Panel Pro Edition provides users with a wealth of enhanced features and technical support services. Enhanced features include WAF enhancement, Website monitoring, Mobile APP, custom logo and theme, etc.
[Click to see Pro Edition details](https://1panel.pro/pricing).
Compared to the OSS Edition, 1Panel Pro Edition provides users with a wealth of enhanced features and technical support services. Enhanced features include WAF enhancement, website tamper protection, website monitoring, GPU monitoring, custom logo and theme color, etc. [Click to view the detailed introduction of the Pro Edition](https://1panel.pro/pricing).
## Security Information
@@ -75,4 +73,4 @@ Licensed under The GNU General Public License version 3 (GPLv3) (the "License")
<https://www.gnu.org/licenses/gpl-3.0.html>
Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
@@ -1,12 +1,11 @@
package v1
package v2
import (
"github.com/1Panel-dev/1Panel/backend/app/api/v1/helper"
"github.com/1Panel-dev/1Panel/backend/app/dto"
"github.com/1Panel-dev/1Panel/backend/constant"
"github.com/1Panel-dev/1Panel/backend/utils/ai_tools/gpu"
"github.com/1Panel-dev/1Panel/backend/utils/ai_tools/gpu/common"
"github.com/1Panel-dev/1Panel/backend/utils/ai_tools/xpu"
"github.com/1Panel-dev/1Panel/agent/app/api/v2/helper"
"github.com/1Panel-dev/1Panel/agent/app/dto"
"github.com/1Panel-dev/1Panel/agent/utils/ai_tools/gpu"
"github.com/1Panel-dev/1Panel/agent/utils/ai_tools/gpu/common"
"github.com/1Panel-dev/1Panel/agent/utils/ai_tools/xpu"
"github.com/gin-gonic/gin"
)
@@ -25,8 +24,8 @@ func (b *BaseApi) CreateOllamaModel(c *gin.Context) {
return
}
if err := AIToolService.Create(req.Name); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
if err := aiToolService.Create(req); err != nil {
helper.BadRequest(c, err)
return
}
helper.SuccessWithData(c, nil)
@@ -47,8 +46,8 @@ func (b *BaseApi) RecreateOllamaModel(c *gin.Context) {
return
}
if err := AIToolService.Recreate(req.Name); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
if err := aiToolService.Recreate(req); err != nil {
helper.BadRequest(c, err)
return
}
helper.SuccessWithData(c, nil)
@@ -69,8 +68,8 @@ func (b *BaseApi) CloseOllamaModel(c *gin.Context) {
return
}
if err := AIToolService.Close(req.Name); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
if err := aiToolService.Close(req.Name); err != nil {
helper.BadRequest(c, err)
return
}
helper.SuccessWithData(c, nil)
@@ -84,9 +83,9 @@ func (b *BaseApi) CloseOllamaModel(c *gin.Context) {
// @Router /ai/ollama/model/sync [post]
// @x-panel-log {"bodyKeys":[],"paramKeys":[],"BeforeFunctions":[],"formatZH":"同步 Ollama 模型列表","formatEN":"sync Ollama model list"}
func (b *BaseApi) SyncOllamaModel(c *gin.Context) {
list, err := AIToolService.Sync()
list, err := aiToolService.Sync()
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.BadRequest(c, err)
return
}
helper.SuccessWithData(c, list)
@@ -106,9 +105,9 @@ func (b *BaseApi) SearchOllamaModel(c *gin.Context) {
return
}
total, list, err := AIToolService.Search(req)
total, list, err := aiToolService.Search(req)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.BadRequest(c, err)
return
}
@@ -132,9 +131,9 @@ func (b *BaseApi) LoadOllamaModelDetail(c *gin.Context) {
return
}
detail, err := AIToolService.LoadDetail(req.Name)
detail, err := aiToolService.LoadDetail(req.Name)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.BadRequest(c, err)
return
}
@@ -156,12 +155,12 @@ func (b *BaseApi) DeleteOllamaModel(c *gin.Context) {
return
}
if err := AIToolService.Delete(req); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
if err := aiToolService.Delete(req); err != nil {
helper.BadRequest(c, err)
return
}
helper.SuccessWithOutData(c)
helper.Success(c)
}
// @Tags AI
@@ -176,7 +175,7 @@ func (b *BaseApi) LoadGpuInfo(c *gin.Context) {
if ok {
info, err := client.LoadGpuInfo()
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.BadRequest(c, err)
return
}
helper.SuccessWithData(c, info)
@@ -186,7 +185,7 @@ func (b *BaseApi) LoadGpuInfo(c *gin.Context) {
if xpuOK {
info, err := xpuClient.LoadGpuInfo()
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.BadRequest(c, err)
return
}
helper.SuccessWithData(c, info)
@@ -208,11 +207,11 @@ func (b *BaseApi) BindDomain(c *gin.Context) {
if err := helper.CheckBindAndValidate(&req, c); err != nil {
return
}
if err := AIToolService.BindDomain(req); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
if err := aiToolService.BindDomain(req); err != nil {
helper.BadRequest(c, err)
return
}
helper.SuccessWithOutData(c)
helper.Success(c)
}
// @Tags AI
@@ -228,9 +227,9 @@ func (b *BaseApi) GetBindDomain(c *gin.Context) {
if err := helper.CheckBindAndValidate(&req, c); err != nil {
return
}
res, err := AIToolService.GetBindDomain(req)
res, err := aiToolService.GetBindDomain(req)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.BadRequest(c, err)
return
}
helper.SuccessWithData(c, res)
@@ -249,9 +248,9 @@ func (b *BaseApi) UpdateBindDomain(c *gin.Context) {
if err := helper.CheckBindAndValidate(&req, c); err != nil {
return
}
if err := AIToolService.UpdateBindDomain(req); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
if err := aiToolService.UpdateBindDomain(req); err != nil {
helper.BadRequest(c, err)
return
}
helper.SuccessWithOutData(c)
helper.Success(c)
}
+200
View File
@@ -0,0 +1,200 @@
package v2
import (
"errors"
"github.com/1Panel-dev/1Panel/agent/app/api/v2/helper"
"github.com/1Panel-dev/1Panel/agent/app/dto"
"github.com/gin-gonic/gin"
)
func (b *BaseApi) PageAlert(c *gin.Context) {
var req dto.AlertSearch
if err := helper.CheckBindAndValidate(&req, c); err != nil {
return
}
total, alerts, err := alertService.PageAlert(req)
if err != nil {
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, dto.PageResult{
Total: total,
Items: alerts,
})
}
func (b *BaseApi) GetAlerts(c *gin.Context) {
alerts, err := alertService.GetAlerts()
if err != nil {
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, alerts)
}
func (b *BaseApi) CreateAlert(c *gin.Context) {
var req dto.AlertCreate
if err := helper.CheckBindAndValidate(&req, c); err != nil {
return
}
err := alertService.CreateAlert(req)
if err != nil {
helper.InternalServer(c, err)
return
}
helper.Success(c)
}
func (b *BaseApi) DeleteAlert(c *gin.Context) {
var req dto.DeleteRequest
if err := helper.CheckBindAndValidate(&req, c); err != nil {
return
}
err := alertService.DeleteAlert(req.ID)
if err != nil {
helper.InternalServer(c, err)
return
}
helper.Success(c)
}
func (b *BaseApi) UpdateAlert(c *gin.Context) {
var req dto.AlertUpdate
if err := helper.CheckBindAndValidate(&req, c); err != nil {
return
}
if err := alertService.UpdateAlert(req); err != nil {
helper.InternalServer(c, err)
return
}
helper.Success(c)
}
func (b *BaseApi) GetAlert(c *gin.Context) {
id, err := helper.GetParamID(c)
if err != nil {
helper.BadRequest(c, errors.New("no such id in request param"))
return
}
alert, err := alertService.GetAlert(id)
if err != nil {
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, alert)
}
func (b *BaseApi) UpdateAlertStatus(c *gin.Context) {
var req dto.AlertUpdateStatus
if err := helper.CheckBindAndValidate(&req, c); err != nil {
return
}
if err := alertService.UpdateStatus(req.ID, req.Status); err != nil {
helper.InternalServer(c, err)
return
}
helper.Success(c)
}
func (b *BaseApi) GetDisks(c *gin.Context) {
alerts, err := alertService.GetDisks()
if err != nil {
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, alerts)
}
func (b *BaseApi) PageAlertLogs(c *gin.Context) {
var req dto.AlertLogSearch
if err := helper.CheckBindAndValidate(&req, c); err != nil {
return
}
total, alertLogs, err := alertService.PageAlertLogs(req)
if err != nil {
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, dto.PageResult{
Total: total,
Items: alertLogs,
})
}
func (b *BaseApi) CleanAlertLogs(c *gin.Context) {
if err := alertService.CleanAlertLogs(); err != nil {
helper.InternalServer(c, err)
return
}
helper.Success(c)
}
func (b *BaseApi) GetClams(c *gin.Context) {
clams, err := alertService.GetClams()
if err != nil {
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, clams)
}
func (b *BaseApi) GetCronJobs(c *gin.Context) {
var req dto.CronJobReq
if err := helper.CheckBindAndValidate(&req, c); err != nil {
return
}
cronJobs, err := alertService.GetCronJobs(req)
if err != nil {
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, cronJobs)
}
func (b *BaseApi) GetAlertConfig(c *gin.Context) {
config, err := alertService.GetAlertConfig()
if err != nil {
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, config)
}
func (b *BaseApi) UpdateAlertConfig(c *gin.Context) {
var req dto.AlertConfigUpdate
if err := helper.CheckBindAndValidate(&req, c); err != nil {
return
}
if err := alertService.UpdateAlertConfig(req); err != nil {
helper.InternalServer(c, err)
return
}
helper.Success(c)
}
func (b *BaseApi) DeleteAlertConfig(c *gin.Context) {
var req dto.DeleteRequest
if err := helper.CheckBindAndValidate(&req, c); err != nil {
return
}
err := alertService.DeleteAlertConfig(req.ID)
if err != nil {
helper.InternalServer(c, err)
return
}
helper.Success(c)
}
func (b *BaseApi) TestAlertConfig(c *gin.Context) {
var req dto.AlertConfigTest
if err := helper.CheckBindAndValidate(&req, c); err != nil {
return
}
flag, err := alertService.TestAlertConfig(req)
if err != nil {
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, flag)
}
@@ -1,11 +1,10 @@
package v1
package v2
import (
"github.com/1Panel-dev/1Panel/backend/app/api/v1/helper"
"github.com/1Panel-dev/1Panel/backend/app/dto/request"
"github.com/1Panel-dev/1Panel/backend/constant"
"github.com/1Panel-dev/1Panel/backend/global"
"github.com/1Panel-dev/1Panel/backend/i18n"
"github.com/1Panel-dev/1Panel/agent/app/api/v2/helper"
"github.com/1Panel-dev/1Panel/agent/app/dto"
"github.com/1Panel-dev/1Panel/agent/app/dto/request"
"github.com/1Panel-dev/1Panel/agent/i18n"
"github.com/gin-gonic/gin"
)
@@ -24,27 +23,29 @@ func (b *BaseApi) SearchApp(c *gin.Context) {
}
list, err := appService.PageApp(c, req)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, list)
}
// @Tags App
// @Summary Sync app list
// @Summary Sync remote app list
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /apps/sync [post]
// @Router /apps/sync/remote [post]
// @x-panel-log {"bodyKeys":[],"paramKeys":[],"BeforeFunctions":[],"formatZH":"应用商店同步","formatEN":"App store synchronization"}
func (b *BaseApi) SyncApp(c *gin.Context) {
go appService.SyncAppListFromLocal()
var req dto.OperateWithTask
if err := helper.CheckBindAndValidate(&req, c); err != nil {
return
}
res, err := appService.GetAppUpdate()
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
if !res.CanUpdate {
if res.IsSyncing {
helper.SuccessWithMsg(c, i18n.GetMsgByKey("AppStoreIsSyncing"))
@@ -53,12 +54,27 @@ func (b *BaseApi) SyncApp(c *gin.Context) {
}
return
}
go func() {
if err := appService.SyncAppListFromRemote(); err != nil {
global.LOG.Errorf("Synchronization with the App Store failed [%s]", err.Error())
}
}()
helper.SuccessWithData(c, "")
if err = appService.SyncAppListFromRemote(req.TaskID); err != nil {
helper.InternalServer(c, err)
return
}
helper.Success(c)
}
// @Tags App
// @Summary Sync local app list
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /apps/sync/local [post]
// @x-panel-log {"bodyKeys":[],"paramKeys":[],"BeforeFunctions":[],"formatZH":"应用商店同步","formatEN":"App store synchronization"}
func (b *BaseApi) SyncLocalApp(c *gin.Context) {
var req dto.OperateWithTask
if err := helper.CheckBindAndValidate(&req, c); err != nil {
return
}
go appService.SyncAppListFromLocal(req.TaskID)
helper.Success(c)
}
// @Tags App
@@ -68,16 +84,16 @@ func (b *BaseApi) SyncApp(c *gin.Context) {
// @Success 200 {object} response.AppDTO
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /apps/{key} [get]
// @Router /apps/:key [get]
func (b *BaseApi) GetApp(c *gin.Context) {
appKey, err := helper.GetStrParamByKey(c, "key")
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrBadRequest, constant.ErrTypeInvalidParams, err)
helper.BadRequest(c, err)
return
}
appDTO, err := appService.GetApp(c, appKey)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, appDTO)
@@ -87,23 +103,23 @@ func (b *BaseApi) GetApp(c *gin.Context) {
// @Summary Search app detail by appid
// @Accept json
// @Param appId path integer true "app id"
// @Param version path string true "app version"
// @Param type path string true "app type"
// @Param version path string true "app 版本"
// @Param version path string true "app 类型"
// @Success 200 {object} response.AppDetailDTO
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /apps/detail/{appId}/{version}/{type} [get]
// @Router /apps/detail/:appId/:version/:type [get]
func (b *BaseApi) GetAppDetail(c *gin.Context) {
appID, err := helper.GetIntParamByKey(c, "appId")
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrBadRequest, constant.ErrTypeInternalServer, nil)
helper.BadRequest(c, err)
return
}
version := c.Param("version")
appType := c.Param("type")
appDetailDTO, err := appService.GetAppDetail(appID, version, appType)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, appDetailDTO)
@@ -112,41 +128,25 @@ func (b *BaseApi) GetAppDetail(c *gin.Context) {
// @Tags App
// @Summary Get app detail by id
// @Accept json
// @Param id path integer true "id"
// @Param appId path integer true "id"
// @Success 200 {object} response.AppDetailDTO
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /apps/details/{id} [get]
// @Router /apps/details/:id [get]
func (b *BaseApi) GetAppDetailByID(c *gin.Context) {
appDetailID, err := helper.GetIntParamByKey(c, "id")
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrBadRequest, constant.ErrTypeInternalServer, nil)
helper.BadRequest(c, err)
return
}
appDetailDTO, err := appService.GetAppDetailByID(appDetailID)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, appDetailDTO)
}
// @Tags App
// @Summary Get Ignore App
// @Accept json
// @Success 200 {object} response.IgnoredApp
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /apps/ignored [get]
func (b *BaseApi) GetIgnoredApp(c *gin.Context) {
res, err := appService.GetIgnoredApp()
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
return
}
helper.SuccessWithData(c, res)
}
// @Tags App
// @Summary Install app
// @Accept json
@@ -161,21 +161,18 @@ func (b *BaseApi) InstallApp(c *gin.Context) {
if err := helper.CheckBindAndValidate(&req, c); err != nil {
return
}
tx, ctx := helper.GetTxAndContext()
install, err := appService.Install(ctx, req)
install, err := appService.Install(req)
if err != nil {
tx.Rollback()
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
tx.Commit()
helper.SuccessWithData(c, install)
}
func (b *BaseApi) GetAppTags(c *gin.Context) {
tags, err := appService.GetAppTags(c)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, tags)
@@ -190,7 +187,7 @@ func (b *BaseApi) GetAppTags(c *gin.Context) {
func (b *BaseApi) GetAppListUpdate(c *gin.Context) {
res, err := appService.GetAppUpdate()
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, res)
+66
View File
@@ -0,0 +1,66 @@
package v2
import (
"github.com/1Panel-dev/1Panel/agent/app/api/v2/helper"
"github.com/1Panel-dev/1Panel/agent/app/dto/request"
"github.com/gin-gonic/gin"
)
// @Tags App
// @Summary List Upgrade Ignored App
// @Accept json
// @Success 200 {array} model.AppIgnoreUpgrade
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /apps/ignored/detail [get]
func (b *BaseApi) ListAppIgnored(c *gin.Context) {
res, err := appIgnoreUpgradeService.List()
if err != nil {
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, res)
}
// @Tags App
// @Summary Ignore Upgrade App
// @Accept json
// @Param request body request.AppIgnoreUpgradeReq true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /apps/installed/ignore [post]
// @x-panel-log {"bodyKeys":[],"paramKeys":[],"BeforeFunctions":[],"formatZH":"忽略应用升级","formatEN":"Ignore application upgrade"}
func (b *BaseApi) IgnoreAppUpgrade(c *gin.Context) {
var req request.AppIgnoreUpgradeReq
if err := helper.CheckBindAndValidate(&req, c); err != nil {
return
}
if err := appIgnoreUpgradeService.CreateAppIgnore(req); err != nil {
helper.InternalServer(c, err)
return
}
helper.Success(c)
}
// 写一个去掉忽略的接口
// @Tags App
// @Summary Cancel Ignore Upgrade App
// @Accept json
// @Param request body request.ReqWithID true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /apps/ignored/cancel [post]
// @x-panel-log {"bodyKeys":[],"paramKeys":[],"BeforeFunctions":[],"formatZH":"取消忽略应用升级","formatEN":"Cancel ignore application upgrade"}
func (b *BaseApi) CancelIgnoreAppUpgrade(c *gin.Context) {
var req request.ReqWithID
if err := helper.CheckBindAndValidate(&req, c); err != nil {
return
}
if err := appIgnoreUpgradeService.Delete(req); err != nil {
helper.InternalServer(c, err)
return
}
helper.Success(c)
}
@@ -1,11 +1,10 @@
package v1
package v2
import (
"github.com/1Panel-dev/1Panel/backend/app/dto/request"
"github.com/1Panel-dev/1Panel/agent/app/dto/request"
"github.com/1Panel-dev/1Panel/backend/app/api/v1/helper"
"github.com/1Panel-dev/1Panel/backend/app/dto"
"github.com/1Panel-dev/1Panel/backend/constant"
"github.com/1Panel-dev/1Panel/agent/app/api/v2/helper"
"github.com/1Panel-dev/1Panel/agent/app/dto"
"github.com/gin-gonic/gin"
)
@@ -25,7 +24,7 @@ func (b *BaseApi) SearchAppInstalled(c *gin.Context) {
if req.All {
list, err := appInstallService.SearchForWebsite(req)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, dto.PageResult{
@@ -35,7 +34,7 @@ func (b *BaseApi) SearchAppInstalled(c *gin.Context) {
} else {
total, list, err := appInstallService.Page(req)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, dto.PageResult{
@@ -55,7 +54,7 @@ func (b *BaseApi) SearchAppInstalled(c *gin.Context) {
func (b *BaseApi) ListAppInstalled(c *gin.Context) {
list, err := appInstallService.GetInstallList()
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, list)
@@ -76,7 +75,7 @@ func (b *BaseApi) CheckAppInstalled(c *gin.Context) {
}
checkData, err := appInstallService.CheckExist(req)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, checkData)
@@ -97,7 +96,7 @@ func (b *BaseApi) LoadPort(c *gin.Context) {
}
port, err := appInstallService.LoadPort(req)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, port)
@@ -107,11 +106,10 @@ func (b *BaseApi) LoadPort(c *gin.Context) {
// @Summary Search app password by key
// @Accept json
// @Param request body dto.OperationWithNameAndType true "request"
// @Param key path string true "key"
// @Success 200 {object} response.DatabaseConn
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /apps/installed/conninfo/{key} [get]
// @Router /apps/installed/conninfo/:key [get]
func (b *BaseApi) LoadConnInfo(c *gin.Context) {
var req dto.OperationWithNameAndType
if err := helper.CheckBindAndValidate(&req, c); err != nil {
@@ -119,7 +117,7 @@ func (b *BaseApi) LoadConnInfo(c *gin.Context) {
}
conn, err := appInstallService.LoadConnInfo(req)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, conn)
@@ -132,16 +130,16 @@ func (b *BaseApi) LoadConnInfo(c *gin.Context) {
// @Success 200 {array} dto.AppResource
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /apps/installed/delete/check/{appInstallId} [get]
// @Router /apps/installed/delete/check/:appInstallId [get]
func (b *BaseApi) DeleteCheck(c *gin.Context) {
appInstallId, err := helper.GetIntParamByKey(c, "appInstallId")
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrBadRequest, constant.ErrTypeInternalServer, nil)
helper.BadRequest(c, err)
return
}
checkData, err := appInstallService.DeleteCheck(appInstallId)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, checkData)
@@ -157,10 +155,10 @@ func (b *BaseApi) DeleteCheck(c *gin.Context) {
// @x-panel-log {"bodyKeys":[],"paramKeys":[],"BeforeFunctions":[],"formatZH":"同步已安装应用列表","formatEN":"Sync the list of installed apps"}
func (b *BaseApi) SyncInstalled(c *gin.Context) {
if err := appInstallService.SyncAll(false); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, "")
helper.Success(c)
}
// @Tags App
@@ -178,10 +176,10 @@ func (b *BaseApi) OperateInstalled(c *gin.Context) {
return
}
if err := appInstallService.Operate(req); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, nil)
helper.Success(c)
}
// @Tags App
@@ -191,12 +189,12 @@ func (b *BaseApi) OperateInstalled(c *gin.Context) {
// @Success 200 {array} response.AppService
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /apps/services/{key} [get]
// @Router /apps/services/:key [get]
func (b *BaseApi) GetServices(c *gin.Context) {
key := c.Param("key")
services, err := appInstallService.GetServices(key)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, services)
@@ -205,6 +203,7 @@ func (b *BaseApi) GetServices(c *gin.Context) {
// @Tags App
// @Summary Search app update version by install id
// @Accept json
// @Param appInstallId path integer true "request"
// @Success 200 {array} dto.AppVersion
// @Security ApiKeyAuth
// @Security Timestamp
@@ -216,7 +215,7 @@ func (b *BaseApi) GetUpdateVersions(c *gin.Context) {
}
versions, err := appInstallService.GetUpdateVersions(req)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, versions)
@@ -237,10 +236,10 @@ func (b *BaseApi) ChangeAppPort(c *gin.Context) {
return
}
if err := appInstallService.ChangeAppPort(req); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, nil)
helper.Success(c)
}
// @Tags App
@@ -258,7 +257,7 @@ func (b *BaseApi) GetDefaultConfig(c *gin.Context) {
}
content, err := appInstallService.GetDefaultConfigByKey(req.Type, req.Name)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
@@ -272,16 +271,16 @@ func (b *BaseApi) GetDefaultConfig(c *gin.Context) {
// @Success 200 {object} response.AppConfig
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /apps/installed/params/{appInstallId} [get]
// @Router /apps/installed/params/:appInstallId [get]
func (b *BaseApi) GetParams(c *gin.Context) {
appInstallId, err := helper.GetIntParamByKey(c, "appInstallId")
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrBadRequest, constant.ErrTypeInternalServer, nil)
helper.BadRequest(c, err)
return
}
content, err := appInstallService.GetParams(appInstallId)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, content)
@@ -302,29 +301,51 @@ func (b *BaseApi) UpdateInstalled(c *gin.Context) {
return
}
if err := appInstallService.Update(req); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, nil)
helper.Success(c)
}
// @Tags App
// @Summary ignore App Update
// @Summary Update app config
// @Accept json
// @Param request body request.AppInstalledIgnoreUpgrade true "request"
// @Param request body request.AppConfigUpdate true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /apps/installed/ignore [post]
// @x-panel-log {"bodyKeys":["installId"],"paramKeys":[],"BeforeFunctions":[],"formatZH":"忽略应用 [installId] 版本升级","formatEN":"Application param update [installId]"}
func (b *BaseApi) IgnoreUpgrade(c *gin.Context) {
var req request.AppInstalledIgnoreUpgrade
// @Router /apps/installed/config/update [post]
// @x-panel-log {"bodyKeys":["installID","webUI"],"paramKeys":[],"BeforeFunctions":[],"formatZH":"应用配置更新 [installID]","formatEN":"Application config update [installID]"}
func (b *BaseApi) UpdateAppConfig(c *gin.Context) {
var req request.AppConfigUpdate
if err := helper.CheckBindAndValidate(&req, c); err != nil {
return
}
if err := appInstallService.IgnoreUpgrade(req); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
if err := appInstallService.UpdateAppConfig(req); err != nil {
helper.InternalServer(c, err)
return
}
helper.SuccessWithOutData(c)
helper.Success(c)
}
// @Tags App
// @Summary Get app install info
// @Accept json
// @Param appInstallId path integer true "App install id"
// @Success 200 {object} dto.AppInstallInfo
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /apps/installed/info/:appInstallId [get]
func (b *BaseApi) GetAppInstallInfo(c *gin.Context) {
appInstallId, err := helper.GetIntParamByKey(c, "appInstallId")
if err != nil {
helper.BadRequest(c, err)
return
}
info, err := appInstallService.GetAppInstallInfo(appInstallId)
if err != nil {
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, info)
}
@@ -1,16 +1,30 @@
package v1
package v2
import (
"encoding/base64"
"fmt"
"path"
"github.com/1Panel-dev/1Panel/backend/app/api/v1/helper"
"github.com/1Panel-dev/1Panel/backend/app/dto"
"github.com/1Panel-dev/1Panel/backend/constant"
"github.com/1Panel-dev/1Panel/agent/app/api/v2/helper"
"github.com/1Panel-dev/1Panel/agent/app/dto"
"github.com/1Panel-dev/1Panel/agent/constant"
"github.com/gin-gonic/gin"
)
func (b *BaseApi) CheckBackupUsed(c *gin.Context) {
name, err := helper.GetStrParamByKey(c, "name")
if err != nil {
helper.BadRequest(c, err)
return
}
if err := backupService.CheckUsed(name, true); err != nil {
helper.BadRequest(c, err)
return
}
helper.Success(c)
}
// @Tags Backup Account
// @Summary Create backup account
// @Accept json
@@ -18,46 +32,39 @@ import (
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /settings/backup [post]
// @Router /backups [post]
// @x-panel-log {"bodyKeys":["type"],"paramKeys":[],"BeforeFunctions":[],"formatZH":"创建备份账号 [type]","formatEN":"create backup account [type]"}
func (b *BaseApi) CreateBackup(c *gin.Context) {
var req dto.BackupOperate
if err := helper.CheckBindAndValidate(&req, c); err != nil {
return
}
if len(req.Credential) != 0 {
credential, err := base64.StdEncoding.DecodeString(req.Credential)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrBadRequest, constant.ErrTypeInvalidParams, err)
return
}
req.Credential = string(credential)
}
if len(req.AccessKey) != 0 {
accessKey, err := base64.StdEncoding.DecodeString(req.AccessKey)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrBadRequest, constant.ErrTypeInvalidParams, err)
return
}
req.AccessKey = string(accessKey)
}
if err := backupService.Create(req); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, nil)
helper.Success(c)
}
// @Tags Backup Account
// @Summary Refresh OneDrive token
// @Summary Refresh token
// @Accept json
// @Param request body dto.BackupOperate true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /settings/backup/refresh/onedrive [post]
func (b *BaseApi) RefreshOneDriveToken(c *gin.Context) {
backupService.Run()
helper.SuccessWithData(c, nil)
// @Router /backups/refresh/token [post]
func (b *BaseApi) RefreshToken(c *gin.Context) {
var req dto.OperateByID
if err := helper.CheckBindAndValidate(&req, c); err != nil {
return
}
if err := backupService.RefreshToken(req); err != nil {
helper.InternalServer(c, err)
return
}
helper.Success(c)
}
// @Tags Backup Account
@@ -67,53 +74,21 @@ func (b *BaseApi) RefreshOneDriveToken(c *gin.Context) {
// @Success 200 {array} object
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /settings/backup/search [post]
// @Router /buckets [post]
func (b *BaseApi) ListBuckets(c *gin.Context) {
var req dto.ForBuckets
if err := helper.CheckBindAndValidate(&req, c); err != nil {
return
}
if len(req.Credential) != 0 {
credential, err := base64.StdEncoding.DecodeString(req.Credential)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrBadRequest, constant.ErrTypeInvalidParams, err)
return
}
req.Credential = string(credential)
}
if len(req.AccessKey) != 0 {
accessKey, err := base64.StdEncoding.DecodeString(req.AccessKey)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrBadRequest, constant.ErrTypeInvalidParams, err)
return
}
req.AccessKey = string(accessKey)
}
buckets, err := backupService.GetBuckets(req)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, buckets)
}
// @Tags Backup Account
// @Summary Load OneDrive info
// @Accept json
// @Success 200 {object} dto.OneDriveInfo
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /settings/backup/onedrive [get]
func (b *BaseApi) LoadOneDriveInfo(c *gin.Context) {
data, err := backupService.LoadOneDriveInfo()
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
return
}
helper.SuccessWithData(c, data)
}
// @Tags Backup Account
// @Summary Delete backup account
// @Accept json
@@ -121,7 +96,7 @@ func (b *BaseApi) LoadOneDriveInfo(c *gin.Context) {
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /settings/backup/del [post]
// @Router /backups/del [post]
// @x-panel-log {"bodyKeys":["id"],"paramKeys":[],"BeforeFunctions":[{"input_column":"id","input_value":"id","isList":false,"db":"backup_accounts","output_column":"type","output_value":"types"}],"formatZH":"删除备份账号 [types]","formatEN":"delete backup account [types]"}
func (b *BaseApi) DeleteBackup(c *gin.Context) {
var req dto.OperateByID
@@ -130,153 +105,10 @@ func (b *BaseApi) DeleteBackup(c *gin.Context) {
}
if err := backupService.Delete(req.ID); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, nil)
}
// @Tags Backup Account
// @Summary Page backup records
// @Accept json
// @Param request body dto.RecordSearch true "request"
// @Success 200 {object} dto.PageResult
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /settings/backup/record/search [post]
func (b *BaseApi) SearchBackupRecords(c *gin.Context) {
var req dto.RecordSearch
if err := helper.CheckBindAndValidate(&req, c); err != nil {
return
}
total, list, err := backupService.SearchRecordsWithPage(req)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
return
}
helper.SuccessWithData(c, dto.PageResult{
Items: list,
Total: total,
})
}
// @Tags Backup Account
// @Summary Load backup records size
// @Accept json
// @Param request body dto.RecordSearch true "request"
// @Success 200 {array} dto.BackupFile
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /settings/backup/record/size [post]
func (b *BaseApi) LoadBackupSize(c *gin.Context) {
var req dto.RecordSearch
if err := helper.CheckBindAndValidate(&req, c); err != nil {
return
}
list, err := backupService.LoadSize(req)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
return
}
helper.SuccessWithData(c, list)
}
// @Tags Backup Account
// @Summary Page backup records by cronjob
// @Accept json
// @Param request body dto.RecordSearchByCronjob true "request"
// @Success 200 {object} dto.PageResult
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /settings/backup/record/search/bycronjob [post]
func (b *BaseApi) SearchBackupRecordsByCronjob(c *gin.Context) {
var req dto.RecordSearchByCronjob
if err := helper.CheckBindAndValidate(&req, c); err != nil {
return
}
total, list, err := backupService.SearchRecordsByCronjobWithPage(req)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
return
}
helper.SuccessWithData(c, dto.PageResult{
Items: list,
Total: total,
})
}
// @Tags Backup Account
// @Summary Load backup records size for cronjob
// @Accept json
// @Param request body dto.RecordSearchByCronjob true "request"
// @Success 200 {array} dto.BackupFile
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /settings/backup/record/size/bycronjob [post]
func (b *BaseApi) LoadBackupSizeByCronjob(c *gin.Context) {
var req dto.RecordSearchByCronjob
if err := helper.CheckBindAndValidate(&req, c); err != nil {
return
}
list, err := backupService.LoadSizeByCronjob(req)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
return
}
helper.SuccessWithData(c, list)
}
// @Tags Backup Account
// @Summary Download backup record
// @Accept json
// @Param request body dto.DownloadRecord true "request"
// @Success 200 {string} filePath
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /settings/backup/record/download [post]
// @x-panel-log {"bodyKeys":["source","fileName"],"paramKeys":[],"BeforeFunctions":[],"formatZH":"下载备份记录 [source][fileName]","formatEN":"download backup records [source][fileName]"}
func (b *BaseApi) DownloadRecord(c *gin.Context) {
var req dto.DownloadRecord
if err := helper.CheckBindAndValidate(&req, c); err != nil {
return
}
filePath, err := backupService.DownloadRecord(req)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
return
}
helper.SuccessWithData(c, filePath)
}
// @Tags Backup Account
// @Summary Delete backup record
// @Accept json
// @Param request body dto.BatchDeleteReq true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /settings/backup/record/del [post]
// @x-panel-log {"bodyKeys":["ids"],"paramKeys":[],"BeforeFunctions":[{"input_column":"id","input_value":"ids","isList":true,"db":"backup_records","output_column":"file_name","output_value":"files"}],"formatZH":"删除备份记录 [files]","formatEN":"delete backup records [files]"}
func (b *BaseApi) DeleteBackupRecord(c *gin.Context) {
var req dto.BatchDeleteReq
if err := helper.CheckBindAndValidate(&req, c); err != nil {
return
}
if err := backupService.BatchDeleteRecord(req.Ids); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
return
}
helper.SuccessWithData(c, nil)
helper.Success(c)
}
// @Tags Backup Account
@@ -286,7 +118,7 @@ func (b *BaseApi) DeleteBackupRecord(c *gin.Context) {
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /settings/backup/update [post]
// @Router /backups/update [post]
// @x-panel-log {"bodyKeys":["type"],"paramKeys":[],"BeforeFunctions":[],"formatZH":"更新备份账号 [types]","formatEN":"update backup account [types]"}
func (b *BaseApi) UpdateBackup(c *gin.Context) {
var req dto.BackupOperate
@@ -294,61 +126,227 @@ func (b *BaseApi) UpdateBackup(c *gin.Context) {
return
}
if len(req.Credential) != 0 {
credential, err := base64.StdEncoding.DecodeString(req.Credential)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrBadRequest, constant.ErrTypeInvalidParams, err)
return
}
req.Credential = string(credential)
}
if len(req.AccessKey) != 0 {
accessKey, err := base64.StdEncoding.DecodeString(req.AccessKey)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrBadRequest, constant.ErrTypeInvalidParams, err)
return
}
req.AccessKey = string(accessKey)
}
if err := backupService.Update(req); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, nil)
helper.Success(c)
}
// @Tags Backup Account
// @Summary List backup accounts
// @Success 200 {array} dto.BackupInfo
// @Summary Load backup account options
// @Accept json
// @Success 200 {array} dto.BackupOption
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /settings/backup/search [get]
func (b *BaseApi) ListBackup(c *gin.Context) {
data, err := backupService.List()
// @Router /backups/options [get]
func (b *BaseApi) LoadBackupOptions(c *gin.Context) {
list, err := backupService.LoadBackupOptions()
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, list)
}
// @Tags Backup Account
// @Summary Search backup accounts with page
// @Accept json
// @Param request body dto.SearchPageWithType true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /backups/search [post]
func (b *BaseApi) SearchBackup(c *gin.Context) {
var req dto.SearchPageWithType
if err := helper.CheckBindAndValidate(&req, c); err != nil {
return
}
helper.SuccessWithData(c, data)
total, list, err := backupService.SearchWithPage(req)
if err != nil {
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, dto.PageResult{
Items: list,
Total: total,
})
}
// @Tags Backup Account
// @Summary get local backup dir
// @Success 200 {string} dir
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /backups/local [get]
func (b *BaseApi) GetLocalDir(c *gin.Context) {
dir, err := backupService.GetLocalDir()
if err != nil {
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, dir)
}
// @Tags Backup Account
// @Summary Load backup record size
// @Accept json
// @Param request body dto.SearchForSize true "request"
// @Success 200 {array} dto.RecordFileSize
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /backups/record/size [post]
func (b *BaseApi) LoadBackupRecordSize(c *gin.Context) {
var req dto.SearchForSize
if err := helper.CheckBindAndValidate(&req, c); err != nil {
return
}
list, err := backupRecordService.LoadRecordSize(req)
if err != nil {
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, list)
}
// @Tags Backup Account
// @Summary Page backup records
// @Accept json
// @Param request body dto.RecordSearch true "request"
// @Success 200 {object} dto.PageResult
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /backups/record/search [post]
func (b *BaseApi) SearchBackupRecords(c *gin.Context) {
var req dto.RecordSearch
if err := helper.CheckBindAndValidate(&req, c); err != nil {
return
}
total, list, err := backupRecordService.SearchRecordsWithPage(req)
if err != nil {
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, dto.PageResult{
Items: list,
Total: total,
})
}
// @Tags Backup Account
// @Summary Page backup records by cronjob
// @Accept json
// @Param request body dto.RecordSearchByCronjob true "request"
// @Success 200 {object} dto.PageResult
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /backups/record/search/bycronjob [post]
func (b *BaseApi) SearchBackupRecordsByCronjob(c *gin.Context) {
var req dto.RecordSearchByCronjob
if err := helper.CheckBindAndValidate(&req, c); err != nil {
return
}
total, list, err := backupRecordService.SearchRecordsByCronjobWithPage(req)
if err != nil {
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, dto.PageResult{
Items: list,
Total: total,
})
}
// @Tags Backup Account
// @Summary Download backup record
// @Accept json
// @Param request body dto.DownloadRecord true "request"
// @Success 200 {string} filePath
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /backup/record/download [post]
// @x-panel-log {"bodyKeys":["source","fileName"],"paramKeys":[],"BeforeFunctions":[],"formatZH":"下载备份记录 [source][fileName]","formatEN":"download backup records [source][fileName]"}
func (b *BaseApi) DownloadRecord(c *gin.Context) {
var req dto.DownloadRecord
if err := helper.CheckBindAndValidate(&req, c); err != nil {
return
}
filePath, err := backupRecordService.DownloadRecord(req)
if err != nil {
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, filePath)
}
// @Tags Backup Account
// @Summary Update backup record description
// @Accept json
// @Param request body dto.UpdateDescription true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /backup/record/description/update [post]
func (b *BaseApi) UpdateRecordDescription(c *gin.Context) {
var req dto.UpdateDescription
if err := helper.CheckBindAndValidate(&req, c); err != nil {
return
}
if err := backupRecordService.UpdateDescription(req); err != nil {
helper.InternalServer(c, err)
return
}
helper.Success(c)
}
// @Tags Backup Account
// @Summary Delete backup record
// @Accept json
// @Param request body dto.BatchDeleteReq true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /record/del [post]
// @x-panel-log {"bodyKeys":["ids"],"paramKeys":[],"BeforeFunctions":[{"input_column":"id","input_value":"ids","isList":true,"db":"backup_records","output_column":"file_name","output_value":"files"}],"formatZH":"删除备份记录 [files]","formatEN":"delete backup records [files]"}
func (b *BaseApi) DeleteBackupRecord(c *gin.Context) {
var req dto.BatchDeleteReq
if err := helper.CheckBindAndValidate(&req, c); err != nil {
return
}
if err := backupRecordService.BatchDeleteRecord(req.Ids); err != nil {
helper.InternalServer(c, err)
return
}
helper.Success(c)
}
// @Tags Backup Account
// @Summary List files from backup accounts
// @Accept json
// @Param request body dto.BackupSearchFile true "request"
// @Param request body dto.OperateByID true "request"
// @Success 200 {array} string
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /settings/backup/search/files [post]
// @Router /backups/search/files [post]
func (b *BaseApi) LoadFilesFromBackup(c *gin.Context) {
var req dto.BackupSearchFile
var req dto.OperateByID
if err := helper.CheckBindAndValidate(&req, c); err != nil {
return
}
data := backupService.ListFiles(req)
data := backupRecordService.ListFiles(req)
helper.SuccessWithData(c, data)
}
@@ -359,7 +357,7 @@ func (b *BaseApi) LoadFilesFromBackup(c *gin.Context) {
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /settings/backup/backup [post]
// @Router /backups/backup [post]
// @x-panel-log {"bodyKeys":["type","name","detailName"],"paramKeys":[],"BeforeFunctions":[],"formatZH":"备份 [type] 数据 [name][detailName]","formatEN":"backup [type] data [name][detailName]"}
func (b *BaseApi) Backup(c *gin.Context) {
var req dto.CommonBackup
@@ -370,31 +368,31 @@ func (b *BaseApi) Backup(c *gin.Context) {
switch req.Type {
case "app":
if _, err := backupService.AppBackup(req); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
case "mysql", "mariadb":
case "mysql", "mariadb", constant.AppMysqlCluster:
if err := backupService.MysqlBackup(req); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
case constant.AppPostgresql:
case constant.AppPostgresql, constant.AppPostgresqlCluster:
if err := backupService.PostgresqlBackup(req); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
case "website":
if err := backupService.WebsiteBackup(req); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
case "redis":
case "redis", constant.AppRedisCluster:
if err := backupService.RedisBackup(req); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
}
helper.SuccessWithData(c, nil)
helper.Success(c)
}
// @Tags Backup Account
@@ -404,7 +402,7 @@ func (b *BaseApi) Backup(c *gin.Context) {
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /settings/backup/recover [post]
// @Router /backups/recover [post]
// @x-panel-log {"bodyKeys":["type","name","detailName","file"],"paramKeys":[],"BeforeFunctions":[],"formatZH":"从 [file] 恢复 [type] 数据 [name][detailName]","formatEN":"recover [type] data [name][detailName] from [file]"}
func (b *BaseApi) Recover(c *gin.Context) {
var req dto.CommonRecover
@@ -412,40 +410,44 @@ func (b *BaseApi) Recover(c *gin.Context) {
return
}
downloadPath, err := backupService.DownloadRecord(dto.DownloadRecord{Source: req.Source, FileDir: path.Dir(req.File), FileName: path.Base(req.File)})
downloadPath, err := backupRecordService.DownloadRecord(dto.DownloadRecord{
DownloadAccountID: req.DownloadAccountID,
FileDir: path.Dir(req.File),
FileName: path.Base(req.File),
})
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrBadRequest, constant.ErrTypeInvalidParams, fmt.Errorf("download file failed, err: %v", err))
helper.BadRequest(c, fmt.Errorf("download file failed, err: %v", err))
return
}
req.File = downloadPath
switch req.Type {
case "mysql", "mariadb":
case "mysql", "mariadb", constant.AppMysqlCluster:
if err := backupService.MysqlRecover(req); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
case constant.AppPostgresql:
case constant.AppPostgresql, constant.AppPostgresqlCluster:
if err := backupService.PostgresqlRecover(req); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
case "website":
if err := backupService.WebsiteRecover(req); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
case "redis":
case "redis", constant.AppRedisCluster:
if err := backupService.RedisRecover(req); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
case "app":
if err := backupService.AppRecover(req); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
}
helper.SuccessWithData(c, nil)
helper.Success(c)
}
// @Tags Backup Account
@@ -455,7 +457,7 @@ func (b *BaseApi) Recover(c *gin.Context) {
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /settings/backup/recover/byupload [post]
// @Router /backups/recover/byupload [post]
// @x-panel-log {"bodyKeys":["type","name","detailName","file"],"paramKeys":[],"BeforeFunctions":[],"formatZH":"从 [file] 恢复 [type] 数据 [name][detailName]","formatEN":"recover [type] data [name][detailName] from [file]"}
func (b *BaseApi) RecoverByUpload(c *gin.Context) {
var req dto.CommonRecover
@@ -466,24 +468,24 @@ func (b *BaseApi) RecoverByUpload(c *gin.Context) {
switch req.Type {
case "mysql", "mariadb":
if err := backupService.MysqlRecoverByUpload(req); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
case constant.AppPostgresql:
if err := backupService.PostgresqlRecoverByUpload(req); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
case "app":
if err := backupService.AppRecover(req); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
case "website":
if err := backupService.WebsiteRecover(req); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
}
helper.SuccessWithData(c, nil)
helper.Success(c)
}
@@ -1,9 +1,8 @@
package v1
package v2
import (
"github.com/1Panel-dev/1Panel/backend/app/api/v1/helper"
"github.com/1Panel-dev/1Panel/backend/app/dto"
"github.com/1Panel-dev/1Panel/backend/constant"
"github.com/1Panel-dev/1Panel/agent/app/api/v2/helper"
"github.com/1Panel-dev/1Panel/agent/app/dto"
"github.com/gin-gonic/gin"
)
@@ -23,10 +22,10 @@ func (b *BaseApi) CreateClam(c *gin.Context) {
}
if err := clamService.Create(req); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, nil)
helper.Success(c)
}
// @Tags Clam
@@ -45,10 +44,10 @@ func (b *BaseApi) UpdateClam(c *gin.Context) {
}
if err := clamService.Update(req); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, nil)
helper.Success(c)
}
// @Tags Clam
@@ -67,10 +66,10 @@ func (b *BaseApi) UpdateClamStatus(c *gin.Context) {
}
if err := clamService.UpdateStatus(req.ID, req.Status); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, nil)
helper.Success(c)
}
// @Tags Clam
@@ -89,7 +88,7 @@ func (b *BaseApi) SearchClam(c *gin.Context) {
total, list, err := clamService.SearchWithPage(req)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
@@ -109,7 +108,7 @@ func (b *BaseApi) SearchClam(c *gin.Context) {
func (b *BaseApi) LoadClamBaseInfo(c *gin.Context) {
info, err := clamService.LoadBaseInfo()
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
@@ -119,8 +118,8 @@ func (b *BaseApi) LoadClamBaseInfo(c *gin.Context) {
// @Tags Clam
// @Summary Operate Clam
// @Accept json
// @Param request body dto.Operate true "request"
// @Success 200
// @Param request body dto.Operate true "request"
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /toolbox/clam/operate [post]
@@ -132,11 +131,11 @@ func (b *BaseApi) OperateClam(c *gin.Context) {
}
if err := clamService.Operate(req.Operation); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, nil)
helper.Success(c)
}
// @Tags Clam
@@ -154,11 +153,11 @@ func (b *BaseApi) CleanClamRecord(c *gin.Context) {
return
}
if err := clamService.CleanRecord(req); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, nil)
helper.Success(c)
}
// @Tags Clam
@@ -177,7 +176,7 @@ func (b *BaseApi) SearchClamRecord(c *gin.Context) {
total, list, err := clamService.LoadRecords(req)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
@@ -203,7 +202,7 @@ func (b *BaseApi) LoadClamRecordLog(c *gin.Context) {
content, err := clamService.LoadRecordLog(req)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
@@ -226,7 +225,7 @@ func (b *BaseApi) SearchClamFile(c *gin.Context) {
content, err := clamService.LoadFile(req)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
@@ -247,10 +246,10 @@ func (b *BaseApi) UpdateFile(c *gin.Context) {
return
}
if err := clamService.UpdateFile(req); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithOutData(c)
helper.Success(c)
}
// @Tags Clam
@@ -269,10 +268,10 @@ func (b *BaseApi) DeleteClam(c *gin.Context) {
}
if err := clamService.Delete(req); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, nil)
helper.Success(c)
}
// @Tags Clam
@@ -291,8 +290,8 @@ func (b *BaseApi) HandleClamScan(c *gin.Context) {
}
if err := clamService.HandleOnce(req); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, nil)
helper.Success(c)
}
@@ -1,9 +1,8 @@
package v1
package v2
import (
"github.com/1Panel-dev/1Panel/backend/app/api/v1/helper"
"github.com/1Panel-dev/1Panel/backend/app/dto"
"github.com/1Panel-dev/1Panel/backend/constant"
"github.com/1Panel-dev/1Panel/agent/app/api/v2/helper"
"github.com/1Panel-dev/1Panel/agent/app/dto"
"github.com/gin-gonic/gin"
)
@@ -23,10 +22,10 @@ func (b *BaseApi) CreateComposeTemplate(c *gin.Context) {
}
if err := composeTemplateService.Create(req); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, nil)
helper.Success(c)
}
// @Tags Container Compose-template
@@ -46,7 +45,7 @@ func (b *BaseApi) SearchComposeTemplate(c *gin.Context) {
total, list, err := composeTemplateService.SearchWithPage(req)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
@@ -66,7 +65,7 @@ func (b *BaseApi) SearchComposeTemplate(c *gin.Context) {
func (b *BaseApi) ListComposeTemplate(c *gin.Context) {
list, err := composeTemplateService.List()
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
@@ -89,10 +88,10 @@ func (b *BaseApi) DeleteComposeTemplate(c *gin.Context) {
}
if err := composeTemplateService.Delete(req.Ids); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, nil)
helper.Success(c)
}
// @Tags Container Compose-template
@@ -114,8 +113,8 @@ func (b *BaseApi) UpdateComposeTemplate(c *gin.Context) {
upMap["content"] = req.Content
upMap["description"] = req.Description
if err := composeTemplateService.Update(req.ID, upMap); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, nil)
helper.Success(c)
}
@@ -1,12 +1,10 @@
package v1
package v2
import (
"strconv"
"github.com/1Panel-dev/1Panel/backend/app/api/v1/helper"
"github.com/1Panel-dev/1Panel/backend/app/dto"
"github.com/1Panel-dev/1Panel/backend/constant"
"github.com/1Panel-dev/1Panel/backend/global"
"github.com/1Panel-dev/1Panel/agent/app/api/v2/helper"
"github.com/1Panel-dev/1Panel/agent/app/dto"
"github.com/gin-gonic/gin"
"github.com/pkg/errors"
)
@@ -28,7 +26,7 @@ func (b *BaseApi) SearchContainer(c *gin.Context) {
total, list, err := containerService.Page(req)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, dto.PageResult{
@@ -37,6 +35,24 @@ func (b *BaseApi) SearchContainer(c *gin.Context) {
})
}
// @Tags Container
// @Summary Load container users
// @Accept json
// @Param request body dto.OperationWithName true "request"
// @Produce json
// @Success 200 {array} string
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /containers/users [post]
func (b *BaseApi) LoadContainerUsers(c *gin.Context) {
var req dto.OperationWithName
if err := helper.CheckBindAndValidate(&req, c); err != nil {
return
}
helper.SuccessWithData(c, containerService.LoadUsers(req))
}
// @Tags Container
// @Summary List containers
// @Accept json
@@ -46,12 +62,24 @@ func (b *BaseApi) SearchContainer(c *gin.Context) {
// @Security Timestamp
// @Router /containers/list [post]
func (b *BaseApi) ListContainer(c *gin.Context) {
list, err := containerService.List()
helper.SuccessWithData(c, containerService.List())
}
// @Tags Container
// @Summary Load containers status
// @Accept json
// @Produce json
// @Success 200 {object} dto.ContainerStatus
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /containers/status [get]
func (b *BaseApi) LoadContainerStatus(c *gin.Context) {
data, err := containerService.LoadStatus()
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, list)
helper.SuccessWithData(c, data)
}
// @Tags Container Compose
@@ -70,7 +98,7 @@ func (b *BaseApi) SearchCompose(c *gin.Context) {
total, list, err := containerService.PageCompose(req)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, dto.PageResult{
@@ -96,7 +124,7 @@ func (b *BaseApi) TestCompose(c *gin.Context) {
isOK, err := containerService.TestCompose(req)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, isOK)
@@ -106,7 +134,7 @@ func (b *BaseApi) TestCompose(c *gin.Context) {
// @Summary Create compose
// @Accept json
// @Param request body dto.ComposeCreate true "request"
// @Success 200 {string} log
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /containers/compose [post]
@@ -117,12 +145,11 @@ func (b *BaseApi) CreateCompose(c *gin.Context) {
return
}
log, err := containerService.CreateCompose(req)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
if err := containerService.CreateCompose(req); err != nil {
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, log)
helper.Success(c)
}
// @Tags Container Compose
@@ -141,10 +168,10 @@ func (b *BaseApi) OperatorCompose(c *gin.Context) {
}
if err := containerService.ComposeOperation(req); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, nil)
helper.Success(c)
}
// @Tags Container
@@ -163,10 +190,10 @@ func (b *BaseApi) ContainerUpdate(c *gin.Context) {
}
if err := containerService.ContainerUpdate(req); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, nil)
helper.Success(c)
}
// @Tags Container
@@ -185,7 +212,7 @@ func (b *BaseApi) ContainerInfo(c *gin.Context) {
data, err := containerService.ContainerInfo(req)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, data)
@@ -199,7 +226,7 @@ func (b *BaseApi) ContainerInfo(c *gin.Context) {
func (b *BaseApi) LoadResourceLimit(c *gin.Context) {
data, err := containerService.LoadResourceLimit()
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, data)
@@ -213,7 +240,7 @@ func (b *BaseApi) LoadResourceLimit(c *gin.Context) {
func (b *BaseApi) ContainerListStats(c *gin.Context) {
data, err := containerService.ContainerListStats()
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, data)
@@ -234,11 +261,32 @@ func (b *BaseApi) ContainerCreate(c *gin.Context) {
return
}
if err := containerService.ContainerCreate(req); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
if err := containerService.ContainerCreate(req, true); err != nil {
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, nil)
helper.Success(c)
}
// @Tags Container
// @Summary Create container by command
// @Accept json
// @Param request body dto.ContainerCreateByCommand true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /containers/command [post]
func (b *BaseApi) ContainerCreateByCommand(c *gin.Context) {
var req dto.ContainerCreateByCommand
if err := helper.CheckBindAndValidate(&req, c); err != nil {
return
}
if err := containerService.ContainerCreateByCommand(req); err != nil {
helper.InternalServer(c, err)
return
}
helper.Success(c)
}
// @Tags Container
@@ -257,10 +305,10 @@ func (b *BaseApi) ContainerUpgrade(c *gin.Context) {
}
if err := containerService.ContainerUpgrade(req); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, nil)
helper.Success(c)
}
// @Tags Container
@@ -280,7 +328,7 @@ func (b *BaseApi) ContainerPrune(c *gin.Context) {
report, err := containerService.Prune(req)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, report)
@@ -302,28 +350,10 @@ func (b *BaseApi) CleanContainerLog(c *gin.Context) {
}
if err := containerService.ContainerLogClean(req); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, nil)
}
// @Tags Container
// @Summary Load container log
// @Accept json
// @Param request body dto.OperationWithNameAndType true "request"
// @Success 200 {string} content
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /containers/load/log [post]
func (b *BaseApi) LoadContainerLog(c *gin.Context) {
var req dto.OperationWithNameAndType
if err := helper.CheckBindAndValidate(&req, c); err != nil {
return
}
content := containerService.LoadContainerLogs(req)
helper.SuccessWithData(c, content)
helper.Success(c)
}
// @Tags Container
@@ -342,10 +372,10 @@ func (b *BaseApi) ContainerRename(c *gin.Context) {
}
if err := containerService.ContainerRename(req); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, nil)
helper.Success(c)
}
// @Tags Container
@@ -353,6 +383,8 @@ func (b *BaseApi) ContainerRename(c *gin.Context) {
// @Accept json
// @Param request body dto.ContainerCommit true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /containers/commit [post]
func (b *BaseApi) ContainerCommit(c *gin.Context) {
var req dto.ContainerCommit
@@ -361,10 +393,10 @@ func (b *BaseApi) ContainerCommit(c *gin.Context) {
}
if err := containerService.ContainerCommit(req); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, nil)
helper.Success(c)
}
// @Tags Container
@@ -383,29 +415,29 @@ func (b *BaseApi) ContainerOperation(c *gin.Context) {
}
if err := containerService.ContainerOperation(req); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, nil)
helper.Success(c)
}
// @Tags Container
// @Summary Container stats
// @Param id path string true "container id"
// @Param id path string true "容器id"
// @Success 200 {object} dto.ContainerStats
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /containers/stats/{id} [get]
// @Router /containers/stats/:id [get]
func (b *BaseApi) ContainerStats(c *gin.Context) {
containerID, ok := c.Params.Get("id")
if !ok {
helper.ErrorWithDetail(c, constant.CodeErrBadRequest, constant.ErrTypeInvalidParams, errors.New("error container id in path"))
helper.BadRequest(c, errors.New("error container id in path"))
return
}
result, err := containerService.ContainerStats(containerID)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, result)
@@ -427,48 +459,12 @@ func (b *BaseApi) Inspect(c *gin.Context) {
result, err := containerService.Inspect(req)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, result)
}
// @Tags Container
// @Summary Container logs
// @Param container query string false "container name"
// @Param since query string false "since"
// @Param follow query string false "follow"
// @Param tail query string false "tail"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /containers/search/log [post]
func (b *BaseApi) ContainerLogs(c *gin.Context) {
wsConn, err := upGrader.Upgrade(c.Writer, c.Request, nil)
if err != nil {
global.LOG.Errorf("gin context http handler failed, err: %v", err)
return
}
defer wsConn.Close()
container := c.Query("container")
since := c.Query("since")
follow := c.Query("follow") == "true"
tail := c.Query("tail")
if err := containerService.ContainerLogs(wsConn, "container", container, since, tail, follow); err != nil {
_ = wsConn.WriteMessage(1, []byte(err.Error()))
return
}
}
// @Tags Container
// @Summary Download Container logs
// @Accept json
// @Param request body dto.ContainerLog true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /containers/download/log [post]
func (b *BaseApi) DownloadContainerLogs(c *gin.Context) {
var req dto.ContainerLog
@@ -477,7 +473,7 @@ func (b *BaseApi) DownloadContainerLogs(c *gin.Context) {
}
err := containerService.DownloadContainerLogs(req.ContainerType, req.Container, req.Since, strconv.Itoa(int(req.Tail)), c)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
}
}
@@ -498,7 +494,7 @@ func (b *BaseApi) SearchNetwork(c *gin.Context) {
total, list, err := containerService.PageNetwork(req)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, dto.PageResult{
@@ -518,7 +514,7 @@ func (b *BaseApi) SearchNetwork(c *gin.Context) {
func (b *BaseApi) ListNetwork(c *gin.Context) {
list, err := containerService.ListNetwork()
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, list)
@@ -540,10 +536,10 @@ func (b *BaseApi) DeleteNetwork(c *gin.Context) {
}
if err := containerService.DeleteNetwork(req); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, nil)
helper.Success(c)
}
// @Tags Container Network
@@ -562,14 +558,14 @@ func (b *BaseApi) CreateNetwork(c *gin.Context) {
}
if err := containerService.CreateNetwork(req); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, nil)
helper.Success(c)
}
// @Tags Container Volume
// @Summary Page Container Volumes
// @Summary Page volumes
// @Accept json
// @Param request body dto.SearchWithPage true "request"
// @Produce json
@@ -585,7 +581,7 @@ func (b *BaseApi) SearchVolume(c *gin.Context) {
total, list, err := containerService.PageVolume(req)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, dto.PageResult{
@@ -595,7 +591,7 @@ func (b *BaseApi) SearchVolume(c *gin.Context) {
}
// @Tags Container Volume
// @Summary List Container Volumes
// @Summary List volumes
// @Accept json
// @Produce json
// @Success 200 {array} dto.Options
@@ -605,14 +601,14 @@ func (b *BaseApi) SearchVolume(c *gin.Context) {
func (b *BaseApi) ListVolume(c *gin.Context) {
list, err := containerService.ListVolume()
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, list)
}
// @Tags Container Volume
// @Summary Delete Container Volume
// @Summary Delete volume
// @Accept json
// @Param request body dto.BatchDelete true "request"
// @Success 200
@@ -627,14 +623,14 @@ func (b *BaseApi) DeleteVolume(c *gin.Context) {
}
if err := containerService.DeleteVolume(req); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, nil)
helper.Success(c)
}
// @Tags Container Volume
// @Summary Create Container Volume
// @Summary Create volume
// @Accept json
// @Param request body dto.VolumeCreate true "request"
// @Success 200
@@ -649,14 +645,14 @@ func (b *BaseApi) CreateVolume(c *gin.Context) {
}
if err := containerService.CreateVolume(req); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, nil)
helper.Success(c)
}
// @Tags Container Compose
// @Summary Update Container Compose
// @Summary Update compose
// @Accept json
// @Param request body dto.ComposeUpdate true "request"
// @Success 200
@@ -671,37 +667,44 @@ func (b *BaseApi) ComposeUpdate(c *gin.Context) {
}
if err := containerService.ComposeUpdate(req); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, nil)
helper.Success(c)
}
// @Tags Container Compose
// @Summary Container Compose logs
// @Param compose query string false "compose file address"
// @Param since query string false "date"
// @Param follow query string false "follow"
// @Param tail query string false "tail"
// @Success 200
// @Tags Container
// @Summary Container logs
// @Param container query string false "容器名称"
// @Param since query string false "时间筛选"
// @Param follow query string false "是否追踪"
// @Param tail query string false "显示行号"
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /containers/compose/search/log [get]
func (b *BaseApi) ComposeLogs(c *gin.Context) {
wsConn, err := upGrader.Upgrade(c.Writer, c.Request, nil)
if err != nil {
global.LOG.Errorf("gin context http handler failed, err: %v", err)
return
}
defer wsConn.Close()
// @Router /containers/search/log [post]
func (b *BaseApi) ContainerStreamLogs(c *gin.Context) {
c.Header("Content-Type", "text/event-stream")
c.Header("Cache-Control", "no-cache")
c.Header("Connection", "keep-alive")
c.Header("Transfer-Encoding", "chunked")
compose := c.Query("compose")
since := c.Query("since")
follow := c.Query("follow") == "true"
tail := c.Query("tail")
if err := containerService.ContainerLogs(wsConn, "compose", compose, since, tail, follow); err != nil {
_ = wsConn.WriteMessage(1, []byte(err.Error()))
return
container := c.Query("container")
compose := c.Query("compose")
streamLog := dto.StreamLog{
Compose: compose,
Container: container,
Since: since,
Follow: follow,
Tail: tail,
Type: "container",
}
if compose != "" {
streamLog.Type = "compose"
}
containerService.StreamLogs(c, streamLog)
}
@@ -1,35 +1,88 @@
package v1
package v2
import (
"time"
"github.com/1Panel-dev/1Panel/backend/app/api/v1/helper"
"github.com/1Panel-dev/1Panel/backend/app/dto"
"github.com/1Panel-dev/1Panel/backend/constant"
"github.com/1Panel-dev/1Panel/backend/utils/common"
"github.com/1Panel-dev/1Panel/agent/app/api/v2/helper"
"github.com/1Panel-dev/1Panel/agent/app/dto"
"github.com/1Panel-dev/1Panel/agent/utils/common"
"github.com/gin-gonic/gin"
)
// @Tags Cronjob
// @Summary Create cronjob
// @Accept json
// @Param request body dto.CronjobCreate true "request"
// @Param request body dto.CronjobOperate true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /cronjobs [post]
// @x-panel-log {"bodyKeys":["type","name"],"paramKeys":[],"BeforeFunctions":[],"formatZH":"创建计划任务 [type][name]","formatEN":"create cronjob [type][name]"}
func (b *BaseApi) CreateCronjob(c *gin.Context) {
var req dto.CronjobCreate
var req dto.CronjobOperate
if err := helper.CheckBindAndValidate(&req, c); err != nil {
return
}
if err := cronjobService.Create(req); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, nil)
helper.Success(c)
}
// @Tags Cronjob
// @Summary Load cronjob info
// @Accept json
// @Param request body dto.OperateByID true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /cronjobs/load/info [post]
func (b *BaseApi) LoadCronjobInfo(c *gin.Context) {
var req dto.OperateByID
if err := helper.CheckBindAndValidate(&req, c); err != nil {
return
}
data, err := cronjobService.LoadInfo(req)
if err != nil {
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, data)
}
// @Tags Cronjob
// @Summary Load script options
// @Success 200 {array} dto.ScriptOptions
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /cronjobs/script/options [get]
func (b *BaseApi) LoadScriptOptions(c *gin.Context) {
helper.SuccessWithData(c, cronjobService.LoadScriptOptions())
}
// @Tags Cronjob
// @Summary Load cronjob spec time
// @Accept json
// @Param request body dto.CronjobSpec true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /cronjobs/next [post]
func (b *BaseApi) LoadNextHandle(c *gin.Context) {
var req dto.CronjobSpec
if err := helper.CheckBindAndValidate(&req, c); err != nil {
return
}
list, err := cronjobService.LoadNextHandle(req.Spec)
if err != nil {
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, list)
}
// @Tags Cronjob
@@ -48,7 +101,7 @@ func (b *BaseApi) SearchCronjob(c *gin.Context) {
total, list, err := cronjobService.SearchWithPage(req)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
@@ -78,7 +131,7 @@ func (b *BaseApi) SearchJobRecords(c *gin.Context) {
total, list, err := cronjobService.SearchRecords(req)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
@@ -121,11 +174,11 @@ func (b *BaseApi) CleanRecord(c *gin.Context) {
}
if err := cronjobService.CleanRecord(req); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, nil)
helper.Success(c)
}
// @Tags Cronjob
@@ -144,32 +197,32 @@ func (b *BaseApi) DeleteCronjob(c *gin.Context) {
}
if err := cronjobService.Delete(req); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, nil)
helper.Success(c)
}
// @Tags Cronjob
// @Summary Update cronjob
// @Accept json
// @Param request body dto.CronjobUpdate true "request"
// @Param request body dto.CronjobOperate true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /cronjobs/update [post]
// @x-panel-log {"bodyKeys":["id"],"paramKeys":[],"BeforeFunctions":[{"input_column":"id","input_value":"id","isList":false,"db":"cronjobs","output_column":"name","output_value":"name"}],"formatZH":"更新计划任务 [name]","formatEN":"update cronjob [name]"}
func (b *BaseApi) UpdateCronjob(c *gin.Context) {
var req dto.CronjobUpdate
var req dto.CronjobOperate
if err := helper.CheckBindAndValidate(&req, c); err != nil {
return
}
if err := cronjobService.Update(req.ID, req); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, nil)
helper.Success(c)
}
// @Tags Cronjob
@@ -188,10 +241,10 @@ func (b *BaseApi) UpdateCronjobStatus(c *gin.Context) {
}
if err := cronjobService.UpdateStatus(req.ID, req.Status); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, nil)
helper.Success(c)
}
// @Tags Cronjob
@@ -211,7 +264,7 @@ func (b *BaseApi) TargetDownload(c *gin.Context) {
filePath, err := cronjobService.Download(req)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
@@ -234,8 +287,8 @@ func (b *BaseApi) HandleOnce(c *gin.Context) {
}
if err := cronjobService.HandleOnce(req.ID); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, nil)
helper.Success(c)
}
+169
View File
@@ -0,0 +1,169 @@
package v2
import (
"errors"
"github.com/1Panel-dev/1Panel/agent/app/api/v2/helper"
"github.com/1Panel-dev/1Panel/agent/app/dto"
"github.com/gin-gonic/gin"
)
// @Tags Dashboard
// @Summary Load os info
// @Accept json
// @Success 200 {object} dto.OsInfo
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /dashboard/base/os [get]
func (b *BaseApi) LoadDashboardOsInfo(c *gin.Context) {
data, err := dashboardService.LoadOsInfo()
if err != nil {
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, data)
}
// @Tags Dashboard
// @Summary Load app launcher
// @Accept json
// @Success 200 {Array} dto.AppLauncher
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /dashboard/app/launcher [get]
func (b *BaseApi) LoadAppLauncher(c *gin.Context) {
data, err := dashboardService.LoadAppLauncher(c)
if err != nil {
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, data)
}
// @Tags Dashboard
// @Summary Load app launcher options
// @Accept json
// @Param request body dto.SearchByFilter true "request"
// @Success 200 {Array} dto.LauncherOption
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /dashboard/app/launcher/option [post]
func (b *BaseApi) LoadAppLauncherOption(c *gin.Context) {
var req dto.SearchByFilter
if err := helper.CheckBind(&req, c); err != nil {
return
}
data, err := dashboardService.ListLauncherOption(req.Filter)
if err != nil {
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, data)
}
// @Tags Dashboard
// @Summary Update app Launcher
// @Accept json
// @Param request body dto.SettingUpdate true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /dashboard/app/launcher/show [post]
// @x-panel-log {"bodyKeys":["key", "value"],"paramKeys":[],"BeforeFunctions":[],"formatZH":"首页应用 [key] => 显示:[value]","formatEN":"app launcher [key] => show: [value]"}
func (b *BaseApi) UpdateAppLauncher(c *gin.Context) {
var req dto.SettingUpdate
if err := helper.CheckBindAndValidate(&req, c); err != nil {
return
}
if err := dashboardService.ChangeShow(req); err != nil {
helper.InternalServer(c, err)
return
}
helper.Success(c)
}
// @Tags Dashboard
// @Summary Load dashboard base info
// @Accept json
// @Param ioOption path string true "request"
// @Param netOption path string true "request"
// @Success 200 {object} dto.DashboardBase
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /dashboard/base/:ioOption/:netOption [get]
func (b *BaseApi) LoadDashboardBaseInfo(c *gin.Context) {
ioOption, ok := c.Params.Get("ioOption")
if !ok {
helper.BadRequest(c, errors.New("error ioOption in path"))
return
}
netOption, ok := c.Params.Get("netOption")
if !ok {
helper.BadRequest(c, errors.New("error ioOption in path"))
return
}
data, err := dashboardService.LoadBaseInfo(ioOption, netOption)
if err != nil {
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, data)
}
// @Tags Dashboard
// @Summary Load dashboard current info for node
// @Success 200 {object} dto.NodeCurrent
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /dashboard/current/node [get]
func (b *BaseApi) LoadCurrentInfoForNode(c *gin.Context) {
data := dashboardService.LoadCurrentInfoForNode()
helper.SuccessWithData(c, data)
}
// @Tags Dashboard
// @Summary Load dashboard current info
// @Accept json
// @Param ioOption path string true "request"
// @Param netOption path string true "request"
// @Success 200 {object} dto.DashboardCurrent
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /dashboard/current/:ioOption/:netOption [get]
func (b *BaseApi) LoadDashboardCurrentInfo(c *gin.Context) {
ioOption, ok := c.Params.Get("ioOption")
if !ok {
helper.BadRequest(c, errors.New("error ioOption in path"))
return
}
netOption, ok := c.Params.Get("netOption")
if !ok {
helper.BadRequest(c, errors.New("error netOption in path"))
return
}
data := dashboardService.LoadCurrentInfo(ioOption, netOption)
helper.SuccessWithData(c, data)
}
// @Tags Dashboard
// @Summary System restart
// @Accept json
// @Param operation path string true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /dashboard/system/restart/:operation [post]
func (b *BaseApi) SystemRestart(c *gin.Context) {
operation, ok := c.Params.Get("operation")
if !ok {
helper.BadRequest(c, errors.New("error operation in path"))
return
}
if err := dashboardService.Restart(operation); err != nil {
helper.InternalServer(c, err)
return
}
helper.Success(c)
}
@@ -1,11 +1,10 @@
package v1
package v2
import (
"encoding/base64"
"github.com/1Panel-dev/1Panel/backend/app/api/v1/helper"
"github.com/1Panel-dev/1Panel/backend/app/dto"
"github.com/1Panel-dev/1Panel/backend/constant"
"github.com/1Panel-dev/1Panel/agent/app/api/v2/helper"
"github.com/1Panel-dev/1Panel/agent/app/dto"
"github.com/gin-gonic/gin"
)
@@ -33,10 +32,10 @@ func (b *BaseApi) CreateDatabase(c *gin.Context) {
}
if err := databaseService.Create(req); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, nil)
helper.Success(c)
}
// @Tags Database
@@ -81,7 +80,7 @@ func (b *BaseApi) SearchDatabase(c *gin.Context) {
total, list, err := databaseService.SearchWithPage(req)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
@@ -93,20 +92,19 @@ func (b *BaseApi) SearchDatabase(c *gin.Context) {
// @Tags Database
// @Summary List databases
// @Param type path string true "type"
// @Success 200 {array} dto.DatabaseOption
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /databases/db/list/{type} [get]
// @Router /databases/db/list/:type [get]
func (b *BaseApi) ListDatabase(c *gin.Context) {
dbType, err := helper.GetStrParamByKey(c, "type")
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrBadRequest, constant.ErrTypeInvalidParams, err)
helper.BadRequest(c, err)
return
}
list, err := databaseService.List(dbType)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
@@ -114,21 +112,20 @@ func (b *BaseApi) ListDatabase(c *gin.Context) {
}
// @Tags Database
// @Summary Retrieve database list based on type
// @Param type path string true "type"
// @Summary List databases
// @Success 200 {array} dto.DatabaseItem
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /databases/db/item/{type} [get]
// @Router /databases/db/item/:type [get]
func (b *BaseApi) LoadDatabaseItems(c *gin.Context) {
dbType, err := helper.GetStrParamByKey(c, "type")
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrBadRequest, constant.ErrTypeInvalidParams, err)
helper.BadRequest(c, err)
return
}
list, err := databaseService.LoadItems(dbType)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
@@ -137,20 +134,19 @@ func (b *BaseApi) LoadDatabaseItems(c *gin.Context) {
// @Tags Database
// @Summary Get databases
// @Param name path string true "name"
// @Success 200 {object} dto.DatabaseInfo
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /databases/db/{name} [get]
// @Router /databases/db/:name [get]
func (b *BaseApi) GetDatabase(c *gin.Context) {
name, err := helper.GetStrParamByKey(c, "name")
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrBadRequest, constant.ErrTypeInvalidParams, err)
helper.BadRequest(c, err)
return
}
data, err := databaseService.Get(name)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
@@ -173,7 +169,7 @@ func (b *BaseApi) DeleteCheckDatabase(c *gin.Context) {
apps, err := databaseService.DeleteCheck(req.ID)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, apps)
@@ -195,10 +191,10 @@ func (b *BaseApi) DeleteDatabase(c *gin.Context) {
}
if err := databaseService.Delete(req); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, nil)
helper.Success(c)
}
// @Tags Database
@@ -225,8 +221,8 @@ func (b *BaseApi) UpdateDatabase(c *gin.Context) {
}
if err := databaseService.Update(req); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, nil)
helper.Success(c)
}
@@ -1,9 +1,8 @@
package v1
package v2
import (
"github.com/1Panel-dev/1Panel/backend/app/api/v1/helper"
"github.com/1Panel-dev/1Panel/backend/app/dto"
"github.com/1Panel-dev/1Panel/backend/constant"
"github.com/1Panel-dev/1Panel/agent/app/api/v2/helper"
"github.com/1Panel-dev/1Panel/agent/app/dto"
"github.com/gin-gonic/gin"
)
@@ -23,7 +22,7 @@ func (b *BaseApi) LoadDBBaseInfo(c *gin.Context) {
data, err := dbCommonService.LoadBaseInfo(req)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
@@ -45,7 +44,7 @@ func (b *BaseApi) LoadDBFile(c *gin.Context) {
}
content, err := dbCommonService.LoadDatabaseFile(req)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, content)
@@ -67,9 +66,9 @@ func (b *BaseApi) UpdateDBConfByFile(c *gin.Context) {
}
if err := dbCommonService.UpdateConfByFile(req); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, nil)
helper.Success(c)
}
@@ -1,12 +1,11 @@
package v1
package v2
import (
"context"
"encoding/base64"
"github.com/1Panel-dev/1Panel/backend/app/api/v1/helper"
"github.com/1Panel-dev/1Panel/backend/app/dto"
"github.com/1Panel-dev/1Panel/backend/constant"
"github.com/1Panel-dev/1Panel/agent/app/api/v2/helper"
"github.com/1Panel-dev/1Panel/agent/app/dto"
"github.com/gin-gonic/gin"
)
@@ -28,17 +27,17 @@ func (b *BaseApi) CreateMysql(c *gin.Context) {
if len(req.Password) != 0 {
password, err := base64.StdEncoding.DecodeString(req.Password)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrBadRequest, constant.ErrTypeInvalidParams, err)
helper.BadRequest(c, err)
return
}
req.Password = string(password)
}
if _, err := mysqlService.Create(context.Background(), req); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, nil)
helper.Success(c)
}
// @Tags Database Mysql
@@ -59,17 +58,17 @@ func (b *BaseApi) BindUser(c *gin.Context) {
if len(req.Password) != 0 {
password, err := base64.StdEncoding.DecodeString(req.Password)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrBadRequest, constant.ErrTypeInvalidParams, err)
helper.BadRequest(c, err)
return
}
req.Password = string(password)
}
if err := mysqlService.BindUser(req); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, nil)
helper.Success(c)
}
// @Tags Database Mysql
@@ -88,10 +87,10 @@ func (b *BaseApi) UpdateMysqlDescription(c *gin.Context) {
}
if err := mysqlService.UpdateDescription(req); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, nil)
helper.Success(c)
}
// @Tags Database Mysql
@@ -112,17 +111,17 @@ func (b *BaseApi) ChangeMysqlPassword(c *gin.Context) {
if len(req.Value) != 0 {
value, err := base64.StdEncoding.DecodeString(req.Value)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrBadRequest, constant.ErrTypeInvalidParams, err)
helper.BadRequest(c, err)
return
}
req.Value = string(value)
}
if err := mysqlService.ChangePassword(req); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, nil)
helper.Success(c)
}
// @Tags Database Mysql
@@ -141,10 +140,10 @@ func (b *BaseApi) ChangeMysqlAccess(c *gin.Context) {
}
if err := mysqlService.ChangeAccess(req); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, nil)
helper.Success(c)
}
// @Tags Database Mysql
@@ -163,10 +162,10 @@ func (b *BaseApi) UpdateMysqlVariables(c *gin.Context) {
}
if err := mysqlService.UpdateVariables(req); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, nil)
helper.Success(c)
}
// @Tags Database Mysql
@@ -185,7 +184,7 @@ func (b *BaseApi) SearchMysql(c *gin.Context) {
total, list, err := mysqlService.SearchWithPage(req)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
@@ -206,7 +205,7 @@ func (b *BaseApi) SearchMysql(c *gin.Context) {
func (b *BaseApi) ListDBName(c *gin.Context) {
list, err := mysqlService.ListDBOption()
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
@@ -217,7 +216,6 @@ func (b *BaseApi) ListDBName(c *gin.Context) {
// @Summary Load mysql database from remote
// @Accept json
// @Param request body dto.MysqlLoadDB true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /databases/load [post]
@@ -228,11 +226,11 @@ func (b *BaseApi) LoadDBFromRemote(c *gin.Context) {
}
if err := mysqlService.LoadFromRemote(req); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, nil)
helper.Success(c)
}
// @Tags Database Mysql
@@ -251,7 +249,7 @@ func (b *BaseApi) DeleteCheckMysql(c *gin.Context) {
apps, err := mysqlService.DeleteCheck(req)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, apps)
@@ -274,12 +272,12 @@ func (b *BaseApi) DeleteMysql(c *gin.Context) {
tx, ctx := helper.GetTxAndContext()
if err := mysqlService.Delete(ctx, req); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
tx.Rollback()
return
}
tx.Commit()
helper.SuccessWithData(c, nil)
helper.Success(c)
}
// @Tags Database Mysql
@@ -297,7 +295,7 @@ func (b *BaseApi) LoadRemoteAccess(c *gin.Context) {
}
isRemote, err := mysqlService.LoadRemoteAccess(req)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
@@ -320,7 +318,7 @@ func (b *BaseApi) LoadStatus(c *gin.Context) {
data, err := mysqlService.LoadStatus(req)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
@@ -343,7 +341,7 @@ func (b *BaseApi) LoadVariables(c *gin.Context) {
data, err := mysqlService.LoadVariables(req)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
@@ -1,16 +1,15 @@
package v1
package v2
import (
"context"
"encoding/base64"
"github.com/1Panel-dev/1Panel/backend/app/api/v1/helper"
"github.com/1Panel-dev/1Panel/backend/app/dto"
"github.com/1Panel-dev/1Panel/backend/constant"
"github.com/1Panel-dev/1Panel/agent/app/api/v2/helper"
"github.com/1Panel-dev/1Panel/agent/app/dto"
"github.com/gin-gonic/gin"
)
// @Tags Database Postgresql
// @Tags Database PostgreSQL
// @Summary Create postgresql database
// @Accept json
// @Param request body dto.PostgresqlDBCreate true "request"
@@ -28,20 +27,20 @@ func (b *BaseApi) CreatePostgresql(c *gin.Context) {
if len(req.Password) != 0 {
password, err := base64.StdEncoding.DecodeString(req.Password)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrBadRequest, constant.ErrTypeInvalidParams, err)
helper.BadRequest(c, err)
return
}
req.Password = string(password)
}
if _, err := postgresqlService.Create(context.Background(), req); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, nil)
helper.Success(c)
}
// @Tags Database Postgresql
// @Tags Database PostgreSQL
// @Summary Bind postgresql user
// @Accept json
// @Param request body dto.PostgresqlBindUser true "request"
@@ -57,13 +56,13 @@ func (b *BaseApi) BindPostgresqlUser(c *gin.Context) {
}
if err := postgresqlService.BindUser(req); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, nil)
helper.Success(c)
}
// @Tags Database Postgresql
// @Tags Database PostgreSQL
// @Summary Update postgresql database description
// @Accept json
// @Param request body dto.UpdateDescription true "request"
@@ -79,13 +78,13 @@ func (b *BaseApi) UpdatePostgresqlDescription(c *gin.Context) {
}
if err := postgresqlService.UpdateDescription(req); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, nil)
helper.Success(c)
}
// @Tags Database Postgresql
// @Tags Database PostgreSQL
// @Summary Change postgresql privileges
// @Accept json
// @Param request body dto.ChangeDBInfo true "request"
@@ -101,13 +100,13 @@ func (b *BaseApi) ChangePostgresqlPrivileges(c *gin.Context) {
}
if err := postgresqlService.ChangePrivileges(req); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, nil)
helper.Success(c)
}
// @Tags Database Postgresql
// @Tags Database PostgreSQL
// @Summary Change postgresql password
// @Accept json
// @Param request body dto.ChangeDBInfo true "request"
@@ -125,20 +124,20 @@ func (b *BaseApi) ChangePostgresqlPassword(c *gin.Context) {
if len(req.Value) != 0 {
value, err := base64.StdEncoding.DecodeString(req.Value)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrBadRequest, constant.ErrTypeInvalidParams, err)
helper.BadRequest(c, err)
return
}
req.Value = string(value)
}
if err := postgresqlService.ChangePassword(req); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, nil)
helper.Success(c)
}
// @Tags Database Postgresql
// @Tags Database PostgreSQL
// @Summary Page postgresql databases
// @Accept json
// @Param request body dto.PostgresqlDBSearch true "request"
@@ -154,7 +153,7 @@ func (b *BaseApi) SearchPostgresql(c *gin.Context) {
total, list, err := postgresqlService.SearchWithPage(req)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
@@ -164,31 +163,29 @@ func (b *BaseApi) SearchPostgresql(c *gin.Context) {
})
}
// @Tags Database Postgresql
// @Tags Database PostgreSQL
// @Summary Load postgresql database from remote
// @Accept json
// @Param request body dto.PostgresqlLoadDB true "request"
// @Param database path string true "database"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /databases/pg/{database}/load [post]
// @Router /databases/pg/:database/load [post]
func (b *BaseApi) LoadPostgresqlDBFromRemote(c *gin.Context) {
database, err := helper.GetStrParamByKey(c, "database")
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrBadRequest, constant.ErrTypeInvalidParams, err)
helper.BadRequest(c, err)
return
}
if err := postgresqlService.LoadFromRemote(database); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, nil)
helper.Success(c)
}
// @Tags Database Postgresql
// @Tags Database PostgreSQL
// @Summary Check before delete postgresql database
// @Accept json
// @Param request body dto.PostgresqlDBDeleteCheck true "request"
@@ -204,13 +201,13 @@ func (b *BaseApi) DeleteCheckPostgresql(c *gin.Context) {
apps, err := postgresqlService.DeleteCheck(req)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, apps)
}
// @Tags Database Postgresql
// @Tags Database PostgreSQL
// @Summary Delete postgresql database
// @Accept json
// @Param request body dto.PostgresqlDBDelete true "request"
@@ -226,10 +223,10 @@ func (b *BaseApi) DeletePostgresql(c *gin.Context) {
}
tx, ctx := helper.GetTxAndContext()
if err := postgresqlService.Delete(ctx, req); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
tx.Rollback()
return
}
tx.Commit()
helper.SuccessWithData(c, nil)
helper.Success(c)
}
@@ -1,30 +1,29 @@
package v1
package v2
import (
"encoding/base64"
"github.com/1Panel-dev/1Panel/backend/app/api/v1/helper"
"github.com/1Panel-dev/1Panel/backend/app/dto"
"github.com/1Panel-dev/1Panel/backend/constant"
"github.com/1Panel-dev/1Panel/agent/app/api/v2/helper"
"github.com/1Panel-dev/1Panel/agent/app/dto"
"github.com/gin-gonic/gin"
)
// @Tags Database Redis
// @Summary Load redis status info
// @Accept json
// @Param request body dto.OperationWithName true "request"
// @Param request body dto.LoadRedisStatus true "request"
// @Success 200 {object} dto.RedisStatus
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /databases/redis/status [post]
func (b *BaseApi) LoadRedisStatus(c *gin.Context) {
var req dto.OperationWithName
var req dto.LoadRedisStatus
if err := helper.CheckBind(&req, c); err != nil {
return
}
data, err := redisService.LoadStatus(req)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
@@ -34,19 +33,19 @@ func (b *BaseApi) LoadRedisStatus(c *gin.Context) {
// @Tags Database Redis
// @Summary Load redis conf
// @Accept json
// @Param request body dto.OperationWithName true "request"
// @Param request body dto.LoadRedisStatus true "request"
// @Success 200 {object} dto.RedisConf
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /databases/redis/conf [post]
func (b *BaseApi) LoadRedisConf(c *gin.Context) {
var req dto.OperationWithName
var req dto.LoadRedisStatus
if err := helper.CheckBind(&req, c); err != nil {
return
}
data, err := redisService.LoadConf(req)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
@@ -56,19 +55,19 @@ func (b *BaseApi) LoadRedisConf(c *gin.Context) {
// @Tags Database Redis
// @Summary Load redis persistence conf
// @Accept json
// @Param request body dto.OperationWithName true "request"
// @Param request body dto.LoadRedisStatus true "request"
// @Success 200 {object} dto.RedisPersistence
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /databases/redis/persistence/conf [post]
func (b *BaseApi) LoadPersistenceConf(c *gin.Context) {
var req dto.OperationWithName
var req dto.LoadRedisStatus
if err := helper.CheckBind(&req, c); err != nil {
return
}
data, err := redisService.LoadPersistenceConf(req)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
@@ -87,11 +86,11 @@ func (b *BaseApi) CheckHasCli(c *gin.Context) {
// @Router /databases/redis/install/cli [post]
func (b *BaseApi) InstallCli(c *gin.Context) {
if err := redisService.InstallCli(); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithOutData(c)
helper.Success(c)
}
// @Tags Database Redis
@@ -110,10 +109,10 @@ func (b *BaseApi) UpdateRedisConf(c *gin.Context) {
}
if err := redisService.UpdateConf(req); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, nil)
helper.Success(c)
}
// @Tags Database Redis
@@ -134,17 +133,17 @@ func (b *BaseApi) ChangeRedisPassword(c *gin.Context) {
if len(req.Value) != 0 {
value, err := base64.StdEncoding.DecodeString(req.Value)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrBadRequest, constant.ErrTypeInvalidParams, err)
helper.BadRequest(c, err)
return
}
req.Value = string(value)
}
if err := redisService.ChangePassword(req); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, nil)
helper.Success(c)
}
// @Tags Database Redis
@@ -163,8 +162,8 @@ func (b *BaseApi) UpdateRedisPersistenceConf(c *gin.Context) {
}
if err := redisService.UpdatePersistenceConf(req); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, nil)
helper.Success(c)
}
@@ -1,11 +1,10 @@
package v1
package v2
import (
"encoding/base64"
"github.com/1Panel-dev/1Panel/backend/app/api/v1/helper"
"github.com/1Panel-dev/1Panel/backend/app/dto"
"github.com/1Panel-dev/1Panel/backend/constant"
"github.com/1Panel-dev/1Panel/agent/app/api/v2/helper"
"github.com/1Panel-dev/1Panel/agent/app/dto"
"github.com/gin-gonic/gin"
)
@@ -18,7 +17,7 @@ import (
func (b *BaseApi) LoadDeviceBaseInfo(c *gin.Context) {
data, err := deviceService.LoadBaseInfo()
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
@@ -28,14 +27,14 @@ func (b *BaseApi) LoadDeviceBaseInfo(c *gin.Context) {
// @Tags Device
// @Summary list time zone options
// @Accept json
// @Success 200 {array} string
// @Success 200 {Array} string
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /toolbox/device/zone/options [get]
func (b *BaseApi) LoadTimeOption(c *gin.Context) {
list, err := deviceService.LoadTimeZone()
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
@@ -58,7 +57,7 @@ func (b *BaseApi) LoadDeviceConf(c *gin.Context) {
list, err := deviceService.LoadConf(req.Name)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
@@ -79,11 +78,26 @@ func (b *BaseApi) UpdateDeviceByFile(c *gin.Context) {
return
}
if err := deviceService.UpdateByConf(req); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, nil)
helper.Success(c)
}
// @Tags Device
// @Summary Load user list
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /toolbox/device/users [get]
func (b *BaseApi) LoadUsers(c *gin.Context) {
users, err := deviceService.LoadUsers()
if err != nil {
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, users)
}
// @Tags Device
@@ -102,11 +116,11 @@ func (b *BaseApi) UpdateDeviceConf(c *gin.Context) {
}
if err := deviceService.Update(req.Key, req.Value); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, nil)
helper.Success(c)
}
// @Tags Device
@@ -123,11 +137,11 @@ func (b *BaseApi) UpdateDeviceHost(c *gin.Context) {
}
if err := deviceService.UpdateHosts(req); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, nil)
helper.Success(c)
}
// @Tags Device
@@ -146,17 +160,17 @@ func (b *BaseApi) UpdateDevicePasswd(c *gin.Context) {
if len(req.Passwd) != 0 {
password, err := base64.StdEncoding.DecodeString(req.Passwd)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrBadRequest, constant.ErrTypeInvalidParams, err)
helper.BadRequest(c, err)
return
}
req.Passwd = string(password)
}
if err := deviceService.UpdatePasswd(req); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, nil)
helper.Success(c)
}
// @Tags Device
@@ -174,11 +188,11 @@ func (b *BaseApi) UpdateDeviceSwap(c *gin.Context) {
return
}
if err := deviceService.UpdateSwap(req); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, nil)
helper.Success(c)
}
// @Tags Device
@@ -197,7 +211,7 @@ func (b *BaseApi) CheckDNS(c *gin.Context) {
data, err := deviceService.CheckDNS(req.Key, req.Value)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
@@ -232,5 +246,5 @@ func (b *BaseApi) SystemClean(c *gin.Context) {
deviceService.Clean(req)
helper.SuccessWithData(c, nil)
helper.Success(c)
}
@@ -1,18 +1,18 @@
package v1
package v2
import (
"os"
"github.com/1Panel-dev/1Panel/backend/app/api/v1/helper"
"github.com/1Panel-dev/1Panel/backend/app/dto"
"github.com/1Panel-dev/1Panel/backend/constant"
"github.com/1Panel-dev/1Panel/agent/app/api/v2/helper"
"github.com/1Panel-dev/1Panel/agent/app/dto"
"github.com/1Panel-dev/1Panel/agent/constant"
"github.com/gin-gonic/gin"
)
// @Tags Container Docker
// @Summary Load docker status
// @Produce json
// @Success 200 {string} status
// @Success 200 {string} dto.DockerStatus
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /containers/docker/status [get]
@@ -35,7 +35,7 @@ func (b *BaseApi) LoadDaemonJsonFile(c *gin.Context) {
}
content, err := os.ReadFile(constant.DaemonJsonPath)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, string(content))
@@ -49,7 +49,11 @@ func (b *BaseApi) LoadDaemonJsonFile(c *gin.Context) {
// @Security Timestamp
// @Router /containers/daemonjson [get]
func (b *BaseApi) LoadDaemonJson(c *gin.Context) {
conf := dockerService.LoadDockerConf()
conf, err := dockerService.LoadDockerConf()
if err != nil {
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, conf)
}
@@ -68,12 +72,12 @@ func (b *BaseApi) UpdateDaemonJson(c *gin.Context) {
return
}
if err := dockerService.UpdateConf(req); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
if err := dockerService.UpdateConf(req, true); err != nil {
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, nil)
helper.Success(c)
}
// @Tags Container Docker
@@ -92,11 +96,11 @@ func (b *BaseApi) UpdateLogOption(c *gin.Context) {
}
if err := dockerService.UpdateLogOption(req); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, nil)
helper.Success(c)
}
// @Tags Container Docker
@@ -115,11 +119,11 @@ func (b *BaseApi) UpdateIpv6Option(c *gin.Context) {
}
if err := dockerService.UpdateIpv6Option(req); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, nil)
helper.Success(c)
}
// @Tags Container Docker
@@ -138,11 +142,11 @@ func (b *BaseApi) UpdateDaemonJsonByFile(c *gin.Context) {
}
if err := dockerService.UpdateConfByFile(req); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, nil)
helper.Success(c)
}
// @Tags Container Docker
@@ -161,9 +165,9 @@ func (b *BaseApi) OperateDocker(c *gin.Context) {
}
if err := dockerService.OperateDocker(req); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, nil)
helper.Success(c)
}
@@ -1,6 +1,6 @@
package v1
package v2
import "github.com/1Panel-dev/1Panel/backend/app/service"
import "github.com/1Panel-dev/1Panel/agent/app/service"
type ApiGroup struct {
BaseApi
@@ -8,14 +8,17 @@ type ApiGroup struct {
var ApiGroupApp = new(ApiGroup)
type BaseApi struct{}
var (
authService = service.NewIAuthService()
dashboardService = service.NewIDashboardService()
appService = service.NewIAppService()
appInstallService = service.NewIAppInstalledService()
appService = service.NewIAppService()
appInstallService = service.NewIAppInstalledService()
appIgnoreUpgradeService = service.NewIAppIgnoreUpgradeService()
AIToolService = service.NewIAIToolService()
aiToolService = service.NewIAIToolService()
mcpServerService = service.NewIMcpServerService()
containerService = service.NewIContainerService()
composeTemplateService = service.NewIComposeTemplateService()
@@ -31,21 +34,19 @@ var (
cronjobService = service.NewICronjobService()
hostService = service.NewIHostService()
groupService = service.NewIGroupService()
fileService = service.NewIFileService()
sshService = service.NewISSHService()
firewallService = service.NewIFirewallService()
monitorService = service.NewIMonitorService()
deviceService = service.NewIDeviceService()
fail2banService = service.NewIFail2BanService()
ftpService = service.NewIFtpService()
clamService = service.NewIClamService()
settingService = service.NewISettingService()
backupService = service.NewIBackupService()
commandService = service.NewICommandService()
settingService = service.NewISettingService()
backupService = service.NewIBackupService()
backupRecordService = service.NewIBackupRecordService()
websiteService = service.NewIWebsiteService()
websiteDnsAccountService = service.NewIWebsiteDnsAccountService()
@@ -56,7 +57,6 @@ var (
logService = service.NewILogService()
snapshotService = service.NewISnapshotService()
upgradeService = service.NewIUpgradeService()
runtimeService = service.NewRuntimeService()
processService = service.NewIProcessService()
@@ -68,4 +68,7 @@ var (
favoriteService = service.NewIFavoriteService()
websiteCAService = service.NewIWebsiteCAService()
taskService = service.NewITaskService()
groupService = service.NewIGroupService()
alertService = service.NewIAlertService()
)
@@ -1,11 +1,10 @@
package v1
package v2
import (
"os"
"github.com/1Panel-dev/1Panel/backend/app/api/v1/helper"
"github.com/1Panel-dev/1Panel/backend/app/dto"
"github.com/1Panel-dev/1Panel/backend/constant"
"github.com/1Panel-dev/1Panel/agent/app/api/v2/helper"
"github.com/1Panel-dev/1Panel/agent/app/dto"
"github.com/gin-gonic/gin"
)
@@ -18,7 +17,7 @@ import (
func (b *BaseApi) LoadFail2BanBaseInfo(c *gin.Context) {
data, err := fail2banService.LoadBaseInfo()
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
@@ -29,7 +28,7 @@ func (b *BaseApi) LoadFail2BanBaseInfo(c *gin.Context) {
// @Summary Page fail2ban ip list
// @Accept json
// @Param request body dto.Fail2BanSearch true "request"
// @Success 200 {array} string
// @Success 200 {Array} string
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /toolbox/fail2ban/search [post]
@@ -41,7 +40,7 @@ func (b *BaseApi) SearchFail2Ban(c *gin.Context) {
list, err := fail2banService.Search(req)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
@@ -52,7 +51,6 @@ func (b *BaseApi) SearchFail2Ban(c *gin.Context) {
// @Summary Operate fail2ban
// @Accept json
// @Param request body dto.Operate true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /toolbox/fail2ban/operate [post]
@@ -64,18 +62,17 @@ func (b *BaseApi) OperateFail2Ban(c *gin.Context) {
}
if err := fail2banService.Operate(req.Operation); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, nil)
helper.Success(c)
}
// @Tags Fail2ban
// @Summary Operate sshd of fail2ban
// @Accept json
// @Param request body dto.Operate true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /toolbox/fail2ban/operate/sshd [post]
@@ -86,11 +83,11 @@ func (b *BaseApi) OperateSSHD(c *gin.Context) {
}
if err := fail2banService.OperateSSHD(req); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, nil)
helper.Success(c)
}
// @Tags Fail2ban
@@ -109,10 +106,10 @@ func (b *BaseApi) UpdateFail2BanConf(c *gin.Context) {
}
if err := fail2banService.UpdateConf(req); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, nil)
helper.Success(c)
}
// @Tags Fail2ban
@@ -126,7 +123,7 @@ func (b *BaseApi) LoadFail2BanConf(c *gin.Context) {
path := "/etc/fail2ban/jail.local"
file, err := os.ReadFile(path)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
@@ -147,9 +144,9 @@ func (b *BaseApi) UpdateFail2BanConfByFile(c *gin.Context) {
return
}
if err := fail2banService.UpdateConfByFile(req); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, nil)
helper.Success(c)
}
@@ -1,10 +1,9 @@
package v1
package v2
import (
"github.com/1Panel-dev/1Panel/backend/app/api/v1/helper"
"github.com/1Panel-dev/1Panel/backend/app/dto"
"github.com/1Panel-dev/1Panel/backend/app/dto/request"
"github.com/1Panel-dev/1Panel/backend/constant"
"github.com/1Panel-dev/1Panel/agent/app/api/v2/helper"
"github.com/1Panel-dev/1Panel/agent/app/dto"
"github.com/1Panel-dev/1Panel/agent/app/dto/request"
"github.com/gin-gonic/gin"
)
@@ -23,7 +22,7 @@ func (b *BaseApi) SearchFavorite(c *gin.Context) {
}
total, list, err := favoriteService.Page(req)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, dto.PageResult{
@@ -48,7 +47,7 @@ func (b *BaseApi) CreateFavorite(c *gin.Context) {
}
favorite, err := favoriteService.Create(req)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, favorite)
@@ -69,8 +68,8 @@ func (b *BaseApi) DeleteFavorite(c *gin.Context) {
return
}
if err := favoriteService.Delete(req.ID); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithOutData(c)
helper.Success(c)
}
@@ -1,6 +1,7 @@
package v1
package v2
import (
"encoding/json"
"errors"
"fmt"
"io"
@@ -13,15 +14,15 @@ import (
"strings"
"syscall"
"github.com/1Panel-dev/1Panel/backend/app/api/v1/helper"
"github.com/1Panel-dev/1Panel/backend/app/dto"
"github.com/1Panel-dev/1Panel/backend/app/dto/request"
"github.com/1Panel-dev/1Panel/backend/app/dto/response"
"github.com/1Panel-dev/1Panel/backend/buserr"
"github.com/1Panel-dev/1Panel/backend/constant"
"github.com/1Panel-dev/1Panel/backend/global"
"github.com/1Panel-dev/1Panel/backend/utils/files"
websocket2 "github.com/1Panel-dev/1Panel/backend/utils/websocket"
"github.com/1Panel-dev/1Panel/agent/app/api/v2/helper"
"github.com/1Panel-dev/1Panel/agent/app/dto"
"github.com/1Panel-dev/1Panel/agent/app/dto/request"
"github.com/1Panel-dev/1Panel/agent/app/dto/response"
"github.com/1Panel-dev/1Panel/agent/buserr"
"github.com/1Panel-dev/1Panel/agent/constant"
"github.com/1Panel-dev/1Panel/agent/global"
"github.com/1Panel-dev/1Panel/agent/utils/files"
websocket2 "github.com/1Panel-dev/1Panel/agent/utils/websocket"
"github.com/gin-gonic/gin"
"github.com/gorilla/websocket"
)
@@ -41,7 +42,7 @@ func (b *BaseApi) ListFiles(c *gin.Context) {
}
fileList, err := fileService.GetFileList(req)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, fileList)
@@ -62,7 +63,7 @@ func (b *BaseApi) SearchUploadWithPage(c *gin.Context) {
}
total, files, err := fileService.SearchUploadWithPage(req)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, dto.PageResult{
@@ -86,7 +87,7 @@ func (b *BaseApi) GetFileTree(c *gin.Context) {
}
tree, err := fileService.GetFileTree(req)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, tree)
@@ -108,10 +109,10 @@ func (b *BaseApi) CreateFile(c *gin.Context) {
}
err := fileService.Create(req)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, nil)
helper.Success(c)
}
// @Tags File
@@ -130,10 +131,10 @@ func (b *BaseApi) DeleteFile(c *gin.Context) {
}
err := fileService.Delete(req)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, nil)
helper.Success(c)
}
// @Tags File
@@ -152,10 +153,10 @@ func (b *BaseApi) BatchDeleteFile(c *gin.Context) {
}
err := fileService.BatchDelete(req)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, nil)
helper.Success(c)
}
// @Tags File
@@ -174,10 +175,10 @@ func (b *BaseApi) ChangeFileMode(c *gin.Context) {
}
err := fileService.ChangeMode(req)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithOutData(c)
helper.Success(c)
}
// @Tags File
@@ -195,10 +196,10 @@ func (b *BaseApi) ChangeFileOwner(c *gin.Context) {
return
}
if err := fileService.ChangeOwner(req); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithOutData(c)
helper.Success(c)
}
// @Tags File
@@ -217,10 +218,10 @@ func (b *BaseApi) CompressFile(c *gin.Context) {
}
err := fileService.Compress(req)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, nil)
helper.Success(c)
}
// @Tags File
@@ -239,10 +240,10 @@ func (b *BaseApi) DeCompressFile(c *gin.Context) {
}
err := fileService.DeCompress(req)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, nil)
helper.Success(c)
}
// @Tags File
@@ -261,7 +262,7 @@ func (b *BaseApi) GetContent(c *gin.Context) {
}
info, err := fileService.GetContent(req)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, info)
@@ -282,25 +283,24 @@ func (b *BaseApi) SaveContent(c *gin.Context) {
return
}
if err := fileService.SaveContent(req); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, nil)
helper.Success(c)
}
// @Tags File
// @Summary Upload file
// @Accept multipart/form-data
// @Param file formData file true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /files/upload [post]
// @x-panel-log {"bodyKeys":["path"],"paramKeys":[],"BeforeFunctions":[],"formatZH":"上传文件 [path]","formatEN":"Upload file [path]"}
// @x-panel-log {"bodyKeys":["path", "file"],"paramKeys":[],"BeforeFunctions":[],"formatZH":"上传文件 [path]/[file]","formatEN":"Upload file [path]/[file]"}
func (b *BaseApi) UploadFiles(c *gin.Context) {
form, err := c.MultipartForm()
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrBadRequest, constant.ErrTypeInvalidParams, err)
helper.BadRequest(c, err)
return
}
uploadFiles := form.File["file"]
@@ -315,7 +315,7 @@ func (b *BaseApi) UploadFiles(c *gin.Context) {
}
if len(paths) == 0 || !strings.Contains(paths[0], "/") {
helper.ErrorWithDetail(c, constant.CodeErrBadRequest, constant.ErrTypeInvalidParams, errors.New("error paths in request"))
helper.BadRequest(c, errors.New("error paths in request"))
return
}
dir := path.Dir(paths[0])
@@ -324,27 +324,27 @@ func (b *BaseApi) UploadFiles(c *gin.Context) {
if err != nil && os.IsNotExist(err) {
mode, err := files.GetParentMode(dir)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
if err = os.MkdirAll(dir, mode); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrBadRequest, constant.ErrTypeInvalidParams, fmt.Errorf("mkdir %s failed, err: %v", dir, err))
helper.BadRequest(c, fmt.Errorf("mkdir %s failed, err: %v", dir, err))
return
}
}
info, err := os.Stat(dir)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
mode := info.Mode()
fileOp := files.NewFileOp()
stat, ok := info.Sys().(*syscall.Stat_t)
uid, gid := -1, -1
if ok {
uid, gid = int(stat.Uid), int(stat.Gid)
}
success := 0
failures := make(buserr.MultiErr)
for _, file := range uploadFiles {
@@ -391,7 +391,7 @@ func (b *BaseApi) UploadFiles(c *gin.Context) {
success++
}
if success == 0 {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, failures)
helper.InternalServer(c, failures)
} else {
helper.SuccessWithMsg(c, fmt.Sprintf("%d files upload success", success))
}
@@ -410,11 +410,20 @@ func (b *BaseApi) CheckFile(c *gin.Context) {
if err := helper.CheckBindAndValidate(&req, c); err != nil {
return
}
if _, err := os.Stat(req.Path); err != nil {
helper.SuccessWithData(c, false)
fileOp := files.NewFileOp()
if fileOp.Stat(req.Path) {
helper.SuccessWithData(c, true)
return
}
helper.SuccessWithData(c, true)
if req.WithInit {
if err := fileOp.CreateDir(req.Path, 0644); err != nil {
helper.SuccessWithData(c, false)
return
}
helper.SuccessWithData(c, true)
return
}
helper.SuccessWithData(c, false)
}
// @Tags File
@@ -449,10 +458,10 @@ func (b *BaseApi) ChangeFileName(c *gin.Context) {
return
}
if err := fileService.ChangeName(req); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, nil)
helper.Success(c)
}
// @Tags File
@@ -471,7 +480,7 @@ func (b *BaseApi) WgetFile(c *gin.Context) {
}
key, err := fileService.Wget(req)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, response.FileWgetRes{
@@ -494,10 +503,10 @@ func (b *BaseApi) MoveFile(c *gin.Context) {
return
}
if err := fileService.MvFile(req); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, nil)
helper.Success(c)
}
// @Tags File
@@ -511,7 +520,7 @@ func (b *BaseApi) Download(c *gin.Context) {
filePath := c.Query("path")
file, err := os.Open(filePath)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
}
defer file.Close()
info, _ := file.Stat()
@@ -536,22 +545,22 @@ func (b *BaseApi) DownloadChunkFiles(c *gin.Context) {
}
fileOp := files.NewFileOp()
if !fileOp.Stat(req.Path) {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrPathNotFound, nil)
helper.ErrorWithDetail(c, http.StatusInternalServerError, "ErrPathNotFound", nil)
return
}
filePath := req.Path
fstFile, err := fileOp.OpenFile(filePath)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
info, err := fstFile.Stat()
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
if info.IsDir() {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrFileDownloadDir, err)
helper.ErrorWithDetail(c, http.StatusInternalServerError, "ErrFileDownloadDir", err)
return
}
@@ -580,7 +589,7 @@ func (b *BaseApi) DownloadChunkFiles(c *gin.Context) {
buffer := make([]byte, 1024*1024)
file, err := os.Open(filePath)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
defer file.Close()
@@ -589,7 +598,7 @@ func (b *BaseApi) DownloadChunkFiles(c *gin.Context) {
reader := io.LimitReader(file, endPos-startPos+1)
_, err = io.CopyBuffer(c.Writer, reader, buffer)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
} else {
@@ -613,7 +622,29 @@ func (b *BaseApi) Size(c *gin.Context) {
}
res, err := fileService.DirSize(req)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, res)
}
// @Tags File
// @Summary Multi file size
// @Accept json
// @Param request body request.DirSizeReq true "request"
// @Success 200 {array} response.DepthDirSizeRes
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /files/depth/size [post]
// @x-panel-log {"bodyKeys":["path"],"paramKeys":[],"BeforeFunctions":[],"formatZH":"获取目录及其第一层子目录文件夹大小 [path]","formatEN":"Multi file size [path]"}
func (b *BaseApi) DepthDirSize(c *gin.Context) {
var req request.DirSizeReq
if err := helper.CheckBindAndValidate(&req, c); err != nil {
return
}
res, err := fileService.DepthDirSize(req)
if err != nil {
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, res)
@@ -628,19 +659,11 @@ func mergeChunks(fileName string, fileDir string, dstDir string, chunkCount int,
dstDir = strings.TrimSpace(dstDir)
mode, _ := files.GetParentMode(dstDir)
if mode == 0 {
mode = 0755
mode = constant.DirPerm
}
uid, gid := -1, -1
if info, err := os.Stat(dstDir); err != nil {
if os.IsNotExist(err) {
if err = op.CreateDir(dstDir, mode); err != nil {
return err
}
}
} else {
stat, ok := info.Sys().(*syscall.Stat_t)
if ok {
uid, gid = int(stat.Uid), int(stat.Gid)
if _, err := os.Stat(dstDir); err != nil && os.IsNotExist(err) {
if err = op.CreateDir(dstDir, mode); err != nil {
return err
}
}
dstFileName := filepath.Join(dstDir, fileName)
@@ -650,7 +673,6 @@ func mergeChunks(fileName string, fileDir string, dstDir string, chunkCount int,
} else {
mode = 0644
}
if overwrite {
_ = os.Remove(dstFileName)
}
@@ -671,16 +693,12 @@ func mergeChunks(fileName string, fileDir string, dstDir string, chunkCount int,
}
_ = os.Remove(chunkPath)
}
if uid != -1 && gid != -1 {
_ = os.Chown(dstFileName, uid, gid)
}
return nil
}
// @Tags File
// @Summary Chunk upload file
// @Accept multipart/form-data
// @Summary ChunkUpload file
// @Param file formData file true "request"
// @Success 200
// @Security ApiKeyAuth
@@ -690,30 +708,30 @@ func (b *BaseApi) UploadChunkFiles(c *gin.Context) {
var err error
fileForm, err := c.FormFile("chunk")
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrBadRequest, constant.ErrTypeInvalidParams, err)
helper.BadRequest(c, err)
return
}
uploadFile, err := fileForm.Open()
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrBadRequest, constant.ErrTypeInvalidParams, err)
helper.BadRequest(c, err)
return
}
defer uploadFile.Close()
chunkIndex, err := strconv.Atoi(c.PostForm("chunkIndex"))
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrBadRequest, constant.ErrTypeInvalidParams, err)
helper.BadRequest(c, err)
return
}
chunkCount, err := strconv.Atoi(c.PostForm("chunkCount"))
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrBadRequest, constant.ErrTypeInvalidParams, err)
helper.BadRequest(c, err)
return
}
fileOp := files.NewFileOp()
tmpDir := path.Join(global.CONF.System.TmpDir, "upload")
tmpDir := path.Join(global.Dir.TmpDir, "upload")
if !fileOp.Stat(tmpDir) {
if err := fileOp.CreateDir(tmpDir, 0755); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrBadRequest, constant.ErrTypeInvalidParams, err)
if err := fileOp.CreateDir(tmpDir, constant.DirPerm); err != nil {
helper.BadRequest(c, err)
return
}
}
@@ -723,7 +741,7 @@ func (b *BaseApi) UploadChunkFiles(c *gin.Context) {
if fileOp.Stat(fileDir) {
_ = fileOp.DeleteDir(fileDir)
}
_ = os.MkdirAll(fileDir, 0755)
_ = os.MkdirAll(fileDir, constant.DirPerm)
}
filePath := filepath.Join(fileDir, filename)
@@ -739,21 +757,21 @@ func (b *BaseApi) UploadChunkFiles(c *gin.Context) {
emptyFile, err = os.Create(filePath)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrBadRequest, constant.ErrTypeInvalidParams, err)
helper.BadRequest(c, err)
return
}
defer emptyFile.Close()
chunkData, err = io.ReadAll(uploadFile)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, buserr.WithMap(constant.ErrFileUpload, map[string]interface{}{"name": filename, "detail": err.Error()}, err))
helper.InternalServer(c, buserr.WithMap("ErrFileUpload", map[string]interface{}{"name": filename, "detail": err.Error()}, err))
return
}
chunkPath := filepath.Join(fileDir, fmt.Sprintf("%s.%d", filename, chunkIndex))
err = os.WriteFile(chunkPath, chunkData, 0644)
err = os.WriteFile(chunkPath, chunkData, constant.DirPerm)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, buserr.WithMap(constant.ErrFileUpload, map[string]interface{}{"name": filename, "detail": err.Error()}, err))
helper.InternalServer(c, buserr.WithMap("ErrFileUpload", map[string]interface{}{"name": filename, "detail": err.Error()}, err))
return
}
@@ -764,7 +782,7 @@ func (b *BaseApi) UploadChunkFiles(c *gin.Context) {
}
err = mergeChunks(filename, fileDir, c.PostForm("path"), chunkCount, overwrite)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, buserr.WithMap(constant.ErrFileUpload, map[string]interface{}{"name": filename, "detail": err.Error()}, err))
helper.InternalServer(c, buserr.WithMap("ErrFileUpload", map[string]interface{}{"name": filename, "detail": err.Error()}, err))
return
}
helper.SuccessWithData(c, true)
@@ -779,7 +797,7 @@ var wsUpgrade = websocket.Upgrader{
},
}
func (b *BaseApi) Ws(c *gin.Context) {
func (b *BaseApi) WgetProcess(c *gin.Context) {
ws, err := wsUpgrade.Upgrade(c.Writer, c.Request, nil)
if err != nil {
return
@@ -789,14 +807,20 @@ func (b *BaseApi) Ws(c *gin.Context) {
go wsClient.Write()
}
func (b *BaseApi) Keys(c *gin.Context) {
func (b *BaseApi) ProcessKeys(c *gin.Context) {
res := &response.FileProcessKeys{}
keys, err := global.CACHE.PrefixScanKey("file-wget-")
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
return
keys := global.CACHE.PrefixScanKey("file-wget-")
for _, key := range keys {
value := global.CACHE.Get(key)
if value == "" {
continue
}
var process files.Process
if err := json.Unmarshal([]byte(value), &process); err != nil {
continue
}
res.Keys = append(res.Keys, key)
}
res.Keys = keys
helper.SuccessWithData(c, res)
}
@@ -814,7 +838,7 @@ func (b *BaseApi) ReadFileByLine(c *gin.Context) {
}
res, err := fileService.ReadLogByLine(req)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, res)
@@ -835,7 +859,45 @@ func (b *BaseApi) BatchChangeModeAndOwner(c *gin.Context) {
return
}
if err := fileService.BatchChangeModeAndOwner(req); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
}
helper.SuccessWithOutData(c)
helper.Success(c)
}
func (b *BaseApi) GetPathByType(c *gin.Context) {
pathType, ok := c.Params.Get("type")
if !ok {
helper.BadRequest(c, errors.New("error pathType id in path"))
return
}
resPath := fileService.GetPathByType(pathType)
helper.SuccessWithData(c, resPath)
}
// @Tags File
// @Summary system mount
// @Accept json
// @Success 200 {object} dto.DiskInfo
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /mount [post]
func (b *BaseApi) GetHostMount(c *gin.Context) {
disks := fileService.GetHostMount()
helper.SuccessWithData(c, disks)
}
// @Tags File
// @Summary system user and group
// @Accept json
// @Success 200 {object} response.UserGroupResponse
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /user/group [post]
func (b *BaseApi) GetUsersAndGroups(c *gin.Context) {
res, err := fileService.GetUsersAndGroups()
if err != nil {
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, res)
}
@@ -1,9 +1,8 @@
package v1
package v2
import (
"github.com/1Panel-dev/1Panel/backend/app/api/v1/helper"
"github.com/1Panel-dev/1Panel/backend/app/dto"
"github.com/1Panel-dev/1Panel/backend/constant"
"github.com/1Panel-dev/1Panel/agent/app/api/v2/helper"
"github.com/1Panel-dev/1Panel/agent/app/dto"
"github.com/gin-gonic/gin"
)
@@ -16,7 +15,7 @@ import (
func (b *BaseApi) LoadFirewallBaseInfo(c *gin.Context) {
data, err := firewallService.LoadBaseInfo()
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
@@ -39,7 +38,7 @@ func (b *BaseApi) SearchFirewallRule(c *gin.Context) {
total, list, err := firewallService.SearchWithPage(req)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
@@ -50,7 +49,7 @@ func (b *BaseApi) SearchFirewallRule(c *gin.Context) {
}
// @Tags Firewall
// @Summary Page firewall status
// @Summary Operate firewall
// @Accept json
// @Param request body dto.FirewallOperation true "request"
// @Success 200
@@ -65,15 +64,15 @@ func (b *BaseApi) OperateFirewall(c *gin.Context) {
}
if err := firewallService.OperateFirewall(req.Operation); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, nil)
helper.Success(c)
}
// @Tags Firewall
// @Summary Create firewall port group
// @Summary Create group
// @Accept json
// @Param request body dto.PortRuleOperate true "request"
// @Success 200
@@ -88,15 +87,15 @@ func (b *BaseApi) OperatePortRule(c *gin.Context) {
}
if err := firewallService.OperatePortRule(req, true); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, nil)
helper.Success(c)
}
// OperateForwardRule
// @Tags Firewall
// @Summary Update firewall port group
// @Summary Create group
// @Accept json
// @Param request body dto.ForwardRuleOperate true "request"
// @Success 200
@@ -111,14 +110,14 @@ func (b *BaseApi) OperateForwardRule(c *gin.Context) {
}
if err := firewallService.OperateForwardRule(req); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, nil)
helper.Success(c)
}
// @Tags Firewall
// @Summary Create firewall group
// @Summary Create group
// @Accept json
// @Param request body dto.AddrRuleOperate true "request"
// @Success 200
@@ -133,14 +132,14 @@ func (b *BaseApi) OperateIPRule(c *gin.Context) {
}
if err := firewallService.OperateAddressRule(req, true); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, nil)
helper.Success(c)
}
// @Tags Firewall
// @Summary Batch create group
// @Summary Create group
// @Accept json
// @Param request body dto.BatchRuleOperate true "request"
// @Success 200
@@ -154,10 +153,10 @@ func (b *BaseApi) BatchOperateRule(c *gin.Context) {
}
if err := firewallService.BatchOperateRule(req); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, nil)
helper.Success(c)
}
// @Tags Firewall
@@ -175,14 +174,14 @@ func (b *BaseApi) UpdateFirewallDescription(c *gin.Context) {
}
if err := firewallService.UpdateDescription(req); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, nil)
helper.Success(c)
}
// @Tags Firewall
// @Summary Update firewall group
// @Summary Create group
// @Accept json
// @Param request body dto.PortRuleUpdate true "request"
// @Success 200
@@ -196,14 +195,14 @@ func (b *BaseApi) UpdatePortRule(c *gin.Context) {
}
if err := firewallService.UpdatePortRule(req); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, nil)
helper.Success(c)
}
// @Tags Firewall
// @Summary Update address group
// @Summary Create group
// @Accept json
// @Param request body dto.AddrRuleUpdate true "request"
// @Success 200
@@ -217,8 +216,8 @@ func (b *BaseApi) UpdateAddrRule(c *gin.Context) {
}
if err := firewallService.UpdateAddrRule(req); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, nil)
helper.Success(c)
}
@@ -1,11 +1,10 @@
package v1
package v2
import (
"encoding/base64"
"github.com/1Panel-dev/1Panel/backend/app/api/v1/helper"
"github.com/1Panel-dev/1Panel/backend/app/dto"
"github.com/1Panel-dev/1Panel/backend/constant"
"github.com/1Panel-dev/1Panel/agent/app/api/v2/helper"
"github.com/1Panel-dev/1Panel/agent/app/dto"
"github.com/gin-gonic/gin"
)
@@ -18,7 +17,7 @@ import (
func (b *BaseApi) LoadFtpBaseInfo(c *gin.Context) {
data, err := ftpService.LoadBaseInfo()
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
@@ -41,7 +40,7 @@ func (b *BaseApi) LoadFtpLogInfo(c *gin.Context) {
total, list, err := ftpService.LoadLog(req)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
@@ -55,7 +54,6 @@ func (b *BaseApi) LoadFtpLogInfo(c *gin.Context) {
// @Summary Operate FTP
// @Accept json
// @Param request body dto.Operate true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /toolbox/ftp/operate [post]
@@ -67,11 +65,11 @@ func (b *BaseApi) OperateFtp(c *gin.Context) {
}
if err := ftpService.Operate(req.Operation); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, nil)
helper.Success(c)
}
// @Tags FTP
@@ -90,7 +88,7 @@ func (b *BaseApi) SearchFtp(c *gin.Context) {
total, list, err := ftpService.SearchWithPage(req)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
@@ -118,16 +116,16 @@ func (b *BaseApi) CreateFtp(c *gin.Context) {
if len(req.Password) != 0 {
pass, err := base64.StdEncoding.DecodeString(req.Password)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrBadRequest, constant.ErrTypeInvalidParams, err)
helper.BadRequest(c, err)
return
}
req.Password = string(pass)
}
if _, err := ftpService.Create(req); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithOutData(c)
helper.Success(c)
}
// @Tags FTP
@@ -146,10 +144,10 @@ func (b *BaseApi) DeleteFtp(c *gin.Context) {
}
if err := ftpService.Delete(req); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithOutData(c)
helper.Success(c)
}
// @Tags FTP
@@ -163,10 +161,10 @@ func (b *BaseApi) DeleteFtp(c *gin.Context) {
// @x-panel-log {"bodyKeys":[],"paramKeys":[],"BeforeFunctions":[],"formatZH":"同步 FTP 账户","formatEN":"sync FTP users"}
func (b *BaseApi) SyncFtp(c *gin.Context) {
if err := ftpService.Sync(); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithOutData(c)
helper.Success(c)
}
// @Tags FTP
@@ -187,14 +185,14 @@ func (b *BaseApi) UpdateFtp(c *gin.Context) {
if len(req.Password) != 0 {
pass, err := base64.StdEncoding.DecodeString(req.Password)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrBadRequest, constant.ErrTypeInvalidParams, err)
helper.BadRequest(c, err)
return
}
req.Password = string(pass)
}
if err := ftpService.Update(req); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithOutData(c)
helper.Success(c)
}
@@ -1,20 +1,19 @@
package v1
package v2
import (
"github.com/1Panel-dev/1Panel/backend/app/api/v1/helper"
"github.com/1Panel-dev/1Panel/backend/app/dto"
"github.com/1Panel-dev/1Panel/backend/constant"
"github.com/1Panel-dev/1Panel/agent/app/api/v2/helper"
"github.com/1Panel-dev/1Panel/agent/app/dto"
"github.com/gin-gonic/gin"
)
// @Tags System Group
// @Summary Create system group
// @Summary Create group
// @Accept json
// @Param request body dto.GroupCreate true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /groups [post]
// @Router /agent/groups [post]
// @x-panel-log {"bodyKeys":["name","type"],"paramKeys":[],"BeforeFunctions":[],"formatZH":"创建组 [name][type]","formatEN":"create group [name][type]"}
func (b *BaseApi) CreateGroup(c *gin.Context) {
var req dto.GroupCreate
@@ -23,20 +22,20 @@ func (b *BaseApi) CreateGroup(c *gin.Context) {
}
if err := groupService.Create(req); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, nil)
helper.Success(c)
}
// @Tags System Group
// @Summary Delete system group
// @Summary Delete group
// @Accept json
// @Param request body dto.OperateByID true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /groups/del [post]
// @Router /agent/groups/del [post]
// @x-panel-log {"bodyKeys":["id"],"paramKeys":[],"BeforeFunctions":[{"input_column":"id","input_value":"id","isList":false,"db":"groups","output_column":"name","output_value":"name"},{"input_column":"id","input_value":"id","isList":false,"db":"groups","output_column":"type","output_value":"type"}],"formatZH":"删除组 [type][name]","formatEN":"delete group [type][name]"}
func (b *BaseApi) DeleteGroup(c *gin.Context) {
var req dto.OperateByID
@@ -45,20 +44,20 @@ func (b *BaseApi) DeleteGroup(c *gin.Context) {
}
if err := groupService.Delete(req.ID); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, nil)
helper.Success(c)
}
// @Tags System Group
// @Summary Update system group
// @Summary Update group
// @Accept json
// @Param request body dto.GroupUpdate true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /groups/update [post]
// @Router /agent/groups/update [post]
// @x-panel-log {"bodyKeys":["name","type"],"paramKeys":[],"BeforeFunctions":[],"formatZH":"更新组 [name][type]","formatEN":"update group [name][type]"}
func (b *BaseApi) UpdateGroup(c *gin.Context) {
var req dto.GroupUpdate
@@ -67,29 +66,29 @@ func (b *BaseApi) UpdateGroup(c *gin.Context) {
}
if err := groupService.Update(req); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, nil)
helper.Success(c)
}
// @Tags System Group
// @Summary List system groups
// @Summary List groups
// @Accept json
// @Param request body dto.GroupSearch true "request"
// @Success 200 {array} dto.GroupInfo
// @Success 200 {array} dto.OperateByType
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /groups/search [post]
// @Router /agent/groups/search [post]
func (b *BaseApi) ListGroup(c *gin.Context) {
var req dto.GroupSearch
var req dto.OperateByType
if err := helper.CheckBindAndValidate(&req, c); err != nil {
return
}
list, err := groupService.List(req)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
+10
View File
@@ -0,0 +1,10 @@
package v2
import (
"github.com/1Panel-dev/1Panel/agent/app/api/v2/helper"
"github.com/gin-gonic/gin"
)
func (b *BaseApi) CheckHealth(c *gin.Context) {
helper.Success(c)
}
+122
View File
@@ -0,0 +1,122 @@
package helper
import (
"context"
"fmt"
"net/http"
"strconv"
"github.com/1Panel-dev/1Panel/agent/global"
"gorm.io/gorm"
"github.com/1Panel-dev/1Panel/agent/app/dto"
"github.com/1Panel-dev/1Panel/agent/constant"
"github.com/1Panel-dev/1Panel/agent/i18n"
"github.com/gin-gonic/gin"
"github.com/pkg/errors"
)
func ErrorWithDetail(ctx *gin.Context, code int, msgKey string, err error) {
res := dto.Response{
Code: code,
Message: "",
}
res.Message = i18n.GetMsgWithDetail(msgKey, err.Error())
ctx.JSON(http.StatusOK, res)
ctx.Abort()
}
func InternalServer(ctx *gin.Context, err error) {
ErrorWithDetail(ctx, http.StatusInternalServerError, "ErrInternalServer", err)
}
func BadRequest(ctx *gin.Context, err error) {
ErrorWithDetail(ctx, http.StatusBadRequest, "ErrInvalidParams", err)
}
func SuccessWithData(ctx *gin.Context, data interface{}) {
if data == nil {
data = gin.H{}
}
res := dto.Response{
Code: http.StatusOK,
Data: data,
}
ctx.JSON(http.StatusOK, res)
ctx.Abort()
}
func Success(ctx *gin.Context) {
res := dto.Response{
Code: http.StatusOK,
Message: "success",
}
ctx.JSON(http.StatusOK, res)
ctx.Abort()
}
func SuccessWithMsg(ctx *gin.Context, msg string) {
res := dto.Response{
Code: http.StatusOK,
Message: msg,
}
ctx.JSON(http.StatusOK, res)
ctx.Abort()
}
func GetParamID(c *gin.Context) (uint, error) {
idParam, ok := c.Params.Get("id")
if !ok {
return 0, errors.New("error id in path")
}
intNum, _ := strconv.Atoi(idParam)
return uint(intNum), nil
}
func GetIntParamByKey(c *gin.Context, key string) (uint, error) {
idParam, ok := c.Params.Get(key)
if !ok {
return 0, fmt.Errorf("error %s in path", key)
}
intNum, _ := strconv.Atoi(idParam)
return uint(intNum), nil
}
func GetStrParamByKey(c *gin.Context, key string) (string, error) {
idParam, ok := c.Params.Get(key)
if !ok {
return "", fmt.Errorf("error %s in path", key)
}
return idParam, nil
}
func GetTxAndContext() (tx *gorm.DB, ctx context.Context) {
tx = global.DB.Begin()
ctx = context.WithValue(context.Background(), constant.DB, tx)
return
}
func CheckBindAndValidate(req interface{}, c *gin.Context) error {
if err := c.ShouldBindJSON(req); err != nil {
ErrorWithDetail(c, http.StatusBadRequest, "ErrInvalidParams", err)
return err
}
if err := global.VALID.Struct(req); err != nil {
ErrorWithDetail(c, http.StatusBadRequest, "ErrInvalidParams", err)
return err
}
return nil
}
func CheckBind(req interface{}, c *gin.Context) error {
if err := c.ShouldBindJSON(&req); err != nil {
ErrorWithDetail(c, http.StatusBadRequest, "ErrInvalidParams", err)
return err
}
return nil
}
func ErrResponse(ctx *gin.Context, code int) {
ctx.JSON(code, nil)
ctx.Abort()
}
@@ -1,9 +1,8 @@
package v1
package v2
import (
"github.com/1Panel-dev/1Panel/backend/app/api/v1/helper"
"github.com/1Panel-dev/1Panel/backend/app/dto/request"
"github.com/1Panel-dev/1Panel/backend/constant"
"github.com/1Panel-dev/1Panel/agent/app/api/v2/helper"
"github.com/1Panel-dev/1Panel/agent/app/dto/request"
"github.com/gin-gonic/gin"
)
@@ -14,7 +13,7 @@ import (
// @Success 200 {object} response.HostToolRes
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /host/tool [post]
// @Router /hosts/tool [post]
func (b *BaseApi) GetToolStatus(c *gin.Context) {
var req request.HostToolReq
if err := helper.CheckBindAndValidate(&req, c); err != nil {
@@ -23,7 +22,7 @@ func (b *BaseApi) GetToolStatus(c *gin.Context) {
config, err := hostToolService.GetToolStatus(req)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, config)
@@ -36,7 +35,7 @@ func (b *BaseApi) GetToolStatus(c *gin.Context) {
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /host/tool/create [post]
// @Router /hosts/tool/create [post]
// @x-panel-log {"bodyKeys":["type"],"paramKeys":[],"BeforeFunctions":[],"formatZH":"创建 [type] 配置","formatEN":"create [type] config"}
func (b *BaseApi) InitToolConfig(c *gin.Context) {
var req request.HostToolCreate
@@ -45,10 +44,10 @@ func (b *BaseApi) InitToolConfig(c *gin.Context) {
}
if err := hostToolService.CreateToolConfig(req); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithOutData(c)
helper.Success(c)
}
// @Tags Host tool
@@ -58,7 +57,7 @@ func (b *BaseApi) InitToolConfig(c *gin.Context) {
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /host/tool/operate [post]
// @Router /hosts/tool/operate [post]
// @x-panel-log {"bodyKeys":["operate","type"],"paramKeys":[],"BeforeFunctions":[],"formatZH":"[operate] [type] ","formatEN":"[operate] [type]"}
func (b *BaseApi) OperateTool(c *gin.Context) {
var req request.HostToolReq
@@ -67,10 +66,10 @@ func (b *BaseApi) OperateTool(c *gin.Context) {
}
err := hostToolService.OperateTool(req)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithOutData(c)
helper.Success(c)
}
// @Tags Host tool
@@ -80,7 +79,7 @@ func (b *BaseApi) OperateTool(c *gin.Context) {
// @Success 200 {object} response.HostToolConfig
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /host/tool/config [post]
// @Router /hosts/tool/config [post]
// @x-panel-log {"bodyKeys":["operate"],"paramKeys":[],"BeforeFunctions":[],"formatZH":"[operate] 主机工具配置文件 ","formatEN":"[operate] tool config"}
func (b *BaseApi) OperateToolConfig(c *gin.Context) {
var req request.HostToolConfig
@@ -90,7 +89,7 @@ func (b *BaseApi) OperateToolConfig(c *gin.Context) {
config, err := hostToolService.OperateToolConfig(req)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, config)
@@ -103,7 +102,7 @@ func (b *BaseApi) OperateToolConfig(c *gin.Context) {
// @Success 200 {string} logContent
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /host/tool/log [post]
// @Router /hosts/tool/log [post]
func (b *BaseApi) GetToolLog(c *gin.Context) {
var req request.HostToolLogReq
if err := helper.CheckBindAndValidate(&req, c); err != nil {
@@ -112,7 +111,7 @@ func (b *BaseApi) GetToolLog(c *gin.Context) {
logContent, err := hostToolService.GetToolLog(req)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, logContent)
@@ -125,7 +124,7 @@ func (b *BaseApi) GetToolLog(c *gin.Context) {
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /host/tool/supervisor/process [post]
// @Router /hosts/tool/supervisor/process [post]
// @x-panel-log {"bodyKeys":["operate"],"paramKeys":[],"BeforeFunctions":[],"formatZH":"[operate] 守护进程 ","formatEN":"[operate] process"}
func (b *BaseApi) OperateProcess(c *gin.Context) {
var req request.SupervisorProcessConfig
@@ -135,10 +134,10 @@ func (b *BaseApi) OperateProcess(c *gin.Context) {
err := hostToolService.OperateSupervisorProcess(req)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithOutData(c)
helper.Success(c)
}
// @Tags Host tool
@@ -147,24 +146,24 @@ func (b *BaseApi) OperateProcess(c *gin.Context) {
// @Success 200 {object} response.SupervisorProcessConfig
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /host/tool/supervisor/process [get]
// @Router /hosts/tool/supervisor/process [get]
func (b *BaseApi) GetProcess(c *gin.Context) {
configs, err := hostToolService.GetSupervisorProcessConfig()
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, configs)
}
// @Tags Host tool
// @Summary Get Supervisor process config
// @Summary Get Supervisor process config file
// @Accept json
// @Param request body request.SupervisorProcessFileReq true "request"
// @Success 200 {string} content
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /host/tool/supervisor/process/file [post]
// @Router /hosts/tool/supervisor/process/file [post]
// @x-panel-log {"bodyKeys":["operate"],"paramKeys":[],"BeforeFunctions":[],"formatZH":"[operate] Supervisor 进程文件 ","formatEN":"[operate] Supervisor Process Config file"}
func (b *BaseApi) GetProcessFile(c *gin.Context) {
var req request.SupervisorProcessFileReq
@@ -173,7 +172,7 @@ func (b *BaseApi) GetProcessFile(c *gin.Context) {
}
content, err := hostToolService.OperateSupervisorProcessFile(req)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, content)
@@ -1,9 +1,8 @@
package v1
package v2
import (
"github.com/1Panel-dev/1Panel/backend/app/api/v1/helper"
"github.com/1Panel-dev/1Panel/backend/app/dto"
"github.com/1Panel-dev/1Panel/backend/constant"
"github.com/1Panel-dev/1Panel/agent/app/api/v2/helper"
"github.com/1Panel-dev/1Panel/agent/app/dto"
"github.com/gin-gonic/gin"
)
@@ -24,7 +23,7 @@ func (b *BaseApi) SearchImage(c *gin.Context) {
total, list, err := imageService.Page(req)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
@@ -44,7 +43,7 @@ func (b *BaseApi) SearchImage(c *gin.Context) {
func (b *BaseApi) ListAllImage(c *gin.Context) {
list, err := imageService.ListAll()
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, list)
@@ -60,7 +59,7 @@ func (b *BaseApi) ListAllImage(c *gin.Context) {
func (b *BaseApi) ListImage(c *gin.Context) {
list, err := imageService.List()
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, list)
@@ -81,20 +80,19 @@ func (b *BaseApi) ImageBuild(c *gin.Context) {
return
}
log, err := imageService.ImageBuild(req)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
if err := imageService.ImageBuild(req); err != nil {
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, log)
helper.Success(c)
}
// @Tags Container Image
// @Summary Pull image
// @Accept json
// @Param request body dto.ImagePull true "request"
// @Success 200 {string} logPath
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /containers/image/pull [post]
@@ -105,20 +103,19 @@ func (b *BaseApi) ImagePull(c *gin.Context) {
return
}
logPath, err := imageService.ImagePull(req)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
if err := imageService.ImagePull(req); err != nil {
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, logPath)
helper.Success(c)
}
// @Tags Container Image
// @Summary Push image
// @Accept json
// @Param request body dto.ImagePush true "request"
// @Success 200 {string} logPath
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /containers/image/push [post]
@@ -129,20 +126,19 @@ func (b *BaseApi) ImagePush(c *gin.Context) {
return
}
logPath, err := imageService.ImagePush(req)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
if err := imageService.ImagePush(req); err != nil {
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, logPath)
helper.Success(c)
}
// @Tags Container Image
// @Summary Delete image
// @Accept json
// @Param request body dto.BatchDelete true "request"
// @Success 200
// @Success 200 {object} dto.ContainerPruneReport
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /containers/image/remove [post]
@@ -153,12 +149,13 @@ func (b *BaseApi) ImageRemove(c *gin.Context) {
return
}
if err := imageService.ImageRemove(req); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
data, err := imageService.ImageRemove(req)
if err != nil {
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, nil)
helper.SuccessWithData(c, data)
}
// @Tags Container Image
@@ -177,11 +174,11 @@ func (b *BaseApi) ImageSave(c *gin.Context) {
}
if err := imageService.ImageSave(req); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, nil)
helper.Success(c)
}
// @Tags Container Image
@@ -200,11 +197,11 @@ func (b *BaseApi) ImageTag(c *gin.Context) {
}
if err := imageService.ImageTag(req); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, nil)
helper.Success(c)
}
// @Tags Container Image
@@ -223,9 +220,9 @@ func (b *BaseApi) ImageLoad(c *gin.Context) {
}
if err := imageService.ImageLoad(req); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, nil)
helper.Success(c)
}
@@ -1,9 +1,8 @@
package v1
package v2
import (
"github.com/1Panel-dev/1Panel/backend/app/api/v1/helper"
"github.com/1Panel-dev/1Panel/backend/app/dto"
"github.com/1Panel-dev/1Panel/backend/constant"
"github.com/1Panel-dev/1Panel/agent/app/api/v2/helper"
"github.com/1Panel-dev/1Panel/agent/app/dto"
"github.com/gin-gonic/gin"
)
@@ -24,7 +23,7 @@ func (b *BaseApi) SearchRepo(c *gin.Context) {
total, list, err := imageRepoService.Page(req)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
@@ -44,7 +43,7 @@ func (b *BaseApi) SearchRepo(c *gin.Context) {
func (b *BaseApi) ListRepo(c *gin.Context) {
list, err := imageRepoService.List()
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
@@ -67,10 +66,10 @@ func (b *BaseApi) CheckRepoStatus(c *gin.Context) {
}
if err := imageRepoService.Login(req); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, nil)
helper.Success(c)
}
// @Tags Container Image-repo
@@ -90,33 +89,33 @@ func (b *BaseApi) CreateRepo(c *gin.Context) {
}
if err := imageRepoService.Create(req); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, nil)
helper.Success(c)
}
// @Tags Container Image-repo
// @Summary Delete image repo
// @Accept json
// @Param request body dto.ImageRepoDelete true "request"
// @Param request body dto.OperateByID true "request"
// @Produce json
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /containers/repo/del [post]
// @x-panel-log {"bodyKeys":["ids"],"paramKeys":[],"BeforeFunctions":[{"input_column":"id","input_value":"ids","isList":true,"db":"image_repos","output_column":"name","output_value":"names"}],"formatZH":"删除镜像仓库 [names]","formatEN":"delete image repo [names]"}
// @x-panel-log {"bodyKeys":["id"],"paramKeys":[],"BeforeFunctions":[{"input_column":"id","input_value":"id","isList":false,"db":"image_repos","output_column":"name","output_value":"name"}],"formatZH":"删除镜像仓库 [name]","formatEN":"delete image repo [name]"}
func (b *BaseApi) DeleteRepo(c *gin.Context) {
var req dto.ImageRepoDelete
var req dto.OperateByID
if err := helper.CheckBindAndValidate(&req, c); err != nil {
return
}
if err := imageRepoService.BatchDelete(req); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
if err := imageRepoService.Delete(req); err != nil {
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, nil)
helper.Success(c)
}
// @Tags Container Image-repo
@@ -136,8 +135,8 @@ func (b *BaseApi) UpdateRepo(c *gin.Context) {
}
if err := imageRepoService.Update(req); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, nil)
helper.Success(c)
}
+22
View File
@@ -0,0 +1,22 @@
package v2
import (
"github.com/1Panel-dev/1Panel/agent/app/api/v2/helper"
"github.com/gin-gonic/gin"
)
// @Tags Logs
// @Summary Load system log files
// @Success 200 {array} string
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /logs/system/files [get]
func (b *BaseApi) GetSystemFiles(c *gin.Context) {
data, err := logService.ListSystemLogFile()
if err != nil {
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, data)
}
+166
View File
@@ -0,0 +1,166 @@
package v2
import (
"github.com/1Panel-dev/1Panel/agent/app/api/v2/helper"
"github.com/1Panel-dev/1Panel/agent/app/dto/request"
"github.com/gin-gonic/gin"
)
// @Tags McpServer
// @Summary List mcp servers
// @Accept json
// @Param request body request.McpServerSearch true "request"
// @Success 200 {object} response.McpServersRes
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /mcp/search [post]
func (b *BaseApi) PageMcpServers(c *gin.Context) {
var req request.McpServerSearch
if err := helper.CheckBindAndValidate(&req, c); err != nil {
return
}
list := mcpServerService.Page(req)
helper.SuccessWithData(c, list)
}
// @Tags McpServer
// @Summary Create mcp server
// @Accept json
// @Param request body request.McpServerCreate true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /mcp/server [post]
func (b *BaseApi) CreateMcpServer(c *gin.Context) {
var req request.McpServerCreate
if err := helper.CheckBindAndValidate(&req, c); err != nil {
return
}
err := mcpServerService.Create(req)
if err != nil {
helper.InternalServer(c, err)
return
}
helper.Success(c)
}
// @Tags McpServer
// @Summary Update mcp server
// @Accept json
// @Param request body request.McpServerUpdate true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /mcp/server/update [post]
func (b *BaseApi) UpdateMcpServer(c *gin.Context) {
var req request.McpServerUpdate
if err := helper.CheckBindAndValidate(&req, c); err != nil {
return
}
err := mcpServerService.Update(req)
if err != nil {
helper.InternalServer(c, err)
return
}
helper.Success(c)
}
// @Tags McpServer
// @Summary Delete mcp server
// @Accept json
// @Param request body request.McpServerDelete true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /mcp/server/del [post]
func (b *BaseApi) DeleteMcpServer(c *gin.Context) {
var req request.McpServerDelete
if err := helper.CheckBindAndValidate(&req, c); err != nil {
return
}
err := mcpServerService.Delete(req.ID)
if err != nil {
helper.InternalServer(c, err)
return
}
helper.Success(c)
}
// @Tags McpServer
// @Summary Operate mcp server
// @Accept json
// @Param request body request.McpServerOperate true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /mcp/server/op [post]
func (b *BaseApi) OperateMcpServer(c *gin.Context) {
var req request.McpServerOperate
if err := helper.CheckBindAndValidate(&req, c); err != nil {
return
}
err := mcpServerService.Operate(req)
if err != nil {
helper.InternalServer(c, err)
return
}
helper.Success(c)
}
// @Tags McpServer
// @Summary Bind Domain for mcp server
// @Accept json
// @Param request body request.McpBindDomain true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /mcp/domain/bind [post]
func (b *BaseApi) BindMcpDomain(c *gin.Context) {
var req request.McpBindDomain
if err := helper.CheckBindAndValidate(&req, c); err != nil {
return
}
err := mcpServerService.BindDomain(req)
if err != nil {
helper.InternalServer(c, err)
return
}
helper.Success(c)
}
// @Tags McpServer
// @Summary Update bind Domain for mcp server
// @Accept json
// @Param request body request.McpBindDomainUpdate true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /mcp/domain/update [post]
func (b *BaseApi) UpdateMcpBindDomain(c *gin.Context) {
var req request.McpBindDomainUpdate
if err := helper.CheckBindAndValidate(&req, c); err != nil {
return
}
err := mcpServerService.UpdateBindDomain(req)
if err != nil {
helper.InternalServer(c, err)
return
}
helper.Success(c)
}
// @Tags McpServer
// @Summary Get bin Domain for mcp server
// @Accept json
// @Success 200 {object} response.McpBindDomainRes
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /mcp/domain/get [get]
func (b *BaseApi) GetMcpBindDomain(c *gin.Context) {
res, err := mcpServerService.GetBindDomain()
if err != nil {
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, res)
}
+107
View File
@@ -0,0 +1,107 @@
package v2
import (
"sort"
"github.com/1Panel-dev/1Panel/agent/app/api/v2/helper"
"github.com/1Panel-dev/1Panel/agent/app/dto"
"github.com/gin-gonic/gin"
"github.com/shirou/gopsutil/v3/disk"
"github.com/shirou/gopsutil/v3/net"
)
// @Tags Monitor
// @Summary Load monitor data
// @Param request body dto.MonitorSearch true "request"
// @Success 200 {array} dto.MonitorData
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /hosts/monitor/search [post]
func (b *BaseApi) LoadMonitor(c *gin.Context) {
var req dto.MonitorSearch
if err := helper.CheckBindAndValidate(&req, c); err != nil {
return
}
data, err := monitorService.LoadMonitorData(req)
if err != nil {
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, data)
}
// @Tags Monitor
// @Summary Clean monitor data
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /hosts/monitor/clean [post]
// @x-panel-log {"bodyKeys":[],"paramKeys":[],"BeforeFunctions":[],"formatZH":"清空监控数据","formatEN":"clean monitor datas"}
func (b *BaseApi) CleanMonitor(c *gin.Context) {
if err := monitorService.CleanData(); err != nil {
helper.InternalServer(c, err)
return
}
helper.Success(c)
}
// @Tags Monitor
// @Summary Load monitor setting
// @Success 200 {object} dto.MonitorSetting
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /hosts/monitor/setting [get]
func (b *BaseApi) LoadMonitorSetting(c *gin.Context) {
setting, err := monitorService.LoadSetting()
if err != nil {
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, setting)
}
// @Tags Monitor
// @Summary Update monitor setting
// @Param request body dto.MonitorSettingUpdate true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /hosts/monitor/setting/update [post]
// @x-panel-log {"bodyKeys":["key", "value"],"paramKeys":[],"BeforeFunctions":[],"formatZH":"修改默认监控网卡 [name]-[value]","formatEN":"update default monitor [name]-[value]"}
func (b *BaseApi) UpdateMonitorSetting(c *gin.Context) {
var req dto.MonitorSettingUpdate
if err := helper.CheckBindAndValidate(&req, c); err != nil {
return
}
if err := monitorService.UpdateSetting(req.Key, req.Value); err != nil {
helper.InternalServer(c, err)
return
}
helper.Success(c)
}
func (b *BaseApi) GetNetworkOptions(c *gin.Context) {
netStat, _ := net.IOCounters(true)
var options []string
options = append(options, "all")
for _, net := range netStat {
options = append(options, net.Name)
}
sort.Strings(options)
helper.SuccessWithData(c, options)
}
func (b *BaseApi) GetIOOptions(c *gin.Context) {
diskStat, _ := disk.IOCounters()
var options []string
options = append(options, "all")
for _, net := range diskStat {
options = append(options, net.Name)
}
sort.Strings(options)
helper.SuccessWithData(c, options)
}
@@ -1,9 +1,8 @@
package v1
package v2
import (
"github.com/1Panel-dev/1Panel/backend/app/api/v1/helper"
"github.com/1Panel-dev/1Panel/backend/app/dto/request"
"github.com/1Panel-dev/1Panel/backend/constant"
"github.com/1Panel-dev/1Panel/agent/app/api/v2/helper"
"github.com/1Panel-dev/1Panel/agent/app/dto/request"
"github.com/gin-gonic/gin"
)
@@ -16,7 +15,7 @@ import (
func (b *BaseApi) GetNginx(c *gin.Context) {
fileInfo, err := nginxService.GetNginxConfig()
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, fileInfo)
@@ -38,7 +37,7 @@ func (b *BaseApi) GetNginxConfigByScope(c *gin.Context) {
params, err := nginxService.GetConfigByScope(req)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, params)
@@ -59,10 +58,10 @@ func (b *BaseApi) UpdateNginxConfigByScope(c *gin.Context) {
return
}
if err := nginxService.UpdateConfigByScope(req); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, nil)
helper.Success(c)
}
// @Tags OpenResty
@@ -74,7 +73,7 @@ func (b *BaseApi) UpdateNginxConfigByScope(c *gin.Context) {
func (b *BaseApi) GetNginxStatus(c *gin.Context) {
res, err := nginxService.GetStatus()
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, res)
@@ -96,23 +95,65 @@ func (b *BaseApi) UpdateNginxFile(c *gin.Context) {
}
if err := nginxService.UpdateConfigFile(req); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, nil)
helper.Success(c)
}
// @Tags OpenResty
// @Summary Clear OpenResty proxy cache
// @Summary Build OpenResty
// @Accept json
// @Param request body request.NginxBuildReq true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /openresty/clear [post]
// @x-panel-log {"bodyKeys":[],"paramKeys":[],"BeforeFunctions":[],"formatZH":"清理 Openresty 代理缓存","formatEN":"Clear nginx proxy cache"}
func (b *BaseApi) ClearNginxProxyCache(c *gin.Context) {
if err := nginxService.ClearProxyCache(); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
// @Router /openresty/build [post]
// @x-panel-log {"bodyKeys":[],"paramKeys":[],"BeforeFunctions":[],"formatZH":"构建 OpenResty","formatEN":"Build OpenResty"}
func (b *BaseApi) BuildNginx(c *gin.Context) {
var req request.NginxBuildReq
if err := helper.CheckBindAndValidate(&req, c); err != nil {
return
}
helper.SuccessWithOutData(c)
if err := nginxService.Build(req); err != nil {
helper.InternalServer(c, err)
return
}
helper.Success(c)
}
// @Tags OpenResty
// @Summary Update OpenResty module
// @Accept json
// @Param request body request.NginxModuleUpdate true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /openresty/module/update [post]
// @x-panel-log {"bodyKeys":[],"paramKeys":[],"BeforeFunctions":[],"formatZH":"更新 OpenResty 模块","formatEN":"Update OpenResty module"}
func (b *BaseApi) UpdateNginxModule(c *gin.Context) {
var req request.NginxModuleUpdate
if err := helper.CheckBindAndValidate(&req, c); err != nil {
return
}
if err := nginxService.UpdateModule(req); err != nil {
helper.InternalServer(c, err)
return
}
helper.Success(c)
}
// @Tags OpenResty
// @Summary Get OpenResty modules
// @Success 200 {object} response.NginxBuildConfig
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /openresty/modules [get]
func (b *BaseApi) GetNginxModules(c *gin.Context) {
modules, err := nginxService.GetModules()
if err != nil {
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, modules)
}
@@ -1,10 +1,9 @@
package v1
package v2
import (
"github.com/1Panel-dev/1Panel/backend/app/api/v1/helper"
"github.com/1Panel-dev/1Panel/backend/app/dto"
"github.com/1Panel-dev/1Panel/backend/app/dto/request"
"github.com/1Panel-dev/1Panel/backend/constant"
"github.com/1Panel-dev/1Panel/agent/app/api/v2/helper"
"github.com/1Panel-dev/1Panel/agent/app/dto"
"github.com/1Panel-dev/1Panel/agent/app/dto/request"
"github.com/gin-gonic/gin"
)
@@ -24,7 +23,7 @@ func (b *BaseApi) PagePHPExtensions(c *gin.Context) {
if req.All {
list, err := phpExtensionsService.List()
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, dto.PageResult{
@@ -34,7 +33,7 @@ func (b *BaseApi) PagePHPExtensions(c *gin.Context) {
} else {
total, list, err := phpExtensionsService.Page(req)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, dto.PageResult{
@@ -59,10 +58,10 @@ func (b *BaseApi) CreatePHPExtensions(c *gin.Context) {
return
}
if err := phpExtensionsService.Create(req); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithOutData(c)
helper.Success(c)
}
// @Tags PHP Extensions
@@ -79,10 +78,10 @@ func (b *BaseApi) UpdatePHPExtensions(c *gin.Context) {
return
}
if err := phpExtensionsService.Update(req); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithOutData(c)
helper.Success(c)
}
// @Tags PHP Extensions
@@ -99,8 +98,8 @@ func (b *BaseApi) DeletePHPExtensions(c *gin.Context) {
return
}
if err := phpExtensionsService.Delete(req); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithOutData(c)
helper.Success(c)
}
@@ -1,10 +1,9 @@
package v1
package v2
import (
"github.com/1Panel-dev/1Panel/backend/app/api/v1/helper"
"github.com/1Panel-dev/1Panel/backend/app/dto/request"
"github.com/1Panel-dev/1Panel/backend/constant"
websocket2 "github.com/1Panel-dev/1Panel/backend/utils/websocket"
"github.com/1Panel-dev/1Panel/agent/app/api/v2/helper"
"github.com/1Panel-dev/1Panel/agent/app/dto/request"
websocket2 "github.com/1Panel-dev/1Panel/agent/utils/websocket"
"github.com/gin-gonic/gin"
)
@@ -32,8 +31,8 @@ func (b *BaseApi) StopProcess(c *gin.Context) {
return
}
if err := processService.StopProcess(req); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrBadRequest, constant.ErrTypeInvalidParams, err)
helper.BadRequest(c, err)
return
}
helper.SuccessWithOutData(c)
helper.Success(c)
}
@@ -1,15 +1,14 @@
package v1
package v2
import (
"github.com/1Panel-dev/1Panel/backend/app/api/v1/helper"
"github.com/1Panel-dev/1Panel/backend/app/dto"
"github.com/1Panel-dev/1Panel/backend/app/dto/request"
"github.com/1Panel-dev/1Panel/backend/constant"
"github.com/1Panel-dev/1Panel/agent/app/api/v2/helper"
"github.com/1Panel-dev/1Panel/agent/app/dto"
"github.com/1Panel-dev/1Panel/agent/app/dto/request"
"github.com/gin-gonic/gin"
)
// @Tags File
// @Summary List Recycle Bin files
// @Summary List RecycleBin files
// @Accept json
// @Param request body dto.PageInfo true "request"
// @Success 200 {object} dto.PageResult
@@ -23,7 +22,7 @@ func (b *BaseApi) SearchRecycleBinFile(c *gin.Context) {
}
total, list, err := recycleBinService.Page(req)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, dto.PageResult{
@@ -33,7 +32,7 @@ func (b *BaseApi) SearchRecycleBinFile(c *gin.Context) {
}
// @Tags File
// @Summary Reduce Recycle Bin files
// @Summary Reduce RecycleBin files
// @Accept json
// @Param request body request.RecycleBinReduce true "request"
// @Success 200
@@ -47,14 +46,14 @@ func (b *BaseApi) ReduceRecycleBinFile(c *gin.Context) {
return
}
if err := recycleBinService.Reduce(req); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithOutData(c)
helper.Success(c)
}
// @Tags File
// @Summary Clear Recycle Bin files
// @Summary Clear RecycleBin files
// @Accept json
// @Success 200
// @Security ApiKeyAuth
@@ -63,14 +62,14 @@ func (b *BaseApi) ReduceRecycleBinFile(c *gin.Context) {
// @x-panel-log {"bodyKeys":[],"paramKeys":[],"BeforeFunctions":[],"formatZH":"清空回收站","formatEN":"清空回收站"}
func (b *BaseApi) ClearRecycleBinFile(c *gin.Context) {
if err := recycleBinService.Clear(); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithOutData(c)
helper.Success(c)
}
// @Tags File
// @Summary Get Recycle Bin status
// @Summary Get RecycleBin status
// @Accept json
// @Success 200 {string} content
// @Security ApiKeyAuth
@@ -79,7 +78,7 @@ func (b *BaseApi) ClearRecycleBinFile(c *gin.Context) {
func (b *BaseApi) GetRecycleStatus(c *gin.Context) {
settingInfo, err := settingService.GetSettingInfo()
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, settingInfo.FileRecycleBin)
+557
View File
@@ -0,0 +1,557 @@
package v2
import (
"github.com/1Panel-dev/1Panel/agent/app/api/v2/helper"
"github.com/1Panel-dev/1Panel/agent/app/dto"
"github.com/1Panel-dev/1Panel/agent/app/dto/request"
"github.com/gin-gonic/gin"
)
// @Tags Runtime
// @Summary List runtimes
// @Accept json
// @Param request body request.RuntimeSearch true "request"
// @Success 200 {object} dto.PageResult
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /runtimes/search [post]
func (b *BaseApi) SearchRuntimes(c *gin.Context) {
var req request.RuntimeSearch
if err := helper.CheckBindAndValidate(&req, c); err != nil {
return
}
total, items, err := runtimeService.Page(req)
if err != nil {
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, dto.PageResult{
Total: total,
Items: items,
})
}
// @Tags Runtime
// @Summary Create runtime
// @Accept json
// @Param request body request.RuntimeCreate true "request"
// @Success 200 {object} model.Runtime
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /runtimes [post]
// @x-panel-log {"bodyKeys":["name"],"paramKeys":[],"BeforeFunctions":[],"formatZH":"创建运行环境 [name]","formatEN":"Create runtime [name]"}
func (b *BaseApi) CreateRuntime(c *gin.Context) {
var req request.RuntimeCreate
if err := helper.CheckBindAndValidate(&req, c); err != nil {
return
}
ssl, err := runtimeService.Create(req)
if err != nil {
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, ssl)
}
// @Tags Website
// @Summary Delete runtime
// @Accept json
// @Param request body request.RuntimeDelete true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /runtimes/del [post]
// @x-panel-log {"bodyKeys":["id"],"paramKeys":[],"BeforeFunctions":[],"formatZH":"删除运行环境 [name]","formatEN":"Delete runtime [name]"}
func (b *BaseApi) DeleteRuntime(c *gin.Context) {
var req request.RuntimeDelete
if err := helper.CheckBindAndValidate(&req, c); err != nil {
return
}
err := runtimeService.Delete(req)
if err != nil {
helper.InternalServer(c, err)
return
}
helper.Success(c)
}
// @Tags Website
// @Summary Delete runtime
// @Accept json
// @Success 200 {array} dto.AppResource
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /installed/delete/check/:id [get]
func (b *BaseApi) DeleteRuntimeCheck(c *gin.Context) {
runTimeId, err := helper.GetIntParamByKey(c, "id")
if err != nil {
helper.BadRequest(c, err)
return
}
checkData, err := runtimeService.DeleteCheck(runTimeId)
if err != nil {
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, checkData)
}
// @Tags Runtime
// @Summary Update runtime
// @Accept json
// @Param request body request.RuntimeUpdate true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /runtimes/update [post]
// @x-panel-log {"bodyKeys":["name"],"paramKeys":[],"BeforeFunctions":[],"formatZH":"更新运行环境 [name]","formatEN":"Update runtime [name]"}
func (b *BaseApi) UpdateRuntime(c *gin.Context) {
var req request.RuntimeUpdate
if err := helper.CheckBindAndValidate(&req, c); err != nil {
return
}
if err := runtimeService.Update(req); err != nil {
helper.InternalServer(c, err)
return
}
helper.Success(c)
}
// @Tags Runtime
// @Summary Get runtime
// @Accept json
// @Param id path string true "request"
// @Success 200 {object} response.RuntimeDTO
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /runtimes/:id [get]
func (b *BaseApi) GetRuntime(c *gin.Context) {
id, err := helper.GetIntParamByKey(c, "id")
if err != nil {
helper.BadRequest(c, err)
return
}
res, err := runtimeService.Get(id)
if err != nil {
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, res)
}
// @Tags Runtime
// @Summary Get Node package scripts
// @Accept json
// @Param request body request.NodePackageReq true "request"
// @Success 200 {array} response.PackageScripts
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /runtimes/node/package [post]
func (b *BaseApi) GetNodePackageRunScript(c *gin.Context) {
var req request.NodePackageReq
if err := helper.CheckBindAndValidate(&req, c); err != nil {
return
}
res, err := runtimeService.GetNodePackageRunScript(req)
if err != nil {
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, res)
}
// @Tags Runtime
// @Summary Operate runtime
// @Accept json
// @Param request body request.RuntimeOperate true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /runtimes/operate [post]
// @x-panel-log {"bodyKeys":["id"],"paramKeys":[],"BeforeFunctions":[],"formatZH":"操作运行环境 [name]","formatEN":"Operate runtime [name]"}
func (b *BaseApi) OperateRuntime(c *gin.Context) {
var req request.RuntimeOperate
if err := helper.CheckBindAndValidate(&req, c); err != nil {
return
}
err := runtimeService.OperateRuntime(req)
if err != nil {
helper.InternalServer(c, err)
return
}
helper.Success(c)
}
// @Tags Runtime
// @Summary Get Node modules
// @Accept json
// @Param request body request.NodeModuleReq true "request"
// @Success 200 {array} response.NodeModule
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /runtimes/node/modules [post]
func (b *BaseApi) GetNodeModules(c *gin.Context) {
var req request.NodeModuleReq
if err := helper.CheckBindAndValidate(&req, c); err != nil {
return
}
res, err := runtimeService.GetNodeModules(req)
if err != nil {
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, res)
}
// @Tags Runtime
// @Summary Operate Node modules
// @Accept json
// @Param request body request.NodeModuleReq true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /runtimes/node/modules/operate [post]
func (b *BaseApi) OperateNodeModules(c *gin.Context) {
var req request.NodeModuleOperateReq
if err := helper.CheckBindAndValidate(&req, c); err != nil {
return
}
err := runtimeService.OperateNodeModules(req)
if err != nil {
helper.InternalServer(c, err)
return
}
helper.Success(c)
}
// @Tags Runtime
// @Summary Sync runtime status
// @Accept json
// @Success 200
// @Security ApiKeyAuth
// @Router /runtimes/sync [post]
func (b *BaseApi) SyncStatus(c *gin.Context) {
err := runtimeService.SyncRuntimeStatus()
if err != nil {
helper.InternalServer(c, err)
return
}
helper.Success(c)
}
// @Tags Runtime
// @Summary Get php runtime extension
// @Accept json
// @Param id path string true "request"
// @Success 200 {object} response.PHPExtensionRes
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /runtimes/php/:id/extensions [get]
func (b *BaseApi) GetRuntimeExtension(c *gin.Context) {
id, err := helper.GetIntParamByKey(c, "id")
if err != nil {
helper.BadRequest(c, err)
return
}
res, err := runtimeService.GetPHPExtensions(id)
if err != nil {
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, res)
}
// @Tags Runtime
// @Summary Install php extension
// @Accept json
// @Param request body request.PHPExtensionInstallReq true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /runtimes/php/extensions/install [post]
func (b *BaseApi) InstallPHPExtension(c *gin.Context) {
var req request.PHPExtensionInstallReq
if err := helper.CheckBindAndValidate(&req, c); err != nil {
return
}
err := runtimeService.InstallPHPExtension(req)
if err != nil {
helper.InternalServer(c, err)
return
}
helper.Success(c)
}
// @Tags Runtime
// @Summary UnInstall php extension
// @Accept json
// @Param request body request.PHPExtensionInstallReq true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /runtimes/php/extensions/uninstall [post]
func (b *BaseApi) UnInstallPHPExtension(c *gin.Context) {
var req request.PHPExtensionInstallReq
if err := helper.CheckBindAndValidate(&req, c); err != nil {
return
}
err := runtimeService.UnInstallPHPExtension(req)
if err != nil {
helper.InternalServer(c, err)
return
}
helper.Success(c)
}
// @Tags Runtime
// @Summary Load php runtime conf
// @Accept json
// @Param id path integer true "request"
// @Success 200 {object} response.PHPConfig
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /runtimes/php/config/:id [get]
func (b *BaseApi) GetPHPConfig(c *gin.Context) {
id, err := helper.GetParamID(c)
if err != nil {
helper.BadRequest(c, err)
return
}
data, err := runtimeService.GetPHPConfig(id)
if err != nil {
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, data)
}
// @Tags Runtime
// @Summary Update runtime php conf
// @Accept json
// @Param request body request.PHPConfigUpdate true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /runtimes/php/config [post]
// @x-panel-log {"bodyKeys":["id"],"paramKeys":[],"BeforeFunctions":[{"input_column":"id","input_value":"id","isList":false,"db":"websites","output_column":"primary_domain","output_value":"domain"}],"formatZH":"[domain] PHP 配置修改","formatEN":"[domain] PHP conf update"}
func (b *BaseApi) UpdatePHPConfig(c *gin.Context) {
var req request.PHPConfigUpdate
if err := helper.CheckBindAndValidate(&req, c); err != nil {
return
}
if err := runtimeService.UpdatePHPConfig(req); err != nil {
helper.InternalServer(c, err)
return
}
helper.Success(c)
}
// @Tags Runtime
// @Summary Update php conf file
// @Accept json
// @Param request body request.PHPFileUpdate true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /runtimes/php/update [post]
// @x-panel-log {"bodyKeys":["websiteId"],"paramKeys":[],"BeforeFunctions":[{"input_column":"id","input_value":"websiteId","isList":false,"db":"websites","output_column":"primary_domain","output_value":"domain"}],"formatZH":"php 配置修改 [domain]","formatEN":"Nginx conf update [domain]"}
func (b *BaseApi) UpdatePHPFile(c *gin.Context) {
var req request.PHPFileUpdate
if err := helper.CheckBindAndValidate(&req, c); err != nil {
return
}
if err := runtimeService.UpdatePHPConfigFile(req); err != nil {
helper.InternalServer(c, err)
return
}
helper.Success(c)
}
// @Tags Runtime
// @Summary Get php conf file
// @Accept json
// @Param request body request.PHPFileReq true "request"
// @Success 200 {object} response.FileInfo
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /runtimes/php/file [post]
func (b *BaseApi) GetPHPConfigFile(c *gin.Context) {
var req request.PHPFileReq
if err := helper.CheckBindAndValidate(&req, c); err != nil {
return
}
data, err := runtimeService.GetPHPConfigFile(req)
if err != nil {
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, data)
}
// @Tags Runtime
// @Summary Update fpm config
// @Accept json
// @Param request body request.FPMConfig true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /runtimes/php/fpm/config [post]
func (b *BaseApi) UpdateFPMConfig(c *gin.Context) {
var req request.FPMConfig
if err := helper.CheckBindAndValidate(&req, c); err != nil {
return
}
if err := runtimeService.UpdateFPMConfig(req); err != nil {
helper.InternalServer(c, err)
return
}
helper.Success(c)
}
// @Tags Runtime
// @Summary Get fpm config
// @Accept json
// @Param id path integer true "request"
// @Success 200 {object} request.FPMConfig
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /runtimes/php/fpm/config/:id [get]
func (b *BaseApi) GetFPMConfig(c *gin.Context) {
id, err := helper.GetParamID(c)
if err != nil {
helper.BadRequest(c, err)
return
}
data, err := runtimeService.GetFPMConfig(id)
if err != nil {
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, data)
}
// @Tags Runtime
// @Summary Get supervisor process
// @Accept json
// @Param id path integer true "request"
// @Success 200 {array} response.SupervisorProcessConfig
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /runtimes/supervisor/process/:id [get]
func (b *BaseApi) GetSupervisorProcess(c *gin.Context) {
id, err := helper.GetParamID(c)
if err != nil {
helper.BadRequest(c, err)
return
}
data, err := runtimeService.GetSupervisorProcess(id)
if err != nil {
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, data)
}
// @Tags Runtime
// @Summary Operate supervisor process
// @Accept json
// @Param request body request.PHPSupervisorProcessConfig true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /runtimes/supervisor/process/operate [post]
func (b *BaseApi) OperateSupervisorProcess(c *gin.Context) {
var req request.PHPSupervisorProcessConfig
if err := helper.CheckBindAndValidate(&req, c); err != nil {
return
}
err := runtimeService.OperateSupervisorProcess(req)
if err != nil {
helper.InternalServer(c, err)
return
}
helper.Success(c)
}
// @Tags Runtime
// @Summary Operate supervisor process file
// @Accept json
// @Param request body request.PHPSupervisorProcessFileReq true "request"
// @Success 200 {string} content
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /runtimes/supervisor/process/file/operate [post]
func (b *BaseApi) OperateSupervisorProcessFile(c *gin.Context) {
var req request.PHPSupervisorProcessFileReq
if err := helper.CheckBindAndValidate(&req, c); err != nil {
return
}
res, err := runtimeService.OperateSupervisorProcessFile(req)
if err != nil {
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, res)
}
// @Tags Runtime
// @Summary Update PHP container config
// @Accept json
// @Param request body request.PHPContainerUpdate true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /runtimes/php/container/update [post]
func (b *BaseApi) UpdatePHPContainer(c *gin.Context) {
var req request.PHPContainerConfig
if err := helper.CheckBindAndValidate(&req, c); err != nil {
return
}
if err := runtimeService.UpdatePHPContainer(req); err != nil {
helper.InternalServer(c, err)
return
}
helper.Success(c)
}
// @Tags Runtime
// @Summary Get PHP container config
// @Accept json
// @Param id path integer true "request"
// @Success 200 {object} response.PHPContainerConfig
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /runtimes/php/container/:id [get]
func (b *BaseApi) GetPHPContainerConfig(c *gin.Context) {
id, err := helper.GetParamID(c)
if err != nil {
helper.BadRequest(c, err)
return
}
data, err := runtimeService.GetPHPContainerConfig(id)
if err != nil {
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, data)
}
// @Tags Runtime
// @Summary Update runtime remark
// @Accept json
// @Param request body request.RuntimeRemarkUpdate true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /runtimes/remark [post]
func (b *BaseApi) UpdateRuntimeRemark(c *gin.Context) {
var req request.RuntimeRemark
if err := helper.CheckBindAndValidate(&req, c); err != nil {
return
}
if err := runtimeService.UpdateRemark(req); err != nil {
helper.InternalServer(c, err)
return
}
helper.Success(c)
}
+161
View File
@@ -0,0 +1,161 @@
package v2
import (
"encoding/json"
"os"
"os/user"
"path"
"github.com/1Panel-dev/1Panel/agent/app/api/v2/helper"
"github.com/1Panel-dev/1Panel/agent/app/dto"
"github.com/1Panel-dev/1Panel/agent/global"
"github.com/1Panel-dev/1Panel/agent/utils/ssh"
"github.com/gin-gonic/gin"
"github.com/pkg/errors"
)
// @Tags System Setting
// @Summary Load system setting info
// @Success 200 {object} dto.SettingInfo
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /settings/search [post]
func (b *BaseApi) GetSettingInfo(c *gin.Context) {
setting, err := settingService.GetSettingInfo()
if err != nil {
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, setting)
}
// @Tags System Setting
// @Summary Load system available status
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /settings/search/available [get]
func (b *BaseApi) GetSystemAvailable(c *gin.Context) {
helper.Success(c)
}
// @Tags System Setting
// @Summary Update system setting
// @Accept json
// @Param request body dto.SettingUpdate true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /settings/update [post]
// @x-panel-log {"bodyKeys":["key","value"],"paramKeys":[],"BeforeFunctions":[],"formatZH":"修改系统配置 [key] => [value]","formatEN":"update system setting [key] => [value]"}
func (b *BaseApi) UpdateSetting(c *gin.Context) {
var req dto.SettingUpdate
if err := helper.CheckBindAndValidate(&req, c); err != nil {
return
}
if err := settingService.Update(req.Key, req.Value); err != nil {
helper.InternalServer(c, err)
return
}
helper.Success(c)
}
// @Tags System Setting
// @Summary Load local backup dir
// @Success 200 {string} path
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /settings/basedir [get]
func (b *BaseApi) LoadBaseDir(c *gin.Context) {
helper.SuccessWithData(c, global.Dir.DataDir)
}
func (b *BaseApi) CheckLocalConn(c *gin.Context) {
_, err := loadLocalConn()
helper.SuccessWithData(c, err == nil)
}
// @Tags System Setting
// @Summary Check local conn info
// @Success 200 {bool} isOk
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /settings/ssh/check/info [post]
func (b *BaseApi) CheckLocalConnByInfo(c *gin.Context) {
var req dto.SSHConnData
if err := helper.CheckBindAndValidate(&req, c); err != nil {
return
}
helper.SuccessWithData(c, settingService.TestConnByInfo(req))
}
// @Tags System Setting
// @Summary Save local conn info
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /settings/ssh [post]
func (b *BaseApi) SaveLocalConnInfo(c *gin.Context) {
var req dto.SSHConnData
if err := helper.CheckBindAndValidate(&req, c); err != nil {
return
}
helper.SuccessWithData(c, settingService.SaveConnInfo(req))
}
func loadLocalConn() (*ssh.SSHClient, error) {
itemPath := ""
currentInfo, _ := user.Current()
if len(currentInfo.HomeDir) == 0 {
itemPath = "/root/.ssh/id_ed25519_1panel"
} else {
itemPath = path.Join(currentInfo.HomeDir, ".ssh/id_ed25519_1panel")
}
if _, err := os.Stat(itemPath); err != nil {
_ = sshService.GenerateSSH(dto.GenerateSSH{EncryptionMode: "ed25519", Name: "_1panel"})
}
privateKey, _ := os.ReadFile(itemPath)
connWithKey := ssh.ConnInfo{
Addr: "127.0.0.1",
User: "root",
Port: 22,
AuthMode: "key",
PrivateKey: privateKey,
}
client, err := ssh.NewClient(connWithKey)
if err == nil {
return client, nil
}
connInfoInDB, err := settingService.GetSSHInfo()
if err != nil {
return nil, err
}
if len(connInfoInDB) == 0 {
return nil, errors.New("no such ssh conn info in db!")
}
var connInDB ssh.ConnInfo
if err := json.Unmarshal([]byte(connInfoInDB), &connInDB); err != nil {
return nil, err
}
return ssh.NewClient(connInDB)
}
// @Tags System Setting
// @Summary Load system setting by key
// @Param key path string true "key"
// @Success 200 {object} dto.SettingInfo
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /settings/get/{key} [get]
func (b *BaseApi) GetSettingByKey(c *gin.Context) {
key := c.Param("key")
if len(key) == 0 {
helper.BadRequest(c, errors.New("key is empty"))
return
}
value := settingService.GetSettingByKey(key)
helper.SuccessWithData(c, value)
}
@@ -1,12 +1,26 @@
package v1
package v2
import (
"github.com/1Panel-dev/1Panel/backend/app/api/v1/helper"
"github.com/1Panel-dev/1Panel/backend/app/dto"
"github.com/1Panel-dev/1Panel/backend/constant"
"github.com/1Panel-dev/1Panel/agent/app/api/v2/helper"
"github.com/1Panel-dev/1Panel/agent/app/dto"
"github.com/gin-gonic/gin"
)
// @Tags System Setting
// @Summary Load system snapshot data
// @Success 200 {object} dto.SnapshotData
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /settings/snapshot/load [get]
func (b *BaseApi) LoadSnapshotData(c *gin.Context) {
data, err := snapshotService.LoadSnapshotData()
if err != nil {
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, data)
}
// @Tags System Setting
// @Summary Create system snapshot
// @Accept json
@@ -22,11 +36,33 @@ func (b *BaseApi) CreateSnapshot(c *gin.Context) {
return
}
if err := snapshotService.SnapshotCreate(req); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
if err := snapshotService.SnapshotCreate(nil, req, 0, 0, 0); err != nil {
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, nil)
helper.Success(c)
}
// @Tags System Setting
// @Summary Recreate system snapshot
// @Accept json
// @Param request body dto.OperateByID true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /settings/snapshot/recrete [post]
// @x-panel-log {"bodyKeys":["id"],"paramKeys":[],"BeforeFunctions":[{"input_column":"id","input_value":"id","isList":false,"db":"snapshots","output_column":"name","output_value":"name"}],"formatZH":"重试创建快照 [name]","formatEN":"recrete the snapshot [name]"}
func (b *BaseApi) RecreateSnapshot(c *gin.Context) {
var req dto.OperateByID
if err := helper.CheckBindAndValidate(&req, c); err != nil {
return
}
if err := snapshotService.SnapshotReCreate(req.ID); err != nil {
helper.InternalServer(c, err)
return
}
helper.Success(c)
}
// @Tags System Setting
@@ -45,32 +81,10 @@ func (b *BaseApi) ImportSnapshot(c *gin.Context) {
}
if err := snapshotService.SnapshotImport(req); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, nil)
}
// @Tags System Setting
// @Summary Load Snapshot status
// @Accept json
// @Param request body dto.OperateByID true "request"
// @Success 200 {object} dto.SnapshotStatus
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /settings/snapshot/status [post]
func (b *BaseApi) LoadSnapShotStatus(c *gin.Context) {
var req dto.OperateByID
if err := helper.CheckBindAndValidate(&req, c); err != nil {
return
}
data, err := snapshotService.LoadSnapShotStatus(req.ID)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
return
}
helper.SuccessWithData(c, data)
helper.Success(c)
}
// @Tags System Setting
@@ -89,10 +103,10 @@ func (b *BaseApi) UpdateSnapDescription(c *gin.Context) {
}
if err := snapshotService.UpdateDescription(req); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, nil)
helper.Success(c)
}
// @Tags System Setting
@@ -111,7 +125,7 @@ func (b *BaseApi) SearchSnapshot(c *gin.Context) {
total, accounts, err := snapshotService.SearchWithPage(req)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, dto.PageResult{
@@ -120,28 +134,6 @@ func (b *BaseApi) SearchSnapshot(c *gin.Context) {
})
}
// @Tags System Setting
// @Summary Load system snapshot size
// @Accept json
// @Param request body dto.PageSnapshot true "request"
// @Success 200 {array} dto.SnapshotFile
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /settings/snapshot/size [post]
func (b *BaseApi) LoadSnapshotSize(c *gin.Context) {
var req dto.PageSnapshot
if err := helper.CheckBindAndValidate(&req, c); err != nil {
return
}
data, err := snapshotService.LoadSize(req)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
return
}
helper.SuccessWithData(c, data)
}
// @Tags System Setting
// @Summary Recover system backup
// @Accept json
@@ -158,10 +150,10 @@ func (b *BaseApi) RecoverSnapshot(c *gin.Context) {
}
if err := snapshotService.SnapshotRecover(req); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, nil)
helper.Success(c)
}
// @Tags System Setting
@@ -180,10 +172,10 @@ func (b *BaseApi) RollbackSnapshot(c *gin.Context) {
}
if err := snapshotService.SnapshotRollback(req); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, nil)
helper.Success(c)
}
// @Tags System Setting
@@ -202,8 +194,8 @@ func (b *BaseApi) DeleteSnapshot(c *gin.Context) {
}
if err := snapshotService.Delete(req); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, nil)
helper.Success(c)
}
@@ -1,9 +1,8 @@
package v1
package v2
import (
"github.com/1Panel-dev/1Panel/backend/app/api/v1/helper"
"github.com/1Panel-dev/1Panel/backend/app/dto"
"github.com/1Panel-dev/1Panel/backend/constant"
"github.com/1Panel-dev/1Panel/agent/app/api/v2/helper"
"github.com/1Panel-dev/1Panel/agent/app/dto"
"github.com/gin-gonic/gin"
)
@@ -12,11 +11,11 @@ import (
// @Success 200 {object} dto.SSHInfo
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /host/ssh/search [post]
// @Router /hosts/ssh/search [post]
func (b *BaseApi) GetSSHInfo(c *gin.Context) {
info, err := sshService.GetSSHInfo()
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, info)
@@ -29,7 +28,7 @@ func (b *BaseApi) GetSSHInfo(c *gin.Context) {
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /host/ssh/operate [post]
// @Router /hosts/ssh/operate [post]
// @x-panel-log {"bodyKeys":["operation"],"paramKeys":[],"BeforeFunctions":[],"formatZH":"[operation] SSH ","formatEN":"[operation] SSH"}
func (b *BaseApi) OperateSSH(c *gin.Context) {
var req dto.Operate
@@ -38,10 +37,10 @@ func (b *BaseApi) OperateSSH(c *gin.Context) {
}
if err := sshService.OperateSSH(req.Operation); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, nil)
helper.Success(c)
}
// @Tags SSH
@@ -51,7 +50,7 @@ func (b *BaseApi) OperateSSH(c *gin.Context) {
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /host/ssh/update [post]
// @Router /hosts/ssh/update [post]
// @x-panel-log {"bodyKeys":["key","value"],"paramKeys":[],"BeforeFunctions":[],"formatZH":"修改 SSH 配置 [key] => [value]","formatEN":"update SSH setting [key] => [value]"}
func (b *BaseApi) UpdateSSH(c *gin.Context) {
var req dto.SSHUpdate
@@ -60,10 +59,10 @@ func (b *BaseApi) UpdateSSH(c *gin.Context) {
}
if err := sshService.Update(req); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, nil)
helper.Success(c)
}
// @Tags SSH
@@ -73,7 +72,7 @@ func (b *BaseApi) UpdateSSH(c *gin.Context) {
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /host/conffile/update [post]
// @Router /hosts/conffile/update [post]
// @x-panel-log {"bodyKeys":[],"paramKeys":[],"BeforeFunctions":[],"formatZH":"修改 SSH 配置文件","formatEN":"update SSH conf"}
func (b *BaseApi) UpdateSSHByfile(c *gin.Context) {
var req dto.SSHConf
@@ -82,10 +81,10 @@ func (b *BaseApi) UpdateSSHByfile(c *gin.Context) {
}
if err := sshService.UpdateByFile(req.File); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, nil)
helper.Success(c)
}
// @Tags SSH
@@ -95,7 +94,7 @@ func (b *BaseApi) UpdateSSHByfile(c *gin.Context) {
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /host/ssh/generate [post]
// @Router /hosts/ssh/generate [post]
// @x-panel-log {"bodyKeys":[],"paramKeys":[],"BeforeFunctions":[],"formatZH":"生成 SSH 密钥 ","formatEN":"generate SSH secret"}
func (b *BaseApi) GenerateSSH(c *gin.Context) {
var req dto.GenerateSSH
@@ -104,20 +103,20 @@ func (b *BaseApi) GenerateSSH(c *gin.Context) {
}
if err := sshService.GenerateSSH(req); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, nil)
helper.Success(c)
}
// @Tags SSH
// @Summary Load host SSH secret
// @Accept json
// @Param request body dto.GenerateLoad true "request"
// @Success 200 {string} data
// @Success 200 {string} secret
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /host/ssh/secret [post]
// @Router /hosts/ssh/secret [post]
func (b *BaseApi) LoadSSHSecret(c *gin.Context) {
var req dto.GenerateLoad
if err := helper.CheckBindAndValidate(&req, c); err != nil {
@@ -126,7 +125,7 @@ func (b *BaseApi) LoadSSHSecret(c *gin.Context) {
data, err := sshService.LoadSSHSecret(req.EncryptionMode)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, data)
@@ -139,7 +138,7 @@ func (b *BaseApi) LoadSSHSecret(c *gin.Context) {
// @Success 200 {object} dto.SSHLog
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /host/ssh/log [post]
// @Router /hosts/ssh/log [post]
func (b *BaseApi) LoadSSHLogs(c *gin.Context) {
var req dto.SearchSSHLog
if err := helper.CheckBindAndValidate(&req, c); err != nil {
@@ -148,7 +147,7 @@ func (b *BaseApi) LoadSSHLogs(c *gin.Context) {
data, err := sshService.LoadLog(c, req)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, data)
@@ -156,14 +155,14 @@ func (b *BaseApi) LoadSSHLogs(c *gin.Context) {
// @Tags SSH
// @Summary Load host SSH conf
// @Success 200 {string} data
// @Success 200 {string} conf
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /host/ssh/conf [get]
// @Router /hosts/ssh/conf [get]
func (b *BaseApi) LoadSSHConf(c *gin.Context) {
data, err := sshService.LoadSSHConf()
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, data)
+46
View File
@@ -0,0 +1,46 @@
package v2
import (
"github.com/1Panel-dev/1Panel/agent/app/api/v2/helper"
"github.com/1Panel-dev/1Panel/agent/app/dto"
"github.com/gin-gonic/gin"
)
// @Tags TaskLog
// @Summary Page task logs
// @Accept json
// @Param request body dto.SearchTaskLogReq true "request"
// @Success 200 {object} dto.PageResult
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /logs/tasks/search [post]
func (b *BaseApi) PageTasks(c *gin.Context) {
var req dto.SearchTaskLogReq
if err := helper.CheckBindAndValidate(&req, c); err != nil {
return
}
total, list, err := taskService.Page(req)
if err != nil {
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, dto.PageResult{
Items: list,
Total: total,
})
}
// @Tags TaskLog
// @Summary Get the number of executing tasks
// @Success 200 {object} int64
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /logs/tasks/executing/count [get]
func (b *BaseApi) CountExecutingTasks(c *gin.Context) {
count, err := taskService.CountExecutingTask()
if err != nil {
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, count)
}
@@ -1,4 +1,4 @@
package v1
package v2
import (
"encoding/base64"
@@ -9,18 +9,16 @@ import (
"strings"
"time"
"github.com/1Panel-dev/1Panel/backend/app/dto"
"github.com/1Panel-dev/1Panel/backend/global"
"github.com/1Panel-dev/1Panel/backend/utils/cmd"
"github.com/1Panel-dev/1Panel/backend/utils/copier"
"github.com/1Panel-dev/1Panel/backend/utils/ssh"
"github.com/1Panel-dev/1Panel/backend/utils/terminal"
"github.com/1Panel-dev/1Panel/agent/app/dto"
"github.com/1Panel-dev/1Panel/agent/global"
"github.com/1Panel-dev/1Panel/agent/utils/cmd"
"github.com/1Panel-dev/1Panel/agent/utils/terminal"
"github.com/gin-gonic/gin"
"github.com/gorilla/websocket"
"github.com/pkg/errors"
)
func (b *BaseApi) WsSsh(c *gin.Context) {
func (b *BaseApi) WsSSH(c *gin.Context) {
wsConn, err := upGrader.Upgrade(c.Writer, c.Request, nil)
if err != nil {
global.LOG.Errorf("gin context http handler failed, err: %v", err)
@@ -28,10 +26,12 @@ func (b *BaseApi) WsSsh(c *gin.Context) {
}
defer wsConn.Close()
id, err := strconv.Atoi(c.Query("id"))
if wshandleError(wsConn, errors.WithMessage(err, "invalid param id in request")) {
return
if global.CONF.Base.IsDemo {
if wshandleError(wsConn, errors.New(" demo server, prohibit this operation!")) {
return
}
}
cols, err := strconv.Atoi(c.DefaultQuery("cols", "80"))
if wshandleError(wsConn, errors.WithMessage(err, "invalid param cols in request")) {
return
@@ -40,23 +40,14 @@ func (b *BaseApi) WsSsh(c *gin.Context) {
if wshandleError(wsConn, errors.WithMessage(err, "invalid param rows in request")) {
return
}
host, err := hostService.GetHostInfo(uint(id))
if wshandleError(wsConn, errors.WithMessage(err, "load host info by id failed")) {
return
}
var connInfo ssh.ConnInfo
_ = copier.Copy(&connInfo, &host)
connInfo.PrivateKey = []byte(host.PrivateKey)
if len(host.PassPhrase) != 0 {
connInfo.PassPhrase = []byte(host.PassPhrase)
}
client, err := connInfo.NewClient()
client, err := loadLocalConn()
if wshandleError(wsConn, errors.WithMessage(err, "failed to set up the connection. Please check the host information")) {
return
}
defer client.Close()
sws, err := terminal.NewLogicSshWsSession(cols, rows, true, connInfo.Client, wsConn)
command := c.DefaultQuery("command", "")
sws, err := terminal.NewLogicSshWsSession(cols, rows, client.Client, wsConn, command)
if wshandleError(wsConn, err) {
return
}
@@ -80,7 +71,7 @@ func (b *BaseApi) ContainerWsSSH(c *gin.Context) {
}
defer wsConn.Close()
if global.CONF.System.IsDemo {
if global.CONF.Base.IsDemo {
if wshandleError(wsConn, errors.New(" demo server, prohibit this operation!")) {
return
}
@@ -96,10 +87,10 @@ func (b *BaseApi) ContainerWsSSH(c *gin.Context) {
}
source := c.Query("source")
var containerID string
var initCmd string
var initCmd []string
switch source {
case "redis":
containerID, initCmd, err = loadRedisInitCmd(c)
case "redis", "redis-cluster":
containerID, initCmd, err = loadRedisInitCmd(c, source)
case "ollama":
containerID, initCmd, err = loadOllamaInitCmd(c)
case "container":
@@ -113,11 +104,11 @@ func (b *BaseApi) ContainerWsSSH(c *gin.Context) {
return
}
pidMap := loadMapFromDockerTop(containerID)
slave, err := terminal.NewCommand("clear && " + initCmd)
slave, err := terminal.NewCommand("docker", initCmd...)
if wshandleError(wsConn, err) {
return
}
defer killBash(containerID, strings.ReplaceAll(initCmd, fmt.Sprintf("docker exec -it %s ", containerID), ""), pidMap)
defer killBash(containerID, strings.ReplaceAll(strings.Join(initCmd, " "), fmt.Sprintf("exec -it %s ", containerID), ""), pidMap)
defer slave.Close()
tty, err := terminal.NewLocalWsSession(cols, rows, wsConn, slave, false)
@@ -134,65 +125,65 @@ func (b *BaseApi) ContainerWsSSH(c *gin.Context) {
global.LOG.Info("websocket finished")
dt := time.Now().Add(time.Second)
_ = wsConn.WriteControl(websocket.CloseMessage, nil, dt)
}
func loadRedisInitCmd(c *gin.Context) (string, string, error) {
func loadRedisInitCmd(c *gin.Context, redisType string) (string, []string, error) {
name := c.Query("name")
from := c.Query("from")
commands := "redis-cli"
commands := []string{"exec", "-it"}
database, err := databaseService.Get(name)
if err != nil {
return "", "", fmt.Errorf("no such database in db, err: %v", err)
return "", nil, fmt.Errorf("no such database in db, err: %v", err)
}
if from == "local" {
redisInfo, err := appInstallService.LoadConnInfo(dto.OperationWithNameAndType{Name: name, Type: "redis"})
redisInfo, err := appInstallService.LoadConnInfo(dto.OperationWithNameAndType{Name: name, Type: redisType})
if err != nil {
return "", "", fmt.Errorf("no such app in db, err: %v", err)
return "", nil, fmt.Errorf("no such app in db, err: %v", err)
}
name = redisInfo.ContainerName
commands = append(commands, []string{name, "redis-cli"}...)
if len(database.Password) != 0 {
commands = "redis-cli -a " + database.Password + " --no-auth-warning"
commands = append(commands, []string{"-a", database.Password, "--no-auth-warning"}...)
}
} else {
commands = fmt.Sprintf("redis-cli -h %s -p %v", database.Address, database.Port)
if len(database.Password) != 0 {
commands = fmt.Sprintf("redis-cli -h %s -p %v -a %s --no-auth-warning", database.Address, database.Port, database.Password)
}
name = "1Panel-redis-cli-tools"
commands = append(commands, []string{name, "redis-cli", "-h", database.Address, "-p", fmt.Sprintf("%v", database.Port)}...)
if len(database.Password) != 0 {
commands = append(commands, []string{"-a", database.Password, "--no-auth-warning"}...)
}
}
return name, fmt.Sprintf("docker exec -it %s %s", name, commands), nil
return name, commands, nil
}
func loadOllamaInitCmd(c *gin.Context) (string, string, error) {
func loadOllamaInitCmd(c *gin.Context) (string, []string, error) {
name := c.Query("name")
if cmd.CheckIllegal(name) {
return "", "", fmt.Errorf("ollama model %s contains illegal characters", name)
return "", nil, fmt.Errorf("ollama model %s contains illegal characters", name)
}
ollamaInfo, err := appInstallService.LoadConnInfo(dto.OperationWithNameAndType{Name: "", Type: "ollama"})
if err != nil {
return "", "", fmt.Errorf("no such app in db, err: %v", err)
return "", nil, fmt.Errorf("no such app in db, err: %v", err)
}
containerName := ollamaInfo.ContainerName
return containerName, fmt.Sprintf("docker exec -it %s ollama run %s", containerName, name), nil
return containerName, []string{"exec", "-it", containerName, "ollama", "run", name}, nil
}
func loadContainerInitCmd(c *gin.Context) (string, string, error) {
func loadContainerInitCmd(c *gin.Context) (string, []string, error) {
containerID := c.Query("containerid")
command := c.Query("command")
user := c.Query("user")
if cmd.CheckIllegal(user, containerID, command) {
return "", "", fmt.Errorf("the command contains illegal characters. command: %s, user: %s, containerID: %s", command, user, containerID)
return "", nil, fmt.Errorf("the command contains illegal characters. command: %s, user: %s, containerID: %s", command, user, containerID)
}
if len(command) == 0 || len(containerID) == 0 {
return "", "", fmt.Errorf("error param of command: %s or containerID: %s", command, containerID)
return "", nil, fmt.Errorf("error param of command: %s or containerID: %s", command, containerID)
}
command = fmt.Sprintf("docker exec -it %s %s", containerID, command)
commands := []string{"exec", "-it", containerID, command}
if len(user) != 0 {
command = fmt.Sprintf("docker exec -it -u %s %s %s", user, containerID, command)
commands = []string{"exec", "-it", "-u", user, containerID, command}
}
return containerID, command, nil
return containerID, commands, nil
}
func wshandleError(ws *websocket.Conn, err error) bool {
@@ -219,7 +210,7 @@ func loadMapFromDockerTop(containerID string) map[string]string {
pidMap := make(map[string]string)
sudo := cmd.SudoHandleCmd()
stdout, err := cmd.Execf("%s docker top %s -eo pid,command ", sudo, containerID)
stdout, err := cmd.RunDefaultWithStdoutBashCf("%s docker top %s -eo pid,command ", sudo, containerID)
if err != nil {
return pidMap
}
@@ -246,7 +237,7 @@ func killBash(containerID, comm string, pidMap map[string]string) {
}
}
if !isOld && command == comm {
_, _ = cmd.Execf("%s kill -9 %s", sudo, pid)
_, _ = cmd.RunDefaultWithStdoutBashCf("%s kill -9 %s", sudo, pid)
}
}
}
@@ -1,12 +1,9 @@
package v1
package v2
import (
"encoding/base64"
"github.com/1Panel-dev/1Panel/backend/app/api/v1/helper"
"github.com/1Panel-dev/1Panel/backend/app/dto"
"github.com/1Panel-dev/1Panel/backend/app/dto/request"
"github.com/1Panel-dev/1Panel/backend/constant"
"github.com/1Panel-dev/1Panel/agent/app/api/v2/helper"
"github.com/1Panel-dev/1Panel/agent/app/dto"
"github.com/1Panel-dev/1Panel/agent/app/dto/request"
"github.com/gin-gonic/gin"
)
@@ -25,7 +22,7 @@ func (b *BaseApi) PageWebsite(c *gin.Context) {
}
total, websites, err := websiteService.PageWebsite(req)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, dto.PageResult{
@@ -43,7 +40,7 @@ func (b *BaseApi) PageWebsite(c *gin.Context) {
func (b *BaseApi) GetWebsites(c *gin.Context) {
websites, err := websiteService.GetWebsites()
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, websites)
@@ -54,11 +51,15 @@ func (b *BaseApi) GetWebsites(c *gin.Context) {
// @Success 200 {array} response.WebsiteOption
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /websites/options [get]
// @Router /websites/options [post]
func (b *BaseApi) GetWebsiteOptions(c *gin.Context) {
websites, err := websiteService.GetWebsiteOptions()
var req request.WebsiteOptionReq
if err := helper.CheckBindAndValidate(&req, c); err != nil {
return
}
websites, err := websiteService.GetWebsiteOptions(req)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, websites)
@@ -78,20 +79,12 @@ func (b *BaseApi) CreateWebsite(c *gin.Context) {
if err := helper.CheckBindAndValidate(&req, c); err != nil {
return
}
if len(req.FtpPassword) != 0 {
pass, err := base64.StdEncoding.DecodeString(req.FtpPassword)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrBadRequest, constant.ErrTypeInvalidParams, err)
return
}
req.FtpPassword = string(pass)
}
err := websiteService.CreateWebsite(req)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, nil)
helper.Success(c)
}
// @Tags Website
@@ -110,10 +103,10 @@ func (b *BaseApi) OpWebsite(c *gin.Context) {
}
err := websiteService.OpWebsite(req)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, nil)
helper.Success(c)
}
// @Tags Website
@@ -132,10 +125,10 @@ func (b *BaseApi) DeleteWebsite(c *gin.Context) {
}
err := websiteService.DeleteWebsite(req)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, nil)
helper.Success(c)
}
// @Tags Website
@@ -153,10 +146,10 @@ func (b *BaseApi) UpdateWebsite(c *gin.Context) {
return
}
if err := websiteService.UpdateWebsite(req); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, nil)
helper.Success(c)
}
// @Tags Website
@@ -166,16 +159,16 @@ func (b *BaseApi) UpdateWebsite(c *gin.Context) {
// @Success 200 {object} response.WebsiteDTO
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /websites/{id} [get]
// @Router /websites/:id [get]
func (b *BaseApi) GetWebsite(c *gin.Context) {
id, err := helper.GetParamID(c)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrBadRequest, constant.ErrTypeInternalServer, nil)
helper.BadRequest(c, err)
return
}
website, err := websiteService.GetWebsite(id)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, website)
@@ -185,22 +178,21 @@ func (b *BaseApi) GetWebsite(c *gin.Context) {
// @Summary Search website nginx by id
// @Accept json
// @Param id path integer true "request"
// @Param type path string true "type"
// @Success 200 {object} response.FileInfo
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /websites/{id}/config/{type} [get]
// @Router /websites/:id/config/:type [get]
func (b *BaseApi) GetWebsiteNginx(c *gin.Context) {
id, err := helper.GetParamID(c)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrBadRequest, constant.ErrTypeInternalServer, nil)
helper.BadRequest(c, err)
return
}
configType := c.Param("type")
fileInfo, err := websiteService.GetWebsiteNginxConfig(id, configType)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, fileInfo)
@@ -221,7 +213,7 @@ func (b *BaseApi) GetNginxConfig(c *gin.Context) {
}
config, err := websiteService.GetNginxConfigByScope(req)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, config)
@@ -242,10 +234,10 @@ func (b *BaseApi) UpdateNginxConfig(c *gin.Context) {
return
}
if err := websiteService.UpdateNginxConfigByScope(req); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, nil)
helper.Success(c)
}
// @Tags Website HTTPS
@@ -255,16 +247,16 @@ func (b *BaseApi) UpdateNginxConfig(c *gin.Context) {
// @Success 200 {object} response.WebsiteHTTPS
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /websites/{id}/https [get]
// @Router /websites/:id/https [get]
func (b *BaseApi) GetHTTPSConfig(c *gin.Context) {
id, err := helper.GetParamID(c)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrBadRequest, constant.ErrTypeInternalServer, nil)
helper.BadRequest(c, err)
return
}
res, err := websiteService.GetWebsiteHTTPS(id)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, res)
@@ -273,12 +265,11 @@ func (b *BaseApi) GetHTTPSConfig(c *gin.Context) {
// @Tags Website HTTPS
// @Summary Update https conf
// @Accept json
// @Param id path integer true "request"
// @Param request body request.WebsiteHTTPSOp true "request"
// @Success 200 {object} response.WebsiteHTTPS
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /websites/{id}/https [post]
// @Router /websites/:id/https [post]
// @x-panel-log {"bodyKeys":["websiteId"],"paramKeys":[],"BeforeFunctions":[{"input_column":"id","input_value":"websiteId","isList":false,"db":"websites","output_column":"primary_domain","output_value":"domain"}],"formatZH":"更新网站 [domain] https 配置","formatEN":"Update website https [domain] conf"}
func (b *BaseApi) UpdateHTTPSConfig(c *gin.Context) {
var req request.WebsiteHTTPSOp
@@ -289,7 +280,7 @@ func (b *BaseApi) UpdateHTTPSConfig(c *gin.Context) {
res, err := websiteService.OpWebsiteHTTPS(ctx, req)
if err != nil {
tx.Rollback()
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
tx.Commit()
@@ -311,7 +302,7 @@ func (b *BaseApi) CreateWebsiteCheck(c *gin.Context) {
}
data, err := websiteService.PreInstallCheck(req)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, data)
@@ -332,10 +323,10 @@ func (b *BaseApi) UpdateWebsiteNginxConfig(c *gin.Context) {
return
}
if err := websiteService.UpdateNginxConfigFile(req); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, nil)
helper.Success(c)
}
// @Tags Website
@@ -354,7 +345,7 @@ func (b *BaseApi) OpWebsiteLog(c *gin.Context) {
}
res, err := websiteService.OpWebsiteLog(req)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, res)
@@ -375,74 +366,10 @@ func (b *BaseApi) ChangeDefaultServer(c *gin.Context) {
return
}
if err := websiteService.ChangeDefaultServer(req.ID); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, nil)
}
// @Tags Website
// @Summary Load website php conf
// @Accept json
// @Param id path integer true "request"
// @Success 200 {object} response.PHPConfig
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /websites/php/config/{id} [get]
func (b *BaseApi) GetWebsitePHPConfig(c *gin.Context) {
id, err := helper.GetParamID(c)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrBadRequest, constant.ErrTypeInternalServer, nil)
return
}
data, err := websiteService.GetPHPConfig(id)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
return
}
helper.SuccessWithData(c, data)
}
// @Tags Website PHP
// @Summary Update website php conf
// @Accept json
// @Param request body request.WebsitePHPConfigUpdate true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /websites/php/config [post]
// @x-panel-log {"bodyKeys":["id"],"paramKeys":[],"BeforeFunctions":[{"input_column":"id","input_value":"id","isList":false,"db":"websites","output_column":"primary_domain","output_value":"domain"}],"formatZH":"[domain] PHP 配置修改","formatEN":"[domain] PHP conf update"}
func (b *BaseApi) UpdateWebsitePHPConfig(c *gin.Context) {
var req request.WebsitePHPConfigUpdate
if err := helper.CheckBindAndValidate(&req, c); err != nil {
return
}
if err := websiteService.UpdatePHPConfig(req); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
return
}
helper.SuccessWithData(c, nil)
}
// @Tags Website PHP
// @Summary Update php conf
// @Accept json
// @Param request body request.WebsitePHPFileUpdate true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /websites/php/update [post]
// @x-panel-log {"bodyKeys":["websiteId"],"paramKeys":[],"BeforeFunctions":[{"input_column":"id","input_value":"websiteId","isList":false,"db":"websites","output_column":"primary_domain","output_value":"domain"}],"formatZH":"php 配置修改 [domain]","formatEN":"Nginx conf update [domain]"}
func (b *BaseApi) UpdatePHPFile(c *gin.Context) {
var req request.WebsitePHPFileUpdate
if err := helper.CheckBindAndValidate(&req, c); err != nil {
return
}
if err := websiteService.UpdatePHPConfigFile(req); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
return
}
helper.SuccessWithData(c, nil)
helper.Success(c)
}
// @Tags Website PHP
@@ -460,10 +387,10 @@ func (b *BaseApi) ChangePHPVersion(c *gin.Context) {
return
}
if err := websiteService.ChangePHPVersion(req); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithOutData(c)
helper.Success(c)
}
// @Tags Website
@@ -481,7 +408,7 @@ func (b *BaseApi) GetRewriteConfig(c *gin.Context) {
}
res, err := websiteService.GetRewriteConfig(req)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, res)
@@ -502,10 +429,10 @@ func (b *BaseApi) UpdateRewriteConfig(c *gin.Context) {
return
}
if err := websiteService.UpdateRewriteConfig(req); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, nil)
helper.Success(c)
}
// @Tags Website
@@ -523,10 +450,10 @@ func (b *BaseApi) UpdateSiteDir(c *gin.Context) {
return
}
if err := websiteService.UpdateSiteDir(req); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithOutData(c)
helper.Success(c)
}
// @Tags Website
@@ -544,10 +471,10 @@ func (b *BaseApi) UpdateSiteDirPermission(c *gin.Context) {
return
}
if err := websiteService.UpdateSitePermission(req); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithOutData(c)
helper.Success(c)
}
// @Tags Website
@@ -565,34 +492,12 @@ func (b *BaseApi) GetProxyConfig(c *gin.Context) {
}
res, err := websiteService.GetProxies(req.ID)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, res)
}
// @Tags Website
// @Summary Delete proxy conf
// @Accept json
// @Param request body request.WebsiteProxyDel true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /websites/proxies/del [post]
// @x-panel-log {"bodyKeys":["id"],"paramKeys":[],"BeforeFunctions":[{"input_column":"id","input_value":"id","isList":false,"db":"websites","output_column":"primary_domain","output_value":"domain"}],"formatZH":"删除网站 [domain] 反向代理配置","formatEN":"Delete domain [domain] proxy config"}
func (b *BaseApi) DeleteProxyConfig(c *gin.Context) {
var req request.WebsiteProxyDel
if err := helper.CheckBindAndValidate(&req, c); err != nil {
return
}
err := websiteService.DeleteProxy(req)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
return
}
helper.SuccessWithOutData(c)
}
// @Tags Website
// @Summary Update proxy conf
// @Accept json
@@ -609,10 +514,10 @@ func (b *BaseApi) UpdateProxyConfig(c *gin.Context) {
}
err := websiteService.OperateProxy(req)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithOutData(c)
helper.Success(c)
}
// @Tags Website
@@ -630,10 +535,10 @@ func (b *BaseApi) UpdateProxyConfigFile(c *gin.Context) {
return
}
if err := websiteService.UpdateProxyFile(req); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithOutData(c)
helper.Success(c)
}
// @Tags Website
@@ -651,7 +556,7 @@ func (b *BaseApi) GetAuthConfig(c *gin.Context) {
}
res, err := websiteService.GetAuthBasics(req)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, res)
@@ -671,10 +576,51 @@ func (b *BaseApi) UpdateAuthConfig(c *gin.Context) {
return
}
if err := websiteService.UpdateAuthBasic(req); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithOutData(c)
helper.Success(c)
}
// @Tags Website
// @Summary Get AuthBasic conf
// @Accept json
// @Param request body request.NginxAuthReq true "request"
// @Success 200 {object} response.NginxPathAuthRes
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /websites/auths/path [post]
func (b *BaseApi) GetPathAuthConfig(c *gin.Context) {
var req request.NginxAuthReq
if err := helper.CheckBindAndValidate(&req, c); err != nil {
return
}
res, err := websiteService.GetPathAuthBasics(req)
if err != nil {
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, res)
}
// @Tags Website
// @Summary Get AuthBasic conf
// @Accept json
// @Param request body request.NginxPathAuthUpdate true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /websites/auths/path/update [post]
func (b *BaseApi) UpdatePathAuthConfig(c *gin.Context) {
var req request.NginxPathAuthUpdate
if err := helper.CheckBindAndValidate(&req, c); err != nil {
return
}
if err := websiteService.UpdatePathAuthBasic(req); err != nil {
helper.InternalServer(c, err)
return
}
helper.Success(c)
}
// @Tags Website
@@ -692,14 +638,14 @@ func (b *BaseApi) GetAntiLeech(c *gin.Context) {
}
res, err := websiteService.GetAntiLeech(req.WebsiteID)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, res)
}
// @Tags Website
// @Summary Update AntiLeech conf
// @Summary Update AntiLeech
// @Accept json
// @Param request body request.NginxAntiLeechUpdate true "request"
// @Success 200
@@ -712,10 +658,10 @@ func (b *BaseApi) UpdateAntiLeech(c *gin.Context) {
return
}
if err := websiteService.UpdateAntiLeech(req); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithOutData(c)
helper.Success(c)
}
// @Tags Website
@@ -734,10 +680,10 @@ func (b *BaseApi) UpdateRedirectConfig(c *gin.Context) {
}
err := websiteService.OperateRedirect(req)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithOutData(c)
helper.Success(c)
}
// @Tags Website
@@ -755,7 +701,7 @@ func (b *BaseApi) GetRedirectConfig(c *gin.Context) {
}
res, err := websiteService.GetRedirect(req.WebsiteID)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, res)
@@ -776,10 +722,10 @@ func (b *BaseApi) UpdateRedirectConfigFile(c *gin.Context) {
return
}
if err := websiteService.UpdateRedirectFile(req); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithOutData(c)
helper.Success(c)
}
// @Tags Website
@@ -797,7 +743,7 @@ func (b *BaseApi) GetDirConfig(c *gin.Context) {
}
res, err := websiteService.LoadWebsiteDirConfig(req)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, res)
@@ -806,20 +752,19 @@ func (b *BaseApi) GetDirConfig(c *gin.Context) {
// @Tags Website
// @Summary Get default html
// @Accept json
// @Param type path string true "type"
// @Success 200 {object} response.WebsiteHtmlRes
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /websites/default/html/{type} [get]
// @Router /websites/default/html/:type [get]
func (b *BaseApi) GetDefaultHtml(c *gin.Context) {
resourceType, err := helper.GetStrParamByKey(c, "type")
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrBadRequest, constant.ErrTypeInternalServer, nil)
helper.BadRequest(c, err)
return
}
fileInfo, err := websiteService.GetDefaultHtml(resourceType)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, fileInfo)
@@ -840,8 +785,339 @@ func (b *BaseApi) UpdateDefaultHtml(c *gin.Context) {
return
}
if err := websiteService.UpdateDefaultHtml(req); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithOutData(c)
helper.Success(c)
}
// @Tags Website
// @Summary Get website upstreams
// @Accept json
// @Param request body request.WebsiteCommonReq true "request"
// @Success 200 {array} dto.NginxUpstream
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /websites/lbs [get]
func (b *BaseApi) GetLoadBalances(c *gin.Context) {
id, err := helper.GetParamID(c)
if err != nil {
helper.BadRequest(c, err)
return
}
res, err := websiteService.GetLoadBalances(id)
if err != nil {
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, res)
}
// @Tags Website
// @Summary Create website upstream
// @Accept json
// @Param request body request.WebsiteLBCreate true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /websites/lbs/create [post]
func (b *BaseApi) CreateLoadBalance(c *gin.Context) {
var req request.WebsiteLBCreate
if err := helper.CheckBindAndValidate(&req, c); err != nil {
return
}
if err := websiteService.CreateLoadBalance(req); err != nil {
helper.InternalServer(c, err)
return
}
helper.Success(c)
}
// @Tags Website
// @Summary Delete website upstream
// @Accept json
// @Param request body request.WebsiteLBDelete true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /websites/lbs/delete [post]
func (b *BaseApi) DeleteLoadBalance(c *gin.Context) {
var req request.WebsiteLBDelete
if err := helper.CheckBindAndValidate(&req, c); err != nil {
return
}
if err := websiteService.DeleteLoadBalance(req); err != nil {
helper.InternalServer(c, err)
return
}
helper.Success(c)
}
// @Tags Website
// @Summary Update website upstream
// @Accept json
// @Param request body request.WebsiteLBUpdate true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /websites/lbs/update [post]
func (b *BaseApi) UpdateLoadBalance(c *gin.Context) {
var req request.WebsiteLBUpdate
if err := helper.CheckBindAndValidate(&req, c); err != nil {
return
}
if err := websiteService.UpdateLoadBalance(req); err != nil {
helper.InternalServer(c, err)
return
}
helper.Success(c)
}
// @Tags Website
// @Summary Update website upstream file
// @Accept json
// @Param request body request.WebsiteLBUpdateFile true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /websites/lbs/file [post]
func (b *BaseApi) UpdateLoadBalanceFile(c *gin.Context) {
var req request.WebsiteLBUpdateFile
if err := helper.CheckBindAndValidate(&req, c); err != nil {
return
}
if err := websiteService.UpdateLoadBalanceFile(req); err != nil {
helper.InternalServer(c, err)
return
}
helper.Success(c)
}
func (b *BaseApi) ChangeWebsiteGroup(c *gin.Context) {
var req dto.UpdateGroup
if err := helper.CheckBindAndValidate(&req, c); err != nil {
return
}
if err := websiteService.ChangeGroup(req.Group, req.NewGroup); err != nil {
helper.InternalServer(c, err)
return
}
helper.Success(c)
}
// @Tags Website
// @Summary update website proxy cache config
// @Accept json
// @Param request body request.NginxProxyCacheUpdate true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /websites/proxy/config [post]
func (b *BaseApi) UpdateProxyCache(c *gin.Context) {
var req request.NginxProxyCacheUpdate
if err := helper.CheckBindAndValidate(&req, c); err != nil {
return
}
if err := websiteService.UpdateProxyCache(req); err != nil {
helper.InternalServer(c, err)
return
}
helper.Success(c)
}
// @Summary Get website proxy cache config
// @Accept json
// @Param id path int true "id"
// @Success 200 {object} response.NginxProxyCache
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /websites/proxy/config/{id} [get]
func (b *BaseApi) GetProxyCache(c *gin.Context) {
id, err := helper.GetParamID(c)
if err != nil {
helper.BadRequest(c, err)
return
}
res, err := websiteService.GetProxyCache(id)
if err != nil {
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, res)
}
// @Tags Website
// @Summary Set Real IP
// @Accept json
// @Param request body request.WebsiteRealIP true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /websites/realip [post]
// @x-panel-log {"bodyKeys":["websiteID"],"paramKeys":[],"BeforeFunctions":[{"input_column":"id","input_value":"websiteID","isList":false,"db":"websites","output_column":"primary_domain","output_value":"domain"}],"formatZH":"修改 [domain] 网站真实IP配置 ","formatEN":"Modify the real IP configuration of [domain] website"}
func (b *BaseApi) SetRealIPConfig(c *gin.Context) {
var req request.WebsiteRealIP
if err := helper.CheckBindAndValidate(&req, c); err != nil {
return
}
if err := websiteService.SetRealIPConfig(req); err != nil {
helper.InternalServer(c, err)
return
}
helper.Success(c)
}
// @Tags Website
// @Summary Get Real IP Config
// @Accept json
// @Param id path int true "id"
// @Success 200 {object} response.WebsiteRealIP
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /websites/realip/config/{id} [get]
func (b *BaseApi) GetRealIPConfig(c *gin.Context) {
id, err := helper.GetParamID(c)
if err != nil {
helper.BadRequest(c, err)
return
}
res, err := websiteService.GetRealIPConfig(id)
if err != nil {
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, res)
}
// @Tags Website
// @Summary Get website resource
// @Accept json
// @Param id path int true "id"
// @Success 200 {object} response.Resource
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /websites/resource/{id} [get]
func (b *BaseApi) GetWebsiteResource(c *gin.Context) {
id, err := helper.GetParamID(c)
if err != nil {
helper.BadRequest(c, err)
return
}
res, err := websiteService.GetWebsiteResource(id)
if err != nil {
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, res)
}
// @Tags Website
// @Summary Get databases
// @Accept json
// @Success 200 {object} response.Database
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /websites/databases [get]
func (b *BaseApi) GetWebsiteDatabase(c *gin.Context) {
res, err := websiteService.ListDatabases()
if err != nil {
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, res)
}
// @Tags Website
// @Summary Change website database
// @Accept json
// @Param request body request.ChangeDatabase true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /websites/databases [post]
func (b *BaseApi) ChangeWebsiteDatabase(c *gin.Context) {
var req request.ChangeDatabase
if err := helper.CheckBindAndValidate(&req, c); err != nil {
return
}
if err := websiteService.ChangeDatabase(req); err != nil {
helper.InternalServer(c, err)
return
}
helper.Success(c)
}
// @Tags Website
// @Summary Operate custom rewrite
// @Accept json
// @Param request body request.CustomRewriteOperate true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /websites/rewrite/custom [post]
func (b *BaseApi) OperateCustomRewrite(c *gin.Context) {
var req request.CustomRewriteOperate
if err := helper.CheckBindAndValidate(&req, c); err != nil {
return
}
if err := websiteService.OperateCustomRewrite(req); err != nil {
helper.InternalServer(c, err)
return
}
helper.Success(c)
}
// @Tags Website
// @Summary List custom rewrite
// @Accept json
// @Success 200 {array} string
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /websites/rewrite/custom [get]
func (b *BaseApi) ListCustomRewrite(c *gin.Context) {
res, err := websiteService.ListCustomRewrite()
if err != nil {
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, res)
}
// @Tags Website
// @Summary Clear Website proxy cache
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /websites/proxy/clear [post]
// @x-panel-log {"bodyKeys":[],"paramKeys":[],"BeforeFunctions":[],"formatZH":"清理 Openresty 代理缓存","formatEN":"Clear nginx proxy cache"}
func (b *BaseApi) ClearProxyCache(c *gin.Context) {
var req request.NginxCommonReq
if err := helper.CheckBindAndValidate(&req, c); err != nil {
return
}
if err := websiteService.ClearProxyCache(req); err != nil {
helper.InternalServer(c, err)
return
}
helper.Success(c)
}
// @Tags Website
// @Summary Operate Cross Site Access
// @Accept json
// @Param request body request.CrossSiteAccessOp true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /websites/crosssite [post]
func (b *BaseApi) OperateCrossSiteAccess(c *gin.Context) {
var req request.CrossSiteAccessOp
if err := helper.CheckBindAndValidate(&req, c); err != nil {
return
}
if err := websiteService.OperateCrossSiteAccess(req); err != nil {
helper.InternalServer(c, err)
return
}
helper.Success(c)
}
@@ -1,10 +1,9 @@
package v1
package v2
import (
"github.com/1Panel-dev/1Panel/backend/app/api/v1/helper"
"github.com/1Panel-dev/1Panel/backend/app/dto"
"github.com/1Panel-dev/1Panel/backend/app/dto/request"
"github.com/1Panel-dev/1Panel/backend/constant"
"github.com/1Panel-dev/1Panel/agent/app/api/v2/helper"
"github.com/1Panel-dev/1Panel/agent/app/dto"
"github.com/1Panel-dev/1Panel/agent/app/dto/request"
"github.com/gin-gonic/gin"
)
@@ -23,7 +22,7 @@ func (b *BaseApi) PageWebsiteAcmeAccount(c *gin.Context) {
}
total, accounts, err := websiteAcmeAccountService.Page(req)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, dto.PageResult{
@@ -48,7 +47,7 @@ func (b *BaseApi) CreateWebsiteAcmeAccount(c *gin.Context) {
}
res, err := websiteAcmeAccountService.Create(req)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, res)
@@ -69,8 +68,30 @@ func (b *BaseApi) DeleteWebsiteAcmeAccount(c *gin.Context) {
return
}
if err := websiteAcmeAccountService.Delete(req.ID); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, nil)
helper.Success(c)
}
// @Tags Website Acme
// @Summary Update website acme account
// @Accept json
// @Param request body request.WebsiteAcmeAccountUpdate true "request"
// @Success 200 {object} response.WebsiteAcmeAccountDTO
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /websites/acme/update [post]
// @x-panel-log {"bodyKeys":["id"],"paramKeys":[],"BeforeFunctions":[{"input_column":"id","input_value":"id","isList":false,"db":"website_acme_accounts","output_column":"email","output_value":"email"}],"formatZH":"更新 acme [email]","formatEN":"Update acme [email]"}
func (b *BaseApi) UpdateWebsiteAcmeAccount(c *gin.Context) {
var req request.WebsiteAcmeAccountUpdate
if err := helper.CheckBindAndValidate(&req, c); err != nil {
return
}
res, err := websiteAcmeAccountService.Update(req)
if err != nil {
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, res)
}
@@ -1,14 +1,14 @@
package v1
package v2
import (
"github.com/1Panel-dev/1Panel/backend/app/api/v1/helper"
"github.com/1Panel-dev/1Panel/backend/app/dto"
"github.com/1Panel-dev/1Panel/backend/app/dto/request"
"github.com/1Panel-dev/1Panel/backend/constant"
"github.com/gin-gonic/gin"
"net/http"
"net/url"
"strconv"
"github.com/1Panel-dev/1Panel/agent/app/api/v2/helper"
"github.com/1Panel-dev/1Panel/agent/app/dto"
"github.com/1Panel-dev/1Panel/agent/app/dto/request"
"github.com/gin-gonic/gin"
)
// @Tags Website CA
@@ -26,7 +26,7 @@ func (b *BaseApi) PageWebsiteCA(c *gin.Context) {
}
total, cas, err := websiteCAService.Page(req)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, dto.PageResult{
@@ -51,7 +51,7 @@ func (b *BaseApi) CreateWebsiteCA(c *gin.Context) {
}
res, err := websiteCAService.Create(req)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, res)
@@ -72,7 +72,7 @@ func (b *BaseApi) GetWebsiteCA(c *gin.Context) {
}
res, err := websiteCAService.GetCA(id)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, res)
@@ -93,10 +93,10 @@ func (b *BaseApi) DeleteWebsiteCA(c *gin.Context) {
return
}
if err := websiteCAService.Delete(req.ID); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithOutData(c)
helper.Success(c)
}
// @Tags Website CA
@@ -113,15 +113,16 @@ func (b *BaseApi) ObtainWebsiteCA(c *gin.Context) {
if err := helper.CheckBindAndValidate(&req, c); err != nil {
return
}
if _, err := websiteCAService.ObtainSSL(req); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
res, err := websiteCAService.ObtainSSL(req)
if err != nil {
helper.InternalServer(c, err)
return
}
helper.SuccessWithOutData(c)
helper.SuccessWithData(c, res)
}
// @Tags Website CA
// @Summary Renew Obtain SSL
// @Summary Obtain SSL
// @Accept json
// @Param request body request.WebsiteCAObtain true "request"
// @Success 200
@@ -140,10 +141,10 @@ func (b *BaseApi) RenewWebsiteCA(c *gin.Context) {
Unit: "year",
Time: 1,
}); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithOutData(c)
helper.Success(c)
}
// @Tags Website CA
@@ -162,13 +163,13 @@ func (b *BaseApi) DownloadCAFile(c *gin.Context) {
}
file, err := websiteCAService.DownloadFile(req.ID)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
defer file.Close()
info, err := file.Stat()
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
c.Header("Content-Length", strconv.FormatInt(info.Size(), 10))
@@ -1,10 +1,9 @@
package v1
package v2
import (
"github.com/1Panel-dev/1Panel/backend/app/api/v1/helper"
"github.com/1Panel-dev/1Panel/backend/app/dto"
"github.com/1Panel-dev/1Panel/backend/app/dto/request"
"github.com/1Panel-dev/1Panel/backend/constant"
"github.com/1Panel-dev/1Panel/agent/app/api/v2/helper"
"github.com/1Panel-dev/1Panel/agent/app/dto"
"github.com/1Panel-dev/1Panel/agent/app/dto/request"
"github.com/gin-gonic/gin"
)
@@ -23,7 +22,7 @@ func (b *BaseApi) PageWebsiteDnsAccount(c *gin.Context) {
}
total, accounts, err := websiteDnsAccountService.Page(req)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, dto.PageResult{
@@ -47,10 +46,10 @@ func (b *BaseApi) CreateWebsiteDnsAccount(c *gin.Context) {
return
}
if _, err := websiteDnsAccountService.Create(req); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, nil)
helper.Success(c)
}
// @Tags Website DNS
@@ -68,10 +67,10 @@ func (b *BaseApi) UpdateWebsiteDnsAccount(c *gin.Context) {
return
}
if _, err := websiteDnsAccountService.Update(req); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, nil)
helper.Success(c)
}
// @Tags Website DNS
@@ -89,8 +88,8 @@ func (b *BaseApi) DeleteWebsiteDnsAccount(c *gin.Context) {
return
}
if err := websiteDnsAccountService.Delete(req.ID); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, nil)
helper.Success(c)
}
@@ -1,9 +1,8 @@
package v1
package v2
import (
"github.com/1Panel-dev/1Panel/backend/app/api/v1/helper"
"github.com/1Panel-dev/1Panel/backend/app/dto/request"
"github.com/1Panel-dev/1Panel/backend/constant"
"github.com/1Panel-dev/1Panel/agent/app/api/v2/helper"
"github.com/1Panel-dev/1Panel/agent/app/dto/request"
"github.com/gin-gonic/gin"
)
@@ -22,17 +21,17 @@ func (b *BaseApi) DeleteWebDomain(c *gin.Context) {
return
}
if err := websiteService.DeleteWebsiteDomain(req.ID); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, nil)
helper.Success(c)
}
// @Tags Website Domain
// @Summary Create website domain
// @Accept json
// @Param request body request.WebsiteDomainCreate true "request"
// @Success 200 {array} model.WebsiteDomain
// @Success 200 {object} model.WebsiteDomain
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /websites/domains [post]
@@ -44,7 +43,7 @@ func (b *BaseApi) CreateWebDomain(c *gin.Context) {
}
domain, err := websiteService.CreateWebsiteDomain(req)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, domain)
@@ -57,17 +56,38 @@ func (b *BaseApi) CreateWebDomain(c *gin.Context) {
// @Success 200 {array} model.WebsiteDomain
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /websites/domains/{websiteId} [get]
// @Router /websites/domains/:websiteId [get]
func (b *BaseApi) GetWebDomains(c *gin.Context) {
websiteId, err := helper.GetIntParamByKey(c, "websiteId")
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrBadRequest, constant.ErrTypeInternalServer, nil)
helper.BadRequest(c, err)
return
}
list, err := websiteService.GetWebsiteDomain(websiteId)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, list)
}
// @Tags Website Domain
// @Summary Update website domain
// @Accept json
// @Param request body request.WebsiteDomainUpdate true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /websites/domains/update [post]
// @x-panel-log {"bodyKeys":["id"],"paramKeys":[],"BeforeFunctions":[{"input_column":"id","input_value":"id","isList":false,"db":"website_domains","output_column":"domain","output_value":"domain"}],"formatZH":"更新域名 [domain]","formatEN":"Update domain [domain]"}
func (b *BaseApi) UpdateWebDomain(c *gin.Context) {
var req request.WebsiteDomainUpdate
if err := helper.CheckBindAndValidate(&req, c); err != nil {
return
}
if err := websiteService.UpdateWebsiteDomain(req); err != nil {
helper.InternalServer(c, err)
return
}
helper.Success(c)
}
@@ -1,4 +1,4 @@
package v1
package v2
import (
"net/http"
@@ -6,10 +6,9 @@ import (
"reflect"
"strconv"
"github.com/1Panel-dev/1Panel/backend/app/api/v1/helper"
"github.com/1Panel-dev/1Panel/backend/app/dto"
"github.com/1Panel-dev/1Panel/backend/app/dto/request"
"github.com/1Panel-dev/1Panel/backend/constant"
"github.com/1Panel-dev/1Panel/agent/app/api/v2/helper"
"github.com/1Panel-dev/1Panel/agent/app/dto"
"github.com/1Panel-dev/1Panel/agent/app/dto/request"
"github.com/gin-gonic/gin"
)
@@ -29,7 +28,7 @@ func (b *BaseApi) PageWebsiteSSL(c *gin.Context) {
if !reflect.DeepEqual(req.PageInfo, dto.PageInfo{}) {
total, accounts, err := websiteSSLService.Page(req)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, dto.PageResult{
@@ -39,7 +38,7 @@ func (b *BaseApi) PageWebsiteSSL(c *gin.Context) {
} else {
list, err := websiteSSLService.Search(req)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, list)
@@ -62,7 +61,7 @@ func (b *BaseApi) CreateWebsiteSSL(c *gin.Context) {
}
res, err := websiteSSLService.Create(req)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, res)
@@ -83,10 +82,10 @@ func (b *BaseApi) ApplyWebsiteSSL(c *gin.Context) {
return
}
if err := websiteSSLService.ObtainSSL(req); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithOutData(c)
helper.Success(c)
}
// @Tags Website SSL
@@ -104,7 +103,7 @@ func (b *BaseApi) GetDNSResolve(c *gin.Context) {
}
res, err := websiteSSLService.GetDNSResolve(req)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, res)
@@ -125,10 +124,10 @@ func (b *BaseApi) DeleteWebsiteSSL(c *gin.Context) {
return
}
if err := websiteSSLService.Delete(req.IDs); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, nil)
helper.Success(c)
}
// @Tags Website SSL
@@ -138,16 +137,16 @@ func (b *BaseApi) DeleteWebsiteSSL(c *gin.Context) {
// @Success 200 {object} response.WebsiteSSLDTO
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /websites/ssl/website/{websiteId} [get]
// @Router /websites/ssl/website/:websiteId [get]
func (b *BaseApi) GetWebsiteSSLByWebsiteId(c *gin.Context) {
websiteId, err := helper.GetIntParamByKey(c, "websiteId")
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrBadRequest, constant.ErrTypeInvalidParams, err)
helper.BadRequest(c, err)
return
}
websiteSSL, err := websiteSSLService.GetWebsiteSSL(websiteId)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, websiteSSL)
@@ -160,23 +159,23 @@ func (b *BaseApi) GetWebsiteSSLByWebsiteId(c *gin.Context) {
// @Success 200 {object} response.WebsiteSSLDTO
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /websites/ssl/{id} [get]
// @Router /websites/ssl/:id [get]
func (b *BaseApi) GetWebsiteSSLById(c *gin.Context) {
id, err := helper.GetParamID(c)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrBadRequest, constant.ErrTypeInvalidParams, err)
helper.BadRequest(c, err)
return
}
websiteSSL, err := websiteSSLService.GetSSL(id)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, websiteSSL)
}
// @Tags Website SSL
// @Summary Update Website ssl
// @Summary Update ssl
// @Accept json
// @Param request body request.WebsiteSSLUpdate true "request"
// @Success 200
@@ -190,14 +189,14 @@ func (b *BaseApi) UpdateWebsiteSSL(c *gin.Context) {
return
}
if err := websiteSSLService.Update(req); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, nil)
helper.Success(c)
}
// @Tags Website SSL
// @Summary Upload Website ssl
// @Summary Upload ssl
// @Accept json
// @Param request body request.WebsiteSSLUpload true "request"
// @Success 200
@@ -211,14 +210,14 @@ func (b *BaseApi) UploadWebsiteSSL(c *gin.Context) {
return
}
if err := websiteSSLService.Upload(req); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, nil)
helper.Success(c)
}
// @Tags Website SSL
// @Summary Download SSL file
// @Summary Download SSL file
// @Accept json
// @Param request body request.WebsiteResourceReq true "request"
// @Success 200
@@ -233,13 +232,13 @@ func (b *BaseApi) DownloadWebsiteSSL(c *gin.Context) {
}
file, err := websiteSSLService.DownloadFile(req.ID)
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
defer file.Close()
info, err := file.Stat()
if err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
helper.InternalServer(c, err)
return
}
c.Header("Content-Length", strconv.FormatInt(info.Size(), 10))
@@ -20,7 +20,8 @@ type OllamaModelDropList struct {
}
type OllamaModelName struct {
Name string `json:"name"`
Name string `json:"name"`
TaskID string `json:"taskID"`
}
type OllamaBindDomain struct {
@@ -38,8 +39,8 @@ type OllamaBindDomainReq struct {
type OllamaBindDomainRes struct {
Domain string `json:"domain"`
SSLID uint `json:"sslID"`
AcmeAccountID uint `json:"acmeAccountID"`
AllowIPs []string `json:"allowIPs"`
WebsiteID uint `json:"websiteID"`
ConnUrl string `json:"connUrl"`
AcmeAccountID uint `json:"acmeAccountID"`
}
+327
View File
@@ -0,0 +1,327 @@
package dto
import (
"encoding/json"
"github.com/1Panel-dev/1Panel/agent/app/model"
"time"
)
type CreateOrUpdateAlert struct {
AlertTitle string `json:"alertTitle"`
AlertType string `json:"alertType"`
AlertMethod string `json:"alertMethod"`
AlertCount uint `json:"alertCount"`
EntryID uint `json:"entryID"`
}
type AlertBase struct {
AlertType string `json:"alertType"`
EntryID uint `json:"entryID"`
}
type PushAlert struct {
TaskName string `json:"taskName"`
AlertType string `json:"alertType"`
EntryID uint `json:"entryID"`
Param string `json:"param"`
}
type AlertSearch struct {
PageInfo
OrderBy string `json:"orderBy" validate:"required,oneof=created_at"`
Order string `json:"order" validate:"required,oneof=null ascending descending"`
Type string `json:"type"`
Status string `json:"status"`
Method string `json:"method"`
}
type AlertDTO struct {
ID uint `json:"id"`
Type string `json:"type"`
Cycle uint `json:"cycle"`
Count uint `json:"count"`
Method string `json:"method"`
Title string `json:"title"`
Project string `json:"project"`
Status string `json:"status"`
SendCount uint `json:"sendCount"`
CreatedAt time.Time `json:"createdAt"`
UpdatedAt time.Time `json:"updatedAt"`
}
type AlertCreate struct {
Type string `json:"type" validate:"required"`
Cycle uint `json:"cycle"`
Count uint `json:"count"`
Method string `json:"method" validate:"required"`
Title string `json:"title"`
Project string `json:"project"`
Status string `json:"status"`
SendCount uint `json:"sendCount"`
}
type AlertUpdate struct {
ID uint `json:"id" validate:"required"`
Type string `json:"type"`
Cycle uint `json:"cycle"`
Count uint `json:"count"`
Method string `json:"method"`
Title string `json:"title"`
Project string `json:"project"`
Status string `json:"status"`
SendCount uint `json:"sendCount"`
}
type DeleteRequest struct {
ID uint `json:"id" validate:"required"`
}
type AlertUpdateStatus struct {
ID uint `json:"id" validate:"required"`
Status string `json:"status" validate:"required"`
}
type DiskDTO struct {
Path string `json:"path"`
Type string `json:"type"`
Device string `json:"device"`
Total uint64 `json:"total"`
Free uint64 `json:"free"`
Used uint64 `json:"used"`
UsedPercent float64 `json:"usedPercent"`
InodesTotal uint64 `json:"inodesTotal"`
InodesUsed uint64 `json:"inodesUsed"`
InodesFree uint64 `json:"inodesFree"`
InodesUsedPercent float64 `json:"inodesUsedPercent"`
}
type AlertLogSearch struct {
PageInfo
Count uint `json:"count"`
Status string `json:"status"`
}
type AlertLogDTO struct {
ID uint `json:"id"`
Type string `json:"type"`
Count uint `json:"count"`
AlertId uint `json:"alertId"`
AlertDetail AlertDetail `json:"alertDetail"`
AlertRule AlertRule `json:"alertRule"`
Status string `json:"status"`
Method string `json:"method"`
Message string `json:"message"`
CreatedAt time.Time `json:"createdAt"`
UpdatedAt time.Time `json:"updatedAt"`
}
type AlertLogCreate struct {
Type string `json:"type" validate:"required"`
Count uint `json:"count" validate:"required"`
AlertId uint `json:"alertId" validate:"required"`
AlertDetail string `json:"alertDetail" validate:"required"`
AlertRule string `json:"alertRule" validate:"required"`
Status string `json:"status" validate:"required"`
Method string `json:"method" validate:"required"`
Message string `json:"message"`
RecordId uint `json:"recordId"`
LicenseId string `json:"licenseId" validate:"required"`
}
type AlertLog struct {
ID uint `json:"id" validate:"required"`
}
type AlertDetail struct {
LicenseId string `json:"licenseId"`
Type string `json:"type"`
SubType string `json:"subType"`
Title string `json:"title"`
Method string `json:"method"`
LicenseCode string `json:"licenseCode"`
DeviceId string `json:"deviceId"`
Project string `json:"project"`
Params []Param `json:"params"`
Phone string `json:"phone"`
}
type AlertRule struct {
ID uint `json:"id"`
Type string `json:"type"`
Cycle uint `json:"cycle"`
Count uint `json:"count"`
Method string `json:"method"`
Title string `json:"title"`
Project string `json:"project"`
Status string `json:"status"`
SendCount uint `json:"sendCount"`
CreatedAt time.Time `json:"createdAt"`
UpdatedAt time.Time `json:"updatedAt"`
}
type Param struct {
Index string `json:"index"`
Key string `json:"key"`
Value string `json:"value"`
}
type ClamDTO struct {
ID uint `json:"id"`
CreatedAt time.Time `json:"createdAt"`
UpdatedAt time.Time `json:"updatedAt"`
Name string `json:"name"`
Status string `json:"status"`
Path string `json:"path"`
}
type CronJobDTO struct {
ID uint `json:"id"`
CreatedAt time.Time `json:"createdAt"`
UpdatedAt time.Time `json:"updatedAt"`
Name string `json:"name"`
Status string `json:"status"`
Type string `json:"type"`
}
type CronJobReq struct {
Name string `json:"name"`
Status string `json:"status"`
Type string `json:"type"`
}
type UpgradeInfo struct {
TestVersion string `json:"testVersion"`
NewVersion string `json:"newVersion"`
LatestVersion string `json:"latestVersion"`
ReleaseNote string `json:"releaseNote"`
}
type AlertDiskInfo struct {
Type string
Mount string
Device string
}
type SyncResult struct {
ID uint `json:"id"`
LicenseID string `json:"licenseId"`
SendStatus string `json:"sendStatus"`
CreateTime string `json:"createTime"`
UpdateTime string `json:"updateTime"`
Remarks string `json:"remarks"`
MsgCount int `json:"msgCount"`
MsgCountMax int `json:"msgCountMax"`
}
type QueryRequest struct {
QueryIds []uint `json:"queryIds"`
LicenseId string `json:"licenseId"`
}
type AlertResponse struct {
Result bool `json:"result"`
Data json.RawMessage `json:"data"`
Message string `json:"message"`
}
type PushResult struct {
RecordId uint `json:"recordId"`
LicenseId string `json:"licenseId"`
}
type UpdateOfflineAlertLog struct {
ID uint `json:"id"`
Status string `json:"status"`
Message string `json:"message"`
RecordId uint `json:"recordId"`
LicenseId string `json:"licenseId"`
}
type SyncOfflineAlertLogDTO struct {
QueryRequest string `json:"queryRequest"`
Ids []uint `json:"ids"`
AlertLogs []model.AlertLog `json:"alertLogs"`
LicenseId string `json:"licenseId"`
}
type OfflineAlertResponse struct {
ID uint `json:"id"`
Type string `json:"type"`
RemoteErr error `json:"remoteErr"`
ResponseStruct AlertResponse `json:"responseStruct"`
AlertLogs []model.AlertLog `json:"alertLogs"`
Ids []uint `json:"ids"`
LicenseId string `json:"licenseId"`
}
type OfflineAlertLogDTO struct {
ID uint `json:"id"`
Type string `json:"type"`
Count uint `json:"count"`
AlertId uint `json:"alertId"`
AlertDetail string `json:"alertDetail"`
AlertRule string `json:"alertRule"`
Status string `json:"status"`
Method string `json:"method"`
Message string `json:"message"`
RecordId uint `json:"recordId"`
LicenseId string `json:"licenseId"`
CreatedAt time.Time `json:"createdAt"`
UpdatedAt time.Time `json:"updatedAt"`
}
type OfflineQueryRequest struct {
Ids []uint `json:"ids"`
QueryIds []uint `json:"queryIds"`
LicenseId string `json:"licenseId"`
}
type AlertConfigUpdate struct {
ID uint `json:"id"`
Type string `json:"type"`
Title string `json:"title"`
Status string `json:"status"`
Config string `json:"config"`
}
type AlertConfigTest struct {
Host string `json:"host"`
Port int `json:"port"`
Sender string `json:"sender"`
Password string `json:"password"`
DisplayName string `json:"displayName"`
Encryption string `json:"encryption"` // "ssl" / "tls" / "none"
Recipient string `json:"recipient"`
}
type AlertSendTimeRange struct {
NoticeAlert struct {
SendTimeRange string `json:"sendTimeRange"`
Type []string `json:"type"`
} `json:"noticeAlert"`
ResourceAlert struct {
SendTimeRange string `json:"sendTimeRange"`
Type []string `json:"type"`
} `json:"resourceAlert"`
}
type AlertCommonConfig struct {
IsOffline string `json:"isOffline"`
AlertSendTimeRange AlertSendTimeRange `json:"alertSendTimeRange"`
}
type AlertSmsConfig struct {
Phone string `json:"phone"`
AlertDailyNum uint `json:"alertDailyNum"`
}
type AlertEmailConfig struct {
Host string `json:"host"`
Port int `json:"port"`
Sender string `json:"sender"`
Password string `json:"password"`
DisplayName string `json:"displayName"`
Encryption string `json:"encryption"` // "ssl" / "tls" / "none"
Recipient string `json:"recipient"`
}
+43 -18
View File
@@ -1,10 +1,17 @@
package dto
import (
"context"
"github.com/1Panel-dev/1Panel/agent/app/model"
"github.com/1Panel-dev/1Panel/agent/app/task"
)
type AppDatabase struct {
ServiceName string `json:"PANEL_DB_HOST"`
DbName string `json:"PANEL_DB_NAME"`
DbUser string `json:"PANEL_DB_USER"`
Password string `json:"PANEL_DB_USER_PASSWORD"`
ServiceName string `json:"PANEL_DB_HOST"`
DbName string `json:"PANEL_DB_NAME"`
DbUser string `json:"PANEL_DB_USER"`
Password string `json:"PANEL_DB_USER_PASSWORD"`
DatabaseName string `json:"DATABASE_NAME"`
}
type AuthParam struct {
@@ -89,8 +96,11 @@ type AppProperty struct {
Website string `json:"website"`
Github string `json:"github"`
Document string `json:"document"`
Version float64 `json:"version"`
Architectures []string `json:"architectures"`
MemoryRequired int `json:"memoryRequired"`
GpuSupport bool `json:"gpuSupport"`
Version float64 `json:"version"`
Deprecated float64 `json:"deprecated"`
}
type AppConfigVersion struct {
@@ -117,6 +127,7 @@ type Locale struct {
ZhHant string `json:"zh-hant" yaml:"zh-hant"`
Zh string `json:"zh"`
Ko string `json:"ko"`
Tr string `json:"tr"`
}
type AppForm struct {
@@ -125,19 +136,20 @@ type AppForm struct {
}
type AppFormFields struct {
Type string `json:"type"`
LabelZh string `json:"labelZh"`
LabelEn string `json:"labelEn"`
Label Locale `json:"label"`
Required bool `json:"required"`
Default interface{} `json:"default"`
EnvKey string `json:"envKey"`
Disabled bool `json:"disabled"`
Edit bool `json:"edit"`
Rule string `json:"rule"`
Multiple bool `json:"multiple"`
Child interface{} `json:"child"`
Values []AppFormValue `json:"values"`
Type string `json:"type"`
LabelZh string `json:"labelZh"`
LabelEn string `json:"labelEn"`
Label Locale `json:"label"`
Description Locale `json:"description"`
Required bool `json:"required"`
Default interface{} `json:"default"`
EnvKey string `json:"envKey"`
Disabled bool `json:"disabled"`
Edit bool `json:"edit"`
Rule string `json:"rule"`
Multiple bool `json:"multiple"`
Child interface{} `json:"child"`
Values []AppFormValue `json:"values"`
}
type AppFormValue struct {
@@ -160,3 +172,16 @@ type AppInstallInfo struct {
Key string `json:"key"`
Name string `json:"name"`
}
type DelAppLink struct {
Ctx context.Context
Task *task.Task
Install *model.AppInstall
ForceDelete bool
}
type PHPForm struct {
AdditionalProperties struct {
FormFields []interface{} `yaml:"formFields"`
} `yaml:"additionalProperties"`
}
+120
View File
@@ -0,0 +1,120 @@
package dto
import (
"time"
)
type BackupOperate struct {
ID uint `json:"id"`
Name string `json:"name"`
Type string `json:"type" validate:"required"`
IsPublic bool `json:"isPublic"`
Bucket string `json:"bucket"`
AccessKey string `json:"accessKey"`
Credential string `json:"credential"`
BackupPath string `json:"backupPath"`
Vars string `json:"vars" validate:"required"`
RememberAuth bool `json:"rememberAuth"`
}
type BackupInfo struct {
ID uint `json:"id"`
Name string `json:"name"`
Type string `json:"type"`
IsPublic bool `json:"isPublic"`
Bucket string `json:"bucket"`
AccessKey string `json:"accessKey"`
Credential string `json:"credential"`
BackupPath string `json:"backupPath"`
Vars string `json:"vars"`
CreatedAt time.Time `json:"createdAt"`
RememberAuth bool `json:"rememberAuth"`
}
type ForBuckets struct {
Type string `json:"type" validate:"required"`
AccessKey string `json:"accessKey"`
Credential string `json:"credential" validate:"required"`
Vars string `json:"vars" validate:"required"`
}
type SyncFromMaster struct {
Name string `json:"name" validate:"required"`
Operation string `json:"operation" validate:"required,oneof=create delete update"`
Data string `json:"data"`
}
type BackupOption struct {
ID uint `json:"id"`
Name string `json:"name"`
Type string `json:"type"`
IsPublic bool `json:"isPublic"`
}
type CommonBackup struct {
Type string `json:"type" validate:"required,oneof=app mysql mariadb redis website postgresql mysql-cluster postgresql-cluster redis-cluster"`
Name string `json:"name"`
DetailName string `json:"detailName"`
Secret string `json:"secret"`
TaskID string `json:"taskID"`
FileName string `json:"fileName"`
Description string `json:"description"`
}
type CommonRecover struct {
DownloadAccountID uint `json:"downloadAccountID" validate:"required"`
Type string `json:"type" validate:"required,oneof=app mysql mariadb redis website postgresql mysql-cluster postgresql-cluster redis-cluster"`
Name string `json:"name"`
DetailName string `json:"detailName"`
File string `json:"file"`
Secret string `json:"secret"`
TaskID string `json:"taskID"`
BackupRecordID uint `json:"backupRecordID"`
}
type RecordSearch struct {
PageInfo
Type string `json:"type" validate:"required"`
Name string `json:"name"`
DetailName string `json:"detailName"`
}
type RecordSearchByCronjob struct {
PageInfo
CronjobID uint `json:"cronjobID" validate:"required"`
}
type BackupRecords struct {
ID uint `json:"id"`
CreatedAt time.Time `json:"createdAt"`
AccountType string `json:"accountType"`
AccountName string `json:"accountName"`
DownloadAccountID uint `json:"downloadAccountID"`
FileDir string `json:"fileDir"`
FileName string `json:"fileName"`
Description string `json:"description"`
}
type DownloadRecord struct {
DownloadAccountID uint `json:"downloadAccountID" validate:"required"`
FileDir string `json:"fileDir" validate:"required"`
FileName string `json:"fileName" validate:"required"`
}
type SearchForSize struct {
PageInfo
Type string `json:"type" validate:"required"`
Name string `json:"name"`
DetailName string `json:"detailName"`
Info string `json:"info"`
CronjobID uint `json:"cronjobID"`
OrderBy string `json:"orderBy"`
Order string `json:"order"`
}
type RecordFileSize struct {
ID uint `json:"id"`
Name string `json:"name"`
Size int64 `json:"size"`
}
@@ -7,7 +7,7 @@ import (
type SearchClamWithPage struct {
PageInfo
Info string `json:"info"`
OrderBy string `json:"orderBy" validate:"required,oneof=name status created_at"`
OrderBy string `json:"orderBy" validate:"required,oneof=name status createdAt"`
Order string `json:"order" validate:"required,oneof=null ascending descending"`
}
@@ -34,6 +34,7 @@ type ClamInfo struct {
Spec string `json:"spec"`
Description string `json:"description"`
AlertCount uint `json:"alertCount"`
AlertMethod string `json:"alertMethod"`
}
type ClamLogSearch struct {
@@ -74,6 +75,7 @@ type ClamCreate struct {
Description string `json:"description"`
AlertCount uint `json:"alertCount"`
AlertTitle string `json:"alertTitle"`
AlertMethod string `json:"alertMethod"`
}
type ClamUpdate struct {
@@ -87,6 +89,7 @@ type ClamUpdate struct {
Description string `json:"description"`
AlertCount uint `json:"alertCount"`
AlertTitle string `json:"alertTitle"`
AlertMethod string `json:"alertMethod"`
}
type ClamUpdateStatus struct {
@@ -2,7 +2,7 @@ package dto
type SearchCommandWithPage struct {
PageInfo
OrderBy string `json:"orderBy" validate:"required,oneof=name command created_at"`
OrderBy string `json:"orderBy" validate:"required,oneof=name command createdAt"`
Order string `json:"order" validate:"required,oneof=null ascending descending"`
GroupID uint `json:"groupID"`
Info string `json:"info"`
@@ -5,6 +5,12 @@ type SearchWithPage struct {
Info string `json:"info"`
}
type SearchPageWithType struct {
PageInfo
Info string `json:"info"`
Type string `json:"type"`
}
type PageInfo struct {
Page int `json:"page" validate:"required,number"`
PageSize int `json:"pageSize" validate:"required,number"`
@@ -27,6 +33,10 @@ type Operate struct {
Operation string `json:"operation" validate:"required"`
}
type SearchByFilter struct {
Filter string `json:"filter"`
}
type BatchDeleteReq struct {
Ids []uint `json:"ids" validate:"required"`
}
@@ -53,6 +63,15 @@ type OperationWithNameAndType struct {
Type string `json:"type" validate:"required"`
}
type UpdateGroup struct {
Group uint `json:"group"`
NewGroup uint `json:"newGroup"`
}
type OperateWithTask struct {
TaskID string `json:"taskID"`
}
type ForceDelete struct {
IDs []uint `json:"ids"`
ForceDelete bool `json:"forceDelete"`
@@ -8,7 +8,7 @@ type PageContainer struct {
PageInfo
Name string `json:"name"`
State string `json:"state" validate:"required,oneof=all created running paused restarting removing exited dead"`
OrderBy string `json:"orderBy" validate:"required,oneof=name state created_at"`
OrderBy string `json:"orderBy" validate:"required,oneof=name createdAt state"`
Order string `json:"order" validate:"required,oneof=null ascending descending"`
Filters string `json:"filters"`
ExcludeAppStore bool `json:"excludeAppStore"`
@@ -39,23 +39,55 @@ type ContainerInfo struct {
Websites []string `json:"websites"`
}
type ContainerOptions struct {
Name string `json:"name"`
State string `json:"state"`
}
type ContainerStatus struct {
All uint `json:"all"`
Created uint `json:"created"`
Running uint `json:"running"`
Paused uint `json:"paused"`
Restarting uint `json:"restarting"`
Removing uint `json:"removing"`
Exited uint `json:"exited"`
Dead uint `json:"dead"`
ContainerCount int `json:"containerCount"`
ComposeCount int `json:"composeCount"`
ComposeTemplateCount int `json:"composeTemplateCount"`
ImageCount int `json:"imageCount"`
NetworkCount int `json:"networkCount"`
VolumeCount int `json:"volumeCount"`
RepoCount int `json:"repoCount"`
ImageSize uint64 `json:"imageSize"`
}
type ResourceLimit struct {
CPU int `json:"cpu"`
Memory uint64 `json:"memory"`
}
type ContainerOperate struct {
TaskID string `json:"taskID"`
ContainerID string `json:"containerID"`
ForcePull bool `json:"forcePull"`
Name string `json:"name" validate:"required"`
Image string `json:"image" validate:"required"`
Network string `json:"network"`
Hostname string `json:"hostname"`
DomainName string `json:"domainName"`
MacAddr string `json:"macAddr"`
DNS []string `json:"dns"`
Ipv4 string `json:"ipv4"`
Ipv6 string `json:"ipv6"`
PublishAllPorts bool `json:"publishAllPorts"`
ExposedPorts []PortHelper `json:"exposedPorts"`
Tty bool `json:"tty"`
OpenStdin bool `json:"openStdin"`
WorkingDir string `json:"workingDir"`
User string `json:"user"`
Cmd []string `json:"cmd"`
Entrypoint []string `json:"entrypoint"`
CPUShares int64 `json:"cpuShares"`
@@ -69,7 +101,13 @@ type ContainerOperate struct {
RestartPolicy string `json:"restartPolicy"`
}
type ContainerCreateByCommand struct {
TaskID string `json:"taskID"`
Command string `json:"command"`
}
type ContainerUpgrade struct {
TaskID string `json:"taskID"`
Name string `json:"name" validate:"required"`
Image string `json:"image" validate:"required"`
ForcePull bool `json:"forcePull"`
@@ -131,6 +169,8 @@ type ContainerCommit struct {
Comment string `json:"comment"`
Author string `json:"author"`
Pause bool `json:"pause"`
TaskID string `json:"taskID"`
}
type ContainerPrune struct {
@@ -209,6 +249,7 @@ type ComposeContainer struct {
State string `json:"state"`
}
type ComposeCreate struct {
TaskID string `json:"taskID"`
Name string `json:"name"`
From string `json:"from" validate:"required,oneof=edit path template"`
File string `json:"file"`
@@ -235,3 +276,12 @@ type ContainerLog struct {
Tail uint `json:"tail"`
ContainerType string `json:"containerType"`
}
type StreamLog struct {
Compose string
Container string
Since string
Follow bool
Tail string
Type string
}
+149
View File
@@ -0,0 +1,149 @@
package dto
import (
"time"
)
type PageCronjob struct {
PageInfo
Info string `json:"info"`
OrderBy string `json:"orderBy" validate:"required,oneof=name status createdAt"`
Order string `json:"order" validate:"required,oneof=null ascending descending"`
}
type CronjobSpec struct {
Spec string `json:"spec" validate:"required"`
}
type CronjobOperate struct {
ID uint `json:"id"`
Name string `json:"name" validate:"required"`
Type string `json:"type" validate:"required"`
SpecCustom bool `json:"specCustom"`
Spec string `json:"spec" validate:"required"`
Executor string `json:"executor"`
ScriptMode string `json:"scriptMode"`
Script string `json:"script"`
Command string `json:"command"`
ContainerName string `json:"containerName"`
User string `json:"user"`
ScriptID uint `json:"scriptID"`
AppID string `json:"appID"`
Website string `json:"website"`
ExclusionRules string `json:"exclusionRules"`
DBType string `json:"dbType"`
DBName string `json:"dbName"`
URL string `json:"url"`
IsDir bool `json:"isDir"`
SourceDir string `json:"sourceDir"`
SnapshotRule SnapshotRule `json:"snapshotRule"`
SourceAccountIDs string `json:"sourceAccountIDs"`
DownloadAccountID uint `json:"downloadAccountID"`
RetainCopies int `json:"retainCopies" validate:"number,min=1"`
RetryTimes int `json:"retryTimes" validate:"number,min=0"`
Timeout uint `json:"timeout" validate:"number,min=1"`
IgnoreErr bool `json:"ignoreErr"`
Secret string `json:"secret"`
AlertCount uint `json:"alertCount"`
AlertTitle string `json:"alertTitle"`
AlertMethod string `json:"alertMethod"`
}
type SnapshotRule struct {
WithImage bool `json:"withImage"`
IgnoreAppIDs []uint `json:"ignoreAppIDs"`
}
type CronjobUpdateStatus struct {
ID uint `json:"id" validate:"required"`
Status string `json:"status" validate:"required"`
}
type CronjobDownload struct {
RecordID uint `json:"recordID" validate:"required"`
BackupAccountID uint `json:"backupAccountID" validate:"required"`
}
type CronjobClean struct {
IsDelete bool `json:"isDelete"`
CleanData bool `json:"cleanData"`
CronjobID uint `json:"cronjobID" validate:"required"`
CleanRemoteData bool `json:"cleanRemoteData"`
}
type CronjobBatchDelete struct {
CleanData bool `json:"cleanData"`
CleanRemoteData bool `json:"cleanRemoteData"`
IDs []uint `json:"ids" validate:"required"`
}
type CronjobInfo struct {
ID uint `json:"id"`
Name string `json:"name"`
Type string `json:"type"`
SpecCustom bool `json:"specCustom"`
Spec string `json:"spec"`
Executor string `json:"executor"`
ScriptMode string `json:"scriptMode"`
Script string `json:"script"`
Command string `json:"command"`
ContainerName string `json:"containerName"`
User string `json:"user"`
ScriptID uint `json:"scriptID"`
AppID string `json:"appID"`
Website string `json:"website"`
ExclusionRules string `json:"exclusionRules"`
DBType string `json:"dbType"`
DBName string `json:"dbName"`
URL string `json:"url"`
IsDir bool `json:"isDir"`
SourceDir string `json:"sourceDir"`
RetainCopies int `json:"retainCopies"`
RetryTimes int `json:"retryTimes"`
Timeout uint `json:"timeout"`
IgnoreErr bool `json:"ignoreErr"`
SnapshotRule SnapshotRule `json:"snapshotRule"`
SourceAccounts []string `json:"sourceAccounts"`
DownloadAccount string `json:"downloadAccount"`
SourceAccountIDs string `json:"sourceAccountIDs"`
DownloadAccountID uint `json:"downloadAccountID"`
LastRecordStatus string `json:"lastRecordStatus"`
LastRecordTime string `json:"lastRecordTime"`
Status string `json:"status"`
Secret string `json:"secret"`
AlertCount uint `json:"alertCount"`
}
type ScriptOptions struct {
ID uint `json:"id"`
Name string `json:"name"`
}
type SearchRecord struct {
PageInfo
CronjobID int `json:"cronjobID"`
StartTime time.Time `json:"startTime"`
EndTime time.Time `json:"endTime"`
Status string `json:"status"`
}
type Record struct {
ID uint `json:"id"`
TaskID string `json:"taskID"`
StartTime string `json:"startTime"`
Records string `json:"records"`
Status string `json:"status"`
Message string `json:"message"`
TargetPath string `json:"targetPath"`
Interval int `json:"interval"`
File string `json:"file"`
}
@@ -16,11 +16,12 @@ type DashboardBase struct {
KernelArch string `json:"kernelArch"`
KernelVersion string `json:"kernelVersion"`
VirtualizationSystem string `json:"virtualizationSystem"`
IpV4Addr string `json:"ipv4Addr"`
SystemProxy string `json:"SystemProxy"`
CPUCores int `json:"cpuCores"`
CPULogicalCores int `json:"cpuLogicalCores"`
CPUModelName string `json:"cpuModelName"`
IpV4Addr string `json:"ipV4Addr"`
SystemProxy string `json:"systemProxy"`
CPUCores int `json:"cpuCores"`
CPULogicalCores int `json:"cpuLogicalCores"`
CPUModelName string `json:"cpuModelName"`
CurrentInfo DashboardCurrent `json:"currentInfo"`
}
@@ -35,10 +36,25 @@ type OsInfo struct {
DiskSize int64 `json:"diskSize"`
}
type DashboardReq struct {
Scope string `json:"scope"`
IoOption string `json:"ioOption"`
NetOption string `json:"netOption"`
type NodeCurrent struct {
Load1 float64 `json:"load1"`
Load5 float64 `json:"load5"`
Load15 float64 `json:"load15"`
LoadUsagePercent float64 `json:"loadUsagePercent"`
CPUUsedPercent float64 `json:"cpuUsedPercent"`
CPUUsed float64 `json:"cpuUsed"`
CPUTotal int `json:"cpuTotal"`
MemoryTotal uint64 `json:"memoryTotal"`
MemoryAvailable uint64 `json:"memoryAvailable"`
MemoryUsed uint64 `json:"memoryUsed"`
MemoryUsedPercent float64 `json:"memoryUsedPercent"`
SwapMemoryTotal uint64 `json:"swapMemoryTotal"`
SwapMemoryAvailable uint64 `json:"swapMemoryAvailable"`
SwapMemoryUsed uint64 `json:"swapMemoryUsed"`
SwapMemoryUsedPercent float64 `json:"swapMemoryUsedPercent"`
}
type DashboardCurrent struct {
@@ -58,8 +74,11 @@ type DashboardCurrent struct {
CPUTotal int `json:"cpuTotal"`
MemoryTotal uint64 `json:"memoryTotal"`
MemoryAvailable uint64 `json:"memoryAvailable"`
MemoryUsed uint64 `json:"memoryUsed"`
MemoryFree uint64 `json:"memoryFree"`
MemoryShard uint64 `json:"memoryShard"`
MemoryCache uint64 `json:"memoryCache"`
MemoryAvailable uint64 `json:"memoryAvailable"`
MemoryUsedPercent float64 `json:"memoryUsedPercent"`
SwapMemoryTotal uint64 `json:"swapMemoryTotal"`
@@ -84,6 +103,10 @@ type DashboardCurrent struct {
ShotTime time.Time `json:"shotTime"`
}
type AppLauncherSync struct {
Keys []string `json:"keys"`
}
type DiskInfo struct {
Path string `json:"path"`
Type string `json:"type"`
@@ -114,6 +137,37 @@ type GPUInfo struct {
FanSpeed string `json:"fanSpeed"`
}
type AppLauncher struct {
Key string `json:"key"`
Type string `json:"type"`
Name string `json:"name"`
Icon string `json:"icon"`
Limit int `json:"limit"`
Description string `json:"description"`
Recommend int `json:"recommend"`
IsInstall bool `json:"isInstall"`
IsRecommend bool `json:"isRecommend"`
Detail []InstallDetail `json:"detail"`
}
type InstallDetail struct {
InstallID uint `json:"installID"`
DetailID uint `json:"detailID"`
Name string `json:"name"`
Version string `json:"version"`
Path string `json:"path"`
Status string `json:"status"`
WebUI string `json:"webUI"`
HttpPort int `json:"httpPort"`
HttpsPort int `json:"httpsPort"`
}
type LauncherOption struct {
Key string `json:"key"`
IsShow bool `json:"isShow"`
}
type XPUInfo struct {
DeviceID int `json:"deviceID"`
DeviceName string `json:"deviceName"`
@@ -4,14 +4,14 @@ import "time"
// common
type DBConfUpdateByFile struct {
Type string `json:"type" validate:"required,oneof=mysql mariadb postgresql redis"`
Type string `json:"type" validate:"required,oneof=mysql mariadb postgresql redis mysql-cluster postgresql-cluster"`
Database string `json:"database" validate:"required"`
File string `json:"file"`
}
type ChangeDBInfo struct {
ID uint `json:"id"`
From string `json:"from" validate:"required,oneof=local remote"`
Type string `json:"type" validate:"required,oneof=mysql mariadb postgresql"`
Type string `json:"type" validate:"required,oneof=mysql mariadb postgresql mysql-cluster postgresql-cluster"`
Database string `json:"database" validate:"required"`
Value string `json:"value" validate:"required"`
}
@@ -27,7 +27,7 @@ type MysqlDBSearch struct {
PageInfo
Info string `json:"info"`
Database string `json:"database" validate:"required"`
OrderBy string `json:"orderBy" validate:"required,oneof=name created_at"`
OrderBy string `json:"orderBy" validate:"required,oneof=name createdAt"`
Order string `json:"order" validate:"required,oneof=null ascending descending"`
}
@@ -74,19 +74,19 @@ type BindUser struct {
type MysqlLoadDB struct {
From string `json:"from" validate:"required,oneof=local remote"`
Type string `json:"type" validate:"required,oneof=mysql mariadb"`
Type string `json:"type" validate:"required,oneof=mysql mariadb mysql-cluster"`
Database string `json:"database" validate:"required"`
}
type MysqlDBDeleteCheck struct {
ID uint `json:"id" validate:"required"`
Type string `json:"type" validate:"required,oneof=mysql mariadb"`
Type string `json:"type" validate:"required,oneof=mysql mariadb mysql-cluster"`
Database string `json:"database" validate:"required"`
}
type MysqlDBDelete struct {
ID uint `json:"id" validate:"required"`
Type string `json:"type" validate:"required,oneof=mysql mariadb"`
Type string `json:"type" validate:"required,oneof=mysql mariadb mysql-cluster"`
Database string `json:"database" validate:"required"`
ForceDelete bool `json:"forceDelete"`
DeleteBackup bool `json:"deleteBackup"`
@@ -153,7 +153,7 @@ type MysqlVariables struct {
}
type MysqlVariablesUpdate struct {
Type string `json:"type" validate:"required,oneof=mysql mariadb"`
Type string `json:"type" validate:"required,oneof=mysql mariadb mysql-cluster"`
Database string `json:"database" validate:"required"`
Variables []MysqlVariablesUpdateHelper `json:"variables"`
}
@@ -174,6 +174,7 @@ type RedisConfUpdate struct {
Timeout string `json:"timeout"`
Maxclients string `json:"maxclients"`
Maxmemory string `json:"maxmemory"`
DBType string `json:"dbType" validate:"required,oneof=redis redis-cluster"`
}
type RedisConfPersistenceUpdate struct {
Database string `json:"database" validate:"required"`
@@ -181,6 +182,7 @@ type RedisConfPersistenceUpdate struct {
Appendonly string `json:"appendonly"`
Appendfsync string `json:"appendfsync"`
Save string `json:"save"`
DBType string `json:"dbType" validate:"required,oneof=redis redis-cluster"`
}
type RedisConf struct {
@@ -236,7 +238,7 @@ type DatabaseSearch struct {
PageInfo
Info string `json:"info"`
Type string `json:"type"`
OrderBy string `json:"orderBy" validate:"required,oneof=name created_at"`
OrderBy string `json:"orderBy" validate:"required,oneof=name createdAt"`
Order string `json:"order" validate:"required,oneof=null ascending descending"`
}
@@ -319,3 +321,8 @@ type DatabaseDelete struct {
ForceDelete bool `json:"forceDelete"`
DeleteBackup bool `json:"deleteBackup"`
}
type LoadRedisStatus struct {
Name string `json:"name" validate:"required"`
Type string `json:"type" validate:"required"`
}
@@ -6,7 +6,7 @@ type PostgresqlDBSearch struct {
PageInfo
Info string `json:"info"`
Database string `json:"database" validate:"required"`
OrderBy string `json:"orderBy" validate:"required,oneof=name created_at"`
OrderBy string `json:"orderBy" validate:"required,oneof=name createdAt"`
Order string `json:"order" validate:"required,oneof=null ascending descending"`
}
@@ -4,9 +4,13 @@ type DaemonJsonUpdateByFile struct {
File string `json:"file"`
}
type DockerStatus struct {
IsActive bool `json:"isActive"`
IsExist bool `json:"isExist"`
}
type DaemonJsonConf struct {
IsSwarm bool `json:"isSwarm"`
Status string `json:"status"`
Version string `json:"version"`
Mirrors []string `json:"registryMirrors"`
Registries []string `json:"insecureRegistries"`
@@ -19,7 +19,7 @@ type Fail2BanSearch struct {
}
type Fail2BanUpdate struct {
Key string `json:"key" validate:"required,oneof=port bantime findtime maxretry banaction logpath"`
Key string `json:"key" validate:"required,oneof=port bantime findtime maxretry banaction logpath port"`
Value string `json:"value"`
}
@@ -2,7 +2,8 @@ package dto
type FirewallBaseInfo struct {
Name string `json:"name"`
Status string `json:"status"`
IsExist bool `json:"isExist"`
IsActive bool `json:"isActive"`
Version string `json:"version"`
PingStatus string `json:"pingStatus"`
}
+29
View File
@@ -0,0 +1,29 @@
package dto
type GroupCreate struct {
ID uint `json:"id"`
Name string `json:"name" validate:"required"`
Type string `json:"type" validate:"required"`
}
type GroupSearch struct {
Type string `json:"type" validate:"required"`
}
type GroupUpdate struct {
ID uint `json:"id"`
Name string `json:"name"`
Type string `json:"type" validate:"required"`
IsDefault bool `json:"isDefault"`
}
type GroupInfo struct {
ID uint `json:"id"`
Name string `json:"name"`
Type string `json:"type"`
IsDefault bool `json:"isDefault"`
}
type OperateByType struct {
Type string `json:"type"`
}
@@ -15,6 +15,7 @@ type ImageLoad struct {
}
type ImageBuild struct {
TaskID string `json:"taskID"`
From string `json:"from" validate:"required"`
Name string `json:"name" validate:"required"`
Dockerfile string `json:"dockerfile" validate:"required"`
@@ -22,6 +23,7 @@ type ImageBuild struct {
}
type ImagePull struct {
TaskID string `json:"taskID"`
RepoID uint `json:"repoID"`
ImageName string `json:"imageName" validate:"required"`
}
@@ -32,6 +34,7 @@ type ImageTag struct {
}
type ImagePush struct {
TaskID string `json:"taskID"`
RepoID uint `json:"repoID" validate:"required"`
TagName string `json:"tagName" validate:"required"`
Name string `json:"name" validate:"required"`
@@ -6,8 +6,8 @@ type ImageRepoCreate struct {
Name string `json:"name" validate:"required"`
DownloadUrl string `json:"downloadUrl"`
Protocol string `json:"protocol"`
Username string `json:"username" validate:"max=256"`
Password string `json:"password" validate:"max=256"`
Username string `json:"username"`
Password string `json:"password"`
Auth bool `json:"auth"`
}
@@ -15,8 +15,8 @@ type ImageRepoUpdate struct {
ID uint `json:"id"`
DownloadUrl string `json:"downloadUrl"`
Protocol string `json:"protocol"`
Username string `json:"username" validate:"max=256"`
Password string `json:"password" validate:"max=256"`
Username string `json:"username"`
Password string `json:"password"`
Auth bool `json:"auth"`
}
+15
View File
@@ -0,0 +1,15 @@
package dto
import (
"github.com/1Panel-dev/1Panel/agent/app/model"
)
type SearchTaskLogReq struct {
Status string `json:"status"`
Type string `json:"type"`
PageInfo
}
type TaskDTO struct {
model.Task
}
@@ -14,3 +14,15 @@ type MonitorData struct {
Date []time.Time `json:"date"`
Value []interface{} `json:"value"`
}
type MonitorSetting struct {
MonitorStatus string `json:"monitorStatus"`
MonitorStoreDays string `json:"monitorStoreDays"`
MonitorInterval string `json:"monitorInterval"`
DefaultNetwork string `json:"defaultNetwork"`
}
type MonitorSettingUpdate struct {
Key string `json:"key" validate:"required,oneof=MonitorStatus MonitorStoreDays MonitorInterval DefaultNetwork"`
Value string `json:"value"`
}
@@ -1,8 +1,8 @@
package dto
import (
"github.com/1Panel-dev/1Panel/backend/app/model"
"github.com/1Panel-dev/1Panel/backend/utils/nginx/components"
"github.com/1Panel-dev/1Panel/agent/app/model"
"github.com/1Panel-dev/1Panel/agent/utils/nginx/components"
)
type NginxFull struct {
@@ -33,6 +33,13 @@ type NginxAuth struct {
Remark string `json:"remark"`
}
type NginxPathAuth struct {
Username string `json:"username"`
Remark string `json:"remark"`
Path string `json:"path"`
Name string `json:"name"`
}
type NginxKey string
const (
@@ -57,3 +64,31 @@ var StaticFileKeyMap = map[NginxKey]struct {
CACHE: {},
ProxyCache: {},
}
type NginxUpstream struct {
Name string `json:"name"`
Algorithm string `json:"algorithm"`
Servers []NginxUpstreamServer `json:"servers"`
Content string `json:"content"`
}
type NginxUpstreamServer struct {
Server string `json:"server"`
Weight int `json:"weight"`
FailTimeout string `json:"failTimeout"`
MaxFails int `json:"maxFails"`
MaxConns int `json:"maxConns"`
Flag string `json:"flag"`
}
var LBAlgorithms = map[string]struct{}{"ip_hash": {}, "least_conn": {}}
var RealIPKeys = map[string]struct{}{"X-Forwarded-For": {}, "X-Real-IP": {}, "CF-Connecting-IP": {}}
type NginxModule struct {
Name string `json:"name"`
Script string `json:"script"`
Packages []string `json:"packages"`
Params string `json:"params"`
Enable bool `json:"enable"`
}
@@ -1,17 +1,19 @@
package request
import (
"github.com/1Panel-dev/1Panel/backend/app/dto"
"github.com/1Panel-dev/1Panel/backend/constant"
"github.com/1Panel-dev/1Panel/agent/app/dto"
"github.com/1Panel-dev/1Panel/agent/app/model"
"github.com/1Panel-dev/1Panel/agent/constant"
)
type AppSearch struct {
dto.PageInfo
Name string `json:"name"`
Tags []string `json:"tags"`
Type string `json:"type"`
Recommend bool `json:"recommend"`
Resource string `json:"resource"`
Name string `json:"name"`
Tags []string `json:"tags"`
Type string `json:"type"`
Recommend bool `json:"recommend"`
Resource string `json:"resource"`
ShowCurrentArch bool `json:"showCurrentArch"`
}
type AppInstallCreate struct {
@@ -19,6 +21,7 @@ type AppInstallCreate struct {
Params map[string]interface{} `json:"params"`
Name string `json:"name" validate:"required"`
Services map[string]string `json:"services"`
TaskID string `json:"taskID"`
AppContainerConfig
}
@@ -34,6 +37,9 @@ type AppContainerConfig struct {
HostMode bool `json:"hostMode"`
PullImage bool `json:"pullImage"`
GpuConfig bool `json:"gpuConfig"`
WebUI string `json:"webUI"`
Type string `json:"type"`
SpecifyIP string `json:"specifyIP"`
}
type AppInstalledSearch struct {
@@ -72,6 +78,9 @@ type AppInstalledOperate struct {
Backup bool `json:"backup"`
PullImage bool `json:"pullImage"`
DockerCompose string `json:"dockerCompose"`
TaskID string `json:"taskID"`
DeleteImage bool `json:"deleteImage"`
Favorite bool `json:"favorite"`
}
type AppInstallUpgrade struct {
@@ -80,6 +89,16 @@ type AppInstallUpgrade struct {
Backup bool `json:"backup"`
PullImage bool `json:"pullImage"`
DockerCompose string `json:"dockerCompose"`
TaskID string `json:"taskID"`
}
type AppInstallDelete struct {
Install model.AppInstall
DeleteBackup bool `json:"deleteBackup"`
ForceDelete bool `json:"forceDelete"`
DeleteDB bool `json:"deleteDB"`
DeleteImage bool `json:"deleteImage"`
TaskID string `json:"taskID"`
}
type AppInstalledUpdate struct {
@@ -88,6 +107,11 @@ type AppInstalledUpdate struct {
AppContainerConfig
}
type AppConfigUpdate struct {
InstallID uint `json:"installID" validate:"required"`
WebUI string `json:"webUI"`
}
type AppInstalledIgnoreUpgrade struct {
DetailID uint `json:"detailID" validate:"required"`
Operate string `json:"operate" validate:"required,oneof=cancel ignore"`
@@ -0,0 +1,7 @@
package request
type AppIgnoreUpgradeReq struct {
AppID uint `json:"appID" validate:"required"`
AppDetailID uint `json:"appDetailID"`
Scope string `json:"scope" validate:"required,oneof=all version"`
}
+5
View File
@@ -0,0 +1,5 @@
package request
type ReqWithID struct {
ID uint `json:"id" validate:"required"`
}
@@ -1,8 +1,8 @@
package request
import (
"github.com/1Panel-dev/1Panel/backend/app/dto"
"github.com/1Panel-dev/1Panel/backend/utils/files"
"github.com/1Panel-dev/1Panel/agent/app/dto"
"github.com/1Panel-dev/1Panel/agent/utils/files"
)
type FileOption struct {
@@ -76,7 +76,8 @@ type FileRename struct {
}
type FilePathCheck struct {
Path string `json:"path" validate:"required"`
Path string `json:"path" validate:"required"`
WithInit bool `json:"withInit"`
}
type FilePathsCheck struct {
@@ -91,11 +92,12 @@ type FileWget struct {
}
type FileMove struct {
Type string `json:"type" validate:"required"`
OldPaths []string `json:"oldPaths" validate:"required"`
NewPath string `json:"newPath" validate:"required"`
Name string `json:"name"`
Cover bool `json:"cover"`
Type string `json:"type" validate:"required"`
OldPaths []string `json:"oldPaths" validate:"required"`
NewPath string `json:"newPath" validate:"required"`
Name string `json:"name"`
Cover bool `json:"cover"`
CoverPaths []string `json:"coverPaths"`
}
type FileDownload struct {
@@ -132,6 +134,14 @@ type FileReadByLineReq struct {
ID uint `json:"ID"`
Name string `json:"name"`
Latest bool `json:"latest"`
TaskReq
}
type TaskReq struct {
TaskID string `json:"taskID"`
TaskType string `json:"taskType"`
TaskOperate string `json:"taskOperate"`
ResourceID uint `json:"resourceID"`
}
type FileExistReq struct {
@@ -26,13 +26,15 @@ type HostToolConfig struct {
}
type SupervisorProcessConfig struct {
Name string `json:"name"`
Operate string `json:"operate"`
Command string `json:"command"`
User string `json:"user"`
Dir string `json:"dir"`
Numprocs string `json:"numprocs"`
Name string `json:"name"`
Operate string `json:"operate"`
Command string `json:"command"`
User string `json:"user"`
Dir string `json:"dir"`
Numprocs string `json:"numprocs"`
AutoRestart string `json:"autoRestart"`
}
type SupervisorProcessFileReq struct {
Name string `json:"name" validate:"required"`
Operate string `json:"operate" validate:"required,oneof=get clear update" `
+47
View File
@@ -0,0 +1,47 @@
package request
import "github.com/1Panel-dev/1Panel/agent/app/dto"
type McpServerSearch struct {
dto.PageInfo
Name string `json:"name"`
Sync bool `json:"sync"`
}
type McpServerCreate struct {
Name string `json:"name" validate:"required"`
Command string `json:"command" validate:"required"`
Environments []Environment `json:"environments"`
Volumes []Volume `json:"volumes"`
Port int `json:"port" validate:"required"`
ContainerName string `json:"containerName"`
BaseURL string `json:"baseUrl"`
SsePath string `json:"ssePath"`
HostIP string `json:"hostIP"`
}
type McpServerUpdate struct {
ID uint `json:"id" validate:"required"`
McpServerCreate
}
type McpServerDelete struct {
ID uint `json:"id" validate:"required"`
}
type McpServerOperate struct {
ID uint `json:"id" validate:"required"`
Operate string `json:"operate" validate:"required"`
}
type McpBindDomain struct {
Domain string `json:"domain" validate:"required"`
SSLID uint `json:"sslID"`
IPList string `json:"ipList"`
}
type McpBindDomainUpdate struct {
WebsiteID uint `json:"websiteID" validate:"required"`
SSLID uint `json:"sslID"`
IPList string `json:"ipList"`
}
@@ -1,6 +1,6 @@
package request
import "github.com/1Panel-dev/1Panel/backend/app/dto"
import "github.com/1Panel-dev/1Panel/agent/app/dto"
type NginxConfigFileUpdate struct {
Content string `json:"content" validate:"required"`
@@ -24,6 +24,12 @@ type NginxRewriteReq struct {
Name string `json:"name" validate:"required"`
}
type CustomRewriteOperate struct {
Operate string `json:"operate" validate:"required,oneof=create delete"`
Content string `json:"content"`
Name string `json:"name"`
}
type NginxRewriteUpdate struct {
WebsiteID uint `json:"websiteId" validate:"required"`
Name string `json:"name" validate:"required"`
@@ -36,6 +42,17 @@ type NginxProxyUpdate struct {
Name string `json:"name" validate:"required"`
}
type NginxProxyCacheUpdate struct {
WebsiteID uint `json:"websiteID" validate:"required"`
Open bool `json:"open"`
CacheLimit int `json:"cacheLimit" validate:"required"`
CacheLimitUnit string `json:"cacheLimitUnit" validate:"required"`
ShareCache int `json:"shareCache" validate:"required"`
ShareCacheUnit string `json:"shareCacheUnit" validate:"required"`
CacheExpire int `json:"cacheExpire" validate:"required"`
CacheExpireUnit string `json:"cacheExpireUnit" validate:"required"`
}
type NginxAuthUpdate struct {
WebsiteID uint `json:"websiteID" validate:"required"`
Operate string `json:"operate" validate:"required"`
@@ -44,6 +61,16 @@ type NginxAuthUpdate struct {
Remark string `json:"remark"`
}
type NginxPathAuthUpdate struct {
WebsiteID uint `json:"websiteID" validate:"required"`
Operate string `json:"operate" validate:"required"`
Name string `json:"name"`
Username string `json:"username"`
Password string `json:"password"`
Path string `json:"path"`
Remark string `json:"remark"`
}
type NginxAuthReq struct {
WebsiteID uint `json:"websiteID" validate:"required"`
}
@@ -85,3 +112,17 @@ type NginxRedirectUpdate struct {
Content string `json:"content" validate:"required"`
Name string `json:"name" validate:"required"`
}
type NginxBuildReq struct {
TaskID string `json:"taskID" validate:"required"`
Mirror string `json:"mirror" validate:"required"`
}
type NginxModuleUpdate struct {
Operate string `json:"operate" validate:"required,oneof=create delete update"`
Name string `json:"name" validate:"required"`
Script string `json:"script"`
Packages string `json:"packages"`
Enable bool `json:"enable"`
Params string `json:"params"`
}
@@ -1,6 +1,6 @@
package request
import "github.com/1Panel-dev/1Panel/backend/app/dto"
import "github.com/1Panel-dev/1Panel/agent/app/dto"
type PHPExtensionsSearch struct {
dto.PageInfo

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