diff --git a/404.html b/404.html index 0e1034d51..042cba2de 100644 --- a/404.html +++ b/404.html @@ -4,10 +4,10 @@ Page Not Found | Zealot - - + + -
Skip to main content

Page Not Found

We could not find what you were looking for.

Please contact the owner of the site that linked you to the original URL and let them know their link is broken.

+
Skip to main content

Page Not Found

We could not find what you were looking for.

Please contact the owner of the site that linked you to the original URL and let them know their link is broken.

\ No newline at end of file diff --git a/assets/js/00e0c5f0.53553b6e.js b/assets/js/00e0c5f0.53553b6e.js new file mode 100644 index 000000000..aea80f3ec --- /dev/null +++ b/assets/js/00e0c5f0.53553b6e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[9966],{1793:(e,s,t)=>{t.r(s),t.d(s,{assets:()=>l,contentTitle:()=>n,default:()=>u,frontMatter:()=>r,metadata:()=>i,toc:()=>d});var o=t(5893),a=t(1151);const r={},n="Data storages",i={id:"self-hosted/storage",title:"Data storages",description:"Here is a list of all the data storages required by the Zealot service,",source:"@site/versioned_docs/version-5.1.0/self-hosted/storage.md",sourceDirName:"self-hosted",slug:"/self-hosted/storage",permalink:"/docs/5.1.0/self-hosted/storage",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.1.0/self-hosted/storage.md",tags:[],version:"5.1.0",frontMatter:{},sidebar:"selfHosted",previous:{title:"Schedule Jobs",permalink:"/docs/5.1.0/self-hosted/configuration/schedule-jobs"}},l={},d=[{value:"Postgres",id:"postgres",level:2},{value:"Redis",id:"redis",level:2},{value:"File storage",id:"file-storage",level:2},{value:"Backup storage",id:"backup-storage",level:2}];function c(e){const s={code:"code",h1:"h1",h2:"h2",li:"li",p:"p",ul:"ul",...(0,a.a)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(s.h1,{id:"data-storages",children:"Data storages"}),"\n",(0,o.jsx)(s.p,{children:"Here is a list of all the data storages required by the Zealot service,\nfor those who are able to manually backup and restore data before better backup management tools are available."}),"\n",(0,o.jsx)(s.h2,{id:"postgres",children:"Postgres"}),"\n",(0,o.jsx)(s.p,{children:"This is used to store and manage all data related to Zealot, so it goes without saying."}),"\n",(0,o.jsx)(s.h2,{id:"redis",children:"Redis"}),"\n",(0,o.jsx)(s.p,{children:"Currently only the sidekiq asynchronous task service is using it to store some task status and statistics."}),"\n",(0,o.jsx)(s.h2,{id:"file-storage",children:"File storage"}),"\n",(0,o.jsxs)(s.p,{children:["The Zealot service relies on postgresql, redis and some other disk storage for uploaded application and debug files.\nIt is currently stored in the filesystem in the ",(0,o.jsx)(s.code,{children:"public/uploads"})," directory."]}),"\n",(0,o.jsxs)(s.ul,{children:["\n",(0,o.jsx)(s.li,{children:"apps The directory for uploading applications"}),"\n",(0,o.jsx)(s.li,{children:"debugs_files directory for uploading debug files"}),"\n"]}),"\n",(0,o.jsx)(s.h2,{id:"backup-storage",children:"Backup storage"}),"\n",(0,o.jsx)(s.p,{children:"The Zealot service currently supports command-generated backup data, which will contain\nthe database and binary packages of the uploaded apps and debug files."}),"\n",(0,o.jsxs)(s.p,{children:["The backup data is currently stored in the file system in the ",(0,o.jsx)(s.code,{children:"public/backup"})," directory."]})]})}function u(e={}){const{wrapper:s}={...(0,a.a)(),...e.components};return s?(0,o.jsx)(s,{...e,children:(0,o.jsx)(c,{...e})}):c(e)}},1151:(e,s,t)=>{t.d(s,{Z:()=>i,a:()=>n});var o=t(7294);const a={},r=o.createContext(a);function n(e){const s=o.useContext(r);return o.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function i(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:n(e.components),o.createElement(r.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/011af8e2.760f9b1f.js b/assets/js/011af8e2.760f9b1f.js new file mode 100644 index 000000000..a1edb6c52 --- /dev/null +++ b/assets/js/011af8e2.760f9b1f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[6142],{6777:(t,n,e)=>{e.r(n),e.d(n,{assets:()=>c,contentTitle:()=>m,default:()=>l,frontMatter:()=>a,metadata:()=>d,toc:()=>u});var i=e(5893),o=e(1151),s=e(9965),r=e(4996);const a={},m="System informations",d={id:"user-guide/administrator/monitoring/system-info",title:"System informations",description:"{e.d(n,{Z:()=>a,a:()=>r});var i=e(7294);const o={},s=i.createContext(o);function r(t){const n=i.useContext(s);return i.useMemo((function(){return"function"==typeof t?t(n):{...n,...t}}),[n,t])}function a(t){let n;return n=t.disableParentContext?"function"==typeof t.components?t.components(o):t.components||o:r(t.components),i.createElement(s.Provider,{value:n},t.children)}}}]); \ No newline at end of file diff --git a/assets/js/01c82eb1.c7029c0d.js b/assets/js/01c82eb1.c7029c0d.js new file mode 100644 index 000000000..dcb03c9db --- /dev/null +++ b/assets/js/01c82eb1.c7029c0d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[7429],{852:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>a,contentTitle:()=>t,default:()=>o,frontMatter:()=>i,metadata:()=>l,toc:()=>c});var d=s(5893),r=s(1151);const i={sidebar_label:"Apps"},t="App APIs",l={id:"developer-guide/api/apps",title:"App APIs",description:"Upload an app",source:"@site/versioned_docs/version-5.2.0/developer-guide/api/apps.md",sourceDirName:"developer-guide/api",slug:"/developer-guide/api/apps",permalink:"/docs/developer-guide/api/apps",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.2.0/developer-guide/api/apps.md",tags:[],version:"5.2.0",frontMatter:{sidebar_label:"Apps"},sidebar:"developerGuide",previous:{title:"APIs",permalink:"/docs/developer-guide/api"},next:{title:"Debug Files",permalink:"/docs/developer-guide/api/debug_files"}},a={},c=[{value:"Upload an app",id:"upload-an-app",level:2},{value:"Parameters",id:"parameters",level:3},{value:"Return body",id:"return-body",level:4},{value:"List apps",id:"list-apps",level:2},{value:"Parameters",id:"parameters-1",level:3},{value:"Return body",id:"return-body-1",level:3},{value:"Get an app",id:"get-an-app",level:2},{value:"Parameters",id:"parameters-2",level:3},{value:"Return body",id:"return-body-2",level:3},{value:"Get versions list of app",id:"get-versions-list-of-app",level:2},{value:"Parameters",id:"parameters-3",level:3},{value:"Return body",id:"return-body-3",level:3},{value:"Get the latest version of app",id:"get-the-latest-version-of-app",level:2},{value:"Parameters",id:"parameters-4",level:3},{value:"Return body",id:"return-body-4",level:3},{value:"Check version exists",id:"check-version-exists",level:2},{value:"Parameters",id:"parameters-5",level:3},{value:"Return body",id:"return-body-5",level:3}];function h(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",li:"li",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,r.a)(),...e.components};return(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)(n.h1,{id:"app-apis",children:"App APIs"}),"\n",(0,d.jsx)(n.h2,{id:"upload-an-app",children:"Upload an app"}),"\n",(0,d.jsx)(n.p,{children:"This allows you to upload an single iOS, Android or macOS file."}),"\n",(0,d.jsx)(n.pre,{children:(0,d.jsx)(n.code,{children:"POST /api/apps/upload\n"})}),"\n",(0,d.jsx)(n.h3,{id:"parameters",children:"Parameters"}),"\n",(0,d.jsx)(n.admonition,{type:"info",children:(0,d.jsxs)(n.p,{children:[(0,d.jsx)(n.a,{href:"/docs/developer-guide/api#authentication",children:"Authentication"})," required."]})}),"\n",(0,d.jsxs)(n.table,{children:[(0,d.jsx)(n.thead,{children:(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.th,{children:"Attribute"}),(0,d.jsx)(n.th,{children:"Type"}),(0,d.jsx)(n.th,{children:"Required"}),(0,d.jsx)(n.th,{children:"Description"})]})}),(0,d.jsxs)(n.tbody,{children:[(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:"file"}),(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"File"})}),(0,d.jsx)(n.td,{children:"true"}),(0,d.jsx)(n.td,{children:"an App file"})]}),(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:"channel_key"}),(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"String"})}),(0,d.jsx)(n.td,{children:"false"}),(0,d.jsxs)(n.td,{children:["Channel key",(0,d.jsx)("br",{}),"Create a new App if leave it empty"]})]}),(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:"name"}),(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"String"})}),(0,d.jsx)(n.td,{children:"false"}),(0,d.jsxs)(n.td,{children:["the name of App",(0,d.jsx)("br",{}),"Use app name from parsed metadata in given file if leave it empty"]})]}),(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:"release_type"}),(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"String"})}),(0,d.jsx)(n.td,{children:"false"}),(0,d.jsx)(n.td,{children:"Eg, debug, beta, adhoc, release, enterprise \u7b49"})]}),(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:"source"}),(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"String"})}),(0,d.jsx)(n.td,{children:"false"}),(0,d.jsxs)(n.td,{children:["the source of upload (default is ",(0,d.jsx)(n.code,{children:"api"}),")"]})]}),(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:"changelog"}),(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"String"})}),(0,d.jsx)(n.td,{children:"false"}),(0,d.jsxs)(n.td,{children:["Changelog",(0,d.jsx)("br",{}),"Avaiables in plain text or JSON formatted struct"]})]}),(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:"branch"}),(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"String"})}),(0,d.jsx)(n.td,{children:"false"}),(0,d.jsx)(n.td,{children:"a branch name from git"})]}),(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:"git_commit"}),(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"String"})}),(0,d.jsx)(n.td,{children:"false"}),(0,d.jsx)(n.td,{children:"git commit"})]}),(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:"ci_url"}),(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"String"})}),(0,d.jsx)(n.td,{children:"false"}),(0,d.jsx)(n.td,{children:"the build url of a C"})]}),(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:"custom_fields"}),(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"String"})}),(0,d.jsx)(n.td,{children:"false"}),(0,d.jsxs)(n.td,{children:["JSON formatted custom fileds",(0,d.jsx)("br",{}),"It could configures and display title, ",(0,d.jsx)("br",{}),"value and icon from fontawesome in a Release page from an App"]})]})]})]}),"\n",(0,d.jsxs)(n.p,{children:["For ",(0,d.jsx)(n.code,{children:"changelog"})," attribute which it accepts both ",(0,d.jsx)(n.code,{children:"plain text"})," and ",(0,d.jsx)(n.code,{children:"JSON"})," formatted contents:"]}),"\n",(0,d.jsxs)(n.p,{children:[(0,d.jsx)(n.strong,{children:"plain text"}),":"]}),"\n",(0,d.jsx)(n.pre,{children:(0,d.jsx)(n.code,{children:"message 1\\nmessage 2\n"})}),"\n",(0,d.jsxs)(n.p,{children:[(0,d.jsx)(n.strong,{children:"JSON"}),":"]}),"\n",(0,d.jsx)(n.pre,{children:(0,d.jsx)(n.code,{children:'[\n {\n "message": "message 1",\n "author": "admin",\n "email": "admin@zealot.com",\n "date": "2021-11-11 11:11:11"\n },\n {\n "message": "message 1",\n "author": "developer",\n "email": "developer@zealot.com",\n "date": "2021-11-11 11:11:11"\n }\n]\n'})}),"\n",(0,d.jsxs)(n.p,{children:["For ",(0,d.jsx)(n.code,{children:"custom_fields"})," attribute which it use ",(0,d.jsx)(n.code,{children:"JSON"})," formatted struct to build from each key-value. for example, Display country name like ",(0,d.jsx)(n.code,{children:"country=China"})," with icon ",(0,d.jsx)(n.a,{href:"https://fontawesome.com/v5.15/icons/flag?style=solid",children:"flag"}),":"]}),"\n",(0,d.jsx)(n.pre,{children:(0,d.jsx)(n.code,{className:"language-diff",children:'curl -X POST \\\n \'https://YOUR_ZEALOT_URL/api/apps/upload\' \\\n --form \'token="token"\' \\\n --form \'channel_key="channel_key"\' \\\n+ --form \'custom_fields="[{"name":"country","value":"China","icon":"fas fa-flag"}]"\' \\\n --form \'file=@/path/to/your/app\'\n'})}),"\n",(0,d.jsx)(n.h4,{id:"return-body",children:"Return body"}),"\n",(0,d.jsx)(n.pre,{children:(0,d.jsx)(n.code,{className:"language-json",children:'{\n\t"id": 50,\n\t"version": 7,\n\t"app_name": "Test Android",\n\t"bundle_id": "com.test.app",\n\t"release_version": "1.0",\n\t"build_version": "1",\n\t"source": "SOURCE",\n\t"branch": "master",\n\t"git_commit": "e9de48513dbb6abfbxxxxxxxxxxxxxxxxxxxxxxxx",\n\t"ci_url": "",\n\t"size": 1565486,\n\t"icon_url": "/uploads/apps/a1/r1/icons/app_icon.png",\n\t"release_url": "https://YOUR_ZEALOT_URL/channels/1XmpC/releases/1",\n\t"install_url": "https://YOUR_ZEALOT_URL/download/releases/1",\n\t"qrcode_url": "https://YOUR_ZEALOT_URL/channels/1XmpC/releases/1/qrcode?size=thumb",\n\t"changelog": [\n\t\t{\n\t\t\t"message": "Changelog message 1"\n\t\t},\n {\n\t\t\t"message": "Changelog message 2"\n\t\t}\n\t],\n "text_changelog": "- Changelog message 1\\n- Changelog message 2",\n\t"custom_fields": [],\n\t"created_at": "2021-09-01T11:43:33.977+08:00",\n\t"app": {\n\t\t"id": 1,\n\t\t"name": "App name"\n\t},\n\t"scheme": {\n\t\t"id": 8,\n\t\t"name": "Test"\n\t},\n\t"channel": {\n\t\t"slug": "1XmpC",\n\t\t"name": "Android",\n\t\t"device_type": "android",\n\t\t"bundle_id": "*",\n\t\t"git_url": null,\n\t\t"has_password": false\n\t}\n}\n'})}),"\n",(0,d.jsx)(n.h2,{id:"list-apps",children:"List apps"}),"\n",(0,d.jsx)(n.p,{children:"Get a list of app."}),"\n",(0,d.jsx)(n.p,{children:"This function takes pagination parameters page and per_page to restrict the list of app."}),"\n",(0,d.jsx)(n.pre,{children:(0,d.jsx)(n.code,{children:"GET /api/apps\n"})}),"\n",(0,d.jsx)(n.h3,{id:"parameters-1",children:"Parameters"}),"\n",(0,d.jsxs)(n.table,{children:[(0,d.jsx)(n.thead,{children:(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.th,{children:"Attribute"}),(0,d.jsx)(n.th,{children:"Type"}),(0,d.jsx)(n.th,{children:"Required"}),(0,d.jsx)(n.th,{children:"Description"})]})}),(0,d.jsxs)(n.tbody,{children:[(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:"page"}),(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"Integer"})}),(0,d.jsx)(n.td,{children:"false"}),(0,d.jsxs)(n.td,{children:["Page number (default: ",(0,d.jsx)(n.code,{children:"1"}),")"]})]}),(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:"per_page"}),(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"Integer"})}),(0,d.jsx)(n.td,{children:"false"}),(0,d.jsxs)(n.td,{children:["Number of items to list per page (default: ",(0,d.jsx)(n.code,{children:"25"}),", max: ",(0,d.jsx)(n.code,{children:"100"}),")."]})]})]})]}),"\n",(0,d.jsx)(n.h3,{id:"return-body-1",children:"Return body"}),"\n",(0,d.jsx)(n.pre,{children:(0,d.jsx)(n.code,{className:"language-json",children:'[\n {\n "id": 1,\n "name": "Zealot",\n "schemes": [\n {\n "id": 1,\n "name": "Adhoc",\n "channels": [\n {\n "slug": "X1IXN",\n "name": "Android",\n "device_type": "android",\n "bundle_id": "*",\n "git_url": null,\n "has_password": false\n },\n {\n "slug": "O1qHk",\n "name": "iOS",\n "device_type": "ios",\n "bundle_id": "*",\n "git_url": null,\n "has_password": false\n }\n ]\n },\n {\n "id": 2,\n "name": "\u5185\u6d4b\u7248",\n "channels": [\n {\n "slug": "l19Tl",\n "name": "Android",\n "device_type": "android",\n "bundle_id": "*",\n "git_url": null,\n "has_password": false\n },\n {\n "slug": "8selv",\n "name": "iOS",\n "device_type": "ios",\n "bundle_id": "*",\n "git_url": null,\n "has_password": false\n }\n ]\n }\n ]\n }\n]\n'})}),"\n",(0,d.jsx)(n.h2,{id:"get-an-app",children:"Get an app"}),"\n",(0,d.jsx)(n.p,{children:"Allows you to receive information about an app like name, scheme, channel."}),"\n",(0,d.jsx)(n.pre,{children:(0,d.jsx)(n.code,{children:"GET /api/apps/:id\n"})}),"\n",(0,d.jsx)(n.h3,{id:"parameters-2",children:"Parameters"}),"\n",(0,d.jsxs)(n.table,{children:[(0,d.jsx)(n.thead,{children:(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.th,{children:"Attribute"}),(0,d.jsx)(n.th,{children:"Type"}),(0,d.jsx)(n.th,{children:"Required"}),(0,d.jsx)(n.th,{children:"Description"})]})}),(0,d.jsx)(n.tbody,{children:(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:"id"}),(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"String"})}),(0,d.jsx)(n.td,{children:"true"}),(0,d.jsx)(n.td,{children:"ID"})]})})]}),"\n",(0,d.jsx)(n.h3,{id:"return-body-2",children:"Return body"}),"\n",(0,d.jsx)(n.pre,{children:(0,d.jsx)(n.code,{className:"language-json",children:'{\n "id": 1,\n "name": "Zealot",\n "schemes": [\n {\n "id": 5,\n "name": "Test App",\n "channels": [\n {\n "slug": "X1IXN",\n "name": "Android",\n "device_type": "android",\n "bundle_id": "*",\n "git_url": null,\n "has_password": false\n },\n {\n "slug": "O1qHk",\n "name": "iOS",\n "device_type": "ios",\n "bundle_id": "*",\n "git_url": null,\n "has_password": false\n }\n ]\n }\n ]\n}\n'})}),"\n",(0,d.jsx)(n.h2,{id:"get-versions-list-of-app",children:"Get versions list of app"}),"\n",(0,d.jsx)(n.p,{children:"Get a list of apps by the given channel key"}),"\n",(0,d.jsx)(n.pre,{children:(0,d.jsx)(n.code,{children:"GET /api/apps/versions\n"})}),"\n",(0,d.jsx)(n.h3,{id:"parameters-3",children:"Parameters"}),"\n",(0,d.jsxs)(n.table,{children:[(0,d.jsx)(n.thead,{children:(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.th,{children:"Attribute"}),(0,d.jsx)(n.th,{children:"Type"}),(0,d.jsx)(n.th,{children:"Required"}),(0,d.jsx)(n.th,{children:"Description"})]})}),(0,d.jsxs)(n.tbody,{children:[(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:"channel_key"}),(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"String"})}),(0,d.jsx)(n.td,{children:"true"}),(0,d.jsx)(n.td,{children:"Channel key"})]}),(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:"page"}),(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"Integer"})}),(0,d.jsx)(n.td,{children:"false"}),(0,d.jsxs)(n.td,{children:["Page number (default: ",(0,d.jsx)(n.code,{children:"1"}),")"]})]}),(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:"per_page"}),(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"Integer"})}),(0,d.jsx)(n.td,{children:"false"}),(0,d.jsxs)(n.td,{children:["Number of items to list per page (default: ",(0,d.jsx)(n.code,{children:"25"}),", max: ",(0,d.jsx)(n.code,{children:"100"}),")."]})]})]})]}),"\n",(0,d.jsx)(n.h3,{id:"return-body-3",children:"Return body"}),"\n",(0,d.jsx)(n.pre,{children:(0,d.jsx)(n.code,{className:"language-json",children:'{\n "app_name": "Zealot iOS",\n "bundle_id": "*",\n "git_url": null,\n "app": {\n "id": 3,\n "name": "Zealot"\n },\n "scheme": {\n "id": 5,\n "name": "AdHoc"\n },\n "releases": [\n {\n "version": 2,\n "app_name": "Zealot iOS",\n "bundle_id": "im.ews.zealot",\n "release_version": "1.0.0",\n "build_version": "10292024",\n "source": "Web",\n "branch": "",\n "git_commit": "",\n "ci_url": "",\n "size": 79712596,\n "icon_url": "https://tryzealot.ews.im/uploads/apps/a3/r21/icons/8ab13dc08321f9f3412a9fa98689d9c3.png",\n "install_url": "itms-services://?action=download-manifest&url=https://tryzealot.ews.im/api/apps/O1qHk/1/install",\n "changelog": [],\n "created_at": "2019-12-25T14:26:06.608+08:00"\n },\n {\n "version": 1,\n "app_name": "Zealot iOS",\n "bundle_id": "im.ews.zealot",\n "release_version": "1.0.0",\n "build_version": "10291524",\n "source": "Web",\n "branch": "",\n "git_commit": "",\n "ci_url": "",\n "size": 79712596,\n "icon_url": "https://tryzealot.ews.im/uploads/apps/a3/r21/icons/8ab13dc08321f9f3412a9fa98689d9c3.png",\n "install_url": "itms-services://?action=download-manifest&url=https://tryzealot.ews.im/api/apps/O1qHk/1/install",\n "changelog": [],\n "created_at": "2019-12-25T14:26:06.608+08:00"\n },\n ]\n}\n'})}),"\n",(0,d.jsx)(n.h2,{id:"get-the-latest-version-of-app",children:"Get the latest version of app"}),"\n",(0,d.jsx)(n.p,{children:"Allows you to receive the latest information about a Release version from App like app metadata, changelog, icon url, install (download) url."}),"\n",(0,d.jsx)(n.pre,{children:(0,d.jsx)(n.code,{children:"GET /api/apps/latest\n"})}),"\n",(0,d.jsx)(n.h3,{id:"parameters-4",children:"Parameters"}),"\n",(0,d.jsxs)(n.table,{children:[(0,d.jsx)(n.thead,{children:(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.th,{children:"Attribute"}),(0,d.jsx)(n.th,{children:"Type"}),(0,d.jsx)(n.th,{children:"Required"}),(0,d.jsx)(n.th,{children:"Description"})]})}),(0,d.jsxs)(n.tbody,{children:[(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:"channel_key"}),(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"String"})}),(0,d.jsx)(n.td,{children:"true"}),(0,d.jsx)(n.td,{children:"Channel key"})]}),(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:"release_version"}),(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"String"})}),(0,d.jsx)(n.td,{children:"true"}),(0,d.jsx)(n.td,{children:"Release version"})]}),(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:"build_version"}),(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"String"})}),(0,d.jsx)(n.td,{children:"true"}),(0,d.jsx)(n.td,{children:"Build version"})]})]})]}),"\n",(0,d.jsx)(n.h3,{id:"return-body-4",children:"Return body"}),"\n",(0,d.jsx)(n.pre,{children:(0,d.jsx)(n.code,{className:"language-json",children:'{\n "app_name": "Zealot iOS",\n "bundle_id": "*",\n "git_url": null,\n "app": {\n "id": 3,\n "name": "Zealot"\n },\n "scheme": {\n "id": 5,\n "name": "AdHoc"\n },\n "releases": {\n "version": 1,\n "app_name": "Zealot iOS",\n "bundle_id": "im.ews.zealot",\n "release_version": "1.0.0",\n "build_version": "10291524",\n "source": "Web",\n "branch": "",\n "git_commit": "",\n "ci_url": "",\n "size": 79712596,\n "icon_url": "https://tryzealot.ews.im/uploads/apps/a3/r21/icons/8ab13dc08321f9f3412a9fa98689d9c3.png",\n "install_url": "itms-services://?action=download-manifest&url=https://tryzealot.ews.im/api/apps/O1qHk/1/install",\n "changelog": [],\n "created_at": "2019-12-25T14:26:06.608+08:00"\n }\n}\n'})}),"\n",(0,d.jsx)(n.h2,{id:"check-version-exists",children:"Check version exists"}),"\n",(0,d.jsx)(n.p,{children:"Allows you to check the Release exists by given query, query accepts two combo group:"}),"\n",(0,d.jsxs)(n.ul,{children:["\n",(0,d.jsxs)(n.li,{children:[(0,d.jsx)(n.code,{children:"bundle_id"}),", ",(0,d.jsx)(n.code,{children:"release_version"})," and ",(0,d.jsx)(n.code,{children:"build_verion"})]}),"\n",(0,d.jsxs)(n.li,{children:[(0,d.jsx)(n.code,{children:"bundle_id"})," and ",(0,d.jsx)(n.code,{children:"git_commit"})]}),"\n"]}),"\n",(0,d.jsx)(n.pre,{children:(0,d.jsx)(n.code,{children:"GET /api/apps/version_exist\n"})}),"\n",(0,d.jsx)(n.h3,{id:"parameters-5",children:"Parameters"}),"\n",(0,d.jsxs)(n.table,{children:[(0,d.jsx)(n.thead,{children:(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.th,{children:"Attribute"}),(0,d.jsx)(n.th,{children:"Type"}),(0,d.jsx)(n.th,{children:"Required"}),(0,d.jsx)(n.th,{children:"Description"})]})}),(0,d.jsxs)(n.tbody,{children:[(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:"channel_key"}),(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"String"})}),(0,d.jsx)(n.td,{children:"true"}),(0,d.jsx)(n.td,{children:"Channel key"})]}),(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:"bundle_id"}),(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"String"})}),(0,d.jsx)(n.td,{children:"true"}),(0,d.jsx)(n.td,{children:"bundle_id or package_name"})]}),(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:"release_version"}),(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"String"})}),(0,d.jsx)(n.td,{children:"false"}),(0,d.jsx)(n.td,{children:"Release version"})]}),(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:"build_version"}),(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"String"})}),(0,d.jsx)(n.td,{children:"false"}),(0,d.jsx)(n.td,{children:"Build version"})]}),(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:"git_commit"}),(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"String"})}),(0,d.jsx)(n.td,{children:"false"}),(0,d.jsx)(n.td,{children:"git commit hash"})]})]})]}),"\n",(0,d.jsx)(n.h3,{id:"return-body-5",children:"Return body"}),"\n",(0,d.jsxs)(n.ul,{children:["\n",(0,d.jsx)(n.li,{children:"Return 200 if release existed."}),"\n",(0,d.jsx)(n.li,{children:"Return 404 if release not existed."}),"\n"]}),"\n",(0,d.jsx)(n.p,{children:"Success returns:"}),"\n",(0,d.jsx)(n.pre,{children:(0,d.jsx)(n.code,{className:"language-json",children:'{\n "version": 1,\n "app_name": "Zealot iOS",\n "bundle_id": "im.ews.zealot",\n "release_version": "4.1.1",\n "build_version": "10291524",\n "source": "Web",\n "branch": "",\n "git_commit": "",\n "ci_url": "",\n "size": 79712596,\n "icon_url": "https://tryzealot.ews.im/uploads/apps/a3/r21/icons/8ab13dc08321f9f3412a9fa98689d9c3.png",\n "install_url": "itms-services://?action=download-manifest&url=https://tryzealot.ews.im/api/apps/O1qHk/1/install",\n "changelog": [],\n "created_at": "2019-12-25T14:26:06.608+08:00"\n}\n'})}),"\n",(0,d.jsx)(n.p,{children:"Not found returns:"}),"\n",(0,d.jsx)(n.pre,{children:(0,d.jsx)(n.code,{className:"language-json",children:'{\n "error": "Not found release"\n}\n'})})]})}function o(e={}){const{wrapper:n}={...(0,r.a)(),...e.components};return n?(0,d.jsx)(n,{...e,children:(0,d.jsx)(h,{...e})}):h(e)}},1151:(e,n,s)=>{s.d(n,{Z:()=>l,a:()=>t});var d=s(7294);const r={},i=d.createContext(r);function t(e){const n=d.useContext(i);return d.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:t(e.components),d.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/8f8d8fcb.1a1344a5.js b/assets/js/01f38628.59853b81.js similarity index 92% rename from assets/js/8f8d8fcb.1a1344a5.js rename to assets/js/01f38628.59853b81.js index 4ec407f1d..89b412020 100644 --- a/assets/js/8f8d8fcb.1a1344a5.js +++ b/assets/js/01f38628.59853b81.js @@ -1 +1 @@ -"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[1900],{9901:(e,o,t)=>{t.r(o),t.d(o,{assets:()=>d,contentTitle:()=>a,default:()=>u,frontMatter:()=>s,metadata:()=>c,toc:()=>i});var n=t(5893),r=t(1151);const s={},a="Wecom (Wechat Work)",c={id:"user-guide/webhooks/wecom",title:"Wecom (Wechat Work)",description:"\u4f01\u4e1a\u5fae\u4fe1 use Incoming Webhooks whose constructs",source:"@site/versioned_docs/version-5.1.0/user-guide/webhooks/wecom.md",sourceDirName:"user-guide/webhooks",slug:"/user-guide/webhooks/wecom",permalink:"/docs/user-guide/webhooks/wecom",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.1.0/user-guide/webhooks/wecom.md",tags:[],version:"5.1.0",frontMatter:{},sidebar:"userGuide",previous:{title:"Dingtalk (Dingding)",permalink:"/docs/user-guide/webhooks/dingtalk"},next:{title:"Administrator",permalink:"/docs/category/administrator"}},d={},i=[{value:"Text format",id:"text-format",level:2},{value:"Markdown format",id:"markdown-format",level:2}];function l(e){const o={a:"a",code:"code",h1:"h1",h2:"h2",p:"p",pre:"pre",...(0,r.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(o.h1,{id:"wecom-wechat-work",children:"Wecom (Wechat Work)"}),"\n",(0,n.jsxs)(o.p,{children:[(0,n.jsx)(o.a,{href:"https://work.weixin.qq.com/api/doc/90000/90136/91770",children:"\u4f01\u4e1a\u5fae\u4fe1"})," use Incoming Webhooks whose constructs\ntypically support both text and markdown, and can be configured as follows:"]}),"\n",(0,n.jsx)(o.h2,{id:"text-format",children:"Text format"}),"\n",(0,n.jsx)(o.pre,{children:(0,n.jsx)(o.code,{className:"language-ruby",children:'{\n "msgtype": "text",\n "text": {\n "content": "#{@title}\\n\\nInstall url\uff1a#{@install_url}\\nUplaod at: #{@uploaded_at}"\n }\n}\n'})}),"\n",(0,n.jsx)(o.h2,{id:"markdown-format",children:"Markdown format"}),"\n",(0,n.jsx)(o.pre,{children:(0,n.jsx)(o.code,{className:"language-ruby",children:'{\n "msgtype": "markdown",\n "markdown": {\n "content": "## #{@title}\\nPlatform: #{@device_type}\\nUplaod at: #{@uploaded_at}\\nInstall QRcode:\\n![qrcode](#{@qrcode_url})"\n }\n}\n'})})]})}function u(e={}){const{wrapper:o}={...(0,r.a)(),...e.components};return o?(0,n.jsx)(o,{...e,children:(0,n.jsx)(l,{...e})}):l(e)}},1151:(e,o,t)=>{t.d(o,{Z:()=>c,a:()=>a});var n=t(7294);const r={},s=n.createContext(r);function a(e){const o=n.useContext(s);return n.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function c(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:a(e.components),n.createElement(s.Provider,{value:o},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[2366],{5400:(e,o,t)=>{t.r(o),t.d(o,{assets:()=>d,contentTitle:()=>a,default:()=>u,frontMatter:()=>s,metadata:()=>c,toc:()=>i});var n=t(5893),r=t(1151);const s={},a="Wecom (Wechat Work)",c={id:"user-guide/webhooks/wecom",title:"Wecom (Wechat Work)",description:"\u4f01\u4e1a\u5fae\u4fe1 use Incoming Webhooks whose constructs",source:"@site/versioned_docs/version-5.2.0/user-guide/webhooks/wecom.md",sourceDirName:"user-guide/webhooks",slug:"/user-guide/webhooks/wecom",permalink:"/docs/user-guide/webhooks/wecom",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.2.0/user-guide/webhooks/wecom.md",tags:[],version:"5.2.0",frontMatter:{},sidebar:"userGuide",previous:{title:"Dingtalk (Dingding)",permalink:"/docs/user-guide/webhooks/dingtalk"},next:{title:"Administrator",permalink:"/docs/category/administrator"}},d={},i=[{value:"Text format",id:"text-format",level:2},{value:"Markdown format",id:"markdown-format",level:2}];function l(e){const o={a:"a",code:"code",h1:"h1",h2:"h2",p:"p",pre:"pre",...(0,r.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(o.h1,{id:"wecom-wechat-work",children:"Wecom (Wechat Work)"}),"\n",(0,n.jsxs)(o.p,{children:[(0,n.jsx)(o.a,{href:"https://work.weixin.qq.com/api/doc/90000/90136/91770",children:"\u4f01\u4e1a\u5fae\u4fe1"})," use Incoming Webhooks whose constructs\ntypically support both text and markdown, and can be configured as follows:"]}),"\n",(0,n.jsx)(o.h2,{id:"text-format",children:"Text format"}),"\n",(0,n.jsx)(o.pre,{children:(0,n.jsx)(o.code,{className:"language-ruby",children:'{\n "msgtype": "text",\n "text": {\n "content": "#{@title}\\n\\nInstall url\uff1a#{@install_url}\\nUplaod at: #{@uploaded_at}"\n }\n}\n'})}),"\n",(0,n.jsx)(o.h2,{id:"markdown-format",children:"Markdown format"}),"\n",(0,n.jsx)(o.pre,{children:(0,n.jsx)(o.code,{className:"language-ruby",children:'{\n "msgtype": "markdown",\n "markdown": {\n "content": "## #{@title}\\nPlatform: #{@device_type}\\nUplaod at: #{@uploaded_at}\\nInstall QRcode:\\n![qrcode](#{@qrcode_url})"\n }\n}\n'})})]})}function u(e={}){const{wrapper:o}={...(0,r.a)(),...e.components};return o?(0,n.jsx)(o,{...e,children:(0,n.jsx)(l,{...e})}):l(e)}},1151:(e,o,t)=>{t.d(o,{Z:()=>c,a:()=>a});var n=t(7294);const r={},s=n.createContext(r);function a(e){const o=n.useContext(s);return n.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function c(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:a(e.components),n.createElement(s.Provider,{value:o},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/02a4cf77.7e523d5e.js b/assets/js/02a4cf77.7e523d5e.js new file mode 100644 index 000000000..06413bc2a --- /dev/null +++ b/assets/js/02a4cf77.7e523d5e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[1147],{889:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>d,contentTitle:()=>i,default:()=>u,frontMatter:()=>s,metadata:()=>c,toc:()=>a});var o=r(5893),n=r(1151);const s={},i="Credits",c={id:"user-guide/credits",title:"Credits",description:"Contributions",source:"@site/versioned_docs/version-5.2.0/user-guide/credits.md",sourceDirName:"user-guide",slug:"/user-guide/credits",permalink:"/docs/user-guide/credits",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.2.0/user-guide/credits.md",tags:[],version:"5.2.0",frontMatter:{},sidebar:"userGuide",previous:{title:"Q&A",permalink:"/docs/user-guide/qa"}},d={},a=[{value:"Contributions",id:"contributions",level:2},{value:"Project name",id:"project-name",level:2},{value:"Project Logo",id:"project-logo",level:2},{value:"License",id:"license",level:2}];function l(e){const t={a:"a",h1:"h1",h2:"h2",p:"p",...(0,n.a)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.h1,{id:"credits",children:"Credits"}),"\n",(0,o.jsx)(t.h2,{id:"contributions",children:"Contributions"}),"\n",(0,o.jsx)(t.p,{children:"Thank you for making Zealot more useful!"}),"\n",(0,o.jsx)("a",{href:"https://github.com/tryzealot/zealot/graphs/contributors",children:(0,o.jsx)("img",{src:"https://contrib.rocks/image?repo=tryzealot/zealot"})}),"\n",(0,o.jsx)(t.h2,{id:"project-name",children:"Project name"}),"\n",(0,o.jsx)(t.p,{children:"Zealot from the Starcraft species Gods base soldier."}),"\n",(0,o.jsx)(t.h2,{id:"project-logo",children:"Project Logo"}),"\n",(0,o.jsxs)(t.p,{children:["Project history submission resources may be used to for the icon copyright belongs to ",(0,o.jsx)(t.a,{href:"https://www.blizzard.com",children:"Blizzard"}),",\nlater changed to their own design icons, if there are enthusiastic designers can help design better icons,\nI represent this project to express my sincere gratitude."]}),"\n",(0,o.jsx)(t.h2,{id:"license",children:"License"}),"\n",(0,o.jsxs)(t.p,{children:["Zealot is an open source project released under the MIT distribution protocol (MIT), which can be found at ",(0,o.jsx)(t.a,{href:"https://github.com/tryzealot/zealot/blob/develop/LICENSE",children:"LICENSE file"}),"\u3002"]})]})}function u(e={}){const{wrapper:t}={...(0,n.a)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(l,{...e})}):l(e)}},1151:(e,t,r)=>{r.d(t,{Z:()=>c,a:()=>i});var o=r(7294);const n={},s=o.createContext(n);function i(e){const t=o.useContext(s);return o.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:i(e.components),o.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/036596d4.40c0bddb.js b/assets/js/036596d4.40c0bddb.js new file mode 100644 index 000000000..b3dfb7851 --- /dev/null +++ b/assets/js/036596d4.40c0bddb.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[5055],{557:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>d,contentTitle:()=>l,default:()=>m,frontMatter:()=>c,metadata:()=>a,toc:()=>u});var r=n(5893),s=n(1151),o=n(9965),i=n(4996);const c={sidebar_label:"Architecture"},l="Zealot Architecture",a={id:"self-hosted/deployment/architecture",title:"Zealot Architecture",description:"Running Zealot requires the following set of services.",source:"@site/versioned_docs/version-5.2.0/self-hosted/deployment/architecture.mdx",sourceDirName:"self-hosted/deployment",slug:"/self-hosted/deployment/architecture",permalink:"/docs/self-hosted/deployment/architecture",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.2.0/self-hosted/deployment/architecture.mdx",tags:[],version:"5.2.0",frontMatter:{sidebar_label:"Architecture"},sidebar:"selfHosted",previous:{title:"Deployment",permalink:"/docs/category/deployment"},next:{title:"Requirements",permalink:"/docs/self-hosted/deployment/requirements"}},d={},u=[];function h(e){const t={h1:"h1",li:"li",p:"p",ul:"ul",...(0,s.a)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.h1,{id:"zealot-architecture",children:"Zealot Architecture"}),"\n",(0,r.jsx)(t.p,{children:"Running Zealot requires the following set of services."}),"\n","\n","\n",(0,r.jsx)(o.Z,{alt:"Architecture",sources:{light:(0,i.Z)("/img/5.0.0/architecture-light.png"),dark:(0,i.Z)("/img/5.0.0/architecture-dark.png")}}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsx)(t.li,{children:"Mostly Linux based on amd86/arm64/armv7."}),"\n",(0,r.jsx)(t.li,{children:"Ruby on Rails powered Web and API services"}),"\n",(0,r.jsx)(t.li,{children:"Sidekiq provides asynchronous background task management"}),"\n",(0,r.jsx)(t.li,{children:"PostgreSQL database"}),"\n",(0,r.jsx)(t.li,{children:"Redis cache"}),"\n"]})]})}function m(e={}){const{wrapper:t}={...(0,s.a)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(h,{...e})}):h(e)}},1151:(e,t,n)=>{n.d(t,{Z:()=>c,a:()=>i});var r=n(7294);const s={},o=r.createContext(s);function i(e){const t=r.useContext(o);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:i(e.components),r.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/039dda31.15f93b74.js b/assets/js/039dda31.15f93b74.js new file mode 100644 index 000000000..447ab4cdd --- /dev/null +++ b/assets/js/039dda31.15f93b74.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[8934],{8060:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>c,contentTitle:()=>a,default:()=>p,frontMatter:()=>l,metadata:()=>d,toc:()=>h});var s=i(5893),n=i(1151),r=i(9965),o=i(4996);const l={},a="User Guide",d={id:"user-guide/index",title:"User Guide",description:"GitHub release",source:"@site/versioned_docs/version-5.1.0/user-guide/index.mdx",sourceDirName:"user-guide",slug:"/user-guide/",permalink:"/docs/5.1.0/user-guide/",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.1.0/user-guide/index.mdx",tags:[],version:"5.1.0",frontMatter:{},sidebar:"userGuide",next:{title:"Dashboard",permalink:"/docs/5.1.0/user-guide/dashboard"}},c={},h=[{value:"Features",id:"features",level:2},{value:"Demo",id:"demo",level:2},{value:"About the translation",id:"about-the-translation",level:2}];function u(e){const t={a:"a",blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",img:"img",li:"li",p:"p",strong:"strong",ul:"ul",...(0,n.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.h1,{id:"user-guide",children:"User Guide"}),"\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.a,{href:"https://github.com/tryzealot/zealot/releases",children:(0,s.jsx)(t.img,{src:"https://img.shields.io/github/v/release/tryzealot/zealot?include_prereleases",alt:"GitHub release"})}),"\n",(0,s.jsx)(t.a,{href:"https://hub.docker.com/r/tryzealot/zealot/",children:(0,s.jsx)(t.img,{src:"https://img.shields.io/docker/pulls/tryzealot/zealot.svg",alt:"Docker Pulls"})}),"\n",(0,s.jsx)(t.a,{href:"https://img.shields.io/badge/chat-on%20telegram-important.svg",children:(0,s.jsx)(t.img,{src:"https://img.shields.io/badge/chat-on%20telegram-important.svg",alt:"Chat on Telegram"})}),"\n",(0,s.jsx)(t.a,{href:"https://codeclimate.com/github/tryzealot/zealot",children:(0,s.jsx)(t.img,{src:"https://codeclimate.com/github/tryzealot/zealot/badges/gpa.svg",alt:"Maintainability"})}),"\n",(0,s.jsx)(t.a,{href:"https://github.com/tryzealot/zealot/blob/develop/LICENSE",children:(0,s.jsx)(t.img,{src:"https://img.shields.io/github/license/tryzealot/zealot",alt:"License"})})]}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Self-hosted Beta App Distribution for Android, iOS, macOS, Windows and Linux apps."})}),"\n",(0,s.jsx)(t.p,{children:"Continuous everything. Automate the lifecycle of your apps. Connect your CI to build in the cloud, test on thousands of real devices, distribute to beta testers and app stores. All in one place."}),"\n",(0,s.jsx)(r.Z,{alt:"Preview",sources:{light:(0,o.Z)("/img/showcase-light.png"),dark:(0,o.Z)("/img/showcase-dark.png")}}),"\n",(0,s.jsx)(t.h2,{id:"features",children:"Features"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:["\ud83c\udf0f ",(0,s.jsx)(t.strong,{children:"Cross-platform hosting"}),": supports macOS, iOS, Android (apk/",(0,s.jsx)(t.strong,{children:"aab"}),"), Windows, Linux extensive platforms."]}),"\n",(0,s.jsxs)(t.li,{children:["\ud83d\udcf1 ",(0,s.jsx)(t.strong,{children:"iOS device in control"}),": automatically synchronizes iOS test device information and allows for one-click registration of new devices with Apple developers."]}),"\n",(0,s.jsxs)(t.li,{children:["\ud83e\uddd1\u200d\ud83d\udcbb ",(0,s.jsx)(t.strong,{children:"Full developer toolkit"}),": provides REST API, [iOS][zealot-ios-sdk], [Android][android-android-sdk] SDKs and [fastlane][fastlane-plugin-zealot] automation plugins for building."]}),"\n",(0,s.jsxs)(t.li,{children:["\ud83d\udca5 ",(0,s.jsx)(t.strong,{children:"Analyze secrets within applications"}),": interpret metadata for iOS or Android applications or describe files."]}),"\n",(0,s.jsxs)(t.li,{children:["\ud83d\udea8 ",(0,s.jsx)(t.strong,{children:"Multiple notification built-in"}),": customizable data income WebHook to any notification service."]}),"\n",(0,s.jsxs)(t.li,{children:["\ud83d\uddc4 ",(0,s.jsx)(t.strong,{children:"Multi-channel classification management"}),": freely divide application channel management into different scenarios and product forms."]}),"\n",(0,s.jsxs)(t.li,{children:["\ud83c\udfb3 ",(0,s.jsx)(t.strong,{children:"Multiple Architectures"})," amd86/arm64/armv7 architectures deployment ready."]}),"\n",(0,s.jsxs)(t.li,{children:["\ud83d\udd11 ",(0,s.jsx)(t.strong,{children:"Third-party Auth"}),": Google, Gitlab, LDAP, OIDC and Lark suppotted."]}),"\n",(0,s.jsxs)(t.li,{children:["\ud83c\udf11 ",(0,s.jsx)(t.strong,{children:"Dark mode"}),": Feel free to switch between day and night."]}),"\n"]}),"\n",(0,s.jsx)(t.h2,{id:"demo",children:"Demo"}),"\n",(0,s.jsxs)(t.p,{children:["Simplified Chinese by default, change the language in ",(0,s.jsx)(t.a,{href:"/docs/user-guide/administrator/settings",children:"Settings"})," page."]}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:["URL\uff1a",(0,s.jsx)(t.a,{href:"https://tryzealot.ews.im/",children:"https://tryzealot.ews.im/"})]}),"\n",(0,s.jsxs)(t.li,{children:["Admin account: ",(0,s.jsx)(t.code,{children:"admin@zealot.com"})]}),"\n",(0,s.jsxs)(t.li,{children:["Password: ",(0,s.jsx)(t.code,{children:"ze@l0t"})]}),"\n"]}),"\n",(0,s.jsxs)(t.blockquote,{children:["\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.strong,{children:"Notification"}),": There is instability run on a free resource cloud service and RESET ALL DATA daily."]}),"\n"]}),"\n",(0,s.jsx)(t.h2,{id:"about-the-translation",children:"About the translation"}),"\n",(0,s.jsxs)(t.p,{children:["The translation powered by ",(0,s.jsx)(t.a,{href:"https://www.deepl.com/translator",children:"DeepL"})," and it inevitably have some defects, please provide feedback in time, thanks!"]})]})}function p(e={}){const{wrapper:t}={...(0,n.a)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(u,{...e})}):u(e)}},1151:(e,t,i)=>{i.d(t,{Z:()=>l,a:()=>o});var s=i(7294);const n={},r=s.createContext(n);function o(e){const t=s.useContext(r);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function l(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:o(e.components),s.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/048ae1f6.07e1433d.js b/assets/js/048ae1f6.07e1433d.js new file mode 100644 index 000000000..284dc267c --- /dev/null +++ b/assets/js/048ae1f6.07e1433d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[4499],{5910:(t,e,n)=>{n.r(e),n.d(e,{assets:()=>u,contentTitle:()=>d,default:()=>g,frontMatter:()=>o,metadata:()=>c,toc:()=>m});var a=n(5893),s=n(1151),i=n(9965),r=n(4996);const o={},d="Database Analytics",c={id:"user-guide/administrator/monitoring/database-analytics",title:"Database Analytics",description:"{n.d(e,{Z:()=>o,a:()=>r});var a=n(7294);const s={},i=a.createContext(s);function r(t){const e=a.useContext(i);return a.useMemo((function(){return"function"==typeof t?t(e):{...e,...t}}),[e,t])}function o(t){let e;return e=t.disableParentContext?"function"==typeof t.components?t.components(s):t.components||s:r(t.components),a.createElement(i.Provider,{value:e},t.children)}}}]); \ No newline at end of file diff --git a/assets/js/06b363f7.86ce702f.js b/assets/js/06b363f7.86ce702f.js new file mode 100644 index 000000000..463a492db --- /dev/null +++ b/assets/js/06b363f7.86ce702f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[5832],{3539:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>h,contentTitle:()=>d,default:()=>m,frontMatter:()=>c,metadata:()=>u,toc:()=>p});var n=r(5893),s=r(1151),a=r(9965),o=r(4996),i=r(4866),l=r(5162);const c={},d="Reverse Proxies",u={id:"self-hosted/reverse-proxies",title:"Reverse Proxies",description:"To facilitate the unified management and distribution of SSL certificates, service expansion and access to off-the-shelf gateway services,",source:"@site/versioned_docs/version-5.2.0/self-hosted/reverse-proxies.mdx",sourceDirName:"self-hosted",slug:"/self-hosted/reverse-proxies",permalink:"/docs/self-hosted/reverse-proxies",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.2.0/self-hosted/reverse-proxies.mdx",tags:[],version:"5.2.0",frontMatter:{},sidebar:"selfHosted",previous:{title:"Source code",permalink:"/docs/self-hosted/deployment/source-code"},next:{title:"Cloud Provider Guides",permalink:"/docs/category/cloud-provider-guides"}},h={},p=[{value:"Prepare",id:"prepare",level:2},{value:"Traefik",id:"traefik",level:2},{value:"Configuration",id:"configuration",level:3},{value:"Traefik service",id:"traefik-service",level:3},{value:"Docker",id:"docker",level:3},{value:"Consul",id:"consul",level:3},{value:"Nomad",id:"nomad",level:3},{value:"Caddy 2",id:"caddy-2",level:2},{value:"Nginx",id:"nginx",level:2}];function f(e){const t={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,s.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.h1,{id:"reverse-proxies",children:"Reverse Proxies"}),"\n",(0,n.jsx)(t.p,{children:"To facilitate the unified management and distribution of SSL certificates, service expansion and access to off-the-shelf gateway services,\nwe provides several configurations for configuring reverse proxy services to the gateway."}),"\n","\n","\n",(0,n.jsx)(a.Z,{alt:"Architecture",sources:{light:(0,o.Z)("/img/5.0.0/reverse-proxies-light.png"),dark:(0,o.Z)("/img/5.0.0/reverse-proxies-dark.png")}}),"\n",(0,n.jsx)(t.h2,{id:"prepare",children:"Prepare"}),"\n",(0,n.jsx)(t.p,{children:"The following data needs to be prepared to configure the reverse proxy:"}),"\n",(0,n.jsxs)(t.table,{children:[(0,n.jsx)(t.thead,{children:(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.th,{children:"Name"}),(0,n.jsx)(t.th,{children:"Sample value"}),(0,n.jsx)(t.th,{children:"Description"})]})}),(0,n.jsxs)(t.tbody,{children:[(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"Domain"}),(0,n.jsx)(t.td,{children:"zealot.icyleaf.dev"}),(0,n.jsx)(t.td,{})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"Reverse proxy service IP address"}),(0,n.jsx)(t.td,{children:"172.16.56.1"}),(0,n.jsx)(t.td,{})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"Zealot IP address"}),(0,n.jsx)(t.td,{children:"172.16.56.100"}),(0,n.jsxs)(t.td,{children:["Reverse Proxy can be accessed",(0,n.jsx)("br",{}),"Change to 127.0.0.1 Reverse Proxy and zealot with one host."]})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"Zealot public port"}),(0,n.jsx)(t.td,{children:"8901"}),(0,n.jsx)(t.td,{children:"Reverse Proxy can be accessed"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"Zealot internal port"}),(0,n.jsx)(t.td,{children:"80"}),(0,n.jsx)(t.td,{children:"No need modify"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"Let's Encrypt Email address"}),(0,n.jsx)(t.td,{children:(0,n.jsx)(t.a,{href:"mailto:your-email@example.com",children:"your-email@example.com"})}),(0,n.jsx)(t.td,{})]})]})]}),"\n",(0,n.jsx)(t.h2,{id:"traefik",children:"Traefik"}),"\n",(0,n.jsxs)(t.p,{children:[(0,n.jsx)(t.a,{href:"https://doc.traefik.io/traefik/",children:"Traefik"})," is an open source reverse proxy and load balancing tool,\nwhich provides a variety of Providers can achieve access to the reverse proxy and configure the SSL."]}),"\n",(0,n.jsx)(t.h3,{id:"configuration",children:"Configuration"}),"\n",(0,n.jsx)(t.p,{children:"Regardless of the type of Provider used the core configuration items are the same and constitute the reverse proxy service configuration consists of three main components: discovery port number,\nrouting rules (including access port number, domain name binding and SSL)"}),"\n",(0,n.jsx)(t.h3,{id:"traefik-service",children:"Traefik service"}),"\n",(0,n.jsxs)(i.Z,{groupId:"yaml",children:[(0,n.jsx)(l.Z,{value:"yaml",children:(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-yaml",children:'entryPoints:\n web:\n address: ":80"\n\n websecure:\n address: ":443"\n\ncertificatesResolvers:\n letsencrypt:\n acme:\n email: your-email@example.com\n storage: acme.json\n httpChallenge:\n entryPoint: web\n'})})}),(0,n.jsx)(l.Z,{value:"toml",children:(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-toml",children:'[entryPoints]\n [entryPoints.web]\n address = ":80"\n\n [entryPoints.websecure]\n address = ":443"\n\n[certificatesResolvers.letsencrypt.acme]\n email = "your-email@example.com"\n storage = "acme.json"\n [certificatesResolvers.letsencrypt.acme.httpChallenge]\n # used during the challenge\n entryPoint = "web"\n'})})}),(0,n.jsx)(l.Z,{value:"cli",children:(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-bash",children:"--entrypoints.web.address=:80\n--entrypoints.websecure.address=:443\n\n--certificatesresolvers.letsencrypt.acme.email=your-email@example.com\n--certificatesresolvers.letsencrypt.acme.storage=acme.json\n--certificatesresolvers.letsencrypt.acme.httpchallenge.entrypoint=web\n"})})})]}),"\n",(0,n.jsx)(t.h3,{id:"docker",children:"Docker"}),"\n",(0,n.jsxs)(t.p,{children:["Enable ",(0,n.jsx)(t.a,{href:"https://doc.traefik.io/traefik/providers/docker/#configuration-examples",children:"Docker provider"})," then edit the Docker Compose file:"]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-yaml",metastring:'title="docker-compose.yml"',children:'version: \'3\'\nservices:\n zealot:\n <<: *defaults\n labels:\n - "traefik.enable=true"\n - "traefik.http.services.zealot.loadbalancer.server.port=80"\n - "traefik.http.routers.zealot.service=zealot"\n - "traefik.http.routers.zealot.rule=Host(`zealot.icyleaf.dev`)"\n - "traefik.http.routers.zealot.tls=true"\n - "traefik.http.routers.zealot.tls.certresolver=letsencrypt"\n - "traefik.http.routers.zealot.tls.domains[0].main=icyleaf.dev"\n - "traefik.http.routers.zealot.tls.domains[0].sans=zealot.icyleaf.dev"\n # Comment port, no need to public\n # ports:\n # - "8901:80"\n network:\n # Change the network what traefik service is\n - traefik-services\n\nnetworks:\n # Change the network what traefik service is\n traefik-services:\n external: true\n'})}),"\n",(0,n.jsx)(t.p,{children:"Deployment with Docker is limited to Traefik and Zealot service are usually in the same OS system of the same machine,\ncross-machine can not achieve communication, for cross-machine need to refer to the following two configuration options."}),"\n",(0,n.jsx)(t.h3,{id:"consul",children:"Consul"}),"\n",(0,n.jsxs)(t.p,{children:["Enable ",(0,n.jsx)(t.a,{href:"https://doc.traefik.io/traefik/providers/consul/",children:"Consul provider"})," or ",(0,n.jsx)(t.a,{href:"https://doc.traefik.io/traefik/providers/consul-catalog/",children:"Consul Catalog provider"}),", add key-value below:"]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-shell",children:"consul kv put traefik/http/services/zealot/loadbalancer/server/port 5\nconsul kv put traefik/http/routers/zealot/service zealot\nconsul kv put traefik/http/routers/zealot/rule 'Host(`zealot.icyleaf.dev`)'\nconsul kv put traefik/http/routers/zealot/tls/certresolver letsencrypt\nconsul kv put traefik/http/routers/zealot/tls/domains/0/main icyleaf.dev\nconsul kv put traefik/http/routers/zealot/tls/domains/0/sans zealot.icyleaf.dev\n"})}),"\n",(0,n.jsx)(t.h3,{id:"nomad",children:"Nomad"}),"\n",(0,n.jsxs)(t.p,{children:["Enable ",(0,n.jsx)(t.a,{href:"https://doc.traefik.io/traefik/providers/nomad/",children:"Nomad provider"})," and make sure Nomad version >= 1.3:"]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-hcl",metastring:'title="zealot.nomad"',children:'job "zealot" {\n datacenters = ["dc1"]\n type = "service"\n\n group "zealot" {\n count = 1\n\n network {\n port "http"{\n static = 80\n }\n }\n\n service {\n name = "zealot-http"\n provider = "nomad"\n port = "http"\n }\n\n task "server" {\n driver = "docker"\n config {\n image = "ghcr.io/tryzealot/zealot:nightly"\n ports = ["http"]\n args = [\n - "traefik.http.routers.zealot.rule=Host(`zealot.icyleaf.dev`)",\n - "traefik.http.routers.zealot.tls=true",\n - "traefik.http.routers.zealot.tls.certresolver=letsencrypt",\n - "traefik.http.routers.zealot.tls.domains[0].main=icyleaf.dev",\n - "traefik.http.routers.zealot.tls.domains[0].sans=zealot.icyleaf.dev"\n ]\n }\n }\n }\n}\n'})}),"\n",(0,n.jsx)(t.h2,{id:"caddy-2",children:"Caddy 2"}),"\n",(0,n.jsxs)(t.p,{children:["The configuration only needs to relate the ip part after ",(0,n.jsx)(t.code,{children:"tls"})," and ",(0,n.jsx)(t.code,{children:"proxy"}),":"]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-nginx",metastring:'title="Caddyfile"',children:":443\n\nlog\n\n# Use Let's Encrypt service\ntls your-email@example.com\n\nreverse_proxy 172.16.56.100:8901\n"})}),"\n",(0,n.jsx)(t.h2,{id:"nginx",children:"Nginx"}),"\n",(0,n.jsxs)(t.p,{children:["The following is the general configuration, if not effects welcome to ",(0,n.jsx)(t.a,{href:"https://github.com/tryzealot/docs/issues/new",children:"file a issue"}),":"]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-nginx",metastring:'title="conf.d/zealot.conf"',children:"upstream zealot {\n zone upstreams 64K;\n server 172.16.56.100:8901;\n keepalive 32;\n}\n\nmap $http_upgrade $connection_upgrade {\n default upgrade;\n '' close;\n}\n\nserver {\n listen 80;\n listen [::]:80;\n server_name zealot.icyleaf.dev;\n location /.well-known/acme-challenge/ { allow all; }\n location / { return 301 https://$host$request_uri; }\n}\n\nserver {\n listen 443 ssl http2; # Optional: http2 may needs install extension\n listen [::]:443 ssl http2;\n server_name zealot.icyleaf.dev;\n\n ssl_certificate /etc/certs/zealot-cert.pem;\n ssl_certificate_key /etc/certs/zealot.pem;\n\n # Optional\n # ssl_ciphers HIGH:!MEDIUM:!LOW:!aNULL:!NULL:!SHA;\n # ssl_session_timeout 5m;\n # ssl_session_cache shared:SSL:1m;\n # ssl_prefer_server_ciphers on;\n\n location / {\n proxy_pass http://zealot;\n proxy_redirect off;\n\n proxy_pass_header Authorization;\n proxy_set_header Host $host;\n # proxy_set_header X-Forwarded-Ssl on; # Optional\n proxy_set_header X-Real-IP $remote_addr;\n proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n proxy_set_header X-Forwarded-Proto $scheme;\n\n proxy_http_version 1.1;\n proxy_set_header Upgrade $http_upgrade;\n proxy_set_header Connection $connection_upgrade;\n\n client_max_body_size 0;\n proxy_read_timeout 36000s;\n }\n}\n"})}),"\n",(0,n.jsxs)(t.p,{children:["And you need update max body size in ",(0,n.jsx)(t.code,{children:"http"})," block. Recommended is 200MB, if it's a game,\n50% more can be played to make a surplus according to the actual file size."]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-nginx",metastring:'title="nginx.conf"',children:"http {\n [...]\n\n client_max_body_size 200M;\n}\n"})})]})}function m(e={}){const{wrapper:t}={...(0,s.a)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(f,{...e})}):f(e)}},5162:(e,t,r)=>{r.d(t,{Z:()=>o});r(7294);var n=r(512);const s={tabItem:"tabItem_Ymn6"};var a=r(5893);function o(e){let{children:t,hidden:r,className:o}=e;return(0,a.jsx)("div",{role:"tabpanel",className:(0,n.Z)(s.tabItem,o),hidden:r,children:t})}},4866:(e,t,r)=>{r.d(t,{Z:()=>k});var n=r(7294),s=r(512),a=r(2466),o=r(6550),i=r(469),l=r(1980),c=r(7392),d=r(12);function u(e){return n.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,n.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function h(e){const{values:t,children:r}=e;return(0,n.useMemo)((()=>{const e=t??function(e){return u(e).map((e=>{let{props:{value:t,label:r,attributes:n,default:s}}=e;return{value:t,label:r,attributes:n,default:s}}))}(r);return function(e){const t=(0,c.l)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,r])}function p(e){let{value:t,tabValues:r}=e;return r.some((e=>e.value===t))}function f(e){let{queryString:t=!1,groupId:r}=e;const s=(0,o.k6)(),a=function(e){let{queryString:t=!1,groupId:r}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!r)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return r??null}({queryString:t,groupId:r});return[(0,l._X)(a),(0,n.useCallback)((e=>{if(!a)return;const t=new URLSearchParams(s.location.search);t.set(a,e),s.replace({...s.location,search:t.toString()})}),[a,s])]}function m(e){const{defaultValue:t,queryString:r=!1,groupId:s}=e,a=h(e),[o,l]=(0,n.useState)((()=>function(e){let{defaultValue:t,tabValues:r}=e;if(0===r.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!p({value:t,tabValues:r}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${r.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const n=r.find((e=>e.default))??r[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:t,tabValues:a}))),[c,u]=f({queryString:r,groupId:s}),[m,v]=function(e){let{groupId:t}=e;const r=function(e){return e?`docusaurus.tab.${e}`:null}(t),[s,a]=(0,d.Nk)(r);return[s,(0,n.useCallback)((e=>{r&&a.set(e)}),[r,a])]}({groupId:s}),x=(()=>{const e=c??m;return p({value:e,tabValues:a})?e:null})();(0,i.Z)((()=>{x&&l(x)}),[x]);return{selectedValue:o,selectValue:(0,n.useCallback)((e=>{if(!p({value:e,tabValues:a}))throw new Error(`Can't select invalid tab value=${e}`);l(e),u(e),v(e)}),[u,v,a]),tabValues:a}}var v=r(2389);const x={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var g=r(5893);function y(e){let{className:t,block:r,selectedValue:n,selectValue:o,tabValues:i}=e;const l=[],{blockElementScrollPositionUntilNextRender:c}=(0,a.o5)(),d=e=>{const t=e.currentTarget,r=l.indexOf(t),s=i[r].value;s!==n&&(c(t),o(s))},u=e=>{let t=null;switch(e.key){case"Enter":d(e);break;case"ArrowRight":{const r=l.indexOf(e.currentTarget)+1;t=l[r]??l[0];break}case"ArrowLeft":{const r=l.indexOf(e.currentTarget)-1;t=l[r]??l[l.length-1];break}}t?.focus()};return(0,g.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,s.Z)("tabs",{"tabs--block":r},t),children:i.map((e=>{let{value:t,label:r,attributes:a}=e;return(0,g.jsx)("li",{role:"tab",tabIndex:n===t?0:-1,"aria-selected":n===t,ref:e=>l.push(e),onKeyDown:u,onClick:d,...a,className:(0,s.Z)("tabs__item",x.tabItem,a?.className,{"tabs__item--active":n===t}),children:r??t},t)}))})}function b(e){let{lazy:t,children:r,selectedValue:s}=e;const a=(Array.isArray(r)?r:[r]).filter(Boolean);if(t){const e=a.find((e=>e.props.value===s));return e?(0,n.cloneElement)(e,{className:"margin-top--md"}):null}return(0,g.jsx)("div",{className:"margin-top--md",children:a.map(((e,t)=>(0,n.cloneElement)(e,{key:t,hidden:e.props.value!==s})))})}function j(e){const t=m(e);return(0,g.jsxs)("div",{className:(0,s.Z)("tabs-container",x.tabList),children:[(0,g.jsx)(y,{...e,...t}),(0,g.jsx)(b,{...e,...t})]})}function k(e){const t=(0,v.Z)();return(0,g.jsx)(j,{...e,children:u(e.children)},String(t))}},1151:(e,t,r)=>{r.d(t,{Z:()=>i,a:()=>o});var n=r(7294);const s={},a=n.createContext(s);function o(e){const t=n.useContext(a);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function i(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),n.createElement(a.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/a25253bf.7ffd0bb7.js b/assets/js/0aae5e9f.1e3fdf41.js similarity index 98% rename from assets/js/a25253bf.7ffd0bb7.js rename to assets/js/0aae5e9f.1e3fdf41.js index 8600cf0d8..ebb47de1e 100644 --- a/assets/js/a25253bf.7ffd0bb7.js +++ b/assets/js/0aae5e9f.1e3fdf41.js @@ -1 +1 @@ -"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[6047],{5884:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>d,contentTitle:()=>l,default:()=>p,frontMatter:()=>a,metadata:()=>c,toc:()=>u});var o=n(5893),r=n(1151),s=n(4866),i=n(5162);const a={},l="Visual Studio Code Dev Container Setup",c={id:"contributing-guide/local-development/devcontainer",title:"Visual Studio Code Dev Container Setup",description:"The Visual Studio Code Dev Containers lets you use a Docker container as a full-featured development environment.",source:"@site/versioned_docs/version-5.1.0/contributing-guide/local-development/devcontainer.md",sourceDirName:"contributing-guide/local-development",slug:"/contributing-guide/local-development/devcontainer",permalink:"/docs/contributing-guide/local-development/devcontainer",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.1.0/contributing-guide/local-development/devcontainer.md",tags:[],version:"5.1.0",frontMatter:{},sidebar:"contributingGuide",previous:{title:"Local development",permalink:"/docs/category/local-development"},next:{title:"Source code",permalink:"/docs/contributing-guide/local-development/source-code"}},d={},u=[{value:"System requirements",id:"system-requirements",level:2},{value:"Install Git",id:"install-git",level:3},{value:"Install Docker & docker-compose",id:"install-docker--docker-compose",level:3},{value:"Install Visual Studio Code",id:"install-visual-studio-code",level:3},{value:"Install Remote container extension",id:"install-remote-container-extension",level:3},{value:"Fetch Zealot Codesoace",id:"fetch-zealot-codesoace",level:2},{value:"Open the project in a container",id:"open-the-project-in-a-container",level:2},{value:"Start the project",id:"start-the-project",level:2},{value:"Open in browser",id:"open-in-browser",level:2}];function h(e){const t={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",img:"img",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,r.a)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.h1,{id:"visual-studio-code-dev-container-setup",children:"Visual Studio Code Dev Container Setup"}),"\n","\n","\n",(0,o.jsxs)(t.p,{children:[(0,o.jsx)(t.a,{href:"https://code.visualstudio.com/docs/devcontainers/containers",children:"The Visual Studio Code Dev Containers"})," lets you use a Docker container as a full-featured development environment."]}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.img,{src:"https://code.visualstudio.com/assets/docs/devcontainers/containers/architecture-containers.png",alt:"VSCode devcontainer"})}),"\n",(0,o.jsx)(t.h2,{id:"system-requirements",children:"System requirements"}),"\n",(0,o.jsx)(t.p,{children:"Before processing, make sure you have the lateset version of Git, Virsual Studio Code, Docker and docker-compose."}),"\n",(0,o.jsx)(t.h3,{id:"install-git",children:"Install Git"}),"\n",(0,o.jsxs)(t.p,{children:[(0,o.jsx)(t.a,{href:"https://github.com/git-guides/install-git",children:"Install"})," it from offical website."]}),"\n",(0,o.jsx)(t.h3,{id:"install-docker--docker-compose",children:"Install Docker & docker-compose"}),"\n",(0,o.jsxs)(t.ul,{children:["\n",(0,o.jsxs)(t.li,{children:["Windows: ",(0,o.jsx)(t.a,{href:"https://www.docker.com/products/docker-desktop",children:"Docker Desktop"})," 2.0+ on Windows 10 Pro/Enterprise. Windows 10 Home (2004+) requires Docker Desktop 2.3+ and the ",(0,o.jsx)(t.a,{href:"https://aka.ms/vscode-remote/containers/docker-wsl2",children:"WSL 2 back-end"}),". (Docker Toolbox is not supported. Windows container images are not supported.)"]}),"\n",(0,o.jsxs)(t.li,{children:["macOS: ",(0,o.jsx)(t.a,{href:"https://www.docker.com/products/docker-desktop",children:"Docker Desktop"})," 2.0+."]}),"\n",(0,o.jsxs)(t.li,{children:["Linux: ",(0,o.jsx)(t.a,{href:"https://docs.docker.com/install/#supported-platforms",children:"Docker CE/EE"})," 18.06+ and ",(0,o.jsx)(t.a,{href:"https://docs.docker.com/compose/install",children:"Docker Compose"})," 1.21+. (The Ubuntu snap package is not supported.)"]}),"\n"]}),"\n",(0,o.jsx)(t.h3,{id:"install-visual-studio-code",children:"Install Visual Studio Code"}),"\n",(0,o.jsx)(t.p,{children:"Visual Studio Code is a free code editor, which runs on the macOS, Linux, and Windows operating systems."}),"\n",(0,o.jsx)(t.p,{children:"Follow the platform-specific guides below:"}),"\n",(0,o.jsxs)(s.Z,{groupId:"install-vscode",children:[(0,o.jsx)(i.Z,{value:"MacOS",children:(0,o.jsxs)(t.ol,{children:["\n",(0,o.jsxs)(t.li,{children:["Download ",(0,o.jsx)(t.a,{href:"https://go.microsoft.com/fwlink/?LinkID=534106",children:"Visual Studio Code"})," for macOS."]}),"\n",(0,o.jsx)(t.li,{children:"Open the browser's download list and locate the downloaded app or archive."}),"\n",(0,o.jsx)(t.li,{children:"If archive, extract the archive contents. Use double-click for some browsers or select the 'magnifying glass' icon with Safari."}),"\n",(0,o.jsxs)(t.li,{children:["Drag ",(0,o.jsx)(t.code,{children:"Visual Studio Code.app"})," to the Applications folder, making it available in the macOS Launchpad."]}),"\n",(0,o.jsx)(t.li,{children:"Open VS Code from the Applications folder, by double clicking the icon."}),"\n"]})}),(0,o.jsx)(i.Z,{value:"Windows",children:(0,o.jsxs)(t.ol,{children:["\n",(0,o.jsxs)(t.li,{children:["Download the ",(0,o.jsx)(t.a,{href:"https://go.microsoft.com/fwlink/?LinkID=534107",children:"Visual Studio Code installer"})," for Windows."]}),"\n",(0,o.jsx)(t.li,{children:"Once it is downloaded, run the installer (VSCodeUserSetup-{version}.exe). This will only take a minute."}),"\n",(0,o.jsxs)(t.li,{children:["By default, VS Code is installed under ",(0,o.jsx)(t.code,{children:"C:\\Users\\\\{Username\\}\\AppData\\Local\\Programs\\Microsoft VS Code"}),"."]}),"\n"]})}),(0,o.jsx)(i.Z,{value:"Linux",children:(0,o.jsxs)(t.p,{children:["Following the ",(0,o.jsx)(t.a,{href:"https://code.visualstudio.com/docs/setup/linux",children:"offical Linux install guide"}),"."]})})]}),"\n",(0,o.jsx)(t.h3,{id:"install-remote-container-extension",children:"Install Remote container extension"}),"\n",(0,o.jsxs)(t.p,{children:["Install the ",(0,o.jsx)(t.a,{href:"https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers",children:"Remote Container extension"}),"."]}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.img,{alt:"VSCode extension",src:n(9763).Z+"",width:"1000",height:"477"})}),"\n",(0,o.jsx)(t.h2,{id:"fetch-zealot-codesoace",children:"Fetch Zealot Codesoace"}),"\n",(0,o.jsxs)(t.p,{children:["Zealot Codespace was in the ",(0,o.jsx)(t.code,{children:".devcontailer"})," folder of Zealot project, so you need clone the source code."]}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{className:"language-bash",children:"git clone https://github.com/tryzealot/zealot.git\n"})}),"\n",(0,o.jsx)(t.p,{children:"Explan these files in Codespace:"}),"\n",(0,o.jsxs)(t.table,{children:[(0,o.jsx)(t.thead,{children:(0,o.jsxs)(t.tr,{children:[(0,o.jsx)(t.th,{children:"File"}),(0,o.jsx)(t.th,{children:"Description"})]})}),(0,o.jsxs)(t.tbody,{children:[(0,o.jsxs)(t.tr,{children:[(0,o.jsx)(t.td,{children:(0,o.jsx)(t.code,{children:"devcontainer.json"})}),(0,o.jsx)(t.td,{children:"VSCode devcontainer config"})]}),(0,o.jsxs)(t.tr,{children:[(0,o.jsx)(t.td,{children:(0,o.jsx)(t.code,{children:"Dockerfile.base"})}),(0,o.jsx)(t.td,{children:"Base Dockerfile, auto push multi registry servers after changes"})]}),(0,o.jsxs)(t.tr,{children:[(0,o.jsx)(t.td,{children:(0,o.jsx)(t.code,{children:"Dockerfile"})}),(0,o.jsx)(t.td,{children:"Speed up build time, depends on above image."})]}),(0,o.jsxs)(t.tr,{children:[(0,o.jsx)(t.td,{children:(0,o.jsx)(t.code,{children:"docker-compose.yml"})}),(0,o.jsx)(t.td,{children:"All services of Zealot"})]}),(0,o.jsxs)(t.tr,{children:[(0,o.jsx)(t.td,{children:(0,o.jsx)(t.code,{children:"create-db-user.sql"})}),(0,o.jsx)(t.td,{children:"Create user and role for Zealot"})]})]})]}),"\n",(0,o.jsx)(t.h2,{id:"open-the-project-in-a-container",children:"Open the project in a container"}),"\n",(0,o.jsxs)(t.p,{children:["Start Visual Studio Code, run the ",(0,o.jsx)(t.code,{children:"Dev Containers: Open Folder in Container..."})," command in ",(0,o.jsx)(t.a,{href:"https://code.visualstudio.com/docs/getstarted/userinterface#_command-palette",children:"Command Palette"})," and select the Zealot folder."]}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.img,{alt:"VSCode Command Palette",src:n(8979).Z+"",width:"1752",height:"558"})}),"\n",(0,o.jsxs)(t.p,{children:["Click the ",(0,o.jsx)(t.strong,{children:"Starting Dev Container (show log)"})," to review zealot codespace build real time logging messages."]}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.img,{alt:"VSCode Command Palette",src:n(7351).Z+"",width:"1736",height:"846"})}),"\n",(0,o.jsx)(t.p,{children:"When finish the task, project files will load in file explorer and the zsh terminal. Access log outputs messages:"}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{children:"[7293 ms] Start: Run in container: cat /proc/344/environ\n[9836 ms] Port forwarding connection from 53148 > 43379 > 43379 in the container.\n[9836 ms] Start: Run in container: /home/vscode/.vscode-server/bin/5235c6bb189b60b01b1f49062f4ffa42384f8c91/node -e\n[9981 ms] Port forwarding 53148 > 43379 > 43379 stderr: Connection established\n[14988 ms] Port forwarding 53148 > 43379 > 43379 stderr: Remote close\n[14999 ms] Port forwarding 53148 > 43379 > 43379 terminated with code 0 and signal null.\n[29221 ms] Port forwarding 53148 > 43379 > 43379: Local close\n"})}),"\n",(0,o.jsx)(t.p,{children:"In host Docker containers:"}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.img,{alt:"Docker-Compose containers",src:n(2641).Z+"",width:"2180",height:"238"})}),"\n",(0,o.jsx)(t.h2,{id:"start-the-project",children:"Start the project"}),"\n",(0,o.jsxs)(t.p,{children:["Press ",(0,o.jsx)(t.code,{children:"Ctrl + `"})," to open the integrated terminal in Visual Studio Code if it isn't already open. then run ",(0,o.jsx)(t.code,{children:"bin/dev"})," to run all services."]}),"\n",(0,o.jsx)(t.p,{children:"Notice that the terminal prompt might look different than your normal terminal prompt."}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.img,{alt:"VSCode Zealot in Container",src:n(5771).Z+"",width:"3170",height:"1794"})}),"\n",(0,o.jsx)(t.h2,{id:"open-in-browser",children:"Open in browser"}),"\n",(0,o.jsxs)(t.p,{children:["A while after run ",(0,o.jsx)(t.code,{children:"bin/dev"}),", select ",(0,o.jsx)(t.strong,{children:"Ports"})," to see all forwarded ports, ",(0,o.jsx)(t.strong,{children:"Open in Browser"})," in quick way."]}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.img,{alt:"VSCode forwarded ports",src:n(5290).Z+"",width:"2646",height:"814"})})]})}function p(e={}){const{wrapper:t}={...(0,r.a)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(h,{...e})}):h(e)}},5162:(e,t,n)=>{n.d(t,{Z:()=>i});n(7294);var o=n(512);const r={tabItem:"tabItem_Ymn6"};var s=n(5893);function i(e){let{children:t,hidden:n,className:i}=e;return(0,s.jsx)("div",{role:"tabpanel",className:(0,o.Z)(r.tabItem,i),hidden:n,children:t})}},4866:(e,t,n)=>{n.d(t,{Z:()=>k});var o=n(7294),r=n(512),s=n(2466),i=n(6550),a=n(469),l=n(1980),c=n(7392),d=n(12);function u(e){return o.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,o.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function h(e){const{values:t,children:n}=e;return(0,o.useMemo)((()=>{const e=t??function(e){return u(e).map((e=>{let{props:{value:t,label:n,attributes:o,default:r}}=e;return{value:t,label:n,attributes:o,default:r}}))}(n);return function(e){const t=(0,c.l)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,n])}function p(e){let{value:t,tabValues:n}=e;return n.some((e=>e.value===t))}function m(e){let{queryString:t=!1,groupId:n}=e;const r=(0,i.k6)(),s=function(e){let{queryString:t=!1,groupId:n}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!n)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return n??null}({queryString:t,groupId:n});return[(0,l._X)(s),(0,o.useCallback)((e=>{if(!s)return;const t=new URLSearchParams(r.location.search);t.set(s,e),r.replace({...r.location,search:t.toString()})}),[s,r])]}function f(e){const{defaultValue:t,queryString:n=!1,groupId:r}=e,s=h(e),[i,l]=(0,o.useState)((()=>function(e){let{defaultValue:t,tabValues:n}=e;if(0===n.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!p({value:t,tabValues:n}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${n.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const o=n.find((e=>e.default))??n[0];if(!o)throw new Error("Unexpected error: 0 tabValues");return o.value}({defaultValue:t,tabValues:s}))),[c,u]=m({queryString:n,groupId:r}),[f,x]=function(e){let{groupId:t}=e;const n=function(e){return e?`docusaurus.tab.${e}`:null}(t),[r,s]=(0,d.Nk)(n);return[r,(0,o.useCallback)((e=>{n&&s.set(e)}),[n,s])]}({groupId:r}),v=(()=>{const e=c??f;return p({value:e,tabValues:s})?e:null})();(0,a.Z)((()=>{v&&l(v)}),[v]);return{selectedValue:i,selectValue:(0,o.useCallback)((e=>{if(!p({value:e,tabValues:s}))throw new Error(`Can't select invalid tab value=${e}`);l(e),u(e),x(e)}),[u,x,s]),tabValues:s}}var x=n(2389);const v={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var j=n(5893);function g(e){let{className:t,block:n,selectedValue:o,selectValue:i,tabValues:a}=e;const l=[],{blockElementScrollPositionUntilNextRender:c}=(0,s.o5)(),d=e=>{const t=e.currentTarget,n=l.indexOf(t),r=a[n].value;r!==o&&(c(t),i(r))},u=e=>{let t=null;switch(e.key){case"Enter":d(e);break;case"ArrowRight":{const n=l.indexOf(e.currentTarget)+1;t=l[n]??l[0];break}case"ArrowLeft":{const n=l.indexOf(e.currentTarget)-1;t=l[n]??l[l.length-1];break}}t?.focus()};return(0,j.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.Z)("tabs",{"tabs--block":n},t),children:a.map((e=>{let{value:t,label:n,attributes:s}=e;return(0,j.jsx)("li",{role:"tab",tabIndex:o===t?0:-1,"aria-selected":o===t,ref:e=>l.push(e),onKeyDown:u,onClick:d,...s,className:(0,r.Z)("tabs__item",v.tabItem,s?.className,{"tabs__item--active":o===t}),children:n??t},t)}))})}function b(e){let{lazy:t,children:n,selectedValue:r}=e;const s=(Array.isArray(n)?n:[n]).filter(Boolean);if(t){const e=s.find((e=>e.props.value===r));return e?(0,o.cloneElement)(e,{className:"margin-top--md"}):null}return(0,j.jsx)("div",{className:"margin-top--md",children:s.map(((e,t)=>(0,o.cloneElement)(e,{key:t,hidden:e.props.value!==r})))})}function w(e){const t=f(e);return(0,j.jsxs)("div",{className:(0,r.Z)("tabs-container",v.tabList),children:[(0,j.jsx)(g,{...e,...t}),(0,j.jsx)(b,{...e,...t})]})}function k(e){const t=(0,x.Z)();return(0,j.jsx)(w,{...e,children:u(e.children)},String(t))}},8979:(e,t,n)=>{n.d(t,{Z:()=>o});const o=n.p+"assets/images/vscode-command-palette-f37b4fd31c6cdc13244ea925b976f221.png"},2641:(e,t,n)=>{n.d(t,{Z:()=>o});const o=n.p+"assets/images/vscode-devcontainer-docker-containers-2a8afa4acc0d89438d14cd6539e432d8.png"},5290:(e,t,n)=>{n.d(t,{Z:()=>o});const o=n.p+"assets/images/vscode-devcontainer-forwarded-ports-4cf5d371a14b1201857d7c53b692b829.png"},7351:(e,t,n)=>{n.d(t,{Z:()=>o});const o=n.p+"assets/images/vscode-devcontainer-log-c904cb2312799a66dc6acc3ddde7e78f.png"},5771:(e,t,n)=>{n.d(t,{Z:()=>o});const o=n.p+"assets/images/vscode-devcontainer-zealot-592ecc98b9f83a304e22157fd1a31192.png"},9763:(e,t,n)=>{n.d(t,{Z:()=>o});const o=n.p+"assets/images/vscode-install-remote-containers-48120b06a2470bee04804c93fa4d881a.png"},1151:(e,t,n)=>{n.d(t,{Z:()=>a,a:()=>i});var o=n(7294);const r={},s=o.createContext(r);function i(e){const t=o.useContext(s);return o.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:i(e.components),o.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[2564],{1821:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>d,contentTitle:()=>l,default:()=>p,frontMatter:()=>a,metadata:()=>c,toc:()=>u});var o=n(5893),r=n(1151),s=n(4866),i=n(5162);const a={},l="Visual Studio Code Dev Container Setup",c={id:"contributing-guide/local-development/devcontainer",title:"Visual Studio Code Dev Container Setup",description:"The Visual Studio Code Dev Containers lets you use a Docker container as a full-featured development environment.",source:"@site/versioned_docs/version-5.2.0/contributing-guide/local-development/devcontainer.md",sourceDirName:"contributing-guide/local-development",slug:"/contributing-guide/local-development/devcontainer",permalink:"/docs/contributing-guide/local-development/devcontainer",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.2.0/contributing-guide/local-development/devcontainer.md",tags:[],version:"5.2.0",frontMatter:{},sidebar:"contributingGuide",previous:{title:"Local development",permalink:"/docs/category/local-development"},next:{title:"Source code",permalink:"/docs/contributing-guide/local-development/source-code"}},d={},u=[{value:"System requirements",id:"system-requirements",level:2},{value:"Install Git",id:"install-git",level:3},{value:"Install Docker & docker-compose",id:"install-docker--docker-compose",level:3},{value:"Install Visual Studio Code",id:"install-visual-studio-code",level:3},{value:"Install Remote container extension",id:"install-remote-container-extension",level:3},{value:"Fetch Zealot Codesoace",id:"fetch-zealot-codesoace",level:2},{value:"Open the project in a container",id:"open-the-project-in-a-container",level:2},{value:"Start the project",id:"start-the-project",level:2},{value:"Open in browser",id:"open-in-browser",level:2}];function h(e){const t={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",img:"img",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,r.a)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.h1,{id:"visual-studio-code-dev-container-setup",children:"Visual Studio Code Dev Container Setup"}),"\n","\n","\n",(0,o.jsxs)(t.p,{children:[(0,o.jsx)(t.a,{href:"https://code.visualstudio.com/docs/devcontainers/containers",children:"The Visual Studio Code Dev Containers"})," lets you use a Docker container as a full-featured development environment."]}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.img,{src:"https://code.visualstudio.com/assets/docs/devcontainers/containers/architecture-containers.png",alt:"VSCode devcontainer"})}),"\n",(0,o.jsx)(t.h2,{id:"system-requirements",children:"System requirements"}),"\n",(0,o.jsx)(t.p,{children:"Before processing, make sure you have the lateset version of Git, Virsual Studio Code, Docker and docker-compose."}),"\n",(0,o.jsx)(t.h3,{id:"install-git",children:"Install Git"}),"\n",(0,o.jsxs)(t.p,{children:[(0,o.jsx)(t.a,{href:"https://github.com/git-guides/install-git",children:"Install"})," it from offical website."]}),"\n",(0,o.jsx)(t.h3,{id:"install-docker--docker-compose",children:"Install Docker & docker-compose"}),"\n",(0,o.jsxs)(t.ul,{children:["\n",(0,o.jsxs)(t.li,{children:["Windows: ",(0,o.jsx)(t.a,{href:"https://www.docker.com/products/docker-desktop",children:"Docker Desktop"})," 2.0+ on Windows 10 Pro/Enterprise. Windows 10 Home (2004+) requires Docker Desktop 2.3+ and the ",(0,o.jsx)(t.a,{href:"https://aka.ms/vscode-remote/containers/docker-wsl2",children:"WSL 2 back-end"}),". (Docker Toolbox is not supported. Windows container images are not supported.)"]}),"\n",(0,o.jsxs)(t.li,{children:["macOS: ",(0,o.jsx)(t.a,{href:"https://www.docker.com/products/docker-desktop",children:"Docker Desktop"})," 2.0+."]}),"\n",(0,o.jsxs)(t.li,{children:["Linux: ",(0,o.jsx)(t.a,{href:"https://docs.docker.com/install/#supported-platforms",children:"Docker CE/EE"})," 18.06+ and ",(0,o.jsx)(t.a,{href:"https://docs.docker.com/compose/install",children:"Docker Compose"})," 1.21+. (The Ubuntu snap package is not supported.)"]}),"\n"]}),"\n",(0,o.jsx)(t.h3,{id:"install-visual-studio-code",children:"Install Visual Studio Code"}),"\n",(0,o.jsx)(t.p,{children:"Visual Studio Code is a free code editor, which runs on the macOS, Linux, and Windows operating systems."}),"\n",(0,o.jsx)(t.p,{children:"Follow the platform-specific guides below:"}),"\n",(0,o.jsxs)(s.Z,{groupId:"install-vscode",children:[(0,o.jsx)(i.Z,{value:"MacOS",children:(0,o.jsxs)(t.ol,{children:["\n",(0,o.jsxs)(t.li,{children:["Download ",(0,o.jsx)(t.a,{href:"https://go.microsoft.com/fwlink/?LinkID=534106",children:"Visual Studio Code"})," for macOS."]}),"\n",(0,o.jsx)(t.li,{children:"Open the browser's download list and locate the downloaded app or archive."}),"\n",(0,o.jsx)(t.li,{children:"If archive, extract the archive contents. Use double-click for some browsers or select the 'magnifying glass' icon with Safari."}),"\n",(0,o.jsxs)(t.li,{children:["Drag ",(0,o.jsx)(t.code,{children:"Visual Studio Code.app"})," to the Applications folder, making it available in the macOS Launchpad."]}),"\n",(0,o.jsx)(t.li,{children:"Open VS Code from the Applications folder, by double clicking the icon."}),"\n"]})}),(0,o.jsx)(i.Z,{value:"Windows",children:(0,o.jsxs)(t.ol,{children:["\n",(0,o.jsxs)(t.li,{children:["Download the ",(0,o.jsx)(t.a,{href:"https://go.microsoft.com/fwlink/?LinkID=534107",children:"Visual Studio Code installer"})," for Windows."]}),"\n",(0,o.jsx)(t.li,{children:"Once it is downloaded, run the installer (VSCodeUserSetup-{version}.exe). This will only take a minute."}),"\n",(0,o.jsxs)(t.li,{children:["By default, VS Code is installed under ",(0,o.jsx)(t.code,{children:"C:\\Users\\\\{Username\\}\\AppData\\Local\\Programs\\Microsoft VS Code"}),"."]}),"\n"]})}),(0,o.jsx)(i.Z,{value:"Linux",children:(0,o.jsxs)(t.p,{children:["Following the ",(0,o.jsx)(t.a,{href:"https://code.visualstudio.com/docs/setup/linux",children:"offical Linux install guide"}),"."]})})]}),"\n",(0,o.jsx)(t.h3,{id:"install-remote-container-extension",children:"Install Remote container extension"}),"\n",(0,o.jsxs)(t.p,{children:["Install the ",(0,o.jsx)(t.a,{href:"https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers",children:"Remote Container extension"}),"."]}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.img,{alt:"VSCode extension",src:n(9763).Z+"",width:"1000",height:"477"})}),"\n",(0,o.jsx)(t.h2,{id:"fetch-zealot-codesoace",children:"Fetch Zealot Codesoace"}),"\n",(0,o.jsxs)(t.p,{children:["Zealot Codespace was in the ",(0,o.jsx)(t.code,{children:".devcontailer"})," folder of Zealot project, so you need clone the source code."]}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{className:"language-bash",children:"git clone https://github.com/tryzealot/zealot.git\n"})}),"\n",(0,o.jsx)(t.p,{children:"Explan these files in Codespace:"}),"\n",(0,o.jsxs)(t.table,{children:[(0,o.jsx)(t.thead,{children:(0,o.jsxs)(t.tr,{children:[(0,o.jsx)(t.th,{children:"File"}),(0,o.jsx)(t.th,{children:"Description"})]})}),(0,o.jsxs)(t.tbody,{children:[(0,o.jsxs)(t.tr,{children:[(0,o.jsx)(t.td,{children:(0,o.jsx)(t.code,{children:"devcontainer.json"})}),(0,o.jsx)(t.td,{children:"VSCode devcontainer config"})]}),(0,o.jsxs)(t.tr,{children:[(0,o.jsx)(t.td,{children:(0,o.jsx)(t.code,{children:"Dockerfile.base"})}),(0,o.jsx)(t.td,{children:"Base Dockerfile, auto push multi registry servers after changes"})]}),(0,o.jsxs)(t.tr,{children:[(0,o.jsx)(t.td,{children:(0,o.jsx)(t.code,{children:"Dockerfile"})}),(0,o.jsx)(t.td,{children:"Speed up build time, depends on above image."})]}),(0,o.jsxs)(t.tr,{children:[(0,o.jsx)(t.td,{children:(0,o.jsx)(t.code,{children:"docker-compose.yml"})}),(0,o.jsx)(t.td,{children:"All services of Zealot"})]}),(0,o.jsxs)(t.tr,{children:[(0,o.jsx)(t.td,{children:(0,o.jsx)(t.code,{children:"create-db-user.sql"})}),(0,o.jsx)(t.td,{children:"Create user and role for Zealot"})]})]})]}),"\n",(0,o.jsx)(t.h2,{id:"open-the-project-in-a-container",children:"Open the project in a container"}),"\n",(0,o.jsxs)(t.p,{children:["Start Visual Studio Code, run the ",(0,o.jsx)(t.code,{children:"Dev Containers: Open Folder in Container..."})," command in ",(0,o.jsx)(t.a,{href:"https://code.visualstudio.com/docs/getstarted/userinterface#_command-palette",children:"Command Palette"})," and select the Zealot folder."]}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.img,{alt:"VSCode Command Palette",src:n(8979).Z+"",width:"1752",height:"558"})}),"\n",(0,o.jsxs)(t.p,{children:["Click the ",(0,o.jsx)(t.strong,{children:"Starting Dev Container (show log)"})," to review zealot codespace build real time logging messages."]}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.img,{alt:"VSCode Command Palette",src:n(7351).Z+"",width:"1736",height:"846"})}),"\n",(0,o.jsx)(t.p,{children:"When finish the task, project files will load in file explorer and the zsh terminal. Access log outputs messages:"}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{children:"[7293 ms] Start: Run in container: cat /proc/344/environ\n[9836 ms] Port forwarding connection from 53148 > 43379 > 43379 in the container.\n[9836 ms] Start: Run in container: /home/vscode/.vscode-server/bin/5235c6bb189b60b01b1f49062f4ffa42384f8c91/node -e\n[9981 ms] Port forwarding 53148 > 43379 > 43379 stderr: Connection established\n[14988 ms] Port forwarding 53148 > 43379 > 43379 stderr: Remote close\n[14999 ms] Port forwarding 53148 > 43379 > 43379 terminated with code 0 and signal null.\n[29221 ms] Port forwarding 53148 > 43379 > 43379: Local close\n"})}),"\n",(0,o.jsx)(t.p,{children:"In host Docker containers:"}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.img,{alt:"Docker-Compose containers",src:n(2641).Z+"",width:"2180",height:"238"})}),"\n",(0,o.jsx)(t.h2,{id:"start-the-project",children:"Start the project"}),"\n",(0,o.jsxs)(t.p,{children:["Press ",(0,o.jsx)(t.code,{children:"Ctrl + `"})," to open the integrated terminal in Visual Studio Code if it isn't already open. then run ",(0,o.jsx)(t.code,{children:"bin/dev"})," to run all services."]}),"\n",(0,o.jsx)(t.p,{children:"Notice that the terminal prompt might look different than your normal terminal prompt."}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.img,{alt:"VSCode Zealot in Container",src:n(5771).Z+"",width:"3170",height:"1794"})}),"\n",(0,o.jsx)(t.h2,{id:"open-in-browser",children:"Open in browser"}),"\n",(0,o.jsxs)(t.p,{children:["A while after run ",(0,o.jsx)(t.code,{children:"bin/dev"}),", select ",(0,o.jsx)(t.strong,{children:"Ports"})," to see all forwarded ports, ",(0,o.jsx)(t.strong,{children:"Open in Browser"})," in quick way."]}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.img,{alt:"VSCode forwarded ports",src:n(5290).Z+"",width:"2646",height:"814"})})]})}function p(e={}){const{wrapper:t}={...(0,r.a)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(h,{...e})}):h(e)}},5162:(e,t,n)=>{n.d(t,{Z:()=>i});n(7294);var o=n(512);const r={tabItem:"tabItem_Ymn6"};var s=n(5893);function i(e){let{children:t,hidden:n,className:i}=e;return(0,s.jsx)("div",{role:"tabpanel",className:(0,o.Z)(r.tabItem,i),hidden:n,children:t})}},4866:(e,t,n)=>{n.d(t,{Z:()=>k});var o=n(7294),r=n(512),s=n(2466),i=n(6550),a=n(469),l=n(1980),c=n(7392),d=n(12);function u(e){return o.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,o.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function h(e){const{values:t,children:n}=e;return(0,o.useMemo)((()=>{const e=t??function(e){return u(e).map((e=>{let{props:{value:t,label:n,attributes:o,default:r}}=e;return{value:t,label:n,attributes:o,default:r}}))}(n);return function(e){const t=(0,c.l)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,n])}function p(e){let{value:t,tabValues:n}=e;return n.some((e=>e.value===t))}function m(e){let{queryString:t=!1,groupId:n}=e;const r=(0,i.k6)(),s=function(e){let{queryString:t=!1,groupId:n}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!n)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return n??null}({queryString:t,groupId:n});return[(0,l._X)(s),(0,o.useCallback)((e=>{if(!s)return;const t=new URLSearchParams(r.location.search);t.set(s,e),r.replace({...r.location,search:t.toString()})}),[s,r])]}function f(e){const{defaultValue:t,queryString:n=!1,groupId:r}=e,s=h(e),[i,l]=(0,o.useState)((()=>function(e){let{defaultValue:t,tabValues:n}=e;if(0===n.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!p({value:t,tabValues:n}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${n.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const o=n.find((e=>e.default))??n[0];if(!o)throw new Error("Unexpected error: 0 tabValues");return o.value}({defaultValue:t,tabValues:s}))),[c,u]=m({queryString:n,groupId:r}),[f,x]=function(e){let{groupId:t}=e;const n=function(e){return e?`docusaurus.tab.${e}`:null}(t),[r,s]=(0,d.Nk)(n);return[r,(0,o.useCallback)((e=>{n&&s.set(e)}),[n,s])]}({groupId:r}),v=(()=>{const e=c??f;return p({value:e,tabValues:s})?e:null})();(0,a.Z)((()=>{v&&l(v)}),[v]);return{selectedValue:i,selectValue:(0,o.useCallback)((e=>{if(!p({value:e,tabValues:s}))throw new Error(`Can't select invalid tab value=${e}`);l(e),u(e),x(e)}),[u,x,s]),tabValues:s}}var x=n(2389);const v={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var j=n(5893);function g(e){let{className:t,block:n,selectedValue:o,selectValue:i,tabValues:a}=e;const l=[],{blockElementScrollPositionUntilNextRender:c}=(0,s.o5)(),d=e=>{const t=e.currentTarget,n=l.indexOf(t),r=a[n].value;r!==o&&(c(t),i(r))},u=e=>{let t=null;switch(e.key){case"Enter":d(e);break;case"ArrowRight":{const n=l.indexOf(e.currentTarget)+1;t=l[n]??l[0];break}case"ArrowLeft":{const n=l.indexOf(e.currentTarget)-1;t=l[n]??l[l.length-1];break}}t?.focus()};return(0,j.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.Z)("tabs",{"tabs--block":n},t),children:a.map((e=>{let{value:t,label:n,attributes:s}=e;return(0,j.jsx)("li",{role:"tab",tabIndex:o===t?0:-1,"aria-selected":o===t,ref:e=>l.push(e),onKeyDown:u,onClick:d,...s,className:(0,r.Z)("tabs__item",v.tabItem,s?.className,{"tabs__item--active":o===t}),children:n??t},t)}))})}function b(e){let{lazy:t,children:n,selectedValue:r}=e;const s=(Array.isArray(n)?n:[n]).filter(Boolean);if(t){const e=s.find((e=>e.props.value===r));return e?(0,o.cloneElement)(e,{className:"margin-top--md"}):null}return(0,j.jsx)("div",{className:"margin-top--md",children:s.map(((e,t)=>(0,o.cloneElement)(e,{key:t,hidden:e.props.value!==r})))})}function w(e){const t=f(e);return(0,j.jsxs)("div",{className:(0,r.Z)("tabs-container",v.tabList),children:[(0,j.jsx)(g,{...e,...t}),(0,j.jsx)(b,{...e,...t})]})}function k(e){const t=(0,x.Z)();return(0,j.jsx)(w,{...e,children:u(e.children)},String(t))}},8979:(e,t,n)=>{n.d(t,{Z:()=>o});const o=n.p+"assets/images/vscode-command-palette-f37b4fd31c6cdc13244ea925b976f221.png"},2641:(e,t,n)=>{n.d(t,{Z:()=>o});const o=n.p+"assets/images/vscode-devcontainer-docker-containers-2a8afa4acc0d89438d14cd6539e432d8.png"},5290:(e,t,n)=>{n.d(t,{Z:()=>o});const o=n.p+"assets/images/vscode-devcontainer-forwarded-ports-4cf5d371a14b1201857d7c53b692b829.png"},7351:(e,t,n)=>{n.d(t,{Z:()=>o});const o=n.p+"assets/images/vscode-devcontainer-log-c904cb2312799a66dc6acc3ddde7e78f.png"},5771:(e,t,n)=>{n.d(t,{Z:()=>o});const o=n.p+"assets/images/vscode-devcontainer-zealot-592ecc98b9f83a304e22157fd1a31192.png"},9763:(e,t,n)=>{n.d(t,{Z:()=>o});const o=n.p+"assets/images/vscode-install-remote-containers-48120b06a2470bee04804c93fa4d881a.png"},1151:(e,t,n)=>{n.d(t,{Z:()=>a,a:()=>i});var o=n(7294);const r={},s=o.createContext(r);function i(e){const t=o.useContext(s);return o.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:i(e.components),o.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/0afbe734.b4fb2c85.js b/assets/js/0afbe734.b4fb2c85.js new file mode 100644 index 000000000..56eafaf25 --- /dev/null +++ b/assets/js/0afbe734.b4fb2c85.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[3598],{1436:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>s,default:()=>c,frontMatter:()=>r,metadata:()=>u,toc:()=>d});var o=n(5893),i=n(1151);const r={},s="Contributing Guide",u={id:"contributing-guide/index",title:"Contributing Guide",description:"This guide will help you get started with Zealot! Thank you for taking an interest in contributing to Zealot. Before submitting your contribution, please make sure to take a moment and read through the following guidelines:",source:"@site/versioned_docs/version-5.1.0/contributing-guide/index.md",sourceDirName:"contributing-guide",slug:"/contributing-guide/",permalink:"/docs/5.1.0/contributing-guide/",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.1.0/contributing-guide/index.md",tags:[],version:"5.1.0",frontMatter:{},sidebar:"contributingGuide",next:{title:"Local development",permalink:"/docs/5.1.0/category/local-development"}},l={},d=[{value:"Getting Started",id:"getting-started",level:2},{value:"Setup for local development",id:"setup-for-local-development",level:2}];function a(e){const t={a:"a",h1:"h1",h2:"h2",li:"li",p:"p",ul:"ul",...(0,i.a)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.h1,{id:"contributing-guide",children:"Contributing Guide"}),"\n",(0,o.jsx)(t.p,{children:"This guide will help you get started with Zealot! Thank you for taking an interest in contributing to Zealot. Before submitting your contribution, please make sure to take a moment and read through the following guidelines:"}),"\n",(0,o.jsx)(t.p,{children:"This guide will help you to install and setup a production ready Zealot."}),"\n",(0,o.jsx)(t.h2,{id:"getting-started",children:"Getting Started"}),"\n",(0,o.jsx)(t.p,{children:"Before starting your work, ensure an issue exist for it. If not feel free to create one. You can also take a look into the issues tagged Good first issues.\nAdd a comment on the issue and wait for the issue to be assigned before you start working on it.\nThis helps to avoid multiple people working on similar issues.\nIf the solution is complex, propose the solution on the issue and wait for one of the core contributors to approve before going into the implementation.\nThis helps in shorter turn around times in merging PRs\nFor new feature requests, Provide a convincing reason to add this feature. Real-life business use-cases will be super helpful.\nFeel free to join our discord community, if you need further discussions with the core team."}),"\n",(0,o.jsx)(t.h2,{id:"setup-for-local-development",children:"Setup for local development"}),"\n",(0,o.jsx)(t.p,{children:"These guides will help you to setup the environment required for Zealot. Follow the guide based on the operating system you use."}),"\n",(0,o.jsxs)(t.ul,{children:["\n",(0,o.jsx)(t.li,{children:(0,o.jsx)(t.a,{href:"/docs/contributing-guide/local-development/devcontainer",children:"VSCode development with devcontainer"})}),"\n",(0,o.jsx)(t.li,{children:(0,o.jsx)(t.a,{href:"/docs/contributing-guide/local-development/source-code",children:"Soure code"})}),"\n"]})]})}function c(e={}){const{wrapper:t}={...(0,i.a)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(a,{...e})}):a(e)}},1151:(e,t,n)=>{n.d(t,{Z:()=>u,a:()=>s});var o=n(7294);const i={},r=o.createContext(i);function s(e){const t=o.useContext(r);return o.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function u(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:s(e.components),o.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/0ba74476.96e0a064.js b/assets/js/0ba74476.96e0a064.js new file mode 100644 index 000000000..2c2573a7e --- /dev/null +++ b/assets/js/0ba74476.96e0a064.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[6045],{9501:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>d,contentTitle:()=>l,default:()=>m,frontMatter:()=>r,metadata:()=>p,toc:()=>c});var n=i(5893),a=i(1151),o=i(9965),s=i(4996);const r={sidebar_label:"Apple Team"},l="Apple Team (Developer)",p={id:"user-guide/administrator/apple-team",title:"Apple Team (Developer)",description:"One of the biggest challenges in distributing Ad-Hoc signed applications for iOS is the need to",source:"@site/versioned_docs/version-5.1.0/user-guide/administrator/apple-team.mdx",sourceDirName:"user-guide/administrator",slug:"/user-guide/administrator/apple-team",permalink:"/docs/5.1.0/user-guide/administrator/apple-team",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.1.0/user-guide/administrator/apple-team.mdx",tags:[],version:"5.1.0",frontMatter:{sidebar_label:"Apple Team"},sidebar:"userGuide",previous:{title:"Administrator",permalink:"/docs/5.1.0/category/administrator"},next:{title:"Permissions",permalink:"/docs/5.1.0/user-guide/administrator/permissions"}},d={},c=[];function h(e){const t={a:"a",h1:"h1",p:"p",...(0,a.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.h1,{id:"apple-team-developer",children:"Apple Team (Developer)"}),"\n",(0,n.jsx)(t.p,{children:"One of the biggest challenges in distributing Ad-Hoc signed applications for iOS is the need to\nconvey what a UDID is and how to obtain it to a large number of people who may not understand\nthese concepts. After obtaining the UDID, it then needs to be provided to the developer,\nwho must then re-sign the certificate, package it, and upload it for installation."}),"\n",(0,n.jsx)(t.p,{children:"Zealot can automatically obtain the UDID of Ad-Hoc applications.\nAlthough the UDIDs are usually accompanied by device names during registration,\nsometimes it is difficult to understand which device belongs to whom when presented with a\nlist of UDIDs. To solve this problem, Zealot has tried several solutions. In the early days,\nthe fastlane plugin zealotsyncdevice was used to synchronize the names and models of testing devices.\nWith the release of the AppStoreConnect API, Zealot can now completely automate the process,\ngreatly simplifying the registration process and allowing testing applications to display\nrecognizable and friendly device names."}),"\n",(0,n.jsx)(o.Z,{alt:"Register processing",sources:{light:(0,s.Z)("/img/5.0.0/apple-team/flows-light.png"),dark:(0,s.Z)("/img/5.0.0/apple-team/flows-dark.png")}}),"\n",(0,n.jsx)(t.p,{children:"Although providing the UDID of a device confirms which applications can be installed,\nproviding a feature to register a testing device that has not been registered with any application\nwould greatly improve the efficiency of the team. This is the role of the Apple Developer feature."}),"\n",(0,n.jsx)(o.Z,{alt:"Apple deveoper detail preview",sources:{light:(0,s.Z)("/img/apple-team/apple-team-detail-light.png"),dark:(0,s.Z)("/img/apple-team/apple-team-detail-dark.png")}}),"\n",(0,n.jsxs)(t.p,{children:["The initial feature introduction: ",(0,n.jsx)(t.a,{href:"https://github.com/tryzealot/zealot/issues/723",children:"https://github.com/tryzealot/zealot/issues/723"}),"."]})]})}function m(e={}){const{wrapper:t}={...(0,a.a)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(h,{...e})}):h(e)}},1151:(e,t,i)=>{i.d(t,{Z:()=>r,a:()=>s});var n=i(7294);const a={},o=n.createContext(a);function s(e){const t=n.useContext(o);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function r(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:s(e.components),n.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/0d8f1148.2d2d356e.js b/assets/js/0d8f1148.2d2d356e.js new file mode 100644 index 000000000..c95995716 --- /dev/null +++ b/assets/js/0d8f1148.2d2d356e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[2556],{2723:e=>{e.exports=JSON.parse('{"title":"Apps","slug":"/category/apps","permalink":"/docs/5.1.0/category/apps","navigation":{"previous":{"title":"Dashboard","permalink":"/docs/5.1.0/user-guide/dashboard"},"next":{"title":"Create an App","permalink":"/docs/5.1.0/user-guide/apps/create"}}}')}}]); \ No newline at end of file diff --git a/assets/js/f55eae9a.43d3bd42.js b/assets/js/0dc6f082.8e3f42ba.js similarity index 97% rename from assets/js/f55eae9a.43d3bd42.js rename to assets/js/0dc6f082.8e3f42ba.js index 3ea3d4789..52347fec9 100644 --- a/assets/js/f55eae9a.43d3bd42.js +++ b/assets/js/0dc6f082.8e3f42ba.js @@ -1 +1 @@ -"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[9166],{6505:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>i,default:()=>h,frontMatter:()=>o,metadata:()=>u,toc:()=>d});var a=t(5893),r=t(1151),l=t(4866),s=t(5162);const o={sidebar_label:"Android"},i="Zealot Android SDK",u={id:"developer-guide/sdk/android",title:"Zealot Android SDK",description:"The Android component provides a service to check for new versions and installations for Zealot, supporting both Kotlin and Java.",source:"@site/versioned_docs/version-5.1.0/developer-guide/sdk/android.md",sourceDirName:"developer-guide/sdk",slug:"/developer-guide/sdk/android",permalink:"/docs/developer-guide/sdk/android",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.1.0/developer-guide/sdk/android.md",tags:[],version:"5.1.0",frontMatter:{sidebar_label:"Android"},sidebar:"developerGuide",previous:{title:"iOS",permalink:"/docs/developer-guide/sdk/ios"},next:{title:"Fastlane plugins",permalink:"/docs/developer-guide/fastlane"}},c={},d=[{value:"Install",id:"install",level:2},{value:"JitPack",id:"jitpack",level:3},{value:"Permission",id:"permission",level:2},{value:"Usages",id:"usages",level:2}];function p(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",p:"p",pre:"pre",...(0,r.a)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(n.h1,{id:"zealot-android-sdk",children:"Zealot Android SDK"}),"\n",(0,a.jsx)(n.p,{children:"The Android component provides a service to check for new versions and installations for Zealot, supporting both Kotlin and Java."}),"\n",(0,a.jsx)(n.h2,{id:"install",children:"Install"}),"\n",(0,a.jsx)(n.h3,{id:"jitpack",children:"JitPack"}),"\n",(0,a.jsxs)(n.p,{children:["Using ",(0,a.jsx)(n.a,{href:"https://jitpack.io",children:"jitpack"})," to install\uff1a"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-groovy",children:"allprojects {\n repositories {\n ...\n maven { url 'https://jitpack.io' }\n }\n}\n"})}),"\n",(0,a.jsxs)(n.p,{children:["In ",(0,a.jsx)(n.code,{children:"build.gradle"})," file of main app project add:"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-groovy",children:"dependencies {\n implementation 'com.github.tryzealot:zealot-android:master-SNAPSHOT'\n}\n"})}),"\n",(0,a.jsx)(n.h2,{id:"permission",children:"Permission"}),"\n",(0,a.jsx)(n.p,{children:"Zealot needs internet permission"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-xml",children:'\n'})}),"\n",(0,a.jsx)(n.h2,{id:"usages",children:"Usages"}),"\n",(0,a.jsxs)(n.p,{children:["Add the start code to the ",(0,a.jsx)(n.code,{children:"onCreate"})," method block of your ",(0,a.jsx)(n.code,{children:"Application"})," file:"]}),"\n","\n","\n",(0,a.jsxs)(l.Z,{groupId:"android-zealot-sdk",children:[(0,a.jsx)(s.Z,{value:"Kotlin",children:(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-kotlin",children:'// Single channel\nZealot.create(getActivity())\n .setEndpoint("https://zealot.com")\n .setChannelKey("...")\n .setBuildType(BuildConfig.BUILD_TYPE)\n .launch()\n\n// Multi-channel, such as beta, adhoc versions\nZealot.create(getActivity())\n .setEndpoint("https://zealot.com")\n .setChannelKey("xxxxxxx", "beta")\n .setCHannelKey("yyyyyyy", "test")\n .setBuildType(BuildConfig.BUILD_TYPE)\n .launch()\n'})})}),(0,a.jsx)(s.Z,{value:"Java",children:(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-java",children:'// Single channel\nZealot.create(getActivity())\n .setEndpoint("https://zealot.com")\n .setChannelKey("...")\n .setBuildType(BuildConfig.BUILD_TYPE)\n .launch();\n\n// Multi-channel, such as beta, adhoc versions\nZealot.create(getActivity())\n .setEndpoint("https://zealot.com")\n .setChannelKey("xxxxxxx", "beta")\n .setCHannelKey("yyyyyyy", "test")\n .setBuildType(BuildConfig.BUILD_TYPE)\n .launch();\n'})})})]})]})}function h(e={}){const{wrapper:n}={...(0,r.a)(),...e.components};return n?(0,a.jsx)(n,{...e,children:(0,a.jsx)(p,{...e})}):p(e)}},5162:(e,n,t)=>{t.d(n,{Z:()=>s});t(7294);var a=t(512);const r={tabItem:"tabItem_Ymn6"};var l=t(5893);function s(e){let{children:n,hidden:t,className:s}=e;return(0,l.jsx)("div",{role:"tabpanel",className:(0,a.Z)(r.tabItem,s),hidden:t,children:n})}},4866:(e,n,t)=>{t.d(n,{Z:()=>k});var a=t(7294),r=t(512),l=t(2466),s=t(6550),o=t(469),i=t(1980),u=t(7392),c=t(12);function d(e){return a.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,a.isValidElement)(e)&&function(e){const{props:n}=e;return!!n&&"object"==typeof n&&"value"in n}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function p(e){const{values:n,children:t}=e;return(0,a.useMemo)((()=>{const e=n??function(e){return d(e).map((e=>{let{props:{value:n,label:t,attributes:a,default:r}}=e;return{value:n,label:t,attributes:a,default:r}}))}(t);return function(e){const n=(0,u.l)(e,((e,n)=>e.value===n.value));if(n.length>0)throw new Error(`Docusaurus error: Duplicate values "${n.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[n,t])}function h(e){let{value:n,tabValues:t}=e;return t.some((e=>e.value===n))}function m(e){let{queryString:n=!1,groupId:t}=e;const r=(0,s.k6)(),l=function(e){let{queryString:n=!1,groupId:t}=e;if("string"==typeof n)return n;if(!1===n)return null;if(!0===n&&!t)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return t??null}({queryString:n,groupId:t});return[(0,i._X)(l),(0,a.useCallback)((e=>{if(!l)return;const n=new URLSearchParams(r.location.search);n.set(l,e),r.replace({...r.location,search:n.toString()})}),[l,r])]}function v(e){const{defaultValue:n,queryString:t=!1,groupId:r}=e,l=p(e),[s,i]=(0,a.useState)((()=>function(e){let{defaultValue:n,tabValues:t}=e;if(0===t.length)throw new Error("Docusaurus error: the component requires at least one children component");if(n){if(!h({value:n,tabValues:t}))throw new Error(`Docusaurus error: The has a defaultValue "${n}" but none of its children has the corresponding value. Available values are: ${t.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return n}const a=t.find((e=>e.default))??t[0];if(!a)throw new Error("Unexpected error: 0 tabValues");return a.value}({defaultValue:n,tabValues:l}))),[u,d]=m({queryString:t,groupId:r}),[v,f]=function(e){let{groupId:n}=e;const t=function(e){return e?`docusaurus.tab.${e}`:null}(n),[r,l]=(0,c.Nk)(t);return[r,(0,a.useCallback)((e=>{t&&l.set(e)}),[t,l])]}({groupId:r}),b=(()=>{const e=u??v;return h({value:e,tabValues:l})?e:null})();(0,o.Z)((()=>{b&&i(b)}),[b]);return{selectedValue:s,selectValue:(0,a.useCallback)((e=>{if(!h({value:e,tabValues:l}))throw new Error(`Can't select invalid tab value=${e}`);i(e),d(e),f(e)}),[d,f,l]),tabValues:l}}var f=t(2389);const b={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var g=t(5893);function x(e){let{className:n,block:t,selectedValue:a,selectValue:s,tabValues:o}=e;const i=[],{blockElementScrollPositionUntilNextRender:u}=(0,l.o5)(),c=e=>{const n=e.currentTarget,t=i.indexOf(n),r=o[t].value;r!==a&&(u(n),s(r))},d=e=>{let n=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":{const t=i.indexOf(e.currentTarget)+1;n=i[t]??i[0];break}case"ArrowLeft":{const t=i.indexOf(e.currentTarget)-1;n=i[t]??i[i.length-1];break}}n?.focus()};return(0,g.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.Z)("tabs",{"tabs--block":t},n),children:o.map((e=>{let{value:n,label:t,attributes:l}=e;return(0,g.jsx)("li",{role:"tab",tabIndex:a===n?0:-1,"aria-selected":a===n,ref:e=>i.push(e),onKeyDown:d,onClick:c,...l,className:(0,r.Z)("tabs__item",b.tabItem,l?.className,{"tabs__item--active":a===n}),children:t??n},n)}))})}function y(e){let{lazy:n,children:t,selectedValue:r}=e;const l=(Array.isArray(t)?t:[t]).filter(Boolean);if(n){const e=l.find((e=>e.props.value===r));return e?(0,a.cloneElement)(e,{className:"margin-top--md"}):null}return(0,g.jsx)("div",{className:"margin-top--md",children:l.map(((e,n)=>(0,a.cloneElement)(e,{key:n,hidden:e.props.value!==r})))})}function j(e){const n=v(e);return(0,g.jsxs)("div",{className:(0,r.Z)("tabs-container",b.tabList),children:[(0,g.jsx)(x,{...e,...n}),(0,g.jsx)(y,{...e,...n})]})}function k(e){const n=(0,f.Z)();return(0,g.jsx)(j,{...e,children:d(e.children)},String(n))}},1151:(e,n,t)=>{t.d(n,{Z:()=>o,a:()=>s});var a=t(7294);const r={},l=a.createContext(r);function s(e){const n=a.useContext(l);return a.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:s(e.components),a.createElement(l.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[4984],{2607:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>i,default:()=>h,frontMatter:()=>o,metadata:()=>u,toc:()=>d});var a=t(5893),r=t(1151),l=t(4866),s=t(5162);const o={sidebar_label:"Android"},i="Zealot Android SDK",u={id:"developer-guide/sdk/android",title:"Zealot Android SDK",description:"The Android component provides a service to check for new versions and installations for Zealot, supporting both Kotlin and Java.",source:"@site/versioned_docs/version-5.2.0/developer-guide/sdk/android.md",sourceDirName:"developer-guide/sdk",slug:"/developer-guide/sdk/android",permalink:"/docs/developer-guide/sdk/android",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.2.0/developer-guide/sdk/android.md",tags:[],version:"5.2.0",frontMatter:{sidebar_label:"Android"},sidebar:"developerGuide",previous:{title:"iOS",permalink:"/docs/developer-guide/sdk/ios"},next:{title:"Fastlane plugins",permalink:"/docs/developer-guide/fastlane"}},c={},d=[{value:"Install",id:"install",level:2},{value:"JitPack",id:"jitpack",level:3},{value:"Permission",id:"permission",level:2},{value:"Usages",id:"usages",level:2}];function p(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",p:"p",pre:"pre",...(0,r.a)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(n.h1,{id:"zealot-android-sdk",children:"Zealot Android SDK"}),"\n",(0,a.jsx)(n.p,{children:"The Android component provides a service to check for new versions and installations for Zealot, supporting both Kotlin and Java."}),"\n",(0,a.jsx)(n.h2,{id:"install",children:"Install"}),"\n",(0,a.jsx)(n.h3,{id:"jitpack",children:"JitPack"}),"\n",(0,a.jsxs)(n.p,{children:["Using ",(0,a.jsx)(n.a,{href:"https://jitpack.io",children:"jitpack"})," to install\uff1a"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-groovy",children:"allprojects {\n repositories {\n ...\n maven { url 'https://jitpack.io' }\n }\n}\n"})}),"\n",(0,a.jsxs)(n.p,{children:["In ",(0,a.jsx)(n.code,{children:"build.gradle"})," file of main app project add:"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-groovy",children:"dependencies {\n implementation 'com.github.tryzealot:zealot-android:master-SNAPSHOT'\n}\n"})}),"\n",(0,a.jsx)(n.h2,{id:"permission",children:"Permission"}),"\n",(0,a.jsx)(n.p,{children:"Zealot needs internet permission"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-xml",children:'\n'})}),"\n",(0,a.jsx)(n.h2,{id:"usages",children:"Usages"}),"\n",(0,a.jsxs)(n.p,{children:["Add the start code to the ",(0,a.jsx)(n.code,{children:"onCreate"})," method block of your ",(0,a.jsx)(n.code,{children:"Application"})," file:"]}),"\n","\n","\n",(0,a.jsxs)(l.Z,{groupId:"android-zealot-sdk",children:[(0,a.jsx)(s.Z,{value:"Kotlin",children:(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-kotlin",children:'// Single channel\nZealot.create(getActivity())\n .setEndpoint("https://zealot.com")\n .setChannelKey("...")\n .setBuildType(BuildConfig.BUILD_TYPE)\n .launch()\n\n// Multi-channel, such as beta, adhoc versions\nZealot.create(getActivity())\n .setEndpoint("https://zealot.com")\n .setChannelKey("xxxxxxx", "beta")\n .setCHannelKey("yyyyyyy", "test")\n .setBuildType(BuildConfig.BUILD_TYPE)\n .launch()\n'})})}),(0,a.jsx)(s.Z,{value:"Java",children:(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-java",children:'// Single channel\nZealot.create(getActivity())\n .setEndpoint("https://zealot.com")\n .setChannelKey("...")\n .setBuildType(BuildConfig.BUILD_TYPE)\n .launch();\n\n// Multi-channel, such as beta, adhoc versions\nZealot.create(getActivity())\n .setEndpoint("https://zealot.com")\n .setChannelKey("xxxxxxx", "beta")\n .setCHannelKey("yyyyyyy", "test")\n .setBuildType(BuildConfig.BUILD_TYPE)\n .launch();\n'})})})]})]})}function h(e={}){const{wrapper:n}={...(0,r.a)(),...e.components};return n?(0,a.jsx)(n,{...e,children:(0,a.jsx)(p,{...e})}):p(e)}},5162:(e,n,t)=>{t.d(n,{Z:()=>s});t(7294);var a=t(512);const r={tabItem:"tabItem_Ymn6"};var l=t(5893);function s(e){let{children:n,hidden:t,className:s}=e;return(0,l.jsx)("div",{role:"tabpanel",className:(0,a.Z)(r.tabItem,s),hidden:t,children:n})}},4866:(e,n,t)=>{t.d(n,{Z:()=>k});var a=t(7294),r=t(512),l=t(2466),s=t(6550),o=t(469),i=t(1980),u=t(7392),c=t(12);function d(e){return a.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,a.isValidElement)(e)&&function(e){const{props:n}=e;return!!n&&"object"==typeof n&&"value"in n}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function p(e){const{values:n,children:t}=e;return(0,a.useMemo)((()=>{const e=n??function(e){return d(e).map((e=>{let{props:{value:n,label:t,attributes:a,default:r}}=e;return{value:n,label:t,attributes:a,default:r}}))}(t);return function(e){const n=(0,u.l)(e,((e,n)=>e.value===n.value));if(n.length>0)throw new Error(`Docusaurus error: Duplicate values "${n.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[n,t])}function h(e){let{value:n,tabValues:t}=e;return t.some((e=>e.value===n))}function m(e){let{queryString:n=!1,groupId:t}=e;const r=(0,s.k6)(),l=function(e){let{queryString:n=!1,groupId:t}=e;if("string"==typeof n)return n;if(!1===n)return null;if(!0===n&&!t)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return t??null}({queryString:n,groupId:t});return[(0,i._X)(l),(0,a.useCallback)((e=>{if(!l)return;const n=new URLSearchParams(r.location.search);n.set(l,e),r.replace({...r.location,search:n.toString()})}),[l,r])]}function v(e){const{defaultValue:n,queryString:t=!1,groupId:r}=e,l=p(e),[s,i]=(0,a.useState)((()=>function(e){let{defaultValue:n,tabValues:t}=e;if(0===t.length)throw new Error("Docusaurus error: the component requires at least one children component");if(n){if(!h({value:n,tabValues:t}))throw new Error(`Docusaurus error: The has a defaultValue "${n}" but none of its children has the corresponding value. Available values are: ${t.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return n}const a=t.find((e=>e.default))??t[0];if(!a)throw new Error("Unexpected error: 0 tabValues");return a.value}({defaultValue:n,tabValues:l}))),[u,d]=m({queryString:t,groupId:r}),[v,f]=function(e){let{groupId:n}=e;const t=function(e){return e?`docusaurus.tab.${e}`:null}(n),[r,l]=(0,c.Nk)(t);return[r,(0,a.useCallback)((e=>{t&&l.set(e)}),[t,l])]}({groupId:r}),b=(()=>{const e=u??v;return h({value:e,tabValues:l})?e:null})();(0,o.Z)((()=>{b&&i(b)}),[b]);return{selectedValue:s,selectValue:(0,a.useCallback)((e=>{if(!h({value:e,tabValues:l}))throw new Error(`Can't select invalid tab value=${e}`);i(e),d(e),f(e)}),[d,f,l]),tabValues:l}}var f=t(2389);const b={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var g=t(5893);function x(e){let{className:n,block:t,selectedValue:a,selectValue:s,tabValues:o}=e;const i=[],{blockElementScrollPositionUntilNextRender:u}=(0,l.o5)(),c=e=>{const n=e.currentTarget,t=i.indexOf(n),r=o[t].value;r!==a&&(u(n),s(r))},d=e=>{let n=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":{const t=i.indexOf(e.currentTarget)+1;n=i[t]??i[0];break}case"ArrowLeft":{const t=i.indexOf(e.currentTarget)-1;n=i[t]??i[i.length-1];break}}n?.focus()};return(0,g.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.Z)("tabs",{"tabs--block":t},n),children:o.map((e=>{let{value:n,label:t,attributes:l}=e;return(0,g.jsx)("li",{role:"tab",tabIndex:a===n?0:-1,"aria-selected":a===n,ref:e=>i.push(e),onKeyDown:d,onClick:c,...l,className:(0,r.Z)("tabs__item",b.tabItem,l?.className,{"tabs__item--active":a===n}),children:t??n},n)}))})}function y(e){let{lazy:n,children:t,selectedValue:r}=e;const l=(Array.isArray(t)?t:[t]).filter(Boolean);if(n){const e=l.find((e=>e.props.value===r));return e?(0,a.cloneElement)(e,{className:"margin-top--md"}):null}return(0,g.jsx)("div",{className:"margin-top--md",children:l.map(((e,n)=>(0,a.cloneElement)(e,{key:n,hidden:e.props.value!==r})))})}function j(e){const n=v(e);return(0,g.jsxs)("div",{className:(0,r.Z)("tabs-container",b.tabList),children:[(0,g.jsx)(x,{...e,...n}),(0,g.jsx)(y,{...e,...n})]})}function k(e){const n=(0,f.Z)();return(0,g.jsx)(j,{...e,children:d(e.children)},String(n))}},1151:(e,n,t)=>{t.d(n,{Z:()=>o,a:()=>s});var a=t(7294);const r={},l=a.createContext(r);function s(e){const n=a.useContext(l);return a.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:s(e.components),a.createElement(l.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/0df53633.d1e23683.js b/assets/js/0df53633.d1e23683.js new file mode 100644 index 000000000..04cf9adba --- /dev/null +++ b/assets/js/0df53633.d1e23683.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[8179],{7517:e=>{e.exports=JSON.parse('{"title":"Configuration","slug":"/category/configuration","permalink":"/docs/5.1.0/category/configuration","navigation":{"previous":{"title":"Render","permalink":"/docs/5.1.0/self-hosted/deployment/render"},"next":{"title":"Environment Variables","permalink":"/docs/5.1.0/self-hosted/configuration/environment-variables"}}}')}}]); \ No newline at end of file diff --git a/assets/js/0f9bdb85.3d9053e0.js b/assets/js/0f9bdb85.3d9053e0.js new file mode 100644 index 000000000..3b0048c03 --- /dev/null +++ b/assets/js/0f9bdb85.3d9053e0.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[8590],{4122:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>l,contentTitle:()=>i,default:()=>u,frontMatter:()=>a,metadata:()=>r,toc:()=>c});var o=t(5893),s=t(1151);const a={},i="Webhooks",r={id:"user-guide/webhooks",title:"Webhooks",description:"Zealot provides a webhook for message notifications for each application channel.",source:"@site/versioned_docs/version-5.2.0/user-guide/webhooks.md",sourceDirName:"user-guide",slug:"/user-guide/webhooks",permalink:"/docs/user-guide/webhooks",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.2.0/user-guide/webhooks.md",tags:[],version:"5.2.0",frontMatter:{},sidebar:"userGuide",previous:{title:"Fetch UDID",permalink:"/docs/user-guide/toolkits/fetch-udid"},next:{title:"Slack",permalink:"/docs/user-guide/webhooks/slack"}},l={},c=[{value:"Payload (default)",id:"payload-default",level:2}];function d(e){const n={code:"code",h1:"h1",h2:"h2",p:"p",pre:"pre",...(0,s.a)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.h1,{id:"webhooks",children:"Webhooks"}),"\n",(0,o.jsx)(n.p,{children:"Zealot provides a webhook for message notifications for each application channel.\nThe webhook is a fully customizable structure that can be used for most notification services, such as Wecom, Dingtalk, Slack, etc."}),"\n",(0,o.jsx)(n.h2,{id:"payload-default",children:"Payload (default)"}),"\n",(0,o.jsxs)(n.p,{children:["Each parameter of the default structure has its value provided as a variable,\nand each variable starts with ",(0,o.jsx)(n.code,{children:"@"}),", the default structure will be used if the custom structure is left empty when creating the webhook.\nThe following variables are all provided."]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-ruby",children:"{\n event: @event,\n username: @username,\n email: @email,\n title: @title,\n app_name: @name,\n device_type: @device_type,\n release_version: @release_version,\n build_version: @build_version,\n size: @file_size,\n changelog: @changelog,\n install_url: @install_url,\n icon_url: @icon_url,\n qrcode_url: @qrcode_url,\n uploaded_at: @uploaded_at\n}\n"})}),"\n",(0,o.jsx)(n.p,{children:"Output:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-json",children:'{\n "event": "upload_events",\n "username": "foobar",\n "email": "foobar@example.com",\n "title": "Zealot upload 1.0.0 version",\n "app_name": "Zealot",\n "device_type": "iOS",\n "release_version": "1.0.0",\n "build_version": "1",\n "size": "30 MB",\n "install_url": "https://zealot.test/api/apps/download/12354",\n "icon_url": "https://zealot.test/api/apps/icon.png",\n "qrcode_url": "https://zealot.test/api/apps/354/qrcode",\n "uploaded_at": "2019-12-30 11:33:00",\n "changelog": "- Add feture A\\n- Fix issue B\\n- Release v1.0.0",\n}\n'})})]})}function u(e={}){const{wrapper:n}={...(0,s.a)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},1151:(e,n,t)=>{t.d(n,{Z:()=>r,a:()=>i});var o=t(7294);const s={},a=o.createContext(s);function i(e){const n=o.useContext(a);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:i(e.components),o.createElement(a.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/13fb7505.84a0d7f6.js b/assets/js/13fb7505.84a0d7f6.js new file mode 100644 index 000000000..fde1b9be1 --- /dev/null +++ b/assets/js/13fb7505.84a0d7f6.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[6780],{2888:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>a,contentTitle:()=>r,default:()=>h,frontMatter:()=>o,metadata:()=>l,toc:()=>c});var t=i(5893),s=i(1151);const o={},r="Third-party Authentication",l={id:"self-hosted/configuration/third-party-authentication",title:"Third-party Authentication",description:"Zealot supports authorized logins using supported third-party services, which can be currently configured via the following environment variables or in the settings page of the admin panel.",source:"@site/versioned_docs/version-5.1.0/self-hosted/configuration/third-party-authentication.md",sourceDirName:"self-hosted/configuration",slug:"/self-hosted/configuration/third-party-authentication",permalink:"/docs/5.1.0/self-hosted/configuration/third-party-authentication",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.1.0/self-hosted/configuration/third-party-authentication.md",tags:[],version:"5.1.0",frontMatter:{},sidebar:"selfHosted",previous:{title:"Environment Variables",permalink:"/docs/5.1.0/self-hosted/configuration/environment-variables"},next:{title:"Schedule Jobs",permalink:"/docs/5.1.0/self-hosted/configuration/schedule-jobs"}},a={},c=[{value:"Gitlab",id:"gitlab",level:2},{value:"Google",id:"google",level:2},{value:"Feishu (Lark)",id:"feishu-lark",level:2},{value:"LDAP",id:"ldap",level:2},{value:"OpenID Connect",id:"openid-connect",level:2},{value:"Auto-discovery",id:"auto-discovery",level:3},{value:"Manual",id:"manual",level:3}];function d(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",li:"li",ol:"ol",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,s.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h1,{id:"third-party-authentication",children:"Third-party Authentication"}),"\n",(0,t.jsx)(n.p,{children:"Zealot supports authorized logins using supported third-party services, which can be currently configured via the following environment variables or in the settings page of the admin panel."}),"\n",(0,t.jsxs)(n.table,{children:[(0,t.jsx)(n.thead,{children:(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.th,{children:"Service"}),(0,t.jsx)(n.th,{children:"provider"})]})}),(0,t.jsxs)(n.tbody,{children:[(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"Feishu"}),(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"feishu"})})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"Gitlab"}),(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"gitlab"})})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"Google"}),(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"google_oauth2"})})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"LDAP"}),(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"ldap"})})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"OpenID Connect"}),(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"openid_connect"})})]})]})]}),"\n",(0,t.jsx)(n.p,{children:"If the above services need to set the callback address please set it uniformly as follows"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"http://zealot.com/users/auth/:provider/callback\n"})}),"\n",(0,t.jsxs)(n.p,{children:["where ",(0,t.jsx)(n.code,{children:":provider"})," is the identifier of the above supported third-party service, for example:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"# if Google is enabled, then replace `:provider` with `google_oauth2`.\nhttp://zealot.com/users/auth/google_oauth2/callback\n"})}),"\n",(0,t.jsx)(n.h2,{id:"gitlab",children:"Gitlab"}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:["Register a Gitlab ",(0,t.jsx)(n.a,{href:"http://gitlab.com",children:"On line"})," account or use self-host service"]}),"\n",(0,t.jsx)(n.li,{children:"Create an application in Preferences -> Applications page."}),"\n",(0,t.jsxs)(n.li,{children:["Configure ",(0,t.jsx)(n.code,{children:"Redirect URI"})," such like ",(0,t.jsx)(n.code,{children:"http://zealot.com/users/auth/gitlab/callback"})," (replace the domain in your case)"]}),"\n",(0,t.jsxs)(n.li,{children:["Check scope: ",(0,t.jsx)(n.code,{children:"read_user"}),"\uff0cBy default zealot only uses this license, if your enable scope is ",(0,t.jsx)(n.code,{children:"api"})," that's fine too"]}),"\n"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"GITLAB_ENABLED=true\nGITLAB_SITE=https://gitlab.com/api/v4\nGITLAB_SCOPE=read_user\nGITLAB_APP_ID=\nGITLAB_SECRET=\n"})}),"\n",(0,t.jsx)(n.h2,{id:"google",children:"Google"}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsx)(n.li,{children:"Register a Google account"}),"\n",(0,t.jsxs)(n.li,{children:["Enable ",(0,t.jsx)(n.a,{href:"https://console.cloud.google.com/apis/dashboard",children:"Google Cloud Platform"})," service"]}),"\n",(0,t.jsx)(n.li,{children:"Choose or create a Project then go to Credentials page"}),"\n",(0,t.jsxs)(n.li,{children:["Create OAuth Client ID with Web Application, and configure Authorized redirect URI such like ",(0,t.jsx)(n.code,{children:"http://zealot.com/users/auth/google_oauth2/callback"})," (replace the domain in your case)"]}),"\n"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"GOOGLE_OAUTH_ENABLED=true\nGOOGLE_CLIENT_ID=\nGOOGLE_SECRET=\n"})}),"\n",(0,t.jsx)(n.h2,{id:"feishu-lark",children:"Feishu (Lark)"}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsx)(n.li,{children:"Register a feishu (lark) account and download the Phone app."}),"\n",(0,t.jsxs)(n.li,{children:["Enable ",(0,t.jsx)(n.a,{href:"https://open.feishu.cn/app/",children:"Open platform"})," and create application to get app_id, app_secret"]}),"\n",(0,t.jsxs)(n.li,{children:["Configure callback url such like ",(0,t.jsx)(n.code,{children:"http://zealot.com/users/auth/feishu/callback"})," (replace the domain in your case)"]}),"\n",(0,t.jsxs)(n.li,{children:["Check user filed information scope: ",(0,t.jsx)(n.code,{children:"email address"})," (Optional)"]}),"\n",(0,t.jsx)(n.li,{children:"Create a version and publish"}),"\n"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"FEISHU_ENABLED=true\nFEISHU_APP_ID=\nFEISHU_APP_SECRET=\n"})}),"\n",(0,t.jsx)(n.h2,{id:"ldap",children:"LDAP"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:'LDAP_ENABLED=true\nLDAP_HOST=10.0.0.1\nLDAP_PORT=389\nLDAP_METHOD=plain\nLDAP_BIND_DN="cn=Manager,dc=example,dc=com"\nLDAP_PASSWORD=password\nLDAP_BASE="ou=People,dc=example,dc=com"\nLDAP_UID=uid\n'})}),"\n",(0,t.jsx)(n.h2,{id:"openid-connect",children:"OpenID Connect"}),"\n",(0,t.jsx)(n.p,{children:"Supports both auto-discovery mode and manual settings."}),"\n",(0,t.jsx)(n.h3,{id:"auto-discovery",children:"Auto-discovery"}),"\n",(0,t.jsxs)(n.p,{children:["Turning on auto-discovery mode will automatically fetch the ",(0,t.jsx)(n.code,{children:"[OIDC_ISSUER_URL]/.well-known/openid-configuration"})," configuration."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"OIDC_ENABLED=true\nOIDC_CLIENT_ID=\nOIDC_CLIENT_SECRET=\nOIDC_ISSUER_URL=https://oidc.example.com\nOIDC_DISCOVERY=true\n"})}),"\n",(0,t.jsx)(n.h3,{id:"manual",children:"Manual"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"OIDC_ENABLED=true\nOIDC_CLIENT_ID=\nOIDC_CLIENT_SECRET=\nOIDC_ISSUER_URL=https://oidc.example.com\nOIDC_AUTH_URI=/authorize\nOIDC_TOKEN_URI=/token\nOIDC_USERINFO_URI=/userinfo\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Above ",(0,t.jsx)(n.code,{children:"OIDC_AUTH_URI"}),", ",(0,t.jsx)(n.code,{children:"OIDC_TOKEN_URI"}),", ",(0,t.jsx)(n.code,{children:"OIDC_USERINFO_URI"})," will use the default path as above if not set."]})]})}function h(e={}){const{wrapper:n}={...(0,s.a)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(d,{...e})}):d(e)}},1151:(e,n,i)=>{i.d(n,{Z:()=>l,a:()=>r});var t=i(7294);const s={},o=t.createContext(s);function r(e){const n=t.useContext(o);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),t.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/048ae1f6.f3f9443f.js b/assets/js/149c7b1e.d18a3e3f.js similarity index 86% rename from assets/js/048ae1f6.f3f9443f.js rename to assets/js/149c7b1e.d18a3e3f.js index ebc7ec68f..3625a0469 100644 --- a/assets/js/048ae1f6.f3f9443f.js +++ b/assets/js/149c7b1e.d18a3e3f.js @@ -1 +1 @@ -"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[4499],{5910:(t,e,n)=>{n.r(e),n.d(e,{assets:()=>u,contentTitle:()=>d,default:()=>g,frontMatter:()=>o,metadata:()=>c,toc:()=>m});var a=n(5893),s=n(1151),i=n(9965),r=n(4996);const o={},d="Database Analytics",c={id:"user-guide/administrator/monitoring/database-analytics",title:"Database Analytics",description:"{n.d(e,{Z:()=>o,a:()=>r});var a=n(7294);const s={},i=a.createContext(s);function r(t){const e=a.useContext(i);return a.useMemo((function(){return"function"==typeof t?t(e):{...e,...t}}),[e,t])}function o(t){let e;return e=t.disableParentContext?"function"==typeof t.components?t.components(s):t.components||s:r(t.components),a.createElement(i.Provider,{value:e},t.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[5946],{3307:(t,e,n)=>{n.r(e),n.d(e,{assets:()=>u,contentTitle:()=>d,default:()=>g,frontMatter:()=>o,metadata:()=>c,toc:()=>m});var a=n(5893),s=n(1151),i=n(9965),r=n(4996);const o={},d="Database Analytics",c={id:"user-guide/administrator/monitoring/database-analytics",title:"Database Analytics",description:"{n.d(e,{Z:()=>o,a:()=>r});var a=n(7294);const s={},i=a.createContext(s);function r(t){const e=a.useContext(i);return a.useMemo((function(){return"function"==typeof t?t(e):{...e,...t}}),[e,t])}function o(t){let e;return e=t.disableParentContext?"function"==typeof t.components?t.components(s):t.components||s:r(t.components),a.createElement(i.Provider,{value:e},t.children)}}}]); \ No newline at end of file diff --git a/assets/js/15df074e.30ab319c.js b/assets/js/15df074e.30ab319c.js new file mode 100644 index 000000000..f4c3d61e9 --- /dev/null +++ b/assets/js/15df074e.30ab319c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[5497],{4820:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>a,default:()=>m,frontMatter:()=>d,metadata:()=>l,toc:()=>u});var o=n(5893),i=n(1151),r=n(9965),s=n(4996);const d={sidebar_label:"Teardown App"},a="Teardown App view itself metadata",l={id:"user-guide/toolkits/teardown",title:"Teardown App view itself metadata",description:"Android",source:"@site/versioned_docs/version-5.1.0/user-guide/toolkits/teardown.mdx",sourceDirName:"user-guide/toolkits",slug:"/user-guide/toolkits/teardown",permalink:"/docs/5.1.0/user-guide/toolkits/teardown",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.1.0/user-guide/toolkits/teardown.mdx",tags:[],version:"5.1.0",frontMatter:{sidebar_label:"Teardown App"},sidebar:"userGuide",previous:{title:"Toolkits",permalink:"/docs/5.1.0/category/toolkits"},next:{title:"Fetch UDID",permalink:"/docs/5.1.0/user-guide/toolkits/fetch-udid"}},c={},u=[{value:"Android",id:"android",level:2},{value:"iOS",id:"ios",level:2}];function p(e){const t={code:"code",h1:"h1",h2:"h2",p:"p",...(0,i.a)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.h1,{id:"teardown-app-view-itself-metadata",children:"Teardown App view itself metadata"}),"\n","\n","\n",(0,o.jsx)(t.h2,{id:"android",children:"Android"}),"\n",(0,o.jsxs)(t.p,{children:["Retrieve ",(0,o.jsx)(t.code,{children:"AndroidManifest.xml"})," metadata, v1 to v3 signatures informations."]}),"\n",(0,o.jsx)(r.Z,{alt:"",sources:{light:(0,s.Z)("/img/5.0.0/teardown-android-light.png"),dark:(0,s.Z)("/img/5.0.0/teardown-android-dark.png")}}),"\n",(0,o.jsx)(t.h2,{id:"ios",children:"iOS"}),"\n",(0,o.jsxs)(t.p,{children:["Retrieve ",(0,o.jsx)(t.code,{children:"Info.plist"})," metadata, Frameworks and signatures informations."]}),"\n",(0,o.jsx)(r.Z,{alt:"",sources:{light:(0,s.Z)("/img/5.0.0/teardown-ios-light.png"),dark:(0,s.Z)("/img/5.0.0/teardown-ios-dark.png")}})]})}function m(e={}){const{wrapper:t}={...(0,i.a)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(p,{...e})}):p(e)}},1151:(e,t,n)=>{n.d(t,{Z:()=>d,a:()=>s});var o=n(7294);const i={},r=o.createContext(i);function s(e){const t=o.useContext(r);return o.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function d(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:s(e.components),o.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/f867ef04.4d60d3d5.js b/assets/js/169670f9.294e7669.js similarity index 85% rename from assets/js/f867ef04.4d60d3d5.js rename to assets/js/169670f9.294e7669.js index ffdfaca6e..a140f67a4 100644 --- a/assets/js/f867ef04.4d60d3d5.js +++ b/assets/js/169670f9.294e7669.js @@ -1 +1 @@ -"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[6819],{1380:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>u,contentTitle:()=>i,default:()=>m,frontMatter:()=>d,metadata:()=>p,toc:()=>l});var n=s(5893),a=s(1151),r=s(9965),o=s(4996);const d={},i="Uploaded releases",p={id:"user-guide/apps/detail",title:"Uploaded releases",description:"{s.d(t,{Z:()=>d,a:()=>o});var n=s(7294);const a={},r=n.createContext(a);function o(e){const t=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function d(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:o(e.components),n.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[3325],{1098:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>u,contentTitle:()=>i,default:()=>m,frontMatter:()=>d,metadata:()=>p,toc:()=>l});var n=s(5893),a=s(1151),r=s(9965),o=s(4996);const d={},i="Uploaded releases",p={id:"user-guide/apps/detail",title:"Uploaded releases",description:"{s.d(t,{Z:()=>d,a:()=>o});var n=s(7294);const a={},r=n.createContext(a);function o(e){const t=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function d(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:o(e.components),n.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/17c15062.f3e00499.js b/assets/js/17c15062.f3e00499.js new file mode 100644 index 000000000..1e1aa114d --- /dev/null +++ b/assets/js/17c15062.f3e00499.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[8227],{9222:e=>{e.exports=JSON.parse('{"title":"SDKs","slug":"/category/sdks","permalink":"/docs/5.1.0/category/sdks","navigation":{"previous":{"title":"Developer Guide","permalink":"/docs/5.1.0/developer-guide/"},"next":{"title":"iOS","permalink":"/docs/5.1.0/developer-guide/sdk/ios"}}}')}}]); \ No newline at end of file diff --git a/assets/js/189cf3ab.6a8edf40.js b/assets/js/189cf3ab.6a8edf40.js deleted file mode 100644 index 7b3bb1193..000000000 --- a/assets/js/189cf3ab.6a8edf40.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[231],{1467:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>i,default:()=>h,frontMatter:()=>r,metadata:()=>l,toc:()=>d});var s=t(5893),o=t(1151);const r={sidebar_label:"On-premise (Docker)"},i="Deploy Zealot with Docker guide",l={id:"self-hosted/deployment/docker",title:"Deploy Zealot with Docker guide",description:"Strongly recommended to deploy Zealot using Docker,",source:"@site/versioned_docs/version-5.1.0/self-hosted/deployment/docker.md",sourceDirName:"self-hosted/deployment",slug:"/self-hosted/deployment/docker",permalink:"/docs/self-hosted/deployment/docker",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.1.0/self-hosted/deployment/docker.md",tags:[],version:"5.1.0",frontMatter:{sidebar_label:"On-premise (Docker)"},sidebar:"selfHosted",previous:{title:"Requirements",permalink:"/docs/self-hosted/deployment/requirements"},next:{title:"Step by step",permalink:"/docs/self-hosted/deployment/docker/step-by-step"}},c={},d=[{value:"Why support docker image only?",id:"why-support-docker-image-only",level:2},{value:"Software requirements",id:"software-requirements",level:2},{value:"Install on Docker",id:"install-on-docker",level:2},{value:"SSL",id:"ssl",level:2},{value:"Let's Encrypt",id:"lets-encrypt",level:3},{value:"Reverse proxy controls SSL",id:"reverse-proxy-controls-ssl",level:3},{value:"Self-signed untrust SSL",id:"self-signed-untrust-ssl",level:3}];function a(e){const n={a:"a",blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,o.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h1,{id:"deploy-zealot-with-docker-guide",children:"Deploy Zealot with Docker guide"}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsxs)(n.p,{children:["\ud83d\udd14"," Strongly recommended to deploy Zealot using ",(0,s.jsx)(n.a,{href:"https://www.docker.io/",children:"Docker"}),",\nunless you are familiar with the technology stack for this service.\nThe app protection policy settings for iOS/iPadOS devices, it needs a public network over SSL,\nfree to use ",(0,s.jsx)(n.a,{href:"https://letsencrypt.org/",children:"Let's Encrypt"}),"."]}),"\n",(0,s.jsxs)(n.p,{children:["If you use a self-signed certificate you must ",(0,s.jsx)(n.a,{href:"https://support.apple.com/en-us/HT204477",children:"install the self-signed certificate"}),"\non each iOS device before installing any app."]}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"why-support-docker-image-only",children:"Why support docker image only?"}),"\n",(0,s.jsx)(n.p,{children:"Deploying a Rails-based application is incredibly complex, and even though you must install many dependenices,\nand you still need to worry how to launch and make it as a daemon to run in the background."}),"\n",(0,s.jsx)(n.h2,{id:"software-requirements",children:"Software requirements"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Git 2.0+"}),"\n",(0,s.jsx)(n.li,{children:"Docker 20.10.0+"}),"\n",(0,s.jsx)(n.li,{children:"Docker Compose 1.28.0+"}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"install-on-docker",children:"Install on Docker"}),"\n",(0,s.jsxs)(n.p,{children:["In the principle of one-click installation, but reality is often harsh,\nZealot configuration is dependent on ",(0,s.jsx)(n.code,{children:"ENV"})," environment variables,\nyou need to configure it and then execute the one-click deployment generation script."]}),"\n",(0,s.jsxs)(n.p,{children:["First you need to clone the ",(0,s.jsx)(n.a,{href:"https://github.com/tryzealot/zealot-docker.git",children:"deployment script"}),",\nAfter entering the ",(0,s.jsx)(n.code,{children:"zealot-docker"})," directory, you need to open the ",(0,s.jsx)(n.code,{children:"example.env"})," file to\nconfigure the necessary parameters and then you can directly execute ",(0,s.jsx)(n.code,{children:"./deploy.sh"})," script."]}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsxs)(n.p,{children:["By default, the administrator account: ",(0,s.jsx)(n.code,{children:"admin@zealot.com"})," and password ",(0,s.jsx)(n.code,{children:"ze@l0t"})," (you can change it)\nand some demo applications will be generated."]}),"\n"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"$ git clone https://github.com/tryzealot/zealot-docker.git\n$ cd zealot-docker\n$ ./deploy\n"})}),"\n",(0,s.jsx)(n.p,{children:"The one-click deployment generation script has three built-in templates by default:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Using Let's Encrypt SSL"}),"\n",(0,s.jsx)(n.li,{children:"Using Self-signed SSL"}),"\n",(0,s.jsx)(n.li,{children:"Using non-SSL (needs gateway or reverse proxy to manage SSL\uff09"}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["For those interested in one-click installation deployment scripts,\nyou can check out the ",(0,s.jsx)(n.a,{href:"/docs/self-hosted/deployment/docker/step-by-step",children:"Deployment Documentation with Docker"}),"."]}),"\n",(0,s.jsx)(n.h2,{id:"ssl",children:"SSL"}),"\n",(0,s.jsx)(n.h3,{id:"lets-encrypt",children:"Let's Encrypt"}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Best Choice"})}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Step 1"}),": Execute the deployment script:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"$ ./deploy\n"})}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Step 2"}),": Check and configure the ",(0,s.jsx)(n.code,{children:".env"})," file, mainly whether ",(0,s.jsx)(n.code,{children:"ZEALOT_DOMAIN"})," and ",(0,s.jsx)(n.code,{children:"ZEALOT_CERT_EMAIL"})," are filled in correctly.\nOther parts can be adjusted according to the actual situation of the corresponding configuration"]}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Step 3"}),": Run the Zealot service:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"$ docker-compose up -d\n"})}),"\n",(0,s.jsx)(n.h3,{id:"reverse-proxy-controls-ssl",children:"Reverse proxy controls SSL"}),"\n",(0,s.jsxs)(n.p,{children:["Check ",(0,s.jsx)(n.a,{href:"/docs/self-hosted/reverse-proxies",children:"Reverse Proxies Guide"})," page."]}),"\n",(0,s.jsx)(n.h3,{id:"self-signed-untrust-ssl",children:"Self-signed untrust SSL"}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Not recommended"})}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["Please do not use this for non-essential cases, for iOS using self-signed certificates\n",(0,s.jsx)(n.strong,{children:"may require the device to also have an SSL certificate installed before accessing and installing the application"}),",\nand Chrome may also deny access due to the certificate."]}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsxs)(n.p,{children:["If the domain name is unregistered, you need to tie the host to access it,\nusually by modifying the system's ",(0,s.jsx)(n.code,{children:"/etc/hosts"})," file."]}),"\n"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",metastring:'title="/etc/hosts"',children:"$ sudo vim /etc/hosts\n\n# highlight-start\n127.0.0.1 zealot.test\n# highlight-end\n"})})]})}function h(e={}){const{wrapper:n}={...(0,o.a)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(a,{...e})}):a(e)}},1151:(e,n,t)=>{t.d(n,{Z:()=>l,a:()=>i});var s=t(7294);const o={},r=s.createContext(o);function i(e){const n=s.useContext(r);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:i(e.components),s.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/189cf3ab.d4acd3c3.js b/assets/js/189cf3ab.d4acd3c3.js new file mode 100644 index 000000000..ce935b3db --- /dev/null +++ b/assets/js/189cf3ab.d4acd3c3.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[231],{1467:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>i,default:()=>h,frontMatter:()=>r,metadata:()=>l,toc:()=>d});var s=t(5893),o=t(1151);const r={sidebar_label:"On-premise (Docker)"},i="Deploy Zealot with Docker guide",l={id:"self-hosted/deployment/docker",title:"Deploy Zealot with Docker guide",description:"Strongly recommended to deploy Zealot using Docker,",source:"@site/versioned_docs/version-5.1.0/self-hosted/deployment/docker.md",sourceDirName:"self-hosted/deployment",slug:"/self-hosted/deployment/docker",permalink:"/docs/5.1.0/self-hosted/deployment/docker",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.1.0/self-hosted/deployment/docker.md",tags:[],version:"5.1.0",frontMatter:{sidebar_label:"On-premise (Docker)"},sidebar:"selfHosted",previous:{title:"Requirements",permalink:"/docs/5.1.0/self-hosted/deployment/requirements"},next:{title:"Step by step",permalink:"/docs/5.1.0/self-hosted/deployment/docker/step-by-step"}},c={},d=[{value:"Why support docker image only?",id:"why-support-docker-image-only",level:2},{value:"Software requirements",id:"software-requirements",level:2},{value:"Install on Docker",id:"install-on-docker",level:2},{value:"SSL",id:"ssl",level:2},{value:"Let's Encrypt",id:"lets-encrypt",level:3},{value:"Reverse proxy controls SSL",id:"reverse-proxy-controls-ssl",level:3},{value:"Self-signed untrust SSL",id:"self-signed-untrust-ssl",level:3}];function a(e){const n={a:"a",blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,o.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h1,{id:"deploy-zealot-with-docker-guide",children:"Deploy Zealot with Docker guide"}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsxs)(n.p,{children:["\ud83d\udd14"," Strongly recommended to deploy Zealot using ",(0,s.jsx)(n.a,{href:"https://www.docker.io/",children:"Docker"}),",\nunless you are familiar with the technology stack for this service.\nThe app protection policy settings for iOS/iPadOS devices, it needs a public network over SSL,\nfree to use ",(0,s.jsx)(n.a,{href:"https://letsencrypt.org/",children:"Let's Encrypt"}),"."]}),"\n",(0,s.jsxs)(n.p,{children:["If you use a self-signed certificate you must ",(0,s.jsx)(n.a,{href:"https://support.apple.com/en-us/HT204477",children:"install the self-signed certificate"}),"\non each iOS device before installing any app."]}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"why-support-docker-image-only",children:"Why support docker image only?"}),"\n",(0,s.jsx)(n.p,{children:"Deploying a Rails-based application is incredibly complex, and even though you must install many dependenices,\nand you still need to worry how to launch and make it as a daemon to run in the background."}),"\n",(0,s.jsx)(n.h2,{id:"software-requirements",children:"Software requirements"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Git 2.0+"}),"\n",(0,s.jsx)(n.li,{children:"Docker 20.10.0+"}),"\n",(0,s.jsx)(n.li,{children:"Docker Compose 1.28.0+"}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"install-on-docker",children:"Install on Docker"}),"\n",(0,s.jsxs)(n.p,{children:["In the principle of one-click installation, but reality is often harsh,\nZealot configuration is dependent on ",(0,s.jsx)(n.code,{children:"ENV"})," environment variables,\nyou need to configure it and then execute the one-click deployment generation script."]}),"\n",(0,s.jsxs)(n.p,{children:["First you need to clone the ",(0,s.jsx)(n.a,{href:"https://github.com/tryzealot/zealot-docker.git",children:"deployment script"}),",\nAfter entering the ",(0,s.jsx)(n.code,{children:"zealot-docker"})," directory, you need to open the ",(0,s.jsx)(n.code,{children:"example.env"})," file to\nconfigure the necessary parameters and then you can directly execute ",(0,s.jsx)(n.code,{children:"./deploy.sh"})," script."]}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsxs)(n.p,{children:["By default, the administrator account: ",(0,s.jsx)(n.code,{children:"admin@zealot.com"})," and password ",(0,s.jsx)(n.code,{children:"ze@l0t"})," (you can change it)\nand some demo applications will be generated."]}),"\n"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"$ git clone https://github.com/tryzealot/zealot-docker.git\n$ cd zealot-docker\n$ ./deploy\n"})}),"\n",(0,s.jsx)(n.p,{children:"The one-click deployment generation script has three built-in templates by default:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Using Let's Encrypt SSL"}),"\n",(0,s.jsx)(n.li,{children:"Using Self-signed SSL"}),"\n",(0,s.jsx)(n.li,{children:"Using non-SSL (needs gateway or reverse proxy to manage SSL\uff09"}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["For those interested in one-click installation deployment scripts,\nyou can check out the ",(0,s.jsx)(n.a,{href:"/docs/self-hosted/deployment/docker/step-by-step",children:"Deployment Documentation with Docker"}),"."]}),"\n",(0,s.jsx)(n.h2,{id:"ssl",children:"SSL"}),"\n",(0,s.jsx)(n.h3,{id:"lets-encrypt",children:"Let's Encrypt"}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Best Choice"})}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Step 1"}),": Execute the deployment script:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"$ ./deploy\n"})}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Step 2"}),": Check and configure the ",(0,s.jsx)(n.code,{children:".env"})," file, mainly whether ",(0,s.jsx)(n.code,{children:"ZEALOT_DOMAIN"})," and ",(0,s.jsx)(n.code,{children:"ZEALOT_CERT_EMAIL"})," are filled in correctly.\nOther parts can be adjusted according to the actual situation of the corresponding configuration"]}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Step 3"}),": Run the Zealot service:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"$ docker-compose up -d\n"})}),"\n",(0,s.jsx)(n.h3,{id:"reverse-proxy-controls-ssl",children:"Reverse proxy controls SSL"}),"\n",(0,s.jsxs)(n.p,{children:["Check ",(0,s.jsx)(n.a,{href:"/docs/self-hosted/reverse-proxies",children:"Reverse Proxies Guide"})," page."]}),"\n",(0,s.jsx)(n.h3,{id:"self-signed-untrust-ssl",children:"Self-signed untrust SSL"}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Not recommended"})}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["Please do not use this for non-essential cases, for iOS using self-signed certificates\n",(0,s.jsx)(n.strong,{children:"may require the device to also have an SSL certificate installed before accessing and installing the application"}),",\nand Chrome may also deny access due to the certificate."]}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsxs)(n.p,{children:["If the domain name is unregistered, you need to tie the host to access it,\nusually by modifying the system's ",(0,s.jsx)(n.code,{children:"/etc/hosts"})," file."]}),"\n"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",metastring:'title="/etc/hosts"',children:"$ sudo vim /etc/hosts\n\n# highlight-start\n127.0.0.1 zealot.test\n# highlight-end\n"})})]})}function h(e={}){const{wrapper:n}={...(0,o.a)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(a,{...e})}):a(e)}},1151:(e,n,t)=>{t.d(n,{Z:()=>l,a:()=>i});var s=t(7294);const o={},r=s.createContext(o);function i(e){const n=s.useContext(r);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:i(e.components),s.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/1c967876.d6b7f53f.js b/assets/js/1c967876.d6b7f53f.js new file mode 100644 index 000000000..7c5af865c --- /dev/null +++ b/assets/js/1c967876.d6b7f53f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[8363],{1271:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>i,contentTitle:()=>c,default:()=>u,frontMatter:()=>r,metadata:()=>d,toc:()=>a});var o=n(5893),s=n(1151);const r={},c="Discord",d={id:"user-guide/webhooks/discord",title:"Discord",description:"Discord should use Slack-Compatible Webhook whose constructs",source:"@site/versioned_docs/version-5.2.0/user-guide/webhooks/discord.md",sourceDirName:"user-guide/webhooks",slug:"/user-guide/webhooks/discord",permalink:"/docs/user-guide/webhooks/discord",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.2.0/user-guide/webhooks/discord.md",tags:[],version:"5.2.0",frontMatter:{},sidebar:"userGuide",previous:{title:"Slack",permalink:"/docs/user-guide/webhooks/slack"},next:{title:"Lark (Feishu)",permalink:"/docs/user-guide/webhooks/feishu"}},i={},a=[{value:"Text format",id:"text-format",level:2},{value:"Block rich text format",id:"block-rich-text-format",level:2}];function l(e){const t={a:"a",code:"code",h1:"h1",h2:"h2",p:"p",pre:"pre",...(0,s.a)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.h1,{id:"discord",children:"Discord"}),"\n",(0,o.jsxs)(t.p,{children:[(0,o.jsx)(t.a,{href:"https://support.discord.com/hc/en-us/articles/228383668-Intro-to-Webhooks",children:"Discord"})," should use Slack-Compatible Webhook whose constructs\ntypically support both text and block rich text, and can be configured as follows:"]}),"\n",(0,o.jsx)(t.h2,{id:"text-format",children:"Text format"}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{className:"language-ruby",children:'{\n "text": "##{@title}\\nPlatform: #{@device_type}\\nUpload at: #{@uploaded_at}"\n}\n'})}),"\n",(0,o.jsx)(t.h2,{id:"block-rich-text-format",children:"Block rich text format"}),"\n",(0,o.jsx)(t.p,{children:"A simple block with markdown support"}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{className:"language-ruby",children:'{\n "blocks": [\n {\n "type": "section",\n "text": {\n "type": "mrkdwn",\n "text": "## #{@title}\\nPlatform: #{@device_type}\\nUpload at: #{@uploaded_at}\\nInstal QRcode:\\n![qrcode](#{@qrcode_url})"\n }\n }\n ]\n}\n'})}),"\n",(0,o.jsx)(t.p,{children:"Better look at some of the structures shown in the block"}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{className:"language-ruby",children:'{\n "blocks": [\n {\n "type": "section",\n "text": {\n "type": "mrkdwn",\n "text": @title,\n }\n },\n {\n "type": "section",\n "fields": [\n {\n "type": "mrkdwn",\n "text": "*Platform:*\\n#{@device_type}"\n },\n {\n "type": "mrkdwn",\n "text": "*Upload at:*\\n#{@uploaded_at}"\n }\n ]\n },\n "accessory": {\n "type": "image",\n "image_url": @qrcode_url,\n "alt_text": "install qrcode"\n }\n ]\n}\n'})})]})}function u(e={}){const{wrapper:t}={...(0,s.a)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(l,{...e})}):l(e)}},1151:(e,t,n)=>{n.d(t,{Z:()=>d,a:()=>c});var o=n(7294);const s={},r=o.createContext(s);function c(e){const t=o.useContext(r);return o.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function d(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:c(e.components),o.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/13fb7505.a03d1c1a.js b/assets/js/1cab920e.3ee94712.js similarity index 96% rename from assets/js/13fb7505.a03d1c1a.js rename to assets/js/1cab920e.3ee94712.js index dc4919ae3..80fbf6fb0 100644 --- a/assets/js/13fb7505.a03d1c1a.js +++ b/assets/js/1cab920e.3ee94712.js @@ -1 +1 @@ -"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[6780],{2888:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>a,contentTitle:()=>r,default:()=>h,frontMatter:()=>o,metadata:()=>l,toc:()=>c});var t=i(5893),s=i(1151);const o={},r="Third-party Authentication",l={id:"self-hosted/configuration/third-party-authentication",title:"Third-party Authentication",description:"Zealot supports authorized logins using supported third-party services, which can be currently configured via the following environment variables or in the settings page of the admin panel.",source:"@site/versioned_docs/version-5.1.0/self-hosted/configuration/third-party-authentication.md",sourceDirName:"self-hosted/configuration",slug:"/self-hosted/configuration/third-party-authentication",permalink:"/docs/self-hosted/configuration/third-party-authentication",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.1.0/self-hosted/configuration/third-party-authentication.md",tags:[],version:"5.1.0",frontMatter:{},sidebar:"selfHosted",previous:{title:"Environment Variables",permalink:"/docs/self-hosted/configuration/environment-variables"},next:{title:"Schedule Jobs",permalink:"/docs/self-hosted/configuration/schedule-jobs"}},a={},c=[{value:"Gitlab",id:"gitlab",level:2},{value:"Google",id:"google",level:2},{value:"Feishu (Lark)",id:"feishu-lark",level:2},{value:"LDAP",id:"ldap",level:2},{value:"OpenID Connect",id:"openid-connect",level:2},{value:"Auto-discovery",id:"auto-discovery",level:3},{value:"Manual",id:"manual",level:3}];function d(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",li:"li",ol:"ol",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,s.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h1,{id:"third-party-authentication",children:"Third-party Authentication"}),"\n",(0,t.jsx)(n.p,{children:"Zealot supports authorized logins using supported third-party services, which can be currently configured via the following environment variables or in the settings page of the admin panel."}),"\n",(0,t.jsxs)(n.table,{children:[(0,t.jsx)(n.thead,{children:(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.th,{children:"Service"}),(0,t.jsx)(n.th,{children:"provider"})]})}),(0,t.jsxs)(n.tbody,{children:[(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"Feishu"}),(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"feishu"})})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"Gitlab"}),(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"gitlab"})})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"Google"}),(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"google_oauth2"})})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"LDAP"}),(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"ldap"})})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"OpenID Connect"}),(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"openid_connect"})})]})]})]}),"\n",(0,t.jsx)(n.p,{children:"If the above services need to set the callback address please set it uniformly as follows"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"http://zealot.com/users/auth/:provider/callback\n"})}),"\n",(0,t.jsxs)(n.p,{children:["where ",(0,t.jsx)(n.code,{children:":provider"})," is the identifier of the above supported third-party service, for example:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"# if Google is enabled, then replace `:provider` with `google_oauth2`.\nhttp://zealot.com/users/auth/google_oauth2/callback\n"})}),"\n",(0,t.jsx)(n.h2,{id:"gitlab",children:"Gitlab"}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:["Register a Gitlab ",(0,t.jsx)(n.a,{href:"http://gitlab.com",children:"On line"})," account or use self-host service"]}),"\n",(0,t.jsx)(n.li,{children:"Create an application in Preferences -> Applications page."}),"\n",(0,t.jsxs)(n.li,{children:["Configure ",(0,t.jsx)(n.code,{children:"Redirect URI"})," such like ",(0,t.jsx)(n.code,{children:"http://zealot.com/users/auth/gitlab/callback"})," (replace the domain in your case)"]}),"\n",(0,t.jsxs)(n.li,{children:["Check scope: ",(0,t.jsx)(n.code,{children:"read_user"}),"\uff0cBy default zealot only uses this license, if your enable scope is ",(0,t.jsx)(n.code,{children:"api"})," that's fine too"]}),"\n"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"GITLAB_ENABLED=true\nGITLAB_SITE=https://gitlab.com/api/v4\nGITLAB_SCOPE=read_user\nGITLAB_APP_ID=\nGITLAB_SECRET=\n"})}),"\n",(0,t.jsx)(n.h2,{id:"google",children:"Google"}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsx)(n.li,{children:"Register a Google account"}),"\n",(0,t.jsxs)(n.li,{children:["Enable ",(0,t.jsx)(n.a,{href:"https://console.cloud.google.com/apis/dashboard",children:"Google Cloud Platform"})," service"]}),"\n",(0,t.jsx)(n.li,{children:"Choose or create a Project then go to Credentials page"}),"\n",(0,t.jsxs)(n.li,{children:["Create OAuth Client ID with Web Application, and configure Authorized redirect URI such like ",(0,t.jsx)(n.code,{children:"http://zealot.com/users/auth/google_oauth2/callback"})," (replace the domain in your case)"]}),"\n"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"GOOGLE_OAUTH_ENABLED=true\nGOOGLE_CLIENT_ID=\nGOOGLE_SECRET=\n"})}),"\n",(0,t.jsx)(n.h2,{id:"feishu-lark",children:"Feishu (Lark)"}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsx)(n.li,{children:"Register a feishu (lark) account and download the Phone app."}),"\n",(0,t.jsxs)(n.li,{children:["Enable ",(0,t.jsx)(n.a,{href:"https://open.feishu.cn/app/",children:"Open platform"})," and create application to get app_id, app_secret"]}),"\n",(0,t.jsxs)(n.li,{children:["Configure callback url such like ",(0,t.jsx)(n.code,{children:"http://zealot.com/users/auth/feishu/callback"})," (replace the domain in your case)"]}),"\n",(0,t.jsxs)(n.li,{children:["Check user filed information scope: ",(0,t.jsx)(n.code,{children:"email address"})," (Optional)"]}),"\n",(0,t.jsx)(n.li,{children:"Create a version and publish"}),"\n"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"FEISHU_ENABLED=true\nFEISHU_APP_ID=\nFEISHU_APP_SECRET=\n"})}),"\n",(0,t.jsx)(n.h2,{id:"ldap",children:"LDAP"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:'LDAP_ENABLED=true\nLDAP_HOST=10.0.0.1\nLDAP_PORT=389\nLDAP_METHOD=plain\nLDAP_BIND_DN="cn=Manager,dc=example,dc=com"\nLDAP_PASSWORD=password\nLDAP_BASE="ou=People,dc=example,dc=com"\nLDAP_UID=uid\n'})}),"\n",(0,t.jsx)(n.h2,{id:"openid-connect",children:"OpenID Connect"}),"\n",(0,t.jsx)(n.p,{children:"Supports both auto-discovery mode and manual settings."}),"\n",(0,t.jsx)(n.h3,{id:"auto-discovery",children:"Auto-discovery"}),"\n",(0,t.jsxs)(n.p,{children:["Turning on auto-discovery mode will automatically fetch the ",(0,t.jsx)(n.code,{children:"[OIDC_ISSUER_URL]/.well-known/openid-configuration"})," configuration."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"OIDC_ENABLED=true\nOIDC_CLIENT_ID=\nOIDC_CLIENT_SECRET=\nOIDC_ISSUER_URL=https://oidc.example.com\nOIDC_DISCOVERY=true\n"})}),"\n",(0,t.jsx)(n.h3,{id:"manual",children:"Manual"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"OIDC_ENABLED=true\nOIDC_CLIENT_ID=\nOIDC_CLIENT_SECRET=\nOIDC_ISSUER_URL=https://oidc.example.com\nOIDC_AUTH_URI=/authorize\nOIDC_TOKEN_URI=/token\nOIDC_USERINFO_URI=/userinfo\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Above ",(0,t.jsx)(n.code,{children:"OIDC_AUTH_URI"}),", ",(0,t.jsx)(n.code,{children:"OIDC_TOKEN_URI"}),", ",(0,t.jsx)(n.code,{children:"OIDC_USERINFO_URI"})," will use the default path as above if not set."]})]})}function h(e={}){const{wrapper:n}={...(0,s.a)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(d,{...e})}):d(e)}},1151:(e,n,i)=>{i.d(n,{Z:()=>l,a:()=>r});var t=i(7294);const s={},o=t.createContext(s);function r(e){const n=t.useContext(o);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),t.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[6594],{6502:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>a,contentTitle:()=>r,default:()=>h,frontMatter:()=>o,metadata:()=>l,toc:()=>c});var t=i(5893),s=i(1151);const o={},r="Third-party Authentication",l={id:"self-hosted/configuration/third-party-authentication",title:"Third-party Authentication",description:"Zealot supports authorized logins using supported third-party services, which can be currently configured via the following environment variables or in the settings page of the admin panel.",source:"@site/versioned_docs/version-5.2.0/self-hosted/configuration/third-party-authentication.md",sourceDirName:"self-hosted/configuration",slug:"/self-hosted/configuration/third-party-authentication",permalink:"/docs/self-hosted/configuration/third-party-authentication",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.2.0/self-hosted/configuration/third-party-authentication.md",tags:[],version:"5.2.0",frontMatter:{},sidebar:"selfHosted",previous:{title:"Environment Variables",permalink:"/docs/self-hosted/configuration/environment-variables"},next:{title:"Schedule Jobs",permalink:"/docs/self-hosted/configuration/schedule-jobs"}},a={},c=[{value:"Gitlab",id:"gitlab",level:2},{value:"Google",id:"google",level:2},{value:"Feishu (Lark)",id:"feishu-lark",level:2},{value:"LDAP",id:"ldap",level:2},{value:"OpenID Connect",id:"openid-connect",level:2},{value:"Auto-discovery",id:"auto-discovery",level:3},{value:"Manual",id:"manual",level:3}];function d(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",li:"li",ol:"ol",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,s.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h1,{id:"third-party-authentication",children:"Third-party Authentication"}),"\n",(0,t.jsx)(n.p,{children:"Zealot supports authorized logins using supported third-party services, which can be currently configured via the following environment variables or in the settings page of the admin panel."}),"\n",(0,t.jsxs)(n.table,{children:[(0,t.jsx)(n.thead,{children:(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.th,{children:"Service"}),(0,t.jsx)(n.th,{children:"provider"})]})}),(0,t.jsxs)(n.tbody,{children:[(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"Feishu"}),(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"feishu"})})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"Gitlab"}),(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"gitlab"})})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"Google"}),(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"google_oauth2"})})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"LDAP"}),(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"ldap"})})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"OpenID Connect"}),(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"openid_connect"})})]})]})]}),"\n",(0,t.jsx)(n.p,{children:"If the above services need to set the callback address please set it uniformly as follows"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"http://zealot.com/users/auth/:provider/callback\n"})}),"\n",(0,t.jsxs)(n.p,{children:["where ",(0,t.jsx)(n.code,{children:":provider"})," is the identifier of the above supported third-party service, for example:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"# if Google is enabled, then replace `:provider` with `google_oauth2`.\nhttp://zealot.com/users/auth/google_oauth2/callback\n"})}),"\n",(0,t.jsx)(n.h2,{id:"gitlab",children:"Gitlab"}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:["Register a Gitlab ",(0,t.jsx)(n.a,{href:"http://gitlab.com",children:"On line"})," account or use self-host service"]}),"\n",(0,t.jsx)(n.li,{children:"Create an application in Preferences -> Applications page."}),"\n",(0,t.jsxs)(n.li,{children:["Configure ",(0,t.jsx)(n.code,{children:"Redirect URI"})," such like ",(0,t.jsx)(n.code,{children:"http://zealot.com/users/auth/gitlab/callback"})," (replace the domain in your case)"]}),"\n",(0,t.jsxs)(n.li,{children:["Check scope: ",(0,t.jsx)(n.code,{children:"read_user"}),"\uff0cBy default zealot only uses this license, if your enable scope is ",(0,t.jsx)(n.code,{children:"api"})," that's fine too"]}),"\n"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"GITLAB_ENABLED=true\nGITLAB_SITE=https://gitlab.com/api/v4\nGITLAB_SCOPE=read_user\nGITLAB_APP_ID=\nGITLAB_SECRET=\n"})}),"\n",(0,t.jsx)(n.h2,{id:"google",children:"Google"}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsx)(n.li,{children:"Register a Google account"}),"\n",(0,t.jsxs)(n.li,{children:["Enable ",(0,t.jsx)(n.a,{href:"https://console.cloud.google.com/apis/dashboard",children:"Google Cloud Platform"})," service"]}),"\n",(0,t.jsx)(n.li,{children:"Choose or create a Project then go to Credentials page"}),"\n",(0,t.jsxs)(n.li,{children:["Create OAuth Client ID with Web Application, and configure Authorized redirect URI such like ",(0,t.jsx)(n.code,{children:"http://zealot.com/users/auth/google_oauth2/callback"})," (replace the domain in your case)"]}),"\n"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"GOOGLE_OAUTH_ENABLED=true\nGOOGLE_CLIENT_ID=\nGOOGLE_SECRET=\n"})}),"\n",(0,t.jsx)(n.h2,{id:"feishu-lark",children:"Feishu (Lark)"}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsx)(n.li,{children:"Register a feishu (lark) account and download the Phone app."}),"\n",(0,t.jsxs)(n.li,{children:["Enable ",(0,t.jsx)(n.a,{href:"https://open.feishu.cn/app/",children:"Open platform"})," and create application to get app_id, app_secret"]}),"\n",(0,t.jsxs)(n.li,{children:["Configure callback url such like ",(0,t.jsx)(n.code,{children:"http://zealot.com/users/auth/feishu/callback"})," (replace the domain in your case)"]}),"\n",(0,t.jsxs)(n.li,{children:["Check user filed information scope: ",(0,t.jsx)(n.code,{children:"email address"})," (Optional)"]}),"\n",(0,t.jsx)(n.li,{children:"Create a version and publish"}),"\n"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"FEISHU_ENABLED=true\nFEISHU_APP_ID=\nFEISHU_APP_SECRET=\n"})}),"\n",(0,t.jsx)(n.h2,{id:"ldap",children:"LDAP"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:'LDAP_ENABLED=true\nLDAP_HOST=10.0.0.1\nLDAP_PORT=389\nLDAP_METHOD=plain\nLDAP_BIND_DN="cn=Manager,dc=example,dc=com"\nLDAP_PASSWORD=password\nLDAP_BASE="ou=People,dc=example,dc=com"\nLDAP_UID=uid\n'})}),"\n",(0,t.jsx)(n.h2,{id:"openid-connect",children:"OpenID Connect"}),"\n",(0,t.jsx)(n.p,{children:"Supports both auto-discovery mode and manual settings."}),"\n",(0,t.jsx)(n.h3,{id:"auto-discovery",children:"Auto-discovery"}),"\n",(0,t.jsxs)(n.p,{children:["Turning on auto-discovery mode will automatically fetch the ",(0,t.jsx)(n.code,{children:"[OIDC_ISSUER_URL]/.well-known/openid-configuration"})," configuration."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"OIDC_ENABLED=true\nOIDC_CLIENT_ID=\nOIDC_CLIENT_SECRET=\nOIDC_ISSUER_URL=https://oidc.example.com\nOIDC_DISCOVERY=true\n"})}),"\n",(0,t.jsx)(n.h3,{id:"manual",children:"Manual"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"OIDC_ENABLED=true\nOIDC_CLIENT_ID=\nOIDC_CLIENT_SECRET=\nOIDC_ISSUER_URL=https://oidc.example.com\nOIDC_AUTH_URI=/authorize\nOIDC_TOKEN_URI=/token\nOIDC_USERINFO_URI=/userinfo\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Above ",(0,t.jsx)(n.code,{children:"OIDC_AUTH_URI"}),", ",(0,t.jsx)(n.code,{children:"OIDC_TOKEN_URI"}),", ",(0,t.jsx)(n.code,{children:"OIDC_USERINFO_URI"})," will use the default path as above if not set."]})]})}function h(e={}){const{wrapper:n}={...(0,s.a)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(d,{...e})}):d(e)}},1151:(e,n,i)=>{i.d(n,{Z:()=>l,a:()=>r});var t=i(7294);const s={},o=t.createContext(s);function r(e){const n=t.useContext(o);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),t.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/7e0b4e5f.93c1a112.js b/assets/js/22ecf5bf.5b3f3adf.js similarity index 98% rename from assets/js/7e0b4e5f.93c1a112.js rename to assets/js/22ecf5bf.5b3f3adf.js index fde7ce45a..86099d8b8 100644 --- a/assets/js/7e0b4e5f.93c1a112.js +++ b/assets/js/22ecf5bf.5b3f3adf.js @@ -1 +1 @@ -"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[5791],{3028:(e,d,i)=>{i.r(d),i.d(d,{assets:()=>c,contentTitle:()=>s,default:()=>o,frontMatter:()=>l,metadata:()=>t,toc:()=>a});var n=i(5893),r=i(1151);const l={sidebar_label:"Debug Files"},s="Debug File APIs",t={id:"developer-guide/api/debug_files",title:"Debug File APIs",description:"Upload debug file",source:"@site/versioned_docs/version-5.1.0/developer-guide/api/debug_files.md",sourceDirName:"developer-guide/api",slug:"/developer-guide/api/debug_files",permalink:"/docs/developer-guide/api/debug_files",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.1.0/developer-guide/api/debug_files.md",tags:[],version:"5.1.0",frontMatter:{sidebar_label:"Debug Files"},sidebar:"developerGuide",previous:{title:"Apps",permalink:"/docs/developer-guide/api/apps"}},c={},a=[{value:"Upload debug file",id:"upload-debug-file",level:2},{value:"Parameters",id:"parameters",level:3},{value:"Return body",id:"return-body",level:3},{value:"Download debug file",id:"download-debug-file",level:2},{value:"Parameters",id:"parameters-1",level:3},{value:"Return body",id:"return-body-1",level:3},{value:"List debug files",id:"list-debug-files",level:2},{value:"Parameters",id:"parameters-2",level:3},{value:"Return body",id:"return-body-2",level:3},{value:"Get a debug file",id:"get-a-debug-file",level:2},{value:"Parameters",id:"parameters-3",level:3},{value:"Return body",id:"return-body-3",level:3},{value:"Update a existed debug file",id:"update-a-existed-debug-file",level:2},{value:"Parameters",id:"parameters-4",level:3},{value:"Return body",id:"return-body-4",level:3},{value:"Delete a debug file",id:"delete-a-debug-file",level:2},{value:"Parameters",id:"parameters-5",level:3},{value:"Return body",id:"return-body-5",level:3}];function h(e){const d={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,r.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(d.h1,{id:"debug-file-apis",children:"Debug File APIs"}),"\n",(0,n.jsx)(d.h2,{id:"upload-debug-file",children:"Upload debug file"}),"\n",(0,n.jsx)(d.p,{children:"This allows you to upload an single iOS, Android debug file."}),"\n",(0,n.jsx)(d.p,{children:"Debug file accepts:"}),"\n",(0,n.jsxs)(d.ul,{children:["\n",(0,n.jsx)(d.li,{children:"iOS: a Zipped dSYM file"}),"\n",(0,n.jsx)(d.li,{children:"Android: a Zipped file includes mapping.txt, R.txt or AndroidManifest.xml files."}),"\n"]}),"\n",(0,n.jsx)(d.pre,{children:(0,n.jsx)(d.code,{children:"POST /api/debug_files/upload\n"})}),"\n",(0,n.jsx)(d.h3,{id:"parameters",children:"Parameters"}),"\n",(0,n.jsx)(d.admonition,{type:"info",children:(0,n.jsxs)(d.p,{children:[(0,n.jsx)(d.a,{href:"/docs/developer-guide/api#authentication",children:"Authentication"})," required."]})}),"\n",(0,n.jsxs)(d.table,{children:[(0,n.jsx)(d.thead,{children:(0,n.jsxs)(d.tr,{children:[(0,n.jsx)(d.th,{children:"Attribute"}),(0,n.jsx)(d.th,{children:"Type"}),(0,n.jsx)(d.th,{children:"Required"}),(0,n.jsx)(d.th,{children:"Description"})]})}),(0,n.jsxs)(d.tbody,{children:[(0,n.jsxs)(d.tr,{children:[(0,n.jsx)(d.td,{children:"channel_key"}),(0,n.jsx)(d.td,{children:(0,n.jsx)(d.code,{children:"String"})}),(0,n.jsx)(d.td,{children:"true"}),(0,n.jsx)(d.td,{children:"Channel key"})]}),(0,n.jsxs)(d.tr,{children:[(0,n.jsx)(d.td,{children:"file"}),(0,n.jsx)(d.td,{children:(0,n.jsx)(d.code,{children:"File"})}),(0,n.jsx)(d.td,{children:"true"}),(0,n.jsx)(d.td,{children:"Arichved file by zip"})]}),(0,n.jsxs)(d.tr,{children:[(0,n.jsx)(d.td,{children:"release_version"}),(0,n.jsx)(d.td,{children:(0,n.jsx)(d.code,{children:"String"})}),(0,n.jsx)(d.td,{children:"true"}),(0,n.jsx)(d.td,{children:"Release version, ignore this param if iOS app"})]}),(0,n.jsxs)(d.tr,{children:[(0,n.jsx)(d.td,{children:"build_version"}),(0,n.jsx)(d.td,{children:(0,n.jsx)(d.code,{children:"String"})}),(0,n.jsx)(d.td,{children:"true"}),(0,n.jsx)(d.td,{children:"Build version, ignore this param if iOS app"})]})]})]}),"\n",(0,n.jsx)(d.h3,{id:"return-body",children:"Return body"}),"\n",(0,n.jsx)(d.pre,{children:(0,n.jsx)(d.code,{className:"language-json",children:'{\n "id": 1,\n "app_name": "Demo App",\n "device_type": "ios",\n "release_version": "1.14.0",\n "build_version": "980",\n "file_url": "https://tryzealot.ews.im/download/debug_files/1",\n "metadata": [\n {\n "id": 1,\n "debug_file_id": 1,\n "uuid": "34656552-21ae-3722-a7fb-3582bc9b1d98",\n "type": "arm64",\n "object": "AppName",\n "data": {},\n "size": 4137941,\n "created_at": "2022-11-25T15:53:15.157+08:00",\n "updated_at": "2022-11-25T15:53:15.157+08:00"\n }\n ]\n}\n'})}),"\n",(0,n.jsx)(d.h2,{id:"download-debug-file",children:"Download debug file"}),"\n",(0,n.jsx)(d.p,{children:"This allows you to download an single iOS, Android debug file."}),"\n",(0,n.jsx)(d.pre,{children:(0,n.jsx)(d.code,{children:"GET /api/debug_files/download\n"})}),"\n",(0,n.jsx)(d.h3,{id:"parameters-1",children:"Parameters"}),"\n",(0,n.jsxs)(d.table,{children:[(0,n.jsx)(d.thead,{children:(0,n.jsxs)(d.tr,{children:[(0,n.jsx)(d.th,{children:"Attribute"}),(0,n.jsx)(d.th,{children:"Type"}),(0,n.jsx)(d.th,{children:"Required"}),(0,n.jsx)(d.th,{children:"Description"})]})}),(0,n.jsxs)(d.tbody,{children:[(0,n.jsxs)(d.tr,{children:[(0,n.jsx)(d.td,{children:"channel_key"}),(0,n.jsx)(d.td,{children:(0,n.jsx)(d.code,{children:"String"})}),(0,n.jsx)(d.td,{children:"true"}),(0,n.jsx)(d.td,{children:"Channel key"})]}),(0,n.jsxs)(d.tr,{children:[(0,n.jsx)(d.td,{children:"release_version"}),(0,n.jsx)(d.td,{children:(0,n.jsx)(d.code,{children:"String"})}),(0,n.jsx)(d.td,{children:"true"}),(0,n.jsx)(d.td,{children:"Release version, ignore this param if iOS app"})]}),(0,n.jsxs)(d.tr,{children:[(0,n.jsx)(d.td,{children:"build_version"}),(0,n.jsx)(d.td,{children:(0,n.jsx)(d.code,{children:"String"})}),(0,n.jsx)(d.td,{children:"false"}),(0,n.jsx)(d.td,{children:"Build version, ignore this param if iOS app"})]}),(0,n.jsxs)(d.tr,{children:[(0,n.jsx)(d.td,{children:"order"}),(0,n.jsx)(d.td,{children:(0,n.jsx)(d.code,{children:"String"})}),(0,n.jsx)(d.td,{children:"false"}),(0,n.jsxs)(d.td,{children:["Order by ",(0,n.jsx)("br",{}),(0,n.jsx)(d.code,{children:"version"})," = latest version, ",(0,n.jsx)(d.code,{children:"upload_date"})," = last uploaded date",(0,n.jsx)("br",{}),(0,n.jsxs)(d.strong,{children:["Vaild in release_version is ",(0,n.jsx)(d.code,{children:"latest"})]})]})]})]})]}),"\n",(0,n.jsx)(d.h3,{id:"return-body-1",children:"Return body"}),"\n",(0,n.jsxs)(d.ul,{children:["\n",(0,n.jsx)(d.li,{children:"Retun 200 status code if the version exists and redirect to the download address with a 302 status code."}),"\n",(0,n.jsx)(d.li,{children:"return 404 status code if the version does not exist."}),"\n"]}),"\n",(0,n.jsx)(d.h2,{id:"list-debug-files",children:"List debug files"}),"\n",(0,n.jsx)(d.p,{children:"Get a list of debug files."}),"\n",(0,n.jsx)(d.p,{children:"This function takes pagination parameters page and per_page to restrict the list of debug files."}),"\n",(0,n.jsx)(d.pre,{children:(0,n.jsx)(d.code,{children:"GET /api/debug_files\n"})}),"\n",(0,n.jsx)(d.h3,{id:"parameters-2",children:"Parameters"}),"\n",(0,n.jsxs)(d.table,{children:[(0,n.jsx)(d.thead,{children:(0,n.jsxs)(d.tr,{children:[(0,n.jsx)(d.th,{children:"Attribute"}),(0,n.jsx)(d.th,{children:"Type"}),(0,n.jsx)(d.th,{children:"Required"}),(0,n.jsx)(d.th,{children:"Description"})]})}),(0,n.jsxs)(d.tbody,{children:[(0,n.jsxs)(d.tr,{children:[(0,n.jsx)(d.td,{children:"channel_key"}),(0,n.jsx)(d.td,{children:(0,n.jsx)(d.code,{children:"String"})}),(0,n.jsx)(d.td,{children:"true"}),(0,n.jsx)(d.td,{children:"Channel key"})]}),(0,n.jsxs)(d.tr,{children:[(0,n.jsx)(d.td,{children:"page"}),(0,n.jsx)(d.td,{children:(0,n.jsx)(d.code,{children:"Integer"})}),(0,n.jsx)(d.td,{children:"false"}),(0,n.jsxs)(d.td,{children:["Page number (default: ",(0,n.jsx)(d.code,{children:"1"}),")"]})]}),(0,n.jsxs)(d.tr,{children:[(0,n.jsx)(d.td,{children:"per_page"}),(0,n.jsx)(d.td,{children:(0,n.jsx)(d.code,{children:"Integer"})}),(0,n.jsx)(d.td,{children:"false"}),(0,n.jsxs)(d.td,{children:["Number of items to list per page (default: ",(0,n.jsx)(d.code,{children:"25"}),", max: ",(0,n.jsx)(d.code,{children:"100"}),")."]})]})]})]}),"\n",(0,n.jsx)(d.h3,{id:"return-body-2",children:"Return body"}),"\n",(0,n.jsx)(d.pre,{children:(0,n.jsx)(d.code,{className:"language-json",children:'[\n {\n "id": 1,\n "app_name": "Demo App",\n "device_type": "ios",\n "release_version": "1.14.0",\n "build_version": "980",\n "file_url": "https://tryzealot.ews.im/download/debug_files/1",\n "metadata": [\n {\n "id": 1,\n "debug_file_id": 1,\n "uuid": "34656552-21ae-3722-a7fb-3582bc9b1d98",\n "type": "arm64",\n "object": "AppName",\n "data": {},\n "size": 4137941,\n "created_at": "2022-11-25T15:53:15.157+08:00",\n "updated_at": "2022-11-25T15:53:15.157+08:00"\n }\n ]\n }\n]\n'})}),"\n",(0,n.jsx)(d.h2,{id:"get-a-debug-file",children:"Get a debug file"}),"\n",(0,n.jsx)(d.p,{children:"Allows you to receive information about debug file like name, file size, UUID (iOS only), platform (iOS only) or file list (Android only)."}),"\n",(0,n.jsx)(d.pre,{children:(0,n.jsx)(d.code,{children:"GET /api/debug_files/:id\n"})}),"\n",(0,n.jsx)(d.h3,{id:"parameters-3",children:"Parameters"}),"\n",(0,n.jsx)(d.admonition,{type:"info",children:(0,n.jsxs)(d.p,{children:[(0,n.jsx)(d.a,{href:"/docs/developer-guide/api#authentication",children:"Authentication"})," required."]})}),"\n",(0,n.jsxs)(d.table,{children:[(0,n.jsx)(d.thead,{children:(0,n.jsxs)(d.tr,{children:[(0,n.jsx)(d.th,{children:"Attribute"}),(0,n.jsx)(d.th,{children:"Type"}),(0,n.jsx)(d.th,{children:"Required"}),(0,n.jsx)(d.th,{children:"Description"})]})}),(0,n.jsxs)(d.tbody,{children:[(0,n.jsxs)(d.tr,{children:[(0,n.jsx)(d.td,{children:"channel_key"}),(0,n.jsx)(d.td,{children:(0,n.jsx)(d.code,{children:"String"})}),(0,n.jsx)(d.td,{children:"true"}),(0,n.jsx)(d.td,{children:"Channel key"})]}),(0,n.jsxs)(d.tr,{children:[(0,n.jsx)(d.td,{children:"id"}),(0,n.jsx)(d.td,{children:(0,n.jsx)(d.code,{children:"String"})}),(0,n.jsx)(d.td,{children:"true"}),(0,n.jsx)(d.td,{children:"ID"})]})]})]}),"\n",(0,n.jsx)(d.h3,{id:"return-body-3",children:"Return body"}),"\n",(0,n.jsx)(d.pre,{children:(0,n.jsx)(d.code,{className:"language-json",children:'{\n "id": 1,\n "app_name": "Demo App",\n "device_type": "ios",\n "release_version": "1.14.0",\n "build_version": "980",\n "file_url": "https://tryzealot.ews.im/download/debug_files/1",\n "metadata": [\n {\n "id": 1,\n "debug_file_id": 1,\n "uuid": "34656552-21ae-3722-a7fb-3582bc9b1d98",\n "type": "arm64",\n "object": "AppName",\n "data": {},\n "size": 4137941,\n "created_at": "2022-11-25T15:53:15.157+08:00",\n "updated_at": "2022-11-25T15:53:15.157+08:00"\n }\n ]\n}\n'})}),"\n",(0,n.jsx)(d.h2,{id:"update-a-existed-debug-file",children:"Update a existed debug file"}),"\n",(0,n.jsx)(d.p,{children:"This allows you to update a debug file."}),"\n",(0,n.jsx)(d.pre,{children:(0,n.jsx)(d.code,{children:"PUT /api/debug_files/:id\n"})}),"\n",(0,n.jsx)(d.h3,{id:"parameters-4",children:"Parameters"}),"\n",(0,n.jsx)(d.admonition,{type:"info",children:(0,n.jsxs)(d.p,{children:[(0,n.jsx)(d.a,{href:"/docs/developer-guide/api#authentication",children:"Authentication"})," required."]})}),"\n",(0,n.jsxs)(d.table,{children:[(0,n.jsx)(d.thead,{children:(0,n.jsxs)(d.tr,{children:[(0,n.jsx)(d.th,{children:"Attribute"}),(0,n.jsx)(d.th,{children:"Type"}),(0,n.jsx)(d.th,{children:"Required"}),(0,n.jsx)(d.th,{children:"Description"})]})}),(0,n.jsxs)(d.tbody,{children:[(0,n.jsxs)(d.tr,{children:[(0,n.jsx)(d.td,{children:"channel_key"}),(0,n.jsx)(d.td,{children:(0,n.jsx)(d.code,{children:"String"})}),(0,n.jsx)(d.td,{children:"true"}),(0,n.jsx)(d.td,{children:"Channel key"})]}),(0,n.jsxs)(d.tr,{children:[(0,n.jsx)(d.td,{children:"id"}),(0,n.jsx)(d.td,{children:(0,n.jsx)(d.code,{children:"String"})}),(0,n.jsx)(d.td,{children:"true"}),(0,n.jsx)(d.td,{children:"ID"})]}),(0,n.jsxs)(d.tr,{children:[(0,n.jsx)(d.td,{children:"file"}),(0,n.jsx)(d.td,{children:(0,n.jsx)(d.code,{children:"File"})}),(0,n.jsx)(d.td,{children:"true"}),(0,n.jsx)(d.td,{children:"a Zipped debug file"})]}),(0,n.jsxs)(d.tr,{children:[(0,n.jsx)(d.td,{children:"release_version"}),(0,n.jsx)(d.td,{children:(0,n.jsx)(d.code,{children:"String"})}),(0,n.jsx)(d.td,{children:"true"}),(0,n.jsx)(d.td,{children:"Release version, ignore this param if iOS app"})]}),(0,n.jsxs)(d.tr,{children:[(0,n.jsx)(d.td,{children:"build_version"}),(0,n.jsx)(d.td,{children:(0,n.jsx)(d.code,{children:"String"})}),(0,n.jsx)(d.td,{children:"true"}),(0,n.jsx)(d.td,{children:"Build version, ignore this param if iOS app"})]})]})]}),"\n",(0,n.jsx)(d.h3,{id:"return-body-4",children:"Return body"}),"\n",(0,n.jsx)(d.pre,{children:(0,n.jsx)(d.code,{className:"language-json",children:'{\n "id": 1,\n "app_name": "Demo App",\n "device_type": "ios",\n "release_version": "1.14.0",\n "build_version": "980",\n "file_url": "https://tryzealot.ews.im/download/debug_files/1",\n "metadata": [\n {\n "id": 1,\n "debug_file_id": 1,\n "uuid": "34656552-21ae-3722-a7fb-3582bc9b1d98",\n "type": "arm64",\n "object": "AppName",\n "data": {},\n "size": 4137941,\n "created_at": "2022-11-25T15:53:15.157+08:00",\n "updated_at": "2022-11-25T15:53:15.157+08:00"\n }\n ]\n}\n'})}),"\n",(0,n.jsx)(d.h2,{id:"delete-a-debug-file",children:"Delete a debug file"}),"\n",(0,n.jsx)(d.p,{children:"This allows you to delete a debug file."}),"\n",(0,n.jsx)(d.pre,{children:(0,n.jsx)(d.code,{children:"DELETE /api/debug_files/:id\n"})}),"\n",(0,n.jsx)(d.h3,{id:"parameters-5",children:"Parameters"}),"\n",(0,n.jsx)(d.admonition,{type:"info",children:(0,n.jsxs)(d.p,{children:[(0,n.jsx)(d.a,{href:"/docs/developer-guide/api#authentication",children:"Authentication"})," required."]})}),"\n",(0,n.jsxs)(d.table,{children:[(0,n.jsx)(d.thead,{children:(0,n.jsxs)(d.tr,{children:[(0,n.jsx)(d.th,{children:"Attribute"}),(0,n.jsx)(d.th,{children:"Type"}),(0,n.jsx)(d.th,{children:"Required"}),(0,n.jsx)(d.th,{children:"Description"})]})}),(0,n.jsxs)(d.tbody,{children:[(0,n.jsxs)(d.tr,{children:[(0,n.jsx)(d.td,{children:"channel_key"}),(0,n.jsx)(d.td,{children:(0,n.jsx)(d.code,{children:"String"})}),(0,n.jsx)(d.td,{children:"true"}),(0,n.jsx)(d.td,{children:"Channel key"})]}),(0,n.jsxs)(d.tr,{children:[(0,n.jsx)(d.td,{children:"id"}),(0,n.jsx)(d.td,{children:(0,n.jsx)(d.code,{children:"String"})}),(0,n.jsx)(d.td,{children:"true"}),(0,n.jsx)(d.td,{children:"ID"})]})]})]}),"\n",(0,n.jsx)(d.h3,{id:"return-body-5",children:"Return body"}),"\n",(0,n.jsx)(d.pre,{children:(0,n.jsx)(d.code,{className:"language-json",children:'{\n "mesage": "OK"\n}\n'})})]})}function o(e={}){const{wrapper:d}={...(0,r.a)(),...e.components};return d?(0,n.jsx)(d,{...e,children:(0,n.jsx)(h,{...e})}):h(e)}},1151:(e,d,i)=>{i.d(d,{Z:()=>t,a:()=>s});var n=i(7294);const r={},l=n.createContext(r);function s(e){const d=n.useContext(l);return n.useMemo((function(){return"function"==typeof e?e(d):{...d,...e}}),[d,e])}function t(e){let d;return d=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:s(e.components),n.createElement(l.Provider,{value:d},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[6723],{4535:(e,d,i)=>{i.r(d),i.d(d,{assets:()=>c,contentTitle:()=>s,default:()=>o,frontMatter:()=>l,metadata:()=>t,toc:()=>a});var n=i(5893),r=i(1151);const l={sidebar_label:"Debug Files"},s="Debug File APIs",t={id:"developer-guide/api/debug_files",title:"Debug File APIs",description:"Upload debug file",source:"@site/versioned_docs/version-5.2.0/developer-guide/api/debug_files.md",sourceDirName:"developer-guide/api",slug:"/developer-guide/api/debug_files",permalink:"/docs/developer-guide/api/debug_files",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.2.0/developer-guide/api/debug_files.md",tags:[],version:"5.2.0",frontMatter:{sidebar_label:"Debug Files"},sidebar:"developerGuide",previous:{title:"Apps",permalink:"/docs/developer-guide/api/apps"}},c={},a=[{value:"Upload debug file",id:"upload-debug-file",level:2},{value:"Parameters",id:"parameters",level:3},{value:"Return body",id:"return-body",level:3},{value:"Download debug file",id:"download-debug-file",level:2},{value:"Parameters",id:"parameters-1",level:3},{value:"Return body",id:"return-body-1",level:3},{value:"List debug files",id:"list-debug-files",level:2},{value:"Parameters",id:"parameters-2",level:3},{value:"Return body",id:"return-body-2",level:3},{value:"Get a debug file",id:"get-a-debug-file",level:2},{value:"Parameters",id:"parameters-3",level:3},{value:"Return body",id:"return-body-3",level:3},{value:"Update a existed debug file",id:"update-a-existed-debug-file",level:2},{value:"Parameters",id:"parameters-4",level:3},{value:"Return body",id:"return-body-4",level:3},{value:"Delete a debug file",id:"delete-a-debug-file",level:2},{value:"Parameters",id:"parameters-5",level:3},{value:"Return body",id:"return-body-5",level:3}];function h(e){const d={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,r.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(d.h1,{id:"debug-file-apis",children:"Debug File APIs"}),"\n",(0,n.jsx)(d.h2,{id:"upload-debug-file",children:"Upload debug file"}),"\n",(0,n.jsx)(d.p,{children:"This allows you to upload an single iOS, Android debug file."}),"\n",(0,n.jsx)(d.p,{children:"Debug file accepts:"}),"\n",(0,n.jsxs)(d.ul,{children:["\n",(0,n.jsx)(d.li,{children:"iOS: a Zipped dSYM file"}),"\n",(0,n.jsx)(d.li,{children:"Android: a Zipped file includes mapping.txt, R.txt or AndroidManifest.xml files."}),"\n"]}),"\n",(0,n.jsx)(d.pre,{children:(0,n.jsx)(d.code,{children:"POST /api/debug_files/upload\n"})}),"\n",(0,n.jsx)(d.h3,{id:"parameters",children:"Parameters"}),"\n",(0,n.jsx)(d.admonition,{type:"info",children:(0,n.jsxs)(d.p,{children:[(0,n.jsx)(d.a,{href:"/docs/developer-guide/api#authentication",children:"Authentication"})," required."]})}),"\n",(0,n.jsxs)(d.table,{children:[(0,n.jsx)(d.thead,{children:(0,n.jsxs)(d.tr,{children:[(0,n.jsx)(d.th,{children:"Attribute"}),(0,n.jsx)(d.th,{children:"Type"}),(0,n.jsx)(d.th,{children:"Required"}),(0,n.jsx)(d.th,{children:"Description"})]})}),(0,n.jsxs)(d.tbody,{children:[(0,n.jsxs)(d.tr,{children:[(0,n.jsx)(d.td,{children:"channel_key"}),(0,n.jsx)(d.td,{children:(0,n.jsx)(d.code,{children:"String"})}),(0,n.jsx)(d.td,{children:"true"}),(0,n.jsx)(d.td,{children:"Channel key"})]}),(0,n.jsxs)(d.tr,{children:[(0,n.jsx)(d.td,{children:"file"}),(0,n.jsx)(d.td,{children:(0,n.jsx)(d.code,{children:"File"})}),(0,n.jsx)(d.td,{children:"true"}),(0,n.jsx)(d.td,{children:"Arichved file by zip"})]}),(0,n.jsxs)(d.tr,{children:[(0,n.jsx)(d.td,{children:"release_version"}),(0,n.jsx)(d.td,{children:(0,n.jsx)(d.code,{children:"String"})}),(0,n.jsx)(d.td,{children:"true"}),(0,n.jsx)(d.td,{children:"Release version, ignore this param if iOS app"})]}),(0,n.jsxs)(d.tr,{children:[(0,n.jsx)(d.td,{children:"build_version"}),(0,n.jsx)(d.td,{children:(0,n.jsx)(d.code,{children:"String"})}),(0,n.jsx)(d.td,{children:"true"}),(0,n.jsx)(d.td,{children:"Build version, ignore this param if iOS app"})]})]})]}),"\n",(0,n.jsx)(d.h3,{id:"return-body",children:"Return body"}),"\n",(0,n.jsx)(d.pre,{children:(0,n.jsx)(d.code,{className:"language-json",children:'{\n "id": 1,\n "app_name": "Demo App",\n "device_type": "ios",\n "release_version": "1.14.0",\n "build_version": "980",\n "file_url": "https://tryzealot.ews.im/download/debug_files/1",\n "metadata": [\n {\n "id": 1,\n "debug_file_id": 1,\n "uuid": "34656552-21ae-3722-a7fb-3582bc9b1d98",\n "type": "arm64",\n "object": "AppName",\n "data": {},\n "size": 4137941,\n "created_at": "2022-11-25T15:53:15.157+08:00",\n "updated_at": "2022-11-25T15:53:15.157+08:00"\n }\n ]\n}\n'})}),"\n",(0,n.jsx)(d.h2,{id:"download-debug-file",children:"Download debug file"}),"\n",(0,n.jsx)(d.p,{children:"This allows you to download an single iOS, Android debug file."}),"\n",(0,n.jsx)(d.pre,{children:(0,n.jsx)(d.code,{children:"GET /api/debug_files/download\n"})}),"\n",(0,n.jsx)(d.h3,{id:"parameters-1",children:"Parameters"}),"\n",(0,n.jsxs)(d.table,{children:[(0,n.jsx)(d.thead,{children:(0,n.jsxs)(d.tr,{children:[(0,n.jsx)(d.th,{children:"Attribute"}),(0,n.jsx)(d.th,{children:"Type"}),(0,n.jsx)(d.th,{children:"Required"}),(0,n.jsx)(d.th,{children:"Description"})]})}),(0,n.jsxs)(d.tbody,{children:[(0,n.jsxs)(d.tr,{children:[(0,n.jsx)(d.td,{children:"channel_key"}),(0,n.jsx)(d.td,{children:(0,n.jsx)(d.code,{children:"String"})}),(0,n.jsx)(d.td,{children:"true"}),(0,n.jsx)(d.td,{children:"Channel key"})]}),(0,n.jsxs)(d.tr,{children:[(0,n.jsx)(d.td,{children:"release_version"}),(0,n.jsx)(d.td,{children:(0,n.jsx)(d.code,{children:"String"})}),(0,n.jsx)(d.td,{children:"true"}),(0,n.jsx)(d.td,{children:"Release version, ignore this param if iOS app"})]}),(0,n.jsxs)(d.tr,{children:[(0,n.jsx)(d.td,{children:"build_version"}),(0,n.jsx)(d.td,{children:(0,n.jsx)(d.code,{children:"String"})}),(0,n.jsx)(d.td,{children:"false"}),(0,n.jsx)(d.td,{children:"Build version, ignore this param if iOS app"})]}),(0,n.jsxs)(d.tr,{children:[(0,n.jsx)(d.td,{children:"order"}),(0,n.jsx)(d.td,{children:(0,n.jsx)(d.code,{children:"String"})}),(0,n.jsx)(d.td,{children:"false"}),(0,n.jsxs)(d.td,{children:["Order by ",(0,n.jsx)("br",{}),(0,n.jsx)(d.code,{children:"version"})," = latest version, ",(0,n.jsx)(d.code,{children:"upload_date"})," = last uploaded date",(0,n.jsx)("br",{}),(0,n.jsxs)(d.strong,{children:["Vaild in release_version is ",(0,n.jsx)(d.code,{children:"latest"})]})]})]})]})]}),"\n",(0,n.jsx)(d.h3,{id:"return-body-1",children:"Return body"}),"\n",(0,n.jsxs)(d.ul,{children:["\n",(0,n.jsx)(d.li,{children:"Retun 200 status code if the version exists and redirect to the download address with a 302 status code."}),"\n",(0,n.jsx)(d.li,{children:"return 404 status code if the version does not exist."}),"\n"]}),"\n",(0,n.jsx)(d.h2,{id:"list-debug-files",children:"List debug files"}),"\n",(0,n.jsx)(d.p,{children:"Get a list of debug files."}),"\n",(0,n.jsx)(d.p,{children:"This function takes pagination parameters page and per_page to restrict the list of debug files."}),"\n",(0,n.jsx)(d.pre,{children:(0,n.jsx)(d.code,{children:"GET /api/debug_files\n"})}),"\n",(0,n.jsx)(d.h3,{id:"parameters-2",children:"Parameters"}),"\n",(0,n.jsxs)(d.table,{children:[(0,n.jsx)(d.thead,{children:(0,n.jsxs)(d.tr,{children:[(0,n.jsx)(d.th,{children:"Attribute"}),(0,n.jsx)(d.th,{children:"Type"}),(0,n.jsx)(d.th,{children:"Required"}),(0,n.jsx)(d.th,{children:"Description"})]})}),(0,n.jsxs)(d.tbody,{children:[(0,n.jsxs)(d.tr,{children:[(0,n.jsx)(d.td,{children:"channel_key"}),(0,n.jsx)(d.td,{children:(0,n.jsx)(d.code,{children:"String"})}),(0,n.jsx)(d.td,{children:"true"}),(0,n.jsx)(d.td,{children:"Channel key"})]}),(0,n.jsxs)(d.tr,{children:[(0,n.jsx)(d.td,{children:"page"}),(0,n.jsx)(d.td,{children:(0,n.jsx)(d.code,{children:"Integer"})}),(0,n.jsx)(d.td,{children:"false"}),(0,n.jsxs)(d.td,{children:["Page number (default: ",(0,n.jsx)(d.code,{children:"1"}),")"]})]}),(0,n.jsxs)(d.tr,{children:[(0,n.jsx)(d.td,{children:"per_page"}),(0,n.jsx)(d.td,{children:(0,n.jsx)(d.code,{children:"Integer"})}),(0,n.jsx)(d.td,{children:"false"}),(0,n.jsxs)(d.td,{children:["Number of items to list per page (default: ",(0,n.jsx)(d.code,{children:"25"}),", max: ",(0,n.jsx)(d.code,{children:"100"}),")."]})]})]})]}),"\n",(0,n.jsx)(d.h3,{id:"return-body-2",children:"Return body"}),"\n",(0,n.jsx)(d.pre,{children:(0,n.jsx)(d.code,{className:"language-json",children:'[\n {\n "id": 1,\n "app_name": "Demo App",\n "device_type": "ios",\n "release_version": "1.14.0",\n "build_version": "980",\n "file_url": "https://tryzealot.ews.im/download/debug_files/1",\n "metadata": [\n {\n "id": 1,\n "debug_file_id": 1,\n "uuid": "34656552-21ae-3722-a7fb-3582bc9b1d98",\n "type": "arm64",\n "object": "AppName",\n "data": {},\n "size": 4137941,\n "created_at": "2022-11-25T15:53:15.157+08:00",\n "updated_at": "2022-11-25T15:53:15.157+08:00"\n }\n ]\n }\n]\n'})}),"\n",(0,n.jsx)(d.h2,{id:"get-a-debug-file",children:"Get a debug file"}),"\n",(0,n.jsx)(d.p,{children:"Allows you to receive information about debug file like name, file size, UUID (iOS only), platform (iOS only) or file list (Android only)."}),"\n",(0,n.jsx)(d.pre,{children:(0,n.jsx)(d.code,{children:"GET /api/debug_files/:id\n"})}),"\n",(0,n.jsx)(d.h3,{id:"parameters-3",children:"Parameters"}),"\n",(0,n.jsx)(d.admonition,{type:"info",children:(0,n.jsxs)(d.p,{children:[(0,n.jsx)(d.a,{href:"/docs/developer-guide/api#authentication",children:"Authentication"})," required."]})}),"\n",(0,n.jsxs)(d.table,{children:[(0,n.jsx)(d.thead,{children:(0,n.jsxs)(d.tr,{children:[(0,n.jsx)(d.th,{children:"Attribute"}),(0,n.jsx)(d.th,{children:"Type"}),(0,n.jsx)(d.th,{children:"Required"}),(0,n.jsx)(d.th,{children:"Description"})]})}),(0,n.jsxs)(d.tbody,{children:[(0,n.jsxs)(d.tr,{children:[(0,n.jsx)(d.td,{children:"channel_key"}),(0,n.jsx)(d.td,{children:(0,n.jsx)(d.code,{children:"String"})}),(0,n.jsx)(d.td,{children:"true"}),(0,n.jsx)(d.td,{children:"Channel key"})]}),(0,n.jsxs)(d.tr,{children:[(0,n.jsx)(d.td,{children:"id"}),(0,n.jsx)(d.td,{children:(0,n.jsx)(d.code,{children:"String"})}),(0,n.jsx)(d.td,{children:"true"}),(0,n.jsx)(d.td,{children:"ID"})]})]})]}),"\n",(0,n.jsx)(d.h3,{id:"return-body-3",children:"Return body"}),"\n",(0,n.jsx)(d.pre,{children:(0,n.jsx)(d.code,{className:"language-json",children:'{\n "id": 1,\n "app_name": "Demo App",\n "device_type": "ios",\n "release_version": "1.14.0",\n "build_version": "980",\n "file_url": "https://tryzealot.ews.im/download/debug_files/1",\n "metadata": [\n {\n "id": 1,\n "debug_file_id": 1,\n "uuid": "34656552-21ae-3722-a7fb-3582bc9b1d98",\n "type": "arm64",\n "object": "AppName",\n "data": {},\n "size": 4137941,\n "created_at": "2022-11-25T15:53:15.157+08:00",\n "updated_at": "2022-11-25T15:53:15.157+08:00"\n }\n ]\n}\n'})}),"\n",(0,n.jsx)(d.h2,{id:"update-a-existed-debug-file",children:"Update a existed debug file"}),"\n",(0,n.jsx)(d.p,{children:"This allows you to update a debug file."}),"\n",(0,n.jsx)(d.pre,{children:(0,n.jsx)(d.code,{children:"PUT /api/debug_files/:id\n"})}),"\n",(0,n.jsx)(d.h3,{id:"parameters-4",children:"Parameters"}),"\n",(0,n.jsx)(d.admonition,{type:"info",children:(0,n.jsxs)(d.p,{children:[(0,n.jsx)(d.a,{href:"/docs/developer-guide/api#authentication",children:"Authentication"})," required."]})}),"\n",(0,n.jsxs)(d.table,{children:[(0,n.jsx)(d.thead,{children:(0,n.jsxs)(d.tr,{children:[(0,n.jsx)(d.th,{children:"Attribute"}),(0,n.jsx)(d.th,{children:"Type"}),(0,n.jsx)(d.th,{children:"Required"}),(0,n.jsx)(d.th,{children:"Description"})]})}),(0,n.jsxs)(d.tbody,{children:[(0,n.jsxs)(d.tr,{children:[(0,n.jsx)(d.td,{children:"channel_key"}),(0,n.jsx)(d.td,{children:(0,n.jsx)(d.code,{children:"String"})}),(0,n.jsx)(d.td,{children:"true"}),(0,n.jsx)(d.td,{children:"Channel key"})]}),(0,n.jsxs)(d.tr,{children:[(0,n.jsx)(d.td,{children:"id"}),(0,n.jsx)(d.td,{children:(0,n.jsx)(d.code,{children:"String"})}),(0,n.jsx)(d.td,{children:"true"}),(0,n.jsx)(d.td,{children:"ID"})]}),(0,n.jsxs)(d.tr,{children:[(0,n.jsx)(d.td,{children:"file"}),(0,n.jsx)(d.td,{children:(0,n.jsx)(d.code,{children:"File"})}),(0,n.jsx)(d.td,{children:"true"}),(0,n.jsx)(d.td,{children:"a Zipped debug file"})]}),(0,n.jsxs)(d.tr,{children:[(0,n.jsx)(d.td,{children:"release_version"}),(0,n.jsx)(d.td,{children:(0,n.jsx)(d.code,{children:"String"})}),(0,n.jsx)(d.td,{children:"true"}),(0,n.jsx)(d.td,{children:"Release version, ignore this param if iOS app"})]}),(0,n.jsxs)(d.tr,{children:[(0,n.jsx)(d.td,{children:"build_version"}),(0,n.jsx)(d.td,{children:(0,n.jsx)(d.code,{children:"String"})}),(0,n.jsx)(d.td,{children:"true"}),(0,n.jsx)(d.td,{children:"Build version, ignore this param if iOS app"})]})]})]}),"\n",(0,n.jsx)(d.h3,{id:"return-body-4",children:"Return body"}),"\n",(0,n.jsx)(d.pre,{children:(0,n.jsx)(d.code,{className:"language-json",children:'{\n "id": 1,\n "app_name": "Demo App",\n "device_type": "ios",\n "release_version": "1.14.0",\n "build_version": "980",\n "file_url": "https://tryzealot.ews.im/download/debug_files/1",\n "metadata": [\n {\n "id": 1,\n "debug_file_id": 1,\n "uuid": "34656552-21ae-3722-a7fb-3582bc9b1d98",\n "type": "arm64",\n "object": "AppName",\n "data": {},\n "size": 4137941,\n "created_at": "2022-11-25T15:53:15.157+08:00",\n "updated_at": "2022-11-25T15:53:15.157+08:00"\n }\n ]\n}\n'})}),"\n",(0,n.jsx)(d.h2,{id:"delete-a-debug-file",children:"Delete a debug file"}),"\n",(0,n.jsx)(d.p,{children:"This allows you to delete a debug file."}),"\n",(0,n.jsx)(d.pre,{children:(0,n.jsx)(d.code,{children:"DELETE /api/debug_files/:id\n"})}),"\n",(0,n.jsx)(d.h3,{id:"parameters-5",children:"Parameters"}),"\n",(0,n.jsx)(d.admonition,{type:"info",children:(0,n.jsxs)(d.p,{children:[(0,n.jsx)(d.a,{href:"/docs/developer-guide/api#authentication",children:"Authentication"})," required."]})}),"\n",(0,n.jsxs)(d.table,{children:[(0,n.jsx)(d.thead,{children:(0,n.jsxs)(d.tr,{children:[(0,n.jsx)(d.th,{children:"Attribute"}),(0,n.jsx)(d.th,{children:"Type"}),(0,n.jsx)(d.th,{children:"Required"}),(0,n.jsx)(d.th,{children:"Description"})]})}),(0,n.jsxs)(d.tbody,{children:[(0,n.jsxs)(d.tr,{children:[(0,n.jsx)(d.td,{children:"channel_key"}),(0,n.jsx)(d.td,{children:(0,n.jsx)(d.code,{children:"String"})}),(0,n.jsx)(d.td,{children:"true"}),(0,n.jsx)(d.td,{children:"Channel key"})]}),(0,n.jsxs)(d.tr,{children:[(0,n.jsx)(d.td,{children:"id"}),(0,n.jsx)(d.td,{children:(0,n.jsx)(d.code,{children:"String"})}),(0,n.jsx)(d.td,{children:"true"}),(0,n.jsx)(d.td,{children:"ID"})]})]})]}),"\n",(0,n.jsx)(d.h3,{id:"return-body-5",children:"Return body"}),"\n",(0,n.jsx)(d.pre,{children:(0,n.jsx)(d.code,{className:"language-json",children:'{\n "mesage": "OK"\n}\n'})})]})}function o(e={}){const{wrapper:d}={...(0,r.a)(),...e.components};return d?(0,n.jsx)(d,{...e,children:(0,n.jsx)(h,{...e})}):h(e)}},1151:(e,d,i)=>{i.d(d,{Z:()=>t,a:()=>s});var n=i(7294);const r={},l=n.createContext(r);function s(e){const d=n.useContext(l);return n.useMemo((function(){return"function"==typeof e?e(d):{...d,...e}}),[d,e])}function t(e){let d;return d=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:s(e.components),n.createElement(l.Provider,{value:d},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/34f9a893.5dcf95bb.js b/assets/js/25564e8e.ca99e45a.js similarity index 88% rename from assets/js/34f9a893.5dcf95bb.js rename to assets/js/25564e8e.ca99e45a.js index c9692c608..f63060bb9 100644 --- a/assets/js/34f9a893.5dcf95bb.js +++ b/assets/js/25564e8e.ca99e45a.js @@ -1 +1 @@ -"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[3178],{2290:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>u,contentTitle:()=>c,default:()=>m,frontMatter:()=>p,metadata:()=>i,toc:()=>d});var s=n(5893),r=n(1151),a=n(9965),o=n(4996);const p={},c="Create an App",i={id:"user-guide/apps/create",title:"Create an App",description:"{n.d(t,{Z:()=>p,a:()=>o});var s=n(7294);const r={},a=s.createContext(r);function o(e){const t=s.useContext(a);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function p(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:o(e.components),s.createElement(a.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[1504],{7170:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>u,contentTitle:()=>c,default:()=>m,frontMatter:()=>p,metadata:()=>i,toc:()=>d});var s=n(5893),r=n(1151),a=n(9965),o=n(4996);const p={},c="Create an App",i={id:"user-guide/apps/create",title:"Create an App",description:"{n.d(t,{Z:()=>p,a:()=>o});var s=n(7294);const r={},a=s.createContext(r);function o(e){const t=s.useContext(a);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function p(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:o(e.components),s.createElement(a.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/26a592c3.3e4e7e27.js b/assets/js/26a592c3.3e4e7e27.js deleted file mode 100644 index dc1fd47b4..000000000 --- a/assets/js/26a592c3.3e4e7e27.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[8417],{9605:(e,o,t)=>{t.r(o),t.d(o,{assets:()=>i,contentTitle:()=>d,default:()=>u,frontMatter:()=>r,metadata:()=>c,toc:()=>l});var n=t(5893),s=t(1151);const r={sidebar_label:"Source code"},d="Source code",c={id:"self-hosted/deployment/source-code",title:"Source code",description:"It had been rewrite to Contributing Guide.",source:"@site/versioned_docs/version-5.1.0/self-hosted/deployment/source-code.md",sourceDirName:"self-hosted/deployment",slug:"/self-hosted/deployment/source-code",permalink:"/docs/self-hosted/deployment/source-code",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.1.0/self-hosted/deployment/source-code.md",tags:[],version:"5.1.0",frontMatter:{sidebar_label:"Source code"},sidebar:"selfHosted",previous:{title:"Nomad",permalink:"/docs/self-hosted/deployment/nomad"},next:{title:"Reverse Proxies",permalink:"/docs/self-hosted/reverse-proxies"}},i={},l=[];function a(e){const o={a:"a",h1:"h1",p:"p",...(0,s.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(o.h1,{id:"source-code",children:"Source code"}),"\n",(0,n.jsxs)(o.p,{children:["It had been rewrite to ",(0,n.jsx)(o.a,{href:"/docs/contributing-guide",children:"Contributing Guide"}),"."]})]})}function u(e={}){const{wrapper:o}={...(0,s.a)(),...e.components};return o?(0,n.jsx)(o,{...e,children:(0,n.jsx)(a,{...e})}):a(e)}},1151:(e,o,t)=>{t.d(o,{Z:()=>c,a:()=>d});var n=t(7294);const s={},r=n.createContext(s);function d(e){const o=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function c(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:d(e.components),n.createElement(r.Provider,{value:o},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/26a592c3.8800d786.js b/assets/js/26a592c3.8800d786.js new file mode 100644 index 000000000..e36cf89db --- /dev/null +++ b/assets/js/26a592c3.8800d786.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[8417],{9605:(e,o,t)=>{t.r(o),t.d(o,{assets:()=>i,contentTitle:()=>d,default:()=>u,frontMatter:()=>r,metadata:()=>c,toc:()=>l});var n=t(5893),s=t(1151);const r={sidebar_label:"Source code"},d="Source code",c={id:"self-hosted/deployment/source-code",title:"Source code",description:"It had been rewrite to Contributing Guide.",source:"@site/versioned_docs/version-5.1.0/self-hosted/deployment/source-code.md",sourceDirName:"self-hosted/deployment",slug:"/self-hosted/deployment/source-code",permalink:"/docs/5.1.0/self-hosted/deployment/source-code",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.1.0/self-hosted/deployment/source-code.md",tags:[],version:"5.1.0",frontMatter:{sidebar_label:"Source code"},sidebar:"selfHosted",previous:{title:"Nomad",permalink:"/docs/5.1.0/self-hosted/deployment/nomad"},next:{title:"Reverse Proxies",permalink:"/docs/5.1.0/self-hosted/reverse-proxies"}},i={},l=[];function a(e){const o={a:"a",h1:"h1",p:"p",...(0,s.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(o.h1,{id:"source-code",children:"Source code"}),"\n",(0,n.jsxs)(o.p,{children:["It had been rewrite to ",(0,n.jsx)(o.a,{href:"/docs/contributing-guide",children:"Contributing Guide"}),"."]})]})}function u(e={}){const{wrapper:o}={...(0,s.a)(),...e.components};return o?(0,n.jsx)(o,{...e,children:(0,n.jsx)(a,{...e})}):a(e)}},1151:(e,o,t)=>{t.d(o,{Z:()=>c,a:()=>d});var n=t(7294);const s={},r=n.createContext(s);function d(e){const o=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function c(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:d(e.components),n.createElement(r.Provider,{value:o},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/e239d5d6.e8e993a9.js b/assets/js/27d8714b.fe75bee2.js similarity index 92% rename from assets/js/e239d5d6.e8e993a9.js rename to assets/js/27d8714b.fe75bee2.js index d7fb22f87..efd2a2751 100644 --- a/assets/js/e239d5d6.e8e993a9.js +++ b/assets/js/27d8714b.fe75bee2.js @@ -1 +1 @@ -"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[2717],{1591:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>c,default:()=>u,frontMatter:()=>r,metadata:()=>a,toc:()=>i});var o=n(5893),s=n(1151);const r={},c="Slack",a={id:"user-guide/webhooks/slack",title:"Slack",description:"Slack use Incoming Webhooks whose constructs",source:"@site/versioned_docs/version-5.1.0/user-guide/webhooks/slack.md",sourceDirName:"user-guide/webhooks",slug:"/user-guide/webhooks/slack",permalink:"/docs/user-guide/webhooks/slack",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.1.0/user-guide/webhooks/slack.md",tags:[],version:"5.1.0",frontMatter:{},sidebar:"userGuide",previous:{title:"Webhooks",permalink:"/docs/user-guide/webhooks"},next:{title:"Discord",permalink:"/docs/user-guide/webhooks/discord"}},l={},i=[{value:"Text format",id:"text-format",level:2},{value:"Block rich text format",id:"block-rich-text-format",level:2}];function d(e){const t={a:"a",code:"code",h1:"h1",h2:"h2",p:"p",pre:"pre",...(0,s.a)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.h1,{id:"slack",children:"Slack"}),"\n",(0,o.jsxs)(t.p,{children:[(0,o.jsx)(t.a,{href:"https://api.slack.com/messaging/webhooks",children:"Slack"})," use Incoming Webhooks whose constructs\ntypically support both text and block rich text, and can be configured as follows:"]}),"\n",(0,o.jsx)(t.h2,{id:"text-format",children:"Text format"}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{className:"language-ruby",children:'{\n "text": "#{@title}\\nPlatform: #{@device_type}\\nUpload at: #{@uploaded_at}"\n}\n'})}),"\n",(0,o.jsx)(t.h2,{id:"block-rich-text-format",children:"Block rich text format"}),"\n",(0,o.jsx)(t.p,{children:"A simple block with markdown support"}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{className:"language-ruby",children:'{\n "blocks": [\n {\n "type": "section",\n "text": {\n "type": "mrkdwn",\n "text": "## #{@title}\\nPlatform: #{@device_type}\\nUpload at: #{@uploaded_at}\\nInstal QRcode:\\n![qrcode](#{@qrcode_url})"\n }\n }\n ]\n}\n'})}),"\n",(0,o.jsx)(t.p,{children:"Better look at some of the structures shown in the block"}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{className:"language-ruby",children:'{\n "blocks": [\n {\n "type": "section",\n "text": {\n "type": "mrkdwn",\n "text": @title,\n }\n },\n {\n "type": "section",\n "fields": [\n {\n "type": "mrkdwn",\n "text": "*Platform:*\\n#{@device_type}"\n },\n {\n "type": "mrkdwn",\n "text": "*Upload at:*\\n#{@uploaded_at}"\n }\n ]\n },\n "accessory": {\n "type": "image",\n "image_url": @qrcode_url,\n "alt_text": "install qrcode"\n }\n ]\n}\n'})})]})}function u(e={}){const{wrapper:t}={...(0,s.a)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},1151:(e,t,n)=>{n.d(t,{Z:()=>a,a:()=>c});var o=n(7294);const s={},r=o.createContext(s);function c(e){const t=o.useContext(r);return o.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:c(e.components),o.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[5999],{7316:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>c,default:()=>u,frontMatter:()=>r,metadata:()=>a,toc:()=>i});var o=n(5893),s=n(1151);const r={},c="Slack",a={id:"user-guide/webhooks/slack",title:"Slack",description:"Slack use Incoming Webhooks whose constructs",source:"@site/versioned_docs/version-5.2.0/user-guide/webhooks/slack.md",sourceDirName:"user-guide/webhooks",slug:"/user-guide/webhooks/slack",permalink:"/docs/user-guide/webhooks/slack",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.2.0/user-guide/webhooks/slack.md",tags:[],version:"5.2.0",frontMatter:{},sidebar:"userGuide",previous:{title:"Webhooks",permalink:"/docs/user-guide/webhooks"},next:{title:"Discord",permalink:"/docs/user-guide/webhooks/discord"}},l={},i=[{value:"Text format",id:"text-format",level:2},{value:"Block rich text format",id:"block-rich-text-format",level:2}];function d(e){const t={a:"a",code:"code",h1:"h1",h2:"h2",p:"p",pre:"pre",...(0,s.a)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.h1,{id:"slack",children:"Slack"}),"\n",(0,o.jsxs)(t.p,{children:[(0,o.jsx)(t.a,{href:"https://api.slack.com/messaging/webhooks",children:"Slack"})," use Incoming Webhooks whose constructs\ntypically support both text and block rich text, and can be configured as follows:"]}),"\n",(0,o.jsx)(t.h2,{id:"text-format",children:"Text format"}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{className:"language-ruby",children:'{\n "text": "#{@title}\\nPlatform: #{@device_type}\\nUpload at: #{@uploaded_at}"\n}\n'})}),"\n",(0,o.jsx)(t.h2,{id:"block-rich-text-format",children:"Block rich text format"}),"\n",(0,o.jsx)(t.p,{children:"A simple block with markdown support"}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{className:"language-ruby",children:'{\n "blocks": [\n {\n "type": "section",\n "text": {\n "type": "mrkdwn",\n "text": "## #{@title}\\nPlatform: #{@device_type}\\nUpload at: #{@uploaded_at}\\nInstal QRcode:\\n![qrcode](#{@qrcode_url})"\n }\n }\n ]\n}\n'})}),"\n",(0,o.jsx)(t.p,{children:"Better look at some of the structures shown in the block"}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{className:"language-ruby",children:'{\n "blocks": [\n {\n "type": "section",\n "text": {\n "type": "mrkdwn",\n "text": @title,\n }\n },\n {\n "type": "section",\n "fields": [\n {\n "type": "mrkdwn",\n "text": "*Platform:*\\n#{@device_type}"\n },\n {\n "type": "mrkdwn",\n "text": "*Upload at:*\\n#{@uploaded_at}"\n }\n ]\n },\n "accessory": {\n "type": "image",\n "image_url": @qrcode_url,\n "alt_text": "install qrcode"\n }\n ]\n}\n'})})]})}function u(e={}){const{wrapper:t}={...(0,s.a)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},1151:(e,t,n)=>{n.d(t,{Z:()=>a,a:()=>c});var o=n(7294);const s={},r=o.createContext(s);function c(e){const t=o.useContext(r);return o.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:c(e.components),o.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/2a894c30.00e9f497.js b/assets/js/2a894c30.00e9f497.js deleted file mode 100644 index b96164481..000000000 --- a/assets/js/2a894c30.00e9f497.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[419],{7656:(n,t,e)=>{e.r(t),e.d(t,{assets:()=>u,contentTitle:()=>a,default:()=>l,frontMatter:()=>g,metadata:()=>d,toc:()=>c});var i=e(5893),o=e(1151),r=e(9965),s=e(4996);const g={},a="Logging",d={id:"user-guide/administrator/monitoring/logging",title:"Logging",description:"{e.d(t,{Z:()=>g,a:()=>s});var i=e(7294);const o={},r=i.createContext(o);function s(n){const t=i.useContext(r);return i.useMemo((function(){return"function"==typeof n?n(t):{...t,...n}}),[t,n])}function g(n){let t;return t=n.disableParentContext?"function"==typeof n.components?n.components(o):n.components||o:s(n.components),i.createElement(r.Provider,{value:t},n.children)}}}]); \ No newline at end of file diff --git a/assets/js/2a894c30.9f50c727.js b/assets/js/2a894c30.9f50c727.js new file mode 100644 index 000000000..21caae4e8 --- /dev/null +++ b/assets/js/2a894c30.9f50c727.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[419],{7656:(n,t,e)=>{e.r(t),e.d(t,{assets:()=>u,contentTitle:()=>a,default:()=>l,frontMatter:()=>g,metadata:()=>d,toc:()=>c});var i=e(5893),o=e(1151),r=e(9965),s=e(4996);const g={},a="Logging",d={id:"user-guide/administrator/monitoring/logging",title:"Logging",description:"{e.d(t,{Z:()=>g,a:()=>s});var i=e(7294);const o={},r=i.createContext(o);function s(n){const t=i.useContext(r);return i.useMemo((function(){return"function"==typeof n?n(t):{...t,...n}}),[t,n])}function g(n){let t;return t=n.disableParentContext?"function"==typeof n.components?n.components(o):n.components||o:s(n.components),i.createElement(r.Provider,{value:t},n.children)}}}]); \ No newline at end of file diff --git a/assets/js/40b43bed.49e1bad1.js b/assets/js/2d6084ed.9b3b48a7.js similarity index 92% rename from assets/js/40b43bed.49e1bad1.js rename to assets/js/2d6084ed.9b3b48a7.js index 3bdfd3272..f875f8eb7 100644 --- a/assets/js/40b43bed.49e1bad1.js +++ b/assets/js/2d6084ed.9b3b48a7.js @@ -1 +1 @@ -"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[443],{1450:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>i,contentTitle:()=>d,default:()=>p,frontMatter:()=>s,metadata:()=>l,toc:()=>a});var r=t(5893),o=t(1151);const s={sidebar_label:"Render"},d="Deploy Zealot to Render guide",l={id:"self-hosted/deployment/render",title:"Deploy Zealot to Render guide",description:"Zealot support a render blueprint named render.yaml to deploy on render.com.",source:"@site/versioned_docs/version-5.1.0/self-hosted/deployment/render.md",sourceDirName:"self-hosted/deployment",slug:"/self-hosted/deployment/render",permalink:"/docs/self-hosted/deployment/render",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.1.0/self-hosted/deployment/render.md",tags:[],version:"5.1.0",frontMatter:{sidebar_label:"Render"},sidebar:"selfHosted",previous:{title:"Railway",permalink:"/docs/self-hosted/deployment/railway"},next:{title:"Configuration",permalink:"/docs/category/configuration"}},i={},a=[{value:"Deploying on Render",id:"deploying-on-render",level:2},{value:"Install button",id:"install-button",level:3}];function c(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",img:"img",li:"li",p:"p",ul:"ul",...(0,o.a)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.h1,{id:"deploy-zealot-to-render-guide",children:"Deploy Zealot to Render guide"}),"\n",(0,r.jsxs)(n.p,{children:["Zealot support a render ",(0,r.jsx)(n.a,{href:"https://render.com/docs/blueprint-spec",children:"blueprint"})," named ",(0,r.jsx)(n.code,{children:"render.yaml"})," to deploy on ",(0,r.jsx)(n.a,{href:"https://render.com/",children:"render.com"}),"."]}),"\n",(0,r.jsx)(n.h2,{id:"deploying-on-render",children:"Deploying on Render"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["It uses the ",(0,r.jsx)(n.a,{href:"https://ghcr.io/tryzealot/zealot",children:"Zealot Docker image"}),"."]}),"\n",(0,r.jsxs)(n.li,{children:["It uses ",(0,r.jsx)(n.a,{href:"https://render.com/docs/disks",children:"Render Disks"})," for permanent SSD storage for uploaded files and content."]}),"\n",(0,r.jsxs)(n.li,{children:["It uses ",(0,r.jsx)(n.a,{href:"https://render.com/docs/databases",children:"PostgreSQL"})," as the backing database and ",(0,r.jsx)(n.a,{href:"https://render.com/docs/redis",children:"Redis"})," as cache service."]}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"install-button",children:"Install button"}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.a,{href:"https://render.com/deploy?repo=https://github.com/tryzealot/zealot",children:(0,r.jsx)(n.img,{src:"https://render.com/images/deploy-to-render-button.svg",alt:"Deploy to Render"})})})]})}function p(e={}){const{wrapper:n}={...(0,o.a)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(c,{...e})}):c(e)}},1151:(e,n,t)=>{t.d(n,{Z:()=>l,a:()=>d});var r=t(7294);const o={},s=r.createContext(o);function d(e){const n=r.useContext(s);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:d(e.components),r.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[6270],{281:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>i,contentTitle:()=>d,default:()=>p,frontMatter:()=>s,metadata:()=>l,toc:()=>a});var r=t(5893),o=t(1151);const s={sidebar_label:"Render"},d="Deploy Zealot to Render guide",l={id:"self-hosted/deployment/render",title:"Deploy Zealot to Render guide",description:"Zealot support a render blueprint named render.yaml to deploy on render.com.",source:"@site/versioned_docs/version-5.2.0/self-hosted/deployment/render.md",sourceDirName:"self-hosted/deployment",slug:"/self-hosted/deployment/render",permalink:"/docs/self-hosted/deployment/render",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.2.0/self-hosted/deployment/render.md",tags:[],version:"5.2.0",frontMatter:{sidebar_label:"Render"},sidebar:"selfHosted",previous:{title:"Railway",permalink:"/docs/self-hosted/deployment/railway"},next:{title:"Configuration",permalink:"/docs/category/configuration"}},i={},a=[{value:"Deploying on Render",id:"deploying-on-render",level:2},{value:"Install button",id:"install-button",level:3}];function c(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",img:"img",li:"li",p:"p",ul:"ul",...(0,o.a)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.h1,{id:"deploy-zealot-to-render-guide",children:"Deploy Zealot to Render guide"}),"\n",(0,r.jsxs)(n.p,{children:["Zealot support a render ",(0,r.jsx)(n.a,{href:"https://render.com/docs/blueprint-spec",children:"blueprint"})," named ",(0,r.jsx)(n.code,{children:"render.yaml"})," to deploy on ",(0,r.jsx)(n.a,{href:"https://render.com/",children:"render.com"}),"."]}),"\n",(0,r.jsx)(n.h2,{id:"deploying-on-render",children:"Deploying on Render"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["It uses the ",(0,r.jsx)(n.a,{href:"https://ghcr.io/tryzealot/zealot",children:"Zealot Docker image"}),"."]}),"\n",(0,r.jsxs)(n.li,{children:["It uses ",(0,r.jsx)(n.a,{href:"https://render.com/docs/disks",children:"Render Disks"})," for permanent SSD storage for uploaded files and content."]}),"\n",(0,r.jsxs)(n.li,{children:["It uses ",(0,r.jsx)(n.a,{href:"https://render.com/docs/databases",children:"PostgreSQL"})," as the backing database and ",(0,r.jsx)(n.a,{href:"https://render.com/docs/redis",children:"Redis"})," as cache service."]}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"install-button",children:"Install button"}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.a,{href:"https://render.com/deploy?repo=https://github.com/tryzealot/zealot",children:(0,r.jsx)(n.img,{src:"https://render.com/images/deploy-to-render-button.svg",alt:"Deploy to Render"})})})]})}function p(e={}){const{wrapper:n}={...(0,o.a)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(c,{...e})}):c(e)}},1151:(e,n,t)=>{t.d(n,{Z:()=>l,a:()=>d});var r=t(7294);const o={},s=r.createContext(o);function d(e){const n=r.useContext(s);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:d(e.components),r.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/319939e8.521f5f29.js b/assets/js/319939e8.521f5f29.js new file mode 100644 index 000000000..ab95e65f5 --- /dev/null +++ b/assets/js/319939e8.521f5f29.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[483],{9371:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>d,default:()=>p,frontMatter:()=>u,metadata:()=>a,toc:()=>c});var s=n(5893),o=n(1151),i=n(9965),r=n(4996);const u={},d="Create a Debug File",a={id:"user-guide/debug-files/upload",title:"Create a Debug File",description:"{n.d(t,{Z:()=>u,a:()=>r});var s=n(7294);const o={},i=s.createContext(o);function r(e){const t=s.useContext(i);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function u(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:r(e.components),s.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/319939e8.883a0570.js b/assets/js/319939e8.883a0570.js deleted file mode 100644 index 2b7fae416..000000000 --- a/assets/js/319939e8.883a0570.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[483],{9371:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>d,default:()=>p,frontMatter:()=>u,metadata:()=>a,toc:()=>c});var s=n(5893),o=n(1151),i=n(9965),r=n(4996);const u={},d="Create a Debug File",a={id:"user-guide/debug-files/upload",title:"Create a Debug File",description:"{n.d(t,{Z:()=>u,a:()=>r});var s=n(7294);const o={},i=s.createContext(o);function r(e){const t=s.useContext(i);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function u(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:r(e.components),s.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/32bba384.a06a2a9a.js b/assets/js/32bba384.a06a2a9a.js deleted file mode 100644 index 6af3d213e..000000000 --- a/assets/js/32bba384.a06a2a9a.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[917],{8051:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>r,contentTitle:()=>i,default:()=>p,frontMatter:()=>s,metadata:()=>l,toc:()=>c});var o=n(5893),a=n(1151);const s={sidebar_label:"zealot_sync_devices"},i="Fastlane action: zealot_sync_devices",l={id:"developer-guide/fastlane/zealot_sync_devices",title:"Fastlane action: zealot_sync_devices",description:"Zealot 4.5.0 built in Apple team manage which it use Apple API Key",source:"@site/versioned_docs/version-5.1.0/developer-guide/fastlane/zealot_sync_devices.md",sourceDirName:"developer-guide/fastlane",slug:"/developer-guide/fastlane/zealot_sync_devices",permalink:"/docs/developer-guide/fastlane/zealot_sync_devices",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.1.0/developer-guide/fastlane/zealot_sync_devices.md",tags:[],version:"5.1.0",frontMatter:{sidebar_label:"zealot_sync_devices"},sidebar:"developerGuide",previous:{title:"zealot_debug_file",permalink:"/docs/developer-guide/fastlane/zealot_debug_file"},next:{title:"APIs",permalink:"/docs/developer-guide/api"}},r={},c=[{value:"Parameters",id:"parameters",level:2}];function d(e){const t={a:"a",blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",p:"p",pre:"pre",...(0,a.a)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.h1,{id:"fastlane-action-zealot_sync_devices",children:"Fastlane action: zealot_sync_devices"}),"\n",(0,o.jsxs)(t.blockquote,{children:["\n",(0,o.jsxs)(t.p,{children:["\ud83d\udd14"," Zealot 4.5.0 built in Apple team manage which it use ",(0,o.jsx)(t.a,{href:"https://docs.fastlane.tools/app-store-connect-api/#using-fastlane-api-key-json-file",children:"Apple API Key"}),"\nto sync iOS devices, even CAN registe the device after fetch the UDID, ",(0,o.jsx)(t.a,{href:"/docs/user-guide/administrator/apple-team",children:"Check detail"})]}),"\n"]}),"\n",(0,o.jsx)(t.p,{children:"Use Apple Developer account to syncing UDIDs and relates the value in Zealot."}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{className:"language-ruby",children:"# With Apple API Key\nzealot_sync_devices(\n endpoint: 'https://zealot.com',\n token: '...',\n api_key_path: '/path/to/your/api_key_json_file',\n team_id: '...'\n)\n\n# With password (Two-factor Authentication required)\nzealot_sync_devices(\n endpoint: 'https://zealot.com',\n token: '...',\n username: 'user@example.com',\n team_id: '...'\n)\n"})}),"\n",(0,o.jsx)(t.h2,{id:"parameters",children:"Parameters"}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{children:"+---------------+-----------------------------------------------------------------------------+------------------------+---------+\n| zealot_sync_devices Options |\n+---------------+-----------------------------------------------------------------------------+------------------------+---------+\n| Key | Description | Env Var(s) | Default |\n+---------------+-----------------------------------------------------------------------------+------------------------+---------+\n| endpoint | The endpoint of zealot | ZEALOT_ENDPOINT | |\n| token | The token of user | ZEALOT_TOKEN | |\n| username | The apple id (username) of Apple Developer Portal | ZEALOT_USERNAME | * |\n| api_key_path | Path to your App Store Connect API Key JSON file | ZEALOT_API_PATH | |\n| | (https://docs.fastlane.tools/app-store-connect-api/#using-fastlane-api-key | | |\n| | -json-file) | | |\n| api_key | Your App Store Connect API Key information | ZEALOT_API_KEY | * |\n| | (https://docs.fastlane.tools/app-store-connect-api/#using-fastlane-api-key | | |\n| | -hash-option) | | |\n| team_id | The ID of your Developer Portal team if you're in multiple teams | ZEALOT_APPLE_TEAM_ID | * |\n| team_name | The name of your Developer Portal team if you're in multiple teams | ZEALOT_APPLE_TEAM_NAME | * |\n| platform | The platform to use (optional) | ZEALOT_APPLE_PLATFORM | ios |\n| verify_ssl | Should verify SSL of zealot service | ZEALOT_VERIFY_SSL | true |\n| timeout | Request timeout in seconds | ZEALOT_TIMEOUT | |\n| fail_on_error | Should an error http request cause a failure? (true/false) | ZEALOT_FAIL_ON_ERROR | false |\n+---------------+-----------------------------------------------------------------------------+------------------------+---------+\n"})})]})}function p(e={}){const{wrapper:t}={...(0,a.a)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},1151:(e,t,n)=>{n.d(t,{Z:()=>l,a:()=>i});var o=n(7294);const a={},s=o.createContext(a);function i(e){const t=o.useContext(s);return o.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function l(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:i(e.components),o.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/32bba384.fe838c04.js b/assets/js/32bba384.fe838c04.js new file mode 100644 index 000000000..a1dcc6b6a --- /dev/null +++ b/assets/js/32bba384.fe838c04.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[917],{8051:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>r,contentTitle:()=>i,default:()=>p,frontMatter:()=>s,metadata:()=>l,toc:()=>c});var o=n(5893),a=n(1151);const s={sidebar_label:"zealot_sync_devices"},i="Fastlane action: zealot_sync_devices",l={id:"developer-guide/fastlane/zealot_sync_devices",title:"Fastlane action: zealot_sync_devices",description:"Zealot 4.5.0 built in Apple team manage which it use Apple API Key",source:"@site/versioned_docs/version-5.1.0/developer-guide/fastlane/zealot_sync_devices.md",sourceDirName:"developer-guide/fastlane",slug:"/developer-guide/fastlane/zealot_sync_devices",permalink:"/docs/5.1.0/developer-guide/fastlane/zealot_sync_devices",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.1.0/developer-guide/fastlane/zealot_sync_devices.md",tags:[],version:"5.1.0",frontMatter:{sidebar_label:"zealot_sync_devices"},sidebar:"developerGuide",previous:{title:"zealot_debug_file",permalink:"/docs/5.1.0/developer-guide/fastlane/zealot_debug_file"},next:{title:"APIs",permalink:"/docs/5.1.0/developer-guide/api"}},r={},c=[{value:"Parameters",id:"parameters",level:2}];function d(e){const t={a:"a",blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",p:"p",pre:"pre",...(0,a.a)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.h1,{id:"fastlane-action-zealot_sync_devices",children:"Fastlane action: zealot_sync_devices"}),"\n",(0,o.jsxs)(t.blockquote,{children:["\n",(0,o.jsxs)(t.p,{children:["\ud83d\udd14"," Zealot 4.5.0 built in Apple team manage which it use ",(0,o.jsx)(t.a,{href:"https://docs.fastlane.tools/app-store-connect-api/#using-fastlane-api-key-json-file",children:"Apple API Key"}),"\nto sync iOS devices, even CAN registe the device after fetch the UDID, ",(0,o.jsx)(t.a,{href:"/docs/user-guide/administrator/apple-team",children:"Check detail"})]}),"\n"]}),"\n",(0,o.jsx)(t.p,{children:"Use Apple Developer account to syncing UDIDs and relates the value in Zealot."}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{className:"language-ruby",children:"# With Apple API Key\nzealot_sync_devices(\n endpoint: 'https://zealot.com',\n token: '...',\n api_key_path: '/path/to/your/api_key_json_file',\n team_id: '...'\n)\n\n# With password (Two-factor Authentication required)\nzealot_sync_devices(\n endpoint: 'https://zealot.com',\n token: '...',\n username: 'user@example.com',\n team_id: '...'\n)\n"})}),"\n",(0,o.jsx)(t.h2,{id:"parameters",children:"Parameters"}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{children:"+---------------+-----------------------------------------------------------------------------+------------------------+---------+\n| zealot_sync_devices Options |\n+---------------+-----------------------------------------------------------------------------+------------------------+---------+\n| Key | Description | Env Var(s) | Default |\n+---------------+-----------------------------------------------------------------------------+------------------------+---------+\n| endpoint | The endpoint of zealot | ZEALOT_ENDPOINT | |\n| token | The token of user | ZEALOT_TOKEN | |\n| username | The apple id (username) of Apple Developer Portal | ZEALOT_USERNAME | * |\n| api_key_path | Path to your App Store Connect API Key JSON file | ZEALOT_API_PATH | |\n| | (https://docs.fastlane.tools/app-store-connect-api/#using-fastlane-api-key | | |\n| | -json-file) | | |\n| api_key | Your App Store Connect API Key information | ZEALOT_API_KEY | * |\n| | (https://docs.fastlane.tools/app-store-connect-api/#using-fastlane-api-key | | |\n| | -hash-option) | | |\n| team_id | The ID of your Developer Portal team if you're in multiple teams | ZEALOT_APPLE_TEAM_ID | * |\n| team_name | The name of your Developer Portal team if you're in multiple teams | ZEALOT_APPLE_TEAM_NAME | * |\n| platform | The platform to use (optional) | ZEALOT_APPLE_PLATFORM | ios |\n| verify_ssl | Should verify SSL of zealot service | ZEALOT_VERIFY_SSL | true |\n| timeout | Request timeout in seconds | ZEALOT_TIMEOUT | |\n| fail_on_error | Should an error http request cause a failure? (true/false) | ZEALOT_FAIL_ON_ERROR | false |\n+---------------+-----------------------------------------------------------------------------+------------------------+---------+\n"})})]})}function p(e={}){const{wrapper:t}={...(0,a.a)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},1151:(e,t,n)=>{n.d(t,{Z:()=>l,a:()=>i});var o=n(7294);const a={},s=o.createContext(a);function i(e){const t=o.useContext(s);return o.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function l(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:i(e.components),o.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/33da4e92.0c2a63b3.js b/assets/js/33da4e92.0c2a63b3.js new file mode 100644 index 000000000..5ed0d3e47 --- /dev/null +++ b/assets/js/33da4e92.0c2a63b3.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[414],{5898:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>a,contentTitle:()=>u,default:()=>f,frontMatter:()=>o,metadata:()=>l,toc:()=>c});var s=i(5893),n=i(1151),d=i(9965),r=i(4996);const o={},u="List debug files",l={id:"user-guide/debug-files/index",title:"List debug files",description:"List all uploaded debug files oragiazed by app.",source:"@site/versioned_docs/version-5.1.0/user-guide/debug-files/index.mdx",sourceDirName:"user-guide/debug-files",slug:"/user-guide/debug-files/",permalink:"/docs/5.1.0/user-guide/debug-files/",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.1.0/user-guide/debug-files/index.mdx",tags:[],version:"5.1.0",frontMatter:{},sidebar:"userGuide",previous:{title:"Debug Files",permalink:"/docs/5.1.0/category/debug-files"},next:{title:"Review metadata",permalink:"/docs/5.1.0/user-guide/debug-files/review"}},a={},c=[];function g(e){const t={h1:"h1",p:"p",...(0,n.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.h1,{id:"list-debug-files",children:"List debug files"}),"\n",(0,s.jsx)(t.p,{children:"List all uploaded debug files oragiazed by app."}),"\n","\n","\n",(0,s.jsx)(d.Z,{alt:"",sources:{light:(0,r.Z)("/img/5.0.0/debug-file-index-light.png"),dark:(0,r.Z)("/img/5.0.0/debug-file-index-dark.png")}})]})}function f(e={}){const{wrapper:t}={...(0,n.a)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(g,{...e})}):g(e)}},1151:(e,t,i)=>{i.d(t,{Z:()=>o,a:()=>r});var s=i(7294);const n={},d=s.createContext(n);function r(e){const t=s.useContext(d);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function o(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:r(e.components),s.createElement(d.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/33da4e92.dc3d9700.js b/assets/js/33da4e92.dc3d9700.js deleted file mode 100644 index f1a1f826c..000000000 --- a/assets/js/33da4e92.dc3d9700.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[414],{5898:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>a,contentTitle:()=>u,default:()=>f,frontMatter:()=>o,metadata:()=>l,toc:()=>c});var s=i(5893),n=i(1151),d=i(9965),r=i(4996);const o={},u="List debug files",l={id:"user-guide/debug-files/index",title:"List debug files",description:"List all uploaded debug files oragiazed by app.",source:"@site/versioned_docs/version-5.1.0/user-guide/debug-files/index.mdx",sourceDirName:"user-guide/debug-files",slug:"/user-guide/debug-files/",permalink:"/docs/user-guide/debug-files/",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.1.0/user-guide/debug-files/index.mdx",tags:[],version:"5.1.0",frontMatter:{},sidebar:"userGuide",previous:{title:"Debug Files",permalink:"/docs/category/debug-files"},next:{title:"Review metadata",permalink:"/docs/user-guide/debug-files/review"}},a={},c=[];function g(e){const t={h1:"h1",p:"p",...(0,n.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.h1,{id:"list-debug-files",children:"List debug files"}),"\n",(0,s.jsx)(t.p,{children:"List all uploaded debug files oragiazed by app."}),"\n","\n","\n",(0,s.jsx)(d.Z,{alt:"",sources:{light:(0,r.Z)("/img/5.0.0/debug-file-index-light.png"),dark:(0,r.Z)("/img/5.0.0/debug-file-index-dark.png")}})]})}function f(e={}){const{wrapper:t}={...(0,n.a)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(g,{...e})}):g(e)}},1151:(e,t,i)=>{i.d(t,{Z:()=>o,a:()=>r});var s=i(7294);const n={},d=s.createContext(n);function r(e){const t=s.useContext(d);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function o(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:r(e.components),s.createElement(d.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/34f9a893.f0282f47.js b/assets/js/34f9a893.f0282f47.js new file mode 100644 index 000000000..a8e9f1cb3 --- /dev/null +++ b/assets/js/34f9a893.f0282f47.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[3178],{2290:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>u,contentTitle:()=>c,default:()=>m,frontMatter:()=>p,metadata:()=>i,toc:()=>d});var s=n(5893),r=n(1151),a=n(9965),o=n(4996);const p={},c="Create an App",i={id:"user-guide/apps/create",title:"Create an App",description:"{n.d(t,{Z:()=>p,a:()=>o});var s=n(7294);const r={},a=s.createContext(r);function o(e){const t=s.useContext(a);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function p(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:o(e.components),s.createElement(a.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/36384478.715cd756.js b/assets/js/36384478.715cd756.js new file mode 100644 index 000000000..6400b0938 --- /dev/null +++ b/assets/js/36384478.715cd756.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[485],{3408:(e,o,t)=>{t.r(o),t.d(o,{assets:()=>i,contentTitle:()=>d,default:()=>u,frontMatter:()=>r,metadata:()=>c,toc:()=>l});var n=t(5893),s=t(1151);const r={sidebar_label:"Source code"},d="Source code",c={id:"self-hosted/deployment/source-code",title:"Source code",description:"It had been rewrite to Contributing Guide.",source:"@site/versioned_docs/version-5.2.0/self-hosted/deployment/source-code.md",sourceDirName:"self-hosted/deployment",slug:"/self-hosted/deployment/source-code",permalink:"/docs/self-hosted/deployment/source-code",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.2.0/self-hosted/deployment/source-code.md",tags:[],version:"5.2.0",frontMatter:{sidebar_label:"Source code"},sidebar:"selfHosted",previous:{title:"Nomad",permalink:"/docs/self-hosted/deployment/nomad"},next:{title:"Reverse Proxies",permalink:"/docs/self-hosted/reverse-proxies"}},i={},l=[];function a(e){const o={a:"a",h1:"h1",p:"p",...(0,s.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(o.h1,{id:"source-code",children:"Source code"}),"\n",(0,n.jsxs)(o.p,{children:["It had been rewrite to ",(0,n.jsx)(o.a,{href:"/docs/contributing-guide",children:"Contributing Guide"}),"."]})]})}function u(e={}){const{wrapper:o}={...(0,s.a)(),...e.components};return o?(0,n.jsx)(o,{...e,children:(0,n.jsx)(a,{...e})}):a(e)}},1151:(e,o,t)=>{t.d(o,{Z:()=>c,a:()=>d});var n=t(7294);const s={},r=n.createContext(s);function d(e){const o=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function c(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:d(e.components),n.createElement(r.Provider,{value:o},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/36eb88d2.16a85946.js b/assets/js/36eb88d2.16a85946.js new file mode 100644 index 000000000..dd2ae91f3 --- /dev/null +++ b/assets/js/36eb88d2.16a85946.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[3205],{6831:(e,d,s)=>{s.r(d),s.d(d,{assets:()=>c,contentTitle:()=>l,default:()=>h,frontMatter:()=>t,metadata:()=>r,toc:()=>o});var i=s(5893),n=s(1151);const t={},l="APIs",r={id:"developer-guide/api",title:"APIs",description:"Use the Zealot APIs to view, upload, download the build of app or debug file.",source:"@site/versioned_docs/version-5.1.0/developer-guide/api.md",sourceDirName:"developer-guide",slug:"/developer-guide/api",permalink:"/docs/5.1.0/developer-guide/api",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.1.0/developer-guide/api.md",tags:[],version:"5.1.0",frontMatter:{},sidebar:"developerGuide",previous:{title:"zealot_sync_devices",permalink:"/docs/5.1.0/developer-guide/fastlane/zealot_sync_devices"},next:{title:"Apps",permalink:"/docs/5.1.0/developer-guide/api/apps"}},c={},o=[{value:"Authentication",id:"authentication",level:2},{value:"Version",id:"version",level:2},{value:"Apps",id:"apps",level:2},{value:"Debug files",id:"debug-files",level:2}];function a(e){const d={a:"a",blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",p:"p",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,n.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(d.h1,{id:"apis",children:"APIs"}),"\n",(0,i.jsx)(d.p,{children:"Use the Zealot APIs to view, upload, download the build of app or debug file."}),"\n",(0,i.jsx)(d.h2,{id:"authentication",children:"Authentication"}),"\n",(0,i.jsxs)(d.p,{children:["Requests currently only support query authentication for User Token, found in ",(0,i.jsx)(d.code,{children:"API - Key"})," at the bottom of the login user details page."]}),"\n",(0,i.jsxs)(d.blockquote,{children:["\n",(0,i.jsxs)(d.p,{children:["example : ",(0,i.jsx)(d.code,{children:"https://YOUR_ZEALOT_URL/api?token=YOUR_TOKEN"})]}),"\n"]}),"\n",(0,i.jsx)(d.h2,{id:"version",children:"Version"}),"\n",(0,i.jsxs)(d.p,{children:["The current version is ",(0,i.jsx)(d.code,{children:"v1"}),", the APIs does not need to explicitly pass the version parameter,\nand the GraphGL interface is being developed gradually."]}),"\n",(0,i.jsx)(d.h2,{id:"apps",children:"Apps"}),"\n",(0,i.jsxs)(d.table,{children:[(0,i.jsx)(d.thead,{children:(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.th,{children:"Resource"}),(0,i.jsx)(d.th,{children:"Available endpoints"})]})}),(0,i.jsxs)(d.tbody,{children:[(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"Upload an App"}),(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"/api/apps/upload"})})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"List Apps"}),(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"/api/apps"})})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"Get an App by id"}),(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"/api/apps/:id"})})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"List verions from an App"}),(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"/api/apps/versions"})})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"Get the latest Release from an App"}),(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"/api/apps/latest"})})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"Check an Release from App exists"}),(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"/api/apps/version_exist"})})]})]})]}),"\n",(0,i.jsxs)(d.blockquote,{children:["\n",(0,i.jsxs)(d.p,{children:["Full APIs to check ",(0,i.jsx)(d.a,{href:"/docs/developer-guide/api/apps",children:"api/apps"})," page."]}),"\n"]}),"\n",(0,i.jsx)(d.h2,{id:"debug-files",children:"Debug files"}),"\n",(0,i.jsxs)(d.table,{children:[(0,i.jsx)(d.thead,{children:(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.th,{children:"Resource"}),(0,i.jsx)(d.th,{children:"Available endpoints"})]})}),(0,i.jsxs)(d.tbody,{children:[(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"Upload a debug file"}),(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"/api/debug_files/upload"})})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"Download a debug file by id"}),(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"/api/debug_files/download"})})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"List Debug files"}),(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"/api/debug_files"})})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"Get an debug file by id"}),(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"/api/debug_files/:id"})})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"Check a debug file exists by id"}),(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"/api/debug_files/version_exist"})})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"Update a debug file by id"}),(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"/api/debug_files/:id"})})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"Delete a debug file by id"}),(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"/api/debug_files/:id"})})]})]})]}),"\n",(0,i.jsxs)(d.blockquote,{children:["\n",(0,i.jsxs)(d.p,{children:["Full APIs to check ",(0,i.jsx)(d.a,{href:"/docs/developer-guide/api/debug_files",children:"api/debug_files"})," page."]}),"\n"]})]})}function h(e={}){const{wrapper:d}={...(0,n.a)(),...e.components};return d?(0,i.jsx)(d,{...e,children:(0,i.jsx)(a,{...e})}):a(e)}},1151:(e,d,s)=>{s.d(d,{Z:()=>r,a:()=>l});var i=s(7294);const n={},t=i.createContext(n);function l(e){const d=i.useContext(t);return i.useMemo((function(){return"function"==typeof e?e(d):{...d,...e}}),[d,e])}function r(e){let d;return d=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:l(e.components),i.createElement(t.Provider,{value:d},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/39967965.8adf4099.js b/assets/js/39967965.8adf4099.js new file mode 100644 index 000000000..92c23d77a --- /dev/null +++ b/assets/js/39967965.8adf4099.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[8189],{1062:e=>{e.exports=JSON.parse('{"title":"Debug Files","slug":"/category/debug-files","permalink":"/docs/5.1.0/category/debug-files","navigation":{"previous":{"title":"Uploaded a release","permalink":"/docs/5.1.0/user-guide/apps/upload"},"next":{"title":"List debug files","permalink":"/docs/5.1.0/user-guide/debug-files/"}}}')}}]); \ No newline at end of file diff --git a/assets/js/3f6a47b2.90265307.js b/assets/js/3f6a47b2.90265307.js new file mode 100644 index 000000000..acf403446 --- /dev/null +++ b/assets/js/3f6a47b2.90265307.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[4732],{6641:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>a,contentTitle:()=>u,default:()=>f,frontMatter:()=>o,metadata:()=>l,toc:()=>c});var s=i(5893),n=i(1151),d=i(9965),r=i(4996);const o={},u="List debug files",l={id:"user-guide/debug-files/index",title:"List debug files",description:"List all uploaded debug files oragiazed by app.",source:"@site/versioned_docs/version-5.2.0/user-guide/debug-files/index.mdx",sourceDirName:"user-guide/debug-files",slug:"/user-guide/debug-files/",permalink:"/docs/user-guide/debug-files/",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.2.0/user-guide/debug-files/index.mdx",tags:[],version:"5.2.0",frontMatter:{},sidebar:"userGuide",previous:{title:"Debug Files",permalink:"/docs/category/debug-files"},next:{title:"Review metadata",permalink:"/docs/user-guide/debug-files/review"}},a={},c=[];function g(e){const t={h1:"h1",p:"p",...(0,n.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.h1,{id:"list-debug-files",children:"List debug files"}),"\n",(0,s.jsx)(t.p,{children:"List all uploaded debug files oragiazed by app."}),"\n","\n","\n",(0,s.jsx)(d.Z,{alt:"",sources:{light:(0,r.Z)("/img/5.0.0/debug-file-index-light.png"),dark:(0,r.Z)("/img/5.0.0/debug-file-index-dark.png")}})]})}function f(e={}){const{wrapper:t}={...(0,n.a)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(g,{...e})}):g(e)}},1151:(e,t,i)=>{i.d(t,{Z:()=>o,a:()=>r});var s=i(7294);const n={},d=s.createContext(n);function r(e){const t=s.useContext(d);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function o(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:r(e.components),s.createElement(d.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/40b43bed.329f07c9.js b/assets/js/40b43bed.329f07c9.js new file mode 100644 index 000000000..ceb8da54a --- /dev/null +++ b/assets/js/40b43bed.329f07c9.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[443],{1450:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>i,contentTitle:()=>d,default:()=>p,frontMatter:()=>s,metadata:()=>l,toc:()=>a});var r=t(5893),o=t(1151);const s={sidebar_label:"Render"},d="Deploy Zealot to Render guide",l={id:"self-hosted/deployment/render",title:"Deploy Zealot to Render guide",description:"Zealot support a render blueprint named render.yaml to deploy on render.com.",source:"@site/versioned_docs/version-5.1.0/self-hosted/deployment/render.md",sourceDirName:"self-hosted/deployment",slug:"/self-hosted/deployment/render",permalink:"/docs/5.1.0/self-hosted/deployment/render",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.1.0/self-hosted/deployment/render.md",tags:[],version:"5.1.0",frontMatter:{sidebar_label:"Render"},sidebar:"selfHosted",previous:{title:"Railway",permalink:"/docs/5.1.0/self-hosted/deployment/railway"},next:{title:"Configuration",permalink:"/docs/5.1.0/category/configuration"}},i={},a=[{value:"Deploying on Render",id:"deploying-on-render",level:2},{value:"Install button",id:"install-button",level:3}];function c(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",img:"img",li:"li",p:"p",ul:"ul",...(0,o.a)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.h1,{id:"deploy-zealot-to-render-guide",children:"Deploy Zealot to Render guide"}),"\n",(0,r.jsxs)(n.p,{children:["Zealot support a render ",(0,r.jsx)(n.a,{href:"https://render.com/docs/blueprint-spec",children:"blueprint"})," named ",(0,r.jsx)(n.code,{children:"render.yaml"})," to deploy on ",(0,r.jsx)(n.a,{href:"https://render.com/",children:"render.com"}),"."]}),"\n",(0,r.jsx)(n.h2,{id:"deploying-on-render",children:"Deploying on Render"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["It uses the ",(0,r.jsx)(n.a,{href:"https://ghcr.io/tryzealot/zealot",children:"Zealot Docker image"}),"."]}),"\n",(0,r.jsxs)(n.li,{children:["It uses ",(0,r.jsx)(n.a,{href:"https://render.com/docs/disks",children:"Render Disks"})," for permanent SSD storage for uploaded files and content."]}),"\n",(0,r.jsxs)(n.li,{children:["It uses ",(0,r.jsx)(n.a,{href:"https://render.com/docs/databases",children:"PostgreSQL"})," as the backing database and ",(0,r.jsx)(n.a,{href:"https://render.com/docs/redis",children:"Redis"})," as cache service."]}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"install-button",children:"Install button"}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.a,{href:"https://render.com/deploy?repo=https://github.com/tryzealot/zealot",children:(0,r.jsx)(n.img,{src:"https://render.com/images/deploy-to-render-button.svg",alt:"Deploy to Render"})})})]})}function p(e={}){const{wrapper:n}={...(0,o.a)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(c,{...e})}):c(e)}},1151:(e,n,t)=>{t.d(n,{Z:()=>l,a:()=>d});var r=t(7294);const o={},s=r.createContext(o);function d(e){const n=r.useContext(s);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:d(e.components),r.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/00e0c5f0.ee23ec74.js b/assets/js/42e0a757.d89329d1.js similarity index 92% rename from assets/js/00e0c5f0.ee23ec74.js rename to assets/js/42e0a757.d89329d1.js index 1b3db33e8..d1f708f45 100644 --- a/assets/js/00e0c5f0.ee23ec74.js +++ b/assets/js/42e0a757.d89329d1.js @@ -1 +1 @@ -"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[9966],{1793:(e,s,t)=>{t.r(s),t.d(s,{assets:()=>l,contentTitle:()=>n,default:()=>u,frontMatter:()=>r,metadata:()=>i,toc:()=>d});var o=t(5893),a=t(1151);const r={},n="Data storages",i={id:"self-hosted/storage",title:"Data storages",description:"Here is a list of all the data storages required by the Zealot service,",source:"@site/versioned_docs/version-5.1.0/self-hosted/storage.md",sourceDirName:"self-hosted",slug:"/self-hosted/storage",permalink:"/docs/self-hosted/storage",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.1.0/self-hosted/storage.md",tags:[],version:"5.1.0",frontMatter:{},sidebar:"selfHosted",previous:{title:"Schedule Jobs",permalink:"/docs/self-hosted/configuration/schedule-jobs"}},l={},d=[{value:"Postgres",id:"postgres",level:2},{value:"Redis",id:"redis",level:2},{value:"File storage",id:"file-storage",level:2},{value:"Backup storage",id:"backup-storage",level:2}];function c(e){const s={code:"code",h1:"h1",h2:"h2",li:"li",p:"p",ul:"ul",...(0,a.a)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(s.h1,{id:"data-storages",children:"Data storages"}),"\n",(0,o.jsx)(s.p,{children:"Here is a list of all the data storages required by the Zealot service,\nfor those who are able to manually backup and restore data before better backup management tools are available."}),"\n",(0,o.jsx)(s.h2,{id:"postgres",children:"Postgres"}),"\n",(0,o.jsx)(s.p,{children:"This is used to store and manage all data related to Zealot, so it goes without saying."}),"\n",(0,o.jsx)(s.h2,{id:"redis",children:"Redis"}),"\n",(0,o.jsx)(s.p,{children:"Currently only the sidekiq asynchronous task service is using it to store some task status and statistics."}),"\n",(0,o.jsx)(s.h2,{id:"file-storage",children:"File storage"}),"\n",(0,o.jsxs)(s.p,{children:["The Zealot service relies on postgresql, redis and some other disk storage for uploaded application and debug files.\nIt is currently stored in the filesystem in the ",(0,o.jsx)(s.code,{children:"public/uploads"})," directory."]}),"\n",(0,o.jsxs)(s.ul,{children:["\n",(0,o.jsx)(s.li,{children:"apps The directory for uploading applications"}),"\n",(0,o.jsx)(s.li,{children:"debugs_files directory for uploading debug files"}),"\n"]}),"\n",(0,o.jsx)(s.h2,{id:"backup-storage",children:"Backup storage"}),"\n",(0,o.jsx)(s.p,{children:"The Zealot service currently supports command-generated backup data, which will contain\nthe database and binary packages of the uploaded apps and debug files."}),"\n",(0,o.jsxs)(s.p,{children:["The backup data is currently stored in the file system in the ",(0,o.jsx)(s.code,{children:"public/backup"})," directory."]})]})}function u(e={}){const{wrapper:s}={...(0,a.a)(),...e.components};return s?(0,o.jsx)(s,{...e,children:(0,o.jsx)(c,{...e})}):c(e)}},1151:(e,s,t)=>{t.d(s,{Z:()=>i,a:()=>n});var o=t(7294);const a={},r=o.createContext(a);function n(e){const s=o.useContext(r);return o.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function i(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:n(e.components),o.createElement(r.Provider,{value:s},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[7797],{3872:(e,s,t)=>{t.r(s),t.d(s,{assets:()=>l,contentTitle:()=>n,default:()=>u,frontMatter:()=>r,metadata:()=>i,toc:()=>d});var o=t(5893),a=t(1151);const r={},n="Data storages",i={id:"self-hosted/storage",title:"Data storages",description:"Here is a list of all the data storages required by the Zealot service,",source:"@site/versioned_docs/version-5.2.0/self-hosted/storage.md",sourceDirName:"self-hosted",slug:"/self-hosted/storage",permalink:"/docs/self-hosted/storage",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.2.0/self-hosted/storage.md",tags:[],version:"5.2.0",frontMatter:{},sidebar:"selfHosted",previous:{title:"Schedule Jobs",permalink:"/docs/self-hosted/configuration/schedule-jobs"}},l={},d=[{value:"Postgres",id:"postgres",level:2},{value:"Redis",id:"redis",level:2},{value:"File storage",id:"file-storage",level:2},{value:"Backup storage",id:"backup-storage",level:2}];function c(e){const s={code:"code",h1:"h1",h2:"h2",li:"li",p:"p",ul:"ul",...(0,a.a)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(s.h1,{id:"data-storages",children:"Data storages"}),"\n",(0,o.jsx)(s.p,{children:"Here is a list of all the data storages required by the Zealot service,\nfor those who are able to manually backup and restore data before better backup management tools are available."}),"\n",(0,o.jsx)(s.h2,{id:"postgres",children:"Postgres"}),"\n",(0,o.jsx)(s.p,{children:"This is used to store and manage all data related to Zealot, so it goes without saying."}),"\n",(0,o.jsx)(s.h2,{id:"redis",children:"Redis"}),"\n",(0,o.jsx)(s.p,{children:"Currently only the sidekiq asynchronous task service is using it to store some task status and statistics."}),"\n",(0,o.jsx)(s.h2,{id:"file-storage",children:"File storage"}),"\n",(0,o.jsxs)(s.p,{children:["The Zealot service relies on postgresql, redis and some other disk storage for uploaded application and debug files.\nIt is currently stored in the filesystem in the ",(0,o.jsx)(s.code,{children:"public/uploads"})," directory."]}),"\n",(0,o.jsxs)(s.ul,{children:["\n",(0,o.jsx)(s.li,{children:"apps The directory for uploading applications"}),"\n",(0,o.jsx)(s.li,{children:"debugs_files directory for uploading debug files"}),"\n"]}),"\n",(0,o.jsx)(s.h2,{id:"backup-storage",children:"Backup storage"}),"\n",(0,o.jsx)(s.p,{children:"The Zealot service currently supports command-generated backup data, which will contain\nthe database and binary packages of the uploaded apps and debug files."}),"\n",(0,o.jsxs)(s.p,{children:["The backup data is currently stored in the file system in the ",(0,o.jsx)(s.code,{children:"public/backup"})," directory."]})]})}function u(e={}){const{wrapper:s}={...(0,a.a)(),...e.components};return s?(0,o.jsx)(s,{...e,children:(0,o.jsx)(c,{...e})}):c(e)}},1151:(e,s,t)=>{t.d(s,{Z:()=>i,a:()=>n});var o=t(7294);const a={},r=o.createContext(a);function n(e){const s=o.useContext(r);return o.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function i(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:n(e.components),o.createElement(r.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/d1780259.6dfcff56.js b/assets/js/43646140.b3fa593a.js similarity index 95% rename from assets/js/d1780259.6dfcff56.js rename to assets/js/43646140.b3fa593a.js index d4afff1f5..90f23dac5 100644 --- a/assets/js/d1780259.6dfcff56.js +++ b/assets/js/43646140.b3fa593a.js @@ -1 +1 @@ -"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[6490],{3566:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>r,contentTitle:()=>o,default:()=>u,frontMatter:()=>l,metadata:()=>s,toc:()=>d});var a=i(5893),t=i(1151);const l={},o="Best Practices",s={id:"user-guide/best_practices",title:"Best Practices",description:"Workflow",source:"@site/versioned_docs/version-5.1.0/user-guide/best_practices.md",sourceDirName:"user-guide",slug:"/user-guide/best_practices",permalink:"/docs/user-guide/best_practices",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.1.0/user-guide/best_practices.md",tags:[],version:"5.1.0",frontMatter:{},sidebar:"userGuide",previous:{title:"Database Analytics",permalink:"/docs/user-guide/administrator/monitoring/database-analytics"},next:{title:"Change Log",permalink:"/docs/user-guide/changelog"}},r={},d=[{value:"Workflow",id:"workflow",level:2},{value:"iOS and Android Apps",id:"ios-and-android-apps",level:3},{value:"Zealot SDKs",id:"zealot-sdks",level:4},{value:"Install fastlane",id:"install-fastlane",level:4},{value:"CI/CD Service",id:"cicd-service",level:3},{value:"Zealot Service",id:"zealot-service",level:3}];function c(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",li:"li",p:"p",pre:"pre",ul:"ul",...(0,t.a)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(n.h1,{id:"best-practices",children:"Best Practices"}),"\n",(0,a.jsx)(n.h2,{id:"workflow",children:"Workflow"}),"\n",(0,a.jsx)(n.h3,{id:"ios-and-android-apps",children:"iOS and Android Apps"}),"\n",(0,a.jsx)(n.h4,{id:"zealot-sdks",children:"Zealot SDKs"}),"\n",(0,a.jsx)(n.p,{children:"Integration with the Zealot SDK allows non-client development to automatically trigger new version checks, view change logs, and install functionality."}),"\n",(0,a.jsx)(n.h4,{id:"install-fastlane",children:"Install fastlane"}),"\n",(0,a.jsx)(n.p,{children:"In addition to the fastlane-plugin-zealot plugin, which is required to upload applications and debug files,\nit is highly recommended to install the following plug-ins in addition to fastlane."}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.a,{href:"https://github.com/icyleaf/fastlane-plugin-ci_changelog",children:"ci_changelog"})," | Support for multiple CI systems to automatically generate change history"]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.a,{href:"https://github.com/icyleaf/fastlane-plugin-update_jenkins_build",children:"update_jenkins_build"})," | Automatically Update Jenkins Build Description"]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.a,{href:"https://github.com/icyleaf/fastlane-plugin-humanable_build_number",children:"humanable_build_number"})," | Generate a build version number that is recognizable to development"]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.a,{href:"https://github.com/icyleaf/fastlane-plugin-app_info",children:"app_info"})," | View metadata about the application after successful packaging"]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.a,{href:"https://github.com/icyleaf/fastlane-plugin-ram_disk",children:"ram_disk"})," | Create in-memory virtual disks, mainly used to improve App build speed (consider if memory is large)"]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.a,{href:"https://github.com/icyleaf/fastlane-plugin-debug_file",children:"debug_file"})," | Automated search for iOS/macOS dSYM or Android Proguard (obfuscation) and packaging of Zip files"]}),"\n"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-ruby",children:"# Build and upload ipa to zealot service\nlane :upload_app do\n # Building the package file, using gym in iOS, gradle in Android\n gym\n\n # Uploading to Zealot\n zealot(\n endpoint: '...',\n token: '...',\n channel_key: '...'\n )\n\n # Uploading dSYM file to Zealot\n zealot_debug_file(\n scheme: 'AppName'\n )\nend\n\n# Build android package file and generate progguard then upload to zealot service\nlane :upload_debug_file do\n # Building the package file, using gym in iOS, gradle in Android\n gradle\n\n # Automated search for iOS/macOS dSYM or Android Proguard (obfuscation) and packaging of Zip files\n debug_file\n\n # Uploading to Zealot\n zealot(\n endpoint: '...',\n token: '...',\n channel_key: '...'\n )\n\n # Uploading Proguard file to Zealot\n zealot_debug_file(\n build_type: 'release',\n flavor: 'googleplay'\n )\nend\n"})}),"\n",(0,a.jsx)(n.h3,{id:"cicd-service",children:"CI/CD Service"}),"\n",(0,a.jsx)(n.p,{children:"For example, Jenkins, configure the project, set up the git hook to trigger packaging, nothing to say"}),"\n",(0,a.jsx)(n.h3,{id:"zealot-service",children:"Zealot Service"}),"\n",(0,a.jsx)(n.p,{children:"In addition to managing each uploaded application and debug file, each time an uploaded application is received,\na configured web hook is triggered to send a notification to the third-party service that a new version has been received,\nand for mobile clients that integrate with the Zealot SDK, they will receive a new version installation alert each time they open the app for the first time."})]})}function u(e={}){const{wrapper:n}={...(0,t.a)(),...e.components};return n?(0,a.jsx)(n,{...e,children:(0,a.jsx)(c,{...e})}):c(e)}},1151:(e,n,i)=>{i.d(n,{Z:()=>s,a:()=>o});var a=i(7294);const t={},l=a.createContext(t);function o(e){const n=a.useContext(l);return a.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function s(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:o(e.components),a.createElement(l.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[8176],{1474:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>r,contentTitle:()=>o,default:()=>u,frontMatter:()=>l,metadata:()=>s,toc:()=>d});var a=i(5893),t=i(1151);const l={},o="Best Practices",s={id:"user-guide/best_practices",title:"Best Practices",description:"Workflow",source:"@site/versioned_docs/version-5.2.0/user-guide/best_practices.md",sourceDirName:"user-guide",slug:"/user-guide/best_practices",permalink:"/docs/user-guide/best_practices",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.2.0/user-guide/best_practices.md",tags:[],version:"5.2.0",frontMatter:{},sidebar:"userGuide",previous:{title:"Database Analytics",permalink:"/docs/user-guide/administrator/monitoring/database-analytics"},next:{title:"Change Log",permalink:"/docs/user-guide/changelog"}},r={},d=[{value:"Workflow",id:"workflow",level:2},{value:"iOS and Android Apps",id:"ios-and-android-apps",level:3},{value:"Zealot SDKs",id:"zealot-sdks",level:4},{value:"Install fastlane",id:"install-fastlane",level:4},{value:"CI/CD Service",id:"cicd-service",level:3},{value:"Zealot Service",id:"zealot-service",level:3}];function c(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",li:"li",p:"p",pre:"pre",ul:"ul",...(0,t.a)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(n.h1,{id:"best-practices",children:"Best Practices"}),"\n",(0,a.jsx)(n.h2,{id:"workflow",children:"Workflow"}),"\n",(0,a.jsx)(n.h3,{id:"ios-and-android-apps",children:"iOS and Android Apps"}),"\n",(0,a.jsx)(n.h4,{id:"zealot-sdks",children:"Zealot SDKs"}),"\n",(0,a.jsx)(n.p,{children:"Integration with the Zealot SDK allows non-client development to automatically trigger new version checks, view change logs, and install functionality."}),"\n",(0,a.jsx)(n.h4,{id:"install-fastlane",children:"Install fastlane"}),"\n",(0,a.jsx)(n.p,{children:"In addition to the fastlane-plugin-zealot plugin, which is required to upload applications and debug files,\nit is highly recommended to install the following plug-ins in addition to fastlane."}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.a,{href:"https://github.com/icyleaf/fastlane-plugin-ci_changelog",children:"ci_changelog"})," | Support for multiple CI systems to automatically generate change history"]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.a,{href:"https://github.com/icyleaf/fastlane-plugin-update_jenkins_build",children:"update_jenkins_build"})," | Automatically Update Jenkins Build Description"]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.a,{href:"https://github.com/icyleaf/fastlane-plugin-humanable_build_number",children:"humanable_build_number"})," | Generate a build version number that is recognizable to development"]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.a,{href:"https://github.com/icyleaf/fastlane-plugin-app_info",children:"app_info"})," | View metadata about the application after successful packaging"]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.a,{href:"https://github.com/icyleaf/fastlane-plugin-ram_disk",children:"ram_disk"})," | Create in-memory virtual disks, mainly used to improve App build speed (consider if memory is large)"]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.a,{href:"https://github.com/icyleaf/fastlane-plugin-debug_file",children:"debug_file"})," | Automated search for iOS/macOS dSYM or Android Proguard (obfuscation) and packaging of Zip files"]}),"\n"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-ruby",children:"# Build and upload ipa to zealot service\nlane :upload_app do\n # Building the package file, using gym in iOS, gradle in Android\n gym\n\n # Uploading to Zealot\n zealot(\n endpoint: '...',\n token: '...',\n channel_key: '...'\n )\n\n # Uploading dSYM file to Zealot\n zealot_debug_file(\n scheme: 'AppName'\n )\nend\n\n# Build android package file and generate progguard then upload to zealot service\nlane :upload_debug_file do\n # Building the package file, using gym in iOS, gradle in Android\n gradle\n\n # Automated search for iOS/macOS dSYM or Android Proguard (obfuscation) and packaging of Zip files\n debug_file\n\n # Uploading to Zealot\n zealot(\n endpoint: '...',\n token: '...',\n channel_key: '...'\n )\n\n # Uploading Proguard file to Zealot\n zealot_debug_file(\n build_type: 'release',\n flavor: 'googleplay'\n )\nend\n"})}),"\n",(0,a.jsx)(n.h3,{id:"cicd-service",children:"CI/CD Service"}),"\n",(0,a.jsx)(n.p,{children:"For example, Jenkins, configure the project, set up the git hook to trigger packaging, nothing to say"}),"\n",(0,a.jsx)(n.h3,{id:"zealot-service",children:"Zealot Service"}),"\n",(0,a.jsx)(n.p,{children:"In addition to managing each uploaded application and debug file, each time an uploaded application is received,\na configured web hook is triggered to send a notification to the third-party service that a new version has been received,\nand for mobile clients that integrate with the Zealot SDK, they will receive a new version installation alert each time they open the app for the first time."})]})}function u(e={}){const{wrapper:n}={...(0,t.a)(),...e.components};return n?(0,a.jsx)(n,{...e,children:(0,a.jsx)(c,{...e})}):c(e)}},1151:(e,n,i)=>{i.d(n,{Z:()=>s,a:()=>o});var a=i(7294);const t={},l=a.createContext(t);function o(e){const n=a.useContext(l);return a.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function s(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:o(e.components),a.createElement(l.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/485d62e4.d59467f4.js b/assets/js/485d62e4.d59467f4.js new file mode 100644 index 000000000..7f0545db5 --- /dev/null +++ b/assets/js/485d62e4.d59467f4.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[9867],{9312:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>o,contentTitle:()=>u,default:()=>k,frontMatter:()=>c,metadata:()=>d,toc:()=>l});var i=a(5893),s=a(1151),n=a(9965),r=a(4996);const c={sidebar_label:"Backup"},u="Backup Schedule",d={id:"user-guide/administrator/backup",title:"Backup Schedule",description:"Backup list",source:"@site/versioned_docs/version-5.2.0/user-guide/administrator/backup.mdx",sourceDirName:"user-guide/administrator",slug:"/user-guide/administrator/backup",permalink:"/docs/user-guide/administrator/backup",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.2.0/user-guide/administrator/backup.mdx",tags:[],version:"5.2.0",frontMatter:{sidebar_label:"Backup"},sidebar:"userGuide",previous:{title:"Permissions",permalink:"/docs/user-guide/administrator/permissions"},next:{title:"Settings",permalink:"/docs/user-guide/administrator/settings"}},o={},l=[{value:"Backup list",id:"backup-list",level:2},{value:"Backup detail",id:"backup-detail",level:2},{value:"Create a backup",id:"create-a-backup",level:2}];function p(e){const t={h1:"h1",h2:"h2",...(0,s.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.h1,{id:"backup-schedule",children:"Backup Schedule"}),"\n","\n","\n",(0,i.jsx)(t.h2,{id:"backup-list",children:"Backup list"}),"\n",(0,i.jsx)(n.Z,{alt:"",sources:{light:(0,r.Z)("/img/5.0.0/backups-light.png"),dark:(0,r.Z)("/img/5.0.0/backups-dark.png")}}),"\n",(0,i.jsx)(t.h2,{id:"backup-detail",children:"Backup detail"}),"\n",(0,i.jsx)(n.Z,{alt:"",sources:{light:(0,r.Z)("/img/5.0.0/backup-detail-light.png"),dark:(0,r.Z)("/img/5.0.0/backup-detail-dark.png")}}),"\n",(0,i.jsx)(t.h2,{id:"create-a-backup",children:"Create a backup"}),"\n",(0,i.jsx)(n.Z,{alt:"",sources:{light:(0,r.Z)("/img/5.0.0/backups-create-light.png"),dark:(0,r.Z)("/img/5.0.0/backups-create-dark.png")}})]})}function k(e={}){const{wrapper:t}={...(0,s.a)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(p,{...e})}):p(e)}},1151:(e,t,a)=>{a.d(t,{Z:()=>c,a:()=>r});var i=a(7294);const s={},n=i.createContext(s);function r(e){const t=i.useContext(n);return i.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),i.createElement(n.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/15df074e.6cd6f3e4.js b/assets/js/48b93325.0ea0942f.js similarity index 89% rename from assets/js/15df074e.6cd6f3e4.js rename to assets/js/48b93325.0ea0942f.js index b83eba8c2..59da3c50d 100644 --- a/assets/js/15df074e.6cd6f3e4.js +++ b/assets/js/48b93325.0ea0942f.js @@ -1 +1 @@ -"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[5497],{4820:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>a,default:()=>m,frontMatter:()=>d,metadata:()=>l,toc:()=>u});var o=n(5893),i=n(1151),r=n(9965),s=n(4996);const d={sidebar_label:"Teardown App"},a="Teardown App view itself metadata",l={id:"user-guide/toolkits/teardown",title:"Teardown App view itself metadata",description:"Android",source:"@site/versioned_docs/version-5.1.0/user-guide/toolkits/teardown.mdx",sourceDirName:"user-guide/toolkits",slug:"/user-guide/toolkits/teardown",permalink:"/docs/user-guide/toolkits/teardown",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.1.0/user-guide/toolkits/teardown.mdx",tags:[],version:"5.1.0",frontMatter:{sidebar_label:"Teardown App"},sidebar:"userGuide",previous:{title:"Toolkits",permalink:"/docs/category/toolkits"},next:{title:"Fetch UDID",permalink:"/docs/user-guide/toolkits/fetch-udid"}},c={},u=[{value:"Android",id:"android",level:2},{value:"iOS",id:"ios",level:2}];function p(e){const t={code:"code",h1:"h1",h2:"h2",p:"p",...(0,i.a)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.h1,{id:"teardown-app-view-itself-metadata",children:"Teardown App view itself metadata"}),"\n","\n","\n",(0,o.jsx)(t.h2,{id:"android",children:"Android"}),"\n",(0,o.jsxs)(t.p,{children:["Retrieve ",(0,o.jsx)(t.code,{children:"AndroidManifest.xml"})," metadata, v1 to v3 signatures informations."]}),"\n",(0,o.jsx)(r.Z,{alt:"",sources:{light:(0,s.Z)("/img/5.0.0/teardown-android-light.png"),dark:(0,s.Z)("/img/5.0.0/teardown-android-dark.png")}}),"\n",(0,o.jsx)(t.h2,{id:"ios",children:"iOS"}),"\n",(0,o.jsxs)(t.p,{children:["Retrieve ",(0,o.jsx)(t.code,{children:"Info.plist"})," metadata, Frameworks and signatures informations."]}),"\n",(0,o.jsx)(r.Z,{alt:"",sources:{light:(0,s.Z)("/img/5.0.0/teardown-ios-light.png"),dark:(0,s.Z)("/img/5.0.0/teardown-ios-dark.png")}})]})}function m(e={}){const{wrapper:t}={...(0,i.a)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(p,{...e})}):p(e)}},1151:(e,t,n)=>{n.d(t,{Z:()=>d,a:()=>s});var o=n(7294);const i={},r=o.createContext(i);function s(e){const t=o.useContext(r);return o.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function d(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:s(e.components),o.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[5749],{2780:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>a,default:()=>m,frontMatter:()=>d,metadata:()=>l,toc:()=>u});var o=n(5893),i=n(1151),r=n(9965),s=n(4996);const d={sidebar_label:"Teardown App"},a="Teardown App view itself metadata",l={id:"user-guide/toolkits/teardown",title:"Teardown App view itself metadata",description:"Android",source:"@site/versioned_docs/version-5.2.0/user-guide/toolkits/teardown.mdx",sourceDirName:"user-guide/toolkits",slug:"/user-guide/toolkits/teardown",permalink:"/docs/user-guide/toolkits/teardown",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.2.0/user-guide/toolkits/teardown.mdx",tags:[],version:"5.2.0",frontMatter:{sidebar_label:"Teardown App"},sidebar:"userGuide",previous:{title:"Toolkits",permalink:"/docs/category/toolkits"},next:{title:"Fetch UDID",permalink:"/docs/user-guide/toolkits/fetch-udid"}},c={},u=[{value:"Android",id:"android",level:2},{value:"iOS",id:"ios",level:2}];function p(e){const t={code:"code",h1:"h1",h2:"h2",p:"p",...(0,i.a)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.h1,{id:"teardown-app-view-itself-metadata",children:"Teardown App view itself metadata"}),"\n","\n","\n",(0,o.jsx)(t.h2,{id:"android",children:"Android"}),"\n",(0,o.jsxs)(t.p,{children:["Retrieve ",(0,o.jsx)(t.code,{children:"AndroidManifest.xml"})," metadata, v1 to v3 signatures informations."]}),"\n",(0,o.jsx)(r.Z,{alt:"",sources:{light:(0,s.Z)("/img/5.0.0/teardown-android-light.png"),dark:(0,s.Z)("/img/5.0.0/teardown-android-dark.png")}}),"\n",(0,o.jsx)(t.h2,{id:"ios",children:"iOS"}),"\n",(0,o.jsxs)(t.p,{children:["Retrieve ",(0,o.jsx)(t.code,{children:"Info.plist"})," metadata, Frameworks and signatures informations."]}),"\n",(0,o.jsx)(r.Z,{alt:"",sources:{light:(0,s.Z)("/img/5.0.0/teardown-ios-light.png"),dark:(0,s.Z)("/img/5.0.0/teardown-ios-dark.png")}})]})}function m(e={}){const{wrapper:t}={...(0,i.a)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(p,{...e})}):p(e)}},1151:(e,t,n)=>{n.d(t,{Z:()=>d,a:()=>s});var o=n(7294);const i={},r=o.createContext(i);function s(e){const t=o.useContext(r);return o.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function d(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:s(e.components),o.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/49d6ba58.cb83f9e8.js b/assets/js/49d6ba58.cb83f9e8.js deleted file mode 100644 index 0592bde62..000000000 --- a/assets/js/49d6ba58.cb83f9e8.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[9146],{8910:(e,i,n)=>{n.r(i),n.d(i,{assets:()=>o,contentTitle:()=>t,default:()=>h,frontMatter:()=>l,metadata:()=>r,toc:()=>a});var s=n(5893),d=n(1151);const l={},t="Change Log",r={id:"user-guide/changelog",title:"Change Log",description:"5.1.0 (2023-12-07)",source:"@site/versioned_docs/version-5.1.0/user-guide/changelog.md",sourceDirName:"user-guide",slug:"/user-guide/changelog",permalink:"/docs/user-guide/changelog",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.1.0/user-guide/changelog.md",tags:[],version:"5.1.0",frontMatter:{},sidebar:"userGuide",previous:{title:"Best Practices",permalink:"/docs/user-guide/best_practices"},next:{title:"Q&A",permalink:"/docs/user-guide/qa"}},o={},a=[{value:"5.1.0 (2023-12-07)",id:"510-2023-12-07",level:2},{value:"Changed",id:"changed",level:4},{value:"Added",id:"added",level:4},{value:"Fixed",id:"fixed",level:4},{value:"5.0.0 (2023-09-06)",id:"500-2023-09-06",level:2},{value:"Changed",id:"changed-1",level:4},{value:"Added",id:"added-1",level:4},{value:"Fixed",id:"fixed-1",level:4},{value:"4.7.1 (2023-03-10)",id:"471-2023-03-10",level:2},{value:"Changed",id:"changed-2",level:4},{value:"Fixed",id:"fixed-2",level:4},{value:"Added",id:"added-2",level:4},{value:"4.7.0 (2023-03-03)",id:"470-2023-03-03",level:2},{value:"Changed",id:"changed-3",level:4},{value:"Added",id:"added-3",level:4},{value:"Fixed",id:"fixed-3",level:4},{value:"4.6.0 (2023-01-17)",id:"460-2023-01-17",level:2},{value:"Fixed",id:"fixed-4",level:4},{value:"Added",id:"added-4",level:4},{value:"Changed",id:"changed-4",level:4},{value:"4.5.3 (2022-11-22)",id:"453-2022-11-22",level:2},{value:"Fixed",id:"fixed-5",level:4},{value:"Added",id:"added-5",level:4},{value:"4.5.2 (2022-11-01)",id:"452-2022-11-01",level:2},{value:"Fixed",id:"fixed-6",level:4},{value:"Added",id:"added-6",level:4},{value:"Changed",id:"changed-5",level:4},{value:"4.5.1 (2022-09-14)",id:"451-2022-09-14",level:2},{value:"Fixed",id:"fixed-7",level:4},{value:"4.5.0 (2022-08-19)",id:"450-2022-08-19",level:2},{value:"Added",id:"added-7",level:4},{value:"Changed",id:"changed-6",level:4},{value:"Fixed",id:"fixed-8",level:4},{value:"4.4.1 (2022-06-20)",id:"441-2022-06-20",level:2},{value:"Fixed",id:"fixed-9",level:4},{value:"4.4.0 (2022-06-09)",id:"440-2022-06-09",level:2},{value:"Changed",id:"changed-7",level:4},{value:"Added",id:"added-8",level:4},{value:"Fixed",id:"fixed-10",level:4},{value:"4.3.1 (2021-12-22)",id:"431-2021-12-22",level:2},{value:"Added",id:"added-9",level:4},{value:"Fixed",id:"fixed-11",level:4},{value:"4.3.0 (2021-12-08)",id:"430-2021-12-08",level:2},{value:"Changed",id:"changed-8",level:4},{value:"Added",id:"added-10",level:4},{value:"Fixed",id:"fixed-12",level:4},{value:"4.2.2 (2021-10-15)",id:"422-2021-10-15",level:2},{value:"Fixed",id:"fixed-13",level:4},{value:"4.2.1 (2021-09-14)",id:"421-2021-09-14",level:2},{value:"Changed",id:"changed-9",level:4},{value:"Fixed",id:"fixed-14",level:4},{value:"4.2.0 (2021-09-01)",id:"420-2021-09-01",level:2},{value:"Changed",id:"changed-10",level:4},{value:"Added",id:"added-11",level:4},{value:"Fixed",id:"fixed-15",level:4},{value:"4.1.0 (2021-07-17)",id:"410-2021-07-17",level:2},{value:"Changed",id:"changed-11",level:4},{value:"Added",id:"added-12",level:4},{value:"Fixed",id:"fixed-16",level:4},{value:"4.0.0 (2020-12-31)",id:"400-2020-12-31",level:2},{value:"Fixed",id:"fixed-17",level:4},{value:"4.0.0.rc2 (2020-12-25)",id:"400rc2-2020-12-25",level:2},{value:"Added",id:"added-13",level:4},{value:"Changed",id:"changed-12",level:4},{value:"Fixed",id:"fixed-18",level:4},{value:"4.0.0.rc1 (2020-10-29)",id:"400rc1-2020-10-29",level:2},{value:"Changed",id:"changed-13",level:4},{value:"Added",id:"added-14",level:4},{value:"Fixed",id:"fixed-19",level:4},{value:"4.0.0.beta4 (2020-05-07)",id:"400beta4-2020-05-07",level:2},{value:"Added",id:"added-15",level:4},{value:"Fixed",id:"fixed-20",level:4},{value:"Changed",id:"changed-14",level:4},{value:"4.0.0.beta3 (2020-01-16)",id:"400beta3-2020-01-16",level:2},{value:"Added",id:"added-16",level:4},{value:"Fixed",id:"fixed-21",level:4},{value:"Changed",id:"changed-15",level:4},{value:"4.0.0.beta2 (2020-01-10)",id:"400beta2-2020-01-10",level:2},{value:"Added",id:"added-17",level:4},{value:"Fixed",id:"fixed-22",level:4},{value:"4.0.0.beta1",id:"400beta1",level:2},{value:"Previous Version",id:"previous-version",level:2}];function c(e){const i={a:"a",code:"code",h1:"h1",h2:"h2",h4:"h4",li:"li",p:"p",strong:"strong",ul:"ul",...(0,d.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(i.h1,{id:"change-log",children:"Change Log"}),"\n",(0,s.jsx)(i.h2,{id:"510-2023-12-07",children:"5.1.0 (2023-12-07)"}),"\n",(0,s.jsxs)(i.p,{children:["Mainly functional fixes, with minor upgrades to new features. Full ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/compare/4.7.1...5.0.0",children:"commit changes"}),"."]}),"\n",(0,s.jsx)(i.h4,{id:"changed",children:"Changed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Docker"})," ",(0,s.jsx)(i.strong,{children:"Major Change"})," The minimum version of Redis dependencies has been updated from 5.x to 6.2+. It is recommended to use version 7.x. When upgrading, please manually modify the settings."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"added",children:"Added"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Docker"})," added Redis and PostgreSQL version checks; running below minimum versions may cause malfunction."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Docker"})," service initializes by creating databases during startup."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," enhanced validation conditions for JSON format settings on the settings page."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"fixed",children:"Fixed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," checks disk space upon upload to determine file existence."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixed debug file association with application versions."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," resolved issue where the application unpack details page wasn't displaying the list of testing devices."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," optimized display information on error pages for application versions."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," improved display for long package names of mobile device applications."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," optimized some page styles and the display of English language."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"API/Web"})," fixed issue where the Android app parsing icon in webp format failed to convert to png."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"API"})," resolved GraphQL user authentication."]}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"500-2023-09-06",children:"5.0.0 (2023-09-06)"}),"\n",(0,s.jsxs)(i.p,{children:["Any archived package of application supportted (e.g. ",(0,s.jsx)(i.code,{children:"Windows"})," or ",(0,s.jsx)(i.code,{children:"Linux"}),")). Full ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/compare/4.7.1...5.0.0",children:"commit changes"}),"."]}),"\n",(0,s.jsx)(i.h4,{id:"changed-1",children:"Changed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Docker"})," ",(0,s.jsx)(i.strong,{children:"Major Change"})," The minimum version of Redis dependencies has been updated from 5.x to 6.2+. It is recommended to use version 7.x. When upgrading, please manually modify the settings."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"added-1",children:"Added"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"}),"/",(0,s.jsx)(i.code,{children:"API"})," supports hosting of general applications (those that can be parsed automatically and those that cannot be parsed are skipped), and Windows and Linux platforms are added by default ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/1121",children:"#1121"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"}),"/",(0,s.jsx)(i.code,{children:"API"})," adds support for hosting Windows applications (uploading and displaying metadata parsing) ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/1124",children:"#1124"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," has a new debugging file page and adds support for parsing and hosting multiple dSYM debugging files ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/1127",children:"#1127"})," ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/1124",children:"#1124"})," ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/issues/961",children:"#961"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," supports unpacking v1, v2, and v3 signature information for Android applications ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/1124",children:"#1124"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," strengthens X509 certificate information for unpacking Android and iOS applications ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/1124",children:"#1124"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"}),' adds a "Reparse" function to update the metadata of old structure debugging files']}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," supports markdown format for change logs of uploaded application versions"]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"}),' settings page can configure the global "minimum number of items returned per page" and "maximum number of items"']}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," for iOS applications, the application version details page displays the expiration time information of the signing certificate and the logical restriction of installation failure due to expired signing certificate (can be downloaded)"]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," adds or updates JSON format verification to network hooks and settings pages."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," supports registering test devices to Apple developers with custom device names and editing/updating device names after creation."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," supports downloading private key certificates for Apple developers."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"fixed-1",children:"Fixed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue of being unable to delete unpacked applications"]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," optimizes the style of some pages"]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," corrects errors in the English language package (en language i18n)"]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the error page that appears when creating an empty application type"]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the 404 error page that appears when a file is not found."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"API"})," fixes the logic optimization of comparing build_version for retrieving the latest version of an application."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," optimizes the error handling for custom field format during application upload."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," optimizes the correct redirection for URL injection, empty application history versions, and unregistered devices."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," optimizes the display of error information for backup tasks."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," adds type detection for application types and debug files during application upload."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the error message of not preselecting the creation of a Distribution Certificate for Apple developers."]}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"471-2023-03-10",children:"4.7.1 (2023-03-10)"}),"\n",(0,s.jsx)(i.p,{children:"Support for parsing aab applications generated by the latest Android aapt2 build tool, full [commit changes][4.7.1]."}),"\n",(0,s.jsx)(i.h4,{id:"changed-2",children:"Changed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Docker"})," ",(0,s.jsx)(i.strong,{children:"Major Change"})," The minimum version of Redis dependencies has been updated from 5.x to 6.2+. It is recommended to use version 7.x. When upgrading, please manually modify the settings."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"fixed-2",children:"Fixed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," upgrades to the latest appt2 model to avoid exceptions when parsing aab files."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," implements duplicate processing for parsing exceptions."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"added-2",children:"Added"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," adds application types to the details page of unpacked Android applications."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," adjusts the original page after editing an application channel."]}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"470-2023-03-03",children:"4.7.0 (2023-03-03)"}),"\n",(0,s.jsxs)(i.p,{children:[(0,s.jsx)(i.strong,{children:"Major Change"})," The minimum version of Redis dependencies has been updated from 5.x to 6.2+. Full ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/compare/4.6.0...4.7.0",children:"commit changes"}),"."]}),"\n",(0,s.jsx)(i.h4,{id:"changed-3",children:"Changed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Docker"})," ",(0,s.jsx)(i.strong,{children:"Major Change"})," The minimum version of Redis dependencies has been updated from 5.x to 6.2+. It is recommended to use version 7.x. When upgrading, please manually modify the settings."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"added-3",children:"Added"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"}),' adds a control switch for "New Upload Version Prompt Window" to application types. ',(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/1058",children:"#1058"})," Thanks to ",(0,s.jsx)(i.a,{href:"https://github.com/softwind0214",children:"softwind0214"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," allows clicking on the application icon on the application list page to jump to the application details page."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," adds the display of the version number of dependent services to the environment information."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," adds support for displaying nightly build versions in the version number."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"fixed-3",children:"Fixed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," downgrades Ruby version to 3.0 temporarily to solve the iOS application parsing crash caused by the high version. See ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/issues/1070",children:"#1070"})," for details."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the display order of applications/types/channels, which is now fixed as ascending order of creation time."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where there is no confirmation prompt when a user logs out."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where the main historical version of an application cannot be deleted."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," improves the style of multiple pages."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," no longer displays Javascript debugger logs in production environments."]}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"460-2023-01-17",children:"4.6.0 (2023-01-17)"}),"\n",(0,s.jsxs)(i.p,{children:["The runtime environment has been upgraded to Ruby 3.2 and now supports arm64 platforms. Full ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/compare/4.5.3...4.6.0",children:"commit changes"}),"."]}),"\n",(0,s.jsx)(i.h4,{id:"fixed-4",children:"Fixed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," captures the issue of creating an application channel with an empty name. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/issues/968",children:"#968"})," Thanks to ",(0,s.jsx)(i.a,{href:"https://github.com/congpeijun",children:"congpeijun"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," improves the logic for backup files that do not exist on disk. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/issues/995",children:"#995"})]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"added-4",children:"Added"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Docker"})," supports arm64/v8 and armv7 arch. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/970",children:"#970"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," Adopted a new 50x error page."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"changed-4",children:"Changed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," upgrades the Ruby version to 3.2 in development environments, and devcontainers and containers now have the YJIT feature enabled by default. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/1011",children:"#1011"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"API"})," updates the data structure of the debug file return and changes the status code from 204 to 200."]}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"453-2022-11-22",children:"4.5.3 (2022-11-22)"}),"\n",(0,s.jsxs)(i.p,{children:["Full ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/compare/4.5.2...4.5.3",children:"commit changes"}),"."]}),"\n",(0,s.jsx)(i.h4,{id:"fixed-5",children:"Fixed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," Fixes the issue where third-party login cannot be redirected. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/issues/949",children:"#949"})," Thanks to ",(0,s.jsx)(i.a,{href:"https://github.com/softwind0214",children:"softwind0214"})]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"added-5",children:"Added"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Docker"})," Adds a new environment variable to disable the request protection of WebSocket (ActionCable) requests (experimental). ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/950",children:"#950"})]}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"452-2022-11-01",children:"4.5.2 (2022-11-01)"}),"\n",(0,s.jsxs)(i.p,{children:["Full ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/compare/4.5.1...4.5.2",children:"commit changes"}),"."]}),"\n",(0,s.jsx)(i.h4,{id:"fixed-6",children:"Fixed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where registering a test device is abnormal. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/issues/935",children:"#935"})," Thanks to ",(0,s.jsx)(i.a,{href:"https://github.com/ycy0430",children:"ycy0430"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," adapts the QR code to support dark mode."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," corrects the English language pack."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"added-6",children:"Added"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"WebHook"})," Income webhook body structure adds the ",(0,s.jsx)(i.code,{children:"username"})," and ",(0,s.jsx)(i.code,{children:"email"})," fields. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/issues/934",children:"#934"})," Thanks to ",(0,s.jsx)(i.a,{href:"https://github.com/rkonfj",children:"rkonfj"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Docker"})," The ",(0,s.jsx)(i.code,{children:"SIDEKIQ_CONCURRENCY"})," environment variable is now supported to set the concurrency of background tasks, with a default value of 5."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"changed-5",children:"Changed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Docker"})," reduces security risks by changing the Web service, which includes puma and pumacontrolserver, to listen on ",(0,s.jsx)(i.code,{children:"127.0.0.1"}),"."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," optimizes the wording of the iOS device UDID profile."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," updates the text at the bottom of the page. Thanks to Rails and the AdminLTE open source project!"]}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"451-2022-09-14",children:"4.5.1 (2022-09-14)"}),"\n",(0,s.jsxs)(i.p,{children:["Full ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/compare/4.5.0...4.5.1",children:"commit changes"})]}),"\n",(0,s.jsx)(i.h4,{id:"fixed-7",children:"Fixed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," Fixes the issue where the application unpacking results in parsing errors."]}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"450-2022-08-19",children:"4.5.0 (2022-08-19)"}),"\n",(0,s.jsxs)(i.p,{children:["Supports the \ud83c\udf11 dark mode and managing the test devices of an \ud83d\udc68\ud83c\udffb\u200d\ud83d\udd27 Apple developer account! Full ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/compare/4.4.1...4.5.0",children:"commit changes"}),"."]}),"\n",(0,s.jsx)(i.h4,{id:"added-7",children:"Added"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," supports dark mode. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/816",children:"#816"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," adds Apple developer management for registering test devices. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/817",children:"#817"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," adds data backup management. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/835",children:"#835"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," completes the monitoring of dependent services in the management panel. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/issues/586",children:"#586"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"API"})," adds three fields, ",(0,s.jsx)(i.code,{children:"platform"}),", ",(0,s.jsx)(i.code,{children:"device_type"}),", and ",(0,s.jsx)(i.code,{children:"custom_fields"}),", to the release dictionary."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"changed-6",children:"Changed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," ",(0,s.jsx)(i.strong,{children:"Incompatible change"})," Google Analytics forces an upgrade to version 4, and previous settings need to be reconfigured to take effect. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/815",children:"#815"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"CLI"})," ",(0,s.jsx)(i.strong,{children:"Incompatible change"})," The data backup and restore functionality is no longer available due to changes in the structure. Please use the data backup function in the admin panel instead."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," adjusts the display of device UDID acquisition, iOS version installation and download based on the device, no longer displaying all functions."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," removes the page statistics function in the admin panel. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/814",children:"#814"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," migrates the front-end technology stack from webpacker to esbuild + sass, and from Turbolinks to Stimulus, bringing a better front-end interaction experience. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/829",children:"#829"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," due to the complexity of editing application types and channels, only the application name can be modified."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"fixed-8",children:"Fixed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the error of selecting a channel that does not exist under an application type. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/issues/795",children:"#795"})," Thanks to ",(0,s.jsx)(i.a,{href:"https://github.com/tasselsd",children:"tasselsd"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"API"})," fixes the Android address return error. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/issues/813",children:"#813"})," Thanks to ",(0,s.jsx)(i.a,{href:"https://github.com/denymz",children:"denymz"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"}),"/",(0,s.jsx)(i.code,{children:"API"})," fixes the exception caused by some parameters being empty in aab parsing. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/fastlane-plugin-zealot/issues/9",children:"tryzealot/fastlane-plugin-zealot#9"})," Thanks to ",(0,s.jsx)(i.a,{href:"https://github.com/tasselsd",children:"tasselsd"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue of abnormal generation of demo data during the first initialization of the project. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/issues/821",children:"#821"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"API"})," fixes the issue of abnormal data when checking the latest version of the application. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/issues/856",children:"#856"})," Thanks to ",(0,s.jsx)(i.a,{href:"https://github.com/denymz",children:"denymz"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue of an error being thrown due to abnormal data in the associated network hook when viewing the details of an application channel."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," corrects many spelling errors in the English language pack."]}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"441-2022-06-20",children:"4.4.1 (2022-06-20)"}),"\n",(0,s.jsxs)(i.p,{children:["Full ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/compare/4.4.0...4.4.1",children:"commit changes"})]}),"\n",(0,s.jsx)(i.h4,{id:"fixed-9",children:"Fixed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"WebHook"})," fixes the issue where an error is thrown after a successful trigger. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/issues/792",children:"#792"})," Thanks to ",(0,s.jsx)(i.a,{href:"https://github.com/tasselsd",children:"tasselsd"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Docker"})," compatible with Caddy 2.5.0 for proxying from https to http. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/790",children:"#790"})," Thanks to ",(0,s.jsx)(i.a,{href:"https://github.com/VisionBao",children:"VisionBao"})," ",(0,s.jsx)(i.a,{href:"https://github.com/songge1209",children:"songge1209"})]}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"440-2022-06-09",children:"4.4.0 (2022-06-09)"}),"\n",(0,s.jsxs)(i.p,{children:["Full ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/compare/4.3.1...4.4.0",children:"commit changes"}),"."]}),"\n",(0,s.jsx)(i.h4,{id:"changed-7",children:"Changed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," adds filtering by version, branch, and packaging type to the list display for users who are not logged in and have not enabled guest mode, in addition to viewing application version details."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," upgrades the runtime environment to Ruby 3.0 and the service framework to Rails 7.0."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," is now compatible with the macOS M1 chip."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"added-8",children:"Added"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," simplifies and standardizes some application links to facilitate sharing. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/666",children:"#666"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," completes some missing permission check pages."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"fixed-10",children:"Fixed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Job"})," fixes the issue of abnormal URL Schemes when parsing iOS files."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where service logs are not output to the terminal console."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," adds exception handling for processing debug files uploaded when they are deleted during parsing or cannot be found for other reasons."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," adapts the UI for ultra-wide screens."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes security vulnerabilities in third-party login dependencies."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"API"})," fixes the issue where uploading Android without channel_key results in an exception. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/issues/779",children:"#779"})," Thanks to ",(0,s.jsx)(i.a,{href:"https://github.com/likfe",children:"likfe"})]}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"431-2021-12-22",children:"4.3.1 (2021-12-22)"}),"\n",(0,s.jsxs)(i.p,{children:["Full ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/compare/4.3.0...4.3.1",children:"commit changes"}),"."]}),"\n",(0,s.jsx)(i.h4,{id:"added-9",children:"Added"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," after updating the setting, the original default value can be restored."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," supports parsing and displaying app links (distinguishing between deep links and URL schemes) for Android in application unpacking."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," strengthens the visual effect of the open and closed status of the setting page."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"fixed-11",children:"Fixed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue of asynchronous task methods in demo mode."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where selected application types and channels cannot be checked when creating and editing an application."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where it is not possible to navigate to the environment page."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where aab parsing fails when there are no intent filters."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," adds error handling for unchecking all application types and channels when updating an application."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where the loading strategy causes all third-party logins to be unavailable."]}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"430-2021-12-08",children:"4.3.0 (2021-12-08)"}),"\n",(0,s.jsxs)(i.p,{children:["Supports parsing of the aab format, adds support for multiple languages. Full ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/compare/4.2.2...4.3.0",children:"commit changes"})]}),"\n",(0,s.jsx)(i.h4,{id:"changed-8",children:"Changed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," uses the default prompt structure as the data structure for network hooks, instead of a strange structure."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," no longer provides parameter changes for third-party login authorization on the settings page (requires service restart)."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"API"})," the upload application interface and version details return the ",(0,s.jsx)(i.code,{children:"text_changelog"})," field in the response body. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/commit/650f1ffd3731f6a1f4cc703430be1b1b6f5d1cee",children:"650f1ffd"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"API"})," renames the ",(0,s.jsx)(i.code,{children:"changelog_list"})," field in the response body to ",(0,s.jsx)(i.code,{children:"changelog"}),". ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/commit/719f0b1eff92f358d246ededd6c1e6f9863f7f85",children:"719f0b1e"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," changes the log output format from an array to text format that is compatible with Markdown lists. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/commit/719f0b1eff92f358d246ededd6c1e6f9863f7f85",children:"719f0b1e"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," some privacy-related configuration keys or tokens are only displayed in plaintext under administrator permissions; other permissions cannot see them; demo mode is read-only and will do some encryption. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/644",children:"#644"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," does not display the build date and hash value if they cannot be obtained."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"added-10",children:"Added"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," supports parsing of the Android App Bundle (aab) file format and webp icons."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," supports language internationalization, with optional language packs: Simplified Chinese, English (support for page configuration)."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," supports configuring more system settings. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/643",children:"#643"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," adds editing functionality for network hooks in the management panel."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," rewrites and optimizes the style layout of the application list."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," optimizes the basic email template."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," adjusts the style and error logic of the login window."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," adds file permission checking to the environment variable page in the management panel. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/608",children:"#608"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," adds error details display for asynchronous tasks in the management panel, with a maximum of 5000 errors."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," uses a better log output format. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/646",children:"#646"})]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"fixed-12",children:"Fixed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where the default selection state of boolean type parameters is incorrect on the settings page."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where exceptions occur when clicking install or download in the DingTalk app (changed to WeChat logic processing)."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where the build date (time stamp when building a Docker image) cannot be displayed on the environment page."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where the domain scope of asynchronous notifications does not take effect."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue of exception when getting gems."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue of abnormal judgment of the expiration time of iOS certificates."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where disk space cannot be obtained when developing with a virtual machine mounted."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes some known errors in demo mode."]}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"422-2021-10-15",children:"4.2.2 (2021-10-15)"}),"\n",(0,s.jsxs)(i.p,{children:["Full ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/compare/4.2.1...4.2.2",children:"commit changes"}),"."]}),"\n",(0,s.jsx)(i.h4,{id:"fixed-13",children:"Fixed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"API"})," fixes the issue where incorrect error messages were not output due to parameter mismatches caused by batch replacements. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/issues/615",children:"#615"})," Thanks to ",(0,s.jsx)(i.a,{href:"https://github.com/gin7758258",children:"gin7758258"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue of abnormal parsing of some apk Android files. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/529",children:"#587"})]}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"421-2021-09-14",children:"4.2.1 (2021-09-14)"}),"\n",(0,s.jsxs)(i.p,{children:["Full ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/compare/4.2.0...4.2.1",children:"commit changes"}),"."]}),"\n",(0,s.jsx)(i.h4,{id:"changed-9",children:"Changed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," application icons are no longer cropped to the preset size, and image processing dependencies have been removed, reducing the Docker image size by nearly 200MB."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Docker"})," the reverse proxy service Caddy no longer outputs logs to STDOUT but directly to files."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"fixed-14",children:"Fixed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where icons are not displayed correctly after uploading an application."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," is compatible with different dSYM zip extraction logics when uploading."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where the application icon is not displayed when installing iOS applications."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes a security vulnerability by disabling the editing of read-only system settings."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where the downloaded file suffix is not correct on macOS."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where the window showing that an installation is not possible does not pop up in some cases."]}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"420-2021-09-01",children:"4.2.0 (2021-09-01)"}),"\n",(0,s.jsxs)(i.p,{children:["Full ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/compare/4.1.0...4.2.0",children:"commit changes"}),"."]}),"\n",(0,s.jsx)(i.h4,{id:"changed-10",children:"Changed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," changes the default logic for cleaning up old versions to off. To enable, set the environment variable ",(0,s.jsx)(i.code,{children:"ZEALOT_KEEP_UPLOADS=false"}),". ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/570",children:"#570"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," renames File Parsing to Application Unpacking. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/529",children:"#529"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," removes support for unpacking previously uploaded applications in the application unpacking feature. (now all uploaded applications will automatically trigger additional application unpacking)"]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"API"})," supports fontawesome css values for custom field icons when uploading applications, such as the value ",(0,s.jsx)(i.code,{children:"fas fa-flag"})," for ",(0,s.jsx)(i.a,{href:"https://fontawesome.com/v5.15/icons/flag?style=solid",children:"flag"}),"."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Docker"})," changes the image to use caddy as a reverse proxy and modifies the volume persistence. Migration is required, see ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/540",children:"#540"})," for details."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"added-11",children:"Added"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," supports uploading, parsing, and downloading macOS applications. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/562",children:"#562"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," adds quick filtering options for application types and channels for mobile devices on the channel details page. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/issues/510",children:"#510"})," Thanks to ",(0,s.jsx)(i.a,{href:"https://github.com/huacnlee",children:"huacnlee"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," allows the administrator panel to configure application type templates and default registration user permissions. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/562",children:"#562"})," ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/568",children:"#568"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," partially encrypts environment variables that involve privacy."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," adds graphical displays for memory and disk usage."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Docker"})," adds support for synchronizing updates with ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pkgs/container/zealot",children:"Github Container Registry"})," images."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Docker"})," adds support for configuring the postgres port number with environment variables."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"fixed-15",children:"Fixed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where the iOS installation button cannot be displayed on iPad and M1 chip macOS. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/issues/519",children:"#519"})," Thanks to ",(0,s.jsx)(i.a,{href:"https://github.com/ohdarling",children:"ohdarling"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where using third-party login while registering but not verifying email fails. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/issues/517",children:"#517"})," Thanks to ",(0,s.jsx)(i.a,{href:"https://github.com/huacnlee",children:"huacnlee"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where uploading an application through the website does not trigger application unpacking."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where the left navigation style is misaligned when tubrolink is enabled."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," displays the unpacking link when uploading Android applications."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," optimizes the display prompt for empty unpacking file lists."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where LDAP parameters are obtained incorrectly. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/542",children:"#541"})," Thanks to ",(0,s.jsx)(i.a,{href:"https://github.com/Martwu",children:"Martwu"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," changes the error message for capturing application upload errors to a readable format."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where the application type creation error judgment is abnormal."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," adds an exception judgment for clicking the details page when all channels of an application are deleted."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where uploading applications causes variable release errors in the parsing process."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where an error occurs when verifying password protection for an application. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/issues/564",children:"#564"})," Thanks to ",(0,s.jsx)(i.a,{href:"https://github.com/EasierLu",children:"EasierLu"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where editing user information in the administrator panel causes an error. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/issues/564",children:"#564"})," Thanks to ",(0,s.jsx)(i.a,{href:"https://github.com/EasierLu",children:"EasierLu"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"}),' fixes the issue where the "Install" button on the application details page is displayed abnormally on incorrect systems and devices (normally only iOS applications are displayed on iOS and macOS devices).']}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," optimizes the unpacking of applications for developer certificates that fail to parse due to special character sets (currently known to be Chinese encoding) and UI layout adjustments."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where the current user cannot be edited."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," corrects the duplicate title of debug files."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Docker"})," fixes the logrotate error during image initialization."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Docker"})," fixes the issue where Caddy deployment needs to be confirmed. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/issues/551",children:"#551"})," Thanks to ",(0,s.jsx)(i.a,{href:"https://github.com/ReverseScale",children:"ReverseScale"})]}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"410-2021-07-17",children:"4.1.0 (2021-07-17)"}),"\n",(0,s.jsxs)(i.p,{children:["Full ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/compare/4.0.0...4.1.0",children:"commit changes"}),"."]}),"\n",(0,s.jsx)(i.h4,{id:"changed-11",children:"Changed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," changes the display logic for obtaining device UDID due to the similarity of iPad's User-Agent and Desktop."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Docker"})," sets Gihub Container Registry (gcr.io) as the default Docker image source."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"added-12",children:"Added"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," supports one-click login authentication for third-party platforms such as Feishu and Gitlab."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," optimizes the logic for accessing the version details page of an application that cannot be found and allows manual redirection to the latest version."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," adds the ability to view some system configuration items and modify some parameters without requiring a restart."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," adds a page statistics report to the management panel."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"fixed-16",children:"Fixed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where the network hook cannot obtain the value of the title variable."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the abnormal error during application parsing process."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the abnormal error that occurs during application creation."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where system configuration cannot be edited due to being saved as empty."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Job"})," fixes the issue where the logic for removing old versions causes the deletion logic and document logic to be reversed."]}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"400-2020-12-31",children:"4.0.0 (2020-12-31)"}),"\n",(0,s.jsxs)(i.p,{children:["Full ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/compare/4.0.0.rc2...4.0.0",children:"commit changes"}),"."]}),"\n",(0,s.jsx)(i.h4,{id:"fixed-17",children:"Fixed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," corrects the display error caused by abnormal judgment of the expiration time of the iOS certificate during file parsing."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," ignores the default development version number check for new versions."]}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"400rc2-2020-12-25",children:"4.0.0.rc2 (2020-12-25)"}),"\n",(0,s.jsxs)(i.p,{children:["Full ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/compare/4.0.0.rc1...4.0.0.rc2",children:"commit changes"}),"."]}),"\n",(0,s.jsx)(i.h4,{id:"added-13",children:"Added"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," newly parsed files will be saved to the list, and a file parsing for uploaded applications will also be synchronized. (asynchronous task) ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/346",children:"#346"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," adds file parsing data statistics to the control panel."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," adds data statistics for network hooks, background tasks, and disk usage for administrators in the control panel."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," adds a quick delete function for authorized personnel to the prompt for missing files in the version details."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"changed-12",children:"Changed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"API"})," The debug file version check interface has been renamed, and new check methods based on file fingerprints and dSYM UUID have been added. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/346",children:"#349"})]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"fixed-18",children:"Fixed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the error when disabling LDAP login authentication. (caused by incorrect IP whitelist settings)"]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," corrects the wording of the prompt when opening the version details in WeChat for Android."]}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"400rc1-2020-10-29",children:"4.0.0.rc1 (2020-10-29)"}),"\n",(0,s.jsxs)(i.p,{children:["Full ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/compare/4.0.0.beta4...4.0.0.rc1",children:"commit changes"}),"."]}),"\n",(0,s.jsx)(i.h4,{id:"changed-13",children:"Changed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Docker"})," ",(0,s.jsx)(i.strong,{children:"major change"})," merges rails and worker into the same image for deployment. zealot-docker library needs to be updated accordingly ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/235",children:"#235"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Docker"})," upgrades Ruby to version 2.7 for deployment."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," upgrades font-awesome from version 4.7.0 to 5.13.0, which may cause missing icons to display improperly."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," adjusts the wording of invitation emails."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," unifies the download path for applications and debugging files to ",(0,s.jsx)(i.code,{children:"/download"})," path."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," requires login permission for online application parsing."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," optimizes the logic for automatically redirecting to the latest version when accessing deleted or non-existent version details."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," adjusts the installation and download logic of applications (mainly due to the inability to distinguish between iPadOS UserAgent and Desktop)."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"added-14",children:"Added"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," displays a prompt when downloading files that do not exist."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," supports parsing .mobileprovision format files and enabling the parsing of .ipa files online."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," allows some system settings to be modified online using the administrator panel. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/245",children:"#245"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," adds guest mode. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/243",children:"#243"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," supports displaying the names of iOS AdHoc version test devices. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/211",children:"#211"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," supports parsing the content of uploaded version installation packages. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/210",children:"#210"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," supports obtaining the UDID of iOS devices. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/203",children:"#203"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," supports a demo mode with limited functionality and periodic data initialization. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/198",children:"#198"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," displays the original name of the application in the version details after uploading the App."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," allows filtering of the application list by version, Git branch, and packaging type."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," displays the Git commit link associated with the latest upload in the version details. (if the git URL is set in the channel settings)"]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," integrates LDAP login into the existing login interface and no longer uses the crude interface provided by third-party dependencies."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Job"})," supports managing the generation and recovery of data backup using rails commands. (database and uploaded file data) ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/207",children:"#207"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"API"})," adds an interface to check if the debug file exists ",(0,s.jsx)(i.code,{children:"/api/debug_files/version_exist"}),"."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"fixed-19",children:"Fixed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the error when parsing changelog during App upload."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where the QR code in the version details will exceed the parent view in medium resolution."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where some values of the application channel are empty and the default value is not displayed."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," optimizes the content display when parsing iOS packages online. (and solves the problem of always displaying fake data)"]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where the information of the submitter is not displayed for changelogs generated using ",(0,s.jsx)(i.a,{href:"https://github.com/icyleaf/fastlane-plugin-ci_changelog",children:"fastlane-plugin-ci_changelog"})," in the version details."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes and optimizes the logic for checking new versions."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where the pop-up window for confirming the deletion of debug files displays an empty message."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," optimizes the display of the device list in the version details on some mobile phones."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the error when parsing applications without submitting parameters."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," optimizes the display of the version list on mobile phones."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," only displays the bottom pagination for the latest upload dynamics of channel versions, and the top displays the total number of versions."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where the administrator editing user prompt for a non-empty password."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"}),"/",(0,s.jsx)(i.code,{children:"API"})," fixes the issue where the latest version is used when the requested version for online download and installation does not exist."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where the login interface displays the sidebar menu in guest mode."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where the same debugging file of the same application and platform is always overwritten when uploaded."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," optimizes the display of boolean and dictionary types on the system settings page."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Job"})," fixes the issue where old versions were accidentally deleted due to a version judgment error during scheduled cleaning."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Docker"})," fixes the issue where the internal static resources are not updated due to volume storage of the public folder."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Docker"})," fixes the issue where the container version is inconsistent with the external version."]}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"400beta4-2020-05-07",children:"4.0.0.beta4 (2020-05-07)"}),"\n",(0,s.jsxs)(i.p,{children:["Full ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/compare/4.0.0.beta3...4.0.0.beta4",children:"commit changes"}),"."]}),"\n",(0,s.jsx)(i.h4,{id:"added-15",children:"Added"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Docker"})," supports deployment on Heroku."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," allows guests to view App details, lists, and upload App details."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"API"})," supports custom fields when uploading an App. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/issues/178",children:"#178"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"}),"/",(0,s.jsx)(i.code,{children:"API"})," automatically removes the ",(0,s.jsx)(i.code,{children:"origin/"})," prefix when passing the ",(0,s.jsx)(i.code,{children:"branch"})," value during App upload."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," adds project introduction to user authentication interfaces such as login, registration, password retrieval, and password resetting."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"fixed-20",children:"Fixed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," corrects user password description text."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the URL field error in the WebHook."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"}),"/",(0,s.jsx)(i.code,{children:"API"})," fixes the error when uploading iOS dSYM files."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"API"})," fixes the abnormal has_password parameter in the App interface."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"API"})," fixes the source of uploaded App records always showing as Web."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"API"})," fixes and supports uploading changelog in JSON format as a string."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where CPU and memory information cannot be retrieved from system information."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the occasional error when parsing Android applications online."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the error when scanning QR code with WeChat."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"changed-14",children:"Changed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"API"})," adds validation for bundle_id dimension to the latest version interface. (apps/latest)"]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," allows guests to access application version details and download operations."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," shifts the device list on the right-hand side of iOS AdHoc application version details to the left and collapses it by default."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," removes the GraphQL console functionality from the development environment and recommends using ",(0,s.jsx)(i.a,{href:"https://github.com/prisma-labs/graphql-playground",children:"graphql-playground"}),"."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," removes the footbar at the bottom of the page, and the version information can be viewed in the system information."]}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"400beta3-2020-01-16",children:"4.0.0.beta3 (2020-01-16)"}),"\n",(0,s.jsxs)(i.p,{children:["Full ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/compare/4.0.0.beta2...4.0.0.beta3",children:"commit changes"}),"."]}),"\n",(0,s.jsx)(i.h4,{id:"added-16",children:"Added"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," prompts and displays a confirmation email link for users added by administrators if their email is not activated."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," enables the default Sentry anonymous reporting mechanism (can be turned off)."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"fixed-21",children:"Fixed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"API"})," fixes the issue where uploading an application always creates a new channel."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"}),"/",(0,s.jsx)(i.code,{children:"API"})," fixes the issue where the icon of uploaded Android applications cannot be displayed."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"changed-15",children:"Changed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Docker"})," moves the initialization data out of the image and into ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot-docker",children:"zealot-docker"})," image. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/120",children:"#120"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Docker"})," reduces the size of the image from 1.18G to 308M. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/issues/114",children:"#114"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Job"})," uses asynchronous tasks instead of traditional cron jobs to implement scheduled cleaning of old version history package files. (can be turned off)"]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Job"})," groups asynchronous tasks and sets priority."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"API"})," displays all error messages in Chinese because database write operations return specific error messages."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," standardizes code using Rubocop Lint rules."]}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"400beta2-2020-01-10",children:"4.0.0.beta2 (2020-01-10)"}),"\n",(0,s.jsxs)(i.p,{children:["Full ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/compare/4.0.0.beta1...4.0.0.beta2",children:"commit changes"}),"."]}),"\n",(0,s.jsx)(i.h4,{id:"added-17",children:"Added"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," Added the ability to upload a complete version list to a specific application channel, and support deleting operations."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"fixed-22",children:"Fixed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," provides an error prompt instead of an error message when uploading an application that is not a valid ipa or apk."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"API"})," fixes the issue where the latest version list of an application cannot be returned due to the non-existence of the queried version number in the database."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"API"})," only requires token verification for interfaces that perform write operations (previously most interfaces required it)."]}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"400beta1",children:"4.0.0.beta1"}),"\n",(0,s.jsx)(i.p,{children:"\ud83c\udf08 The first public beta version has been released!"}),"\n",(0,s.jsx)(i.h2,{id:"previous-version",children:"Previous Version"}),"\n",(0,s.jsx)(i.p,{children:"For many years, it was developed and operated internally within the company and was not open source.\nIt used to undertake many functions, but now it has been separated to focus on providing\napplication hosting and distribution services"})]})}function h(e={}){const{wrapper:i}={...(0,d.a)(),...e.components};return i?(0,s.jsx)(i,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},1151:(e,i,n)=>{n.d(i,{Z:()=>r,a:()=>t});var s=n(7294);const d={},l=s.createContext(d);function t(e){const i=s.useContext(l);return s.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function r(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(d):e.components||d:t(e.components),s.createElement(l.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/49d6ba58.ccc0eeac.js b/assets/js/49d6ba58.ccc0eeac.js new file mode 100644 index 000000000..1130bb7f7 --- /dev/null +++ b/assets/js/49d6ba58.ccc0eeac.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[9146],{8910:(e,i,n)=>{n.r(i),n.d(i,{assets:()=>o,contentTitle:()=>t,default:()=>h,frontMatter:()=>l,metadata:()=>r,toc:()=>a});var s=n(5893),d=n(1151);const l={},t="Change Log",r={id:"user-guide/changelog",title:"Change Log",description:"5.1.0 (2023-12-07)",source:"@site/versioned_docs/version-5.1.0/user-guide/changelog.md",sourceDirName:"user-guide",slug:"/user-guide/changelog",permalink:"/docs/5.1.0/user-guide/changelog",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.1.0/user-guide/changelog.md",tags:[],version:"5.1.0",frontMatter:{},sidebar:"userGuide",previous:{title:"Best Practices",permalink:"/docs/5.1.0/user-guide/best_practices"},next:{title:"Q&A",permalink:"/docs/5.1.0/user-guide/qa"}},o={},a=[{value:"5.1.0 (2023-12-07)",id:"510-2023-12-07",level:2},{value:"Changed",id:"changed",level:4},{value:"Added",id:"added",level:4},{value:"Fixed",id:"fixed",level:4},{value:"5.0.0 (2023-09-06)",id:"500-2023-09-06",level:2},{value:"Changed",id:"changed-1",level:4},{value:"Added",id:"added-1",level:4},{value:"Fixed",id:"fixed-1",level:4},{value:"4.7.1 (2023-03-10)",id:"471-2023-03-10",level:2},{value:"Changed",id:"changed-2",level:4},{value:"Fixed",id:"fixed-2",level:4},{value:"Added",id:"added-2",level:4},{value:"4.7.0 (2023-03-03)",id:"470-2023-03-03",level:2},{value:"Changed",id:"changed-3",level:4},{value:"Added",id:"added-3",level:4},{value:"Fixed",id:"fixed-3",level:4},{value:"4.6.0 (2023-01-17)",id:"460-2023-01-17",level:2},{value:"Fixed",id:"fixed-4",level:4},{value:"Added",id:"added-4",level:4},{value:"Changed",id:"changed-4",level:4},{value:"4.5.3 (2022-11-22)",id:"453-2022-11-22",level:2},{value:"Fixed",id:"fixed-5",level:4},{value:"Added",id:"added-5",level:4},{value:"4.5.2 (2022-11-01)",id:"452-2022-11-01",level:2},{value:"Fixed",id:"fixed-6",level:4},{value:"Added",id:"added-6",level:4},{value:"Changed",id:"changed-5",level:4},{value:"4.5.1 (2022-09-14)",id:"451-2022-09-14",level:2},{value:"Fixed",id:"fixed-7",level:4},{value:"4.5.0 (2022-08-19)",id:"450-2022-08-19",level:2},{value:"Added",id:"added-7",level:4},{value:"Changed",id:"changed-6",level:4},{value:"Fixed",id:"fixed-8",level:4},{value:"4.4.1 (2022-06-20)",id:"441-2022-06-20",level:2},{value:"Fixed",id:"fixed-9",level:4},{value:"4.4.0 (2022-06-09)",id:"440-2022-06-09",level:2},{value:"Changed",id:"changed-7",level:4},{value:"Added",id:"added-8",level:4},{value:"Fixed",id:"fixed-10",level:4},{value:"4.3.1 (2021-12-22)",id:"431-2021-12-22",level:2},{value:"Added",id:"added-9",level:4},{value:"Fixed",id:"fixed-11",level:4},{value:"4.3.0 (2021-12-08)",id:"430-2021-12-08",level:2},{value:"Changed",id:"changed-8",level:4},{value:"Added",id:"added-10",level:4},{value:"Fixed",id:"fixed-12",level:4},{value:"4.2.2 (2021-10-15)",id:"422-2021-10-15",level:2},{value:"Fixed",id:"fixed-13",level:4},{value:"4.2.1 (2021-09-14)",id:"421-2021-09-14",level:2},{value:"Changed",id:"changed-9",level:4},{value:"Fixed",id:"fixed-14",level:4},{value:"4.2.0 (2021-09-01)",id:"420-2021-09-01",level:2},{value:"Changed",id:"changed-10",level:4},{value:"Added",id:"added-11",level:4},{value:"Fixed",id:"fixed-15",level:4},{value:"4.1.0 (2021-07-17)",id:"410-2021-07-17",level:2},{value:"Changed",id:"changed-11",level:4},{value:"Added",id:"added-12",level:4},{value:"Fixed",id:"fixed-16",level:4},{value:"4.0.0 (2020-12-31)",id:"400-2020-12-31",level:2},{value:"Fixed",id:"fixed-17",level:4},{value:"4.0.0.rc2 (2020-12-25)",id:"400rc2-2020-12-25",level:2},{value:"Added",id:"added-13",level:4},{value:"Changed",id:"changed-12",level:4},{value:"Fixed",id:"fixed-18",level:4},{value:"4.0.0.rc1 (2020-10-29)",id:"400rc1-2020-10-29",level:2},{value:"Changed",id:"changed-13",level:4},{value:"Added",id:"added-14",level:4},{value:"Fixed",id:"fixed-19",level:4},{value:"4.0.0.beta4 (2020-05-07)",id:"400beta4-2020-05-07",level:2},{value:"Added",id:"added-15",level:4},{value:"Fixed",id:"fixed-20",level:4},{value:"Changed",id:"changed-14",level:4},{value:"4.0.0.beta3 (2020-01-16)",id:"400beta3-2020-01-16",level:2},{value:"Added",id:"added-16",level:4},{value:"Fixed",id:"fixed-21",level:4},{value:"Changed",id:"changed-15",level:4},{value:"4.0.0.beta2 (2020-01-10)",id:"400beta2-2020-01-10",level:2},{value:"Added",id:"added-17",level:4},{value:"Fixed",id:"fixed-22",level:4},{value:"4.0.0.beta1",id:"400beta1",level:2},{value:"Previous Version",id:"previous-version",level:2}];function c(e){const i={a:"a",code:"code",h1:"h1",h2:"h2",h4:"h4",li:"li",p:"p",strong:"strong",ul:"ul",...(0,d.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(i.h1,{id:"change-log",children:"Change Log"}),"\n",(0,s.jsx)(i.h2,{id:"510-2023-12-07",children:"5.1.0 (2023-12-07)"}),"\n",(0,s.jsxs)(i.p,{children:["Mainly functional fixes, with minor upgrades to new features. Full ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/compare/4.7.1...5.0.0",children:"commit changes"}),"."]}),"\n",(0,s.jsx)(i.h4,{id:"changed",children:"Changed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Docker"})," ",(0,s.jsx)(i.strong,{children:"Major Change"})," The minimum version of Redis dependencies has been updated from 5.x to 6.2+. It is recommended to use version 7.x. When upgrading, please manually modify the settings."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"added",children:"Added"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Docker"})," added Redis and PostgreSQL version checks; running below minimum versions may cause malfunction."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Docker"})," service initializes by creating databases during startup."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," enhanced validation conditions for JSON format settings on the settings page."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"fixed",children:"Fixed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," checks disk space upon upload to determine file existence."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixed debug file association with application versions."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," resolved issue where the application unpack details page wasn't displaying the list of testing devices."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," optimized display information on error pages for application versions."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," improved display for long package names of mobile device applications."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," optimized some page styles and the display of English language."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"API/Web"})," fixed issue where the Android app parsing icon in webp format failed to convert to png."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"API"})," resolved GraphQL user authentication."]}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"500-2023-09-06",children:"5.0.0 (2023-09-06)"}),"\n",(0,s.jsxs)(i.p,{children:["Any archived package of application supportted (e.g. ",(0,s.jsx)(i.code,{children:"Windows"})," or ",(0,s.jsx)(i.code,{children:"Linux"}),")). Full ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/compare/4.7.1...5.0.0",children:"commit changes"}),"."]}),"\n",(0,s.jsx)(i.h4,{id:"changed-1",children:"Changed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Docker"})," ",(0,s.jsx)(i.strong,{children:"Major Change"})," The minimum version of Redis dependencies has been updated from 5.x to 6.2+. It is recommended to use version 7.x. When upgrading, please manually modify the settings."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"added-1",children:"Added"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"}),"/",(0,s.jsx)(i.code,{children:"API"})," supports hosting of general applications (those that can be parsed automatically and those that cannot be parsed are skipped), and Windows and Linux platforms are added by default ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/1121",children:"#1121"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"}),"/",(0,s.jsx)(i.code,{children:"API"})," adds support for hosting Windows applications (uploading and displaying metadata parsing) ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/1124",children:"#1124"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," has a new debugging file page and adds support for parsing and hosting multiple dSYM debugging files ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/1127",children:"#1127"})," ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/1124",children:"#1124"})," ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/issues/961",children:"#961"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," supports unpacking v1, v2, and v3 signature information for Android applications ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/1124",children:"#1124"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," strengthens X509 certificate information for unpacking Android and iOS applications ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/1124",children:"#1124"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"}),' adds a "Reparse" function to update the metadata of old structure debugging files']}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," supports markdown format for change logs of uploaded application versions"]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"}),' settings page can configure the global "minimum number of items returned per page" and "maximum number of items"']}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," for iOS applications, the application version details page displays the expiration time information of the signing certificate and the logical restriction of installation failure due to expired signing certificate (can be downloaded)"]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," adds or updates JSON format verification to network hooks and settings pages."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," supports registering test devices to Apple developers with custom device names and editing/updating device names after creation."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," supports downloading private key certificates for Apple developers."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"fixed-1",children:"Fixed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue of being unable to delete unpacked applications"]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," optimizes the style of some pages"]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," corrects errors in the English language package (en language i18n)"]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the error page that appears when creating an empty application type"]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the 404 error page that appears when a file is not found."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"API"})," fixes the logic optimization of comparing build_version for retrieving the latest version of an application."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," optimizes the error handling for custom field format during application upload."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," optimizes the correct redirection for URL injection, empty application history versions, and unregistered devices."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," optimizes the display of error information for backup tasks."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," adds type detection for application types and debug files during application upload."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the error message of not preselecting the creation of a Distribution Certificate for Apple developers."]}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"471-2023-03-10",children:"4.7.1 (2023-03-10)"}),"\n",(0,s.jsx)(i.p,{children:"Support for parsing aab applications generated by the latest Android aapt2 build tool, full [commit changes][4.7.1]."}),"\n",(0,s.jsx)(i.h4,{id:"changed-2",children:"Changed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Docker"})," ",(0,s.jsx)(i.strong,{children:"Major Change"})," The minimum version of Redis dependencies has been updated from 5.x to 6.2+. It is recommended to use version 7.x. When upgrading, please manually modify the settings."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"fixed-2",children:"Fixed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," upgrades to the latest appt2 model to avoid exceptions when parsing aab files."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," implements duplicate processing for parsing exceptions."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"added-2",children:"Added"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," adds application types to the details page of unpacked Android applications."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," adjusts the original page after editing an application channel."]}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"470-2023-03-03",children:"4.7.0 (2023-03-03)"}),"\n",(0,s.jsxs)(i.p,{children:[(0,s.jsx)(i.strong,{children:"Major Change"})," The minimum version of Redis dependencies has been updated from 5.x to 6.2+. Full ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/compare/4.6.0...4.7.0",children:"commit changes"}),"."]}),"\n",(0,s.jsx)(i.h4,{id:"changed-3",children:"Changed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Docker"})," ",(0,s.jsx)(i.strong,{children:"Major Change"})," The minimum version of Redis dependencies has been updated from 5.x to 6.2+. It is recommended to use version 7.x. When upgrading, please manually modify the settings."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"added-3",children:"Added"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"}),' adds a control switch for "New Upload Version Prompt Window" to application types. ',(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/1058",children:"#1058"})," Thanks to ",(0,s.jsx)(i.a,{href:"https://github.com/softwind0214",children:"softwind0214"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," allows clicking on the application icon on the application list page to jump to the application details page."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," adds the display of the version number of dependent services to the environment information."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," adds support for displaying nightly build versions in the version number."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"fixed-3",children:"Fixed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," downgrades Ruby version to 3.0 temporarily to solve the iOS application parsing crash caused by the high version. See ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/issues/1070",children:"#1070"})," for details."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the display order of applications/types/channels, which is now fixed as ascending order of creation time."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where there is no confirmation prompt when a user logs out."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where the main historical version of an application cannot be deleted."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," improves the style of multiple pages."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," no longer displays Javascript debugger logs in production environments."]}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"460-2023-01-17",children:"4.6.0 (2023-01-17)"}),"\n",(0,s.jsxs)(i.p,{children:["The runtime environment has been upgraded to Ruby 3.2 and now supports arm64 platforms. Full ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/compare/4.5.3...4.6.0",children:"commit changes"}),"."]}),"\n",(0,s.jsx)(i.h4,{id:"fixed-4",children:"Fixed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," captures the issue of creating an application channel with an empty name. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/issues/968",children:"#968"})," Thanks to ",(0,s.jsx)(i.a,{href:"https://github.com/congpeijun",children:"congpeijun"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," improves the logic for backup files that do not exist on disk. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/issues/995",children:"#995"})]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"added-4",children:"Added"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Docker"})," supports arm64/v8 and armv7 arch. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/970",children:"#970"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," Adopted a new 50x error page."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"changed-4",children:"Changed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," upgrades the Ruby version to 3.2 in development environments, and devcontainers and containers now have the YJIT feature enabled by default. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/1011",children:"#1011"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"API"})," updates the data structure of the debug file return and changes the status code from 204 to 200."]}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"453-2022-11-22",children:"4.5.3 (2022-11-22)"}),"\n",(0,s.jsxs)(i.p,{children:["Full ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/compare/4.5.2...4.5.3",children:"commit changes"}),"."]}),"\n",(0,s.jsx)(i.h4,{id:"fixed-5",children:"Fixed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," Fixes the issue where third-party login cannot be redirected. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/issues/949",children:"#949"})," Thanks to ",(0,s.jsx)(i.a,{href:"https://github.com/softwind0214",children:"softwind0214"})]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"added-5",children:"Added"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Docker"})," Adds a new environment variable to disable the request protection of WebSocket (ActionCable) requests (experimental). ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/950",children:"#950"})]}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"452-2022-11-01",children:"4.5.2 (2022-11-01)"}),"\n",(0,s.jsxs)(i.p,{children:["Full ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/compare/4.5.1...4.5.2",children:"commit changes"}),"."]}),"\n",(0,s.jsx)(i.h4,{id:"fixed-6",children:"Fixed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where registering a test device is abnormal. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/issues/935",children:"#935"})," Thanks to ",(0,s.jsx)(i.a,{href:"https://github.com/ycy0430",children:"ycy0430"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," adapts the QR code to support dark mode."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," corrects the English language pack."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"added-6",children:"Added"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"WebHook"})," Income webhook body structure adds the ",(0,s.jsx)(i.code,{children:"username"})," and ",(0,s.jsx)(i.code,{children:"email"})," fields. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/issues/934",children:"#934"})," Thanks to ",(0,s.jsx)(i.a,{href:"https://github.com/rkonfj",children:"rkonfj"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Docker"})," The ",(0,s.jsx)(i.code,{children:"SIDEKIQ_CONCURRENCY"})," environment variable is now supported to set the concurrency of background tasks, with a default value of 5."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"changed-5",children:"Changed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Docker"})," reduces security risks by changing the Web service, which includes puma and pumacontrolserver, to listen on ",(0,s.jsx)(i.code,{children:"127.0.0.1"}),"."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," optimizes the wording of the iOS device UDID profile."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," updates the text at the bottom of the page. Thanks to Rails and the AdminLTE open source project!"]}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"451-2022-09-14",children:"4.5.1 (2022-09-14)"}),"\n",(0,s.jsxs)(i.p,{children:["Full ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/compare/4.5.0...4.5.1",children:"commit changes"})]}),"\n",(0,s.jsx)(i.h4,{id:"fixed-7",children:"Fixed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," Fixes the issue where the application unpacking results in parsing errors."]}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"450-2022-08-19",children:"4.5.0 (2022-08-19)"}),"\n",(0,s.jsxs)(i.p,{children:["Supports the \ud83c\udf11 dark mode and managing the test devices of an \ud83d\udc68\ud83c\udffb\u200d\ud83d\udd27 Apple developer account! Full ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/compare/4.4.1...4.5.0",children:"commit changes"}),"."]}),"\n",(0,s.jsx)(i.h4,{id:"added-7",children:"Added"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," supports dark mode. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/816",children:"#816"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," adds Apple developer management for registering test devices. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/817",children:"#817"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," adds data backup management. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/835",children:"#835"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," completes the monitoring of dependent services in the management panel. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/issues/586",children:"#586"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"API"})," adds three fields, ",(0,s.jsx)(i.code,{children:"platform"}),", ",(0,s.jsx)(i.code,{children:"device_type"}),", and ",(0,s.jsx)(i.code,{children:"custom_fields"}),", to the release dictionary."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"changed-6",children:"Changed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," ",(0,s.jsx)(i.strong,{children:"Incompatible change"})," Google Analytics forces an upgrade to version 4, and previous settings need to be reconfigured to take effect. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/815",children:"#815"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"CLI"})," ",(0,s.jsx)(i.strong,{children:"Incompatible change"})," The data backup and restore functionality is no longer available due to changes in the structure. Please use the data backup function in the admin panel instead."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," adjusts the display of device UDID acquisition, iOS version installation and download based on the device, no longer displaying all functions."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," removes the page statistics function in the admin panel. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/814",children:"#814"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," migrates the front-end technology stack from webpacker to esbuild + sass, and from Turbolinks to Stimulus, bringing a better front-end interaction experience. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/829",children:"#829"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," due to the complexity of editing application types and channels, only the application name can be modified."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"fixed-8",children:"Fixed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the error of selecting a channel that does not exist under an application type. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/issues/795",children:"#795"})," Thanks to ",(0,s.jsx)(i.a,{href:"https://github.com/tasselsd",children:"tasselsd"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"API"})," fixes the Android address return error. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/issues/813",children:"#813"})," Thanks to ",(0,s.jsx)(i.a,{href:"https://github.com/denymz",children:"denymz"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"}),"/",(0,s.jsx)(i.code,{children:"API"})," fixes the exception caused by some parameters being empty in aab parsing. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/fastlane-plugin-zealot/issues/9",children:"tryzealot/fastlane-plugin-zealot#9"})," Thanks to ",(0,s.jsx)(i.a,{href:"https://github.com/tasselsd",children:"tasselsd"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue of abnormal generation of demo data during the first initialization of the project. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/issues/821",children:"#821"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"API"})," fixes the issue of abnormal data when checking the latest version of the application. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/issues/856",children:"#856"})," Thanks to ",(0,s.jsx)(i.a,{href:"https://github.com/denymz",children:"denymz"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue of an error being thrown due to abnormal data in the associated network hook when viewing the details of an application channel."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," corrects many spelling errors in the English language pack."]}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"441-2022-06-20",children:"4.4.1 (2022-06-20)"}),"\n",(0,s.jsxs)(i.p,{children:["Full ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/compare/4.4.0...4.4.1",children:"commit changes"})]}),"\n",(0,s.jsx)(i.h4,{id:"fixed-9",children:"Fixed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"WebHook"})," fixes the issue where an error is thrown after a successful trigger. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/issues/792",children:"#792"})," Thanks to ",(0,s.jsx)(i.a,{href:"https://github.com/tasselsd",children:"tasselsd"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Docker"})," compatible with Caddy 2.5.0 for proxying from https to http. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/790",children:"#790"})," Thanks to ",(0,s.jsx)(i.a,{href:"https://github.com/VisionBao",children:"VisionBao"})," ",(0,s.jsx)(i.a,{href:"https://github.com/songge1209",children:"songge1209"})]}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"440-2022-06-09",children:"4.4.0 (2022-06-09)"}),"\n",(0,s.jsxs)(i.p,{children:["Full ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/compare/4.3.1...4.4.0",children:"commit changes"}),"."]}),"\n",(0,s.jsx)(i.h4,{id:"changed-7",children:"Changed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," adds filtering by version, branch, and packaging type to the list display for users who are not logged in and have not enabled guest mode, in addition to viewing application version details."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," upgrades the runtime environment to Ruby 3.0 and the service framework to Rails 7.0."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," is now compatible with the macOS M1 chip."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"added-8",children:"Added"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," simplifies and standardizes some application links to facilitate sharing. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/666",children:"#666"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," completes some missing permission check pages."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"fixed-10",children:"Fixed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Job"})," fixes the issue of abnormal URL Schemes when parsing iOS files."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where service logs are not output to the terminal console."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," adds exception handling for processing debug files uploaded when they are deleted during parsing or cannot be found for other reasons."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," adapts the UI for ultra-wide screens."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes security vulnerabilities in third-party login dependencies."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"API"})," fixes the issue where uploading Android without channel_key results in an exception. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/issues/779",children:"#779"})," Thanks to ",(0,s.jsx)(i.a,{href:"https://github.com/likfe",children:"likfe"})]}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"431-2021-12-22",children:"4.3.1 (2021-12-22)"}),"\n",(0,s.jsxs)(i.p,{children:["Full ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/compare/4.3.0...4.3.1",children:"commit changes"}),"."]}),"\n",(0,s.jsx)(i.h4,{id:"added-9",children:"Added"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," after updating the setting, the original default value can be restored."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," supports parsing and displaying app links (distinguishing between deep links and URL schemes) for Android in application unpacking."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," strengthens the visual effect of the open and closed status of the setting page."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"fixed-11",children:"Fixed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue of asynchronous task methods in demo mode."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where selected application types and channels cannot be checked when creating and editing an application."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where it is not possible to navigate to the environment page."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where aab parsing fails when there are no intent filters."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," adds error handling for unchecking all application types and channels when updating an application."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where the loading strategy causes all third-party logins to be unavailable."]}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"430-2021-12-08",children:"4.3.0 (2021-12-08)"}),"\n",(0,s.jsxs)(i.p,{children:["Supports parsing of the aab format, adds support for multiple languages. Full ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/compare/4.2.2...4.3.0",children:"commit changes"})]}),"\n",(0,s.jsx)(i.h4,{id:"changed-8",children:"Changed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," uses the default prompt structure as the data structure for network hooks, instead of a strange structure."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," no longer provides parameter changes for third-party login authorization on the settings page (requires service restart)."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"API"})," the upload application interface and version details return the ",(0,s.jsx)(i.code,{children:"text_changelog"})," field in the response body. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/commit/650f1ffd3731f6a1f4cc703430be1b1b6f5d1cee",children:"650f1ffd"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"API"})," renames the ",(0,s.jsx)(i.code,{children:"changelog_list"})," field in the response body to ",(0,s.jsx)(i.code,{children:"changelog"}),". ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/commit/719f0b1eff92f358d246ededd6c1e6f9863f7f85",children:"719f0b1e"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," changes the log output format from an array to text format that is compatible with Markdown lists. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/commit/719f0b1eff92f358d246ededd6c1e6f9863f7f85",children:"719f0b1e"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," some privacy-related configuration keys or tokens are only displayed in plaintext under administrator permissions; other permissions cannot see them; demo mode is read-only and will do some encryption. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/644",children:"#644"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," does not display the build date and hash value if they cannot be obtained."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"added-10",children:"Added"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," supports parsing of the Android App Bundle (aab) file format and webp icons."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," supports language internationalization, with optional language packs: Simplified Chinese, English (support for page configuration)."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," supports configuring more system settings. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/643",children:"#643"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," adds editing functionality for network hooks in the management panel."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," rewrites and optimizes the style layout of the application list."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," optimizes the basic email template."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," adjusts the style and error logic of the login window."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," adds file permission checking to the environment variable page in the management panel. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/608",children:"#608"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," adds error details display for asynchronous tasks in the management panel, with a maximum of 5000 errors."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," uses a better log output format. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/646",children:"#646"})]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"fixed-12",children:"Fixed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where the default selection state of boolean type parameters is incorrect on the settings page."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where exceptions occur when clicking install or download in the DingTalk app (changed to WeChat logic processing)."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where the build date (time stamp when building a Docker image) cannot be displayed on the environment page."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where the domain scope of asynchronous notifications does not take effect."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue of exception when getting gems."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue of abnormal judgment of the expiration time of iOS certificates."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where disk space cannot be obtained when developing with a virtual machine mounted."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes some known errors in demo mode."]}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"422-2021-10-15",children:"4.2.2 (2021-10-15)"}),"\n",(0,s.jsxs)(i.p,{children:["Full ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/compare/4.2.1...4.2.2",children:"commit changes"}),"."]}),"\n",(0,s.jsx)(i.h4,{id:"fixed-13",children:"Fixed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"API"})," fixes the issue where incorrect error messages were not output due to parameter mismatches caused by batch replacements. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/issues/615",children:"#615"})," Thanks to ",(0,s.jsx)(i.a,{href:"https://github.com/gin7758258",children:"gin7758258"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue of abnormal parsing of some apk Android files. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/529",children:"#587"})]}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"421-2021-09-14",children:"4.2.1 (2021-09-14)"}),"\n",(0,s.jsxs)(i.p,{children:["Full ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/compare/4.2.0...4.2.1",children:"commit changes"}),"."]}),"\n",(0,s.jsx)(i.h4,{id:"changed-9",children:"Changed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," application icons are no longer cropped to the preset size, and image processing dependencies have been removed, reducing the Docker image size by nearly 200MB."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Docker"})," the reverse proxy service Caddy no longer outputs logs to STDOUT but directly to files."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"fixed-14",children:"Fixed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where icons are not displayed correctly after uploading an application."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," is compatible with different dSYM zip extraction logics when uploading."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where the application icon is not displayed when installing iOS applications."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes a security vulnerability by disabling the editing of read-only system settings."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where the downloaded file suffix is not correct on macOS."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where the window showing that an installation is not possible does not pop up in some cases."]}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"420-2021-09-01",children:"4.2.0 (2021-09-01)"}),"\n",(0,s.jsxs)(i.p,{children:["Full ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/compare/4.1.0...4.2.0",children:"commit changes"}),"."]}),"\n",(0,s.jsx)(i.h4,{id:"changed-10",children:"Changed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," changes the default logic for cleaning up old versions to off. To enable, set the environment variable ",(0,s.jsx)(i.code,{children:"ZEALOT_KEEP_UPLOADS=false"}),". ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/570",children:"#570"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," renames File Parsing to Application Unpacking. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/529",children:"#529"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," removes support for unpacking previously uploaded applications in the application unpacking feature. (now all uploaded applications will automatically trigger additional application unpacking)"]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"API"})," supports fontawesome css values for custom field icons when uploading applications, such as the value ",(0,s.jsx)(i.code,{children:"fas fa-flag"})," for ",(0,s.jsx)(i.a,{href:"https://fontawesome.com/v5.15/icons/flag?style=solid",children:"flag"}),"."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Docker"})," changes the image to use caddy as a reverse proxy and modifies the volume persistence. Migration is required, see ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/540",children:"#540"})," for details."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"added-11",children:"Added"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," supports uploading, parsing, and downloading macOS applications. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/562",children:"#562"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," adds quick filtering options for application types and channels for mobile devices on the channel details page. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/issues/510",children:"#510"})," Thanks to ",(0,s.jsx)(i.a,{href:"https://github.com/huacnlee",children:"huacnlee"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," allows the administrator panel to configure application type templates and default registration user permissions. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/562",children:"#562"})," ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/568",children:"#568"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," partially encrypts environment variables that involve privacy."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," adds graphical displays for memory and disk usage."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Docker"})," adds support for synchronizing updates with ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pkgs/container/zealot",children:"Github Container Registry"})," images."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Docker"})," adds support for configuring the postgres port number with environment variables."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"fixed-15",children:"Fixed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where the iOS installation button cannot be displayed on iPad and M1 chip macOS. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/issues/519",children:"#519"})," Thanks to ",(0,s.jsx)(i.a,{href:"https://github.com/ohdarling",children:"ohdarling"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where using third-party login while registering but not verifying email fails. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/issues/517",children:"#517"})," Thanks to ",(0,s.jsx)(i.a,{href:"https://github.com/huacnlee",children:"huacnlee"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where uploading an application through the website does not trigger application unpacking."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where the left navigation style is misaligned when tubrolink is enabled."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," displays the unpacking link when uploading Android applications."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," optimizes the display prompt for empty unpacking file lists."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where LDAP parameters are obtained incorrectly. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/542",children:"#541"})," Thanks to ",(0,s.jsx)(i.a,{href:"https://github.com/Martwu",children:"Martwu"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," changes the error message for capturing application upload errors to a readable format."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where the application type creation error judgment is abnormal."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," adds an exception judgment for clicking the details page when all channels of an application are deleted."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where uploading applications causes variable release errors in the parsing process."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where an error occurs when verifying password protection for an application. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/issues/564",children:"#564"})," Thanks to ",(0,s.jsx)(i.a,{href:"https://github.com/EasierLu",children:"EasierLu"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where editing user information in the administrator panel causes an error. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/issues/564",children:"#564"})," Thanks to ",(0,s.jsx)(i.a,{href:"https://github.com/EasierLu",children:"EasierLu"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"}),' fixes the issue where the "Install" button on the application details page is displayed abnormally on incorrect systems and devices (normally only iOS applications are displayed on iOS and macOS devices).']}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," optimizes the unpacking of applications for developer certificates that fail to parse due to special character sets (currently known to be Chinese encoding) and UI layout adjustments."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where the current user cannot be edited."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," corrects the duplicate title of debug files."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Docker"})," fixes the logrotate error during image initialization."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Docker"})," fixes the issue where Caddy deployment needs to be confirmed. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/issues/551",children:"#551"})," Thanks to ",(0,s.jsx)(i.a,{href:"https://github.com/ReverseScale",children:"ReverseScale"})]}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"410-2021-07-17",children:"4.1.0 (2021-07-17)"}),"\n",(0,s.jsxs)(i.p,{children:["Full ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/compare/4.0.0...4.1.0",children:"commit changes"}),"."]}),"\n",(0,s.jsx)(i.h4,{id:"changed-11",children:"Changed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," changes the display logic for obtaining device UDID due to the similarity of iPad's User-Agent and Desktop."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Docker"})," sets Gihub Container Registry (gcr.io) as the default Docker image source."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"added-12",children:"Added"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," supports one-click login authentication for third-party platforms such as Feishu and Gitlab."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," optimizes the logic for accessing the version details page of an application that cannot be found and allows manual redirection to the latest version."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," adds the ability to view some system configuration items and modify some parameters without requiring a restart."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," adds a page statistics report to the management panel."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"fixed-16",children:"Fixed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where the network hook cannot obtain the value of the title variable."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the abnormal error during application parsing process."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the abnormal error that occurs during application creation."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where system configuration cannot be edited due to being saved as empty."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Job"})," fixes the issue where the logic for removing old versions causes the deletion logic and document logic to be reversed."]}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"400-2020-12-31",children:"4.0.0 (2020-12-31)"}),"\n",(0,s.jsxs)(i.p,{children:["Full ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/compare/4.0.0.rc2...4.0.0",children:"commit changes"}),"."]}),"\n",(0,s.jsx)(i.h4,{id:"fixed-17",children:"Fixed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," corrects the display error caused by abnormal judgment of the expiration time of the iOS certificate during file parsing."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," ignores the default development version number check for new versions."]}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"400rc2-2020-12-25",children:"4.0.0.rc2 (2020-12-25)"}),"\n",(0,s.jsxs)(i.p,{children:["Full ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/compare/4.0.0.rc1...4.0.0.rc2",children:"commit changes"}),"."]}),"\n",(0,s.jsx)(i.h4,{id:"added-13",children:"Added"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," newly parsed files will be saved to the list, and a file parsing for uploaded applications will also be synchronized. (asynchronous task) ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/346",children:"#346"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," adds file parsing data statistics to the control panel."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," adds data statistics for network hooks, background tasks, and disk usage for administrators in the control panel."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," adds a quick delete function for authorized personnel to the prompt for missing files in the version details."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"changed-12",children:"Changed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"API"})," The debug file version check interface has been renamed, and new check methods based on file fingerprints and dSYM UUID have been added. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/346",children:"#349"})]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"fixed-18",children:"Fixed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the error when disabling LDAP login authentication. (caused by incorrect IP whitelist settings)"]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," corrects the wording of the prompt when opening the version details in WeChat for Android."]}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"400rc1-2020-10-29",children:"4.0.0.rc1 (2020-10-29)"}),"\n",(0,s.jsxs)(i.p,{children:["Full ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/compare/4.0.0.beta4...4.0.0.rc1",children:"commit changes"}),"."]}),"\n",(0,s.jsx)(i.h4,{id:"changed-13",children:"Changed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Docker"})," ",(0,s.jsx)(i.strong,{children:"major change"})," merges rails and worker into the same image for deployment. zealot-docker library needs to be updated accordingly ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/235",children:"#235"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Docker"})," upgrades Ruby to version 2.7 for deployment."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," upgrades font-awesome from version 4.7.0 to 5.13.0, which may cause missing icons to display improperly."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," adjusts the wording of invitation emails."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," unifies the download path for applications and debugging files to ",(0,s.jsx)(i.code,{children:"/download"})," path."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," requires login permission for online application parsing."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," optimizes the logic for automatically redirecting to the latest version when accessing deleted or non-existent version details."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," adjusts the installation and download logic of applications (mainly due to the inability to distinguish between iPadOS UserAgent and Desktop)."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"added-14",children:"Added"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," displays a prompt when downloading files that do not exist."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," supports parsing .mobileprovision format files and enabling the parsing of .ipa files online."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," allows some system settings to be modified online using the administrator panel. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/245",children:"#245"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," adds guest mode. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/243",children:"#243"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," supports displaying the names of iOS AdHoc version test devices. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/211",children:"#211"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," supports parsing the content of uploaded version installation packages. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/210",children:"#210"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," supports obtaining the UDID of iOS devices. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/203",children:"#203"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," supports a demo mode with limited functionality and periodic data initialization. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/198",children:"#198"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," displays the original name of the application in the version details after uploading the App."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," allows filtering of the application list by version, Git branch, and packaging type."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," displays the Git commit link associated with the latest upload in the version details. (if the git URL is set in the channel settings)"]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," integrates LDAP login into the existing login interface and no longer uses the crude interface provided by third-party dependencies."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Job"})," supports managing the generation and recovery of data backup using rails commands. (database and uploaded file data) ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/207",children:"#207"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"API"})," adds an interface to check if the debug file exists ",(0,s.jsx)(i.code,{children:"/api/debug_files/version_exist"}),"."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"fixed-19",children:"Fixed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the error when parsing changelog during App upload."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where the QR code in the version details will exceed the parent view in medium resolution."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where some values of the application channel are empty and the default value is not displayed."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," optimizes the content display when parsing iOS packages online. (and solves the problem of always displaying fake data)"]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where the information of the submitter is not displayed for changelogs generated using ",(0,s.jsx)(i.a,{href:"https://github.com/icyleaf/fastlane-plugin-ci_changelog",children:"fastlane-plugin-ci_changelog"})," in the version details."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes and optimizes the logic for checking new versions."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where the pop-up window for confirming the deletion of debug files displays an empty message."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," optimizes the display of the device list in the version details on some mobile phones."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the error when parsing applications without submitting parameters."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," optimizes the display of the version list on mobile phones."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," only displays the bottom pagination for the latest upload dynamics of channel versions, and the top displays the total number of versions."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where the administrator editing user prompt for a non-empty password."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"}),"/",(0,s.jsx)(i.code,{children:"API"})," fixes the issue where the latest version is used when the requested version for online download and installation does not exist."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where the login interface displays the sidebar menu in guest mode."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where the same debugging file of the same application and platform is always overwritten when uploaded."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," optimizes the display of boolean and dictionary types on the system settings page."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Job"})," fixes the issue where old versions were accidentally deleted due to a version judgment error during scheduled cleaning."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Docker"})," fixes the issue where the internal static resources are not updated due to volume storage of the public folder."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Docker"})," fixes the issue where the container version is inconsistent with the external version."]}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"400beta4-2020-05-07",children:"4.0.0.beta4 (2020-05-07)"}),"\n",(0,s.jsxs)(i.p,{children:["Full ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/compare/4.0.0.beta3...4.0.0.beta4",children:"commit changes"}),"."]}),"\n",(0,s.jsx)(i.h4,{id:"added-15",children:"Added"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Docker"})," supports deployment on Heroku."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," allows guests to view App details, lists, and upload App details."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"API"})," supports custom fields when uploading an App. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/issues/178",children:"#178"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"}),"/",(0,s.jsx)(i.code,{children:"API"})," automatically removes the ",(0,s.jsx)(i.code,{children:"origin/"})," prefix when passing the ",(0,s.jsx)(i.code,{children:"branch"})," value during App upload."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," adds project introduction to user authentication interfaces such as login, registration, password retrieval, and password resetting."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"fixed-20",children:"Fixed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," corrects user password description text."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the URL field error in the WebHook."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"}),"/",(0,s.jsx)(i.code,{children:"API"})," fixes the error when uploading iOS dSYM files."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"API"})," fixes the abnormal has_password parameter in the App interface."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"API"})," fixes the source of uploaded App records always showing as Web."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"API"})," fixes and supports uploading changelog in JSON format as a string."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where CPU and memory information cannot be retrieved from system information."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the occasional error when parsing Android applications online."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the error when scanning QR code with WeChat."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"changed-14",children:"Changed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"API"})," adds validation for bundle_id dimension to the latest version interface. (apps/latest)"]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," allows guests to access application version details and download operations."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," shifts the device list on the right-hand side of iOS AdHoc application version details to the left and collapses it by default."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," removes the GraphQL console functionality from the development environment and recommends using ",(0,s.jsx)(i.a,{href:"https://github.com/prisma-labs/graphql-playground",children:"graphql-playground"}),"."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," removes the footbar at the bottom of the page, and the version information can be viewed in the system information."]}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"400beta3-2020-01-16",children:"4.0.0.beta3 (2020-01-16)"}),"\n",(0,s.jsxs)(i.p,{children:["Full ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/compare/4.0.0.beta2...4.0.0.beta3",children:"commit changes"}),"."]}),"\n",(0,s.jsx)(i.h4,{id:"added-16",children:"Added"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," prompts and displays a confirmation email link for users added by administrators if their email is not activated."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," enables the default Sentry anonymous reporting mechanism (can be turned off)."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"fixed-21",children:"Fixed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"API"})," fixes the issue where uploading an application always creates a new channel."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"}),"/",(0,s.jsx)(i.code,{children:"API"})," fixes the issue where the icon of uploaded Android applications cannot be displayed."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"changed-15",children:"Changed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Docker"})," moves the initialization data out of the image and into ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot-docker",children:"zealot-docker"})," image. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/120",children:"#120"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Docker"})," reduces the size of the image from 1.18G to 308M. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/issues/114",children:"#114"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Job"})," uses asynchronous tasks instead of traditional cron jobs to implement scheduled cleaning of old version history package files. (can be turned off)"]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Job"})," groups asynchronous tasks and sets priority."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"API"})," displays all error messages in Chinese because database write operations return specific error messages."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," standardizes code using Rubocop Lint rules."]}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"400beta2-2020-01-10",children:"4.0.0.beta2 (2020-01-10)"}),"\n",(0,s.jsxs)(i.p,{children:["Full ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/compare/4.0.0.beta1...4.0.0.beta2",children:"commit changes"}),"."]}),"\n",(0,s.jsx)(i.h4,{id:"added-17",children:"Added"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," Added the ability to upload a complete version list to a specific application channel, and support deleting operations."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"fixed-22",children:"Fixed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," provides an error prompt instead of an error message when uploading an application that is not a valid ipa or apk."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"API"})," fixes the issue where the latest version list of an application cannot be returned due to the non-existence of the queried version number in the database."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"API"})," only requires token verification for interfaces that perform write operations (previously most interfaces required it)."]}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"400beta1",children:"4.0.0.beta1"}),"\n",(0,s.jsx)(i.p,{children:"\ud83c\udf08 The first public beta version has been released!"}),"\n",(0,s.jsx)(i.h2,{id:"previous-version",children:"Previous Version"}),"\n",(0,s.jsx)(i.p,{children:"For many years, it was developed and operated internally within the company and was not open source.\nIt used to undertake many functions, but now it has been separated to focus on providing\napplication hosting and distribution services"})]})}function h(e={}){const{wrapper:i}={...(0,d.a)(),...e.components};return i?(0,s.jsx)(i,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},1151:(e,i,n)=>{n.d(i,{Z:()=>r,a:()=>t});var s=n(7294);const d={},l=s.createContext(d);function t(e){const i=s.useContext(l);return s.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function r(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(d):e.components||d:t(e.components),s.createElement(l.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/4d08acb8.b89d1c50.js b/assets/js/4d08acb8.b89d1c50.js new file mode 100644 index 000000000..21cdb84c3 --- /dev/null +++ b/assets/js/4d08acb8.b89d1c50.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[6158],{380:(e,s,n)=>{n.r(s),n.d(s,{assets:()=>d,contentTitle:()=>o,default:()=>h,frontMatter:()=>i,metadata:()=>a,toc:()=>l});var r=n(5893),t=n(1151);const i={sidebar_label:"Requirements"},o="Zealot Self Hosted Requirements",a={id:"self-hosted/deployment/requirements",title:"Zealot Self Hosted Requirements",description:"This page incldues useful information on the requirements that are needed to install and run Zealot on your servers.",source:"@site/versioned_docs/version-5.2.0/self-hosted/deployment/requirements.md",sourceDirName:"self-hosted/deployment",slug:"/self-hosted/deployment/requirements",permalink:"/docs/self-hosted/deployment/requirements",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.2.0/self-hosted/deployment/requirements.md",tags:[],version:"5.2.0",frontMatter:{sidebar_label:"Requirements"},sidebar:"selfHosted",previous:{title:"Architecture",permalink:"/docs/self-hosted/deployment/architecture"},next:{title:"On-premise (Docker)",permalink:"/docs/self-hosted/deployment/docker"}},d={},l=[{value:"Operating Systems",id:"operating-systems",level:2},{value:"Hardware requirements",id:"hardware-requirements",level:2},{value:"Architecture",id:"architecture",level:3},{value:"CPU",id:"cpu",level:3},{value:"Memory",id:"memory",level:3},{value:"Storage",id:"storage",level:3},{value:"Software requirements",id:"software-requirements",level:2},{value:"Ruby versions",id:"ruby-versions",level:3},{value:"Node.js versions",id:"nodejs-versions",level:3},{value:"Database",id:"database",level:2},{value:"PostgreSQL Requirements",id:"postgresql-requirements",level:3},{value:"Redis",id:"redis",level:3},{value:"Sidekiq",id:"sidekiq",level:2},{value:"Supported web browsers",id:"supported-web-browsers",level:2}];function c(e){const s={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",input:"input",li:"li",p:"p",strong:"strong",ul:"ul",...(0,t.a)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(s.h1,{id:"zealot-self-hosted-requirements",children:"Zealot Self Hosted Requirements"}),"\n",(0,r.jsx)(s.p,{children:"This page incldues useful information on the requirements that are needed to install and run Zealot on your servers."}),"\n",(0,r.jsx)(s.h2,{id:"operating-systems",children:"Operating Systems"}),"\n",(0,r.jsx)(s.p,{children:"Installation of Zealot is possible on most Linux environments, but not officially supported."}),"\n",(0,r.jsx)(s.h2,{id:"hardware-requirements",children:"Hardware requirements"}),"\n",(0,r.jsx)(s.h3,{id:"architecture",children:"Architecture"}),"\n",(0,r.jsx)(s.p,{children:"Zealot can now run on either x86_64(amd86) or arm64(armv8/arrch) or armv7 based mostly Linux OS, for example: Debian, Ubuntu, CentOS, Arch Linux, Armbian etc."}),"\n",(0,r.jsx)(s.h3,{id:"cpu",children:"CPU"}),"\n",(0,r.jsx)(s.p,{children:"CPU requirements are dependent on the usage and expected workload. Your workload is influenced by factors such as - but not limited to - how many apps and debug files are uploaded and parsed, how many apps are downloaded, how many web hooks are triggered, how often Apple developers sync test devices, and how much and how often backup schedule jobs are made."}),"\n",(0,r.jsx)(s.p,{children:"The following is the recommended minimum CPU hardware guidance for a handful of example Zealot conversation base sizes."}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsxs)(s.li,{children:[(0,r.jsx)(s.strong,{children:"1 cores"})," is the ",(0,r.jsx)(s.strong,{children:"required"})," minimum number of cores."]}),"\n"]}),"\n",(0,r.jsx)(s.h3,{id:"memory",children:"Memory"}),"\n",(0,r.jsx)(s.p,{children:"Memory requirements are dependent on the usage and expected workload. Your workload is influenced by factors such as - but not limited to - how many apps and debug files are uploaded and parsed, how many apps are downloaded, how many web hooks are triggered, how often Apple developers sync test devices, and how much and how often backup schedule jobs are made."}),"\n",(0,r.jsx)(s.p,{children:"The following is the recommended minimum Memory hardware guidance for a handful of example Zealot conversation base sizes."}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsxs)(s.li,{children:[(0,r.jsx)(s.strong,{children:"512MB RAM"})," is the ",(0,r.jsx)(s.strong,{children:"required"})," minimum memory size."]}),"\n"]}),"\n",(0,r.jsx)(s.h3,{id:"storage",children:"Storage"}),"\n",(0,r.jsx)(s.p,{children:"The necessary hard drive space largely depends on the size and number of apps and debug files uploaded, also include backup files."}),"\n",(0,r.jsx)(s.h2,{id:"software-requirements",children:"Software requirements"}),"\n",(0,r.jsx)(s.h3,{id:"ruby-versions",children:"Ruby versions"}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsx)(s.li,{children:"Ruby 3.0 and later is required."}),"\n"]}),"\n",(0,r.jsx)(s.p,{children:"You must use the standard MRI implementation of Ruby. Zealot needs several Gems that have native extensions."}),"\n",(0,r.jsx)(s.h3,{id:"nodejs-versions",children:"Node.js versions"}),"\n",(0,r.jsxs)(s.p,{children:["Zealot uses ",(0,r.jsx)(s.a,{href:"https://esbuild.github.io/",children:"esbuild"})," and ",(0,r.jsx)(s.a,{href:"https://sass-lang.com/",children:"sass"})," to compile frontend assets."]}),"\n",(0,r.jsx)(s.p,{children:"We recommend Node 14.x or higher version, as it's faster."}),"\n",(0,r.jsxs)(s.p,{children:["You can check which version you're running with ",(0,r.jsx)(s.code,{children:"node -v"}),". If you're running a version older than ",(0,r.jsx)(s.code,{children:"v8.0"}),",\nyou need to update it to a newer version. You can find instructions to install from community maintained packages or compile from source at the ",(0,r.jsx)(s.a,{href:"https://nodejs.org/en/download/",children:"Node.js website"}),"."]}),"\n",(0,r.jsx)(s.h2,{id:"database",children:"Database"}),"\n",(0,r.jsx)(s.p,{children:"PostgreSQL is the only supported database. We don't have plans to support any other alternatives as of now."}),"\n",(0,r.jsx)(s.h3,{id:"postgresql-requirements",children:"PostgreSQL Requirements"}),"\n",(0,r.jsxs)(s.p,{children:["The server running PostgreSQL should have ",(0,r.jsx)(s.em,{children:"at least"})," 5-10 GB of storage\navailable, though the exact requirements depends on the usage on your Zealot Instance."]}),"\n",(0,r.jsx)(s.p,{children:"We highly recommend using the latest stable PostgreSQL versions as these were used for development and testing."}),"\n",(0,r.jsx)(s.h3,{id:"redis",children:"Redis"}),"\n",(0,r.jsx)(s.p,{children:"Redis stores the background task queue and various Zealot configurations cached.\nThe storage requirements for Redis are minimal, You can start with 50MB and scale up as required."}),"\n",(0,r.jsx)(s.p,{children:"Redis version 6.2 or higher version is recommended"}),"\n",(0,r.jsx)(s.h2,{id:"sidekiq",children:"Sidekiq"}),"\n",(0,r.jsx)(s.p,{children:"Sidekiq processes the background jobs with a multi-threaded process.\nThis process starts with the entire Rails stack but it can grow over time due to memory leaks.\nOn a very active server the Sidekiq process can use 1GB+ of memory."}),"\n",(0,r.jsx)(s.h2,{id:"supported-web-browsers",children:"Supported web browsers"}),"\n",(0,r.jsx)(s.admonition,{type:"tip",children:(0,r.jsx)(s.p,{children:"We don't support running Zealot with JavaScript disabled in the browser."})}),"\n",(0,r.jsx)(s.p,{children:"Zealot supports the following web browsers:"}),"\n",(0,r.jsxs)(s.ul,{className:"contains-task-list",children:["\n",(0,r.jsxs)(s.li,{className:"task-list-item",children:[(0,r.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ",(0,r.jsx)(s.a,{href:"https://www.mozilla.org/en-US/firefox/new/",children:"Mozilla Firefox"})]}),"\n",(0,r.jsxs)(s.li,{className:"task-list-item",children:[(0,r.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ",(0,r.jsx)(s.a,{href:"https://www.google.com/chrome/",children:"Google Chrome"})]}),"\n",(0,r.jsxs)(s.li,{className:"task-list-item",children:[(0,r.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ",(0,r.jsx)(s.a,{href:"https://www.chromium.org/getting-involved/dev-channel",children:"Chromium"})]}),"\n",(0,r.jsxs)(s.li,{className:"task-list-item",children:[(0,r.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ",(0,r.jsx)(s.a,{href:"https://www.apple.com/safari/",children:"Apple Safari"})]}),"\n",(0,r.jsxs)(s.li,{className:"task-list-item",children:[(0,r.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ",(0,r.jsx)(s.a,{href:"https://www.microsoft.com/en-us/edge",children:"Microsoft Edge"})]}),"\n"]})]})}function h(e={}){const{wrapper:s}={...(0,t.a)(),...e.components};return s?(0,r.jsx)(s,{...e,children:(0,r.jsx)(c,{...e})}):c(e)}},1151:(e,s,n)=>{n.d(s,{Z:()=>a,a:()=>o});var r=n(7294);const t={},i=r.createContext(t);function o(e){const s=r.useContext(i);return r.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function a(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:o(e.components),r.createElement(i.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/4df62f41.670fb5e4.js b/assets/js/4df62f41.670fb5e4.js new file mode 100644 index 000000000..5237d05cd --- /dev/null +++ b/assets/js/4df62f41.670fb5e4.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[9314],{8926:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>u,contentTitle:()=>i,default:()=>l,frontMatter:()=>r,metadata:()=>c,toc:()=>d});var o=n(5893),s=n(1151);const r={},i="Q&A",c={id:"user-guide/qa",title:"Q&A",description:"TODO",source:"@site/versioned_docs/version-5.1.0/user-guide/qa.md",sourceDirName:"user-guide",slug:"/user-guide/qa",permalink:"/docs/5.1.0/user-guide/qa",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.1.0/user-guide/qa.md",tags:[],version:"5.1.0",frontMatter:{},sidebar:"userGuide",previous:{title:"Change Log",permalink:"/docs/5.1.0/user-guide/changelog"},next:{title:"Credits",permalink:"/docs/5.1.0/user-guide/credits"}},u={},d=[];function a(e){const t={blockquote:"blockquote",h1:"h1",p:"p",...(0,s.a)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.h1,{id:"qa",children:"Q&A"}),"\n",(0,o.jsxs)(t.blockquote,{children:["\n",(0,o.jsx)(t.p,{children:"TODO"}),"\n"]})]})}function l(e={}){const{wrapper:t}={...(0,s.a)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(a,{...e})}):a(e)}},1151:(e,t,n)=>{n.d(t,{Z:()=>c,a:()=>i});var o=n(7294);const s={},r=o.createContext(s);function i(e){const t=o.useContext(r);return o.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:i(e.components),o.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/4e1621ab.ab597c5f.js b/assets/js/4e1621ab.ab597c5f.js new file mode 100644 index 000000000..c6af7c4e5 --- /dev/null +++ b/assets/js/4e1621ab.ab597c5f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[8262],{1968:(e,n,o)=>{o.r(n),o.d(n,{assets:()=>c,contentTitle:()=>l,default:()=>u,frontMatter:()=>i,metadata:()=>r,toc:()=>a});var s=o(5893),t=o(1151);const i={},l="Schedule Jobs",r={id:"self-hosted/configuration/schedule-jobs",title:"Schedule Jobs",description:"Clean old version builds",source:"@site/versioned_docs/version-5.2.0/self-hosted/configuration/schedule-jobs.md",sourceDirName:"self-hosted/configuration",slug:"/self-hosted/configuration/schedule-jobs",permalink:"/docs/self-hosted/configuration/schedule-jobs",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.2.0/self-hosted/configuration/schedule-jobs.md",tags:[],version:"5.2.0",frontMatter:{},sidebar:"selfHosted",previous:{title:"Third-party Authentication",permalink:"/docs/self-hosted/configuration/third-party-authentication"},next:{title:"Data storages",permalink:"/docs/self-hosted/storage"}},c={},a=[{value:"Clean old version builds",id:"clean-old-version-builds",level:2},{value:"Backup",id:"backup",level:2}];function d(e){const n={a:"a",admonition:"admonition",blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",p:"p",pre:"pre",...(0,t.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h1,{id:"schedule-jobs",children:"Schedule Jobs"}),"\n",(0,s.jsx)(n.h2,{id:"clean-old-version-builds",children:"Clean old version builds"}),"\n",(0,s.jsx)(n.p,{children:"A reliable logic for cleaning up old versions is to keep an eye on all uploaded\nversions of the current master version, as observed by project maintainers over time."}),"\n",(0,s.jsx)(n.p,{children:"Previously uploaded historical versions only need to keep the last uploaded build\nversion basically to meet the vast majority of cases, for example:"}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsxs)(n.p,{children:["Additional: the current logic is relatively trouble-free but inflexible, in fact,\nthere is thought to support a variety of processing logic, see ",(0,s.jsx)(n.a,{href:"https://github.com/tryzealot/zealot/issues/376",children:"https://github.com/tryzealot/zealot/issues/376"})]}),"\n"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"- 2.0\n - 3\n - 2\n - 1\n- 1.0.1\n - 10\n - 9\n - 8\n ...\n- 1.0\n - 5\n - 4\n - 3\n ...\n"})}),"\n",(0,s.jsx)(n.p,{children:"The task will clean up all versions up to version 1.0.1 containing 9 and version 1.0 containing 4,\nleaving the final version file as follows:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"- 2.0\n - 3\n - 2\n - 1\n- 1.0.1\n - 10\n- 1.0\n - 5\n"})}),"\n",(0,s.jsxs)(n.p,{children:["If disk space is limited, you can enable cleanup of timed tasks by setting the environment variable ",(0,s.jsx)(n.code,{children:"ZEALOT_KEEP_UPLOADS=false"}),"."]}),"\n",(0,s.jsx)(n.admonition,{type:"info",children:(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"ZEALOT_KEEP_UPLOADS"})," set ",(0,s.jsx)(n.code,{children:"true"})," by default."]})}),"\n",(0,s.jsx)(n.h2,{id:"backup",children:"Backup"}),"\n",(0,s.jsx)(n.p,{children:"When you create any backup it will join itself to the schedule job list."})]})}function u(e={}){const{wrapper:n}={...(0,t.a)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}},1151:(e,n,o)=>{o.d(n,{Z:()=>r,a:()=>l});var s=o(7294);const t={},i=s.createContext(t);function l(e){const n=s.useContext(i);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:l(e.components),s.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/514e9e1f.393ab910.js b/assets/js/514e9e1f.393ab910.js deleted file mode 100644 index 0023c31bd..000000000 --- a/assets/js/514e9e1f.393ab910.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[3368],{5018:(e,n,a)=>{a.r(n),a.d(n,{assets:()=>i,contentTitle:()=>s,default:()=>u,frontMatter:()=>l,metadata:()=>r,toc:()=>d});var o=a(5893),t=a(1151);const l={sidebar_label:"zealot"},s="Fastlane action: zealot",r={id:"developer-guide/fastlane/zealot",title:"Fastlane action: zealot",description:"Uploading iOS, Android and macOS app, it requires three params:",source:"@site/versioned_docs/version-5.1.0/developer-guide/fastlane/zealot.md",sourceDirName:"developer-guide/fastlane",slug:"/developer-guide/fastlane/zealot",permalink:"/docs/developer-guide/fastlane/zealot",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.1.0/developer-guide/fastlane/zealot.md",tags:[],version:"5.1.0",frontMatter:{sidebar_label:"zealot"},sidebar:"developerGuide",previous:{title:"Fastlane plugins",permalink:"/docs/developer-guide/fastlane"},next:{title:"zealot_version_check",permalink:"/docs/developer-guide/fastlane/zealot_version_check"}},i={},d=[{value:"Parameters",id:"parameters",level:2},{value:"Output Variables",id:"output-variables",level:2}];function p(e){const n={code:"code",h1:"h1",h2:"h2",p:"p",pre:"pre",...(0,t.a)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.h1,{id:"fastlane-action-zealot",children:"Fastlane action: zealot"}),"\n",(0,o.jsx)(n.p,{children:"Uploading iOS, Android and macOS app, it requires three params:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-ruby",children:"zealot(\n endpoint: 'https://zealot.com',\n token: '...',\n channel_key: '...',\n)\n"})}),"\n",(0,o.jsx)(n.h2,{id:"parameters",children:"Parameters"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:"+-----------------+---------------------------------+------------------------+----------+\n| zealot Options |\n+-----------------+---------------------------------+------------------------+----------+\n| Key | Description | Env Var | Default |\n+-----------------+---------------------------------+------------------------+----------+\n| endpoint | The endpoint of zealot | ZEALOT_ENDPOINT | |\n| token | The token of user | ZEALOT_TOKEN | |\n| channel_key | The key of app's channel | ZEALOT_CHANNEL_KEY | |\n| file | The path of app file. Optional | ZEALOT_FILE | |\n| | if you use the `gym`, `ipa`, | | |\n| | `xcodebuild` or `gradle` | | |\n| | action. | | |\n| name | The name of app to display on | ZEALOT_NAME | |\n| | zealot | | |\n| changelog | The changelog of app | ZEALOT_CHANGELOG | |\n| slug | The slug of app | ZEALOT_SLUG | |\n| release_type | The release type of app | ZEALOT_RELEASE_TYPE | |\n| branch | The name of git branch | ZEALOT_BRANCH | |\n| git_commit | The hash of git commit | ZEALOT_GIT_COMMIT | |\n| custom_fields | The key-value hash of custom | ZEALOT_CUSTOM_FIELDS | |\n| | fields | | |\n| password | The password of app to download | ZEALOT_PASSWORD | |\n| source | The name of upload source | ZEALOT_SOURCE | fastlane |\n| ci_url | The name of upload source | ZEALOT_CI_CURL | |\n| timeout | Request timeout in seconds | ZEALOT_TIMEOUT | |\n| hide_user_token | replase user token to *** to | ZEALOT_HIDE_USER_TOKEN | true |\n| | keep secret | | |\n| verify_ssl | Should verify SSL of zealot | ZEALOT_VERIFY_SSL | true |\n| | service | | |\n| fail_on_error | Should an error uploading app | ZEALOT_FAIL_ON_ERROR | false |\n| | cause a failure | | |\n+-----------------+---------------------------------+------------------------+----------+\n* = default value is dependent on the user's system\n\n+-----------------------+---------------------------------------------+\n| zealot Output Variables |\n+-----------------------+---------------------------------------------+\n| Key | Description |\n+-----------------------+---------------------------------------------+\n| ZEALOT_APP_ID | The id of app |\n| ZEALOT_RELEASE_ID | The id of app's release |\n| ZEALOT_RELEASE_URL | The release URL of the newly uploaded build |\n| ZEALOT_INSTALL_URL | The install URL of the newly uploaded build |\n| ZEALOT_QRCODE_URL | The QRCode URL of the newly uploaded build |\n| ZEAALOT_ERROR_MESSAGE | The error message during upload process |\n+-----------------------+---------------------------------------------+\n"})}),"\n",(0,o.jsx)(n.h2,{id:"output-variables",children:"Output Variables"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:"+-----------------------+---------------------------------------------+\n| zealot Output Variables |\n+-----------------------+---------------------------------------------+\n| Key | Description |\n+-----------------------+---------------------------------------------+\n| ZEALOT_APP_ID | The id of app |\n| ZEALOT_RELEASE_ID | The id of app's release |\n| ZEALOT_RELEASE_URL | The release URL of the newly uploaded build |\n| ZEALOT_INSTALL_URL | The install URL of the newly uploaded build |\n| ZEALOT_QRCODE_URL | The QRCode URL of the newly uploaded build |\n| ZEAALOT_ERROR_MESSAGE | The error message during upload process |\n+-----------------------+---------------------------------------------+\nAccess the output values using `lane_context[SharedValues::VARIABLE_NAME]`\n"})})]})}function u(e={}){const{wrapper:n}={...(0,t.a)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(p,{...e})}):p(e)}},1151:(e,n,a)=>{a.d(n,{Z:()=>r,a:()=>s});var o=a(7294);const t={},l=o.createContext(t);function s(e){const n=o.useContext(l);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:s(e.components),o.createElement(l.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/514e9e1f.fc5fae72.js b/assets/js/514e9e1f.fc5fae72.js new file mode 100644 index 000000000..e219ad2e5 --- /dev/null +++ b/assets/js/514e9e1f.fc5fae72.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[3368],{5018:(e,n,a)=>{a.r(n),a.d(n,{assets:()=>i,contentTitle:()=>s,default:()=>u,frontMatter:()=>l,metadata:()=>r,toc:()=>d});var o=a(5893),t=a(1151);const l={sidebar_label:"zealot"},s="Fastlane action: zealot",r={id:"developer-guide/fastlane/zealot",title:"Fastlane action: zealot",description:"Uploading iOS, Android and macOS app, it requires three params:",source:"@site/versioned_docs/version-5.1.0/developer-guide/fastlane/zealot.md",sourceDirName:"developer-guide/fastlane",slug:"/developer-guide/fastlane/zealot",permalink:"/docs/5.1.0/developer-guide/fastlane/zealot",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.1.0/developer-guide/fastlane/zealot.md",tags:[],version:"5.1.0",frontMatter:{sidebar_label:"zealot"},sidebar:"developerGuide",previous:{title:"Fastlane plugins",permalink:"/docs/5.1.0/developer-guide/fastlane"},next:{title:"zealot_version_check",permalink:"/docs/5.1.0/developer-guide/fastlane/zealot_version_check"}},i={},d=[{value:"Parameters",id:"parameters",level:2},{value:"Output Variables",id:"output-variables",level:2}];function p(e){const n={code:"code",h1:"h1",h2:"h2",p:"p",pre:"pre",...(0,t.a)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.h1,{id:"fastlane-action-zealot",children:"Fastlane action: zealot"}),"\n",(0,o.jsx)(n.p,{children:"Uploading iOS, Android and macOS app, it requires three params:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-ruby",children:"zealot(\n endpoint: 'https://zealot.com',\n token: '...',\n channel_key: '...',\n)\n"})}),"\n",(0,o.jsx)(n.h2,{id:"parameters",children:"Parameters"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:"+-----------------+---------------------------------+------------------------+----------+\n| zealot Options |\n+-----------------+---------------------------------+------------------------+----------+\n| Key | Description | Env Var | Default |\n+-----------------+---------------------------------+------------------------+----------+\n| endpoint | The endpoint of zealot | ZEALOT_ENDPOINT | |\n| token | The token of user | ZEALOT_TOKEN | |\n| channel_key | The key of app's channel | ZEALOT_CHANNEL_KEY | |\n| file | The path of app file. Optional | ZEALOT_FILE | |\n| | if you use the `gym`, `ipa`, | | |\n| | `xcodebuild` or `gradle` | | |\n| | action. | | |\n| name | The name of app to display on | ZEALOT_NAME | |\n| | zealot | | |\n| changelog | The changelog of app | ZEALOT_CHANGELOG | |\n| slug | The slug of app | ZEALOT_SLUG | |\n| release_type | The release type of app | ZEALOT_RELEASE_TYPE | |\n| branch | The name of git branch | ZEALOT_BRANCH | |\n| git_commit | The hash of git commit | ZEALOT_GIT_COMMIT | |\n| custom_fields | The key-value hash of custom | ZEALOT_CUSTOM_FIELDS | |\n| | fields | | |\n| password | The password of app to download | ZEALOT_PASSWORD | |\n| source | The name of upload source | ZEALOT_SOURCE | fastlane |\n| ci_url | The name of upload source | ZEALOT_CI_CURL | |\n| timeout | Request timeout in seconds | ZEALOT_TIMEOUT | |\n| hide_user_token | replase user token to *** to | ZEALOT_HIDE_USER_TOKEN | true |\n| | keep secret | | |\n| verify_ssl | Should verify SSL of zealot | ZEALOT_VERIFY_SSL | true |\n| | service | | |\n| fail_on_error | Should an error uploading app | ZEALOT_FAIL_ON_ERROR | false |\n| | cause a failure | | |\n+-----------------+---------------------------------+------------------------+----------+\n* = default value is dependent on the user's system\n\n+-----------------------+---------------------------------------------+\n| zealot Output Variables |\n+-----------------------+---------------------------------------------+\n| Key | Description |\n+-----------------------+---------------------------------------------+\n| ZEALOT_APP_ID | The id of app |\n| ZEALOT_RELEASE_ID | The id of app's release |\n| ZEALOT_RELEASE_URL | The release URL of the newly uploaded build |\n| ZEALOT_INSTALL_URL | The install URL of the newly uploaded build |\n| ZEALOT_QRCODE_URL | The QRCode URL of the newly uploaded build |\n| ZEAALOT_ERROR_MESSAGE | The error message during upload process |\n+-----------------------+---------------------------------------------+\n"})}),"\n",(0,o.jsx)(n.h2,{id:"output-variables",children:"Output Variables"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:"+-----------------------+---------------------------------------------+\n| zealot Output Variables |\n+-----------------------+---------------------------------------------+\n| Key | Description |\n+-----------------------+---------------------------------------------+\n| ZEALOT_APP_ID | The id of app |\n| ZEALOT_RELEASE_ID | The id of app's release |\n| ZEALOT_RELEASE_URL | The release URL of the newly uploaded build |\n| ZEALOT_INSTALL_URL | The install URL of the newly uploaded build |\n| ZEALOT_QRCODE_URL | The QRCode URL of the newly uploaded build |\n| ZEAALOT_ERROR_MESSAGE | The error message during upload process |\n+-----------------------+---------------------------------------------+\nAccess the output values using `lane_context[SharedValues::VARIABLE_NAME]`\n"})})]})}function u(e={}){const{wrapper:n}={...(0,t.a)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(p,{...e})}):p(e)}},1151:(e,n,a)=>{a.d(n,{Z:()=>r,a:()=>s});var o=a(7294);const t={},l=o.createContext(t);function s(e){const n=o.useContext(l);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:s(e.components),o.createElement(l.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/571c2576.92c3bfa2.js b/assets/js/51ff7b2c.8f82eed4.js similarity index 96% rename from assets/js/571c2576.92c3bfa2.js rename to assets/js/51ff7b2c.8f82eed4.js index 54d9a780b..70ee64e36 100644 --- a/assets/js/571c2576.92c3bfa2.js +++ b/assets/js/51ff7b2c.8f82eed4.js @@ -1 +1 @@ -"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[2980],{2363:(e,n,o)=>{o.r(n),o.d(n,{assets:()=>s,contentTitle:()=>l,default:()=>p,frontMatter:()=>i,metadata:()=>r,toc:()=>d});var t=o(5893),a=o(1151);const i={sidebar_label:"zealot_debug_file"},l="Fastlane action: zealot_debug_file",r={id:"developer-guide/fastlane/zealot_debug_file",title:"Fastlane action: zealot_debug_file",description:"Upload iOS dSYM or Android Proguard file(s) to Zealot",source:"@site/versioned_docs/version-5.1.0/developer-guide/fastlane/zealot_debug_file.md",sourceDirName:"developer-guide/fastlane",slug:"/developer-guide/fastlane/zealot_debug_file",permalink:"/docs/developer-guide/fastlane/zealot_debug_file",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.1.0/developer-guide/fastlane/zealot_debug_file.md",tags:[],version:"5.1.0",frontMatter:{sidebar_label:"zealot_debug_file"},sidebar:"developerGuide",previous:{title:"zealot_version_check",permalink:"/docs/developer-guide/fastlane/zealot_version_check"},next:{title:"zealot_sync_devices",permalink:"/docs/developer-guide/fastlane/zealot_sync_devices"}},s={},d=[{value:"Parameters",id:"parameters",level:2}];function _(e){const n={code:"code",h1:"h1",h2:"h2",p:"p",pre:"pre",...(0,a.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h1,{id:"fastlane-action-zealot_debug_file",children:"Fastlane action: zealot_debug_file"}),"\n",(0,t.jsx)(n.p,{children:"Upload iOS dSYM or Android Proguard file(s) to Zealot"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-ruby",children:" # Upload iOS dSYM file\n zealot_debug_file(\n endpoint: 'https://tryzealot.ews.im',\n token: '...',\n channel_key: '...',\n platform: :ios,\n xcode_scheme: 'AppName',\n verify_ssl: false\n )\n\n # Upload Android Proguard files\n zealot_debug_file(\n endpoint: 'https://tryzealot.ews.im',\n token: '...',\n channel_key: '...',\n platform: :android,\n android_build_type: 'release',\n android_flavor: 'store',\n release_version: '1.1.0',\n build_version: '1',\n overwrite: true\n )\n\n # Upload given zip file\n zealot_debug_file(\n endpoint: 'https://tryzealot.ews.im',\n token: '...',\n channel_key: '...',\n zip_file: 'path/to/your/zip_file',\n release_version: '1.1.0',\n build_version: '1',\n verify_ssl: false\n )\n"})}),"\n",(0,t.jsx)(n.h2,{id:"parameters",children:"Parameters"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"+--------------------+-----------------------------------+---------------------------+---------+\n| zealot_debug_file Options |\n+--------------------+-----------------------------------+---------------------------+---------+\n| Key | Description | Env Var | Default |\n+--------------------+-----------------------------------+---------------------------+---------+\n| endpoint | The endpoint of zealot | ZEALOT_ENDPOINT | |\n| token | The token of user | ZEALOT_TOKEN | |\n| channel_key | Any channel key of app | ZEALOT_CHANNEL_KEY | |\n| zip_file | Using given the path of zip file | DF_DSYM_ZIP_FILE | |\n| | to direct upload | | |\n| platform | The name of platfrom, avaiable | ZEALOT_PLATFORM | |\n| | value are | | |\n| | ios,mac,macos,osx,android | | |\n| path | The path of debug file | ZEALOT_PATH | |\n| | (iOS/macOS is archive path for | | |\n| | Xcode, Android is path for app | | |\n| | project) | | |\n| xcode_scheme | The scheme name of app | ZEALOT_XCODE_SCHEME | |\n| android_build_type | The build type of app | ZEALOT_ANDROID_BUILD_TYPE | release |\n| android_flavor | The product flavor of app | ZEALOT_ANDROID_FLAVOR | |\n| extra_files | A set file names | ZEALOT_EXTRA_FILES | [] |\n| output_path | The output path of compressed | DF_DSYM_OUTPUT_PATH | . |\n| | dSYM file | | |\n| release_version | The release version of app | ZEALOT_RELEASE_VERSION | |\n| | (Android needs) | | |\n| build_version | The build version of app | ZEALOT_BUILD_VERSION | |\n| | (Android needs) | | |\n| overwrite | Overwrite output compressed file | DF_DSYM_OVERWRITE | false |\n| | if it existed | | |\n| timeout | Request timeout in seconds | ZEALOT_TIMEOUT | |\n| verify_ssl | Should verify SSL of zealot | ZEALOT_VERIFY_SSL | true |\n| | service | | |\n| fail_on_error | Should an error uploading app | ZEALOT_FAIL_ON_ERROR | false |\n| | cause a failure? (true/false) | | |\n+--------------------+-----------------------------------+---------------------------+---------+\n* = default value is dependent on the user's system\n\n+-----------------------+-----------------------------------------+\n| zealot_debug_file Output Variables |\n+-----------------------+-----------------------------------------+\n| Key | Description |\n+-----------------------+-----------------------------------------+\n| ZEAALOT_ERROR_MESSAGE | The error message during upload process |\n+-----------------------+-----------------------------------------+\n"})})]})}function p(e={}){const{wrapper:n}={...(0,a.a)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(_,{...e})}):_(e)}},1151:(e,n,o)=>{o.d(n,{Z:()=>r,a:()=>l});var t=o(7294);const a={},i=t.createContext(a);function l(e){const n=t.useContext(i);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:l(e.components),t.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[7328],{8987:(e,n,o)=>{o.r(n),o.d(n,{assets:()=>s,contentTitle:()=>l,default:()=>p,frontMatter:()=>i,metadata:()=>r,toc:()=>d});var t=o(5893),a=o(1151);const i={sidebar_label:"zealot_debug_file"},l="Fastlane action: zealot_debug_file",r={id:"developer-guide/fastlane/zealot_debug_file",title:"Fastlane action: zealot_debug_file",description:"Upload iOS dSYM or Android Proguard file(s) to Zealot",source:"@site/versioned_docs/version-5.2.0/developer-guide/fastlane/zealot_debug_file.md",sourceDirName:"developer-guide/fastlane",slug:"/developer-guide/fastlane/zealot_debug_file",permalink:"/docs/developer-guide/fastlane/zealot_debug_file",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.2.0/developer-guide/fastlane/zealot_debug_file.md",tags:[],version:"5.2.0",frontMatter:{sidebar_label:"zealot_debug_file"},sidebar:"developerGuide",previous:{title:"zealot_version_check",permalink:"/docs/developer-guide/fastlane/zealot_version_check"},next:{title:"zealot_sync_devices",permalink:"/docs/developer-guide/fastlane/zealot_sync_devices"}},s={},d=[{value:"Parameters",id:"parameters",level:2}];function _(e){const n={code:"code",h1:"h1",h2:"h2",p:"p",pre:"pre",...(0,a.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h1,{id:"fastlane-action-zealot_debug_file",children:"Fastlane action: zealot_debug_file"}),"\n",(0,t.jsx)(n.p,{children:"Upload iOS dSYM or Android Proguard file(s) to Zealot"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-ruby",children:" # Upload iOS dSYM file\n zealot_debug_file(\n endpoint: 'https://tryzealot.ews.im',\n token: '...',\n channel_key: '...',\n platform: :ios,\n xcode_scheme: 'AppName',\n verify_ssl: false\n )\n\n # Upload Android Proguard files\n zealot_debug_file(\n endpoint: 'https://tryzealot.ews.im',\n token: '...',\n channel_key: '...',\n platform: :android,\n android_build_type: 'release',\n android_flavor: 'store',\n release_version: '1.1.0',\n build_version: '1',\n overwrite: true\n )\n\n # Upload given zip file\n zealot_debug_file(\n endpoint: 'https://tryzealot.ews.im',\n token: '...',\n channel_key: '...',\n zip_file: 'path/to/your/zip_file',\n release_version: '1.1.0',\n build_version: '1',\n verify_ssl: false\n )\n"})}),"\n",(0,t.jsx)(n.h2,{id:"parameters",children:"Parameters"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"+--------------------+-----------------------------------+---------------------------+---------+\n| zealot_debug_file Options |\n+--------------------+-----------------------------------+---------------------------+---------+\n| Key | Description | Env Var | Default |\n+--------------------+-----------------------------------+---------------------------+---------+\n| endpoint | The endpoint of zealot | ZEALOT_ENDPOINT | |\n| token | The token of user | ZEALOT_TOKEN | |\n| channel_key | Any channel key of app | ZEALOT_CHANNEL_KEY | |\n| zip_file | Using given the path of zip file | DF_DSYM_ZIP_FILE | |\n| | to direct upload | | |\n| platform | The name of platfrom, avaiable | ZEALOT_PLATFORM | |\n| | value are | | |\n| | ios,mac,macos,osx,android | | |\n| path | The path of debug file | ZEALOT_PATH | |\n| | (iOS/macOS is archive path for | | |\n| | Xcode, Android is path for app | | |\n| | project) | | |\n| xcode_scheme | The scheme name of app | ZEALOT_XCODE_SCHEME | |\n| android_build_type | The build type of app | ZEALOT_ANDROID_BUILD_TYPE | release |\n| android_flavor | The product flavor of app | ZEALOT_ANDROID_FLAVOR | |\n| extra_files | A set file names | ZEALOT_EXTRA_FILES | [] |\n| output_path | The output path of compressed | DF_DSYM_OUTPUT_PATH | . |\n| | dSYM file | | |\n| release_version | The release version of app | ZEALOT_RELEASE_VERSION | |\n| | (Android needs) | | |\n| build_version | The build version of app | ZEALOT_BUILD_VERSION | |\n| | (Android needs) | | |\n| overwrite | Overwrite output compressed file | DF_DSYM_OVERWRITE | false |\n| | if it existed | | |\n| timeout | Request timeout in seconds | ZEALOT_TIMEOUT | |\n| verify_ssl | Should verify SSL of zealot | ZEALOT_VERIFY_SSL | true |\n| | service | | |\n| fail_on_error | Should an error uploading app | ZEALOT_FAIL_ON_ERROR | false |\n| | cause a failure? (true/false) | | |\n+--------------------+-----------------------------------+---------------------------+---------+\n* = default value is dependent on the user's system\n\n+-----------------------+-----------------------------------------+\n| zealot_debug_file Output Variables |\n+-----------------------+-----------------------------------------+\n| Key | Description |\n+-----------------------+-----------------------------------------+\n| ZEAALOT_ERROR_MESSAGE | The error message during upload process |\n+-----------------------+-----------------------------------------+\n"})})]})}function p(e={}){const{wrapper:n}={...(0,a.a)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(_,{...e})}):_(e)}},1151:(e,n,o)=>{o.d(n,{Z:()=>r,a:()=>l});var t=o(7294);const a={},i=t.createContext(a);function l(e){const n=t.useContext(i);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:l(e.components),t.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/57006c40.b5b8d1e2.js b/assets/js/57006c40.b5b8d1e2.js new file mode 100644 index 000000000..6e4f9ff7e --- /dev/null +++ b/assets/js/57006c40.b5b8d1e2.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[7663],{9665:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>o,contentTitle:()=>s,default:()=>u,frontMatter:()=>i,metadata:()=>d,toc:()=>r});var l=t(5893),a=t(1151);const i={},s="Fastlane plugins",d={id:"developer-guide/fastlane",title:"Fastlane plugins",description:"Add Zealot plugin",source:"@site/versioned_docs/version-5.1.0/developer-guide/fastlane.md",sourceDirName:"developer-guide",slug:"/developer-guide/fastlane",permalink:"/docs/5.1.0/developer-guide/fastlane",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.1.0/developer-guide/fastlane.md",tags:[],version:"5.1.0",frontMatter:{},sidebar:"developerGuide",previous:{title:"Android",permalink:"/docs/5.1.0/developer-guide/sdk/android"},next:{title:"zealot",permalink:"/docs/5.1.0/developer-guide/fastlane/zealot"}},o={},r=[{value:"Add Zealot plugin",id:"add-zealot-plugin",level:2},{value:"More usefully plugins",id:"more-usefully-plugins",level:2}];function c(e){const n={a:"a",blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,a.a)(),...e.components};return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(n.h1,{id:"fastlane-plugins",children:"Fastlane plugins"}),"\n",(0,l.jsx)(n.h2,{id:"add-zealot-plugin",children:"Add Zealot plugin"}),"\n",(0,l.jsxs)(n.blockquote,{children:["\n",(0,l.jsxs)(n.p,{children:[(0,l.jsx)(n.a,{href:"https://fastlane.tools",children:"fastlane"})," is an open source platform aimed at simplifying Android and iOS deployment.\nfastlane lets you automate every aspect of your development and release workflow,\ncustomize your deployment workflows using the hundreds of community built fastlane actions and plugins."]}),"\n"]}),"\n",(0,l.jsxs)(n.p,{children:[(0,l.jsx)(n.a,{href:"https://github.com/tryzealot/fastlane-plugin-zealot",children:"fastlane-plugin-zealot"})," provides upload app, debug_file and\nversion check actions to Zealot, install it in shell\uff1a"]}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"$ fastlane add_plugin zealot\n"})}),"\n",(0,l.jsx)(n.h2,{id:"more-usefully-plugins",children:"More usefully plugins"}),"\n",(0,l.jsx)(n.p,{children:"In addition, as the author of the project also open source a number of other fastlane plug-ins there is always one you will use:"}),"\n",(0,l.jsxs)(n.table,{children:[(0,l.jsx)(n.thead,{children:(0,l.jsxs)(n.tr,{children:[(0,l.jsx)(n.th,{children:"Plugin"}),(0,l.jsx)(n.th,{children:"Description"})]})}),(0,l.jsxs)(n.tbody,{children:[(0,l.jsxs)(n.tr,{children:[(0,l.jsx)(n.td,{children:(0,l.jsx)(n.a,{href:"https://github.com/icyleaf/fastlane-plugin-ci_changelog",children:"fastlane-plugin-ci_changelog"})}),(0,l.jsx)(n.td,{children:"Automate generate changelog between previous and the latest commit of SCM during the CI services."})]}),(0,l.jsxs)(n.tr,{children:[(0,l.jsx)(n.td,{children:(0,l.jsx)(n.a,{href:"https://github.com/icyleaf/fastlane-plugin-update_jenkins_build",children:"fastlane-plugin-update_jenkins_build"})}),(0,l.jsx)(n.td,{children:"Update build's description of jenkins."})]}),(0,l.jsxs)(n.tr,{children:[(0,l.jsx)(n.td,{children:(0,l.jsx)(n.a,{href:"https://github.com/icyleaf/fastlane-plugin-humanable_build_number",children:"fastlane-plugin-humanable_build_number"})}),(0,l.jsx)(n.td,{children:"Automatic generate app build number unque and human readable friendly"})]}),(0,l.jsxs)(n.tr,{children:[(0,l.jsx)(n.td,{children:(0,l.jsx)(n.a,{href:"https://github.com/icyleaf/fastlane-plugin-app_info",children:"fastlane-plugin-app_info"})}),(0,l.jsx)(n.td,{children:"Teardown tool for mobile app(ipa, apk and aab file), analysis metedata like version, name, icon etc."})]}),(0,l.jsxs)(n.tr,{children:[(0,l.jsx)(n.td,{children:(0,l.jsx)(n.a,{href:"https://github.com/icyleaf/fastlane-plugin-android_channels",children:"fastlane-plugin-android_channels"})}),(0,l.jsx)(n.td,{children:"Package unsign apk with channels and write empty file to META-INF with channel in general way"})]}),(0,l.jsxs)(n.tr,{children:[(0,l.jsx)(n.td,{children:(0,l.jsx)(n.a,{href:"https://github.com/icyleaf/fastlane-plugin-ram_disk",children:"fastlane-plugin-ram_disk"})}),(0,l.jsx)(n.td,{children:"Use a virtual ram disk to do anything else"})]})]})]})]})}function u(e={}){const{wrapper:n}={...(0,a.a)(),...e.components};return n?(0,l.jsx)(n,{...e,children:(0,l.jsx)(c,{...e})}):c(e)}},1151:(e,n,t)=>{t.d(n,{Z:()=>d,a:()=>s});var l=t(7294);const a={},i=l.createContext(a);function s(e){const n=l.useContext(i);return l.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function d(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:s(e.components),l.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/571c2576.5aaab98c.js b/assets/js/571c2576.5aaab98c.js new file mode 100644 index 000000000..d807a3aeb --- /dev/null +++ b/assets/js/571c2576.5aaab98c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[2980],{2363:(e,n,o)=>{o.r(n),o.d(n,{assets:()=>s,contentTitle:()=>l,default:()=>p,frontMatter:()=>i,metadata:()=>r,toc:()=>d});var t=o(5893),a=o(1151);const i={sidebar_label:"zealot_debug_file"},l="Fastlane action: zealot_debug_file",r={id:"developer-guide/fastlane/zealot_debug_file",title:"Fastlane action: zealot_debug_file",description:"Upload iOS dSYM or Android Proguard file(s) to Zealot",source:"@site/versioned_docs/version-5.1.0/developer-guide/fastlane/zealot_debug_file.md",sourceDirName:"developer-guide/fastlane",slug:"/developer-guide/fastlane/zealot_debug_file",permalink:"/docs/5.1.0/developer-guide/fastlane/zealot_debug_file",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.1.0/developer-guide/fastlane/zealot_debug_file.md",tags:[],version:"5.1.0",frontMatter:{sidebar_label:"zealot_debug_file"},sidebar:"developerGuide",previous:{title:"zealot_version_check",permalink:"/docs/5.1.0/developer-guide/fastlane/zealot_version_check"},next:{title:"zealot_sync_devices",permalink:"/docs/5.1.0/developer-guide/fastlane/zealot_sync_devices"}},s={},d=[{value:"Parameters",id:"parameters",level:2}];function _(e){const n={code:"code",h1:"h1",h2:"h2",p:"p",pre:"pre",...(0,a.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h1,{id:"fastlane-action-zealot_debug_file",children:"Fastlane action: zealot_debug_file"}),"\n",(0,t.jsx)(n.p,{children:"Upload iOS dSYM or Android Proguard file(s) to Zealot"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-ruby",children:" # Upload iOS dSYM file\n zealot_debug_file(\n endpoint: 'https://tryzealot.ews.im',\n token: '...',\n channel_key: '...',\n platform: :ios,\n xcode_scheme: 'AppName',\n verify_ssl: false\n )\n\n # Upload Android Proguard files\n zealot_debug_file(\n endpoint: 'https://tryzealot.ews.im',\n token: '...',\n channel_key: '...',\n platform: :android,\n android_build_type: 'release',\n android_flavor: 'store',\n release_version: '1.1.0',\n build_version: '1',\n overwrite: true\n )\n\n # Upload given zip file\n zealot_debug_file(\n endpoint: 'https://tryzealot.ews.im',\n token: '...',\n channel_key: '...',\n zip_file: 'path/to/your/zip_file',\n release_version: '1.1.0',\n build_version: '1',\n verify_ssl: false\n )\n"})}),"\n",(0,t.jsx)(n.h2,{id:"parameters",children:"Parameters"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"+--------------------+-----------------------------------+---------------------------+---------+\n| zealot_debug_file Options |\n+--------------------+-----------------------------------+---------------------------+---------+\n| Key | Description | Env Var | Default |\n+--------------------+-----------------------------------+---------------------------+---------+\n| endpoint | The endpoint of zealot | ZEALOT_ENDPOINT | |\n| token | The token of user | ZEALOT_TOKEN | |\n| channel_key | Any channel key of app | ZEALOT_CHANNEL_KEY | |\n| zip_file | Using given the path of zip file | DF_DSYM_ZIP_FILE | |\n| | to direct upload | | |\n| platform | The name of platfrom, avaiable | ZEALOT_PLATFORM | |\n| | value are | | |\n| | ios,mac,macos,osx,android | | |\n| path | The path of debug file | ZEALOT_PATH | |\n| | (iOS/macOS is archive path for | | |\n| | Xcode, Android is path for app | | |\n| | project) | | |\n| xcode_scheme | The scheme name of app | ZEALOT_XCODE_SCHEME | |\n| android_build_type | The build type of app | ZEALOT_ANDROID_BUILD_TYPE | release |\n| android_flavor | The product flavor of app | ZEALOT_ANDROID_FLAVOR | |\n| extra_files | A set file names | ZEALOT_EXTRA_FILES | [] |\n| output_path | The output path of compressed | DF_DSYM_OUTPUT_PATH | . |\n| | dSYM file | | |\n| release_version | The release version of app | ZEALOT_RELEASE_VERSION | |\n| | (Android needs) | | |\n| build_version | The build version of app | ZEALOT_BUILD_VERSION | |\n| | (Android needs) | | |\n| overwrite | Overwrite output compressed file | DF_DSYM_OVERWRITE | false |\n| | if it existed | | |\n| timeout | Request timeout in seconds | ZEALOT_TIMEOUT | |\n| verify_ssl | Should verify SSL of zealot | ZEALOT_VERIFY_SSL | true |\n| | service | | |\n| fail_on_error | Should an error uploading app | ZEALOT_FAIL_ON_ERROR | false |\n| | cause a failure? (true/false) | | |\n+--------------------+-----------------------------------+---------------------------+---------+\n* = default value is dependent on the user's system\n\n+-----------------------+-----------------------------------------+\n| zealot_debug_file Output Variables |\n+-----------------------+-----------------------------------------+\n| Key | Description |\n+-----------------------+-----------------------------------------+\n| ZEAALOT_ERROR_MESSAGE | The error message during upload process |\n+-----------------------+-----------------------------------------+\n"})})]})}function p(e={}){const{wrapper:n}={...(0,a.a)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(_,{...e})}):_(e)}},1151:(e,n,o)=>{o.d(n,{Z:()=>r,a:()=>l});var t=o(7294);const a={},i=t.createContext(a);function l(e){const n=t.useContext(i);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:l(e.components),t.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/58a04bdc.99907a38.js b/assets/js/58a04bdc.99907a38.js new file mode 100644 index 000000000..00c0c1865 --- /dev/null +++ b/assets/js/58a04bdc.99907a38.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[7073],{7586:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>r,contentTitle:()=>i,default:()=>p,frontMatter:()=>s,metadata:()=>l,toc:()=>c});var o=n(5893),a=n(1151);const s={sidebar_label:"zealot_sync_devices"},i="Fastlane action: zealot_sync_devices",l={id:"developer-guide/fastlane/zealot_sync_devices",title:"Fastlane action: zealot_sync_devices",description:"Zealot 4.5.0 built in Apple team manage which it use Apple API Key",source:"@site/versioned_docs/version-5.2.0/developer-guide/fastlane/zealot_sync_devices.md",sourceDirName:"developer-guide/fastlane",slug:"/developer-guide/fastlane/zealot_sync_devices",permalink:"/docs/developer-guide/fastlane/zealot_sync_devices",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.2.0/developer-guide/fastlane/zealot_sync_devices.md",tags:[],version:"5.2.0",frontMatter:{sidebar_label:"zealot_sync_devices"},sidebar:"developerGuide",previous:{title:"zealot_debug_file",permalink:"/docs/developer-guide/fastlane/zealot_debug_file"},next:{title:"APIs",permalink:"/docs/developer-guide/api"}},r={},c=[{value:"Parameters",id:"parameters",level:2}];function d(e){const t={a:"a",blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",p:"p",pre:"pre",...(0,a.a)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.h1,{id:"fastlane-action-zealot_sync_devices",children:"Fastlane action: zealot_sync_devices"}),"\n",(0,o.jsxs)(t.blockquote,{children:["\n",(0,o.jsxs)(t.p,{children:["\ud83d\udd14"," Zealot 4.5.0 built in Apple team manage which it use ",(0,o.jsx)(t.a,{href:"https://docs.fastlane.tools/app-store-connect-api/#using-fastlane-api-key-json-file",children:"Apple API Key"}),"\nto sync iOS devices, even CAN registe the device after fetch the UDID, ",(0,o.jsx)(t.a,{href:"/docs/user-guide/administrator/apple-team",children:"Check detail"})]}),"\n"]}),"\n",(0,o.jsx)(t.p,{children:"Use Apple Developer account to syncing UDIDs and relates the value in Zealot."}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{className:"language-ruby",children:"# With Apple API Key\nzealot_sync_devices(\n endpoint: 'https://zealot.com',\n token: '...',\n api_key_path: '/path/to/your/api_key_json_file',\n team_id: '...'\n)\n\n# With password (Two-factor Authentication required)\nzealot_sync_devices(\n endpoint: 'https://zealot.com',\n token: '...',\n username: 'user@example.com',\n team_id: '...'\n)\n"})}),"\n",(0,o.jsx)(t.h2,{id:"parameters",children:"Parameters"}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{children:"+---------------+-----------------------------------------------------------------------------+------------------------+---------+\n| zealot_sync_devices Options |\n+---------------+-----------------------------------------------------------------------------+------------------------+---------+\n| Key | Description | Env Var(s) | Default |\n+---------------+-----------------------------------------------------------------------------+------------------------+---------+\n| endpoint | The endpoint of zealot | ZEALOT_ENDPOINT | |\n| token | The token of user | ZEALOT_TOKEN | |\n| username | The apple id (username) of Apple Developer Portal | ZEALOT_USERNAME | * |\n| api_key_path | Path to your App Store Connect API Key JSON file | ZEALOT_API_PATH | |\n| | (https://docs.fastlane.tools/app-store-connect-api/#using-fastlane-api-key | | |\n| | -json-file) | | |\n| api_key | Your App Store Connect API Key information | ZEALOT_API_KEY | * |\n| | (https://docs.fastlane.tools/app-store-connect-api/#using-fastlane-api-key | | |\n| | -hash-option) | | |\n| team_id | The ID of your Developer Portal team if you're in multiple teams | ZEALOT_APPLE_TEAM_ID | * |\n| team_name | The name of your Developer Portal team if you're in multiple teams | ZEALOT_APPLE_TEAM_NAME | * |\n| platform | The platform to use (optional) | ZEALOT_APPLE_PLATFORM | ios |\n| verify_ssl | Should verify SSL of zealot service | ZEALOT_VERIFY_SSL | true |\n| timeout | Request timeout in seconds | ZEALOT_TIMEOUT | |\n| fail_on_error | Should an error http request cause a failure? (true/false) | ZEALOT_FAIL_ON_ERROR | false |\n+---------------+-----------------------------------------------------------------------------+------------------------+---------+\n"})})]})}function p(e={}){const{wrapper:t}={...(0,a.a)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},1151:(e,t,n)=>{n.d(t,{Z:()=>l,a:()=>i});var o=n(7294);const a={},s=o.createContext(a);function i(e){const t=o.useContext(s);return o.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function l(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:i(e.components),o.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/5bc80e2f.937b664b.js b/assets/js/5bc80e2f.937b664b.js new file mode 100644 index 000000000..44a8fd387 --- /dev/null +++ b/assets/js/5bc80e2f.937b664b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[8],{1359:(n,o,t)=>{t.r(o),t.d(o,{assets:()=>c,contentTitle:()=>d,default:()=>l,frontMatter:()=>a,metadata:()=>u,toc:()=>g});var e=t(5893),r=t(1151),i=t(9965),s=t(4996);const a={},d="Background Jobs",u={id:"user-guide/administrator/monitoring/background-jobs",title:"Background Jobs",description:"{t.d(o,{Z:()=>a,a:()=>s});var e=t(7294);const r={},i=e.createContext(r);function s(n){const o=e.useContext(i);return e.useMemo((function(){return"function"==typeof n?n(o):{...o,...n}}),[o,n])}function a(n){let o;return o=n.disableParentContext?"function"==typeof n.components?n.components(r):n.components||r:s(n.components),e.createElement(i.Provider,{value:o},n.children)}}}]); \ No newline at end of file diff --git a/assets/js/5bc80e2f.aa6aaafa.js b/assets/js/5bc80e2f.aa6aaafa.js deleted file mode 100644 index 443480ceb..000000000 --- a/assets/js/5bc80e2f.aa6aaafa.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[8],{1359:(n,o,t)=>{t.r(o),t.d(o,{assets:()=>c,contentTitle:()=>d,default:()=>l,frontMatter:()=>a,metadata:()=>u,toc:()=>g});var e=t(5893),r=t(1151),i=t(9965),s=t(4996);const a={},d="Background Jobs",u={id:"user-guide/administrator/monitoring/background-jobs",title:"Background Jobs",description:"{t.d(o,{Z:()=>a,a:()=>s});var e=t(7294);const r={},i=e.createContext(r);function s(n){const o=e.useContext(i);return e.useMemo((function(){return"function"==typeof n?n(o):{...o,...n}}),[o,n])}function a(n){let o;return o=n.disableParentContext?"function"==typeof n.components?n.components(r):n.components||r:s(n.components),e.createElement(i.Provider,{value:o},n.children)}}}]); \ No newline at end of file diff --git a/assets/js/5db046c6.2e663a26.js b/assets/js/5db046c6.2e663a26.js new file mode 100644 index 000000000..63c905c17 --- /dev/null +++ b/assets/js/5db046c6.2e663a26.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[7500],{2207:e=>{e.exports=JSON.parse('{"title":"Local development","slug":"/category/local-development","permalink":"/docs/5.1.0/category/local-development","navigation":{"previous":{"title":"Contributing Guide","permalink":"/docs/5.1.0/contributing-guide/"},"next":{"title":"Visual Studio Code Dev Container Setup","permalink":"/docs/5.1.0/contributing-guide/local-development/devcontainer"}}}')}}]); \ No newline at end of file diff --git a/assets/js/63b42c86.38230bf3.js b/assets/js/63b42c86.38230bf3.js new file mode 100644 index 000000000..ac2e44559 --- /dev/null +++ b/assets/js/63b42c86.38230bf3.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[9195],{7017:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>d,default:()=>p,frontMatter:()=>u,metadata:()=>a,toc:()=>c});var s=n(5893),o=n(1151),i=n(9965),r=n(4996);const u={},d="Create a Debug File",a={id:"user-guide/debug-files/upload",title:"Create a Debug File",description:"{n.d(t,{Z:()=>u,a:()=>r});var s=n(7294);const o={},i=s.createContext(o);function r(e){const t=s.useContext(i);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function u(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:r(e.components),s.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/65c373d6.69712e5f.js b/assets/js/65c373d6.69712e5f.js new file mode 100644 index 000000000..82a6c2e5b --- /dev/null +++ b/assets/js/65c373d6.69712e5f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[5414],{9053:(e,n,a)=>{a.r(n),a.d(n,{assets:()=>r,contentTitle:()=>o,default:()=>m,frontMatter:()=>s,metadata:()=>i,toc:()=>c});var t=a(5893),l=a(1151);const s={sidebar_label:"Kubernetes"},o="Deploy Zealot with Kubernetes guide",i={id:"self-hosted/deployment/kubernetes",title:"Deploy Zealot with Kubernetes guide",description:"Zealot support deployments using Kubernetes, but only .yaml config files are available currently.",source:"@site/versioned_docs/version-5.1.0/self-hosted/deployment/kubernetes.md",sourceDirName:"self-hosted/deployment",slug:"/self-hosted/deployment/kubernetes",permalink:"/docs/5.1.0/self-hosted/deployment/kubernetes",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.1.0/self-hosted/deployment/kubernetes.md",tags:[],version:"5.1.0",frontMatter:{sidebar_label:"Kubernetes"},sidebar:"selfHosted",previous:{title:"Step by step",permalink:"/docs/5.1.0/self-hosted/deployment/docker/step-by-step"},next:{title:"Nomad",permalink:"/docs/5.1.0/self-hosted/deployment/nomad"}},r={},c=[{value:"Check list",id:"check-list",level:2},{value:"Steps",id:"steps",level:2},{value:"10-zealot-namespace.yml",id:"10-zealot-namespaceyml",level:3},{value:"20-zealot-secrets.yml",id:"20-zealot-secretsyml",level:3},{value:"21-zealot-configmap.yml",id:"21-zealot-configmapyml",level:3},{value:"30-zealot-storage.yml",id:"30-zealot-storageyml",level:3},{value:"40-zealot-deployment.yml",id:"40-zealot-deploymentyml",level:3},{value:"50-zealot-service.yml",id:"50-zealot-serviceyml",level:3},{value:"60-zealot-ingress.yml",id:"60-zealot-ingressyml",level:3}];function d(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,l.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h1,{id:"deploy-zealot-with-kubernetes-guide",children:"Deploy Zealot with Kubernetes guide"}),"\n",(0,t.jsxs)(n.p,{children:["Zealot support deployments using Kubernetes, but only ",(0,t.jsx)(n.code,{children:".yaml"})," config files are available currently."]}),"\n",(0,t.jsx)(n.h2,{id:"check-list",children:"Check list"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"ConfigMap"})," and ",(0,t.jsx)(n.code,{children:"Secret"})," to configure enviroment variables."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"PersistentVolumeClaim"})," to configure ",(0,t.jsx)(n.code,{children:"public/uploads"}),", ",(0,t.jsx)(n.code,{children:"public/bakcup"}),"."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"Deployment"})," to control ",(0,t.jsx)(n.code,{children:"zealot"})," pod."]}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"steps",children:"Steps"}),"\n",(0,t.jsx)(n.h3,{id:"10-zealot-namespaceyml",children:"10-zealot-namespace.yml"}),"\n",(0,t.jsx)(n.p,{children:"Zealot namespace."}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",metastring:'title="10-zealot-namespace.yml"',children:"api Version: v1\nkind: Namespace\nmetadata:\nname: zealot\n"})}),"\n",(0,t.jsx)(n.h3,{id:"20-zealot-secretsyml",children:"20-zealot-secrets.yml"}),"\n",(0,t.jsxs)(n.p,{children:["Zealot enviroments secrets. This is loaded all secrets ",(0,t.jsx)(n.a,{href:"/docs/self-hosted/configuration/environment-variables",children:"enviroments"}),", ",(0,t.jsx)(n.strong,{children:"all values need encryt by base64"}),"."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",metastring:'title="20-zealot-secrets.yml"',children:"apiVersion: v1\nkind: Secret\nmetadata:\n namespace: zealot\n name: zealot-secrets\ndata:\n ZEALOT_ADMIN_EMAIL: V1ZkU2RHRlhOVUZsYlZab1lrYzVNRXh0VG5aaVVUMDk=\n ZEALOT_ADMIN_PASSWORD: emVAbDB0\n ZEALOT_POSTGRES_HOST: cG9zdGdyZXM=\n ZEALOT_POSTGRES_PORT: NTQzMg==\n ZEALOT_POSTGRES_USERNAME: emVhbG90\n ZEALOT_POSTGRES_PASSWORD: emVAbDB0\n ZEALOT_POSTGRES_DB_NAME: emVhbG90\n REDIS_URL: cmVkaXM6Ly9yZWRpczo2Mzc5LzE=\n\n # echo -n 'secret-key' | sha256sum | awk '{ printf $1 }' | base64\n SECRET_TOKEN: ODVkYmUxNWQ3NWVmOTMwOGM3YWUwZjMzYzdhMzI0Y2M2ZjRiZjUxOWEyZWQyZjMwMjdiZDMzYzE0MGE0ZjlhYQ==\n"})}),"\n",(0,t.jsx)(n.h3,{id:"21-zealot-configmapyml",children:"21-zealot-configmap.yml"}),"\n",(0,t.jsxs)(n.p,{children:["Zealot enviroments config map. This is loaded safe ",(0,t.jsx)(n.a,{href:"/docs/self-hosted/configuration/environment-variables",children:"enviroments"}),"."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",metastring:'title="21-zealot-configmap.yml"',children:'apiVersion: v1\nkind: ConfigMap\nmetadata:\n namespace: zealot\n name: zealot-config\ndata:\n ZEALOT_DOMAIN: zealot.icyleaf.dev\n DEFAULT_LOCALE: en\n ZEALOT_REGISTER_ENABLED: "true"\n'})}),"\n",(0,t.jsx)(n.h3,{id:"30-zealot-storageyml",children:"30-zealot-storage.yml"}),"\n",(0,t.jsx)(n.p,{children:"The creation of the persistent volume claims for uploaded files (apps/debug files) and backup files. May you want to increase the size. This expects to have a storage class installed."}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",metastring:'title="30-zealot-storage.yml"',children:"apiVersion: v1\nkind: PersistentVolumeClaim\nmetadata:\n name: zealot-uploads\n namespace: zealot\n labels:\n app: zealot\nspec:\n accessModes:\n - ReadWriteOnce\n resources:\n requests:\n storage: 20Gi\n---\napiVersion: v1\nkind: PersistentVolumeClaim\nmetadata:\n name: zealot-backup\n namespace: zealot\n labels:\n app: zealot\nspec:\n accessModes:\n - ReadWriteOnce\n resources:\n requests:\n storage: 20Gi\n"})}),"\n",(0,t.jsx)(n.h3,{id:"40-zealot-deploymentyml",children:"40-zealot-deployment.yml"}),"\n",(0,t.jsxs)(n.p,{children:["Create zealot deployment, edit ",(0,t.jsx)(n.code,{children:"replicas"})," and ",(0,t.jsx)(n.code,{children:"image"})," tag."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",metastring:'title="40-zealot-deployment.yml"',children:"apiVersion: apps/v1\nkind: Deployment\nmetadata:\n name: zealot\n namespace: zealot\nspec:\n restartPolicy: Always\n replicas: 1\n selector:\n matchLabels:\n app: zealot\n template:\n metadata:\n labels:\n app: zealot\n spec:\n containers:\n - name: zealot\n image: ghcr.io/tryzealot/zealot:nightly\n # imagePullPolicy: Always\n ports:\n - containerPort: 80\n protocol: TCP\n name: http\n envFrom:\n - configMapRef:\n name: zealot-env\n - secretRef:\n name: zealot-secrets\n volumeMounts:\n - mountPath: /app/public/uploads\n name: uploads\n - mountPath: /app/public/backup\n name: backup\n volumes:\n - name: uploads\n persistentVolumeClaim:\n claimName: zealot-uploads\n - name: backup\n persistentVolumeClaim:\n claimName: zealot-backup\n"})}),"\n",(0,t.jsx)(n.h3,{id:"50-zealot-serviceyml",children:"50-zealot-service.yml"}),"\n",(0,t.jsx)(n.p,{children:"Creating zealot service."}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",metastring:'title="50-zealot-service.yml"',children:"apiVersion: v1\nkind: Service\nmetadata:\n name: zealot\n namespace: zealot\n labels:\n app: zealot\nspec:\n selector:\n app: zealot\n ports:\n - port: 80\n targetPort: http\n name: http\n protocol: TCP\n"})}),"\n",(0,t.jsx)(n.h3,{id:"60-zealot-ingressyml",children:"60-zealot-ingress.yml"}),"\n",(0,t.jsx)(n.p,{children:"Setting up the ingress for the zealot service."}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",metastring:'title="50-zealot-ingress.yml"',children:"apiVersion: networking.k8s.io/v1\nkind: Ingress\nmetadata:\n name: zealot\n namespace: zealot\n annotations:\n #cert-manager.io/cluster-issuer: letsencrypt-prod\n #kubernetes.io/ingress.class: nginx\nspec:\n rules:\n - host: zealot.icyleaf.dev\n http:\n paths:\n - web:\n service:\n name: zealot\n port:\n number: 80\n path: /\n pathType: Prefix\n"})})]})}function m(e={}){const{wrapper:n}={...(0,l.a)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(d,{...e})}):d(e)}},1151:(e,n,a)=>{a.d(n,{Z:()=>i,a:()=>o});var t=a(7294);const l={},s=t.createContext(l);function o(e){const n=t.useContext(s);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(l):e.components||l:o(e.components),t.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/81a27df7.0ae11e40.js b/assets/js/6d4d7925.0c679a27.js similarity index 91% rename from assets/js/81a27df7.0ae11e40.js rename to assets/js/6d4d7925.0c679a27.js index e0363eb32..cfd4c3aa5 100644 --- a/assets/js/81a27df7.0ae11e40.js +++ b/assets/js/6d4d7925.0c679a27.js @@ -1 +1 @@ -"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[1370],{6690:(e,n,a)=>{a.r(n),a.d(n,{assets:()=>c,contentTitle:()=>d,default:()=>h,frontMatter:()=>r,metadata:()=>l,toc:()=>o});var t=a(5893),s=a(1151),i=a(9965),p=a(4996);const r={},d="Manage apps",l={id:"user-guide/apps/index",title:"Manage apps",description:"Apps list",source:"@site/versioned_docs/version-5.1.0/user-guide/apps/index.mdx",sourceDirName:"user-guide/apps",slug:"/user-guide/apps/",permalink:"/docs/user-guide/apps/",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.1.0/user-guide/apps/index.mdx",tags:[],version:"5.1.0",frontMatter:{},sidebar:"userGuide",previous:{title:"Create an App",permalink:"/docs/user-guide/apps/create"},next:{title:"Uploaded releases",permalink:"/docs/user-guide/apps/detail"}},c={},o=[{value:"Apps list",id:"apps-list",level:2},{value:"Edit app",id:"edit-app",level:2},{value:"Create a new scheme",id:"create-a-new-scheme",level:2},{value:"Create a new channel",id:"create-a-new-channel",level:2},{value:"Edit channel",id:"edit-channel",level:2}];function u(e){const n={h1:"h1",h2:"h2",...(0,s.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h1,{id:"manage-apps",children:"Manage apps"}),"\n","\n","\n",(0,t.jsx)(n.h2,{id:"apps-list",children:"Apps list"}),"\n",(0,t.jsx)(i.Z,{alt:"",sources:{light:(0,p.Z)("/img/5.0.0/apps-light.png"),dark:(0,p.Z)("/img/5.0.0/apps-dark.png")}}),"\n",(0,t.jsx)(n.h2,{id:"edit-app",children:"Edit app"}),"\n",(0,t.jsx)(i.Z,{alt:"",sources:{light:(0,p.Z)("/img/5.0.0/app-edit-light.png"),dark:(0,p.Z)("/img/5.0.0/app-edit-dark.png")}}),"\n",(0,t.jsx)(n.h2,{id:"create-a-new-scheme",children:"Create a new scheme"}),"\n",(0,t.jsx)(i.Z,{alt:"",sources:{light:(0,p.Z)("/img/5.0.0/app-new-scheme-light.png"),dark:(0,p.Z)("/img/5.0.0/app-new-scheme-dark.png")}}),"\n",(0,t.jsx)(n.h2,{id:"create-a-new-channel",children:"Create a new channel"}),"\n",(0,t.jsx)(i.Z,{alt:"",sources:{light:(0,p.Z)("/img/5.0.0/app-new-channel-light.png"),dark:(0,p.Z)("/img/5.0.0/app-new-channel-dark.png")}}),"\n",(0,t.jsx)(n.h2,{id:"edit-channel",children:"Edit channel"}),"\n",(0,t.jsx)(i.Z,{alt:"",sources:{light:(0,p.Z)("/img/5.0.0/app-edit-channel-light.png"),dark:(0,p.Z)("/img/5.0.0/app-edit-channel-dark.png")}})]})}function h(e={}){const{wrapper:n}={...(0,s.a)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(u,{...e})}):u(e)}},1151:(e,n,a)=>{a.d(n,{Z:()=>r,a:()=>p});var t=a(7294);const s={},i=t.createContext(s);function p(e){const n=t.useContext(i);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:p(e.components),t.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[8432],{8855:(e,n,a)=>{a.r(n),a.d(n,{assets:()=>c,contentTitle:()=>d,default:()=>h,frontMatter:()=>r,metadata:()=>l,toc:()=>o});var t=a(5893),s=a(1151),i=a(9965),p=a(4996);const r={},d="Manage apps",l={id:"user-guide/apps/index",title:"Manage apps",description:"Apps list",source:"@site/versioned_docs/version-5.2.0/user-guide/apps/index.mdx",sourceDirName:"user-guide/apps",slug:"/user-guide/apps/",permalink:"/docs/user-guide/apps/",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.2.0/user-guide/apps/index.mdx",tags:[],version:"5.2.0",frontMatter:{},sidebar:"userGuide",previous:{title:"Create an App",permalink:"/docs/user-guide/apps/create"},next:{title:"Uploaded releases",permalink:"/docs/user-guide/apps/detail"}},c={},o=[{value:"Apps list",id:"apps-list",level:2},{value:"Edit app",id:"edit-app",level:2},{value:"Create a new scheme",id:"create-a-new-scheme",level:2},{value:"Create a new channel",id:"create-a-new-channel",level:2},{value:"Edit channel",id:"edit-channel",level:2}];function u(e){const n={h1:"h1",h2:"h2",...(0,s.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h1,{id:"manage-apps",children:"Manage apps"}),"\n","\n","\n",(0,t.jsx)(n.h2,{id:"apps-list",children:"Apps list"}),"\n",(0,t.jsx)(i.Z,{alt:"",sources:{light:(0,p.Z)("/img/5.0.0/apps-light.png"),dark:(0,p.Z)("/img/5.0.0/apps-dark.png")}}),"\n",(0,t.jsx)(n.h2,{id:"edit-app",children:"Edit app"}),"\n",(0,t.jsx)(i.Z,{alt:"",sources:{light:(0,p.Z)("/img/5.0.0/app-edit-light.png"),dark:(0,p.Z)("/img/5.0.0/app-edit-dark.png")}}),"\n",(0,t.jsx)(n.h2,{id:"create-a-new-scheme",children:"Create a new scheme"}),"\n",(0,t.jsx)(i.Z,{alt:"",sources:{light:(0,p.Z)("/img/5.0.0/app-new-scheme-light.png"),dark:(0,p.Z)("/img/5.0.0/app-new-scheme-dark.png")}}),"\n",(0,t.jsx)(n.h2,{id:"create-a-new-channel",children:"Create a new channel"}),"\n",(0,t.jsx)(i.Z,{alt:"",sources:{light:(0,p.Z)("/img/5.0.0/app-new-channel-light.png"),dark:(0,p.Z)("/img/5.0.0/app-new-channel-dark.png")}}),"\n",(0,t.jsx)(n.h2,{id:"edit-channel",children:"Edit channel"}),"\n",(0,t.jsx)(i.Z,{alt:"",sources:{light:(0,p.Z)("/img/5.0.0/app-edit-channel-light.png"),dark:(0,p.Z)("/img/5.0.0/app-edit-channel-dark.png")}})]})}function h(e={}){const{wrapper:n}={...(0,s.a)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(u,{...e})}):u(e)}},1151:(e,n,a)=>{a.d(n,{Z:()=>r,a:()=>p});var t=a(7294);const s={},i=t.createContext(s);function p(e){const n=t.useContext(i);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:p(e.components),t.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/6d8ea5cb.1fa500ab.js b/assets/js/6d8ea5cb.1fa500ab.js deleted file mode 100644 index 1865b24a7..000000000 --- a/assets/js/6d8ea5cb.1fa500ab.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[5617],{6874:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>d,contentTitle:()=>i,default:()=>h,frontMatter:()=>o,metadata:()=>a,toc:()=>l});var r=t(5893),s=t(1151);const o={sidebar_label:"Nomad"},i="Deploy Zealot with Nomad guide",a={id:"self-hosted/deployment/nomad",title:"Deploy Zealot with Nomad guide",description:"Zealot support deployments using Nomad, it use HCL language to configure.",source:"@site/versioned_docs/version-5.1.0/self-hosted/deployment/nomad.md",sourceDirName:"self-hosted/deployment",slug:"/self-hosted/deployment/nomad",permalink:"/docs/self-hosted/deployment/nomad",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.1.0/self-hosted/deployment/nomad.md",tags:[],version:"5.1.0",frontMatter:{sidebar_label:"Nomad"},sidebar:"selfHosted",previous:{title:"Kubernetes",permalink:"/docs/self-hosted/deployment/kubernetes"},next:{title:"Source code",permalink:"/docs/self-hosted/deployment/source-code"}},d={},l=[{value:"Setup",id:"setup",level:2},{value:"Using Nomad",id:"using-nomad",level:3},{value:"Using Terraform",id:"using-terraform",level:3},{value:"External Storages",id:"external-storages",level:2},{value:"CSI",id:"csi",level:3}];function c(e){const n={a:"a",blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",h3:"h3",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,s.a)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.h1,{id:"deploy-zealot-with-nomad-guide",children:"Deploy Zealot with Nomad guide"}),"\n",(0,r.jsxs)(n.p,{children:["Zealot support deployments using ",(0,r.jsx)(n.a,{href:"https://www.nomadproject.io/",children:"Nomad"}),", it use ",(0,r.jsx)(n.a,{href:"https://developer.hashicorp.com/nomad/docs/job-specification/hcl2",children:"HCL"})," language to configure."]}),"\n",(0,r.jsx)(n.h2,{id:"setup",children:"Setup"}),"\n",(0,r.jsx)(n.h3,{id:"using-nomad",children:"Using Nomad"}),"\n",(0,r.jsxs)(n.p,{children:["First, follow the official tutorial to install ",(0,r.jsx)(n.a,{href:"https://developer.hashicorp.com/nomad/docs/install",children:"nomad"}),", this binary file contains the client and server. It is recommended to follow the ",(0,r.jsx)(n.a,{href:"https://developer.hashicorp.com/nomad/tutorials/get-started",children:"tutorials"})," to walk through it if you don't know it."]}),"\n",(0,r.jsxs)(n.p,{children:["The following file will create the postgres, redis and zealot services.\nFor the existing external database and cache services,\nyou can delete the corresponding ",(0,r.jsx)(n.code,{children:"port"}),", ",(0,r.jsx)(n.code,{children:"service"})," and ",(0,r.jsx)(n.code,{children:"task"})," and edit the template variables in the ",(0,r.jsx)(n.code,{children:"zealot"})," task."]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-hcl",metastring:'title="zealot.nomad"',children:'job "zealot" {\n type = "service"\n datacenters = "dc1" // modify\n\n update {\n max_parallel = 1\n min_healthy_time = "30s"\n auto_revert = true\n }\n\n group "zealot" {\n network {\n port "zealot" {\n to = 80\n }\n\n port "postgres" {\n to = 5678\n }\n\n port "redis" {\n to = 6379\n }\n }\n\n service {\n name = "zealot"\n port = "zealot"\n provider = "nomad"\n\n // Register to traefik\n // tags = [\n // "traefik.enable=true",\n // "traefik.http.routers.zealot.entrypoints=web, websecure",\n // "traefik.http.routers.zealot.rule=Host(`zealot.example.com`)",\n // ]\n }\n\n service {\n name = "postgres"\n port = "postgres"\n provider = "nomad"\n\n // Register to traefik\n // tags = [\n // "traefik.enable=true",\n // "traefik.tcp.routers.postgres.rule=HostSNI(`*`)",\n // "traefik.tcp.routers.postgres.entrypoints=postgres",\n // ]\n }\n\n service {\n name = "redis"\n port = "redis"\n provider = "nomad"\n\n // Register to traefik\n // tags = [\n // "traefik.enable=true",\n // "traefik.tcp.routers.redis.rule=HostSNI(`*`)",\n // "traefik.tcp.routers.redis.entrypoints=redis",\n // ]\n }\n\n task "zealot" {\n driver = "docker"\n\n config {\n image = "ghcr.io/tryzealot/zealot:latest"\n ports = ["zealot"]\n\n // modify\n volumes = [\n "/tmp/zealot/uploads:/app/public/uploads",\n "/tmp/zealot/backups:/app/public/backups",\n ]\n\n // Register to homepage dashboard\n // labels = {\n // "homepage.group" = "Dev"\n // "homepage.name" = "Zealot"\n // "homepage.icon" = "mdi-progress-download"\n // "homepage.href" = "https://zealot.example.com"\n // "homepage.description" = "Beta App Distribution"\n // }\n }\n\n // Zealot example config\n // https://github.com/tryzealot/zealot-docker/blob/master/config.env\n template {\n destination = "local/config.env"\n change_mode = "restart"\n env = true\n data = <<-EOF\n ZEALOT_APPEARANCE = dark\n ZEALOT_DOMAIN = zealot.example.com\n\n ZEALOT_GUEST_MODE = false\n ZEALOT_REGISTER_ENABLED = true\n EOF\n }\n\n template {\n destination = "secrets/secret.env"\n change_mode = "restart"\n env = true\n data = <<-EOF\n # admin account\n ZEALOT_ADMIN_EMAIL = admin@zealot.com\n ZEALOT_ADMIN_PASSWORD = ze@l0t\n\n # datbase\n ZEALOT_POSTGRES_HOST = {{ env "NOMAD_IP_postgres" }}\n ZEALOT_POSTGRES_PORT = {{ env "NOMAD_PORT_postgres" }}\n ZEALOT_POSTGRES_USERNAME = "zealot"\n ZEALOT_POSTGRES_PASSWORD = "zealot"\n ZEALOT_POSTGRES_DB_NAME = "zealot"\n\n # cache\n REDIS_URL = redis://{{ env "NOMAD_ARRR_redis" }}/0\n\n # secret token\n SECRET_TOKEN = $${ sha256(uuidv5("url", "zealot.ews.im")) }\n EOF\n }\n\n resources {\n cpu = 500\n memory = 500\n memory_max = 1000\n }\n }\n\n task "postgres" {\n driver = "docker"\n\n lifecycle {\n hook = "prestart"\n sidecar = true\n }\n\n config {\n image = "postgres:15-alpine"\n ports = ["postgres"]\n volumes = [\n "secrets/init-role.sql:/init-role.sql",\n "secrets/init-db.sql:/init-db.sql"\n ]\n }\n\n env {\n POSTGRES_INITDB_ARGS = "--data-checksums"\n POSTGRES_USER = "zealot"\n POSTGRES_PASSWORD = "zealot"\n POSTGRES_DB = "zealot"\n }\n\n resources{\n cpu = 512\n memory = 200\n memory_max = 512\n }\n }\n\n task "redis" {\n driver = "docker"\n\n lifecycle {\n hook = "prestart"\n sidecar = true\n }\n\n config {\n image = "redis:7-alpine"\n ports = ["redis"]\n }\n\n resources {\n cpu = 200\n memory = 200\n }\n }\n }\n}\n'})}),"\n",(0,r.jsxs)(n.p,{children:["Save the file and execute the command ",(0,r.jsx)(n.code,{children:"nomad job run zealot.nomad"}),"."]}),"\n",(0,r.jsx)(n.h3,{id:"using-terraform",children:"Using Terraform"}),"\n",(0,r.jsxs)(n.blockquote,{children:["\n",(0,r.jsx)(n.p,{children:"Both Terraform and Nomad are the same company."}),"\n"]}),"\n",(0,r.jsxs)(n.p,{children:["Following the offical tutorials to install ",(0,r.jsx)(n.a,{href:"https://www.terraform.io/",children:"terraform"}),", ",(0,r.jsx)(n.a,{href:"https://registry.terraform.io/providers/hashicorp/nomad/",children:"nomad plugin"}),",\ncopy the ",(0,r.jsx)(n.code,{children:"zealot.nomad"})," in previous step and edit a new file named ",(0,r.jsx)(n.code,{children:"main.tf"}),":"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-hcl",children:'resource "nomad_job" "jobs" {\n jobspec = file("${path.module}/zealot.nomad")\n}\n'})}),"\n",(0,r.jsxs)(n.p,{children:["Execute ",(0,r.jsx)(n.code,{children:"terraform plan"})," to ensure, then deploy ",(0,r.jsx)(n.code,{children:"terraform apply"}),"."]}),"\n",(0,r.jsx)(n.h2,{id:"external-storages",children:"External Storages"}),"\n",(0,r.jsx)(n.p,{children:"Nomad supports multi-cluster management, and in many cases the storage deployed by the service cannot be mounted directly to the corresponding file system, but is more often placed on top of a shared file storage protocol, such as SMB, NFS, S3, etc."}),"\n",(0,r.jsx)(n.h3,{id:"csi",children:"CSI"}),"\n",(0,r.jsxs)(n.p,{children:["Nomad currently supports the ",(0,r.jsx)(n.a,{href:"https://developer.hashicorp.com/nomad/tutorials/stateful-workloads/stateful-workloads-csi-volumes",children:"CSI"})," in ",(0,r.jsx)(n.a,{href:"https://github.com/democratic-csi/democratic-csi/blob/master/docs/nomad.md",children:"a limited capability"})," (Nomad 1.5).\nNomad can utilize CSI volumes, but it can not automatically create, destroy, or manage them in any capacity. Volumes have to be created externally and then registered with Nomad.\nYou can find a list of plugins in the ",(0,r.jsx)(n.a,{href:"https://kubernetes-csi.github.io/docs/drivers.html",children:"Kubernetes CSI Developer Documentation"}),"."]}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Plugin"}),(0,r.jsx)(n.th,{children:"Schemes"}),(0,r.jsx)(n.th,{children:"Compatible"}),(0,r.jsx)(n.th,{children:"terraform nomad resource"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.a,{href:"https://github.com/kubernetes-csi/csi-driver-smb",children:"kubernetes-csi-driver-smb"})}),(0,r.jsx)(n.td,{children:"smb"}),(0,r.jsx)(n.td,{children:"Unknown"}),(0,r.jsx)(n.td,{children:"Unknown"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.a,{href:"https://github.com/kubernetes-csi/csi-driver-nfs",children:"kubernetes-csi-driver-nfs"})}),(0,r.jsx)(n.td,{children:"nfs"}),(0,r.jsx)(n.td,{children:"Supported"}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.a,{href:"https://registry.terraform.io/providers/hashicorp/nomad/latest/docs/resources/csi_volume_registration",children:"nomad_csi_volume_registration"})})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.a,{href:"https://github.com/kubernetes-csi/csi-driver-iscsi",children:"kubernetes-csi-driver-iscsi"})}),(0,r.jsx)(n.td,{children:"iscsi"}),(0,r.jsx)(n.td,{children:"Supported"}),(0,r.jsx)(n.td,{children:"Supported"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.a,{href:"https://github.com/democratic-csi/democratic-csi",children:"democraticcsi/democratic-csi"})}),(0,r.jsx)(n.td,{children:"smb/nfs/iscsi"}),(0,r.jsx)(n.td,{children:"Supported"}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.a,{href:"https://registry.terraform.io/providers/hashicorp/nomad/latest/docs/resources/csi_volume",children:"nomad_csi_volume"})})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.a,{href:"https://gitlab.com/rocketduck/csi-plugin-nfs",children:"rocketduck/csi-plugin-nfs"})}),(0,r.jsx)(n.td,{children:"nfs"}),(0,r.jsx)(n.td,{children:"Supported"}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.a,{href:"https://registry.terraform.io/providers/hashicorp/nomad/latest/docs/resources/csi_volume",children:"nomad_csi_volume"})})]})]})]})]})}function h(e={}){const{wrapper:n}={...(0,s.a)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(c,{...e})}):c(e)}},1151:(e,n,t)=>{t.d(n,{Z:()=>a,a:()=>i});var r=t(7294);const s={},o=r.createContext(s);function i(e){const n=r.useContext(o);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:i(e.components),r.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/6d8ea5cb.cdeddf9e.js b/assets/js/6d8ea5cb.cdeddf9e.js new file mode 100644 index 000000000..7616749ac --- /dev/null +++ b/assets/js/6d8ea5cb.cdeddf9e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[5617],{6874:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>d,contentTitle:()=>i,default:()=>h,frontMatter:()=>o,metadata:()=>a,toc:()=>l});var r=t(5893),s=t(1151);const o={sidebar_label:"Nomad"},i="Deploy Zealot with Nomad guide",a={id:"self-hosted/deployment/nomad",title:"Deploy Zealot with Nomad guide",description:"Zealot support deployments using Nomad, it use HCL language to configure.",source:"@site/versioned_docs/version-5.1.0/self-hosted/deployment/nomad.md",sourceDirName:"self-hosted/deployment",slug:"/self-hosted/deployment/nomad",permalink:"/docs/5.1.0/self-hosted/deployment/nomad",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.1.0/self-hosted/deployment/nomad.md",tags:[],version:"5.1.0",frontMatter:{sidebar_label:"Nomad"},sidebar:"selfHosted",previous:{title:"Kubernetes",permalink:"/docs/5.1.0/self-hosted/deployment/kubernetes"},next:{title:"Source code",permalink:"/docs/5.1.0/self-hosted/deployment/source-code"}},d={},l=[{value:"Setup",id:"setup",level:2},{value:"Using Nomad",id:"using-nomad",level:3},{value:"Using Terraform",id:"using-terraform",level:3},{value:"External Storages",id:"external-storages",level:2},{value:"CSI",id:"csi",level:3}];function c(e){const n={a:"a",blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",h3:"h3",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,s.a)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.h1,{id:"deploy-zealot-with-nomad-guide",children:"Deploy Zealot with Nomad guide"}),"\n",(0,r.jsxs)(n.p,{children:["Zealot support deployments using ",(0,r.jsx)(n.a,{href:"https://www.nomadproject.io/",children:"Nomad"}),", it use ",(0,r.jsx)(n.a,{href:"https://developer.hashicorp.com/nomad/docs/job-specification/hcl2",children:"HCL"})," language to configure."]}),"\n",(0,r.jsx)(n.h2,{id:"setup",children:"Setup"}),"\n",(0,r.jsx)(n.h3,{id:"using-nomad",children:"Using Nomad"}),"\n",(0,r.jsxs)(n.p,{children:["First, follow the official tutorial to install ",(0,r.jsx)(n.a,{href:"https://developer.hashicorp.com/nomad/docs/install",children:"nomad"}),", this binary file contains the client and server. It is recommended to follow the ",(0,r.jsx)(n.a,{href:"https://developer.hashicorp.com/nomad/tutorials/get-started",children:"tutorials"})," to walk through it if you don't know it."]}),"\n",(0,r.jsxs)(n.p,{children:["The following file will create the postgres, redis and zealot services.\nFor the existing external database and cache services,\nyou can delete the corresponding ",(0,r.jsx)(n.code,{children:"port"}),", ",(0,r.jsx)(n.code,{children:"service"})," and ",(0,r.jsx)(n.code,{children:"task"})," and edit the template variables in the ",(0,r.jsx)(n.code,{children:"zealot"})," task."]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-hcl",metastring:'title="zealot.nomad"',children:'job "zealot" {\n type = "service"\n datacenters = "dc1" // modify\n\n update {\n max_parallel = 1\n min_healthy_time = "30s"\n auto_revert = true\n }\n\n group "zealot" {\n network {\n port "zealot" {\n to = 80\n }\n\n port "postgres" {\n to = 5678\n }\n\n port "redis" {\n to = 6379\n }\n }\n\n service {\n name = "zealot"\n port = "zealot"\n provider = "nomad"\n\n // Register to traefik\n // tags = [\n // "traefik.enable=true",\n // "traefik.http.routers.zealot.entrypoints=web, websecure",\n // "traefik.http.routers.zealot.rule=Host(`zealot.example.com`)",\n // ]\n }\n\n service {\n name = "postgres"\n port = "postgres"\n provider = "nomad"\n\n // Register to traefik\n // tags = [\n // "traefik.enable=true",\n // "traefik.tcp.routers.postgres.rule=HostSNI(`*`)",\n // "traefik.tcp.routers.postgres.entrypoints=postgres",\n // ]\n }\n\n service {\n name = "redis"\n port = "redis"\n provider = "nomad"\n\n // Register to traefik\n // tags = [\n // "traefik.enable=true",\n // "traefik.tcp.routers.redis.rule=HostSNI(`*`)",\n // "traefik.tcp.routers.redis.entrypoints=redis",\n // ]\n }\n\n task "zealot" {\n driver = "docker"\n\n config {\n image = "ghcr.io/tryzealot/zealot:latest"\n ports = ["zealot"]\n\n // modify\n volumes = [\n "/tmp/zealot/uploads:/app/public/uploads",\n "/tmp/zealot/backups:/app/public/backups",\n ]\n\n // Register to homepage dashboard\n // labels = {\n // "homepage.group" = "Dev"\n // "homepage.name" = "Zealot"\n // "homepage.icon" = "mdi-progress-download"\n // "homepage.href" = "https://zealot.example.com"\n // "homepage.description" = "Beta App Distribution"\n // }\n }\n\n // Zealot example config\n // https://github.com/tryzealot/zealot-docker/blob/master/config.env\n template {\n destination = "local/config.env"\n change_mode = "restart"\n env = true\n data = <<-EOF\n ZEALOT_APPEARANCE = dark\n ZEALOT_DOMAIN = zealot.example.com\n\n ZEALOT_GUEST_MODE = false\n ZEALOT_REGISTER_ENABLED = true\n EOF\n }\n\n template {\n destination = "secrets/secret.env"\n change_mode = "restart"\n env = true\n data = <<-EOF\n # admin account\n ZEALOT_ADMIN_EMAIL = admin@zealot.com\n ZEALOT_ADMIN_PASSWORD = ze@l0t\n\n # datbase\n ZEALOT_POSTGRES_HOST = {{ env "NOMAD_IP_postgres" }}\n ZEALOT_POSTGRES_PORT = {{ env "NOMAD_PORT_postgres" }}\n ZEALOT_POSTGRES_USERNAME = "zealot"\n ZEALOT_POSTGRES_PASSWORD = "zealot"\n ZEALOT_POSTGRES_DB_NAME = "zealot"\n\n # cache\n REDIS_URL = redis://{{ env "NOMAD_ARRR_redis" }}/0\n\n # secret token\n SECRET_TOKEN = $${ sha256(uuidv5("url", "zealot.ews.im")) }\n EOF\n }\n\n resources {\n cpu = 500\n memory = 500\n memory_max = 1000\n }\n }\n\n task "postgres" {\n driver = "docker"\n\n lifecycle {\n hook = "prestart"\n sidecar = true\n }\n\n config {\n image = "postgres:15-alpine"\n ports = ["postgres"]\n volumes = [\n "secrets/init-role.sql:/init-role.sql",\n "secrets/init-db.sql:/init-db.sql"\n ]\n }\n\n env {\n POSTGRES_INITDB_ARGS = "--data-checksums"\n POSTGRES_USER = "zealot"\n POSTGRES_PASSWORD = "zealot"\n POSTGRES_DB = "zealot"\n }\n\n resources{\n cpu = 512\n memory = 200\n memory_max = 512\n }\n }\n\n task "redis" {\n driver = "docker"\n\n lifecycle {\n hook = "prestart"\n sidecar = true\n }\n\n config {\n image = "redis:7-alpine"\n ports = ["redis"]\n }\n\n resources {\n cpu = 200\n memory = 200\n }\n }\n }\n}\n'})}),"\n",(0,r.jsxs)(n.p,{children:["Save the file and execute the command ",(0,r.jsx)(n.code,{children:"nomad job run zealot.nomad"}),"."]}),"\n",(0,r.jsx)(n.h3,{id:"using-terraform",children:"Using Terraform"}),"\n",(0,r.jsxs)(n.blockquote,{children:["\n",(0,r.jsx)(n.p,{children:"Both Terraform and Nomad are the same company."}),"\n"]}),"\n",(0,r.jsxs)(n.p,{children:["Following the offical tutorials to install ",(0,r.jsx)(n.a,{href:"https://www.terraform.io/",children:"terraform"}),", ",(0,r.jsx)(n.a,{href:"https://registry.terraform.io/providers/hashicorp/nomad/",children:"nomad plugin"}),",\ncopy the ",(0,r.jsx)(n.code,{children:"zealot.nomad"})," in previous step and edit a new file named ",(0,r.jsx)(n.code,{children:"main.tf"}),":"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-hcl",children:'resource "nomad_job" "jobs" {\n jobspec = file("${path.module}/zealot.nomad")\n}\n'})}),"\n",(0,r.jsxs)(n.p,{children:["Execute ",(0,r.jsx)(n.code,{children:"terraform plan"})," to ensure, then deploy ",(0,r.jsx)(n.code,{children:"terraform apply"}),"."]}),"\n",(0,r.jsx)(n.h2,{id:"external-storages",children:"External Storages"}),"\n",(0,r.jsx)(n.p,{children:"Nomad supports multi-cluster management, and in many cases the storage deployed by the service cannot be mounted directly to the corresponding file system, but is more often placed on top of a shared file storage protocol, such as SMB, NFS, S3, etc."}),"\n",(0,r.jsx)(n.h3,{id:"csi",children:"CSI"}),"\n",(0,r.jsxs)(n.p,{children:["Nomad currently supports the ",(0,r.jsx)(n.a,{href:"https://developer.hashicorp.com/nomad/tutorials/stateful-workloads/stateful-workloads-csi-volumes",children:"CSI"})," in ",(0,r.jsx)(n.a,{href:"https://github.com/democratic-csi/democratic-csi/blob/master/docs/nomad.md",children:"a limited capability"})," (Nomad 1.5).\nNomad can utilize CSI volumes, but it can not automatically create, destroy, or manage them in any capacity. Volumes have to be created externally and then registered with Nomad.\nYou can find a list of plugins in the ",(0,r.jsx)(n.a,{href:"https://kubernetes-csi.github.io/docs/drivers.html",children:"Kubernetes CSI Developer Documentation"}),"."]}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Plugin"}),(0,r.jsx)(n.th,{children:"Schemes"}),(0,r.jsx)(n.th,{children:"Compatible"}),(0,r.jsx)(n.th,{children:"terraform nomad resource"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.a,{href:"https://github.com/kubernetes-csi/csi-driver-smb",children:"kubernetes-csi-driver-smb"})}),(0,r.jsx)(n.td,{children:"smb"}),(0,r.jsx)(n.td,{children:"Unknown"}),(0,r.jsx)(n.td,{children:"Unknown"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.a,{href:"https://github.com/kubernetes-csi/csi-driver-nfs",children:"kubernetes-csi-driver-nfs"})}),(0,r.jsx)(n.td,{children:"nfs"}),(0,r.jsx)(n.td,{children:"Supported"}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.a,{href:"https://registry.terraform.io/providers/hashicorp/nomad/latest/docs/resources/csi_volume_registration",children:"nomad_csi_volume_registration"})})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.a,{href:"https://github.com/kubernetes-csi/csi-driver-iscsi",children:"kubernetes-csi-driver-iscsi"})}),(0,r.jsx)(n.td,{children:"iscsi"}),(0,r.jsx)(n.td,{children:"Supported"}),(0,r.jsx)(n.td,{children:"Supported"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.a,{href:"https://github.com/democratic-csi/democratic-csi",children:"democraticcsi/democratic-csi"})}),(0,r.jsx)(n.td,{children:"smb/nfs/iscsi"}),(0,r.jsx)(n.td,{children:"Supported"}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.a,{href:"https://registry.terraform.io/providers/hashicorp/nomad/latest/docs/resources/csi_volume",children:"nomad_csi_volume"})})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.a,{href:"https://gitlab.com/rocketduck/csi-plugin-nfs",children:"rocketduck/csi-plugin-nfs"})}),(0,r.jsx)(n.td,{children:"nfs"}),(0,r.jsx)(n.td,{children:"Supported"}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.a,{href:"https://registry.terraform.io/providers/hashicorp/nomad/latest/docs/resources/csi_volume",children:"nomad_csi_volume"})})]})]})]})]})}function h(e={}){const{wrapper:n}={...(0,s.a)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(c,{...e})}):c(e)}},1151:(e,n,t)=>{t.d(n,{Z:()=>a,a:()=>i});var r=t(7294);const s={},o=r.createContext(s);function i(e){const n=r.useContext(o);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:i(e.components),r.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/6eb26ec5.b5ffcd5e.js b/assets/js/6eb26ec5.b5ffcd5e.js new file mode 100644 index 000000000..2f1ecf787 --- /dev/null +++ b/assets/js/6eb26ec5.b5ffcd5e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[4450],{8080:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>d,contentTitle:()=>l,default:()=>m,frontMatter:()=>c,metadata:()=>a,toc:()=>u});var r=n(5893),s=n(1151),o=n(9965),i=n(4996);const c={sidebar_label:"Architecture"},l="Zealot Architecture",a={id:"self-hosted/deployment/architecture",title:"Zealot Architecture",description:"Running Zealot requires the following set of services.",source:"@site/versioned_docs/version-5.1.0/self-hosted/deployment/architecture.mdx",sourceDirName:"self-hosted/deployment",slug:"/self-hosted/deployment/architecture",permalink:"/docs/5.1.0/self-hosted/deployment/architecture",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.1.0/self-hosted/deployment/architecture.mdx",tags:[],version:"5.1.0",frontMatter:{sidebar_label:"Architecture"},sidebar:"selfHosted",previous:{title:"Deployment",permalink:"/docs/5.1.0/category/deployment"},next:{title:"Requirements",permalink:"/docs/5.1.0/self-hosted/deployment/requirements"}},d={},u=[];function h(e){const t={h1:"h1",li:"li",p:"p",ul:"ul",...(0,s.a)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.h1,{id:"zealot-architecture",children:"Zealot Architecture"}),"\n",(0,r.jsx)(t.p,{children:"Running Zealot requires the following set of services."}),"\n","\n","\n",(0,r.jsx)(o.Z,{alt:"Architecture",sources:{light:(0,i.Z)("/img/5.0.0/architecture-light.png"),dark:(0,i.Z)("/img/5.0.0/architecture-dark.png")}}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsx)(t.li,{children:"Mostly Linux based on amd86/arm64/armv7."}),"\n",(0,r.jsx)(t.li,{children:"Ruby on Rails powered Web and API services"}),"\n",(0,r.jsx)(t.li,{children:"Sidekiq provides asynchronous background task management"}),"\n",(0,r.jsx)(t.li,{children:"PostgreSQL database"}),"\n",(0,r.jsx)(t.li,{children:"Redis cache"}),"\n"]})]})}function m(e={}){const{wrapper:t}={...(0,s.a)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(h,{...e})}):h(e)}},1151:(e,t,n)=>{n.d(t,{Z:()=>c,a:()=>i});var r=n(7294);const s={},o=r.createContext(s);function i(e){const t=r.useContext(o);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:i(e.components),r.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/6eb26ec5.b828430f.js b/assets/js/6eb26ec5.b828430f.js deleted file mode 100644 index 10ee67870..000000000 --- a/assets/js/6eb26ec5.b828430f.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[4450],{8080:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>d,contentTitle:()=>l,default:()=>m,frontMatter:()=>c,metadata:()=>a,toc:()=>u});var r=n(5893),s=n(1151),o=n(9965),i=n(4996);const c={sidebar_label:"Architecture"},l="Zealot Architecture",a={id:"self-hosted/deployment/architecture",title:"Zealot Architecture",description:"Running Zealot requires the following set of services.",source:"@site/versioned_docs/version-5.1.0/self-hosted/deployment/architecture.mdx",sourceDirName:"self-hosted/deployment",slug:"/self-hosted/deployment/architecture",permalink:"/docs/self-hosted/deployment/architecture",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.1.0/self-hosted/deployment/architecture.mdx",tags:[],version:"5.1.0",frontMatter:{sidebar_label:"Architecture"},sidebar:"selfHosted",previous:{title:"Deployment",permalink:"/docs/category/deployment"},next:{title:"Requirements",permalink:"/docs/self-hosted/deployment/requirements"}},d={},u=[];function h(e){const t={h1:"h1",li:"li",p:"p",ul:"ul",...(0,s.a)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.h1,{id:"zealot-architecture",children:"Zealot Architecture"}),"\n",(0,r.jsx)(t.p,{children:"Running Zealot requires the following set of services."}),"\n","\n","\n",(0,r.jsx)(o.Z,{alt:"Architecture",sources:{light:(0,i.Z)("/img/5.0.0/architecture-light.png"),dark:(0,i.Z)("/img/5.0.0/architecture-dark.png")}}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsx)(t.li,{children:"Mostly Linux based on amd86/arm64/armv7."}),"\n",(0,r.jsx)(t.li,{children:"Ruby on Rails powered Web and API services"}),"\n",(0,r.jsx)(t.li,{children:"Sidekiq provides asynchronous background task management"}),"\n",(0,r.jsx)(t.li,{children:"PostgreSQL database"}),"\n",(0,r.jsx)(t.li,{children:"Redis cache"}),"\n"]})]})}function m(e={}){const{wrapper:t}={...(0,s.a)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(h,{...e})}):h(e)}},1151:(e,t,n)=>{n.d(t,{Z:()=>c,a:()=>i});var r=n(7294);const s={},o=r.createContext(s);function i(e){const t=r.useContext(o);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:i(e.components),r.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/6f1d913a.d70d4241.js b/assets/js/6f1d913a.d70d4241.js new file mode 100644 index 000000000..c60147612 --- /dev/null +++ b/assets/js/6f1d913a.d70d4241.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[7033],{6069:(e,n,o)=>{o.r(n),o.d(n,{assets:()=>a,contentTitle:()=>r,default:()=>p,frontMatter:()=>l,metadata:()=>i,toc:()=>d});var t=o(5893),s=o(1151);const l={sidebar_label:"Step by step"},r="Docker deployment guide",i={id:"self-hosted/deployment/docker/step-by-step",title:"Docker deployment guide",description:"This is a handy guide to deploying with Docker, as well as a breakdown of the on-premise deployment guide.",source:"@site/versioned_docs/version-5.2.0/self-hosted/deployment/docker/step-by-step.md",sourceDirName:"self-hosted/deployment/docker",slug:"/self-hosted/deployment/docker/step-by-step",permalink:"/docs/self-hosted/deployment/docker/step-by-step",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.2.0/self-hosted/deployment/docker/step-by-step.md",tags:[],version:"5.2.0",frontMatter:{sidebar_label:"Step by step"},sidebar:"selfHosted",previous:{title:"On-premise (Docker)",permalink:"/docs/self-hosted/deployment/docker"},next:{title:"Kubernetes",permalink:"/docs/self-hosted/deployment/kubernetes"}},a={},d=[{value:"Versions",id:"versions",level:2},{value:"Registry",id:"registry",level:2},{value:"Step by Step",id:"step-by-step",level:2},{value:"Install Docker",id:"install-docker",level:3},{value:"Install Docker-Compose",id:"install-docker-compose",level:3},{value:"Configure .env file",id:"configure-env-file",level:3},{value:"Configure site domain",id:"configure-site-domain",level:3},{value:"Configure SSL certificate",id:"configure-ssl-certificate",level:3},{value:"Generate docker-compose.yml",id:"generate-docker-composeyml",level:3},{value:"Create docker volumes for persistent storage",id:"create-docker-volumes-for-persistent-storage",level:3},{value:"Pull images",id:"pull-images",level:3},{value:"Setup database data",id:"setup-database-data",level:3},{value:"Launch docker-compose",id:"launch-docker-compose",level:3},{value:"Advanced",id:"advanced",level:2},{value:"Custom volumes",id:"custom-volumes",level:3},{value:"1. Create custom docker volume",id:"1-create-custom-docker-volume",level:4},{value:"2. Change volumes part of docker-compose file",id:"2-change-volumes-part-of-docker-compose-file",level:4},{value:"Complete example",id:"complete-example",level:2}];function c(e){const n={a:"a",blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",li:"li",p:"p",pre:"pre",ul:"ul",...(0,s.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h1,{id:"docker-deployment-guide",children:"Docker deployment guide"}),"\n",(0,t.jsxs)(n.p,{children:["This is a handy guide to deploying with Docker, as well as a breakdown of the ",(0,t.jsx)(n.a,{href:"/docs/self-hosted/deployment/docker",children:"on-premise deployment guide"}),"."]}),"\n",(0,t.jsx)(n.h2,{id:"versions",children:"Versions"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["Stable version - 5.1.0/latest - ",(0,t.jsx)(n.code,{children:"ghcr.io/tryzealot/zealot:latest"})]}),"\n",(0,t.jsxs)(n.li,{children:["Nightly version - develop - ",(0,t.jsx)(n.code,{children:"ghcr.io/tryzealot/zealot:nightly"})," - Based on branch ",(0,t.jsx)(n.code,{children:"develop"})," builds per commit."]}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"registry",children:"Registry"}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsxs)(n.p,{children:["Docker hub ",(0,t.jsx)(n.a,{href:"https://web.docker.com/rs/790-SSB-375/images/privatereposfaq.pdf",children:"retrieve free team organizations"}),", zealot image stopped to push new version."]}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["Github Container Registry: ",(0,t.jsx)(n.a,{href:"https://github.com/tryzealot/zealot/pkgs/container/zealot",children:"https://github.com/tryzealot/zealot/pkgs/container/zealot"})]}),"\n",(0,t.jsx)(n.h2,{id:"step-by-step",children:"Step by Step"}),"\n",(0,t.jsx)(n.h3,{id:"install-docker",children:"Install Docker"}),"\n",(0,t.jsxs)(n.p,{children:["Follows ",(0,t.jsx)(n.a,{href:"https://get.docker.com/",children:"official tutorial"})," to install docker."]}),"\n",(0,t.jsx)(n.h3,{id:"install-docker-compose",children:"Install Docker-Compose"}),"\n",(0,t.jsxs)(n.p,{children:["Follows ",(0,t.jsx)(n.a,{href:"https://docs.docker.com/compose/install/",children:"official tutorial"})," to install docker-compose."]}),"\n",(0,t.jsx)(n.h3,{id:"configure-env-file",children:"Configure .env file"}),"\n",(0,t.jsxs)(n.p,{children:["Download a sample ",(0,t.jsx)(n.a,{href:"https://github.com/tryzealot/zealot-docker/blob/master/config.env",children:"config.env"})," file and customize it on your own."]}),"\n",(0,t.jsx)(n.h3,{id:"configure-site-domain",children:"Configure site domain"}),"\n",(0,t.jsx)(n.p,{children:"The secondary verification will remind again if it is not configured"}),"\n",(0,t.jsx)(n.h3,{id:"configure-ssl-certificate",children:"Configure SSL certificate"}),"\n",(0,t.jsx)(n.p,{children:"Provides three ways to do this, even if the last one generates the https protocol header:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"Using Let's Encrypt SSL"}),"\n",(0,t.jsx)(n.li,{children:"Using Self-signed SSL"}),"\n",(0,t.jsx)(n.li,{children:"Using non-SSL with Zealot service (needs gateway or reverse proxy to manage SSL\uff09"}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"generate-docker-composeyml",children:"Generate docker-compose.yml"}),"\n",(0,t.jsx)(n.p,{children:"The configuration file will generate at least three services, using the first two certificates will add an additional service."}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"zealot-zealot"}),": Use reverse-generation gateway services to deliver core Web and API services"]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"zealot-postgres"}),": Database service"]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"zealot-redis"}),": Cache service"]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"zealot-web"}),": Provides a reverse proxy gateway service for (services and certificates), optional."]}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"create-docker-volumes-for-persistent-storage",children:"Create docker volumes for persistent storage"}),"\n",(0,t.jsx)(n.p,{children:"Persistent storage Data:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"zealot-uploads"}),": Uploaded app file with extracted icon, uploaded debugging files."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"zealot-backup"}),": backup files."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"zealot-postgres"}),": Core database data."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"zealot-redis"}),": Hot cache and background jobs data."]}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"pull-images",children:"Pull images"}),"\n",(0,t.jsx)(n.p,{children:"The first time you use it, you will initialize the database,\nload the sample application data and set up the administrator account,\nwhich is required for subsequent zealot updates."}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"docker-compose pull\n"})}),"\n",(0,t.jsx)(n.h3,{id:"setup-database-data",children:"Setup database data"}),"\n",(0,t.jsx)(n.p,{children:"The first time you use it, you will initialize the database, load the sample application data\nand set up the administrator account, which is required for subsequent zealot updates."}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"docker-compose run --rm zealot run_upgrade\n"})}),"\n",(0,t.jsx)(n.h3,{id:"launch-docker-compose",children:"Launch docker-compose"}),"\n",(0,t.jsx)(n.p,{children:"Manual execution is required to run the service for security periods and user-defined operations:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"docker-compose up -d\n"})}),"\n",(0,t.jsx)(n.h2,{id:"advanced",children:"Advanced"}),"\n",(0,t.jsx)(n.h3,{id:"custom-volumes",children:"Custom volumes"}),"\n",(0,t.jsx)(n.p,{children:"You have two t"}),"\n",(0,t.jsxs)(n.p,{children:["There are two ways to customize the path: (Assuming that the custom path is ",(0,t.jsx)(n.code,{children:"/data/zealot"}),")"]}),"\n",(0,t.jsx)(n.h4,{id:"1-create-custom-docker-volume",children:"1. Create custom docker volume"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-sh",children:"docker volume create --name zealot-data \\\n --opt type=none \\\n --opt o=bind \\\n --opt device=/data/zealot/zealot-data\n\ndocker volume create --name zealot-redis \\\n --opt type=none \\\n --opt o=bind \\\n --opt device=/data/zealot/redis\n\ndocker volume create --name zealot-postgres \\\n --opt type=none \\\n --opt o=bind \\\n --opt device=/data/zealot/postgres\n"})}),"\n",(0,t.jsx)(n.h4,{id:"2-change-volumes-part-of-docker-compose-file",children:"2. Change volumes part of docker-compose file"}),"\n",(0,t.jsxs)(n.p,{children:["Open ",(0,t.jsx)(n.code,{children:"docker-compose.yml"})," file and find ",(0,t.jsx)(n.code,{children:"volumes:"}),":"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",children:"volumes:\n zealot-data:\n driver: local\n driver_opts:\n o: bind\n type: none\n device: /data/zealot/data\n zealot-redis:\n driver: local\n driver_opts:\n o: bind\n type: none\n device: /data/zealot/redis\n\n zealot-postgres:\n driver: local\n driver_opts:\n o: bind\n type: none\n device: /data/zealot/postgres\n"})}),"\n",(0,t.jsx)(n.h2,{id:"complete-example",children:"Complete example"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",children:'version: "3.8"\n\nx-restart-policy: &restart_policy\n restart: unless-stopped\n\nx-defaults: &defaults\n <<: *restart_policy\n image: ghcr.io/tryzealot/zealot:nightly\n depends_on:\n - redis\n - postgres\n env_file: .env\n volumes:\n - zealot-uploads:/app/public/uploads\n - zealot-backup:/app/public/backup\n - ./log:/app/log # Optional: persisting log files.\n healthcheck:\n test: ["CMD-SHELL", "wget -q --spider --proxy=off localhost/health || exit 1"]\n\nservices:\n redis:\n <<: *restart_policy\n image: redis:7-alpine\n command: redis-server\n volumes:\n - zealot-redis:/data\n healthcheck:\n test: ["CMD", "redis-cli", "ping"]\n postgres:\n <<: *restart_policy\n image: postgres:14-alpine\n volumes:\n - zealot-postgres:/var/lib/postgresql/data\n environment:\n POSTGRES_PASSWORD: ze@l0t\n healthcheck:\n test: ["CMD", "pg_isready", "-U", "postgres"]\n zealot:\n <<: *defaults\n # Port mapping can be enabled without the need for reverse proxy,\n # mutually exclusive with the web reverse proxy service below.\n ports:\n - "80:80"\n # Optional: Use a reverse proxy to host SSL certificates and services.\n web:\n image: caddy:2-alpine\n ports:\n - "80:80"\n - "443:443"\n volumes:\n - ./caddy/etc/caddy/Caddyfile:/etc/caddy/Caddyfile:ro\n - ./caddy/etc/caddy/certs:/etc/caddy/certs:ro\n env_file: .env\n environment:\n ACME_AGREE: "true"\n\n# There are three methods of persistence:\nvolumes:\n # 1. docker compose inside volumes\n - zealot-uploads\n - zealot-backup\n - zealot-redis\n - zealot-postgres\n\n # 2. docker compose external volumes\n zealot-uploads:\n external: true\n zealot-backup:\n external: true\n zealot-redis:\n external: true\n zealot-postgres:\n external: true\n\n # 3. mount local path\n zealot-uploads:\n driver: local\n driver_opts:\n o: bind\n type: none\n device: /tmp/zealot/uploads\n zealot-backup:\n driver: local\n driver_opts:\n o: bind\n type: none\n device: /tmp/zealot/backup\n zealot-redis:\n driver: local\n driver_opts:\n o: bind\n type: none\n device: /tmp/redis\n zealot-postgres:\n driver: local\n driver_opts:\n o: bind\n type: none\n device: /tmp/postgres\n'})})]})}function p(e={}){const{wrapper:n}={...(0,s.a)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(c,{...e})}):c(e)}},1151:(e,n,o)=>{o.d(n,{Z:()=>i,a:()=>r});var t=o(7294);const s={},l=t.createContext(s);function r(e){const n=t.useContext(l);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),t.createElement(l.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/6f76ba3b.54a44992.js b/assets/js/6f76ba3b.54a44992.js new file mode 100644 index 000000000..9e7fb0b3b --- /dev/null +++ b/assets/js/6f76ba3b.54a44992.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[5013],{5401:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>l,contentTitle:()=>r,default:()=>h,frontMatter:()=>a,metadata:()=>o,toc:()=>d});var s=i(5893),t=i(1151);const a={},r="Environment Variables",o={id:"self-hosted/configuration/environment-variables",title:"Environment Variables",description:"The .env File",source:"@site/versioned_docs/version-5.1.0/self-hosted/configuration/environment-variables.md",sourceDirName:"self-hosted/configuration",slug:"/self-hosted/configuration/environment-variables",permalink:"/docs/5.1.0/self-hosted/configuration/environment-variables",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.1.0/self-hosted/configuration/environment-variables.md",tags:[],version:"5.1.0",frontMatter:{},sidebar:"selfHosted",previous:{title:"Configuration",permalink:"/docs/5.1.0/category/configuration"},next:{title:"Third-party Authentication",permalink:"/docs/5.1.0/self-hosted/configuration/third-party-authentication"}},l={},d=[{value:"The .env File",id:"the-env-file",level:2},{value:"Configure HTTPS (SSL)",id:"configure-https-ssl",level:2},{value:"Configure URL (Domain)",id:"configure-url-domain",level:2},{value:"Database configuration",id:"database-configuration",level:2},{value:"Postgresql",id:"postgresql",level:3},{value:"Redis",id:"redis",level:3},{value:"Configure default language",id:"configure-default-language",level:2},{value:"Configure default appearance",id:"configure-default-appearance",level:2},{value:"Configure default Administer",id:"configure-default-administer",level:2},{value:"Enable new user registration",id:"enable-new-user-registration",level:2},{value:"Enable guest mode",id:"enable-guest-mode",level:2},{value:"Configure emails",id:"configure-emails",level:2},{value:"Disbale Cable request protection",id:"disbale-cable-request-protection",level:2}];function c(e){const n={a:"a",blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",h3:"h3",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,t.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h1,{id:"environment-variables",children:"Environment Variables"}),"\n",(0,s.jsx)(n.h2,{id:"the-env-file",children:"The .env File"}),"\n",(0,s.jsxs)(n.p,{children:["You can set the correct values as per the following options. Once you set the values, you should rename the file to ",(0,s.jsx)(n.code,{children:".env"})," before you start the server."]}),"\n",(0,s.jsx)(n.h2,{id:"configure-https-ssl",children:"Configure HTTPS (SSL)"}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Due to Apple's mandatory requirement of mandatory HTTPS for online deployment and download services"}),", d\nownloading applications will be forced to go HTTPS protocol when redeploying."]}),"\n",(0,s.jsx)(n.p,{children:"If the deployment is a standalone service on a single machine, it is recommended to enable Let's Encrypt free SSL certificate:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"ZEALOT_CERT_EMAIL=zealot@example.com\n"})}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsx)(n.p,{children:"The following self-signed certificate file name, can not be set at the same time"}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"If the deployed machine can only use self-signed certificates, they need to be configured,\nbut note that iOS downloads require the iOS device to authorize the self-signed certificate before the download and installation is allowed. (Not recommended)"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"ZEALOT_CERT=zealot.test.pem\nZEALOT_CERT_KEY=zealot.test-key.pem\n"})}),"\n",(0,s.jsx)(n.h2,{id:"configure-url-domain",children:"Configure URL (Domain)"}),"\n",(0,s.jsx)(n.p,{children:"Must be configured otherwise downloaded applications and some static resources will not be accessed correctly"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"# No need http:// or https://\nZEALOT_DOMAIN=zealot.com\n"})}),"\n",(0,s.jsx)(n.h2,{id:"database-configuration",children:"Database configuration"}),"\n",(0,s.jsx)(n.p,{children:"If you have reusable postgresql and redis services,\nyou can also customize the configuration to use them instead of\nusing the services configured by default with docker-compose."}),"\n",(0,s.jsx)(n.h3,{id:"postgresql",children:"Postgresql"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"ZEALOT_POSTGRES_HOST=127.0.0.1\nZEALOT_POSTGRES_PORT=5432\nZEALOT_POSTGRES_USERNAME=postgres\nZEALOT_POSTGRES_PASSWORD=ze@l0t\nZEALOT_POSTGRES_DB_NAME=zealot\n"})}),"\n",(0,s.jsx)(n.h3,{id:"redis",children:"Redis"}),"\n",(0,s.jsx)(n.p,{children:"This is a URL connection mainly for most cloud services compatibility"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"REDIS_URL=redis://user:pass@127.0.0.1:6379/0\n\n# Redis over SSL\nREDIS_URL=rediss://user:pass@127.0.0.1:6379/0\n"})}),"\n",(0,s.jsx)(n.h2,{id:"configure-default-language",children:"Configure default language"}),"\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"Packs"}),(0,s.jsx)(n.th,{children:"Value"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"zh-CN"}),(0,s.jsx)(n.td,{children:"Simplified Chinese (default)"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"en"}),(0,s.jsx)(n.td,{children:"English"})]})]})]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"DEFAULT_LOCALE=en\n"})}),"\n",(0,s.jsx)(n.h2,{id:"configure-default-appearance",children:"Configure default appearance"}),"\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"Appearance"}),(0,s.jsx)(n.th,{children:"Value"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"light"}),(0,s.jsx)(n.td,{children:"Light mode(default)"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"dark"}),(0,s.jsx)(n.td,{children:"Dark mode"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"auto"}),(0,s.jsx)(n.td,{children:"System auto"})]})]})]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"ZEALOT_APPEARANCE=dark\n"})}),"\n",(0,s.jsx)(n.h2,{id:"configure-default-administer",children:"Configure default Administer"}),"\n",(0,s.jsx)(n.p,{children:"The default does not configure the following will also generate the following account and\npassword as an account with administrator privileges, it is recommended to change the password again after configuration."}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"ZEALOT_ADMIN_EMAIL=admin@zealot.com\nZEALOT_ADMIN_PASSWORD=ze@l0t\n"})}),"\n",(0,s.jsx)(n.h2,{id:"enable-new-user-registration",children:"Enable new user registration"}),"\n",(0,s.jsx)(n.p,{children:"After closing the registration, the administrator can add users manually through the user management in the administration panel."}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"# Open registration\nZEALOT_REGISTER_ENABLED=true\n\n# Close registration\nZEALOT_REGISTER_ENABLED=false\n"})}),"\n",(0,s.jsx)(n.h2,{id:"enable-guest-mode",children:"Enable guest mode"}),"\n",(0,s.jsxs)(n.p,{children:["Enable the visitor mode to allow the application to view, download and install,\nit is recommended that the company internal reliance on permissions is not high condition to use,\nspecific permission comparison can ",(0,s.jsx)(n.a,{href:"/docs/user-guide/administrator/permissions",children:"see here for details"})]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"# Guest mode is ON\nZEALOT_GUEST_MODE=true\n\n# Guest mode is OFF\nZEALOT_GUEST_MODE=false\n"})}),"\n",(0,s.jsx)(n.h2,{id:"configure-emails",children:"Configure emails"}),"\n",(0,s.jsxs)(n.p,{children:["Currently, only ",(0,s.jsx)(n.code,{children:"smtp"})," is supported to configure email notification service.\nEmail notification mainly affects are user registration, sending activation emails and\nchanging password service, but it does not affect the use if it is not turned on."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"# SMTP settings\nSMTP_ADDRESS=smtp.gmail.com\nSMTP_PORT=587\nSMTP_DOMAIN=gmail.com\nSMTP_USERNAME=you@gmail.com\nSMTP_PASSWORD=yourpassword\nSMTP_AUTH_METHOD=plain\nSMTP_ENABLE_STARTTLS_AUTO=true\n\n# Sender and email address by default\nACTION_MAILER_DEFAULT_FROM=you@gmail.com\nACTION_MAILER_DEFAULT_TO=you@gmail.com\n"})}),"\n",(0,s.jsx)(n.h2,{id:"disbale-cable-request-protection",children:"Disbale Cable request protection"}),"\n",(0,s.jsx)(n.p,{children:"Experimental:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"ZEALOT_DISABLE_CABLE_REQUEST_PROTECTION=true\n"})})]})}function h(e={}){const{wrapper:n}={...(0,t.a)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},1151:(e,n,i)=>{i.d(n,{Z:()=>o,a:()=>r});var s=i(7294);const t={},a=s.createContext(t);function r(e){const n=s.useContext(a);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:r(e.components),s.createElement(a.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/9b58cf90.88017192.js b/assets/js/70418616.5bef114f.js similarity index 97% rename from assets/js/9b58cf90.88017192.js rename to assets/js/70418616.5bef114f.js index e880d0e2d..183796d2c 100644 --- a/assets/js/9b58cf90.88017192.js +++ b/assets/js/70418616.5bef114f.js @@ -1 +1 @@ -"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[5308],{9522:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>u,contentTitle:()=>i,default:()=>p,frontMatter:()=>s,metadata:()=>c,toc:()=>d});var a=t(5893),r=t(1151),l=t(4866),o=t(5162);const s={sidebar_label:"iOS"},i="Zealot iOS SDK",c={id:"developer-guide/sdk/ios",title:"Zealot iOS SDK",description:"The iOS component provides a service to check for new versions and installations for Zealot,",source:"@site/versioned_docs/version-5.1.0/developer-guide/sdk/ios.md",sourceDirName:"developer-guide/sdk",slug:"/developer-guide/sdk/ios",permalink:"/docs/developer-guide/sdk/ios",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.1.0/developer-guide/sdk/ios.md",tags:[],version:"5.1.0",frontMatter:{sidebar_label:"iOS"},sidebar:"developerGuide",previous:{title:"SDKs",permalink:"/docs/category/sdks"},next:{title:"Android",permalink:"/docs/developer-guide/sdk/android"}},u={},d=[{value:"Install",id:"install",level:2},{value:"Cocoapods",id:"cocoapods",level:3},{value:"Usages",id:"usages",level:2},{value:"Import header",id:"import-header",level:3},{value:"Configure",id:"configure",level:3}];function h(e){const n={code:"code",h1:"h1",h2:"h2",h3:"h3",li:"li",ol:"ol",p:"p",pre:"pre",...(0,r.a)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(n.h1,{id:"zealot-ios-sdk",children:"Zealot iOS SDK"}),"\n",(0,a.jsx)(n.p,{children:"The iOS component provides a service to check for new versions and installations for Zealot,\nsupporting Swift and Objective-C."}),"\n",(0,a.jsx)(n.h2,{id:"install",children:"Install"}),"\n",(0,a.jsx)(n.h3,{id:"cocoapods",children:"Cocoapods"}),"\n",(0,a.jsxs)(n.p,{children:["Adding below code into ",(0,a.jsx)(n.code,{children:"Podfile"}),":"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-ruby",children:"pod 'Zealot', :git => 'https://github.com/tryzealot/zealot-ios.git', :branch => 'master'\n"})}),"\n",(0,a.jsx)(n.p,{children:"Install it\uff1a"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"pod install\n"})}),"\n",(0,a.jsx)(n.h2,{id:"usages",children:"Usages"}),"\n",(0,a.jsx)(n.h3,{id:"import-header",children:"Import header"}),"\n",(0,a.jsxs)(n.ol,{children:["\n",(0,a.jsxs)(n.li,{children:["Add the code in your ",(0,a.jsx)(n.code,{children:"AppDelegate"}),"\uff1a"]}),"\n"]}),"\n","\n","\n",(0,a.jsxs)(l.Z,{groupId:"ios-zealot-sdk",children:[(0,a.jsx)(o.Z,{value:"Swift",children:(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-swift",children:"import Zealot\n"})})}),(0,a.jsx)(o.Z,{value:"Objective-C",children:(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-objectivec",children:"// Objective-C\n#import \n"})})})]}),"\n",(0,a.jsx)(n.h3,{id:"configure",children:"Configure"}),"\n",(0,a.jsxs)(n.ol,{start:"2",children:["\n",(0,a.jsxs)(n.li,{children:["Add the following code in ",(0,a.jsx)(n.code,{children:"application:didFinishLaunchingWithOptions:"})," method block\uff1a"]}),"\n"]}),"\n",(0,a.jsxs)(l.Z,{groupId:"ios-zealot-sdk",children:[(0,a.jsx)(o.Z,{value:"Swift",children:(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-swift",children:'// Single channel\nlet zealot = Zealot(endpoint: "http://zealot.com", channelKey: "...")\nzealot.checkVersion()\n\n// Multi-channel, such as beta, adhoc versions\nlet zealot = Zealot(endpoint: "http://zealot.com",\n channelKeys: [\n "beta": "xxxxxxx",\n "test": "yyyyyyy"],\n default_enviroment: "beta")\n\n// Active it\nzealot.checkVersion()\n'})})}),(0,a.jsx)(o.Z,{value:"Objective-C",children:(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-objectivec",children:'// Single channel\nZealot *zealot = [[Zealot alloc] initWithEndpoint:@"http://zealot.com"\n channelKey:@"..."];\n\n// Multi-channel, such as beta, adhoc versions\nZealot *zealot = [[Zealot alloc] initWithEndpoint:@"http://zealot.com"\n channelKeys:@{\n @"beta": @"xxxxxxx",\n @"gray": @"yyyyyyy"\n }\n default_enviroment:@"beta"];\n\n// Active it\n[zealot checkVersion];\n'})})})]})]})}function p(e={}){const{wrapper:n}={...(0,r.a)(),...e.components};return n?(0,a.jsx)(n,{...e,children:(0,a.jsx)(h,{...e})}):h(e)}},5162:(e,n,t)=>{t.d(n,{Z:()=>o});t(7294);var a=t(512);const r={tabItem:"tabItem_Ymn6"};var l=t(5893);function o(e){let{children:n,hidden:t,className:o}=e;return(0,l.jsx)("div",{role:"tabpanel",className:(0,a.Z)(r.tabItem,o),hidden:t,children:n})}},4866:(e,n,t)=>{t.d(n,{Z:()=>k});var a=t(7294),r=t(512),l=t(2466),o=t(6550),s=t(469),i=t(1980),c=t(7392),u=t(12);function d(e){return a.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,a.isValidElement)(e)&&function(e){const{props:n}=e;return!!n&&"object"==typeof n&&"value"in n}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function h(e){const{values:n,children:t}=e;return(0,a.useMemo)((()=>{const e=n??function(e){return d(e).map((e=>{let{props:{value:n,label:t,attributes:a,default:r}}=e;return{value:n,label:t,attributes:a,default:r}}))}(t);return function(e){const n=(0,c.l)(e,((e,n)=>e.value===n.value));if(n.length>0)throw new Error(`Docusaurus error: Duplicate values "${n.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[n,t])}function p(e){let{value:n,tabValues:t}=e;return t.some((e=>e.value===n))}function v(e){let{queryString:n=!1,groupId:t}=e;const r=(0,o.k6)(),l=function(e){let{queryString:n=!1,groupId:t}=e;if("string"==typeof n)return n;if(!1===n)return null;if(!0===n&&!t)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return t??null}({queryString:n,groupId:t});return[(0,i._X)(l),(0,a.useCallback)((e=>{if(!l)return;const n=new URLSearchParams(r.location.search);n.set(l,e),r.replace({...r.location,search:n.toString()})}),[l,r])]}function f(e){const{defaultValue:n,queryString:t=!1,groupId:r}=e,l=h(e),[o,i]=(0,a.useState)((()=>function(e){let{defaultValue:n,tabValues:t}=e;if(0===t.length)throw new Error("Docusaurus error: the component requires at least one children component");if(n){if(!p({value:n,tabValues:t}))throw new Error(`Docusaurus error: The has a defaultValue "${n}" but none of its children has the corresponding value. Available values are: ${t.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return n}const a=t.find((e=>e.default))??t[0];if(!a)throw new Error("Unexpected error: 0 tabValues");return a.value}({defaultValue:n,tabValues:l}))),[c,d]=v({queryString:t,groupId:r}),[f,m]=function(e){let{groupId:n}=e;const t=function(e){return e?`docusaurus.tab.${e}`:null}(n),[r,l]=(0,u.Nk)(t);return[r,(0,a.useCallback)((e=>{t&&l.set(e)}),[t,l])]}({groupId:r}),b=(()=>{const e=c??f;return p({value:e,tabValues:l})?e:null})();(0,s.Z)((()=>{b&&i(b)}),[b]);return{selectedValue:o,selectValue:(0,a.useCallback)((e=>{if(!p({value:e,tabValues:l}))throw new Error(`Can't select invalid tab value=${e}`);i(e),d(e),m(e)}),[d,m,l]),tabValues:l}}var m=t(2389);const b={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var g=t(5893);function x(e){let{className:n,block:t,selectedValue:a,selectValue:o,tabValues:s}=e;const i=[],{blockElementScrollPositionUntilNextRender:c}=(0,l.o5)(),u=e=>{const n=e.currentTarget,t=i.indexOf(n),r=s[t].value;r!==a&&(c(n),o(r))},d=e=>{let n=null;switch(e.key){case"Enter":u(e);break;case"ArrowRight":{const t=i.indexOf(e.currentTarget)+1;n=i[t]??i[0];break}case"ArrowLeft":{const t=i.indexOf(e.currentTarget)-1;n=i[t]??i[i.length-1];break}}n?.focus()};return(0,g.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.Z)("tabs",{"tabs--block":t},n),children:s.map((e=>{let{value:n,label:t,attributes:l}=e;return(0,g.jsx)("li",{role:"tab",tabIndex:a===n?0:-1,"aria-selected":a===n,ref:e=>i.push(e),onKeyDown:d,onClick:u,...l,className:(0,r.Z)("tabs__item",b.tabItem,l?.className,{"tabs__item--active":a===n}),children:t??n},n)}))})}function j(e){let{lazy:n,children:t,selectedValue:r}=e;const l=(Array.isArray(t)?t:[t]).filter(Boolean);if(n){const e=l.find((e=>e.props.value===r));return e?(0,a.cloneElement)(e,{className:"margin-top--md"}):null}return(0,g.jsx)("div",{className:"margin-top--md",children:l.map(((e,n)=>(0,a.cloneElement)(e,{key:n,hidden:e.props.value!==r})))})}function y(e){const n=f(e);return(0,g.jsxs)("div",{className:(0,r.Z)("tabs-container",b.tabList),children:[(0,g.jsx)(x,{...e,...n}),(0,g.jsx)(j,{...e,...n})]})}function k(e){const n=(0,m.Z)();return(0,g.jsx)(y,{...e,children:d(e.children)},String(n))}},1151:(e,n,t)=>{t.d(n,{Z:()=>s,a:()=>o});var a=t(7294);const r={},l=a.createContext(r);function o(e){const n=a.useContext(l);return a.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function s(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:o(e.components),a.createElement(l.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[3804],{6904:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>u,contentTitle:()=>i,default:()=>p,frontMatter:()=>s,metadata:()=>c,toc:()=>d});var a=t(5893),r=t(1151),l=t(4866),o=t(5162);const s={sidebar_label:"iOS"},i="Zealot iOS SDK",c={id:"developer-guide/sdk/ios",title:"Zealot iOS SDK",description:"The iOS component provides a service to check for new versions and installations for Zealot,",source:"@site/versioned_docs/version-5.2.0/developer-guide/sdk/ios.md",sourceDirName:"developer-guide/sdk",slug:"/developer-guide/sdk/ios",permalink:"/docs/developer-guide/sdk/ios",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.2.0/developer-guide/sdk/ios.md",tags:[],version:"5.2.0",frontMatter:{sidebar_label:"iOS"},sidebar:"developerGuide",previous:{title:"SDKs",permalink:"/docs/category/sdks"},next:{title:"Android",permalink:"/docs/developer-guide/sdk/android"}},u={},d=[{value:"Install",id:"install",level:2},{value:"Cocoapods",id:"cocoapods",level:3},{value:"Usages",id:"usages",level:2},{value:"Import header",id:"import-header",level:3},{value:"Configure",id:"configure",level:3}];function h(e){const n={code:"code",h1:"h1",h2:"h2",h3:"h3",li:"li",ol:"ol",p:"p",pre:"pre",...(0,r.a)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(n.h1,{id:"zealot-ios-sdk",children:"Zealot iOS SDK"}),"\n",(0,a.jsx)(n.p,{children:"The iOS component provides a service to check for new versions and installations for Zealot,\nsupporting Swift and Objective-C."}),"\n",(0,a.jsx)(n.h2,{id:"install",children:"Install"}),"\n",(0,a.jsx)(n.h3,{id:"cocoapods",children:"Cocoapods"}),"\n",(0,a.jsxs)(n.p,{children:["Adding below code into ",(0,a.jsx)(n.code,{children:"Podfile"}),":"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-ruby",children:"pod 'Zealot', :git => 'https://github.com/tryzealot/zealot-ios.git', :branch => 'master'\n"})}),"\n",(0,a.jsx)(n.p,{children:"Install it\uff1a"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"pod install\n"})}),"\n",(0,a.jsx)(n.h2,{id:"usages",children:"Usages"}),"\n",(0,a.jsx)(n.h3,{id:"import-header",children:"Import header"}),"\n",(0,a.jsxs)(n.ol,{children:["\n",(0,a.jsxs)(n.li,{children:["Add the code in your ",(0,a.jsx)(n.code,{children:"AppDelegate"}),"\uff1a"]}),"\n"]}),"\n","\n","\n",(0,a.jsxs)(l.Z,{groupId:"ios-zealot-sdk",children:[(0,a.jsx)(o.Z,{value:"Swift",children:(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-swift",children:"import Zealot\n"})})}),(0,a.jsx)(o.Z,{value:"Objective-C",children:(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-objectivec",children:"// Objective-C\n#import \n"})})})]}),"\n",(0,a.jsx)(n.h3,{id:"configure",children:"Configure"}),"\n",(0,a.jsxs)(n.ol,{start:"2",children:["\n",(0,a.jsxs)(n.li,{children:["Add the following code in ",(0,a.jsx)(n.code,{children:"application:didFinishLaunchingWithOptions:"})," method block\uff1a"]}),"\n"]}),"\n",(0,a.jsxs)(l.Z,{groupId:"ios-zealot-sdk",children:[(0,a.jsx)(o.Z,{value:"Swift",children:(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-swift",children:'// Single channel\nlet zealot = Zealot(endpoint: "http://zealot.com", channelKey: "...")\nzealot.checkVersion()\n\n// Multi-channel, such as beta, adhoc versions\nlet zealot = Zealot(endpoint: "http://zealot.com",\n channelKeys: [\n "beta": "xxxxxxx",\n "test": "yyyyyyy"],\n default_enviroment: "beta")\n\n// Active it\nzealot.checkVersion()\n'})})}),(0,a.jsx)(o.Z,{value:"Objective-C",children:(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-objectivec",children:'// Single channel\nZealot *zealot = [[Zealot alloc] initWithEndpoint:@"http://zealot.com"\n channelKey:@"..."];\n\n// Multi-channel, such as beta, adhoc versions\nZealot *zealot = [[Zealot alloc] initWithEndpoint:@"http://zealot.com"\n channelKeys:@{\n @"beta": @"xxxxxxx",\n @"gray": @"yyyyyyy"\n }\n default_enviroment:@"beta"];\n\n// Active it\n[zealot checkVersion];\n'})})})]})]})}function p(e={}){const{wrapper:n}={...(0,r.a)(),...e.components};return n?(0,a.jsx)(n,{...e,children:(0,a.jsx)(h,{...e})}):h(e)}},5162:(e,n,t)=>{t.d(n,{Z:()=>o});t(7294);var a=t(512);const r={tabItem:"tabItem_Ymn6"};var l=t(5893);function o(e){let{children:n,hidden:t,className:o}=e;return(0,l.jsx)("div",{role:"tabpanel",className:(0,a.Z)(r.tabItem,o),hidden:t,children:n})}},4866:(e,n,t)=>{t.d(n,{Z:()=>k});var a=t(7294),r=t(512),l=t(2466),o=t(6550),s=t(469),i=t(1980),c=t(7392),u=t(12);function d(e){return a.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,a.isValidElement)(e)&&function(e){const{props:n}=e;return!!n&&"object"==typeof n&&"value"in n}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function h(e){const{values:n,children:t}=e;return(0,a.useMemo)((()=>{const e=n??function(e){return d(e).map((e=>{let{props:{value:n,label:t,attributes:a,default:r}}=e;return{value:n,label:t,attributes:a,default:r}}))}(t);return function(e){const n=(0,c.l)(e,((e,n)=>e.value===n.value));if(n.length>0)throw new Error(`Docusaurus error: Duplicate values "${n.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[n,t])}function p(e){let{value:n,tabValues:t}=e;return t.some((e=>e.value===n))}function v(e){let{queryString:n=!1,groupId:t}=e;const r=(0,o.k6)(),l=function(e){let{queryString:n=!1,groupId:t}=e;if("string"==typeof n)return n;if(!1===n)return null;if(!0===n&&!t)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return t??null}({queryString:n,groupId:t});return[(0,i._X)(l),(0,a.useCallback)((e=>{if(!l)return;const n=new URLSearchParams(r.location.search);n.set(l,e),r.replace({...r.location,search:n.toString()})}),[l,r])]}function f(e){const{defaultValue:n,queryString:t=!1,groupId:r}=e,l=h(e),[o,i]=(0,a.useState)((()=>function(e){let{defaultValue:n,tabValues:t}=e;if(0===t.length)throw new Error("Docusaurus error: the component requires at least one children component");if(n){if(!p({value:n,tabValues:t}))throw new Error(`Docusaurus error: The has a defaultValue "${n}" but none of its children has the corresponding value. Available values are: ${t.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return n}const a=t.find((e=>e.default))??t[0];if(!a)throw new Error("Unexpected error: 0 tabValues");return a.value}({defaultValue:n,tabValues:l}))),[c,d]=v({queryString:t,groupId:r}),[f,m]=function(e){let{groupId:n}=e;const t=function(e){return e?`docusaurus.tab.${e}`:null}(n),[r,l]=(0,u.Nk)(t);return[r,(0,a.useCallback)((e=>{t&&l.set(e)}),[t,l])]}({groupId:r}),b=(()=>{const e=c??f;return p({value:e,tabValues:l})?e:null})();(0,s.Z)((()=>{b&&i(b)}),[b]);return{selectedValue:o,selectValue:(0,a.useCallback)((e=>{if(!p({value:e,tabValues:l}))throw new Error(`Can't select invalid tab value=${e}`);i(e),d(e),m(e)}),[d,m,l]),tabValues:l}}var m=t(2389);const b={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var g=t(5893);function x(e){let{className:n,block:t,selectedValue:a,selectValue:o,tabValues:s}=e;const i=[],{blockElementScrollPositionUntilNextRender:c}=(0,l.o5)(),u=e=>{const n=e.currentTarget,t=i.indexOf(n),r=s[t].value;r!==a&&(c(n),o(r))},d=e=>{let n=null;switch(e.key){case"Enter":u(e);break;case"ArrowRight":{const t=i.indexOf(e.currentTarget)+1;n=i[t]??i[0];break}case"ArrowLeft":{const t=i.indexOf(e.currentTarget)-1;n=i[t]??i[i.length-1];break}}n?.focus()};return(0,g.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.Z)("tabs",{"tabs--block":t},n),children:s.map((e=>{let{value:n,label:t,attributes:l}=e;return(0,g.jsx)("li",{role:"tab",tabIndex:a===n?0:-1,"aria-selected":a===n,ref:e=>i.push(e),onKeyDown:d,onClick:u,...l,className:(0,r.Z)("tabs__item",b.tabItem,l?.className,{"tabs__item--active":a===n}),children:t??n},n)}))})}function j(e){let{lazy:n,children:t,selectedValue:r}=e;const l=(Array.isArray(t)?t:[t]).filter(Boolean);if(n){const e=l.find((e=>e.props.value===r));return e?(0,a.cloneElement)(e,{className:"margin-top--md"}):null}return(0,g.jsx)("div",{className:"margin-top--md",children:l.map(((e,n)=>(0,a.cloneElement)(e,{key:n,hidden:e.props.value!==r})))})}function y(e){const n=f(e);return(0,g.jsxs)("div",{className:(0,r.Z)("tabs-container",b.tabList),children:[(0,g.jsx)(x,{...e,...n}),(0,g.jsx)(j,{...e,...n})]})}function k(e){const n=(0,m.Z)();return(0,g.jsx)(y,{...e,children:d(e.children)},String(n))}},1151:(e,n,t)=>{t.d(n,{Z:()=>s,a:()=>o});var a=t(7294);const r={},l=a.createContext(r);function o(e){const n=a.useContext(l);return a.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function s(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:o(e.components),a.createElement(l.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/77fdf6b1.9294a058.js b/assets/js/77fdf6b1.9294a058.js new file mode 100644 index 000000000..617a38ad1 --- /dev/null +++ b/assets/js/77fdf6b1.9294a058.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[8479],{3621:(s,e,d)=>{d.r(e),d.d(e,{assets:()=>c,contentTitle:()=>t,default:()=>h,frontMatter:()=>n,metadata:()=>l,toc:()=>x});var r=d(5893),i=d(1151);const n={sidebar_label:"Permissions"},t="User Permissions and roles",l={id:"user-guide/administrator/permissions",title:"User Permissions and roles",description:"Zealot offers four types of user permissions.",source:"@site/versioned_docs/version-5.1.0/user-guide/administrator/permissions.md",sourceDirName:"user-guide/administrator",slug:"/user-guide/administrator/permissions",permalink:"/docs/5.1.0/user-guide/administrator/permissions",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.1.0/user-guide/administrator/permissions.md",tags:[],version:"5.1.0",frontMatter:{sidebar_label:"Permissions"},sidebar:"userGuide",previous:{title:"Apple Team",permalink:"/docs/5.1.0/user-guide/administrator/apple-team"},next:{title:"Backup",permalink:"/docs/5.1.0/user-guide/administrator/backup"}},c={},x=[{value:"Comparison",id:"comparison",level:2}];function j(s){const e={code:"code",h1:"h1",h2:"h2",li:"li",p:"p",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,i.a)(),...s.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(e.h1,{id:"user-permissions-and-roles",children:"User Permissions and roles"}),"\n",(0,r.jsx)(e.p,{children:"Zealot offers four types of user permissions."}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsx)(e.li,{children:"Guest"}),"\n",(0,r.jsx)(e.li,{children:"User"}),"\n",(0,r.jsx)(e.li,{children:"Developer"}),"\n",(0,r.jsx)(e.li,{children:"Administrator"}),"\n"]}),"\n",(0,r.jsx)(e.h2,{id:"comparison",children:"Comparison"}),"\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"Action"}),(0,r.jsx)(e.th,{children:"Guest[On/Off]"}),(0,r.jsx)(e.th,{children:"User"}),(0,r.jsx)(e.th,{children:"Developer"}),(0,r.jsx)(e.th,{children:"Administrator"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsxs)(e.td,{children:[(0,r.jsx)(e.code,{children:"Dashboard"}),(0,r.jsx)("br",{}),"View all data"]}),(0,r.jsx)(e.td,{children:"\u2713/\u2715"}),(0,r.jsx)(e.td,{children:"\u2713"}),(0,r.jsx)(e.td,{children:"\u2713"}),(0,r.jsx)(e.td,{children:"\u2713"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsxs)(e.td,{children:[(0,r.jsx)(e.code,{children:"App"}),(0,r.jsx)("br",{}),"View app list"]}),(0,r.jsx)(e.td,{children:"\u2713/\u2715"}),(0,r.jsx)(e.td,{children:"\u2713"}),(0,r.jsx)(e.td,{children:"\u2713"}),(0,r.jsx)(e.td,{children:"\u2713"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsxs)(e.td,{children:[(0,r.jsx)(e.code,{children:"App"}),(0,r.jsx)("br",{}),"View app scheme(s) and channel(s) detail"]}),(0,r.jsx)(e.td,{children:"\u2713/\u2715"}),(0,r.jsx)(e.td,{children:"\u2713"}),(0,r.jsx)(e.td,{children:"\u2713"}),(0,r.jsx)(e.td,{children:"\u2713"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsxs)(e.td,{children:[(0,r.jsx)(e.code,{children:"App"}),(0,r.jsx)("br",{}),"View the build(release) of app"]}),(0,r.jsxs)(e.td,{children:["\u2713/\u2713 ",(0,r.jsx)("br",{}),"Password Auth"]}),(0,r.jsx)(e.td,{children:"\u2713"}),(0,r.jsx)(e.td,{children:"\u2713"}),(0,r.jsx)(e.td,{children:"\u2713"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsxs)(e.td,{children:[(0,r.jsx)(e.code,{children:"App"}),(0,r.jsx)("br",{}),"View webhook list"]}),(0,r.jsx)(e.td,{children:"\u2713/\u2715"}),(0,r.jsx)(e.td,{children:"\u2713"}),(0,r.jsx)(e.td,{children:"\u2713"}),(0,r.jsx)(e.td,{children:"\u2713"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsxs)(e.td,{children:[(0,r.jsx)(e.code,{children:"App"}),(0,r.jsx)("br",{}),"Upload/Install/Download app"]}),(0,r.jsx)(e.td,{children:"\u2713"}),(0,r.jsx)(e.td,{children:"\u2713"}),(0,r.jsx)(e.td,{children:"\u2713"}),(0,r.jsx)(e.td,{children:"\u2713"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsxs)(e.td,{children:[(0,r.jsx)(e.code,{children:"App"}),(0,r.jsx)("br",{}),"Create/Edit/Delete an app"]}),(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{children:"\u2713"}),(0,r.jsx)(e.td,{children:"\u2713"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsxs)(e.td,{children:[(0,r.jsx)(e.code,{children:"App"}),(0,r.jsx)("br",{}),"Create/Edit/Delete a scheme/channel of app"]}),(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{children:"\u2713"}),(0,r.jsx)(e.td,{children:"\u2713"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsxs)(e.td,{children:[(0,r.jsx)(e.code,{children:"App"}),(0,r.jsx)("br",{}),"Delete a given version of app"]}),(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{children:"\u2713"}),(0,r.jsx)(e.td,{children:"\u2713"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsxs)(e.td,{children:[(0,r.jsx)(e.code,{children:"App"}),(0,r.jsx)("br",{}),"Test a webhook network connection"]}),(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{children:"\u2713"}),(0,r.jsx)(e.td,{children:"\u2713"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsxs)(e.td,{children:[(0,r.jsx)(e.code,{children:"App"}),(0,r.jsx)("br",{}),"Enable/Disable webhook"]}),(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{children:"\u2713"}),(0,r.jsx)(e.td,{children:"\u2713"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsxs)(e.td,{children:[(0,r.jsx)(e.code,{children:"App"}),(0,r.jsx)("br",{}),"Delete an app"]}),(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{children:"\u2713"}),(0,r.jsx)(e.td,{children:"\u2713"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsxs)(e.td,{children:[(0,r.jsx)(e.code,{children:"DebugFile"}),(0,r.jsx)("br",{}),"View debug file list"]}),(0,r.jsx)(e.td,{children:"\u2713/\u2715"}),(0,r.jsx)(e.td,{children:"\u2713"}),(0,r.jsx)(e.td,{children:"\u2713"}),(0,r.jsx)(e.td,{children:"\u2713"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsxs)(e.td,{children:[(0,r.jsx)(e.code,{children:"DebugFile"}),(0,r.jsx)("br",{}),"View debug file detail"]}),(0,r.jsx)(e.td,{children:"\u2713"}),(0,r.jsx)(e.td,{children:"\u2713"}),(0,r.jsx)(e.td,{children:"\u2713"}),(0,r.jsx)(e.td,{children:"\u2713"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsxs)(e.td,{children:[(0,r.jsx)(e.code,{children:"DebugFile"}),(0,r.jsx)("br",{}),"Download debug file"]}),(0,r.jsx)(e.td,{children:"\u2713"}),(0,r.jsx)(e.td,{children:"\u2713"}),(0,r.jsx)(e.td,{children:"\u2713"}),(0,r.jsx)(e.td,{children:"\u2713"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsxs)(e.td,{children:[(0,r.jsx)(e.code,{children:"DebugFile"}),(0,r.jsx)("br",{}),"Upload/Delete a debug file"]}),(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{children:"\u2713"}),(0,r.jsx)(e.td,{children:"\u2713"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsxs)(e.td,{children:[(0,r.jsx)(e.code,{children:"Teardown"}),(0,r.jsx)("br",{}),"View teardown list"]}),(0,r.jsx)(e.td,{children:"\u2713/\u2715"}),(0,r.jsx)(e.td,{children:"\u2713"}),(0,r.jsx)(e.td,{children:"\u2713"}),(0,r.jsx)(e.td,{children:"\u2713"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsxs)(e.td,{children:[(0,r.jsx)(e.code,{children:"Teardown"}),(0,r.jsx)("br",{}),"View teardown detail"]}),(0,r.jsx)(e.td,{children:"\u2713/\u2715"}),(0,r.jsx)(e.td,{children:"\u2713"}),(0,r.jsx)(e.td,{children:"\u2713"}),(0,r.jsx)(e.td,{children:"\u2713"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsxs)(e.td,{children:[(0,r.jsx)(e.code,{children:"Teardown"}),(0,r.jsx)("br",{}),"Delete a teardown"]}),(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{children:"\u2713"}),(0,r.jsx)(e.td,{children:"\u2713"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsxs)(e.td,{children:[(0,r.jsx)(e.code,{children:"Admin"}),(0,r.jsx)("br",{}),"View and manage users"]}),(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{children:"\u2713"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsxs)(e.td,{children:[(0,r.jsx)(e.code,{children:"Admin"}),(0,r.jsx)("br",{}),"View and manage webhooks"]}),(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{children:"\u2713"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsxs)(e.td,{children:[(0,r.jsx)(e.code,{children:"Admin"}),(0,r.jsx)("br",{}),"View and manage settings"]}),(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{children:"\u2713"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsxs)(e.td,{children:[(0,r.jsx)(e.code,{children:"Admin"}),(0,r.jsx)("br",{}),"View system informations"]}),(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{children:"\u2713"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsxs)(e.td,{children:[(0,r.jsx)(e.code,{children:"Admin"}),(0,r.jsx)("br",{}),"View and manage background jobs"]}),(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{children:"\u2713"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsxs)(e.td,{children:[(0,r.jsx)(e.code,{children:"Admin"}),(0,r.jsx)("br",{}),"View page analytices"]}),(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{children:"\u2713"})]})]})]})]})}function h(s={}){const{wrapper:e}={...(0,i.a)(),...s.components};return e?(0,r.jsx)(e,{...s,children:(0,r.jsx)(j,{...s})}):j(s)}},1151:(s,e,d)=>{d.d(e,{Z:()=>l,a:()=>t});var r=d(7294);const i={},n=r.createContext(i);function t(s){const e=r.useContext(n);return r.useMemo((function(){return"function"==typeof s?s(e):{...e,...s}}),[e,s])}function l(s){let e;return e=s.disableParentContext?"function"==typeof s.components?s.components(i):s.components||i:t(s.components),r.createElement(n.Provider,{value:e},s.children)}}}]); \ No newline at end of file diff --git a/assets/js/e5cd0e52.f97a0af0.js b/assets/js/793534f3.4855187a.js similarity index 85% rename from assets/js/e5cd0e52.f97a0af0.js rename to assets/js/793534f3.4855187a.js index 30347fba8..017b317db 100644 --- a/assets/js/e5cd0e52.f97a0af0.js +++ b/assets/js/793534f3.4855187a.js @@ -1 +1 @@ -"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[8130],{3094:(t,e,n)=>{n.r(e),n.d(e,{assets:()=>u,contentTitle:()=>d,default:()=>l,frontMatter:()=>a,metadata:()=>c,toc:()=>g});var s=n(5893),i=n(1151),r=n(9965),o=n(4996);const a={},d="Settings",c={id:"user-guide/administrator/settings",title:"Settings",description:"{n.d(e,{Z:()=>a,a:()=>o});var s=n(7294);const i={},r=s.createContext(i);function o(t){const e=s.useContext(r);return s.useMemo((function(){return"function"==typeof t?t(e):{...e,...t}}),[e,t])}function a(t){let e;return e=t.disableParentContext?"function"==typeof t.components?t.components(i):t.components||i:o(t.components),s.createElement(r.Provider,{value:e},t.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[1108],{4780:(t,e,n)=>{n.r(e),n.d(e,{assets:()=>u,contentTitle:()=>d,default:()=>l,frontMatter:()=>a,metadata:()=>c,toc:()=>g});var s=n(5893),i=n(1151),r=n(9965),o=n(4996);const a={},d="Settings",c={id:"user-guide/administrator/settings",title:"Settings",description:"{n.d(e,{Z:()=>a,a:()=>o});var s=n(7294);const i={},r=s.createContext(i);function o(t){const e=s.useContext(r);return s.useMemo((function(){return"function"==typeof t?t(e):{...e,...t}}),[e,t])}function a(t){let e;return e=t.disableParentContext?"function"==typeof t.components?t.components(i):t.components||i:o(t.components),s.createElement(r.Provider,{value:e},t.children)}}}]); \ No newline at end of file diff --git a/assets/js/7ac1225b.23497056.js b/assets/js/7ac1225b.23497056.js new file mode 100644 index 000000000..b677f38e3 --- /dev/null +++ b/assets/js/7ac1225b.23497056.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[929],{2555:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>i,contentTitle:()=>c,default:()=>u,frontMatter:()=>r,metadata:()=>d,toc:()=>a});var o=n(5893),s=n(1151);const r={},c="Discord",d={id:"user-guide/webhooks/discord",title:"Discord",description:"Discord should use Slack-Compatible Webhook whose constructs",source:"@site/versioned_docs/version-5.1.0/user-guide/webhooks/discord.md",sourceDirName:"user-guide/webhooks",slug:"/user-guide/webhooks/discord",permalink:"/docs/5.1.0/user-guide/webhooks/discord",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.1.0/user-guide/webhooks/discord.md",tags:[],version:"5.1.0",frontMatter:{},sidebar:"userGuide",previous:{title:"Slack",permalink:"/docs/5.1.0/user-guide/webhooks/slack"},next:{title:"Lark (Feishu)",permalink:"/docs/5.1.0/user-guide/webhooks/feishu"}},i={},a=[{value:"Text format",id:"text-format",level:2},{value:"Block rich text format",id:"block-rich-text-format",level:2}];function l(e){const t={a:"a",code:"code",h1:"h1",h2:"h2",p:"p",pre:"pre",...(0,s.a)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.h1,{id:"discord",children:"Discord"}),"\n",(0,o.jsxs)(t.p,{children:[(0,o.jsx)(t.a,{href:"https://support.discord.com/hc/en-us/articles/228383668-Intro-to-Webhooks",children:"Discord"})," should use Slack-Compatible Webhook whose constructs\ntypically support both text and block rich text, and can be configured as follows:"]}),"\n",(0,o.jsx)(t.h2,{id:"text-format",children:"Text format"}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{className:"language-ruby",children:'{\n "text": "##{@title}\\nPlatform: #{@device_type}\\nUpload at: #{@uploaded_at}"\n}\n'})}),"\n",(0,o.jsx)(t.h2,{id:"block-rich-text-format",children:"Block rich text format"}),"\n",(0,o.jsx)(t.p,{children:"A simple block with markdown support"}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{className:"language-ruby",children:'{\n "blocks": [\n {\n "type": "section",\n "text": {\n "type": "mrkdwn",\n "text": "## #{@title}\\nPlatform: #{@device_type}\\nUpload at: #{@uploaded_at}\\nInstal QRcode:\\n![qrcode](#{@qrcode_url})"\n }\n }\n ]\n}\n'})}),"\n",(0,o.jsx)(t.p,{children:"Better look at some of the structures shown in the block"}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{className:"language-ruby",children:'{\n "blocks": [\n {\n "type": "section",\n "text": {\n "type": "mrkdwn",\n "text": @title,\n }\n },\n {\n "type": "section",\n "fields": [\n {\n "type": "mrkdwn",\n "text": "*Platform:*\\n#{@device_type}"\n },\n {\n "type": "mrkdwn",\n "text": "*Upload at:*\\n#{@uploaded_at}"\n }\n ]\n },\n "accessory": {\n "type": "image",\n "image_url": @qrcode_url,\n "alt_text": "install qrcode"\n }\n ]\n}\n'})})]})}function u(e={}){const{wrapper:t}={...(0,s.a)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(l,{...e})}):l(e)}},1151:(e,t,n)=>{n.d(t,{Z:()=>d,a:()=>c});var o=n(7294);const s={},r=o.createContext(s);function c(e){const t=o.useContext(r);return o.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function d(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:c(e.components),o.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/7ac1225b.6d8494d5.js b/assets/js/7ac1225b.6d8494d5.js deleted file mode 100644 index 84ebc42fd..000000000 --- a/assets/js/7ac1225b.6d8494d5.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[929],{2555:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>i,contentTitle:()=>c,default:()=>u,frontMatter:()=>r,metadata:()=>d,toc:()=>a});var o=n(5893),s=n(1151);const r={},c="Discord",d={id:"user-guide/webhooks/discord",title:"Discord",description:"Discord should use Slack-Compatible Webhook whose constructs",source:"@site/versioned_docs/version-5.1.0/user-guide/webhooks/discord.md",sourceDirName:"user-guide/webhooks",slug:"/user-guide/webhooks/discord",permalink:"/docs/user-guide/webhooks/discord",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.1.0/user-guide/webhooks/discord.md",tags:[],version:"5.1.0",frontMatter:{},sidebar:"userGuide",previous:{title:"Slack",permalink:"/docs/user-guide/webhooks/slack"},next:{title:"Lark (Feishu)",permalink:"/docs/user-guide/webhooks/feishu"}},i={},a=[{value:"Text format",id:"text-format",level:2},{value:"Block rich text format",id:"block-rich-text-format",level:2}];function l(e){const t={a:"a",code:"code",h1:"h1",h2:"h2",p:"p",pre:"pre",...(0,s.a)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.h1,{id:"discord",children:"Discord"}),"\n",(0,o.jsxs)(t.p,{children:[(0,o.jsx)(t.a,{href:"https://support.discord.com/hc/en-us/articles/228383668-Intro-to-Webhooks",children:"Discord"})," should use Slack-Compatible Webhook whose constructs\ntypically support both text and block rich text, and can be configured as follows:"]}),"\n",(0,o.jsx)(t.h2,{id:"text-format",children:"Text format"}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{className:"language-ruby",children:'{\n "text": "##{@title}\\nPlatform: #{@device_type}\\nUpload at: #{@uploaded_at}"\n}\n'})}),"\n",(0,o.jsx)(t.h2,{id:"block-rich-text-format",children:"Block rich text format"}),"\n",(0,o.jsx)(t.p,{children:"A simple block with markdown support"}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{className:"language-ruby",children:'{\n "blocks": [\n {\n "type": "section",\n "text": {\n "type": "mrkdwn",\n "text": "## #{@title}\\nPlatform: #{@device_type}\\nUpload at: #{@uploaded_at}\\nInstal QRcode:\\n![qrcode](#{@qrcode_url})"\n }\n }\n ]\n}\n'})}),"\n",(0,o.jsx)(t.p,{children:"Better look at some of the structures shown in the block"}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{className:"language-ruby",children:'{\n "blocks": [\n {\n "type": "section",\n "text": {\n "type": "mrkdwn",\n "text": @title,\n }\n },\n {\n "type": "section",\n "fields": [\n {\n "type": "mrkdwn",\n "text": "*Platform:*\\n#{@device_type}"\n },\n {\n "type": "mrkdwn",\n "text": "*Upload at:*\\n#{@uploaded_at}"\n }\n ]\n },\n "accessory": {\n "type": "image",\n "image_url": @qrcode_url,\n "alt_text": "install qrcode"\n }\n ]\n}\n'})})]})}function u(e={}){const{wrapper:t}={...(0,s.a)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(l,{...e})}):l(e)}},1151:(e,t,n)=>{n.d(t,{Z:()=>d,a:()=>c});var o=n(7294);const s={},r=o.createContext(s);function c(e){const t=o.useContext(r);return o.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function d(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:c(e.components),o.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/7e0b4e5f.9a131e4a.js b/assets/js/7e0b4e5f.9a131e4a.js new file mode 100644 index 000000000..943473353 --- /dev/null +++ b/assets/js/7e0b4e5f.9a131e4a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[5791],{3028:(e,d,i)=>{i.r(d),i.d(d,{assets:()=>c,contentTitle:()=>s,default:()=>o,frontMatter:()=>l,metadata:()=>t,toc:()=>a});var n=i(5893),r=i(1151);const l={sidebar_label:"Debug Files"},s="Debug File APIs",t={id:"developer-guide/api/debug_files",title:"Debug File APIs",description:"Upload debug file",source:"@site/versioned_docs/version-5.1.0/developer-guide/api/debug_files.md",sourceDirName:"developer-guide/api",slug:"/developer-guide/api/debug_files",permalink:"/docs/5.1.0/developer-guide/api/debug_files",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.1.0/developer-guide/api/debug_files.md",tags:[],version:"5.1.0",frontMatter:{sidebar_label:"Debug Files"},sidebar:"developerGuide",previous:{title:"Apps",permalink:"/docs/5.1.0/developer-guide/api/apps"}},c={},a=[{value:"Upload debug file",id:"upload-debug-file",level:2},{value:"Parameters",id:"parameters",level:3},{value:"Return body",id:"return-body",level:3},{value:"Download debug file",id:"download-debug-file",level:2},{value:"Parameters",id:"parameters-1",level:3},{value:"Return body",id:"return-body-1",level:3},{value:"List debug files",id:"list-debug-files",level:2},{value:"Parameters",id:"parameters-2",level:3},{value:"Return body",id:"return-body-2",level:3},{value:"Get a debug file",id:"get-a-debug-file",level:2},{value:"Parameters",id:"parameters-3",level:3},{value:"Return body",id:"return-body-3",level:3},{value:"Update a existed debug file",id:"update-a-existed-debug-file",level:2},{value:"Parameters",id:"parameters-4",level:3},{value:"Return body",id:"return-body-4",level:3},{value:"Delete a debug file",id:"delete-a-debug-file",level:2},{value:"Parameters",id:"parameters-5",level:3},{value:"Return body",id:"return-body-5",level:3}];function h(e){const d={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,r.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(d.h1,{id:"debug-file-apis",children:"Debug File APIs"}),"\n",(0,n.jsx)(d.h2,{id:"upload-debug-file",children:"Upload debug file"}),"\n",(0,n.jsx)(d.p,{children:"This allows you to upload an single iOS, Android debug file."}),"\n",(0,n.jsx)(d.p,{children:"Debug file accepts:"}),"\n",(0,n.jsxs)(d.ul,{children:["\n",(0,n.jsx)(d.li,{children:"iOS: a Zipped dSYM file"}),"\n",(0,n.jsx)(d.li,{children:"Android: a Zipped file includes mapping.txt, R.txt or AndroidManifest.xml files."}),"\n"]}),"\n",(0,n.jsx)(d.pre,{children:(0,n.jsx)(d.code,{children:"POST /api/debug_files/upload\n"})}),"\n",(0,n.jsx)(d.h3,{id:"parameters",children:"Parameters"}),"\n",(0,n.jsx)(d.admonition,{type:"info",children:(0,n.jsxs)(d.p,{children:[(0,n.jsx)(d.a,{href:"/docs/developer-guide/api#authentication",children:"Authentication"})," required."]})}),"\n",(0,n.jsxs)(d.table,{children:[(0,n.jsx)(d.thead,{children:(0,n.jsxs)(d.tr,{children:[(0,n.jsx)(d.th,{children:"Attribute"}),(0,n.jsx)(d.th,{children:"Type"}),(0,n.jsx)(d.th,{children:"Required"}),(0,n.jsx)(d.th,{children:"Description"})]})}),(0,n.jsxs)(d.tbody,{children:[(0,n.jsxs)(d.tr,{children:[(0,n.jsx)(d.td,{children:"channel_key"}),(0,n.jsx)(d.td,{children:(0,n.jsx)(d.code,{children:"String"})}),(0,n.jsx)(d.td,{children:"true"}),(0,n.jsx)(d.td,{children:"Channel key"})]}),(0,n.jsxs)(d.tr,{children:[(0,n.jsx)(d.td,{children:"file"}),(0,n.jsx)(d.td,{children:(0,n.jsx)(d.code,{children:"File"})}),(0,n.jsx)(d.td,{children:"true"}),(0,n.jsx)(d.td,{children:"Arichved file by zip"})]}),(0,n.jsxs)(d.tr,{children:[(0,n.jsx)(d.td,{children:"release_version"}),(0,n.jsx)(d.td,{children:(0,n.jsx)(d.code,{children:"String"})}),(0,n.jsx)(d.td,{children:"true"}),(0,n.jsx)(d.td,{children:"Release version, ignore this param if iOS app"})]}),(0,n.jsxs)(d.tr,{children:[(0,n.jsx)(d.td,{children:"build_version"}),(0,n.jsx)(d.td,{children:(0,n.jsx)(d.code,{children:"String"})}),(0,n.jsx)(d.td,{children:"true"}),(0,n.jsx)(d.td,{children:"Build version, ignore this param if iOS app"})]})]})]}),"\n",(0,n.jsx)(d.h3,{id:"return-body",children:"Return body"}),"\n",(0,n.jsx)(d.pre,{children:(0,n.jsx)(d.code,{className:"language-json",children:'{\n "id": 1,\n "app_name": "Demo App",\n "device_type": "ios",\n "release_version": "1.14.0",\n "build_version": "980",\n "file_url": "https://tryzealot.ews.im/download/debug_files/1",\n "metadata": [\n {\n "id": 1,\n "debug_file_id": 1,\n "uuid": "34656552-21ae-3722-a7fb-3582bc9b1d98",\n "type": "arm64",\n "object": "AppName",\n "data": {},\n "size": 4137941,\n "created_at": "2022-11-25T15:53:15.157+08:00",\n "updated_at": "2022-11-25T15:53:15.157+08:00"\n }\n ]\n}\n'})}),"\n",(0,n.jsx)(d.h2,{id:"download-debug-file",children:"Download debug file"}),"\n",(0,n.jsx)(d.p,{children:"This allows you to download an single iOS, Android debug file."}),"\n",(0,n.jsx)(d.pre,{children:(0,n.jsx)(d.code,{children:"GET /api/debug_files/download\n"})}),"\n",(0,n.jsx)(d.h3,{id:"parameters-1",children:"Parameters"}),"\n",(0,n.jsxs)(d.table,{children:[(0,n.jsx)(d.thead,{children:(0,n.jsxs)(d.tr,{children:[(0,n.jsx)(d.th,{children:"Attribute"}),(0,n.jsx)(d.th,{children:"Type"}),(0,n.jsx)(d.th,{children:"Required"}),(0,n.jsx)(d.th,{children:"Description"})]})}),(0,n.jsxs)(d.tbody,{children:[(0,n.jsxs)(d.tr,{children:[(0,n.jsx)(d.td,{children:"channel_key"}),(0,n.jsx)(d.td,{children:(0,n.jsx)(d.code,{children:"String"})}),(0,n.jsx)(d.td,{children:"true"}),(0,n.jsx)(d.td,{children:"Channel key"})]}),(0,n.jsxs)(d.tr,{children:[(0,n.jsx)(d.td,{children:"release_version"}),(0,n.jsx)(d.td,{children:(0,n.jsx)(d.code,{children:"String"})}),(0,n.jsx)(d.td,{children:"true"}),(0,n.jsx)(d.td,{children:"Release version, ignore this param if iOS app"})]}),(0,n.jsxs)(d.tr,{children:[(0,n.jsx)(d.td,{children:"build_version"}),(0,n.jsx)(d.td,{children:(0,n.jsx)(d.code,{children:"String"})}),(0,n.jsx)(d.td,{children:"false"}),(0,n.jsx)(d.td,{children:"Build version, ignore this param if iOS app"})]}),(0,n.jsxs)(d.tr,{children:[(0,n.jsx)(d.td,{children:"order"}),(0,n.jsx)(d.td,{children:(0,n.jsx)(d.code,{children:"String"})}),(0,n.jsx)(d.td,{children:"false"}),(0,n.jsxs)(d.td,{children:["Order by ",(0,n.jsx)("br",{}),(0,n.jsx)(d.code,{children:"version"})," = latest version, ",(0,n.jsx)(d.code,{children:"upload_date"})," = last uploaded date",(0,n.jsx)("br",{}),(0,n.jsxs)(d.strong,{children:["Vaild in release_version is ",(0,n.jsx)(d.code,{children:"latest"})]})]})]})]})]}),"\n",(0,n.jsx)(d.h3,{id:"return-body-1",children:"Return body"}),"\n",(0,n.jsxs)(d.ul,{children:["\n",(0,n.jsx)(d.li,{children:"Retun 200 status code if the version exists and redirect to the download address with a 302 status code."}),"\n",(0,n.jsx)(d.li,{children:"return 404 status code if the version does not exist."}),"\n"]}),"\n",(0,n.jsx)(d.h2,{id:"list-debug-files",children:"List debug files"}),"\n",(0,n.jsx)(d.p,{children:"Get a list of debug files."}),"\n",(0,n.jsx)(d.p,{children:"This function takes pagination parameters page and per_page to restrict the list of debug files."}),"\n",(0,n.jsx)(d.pre,{children:(0,n.jsx)(d.code,{children:"GET /api/debug_files\n"})}),"\n",(0,n.jsx)(d.h3,{id:"parameters-2",children:"Parameters"}),"\n",(0,n.jsxs)(d.table,{children:[(0,n.jsx)(d.thead,{children:(0,n.jsxs)(d.tr,{children:[(0,n.jsx)(d.th,{children:"Attribute"}),(0,n.jsx)(d.th,{children:"Type"}),(0,n.jsx)(d.th,{children:"Required"}),(0,n.jsx)(d.th,{children:"Description"})]})}),(0,n.jsxs)(d.tbody,{children:[(0,n.jsxs)(d.tr,{children:[(0,n.jsx)(d.td,{children:"channel_key"}),(0,n.jsx)(d.td,{children:(0,n.jsx)(d.code,{children:"String"})}),(0,n.jsx)(d.td,{children:"true"}),(0,n.jsx)(d.td,{children:"Channel key"})]}),(0,n.jsxs)(d.tr,{children:[(0,n.jsx)(d.td,{children:"page"}),(0,n.jsx)(d.td,{children:(0,n.jsx)(d.code,{children:"Integer"})}),(0,n.jsx)(d.td,{children:"false"}),(0,n.jsxs)(d.td,{children:["Page number (default: ",(0,n.jsx)(d.code,{children:"1"}),")"]})]}),(0,n.jsxs)(d.tr,{children:[(0,n.jsx)(d.td,{children:"per_page"}),(0,n.jsx)(d.td,{children:(0,n.jsx)(d.code,{children:"Integer"})}),(0,n.jsx)(d.td,{children:"false"}),(0,n.jsxs)(d.td,{children:["Number of items to list per page (default: ",(0,n.jsx)(d.code,{children:"25"}),", max: ",(0,n.jsx)(d.code,{children:"100"}),")."]})]})]})]}),"\n",(0,n.jsx)(d.h3,{id:"return-body-2",children:"Return body"}),"\n",(0,n.jsx)(d.pre,{children:(0,n.jsx)(d.code,{className:"language-json",children:'[\n {\n "id": 1,\n "app_name": "Demo App",\n "device_type": "ios",\n "release_version": "1.14.0",\n "build_version": "980",\n "file_url": "https://tryzealot.ews.im/download/debug_files/1",\n "metadata": [\n {\n "id": 1,\n "debug_file_id": 1,\n "uuid": "34656552-21ae-3722-a7fb-3582bc9b1d98",\n "type": "arm64",\n "object": "AppName",\n "data": {},\n "size": 4137941,\n "created_at": "2022-11-25T15:53:15.157+08:00",\n "updated_at": "2022-11-25T15:53:15.157+08:00"\n }\n ]\n }\n]\n'})}),"\n",(0,n.jsx)(d.h2,{id:"get-a-debug-file",children:"Get a debug file"}),"\n",(0,n.jsx)(d.p,{children:"Allows you to receive information about debug file like name, file size, UUID (iOS only), platform (iOS only) or file list (Android only)."}),"\n",(0,n.jsx)(d.pre,{children:(0,n.jsx)(d.code,{children:"GET /api/debug_files/:id\n"})}),"\n",(0,n.jsx)(d.h3,{id:"parameters-3",children:"Parameters"}),"\n",(0,n.jsx)(d.admonition,{type:"info",children:(0,n.jsxs)(d.p,{children:[(0,n.jsx)(d.a,{href:"/docs/developer-guide/api#authentication",children:"Authentication"})," required."]})}),"\n",(0,n.jsxs)(d.table,{children:[(0,n.jsx)(d.thead,{children:(0,n.jsxs)(d.tr,{children:[(0,n.jsx)(d.th,{children:"Attribute"}),(0,n.jsx)(d.th,{children:"Type"}),(0,n.jsx)(d.th,{children:"Required"}),(0,n.jsx)(d.th,{children:"Description"})]})}),(0,n.jsxs)(d.tbody,{children:[(0,n.jsxs)(d.tr,{children:[(0,n.jsx)(d.td,{children:"channel_key"}),(0,n.jsx)(d.td,{children:(0,n.jsx)(d.code,{children:"String"})}),(0,n.jsx)(d.td,{children:"true"}),(0,n.jsx)(d.td,{children:"Channel key"})]}),(0,n.jsxs)(d.tr,{children:[(0,n.jsx)(d.td,{children:"id"}),(0,n.jsx)(d.td,{children:(0,n.jsx)(d.code,{children:"String"})}),(0,n.jsx)(d.td,{children:"true"}),(0,n.jsx)(d.td,{children:"ID"})]})]})]}),"\n",(0,n.jsx)(d.h3,{id:"return-body-3",children:"Return body"}),"\n",(0,n.jsx)(d.pre,{children:(0,n.jsx)(d.code,{className:"language-json",children:'{\n "id": 1,\n "app_name": "Demo App",\n "device_type": "ios",\n "release_version": "1.14.0",\n "build_version": "980",\n "file_url": "https://tryzealot.ews.im/download/debug_files/1",\n "metadata": [\n {\n "id": 1,\n "debug_file_id": 1,\n "uuid": "34656552-21ae-3722-a7fb-3582bc9b1d98",\n "type": "arm64",\n "object": "AppName",\n "data": {},\n "size": 4137941,\n "created_at": "2022-11-25T15:53:15.157+08:00",\n "updated_at": "2022-11-25T15:53:15.157+08:00"\n }\n ]\n}\n'})}),"\n",(0,n.jsx)(d.h2,{id:"update-a-existed-debug-file",children:"Update a existed debug file"}),"\n",(0,n.jsx)(d.p,{children:"This allows you to update a debug file."}),"\n",(0,n.jsx)(d.pre,{children:(0,n.jsx)(d.code,{children:"PUT /api/debug_files/:id\n"})}),"\n",(0,n.jsx)(d.h3,{id:"parameters-4",children:"Parameters"}),"\n",(0,n.jsx)(d.admonition,{type:"info",children:(0,n.jsxs)(d.p,{children:[(0,n.jsx)(d.a,{href:"/docs/developer-guide/api#authentication",children:"Authentication"})," required."]})}),"\n",(0,n.jsxs)(d.table,{children:[(0,n.jsx)(d.thead,{children:(0,n.jsxs)(d.tr,{children:[(0,n.jsx)(d.th,{children:"Attribute"}),(0,n.jsx)(d.th,{children:"Type"}),(0,n.jsx)(d.th,{children:"Required"}),(0,n.jsx)(d.th,{children:"Description"})]})}),(0,n.jsxs)(d.tbody,{children:[(0,n.jsxs)(d.tr,{children:[(0,n.jsx)(d.td,{children:"channel_key"}),(0,n.jsx)(d.td,{children:(0,n.jsx)(d.code,{children:"String"})}),(0,n.jsx)(d.td,{children:"true"}),(0,n.jsx)(d.td,{children:"Channel key"})]}),(0,n.jsxs)(d.tr,{children:[(0,n.jsx)(d.td,{children:"id"}),(0,n.jsx)(d.td,{children:(0,n.jsx)(d.code,{children:"String"})}),(0,n.jsx)(d.td,{children:"true"}),(0,n.jsx)(d.td,{children:"ID"})]}),(0,n.jsxs)(d.tr,{children:[(0,n.jsx)(d.td,{children:"file"}),(0,n.jsx)(d.td,{children:(0,n.jsx)(d.code,{children:"File"})}),(0,n.jsx)(d.td,{children:"true"}),(0,n.jsx)(d.td,{children:"a Zipped debug file"})]}),(0,n.jsxs)(d.tr,{children:[(0,n.jsx)(d.td,{children:"release_version"}),(0,n.jsx)(d.td,{children:(0,n.jsx)(d.code,{children:"String"})}),(0,n.jsx)(d.td,{children:"true"}),(0,n.jsx)(d.td,{children:"Release version, ignore this param if iOS app"})]}),(0,n.jsxs)(d.tr,{children:[(0,n.jsx)(d.td,{children:"build_version"}),(0,n.jsx)(d.td,{children:(0,n.jsx)(d.code,{children:"String"})}),(0,n.jsx)(d.td,{children:"true"}),(0,n.jsx)(d.td,{children:"Build version, ignore this param if iOS app"})]})]})]}),"\n",(0,n.jsx)(d.h3,{id:"return-body-4",children:"Return body"}),"\n",(0,n.jsx)(d.pre,{children:(0,n.jsx)(d.code,{className:"language-json",children:'{\n "id": 1,\n "app_name": "Demo App",\n "device_type": "ios",\n "release_version": "1.14.0",\n "build_version": "980",\n "file_url": "https://tryzealot.ews.im/download/debug_files/1",\n "metadata": [\n {\n "id": 1,\n "debug_file_id": 1,\n "uuid": "34656552-21ae-3722-a7fb-3582bc9b1d98",\n "type": "arm64",\n "object": "AppName",\n "data": {},\n "size": 4137941,\n "created_at": "2022-11-25T15:53:15.157+08:00",\n "updated_at": "2022-11-25T15:53:15.157+08:00"\n }\n ]\n}\n'})}),"\n",(0,n.jsx)(d.h2,{id:"delete-a-debug-file",children:"Delete a debug file"}),"\n",(0,n.jsx)(d.p,{children:"This allows you to delete a debug file."}),"\n",(0,n.jsx)(d.pre,{children:(0,n.jsx)(d.code,{children:"DELETE /api/debug_files/:id\n"})}),"\n",(0,n.jsx)(d.h3,{id:"parameters-5",children:"Parameters"}),"\n",(0,n.jsx)(d.admonition,{type:"info",children:(0,n.jsxs)(d.p,{children:[(0,n.jsx)(d.a,{href:"/docs/developer-guide/api#authentication",children:"Authentication"})," required."]})}),"\n",(0,n.jsxs)(d.table,{children:[(0,n.jsx)(d.thead,{children:(0,n.jsxs)(d.tr,{children:[(0,n.jsx)(d.th,{children:"Attribute"}),(0,n.jsx)(d.th,{children:"Type"}),(0,n.jsx)(d.th,{children:"Required"}),(0,n.jsx)(d.th,{children:"Description"})]})}),(0,n.jsxs)(d.tbody,{children:[(0,n.jsxs)(d.tr,{children:[(0,n.jsx)(d.td,{children:"channel_key"}),(0,n.jsx)(d.td,{children:(0,n.jsx)(d.code,{children:"String"})}),(0,n.jsx)(d.td,{children:"true"}),(0,n.jsx)(d.td,{children:"Channel key"})]}),(0,n.jsxs)(d.tr,{children:[(0,n.jsx)(d.td,{children:"id"}),(0,n.jsx)(d.td,{children:(0,n.jsx)(d.code,{children:"String"})}),(0,n.jsx)(d.td,{children:"true"}),(0,n.jsx)(d.td,{children:"ID"})]})]})]}),"\n",(0,n.jsx)(d.h3,{id:"return-body-5",children:"Return body"}),"\n",(0,n.jsx)(d.pre,{children:(0,n.jsx)(d.code,{className:"language-json",children:'{\n "mesage": "OK"\n}\n'})})]})}function o(e={}){const{wrapper:d}={...(0,r.a)(),...e.components};return d?(0,n.jsx)(d,{...e,children:(0,n.jsx)(h,{...e})}):h(e)}},1151:(e,d,i)=>{i.d(d,{Z:()=>t,a:()=>s});var n=i(7294);const r={},l=n.createContext(r);function s(e){const d=n.useContext(l);return n.useMemo((function(){return"function"==typeof e?e(d):{...d,...e}}),[d,e])}function t(e){let d;return d=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:s(e.components),n.createElement(l.Provider,{value:d},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/81a27df7.e963a73d.js b/assets/js/81a27df7.e963a73d.js new file mode 100644 index 000000000..6be275f25 --- /dev/null +++ b/assets/js/81a27df7.e963a73d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[1370],{6690:(e,n,a)=>{a.r(n),a.d(n,{assets:()=>c,contentTitle:()=>d,default:()=>h,frontMatter:()=>r,metadata:()=>l,toc:()=>o});var t=a(5893),s=a(1151),i=a(9965),p=a(4996);const r={},d="Manage apps",l={id:"user-guide/apps/index",title:"Manage apps",description:"Apps list",source:"@site/versioned_docs/version-5.1.0/user-guide/apps/index.mdx",sourceDirName:"user-guide/apps",slug:"/user-guide/apps/",permalink:"/docs/5.1.0/user-guide/apps/",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.1.0/user-guide/apps/index.mdx",tags:[],version:"5.1.0",frontMatter:{},sidebar:"userGuide",previous:{title:"Create an App",permalink:"/docs/5.1.0/user-guide/apps/create"},next:{title:"Uploaded releases",permalink:"/docs/5.1.0/user-guide/apps/detail"}},c={},o=[{value:"Apps list",id:"apps-list",level:2},{value:"Edit app",id:"edit-app",level:2},{value:"Create a new scheme",id:"create-a-new-scheme",level:2},{value:"Create a new channel",id:"create-a-new-channel",level:2},{value:"Edit channel",id:"edit-channel",level:2}];function u(e){const n={h1:"h1",h2:"h2",...(0,s.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h1,{id:"manage-apps",children:"Manage apps"}),"\n","\n","\n",(0,t.jsx)(n.h2,{id:"apps-list",children:"Apps list"}),"\n",(0,t.jsx)(i.Z,{alt:"",sources:{light:(0,p.Z)("/img/5.0.0/apps-light.png"),dark:(0,p.Z)("/img/5.0.0/apps-dark.png")}}),"\n",(0,t.jsx)(n.h2,{id:"edit-app",children:"Edit app"}),"\n",(0,t.jsx)(i.Z,{alt:"",sources:{light:(0,p.Z)("/img/5.0.0/app-edit-light.png"),dark:(0,p.Z)("/img/5.0.0/app-edit-dark.png")}}),"\n",(0,t.jsx)(n.h2,{id:"create-a-new-scheme",children:"Create a new scheme"}),"\n",(0,t.jsx)(i.Z,{alt:"",sources:{light:(0,p.Z)("/img/5.0.0/app-new-scheme-light.png"),dark:(0,p.Z)("/img/5.0.0/app-new-scheme-dark.png")}}),"\n",(0,t.jsx)(n.h2,{id:"create-a-new-channel",children:"Create a new channel"}),"\n",(0,t.jsx)(i.Z,{alt:"",sources:{light:(0,p.Z)("/img/5.0.0/app-new-channel-light.png"),dark:(0,p.Z)("/img/5.0.0/app-new-channel-dark.png")}}),"\n",(0,t.jsx)(n.h2,{id:"edit-channel",children:"Edit channel"}),"\n",(0,t.jsx)(i.Z,{alt:"",sources:{light:(0,p.Z)("/img/5.0.0/app-edit-channel-light.png"),dark:(0,p.Z)("/img/5.0.0/app-edit-channel-dark.png")}})]})}function h(e={}){const{wrapper:n}={...(0,s.a)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(u,{...e})}):u(e)}},1151:(e,n,a)=>{a.d(n,{Z:()=>r,a:()=>p});var t=a(7294);const s={},i=t.createContext(s);function p(e){const n=t.useContext(i);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:p(e.components),t.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/b03e7fdf.b33cfee5.js b/assets/js/8420426a.e8e2767d.js similarity index 89% rename from assets/js/b03e7fdf.b33cfee5.js rename to assets/js/8420426a.e8e2767d.js index 6c32ebdb4..4bde3652a 100644 --- a/assets/js/b03e7fdf.b33cfee5.js +++ b/assets/js/8420426a.e8e2767d.js @@ -1 +1 @@ -"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[6359],{6866:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>d,default:()=>p,frontMatter:()=>l,metadata:()=>a,toc:()=>u});var o=n(5893),s=n(1151),i=n(9965),r=n(4996);const l={},d="Self-hosted Installation Guide",a={id:"self-hosted/index",title:"Self-hosted Installation Guide",description:"This guide will help you to install and setup a production ready Zealot.",source:"@site/versioned_docs/version-5.1.0/self-hosted/index.md",sourceDirName:"self-hosted",slug:"/self-hosted/",permalink:"/docs/self-hosted/",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.1.0/self-hosted/index.md",tags:[],version:"5.1.0",frontMatter:{},sidebar:"selfHosted",next:{title:"Deployment",permalink:"/docs/category/deployment"}},c={},u=[];function h(e){const t={h1:"h1",p:"p",...(0,s.a)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.h1,{id:"self-hosted-installation-guide",children:"Self-hosted Installation Guide"}),"\n","\n","\n",(0,o.jsx)(t.p,{children:"This guide will help you to install and setup a production ready Zealot."}),"\n",(0,o.jsx)(i.Z,{alt:"Architecture",sources:{light:(0,r.Z)("/img/5.0.0/architecture-light.png"),dark:(0,r.Z)("/img/5.0.0/architecture-dark.png")}})]})}function p(e={}){const{wrapper:t}={...(0,s.a)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(h,{...e})}):h(e)}},1151:(e,t,n)=>{n.d(t,{Z:()=>l,a:()=>r});var o=n(7294);const s={},i=o.createContext(s);function r(e){const t=o.useContext(i);return o.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function l(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),o.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[9617],{6505:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>d,default:()=>p,frontMatter:()=>l,metadata:()=>a,toc:()=>u});var o=n(5893),s=n(1151),i=n(9965),r=n(4996);const l={},d="Self-hosted Installation Guide",a={id:"self-hosted/index",title:"Self-hosted Installation Guide",description:"This guide will help you to install and setup a production ready Zealot.",source:"@site/versioned_docs/version-5.2.0/self-hosted/index.md",sourceDirName:"self-hosted",slug:"/self-hosted/",permalink:"/docs/self-hosted/",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.2.0/self-hosted/index.md",tags:[],version:"5.2.0",frontMatter:{},sidebar:"selfHosted",next:{title:"Deployment",permalink:"/docs/category/deployment"}},c={},u=[];function h(e){const t={h1:"h1",p:"p",...(0,s.a)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.h1,{id:"self-hosted-installation-guide",children:"Self-hosted Installation Guide"}),"\n","\n","\n",(0,o.jsx)(t.p,{children:"This guide will help you to install and setup a production ready Zealot."}),"\n",(0,o.jsx)(i.Z,{alt:"Architecture",sources:{light:(0,r.Z)("/img/5.0.0/architecture-light.png"),dark:(0,r.Z)("/img/5.0.0/architecture-dark.png")}})]})}function p(e={}){const{wrapper:t}={...(0,s.a)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(h,{...e})}):h(e)}},1151:(e,t,n)=>{n.d(t,{Z:()=>l,a:()=>r});var o=n(7294);const s={},i=o.createContext(s);function r(e){const t=o.useContext(i);return o.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function l(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),o.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/844e1eca.a1f2f6f7.js b/assets/js/844e1eca.a1f2f6f7.js deleted file mode 100644 index f017f771b..000000000 --- a/assets/js/844e1eca.a1f2f6f7.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[5374],{57:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>l,contentTitle:()=>i,default:()=>u,frontMatter:()=>a,metadata:()=>r,toc:()=>c});var o=t(5893),s=t(1151);const a={},i="Webhooks",r={id:"user-guide/webhooks",title:"Webhooks",description:"Zealot provides a webhook for message notifications for each application channel.",source:"@site/versioned_docs/version-5.1.0/user-guide/webhooks.md",sourceDirName:"user-guide",slug:"/user-guide/webhooks",permalink:"/docs/user-guide/webhooks",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.1.0/user-guide/webhooks.md",tags:[],version:"5.1.0",frontMatter:{},sidebar:"userGuide",previous:{title:"Fetch UDID",permalink:"/docs/user-guide/toolkits/fetch-udid"},next:{title:"Slack",permalink:"/docs/user-guide/webhooks/slack"}},l={},c=[{value:"Payload (default)",id:"payload-default",level:2}];function d(e){const n={code:"code",h1:"h1",h2:"h2",p:"p",pre:"pre",...(0,s.a)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.h1,{id:"webhooks",children:"Webhooks"}),"\n",(0,o.jsx)(n.p,{children:"Zealot provides a webhook for message notifications for each application channel.\nThe webhook is a fully customizable structure that can be used for most notification services, such as Wecom, Dingtalk, Slack, etc."}),"\n",(0,o.jsx)(n.h2,{id:"payload-default",children:"Payload (default)"}),"\n",(0,o.jsxs)(n.p,{children:["Each parameter of the default structure has its value provided as a variable,\nand each variable starts with ",(0,o.jsx)(n.code,{children:"@"}),", the default structure will be used if the custom structure is left empty when creating the webhook.\nThe following variables are all provided."]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-ruby",children:"{\n event: @event,\n username: @username,\n email: @email,\n title: @title,\n app_name: @name,\n device_type: @device_type,\n release_version: @release_version,\n build_version: @build_version,\n size: @file_size,\n changelog: @changelog,\n install_url: @install_url,\n icon_url: @icon_url,\n qrcode_url: @qrcode_url,\n uploaded_at: @uploaded_at\n}\n"})}),"\n",(0,o.jsx)(n.p,{children:"Output:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-json",children:'{\n "event": "upload_events",\n "username": "foobar",\n "email": "foobar@example.com",\n "title": "Zealot upload 1.0.0 version",\n "app_name": "Zealot",\n "device_type": "iOS",\n "release_version": "1.0.0",\n "build_version": "1",\n "size": "30 MB",\n "install_url": "https://zealot.test/api/apps/download/12354",\n "icon_url": "https://zealot.test/api/apps/icon.png",\n "qrcode_url": "https://zealot.test/api/apps/354/qrcode",\n "uploaded_at": "2019-12-30 11:33:00",\n "changelog": "- Add feture A\\n- Fix issue B\\n- Release v1.0.0",\n}\n'})})]})}function u(e={}){const{wrapper:n}={...(0,s.a)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},1151:(e,n,t)=>{t.d(n,{Z:()=>r,a:()=>i});var o=t(7294);const s={},a=o.createContext(s);function i(e){const n=o.useContext(a);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:i(e.components),o.createElement(a.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/844e1eca.a66ad134.js b/assets/js/844e1eca.a66ad134.js new file mode 100644 index 000000000..31c426cf1 --- /dev/null +++ b/assets/js/844e1eca.a66ad134.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[5374],{57:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>l,contentTitle:()=>i,default:()=>u,frontMatter:()=>a,metadata:()=>r,toc:()=>c});var o=t(5893),s=t(1151);const a={},i="Webhooks",r={id:"user-guide/webhooks",title:"Webhooks",description:"Zealot provides a webhook for message notifications for each application channel.",source:"@site/versioned_docs/version-5.1.0/user-guide/webhooks.md",sourceDirName:"user-guide",slug:"/user-guide/webhooks",permalink:"/docs/5.1.0/user-guide/webhooks",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.1.0/user-guide/webhooks.md",tags:[],version:"5.1.0",frontMatter:{},sidebar:"userGuide",previous:{title:"Fetch UDID",permalink:"/docs/5.1.0/user-guide/toolkits/fetch-udid"},next:{title:"Slack",permalink:"/docs/5.1.0/user-guide/webhooks/slack"}},l={},c=[{value:"Payload (default)",id:"payload-default",level:2}];function d(e){const n={code:"code",h1:"h1",h2:"h2",p:"p",pre:"pre",...(0,s.a)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.h1,{id:"webhooks",children:"Webhooks"}),"\n",(0,o.jsx)(n.p,{children:"Zealot provides a webhook for message notifications for each application channel.\nThe webhook is a fully customizable structure that can be used for most notification services, such as Wecom, Dingtalk, Slack, etc."}),"\n",(0,o.jsx)(n.h2,{id:"payload-default",children:"Payload (default)"}),"\n",(0,o.jsxs)(n.p,{children:["Each parameter of the default structure has its value provided as a variable,\nand each variable starts with ",(0,o.jsx)(n.code,{children:"@"}),", the default structure will be used if the custom structure is left empty when creating the webhook.\nThe following variables are all provided."]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-ruby",children:"{\n event: @event,\n username: @username,\n email: @email,\n title: @title,\n app_name: @name,\n device_type: @device_type,\n release_version: @release_version,\n build_version: @build_version,\n size: @file_size,\n changelog: @changelog,\n install_url: @install_url,\n icon_url: @icon_url,\n qrcode_url: @qrcode_url,\n uploaded_at: @uploaded_at\n}\n"})}),"\n",(0,o.jsx)(n.p,{children:"Output:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-json",children:'{\n "event": "upload_events",\n "username": "foobar",\n "email": "foobar@example.com",\n "title": "Zealot upload 1.0.0 version",\n "app_name": "Zealot",\n "device_type": "iOS",\n "release_version": "1.0.0",\n "build_version": "1",\n "size": "30 MB",\n "install_url": "https://zealot.test/api/apps/download/12354",\n "icon_url": "https://zealot.test/api/apps/icon.png",\n "qrcode_url": "https://zealot.test/api/apps/354/qrcode",\n "uploaded_at": "2019-12-30 11:33:00",\n "changelog": "- Add feture A\\n- Fix issue B\\n- Release v1.0.0",\n}\n'})})]})}function u(e={}){const{wrapper:n}={...(0,s.a)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},1151:(e,n,t)=>{t.d(n,{Z:()=>r,a:()=>i});var o=t(7294);const s={},a=o.createContext(s);function i(e){const n=o.useContext(a);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:i(e.components),o.createElement(a.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/84bb00d0.9ea53844.js b/assets/js/84bb00d0.9ea53844.js new file mode 100644 index 000000000..9760493cd --- /dev/null +++ b/assets/js/84bb00d0.9ea53844.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[3522],{349:(e,n,o)=>{o.r(n),o.d(n,{assets:()=>c,contentTitle:()=>l,default:()=>u,frontMatter:()=>i,metadata:()=>r,toc:()=>a});var s=o(5893),t=o(1151);const i={},l="Schedule Jobs",r={id:"self-hosted/configuration/schedule-jobs",title:"Schedule Jobs",description:"Clean old version builds",source:"@site/versioned_docs/version-5.1.0/self-hosted/configuration/schedule-jobs.md",sourceDirName:"self-hosted/configuration",slug:"/self-hosted/configuration/schedule-jobs",permalink:"/docs/5.1.0/self-hosted/configuration/schedule-jobs",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.1.0/self-hosted/configuration/schedule-jobs.md",tags:[],version:"5.1.0",frontMatter:{},sidebar:"selfHosted",previous:{title:"Third-party Authentication",permalink:"/docs/5.1.0/self-hosted/configuration/third-party-authentication"},next:{title:"Data storages",permalink:"/docs/5.1.0/self-hosted/storage"}},c={},a=[{value:"Clean old version builds",id:"clean-old-version-builds",level:2},{value:"Backup",id:"backup",level:2}];function d(e){const n={a:"a",admonition:"admonition",blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",p:"p",pre:"pre",...(0,t.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h1,{id:"schedule-jobs",children:"Schedule Jobs"}),"\n",(0,s.jsx)(n.h2,{id:"clean-old-version-builds",children:"Clean old version builds"}),"\n",(0,s.jsx)(n.p,{children:"A reliable logic for cleaning up old versions is to keep an eye on all uploaded\nversions of the current master version, as observed by project maintainers over time."}),"\n",(0,s.jsx)(n.p,{children:"Previously uploaded historical versions only need to keep the last uploaded build\nversion basically to meet the vast majority of cases, for example:"}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsxs)(n.p,{children:["Additional: the current logic is relatively trouble-free but inflexible, in fact,\nthere is thought to support a variety of processing logic, see ",(0,s.jsx)(n.a,{href:"https://github.com/tryzealot/zealot/issues/376",children:"https://github.com/tryzealot/zealot/issues/376"})]}),"\n"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"- 2.0\n - 3\n - 2\n - 1\n- 1.0.1\n - 10\n - 9\n - 8\n ...\n- 1.0\n - 5\n - 4\n - 3\n ...\n"})}),"\n",(0,s.jsx)(n.p,{children:"The task will clean up all versions up to version 1.0.1 containing 9 and version 1.0 containing 4,\nleaving the final version file as follows:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"- 2.0\n - 3\n - 2\n - 1\n- 1.0.1\n - 10\n- 1.0\n - 5\n"})}),"\n",(0,s.jsxs)(n.p,{children:["If disk space is limited, you can enable cleanup of timed tasks by setting the environment variable ",(0,s.jsx)(n.code,{children:"ZEALOT_KEEP_UPLOADS=false"}),"."]}),"\n",(0,s.jsx)(n.admonition,{type:"info",children:(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"ZEALOT_KEEP_UPLOADS"})," set ",(0,s.jsx)(n.code,{children:"true"})," by default."]})}),"\n",(0,s.jsx)(n.h2,{id:"backup",children:"Backup"}),"\n",(0,s.jsx)(n.p,{children:"When you create any backup it will join itself to the schedule job list."})]})}function u(e={}){const{wrapper:n}={...(0,t.a)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}},1151:(e,n,o)=>{o.d(n,{Z:()=>r,a:()=>l});var s=o(7294);const t={},i=s.createContext(t);function l(e){const n=s.useContext(i);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:l(e.components),s.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/84bb00d0.ac3844b5.js b/assets/js/84bb00d0.ac3844b5.js deleted file mode 100644 index a16734366..000000000 --- a/assets/js/84bb00d0.ac3844b5.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[3522],{349:(e,n,o)=>{o.r(n),o.d(n,{assets:()=>c,contentTitle:()=>l,default:()=>u,frontMatter:()=>i,metadata:()=>r,toc:()=>a});var s=o(5893),t=o(1151);const i={},l="Schedule Jobs",r={id:"self-hosted/configuration/schedule-jobs",title:"Schedule Jobs",description:"Clean old version builds",source:"@site/versioned_docs/version-5.1.0/self-hosted/configuration/schedule-jobs.md",sourceDirName:"self-hosted/configuration",slug:"/self-hosted/configuration/schedule-jobs",permalink:"/docs/self-hosted/configuration/schedule-jobs",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.1.0/self-hosted/configuration/schedule-jobs.md",tags:[],version:"5.1.0",frontMatter:{},sidebar:"selfHosted",previous:{title:"Third-party Authentication",permalink:"/docs/self-hosted/configuration/third-party-authentication"},next:{title:"Data storages",permalink:"/docs/self-hosted/storage"}},c={},a=[{value:"Clean old version builds",id:"clean-old-version-builds",level:2},{value:"Backup",id:"backup",level:2}];function d(e){const n={a:"a",admonition:"admonition",blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",p:"p",pre:"pre",...(0,t.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h1,{id:"schedule-jobs",children:"Schedule Jobs"}),"\n",(0,s.jsx)(n.h2,{id:"clean-old-version-builds",children:"Clean old version builds"}),"\n",(0,s.jsx)(n.p,{children:"A reliable logic for cleaning up old versions is to keep an eye on all uploaded\nversions of the current master version, as observed by project maintainers over time."}),"\n",(0,s.jsx)(n.p,{children:"Previously uploaded historical versions only need to keep the last uploaded build\nversion basically to meet the vast majority of cases, for example:"}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsxs)(n.p,{children:["Additional: the current logic is relatively trouble-free but inflexible, in fact,\nthere is thought to support a variety of processing logic, see ",(0,s.jsx)(n.a,{href:"https://github.com/tryzealot/zealot/issues/376",children:"https://github.com/tryzealot/zealot/issues/376"})]}),"\n"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"- 2.0\n - 3\n - 2\n - 1\n- 1.0.1\n - 10\n - 9\n - 8\n ...\n- 1.0\n - 5\n - 4\n - 3\n ...\n"})}),"\n",(0,s.jsx)(n.p,{children:"The task will clean up all versions up to version 1.0.1 containing 9 and version 1.0 containing 4,\nleaving the final version file as follows:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"- 2.0\n - 3\n - 2\n - 1\n- 1.0.1\n - 10\n- 1.0\n - 5\n"})}),"\n",(0,s.jsxs)(n.p,{children:["If disk space is limited, you can enable cleanup of timed tasks by setting the environment variable ",(0,s.jsx)(n.code,{children:"ZEALOT_KEEP_UPLOADS=false"}),"."]}),"\n",(0,s.jsx)(n.admonition,{type:"info",children:(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"ZEALOT_KEEP_UPLOADS"})," set ",(0,s.jsx)(n.code,{children:"true"})," by default."]})}),"\n",(0,s.jsx)(n.h2,{id:"backup",children:"Backup"}),"\n",(0,s.jsx)(n.p,{children:"When you create any backup it will join itself to the schedule job list."})]})}function u(e={}){const{wrapper:n}={...(0,t.a)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}},1151:(e,n,o)=>{o.d(n,{Z:()=>r,a:()=>l});var s=o(7294);const t={},i=s.createContext(t);function l(e){const n=s.useContext(i);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:l(e.components),s.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/b5008855.8c6ac3be.js b/assets/js/85079bd2.56152bb4.js similarity index 93% rename from assets/js/b5008855.8c6ac3be.js rename to assets/js/85079bd2.56152bb4.js index 8f00349ea..68f938b32 100644 --- a/assets/js/b5008855.8c6ac3be.js +++ b/assets/js/85079bd2.56152bb4.js @@ -1 +1 @@ -"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[5538],{5965:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>i,default:()=>d,frontMatter:()=>s,metadata:()=>r,toc:()=>p});var o=t(5893),l=t(1151);const s={sidebar_label:"Fly"},i="Deploy Zealot to Fly guide",r={id:"self-hosted/deployment/fly",title:"Deploy Zealot to Fly guide",description:"Zealot support use App Configuration (fly.toml) to deploy on fly.io.",source:"@site/versioned_docs/version-5.1.0/self-hosted/deployment/fly.md",sourceDirName:"self-hosted/deployment",slug:"/self-hosted/deployment/fly",permalink:"/docs/self-hosted/deployment/fly",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.1.0/self-hosted/deployment/fly.md",tags:[],version:"5.1.0",frontMatter:{sidebar_label:"Fly"},sidebar:"selfHosted",previous:{title:"Cloud Provider Guides",permalink:"/docs/category/cloud-provider-guides"},next:{title:"Railway",permalink:"/docs/self-hosted/deployment/railway"}},c={},p=[{value:"Deploying on Fly",id:"deploying-on-fly",level:2},{value:"App Configuration",id:"app-configuration",level:3}];function a(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",ul:"ul",...(0,l.a)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.h1,{id:"deploy-zealot-to-fly-guide",children:"Deploy Zealot to Fly guide"}),"\n",(0,o.jsxs)(n.p,{children:["Zealot support use App Configuration (fly.toml) to deploy on ",(0,o.jsx)(n.a,{href:"https://fly.io",children:"fly.io"}),"."]}),"\n",(0,o.jsx)(n.h2,{id:"deploying-on-fly",children:"Deploying on Fly"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:["Install ",(0,o.jsx)(n.a,{href:"https://fly.io/docs/flyctl/",children:"flyctl"}),"."]}),"\n",(0,o.jsxs)(n.li,{children:["Copy full content of ",(0,o.jsx)(n.a,{href:"#app-configuration",children:"app configuration"})," save to ",(0,o.jsx)(n.code,{children:"fly.toml"})," then change the ",(0,o.jsx)(n.code,{children:"app"})," value ."]}),"\n",(0,o.jsxs)(n.li,{children:["Run ",(0,o.jsx)(n.code,{children:"flyctl deploy"}),"."]}),"\n",(0,o.jsxs)(n.li,{children:["Run ",(0,o.jsx)(n.code,{children:"fly scale vm shared-cpu-1x --memory 512"}),"."]}),"\n"]}),"\n",(0,o.jsx)(n.h3,{id:"app-configuration",children:"App Configuration"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-toml",children:'app = "[app-name:changeme]"\nkill_signal = "SIGINT"\nkill_timeout = 120\nprocesses = []\n\n[build]\n image = "ghcr.io/tryzealot/zealot:nightly"\n\n[experimental]\n allowed_public_ports = []\n auto_rollback = true\n\n[[services]]\n http_checks = []\n internal_port = 80\n processes = ["app"]\n protocol = "tcp"\n script_checks = []\n [services.concurrency]\n hard_limit = 25\n soft_limit = 20\n type = "connections"\n\n [[services.ports]]\n force_https = true\n handlers = ["http"]\n port = 80\n\n [[services.ports]]\n handlers = ["tls", "http"]\n port = 443\n\n [[services.tcp_checks]]\n grace_period = "1s"\n interval = "15s"\n restart_limit = 0\n timeout = "2s"\n\n[[statics]]\n guest_path = "/app/public"\n url_prefix = "/"\n'})})]})}function d(e={}){const{wrapper:n}={...(0,l.a)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(a,{...e})}):a(e)}},1151:(e,n,t)=>{t.d(n,{Z:()=>r,a:()=>i});var o=t(7294);const l={},s=o.createContext(l);function i(e){const n=o.useContext(s);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(l):e.components||l:i(e.components),o.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[1298],{5424:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>i,default:()=>d,frontMatter:()=>s,metadata:()=>r,toc:()=>p});var o=t(5893),l=t(1151);const s={sidebar_label:"Fly"},i="Deploy Zealot to Fly guide",r={id:"self-hosted/deployment/fly",title:"Deploy Zealot to Fly guide",description:"Zealot support use App Configuration (fly.toml) to deploy on fly.io.",source:"@site/versioned_docs/version-5.2.0/self-hosted/deployment/fly.md",sourceDirName:"self-hosted/deployment",slug:"/self-hosted/deployment/fly",permalink:"/docs/self-hosted/deployment/fly",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.2.0/self-hosted/deployment/fly.md",tags:[],version:"5.2.0",frontMatter:{sidebar_label:"Fly"},sidebar:"selfHosted",previous:{title:"Cloud Provider Guides",permalink:"/docs/category/cloud-provider-guides"},next:{title:"Railway",permalink:"/docs/self-hosted/deployment/railway"}},c={},p=[{value:"Deploying on Fly",id:"deploying-on-fly",level:2},{value:"App Configuration",id:"app-configuration",level:3}];function a(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",ul:"ul",...(0,l.a)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.h1,{id:"deploy-zealot-to-fly-guide",children:"Deploy Zealot to Fly guide"}),"\n",(0,o.jsxs)(n.p,{children:["Zealot support use App Configuration (fly.toml) to deploy on ",(0,o.jsx)(n.a,{href:"https://fly.io",children:"fly.io"}),"."]}),"\n",(0,o.jsx)(n.h2,{id:"deploying-on-fly",children:"Deploying on Fly"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:["Install ",(0,o.jsx)(n.a,{href:"https://fly.io/docs/flyctl/",children:"flyctl"}),"."]}),"\n",(0,o.jsxs)(n.li,{children:["Copy full content of ",(0,o.jsx)(n.a,{href:"#app-configuration",children:"app configuration"})," save to ",(0,o.jsx)(n.code,{children:"fly.toml"})," then change the ",(0,o.jsx)(n.code,{children:"app"})," value ."]}),"\n",(0,o.jsxs)(n.li,{children:["Run ",(0,o.jsx)(n.code,{children:"flyctl deploy"}),"."]}),"\n",(0,o.jsxs)(n.li,{children:["Run ",(0,o.jsx)(n.code,{children:"fly scale vm shared-cpu-1x --memory 512"}),"."]}),"\n"]}),"\n",(0,o.jsx)(n.h3,{id:"app-configuration",children:"App Configuration"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-toml",children:'app = "[app-name:changeme]"\nkill_signal = "SIGINT"\nkill_timeout = 120\nprocesses = []\n\n[build]\n image = "ghcr.io/tryzealot/zealot:nightly"\n\n[experimental]\n allowed_public_ports = []\n auto_rollback = true\n\n[[services]]\n http_checks = []\n internal_port = 80\n processes = ["app"]\n protocol = "tcp"\n script_checks = []\n [services.concurrency]\n hard_limit = 25\n soft_limit = 20\n type = "connections"\n\n [[services.ports]]\n force_https = true\n handlers = ["http"]\n port = 80\n\n [[services.ports]]\n handlers = ["tls", "http"]\n port = 443\n\n [[services.tcp_checks]]\n grace_period = "1s"\n interval = "15s"\n restart_limit = 0\n timeout = "2s"\n\n[[statics]]\n guest_path = "/app/public"\n url_prefix = "/"\n'})})]})}function d(e={}){const{wrapper:n}={...(0,l.a)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(a,{...e})}):a(e)}},1151:(e,n,t)=>{t.d(n,{Z:()=>r,a:()=>i});var o=t(7294);const l={},s=o.createContext(l);function i(e){const n=o.useContext(s);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(l):e.components||l:i(e.components),o.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/e6f7e927.df98a47f.js b/assets/js/8a161b58.376ac6ef.js similarity index 95% rename from assets/js/e6f7e927.df98a47f.js rename to assets/js/8a161b58.376ac6ef.js index 03ca78afb..d44845f53 100644 --- a/assets/js/e6f7e927.df98a47f.js +++ b/assets/js/8a161b58.376ac6ef.js @@ -1 +1 @@ -"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[6453],{7858:(e,i,t)=>{t.r(i),t.d(i,{assets:()=>c,contentTitle:()=>l,default:()=>u,frontMatter:()=>o,metadata:()=>a,toc:()=>h});var n=t(5893),s=t(1151),r=t(9965),d=t(4996);const o={sidebar_label:"Fetch UDID"},l="Fetch iOS Device UDID",a={id:"user-guide/toolkits/fetch-udid",title:"Fetch iOS Device UDID",description:"- List of installable applications based on UDID",source:"@site/versioned_docs/version-5.1.0/user-guide/toolkits/fetch-udid.mdx",sourceDirName:"user-guide/toolkits",slug:"/user-guide/toolkits/fetch-udid",permalink:"/docs/user-guide/toolkits/fetch-udid",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.1.0/user-guide/toolkits/fetch-udid.mdx",tags:[],version:"5.1.0",frontMatter:{sidebar_label:"Fetch UDID"},sidebar:"userGuide",previous:{title:"Teardown App",permalink:"/docs/user-guide/toolkits/teardown"},next:{title:"Webhooks",permalink:"/docs/user-guide/webhooks"}},c={},h=[{value:"Install profile",id:"install-profile",level:2},{value:"Unregistered Device",id:"unregistered-device",level:2},{value:"Registered Device",id:"registered-device",level:2}];function p(e){const i={a:"a",admonition:"admonition",h1:"h1",h2:"h2",li:"li",p:"p",ul:"ul",...(0,s.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(i.h1,{id:"fetch-ios-device-udid",children:"Fetch iOS Device UDID"}),"\n","\n","\n",(0,n.jsxs)(i.ul,{children:["\n",(0,n.jsx)(i.li,{children:"List of installable applications based on UDID"}),"\n",(0,n.jsx)(i.li,{children:"Enable Apple Developer functionality to add unregistered test devices to the corresponding developer account"}),"\n"]}),"\n",(0,n.jsx)(i.h2,{id:"install-profile",children:"Install profile"}),"\n",(0,n.jsx)(i.admonition,{type:"info",children:(0,n.jsxs)(i.p,{children:["This feature is only valid for iOS devices. If opened on a computer,\nit will prompt you to ",(0,n.jsx)(i.a,{href:"https://support.apple.com/guide/iphone/scan-a-qr-code-iphe8bda8762/ios",children:"scan the QR code"})," with your phone."]})}),"\n",(0,n.jsx)(i.p,{children:'Regardless of the user login mode (including guest mode), you can install the profile by clicking on "\u83b7\u53d6\u8bbe\u5907 UDID" in the left sidebar menu to retrieve the UDID of the current iOS device.'}),"\n",(0,n.jsx)(i.p,{children:'Do not worry about the profile being displayed as "Unsigned". This does not affect the installation, and the profile is disposable and will be destroyed by the system after retrieval, so there is no security risk.'}),"\n",(0,n.jsx)(r.Z,{alt:"Install profile",sources:{light:(0,d.Z)("/img/zh-Hans/fetch-udid/install-profile-light.png"),dark:(0,d.Z)("/img/zh-Hans/fetch-udid/install-profile-dark.png")}}),"\n",(0,n.jsx)(i.p,{children:"After installing the profile, the browser will open a new page to display the device UDID. At this point, there will be two scenarios:"}),"\n",(0,n.jsxs)(i.ul,{children:["\n",(0,n.jsx)(i.li,{children:(0,n.jsx)(i.a,{href:"#unregistered-device",children:"Unregistered Device"})}),"\n",(0,n.jsx)(i.li,{children:(0,n.jsx)(i.a,{href:"#registered-device",children:"Registered Device"})}),"\n"]}),"\n",(0,n.jsx)(i.h2,{id:"unregistered-device",children:"Unregistered Device"}),"\n",(0,n.jsx)(i.p,{children:"For an unregistered device, basic device information is provided, including UDID, internal model, and serial number. If the service administrator has added Apple Developer, it will also display the registration of the test device to the corresponding developer account."}),"\n",(0,n.jsx)(i.admonition,{type:"tip",children:(0,n.jsx)(i.p,{children:"Registering to an Apple Developer account only means that the device is added under\nthe Devices section of the Apple Developer account. For iOS developers,\nyou still need to manually or script-automate adding the test device to the\ncorresponding Ad-Hoc certificate, then install and repackage it before\nallowing the device to install the application."})}),"\n",(0,n.jsx)(r.Z,{alt:"Unregistered Device",sources:{light:(0,d.Z)("/img/zh-Hans/fetch-udid/register-udid-light.png"),dark:(0,d.Z)("/img/zh-Hans/fetch-udid/register-udid-dark.png")}}),"\n",(0,n.jsx)(i.h2,{id:"registered-device",children:"Registered Device"}),"\n",(0,n.jsx)(i.p,{children:"For a registered test device, the list of installable applications will be displayed. If the service administrator has added Apple Developer, it will also display the registration of the test device to the corresponding developer account."}),"\n",(0,n.jsx)(r.Z,{alt:"Registered Device",sources:{light:(0,d.Z)("/img/zh-Hans/fetch-udid/registered-udid-light.png"),dark:(0,d.Z)("/img/zh-Hans/fetch-udid/registered-udid-dark.png")}})]})}function u(e={}){const{wrapper:i}={...(0,s.a)(),...e.components};return i?(0,n.jsx)(i,{...e,children:(0,n.jsx)(p,{...e})}):p(e)}},1151:(e,i,t)=>{t.d(i,{Z:()=>o,a:()=>d});var n=t(7294);const s={},r=n.createContext(s);function d(e){const i=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function o(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:d(e.components),n.createElement(r.Provider,{value:i},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[8137],{7304:(e,i,t)=>{t.r(i),t.d(i,{assets:()=>c,contentTitle:()=>l,default:()=>u,frontMatter:()=>o,metadata:()=>a,toc:()=>h});var n=t(5893),s=t(1151),r=t(9965),d=t(4996);const o={sidebar_label:"Fetch UDID"},l="Fetch iOS Device UDID",a={id:"user-guide/toolkits/fetch-udid",title:"Fetch iOS Device UDID",description:"- List of installable applications based on UDID",source:"@site/versioned_docs/version-5.2.0/user-guide/toolkits/fetch-udid.mdx",sourceDirName:"user-guide/toolkits",slug:"/user-guide/toolkits/fetch-udid",permalink:"/docs/user-guide/toolkits/fetch-udid",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.2.0/user-guide/toolkits/fetch-udid.mdx",tags:[],version:"5.2.0",frontMatter:{sidebar_label:"Fetch UDID"},sidebar:"userGuide",previous:{title:"Teardown App",permalink:"/docs/user-guide/toolkits/teardown"},next:{title:"Webhooks",permalink:"/docs/user-guide/webhooks"}},c={},h=[{value:"Install profile",id:"install-profile",level:2},{value:"Unregistered Device",id:"unregistered-device",level:2},{value:"Registered Device",id:"registered-device",level:2}];function p(e){const i={a:"a",admonition:"admonition",h1:"h1",h2:"h2",li:"li",p:"p",ul:"ul",...(0,s.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(i.h1,{id:"fetch-ios-device-udid",children:"Fetch iOS Device UDID"}),"\n","\n","\n",(0,n.jsxs)(i.ul,{children:["\n",(0,n.jsx)(i.li,{children:"List of installable applications based on UDID"}),"\n",(0,n.jsx)(i.li,{children:"Enable Apple Developer functionality to add unregistered test devices to the corresponding developer account"}),"\n"]}),"\n",(0,n.jsx)(i.h2,{id:"install-profile",children:"Install profile"}),"\n",(0,n.jsx)(i.admonition,{type:"info",children:(0,n.jsxs)(i.p,{children:["This feature is only valid for iOS devices. If opened on a computer,\nit will prompt you to ",(0,n.jsx)(i.a,{href:"https://support.apple.com/guide/iphone/scan-a-qr-code-iphe8bda8762/ios",children:"scan the QR code"})," with your phone."]})}),"\n",(0,n.jsx)(i.p,{children:'Regardless of the user login mode (including guest mode), you can install the profile by clicking on "\u83b7\u53d6\u8bbe\u5907 UDID" in the left sidebar menu to retrieve the UDID of the current iOS device.'}),"\n",(0,n.jsx)(i.p,{children:'Do not worry about the profile being displayed as "Unsigned". This does not affect the installation, and the profile is disposable and will be destroyed by the system after retrieval, so there is no security risk.'}),"\n",(0,n.jsx)(r.Z,{alt:"Install profile",sources:{light:(0,d.Z)("/img/zh-Hans/fetch-udid/install-profile-light.png"),dark:(0,d.Z)("/img/zh-Hans/fetch-udid/install-profile-dark.png")}}),"\n",(0,n.jsx)(i.p,{children:"After installing the profile, the browser will open a new page to display the device UDID. At this point, there will be two scenarios:"}),"\n",(0,n.jsxs)(i.ul,{children:["\n",(0,n.jsx)(i.li,{children:(0,n.jsx)(i.a,{href:"#unregistered-device",children:"Unregistered Device"})}),"\n",(0,n.jsx)(i.li,{children:(0,n.jsx)(i.a,{href:"#registered-device",children:"Registered Device"})}),"\n"]}),"\n",(0,n.jsx)(i.h2,{id:"unregistered-device",children:"Unregistered Device"}),"\n",(0,n.jsx)(i.p,{children:"For an unregistered device, basic device information is provided, including UDID, internal model, and serial number. If the service administrator has added Apple Developer, it will also display the registration of the test device to the corresponding developer account."}),"\n",(0,n.jsx)(i.admonition,{type:"tip",children:(0,n.jsx)(i.p,{children:"Registering to an Apple Developer account only means that the device is added under\nthe Devices section of the Apple Developer account. For iOS developers,\nyou still need to manually or script-automate adding the test device to the\ncorresponding Ad-Hoc certificate, then install and repackage it before\nallowing the device to install the application."})}),"\n",(0,n.jsx)(r.Z,{alt:"Unregistered Device",sources:{light:(0,d.Z)("/img/zh-Hans/fetch-udid/register-udid-light.png"),dark:(0,d.Z)("/img/zh-Hans/fetch-udid/register-udid-dark.png")}}),"\n",(0,n.jsx)(i.h2,{id:"registered-device",children:"Registered Device"}),"\n",(0,n.jsx)(i.p,{children:"For a registered test device, the list of installable applications will be displayed. If the service administrator has added Apple Developer, it will also display the registration of the test device to the corresponding developer account."}),"\n",(0,n.jsx)(r.Z,{alt:"Registered Device",sources:{light:(0,d.Z)("/img/zh-Hans/fetch-udid/registered-udid-light.png"),dark:(0,d.Z)("/img/zh-Hans/fetch-udid/registered-udid-dark.png")}})]})}function u(e={}){const{wrapper:i}={...(0,s.a)(),...e.components};return i?(0,n.jsx)(i,{...e,children:(0,n.jsx)(p,{...e})}):p(e)}},1151:(e,i,t)=>{t.d(i,{Z:()=>o,a:()=>d});var n=t(7294);const s={},r=n.createContext(s);function d(e){const i=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function o(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:d(e.components),n.createElement(r.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/8a7857c4.6e79bbac.js b/assets/js/8a7857c4.6e79bbac.js new file mode 100644 index 000000000..da7c31d9d --- /dev/null +++ b/assets/js/8a7857c4.6e79bbac.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[3271],{3150:e=>{e.exports=JSON.parse('{"title":"Cloud Provider Guides","slug":"/category/cloud-provider-guides","permalink":"/docs/5.1.0/category/cloud-provider-guides","navigation":{"previous":{"title":"Reverse Proxies","permalink":"/docs/5.1.0/self-hosted/reverse-proxies"},"next":{"title":"Fly","permalink":"/docs/5.1.0/self-hosted/deployment/fly"}}}')}}]); \ No newline at end of file diff --git a/assets/js/8f8d8fcb.f4b3a1bd.js b/assets/js/8f8d8fcb.f4b3a1bd.js new file mode 100644 index 000000000..fe4148dd3 --- /dev/null +++ b/assets/js/8f8d8fcb.f4b3a1bd.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[1900],{9901:(e,o,t)=>{t.r(o),t.d(o,{assets:()=>d,contentTitle:()=>a,default:()=>u,frontMatter:()=>s,metadata:()=>c,toc:()=>i});var n=t(5893),r=t(1151);const s={},a="Wecom (Wechat Work)",c={id:"user-guide/webhooks/wecom",title:"Wecom (Wechat Work)",description:"\u4f01\u4e1a\u5fae\u4fe1 use Incoming Webhooks whose constructs",source:"@site/versioned_docs/version-5.1.0/user-guide/webhooks/wecom.md",sourceDirName:"user-guide/webhooks",slug:"/user-guide/webhooks/wecom",permalink:"/docs/5.1.0/user-guide/webhooks/wecom",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.1.0/user-guide/webhooks/wecom.md",tags:[],version:"5.1.0",frontMatter:{},sidebar:"userGuide",previous:{title:"Dingtalk (Dingding)",permalink:"/docs/5.1.0/user-guide/webhooks/dingtalk"},next:{title:"Administrator",permalink:"/docs/5.1.0/category/administrator"}},d={},i=[{value:"Text format",id:"text-format",level:2},{value:"Markdown format",id:"markdown-format",level:2}];function l(e){const o={a:"a",code:"code",h1:"h1",h2:"h2",p:"p",pre:"pre",...(0,r.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(o.h1,{id:"wecom-wechat-work",children:"Wecom (Wechat Work)"}),"\n",(0,n.jsxs)(o.p,{children:[(0,n.jsx)(o.a,{href:"https://work.weixin.qq.com/api/doc/90000/90136/91770",children:"\u4f01\u4e1a\u5fae\u4fe1"})," use Incoming Webhooks whose constructs\ntypically support both text and markdown, and can be configured as follows:"]}),"\n",(0,n.jsx)(o.h2,{id:"text-format",children:"Text format"}),"\n",(0,n.jsx)(o.pre,{children:(0,n.jsx)(o.code,{className:"language-ruby",children:'{\n "msgtype": "text",\n "text": {\n "content": "#{@title}\\n\\nInstall url\uff1a#{@install_url}\\nUplaod at: #{@uploaded_at}"\n }\n}\n'})}),"\n",(0,n.jsx)(o.h2,{id:"markdown-format",children:"Markdown format"}),"\n",(0,n.jsx)(o.pre,{children:(0,n.jsx)(o.code,{className:"language-ruby",children:'{\n "msgtype": "markdown",\n "markdown": {\n "content": "## #{@title}\\nPlatform: #{@device_type}\\nUplaod at: #{@uploaded_at}\\nInstall QRcode:\\n![qrcode](#{@qrcode_url})"\n }\n}\n'})})]})}function u(e={}){const{wrapper:o}={...(0,r.a)(),...e.components};return o?(0,n.jsx)(o,{...e,children:(0,n.jsx)(l,{...e})}):l(e)}},1151:(e,o,t)=>{t.d(o,{Z:()=>c,a:()=>a});var n=t(7294);const r={},s=n.createContext(r);function a(e){const o=n.useContext(s);return n.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function c(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:a(e.components),n.createElement(s.Provider,{value:o},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/905ab186.bd937457.js b/assets/js/905ab186.bd937457.js new file mode 100644 index 000000000..f5eb65179 --- /dev/null +++ b/assets/js/905ab186.bd937457.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[1296],{992:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>p,contentTitle:()=>i,default:()=>m,frontMatter:()=>d,metadata:()=>u,toc:()=>l});var n=s(5893),o=s(1151),a=s(9965),r=s(4996);const d={},i="Uploaded a release",u={id:"user-guide/apps/upload",title:"Uploaded a release",description:"{s.d(t,{Z:()=>d,a:()=>r});var n=s(7294);const o={},a=n.createContext(o);function r(e){const t=n.useContext(a);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function d(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:r(e.components),n.createElement(a.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/952e18be.1ba9f692.js b/assets/js/952e18be.1ba9f692.js new file mode 100644 index 000000000..0bb0b806d --- /dev/null +++ b/assets/js/952e18be.1ba9f692.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[7269],{674:(e,i,s)=>{s.r(i),s.d(i,{assets:()=>u,contentTitle:()=>l,default:()=>v,frontMatter:()=>o,metadata:()=>a,toc:()=>g});var n=s(5893),r=s(1151),d=s(9965),t=s(4996);const o={},l="Review metadata",a={id:"user-guide/debug-files/review",title:"Review metadata",description:"Android",source:"@site/versioned_docs/version-5.2.0/user-guide/debug-files/review.mdx",sourceDirName:"user-guide/debug-files",slug:"/user-guide/debug-files/review",permalink:"/docs/user-guide/debug-files/review",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.2.0/user-guide/debug-files/review.mdx",tags:[],version:"5.2.0",frontMatter:{},sidebar:"userGuide",previous:{title:"List debug files",permalink:"/docs/user-guide/debug-files/"},next:{title:"Create a Debug File",permalink:"/docs/user-guide/debug-files/upload"}},u={},g=[{value:"Android",id:"android",level:2},{value:"Versions list",id:"versions-list",level:3},{value:"Version detail",id:"version-detail",level:3},{value:"iOS",id:"ios",level:2},{value:"Versions list",id:"versions-list-1",level:3},{value:"Version detail",id:"version-detail-1",level:3}];function c(e){const i={h1:"h1",h2:"h2",h3:"h3",...(0,r.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(i.h1,{id:"review-metadata",children:"Review metadata"}),"\n","\n","\n",(0,n.jsx)(i.h2,{id:"android",children:"Android"}),"\n",(0,n.jsx)(i.h3,{id:"versions-list",children:"Versions list"}),"\n",(0,n.jsx)(d.Z,{alt:"",sources:{light:(0,t.Z)("/img/5.0.0/debug-file-android-versions-light.png"),dark:(0,t.Z)("/img/5.0.0/debug-file-android-versions-dark.png")}}),"\n",(0,n.jsx)(i.h3,{id:"version-detail",children:"Version detail"}),"\n",(0,n.jsx)(d.Z,{alt:"",sources:{light:(0,t.Z)("/img/5.0.0/debug-file-android-version-light.png"),dark:(0,t.Z)("/img/5.0.0/debug-file-android-version-dark.png")}}),"\n",(0,n.jsx)(i.h2,{id:"ios",children:"iOS"}),"\n",(0,n.jsx)(i.h3,{id:"versions-list-1",children:"Versions list"}),"\n",(0,n.jsx)(d.Z,{alt:"",sources:{light:(0,t.Z)("/img/5.0.0/debug-file-ios-versions-light.png"),dark:(0,t.Z)("/img/5.0.0/debug-file-ios-versions-dark.png")}}),"\n",(0,n.jsx)(i.h3,{id:"version-detail-1",children:"Version detail"}),"\n",(0,n.jsx)(d.Z,{alt:"",sources:{light:(0,t.Z)("/img/5.0.0/debug-file-ios-version-light.png"),dark:(0,t.Z)("/img/5.0.0/debug-file-ios-version-dark.png")}})]})}function v(e={}){const{wrapper:i}={...(0,r.a)(),...e.components};return i?(0,n.jsx)(i,{...e,children:(0,n.jsx)(c,{...e})}):c(e)}},1151:(e,i,s)=>{s.d(i,{Z:()=>o,a:()=>t});var n=s(7294);const r={},d=n.createContext(r);function t(e){const i=n.useContext(d);return n.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function o(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:t(e.components),n.createElement(d.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/9563a519.d2c7d44e.js b/assets/js/9563a519.d2c7d44e.js new file mode 100644 index 000000000..17077be00 --- /dev/null +++ b/assets/js/9563a519.d2c7d44e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[3703],{3673:e=>{e.exports=JSON.parse('{"title":"Administrator","slug":"/category/administrator","permalink":"/docs/5.1.0/category/administrator","navigation":{"previous":{"title":"Wecom (Wechat Work)","permalink":"/docs/5.1.0/user-guide/webhooks/wecom"},"next":{"title":"Apple Team","permalink":"/docs/5.1.0/user-guide/administrator/apple-team"}}}')}}]); \ No newline at end of file diff --git a/assets/js/95a38b63.02e6d82f.js b/assets/js/95a38b63.02e6d82f.js new file mode 100644 index 000000000..0df48ef00 --- /dev/null +++ b/assets/js/95a38b63.02e6d82f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[684],{2190:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>a,default:()=>l,frontMatter:()=>s,metadata:()=>i,toc:()=>d});var o=t(5893),r=t(1151);const s={},a="Lark (Feishu)",i={id:"user-guide/webhooks/feishu",title:"Lark (Feishu)",description:"\u98de\u4e66 use Incoming Webhooks whose constructs",source:"@site/versioned_docs/version-5.1.0/user-guide/webhooks/feishu.md",sourceDirName:"user-guide/webhooks",slug:"/user-guide/webhooks/feishu",permalink:"/docs/5.1.0/user-guide/webhooks/feishu",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.1.0/user-guide/webhooks/feishu.md",tags:[],version:"5.1.0",frontMatter:{},sidebar:"userGuide",previous:{title:"Discord",permalink:"/docs/5.1.0/user-guide/webhooks/discord"},next:{title:"Dingtalk (Dingding)",permalink:"/docs/5.1.0/user-guide/webhooks/dingtalk"}},c={},d=[{value:"Text format",id:"text-format",level:2},{value:"Interactive card format",id:"interactive-card-format",level:2}];function u(e){const n={a:"a",blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",p:"p",pre:"pre",...(0,r.a)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.h1,{id:"lark-feishu",children:"Lark (Feishu)"}),"\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.a,{href:"https://open.feishu.cn/document/ukTMukTMukTM/ucTM5YjL3ETO24yNxkjN",children:"\u98de\u4e66"})," use Incoming Webhooks whose constructs\ntypically support both text and interactive card, and can be configured as follows:"]}),"\n",(0,o.jsxs)(n.blockquote,{children:["\n",(0,o.jsx)(n.p,{children:"Due to system limitations try to use keyword or IP address whitelist mechanism to receive messages."}),"\n"]}),"\n",(0,o.jsx)(n.h2,{id:"text-format",children:"Text format"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-ruby",children:'{\n "msg_type": "text",\n "text": {\n "content": "#{@title}\\n\\n\u5b89\u88c5\u5730\u5740\uff1a#{@install_url}\\nUplaod at: #{@uploaded_at}"\n }\n}\n'})}),"\n",(0,o.jsx)(n.h2,{id:"interactive-card-format",children:"Interactive card format"}),"\n",(0,o.jsx)(n.p,{children:"Use card format could use partly of markdown syntax:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-ruby",children:'{\n "msg_type": "interactive",\n "card": {\n "config": {\n "wide_screen_mode": true,\n "enable_forward": true\n },\n "elements": [\n {\n "tag": "div",\n "fields": [\n {\n "is_short": true,\n "text": {\n "tag": "lark_md",\n "content": "**Platform**\\n#{@device_type}"\n }\n },\n {\n "is_short": true,\n "text": {\n "tag": "lark_md",\n "content": "**Version**\\n#{@release_version} (#{@build_version})"\n }\n },\n {\n "is_short": true,\n "text": {\n "tag": "lark_md",\n "content": "**Developer**\\n#{@username}"\n }\n },\n {\n "is_short": true,\n "text": {\n "tag": "lark_md",\n "content": "**Upload date**\\n#{@uploaded_at}"\n }\n },\n ]\n },\n {\n "tag": "div",\n "text": {\n "content": "**Changelog**\\n#{@changelog}",\n "tag": "lark_md"\n }\n },\n {\n "actions": [\n {\n "tag": "button",\n "text": {\n "content": "\ud83d\udc1e Go to app",\n "tag": "lark_md"\n },\n "url": "#{@release_url}",\n "type": "primary",\n "value": {}\n }\n ],\n "tag": "action"\n }\n ],\n "header": {\n "title": {\n "content": "#{@title}",\n "tag": "plain_text"\n }\n }\n }\n}\n'})})]})}function l(e={}){const{wrapper:n}={...(0,r.a)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(u,{...e})}):u(e)}},1151:(e,n,t)=>{t.d(n,{Z:()=>i,a:()=>a});var o=t(7294);const r={},s=o.createContext(r);function a(e){const n=o.useContext(s);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:a(e.components),o.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/95b29058.a314b017.js b/assets/js/95b29058.a314b017.js new file mode 100644 index 000000000..ccbbffd2c --- /dev/null +++ b/assets/js/95b29058.a314b017.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[3115],{46:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>h,contentTitle:()=>d,default:()=>m,frontMatter:()=>c,metadata:()=>u,toc:()=>p});var n=r(5893),s=r(1151),a=r(9965),o=r(4996),i=r(4866),l=r(5162);const c={},d="Reverse Proxies",u={id:"self-hosted/reverse-proxies",title:"Reverse Proxies",description:"To facilitate the unified management and distribution of SSL certificates, service expansion and access to off-the-shelf gateway services,",source:"@site/versioned_docs/version-5.1.0/self-hosted/reverse-proxies.mdx",sourceDirName:"self-hosted",slug:"/self-hosted/reverse-proxies",permalink:"/docs/5.1.0/self-hosted/reverse-proxies",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.1.0/self-hosted/reverse-proxies.mdx",tags:[],version:"5.1.0",frontMatter:{},sidebar:"selfHosted",previous:{title:"Source code",permalink:"/docs/5.1.0/self-hosted/deployment/source-code"},next:{title:"Cloud Provider Guides",permalink:"/docs/5.1.0/category/cloud-provider-guides"}},h={},p=[{value:"Prepare",id:"prepare",level:2},{value:"Traefik",id:"traefik",level:2},{value:"Configuration",id:"configuration",level:3},{value:"Traefik service",id:"traefik-service",level:3},{value:"Docker",id:"docker",level:3},{value:"Consul",id:"consul",level:3},{value:"Nomad",id:"nomad",level:3},{value:"Caddy 2",id:"caddy-2",level:2},{value:"Nginx",id:"nginx",level:2}];function f(e){const t={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,s.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.h1,{id:"reverse-proxies",children:"Reverse Proxies"}),"\n",(0,n.jsx)(t.p,{children:"To facilitate the unified management and distribution of SSL certificates, service expansion and access to off-the-shelf gateway services,\nwe provides several configurations for configuring reverse proxy services to the gateway."}),"\n","\n","\n",(0,n.jsx)(a.Z,{alt:"Architecture",sources:{light:(0,o.Z)("/img/5.0.0/reverse-proxies-light.png"),dark:(0,o.Z)("/img/5.0.0/reverse-proxies-dark.png")}}),"\n",(0,n.jsx)(t.h2,{id:"prepare",children:"Prepare"}),"\n",(0,n.jsx)(t.p,{children:"The following data needs to be prepared to configure the reverse proxy:"}),"\n",(0,n.jsxs)(t.table,{children:[(0,n.jsx)(t.thead,{children:(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.th,{children:"Name"}),(0,n.jsx)(t.th,{children:"Sample value"}),(0,n.jsx)(t.th,{children:"Description"})]})}),(0,n.jsxs)(t.tbody,{children:[(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"Domain"}),(0,n.jsx)(t.td,{children:"zealot.icyleaf.dev"}),(0,n.jsx)(t.td,{})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"Reverse proxy service IP address"}),(0,n.jsx)(t.td,{children:"172.16.56.1"}),(0,n.jsx)(t.td,{})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"Zealot IP address"}),(0,n.jsx)(t.td,{children:"172.16.56.100"}),(0,n.jsxs)(t.td,{children:["Reverse Proxy can be accessed",(0,n.jsx)("br",{}),"Change to 127.0.0.1 Reverse Proxy and zealot with one host."]})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"Zealot public port"}),(0,n.jsx)(t.td,{children:"8901"}),(0,n.jsx)(t.td,{children:"Reverse Proxy can be accessed"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"Zealot internal port"}),(0,n.jsx)(t.td,{children:"80"}),(0,n.jsx)(t.td,{children:"No need modify"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"Let's Encrypt Email address"}),(0,n.jsx)(t.td,{children:(0,n.jsx)(t.a,{href:"mailto:your-email@example.com",children:"your-email@example.com"})}),(0,n.jsx)(t.td,{})]})]})]}),"\n",(0,n.jsx)(t.h2,{id:"traefik",children:"Traefik"}),"\n",(0,n.jsxs)(t.p,{children:[(0,n.jsx)(t.a,{href:"https://doc.traefik.io/traefik/",children:"Traefik"})," is an open source reverse proxy and load balancing tool,\nwhich provides a variety of Providers can achieve access to the reverse proxy and configure the SSL."]}),"\n",(0,n.jsx)(t.h3,{id:"configuration",children:"Configuration"}),"\n",(0,n.jsx)(t.p,{children:"Regardless of the type of Provider used the core configuration items are the same and constitute the reverse proxy service configuration consists of three main components: discovery port number,\nrouting rules (including access port number, domain name binding and SSL)"}),"\n",(0,n.jsx)(t.h3,{id:"traefik-service",children:"Traefik service"}),"\n",(0,n.jsxs)(i.Z,{groupId:"yaml",children:[(0,n.jsx)(l.Z,{value:"yaml",children:(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-yaml",children:'entryPoints:\n web:\n address: ":80"\n\n websecure:\n address: ":443"\n\ncertificatesResolvers:\n letsencrypt:\n acme:\n email: your-email@example.com\n storage: acme.json\n httpChallenge:\n entryPoint: web\n'})})}),(0,n.jsx)(l.Z,{value:"toml",children:(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-toml",children:'[entryPoints]\n [entryPoints.web]\n address = ":80"\n\n [entryPoints.websecure]\n address = ":443"\n\n[certificatesResolvers.letsencrypt.acme]\n email = "your-email@example.com"\n storage = "acme.json"\n [certificatesResolvers.letsencrypt.acme.httpChallenge]\n # used during the challenge\n entryPoint = "web"\n'})})}),(0,n.jsx)(l.Z,{value:"cli",children:(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-bash",children:"--entrypoints.web.address=:80\n--entrypoints.websecure.address=:443\n\n--certificatesresolvers.letsencrypt.acme.email=your-email@example.com\n--certificatesresolvers.letsencrypt.acme.storage=acme.json\n--certificatesresolvers.letsencrypt.acme.httpchallenge.entrypoint=web\n"})})})]}),"\n",(0,n.jsx)(t.h3,{id:"docker",children:"Docker"}),"\n",(0,n.jsxs)(t.p,{children:["Enable ",(0,n.jsx)(t.a,{href:"https://doc.traefik.io/traefik/providers/docker/#configuration-examples",children:"Docker provider"})," then edit the Docker Compose file:"]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-yaml",metastring:'title="docker-compose.yml"',children:'version: \'3\'\nservices:\n zealot:\n <<: *defaults\n labels:\n - "traefik.enable=true"\n - "traefik.http.services.zealot.loadbalancer.server.port=80"\n - "traefik.http.routers.zealot.service=zealot"\n - "traefik.http.routers.zealot.rule=Host(`zealot.icyleaf.dev`)"\n - "traefik.http.routers.zealot.tls=true"\n - "traefik.http.routers.zealot.tls.certresolver=letsencrypt"\n - "traefik.http.routers.zealot.tls.domains[0].main=icyleaf.dev"\n - "traefik.http.routers.zealot.tls.domains[0].sans=zealot.icyleaf.dev"\n # Comment port, no need to public\n # ports:\n # - "8901:80"\n network:\n # Change the network what traefik service is\n - traefik-services\n\nnetworks:\n # Change the network what traefik service is\n traefik-services:\n external: true\n'})}),"\n",(0,n.jsx)(t.p,{children:"Deployment with Docker is limited to Traefik and Zealot service are usually in the same OS system of the same machine,\ncross-machine can not achieve communication, for cross-machine need to refer to the following two configuration options."}),"\n",(0,n.jsx)(t.h3,{id:"consul",children:"Consul"}),"\n",(0,n.jsxs)(t.p,{children:["Enable ",(0,n.jsx)(t.a,{href:"https://doc.traefik.io/traefik/providers/consul/",children:"Consul provider"})," or ",(0,n.jsx)(t.a,{href:"https://doc.traefik.io/traefik/providers/consul-catalog/",children:"Consul Catalog provider"}),", add key-value below:"]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-shell",children:"consul kv put traefik/http/services/zealot/loadbalancer/server/port 5\nconsul kv put traefik/http/routers/zealot/service zealot\nconsul kv put traefik/http/routers/zealot/rule 'Host(`zealot.icyleaf.dev`)'\nconsul kv put traefik/http/routers/zealot/tls/certresolver letsencrypt\nconsul kv put traefik/http/routers/zealot/tls/domains/0/main icyleaf.dev\nconsul kv put traefik/http/routers/zealot/tls/domains/0/sans zealot.icyleaf.dev\n"})}),"\n",(0,n.jsx)(t.h3,{id:"nomad",children:"Nomad"}),"\n",(0,n.jsxs)(t.p,{children:["Enable ",(0,n.jsx)(t.a,{href:"https://doc.traefik.io/traefik/providers/nomad/",children:"Nomad provider"})," and make sure Nomad version >= 1.3:"]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-hcl",metastring:'title="zealot.nomad"',children:'job "zealot" {\n datacenters = ["dc1"]\n type = "service"\n\n group "zealot" {\n count = 1\n\n network {\n port "http"{\n static = 80\n }\n }\n\n service {\n name = "zealot-http"\n provider = "nomad"\n port = "http"\n }\n\n task "server" {\n driver = "docker"\n config {\n image = "ghcr.io/tryzealot/zealot:nightly"\n ports = ["http"]\n args = [\n - "traefik.http.routers.zealot.rule=Host(`zealot.icyleaf.dev`)",\n - "traefik.http.routers.zealot.tls=true",\n - "traefik.http.routers.zealot.tls.certresolver=letsencrypt",\n - "traefik.http.routers.zealot.tls.domains[0].main=icyleaf.dev",\n - "traefik.http.routers.zealot.tls.domains[0].sans=zealot.icyleaf.dev"\n ]\n }\n }\n }\n}\n'})}),"\n",(0,n.jsx)(t.h2,{id:"caddy-2",children:"Caddy 2"}),"\n",(0,n.jsxs)(t.p,{children:["The configuration only needs to relate the ip part after ",(0,n.jsx)(t.code,{children:"tls"})," and ",(0,n.jsx)(t.code,{children:"proxy"}),":"]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-nginx",metastring:'title="Caddyfile"',children:":443\n\nlog\n\n# Use Let's Encrypt service\ntls your-email@example.com\n\nreverse_proxy 172.16.56.100:8901\n"})}),"\n",(0,n.jsx)(t.h2,{id:"nginx",children:"Nginx"}),"\n",(0,n.jsxs)(t.p,{children:["The following is the general configuration, if not effects welcome to ",(0,n.jsx)(t.a,{href:"https://github.com/tryzealot/docs/issues/new",children:"file a issue"}),":"]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-nginx",metastring:'title="conf.d/zealot.conf"',children:"upstream zealot {\n zone upstreams 64K;\n server 172.16.56.100:8901;\n keepalive 32;\n}\n\nmap $http_upgrade $connection_upgrade {\n default upgrade;\n '' close;\n}\n\nserver {\n listen 80;\n listen [::]:80;\n server_name zealot.icyleaf.dev;\n location /.well-known/acme-challenge/ { allow all; }\n location / { return 301 https://$host$request_uri; }\n}\n\nserver {\n listen 443 ssl http2; # Optional: http2 may needs install extension\n listen [::]:443 ssl http2;\n server_name zealot.icyleaf.dev;\n\n ssl_certificate /etc/certs/zealot-cert.pem;\n ssl_certificate_key /etc/certs/zealot.pem;\n\n # Optional\n # ssl_ciphers HIGH:!MEDIUM:!LOW:!aNULL:!NULL:!SHA;\n # ssl_session_timeout 5m;\n # ssl_session_cache shared:SSL:1m;\n # ssl_prefer_server_ciphers on;\n\n location / {\n proxy_pass http://zealot;\n proxy_redirect off;\n\n proxy_pass_header Authorization;\n proxy_set_header Host $host;\n # proxy_set_header X-Forwarded-Ssl on; # Optional\n proxy_set_header X-Real-IP $remote_addr;\n proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n proxy_set_header X-Forwarded-Proto $scheme;\n\n proxy_http_version 1.1;\n proxy_set_header Upgrade $http_upgrade;\n proxy_set_header Connection $connection_upgrade;\n\n client_max_body_size 0;\n proxy_read_timeout 36000s;\n }\n}\n"})}),"\n",(0,n.jsxs)(t.p,{children:["And you need update max body size in ",(0,n.jsx)(t.code,{children:"http"})," block. Recommended is 200MB, if it's a game,\n50% more can be played to make a surplus according to the actual file size."]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-nginx",metastring:'title="nginx.conf"',children:"http {\n [...]\n\n client_max_body_size 200M;\n}\n"})})]})}function m(e={}){const{wrapper:t}={...(0,s.a)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(f,{...e})}):f(e)}},5162:(e,t,r)=>{r.d(t,{Z:()=>o});r(7294);var n=r(512);const s={tabItem:"tabItem_Ymn6"};var a=r(5893);function o(e){let{children:t,hidden:r,className:o}=e;return(0,a.jsx)("div",{role:"tabpanel",className:(0,n.Z)(s.tabItem,o),hidden:r,children:t})}},4866:(e,t,r)=>{r.d(t,{Z:()=>k});var n=r(7294),s=r(512),a=r(2466),o=r(6550),i=r(469),l=r(1980),c=r(7392),d=r(12);function u(e){return n.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,n.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function h(e){const{values:t,children:r}=e;return(0,n.useMemo)((()=>{const e=t??function(e){return u(e).map((e=>{let{props:{value:t,label:r,attributes:n,default:s}}=e;return{value:t,label:r,attributes:n,default:s}}))}(r);return function(e){const t=(0,c.l)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,r])}function p(e){let{value:t,tabValues:r}=e;return r.some((e=>e.value===t))}function f(e){let{queryString:t=!1,groupId:r}=e;const s=(0,o.k6)(),a=function(e){let{queryString:t=!1,groupId:r}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!r)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return r??null}({queryString:t,groupId:r});return[(0,l._X)(a),(0,n.useCallback)((e=>{if(!a)return;const t=new URLSearchParams(s.location.search);t.set(a,e),s.replace({...s.location,search:t.toString()})}),[a,s])]}function m(e){const{defaultValue:t,queryString:r=!1,groupId:s}=e,a=h(e),[o,l]=(0,n.useState)((()=>function(e){let{defaultValue:t,tabValues:r}=e;if(0===r.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!p({value:t,tabValues:r}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${r.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const n=r.find((e=>e.default))??r[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:t,tabValues:a}))),[c,u]=f({queryString:r,groupId:s}),[m,v]=function(e){let{groupId:t}=e;const r=function(e){return e?`docusaurus.tab.${e}`:null}(t),[s,a]=(0,d.Nk)(r);return[s,(0,n.useCallback)((e=>{r&&a.set(e)}),[r,a])]}({groupId:s}),x=(()=>{const e=c??m;return p({value:e,tabValues:a})?e:null})();(0,i.Z)((()=>{x&&l(x)}),[x]);return{selectedValue:o,selectValue:(0,n.useCallback)((e=>{if(!p({value:e,tabValues:a}))throw new Error(`Can't select invalid tab value=${e}`);l(e),u(e),v(e)}),[u,v,a]),tabValues:a}}var v=r(2389);const x={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var g=r(5893);function y(e){let{className:t,block:r,selectedValue:n,selectValue:o,tabValues:i}=e;const l=[],{blockElementScrollPositionUntilNextRender:c}=(0,a.o5)(),d=e=>{const t=e.currentTarget,r=l.indexOf(t),s=i[r].value;s!==n&&(c(t),o(s))},u=e=>{let t=null;switch(e.key){case"Enter":d(e);break;case"ArrowRight":{const r=l.indexOf(e.currentTarget)+1;t=l[r]??l[0];break}case"ArrowLeft":{const r=l.indexOf(e.currentTarget)-1;t=l[r]??l[l.length-1];break}}t?.focus()};return(0,g.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,s.Z)("tabs",{"tabs--block":r},t),children:i.map((e=>{let{value:t,label:r,attributes:a}=e;return(0,g.jsx)("li",{role:"tab",tabIndex:n===t?0:-1,"aria-selected":n===t,ref:e=>l.push(e),onKeyDown:u,onClick:d,...a,className:(0,s.Z)("tabs__item",x.tabItem,a?.className,{"tabs__item--active":n===t}),children:r??t},t)}))})}function b(e){let{lazy:t,children:r,selectedValue:s}=e;const a=(Array.isArray(r)?r:[r]).filter(Boolean);if(t){const e=a.find((e=>e.props.value===s));return e?(0,n.cloneElement)(e,{className:"margin-top--md"}):null}return(0,g.jsx)("div",{className:"margin-top--md",children:a.map(((e,t)=>(0,n.cloneElement)(e,{key:t,hidden:e.props.value!==s})))})}function j(e){const t=m(e);return(0,g.jsxs)("div",{className:(0,s.Z)("tabs-container",x.tabList),children:[(0,g.jsx)(y,{...e,...t}),(0,g.jsx)(b,{...e,...t})]})}function k(e){const t=(0,v.Z)();return(0,g.jsx)(j,{...e,children:u(e.children)},String(t))}},1151:(e,t,r)=>{r.d(t,{Z:()=>i,a:()=>o});var n=r(7294);const s={},a=n.createContext(s);function o(e){const t=n.useContext(a);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function i(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),n.createElement(a.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/95b29058.de715f15.js b/assets/js/95b29058.de715f15.js deleted file mode 100644 index cf4382f4d..000000000 --- a/assets/js/95b29058.de715f15.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[3115],{46:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>h,contentTitle:()=>d,default:()=>m,frontMatter:()=>c,metadata:()=>u,toc:()=>p});var n=r(5893),s=r(1151),a=r(9965),o=r(4996),i=r(4866),l=r(5162);const c={},d="Reverse Proxies",u={id:"self-hosted/reverse-proxies",title:"Reverse Proxies",description:"To facilitate the unified management and distribution of SSL certificates, service expansion and access to off-the-shelf gateway services,",source:"@site/versioned_docs/version-5.1.0/self-hosted/reverse-proxies.mdx",sourceDirName:"self-hosted",slug:"/self-hosted/reverse-proxies",permalink:"/docs/self-hosted/reverse-proxies",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.1.0/self-hosted/reverse-proxies.mdx",tags:[],version:"5.1.0",frontMatter:{},sidebar:"selfHosted",previous:{title:"Source code",permalink:"/docs/self-hosted/deployment/source-code"},next:{title:"Cloud Provider Guides",permalink:"/docs/category/cloud-provider-guides"}},h={},p=[{value:"Prepare",id:"prepare",level:2},{value:"Traefik",id:"traefik",level:2},{value:"Configuration",id:"configuration",level:3},{value:"Traefik service",id:"traefik-service",level:3},{value:"Docker",id:"docker",level:3},{value:"Consul",id:"consul",level:3},{value:"Nomad",id:"nomad",level:3},{value:"Caddy 2",id:"caddy-2",level:2},{value:"Nginx",id:"nginx",level:2}];function f(e){const t={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,s.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.h1,{id:"reverse-proxies",children:"Reverse Proxies"}),"\n",(0,n.jsx)(t.p,{children:"To facilitate the unified management and distribution of SSL certificates, service expansion and access to off-the-shelf gateway services,\nwe provides several configurations for configuring reverse proxy services to the gateway."}),"\n","\n","\n",(0,n.jsx)(a.Z,{alt:"Architecture",sources:{light:(0,o.Z)("/img/5.0.0/reverse-proxies-light.png"),dark:(0,o.Z)("/img/5.0.0/reverse-proxies-dark.png")}}),"\n",(0,n.jsx)(t.h2,{id:"prepare",children:"Prepare"}),"\n",(0,n.jsx)(t.p,{children:"The following data needs to be prepared to configure the reverse proxy:"}),"\n",(0,n.jsxs)(t.table,{children:[(0,n.jsx)(t.thead,{children:(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.th,{children:"Name"}),(0,n.jsx)(t.th,{children:"Sample value"}),(0,n.jsx)(t.th,{children:"Description"})]})}),(0,n.jsxs)(t.tbody,{children:[(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"Domain"}),(0,n.jsx)(t.td,{children:"zealot.icyleaf.dev"}),(0,n.jsx)(t.td,{})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"Reverse proxy service IP address"}),(0,n.jsx)(t.td,{children:"172.16.56.1"}),(0,n.jsx)(t.td,{})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"Zealot IP address"}),(0,n.jsx)(t.td,{children:"172.16.56.100"}),(0,n.jsxs)(t.td,{children:["Reverse Proxy can be accessed",(0,n.jsx)("br",{}),"Change to 127.0.0.1 Reverse Proxy and zealot with one host."]})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"Zealot public port"}),(0,n.jsx)(t.td,{children:"8901"}),(0,n.jsx)(t.td,{children:"Reverse Proxy can be accessed"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"Zealot internal port"}),(0,n.jsx)(t.td,{children:"80"}),(0,n.jsx)(t.td,{children:"No need modify"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"Let's Encrypt Email address"}),(0,n.jsx)(t.td,{children:(0,n.jsx)(t.a,{href:"mailto:your-email@example.com",children:"your-email@example.com"})}),(0,n.jsx)(t.td,{})]})]})]}),"\n",(0,n.jsx)(t.h2,{id:"traefik",children:"Traefik"}),"\n",(0,n.jsxs)(t.p,{children:[(0,n.jsx)(t.a,{href:"https://doc.traefik.io/traefik/",children:"Traefik"})," is an open source reverse proxy and load balancing tool,\nwhich provides a variety of Providers can achieve access to the reverse proxy and configure the SSL."]}),"\n",(0,n.jsx)(t.h3,{id:"configuration",children:"Configuration"}),"\n",(0,n.jsx)(t.p,{children:"Regardless of the type of Provider used the core configuration items are the same and constitute the reverse proxy service configuration consists of three main components: discovery port number,\nrouting rules (including access port number, domain name binding and SSL)"}),"\n",(0,n.jsx)(t.h3,{id:"traefik-service",children:"Traefik service"}),"\n",(0,n.jsxs)(i.Z,{groupId:"yaml",children:[(0,n.jsx)(l.Z,{value:"yaml",children:(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-yaml",children:'entryPoints:\n web:\n address: ":80"\n\n websecure:\n address: ":443"\n\ncertificatesResolvers:\n letsencrypt:\n acme:\n email: your-email@example.com\n storage: acme.json\n httpChallenge:\n entryPoint: web\n'})})}),(0,n.jsx)(l.Z,{value:"toml",children:(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-toml",children:'[entryPoints]\n [entryPoints.web]\n address = ":80"\n\n [entryPoints.websecure]\n address = ":443"\n\n[certificatesResolvers.letsencrypt.acme]\n email = "your-email@example.com"\n storage = "acme.json"\n [certificatesResolvers.letsencrypt.acme.httpChallenge]\n # used during the challenge\n entryPoint = "web"\n'})})}),(0,n.jsx)(l.Z,{value:"cli",children:(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-bash",children:"--entrypoints.web.address=:80\n--entrypoints.websecure.address=:443\n\n--certificatesresolvers.letsencrypt.acme.email=your-email@example.com\n--certificatesresolvers.letsencrypt.acme.storage=acme.json\n--certificatesresolvers.letsencrypt.acme.httpchallenge.entrypoint=web\n"})})})]}),"\n",(0,n.jsx)(t.h3,{id:"docker",children:"Docker"}),"\n",(0,n.jsxs)(t.p,{children:["Enable ",(0,n.jsx)(t.a,{href:"https://doc.traefik.io/traefik/providers/docker/#configuration-examples",children:"Docker provider"})," then edit the Docker Compose file:"]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-yaml",metastring:'title="docker-compose.yml"',children:'version: \'3\'\nservices:\n zealot:\n <<: *defaults\n labels:\n - "traefik.enable=true"\n - "traefik.http.services.zealot.loadbalancer.server.port=80"\n - "traefik.http.routers.zealot.service=zealot"\n - "traefik.http.routers.zealot.rule=Host(`zealot.icyleaf.dev`)"\n - "traefik.http.routers.zealot.tls=true"\n - "traefik.http.routers.zealot.tls.certresolver=letsencrypt"\n - "traefik.http.routers.zealot.tls.domains[0].main=icyleaf.dev"\n - "traefik.http.routers.zealot.tls.domains[0].sans=zealot.icyleaf.dev"\n # Comment port, no need to public\n # ports:\n # - "8901:80"\n network:\n # Change the network what traefik service is\n - traefik-services\n\nnetworks:\n # Change the network what traefik service is\n traefik-services:\n external: true\n'})}),"\n",(0,n.jsx)(t.p,{children:"Deployment with Docker is limited to Traefik and Zealot service are usually in the same OS system of the same machine,\ncross-machine can not achieve communication, for cross-machine need to refer to the following two configuration options."}),"\n",(0,n.jsx)(t.h3,{id:"consul",children:"Consul"}),"\n",(0,n.jsxs)(t.p,{children:["Enable ",(0,n.jsx)(t.a,{href:"https://doc.traefik.io/traefik/providers/consul/",children:"Consul provider"})," or ",(0,n.jsx)(t.a,{href:"https://doc.traefik.io/traefik/providers/consul-catalog/",children:"Consul Catalog provider"}),", add key-value below:"]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-shell",children:"consul kv put traefik/http/services/zealot/loadbalancer/server/port 5\nconsul kv put traefik/http/routers/zealot/service zealot\nconsul kv put traefik/http/routers/zealot/rule 'Host(`zealot.icyleaf.dev`)'\nconsul kv put traefik/http/routers/zealot/tls/certresolver letsencrypt\nconsul kv put traefik/http/routers/zealot/tls/domains/0/main icyleaf.dev\nconsul kv put traefik/http/routers/zealot/tls/domains/0/sans zealot.icyleaf.dev\n"})}),"\n",(0,n.jsx)(t.h3,{id:"nomad",children:"Nomad"}),"\n",(0,n.jsxs)(t.p,{children:["Enable ",(0,n.jsx)(t.a,{href:"https://doc.traefik.io/traefik/providers/nomad/",children:"Nomad provider"})," and make sure Nomad version >= 1.3:"]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-hcl",metastring:'title="zealot.nomad"',children:'job "zealot" {\n datacenters = ["dc1"]\n type = "service"\n\n group "zealot" {\n count = 1\n\n network {\n port "http"{\n static = 80\n }\n }\n\n service {\n name = "zealot-http"\n provider = "nomad"\n port = "http"\n }\n\n task "server" {\n driver = "docker"\n config {\n image = "ghcr.io/tryzealot/zealot:nightly"\n ports = ["http"]\n args = [\n - "traefik.http.routers.zealot.rule=Host(`zealot.icyleaf.dev`)",\n - "traefik.http.routers.zealot.tls=true",\n - "traefik.http.routers.zealot.tls.certresolver=letsencrypt",\n - "traefik.http.routers.zealot.tls.domains[0].main=icyleaf.dev",\n - "traefik.http.routers.zealot.tls.domains[0].sans=zealot.icyleaf.dev"\n ]\n }\n }\n }\n}\n'})}),"\n",(0,n.jsx)(t.h2,{id:"caddy-2",children:"Caddy 2"}),"\n",(0,n.jsxs)(t.p,{children:["The configuration only needs to relate the ip part after ",(0,n.jsx)(t.code,{children:"tls"})," and ",(0,n.jsx)(t.code,{children:"proxy"}),":"]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-nginx",metastring:'title="Caddyfile"',children:":443\n\nlog\n\n# Use Let's Encrypt service\ntls your-email@example.com\n\nreverse_proxy 172.16.56.100:8901\n"})}),"\n",(0,n.jsx)(t.h2,{id:"nginx",children:"Nginx"}),"\n",(0,n.jsxs)(t.p,{children:["The following is the general configuration, if not effects welcome to ",(0,n.jsx)(t.a,{href:"https://github.com/tryzealot/docs/issues/new",children:"file a issue"}),":"]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-nginx",metastring:'title="conf.d/zealot.conf"',children:"upstream zealot {\n zone upstreams 64K;\n server 172.16.56.100:8901;\n keepalive 32;\n}\n\nmap $http_upgrade $connection_upgrade {\n default upgrade;\n '' close;\n}\n\nserver {\n listen 80;\n listen [::]:80;\n server_name zealot.icyleaf.dev;\n location /.well-known/acme-challenge/ { allow all; }\n location / { return 301 https://$host$request_uri; }\n}\n\nserver {\n listen 443 ssl http2; # Optional: http2 may needs install extension\n listen [::]:443 ssl http2;\n server_name zealot.icyleaf.dev;\n\n ssl_certificate /etc/certs/zealot-cert.pem;\n ssl_certificate_key /etc/certs/zealot.pem;\n\n # Optional\n # ssl_ciphers HIGH:!MEDIUM:!LOW:!aNULL:!NULL:!SHA;\n # ssl_session_timeout 5m;\n # ssl_session_cache shared:SSL:1m;\n # ssl_prefer_server_ciphers on;\n\n location / {\n proxy_pass http://zealot;\n proxy_redirect off;\n\n proxy_pass_header Authorization;\n proxy_set_header Host $host;\n # proxy_set_header X-Forwarded-Ssl on; # Optional\n proxy_set_header X-Real-IP $remote_addr;\n proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n proxy_set_header X-Forwarded-Proto $scheme;\n\n proxy_http_version 1.1;\n proxy_set_header Upgrade $http_upgrade;\n proxy_set_header Connection $connection_upgrade;\n\n client_max_body_size 0;\n proxy_read_timeout 36000s;\n }\n}\n"})}),"\n",(0,n.jsxs)(t.p,{children:["And you need update max body size in ",(0,n.jsx)(t.code,{children:"http"})," block. Recommended is 200MB, if it's a game,\n50% more can be played to make a surplus according to the actual file size."]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-nginx",metastring:'title="nginx.conf"',children:"http {\n [...]\n\n client_max_body_size 200M;\n}\n"})})]})}function m(e={}){const{wrapper:t}={...(0,s.a)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(f,{...e})}):f(e)}},5162:(e,t,r)=>{r.d(t,{Z:()=>o});r(7294);var n=r(512);const s={tabItem:"tabItem_Ymn6"};var a=r(5893);function o(e){let{children:t,hidden:r,className:o}=e;return(0,a.jsx)("div",{role:"tabpanel",className:(0,n.Z)(s.tabItem,o),hidden:r,children:t})}},4866:(e,t,r)=>{r.d(t,{Z:()=>k});var n=r(7294),s=r(512),a=r(2466),o=r(6550),i=r(469),l=r(1980),c=r(7392),d=r(12);function u(e){return n.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,n.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function h(e){const{values:t,children:r}=e;return(0,n.useMemo)((()=>{const e=t??function(e){return u(e).map((e=>{let{props:{value:t,label:r,attributes:n,default:s}}=e;return{value:t,label:r,attributes:n,default:s}}))}(r);return function(e){const t=(0,c.l)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,r])}function p(e){let{value:t,tabValues:r}=e;return r.some((e=>e.value===t))}function f(e){let{queryString:t=!1,groupId:r}=e;const s=(0,o.k6)(),a=function(e){let{queryString:t=!1,groupId:r}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!r)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return r??null}({queryString:t,groupId:r});return[(0,l._X)(a),(0,n.useCallback)((e=>{if(!a)return;const t=new URLSearchParams(s.location.search);t.set(a,e),s.replace({...s.location,search:t.toString()})}),[a,s])]}function m(e){const{defaultValue:t,queryString:r=!1,groupId:s}=e,a=h(e),[o,l]=(0,n.useState)((()=>function(e){let{defaultValue:t,tabValues:r}=e;if(0===r.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!p({value:t,tabValues:r}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${r.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const n=r.find((e=>e.default))??r[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:t,tabValues:a}))),[c,u]=f({queryString:r,groupId:s}),[m,v]=function(e){let{groupId:t}=e;const r=function(e){return e?`docusaurus.tab.${e}`:null}(t),[s,a]=(0,d.Nk)(r);return[s,(0,n.useCallback)((e=>{r&&a.set(e)}),[r,a])]}({groupId:s}),x=(()=>{const e=c??m;return p({value:e,tabValues:a})?e:null})();(0,i.Z)((()=>{x&&l(x)}),[x]);return{selectedValue:o,selectValue:(0,n.useCallback)((e=>{if(!p({value:e,tabValues:a}))throw new Error(`Can't select invalid tab value=${e}`);l(e),u(e),v(e)}),[u,v,a]),tabValues:a}}var v=r(2389);const x={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var g=r(5893);function y(e){let{className:t,block:r,selectedValue:n,selectValue:o,tabValues:i}=e;const l=[],{blockElementScrollPositionUntilNextRender:c}=(0,a.o5)(),d=e=>{const t=e.currentTarget,r=l.indexOf(t),s=i[r].value;s!==n&&(c(t),o(s))},u=e=>{let t=null;switch(e.key){case"Enter":d(e);break;case"ArrowRight":{const r=l.indexOf(e.currentTarget)+1;t=l[r]??l[0];break}case"ArrowLeft":{const r=l.indexOf(e.currentTarget)-1;t=l[r]??l[l.length-1];break}}t?.focus()};return(0,g.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,s.Z)("tabs",{"tabs--block":r},t),children:i.map((e=>{let{value:t,label:r,attributes:a}=e;return(0,g.jsx)("li",{role:"tab",tabIndex:n===t?0:-1,"aria-selected":n===t,ref:e=>l.push(e),onKeyDown:u,onClick:d,...a,className:(0,s.Z)("tabs__item",x.tabItem,a?.className,{"tabs__item--active":n===t}),children:r??t},t)}))})}function b(e){let{lazy:t,children:r,selectedValue:s}=e;const a=(Array.isArray(r)?r:[r]).filter(Boolean);if(t){const e=a.find((e=>e.props.value===s));return e?(0,n.cloneElement)(e,{className:"margin-top--md"}):null}return(0,g.jsx)("div",{className:"margin-top--md",children:a.map(((e,t)=>(0,n.cloneElement)(e,{key:t,hidden:e.props.value!==s})))})}function j(e){const t=m(e);return(0,g.jsxs)("div",{className:(0,s.Z)("tabs-container",x.tabList),children:[(0,g.jsx)(y,{...e,...t}),(0,g.jsx)(b,{...e,...t})]})}function k(e){const t=(0,v.Z)();return(0,g.jsx)(j,{...e,children:u(e.children)},String(t))}},1151:(e,t,r)=>{r.d(t,{Z:()=>i,a:()=>o});var n=r(7294);const s={},a=n.createContext(s);function o(e){const t=n.useContext(a);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function i(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),n.createElement(a.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/979376ed.c133320a.js b/assets/js/979376ed.c133320a.js new file mode 100644 index 000000000..7b45718f6 --- /dev/null +++ b/assets/js/979376ed.c133320a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[8642],{8300:e=>{e.exports=JSON.parse('{"pluginId":"default","version":"5.1.0","label":"5.1.0","banner":"unmaintained","badge":true,"noIndex":false,"className":"docs-version-5.1.0","isLast":false,"docsSidebars":{"selfHosted":[{"type":"link","label":"Getting Started","href":"/docs/5.1.0/self-hosted/","docId":"self-hosted/index","unlisted":false},{"collapsible":false,"label":"Deployment","type":"category","items":[{"type":"link","label":"Architecture","href":"/docs/5.1.0/self-hosted/deployment/architecture","docId":"self-hosted/deployment/architecture","unlisted":false},{"type":"link","label":"Requirements","href":"/docs/5.1.0/self-hosted/deployment/requirements","docId":"self-hosted/deployment/requirements","unlisted":false},{"collapsible":true,"label":"Docker","type":"category","items":[{"type":"link","label":"Step by step","href":"/docs/5.1.0/self-hosted/deployment/docker/step-by-step","docId":"self-hosted/deployment/docker/step-by-step","unlisted":false}],"collapsed":true,"href":"/docs/5.1.0/self-hosted/deployment/docker"},{"type":"link","label":"Kubernetes","href":"/docs/5.1.0/self-hosted/deployment/kubernetes","docId":"self-hosted/deployment/kubernetes","unlisted":false},{"type":"link","label":"Nomad","href":"/docs/5.1.0/self-hosted/deployment/nomad","docId":"self-hosted/deployment/nomad","unlisted":false},{"type":"link","label":"Source code","href":"/docs/5.1.0/self-hosted/deployment/source-code","docId":"self-hosted/deployment/source-code","unlisted":false}],"collapsed":false,"href":"/docs/5.1.0/category/deployment"},{"type":"link","label":"Reverse Proxies","href":"/docs/5.1.0/self-hosted/reverse-proxies","docId":"self-hosted/reverse-proxies","unlisted":false},{"collapsible":false,"label":"Cloud Provider Guides","type":"category","items":[{"type":"link","label":"Fly","href":"/docs/5.1.0/self-hosted/deployment/fly","docId":"self-hosted/deployment/fly","unlisted":false},{"type":"link","label":"Railway","href":"/docs/5.1.0/self-hosted/deployment/railway","docId":"self-hosted/deployment/railway","unlisted":false},{"type":"link","label":"Render","href":"/docs/5.1.0/self-hosted/deployment/render","docId":"self-hosted/deployment/render","unlisted":false}],"collapsed":false,"href":"/docs/5.1.0/category/cloud-provider-guides"},{"collapsible":false,"label":"Configuration","type":"category","items":[{"type":"link","label":"Environment Variables","href":"/docs/5.1.0/self-hosted/configuration/environment-variables","docId":"self-hosted/configuration/environment-variables","unlisted":false},{"type":"link","label":"Third-party Authentication","href":"/docs/5.1.0/self-hosted/configuration/third-party-authentication","docId":"self-hosted/configuration/third-party-authentication","unlisted":false},{"type":"link","label":"Schedule Jobs","href":"/docs/5.1.0/self-hosted/configuration/schedule-jobs","docId":"self-hosted/configuration/schedule-jobs","unlisted":false}],"collapsed":false,"href":"/docs/5.1.0/category/configuration"},{"type":"link","label":"Storage","href":"/docs/5.1.0/self-hosted/storage","docId":"self-hosted/storage","unlisted":false}],"userGuide":[{"type":"link","label":"Getting Started","href":"/docs/5.1.0/user-guide/","docId":"user-guide/index","unlisted":false},{"type":"link","label":"Dashboard","href":"/docs/5.1.0/user-guide/dashboard","docId":"user-guide/dashboard","unlisted":false},{"collapsible":true,"label":"Apps","type":"category","items":[{"type":"link","label":"Create an App","href":"/docs/5.1.0/user-guide/apps/create","docId":"user-guide/apps/create","unlisted":false},{"type":"link","label":"Manage apps","href":"/docs/5.1.0/user-guide/apps/","docId":"user-guide/apps/index","unlisted":false},{"type":"link","label":"Uploaded releases","href":"/docs/5.1.0/user-guide/apps/detail","docId":"user-guide/apps/detail","unlisted":false},{"type":"link","label":"Uploaded a release","href":"/docs/5.1.0/user-guide/apps/upload","docId":"user-guide/apps/upload","unlisted":false}],"collapsed":true,"href":"/docs/5.1.0/category/apps"},{"collapsible":true,"label":"Debug Files","type":"category","items":[{"type":"link","label":"List debug files","href":"/docs/5.1.0/user-guide/debug-files/","docId":"user-guide/debug-files/index","unlisted":false},{"type":"link","label":"Review metadata","href":"/docs/5.1.0/user-guide/debug-files/review","docId":"user-guide/debug-files/review","unlisted":false},{"type":"link","label":"Create a Debug File","href":"/docs/5.1.0/user-guide/debug-files/upload","docId":"user-guide/debug-files/upload","unlisted":false}],"collapsed":true,"href":"/docs/5.1.0/category/debug-files"},{"collapsible":true,"label":"Toolkits","type":"category","items":[{"type":"link","label":"Teardown App","href":"/docs/5.1.0/user-guide/toolkits/teardown","docId":"user-guide/toolkits/teardown","unlisted":false},{"type":"link","label":"Fetch UDID","href":"/docs/5.1.0/user-guide/toolkits/fetch-udid","docId":"user-guide/toolkits/fetch-udid","unlisted":false}],"collapsed":true,"href":"/docs/5.1.0/category/toolkits"},{"collapsible":true,"label":"Webhooks","type":"category","items":[{"type":"link","label":"Slack","href":"/docs/5.1.0/user-guide/webhooks/slack","docId":"user-guide/webhooks/slack","unlisted":false},{"type":"link","label":"Discord","href":"/docs/5.1.0/user-guide/webhooks/discord","docId":"user-guide/webhooks/discord","unlisted":false},{"type":"link","label":"Lark (Feishu)","href":"/docs/5.1.0/user-guide/webhooks/feishu","docId":"user-guide/webhooks/feishu","unlisted":false},{"type":"link","label":"Dingtalk (Dingding)","href":"/docs/5.1.0/user-guide/webhooks/dingtalk","docId":"user-guide/webhooks/dingtalk","unlisted":false},{"type":"link","label":"Wecom (Wechat Work)","href":"/docs/5.1.0/user-guide/webhooks/wecom","docId":"user-guide/webhooks/wecom","unlisted":false}],"collapsed":true,"href":"/docs/5.1.0/user-guide/webhooks"},{"collapsible":true,"label":"Administrator","type":"category","items":[{"type":"link","label":"Apple Team","href":"/docs/5.1.0/user-guide/administrator/apple-team","docId":"user-guide/administrator/apple-team","unlisted":false},{"type":"link","label":"Permissions","href":"/docs/5.1.0/user-guide/administrator/permissions","docId":"user-guide/administrator/permissions","unlisted":false},{"type":"link","label":"Backup","href":"/docs/5.1.0/user-guide/administrator/backup","docId":"user-guide/administrator/backup","unlisted":false},{"type":"link","label":"Settings","href":"/docs/5.1.0/user-guide/administrator/settings","docId":"user-guide/administrator/settings","unlisted":false},{"collapsible":true,"label":"Monitoring","type":"category","items":[{"type":"link","label":"System informations","href":"/docs/5.1.0/user-guide/administrator/monitoring/system-info","docId":"user-guide/administrator/monitoring/system-info","unlisted":false},{"type":"link","label":"Logging","href":"/docs/5.1.0/user-guide/administrator/monitoring/logging","docId":"user-guide/administrator/monitoring/logging","unlisted":false},{"type":"link","label":"Background Jobs","href":"/docs/5.1.0/user-guide/administrator/monitoring/background-jobs","docId":"user-guide/administrator/monitoring/background-jobs","unlisted":false},{"type":"link","label":"Database Analytics","href":"/docs/5.1.0/user-guide/administrator/monitoring/database-analytics","docId":"user-guide/administrator/monitoring/database-analytics","unlisted":false}],"collapsed":true,"href":"/docs/5.1.0/category/monitoring"}],"collapsed":true,"href":"/docs/5.1.0/category/administrator"},{"type":"link","label":"Best Practices","href":"/docs/5.1.0/user-guide/best_practices","docId":"user-guide/best_practices","unlisted":false},{"type":"link","label":"Change Log","href":"/docs/5.1.0/user-guide/changelog","docId":"user-guide/changelog","unlisted":false},{"type":"link","label":"Q&A","href":"/docs/5.1.0/user-guide/qa","docId":"user-guide/qa","unlisted":false},{"type":"link","label":"Credits","href":"/docs/5.1.0/user-guide/credits","docId":"user-guide/credits","unlisted":false}],"developerGuide":[{"type":"link","label":"Getting Started","href":"/docs/5.1.0/developer-guide/","docId":"developer-guide/index","unlisted":false},{"collapsible":false,"label":"SDKs","type":"category","items":[{"type":"link","label":"iOS","href":"/docs/5.1.0/developer-guide/sdk/ios","docId":"developer-guide/sdk/ios","unlisted":false},{"type":"link","label":"Android","href":"/docs/5.1.0/developer-guide/sdk/android","docId":"developer-guide/sdk/android","unlisted":false}],"collapsed":false,"href":"/docs/5.1.0/category/sdks"},{"collapsible":false,"label":"fastlane plugins","type":"category","items":[{"type":"link","label":"zealot","href":"/docs/5.1.0/developer-guide/fastlane/zealot","docId":"developer-guide/fastlane/zealot","unlisted":false},{"type":"link","label":"zealot_version_check","href":"/docs/5.1.0/developer-guide/fastlane/zealot_version_check","docId":"developer-guide/fastlane/zealot_version_check","unlisted":false},{"type":"link","label":"zealot_debug_file","href":"/docs/5.1.0/developer-guide/fastlane/zealot_debug_file","docId":"developer-guide/fastlane/zealot_debug_file","unlisted":false},{"type":"link","label":"zealot_sync_devices","href":"/docs/5.1.0/developer-guide/fastlane/zealot_sync_devices","docId":"developer-guide/fastlane/zealot_sync_devices","unlisted":false}],"collapsed":false,"href":"/docs/5.1.0/developer-guide/fastlane"},{"collapsible":false,"label":"APIs","type":"category","items":[{"type":"link","label":"Apps","href":"/docs/5.1.0/developer-guide/api/apps","docId":"developer-guide/api/apps","unlisted":false},{"type":"link","label":"Debug Files","href":"/docs/5.1.0/developer-guide/api/debug_files","docId":"developer-guide/api/debug_files","unlisted":false}],"collapsed":false,"href":"/docs/5.1.0/developer-guide/api"}],"contributingGuide":[{"type":"link","label":"Getting Started","href":"/docs/5.1.0/contributing-guide/","docId":"contributing-guide/index","unlisted":false},{"collapsible":false,"label":"Local development","type":"category","items":[{"type":"link","label":"Visual Studio Code Dev Container Setup","href":"/docs/5.1.0/contributing-guide/local-development/devcontainer","docId":"contributing-guide/local-development/devcontainer","unlisted":false},{"type":"link","label":"Source code","href":"/docs/5.1.0/contributing-guide/local-development/source-code","docId":"contributing-guide/local-development/source-code","unlisted":false}],"collapsed":false,"href":"/docs/5.1.0/category/local-development"}]},"docs":{"contributing-guide/index":{"id":"contributing-guide/index","title":"Contributing Guide","description":"This guide will help you get started with Zealot! Thank you for taking an interest in contributing to Zealot. Before submitting your contribution, please make sure to take a moment and read through the following guidelines:","sidebar":"contributingGuide"},"contributing-guide/local-development/devcontainer":{"id":"contributing-guide/local-development/devcontainer","title":"Visual Studio Code Dev Container Setup","description":"The Visual Studio Code Dev Containers lets you use a Docker container as a full-featured development environment.","sidebar":"contributingGuide"},"contributing-guide/local-development/source-code":{"id":"contributing-guide/local-development/source-code","title":"Source code","description":"The following is a tutorial on local deployment development for different operating systems.","sidebar":"contributingGuide"},"developer-guide/api":{"id":"developer-guide/api","title":"APIs","description":"Use the Zealot APIs to view, upload, download the build of app or debug file.","sidebar":"developerGuide"},"developer-guide/api/apps":{"id":"developer-guide/api/apps","title":"App APIs","description":"Upload an app","sidebar":"developerGuide"},"developer-guide/api/debug_files":{"id":"developer-guide/api/debug_files","title":"Debug File APIs","description":"Upload debug file","sidebar":"developerGuide"},"developer-guide/fastlane":{"id":"developer-guide/fastlane","title":"Fastlane plugins","description":"Add Zealot plugin","sidebar":"developerGuide"},"developer-guide/fastlane/zealot":{"id":"developer-guide/fastlane/zealot","title":"Fastlane action: zealot","description":"Uploading iOS, Android and macOS app, it requires three params:","sidebar":"developerGuide"},"developer-guide/fastlane/zealot_debug_file":{"id":"developer-guide/fastlane/zealot_debug_file","title":"Fastlane action: zealot_debug_file","description":"Upload iOS dSYM or Android Proguard file(s) to Zealot","sidebar":"developerGuide"},"developer-guide/fastlane/zealot_sync_devices":{"id":"developer-guide/fastlane/zealot_sync_devices","title":"Fastlane action: zealot_sync_devices","description":"Zealot 4.5.0 built in Apple team manage which it use Apple API Key","sidebar":"developerGuide"},"developer-guide/fastlane/zealot_version_check":{"id":"developer-guide/fastlane/zealot_version_check","title":"Fastlane action: zealot_version_check","description":"Check given build exists or not on Zealot","sidebar":"developerGuide"},"developer-guide/index":{"id":"developer-guide/index","title":"Developer Guide","description":"Zealot offers a rich set of components for iOS, Android, and all aspects of the packaging process.","sidebar":"developerGuide"},"developer-guide/sdk/android":{"id":"developer-guide/sdk/android","title":"Zealot Android SDK","description":"The Android component provides a service to check for new versions and installations for Zealot, supporting both Kotlin and Java.","sidebar":"developerGuide"},"developer-guide/sdk/ios":{"id":"developer-guide/sdk/ios","title":"Zealot iOS SDK","description":"The iOS component provides a service to check for new versions and installations for Zealot,","sidebar":"developerGuide"},"self-hosted/configuration/environment-variables":{"id":"self-hosted/configuration/environment-variables","title":"Environment Variables","description":"The .env File","sidebar":"selfHosted"},"self-hosted/configuration/schedule-jobs":{"id":"self-hosted/configuration/schedule-jobs","title":"Schedule Jobs","description":"Clean old version builds","sidebar":"selfHosted"},"self-hosted/configuration/third-party-authentication":{"id":"self-hosted/configuration/third-party-authentication","title":"Third-party Authentication","description":"Zealot supports authorized logins using supported third-party services, which can be currently configured via the following environment variables or in the settings page of the admin panel.","sidebar":"selfHosted"},"self-hosted/deployment/architecture":{"id":"self-hosted/deployment/architecture","title":"Zealot Architecture","description":"Running Zealot requires the following set of services.","sidebar":"selfHosted"},"self-hosted/deployment/docker":{"id":"self-hosted/deployment/docker","title":"Deploy Zealot with Docker guide","description":"Strongly recommended to deploy Zealot using Docker,","sidebar":"selfHosted"},"self-hosted/deployment/docker/step-by-step":{"id":"self-hosted/deployment/docker/step-by-step","title":"Docker deployment guide","description":"This is a handy guide to deploying with Docker, as well as a breakdown of the on-premise deployment guide.","sidebar":"selfHosted"},"self-hosted/deployment/fly":{"id":"self-hosted/deployment/fly","title":"Deploy Zealot to Fly guide","description":"Zealot support use App Configuration (fly.toml) to deploy on fly.io.","sidebar":"selfHosted"},"self-hosted/deployment/kubernetes":{"id":"self-hosted/deployment/kubernetes","title":"Deploy Zealot with Kubernetes guide","description":"Zealot support deployments using Kubernetes, but only .yaml config files are available currently.","sidebar":"selfHosted"},"self-hosted/deployment/nomad":{"id":"self-hosted/deployment/nomad","title":"Deploy Zealot with Nomad guide","description":"Zealot support deployments using Nomad, it use HCL language to configure.","sidebar":"selfHosted"},"self-hosted/deployment/railway":{"id":"self-hosted/deployment/railway","title":"Deploy Zealot to Railway guide","description":"Zealot support use Dockfile to deploy on Railway.","sidebar":"selfHosted"},"self-hosted/deployment/render":{"id":"self-hosted/deployment/render","title":"Deploy Zealot to Render guide","description":"Zealot support a render blueprint named render.yaml to deploy on render.com.","sidebar":"selfHosted"},"self-hosted/deployment/requirements":{"id":"self-hosted/deployment/requirements","title":"Zealot Self Hosted Requirements","description":"This page incldues useful information on the requirements that are needed to install and run Zealot on your servers.","sidebar":"selfHosted"},"self-hosted/deployment/source-code":{"id":"self-hosted/deployment/source-code","title":"Source code","description":"It had been rewrite to Contributing Guide.","sidebar":"selfHosted"},"self-hosted/index":{"id":"self-hosted/index","title":"Self-hosted Installation Guide","description":"This guide will help you to install and setup a production ready Zealot.","sidebar":"selfHosted"},"self-hosted/reverse-proxies":{"id":"self-hosted/reverse-proxies","title":"Reverse Proxies","description":"To facilitate the unified management and distribution of SSL certificates, service expansion and access to off-the-shelf gateway services,","sidebar":"selfHosted"},"self-hosted/storage":{"id":"self-hosted/storage","title":"Data storages","description":"Here is a list of all the data storages required by the Zealot service,","sidebar":"selfHosted"},"user-guide/administrator/apple-team":{"id":"user-guide/administrator/apple-team","title":"Apple Team (Developer)","description":"One of the biggest challenges in distributing Ad-Hoc signed applications for iOS is the need to","sidebar":"userGuide"},"user-guide/administrator/backup":{"id":"user-guide/administrator/backup","title":"Backup Schedule","description":"Backup list","sidebar":"userGuide"},"user-guide/administrator/monitoring/background-jobs":{"id":"user-guide/administrator/monitoring/background-jobs","title":"Background Jobs","description":"{e.exports=JSON.parse('{"title":"Deployment","slug":"/category/deployment","permalink":"/docs/5.1.0/category/deployment","navigation":{"previous":{"title":"Self-hosted Installation Guide","permalink":"/docs/5.1.0/self-hosted/"},"next":{"title":"Architecture","permalink":"/docs/5.1.0/self-hosted/deployment/architecture"}}}')}}]); \ No newline at end of file diff --git a/assets/js/011af8e2.269cfae3.js b/assets/js/99707007.95bc76b5.js similarity index 86% rename from assets/js/011af8e2.269cfae3.js rename to assets/js/99707007.95bc76b5.js index 45e152d6a..8058f055f 100644 --- a/assets/js/011af8e2.269cfae3.js +++ b/assets/js/99707007.95bc76b5.js @@ -1 +1 @@ -"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[6142],{6777:(t,n,e)=>{e.r(n),e.d(n,{assets:()=>c,contentTitle:()=>m,default:()=>l,frontMatter:()=>a,metadata:()=>d,toc:()=>u});var i=e(5893),o=e(1151),s=e(9965),r=e(4996);const a={},m="System informations",d={id:"user-guide/administrator/monitoring/system-info",title:"System informations",description:"{e.d(n,{Z:()=>a,a:()=>r});var i=e(7294);const o={},s=i.createContext(o);function r(t){const n=i.useContext(s);return i.useMemo((function(){return"function"==typeof t?t(n):{...n,...t}}),[n,t])}function a(t){let n;return n=t.disableParentContext?"function"==typeof t.components?t.components(o):t.components||o:r(t.components),i.createElement(s.Provider,{value:n},t.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[3850],{5716:(t,n,e)=>{e.r(n),e.d(n,{assets:()=>c,contentTitle:()=>m,default:()=>l,frontMatter:()=>a,metadata:()=>d,toc:()=>u});var i=e(5893),o=e(1151),s=e(9965),r=e(4996);const a={},m="System informations",d={id:"user-guide/administrator/monitoring/system-info",title:"System informations",description:"{e.d(n,{Z:()=>a,a:()=>r});var i=e(7294);const o={},s=i.createContext(o);function r(t){const n=i.useContext(s);return i.useMemo((function(){return"function"==typeof t?t(n):{...n,...t}}),[n,t])}function a(t){let n;return n=t.disableParentContext?"function"==typeof t.components?t.components(o):t.components||o:r(t.components),i.createElement(s.Provider,{value:n},t.children)}}}]); \ No newline at end of file diff --git a/assets/js/9a9c7ed9.808312e2.js b/assets/js/9a9c7ed9.808312e2.js new file mode 100644 index 000000000..75c629492 --- /dev/null +++ b/assets/js/9a9c7ed9.808312e2.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[1884],{5388:(e,n,o)=>{o.r(n),o.d(n,{assets:()=>l,contentTitle:()=>s,default:()=>_,frontMatter:()=>r,metadata:()=>i,toc:()=>c});var t=o(5893),a=o(1151);const r={sidebar_label:"zealot_version_check"},s="Fastlane action: zealot_version_check",i={id:"developer-guide/fastlane/zealot_version_check",title:"Fastlane action: zealot_version_check",description:"Check given build exists or not on Zealot",source:"@site/versioned_docs/version-5.1.0/developer-guide/fastlane/zealot_version_check.md",sourceDirName:"developer-guide/fastlane",slug:"/developer-guide/fastlane/zealot_version_check",permalink:"/docs/5.1.0/developer-guide/fastlane/zealot_version_check",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.1.0/developer-guide/fastlane/zealot_version_check.md",tags:[],version:"5.1.0",frontMatter:{sidebar_label:"zealot_version_check"},sidebar:"developerGuide",previous:{title:"zealot",permalink:"/docs/5.1.0/developer-guide/fastlane/zealot"},next:{title:"zealot_debug_file",permalink:"/docs/5.1.0/developer-guide/fastlane/zealot_debug_file"}},l={},c=[{value:"Parameters",id:"parameters",level:2}];function d(e){const n={code:"code",h1:"h1",h2:"h2",p:"p",pre:"pre",...(0,a.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h1,{id:"fastlane-action-zealot_version_check",children:"Fastlane action: zealot_version_check"}),"\n",(0,t.jsx)(n.p,{children:"Check given build exists or not on Zealot"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-ruby",children:"zealot_version_check(\n endpoint: 'https://zealot.com',\n token: '...',\n bundle_id: 'com.example.app.name',\n release_version: '1.0.0',\n build_version: '1'\n)\n"})}),"\n",(0,t.jsx)(n.h2,{id:"parameters",children:"Parameters"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"+-----------------+---------------------------------+------------------------+---------+\n| zealot_version_check Options |\n+-----------------+---------------------------------+------------------------+---------+\n| Key | Description | Env Var | Default |\n+-----------------+---------------------------------+------------------------+---------+\n| endpoint | The endpoint of zealot | ZEALOT_ENDPOINT | |\n| token | The token of user | ZEALOT_TOKEN | |\n| channel_key | The key of app's channel | ZEALOT_CHANNEL_KEY | |\n| bundle_id | The bundle id(package name) of | ZEALOT_BUNDLE_ID | |\n| | app | | |\n| release_version | The release version of app | ZEALOT_RELEASE_VERSION | |\n| build_version | The build version of app | ZEALOT_BUILD_VERSION | |\n| git_commit | The latest git commit of app | ZEALOT_GIT_COMMIT | |\n| verify_ssl | Should verify SSL of zealot | ZEALOT_VERIFY_SSL | true |\n| | service | | |\n| fail_on_error | Should an error http request | ZEALOT_FAIL_ON_ERROR | false |\n| | cause a failure? (true/false) | | |\n+-----------------+---------------------------------+------------------------+---------+\n"})})]})}function _(e={}){const{wrapper:n}={...(0,a.a)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(d,{...e})}):d(e)}},1151:(e,n,o)=>{o.d(n,{Z:()=>i,a:()=>s});var t=o(7294);const a={},r=t.createContext(a);function s(e){const n=t.useContext(r);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:s(e.components),t.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/9ac08042.3008f2b2.js b/assets/js/9ac08042.3008f2b2.js new file mode 100644 index 000000000..1173fb866 --- /dev/null +++ b/assets/js/9ac08042.3008f2b2.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[860],{1399:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>a,contentTitle:()=>r,default:()=>u,frontMatter:()=>i,metadata:()=>d,toc:()=>l});var o=n(5893),s=n(1151);const i={},r="Dingtalk (Dingding)",d={id:"user-guide/webhooks/dingtalk",title:"Dingtalk (Dingding)",description:"\u9489\u9489 use Incoming Webhooks whose constructs",source:"@site/versioned_docs/version-5.2.0/user-guide/webhooks/dingtalk.md",sourceDirName:"user-guide/webhooks",slug:"/user-guide/webhooks/dingtalk",permalink:"/docs/user-guide/webhooks/dingtalk",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.2.0/user-guide/webhooks/dingtalk.md",tags:[],version:"5.2.0",frontMatter:{},sidebar:"userGuide",previous:{title:"Lark (Feishu)",permalink:"/docs/user-guide/webhooks/feishu"},next:{title:"Wecom (Wechat Work)",permalink:"/docs/user-guide/webhooks/wecom"}},a={},l=[{value:"Text format",id:"text-format",level:2},{value:"Markdown format",id:"markdown-format",level:2}];function c(e){const t={a:"a",blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",p:"p",pre:"pre",...(0,s.a)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.h1,{id:"dingtalk-dingding",children:"Dingtalk (Dingding)"}),"\n",(0,o.jsxs)(t.p,{children:[(0,o.jsx)(t.a,{href:"https://developers.dingtalk.com/document/robots/custom-robot-access#section-e4x-4y8-9k0",children:"\u9489\u9489"})," use Incoming Webhooks whose constructs\ntypically support both text and markdown, and can be configured as follows:"]}),"\n",(0,o.jsxs)(t.blockquote,{children:["\n",(0,o.jsx)(t.p,{children:"Due to system limitations try to use keyword or IP address whitelist mechanism to receive messages."}),"\n"]}),"\n",(0,o.jsx)(t.h2,{id:"text-format",children:"Text format"}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{className:"language-ruby",children:'{\n "msgtype": "text",\n "text": {\n "content": "#{@title}\\n\\n\u5b89\u88c5\u5730\u5740\uff1a#{@install_url}\\nUplaod at: #{@uploaded_at}"\n }\n}\n'})}),"\n",(0,o.jsx)(t.h2,{id:"markdown-format",children:"Markdown format"}),"\n",(0,o.jsx)(t.p,{children:"The title field is only displayed in the dialog list, the text field is displayed for the chat content entering the dialog."}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{className:"language-ruby",children:'{\n "msgtype": "markdown",\n "markdown": {\n "title": @title,\n "text": "## #{@title}\\nPlatform: #{@device_type}\\nUplaod at: #{@uploaded_at}\\nInstall QRcode:\\n![qrcode](#{@qrcode_url})"\n }\n}\n'})})]})}function u(e={}){const{wrapper:t}={...(0,s.a)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(c,{...e})}):c(e)}},1151:(e,t,n)=>{n.d(t,{Z:()=>d,a:()=>r});var o=n(7294);const s={},i=o.createContext(s);function r(e){const t=o.useContext(i);return o.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function d(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),o.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/9b58cf90.6a86838f.js b/assets/js/9b58cf90.6a86838f.js new file mode 100644 index 000000000..ef8834ce0 --- /dev/null +++ b/assets/js/9b58cf90.6a86838f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[5308],{9522:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>u,contentTitle:()=>i,default:()=>p,frontMatter:()=>s,metadata:()=>c,toc:()=>d});var a=t(5893),r=t(1151),l=t(4866),o=t(5162);const s={sidebar_label:"iOS"},i="Zealot iOS SDK",c={id:"developer-guide/sdk/ios",title:"Zealot iOS SDK",description:"The iOS component provides a service to check for new versions and installations for Zealot,",source:"@site/versioned_docs/version-5.1.0/developer-guide/sdk/ios.md",sourceDirName:"developer-guide/sdk",slug:"/developer-guide/sdk/ios",permalink:"/docs/5.1.0/developer-guide/sdk/ios",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.1.0/developer-guide/sdk/ios.md",tags:[],version:"5.1.0",frontMatter:{sidebar_label:"iOS"},sidebar:"developerGuide",previous:{title:"SDKs",permalink:"/docs/5.1.0/category/sdks"},next:{title:"Android",permalink:"/docs/5.1.0/developer-guide/sdk/android"}},u={},d=[{value:"Install",id:"install",level:2},{value:"Cocoapods",id:"cocoapods",level:3},{value:"Usages",id:"usages",level:2},{value:"Import header",id:"import-header",level:3},{value:"Configure",id:"configure",level:3}];function h(e){const n={code:"code",h1:"h1",h2:"h2",h3:"h3",li:"li",ol:"ol",p:"p",pre:"pre",...(0,r.a)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(n.h1,{id:"zealot-ios-sdk",children:"Zealot iOS SDK"}),"\n",(0,a.jsx)(n.p,{children:"The iOS component provides a service to check for new versions and installations for Zealot,\nsupporting Swift and Objective-C."}),"\n",(0,a.jsx)(n.h2,{id:"install",children:"Install"}),"\n",(0,a.jsx)(n.h3,{id:"cocoapods",children:"Cocoapods"}),"\n",(0,a.jsxs)(n.p,{children:["Adding below code into ",(0,a.jsx)(n.code,{children:"Podfile"}),":"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-ruby",children:"pod 'Zealot', :git => 'https://github.com/tryzealot/zealot-ios.git', :branch => 'master'\n"})}),"\n",(0,a.jsx)(n.p,{children:"Install it\uff1a"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"pod install\n"})}),"\n",(0,a.jsx)(n.h2,{id:"usages",children:"Usages"}),"\n",(0,a.jsx)(n.h3,{id:"import-header",children:"Import header"}),"\n",(0,a.jsxs)(n.ol,{children:["\n",(0,a.jsxs)(n.li,{children:["Add the code in your ",(0,a.jsx)(n.code,{children:"AppDelegate"}),"\uff1a"]}),"\n"]}),"\n","\n","\n",(0,a.jsxs)(l.Z,{groupId:"ios-zealot-sdk",children:[(0,a.jsx)(o.Z,{value:"Swift",children:(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-swift",children:"import Zealot\n"})})}),(0,a.jsx)(o.Z,{value:"Objective-C",children:(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-objectivec",children:"// Objective-C\n#import \n"})})})]}),"\n",(0,a.jsx)(n.h3,{id:"configure",children:"Configure"}),"\n",(0,a.jsxs)(n.ol,{start:"2",children:["\n",(0,a.jsxs)(n.li,{children:["Add the following code in ",(0,a.jsx)(n.code,{children:"application:didFinishLaunchingWithOptions:"})," method block\uff1a"]}),"\n"]}),"\n",(0,a.jsxs)(l.Z,{groupId:"ios-zealot-sdk",children:[(0,a.jsx)(o.Z,{value:"Swift",children:(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-swift",children:'// Single channel\nlet zealot = Zealot(endpoint: "http://zealot.com", channelKey: "...")\nzealot.checkVersion()\n\n// Multi-channel, such as beta, adhoc versions\nlet zealot = Zealot(endpoint: "http://zealot.com",\n channelKeys: [\n "beta": "xxxxxxx",\n "test": "yyyyyyy"],\n default_enviroment: "beta")\n\n// Active it\nzealot.checkVersion()\n'})})}),(0,a.jsx)(o.Z,{value:"Objective-C",children:(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-objectivec",children:'// Single channel\nZealot *zealot = [[Zealot alloc] initWithEndpoint:@"http://zealot.com"\n channelKey:@"..."];\n\n// Multi-channel, such as beta, adhoc versions\nZealot *zealot = [[Zealot alloc] initWithEndpoint:@"http://zealot.com"\n channelKeys:@{\n @"beta": @"xxxxxxx",\n @"gray": @"yyyyyyy"\n }\n default_enviroment:@"beta"];\n\n// Active it\n[zealot checkVersion];\n'})})})]})]})}function p(e={}){const{wrapper:n}={...(0,r.a)(),...e.components};return n?(0,a.jsx)(n,{...e,children:(0,a.jsx)(h,{...e})}):h(e)}},5162:(e,n,t)=>{t.d(n,{Z:()=>o});t(7294);var a=t(512);const r={tabItem:"tabItem_Ymn6"};var l=t(5893);function o(e){let{children:n,hidden:t,className:o}=e;return(0,l.jsx)("div",{role:"tabpanel",className:(0,a.Z)(r.tabItem,o),hidden:t,children:n})}},4866:(e,n,t)=>{t.d(n,{Z:()=>k});var a=t(7294),r=t(512),l=t(2466),o=t(6550),s=t(469),i=t(1980),c=t(7392),u=t(12);function d(e){return a.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,a.isValidElement)(e)&&function(e){const{props:n}=e;return!!n&&"object"==typeof n&&"value"in n}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function h(e){const{values:n,children:t}=e;return(0,a.useMemo)((()=>{const e=n??function(e){return d(e).map((e=>{let{props:{value:n,label:t,attributes:a,default:r}}=e;return{value:n,label:t,attributes:a,default:r}}))}(t);return function(e){const n=(0,c.l)(e,((e,n)=>e.value===n.value));if(n.length>0)throw new Error(`Docusaurus error: Duplicate values "${n.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[n,t])}function p(e){let{value:n,tabValues:t}=e;return t.some((e=>e.value===n))}function v(e){let{queryString:n=!1,groupId:t}=e;const r=(0,o.k6)(),l=function(e){let{queryString:n=!1,groupId:t}=e;if("string"==typeof n)return n;if(!1===n)return null;if(!0===n&&!t)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return t??null}({queryString:n,groupId:t});return[(0,i._X)(l),(0,a.useCallback)((e=>{if(!l)return;const n=new URLSearchParams(r.location.search);n.set(l,e),r.replace({...r.location,search:n.toString()})}),[l,r])]}function f(e){const{defaultValue:n,queryString:t=!1,groupId:r}=e,l=h(e),[o,i]=(0,a.useState)((()=>function(e){let{defaultValue:n,tabValues:t}=e;if(0===t.length)throw new Error("Docusaurus error: the component requires at least one children component");if(n){if(!p({value:n,tabValues:t}))throw new Error(`Docusaurus error: The has a defaultValue "${n}" but none of its children has the corresponding value. Available values are: ${t.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return n}const a=t.find((e=>e.default))??t[0];if(!a)throw new Error("Unexpected error: 0 tabValues");return a.value}({defaultValue:n,tabValues:l}))),[c,d]=v({queryString:t,groupId:r}),[f,m]=function(e){let{groupId:n}=e;const t=function(e){return e?`docusaurus.tab.${e}`:null}(n),[r,l]=(0,u.Nk)(t);return[r,(0,a.useCallback)((e=>{t&&l.set(e)}),[t,l])]}({groupId:r}),b=(()=>{const e=c??f;return p({value:e,tabValues:l})?e:null})();(0,s.Z)((()=>{b&&i(b)}),[b]);return{selectedValue:o,selectValue:(0,a.useCallback)((e=>{if(!p({value:e,tabValues:l}))throw new Error(`Can't select invalid tab value=${e}`);i(e),d(e),m(e)}),[d,m,l]),tabValues:l}}var m=t(2389);const b={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var g=t(5893);function x(e){let{className:n,block:t,selectedValue:a,selectValue:o,tabValues:s}=e;const i=[],{blockElementScrollPositionUntilNextRender:c}=(0,l.o5)(),u=e=>{const n=e.currentTarget,t=i.indexOf(n),r=s[t].value;r!==a&&(c(n),o(r))},d=e=>{let n=null;switch(e.key){case"Enter":u(e);break;case"ArrowRight":{const t=i.indexOf(e.currentTarget)+1;n=i[t]??i[0];break}case"ArrowLeft":{const t=i.indexOf(e.currentTarget)-1;n=i[t]??i[i.length-1];break}}n?.focus()};return(0,g.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.Z)("tabs",{"tabs--block":t},n),children:s.map((e=>{let{value:n,label:t,attributes:l}=e;return(0,g.jsx)("li",{role:"tab",tabIndex:a===n?0:-1,"aria-selected":a===n,ref:e=>i.push(e),onKeyDown:d,onClick:u,...l,className:(0,r.Z)("tabs__item",b.tabItem,l?.className,{"tabs__item--active":a===n}),children:t??n},n)}))})}function j(e){let{lazy:n,children:t,selectedValue:r}=e;const l=(Array.isArray(t)?t:[t]).filter(Boolean);if(n){const e=l.find((e=>e.props.value===r));return e?(0,a.cloneElement)(e,{className:"margin-top--md"}):null}return(0,g.jsx)("div",{className:"margin-top--md",children:l.map(((e,n)=>(0,a.cloneElement)(e,{key:n,hidden:e.props.value!==r})))})}function y(e){const n=f(e);return(0,g.jsxs)("div",{className:(0,r.Z)("tabs-container",b.tabList),children:[(0,g.jsx)(x,{...e,...n}),(0,g.jsx)(j,{...e,...n})]})}function k(e){const n=(0,m.Z)();return(0,g.jsx)(y,{...e,children:d(e.children)},String(n))}},1151:(e,n,t)=>{t.d(n,{Z:()=>s,a:()=>o});var a=t(7294);const r={},l=a.createContext(r);function o(e){const n=a.useContext(l);return a.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function s(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:o(e.components),a.createElement(l.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/a25253bf.a92fd249.js b/assets/js/a25253bf.a92fd249.js new file mode 100644 index 000000000..e17af2a23 --- /dev/null +++ b/assets/js/a25253bf.a92fd249.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[6047],{5884:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>d,contentTitle:()=>l,default:()=>p,frontMatter:()=>a,metadata:()=>c,toc:()=>u});var o=n(5893),r=n(1151),s=n(4866),i=n(5162);const a={},l="Visual Studio Code Dev Container Setup",c={id:"contributing-guide/local-development/devcontainer",title:"Visual Studio Code Dev Container Setup",description:"The Visual Studio Code Dev Containers lets you use a Docker container as a full-featured development environment.",source:"@site/versioned_docs/version-5.1.0/contributing-guide/local-development/devcontainer.md",sourceDirName:"contributing-guide/local-development",slug:"/contributing-guide/local-development/devcontainer",permalink:"/docs/5.1.0/contributing-guide/local-development/devcontainer",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.1.0/contributing-guide/local-development/devcontainer.md",tags:[],version:"5.1.0",frontMatter:{},sidebar:"contributingGuide",previous:{title:"Local development",permalink:"/docs/5.1.0/category/local-development"},next:{title:"Source code",permalink:"/docs/5.1.0/contributing-guide/local-development/source-code"}},d={},u=[{value:"System requirements",id:"system-requirements",level:2},{value:"Install Git",id:"install-git",level:3},{value:"Install Docker & docker-compose",id:"install-docker--docker-compose",level:3},{value:"Install Visual Studio Code",id:"install-visual-studio-code",level:3},{value:"Install Remote container extension",id:"install-remote-container-extension",level:3},{value:"Fetch Zealot Codesoace",id:"fetch-zealot-codesoace",level:2},{value:"Open the project in a container",id:"open-the-project-in-a-container",level:2},{value:"Start the project",id:"start-the-project",level:2},{value:"Open in browser",id:"open-in-browser",level:2}];function h(e){const t={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",img:"img",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,r.a)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.h1,{id:"visual-studio-code-dev-container-setup",children:"Visual Studio Code Dev Container Setup"}),"\n","\n","\n",(0,o.jsxs)(t.p,{children:[(0,o.jsx)(t.a,{href:"https://code.visualstudio.com/docs/devcontainers/containers",children:"The Visual Studio Code Dev Containers"})," lets you use a Docker container as a full-featured development environment."]}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.img,{src:"https://code.visualstudio.com/assets/docs/devcontainers/containers/architecture-containers.png",alt:"VSCode devcontainer"})}),"\n",(0,o.jsx)(t.h2,{id:"system-requirements",children:"System requirements"}),"\n",(0,o.jsx)(t.p,{children:"Before processing, make sure you have the lateset version of Git, Virsual Studio Code, Docker and docker-compose."}),"\n",(0,o.jsx)(t.h3,{id:"install-git",children:"Install Git"}),"\n",(0,o.jsxs)(t.p,{children:[(0,o.jsx)(t.a,{href:"https://github.com/git-guides/install-git",children:"Install"})," it from offical website."]}),"\n",(0,o.jsx)(t.h3,{id:"install-docker--docker-compose",children:"Install Docker & docker-compose"}),"\n",(0,o.jsxs)(t.ul,{children:["\n",(0,o.jsxs)(t.li,{children:["Windows: ",(0,o.jsx)(t.a,{href:"https://www.docker.com/products/docker-desktop",children:"Docker Desktop"})," 2.0+ on Windows 10 Pro/Enterprise. Windows 10 Home (2004+) requires Docker Desktop 2.3+ and the ",(0,o.jsx)(t.a,{href:"https://aka.ms/vscode-remote/containers/docker-wsl2",children:"WSL 2 back-end"}),". (Docker Toolbox is not supported. Windows container images are not supported.)"]}),"\n",(0,o.jsxs)(t.li,{children:["macOS: ",(0,o.jsx)(t.a,{href:"https://www.docker.com/products/docker-desktop",children:"Docker Desktop"})," 2.0+."]}),"\n",(0,o.jsxs)(t.li,{children:["Linux: ",(0,o.jsx)(t.a,{href:"https://docs.docker.com/install/#supported-platforms",children:"Docker CE/EE"})," 18.06+ and ",(0,o.jsx)(t.a,{href:"https://docs.docker.com/compose/install",children:"Docker Compose"})," 1.21+. (The Ubuntu snap package is not supported.)"]}),"\n"]}),"\n",(0,o.jsx)(t.h3,{id:"install-visual-studio-code",children:"Install Visual Studio Code"}),"\n",(0,o.jsx)(t.p,{children:"Visual Studio Code is a free code editor, which runs on the macOS, Linux, and Windows operating systems."}),"\n",(0,o.jsx)(t.p,{children:"Follow the platform-specific guides below:"}),"\n",(0,o.jsxs)(s.Z,{groupId:"install-vscode",children:[(0,o.jsx)(i.Z,{value:"MacOS",children:(0,o.jsxs)(t.ol,{children:["\n",(0,o.jsxs)(t.li,{children:["Download ",(0,o.jsx)(t.a,{href:"https://go.microsoft.com/fwlink/?LinkID=534106",children:"Visual Studio Code"})," for macOS."]}),"\n",(0,o.jsx)(t.li,{children:"Open the browser's download list and locate the downloaded app or archive."}),"\n",(0,o.jsx)(t.li,{children:"If archive, extract the archive contents. Use double-click for some browsers or select the 'magnifying glass' icon with Safari."}),"\n",(0,o.jsxs)(t.li,{children:["Drag ",(0,o.jsx)(t.code,{children:"Visual Studio Code.app"})," to the Applications folder, making it available in the macOS Launchpad."]}),"\n",(0,o.jsx)(t.li,{children:"Open VS Code from the Applications folder, by double clicking the icon."}),"\n"]})}),(0,o.jsx)(i.Z,{value:"Windows",children:(0,o.jsxs)(t.ol,{children:["\n",(0,o.jsxs)(t.li,{children:["Download the ",(0,o.jsx)(t.a,{href:"https://go.microsoft.com/fwlink/?LinkID=534107",children:"Visual Studio Code installer"})," for Windows."]}),"\n",(0,o.jsx)(t.li,{children:"Once it is downloaded, run the installer (VSCodeUserSetup-{version}.exe). This will only take a minute."}),"\n",(0,o.jsxs)(t.li,{children:["By default, VS Code is installed under ",(0,o.jsx)(t.code,{children:"C:\\Users\\\\{Username\\}\\AppData\\Local\\Programs\\Microsoft VS Code"}),"."]}),"\n"]})}),(0,o.jsx)(i.Z,{value:"Linux",children:(0,o.jsxs)(t.p,{children:["Following the ",(0,o.jsx)(t.a,{href:"https://code.visualstudio.com/docs/setup/linux",children:"offical Linux install guide"}),"."]})})]}),"\n",(0,o.jsx)(t.h3,{id:"install-remote-container-extension",children:"Install Remote container extension"}),"\n",(0,o.jsxs)(t.p,{children:["Install the ",(0,o.jsx)(t.a,{href:"https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers",children:"Remote Container extension"}),"."]}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.img,{alt:"VSCode extension",src:n(9763).Z+"",width:"1000",height:"477"})}),"\n",(0,o.jsx)(t.h2,{id:"fetch-zealot-codesoace",children:"Fetch Zealot Codesoace"}),"\n",(0,o.jsxs)(t.p,{children:["Zealot Codespace was in the ",(0,o.jsx)(t.code,{children:".devcontailer"})," folder of Zealot project, so you need clone the source code."]}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{className:"language-bash",children:"git clone https://github.com/tryzealot/zealot.git\n"})}),"\n",(0,o.jsx)(t.p,{children:"Explan these files in Codespace:"}),"\n",(0,o.jsxs)(t.table,{children:[(0,o.jsx)(t.thead,{children:(0,o.jsxs)(t.tr,{children:[(0,o.jsx)(t.th,{children:"File"}),(0,o.jsx)(t.th,{children:"Description"})]})}),(0,o.jsxs)(t.tbody,{children:[(0,o.jsxs)(t.tr,{children:[(0,o.jsx)(t.td,{children:(0,o.jsx)(t.code,{children:"devcontainer.json"})}),(0,o.jsx)(t.td,{children:"VSCode devcontainer config"})]}),(0,o.jsxs)(t.tr,{children:[(0,o.jsx)(t.td,{children:(0,o.jsx)(t.code,{children:"Dockerfile.base"})}),(0,o.jsx)(t.td,{children:"Base Dockerfile, auto push multi registry servers after changes"})]}),(0,o.jsxs)(t.tr,{children:[(0,o.jsx)(t.td,{children:(0,o.jsx)(t.code,{children:"Dockerfile"})}),(0,o.jsx)(t.td,{children:"Speed up build time, depends on above image."})]}),(0,o.jsxs)(t.tr,{children:[(0,o.jsx)(t.td,{children:(0,o.jsx)(t.code,{children:"docker-compose.yml"})}),(0,o.jsx)(t.td,{children:"All services of Zealot"})]}),(0,o.jsxs)(t.tr,{children:[(0,o.jsx)(t.td,{children:(0,o.jsx)(t.code,{children:"create-db-user.sql"})}),(0,o.jsx)(t.td,{children:"Create user and role for Zealot"})]})]})]}),"\n",(0,o.jsx)(t.h2,{id:"open-the-project-in-a-container",children:"Open the project in a container"}),"\n",(0,o.jsxs)(t.p,{children:["Start Visual Studio Code, run the ",(0,o.jsx)(t.code,{children:"Dev Containers: Open Folder in Container..."})," command in ",(0,o.jsx)(t.a,{href:"https://code.visualstudio.com/docs/getstarted/userinterface#_command-palette",children:"Command Palette"})," and select the Zealot folder."]}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.img,{alt:"VSCode Command Palette",src:n(8979).Z+"",width:"1752",height:"558"})}),"\n",(0,o.jsxs)(t.p,{children:["Click the ",(0,o.jsx)(t.strong,{children:"Starting Dev Container (show log)"})," to review zealot codespace build real time logging messages."]}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.img,{alt:"VSCode Command Palette",src:n(7351).Z+"",width:"1736",height:"846"})}),"\n",(0,o.jsx)(t.p,{children:"When finish the task, project files will load in file explorer and the zsh terminal. Access log outputs messages:"}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{children:"[7293 ms] Start: Run in container: cat /proc/344/environ\n[9836 ms] Port forwarding connection from 53148 > 43379 > 43379 in the container.\n[9836 ms] Start: Run in container: /home/vscode/.vscode-server/bin/5235c6bb189b60b01b1f49062f4ffa42384f8c91/node -e\n[9981 ms] Port forwarding 53148 > 43379 > 43379 stderr: Connection established\n[14988 ms] Port forwarding 53148 > 43379 > 43379 stderr: Remote close\n[14999 ms] Port forwarding 53148 > 43379 > 43379 terminated with code 0 and signal null.\n[29221 ms] Port forwarding 53148 > 43379 > 43379: Local close\n"})}),"\n",(0,o.jsx)(t.p,{children:"In host Docker containers:"}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.img,{alt:"Docker-Compose containers",src:n(2641).Z+"",width:"2180",height:"238"})}),"\n",(0,o.jsx)(t.h2,{id:"start-the-project",children:"Start the project"}),"\n",(0,o.jsxs)(t.p,{children:["Press ",(0,o.jsx)(t.code,{children:"Ctrl + `"})," to open the integrated terminal in Visual Studio Code if it isn't already open. then run ",(0,o.jsx)(t.code,{children:"bin/dev"})," to run all services."]}),"\n",(0,o.jsx)(t.p,{children:"Notice that the terminal prompt might look different than your normal terminal prompt."}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.img,{alt:"VSCode Zealot in Container",src:n(5771).Z+"",width:"3170",height:"1794"})}),"\n",(0,o.jsx)(t.h2,{id:"open-in-browser",children:"Open in browser"}),"\n",(0,o.jsxs)(t.p,{children:["A while after run ",(0,o.jsx)(t.code,{children:"bin/dev"}),", select ",(0,o.jsx)(t.strong,{children:"Ports"})," to see all forwarded ports, ",(0,o.jsx)(t.strong,{children:"Open in Browser"})," in quick way."]}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.img,{alt:"VSCode forwarded ports",src:n(5290).Z+"",width:"2646",height:"814"})})]})}function p(e={}){const{wrapper:t}={...(0,r.a)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(h,{...e})}):h(e)}},5162:(e,t,n)=>{n.d(t,{Z:()=>i});n(7294);var o=n(512);const r={tabItem:"tabItem_Ymn6"};var s=n(5893);function i(e){let{children:t,hidden:n,className:i}=e;return(0,s.jsx)("div",{role:"tabpanel",className:(0,o.Z)(r.tabItem,i),hidden:n,children:t})}},4866:(e,t,n)=>{n.d(t,{Z:()=>k});var o=n(7294),r=n(512),s=n(2466),i=n(6550),a=n(469),l=n(1980),c=n(7392),d=n(12);function u(e){return o.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,o.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function h(e){const{values:t,children:n}=e;return(0,o.useMemo)((()=>{const e=t??function(e){return u(e).map((e=>{let{props:{value:t,label:n,attributes:o,default:r}}=e;return{value:t,label:n,attributes:o,default:r}}))}(n);return function(e){const t=(0,c.l)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,n])}function p(e){let{value:t,tabValues:n}=e;return n.some((e=>e.value===t))}function m(e){let{queryString:t=!1,groupId:n}=e;const r=(0,i.k6)(),s=function(e){let{queryString:t=!1,groupId:n}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!n)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return n??null}({queryString:t,groupId:n});return[(0,l._X)(s),(0,o.useCallback)((e=>{if(!s)return;const t=new URLSearchParams(r.location.search);t.set(s,e),r.replace({...r.location,search:t.toString()})}),[s,r])]}function f(e){const{defaultValue:t,queryString:n=!1,groupId:r}=e,s=h(e),[i,l]=(0,o.useState)((()=>function(e){let{defaultValue:t,tabValues:n}=e;if(0===n.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!p({value:t,tabValues:n}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${n.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const o=n.find((e=>e.default))??n[0];if(!o)throw new Error("Unexpected error: 0 tabValues");return o.value}({defaultValue:t,tabValues:s}))),[c,u]=m({queryString:n,groupId:r}),[f,x]=function(e){let{groupId:t}=e;const n=function(e){return e?`docusaurus.tab.${e}`:null}(t),[r,s]=(0,d.Nk)(n);return[r,(0,o.useCallback)((e=>{n&&s.set(e)}),[n,s])]}({groupId:r}),v=(()=>{const e=c??f;return p({value:e,tabValues:s})?e:null})();(0,a.Z)((()=>{v&&l(v)}),[v]);return{selectedValue:i,selectValue:(0,o.useCallback)((e=>{if(!p({value:e,tabValues:s}))throw new Error(`Can't select invalid tab value=${e}`);l(e),u(e),x(e)}),[u,x,s]),tabValues:s}}var x=n(2389);const v={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var j=n(5893);function g(e){let{className:t,block:n,selectedValue:o,selectValue:i,tabValues:a}=e;const l=[],{blockElementScrollPositionUntilNextRender:c}=(0,s.o5)(),d=e=>{const t=e.currentTarget,n=l.indexOf(t),r=a[n].value;r!==o&&(c(t),i(r))},u=e=>{let t=null;switch(e.key){case"Enter":d(e);break;case"ArrowRight":{const n=l.indexOf(e.currentTarget)+1;t=l[n]??l[0];break}case"ArrowLeft":{const n=l.indexOf(e.currentTarget)-1;t=l[n]??l[l.length-1];break}}t?.focus()};return(0,j.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.Z)("tabs",{"tabs--block":n},t),children:a.map((e=>{let{value:t,label:n,attributes:s}=e;return(0,j.jsx)("li",{role:"tab",tabIndex:o===t?0:-1,"aria-selected":o===t,ref:e=>l.push(e),onKeyDown:u,onClick:d,...s,className:(0,r.Z)("tabs__item",v.tabItem,s?.className,{"tabs__item--active":o===t}),children:n??t},t)}))})}function b(e){let{lazy:t,children:n,selectedValue:r}=e;const s=(Array.isArray(n)?n:[n]).filter(Boolean);if(t){const e=s.find((e=>e.props.value===r));return e?(0,o.cloneElement)(e,{className:"margin-top--md"}):null}return(0,j.jsx)("div",{className:"margin-top--md",children:s.map(((e,t)=>(0,o.cloneElement)(e,{key:t,hidden:e.props.value!==r})))})}function w(e){const t=f(e);return(0,j.jsxs)("div",{className:(0,r.Z)("tabs-container",v.tabList),children:[(0,j.jsx)(g,{...e,...t}),(0,j.jsx)(b,{...e,...t})]})}function k(e){const t=(0,x.Z)();return(0,j.jsx)(w,{...e,children:u(e.children)},String(t))}},8979:(e,t,n)=>{n.d(t,{Z:()=>o});const o=n.p+"assets/images/vscode-command-palette-f37b4fd31c6cdc13244ea925b976f221.png"},2641:(e,t,n)=>{n.d(t,{Z:()=>o});const o=n.p+"assets/images/vscode-devcontainer-docker-containers-2a8afa4acc0d89438d14cd6539e432d8.png"},5290:(e,t,n)=>{n.d(t,{Z:()=>o});const o=n.p+"assets/images/vscode-devcontainer-forwarded-ports-4cf5d371a14b1201857d7c53b692b829.png"},7351:(e,t,n)=>{n.d(t,{Z:()=>o});const o=n.p+"assets/images/vscode-devcontainer-log-c904cb2312799a66dc6acc3ddde7e78f.png"},5771:(e,t,n)=>{n.d(t,{Z:()=>o});const o=n.p+"assets/images/vscode-devcontainer-zealot-592ecc98b9f83a304e22157fd1a31192.png"},9763:(e,t,n)=>{n.d(t,{Z:()=>o});const o=n.p+"assets/images/vscode-install-remote-containers-48120b06a2470bee04804c93fa4d881a.png"},1151:(e,t,n)=>{n.d(t,{Z:()=>a,a:()=>i});var o=n(7294);const r={},s=o.createContext(r);function i(e){const t=o.useContext(s);return o.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:i(e.components),o.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/a46eded5.0afc5667.js b/assets/js/a46eded5.0afc5667.js deleted file mode 100644 index 733427ac7..000000000 --- a/assets/js/a46eded5.0afc5667.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[6593],{803:(e,n,o)=>{o.r(n),o.d(n,{assets:()=>a,contentTitle:()=>r,default:()=>p,frontMatter:()=>l,metadata:()=>i,toc:()=>d});var t=o(5893),s=o(1151);const l={sidebar_label:"Step by step"},r="Docker deployment guide",i={id:"self-hosted/deployment/docker/step-by-step",title:"Docker deployment guide",description:"This is a handy guide to deploying with Docker, as well as a breakdown of the on-premise deployment guide.",source:"@site/versioned_docs/version-5.1.0/self-hosted/deployment/docker/step-by-step.md",sourceDirName:"self-hosted/deployment/docker",slug:"/self-hosted/deployment/docker/step-by-step",permalink:"/docs/self-hosted/deployment/docker/step-by-step",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.1.0/self-hosted/deployment/docker/step-by-step.md",tags:[],version:"5.1.0",frontMatter:{sidebar_label:"Step by step"},sidebar:"selfHosted",previous:{title:"On-premise (Docker)",permalink:"/docs/self-hosted/deployment/docker"},next:{title:"Kubernetes",permalink:"/docs/self-hosted/deployment/kubernetes"}},a={},d=[{value:"Versions",id:"versions",level:2},{value:"Registry",id:"registry",level:2},{value:"Step by Step",id:"step-by-step",level:2},{value:"Install Docker",id:"install-docker",level:3},{value:"Install Docker-Compose",id:"install-docker-compose",level:3},{value:"Configure .env file",id:"configure-env-file",level:3},{value:"Configure site domain",id:"configure-site-domain",level:3},{value:"Configure SSL certificate",id:"configure-ssl-certificate",level:3},{value:"Generate docker-compose.yml",id:"generate-docker-composeyml",level:3},{value:"Create docker volumes for persistent storage",id:"create-docker-volumes-for-persistent-storage",level:3},{value:"Pull images",id:"pull-images",level:3},{value:"Setup database data",id:"setup-database-data",level:3},{value:"Launch docker-compose",id:"launch-docker-compose",level:3},{value:"Advanced",id:"advanced",level:2},{value:"Custom volumes",id:"custom-volumes",level:3},{value:"1. Create custom docker volume",id:"1-create-custom-docker-volume",level:4},{value:"2. Change volumes part of docker-compose file",id:"2-change-volumes-part-of-docker-compose-file",level:4},{value:"Complete example",id:"complete-example",level:2}];function c(e){const n={a:"a",blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",li:"li",p:"p",pre:"pre",ul:"ul",...(0,s.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h1,{id:"docker-deployment-guide",children:"Docker deployment guide"}),"\n",(0,t.jsxs)(n.p,{children:["This is a handy guide to deploying with Docker, as well as a breakdown of the ",(0,t.jsx)(n.a,{href:"/docs/self-hosted/deployment/docker",children:"on-premise deployment guide"}),"."]}),"\n",(0,t.jsx)(n.h2,{id:"versions",children:"Versions"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["Stable version - 5.1.0/latest - ",(0,t.jsx)(n.code,{children:"ghcr.io/tryzealot/zealot:latest"})]}),"\n",(0,t.jsxs)(n.li,{children:["Nightly version - develop - ",(0,t.jsx)(n.code,{children:"ghcr.io/tryzealot/zealot:nightly"})," - Based on branch ",(0,t.jsx)(n.code,{children:"develop"})," builds per commit."]}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"registry",children:"Registry"}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsxs)(n.p,{children:["Docker hub ",(0,t.jsx)(n.a,{href:"https://web.docker.com/rs/790-SSB-375/images/privatereposfaq.pdf",children:"retrieve free team organizations"}),", zealot image stopped to push new version."]}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["Github Container Registry: ",(0,t.jsx)(n.a,{href:"https://github.com/tryzealot/zealot/pkgs/container/zealot",children:"https://github.com/tryzealot/zealot/pkgs/container/zealot"})]}),"\n",(0,t.jsx)(n.h2,{id:"step-by-step",children:"Step by Step"}),"\n",(0,t.jsx)(n.h3,{id:"install-docker",children:"Install Docker"}),"\n",(0,t.jsxs)(n.p,{children:["Follows ",(0,t.jsx)(n.a,{href:"https://get.docker.com/",children:"official tutorial"})," to install docker."]}),"\n",(0,t.jsx)(n.h3,{id:"install-docker-compose",children:"Install Docker-Compose"}),"\n",(0,t.jsxs)(n.p,{children:["Follows ",(0,t.jsx)(n.a,{href:"https://docs.docker.com/compose/install/",children:"official tutorial"})," to install docker-compose."]}),"\n",(0,t.jsx)(n.h3,{id:"configure-env-file",children:"Configure .env file"}),"\n",(0,t.jsxs)(n.p,{children:["Download a sample ",(0,t.jsx)(n.a,{href:"https://github.com/tryzealot/zealot-docker/blob/master/config.env",children:"config.env"})," file and customize it on your own."]}),"\n",(0,t.jsx)(n.h3,{id:"configure-site-domain",children:"Configure site domain"}),"\n",(0,t.jsx)(n.p,{children:"The secondary verification will remind again if it is not configured"}),"\n",(0,t.jsx)(n.h3,{id:"configure-ssl-certificate",children:"Configure SSL certificate"}),"\n",(0,t.jsx)(n.p,{children:"Provides three ways to do this, even if the last one generates the https protocol header:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"Using Let's Encrypt SSL"}),"\n",(0,t.jsx)(n.li,{children:"Using Self-signed SSL"}),"\n",(0,t.jsx)(n.li,{children:"Using non-SSL with Zealot service (needs gateway or reverse proxy to manage SSL\uff09"}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"generate-docker-composeyml",children:"Generate docker-compose.yml"}),"\n",(0,t.jsx)(n.p,{children:"The configuration file will generate at least three services, using the first two certificates will add an additional service."}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"zealot-zealot"}),": Use reverse-generation gateway services to deliver core Web and API services"]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"zealot-postgres"}),": Database service"]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"zealot-redis"}),": Cache service"]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"zealot-web"}),": Provides a reverse proxy gateway service for (services and certificates), optional."]}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"create-docker-volumes-for-persistent-storage",children:"Create docker volumes for persistent storage"}),"\n",(0,t.jsx)(n.p,{children:"Persistent storage Data:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"zealot-uploads"}),": Uploaded app file with extracted icon, uploaded debugging files."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"zealot-backup"}),": backup files."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"zealot-postgres"}),": Core database data."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"zealot-redis"}),": Hot cache and background jobs data."]}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"pull-images",children:"Pull images"}),"\n",(0,t.jsx)(n.p,{children:"The first time you use it, you will initialize the database,\nload the sample application data and set up the administrator account,\nwhich is required for subsequent zealot updates."}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"docker-compose pull\n"})}),"\n",(0,t.jsx)(n.h3,{id:"setup-database-data",children:"Setup database data"}),"\n",(0,t.jsx)(n.p,{children:"The first time you use it, you will initialize the database, load the sample application data\nand set up the administrator account, which is required for subsequent zealot updates."}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"docker-compose run --rm zealot run_upgrade\n"})}),"\n",(0,t.jsx)(n.h3,{id:"launch-docker-compose",children:"Launch docker-compose"}),"\n",(0,t.jsx)(n.p,{children:"Manual execution is required to run the service for security periods and user-defined operations:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"docker-compose up -d\n"})}),"\n",(0,t.jsx)(n.h2,{id:"advanced",children:"Advanced"}),"\n",(0,t.jsx)(n.h3,{id:"custom-volumes",children:"Custom volumes"}),"\n",(0,t.jsx)(n.p,{children:"You have two t"}),"\n",(0,t.jsxs)(n.p,{children:["There are two ways to customize the path: (Assuming that the custom path is ",(0,t.jsx)(n.code,{children:"/data/zealot"}),")"]}),"\n",(0,t.jsx)(n.h4,{id:"1-create-custom-docker-volume",children:"1. Create custom docker volume"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-sh",children:"docker volume create --name zealot-data \\\n --opt type=none \\\n --opt o=bind \\\n --opt device=/data/zealot/zealot-data\n\ndocker volume create --name zealot-redis \\\n --opt type=none \\\n --opt o=bind \\\n --opt device=/data/zealot/redis\n\ndocker volume create --name zealot-postgres \\\n --opt type=none \\\n --opt o=bind \\\n --opt device=/data/zealot/postgres\n"})}),"\n",(0,t.jsx)(n.h4,{id:"2-change-volumes-part-of-docker-compose-file",children:"2. Change volumes part of docker-compose file"}),"\n",(0,t.jsxs)(n.p,{children:["Open ",(0,t.jsx)(n.code,{children:"docker-compose.yml"})," file and find ",(0,t.jsx)(n.code,{children:"volumes:"}),":"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",children:"volumes:\n zealot-data:\n driver: local\n driver_opts:\n o: bind\n type: none\n device: /data/zealot/data\n zealot-redis:\n driver: local\n driver_opts:\n o: bind\n type: none\n device: /data/zealot/redis\n\n zealot-postgres:\n driver: local\n driver_opts:\n o: bind\n type: none\n device: /data/zealot/postgres\n"})}),"\n",(0,t.jsx)(n.h2,{id:"complete-example",children:"Complete example"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",children:'version: "3.8"\n\nx-restart-policy: &restart_policy\n restart: unless-stopped\n\nx-defaults: &defaults\n <<: *restart_policy\n image: ghcr.io/tryzealot/zealot:nightly\n depends_on:\n - redis\n - postgres\n env_file: .env\n volumes:\n - zealot-uploads:/app/public/uploads\n - zealot-backup:/app/public/backup\n - ./log:/app/log # Optional: persisting log files.\n healthcheck:\n test: ["CMD-SHELL", "wget -q --spider --proxy=off localhost/health || exit 1"]\n\nservices:\n redis:\n <<: *restart_policy\n image: redis:7-alpine\n command: redis-server\n volumes:\n - zealot-redis:/data\n healthcheck:\n test: ["CMD", "redis-cli", "ping"]\n postgres:\n <<: *restart_policy\n image: postgres:14-alpine\n volumes:\n - zealot-postgres:/var/lib/postgresql/data\n environment:\n POSTGRES_PASSWORD: ze@l0t\n healthcheck:\n test: ["CMD", "pg_isready", "-U", "postgres"]\n zealot:\n <<: *defaults\n # Port mapping can be enabled without the need for reverse proxy,\n # mutually exclusive with the web reverse proxy service below.\n ports:\n - "80:80"\n # Optional: Use a reverse proxy to host SSL certificates and services.\n web:\n image: caddy:2-alpine\n ports:\n - "80:80"\n - "443:443"\n volumes:\n - ./caddy/etc/caddy/Caddyfile:/etc/caddy/Caddyfile:ro\n - ./caddy/etc/caddy/certs:/etc/caddy/certs:ro\n env_file: .env\n environment:\n ACME_AGREE: "true"\n\n# There are three methods of persistence:\nvolumes:\n # 1. docker compose inside volumes\n - zealot-uploads\n - zealot-backup\n - zealot-redis\n - zealot-postgres\n\n # 2. docker compose external volumes\n zealot-uploads:\n external: true\n zealot-backup:\n external: true\n zealot-redis:\n external: true\n zealot-postgres:\n external: true\n\n # 3. mount local path\n zealot-uploads:\n driver: local\n driver_opts:\n o: bind\n type: none\n device: /tmp/zealot/uploads\n zealot-backup:\n driver: local\n driver_opts:\n o: bind\n type: none\n device: /tmp/zealot/backup\n zealot-redis:\n driver: local\n driver_opts:\n o: bind\n type: none\n device: /tmp/redis\n zealot-postgres:\n driver: local\n driver_opts:\n o: bind\n type: none\n device: /tmp/postgres\n'})})]})}function p(e={}){const{wrapper:n}={...(0,s.a)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(c,{...e})}):c(e)}},1151:(e,n,o)=>{o.d(n,{Z:()=>i,a:()=>r});var t=o(7294);const s={},l=t.createContext(s);function r(e){const n=t.useContext(l);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),t.createElement(l.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/a46eded5.c76feb0d.js b/assets/js/a46eded5.c76feb0d.js new file mode 100644 index 000000000..6db91d0ba --- /dev/null +++ b/assets/js/a46eded5.c76feb0d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[6593],{803:(e,n,o)=>{o.r(n),o.d(n,{assets:()=>a,contentTitle:()=>r,default:()=>p,frontMatter:()=>l,metadata:()=>i,toc:()=>d});var t=o(5893),s=o(1151);const l={sidebar_label:"Step by step"},r="Docker deployment guide",i={id:"self-hosted/deployment/docker/step-by-step",title:"Docker deployment guide",description:"This is a handy guide to deploying with Docker, as well as a breakdown of the on-premise deployment guide.",source:"@site/versioned_docs/version-5.1.0/self-hosted/deployment/docker/step-by-step.md",sourceDirName:"self-hosted/deployment/docker",slug:"/self-hosted/deployment/docker/step-by-step",permalink:"/docs/5.1.0/self-hosted/deployment/docker/step-by-step",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.1.0/self-hosted/deployment/docker/step-by-step.md",tags:[],version:"5.1.0",frontMatter:{sidebar_label:"Step by step"},sidebar:"selfHosted",previous:{title:"On-premise (Docker)",permalink:"/docs/5.1.0/self-hosted/deployment/docker"},next:{title:"Kubernetes",permalink:"/docs/5.1.0/self-hosted/deployment/kubernetes"}},a={},d=[{value:"Versions",id:"versions",level:2},{value:"Registry",id:"registry",level:2},{value:"Step by Step",id:"step-by-step",level:2},{value:"Install Docker",id:"install-docker",level:3},{value:"Install Docker-Compose",id:"install-docker-compose",level:3},{value:"Configure .env file",id:"configure-env-file",level:3},{value:"Configure site domain",id:"configure-site-domain",level:3},{value:"Configure SSL certificate",id:"configure-ssl-certificate",level:3},{value:"Generate docker-compose.yml",id:"generate-docker-composeyml",level:3},{value:"Create docker volumes for persistent storage",id:"create-docker-volumes-for-persistent-storage",level:3},{value:"Pull images",id:"pull-images",level:3},{value:"Setup database data",id:"setup-database-data",level:3},{value:"Launch docker-compose",id:"launch-docker-compose",level:3},{value:"Advanced",id:"advanced",level:2},{value:"Custom volumes",id:"custom-volumes",level:3},{value:"1. Create custom docker volume",id:"1-create-custom-docker-volume",level:4},{value:"2. Change volumes part of docker-compose file",id:"2-change-volumes-part-of-docker-compose-file",level:4},{value:"Complete example",id:"complete-example",level:2}];function c(e){const n={a:"a",blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",li:"li",p:"p",pre:"pre",ul:"ul",...(0,s.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h1,{id:"docker-deployment-guide",children:"Docker deployment guide"}),"\n",(0,t.jsxs)(n.p,{children:["This is a handy guide to deploying with Docker, as well as a breakdown of the ",(0,t.jsx)(n.a,{href:"/docs/self-hosted/deployment/docker",children:"on-premise deployment guide"}),"."]}),"\n",(0,t.jsx)(n.h2,{id:"versions",children:"Versions"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["Stable version - 5.1.0/latest - ",(0,t.jsx)(n.code,{children:"ghcr.io/tryzealot/zealot:latest"})]}),"\n",(0,t.jsxs)(n.li,{children:["Nightly version - develop - ",(0,t.jsx)(n.code,{children:"ghcr.io/tryzealot/zealot:nightly"})," - Based on branch ",(0,t.jsx)(n.code,{children:"develop"})," builds per commit."]}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"registry",children:"Registry"}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsxs)(n.p,{children:["Docker hub ",(0,t.jsx)(n.a,{href:"https://web.docker.com/rs/790-SSB-375/images/privatereposfaq.pdf",children:"retrieve free team organizations"}),", zealot image stopped to push new version."]}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["Github Container Registry: ",(0,t.jsx)(n.a,{href:"https://github.com/tryzealot/zealot/pkgs/container/zealot",children:"https://github.com/tryzealot/zealot/pkgs/container/zealot"})]}),"\n",(0,t.jsx)(n.h2,{id:"step-by-step",children:"Step by Step"}),"\n",(0,t.jsx)(n.h3,{id:"install-docker",children:"Install Docker"}),"\n",(0,t.jsxs)(n.p,{children:["Follows ",(0,t.jsx)(n.a,{href:"https://get.docker.com/",children:"official tutorial"})," to install docker."]}),"\n",(0,t.jsx)(n.h3,{id:"install-docker-compose",children:"Install Docker-Compose"}),"\n",(0,t.jsxs)(n.p,{children:["Follows ",(0,t.jsx)(n.a,{href:"https://docs.docker.com/compose/install/",children:"official tutorial"})," to install docker-compose."]}),"\n",(0,t.jsx)(n.h3,{id:"configure-env-file",children:"Configure .env file"}),"\n",(0,t.jsxs)(n.p,{children:["Download a sample ",(0,t.jsx)(n.a,{href:"https://github.com/tryzealot/zealot-docker/blob/master/config.env",children:"config.env"})," file and customize it on your own."]}),"\n",(0,t.jsx)(n.h3,{id:"configure-site-domain",children:"Configure site domain"}),"\n",(0,t.jsx)(n.p,{children:"The secondary verification will remind again if it is not configured"}),"\n",(0,t.jsx)(n.h3,{id:"configure-ssl-certificate",children:"Configure SSL certificate"}),"\n",(0,t.jsx)(n.p,{children:"Provides three ways to do this, even if the last one generates the https protocol header:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"Using Let's Encrypt SSL"}),"\n",(0,t.jsx)(n.li,{children:"Using Self-signed SSL"}),"\n",(0,t.jsx)(n.li,{children:"Using non-SSL with Zealot service (needs gateway or reverse proxy to manage SSL\uff09"}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"generate-docker-composeyml",children:"Generate docker-compose.yml"}),"\n",(0,t.jsx)(n.p,{children:"The configuration file will generate at least three services, using the first two certificates will add an additional service."}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"zealot-zealot"}),": Use reverse-generation gateway services to deliver core Web and API services"]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"zealot-postgres"}),": Database service"]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"zealot-redis"}),": Cache service"]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"zealot-web"}),": Provides a reverse proxy gateway service for (services and certificates), optional."]}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"create-docker-volumes-for-persistent-storage",children:"Create docker volumes for persistent storage"}),"\n",(0,t.jsx)(n.p,{children:"Persistent storage Data:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"zealot-uploads"}),": Uploaded app file with extracted icon, uploaded debugging files."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"zealot-backup"}),": backup files."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"zealot-postgres"}),": Core database data."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"zealot-redis"}),": Hot cache and background jobs data."]}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"pull-images",children:"Pull images"}),"\n",(0,t.jsx)(n.p,{children:"The first time you use it, you will initialize the database,\nload the sample application data and set up the administrator account,\nwhich is required for subsequent zealot updates."}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"docker-compose pull\n"})}),"\n",(0,t.jsx)(n.h3,{id:"setup-database-data",children:"Setup database data"}),"\n",(0,t.jsx)(n.p,{children:"The first time you use it, you will initialize the database, load the sample application data\nand set up the administrator account, which is required for subsequent zealot updates."}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"docker-compose run --rm zealot run_upgrade\n"})}),"\n",(0,t.jsx)(n.h3,{id:"launch-docker-compose",children:"Launch docker-compose"}),"\n",(0,t.jsx)(n.p,{children:"Manual execution is required to run the service for security periods and user-defined operations:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"docker-compose up -d\n"})}),"\n",(0,t.jsx)(n.h2,{id:"advanced",children:"Advanced"}),"\n",(0,t.jsx)(n.h3,{id:"custom-volumes",children:"Custom volumes"}),"\n",(0,t.jsx)(n.p,{children:"You have two t"}),"\n",(0,t.jsxs)(n.p,{children:["There are two ways to customize the path: (Assuming that the custom path is ",(0,t.jsx)(n.code,{children:"/data/zealot"}),")"]}),"\n",(0,t.jsx)(n.h4,{id:"1-create-custom-docker-volume",children:"1. Create custom docker volume"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-sh",children:"docker volume create --name zealot-data \\\n --opt type=none \\\n --opt o=bind \\\n --opt device=/data/zealot/zealot-data\n\ndocker volume create --name zealot-redis \\\n --opt type=none \\\n --opt o=bind \\\n --opt device=/data/zealot/redis\n\ndocker volume create --name zealot-postgres \\\n --opt type=none \\\n --opt o=bind \\\n --opt device=/data/zealot/postgres\n"})}),"\n",(0,t.jsx)(n.h4,{id:"2-change-volumes-part-of-docker-compose-file",children:"2. Change volumes part of docker-compose file"}),"\n",(0,t.jsxs)(n.p,{children:["Open ",(0,t.jsx)(n.code,{children:"docker-compose.yml"})," file and find ",(0,t.jsx)(n.code,{children:"volumes:"}),":"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",children:"volumes:\n zealot-data:\n driver: local\n driver_opts:\n o: bind\n type: none\n device: /data/zealot/data\n zealot-redis:\n driver: local\n driver_opts:\n o: bind\n type: none\n device: /data/zealot/redis\n\n zealot-postgres:\n driver: local\n driver_opts:\n o: bind\n type: none\n device: /data/zealot/postgres\n"})}),"\n",(0,t.jsx)(n.h2,{id:"complete-example",children:"Complete example"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",children:'version: "3.8"\n\nx-restart-policy: &restart_policy\n restart: unless-stopped\n\nx-defaults: &defaults\n <<: *restart_policy\n image: ghcr.io/tryzealot/zealot:nightly\n depends_on:\n - redis\n - postgres\n env_file: .env\n volumes:\n - zealot-uploads:/app/public/uploads\n - zealot-backup:/app/public/backup\n - ./log:/app/log # Optional: persisting log files.\n healthcheck:\n test: ["CMD-SHELL", "wget -q --spider --proxy=off localhost/health || exit 1"]\n\nservices:\n redis:\n <<: *restart_policy\n image: redis:7-alpine\n command: redis-server\n volumes:\n - zealot-redis:/data\n healthcheck:\n test: ["CMD", "redis-cli", "ping"]\n postgres:\n <<: *restart_policy\n image: postgres:14-alpine\n volumes:\n - zealot-postgres:/var/lib/postgresql/data\n environment:\n POSTGRES_PASSWORD: ze@l0t\n healthcheck:\n test: ["CMD", "pg_isready", "-U", "postgres"]\n zealot:\n <<: *defaults\n # Port mapping can be enabled without the need for reverse proxy,\n # mutually exclusive with the web reverse proxy service below.\n ports:\n - "80:80"\n # Optional: Use a reverse proxy to host SSL certificates and services.\n web:\n image: caddy:2-alpine\n ports:\n - "80:80"\n - "443:443"\n volumes:\n - ./caddy/etc/caddy/Caddyfile:/etc/caddy/Caddyfile:ro\n - ./caddy/etc/caddy/certs:/etc/caddy/certs:ro\n env_file: .env\n environment:\n ACME_AGREE: "true"\n\n# There are three methods of persistence:\nvolumes:\n # 1. docker compose inside volumes\n - zealot-uploads\n - zealot-backup\n - zealot-redis\n - zealot-postgres\n\n # 2. docker compose external volumes\n zealot-uploads:\n external: true\n zealot-backup:\n external: true\n zealot-redis:\n external: true\n zealot-postgres:\n external: true\n\n # 3. mount local path\n zealot-uploads:\n driver: local\n driver_opts:\n o: bind\n type: none\n device: /tmp/zealot/uploads\n zealot-backup:\n driver: local\n driver_opts:\n o: bind\n type: none\n device: /tmp/zealot/backup\n zealot-redis:\n driver: local\n driver_opts:\n o: bind\n type: none\n device: /tmp/redis\n zealot-postgres:\n driver: local\n driver_opts:\n o: bind\n type: none\n device: /tmp/postgres\n'})})]})}function p(e={}){const{wrapper:n}={...(0,s.a)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(c,{...e})}):c(e)}},1151:(e,n,o)=>{o.d(n,{Z:()=>i,a:()=>r});var t=o(7294);const s={},l=t.createContext(s);function r(e){const n=t.useContext(l);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),t.createElement(l.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/a6756b1f.09c6d3c8.js b/assets/js/a6756b1f.09c6d3c8.js new file mode 100644 index 000000000..67c924f0f --- /dev/null +++ b/assets/js/a6756b1f.09c6d3c8.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[6092],{899:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>o,contentTitle:()=>u,default:()=>k,frontMatter:()=>c,metadata:()=>d,toc:()=>l});var i=a(5893),s=a(1151),n=a(9965),r=a(4996);const c={sidebar_label:"Backup"},u="Backup Schedule",d={id:"user-guide/administrator/backup",title:"Backup Schedule",description:"Backup list",source:"@site/versioned_docs/version-5.1.0/user-guide/administrator/backup.mdx",sourceDirName:"user-guide/administrator",slug:"/user-guide/administrator/backup",permalink:"/docs/5.1.0/user-guide/administrator/backup",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.1.0/user-guide/administrator/backup.mdx",tags:[],version:"5.1.0",frontMatter:{sidebar_label:"Backup"},sidebar:"userGuide",previous:{title:"Permissions",permalink:"/docs/5.1.0/user-guide/administrator/permissions"},next:{title:"Settings",permalink:"/docs/5.1.0/user-guide/administrator/settings"}},o={},l=[{value:"Backup list",id:"backup-list",level:2},{value:"Backup detail",id:"backup-detail",level:2},{value:"Create a backup",id:"create-a-backup",level:2}];function p(e){const t={h1:"h1",h2:"h2",...(0,s.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.h1,{id:"backup-schedule",children:"Backup Schedule"}),"\n","\n","\n",(0,i.jsx)(t.h2,{id:"backup-list",children:"Backup list"}),"\n",(0,i.jsx)(n.Z,{alt:"",sources:{light:(0,r.Z)("/img/5.0.0/backups-light.png"),dark:(0,r.Z)("/img/5.0.0/backups-dark.png")}}),"\n",(0,i.jsx)(t.h2,{id:"backup-detail",children:"Backup detail"}),"\n",(0,i.jsx)(n.Z,{alt:"",sources:{light:(0,r.Z)("/img/5.0.0/backup-detail-light.png"),dark:(0,r.Z)("/img/5.0.0/backup-detail-dark.png")}}),"\n",(0,i.jsx)(t.h2,{id:"create-a-backup",children:"Create a backup"}),"\n",(0,i.jsx)(n.Z,{alt:"",sources:{light:(0,r.Z)("/img/5.0.0/backups-create-light.png"),dark:(0,r.Z)("/img/5.0.0/backups-create-dark.png")}})]})}function k(e={}){const{wrapper:t}={...(0,s.a)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(p,{...e})}):p(e)}},1151:(e,t,a)=>{a.d(t,{Z:()=>c,a:()=>r});var i=a(7294);const s={},n=i.createContext(s);function r(e){const t=i.useContext(n);return i.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),i.createElement(n.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/a6756b1f.8bb9521a.js b/assets/js/a6756b1f.8bb9521a.js deleted file mode 100644 index 75f901ddc..000000000 --- a/assets/js/a6756b1f.8bb9521a.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[6092],{899:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>o,contentTitle:()=>u,default:()=>k,frontMatter:()=>c,metadata:()=>d,toc:()=>l});var i=a(5893),s=a(1151),n=a(9965),r=a(4996);const c={sidebar_label:"Backup"},u="Backup Schedule",d={id:"user-guide/administrator/backup",title:"Backup Schedule",description:"Backup list",source:"@site/versioned_docs/version-5.1.0/user-guide/administrator/backup.mdx",sourceDirName:"user-guide/administrator",slug:"/user-guide/administrator/backup",permalink:"/docs/user-guide/administrator/backup",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.1.0/user-guide/administrator/backup.mdx",tags:[],version:"5.1.0",frontMatter:{sidebar_label:"Backup"},sidebar:"userGuide",previous:{title:"Permissions",permalink:"/docs/user-guide/administrator/permissions"},next:{title:"Settings",permalink:"/docs/user-guide/administrator/settings"}},o={},l=[{value:"Backup list",id:"backup-list",level:2},{value:"Backup detail",id:"backup-detail",level:2},{value:"Create a backup",id:"create-a-backup",level:2}];function p(e){const t={h1:"h1",h2:"h2",...(0,s.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.h1,{id:"backup-schedule",children:"Backup Schedule"}),"\n","\n","\n",(0,i.jsx)(t.h2,{id:"backup-list",children:"Backup list"}),"\n",(0,i.jsx)(n.Z,{alt:"",sources:{light:(0,r.Z)("/img/5.0.0/backups-light.png"),dark:(0,r.Z)("/img/5.0.0/backups-dark.png")}}),"\n",(0,i.jsx)(t.h2,{id:"backup-detail",children:"Backup detail"}),"\n",(0,i.jsx)(n.Z,{alt:"",sources:{light:(0,r.Z)("/img/5.0.0/backup-detail-light.png"),dark:(0,r.Z)("/img/5.0.0/backup-detail-dark.png")}}),"\n",(0,i.jsx)(t.h2,{id:"create-a-backup",children:"Create a backup"}),"\n",(0,i.jsx)(n.Z,{alt:"",sources:{light:(0,r.Z)("/img/5.0.0/backups-create-light.png"),dark:(0,r.Z)("/img/5.0.0/backups-create-dark.png")}})]})}function k(e={}){const{wrapper:t}={...(0,s.a)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(p,{...e})}):p(e)}},1151:(e,t,a)=>{a.d(t,{Z:()=>c,a:()=>r});var i=a(7294);const s={},n=i.createContext(s);function r(e){const t=i.useContext(n);return i.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),i.createElement(n.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/e3b44675.ee7ecab7.js b/assets/js/a91d24a4.22c03576.js similarity index 86% rename from assets/js/e3b44675.ee7ecab7.js rename to assets/js/a91d24a4.22c03576.js index ffa0768a6..4e42bf85f 100644 --- a/assets/js/e3b44675.ee7ecab7.js +++ b/assets/js/a91d24a4.22c03576.js @@ -1 +1 @@ -"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[7354],{9542:(e,o,t)=>{t.r(o),t.d(o,{assets:()=>l,contentTitle:()=>c,default:()=>f,frontMatter:()=>d,metadata:()=>a,toc:()=>p});var n=t(5893),r=t(1151),s=t(9965),i=t(4996);const d={},c="Developer Guide",a={id:"developer-guide/index",title:"Developer Guide",description:"Zealot offers a rich set of components for iOS, Android, and all aspects of the packaging process.",source:"@site/versioned_docs/version-5.1.0/developer-guide/index.md",sourceDirName:"developer-guide",slug:"/developer-guide/",permalink:"/docs/developer-guide/",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.1.0/developer-guide/index.md",tags:[],version:"5.1.0",frontMatter:{},sidebar:"developerGuide",next:{title:"SDKs",permalink:"/docs/category/sdks"}},l={},p=[];function u(e){const o={h1:"h1",p:"p",...(0,r.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(o.h1,{id:"developer-guide",children:"Developer Guide"}),"\n",(0,n.jsx)(o.p,{children:"Zealot offers a rich set of components for iOS, Android, and all aspects of the packaging process."}),"\n","\n","\n",(0,n.jsx)(s.Z,{alt:"Architecture",sources:{light:(0,i.Z)("/img/5.0.0/developer-resources-light.png"),dark:(0,i.Z)("/img/5.0.0/developer-resources-dark.png")}})]})}function f(e={}){const{wrapper:o}={...(0,r.a)(),...e.components};return o?(0,n.jsx)(o,{...e,children:(0,n.jsx)(u,{...e})}):u(e)}},1151:(e,o,t)=>{t.d(o,{Z:()=>d,a:()=>i});var n=t(7294);const r={},s=n.createContext(r);function i(e){const o=n.useContext(s);return n.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function d(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:i(e.components),n.createElement(s.Provider,{value:o},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[8754],{2103:(e,o,t)=>{t.r(o),t.d(o,{assets:()=>l,contentTitle:()=>c,default:()=>f,frontMatter:()=>d,metadata:()=>a,toc:()=>p});var n=t(5893),r=t(1151),s=t(9965),i=t(4996);const d={},c="Developer Guide",a={id:"developer-guide/index",title:"Developer Guide",description:"Zealot offers a rich set of components for iOS, Android, and all aspects of the packaging process.",source:"@site/versioned_docs/version-5.2.0/developer-guide/index.md",sourceDirName:"developer-guide",slug:"/developer-guide/",permalink:"/docs/developer-guide/",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.2.0/developer-guide/index.md",tags:[],version:"5.2.0",frontMatter:{},sidebar:"developerGuide",next:{title:"SDKs",permalink:"/docs/category/sdks"}},l={},p=[];function u(e){const o={h1:"h1",p:"p",...(0,r.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(o.h1,{id:"developer-guide",children:"Developer Guide"}),"\n",(0,n.jsx)(o.p,{children:"Zealot offers a rich set of components for iOS, Android, and all aspects of the packaging process."}),"\n","\n","\n",(0,n.jsx)(s.Z,{alt:"Architecture",sources:{light:(0,i.Z)("/img/5.0.0/developer-resources-light.png"),dark:(0,i.Z)("/img/5.0.0/developer-resources-dark.png")}})]})}function f(e={}){const{wrapper:o}={...(0,r.a)(),...e.components};return o?(0,n.jsx)(o,{...e,children:(0,n.jsx)(u,{...e})}):u(e)}},1151:(e,o,t)=>{t.d(o,{Z:()=>d,a:()=>i});var n=t(7294);const r={},s=n.createContext(r);function i(e){const o=n.useContext(s);return n.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function d(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:i(e.components),n.createElement(s.Provider,{value:o},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/b03e7fdf.c2195603.js b/assets/js/b03e7fdf.c2195603.js new file mode 100644 index 000000000..3767e64f7 --- /dev/null +++ b/assets/js/b03e7fdf.c2195603.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[6359],{6866:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>d,default:()=>p,frontMatter:()=>l,metadata:()=>a,toc:()=>u});var o=n(5893),s=n(1151),i=n(9965),r=n(4996);const l={},d="Self-hosted Installation Guide",a={id:"self-hosted/index",title:"Self-hosted Installation Guide",description:"This guide will help you to install and setup a production ready Zealot.",source:"@site/versioned_docs/version-5.1.0/self-hosted/index.md",sourceDirName:"self-hosted",slug:"/self-hosted/",permalink:"/docs/5.1.0/self-hosted/",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.1.0/self-hosted/index.md",tags:[],version:"5.1.0",frontMatter:{},sidebar:"selfHosted",next:{title:"Deployment",permalink:"/docs/5.1.0/category/deployment"}},c={},u=[];function h(e){const t={h1:"h1",p:"p",...(0,s.a)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.h1,{id:"self-hosted-installation-guide",children:"Self-hosted Installation Guide"}),"\n","\n","\n",(0,o.jsx)(t.p,{children:"This guide will help you to install and setup a production ready Zealot."}),"\n",(0,o.jsx)(i.Z,{alt:"Architecture",sources:{light:(0,r.Z)("/img/5.0.0/architecture-light.png"),dark:(0,r.Z)("/img/5.0.0/architecture-dark.png")}})]})}function p(e={}){const{wrapper:t}={...(0,s.a)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(h,{...e})}):h(e)}},1151:(e,t,n)=>{n.d(t,{Z:()=>l,a:()=>r});var o=n(7294);const s={},i=o.createContext(s);function r(e){const t=o.useContext(i);return o.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function l(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),o.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/b5008855.8e9225fb.js b/assets/js/b5008855.8e9225fb.js new file mode 100644 index 000000000..0b1c4c693 --- /dev/null +++ b/assets/js/b5008855.8e9225fb.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[5538],{5965:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>i,default:()=>d,frontMatter:()=>s,metadata:()=>r,toc:()=>p});var o=t(5893),l=t(1151);const s={sidebar_label:"Fly"},i="Deploy Zealot to Fly guide",r={id:"self-hosted/deployment/fly",title:"Deploy Zealot to Fly guide",description:"Zealot support use App Configuration (fly.toml) to deploy on fly.io.",source:"@site/versioned_docs/version-5.1.0/self-hosted/deployment/fly.md",sourceDirName:"self-hosted/deployment",slug:"/self-hosted/deployment/fly",permalink:"/docs/5.1.0/self-hosted/deployment/fly",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.1.0/self-hosted/deployment/fly.md",tags:[],version:"5.1.0",frontMatter:{sidebar_label:"Fly"},sidebar:"selfHosted",previous:{title:"Cloud Provider Guides",permalink:"/docs/5.1.0/category/cloud-provider-guides"},next:{title:"Railway",permalink:"/docs/5.1.0/self-hosted/deployment/railway"}},c={},p=[{value:"Deploying on Fly",id:"deploying-on-fly",level:2},{value:"App Configuration",id:"app-configuration",level:3}];function a(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",ul:"ul",...(0,l.a)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.h1,{id:"deploy-zealot-to-fly-guide",children:"Deploy Zealot to Fly guide"}),"\n",(0,o.jsxs)(n.p,{children:["Zealot support use App Configuration (fly.toml) to deploy on ",(0,o.jsx)(n.a,{href:"https://fly.io",children:"fly.io"}),"."]}),"\n",(0,o.jsx)(n.h2,{id:"deploying-on-fly",children:"Deploying on Fly"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:["Install ",(0,o.jsx)(n.a,{href:"https://fly.io/docs/flyctl/",children:"flyctl"}),"."]}),"\n",(0,o.jsxs)(n.li,{children:["Copy full content of ",(0,o.jsx)(n.a,{href:"#app-configuration",children:"app configuration"})," save to ",(0,o.jsx)(n.code,{children:"fly.toml"})," then change the ",(0,o.jsx)(n.code,{children:"app"})," value ."]}),"\n",(0,o.jsxs)(n.li,{children:["Run ",(0,o.jsx)(n.code,{children:"flyctl deploy"}),"."]}),"\n",(0,o.jsxs)(n.li,{children:["Run ",(0,o.jsx)(n.code,{children:"fly scale vm shared-cpu-1x --memory 512"}),"."]}),"\n"]}),"\n",(0,o.jsx)(n.h3,{id:"app-configuration",children:"App Configuration"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-toml",children:'app = "[app-name:changeme]"\nkill_signal = "SIGINT"\nkill_timeout = 120\nprocesses = []\n\n[build]\n image = "ghcr.io/tryzealot/zealot:nightly"\n\n[experimental]\n allowed_public_ports = []\n auto_rollback = true\n\n[[services]]\n http_checks = []\n internal_port = 80\n processes = ["app"]\n protocol = "tcp"\n script_checks = []\n [services.concurrency]\n hard_limit = 25\n soft_limit = 20\n type = "connections"\n\n [[services.ports]]\n force_https = true\n handlers = ["http"]\n port = 80\n\n [[services.ports]]\n handlers = ["tls", "http"]\n port = 443\n\n [[services.tcp_checks]]\n grace_period = "1s"\n interval = "15s"\n restart_limit = 0\n timeout = "2s"\n\n[[statics]]\n guest_path = "/app/public"\n url_prefix = "/"\n'})})]})}function d(e={}){const{wrapper:n}={...(0,l.a)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(a,{...e})}):a(e)}},1151:(e,n,t)=>{t.d(n,{Z:()=>r,a:()=>i});var o=t(7294);const l={},s=o.createContext(l);function i(e){const n=o.useContext(s);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(l):e.components||l:i(e.components),o.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/6f76ba3b.485ffd50.js b/assets/js/b958ca3b.85f1ab16.js similarity index 97% rename from assets/js/6f76ba3b.485ffd50.js rename to assets/js/b958ca3b.85f1ab16.js index e756db8de..50d9d9545 100644 --- a/assets/js/6f76ba3b.485ffd50.js +++ b/assets/js/b958ca3b.85f1ab16.js @@ -1 +1 @@ -"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[2366],{5401:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>l,contentTitle:()=>r,default:()=>h,frontMatter:()=>a,metadata:()=>o,toc:()=>d});var s=i(5893),t=i(1151);const a={},r="Environment Variables",o={id:"self-hosted/configuration/environment-variables",title:"Environment Variables",description:"The .env File",source:"@site/versioned_docs/version-5.1.0/self-hosted/configuration/environment-variables.md",sourceDirName:"self-hosted/configuration",slug:"/self-hosted/configuration/environment-variables",permalink:"/docs/self-hosted/configuration/environment-variables",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.1.0/self-hosted/configuration/environment-variables.md",tags:[],version:"5.1.0",frontMatter:{},sidebar:"selfHosted",previous:{title:"Configuration",permalink:"/docs/category/configuration"},next:{title:"Third-party Authentication",permalink:"/docs/self-hosted/configuration/third-party-authentication"}},l={},d=[{value:"The .env File",id:"the-env-file",level:2},{value:"Configure HTTPS (SSL)",id:"configure-https-ssl",level:2},{value:"Configure URL (Domain)",id:"configure-url-domain",level:2},{value:"Database configuration",id:"database-configuration",level:2},{value:"Postgresql",id:"postgresql",level:3},{value:"Redis",id:"redis",level:3},{value:"Configure default language",id:"configure-default-language",level:2},{value:"Configure default appearance",id:"configure-default-appearance",level:2},{value:"Configure default Administer",id:"configure-default-administer",level:2},{value:"Enable new user registration",id:"enable-new-user-registration",level:2},{value:"Enable guest mode",id:"enable-guest-mode",level:2},{value:"Configure emails",id:"configure-emails",level:2},{value:"Disbale Cable request protection",id:"disbale-cable-request-protection",level:2}];function c(e){const n={a:"a",blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",h3:"h3",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,t.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h1,{id:"environment-variables",children:"Environment Variables"}),"\n",(0,s.jsx)(n.h2,{id:"the-env-file",children:"The .env File"}),"\n",(0,s.jsxs)(n.p,{children:["You can set the correct values as per the following options. Once you set the values, you should rename the file to ",(0,s.jsx)(n.code,{children:".env"})," before you start the server."]}),"\n",(0,s.jsx)(n.h2,{id:"configure-https-ssl",children:"Configure HTTPS (SSL)"}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Due to Apple's mandatory requirement of mandatory HTTPS for online deployment and download services"}),", d\nownloading applications will be forced to go HTTPS protocol when redeploying."]}),"\n",(0,s.jsx)(n.p,{children:"If the deployment is a standalone service on a single machine, it is recommended to enable Let's Encrypt free SSL certificate:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"ZEALOT_CERT_EMAIL=zealot@example.com\n"})}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsx)(n.p,{children:"The following self-signed certificate file name, can not be set at the same time"}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"If the deployed machine can only use self-signed certificates, they need to be configured,\nbut note that iOS downloads require the iOS device to authorize the self-signed certificate before the download and installation is allowed. (Not recommended)"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"ZEALOT_CERT=zealot.test.pem\nZEALOT_CERT_KEY=zealot.test-key.pem\n"})}),"\n",(0,s.jsx)(n.h2,{id:"configure-url-domain",children:"Configure URL (Domain)"}),"\n",(0,s.jsx)(n.p,{children:"Must be configured otherwise downloaded applications and some static resources will not be accessed correctly"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"# No need http:// or https://\nZEALOT_DOMAIN=zealot.com\n"})}),"\n",(0,s.jsx)(n.h2,{id:"database-configuration",children:"Database configuration"}),"\n",(0,s.jsx)(n.p,{children:"If you have reusable postgresql and redis services,\nyou can also customize the configuration to use them instead of\nusing the services configured by default with docker-compose."}),"\n",(0,s.jsx)(n.h3,{id:"postgresql",children:"Postgresql"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"ZEALOT_POSTGRES_HOST=127.0.0.1\nZEALOT_POSTGRES_PORT=5432\nZEALOT_POSTGRES_USERNAME=postgres\nZEALOT_POSTGRES_PASSWORD=ze@l0t\nZEALOT_POSTGRES_DB_NAME=zealot\n"})}),"\n",(0,s.jsx)(n.h3,{id:"redis",children:"Redis"}),"\n",(0,s.jsx)(n.p,{children:"This is a URL connection mainly for most cloud services compatibility"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"REDIS_URL=redis://user:pass@127.0.0.1:6379/0\n\n# Redis over SSL\nREDIS_URL=rediss://user:pass@127.0.0.1:6379/0\n"})}),"\n",(0,s.jsx)(n.h2,{id:"configure-default-language",children:"Configure default language"}),"\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"Packs"}),(0,s.jsx)(n.th,{children:"Value"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"zh-CN"}),(0,s.jsx)(n.td,{children:"Simplified Chinese (default)"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"en"}),(0,s.jsx)(n.td,{children:"English"})]})]})]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"DEFAULT_LOCALE=en\n"})}),"\n",(0,s.jsx)(n.h2,{id:"configure-default-appearance",children:"Configure default appearance"}),"\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"Appearance"}),(0,s.jsx)(n.th,{children:"Value"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"light"}),(0,s.jsx)(n.td,{children:"Light mode(default)"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"dark"}),(0,s.jsx)(n.td,{children:"Dark mode"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"auto"}),(0,s.jsx)(n.td,{children:"System auto"})]})]})]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"ZEALOT_APPEARANCE=dark\n"})}),"\n",(0,s.jsx)(n.h2,{id:"configure-default-administer",children:"Configure default Administer"}),"\n",(0,s.jsx)(n.p,{children:"The default does not configure the following will also generate the following account and\npassword as an account with administrator privileges, it is recommended to change the password again after configuration."}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"ZEALOT_ADMIN_EMAIL=admin@zealot.com\nZEALOT_ADMIN_PASSWORD=ze@l0t\n"})}),"\n",(0,s.jsx)(n.h2,{id:"enable-new-user-registration",children:"Enable new user registration"}),"\n",(0,s.jsx)(n.p,{children:"After closing the registration, the administrator can add users manually through the user management in the administration panel."}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"# Open registration\nZEALOT_REGISTER_ENABLED=true\n\n# Close registration\nZEALOT_REGISTER_ENABLED=false\n"})}),"\n",(0,s.jsx)(n.h2,{id:"enable-guest-mode",children:"Enable guest mode"}),"\n",(0,s.jsxs)(n.p,{children:["Enable the visitor mode to allow the application to view, download and install,\nit is recommended that the company internal reliance on permissions is not high condition to use,\nspecific permission comparison can ",(0,s.jsx)(n.a,{href:"/docs/user-guide/administrator/permissions",children:"see here for details"})]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"# Guest mode is ON\nZEALOT_GUEST_MODE=true\n\n# Guest mode is OFF\nZEALOT_GUEST_MODE=false\n"})}),"\n",(0,s.jsx)(n.h2,{id:"configure-emails",children:"Configure emails"}),"\n",(0,s.jsxs)(n.p,{children:["Currently, only ",(0,s.jsx)(n.code,{children:"smtp"})," is supported to configure email notification service.\nEmail notification mainly affects are user registration, sending activation emails and\nchanging password service, but it does not affect the use if it is not turned on."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"# SMTP settings\nSMTP_ADDRESS=smtp.gmail.com\nSMTP_PORT=587\nSMTP_DOMAIN=gmail.com\nSMTP_USERNAME=you@gmail.com\nSMTP_PASSWORD=yourpassword\nSMTP_AUTH_METHOD=plain\nSMTP_ENABLE_STARTTLS_AUTO=true\n\n# Sender and email address by default\nACTION_MAILER_DEFAULT_FROM=you@gmail.com\nACTION_MAILER_DEFAULT_TO=you@gmail.com\n"})}),"\n",(0,s.jsx)(n.h2,{id:"disbale-cable-request-protection",children:"Disbale Cable request protection"}),"\n",(0,s.jsx)(n.p,{children:"Experimental:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"ZEALOT_DISABLE_CABLE_REQUEST_PROTECTION=true\n"})})]})}function h(e={}){const{wrapper:n}={...(0,t.a)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},1151:(e,n,i)=>{i.d(n,{Z:()=>o,a:()=>r});var s=i(7294);const t={},a=s.createContext(t);function r(e){const n=s.useContext(a);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:r(e.components),s.createElement(a.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[1016],{8640:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>l,contentTitle:()=>r,default:()=>h,frontMatter:()=>a,metadata:()=>o,toc:()=>d});var s=i(5893),t=i(1151);const a={},r="Environment Variables",o={id:"self-hosted/configuration/environment-variables",title:"Environment Variables",description:"The .env File",source:"@site/versioned_docs/version-5.2.0/self-hosted/configuration/environment-variables.md",sourceDirName:"self-hosted/configuration",slug:"/self-hosted/configuration/environment-variables",permalink:"/docs/self-hosted/configuration/environment-variables",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.2.0/self-hosted/configuration/environment-variables.md",tags:[],version:"5.2.0",frontMatter:{},sidebar:"selfHosted",previous:{title:"Configuration",permalink:"/docs/category/configuration"},next:{title:"Third-party Authentication",permalink:"/docs/self-hosted/configuration/third-party-authentication"}},l={},d=[{value:"The .env File",id:"the-env-file",level:2},{value:"Configure HTTPS (SSL)",id:"configure-https-ssl",level:2},{value:"Configure URL (Domain)",id:"configure-url-domain",level:2},{value:"Database configuration",id:"database-configuration",level:2},{value:"Postgresql",id:"postgresql",level:3},{value:"Redis",id:"redis",level:3},{value:"Configure default language",id:"configure-default-language",level:2},{value:"Configure default appearance",id:"configure-default-appearance",level:2},{value:"Configure default Administer",id:"configure-default-administer",level:2},{value:"Enable new user registration",id:"enable-new-user-registration",level:2},{value:"Enable guest mode",id:"enable-guest-mode",level:2},{value:"Configure emails",id:"configure-emails",level:2},{value:"Disbale Cable request protection",id:"disbale-cable-request-protection",level:2}];function c(e){const n={a:"a",blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",h3:"h3",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,t.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h1,{id:"environment-variables",children:"Environment Variables"}),"\n",(0,s.jsx)(n.h2,{id:"the-env-file",children:"The .env File"}),"\n",(0,s.jsxs)(n.p,{children:["You can set the correct values as per the following options. Once you set the values, you should rename the file to ",(0,s.jsx)(n.code,{children:".env"})," before you start the server."]}),"\n",(0,s.jsx)(n.h2,{id:"configure-https-ssl",children:"Configure HTTPS (SSL)"}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Due to Apple's mandatory requirement of mandatory HTTPS for online deployment and download services"}),", d\nownloading applications will be forced to go HTTPS protocol when redeploying."]}),"\n",(0,s.jsx)(n.p,{children:"If the deployment is a standalone service on a single machine, it is recommended to enable Let's Encrypt free SSL certificate:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"ZEALOT_CERT_EMAIL=zealot@example.com\n"})}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsx)(n.p,{children:"The following self-signed certificate file name, can not be set at the same time"}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"If the deployed machine can only use self-signed certificates, they need to be configured,\nbut note that iOS downloads require the iOS device to authorize the self-signed certificate before the download and installation is allowed. (Not recommended)"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"ZEALOT_CERT=zealot.test.pem\nZEALOT_CERT_KEY=zealot.test-key.pem\n"})}),"\n",(0,s.jsx)(n.h2,{id:"configure-url-domain",children:"Configure URL (Domain)"}),"\n",(0,s.jsx)(n.p,{children:"Must be configured otherwise downloaded applications and some static resources will not be accessed correctly"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"# No need http:// or https://\nZEALOT_DOMAIN=zealot.com\n"})}),"\n",(0,s.jsx)(n.h2,{id:"database-configuration",children:"Database configuration"}),"\n",(0,s.jsx)(n.p,{children:"If you have reusable postgresql and redis services,\nyou can also customize the configuration to use them instead of\nusing the services configured by default with docker-compose."}),"\n",(0,s.jsx)(n.h3,{id:"postgresql",children:"Postgresql"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"ZEALOT_POSTGRES_HOST=127.0.0.1\nZEALOT_POSTGRES_PORT=5432\nZEALOT_POSTGRES_USERNAME=postgres\nZEALOT_POSTGRES_PASSWORD=ze@l0t\nZEALOT_POSTGRES_DB_NAME=zealot\n"})}),"\n",(0,s.jsx)(n.h3,{id:"redis",children:"Redis"}),"\n",(0,s.jsx)(n.p,{children:"This is a URL connection mainly for most cloud services compatibility"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"REDIS_URL=redis://user:pass@127.0.0.1:6379/0\n\n# Redis over SSL\nREDIS_URL=rediss://user:pass@127.0.0.1:6379/0\n"})}),"\n",(0,s.jsx)(n.h2,{id:"configure-default-language",children:"Configure default language"}),"\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"Packs"}),(0,s.jsx)(n.th,{children:"Value"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"zh-CN"}),(0,s.jsx)(n.td,{children:"Simplified Chinese (default)"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"en"}),(0,s.jsx)(n.td,{children:"English"})]})]})]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"DEFAULT_LOCALE=en\n"})}),"\n",(0,s.jsx)(n.h2,{id:"configure-default-appearance",children:"Configure default appearance"}),"\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"Appearance"}),(0,s.jsx)(n.th,{children:"Value"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"light"}),(0,s.jsx)(n.td,{children:"Light mode(default)"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"dark"}),(0,s.jsx)(n.td,{children:"Dark mode"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"auto"}),(0,s.jsx)(n.td,{children:"System auto"})]})]})]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"ZEALOT_APPEARANCE=dark\n"})}),"\n",(0,s.jsx)(n.h2,{id:"configure-default-administer",children:"Configure default Administer"}),"\n",(0,s.jsx)(n.p,{children:"The default does not configure the following will also generate the following account and\npassword as an account with administrator privileges, it is recommended to change the password again after configuration."}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"ZEALOT_ADMIN_EMAIL=admin@zealot.com\nZEALOT_ADMIN_PASSWORD=ze@l0t\n"})}),"\n",(0,s.jsx)(n.h2,{id:"enable-new-user-registration",children:"Enable new user registration"}),"\n",(0,s.jsx)(n.p,{children:"After closing the registration, the administrator can add users manually through the user management in the administration panel."}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"# Open registration\nZEALOT_REGISTER_ENABLED=true\n\n# Close registration\nZEALOT_REGISTER_ENABLED=false\n"})}),"\n",(0,s.jsx)(n.h2,{id:"enable-guest-mode",children:"Enable guest mode"}),"\n",(0,s.jsxs)(n.p,{children:["Enable the visitor mode to allow the application to view, download and install,\nit is recommended that the company internal reliance on permissions is not high condition to use,\nspecific permission comparison can ",(0,s.jsx)(n.a,{href:"/docs/user-guide/administrator/permissions",children:"see here for details"})]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"# Guest mode is ON\nZEALOT_GUEST_MODE=true\n\n# Guest mode is OFF\nZEALOT_GUEST_MODE=false\n"})}),"\n",(0,s.jsx)(n.h2,{id:"configure-emails",children:"Configure emails"}),"\n",(0,s.jsxs)(n.p,{children:["Currently, only ",(0,s.jsx)(n.code,{children:"smtp"})," is supported to configure email notification service.\nEmail notification mainly affects are user registration, sending activation emails and\nchanging password service, but it does not affect the use if it is not turned on."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"# SMTP settings\nSMTP_ADDRESS=smtp.gmail.com\nSMTP_PORT=587\nSMTP_DOMAIN=gmail.com\nSMTP_USERNAME=you@gmail.com\nSMTP_PASSWORD=yourpassword\nSMTP_AUTH_METHOD=plain\nSMTP_ENABLE_STARTTLS_AUTO=true\n\n# Sender and email address by default\nACTION_MAILER_DEFAULT_FROM=you@gmail.com\nACTION_MAILER_DEFAULT_TO=you@gmail.com\n"})}),"\n",(0,s.jsx)(n.h2,{id:"disbale-cable-request-protection",children:"Disbale Cable request protection"}),"\n",(0,s.jsx)(n.p,{children:"Experimental:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"ZEALOT_DISABLE_CABLE_REQUEST_PROTECTION=true\n"})})]})}function h(e={}){const{wrapper:n}={...(0,t.a)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},1151:(e,n,i)=>{i.d(n,{Z:()=>o,a:()=>r});var s=i(7294);const t={},a=s.createContext(t);function r(e){const n=s.useContext(a);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:r(e.components),s.createElement(a.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/36eb88d2.b7252d42.js b/assets/js/c1b1e96e.9c1a99da.js similarity index 95% rename from assets/js/36eb88d2.b7252d42.js rename to assets/js/c1b1e96e.9c1a99da.js index fa59ff609..54fc1fd79 100644 --- a/assets/js/36eb88d2.b7252d42.js +++ b/assets/js/c1b1e96e.9c1a99da.js @@ -1 +1 @@ -"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[3205],{6831:(e,d,s)=>{s.r(d),s.d(d,{assets:()=>c,contentTitle:()=>l,default:()=>h,frontMatter:()=>t,metadata:()=>r,toc:()=>o});var i=s(5893),n=s(1151);const t={},l="APIs",r={id:"developer-guide/api",title:"APIs",description:"Use the Zealot APIs to view, upload, download the build of app or debug file.",source:"@site/versioned_docs/version-5.1.0/developer-guide/api.md",sourceDirName:"developer-guide",slug:"/developer-guide/api",permalink:"/docs/developer-guide/api",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.1.0/developer-guide/api.md",tags:[],version:"5.1.0",frontMatter:{},sidebar:"developerGuide",previous:{title:"zealot_sync_devices",permalink:"/docs/developer-guide/fastlane/zealot_sync_devices"},next:{title:"Apps",permalink:"/docs/developer-guide/api/apps"}},c={},o=[{value:"Authentication",id:"authentication",level:2},{value:"Version",id:"version",level:2},{value:"Apps",id:"apps",level:2},{value:"Debug files",id:"debug-files",level:2}];function a(e){const d={a:"a",blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",p:"p",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,n.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(d.h1,{id:"apis",children:"APIs"}),"\n",(0,i.jsx)(d.p,{children:"Use the Zealot APIs to view, upload, download the build of app or debug file."}),"\n",(0,i.jsx)(d.h2,{id:"authentication",children:"Authentication"}),"\n",(0,i.jsxs)(d.p,{children:["Requests currently only support query authentication for User Token, found in ",(0,i.jsx)(d.code,{children:"API - Key"})," at the bottom of the login user details page."]}),"\n",(0,i.jsxs)(d.blockquote,{children:["\n",(0,i.jsxs)(d.p,{children:["example : ",(0,i.jsx)(d.code,{children:"https://YOUR_ZEALOT_URL/api?token=YOUR_TOKEN"})]}),"\n"]}),"\n",(0,i.jsx)(d.h2,{id:"version",children:"Version"}),"\n",(0,i.jsxs)(d.p,{children:["The current version is ",(0,i.jsx)(d.code,{children:"v1"}),", the APIs does not need to explicitly pass the version parameter,\nand the GraphGL interface is being developed gradually."]}),"\n",(0,i.jsx)(d.h2,{id:"apps",children:"Apps"}),"\n",(0,i.jsxs)(d.table,{children:[(0,i.jsx)(d.thead,{children:(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.th,{children:"Resource"}),(0,i.jsx)(d.th,{children:"Available endpoints"})]})}),(0,i.jsxs)(d.tbody,{children:[(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"Upload an App"}),(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"/api/apps/upload"})})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"List Apps"}),(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"/api/apps"})})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"Get an App by id"}),(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"/api/apps/:id"})})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"List verions from an App"}),(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"/api/apps/versions"})})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"Get the latest Release from an App"}),(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"/api/apps/latest"})})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"Check an Release from App exists"}),(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"/api/apps/version_exist"})})]})]})]}),"\n",(0,i.jsxs)(d.blockquote,{children:["\n",(0,i.jsxs)(d.p,{children:["Full APIs to check ",(0,i.jsx)(d.a,{href:"/docs/developer-guide/api/apps",children:"api/apps"})," page."]}),"\n"]}),"\n",(0,i.jsx)(d.h2,{id:"debug-files",children:"Debug files"}),"\n",(0,i.jsxs)(d.table,{children:[(0,i.jsx)(d.thead,{children:(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.th,{children:"Resource"}),(0,i.jsx)(d.th,{children:"Available endpoints"})]})}),(0,i.jsxs)(d.tbody,{children:[(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"Upload a debug file"}),(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"/api/debug_files/upload"})})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"Download a debug file by id"}),(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"/api/debug_files/download"})})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"List Debug files"}),(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"/api/debug_files"})})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"Get an debug file by id"}),(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"/api/debug_files/:id"})})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"Check a debug file exists by id"}),(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"/api/debug_files/version_exist"})})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"Update a debug file by id"}),(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"/api/debug_files/:id"})})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"Delete a debug file by id"}),(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"/api/debug_files/:id"})})]})]})]}),"\n",(0,i.jsxs)(d.blockquote,{children:["\n",(0,i.jsxs)(d.p,{children:["Full APIs to check ",(0,i.jsx)(d.a,{href:"/docs/developer-guide/api/debug_files",children:"api/debug_files"})," page."]}),"\n"]})]})}function h(e={}){const{wrapper:d}={...(0,n.a)(),...e.components};return d?(0,i.jsx)(d,{...e,children:(0,i.jsx)(a,{...e})}):a(e)}},1151:(e,d,s)=>{s.d(d,{Z:()=>r,a:()=>l});var i=s(7294);const n={},t=i.createContext(n);function l(e){const d=i.useContext(t);return i.useMemo((function(){return"function"==typeof e?e(d):{...d,...e}}),[d,e])}function r(e){let d;return d=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:l(e.components),i.createElement(t.Provider,{value:d},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[1644],{5098:(e,d,s)=>{s.r(d),s.d(d,{assets:()=>c,contentTitle:()=>l,default:()=>h,frontMatter:()=>t,metadata:()=>r,toc:()=>o});var i=s(5893),n=s(1151);const t={},l="APIs",r={id:"developer-guide/api",title:"APIs",description:"Use the Zealot APIs to view, upload, download the build of app or debug file.",source:"@site/versioned_docs/version-5.2.0/developer-guide/api.md",sourceDirName:"developer-guide",slug:"/developer-guide/api",permalink:"/docs/developer-guide/api",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.2.0/developer-guide/api.md",tags:[],version:"5.2.0",frontMatter:{},sidebar:"developerGuide",previous:{title:"zealot_sync_devices",permalink:"/docs/developer-guide/fastlane/zealot_sync_devices"},next:{title:"Apps",permalink:"/docs/developer-guide/api/apps"}},c={},o=[{value:"Authentication",id:"authentication",level:2},{value:"Version",id:"version",level:2},{value:"Apps",id:"apps",level:2},{value:"Debug files",id:"debug-files",level:2}];function a(e){const d={a:"a",blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",p:"p",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,n.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(d.h1,{id:"apis",children:"APIs"}),"\n",(0,i.jsx)(d.p,{children:"Use the Zealot APIs to view, upload, download the build of app or debug file."}),"\n",(0,i.jsx)(d.h2,{id:"authentication",children:"Authentication"}),"\n",(0,i.jsxs)(d.p,{children:["Requests currently only support query authentication for User Token, found in ",(0,i.jsx)(d.code,{children:"API - Key"})," at the bottom of the login user details page."]}),"\n",(0,i.jsxs)(d.blockquote,{children:["\n",(0,i.jsxs)(d.p,{children:["example : ",(0,i.jsx)(d.code,{children:"https://YOUR_ZEALOT_URL/api?token=YOUR_TOKEN"})]}),"\n"]}),"\n",(0,i.jsx)(d.h2,{id:"version",children:"Version"}),"\n",(0,i.jsxs)(d.p,{children:["The current version is ",(0,i.jsx)(d.code,{children:"v1"}),", the APIs does not need to explicitly pass the version parameter,\nand the GraphGL interface is being developed gradually."]}),"\n",(0,i.jsx)(d.h2,{id:"apps",children:"Apps"}),"\n",(0,i.jsxs)(d.table,{children:[(0,i.jsx)(d.thead,{children:(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.th,{children:"Resource"}),(0,i.jsx)(d.th,{children:"Available endpoints"})]})}),(0,i.jsxs)(d.tbody,{children:[(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"Upload an App"}),(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"/api/apps/upload"})})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"List Apps"}),(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"/api/apps"})})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"Get an App by id"}),(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"/api/apps/:id"})})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"List verions from an App"}),(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"/api/apps/versions"})})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"Get the latest Release from an App"}),(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"/api/apps/latest"})})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"Check an Release from App exists"}),(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"/api/apps/version_exist"})})]})]})]}),"\n",(0,i.jsxs)(d.blockquote,{children:["\n",(0,i.jsxs)(d.p,{children:["Full APIs to check ",(0,i.jsx)(d.a,{href:"/docs/developer-guide/api/apps",children:"api/apps"})," page."]}),"\n"]}),"\n",(0,i.jsx)(d.h2,{id:"debug-files",children:"Debug files"}),"\n",(0,i.jsxs)(d.table,{children:[(0,i.jsx)(d.thead,{children:(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.th,{children:"Resource"}),(0,i.jsx)(d.th,{children:"Available endpoints"})]})}),(0,i.jsxs)(d.tbody,{children:[(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"Upload a debug file"}),(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"/api/debug_files/upload"})})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"Download a debug file by id"}),(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"/api/debug_files/download"})})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"List Debug files"}),(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"/api/debug_files"})})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"Get an debug file by id"}),(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"/api/debug_files/:id"})})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"Check a debug file exists by id"}),(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"/api/debug_files/version_exist"})})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"Update a debug file by id"}),(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"/api/debug_files/:id"})})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"Delete a debug file by id"}),(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"/api/debug_files/:id"})})]})]})]}),"\n",(0,i.jsxs)(d.blockquote,{children:["\n",(0,i.jsxs)(d.p,{children:["Full APIs to check ",(0,i.jsx)(d.a,{href:"/docs/developer-guide/api/debug_files",children:"api/debug_files"})," page."]}),"\n"]})]})}function h(e={}){const{wrapper:d}={...(0,n.a)(),...e.components};return d?(0,i.jsx)(d,{...e,children:(0,i.jsx)(a,{...e})}):a(e)}},1151:(e,d,s)=>{s.d(d,{Z:()=>r,a:()=>l});var i=s(7294);const n={},t=i.createContext(n);function l(e){const d=i.useContext(t);return i.useMemo((function(){return"function"==typeof e?e(d):{...d,...e}}),[d,e])}function r(e){let d;return d=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:l(e.components),i.createElement(t.Provider,{value:d},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/c23a205f.dcaea165.js b/assets/js/c23a205f.dcaea165.js new file mode 100644 index 000000000..5c5c799ee --- /dev/null +++ b/assets/js/c23a205f.dcaea165.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[4019],{4462:(e,o,t)=>{t.r(o),t.d(o,{assets:()=>r,contentTitle:()=>s,default:()=>p,frontMatter:()=>a,metadata:()=>i,toc:()=>d});var l=t(5893),n=t(1151);const a={sidebar_label:"Railway"},s="Deploy Zealot to Railway guide",i={id:"self-hosted/deployment/railway",title:"Deploy Zealot to Railway guide",description:"Zealot support use Dockfile to deploy on Railway.",source:"@site/versioned_docs/version-5.1.0/self-hosted/deployment/railway.md",sourceDirName:"self-hosted/deployment",slug:"/self-hosted/deployment/railway",permalink:"/docs/5.1.0/self-hosted/deployment/railway",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.1.0/self-hosted/deployment/railway.md",tags:[],version:"5.1.0",frontMatter:{sidebar_label:"Railway"},sidebar:"selfHosted",previous:{title:"Fly",permalink:"/docs/5.1.0/self-hosted/deployment/fly"},next:{title:"Render",permalink:"/docs/5.1.0/self-hosted/deployment/render"}},r={},d=[{value:"Deploying on Railway",id:"deploying-on-railway",level:2}];function c(e){const o={a:"a",code:"code",h1:"h1",h2:"h2",li:"li",p:"p",ul:"ul",...(0,n.a)(),...e.components};return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(o.h1,{id:"deploy-zealot-to-railway-guide",children:"Deploy Zealot to Railway guide"}),"\n",(0,l.jsxs)(o.p,{children:["Zealot support use ",(0,l.jsx)(o.code,{children:"Dockfile"})," to deploy on ",(0,l.jsx)(o.a,{href:"https://railway.app/",children:"Railway"}),"."]}),"\n",(0,l.jsx)(o.h2,{id:"deploying-on-railway",children:"Deploying on Railway"}),"\n",(0,l.jsxs)(o.ul,{children:["\n",(0,l.jsxs)(o.li,{children:["Fork ",(0,l.jsx)(o.a,{href:"https://github.com/tryzealot/zealot/fork",children:"Zealot"})," project to your Github account."]}),"\n",(0,l.jsxs)(o.li,{children:["Create ",(0,l.jsx)(o.a,{href:"https://railway.app/new",children:"New Project"}),' with "deploy from Github repo".']}),"\n",(0,l.jsxs)(o.li,{children:["Add ",(0,l.jsx)(o.a,{href:"/docs/self-hosted/configuration/environment-variables",children:"Enviroment"})," to Variables page."]}),"\n"]})]})}function p(e={}){const{wrapper:o}={...(0,n.a)(),...e.components};return o?(0,l.jsx)(o,{...e,children:(0,l.jsx)(c,{...e})}):c(e)}},1151:(e,o,t)=>{t.d(o,{Z:()=>i,a:()=>s});var l=t(7294);const n={},a=l.createContext(n);function s(e){const o=l.useContext(a);return l.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function i(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:s(e.components),l.createElement(a.Provider,{value:o},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/c53e755e.2b26c2c4.js b/assets/js/c53e755e.2b26c2c4.js new file mode 100644 index 000000000..9b32098cf --- /dev/null +++ b/assets/js/c53e755e.2b26c2c4.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[7322],{9198:(e,i,n)=>{n.r(i),n.d(i,{assets:()=>o,contentTitle:()=>t,default:()=>h,frontMatter:()=>l,metadata:()=>r,toc:()=>a});var s=n(5893),d=n(1151);const l={},t="Change Log",r={id:"user-guide/changelog",title:"Change Log",description:"Unreleased",source:"@site/docs/user-guide/changelog.md",sourceDirName:"user-guide",slug:"/user-guide/changelog",permalink:"/docs/next/user-guide/changelog",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/docs/user-guide/changelog.md",tags:[],version:"current",frontMatter:{},sidebar:"userGuide",previous:{title:"Best Practices",permalink:"/docs/next/user-guide/best_practices"},next:{title:"Q&A",permalink:"/docs/next/user-guide/qa"}},o={},a=[{value:"Unreleased",id:"unreleased",level:2},{value:"Changed",id:"changed",level:4},{value:"5.2.0 (2024-03-14)",id:"520-2024-03-14",level:2},{value:"Added",id:"added",level:4},{value:"Fixed",id:"fixed",level:4},{value:"5.1.0 (2023-12-07)",id:"510-2023-12-07",level:2},{value:"Changed",id:"changed-1",level:4},{value:"Added",id:"added-1",level:4},{value:"Fixed",id:"fixed-1",level:4},{value:"5.0.0 (2023-09-06)",id:"500-2023-09-06",level:2},{value:"Changed",id:"changed-2",level:4},{value:"Added",id:"added-2",level:4},{value:"Fixed",id:"fixed-2",level:4},{value:"4.7.1 (2023-03-10)",id:"471-2023-03-10",level:2},{value:"Changed",id:"changed-3",level:4},{value:"Fixed",id:"fixed-3",level:4},{value:"Added",id:"added-3",level:4},{value:"4.7.0 (2023-03-03)",id:"470-2023-03-03",level:2},{value:"Changed",id:"changed-4",level:4},{value:"Added",id:"added-4",level:4},{value:"Fixed",id:"fixed-4",level:4},{value:"4.6.0 (2023-01-17)",id:"460-2023-01-17",level:2},{value:"Fixed",id:"fixed-5",level:4},{value:"Added",id:"added-5",level:4},{value:"Changed",id:"changed-5",level:4},{value:"4.5.3 (2022-11-22)",id:"453-2022-11-22",level:2},{value:"Fixed",id:"fixed-6",level:4},{value:"Added",id:"added-6",level:4},{value:"4.5.2 (2022-11-01)",id:"452-2022-11-01",level:2},{value:"Fixed",id:"fixed-7",level:4},{value:"Added",id:"added-7",level:4},{value:"Changed",id:"changed-6",level:4},{value:"4.5.1 (2022-09-14)",id:"451-2022-09-14",level:2},{value:"Fixed",id:"fixed-8",level:4},{value:"4.5.0 (2022-08-19)",id:"450-2022-08-19",level:2},{value:"Added",id:"added-8",level:4},{value:"Changed",id:"changed-7",level:4},{value:"Fixed",id:"fixed-9",level:4},{value:"4.4.1 (2022-06-20)",id:"441-2022-06-20",level:2},{value:"Fixed",id:"fixed-10",level:4},{value:"4.4.0 (2022-06-09)",id:"440-2022-06-09",level:2},{value:"Changed",id:"changed-8",level:4},{value:"Added",id:"added-9",level:4},{value:"Fixed",id:"fixed-11",level:4},{value:"4.3.1 (2021-12-22)",id:"431-2021-12-22",level:2},{value:"Added",id:"added-10",level:4},{value:"Fixed",id:"fixed-12",level:4},{value:"4.3.0 (2021-12-08)",id:"430-2021-12-08",level:2},{value:"Changed",id:"changed-9",level:4},{value:"Added",id:"added-11",level:4},{value:"Fixed",id:"fixed-13",level:4},{value:"4.2.2 (2021-10-15)",id:"422-2021-10-15",level:2},{value:"Fixed",id:"fixed-14",level:4},{value:"4.2.1 (2021-09-14)",id:"421-2021-09-14",level:2},{value:"Changed",id:"changed-10",level:4},{value:"Fixed",id:"fixed-15",level:4},{value:"4.2.0 (2021-09-01)",id:"420-2021-09-01",level:2},{value:"Changed",id:"changed-11",level:4},{value:"Added",id:"added-12",level:4},{value:"Fixed",id:"fixed-16",level:4},{value:"4.1.0 (2021-07-17)",id:"410-2021-07-17",level:2},{value:"Changed",id:"changed-12",level:4},{value:"Added",id:"added-13",level:4},{value:"Fixed",id:"fixed-17",level:4},{value:"4.0.0 (2020-12-31)",id:"400-2020-12-31",level:2},{value:"Fixed",id:"fixed-18",level:4},{value:"4.0.0.rc2 (2020-12-25)",id:"400rc2-2020-12-25",level:2},{value:"Added",id:"added-14",level:4},{value:"Changed",id:"changed-13",level:4},{value:"Fixed",id:"fixed-19",level:4},{value:"4.0.0.rc1 (2020-10-29)",id:"400rc1-2020-10-29",level:2},{value:"Changed",id:"changed-14",level:4},{value:"Added",id:"added-15",level:4},{value:"Fixed",id:"fixed-20",level:4},{value:"4.0.0.beta4 (2020-05-07)",id:"400beta4-2020-05-07",level:2},{value:"Added",id:"added-16",level:4},{value:"Fixed",id:"fixed-21",level:4},{value:"Changed",id:"changed-15",level:4},{value:"4.0.0.beta3 (2020-01-16)",id:"400beta3-2020-01-16",level:2},{value:"Added",id:"added-17",level:4},{value:"Fixed",id:"fixed-22",level:4},{value:"Changed",id:"changed-16",level:4},{value:"4.0.0.beta2 (2020-01-10)",id:"400beta2-2020-01-10",level:2},{value:"Added",id:"added-18",level:4},{value:"Fixed",id:"fixed-23",level:4},{value:"4.0.0.beta1",id:"400beta1",level:2},{value:"Previous Version",id:"previous-version",level:2}];function c(e){const i={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h4:"h4",li:"li",p:"p",strong:"strong",ul:"ul",...(0,d.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(i.h1,{id:"change-log",children:"Change Log"}),"\n",(0,s.jsx)(i.h2,{id:"unreleased",children:"Unreleased"}),"\n",(0,s.jsx)(i.admonition,{type:"tip",children:(0,s.jsxs)(i.p,{children:["The following list of changes is the list that has not yet been released, code change history: ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/compare/5.2.0...HEAD",children:"Unreleased"})]})}),"\n",(0,s.jsx)(i.h4,{id:"changed",children:"Changed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Docker"})," ",(0,s.jsx)(i.strong,{children:"Breaking Change"})," Plan to deprecate Redis service ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/1318",children:"#1318"}),"."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," ",(0,s.jsx)(i.strong,{children:"Breaking Change"})," Adjusted the data backup logic ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/1318",children:"#1318"}),"."]}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"520-2024-03-14",children:"5.2.0 (2024-03-14)"}),"\n",(0,s.jsxs)(i.p,{children:["Minor functional fixes, with minor upgrades to new features. Full ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/compare/5.1.0...5.2.0",children:"commit changes"}),"."]}),"\n",(0,s.jsx)(i.h4,{id:"added",children:"Added"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," New setting for maximum number of retained versions added ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/1407",children:"#1407"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," Opened up the feature for macOS systems to retrieve device UDID"]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," Allow registration of macOS devices to Apple Developer for testing"]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"fixed",children:"Fixed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," Exception error for Android unpacking without services storage"]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," Failure to create due to validation error on creating webhook format ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/issues/1314",children:"#1314"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," Exception error caused by application version details mismatching debug files query ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/issues/1406",children:"#1406"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"API"})," Fixed the download debug files endpoint and changed the request to GET ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/issues/1416",children:"#1416"})]}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"510-2023-12-07",children:"5.1.0 (2023-12-07)"}),"\n",(0,s.jsxs)(i.p,{children:["Mainly functional fixes, with minor upgrades to new features. Full ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/compare/5.0.0...5.1.0",children:"commit changes"}),"."]}),"\n",(0,s.jsx)(i.h4,{id:"changed-1",children:"Changed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Docker"})," ",(0,s.jsx)(i.strong,{children:"Major Change"})," The minimum version of Redis dependencies has been updated from 5.x to 6.2+. It is recommended to use version 7.x. When upgrading, please manually modify the settings."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"added-1",children:"Added"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Docker"})," added Redis and PostgreSQL version checks; running below minimum versions may cause malfunction."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Docker"})," service initializes by creating databases during startup."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," enhanced validation conditions for JSON format settings on the settings page."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"fixed-1",children:"Fixed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," checks disk space upon upload to determine file existence."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixed debug file association with application versions."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," resolved issue where the application unpack details page wasn't displaying the list of testing devices."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," optimized display information on error pages for application versions."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," improved display for long package names of mobile device applications."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," optimized some page styles and the display of English language."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"API/Web"})," fixed issue where the Android app parsing icon in webp format failed to convert to png."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"API"})," resolved GraphQL user authentication."]}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"500-2023-09-06",children:"5.0.0 (2023-09-06)"}),"\n",(0,s.jsxs)(i.p,{children:["Any archived package of application supportted (e.g. ",(0,s.jsx)(i.code,{children:"Windows"})," or ",(0,s.jsx)(i.code,{children:"Linux"}),")). Full ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/compare/4.7.1...5.0.0",children:"commit changes"}),"."]}),"\n",(0,s.jsx)(i.h4,{id:"changed-2",children:"Changed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Docker"})," ",(0,s.jsx)(i.strong,{children:"Major Change"})," The minimum version of Redis dependencies has been updated from 5.x to 6.2+. It is recommended to use version 7.x. When upgrading, please manually modify the settings."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"added-2",children:"Added"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"}),"/",(0,s.jsx)(i.code,{children:"API"})," supports hosting of general applications (those that can be parsed automatically and those that cannot be parsed are skipped), and Windows and Linux platforms are added by default ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/1121",children:"#1121"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"}),"/",(0,s.jsx)(i.code,{children:"API"})," adds support for hosting Windows applications (uploading and displaying metadata parsing) ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/1124",children:"#1124"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," has a new debugging file page and adds support for parsing and hosting multiple dSYM debugging files ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/1127",children:"#1127"})," ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/1124",children:"#1124"})," ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/issues/961",children:"#961"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," supports unpacking v1, v2, and v3 signature information for Android applications ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/1124",children:"#1124"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," strengthens X509 certificate information for unpacking Android and iOS applications ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/1124",children:"#1124"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"}),' adds a "Reparse" function to update the metadata of old structure debugging files']}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," supports markdown format for change logs of uploaded application versions"]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"}),' settings page can configure the global "minimum number of items returned per page" and "maximum number of items"']}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," for iOS applications, the application version details page displays the expiration time information of the signing certificate and the logical restriction of installation failure due to expired signing certificate (can be downloaded)"]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," adds or updates JSON format verification to network hooks and settings pages."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," supports registering test devices to Apple developers with custom device names and editing/updating device names after creation."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," supports downloading private key certificates for Apple developers."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"fixed-2",children:"Fixed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue of being unable to delete unpacked applications"]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," optimizes the style of some pages"]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," corrects errors in the English language package (en language i18n)"]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the error page that appears when creating an empty application type"]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the 404 error page that appears when a file is not found."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"API"})," fixes the logic optimization of comparing build_version for retrieving the latest version of an application."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," optimizes the error handling for custom field format during application upload."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," optimizes the correct redirection for URL injection, empty application history versions, and unregistered devices."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," optimizes the display of error information for backup tasks."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," adds type detection for application types and debug files during application upload."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the error message of not preselecting the creation of a Distribution Certificate for Apple developers."]}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"471-2023-03-10",children:"4.7.1 (2023-03-10)"}),"\n",(0,s.jsx)(i.p,{children:"Support for parsing aab applications generated by the latest Android aapt2 build tool, full [commit changes][4.7.1]."}),"\n",(0,s.jsx)(i.h4,{id:"changed-3",children:"Changed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Docker"})," ",(0,s.jsx)(i.strong,{children:"Major Change"})," The minimum version of Redis dependencies has been updated from 5.x to 6.2+. It is recommended to use version 7.x. When upgrading, please manually modify the settings."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"fixed-3",children:"Fixed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," upgrades to the latest appt2 model to avoid exceptions when parsing aab files."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," implements duplicate processing for parsing exceptions."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"added-3",children:"Added"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," adds application types to the details page of unpacked Android applications."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," adjusts the original page after editing an application channel."]}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"470-2023-03-03",children:"4.7.0 (2023-03-03)"}),"\n",(0,s.jsxs)(i.p,{children:[(0,s.jsx)(i.strong,{children:"Major Change"})," The minimum version of Redis dependencies has been updated from 5.x to 6.2+. Full ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/compare/4.6.0...4.7.0",children:"commit changes"}),"."]}),"\n",(0,s.jsx)(i.h4,{id:"changed-4",children:"Changed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Docker"})," ",(0,s.jsx)(i.strong,{children:"Major Change"})," The minimum version of Redis dependencies has been updated from 5.x to 6.2+. It is recommended to use version 7.x. When upgrading, please manually modify the settings."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"added-4",children:"Added"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"}),' adds a control switch for "New Upload Version Prompt Window" to application types. ',(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/1058",children:"#1058"})," Thanks to ",(0,s.jsx)(i.a,{href:"https://github.com/softwind0214",children:"softwind0214"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," allows clicking on the application icon on the application list page to jump to the application details page."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," adds the display of the version number of dependent services to the environment information."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," adds support for displaying nightly build versions in the version number."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"fixed-4",children:"Fixed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," downgrades Ruby version to 3.0 temporarily to solve the iOS application parsing crash caused by the high version. See ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/issues/1070",children:"#1070"})," for details."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the display order of applications/types/channels, which is now fixed as ascending order of creation time."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where there is no confirmation prompt when a user logs out."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where the main historical version of an application cannot be deleted."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," improves the style of multiple pages."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," no longer displays Javascript debugger logs in production environments."]}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"460-2023-01-17",children:"4.6.0 (2023-01-17)"}),"\n",(0,s.jsxs)(i.p,{children:["The runtime environment has been upgraded to Ruby 3.2 and now supports arm64 platforms. Full ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/compare/4.5.3...4.6.0",children:"commit changes"}),"."]}),"\n",(0,s.jsx)(i.h4,{id:"fixed-5",children:"Fixed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," captures the issue of creating an application channel with an empty name. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/issues/968",children:"#968"})," Thanks to ",(0,s.jsx)(i.a,{href:"https://github.com/congpeijun",children:"congpeijun"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," improves the logic for backup files that do not exist on disk. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/issues/995",children:"#995"})]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"added-5",children:"Added"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Docker"})," supports arm64/v8 and armv7 arch. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/970",children:"#970"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," Adopted a new 50x error page."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"changed-5",children:"Changed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," upgrades the Ruby version to 3.2 in development environments, and devcontainers and containers now have the YJIT feature enabled by default. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/1011",children:"#1011"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"API"})," updates the data structure of the debug file return and changes the status code from 204 to 200."]}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"453-2022-11-22",children:"4.5.3 (2022-11-22)"}),"\n",(0,s.jsxs)(i.p,{children:["Full ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/compare/4.5.2...4.5.3",children:"commit changes"}),"."]}),"\n",(0,s.jsx)(i.h4,{id:"fixed-6",children:"Fixed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," Fixes the issue where third-party login cannot be redirected. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/issues/949",children:"#949"})," Thanks to ",(0,s.jsx)(i.a,{href:"https://github.com/softwind0214",children:"softwind0214"})]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"added-6",children:"Added"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Docker"})," Adds a new environment variable to disable the request protection of WebSocket (ActionCable) requests (experimental). ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/950",children:"#950"})]}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"452-2022-11-01",children:"4.5.2 (2022-11-01)"}),"\n",(0,s.jsxs)(i.p,{children:["Full ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/compare/4.5.1...4.5.2",children:"commit changes"}),"."]}),"\n",(0,s.jsx)(i.h4,{id:"fixed-7",children:"Fixed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where registering a test device is abnormal. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/issues/935",children:"#935"})," Thanks to ",(0,s.jsx)(i.a,{href:"https://github.com/ycy0430",children:"ycy0430"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," adapts the QR code to support dark mode."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," corrects the English language pack."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"added-7",children:"Added"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"WebHook"})," Income webhook body structure adds the ",(0,s.jsx)(i.code,{children:"username"})," and ",(0,s.jsx)(i.code,{children:"email"})," fields. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/issues/934",children:"#934"})," Thanks to ",(0,s.jsx)(i.a,{href:"https://github.com/rkonfj",children:"rkonfj"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Docker"})," The ",(0,s.jsx)(i.code,{children:"SIDEKIQ_CONCURRENCY"})," environment variable is now supported to set the concurrency of background tasks, with a default value of 5."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"changed-6",children:"Changed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Docker"})," reduces security risks by changing the Web service, which includes puma and pumacontrolserver, to listen on ",(0,s.jsx)(i.code,{children:"127.0.0.1"}),"."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," optimizes the wording of the iOS device UDID profile."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," updates the text at the bottom of the page. Thanks to Rails and the AdminLTE open source project!"]}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"451-2022-09-14",children:"4.5.1 (2022-09-14)"}),"\n",(0,s.jsxs)(i.p,{children:["Full ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/compare/4.5.0...4.5.1",children:"commit changes"})]}),"\n",(0,s.jsx)(i.h4,{id:"fixed-8",children:"Fixed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," Fixes the issue where the application unpacking results in parsing errors."]}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"450-2022-08-19",children:"4.5.0 (2022-08-19)"}),"\n",(0,s.jsxs)(i.p,{children:["Supports the \ud83c\udf11 dark mode and managing the test devices of an \ud83d\udc68\ud83c\udffb\u200d\ud83d\udd27 Apple developer account! Full ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/compare/4.4.1...4.5.0",children:"commit changes"}),"."]}),"\n",(0,s.jsx)(i.h4,{id:"added-8",children:"Added"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," supports dark mode. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/816",children:"#816"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," adds Apple developer management for registering test devices. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/817",children:"#817"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," adds data backup management. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/835",children:"#835"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," completes the monitoring of dependent services in the management panel. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/issues/586",children:"#586"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"API"})," adds three fields, ",(0,s.jsx)(i.code,{children:"platform"}),", ",(0,s.jsx)(i.code,{children:"device_type"}),", and ",(0,s.jsx)(i.code,{children:"custom_fields"}),", to the release dictionary."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"changed-7",children:"Changed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," ",(0,s.jsx)(i.strong,{children:"Incompatible change"})," Google Analytics forces an upgrade to version 4, and previous settings need to be reconfigured to take effect. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/815",children:"#815"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"CLI"})," ",(0,s.jsx)(i.strong,{children:"Incompatible change"})," The data backup and restore functionality is no longer available due to changes in the structure. Please use the data backup function in the admin panel instead."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," adjusts the display of device UDID acquisition, iOS version installation and download based on the device, no longer displaying all functions."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," removes the page statistics function in the admin panel. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/814",children:"#814"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," migrates the front-end technology stack from webpacker to esbuild + sass, and from Turbolinks to Stimulus, bringing a better front-end interaction experience. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/829",children:"#829"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," due to the complexity of editing application types and channels, only the application name can be modified."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"fixed-9",children:"Fixed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the error of selecting a channel that does not exist under an application type. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/issues/795",children:"#795"})," Thanks to ",(0,s.jsx)(i.a,{href:"https://github.com/tasselsd",children:"tasselsd"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"API"})," fixes the Android address return error. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/issues/813",children:"#813"})," Thanks to ",(0,s.jsx)(i.a,{href:"https://github.com/denymz",children:"denymz"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"}),"/",(0,s.jsx)(i.code,{children:"API"})," fixes the exception caused by some parameters being empty in aab parsing. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/fastlane-plugin-zealot/issues/9",children:"tryzealot/fastlane-plugin-zealot#9"})," Thanks to ",(0,s.jsx)(i.a,{href:"https://github.com/tasselsd",children:"tasselsd"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue of abnormal generation of demo data during the first initialization of the project. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/issues/821",children:"#821"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"API"})," fixes the issue of abnormal data when checking the latest version of the application. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/issues/856",children:"#856"})," Thanks to ",(0,s.jsx)(i.a,{href:"https://github.com/denymz",children:"denymz"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue of an error being thrown due to abnormal data in the associated network hook when viewing the details of an application channel."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," corrects many spelling errors in the English language pack."]}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"441-2022-06-20",children:"4.4.1 (2022-06-20)"}),"\n",(0,s.jsxs)(i.p,{children:["Full ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/compare/4.4.0...4.4.1",children:"commit changes"})]}),"\n",(0,s.jsx)(i.h4,{id:"fixed-10",children:"Fixed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"WebHook"})," fixes the issue where an error is thrown after a successful trigger. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/issues/792",children:"#792"})," Thanks to ",(0,s.jsx)(i.a,{href:"https://github.com/tasselsd",children:"tasselsd"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Docker"})," compatible with Caddy 2.5.0 for proxying from https to http. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/790",children:"#790"})," Thanks to ",(0,s.jsx)(i.a,{href:"https://github.com/VisionBao",children:"VisionBao"})," ",(0,s.jsx)(i.a,{href:"https://github.com/songge1209",children:"songge1209"})]}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"440-2022-06-09",children:"4.4.0 (2022-06-09)"}),"\n",(0,s.jsxs)(i.p,{children:["Full ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/compare/4.3.1...4.4.0",children:"commit changes"}),"."]}),"\n",(0,s.jsx)(i.h4,{id:"changed-8",children:"Changed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," adds filtering by version, branch, and packaging type to the list display for users who are not logged in and have not enabled guest mode, in addition to viewing application version details."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," upgrades the runtime environment to Ruby 3.0 and the service framework to Rails 7.0."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," is now compatible with the macOS M1 chip."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"added-9",children:"Added"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," simplifies and standardizes some application links to facilitate sharing. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/666",children:"#666"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," completes some missing permission check pages."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"fixed-11",children:"Fixed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Job"})," fixes the issue of abnormal URL Schemes when parsing iOS files."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where service logs are not output to the terminal console."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," adds exception handling for processing debug files uploaded when they are deleted during parsing or cannot be found for other reasons."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," adapts the UI for ultra-wide screens."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes security vulnerabilities in third-party login dependencies."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"API"})," fixes the issue where uploading Android without channel_key results in an exception. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/issues/779",children:"#779"})," Thanks to ",(0,s.jsx)(i.a,{href:"https://github.com/likfe",children:"likfe"})]}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"431-2021-12-22",children:"4.3.1 (2021-12-22)"}),"\n",(0,s.jsxs)(i.p,{children:["Full ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/compare/4.3.0...4.3.1",children:"commit changes"}),"."]}),"\n",(0,s.jsx)(i.h4,{id:"added-10",children:"Added"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," after updating the setting, the original default value can be restored."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," supports parsing and displaying app links (distinguishing between deep links and URL schemes) for Android in application unpacking."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," strengthens the visual effect of the open and closed status of the setting page."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"fixed-12",children:"Fixed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue of asynchronous task methods in demo mode."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where selected application types and channels cannot be checked when creating and editing an application."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where it is not possible to navigate to the environment page."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where aab parsing fails when there are no intent filters."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," adds error handling for unchecking all application types and channels when updating an application."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where the loading strategy causes all third-party logins to be unavailable."]}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"430-2021-12-08",children:"4.3.0 (2021-12-08)"}),"\n",(0,s.jsxs)(i.p,{children:["Supports parsing of the aab format, adds support for multiple languages. Full ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/compare/4.2.2...4.3.0",children:"commit changes"})]}),"\n",(0,s.jsx)(i.h4,{id:"changed-9",children:"Changed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," uses the default prompt structure as the data structure for network hooks, instead of a strange structure."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," no longer provides parameter changes for third-party login authorization on the settings page (requires service restart)."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"API"})," the upload application interface and version details return the ",(0,s.jsx)(i.code,{children:"text_changelog"})," field in the response body. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/commit/650f1ffd3731f6a1f4cc703430be1b1b6f5d1cee",children:"650f1ffd"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"API"})," renames the ",(0,s.jsx)(i.code,{children:"changelog_list"})," field in the response body to ",(0,s.jsx)(i.code,{children:"changelog"}),". ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/commit/719f0b1eff92f358d246ededd6c1e6f9863f7f85",children:"719f0b1e"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," changes the log output format from an array to text format that is compatible with Markdown lists. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/commit/719f0b1eff92f358d246ededd6c1e6f9863f7f85",children:"719f0b1e"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," some privacy-related configuration keys or tokens are only displayed in plaintext under administrator permissions; other permissions cannot see them; demo mode is read-only and will do some encryption. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/644",children:"#644"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," does not display the build date and hash value if they cannot be obtained."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"added-11",children:"Added"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," supports parsing of the Android App Bundle (aab) file format and webp icons."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," supports language internationalization, with optional language packs: Simplified Chinese, English (support for page configuration)."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," supports configuring more system settings. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/643",children:"#643"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," adds editing functionality for network hooks in the management panel."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," rewrites and optimizes the style layout of the application list."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," optimizes the basic email template."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," adjusts the style and error logic of the login window."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," adds file permission checking to the environment variable page in the management panel. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/608",children:"#608"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," adds error details display for asynchronous tasks in the management panel, with a maximum of 5000 errors."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," uses a better log output format. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/646",children:"#646"})]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"fixed-13",children:"Fixed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where the default selection state of boolean type parameters is incorrect on the settings page."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where exceptions occur when clicking install or download in the DingTalk app (changed to WeChat logic processing)."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where the build date (time stamp when building a Docker image) cannot be displayed on the environment page."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where the domain scope of asynchronous notifications does not take effect."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue of exception when getting gems."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue of abnormal judgment of the expiration time of iOS certificates."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where disk space cannot be obtained when developing with a virtual machine mounted."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes some known errors in demo mode."]}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"422-2021-10-15",children:"4.2.2 (2021-10-15)"}),"\n",(0,s.jsxs)(i.p,{children:["Full ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/compare/4.2.1...4.2.2",children:"commit changes"}),"."]}),"\n",(0,s.jsx)(i.h4,{id:"fixed-14",children:"Fixed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"API"})," fixes the issue where incorrect error messages were not output due to parameter mismatches caused by batch replacements. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/issues/615",children:"#615"})," Thanks to ",(0,s.jsx)(i.a,{href:"https://github.com/gin7758258",children:"gin7758258"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue of abnormal parsing of some apk Android files. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/529",children:"#587"})]}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"421-2021-09-14",children:"4.2.1 (2021-09-14)"}),"\n",(0,s.jsxs)(i.p,{children:["Full ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/compare/4.2.0...4.2.1",children:"commit changes"}),"."]}),"\n",(0,s.jsx)(i.h4,{id:"changed-10",children:"Changed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," application icons are no longer cropped to the preset size, and image processing dependencies have been removed, reducing the Docker image size by nearly 200MB."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Docker"})," the reverse proxy service Caddy no longer outputs logs to STDOUT but directly to files."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"fixed-15",children:"Fixed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where icons are not displayed correctly after uploading an application."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," is compatible with different dSYM zip extraction logics when uploading."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where the application icon is not displayed when installing iOS applications."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes a security vulnerability by disabling the editing of read-only system settings."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where the downloaded file suffix is not correct on macOS."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where the window showing that an installation is not possible does not pop up in some cases."]}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"420-2021-09-01",children:"4.2.0 (2021-09-01)"}),"\n",(0,s.jsxs)(i.p,{children:["Full ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/compare/4.1.0...4.2.0",children:"commit changes"}),"."]}),"\n",(0,s.jsx)(i.h4,{id:"changed-11",children:"Changed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," changes the default logic for cleaning up old versions to off. To enable, set the environment variable ",(0,s.jsx)(i.code,{children:"ZEALOT_KEEP_UPLOADS=false"}),". ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/570",children:"#570"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," renames File Parsing to Application Unpacking. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/529",children:"#529"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," removes support for unpacking previously uploaded applications in the application unpacking feature. (now all uploaded applications will automatically trigger additional application unpacking)"]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"API"})," supports fontawesome css values for custom field icons when uploading applications, such as the value ",(0,s.jsx)(i.code,{children:"fas fa-flag"})," for ",(0,s.jsx)(i.a,{href:"https://fontawesome.com/v5.15/icons/flag?style=solid",children:"flag"}),"."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Docker"})," changes the image to use caddy as a reverse proxy and modifies the volume persistence. Migration is required, see ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/540",children:"#540"})," for details."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"added-12",children:"Added"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," supports uploading, parsing, and downloading macOS applications. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/562",children:"#562"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," adds quick filtering options for application types and channels for mobile devices on the channel details page. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/issues/510",children:"#510"})," Thanks to ",(0,s.jsx)(i.a,{href:"https://github.com/huacnlee",children:"huacnlee"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," allows the administrator panel to configure application type templates and default registration user permissions. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/562",children:"#562"})," ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/568",children:"#568"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," partially encrypts environment variables that involve privacy."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," adds graphical displays for memory and disk usage."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Docker"})," adds support for synchronizing updates with ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pkgs/container/zealot",children:"Github Container Registry"})," images."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Docker"})," adds support for configuring the postgres port number with environment variables."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"fixed-16",children:"Fixed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where the iOS installation button cannot be displayed on iPad and M1 chip macOS. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/issues/519",children:"#519"})," Thanks to ",(0,s.jsx)(i.a,{href:"https://github.com/ohdarling",children:"ohdarling"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where using third-party login while registering but not verifying email fails. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/issues/517",children:"#517"})," Thanks to ",(0,s.jsx)(i.a,{href:"https://github.com/huacnlee",children:"huacnlee"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where uploading an application through the website does not trigger application unpacking."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where the left navigation style is misaligned when tubrolink is enabled."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," displays the unpacking link when uploading Android applications."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," optimizes the display prompt for empty unpacking file lists."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where LDAP parameters are obtained incorrectly. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/542",children:"#541"})," Thanks to ",(0,s.jsx)(i.a,{href:"https://github.com/Martwu",children:"Martwu"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," changes the error message for capturing application upload errors to a readable format."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where the application type creation error judgment is abnormal."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," adds an exception judgment for clicking the details page when all channels of an application are deleted."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where uploading applications causes variable release errors in the parsing process."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where an error occurs when verifying password protection for an application. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/issues/564",children:"#564"})," Thanks to ",(0,s.jsx)(i.a,{href:"https://github.com/EasierLu",children:"EasierLu"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where editing user information in the administrator panel causes an error. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/issues/564",children:"#564"})," Thanks to ",(0,s.jsx)(i.a,{href:"https://github.com/EasierLu",children:"EasierLu"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"}),' fixes the issue where the "Install" button on the application details page is displayed abnormally on incorrect systems and devices (normally only iOS applications are displayed on iOS and macOS devices).']}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," optimizes the unpacking of applications for developer certificates that fail to parse due to special character sets (currently known to be Chinese encoding) and UI layout adjustments."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where the current user cannot be edited."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," corrects the duplicate title of debug files."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Docker"})," fixes the logrotate error during image initialization."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Docker"})," fixes the issue where Caddy deployment needs to be confirmed. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/issues/551",children:"#551"})," Thanks to ",(0,s.jsx)(i.a,{href:"https://github.com/ReverseScale",children:"ReverseScale"})]}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"410-2021-07-17",children:"4.1.0 (2021-07-17)"}),"\n",(0,s.jsxs)(i.p,{children:["Full ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/compare/4.0.0...4.1.0",children:"commit changes"}),"."]}),"\n",(0,s.jsx)(i.h4,{id:"changed-12",children:"Changed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," changes the display logic for obtaining device UDID due to the similarity of iPad's User-Agent and Desktop."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Docker"})," sets Gihub Container Registry (gcr.io) as the default Docker image source."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"added-13",children:"Added"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," supports one-click login authentication for third-party platforms such as Feishu and Gitlab."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," optimizes the logic for accessing the version details page of an application that cannot be found and allows manual redirection to the latest version."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," adds the ability to view some system configuration items and modify some parameters without requiring a restart."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," adds a page statistics report to the management panel."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"fixed-17",children:"Fixed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where the network hook cannot obtain the value of the title variable."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the abnormal error during application parsing process."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the abnormal error that occurs during application creation."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where system configuration cannot be edited due to being saved as empty."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Job"})," fixes the issue where the logic for removing old versions causes the deletion logic and document logic to be reversed."]}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"400-2020-12-31",children:"4.0.0 (2020-12-31)"}),"\n",(0,s.jsxs)(i.p,{children:["Full ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/compare/4.0.0.rc2...4.0.0",children:"commit changes"}),"."]}),"\n",(0,s.jsx)(i.h4,{id:"fixed-18",children:"Fixed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," corrects the display error caused by abnormal judgment of the expiration time of the iOS certificate during file parsing."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," ignores the default development version number check for new versions."]}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"400rc2-2020-12-25",children:"4.0.0.rc2 (2020-12-25)"}),"\n",(0,s.jsxs)(i.p,{children:["Full ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/compare/4.0.0.rc1...4.0.0.rc2",children:"commit changes"}),"."]}),"\n",(0,s.jsx)(i.h4,{id:"added-14",children:"Added"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," newly parsed files will be saved to the list, and a file parsing for uploaded applications will also be synchronized. (asynchronous task) ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/346",children:"#346"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," adds file parsing data statistics to the control panel."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," adds data statistics for network hooks, background tasks, and disk usage for administrators in the control panel."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," adds a quick delete function for authorized personnel to the prompt for missing files in the version details."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"changed-13",children:"Changed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"API"})," The debug file version check interface has been renamed, and new check methods based on file fingerprints and dSYM UUID have been added. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/346",children:"#349"})]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"fixed-19",children:"Fixed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the error when disabling LDAP login authentication. (caused by incorrect IP whitelist settings)"]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," corrects the wording of the prompt when opening the version details in WeChat for Android."]}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"400rc1-2020-10-29",children:"4.0.0.rc1 (2020-10-29)"}),"\n",(0,s.jsxs)(i.p,{children:["Full ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/compare/4.0.0.beta4...4.0.0.rc1",children:"commit changes"}),"."]}),"\n",(0,s.jsx)(i.h4,{id:"changed-14",children:"Changed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Docker"})," ",(0,s.jsx)(i.strong,{children:"major change"})," merges rails and worker into the same image for deployment. zealot-docker library needs to be updated accordingly ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/235",children:"#235"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Docker"})," upgrades Ruby to version 2.7 for deployment."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," upgrades font-awesome from version 4.7.0 to 5.13.0, which may cause missing icons to display improperly."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," adjusts the wording of invitation emails."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," unifies the download path for applications and debugging files to ",(0,s.jsx)(i.code,{children:"/download"})," path."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," requires login permission for online application parsing."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," optimizes the logic for automatically redirecting to the latest version when accessing deleted or non-existent version details."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," adjusts the installation and download logic of applications (mainly due to the inability to distinguish between iPadOS UserAgent and Desktop)."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"added-15",children:"Added"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," displays a prompt when downloading files that do not exist."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," supports parsing .mobileprovision format files and enabling the parsing of .ipa files online."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," allows some system settings to be modified online using the administrator panel. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/245",children:"#245"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," adds guest mode. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/243",children:"#243"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," supports displaying the names of iOS AdHoc version test devices. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/211",children:"#211"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," supports parsing the content of uploaded version installation packages. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/210",children:"#210"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," supports obtaining the UDID of iOS devices. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/203",children:"#203"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," supports a demo mode with limited functionality and periodic data initialization. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/198",children:"#198"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," displays the original name of the application in the version details after uploading the App."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," allows filtering of the application list by version, Git branch, and packaging type."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," displays the Git commit link associated with the latest upload in the version details. (if the git URL is set in the channel settings)"]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," integrates LDAP login into the existing login interface and no longer uses the crude interface provided by third-party dependencies."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Job"})," supports managing the generation and recovery of data backup using rails commands. (database and uploaded file data) ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/207",children:"#207"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"API"})," adds an interface to check if the debug file exists ",(0,s.jsx)(i.code,{children:"/api/debug_files/version_exist"}),"."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"fixed-20",children:"Fixed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the error when parsing changelog during App upload."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where the QR code in the version details will exceed the parent view in medium resolution."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where some values of the application channel are empty and the default value is not displayed."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," optimizes the content display when parsing iOS packages online. (and solves the problem of always displaying fake data)"]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where the information of the submitter is not displayed for changelogs generated using ",(0,s.jsx)(i.a,{href:"https://github.com/icyleaf/fastlane-plugin-ci_changelog",children:"fastlane-plugin-ci_changelog"})," in the version details."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes and optimizes the logic for checking new versions."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where the pop-up window for confirming the deletion of debug files displays an empty message."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," optimizes the display of the device list in the version details on some mobile phones."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the error when parsing applications without submitting parameters."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," optimizes the display of the version list on mobile phones."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," only displays the bottom pagination for the latest upload dynamics of channel versions, and the top displays the total number of versions."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where the administrator editing user prompt for a non-empty password."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"}),"/",(0,s.jsx)(i.code,{children:"API"})," fixes the issue where the latest version is used when the requested version for online download and installation does not exist."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where the login interface displays the sidebar menu in guest mode."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where the same debugging file of the same application and platform is always overwritten when uploaded."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," optimizes the display of boolean and dictionary types on the system settings page."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Job"})," fixes the issue where old versions were accidentally deleted due to a version judgment error during scheduled cleaning."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Docker"})," fixes the issue where the internal static resources are not updated due to volume storage of the public folder."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Docker"})," fixes the issue where the container version is inconsistent with the external version."]}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"400beta4-2020-05-07",children:"4.0.0.beta4 (2020-05-07)"}),"\n",(0,s.jsxs)(i.p,{children:["Full ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/compare/4.0.0.beta3...4.0.0.beta4",children:"commit changes"}),"."]}),"\n",(0,s.jsx)(i.h4,{id:"added-16",children:"Added"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Docker"})," supports deployment on Heroku."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," allows guests to view App details, lists, and upload App details."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"API"})," supports custom fields when uploading an App. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/issues/178",children:"#178"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"}),"/",(0,s.jsx)(i.code,{children:"API"})," automatically removes the ",(0,s.jsx)(i.code,{children:"origin/"})," prefix when passing the ",(0,s.jsx)(i.code,{children:"branch"})," value during App upload."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," adds project introduction to user authentication interfaces such as login, registration, password retrieval, and password resetting."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"fixed-21",children:"Fixed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," corrects user password description text."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the URL field error in the WebHook."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"}),"/",(0,s.jsx)(i.code,{children:"API"})," fixes the error when uploading iOS dSYM files."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"API"})," fixes the abnormal has_password parameter in the App interface."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"API"})," fixes the source of uploaded App records always showing as Web."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"API"})," fixes and supports uploading changelog in JSON format as a string."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where CPU and memory information cannot be retrieved from system information."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the occasional error when parsing Android applications online."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the error when scanning QR code with WeChat."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"changed-15",children:"Changed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"API"})," adds validation for bundle_id dimension to the latest version interface. (apps/latest)"]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," allows guests to access application version details and download operations."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," shifts the device list on the right-hand side of iOS AdHoc application version details to the left and collapses it by default."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," removes the GraphQL console functionality from the development environment and recommends using ",(0,s.jsx)(i.a,{href:"https://github.com/prisma-labs/graphql-playground",children:"graphql-playground"}),"."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," removes the footbar at the bottom of the page, and the version information can be viewed in the system information."]}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"400beta3-2020-01-16",children:"4.0.0.beta3 (2020-01-16)"}),"\n",(0,s.jsxs)(i.p,{children:["Full ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/compare/4.0.0.beta2...4.0.0.beta3",children:"commit changes"}),"."]}),"\n",(0,s.jsx)(i.h4,{id:"added-17",children:"Added"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," prompts and displays a confirmation email link for users added by administrators if their email is not activated."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," enables the default Sentry anonymous reporting mechanism (can be turned off)."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"fixed-22",children:"Fixed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"API"})," fixes the issue where uploading an application always creates a new channel."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"}),"/",(0,s.jsx)(i.code,{children:"API"})," fixes the issue where the icon of uploaded Android applications cannot be displayed."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"changed-16",children:"Changed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Docker"})," moves the initialization data out of the image and into ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot-docker",children:"zealot-docker"})," image. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/120",children:"#120"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Docker"})," reduces the size of the image from 1.18G to 308M. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/issues/114",children:"#114"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Job"})," uses asynchronous tasks instead of traditional cron jobs to implement scheduled cleaning of old version history package files. (can be turned off)"]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Job"})," groups asynchronous tasks and sets priority."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"API"})," displays all error messages in Chinese because database write operations return specific error messages."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," standardizes code using Rubocop Lint rules."]}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"400beta2-2020-01-10",children:"4.0.0.beta2 (2020-01-10)"}),"\n",(0,s.jsxs)(i.p,{children:["Full ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/compare/4.0.0.beta1...4.0.0.beta2",children:"commit changes"}),"."]}),"\n",(0,s.jsx)(i.h4,{id:"added-18",children:"Added"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," Added the ability to upload a complete version list to a specific application channel, and support deleting operations."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"fixed-23",children:"Fixed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," provides an error prompt instead of an error message when uploading an application that is not a valid ipa or apk."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"API"})," fixes the issue where the latest version list of an application cannot be returned due to the non-existence of the queried version number in the database."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"API"})," only requires token verification for interfaces that perform write operations (previously most interfaces required it)."]}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"400beta1",children:"4.0.0.beta1"}),"\n",(0,s.jsx)(i.p,{children:"\ud83c\udf08 The first public beta version has been released!"}),"\n",(0,s.jsx)(i.h2,{id:"previous-version",children:"Previous Version"}),"\n",(0,s.jsx)(i.p,{children:"For many years, it was developed and operated internally within the company and was not open source.\nIt used to undertake many functions, but now it has been separated to focus on providing\napplication hosting and distribution services"})]})}function h(e={}){const{wrapper:i}={...(0,d.a)(),...e.components};return i?(0,s.jsx)(i,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},1151:(e,i,n)=>{n.d(i,{Z:()=>r,a:()=>t});var s=n(7294);const d={},l=s.createContext(d);function t(e){const i=s.useContext(l);return s.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function r(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(d):e.components||d:t(e.components),s.createElement(l.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/c53e755e.dd9bdd07.js b/assets/js/c53e755e.dd9bdd07.js deleted file mode 100644 index dfa128800..000000000 --- a/assets/js/c53e755e.dd9bdd07.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[7322],{9198:(e,i,n)=>{n.r(i),n.d(i,{assets:()=>o,contentTitle:()=>t,default:()=>h,frontMatter:()=>l,metadata:()=>r,toc:()=>a});var s=n(5893),d=n(1151);const l={},t="Change Log",r={id:"user-guide/changelog",title:"Change Log",description:"Unreleased",source:"@site/docs/user-guide/changelog.md",sourceDirName:"user-guide",slug:"/user-guide/changelog",permalink:"/docs/next/user-guide/changelog",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/docs/user-guide/changelog.md",tags:[],version:"current",frontMatter:{},sidebar:"userGuide",previous:{title:"Best Practices",permalink:"/docs/next/user-guide/best_practices"},next:{title:"Q&A",permalink:"/docs/next/user-guide/qa"}},o={},a=[{value:"Unreleased",id:"unreleased",level:2},{value:"5.1.0 (2023-12-07)",id:"510-2023-12-07",level:2},{value:"Changed",id:"changed",level:4},{value:"Added",id:"added",level:4},{value:"Fixed",id:"fixed",level:4},{value:"5.0.0 (2023-09-06)",id:"500-2023-09-06",level:2},{value:"Changed",id:"changed-1",level:4},{value:"Added",id:"added-1",level:4},{value:"Fixed",id:"fixed-1",level:4},{value:"4.7.1 (2023-03-10)",id:"471-2023-03-10",level:2},{value:"Changed",id:"changed-2",level:4},{value:"Fixed",id:"fixed-2",level:4},{value:"Added",id:"added-2",level:4},{value:"4.7.0 (2023-03-03)",id:"470-2023-03-03",level:2},{value:"Changed",id:"changed-3",level:4},{value:"Added",id:"added-3",level:4},{value:"Fixed",id:"fixed-3",level:4},{value:"4.6.0 (2023-01-17)",id:"460-2023-01-17",level:2},{value:"Fixed",id:"fixed-4",level:4},{value:"Added",id:"added-4",level:4},{value:"Changed",id:"changed-4",level:4},{value:"4.5.3 (2022-11-22)",id:"453-2022-11-22",level:2},{value:"Fixed",id:"fixed-5",level:4},{value:"Added",id:"added-5",level:4},{value:"4.5.2 (2022-11-01)",id:"452-2022-11-01",level:2},{value:"Fixed",id:"fixed-6",level:4},{value:"Added",id:"added-6",level:4},{value:"Changed",id:"changed-5",level:4},{value:"4.5.1 (2022-09-14)",id:"451-2022-09-14",level:2},{value:"Fixed",id:"fixed-7",level:4},{value:"4.5.0 (2022-08-19)",id:"450-2022-08-19",level:2},{value:"Added",id:"added-7",level:4},{value:"Changed",id:"changed-6",level:4},{value:"Fixed",id:"fixed-8",level:4},{value:"4.4.1 (2022-06-20)",id:"441-2022-06-20",level:2},{value:"Fixed",id:"fixed-9",level:4},{value:"4.4.0 (2022-06-09)",id:"440-2022-06-09",level:2},{value:"Changed",id:"changed-7",level:4},{value:"Added",id:"added-8",level:4},{value:"Fixed",id:"fixed-10",level:4},{value:"4.3.1 (2021-12-22)",id:"431-2021-12-22",level:2},{value:"Added",id:"added-9",level:4},{value:"Fixed",id:"fixed-11",level:4},{value:"4.3.0 (2021-12-08)",id:"430-2021-12-08",level:2},{value:"Changed",id:"changed-8",level:4},{value:"Added",id:"added-10",level:4},{value:"Fixed",id:"fixed-12",level:4},{value:"4.2.2 (2021-10-15)",id:"422-2021-10-15",level:2},{value:"Fixed",id:"fixed-13",level:4},{value:"4.2.1 (2021-09-14)",id:"421-2021-09-14",level:2},{value:"Changed",id:"changed-9",level:4},{value:"Fixed",id:"fixed-14",level:4},{value:"4.2.0 (2021-09-01)",id:"420-2021-09-01",level:2},{value:"Changed",id:"changed-10",level:4},{value:"Added",id:"added-11",level:4},{value:"Fixed",id:"fixed-15",level:4},{value:"4.1.0 (2021-07-17)",id:"410-2021-07-17",level:2},{value:"Changed",id:"changed-11",level:4},{value:"Added",id:"added-12",level:4},{value:"Fixed",id:"fixed-16",level:4},{value:"4.0.0 (2020-12-31)",id:"400-2020-12-31",level:2},{value:"Fixed",id:"fixed-17",level:4},{value:"4.0.0.rc2 (2020-12-25)",id:"400rc2-2020-12-25",level:2},{value:"Added",id:"added-13",level:4},{value:"Changed",id:"changed-12",level:4},{value:"Fixed",id:"fixed-18",level:4},{value:"4.0.0.rc1 (2020-10-29)",id:"400rc1-2020-10-29",level:2},{value:"Changed",id:"changed-13",level:4},{value:"Added",id:"added-14",level:4},{value:"Fixed",id:"fixed-19",level:4},{value:"4.0.0.beta4 (2020-05-07)",id:"400beta4-2020-05-07",level:2},{value:"Added",id:"added-15",level:4},{value:"Fixed",id:"fixed-20",level:4},{value:"Changed",id:"changed-14",level:4},{value:"4.0.0.beta3 (2020-01-16)",id:"400beta3-2020-01-16",level:2},{value:"Added",id:"added-16",level:4},{value:"Fixed",id:"fixed-21",level:4},{value:"Changed",id:"changed-15",level:4},{value:"4.0.0.beta2 (2020-01-10)",id:"400beta2-2020-01-10",level:2},{value:"Added",id:"added-17",level:4},{value:"Fixed",id:"fixed-22",level:4},{value:"4.0.0.beta1",id:"400beta1",level:2},{value:"Previous Version",id:"previous-version",level:2}];function c(e){const i={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h4:"h4",li:"li",p:"p",strong:"strong",ul:"ul",...(0,d.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(i.h1,{id:"change-log",children:"Change Log"}),"\n",(0,s.jsx)(i.h2,{id:"unreleased",children:"Unreleased"}),"\n",(0,s.jsx)(i.admonition,{type:"tip",children:(0,s.jsxs)(i.p,{children:["The following list of changes is the list that has not yet been released, code change history: ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/compare/5.1.0...HEAD",children:"Unreleased"})]})}),"\n",(0,s.jsx)(i.p,{children:"Empty changelog."}),"\n",(0,s.jsx)(i.h2,{id:"510-2023-12-07",children:"5.1.0 (2023-12-07)"}),"\n",(0,s.jsxs)(i.p,{children:["Mainly functional fixes, with minor upgrades to new features. Full ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/compare/4.7.1...5.0.0",children:"commit changes"}),"."]}),"\n",(0,s.jsx)(i.h4,{id:"changed",children:"Changed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Docker"})," ",(0,s.jsx)(i.strong,{children:"Major Change"})," The minimum version of Redis dependencies has been updated from 5.x to 6.2+. It is recommended to use version 7.x. When upgrading, please manually modify the settings."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"added",children:"Added"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Docker"})," added Redis and PostgreSQL version checks; running below minimum versions may cause malfunction."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Docker"})," service initializes by creating databases during startup."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," enhanced validation conditions for JSON format settings on the settings page."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"fixed",children:"Fixed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," checks disk space upon upload to determine file existence."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixed debug file association with application versions."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," resolved issue where the application unpack details page wasn't displaying the list of testing devices."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," optimized display information on error pages for application versions."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," improved display for long package names of mobile device applications."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," optimized some page styles and the display of English language."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"API/Web"})," fixed issue where the Android app parsing icon in webp format failed to convert to png."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"API"})," resolved GraphQL user authentication."]}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"500-2023-09-06",children:"5.0.0 (2023-09-06)"}),"\n",(0,s.jsxs)(i.p,{children:["Any archived package of application supportted (e.g. ",(0,s.jsx)(i.code,{children:"Windows"})," or ",(0,s.jsx)(i.code,{children:"Linux"}),")). Full ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/compare/4.7.1...5.0.0",children:"commit changes"}),"."]}),"\n",(0,s.jsx)(i.h4,{id:"changed-1",children:"Changed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Docker"})," ",(0,s.jsx)(i.strong,{children:"Major Change"})," The minimum version of Redis dependencies has been updated from 5.x to 6.2+. It is recommended to use version 7.x. When upgrading, please manually modify the settings."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"added-1",children:"Added"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"}),"/",(0,s.jsx)(i.code,{children:"API"})," supports hosting of general applications (those that can be parsed automatically and those that cannot be parsed are skipped), and Windows and Linux platforms are added by default ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/1121",children:"#1121"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"}),"/",(0,s.jsx)(i.code,{children:"API"})," adds support for hosting Windows applications (uploading and displaying metadata parsing) ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/1124",children:"#1124"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," has a new debugging file page and adds support for parsing and hosting multiple dSYM debugging files ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/1127",children:"#1127"})," ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/1124",children:"#1124"})," ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/issues/961",children:"#961"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," supports unpacking v1, v2, and v3 signature information for Android applications ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/1124",children:"#1124"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," strengthens X509 certificate information for unpacking Android and iOS applications ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/1124",children:"#1124"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"}),' adds a "Reparse" function to update the metadata of old structure debugging files']}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," supports markdown format for change logs of uploaded application versions"]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"}),' settings page can configure the global "minimum number of items returned per page" and "maximum number of items"']}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," for iOS applications, the application version details page displays the expiration time information of the signing certificate and the logical restriction of installation failure due to expired signing certificate (can be downloaded)"]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," adds or updates JSON format verification to network hooks and settings pages."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," supports registering test devices to Apple developers with custom device names and editing/updating device names after creation."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," supports downloading private key certificates for Apple developers."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"fixed-1",children:"Fixed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue of being unable to delete unpacked applications"]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," optimizes the style of some pages"]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," corrects errors in the English language package (en language i18n)"]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the error page that appears when creating an empty application type"]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the 404 error page that appears when a file is not found."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"API"})," fixes the logic optimization of comparing build_version for retrieving the latest version of an application."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," optimizes the error handling for custom field format during application upload."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," optimizes the correct redirection for URL injection, empty application history versions, and unregistered devices."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," optimizes the display of error information for backup tasks."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," adds type detection for application types and debug files during application upload."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the error message of not preselecting the creation of a Distribution Certificate for Apple developers."]}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"471-2023-03-10",children:"4.7.1 (2023-03-10)"}),"\n",(0,s.jsx)(i.p,{children:"Support for parsing aab applications generated by the latest Android aapt2 build tool, full [commit changes][4.7.1]."}),"\n",(0,s.jsx)(i.h4,{id:"changed-2",children:"Changed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Docker"})," ",(0,s.jsx)(i.strong,{children:"Major Change"})," The minimum version of Redis dependencies has been updated from 5.x to 6.2+. It is recommended to use version 7.x. When upgrading, please manually modify the settings."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"fixed-2",children:"Fixed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," upgrades to the latest appt2 model to avoid exceptions when parsing aab files."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," implements duplicate processing for parsing exceptions."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"added-2",children:"Added"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," adds application types to the details page of unpacked Android applications."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," adjusts the original page after editing an application channel."]}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"470-2023-03-03",children:"4.7.0 (2023-03-03)"}),"\n",(0,s.jsxs)(i.p,{children:[(0,s.jsx)(i.strong,{children:"Major Change"})," The minimum version of Redis dependencies has been updated from 5.x to 6.2+. Full ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/compare/4.6.0...4.7.0",children:"commit changes"}),"."]}),"\n",(0,s.jsx)(i.h4,{id:"changed-3",children:"Changed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Docker"})," ",(0,s.jsx)(i.strong,{children:"Major Change"})," The minimum version of Redis dependencies has been updated from 5.x to 6.2+. It is recommended to use version 7.x. When upgrading, please manually modify the settings."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"added-3",children:"Added"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"}),' adds a control switch for "New Upload Version Prompt Window" to application types. ',(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/1058",children:"#1058"})," Thanks to ",(0,s.jsx)(i.a,{href:"https://github.com/softwind0214",children:"softwind0214"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," allows clicking on the application icon on the application list page to jump to the application details page."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," adds the display of the version number of dependent services to the environment information."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," adds support for displaying nightly build versions in the version number."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"fixed-3",children:"Fixed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," downgrades Ruby version to 3.0 temporarily to solve the iOS application parsing crash caused by the high version. See ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/issues/1070",children:"#1070"})," for details."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the display order of applications/types/channels, which is now fixed as ascending order of creation time."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where there is no confirmation prompt when a user logs out."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where the main historical version of an application cannot be deleted."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," improves the style of multiple pages."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," no longer displays Javascript debugger logs in production environments."]}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"460-2023-01-17",children:"4.6.0 (2023-01-17)"}),"\n",(0,s.jsxs)(i.p,{children:["The runtime environment has been upgraded to Ruby 3.2 and now supports arm64 platforms. Full ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/compare/4.5.3...4.6.0",children:"commit changes"}),"."]}),"\n",(0,s.jsx)(i.h4,{id:"fixed-4",children:"Fixed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," captures the issue of creating an application channel with an empty name. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/issues/968",children:"#968"})," Thanks to ",(0,s.jsx)(i.a,{href:"https://github.com/congpeijun",children:"congpeijun"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," improves the logic for backup files that do not exist on disk. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/issues/995",children:"#995"})]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"added-4",children:"Added"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Docker"})," supports arm64/v8 and armv7 arch. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/970",children:"#970"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," Adopted a new 50x error page."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"changed-4",children:"Changed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," upgrades the Ruby version to 3.2 in development environments, and devcontainers and containers now have the YJIT feature enabled by default. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/1011",children:"#1011"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"API"})," updates the data structure of the debug file return and changes the status code from 204 to 200."]}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"453-2022-11-22",children:"4.5.3 (2022-11-22)"}),"\n",(0,s.jsxs)(i.p,{children:["Full ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/compare/4.5.2...4.5.3",children:"commit changes"}),"."]}),"\n",(0,s.jsx)(i.h4,{id:"fixed-5",children:"Fixed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," Fixes the issue where third-party login cannot be redirected. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/issues/949",children:"#949"})," Thanks to ",(0,s.jsx)(i.a,{href:"https://github.com/softwind0214",children:"softwind0214"})]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"added-5",children:"Added"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Docker"})," Adds a new environment variable to disable the request protection of WebSocket (ActionCable) requests (experimental). ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/950",children:"#950"})]}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"452-2022-11-01",children:"4.5.2 (2022-11-01)"}),"\n",(0,s.jsxs)(i.p,{children:["Full ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/compare/4.5.1...4.5.2",children:"commit changes"}),"."]}),"\n",(0,s.jsx)(i.h4,{id:"fixed-6",children:"Fixed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where registering a test device is abnormal. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/issues/935",children:"#935"})," Thanks to ",(0,s.jsx)(i.a,{href:"https://github.com/ycy0430",children:"ycy0430"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," adapts the QR code to support dark mode."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," corrects the English language pack."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"added-6",children:"Added"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"WebHook"})," Income webhook body structure adds the ",(0,s.jsx)(i.code,{children:"username"})," and ",(0,s.jsx)(i.code,{children:"email"})," fields. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/issues/934",children:"#934"})," Thanks to ",(0,s.jsx)(i.a,{href:"https://github.com/rkonfj",children:"rkonfj"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Docker"})," The ",(0,s.jsx)(i.code,{children:"SIDEKIQ_CONCURRENCY"})," environment variable is now supported to set the concurrency of background tasks, with a default value of 5."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"changed-5",children:"Changed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Docker"})," reduces security risks by changing the Web service, which includes puma and pumacontrolserver, to listen on ",(0,s.jsx)(i.code,{children:"127.0.0.1"}),"."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," optimizes the wording of the iOS device UDID profile."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," updates the text at the bottom of the page. Thanks to Rails and the AdminLTE open source project!"]}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"451-2022-09-14",children:"4.5.1 (2022-09-14)"}),"\n",(0,s.jsxs)(i.p,{children:["Full ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/compare/4.5.0...4.5.1",children:"commit changes"})]}),"\n",(0,s.jsx)(i.h4,{id:"fixed-7",children:"Fixed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," Fixes the issue where the application unpacking results in parsing errors."]}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"450-2022-08-19",children:"4.5.0 (2022-08-19)"}),"\n",(0,s.jsxs)(i.p,{children:["Supports the \ud83c\udf11 dark mode and managing the test devices of an \ud83d\udc68\ud83c\udffb\u200d\ud83d\udd27 Apple developer account! Full ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/compare/4.4.1...4.5.0",children:"commit changes"}),"."]}),"\n",(0,s.jsx)(i.h4,{id:"added-7",children:"Added"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," supports dark mode. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/816",children:"#816"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," adds Apple developer management for registering test devices. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/817",children:"#817"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," adds data backup management. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/835",children:"#835"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," completes the monitoring of dependent services in the management panel. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/issues/586",children:"#586"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"API"})," adds three fields, ",(0,s.jsx)(i.code,{children:"platform"}),", ",(0,s.jsx)(i.code,{children:"device_type"}),", and ",(0,s.jsx)(i.code,{children:"custom_fields"}),", to the release dictionary."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"changed-6",children:"Changed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," ",(0,s.jsx)(i.strong,{children:"Incompatible change"})," Google Analytics forces an upgrade to version 4, and previous settings need to be reconfigured to take effect. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/815",children:"#815"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"CLI"})," ",(0,s.jsx)(i.strong,{children:"Incompatible change"})," The data backup and restore functionality is no longer available due to changes in the structure. Please use the data backup function in the admin panel instead."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," adjusts the display of device UDID acquisition, iOS version installation and download based on the device, no longer displaying all functions."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," removes the page statistics function in the admin panel. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/814",children:"#814"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," migrates the front-end technology stack from webpacker to esbuild + sass, and from Turbolinks to Stimulus, bringing a better front-end interaction experience. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/829",children:"#829"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," due to the complexity of editing application types and channels, only the application name can be modified."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"fixed-8",children:"Fixed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the error of selecting a channel that does not exist under an application type. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/issues/795",children:"#795"})," Thanks to ",(0,s.jsx)(i.a,{href:"https://github.com/tasselsd",children:"tasselsd"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"API"})," fixes the Android address return error. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/issues/813",children:"#813"})," Thanks to ",(0,s.jsx)(i.a,{href:"https://github.com/denymz",children:"denymz"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"}),"/",(0,s.jsx)(i.code,{children:"API"})," fixes the exception caused by some parameters being empty in aab parsing. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/fastlane-plugin-zealot/issues/9",children:"tryzealot/fastlane-plugin-zealot#9"})," Thanks to ",(0,s.jsx)(i.a,{href:"https://github.com/tasselsd",children:"tasselsd"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue of abnormal generation of demo data during the first initialization of the project. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/issues/821",children:"#821"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"API"})," fixes the issue of abnormal data when checking the latest version of the application. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/issues/856",children:"#856"})," Thanks to ",(0,s.jsx)(i.a,{href:"https://github.com/denymz",children:"denymz"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue of an error being thrown due to abnormal data in the associated network hook when viewing the details of an application channel."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," corrects many spelling errors in the English language pack."]}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"441-2022-06-20",children:"4.4.1 (2022-06-20)"}),"\n",(0,s.jsxs)(i.p,{children:["Full ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/compare/4.4.0...4.4.1",children:"commit changes"})]}),"\n",(0,s.jsx)(i.h4,{id:"fixed-9",children:"Fixed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"WebHook"})," fixes the issue where an error is thrown after a successful trigger. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/issues/792",children:"#792"})," Thanks to ",(0,s.jsx)(i.a,{href:"https://github.com/tasselsd",children:"tasselsd"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Docker"})," compatible with Caddy 2.5.0 for proxying from https to http. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/790",children:"#790"})," Thanks to ",(0,s.jsx)(i.a,{href:"https://github.com/VisionBao",children:"VisionBao"})," ",(0,s.jsx)(i.a,{href:"https://github.com/songge1209",children:"songge1209"})]}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"440-2022-06-09",children:"4.4.0 (2022-06-09)"}),"\n",(0,s.jsxs)(i.p,{children:["Full ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/compare/4.3.1...4.4.0",children:"commit changes"}),"."]}),"\n",(0,s.jsx)(i.h4,{id:"changed-7",children:"Changed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," adds filtering by version, branch, and packaging type to the list display for users who are not logged in and have not enabled guest mode, in addition to viewing application version details."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," upgrades the runtime environment to Ruby 3.0 and the service framework to Rails 7.0."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," is now compatible with the macOS M1 chip."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"added-8",children:"Added"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," simplifies and standardizes some application links to facilitate sharing. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/666",children:"#666"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," completes some missing permission check pages."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"fixed-10",children:"Fixed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Job"})," fixes the issue of abnormal URL Schemes when parsing iOS files."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where service logs are not output to the terminal console."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," adds exception handling for processing debug files uploaded when they are deleted during parsing or cannot be found for other reasons."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," adapts the UI for ultra-wide screens."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes security vulnerabilities in third-party login dependencies."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"API"})," fixes the issue where uploading Android without channel_key results in an exception. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/issues/779",children:"#779"})," Thanks to ",(0,s.jsx)(i.a,{href:"https://github.com/likfe",children:"likfe"})]}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"431-2021-12-22",children:"4.3.1 (2021-12-22)"}),"\n",(0,s.jsxs)(i.p,{children:["Full ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/compare/4.3.0...4.3.1",children:"commit changes"}),"."]}),"\n",(0,s.jsx)(i.h4,{id:"added-9",children:"Added"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," after updating the setting, the original default value can be restored."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," supports parsing and displaying app links (distinguishing between deep links and URL schemes) for Android in application unpacking."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," strengthens the visual effect of the open and closed status of the setting page."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"fixed-11",children:"Fixed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue of asynchronous task methods in demo mode."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where selected application types and channels cannot be checked when creating and editing an application."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where it is not possible to navigate to the environment page."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where aab parsing fails when there are no intent filters."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," adds error handling for unchecking all application types and channels when updating an application."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where the loading strategy causes all third-party logins to be unavailable."]}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"430-2021-12-08",children:"4.3.0 (2021-12-08)"}),"\n",(0,s.jsxs)(i.p,{children:["Supports parsing of the aab format, adds support for multiple languages. Full ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/compare/4.2.2...4.3.0",children:"commit changes"})]}),"\n",(0,s.jsx)(i.h4,{id:"changed-8",children:"Changed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," uses the default prompt structure as the data structure for network hooks, instead of a strange structure."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," no longer provides parameter changes for third-party login authorization on the settings page (requires service restart)."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"API"})," the upload application interface and version details return the ",(0,s.jsx)(i.code,{children:"text_changelog"})," field in the response body. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/commit/650f1ffd3731f6a1f4cc703430be1b1b6f5d1cee",children:"650f1ffd"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"API"})," renames the ",(0,s.jsx)(i.code,{children:"changelog_list"})," field in the response body to ",(0,s.jsx)(i.code,{children:"changelog"}),". ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/commit/719f0b1eff92f358d246ededd6c1e6f9863f7f85",children:"719f0b1e"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," changes the log output format from an array to text format that is compatible with Markdown lists. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/commit/719f0b1eff92f358d246ededd6c1e6f9863f7f85",children:"719f0b1e"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," some privacy-related configuration keys or tokens are only displayed in plaintext under administrator permissions; other permissions cannot see them; demo mode is read-only and will do some encryption. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/644",children:"#644"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," does not display the build date and hash value if they cannot be obtained."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"added-10",children:"Added"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," supports parsing of the Android App Bundle (aab) file format and webp icons."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," supports language internationalization, with optional language packs: Simplified Chinese, English (support for page configuration)."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," supports configuring more system settings. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/643",children:"#643"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," adds editing functionality for network hooks in the management panel."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," rewrites and optimizes the style layout of the application list."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," optimizes the basic email template."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," adjusts the style and error logic of the login window."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," adds file permission checking to the environment variable page in the management panel. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/608",children:"#608"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," adds error details display for asynchronous tasks in the management panel, with a maximum of 5000 errors."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," uses a better log output format. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/646",children:"#646"})]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"fixed-12",children:"Fixed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where the default selection state of boolean type parameters is incorrect on the settings page."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where exceptions occur when clicking install or download in the DingTalk app (changed to WeChat logic processing)."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where the build date (time stamp when building a Docker image) cannot be displayed on the environment page."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where the domain scope of asynchronous notifications does not take effect."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue of exception when getting gems."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue of abnormal judgment of the expiration time of iOS certificates."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where disk space cannot be obtained when developing with a virtual machine mounted."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes some known errors in demo mode."]}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"422-2021-10-15",children:"4.2.2 (2021-10-15)"}),"\n",(0,s.jsxs)(i.p,{children:["Full ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/compare/4.2.1...4.2.2",children:"commit changes"}),"."]}),"\n",(0,s.jsx)(i.h4,{id:"fixed-13",children:"Fixed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"API"})," fixes the issue where incorrect error messages were not output due to parameter mismatches caused by batch replacements. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/issues/615",children:"#615"})," Thanks to ",(0,s.jsx)(i.a,{href:"https://github.com/gin7758258",children:"gin7758258"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue of abnormal parsing of some apk Android files. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/529",children:"#587"})]}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"421-2021-09-14",children:"4.2.1 (2021-09-14)"}),"\n",(0,s.jsxs)(i.p,{children:["Full ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/compare/4.2.0...4.2.1",children:"commit changes"}),"."]}),"\n",(0,s.jsx)(i.h4,{id:"changed-9",children:"Changed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," application icons are no longer cropped to the preset size, and image processing dependencies have been removed, reducing the Docker image size by nearly 200MB."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Docker"})," the reverse proxy service Caddy no longer outputs logs to STDOUT but directly to files."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"fixed-14",children:"Fixed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where icons are not displayed correctly after uploading an application."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," is compatible with different dSYM zip extraction logics when uploading."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where the application icon is not displayed when installing iOS applications."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes a security vulnerability by disabling the editing of read-only system settings."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where the downloaded file suffix is not correct on macOS."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where the window showing that an installation is not possible does not pop up in some cases."]}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"420-2021-09-01",children:"4.2.0 (2021-09-01)"}),"\n",(0,s.jsxs)(i.p,{children:["Full ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/compare/4.1.0...4.2.0",children:"commit changes"}),"."]}),"\n",(0,s.jsx)(i.h4,{id:"changed-10",children:"Changed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," changes the default logic for cleaning up old versions to off. To enable, set the environment variable ",(0,s.jsx)(i.code,{children:"ZEALOT_KEEP_UPLOADS=false"}),". ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/570",children:"#570"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," renames File Parsing to Application Unpacking. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/529",children:"#529"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," removes support for unpacking previously uploaded applications in the application unpacking feature. (now all uploaded applications will automatically trigger additional application unpacking)"]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"API"})," supports fontawesome css values for custom field icons when uploading applications, such as the value ",(0,s.jsx)(i.code,{children:"fas fa-flag"})," for ",(0,s.jsx)(i.a,{href:"https://fontawesome.com/v5.15/icons/flag?style=solid",children:"flag"}),"."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Docker"})," changes the image to use caddy as a reverse proxy and modifies the volume persistence. Migration is required, see ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/540",children:"#540"})," for details."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"added-11",children:"Added"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," supports uploading, parsing, and downloading macOS applications. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/562",children:"#562"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," adds quick filtering options for application types and channels for mobile devices on the channel details page. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/issues/510",children:"#510"})," Thanks to ",(0,s.jsx)(i.a,{href:"https://github.com/huacnlee",children:"huacnlee"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," allows the administrator panel to configure application type templates and default registration user permissions. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/562",children:"#562"})," ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/568",children:"#568"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," partially encrypts environment variables that involve privacy."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," adds graphical displays for memory and disk usage."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Docker"})," adds support for synchronizing updates with ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pkgs/container/zealot",children:"Github Container Registry"})," images."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Docker"})," adds support for configuring the postgres port number with environment variables."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"fixed-15",children:"Fixed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where the iOS installation button cannot be displayed on iPad and M1 chip macOS. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/issues/519",children:"#519"})," Thanks to ",(0,s.jsx)(i.a,{href:"https://github.com/ohdarling",children:"ohdarling"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where using third-party login while registering but not verifying email fails. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/issues/517",children:"#517"})," Thanks to ",(0,s.jsx)(i.a,{href:"https://github.com/huacnlee",children:"huacnlee"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where uploading an application through the website does not trigger application unpacking."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where the left navigation style is misaligned when tubrolink is enabled."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," displays the unpacking link when uploading Android applications."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," optimizes the display prompt for empty unpacking file lists."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where LDAP parameters are obtained incorrectly. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/542",children:"#541"})," Thanks to ",(0,s.jsx)(i.a,{href:"https://github.com/Martwu",children:"Martwu"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," changes the error message for capturing application upload errors to a readable format."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where the application type creation error judgment is abnormal."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," adds an exception judgment for clicking the details page when all channels of an application are deleted."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where uploading applications causes variable release errors in the parsing process."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where an error occurs when verifying password protection for an application. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/issues/564",children:"#564"})," Thanks to ",(0,s.jsx)(i.a,{href:"https://github.com/EasierLu",children:"EasierLu"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where editing user information in the administrator panel causes an error. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/issues/564",children:"#564"})," Thanks to ",(0,s.jsx)(i.a,{href:"https://github.com/EasierLu",children:"EasierLu"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"}),' fixes the issue where the "Install" button on the application details page is displayed abnormally on incorrect systems and devices (normally only iOS applications are displayed on iOS and macOS devices).']}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," optimizes the unpacking of applications for developer certificates that fail to parse due to special character sets (currently known to be Chinese encoding) and UI layout adjustments."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where the current user cannot be edited."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," corrects the duplicate title of debug files."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Docker"})," fixes the logrotate error during image initialization."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Docker"})," fixes the issue where Caddy deployment needs to be confirmed. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/issues/551",children:"#551"})," Thanks to ",(0,s.jsx)(i.a,{href:"https://github.com/ReverseScale",children:"ReverseScale"})]}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"410-2021-07-17",children:"4.1.0 (2021-07-17)"}),"\n",(0,s.jsxs)(i.p,{children:["Full ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/compare/4.0.0...4.1.0",children:"commit changes"}),"."]}),"\n",(0,s.jsx)(i.h4,{id:"changed-11",children:"Changed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," changes the display logic for obtaining device UDID due to the similarity of iPad's User-Agent and Desktop."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Docker"})," sets Gihub Container Registry (gcr.io) as the default Docker image source."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"added-12",children:"Added"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," supports one-click login authentication for third-party platforms such as Feishu and Gitlab."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," optimizes the logic for accessing the version details page of an application that cannot be found and allows manual redirection to the latest version."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," adds the ability to view some system configuration items and modify some parameters without requiring a restart."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," adds a page statistics report to the management panel."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"fixed-16",children:"Fixed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where the network hook cannot obtain the value of the title variable."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the abnormal error during application parsing process."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the abnormal error that occurs during application creation."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where system configuration cannot be edited due to being saved as empty."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Job"})," fixes the issue where the logic for removing old versions causes the deletion logic and document logic to be reversed."]}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"400-2020-12-31",children:"4.0.0 (2020-12-31)"}),"\n",(0,s.jsxs)(i.p,{children:["Full ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/compare/4.0.0.rc2...4.0.0",children:"commit changes"}),"."]}),"\n",(0,s.jsx)(i.h4,{id:"fixed-17",children:"Fixed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," corrects the display error caused by abnormal judgment of the expiration time of the iOS certificate during file parsing."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," ignores the default development version number check for new versions."]}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"400rc2-2020-12-25",children:"4.0.0.rc2 (2020-12-25)"}),"\n",(0,s.jsxs)(i.p,{children:["Full ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/compare/4.0.0.rc1...4.0.0.rc2",children:"commit changes"}),"."]}),"\n",(0,s.jsx)(i.h4,{id:"added-13",children:"Added"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," newly parsed files will be saved to the list, and a file parsing for uploaded applications will also be synchronized. (asynchronous task) ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/346",children:"#346"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," adds file parsing data statistics to the control panel."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," adds data statistics for network hooks, background tasks, and disk usage for administrators in the control panel."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," adds a quick delete function for authorized personnel to the prompt for missing files in the version details."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"changed-12",children:"Changed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"API"})," The debug file version check interface has been renamed, and new check methods based on file fingerprints and dSYM UUID have been added. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/346",children:"#349"})]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"fixed-18",children:"Fixed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the error when disabling LDAP login authentication. (caused by incorrect IP whitelist settings)"]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," corrects the wording of the prompt when opening the version details in WeChat for Android."]}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"400rc1-2020-10-29",children:"4.0.0.rc1 (2020-10-29)"}),"\n",(0,s.jsxs)(i.p,{children:["Full ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/compare/4.0.0.beta4...4.0.0.rc1",children:"commit changes"}),"."]}),"\n",(0,s.jsx)(i.h4,{id:"changed-13",children:"Changed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Docker"})," ",(0,s.jsx)(i.strong,{children:"major change"})," merges rails and worker into the same image for deployment. zealot-docker library needs to be updated accordingly ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/235",children:"#235"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Docker"})," upgrades Ruby to version 2.7 for deployment."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," upgrades font-awesome from version 4.7.0 to 5.13.0, which may cause missing icons to display improperly."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," adjusts the wording of invitation emails."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," unifies the download path for applications and debugging files to ",(0,s.jsx)(i.code,{children:"/download"})," path."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," requires login permission for online application parsing."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," optimizes the logic for automatically redirecting to the latest version when accessing deleted or non-existent version details."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," adjusts the installation and download logic of applications (mainly due to the inability to distinguish between iPadOS UserAgent and Desktop)."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"added-14",children:"Added"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," displays a prompt when downloading files that do not exist."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," supports parsing .mobileprovision format files and enabling the parsing of .ipa files online."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," allows some system settings to be modified online using the administrator panel. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/245",children:"#245"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," adds guest mode. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/243",children:"#243"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," supports displaying the names of iOS AdHoc version test devices. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/211",children:"#211"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," supports parsing the content of uploaded version installation packages. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/210",children:"#210"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," supports obtaining the UDID of iOS devices. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/203",children:"#203"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," supports a demo mode with limited functionality and periodic data initialization. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/198",children:"#198"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," displays the original name of the application in the version details after uploading the App."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," allows filtering of the application list by version, Git branch, and packaging type."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," displays the Git commit link associated with the latest upload in the version details. (if the git URL is set in the channel settings)"]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," integrates LDAP login into the existing login interface and no longer uses the crude interface provided by third-party dependencies."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Job"})," supports managing the generation and recovery of data backup using rails commands. (database and uploaded file data) ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/207",children:"#207"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"API"})," adds an interface to check if the debug file exists ",(0,s.jsx)(i.code,{children:"/api/debug_files/version_exist"}),"."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"fixed-19",children:"Fixed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the error when parsing changelog during App upload."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where the QR code in the version details will exceed the parent view in medium resolution."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where some values of the application channel are empty and the default value is not displayed."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," optimizes the content display when parsing iOS packages online. (and solves the problem of always displaying fake data)"]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where the information of the submitter is not displayed for changelogs generated using ",(0,s.jsx)(i.a,{href:"https://github.com/icyleaf/fastlane-plugin-ci_changelog",children:"fastlane-plugin-ci_changelog"})," in the version details."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes and optimizes the logic for checking new versions."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where the pop-up window for confirming the deletion of debug files displays an empty message."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," optimizes the display of the device list in the version details on some mobile phones."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the error when parsing applications without submitting parameters."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," optimizes the display of the version list on mobile phones."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," only displays the bottom pagination for the latest upload dynamics of channel versions, and the top displays the total number of versions."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where the administrator editing user prompt for a non-empty password."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"}),"/",(0,s.jsx)(i.code,{children:"API"})," fixes the issue where the latest version is used when the requested version for online download and installation does not exist."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where the login interface displays the sidebar menu in guest mode."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where the same debugging file of the same application and platform is always overwritten when uploaded."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," optimizes the display of boolean and dictionary types on the system settings page."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Job"})," fixes the issue where old versions were accidentally deleted due to a version judgment error during scheduled cleaning."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Docker"})," fixes the issue where the internal static resources are not updated due to volume storage of the public folder."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Docker"})," fixes the issue where the container version is inconsistent with the external version."]}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"400beta4-2020-05-07",children:"4.0.0.beta4 (2020-05-07)"}),"\n",(0,s.jsxs)(i.p,{children:["Full ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/compare/4.0.0.beta3...4.0.0.beta4",children:"commit changes"}),"."]}),"\n",(0,s.jsx)(i.h4,{id:"added-15",children:"Added"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Docker"})," supports deployment on Heroku."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," allows guests to view App details, lists, and upload App details."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"API"})," supports custom fields when uploading an App. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/issues/178",children:"#178"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"}),"/",(0,s.jsx)(i.code,{children:"API"})," automatically removes the ",(0,s.jsx)(i.code,{children:"origin/"})," prefix when passing the ",(0,s.jsx)(i.code,{children:"branch"})," value during App upload."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," adds project introduction to user authentication interfaces such as login, registration, password retrieval, and password resetting."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"fixed-20",children:"Fixed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," corrects user password description text."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the URL field error in the WebHook."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"}),"/",(0,s.jsx)(i.code,{children:"API"})," fixes the error when uploading iOS dSYM files."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"API"})," fixes the abnormal has_password parameter in the App interface."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"API"})," fixes the source of uploaded App records always showing as Web."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"API"})," fixes and supports uploading changelog in JSON format as a string."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where CPU and memory information cannot be retrieved from system information."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the occasional error when parsing Android applications online."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the error when scanning QR code with WeChat."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"changed-14",children:"Changed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"API"})," adds validation for bundle_id dimension to the latest version interface. (apps/latest)"]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," allows guests to access application version details and download operations."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," shifts the device list on the right-hand side of iOS AdHoc application version details to the left and collapses it by default."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," removes the GraphQL console functionality from the development environment and recommends using ",(0,s.jsx)(i.a,{href:"https://github.com/prisma-labs/graphql-playground",children:"graphql-playground"}),"."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," removes the footbar at the bottom of the page, and the version information can be viewed in the system information."]}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"400beta3-2020-01-16",children:"4.0.0.beta3 (2020-01-16)"}),"\n",(0,s.jsxs)(i.p,{children:["Full ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/compare/4.0.0.beta2...4.0.0.beta3",children:"commit changes"}),"."]}),"\n",(0,s.jsx)(i.h4,{id:"added-16",children:"Added"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," prompts and displays a confirmation email link for users added by administrators if their email is not activated."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," enables the default Sentry anonymous reporting mechanism (can be turned off)."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"fixed-21",children:"Fixed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"API"})," fixes the issue where uploading an application always creates a new channel."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"}),"/",(0,s.jsx)(i.code,{children:"API"})," fixes the issue where the icon of uploaded Android applications cannot be displayed."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"changed-15",children:"Changed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Docker"})," moves the initialization data out of the image and into ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot-docker",children:"zealot-docker"})," image. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/120",children:"#120"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Docker"})," reduces the size of the image from 1.18G to 308M. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/issues/114",children:"#114"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Job"})," uses asynchronous tasks instead of traditional cron jobs to implement scheduled cleaning of old version history package files. (can be turned off)"]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Job"})," groups asynchronous tasks and sets priority."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"API"})," displays all error messages in Chinese because database write operations return specific error messages."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," standardizes code using Rubocop Lint rules."]}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"400beta2-2020-01-10",children:"4.0.0.beta2 (2020-01-10)"}),"\n",(0,s.jsxs)(i.p,{children:["Full ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/compare/4.0.0.beta1...4.0.0.beta2",children:"commit changes"}),"."]}),"\n",(0,s.jsx)(i.h4,{id:"added-17",children:"Added"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," Added the ability to upload a complete version list to a specific application channel, and support deleting operations."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"fixed-22",children:"Fixed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," provides an error prompt instead of an error message when uploading an application that is not a valid ipa or apk."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"API"})," fixes the issue where the latest version list of an application cannot be returned due to the non-existence of the queried version number in the database."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"API"})," only requires token verification for interfaces that perform write operations (previously most interfaces required it)."]}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"400beta1",children:"4.0.0.beta1"}),"\n",(0,s.jsx)(i.p,{children:"\ud83c\udf08 The first public beta version has been released!"}),"\n",(0,s.jsx)(i.h2,{id:"previous-version",children:"Previous Version"}),"\n",(0,s.jsx)(i.p,{children:"For many years, it was developed and operated internally within the company and was not open source.\nIt used to undertake many functions, but now it has been separated to focus on providing\napplication hosting and distribution services"})]})}function h(e={}){const{wrapper:i}={...(0,d.a)(),...e.components};return i?(0,s.jsx)(i,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},1151:(e,i,n)=>{n.d(i,{Z:()=>r,a:()=>t});var s=n(7294);const d={},l=s.createContext(d);function t(e){const i=s.useContext(l);return s.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function r(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(d):e.components||d:t(e.components),s.createElement(l.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/57006c40.37b963c2.js b/assets/js/c6435c3a.3abd9a0a.js similarity index 96% rename from assets/js/57006c40.37b963c2.js rename to assets/js/c6435c3a.3abd9a0a.js index 0023cd443..21d444ccd 100644 --- a/assets/js/57006c40.37b963c2.js +++ b/assets/js/c6435c3a.3abd9a0a.js @@ -1 +1 @@ -"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[7663],{9665:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>o,contentTitle:()=>s,default:()=>u,frontMatter:()=>i,metadata:()=>d,toc:()=>r});var l=t(5893),a=t(1151);const i={},s="Fastlane plugins",d={id:"developer-guide/fastlane",title:"Fastlane plugins",description:"Add Zealot plugin",source:"@site/versioned_docs/version-5.1.0/developer-guide/fastlane.md",sourceDirName:"developer-guide",slug:"/developer-guide/fastlane",permalink:"/docs/developer-guide/fastlane",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.1.0/developer-guide/fastlane.md",tags:[],version:"5.1.0",frontMatter:{},sidebar:"developerGuide",previous:{title:"Android",permalink:"/docs/developer-guide/sdk/android"},next:{title:"zealot",permalink:"/docs/developer-guide/fastlane/zealot"}},o={},r=[{value:"Add Zealot plugin",id:"add-zealot-plugin",level:2},{value:"More usefully plugins",id:"more-usefully-plugins",level:2}];function c(e){const n={a:"a",blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,a.a)(),...e.components};return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(n.h1,{id:"fastlane-plugins",children:"Fastlane plugins"}),"\n",(0,l.jsx)(n.h2,{id:"add-zealot-plugin",children:"Add Zealot plugin"}),"\n",(0,l.jsxs)(n.blockquote,{children:["\n",(0,l.jsxs)(n.p,{children:[(0,l.jsx)(n.a,{href:"https://fastlane.tools",children:"fastlane"})," is an open source platform aimed at simplifying Android and iOS deployment.\nfastlane lets you automate every aspect of your development and release workflow,\ncustomize your deployment workflows using the hundreds of community built fastlane actions and plugins."]}),"\n"]}),"\n",(0,l.jsxs)(n.p,{children:[(0,l.jsx)(n.a,{href:"https://github.com/tryzealot/fastlane-plugin-zealot",children:"fastlane-plugin-zealot"})," provides upload app, debug_file and\nversion check actions to Zealot, install it in shell\uff1a"]}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"$ fastlane add_plugin zealot\n"})}),"\n",(0,l.jsx)(n.h2,{id:"more-usefully-plugins",children:"More usefully plugins"}),"\n",(0,l.jsx)(n.p,{children:"In addition, as the author of the project also open source a number of other fastlane plug-ins there is always one you will use:"}),"\n",(0,l.jsxs)(n.table,{children:[(0,l.jsx)(n.thead,{children:(0,l.jsxs)(n.tr,{children:[(0,l.jsx)(n.th,{children:"Plugin"}),(0,l.jsx)(n.th,{children:"Description"})]})}),(0,l.jsxs)(n.tbody,{children:[(0,l.jsxs)(n.tr,{children:[(0,l.jsx)(n.td,{children:(0,l.jsx)(n.a,{href:"https://github.com/icyleaf/fastlane-plugin-ci_changelog",children:"fastlane-plugin-ci_changelog"})}),(0,l.jsx)(n.td,{children:"Automate generate changelog between previous and the latest commit of SCM during the CI services."})]}),(0,l.jsxs)(n.tr,{children:[(0,l.jsx)(n.td,{children:(0,l.jsx)(n.a,{href:"https://github.com/icyleaf/fastlane-plugin-update_jenkins_build",children:"fastlane-plugin-update_jenkins_build"})}),(0,l.jsx)(n.td,{children:"Update build's description of jenkins."})]}),(0,l.jsxs)(n.tr,{children:[(0,l.jsx)(n.td,{children:(0,l.jsx)(n.a,{href:"https://github.com/icyleaf/fastlane-plugin-humanable_build_number",children:"fastlane-plugin-humanable_build_number"})}),(0,l.jsx)(n.td,{children:"Automatic generate app build number unque and human readable friendly"})]}),(0,l.jsxs)(n.tr,{children:[(0,l.jsx)(n.td,{children:(0,l.jsx)(n.a,{href:"https://github.com/icyleaf/fastlane-plugin-app_info",children:"fastlane-plugin-app_info"})}),(0,l.jsx)(n.td,{children:"Teardown tool for mobile app(ipa, apk and aab file), analysis metedata like version, name, icon etc."})]}),(0,l.jsxs)(n.tr,{children:[(0,l.jsx)(n.td,{children:(0,l.jsx)(n.a,{href:"https://github.com/icyleaf/fastlane-plugin-android_channels",children:"fastlane-plugin-android_channels"})}),(0,l.jsx)(n.td,{children:"Package unsign apk with channels and write empty file to META-INF with channel in general way"})]}),(0,l.jsxs)(n.tr,{children:[(0,l.jsx)(n.td,{children:(0,l.jsx)(n.a,{href:"https://github.com/icyleaf/fastlane-plugin-ram_disk",children:"fastlane-plugin-ram_disk"})}),(0,l.jsx)(n.td,{children:"Use a virtual ram disk to do anything else"})]})]})]})]})}function u(e={}){const{wrapper:n}={...(0,a.a)(),...e.components};return n?(0,l.jsx)(n,{...e,children:(0,l.jsx)(c,{...e})}):c(e)}},1151:(e,n,t)=>{t.d(n,{Z:()=>d,a:()=>s});var l=t(7294);const a={},i=l.createContext(a);function s(e){const n=l.useContext(i);return l.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function d(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:s(e.components),l.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[6724],{2274:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>o,contentTitle:()=>s,default:()=>u,frontMatter:()=>i,metadata:()=>d,toc:()=>r});var l=t(5893),a=t(1151);const i={},s="Fastlane plugins",d={id:"developer-guide/fastlane",title:"Fastlane plugins",description:"Add Zealot plugin",source:"@site/versioned_docs/version-5.2.0/developer-guide/fastlane.md",sourceDirName:"developer-guide",slug:"/developer-guide/fastlane",permalink:"/docs/developer-guide/fastlane",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.2.0/developer-guide/fastlane.md",tags:[],version:"5.2.0",frontMatter:{},sidebar:"developerGuide",previous:{title:"Android",permalink:"/docs/developer-guide/sdk/android"},next:{title:"zealot",permalink:"/docs/developer-guide/fastlane/zealot"}},o={},r=[{value:"Add Zealot plugin",id:"add-zealot-plugin",level:2},{value:"More usefully plugins",id:"more-usefully-plugins",level:2}];function c(e){const n={a:"a",blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,a.a)(),...e.components};return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(n.h1,{id:"fastlane-plugins",children:"Fastlane plugins"}),"\n",(0,l.jsx)(n.h2,{id:"add-zealot-plugin",children:"Add Zealot plugin"}),"\n",(0,l.jsxs)(n.blockquote,{children:["\n",(0,l.jsxs)(n.p,{children:[(0,l.jsx)(n.a,{href:"https://fastlane.tools",children:"fastlane"})," is an open source platform aimed at simplifying Android and iOS deployment.\nfastlane lets you automate every aspect of your development and release workflow,\ncustomize your deployment workflows using the hundreds of community built fastlane actions and plugins."]}),"\n"]}),"\n",(0,l.jsxs)(n.p,{children:[(0,l.jsx)(n.a,{href:"https://github.com/tryzealot/fastlane-plugin-zealot",children:"fastlane-plugin-zealot"})," provides upload app, debug_file and\nversion check actions to Zealot, install it in shell\uff1a"]}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"$ fastlane add_plugin zealot\n"})}),"\n",(0,l.jsx)(n.h2,{id:"more-usefully-plugins",children:"More usefully plugins"}),"\n",(0,l.jsx)(n.p,{children:"In addition, as the author of the project also open source a number of other fastlane plug-ins there is always one you will use:"}),"\n",(0,l.jsxs)(n.table,{children:[(0,l.jsx)(n.thead,{children:(0,l.jsxs)(n.tr,{children:[(0,l.jsx)(n.th,{children:"Plugin"}),(0,l.jsx)(n.th,{children:"Description"})]})}),(0,l.jsxs)(n.tbody,{children:[(0,l.jsxs)(n.tr,{children:[(0,l.jsx)(n.td,{children:(0,l.jsx)(n.a,{href:"https://github.com/icyleaf/fastlane-plugin-ci_changelog",children:"fastlane-plugin-ci_changelog"})}),(0,l.jsx)(n.td,{children:"Automate generate changelog between previous and the latest commit of SCM during the CI services."})]}),(0,l.jsxs)(n.tr,{children:[(0,l.jsx)(n.td,{children:(0,l.jsx)(n.a,{href:"https://github.com/icyleaf/fastlane-plugin-update_jenkins_build",children:"fastlane-plugin-update_jenkins_build"})}),(0,l.jsx)(n.td,{children:"Update build's description of jenkins."})]}),(0,l.jsxs)(n.tr,{children:[(0,l.jsx)(n.td,{children:(0,l.jsx)(n.a,{href:"https://github.com/icyleaf/fastlane-plugin-humanable_build_number",children:"fastlane-plugin-humanable_build_number"})}),(0,l.jsx)(n.td,{children:"Automatic generate app build number unque and human readable friendly"})]}),(0,l.jsxs)(n.tr,{children:[(0,l.jsx)(n.td,{children:(0,l.jsx)(n.a,{href:"https://github.com/icyleaf/fastlane-plugin-app_info",children:"fastlane-plugin-app_info"})}),(0,l.jsx)(n.td,{children:"Teardown tool for mobile app(ipa, apk and aab file), analysis metedata like version, name, icon etc."})]}),(0,l.jsxs)(n.tr,{children:[(0,l.jsx)(n.td,{children:(0,l.jsx)(n.a,{href:"https://github.com/icyleaf/fastlane-plugin-android_channels",children:"fastlane-plugin-android_channels"})}),(0,l.jsx)(n.td,{children:"Package unsign apk with channels and write empty file to META-INF with channel in general way"})]}),(0,l.jsxs)(n.tr,{children:[(0,l.jsx)(n.td,{children:(0,l.jsx)(n.a,{href:"https://github.com/icyleaf/fastlane-plugin-ram_disk",children:"fastlane-plugin-ram_disk"})}),(0,l.jsx)(n.td,{children:"Use a virtual ram disk to do anything else"})]})]})]})]})}function u(e={}){const{wrapper:n}={...(0,a.a)(),...e.components};return n?(0,l.jsx)(n,{...e,children:(0,l.jsx)(c,{...e})}):c(e)}},1151:(e,n,t)=>{t.d(n,{Z:()=>d,a:()=>s});var l=t(7294);const a={},i=l.createContext(a);function s(e){const n=l.useContext(i);return l.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function d(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:s(e.components),l.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/c6ff6c23.18e13487.js b/assets/js/c6ff6c23.18e13487.js new file mode 100644 index 000000000..ffe1a62a0 --- /dev/null +++ b/assets/js/c6ff6c23.18e13487.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[8022],{168:t=>{t.exports=JSON.parse('{"title":"Monitoring","slug":"/category/monitoring","permalink":"/docs/5.1.0/category/monitoring","navigation":{"previous":{"title":"Settings","permalink":"/docs/5.1.0/user-guide/administrator/settings"},"next":{"title":"System informations","permalink":"/docs/5.1.0/user-guide/administrator/monitoring/system-info"}}}')}}]); \ No newline at end of file diff --git a/assets/js/cab814a1.3b2b7a75.js b/assets/js/cab814a1.3b2b7a75.js deleted file mode 100644 index 1214f0c92..000000000 --- a/assets/js/cab814a1.3b2b7a75.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[9699],{9997:(e,i,s)=>{s.r(i),s.d(i,{assets:()=>u,contentTitle:()=>l,default:()=>v,frontMatter:()=>o,metadata:()=>a,toc:()=>g});var n=s(5893),r=s(1151),d=s(9965),t=s(4996);const o={},l="Review metadata",a={id:"user-guide/debug-files/review",title:"Review metadata",description:"Android",source:"@site/versioned_docs/version-5.1.0/user-guide/debug-files/review.mdx",sourceDirName:"user-guide/debug-files",slug:"/user-guide/debug-files/review",permalink:"/docs/user-guide/debug-files/review",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.1.0/user-guide/debug-files/review.mdx",tags:[],version:"5.1.0",frontMatter:{},sidebar:"userGuide",previous:{title:"List debug files",permalink:"/docs/user-guide/debug-files/"},next:{title:"Create a Debug File",permalink:"/docs/user-guide/debug-files/upload"}},u={},g=[{value:"Android",id:"android",level:2},{value:"Versions list",id:"versions-list",level:3},{value:"Version detail",id:"version-detail",level:3},{value:"iOS",id:"ios",level:2},{value:"Versions list",id:"versions-list-1",level:3},{value:"Version detail",id:"version-detail-1",level:3}];function c(e){const i={h1:"h1",h2:"h2",h3:"h3",...(0,r.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(i.h1,{id:"review-metadata",children:"Review metadata"}),"\n","\n","\n",(0,n.jsx)(i.h2,{id:"android",children:"Android"}),"\n",(0,n.jsx)(i.h3,{id:"versions-list",children:"Versions list"}),"\n",(0,n.jsx)(d.Z,{alt:"",sources:{light:(0,t.Z)("/img/5.0.0/debug-file-android-versions-light.png"),dark:(0,t.Z)("/img/5.0.0/debug-file-android-versions-dark.png")}}),"\n",(0,n.jsx)(i.h3,{id:"version-detail",children:"Version detail"}),"\n",(0,n.jsx)(d.Z,{alt:"",sources:{light:(0,t.Z)("/img/5.0.0/debug-file-android-version-light.png"),dark:(0,t.Z)("/img/5.0.0/debug-file-android-version-dark.png")}}),"\n",(0,n.jsx)(i.h2,{id:"ios",children:"iOS"}),"\n",(0,n.jsx)(i.h3,{id:"versions-list-1",children:"Versions list"}),"\n",(0,n.jsx)(d.Z,{alt:"",sources:{light:(0,t.Z)("/img/5.0.0/debug-file-ios-versions-light.png"),dark:(0,t.Z)("/img/5.0.0/debug-file-ios-versions-dark.png")}}),"\n",(0,n.jsx)(i.h3,{id:"version-detail-1",children:"Version detail"}),"\n",(0,n.jsx)(d.Z,{alt:"",sources:{light:(0,t.Z)("/img/5.0.0/debug-file-ios-version-light.png"),dark:(0,t.Z)("/img/5.0.0/debug-file-ios-version-dark.png")}})]})}function v(e={}){const{wrapper:i}={...(0,r.a)(),...e.components};return i?(0,n.jsx)(i,{...e,children:(0,n.jsx)(c,{...e})}):c(e)}},1151:(e,i,s)=>{s.d(i,{Z:()=>o,a:()=>t});var n=s(7294);const r={},d=n.createContext(r);function t(e){const i=n.useContext(d);return n.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function o(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:t(e.components),n.createElement(d.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/cab814a1.4df58cbe.js b/assets/js/cab814a1.4df58cbe.js new file mode 100644 index 000000000..7596850d0 --- /dev/null +++ b/assets/js/cab814a1.4df58cbe.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[9699],{9997:(e,i,s)=>{s.r(i),s.d(i,{assets:()=>u,contentTitle:()=>l,default:()=>v,frontMatter:()=>o,metadata:()=>a,toc:()=>g});var n=s(5893),r=s(1151),d=s(9965),t=s(4996);const o={},l="Review metadata",a={id:"user-guide/debug-files/review",title:"Review metadata",description:"Android",source:"@site/versioned_docs/version-5.1.0/user-guide/debug-files/review.mdx",sourceDirName:"user-guide/debug-files",slug:"/user-guide/debug-files/review",permalink:"/docs/5.1.0/user-guide/debug-files/review",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.1.0/user-guide/debug-files/review.mdx",tags:[],version:"5.1.0",frontMatter:{},sidebar:"userGuide",previous:{title:"List debug files",permalink:"/docs/5.1.0/user-guide/debug-files/"},next:{title:"Create a Debug File",permalink:"/docs/5.1.0/user-guide/debug-files/upload"}},u={},g=[{value:"Android",id:"android",level:2},{value:"Versions list",id:"versions-list",level:3},{value:"Version detail",id:"version-detail",level:3},{value:"iOS",id:"ios",level:2},{value:"Versions list",id:"versions-list-1",level:3},{value:"Version detail",id:"version-detail-1",level:3}];function c(e){const i={h1:"h1",h2:"h2",h3:"h3",...(0,r.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(i.h1,{id:"review-metadata",children:"Review metadata"}),"\n","\n","\n",(0,n.jsx)(i.h2,{id:"android",children:"Android"}),"\n",(0,n.jsx)(i.h3,{id:"versions-list",children:"Versions list"}),"\n",(0,n.jsx)(d.Z,{alt:"",sources:{light:(0,t.Z)("/img/5.0.0/debug-file-android-versions-light.png"),dark:(0,t.Z)("/img/5.0.0/debug-file-android-versions-dark.png")}}),"\n",(0,n.jsx)(i.h3,{id:"version-detail",children:"Version detail"}),"\n",(0,n.jsx)(d.Z,{alt:"",sources:{light:(0,t.Z)("/img/5.0.0/debug-file-android-version-light.png"),dark:(0,t.Z)("/img/5.0.0/debug-file-android-version-dark.png")}}),"\n",(0,n.jsx)(i.h2,{id:"ios",children:"iOS"}),"\n",(0,n.jsx)(i.h3,{id:"versions-list-1",children:"Versions list"}),"\n",(0,n.jsx)(d.Z,{alt:"",sources:{light:(0,t.Z)("/img/5.0.0/debug-file-ios-versions-light.png"),dark:(0,t.Z)("/img/5.0.0/debug-file-ios-versions-dark.png")}}),"\n",(0,n.jsx)(i.h3,{id:"version-detail-1",children:"Version detail"}),"\n",(0,n.jsx)(d.Z,{alt:"",sources:{light:(0,t.Z)("/img/5.0.0/debug-file-ios-version-light.png"),dark:(0,t.Z)("/img/5.0.0/debug-file-ios-version-dark.png")}})]})}function v(e={}){const{wrapper:i}={...(0,r.a)(),...e.components};return i?(0,n.jsx)(i,{...e,children:(0,n.jsx)(c,{...e})}):c(e)}},1151:(e,i,s)=>{s.d(i,{Z:()=>o,a:()=>t});var n=s(7294);const r={},d=n.createContext(r);function t(e){const i=n.useContext(d);return n.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function o(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:t(e.components),n.createElement(d.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/9a9c7ed9.3127fc8f.js b/assets/js/cd4cb2e3.cafc443e.js similarity index 93% rename from assets/js/9a9c7ed9.3127fc8f.js rename to assets/js/cd4cb2e3.cafc443e.js index c0bf7b1d2..4fbc0a963 100644 --- a/assets/js/9a9c7ed9.3127fc8f.js +++ b/assets/js/cd4cb2e3.cafc443e.js @@ -1 +1 @@ -"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[1884],{5388:(e,n,o)=>{o.r(n),o.d(n,{assets:()=>l,contentTitle:()=>s,default:()=>_,frontMatter:()=>r,metadata:()=>i,toc:()=>c});var t=o(5893),a=o(1151);const r={sidebar_label:"zealot_version_check"},s="Fastlane action: zealot_version_check",i={id:"developer-guide/fastlane/zealot_version_check",title:"Fastlane action: zealot_version_check",description:"Check given build exists or not on Zealot",source:"@site/versioned_docs/version-5.1.0/developer-guide/fastlane/zealot_version_check.md",sourceDirName:"developer-guide/fastlane",slug:"/developer-guide/fastlane/zealot_version_check",permalink:"/docs/developer-guide/fastlane/zealot_version_check",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.1.0/developer-guide/fastlane/zealot_version_check.md",tags:[],version:"5.1.0",frontMatter:{sidebar_label:"zealot_version_check"},sidebar:"developerGuide",previous:{title:"zealot",permalink:"/docs/developer-guide/fastlane/zealot"},next:{title:"zealot_debug_file",permalink:"/docs/developer-guide/fastlane/zealot_debug_file"}},l={},c=[{value:"Parameters",id:"parameters",level:2}];function d(e){const n={code:"code",h1:"h1",h2:"h2",p:"p",pre:"pre",...(0,a.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h1,{id:"fastlane-action-zealot_version_check",children:"Fastlane action: zealot_version_check"}),"\n",(0,t.jsx)(n.p,{children:"Check given build exists or not on Zealot"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-ruby",children:"zealot_version_check(\n endpoint: 'https://zealot.com',\n token: '...',\n bundle_id: 'com.example.app.name',\n release_version: '1.0.0',\n build_version: '1'\n)\n"})}),"\n",(0,t.jsx)(n.h2,{id:"parameters",children:"Parameters"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"+-----------------+---------------------------------+------------------------+---------+\n| zealot_version_check Options |\n+-----------------+---------------------------------+------------------------+---------+\n| Key | Description | Env Var | Default |\n+-----------------+---------------------------------+------------------------+---------+\n| endpoint | The endpoint of zealot | ZEALOT_ENDPOINT | |\n| token | The token of user | ZEALOT_TOKEN | |\n| channel_key | The key of app's channel | ZEALOT_CHANNEL_KEY | |\n| bundle_id | The bundle id(package name) of | ZEALOT_BUNDLE_ID | |\n| | app | | |\n| release_version | The release version of app | ZEALOT_RELEASE_VERSION | |\n| build_version | The build version of app | ZEALOT_BUILD_VERSION | |\n| git_commit | The latest git commit of app | ZEALOT_GIT_COMMIT | |\n| verify_ssl | Should verify SSL of zealot | ZEALOT_VERIFY_SSL | true |\n| | service | | |\n| fail_on_error | Should an error http request | ZEALOT_FAIL_ON_ERROR | false |\n| | cause a failure? (true/false) | | |\n+-----------------+---------------------------------+------------------------+---------+\n"})})]})}function _(e={}){const{wrapper:n}={...(0,a.a)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(d,{...e})}):d(e)}},1151:(e,n,o)=>{o.d(n,{Z:()=>i,a:()=>s});var t=o(7294);const a={},r=t.createContext(a);function s(e){const n=t.useContext(r);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:s(e.components),t.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[1485],{3244:(e,n,o)=>{o.r(n),o.d(n,{assets:()=>l,contentTitle:()=>s,default:()=>_,frontMatter:()=>r,metadata:()=>i,toc:()=>c});var t=o(5893),a=o(1151);const r={sidebar_label:"zealot_version_check"},s="Fastlane action: zealot_version_check",i={id:"developer-guide/fastlane/zealot_version_check",title:"Fastlane action: zealot_version_check",description:"Check given build exists or not on Zealot",source:"@site/versioned_docs/version-5.2.0/developer-guide/fastlane/zealot_version_check.md",sourceDirName:"developer-guide/fastlane",slug:"/developer-guide/fastlane/zealot_version_check",permalink:"/docs/developer-guide/fastlane/zealot_version_check",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.2.0/developer-guide/fastlane/zealot_version_check.md",tags:[],version:"5.2.0",frontMatter:{sidebar_label:"zealot_version_check"},sidebar:"developerGuide",previous:{title:"zealot",permalink:"/docs/developer-guide/fastlane/zealot"},next:{title:"zealot_debug_file",permalink:"/docs/developer-guide/fastlane/zealot_debug_file"}},l={},c=[{value:"Parameters",id:"parameters",level:2}];function d(e){const n={code:"code",h1:"h1",h2:"h2",p:"p",pre:"pre",...(0,a.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h1,{id:"fastlane-action-zealot_version_check",children:"Fastlane action: zealot_version_check"}),"\n",(0,t.jsx)(n.p,{children:"Check given build exists or not on Zealot"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-ruby",children:"zealot_version_check(\n endpoint: 'https://zealot.com',\n token: '...',\n bundle_id: 'com.example.app.name',\n release_version: '1.0.0',\n build_version: '1'\n)\n"})}),"\n",(0,t.jsx)(n.h2,{id:"parameters",children:"Parameters"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"+-----------------+---------------------------------+------------------------+---------+\n| zealot_version_check Options |\n+-----------------+---------------------------------+------------------------+---------+\n| Key | Description | Env Var | Default |\n+-----------------+---------------------------------+------------------------+---------+\n| endpoint | The endpoint of zealot | ZEALOT_ENDPOINT | |\n| token | The token of user | ZEALOT_TOKEN | |\n| channel_key | The key of app's channel | ZEALOT_CHANNEL_KEY | |\n| bundle_id | The bundle id(package name) of | ZEALOT_BUNDLE_ID | |\n| | app | | |\n| release_version | The release version of app | ZEALOT_RELEASE_VERSION | |\n| build_version | The build version of app | ZEALOT_BUILD_VERSION | |\n| git_commit | The latest git commit of app | ZEALOT_GIT_COMMIT | |\n| verify_ssl | Should verify SSL of zealot | ZEALOT_VERIFY_SSL | true |\n| | service | | |\n| fail_on_error | Should an error http request | ZEALOT_FAIL_ON_ERROR | false |\n| | cause a failure? (true/false) | | |\n+-----------------+---------------------------------+------------------------+---------+\n"})})]})}function _(e={}){const{wrapper:n}={...(0,a.a)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(d,{...e})}):d(e)}},1151:(e,n,o)=>{o.d(n,{Z:()=>i,a:()=>s});var t=o(7294);const a={},r=t.createContext(a);function s(e){const n=t.useContext(r);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:s(e.components),t.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/95a38b63.50c83a6a.js b/assets/js/cf2f55b0.0a277dee.js similarity index 94% rename from assets/js/95a38b63.50c83a6a.js rename to assets/js/cf2f55b0.0a277dee.js index 13d612db8..d3e2400d5 100644 --- a/assets/js/95a38b63.50c83a6a.js +++ b/assets/js/cf2f55b0.0a277dee.js @@ -1 +1 @@ -"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[684],{2190:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>a,default:()=>l,frontMatter:()=>s,metadata:()=>i,toc:()=>d});var o=t(5893),r=t(1151);const s={},a="Lark (Feishu)",i={id:"user-guide/webhooks/feishu",title:"Lark (Feishu)",description:"\u98de\u4e66 use Incoming Webhooks whose constructs",source:"@site/versioned_docs/version-5.1.0/user-guide/webhooks/feishu.md",sourceDirName:"user-guide/webhooks",slug:"/user-guide/webhooks/feishu",permalink:"/docs/user-guide/webhooks/feishu",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.1.0/user-guide/webhooks/feishu.md",tags:[],version:"5.1.0",frontMatter:{},sidebar:"userGuide",previous:{title:"Discord",permalink:"/docs/user-guide/webhooks/discord"},next:{title:"Dingtalk (Dingding)",permalink:"/docs/user-guide/webhooks/dingtalk"}},c={},d=[{value:"Text format",id:"text-format",level:2},{value:"Interactive card format",id:"interactive-card-format",level:2}];function u(e){const n={a:"a",blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",p:"p",pre:"pre",...(0,r.a)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.h1,{id:"lark-feishu",children:"Lark (Feishu)"}),"\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.a,{href:"https://open.feishu.cn/document/ukTMukTMukTM/ucTM5YjL3ETO24yNxkjN",children:"\u98de\u4e66"})," use Incoming Webhooks whose constructs\ntypically support both text and interactive card, and can be configured as follows:"]}),"\n",(0,o.jsxs)(n.blockquote,{children:["\n",(0,o.jsx)(n.p,{children:"Due to system limitations try to use keyword or IP address whitelist mechanism to receive messages."}),"\n"]}),"\n",(0,o.jsx)(n.h2,{id:"text-format",children:"Text format"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-ruby",children:'{\n "msg_type": "text",\n "text": {\n "content": "#{@title}\\n\\n\u5b89\u88c5\u5730\u5740\uff1a#{@install_url}\\nUplaod at: #{@uploaded_at}"\n }\n}\n'})}),"\n",(0,o.jsx)(n.h2,{id:"interactive-card-format",children:"Interactive card format"}),"\n",(0,o.jsx)(n.p,{children:"Use card format could use partly of markdown syntax:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-ruby",children:'{\n "msg_type": "interactive",\n "card": {\n "config": {\n "wide_screen_mode": true,\n "enable_forward": true\n },\n "elements": [\n {\n "tag": "div",\n "fields": [\n {\n "is_short": true,\n "text": {\n "tag": "lark_md",\n "content": "**Platform**\\n#{@device_type}"\n }\n },\n {\n "is_short": true,\n "text": {\n "tag": "lark_md",\n "content": "**Version**\\n#{@release_version} (#{@build_version})"\n }\n },\n {\n "is_short": true,\n "text": {\n "tag": "lark_md",\n "content": "**Developer**\\n#{@username}"\n }\n },\n {\n "is_short": true,\n "text": {\n "tag": "lark_md",\n "content": "**Upload date**\\n#{@uploaded_at}"\n }\n },\n ]\n },\n {\n "tag": "div",\n "text": {\n "content": "**Changelog**\\n#{@changelog}",\n "tag": "lark_md"\n }\n },\n {\n "actions": [\n {\n "tag": "button",\n "text": {\n "content": "\ud83d\udc1e Go to app",\n "tag": "lark_md"\n },\n "url": "#{@release_url}",\n "type": "primary",\n "value": {}\n }\n ],\n "tag": "action"\n }\n ],\n "header": {\n "title": {\n "content": "#{@title}",\n "tag": "plain_text"\n }\n }\n }\n}\n'})})]})}function l(e={}){const{wrapper:n}={...(0,r.a)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(u,{...e})}):u(e)}},1151:(e,n,t)=>{t.d(n,{Z:()=>i,a:()=>a});var o=t(7294);const r={},s=o.createContext(r);function a(e){const n=o.useContext(s);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:a(e.components),o.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[3190],{293:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>a,default:()=>l,frontMatter:()=>s,metadata:()=>i,toc:()=>d});var o=t(5893),r=t(1151);const s={},a="Lark (Feishu)",i={id:"user-guide/webhooks/feishu",title:"Lark (Feishu)",description:"\u98de\u4e66 use Incoming Webhooks whose constructs",source:"@site/versioned_docs/version-5.2.0/user-guide/webhooks/feishu.md",sourceDirName:"user-guide/webhooks",slug:"/user-guide/webhooks/feishu",permalink:"/docs/user-guide/webhooks/feishu",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.2.0/user-guide/webhooks/feishu.md",tags:[],version:"5.2.0",frontMatter:{},sidebar:"userGuide",previous:{title:"Discord",permalink:"/docs/user-guide/webhooks/discord"},next:{title:"Dingtalk (Dingding)",permalink:"/docs/user-guide/webhooks/dingtalk"}},c={},d=[{value:"Text format",id:"text-format",level:2},{value:"Interactive card format",id:"interactive-card-format",level:2}];function u(e){const n={a:"a",blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",p:"p",pre:"pre",...(0,r.a)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.h1,{id:"lark-feishu",children:"Lark (Feishu)"}),"\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.a,{href:"https://open.feishu.cn/document/ukTMukTMukTM/ucTM5YjL3ETO24yNxkjN",children:"\u98de\u4e66"})," use Incoming Webhooks whose constructs\ntypically support both text and interactive card, and can be configured as follows:"]}),"\n",(0,o.jsxs)(n.blockquote,{children:["\n",(0,o.jsx)(n.p,{children:"Due to system limitations try to use keyword or IP address whitelist mechanism to receive messages."}),"\n"]}),"\n",(0,o.jsx)(n.h2,{id:"text-format",children:"Text format"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-ruby",children:'{\n "msg_type": "text",\n "text": {\n "content": "#{@title}\\n\\n\u5b89\u88c5\u5730\u5740\uff1a#{@install_url}\\nUplaod at: #{@uploaded_at}"\n }\n}\n'})}),"\n",(0,o.jsx)(n.h2,{id:"interactive-card-format",children:"Interactive card format"}),"\n",(0,o.jsx)(n.p,{children:"Use card format could use partly of markdown syntax:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-ruby",children:'{\n "msg_type": "interactive",\n "card": {\n "config": {\n "wide_screen_mode": true,\n "enable_forward": true\n },\n "elements": [\n {\n "tag": "div",\n "fields": [\n {\n "is_short": true,\n "text": {\n "tag": "lark_md",\n "content": "**Platform**\\n#{@device_type}"\n }\n },\n {\n "is_short": true,\n "text": {\n "tag": "lark_md",\n "content": "**Version**\\n#{@release_version} (#{@build_version})"\n }\n },\n {\n "is_short": true,\n "text": {\n "tag": "lark_md",\n "content": "**Developer**\\n#{@username}"\n }\n },\n {\n "is_short": true,\n "text": {\n "tag": "lark_md",\n "content": "**Upload date**\\n#{@uploaded_at}"\n }\n },\n ]\n },\n {\n "tag": "div",\n "text": {\n "content": "**Changelog**\\n#{@changelog}",\n "tag": "lark_md"\n }\n },\n {\n "actions": [\n {\n "tag": "button",\n "text": {\n "content": "\ud83d\udc1e Go to app",\n "tag": "lark_md"\n },\n "url": "#{@release_url}",\n "type": "primary",\n "value": {}\n }\n ],\n "tag": "action"\n }\n ],\n "header": {\n "title": {\n "content": "#{@title}",\n "tag": "plain_text"\n }\n }\n }\n}\n'})})]})}function l(e={}){const{wrapper:n}={...(0,r.a)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(u,{...e})}):u(e)}},1151:(e,n,t)=>{t.d(n,{Z:()=>i,a:()=>a});var o=t(7294);const r={},s=o.createContext(r);function a(e){const n=o.useContext(s);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:a(e.components),o.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/0afbe734.4850320b.js b/assets/js/cf9f3cda.832014d1.js similarity index 93% rename from assets/js/0afbe734.4850320b.js rename to assets/js/cf9f3cda.832014d1.js index ce13bddde..edb7afa3d 100644 --- a/assets/js/0afbe734.4850320b.js +++ b/assets/js/cf9f3cda.832014d1.js @@ -1 +1 @@ -"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[3598],{1436:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>s,default:()=>c,frontMatter:()=>r,metadata:()=>u,toc:()=>d});var o=n(5893),i=n(1151);const r={},s="Contributing Guide",u={id:"contributing-guide/index",title:"Contributing Guide",description:"This guide will help you get started with Zealot! Thank you for taking an interest in contributing to Zealot. Before submitting your contribution, please make sure to take a moment and read through the following guidelines:",source:"@site/versioned_docs/version-5.1.0/contributing-guide/index.md",sourceDirName:"contributing-guide",slug:"/contributing-guide/",permalink:"/docs/contributing-guide/",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.1.0/contributing-guide/index.md",tags:[],version:"5.1.0",frontMatter:{},sidebar:"contributingGuide",next:{title:"Local development",permalink:"/docs/category/local-development"}},l={},d=[{value:"Getting Started",id:"getting-started",level:2},{value:"Setup for local development",id:"setup-for-local-development",level:2}];function a(e){const t={a:"a",h1:"h1",h2:"h2",li:"li",p:"p",ul:"ul",...(0,i.a)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.h1,{id:"contributing-guide",children:"Contributing Guide"}),"\n",(0,o.jsx)(t.p,{children:"This guide will help you get started with Zealot! Thank you for taking an interest in contributing to Zealot. Before submitting your contribution, please make sure to take a moment and read through the following guidelines:"}),"\n",(0,o.jsx)(t.p,{children:"This guide will help you to install and setup a production ready Zealot."}),"\n",(0,o.jsx)(t.h2,{id:"getting-started",children:"Getting Started"}),"\n",(0,o.jsx)(t.p,{children:"Before starting your work, ensure an issue exist for it. If not feel free to create one. You can also take a look into the issues tagged Good first issues.\nAdd a comment on the issue and wait for the issue to be assigned before you start working on it.\nThis helps to avoid multiple people working on similar issues.\nIf the solution is complex, propose the solution on the issue and wait for one of the core contributors to approve before going into the implementation.\nThis helps in shorter turn around times in merging PRs\nFor new feature requests, Provide a convincing reason to add this feature. Real-life business use-cases will be super helpful.\nFeel free to join our discord community, if you need further discussions with the core team."}),"\n",(0,o.jsx)(t.h2,{id:"setup-for-local-development",children:"Setup for local development"}),"\n",(0,o.jsx)(t.p,{children:"These guides will help you to setup the environment required for Zealot. Follow the guide based on the operating system you use."}),"\n",(0,o.jsxs)(t.ul,{children:["\n",(0,o.jsx)(t.li,{children:(0,o.jsx)(t.a,{href:"/docs/contributing-guide/local-development/devcontainer",children:"VSCode development with devcontainer"})}),"\n",(0,o.jsx)(t.li,{children:(0,o.jsx)(t.a,{href:"/docs/contributing-guide/local-development/source-code",children:"Soure code"})}),"\n"]})]})}function c(e={}){const{wrapper:t}={...(0,i.a)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(a,{...e})}):a(e)}},1151:(e,t,n)=>{n.d(t,{Z:()=>u,a:()=>s});var o=n(7294);const i={},r=o.createContext(i);function s(e){const t=o.useContext(r);return o.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function u(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:s(e.components),o.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[3836],{4914:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>s,default:()=>c,frontMatter:()=>r,metadata:()=>u,toc:()=>d});var o=n(5893),i=n(1151);const r={},s="Contributing Guide",u={id:"contributing-guide/index",title:"Contributing Guide",description:"This guide will help you get started with Zealot! Thank you for taking an interest in contributing to Zealot. Before submitting your contribution, please make sure to take a moment and read through the following guidelines:",source:"@site/versioned_docs/version-5.2.0/contributing-guide/index.md",sourceDirName:"contributing-guide",slug:"/contributing-guide/",permalink:"/docs/contributing-guide/",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.2.0/contributing-guide/index.md",tags:[],version:"5.2.0",frontMatter:{},sidebar:"contributingGuide",next:{title:"Local development",permalink:"/docs/category/local-development"}},l={},d=[{value:"Getting Started",id:"getting-started",level:2},{value:"Setup for local development",id:"setup-for-local-development",level:2}];function a(e){const t={a:"a",h1:"h1",h2:"h2",li:"li",p:"p",ul:"ul",...(0,i.a)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.h1,{id:"contributing-guide",children:"Contributing Guide"}),"\n",(0,o.jsx)(t.p,{children:"This guide will help you get started with Zealot! Thank you for taking an interest in contributing to Zealot. Before submitting your contribution, please make sure to take a moment and read through the following guidelines:"}),"\n",(0,o.jsx)(t.p,{children:"This guide will help you to install and setup a production ready Zealot."}),"\n",(0,o.jsx)(t.h2,{id:"getting-started",children:"Getting Started"}),"\n",(0,o.jsx)(t.p,{children:"Before starting your work, ensure an issue exist for it. If not feel free to create one. You can also take a look into the issues tagged Good first issues.\nAdd a comment on the issue and wait for the issue to be assigned before you start working on it.\nThis helps to avoid multiple people working on similar issues.\nIf the solution is complex, propose the solution on the issue and wait for one of the core contributors to approve before going into the implementation.\nThis helps in shorter turn around times in merging PRs\nFor new feature requests, Provide a convincing reason to add this feature. Real-life business use-cases will be super helpful.\nFeel free to join our discord community, if you need further discussions with the core team."}),"\n",(0,o.jsx)(t.h2,{id:"setup-for-local-development",children:"Setup for local development"}),"\n",(0,o.jsx)(t.p,{children:"These guides will help you to setup the environment required for Zealot. Follow the guide based on the operating system you use."}),"\n",(0,o.jsxs)(t.ul,{children:["\n",(0,o.jsx)(t.li,{children:(0,o.jsx)(t.a,{href:"/docs/contributing-guide/local-development/devcontainer",children:"VSCode development with devcontainer"})}),"\n",(0,o.jsx)(t.li,{children:(0,o.jsx)(t.a,{href:"/docs/contributing-guide/local-development/source-code",children:"Soure code"})}),"\n"]})]})}function c(e={}){const{wrapper:t}={...(0,i.a)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(a,{...e})}):a(e)}},1151:(e,t,n)=>{n.d(t,{Z:()=>u,a:()=>s});var o=n(7294);const i={},r=o.createContext(i);function s(e){const t=o.useContext(r);return o.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function u(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:s(e.components),o.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/d0844726.200b1ff1.js b/assets/js/d0844726.200b1ff1.js deleted file mode 100644 index 035e3dfc0..000000000 --- a/assets/js/d0844726.200b1ff1.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[5537],{7414:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>a,contentTitle:()=>r,default:()=>u,frontMatter:()=>i,metadata:()=>d,toc:()=>l});var o=n(5893),s=n(1151);const i={},r="Dingtalk (Dingding)",d={id:"user-guide/webhooks/dingtalk",title:"Dingtalk (Dingding)",description:"\u9489\u9489 use Incoming Webhooks whose constructs",source:"@site/versioned_docs/version-5.1.0/user-guide/webhooks/dingtalk.md",sourceDirName:"user-guide/webhooks",slug:"/user-guide/webhooks/dingtalk",permalink:"/docs/user-guide/webhooks/dingtalk",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.1.0/user-guide/webhooks/dingtalk.md",tags:[],version:"5.1.0",frontMatter:{},sidebar:"userGuide",previous:{title:"Lark (Feishu)",permalink:"/docs/user-guide/webhooks/feishu"},next:{title:"Wecom (Wechat Work)",permalink:"/docs/user-guide/webhooks/wecom"}},a={},l=[{value:"Text format",id:"text-format",level:2},{value:"Markdown format",id:"markdown-format",level:2}];function c(e){const t={a:"a",blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",p:"p",pre:"pre",...(0,s.a)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.h1,{id:"dingtalk-dingding",children:"Dingtalk (Dingding)"}),"\n",(0,o.jsxs)(t.p,{children:[(0,o.jsx)(t.a,{href:"https://developers.dingtalk.com/document/robots/custom-robot-access#section-e4x-4y8-9k0",children:"\u9489\u9489"})," use Incoming Webhooks whose constructs\ntypically support both text and markdown, and can be configured as follows:"]}),"\n",(0,o.jsxs)(t.blockquote,{children:["\n",(0,o.jsx)(t.p,{children:"Due to system limitations try to use keyword or IP address whitelist mechanism to receive messages."}),"\n"]}),"\n",(0,o.jsx)(t.h2,{id:"text-format",children:"Text format"}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{className:"language-ruby",children:'{\n "msgtype": "text",\n "text": {\n "content": "#{@title}\\n\\n\u5b89\u88c5\u5730\u5740\uff1a#{@install_url}\\nUplaod at: #{@uploaded_at}"\n }\n}\n'})}),"\n",(0,o.jsx)(t.h2,{id:"markdown-format",children:"Markdown format"}),"\n",(0,o.jsx)(t.p,{children:"The title field is only displayed in the dialog list, the text field is displayed for the chat content entering the dialog."}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{className:"language-ruby",children:'{\n "msgtype": "markdown",\n "markdown": {\n "title": @title,\n "text": "## #{@title}\\nPlatform: #{@device_type}\\nUplaod at: #{@uploaded_at}\\nInstall QRcode:\\n![qrcode](#{@qrcode_url})"\n }\n}\n'})})]})}function u(e={}){const{wrapper:t}={...(0,s.a)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(c,{...e})}):c(e)}},1151:(e,t,n)=>{n.d(t,{Z:()=>d,a:()=>r});var o=n(7294);const s={},i=o.createContext(s);function r(e){const t=o.useContext(i);return o.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function d(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),o.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/d0844726.e6587ca8.js b/assets/js/d0844726.e6587ca8.js new file mode 100644 index 000000000..5eed1db4e --- /dev/null +++ b/assets/js/d0844726.e6587ca8.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[5537],{7414:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>a,contentTitle:()=>r,default:()=>u,frontMatter:()=>i,metadata:()=>d,toc:()=>l});var o=n(5893),s=n(1151);const i={},r="Dingtalk (Dingding)",d={id:"user-guide/webhooks/dingtalk",title:"Dingtalk (Dingding)",description:"\u9489\u9489 use Incoming Webhooks whose constructs",source:"@site/versioned_docs/version-5.1.0/user-guide/webhooks/dingtalk.md",sourceDirName:"user-guide/webhooks",slug:"/user-guide/webhooks/dingtalk",permalink:"/docs/5.1.0/user-guide/webhooks/dingtalk",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.1.0/user-guide/webhooks/dingtalk.md",tags:[],version:"5.1.0",frontMatter:{},sidebar:"userGuide",previous:{title:"Lark (Feishu)",permalink:"/docs/5.1.0/user-guide/webhooks/feishu"},next:{title:"Wecom (Wechat Work)",permalink:"/docs/5.1.0/user-guide/webhooks/wecom"}},a={},l=[{value:"Text format",id:"text-format",level:2},{value:"Markdown format",id:"markdown-format",level:2}];function c(e){const t={a:"a",blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",p:"p",pre:"pre",...(0,s.a)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.h1,{id:"dingtalk-dingding",children:"Dingtalk (Dingding)"}),"\n",(0,o.jsxs)(t.p,{children:[(0,o.jsx)(t.a,{href:"https://developers.dingtalk.com/document/robots/custom-robot-access#section-e4x-4y8-9k0",children:"\u9489\u9489"})," use Incoming Webhooks whose constructs\ntypically support both text and markdown, and can be configured as follows:"]}),"\n",(0,o.jsxs)(t.blockquote,{children:["\n",(0,o.jsx)(t.p,{children:"Due to system limitations try to use keyword or IP address whitelist mechanism to receive messages."}),"\n"]}),"\n",(0,o.jsx)(t.h2,{id:"text-format",children:"Text format"}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{className:"language-ruby",children:'{\n "msgtype": "text",\n "text": {\n "content": "#{@title}\\n\\n\u5b89\u88c5\u5730\u5740\uff1a#{@install_url}\\nUplaod at: #{@uploaded_at}"\n }\n}\n'})}),"\n",(0,o.jsx)(t.h2,{id:"markdown-format",children:"Markdown format"}),"\n",(0,o.jsx)(t.p,{children:"The title field is only displayed in the dialog list, the text field is displayed for the chat content entering the dialog."}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{className:"language-ruby",children:'{\n "msgtype": "markdown",\n "markdown": {\n "title": @title,\n "text": "## #{@title}\\nPlatform: #{@device_type}\\nUplaod at: #{@uploaded_at}\\nInstall QRcode:\\n![qrcode](#{@qrcode_url})"\n }\n}\n'})})]})}function u(e={}){const{wrapper:t}={...(0,s.a)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(c,{...e})}):c(e)}},1151:(e,t,n)=>{n.d(t,{Z:()=>d,a:()=>r});var o=n(7294);const s={},i=o.createContext(s);function r(e){const t=o.useContext(i);return o.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function d(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),o.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/65c373d6.68da54c5.js b/assets/js/d0946d0a.99ed2440.js similarity index 97% rename from assets/js/65c373d6.68da54c5.js rename to assets/js/d0946d0a.99ed2440.js index a2d793c16..46e41f26c 100644 --- a/assets/js/65c373d6.68da54c5.js +++ b/assets/js/d0946d0a.99ed2440.js @@ -1 +1 @@ -"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[5414],{9053:(e,n,a)=>{a.r(n),a.d(n,{assets:()=>r,contentTitle:()=>o,default:()=>m,frontMatter:()=>s,metadata:()=>i,toc:()=>c});var t=a(5893),l=a(1151);const s={sidebar_label:"Kubernetes"},o="Deploy Zealot with Kubernetes guide",i={id:"self-hosted/deployment/kubernetes",title:"Deploy Zealot with Kubernetes guide",description:"Zealot support deployments using Kubernetes, but only .yaml config files are available currently.",source:"@site/versioned_docs/version-5.1.0/self-hosted/deployment/kubernetes.md",sourceDirName:"self-hosted/deployment",slug:"/self-hosted/deployment/kubernetes",permalink:"/docs/self-hosted/deployment/kubernetes",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.1.0/self-hosted/deployment/kubernetes.md",tags:[],version:"5.1.0",frontMatter:{sidebar_label:"Kubernetes"},sidebar:"selfHosted",previous:{title:"Step by step",permalink:"/docs/self-hosted/deployment/docker/step-by-step"},next:{title:"Nomad",permalink:"/docs/self-hosted/deployment/nomad"}},r={},c=[{value:"Check list",id:"check-list",level:2},{value:"Steps",id:"steps",level:2},{value:"10-zealot-namespace.yml",id:"10-zealot-namespaceyml",level:3},{value:"20-zealot-secrets.yml",id:"20-zealot-secretsyml",level:3},{value:"21-zealot-configmap.yml",id:"21-zealot-configmapyml",level:3},{value:"30-zealot-storage.yml",id:"30-zealot-storageyml",level:3},{value:"40-zealot-deployment.yml",id:"40-zealot-deploymentyml",level:3},{value:"50-zealot-service.yml",id:"50-zealot-serviceyml",level:3},{value:"60-zealot-ingress.yml",id:"60-zealot-ingressyml",level:3}];function d(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,l.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h1,{id:"deploy-zealot-with-kubernetes-guide",children:"Deploy Zealot with Kubernetes guide"}),"\n",(0,t.jsxs)(n.p,{children:["Zealot support deployments using Kubernetes, but only ",(0,t.jsx)(n.code,{children:".yaml"})," config files are available currently."]}),"\n",(0,t.jsx)(n.h2,{id:"check-list",children:"Check list"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"ConfigMap"})," and ",(0,t.jsx)(n.code,{children:"Secret"})," to configure enviroment variables."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"PersistentVolumeClaim"})," to configure ",(0,t.jsx)(n.code,{children:"public/uploads"}),", ",(0,t.jsx)(n.code,{children:"public/bakcup"}),"."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"Deployment"})," to control ",(0,t.jsx)(n.code,{children:"zealot"})," pod."]}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"steps",children:"Steps"}),"\n",(0,t.jsx)(n.h3,{id:"10-zealot-namespaceyml",children:"10-zealot-namespace.yml"}),"\n",(0,t.jsx)(n.p,{children:"Zealot namespace."}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",metastring:'title="10-zealot-namespace.yml"',children:"api Version: v1\nkind: Namespace\nmetadata:\nname: zealot\n"})}),"\n",(0,t.jsx)(n.h3,{id:"20-zealot-secretsyml",children:"20-zealot-secrets.yml"}),"\n",(0,t.jsxs)(n.p,{children:["Zealot enviroments secrets. This is loaded all secrets ",(0,t.jsx)(n.a,{href:"/docs/self-hosted/configuration/environment-variables",children:"enviroments"}),", ",(0,t.jsx)(n.strong,{children:"all values need encryt by base64"}),"."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",metastring:'title="20-zealot-secrets.yml"',children:"apiVersion: v1\nkind: Secret\nmetadata:\n namespace: zealot\n name: zealot-secrets\ndata:\n ZEALOT_ADMIN_EMAIL: V1ZkU2RHRlhOVUZsYlZab1lrYzVNRXh0VG5aaVVUMDk=\n ZEALOT_ADMIN_PASSWORD: emVAbDB0\n ZEALOT_POSTGRES_HOST: cG9zdGdyZXM=\n ZEALOT_POSTGRES_PORT: NTQzMg==\n ZEALOT_POSTGRES_USERNAME: emVhbG90\n ZEALOT_POSTGRES_PASSWORD: emVAbDB0\n ZEALOT_POSTGRES_DB_NAME: emVhbG90\n REDIS_URL: cmVkaXM6Ly9yZWRpczo2Mzc5LzE=\n\n # echo -n 'secret-key' | sha256sum | awk '{ printf $1 }' | base64\n SECRET_TOKEN: ODVkYmUxNWQ3NWVmOTMwOGM3YWUwZjMzYzdhMzI0Y2M2ZjRiZjUxOWEyZWQyZjMwMjdiZDMzYzE0MGE0ZjlhYQ==\n"})}),"\n",(0,t.jsx)(n.h3,{id:"21-zealot-configmapyml",children:"21-zealot-configmap.yml"}),"\n",(0,t.jsxs)(n.p,{children:["Zealot enviroments config map. This is loaded safe ",(0,t.jsx)(n.a,{href:"/docs/self-hosted/configuration/environment-variables",children:"enviroments"}),"."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",metastring:'title="21-zealot-configmap.yml"',children:'apiVersion: v1\nkind: ConfigMap\nmetadata:\n namespace: zealot\n name: zealot-config\ndata:\n ZEALOT_DOMAIN: zealot.icyleaf.dev\n DEFAULT_LOCALE: en\n ZEALOT_REGISTER_ENABLED: "true"\n'})}),"\n",(0,t.jsx)(n.h3,{id:"30-zealot-storageyml",children:"30-zealot-storage.yml"}),"\n",(0,t.jsx)(n.p,{children:"The creation of the persistent volume claims for uploaded files (apps/debug files) and backup files. May you want to increase the size. This expects to have a storage class installed."}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",metastring:'title="30-zealot-storage.yml"',children:"apiVersion: v1\nkind: PersistentVolumeClaim\nmetadata:\n name: zealot-uploads\n namespace: zealot\n labels:\n app: zealot\nspec:\n accessModes:\n - ReadWriteOnce\n resources:\n requests:\n storage: 20Gi\n---\napiVersion: v1\nkind: PersistentVolumeClaim\nmetadata:\n name: zealot-backup\n namespace: zealot\n labels:\n app: zealot\nspec:\n accessModes:\n - ReadWriteOnce\n resources:\n requests:\n storage: 20Gi\n"})}),"\n",(0,t.jsx)(n.h3,{id:"40-zealot-deploymentyml",children:"40-zealot-deployment.yml"}),"\n",(0,t.jsxs)(n.p,{children:["Create zealot deployment, edit ",(0,t.jsx)(n.code,{children:"replicas"})," and ",(0,t.jsx)(n.code,{children:"image"})," tag."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",metastring:'title="40-zealot-deployment.yml"',children:"apiVersion: apps/v1\nkind: Deployment\nmetadata:\n name: zealot\n namespace: zealot\nspec:\n restartPolicy: Always\n replicas: 1\n selector:\n matchLabels:\n app: zealot\n template:\n metadata:\n labels:\n app: zealot\n spec:\n containers:\n - name: zealot\n image: ghcr.io/tryzealot/zealot:nightly\n # imagePullPolicy: Always\n ports:\n - containerPort: 80\n protocol: TCP\n name: http\n envFrom:\n - configMapRef:\n name: zealot-env\n - secretRef:\n name: zealot-secrets\n volumeMounts:\n - mountPath: /app/public/uploads\n name: uploads\n - mountPath: /app/public/backup\n name: backup\n volumes:\n - name: uploads\n persistentVolumeClaim:\n claimName: zealot-uploads\n - name: backup\n persistentVolumeClaim:\n claimName: zealot-backup\n"})}),"\n",(0,t.jsx)(n.h3,{id:"50-zealot-serviceyml",children:"50-zealot-service.yml"}),"\n",(0,t.jsx)(n.p,{children:"Creating zealot service."}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",metastring:'title="50-zealot-service.yml"',children:"apiVersion: v1\nkind: Service\nmetadata:\n name: zealot\n namespace: zealot\n labels:\n app: zealot\nspec:\n selector:\n app: zealot\n ports:\n - port: 80\n targetPort: http\n name: http\n protocol: TCP\n"})}),"\n",(0,t.jsx)(n.h3,{id:"60-zealot-ingressyml",children:"60-zealot-ingress.yml"}),"\n",(0,t.jsx)(n.p,{children:"Setting up the ingress for the zealot service."}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",metastring:'title="50-zealot-ingress.yml"',children:"apiVersion: networking.k8s.io/v1\nkind: Ingress\nmetadata:\n name: zealot\n namespace: zealot\n annotations:\n #cert-manager.io/cluster-issuer: letsencrypt-prod\n #kubernetes.io/ingress.class: nginx\nspec:\n rules:\n - host: zealot.icyleaf.dev\n http:\n paths:\n - web:\n service:\n name: zealot\n port:\n number: 80\n path: /\n pathType: Prefix\n"})})]})}function m(e={}){const{wrapper:n}={...(0,l.a)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(d,{...e})}):d(e)}},1151:(e,n,a)=>{a.d(n,{Z:()=>i,a:()=>o});var t=a(7294);const l={},s=t.createContext(l);function o(e){const n=t.useContext(s);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(l):e.components||l:o(e.components),t.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[5338],{7038:(e,n,a)=>{a.r(n),a.d(n,{assets:()=>r,contentTitle:()=>o,default:()=>m,frontMatter:()=>s,metadata:()=>i,toc:()=>c});var t=a(5893),l=a(1151);const s={sidebar_label:"Kubernetes"},o="Deploy Zealot with Kubernetes guide",i={id:"self-hosted/deployment/kubernetes",title:"Deploy Zealot with Kubernetes guide",description:"Zealot support deployments using Kubernetes, but only .yaml config files are available currently.",source:"@site/versioned_docs/version-5.2.0/self-hosted/deployment/kubernetes.md",sourceDirName:"self-hosted/deployment",slug:"/self-hosted/deployment/kubernetes",permalink:"/docs/self-hosted/deployment/kubernetes",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.2.0/self-hosted/deployment/kubernetes.md",tags:[],version:"5.2.0",frontMatter:{sidebar_label:"Kubernetes"},sidebar:"selfHosted",previous:{title:"Step by step",permalink:"/docs/self-hosted/deployment/docker/step-by-step"},next:{title:"Nomad",permalink:"/docs/self-hosted/deployment/nomad"}},r={},c=[{value:"Check list",id:"check-list",level:2},{value:"Steps",id:"steps",level:2},{value:"10-zealot-namespace.yml",id:"10-zealot-namespaceyml",level:3},{value:"20-zealot-secrets.yml",id:"20-zealot-secretsyml",level:3},{value:"21-zealot-configmap.yml",id:"21-zealot-configmapyml",level:3},{value:"30-zealot-storage.yml",id:"30-zealot-storageyml",level:3},{value:"40-zealot-deployment.yml",id:"40-zealot-deploymentyml",level:3},{value:"50-zealot-service.yml",id:"50-zealot-serviceyml",level:3},{value:"60-zealot-ingress.yml",id:"60-zealot-ingressyml",level:3}];function d(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,l.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h1,{id:"deploy-zealot-with-kubernetes-guide",children:"Deploy Zealot with Kubernetes guide"}),"\n",(0,t.jsxs)(n.p,{children:["Zealot support deployments using Kubernetes, but only ",(0,t.jsx)(n.code,{children:".yaml"})," config files are available currently."]}),"\n",(0,t.jsx)(n.h2,{id:"check-list",children:"Check list"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"ConfigMap"})," and ",(0,t.jsx)(n.code,{children:"Secret"})," to configure enviroment variables."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"PersistentVolumeClaim"})," to configure ",(0,t.jsx)(n.code,{children:"public/uploads"}),", ",(0,t.jsx)(n.code,{children:"public/bakcup"}),"."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"Deployment"})," to control ",(0,t.jsx)(n.code,{children:"zealot"})," pod."]}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"steps",children:"Steps"}),"\n",(0,t.jsx)(n.h3,{id:"10-zealot-namespaceyml",children:"10-zealot-namespace.yml"}),"\n",(0,t.jsx)(n.p,{children:"Zealot namespace."}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",metastring:'title="10-zealot-namespace.yml"',children:"api Version: v1\nkind: Namespace\nmetadata:\nname: zealot\n"})}),"\n",(0,t.jsx)(n.h3,{id:"20-zealot-secretsyml",children:"20-zealot-secrets.yml"}),"\n",(0,t.jsxs)(n.p,{children:["Zealot enviroments secrets. This is loaded all secrets ",(0,t.jsx)(n.a,{href:"/docs/self-hosted/configuration/environment-variables",children:"enviroments"}),", ",(0,t.jsx)(n.strong,{children:"all values need encryt by base64"}),"."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",metastring:'title="20-zealot-secrets.yml"',children:"apiVersion: v1\nkind: Secret\nmetadata:\n namespace: zealot\n name: zealot-secrets\ndata:\n ZEALOT_ADMIN_EMAIL: V1ZkU2RHRlhOVUZsYlZab1lrYzVNRXh0VG5aaVVUMDk=\n ZEALOT_ADMIN_PASSWORD: emVAbDB0\n ZEALOT_POSTGRES_HOST: cG9zdGdyZXM=\n ZEALOT_POSTGRES_PORT: NTQzMg==\n ZEALOT_POSTGRES_USERNAME: emVhbG90\n ZEALOT_POSTGRES_PASSWORD: emVAbDB0\n ZEALOT_POSTGRES_DB_NAME: emVhbG90\n REDIS_URL: cmVkaXM6Ly9yZWRpczo2Mzc5LzE=\n\n # echo -n 'secret-key' | sha256sum | awk '{ printf $1 }' | base64\n SECRET_TOKEN: ODVkYmUxNWQ3NWVmOTMwOGM3YWUwZjMzYzdhMzI0Y2M2ZjRiZjUxOWEyZWQyZjMwMjdiZDMzYzE0MGE0ZjlhYQ==\n"})}),"\n",(0,t.jsx)(n.h3,{id:"21-zealot-configmapyml",children:"21-zealot-configmap.yml"}),"\n",(0,t.jsxs)(n.p,{children:["Zealot enviroments config map. This is loaded safe ",(0,t.jsx)(n.a,{href:"/docs/self-hosted/configuration/environment-variables",children:"enviroments"}),"."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",metastring:'title="21-zealot-configmap.yml"',children:'apiVersion: v1\nkind: ConfigMap\nmetadata:\n namespace: zealot\n name: zealot-config\ndata:\n ZEALOT_DOMAIN: zealot.icyleaf.dev\n DEFAULT_LOCALE: en\n ZEALOT_REGISTER_ENABLED: "true"\n'})}),"\n",(0,t.jsx)(n.h3,{id:"30-zealot-storageyml",children:"30-zealot-storage.yml"}),"\n",(0,t.jsx)(n.p,{children:"The creation of the persistent volume claims for uploaded files (apps/debug files) and backup files. May you want to increase the size. This expects to have a storage class installed."}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",metastring:'title="30-zealot-storage.yml"',children:"apiVersion: v1\nkind: PersistentVolumeClaim\nmetadata:\n name: zealot-uploads\n namespace: zealot\n labels:\n app: zealot\nspec:\n accessModes:\n - ReadWriteOnce\n resources:\n requests:\n storage: 20Gi\n---\napiVersion: v1\nkind: PersistentVolumeClaim\nmetadata:\n name: zealot-backup\n namespace: zealot\n labels:\n app: zealot\nspec:\n accessModes:\n - ReadWriteOnce\n resources:\n requests:\n storage: 20Gi\n"})}),"\n",(0,t.jsx)(n.h3,{id:"40-zealot-deploymentyml",children:"40-zealot-deployment.yml"}),"\n",(0,t.jsxs)(n.p,{children:["Create zealot deployment, edit ",(0,t.jsx)(n.code,{children:"replicas"})," and ",(0,t.jsx)(n.code,{children:"image"})," tag."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",metastring:'title="40-zealot-deployment.yml"',children:"apiVersion: apps/v1\nkind: Deployment\nmetadata:\n name: zealot\n namespace: zealot\nspec:\n restartPolicy: Always\n replicas: 1\n selector:\n matchLabels:\n app: zealot\n template:\n metadata:\n labels:\n app: zealot\n spec:\n containers:\n - name: zealot\n image: ghcr.io/tryzealot/zealot:nightly\n # imagePullPolicy: Always\n ports:\n - containerPort: 80\n protocol: TCP\n name: http\n envFrom:\n - configMapRef:\n name: zealot-env\n - secretRef:\n name: zealot-secrets\n volumeMounts:\n - mountPath: /app/public/uploads\n name: uploads\n - mountPath: /app/public/backup\n name: backup\n volumes:\n - name: uploads\n persistentVolumeClaim:\n claimName: zealot-uploads\n - name: backup\n persistentVolumeClaim:\n claimName: zealot-backup\n"})}),"\n",(0,t.jsx)(n.h3,{id:"50-zealot-serviceyml",children:"50-zealot-service.yml"}),"\n",(0,t.jsx)(n.p,{children:"Creating zealot service."}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",metastring:'title="50-zealot-service.yml"',children:"apiVersion: v1\nkind: Service\nmetadata:\n name: zealot\n namespace: zealot\n labels:\n app: zealot\nspec:\n selector:\n app: zealot\n ports:\n - port: 80\n targetPort: http\n name: http\n protocol: TCP\n"})}),"\n",(0,t.jsx)(n.h3,{id:"60-zealot-ingressyml",children:"60-zealot-ingress.yml"}),"\n",(0,t.jsx)(n.p,{children:"Setting up the ingress for the zealot service."}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",metastring:'title="50-zealot-ingress.yml"',children:"apiVersion: networking.k8s.io/v1\nkind: Ingress\nmetadata:\n name: zealot\n namespace: zealot\n annotations:\n #cert-manager.io/cluster-issuer: letsencrypt-prod\n #kubernetes.io/ingress.class: nginx\nspec:\n rules:\n - host: zealot.icyleaf.dev\n http:\n paths:\n - web:\n service:\n name: zealot\n port:\n number: 80\n path: /\n pathType: Prefix\n"})})]})}function m(e={}){const{wrapper:n}={...(0,l.a)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(d,{...e})}):d(e)}},1151:(e,n,a)=>{a.d(n,{Z:()=>i,a:()=>o});var t=a(7294);const l={},s=t.createContext(l);function o(e){const n=t.useContext(s);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(l):e.components||l:o(e.components),t.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/d1780259.9617e93f.js b/assets/js/d1780259.9617e93f.js new file mode 100644 index 000000000..9f61ecc51 --- /dev/null +++ b/assets/js/d1780259.9617e93f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[6490],{3566:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>r,contentTitle:()=>o,default:()=>u,frontMatter:()=>l,metadata:()=>s,toc:()=>d});var a=i(5893),t=i(1151);const l={},o="Best Practices",s={id:"user-guide/best_practices",title:"Best Practices",description:"Workflow",source:"@site/versioned_docs/version-5.1.0/user-guide/best_practices.md",sourceDirName:"user-guide",slug:"/user-guide/best_practices",permalink:"/docs/5.1.0/user-guide/best_practices",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.1.0/user-guide/best_practices.md",tags:[],version:"5.1.0",frontMatter:{},sidebar:"userGuide",previous:{title:"Database Analytics",permalink:"/docs/5.1.0/user-guide/administrator/monitoring/database-analytics"},next:{title:"Change Log",permalink:"/docs/5.1.0/user-guide/changelog"}},r={},d=[{value:"Workflow",id:"workflow",level:2},{value:"iOS and Android Apps",id:"ios-and-android-apps",level:3},{value:"Zealot SDKs",id:"zealot-sdks",level:4},{value:"Install fastlane",id:"install-fastlane",level:4},{value:"CI/CD Service",id:"cicd-service",level:3},{value:"Zealot Service",id:"zealot-service",level:3}];function c(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",li:"li",p:"p",pre:"pre",ul:"ul",...(0,t.a)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(n.h1,{id:"best-practices",children:"Best Practices"}),"\n",(0,a.jsx)(n.h2,{id:"workflow",children:"Workflow"}),"\n",(0,a.jsx)(n.h3,{id:"ios-and-android-apps",children:"iOS and Android Apps"}),"\n",(0,a.jsx)(n.h4,{id:"zealot-sdks",children:"Zealot SDKs"}),"\n",(0,a.jsx)(n.p,{children:"Integration with the Zealot SDK allows non-client development to automatically trigger new version checks, view change logs, and install functionality."}),"\n",(0,a.jsx)(n.h4,{id:"install-fastlane",children:"Install fastlane"}),"\n",(0,a.jsx)(n.p,{children:"In addition to the fastlane-plugin-zealot plugin, which is required to upload applications and debug files,\nit is highly recommended to install the following plug-ins in addition to fastlane."}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.a,{href:"https://github.com/icyleaf/fastlane-plugin-ci_changelog",children:"ci_changelog"})," | Support for multiple CI systems to automatically generate change history"]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.a,{href:"https://github.com/icyleaf/fastlane-plugin-update_jenkins_build",children:"update_jenkins_build"})," | Automatically Update Jenkins Build Description"]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.a,{href:"https://github.com/icyleaf/fastlane-plugin-humanable_build_number",children:"humanable_build_number"})," | Generate a build version number that is recognizable to development"]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.a,{href:"https://github.com/icyleaf/fastlane-plugin-app_info",children:"app_info"})," | View metadata about the application after successful packaging"]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.a,{href:"https://github.com/icyleaf/fastlane-plugin-ram_disk",children:"ram_disk"})," | Create in-memory virtual disks, mainly used to improve App build speed (consider if memory is large)"]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.a,{href:"https://github.com/icyleaf/fastlane-plugin-debug_file",children:"debug_file"})," | Automated search for iOS/macOS dSYM or Android Proguard (obfuscation) and packaging of Zip files"]}),"\n"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-ruby",children:"# Build and upload ipa to zealot service\nlane :upload_app do\n # Building the package file, using gym in iOS, gradle in Android\n gym\n\n # Uploading to Zealot\n zealot(\n endpoint: '...',\n token: '...',\n channel_key: '...'\n )\n\n # Uploading dSYM file to Zealot\n zealot_debug_file(\n scheme: 'AppName'\n )\nend\n\n# Build android package file and generate progguard then upload to zealot service\nlane :upload_debug_file do\n # Building the package file, using gym in iOS, gradle in Android\n gradle\n\n # Automated search for iOS/macOS dSYM or Android Proguard (obfuscation) and packaging of Zip files\n debug_file\n\n # Uploading to Zealot\n zealot(\n endpoint: '...',\n token: '...',\n channel_key: '...'\n )\n\n # Uploading Proguard file to Zealot\n zealot_debug_file(\n build_type: 'release',\n flavor: 'googleplay'\n )\nend\n"})}),"\n",(0,a.jsx)(n.h3,{id:"cicd-service",children:"CI/CD Service"}),"\n",(0,a.jsx)(n.p,{children:"For example, Jenkins, configure the project, set up the git hook to trigger packaging, nothing to say"}),"\n",(0,a.jsx)(n.h3,{id:"zealot-service",children:"Zealot Service"}),"\n",(0,a.jsx)(n.p,{children:"In addition to managing each uploaded application and debug file, each time an uploaded application is received,\na configured web hook is triggered to send a notification to the third-party service that a new version has been received,\nand for mobile clients that integrate with the Zealot SDK, they will receive a new version installation alert each time they open the app for the first time."})]})}function u(e={}){const{wrapper:n}={...(0,t.a)(),...e.components};return n?(0,a.jsx)(n,{...e,children:(0,a.jsx)(c,{...e})}):c(e)}},1151:(e,n,i)=>{i.d(n,{Z:()=>s,a:()=>o});var a=i(7294);const t={},l=a.createContext(t);function o(e){const n=a.useContext(l);return a.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function s(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:o(e.components),a.createElement(l.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/979376ed.824e92d9.js b/assets/js/d48f303d.fa3aae00.js similarity index 98% rename from assets/js/979376ed.824e92d9.js rename to assets/js/d48f303d.fa3aae00.js index 69a8459b7..c18031a71 100644 --- a/assets/js/979376ed.824e92d9.js +++ b/assets/js/d48f303d.fa3aae00.js @@ -1 +1 @@ -"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[8642],{8300:e=>{e.exports=JSON.parse('{"pluginId":"default","version":"5.1.0","label":"5.1.0","banner":null,"badge":true,"noIndex":false,"className":"docs-version-5.1.0","isLast":true,"docsSidebars":{"selfHosted":[{"type":"link","label":"Getting Started","href":"/docs/self-hosted/","docId":"self-hosted/index","unlisted":false},{"collapsible":false,"label":"Deployment","type":"category","items":[{"type":"link","label":"Architecture","href":"/docs/self-hosted/deployment/architecture","docId":"self-hosted/deployment/architecture","unlisted":false},{"type":"link","label":"Requirements","href":"/docs/self-hosted/deployment/requirements","docId":"self-hosted/deployment/requirements","unlisted":false},{"collapsible":true,"label":"Docker","type":"category","items":[{"type":"link","label":"Step by step","href":"/docs/self-hosted/deployment/docker/step-by-step","docId":"self-hosted/deployment/docker/step-by-step","unlisted":false}],"collapsed":true,"href":"/docs/self-hosted/deployment/docker"},{"type":"link","label":"Kubernetes","href":"/docs/self-hosted/deployment/kubernetes","docId":"self-hosted/deployment/kubernetes","unlisted":false},{"type":"link","label":"Nomad","href":"/docs/self-hosted/deployment/nomad","docId":"self-hosted/deployment/nomad","unlisted":false},{"type":"link","label":"Source code","href":"/docs/self-hosted/deployment/source-code","docId":"self-hosted/deployment/source-code","unlisted":false}],"collapsed":false,"href":"/docs/category/deployment"},{"type":"link","label":"Reverse Proxies","href":"/docs/self-hosted/reverse-proxies","docId":"self-hosted/reverse-proxies","unlisted":false},{"collapsible":false,"label":"Cloud Provider Guides","type":"category","items":[{"type":"link","label":"Fly","href":"/docs/self-hosted/deployment/fly","docId":"self-hosted/deployment/fly","unlisted":false},{"type":"link","label":"Railway","href":"/docs/self-hosted/deployment/railway","docId":"self-hosted/deployment/railway","unlisted":false},{"type":"link","label":"Render","href":"/docs/self-hosted/deployment/render","docId":"self-hosted/deployment/render","unlisted":false}],"collapsed":false,"href":"/docs/category/cloud-provider-guides"},{"collapsible":false,"label":"Configuration","type":"category","items":[{"type":"link","label":"Environment Variables","href":"/docs/self-hosted/configuration/environment-variables","docId":"self-hosted/configuration/environment-variables","unlisted":false},{"type":"link","label":"Third-party Authentication","href":"/docs/self-hosted/configuration/third-party-authentication","docId":"self-hosted/configuration/third-party-authentication","unlisted":false},{"type":"link","label":"Schedule Jobs","href":"/docs/self-hosted/configuration/schedule-jobs","docId":"self-hosted/configuration/schedule-jobs","unlisted":false}],"collapsed":false,"href":"/docs/category/configuration"},{"type":"link","label":"Storage","href":"/docs/self-hosted/storage","docId":"self-hosted/storage","unlisted":false}],"userGuide":[{"type":"link","label":"Getting Started","href":"/docs/user-guide/","docId":"user-guide/index","unlisted":false},{"type":"link","label":"Dashboard","href":"/docs/user-guide/dashboard","docId":"user-guide/dashboard","unlisted":false},{"collapsible":true,"label":"Apps","type":"category","items":[{"type":"link","label":"Create an App","href":"/docs/user-guide/apps/create","docId":"user-guide/apps/create","unlisted":false},{"type":"link","label":"Manage apps","href":"/docs/user-guide/apps/","docId":"user-guide/apps/index","unlisted":false},{"type":"link","label":"Uploaded releases","href":"/docs/user-guide/apps/detail","docId":"user-guide/apps/detail","unlisted":false},{"type":"link","label":"Uploaded a release","href":"/docs/user-guide/apps/upload","docId":"user-guide/apps/upload","unlisted":false}],"collapsed":true,"href":"/docs/category/apps"},{"collapsible":true,"label":"Debug Files","type":"category","items":[{"type":"link","label":"List debug files","href":"/docs/user-guide/debug-files/","docId":"user-guide/debug-files/index","unlisted":false},{"type":"link","label":"Review metadata","href":"/docs/user-guide/debug-files/review","docId":"user-guide/debug-files/review","unlisted":false},{"type":"link","label":"Create a Debug File","href":"/docs/user-guide/debug-files/upload","docId":"user-guide/debug-files/upload","unlisted":false}],"collapsed":true,"href":"/docs/category/debug-files"},{"collapsible":true,"label":"Toolkits","type":"category","items":[{"type":"link","label":"Teardown App","href":"/docs/user-guide/toolkits/teardown","docId":"user-guide/toolkits/teardown","unlisted":false},{"type":"link","label":"Fetch UDID","href":"/docs/user-guide/toolkits/fetch-udid","docId":"user-guide/toolkits/fetch-udid","unlisted":false}],"collapsed":true,"href":"/docs/category/toolkits"},{"collapsible":true,"label":"Webhooks","type":"category","items":[{"type":"link","label":"Slack","href":"/docs/user-guide/webhooks/slack","docId":"user-guide/webhooks/slack","unlisted":false},{"type":"link","label":"Discord","href":"/docs/user-guide/webhooks/discord","docId":"user-guide/webhooks/discord","unlisted":false},{"type":"link","label":"Lark (Feishu)","href":"/docs/user-guide/webhooks/feishu","docId":"user-guide/webhooks/feishu","unlisted":false},{"type":"link","label":"Dingtalk (Dingding)","href":"/docs/user-guide/webhooks/dingtalk","docId":"user-guide/webhooks/dingtalk","unlisted":false},{"type":"link","label":"Wecom (Wechat Work)","href":"/docs/user-guide/webhooks/wecom","docId":"user-guide/webhooks/wecom","unlisted":false}],"collapsed":true,"href":"/docs/user-guide/webhooks"},{"collapsible":true,"label":"Administrator","type":"category","items":[{"type":"link","label":"Apple Team","href":"/docs/user-guide/administrator/apple-team","docId":"user-guide/administrator/apple-team","unlisted":false},{"type":"link","label":"Permissions","href":"/docs/user-guide/administrator/permissions","docId":"user-guide/administrator/permissions","unlisted":false},{"type":"link","label":"Backup","href":"/docs/user-guide/administrator/backup","docId":"user-guide/administrator/backup","unlisted":false},{"type":"link","label":"Settings","href":"/docs/user-guide/administrator/settings","docId":"user-guide/administrator/settings","unlisted":false},{"collapsible":true,"label":"Monitoring","type":"category","items":[{"type":"link","label":"System informations","href":"/docs/user-guide/administrator/monitoring/system-info","docId":"user-guide/administrator/monitoring/system-info","unlisted":false},{"type":"link","label":"Logging","href":"/docs/user-guide/administrator/monitoring/logging","docId":"user-guide/administrator/monitoring/logging","unlisted":false},{"type":"link","label":"Background Jobs","href":"/docs/user-guide/administrator/monitoring/background-jobs","docId":"user-guide/administrator/monitoring/background-jobs","unlisted":false},{"type":"link","label":"Database Analytics","href":"/docs/user-guide/administrator/monitoring/database-analytics","docId":"user-guide/administrator/monitoring/database-analytics","unlisted":false}],"collapsed":true,"href":"/docs/category/monitoring"}],"collapsed":true,"href":"/docs/category/administrator"},{"type":"link","label":"Best Practices","href":"/docs/user-guide/best_practices","docId":"user-guide/best_practices","unlisted":false},{"type":"link","label":"Change Log","href":"/docs/user-guide/changelog","docId":"user-guide/changelog","unlisted":false},{"type":"link","label":"Q&A","href":"/docs/user-guide/qa","docId":"user-guide/qa","unlisted":false},{"type":"link","label":"Credits","href":"/docs/user-guide/credits","docId":"user-guide/credits","unlisted":false}],"developerGuide":[{"type":"link","label":"Getting Started","href":"/docs/developer-guide/","docId":"developer-guide/index","unlisted":false},{"collapsible":false,"label":"SDKs","type":"category","items":[{"type":"link","label":"iOS","href":"/docs/developer-guide/sdk/ios","docId":"developer-guide/sdk/ios","unlisted":false},{"type":"link","label":"Android","href":"/docs/developer-guide/sdk/android","docId":"developer-guide/sdk/android","unlisted":false}],"collapsed":false,"href":"/docs/category/sdks"},{"collapsible":false,"label":"fastlane plugins","type":"category","items":[{"type":"link","label":"zealot","href":"/docs/developer-guide/fastlane/zealot","docId":"developer-guide/fastlane/zealot","unlisted":false},{"type":"link","label":"zealot_version_check","href":"/docs/developer-guide/fastlane/zealot_version_check","docId":"developer-guide/fastlane/zealot_version_check","unlisted":false},{"type":"link","label":"zealot_debug_file","href":"/docs/developer-guide/fastlane/zealot_debug_file","docId":"developer-guide/fastlane/zealot_debug_file","unlisted":false},{"type":"link","label":"zealot_sync_devices","href":"/docs/developer-guide/fastlane/zealot_sync_devices","docId":"developer-guide/fastlane/zealot_sync_devices","unlisted":false}],"collapsed":false,"href":"/docs/developer-guide/fastlane"},{"collapsible":false,"label":"APIs","type":"category","items":[{"type":"link","label":"Apps","href":"/docs/developer-guide/api/apps","docId":"developer-guide/api/apps","unlisted":false},{"type":"link","label":"Debug Files","href":"/docs/developer-guide/api/debug_files","docId":"developer-guide/api/debug_files","unlisted":false}],"collapsed":false,"href":"/docs/developer-guide/api"}],"contributingGuide":[{"type":"link","label":"Getting Started","href":"/docs/contributing-guide/","docId":"contributing-guide/index","unlisted":false},{"collapsible":false,"label":"Local development","type":"category","items":[{"type":"link","label":"Visual Studio Code Dev Container Setup","href":"/docs/contributing-guide/local-development/devcontainer","docId":"contributing-guide/local-development/devcontainer","unlisted":false},{"type":"link","label":"Source code","href":"/docs/contributing-guide/local-development/source-code","docId":"contributing-guide/local-development/source-code","unlisted":false}],"collapsed":false,"href":"/docs/category/local-development"}]},"docs":{"contributing-guide/index":{"id":"contributing-guide/index","title":"Contributing Guide","description":"This guide will help you get started with Zealot! Thank you for taking an interest in contributing to Zealot. Before submitting your contribution, please make sure to take a moment and read through the following guidelines:","sidebar":"contributingGuide"},"contributing-guide/local-development/devcontainer":{"id":"contributing-guide/local-development/devcontainer","title":"Visual Studio Code Dev Container Setup","description":"The Visual Studio Code Dev Containers lets you use a Docker container as a full-featured development environment.","sidebar":"contributingGuide"},"contributing-guide/local-development/source-code":{"id":"contributing-guide/local-development/source-code","title":"Source code","description":"The following is a tutorial on local deployment development for different operating systems.","sidebar":"contributingGuide"},"developer-guide/api":{"id":"developer-guide/api","title":"APIs","description":"Use the Zealot APIs to view, upload, download the build of app or debug file.","sidebar":"developerGuide"},"developer-guide/api/apps":{"id":"developer-guide/api/apps","title":"App APIs","description":"Upload an app","sidebar":"developerGuide"},"developer-guide/api/debug_files":{"id":"developer-guide/api/debug_files","title":"Debug File APIs","description":"Upload debug file","sidebar":"developerGuide"},"developer-guide/fastlane":{"id":"developer-guide/fastlane","title":"Fastlane plugins","description":"Add Zealot plugin","sidebar":"developerGuide"},"developer-guide/fastlane/zealot":{"id":"developer-guide/fastlane/zealot","title":"Fastlane action: zealot","description":"Uploading iOS, Android and macOS app, it requires three params:","sidebar":"developerGuide"},"developer-guide/fastlane/zealot_debug_file":{"id":"developer-guide/fastlane/zealot_debug_file","title":"Fastlane action: zealot_debug_file","description":"Upload iOS dSYM or Android Proguard file(s) to Zealot","sidebar":"developerGuide"},"developer-guide/fastlane/zealot_sync_devices":{"id":"developer-guide/fastlane/zealot_sync_devices","title":"Fastlane action: zealot_sync_devices","description":"Zealot 4.5.0 built in Apple team manage which it use Apple API Key","sidebar":"developerGuide"},"developer-guide/fastlane/zealot_version_check":{"id":"developer-guide/fastlane/zealot_version_check","title":"Fastlane action: zealot_version_check","description":"Check given build exists or not on Zealot","sidebar":"developerGuide"},"developer-guide/index":{"id":"developer-guide/index","title":"Developer Guide","description":"Zealot offers a rich set of components for iOS, Android, and all aspects of the packaging process.","sidebar":"developerGuide"},"developer-guide/sdk/android":{"id":"developer-guide/sdk/android","title":"Zealot Android SDK","description":"The Android component provides a service to check for new versions and installations for Zealot, supporting both Kotlin and Java.","sidebar":"developerGuide"},"developer-guide/sdk/ios":{"id":"developer-guide/sdk/ios","title":"Zealot iOS SDK","description":"The iOS component provides a service to check for new versions and installations for Zealot,","sidebar":"developerGuide"},"self-hosted/configuration/environment-variables":{"id":"self-hosted/configuration/environment-variables","title":"Environment Variables","description":"The .env File","sidebar":"selfHosted"},"self-hosted/configuration/schedule-jobs":{"id":"self-hosted/configuration/schedule-jobs","title":"Schedule Jobs","description":"Clean old version builds","sidebar":"selfHosted"},"self-hosted/configuration/third-party-authentication":{"id":"self-hosted/configuration/third-party-authentication","title":"Third-party Authentication","description":"Zealot supports authorized logins using supported third-party services, which can be currently configured via the following environment variables or in the settings page of the admin panel.","sidebar":"selfHosted"},"self-hosted/deployment/architecture":{"id":"self-hosted/deployment/architecture","title":"Zealot Architecture","description":"Running Zealot requires the following set of services.","sidebar":"selfHosted"},"self-hosted/deployment/docker":{"id":"self-hosted/deployment/docker","title":"Deploy Zealot with Docker guide","description":"Strongly recommended to deploy Zealot using Docker,","sidebar":"selfHosted"},"self-hosted/deployment/docker/step-by-step":{"id":"self-hosted/deployment/docker/step-by-step","title":"Docker deployment guide","description":"This is a handy guide to deploying with Docker, as well as a breakdown of the on-premise deployment guide.","sidebar":"selfHosted"},"self-hosted/deployment/fly":{"id":"self-hosted/deployment/fly","title":"Deploy Zealot to Fly guide","description":"Zealot support use App Configuration (fly.toml) to deploy on fly.io.","sidebar":"selfHosted"},"self-hosted/deployment/kubernetes":{"id":"self-hosted/deployment/kubernetes","title":"Deploy Zealot with Kubernetes guide","description":"Zealot support deployments using Kubernetes, but only .yaml config files are available currently.","sidebar":"selfHosted"},"self-hosted/deployment/nomad":{"id":"self-hosted/deployment/nomad","title":"Deploy Zealot with Nomad guide","description":"Zealot support deployments using Nomad, it use HCL language to configure.","sidebar":"selfHosted"},"self-hosted/deployment/railway":{"id":"self-hosted/deployment/railway","title":"Deploy Zealot to Railway guide","description":"Zealot support use Dockfile to deploy on Railway.","sidebar":"selfHosted"},"self-hosted/deployment/render":{"id":"self-hosted/deployment/render","title":"Deploy Zealot to Render guide","description":"Zealot support a render blueprint named render.yaml to deploy on render.com.","sidebar":"selfHosted"},"self-hosted/deployment/requirements":{"id":"self-hosted/deployment/requirements","title":"Zealot Self Hosted Requirements","description":"This page incldues useful information on the requirements that are needed to install and run Zealot on your servers.","sidebar":"selfHosted"},"self-hosted/deployment/source-code":{"id":"self-hosted/deployment/source-code","title":"Source code","description":"It had been rewrite to Contributing Guide.","sidebar":"selfHosted"},"self-hosted/index":{"id":"self-hosted/index","title":"Self-hosted Installation Guide","description":"This guide will help you to install and setup a production ready Zealot.","sidebar":"selfHosted"},"self-hosted/reverse-proxies":{"id":"self-hosted/reverse-proxies","title":"Reverse Proxies","description":"To facilitate the unified management and distribution of SSL certificates, service expansion and access to off-the-shelf gateway services,","sidebar":"selfHosted"},"self-hosted/storage":{"id":"self-hosted/storage","title":"Data storages","description":"Here is a list of all the data storages required by the Zealot service,","sidebar":"selfHosted"},"user-guide/administrator/apple-team":{"id":"user-guide/administrator/apple-team","title":"Apple Team (Developer)","description":"One of the biggest challenges in distributing Ad-Hoc signed applications for iOS is the need to","sidebar":"userGuide"},"user-guide/administrator/backup":{"id":"user-guide/administrator/backup","title":"Backup Schedule","description":"Backup list","sidebar":"userGuide"},"user-guide/administrator/monitoring/background-jobs":{"id":"user-guide/administrator/monitoring/background-jobs","title":"Background Jobs","description":"{e.exports=JSON.parse('{"pluginId":"default","version":"5.2.0","label":"5.2.0","banner":null,"badge":true,"noIndex":false,"className":"docs-version-5.2.0","isLast":true,"docsSidebars":{"selfHosted":[{"type":"link","label":"Getting Started","href":"/docs/self-hosted/","docId":"self-hosted/index","unlisted":false},{"collapsible":false,"label":"Deployment","type":"category","items":[{"type":"link","label":"Architecture","href":"/docs/self-hosted/deployment/architecture","docId":"self-hosted/deployment/architecture","unlisted":false},{"type":"link","label":"Requirements","href":"/docs/self-hosted/deployment/requirements","docId":"self-hosted/deployment/requirements","unlisted":false},{"collapsible":true,"label":"Docker","type":"category","items":[{"type":"link","label":"Step by step","href":"/docs/self-hosted/deployment/docker/step-by-step","docId":"self-hosted/deployment/docker/step-by-step","unlisted":false}],"collapsed":true,"href":"/docs/self-hosted/deployment/docker"},{"type":"link","label":"Kubernetes","href":"/docs/self-hosted/deployment/kubernetes","docId":"self-hosted/deployment/kubernetes","unlisted":false},{"type":"link","label":"Nomad","href":"/docs/self-hosted/deployment/nomad","docId":"self-hosted/deployment/nomad","unlisted":false},{"type":"link","label":"Source code","href":"/docs/self-hosted/deployment/source-code","docId":"self-hosted/deployment/source-code","unlisted":false}],"collapsed":false,"href":"/docs/category/deployment"},{"type":"link","label":"Reverse Proxies","href":"/docs/self-hosted/reverse-proxies","docId":"self-hosted/reverse-proxies","unlisted":false},{"collapsible":false,"label":"Cloud Provider Guides","type":"category","items":[{"type":"link","label":"Fly","href":"/docs/self-hosted/deployment/fly","docId":"self-hosted/deployment/fly","unlisted":false},{"type":"link","label":"Railway","href":"/docs/self-hosted/deployment/railway","docId":"self-hosted/deployment/railway","unlisted":false},{"type":"link","label":"Render","href":"/docs/self-hosted/deployment/render","docId":"self-hosted/deployment/render","unlisted":false}],"collapsed":false,"href":"/docs/category/cloud-provider-guides"},{"collapsible":false,"label":"Configuration","type":"category","items":[{"type":"link","label":"Environment Variables","href":"/docs/self-hosted/configuration/environment-variables","docId":"self-hosted/configuration/environment-variables","unlisted":false},{"type":"link","label":"Third-party Authentication","href":"/docs/self-hosted/configuration/third-party-authentication","docId":"self-hosted/configuration/third-party-authentication","unlisted":false},{"type":"link","label":"Schedule Jobs","href":"/docs/self-hosted/configuration/schedule-jobs","docId":"self-hosted/configuration/schedule-jobs","unlisted":false}],"collapsed":false,"href":"/docs/category/configuration"},{"type":"link","label":"Storage","href":"/docs/self-hosted/storage","docId":"self-hosted/storage","unlisted":false}],"userGuide":[{"type":"link","label":"Getting Started","href":"/docs/user-guide/","docId":"user-guide/index","unlisted":false},{"type":"link","label":"Dashboard","href":"/docs/user-guide/dashboard","docId":"user-guide/dashboard","unlisted":false},{"collapsible":true,"label":"Apps","type":"category","items":[{"type":"link","label":"Create an App","href":"/docs/user-guide/apps/create","docId":"user-guide/apps/create","unlisted":false},{"type":"link","label":"Manage apps","href":"/docs/user-guide/apps/","docId":"user-guide/apps/index","unlisted":false},{"type":"link","label":"Uploaded releases","href":"/docs/user-guide/apps/detail","docId":"user-guide/apps/detail","unlisted":false},{"type":"link","label":"Uploaded a release","href":"/docs/user-guide/apps/upload","docId":"user-guide/apps/upload","unlisted":false}],"collapsed":true,"href":"/docs/category/apps"},{"collapsible":true,"label":"Debug Files","type":"category","items":[{"type":"link","label":"List debug files","href":"/docs/user-guide/debug-files/","docId":"user-guide/debug-files/index","unlisted":false},{"type":"link","label":"Review metadata","href":"/docs/user-guide/debug-files/review","docId":"user-guide/debug-files/review","unlisted":false},{"type":"link","label":"Create a Debug File","href":"/docs/user-guide/debug-files/upload","docId":"user-guide/debug-files/upload","unlisted":false}],"collapsed":true,"href":"/docs/category/debug-files"},{"collapsible":true,"label":"Toolkits","type":"category","items":[{"type":"link","label":"Teardown App","href":"/docs/user-guide/toolkits/teardown","docId":"user-guide/toolkits/teardown","unlisted":false},{"type":"link","label":"Fetch UDID","href":"/docs/user-guide/toolkits/fetch-udid","docId":"user-guide/toolkits/fetch-udid","unlisted":false}],"collapsed":true,"href":"/docs/category/toolkits"},{"collapsible":true,"label":"Webhooks","type":"category","items":[{"type":"link","label":"Slack","href":"/docs/user-guide/webhooks/slack","docId":"user-guide/webhooks/slack","unlisted":false},{"type":"link","label":"Discord","href":"/docs/user-guide/webhooks/discord","docId":"user-guide/webhooks/discord","unlisted":false},{"type":"link","label":"Lark (Feishu)","href":"/docs/user-guide/webhooks/feishu","docId":"user-guide/webhooks/feishu","unlisted":false},{"type":"link","label":"Dingtalk (Dingding)","href":"/docs/user-guide/webhooks/dingtalk","docId":"user-guide/webhooks/dingtalk","unlisted":false},{"type":"link","label":"Wecom (Wechat Work)","href":"/docs/user-guide/webhooks/wecom","docId":"user-guide/webhooks/wecom","unlisted":false}],"collapsed":true,"href":"/docs/user-guide/webhooks"},{"collapsible":true,"label":"Administrator","type":"category","items":[{"type":"link","label":"Apple Team","href":"/docs/user-guide/administrator/apple-team","docId":"user-guide/administrator/apple-team","unlisted":false},{"type":"link","label":"Permissions","href":"/docs/user-guide/administrator/permissions","docId":"user-guide/administrator/permissions","unlisted":false},{"type":"link","label":"Backup","href":"/docs/user-guide/administrator/backup","docId":"user-guide/administrator/backup","unlisted":false},{"type":"link","label":"Settings","href":"/docs/user-guide/administrator/settings","docId":"user-guide/administrator/settings","unlisted":false},{"collapsible":true,"label":"Monitoring","type":"category","items":[{"type":"link","label":"System informations","href":"/docs/user-guide/administrator/monitoring/system-info","docId":"user-guide/administrator/monitoring/system-info","unlisted":false},{"type":"link","label":"Logging","href":"/docs/user-guide/administrator/monitoring/logging","docId":"user-guide/administrator/monitoring/logging","unlisted":false},{"type":"link","label":"Background Jobs","href":"/docs/user-guide/administrator/monitoring/background-jobs","docId":"user-guide/administrator/monitoring/background-jobs","unlisted":false},{"type":"link","label":"Database Analytics","href":"/docs/user-guide/administrator/monitoring/database-analytics","docId":"user-guide/administrator/monitoring/database-analytics","unlisted":false}],"collapsed":true,"href":"/docs/category/monitoring"}],"collapsed":true,"href":"/docs/category/administrator"},{"type":"link","label":"Best Practices","href":"/docs/user-guide/best_practices","docId":"user-guide/best_practices","unlisted":false},{"type":"link","label":"Change Log","href":"/docs/user-guide/changelog","docId":"user-guide/changelog","unlisted":false},{"type":"link","label":"Q&A","href":"/docs/user-guide/qa","docId":"user-guide/qa","unlisted":false},{"type":"link","label":"Credits","href":"/docs/user-guide/credits","docId":"user-guide/credits","unlisted":false}],"developerGuide":[{"type":"link","label":"Getting Started","href":"/docs/developer-guide/","docId":"developer-guide/index","unlisted":false},{"collapsible":false,"label":"SDKs","type":"category","items":[{"type":"link","label":"iOS","href":"/docs/developer-guide/sdk/ios","docId":"developer-guide/sdk/ios","unlisted":false},{"type":"link","label":"Android","href":"/docs/developer-guide/sdk/android","docId":"developer-guide/sdk/android","unlisted":false}],"collapsed":false,"href":"/docs/category/sdks"},{"collapsible":false,"label":"fastlane plugins","type":"category","items":[{"type":"link","label":"zealot","href":"/docs/developer-guide/fastlane/zealot","docId":"developer-guide/fastlane/zealot","unlisted":false},{"type":"link","label":"zealot_version_check","href":"/docs/developer-guide/fastlane/zealot_version_check","docId":"developer-guide/fastlane/zealot_version_check","unlisted":false},{"type":"link","label":"zealot_debug_file","href":"/docs/developer-guide/fastlane/zealot_debug_file","docId":"developer-guide/fastlane/zealot_debug_file","unlisted":false},{"type":"link","label":"zealot_sync_devices","href":"/docs/developer-guide/fastlane/zealot_sync_devices","docId":"developer-guide/fastlane/zealot_sync_devices","unlisted":false}],"collapsed":false,"href":"/docs/developer-guide/fastlane"},{"collapsible":false,"label":"APIs","type":"category","items":[{"type":"link","label":"Apps","href":"/docs/developer-guide/api/apps","docId":"developer-guide/api/apps","unlisted":false},{"type":"link","label":"Debug Files","href":"/docs/developer-guide/api/debug_files","docId":"developer-guide/api/debug_files","unlisted":false}],"collapsed":false,"href":"/docs/developer-guide/api"}],"contributingGuide":[{"type":"link","label":"Getting Started","href":"/docs/contributing-guide/","docId":"contributing-guide/index","unlisted":false},{"collapsible":false,"label":"Local development","type":"category","items":[{"type":"link","label":"Visual Studio Code Dev Container Setup","href":"/docs/contributing-guide/local-development/devcontainer","docId":"contributing-guide/local-development/devcontainer","unlisted":false},{"type":"link","label":"Source code","href":"/docs/contributing-guide/local-development/source-code","docId":"contributing-guide/local-development/source-code","unlisted":false}],"collapsed":false,"href":"/docs/category/local-development"}]},"docs":{"contributing-guide/index":{"id":"contributing-guide/index","title":"Contributing Guide","description":"This guide will help you get started with Zealot! Thank you for taking an interest in contributing to Zealot. Before submitting your contribution, please make sure to take a moment and read through the following guidelines:","sidebar":"contributingGuide"},"contributing-guide/local-development/devcontainer":{"id":"contributing-guide/local-development/devcontainer","title":"Visual Studio Code Dev Container Setup","description":"The Visual Studio Code Dev Containers lets you use a Docker container as a full-featured development environment.","sidebar":"contributingGuide"},"contributing-guide/local-development/source-code":{"id":"contributing-guide/local-development/source-code","title":"Source code","description":"The following is a tutorial on local deployment development for different operating systems.","sidebar":"contributingGuide"},"developer-guide/api":{"id":"developer-guide/api","title":"APIs","description":"Use the Zealot APIs to view, upload, download the build of app or debug file.","sidebar":"developerGuide"},"developer-guide/api/apps":{"id":"developer-guide/api/apps","title":"App APIs","description":"Upload an app","sidebar":"developerGuide"},"developer-guide/api/debug_files":{"id":"developer-guide/api/debug_files","title":"Debug File APIs","description":"Upload debug file","sidebar":"developerGuide"},"developer-guide/fastlane":{"id":"developer-guide/fastlane","title":"Fastlane plugins","description":"Add Zealot plugin","sidebar":"developerGuide"},"developer-guide/fastlane/zealot":{"id":"developer-guide/fastlane/zealot","title":"Fastlane action: zealot","description":"Uploading iOS, Android and macOS app, it requires three params:","sidebar":"developerGuide"},"developer-guide/fastlane/zealot_debug_file":{"id":"developer-guide/fastlane/zealot_debug_file","title":"Fastlane action: zealot_debug_file","description":"Upload iOS dSYM or Android Proguard file(s) to Zealot","sidebar":"developerGuide"},"developer-guide/fastlane/zealot_sync_devices":{"id":"developer-guide/fastlane/zealot_sync_devices","title":"Fastlane action: zealot_sync_devices","description":"Zealot 4.5.0 built in Apple team manage which it use Apple API Key","sidebar":"developerGuide"},"developer-guide/fastlane/zealot_version_check":{"id":"developer-guide/fastlane/zealot_version_check","title":"Fastlane action: zealot_version_check","description":"Check given build exists or not on Zealot","sidebar":"developerGuide"},"developer-guide/index":{"id":"developer-guide/index","title":"Developer Guide","description":"Zealot offers a rich set of components for iOS, Android, and all aspects of the packaging process.","sidebar":"developerGuide"},"developer-guide/sdk/android":{"id":"developer-guide/sdk/android","title":"Zealot Android SDK","description":"The Android component provides a service to check for new versions and installations for Zealot, supporting both Kotlin and Java.","sidebar":"developerGuide"},"developer-guide/sdk/ios":{"id":"developer-guide/sdk/ios","title":"Zealot iOS SDK","description":"The iOS component provides a service to check for new versions and installations for Zealot,","sidebar":"developerGuide"},"self-hosted/configuration/environment-variables":{"id":"self-hosted/configuration/environment-variables","title":"Environment Variables","description":"The .env File","sidebar":"selfHosted"},"self-hosted/configuration/schedule-jobs":{"id":"self-hosted/configuration/schedule-jobs","title":"Schedule Jobs","description":"Clean old version builds","sidebar":"selfHosted"},"self-hosted/configuration/third-party-authentication":{"id":"self-hosted/configuration/third-party-authentication","title":"Third-party Authentication","description":"Zealot supports authorized logins using supported third-party services, which can be currently configured via the following environment variables or in the settings page of the admin panel.","sidebar":"selfHosted"},"self-hosted/deployment/architecture":{"id":"self-hosted/deployment/architecture","title":"Zealot Architecture","description":"Running Zealot requires the following set of services.","sidebar":"selfHosted"},"self-hosted/deployment/docker":{"id":"self-hosted/deployment/docker","title":"Deploy Zealot with Docker guide","description":"Strongly recommended to deploy Zealot using Docker,","sidebar":"selfHosted"},"self-hosted/deployment/docker/step-by-step":{"id":"self-hosted/deployment/docker/step-by-step","title":"Docker deployment guide","description":"This is a handy guide to deploying with Docker, as well as a breakdown of the on-premise deployment guide.","sidebar":"selfHosted"},"self-hosted/deployment/fly":{"id":"self-hosted/deployment/fly","title":"Deploy Zealot to Fly guide","description":"Zealot support use App Configuration (fly.toml) to deploy on fly.io.","sidebar":"selfHosted"},"self-hosted/deployment/kubernetes":{"id":"self-hosted/deployment/kubernetes","title":"Deploy Zealot with Kubernetes guide","description":"Zealot support deployments using Kubernetes, but only .yaml config files are available currently.","sidebar":"selfHosted"},"self-hosted/deployment/nomad":{"id":"self-hosted/deployment/nomad","title":"Deploy Zealot with Nomad guide","description":"Zealot support deployments using Nomad, it use HCL language to configure.","sidebar":"selfHosted"},"self-hosted/deployment/railway":{"id":"self-hosted/deployment/railway","title":"Deploy Zealot to Railway guide","description":"Zealot support use Dockfile to deploy on Railway.","sidebar":"selfHosted"},"self-hosted/deployment/render":{"id":"self-hosted/deployment/render","title":"Deploy Zealot to Render guide","description":"Zealot support a render blueprint named render.yaml to deploy on render.com.","sidebar":"selfHosted"},"self-hosted/deployment/requirements":{"id":"self-hosted/deployment/requirements","title":"Zealot Self Hosted Requirements","description":"This page incldues useful information on the requirements that are needed to install and run Zealot on your servers.","sidebar":"selfHosted"},"self-hosted/deployment/source-code":{"id":"self-hosted/deployment/source-code","title":"Source code","description":"It had been rewrite to Contributing Guide.","sidebar":"selfHosted"},"self-hosted/index":{"id":"self-hosted/index","title":"Self-hosted Installation Guide","description":"This guide will help you to install and setup a production ready Zealot.","sidebar":"selfHosted"},"self-hosted/reverse-proxies":{"id":"self-hosted/reverse-proxies","title":"Reverse Proxies","description":"To facilitate the unified management and distribution of SSL certificates, service expansion and access to off-the-shelf gateway services,","sidebar":"selfHosted"},"self-hosted/storage":{"id":"self-hosted/storage","title":"Data storages","description":"Here is a list of all the data storages required by the Zealot service,","sidebar":"selfHosted"},"user-guide/administrator/apple-team":{"id":"user-guide/administrator/apple-team","title":"Apple Team (Developer)","description":"One of the biggest challenges in distributing Ad-Hoc signed applications for iOS is the need to","sidebar":"userGuide"},"user-guide/administrator/backup":{"id":"user-guide/administrator/backup","title":"Backup Schedule","description":"Backup list","sidebar":"userGuide"},"user-guide/administrator/monitoring/background-jobs":{"id":"user-guide/administrator/monitoring/background-jobs","title":"Background Jobs","description":"{i.r(t),i.d(t,{assets:()=>c,contentTitle:()=>a,default:()=>p,frontMatter:()=>l,metadata:()=>d,toc:()=>h});var s=i(5893),n=i(1151),r=i(9965),o=i(4996);const l={},a="User Guide",d={id:"user-guide/index",title:"User Guide",description:"GitHub release",source:"@site/versioned_docs/version-5.1.0/user-guide/index.mdx",sourceDirName:"user-guide",slug:"/user-guide/",permalink:"/docs/user-guide/",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.1.0/user-guide/index.mdx",tags:[],version:"5.1.0",frontMatter:{},sidebar:"userGuide",next:{title:"Dashboard",permalink:"/docs/user-guide/dashboard"}},c={},h=[{value:"Features",id:"features",level:2},{value:"Demo",id:"demo",level:2},{value:"About the translation",id:"about-the-translation",level:2}];function u(e){const t={a:"a",blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",img:"img",li:"li",p:"p",strong:"strong",ul:"ul",...(0,n.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.h1,{id:"user-guide",children:"User Guide"}),"\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.a,{href:"https://github.com/tryzealot/zealot/releases",children:(0,s.jsx)(t.img,{src:"https://img.shields.io/github/v/release/tryzealot/zealot?include_prereleases",alt:"GitHub release"})}),"\n",(0,s.jsx)(t.a,{href:"https://hub.docker.com/r/tryzealot/zealot/",children:(0,s.jsx)(t.img,{src:"https://img.shields.io/docker/pulls/tryzealot/zealot.svg",alt:"Docker Pulls"})}),"\n",(0,s.jsx)(t.a,{href:"https://img.shields.io/badge/chat-on%20telegram-important.svg",children:(0,s.jsx)(t.img,{src:"https://img.shields.io/badge/chat-on%20telegram-important.svg",alt:"Chat on Telegram"})}),"\n",(0,s.jsx)(t.a,{href:"https://codeclimate.com/github/tryzealot/zealot",children:(0,s.jsx)(t.img,{src:"https://codeclimate.com/github/tryzealot/zealot/badges/gpa.svg",alt:"Maintainability"})}),"\n",(0,s.jsx)(t.a,{href:"https://github.com/tryzealot/zealot/blob/develop/LICENSE",children:(0,s.jsx)(t.img,{src:"https://img.shields.io/github/license/tryzealot/zealot",alt:"License"})})]}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Self-hosted Beta App Distribution for Android, iOS, macOS, Windows and Linux apps."})}),"\n",(0,s.jsx)(t.p,{children:"Continuous everything. Automate the lifecycle of your apps. Connect your CI to build in the cloud, test on thousands of real devices, distribute to beta testers and app stores. All in one place."}),"\n",(0,s.jsx)(r.Z,{alt:"Preview",sources:{light:(0,o.Z)("/img/showcase-light.png"),dark:(0,o.Z)("/img/showcase-dark.png")}}),"\n",(0,s.jsx)(t.h2,{id:"features",children:"Features"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:["\ud83c\udf0f ",(0,s.jsx)(t.strong,{children:"Cross-platform hosting"}),": supports macOS, iOS, Android (apk/",(0,s.jsx)(t.strong,{children:"aab"}),"), Windows, Linux extensive platforms."]}),"\n",(0,s.jsxs)(t.li,{children:["\ud83d\udcf1 ",(0,s.jsx)(t.strong,{children:"iOS device in control"}),": automatically synchronizes iOS test device information and allows for one-click registration of new devices with Apple developers."]}),"\n",(0,s.jsxs)(t.li,{children:["\ud83e\uddd1\u200d\ud83d\udcbb ",(0,s.jsx)(t.strong,{children:"Full developer toolkit"}),": provides REST API, [iOS][zealot-ios-sdk], [Android][android-android-sdk] SDKs and [fastlane][fastlane-plugin-zealot] automation plugins for building."]}),"\n",(0,s.jsxs)(t.li,{children:["\ud83d\udca5 ",(0,s.jsx)(t.strong,{children:"Analyze secrets within applications"}),": interpret metadata for iOS or Android applications or describe files."]}),"\n",(0,s.jsxs)(t.li,{children:["\ud83d\udea8 ",(0,s.jsx)(t.strong,{children:"Multiple notification built-in"}),": customizable data income WebHook to any notification service."]}),"\n",(0,s.jsxs)(t.li,{children:["\ud83d\uddc4 ",(0,s.jsx)(t.strong,{children:"Multi-channel classification management"}),": freely divide application channel management into different scenarios and product forms."]}),"\n",(0,s.jsxs)(t.li,{children:["\ud83c\udfb3 ",(0,s.jsx)(t.strong,{children:"Multiple Architectures"})," amd86/arm64/armv7 architectures deployment ready."]}),"\n",(0,s.jsxs)(t.li,{children:["\ud83d\udd11 ",(0,s.jsx)(t.strong,{children:"Third-party Auth"}),": Google, Gitlab, LDAP, OIDC and Lark suppotted."]}),"\n",(0,s.jsxs)(t.li,{children:["\ud83c\udf11 ",(0,s.jsx)(t.strong,{children:"Dark mode"}),": Feel free to switch between day and night."]}),"\n"]}),"\n",(0,s.jsx)(t.h2,{id:"demo",children:"Demo"}),"\n",(0,s.jsxs)(t.p,{children:["Simplified Chinese by default, change the language in ",(0,s.jsx)(t.a,{href:"/docs/user-guide/administrator/settings",children:"Settings"})," page."]}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:["URL\uff1a",(0,s.jsx)(t.a,{href:"https://tryzealot.ews.im/",children:"https://tryzealot.ews.im/"})]}),"\n",(0,s.jsxs)(t.li,{children:["Admin account: ",(0,s.jsx)(t.code,{children:"admin@zealot.com"})]}),"\n",(0,s.jsxs)(t.li,{children:["Password: ",(0,s.jsx)(t.code,{children:"ze@l0t"})]}),"\n"]}),"\n",(0,s.jsxs)(t.blockquote,{children:["\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.strong,{children:"Notification"}),": There is instability run on a free resource cloud service and RESET ALL DATA daily."]}),"\n"]}),"\n",(0,s.jsx)(t.h2,{id:"about-the-translation",children:"About the translation"}),"\n",(0,s.jsxs)(t.p,{children:["The translation powered by ",(0,s.jsx)(t.a,{href:"https://www.deepl.com/translator",children:"DeepL"})," and it inevitably have some defects, please provide feedback in time, thanks!"]})]})}function p(e={}){const{wrapper:t}={...(0,n.a)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(u,{...e})}):u(e)}},1151:(e,t,i)=>{i.d(t,{Z:()=>l,a:()=>o});var s=i(7294);const n={},r=s.createContext(n);function o(e){const t=s.useContext(r);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function l(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:o(e.components),s.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[7380],{6500:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>c,contentTitle:()=>a,default:()=>p,frontMatter:()=>l,metadata:()=>d,toc:()=>h});var s=i(5893),n=i(1151),r=i(9965),o=i(4996);const l={},a="User Guide",d={id:"user-guide/index",title:"User Guide",description:"GitHub release",source:"@site/versioned_docs/version-5.2.0/user-guide/index.mdx",sourceDirName:"user-guide",slug:"/user-guide/",permalink:"/docs/user-guide/",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.2.0/user-guide/index.mdx",tags:[],version:"5.2.0",frontMatter:{},sidebar:"userGuide",next:{title:"Dashboard",permalink:"/docs/user-guide/dashboard"}},c={},h=[{value:"Features",id:"features",level:2},{value:"Demo",id:"demo",level:2},{value:"About the translation",id:"about-the-translation",level:2}];function u(e){const t={a:"a",blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",img:"img",li:"li",p:"p",strong:"strong",ul:"ul",...(0,n.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.h1,{id:"user-guide",children:"User Guide"}),"\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.a,{href:"https://github.com/tryzealot/zealot/releases",children:(0,s.jsx)(t.img,{src:"https://img.shields.io/github/v/release/tryzealot/zealot?include_prereleases",alt:"GitHub release"})}),"\n",(0,s.jsx)(t.a,{href:"https://hub.docker.com/r/tryzealot/zealot/",children:(0,s.jsx)(t.img,{src:"https://img.shields.io/docker/pulls/tryzealot/zealot.svg",alt:"Docker Pulls"})}),"\n",(0,s.jsx)(t.a,{href:"https://img.shields.io/badge/chat-on%20telegram-important.svg",children:(0,s.jsx)(t.img,{src:"https://img.shields.io/badge/chat-on%20telegram-important.svg",alt:"Chat on Telegram"})}),"\n",(0,s.jsx)(t.a,{href:"https://codeclimate.com/github/tryzealot/zealot",children:(0,s.jsx)(t.img,{src:"https://codeclimate.com/github/tryzealot/zealot/badges/gpa.svg",alt:"Maintainability"})}),"\n",(0,s.jsx)(t.a,{href:"https://github.com/tryzealot/zealot/blob/develop/LICENSE",children:(0,s.jsx)(t.img,{src:"https://img.shields.io/github/license/tryzealot/zealot",alt:"License"})})]}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Self-hosted Beta App Distribution for Android, iOS, macOS, Windows and Linux apps."})}),"\n",(0,s.jsx)(t.p,{children:"Continuous everything. Automate the lifecycle of your apps. Connect your CI to build in the cloud, test on thousands of real devices, distribute to beta testers and app stores. All in one place."}),"\n",(0,s.jsx)(r.Z,{alt:"Preview",sources:{light:(0,o.Z)("/img/showcase-light.png"),dark:(0,o.Z)("/img/showcase-dark.png")}}),"\n",(0,s.jsx)(t.h2,{id:"features",children:"Features"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:["\ud83c\udf0f ",(0,s.jsx)(t.strong,{children:"Cross-platform hosting"}),": supports macOS, iOS, Android (apk/",(0,s.jsx)(t.strong,{children:"aab"}),"), Windows, Linux extensive platforms."]}),"\n",(0,s.jsxs)(t.li,{children:["\ud83d\udcf1 ",(0,s.jsx)(t.strong,{children:"iOS device in control"}),": automatically synchronizes iOS test device information and allows for one-click registration of new devices with Apple developers."]}),"\n",(0,s.jsxs)(t.li,{children:["\ud83e\uddd1\u200d\ud83d\udcbb ",(0,s.jsx)(t.strong,{children:"Full developer toolkit"}),": provides REST API, [iOS][zealot-ios-sdk], [Android][android-android-sdk] SDKs and [fastlane][fastlane-plugin-zealot] automation plugins for building."]}),"\n",(0,s.jsxs)(t.li,{children:["\ud83d\udca5 ",(0,s.jsx)(t.strong,{children:"Analyze secrets within applications"}),": interpret metadata for iOS or Android applications or describe files."]}),"\n",(0,s.jsxs)(t.li,{children:["\ud83d\udea8 ",(0,s.jsx)(t.strong,{children:"Multiple notification built-in"}),": customizable data income WebHook to any notification service."]}),"\n",(0,s.jsxs)(t.li,{children:["\ud83d\uddc4 ",(0,s.jsx)(t.strong,{children:"Multi-channel classification management"}),": freely divide application channel management into different scenarios and product forms."]}),"\n",(0,s.jsxs)(t.li,{children:["\ud83c\udfb3 ",(0,s.jsx)(t.strong,{children:"Multiple Architectures"})," amd86/arm64/armv7 architectures deployment ready."]}),"\n",(0,s.jsxs)(t.li,{children:["\ud83d\udd11 ",(0,s.jsx)(t.strong,{children:"Third-party Auth"}),": Google, Gitlab, LDAP, OIDC and Lark suppotted."]}),"\n",(0,s.jsxs)(t.li,{children:["\ud83c\udf11 ",(0,s.jsx)(t.strong,{children:"Dark mode"}),": Feel free to switch between day and night."]}),"\n"]}),"\n",(0,s.jsx)(t.h2,{id:"demo",children:"Demo"}),"\n",(0,s.jsxs)(t.p,{children:["Simplified Chinese by default, change the language in ",(0,s.jsx)(t.a,{href:"/docs/user-guide/administrator/settings",children:"Settings"})," page."]}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:["URL\uff1a",(0,s.jsx)(t.a,{href:"https://tryzealot.ews.im/",children:"https://tryzealot.ews.im/"})]}),"\n",(0,s.jsxs)(t.li,{children:["Admin account: ",(0,s.jsx)(t.code,{children:"admin@zealot.com"})]}),"\n",(0,s.jsxs)(t.li,{children:["Password: ",(0,s.jsx)(t.code,{children:"ze@l0t"})]}),"\n"]}),"\n",(0,s.jsxs)(t.blockquote,{children:["\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.strong,{children:"Notification"}),": There is instability run on a free resource cloud service and RESET ALL DATA daily."]}),"\n"]}),"\n",(0,s.jsx)(t.h2,{id:"about-the-translation",children:"About the translation"}),"\n",(0,s.jsxs)(t.p,{children:["The translation powered by ",(0,s.jsx)(t.a,{href:"https://www.deepl.com/translator",children:"DeepL"})," and it inevitably have some defects, please provide feedback in time, thanks!"]})]})}function p(e={}){const{wrapper:t}={...(0,n.a)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(u,{...e})}):u(e)}},1151:(e,t,i)=>{i.d(t,{Z:()=>l,a:()=>o});var s=i(7294);const n={},r=s.createContext(n);function o(e){const t=s.useContext(r);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function l(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:o(e.components),s.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/d5638fd3.29fab70a.js b/assets/js/d5638fd3.29fab70a.js new file mode 100644 index 000000000..12027a3c1 --- /dev/null +++ b/assets/js/d5638fd3.29fab70a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[7106],{7376:(e,s,n)=>{n.r(s),n.d(s,{assets:()=>d,contentTitle:()=>o,default:()=>h,frontMatter:()=>i,metadata:()=>a,toc:()=>l});var r=n(5893),t=n(1151);const i={sidebar_label:"Requirements"},o="Zealot Self Hosted Requirements",a={id:"self-hosted/deployment/requirements",title:"Zealot Self Hosted Requirements",description:"This page incldues useful information on the requirements that are needed to install and run Zealot on your servers.",source:"@site/versioned_docs/version-5.1.0/self-hosted/deployment/requirements.md",sourceDirName:"self-hosted/deployment",slug:"/self-hosted/deployment/requirements",permalink:"/docs/5.1.0/self-hosted/deployment/requirements",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.1.0/self-hosted/deployment/requirements.md",tags:[],version:"5.1.0",frontMatter:{sidebar_label:"Requirements"},sidebar:"selfHosted",previous:{title:"Architecture",permalink:"/docs/5.1.0/self-hosted/deployment/architecture"},next:{title:"On-premise (Docker)",permalink:"/docs/5.1.0/self-hosted/deployment/docker"}},d={},l=[{value:"Operating Systems",id:"operating-systems",level:2},{value:"Hardware requirements",id:"hardware-requirements",level:2},{value:"Architecture",id:"architecture",level:3},{value:"CPU",id:"cpu",level:3},{value:"Memory",id:"memory",level:3},{value:"Storage",id:"storage",level:3},{value:"Software requirements",id:"software-requirements",level:2},{value:"Ruby versions",id:"ruby-versions",level:3},{value:"Node.js versions",id:"nodejs-versions",level:3},{value:"Database",id:"database",level:2},{value:"PostgreSQL Requirements",id:"postgresql-requirements",level:3},{value:"Redis",id:"redis",level:3},{value:"Sidekiq",id:"sidekiq",level:2},{value:"Supported web browsers",id:"supported-web-browsers",level:2}];function c(e){const s={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",input:"input",li:"li",p:"p",strong:"strong",ul:"ul",...(0,t.a)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(s.h1,{id:"zealot-self-hosted-requirements",children:"Zealot Self Hosted Requirements"}),"\n",(0,r.jsx)(s.p,{children:"This page incldues useful information on the requirements that are needed to install and run Zealot on your servers."}),"\n",(0,r.jsx)(s.h2,{id:"operating-systems",children:"Operating Systems"}),"\n",(0,r.jsx)(s.p,{children:"Installation of Zealot is possible on most Linux environments, but not officially supported."}),"\n",(0,r.jsx)(s.h2,{id:"hardware-requirements",children:"Hardware requirements"}),"\n",(0,r.jsx)(s.h3,{id:"architecture",children:"Architecture"}),"\n",(0,r.jsx)(s.p,{children:"Zealot can now run on either x86_64(amd86) or arm64(armv8/arrch) or armv7 based mostly Linux OS, for example: Debian, Ubuntu, CentOS, Arch Linux, Armbian etc."}),"\n",(0,r.jsx)(s.h3,{id:"cpu",children:"CPU"}),"\n",(0,r.jsx)(s.p,{children:"CPU requirements are dependent on the usage and expected workload. Your workload is influenced by factors such as - but not limited to - how many apps and debug files are uploaded and parsed, how many apps are downloaded, how many web hooks are triggered, how often Apple developers sync test devices, and how much and how often backup schedule jobs are made."}),"\n",(0,r.jsx)(s.p,{children:"The following is the recommended minimum CPU hardware guidance for a handful of example Zealot conversation base sizes."}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsxs)(s.li,{children:[(0,r.jsx)(s.strong,{children:"1 cores"})," is the ",(0,r.jsx)(s.strong,{children:"required"})," minimum number of cores."]}),"\n"]}),"\n",(0,r.jsx)(s.h3,{id:"memory",children:"Memory"}),"\n",(0,r.jsx)(s.p,{children:"Memory requirements are dependent on the usage and expected workload. Your workload is influenced by factors such as - but not limited to - how many apps and debug files are uploaded and parsed, how many apps are downloaded, how many web hooks are triggered, how often Apple developers sync test devices, and how much and how often backup schedule jobs are made."}),"\n",(0,r.jsx)(s.p,{children:"The following is the recommended minimum Memory hardware guidance for a handful of example Zealot conversation base sizes."}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsxs)(s.li,{children:[(0,r.jsx)(s.strong,{children:"512MB RAM"})," is the ",(0,r.jsx)(s.strong,{children:"required"})," minimum memory size."]}),"\n"]}),"\n",(0,r.jsx)(s.h3,{id:"storage",children:"Storage"}),"\n",(0,r.jsx)(s.p,{children:"The necessary hard drive space largely depends on the size and number of apps and debug files uploaded, also include backup files."}),"\n",(0,r.jsx)(s.h2,{id:"software-requirements",children:"Software requirements"}),"\n",(0,r.jsx)(s.h3,{id:"ruby-versions",children:"Ruby versions"}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsx)(s.li,{children:"Ruby 3.0 and later is required."}),"\n"]}),"\n",(0,r.jsx)(s.p,{children:"You must use the standard MRI implementation of Ruby. Zealot needs several Gems that have native extensions."}),"\n",(0,r.jsx)(s.h3,{id:"nodejs-versions",children:"Node.js versions"}),"\n",(0,r.jsxs)(s.p,{children:["Zealot uses ",(0,r.jsx)(s.a,{href:"https://esbuild.github.io/",children:"esbuild"})," and ",(0,r.jsx)(s.a,{href:"https://sass-lang.com/",children:"sass"})," to compile frontend assets."]}),"\n",(0,r.jsx)(s.p,{children:"We recommend Node 14.x or higher version, as it's faster."}),"\n",(0,r.jsxs)(s.p,{children:["You can check which version you're running with ",(0,r.jsx)(s.code,{children:"node -v"}),". If you're running a version older than ",(0,r.jsx)(s.code,{children:"v8.0"}),",\nyou need to update it to a newer version. You can find instructions to install from community maintained packages or compile from source at the ",(0,r.jsx)(s.a,{href:"https://nodejs.org/en/download/",children:"Node.js website"}),"."]}),"\n",(0,r.jsx)(s.h2,{id:"database",children:"Database"}),"\n",(0,r.jsx)(s.p,{children:"PostgreSQL is the only supported database. We don't have plans to support any other alternatives as of now."}),"\n",(0,r.jsx)(s.h3,{id:"postgresql-requirements",children:"PostgreSQL Requirements"}),"\n",(0,r.jsxs)(s.p,{children:["The server running PostgreSQL should have ",(0,r.jsx)(s.em,{children:"at least"})," 5-10 GB of storage\navailable, though the exact requirements depends on the usage on your Zealot Instance."]}),"\n",(0,r.jsx)(s.p,{children:"We highly recommend using the latest stable PostgreSQL versions as these were used for development and testing."}),"\n",(0,r.jsx)(s.h3,{id:"redis",children:"Redis"}),"\n",(0,r.jsx)(s.p,{children:"Redis stores the background task queue and various Zealot configurations cached.\nThe storage requirements for Redis are minimal, You can start with 50MB and scale up as required."}),"\n",(0,r.jsx)(s.p,{children:"Redis version 6.2 or higher version is recommended"}),"\n",(0,r.jsx)(s.h2,{id:"sidekiq",children:"Sidekiq"}),"\n",(0,r.jsx)(s.p,{children:"Sidekiq processes the background jobs with a multi-threaded process.\nThis process starts with the entire Rails stack but it can grow over time due to memory leaks.\nOn a very active server the Sidekiq process can use 1GB+ of memory."}),"\n",(0,r.jsx)(s.h2,{id:"supported-web-browsers",children:"Supported web browsers"}),"\n",(0,r.jsx)(s.admonition,{type:"tip",children:(0,r.jsx)(s.p,{children:"We don't support running Zealot with JavaScript disabled in the browser."})}),"\n",(0,r.jsx)(s.p,{children:"Zealot supports the following web browsers:"}),"\n",(0,r.jsxs)(s.ul,{className:"contains-task-list",children:["\n",(0,r.jsxs)(s.li,{className:"task-list-item",children:[(0,r.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ",(0,r.jsx)(s.a,{href:"https://www.mozilla.org/en-US/firefox/new/",children:"Mozilla Firefox"})]}),"\n",(0,r.jsxs)(s.li,{className:"task-list-item",children:[(0,r.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ",(0,r.jsx)(s.a,{href:"https://www.google.com/chrome/",children:"Google Chrome"})]}),"\n",(0,r.jsxs)(s.li,{className:"task-list-item",children:[(0,r.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ",(0,r.jsx)(s.a,{href:"https://www.chromium.org/getting-involved/dev-channel",children:"Chromium"})]}),"\n",(0,r.jsxs)(s.li,{className:"task-list-item",children:[(0,r.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ",(0,r.jsx)(s.a,{href:"https://www.apple.com/safari/",children:"Apple Safari"})]}),"\n",(0,r.jsxs)(s.li,{className:"task-list-item",children:[(0,r.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ",(0,r.jsx)(s.a,{href:"https://www.microsoft.com/en-us/edge",children:"Microsoft Edge"})]}),"\n"]})]})}function h(e={}){const{wrapper:s}={...(0,t.a)(),...e.components};return s?(0,r.jsx)(s,{...e,children:(0,r.jsx)(c,{...e})}):c(e)}},1151:(e,s,n)=>{n.d(s,{Z:()=>a,a:()=>o});var r=n(7294);const t={},i=r.createContext(t);function o(e){const s=r.useContext(i);return r.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function a(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:o(e.components),r.createElement(i.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/d5638fd3.d9d0d2ec.js b/assets/js/d5638fd3.d9d0d2ec.js deleted file mode 100644 index 902642537..000000000 --- a/assets/js/d5638fd3.d9d0d2ec.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[7106],{7376:(e,s,n)=>{n.r(s),n.d(s,{assets:()=>d,contentTitle:()=>o,default:()=>h,frontMatter:()=>i,metadata:()=>a,toc:()=>l});var r=n(5893),t=n(1151);const i={sidebar_label:"Requirements"},o="Zealot Self Hosted Requirements",a={id:"self-hosted/deployment/requirements",title:"Zealot Self Hosted Requirements",description:"This page incldues useful information on the requirements that are needed to install and run Zealot on your servers.",source:"@site/versioned_docs/version-5.1.0/self-hosted/deployment/requirements.md",sourceDirName:"self-hosted/deployment",slug:"/self-hosted/deployment/requirements",permalink:"/docs/self-hosted/deployment/requirements",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.1.0/self-hosted/deployment/requirements.md",tags:[],version:"5.1.0",frontMatter:{sidebar_label:"Requirements"},sidebar:"selfHosted",previous:{title:"Architecture",permalink:"/docs/self-hosted/deployment/architecture"},next:{title:"On-premise (Docker)",permalink:"/docs/self-hosted/deployment/docker"}},d={},l=[{value:"Operating Systems",id:"operating-systems",level:2},{value:"Hardware requirements",id:"hardware-requirements",level:2},{value:"Architecture",id:"architecture",level:3},{value:"CPU",id:"cpu",level:3},{value:"Memory",id:"memory",level:3},{value:"Storage",id:"storage",level:3},{value:"Software requirements",id:"software-requirements",level:2},{value:"Ruby versions",id:"ruby-versions",level:3},{value:"Node.js versions",id:"nodejs-versions",level:3},{value:"Database",id:"database",level:2},{value:"PostgreSQL Requirements",id:"postgresql-requirements",level:3},{value:"Redis",id:"redis",level:3},{value:"Sidekiq",id:"sidekiq",level:2},{value:"Supported web browsers",id:"supported-web-browsers",level:2}];function c(e){const s={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",input:"input",li:"li",p:"p",strong:"strong",ul:"ul",...(0,t.a)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(s.h1,{id:"zealot-self-hosted-requirements",children:"Zealot Self Hosted Requirements"}),"\n",(0,r.jsx)(s.p,{children:"This page incldues useful information on the requirements that are needed to install and run Zealot on your servers."}),"\n",(0,r.jsx)(s.h2,{id:"operating-systems",children:"Operating Systems"}),"\n",(0,r.jsx)(s.p,{children:"Installation of Zealot is possible on most Linux environments, but not officially supported."}),"\n",(0,r.jsx)(s.h2,{id:"hardware-requirements",children:"Hardware requirements"}),"\n",(0,r.jsx)(s.h3,{id:"architecture",children:"Architecture"}),"\n",(0,r.jsx)(s.p,{children:"Zealot can now run on either x86_64(amd86) or arm64(armv8/arrch) or armv7 based mostly Linux OS, for example: Debian, Ubuntu, CentOS, Arch Linux, Armbian etc."}),"\n",(0,r.jsx)(s.h3,{id:"cpu",children:"CPU"}),"\n",(0,r.jsx)(s.p,{children:"CPU requirements are dependent on the usage and expected workload. Your workload is influenced by factors such as - but not limited to - how many apps and debug files are uploaded and parsed, how many apps are downloaded, how many web hooks are triggered, how often Apple developers sync test devices, and how much and how often backup schedule jobs are made."}),"\n",(0,r.jsx)(s.p,{children:"The following is the recommended minimum CPU hardware guidance for a handful of example Zealot conversation base sizes."}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsxs)(s.li,{children:[(0,r.jsx)(s.strong,{children:"1 cores"})," is the ",(0,r.jsx)(s.strong,{children:"required"})," minimum number of cores."]}),"\n"]}),"\n",(0,r.jsx)(s.h3,{id:"memory",children:"Memory"}),"\n",(0,r.jsx)(s.p,{children:"Memory requirements are dependent on the usage and expected workload. Your workload is influenced by factors such as - but not limited to - how many apps and debug files are uploaded and parsed, how many apps are downloaded, how many web hooks are triggered, how often Apple developers sync test devices, and how much and how often backup schedule jobs are made."}),"\n",(0,r.jsx)(s.p,{children:"The following is the recommended minimum Memory hardware guidance for a handful of example Zealot conversation base sizes."}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsxs)(s.li,{children:[(0,r.jsx)(s.strong,{children:"512MB RAM"})," is the ",(0,r.jsx)(s.strong,{children:"required"})," minimum memory size."]}),"\n"]}),"\n",(0,r.jsx)(s.h3,{id:"storage",children:"Storage"}),"\n",(0,r.jsx)(s.p,{children:"The necessary hard drive space largely depends on the size and number of apps and debug files uploaded, also include backup files."}),"\n",(0,r.jsx)(s.h2,{id:"software-requirements",children:"Software requirements"}),"\n",(0,r.jsx)(s.h3,{id:"ruby-versions",children:"Ruby versions"}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsx)(s.li,{children:"Ruby 3.0 and later is required."}),"\n"]}),"\n",(0,r.jsx)(s.p,{children:"You must use the standard MRI implementation of Ruby. Zealot needs several Gems that have native extensions."}),"\n",(0,r.jsx)(s.h3,{id:"nodejs-versions",children:"Node.js versions"}),"\n",(0,r.jsxs)(s.p,{children:["Zealot uses ",(0,r.jsx)(s.a,{href:"https://esbuild.github.io/",children:"esbuild"})," and ",(0,r.jsx)(s.a,{href:"https://sass-lang.com/",children:"sass"})," to compile frontend assets."]}),"\n",(0,r.jsx)(s.p,{children:"We recommend Node 14.x or higher version, as it's faster."}),"\n",(0,r.jsxs)(s.p,{children:["You can check which version you're running with ",(0,r.jsx)(s.code,{children:"node -v"}),". If you're running a version older than ",(0,r.jsx)(s.code,{children:"v8.0"}),",\nyou need to update it to a newer version. You can find instructions to install from community maintained packages or compile from source at the ",(0,r.jsx)(s.a,{href:"https://nodejs.org/en/download/",children:"Node.js website"}),"."]}),"\n",(0,r.jsx)(s.h2,{id:"database",children:"Database"}),"\n",(0,r.jsx)(s.p,{children:"PostgreSQL is the only supported database. We don't have plans to support any other alternatives as of now."}),"\n",(0,r.jsx)(s.h3,{id:"postgresql-requirements",children:"PostgreSQL Requirements"}),"\n",(0,r.jsxs)(s.p,{children:["The server running PostgreSQL should have ",(0,r.jsx)(s.em,{children:"at least"})," 5-10 GB of storage\navailable, though the exact requirements depends on the usage on your Zealot Instance."]}),"\n",(0,r.jsx)(s.p,{children:"We highly recommend using the latest stable PostgreSQL versions as these were used for development and testing."}),"\n",(0,r.jsx)(s.h3,{id:"redis",children:"Redis"}),"\n",(0,r.jsx)(s.p,{children:"Redis stores the background task queue and various Zealot configurations cached.\nThe storage requirements for Redis are minimal, You can start with 50MB and scale up as required."}),"\n",(0,r.jsx)(s.p,{children:"Redis version 6.2 or higher version is recommended"}),"\n",(0,r.jsx)(s.h2,{id:"sidekiq",children:"Sidekiq"}),"\n",(0,r.jsx)(s.p,{children:"Sidekiq processes the background jobs with a multi-threaded process.\nThis process starts with the entire Rails stack but it can grow over time due to memory leaks.\nOn a very active server the Sidekiq process can use 1GB+ of memory."}),"\n",(0,r.jsx)(s.h2,{id:"supported-web-browsers",children:"Supported web browsers"}),"\n",(0,r.jsx)(s.admonition,{type:"tip",children:(0,r.jsx)(s.p,{children:"We don't support running Zealot with JavaScript disabled in the browser."})}),"\n",(0,r.jsx)(s.p,{children:"Zealot supports the following web browsers:"}),"\n",(0,r.jsxs)(s.ul,{className:"contains-task-list",children:["\n",(0,r.jsxs)(s.li,{className:"task-list-item",children:[(0,r.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ",(0,r.jsx)(s.a,{href:"https://www.mozilla.org/en-US/firefox/new/",children:"Mozilla Firefox"})]}),"\n",(0,r.jsxs)(s.li,{className:"task-list-item",children:[(0,r.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ",(0,r.jsx)(s.a,{href:"https://www.google.com/chrome/",children:"Google Chrome"})]}),"\n",(0,r.jsxs)(s.li,{className:"task-list-item",children:[(0,r.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ",(0,r.jsx)(s.a,{href:"https://www.chromium.org/getting-involved/dev-channel",children:"Chromium"})]}),"\n",(0,r.jsxs)(s.li,{className:"task-list-item",children:[(0,r.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ",(0,r.jsx)(s.a,{href:"https://www.apple.com/safari/",children:"Apple Safari"})]}),"\n",(0,r.jsxs)(s.li,{className:"task-list-item",children:[(0,r.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ",(0,r.jsx)(s.a,{href:"https://www.microsoft.com/en-us/edge",children:"Microsoft Edge"})]}),"\n"]})]})}function h(e={}){const{wrapper:s}={...(0,t.a)(),...e.components};return s?(0,r.jsx)(s,{...e,children:(0,r.jsx)(c,{...e})}):c(e)}},1151:(e,s,n)=>{n.d(s,{Z:()=>a,a:()=>o});var r=n(7294);const t={},i=r.createContext(t);function o(e){const s=r.useContext(i);return r.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function a(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:o(e.components),r.createElement(i.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/d64a1c62.f49c17eb.js b/assets/js/d64a1c62.f49c17eb.js new file mode 100644 index 000000000..17f91440a --- /dev/null +++ b/assets/js/d64a1c62.f49c17eb.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[608],{8848:(e,n,a)=>{a.r(n),a.d(n,{assets:()=>o,contentTitle:()=>d,default:()=>p,frontMatter:()=>i,metadata:()=>c,toc:()=>u});var l=a(5893),s=a(1151),t=a(4866),r=a(5162);const i={sidebar_label:"Source code"},d="Source code",c={id:"contributing-guide/local-development/source-code",title:"Source code",description:"The following is a tutorial on local deployment development for different operating systems.",source:"@site/versioned_docs/version-5.2.0/contributing-guide/local-development/source-code.md",sourceDirName:"contributing-guide/local-development",slug:"/contributing-guide/local-development/source-code",permalink:"/docs/contributing-guide/local-development/source-code",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.2.0/contributing-guide/local-development/source-code.md",tags:[],version:"5.2.0",frontMatter:{sidebar_label:"Source code"},sidebar:"contributingGuide",previous:{title:"Visual Studio Code Dev Container Setup",permalink:"/docs/contributing-guide/local-development/devcontainer"}},o={},u=[{value:"Prepare dependencies",id:"prepare-dependencies",level:2},{value:"macOS",id:"macos",level:3},{value:"Install homebrew",id:"install-homebrew",level:4},{value:"Install dependencies",id:"install-dependencies",level:4},{value:"Setup Database and cache services",id:"setup-database-and-cache-services",level:4},{value:"yarn",id:"yarn",level:4},{value:"Debian (Ubuntu)",id:"debian-ubuntu",level:3},{value:"System dependencies",id:"system-dependencies",level:4},{value:"Install dependencies",id:"install-dependencies-1",level:4},{value:"Setup Database and cache services",id:"setup-database-and-cache-services-1",level:4},{value:"node",id:"node",level:4},{value:"Alpine Linux",id:"alpine-linux",level:3},{value:"System dependencies",id:"system-dependencies-1",level:4},{value:"Install dependencies",id:"install-dependencies-2",level:4},{value:"Setup Database and cache services",id:"setup-database-and-cache-services-2",level:4},{value:"Install Ruby",id:"install-ruby",level:2},{value:"Fetch source code",id:"fetch-source-code",level:2},{value:"Initialize Zealot",id:"initialize-zealot",level:2},{value:"bundler",id:"bundler",level:3},{value:"yarn",id:"yarn-1",level:3},{value:"Initialize database",id:"initialize-database",level:3},{value:"Initialize default account and demo data",id:"initialize-default-account-and-demo-data",level:3},{value:"Launch services",id:"launch-services",level:3}];function h(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",p:"p",pre:"pre",...(0,s.a)(),...e.components};return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(n.h1,{id:"source-code",children:"Source code"}),"\n","\n","\n",(0,l.jsx)(n.p,{children:"The following is a tutorial on local deployment development for different operating systems."}),"\n",(0,l.jsx)(n.h2,{id:"prepare-dependencies",children:"Prepare dependencies"}),"\n",(0,l.jsx)(n.h3,{id:"macos",children:"macOS"}),"\n",(0,l.jsx)(n.h4,{id:"install-homebrew",children:"Install homebrew"}),"\n",(0,l.jsx)(n.p,{children:"First you need to install Xcode Command tools:"}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"$ xcode-select --install\n"})}),"\n",(0,l.jsx)(n.p,{children:"Then install Homebrew, the package management tool for macOS"}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:'$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"\n'})}),"\n",(0,l.jsx)(n.h4,{id:"install-dependencies",children:"Install dependencies"}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"$ brew install redis postgresql webp imagemagick node git\n"})}),"\n",(0,l.jsx)(n.h4,{id:"setup-database-and-cache-services",children:"Setup Database and cache services"}),"\n",(0,l.jsx)(n.p,{children:"Run postgresql and redis services"}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"$ brew services start postgresql\n$ brew services start redis\n"})}),"\n",(0,l.jsx)(n.p,{children:"You also need to create a default username in Postgresql\uff1a"}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"$ createuser --superuser zealot\n\n# If you are worried about the high privilege, you can only enable the create database privilege\n$ createuser --createdb zealot\n"})}),"\n",(0,l.jsx)(n.h4,{id:"yarn",children:"yarn"}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"$ npm install -g yarn\n"})}),"\n",(0,l.jsx)(n.h3,{id:"debian-ubuntu",children:"Debian (Ubuntu)"}),"\n",(0,l.jsx)(n.h4,{id:"system-dependencies",children:"System dependencies"}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"$ apt update\n$ apt install -y libssl-dev tar tzdata git imagemagick libjpeg-dev libpng-dev libtiff-dev libwebp-dev\n"})}),"\n",(0,l.jsx)(n.h4,{id:"install-dependencies-1",children:"Install dependencies"}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"$ apt install -y redis postgresql-client node\n"})}),"\n",(0,l.jsx)(n.h4,{id:"setup-database-and-cache-services-1",children:"Setup Database and cache services"}),"\n",(0,l.jsx)(n.p,{children:"Run postgresql and redis services"}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"$ systemctl postgres start\n$ systemctl redis start\n"})}),"\n",(0,l.jsx)(n.p,{children:"You also need to create a default username in Postgresql\uff1a"}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"$ initdb -D /var/lib/postgresql/data\n$ createuser --superuser zealot\n\n# If you are worried about the high privilege, you can only enable the create database privilege\n$ createuser --createdb zealot\n"})}),"\n",(0,l.jsx)(n.h4,{id:"node",children:"node"}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"$ npm install -g yarn\n"})}),"\n",(0,l.jsx)(n.h3,{id:"alpine-linux",children:"Alpine Linux"}),"\n",(0,l.jsx)(n.h4,{id:"system-dependencies-1",children:"System dependencies"}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"$ apk --update --no-cache add build-base libxml2 libxslt git \\\n libxml2-dev libxslt-dev yaml-dev postgresql-dev nodejs npm yarn libwebp-dev libpng-dev tiff-dev \\\n tzdata\n"})}),"\n",(0,l.jsxs)(n.p,{children:["Needs install ",(0,l.jsx)(n.code,{children:"gcompat"})," if use ",(0,l.jsx)(n.code,{children:"arm"}),' architecture. or an exception will throws such like "',(0,l.jsx)(n.a,{href:"https://nokogiri.org/tutorials/installing_nokogiri.html#linux-musl-error-loading-shared-library",children:"Error loading shared library"}),'".']}),"\n",(0,l.jsx)(n.h4,{id:"install-dependencies-2",children:"Install dependencies"}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"$ apk --update --no-cache redis postgresql\n"})}),"\n",(0,l.jsx)(n.h4,{id:"setup-database-and-cache-services-2",children:"Setup Database and cache services"}),"\n",(0,l.jsx)(n.p,{children:"Run postgresql and redis services"}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"$ rc-service postgres start\n$ rc-service redis start\n"})}),"\n",(0,l.jsx)(n.p,{children:"You also need to create a default username in Postgresql\uff1a"}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"$ initdb -D /var/lib/postgresql/data\n$ createuser --superuser zealot\n\n# If you are worried about the high privilege, you can only enable the create database privilege\n$ createuser --createdb zealot\n"})}),"\n",(0,l.jsx)(n.h2,{id:"install-ruby",children:"Install Ruby"}),"\n",(0,l.jsx)(n.p,{children:"Can be installed by either asdf, rvm as ruby version manager."}),"\n",(0,l.jsxs)(t.Z,{groupId:"install-ruby",children:[(0,l.jsxs)(r.Z,{value:"asdf",children:[(0,l.jsxs)(n.p,{children:["Following the ",(0,l.jsx)(n.a,{href:"http://asdf-vm.com/guide/getting-started.html",children:"offical install guide"})," then:"]}),(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"# Enable Ruby 3.2.0 YJIT need install rust 1.58+\n# Optinal install:\nasdf plugin add rust\nasdf install rust latest\nasdf global rust latest\nexport RUBY_CONFIGURE_OPTS=--enable-yjit\n\n# Required:\nasdf plugin add ruby\nasdf install ruby 3.2.0\nasdf global ruby 3.2.0\n"})})]}),(0,l.jsx)(r.Z,{value:"rvm",children:(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"$ curl -sSL https://get.rvm.io | bash -s stable\n$ rvm install 3.2.0 --disable-binary\n"})})})]}),"\n",(0,l.jsx)(n.h2,{id:"fetch-source-code",children:"Fetch source code"}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"git clone https://github.com/tryzealot/zealot.git\n"})}),"\n",(0,l.jsx)(n.h2,{id:"initialize-zealot",children:"Initialize Zealot"}),"\n",(0,l.jsx)(n.p,{children:"All the following steps need to be performed in the zealot root directory."}),"\n",(0,l.jsx)(n.h3,{id:"bundler",children:"bundler"}),"\n",(0,l.jsx)(n.p,{children:"Install Ruby gems"}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"$ [sudo] gem install bundler\n$ bundle install\n"})}),"\n",(0,l.jsx)(n.h3,{id:"yarn-1",children:"yarn"}),"\n",(0,l.jsx)(n.p,{children:"Install javascript packages:"}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"$ yarn install\n"})}),"\n",(0,l.jsx)(n.h3,{id:"initialize-database",children:"Initialize database"}),"\n",(0,l.jsx)(n.p,{children:"Make sure there are no problems with the connection database information, then the database tables will be created and the table structure will be created:"}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"$ rails db:create\n$ rails db:migrate\n"})}),"\n",(0,l.jsxs)(n.p,{children:["Configuring the connection database can be done via ",(0,l.jsx)(n.a,{href:"/docs/self-hosted/configuration/environment-variables",children:"environment variables"})," or by changing the ",(0,l.jsx)(n.code,{children:"config/database.yml"})," file."]}),"\n",(0,l.jsx)(n.h3,{id:"initialize-default-account-and-demo-data",children:"Initialize default account and demo data"}),"\n",(0,l.jsx)(n.p,{children:"Initialize administrator account and sample application"}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"$ rails db:seed\n"})}),"\n",(0,l.jsx)(n.h3,{id:"launch-services",children:"Launch services"}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"$ bin/dev\n"})}),"\n",(0,l.jsxs)(n.p,{children:["Open brower ",(0,l.jsx)(n.code,{children:"http://localhost:3000"})]})]})}function p(e={}){const{wrapper:n}={...(0,s.a)(),...e.components};return n?(0,l.jsx)(n,{...e,children:(0,l.jsx)(h,{...e})}):h(e)}},5162:(e,n,a)=>{a.d(n,{Z:()=>r});a(7294);var l=a(512);const s={tabItem:"tabItem_Ymn6"};var t=a(5893);function r(e){let{children:n,hidden:a,className:r}=e;return(0,t.jsx)("div",{role:"tabpanel",className:(0,l.Z)(s.tabItem,r),hidden:a,children:n})}},4866:(e,n,a)=>{a.d(n,{Z:()=>w});var l=a(7294),s=a(512),t=a(2466),r=a(6550),i=a(469),d=a(1980),c=a(7392),o=a(12);function u(e){return l.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,l.isValidElement)(e)&&function(e){const{props:n}=e;return!!n&&"object"==typeof n&&"value"in n}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function h(e){const{values:n,children:a}=e;return(0,l.useMemo)((()=>{const e=n??function(e){return u(e).map((e=>{let{props:{value:n,label:a,attributes:l,default:s}}=e;return{value:n,label:a,attributes:l,default:s}}))}(a);return function(e){const n=(0,c.l)(e,((e,n)=>e.value===n.value));if(n.length>0)throw new Error(`Docusaurus error: Duplicate values "${n.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[n,a])}function p(e){let{value:n,tabValues:a}=e;return a.some((e=>e.value===n))}function b(e){let{queryString:n=!1,groupId:a}=e;const s=(0,r.k6)(),t=function(e){let{queryString:n=!1,groupId:a}=e;if("string"==typeof n)return n;if(!1===n)return null;if(!0===n&&!a)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return a??null}({queryString:n,groupId:a});return[(0,d._X)(t),(0,l.useCallback)((e=>{if(!t)return;const n=new URLSearchParams(s.location.search);n.set(t,e),s.replace({...s.location,search:n.toString()})}),[t,s])]}function g(e){const{defaultValue:n,queryString:a=!1,groupId:s}=e,t=h(e),[r,d]=(0,l.useState)((()=>function(e){let{defaultValue:n,tabValues:a}=e;if(0===a.length)throw new Error("Docusaurus error: the component requires at least one children component");if(n){if(!p({value:n,tabValues:a}))throw new Error(`Docusaurus error: The has a defaultValue "${n}" but none of its children has the corresponding value. Available values are: ${a.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return n}const l=a.find((e=>e.default))??a[0];if(!l)throw new Error("Unexpected error: 0 tabValues");return l.value}({defaultValue:n,tabValues:t}))),[c,u]=b({queryString:a,groupId:s}),[g,m]=function(e){let{groupId:n}=e;const a=function(e){return e?`docusaurus.tab.${e}`:null}(n),[s,t]=(0,o.Nk)(a);return[s,(0,l.useCallback)((e=>{a&&t.set(e)}),[a,t])]}({groupId:s}),v=(()=>{const e=c??g;return p({value:e,tabValues:t})?e:null})();(0,i.Z)((()=>{v&&d(v)}),[v]);return{selectedValue:r,selectValue:(0,l.useCallback)((e=>{if(!p({value:e,tabValues:t}))throw new Error(`Can't select invalid tab value=${e}`);d(e),u(e),m(e)}),[u,m,t]),tabValues:t}}var m=a(2389);const v={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var x=a(5893);function f(e){let{className:n,block:a,selectedValue:l,selectValue:r,tabValues:i}=e;const d=[],{blockElementScrollPositionUntilNextRender:c}=(0,t.o5)(),o=e=>{const n=e.currentTarget,a=d.indexOf(n),s=i[a].value;s!==l&&(c(n),r(s))},u=e=>{let n=null;switch(e.key){case"Enter":o(e);break;case"ArrowRight":{const a=d.indexOf(e.currentTarget)+1;n=d[a]??d[0];break}case"ArrowLeft":{const a=d.indexOf(e.currentTarget)-1;n=d[a]??d[d.length-1];break}}n?.focus()};return(0,x.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,s.Z)("tabs",{"tabs--block":a},n),children:i.map((e=>{let{value:n,label:a,attributes:t}=e;return(0,x.jsx)("li",{role:"tab",tabIndex:l===n?0:-1,"aria-selected":l===n,ref:e=>d.push(e),onKeyDown:u,onClick:o,...t,className:(0,s.Z)("tabs__item",v.tabItem,t?.className,{"tabs__item--active":l===n}),children:a??n},n)}))})}function j(e){let{lazy:n,children:a,selectedValue:s}=e;const t=(Array.isArray(a)?a:[a]).filter(Boolean);if(n){const e=t.find((e=>e.props.value===s));return e?(0,l.cloneElement)(e,{className:"margin-top--md"}):null}return(0,x.jsx)("div",{className:"margin-top--md",children:t.map(((e,n)=>(0,l.cloneElement)(e,{key:n,hidden:e.props.value!==s})))})}function y(e){const n=g(e);return(0,x.jsxs)("div",{className:(0,s.Z)("tabs-container",v.tabList),children:[(0,x.jsx)(f,{...e,...n}),(0,x.jsx)(j,{...e,...n})]})}function w(e){const n=(0,m.Z)();return(0,x.jsx)(y,{...e,children:u(e.children)},String(n))}},1151:(e,n,a)=>{a.d(n,{Z:()=>i,a:()=>r});var l=a(7294);const s={},t=l.createContext(s);function r(e){const n=l.useContext(t);return l.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),l.createElement(t.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/db742c3c.0148e3e9.js b/assets/js/db742c3c.0148e3e9.js new file mode 100644 index 000000000..9a5202d9a --- /dev/null +++ b/assets/js/db742c3c.0148e3e9.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[1525],{346:(e,i,n)=>{n.r(i),n.d(i,{assets:()=>o,contentTitle:()=>t,default:()=>h,frontMatter:()=>l,metadata:()=>r,toc:()=>a});var s=n(5893),d=n(1151);const l={},t="Change Log",r={id:"user-guide/changelog",title:"Change Log",description:"5.2.0 (2024-03-14)",source:"@site/versioned_docs/version-5.2.0/user-guide/changelog.md",sourceDirName:"user-guide",slug:"/user-guide/changelog",permalink:"/docs/user-guide/changelog",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.2.0/user-guide/changelog.md",tags:[],version:"5.2.0",frontMatter:{},sidebar:"userGuide",previous:{title:"Best Practices",permalink:"/docs/user-guide/best_practices"},next:{title:"Q&A",permalink:"/docs/user-guide/qa"}},o={},a=[{value:"5.2.0 (2024-03-14)",id:"520-2024-03-14",level:2},{value:"Added",id:"added",level:4},{value:"Fixed",id:"fixed",level:4},{value:"5.1.0 (2023-12-07)",id:"510-2023-12-07",level:2},{value:"Changed",id:"changed",level:4},{value:"Added",id:"added-1",level:4},{value:"Fixed",id:"fixed-1",level:4},{value:"5.0.0 (2023-09-06)",id:"500-2023-09-06",level:2},{value:"Changed",id:"changed-1",level:4},{value:"Added",id:"added-2",level:4},{value:"Fixed",id:"fixed-2",level:4},{value:"4.7.1 (2023-03-10)",id:"471-2023-03-10",level:2},{value:"Changed",id:"changed-2",level:4},{value:"Fixed",id:"fixed-3",level:4},{value:"Added",id:"added-3",level:4},{value:"4.7.0 (2023-03-03)",id:"470-2023-03-03",level:2},{value:"Changed",id:"changed-3",level:4},{value:"Added",id:"added-4",level:4},{value:"Fixed",id:"fixed-4",level:4},{value:"4.6.0 (2023-01-17)",id:"460-2023-01-17",level:2},{value:"Fixed",id:"fixed-5",level:4},{value:"Added",id:"added-5",level:4},{value:"Changed",id:"changed-4",level:4},{value:"4.5.3 (2022-11-22)",id:"453-2022-11-22",level:2},{value:"Fixed",id:"fixed-6",level:4},{value:"Added",id:"added-6",level:4},{value:"4.5.2 (2022-11-01)",id:"452-2022-11-01",level:2},{value:"Fixed",id:"fixed-7",level:4},{value:"Added",id:"added-7",level:4},{value:"Changed",id:"changed-5",level:4},{value:"4.5.1 (2022-09-14)",id:"451-2022-09-14",level:2},{value:"Fixed",id:"fixed-8",level:4},{value:"4.5.0 (2022-08-19)",id:"450-2022-08-19",level:2},{value:"Added",id:"added-8",level:4},{value:"Changed",id:"changed-6",level:4},{value:"Fixed",id:"fixed-9",level:4},{value:"4.4.1 (2022-06-20)",id:"441-2022-06-20",level:2},{value:"Fixed",id:"fixed-10",level:4},{value:"4.4.0 (2022-06-09)",id:"440-2022-06-09",level:2},{value:"Changed",id:"changed-7",level:4},{value:"Added",id:"added-9",level:4},{value:"Fixed",id:"fixed-11",level:4},{value:"4.3.1 (2021-12-22)",id:"431-2021-12-22",level:2},{value:"Added",id:"added-10",level:4},{value:"Fixed",id:"fixed-12",level:4},{value:"4.3.0 (2021-12-08)",id:"430-2021-12-08",level:2},{value:"Changed",id:"changed-8",level:4},{value:"Added",id:"added-11",level:4},{value:"Fixed",id:"fixed-13",level:4},{value:"4.2.2 (2021-10-15)",id:"422-2021-10-15",level:2},{value:"Fixed",id:"fixed-14",level:4},{value:"4.2.1 (2021-09-14)",id:"421-2021-09-14",level:2},{value:"Changed",id:"changed-9",level:4},{value:"Fixed",id:"fixed-15",level:4},{value:"4.2.0 (2021-09-01)",id:"420-2021-09-01",level:2},{value:"Changed",id:"changed-10",level:4},{value:"Added",id:"added-12",level:4},{value:"Fixed",id:"fixed-16",level:4},{value:"4.1.0 (2021-07-17)",id:"410-2021-07-17",level:2},{value:"Changed",id:"changed-11",level:4},{value:"Added",id:"added-13",level:4},{value:"Fixed",id:"fixed-17",level:4},{value:"4.0.0 (2020-12-31)",id:"400-2020-12-31",level:2},{value:"Fixed",id:"fixed-18",level:4},{value:"4.0.0.rc2 (2020-12-25)",id:"400rc2-2020-12-25",level:2},{value:"Added",id:"added-14",level:4},{value:"Changed",id:"changed-12",level:4},{value:"Fixed",id:"fixed-19",level:4},{value:"4.0.0.rc1 (2020-10-29)",id:"400rc1-2020-10-29",level:2},{value:"Changed",id:"changed-13",level:4},{value:"Added",id:"added-15",level:4},{value:"Fixed",id:"fixed-20",level:4},{value:"4.0.0.beta4 (2020-05-07)",id:"400beta4-2020-05-07",level:2},{value:"Added",id:"added-16",level:4},{value:"Fixed",id:"fixed-21",level:4},{value:"Changed",id:"changed-14",level:4},{value:"4.0.0.beta3 (2020-01-16)",id:"400beta3-2020-01-16",level:2},{value:"Added",id:"added-17",level:4},{value:"Fixed",id:"fixed-22",level:4},{value:"Changed",id:"changed-15",level:4},{value:"4.0.0.beta2 (2020-01-10)",id:"400beta2-2020-01-10",level:2},{value:"Added",id:"added-18",level:4},{value:"Fixed",id:"fixed-23",level:4},{value:"4.0.0.beta1",id:"400beta1",level:2},{value:"Previous Version",id:"previous-version",level:2}];function c(e){const i={a:"a",code:"code",h1:"h1",h2:"h2",h4:"h4",li:"li",p:"p",strong:"strong",ul:"ul",...(0,d.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(i.h1,{id:"change-log",children:"Change Log"}),"\n",(0,s.jsx)(i.h2,{id:"520-2024-03-14",children:"5.2.0 (2024-03-14)"}),"\n",(0,s.jsxs)(i.p,{children:["Minor functional fixes, with minor upgrades to new features. Full ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/compare/5.1.0...5.2.0",children:"commit changes"}),"."]}),"\n",(0,s.jsx)(i.h4,{id:"added",children:"Added"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," New setting for maximum number of retained versions added ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/1407",children:"#1407"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," Opened up the feature for macOS systems to retrieve device UDID"]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," Allow registration of macOS devices to Apple Developer for testing"]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"fixed",children:"Fixed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," Exception error for Android unpacking without services storage"]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," Failure to create due to validation error on creating webhook format ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/issues/1314",children:"#1314"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," Exception error caused by application version details mismatching debug files query ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/issues/1406",children:"#1406"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"API"})," Fixed the download debug files endpoint and changed the request to GET ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/issues/1416",children:"#1416"})]}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"510-2023-12-07",children:"5.1.0 (2023-12-07)"}),"\n",(0,s.jsxs)(i.p,{children:["Mainly functional fixes, with minor upgrades to new features. Full ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/compare/5.0.0...5.1.0",children:"commit changes"}),"."]}),"\n",(0,s.jsx)(i.h4,{id:"changed",children:"Changed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Docker"})," ",(0,s.jsx)(i.strong,{children:"Major Change"})," The minimum version of Redis dependencies has been updated from 5.x to 6.2+. It is recommended to use version 7.x. When upgrading, please manually modify the settings."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"added-1",children:"Added"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Docker"})," added Redis and PostgreSQL version checks; running below minimum versions may cause malfunction."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Docker"})," service initializes by creating databases during startup."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," enhanced validation conditions for JSON format settings on the settings page."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"fixed-1",children:"Fixed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," checks disk space upon upload to determine file existence."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixed debug file association with application versions."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," resolved issue where the application unpack details page wasn't displaying the list of testing devices."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," optimized display information on error pages for application versions."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," improved display for long package names of mobile device applications."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," optimized some page styles and the display of English language."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"API/Web"})," fixed issue where the Android app parsing icon in webp format failed to convert to png."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"API"})," resolved GraphQL user authentication."]}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"500-2023-09-06",children:"5.0.0 (2023-09-06)"}),"\n",(0,s.jsxs)(i.p,{children:["Any archived package of application supportted (e.g. ",(0,s.jsx)(i.code,{children:"Windows"})," or ",(0,s.jsx)(i.code,{children:"Linux"}),")). Full ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/compare/4.7.1...5.0.0",children:"commit changes"}),"."]}),"\n",(0,s.jsx)(i.h4,{id:"changed-1",children:"Changed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Docker"})," ",(0,s.jsx)(i.strong,{children:"Major Change"})," The minimum version of Redis dependencies has been updated from 5.x to 6.2+. It is recommended to use version 7.x. When upgrading, please manually modify the settings."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"added-2",children:"Added"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"}),"/",(0,s.jsx)(i.code,{children:"API"})," supports hosting of general applications (those that can be parsed automatically and those that cannot be parsed are skipped), and Windows and Linux platforms are added by default ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/1121",children:"#1121"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"}),"/",(0,s.jsx)(i.code,{children:"API"})," adds support for hosting Windows applications (uploading and displaying metadata parsing) ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/1124",children:"#1124"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," has a new debugging file page and adds support for parsing and hosting multiple dSYM debugging files ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/1127",children:"#1127"})," ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/1124",children:"#1124"})," ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/issues/961",children:"#961"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," supports unpacking v1, v2, and v3 signature information for Android applications ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/1124",children:"#1124"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," strengthens X509 certificate information for unpacking Android and iOS applications ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/1124",children:"#1124"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"}),' adds a "Reparse" function to update the metadata of old structure debugging files']}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," supports markdown format for change logs of uploaded application versions"]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"}),' settings page can configure the global "minimum number of items returned per page" and "maximum number of items"']}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," for iOS applications, the application version details page displays the expiration time information of the signing certificate and the logical restriction of installation failure due to expired signing certificate (can be downloaded)"]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," adds or updates JSON format verification to network hooks and settings pages."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," supports registering test devices to Apple developers with custom device names and editing/updating device names after creation."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," supports downloading private key certificates for Apple developers."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"fixed-2",children:"Fixed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue of being unable to delete unpacked applications"]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," optimizes the style of some pages"]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," corrects errors in the English language package (en language i18n)"]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the error page that appears when creating an empty application type"]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the 404 error page that appears when a file is not found."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"API"})," fixes the logic optimization of comparing build_version for retrieving the latest version of an application."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," optimizes the error handling for custom field format during application upload."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," optimizes the correct redirection for URL injection, empty application history versions, and unregistered devices."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," optimizes the display of error information for backup tasks."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," adds type detection for application types and debug files during application upload."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the error message of not preselecting the creation of a Distribution Certificate for Apple developers."]}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"471-2023-03-10",children:"4.7.1 (2023-03-10)"}),"\n",(0,s.jsx)(i.p,{children:"Support for parsing aab applications generated by the latest Android aapt2 build tool, full [commit changes][4.7.1]."}),"\n",(0,s.jsx)(i.h4,{id:"changed-2",children:"Changed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Docker"})," ",(0,s.jsx)(i.strong,{children:"Major Change"})," The minimum version of Redis dependencies has been updated from 5.x to 6.2+. It is recommended to use version 7.x. When upgrading, please manually modify the settings."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"fixed-3",children:"Fixed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," upgrades to the latest appt2 model to avoid exceptions when parsing aab files."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," implements duplicate processing for parsing exceptions."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"added-3",children:"Added"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," adds application types to the details page of unpacked Android applications."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," adjusts the original page after editing an application channel."]}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"470-2023-03-03",children:"4.7.0 (2023-03-03)"}),"\n",(0,s.jsxs)(i.p,{children:[(0,s.jsx)(i.strong,{children:"Major Change"})," The minimum version of Redis dependencies has been updated from 5.x to 6.2+. Full ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/compare/4.6.0...4.7.0",children:"commit changes"}),"."]}),"\n",(0,s.jsx)(i.h4,{id:"changed-3",children:"Changed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Docker"})," ",(0,s.jsx)(i.strong,{children:"Major Change"})," The minimum version of Redis dependencies has been updated from 5.x to 6.2+. It is recommended to use version 7.x. When upgrading, please manually modify the settings."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"added-4",children:"Added"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"}),' adds a control switch for "New Upload Version Prompt Window" to application types. ',(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/1058",children:"#1058"})," Thanks to ",(0,s.jsx)(i.a,{href:"https://github.com/softwind0214",children:"softwind0214"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," allows clicking on the application icon on the application list page to jump to the application details page."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," adds the display of the version number of dependent services to the environment information."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," adds support for displaying nightly build versions in the version number."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"fixed-4",children:"Fixed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," downgrades Ruby version to 3.0 temporarily to solve the iOS application parsing crash caused by the high version. See ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/issues/1070",children:"#1070"})," for details."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the display order of applications/types/channels, which is now fixed as ascending order of creation time."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where there is no confirmation prompt when a user logs out."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where the main historical version of an application cannot be deleted."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," improves the style of multiple pages."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," no longer displays Javascript debugger logs in production environments."]}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"460-2023-01-17",children:"4.6.0 (2023-01-17)"}),"\n",(0,s.jsxs)(i.p,{children:["The runtime environment has been upgraded to Ruby 3.2 and now supports arm64 platforms. Full ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/compare/4.5.3...4.6.0",children:"commit changes"}),"."]}),"\n",(0,s.jsx)(i.h4,{id:"fixed-5",children:"Fixed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," captures the issue of creating an application channel with an empty name. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/issues/968",children:"#968"})," Thanks to ",(0,s.jsx)(i.a,{href:"https://github.com/congpeijun",children:"congpeijun"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," improves the logic for backup files that do not exist on disk. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/issues/995",children:"#995"})]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"added-5",children:"Added"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Docker"})," supports arm64/v8 and armv7 arch. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/970",children:"#970"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," Adopted a new 50x error page."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"changed-4",children:"Changed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," upgrades the Ruby version to 3.2 in development environments, and devcontainers and containers now have the YJIT feature enabled by default. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/1011",children:"#1011"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"API"})," updates the data structure of the debug file return and changes the status code from 204 to 200."]}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"453-2022-11-22",children:"4.5.3 (2022-11-22)"}),"\n",(0,s.jsxs)(i.p,{children:["Full ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/compare/4.5.2...4.5.3",children:"commit changes"}),"."]}),"\n",(0,s.jsx)(i.h4,{id:"fixed-6",children:"Fixed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," Fixes the issue where third-party login cannot be redirected. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/issues/949",children:"#949"})," Thanks to ",(0,s.jsx)(i.a,{href:"https://github.com/softwind0214",children:"softwind0214"})]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"added-6",children:"Added"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Docker"})," Adds a new environment variable to disable the request protection of WebSocket (ActionCable) requests (experimental). ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/950",children:"#950"})]}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"452-2022-11-01",children:"4.5.2 (2022-11-01)"}),"\n",(0,s.jsxs)(i.p,{children:["Full ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/compare/4.5.1...4.5.2",children:"commit changes"}),"."]}),"\n",(0,s.jsx)(i.h4,{id:"fixed-7",children:"Fixed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where registering a test device is abnormal. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/issues/935",children:"#935"})," Thanks to ",(0,s.jsx)(i.a,{href:"https://github.com/ycy0430",children:"ycy0430"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," adapts the QR code to support dark mode."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," corrects the English language pack."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"added-7",children:"Added"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"WebHook"})," Income webhook body structure adds the ",(0,s.jsx)(i.code,{children:"username"})," and ",(0,s.jsx)(i.code,{children:"email"})," fields. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/issues/934",children:"#934"})," Thanks to ",(0,s.jsx)(i.a,{href:"https://github.com/rkonfj",children:"rkonfj"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Docker"})," The ",(0,s.jsx)(i.code,{children:"SIDEKIQ_CONCURRENCY"})," environment variable is now supported to set the concurrency of background tasks, with a default value of 5."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"changed-5",children:"Changed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Docker"})," reduces security risks by changing the Web service, which includes puma and pumacontrolserver, to listen on ",(0,s.jsx)(i.code,{children:"127.0.0.1"}),"."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," optimizes the wording of the iOS device UDID profile."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," updates the text at the bottom of the page. Thanks to Rails and the AdminLTE open source project!"]}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"451-2022-09-14",children:"4.5.1 (2022-09-14)"}),"\n",(0,s.jsxs)(i.p,{children:["Full ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/compare/4.5.0...4.5.1",children:"commit changes"})]}),"\n",(0,s.jsx)(i.h4,{id:"fixed-8",children:"Fixed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," Fixes the issue where the application unpacking results in parsing errors."]}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"450-2022-08-19",children:"4.5.0 (2022-08-19)"}),"\n",(0,s.jsxs)(i.p,{children:["Supports the \ud83c\udf11 dark mode and managing the test devices of an \ud83d\udc68\ud83c\udffb\u200d\ud83d\udd27 Apple developer account! Full ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/compare/4.4.1...4.5.0",children:"commit changes"}),"."]}),"\n",(0,s.jsx)(i.h4,{id:"added-8",children:"Added"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," supports dark mode. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/816",children:"#816"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," adds Apple developer management for registering test devices. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/817",children:"#817"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," adds data backup management. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/835",children:"#835"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," completes the monitoring of dependent services in the management panel. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/issues/586",children:"#586"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"API"})," adds three fields, ",(0,s.jsx)(i.code,{children:"platform"}),", ",(0,s.jsx)(i.code,{children:"device_type"}),", and ",(0,s.jsx)(i.code,{children:"custom_fields"}),", to the release dictionary."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"changed-6",children:"Changed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," ",(0,s.jsx)(i.strong,{children:"Incompatible change"})," Google Analytics forces an upgrade to version 4, and previous settings need to be reconfigured to take effect. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/815",children:"#815"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"CLI"})," ",(0,s.jsx)(i.strong,{children:"Incompatible change"})," The data backup and restore functionality is no longer available due to changes in the structure. Please use the data backup function in the admin panel instead."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," adjusts the display of device UDID acquisition, iOS version installation and download based on the device, no longer displaying all functions."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," removes the page statistics function in the admin panel. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/814",children:"#814"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," migrates the front-end technology stack from webpacker to esbuild + sass, and from Turbolinks to Stimulus, bringing a better front-end interaction experience. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/829",children:"#829"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," due to the complexity of editing application types and channels, only the application name can be modified."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"fixed-9",children:"Fixed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the error of selecting a channel that does not exist under an application type. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/issues/795",children:"#795"})," Thanks to ",(0,s.jsx)(i.a,{href:"https://github.com/tasselsd",children:"tasselsd"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"API"})," fixes the Android address return error. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/issues/813",children:"#813"})," Thanks to ",(0,s.jsx)(i.a,{href:"https://github.com/denymz",children:"denymz"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"}),"/",(0,s.jsx)(i.code,{children:"API"})," fixes the exception caused by some parameters being empty in aab parsing. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/fastlane-plugin-zealot/issues/9",children:"tryzealot/fastlane-plugin-zealot#9"})," Thanks to ",(0,s.jsx)(i.a,{href:"https://github.com/tasselsd",children:"tasselsd"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue of abnormal generation of demo data during the first initialization of the project. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/issues/821",children:"#821"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"API"})," fixes the issue of abnormal data when checking the latest version of the application. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/issues/856",children:"#856"})," Thanks to ",(0,s.jsx)(i.a,{href:"https://github.com/denymz",children:"denymz"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue of an error being thrown due to abnormal data in the associated network hook when viewing the details of an application channel."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," corrects many spelling errors in the English language pack."]}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"441-2022-06-20",children:"4.4.1 (2022-06-20)"}),"\n",(0,s.jsxs)(i.p,{children:["Full ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/compare/4.4.0...4.4.1",children:"commit changes"})]}),"\n",(0,s.jsx)(i.h4,{id:"fixed-10",children:"Fixed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"WebHook"})," fixes the issue where an error is thrown after a successful trigger. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/issues/792",children:"#792"})," Thanks to ",(0,s.jsx)(i.a,{href:"https://github.com/tasselsd",children:"tasselsd"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Docker"})," compatible with Caddy 2.5.0 for proxying from https to http. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/790",children:"#790"})," Thanks to ",(0,s.jsx)(i.a,{href:"https://github.com/VisionBao",children:"VisionBao"})," ",(0,s.jsx)(i.a,{href:"https://github.com/songge1209",children:"songge1209"})]}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"440-2022-06-09",children:"4.4.0 (2022-06-09)"}),"\n",(0,s.jsxs)(i.p,{children:["Full ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/compare/4.3.1...4.4.0",children:"commit changes"}),"."]}),"\n",(0,s.jsx)(i.h4,{id:"changed-7",children:"Changed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," adds filtering by version, branch, and packaging type to the list display for users who are not logged in and have not enabled guest mode, in addition to viewing application version details."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," upgrades the runtime environment to Ruby 3.0 and the service framework to Rails 7.0."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," is now compatible with the macOS M1 chip."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"added-9",children:"Added"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," simplifies and standardizes some application links to facilitate sharing. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/666",children:"#666"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," completes some missing permission check pages."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"fixed-11",children:"Fixed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Job"})," fixes the issue of abnormal URL Schemes when parsing iOS files."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where service logs are not output to the terminal console."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," adds exception handling for processing debug files uploaded when they are deleted during parsing or cannot be found for other reasons."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," adapts the UI for ultra-wide screens."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes security vulnerabilities in third-party login dependencies."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"API"})," fixes the issue where uploading Android without channel_key results in an exception. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/issues/779",children:"#779"})," Thanks to ",(0,s.jsx)(i.a,{href:"https://github.com/likfe",children:"likfe"})]}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"431-2021-12-22",children:"4.3.1 (2021-12-22)"}),"\n",(0,s.jsxs)(i.p,{children:["Full ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/compare/4.3.0...4.3.1",children:"commit changes"}),"."]}),"\n",(0,s.jsx)(i.h4,{id:"added-10",children:"Added"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," after updating the setting, the original default value can be restored."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," supports parsing and displaying app links (distinguishing between deep links and URL schemes) for Android in application unpacking."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," strengthens the visual effect of the open and closed status of the setting page."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"fixed-12",children:"Fixed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue of asynchronous task methods in demo mode."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where selected application types and channels cannot be checked when creating and editing an application."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where it is not possible to navigate to the environment page."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where aab parsing fails when there are no intent filters."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," adds error handling for unchecking all application types and channels when updating an application."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where the loading strategy causes all third-party logins to be unavailable."]}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"430-2021-12-08",children:"4.3.0 (2021-12-08)"}),"\n",(0,s.jsxs)(i.p,{children:["Supports parsing of the aab format, adds support for multiple languages. Full ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/compare/4.2.2...4.3.0",children:"commit changes"})]}),"\n",(0,s.jsx)(i.h4,{id:"changed-8",children:"Changed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," uses the default prompt structure as the data structure for network hooks, instead of a strange structure."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," no longer provides parameter changes for third-party login authorization on the settings page (requires service restart)."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"API"})," the upload application interface and version details return the ",(0,s.jsx)(i.code,{children:"text_changelog"})," field in the response body. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/commit/650f1ffd3731f6a1f4cc703430be1b1b6f5d1cee",children:"650f1ffd"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"API"})," renames the ",(0,s.jsx)(i.code,{children:"changelog_list"})," field in the response body to ",(0,s.jsx)(i.code,{children:"changelog"}),". ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/commit/719f0b1eff92f358d246ededd6c1e6f9863f7f85",children:"719f0b1e"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," changes the log output format from an array to text format that is compatible with Markdown lists. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/commit/719f0b1eff92f358d246ededd6c1e6f9863f7f85",children:"719f0b1e"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," some privacy-related configuration keys or tokens are only displayed in plaintext under administrator permissions; other permissions cannot see them; demo mode is read-only and will do some encryption. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/644",children:"#644"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," does not display the build date and hash value if they cannot be obtained."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"added-11",children:"Added"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," supports parsing of the Android App Bundle (aab) file format and webp icons."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," supports language internationalization, with optional language packs: Simplified Chinese, English (support for page configuration)."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," supports configuring more system settings. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/643",children:"#643"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," adds editing functionality for network hooks in the management panel."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," rewrites and optimizes the style layout of the application list."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," optimizes the basic email template."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," adjusts the style and error logic of the login window."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," adds file permission checking to the environment variable page in the management panel. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/608",children:"#608"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," adds error details display for asynchronous tasks in the management panel, with a maximum of 5000 errors."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," uses a better log output format. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/646",children:"#646"})]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"fixed-13",children:"Fixed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where the default selection state of boolean type parameters is incorrect on the settings page."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where exceptions occur when clicking install or download in the DingTalk app (changed to WeChat logic processing)."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where the build date (time stamp when building a Docker image) cannot be displayed on the environment page."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where the domain scope of asynchronous notifications does not take effect."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue of exception when getting gems."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue of abnormal judgment of the expiration time of iOS certificates."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where disk space cannot be obtained when developing with a virtual machine mounted."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes some known errors in demo mode."]}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"422-2021-10-15",children:"4.2.2 (2021-10-15)"}),"\n",(0,s.jsxs)(i.p,{children:["Full ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/compare/4.2.1...4.2.2",children:"commit changes"}),"."]}),"\n",(0,s.jsx)(i.h4,{id:"fixed-14",children:"Fixed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"API"})," fixes the issue where incorrect error messages were not output due to parameter mismatches caused by batch replacements. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/issues/615",children:"#615"})," Thanks to ",(0,s.jsx)(i.a,{href:"https://github.com/gin7758258",children:"gin7758258"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue of abnormal parsing of some apk Android files. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/529",children:"#587"})]}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"421-2021-09-14",children:"4.2.1 (2021-09-14)"}),"\n",(0,s.jsxs)(i.p,{children:["Full ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/compare/4.2.0...4.2.1",children:"commit changes"}),"."]}),"\n",(0,s.jsx)(i.h4,{id:"changed-9",children:"Changed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," application icons are no longer cropped to the preset size, and image processing dependencies have been removed, reducing the Docker image size by nearly 200MB."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Docker"})," the reverse proxy service Caddy no longer outputs logs to STDOUT but directly to files."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"fixed-15",children:"Fixed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where icons are not displayed correctly after uploading an application."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," is compatible with different dSYM zip extraction logics when uploading."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where the application icon is not displayed when installing iOS applications."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes a security vulnerability by disabling the editing of read-only system settings."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where the downloaded file suffix is not correct on macOS."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where the window showing that an installation is not possible does not pop up in some cases."]}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"420-2021-09-01",children:"4.2.0 (2021-09-01)"}),"\n",(0,s.jsxs)(i.p,{children:["Full ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/compare/4.1.0...4.2.0",children:"commit changes"}),"."]}),"\n",(0,s.jsx)(i.h4,{id:"changed-10",children:"Changed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," changes the default logic for cleaning up old versions to off. To enable, set the environment variable ",(0,s.jsx)(i.code,{children:"ZEALOT_KEEP_UPLOADS=false"}),". ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/570",children:"#570"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," renames File Parsing to Application Unpacking. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/529",children:"#529"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," removes support for unpacking previously uploaded applications in the application unpacking feature. (now all uploaded applications will automatically trigger additional application unpacking)"]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"API"})," supports fontawesome css values for custom field icons when uploading applications, such as the value ",(0,s.jsx)(i.code,{children:"fas fa-flag"})," for ",(0,s.jsx)(i.a,{href:"https://fontawesome.com/v5.15/icons/flag?style=solid",children:"flag"}),"."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Docker"})," changes the image to use caddy as a reverse proxy and modifies the volume persistence. Migration is required, see ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/540",children:"#540"})," for details."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"added-12",children:"Added"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," supports uploading, parsing, and downloading macOS applications. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/562",children:"#562"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," adds quick filtering options for application types and channels for mobile devices on the channel details page. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/issues/510",children:"#510"})," Thanks to ",(0,s.jsx)(i.a,{href:"https://github.com/huacnlee",children:"huacnlee"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," allows the administrator panel to configure application type templates and default registration user permissions. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/562",children:"#562"})," ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/568",children:"#568"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," partially encrypts environment variables that involve privacy."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," adds graphical displays for memory and disk usage."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Docker"})," adds support for synchronizing updates with ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pkgs/container/zealot",children:"Github Container Registry"})," images."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Docker"})," adds support for configuring the postgres port number with environment variables."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"fixed-16",children:"Fixed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where the iOS installation button cannot be displayed on iPad and M1 chip macOS. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/issues/519",children:"#519"})," Thanks to ",(0,s.jsx)(i.a,{href:"https://github.com/ohdarling",children:"ohdarling"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where using third-party login while registering but not verifying email fails. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/issues/517",children:"#517"})," Thanks to ",(0,s.jsx)(i.a,{href:"https://github.com/huacnlee",children:"huacnlee"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where uploading an application through the website does not trigger application unpacking."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where the left navigation style is misaligned when tubrolink is enabled."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," displays the unpacking link when uploading Android applications."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," optimizes the display prompt for empty unpacking file lists."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where LDAP parameters are obtained incorrectly. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/542",children:"#541"})," Thanks to ",(0,s.jsx)(i.a,{href:"https://github.com/Martwu",children:"Martwu"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," changes the error message for capturing application upload errors to a readable format."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where the application type creation error judgment is abnormal."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," adds an exception judgment for clicking the details page when all channels of an application are deleted."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where uploading applications causes variable release errors in the parsing process."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where an error occurs when verifying password protection for an application. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/issues/564",children:"#564"})," Thanks to ",(0,s.jsx)(i.a,{href:"https://github.com/EasierLu",children:"EasierLu"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where editing user information in the administrator panel causes an error. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/issues/564",children:"#564"})," Thanks to ",(0,s.jsx)(i.a,{href:"https://github.com/EasierLu",children:"EasierLu"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"}),' fixes the issue where the "Install" button on the application details page is displayed abnormally on incorrect systems and devices (normally only iOS applications are displayed on iOS and macOS devices).']}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," optimizes the unpacking of applications for developer certificates that fail to parse due to special character sets (currently known to be Chinese encoding) and UI layout adjustments."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where the current user cannot be edited."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," corrects the duplicate title of debug files."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Docker"})," fixes the logrotate error during image initialization."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Docker"})," fixes the issue where Caddy deployment needs to be confirmed. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/issues/551",children:"#551"})," Thanks to ",(0,s.jsx)(i.a,{href:"https://github.com/ReverseScale",children:"ReverseScale"})]}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"410-2021-07-17",children:"4.1.0 (2021-07-17)"}),"\n",(0,s.jsxs)(i.p,{children:["Full ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/compare/4.0.0...4.1.0",children:"commit changes"}),"."]}),"\n",(0,s.jsx)(i.h4,{id:"changed-11",children:"Changed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," changes the display logic for obtaining device UDID due to the similarity of iPad's User-Agent and Desktop."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Docker"})," sets Gihub Container Registry (gcr.io) as the default Docker image source."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"added-13",children:"Added"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," supports one-click login authentication for third-party platforms such as Feishu and Gitlab."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," optimizes the logic for accessing the version details page of an application that cannot be found and allows manual redirection to the latest version."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," adds the ability to view some system configuration items and modify some parameters without requiring a restart."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," adds a page statistics report to the management panel."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"fixed-17",children:"Fixed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where the network hook cannot obtain the value of the title variable."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the abnormal error during application parsing process."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the abnormal error that occurs during application creation."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where system configuration cannot be edited due to being saved as empty."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Job"})," fixes the issue where the logic for removing old versions causes the deletion logic and document logic to be reversed."]}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"400-2020-12-31",children:"4.0.0 (2020-12-31)"}),"\n",(0,s.jsxs)(i.p,{children:["Full ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/compare/4.0.0.rc2...4.0.0",children:"commit changes"}),"."]}),"\n",(0,s.jsx)(i.h4,{id:"fixed-18",children:"Fixed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," corrects the display error caused by abnormal judgment of the expiration time of the iOS certificate during file parsing."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," ignores the default development version number check for new versions."]}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"400rc2-2020-12-25",children:"4.0.0.rc2 (2020-12-25)"}),"\n",(0,s.jsxs)(i.p,{children:["Full ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/compare/4.0.0.rc1...4.0.0.rc2",children:"commit changes"}),"."]}),"\n",(0,s.jsx)(i.h4,{id:"added-14",children:"Added"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," newly parsed files will be saved to the list, and a file parsing for uploaded applications will also be synchronized. (asynchronous task) ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/346",children:"#346"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," adds file parsing data statistics to the control panel."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," adds data statistics for network hooks, background tasks, and disk usage for administrators in the control panel."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," adds a quick delete function for authorized personnel to the prompt for missing files in the version details."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"changed-12",children:"Changed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"API"})," The debug file version check interface has been renamed, and new check methods based on file fingerprints and dSYM UUID have been added. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/346",children:"#349"})]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"fixed-19",children:"Fixed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the error when disabling LDAP login authentication. (caused by incorrect IP whitelist settings)"]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," corrects the wording of the prompt when opening the version details in WeChat for Android."]}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"400rc1-2020-10-29",children:"4.0.0.rc1 (2020-10-29)"}),"\n",(0,s.jsxs)(i.p,{children:["Full ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/compare/4.0.0.beta4...4.0.0.rc1",children:"commit changes"}),"."]}),"\n",(0,s.jsx)(i.h4,{id:"changed-13",children:"Changed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Docker"})," ",(0,s.jsx)(i.strong,{children:"major change"})," merges rails and worker into the same image for deployment. zealot-docker library needs to be updated accordingly ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/235",children:"#235"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Docker"})," upgrades Ruby to version 2.7 for deployment."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," upgrades font-awesome from version 4.7.0 to 5.13.0, which may cause missing icons to display improperly."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," adjusts the wording of invitation emails."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," unifies the download path for applications and debugging files to ",(0,s.jsx)(i.code,{children:"/download"})," path."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," requires login permission for online application parsing."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," optimizes the logic for automatically redirecting to the latest version when accessing deleted or non-existent version details."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," adjusts the installation and download logic of applications (mainly due to the inability to distinguish between iPadOS UserAgent and Desktop)."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"added-15",children:"Added"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," displays a prompt when downloading files that do not exist."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," supports parsing .mobileprovision format files and enabling the parsing of .ipa files online."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," allows some system settings to be modified online using the administrator panel. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/245",children:"#245"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," adds guest mode. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/243",children:"#243"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," supports displaying the names of iOS AdHoc version test devices. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/211",children:"#211"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," supports parsing the content of uploaded version installation packages. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/210",children:"#210"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," supports obtaining the UDID of iOS devices. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/203",children:"#203"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," supports a demo mode with limited functionality and periodic data initialization. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/198",children:"#198"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," displays the original name of the application in the version details after uploading the App."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," allows filtering of the application list by version, Git branch, and packaging type."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," displays the Git commit link associated with the latest upload in the version details. (if the git URL is set in the channel settings)"]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," integrates LDAP login into the existing login interface and no longer uses the crude interface provided by third-party dependencies."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Job"})," supports managing the generation and recovery of data backup using rails commands. (database and uploaded file data) ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/207",children:"#207"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"API"})," adds an interface to check if the debug file exists ",(0,s.jsx)(i.code,{children:"/api/debug_files/version_exist"}),"."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"fixed-20",children:"Fixed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the error when parsing changelog during App upload."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where the QR code in the version details will exceed the parent view in medium resolution."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where some values of the application channel are empty and the default value is not displayed."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," optimizes the content display when parsing iOS packages online. (and solves the problem of always displaying fake data)"]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where the information of the submitter is not displayed for changelogs generated using ",(0,s.jsx)(i.a,{href:"https://github.com/icyleaf/fastlane-plugin-ci_changelog",children:"fastlane-plugin-ci_changelog"})," in the version details."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes and optimizes the logic for checking new versions."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where the pop-up window for confirming the deletion of debug files displays an empty message."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," optimizes the display of the device list in the version details on some mobile phones."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the error when parsing applications without submitting parameters."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," optimizes the display of the version list on mobile phones."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," only displays the bottom pagination for the latest upload dynamics of channel versions, and the top displays the total number of versions."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where the administrator editing user prompt for a non-empty password."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"}),"/",(0,s.jsx)(i.code,{children:"API"})," fixes the issue where the latest version is used when the requested version for online download and installation does not exist."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where the login interface displays the sidebar menu in guest mode."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where the same debugging file of the same application and platform is always overwritten when uploaded."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," optimizes the display of boolean and dictionary types on the system settings page."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Job"})," fixes the issue where old versions were accidentally deleted due to a version judgment error during scheduled cleaning."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Docker"})," fixes the issue where the internal static resources are not updated due to volume storage of the public folder."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Docker"})," fixes the issue where the container version is inconsistent with the external version."]}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"400beta4-2020-05-07",children:"4.0.0.beta4 (2020-05-07)"}),"\n",(0,s.jsxs)(i.p,{children:["Full ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/compare/4.0.0.beta3...4.0.0.beta4",children:"commit changes"}),"."]}),"\n",(0,s.jsx)(i.h4,{id:"added-16",children:"Added"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Docker"})," supports deployment on Heroku."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," allows guests to view App details, lists, and upload App details."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"API"})," supports custom fields when uploading an App. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/issues/178",children:"#178"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"}),"/",(0,s.jsx)(i.code,{children:"API"})," automatically removes the ",(0,s.jsx)(i.code,{children:"origin/"})," prefix when passing the ",(0,s.jsx)(i.code,{children:"branch"})," value during App upload."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," adds project introduction to user authentication interfaces such as login, registration, password retrieval, and password resetting."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"fixed-21",children:"Fixed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," corrects user password description text."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the URL field error in the WebHook."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"}),"/",(0,s.jsx)(i.code,{children:"API"})," fixes the error when uploading iOS dSYM files."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"API"})," fixes the abnormal has_password parameter in the App interface."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"API"})," fixes the source of uploaded App records always showing as Web."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"API"})," fixes and supports uploading changelog in JSON format as a string."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the issue where CPU and memory information cannot be retrieved from system information."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the occasional error when parsing Android applications online."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," fixes the error when scanning QR code with WeChat."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"changed-14",children:"Changed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"API"})," adds validation for bundle_id dimension to the latest version interface. (apps/latest)"]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," allows guests to access application version details and download operations."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," shifts the device list on the right-hand side of iOS AdHoc application version details to the left and collapses it by default."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," removes the GraphQL console functionality from the development environment and recommends using ",(0,s.jsx)(i.a,{href:"https://github.com/prisma-labs/graphql-playground",children:"graphql-playground"}),"."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," removes the footbar at the bottom of the page, and the version information can be viewed in the system information."]}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"400beta3-2020-01-16",children:"4.0.0.beta3 (2020-01-16)"}),"\n",(0,s.jsxs)(i.p,{children:["Full ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/compare/4.0.0.beta2...4.0.0.beta3",children:"commit changes"}),"."]}),"\n",(0,s.jsx)(i.h4,{id:"added-17",children:"Added"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," prompts and displays a confirmation email link for users added by administrators if their email is not activated."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," enables the default Sentry anonymous reporting mechanism (can be turned off)."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"fixed-22",children:"Fixed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"API"})," fixes the issue where uploading an application always creates a new channel."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"}),"/",(0,s.jsx)(i.code,{children:"API"})," fixes the issue where the icon of uploaded Android applications cannot be displayed."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"changed-15",children:"Changed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Docker"})," moves the initialization data out of the image and into ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot-docker",children:"zealot-docker"})," image. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/pull/120",children:"#120"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Docker"})," reduces the size of the image from 1.18G to 308M. ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/issues/114",children:"#114"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Job"})," uses asynchronous tasks instead of traditional cron jobs to implement scheduled cleaning of old version history package files. (can be turned off)"]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Job"})," groups asynchronous tasks and sets priority."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"API"})," displays all error messages in Chinese because database write operations return specific error messages."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," standardizes code using Rubocop Lint rules."]}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"400beta2-2020-01-10",children:"4.0.0.beta2 (2020-01-10)"}),"\n",(0,s.jsxs)(i.p,{children:["Full ",(0,s.jsx)(i.a,{href:"https://github.com/tryzealot/zealot/compare/4.0.0.beta1...4.0.0.beta2",children:"commit changes"}),"."]}),"\n",(0,s.jsx)(i.h4,{id:"added-18",children:"Added"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," Added the ability to upload a complete version list to a specific application channel, and support deleting operations."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"fixed-23",children:"Fixed"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Web"})," provides an error prompt instead of an error message when uploading an application that is not a valid ipa or apk."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"API"})," fixes the issue where the latest version list of an application cannot be returned due to the non-existence of the queried version number in the database."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"API"})," only requires token verification for interfaces that perform write operations (previously most interfaces required it)."]}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"400beta1",children:"4.0.0.beta1"}),"\n",(0,s.jsx)(i.p,{children:"\ud83c\udf08 The first public beta version has been released!"}),"\n",(0,s.jsx)(i.h2,{id:"previous-version",children:"Previous Version"}),"\n",(0,s.jsx)(i.p,{children:"For many years, it was developed and operated internally within the company and was not open source.\nIt used to undertake many functions, but now it has been separated to focus on providing\napplication hosting and distribution services"})]})}function h(e={}){const{wrapper:i}={...(0,d.a)(),...e.components};return i?(0,s.jsx)(i,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},1151:(e,i,n)=>{n.d(i,{Z:()=>r,a:()=>t});var s=n(7294);const d={},l=s.createContext(d);function t(e){const i=s.useContext(l);return s.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function r(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(d):e.components||d:t(e.components),s.createElement(l.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/0ba74476.26bfec04.js b/assets/js/dc453add.a32d8229.js similarity index 93% rename from assets/js/0ba74476.26bfec04.js rename to assets/js/dc453add.a32d8229.js index 75138f71d..d25c0f283 100644 --- a/assets/js/0ba74476.26bfec04.js +++ b/assets/js/dc453add.a32d8229.js @@ -1 +1 @@ -"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[6045],{9501:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>d,contentTitle:()=>l,default:()=>m,frontMatter:()=>r,metadata:()=>p,toc:()=>c});var n=i(5893),a=i(1151),o=i(9965),s=i(4996);const r={sidebar_label:"Apple Team"},l="Apple Team (Developer)",p={id:"user-guide/administrator/apple-team",title:"Apple Team (Developer)",description:"One of the biggest challenges in distributing Ad-Hoc signed applications for iOS is the need to",source:"@site/versioned_docs/version-5.1.0/user-guide/administrator/apple-team.mdx",sourceDirName:"user-guide/administrator",slug:"/user-guide/administrator/apple-team",permalink:"/docs/user-guide/administrator/apple-team",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.1.0/user-guide/administrator/apple-team.mdx",tags:[],version:"5.1.0",frontMatter:{sidebar_label:"Apple Team"},sidebar:"userGuide",previous:{title:"Administrator",permalink:"/docs/category/administrator"},next:{title:"Permissions",permalink:"/docs/user-guide/administrator/permissions"}},d={},c=[];function h(e){const t={a:"a",h1:"h1",p:"p",...(0,a.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.h1,{id:"apple-team-developer",children:"Apple Team (Developer)"}),"\n",(0,n.jsx)(t.p,{children:"One of the biggest challenges in distributing Ad-Hoc signed applications for iOS is the need to\nconvey what a UDID is and how to obtain it to a large number of people who may not understand\nthese concepts. After obtaining the UDID, it then needs to be provided to the developer,\nwho must then re-sign the certificate, package it, and upload it for installation."}),"\n",(0,n.jsx)(t.p,{children:"Zealot can automatically obtain the UDID of Ad-Hoc applications.\nAlthough the UDIDs are usually accompanied by device names during registration,\nsometimes it is difficult to understand which device belongs to whom when presented with a\nlist of UDIDs. To solve this problem, Zealot has tried several solutions. In the early days,\nthe fastlane plugin zealotsyncdevice was used to synchronize the names and models of testing devices.\nWith the release of the AppStoreConnect API, Zealot can now completely automate the process,\ngreatly simplifying the registration process and allowing testing applications to display\nrecognizable and friendly device names."}),"\n",(0,n.jsx)(o.Z,{alt:"Register processing",sources:{light:(0,s.Z)("/img/5.0.0/apple-team/flows-light.png"),dark:(0,s.Z)("/img/5.0.0/apple-team/flows-dark.png")}}),"\n",(0,n.jsx)(t.p,{children:"Although providing the UDID of a device confirms which applications can be installed,\nproviding a feature to register a testing device that has not been registered with any application\nwould greatly improve the efficiency of the team. This is the role of the Apple Developer feature."}),"\n",(0,n.jsx)(o.Z,{alt:"Apple deveoper detail preview",sources:{light:(0,s.Z)("/img/apple-team/apple-team-detail-light.png"),dark:(0,s.Z)("/img/apple-team/apple-team-detail-dark.png")}}),"\n",(0,n.jsxs)(t.p,{children:["The initial feature introduction: ",(0,n.jsx)(t.a,{href:"https://github.com/tryzealot/zealot/issues/723",children:"https://github.com/tryzealot/zealot/issues/723"}),"."]})]})}function m(e={}){const{wrapper:t}={...(0,a.a)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(h,{...e})}):h(e)}},1151:(e,t,i)=>{i.d(t,{Z:()=>r,a:()=>s});var n=i(7294);const a={},o=n.createContext(a);function s(e){const t=n.useContext(o);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function r(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:s(e.components),n.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[9051],{3229:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>d,contentTitle:()=>l,default:()=>m,frontMatter:()=>r,metadata:()=>p,toc:()=>c});var n=i(5893),a=i(1151),o=i(9965),s=i(4996);const r={sidebar_label:"Apple Team"},l="Apple Team (Developer)",p={id:"user-guide/administrator/apple-team",title:"Apple Team (Developer)",description:"One of the biggest challenges in distributing Ad-Hoc signed applications for iOS is the need to",source:"@site/versioned_docs/version-5.2.0/user-guide/administrator/apple-team.mdx",sourceDirName:"user-guide/administrator",slug:"/user-guide/administrator/apple-team",permalink:"/docs/user-guide/administrator/apple-team",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.2.0/user-guide/administrator/apple-team.mdx",tags:[],version:"5.2.0",frontMatter:{sidebar_label:"Apple Team"},sidebar:"userGuide",previous:{title:"Administrator",permalink:"/docs/category/administrator"},next:{title:"Permissions",permalink:"/docs/user-guide/administrator/permissions"}},d={},c=[];function h(e){const t={a:"a",h1:"h1",p:"p",...(0,a.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.h1,{id:"apple-team-developer",children:"Apple Team (Developer)"}),"\n",(0,n.jsx)(t.p,{children:"One of the biggest challenges in distributing Ad-Hoc signed applications for iOS is the need to\nconvey what a UDID is and how to obtain it to a large number of people who may not understand\nthese concepts. After obtaining the UDID, it then needs to be provided to the developer,\nwho must then re-sign the certificate, package it, and upload it for installation."}),"\n",(0,n.jsx)(t.p,{children:"Zealot can automatically obtain the UDID of Ad-Hoc applications.\nAlthough the UDIDs are usually accompanied by device names during registration,\nsometimes it is difficult to understand which device belongs to whom when presented with a\nlist of UDIDs. To solve this problem, Zealot has tried several solutions. In the early days,\nthe fastlane plugin zealotsyncdevice was used to synchronize the names and models of testing devices.\nWith the release of the AppStoreConnect API, Zealot can now completely automate the process,\ngreatly simplifying the registration process and allowing testing applications to display\nrecognizable and friendly device names."}),"\n",(0,n.jsx)(o.Z,{alt:"Register processing",sources:{light:(0,s.Z)("/img/5.0.0/apple-team/flows-light.png"),dark:(0,s.Z)("/img/5.0.0/apple-team/flows-dark.png")}}),"\n",(0,n.jsx)(t.p,{children:"Although providing the UDID of a device confirms which applications can be installed,\nproviding a feature to register a testing device that has not been registered with any application\nwould greatly improve the efficiency of the team. This is the role of the Apple Developer feature."}),"\n",(0,n.jsx)(o.Z,{alt:"Apple deveoper detail preview",sources:{light:(0,s.Z)("/img/apple-team/apple-team-detail-light.png"),dark:(0,s.Z)("/img/apple-team/apple-team-detail-dark.png")}}),"\n",(0,n.jsxs)(t.p,{children:["The initial feature introduction: ",(0,n.jsx)(t.a,{href:"https://github.com/tryzealot/zealot/issues/723",children:"https://github.com/tryzealot/zealot/issues/723"}),"."]})]})}function m(e={}){const{wrapper:t}={...(0,a.a)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(h,{...e})}):h(e)}},1151:(e,t,i)=>{i.d(t,{Z:()=>r,a:()=>s});var n=i(7294);const a={},o=n.createContext(a);function s(e){const t=n.useContext(o);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function r(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:s(e.components),n.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/dcddbff0.b3615fb0.js b/assets/js/dcddbff0.b3615fb0.js deleted file mode 100644 index 7254b71ac..000000000 --- a/assets/js/dcddbff0.b3615fb0.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[1004],{1087:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>p,contentTitle:()=>i,default:()=>m,frontMatter:()=>d,metadata:()=>u,toc:()=>l});var n=s(5893),o=s(1151),a=s(9965),r=s(4996);const d={},i="Uploaded a release",u={id:"user-guide/apps/upload",title:"Uploaded a release",description:"{s.d(t,{Z:()=>d,a:()=>r});var n=s(7294);const o={},a=n.createContext(o);function r(e){const t=n.useContext(a);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function d(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:r(e.components),n.createElement(a.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/dcddbff0.c1937343.js b/assets/js/dcddbff0.c1937343.js new file mode 100644 index 000000000..37d86169e --- /dev/null +++ b/assets/js/dcddbff0.c1937343.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[1004],{1087:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>p,contentTitle:()=>i,default:()=>m,frontMatter:()=>d,metadata:()=>u,toc:()=>l});var n=s(5893),o=s(1151),a=s(9965),r=s(4996);const d={},i="Uploaded a release",u={id:"user-guide/apps/upload",title:"Uploaded a release",description:"{s.d(t,{Z:()=>d,a:()=>r});var n=s(7294);const o={},a=n.createContext(o);function r(e){const t=n.useContext(a);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function d(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:r(e.components),n.createElement(a.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/df11c872.b887bd7e.js b/assets/js/df11c872.b887bd7e.js new file mode 100644 index 000000000..d6ed4fee7 --- /dev/null +++ b/assets/js/df11c872.b887bd7e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[3051],{4285:(n,o,t)=>{t.r(o),t.d(o,{assets:()=>c,contentTitle:()=>d,default:()=>l,frontMatter:()=>a,metadata:()=>u,toc:()=>g});var e=t(5893),r=t(1151),i=t(9965),s=t(4996);const a={},d="Background Jobs",u={id:"user-guide/administrator/monitoring/background-jobs",title:"Background Jobs",description:"{t.d(o,{Z:()=>a,a:()=>s});var e=t(7294);const r={},i=e.createContext(r);function s(n){const o=e.useContext(i);return e.useMemo((function(){return"function"==typeof n?n(o):{...o,...n}}),[o,n])}function a(n){let o;return o=n.disableParentContext?"function"==typeof n.components?n.components(r):n.components||r:s(n.components),e.createElement(i.Provider,{value:o},n.children)}}}]); \ No newline at end of file diff --git a/assets/js/e00b100a.0d8405b8.js b/assets/js/e00b100a.0d8405b8.js deleted file mode 100644 index 1f3bb9338..000000000 --- a/assets/js/e00b100a.0d8405b8.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[2103],{5674:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>d,contentTitle:()=>i,default:()=>u,frontMatter:()=>s,metadata:()=>c,toc:()=>a});var o=r(5893),n=r(1151);const s={},i="Credits",c={id:"user-guide/credits",title:"Credits",description:"Contributions",source:"@site/versioned_docs/version-5.1.0/user-guide/credits.md",sourceDirName:"user-guide",slug:"/user-guide/credits",permalink:"/docs/user-guide/credits",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.1.0/user-guide/credits.md",tags:[],version:"5.1.0",frontMatter:{},sidebar:"userGuide",previous:{title:"Q&A",permalink:"/docs/user-guide/qa"}},d={},a=[{value:"Contributions",id:"contributions",level:2},{value:"Project name",id:"project-name",level:2},{value:"Project Logo",id:"project-logo",level:2},{value:"License",id:"license",level:2}];function l(e){const t={a:"a",h1:"h1",h2:"h2",p:"p",...(0,n.a)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.h1,{id:"credits",children:"Credits"}),"\n",(0,o.jsx)(t.h2,{id:"contributions",children:"Contributions"}),"\n",(0,o.jsx)(t.p,{children:"Thank you for making Zealot more useful!"}),"\n",(0,o.jsx)("a",{href:"https://github.com/tryzealot/zealot/graphs/contributors",children:(0,o.jsx)("img",{src:"https://contrib.rocks/image?repo=tryzealot/zealot"})}),"\n",(0,o.jsx)(t.h2,{id:"project-name",children:"Project name"}),"\n",(0,o.jsx)(t.p,{children:"Zealot from the Starcraft species Gods base soldier."}),"\n",(0,o.jsx)(t.h2,{id:"project-logo",children:"Project Logo"}),"\n",(0,o.jsxs)(t.p,{children:["Project history submission resources may be used to for the icon copyright belongs to ",(0,o.jsx)(t.a,{href:"https://www.blizzard.com",children:"Blizzard"}),",\nlater changed to their own design icons, if there are enthusiastic designers can help design better icons,\nI represent this project to express my sincere gratitude."]}),"\n",(0,o.jsx)(t.h2,{id:"license",children:"License"}),"\n",(0,o.jsxs)(t.p,{children:["Zealot is an open source project released under the MIT distribution protocol (MIT), which can be found at ",(0,o.jsx)(t.a,{href:"https://github.com/tryzealot/zealot/blob/develop/LICENSE",children:"LICENSE file"}),"\u3002"]})]})}function u(e={}){const{wrapper:t}={...(0,n.a)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(l,{...e})}):l(e)}},1151:(e,t,r)=>{r.d(t,{Z:()=>c,a:()=>i});var o=r(7294);const n={},s=o.createContext(n);function i(e){const t=o.useContext(s);return o.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:i(e.components),o.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/e00b100a.2221bfad.js b/assets/js/e00b100a.2221bfad.js new file mode 100644 index 000000000..ddb82979f --- /dev/null +++ b/assets/js/e00b100a.2221bfad.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[2103],{5674:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>d,contentTitle:()=>i,default:()=>u,frontMatter:()=>s,metadata:()=>c,toc:()=>a});var o=r(5893),n=r(1151);const s={},i="Credits",c={id:"user-guide/credits",title:"Credits",description:"Contributions",source:"@site/versioned_docs/version-5.1.0/user-guide/credits.md",sourceDirName:"user-guide",slug:"/user-guide/credits",permalink:"/docs/5.1.0/user-guide/credits",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.1.0/user-guide/credits.md",tags:[],version:"5.1.0",frontMatter:{},sidebar:"userGuide",previous:{title:"Q&A",permalink:"/docs/5.1.0/user-guide/qa"}},d={},a=[{value:"Contributions",id:"contributions",level:2},{value:"Project name",id:"project-name",level:2},{value:"Project Logo",id:"project-logo",level:2},{value:"License",id:"license",level:2}];function l(e){const t={a:"a",h1:"h1",h2:"h2",p:"p",...(0,n.a)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.h1,{id:"credits",children:"Credits"}),"\n",(0,o.jsx)(t.h2,{id:"contributions",children:"Contributions"}),"\n",(0,o.jsx)(t.p,{children:"Thank you for making Zealot more useful!"}),"\n",(0,o.jsx)("a",{href:"https://github.com/tryzealot/zealot/graphs/contributors",children:(0,o.jsx)("img",{src:"https://contrib.rocks/image?repo=tryzealot/zealot"})}),"\n",(0,o.jsx)(t.h2,{id:"project-name",children:"Project name"}),"\n",(0,o.jsx)(t.p,{children:"Zealot from the Starcraft species Gods base soldier."}),"\n",(0,o.jsx)(t.h2,{id:"project-logo",children:"Project Logo"}),"\n",(0,o.jsxs)(t.p,{children:["Project history submission resources may be used to for the icon copyright belongs to ",(0,o.jsx)(t.a,{href:"https://www.blizzard.com",children:"Blizzard"}),",\nlater changed to their own design icons, if there are enthusiastic designers can help design better icons,\nI represent this project to express my sincere gratitude."]}),"\n",(0,o.jsx)(t.h2,{id:"license",children:"License"}),"\n",(0,o.jsxs)(t.p,{children:["Zealot is an open source project released under the MIT distribution protocol (MIT), which can be found at ",(0,o.jsx)(t.a,{href:"https://github.com/tryzealot/zealot/blob/develop/LICENSE",children:"LICENSE file"}),"\u3002"]})]})}function u(e={}){const{wrapper:t}={...(0,n.a)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(l,{...e})}):l(e)}},1151:(e,t,r)=>{r.d(t,{Z:()=>c,a:()=>i});var o=r(7294);const n={},s=o.createContext(n);function i(e){const t=o.useContext(s);return o.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:i(e.components),o.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/e0ad0483.988e9317.js b/assets/js/e0ad0483.988e9317.js new file mode 100644 index 000000000..7bce8e19d --- /dev/null +++ b/assets/js/e0ad0483.988e9317.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[974],{3018:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>d,contentTitle:()=>i,default:()=>h,frontMatter:()=>o,metadata:()=>a,toc:()=>l});var r=t(5893),s=t(1151);const o={sidebar_label:"Nomad"},i="Deploy Zealot with Nomad guide",a={id:"self-hosted/deployment/nomad",title:"Deploy Zealot with Nomad guide",description:"Zealot support deployments using Nomad, it use HCL language to configure.",source:"@site/versioned_docs/version-5.2.0/self-hosted/deployment/nomad.md",sourceDirName:"self-hosted/deployment",slug:"/self-hosted/deployment/nomad",permalink:"/docs/self-hosted/deployment/nomad",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.2.0/self-hosted/deployment/nomad.md",tags:[],version:"5.2.0",frontMatter:{sidebar_label:"Nomad"},sidebar:"selfHosted",previous:{title:"Kubernetes",permalink:"/docs/self-hosted/deployment/kubernetes"},next:{title:"Source code",permalink:"/docs/self-hosted/deployment/source-code"}},d={},l=[{value:"Setup",id:"setup",level:2},{value:"Using Nomad",id:"using-nomad",level:3},{value:"Using Terraform",id:"using-terraform",level:3},{value:"External Storages",id:"external-storages",level:2},{value:"CSI",id:"csi",level:3}];function c(e){const n={a:"a",blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",h3:"h3",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,s.a)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.h1,{id:"deploy-zealot-with-nomad-guide",children:"Deploy Zealot with Nomad guide"}),"\n",(0,r.jsxs)(n.p,{children:["Zealot support deployments using ",(0,r.jsx)(n.a,{href:"https://www.nomadproject.io/",children:"Nomad"}),", it use ",(0,r.jsx)(n.a,{href:"https://developer.hashicorp.com/nomad/docs/job-specification/hcl2",children:"HCL"})," language to configure."]}),"\n",(0,r.jsx)(n.h2,{id:"setup",children:"Setup"}),"\n",(0,r.jsx)(n.h3,{id:"using-nomad",children:"Using Nomad"}),"\n",(0,r.jsxs)(n.p,{children:["First, follow the official tutorial to install ",(0,r.jsx)(n.a,{href:"https://developer.hashicorp.com/nomad/docs/install",children:"nomad"}),", this binary file contains the client and server. It is recommended to follow the ",(0,r.jsx)(n.a,{href:"https://developer.hashicorp.com/nomad/tutorials/get-started",children:"tutorials"})," to walk through it if you don't know it."]}),"\n",(0,r.jsxs)(n.p,{children:["The following file will create the postgres, redis and zealot services.\nFor the existing external database and cache services,\nyou can delete the corresponding ",(0,r.jsx)(n.code,{children:"port"}),", ",(0,r.jsx)(n.code,{children:"service"})," and ",(0,r.jsx)(n.code,{children:"task"})," and edit the template variables in the ",(0,r.jsx)(n.code,{children:"zealot"})," task."]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-hcl",metastring:'title="zealot.nomad"',children:'job "zealot" {\n type = "service"\n datacenters = "dc1" // modify\n\n update {\n max_parallel = 1\n min_healthy_time = "30s"\n auto_revert = true\n }\n\n group "zealot" {\n network {\n port "zealot" {\n to = 80\n }\n\n port "postgres" {\n to = 5678\n }\n\n port "redis" {\n to = 6379\n }\n }\n\n service {\n name = "zealot"\n port = "zealot"\n provider = "nomad"\n\n // Register to traefik\n // tags = [\n // "traefik.enable=true",\n // "traefik.http.routers.zealot.entrypoints=web, websecure",\n // "traefik.http.routers.zealot.rule=Host(`zealot.example.com`)",\n // ]\n }\n\n service {\n name = "postgres"\n port = "postgres"\n provider = "nomad"\n\n // Register to traefik\n // tags = [\n // "traefik.enable=true",\n // "traefik.tcp.routers.postgres.rule=HostSNI(`*`)",\n // "traefik.tcp.routers.postgres.entrypoints=postgres",\n // ]\n }\n\n service {\n name = "redis"\n port = "redis"\n provider = "nomad"\n\n // Register to traefik\n // tags = [\n // "traefik.enable=true",\n // "traefik.tcp.routers.redis.rule=HostSNI(`*`)",\n // "traefik.tcp.routers.redis.entrypoints=redis",\n // ]\n }\n\n task "zealot" {\n driver = "docker"\n\n config {\n image = "ghcr.io/tryzealot/zealot:latest"\n ports = ["zealot"]\n\n // modify\n volumes = [\n "/tmp/zealot/uploads:/app/public/uploads",\n "/tmp/zealot/backups:/app/public/backups",\n ]\n\n // Register to homepage dashboard\n // labels = {\n // "homepage.group" = "Dev"\n // "homepage.name" = "Zealot"\n // "homepage.icon" = "mdi-progress-download"\n // "homepage.href" = "https://zealot.example.com"\n // "homepage.description" = "Beta App Distribution"\n // }\n }\n\n // Zealot example config\n // https://github.com/tryzealot/zealot-docker/blob/master/config.env\n template {\n destination = "local/config.env"\n change_mode = "restart"\n env = true\n data = <<-EOF\n ZEALOT_APPEARANCE = dark\n ZEALOT_DOMAIN = zealot.example.com\n\n ZEALOT_GUEST_MODE = false\n ZEALOT_REGISTER_ENABLED = true\n EOF\n }\n\n template {\n destination = "secrets/secret.env"\n change_mode = "restart"\n env = true\n data = <<-EOF\n # admin account\n ZEALOT_ADMIN_EMAIL = admin@zealot.com\n ZEALOT_ADMIN_PASSWORD = ze@l0t\n\n # datbase\n ZEALOT_POSTGRES_HOST = {{ env "NOMAD_IP_postgres" }}\n ZEALOT_POSTGRES_PORT = {{ env "NOMAD_PORT_postgres" }}\n ZEALOT_POSTGRES_USERNAME = "zealot"\n ZEALOT_POSTGRES_PASSWORD = "zealot"\n ZEALOT_POSTGRES_DB_NAME = "zealot"\n\n # cache\n REDIS_URL = redis://{{ env "NOMAD_ARRR_redis" }}/0\n\n # secret token\n SECRET_TOKEN = $${ sha256(uuidv5("url", "zealot.ews.im")) }\n EOF\n }\n\n resources {\n cpu = 500\n memory = 500\n memory_max = 1000\n }\n }\n\n task "postgres" {\n driver = "docker"\n\n lifecycle {\n hook = "prestart"\n sidecar = true\n }\n\n config {\n image = "postgres:15-alpine"\n ports = ["postgres"]\n volumes = [\n "secrets/init-role.sql:/init-role.sql",\n "secrets/init-db.sql:/init-db.sql"\n ]\n }\n\n env {\n POSTGRES_INITDB_ARGS = "--data-checksums"\n POSTGRES_USER = "zealot"\n POSTGRES_PASSWORD = "zealot"\n POSTGRES_DB = "zealot"\n }\n\n resources{\n cpu = 512\n memory = 200\n memory_max = 512\n }\n }\n\n task "redis" {\n driver = "docker"\n\n lifecycle {\n hook = "prestart"\n sidecar = true\n }\n\n config {\n image = "redis:7-alpine"\n ports = ["redis"]\n }\n\n resources {\n cpu = 200\n memory = 200\n }\n }\n }\n}\n'})}),"\n",(0,r.jsxs)(n.p,{children:["Save the file and execute the command ",(0,r.jsx)(n.code,{children:"nomad job run zealot.nomad"}),"."]}),"\n",(0,r.jsx)(n.h3,{id:"using-terraform",children:"Using Terraform"}),"\n",(0,r.jsxs)(n.blockquote,{children:["\n",(0,r.jsx)(n.p,{children:"Both Terraform and Nomad are the same company."}),"\n"]}),"\n",(0,r.jsxs)(n.p,{children:["Following the offical tutorials to install ",(0,r.jsx)(n.a,{href:"https://www.terraform.io/",children:"terraform"}),", ",(0,r.jsx)(n.a,{href:"https://registry.terraform.io/providers/hashicorp/nomad/",children:"nomad plugin"}),",\ncopy the ",(0,r.jsx)(n.code,{children:"zealot.nomad"})," in previous step and edit a new file named ",(0,r.jsx)(n.code,{children:"main.tf"}),":"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-hcl",children:'resource "nomad_job" "jobs" {\n jobspec = file("${path.module}/zealot.nomad")\n}\n'})}),"\n",(0,r.jsxs)(n.p,{children:["Execute ",(0,r.jsx)(n.code,{children:"terraform plan"})," to ensure, then deploy ",(0,r.jsx)(n.code,{children:"terraform apply"}),"."]}),"\n",(0,r.jsx)(n.h2,{id:"external-storages",children:"External Storages"}),"\n",(0,r.jsx)(n.p,{children:"Nomad supports multi-cluster management, and in many cases the storage deployed by the service cannot be mounted directly to the corresponding file system, but is more often placed on top of a shared file storage protocol, such as SMB, NFS, S3, etc."}),"\n",(0,r.jsx)(n.h3,{id:"csi",children:"CSI"}),"\n",(0,r.jsxs)(n.p,{children:["Nomad currently supports the ",(0,r.jsx)(n.a,{href:"https://developer.hashicorp.com/nomad/tutorials/stateful-workloads/stateful-workloads-csi-volumes",children:"CSI"})," in ",(0,r.jsx)(n.a,{href:"https://github.com/democratic-csi/democratic-csi/blob/master/docs/nomad.md",children:"a limited capability"})," (Nomad 1.5).\nNomad can utilize CSI volumes, but it can not automatically create, destroy, or manage them in any capacity. Volumes have to be created externally and then registered with Nomad.\nYou can find a list of plugins in the ",(0,r.jsx)(n.a,{href:"https://kubernetes-csi.github.io/docs/drivers.html",children:"Kubernetes CSI Developer Documentation"}),"."]}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Plugin"}),(0,r.jsx)(n.th,{children:"Schemes"}),(0,r.jsx)(n.th,{children:"Compatible"}),(0,r.jsx)(n.th,{children:"terraform nomad resource"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.a,{href:"https://github.com/kubernetes-csi/csi-driver-smb",children:"kubernetes-csi-driver-smb"})}),(0,r.jsx)(n.td,{children:"smb"}),(0,r.jsx)(n.td,{children:"Unknown"}),(0,r.jsx)(n.td,{children:"Unknown"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.a,{href:"https://github.com/kubernetes-csi/csi-driver-nfs",children:"kubernetes-csi-driver-nfs"})}),(0,r.jsx)(n.td,{children:"nfs"}),(0,r.jsx)(n.td,{children:"Supported"}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.a,{href:"https://registry.terraform.io/providers/hashicorp/nomad/latest/docs/resources/csi_volume_registration",children:"nomad_csi_volume_registration"})})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.a,{href:"https://github.com/kubernetes-csi/csi-driver-iscsi",children:"kubernetes-csi-driver-iscsi"})}),(0,r.jsx)(n.td,{children:"iscsi"}),(0,r.jsx)(n.td,{children:"Supported"}),(0,r.jsx)(n.td,{children:"Supported"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.a,{href:"https://github.com/democratic-csi/democratic-csi",children:"democraticcsi/democratic-csi"})}),(0,r.jsx)(n.td,{children:"smb/nfs/iscsi"}),(0,r.jsx)(n.td,{children:"Supported"}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.a,{href:"https://registry.terraform.io/providers/hashicorp/nomad/latest/docs/resources/csi_volume",children:"nomad_csi_volume"})})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.a,{href:"https://gitlab.com/rocketduck/csi-plugin-nfs",children:"rocketduck/csi-plugin-nfs"})}),(0,r.jsx)(n.td,{children:"nfs"}),(0,r.jsx)(n.td,{children:"Supported"}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.a,{href:"https://registry.terraform.io/providers/hashicorp/nomad/latest/docs/resources/csi_volume",children:"nomad_csi_volume"})})]})]})]})]})}function h(e={}){const{wrapper:n}={...(0,s.a)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(c,{...e})}):c(e)}},1151:(e,n,t)=>{t.d(n,{Z:()=>a,a:()=>i});var r=t(7294);const s={},o=r.createContext(s);function i(e){const n=r.useContext(o);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:i(e.components),r.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/e239d5d6.5f5b4e64.js b/assets/js/e239d5d6.5f5b4e64.js new file mode 100644 index 000000000..95492d050 --- /dev/null +++ b/assets/js/e239d5d6.5f5b4e64.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[2717],{1591:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>c,default:()=>u,frontMatter:()=>r,metadata:()=>a,toc:()=>i});var o=n(5893),s=n(1151);const r={},c="Slack",a={id:"user-guide/webhooks/slack",title:"Slack",description:"Slack use Incoming Webhooks whose constructs",source:"@site/versioned_docs/version-5.1.0/user-guide/webhooks/slack.md",sourceDirName:"user-guide/webhooks",slug:"/user-guide/webhooks/slack",permalink:"/docs/5.1.0/user-guide/webhooks/slack",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.1.0/user-guide/webhooks/slack.md",tags:[],version:"5.1.0",frontMatter:{},sidebar:"userGuide",previous:{title:"Webhooks",permalink:"/docs/5.1.0/user-guide/webhooks"},next:{title:"Discord",permalink:"/docs/5.1.0/user-guide/webhooks/discord"}},l={},i=[{value:"Text format",id:"text-format",level:2},{value:"Block rich text format",id:"block-rich-text-format",level:2}];function d(e){const t={a:"a",code:"code",h1:"h1",h2:"h2",p:"p",pre:"pre",...(0,s.a)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.h1,{id:"slack",children:"Slack"}),"\n",(0,o.jsxs)(t.p,{children:[(0,o.jsx)(t.a,{href:"https://api.slack.com/messaging/webhooks",children:"Slack"})," use Incoming Webhooks whose constructs\ntypically support both text and block rich text, and can be configured as follows:"]}),"\n",(0,o.jsx)(t.h2,{id:"text-format",children:"Text format"}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{className:"language-ruby",children:'{\n "text": "#{@title}\\nPlatform: #{@device_type}\\nUpload at: #{@uploaded_at}"\n}\n'})}),"\n",(0,o.jsx)(t.h2,{id:"block-rich-text-format",children:"Block rich text format"}),"\n",(0,o.jsx)(t.p,{children:"A simple block with markdown support"}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{className:"language-ruby",children:'{\n "blocks": [\n {\n "type": "section",\n "text": {\n "type": "mrkdwn",\n "text": "## #{@title}\\nPlatform: #{@device_type}\\nUpload at: #{@uploaded_at}\\nInstal QRcode:\\n![qrcode](#{@qrcode_url})"\n }\n }\n ]\n}\n'})}),"\n",(0,o.jsx)(t.p,{children:"Better look at some of the structures shown in the block"}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{className:"language-ruby",children:'{\n "blocks": [\n {\n "type": "section",\n "text": {\n "type": "mrkdwn",\n "text": @title,\n }\n },\n {\n "type": "section",\n "fields": [\n {\n "type": "mrkdwn",\n "text": "*Platform:*\\n#{@device_type}"\n },\n {\n "type": "mrkdwn",\n "text": "*Upload at:*\\n#{@uploaded_at}"\n }\n ]\n },\n "accessory": {\n "type": "image",\n "image_url": @qrcode_url,\n "alt_text": "install qrcode"\n }\n ]\n}\n'})})]})}function u(e={}){const{wrapper:t}={...(0,s.a)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},1151:(e,t,n)=>{n.d(t,{Z:()=>a,a:()=>c});var o=n(7294);const s={},r=o.createContext(s);function c(e){const t=o.useContext(r);return o.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:c(e.components),o.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/e3b44675.dd47f70b.js b/assets/js/e3b44675.dd47f70b.js new file mode 100644 index 000000000..bcd763696 --- /dev/null +++ b/assets/js/e3b44675.dd47f70b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[7354],{9542:(e,o,t)=>{t.r(o),t.d(o,{assets:()=>l,contentTitle:()=>c,default:()=>f,frontMatter:()=>d,metadata:()=>a,toc:()=>p});var n=t(5893),r=t(1151),s=t(9965),i=t(4996);const d={},c="Developer Guide",a={id:"developer-guide/index",title:"Developer Guide",description:"Zealot offers a rich set of components for iOS, Android, and all aspects of the packaging process.",source:"@site/versioned_docs/version-5.1.0/developer-guide/index.md",sourceDirName:"developer-guide",slug:"/developer-guide/",permalink:"/docs/5.1.0/developer-guide/",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.1.0/developer-guide/index.md",tags:[],version:"5.1.0",frontMatter:{},sidebar:"developerGuide",next:{title:"SDKs",permalink:"/docs/5.1.0/category/sdks"}},l={},p=[];function u(e){const o={h1:"h1",p:"p",...(0,r.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(o.h1,{id:"developer-guide",children:"Developer Guide"}),"\n",(0,n.jsx)(o.p,{children:"Zealot offers a rich set of components for iOS, Android, and all aspects of the packaging process."}),"\n","\n","\n",(0,n.jsx)(s.Z,{alt:"Architecture",sources:{light:(0,i.Z)("/img/5.0.0/developer-resources-light.png"),dark:(0,i.Z)("/img/5.0.0/developer-resources-dark.png")}})]})}function f(e={}){const{wrapper:o}={...(0,r.a)(),...e.components};return o?(0,n.jsx)(o,{...e,children:(0,n.jsx)(u,{...e})}):u(e)}},1151:(e,o,t)=>{t.d(o,{Z:()=>d,a:()=>i});var n=t(7294);const r={},s=n.createContext(r);function i(e){const o=n.useContext(s);return n.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function d(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:i(e.components),n.createElement(s.Provider,{value:o},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/e3c59cf5.422d01ba.js b/assets/js/e3c59cf5.422d01ba.js new file mode 100644 index 000000000..2d3571510 --- /dev/null +++ b/assets/js/e3c59cf5.422d01ba.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[2052],{8974:(e,n,a)=>{a.r(n),a.d(n,{assets:()=>o,contentTitle:()=>d,default:()=>p,frontMatter:()=>i,metadata:()=>c,toc:()=>u});var l=a(5893),s=a(1151),t=a(4866),r=a(5162);const i={sidebar_label:"Source code"},d="Source code",c={id:"contributing-guide/local-development/source-code",title:"Source code",description:"The following is a tutorial on local deployment development for different operating systems.",source:"@site/versioned_docs/version-5.1.0/contributing-guide/local-development/source-code.md",sourceDirName:"contributing-guide/local-development",slug:"/contributing-guide/local-development/source-code",permalink:"/docs/5.1.0/contributing-guide/local-development/source-code",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.1.0/contributing-guide/local-development/source-code.md",tags:[],version:"5.1.0",frontMatter:{sidebar_label:"Source code"},sidebar:"contributingGuide",previous:{title:"Visual Studio Code Dev Container Setup",permalink:"/docs/5.1.0/contributing-guide/local-development/devcontainer"}},o={},u=[{value:"Prepare dependencies",id:"prepare-dependencies",level:2},{value:"macOS",id:"macos",level:3},{value:"Install homebrew",id:"install-homebrew",level:4},{value:"Install dependencies",id:"install-dependencies",level:4},{value:"Setup Database and cache services",id:"setup-database-and-cache-services",level:4},{value:"yarn",id:"yarn",level:4},{value:"Debian (Ubuntu)",id:"debian-ubuntu",level:3},{value:"System dependencies",id:"system-dependencies",level:4},{value:"Install dependencies",id:"install-dependencies-1",level:4},{value:"Setup Database and cache services",id:"setup-database-and-cache-services-1",level:4},{value:"node",id:"node",level:4},{value:"Alpine Linux",id:"alpine-linux",level:3},{value:"System dependencies",id:"system-dependencies-1",level:4},{value:"Install dependencies",id:"install-dependencies-2",level:4},{value:"Setup Database and cache services",id:"setup-database-and-cache-services-2",level:4},{value:"Install Ruby",id:"install-ruby",level:2},{value:"Fetch source code",id:"fetch-source-code",level:2},{value:"Initialize Zealot",id:"initialize-zealot",level:2},{value:"bundler",id:"bundler",level:3},{value:"yarn",id:"yarn-1",level:3},{value:"Initialize database",id:"initialize-database",level:3},{value:"Initialize default account and demo data",id:"initialize-default-account-and-demo-data",level:3},{value:"Launch services",id:"launch-services",level:3}];function h(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",p:"p",pre:"pre",...(0,s.a)(),...e.components};return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(n.h1,{id:"source-code",children:"Source code"}),"\n","\n","\n",(0,l.jsx)(n.p,{children:"The following is a tutorial on local deployment development for different operating systems."}),"\n",(0,l.jsx)(n.h2,{id:"prepare-dependencies",children:"Prepare dependencies"}),"\n",(0,l.jsx)(n.h3,{id:"macos",children:"macOS"}),"\n",(0,l.jsx)(n.h4,{id:"install-homebrew",children:"Install homebrew"}),"\n",(0,l.jsx)(n.p,{children:"First you need to install Xcode Command tools:"}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"$ xcode-select --install\n"})}),"\n",(0,l.jsx)(n.p,{children:"Then install Homebrew, the package management tool for macOS"}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:'$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"\n'})}),"\n",(0,l.jsx)(n.h4,{id:"install-dependencies",children:"Install dependencies"}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"$ brew install redis postgresql webp imagemagick node git\n"})}),"\n",(0,l.jsx)(n.h4,{id:"setup-database-and-cache-services",children:"Setup Database and cache services"}),"\n",(0,l.jsx)(n.p,{children:"Run postgresql and redis services"}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"$ brew services start postgresql\n$ brew services start redis\n"})}),"\n",(0,l.jsx)(n.p,{children:"You also need to create a default username in Postgresql\uff1a"}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"$ createuser --superuser zealot\n\n# If you are worried about the high privilege, you can only enable the create database privilege\n$ createuser --createdb zealot\n"})}),"\n",(0,l.jsx)(n.h4,{id:"yarn",children:"yarn"}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"$ npm install -g yarn\n"})}),"\n",(0,l.jsx)(n.h3,{id:"debian-ubuntu",children:"Debian (Ubuntu)"}),"\n",(0,l.jsx)(n.h4,{id:"system-dependencies",children:"System dependencies"}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"$ apt update\n$ apt install -y libssl-dev tar tzdata git imagemagick libjpeg-dev libpng-dev libtiff-dev libwebp-dev\n"})}),"\n",(0,l.jsx)(n.h4,{id:"install-dependencies-1",children:"Install dependencies"}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"$ apt install -y redis postgresql-client node\n"})}),"\n",(0,l.jsx)(n.h4,{id:"setup-database-and-cache-services-1",children:"Setup Database and cache services"}),"\n",(0,l.jsx)(n.p,{children:"Run postgresql and redis services"}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"$ systemctl postgres start\n$ systemctl redis start\n"})}),"\n",(0,l.jsx)(n.p,{children:"You also need to create a default username in Postgresql\uff1a"}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"$ initdb -D /var/lib/postgresql/data\n$ createuser --superuser zealot\n\n# If you are worried about the high privilege, you can only enable the create database privilege\n$ createuser --createdb zealot\n"})}),"\n",(0,l.jsx)(n.h4,{id:"node",children:"node"}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"$ npm install -g yarn\n"})}),"\n",(0,l.jsx)(n.h3,{id:"alpine-linux",children:"Alpine Linux"}),"\n",(0,l.jsx)(n.h4,{id:"system-dependencies-1",children:"System dependencies"}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"$ apk --update --no-cache add build-base libxml2 libxslt git \\\n libxml2-dev libxslt-dev yaml-dev postgresql-dev nodejs npm yarn libwebp-dev libpng-dev tiff-dev \\\n tzdata\n"})}),"\n",(0,l.jsxs)(n.p,{children:["Needs install ",(0,l.jsx)(n.code,{children:"gcompat"})," if use ",(0,l.jsx)(n.code,{children:"arm"}),' architecture. or an exception will throws such like "',(0,l.jsx)(n.a,{href:"https://nokogiri.org/tutorials/installing_nokogiri.html#linux-musl-error-loading-shared-library",children:"Error loading shared library"}),'".']}),"\n",(0,l.jsx)(n.h4,{id:"install-dependencies-2",children:"Install dependencies"}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"$ apk --update --no-cache redis postgresql\n"})}),"\n",(0,l.jsx)(n.h4,{id:"setup-database-and-cache-services-2",children:"Setup Database and cache services"}),"\n",(0,l.jsx)(n.p,{children:"Run postgresql and redis services"}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"$ rc-service postgres start\n$ rc-service redis start\n"})}),"\n",(0,l.jsx)(n.p,{children:"You also need to create a default username in Postgresql\uff1a"}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"$ initdb -D /var/lib/postgresql/data\n$ createuser --superuser zealot\n\n# If you are worried about the high privilege, you can only enable the create database privilege\n$ createuser --createdb zealot\n"})}),"\n",(0,l.jsx)(n.h2,{id:"install-ruby",children:"Install Ruby"}),"\n",(0,l.jsx)(n.p,{children:"Can be installed by either asdf, rvm as ruby version manager."}),"\n",(0,l.jsxs)(t.Z,{groupId:"install-ruby",children:[(0,l.jsxs)(r.Z,{value:"asdf",children:[(0,l.jsxs)(n.p,{children:["Following the ",(0,l.jsx)(n.a,{href:"http://asdf-vm.com/guide/getting-started.html",children:"offical install guide"})," then:"]}),(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"# Enable Ruby 3.2.0 YJIT need install rust 1.58+\n# Optinal install:\nasdf plugin add rust\nasdf install rust latest\nasdf global rust latest\nexport RUBY_CONFIGURE_OPTS=--enable-yjit\n\n# Required:\nasdf plugin add ruby\nasdf install ruby 3.2.0\nasdf global ruby 3.2.0\n"})})]}),(0,l.jsx)(r.Z,{value:"rvm",children:(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"$ curl -sSL https://get.rvm.io | bash -s stable\n$ rvm install 3.2.0 --disable-binary\n"})})})]}),"\n",(0,l.jsx)(n.h2,{id:"fetch-source-code",children:"Fetch source code"}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"git clone https://github.com/tryzealot/zealot.git\n"})}),"\n",(0,l.jsx)(n.h2,{id:"initialize-zealot",children:"Initialize Zealot"}),"\n",(0,l.jsx)(n.p,{children:"All the following steps need to be performed in the zealot root directory."}),"\n",(0,l.jsx)(n.h3,{id:"bundler",children:"bundler"}),"\n",(0,l.jsx)(n.p,{children:"Install Ruby gems"}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"$ [sudo] gem install bundler\n$ bundle install\n"})}),"\n",(0,l.jsx)(n.h3,{id:"yarn-1",children:"yarn"}),"\n",(0,l.jsx)(n.p,{children:"Install javascript packages:"}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"$ yarn install\n"})}),"\n",(0,l.jsx)(n.h3,{id:"initialize-database",children:"Initialize database"}),"\n",(0,l.jsx)(n.p,{children:"Make sure there are no problems with the connection database information, then the database tables will be created and the table structure will be created:"}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"$ rails db:create\n$ rails db:migrate\n"})}),"\n",(0,l.jsxs)(n.p,{children:["Configuring the connection database can be done via ",(0,l.jsx)(n.a,{href:"/docs/self-hosted/configuration/environment-variables",children:"environment variables"})," or by changing the ",(0,l.jsx)(n.code,{children:"config/database.yml"})," file."]}),"\n",(0,l.jsx)(n.h3,{id:"initialize-default-account-and-demo-data",children:"Initialize default account and demo data"}),"\n",(0,l.jsx)(n.p,{children:"Initialize administrator account and sample application"}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"$ rails db:seed\n"})}),"\n",(0,l.jsx)(n.h3,{id:"launch-services",children:"Launch services"}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"$ bin/dev\n"})}),"\n",(0,l.jsxs)(n.p,{children:["Open brower ",(0,l.jsx)(n.code,{children:"http://localhost:3000"})]})]})}function p(e={}){const{wrapper:n}={...(0,s.a)(),...e.components};return n?(0,l.jsx)(n,{...e,children:(0,l.jsx)(h,{...e})}):h(e)}},5162:(e,n,a)=>{a.d(n,{Z:()=>r});a(7294);var l=a(512);const s={tabItem:"tabItem_Ymn6"};var t=a(5893);function r(e){let{children:n,hidden:a,className:r}=e;return(0,t.jsx)("div",{role:"tabpanel",className:(0,l.Z)(s.tabItem,r),hidden:a,children:n})}},4866:(e,n,a)=>{a.d(n,{Z:()=>w});var l=a(7294),s=a(512),t=a(2466),r=a(6550),i=a(469),d=a(1980),c=a(7392),o=a(12);function u(e){return l.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,l.isValidElement)(e)&&function(e){const{props:n}=e;return!!n&&"object"==typeof n&&"value"in n}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function h(e){const{values:n,children:a}=e;return(0,l.useMemo)((()=>{const e=n??function(e){return u(e).map((e=>{let{props:{value:n,label:a,attributes:l,default:s}}=e;return{value:n,label:a,attributes:l,default:s}}))}(a);return function(e){const n=(0,c.l)(e,((e,n)=>e.value===n.value));if(n.length>0)throw new Error(`Docusaurus error: Duplicate values "${n.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[n,a])}function p(e){let{value:n,tabValues:a}=e;return a.some((e=>e.value===n))}function b(e){let{queryString:n=!1,groupId:a}=e;const s=(0,r.k6)(),t=function(e){let{queryString:n=!1,groupId:a}=e;if("string"==typeof n)return n;if(!1===n)return null;if(!0===n&&!a)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return a??null}({queryString:n,groupId:a});return[(0,d._X)(t),(0,l.useCallback)((e=>{if(!t)return;const n=new URLSearchParams(s.location.search);n.set(t,e),s.replace({...s.location,search:n.toString()})}),[t,s])]}function g(e){const{defaultValue:n,queryString:a=!1,groupId:s}=e,t=h(e),[r,d]=(0,l.useState)((()=>function(e){let{defaultValue:n,tabValues:a}=e;if(0===a.length)throw new Error("Docusaurus error: the component requires at least one children component");if(n){if(!p({value:n,tabValues:a}))throw new Error(`Docusaurus error: The has a defaultValue "${n}" but none of its children has the corresponding value. Available values are: ${a.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return n}const l=a.find((e=>e.default))??a[0];if(!l)throw new Error("Unexpected error: 0 tabValues");return l.value}({defaultValue:n,tabValues:t}))),[c,u]=b({queryString:a,groupId:s}),[g,m]=function(e){let{groupId:n}=e;const a=function(e){return e?`docusaurus.tab.${e}`:null}(n),[s,t]=(0,o.Nk)(a);return[s,(0,l.useCallback)((e=>{a&&t.set(e)}),[a,t])]}({groupId:s}),v=(()=>{const e=c??g;return p({value:e,tabValues:t})?e:null})();(0,i.Z)((()=>{v&&d(v)}),[v]);return{selectedValue:r,selectValue:(0,l.useCallback)((e=>{if(!p({value:e,tabValues:t}))throw new Error(`Can't select invalid tab value=${e}`);d(e),u(e),m(e)}),[u,m,t]),tabValues:t}}var m=a(2389);const v={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var x=a(5893);function f(e){let{className:n,block:a,selectedValue:l,selectValue:r,tabValues:i}=e;const d=[],{blockElementScrollPositionUntilNextRender:c}=(0,t.o5)(),o=e=>{const n=e.currentTarget,a=d.indexOf(n),s=i[a].value;s!==l&&(c(n),r(s))},u=e=>{let n=null;switch(e.key){case"Enter":o(e);break;case"ArrowRight":{const a=d.indexOf(e.currentTarget)+1;n=d[a]??d[0];break}case"ArrowLeft":{const a=d.indexOf(e.currentTarget)-1;n=d[a]??d[d.length-1];break}}n?.focus()};return(0,x.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,s.Z)("tabs",{"tabs--block":a},n),children:i.map((e=>{let{value:n,label:a,attributes:t}=e;return(0,x.jsx)("li",{role:"tab",tabIndex:l===n?0:-1,"aria-selected":l===n,ref:e=>d.push(e),onKeyDown:u,onClick:o,...t,className:(0,s.Z)("tabs__item",v.tabItem,t?.className,{"tabs__item--active":l===n}),children:a??n},n)}))})}function j(e){let{lazy:n,children:a,selectedValue:s}=e;const t=(Array.isArray(a)?a:[a]).filter(Boolean);if(n){const e=t.find((e=>e.props.value===s));return e?(0,l.cloneElement)(e,{className:"margin-top--md"}):null}return(0,x.jsx)("div",{className:"margin-top--md",children:t.map(((e,n)=>(0,l.cloneElement)(e,{key:n,hidden:e.props.value!==s})))})}function y(e){const n=g(e);return(0,x.jsxs)("div",{className:(0,s.Z)("tabs-container",v.tabList),children:[(0,x.jsx)(f,{...e,...n}),(0,x.jsx)(j,{...e,...n})]})}function w(e){const n=(0,m.Z)();return(0,x.jsx)(y,{...e,children:u(e.children)},String(n))}},1151:(e,n,a)=>{a.d(n,{Z:()=>i,a:()=>r});var l=a(7294);const s={},t=l.createContext(s);function r(e){const n=l.useContext(t);return l.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),l.createElement(t.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/e3c59cf5.62573dd7.js b/assets/js/e3c59cf5.62573dd7.js deleted file mode 100644 index d9ac75e56..000000000 --- a/assets/js/e3c59cf5.62573dd7.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[2052],{8974:(e,n,a)=>{a.r(n),a.d(n,{assets:()=>o,contentTitle:()=>d,default:()=>p,frontMatter:()=>i,metadata:()=>c,toc:()=>u});var l=a(5893),s=a(1151),t=a(4866),r=a(5162);const i={sidebar_label:"Source code"},d="Source code",c={id:"contributing-guide/local-development/source-code",title:"Source code",description:"The following is a tutorial on local deployment development for different operating systems.",source:"@site/versioned_docs/version-5.1.0/contributing-guide/local-development/source-code.md",sourceDirName:"contributing-guide/local-development",slug:"/contributing-guide/local-development/source-code",permalink:"/docs/contributing-guide/local-development/source-code",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.1.0/contributing-guide/local-development/source-code.md",tags:[],version:"5.1.0",frontMatter:{sidebar_label:"Source code"},sidebar:"contributingGuide",previous:{title:"Visual Studio Code Dev Container Setup",permalink:"/docs/contributing-guide/local-development/devcontainer"}},o={},u=[{value:"Prepare dependencies",id:"prepare-dependencies",level:2},{value:"macOS",id:"macos",level:3},{value:"Install homebrew",id:"install-homebrew",level:4},{value:"Install dependencies",id:"install-dependencies",level:4},{value:"Setup Database and cache services",id:"setup-database-and-cache-services",level:4},{value:"yarn",id:"yarn",level:4},{value:"Debian (Ubuntu)",id:"debian-ubuntu",level:3},{value:"System dependencies",id:"system-dependencies",level:4},{value:"Install dependencies",id:"install-dependencies-1",level:4},{value:"Setup Database and cache services",id:"setup-database-and-cache-services-1",level:4},{value:"node",id:"node",level:4},{value:"Alpine Linux",id:"alpine-linux",level:3},{value:"System dependencies",id:"system-dependencies-1",level:4},{value:"Install dependencies",id:"install-dependencies-2",level:4},{value:"Setup Database and cache services",id:"setup-database-and-cache-services-2",level:4},{value:"Install Ruby",id:"install-ruby",level:2},{value:"Fetch source code",id:"fetch-source-code",level:2},{value:"Initialize Zealot",id:"initialize-zealot",level:2},{value:"bundler",id:"bundler",level:3},{value:"yarn",id:"yarn-1",level:3},{value:"Initialize database",id:"initialize-database",level:3},{value:"Initialize default account and demo data",id:"initialize-default-account-and-demo-data",level:3},{value:"Launch services",id:"launch-services",level:3}];function h(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",p:"p",pre:"pre",...(0,s.a)(),...e.components};return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(n.h1,{id:"source-code",children:"Source code"}),"\n","\n","\n",(0,l.jsx)(n.p,{children:"The following is a tutorial on local deployment development for different operating systems."}),"\n",(0,l.jsx)(n.h2,{id:"prepare-dependencies",children:"Prepare dependencies"}),"\n",(0,l.jsx)(n.h3,{id:"macos",children:"macOS"}),"\n",(0,l.jsx)(n.h4,{id:"install-homebrew",children:"Install homebrew"}),"\n",(0,l.jsx)(n.p,{children:"First you need to install Xcode Command tools:"}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"$ xcode-select --install\n"})}),"\n",(0,l.jsx)(n.p,{children:"Then install Homebrew, the package management tool for macOS"}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:'$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"\n'})}),"\n",(0,l.jsx)(n.h4,{id:"install-dependencies",children:"Install dependencies"}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"$ brew install redis postgresql webp imagemagick node git\n"})}),"\n",(0,l.jsx)(n.h4,{id:"setup-database-and-cache-services",children:"Setup Database and cache services"}),"\n",(0,l.jsx)(n.p,{children:"Run postgresql and redis services"}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"$ brew services start postgresql\n$ brew services start redis\n"})}),"\n",(0,l.jsx)(n.p,{children:"You also need to create a default username in Postgresql\uff1a"}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"$ createuser --superuser zealot\n\n# If you are worried about the high privilege, you can only enable the create database privilege\n$ createuser --createdb zealot\n"})}),"\n",(0,l.jsx)(n.h4,{id:"yarn",children:"yarn"}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"$ npm install -g yarn\n"})}),"\n",(0,l.jsx)(n.h3,{id:"debian-ubuntu",children:"Debian (Ubuntu)"}),"\n",(0,l.jsx)(n.h4,{id:"system-dependencies",children:"System dependencies"}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"$ apt update\n$ apt install -y libssl-dev tar tzdata git imagemagick libjpeg-dev libpng-dev libtiff-dev libwebp-dev\n"})}),"\n",(0,l.jsx)(n.h4,{id:"install-dependencies-1",children:"Install dependencies"}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"$ apt install -y redis postgresql-client node\n"})}),"\n",(0,l.jsx)(n.h4,{id:"setup-database-and-cache-services-1",children:"Setup Database and cache services"}),"\n",(0,l.jsx)(n.p,{children:"Run postgresql and redis services"}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"$ systemctl postgres start\n$ systemctl redis start\n"})}),"\n",(0,l.jsx)(n.p,{children:"You also need to create a default username in Postgresql\uff1a"}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"$ initdb -D /var/lib/postgresql/data\n$ createuser --superuser zealot\n\n# If you are worried about the high privilege, you can only enable the create database privilege\n$ createuser --createdb zealot\n"})}),"\n",(0,l.jsx)(n.h4,{id:"node",children:"node"}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"$ npm install -g yarn\n"})}),"\n",(0,l.jsx)(n.h3,{id:"alpine-linux",children:"Alpine Linux"}),"\n",(0,l.jsx)(n.h4,{id:"system-dependencies-1",children:"System dependencies"}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"$ apk --update --no-cache add build-base libxml2 libxslt git \\\n libxml2-dev libxslt-dev yaml-dev postgresql-dev nodejs npm yarn libwebp-dev libpng-dev tiff-dev \\\n tzdata\n"})}),"\n",(0,l.jsxs)(n.p,{children:["Needs install ",(0,l.jsx)(n.code,{children:"gcompat"})," if use ",(0,l.jsx)(n.code,{children:"arm"}),' architecture. or an exception will throws such like "',(0,l.jsx)(n.a,{href:"https://nokogiri.org/tutorials/installing_nokogiri.html#linux-musl-error-loading-shared-library",children:"Error loading shared library"}),'".']}),"\n",(0,l.jsx)(n.h4,{id:"install-dependencies-2",children:"Install dependencies"}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"$ apk --update --no-cache redis postgresql\n"})}),"\n",(0,l.jsx)(n.h4,{id:"setup-database-and-cache-services-2",children:"Setup Database and cache services"}),"\n",(0,l.jsx)(n.p,{children:"Run postgresql and redis services"}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"$ rc-service postgres start\n$ rc-service redis start\n"})}),"\n",(0,l.jsx)(n.p,{children:"You also need to create a default username in Postgresql\uff1a"}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"$ initdb -D /var/lib/postgresql/data\n$ createuser --superuser zealot\n\n# If you are worried about the high privilege, you can only enable the create database privilege\n$ createuser --createdb zealot\n"})}),"\n",(0,l.jsx)(n.h2,{id:"install-ruby",children:"Install Ruby"}),"\n",(0,l.jsx)(n.p,{children:"Can be installed by either asdf, rvm as ruby version manager."}),"\n",(0,l.jsxs)(t.Z,{groupId:"install-ruby",children:[(0,l.jsxs)(r.Z,{value:"asdf",children:[(0,l.jsxs)(n.p,{children:["Following the ",(0,l.jsx)(n.a,{href:"http://asdf-vm.com/guide/getting-started.html",children:"offical install guide"})," then:"]}),(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"# Enable Ruby 3.2.0 YJIT need install rust 1.58+\n# Optinal install:\nasdf plugin add rust\nasdf install rust latest\nasdf global rust latest\nexport RUBY_CONFIGURE_OPTS=--enable-yjit\n\n# Required:\nasdf plugin add ruby\nasdf install ruby 3.2.0\nasdf global ruby 3.2.0\n"})})]}),(0,l.jsx)(r.Z,{value:"rvm",children:(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"$ curl -sSL https://get.rvm.io | bash -s stable\n$ rvm install 3.2.0 --disable-binary\n"})})})]}),"\n",(0,l.jsx)(n.h2,{id:"fetch-source-code",children:"Fetch source code"}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"git clone https://github.com/tryzealot/zealot.git\n"})}),"\n",(0,l.jsx)(n.h2,{id:"initialize-zealot",children:"Initialize Zealot"}),"\n",(0,l.jsx)(n.p,{children:"All the following steps need to be performed in the zealot root directory."}),"\n",(0,l.jsx)(n.h3,{id:"bundler",children:"bundler"}),"\n",(0,l.jsx)(n.p,{children:"Install Ruby gems"}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"$ [sudo] gem install bundler\n$ bundle install\n"})}),"\n",(0,l.jsx)(n.h3,{id:"yarn-1",children:"yarn"}),"\n",(0,l.jsx)(n.p,{children:"Install javascript packages:"}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"$ yarn install\n"})}),"\n",(0,l.jsx)(n.h3,{id:"initialize-database",children:"Initialize database"}),"\n",(0,l.jsx)(n.p,{children:"Make sure there are no problems with the connection database information, then the database tables will be created and the table structure will be created:"}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"$ rails db:create\n$ rails db:migrate\n"})}),"\n",(0,l.jsxs)(n.p,{children:["Configuring the connection database can be done via ",(0,l.jsx)(n.a,{href:"/docs/self-hosted/configuration/environment-variables",children:"environment variables"})," or by changing the ",(0,l.jsx)(n.code,{children:"config/database.yml"})," file."]}),"\n",(0,l.jsx)(n.h3,{id:"initialize-default-account-and-demo-data",children:"Initialize default account and demo data"}),"\n",(0,l.jsx)(n.p,{children:"Initialize administrator account and sample application"}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"$ rails db:seed\n"})}),"\n",(0,l.jsx)(n.h3,{id:"launch-services",children:"Launch services"}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"$ bin/dev\n"})}),"\n",(0,l.jsxs)(n.p,{children:["Open brower ",(0,l.jsx)(n.code,{children:"http://localhost:3000"})]})]})}function p(e={}){const{wrapper:n}={...(0,s.a)(),...e.components};return n?(0,l.jsx)(n,{...e,children:(0,l.jsx)(h,{...e})}):h(e)}},5162:(e,n,a)=>{a.d(n,{Z:()=>r});a(7294);var l=a(512);const s={tabItem:"tabItem_Ymn6"};var t=a(5893);function r(e){let{children:n,hidden:a,className:r}=e;return(0,t.jsx)("div",{role:"tabpanel",className:(0,l.Z)(s.tabItem,r),hidden:a,children:n})}},4866:(e,n,a)=>{a.d(n,{Z:()=>w});var l=a(7294),s=a(512),t=a(2466),r=a(6550),i=a(469),d=a(1980),c=a(7392),o=a(12);function u(e){return l.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,l.isValidElement)(e)&&function(e){const{props:n}=e;return!!n&&"object"==typeof n&&"value"in n}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function h(e){const{values:n,children:a}=e;return(0,l.useMemo)((()=>{const e=n??function(e){return u(e).map((e=>{let{props:{value:n,label:a,attributes:l,default:s}}=e;return{value:n,label:a,attributes:l,default:s}}))}(a);return function(e){const n=(0,c.l)(e,((e,n)=>e.value===n.value));if(n.length>0)throw new Error(`Docusaurus error: Duplicate values "${n.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[n,a])}function p(e){let{value:n,tabValues:a}=e;return a.some((e=>e.value===n))}function b(e){let{queryString:n=!1,groupId:a}=e;const s=(0,r.k6)(),t=function(e){let{queryString:n=!1,groupId:a}=e;if("string"==typeof n)return n;if(!1===n)return null;if(!0===n&&!a)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return a??null}({queryString:n,groupId:a});return[(0,d._X)(t),(0,l.useCallback)((e=>{if(!t)return;const n=new URLSearchParams(s.location.search);n.set(t,e),s.replace({...s.location,search:n.toString()})}),[t,s])]}function g(e){const{defaultValue:n,queryString:a=!1,groupId:s}=e,t=h(e),[r,d]=(0,l.useState)((()=>function(e){let{defaultValue:n,tabValues:a}=e;if(0===a.length)throw new Error("Docusaurus error: the component requires at least one children component");if(n){if(!p({value:n,tabValues:a}))throw new Error(`Docusaurus error: The has a defaultValue "${n}" but none of its children has the corresponding value. Available values are: ${a.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return n}const l=a.find((e=>e.default))??a[0];if(!l)throw new Error("Unexpected error: 0 tabValues");return l.value}({defaultValue:n,tabValues:t}))),[c,u]=b({queryString:a,groupId:s}),[g,m]=function(e){let{groupId:n}=e;const a=function(e){return e?`docusaurus.tab.${e}`:null}(n),[s,t]=(0,o.Nk)(a);return[s,(0,l.useCallback)((e=>{a&&t.set(e)}),[a,t])]}({groupId:s}),v=(()=>{const e=c??g;return p({value:e,tabValues:t})?e:null})();(0,i.Z)((()=>{v&&d(v)}),[v]);return{selectedValue:r,selectValue:(0,l.useCallback)((e=>{if(!p({value:e,tabValues:t}))throw new Error(`Can't select invalid tab value=${e}`);d(e),u(e),m(e)}),[u,m,t]),tabValues:t}}var m=a(2389);const v={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var x=a(5893);function f(e){let{className:n,block:a,selectedValue:l,selectValue:r,tabValues:i}=e;const d=[],{blockElementScrollPositionUntilNextRender:c}=(0,t.o5)(),o=e=>{const n=e.currentTarget,a=d.indexOf(n),s=i[a].value;s!==l&&(c(n),r(s))},u=e=>{let n=null;switch(e.key){case"Enter":o(e);break;case"ArrowRight":{const a=d.indexOf(e.currentTarget)+1;n=d[a]??d[0];break}case"ArrowLeft":{const a=d.indexOf(e.currentTarget)-1;n=d[a]??d[d.length-1];break}}n?.focus()};return(0,x.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,s.Z)("tabs",{"tabs--block":a},n),children:i.map((e=>{let{value:n,label:a,attributes:t}=e;return(0,x.jsx)("li",{role:"tab",tabIndex:l===n?0:-1,"aria-selected":l===n,ref:e=>d.push(e),onKeyDown:u,onClick:o,...t,className:(0,s.Z)("tabs__item",v.tabItem,t?.className,{"tabs__item--active":l===n}),children:a??n},n)}))})}function j(e){let{lazy:n,children:a,selectedValue:s}=e;const t=(Array.isArray(a)?a:[a]).filter(Boolean);if(n){const e=t.find((e=>e.props.value===s));return e?(0,l.cloneElement)(e,{className:"margin-top--md"}):null}return(0,x.jsx)("div",{className:"margin-top--md",children:t.map(((e,n)=>(0,l.cloneElement)(e,{key:n,hidden:e.props.value!==s})))})}function y(e){const n=g(e);return(0,x.jsxs)("div",{className:(0,s.Z)("tabs-container",v.tabList),children:[(0,x.jsx)(f,{...e,...n}),(0,x.jsx)(j,{...e,...n})]})}function w(e){const n=(0,m.Z)();return(0,x.jsx)(y,{...e,children:u(e.children)},String(n))}},1151:(e,n,a)=>{a.d(n,{Z:()=>i,a:()=>r});var l=a(7294);const s={},t=l.createContext(s);function r(e){const n=l.useContext(t);return l.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),l.createElement(t.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/e5cd0e52.34328806.js b/assets/js/e5cd0e52.34328806.js new file mode 100644 index 000000000..0701bd031 --- /dev/null +++ b/assets/js/e5cd0e52.34328806.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[8130],{3094:(t,e,n)=>{n.r(e),n.d(e,{assets:()=>u,contentTitle:()=>d,default:()=>l,frontMatter:()=>a,metadata:()=>c,toc:()=>g});var s=n(5893),i=n(1151),r=n(9965),o=n(4996);const a={},d="Settings",c={id:"user-guide/administrator/settings",title:"Settings",description:"{n.d(e,{Z:()=>a,a:()=>o});var s=n(7294);const i={},r=s.createContext(i);function o(t){const e=s.useContext(r);return s.useMemo((function(){return"function"==typeof t?t(e):{...e,...t}}),[e,t])}function a(t){let e;return e=t.disableParentContext?"function"==typeof t.components?t.components(i):t.components||i:o(t.components),s.createElement(r.Provider,{value:e},t.children)}}}]); \ No newline at end of file diff --git a/assets/js/e619d213.4e461b52.js b/assets/js/e619d213.4e461b52.js new file mode 100644 index 000000000..5baa44679 --- /dev/null +++ b/assets/js/e619d213.4e461b52.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[7846],{8612:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>a,contentTitle:()=>t,default:()=>o,frontMatter:()=>i,metadata:()=>l,toc:()=>c});var d=s(5893),r=s(1151);const i={sidebar_label:"Apps"},t="App APIs",l={id:"developer-guide/api/apps",title:"App APIs",description:"Upload an app",source:"@site/versioned_docs/version-5.1.0/developer-guide/api/apps.md",sourceDirName:"developer-guide/api",slug:"/developer-guide/api/apps",permalink:"/docs/5.1.0/developer-guide/api/apps",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.1.0/developer-guide/api/apps.md",tags:[],version:"5.1.0",frontMatter:{sidebar_label:"Apps"},sidebar:"developerGuide",previous:{title:"APIs",permalink:"/docs/5.1.0/developer-guide/api"},next:{title:"Debug Files",permalink:"/docs/5.1.0/developer-guide/api/debug_files"}},a={},c=[{value:"Upload an app",id:"upload-an-app",level:2},{value:"Parameters",id:"parameters",level:3},{value:"Return body",id:"return-body",level:4},{value:"List apps",id:"list-apps",level:2},{value:"Parameters",id:"parameters-1",level:3},{value:"Return body",id:"return-body-1",level:3},{value:"Get an app",id:"get-an-app",level:2},{value:"Parameters",id:"parameters-2",level:3},{value:"Return body",id:"return-body-2",level:3},{value:"Get versions list of app",id:"get-versions-list-of-app",level:2},{value:"Parameters",id:"parameters-3",level:3},{value:"Return body",id:"return-body-3",level:3},{value:"Get the latest version of app",id:"get-the-latest-version-of-app",level:2},{value:"Parameters",id:"parameters-4",level:3},{value:"Return body",id:"return-body-4",level:3},{value:"Check version exists",id:"check-version-exists",level:2},{value:"Parameters",id:"parameters-5",level:3},{value:"Return body",id:"return-body-5",level:3}];function h(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",li:"li",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,r.a)(),...e.components};return(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)(n.h1,{id:"app-apis",children:"App APIs"}),"\n",(0,d.jsx)(n.h2,{id:"upload-an-app",children:"Upload an app"}),"\n",(0,d.jsx)(n.p,{children:"This allows you to upload an single iOS, Android or macOS file."}),"\n",(0,d.jsx)(n.pre,{children:(0,d.jsx)(n.code,{children:"POST /api/apps/upload\n"})}),"\n",(0,d.jsx)(n.h3,{id:"parameters",children:"Parameters"}),"\n",(0,d.jsx)(n.admonition,{type:"info",children:(0,d.jsxs)(n.p,{children:[(0,d.jsx)(n.a,{href:"/docs/developer-guide/api#authentication",children:"Authentication"})," required."]})}),"\n",(0,d.jsxs)(n.table,{children:[(0,d.jsx)(n.thead,{children:(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.th,{children:"Attribute"}),(0,d.jsx)(n.th,{children:"Type"}),(0,d.jsx)(n.th,{children:"Required"}),(0,d.jsx)(n.th,{children:"Description"})]})}),(0,d.jsxs)(n.tbody,{children:[(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:"file"}),(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"File"})}),(0,d.jsx)(n.td,{children:"true"}),(0,d.jsx)(n.td,{children:"an App file"})]}),(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:"channel_key"}),(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"String"})}),(0,d.jsx)(n.td,{children:"false"}),(0,d.jsxs)(n.td,{children:["Channel key",(0,d.jsx)("br",{}),"Create a new App if leave it empty"]})]}),(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:"name"}),(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"String"})}),(0,d.jsx)(n.td,{children:"false"}),(0,d.jsxs)(n.td,{children:["the name of App",(0,d.jsx)("br",{}),"Use app name from parsed metadata in given file if leave it empty"]})]}),(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:"release_type"}),(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"String"})}),(0,d.jsx)(n.td,{children:"false"}),(0,d.jsx)(n.td,{children:"Eg, debug, beta, adhoc, release, enterprise \u7b49"})]}),(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:"source"}),(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"String"})}),(0,d.jsx)(n.td,{children:"false"}),(0,d.jsxs)(n.td,{children:["the source of upload (default is ",(0,d.jsx)(n.code,{children:"api"}),")"]})]}),(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:"changelog"}),(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"String"})}),(0,d.jsx)(n.td,{children:"false"}),(0,d.jsxs)(n.td,{children:["Changelog",(0,d.jsx)("br",{}),"Avaiables in plain text or JSON formatted struct"]})]}),(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:"branch"}),(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"String"})}),(0,d.jsx)(n.td,{children:"false"}),(0,d.jsx)(n.td,{children:"a branch name from git"})]}),(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:"git_commit"}),(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"String"})}),(0,d.jsx)(n.td,{children:"false"}),(0,d.jsx)(n.td,{children:"git commit"})]}),(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:"ci_url"}),(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"String"})}),(0,d.jsx)(n.td,{children:"false"}),(0,d.jsx)(n.td,{children:"the build url of a C"})]}),(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:"custom_fields"}),(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"String"})}),(0,d.jsx)(n.td,{children:"false"}),(0,d.jsxs)(n.td,{children:["JSON formatted custom fileds",(0,d.jsx)("br",{}),"It could configures and display title, ",(0,d.jsx)("br",{}),"value and icon from fontawesome in a Release page from an App"]})]})]})]}),"\n",(0,d.jsxs)(n.p,{children:["For ",(0,d.jsx)(n.code,{children:"changelog"})," attribute which it accepts both ",(0,d.jsx)(n.code,{children:"plain text"})," and ",(0,d.jsx)(n.code,{children:"JSON"})," formatted contents:"]}),"\n",(0,d.jsxs)(n.p,{children:[(0,d.jsx)(n.strong,{children:"plain text"}),":"]}),"\n",(0,d.jsx)(n.pre,{children:(0,d.jsx)(n.code,{children:"message 1\\nmessage 2\n"})}),"\n",(0,d.jsxs)(n.p,{children:[(0,d.jsx)(n.strong,{children:"JSON"}),":"]}),"\n",(0,d.jsx)(n.pre,{children:(0,d.jsx)(n.code,{children:'[\n {\n "message": "message 1",\n "author": "admin",\n "email": "admin@zealot.com",\n "date": "2021-11-11 11:11:11"\n },\n {\n "message": "message 1",\n "author": "developer",\n "email": "developer@zealot.com",\n "date": "2021-11-11 11:11:11"\n }\n]\n'})}),"\n",(0,d.jsxs)(n.p,{children:["For ",(0,d.jsx)(n.code,{children:"custom_fields"})," attribute which it use ",(0,d.jsx)(n.code,{children:"JSON"})," formatted struct to build from each key-value. for example, Display country name like ",(0,d.jsx)(n.code,{children:"country=China"})," with icon ",(0,d.jsx)(n.a,{href:"https://fontawesome.com/v5.15/icons/flag?style=solid",children:"flag"}),":"]}),"\n",(0,d.jsx)(n.pre,{children:(0,d.jsx)(n.code,{className:"language-diff",children:'curl -X POST \\\n \'https://YOUR_ZEALOT_URL/api/apps/upload\' \\\n --form \'token="token"\' \\\n --form \'channel_key="channel_key"\' \\\n+ --form \'custom_fields="[{"name":"country","value":"China","icon":"fas fa-flag"}]"\' \\\n --form \'file=@/path/to/your/app\'\n'})}),"\n",(0,d.jsx)(n.h4,{id:"return-body",children:"Return body"}),"\n",(0,d.jsx)(n.pre,{children:(0,d.jsx)(n.code,{className:"language-json",children:'{\n\t"id": 50,\n\t"version": 7,\n\t"app_name": "Test Android",\n\t"bundle_id": "com.test.app",\n\t"release_version": "1.0",\n\t"build_version": "1",\n\t"source": "SOURCE",\n\t"branch": "master",\n\t"git_commit": "e9de48513dbb6abfbxxxxxxxxxxxxxxxxxxxxxxxx",\n\t"ci_url": "",\n\t"size": 1565486,\n\t"icon_url": "/uploads/apps/a1/r1/icons/app_icon.png",\n\t"release_url": "https://YOUR_ZEALOT_URL/channels/1XmpC/releases/1",\n\t"install_url": "https://YOUR_ZEALOT_URL/download/releases/1",\n\t"qrcode_url": "https://YOUR_ZEALOT_URL/channels/1XmpC/releases/1/qrcode?size=thumb",\n\t"changelog": [\n\t\t{\n\t\t\t"message": "Changelog message 1"\n\t\t},\n {\n\t\t\t"message": "Changelog message 2"\n\t\t}\n\t],\n "text_changelog": "- Changelog message 1\\n- Changelog message 2",\n\t"custom_fields": [],\n\t"created_at": "2021-09-01T11:43:33.977+08:00",\n\t"app": {\n\t\t"id": 1,\n\t\t"name": "App name"\n\t},\n\t"scheme": {\n\t\t"id": 8,\n\t\t"name": "Test"\n\t},\n\t"channel": {\n\t\t"slug": "1XmpC",\n\t\t"name": "Android",\n\t\t"device_type": "android",\n\t\t"bundle_id": "*",\n\t\t"git_url": null,\n\t\t"has_password": false\n\t}\n}\n'})}),"\n",(0,d.jsx)(n.h2,{id:"list-apps",children:"List apps"}),"\n",(0,d.jsx)(n.p,{children:"Get a list of app."}),"\n",(0,d.jsx)(n.p,{children:"This function takes pagination parameters page and per_page to restrict the list of app."}),"\n",(0,d.jsx)(n.pre,{children:(0,d.jsx)(n.code,{children:"GET /api/apps\n"})}),"\n",(0,d.jsx)(n.h3,{id:"parameters-1",children:"Parameters"}),"\n",(0,d.jsxs)(n.table,{children:[(0,d.jsx)(n.thead,{children:(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.th,{children:"Attribute"}),(0,d.jsx)(n.th,{children:"Type"}),(0,d.jsx)(n.th,{children:"Required"}),(0,d.jsx)(n.th,{children:"Description"})]})}),(0,d.jsxs)(n.tbody,{children:[(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:"page"}),(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"Integer"})}),(0,d.jsx)(n.td,{children:"false"}),(0,d.jsxs)(n.td,{children:["Page number (default: ",(0,d.jsx)(n.code,{children:"1"}),")"]})]}),(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:"per_page"}),(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"Integer"})}),(0,d.jsx)(n.td,{children:"false"}),(0,d.jsxs)(n.td,{children:["Number of items to list per page (default: ",(0,d.jsx)(n.code,{children:"25"}),", max: ",(0,d.jsx)(n.code,{children:"100"}),")."]})]})]})]}),"\n",(0,d.jsx)(n.h3,{id:"return-body-1",children:"Return body"}),"\n",(0,d.jsx)(n.pre,{children:(0,d.jsx)(n.code,{className:"language-json",children:'[\n {\n "id": 1,\n "name": "Zealot",\n "schemes": [\n {\n "id": 1,\n "name": "Adhoc",\n "channels": [\n {\n "slug": "X1IXN",\n "name": "Android",\n "device_type": "android",\n "bundle_id": "*",\n "git_url": null,\n "has_password": false\n },\n {\n "slug": "O1qHk",\n "name": "iOS",\n "device_type": "ios",\n "bundle_id": "*",\n "git_url": null,\n "has_password": false\n }\n ]\n },\n {\n "id": 2,\n "name": "\u5185\u6d4b\u7248",\n "channels": [\n {\n "slug": "l19Tl",\n "name": "Android",\n "device_type": "android",\n "bundle_id": "*",\n "git_url": null,\n "has_password": false\n },\n {\n "slug": "8selv",\n "name": "iOS",\n "device_type": "ios",\n "bundle_id": "*",\n "git_url": null,\n "has_password": false\n }\n ]\n }\n ]\n }\n]\n'})}),"\n",(0,d.jsx)(n.h2,{id:"get-an-app",children:"Get an app"}),"\n",(0,d.jsx)(n.p,{children:"Allows you to receive information about an app like name, scheme, channel."}),"\n",(0,d.jsx)(n.pre,{children:(0,d.jsx)(n.code,{children:"GET /api/apps/:id\n"})}),"\n",(0,d.jsx)(n.h3,{id:"parameters-2",children:"Parameters"}),"\n",(0,d.jsxs)(n.table,{children:[(0,d.jsx)(n.thead,{children:(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.th,{children:"Attribute"}),(0,d.jsx)(n.th,{children:"Type"}),(0,d.jsx)(n.th,{children:"Required"}),(0,d.jsx)(n.th,{children:"Description"})]})}),(0,d.jsx)(n.tbody,{children:(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:"id"}),(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"String"})}),(0,d.jsx)(n.td,{children:"true"}),(0,d.jsx)(n.td,{children:"ID"})]})})]}),"\n",(0,d.jsx)(n.h3,{id:"return-body-2",children:"Return body"}),"\n",(0,d.jsx)(n.pre,{children:(0,d.jsx)(n.code,{className:"language-json",children:'{\n "id": 1,\n "name": "Zealot",\n "schemes": [\n {\n "id": 5,\n "name": "Test App",\n "channels": [\n {\n "slug": "X1IXN",\n "name": "Android",\n "device_type": "android",\n "bundle_id": "*",\n "git_url": null,\n "has_password": false\n },\n {\n "slug": "O1qHk",\n "name": "iOS",\n "device_type": "ios",\n "bundle_id": "*",\n "git_url": null,\n "has_password": false\n }\n ]\n }\n ]\n}\n'})}),"\n",(0,d.jsx)(n.h2,{id:"get-versions-list-of-app",children:"Get versions list of app"}),"\n",(0,d.jsx)(n.p,{children:"Get a list of apps by the given channel key"}),"\n",(0,d.jsx)(n.pre,{children:(0,d.jsx)(n.code,{children:"GET /api/apps/versions\n"})}),"\n",(0,d.jsx)(n.h3,{id:"parameters-3",children:"Parameters"}),"\n",(0,d.jsxs)(n.table,{children:[(0,d.jsx)(n.thead,{children:(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.th,{children:"Attribute"}),(0,d.jsx)(n.th,{children:"Type"}),(0,d.jsx)(n.th,{children:"Required"}),(0,d.jsx)(n.th,{children:"Description"})]})}),(0,d.jsxs)(n.tbody,{children:[(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:"channel_key"}),(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"String"})}),(0,d.jsx)(n.td,{children:"true"}),(0,d.jsx)(n.td,{children:"Channel key"})]}),(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:"page"}),(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"Integer"})}),(0,d.jsx)(n.td,{children:"false"}),(0,d.jsxs)(n.td,{children:["Page number (default: ",(0,d.jsx)(n.code,{children:"1"}),")"]})]}),(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:"per_page"}),(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"Integer"})}),(0,d.jsx)(n.td,{children:"false"}),(0,d.jsxs)(n.td,{children:["Number of items to list per page (default: ",(0,d.jsx)(n.code,{children:"25"}),", max: ",(0,d.jsx)(n.code,{children:"100"}),")."]})]})]})]}),"\n",(0,d.jsx)(n.h3,{id:"return-body-3",children:"Return body"}),"\n",(0,d.jsx)(n.pre,{children:(0,d.jsx)(n.code,{className:"language-json",children:'{\n "app_name": "Zealot iOS",\n "bundle_id": "*",\n "git_url": null,\n "app": {\n "id": 3,\n "name": "Zealot"\n },\n "scheme": {\n "id": 5,\n "name": "AdHoc"\n },\n "releases": [\n {\n "version": 2,\n "app_name": "Zealot iOS",\n "bundle_id": "im.ews.zealot",\n "release_version": "1.0.0",\n "build_version": "10292024",\n "source": "Web",\n "branch": "",\n "git_commit": "",\n "ci_url": "",\n "size": 79712596,\n "icon_url": "https://tryzealot.ews.im/uploads/apps/a3/r21/icons/8ab13dc08321f9f3412a9fa98689d9c3.png",\n "install_url": "itms-services://?action=download-manifest&url=https://tryzealot.ews.im/api/apps/O1qHk/1/install",\n "changelog": [],\n "created_at": "2019-12-25T14:26:06.608+08:00"\n },\n {\n "version": 1,\n "app_name": "Zealot iOS",\n "bundle_id": "im.ews.zealot",\n "release_version": "1.0.0",\n "build_version": "10291524",\n "source": "Web",\n "branch": "",\n "git_commit": "",\n "ci_url": "",\n "size": 79712596,\n "icon_url": "https://tryzealot.ews.im/uploads/apps/a3/r21/icons/8ab13dc08321f9f3412a9fa98689d9c3.png",\n "install_url": "itms-services://?action=download-manifest&url=https://tryzealot.ews.im/api/apps/O1qHk/1/install",\n "changelog": [],\n "created_at": "2019-12-25T14:26:06.608+08:00"\n },\n ]\n}\n'})}),"\n",(0,d.jsx)(n.h2,{id:"get-the-latest-version-of-app",children:"Get the latest version of app"}),"\n",(0,d.jsx)(n.p,{children:"Allows you to receive the latest information about a Release version from App like app metadata, changelog, icon url, install (download) url."}),"\n",(0,d.jsx)(n.pre,{children:(0,d.jsx)(n.code,{children:"GET /api/apps/latest\n"})}),"\n",(0,d.jsx)(n.h3,{id:"parameters-4",children:"Parameters"}),"\n",(0,d.jsxs)(n.table,{children:[(0,d.jsx)(n.thead,{children:(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.th,{children:"Attribute"}),(0,d.jsx)(n.th,{children:"Type"}),(0,d.jsx)(n.th,{children:"Required"}),(0,d.jsx)(n.th,{children:"Description"})]})}),(0,d.jsxs)(n.tbody,{children:[(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:"channel_key"}),(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"String"})}),(0,d.jsx)(n.td,{children:"true"}),(0,d.jsx)(n.td,{children:"Channel key"})]}),(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:"release_version"}),(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"String"})}),(0,d.jsx)(n.td,{children:"true"}),(0,d.jsx)(n.td,{children:"Release version"})]}),(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:"build_version"}),(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"String"})}),(0,d.jsx)(n.td,{children:"true"}),(0,d.jsx)(n.td,{children:"Build version"})]})]})]}),"\n",(0,d.jsx)(n.h3,{id:"return-body-4",children:"Return body"}),"\n",(0,d.jsx)(n.pre,{children:(0,d.jsx)(n.code,{className:"language-json",children:'{\n "app_name": "Zealot iOS",\n "bundle_id": "*",\n "git_url": null,\n "app": {\n "id": 3,\n "name": "Zealot"\n },\n "scheme": {\n "id": 5,\n "name": "AdHoc"\n },\n "releases": {\n "version": 1,\n "app_name": "Zealot iOS",\n "bundle_id": "im.ews.zealot",\n "release_version": "1.0.0",\n "build_version": "10291524",\n "source": "Web",\n "branch": "",\n "git_commit": "",\n "ci_url": "",\n "size": 79712596,\n "icon_url": "https://tryzealot.ews.im/uploads/apps/a3/r21/icons/8ab13dc08321f9f3412a9fa98689d9c3.png",\n "install_url": "itms-services://?action=download-manifest&url=https://tryzealot.ews.im/api/apps/O1qHk/1/install",\n "changelog": [],\n "created_at": "2019-12-25T14:26:06.608+08:00"\n }\n}\n'})}),"\n",(0,d.jsx)(n.h2,{id:"check-version-exists",children:"Check version exists"}),"\n",(0,d.jsx)(n.p,{children:"Allows you to check the Release exists by given query, query accepts two combo group:"}),"\n",(0,d.jsxs)(n.ul,{children:["\n",(0,d.jsxs)(n.li,{children:[(0,d.jsx)(n.code,{children:"bundle_id"}),", ",(0,d.jsx)(n.code,{children:"release_version"})," and ",(0,d.jsx)(n.code,{children:"build_verion"})]}),"\n",(0,d.jsxs)(n.li,{children:[(0,d.jsx)(n.code,{children:"bundle_id"})," and ",(0,d.jsx)(n.code,{children:"git_commit"})]}),"\n"]}),"\n",(0,d.jsx)(n.pre,{children:(0,d.jsx)(n.code,{children:"GET /api/apps/version_exist\n"})}),"\n",(0,d.jsx)(n.h3,{id:"parameters-5",children:"Parameters"}),"\n",(0,d.jsxs)(n.table,{children:[(0,d.jsx)(n.thead,{children:(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.th,{children:"Attribute"}),(0,d.jsx)(n.th,{children:"Type"}),(0,d.jsx)(n.th,{children:"Required"}),(0,d.jsx)(n.th,{children:"Description"})]})}),(0,d.jsxs)(n.tbody,{children:[(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:"channel_key"}),(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"String"})}),(0,d.jsx)(n.td,{children:"true"}),(0,d.jsx)(n.td,{children:"Channel key"})]}),(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:"bundle_id"}),(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"String"})}),(0,d.jsx)(n.td,{children:"true"}),(0,d.jsx)(n.td,{children:"bundle_id or package_name"})]}),(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:"release_version"}),(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"String"})}),(0,d.jsx)(n.td,{children:"false"}),(0,d.jsx)(n.td,{children:"Release version"})]}),(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:"build_version"}),(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"String"})}),(0,d.jsx)(n.td,{children:"false"}),(0,d.jsx)(n.td,{children:"Build version"})]}),(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:"git_commit"}),(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"String"})}),(0,d.jsx)(n.td,{children:"false"}),(0,d.jsx)(n.td,{children:"git commit hash"})]})]})]}),"\n",(0,d.jsx)(n.h3,{id:"return-body-5",children:"Return body"}),"\n",(0,d.jsxs)(n.ul,{children:["\n",(0,d.jsx)(n.li,{children:"Return 200 if release existed."}),"\n",(0,d.jsx)(n.li,{children:"Return 404 if release not existed."}),"\n"]}),"\n",(0,d.jsx)(n.p,{children:"Success returns:"}),"\n",(0,d.jsx)(n.pre,{children:(0,d.jsx)(n.code,{className:"language-json",children:'{\n "version": 1,\n "app_name": "Zealot iOS",\n "bundle_id": "im.ews.zealot",\n "release_version": "4.1.1",\n "build_version": "10291524",\n "source": "Web",\n "branch": "",\n "git_commit": "",\n "ci_url": "",\n "size": 79712596,\n "icon_url": "https://tryzealot.ews.im/uploads/apps/a3/r21/icons/8ab13dc08321f9f3412a9fa98689d9c3.png",\n "install_url": "itms-services://?action=download-manifest&url=https://tryzealot.ews.im/api/apps/O1qHk/1/install",\n "changelog": [],\n "created_at": "2019-12-25T14:26:06.608+08:00"\n}\n'})}),"\n",(0,d.jsx)(n.p,{children:"Not found returns:"}),"\n",(0,d.jsx)(n.pre,{children:(0,d.jsx)(n.code,{className:"language-json",children:'{\n "error": "Not found release"\n}\n'})})]})}function o(e={}){const{wrapper:n}={...(0,r.a)(),...e.components};return n?(0,d.jsx)(n,{...e,children:(0,d.jsx)(h,{...e})}):h(e)}},1151:(e,n,s)=>{s.d(n,{Z:()=>l,a:()=>t});var d=s(7294);const r={},i=d.createContext(r);function t(e){const n=d.useContext(i);return d.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:t(e.components),d.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/e619d213.df052752.js b/assets/js/e619d213.df052752.js deleted file mode 100644 index 4e22bd07e..000000000 --- a/assets/js/e619d213.df052752.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[7846],{8612:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>a,contentTitle:()=>t,default:()=>o,frontMatter:()=>i,metadata:()=>l,toc:()=>c});var d=s(5893),r=s(1151);const i={sidebar_label:"Apps"},t="App APIs",l={id:"developer-guide/api/apps",title:"App APIs",description:"Upload an app",source:"@site/versioned_docs/version-5.1.0/developer-guide/api/apps.md",sourceDirName:"developer-guide/api",slug:"/developer-guide/api/apps",permalink:"/docs/developer-guide/api/apps",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.1.0/developer-guide/api/apps.md",tags:[],version:"5.1.0",frontMatter:{sidebar_label:"Apps"},sidebar:"developerGuide",previous:{title:"APIs",permalink:"/docs/developer-guide/api"},next:{title:"Debug Files",permalink:"/docs/developer-guide/api/debug_files"}},a={},c=[{value:"Upload an app",id:"upload-an-app",level:2},{value:"Parameters",id:"parameters",level:3},{value:"Return body",id:"return-body",level:4},{value:"List apps",id:"list-apps",level:2},{value:"Parameters",id:"parameters-1",level:3},{value:"Return body",id:"return-body-1",level:3},{value:"Get an app",id:"get-an-app",level:2},{value:"Parameters",id:"parameters-2",level:3},{value:"Return body",id:"return-body-2",level:3},{value:"Get versions list of app",id:"get-versions-list-of-app",level:2},{value:"Parameters",id:"parameters-3",level:3},{value:"Return body",id:"return-body-3",level:3},{value:"Get the latest version of app",id:"get-the-latest-version-of-app",level:2},{value:"Parameters",id:"parameters-4",level:3},{value:"Return body",id:"return-body-4",level:3},{value:"Check version exists",id:"check-version-exists",level:2},{value:"Parameters",id:"parameters-5",level:3},{value:"Return body",id:"return-body-5",level:3}];function h(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",li:"li",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,r.a)(),...e.components};return(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)(n.h1,{id:"app-apis",children:"App APIs"}),"\n",(0,d.jsx)(n.h2,{id:"upload-an-app",children:"Upload an app"}),"\n",(0,d.jsx)(n.p,{children:"This allows you to upload an single iOS, Android or macOS file."}),"\n",(0,d.jsx)(n.pre,{children:(0,d.jsx)(n.code,{children:"POST /api/apps/upload\n"})}),"\n",(0,d.jsx)(n.h3,{id:"parameters",children:"Parameters"}),"\n",(0,d.jsx)(n.admonition,{type:"info",children:(0,d.jsxs)(n.p,{children:[(0,d.jsx)(n.a,{href:"/docs/developer-guide/api#authentication",children:"Authentication"})," required."]})}),"\n",(0,d.jsxs)(n.table,{children:[(0,d.jsx)(n.thead,{children:(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.th,{children:"Attribute"}),(0,d.jsx)(n.th,{children:"Type"}),(0,d.jsx)(n.th,{children:"Required"}),(0,d.jsx)(n.th,{children:"Description"})]})}),(0,d.jsxs)(n.tbody,{children:[(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:"file"}),(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"File"})}),(0,d.jsx)(n.td,{children:"true"}),(0,d.jsx)(n.td,{children:"an App file"})]}),(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:"channel_key"}),(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"String"})}),(0,d.jsx)(n.td,{children:"false"}),(0,d.jsxs)(n.td,{children:["Channel key",(0,d.jsx)("br",{}),"Create a new App if leave it empty"]})]}),(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:"name"}),(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"String"})}),(0,d.jsx)(n.td,{children:"false"}),(0,d.jsxs)(n.td,{children:["the name of App",(0,d.jsx)("br",{}),"Use app name from parsed metadata in given file if leave it empty"]})]}),(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:"release_type"}),(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"String"})}),(0,d.jsx)(n.td,{children:"false"}),(0,d.jsx)(n.td,{children:"Eg, debug, beta, adhoc, release, enterprise \u7b49"})]}),(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:"source"}),(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"String"})}),(0,d.jsx)(n.td,{children:"false"}),(0,d.jsxs)(n.td,{children:["the source of upload (default is ",(0,d.jsx)(n.code,{children:"api"}),")"]})]}),(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:"changelog"}),(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"String"})}),(0,d.jsx)(n.td,{children:"false"}),(0,d.jsxs)(n.td,{children:["Changelog",(0,d.jsx)("br",{}),"Avaiables in plain text or JSON formatted struct"]})]}),(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:"branch"}),(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"String"})}),(0,d.jsx)(n.td,{children:"false"}),(0,d.jsx)(n.td,{children:"a branch name from git"})]}),(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:"git_commit"}),(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"String"})}),(0,d.jsx)(n.td,{children:"false"}),(0,d.jsx)(n.td,{children:"git commit"})]}),(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:"ci_url"}),(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"String"})}),(0,d.jsx)(n.td,{children:"false"}),(0,d.jsx)(n.td,{children:"the build url of a C"})]}),(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:"custom_fields"}),(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"String"})}),(0,d.jsx)(n.td,{children:"false"}),(0,d.jsxs)(n.td,{children:["JSON formatted custom fileds",(0,d.jsx)("br",{}),"It could configures and display title, ",(0,d.jsx)("br",{}),"value and icon from fontawesome in a Release page from an App"]})]})]})]}),"\n",(0,d.jsxs)(n.p,{children:["For ",(0,d.jsx)(n.code,{children:"changelog"})," attribute which it accepts both ",(0,d.jsx)(n.code,{children:"plain text"})," and ",(0,d.jsx)(n.code,{children:"JSON"})," formatted contents:"]}),"\n",(0,d.jsxs)(n.p,{children:[(0,d.jsx)(n.strong,{children:"plain text"}),":"]}),"\n",(0,d.jsx)(n.pre,{children:(0,d.jsx)(n.code,{children:"message 1\\nmessage 2\n"})}),"\n",(0,d.jsxs)(n.p,{children:[(0,d.jsx)(n.strong,{children:"JSON"}),":"]}),"\n",(0,d.jsx)(n.pre,{children:(0,d.jsx)(n.code,{children:'[\n {\n "message": "message 1",\n "author": "admin",\n "email": "admin@zealot.com",\n "date": "2021-11-11 11:11:11"\n },\n {\n "message": "message 1",\n "author": "developer",\n "email": "developer@zealot.com",\n "date": "2021-11-11 11:11:11"\n }\n]\n'})}),"\n",(0,d.jsxs)(n.p,{children:["For ",(0,d.jsx)(n.code,{children:"custom_fields"})," attribute which it use ",(0,d.jsx)(n.code,{children:"JSON"})," formatted struct to build from each key-value. for example, Display country name like ",(0,d.jsx)(n.code,{children:"country=China"})," with icon ",(0,d.jsx)(n.a,{href:"https://fontawesome.com/v5.15/icons/flag?style=solid",children:"flag"}),":"]}),"\n",(0,d.jsx)(n.pre,{children:(0,d.jsx)(n.code,{className:"language-diff",children:'curl -X POST \\\n \'https://YOUR_ZEALOT_URL/api/apps/upload\' \\\n --form \'token="token"\' \\\n --form \'channel_key="channel_key"\' \\\n+ --form \'custom_fields="[{"name":"country","value":"China","icon":"fas fa-flag"}]"\' \\\n --form \'file=@/path/to/your/app\'\n'})}),"\n",(0,d.jsx)(n.h4,{id:"return-body",children:"Return body"}),"\n",(0,d.jsx)(n.pre,{children:(0,d.jsx)(n.code,{className:"language-json",children:'{\n\t"id": 50,\n\t"version": 7,\n\t"app_name": "Test Android",\n\t"bundle_id": "com.test.app",\n\t"release_version": "1.0",\n\t"build_version": "1",\n\t"source": "SOURCE",\n\t"branch": "master",\n\t"git_commit": "e9de48513dbb6abfbxxxxxxxxxxxxxxxxxxxxxxxx",\n\t"ci_url": "",\n\t"size": 1565486,\n\t"icon_url": "/uploads/apps/a1/r1/icons/app_icon.png",\n\t"release_url": "https://YOUR_ZEALOT_URL/channels/1XmpC/releases/1",\n\t"install_url": "https://YOUR_ZEALOT_URL/download/releases/1",\n\t"qrcode_url": "https://YOUR_ZEALOT_URL/channels/1XmpC/releases/1/qrcode?size=thumb",\n\t"changelog": [\n\t\t{\n\t\t\t"message": "Changelog message 1"\n\t\t},\n {\n\t\t\t"message": "Changelog message 2"\n\t\t}\n\t],\n "text_changelog": "- Changelog message 1\\n- Changelog message 2",\n\t"custom_fields": [],\n\t"created_at": "2021-09-01T11:43:33.977+08:00",\n\t"app": {\n\t\t"id": 1,\n\t\t"name": "App name"\n\t},\n\t"scheme": {\n\t\t"id": 8,\n\t\t"name": "Test"\n\t},\n\t"channel": {\n\t\t"slug": "1XmpC",\n\t\t"name": "Android",\n\t\t"device_type": "android",\n\t\t"bundle_id": "*",\n\t\t"git_url": null,\n\t\t"has_password": false\n\t}\n}\n'})}),"\n",(0,d.jsx)(n.h2,{id:"list-apps",children:"List apps"}),"\n",(0,d.jsx)(n.p,{children:"Get a list of app."}),"\n",(0,d.jsx)(n.p,{children:"This function takes pagination parameters page and per_page to restrict the list of app."}),"\n",(0,d.jsx)(n.pre,{children:(0,d.jsx)(n.code,{children:"GET /api/apps\n"})}),"\n",(0,d.jsx)(n.h3,{id:"parameters-1",children:"Parameters"}),"\n",(0,d.jsxs)(n.table,{children:[(0,d.jsx)(n.thead,{children:(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.th,{children:"Attribute"}),(0,d.jsx)(n.th,{children:"Type"}),(0,d.jsx)(n.th,{children:"Required"}),(0,d.jsx)(n.th,{children:"Description"})]})}),(0,d.jsxs)(n.tbody,{children:[(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:"page"}),(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"Integer"})}),(0,d.jsx)(n.td,{children:"false"}),(0,d.jsxs)(n.td,{children:["Page number (default: ",(0,d.jsx)(n.code,{children:"1"}),")"]})]}),(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:"per_page"}),(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"Integer"})}),(0,d.jsx)(n.td,{children:"false"}),(0,d.jsxs)(n.td,{children:["Number of items to list per page (default: ",(0,d.jsx)(n.code,{children:"25"}),", max: ",(0,d.jsx)(n.code,{children:"100"}),")."]})]})]})]}),"\n",(0,d.jsx)(n.h3,{id:"return-body-1",children:"Return body"}),"\n",(0,d.jsx)(n.pre,{children:(0,d.jsx)(n.code,{className:"language-json",children:'[\n {\n "id": 1,\n "name": "Zealot",\n "schemes": [\n {\n "id": 1,\n "name": "Adhoc",\n "channels": [\n {\n "slug": "X1IXN",\n "name": "Android",\n "device_type": "android",\n "bundle_id": "*",\n "git_url": null,\n "has_password": false\n },\n {\n "slug": "O1qHk",\n "name": "iOS",\n "device_type": "ios",\n "bundle_id": "*",\n "git_url": null,\n "has_password": false\n }\n ]\n },\n {\n "id": 2,\n "name": "\u5185\u6d4b\u7248",\n "channels": [\n {\n "slug": "l19Tl",\n "name": "Android",\n "device_type": "android",\n "bundle_id": "*",\n "git_url": null,\n "has_password": false\n },\n {\n "slug": "8selv",\n "name": "iOS",\n "device_type": "ios",\n "bundle_id": "*",\n "git_url": null,\n "has_password": false\n }\n ]\n }\n ]\n }\n]\n'})}),"\n",(0,d.jsx)(n.h2,{id:"get-an-app",children:"Get an app"}),"\n",(0,d.jsx)(n.p,{children:"Allows you to receive information about an app like name, scheme, channel."}),"\n",(0,d.jsx)(n.pre,{children:(0,d.jsx)(n.code,{children:"GET /api/apps/:id\n"})}),"\n",(0,d.jsx)(n.h3,{id:"parameters-2",children:"Parameters"}),"\n",(0,d.jsxs)(n.table,{children:[(0,d.jsx)(n.thead,{children:(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.th,{children:"Attribute"}),(0,d.jsx)(n.th,{children:"Type"}),(0,d.jsx)(n.th,{children:"Required"}),(0,d.jsx)(n.th,{children:"Description"})]})}),(0,d.jsx)(n.tbody,{children:(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:"id"}),(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"String"})}),(0,d.jsx)(n.td,{children:"true"}),(0,d.jsx)(n.td,{children:"ID"})]})})]}),"\n",(0,d.jsx)(n.h3,{id:"return-body-2",children:"Return body"}),"\n",(0,d.jsx)(n.pre,{children:(0,d.jsx)(n.code,{className:"language-json",children:'{\n "id": 1,\n "name": "Zealot",\n "schemes": [\n {\n "id": 5,\n "name": "Test App",\n "channels": [\n {\n "slug": "X1IXN",\n "name": "Android",\n "device_type": "android",\n "bundle_id": "*",\n "git_url": null,\n "has_password": false\n },\n {\n "slug": "O1qHk",\n "name": "iOS",\n "device_type": "ios",\n "bundle_id": "*",\n "git_url": null,\n "has_password": false\n }\n ]\n }\n ]\n}\n'})}),"\n",(0,d.jsx)(n.h2,{id:"get-versions-list-of-app",children:"Get versions list of app"}),"\n",(0,d.jsx)(n.p,{children:"Get a list of apps by the given channel key"}),"\n",(0,d.jsx)(n.pre,{children:(0,d.jsx)(n.code,{children:"GET /api/apps/versions\n"})}),"\n",(0,d.jsx)(n.h3,{id:"parameters-3",children:"Parameters"}),"\n",(0,d.jsxs)(n.table,{children:[(0,d.jsx)(n.thead,{children:(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.th,{children:"Attribute"}),(0,d.jsx)(n.th,{children:"Type"}),(0,d.jsx)(n.th,{children:"Required"}),(0,d.jsx)(n.th,{children:"Description"})]})}),(0,d.jsxs)(n.tbody,{children:[(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:"channel_key"}),(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"String"})}),(0,d.jsx)(n.td,{children:"true"}),(0,d.jsx)(n.td,{children:"Channel key"})]}),(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:"page"}),(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"Integer"})}),(0,d.jsx)(n.td,{children:"false"}),(0,d.jsxs)(n.td,{children:["Page number (default: ",(0,d.jsx)(n.code,{children:"1"}),")"]})]}),(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:"per_page"}),(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"Integer"})}),(0,d.jsx)(n.td,{children:"false"}),(0,d.jsxs)(n.td,{children:["Number of items to list per page (default: ",(0,d.jsx)(n.code,{children:"25"}),", max: ",(0,d.jsx)(n.code,{children:"100"}),")."]})]})]})]}),"\n",(0,d.jsx)(n.h3,{id:"return-body-3",children:"Return body"}),"\n",(0,d.jsx)(n.pre,{children:(0,d.jsx)(n.code,{className:"language-json",children:'{\n "app_name": "Zealot iOS",\n "bundle_id": "*",\n "git_url": null,\n "app": {\n "id": 3,\n "name": "Zealot"\n },\n "scheme": {\n "id": 5,\n "name": "AdHoc"\n },\n "releases": [\n {\n "version": 2,\n "app_name": "Zealot iOS",\n "bundle_id": "im.ews.zealot",\n "release_version": "1.0.0",\n "build_version": "10292024",\n "source": "Web",\n "branch": "",\n "git_commit": "",\n "ci_url": "",\n "size": 79712596,\n "icon_url": "https://tryzealot.ews.im/uploads/apps/a3/r21/icons/8ab13dc08321f9f3412a9fa98689d9c3.png",\n "install_url": "itms-services://?action=download-manifest&url=https://tryzealot.ews.im/api/apps/O1qHk/1/install",\n "changelog": [],\n "created_at": "2019-12-25T14:26:06.608+08:00"\n },\n {\n "version": 1,\n "app_name": "Zealot iOS",\n "bundle_id": "im.ews.zealot",\n "release_version": "1.0.0",\n "build_version": "10291524",\n "source": "Web",\n "branch": "",\n "git_commit": "",\n "ci_url": "",\n "size": 79712596,\n "icon_url": "https://tryzealot.ews.im/uploads/apps/a3/r21/icons/8ab13dc08321f9f3412a9fa98689d9c3.png",\n "install_url": "itms-services://?action=download-manifest&url=https://tryzealot.ews.im/api/apps/O1qHk/1/install",\n "changelog": [],\n "created_at": "2019-12-25T14:26:06.608+08:00"\n },\n ]\n}\n'})}),"\n",(0,d.jsx)(n.h2,{id:"get-the-latest-version-of-app",children:"Get the latest version of app"}),"\n",(0,d.jsx)(n.p,{children:"Allows you to receive the latest information about a Release version from App like app metadata, changelog, icon url, install (download) url."}),"\n",(0,d.jsx)(n.pre,{children:(0,d.jsx)(n.code,{children:"GET /api/apps/latest\n"})}),"\n",(0,d.jsx)(n.h3,{id:"parameters-4",children:"Parameters"}),"\n",(0,d.jsxs)(n.table,{children:[(0,d.jsx)(n.thead,{children:(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.th,{children:"Attribute"}),(0,d.jsx)(n.th,{children:"Type"}),(0,d.jsx)(n.th,{children:"Required"}),(0,d.jsx)(n.th,{children:"Description"})]})}),(0,d.jsxs)(n.tbody,{children:[(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:"channel_key"}),(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"String"})}),(0,d.jsx)(n.td,{children:"true"}),(0,d.jsx)(n.td,{children:"Channel key"})]}),(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:"release_version"}),(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"String"})}),(0,d.jsx)(n.td,{children:"true"}),(0,d.jsx)(n.td,{children:"Release version"})]}),(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:"build_version"}),(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"String"})}),(0,d.jsx)(n.td,{children:"true"}),(0,d.jsx)(n.td,{children:"Build version"})]})]})]}),"\n",(0,d.jsx)(n.h3,{id:"return-body-4",children:"Return body"}),"\n",(0,d.jsx)(n.pre,{children:(0,d.jsx)(n.code,{className:"language-json",children:'{\n "app_name": "Zealot iOS",\n "bundle_id": "*",\n "git_url": null,\n "app": {\n "id": 3,\n "name": "Zealot"\n },\n "scheme": {\n "id": 5,\n "name": "AdHoc"\n },\n "releases": {\n "version": 1,\n "app_name": "Zealot iOS",\n "bundle_id": "im.ews.zealot",\n "release_version": "1.0.0",\n "build_version": "10291524",\n "source": "Web",\n "branch": "",\n "git_commit": "",\n "ci_url": "",\n "size": 79712596,\n "icon_url": "https://tryzealot.ews.im/uploads/apps/a3/r21/icons/8ab13dc08321f9f3412a9fa98689d9c3.png",\n "install_url": "itms-services://?action=download-manifest&url=https://tryzealot.ews.im/api/apps/O1qHk/1/install",\n "changelog": [],\n "created_at": "2019-12-25T14:26:06.608+08:00"\n }\n}\n'})}),"\n",(0,d.jsx)(n.h2,{id:"check-version-exists",children:"Check version exists"}),"\n",(0,d.jsx)(n.p,{children:"Allows you to check the Release exists by given query, query accepts two combo group:"}),"\n",(0,d.jsxs)(n.ul,{children:["\n",(0,d.jsxs)(n.li,{children:[(0,d.jsx)(n.code,{children:"bundle_id"}),", ",(0,d.jsx)(n.code,{children:"release_version"})," and ",(0,d.jsx)(n.code,{children:"build_verion"})]}),"\n",(0,d.jsxs)(n.li,{children:[(0,d.jsx)(n.code,{children:"bundle_id"})," and ",(0,d.jsx)(n.code,{children:"git_commit"})]}),"\n"]}),"\n",(0,d.jsx)(n.pre,{children:(0,d.jsx)(n.code,{children:"GET /api/apps/version_exist\n"})}),"\n",(0,d.jsx)(n.h3,{id:"parameters-5",children:"Parameters"}),"\n",(0,d.jsxs)(n.table,{children:[(0,d.jsx)(n.thead,{children:(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.th,{children:"Attribute"}),(0,d.jsx)(n.th,{children:"Type"}),(0,d.jsx)(n.th,{children:"Required"}),(0,d.jsx)(n.th,{children:"Description"})]})}),(0,d.jsxs)(n.tbody,{children:[(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:"channel_key"}),(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"String"})}),(0,d.jsx)(n.td,{children:"true"}),(0,d.jsx)(n.td,{children:"Channel key"})]}),(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:"bundle_id"}),(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"String"})}),(0,d.jsx)(n.td,{children:"true"}),(0,d.jsx)(n.td,{children:"bundle_id or package_name"})]}),(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:"release_version"}),(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"String"})}),(0,d.jsx)(n.td,{children:"false"}),(0,d.jsx)(n.td,{children:"Release version"})]}),(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:"build_version"}),(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"String"})}),(0,d.jsx)(n.td,{children:"false"}),(0,d.jsx)(n.td,{children:"Build version"})]}),(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:"git_commit"}),(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"String"})}),(0,d.jsx)(n.td,{children:"false"}),(0,d.jsx)(n.td,{children:"git commit hash"})]})]})]}),"\n",(0,d.jsx)(n.h3,{id:"return-body-5",children:"Return body"}),"\n",(0,d.jsxs)(n.ul,{children:["\n",(0,d.jsx)(n.li,{children:"Return 200 if release existed."}),"\n",(0,d.jsx)(n.li,{children:"Return 404 if release not existed."}),"\n"]}),"\n",(0,d.jsx)(n.p,{children:"Success returns:"}),"\n",(0,d.jsx)(n.pre,{children:(0,d.jsx)(n.code,{className:"language-json",children:'{\n "version": 1,\n "app_name": "Zealot iOS",\n "bundle_id": "im.ews.zealot",\n "release_version": "4.1.1",\n "build_version": "10291524",\n "source": "Web",\n "branch": "",\n "git_commit": "",\n "ci_url": "",\n "size": 79712596,\n "icon_url": "https://tryzealot.ews.im/uploads/apps/a3/r21/icons/8ab13dc08321f9f3412a9fa98689d9c3.png",\n "install_url": "itms-services://?action=download-manifest&url=https://tryzealot.ews.im/api/apps/O1qHk/1/install",\n "changelog": [],\n "created_at": "2019-12-25T14:26:06.608+08:00"\n}\n'})}),"\n",(0,d.jsx)(n.p,{children:"Not found returns:"}),"\n",(0,d.jsx)(n.pre,{children:(0,d.jsx)(n.code,{className:"language-json",children:'{\n "error": "Not found release"\n}\n'})})]})}function o(e={}){const{wrapper:n}={...(0,r.a)(),...e.components};return n?(0,d.jsx)(n,{...e,children:(0,d.jsx)(h,{...e})}):h(e)}},1151:(e,n,s)=>{s.d(n,{Z:()=>l,a:()=>t});var d=s(7294);const r={},i=d.createContext(r);function t(e){const n=d.useContext(i);return d.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:t(e.components),d.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/e6f7e927.ba1954b3.js b/assets/js/e6f7e927.ba1954b3.js new file mode 100644 index 000000000..f7bfac542 --- /dev/null +++ b/assets/js/e6f7e927.ba1954b3.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[6453],{7858:(e,i,t)=>{t.r(i),t.d(i,{assets:()=>c,contentTitle:()=>l,default:()=>u,frontMatter:()=>o,metadata:()=>a,toc:()=>h});var n=t(5893),s=t(1151),r=t(9965),d=t(4996);const o={sidebar_label:"Fetch UDID"},l="Fetch iOS Device UDID",a={id:"user-guide/toolkits/fetch-udid",title:"Fetch iOS Device UDID",description:"- List of installable applications based on UDID",source:"@site/versioned_docs/version-5.1.0/user-guide/toolkits/fetch-udid.mdx",sourceDirName:"user-guide/toolkits",slug:"/user-guide/toolkits/fetch-udid",permalink:"/docs/5.1.0/user-guide/toolkits/fetch-udid",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.1.0/user-guide/toolkits/fetch-udid.mdx",tags:[],version:"5.1.0",frontMatter:{sidebar_label:"Fetch UDID"},sidebar:"userGuide",previous:{title:"Teardown App",permalink:"/docs/5.1.0/user-guide/toolkits/teardown"},next:{title:"Webhooks",permalink:"/docs/5.1.0/user-guide/webhooks"}},c={},h=[{value:"Install profile",id:"install-profile",level:2},{value:"Unregistered Device",id:"unregistered-device",level:2},{value:"Registered Device",id:"registered-device",level:2}];function p(e){const i={a:"a",admonition:"admonition",h1:"h1",h2:"h2",li:"li",p:"p",ul:"ul",...(0,s.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(i.h1,{id:"fetch-ios-device-udid",children:"Fetch iOS Device UDID"}),"\n","\n","\n",(0,n.jsxs)(i.ul,{children:["\n",(0,n.jsx)(i.li,{children:"List of installable applications based on UDID"}),"\n",(0,n.jsx)(i.li,{children:"Enable Apple Developer functionality to add unregistered test devices to the corresponding developer account"}),"\n"]}),"\n",(0,n.jsx)(i.h2,{id:"install-profile",children:"Install profile"}),"\n",(0,n.jsx)(i.admonition,{type:"info",children:(0,n.jsxs)(i.p,{children:["This feature is only valid for iOS devices. If opened on a computer,\nit will prompt you to ",(0,n.jsx)(i.a,{href:"https://support.apple.com/guide/iphone/scan-a-qr-code-iphe8bda8762/ios",children:"scan the QR code"})," with your phone."]})}),"\n",(0,n.jsx)(i.p,{children:'Regardless of the user login mode (including guest mode), you can install the profile by clicking on "\u83b7\u53d6\u8bbe\u5907 UDID" in the left sidebar menu to retrieve the UDID of the current iOS device.'}),"\n",(0,n.jsx)(i.p,{children:'Do not worry about the profile being displayed as "Unsigned". This does not affect the installation, and the profile is disposable and will be destroyed by the system after retrieval, so there is no security risk.'}),"\n",(0,n.jsx)(r.Z,{alt:"Install profile",sources:{light:(0,d.Z)("/img/zh-Hans/fetch-udid/install-profile-light.png"),dark:(0,d.Z)("/img/zh-Hans/fetch-udid/install-profile-dark.png")}}),"\n",(0,n.jsx)(i.p,{children:"After installing the profile, the browser will open a new page to display the device UDID. At this point, there will be two scenarios:"}),"\n",(0,n.jsxs)(i.ul,{children:["\n",(0,n.jsx)(i.li,{children:(0,n.jsx)(i.a,{href:"#unregistered-device",children:"Unregistered Device"})}),"\n",(0,n.jsx)(i.li,{children:(0,n.jsx)(i.a,{href:"#registered-device",children:"Registered Device"})}),"\n"]}),"\n",(0,n.jsx)(i.h2,{id:"unregistered-device",children:"Unregistered Device"}),"\n",(0,n.jsx)(i.p,{children:"For an unregistered device, basic device information is provided, including UDID, internal model, and serial number. If the service administrator has added Apple Developer, it will also display the registration of the test device to the corresponding developer account."}),"\n",(0,n.jsx)(i.admonition,{type:"tip",children:(0,n.jsx)(i.p,{children:"Registering to an Apple Developer account only means that the device is added under\nthe Devices section of the Apple Developer account. For iOS developers,\nyou still need to manually or script-automate adding the test device to the\ncorresponding Ad-Hoc certificate, then install and repackage it before\nallowing the device to install the application."})}),"\n",(0,n.jsx)(r.Z,{alt:"Unregistered Device",sources:{light:(0,d.Z)("/img/zh-Hans/fetch-udid/register-udid-light.png"),dark:(0,d.Z)("/img/zh-Hans/fetch-udid/register-udid-dark.png")}}),"\n",(0,n.jsx)(i.h2,{id:"registered-device",children:"Registered Device"}),"\n",(0,n.jsx)(i.p,{children:"For a registered test device, the list of installable applications will be displayed. If the service administrator has added Apple Developer, it will also display the registration of the test device to the corresponding developer account."}),"\n",(0,n.jsx)(r.Z,{alt:"Registered Device",sources:{light:(0,d.Z)("/img/zh-Hans/fetch-udid/registered-udid-light.png"),dark:(0,d.Z)("/img/zh-Hans/fetch-udid/registered-udid-dark.png")}})]})}function u(e={}){const{wrapper:i}={...(0,s.a)(),...e.components};return i?(0,n.jsx)(i,{...e,children:(0,n.jsx)(p,{...e})}):p(e)}},1151:(e,i,t)=>{t.d(i,{Z:()=>o,a:()=>d});var n=t(7294);const s={},r=n.createContext(s);function d(e){const i=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function o(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:d(e.components),n.createElement(r.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/e7bace76.ac0da248.js b/assets/js/e7bace76.ac0da248.js new file mode 100644 index 000000000..694ace6fe --- /dev/null +++ b/assets/js/e7bace76.ac0da248.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[8791],{3471:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>i,default:()=>h,frontMatter:()=>r,metadata:()=>l,toc:()=>d});var s=t(5893),o=t(1151);const r={sidebar_label:"On-premise (Docker)"},i="Deploy Zealot with Docker guide",l={id:"self-hosted/deployment/docker",title:"Deploy Zealot with Docker guide",description:"Strongly recommended to deploy Zealot using Docker,",source:"@site/versioned_docs/version-5.2.0/self-hosted/deployment/docker.md",sourceDirName:"self-hosted/deployment",slug:"/self-hosted/deployment/docker",permalink:"/docs/self-hosted/deployment/docker",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.2.0/self-hosted/deployment/docker.md",tags:[],version:"5.2.0",frontMatter:{sidebar_label:"On-premise (Docker)"},sidebar:"selfHosted",previous:{title:"Requirements",permalink:"/docs/self-hosted/deployment/requirements"},next:{title:"Step by step",permalink:"/docs/self-hosted/deployment/docker/step-by-step"}},c={},d=[{value:"Why support docker image only?",id:"why-support-docker-image-only",level:2},{value:"Software requirements",id:"software-requirements",level:2},{value:"Install on Docker",id:"install-on-docker",level:2},{value:"SSL",id:"ssl",level:2},{value:"Let's Encrypt",id:"lets-encrypt",level:3},{value:"Reverse proxy controls SSL",id:"reverse-proxy-controls-ssl",level:3},{value:"Self-signed untrust SSL",id:"self-signed-untrust-ssl",level:3}];function a(e){const n={a:"a",blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,o.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h1,{id:"deploy-zealot-with-docker-guide",children:"Deploy Zealot with Docker guide"}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsxs)(n.p,{children:["\ud83d\udd14"," Strongly recommended to deploy Zealot using ",(0,s.jsx)(n.a,{href:"https://www.docker.io/",children:"Docker"}),",\nunless you are familiar with the technology stack for this service.\nThe app protection policy settings for iOS/iPadOS devices, it needs a public network over SSL,\nfree to use ",(0,s.jsx)(n.a,{href:"https://letsencrypt.org/",children:"Let's Encrypt"}),"."]}),"\n",(0,s.jsxs)(n.p,{children:["If you use a self-signed certificate you must ",(0,s.jsx)(n.a,{href:"https://support.apple.com/en-us/HT204477",children:"install the self-signed certificate"}),"\non each iOS device before installing any app."]}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"why-support-docker-image-only",children:"Why support docker image only?"}),"\n",(0,s.jsx)(n.p,{children:"Deploying a Rails-based application is incredibly complex, and even though you must install many dependenices,\nand you still need to worry how to launch and make it as a daemon to run in the background."}),"\n",(0,s.jsx)(n.h2,{id:"software-requirements",children:"Software requirements"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Git 2.0+"}),"\n",(0,s.jsx)(n.li,{children:"Docker 20.10.0+"}),"\n",(0,s.jsx)(n.li,{children:"Docker Compose 1.28.0+"}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"install-on-docker",children:"Install on Docker"}),"\n",(0,s.jsxs)(n.p,{children:["In the principle of one-click installation, but reality is often harsh,\nZealot configuration is dependent on ",(0,s.jsx)(n.code,{children:"ENV"})," environment variables,\nyou need to configure it and then execute the one-click deployment generation script."]}),"\n",(0,s.jsxs)(n.p,{children:["First you need to clone the ",(0,s.jsx)(n.a,{href:"https://github.com/tryzealot/zealot-docker.git",children:"deployment script"}),",\nAfter entering the ",(0,s.jsx)(n.code,{children:"zealot-docker"})," directory, you need to open the ",(0,s.jsx)(n.code,{children:"example.env"})," file to\nconfigure the necessary parameters and then you can directly execute ",(0,s.jsx)(n.code,{children:"./deploy.sh"})," script."]}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsxs)(n.p,{children:["By default, the administrator account: ",(0,s.jsx)(n.code,{children:"admin@zealot.com"})," and password ",(0,s.jsx)(n.code,{children:"ze@l0t"})," (you can change it)\nand some demo applications will be generated."]}),"\n"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"$ git clone https://github.com/tryzealot/zealot-docker.git\n$ cd zealot-docker\n$ ./deploy\n"})}),"\n",(0,s.jsx)(n.p,{children:"The one-click deployment generation script has three built-in templates by default:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Using Let's Encrypt SSL"}),"\n",(0,s.jsx)(n.li,{children:"Using Self-signed SSL"}),"\n",(0,s.jsx)(n.li,{children:"Using non-SSL (needs gateway or reverse proxy to manage SSL\uff09"}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["For those interested in one-click installation deployment scripts,\nyou can check out the ",(0,s.jsx)(n.a,{href:"/docs/self-hosted/deployment/docker/step-by-step",children:"Deployment Documentation with Docker"}),"."]}),"\n",(0,s.jsx)(n.h2,{id:"ssl",children:"SSL"}),"\n",(0,s.jsx)(n.h3,{id:"lets-encrypt",children:"Let's Encrypt"}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Best Choice"})}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Step 1"}),": Execute the deployment script:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"$ ./deploy\n"})}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Step 2"}),": Check and configure the ",(0,s.jsx)(n.code,{children:".env"})," file, mainly whether ",(0,s.jsx)(n.code,{children:"ZEALOT_DOMAIN"})," and ",(0,s.jsx)(n.code,{children:"ZEALOT_CERT_EMAIL"})," are filled in correctly.\nOther parts can be adjusted according to the actual situation of the corresponding configuration"]}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Step 3"}),": Run the Zealot service:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"$ docker-compose up -d\n"})}),"\n",(0,s.jsx)(n.h3,{id:"reverse-proxy-controls-ssl",children:"Reverse proxy controls SSL"}),"\n",(0,s.jsxs)(n.p,{children:["Check ",(0,s.jsx)(n.a,{href:"/docs/self-hosted/reverse-proxies",children:"Reverse Proxies Guide"})," page."]}),"\n",(0,s.jsx)(n.h3,{id:"self-signed-untrust-ssl",children:"Self-signed untrust SSL"}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Not recommended"})}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["Please do not use this for non-essential cases, for iOS using self-signed certificates\n",(0,s.jsx)(n.strong,{children:"may require the device to also have an SSL certificate installed before accessing and installing the application"}),",\nand Chrome may also deny access due to the certificate."]}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsxs)(n.p,{children:["If the domain name is unregistered, you need to tie the host to access it,\nusually by modifying the system's ",(0,s.jsx)(n.code,{children:"/etc/hosts"})," file."]}),"\n"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",metastring:'title="/etc/hosts"',children:"$ sudo vim /etc/hosts\n\n# highlight-start\n127.0.0.1 zealot.test\n# highlight-end\n"})})]})}function h(e={}){const{wrapper:n}={...(0,o.a)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(a,{...e})}):a(e)}},1151:(e,n,t)=>{t.d(n,{Z:()=>l,a:()=>i});var s=t(7294);const o={},r=s.createContext(o);function i(e){const n=s.useContext(r);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:i(e.components),s.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/c23a205f.f6c40a8b.js b/assets/js/ed7ff2b3.5ceaee4c.js similarity index 90% rename from assets/js/c23a205f.f6c40a8b.js rename to assets/js/ed7ff2b3.5ceaee4c.js index d7acbb6b9..e72abda3e 100644 --- a/assets/js/c23a205f.f6c40a8b.js +++ b/assets/js/ed7ff2b3.5ceaee4c.js @@ -1 +1 @@ -"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[4019],{4462:(e,o,t)=>{t.r(o),t.d(o,{assets:()=>r,contentTitle:()=>s,default:()=>p,frontMatter:()=>a,metadata:()=>i,toc:()=>d});var l=t(5893),n=t(1151);const a={sidebar_label:"Railway"},s="Deploy Zealot to Railway guide",i={id:"self-hosted/deployment/railway",title:"Deploy Zealot to Railway guide",description:"Zealot support use Dockfile to deploy on Railway.",source:"@site/versioned_docs/version-5.1.0/self-hosted/deployment/railway.md",sourceDirName:"self-hosted/deployment",slug:"/self-hosted/deployment/railway",permalink:"/docs/self-hosted/deployment/railway",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.1.0/self-hosted/deployment/railway.md",tags:[],version:"5.1.0",frontMatter:{sidebar_label:"Railway"},sidebar:"selfHosted",previous:{title:"Fly",permalink:"/docs/self-hosted/deployment/fly"},next:{title:"Render",permalink:"/docs/self-hosted/deployment/render"}},r={},d=[{value:"Deploying on Railway",id:"deploying-on-railway",level:2}];function c(e){const o={a:"a",code:"code",h1:"h1",h2:"h2",li:"li",p:"p",ul:"ul",...(0,n.a)(),...e.components};return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(o.h1,{id:"deploy-zealot-to-railway-guide",children:"Deploy Zealot to Railway guide"}),"\n",(0,l.jsxs)(o.p,{children:["Zealot support use ",(0,l.jsx)(o.code,{children:"Dockfile"})," to deploy on ",(0,l.jsx)(o.a,{href:"https://railway.app/",children:"Railway"}),"."]}),"\n",(0,l.jsx)(o.h2,{id:"deploying-on-railway",children:"Deploying on Railway"}),"\n",(0,l.jsxs)(o.ul,{children:["\n",(0,l.jsxs)(o.li,{children:["Fork ",(0,l.jsx)(o.a,{href:"https://github.com/tryzealot/zealot/fork",children:"Zealot"})," project to your Github account."]}),"\n",(0,l.jsxs)(o.li,{children:["Create ",(0,l.jsx)(o.a,{href:"https://railway.app/new",children:"New Project"}),' with "deploy from Github repo".']}),"\n",(0,l.jsxs)(o.li,{children:["Add ",(0,l.jsx)(o.a,{href:"/docs/self-hosted/configuration/environment-variables",children:"Enviroment"})," to Variables page."]}),"\n"]})]})}function p(e={}){const{wrapper:o}={...(0,n.a)(),...e.components};return o?(0,l.jsx)(o,{...e,children:(0,l.jsx)(c,{...e})}):c(e)}},1151:(e,o,t)=>{t.d(o,{Z:()=>i,a:()=>s});var l=t(7294);const n={},a=l.createContext(n);function s(e){const o=l.useContext(a);return l.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function i(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:s(e.components),l.createElement(a.Provider,{value:o},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[5846],{2558:(e,o,t)=>{t.r(o),t.d(o,{assets:()=>r,contentTitle:()=>s,default:()=>p,frontMatter:()=>a,metadata:()=>i,toc:()=>d});var l=t(5893),n=t(1151);const a={sidebar_label:"Railway"},s="Deploy Zealot to Railway guide",i={id:"self-hosted/deployment/railway",title:"Deploy Zealot to Railway guide",description:"Zealot support use Dockfile to deploy on Railway.",source:"@site/versioned_docs/version-5.2.0/self-hosted/deployment/railway.md",sourceDirName:"self-hosted/deployment",slug:"/self-hosted/deployment/railway",permalink:"/docs/self-hosted/deployment/railway",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.2.0/self-hosted/deployment/railway.md",tags:[],version:"5.2.0",frontMatter:{sidebar_label:"Railway"},sidebar:"selfHosted",previous:{title:"Fly",permalink:"/docs/self-hosted/deployment/fly"},next:{title:"Render",permalink:"/docs/self-hosted/deployment/render"}},r={},d=[{value:"Deploying on Railway",id:"deploying-on-railway",level:2}];function c(e){const o={a:"a",code:"code",h1:"h1",h2:"h2",li:"li",p:"p",ul:"ul",...(0,n.a)(),...e.components};return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(o.h1,{id:"deploy-zealot-to-railway-guide",children:"Deploy Zealot to Railway guide"}),"\n",(0,l.jsxs)(o.p,{children:["Zealot support use ",(0,l.jsx)(o.code,{children:"Dockfile"})," to deploy on ",(0,l.jsx)(o.a,{href:"https://railway.app/",children:"Railway"}),"."]}),"\n",(0,l.jsx)(o.h2,{id:"deploying-on-railway",children:"Deploying on Railway"}),"\n",(0,l.jsxs)(o.ul,{children:["\n",(0,l.jsxs)(o.li,{children:["Fork ",(0,l.jsx)(o.a,{href:"https://github.com/tryzealot/zealot/fork",children:"Zealot"})," project to your Github account."]}),"\n",(0,l.jsxs)(o.li,{children:["Create ",(0,l.jsx)(o.a,{href:"https://railway.app/new",children:"New Project"}),' with "deploy from Github repo".']}),"\n",(0,l.jsxs)(o.li,{children:["Add ",(0,l.jsx)(o.a,{href:"/docs/self-hosted/configuration/environment-variables",children:"Enviroment"})," to Variables page."]}),"\n"]})]})}function p(e={}){const{wrapper:o}={...(0,n.a)(),...e.components};return o?(0,l.jsx)(o,{...e,children:(0,l.jsx)(c,{...e})}):c(e)}},1151:(e,o,t)=>{t.d(o,{Z:()=>i,a:()=>s});var l=t(7294);const n={},a=l.createContext(n);function s(e){const o=l.useContext(a);return l.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function i(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:s(e.components),l.createElement(a.Provider,{value:o},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/77fdf6b1.ba675c62.js b/assets/js/ef7c3aa9.4c70e307.js similarity index 97% rename from assets/js/77fdf6b1.ba675c62.js rename to assets/js/ef7c3aa9.4c70e307.js index feb077230..12dd14bb8 100644 --- a/assets/js/77fdf6b1.ba675c62.js +++ b/assets/js/ef7c3aa9.4c70e307.js @@ -1 +1 @@ -"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[8479],{3621:(s,e,d)=>{d.r(e),d.d(e,{assets:()=>c,contentTitle:()=>t,default:()=>h,frontMatter:()=>n,metadata:()=>l,toc:()=>x});var r=d(5893),i=d(1151);const n={sidebar_label:"Permissions"},t="User Permissions and roles",l={id:"user-guide/administrator/permissions",title:"User Permissions and roles",description:"Zealot offers four types of user permissions.",source:"@site/versioned_docs/version-5.1.0/user-guide/administrator/permissions.md",sourceDirName:"user-guide/administrator",slug:"/user-guide/administrator/permissions",permalink:"/docs/user-guide/administrator/permissions",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.1.0/user-guide/administrator/permissions.md",tags:[],version:"5.1.0",frontMatter:{sidebar_label:"Permissions"},sidebar:"userGuide",previous:{title:"Apple Team",permalink:"/docs/user-guide/administrator/apple-team"},next:{title:"Backup",permalink:"/docs/user-guide/administrator/backup"}},c={},x=[{value:"Comparison",id:"comparison",level:2}];function j(s){const e={code:"code",h1:"h1",h2:"h2",li:"li",p:"p",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,i.a)(),...s.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(e.h1,{id:"user-permissions-and-roles",children:"User Permissions and roles"}),"\n",(0,r.jsx)(e.p,{children:"Zealot offers four types of user permissions."}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsx)(e.li,{children:"Guest"}),"\n",(0,r.jsx)(e.li,{children:"User"}),"\n",(0,r.jsx)(e.li,{children:"Developer"}),"\n",(0,r.jsx)(e.li,{children:"Administrator"}),"\n"]}),"\n",(0,r.jsx)(e.h2,{id:"comparison",children:"Comparison"}),"\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"Action"}),(0,r.jsx)(e.th,{children:"Guest[On/Off]"}),(0,r.jsx)(e.th,{children:"User"}),(0,r.jsx)(e.th,{children:"Developer"}),(0,r.jsx)(e.th,{children:"Administrator"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsxs)(e.td,{children:[(0,r.jsx)(e.code,{children:"Dashboard"}),(0,r.jsx)("br",{}),"View all data"]}),(0,r.jsx)(e.td,{children:"\u2713/\u2715"}),(0,r.jsx)(e.td,{children:"\u2713"}),(0,r.jsx)(e.td,{children:"\u2713"}),(0,r.jsx)(e.td,{children:"\u2713"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsxs)(e.td,{children:[(0,r.jsx)(e.code,{children:"App"}),(0,r.jsx)("br",{}),"View app list"]}),(0,r.jsx)(e.td,{children:"\u2713/\u2715"}),(0,r.jsx)(e.td,{children:"\u2713"}),(0,r.jsx)(e.td,{children:"\u2713"}),(0,r.jsx)(e.td,{children:"\u2713"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsxs)(e.td,{children:[(0,r.jsx)(e.code,{children:"App"}),(0,r.jsx)("br",{}),"View app scheme(s) and channel(s) detail"]}),(0,r.jsx)(e.td,{children:"\u2713/\u2715"}),(0,r.jsx)(e.td,{children:"\u2713"}),(0,r.jsx)(e.td,{children:"\u2713"}),(0,r.jsx)(e.td,{children:"\u2713"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsxs)(e.td,{children:[(0,r.jsx)(e.code,{children:"App"}),(0,r.jsx)("br",{}),"View the build(release) of app"]}),(0,r.jsxs)(e.td,{children:["\u2713/\u2713 ",(0,r.jsx)("br",{}),"Password Auth"]}),(0,r.jsx)(e.td,{children:"\u2713"}),(0,r.jsx)(e.td,{children:"\u2713"}),(0,r.jsx)(e.td,{children:"\u2713"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsxs)(e.td,{children:[(0,r.jsx)(e.code,{children:"App"}),(0,r.jsx)("br",{}),"View webhook list"]}),(0,r.jsx)(e.td,{children:"\u2713/\u2715"}),(0,r.jsx)(e.td,{children:"\u2713"}),(0,r.jsx)(e.td,{children:"\u2713"}),(0,r.jsx)(e.td,{children:"\u2713"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsxs)(e.td,{children:[(0,r.jsx)(e.code,{children:"App"}),(0,r.jsx)("br",{}),"Upload/Install/Download app"]}),(0,r.jsx)(e.td,{children:"\u2713"}),(0,r.jsx)(e.td,{children:"\u2713"}),(0,r.jsx)(e.td,{children:"\u2713"}),(0,r.jsx)(e.td,{children:"\u2713"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsxs)(e.td,{children:[(0,r.jsx)(e.code,{children:"App"}),(0,r.jsx)("br",{}),"Create/Edit/Delete an app"]}),(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{children:"\u2713"}),(0,r.jsx)(e.td,{children:"\u2713"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsxs)(e.td,{children:[(0,r.jsx)(e.code,{children:"App"}),(0,r.jsx)("br",{}),"Create/Edit/Delete a scheme/channel of app"]}),(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{children:"\u2713"}),(0,r.jsx)(e.td,{children:"\u2713"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsxs)(e.td,{children:[(0,r.jsx)(e.code,{children:"App"}),(0,r.jsx)("br",{}),"Delete a given version of app"]}),(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{children:"\u2713"}),(0,r.jsx)(e.td,{children:"\u2713"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsxs)(e.td,{children:[(0,r.jsx)(e.code,{children:"App"}),(0,r.jsx)("br",{}),"Test a webhook network connection"]}),(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{children:"\u2713"}),(0,r.jsx)(e.td,{children:"\u2713"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsxs)(e.td,{children:[(0,r.jsx)(e.code,{children:"App"}),(0,r.jsx)("br",{}),"Enable/Disable webhook"]}),(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{children:"\u2713"}),(0,r.jsx)(e.td,{children:"\u2713"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsxs)(e.td,{children:[(0,r.jsx)(e.code,{children:"App"}),(0,r.jsx)("br",{}),"Delete an app"]}),(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{children:"\u2713"}),(0,r.jsx)(e.td,{children:"\u2713"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsxs)(e.td,{children:[(0,r.jsx)(e.code,{children:"DebugFile"}),(0,r.jsx)("br",{}),"View debug file list"]}),(0,r.jsx)(e.td,{children:"\u2713/\u2715"}),(0,r.jsx)(e.td,{children:"\u2713"}),(0,r.jsx)(e.td,{children:"\u2713"}),(0,r.jsx)(e.td,{children:"\u2713"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsxs)(e.td,{children:[(0,r.jsx)(e.code,{children:"DebugFile"}),(0,r.jsx)("br",{}),"View debug file detail"]}),(0,r.jsx)(e.td,{children:"\u2713"}),(0,r.jsx)(e.td,{children:"\u2713"}),(0,r.jsx)(e.td,{children:"\u2713"}),(0,r.jsx)(e.td,{children:"\u2713"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsxs)(e.td,{children:[(0,r.jsx)(e.code,{children:"DebugFile"}),(0,r.jsx)("br",{}),"Download debug file"]}),(0,r.jsx)(e.td,{children:"\u2713"}),(0,r.jsx)(e.td,{children:"\u2713"}),(0,r.jsx)(e.td,{children:"\u2713"}),(0,r.jsx)(e.td,{children:"\u2713"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsxs)(e.td,{children:[(0,r.jsx)(e.code,{children:"DebugFile"}),(0,r.jsx)("br",{}),"Upload/Delete a debug file"]}),(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{children:"\u2713"}),(0,r.jsx)(e.td,{children:"\u2713"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsxs)(e.td,{children:[(0,r.jsx)(e.code,{children:"Teardown"}),(0,r.jsx)("br",{}),"View teardown list"]}),(0,r.jsx)(e.td,{children:"\u2713/\u2715"}),(0,r.jsx)(e.td,{children:"\u2713"}),(0,r.jsx)(e.td,{children:"\u2713"}),(0,r.jsx)(e.td,{children:"\u2713"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsxs)(e.td,{children:[(0,r.jsx)(e.code,{children:"Teardown"}),(0,r.jsx)("br",{}),"View teardown detail"]}),(0,r.jsx)(e.td,{children:"\u2713/\u2715"}),(0,r.jsx)(e.td,{children:"\u2713"}),(0,r.jsx)(e.td,{children:"\u2713"}),(0,r.jsx)(e.td,{children:"\u2713"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsxs)(e.td,{children:[(0,r.jsx)(e.code,{children:"Teardown"}),(0,r.jsx)("br",{}),"Delete a teardown"]}),(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{children:"\u2713"}),(0,r.jsx)(e.td,{children:"\u2713"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsxs)(e.td,{children:[(0,r.jsx)(e.code,{children:"Admin"}),(0,r.jsx)("br",{}),"View and manage users"]}),(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{children:"\u2713"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsxs)(e.td,{children:[(0,r.jsx)(e.code,{children:"Admin"}),(0,r.jsx)("br",{}),"View and manage webhooks"]}),(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{children:"\u2713"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsxs)(e.td,{children:[(0,r.jsx)(e.code,{children:"Admin"}),(0,r.jsx)("br",{}),"View and manage settings"]}),(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{children:"\u2713"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsxs)(e.td,{children:[(0,r.jsx)(e.code,{children:"Admin"}),(0,r.jsx)("br",{}),"View system informations"]}),(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{children:"\u2713"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsxs)(e.td,{children:[(0,r.jsx)(e.code,{children:"Admin"}),(0,r.jsx)("br",{}),"View and manage background jobs"]}),(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{children:"\u2713"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsxs)(e.td,{children:[(0,r.jsx)(e.code,{children:"Admin"}),(0,r.jsx)("br",{}),"View page analytices"]}),(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{children:"\u2713"})]})]})]})]})}function h(s={}){const{wrapper:e}={...(0,i.a)(),...s.components};return e?(0,r.jsx)(e,{...s,children:(0,r.jsx)(j,{...s})}):j(s)}},1151:(s,e,d)=>{d.d(e,{Z:()=>l,a:()=>t});var r=d(7294);const i={},n=r.createContext(i);function t(s){const e=r.useContext(n);return r.useMemo((function(){return"function"==typeof s?s(e):{...e,...s}}),[e,s])}function l(s){let e;return e=s.disableParentContext?"function"==typeof s.components?s.components(i):s.components||i:t(s.components),r.createElement(n.Provider,{value:e},s.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[4710],{6538:(s,e,d)=>{d.r(e),d.d(e,{assets:()=>c,contentTitle:()=>t,default:()=>h,frontMatter:()=>n,metadata:()=>l,toc:()=>x});var r=d(5893),i=d(1151);const n={sidebar_label:"Permissions"},t="User Permissions and roles",l={id:"user-guide/administrator/permissions",title:"User Permissions and roles",description:"Zealot offers four types of user permissions.",source:"@site/versioned_docs/version-5.2.0/user-guide/administrator/permissions.md",sourceDirName:"user-guide/administrator",slug:"/user-guide/administrator/permissions",permalink:"/docs/user-guide/administrator/permissions",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.2.0/user-guide/administrator/permissions.md",tags:[],version:"5.2.0",frontMatter:{sidebar_label:"Permissions"},sidebar:"userGuide",previous:{title:"Apple Team",permalink:"/docs/user-guide/administrator/apple-team"},next:{title:"Backup",permalink:"/docs/user-guide/administrator/backup"}},c={},x=[{value:"Comparison",id:"comparison",level:2}];function j(s){const e={code:"code",h1:"h1",h2:"h2",li:"li",p:"p",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,i.a)(),...s.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(e.h1,{id:"user-permissions-and-roles",children:"User Permissions and roles"}),"\n",(0,r.jsx)(e.p,{children:"Zealot offers four types of user permissions."}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsx)(e.li,{children:"Guest"}),"\n",(0,r.jsx)(e.li,{children:"User"}),"\n",(0,r.jsx)(e.li,{children:"Developer"}),"\n",(0,r.jsx)(e.li,{children:"Administrator"}),"\n"]}),"\n",(0,r.jsx)(e.h2,{id:"comparison",children:"Comparison"}),"\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"Action"}),(0,r.jsx)(e.th,{children:"Guest[On/Off]"}),(0,r.jsx)(e.th,{children:"User"}),(0,r.jsx)(e.th,{children:"Developer"}),(0,r.jsx)(e.th,{children:"Administrator"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsxs)(e.td,{children:[(0,r.jsx)(e.code,{children:"Dashboard"}),(0,r.jsx)("br",{}),"View all data"]}),(0,r.jsx)(e.td,{children:"\u2713/\u2715"}),(0,r.jsx)(e.td,{children:"\u2713"}),(0,r.jsx)(e.td,{children:"\u2713"}),(0,r.jsx)(e.td,{children:"\u2713"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsxs)(e.td,{children:[(0,r.jsx)(e.code,{children:"App"}),(0,r.jsx)("br",{}),"View app list"]}),(0,r.jsx)(e.td,{children:"\u2713/\u2715"}),(0,r.jsx)(e.td,{children:"\u2713"}),(0,r.jsx)(e.td,{children:"\u2713"}),(0,r.jsx)(e.td,{children:"\u2713"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsxs)(e.td,{children:[(0,r.jsx)(e.code,{children:"App"}),(0,r.jsx)("br",{}),"View app scheme(s) and channel(s) detail"]}),(0,r.jsx)(e.td,{children:"\u2713/\u2715"}),(0,r.jsx)(e.td,{children:"\u2713"}),(0,r.jsx)(e.td,{children:"\u2713"}),(0,r.jsx)(e.td,{children:"\u2713"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsxs)(e.td,{children:[(0,r.jsx)(e.code,{children:"App"}),(0,r.jsx)("br",{}),"View the build(release) of app"]}),(0,r.jsxs)(e.td,{children:["\u2713/\u2713 ",(0,r.jsx)("br",{}),"Password Auth"]}),(0,r.jsx)(e.td,{children:"\u2713"}),(0,r.jsx)(e.td,{children:"\u2713"}),(0,r.jsx)(e.td,{children:"\u2713"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsxs)(e.td,{children:[(0,r.jsx)(e.code,{children:"App"}),(0,r.jsx)("br",{}),"View webhook list"]}),(0,r.jsx)(e.td,{children:"\u2713/\u2715"}),(0,r.jsx)(e.td,{children:"\u2713"}),(0,r.jsx)(e.td,{children:"\u2713"}),(0,r.jsx)(e.td,{children:"\u2713"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsxs)(e.td,{children:[(0,r.jsx)(e.code,{children:"App"}),(0,r.jsx)("br",{}),"Upload/Install/Download app"]}),(0,r.jsx)(e.td,{children:"\u2713"}),(0,r.jsx)(e.td,{children:"\u2713"}),(0,r.jsx)(e.td,{children:"\u2713"}),(0,r.jsx)(e.td,{children:"\u2713"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsxs)(e.td,{children:[(0,r.jsx)(e.code,{children:"App"}),(0,r.jsx)("br",{}),"Create/Edit/Delete an app"]}),(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{children:"\u2713"}),(0,r.jsx)(e.td,{children:"\u2713"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsxs)(e.td,{children:[(0,r.jsx)(e.code,{children:"App"}),(0,r.jsx)("br",{}),"Create/Edit/Delete a scheme/channel of app"]}),(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{children:"\u2713"}),(0,r.jsx)(e.td,{children:"\u2713"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsxs)(e.td,{children:[(0,r.jsx)(e.code,{children:"App"}),(0,r.jsx)("br",{}),"Delete a given version of app"]}),(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{children:"\u2713"}),(0,r.jsx)(e.td,{children:"\u2713"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsxs)(e.td,{children:[(0,r.jsx)(e.code,{children:"App"}),(0,r.jsx)("br",{}),"Test a webhook network connection"]}),(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{children:"\u2713"}),(0,r.jsx)(e.td,{children:"\u2713"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsxs)(e.td,{children:[(0,r.jsx)(e.code,{children:"App"}),(0,r.jsx)("br",{}),"Enable/Disable webhook"]}),(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{children:"\u2713"}),(0,r.jsx)(e.td,{children:"\u2713"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsxs)(e.td,{children:[(0,r.jsx)(e.code,{children:"App"}),(0,r.jsx)("br",{}),"Delete an app"]}),(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{children:"\u2713"}),(0,r.jsx)(e.td,{children:"\u2713"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsxs)(e.td,{children:[(0,r.jsx)(e.code,{children:"DebugFile"}),(0,r.jsx)("br",{}),"View debug file list"]}),(0,r.jsx)(e.td,{children:"\u2713/\u2715"}),(0,r.jsx)(e.td,{children:"\u2713"}),(0,r.jsx)(e.td,{children:"\u2713"}),(0,r.jsx)(e.td,{children:"\u2713"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsxs)(e.td,{children:[(0,r.jsx)(e.code,{children:"DebugFile"}),(0,r.jsx)("br",{}),"View debug file detail"]}),(0,r.jsx)(e.td,{children:"\u2713"}),(0,r.jsx)(e.td,{children:"\u2713"}),(0,r.jsx)(e.td,{children:"\u2713"}),(0,r.jsx)(e.td,{children:"\u2713"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsxs)(e.td,{children:[(0,r.jsx)(e.code,{children:"DebugFile"}),(0,r.jsx)("br",{}),"Download debug file"]}),(0,r.jsx)(e.td,{children:"\u2713"}),(0,r.jsx)(e.td,{children:"\u2713"}),(0,r.jsx)(e.td,{children:"\u2713"}),(0,r.jsx)(e.td,{children:"\u2713"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsxs)(e.td,{children:[(0,r.jsx)(e.code,{children:"DebugFile"}),(0,r.jsx)("br",{}),"Upload/Delete a debug file"]}),(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{children:"\u2713"}),(0,r.jsx)(e.td,{children:"\u2713"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsxs)(e.td,{children:[(0,r.jsx)(e.code,{children:"Teardown"}),(0,r.jsx)("br",{}),"View teardown list"]}),(0,r.jsx)(e.td,{children:"\u2713/\u2715"}),(0,r.jsx)(e.td,{children:"\u2713"}),(0,r.jsx)(e.td,{children:"\u2713"}),(0,r.jsx)(e.td,{children:"\u2713"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsxs)(e.td,{children:[(0,r.jsx)(e.code,{children:"Teardown"}),(0,r.jsx)("br",{}),"View teardown detail"]}),(0,r.jsx)(e.td,{children:"\u2713/\u2715"}),(0,r.jsx)(e.td,{children:"\u2713"}),(0,r.jsx)(e.td,{children:"\u2713"}),(0,r.jsx)(e.td,{children:"\u2713"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsxs)(e.td,{children:[(0,r.jsx)(e.code,{children:"Teardown"}),(0,r.jsx)("br",{}),"Delete a teardown"]}),(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{children:"\u2713"}),(0,r.jsx)(e.td,{children:"\u2713"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsxs)(e.td,{children:[(0,r.jsx)(e.code,{children:"Admin"}),(0,r.jsx)("br",{}),"View and manage users"]}),(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{children:"\u2713"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsxs)(e.td,{children:[(0,r.jsx)(e.code,{children:"Admin"}),(0,r.jsx)("br",{}),"View and manage webhooks"]}),(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{children:"\u2713"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsxs)(e.td,{children:[(0,r.jsx)(e.code,{children:"Admin"}),(0,r.jsx)("br",{}),"View and manage settings"]}),(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{children:"\u2713"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsxs)(e.td,{children:[(0,r.jsx)(e.code,{children:"Admin"}),(0,r.jsx)("br",{}),"View system informations"]}),(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{children:"\u2713"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsxs)(e.td,{children:[(0,r.jsx)(e.code,{children:"Admin"}),(0,r.jsx)("br",{}),"View and manage background jobs"]}),(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{children:"\u2713"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsxs)(e.td,{children:[(0,r.jsx)(e.code,{children:"Admin"}),(0,r.jsx)("br",{}),"View page analytices"]}),(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{children:"\u2713"})]})]})]})]})}function h(s={}){const{wrapper:e}={...(0,i.a)(),...s.components};return e?(0,r.jsx)(e,{...s,children:(0,r.jsx)(j,{...s})}):j(s)}},1151:(s,e,d)=>{d.d(e,{Z:()=>l,a:()=>t});var r=d(7294);const i={},n=r.createContext(i);function t(s){const e=r.useContext(n);return r.useMemo((function(){return"function"==typeof s?s(e):{...e,...s}}),[e,s])}function l(s){let e;return e=s.disableParentContext?"function"==typeof s.components?s.components(i):s.components||i:t(s.components),r.createElement(n.Provider,{value:e},s.children)}}}]); \ No newline at end of file diff --git a/assets/js/f1b0b6d8.9b700227.js b/assets/js/f1b0b6d8.9b700227.js new file mode 100644 index 000000000..93f97a044 --- /dev/null +++ b/assets/js/f1b0b6d8.9b700227.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[8486],{3158:e=>{e.exports=JSON.parse('{"title":"Toolkits","slug":"/category/toolkits","permalink":"/docs/5.1.0/category/toolkits","navigation":{"previous":{"title":"Create a Debug File","permalink":"/docs/5.1.0/user-guide/debug-files/upload"},"next":{"title":"Teardown App","permalink":"/docs/5.1.0/user-guide/toolkits/teardown"}}}')}}]); \ No newline at end of file diff --git a/assets/js/f1c75242.bfae13f5.js b/assets/js/f1c75242.bfae13f5.js new file mode 100644 index 000000000..937c95793 --- /dev/null +++ b/assets/js/f1c75242.bfae13f5.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[2996],{8279:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>i,contentTitle:()=>d,default:()=>p,frontMatter:()=>o,metadata:()=>a,toc:()=>c});var n=s(5893),r=s(1151);const o={},d="Dashboard",a={id:"user-guide/dashboard",title:"Dashboard",description:"screenshot",source:"@site/versioned_docs/version-5.1.0/user-guide/dashboard.md",sourceDirName:"user-guide",slug:"/user-guide/dashboard",permalink:"/docs/5.1.0/user-guide/dashboard",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.1.0/user-guide/dashboard.md",tags:[],version:"5.1.0",frontMatter:{},sidebar:"userGuide",previous:{title:"User Guide",permalink:"/docs/5.1.0/user-guide/"},next:{title:"Apps",permalink:"/docs/5.1.0/category/apps"}},i={},c=[];function u(e){const t={h1:"h1",img:"img",p:"p",...(0,r.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.h1,{id:"dashboard",children:"Dashboard"}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"screenshot",src:s(8274).Z+"",width:"3810",height:"1888"})})]})}function p(e={}){const{wrapper:t}={...(0,r.a)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(u,{...e})}):u(e)}},8274:(e,t,s)=>{s.d(t,{Z:()=>n});const n=s.p+"assets/images/product-1-eb47ed676cf6c477c00746db04f98639.png"},1151:(e,t,s)=>{s.d(t,{Z:()=>a,a:()=>d});var n=s(7294);const r={},o=n.createContext(r);function d(e){const t=n.useContext(o);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:d(e.components),n.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/f1c75242.bb5976a3.js b/assets/js/f2e43f85.46dfef27.js similarity index 85% rename from assets/js/f1c75242.bb5976a3.js rename to assets/js/f2e43f85.46dfef27.js index abf27573f..3503300c2 100644 --- a/assets/js/f1c75242.bb5976a3.js +++ b/assets/js/f2e43f85.46dfef27.js @@ -1 +1 @@ -"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[2996],{8279:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>i,contentTitle:()=>d,default:()=>p,frontMatter:()=>o,metadata:()=>a,toc:()=>c});var n=s(5893),r=s(1151);const o={},d="Dashboard",a={id:"user-guide/dashboard",title:"Dashboard",description:"screenshot",source:"@site/versioned_docs/version-5.1.0/user-guide/dashboard.md",sourceDirName:"user-guide",slug:"/user-guide/dashboard",permalink:"/docs/user-guide/dashboard",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.1.0/user-guide/dashboard.md",tags:[],version:"5.1.0",frontMatter:{},sidebar:"userGuide",previous:{title:"User Guide",permalink:"/docs/user-guide/"},next:{title:"Apps",permalink:"/docs/category/apps"}},i={},c=[];function u(e){const t={h1:"h1",img:"img",p:"p",...(0,r.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.h1,{id:"dashboard",children:"Dashboard"}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"screenshot",src:s(8274).Z+"",width:"3810",height:"1888"})})]})}function p(e={}){const{wrapper:t}={...(0,r.a)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(u,{...e})}):u(e)}},8274:(e,t,s)=>{s.d(t,{Z:()=>n});const n=s.p+"assets/images/product-1-eb47ed676cf6c477c00746db04f98639.png"},1151:(e,t,s)=>{s.d(t,{Z:()=>a,a:()=>d});var n=s(7294);const r={},o=n.createContext(r);function d(e){const t=n.useContext(o);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:d(e.components),n.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[9588],{1209:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>i,contentTitle:()=>d,default:()=>p,frontMatter:()=>o,metadata:()=>a,toc:()=>c});var n=s(5893),r=s(1151);const o={},d="Dashboard",a={id:"user-guide/dashboard",title:"Dashboard",description:"screenshot",source:"@site/versioned_docs/version-5.2.0/user-guide/dashboard.md",sourceDirName:"user-guide",slug:"/user-guide/dashboard",permalink:"/docs/user-guide/dashboard",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.2.0/user-guide/dashboard.md",tags:[],version:"5.2.0",frontMatter:{},sidebar:"userGuide",previous:{title:"User Guide",permalink:"/docs/user-guide/"},next:{title:"Apps",permalink:"/docs/category/apps"}},i={},c=[];function u(e){const t={h1:"h1",img:"img",p:"p",...(0,r.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.h1,{id:"dashboard",children:"Dashboard"}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"screenshot",src:s(8274).Z+"",width:"3810",height:"1888"})})]})}function p(e={}){const{wrapper:t}={...(0,r.a)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(u,{...e})}):u(e)}},8274:(e,t,s)=>{s.d(t,{Z:()=>n});const n=s.p+"assets/images/product-1-eb47ed676cf6c477c00746db04f98639.png"},1151:(e,t,s)=>{s.d(t,{Z:()=>a,a:()=>d});var n=s(7294);const r={},o=n.createContext(r);function d(e){const t=n.useContext(o);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:d(e.components),n.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/f55eae9a.766e532e.js b/assets/js/f55eae9a.766e532e.js new file mode 100644 index 000000000..0ae2b5d1e --- /dev/null +++ b/assets/js/f55eae9a.766e532e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[9166],{3544:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>i,default:()=>h,frontMatter:()=>o,metadata:()=>u,toc:()=>d});var a=t(5893),r=t(1151),l=t(4866),s=t(5162);const o={sidebar_label:"Android"},i="Zealot Android SDK",u={id:"developer-guide/sdk/android",title:"Zealot Android SDK",description:"The Android component provides a service to check for new versions and installations for Zealot, supporting both Kotlin and Java.",source:"@site/versioned_docs/version-5.1.0/developer-guide/sdk/android.md",sourceDirName:"developer-guide/sdk",slug:"/developer-guide/sdk/android",permalink:"/docs/5.1.0/developer-guide/sdk/android",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.1.0/developer-guide/sdk/android.md",tags:[],version:"5.1.0",frontMatter:{sidebar_label:"Android"},sidebar:"developerGuide",previous:{title:"iOS",permalink:"/docs/5.1.0/developer-guide/sdk/ios"},next:{title:"Fastlane plugins",permalink:"/docs/5.1.0/developer-guide/fastlane"}},c={},d=[{value:"Install",id:"install",level:2},{value:"JitPack",id:"jitpack",level:3},{value:"Permission",id:"permission",level:2},{value:"Usages",id:"usages",level:2}];function p(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",p:"p",pre:"pre",...(0,r.a)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(n.h1,{id:"zealot-android-sdk",children:"Zealot Android SDK"}),"\n",(0,a.jsx)(n.p,{children:"The Android component provides a service to check for new versions and installations for Zealot, supporting both Kotlin and Java."}),"\n",(0,a.jsx)(n.h2,{id:"install",children:"Install"}),"\n",(0,a.jsx)(n.h3,{id:"jitpack",children:"JitPack"}),"\n",(0,a.jsxs)(n.p,{children:["Using ",(0,a.jsx)(n.a,{href:"https://jitpack.io",children:"jitpack"})," to install\uff1a"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-groovy",children:"allprojects {\n repositories {\n ...\n maven { url 'https://jitpack.io' }\n }\n}\n"})}),"\n",(0,a.jsxs)(n.p,{children:["In ",(0,a.jsx)(n.code,{children:"build.gradle"})," file of main app project add:"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-groovy",children:"dependencies {\n implementation 'com.github.tryzealot:zealot-android:master-SNAPSHOT'\n}\n"})}),"\n",(0,a.jsx)(n.h2,{id:"permission",children:"Permission"}),"\n",(0,a.jsx)(n.p,{children:"Zealot needs internet permission"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-xml",children:'\n'})}),"\n",(0,a.jsx)(n.h2,{id:"usages",children:"Usages"}),"\n",(0,a.jsxs)(n.p,{children:["Add the start code to the ",(0,a.jsx)(n.code,{children:"onCreate"})," method block of your ",(0,a.jsx)(n.code,{children:"Application"})," file:"]}),"\n","\n","\n",(0,a.jsxs)(l.Z,{groupId:"android-zealot-sdk",children:[(0,a.jsx)(s.Z,{value:"Kotlin",children:(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-kotlin",children:'// Single channel\nZealot.create(getActivity())\n .setEndpoint("https://zealot.com")\n .setChannelKey("...")\n .setBuildType(BuildConfig.BUILD_TYPE)\n .launch()\n\n// Multi-channel, such as beta, adhoc versions\nZealot.create(getActivity())\n .setEndpoint("https://zealot.com")\n .setChannelKey("xxxxxxx", "beta")\n .setCHannelKey("yyyyyyy", "test")\n .setBuildType(BuildConfig.BUILD_TYPE)\n .launch()\n'})})}),(0,a.jsx)(s.Z,{value:"Java",children:(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-java",children:'// Single channel\nZealot.create(getActivity())\n .setEndpoint("https://zealot.com")\n .setChannelKey("...")\n .setBuildType(BuildConfig.BUILD_TYPE)\n .launch();\n\n// Multi-channel, such as beta, adhoc versions\nZealot.create(getActivity())\n .setEndpoint("https://zealot.com")\n .setChannelKey("xxxxxxx", "beta")\n .setCHannelKey("yyyyyyy", "test")\n .setBuildType(BuildConfig.BUILD_TYPE)\n .launch();\n'})})})]})]})}function h(e={}){const{wrapper:n}={...(0,r.a)(),...e.components};return n?(0,a.jsx)(n,{...e,children:(0,a.jsx)(p,{...e})}):p(e)}},5162:(e,n,t)=>{t.d(n,{Z:()=>s});t(7294);var a=t(512);const r={tabItem:"tabItem_Ymn6"};var l=t(5893);function s(e){let{children:n,hidden:t,className:s}=e;return(0,l.jsx)("div",{role:"tabpanel",className:(0,a.Z)(r.tabItem,s),hidden:t,children:n})}},4866:(e,n,t)=>{t.d(n,{Z:()=>k});var a=t(7294),r=t(512),l=t(2466),s=t(6550),o=t(469),i=t(1980),u=t(7392),c=t(12);function d(e){return a.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,a.isValidElement)(e)&&function(e){const{props:n}=e;return!!n&&"object"==typeof n&&"value"in n}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function p(e){const{values:n,children:t}=e;return(0,a.useMemo)((()=>{const e=n??function(e){return d(e).map((e=>{let{props:{value:n,label:t,attributes:a,default:r}}=e;return{value:n,label:t,attributes:a,default:r}}))}(t);return function(e){const n=(0,u.l)(e,((e,n)=>e.value===n.value));if(n.length>0)throw new Error(`Docusaurus error: Duplicate values "${n.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[n,t])}function h(e){let{value:n,tabValues:t}=e;return t.some((e=>e.value===n))}function m(e){let{queryString:n=!1,groupId:t}=e;const r=(0,s.k6)(),l=function(e){let{queryString:n=!1,groupId:t}=e;if("string"==typeof n)return n;if(!1===n)return null;if(!0===n&&!t)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return t??null}({queryString:n,groupId:t});return[(0,i._X)(l),(0,a.useCallback)((e=>{if(!l)return;const n=new URLSearchParams(r.location.search);n.set(l,e),r.replace({...r.location,search:n.toString()})}),[l,r])]}function v(e){const{defaultValue:n,queryString:t=!1,groupId:r}=e,l=p(e),[s,i]=(0,a.useState)((()=>function(e){let{defaultValue:n,tabValues:t}=e;if(0===t.length)throw new Error("Docusaurus error: the component requires at least one children component");if(n){if(!h({value:n,tabValues:t}))throw new Error(`Docusaurus error: The has a defaultValue "${n}" but none of its children has the corresponding value. Available values are: ${t.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return n}const a=t.find((e=>e.default))??t[0];if(!a)throw new Error("Unexpected error: 0 tabValues");return a.value}({defaultValue:n,tabValues:l}))),[u,d]=m({queryString:t,groupId:r}),[v,f]=function(e){let{groupId:n}=e;const t=function(e){return e?`docusaurus.tab.${e}`:null}(n),[r,l]=(0,c.Nk)(t);return[r,(0,a.useCallback)((e=>{t&&l.set(e)}),[t,l])]}({groupId:r}),b=(()=>{const e=u??v;return h({value:e,tabValues:l})?e:null})();(0,o.Z)((()=>{b&&i(b)}),[b]);return{selectedValue:s,selectValue:(0,a.useCallback)((e=>{if(!h({value:e,tabValues:l}))throw new Error(`Can't select invalid tab value=${e}`);i(e),d(e),f(e)}),[d,f,l]),tabValues:l}}var f=t(2389);const b={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var g=t(5893);function x(e){let{className:n,block:t,selectedValue:a,selectValue:s,tabValues:o}=e;const i=[],{blockElementScrollPositionUntilNextRender:u}=(0,l.o5)(),c=e=>{const n=e.currentTarget,t=i.indexOf(n),r=o[t].value;r!==a&&(u(n),s(r))},d=e=>{let n=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":{const t=i.indexOf(e.currentTarget)+1;n=i[t]??i[0];break}case"ArrowLeft":{const t=i.indexOf(e.currentTarget)-1;n=i[t]??i[i.length-1];break}}n?.focus()};return(0,g.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.Z)("tabs",{"tabs--block":t},n),children:o.map((e=>{let{value:n,label:t,attributes:l}=e;return(0,g.jsx)("li",{role:"tab",tabIndex:a===n?0:-1,"aria-selected":a===n,ref:e=>i.push(e),onKeyDown:d,onClick:c,...l,className:(0,r.Z)("tabs__item",b.tabItem,l?.className,{"tabs__item--active":a===n}),children:t??n},n)}))})}function y(e){let{lazy:n,children:t,selectedValue:r}=e;const l=(Array.isArray(t)?t:[t]).filter(Boolean);if(n){const e=l.find((e=>e.props.value===r));return e?(0,a.cloneElement)(e,{className:"margin-top--md"}):null}return(0,g.jsx)("div",{className:"margin-top--md",children:l.map(((e,n)=>(0,a.cloneElement)(e,{key:n,hidden:e.props.value!==r})))})}function j(e){const n=v(e);return(0,g.jsxs)("div",{className:(0,r.Z)("tabs-container",b.tabList),children:[(0,g.jsx)(x,{...e,...n}),(0,g.jsx)(y,{...e,...n})]})}function k(e){const n=(0,f.Z)();return(0,g.jsx)(j,{...e,children:d(e.children)},String(n))}},1151:(e,n,t)=>{t.d(n,{Z:()=>o,a:()=>s});var a=t(7294);const r={},l=a.createContext(r);function s(e){const n=a.useContext(l);return a.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:s(e.components),a.createElement(l.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/f867ef04.c472488c.js b/assets/js/f867ef04.c472488c.js new file mode 100644 index 000000000..83811ba71 --- /dev/null +++ b/assets/js/f867ef04.c472488c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[6819],{1380:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>u,contentTitle:()=>i,default:()=>m,frontMatter:()=>d,metadata:()=>p,toc:()=>l});var n=s(5893),a=s(1151),r=s(9965),o=s(4996);const d={},i="Uploaded releases",p={id:"user-guide/apps/detail",title:"Uploaded releases",description:"{s.d(t,{Z:()=>d,a:()=>o});var n=s(7294);const a={},r=n.createContext(a);function o(e){const t=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function d(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:o(e.components),n.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/4df62f41.707c3eb9.js b/assets/js/f86f7413.cfa7252b.js similarity index 83% rename from assets/js/4df62f41.707c3eb9.js rename to assets/js/f86f7413.cfa7252b.js index 6bc66382c..f085498cb 100644 --- a/assets/js/4df62f41.707c3eb9.js +++ b/assets/js/f86f7413.cfa7252b.js @@ -1 +1 @@ -"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[9314],{8926:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>u,contentTitle:()=>i,default:()=>l,frontMatter:()=>r,metadata:()=>c,toc:()=>d});var o=n(5893),s=n(1151);const r={},i="Q&A",c={id:"user-guide/qa",title:"Q&A",description:"TODO",source:"@site/versioned_docs/version-5.1.0/user-guide/qa.md",sourceDirName:"user-guide",slug:"/user-guide/qa",permalink:"/docs/user-guide/qa",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.1.0/user-guide/qa.md",tags:[],version:"5.1.0",frontMatter:{},sidebar:"userGuide",previous:{title:"Change Log",permalink:"/docs/user-guide/changelog"},next:{title:"Credits",permalink:"/docs/user-guide/credits"}},u={},d=[];function a(e){const t={blockquote:"blockquote",h1:"h1",p:"p",...(0,s.a)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.h1,{id:"qa",children:"Q&A"}),"\n",(0,o.jsxs)(t.blockquote,{children:["\n",(0,o.jsx)(t.p,{children:"TODO"}),"\n"]})]})}function l(e={}){const{wrapper:t}={...(0,s.a)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(a,{...e})}):a(e)}},1151:(e,t,n)=>{n.d(t,{Z:()=>c,a:()=>i});var o=n(7294);const s={},r=o.createContext(s);function i(e){const t=o.useContext(r);return o.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:i(e.components),o.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[2774],{1191:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>u,contentTitle:()=>i,default:()=>l,frontMatter:()=>r,metadata:()=>c,toc:()=>d});var o=n(5893),s=n(1151);const r={},i="Q&A",c={id:"user-guide/qa",title:"Q&A",description:"TODO",source:"@site/versioned_docs/version-5.2.0/user-guide/qa.md",sourceDirName:"user-guide",slug:"/user-guide/qa",permalink:"/docs/user-guide/qa",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.2.0/user-guide/qa.md",tags:[],version:"5.2.0",frontMatter:{},sidebar:"userGuide",previous:{title:"Change Log",permalink:"/docs/user-guide/changelog"},next:{title:"Credits",permalink:"/docs/user-guide/credits"}},u={},d=[];function a(e){const t={blockquote:"blockquote",h1:"h1",p:"p",...(0,s.a)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.h1,{id:"qa",children:"Q&A"}),"\n",(0,o.jsxs)(t.blockquote,{children:["\n",(0,o.jsx)(t.p,{children:"TODO"}),"\n"]})]})}function l(e={}){const{wrapper:t}={...(0,s.a)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(a,{...e})}):a(e)}},1151:(e,t,n)=>{n.d(t,{Z:()=>c,a:()=>i});var o=n(7294);const s={},r=o.createContext(s);function i(e){const t=o.useContext(r);return o.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:i(e.components),o.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/f8b3d075.b0e16ee9.js b/assets/js/f8b3d075.b0e16ee9.js new file mode 100644 index 000000000..c2895e0a0 --- /dev/null +++ b/assets/js/f8b3d075.b0e16ee9.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[5670],{669:(e,n,a)=>{a.r(n),a.d(n,{assets:()=>i,contentTitle:()=>s,default:()=>u,frontMatter:()=>l,metadata:()=>r,toc:()=>d});var o=a(5893),t=a(1151);const l={sidebar_label:"zealot"},s="Fastlane action: zealot",r={id:"developer-guide/fastlane/zealot",title:"Fastlane action: zealot",description:"Uploading iOS, Android and macOS app, it requires three params:",source:"@site/versioned_docs/version-5.2.0/developer-guide/fastlane/zealot.md",sourceDirName:"developer-guide/fastlane",slug:"/developer-guide/fastlane/zealot",permalink:"/docs/developer-guide/fastlane/zealot",draft:!1,unlisted:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.2.0/developer-guide/fastlane/zealot.md",tags:[],version:"5.2.0",frontMatter:{sidebar_label:"zealot"},sidebar:"developerGuide",previous:{title:"Fastlane plugins",permalink:"/docs/developer-guide/fastlane"},next:{title:"zealot_version_check",permalink:"/docs/developer-guide/fastlane/zealot_version_check"}},i={},d=[{value:"Parameters",id:"parameters",level:2},{value:"Output Variables",id:"output-variables",level:2}];function p(e){const n={code:"code",h1:"h1",h2:"h2",p:"p",pre:"pre",...(0,t.a)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.h1,{id:"fastlane-action-zealot",children:"Fastlane action: zealot"}),"\n",(0,o.jsx)(n.p,{children:"Uploading iOS, Android and macOS app, it requires three params:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-ruby",children:"zealot(\n endpoint: 'https://zealot.com',\n token: '...',\n channel_key: '...',\n)\n"})}),"\n",(0,o.jsx)(n.h2,{id:"parameters",children:"Parameters"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:"+-----------------+---------------------------------+------------------------+----------+\n| zealot Options |\n+-----------------+---------------------------------+------------------------+----------+\n| Key | Description | Env Var | Default |\n+-----------------+---------------------------------+------------------------+----------+\n| endpoint | The endpoint of zealot | ZEALOT_ENDPOINT | |\n| token | The token of user | ZEALOT_TOKEN | |\n| channel_key | The key of app's channel | ZEALOT_CHANNEL_KEY | |\n| file | The path of app file. Optional | ZEALOT_FILE | |\n| | if you use the `gym`, `ipa`, | | |\n| | `xcodebuild` or `gradle` | | |\n| | action. | | |\n| name | The name of app to display on | ZEALOT_NAME | |\n| | zealot | | |\n| changelog | The changelog of app | ZEALOT_CHANGELOG | |\n| slug | The slug of app | ZEALOT_SLUG | |\n| release_type | The release type of app | ZEALOT_RELEASE_TYPE | |\n| branch | The name of git branch | ZEALOT_BRANCH | |\n| git_commit | The hash of git commit | ZEALOT_GIT_COMMIT | |\n| custom_fields | The key-value hash of custom | ZEALOT_CUSTOM_FIELDS | |\n| | fields | | |\n| password | The password of app to download | ZEALOT_PASSWORD | |\n| source | The name of upload source | ZEALOT_SOURCE | fastlane |\n| ci_url | The name of upload source | ZEALOT_CI_CURL | |\n| timeout | Request timeout in seconds | ZEALOT_TIMEOUT | |\n| hide_user_token | replase user token to *** to | ZEALOT_HIDE_USER_TOKEN | true |\n| | keep secret | | |\n| verify_ssl | Should verify SSL of zealot | ZEALOT_VERIFY_SSL | true |\n| | service | | |\n| fail_on_error | Should an error uploading app | ZEALOT_FAIL_ON_ERROR | false |\n| | cause a failure | | |\n+-----------------+---------------------------------+------------------------+----------+\n* = default value is dependent on the user's system\n\n+-----------------------+---------------------------------------------+\n| zealot Output Variables |\n+-----------------------+---------------------------------------------+\n| Key | Description |\n+-----------------------+---------------------------------------------+\n| ZEALOT_APP_ID | The id of app |\n| ZEALOT_RELEASE_ID | The id of app's release |\n| ZEALOT_RELEASE_URL | The release URL of the newly uploaded build |\n| ZEALOT_INSTALL_URL | The install URL of the newly uploaded build |\n| ZEALOT_QRCODE_URL | The QRCode URL of the newly uploaded build |\n| ZEAALOT_ERROR_MESSAGE | The error message during upload process |\n+-----------------------+---------------------------------------------+\n"})}),"\n",(0,o.jsx)(n.h2,{id:"output-variables",children:"Output Variables"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:"+-----------------------+---------------------------------------------+\n| zealot Output Variables |\n+-----------------------+---------------------------------------------+\n| Key | Description |\n+-----------------------+---------------------------------------------+\n| ZEALOT_APP_ID | The id of app |\n| ZEALOT_RELEASE_ID | The id of app's release |\n| ZEALOT_RELEASE_URL | The release URL of the newly uploaded build |\n| ZEALOT_INSTALL_URL | The install URL of the newly uploaded build |\n| ZEALOT_QRCODE_URL | The QRCode URL of the newly uploaded build |\n| ZEAALOT_ERROR_MESSAGE | The error message during upload process |\n+-----------------------+---------------------------------------------+\nAccess the output values using `lane_context[SharedValues::VARIABLE_NAME]`\n"})})]})}function u(e={}){const{wrapper:n}={...(0,t.a)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(p,{...e})}):p(e)}},1151:(e,n,a)=>{a.d(n,{Z:()=>r,a:()=>s});var o=a(7294);const t={},l=o.createContext(t);function s(e){const n=o.useContext(l);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:s(e.components),o.createElement(l.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/ffe7faed.0ea0d2fd.js b/assets/js/ffe7faed.0ea0d2fd.js new file mode 100644 index 000000000..e7cadee63 --- /dev/null +++ b/assets/js/ffe7faed.0ea0d2fd.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[1037],{3088:(n,t,e)=>{e.r(t),e.d(t,{assets:()=>u,contentTitle:()=>a,default:()=>l,frontMatter:()=>g,metadata:()=>d,toc:()=>c});var i=e(5893),o=e(1151),r=e(9965),s=e(4996);const g={},a="Logging",d={id:"user-guide/administrator/monitoring/logging",title:"Logging",description:"{e.d(t,{Z:()=>g,a:()=>s});var i=e(7294);const o={},r=i.createContext(o);function s(n){const t=i.useContext(r);return i.useMemo((function(){return"function"==typeof n?n(t):{...t,...n}}),[t,n])}function g(n){let t;return t=n.disableParentContext?"function"==typeof n.components?n.components(o):n.components||o:s(n.components),i.createElement(r.Provider,{value:t},n.children)}}}]); \ No newline at end of file diff --git a/assets/js/main.27f77825.js b/assets/js/main.27f77825.js new file mode 100644 index 000000000..4ae029f08 --- /dev/null +++ b/assets/js/main.27f77825.js @@ -0,0 +1,2 @@ +/*! For license information please see main.27f77825.js.LICENSE.txt */ +(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[179],{723:(e,t,n)=>{"use strict";n.d(t,{Z:()=>p});n(7294);var o=n(8356),r=n.n(o),s=n(6887);const a={"002e3694":[()=>n.e(3335).then(n.bind(n,4597)),"@site/versioned_docs/version-4.x/user-guide/debug-files/upload.md",4597],"00e0c5f0":[()=>n.e(9966).then(n.bind(n,1793)),"@site/versioned_docs/version-5.1.0/self-hosted/storage.md",1793],"011af8e2":[()=>n.e(6142).then(n.bind(n,6777)),"@site/versioned_docs/version-5.1.0/user-guide/administrator/monitoring/system-info.mdx",6777],"011dea14":[()=>n.e(2546).then(n.bind(n,1040)),"@site/versioned_docs/version-4.x/user-guide/webhooks/wecom.md",1040],"01c82eb1":[()=>n.e(7429).then(n.bind(n,852)),"@site/versioned_docs/version-5.2.0/developer-guide/api/apps.md",852],"01f38628":[()=>n.e(2366).then(n.bind(n,5400)),"@site/versioned_docs/version-5.2.0/user-guide/webhooks/wecom.md",5400],"02a4cf77":[()=>n.e(1147).then(n.bind(n,889)),"@site/versioned_docs/version-5.2.0/user-guide/credits.md",889],"036596d4":[()=>n.e(5055).then(n.bind(n,557)),"@site/versioned_docs/version-5.2.0/self-hosted/deployment/architecture.mdx",557],"039dda31":[()=>n.e(8934).then(n.bind(n,8060)),"@site/versioned_docs/version-5.1.0/user-guide/index.mdx",8060],"048ae1f6":[()=>n.e(4499).then(n.bind(n,5910)),"@site/versioned_docs/version-5.1.0/user-guide/administrator/monitoring/database-analytics.mdx",5910],"06b363f7":[()=>Promise.all([n.e(532),n.e(5832)]).then(n.bind(n,3539)),"@site/versioned_docs/version-5.2.0/self-hosted/reverse-proxies.mdx",3539],"09ee1501":[()=>n.e(9578).then(n.bind(n,1675)),"@site/docs/self-hosted/deployment/requirements.md",1675],"0a799d0e":[()=>n.e(8823).then(n.bind(n,1185)),"@site/docs/user-guide/dashboard.md",1185],"0aae5e9f":[()=>Promise.all([n.e(532),n.e(2564)]).then(n.bind(n,1821)),"@site/versioned_docs/version-5.2.0/contributing-guide/local-development/devcontainer.md",1821],"0af0bdac":[()=>n.e(65).then(n.t.bind(n,4435,19)),"~docs/default/category-docs-500-userguide-category-monitoring-772.json",4435],"0afbe734":[()=>n.e(3598).then(n.bind(n,1436)),"@site/versioned_docs/version-5.1.0/contributing-guide/index.md",1436],"0b1f21de":[()=>n.e(1988).then(n.bind(n,7311)),"@site/docs/user-guide/administrator/monitoring/logging.mdx",7311],"0ba74476":[()=>n.e(6045).then(n.bind(n,9501)),"@site/versioned_docs/version-5.1.0/user-guide/administrator/apple-team.mdx",9501],"0d8f1148":[()=>n.e(2556).then(n.t.bind(n,2723,19)),"~docs/default/category-docs-510-userguide-category-apps-23f.json",2723],"0da88c94":[()=>Promise.all([n.e(532),n.e(112)]).then(n.bind(n,855)),"@site/docs/contributing-guide/local-development/devcontainer.md",855],"0dc6f082":[()=>Promise.all([n.e(532),n.e(4984)]).then(n.bind(n,2607)),"@site/versioned_docs/version-5.2.0/developer-guide/sdk/android.md",2607],"0df53633":[()=>n.e(8179).then(n.t.bind(n,7517,19)),"~docs/default/category-docs-510-selfhosted-category-configuration-259.json",7517],"0e2cdf96":[()=>n.e(648).then(n.bind(n,2050)),"@site/docs/developer-guide/fastlane/zealot_sync_devices.md",2050],"0e6c8da6":[()=>n.e(2256).then(n.bind(n,8022)),"@site/docs/self-hosted/deployment/fly.md",8022],"0efaccc0":[()=>n.e(7372).then(n.bind(n,662)),"@site/versioned_docs/version-5.0.0/user-guide/toolkits/fetch-udid.mdx",662],"0f9bdb85":[()=>n.e(8590).then(n.bind(n,4122)),"@site/versioned_docs/version-5.2.0/user-guide/webhooks.md",4122],"10830de6":[()=>n.e(8995).then(n.bind(n,4338)),"@site/docs/user-guide/webhooks/slack.md",4338],"10daa3a4":[()=>n.e(58).then(n.bind(n,8455)),"@site/versioned_docs/version-5.0.0/self-hosted/deployment/fly.md",8455],"1129db35":[()=>n.e(4070).then(n.bind(n,2942)),"@site/docs/user-guide/administrator/monitoring/system-info.mdx",2942],"13fb7505":[()=>n.e(6780).then(n.bind(n,2888)),"@site/versioned_docs/version-5.1.0/self-hosted/configuration/third-party-authentication.md",2888],"14094f46":[()=>n.e(8422).then(n.t.bind(n,9807,19)),"~docs/default/category-docs-4-x-userguide-category-monitoring-186.json",9807],"149c7b1e":[()=>n.e(5946).then(n.bind(n,3307)),"@site/versioned_docs/version-5.2.0/user-guide/administrator/monitoring/database-analytics.mdx",3307],"14a24e11":[()=>Promise.all([n.e(532),n.e(7400)]).then(n.bind(n,7307)),"@site/versioned_docs/version-4.x/contributing-guide/local-development/devcontainer.md",7307],"14b2f636":[()=>Promise.all([n.e(532),n.e(5672)]).then(n.bind(n,8622)),"@site/versioned_docs/version-5.0.0/self-hosted/reverse-proxies.mdx",8622],"14eb3368":[()=>Promise.all([n.e(532),n.e(9817)]).then(n.bind(n,4228)),"@theme/DocCategoryGeneratedIndexPage",4228],"14fae669":[()=>n.e(2197).then(n.bind(n,789)),"@site/docs/user-guide/toolkits/teardown.mdx",789],"15df074e":[()=>n.e(5497).then(n.bind(n,4820)),"@site/versioned_docs/version-5.1.0/user-guide/toolkits/teardown.mdx",4820],"15f705bf":[()=>n.e(3229).then(n.t.bind(n,1574,19)),"~docs/default/category-docs-500-selfhosted-category-cloud-provider-guides-39b.json",1574],"169670f9":[()=>n.e(3325).then(n.bind(n,1098)),"@site/versioned_docs/version-5.2.0/user-guide/apps/detail.mdx",1098],17896441:[()=>Promise.all([n.e(532),n.e(674),n.e(7918)]).then(n.bind(n,230)),"@theme/DocItem",230],"17c15062":[()=>n.e(8227).then(n.t.bind(n,9222,19)),"~docs/default/category-docs-510-developerguide-category-sdks-e09.json",9222],"189cf3ab":[()=>n.e(231).then(n.bind(n,1467)),"@site/versioned_docs/version-5.1.0/self-hosted/deployment/docker.md",1467],"1948baf2":[()=>n.e(5208).then(n.bind(n,9732)),"@site/versioned_docs/version-5.0.0/user-guide/credits.md",9732],"1addd124":[()=>n.e(5979).then(n.t.bind(n,8943,19)),"~docs/default/category-docs-selfhosted-category-deployment-bab.json",8943],"1b734938":[()=>n.e(4684).then(n.bind(n,1421)),"@site/versioned_docs/version-4.x/user-guide/administrator/backup.md",1421],"1c967876":[()=>n.e(8363).then(n.bind(n,1271)),"@site/versioned_docs/version-5.2.0/user-guide/webhooks/discord.md",1271],"1caa3b90":[()=>n.e(4029).then(n.t.bind(n,973,19)),"~docs/default/category-docs-selfhosted-category-configuration-a96.json",973],"1cab920e":[()=>n.e(6594).then(n.bind(n,6502)),"@site/versioned_docs/version-5.2.0/self-hosted/configuration/third-party-authentication.md",6502],"1cb76857":[()=>n.e(8735).then(n.bind(n,9745)),"@site/versioned_docs/version-5.0.0/user-guide/webhooks/dingtalk.md",9745],"1e930e9c":[()=>n.e(5566).then(n.bind(n,7746)),"@site/docs/user-guide/apps/create.mdx",7746],"1efa993c":[()=>n.e(1010).then(n.t.bind(n,9848,19)),"~docs/default/category-docs-userguide-category-debug-files-a9a.json",9848],"1f391b9e":[()=>Promise.all([n.e(532),n.e(674),n.e(3085)]).then(n.bind(n,4247)),"@theme/MDXPage",4247],"2020b7aa":[()=>n.e(7143).then(n.bind(n,7355)),"@site/versioned_docs/version-5.0.0/developer-guide/fastlane/zealot_sync_devices.md",7355],"20ab3326":[()=>n.e(5696).then(n.t.bind(n,1809,19)),"~docs/default/category-docsnext-userguide-category-apps-a41.json",1809],"20b08819":[()=>n.e(2387).then(n.bind(n,3547)),"@site/versioned_docs/version-5.0.0/developer-guide/fastlane/zealot_version_check.md",3547],"21b281f9":[()=>n.e(3523).then(n.bind(n,482)),"@site/versioned_docs/version-4.x/self-hosted/deployment/requirements.md",482],"220930de":[()=>n.e(1461).then(n.bind(n,4083)),"@site/versioned_docs/version-4.x/self-hosted/storage.md",4083],"226ba89c":[()=>n.e(689).then(n.t.bind(n,5173,19)),"~docs/default/category-docsnext-selfhosted-category-configuration-d39.json",5173],"22ecf5bf":[()=>n.e(6723).then(n.bind(n,4535)),"@site/versioned_docs/version-5.2.0/developer-guide/api/debug_files.md",4535],"247783bb":[()=>n.e(9334).then(n.t.bind(n,3769,19)),"/home/runner/work/docs/docs/.docusaurus/docusaurus-plugin-content-docs/default/plugin-route-context-module-100.json",3769],"25301e6f":[()=>n.e(8843).then(n.bind(n,9974)),"@site/versioned_docs/version-4.x/user-guide/administrator/monitoring/logging.md",9974],"25564e8e":[()=>n.e(1504).then(n.bind(n,7170)),"@site/versioned_docs/version-5.2.0/user-guide/apps/create.mdx",7170],"2593a83b":[()=>n.e(4643).then(n.bind(n,1773)),"@site/versioned_docs/version-5.0.0/self-hosted/configuration/third-party-authentication.md",1773],"26a592c3":[()=>n.e(8417).then(n.bind(n,9605)),"@site/versioned_docs/version-5.1.0/self-hosted/deployment/source-code.md",9605],27385049:[()=>n.e(4910).then(n.bind(n,7850)),"@site/docs/user-guide/administrator/apple-team.mdx",7850],"27d8714b":[()=>n.e(5999).then(n.bind(n,7316)),"@site/versioned_docs/version-5.2.0/user-guide/webhooks/slack.md",7316],"286cd782":[()=>n.e(6782).then(n.bind(n,7857)),"@site/versioned_docs/version-5.0.0/user-guide/apps/create.mdx",7857],"2a894c30":[()=>n.e(419).then(n.bind(n,7656)),"@site/versioned_docs/version-5.1.0/user-guide/administrator/monitoring/logging.mdx",7656],"2b8fdfa9":[()=>n.e(5281).then(n.bind(n,577)),"@site/versioned_docs/version-4.x/self-hosted/deployment/docker.md",577],"2c0f0ab1":[()=>Promise.all([n.e(532),n.e(1440)]).then(n.bind(n,4082)),"@site/versioned_docs/version-5.0.0/contributing-guide/local-development/source-code.md",4082],"2d6084ed":[()=>n.e(6270).then(n.bind(n,281)),"@site/versioned_docs/version-5.2.0/self-hosted/deployment/render.md",281],"2dc3018f":[()=>n.e(9852).then(n.bind(n,8235)),"@site/versioned_docs/version-4.x/user-guide/webhooks/discord.md",8235],"30a84665":[()=>n.e(957).then(n.bind(n,794)),"@site/versioned_docs/version-4.x/self-hosted/deployment/fly.md",794],"319939e8":[()=>n.e(483).then(n.bind(n,9371)),"@site/versioned_docs/version-5.1.0/user-guide/debug-files/upload.mdx",9371],"31dae65f":[()=>n.e(4750).then(n.bind(n,7631)),"@site/versioned_docs/version-4.x/developer-guide/index.md",7631],"31eb2e49":[()=>n.e(865).then(n.t.bind(n,2711,19)),"~docs/default/category-docs-500-developerguide-category-sdks-e42.json",2711],"32bba384":[()=>n.e(917).then(n.bind(n,8051)),"@site/versioned_docs/version-5.1.0/developer-guide/fastlane/zealot_sync_devices.md",8051],"33da4e92":[()=>n.e(414).then(n.bind(n,5898)),"@site/versioned_docs/version-5.1.0/user-guide/debug-files/index.mdx",5898],"34f9a893":[()=>n.e(3178).then(n.bind(n,2290)),"@site/versioned_docs/version-5.1.0/user-guide/apps/create.mdx",2290],"35a60b9c":[()=>n.e(8138).then(n.bind(n,1)),"@site/versioned_docs/version-4.x/user-guide/apps/create.md",1],"35a98222":[()=>n.e(8719).then(n.bind(n,7006)),"@site/versioned_docs/version-4.x/self-hosted/deployment/source-code.md",7006],36384478:[()=>n.e(485).then(n.bind(n,3408)),"@site/versioned_docs/version-5.2.0/self-hosted/deployment/source-code.md",3408],"367ed454":[()=>n.e(5862).then(n.t.bind(n,2801,19)),"~docs/default/category-docsnext-contributingguide-category-local-development-1dc.json",2801],"36bff928":[()=>n.e(4203).then(n.bind(n,7352)),"@site/versioned_docs/version-5.0.0/self-hosted/storage.md",7352],"36eb88d2":[()=>n.e(3205).then(n.bind(n,6831)),"@site/versioned_docs/version-5.1.0/developer-guide/api.md",6831],"37ca8f58":[()=>n.e(8336).then(n.bind(n,7057)),"@site/docs/self-hosted/deployment/source-code.md",7057],"393be207":[()=>n.e(7414).then(n.bind(n,1181)),"@site/src/pages/markdown-page.md",1181],39534802:[()=>n.e(9512).then(n.t.bind(n,3123,19)),"~docs/default/category-docs-4-x-selfhosted-category-configuration-1a5.json",3123],39967965:[()=>n.e(8189).then(n.t.bind(n,1062,19)),"~docs/default/category-docs-510-userguide-category-debug-files-a10.json",1062],"39b02d66":[()=>n.e(2923).then(n.bind(n,1022)),"@site/docs/user-guide/administrator/settings.mdx",1022],"3dd373c6":[()=>n.e(8253).then(n.t.bind(n,6423,19)),"~docs/default/category-docs-4-x-userguide-category-debug-files-74f.json",6423],"3ee87be9":[()=>n.e(9120).then(n.bind(n,1370)),"@site/versioned_docs/version-4.x/user-guide/qa.md",1370],"3f6a47b2":[()=>n.e(4732).then(n.bind(n,6641)),"@site/versioned_docs/version-5.2.0/user-guide/debug-files/index.mdx",6641],"40b43bed":[()=>n.e(443).then(n.bind(n,1450)),"@site/versioned_docs/version-5.1.0/self-hosted/deployment/render.md",1450],"41f50648":[()=>n.e(2813).then(n.bind(n,7374)),"@site/versioned_docs/version-5.0.0/self-hosted/deployment/docker.md",7374],"42e0a757":[()=>n.e(7797).then(n.bind(n,3872)),"@site/versioned_docs/version-5.2.0/self-hosted/storage.md",3872],"433a7c95":[()=>n.e(315).then(n.bind(n,5583)),"@site/docs/user-guide/apps/detail.mdx",5583],43646140:[()=>n.e(8176).then(n.bind(n,1474)),"@site/versioned_docs/version-5.2.0/user-guide/best_practices.md",1474],"437849bc":[()=>n.e(8846).then(n.t.bind(n,5120,19)),"~docs/default/category-docs-selfhosted-category-cloud-provider-guides-fb8.json",5120],"43ef865f":[()=>Promise.all([n.e(532),n.e(2855)]).then(n.bind(n,5756)),"@site/docs/developer-guide/sdk/android.md",5756],"45256cfe":[()=>Promise.all([n.e(532),n.e(3803)]).then(n.bind(n,2721)),"@site/versioned_docs/version-5.0.0/developer-guide/sdk/android.md",2721],"454f6929":[()=>n.e(266).then(n.bind(n,5200)),"@site/docs/user-guide/apps/index.mdx",5200],"45923ef2":[()=>n.e(1570).then(n.bind(n,4460)),"@site/docs/user-guide/webhooks.md",4460],"45ab56fc":[()=>n.e(6219).then(n.bind(n,6711)),"@site/docs/developer-guide/api.md",6711],"475cf40c":[()=>n.e(9873).then(n.bind(n,4922)),"@site/versioned_docs/version-5.0.0/user-guide/administrator/monitoring/database-analytics.mdx",4922],"477073af":[()=>Promise.all([n.e(532),n.e(3385)]).then(n.bind(n,2152)),"@site/docs/self-hosted/reverse-proxies.mdx",2152],"48295ea8":[()=>Promise.all([n.e(532),n.e(614)]).then(n.bind(n,634)),"@site/versioned_docs/version-5.0.0/developer-guide/sdk/ios.md",634],"485d62e4":[()=>n.e(9867).then(n.bind(n,9312)),"@site/versioned_docs/version-5.2.0/user-guide/administrator/backup.mdx",9312],"48b93325":[()=>n.e(5749).then(n.bind(n,2780)),"@site/versioned_docs/version-5.2.0/user-guide/toolkits/teardown.mdx",2780],"49206f6f":[()=>n.e(3855).then(n.bind(n,9467)),"@site/versioned_docs/version-5.0.0/contributing-guide/index.md",9467],49510311:[()=>n.e(9455).then(n.bind(n,4621)),"@site/versioned_docs/version-5.0.0/user-guide/toolkits/teardown.mdx",4621],"49d6ba58":[()=>n.e(9146).then(n.bind(n,8910)),"@site/versioned_docs/version-5.1.0/user-guide/changelog.md",8910],"4b3973b8":[()=>n.e(6926).then(n.bind(n,9399)),"@site/docs/user-guide/webhooks/feishu.md",9399],"4bf92ea9":[()=>Promise.all([n.e(532),n.e(2957)]).then(n.bind(n,5073)),"@site/docs/contributing-guide/local-development/source-code.md",5073],"4c432e95":[()=>n.e(1175).then(n.bind(n,9194)),"@site/versioned_docs/version-4.x/user-guide/dashboard.md",9194],"4cad2fe6":[()=>n.e(5729).then(n.bind(n,4657)),"@site/versioned_docs/version-4.x/user-guide/credits.md",4657],"4d08acb8":[()=>n.e(6158).then(n.bind(n,380)),"@site/versioned_docs/version-5.2.0/self-hosted/deployment/requirements.md",380],"4d44c677":[()=>n.e(564).then(n.bind(n,9599)),"@site/versioned_docs/version-4.x/user-guide/changelog.md",9599],"4df62f41":[()=>n.e(9314).then(n.bind(n,8926)),"@site/versioned_docs/version-5.1.0/user-guide/qa.md",8926],"4e1621ab":[()=>n.e(8262).then(n.bind(n,1968)),"@site/versioned_docs/version-5.2.0/self-hosted/configuration/schedule-jobs.md",1968],"514e9e1f":[()=>n.e(3368).then(n.bind(n,5018)),"@site/versioned_docs/version-5.1.0/developer-guide/fastlane/zealot.md",5018],51763432:[()=>n.e(3099).then(n.t.bind(n,1368,19)),"~docs/default/category-docs-4-x-selfhosted-category-cloud-provider-guides-f1d.json",1368],"5191259b":[()=>n.e(2018).then(n.t.bind(n,4025,19)),"~docs/default/category-docs-userguide-category-monitoring-cf9.json",4025],"51ff7b2c":[()=>n.e(7328).then(n.bind(n,8987)),"@site/versioned_docs/version-5.2.0/developer-guide/fastlane/zealot_debug_file.md",8987],"52d3380a":[()=>n.e(1261).then(n.bind(n,3162)),"@site/versioned_docs/version-4.x/user-guide/toolkits/fetch-udid.mdx",3162],"52f780b0":[()=>n.e(1489).then(n.bind(n,8364)),"@site/versioned_docs/version-4.x/self-hosted/deployment/docker/step-by-step.md",8364],"55db4623":[()=>n.e(7133).then(n.bind(n,3859)),"@site/versioned_docs/version-4.x/self-hosted/configuration/environment-variables.md",3859],"566ccdfa":[()=>n.e(2710).then(n.bind(n,5314)),"@site/docs/self-hosted/configuration/third-party-authentication.md",5314],"568a2802":[()=>n.e(1521).then(n.bind(n,7822)),"@site/versioned_docs/version-5.0.0/user-guide/webhooks/feishu.md",7822],"56af2409":[()=>n.e(3130).then(n.bind(n,7814)),"@site/docs/self-hosted/configuration/schedule-jobs.md",7814],"56f1fb64":[()=>n.e(9218).then(n.bind(n,6976)),"@site/versioned_docs/version-5.0.0/user-guide/dashboard.md",6976],"57006c40":[()=>n.e(7663).then(n.bind(n,9665)),"@site/versioned_docs/version-5.1.0/developer-guide/fastlane.md",9665],"571c2576":[()=>n.e(2980).then(n.bind(n,2363)),"@site/versioned_docs/version-5.1.0/developer-guide/fastlane/zealot_debug_file.md",2363],58234510:[()=>n.e(7313).then(n.bind(n,2409)),"@site/docs/user-guide/administrator/permissions.md",2409],"58a04bdc":[()=>n.e(7073).then(n.bind(n,7586)),"@site/versioned_docs/version-5.2.0/developer-guide/fastlane/zealot_sync_devices.md",7586],"58e8de69":[()=>n.e(6212).then(n.bind(n,1295)),"@site/versioned_docs/version-5.0.0/user-guide/apps/detail.mdx",1295],"5a3653dd":[()=>n.e(6832).then(n.t.bind(n,3939,19)),"~docs/default/category-docs-userguide-category-apps-877.json",3939],"5a522f46":[()=>n.e(8738).then(n.bind(n,7889)),"@site/versioned_docs/version-4.x/self-hosted/deployment/architecture.mdx",7889],"5bc80e2f":[()=>n.e(8).then(n.bind(n,1359)),"@site/versioned_docs/version-5.1.0/user-guide/administrator/monitoring/background-jobs.mdx",1359],"5c74b3a7":[()=>n.e(3670).then(n.bind(n,1681)),"@site/docs/user-guide/toolkits/fetch-udid.mdx",1681],"5da52b15":[()=>n.e(2918).then(n.bind(n,2090)),"@site/versioned_docs/version-4.x/user-guide/administrator/monitoring/background-jobs.md",2090],"5db046c6":[()=>n.e(7500).then(n.t.bind(n,2207,19)),"~docs/default/category-docs-510-contributingguide-category-local-development-42d.json",2207],"5df973a0":[()=>n.e(8763).then(n.bind(n,8486)),"@site/docs/self-hosted/storage.md",8486],"5e95c892":[()=>n.e(9661).then(n.bind(n,1892)),"@theme/DocsRoot",1892],"5e9f5e1a":[()=>Promise.resolve().then(n.bind(n,6809)),"@generated/docusaurus.config",6809],"5ec84ac2":[()=>n.e(9516).then(n.bind(n,6640)),"@site/versioned_docs/version-4.x/user-guide/administrator/apple-team.mdx",6640],"5f153871":[()=>n.e(7069).then(n.bind(n,7629)),"@site/docs/self-hosted/index.md",7629],"5f8b303a":[()=>n.e(6868).then(n.bind(n,8568)),"@site/versioned_docs/version-4.x/user-guide/index.mdx",8568],"600ac4e1":[()=>n.e(6215).then(n.bind(n,1721)),"@site/docs/contributing-guide/index.md",1721],"60fb9086":[()=>n.e(1257).then(n.bind(n,1107)),"@site/docs/user-guide/debug-files/upload.mdx",1107],"61175dc6":[()=>n.e(7525).then(n.bind(n,544)),"@site/versioned_docs/version-5.0.0/user-guide/debug-files/review.mdx",544],"616acc84":[()=>n.e(9940).then(n.bind(n,9210)),"@site/versioned_docs/version-4.x/developer-guide/api/apps.md",9210],"63b42c86":[()=>n.e(9195).then(n.bind(n,7017)),"@site/versioned_docs/version-5.2.0/user-guide/debug-files/upload.mdx",7017],"6573317f":[()=>n.e(3307).then(n.bind(n,5961)),"@site/docs/user-guide/debug-files/index.mdx",5961],"65c373d6":[()=>n.e(5414).then(n.bind(n,9053)),"@site/versioned_docs/version-5.1.0/self-hosted/deployment/kubernetes.md",9053],"674c5fcf":[()=>n.e(5920).then(n.bind(n,4565)),"@site/versioned_docs/version-5.0.0/user-guide/best_practices.md",4565],"6768319c":[()=>n.e(6159).then(n.bind(n,6677)),"@site/versioned_docs/version-5.0.0/developer-guide/api.md",6677],"687041db":[()=>n.e(336).then(n.bind(n,7014)),"@site/versioned_docs/version-5.0.0/developer-guide/fastlane.md",7014],"699a8fef":[()=>n.e(3954).then(n.bind(n,4111)),"@site/versioned_docs/version-4.x/user-guide/administrator/permissions.md",4111],"69bb3584":[()=>n.e(4234).then(n.bind(n,9588)),"@site/versioned_docs/version-4.x/self-hosted/configuration/third-party-authentication.md",9588],"6a4aefb0":[()=>n.e(9346).then(n.t.bind(n,9777,19)),"~docs/default/category-docs-4-x-userguide-category-apps-0b2.json",9777],"6c0d6c9a":[()=>n.e(5148).then(n.bind(n,1024)),"@site/versioned_docs/version-4.x/developer-guide/api.md",1024],"6cdd9503":[()=>n.e(5111).then(n.t.bind(n,4047,19)),"~docs/default/category-docs-4-x-userguide-category-toolkits-f2e.json",4047],"6d4d7925":[()=>n.e(8432).then(n.bind(n,8855)),"@site/versioned_docs/version-5.2.0/user-guide/apps/index.mdx",8855],"6d8ea5cb":[()=>n.e(5617).then(n.bind(n,6874)),"@site/versioned_docs/version-5.1.0/self-hosted/deployment/nomad.md",6874],"6eb26ec5":[()=>n.e(4450).then(n.bind(n,8080)),"@site/versioned_docs/version-5.1.0/self-hosted/deployment/architecture.mdx",8080],"6f1d913a":[()=>n.e(7033).then(n.bind(n,6069)),"@site/versioned_docs/version-5.2.0/self-hosted/deployment/docker/step-by-step.md",6069],"6f76ba3b":[()=>n.e(5013).then(n.bind(n,5401)),"@site/versioned_docs/version-5.1.0/self-hosted/configuration/environment-variables.md",5401],70418616:[()=>Promise.all([n.e(532),n.e(3804)]).then(n.bind(n,6904)),"@site/versioned_docs/version-5.2.0/developer-guide/sdk/ios.md",6904],"708d50e3":[()=>n.e(5272).then(n.bind(n,3286)),"@site/versioned_docs/version-5.0.0/user-guide/webhooks/discord.md",3286],"71b71564":[()=>n.e(6186).then(n.bind(n,1355)),"@site/versioned_docs/version-5.0.0/self-hosted/deployment/render.md",1355],"72b5199f":[()=>n.e(6567).then(n.bind(n,4490)),"@site/versioned_docs/version-4.x/contributing-guide/index.md",4490],"7386cd72":[()=>n.e(5902).then(n.t.bind(n,8141,19)),"~docs/default/category-docs-contributingguide-category-local-development-477.json",8141],"7737c9f3":[()=>n.e(96).then(n.bind(n,7469)),"@site/docs/user-guide/index.mdx",7469],77590075:[()=>n.e(4765).then(n.bind(n,4555)),"@site/versioned_docs/version-5.0.0/developer-guide/index.md",4555],"77fdf6b1":[()=>n.e(8479).then(n.bind(n,3621)),"@site/versioned_docs/version-5.1.0/user-guide/administrator/permissions.md",3621],"784c299a":[()=>n.e(5351).then(n.bind(n,5374)),"@site/docs/self-hosted/deployment/render.md",5374],"78cdd3ae":[()=>n.e(7965).then(n.t.bind(n,2427,19)),"~docs/default/category-docsnext-userguide-category-administrator-31b.json",2427],"793534f3":[()=>n.e(1108).then(n.bind(n,4780)),"@site/versioned_docs/version-5.2.0/user-guide/administrator/settings.mdx",4780],"799ffaed":[()=>n.e(8493).then(n.bind(n,6487)),"@site/versioned_docs/version-4.x/self-hosted/deployment/kubernetes.md",6487],"79fb26a6":[()=>n.e(6716).then(n.bind(n,6709)),"@site/versioned_docs/version-5.0.0/user-guide/administrator/monitoring/logging.mdx",6709],"7ab8d5f3":[()=>n.e(4769).then(n.bind(n,6232)),"@site/versioned_docs/version-5.0.0/self-hosted/configuration/environment-variables.md",6232],"7ac1225b":[()=>n.e(929).then(n.bind(n,2555)),"@site/versioned_docs/version-5.1.0/user-guide/webhooks/discord.md",2555],"7d49456b":[()=>n.e(5945).then(n.bind(n,4613)),"@site/versioned_docs/version-5.0.0/user-guide/administrator/permissions.md",4613],"7e0b4e5f":[()=>n.e(5791).then(n.bind(n,3028)),"@site/versioned_docs/version-5.1.0/developer-guide/api/debug_files.md",3028],"7e370ea7":[()=>n.e(7595).then(n.t.bind(n,1638,19)),"~docs/default/category-docs-developerguide-category-sdks-4f3.json",1638],"81a27df7":[()=>n.e(1370).then(n.bind(n,6690)),"@site/versioned_docs/version-5.1.0/user-guide/apps/index.mdx",6690],"8420426a":[()=>n.e(9617).then(n.bind(n,6505)),"@site/versioned_docs/version-5.2.0/self-hosted/index.md",6505],"844e1eca":[()=>n.e(5374).then(n.bind(n,57)),"@site/versioned_docs/version-5.1.0/user-guide/webhooks.md",57],84706228:[()=>Promise.all([n.e(532),n.e(4943)]).then(n.bind(n,5026)),"@site/versioned_docs/version-4.x/developer-guide/sdk/ios.md",5026],"848dab9f":[()=>n.e(2647).then(n.bind(n,1991)),"@site/docs/developer-guide/index.md",1991],"84bb00d0":[()=>n.e(3522).then(n.bind(n,349)),"@site/versioned_docs/version-5.1.0/self-hosted/configuration/schedule-jobs.md",349],"84e62756":[()=>n.e(826).then(n.bind(n,3714)),"@site/docs/self-hosted/deployment/docker.md",3714],"85079bd2":[()=>n.e(1298).then(n.bind(n,5424)),"@site/versioned_docs/version-5.2.0/self-hosted/deployment/fly.md",5424],"889fb5f5":[()=>n.e(7321).then(n.bind(n,9228)),"@site/versioned_docs/version-4.x/self-hosted/configuration/schedule-jobs.md",9228],"88e80bd0":[()=>n.e(6665).then(n.bind(n,4096)),"@site/docs/user-guide/administrator/monitoring/background-jobs.mdx",4096],"88f9ce8f":[()=>n.e(387).then(n.bind(n,993)),"@site/docs/user-guide/webhooks/wecom.md",993],"897621f7":[()=>n.e(4974).then(n.bind(n,3596)),"@site/versioned_docs/version-5.0.0/self-hosted/deployment/kubernetes.md",3596],"8992496f":[()=>n.e(8772).then(n.bind(n,5901)),"@site/versioned_docs/version-4.x/user-guide/best_practices.md",5901],"8a161b58":[()=>n.e(8137).then(n.bind(n,7304)),"@site/versioned_docs/version-5.2.0/user-guide/toolkits/fetch-udid.mdx",7304],"8a7857c4":[()=>n.e(3271).then(n.t.bind(n,3150,19)),"~docs/default/category-docs-510-selfhosted-category-cloud-provider-guides-353.json",3150],"8aa13b20":[()=>n.e(6197).then(n.bind(n,7992)),"@site/versioned_docs/version-4.x/user-guide/administrator/monitoring/system-info.md",7992],"8ac0e0b2":[()=>n.e(469).then(n.bind(n,3949)),"@site/versioned_docs/version-5.0.0/self-hosted/deployment/source-code.md",3949],"8bf7b385":[()=>n.e(4067).then(n.t.bind(n,1949,19)),"~docs/default/category-docsnext-userguide-category-debug-files-13b.json",1949],"8cddcc36":[()=>n.e(1653).then(n.bind(n,5080)),"@site/versioned_docs/version-5.0.0/user-guide/debug-files/index.mdx",5080],"8f8d8fcb":[()=>n.e(1900).then(n.bind(n,9901)),"@site/versioned_docs/version-5.1.0/user-guide/webhooks/wecom.md",9901],"8f9c93ae":[()=>Promise.all([n.e(532),n.e(4885)]).then(n.bind(n,2544)),"@site/versioned_docs/version-5.0.0/contributing-guide/local-development/devcontainer.md",2544],"90050cbc":[()=>n.e(7236).then(n.bind(n,5052)),"@site/versioned_docs/version-5.0.0/user-guide/apps/upload.mdx",5052],"905ab186":[()=>n.e(1296).then(n.bind(n,992)),"@site/versioned_docs/version-5.2.0/user-guide/apps/upload.mdx",992],"935f2afb":[()=>n.e(53).then(n.t.bind(n,1109,19)),"~docs/default/version-current-metadata-prop-751.json",1109],"93688e09":[()=>n.e(3820).then(n.bind(n,7434)),"@site/versioned_docs/version-5.0.0/self-hosted/deployment/docker/step-by-step.md",7434],"952e18be":[()=>n.e(7269).then(n.bind(n,674)),"@site/versioned_docs/version-5.2.0/user-guide/debug-files/review.mdx",674],"9563a519":[()=>n.e(3703).then(n.t.bind(n,3673,19)),"~docs/default/category-docs-510-userguide-category-administrator-9e9.json",3673],"95a38b63":[()=>n.e(684).then(n.bind(n,2190)),"@site/versioned_docs/version-5.1.0/user-guide/webhooks/feishu.md",2190],"95b29058":[()=>Promise.all([n.e(532),n.e(3115)]).then(n.bind(n,46)),"@site/versioned_docs/version-5.1.0/self-hosted/reverse-proxies.mdx",46],"979376ed":[()=>n.e(8642).then(n.t.bind(n,8300,19)),"~docs/default/version-5-1-0-metadata-prop-3a5.json",8300],"98c3c2c5":[()=>n.e(4246).then(n.t.bind(n,323,19)),"~docs/default/category-docs-510-selfhosted-category-deployment-090.json",323],99707007:[()=>n.e(3850).then(n.bind(n,5716)),"@site/versioned_docs/version-5.2.0/user-guide/administrator/monitoring/system-info.mdx",5716],"99e3e97f":[()=>n.e(7157).then(n.bind(n,6608)),"@site/docs/user-guide/best_practices.md",6608],"9a9c7ed9":[()=>n.e(1884).then(n.bind(n,5388)),"@site/versioned_docs/version-5.1.0/developer-guide/fastlane/zealot_version_check.md",5388],"9ac08042":[()=>n.e(860).then(n.bind(n,1399)),"@site/versioned_docs/version-5.2.0/user-guide/webhooks/dingtalk.md",1399],"9b58cf90":[()=>Promise.all([n.e(532),n.e(5308)]).then(n.bind(n,9522)),"@site/versioned_docs/version-5.1.0/developer-guide/sdk/ios.md",9522],"9c3aeab1":[()=>n.e(2011).then(n.t.bind(n,5734,19)),"~docs/default/category-docs-4-x-userguide-category-administrator-4f8.json",5734],"9d2c8d89":[()=>n.e(2820).then(n.bind(n,1737)),"@site/versioned_docs/version-5.0.0/self-hosted/deployment/architecture.mdx",1737],"9da9701d":[()=>n.e(5783).then(n.bind(n,5480)),"@site/docs/user-guide/administrator/backup.mdx",5480],"9e3eaffa":[()=>n.e(5728).then(n.bind(n,8945)),"@site/versioned_docs/version-4.x/user-guide/webhooks/dingtalk.md",8945],a087da7b:[()=>n.e(7042).then(n.bind(n,827)),"@site/versioned_docs/version-5.0.0/self-hosted/configuration/schedule-jobs.md",827],a1f04802:[()=>n.e(411).then(n.bind(n,8425)),"@site/versioned_docs/version-5.0.0/developer-guide/fastlane/zealot.md",8425],a25253bf:[()=>Promise.all([n.e(532),n.e(6047)]).then(n.bind(n,5884)),"@site/versioned_docs/version-5.1.0/contributing-guide/local-development/devcontainer.md",5884],a46eded5:[()=>n.e(6593).then(n.bind(n,803)),"@site/versioned_docs/version-5.1.0/self-hosted/deployment/docker/step-by-step.md",803],a6756b1f:[()=>n.e(6092).then(n.bind(n,899)),"@site/versioned_docs/version-5.1.0/user-guide/administrator/backup.mdx",899],a7227298:[()=>n.e(3844).then(n.bind(n,2865)),"@site/versioned_docs/version-5.0.0/user-guide/webhooks/slack.md",2865],a7434565:[()=>n.e(7645).then(n.t.bind(n,5745,19)),"/home/runner/work/docs/docs/.docusaurus/docusaurus-plugin-content-pages/default/plugin-route-context-module-100.json",5745],a7bd4aaa:[()=>n.e(8518).then(n.bind(n,8564)),"@theme/DocVersionRoot",8564],a8003ee7:[()=>n.e(2530).then(n.bind(n,2982)),"@site/versioned_docs/version-5.0.0/user-guide/administrator/apple-team.mdx",2982],a86b8a96:[()=>n.e(572).then(n.bind(n,418)),"@site/versioned_docs/version-5.0.0/user-guide/debug-files/upload.mdx",418],a91d24a4:[()=>n.e(8754).then(n.bind(n,2103)),"@site/versioned_docs/version-5.2.0/developer-guide/index.md",2103],a94703ab:[()=>Promise.all([n.e(532),n.e(4368)]).then(n.bind(n,2674)),"@theme/DocRoot",2674],a949db22:[()=>n.e(3057).then(n.bind(n,6914)),"@site/versioned_docs/version-4.x/user-guide/administrator/project-settings.md",6914],aaab4dd5:[()=>n.e(9656).then(n.bind(n,2134)),"@site/docs/developer-guide/api/debug_files.md",2134],aaf543f1:[()=>n.e(2143).then(n.bind(n,1532)),"@site/versioned_docs/version-5.0.0/self-hosted/deployment/railway.md",1532],aaf82ead:[()=>n.e(884).then(n.bind(n,3869)),"@site/docs/user-guide/debug-files/review.mdx",3869],ab71d4e1:[()=>n.e(9710).then(n.t.bind(n,4191,19)),"~docs/default/category-docsnext-selfhosted-category-deployment-fed.json",4191],aceb8a36:[()=>n.e(81).then(n.t.bind(n,1956,19)),"~docs/default/category-docs-userguide-category-toolkits-2ac.json",1956],ad4ca79f:[()=>n.e(2966).then(n.bind(n,174)),"@site/versioned_docs/version-4.x/developer-guide/fastlane/zealot_sync_devices.md",174],adf2c0d2:[()=>n.e(4596).then(n.bind(n,7969)),"@site/docs/developer-guide/fastlane.md",7969],aecd11f5:[()=>Promise.all([n.e(532),n.e(4429)]).then(n.bind(n,7504)),"@site/versioned_docs/version-4.x/developer-guide/sdk/android.md",7504],aef75111:[()=>n.e(3084).then(n.bind(n,444)),"@site/versioned_docs/version-5.0.0/user-guide/index.mdx",444],b03e7fdf:[()=>n.e(6359).then(n.bind(n,6866)),"@site/versioned_docs/version-5.1.0/self-hosted/index.md",6866],b272fba4:[()=>n.e(5803).then(n.bind(n,8580)),"@site/versioned_docs/version-4.x/self-hosted/deployment/railway.md",8580],b4e44ac6:[()=>n.e(9184).then(n.bind(n,5560)),"@site/docs/self-hosted/deployment/kubernetes.md",5560],b5008855:[()=>n.e(5538).then(n.bind(n,5965)),"@site/versioned_docs/version-5.1.0/self-hosted/deployment/fly.md",5965],b56911e0:[()=>n.e(2621).then(n.bind(n,3067)),"@site/versioned_docs/version-5.0.0/developer-guide/api/debug_files.md",3067],b5e1e414:[()=>n.e(9100).then(n.bind(n,3075)),"@site/versioned_docs/version-4.x/user-guide/webhooks/slack.md",3075],b7ca75af:[()=>n.e(6295).then(n.bind(n,9315)),"@site/versioned_docs/version-5.0.0/developer-guide/fastlane/zealot_debug_file.md",9315],b8b76bfb:[()=>n.e(8901).then(n.bind(n,9149)),"@site/versioned_docs/version-5.0.0/self-hosted/deployment/nomad.md",9149],b958ca3b:[()=>n.e(1016).then(n.bind(n,8640)),"@site/versioned_docs/version-5.2.0/self-hosted/configuration/environment-variables.md",8640],b9de103e:[()=>n.e(3171).then(n.t.bind(n,5295,19)),"~docs/default/category-docs-4-x-selfhosted-category-deployment-eef.json",5295],bbec0ea8:[()=>n.e(4011).then(n.bind(n,8799)),"@site/versioned_docs/version-4.x/user-guide/toolkits/teardown.md",8799],bc9a5c2d:[()=>n.e(8958).then(n.bind(n,141)),"@site/docs/developer-guide/fastlane/zealot_version_check.md",141],bc9d66cc:[()=>n.e(2438).then(n.bind(n,3998)),"@site/versioned_docs/version-5.0.0/self-hosted/index.md",3998],bdc68495:[()=>n.e(3618).then(n.t.bind(n,4040,19)),"~docs/default/category-docs-userguide-category-administrator-395.json",4040],bdd7b463:[()=>n.e(5309).then(n.t.bind(n,9898,19)),"~docs/default/category-docsnext-userguide-category-monitoring-339.json",9898],bf0a73a8:[()=>n.e(2209).then(n.bind(n,4434)),"@site/versioned_docs/version-5.0.0/user-guide/administrator/backup.mdx",4434],bf6ff0a4:[()=>n.e(1120).then(n.bind(n,1253)),"@site/versioned_docs/version-4.x/user-guide/administrator/monitoring/database-analytics.md",1253],c01945e0:[()=>n.e(5705).then(n.bind(n,5721)),"@site/versioned_docs/version-4.x/developer-guide/fastlane/zealot.md",5721],c02123b5:[()=>Promise.all([n.e(532),n.e(3877)]).then(n.bind(n,7460)),"@site/versioned_docs/version-4.x/contributing-guide/local-development/source-code.md",7460],c0aa555d:[()=>n.e(4985).then(n.bind(n,3268)),"@site/versioned_docs/version-4.x/user-guide/webhooks/feishu.md",3268],c1b1e96e:[()=>n.e(1644).then(n.bind(n,5098)),"@site/versioned_docs/version-5.2.0/developer-guide/api.md",5098],c23a205f:[()=>n.e(4019).then(n.bind(n,4462)),"@site/versioned_docs/version-5.1.0/self-hosted/deployment/railway.md",4462],c3e055b8:[()=>n.e(7681).then(n.bind(n,5296)),"@site/versioned_docs/version-5.0.0/developer-guide/api/apps.md",5296],c4f5d8e4:[()=>Promise.all([n.e(532),n.e(4195)]).then(n.bind(n,3261)),"@site/src/pages/index.js",3261],c504a8bc:[()=>n.e(4022).then(n.t.bind(n,9916,19)),"~docs/default/category-docs-500-userguide-category-administrator-b26.json",9916],c53e755e:[()=>n.e(7322).then(n.bind(n,9198)),"@site/docs/user-guide/changelog.md",9198],c5b0ab6a:[()=>Promise.all([n.e(532),n.e(9396)]).then(n.bind(n,8434)),"@site/docs/developer-guide/sdk/ios.md",8434],c6435c3a:[()=>n.e(6724).then(n.bind(n,2274)),"@site/versioned_docs/version-5.2.0/developer-guide/fastlane.md",2274],c6ff6c23:[()=>n.e(8022).then(n.t.bind(n,168,19)),"~docs/default/category-docs-510-userguide-category-monitoring-a6e.json",168],c8054fdf:[()=>n.e(251).then(n.t.bind(n,7120,19)),"~docs/default/category-docsnext-userguide-category-toolkits-eb7.json",7120],c94f5806:[()=>n.e(1394).then(n.bind(n,5035)),"@site/versioned_docs/version-5.0.0/user-guide/administrator/settings.mdx",5035],c9b278a8:[()=>n.e(9181).then(n.t.bind(n,5e3,19)),"~docs/default/version-5-0-0-metadata-prop-0b8.json",5e3],c9fa300e:[()=>n.e(7466).then(n.bind(n,5133)),"@site/versioned_docs/version-4.x/developer-guide/fastlane.md",5133],cab814a1:[()=>n.e(9699).then(n.bind(n,9997)),"@site/versioned_docs/version-5.1.0/user-guide/debug-files/review.mdx",9997],cae0f04b:[()=>n.e(5709).then(n.t.bind(n,4166,19)),"~docs/default/version-4-x-metadata-prop-21f.json",4166],cbd66d5e:[()=>n.e(7415).then(n.t.bind(n,3166,19)),"~docs/default/category-docs-500-contributingguide-category-local-development-fbf.json",3166],ccfedec8:[()=>n.e(2743).then(n.t.bind(n,30,19)),"~docs/default/category-docs-500-userguide-category-toolkits-702.json",30],cd085125:[()=>n.e(1649).then(n.bind(n,6557)),"@site/docs/user-guide/administrator/monitoring/database-analytics.mdx",6557],cd4cb2e3:[()=>n.e(1485).then(n.bind(n,3244)),"@site/versioned_docs/version-5.2.0/developer-guide/fastlane/zealot_version_check.md",3244],cd4eb1ed:[()=>n.e(5260).then(n.t.bind(n,5812,19)),"~docs/default/category-docs-4-x-contributingguide-category-local-development-9ee.json",5812],cf2f55b0:[()=>n.e(3190).then(n.bind(n,293)),"@site/versioned_docs/version-5.2.0/user-guide/webhooks/feishu.md",293],cf9f3cda:[()=>n.e(3836).then(n.bind(n,4914)),"@site/versioned_docs/version-5.2.0/contributing-guide/index.md",4914],d02aa106:[()=>n.e(4590).then(n.bind(n,1390)),"@site/versioned_docs/version-5.0.0/user-guide/administrator/project-settings.md",1390],d0844726:[()=>n.e(5537).then(n.bind(n,7414)),"@site/versioned_docs/version-5.1.0/user-guide/webhooks/dingtalk.md",7414],d0946d0a:[()=>n.e(5338).then(n.bind(n,7038)),"@site/versioned_docs/version-5.2.0/self-hosted/deployment/kubernetes.md",7038],d1780259:[()=>n.e(6490).then(n.bind(n,3566)),"@site/versioned_docs/version-5.1.0/user-guide/best_practices.md",3566],d1dd54d0:[()=>n.e(1591).then(n.bind(n,7819)),"@site/docs/developer-guide/fastlane/zealot_debug_file.md",7819],d361e160:[()=>n.e(1802).then(n.t.bind(n,2384,19)),"~docs/default/category-docs-500-userguide-category-debug-files-87c.json",2384],d48f303d:[()=>n.e(4148).then(n.t.bind(n,2247,19)),"~docs/default/version-5-2-0-metadata-prop-707.json",2247],d4be948d:[()=>n.e(5610).then(n.bind(n,747)),"@site/docs/self-hosted/deployment/architecture.mdx",747],d500f699:[()=>n.e(7380).then(n.bind(n,6500)),"@site/versioned_docs/version-5.2.0/user-guide/index.mdx",6500],d5638fd3:[()=>n.e(7106).then(n.bind(n,7376)),"@site/versioned_docs/version-5.1.0/self-hosted/deployment/requirements.md",7376],d59c50f6:[()=>n.e(4587).then(n.t.bind(n,3534,19)),"~docs/default/category-docsnext-selfhosted-category-cloud-provider-guides-cdc.json",3534],d64a1c62:[()=>Promise.all([n.e(532),n.e(608)]).then(n.bind(n,8848)),"@site/versioned_docs/version-5.2.0/contributing-guide/local-development/source-code.md",8848],da03b20b:[()=>n.e(4771).then(n.bind(n,2537)),"@site/versioned_docs/version-5.0.0/user-guide/administrator/monitoring/background-jobs.mdx",2537],db37eded:[()=>n.e(7702).then(n.bind(n,4251)),"@site/versioned_docs/version-5.0.0/user-guide/qa.md",4251],db742c3c:[()=>n.e(1525).then(n.bind(n,346)),"@site/versioned_docs/version-5.2.0/user-guide/changelog.md",346],dc453add:[()=>n.e(9051).then(n.bind(n,3229)),"@site/versioned_docs/version-5.2.0/user-guide/administrator/apple-team.mdx",3229],dcddbff0:[()=>n.e(1004).then(n.bind(n,1087)),"@site/versioned_docs/version-5.1.0/user-guide/apps/upload.mdx",1087],dd05d4e3:[()=>n.e(4604).then(n.bind(n,365)),"@site/docs/self-hosted/deployment/nomad.md",365],ddf401e0:[()=>n.e(6984).then(n.bind(n,4427)),"@site/versioned_docs/version-4.x/self-hosted/deployment/render.md",4427],df11c872:[()=>n.e(3051).then(n.bind(n,4285)),"@site/versioned_docs/version-5.2.0/user-guide/administrator/monitoring/background-jobs.mdx",4285],e00b100a:[()=>n.e(2103).then(n.bind(n,5674)),"@site/versioned_docs/version-5.1.0/user-guide/credits.md",5674],e0ad0483:[()=>n.e(974).then(n.bind(n,3018)),"@site/versioned_docs/version-5.2.0/self-hosted/deployment/nomad.md",3018],e1ae4bd8:[()=>n.e(807).then(n.t.bind(n,3752,19)),"~docs/default/category-docs-500-selfhosted-category-deployment-f23.json",3752],e239d5d6:[()=>n.e(2717).then(n.bind(n,1591)),"@site/versioned_docs/version-5.1.0/user-guide/webhooks/slack.md",1591],e2af3521:[()=>n.e(890).then(n.t.bind(n,8647,19)),"~docs/default/category-docs-500-selfhosted-category-configuration-2fe.json",8647],e3b44675:[()=>n.e(7354).then(n.bind(n,9542)),"@site/versioned_docs/version-5.1.0/developer-guide/index.md",9542],e3c59cf5:[()=>Promise.all([n.e(532),n.e(2052)]).then(n.bind(n,8974)),"@site/versioned_docs/version-5.1.0/contributing-guide/local-development/source-code.md",8974],e40683f4:[()=>n.e(9014).then(n.bind(n,1666)),"@site/versioned_docs/version-4.x/user-guide/webhooks.md",1666],e532b6bb:[()=>n.e(5545).then(n.bind(n,6845)),"@site/versioned_docs/version-5.0.0/user-guide/administrator/monitoring/system-info.mdx",6845],e5cd0e52:[()=>n.e(8130).then(n.bind(n,3094)),"@site/versioned_docs/version-5.1.0/user-guide/administrator/settings.mdx",3094],e619d213:[()=>n.e(7846).then(n.bind(n,8612)),"@site/versioned_docs/version-5.1.0/developer-guide/api/apps.md",8612],e6546d07:[()=>n.e(9611).then(n.bind(n,9696)),"@site/versioned_docs/version-5.0.0/self-hosted/deployment/requirements.md",9696],e6f7e927:[()=>n.e(6453).then(n.bind(n,7858)),"@site/versioned_docs/version-5.1.0/user-guide/toolkits/fetch-udid.mdx",7858],e7a8c7f9:[()=>n.e(777).then(n.bind(n,8374)),"@site/versioned_docs/version-4.x/developer-guide/fastlane/zealot_version_check.md",8374],e7bace76:[()=>n.e(8791).then(n.bind(n,3471)),"@site/versioned_docs/version-5.2.0/self-hosted/deployment/docker.md",3471],e92f4833:[()=>n.e(4159).then(n.bind(n,6705)),"@site/docs/user-guide/qa.md",6705],ea003b3f:[()=>n.e(7787).then(n.bind(n,8558)),"@site/versioned_docs/version-4.x/developer-guide/fastlane/zealot_debug_file.md",8558],eb2d718d:[()=>n.e(475).then(n.bind(n,6829)),"@site/docs/user-guide/credits.md",6829],ed7ff2b3:[()=>n.e(5846).then(n.bind(n,2558)),"@site/versioned_docs/version-5.2.0/self-hosted/deployment/railway.md",2558],ede4b0bb:[()=>n.e(7070).then(n.bind(n,1259)),"@site/docs/developer-guide/fastlane/zealot.md",1259],ef294a35:[()=>n.e(1643).then(n.t.bind(n,4995,19)),"~docs/default/category-docsnext-developerguide-category-sdks-aef.json",4995],ef513ce2:[()=>n.e(4802).then(n.bind(n,1833)),"@site/versioned_docs/version-4.x/self-hosted/deployment/nomad.md",1833],ef7c3aa9:[()=>n.e(4710).then(n.bind(n,6538)),"@site/versioned_docs/version-5.2.0/user-guide/administrator/permissions.md",6538],f02d2d32:[()=>n.e(7276).then(n.bind(n,3503)),"@site/docs/developer-guide/api/apps.md",3503],f0954aa2:[()=>n.e(7779).then(n.bind(n,2456)),"@site/versioned_docs/version-5.0.0/user-guide/changelog.md",2456],f1b0b6d8:[()=>n.e(8486).then(n.t.bind(n,3158,19)),"~docs/default/category-docs-510-userguide-category-toolkits-0f2.json",3158],f1c75242:[()=>n.e(2996).then(n.bind(n,8279)),"@site/versioned_docs/version-5.1.0/user-guide/dashboard.md",8279],f2e43f85:[()=>n.e(9588).then(n.bind(n,1209)),"@site/versioned_docs/version-5.2.0/user-guide/dashboard.md",1209],f3108074:[()=>n.e(6118).then(n.bind(n,895)),"@site/docs/user-guide/webhooks/dingtalk.md",895],f55eae9a:[()=>Promise.all([n.e(532),n.e(9166)]).then(n.bind(n,3544)),"@site/versioned_docs/version-5.1.0/developer-guide/sdk/android.md",3544],f5a9cb0f:[()=>n.e(5990).then(n.t.bind(n,5213,19)),"~docs/default/category-docs-500-userguide-category-apps-7c1.json",5213],f6a4c755:[()=>n.e(6787).then(n.bind(n,7872)),"@site/versioned_docs/version-5.0.0/user-guide/apps/index.mdx",7872],f867ef04:[()=>n.e(6819).then(n.bind(n,1380)),"@site/versioned_docs/version-5.1.0/user-guide/apps/detail.mdx",1380],f86f7413:[()=>n.e(2774).then(n.bind(n,1191)),"@site/versioned_docs/version-5.2.0/user-guide/qa.md",1191],f8a75f5e:[()=>Promise.all([n.e(532),n.e(5787)]).then(n.bind(n,7424)),"@site/versioned_docs/version-4.x/self-hosted/reverse-proxies.mdx",7424],f8b3d075:[()=>n.e(5670).then(n.bind(n,669)),"@site/versioned_docs/version-5.2.0/developer-guide/fastlane/zealot.md",669],f8e38d3d:[()=>n.e(2107).then(n.bind(n,7401)),"@site/docs/self-hosted/deployment/railway.md",7401],f906dd81:[()=>n.e(9154).then(n.bind(n,5749)),"@site/docs/user-guide/apps/upload.mdx",5749],f90fa3e0:[()=>n.e(3630).then(n.bind(n,8852)),"@site/docs/self-hosted/configuration/environment-variables.md",8852],f944a33e:[()=>n.e(5218).then(n.bind(n,2616)),"@site/versioned_docs/version-5.0.0/user-guide/webhooks/wecom.md",2616],f9b37612:[()=>n.e(1627).then(n.bind(n,5336)),"@site/versioned_docs/version-4.x/developer-guide/api/debug_files.md",5336],fa199c0f:[()=>n.e(8575).then(n.bind(n,6561)),"@site/docs/self-hosted/deployment/docker/step-by-step.md",6561],fb7a7e13:[()=>n.e(9019).then(n.bind(n,1291)),"@site/versioned_docs/version-4.x/self-hosted/index.md",1291],fe140d6b:[()=>n.e(5306).then(n.bind(n,222)),"@site/docs/user-guide/webhooks/discord.md",222],fe4d1fcf:[()=>n.e(260).then(n.bind(n,4426)),"@site/versioned_docs/version-5.0.0/user-guide/webhooks.md",4426],fe6331dc:[()=>n.e(2242).then(n.t.bind(n,5978,19)),"~docs/default/category-docs-4-x-developerguide-category-sdks-75e.json",5978],ffe7faed:[()=>n.e(1037).then(n.bind(n,3088)),"@site/versioned_docs/version-5.2.0/user-guide/administrator/monitoring/logging.mdx",3088]};var i=n(5893);function d(e){let{error:t,retry:n,pastDelay:o}=e;return t?(0,i.jsxs)("div",{style:{textAlign:"center",color:"#fff",backgroundColor:"#fa383e",borderColor:"#fa383e",borderStyle:"solid",borderRadius:"0.25rem",borderWidth:"1px",boxSizing:"border-box",display:"block",padding:"1rem",flex:"0 0 50%",marginLeft:"25%",marginRight:"25%",marginTop:"5rem",maxWidth:"50%",width:"100%"},children:[(0,i.jsx)("p",{children:String(t)}),(0,i.jsx)("div",{children:(0,i.jsx)("button",{type:"button",onClick:n,children:"Retry"})})]}):o?(0,i.jsx)("div",{style:{display:"flex",justifyContent:"center",alignItems:"center",height:"100vh"},children:(0,i.jsx)("svg",{id:"loader",style:{width:128,height:110,position:"absolute",top:"calc(100vh - 64%)"},viewBox:"0 0 45 45",xmlns:"http://www.w3.org/2000/svg",stroke:"#61dafb",children:(0,i.jsxs)("g",{fill:"none",fillRule:"evenodd",transform:"translate(1 1)",strokeWidth:"2",children:[(0,i.jsxs)("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0",children:[(0,i.jsx)("animate",{attributeName:"r",begin:"1.5s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),(0,i.jsx)("animate",{attributeName:"stroke-opacity",begin:"1.5s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),(0,i.jsx)("animate",{attributeName:"stroke-width",begin:"1.5s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})]}),(0,i.jsxs)("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0",children:[(0,i.jsx)("animate",{attributeName:"r",begin:"3s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),(0,i.jsx)("animate",{attributeName:"stroke-opacity",begin:"3s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),(0,i.jsx)("animate",{attributeName:"stroke-width",begin:"3s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})]}),(0,i.jsx)("circle",{cx:"22",cy:"22",r:"8",children:(0,i.jsx)("animate",{attributeName:"r",begin:"0s",dur:"1.5s",values:"6;1;2;3;4;5;6",calcMode:"linear",repeatCount:"indefinite"})})]})})}):null}var l=n(9670),c=n(226);function u(e,t){if("*"===e)return r()({loading:d,loader:()=>n.e(1772).then(n.bind(n,1772)),modules:["@theme/NotFound"],webpack:()=>[1772],render(e,t){const n=e.default;return(0,i.jsx)(c.z,{value:{plugin:{name:"native",id:"default"}},children:(0,i.jsx)(n,{...t})})}});const o=s[`${e}-${t}`],u={},p=[],f=[],g=(0,l.Z)(o);return Object.entries(g).forEach((e=>{let[t,n]=e;const o=a[n];o&&(u[t]=o[0],p.push(o[1]),f.push(o[2]))})),r().Map({loading:d,loader:u,modules:p,webpack:()=>f,render(t,n){const r=JSON.parse(JSON.stringify(o));Object.entries(t).forEach((t=>{let[n,o]=t;const s=o.default;if(!s)throw new Error(`The page component at ${e} doesn't have a default export. This makes it impossible to render anything. Consider default-exporting a React component.`);"object"!=typeof s&&"function"!=typeof s||Object.keys(o).filter((e=>"default"!==e)).forEach((e=>{s[e]=o[e]}));let a=r;const i=n.split(".");i.slice(0,-1).forEach((e=>{a=a[e]})),a[i[i.length-1]]=s}));const s=r.__comp;delete r.__comp;const a=r.__context;return delete r.__context,(0,i.jsx)(c.z,{value:a,children:(0,i.jsx)(s,{...r,...n})})}})}const p=[{path:"/markdown-page",component:u("/markdown-page","9d5"),exact:!0},{path:"/docs",component:u("/docs","8de"),routes:[{path:"/docs/4.x",component:u("/docs/4.x","36b"),routes:[{path:"/docs/4.x",component:u("/docs/4.x","8d1"),routes:[{path:"/docs/4.x/category/administrator",component:u("/docs/4.x/category/administrator","103"),exact:!0,sidebar:"userGuide"},{path:"/docs/4.x/category/apps",component:u("/docs/4.x/category/apps","04a"),exact:!0,sidebar:"userGuide"},{path:"/docs/4.x/category/cloud-provider-guides",component:u("/docs/4.x/category/cloud-provider-guides","f84"),exact:!0,sidebar:"selfHosted"},{path:"/docs/4.x/category/configuration",component:u("/docs/4.x/category/configuration","bbc"),exact:!0,sidebar:"selfHosted"},{path:"/docs/4.x/category/debug-files",component:u("/docs/4.x/category/debug-files","dd6"),exact:!0,sidebar:"userGuide"},{path:"/docs/4.x/category/deployment",component:u("/docs/4.x/category/deployment","469"),exact:!0,sidebar:"selfHosted"},{path:"/docs/4.x/category/local-development",component:u("/docs/4.x/category/local-development","600"),exact:!0,sidebar:"contributingGuide"},{path:"/docs/4.x/category/monitoring",component:u("/docs/4.x/category/monitoring","0aa"),exact:!0,sidebar:"userGuide"},{path:"/docs/4.x/category/sdks",component:u("/docs/4.x/category/sdks","f90"),exact:!0,sidebar:"developerGuide"},{path:"/docs/4.x/category/toolkits",component:u("/docs/4.x/category/toolkits","eeb"),exact:!0,sidebar:"userGuide"},{path:"/docs/4.x/contributing-guide/",component:u("/docs/4.x/contributing-guide/","595"),exact:!0,sidebar:"contributingGuide"},{path:"/docs/4.x/contributing-guide/local-development/devcontainer",component:u("/docs/4.x/contributing-guide/local-development/devcontainer","8a7"),exact:!0,sidebar:"contributingGuide"},{path:"/docs/4.x/contributing-guide/local-development/source-code",component:u("/docs/4.x/contributing-guide/local-development/source-code","9c2"),exact:!0,sidebar:"contributingGuide"},{path:"/docs/4.x/developer-guide/",component:u("/docs/4.x/developer-guide/","ce0"),exact:!0,sidebar:"developerGuide"},{path:"/docs/4.x/developer-guide/api",component:u("/docs/4.x/developer-guide/api","074"),exact:!0,sidebar:"developerGuide"},{path:"/docs/4.x/developer-guide/api/apps",component:u("/docs/4.x/developer-guide/api/apps","213"),exact:!0,sidebar:"developerGuide"},{path:"/docs/4.x/developer-guide/api/debug_files",component:u("/docs/4.x/developer-guide/api/debug_files","632"),exact:!0,sidebar:"developerGuide"},{path:"/docs/4.x/developer-guide/fastlane",component:u("/docs/4.x/developer-guide/fastlane","9ff"),exact:!0,sidebar:"developerGuide"},{path:"/docs/4.x/developer-guide/fastlane/zealot",component:u("/docs/4.x/developer-guide/fastlane/zealot","191"),exact:!0,sidebar:"developerGuide"},{path:"/docs/4.x/developer-guide/fastlane/zealot_debug_file",component:u("/docs/4.x/developer-guide/fastlane/zealot_debug_file","187"),exact:!0,sidebar:"developerGuide"},{path:"/docs/4.x/developer-guide/fastlane/zealot_sync_devices",component:u("/docs/4.x/developer-guide/fastlane/zealot_sync_devices","609"),exact:!0,sidebar:"developerGuide"},{path:"/docs/4.x/developer-guide/fastlane/zealot_version_check",component:u("/docs/4.x/developer-guide/fastlane/zealot_version_check","8f5"),exact:!0,sidebar:"developerGuide"},{path:"/docs/4.x/developer-guide/sdk/android",component:u("/docs/4.x/developer-guide/sdk/android","dd8"),exact:!0,sidebar:"developerGuide"},{path:"/docs/4.x/developer-guide/sdk/ios",component:u("/docs/4.x/developer-guide/sdk/ios","d34"),exact:!0,sidebar:"developerGuide"},{path:"/docs/4.x/self-hosted/",component:u("/docs/4.x/self-hosted/","472"),exact:!0,sidebar:"selfHosted"},{path:"/docs/4.x/self-hosted/configuration/environment-variables",component:u("/docs/4.x/self-hosted/configuration/environment-variables","78e"),exact:!0,sidebar:"selfHosted"},{path:"/docs/4.x/self-hosted/configuration/schedule-jobs",component:u("/docs/4.x/self-hosted/configuration/schedule-jobs","db7"),exact:!0,sidebar:"selfHosted"},{path:"/docs/4.x/self-hosted/configuration/third-party-authentication",component:u("/docs/4.x/self-hosted/configuration/third-party-authentication","8f0"),exact:!0,sidebar:"selfHosted"},{path:"/docs/4.x/self-hosted/deployment/architecture",component:u("/docs/4.x/self-hosted/deployment/architecture","575"),exact:!0,sidebar:"selfHosted"},{path:"/docs/4.x/self-hosted/deployment/docker",component:u("/docs/4.x/self-hosted/deployment/docker","a96"),exact:!0,sidebar:"selfHosted"},{path:"/docs/4.x/self-hosted/deployment/docker/step-by-step",component:u("/docs/4.x/self-hosted/deployment/docker/step-by-step","f5a"),exact:!0,sidebar:"selfHosted"},{path:"/docs/4.x/self-hosted/deployment/fly",component:u("/docs/4.x/self-hosted/deployment/fly","777"),exact:!0,sidebar:"selfHosted"},{path:"/docs/4.x/self-hosted/deployment/kubernetes",component:u("/docs/4.x/self-hosted/deployment/kubernetes","80b"),exact:!0,sidebar:"selfHosted"},{path:"/docs/4.x/self-hosted/deployment/nomad",component:u("/docs/4.x/self-hosted/deployment/nomad","4be"),exact:!0,sidebar:"selfHosted"},{path:"/docs/4.x/self-hosted/deployment/railway",component:u("/docs/4.x/self-hosted/deployment/railway","6d9"),exact:!0,sidebar:"selfHosted"},{path:"/docs/4.x/self-hosted/deployment/render",component:u("/docs/4.x/self-hosted/deployment/render","23a"),exact:!0,sidebar:"selfHosted"},{path:"/docs/4.x/self-hosted/deployment/requirements",component:u("/docs/4.x/self-hosted/deployment/requirements","9ee"),exact:!0,sidebar:"selfHosted"},{path:"/docs/4.x/self-hosted/deployment/source-code",component:u("/docs/4.x/self-hosted/deployment/source-code","2e3"),exact:!0,sidebar:"selfHosted"},{path:"/docs/4.x/self-hosted/reverse-proxies",component:u("/docs/4.x/self-hosted/reverse-proxies","c94"),exact:!0,sidebar:"selfHosted"},{path:"/docs/4.x/self-hosted/storage",component:u("/docs/4.x/self-hosted/storage","d32"),exact:!0,sidebar:"selfHosted"},{path:"/docs/4.x/user-guide/",component:u("/docs/4.x/user-guide/","814"),exact:!0,sidebar:"userGuide"},{path:"/docs/4.x/user-guide/administrator/apple-team",component:u("/docs/4.x/user-guide/administrator/apple-team","a72"),exact:!0,sidebar:"userGuide"},{path:"/docs/4.x/user-guide/administrator/backup",component:u("/docs/4.x/user-guide/administrator/backup","846"),exact:!0,sidebar:"userGuide"},{path:"/docs/4.x/user-guide/administrator/monitoring/background-jobs",component:u("/docs/4.x/user-guide/administrator/monitoring/background-jobs","7ea"),exact:!0,sidebar:"userGuide"},{path:"/docs/4.x/user-guide/administrator/monitoring/database-analytics",component:u("/docs/4.x/user-guide/administrator/monitoring/database-analytics","671"),exact:!0,sidebar:"userGuide"},{path:"/docs/4.x/user-guide/administrator/monitoring/logging",component:u("/docs/4.x/user-guide/administrator/monitoring/logging","578"),exact:!0,sidebar:"userGuide"},{path:"/docs/4.x/user-guide/administrator/monitoring/system-info",component:u("/docs/4.x/user-guide/administrator/monitoring/system-info","b65"),exact:!0,sidebar:"userGuide"},{path:"/docs/4.x/user-guide/administrator/permissions",component:u("/docs/4.x/user-guide/administrator/permissions","adb"),exact:!0,sidebar:"userGuide"},{path:"/docs/4.x/user-guide/administrator/project-settings",component:u("/docs/4.x/user-guide/administrator/project-settings","3b3"),exact:!0},{path:"/docs/4.x/user-guide/apps/create",component:u("/docs/4.x/user-guide/apps/create","af8"),exact:!0,sidebar:"userGuide"},{path:"/docs/4.x/user-guide/best_practices",component:u("/docs/4.x/user-guide/best_practices","fd7"),exact:!0,sidebar:"userGuide"},{path:"/docs/4.x/user-guide/changelog",component:u("/docs/4.x/user-guide/changelog","88f"),exact:!0,sidebar:"userGuide"},{path:"/docs/4.x/user-guide/credits",component:u("/docs/4.x/user-guide/credits","2b3"),exact:!0,sidebar:"userGuide"},{path:"/docs/4.x/user-guide/dashboard",component:u("/docs/4.x/user-guide/dashboard","70e"),exact:!0,sidebar:"userGuide"},{path:"/docs/4.x/user-guide/debug-files/upload",component:u("/docs/4.x/user-guide/debug-files/upload","03e"),exact:!0,sidebar:"userGuide"},{path:"/docs/4.x/user-guide/qa",component:u("/docs/4.x/user-guide/qa","67e"),exact:!0,sidebar:"userGuide"},{path:"/docs/4.x/user-guide/toolkits/fetch-udid",component:u("/docs/4.x/user-guide/toolkits/fetch-udid","b2a"),exact:!0,sidebar:"userGuide"},{path:"/docs/4.x/user-guide/toolkits/teardown",component:u("/docs/4.x/user-guide/toolkits/teardown","8c8"),exact:!0,sidebar:"userGuide"},{path:"/docs/4.x/user-guide/webhooks",component:u("/docs/4.x/user-guide/webhooks","322"),exact:!0,sidebar:"userGuide"},{path:"/docs/4.x/user-guide/webhooks/dingtalk",component:u("/docs/4.x/user-guide/webhooks/dingtalk","54a"),exact:!0,sidebar:"userGuide"},{path:"/docs/4.x/user-guide/webhooks/discord",component:u("/docs/4.x/user-guide/webhooks/discord","e9c"),exact:!0,sidebar:"userGuide"},{path:"/docs/4.x/user-guide/webhooks/feishu",component:u("/docs/4.x/user-guide/webhooks/feishu","670"),exact:!0,sidebar:"userGuide"},{path:"/docs/4.x/user-guide/webhooks/slack",component:u("/docs/4.x/user-guide/webhooks/slack","815"),exact:!0,sidebar:"userGuide"},{path:"/docs/4.x/user-guide/webhooks/wecom",component:u("/docs/4.x/user-guide/webhooks/wecom","8ae"),exact:!0,sidebar:"userGuide"}]}]},{path:"/docs/5.0.0",component:u("/docs/5.0.0","78c"),routes:[{path:"/docs/5.0.0",component:u("/docs/5.0.0","d4d"),routes:[{path:"/docs/5.0.0/category/administrator",component:u("/docs/5.0.0/category/administrator","3be"),exact:!0,sidebar:"userGuide"},{path:"/docs/5.0.0/category/apps",component:u("/docs/5.0.0/category/apps","c3e"),exact:!0,sidebar:"userGuide"},{path:"/docs/5.0.0/category/cloud-provider-guides",component:u("/docs/5.0.0/category/cloud-provider-guides","860"),exact:!0,sidebar:"selfHosted"},{path:"/docs/5.0.0/category/configuration",component:u("/docs/5.0.0/category/configuration","891"),exact:!0,sidebar:"selfHosted"},{path:"/docs/5.0.0/category/debug-files",component:u("/docs/5.0.0/category/debug-files","c12"),exact:!0,sidebar:"userGuide"},{path:"/docs/5.0.0/category/deployment",component:u("/docs/5.0.0/category/deployment","0e0"),exact:!0,sidebar:"selfHosted"},{path:"/docs/5.0.0/category/local-development",component:u("/docs/5.0.0/category/local-development","aa5"),exact:!0,sidebar:"contributingGuide"},{path:"/docs/5.0.0/category/monitoring",component:u("/docs/5.0.0/category/monitoring","abe"),exact:!0,sidebar:"userGuide"},{path:"/docs/5.0.0/category/sdks",component:u("/docs/5.0.0/category/sdks","719"),exact:!0,sidebar:"developerGuide"},{path:"/docs/5.0.0/category/toolkits",component:u("/docs/5.0.0/category/toolkits","205"),exact:!0,sidebar:"userGuide"},{path:"/docs/5.0.0/contributing-guide/",component:u("/docs/5.0.0/contributing-guide/","68d"),exact:!0,sidebar:"contributingGuide"},{path:"/docs/5.0.0/contributing-guide/local-development/devcontainer",component:u("/docs/5.0.0/contributing-guide/local-development/devcontainer","310"),exact:!0,sidebar:"contributingGuide"},{path:"/docs/5.0.0/contributing-guide/local-development/source-code",component:u("/docs/5.0.0/contributing-guide/local-development/source-code","10e"),exact:!0,sidebar:"contributingGuide"},{path:"/docs/5.0.0/developer-guide/",component:u("/docs/5.0.0/developer-guide/","fce"),exact:!0,sidebar:"developerGuide"},{path:"/docs/5.0.0/developer-guide/api",component:u("/docs/5.0.0/developer-guide/api","ce2"),exact:!0,sidebar:"developerGuide"},{path:"/docs/5.0.0/developer-guide/api/apps",component:u("/docs/5.0.0/developer-guide/api/apps","093"),exact:!0,sidebar:"developerGuide"},{path:"/docs/5.0.0/developer-guide/api/debug_files",component:u("/docs/5.0.0/developer-guide/api/debug_files","49d"),exact:!0,sidebar:"developerGuide"},{path:"/docs/5.0.0/developer-guide/fastlane",component:u("/docs/5.0.0/developer-guide/fastlane","e89"),exact:!0,sidebar:"developerGuide"},{path:"/docs/5.0.0/developer-guide/fastlane/zealot",component:u("/docs/5.0.0/developer-guide/fastlane/zealot","97f"),exact:!0,sidebar:"developerGuide"},{path:"/docs/5.0.0/developer-guide/fastlane/zealot_debug_file",component:u("/docs/5.0.0/developer-guide/fastlane/zealot_debug_file","efa"),exact:!0,sidebar:"developerGuide"},{path:"/docs/5.0.0/developer-guide/fastlane/zealot_sync_devices",component:u("/docs/5.0.0/developer-guide/fastlane/zealot_sync_devices","a77"),exact:!0,sidebar:"developerGuide"},{path:"/docs/5.0.0/developer-guide/fastlane/zealot_version_check",component:u("/docs/5.0.0/developer-guide/fastlane/zealot_version_check","7e7"),exact:!0,sidebar:"developerGuide"},{path:"/docs/5.0.0/developer-guide/sdk/android",component:u("/docs/5.0.0/developer-guide/sdk/android","939"),exact:!0,sidebar:"developerGuide"},{path:"/docs/5.0.0/developer-guide/sdk/ios",component:u("/docs/5.0.0/developer-guide/sdk/ios","aec"),exact:!0,sidebar:"developerGuide"},{path:"/docs/5.0.0/self-hosted/",component:u("/docs/5.0.0/self-hosted/","3d6"),exact:!0,sidebar:"selfHosted"},{path:"/docs/5.0.0/self-hosted/configuration/environment-variables",component:u("/docs/5.0.0/self-hosted/configuration/environment-variables","c9e"),exact:!0,sidebar:"selfHosted"},{path:"/docs/5.0.0/self-hosted/configuration/schedule-jobs",component:u("/docs/5.0.0/self-hosted/configuration/schedule-jobs","18a"),exact:!0,sidebar:"selfHosted"},{path:"/docs/5.0.0/self-hosted/configuration/third-party-authentication",component:u("/docs/5.0.0/self-hosted/configuration/third-party-authentication","858"),exact:!0,sidebar:"selfHosted"},{path:"/docs/5.0.0/self-hosted/deployment/architecture",component:u("/docs/5.0.0/self-hosted/deployment/architecture","307"),exact:!0,sidebar:"selfHosted"},{path:"/docs/5.0.0/self-hosted/deployment/docker",component:u("/docs/5.0.0/self-hosted/deployment/docker","f1c"),exact:!0,sidebar:"selfHosted"},{path:"/docs/5.0.0/self-hosted/deployment/docker/step-by-step",component:u("/docs/5.0.0/self-hosted/deployment/docker/step-by-step","f65"),exact:!0,sidebar:"selfHosted"},{path:"/docs/5.0.0/self-hosted/deployment/fly",component:u("/docs/5.0.0/self-hosted/deployment/fly","578"),exact:!0,sidebar:"selfHosted"},{path:"/docs/5.0.0/self-hosted/deployment/kubernetes",component:u("/docs/5.0.0/self-hosted/deployment/kubernetes","b4a"),exact:!0,sidebar:"selfHosted"},{path:"/docs/5.0.0/self-hosted/deployment/nomad",component:u("/docs/5.0.0/self-hosted/deployment/nomad","b19"),exact:!0,sidebar:"selfHosted"},{path:"/docs/5.0.0/self-hosted/deployment/railway",component:u("/docs/5.0.0/self-hosted/deployment/railway","f86"),exact:!0,sidebar:"selfHosted"},{path:"/docs/5.0.0/self-hosted/deployment/render",component:u("/docs/5.0.0/self-hosted/deployment/render","d25"),exact:!0,sidebar:"selfHosted"},{path:"/docs/5.0.0/self-hosted/deployment/requirements",component:u("/docs/5.0.0/self-hosted/deployment/requirements","88b"),exact:!0,sidebar:"selfHosted"},{path:"/docs/5.0.0/self-hosted/deployment/source-code",component:u("/docs/5.0.0/self-hosted/deployment/source-code","50b"),exact:!0,sidebar:"selfHosted"},{path:"/docs/5.0.0/self-hosted/reverse-proxies",component:u("/docs/5.0.0/self-hosted/reverse-proxies","e27"),exact:!0,sidebar:"selfHosted"},{path:"/docs/5.0.0/self-hosted/storage",component:u("/docs/5.0.0/self-hosted/storage","926"),exact:!0,sidebar:"selfHosted"},{path:"/docs/5.0.0/user-guide/",component:u("/docs/5.0.0/user-guide/","9ce"),exact:!0,sidebar:"userGuide"},{path:"/docs/5.0.0/user-guide/administrator/apple-team",component:u("/docs/5.0.0/user-guide/administrator/apple-team","625"),exact:!0,sidebar:"userGuide"},{path:"/docs/5.0.0/user-guide/administrator/backup",component:u("/docs/5.0.0/user-guide/administrator/backup","10e"),exact:!0,sidebar:"userGuide"},{path:"/docs/5.0.0/user-guide/administrator/monitoring/background-jobs",component:u("/docs/5.0.0/user-guide/administrator/monitoring/background-jobs","dc4"),exact:!0,sidebar:"userGuide"},{path:"/docs/5.0.0/user-guide/administrator/monitoring/database-analytics",component:u("/docs/5.0.0/user-guide/administrator/monitoring/database-analytics","f5d"),exact:!0,sidebar:"userGuide"},{path:"/docs/5.0.0/user-guide/administrator/monitoring/logging",component:u("/docs/5.0.0/user-guide/administrator/monitoring/logging","4f9"),exact:!0,sidebar:"userGuide"},{path:"/docs/5.0.0/user-guide/administrator/monitoring/system-info",component:u("/docs/5.0.0/user-guide/administrator/monitoring/system-info","f7d"),exact:!0,sidebar:"userGuide"},{path:"/docs/5.0.0/user-guide/administrator/permissions",component:u("/docs/5.0.0/user-guide/administrator/permissions","258"),exact:!0,sidebar:"userGuide"},{path:"/docs/5.0.0/user-guide/administrator/project-settings",component:u("/docs/5.0.0/user-guide/administrator/project-settings","aad"),exact:!0},{path:"/docs/5.0.0/user-guide/administrator/settings",component:u("/docs/5.0.0/user-guide/administrator/settings","cf0"),exact:!0,sidebar:"userGuide"},{path:"/docs/5.0.0/user-guide/apps/",component:u("/docs/5.0.0/user-guide/apps/","f05"),exact:!0,sidebar:"userGuide"},{path:"/docs/5.0.0/user-guide/apps/create",component:u("/docs/5.0.0/user-guide/apps/create","60d"),exact:!0,sidebar:"userGuide"},{path:"/docs/5.0.0/user-guide/apps/detail",component:u("/docs/5.0.0/user-guide/apps/detail","76b"),exact:!0,sidebar:"userGuide"},{path:"/docs/5.0.0/user-guide/apps/upload",component:u("/docs/5.0.0/user-guide/apps/upload","bcf"),exact:!0,sidebar:"userGuide"},{path:"/docs/5.0.0/user-guide/best_practices",component:u("/docs/5.0.0/user-guide/best_practices","d53"),exact:!0,sidebar:"userGuide"},{path:"/docs/5.0.0/user-guide/changelog",component:u("/docs/5.0.0/user-guide/changelog","f46"),exact:!0,sidebar:"userGuide"},{path:"/docs/5.0.0/user-guide/credits",component:u("/docs/5.0.0/user-guide/credits","12d"),exact:!0,sidebar:"userGuide"},{path:"/docs/5.0.0/user-guide/dashboard",component:u("/docs/5.0.0/user-guide/dashboard","b2b"),exact:!0,sidebar:"userGuide"},{path:"/docs/5.0.0/user-guide/debug-files/",component:u("/docs/5.0.0/user-guide/debug-files/","13e"),exact:!0,sidebar:"userGuide"},{path:"/docs/5.0.0/user-guide/debug-files/review",component:u("/docs/5.0.0/user-guide/debug-files/review","38b"),exact:!0,sidebar:"userGuide"},{path:"/docs/5.0.0/user-guide/debug-files/upload",component:u("/docs/5.0.0/user-guide/debug-files/upload","828"),exact:!0,sidebar:"userGuide"},{path:"/docs/5.0.0/user-guide/qa",component:u("/docs/5.0.0/user-guide/qa","3d5"),exact:!0,sidebar:"userGuide"},{path:"/docs/5.0.0/user-guide/toolkits/fetch-udid",component:u("/docs/5.0.0/user-guide/toolkits/fetch-udid","fd2"),exact:!0,sidebar:"userGuide"},{path:"/docs/5.0.0/user-guide/toolkits/teardown",component:u("/docs/5.0.0/user-guide/toolkits/teardown","80e"),exact:!0,sidebar:"userGuide"},{path:"/docs/5.0.0/user-guide/webhooks",component:u("/docs/5.0.0/user-guide/webhooks","814"),exact:!0,sidebar:"userGuide"},{path:"/docs/5.0.0/user-guide/webhooks/dingtalk",component:u("/docs/5.0.0/user-guide/webhooks/dingtalk","d55"),exact:!0,sidebar:"userGuide"},{path:"/docs/5.0.0/user-guide/webhooks/discord",component:u("/docs/5.0.0/user-guide/webhooks/discord","55c"),exact:!0,sidebar:"userGuide"},{path:"/docs/5.0.0/user-guide/webhooks/feishu",component:u("/docs/5.0.0/user-guide/webhooks/feishu","615"),exact:!0,sidebar:"userGuide"},{path:"/docs/5.0.0/user-guide/webhooks/slack",component:u("/docs/5.0.0/user-guide/webhooks/slack","54b"),exact:!0,sidebar:"userGuide"},{path:"/docs/5.0.0/user-guide/webhooks/wecom",component:u("/docs/5.0.0/user-guide/webhooks/wecom","243"),exact:!0,sidebar:"userGuide"}]}]},{path:"/docs/5.1.0",component:u("/docs/5.1.0","f31"),routes:[{path:"/docs/5.1.0",component:u("/docs/5.1.0","745"),routes:[{path:"/docs/5.1.0/category/administrator",component:u("/docs/5.1.0/category/administrator","71c"),exact:!0,sidebar:"userGuide"},{path:"/docs/5.1.0/category/apps",component:u("/docs/5.1.0/category/apps","3f1"),exact:!0,sidebar:"userGuide"},{path:"/docs/5.1.0/category/cloud-provider-guides",component:u("/docs/5.1.0/category/cloud-provider-guides","a1a"),exact:!0,sidebar:"selfHosted"},{path:"/docs/5.1.0/category/configuration",component:u("/docs/5.1.0/category/configuration","285"),exact:!0,sidebar:"selfHosted"},{path:"/docs/5.1.0/category/debug-files",component:u("/docs/5.1.0/category/debug-files","170"),exact:!0,sidebar:"userGuide"},{path:"/docs/5.1.0/category/deployment",component:u("/docs/5.1.0/category/deployment","d85"),exact:!0,sidebar:"selfHosted"},{path:"/docs/5.1.0/category/local-development",component:u("/docs/5.1.0/category/local-development","b0f"),exact:!0,sidebar:"contributingGuide"},{path:"/docs/5.1.0/category/monitoring",component:u("/docs/5.1.0/category/monitoring","cde"),exact:!0,sidebar:"userGuide"},{path:"/docs/5.1.0/category/sdks",component:u("/docs/5.1.0/category/sdks","522"),exact:!0,sidebar:"developerGuide"},{path:"/docs/5.1.0/category/toolkits",component:u("/docs/5.1.0/category/toolkits","14b"),exact:!0,sidebar:"userGuide"},{path:"/docs/5.1.0/contributing-guide/",component:u("/docs/5.1.0/contributing-guide/","274"),exact:!0,sidebar:"contributingGuide"},{path:"/docs/5.1.0/contributing-guide/local-development/devcontainer",component:u("/docs/5.1.0/contributing-guide/local-development/devcontainer","695"),exact:!0,sidebar:"contributingGuide"},{path:"/docs/5.1.0/contributing-guide/local-development/source-code",component:u("/docs/5.1.0/contributing-guide/local-development/source-code","569"),exact:!0,sidebar:"contributingGuide"},{path:"/docs/5.1.0/developer-guide/",component:u("/docs/5.1.0/developer-guide/","1ed"),exact:!0,sidebar:"developerGuide"},{path:"/docs/5.1.0/developer-guide/api",component:u("/docs/5.1.0/developer-guide/api","1ab"),exact:!0,sidebar:"developerGuide"},{path:"/docs/5.1.0/developer-guide/api/apps",component:u("/docs/5.1.0/developer-guide/api/apps","4fc"),exact:!0,sidebar:"developerGuide"},{path:"/docs/5.1.0/developer-guide/api/debug_files",component:u("/docs/5.1.0/developer-guide/api/debug_files","1f6"),exact:!0,sidebar:"developerGuide"},{path:"/docs/5.1.0/developer-guide/fastlane",component:u("/docs/5.1.0/developer-guide/fastlane","ca2"),exact:!0,sidebar:"developerGuide"},{path:"/docs/5.1.0/developer-guide/fastlane/zealot",component:u("/docs/5.1.0/developer-guide/fastlane/zealot","f18"),exact:!0,sidebar:"developerGuide"},{path:"/docs/5.1.0/developer-guide/fastlane/zealot_debug_file",component:u("/docs/5.1.0/developer-guide/fastlane/zealot_debug_file","c74"),exact:!0,sidebar:"developerGuide"},{path:"/docs/5.1.0/developer-guide/fastlane/zealot_sync_devices",component:u("/docs/5.1.0/developer-guide/fastlane/zealot_sync_devices","d95"),exact:!0,sidebar:"developerGuide"},{path:"/docs/5.1.0/developer-guide/fastlane/zealot_version_check",component:u("/docs/5.1.0/developer-guide/fastlane/zealot_version_check","8be"),exact:!0,sidebar:"developerGuide"},{path:"/docs/5.1.0/developer-guide/sdk/android",component:u("/docs/5.1.0/developer-guide/sdk/android","639"),exact:!0,sidebar:"developerGuide"},{path:"/docs/5.1.0/developer-guide/sdk/ios",component:u("/docs/5.1.0/developer-guide/sdk/ios","18d"),exact:!0,sidebar:"developerGuide"},{path:"/docs/5.1.0/self-hosted/",component:u("/docs/5.1.0/self-hosted/","2b8"),exact:!0,sidebar:"selfHosted"},{path:"/docs/5.1.0/self-hosted/configuration/environment-variables",component:u("/docs/5.1.0/self-hosted/configuration/environment-variables","da2"),exact:!0,sidebar:"selfHosted"},{path:"/docs/5.1.0/self-hosted/configuration/schedule-jobs",component:u("/docs/5.1.0/self-hosted/configuration/schedule-jobs","164"),exact:!0,sidebar:"selfHosted"},{path:"/docs/5.1.0/self-hosted/configuration/third-party-authentication",component:u("/docs/5.1.0/self-hosted/configuration/third-party-authentication","05b"),exact:!0,sidebar:"selfHosted"},{path:"/docs/5.1.0/self-hosted/deployment/architecture",component:u("/docs/5.1.0/self-hosted/deployment/architecture","ed6"),exact:!0,sidebar:"selfHosted"},{path:"/docs/5.1.0/self-hosted/deployment/docker",component:u("/docs/5.1.0/self-hosted/deployment/docker","506"),exact:!0,sidebar:"selfHosted"},{path:"/docs/5.1.0/self-hosted/deployment/docker/step-by-step",component:u("/docs/5.1.0/self-hosted/deployment/docker/step-by-step","d5b"),exact:!0,sidebar:"selfHosted"},{path:"/docs/5.1.0/self-hosted/deployment/fly",component:u("/docs/5.1.0/self-hosted/deployment/fly","ab2"),exact:!0,sidebar:"selfHosted"},{path:"/docs/5.1.0/self-hosted/deployment/kubernetes",component:u("/docs/5.1.0/self-hosted/deployment/kubernetes","3f4"),exact:!0,sidebar:"selfHosted"},{path:"/docs/5.1.0/self-hosted/deployment/nomad",component:u("/docs/5.1.0/self-hosted/deployment/nomad","16f"),exact:!0,sidebar:"selfHosted"},{path:"/docs/5.1.0/self-hosted/deployment/railway",component:u("/docs/5.1.0/self-hosted/deployment/railway","252"),exact:!0,sidebar:"selfHosted"},{path:"/docs/5.1.0/self-hosted/deployment/render",component:u("/docs/5.1.0/self-hosted/deployment/render","b9e"),exact:!0,sidebar:"selfHosted"},{path:"/docs/5.1.0/self-hosted/deployment/requirements",component:u("/docs/5.1.0/self-hosted/deployment/requirements","9da"),exact:!0,sidebar:"selfHosted"},{path:"/docs/5.1.0/self-hosted/deployment/source-code",component:u("/docs/5.1.0/self-hosted/deployment/source-code","5bb"),exact:!0,sidebar:"selfHosted"},{path:"/docs/5.1.0/self-hosted/reverse-proxies",component:u("/docs/5.1.0/self-hosted/reverse-proxies","59f"),exact:!0,sidebar:"selfHosted"},{path:"/docs/5.1.0/self-hosted/storage",component:u("/docs/5.1.0/self-hosted/storage","10b"),exact:!0,sidebar:"selfHosted"},{path:"/docs/5.1.0/user-guide/",component:u("/docs/5.1.0/user-guide/","f90"),exact:!0,sidebar:"userGuide"},{path:"/docs/5.1.0/user-guide/administrator/apple-team",component:u("/docs/5.1.0/user-guide/administrator/apple-team","dfe"),exact:!0,sidebar:"userGuide"},{path:"/docs/5.1.0/user-guide/administrator/backup",component:u("/docs/5.1.0/user-guide/administrator/backup","309"),exact:!0,sidebar:"userGuide"},{path:"/docs/5.1.0/user-guide/administrator/monitoring/background-jobs",component:u("/docs/5.1.0/user-guide/administrator/monitoring/background-jobs","5da"),exact:!0,sidebar:"userGuide"},{path:"/docs/5.1.0/user-guide/administrator/monitoring/database-analytics",component:u("/docs/5.1.0/user-guide/administrator/monitoring/database-analytics","619"),exact:!0,sidebar:"userGuide"},{path:"/docs/5.1.0/user-guide/administrator/monitoring/logging",component:u("/docs/5.1.0/user-guide/administrator/monitoring/logging","765"),exact:!0,sidebar:"userGuide"},{path:"/docs/5.1.0/user-guide/administrator/monitoring/system-info",component:u("/docs/5.1.0/user-guide/administrator/monitoring/system-info","54d"),exact:!0,sidebar:"userGuide"},{path:"/docs/5.1.0/user-guide/administrator/permissions",component:u("/docs/5.1.0/user-guide/administrator/permissions","0e5"),exact:!0,sidebar:"userGuide"},{path:"/docs/5.1.0/user-guide/administrator/settings",component:u("/docs/5.1.0/user-guide/administrator/settings","8a9"),exact:!0,sidebar:"userGuide"},{path:"/docs/5.1.0/user-guide/apps/",component:u("/docs/5.1.0/user-guide/apps/","7b6"),exact:!0,sidebar:"userGuide"},{path:"/docs/5.1.0/user-guide/apps/create",component:u("/docs/5.1.0/user-guide/apps/create","77b"),exact:!0,sidebar:"userGuide"},{path:"/docs/5.1.0/user-guide/apps/detail",component:u("/docs/5.1.0/user-guide/apps/detail","710"),exact:!0,sidebar:"userGuide"},{path:"/docs/5.1.0/user-guide/apps/upload",component:u("/docs/5.1.0/user-guide/apps/upload","e4a"),exact:!0,sidebar:"userGuide"},{path:"/docs/5.1.0/user-guide/best_practices",component:u("/docs/5.1.0/user-guide/best_practices","484"),exact:!0,sidebar:"userGuide"},{path:"/docs/5.1.0/user-guide/changelog",component:u("/docs/5.1.0/user-guide/changelog","98d"),exact:!0,sidebar:"userGuide"},{path:"/docs/5.1.0/user-guide/credits",component:u("/docs/5.1.0/user-guide/credits","100"),exact:!0,sidebar:"userGuide"},{path:"/docs/5.1.0/user-guide/dashboard",component:u("/docs/5.1.0/user-guide/dashboard","4a1"),exact:!0,sidebar:"userGuide"},{path:"/docs/5.1.0/user-guide/debug-files/",component:u("/docs/5.1.0/user-guide/debug-files/","57c"),exact:!0,sidebar:"userGuide"},{path:"/docs/5.1.0/user-guide/debug-files/review",component:u("/docs/5.1.0/user-guide/debug-files/review","c0f"),exact:!0,sidebar:"userGuide"},{path:"/docs/5.1.0/user-guide/debug-files/upload",component:u("/docs/5.1.0/user-guide/debug-files/upload","f1f"),exact:!0,sidebar:"userGuide"},{path:"/docs/5.1.0/user-guide/qa",component:u("/docs/5.1.0/user-guide/qa","04b"),exact:!0,sidebar:"userGuide"},{path:"/docs/5.1.0/user-guide/toolkits/fetch-udid",component:u("/docs/5.1.0/user-guide/toolkits/fetch-udid","5a6"),exact:!0,sidebar:"userGuide"},{path:"/docs/5.1.0/user-guide/toolkits/teardown",component:u("/docs/5.1.0/user-guide/toolkits/teardown","1ba"),exact:!0,sidebar:"userGuide"},{path:"/docs/5.1.0/user-guide/webhooks",component:u("/docs/5.1.0/user-guide/webhooks","888"),exact:!0,sidebar:"userGuide"},{path:"/docs/5.1.0/user-guide/webhooks/dingtalk",component:u("/docs/5.1.0/user-guide/webhooks/dingtalk","af2"),exact:!0,sidebar:"userGuide"},{path:"/docs/5.1.0/user-guide/webhooks/discord",component:u("/docs/5.1.0/user-guide/webhooks/discord","659"),exact:!0,sidebar:"userGuide"},{path:"/docs/5.1.0/user-guide/webhooks/feishu",component:u("/docs/5.1.0/user-guide/webhooks/feishu","d20"),exact:!0,sidebar:"userGuide"},{path:"/docs/5.1.0/user-guide/webhooks/slack",component:u("/docs/5.1.0/user-guide/webhooks/slack","d94"),exact:!0,sidebar:"userGuide"},{path:"/docs/5.1.0/user-guide/webhooks/wecom",component:u("/docs/5.1.0/user-guide/webhooks/wecom","935"),exact:!0,sidebar:"userGuide"}]}]},{path:"/docs/next",component:u("/docs/next","785"),routes:[{path:"/docs/next",component:u("/docs/next","0ce"),routes:[{path:"/docs/next/category/administrator",component:u("/docs/next/category/administrator","380"),exact:!0,sidebar:"userGuide"},{path:"/docs/next/category/apps",component:u("/docs/next/category/apps","102"),exact:!0,sidebar:"userGuide"},{path:"/docs/next/category/cloud-provider-guides",component:u("/docs/next/category/cloud-provider-guides","df8"),exact:!0,sidebar:"selfHosted"},{path:"/docs/next/category/configuration",component:u("/docs/next/category/configuration","1f8"),exact:!0,sidebar:"selfHosted"},{path:"/docs/next/category/debug-files",component:u("/docs/next/category/debug-files","bf7"),exact:!0,sidebar:"userGuide"},{path:"/docs/next/category/deployment",component:u("/docs/next/category/deployment","de4"),exact:!0,sidebar:"selfHosted"},{path:"/docs/next/category/local-development",component:u("/docs/next/category/local-development","b0d"),exact:!0,sidebar:"contributingGuide"},{path:"/docs/next/category/monitoring",component:u("/docs/next/category/monitoring","f5c"),exact:!0,sidebar:"userGuide"},{path:"/docs/next/category/sdks",component:u("/docs/next/category/sdks","34d"),exact:!0,sidebar:"developerGuide"},{path:"/docs/next/category/toolkits",component:u("/docs/next/category/toolkits","00e"),exact:!0,sidebar:"userGuide"},{path:"/docs/next/contributing-guide/",component:u("/docs/next/contributing-guide/","414"),exact:!0,sidebar:"contributingGuide"},{path:"/docs/next/contributing-guide/local-development/devcontainer",component:u("/docs/next/contributing-guide/local-development/devcontainer","499"),exact:!0,sidebar:"contributingGuide"},{path:"/docs/next/contributing-guide/local-development/source-code",component:u("/docs/next/contributing-guide/local-development/source-code","475"),exact:!0,sidebar:"contributingGuide"},{path:"/docs/next/developer-guide/",component:u("/docs/next/developer-guide/","796"),exact:!0,sidebar:"developerGuide"},{path:"/docs/next/developer-guide/api",component:u("/docs/next/developer-guide/api","2d3"),exact:!0,sidebar:"developerGuide"},{path:"/docs/next/developer-guide/api/apps",component:u("/docs/next/developer-guide/api/apps","ac7"),exact:!0,sidebar:"developerGuide"},{path:"/docs/next/developer-guide/api/debug_files",component:u("/docs/next/developer-guide/api/debug_files","aa9"),exact:!0,sidebar:"developerGuide"},{path:"/docs/next/developer-guide/fastlane",component:u("/docs/next/developer-guide/fastlane","50f"),exact:!0,sidebar:"developerGuide"},{path:"/docs/next/developer-guide/fastlane/zealot",component:u("/docs/next/developer-guide/fastlane/zealot","ce6"),exact:!0,sidebar:"developerGuide"},{path:"/docs/next/developer-guide/fastlane/zealot_debug_file",component:u("/docs/next/developer-guide/fastlane/zealot_debug_file","79f"),exact:!0,sidebar:"developerGuide"},{path:"/docs/next/developer-guide/fastlane/zealot_sync_devices",component:u("/docs/next/developer-guide/fastlane/zealot_sync_devices","bde"),exact:!0,sidebar:"developerGuide"},{path:"/docs/next/developer-guide/fastlane/zealot_version_check",component:u("/docs/next/developer-guide/fastlane/zealot_version_check","95a"),exact:!0,sidebar:"developerGuide"},{path:"/docs/next/developer-guide/sdk/android",component:u("/docs/next/developer-guide/sdk/android","815"),exact:!0,sidebar:"developerGuide"},{path:"/docs/next/developer-guide/sdk/ios",component:u("/docs/next/developer-guide/sdk/ios","1eb"),exact:!0,sidebar:"developerGuide"},{path:"/docs/next/self-hosted/",component:u("/docs/next/self-hosted/","4a8"),exact:!0,sidebar:"selfHosted"},{path:"/docs/next/self-hosted/configuration/environment-variables",component:u("/docs/next/self-hosted/configuration/environment-variables","d1d"),exact:!0,sidebar:"selfHosted"},{path:"/docs/next/self-hosted/configuration/schedule-jobs",component:u("/docs/next/self-hosted/configuration/schedule-jobs","396"),exact:!0,sidebar:"selfHosted"},{path:"/docs/next/self-hosted/configuration/third-party-authentication",component:u("/docs/next/self-hosted/configuration/third-party-authentication","4ed"),exact:!0,sidebar:"selfHosted"},{path:"/docs/next/self-hosted/deployment/architecture",component:u("/docs/next/self-hosted/deployment/architecture","820"),exact:!0,sidebar:"selfHosted"},{path:"/docs/next/self-hosted/deployment/docker",component:u("/docs/next/self-hosted/deployment/docker","bab"),exact:!0,sidebar:"selfHosted"},{path:"/docs/next/self-hosted/deployment/docker/step-by-step",component:u("/docs/next/self-hosted/deployment/docker/step-by-step","b7c"),exact:!0,sidebar:"selfHosted"},{path:"/docs/next/self-hosted/deployment/fly",component:u("/docs/next/self-hosted/deployment/fly","35b"),exact:!0,sidebar:"selfHosted"},{path:"/docs/next/self-hosted/deployment/kubernetes",component:u("/docs/next/self-hosted/deployment/kubernetes","db7"),exact:!0,sidebar:"selfHosted"},{path:"/docs/next/self-hosted/deployment/nomad",component:u("/docs/next/self-hosted/deployment/nomad","022"),exact:!0,sidebar:"selfHosted"},{path:"/docs/next/self-hosted/deployment/railway",component:u("/docs/next/self-hosted/deployment/railway","042"),exact:!0,sidebar:"selfHosted"},{path:"/docs/next/self-hosted/deployment/render",component:u("/docs/next/self-hosted/deployment/render","a27"),exact:!0,sidebar:"selfHosted"},{path:"/docs/next/self-hosted/deployment/requirements",component:u("/docs/next/self-hosted/deployment/requirements","274"),exact:!0,sidebar:"selfHosted"},{path:"/docs/next/self-hosted/deployment/source-code",component:u("/docs/next/self-hosted/deployment/source-code","d47"),exact:!0,sidebar:"selfHosted"},{path:"/docs/next/self-hosted/reverse-proxies",component:u("/docs/next/self-hosted/reverse-proxies","f22"),exact:!0,sidebar:"selfHosted"},{path:"/docs/next/self-hosted/storage",component:u("/docs/next/self-hosted/storage","e44"),exact:!0,sidebar:"selfHosted"},{path:"/docs/next/user-guide/",component:u("/docs/next/user-guide/","3eb"),exact:!0,sidebar:"userGuide"},{path:"/docs/next/user-guide/administrator/apple-team",component:u("/docs/next/user-guide/administrator/apple-team","71d"),exact:!0,sidebar:"userGuide"},{path:"/docs/next/user-guide/administrator/backup",component:u("/docs/next/user-guide/administrator/backup","1c6"),exact:!0,sidebar:"userGuide"},{path:"/docs/next/user-guide/administrator/monitoring/background-jobs",component:u("/docs/next/user-guide/administrator/monitoring/background-jobs","24f"),exact:!0,sidebar:"userGuide"},{path:"/docs/next/user-guide/administrator/monitoring/database-analytics",component:u("/docs/next/user-guide/administrator/monitoring/database-analytics","708"),exact:!0,sidebar:"userGuide"},{path:"/docs/next/user-guide/administrator/monitoring/logging",component:u("/docs/next/user-guide/administrator/monitoring/logging","621"),exact:!0,sidebar:"userGuide"},{path:"/docs/next/user-guide/administrator/monitoring/system-info",component:u("/docs/next/user-guide/administrator/monitoring/system-info","68b"),exact:!0,sidebar:"userGuide"},{path:"/docs/next/user-guide/administrator/permissions",component:u("/docs/next/user-guide/administrator/permissions","347"),exact:!0,sidebar:"userGuide"},{path:"/docs/next/user-guide/administrator/settings",component:u("/docs/next/user-guide/administrator/settings","75a"),exact:!0,sidebar:"userGuide"},{path:"/docs/next/user-guide/apps/",component:u("/docs/next/user-guide/apps/","0f2"),exact:!0,sidebar:"userGuide"},{path:"/docs/next/user-guide/apps/create",component:u("/docs/next/user-guide/apps/create","679"),exact:!0,sidebar:"userGuide"},{path:"/docs/next/user-guide/apps/detail",component:u("/docs/next/user-guide/apps/detail","a89"),exact:!0,sidebar:"userGuide"},{path:"/docs/next/user-guide/apps/upload",component:u("/docs/next/user-guide/apps/upload","e60"),exact:!0,sidebar:"userGuide"},{path:"/docs/next/user-guide/best_practices",component:u("/docs/next/user-guide/best_practices","5ea"),exact:!0,sidebar:"userGuide"},{path:"/docs/next/user-guide/changelog",component:u("/docs/next/user-guide/changelog","b74"),exact:!0,sidebar:"userGuide"},{path:"/docs/next/user-guide/credits",component:u("/docs/next/user-guide/credits","535"),exact:!0,sidebar:"userGuide"},{path:"/docs/next/user-guide/dashboard",component:u("/docs/next/user-guide/dashboard","a36"),exact:!0,sidebar:"userGuide"},{path:"/docs/next/user-guide/debug-files/",component:u("/docs/next/user-guide/debug-files/","727"),exact:!0,sidebar:"userGuide"},{path:"/docs/next/user-guide/debug-files/review",component:u("/docs/next/user-guide/debug-files/review","e27"),exact:!0,sidebar:"userGuide"},{path:"/docs/next/user-guide/debug-files/upload",component:u("/docs/next/user-guide/debug-files/upload","f76"),exact:!0,sidebar:"userGuide"},{path:"/docs/next/user-guide/qa",component:u("/docs/next/user-guide/qa","fd5"),exact:!0,sidebar:"userGuide"},{path:"/docs/next/user-guide/toolkits/fetch-udid",component:u("/docs/next/user-guide/toolkits/fetch-udid","cf3"),exact:!0,sidebar:"userGuide"},{path:"/docs/next/user-guide/toolkits/teardown",component:u("/docs/next/user-guide/toolkits/teardown","98d"),exact:!0,sidebar:"userGuide"},{path:"/docs/next/user-guide/webhooks",component:u("/docs/next/user-guide/webhooks","795"),exact:!0,sidebar:"userGuide"},{path:"/docs/next/user-guide/webhooks/dingtalk",component:u("/docs/next/user-guide/webhooks/dingtalk","b50"),exact:!0,sidebar:"userGuide"},{path:"/docs/next/user-guide/webhooks/discord",component:u("/docs/next/user-guide/webhooks/discord","e4a"),exact:!0,sidebar:"userGuide"},{path:"/docs/next/user-guide/webhooks/feishu",component:u("/docs/next/user-guide/webhooks/feishu","066"),exact:!0,sidebar:"userGuide"},{path:"/docs/next/user-guide/webhooks/slack",component:u("/docs/next/user-guide/webhooks/slack","484"),exact:!0,sidebar:"userGuide"},{path:"/docs/next/user-guide/webhooks/wecom",component:u("/docs/next/user-guide/webhooks/wecom","241"),exact:!0,sidebar:"userGuide"}]}]},{path:"/docs",component:u("/docs","efe"),routes:[{path:"/docs",component:u("/docs","bdd"),routes:[{path:"/docs/category/administrator",component:u("/docs/category/administrator","614"),exact:!0,sidebar:"userGuide"},{path:"/docs/category/apps",component:u("/docs/category/apps","e5b"),exact:!0,sidebar:"userGuide"},{path:"/docs/category/cloud-provider-guides",component:u("/docs/category/cloud-provider-guides","15e"),exact:!0,sidebar:"selfHosted"},{path:"/docs/category/configuration",component:u("/docs/category/configuration","28b"),exact:!0,sidebar:"selfHosted"},{path:"/docs/category/debug-files",component:u("/docs/category/debug-files","a8f"),exact:!0,sidebar:"userGuide"},{path:"/docs/category/deployment",component:u("/docs/category/deployment","cf3"),exact:!0,sidebar:"selfHosted"},{path:"/docs/category/local-development",component:u("/docs/category/local-development","411"),exact:!0,sidebar:"contributingGuide"},{path:"/docs/category/monitoring",component:u("/docs/category/monitoring","1ad"),exact:!0,sidebar:"userGuide"},{path:"/docs/category/sdks",component:u("/docs/category/sdks","28f"),exact:!0,sidebar:"developerGuide"},{path:"/docs/category/toolkits",component:u("/docs/category/toolkits","f3f"),exact:!0,sidebar:"userGuide"},{path:"/docs/contributing-guide/",component:u("/docs/contributing-guide/","dea"),exact:!0,sidebar:"contributingGuide"},{path:"/docs/contributing-guide/local-development/devcontainer",component:u("/docs/contributing-guide/local-development/devcontainer","fb9"),exact:!0,sidebar:"contributingGuide"},{path:"/docs/contributing-guide/local-development/source-code",component:u("/docs/contributing-guide/local-development/source-code","d13"),exact:!0,sidebar:"contributingGuide"},{path:"/docs/developer-guide/",component:u("/docs/developer-guide/","4f6"),exact:!0,sidebar:"developerGuide"},{path:"/docs/developer-guide/api",component:u("/docs/developer-guide/api","314"),exact:!0,sidebar:"developerGuide"},{path:"/docs/developer-guide/api/apps",component:u("/docs/developer-guide/api/apps","f24"),exact:!0,sidebar:"developerGuide"},{path:"/docs/developer-guide/api/debug_files",component:u("/docs/developer-guide/api/debug_files","d10"),exact:!0,sidebar:"developerGuide"},{path:"/docs/developer-guide/fastlane",component:u("/docs/developer-guide/fastlane","de3"),exact:!0,sidebar:"developerGuide"},{path:"/docs/developer-guide/fastlane/zealot",component:u("/docs/developer-guide/fastlane/zealot","503"),exact:!0,sidebar:"developerGuide"},{path:"/docs/developer-guide/fastlane/zealot_debug_file",component:u("/docs/developer-guide/fastlane/zealot_debug_file","6f1"),exact:!0,sidebar:"developerGuide"},{path:"/docs/developer-guide/fastlane/zealot_sync_devices",component:u("/docs/developer-guide/fastlane/zealot_sync_devices","a07"),exact:!0,sidebar:"developerGuide"},{path:"/docs/developer-guide/fastlane/zealot_version_check",component:u("/docs/developer-guide/fastlane/zealot_version_check","15d"),exact:!0,sidebar:"developerGuide"},{path:"/docs/developer-guide/sdk/android",component:u("/docs/developer-guide/sdk/android","e1a"),exact:!0,sidebar:"developerGuide"},{path:"/docs/developer-guide/sdk/ios",component:u("/docs/developer-guide/sdk/ios","afc"),exact:!0,sidebar:"developerGuide"},{path:"/docs/self-hosted/",component:u("/docs/self-hosted/","e65"),exact:!0,sidebar:"selfHosted"},{path:"/docs/self-hosted/configuration/environment-variables",component:u("/docs/self-hosted/configuration/environment-variables","a93"),exact:!0,sidebar:"selfHosted"},{path:"/docs/self-hosted/configuration/schedule-jobs",component:u("/docs/self-hosted/configuration/schedule-jobs","872"),exact:!0,sidebar:"selfHosted"},{path:"/docs/self-hosted/configuration/third-party-authentication",component:u("/docs/self-hosted/configuration/third-party-authentication","429"),exact:!0,sidebar:"selfHosted"},{path:"/docs/self-hosted/deployment/architecture",component:u("/docs/self-hosted/deployment/architecture","489"),exact:!0,sidebar:"selfHosted"},{path:"/docs/self-hosted/deployment/docker",component:u("/docs/self-hosted/deployment/docker","409"),exact:!0,sidebar:"selfHosted"},{path:"/docs/self-hosted/deployment/docker/step-by-step",component:u("/docs/self-hosted/deployment/docker/step-by-step","ed7"),exact:!0,sidebar:"selfHosted"},{path:"/docs/self-hosted/deployment/fly",component:u("/docs/self-hosted/deployment/fly","482"),exact:!0,sidebar:"selfHosted"},{path:"/docs/self-hosted/deployment/kubernetes",component:u("/docs/self-hosted/deployment/kubernetes","7e1"),exact:!0,sidebar:"selfHosted"},{path:"/docs/self-hosted/deployment/nomad",component:u("/docs/self-hosted/deployment/nomad","857"),exact:!0,sidebar:"selfHosted"},{path:"/docs/self-hosted/deployment/railway",component:u("/docs/self-hosted/deployment/railway","c86"),exact:!0,sidebar:"selfHosted"},{path:"/docs/self-hosted/deployment/render",component:u("/docs/self-hosted/deployment/render","ea4"),exact:!0,sidebar:"selfHosted"},{path:"/docs/self-hosted/deployment/requirements",component:u("/docs/self-hosted/deployment/requirements","ee5"),exact:!0,sidebar:"selfHosted"},{path:"/docs/self-hosted/deployment/source-code",component:u("/docs/self-hosted/deployment/source-code","d9e"),exact:!0,sidebar:"selfHosted"},{path:"/docs/self-hosted/reverse-proxies",component:u("/docs/self-hosted/reverse-proxies","509"),exact:!0,sidebar:"selfHosted"},{path:"/docs/self-hosted/storage",component:u("/docs/self-hosted/storage","c07"),exact:!0,sidebar:"selfHosted"},{path:"/docs/user-guide/",component:u("/docs/user-guide/","800"),exact:!0,sidebar:"userGuide"},{path:"/docs/user-guide/administrator/apple-team",component:u("/docs/user-guide/administrator/apple-team","0b0"),exact:!0,sidebar:"userGuide"},{path:"/docs/user-guide/administrator/backup",component:u("/docs/user-guide/administrator/backup","87f"),exact:!0,sidebar:"userGuide"},{path:"/docs/user-guide/administrator/monitoring/background-jobs",component:u("/docs/user-guide/administrator/monitoring/background-jobs","577"),exact:!0,sidebar:"userGuide"},{path:"/docs/user-guide/administrator/monitoring/database-analytics",component:u("/docs/user-guide/administrator/monitoring/database-analytics","788"),exact:!0,sidebar:"userGuide"},{path:"/docs/user-guide/administrator/monitoring/logging",component:u("/docs/user-guide/administrator/monitoring/logging","432"),exact:!0,sidebar:"userGuide"},{path:"/docs/user-guide/administrator/monitoring/system-info",component:u("/docs/user-guide/administrator/monitoring/system-info","a9e"),exact:!0,sidebar:"userGuide"},{path:"/docs/user-guide/administrator/permissions",component:u("/docs/user-guide/administrator/permissions","9b8"),exact:!0,sidebar:"userGuide"},{path:"/docs/user-guide/administrator/settings",component:u("/docs/user-guide/administrator/settings","887"),exact:!0,sidebar:"userGuide"},{path:"/docs/user-guide/apps/",component:u("/docs/user-guide/apps/","55d"),exact:!0,sidebar:"userGuide"},{path:"/docs/user-guide/apps/create",component:u("/docs/user-guide/apps/create","f76"),exact:!0,sidebar:"userGuide"},{path:"/docs/user-guide/apps/detail",component:u("/docs/user-guide/apps/detail","26b"),exact:!0,sidebar:"userGuide"},{path:"/docs/user-guide/apps/upload",component:u("/docs/user-guide/apps/upload","e07"),exact:!0,sidebar:"userGuide"},{path:"/docs/user-guide/best_practices",component:u("/docs/user-guide/best_practices","478"),exact:!0,sidebar:"userGuide"},{path:"/docs/user-guide/changelog",component:u("/docs/user-guide/changelog","c4f"),exact:!0,sidebar:"userGuide"},{path:"/docs/user-guide/credits",component:u("/docs/user-guide/credits","997"),exact:!0,sidebar:"userGuide"},{path:"/docs/user-guide/dashboard",component:u("/docs/user-guide/dashboard","c87"),exact:!0,sidebar:"userGuide"},{path:"/docs/user-guide/debug-files/",component:u("/docs/user-guide/debug-files/","495"),exact:!0,sidebar:"userGuide"},{path:"/docs/user-guide/debug-files/review",component:u("/docs/user-guide/debug-files/review","c38"),exact:!0,sidebar:"userGuide"},{path:"/docs/user-guide/debug-files/upload",component:u("/docs/user-guide/debug-files/upload","2fe"),exact:!0,sidebar:"userGuide"},{path:"/docs/user-guide/qa",component:u("/docs/user-guide/qa","893"),exact:!0,sidebar:"userGuide"},{path:"/docs/user-guide/toolkits/fetch-udid",component:u("/docs/user-guide/toolkits/fetch-udid","34b"),exact:!0,sidebar:"userGuide"},{path:"/docs/user-guide/toolkits/teardown",component:u("/docs/user-guide/toolkits/teardown","01e"),exact:!0,sidebar:"userGuide"},{path:"/docs/user-guide/webhooks",component:u("/docs/user-guide/webhooks","69d"),exact:!0,sidebar:"userGuide"},{path:"/docs/user-guide/webhooks/dingtalk",component:u("/docs/user-guide/webhooks/dingtalk","4ee"),exact:!0,sidebar:"userGuide"},{path:"/docs/user-guide/webhooks/discord",component:u("/docs/user-guide/webhooks/discord","5e7"),exact:!0,sidebar:"userGuide"},{path:"/docs/user-guide/webhooks/feishu",component:u("/docs/user-guide/webhooks/feishu","123"),exact:!0,sidebar:"userGuide"},{path:"/docs/user-guide/webhooks/slack",component:u("/docs/user-guide/webhooks/slack","a48"),exact:!0,sidebar:"userGuide"},{path:"/docs/user-guide/webhooks/wecom",component:u("/docs/user-guide/webhooks/wecom","386"),exact:!0,sidebar:"userGuide"}]}]}]},{path:"/",component:u("/","fc2"),exact:!0},{path:"*",component:u("*")}]},8934:(e,t,n)=>{"use strict";n.d(t,{_:()=>s,t:()=>a});var o=n(7294),r=n(5893);const s=o.createContext(!1);function a(e){let{children:t}=e;const[n,a]=(0,o.useState)(!1);return(0,o.useEffect)((()=>{a(!0)}),[]),(0,r.jsx)(s.Provider,{value:n,children:t})}},7221:(e,t,n)=>{"use strict";var o=n(7294),r=n(745),s=n(3727),a=n(405),i=n(412);const d=[n(2497),n(3310),n(8320),n(2295)];var l=n(723),c=n(6550),u=n(8790),p=n(5893);function f(e){let{children:t}=e;return(0,p.jsx)(p.Fragment,{children:t})}var g=n(5742),m=n(2263),h=n(4996),b=n(6668),y=n(1944),v=n(4711),x=n(9727),k=n(3320),_=n(8780),w=n(197);function S(){const{i18n:{currentLocale:e,defaultLocale:t,localeConfigs:n}}=(0,m.Z)(),o=(0,v.l)(),r=n[e].htmlLang,s=e=>e.replace("-","_");return(0,p.jsxs)(g.Z,{children:[Object.entries(n).map((e=>{let[t,{htmlLang:n}]=e;return(0,p.jsx)("link",{rel:"alternate",href:o.createUrl({locale:t,fullyQualified:!0}),hrefLang:n},t)})),(0,p.jsx)("link",{rel:"alternate",href:o.createUrl({locale:t,fullyQualified:!0}),hrefLang:"x-default"}),(0,p.jsx)("meta",{property:"og:locale",content:s(r)}),Object.values(n).filter((e=>r!==e.htmlLang)).map((e=>(0,p.jsx)("meta",{property:"og:locale:alternate",content:s(e.htmlLang)},`meta-og-${e.htmlLang}`)))]})}function E(e){let{permalink:t}=e;const{siteConfig:{url:n}}=(0,m.Z)(),o=function(){const{siteConfig:{url:e,baseUrl:t,trailingSlash:n}}=(0,m.Z)(),{pathname:o}=(0,c.TH)();return e+(0,_.applyTrailingSlash)((0,h.Z)(o),{trailingSlash:n,baseUrl:t})}(),r=t?`${n}${t}`:o;return(0,p.jsxs)(g.Z,{children:[(0,p.jsx)("meta",{property:"og:url",content:r}),(0,p.jsx)("link",{rel:"canonical",href:r})]})}function C(){const{i18n:{currentLocale:e}}=(0,m.Z)(),{metadata:t,image:n}=(0,b.L)();return(0,p.jsxs)(p.Fragment,{children:[(0,p.jsxs)(g.Z,{children:[(0,p.jsx)("meta",{name:"twitter:card",content:"summary_large_image"}),(0,p.jsx)("body",{className:x.h})]}),n&&(0,p.jsx)(y.d,{image:n}),(0,p.jsx)(E,{}),(0,p.jsx)(S,{}),(0,p.jsx)(w.Z,{tag:k.HX,locale:e}),(0,p.jsx)(g.Z,{children:t.map(((e,t)=>(0,p.jsx)("meta",{...e},t)))})]})}const T=new Map;function j(e){if(T.has(e.pathname))return{...e,pathname:T.get(e.pathname)};if((0,u.f)(l.Z,e.pathname).some((e=>{let{route:t}=e;return!0===t.exact})))return T.set(e.pathname,e.pathname),e;const t=e.pathname.trim().replace(/(?:\/index)?\.html$/,"")||"/";return T.set(e.pathname,t),{...e,pathname:t}}var L=n(8934),A=n(8940),G=n(469);function N(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),o=1;o{const o=t.default?.[e]??t[e];return o?.(...n)}));return()=>r.forEach((e=>e?.()))}const P=function(e){let{children:t,location:n,previousLocation:o}=e;return(0,G.Z)((()=>{o!==n&&(!function(e){let{location:t,previousLocation:n}=e;if(!n)return;const o=t.pathname===n.pathname,r=t.hash===n.hash,s=t.search===n.search;if(o&&r&&!s)return;const{hash:a}=t;if(a){const e=decodeURIComponent(a.substring(1)),t=document.getElementById(e);t?.scrollIntoView()}else window.scrollTo(0,0)}({location:n,previousLocation:o}),N("onRouteDidUpdate",{previousLocation:o,location:n}))}),[o,n]),t};function O(e){const t=Array.from(new Set([e,decodeURI(e)])).map((e=>(0,u.f)(l.Z,e))).flat();return Promise.all(t.map((e=>e.route.component.preload?.())))}class I extends o.Component{previousLocation;routeUpdateCleanupCb;constructor(e){super(e),this.previousLocation=null,this.routeUpdateCleanupCb=i.Z.canUseDOM?N("onRouteUpdate",{previousLocation:null,location:this.props.location}):()=>{},this.state={nextRouteHasLoaded:!0}}shouldComponentUpdate(e,t){if(e.location===this.props.location)return t.nextRouteHasLoaded;const n=e.location;return this.previousLocation=this.props.location,this.setState({nextRouteHasLoaded:!1}),this.routeUpdateCleanupCb=N("onRouteUpdate",{previousLocation:this.previousLocation,location:n}),O(n.pathname).then((()=>{this.routeUpdateCleanupCb(),this.setState({nextRouteHasLoaded:!0})})).catch((e=>{console.warn(e),window.location.reload()})),!1}render(){const{children:e,location:t}=this.props;return(0,p.jsx)(P,{previousLocation:this.previousLocation,location:t,children:(0,p.jsx)(c.AW,{location:t,render:()=>e})})}}const R=I,z="__docusaurus-base-url-issue-banner-container",F="__docusaurus-base-url-issue-banner",D="__docusaurus-base-url-issue-banner-suggestion-container";function M(e){return`\ndocument.addEventListener('DOMContentLoaded', function maybeInsertBanner() {\n var shouldInsert = typeof window['docusaurus'] === 'undefined';\n shouldInsert && insertBanner();\n});\n\nfunction insertBanner() {\n var bannerContainer = document.createElement('div');\n bannerContainer.id = '${z}';\n var bannerHtml = ${JSON.stringify(function(e){return`\n
\n

Your Docusaurus site did not load properly.

\n

A very common reason is a wrong site baseUrl configuration.

\n

Current configured baseUrl = ${e} ${"/"===e?" (default value)":""}

\n

We suggest trying baseUrl =

\n
\n`}(e)).replace(/{if("undefined"==typeof document)return void n();const o=document.createElement("link");o.setAttribute("rel","prefetch"),o.setAttribute("href",e),o.onload=()=>t(),o.onerror=()=>n();const r=document.getElementsByTagName("head")[0]??document.getElementsByName("script")[0]?.parentNode;r?.appendChild(o)}))}:function(e){return new Promise(((t,n)=>{const o=new XMLHttpRequest;o.open("GET",e,!0),o.withCredentials=!0,o.onload=()=>{200===o.status?t():n()},o.send(null)}))};var Q=n(9670);const K=new Set,X=new Set,J=()=>navigator.connection?.effectiveType.includes("2g")||navigator.connection?.saveData,ee={prefetch(e){if(!(e=>!J()&&!X.has(e)&&!K.has(e))(e))return!1;K.add(e);const t=(0,u.f)(l.Z,e).flatMap((e=>{return t=e.route.path,Object.entries(W).filter((e=>{let[n]=e;return n.replace(/-[^-]+$/,"")===t})).flatMap((e=>{let[,t]=e;return Object.values((0,Q.Z)(t))}));var t}));return Promise.all(t.map((e=>{const t=n.gca(e);return t&&!t.includes("undefined")?Y(t).catch((()=>{})):Promise.resolve()})))},preload:e=>!!(e=>!J()&&!X.has(e))(e)&&(X.add(e),O(e))},te=Object.freeze(ee),ne=Boolean(!0);if(i.Z.canUseDOM){window.docusaurus=te;const e=document.getElementById("__docusaurus"),t=(0,p.jsx)(a.B6,{children:(0,p.jsx)(s.VK,{children:(0,p.jsx)(q,{})})}),n=(e,t)=>{console.error("Docusaurus React Root onRecoverableError:",e,t)},i=()=>{if(ne)o.startTransition((()=>{r.hydrateRoot(e,t,{onRecoverableError:n})}));else{const s=r.createRoot(e,{onRecoverableError:n});o.startTransition((()=>{s.render(t)}))}};O(window.location.pathname).then(i)}},8940:(e,t,n)=>{"use strict";n.d(t,{_:()=>u,M:()=>p});var o=n(7294),r=n(6809);const s=JSON.parse('{"docusaurus-plugin-content-docs":{"default":{"path":"/docs","versions":[{"name":"current","label":"Next \ud83d\udea7","isLast":false,"path":"/docs/next","mainDocId":"self-hosted/index","docs":[{"id":"contributing-guide/index","path":"/docs/next/contributing-guide/","sidebar":"contributingGuide"},{"id":"contributing-guide/local-development/devcontainer","path":"/docs/next/contributing-guide/local-development/devcontainer","sidebar":"contributingGuide"},{"id":"contributing-guide/local-development/source-code","path":"/docs/next/contributing-guide/local-development/source-code","sidebar":"contributingGuide"},{"id":"developer-guide/api","path":"/docs/next/developer-guide/api","sidebar":"developerGuide"},{"id":"developer-guide/api/apps","path":"/docs/next/developer-guide/api/apps","sidebar":"developerGuide"},{"id":"developer-guide/api/debug_files","path":"/docs/next/developer-guide/api/debug_files","sidebar":"developerGuide"},{"id":"developer-guide/fastlane","path":"/docs/next/developer-guide/fastlane","sidebar":"developerGuide"},{"id":"developer-guide/fastlane/zealot","path":"/docs/next/developer-guide/fastlane/zealot","sidebar":"developerGuide"},{"id":"developer-guide/fastlane/zealot_debug_file","path":"/docs/next/developer-guide/fastlane/zealot_debug_file","sidebar":"developerGuide"},{"id":"developer-guide/fastlane/zealot_sync_devices","path":"/docs/next/developer-guide/fastlane/zealot_sync_devices","sidebar":"developerGuide"},{"id":"developer-guide/fastlane/zealot_version_check","path":"/docs/next/developer-guide/fastlane/zealot_version_check","sidebar":"developerGuide"},{"id":"developer-guide/index","path":"/docs/next/developer-guide/","sidebar":"developerGuide"},{"id":"developer-guide/sdk/android","path":"/docs/next/developer-guide/sdk/android","sidebar":"developerGuide"},{"id":"developer-guide/sdk/ios","path":"/docs/next/developer-guide/sdk/ios","sidebar":"developerGuide"},{"id":"self-hosted/configuration/environment-variables","path":"/docs/next/self-hosted/configuration/environment-variables","sidebar":"selfHosted"},{"id":"self-hosted/configuration/schedule-jobs","path":"/docs/next/self-hosted/configuration/schedule-jobs","sidebar":"selfHosted"},{"id":"self-hosted/configuration/third-party-authentication","path":"/docs/next/self-hosted/configuration/third-party-authentication","sidebar":"selfHosted"},{"id":"self-hosted/deployment/architecture","path":"/docs/next/self-hosted/deployment/architecture","sidebar":"selfHosted"},{"id":"self-hosted/deployment/docker","path":"/docs/next/self-hosted/deployment/docker","sidebar":"selfHosted"},{"id":"self-hosted/deployment/docker/step-by-step","path":"/docs/next/self-hosted/deployment/docker/step-by-step","sidebar":"selfHosted"},{"id":"self-hosted/deployment/fly","path":"/docs/next/self-hosted/deployment/fly","sidebar":"selfHosted"},{"id":"self-hosted/deployment/kubernetes","path":"/docs/next/self-hosted/deployment/kubernetes","sidebar":"selfHosted"},{"id":"self-hosted/deployment/nomad","path":"/docs/next/self-hosted/deployment/nomad","sidebar":"selfHosted"},{"id":"self-hosted/deployment/railway","path":"/docs/next/self-hosted/deployment/railway","sidebar":"selfHosted"},{"id":"self-hosted/deployment/render","path":"/docs/next/self-hosted/deployment/render","sidebar":"selfHosted"},{"id":"self-hosted/deployment/requirements","path":"/docs/next/self-hosted/deployment/requirements","sidebar":"selfHosted"},{"id":"self-hosted/deployment/source-code","path":"/docs/next/self-hosted/deployment/source-code","sidebar":"selfHosted"},{"id":"self-hosted/index","path":"/docs/next/self-hosted/","sidebar":"selfHosted"},{"id":"self-hosted/reverse-proxies","path":"/docs/next/self-hosted/reverse-proxies","sidebar":"selfHosted"},{"id":"self-hosted/storage","path":"/docs/next/self-hosted/storage","sidebar":"selfHosted"},{"id":"user-guide/administrator/apple-team","path":"/docs/next/user-guide/administrator/apple-team","sidebar":"userGuide"},{"id":"user-guide/administrator/backup","path":"/docs/next/user-guide/administrator/backup","sidebar":"userGuide"},{"id":"user-guide/administrator/monitoring/background-jobs","path":"/docs/next/user-guide/administrator/monitoring/background-jobs","sidebar":"userGuide"},{"id":"user-guide/administrator/monitoring/database-analytics","path":"/docs/next/user-guide/administrator/monitoring/database-analytics","sidebar":"userGuide"},{"id":"user-guide/administrator/monitoring/logging","path":"/docs/next/user-guide/administrator/monitoring/logging","sidebar":"userGuide"},{"id":"user-guide/administrator/monitoring/system-info","path":"/docs/next/user-guide/administrator/monitoring/system-info","sidebar":"userGuide"},{"id":"user-guide/administrator/permissions","path":"/docs/next/user-guide/administrator/permissions","sidebar":"userGuide"},{"id":"user-guide/administrator/settings","path":"/docs/next/user-guide/administrator/settings","sidebar":"userGuide"},{"id":"user-guide/apps/create","path":"/docs/next/user-guide/apps/create","sidebar":"userGuide"},{"id":"user-guide/apps/detail","path":"/docs/next/user-guide/apps/detail","sidebar":"userGuide"},{"id":"user-guide/apps/index","path":"/docs/next/user-guide/apps/","sidebar":"userGuide"},{"id":"user-guide/apps/upload","path":"/docs/next/user-guide/apps/upload","sidebar":"userGuide"},{"id":"user-guide/best_practices","path":"/docs/next/user-guide/best_practices","sidebar":"userGuide"},{"id":"user-guide/changelog","path":"/docs/next/user-guide/changelog","sidebar":"userGuide"},{"id":"user-guide/credits","path":"/docs/next/user-guide/credits","sidebar":"userGuide"},{"id":"user-guide/dashboard","path":"/docs/next/user-guide/dashboard","sidebar":"userGuide"},{"id":"user-guide/debug-files/index","path":"/docs/next/user-guide/debug-files/","sidebar":"userGuide"},{"id":"user-guide/debug-files/review","path":"/docs/next/user-guide/debug-files/review","sidebar":"userGuide"},{"id":"user-guide/debug-files/upload","path":"/docs/next/user-guide/debug-files/upload","sidebar":"userGuide"},{"id":"user-guide/index","path":"/docs/next/user-guide/","sidebar":"userGuide"},{"id":"user-guide/qa","path":"/docs/next/user-guide/qa","sidebar":"userGuide"},{"id":"user-guide/toolkits/fetch-udid","path":"/docs/next/user-guide/toolkits/fetch-udid","sidebar":"userGuide"},{"id":"user-guide/toolkits/teardown","path":"/docs/next/user-guide/toolkits/teardown","sidebar":"userGuide"},{"id":"user-guide/webhooks","path":"/docs/next/user-guide/webhooks","sidebar":"userGuide"},{"id":"user-guide/webhooks/dingtalk","path":"/docs/next/user-guide/webhooks/dingtalk","sidebar":"userGuide"},{"id":"user-guide/webhooks/discord","path":"/docs/next/user-guide/webhooks/discord","sidebar":"userGuide"},{"id":"user-guide/webhooks/feishu","path":"/docs/next/user-guide/webhooks/feishu","sidebar":"userGuide"},{"id":"user-guide/webhooks/slack","path":"/docs/next/user-guide/webhooks/slack","sidebar":"userGuide"},{"id":"user-guide/webhooks/wecom","path":"/docs/next/user-guide/webhooks/wecom","sidebar":"userGuide"},{"id":"/category/deployment","path":"/docs/next/category/deployment","sidebar":"selfHosted"},{"id":"/category/cloud-provider-guides","path":"/docs/next/category/cloud-provider-guides","sidebar":"selfHosted"},{"id":"/category/configuration","path":"/docs/next/category/configuration","sidebar":"selfHosted"},{"id":"/category/apps","path":"/docs/next/category/apps","sidebar":"userGuide"},{"id":"/category/debug-files","path":"/docs/next/category/debug-files","sidebar":"userGuide"},{"id":"/category/toolkits","path":"/docs/next/category/toolkits","sidebar":"userGuide"},{"id":"/category/administrator","path":"/docs/next/category/administrator","sidebar":"userGuide"},{"id":"/category/monitoring","path":"/docs/next/category/monitoring","sidebar":"userGuide"},{"id":"/category/sdks","path":"/docs/next/category/sdks","sidebar":"developerGuide"},{"id":"/category/local-development","path":"/docs/next/category/local-development","sidebar":"contributingGuide"}],"draftIds":[],"sidebars":{"selfHosted":{"link":{"path":"/docs/next/self-hosted/","label":"Getting Started"}},"userGuide":{"link":{"path":"/docs/next/user-guide/","label":"Getting Started"}},"developerGuide":{"link":{"path":"/docs/next/developer-guide/","label":"Getting Started"}},"contributingGuide":{"link":{"path":"/docs/next/contributing-guide/","label":"Getting Started"}}}},{"name":"5.2.0","label":"5.2.0","isLast":true,"path":"/docs","mainDocId":"self-hosted/index","docs":[{"id":"contributing-guide/index","path":"/docs/contributing-guide/","sidebar":"contributingGuide"},{"id":"contributing-guide/local-development/devcontainer","path":"/docs/contributing-guide/local-development/devcontainer","sidebar":"contributingGuide"},{"id":"contributing-guide/local-development/source-code","path":"/docs/contributing-guide/local-development/source-code","sidebar":"contributingGuide"},{"id":"developer-guide/api","path":"/docs/developer-guide/api","sidebar":"developerGuide"},{"id":"developer-guide/api/apps","path":"/docs/developer-guide/api/apps","sidebar":"developerGuide"},{"id":"developer-guide/api/debug_files","path":"/docs/developer-guide/api/debug_files","sidebar":"developerGuide"},{"id":"developer-guide/fastlane","path":"/docs/developer-guide/fastlane","sidebar":"developerGuide"},{"id":"developer-guide/fastlane/zealot","path":"/docs/developer-guide/fastlane/zealot","sidebar":"developerGuide"},{"id":"developer-guide/fastlane/zealot_debug_file","path":"/docs/developer-guide/fastlane/zealot_debug_file","sidebar":"developerGuide"},{"id":"developer-guide/fastlane/zealot_sync_devices","path":"/docs/developer-guide/fastlane/zealot_sync_devices","sidebar":"developerGuide"},{"id":"developer-guide/fastlane/zealot_version_check","path":"/docs/developer-guide/fastlane/zealot_version_check","sidebar":"developerGuide"},{"id":"developer-guide/index","path":"/docs/developer-guide/","sidebar":"developerGuide"},{"id":"developer-guide/sdk/android","path":"/docs/developer-guide/sdk/android","sidebar":"developerGuide"},{"id":"developer-guide/sdk/ios","path":"/docs/developer-guide/sdk/ios","sidebar":"developerGuide"},{"id":"self-hosted/configuration/environment-variables","path":"/docs/self-hosted/configuration/environment-variables","sidebar":"selfHosted"},{"id":"self-hosted/configuration/schedule-jobs","path":"/docs/self-hosted/configuration/schedule-jobs","sidebar":"selfHosted"},{"id":"self-hosted/configuration/third-party-authentication","path":"/docs/self-hosted/configuration/third-party-authentication","sidebar":"selfHosted"},{"id":"self-hosted/deployment/architecture","path":"/docs/self-hosted/deployment/architecture","sidebar":"selfHosted"},{"id":"self-hosted/deployment/docker","path":"/docs/self-hosted/deployment/docker","sidebar":"selfHosted"},{"id":"self-hosted/deployment/docker/step-by-step","path":"/docs/self-hosted/deployment/docker/step-by-step","sidebar":"selfHosted"},{"id":"self-hosted/deployment/fly","path":"/docs/self-hosted/deployment/fly","sidebar":"selfHosted"},{"id":"self-hosted/deployment/kubernetes","path":"/docs/self-hosted/deployment/kubernetes","sidebar":"selfHosted"},{"id":"self-hosted/deployment/nomad","path":"/docs/self-hosted/deployment/nomad","sidebar":"selfHosted"},{"id":"self-hosted/deployment/railway","path":"/docs/self-hosted/deployment/railway","sidebar":"selfHosted"},{"id":"self-hosted/deployment/render","path":"/docs/self-hosted/deployment/render","sidebar":"selfHosted"},{"id":"self-hosted/deployment/requirements","path":"/docs/self-hosted/deployment/requirements","sidebar":"selfHosted"},{"id":"self-hosted/deployment/source-code","path":"/docs/self-hosted/deployment/source-code","sidebar":"selfHosted"},{"id":"self-hosted/index","path":"/docs/self-hosted/","sidebar":"selfHosted"},{"id":"self-hosted/reverse-proxies","path":"/docs/self-hosted/reverse-proxies","sidebar":"selfHosted"},{"id":"self-hosted/storage","path":"/docs/self-hosted/storage","sidebar":"selfHosted"},{"id":"user-guide/administrator/apple-team","path":"/docs/user-guide/administrator/apple-team","sidebar":"userGuide"},{"id":"user-guide/administrator/backup","path":"/docs/user-guide/administrator/backup","sidebar":"userGuide"},{"id":"user-guide/administrator/monitoring/background-jobs","path":"/docs/user-guide/administrator/monitoring/background-jobs","sidebar":"userGuide"},{"id":"user-guide/administrator/monitoring/database-analytics","path":"/docs/user-guide/administrator/monitoring/database-analytics","sidebar":"userGuide"},{"id":"user-guide/administrator/monitoring/logging","path":"/docs/user-guide/administrator/monitoring/logging","sidebar":"userGuide"},{"id":"user-guide/administrator/monitoring/system-info","path":"/docs/user-guide/administrator/monitoring/system-info","sidebar":"userGuide"},{"id":"user-guide/administrator/permissions","path":"/docs/user-guide/administrator/permissions","sidebar":"userGuide"},{"id":"user-guide/administrator/settings","path":"/docs/user-guide/administrator/settings","sidebar":"userGuide"},{"id":"user-guide/apps/create","path":"/docs/user-guide/apps/create","sidebar":"userGuide"},{"id":"user-guide/apps/detail","path":"/docs/user-guide/apps/detail","sidebar":"userGuide"},{"id":"user-guide/apps/index","path":"/docs/user-guide/apps/","sidebar":"userGuide"},{"id":"user-guide/apps/upload","path":"/docs/user-guide/apps/upload","sidebar":"userGuide"},{"id":"user-guide/best_practices","path":"/docs/user-guide/best_practices","sidebar":"userGuide"},{"id":"user-guide/changelog","path":"/docs/user-guide/changelog","sidebar":"userGuide"},{"id":"user-guide/credits","path":"/docs/user-guide/credits","sidebar":"userGuide"},{"id":"user-guide/dashboard","path":"/docs/user-guide/dashboard","sidebar":"userGuide"},{"id":"user-guide/debug-files/index","path":"/docs/user-guide/debug-files/","sidebar":"userGuide"},{"id":"user-guide/debug-files/review","path":"/docs/user-guide/debug-files/review","sidebar":"userGuide"},{"id":"user-guide/debug-files/upload","path":"/docs/user-guide/debug-files/upload","sidebar":"userGuide"},{"id":"user-guide/index","path":"/docs/user-guide/","sidebar":"userGuide"},{"id":"user-guide/qa","path":"/docs/user-guide/qa","sidebar":"userGuide"},{"id":"user-guide/toolkits/fetch-udid","path":"/docs/user-guide/toolkits/fetch-udid","sidebar":"userGuide"},{"id":"user-guide/toolkits/teardown","path":"/docs/user-guide/toolkits/teardown","sidebar":"userGuide"},{"id":"user-guide/webhooks","path":"/docs/user-guide/webhooks","sidebar":"userGuide"},{"id":"user-guide/webhooks/dingtalk","path":"/docs/user-guide/webhooks/dingtalk","sidebar":"userGuide"},{"id":"user-guide/webhooks/discord","path":"/docs/user-guide/webhooks/discord","sidebar":"userGuide"},{"id":"user-guide/webhooks/feishu","path":"/docs/user-guide/webhooks/feishu","sidebar":"userGuide"},{"id":"user-guide/webhooks/slack","path":"/docs/user-guide/webhooks/slack","sidebar":"userGuide"},{"id":"user-guide/webhooks/wecom","path":"/docs/user-guide/webhooks/wecom","sidebar":"userGuide"},{"id":"/category/deployment","path":"/docs/category/deployment","sidebar":"selfHosted"},{"id":"/category/cloud-provider-guides","path":"/docs/category/cloud-provider-guides","sidebar":"selfHosted"},{"id":"/category/configuration","path":"/docs/category/configuration","sidebar":"selfHosted"},{"id":"/category/apps","path":"/docs/category/apps","sidebar":"userGuide"},{"id":"/category/debug-files","path":"/docs/category/debug-files","sidebar":"userGuide"},{"id":"/category/toolkits","path":"/docs/category/toolkits","sidebar":"userGuide"},{"id":"/category/administrator","path":"/docs/category/administrator","sidebar":"userGuide"},{"id":"/category/monitoring","path":"/docs/category/monitoring","sidebar":"userGuide"},{"id":"/category/sdks","path":"/docs/category/sdks","sidebar":"developerGuide"},{"id":"/category/local-development","path":"/docs/category/local-development","sidebar":"contributingGuide"}],"draftIds":[],"sidebars":{"selfHosted":{"link":{"path":"/docs/self-hosted/","label":"Getting Started"}},"userGuide":{"link":{"path":"/docs/user-guide/","label":"Getting Started"}},"developerGuide":{"link":{"path":"/docs/developer-guide/","label":"Getting Started"}},"contributingGuide":{"link":{"path":"/docs/contributing-guide/","label":"Getting Started"}}}},{"name":"5.1.0","label":"5.1.0","isLast":false,"path":"/docs/5.1.0","mainDocId":"self-hosted/index","docs":[{"id":"contributing-guide/index","path":"/docs/5.1.0/contributing-guide/","sidebar":"contributingGuide"},{"id":"contributing-guide/local-development/devcontainer","path":"/docs/5.1.0/contributing-guide/local-development/devcontainer","sidebar":"contributingGuide"},{"id":"contributing-guide/local-development/source-code","path":"/docs/5.1.0/contributing-guide/local-development/source-code","sidebar":"contributingGuide"},{"id":"developer-guide/api","path":"/docs/5.1.0/developer-guide/api","sidebar":"developerGuide"},{"id":"developer-guide/api/apps","path":"/docs/5.1.0/developer-guide/api/apps","sidebar":"developerGuide"},{"id":"developer-guide/api/debug_files","path":"/docs/5.1.0/developer-guide/api/debug_files","sidebar":"developerGuide"},{"id":"developer-guide/fastlane","path":"/docs/5.1.0/developer-guide/fastlane","sidebar":"developerGuide"},{"id":"developer-guide/fastlane/zealot","path":"/docs/5.1.0/developer-guide/fastlane/zealot","sidebar":"developerGuide"},{"id":"developer-guide/fastlane/zealot_debug_file","path":"/docs/5.1.0/developer-guide/fastlane/zealot_debug_file","sidebar":"developerGuide"},{"id":"developer-guide/fastlane/zealot_sync_devices","path":"/docs/5.1.0/developer-guide/fastlane/zealot_sync_devices","sidebar":"developerGuide"},{"id":"developer-guide/fastlane/zealot_version_check","path":"/docs/5.1.0/developer-guide/fastlane/zealot_version_check","sidebar":"developerGuide"},{"id":"developer-guide/index","path":"/docs/5.1.0/developer-guide/","sidebar":"developerGuide"},{"id":"developer-guide/sdk/android","path":"/docs/5.1.0/developer-guide/sdk/android","sidebar":"developerGuide"},{"id":"developer-guide/sdk/ios","path":"/docs/5.1.0/developer-guide/sdk/ios","sidebar":"developerGuide"},{"id":"self-hosted/configuration/environment-variables","path":"/docs/5.1.0/self-hosted/configuration/environment-variables","sidebar":"selfHosted"},{"id":"self-hosted/configuration/schedule-jobs","path":"/docs/5.1.0/self-hosted/configuration/schedule-jobs","sidebar":"selfHosted"},{"id":"self-hosted/configuration/third-party-authentication","path":"/docs/5.1.0/self-hosted/configuration/third-party-authentication","sidebar":"selfHosted"},{"id":"self-hosted/deployment/architecture","path":"/docs/5.1.0/self-hosted/deployment/architecture","sidebar":"selfHosted"},{"id":"self-hosted/deployment/docker","path":"/docs/5.1.0/self-hosted/deployment/docker","sidebar":"selfHosted"},{"id":"self-hosted/deployment/docker/step-by-step","path":"/docs/5.1.0/self-hosted/deployment/docker/step-by-step","sidebar":"selfHosted"},{"id":"self-hosted/deployment/fly","path":"/docs/5.1.0/self-hosted/deployment/fly","sidebar":"selfHosted"},{"id":"self-hosted/deployment/kubernetes","path":"/docs/5.1.0/self-hosted/deployment/kubernetes","sidebar":"selfHosted"},{"id":"self-hosted/deployment/nomad","path":"/docs/5.1.0/self-hosted/deployment/nomad","sidebar":"selfHosted"},{"id":"self-hosted/deployment/railway","path":"/docs/5.1.0/self-hosted/deployment/railway","sidebar":"selfHosted"},{"id":"self-hosted/deployment/render","path":"/docs/5.1.0/self-hosted/deployment/render","sidebar":"selfHosted"},{"id":"self-hosted/deployment/requirements","path":"/docs/5.1.0/self-hosted/deployment/requirements","sidebar":"selfHosted"},{"id":"self-hosted/deployment/source-code","path":"/docs/5.1.0/self-hosted/deployment/source-code","sidebar":"selfHosted"},{"id":"self-hosted/index","path":"/docs/5.1.0/self-hosted/","sidebar":"selfHosted"},{"id":"self-hosted/reverse-proxies","path":"/docs/5.1.0/self-hosted/reverse-proxies","sidebar":"selfHosted"},{"id":"self-hosted/storage","path":"/docs/5.1.0/self-hosted/storage","sidebar":"selfHosted"},{"id":"user-guide/administrator/apple-team","path":"/docs/5.1.0/user-guide/administrator/apple-team","sidebar":"userGuide"},{"id":"user-guide/administrator/backup","path":"/docs/5.1.0/user-guide/administrator/backup","sidebar":"userGuide"},{"id":"user-guide/administrator/monitoring/background-jobs","path":"/docs/5.1.0/user-guide/administrator/monitoring/background-jobs","sidebar":"userGuide"},{"id":"user-guide/administrator/monitoring/database-analytics","path":"/docs/5.1.0/user-guide/administrator/monitoring/database-analytics","sidebar":"userGuide"},{"id":"user-guide/administrator/monitoring/logging","path":"/docs/5.1.0/user-guide/administrator/monitoring/logging","sidebar":"userGuide"},{"id":"user-guide/administrator/monitoring/system-info","path":"/docs/5.1.0/user-guide/administrator/monitoring/system-info","sidebar":"userGuide"},{"id":"user-guide/administrator/permissions","path":"/docs/5.1.0/user-guide/administrator/permissions","sidebar":"userGuide"},{"id":"user-guide/administrator/settings","path":"/docs/5.1.0/user-guide/administrator/settings","sidebar":"userGuide"},{"id":"user-guide/apps/create","path":"/docs/5.1.0/user-guide/apps/create","sidebar":"userGuide"},{"id":"user-guide/apps/detail","path":"/docs/5.1.0/user-guide/apps/detail","sidebar":"userGuide"},{"id":"user-guide/apps/index","path":"/docs/5.1.0/user-guide/apps/","sidebar":"userGuide"},{"id":"user-guide/apps/upload","path":"/docs/5.1.0/user-guide/apps/upload","sidebar":"userGuide"},{"id":"user-guide/best_practices","path":"/docs/5.1.0/user-guide/best_practices","sidebar":"userGuide"},{"id":"user-guide/changelog","path":"/docs/5.1.0/user-guide/changelog","sidebar":"userGuide"},{"id":"user-guide/credits","path":"/docs/5.1.0/user-guide/credits","sidebar":"userGuide"},{"id":"user-guide/dashboard","path":"/docs/5.1.0/user-guide/dashboard","sidebar":"userGuide"},{"id":"user-guide/debug-files/index","path":"/docs/5.1.0/user-guide/debug-files/","sidebar":"userGuide"},{"id":"user-guide/debug-files/review","path":"/docs/5.1.0/user-guide/debug-files/review","sidebar":"userGuide"},{"id":"user-guide/debug-files/upload","path":"/docs/5.1.0/user-guide/debug-files/upload","sidebar":"userGuide"},{"id":"user-guide/index","path":"/docs/5.1.0/user-guide/","sidebar":"userGuide"},{"id":"user-guide/qa","path":"/docs/5.1.0/user-guide/qa","sidebar":"userGuide"},{"id":"user-guide/toolkits/fetch-udid","path":"/docs/5.1.0/user-guide/toolkits/fetch-udid","sidebar":"userGuide"},{"id":"user-guide/toolkits/teardown","path":"/docs/5.1.0/user-guide/toolkits/teardown","sidebar":"userGuide"},{"id":"user-guide/webhooks","path":"/docs/5.1.0/user-guide/webhooks","sidebar":"userGuide"},{"id":"user-guide/webhooks/dingtalk","path":"/docs/5.1.0/user-guide/webhooks/dingtalk","sidebar":"userGuide"},{"id":"user-guide/webhooks/discord","path":"/docs/5.1.0/user-guide/webhooks/discord","sidebar":"userGuide"},{"id":"user-guide/webhooks/feishu","path":"/docs/5.1.0/user-guide/webhooks/feishu","sidebar":"userGuide"},{"id":"user-guide/webhooks/slack","path":"/docs/5.1.0/user-guide/webhooks/slack","sidebar":"userGuide"},{"id":"user-guide/webhooks/wecom","path":"/docs/5.1.0/user-guide/webhooks/wecom","sidebar":"userGuide"},{"id":"/category/deployment","path":"/docs/5.1.0/category/deployment","sidebar":"selfHosted"},{"id":"/category/cloud-provider-guides","path":"/docs/5.1.0/category/cloud-provider-guides","sidebar":"selfHosted"},{"id":"/category/configuration","path":"/docs/5.1.0/category/configuration","sidebar":"selfHosted"},{"id":"/category/apps","path":"/docs/5.1.0/category/apps","sidebar":"userGuide"},{"id":"/category/debug-files","path":"/docs/5.1.0/category/debug-files","sidebar":"userGuide"},{"id":"/category/toolkits","path":"/docs/5.1.0/category/toolkits","sidebar":"userGuide"},{"id":"/category/administrator","path":"/docs/5.1.0/category/administrator","sidebar":"userGuide"},{"id":"/category/monitoring","path":"/docs/5.1.0/category/monitoring","sidebar":"userGuide"},{"id":"/category/sdks","path":"/docs/5.1.0/category/sdks","sidebar":"developerGuide"},{"id":"/category/local-development","path":"/docs/5.1.0/category/local-development","sidebar":"contributingGuide"}],"draftIds":[],"sidebars":{"selfHosted":{"link":{"path":"/docs/5.1.0/self-hosted/","label":"Getting Started"}},"userGuide":{"link":{"path":"/docs/5.1.0/user-guide/","label":"Getting Started"}},"developerGuide":{"link":{"path":"/docs/5.1.0/developer-guide/","label":"Getting Started"}},"contributingGuide":{"link":{"path":"/docs/5.1.0/contributing-guide/","label":"Getting Started"}}}},{"name":"5.0.0","label":"5.0.0","isLast":false,"path":"/docs/5.0.0","mainDocId":"self-hosted/index","docs":[{"id":"contributing-guide/index","path":"/docs/5.0.0/contributing-guide/","sidebar":"contributingGuide"},{"id":"contributing-guide/local-development/devcontainer","path":"/docs/5.0.0/contributing-guide/local-development/devcontainer","sidebar":"contributingGuide"},{"id":"contributing-guide/local-development/source-code","path":"/docs/5.0.0/contributing-guide/local-development/source-code","sidebar":"contributingGuide"},{"id":"developer-guide/api","path":"/docs/5.0.0/developer-guide/api","sidebar":"developerGuide"},{"id":"developer-guide/api/apps","path":"/docs/5.0.0/developer-guide/api/apps","sidebar":"developerGuide"},{"id":"developer-guide/api/debug_files","path":"/docs/5.0.0/developer-guide/api/debug_files","sidebar":"developerGuide"},{"id":"developer-guide/fastlane","path":"/docs/5.0.0/developer-guide/fastlane","sidebar":"developerGuide"},{"id":"developer-guide/fastlane/zealot","path":"/docs/5.0.0/developer-guide/fastlane/zealot","sidebar":"developerGuide"},{"id":"developer-guide/fastlane/zealot_debug_file","path":"/docs/5.0.0/developer-guide/fastlane/zealot_debug_file","sidebar":"developerGuide"},{"id":"developer-guide/fastlane/zealot_sync_devices","path":"/docs/5.0.0/developer-guide/fastlane/zealot_sync_devices","sidebar":"developerGuide"},{"id":"developer-guide/fastlane/zealot_version_check","path":"/docs/5.0.0/developer-guide/fastlane/zealot_version_check","sidebar":"developerGuide"},{"id":"developer-guide/index","path":"/docs/5.0.0/developer-guide/","sidebar":"developerGuide"},{"id":"developer-guide/sdk/android","path":"/docs/5.0.0/developer-guide/sdk/android","sidebar":"developerGuide"},{"id":"developer-guide/sdk/ios","path":"/docs/5.0.0/developer-guide/sdk/ios","sidebar":"developerGuide"},{"id":"self-hosted/configuration/environment-variables","path":"/docs/5.0.0/self-hosted/configuration/environment-variables","sidebar":"selfHosted"},{"id":"self-hosted/configuration/schedule-jobs","path":"/docs/5.0.0/self-hosted/configuration/schedule-jobs","sidebar":"selfHosted"},{"id":"self-hosted/configuration/third-party-authentication","path":"/docs/5.0.0/self-hosted/configuration/third-party-authentication","sidebar":"selfHosted"},{"id":"self-hosted/deployment/architecture","path":"/docs/5.0.0/self-hosted/deployment/architecture","sidebar":"selfHosted"},{"id":"self-hosted/deployment/docker","path":"/docs/5.0.0/self-hosted/deployment/docker","sidebar":"selfHosted"},{"id":"self-hosted/deployment/docker/step-by-step","path":"/docs/5.0.0/self-hosted/deployment/docker/step-by-step","sidebar":"selfHosted"},{"id":"self-hosted/deployment/fly","path":"/docs/5.0.0/self-hosted/deployment/fly","sidebar":"selfHosted"},{"id":"self-hosted/deployment/kubernetes","path":"/docs/5.0.0/self-hosted/deployment/kubernetes","sidebar":"selfHosted"},{"id":"self-hosted/deployment/nomad","path":"/docs/5.0.0/self-hosted/deployment/nomad","sidebar":"selfHosted"},{"id":"self-hosted/deployment/railway","path":"/docs/5.0.0/self-hosted/deployment/railway","sidebar":"selfHosted"},{"id":"self-hosted/deployment/render","path":"/docs/5.0.0/self-hosted/deployment/render","sidebar":"selfHosted"},{"id":"self-hosted/deployment/requirements","path":"/docs/5.0.0/self-hosted/deployment/requirements","sidebar":"selfHosted"},{"id":"self-hosted/deployment/source-code","path":"/docs/5.0.0/self-hosted/deployment/source-code","sidebar":"selfHosted"},{"id":"self-hosted/index","path":"/docs/5.0.0/self-hosted/","sidebar":"selfHosted"},{"id":"self-hosted/reverse-proxies","path":"/docs/5.0.0/self-hosted/reverse-proxies","sidebar":"selfHosted"},{"id":"self-hosted/storage","path":"/docs/5.0.0/self-hosted/storage","sidebar":"selfHosted"},{"id":"user-guide/administrator/apple-team","path":"/docs/5.0.0/user-guide/administrator/apple-team","sidebar":"userGuide"},{"id":"user-guide/administrator/backup","path":"/docs/5.0.0/user-guide/administrator/backup","sidebar":"userGuide"},{"id":"user-guide/administrator/monitoring/background-jobs","path":"/docs/5.0.0/user-guide/administrator/monitoring/background-jobs","sidebar":"userGuide"},{"id":"user-guide/administrator/monitoring/database-analytics","path":"/docs/5.0.0/user-guide/administrator/monitoring/database-analytics","sidebar":"userGuide"},{"id":"user-guide/administrator/monitoring/logging","path":"/docs/5.0.0/user-guide/administrator/monitoring/logging","sidebar":"userGuide"},{"id":"user-guide/administrator/monitoring/system-info","path":"/docs/5.0.0/user-guide/administrator/monitoring/system-info","sidebar":"userGuide"},{"id":"user-guide/administrator/permissions","path":"/docs/5.0.0/user-guide/administrator/permissions","sidebar":"userGuide"},{"id":"user-guide/administrator/project-settings","path":"/docs/5.0.0/user-guide/administrator/project-settings"},{"id":"user-guide/administrator/settings","path":"/docs/5.0.0/user-guide/administrator/settings","sidebar":"userGuide"},{"id":"user-guide/apps/create","path":"/docs/5.0.0/user-guide/apps/create","sidebar":"userGuide"},{"id":"user-guide/apps/detail","path":"/docs/5.0.0/user-guide/apps/detail","sidebar":"userGuide"},{"id":"user-guide/apps/index","path":"/docs/5.0.0/user-guide/apps/","sidebar":"userGuide"},{"id":"user-guide/apps/upload","path":"/docs/5.0.0/user-guide/apps/upload","sidebar":"userGuide"},{"id":"user-guide/best_practices","path":"/docs/5.0.0/user-guide/best_practices","sidebar":"userGuide"},{"id":"user-guide/changelog","path":"/docs/5.0.0/user-guide/changelog","sidebar":"userGuide"},{"id":"user-guide/credits","path":"/docs/5.0.0/user-guide/credits","sidebar":"userGuide"},{"id":"user-guide/dashboard","path":"/docs/5.0.0/user-guide/dashboard","sidebar":"userGuide"},{"id":"user-guide/debug-files/index","path":"/docs/5.0.0/user-guide/debug-files/","sidebar":"userGuide"},{"id":"user-guide/debug-files/review","path":"/docs/5.0.0/user-guide/debug-files/review","sidebar":"userGuide"},{"id":"user-guide/debug-files/upload","path":"/docs/5.0.0/user-guide/debug-files/upload","sidebar":"userGuide"},{"id":"user-guide/index","path":"/docs/5.0.0/user-guide/","sidebar":"userGuide"},{"id":"user-guide/qa","path":"/docs/5.0.0/user-guide/qa","sidebar":"userGuide"},{"id":"user-guide/toolkits/fetch-udid","path":"/docs/5.0.0/user-guide/toolkits/fetch-udid","sidebar":"userGuide"},{"id":"user-guide/toolkits/teardown","path":"/docs/5.0.0/user-guide/toolkits/teardown","sidebar":"userGuide"},{"id":"user-guide/webhooks","path":"/docs/5.0.0/user-guide/webhooks","sidebar":"userGuide"},{"id":"user-guide/webhooks/dingtalk","path":"/docs/5.0.0/user-guide/webhooks/dingtalk","sidebar":"userGuide"},{"id":"user-guide/webhooks/discord","path":"/docs/5.0.0/user-guide/webhooks/discord","sidebar":"userGuide"},{"id":"user-guide/webhooks/feishu","path":"/docs/5.0.0/user-guide/webhooks/feishu","sidebar":"userGuide"},{"id":"user-guide/webhooks/slack","path":"/docs/5.0.0/user-guide/webhooks/slack","sidebar":"userGuide"},{"id":"user-guide/webhooks/wecom","path":"/docs/5.0.0/user-guide/webhooks/wecom","sidebar":"userGuide"},{"id":"/category/deployment","path":"/docs/5.0.0/category/deployment","sidebar":"selfHosted"},{"id":"/category/cloud-provider-guides","path":"/docs/5.0.0/category/cloud-provider-guides","sidebar":"selfHosted"},{"id":"/category/configuration","path":"/docs/5.0.0/category/configuration","sidebar":"selfHosted"},{"id":"/category/apps","path":"/docs/5.0.0/category/apps","sidebar":"userGuide"},{"id":"/category/debug-files","path":"/docs/5.0.0/category/debug-files","sidebar":"userGuide"},{"id":"/category/toolkits","path":"/docs/5.0.0/category/toolkits","sidebar":"userGuide"},{"id":"/category/administrator","path":"/docs/5.0.0/category/administrator","sidebar":"userGuide"},{"id":"/category/monitoring","path":"/docs/5.0.0/category/monitoring","sidebar":"userGuide"},{"id":"/category/sdks","path":"/docs/5.0.0/category/sdks","sidebar":"developerGuide"},{"id":"/category/local-development","path":"/docs/5.0.0/category/local-development","sidebar":"contributingGuide"}],"draftIds":[],"sidebars":{"selfHosted":{"link":{"path":"/docs/5.0.0/self-hosted/","label":"Getting Started"}},"userGuide":{"link":{"path":"/docs/5.0.0/user-guide/","label":"Getting Started"}},"developerGuide":{"link":{"path":"/docs/5.0.0/developer-guide/","label":"Getting Started"}},"contributingGuide":{"link":{"path":"/docs/5.0.0/contributing-guide/","label":"Getting Started"}}}},{"name":"4.x","label":"4.x","isLast":false,"path":"/docs/4.x","mainDocId":"self-hosted/index","docs":[{"id":"contributing-guide/index","path":"/docs/4.x/contributing-guide/","sidebar":"contributingGuide"},{"id":"contributing-guide/local-development/devcontainer","path":"/docs/4.x/contributing-guide/local-development/devcontainer","sidebar":"contributingGuide"},{"id":"contributing-guide/local-development/source-code","path":"/docs/4.x/contributing-guide/local-development/source-code","sidebar":"contributingGuide"},{"id":"developer-guide/api","path":"/docs/4.x/developer-guide/api","sidebar":"developerGuide"},{"id":"developer-guide/api/apps","path":"/docs/4.x/developer-guide/api/apps","sidebar":"developerGuide"},{"id":"developer-guide/api/debug_files","path":"/docs/4.x/developer-guide/api/debug_files","sidebar":"developerGuide"},{"id":"developer-guide/fastlane","path":"/docs/4.x/developer-guide/fastlane","sidebar":"developerGuide"},{"id":"developer-guide/fastlane/zealot","path":"/docs/4.x/developer-guide/fastlane/zealot","sidebar":"developerGuide"},{"id":"developer-guide/fastlane/zealot_debug_file","path":"/docs/4.x/developer-guide/fastlane/zealot_debug_file","sidebar":"developerGuide"},{"id":"developer-guide/fastlane/zealot_sync_devices","path":"/docs/4.x/developer-guide/fastlane/zealot_sync_devices","sidebar":"developerGuide"},{"id":"developer-guide/fastlane/zealot_version_check","path":"/docs/4.x/developer-guide/fastlane/zealot_version_check","sidebar":"developerGuide"},{"id":"developer-guide/index","path":"/docs/4.x/developer-guide/","sidebar":"developerGuide"},{"id":"developer-guide/sdk/android","path":"/docs/4.x/developer-guide/sdk/android","sidebar":"developerGuide"},{"id":"developer-guide/sdk/ios","path":"/docs/4.x/developer-guide/sdk/ios","sidebar":"developerGuide"},{"id":"self-hosted/configuration/environment-variables","path":"/docs/4.x/self-hosted/configuration/environment-variables","sidebar":"selfHosted"},{"id":"self-hosted/configuration/schedule-jobs","path":"/docs/4.x/self-hosted/configuration/schedule-jobs","sidebar":"selfHosted"},{"id":"self-hosted/configuration/third-party-authentication","path":"/docs/4.x/self-hosted/configuration/third-party-authentication","sidebar":"selfHosted"},{"id":"self-hosted/deployment/architecture","path":"/docs/4.x/self-hosted/deployment/architecture","sidebar":"selfHosted"},{"id":"self-hosted/deployment/docker","path":"/docs/4.x/self-hosted/deployment/docker","sidebar":"selfHosted"},{"id":"self-hosted/deployment/docker/step-by-step","path":"/docs/4.x/self-hosted/deployment/docker/step-by-step","sidebar":"selfHosted"},{"id":"self-hosted/deployment/fly","path":"/docs/4.x/self-hosted/deployment/fly","sidebar":"selfHosted"},{"id":"self-hosted/deployment/kubernetes","path":"/docs/4.x/self-hosted/deployment/kubernetes","sidebar":"selfHosted"},{"id":"self-hosted/deployment/nomad","path":"/docs/4.x/self-hosted/deployment/nomad","sidebar":"selfHosted"},{"id":"self-hosted/deployment/railway","path":"/docs/4.x/self-hosted/deployment/railway","sidebar":"selfHosted"},{"id":"self-hosted/deployment/render","path":"/docs/4.x/self-hosted/deployment/render","sidebar":"selfHosted"},{"id":"self-hosted/deployment/requirements","path":"/docs/4.x/self-hosted/deployment/requirements","sidebar":"selfHosted"},{"id":"self-hosted/deployment/source-code","path":"/docs/4.x/self-hosted/deployment/source-code","sidebar":"selfHosted"},{"id":"self-hosted/index","path":"/docs/4.x/self-hosted/","sidebar":"selfHosted"},{"id":"self-hosted/reverse-proxies","path":"/docs/4.x/self-hosted/reverse-proxies","sidebar":"selfHosted"},{"id":"self-hosted/storage","path":"/docs/4.x/self-hosted/storage","sidebar":"selfHosted"},{"id":"user-guide/administrator/apple-team","path":"/docs/4.x/user-guide/administrator/apple-team","sidebar":"userGuide"},{"id":"user-guide/administrator/backup","path":"/docs/4.x/user-guide/administrator/backup","sidebar":"userGuide"},{"id":"user-guide/administrator/monitoring/background-jobs","path":"/docs/4.x/user-guide/administrator/monitoring/background-jobs","sidebar":"userGuide"},{"id":"user-guide/administrator/monitoring/database-analytics","path":"/docs/4.x/user-guide/administrator/monitoring/database-analytics","sidebar":"userGuide"},{"id":"user-guide/administrator/monitoring/logging","path":"/docs/4.x/user-guide/administrator/monitoring/logging","sidebar":"userGuide"},{"id":"user-guide/administrator/monitoring/system-info","path":"/docs/4.x/user-guide/administrator/monitoring/system-info","sidebar":"userGuide"},{"id":"user-guide/administrator/permissions","path":"/docs/4.x/user-guide/administrator/permissions","sidebar":"userGuide"},{"id":"user-guide/administrator/project-settings","path":"/docs/4.x/user-guide/administrator/project-settings"},{"id":"user-guide/apps/create","path":"/docs/4.x/user-guide/apps/create","sidebar":"userGuide"},{"id":"user-guide/best_practices","path":"/docs/4.x/user-guide/best_practices","sidebar":"userGuide"},{"id":"user-guide/changelog","path":"/docs/4.x/user-guide/changelog","sidebar":"userGuide"},{"id":"user-guide/credits","path":"/docs/4.x/user-guide/credits","sidebar":"userGuide"},{"id":"user-guide/dashboard","path":"/docs/4.x/user-guide/dashboard","sidebar":"userGuide"},{"id":"user-guide/debug-files/upload","path":"/docs/4.x/user-guide/debug-files/upload","sidebar":"userGuide"},{"id":"user-guide/index","path":"/docs/4.x/user-guide/","sidebar":"userGuide"},{"id":"user-guide/qa","path":"/docs/4.x/user-guide/qa","sidebar":"userGuide"},{"id":"user-guide/toolkits/fetch-udid","path":"/docs/4.x/user-guide/toolkits/fetch-udid","sidebar":"userGuide"},{"id":"user-guide/toolkits/teardown","path":"/docs/4.x/user-guide/toolkits/teardown","sidebar":"userGuide"},{"id":"user-guide/webhooks","path":"/docs/4.x/user-guide/webhooks","sidebar":"userGuide"},{"id":"user-guide/webhooks/dingtalk","path":"/docs/4.x/user-guide/webhooks/dingtalk","sidebar":"userGuide"},{"id":"user-guide/webhooks/discord","path":"/docs/4.x/user-guide/webhooks/discord","sidebar":"userGuide"},{"id":"user-guide/webhooks/feishu","path":"/docs/4.x/user-guide/webhooks/feishu","sidebar":"userGuide"},{"id":"user-guide/webhooks/slack","path":"/docs/4.x/user-guide/webhooks/slack","sidebar":"userGuide"},{"id":"user-guide/webhooks/wecom","path":"/docs/4.x/user-guide/webhooks/wecom","sidebar":"userGuide"},{"id":"/category/deployment","path":"/docs/4.x/category/deployment","sidebar":"selfHosted"},{"id":"/category/cloud-provider-guides","path":"/docs/4.x/category/cloud-provider-guides","sidebar":"selfHosted"},{"id":"/category/configuration","path":"/docs/4.x/category/configuration","sidebar":"selfHosted"},{"id":"/category/apps","path":"/docs/4.x/category/apps","sidebar":"userGuide"},{"id":"/category/debug-files","path":"/docs/4.x/category/debug-files","sidebar":"userGuide"},{"id":"/category/toolkits","path":"/docs/4.x/category/toolkits","sidebar":"userGuide"},{"id":"/category/administrator","path":"/docs/4.x/category/administrator","sidebar":"userGuide"},{"id":"/category/monitoring","path":"/docs/4.x/category/monitoring","sidebar":"userGuide"},{"id":"/category/sdks","path":"/docs/4.x/category/sdks","sidebar":"developerGuide"},{"id":"/category/local-development","path":"/docs/4.x/category/local-development","sidebar":"contributingGuide"}],"draftIds":[],"sidebars":{"selfHosted":{"link":{"path":"/docs/4.x/self-hosted/","label":"Getting Started"}},"userGuide":{"link":{"path":"/docs/4.x/user-guide/","label":"Getting Started"}},"developerGuide":{"link":{"path":"/docs/4.x/developer-guide/","label":"Getting Started"}},"contributingGuide":{"link":{"path":"/docs/4.x/contributing-guide/","label":"Getting Started"}}}}],"breadcrumbs":true}}}'),a=JSON.parse('{"defaultLocale":"en","locales":["en","zh-Hans"],"path":"i18n","currentLocale":"en","localeConfigs":{"en":{"label":"English","direction":"ltr","htmlLang":"en","calendar":"gregory","path":"en"},"zh-Hans":{"label":"\u7b80\u4f53\u4e2d\u6587","direction":"ltr","htmlLang":"zh-Hans","calendar":"gregory","path":"zh-Hans"}}}');var i=n(7529);const d=JSON.parse('{"docusaurusVersion":"3.0.1","siteVersion":"0.0.0","pluginVersions":{"docusaurus-plugin-content-docs":{"type":"package","name":"@docusaurus/plugin-content-docs","version":"3.0.1"},"docusaurus-plugin-content-blog":{"type":"package","name":"@docusaurus/plugin-content-blog","version":"3.0.1"},"docusaurus-plugin-content-pages":{"type":"package","name":"@docusaurus/plugin-content-pages","version":"3.0.1"},"docusaurus-plugin-sitemap":{"type":"package","name":"@docusaurus/plugin-sitemap","version":"3.0.1"},"docusaurus-theme-classic":{"type":"package","name":"@docusaurus/theme-classic","version":"3.0.1"}}}');var l=n(5893);const c={siteConfig:r.default,siteMetadata:d,globalData:s,i18n:a,codeTranslations:i},u=o.createContext(c);function p(e){let{children:t}=e;return(0,l.jsx)(u.Provider,{value:c,children:t})}},4763:(e,t,n)=>{"use strict";n.d(t,{Z:()=>f});var o=n(7294),r=n(412),s=n(5742),a=n(8780),i=n(6040),d=n(5893);function l(e){let{error:t,tryAgain:n}=e;return(0,d.jsxs)("div",{style:{display:"flex",flexDirection:"column",justifyContent:"center",alignItems:"flex-start",minHeight:"100vh",width:"100%",maxWidth:"80ch",fontSize:"20px",margin:"0 auto",padding:"1rem"},children:[(0,d.jsx)("h1",{style:{fontSize:"3rem"},children:"This page crashed"}),(0,d.jsx)("button",{type:"button",onClick:n,style:{margin:"1rem 0",fontSize:"2rem",cursor:"pointer",borderRadius:20,padding:"1rem"},children:"Try again"}),(0,d.jsx)(c,{error:t})]})}function c(e){let{error:t}=e;const n=(0,a.getErrorCausalChain)(t).map((e=>e.message)).join("\n\nCause:\n");return(0,d.jsx)("p",{style:{whiteSpace:"pre-wrap"},children:n})}function u(e){let{error:t,tryAgain:n}=e;return(0,d.jsxs)(f,{fallback:()=>(0,d.jsx)(l,{error:t,tryAgain:n}),children:[(0,d.jsx)(s.Z,{children:(0,d.jsx)("title",{children:"Page Error"})}),(0,d.jsx)(i.Z,{children:(0,d.jsx)(l,{error:t,tryAgain:n})})]})}const p=e=>(0,d.jsx)(u,{...e});class f extends o.Component{constructor(e){super(e),this.state={error:null}}componentDidCatch(e){r.Z.canUseDOM&&this.setState({error:e})}render(){const{children:e}=this.props,{error:t}=this.state;if(t){const e={error:t,tryAgain:()=>this.setState({error:null})};return(this.props.fallback??p)(e)}return e??null}}},412:(e,t,n)=>{"use strict";n.d(t,{Z:()=>r});const o="undefined"!=typeof window&&"document"in window&&"createElement"in window.document,r={canUseDOM:o,canUseEventListeners:o&&("addEventListener"in window||"attachEvent"in window),canUseIntersectionObserver:o&&"IntersectionObserver"in window,canUseViewport:o&&"screen"in window}},5742:(e,t,n)=>{"use strict";n.d(t,{Z:()=>s});n(7294);var o=n(405),r=n(5893);function s(e){return(0,r.jsx)(o.ql,{...e})}},9960:(e,t,n)=>{"use strict";n.d(t,{Z:()=>f});var o=n(7294),r=n(3727),s=n(8780),a=n(2263),i=n(3919),d=n(412),l=n(5893);const c=o.createContext({collectLink:()=>{}});var u=n(4996);function p(e,t){let{isNavLink:n,to:p,href:f,activeClassName:g,isActive:m,"data-noBrokenLinkCheck":h,autoAddBaseUrl:b=!0,...y}=e;const{siteConfig:{trailingSlash:v,baseUrl:x}}=(0,a.Z)(),{withBaseUrl:k}=(0,u.C)(),_=(0,o.useContext)(c),w=(0,o.useRef)(null);(0,o.useImperativeHandle)(t,(()=>w.current));const S=p||f;const E=(0,i.Z)(S),C=S?.replace("pathname://","");let T=void 0!==C?(j=C,b&&(e=>e.startsWith("/"))(j)?k(j):j):void 0;var j;T&&E&&(T=(0,s.applyTrailingSlash)(T,{trailingSlash:v,baseUrl:x}));const L=(0,o.useRef)(!1),A=n?r.OL:r.rU,G=d.Z.canUseIntersectionObserver,N=(0,o.useRef)(),P=()=>{L.current||null==T||(window.docusaurus.preload(T),L.current=!0)};(0,o.useEffect)((()=>(!G&&E&&null!=T&&window.docusaurus.prefetch(T),()=>{G&&N.current&&N.current.disconnect()})),[N,T,G,E]);const O=T?.startsWith("#")??!1,I=!T||!E||O;return I||h||_.collectLink(T),I?(0,l.jsx)("a",{ref:w,href:T,...S&&!E&&{target:"_blank",rel:"noopener noreferrer"},...y}):(0,l.jsx)(A,{...y,onMouseEnter:P,onTouchStart:P,innerRef:e=>{w.current=e,G&&e&&E&&(N.current=new window.IntersectionObserver((t=>{t.forEach((t=>{e===t.target&&(t.isIntersecting||t.intersectionRatio>0)&&(N.current.unobserve(e),N.current.disconnect(),null!=T&&window.docusaurus.prefetch(T))}))})),N.current.observe(e))},to:T,...n&&{isActive:m,activeClassName:g}})}const f=o.forwardRef(p)},1875:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});const o=()=>null},5999:(e,t,n)=>{"use strict";n.d(t,{Z:()=>l,I:()=>d});var o=n(7294),r=n(5893);function s(e,t){const n=e.split(/(\{\w+\})/).map(((e,n)=>{if(n%2==1){const n=t?.[e.slice(1,-1)];if(void 0!==n)return n}return e}));return n.some((e=>(0,o.isValidElement)(e)))?n.map(((e,t)=>(0,o.isValidElement)(e)?o.cloneElement(e,{key:t}):e)).filter((e=>""!==e)):n.join("")}var a=n(7529);function i(e){let{id:t,message:n}=e;if(void 0===t&&void 0===n)throw new Error("Docusaurus translation declarations must have at least a translation id or a default translation message");return a[t??n]??n??t}function d(e,t){let{message:n,id:o}=e;return s(i({message:n,id:o}),t)}function l(e){let{children:t,id:n,values:o}=e;if(t&&"string"!=typeof t)throw console.warn("Illegal children",t),new Error("The Docusaurus component only accept simple string values");const a=i({message:t,id:n});return(0,r.jsx)(r.Fragment,{children:s(a,o)})}},9935:(e,t,n)=>{"use strict";n.d(t,{m:()=>o});const o="default"},3919:(e,t,n)=>{"use strict";function o(e){return/^(?:\w*:|\/\/)/.test(e)}function r(e){return void 0!==e&&!o(e)}n.d(t,{Z:()=>r,b:()=>o})},4996:(e,t,n)=>{"use strict";n.d(t,{C:()=>a,Z:()=>i});var o=n(7294),r=n(2263),s=n(3919);function a(){const{siteConfig:{baseUrl:e,url:t}}=(0,r.Z)(),n=(0,o.useCallback)(((n,o)=>function(e,t,n,o){let{forcePrependBaseUrl:r=!1,absolute:a=!1}=void 0===o?{}:o;if(!n||n.startsWith("#")||(0,s.b)(n))return n;if(r)return t+n.replace(/^\//,"");if(n===t.replace(/\/$/,""))return t;const i=n.startsWith(t)?n:t+n.replace(/^\//,"");return a?e+i:i}(t,e,n,o)),[t,e]);return{withBaseUrl:n}}function i(e,t){void 0===t&&(t={});const{withBaseUrl:n}=a();return n(e,t)}},2263:(e,t,n)=>{"use strict";n.d(t,{Z:()=>s});var o=n(7294),r=n(8940);function s(){return(0,o.useContext)(r._)}},2389:(e,t,n)=>{"use strict";n.d(t,{Z:()=>s});var o=n(7294),r=n(8934);function s(){return(0,o.useContext)(r._)}},469:(e,t,n)=>{"use strict";n.d(t,{Z:()=>r});var o=n(7294);const r=n(412).Z.canUseDOM?o.useLayoutEffect:o.useEffect},9670:(e,t,n)=>{"use strict";n.d(t,{Z:()=>r});const o=e=>"object"==typeof e&&!!e&&Object.keys(e).length>0;function r(e){const t={};return function e(n,r){Object.entries(n).forEach((n=>{let[s,a]=n;const i=r?`${r}.${s}`:s;o(a)?e(a,i):t[i]=a}))}(e),t}},226:(e,t,n)=>{"use strict";n.d(t,{_:()=>s,z:()=>a});var o=n(7294),r=n(5893);const s=o.createContext(null);function a(e){let{children:t,value:n}=e;const a=o.useContext(s),i=(0,o.useMemo)((()=>function(e){let{parent:t,value:n}=e;if(!t){if(!n)throw new Error("Unexpected: no Docusaurus route context found");if(!("plugin"in n))throw new Error("Unexpected: Docusaurus topmost route context has no `plugin` attribute");return n}const o={...t.data,...n?.data};return{plugin:t.plugin,data:o}}({parent:a,value:n})),[a,n]);return(0,r.jsx)(s.Provider,{value:i,children:t})}},143:(e,t,n)=>{"use strict";n.d(t,{Iw:()=>m,gA:()=>p,_r:()=>c,Jo:()=>h,zh:()=>u,yW:()=>g,gB:()=>f});var o=n(6550),r=n(2263),s=n(9935);function a(e,t){void 0===t&&(t={});const n=function(){const{globalData:e}=(0,r.Z)();return e}()[e];if(!n&&t.failfast)throw new Error(`Docusaurus plugin global data not found for "${e}" plugin.`);return n}const i=e=>e.versions.find((e=>e.isLast));function d(e,t){const n=function(e,t){const n=i(e);return[...e.versions.filter((e=>e!==n)),n].find((e=>!!(0,o.LX)(t,{path:e.path,exact:!1,strict:!1})))}(e,t),r=n?.docs.find((e=>!!(0,o.LX)(t,{path:e.path,exact:!0,strict:!1})));return{activeVersion:n,activeDoc:r,alternateDocVersions:r?function(t){const n={};return e.versions.forEach((e=>{e.docs.forEach((o=>{o.id===t&&(n[e.name]=o)}))})),n}(r.id):{}}}const l={},c=()=>a("docusaurus-plugin-content-docs")??l,u=e=>function(e,t,n){void 0===t&&(t=s.m),void 0===n&&(n={});const o=a(e),r=o?.[t];if(!r&&n.failfast)throw new Error(`Docusaurus plugin global data not found for "${e}" plugin with id "${t}".`);return r}("docusaurus-plugin-content-docs",e,{failfast:!0});function p(e){void 0===e&&(e={});const t=c(),{pathname:n}=(0,o.TH)();return function(e,t,n){void 0===n&&(n={});const r=Object.entries(e).sort(((e,t)=>t[1].path.localeCompare(e[1].path))).find((e=>{let[,n]=e;return!!(0,o.LX)(t,{path:n.path,exact:!1,strict:!1})})),s=r?{pluginId:r[0],pluginData:r[1]}:void 0;if(!s&&n.failfast)throw new Error(`Can't find active docs plugin for "${t}" pathname, while it was expected to be found. Maybe you tried to use a docs feature that can only be used on a docs-related page? Existing docs plugin paths are: ${Object.values(e).map((e=>e.path)).join(", ")}`);return s}(t,n,e)}function f(e){return u(e).versions}function g(e){const t=u(e);return i(t)}function m(e){const t=u(e),{pathname:n}=(0,o.TH)();return d(t,n)}function h(e){const t=u(e),{pathname:n}=(0,o.TH)();return function(e,t){const n=i(e);return{latestDocSuggestion:d(e,t).alternateDocVersions[n.name],latestVersionSuggestion:n}}(t,n)}},8320:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>s});var o=n(4865),r=n.n(o);r().configure({showSpinner:!1});const s={onRouteUpdate(e){let{location:t,previousLocation:n}=e;if(n&&t.pathname!==n.pathname){const e=window.setTimeout((()=>{r().start()}),200);return()=>window.clearTimeout(e)}},onRouteDidUpdate(){r().done()}}},3310:(e,t,n)=>{"use strict";n.r(t);var o=n(2573),r=n(6809);!function(e){const{themeConfig:{prism:t}}=r.default,{additionalLanguages:o}=t;globalThis.Prism=e,o.forEach((e=>{"php"===e&&n(6854),n(1472)(`./prism-${e}`)})),delete globalThis.Prism}(o.p1)},7955:(e,t,n)=>{"use strict";n.d(t,{Z:()=>l});n(7294);var o=n(512),r=n(5999),s=n(6668),a=n(9960);const i={anchorWithStickyNavbar:"anchorWithStickyNavbar_LWe7",anchorWithHideOnScrollNavbar:"anchorWithHideOnScrollNavbar_WYt5"};var d=n(5893);function l(e){let{as:t,id:n,...l}=e;const{navbar:{hideOnScroll:c}}=(0,s.L)();if("h1"===t||!n)return(0,d.jsx)(t,{...l,id:void 0});const u=(0,r.I)({id:"theme.common.headingLinkTitle",message:"Direct link to {heading}",description:"Title for link to heading"},{heading:"string"==typeof l.children?l.children:n});return(0,d.jsxs)(t,{...l,className:(0,o.Z)("anchor",c?i.anchorWithHideOnScrollNavbar:i.anchorWithStickyNavbar,l.className),id:n,children:[l.children,(0,d.jsx)(a.Z,{className:"hash-link",to:`#${n}`,"aria-label":u,title:u,children:"\u200b"})]})}},9471:(e,t,n)=>{"use strict";n.d(t,{Z:()=>s});n(7294);const o={iconExternalLink:"iconExternalLink_nPIU"};var r=n(5893);function s(e){let{width:t=13.5,height:n=13.5}=e;return(0,r.jsx)("svg",{width:t,height:n,"aria-hidden":"true",viewBox:"0 0 24 24",className:o.iconExternalLink,children:(0,r.jsx)("path",{fill:"currentColor",d:"M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"})})}},6040:(e,t,n)=>{"use strict";n.d(t,{Z:()=>ft});var o=n(7294),r=n(512),s=n(4763),a=n(1944),i=n(6550),d=n(5999),l=n(5936),c=n(5893);const u="__docusaurus_skipToContent_fallback";function p(e){e.setAttribute("tabindex","-1"),e.focus(),e.removeAttribute("tabindex")}function f(){const e=(0,o.useRef)(null),{action:t}=(0,i.k6)(),n=(0,o.useCallback)((e=>{e.preventDefault();const t=document.querySelector("main:first-of-type")??document.getElementById(u);t&&p(t)}),[]);return(0,l.S)((n=>{let{location:o}=n;e.current&&!o.hash&&"PUSH"===t&&p(e.current)})),{containerRef:e,onClick:n}}const g=(0,d.I)({id:"theme.common.skipToMainContent",description:"The skip to content label used for accessibility, allowing to rapidly navigate to main content with keyboard tab/enter navigation",message:"Skip to main content"});function m(e){const t=e.children??g,{containerRef:n,onClick:o}=f();return(0,c.jsx)("div",{ref:n,role:"region","aria-label":g,children:(0,c.jsx)("a",{...e,href:`#${u}`,onClick:o,children:t})})}var h=n(5281),b=n(9727);const y={skipToContent:"skipToContent_fXgn"};function v(){return(0,c.jsx)(m,{className:y.skipToContent})}var x=n(6668),k=n(9689);function _(e){let{width:t=21,height:n=21,color:o="currentColor",strokeWidth:r=1.2,className:s,...a}=e;return(0,c.jsx)("svg",{viewBox:"0 0 15 15",width:t,height:n,...a,children:(0,c.jsx)("g",{stroke:o,strokeWidth:r,children:(0,c.jsx)("path",{d:"M.75.75l13.5 13.5M14.25.75L.75 14.25"})})})}const w={closeButton:"closeButton_CVFx"};function S(e){return(0,c.jsx)("button",{type:"button","aria-label":(0,d.I)({id:"theme.AnnouncementBar.closeButtonAriaLabel",message:"Close",description:"The ARIA label for close button of announcement bar"}),...e,className:(0,r.Z)("clean-btn close",w.closeButton,e.className),children:(0,c.jsx)(_,{width:14,height:14,strokeWidth:3.1})})}const E={content:"content_knG7"};function C(e){const{announcementBar:t}=(0,x.L)(),{content:n}=t;return(0,c.jsx)("div",{...e,className:(0,r.Z)(E.content,e.className),dangerouslySetInnerHTML:{__html:n}})}const T={announcementBar:"announcementBar_mb4j",announcementBarPlaceholder:"announcementBarPlaceholder_vyr4",announcementBarClose:"announcementBarClose_gvF7",announcementBarContent:"announcementBarContent_xLdY"};function j(){const{announcementBar:e}=(0,x.L)(),{isActive:t,close:n}=(0,k.nT)();if(!t)return null;const{backgroundColor:o,textColor:r,isCloseable:s}=e;return(0,c.jsxs)("div",{className:T.announcementBar,style:{backgroundColor:o,color:r},role:"banner",children:[s&&(0,c.jsx)("div",{className:T.announcementBarPlaceholder}),(0,c.jsx)(C,{className:T.announcementBarContent}),s&&(0,c.jsx)(S,{onClick:n,className:T.announcementBarClose})]})}var L=n(3163),A=n(2466);var G=n(902),N=n(3102);const P=o.createContext(null);function O(e){let{children:t}=e;const n=function(){const e=(0,L.e)(),t=(0,N.HY)(),[n,r]=(0,o.useState)(!1),s=null!==t.component,a=(0,G.D9)(s);return(0,o.useEffect)((()=>{s&&!a&&r(!0)}),[s,a]),(0,o.useEffect)((()=>{s?e.shown||r(!0):r(!1)}),[e.shown,s]),(0,o.useMemo)((()=>[n,r]),[n])}();return(0,c.jsx)(P.Provider,{value:n,children:t})}function I(e){if(e.component){const t=e.component;return(0,c.jsx)(t,{...e.props})}}function R(){const e=(0,o.useContext)(P);if(!e)throw new G.i6("NavbarSecondaryMenuDisplayProvider");const[t,n]=e,r=(0,o.useCallback)((()=>n(!1)),[n]),s=(0,N.HY)();return(0,o.useMemo)((()=>({shown:t,hide:r,content:I(s)})),[r,s,t])}function z(e){let{header:t,primaryMenu:n,secondaryMenu:o}=e;const{shown:s}=R();return(0,c.jsxs)("div",{className:"navbar-sidebar",children:[t,(0,c.jsxs)("div",{className:(0,r.Z)("navbar-sidebar__items",{"navbar-sidebar__items--show-secondary":s}),children:[(0,c.jsx)("div",{className:"navbar-sidebar__item menu",children:n}),(0,c.jsx)("div",{className:"navbar-sidebar__item menu",children:o})]})]})}var F=n(2949),D=n(2389);function M(e){return(0,c.jsx)("svg",{viewBox:"0 0 24 24",width:24,height:24,...e,children:(0,c.jsx)("path",{fill:"currentColor",d:"M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"})})}function H(e){return(0,c.jsx)("svg",{viewBox:"0 0 24 24",width:24,height:24,...e,children:(0,c.jsx)("path",{fill:"currentColor",d:"M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"})})}const B={toggle:"toggle_vylO",toggleButton:"toggleButton_gllP",darkToggleIcon:"darkToggleIcon_wfgR",lightToggleIcon:"lightToggleIcon_pyhR",toggleButtonDisabled:"toggleButtonDisabled_aARS"};function $(e){let{className:t,buttonClassName:n,value:o,onChange:s}=e;const a=(0,D.Z)(),i=(0,d.I)({message:"Switch between dark and light mode (currently {mode})",id:"theme.colorToggle.ariaLabel",description:"The ARIA label for the navbar color mode toggle"},{mode:"dark"===o?(0,d.I)({message:"dark mode",id:"theme.colorToggle.ariaLabel.mode.dark",description:"The name for the dark color mode"}):(0,d.I)({message:"light mode",id:"theme.colorToggle.ariaLabel.mode.light",description:"The name for the light color mode"})});return(0,c.jsx)("div",{className:(0,r.Z)(B.toggle,t),children:(0,c.jsxs)("button",{className:(0,r.Z)("clean-btn",B.toggleButton,!a&&B.toggleButtonDisabled,n),type:"button",onClick:()=>s("dark"===o?"light":"dark"),disabled:!a,title:i,"aria-label":i,"aria-live":"polite",children:[(0,c.jsx)(M,{className:(0,r.Z)(B.toggleIcon,B.lightToggleIcon)}),(0,c.jsx)(H,{className:(0,r.Z)(B.toggleIcon,B.darkToggleIcon)})]})})}const U=o.memo($),Z={darkNavbarColorModeToggle:"darkNavbarColorModeToggle_X3D1"};function V(e){let{className:t}=e;const n=(0,x.L)().navbar.style,o=(0,x.L)().colorMode.disableSwitch,{colorMode:r,setColorMode:s}=(0,F.I)();return o?null:(0,c.jsx)(U,{className:t,buttonClassName:"dark"===n?Z.darkNavbarColorModeToggle:void 0,value:r,onChange:s})}var q=n(1327);function W(){return(0,c.jsx)(q.Z,{className:"navbar__brand",imageClassName:"navbar__logo",titleClassName:"navbar__title text--truncate"})}function Y(){const e=(0,L.e)();return(0,c.jsx)("button",{type:"button","aria-label":(0,d.I)({id:"theme.docs.sidebar.closeSidebarButtonAriaLabel",message:"Close navigation bar",description:"The ARIA label for close button of mobile sidebar"}),className:"clean-btn navbar-sidebar__close",onClick:()=>e.toggle(),children:(0,c.jsx)(_,{color:"var(--ifm-color-emphasis-600)"})})}function Q(){return(0,c.jsxs)("div",{className:"navbar-sidebar__brand",children:[(0,c.jsx)(W,{}),(0,c.jsx)(V,{className:"margin-right--md"}),(0,c.jsx)(Y,{})]})}var K=n(9960),X=n(4996),J=n(3919);function ee(e,t){return void 0!==e&&void 0!==t&&new RegExp(e,"gi").test(t)}var te=n(9471);function ne(e){let{activeBasePath:t,activeBaseRegex:n,to:o,href:r,label:s,html:a,isDropdownLink:i,prependBaseUrlToHref:d,...l}=e;const u=(0,X.Z)(o),p=(0,X.Z)(t),f=(0,X.Z)(r,{forcePrependBaseUrl:!0}),g=s&&r&&!(0,J.Z)(r),m=a?{dangerouslySetInnerHTML:{__html:a}}:{children:(0,c.jsxs)(c.Fragment,{children:[s,g&&(0,c.jsx)(te.Z,{...i&&{width:12,height:12}})]})};return r?(0,c.jsx)(K.Z,{href:d?f:r,...l,...m}):(0,c.jsx)(K.Z,{to:u,isNavLink:!0,...(t||n)&&{isActive:(e,t)=>n?ee(n,t.pathname):t.pathname.startsWith(p)},...l,...m})}function oe(e){let{className:t,isDropdownItem:n=!1,...o}=e;const s=(0,c.jsx)(ne,{className:(0,r.Z)(n?"dropdown__link":"navbar__item navbar__link",t),isDropdownLink:n,...o});return n?(0,c.jsx)("li",{children:s}):s}function re(e){let{className:t,isDropdownItem:n,...o}=e;return(0,c.jsx)("li",{className:"menu__list-item",children:(0,c.jsx)(ne,{className:(0,r.Z)("menu__link",t),...o})})}function se(e){let{mobile:t=!1,position:n,...o}=e;const r=t?re:oe;return(0,c.jsx)(r,{...o,activeClassName:o.activeClassName??(t?"menu__link--active":"navbar__link--active")})}var ae=n(6043),ie=n(8596),de=n(2263);const le={dropdownNavbarItemMobile:"dropdownNavbarItemMobile_S0Fm"};function ce(e,t){return e.some((e=>function(e,t){return!!(0,ie.Mg)(e.to,t)||!!ee(e.activeBaseRegex,t)||!(!e.activeBasePath||!t.startsWith(e.activeBasePath))}(e,t)))}function ue(e){let{items:t,position:n,className:s,onClick:a,...i}=e;const d=(0,o.useRef)(null),[l,u]=(0,o.useState)(!1);return(0,o.useEffect)((()=>{const e=e=>{d.current&&!d.current.contains(e.target)&&u(!1)};return document.addEventListener("mousedown",e),document.addEventListener("touchstart",e),document.addEventListener("focusin",e),()=>{document.removeEventListener("mousedown",e),document.removeEventListener("touchstart",e),document.removeEventListener("focusin",e)}}),[d]),(0,c.jsxs)("div",{ref:d,className:(0,r.Z)("navbar__item","dropdown","dropdown--hoverable",{"dropdown--right":"right"===n,"dropdown--show":l}),children:[(0,c.jsx)(ne,{"aria-haspopup":"true","aria-expanded":l,role:"button",href:i.to?void 0:"#",className:(0,r.Z)("navbar__link",s),...i,onClick:i.to?void 0:e=>e.preventDefault(),onKeyDown:e=>{"Enter"===e.key&&(e.preventDefault(),u(!l))},children:i.children??i.label}),(0,c.jsx)("ul",{className:"dropdown__menu",children:t.map(((e,t)=>(0,o.createElement)(Ee,{isDropdownItem:!0,activeClassName:"dropdown__link--active",...e,key:t})))})]})}function pe(e){let{items:t,className:n,position:s,onClick:a,...d}=e;const l=function(){const{siteConfig:{baseUrl:e}}=(0,de.Z)(),{pathname:t}=(0,i.TH)();return t.replace(e,"/")}(),u=ce(t,l),{collapsed:p,toggleCollapsed:f,setCollapsed:g}=(0,ae.u)({initialState:()=>!u});return(0,o.useEffect)((()=>{u&&g(!u)}),[l,u,g]),(0,c.jsxs)("li",{className:(0,r.Z)("menu__list-item",{"menu__list-item--collapsed":p}),children:[(0,c.jsx)(ne,{role:"button",className:(0,r.Z)(le.dropdownNavbarItemMobile,"menu__link menu__link--sublist menu__link--sublist-caret",n),...d,onClick:e=>{e.preventDefault(),f()},children:d.children??d.label}),(0,c.jsx)(ae.z,{lazy:!0,as:"ul",className:"menu__list",collapsed:p,children:t.map(((e,t)=>(0,o.createElement)(Ee,{mobile:!0,isDropdownItem:!0,onClick:a,activeClassName:"menu__link--active",...e,key:t})))})]})}function fe(e){let{mobile:t=!1,...n}=e;const o=t?pe:ue;return(0,c.jsx)(o,{...n})}var ge=n(4711);function me(e){let{width:t=20,height:n=20,...o}=e;return(0,c.jsx)("svg",{viewBox:"0 0 24 24",width:t,height:n,"aria-hidden":!0,...o,children:(0,c.jsx)("path",{fill:"currentColor",d:"M12.87 15.07l-2.54-2.51.03-.03c1.74-1.94 2.98-4.17 3.71-6.53H17V4h-7V2H8v2H1v1.99h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11.76-2.04zM18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12zm-2.62 7l1.62-4.33L19.12 17h-3.24z"})})}const he="iconLanguage_nlXk";var be=n(1875);const ye={navbarSearchContainer:"navbarSearchContainer_Bca1"};function ve(e){let{children:t,className:n}=e;return(0,c.jsx)("div",{className:(0,r.Z)(n,ye.navbarSearchContainer),children:t})}var xe=n(143),ke=n(3438);var _e=n(373);const we=e=>e.docs.find((t=>t.id===e.mainDocId));const Se={default:se,localeDropdown:function(e){let{mobile:t,dropdownItemsBefore:n,dropdownItemsAfter:o,queryString:r="",...s}=e;const{i18n:{currentLocale:a,locales:l,localeConfigs:u}}=(0,de.Z)(),p=(0,ge.l)(),{search:f,hash:g}=(0,i.TH)(),m=[...n,...l.map((e=>{const n=`${`pathname://${p.createUrl({locale:e,fullyQualified:!1})}`}${f}${g}${r}`;return{label:u[e].label,lang:u[e].htmlLang,to:n,target:"_self",autoAddBaseUrl:!1,className:e===a?t?"menu__link--active":"dropdown__link--active":""}})),...o],h=t?(0,d.I)({message:"Languages",id:"theme.navbar.mobileLanguageDropdown.label",description:"The label for the mobile language switcher dropdown"}):u[a].label;return(0,c.jsx)(fe,{...s,mobile:t,label:(0,c.jsxs)(c.Fragment,{children:[(0,c.jsx)(me,{className:he}),h]}),items:m})},search:function(e){let{mobile:t,className:n}=e;return t?null:(0,c.jsx)(ve,{className:n,children:(0,c.jsx)(be.Z,{})})},dropdown:fe,html:function(e){let{value:t,className:n,mobile:o=!1,isDropdownItem:s=!1}=e;const a=s?"li":"div";return(0,c.jsx)(a,{className:(0,r.Z)({navbar__item:!o&&!s,"menu__list-item":o},n),dangerouslySetInnerHTML:{__html:t}})},doc:function(e){let{docId:t,label:n,docsPluginId:o,...r}=e;const{activeDoc:s}=(0,xe.Iw)(o),a=(0,ke.vY)(t,o),i=s?.path===a?.path;return null===a||a.unlisted&&!i?null:(0,c.jsx)(se,{exact:!0,...r,isActive:()=>i||!!s?.sidebar&&s.sidebar===a.sidebar,label:n??a.id,to:a.path})},docSidebar:function(e){let{sidebarId:t,label:n,docsPluginId:o,...r}=e;const{activeDoc:s}=(0,xe.Iw)(o),a=(0,ke.oz)(t,o).link;if(!a)throw new Error(`DocSidebarNavbarItem: Sidebar with ID "${t}" doesn't have anything to be linked to.`);return(0,c.jsx)(se,{exact:!0,...r,isActive:()=>s?.sidebar===t,label:n??a.label,to:a.path})},docsVersion:function(e){let{label:t,to:n,docsPluginId:o,...r}=e;const s=(0,ke.lO)(o)[0],a=t??s.label,i=n??(e=>e.docs.find((t=>t.id===e.mainDocId)))(s).path;return(0,c.jsx)(se,{...r,label:a,to:i})},docsVersionDropdown:function(e){let{mobile:t,docsPluginId:n,dropdownActiveClassDisabled:o,dropdownItemsBefore:r,dropdownItemsAfter:s,...a}=e;const{search:l,hash:u}=(0,i.TH)(),p=(0,xe.Iw)(n),f=(0,xe.gB)(n),{savePreferredVersionName:g}=(0,_e.J)(n),m=[...r,...f.map((e=>{const t=p.alternateDocVersions[e.name]??we(e);return{label:e.label,to:`${t.path}${l}${u}`,isActive:()=>e===p.activeVersion,onClick:()=>g(e.name)}})),...s],h=(0,ke.lO)(n)[0],b=t&&m.length>1?(0,d.I)({id:"theme.navbar.mobileVersionsDropdown.label",message:"Versions",description:"The label for the navbar versions dropdown on mobile view"}):h.label,y=t&&m.length>1?void 0:we(h).path;return m.length<=1?(0,c.jsx)(se,{...a,mobile:t,label:b,to:y,isActive:o?()=>!1:void 0}):(0,c.jsx)(fe,{...a,mobile:t,label:b,to:y,items:m,isActive:o?()=>!1:void 0})}};function Ee(e){let{type:t,...n}=e;const o=function(e,t){return e&&"default"!==e?e:"items"in t?"dropdown":"default"}(t,n),r=Se[o];if(!r)throw new Error(`No NavbarItem component found for type "${t}".`);return(0,c.jsx)(r,{...n})}function Ce(){const e=(0,L.e)(),t=(0,x.L)().navbar.items;return(0,c.jsx)("ul",{className:"menu__list",children:t.map(((t,n)=>(0,o.createElement)(Ee,{mobile:!0,...t,onClick:()=>e.toggle(),key:n})))})}function Te(e){return(0,c.jsx)("button",{...e,type:"button",className:"clean-btn navbar-sidebar__back",children:(0,c.jsx)(d.Z,{id:"theme.navbar.mobileSidebarSecondaryMenu.backButtonLabel",description:"The label of the back button to return to main menu, inside the mobile navbar sidebar secondary menu (notably used to display the docs sidebar)",children:"\u2190 Back to main menu"})})}function je(){const e=0===(0,x.L)().navbar.items.length,t=R();return(0,c.jsxs)(c.Fragment,{children:[!e&&(0,c.jsx)(Te,{onClick:()=>t.hide()}),t.content]})}function Le(){const e=(0,L.e)();var t;return void 0===(t=e.shown)&&(t=!0),(0,o.useEffect)((()=>(document.body.style.overflow=t?"hidden":"visible",()=>{document.body.style.overflow="visible"})),[t]),e.shouldRender?(0,c.jsx)(z,{header:(0,c.jsx)(Q,{}),primaryMenu:(0,c.jsx)(Ce,{}),secondaryMenu:(0,c.jsx)(je,{})}):null}const Ae={navbarHideable:"navbarHideable_m1mJ",navbarHidden:"navbarHidden_jGov"};function Ge(e){return(0,c.jsx)("div",{role:"presentation",...e,className:(0,r.Z)("navbar-sidebar__backdrop",e.className)})}function Ne(e){let{children:t}=e;const{navbar:{hideOnScroll:n,style:s}}=(0,x.L)(),a=(0,L.e)(),{navbarRef:i,isNavbarVisible:u}=function(e){const[t,n]=(0,o.useState)(e),r=(0,o.useRef)(!1),s=(0,o.useRef)(0),a=(0,o.useCallback)((e=>{null!==e&&(s.current=e.getBoundingClientRect().height)}),[]);return(0,A.RF)(((t,o)=>{let{scrollY:a}=t;if(!e)return;if(a=i?n(!1):a+l{if(!e)return;const o=t.location.hash;if(o?document.getElementById(o.substring(1)):void 0)return r.current=!0,void n(!1);n(!0)})),{navbarRef:a,isNavbarVisible:t}}(n);return(0,c.jsxs)("nav",{ref:i,"aria-label":(0,d.I)({id:"theme.NavBar.navAriaLabel",message:"Main",description:"The ARIA label for the main navigation"}),className:(0,r.Z)("navbar","navbar--fixed-top",n&&[Ae.navbarHideable,!u&&Ae.navbarHidden],{"navbar--dark":"dark"===s,"navbar--primary":"primary"===s,"navbar-sidebar--show":a.shown}),children:[t,(0,c.jsx)(Ge,{onClick:a.toggle}),(0,c.jsx)(Le,{})]})}var Pe=n(8780);const Oe={errorBoundaryError:"errorBoundaryError_a6uf",errorBoundaryFallback:"errorBoundaryFallback_VBag"};function Ie(e){return(0,c.jsx)("button",{type:"button",...e,children:(0,c.jsx)(d.Z,{id:"theme.ErrorPageContent.tryAgain",description:"The label of the button to try again rendering when the React error boundary captures an error",children:"Try again"})})}function Re(e){let{error:t}=e;const n=(0,Pe.getErrorCausalChain)(t).map((e=>e.message)).join("\n\nCause:\n");return(0,c.jsx)("p",{className:Oe.errorBoundaryError,children:n})}class ze extends o.Component{componentDidCatch(e,t){throw this.props.onError(e,t)}render(){return this.props.children}}const Fe="right";function De(e){let{width:t=30,height:n=30,className:o,...r}=e;return(0,c.jsx)("svg",{className:o,width:t,height:n,viewBox:"0 0 30 30","aria-hidden":"true",...r,children:(0,c.jsx)("path",{stroke:"currentColor",strokeLinecap:"round",strokeMiterlimit:"10",strokeWidth:"2",d:"M4 7h22M4 15h22M4 23h22"})})}function Me(){const{toggle:e,shown:t}=(0,L.e)();return(0,c.jsx)("button",{onClick:e,"aria-label":(0,d.I)({id:"theme.docs.sidebar.toggleSidebarButtonAriaLabel",message:"Toggle navigation bar",description:"The ARIA label for hamburger menu button of mobile navigation"}),"aria-expanded":t,className:"navbar__toggle clean-btn",type:"button",children:(0,c.jsx)(De,{})})}const He={colorModeToggle:"colorModeToggle_DEke"};function Be(e){let{items:t}=e;return(0,c.jsx)(c.Fragment,{children:t.map(((e,t)=>(0,c.jsx)(ze,{onError:t=>new Error(`A theme navbar item failed to render.\nPlease double-check the following navbar item (themeConfig.navbar.items) of your Docusaurus config:\n${JSON.stringify(e,null,2)}`,{cause:t}),children:(0,c.jsx)(Ee,{...e})},t)))})}function $e(e){let{left:t,right:n}=e;return(0,c.jsxs)("div",{className:"navbar__inner",children:[(0,c.jsx)("div",{className:"navbar__items",children:t}),(0,c.jsx)("div",{className:"navbar__items navbar__items--right",children:n})]})}function Ue(){const e=(0,L.e)(),t=(0,x.L)().navbar.items,[n,o]=function(e){function t(e){return"left"===(e.position??Fe)}return[e.filter(t),e.filter((e=>!t(e)))]}(t),r=t.find((e=>"search"===e.type));return(0,c.jsx)($e,{left:(0,c.jsxs)(c.Fragment,{children:[!e.disabled&&(0,c.jsx)(Me,{}),(0,c.jsx)(W,{}),(0,c.jsx)(Be,{items:n})]}),right:(0,c.jsxs)(c.Fragment,{children:[(0,c.jsx)(Be,{items:o}),(0,c.jsx)(V,{className:He.colorModeToggle}),!r&&(0,c.jsx)(ve,{children:(0,c.jsx)(be.Z,{})})]})})}function Ze(){return(0,c.jsx)(Ne,{children:(0,c.jsx)(Ue,{})})}function Ve(e){let{item:t}=e;const{to:n,href:o,label:r,prependBaseUrlToHref:s,...a}=t,i=(0,X.Z)(n),d=(0,X.Z)(o,{forcePrependBaseUrl:!0});return(0,c.jsxs)(K.Z,{className:"footer__link-item",...o?{href:s?d:o}:{to:i},...a,children:[r,o&&!(0,J.Z)(o)&&(0,c.jsx)(te.Z,{})]})}function qe(e){let{item:t}=e;return t.html?(0,c.jsx)("li",{className:"footer__item",dangerouslySetInnerHTML:{__html:t.html}}):(0,c.jsx)("li",{className:"footer__item",children:(0,c.jsx)(Ve,{item:t})},t.href??t.to)}function We(e){let{column:t}=e;return(0,c.jsxs)("div",{className:"col footer__col",children:[(0,c.jsx)("div",{className:"footer__title",children:t.title}),(0,c.jsx)("ul",{className:"footer__items clean-list",children:t.items.map(((e,t)=>(0,c.jsx)(qe,{item:e},t)))})]})}function Ye(e){let{columns:t}=e;return(0,c.jsx)("div",{className:"row footer__links",children:t.map(((e,t)=>(0,c.jsx)(We,{column:e},t)))})}function Qe(){return(0,c.jsx)("span",{className:"footer__link-separator",children:"\xb7"})}function Ke(e){let{item:t}=e;return t.html?(0,c.jsx)("span",{className:"footer__link-item",dangerouslySetInnerHTML:{__html:t.html}}):(0,c.jsx)(Ve,{item:t})}function Xe(e){let{links:t}=e;return(0,c.jsx)("div",{className:"footer__links text--center",children:(0,c.jsx)("div",{className:"footer__links",children:t.map(((e,n)=>(0,c.jsxs)(o.Fragment,{children:[(0,c.jsx)(Ke,{item:e}),t.length!==n+1&&(0,c.jsx)(Qe,{})]},n)))})})}function Je(e){let{links:t}=e;return function(e){return"title"in e[0]}(t)?(0,c.jsx)(Ye,{columns:t}):(0,c.jsx)(Xe,{links:t})}var et=n(9965);const tt={footerLogoLink:"footerLogoLink_BH7S"};function nt(e){let{logo:t}=e;const{withBaseUrl:n}=(0,X.C)(),o={light:n(t.src),dark:n(t.srcDark??t.src)};return(0,c.jsx)(et.Z,{className:(0,r.Z)("footer__logo",t.className),alt:t.alt,sources:o,width:t.width,height:t.height,style:t.style})}function ot(e){let{logo:t}=e;return t.href?(0,c.jsx)(K.Z,{href:t.href,className:tt.footerLogoLink,target:t.target,children:(0,c.jsx)(nt,{logo:t})}):(0,c.jsx)(nt,{logo:t})}function rt(e){let{copyright:t}=e;return(0,c.jsx)("div",{className:"footer__copyright",dangerouslySetInnerHTML:{__html:t}})}function st(e){let{style:t,links:n,logo:o,copyright:s}=e;return(0,c.jsx)("footer",{className:(0,r.Z)("footer",{"footer--dark":"dark"===t}),children:(0,c.jsxs)("div",{className:"container container-fluid",children:[n,(o||s)&&(0,c.jsxs)("div",{className:"footer__bottom text--center",children:[o&&(0,c.jsx)("div",{className:"margin-bottom--sm",children:o}),s]})]})})}function at(){const{footer:e}=(0,x.L)();if(!e)return null;const{copyright:t,links:n,logo:o,style:r}=e;return(0,c.jsx)(st,{style:r,links:n&&n.length>0&&(0,c.jsx)(Je,{links:n}),logo:o&&(0,c.jsx)(ot,{logo:o}),copyright:t&&(0,c.jsx)(rt,{copyright:t})})}const it=o.memo(at),dt=(0,G.Qc)([F.S,k.pl,A.OC,_e.L5,a.VC,function(e){let{children:t}=e;return(0,c.jsx)(N.n2,{children:(0,c.jsx)(L.M,{children:(0,c.jsx)(O,{children:t})})})}]);function lt(e){let{children:t}=e;return(0,c.jsx)(dt,{children:t})}var ct=n(7955);function ut(e){let{error:t,tryAgain:n}=e;return(0,c.jsx)("main",{className:"container margin-vert--xl",children:(0,c.jsx)("div",{className:"row",children:(0,c.jsxs)("div",{className:"col col--6 col--offset-3",children:[(0,c.jsx)(ct.Z,{as:"h1",className:"hero__title",children:(0,c.jsx)(d.Z,{id:"theme.ErrorPageContent.title",description:"The title of the fallback page when the page crashed",children:"This page crashed."})}),(0,c.jsx)("div",{className:"margin-vert--lg",children:(0,c.jsx)(Ie,{onClick:n,className:"button button--primary shadow--lw"})}),(0,c.jsx)("hr",{}),(0,c.jsx)("div",{className:"margin-vert--md",children:(0,c.jsx)(Re,{error:t})})]})})})}const pt={mainWrapper:"mainWrapper_z2l0"};function ft(e){const{children:t,noFooter:n,wrapperClassName:o,title:i,description:d}=e;return(0,b.t)(),(0,c.jsxs)(lt,{children:[(0,c.jsx)(a.d,{title:i,description:d}),(0,c.jsx)(v,{}),(0,c.jsx)(j,{}),(0,c.jsx)(Ze,{}),(0,c.jsx)("div",{id:u,className:(0,r.Z)(h.k.wrapper.main,pt.mainWrapper,o),children:(0,c.jsx)(s.Z,{fallback:e=>(0,c.jsx)(ut,{...e}),children:t})}),!n&&(0,c.jsx)(it,{})]})}},1327:(e,t,n)=>{"use strict";n.d(t,{Z:()=>c});n(7294);var o=n(9960),r=n(4996),s=n(2263),a=n(6668),i=n(9965),d=n(5893);function l(e){let{logo:t,alt:n,imageClassName:o}=e;const s={light:(0,r.Z)(t.src),dark:(0,r.Z)(t.srcDark||t.src)},a=(0,d.jsx)(i.Z,{className:t.className,sources:s,height:t.height,width:t.width,alt:n,style:t.style});return o?(0,d.jsx)("div",{className:o,children:a}):a}function c(e){const{siteConfig:{title:t}}=(0,s.Z)(),{navbar:{title:n,logo:i}}=(0,a.L)(),{imageClassName:c,titleClassName:u,...p}=e,f=(0,r.Z)(i?.href||"/"),g=n?"":t,m=i?.alt??g;return(0,d.jsxs)(o.Z,{to:f,...p,...i?.target&&{target:i.target},children:[i&&(0,d.jsx)(l,{logo:i,alt:m,imageClassName:c}),null!=n&&(0,d.jsx)("b",{className:u,children:n})]})}},197:(e,t,n)=>{"use strict";n.d(t,{Z:()=>s});n(7294);var o=n(5742),r=n(5893);function s(e){let{locale:t,version:n,tag:s}=e;const a=t;return(0,r.jsxs)(o.Z,{children:[t&&(0,r.jsx)("meta",{name:"docusaurus_locale",content:t}),n&&(0,r.jsx)("meta",{name:"docusaurus_version",content:n}),s&&(0,r.jsx)("meta",{name:"docusaurus_tag",content:s}),a&&(0,r.jsx)("meta",{name:"docsearch:language",content:a}),n&&(0,r.jsx)("meta",{name:"docsearch:version",content:n}),s&&(0,r.jsx)("meta",{name:"docsearch:docusaurus_tag",content:s})]})}},9965:(e,t,n)=>{"use strict";n.d(t,{Z:()=>c});var o=n(7294),r=n(512),s=n(2389),a=n(2949);const i={themedComponent:"themedComponent_mlkZ","themedComponent--light":"themedComponent--light_NVdE","themedComponent--dark":"themedComponent--dark_xIcU"};var d=n(5893);function l(e){let{className:t,children:n}=e;const l=(0,s.Z)(),{colorMode:c}=(0,a.I)();return(0,d.jsx)(d.Fragment,{children:(l?"dark"===c?["dark"]:["light"]:["light","dark"]).map((e=>{const s=n({theme:e,className:(0,r.Z)(t,i.themedComponent,i[`themedComponent--${e}`])});return(0,d.jsx)(o.Fragment,{children:s},e)}))})}function c(e){const{sources:t,className:n,alt:o,...r}=e;return(0,d.jsx)(l,{className:n,children:e=>{let{theme:n,className:s}=e;return(0,d.jsx)("img",{src:t[n],alt:o,className:s,...r})}})}},6043:(e,t,n)=>{"use strict";n.d(t,{u:()=>l,z:()=>b});var o=n(7294),r=n(412),s=n(469),a=n(1442),i=n(5893);const d="ease-in-out";function l(e){let{initialState:t}=e;const[n,r]=(0,o.useState)(t??!1),s=(0,o.useCallback)((()=>{r((e=>!e))}),[]);return{collapsed:n,setCollapsed:r,toggleCollapsed:s}}const c={display:"none",overflow:"hidden",height:"0px"},u={display:"block",overflow:"visible",height:"auto"};function p(e,t){const n=t?c:u;e.style.display=n.display,e.style.overflow=n.overflow,e.style.height=n.height}function f(e){let{collapsibleRef:t,collapsed:n,animation:r}=e;const s=(0,o.useRef)(!1);(0,o.useEffect)((()=>{const e=t.current;function o(){const t=e.scrollHeight,n=r?.duration??function(e){if((0,a.n)())return 1;const t=e/36;return Math.round(10*(4+15*t**.25+t/5))}(t);return{transition:`height ${n}ms ${r?.easing??d}`,height:`${t}px`}}function i(){const t=o();e.style.transition=t.transition,e.style.height=t.height}if(!s.current)return p(e,n),void(s.current=!0);return e.style.willChange="height",function(){const t=requestAnimationFrame((()=>{n?(i(),requestAnimationFrame((()=>{e.style.height=c.height,e.style.overflow=c.overflow}))):(e.style.display="block",requestAnimationFrame((()=>{i()})))}));return()=>cancelAnimationFrame(t)}()}),[t,n,r])}function g(e){if(!r.Z.canUseDOM)return e?c:u}function m(e){let{as:t="div",collapsed:n,children:r,animation:s,onCollapseTransitionEnd:a,className:d,disableSSRStyle:l}=e;const c=(0,o.useRef)(null);return f({collapsibleRef:c,collapsed:n,animation:s}),(0,i.jsx)(t,{ref:c,style:l?void 0:g(n),onTransitionEnd:e=>{"height"===e.propertyName&&(p(c.current,n),a?.(n))},className:d,children:r})}function h(e){let{collapsed:t,...n}=e;const[r,a]=(0,o.useState)(!t),[d,l]=(0,o.useState)(t);return(0,s.Z)((()=>{t||a(!0)}),[t]),(0,s.Z)((()=>{r&&l(t)}),[r,t]),r?(0,i.jsx)(m,{...n,collapsed:d}):null}function b(e){let{lazy:t,...n}=e;const o=t?h:m;return(0,i.jsx)(o,{...n})}},9689:(e,t,n)=>{"use strict";n.d(t,{nT:()=>m,pl:()=>g});var o=n(7294),r=n(2389),s=n(12),a=n(902),i=n(6668),d=n(5893);const l=(0,s.WA)("docusaurus.announcement.dismiss"),c=(0,s.WA)("docusaurus.announcement.id"),u=()=>"true"===l.get(),p=e=>l.set(String(e)),f=o.createContext(null);function g(e){let{children:t}=e;const n=function(){const{announcementBar:e}=(0,i.L)(),t=(0,r.Z)(),[n,s]=(0,o.useState)((()=>!!t&&u()));(0,o.useEffect)((()=>{s(u())}),[]);const a=(0,o.useCallback)((()=>{p(!0),s(!0)}),[]);return(0,o.useEffect)((()=>{if(!e)return;const{id:t}=e;let n=c.get();"annoucement-bar"===n&&(n="announcement-bar");const o=t!==n;c.set(t),o&&p(!1),!o&&u()||s(!1)}),[e]),(0,o.useMemo)((()=>({isActive:!!e&&!n,close:a})),[e,n,a])}();return(0,d.jsx)(f.Provider,{value:n,children:t})}function m(){const e=(0,o.useContext)(f);if(!e)throw new a.i6("AnnouncementBarProvider");return e}},2949:(e,t,n)=>{"use strict";n.d(t,{I:()=>b,S:()=>h});var o=n(7294),r=n(412),s=n(902),a=n(12),i=n(6668),d=n(5893);const l=o.createContext(void 0),c="theme",u=(0,a.WA)(c),p={light:"light",dark:"dark"},f=e=>e===p.dark?p.dark:p.light,g=e=>r.Z.canUseDOM?f(document.documentElement.getAttribute("data-theme")):f(e),m=e=>{u.set(f(e))};function h(e){let{children:t}=e;const n=function(){const{colorMode:{defaultMode:e,disableSwitch:t,respectPrefersColorScheme:n}}=(0,i.L)(),[r,s]=(0,o.useState)(g(e));(0,o.useEffect)((()=>{t&&u.del()}),[t]);const a=(0,o.useCallback)((function(t,o){void 0===o&&(o={});const{persist:r=!0}=o;t?(s(t),r&&m(t)):(s(n?window.matchMedia("(prefers-color-scheme: dark)").matches?p.dark:p.light:e),u.del())}),[n,e]);(0,o.useEffect)((()=>{document.documentElement.setAttribute("data-theme",f(r))}),[r]),(0,o.useEffect)((()=>{if(t)return;const e=e=>{if(e.key!==c)return;const t=u.get();null!==t&&a(f(t))};return window.addEventListener("storage",e),()=>window.removeEventListener("storage",e)}),[t,a]);const d=(0,o.useRef)(!1);return(0,o.useEffect)((()=>{if(t&&!n)return;const e=window.matchMedia("(prefers-color-scheme: dark)"),o=()=>{window.matchMedia("print").matches||d.current?d.current=window.matchMedia("print").matches:a(null)};return e.addListener(o),()=>e.removeListener(o)}),[a,t,n]),(0,o.useMemo)((()=>({colorMode:r,setColorMode:a,get isDarkTheme(){return r===p.dark},setLightTheme(){a(p.light)},setDarkTheme(){a(p.dark)}})),[r,a])}();return(0,d.jsx)(l.Provider,{value:n,children:t})}function b(){const e=(0,o.useContext)(l);if(null==e)throw new s.i6("ColorModeProvider","Please see https://docusaurus.io/docs/api/themes/configuration#use-color-mode.");return e}},373:(e,t,n)=>{"use strict";n.d(t,{J:()=>v,L5:()=>b});var o=n(7294),r=n(143),s=n(9935),a=n(6668),i=n(3438),d=n(902),l=n(12),c=n(5893);const u=e=>`docs-preferred-version-${e}`,p={save:(e,t,n)=>{(0,l.WA)(u(e),{persistence:t}).set(n)},read:(e,t)=>(0,l.WA)(u(e),{persistence:t}).get(),clear:(e,t)=>{(0,l.WA)(u(e),{persistence:t}).del()}},f=e=>Object.fromEntries(e.map((e=>[e,{preferredVersionName:null}])));const g=o.createContext(null);function m(){const e=(0,r._r)(),t=(0,a.L)().docs.versionPersistence,n=(0,o.useMemo)((()=>Object.keys(e)),[e]),[s,i]=(0,o.useState)((()=>f(n)));(0,o.useEffect)((()=>{i(function(e){let{pluginIds:t,versionPersistence:n,allDocsData:o}=e;function r(e){const t=p.read(e,n);return o[e].versions.some((e=>e.name===t))?{preferredVersionName:t}:(p.clear(e,n),{preferredVersionName:null})}return Object.fromEntries(t.map((e=>[e,r(e)])))}({allDocsData:e,versionPersistence:t,pluginIds:n}))}),[e,t,n]);return[s,(0,o.useMemo)((()=>({savePreferredVersion:function(e,n){p.save(e,t,n),i((t=>({...t,[e]:{preferredVersionName:n}})))}})),[t])]}function h(e){let{children:t}=e;const n=m();return(0,c.jsx)(g.Provider,{value:n,children:t})}function b(e){let{children:t}=e;return i.cE?(0,c.jsx)(h,{children:t}):(0,c.jsx)(c.Fragment,{children:t})}function y(){const e=(0,o.useContext)(g);if(!e)throw new d.i6("DocsPreferredVersionContextProvider");return e}function v(e){void 0===e&&(e=s.m);const t=(0,r.zh)(e),[n,a]=y(),{preferredVersionName:i}=n[e];return{preferredVersion:t.versions.find((e=>e.name===i))??null,savePreferredVersionName:(0,o.useCallback)((t=>{a.savePreferredVersion(e,t)}),[a,e])}}},1116:(e,t,n)=>{"use strict";n.d(t,{V:()=>l,b:()=>d});var o=n(7294),r=n(902),s=n(5893);const a=Symbol("EmptyContext"),i=o.createContext(a);function d(e){let{children:t,name:n,items:r}=e;const a=(0,o.useMemo)((()=>n&&r?{name:n,items:r}:null),[n,r]);return(0,s.jsx)(i.Provider,{value:a,children:t})}function l(){const e=(0,o.useContext)(i);if(e===a)throw new r.i6("DocsSidebarProvider");return e}},4477:(e,t,n)=>{"use strict";n.d(t,{E:()=>d,q:()=>i});var o=n(7294),r=n(902),s=n(5893);const a=o.createContext(null);function i(e){let{children:t,version:n}=e;return(0,s.jsx)(a.Provider,{value:n,children:t})}function d(){const e=(0,o.useContext)(a);if(null===e)throw new r.i6("DocsVersionProvider");return e}},3163:(e,t,n)=>{"use strict";n.d(t,{M:()=>p,e:()=>f});var o=n(7294),r=n(3102),s=n(7524),a=n(1980),i=n(6668),d=n(902),l=n(5893);const c=o.createContext(void 0);function u(){const e=function(){const e=(0,r.HY)(),{items:t}=(0,i.L)().navbar;return 0===t.length&&!e.component}(),t=(0,s.i)(),n=!e&&"mobile"===t,[d,l]=(0,o.useState)(!1);(0,a.Rb)((()=>{if(d)return l(!1),!1}));const c=(0,o.useCallback)((()=>{l((e=>!e))}),[]);return(0,o.useEffect)((()=>{"desktop"===t&&l(!1)}),[t]),(0,o.useMemo)((()=>({disabled:e,shouldRender:n,toggle:c,shown:d})),[e,n,c,d])}function p(e){let{children:t}=e;const n=u();return(0,l.jsx)(c.Provider,{value:n,children:t})}function f(){const e=o.useContext(c);if(void 0===e)throw new d.i6("NavbarMobileSidebarProvider");return e}},3102:(e,t,n)=>{"use strict";n.d(t,{HY:()=>d,Zo:()=>l,n2:()=>i});var o=n(7294),r=n(902),s=n(5893);const a=o.createContext(null);function i(e){let{children:t}=e;const n=(0,o.useState)({component:null,props:null});return(0,s.jsx)(a.Provider,{value:n,children:t})}function d(){const e=(0,o.useContext)(a);if(!e)throw new r.i6("NavbarSecondaryMenuContentProvider");return e[0]}function l(e){let{component:t,props:n}=e;const s=(0,o.useContext)(a);if(!s)throw new r.i6("NavbarSecondaryMenuContentProvider");const[,i]=s,d=(0,r.Ql)(n);return(0,o.useEffect)((()=>{i({component:t,props:d})}),[i,t,d]),(0,o.useEffect)((()=>()=>i({component:null,props:null})),[i]),null}},9727:(e,t,n)=>{"use strict";n.d(t,{h:()=>r,t:()=>s});var o=n(7294);const r="navigation-with-keyboard";function s(){(0,o.useEffect)((()=>{function e(e){"keydown"===e.type&&"Tab"===e.key&&document.body.classList.add(r),"mousedown"===e.type&&document.body.classList.remove(r)}return document.addEventListener("keydown",e),document.addEventListener("mousedown",e),()=>{document.body.classList.remove(r),document.removeEventListener("keydown",e),document.removeEventListener("mousedown",e)}}),[])}},7524:(e,t,n)=>{"use strict";n.d(t,{i:()=>i});var o=n(7294),r=n(412);const s={desktop:"desktop",mobile:"mobile",ssr:"ssr"},a=996;function i(){const[e,t]=(0,o.useState)((()=>"ssr"));return(0,o.useEffect)((()=>{function e(){t(function(){if(!r.Z.canUseDOM)throw new Error("getWindowSize() should only be called after React hydration");return window.innerWidth>a?s.desktop:s.mobile}())}return e(),window.addEventListener("resize",e),()=>{window.removeEventListener("resize",e)}}),[]),e}},5281:(e,t,n)=>{"use strict";n.d(t,{k:()=>o});const o={page:{blogListPage:"blog-list-page",blogPostPage:"blog-post-page",blogTagsListPage:"blog-tags-list-page",blogTagPostListPage:"blog-tags-post-list-page",docsDocPage:"docs-doc-page",docsTagsListPage:"docs-tags-list-page",docsTagDocListPage:"docs-tags-doc-list-page",mdxPage:"mdx-page"},wrapper:{main:"main-wrapper",blogPages:"blog-wrapper",docsPages:"docs-wrapper",mdxPages:"mdx-wrapper"},common:{editThisPage:"theme-edit-this-page",lastUpdated:"theme-last-updated",backToTopButton:"theme-back-to-top-button",codeBlock:"theme-code-block",admonition:"theme-admonition",unlistedBanner:"theme-unlisted-banner",admonitionType:e=>`theme-admonition-${e}`},layout:{},docs:{docVersionBanner:"theme-doc-version-banner",docVersionBadge:"theme-doc-version-badge",docBreadcrumbs:"theme-doc-breadcrumbs",docMarkdown:"theme-doc-markdown",docTocMobile:"theme-doc-toc-mobile",docTocDesktop:"theme-doc-toc-desktop",docFooter:"theme-doc-footer",docFooterTagsRow:"theme-doc-footer-tags-row",docFooterEditMetaRow:"theme-doc-footer-edit-meta-row",docSidebarContainer:"theme-doc-sidebar-container",docSidebarMenu:"theme-doc-sidebar-menu",docSidebarItemCategory:"theme-doc-sidebar-item-category",docSidebarItemLink:"theme-doc-sidebar-item-link",docSidebarItemCategoryLevel:e=>`theme-doc-sidebar-item-category-level-${e}`,docSidebarItemLinkLevel:e=>`theme-doc-sidebar-item-link-level-${e}`},blog:{}}},1442:(e,t,n)=>{"use strict";function o(){return window.matchMedia("(prefers-reduced-motion: reduce)").matches}n.d(t,{n:()=>o})},3438:(e,t,n)=>{"use strict";n.d(t,{LM:()=>g,MN:()=>T,SN:()=>C,_F:()=>y,cE:()=>p,f:()=>x,jA:()=>m,lO:()=>w,oz:()=>S,s1:()=>_,vY:()=>E,xz:()=>f});var o=n(7294),r=n(6550),s=n(8790),a=n(143),i=n(373),d=n(4477),l=n(1116),c=n(7392),u=n(8596);const p=!!a._r;function f(e){const t=(0,d.E)();if(!e)return;const n=t.docs[e];if(!n)throw new Error(`no version doc found by id=${e}`);return n}function g(e){return"link"!==e.type||e.unlisted?"category"===e.type?function(e){if(e.href&&!e.linkUnlisted)return e.href;for(const t of e.items){const e=g(t);if(e)return e}}(e):void 0:e.href}function m(){const{pathname:e}=(0,r.TH)(),t=(0,l.V)();if(!t)throw new Error("Unexpected: cant find current sidebar in context");const n=k({sidebarItems:t.items,pathname:e,onlyCategories:!0}).slice(-1)[0];if(!n)throw new Error(`${e} is not associated with a category. useCurrentSidebarCategory() should only be used on category index pages.`);return n}const h=(e,t)=>void 0!==e&&(0,u.Mg)(e,t),b=(e,t)=>e.some((e=>y(e,t)));function y(e,t){return"link"===e.type?h(e.href,t):"category"===e.type&&(h(e.href,t)||b(e.items,t))}function v(e,t){switch(e.type){case"category":return y(e,t)||e.items.some((e=>v(e,t)));case"link":return!e.unlisted||y(e,t);default:return!0}}function x(e,t){return(0,o.useMemo)((()=>e.filter((e=>v(e,t)))),[e,t])}function k(e){let{sidebarItems:t,pathname:n,onlyCategories:o=!1}=e;const r=[];return function e(t){for(const s of t)if("category"===s.type&&((0,u.Mg)(s.href,n)||e(s.items))||"link"===s.type&&(0,u.Mg)(s.href,n)){return o&&"category"!==s.type||r.unshift(s),!0}return!1}(t),r}function _(){const e=(0,l.V)(),{pathname:t}=(0,r.TH)(),n=(0,a.gA)()?.pluginData.breadcrumbs;return!1!==n&&e?k({sidebarItems:e.items,pathname:t}):null}function w(e){const{activeVersion:t}=(0,a.Iw)(e),{preferredVersion:n}=(0,i.J)(e),r=(0,a.yW)(e);return(0,o.useMemo)((()=>(0,c.j)([t,n,r].filter(Boolean))),[t,n,r])}function S(e,t){const n=w(t);return(0,o.useMemo)((()=>{const t=n.flatMap((e=>e.sidebars?Object.entries(e.sidebars):[])),o=t.find((t=>t[0]===e));if(!o)throw new Error(`Can't find any sidebar with id "${e}" in version${n.length>1?"s":""} ${n.map((e=>e.name)).join(", ")}".\nAvailable sidebar ids are:\n- ${t.map((e=>e[0])).join("\n- ")}`);return o[1]}),[e,n])}function E(e,t){const n=w(t);return(0,o.useMemo)((()=>{const t=n.flatMap((e=>e.docs)),o=t.find((t=>t.id===e));if(!o){if(n.flatMap((e=>e.draftIds)).includes(e))return null;throw new Error(`Couldn't find any doc with id "${e}" in version${n.length>1?"s":""} "${n.map((e=>e.name)).join(", ")}".\nAvailable doc ids are:\n- ${(0,c.j)(t.map((e=>e.id))).join("\n- ")}`)}return o}),[e,n])}function C(e){let{route:t}=e;const n=(0,r.TH)(),o=(0,d.E)(),a=t.routes,i=a.find((e=>(0,r.LX)(n.pathname,e)));if(!i)return null;const l=i.sidebar,c=l?o.docsSidebars[l]:void 0;return{docElement:(0,s.H)(a),sidebarName:l,sidebarItems:c}}function T(e){return e.filter((e=>!("category"===e.type||"link"===e.type)||!!g(e)))}},1980:(e,t,n)=>{"use strict";n.d(t,{Rb:()=>a,_X:()=>i});var o=n(7294),r=n(6550),s=n(902);function a(e){!function(e){const t=(0,r.k6)(),n=(0,s.zX)(e);(0,o.useEffect)((()=>t.block(((e,t)=>n(e,t)))),[t,n])}(((t,n)=>{if("POP"===n)return e(t,n)}))}function i(e){return function(e){const t=(0,r.k6)();return(0,o.useSyncExternalStore)(t.listen,(()=>e(t)),(()=>e(t)))}((t=>null===e?null:new URLSearchParams(t.location.search).get(e)))}},7392:(e,t,n)=>{"use strict";function o(e,t){return void 0===t&&(t=(e,t)=>e===t),e.filter(((n,o)=>e.findIndex((e=>t(e,n)))!==o))}function r(e){return Array.from(new Set(e))}n.d(t,{j:()=>r,l:()=>o})},1944:(e,t,n)=>{"use strict";n.d(t,{FG:()=>f,d:()=>u,VC:()=>g});var o=n(7294),r=n(512),s=n(5742),a=n(226);function i(){const e=o.useContext(a._);if(!e)throw new Error("Unexpected: no Docusaurus route context found");return e}var d=n(4996),l=n(2263);var c=n(5893);function u(e){let{title:t,description:n,keywords:o,image:r,children:a}=e;const i=function(e){const{siteConfig:t}=(0,l.Z)(),{title:n,titleDelimiter:o}=t;return e?.trim().length?`${e.trim()} ${o} ${n}`:n}(t),{withBaseUrl:u}=(0,d.C)(),p=r?u(r,{absolute:!0}):void 0;return(0,c.jsxs)(s.Z,{children:[t&&(0,c.jsx)("title",{children:i}),t&&(0,c.jsx)("meta",{property:"og:title",content:i}),n&&(0,c.jsx)("meta",{name:"description",content:n}),n&&(0,c.jsx)("meta",{property:"og:description",content:n}),o&&(0,c.jsx)("meta",{name:"keywords",content:Array.isArray(o)?o.join(","):o}),p&&(0,c.jsx)("meta",{property:"og:image",content:p}),p&&(0,c.jsx)("meta",{name:"twitter:image",content:p}),a]})}const p=o.createContext(void 0);function f(e){let{className:t,children:n}=e;const a=o.useContext(p),i=(0,r.Z)(a,t);return(0,c.jsxs)(p.Provider,{value:i,children:[(0,c.jsx)(s.Z,{children:(0,c.jsx)("html",{className:i})}),n]})}function g(e){let{children:t}=e;const n=i(),o=`plugin-${n.plugin.name.replace(/docusaurus-(?:plugin|theme)-(?:content-)?/gi,"")}`;const s=`plugin-id-${n.plugin.id}`;return(0,c.jsx)(f,{className:(0,r.Z)(o,s),children:t})}},902:(e,t,n)=>{"use strict";n.d(t,{D9:()=>i,Qc:()=>c,Ql:()=>l,i6:()=>d,zX:()=>a});var o=n(7294),r=n(469),s=n(5893);function a(e){const t=(0,o.useRef)(e);return(0,r.Z)((()=>{t.current=e}),[e]),(0,o.useCallback)((function(){return t.current(...arguments)}),[])}function i(e){const t=(0,o.useRef)();return(0,r.Z)((()=>{t.current=e})),t.current}class d extends Error{constructor(e,t){super(),this.name="ReactContextError",this.message=`Hook ${this.stack?.split("\n")[1]?.match(/at (?:\w+\.)?(?\w+)/)?.groups.name??""} is called outside the <${e}>. ${t??""}`}}function l(e){const t=Object.entries(e);return t.sort(((e,t)=>e[0].localeCompare(t[0]))),(0,o.useMemo)((()=>e),t.flat())}function c(e){return t=>{let{children:n}=t;return(0,s.jsx)(s.Fragment,{children:e.reduceRight(((e,t)=>(0,s.jsx)(t,{children:e})),n)})}}},8596:(e,t,n)=>{"use strict";n.d(t,{Mg:()=>a,Ns:()=>i});var o=n(7294),r=n(723),s=n(2263);function a(e,t){const n=e=>(!e||e.endsWith("/")?e:`${e}/`)?.toLowerCase();return n(e)===n(t)}function i(){const{baseUrl:e}=(0,s.Z)().siteConfig;return(0,o.useMemo)((()=>function(e){let{baseUrl:t,routes:n}=e;function o(e){return e.path===t&&!0===e.exact}function r(e){return e.path===t&&!e.exact}return function e(t){if(0===t.length)return;return t.find(o)||e(t.filter(r).flatMap((e=>e.routes??[])))}(n)}({routes:r.Z,baseUrl:e})),[e])}},2466:(e,t,n)=>{"use strict";n.d(t,{Ct:()=>m,OC:()=>c,RF:()=>f,o5:()=>g});var o=n(7294),r=n(412),s=n(2389),a=n(469),i=n(902),d=n(5893);const l=o.createContext(void 0);function c(e){let{children:t}=e;const n=function(){const e=(0,o.useRef)(!0);return(0,o.useMemo)((()=>({scrollEventsEnabledRef:e,enableScrollEvents:()=>{e.current=!0},disableScrollEvents:()=>{e.current=!1}})),[])}();return(0,d.jsx)(l.Provider,{value:n,children:t})}function u(){const e=(0,o.useContext)(l);if(null==e)throw new i.i6("ScrollControllerProvider");return e}const p=()=>r.Z.canUseDOM?{scrollX:window.pageXOffset,scrollY:window.pageYOffset}:null;function f(e,t){void 0===t&&(t=[]);const{scrollEventsEnabledRef:n}=u(),r=(0,o.useRef)(p()),s=(0,i.zX)(e);(0,o.useEffect)((()=>{const e=()=>{if(!n.current)return;const e=p();s(e,r.current),r.current=e},t={passive:!0};return e(),window.addEventListener("scroll",e,t),()=>window.removeEventListener("scroll",e,t)}),[s,n,...t])}function g(){const e=u(),t=function(){const e=(0,o.useRef)({elem:null,top:0}),t=(0,o.useCallback)((t=>{e.current={elem:t,top:t.getBoundingClientRect().top}}),[]),n=(0,o.useCallback)((()=>{const{current:{elem:t,top:n}}=e;if(!t)return{restored:!1};const o=t.getBoundingClientRect().top-n;return o&&window.scrollBy({left:0,top:o}),e.current={elem:null,top:0},{restored:0!==o}}),[]);return(0,o.useMemo)((()=>({save:t,restore:n})),[n,t])}(),n=(0,o.useRef)(void 0),r=(0,o.useCallback)((o=>{t.save(o),e.disableScrollEvents(),n.current=()=>{const{restored:o}=t.restore();if(n.current=void 0,o){const t=()=>{e.enableScrollEvents(),window.removeEventListener("scroll",t)};window.addEventListener("scroll",t)}else e.enableScrollEvents()}}),[e,t]);return(0,a.Z)((()=>{queueMicrotask((()=>n.current?.()))})),{blockElementScrollPositionUntilNextRender:r}}function m(){const e=(0,o.useRef)(null),t=(0,s.Z)()&&"smooth"===getComputedStyle(document.documentElement).scrollBehavior;return{startScroll:n=>{e.current=t?function(e){return window.scrollTo({top:e,behavior:"smooth"}),()=>{}}(n):function(e){let t=null;const n=document.documentElement.scrollTop>e;return function o(){const r=document.documentElement.scrollTop;(n&&r>e||!n&&rt&&cancelAnimationFrame(t)}(n)},cancelScroll:()=>e.current?.()}}},3320:(e,t,n)=>{"use strict";n.d(t,{HX:()=>o,os:()=>r});n(2263);const o="default";function r(e,t){return`docs-${e}-${t}`}},12:(e,t,n)=>{"use strict";n.d(t,{Nk:()=>c,WA:()=>l});var o=n(7294);const r="localStorage";function s(e){let{key:t,oldValue:n,newValue:o,storage:r}=e;if(n===o)return;const s=document.createEvent("StorageEvent");s.initStorageEvent("storage",!1,!1,t,n,o,window.location.href,r),window.dispatchEvent(s)}function a(e){if(void 0===e&&(e=r),"undefined"==typeof window)throw new Error("Browser storage is not available on Node.js/Docusaurus SSR process.");if("none"===e)return null;try{return window[e]}catch(n){return t=n,i||(console.warn("Docusaurus browser storage is not available.\nPossible reasons: running Docusaurus in an iframe, in an incognito browser session, or using too strict browser privacy settings.",t),i=!0),null}var t}let i=!1;const d={get:()=>null,set:()=>{},del:()=>{},listen:()=>()=>{}};function l(e,t){if("undefined"==typeof window)return function(e){function t(){throw new Error(`Illegal storage API usage for storage key "${e}".\nDocusaurus storage APIs are not supposed to be called on the server-rendering process.\nPlease only call storage APIs in effects and event handlers.`)}return{get:t,set:t,del:t,listen:t}}(e);const n=a(t?.persistence);return null===n?d:{get:()=>{try{return n.getItem(e)}catch(t){return console.error(`Docusaurus storage error, can't get key=${e}`,t),null}},set:t=>{try{const o=n.getItem(e);n.setItem(e,t),s({key:e,oldValue:o,newValue:t,storage:n})}catch(o){console.error(`Docusaurus storage error, can't set ${e}=${t}`,o)}},del:()=>{try{const t=n.getItem(e);n.removeItem(e),s({key:e,oldValue:t,newValue:null,storage:n})}catch(t){console.error(`Docusaurus storage error, can't delete key=${e}`,t)}},listen:t=>{try{const o=o=>{o.storageArea===n&&o.key===e&&t(o)};return window.addEventListener("storage",o),()=>window.removeEventListener("storage",o)}catch(o){return console.error(`Docusaurus storage error, can't listen for changes of key=${e}`,o),()=>{}}}}}function c(e,t){const n=(0,o.useRef)((()=>null===e?d:l(e,t))).current(),r=(0,o.useCallback)((e=>"undefined"==typeof window?()=>{}:n.listen(e)),[n]);return[(0,o.useSyncExternalStore)(r,(()=>"undefined"==typeof window?null:n.get()),(()=>null)),n]}},4711:(e,t,n)=>{"use strict";n.d(t,{l:()=>a});var o=n(2263),r=n(6550),s=n(8780);function a(){const{siteConfig:{baseUrl:e,url:t,trailingSlash:n},i18n:{defaultLocale:a,currentLocale:i}}=(0,o.Z)(),{pathname:d}=(0,r.TH)(),l=(0,s.applyTrailingSlash)(d,{trailingSlash:n,baseUrl:e}),c=i===a?e:e.replace(`/${i}/`,"/"),u=l.replace(e,"");return{createUrl:function(e){let{locale:n,fullyQualified:o}=e;return`${o?t:""}${function(e){return e===a?`${c}`:`${c}${e}/`}(n)}${u}`}}}},5936:(e,t,n)=>{"use strict";n.d(t,{S:()=>a});var o=n(7294),r=n(6550),s=n(902);function a(e){const t=(0,r.TH)(),n=(0,s.D9)(t),a=(0,s.zX)(e);(0,o.useEffect)((()=>{n&&t!==n&&a({location:t,previousLocation:n})}),[a,t,n])}},6668:(e,t,n)=>{"use strict";n.d(t,{L:()=>r});var o=n(2263);function r(){return(0,o.Z)().siteConfig.themeConfig}},8802:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){const{trailingSlash:n,baseUrl:o}=t;if(e.startsWith("#"))return e;if(void 0===n)return e;const[r]=e.split(/[#?]/),s="/"===r||r===o?r:(a=r,n?function(e){return e.endsWith("/")?e:`${e}/`}(a):function(e){return e.endsWith("/")?e.slice(0,-1):e}(a));var a;return e.replace(r,s)}},4143:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getErrorCausalChain=void 0,t.getErrorCausalChain=function e(t){return t.cause?[t,...e(t.cause)]:[t]}},8780:function(e,t,n){"use strict";var o=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.getErrorCausalChain=t.applyTrailingSlash=t.blogPostContainerID=void 0,t.blogPostContainerID="__blog-post-container";var r=n(8802);Object.defineProperty(t,"applyTrailingSlash",{enumerable:!0,get:function(){return o(r).default}});var s=n(4143);Object.defineProperty(t,"getErrorCausalChain",{enumerable:!0,get:function(){return s.getErrorCausalChain}})},9318:(e,t,n)=>{"use strict";n.d(t,{lX:()=>x,q_:()=>C,ob:()=>f,PP:()=>j,Ep:()=>p});var o=n(3117);function r(e){return"/"===e.charAt(0)}function s(e,t){for(var n=t,o=n+1,r=e.length;o=0;p--){var f=a[p];"."===f?s(a,p):".."===f?(s(a,p),u++):u&&(s(a,p),u--)}if(!l)for(;u--;u)a.unshift("..");!l||""===a[0]||a[0]&&r(a[0])||a.unshift("");var g=a.join("/");return n&&"/"!==g.substr(-1)&&(g+="/"),g};var i=n(8776);function d(e){return"/"===e.charAt(0)?e:"/"+e}function l(e){return"/"===e.charAt(0)?e.substr(1):e}function c(e,t){return function(e,t){return 0===e.toLowerCase().indexOf(t.toLowerCase())&&-1!=="/?#".indexOf(e.charAt(t.length))}(e,t)?e.substr(t.length):e}function u(e){return"/"===e.charAt(e.length-1)?e.slice(0,-1):e}function p(e){var t=e.pathname,n=e.search,o=e.hash,r=t||"/";return n&&"?"!==n&&(r+="?"===n.charAt(0)?n:"?"+n),o&&"#"!==o&&(r+="#"===o.charAt(0)?o:"#"+o),r}function f(e,t,n,r){var s;"string"==typeof e?(s=function(e){var t=e||"/",n="",o="",r=t.indexOf("#");-1!==r&&(o=t.substr(r),t=t.substr(0,r));var s=t.indexOf("?");return-1!==s&&(n=t.substr(s),t=t.substr(0,s)),{pathname:t,search:"?"===n?"":n,hash:"#"===o?"":o}}(e),s.state=t):(void 0===(s=(0,o.Z)({},e)).pathname&&(s.pathname=""),s.search?"?"!==s.search.charAt(0)&&(s.search="?"+s.search):s.search="",s.hash?"#"!==s.hash.charAt(0)&&(s.hash="#"+s.hash):s.hash="",void 0!==t&&void 0===s.state&&(s.state=t));try{s.pathname=decodeURI(s.pathname)}catch(i){throw i instanceof URIError?new URIError('Pathname "'+s.pathname+'" could not be decoded. This is likely caused by an invalid percent-encoding.'):i}return n&&(s.key=n),r?s.pathname?"/"!==s.pathname.charAt(0)&&(s.pathname=a(s.pathname,r.pathname)):s.pathname=r.pathname:s.pathname||(s.pathname="/"),s}function g(){var e=null;var t=[];return{setPrompt:function(t){return e=t,function(){e===t&&(e=null)}},confirmTransitionTo:function(t,n,o,r){if(null!=e){var s="function"==typeof e?e(t,n):e;"string"==typeof s?"function"==typeof o?o(s,r):r(!0):r(!1!==s)}else r(!0)},appendListener:function(e){var n=!0;function o(){n&&e.apply(void 0,arguments)}return t.push(o),function(){n=!1,t=t.filter((function(e){return e!==o}))}},notifyListeners:function(){for(var e=arguments.length,n=new Array(e),o=0;ot?n.splice(t,n.length-t,r):n.push(r),u({action:o,location:r,index:t,entries:n})}}))},replace:function(e,t){var o="REPLACE",r=f(e,t,m(),x.location);c.confirmTransitionTo(r,o,n,(function(e){e&&(x.entries[x.index]=r,u({action:o,location:r}))}))},go:v,goBack:function(){v(-1)},goForward:function(){v(1)},canGo:function(e){var t=x.index+e;return t>=0&&t{"use strict";var o=n(9864),r={childContextTypes:!0,contextType:!0,contextTypes:!0,defaultProps:!0,displayName:!0,getDefaultProps:!0,getDerivedStateFromError:!0,getDerivedStateFromProps:!0,mixins:!0,propTypes:!0,type:!0},s={name:!0,length:!0,prototype:!0,caller:!0,callee:!0,arguments:!0,arity:!0},a={$$typeof:!0,compare:!0,defaultProps:!0,displayName:!0,propTypes:!0,type:!0},i={};function d(e){return o.isMemo(e)?a:i[e.$$typeof]||r}i[o.ForwardRef]={$$typeof:!0,render:!0,defaultProps:!0,displayName:!0,propTypes:!0},i[o.Memo]=a;var l=Object.defineProperty,c=Object.getOwnPropertyNames,u=Object.getOwnPropertySymbols,p=Object.getOwnPropertyDescriptor,f=Object.getPrototypeOf,g=Object.prototype;e.exports=function e(t,n,o){if("string"!=typeof n){if(g){var r=f(n);r&&r!==g&&e(t,r,o)}var a=c(n);u&&(a=a.concat(u(n)));for(var i=d(t),m=d(n),h=0;h{"use strict";e.exports=function(e,t,n,o,r,s,a,i){if(!e){var d;if(void 0===t)d=new Error("Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.");else{var l=[n,o,r,s,a,i],c=0;(d=new Error(t.replace(/%s/g,(function(){return l[c++]})))).name="Invariant Violation"}throw d.framesToPop=1,d}}},5826:e=>{e.exports=Array.isArray||function(e){return"[object Array]"==Object.prototype.toString.call(e)}},2497:(e,t,n)=>{"use strict";n.r(t)},2295:(e,t,n)=>{"use strict";n.r(t)},4865:function(e,t,n){var o,r;o=function(){var e,t,n={version:"0.2.0"},o=n.settings={minimum:.08,easing:"ease",positionUsing:"",speed:200,trickle:!0,trickleRate:.02,trickleSpeed:800,showSpinner:!0,barSelector:'[role="bar"]',spinnerSelector:'[role="spinner"]',parent:"body",template:'
'};function r(e,t,n){return en?n:e}function s(e){return 100*(-1+e)}function a(e,t,n){var r;return(r="translate3d"===o.positionUsing?{transform:"translate3d("+s(e)+"%,0,0)"}:"translate"===o.positionUsing?{transform:"translate("+s(e)+"%,0)"}:{"margin-left":s(e)+"%"}).transition="all "+t+"ms "+n,r}n.configure=function(e){var t,n;for(t in e)void 0!==(n=e[t])&&e.hasOwnProperty(t)&&(o[t]=n);return this},n.status=null,n.set=function(e){var t=n.isStarted();e=r(e,o.minimum,1),n.status=1===e?null:e;var s=n.render(!t),l=s.querySelector(o.barSelector),c=o.speed,u=o.easing;return s.offsetWidth,i((function(t){""===o.positionUsing&&(o.positionUsing=n.getPositioningCSS()),d(l,a(e,c,u)),1===e?(d(s,{transition:"none",opacity:1}),s.offsetWidth,setTimeout((function(){d(s,{transition:"all "+c+"ms linear",opacity:0}),setTimeout((function(){n.remove(),t()}),c)}),c)):setTimeout(t,c)})),this},n.isStarted=function(){return"number"==typeof n.status},n.start=function(){n.status||n.set(0);var e=function(){setTimeout((function(){n.status&&(n.trickle(),e())}),o.trickleSpeed)};return o.trickle&&e(),this},n.done=function(e){return e||n.status?n.inc(.3+.5*Math.random()).set(1):this},n.inc=function(e){var t=n.status;return t?("number"!=typeof e&&(e=(1-t)*r(Math.random()*t,.1,.95)),t=r(t+e,0,.994),n.set(t)):n.start()},n.trickle=function(){return n.inc(Math.random()*o.trickleRate)},e=0,t=0,n.promise=function(o){return o&&"resolved"!==o.state()?(0===t&&n.start(),e++,t++,o.always((function(){0==--t?(e=0,n.done()):n.set((e-t)/e)})),this):this},n.render=function(e){if(n.isRendered())return document.getElementById("nprogress");c(document.documentElement,"nprogress-busy");var t=document.createElement("div");t.id="nprogress",t.innerHTML=o.template;var r,a=t.querySelector(o.barSelector),i=e?"-100":s(n.status||0),l=document.querySelector(o.parent);return d(a,{transition:"all 0 linear",transform:"translate3d("+i+"%,0,0)"}),o.showSpinner||(r=t.querySelector(o.spinnerSelector))&&f(r),l!=document.body&&c(l,"nprogress-custom-parent"),l.appendChild(t),t},n.remove=function(){u(document.documentElement,"nprogress-busy"),u(document.querySelector(o.parent),"nprogress-custom-parent");var e=document.getElementById("nprogress");e&&f(e)},n.isRendered=function(){return!!document.getElementById("nprogress")},n.getPositioningCSS=function(){var e=document.body.style,t="WebkitTransform"in e?"Webkit":"MozTransform"in e?"Moz":"msTransform"in e?"ms":"OTransform"in e?"O":"";return t+"Perspective"in e?"translate3d":t+"Transform"in e?"translate":"margin"};var i=function(){var e=[];function t(){var n=e.shift();n&&n(t)}return function(n){e.push(n),1==e.length&&t()}}(),d=function(){var e=["Webkit","O","Moz","ms"],t={};function n(e){return e.replace(/^-ms-/,"ms-").replace(/-([\da-z])/gi,(function(e,t){return t.toUpperCase()}))}function o(t){var n=document.body.style;if(t in n)return t;for(var o,r=e.length,s=t.charAt(0).toUpperCase()+t.slice(1);r--;)if((o=e[r]+s)in n)return o;return t}function r(e){return e=n(e),t[e]||(t[e]=o(e))}function s(e,t,n){t=r(t),e.style[t]=n}return function(e,t){var n,o,r=arguments;if(2==r.length)for(n in t)void 0!==(o=t[n])&&t.hasOwnProperty(n)&&s(e,n,o);else s(e,r[1],r[2])}}();function l(e,t){return("string"==typeof e?e:p(e)).indexOf(" "+t+" ")>=0}function c(e,t){var n=p(e),o=n+t;l(n,t)||(e.className=o.substring(1))}function u(e,t){var n,o=p(e);l(e,t)&&(n=o.replace(" "+t+" "," "),e.className=n.substring(1,n.length-1))}function p(e){return(" "+(e.className||"")+" ").replace(/\s+/gi," ")}function f(e){e&&e.parentNode&&e.parentNode.removeChild(e)}return n},void 0===(r="function"==typeof o?o.call(t,n,t,e):o)||(e.exports=r)},485:()=>{!function(e){var t={pattern:/((?:^|[^\\$])(?:\\{2})*)\$(?:\w+|\{[^{}]*\})/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{?|\}$/,alias:"punctuation"},expression:{pattern:/[\s\S]+/,inside:null}}};e.languages.groovy=e.languages.extend("clike",{string:{pattern:/'''(?:[^\\]|\\[\s\S])*?'''|'(?:\\.|[^\\'\r\n])*'/,greedy:!0},keyword:/\b(?:abstract|as|assert|boolean|break|byte|case|catch|char|class|const|continue|def|default|do|double|else|enum|extends|final|finally|float|for|goto|if|implements|import|in|instanceof|int|interface|long|native|new|package|private|protected|public|return|short|static|strictfp|super|switch|synchronized|this|throw|throws|trait|transient|try|void|volatile|while)\b/,number:/\b(?:0b[01_]+|0x[\da-f_]+(?:\.[\da-f_p\-]+)?|[\d_]+(?:\.[\d_]+)?(?:e[+-]?\d+)?)[glidf]?\b/i,operator:{pattern:/(^|[^.])(?:~|==?~?|\?[.:]?|\*(?:[.=]|\*=?)?|\.[@&]|\.\.<|\.\.(?!\.)|-[-=>]?|\+[+=]?|!=?|<(?:<=?|=>?)?|>(?:>>?=?|=)?|&[&=]?|\|[|=]?|\/=?|\^=?|%=?)/,lookbehind:!0},punctuation:/\.+|[{}[\];(),:$]/}),e.languages.insertBefore("groovy","string",{shebang:{pattern:/#!.+/,alias:"comment",greedy:!0},"interpolation-string":{pattern:/"""(?:[^\\]|\\[\s\S])*?"""|(["/])(?:\\.|(?!\1)[^\\\r\n])*\1|\$\/(?:[^/$]|\$(?:[/$]|(?![/$]))|\/(?!\$))*\/\$/,greedy:!0,inside:{interpolation:t,string:/[\s\S]+/}}}),e.languages.insertBefore("groovy","punctuation",{"spock-block":/\b(?:and|cleanup|expect|given|setup|then|when|where):/}),e.languages.insertBefore("groovy","function",{annotation:{pattern:/(^|[^.])@\w+/,lookbehind:!0,alias:"punctuation"}}),t.inside.expression.inside=e.languages.groovy}(Prism)},4677:()=>{Prism.languages.hcl={comment:/(?:\/\/|#).*|\/\*[\s\S]*?(?:\*\/|$)/,heredoc:{pattern:/<<-?(\w+\b)[\s\S]*?^[ \t]*\1/m,greedy:!0,alias:"string"},keyword:[{pattern:/(?:data|resource)\s+(?:"(?:\\[\s\S]|[^\\"])*")(?=\s+"[\w-]+"\s+\{)/i,inside:{type:{pattern:/(resource|data|\s+)(?:"(?:\\[\s\S]|[^\\"])*")/i,lookbehind:!0,alias:"variable"}}},{pattern:/(?:backend|module|output|provider|provisioner|variable)\s+(?:[\w-]+|"(?:\\[\s\S]|[^\\"])*")\s+(?=\{)/i,inside:{type:{pattern:/(backend|module|output|provider|provisioner|variable)\s+(?:[\w-]+|"(?:\\[\s\S]|[^\\"])*")\s+/i,lookbehind:!0,alias:"variable"}}},/[\w-]+(?=\s+\{)/],property:[/[-\w\.]+(?=\s*=(?!=))/,/"(?:\\[\s\S]|[^\\"])+"(?=\s*[:=])/],string:{pattern:/"(?:[^\\$"]|\\[\s\S]|\$(?:(?=")|\$+(?!\$)|[^"${])|\$\{(?:[^{}"]|"(?:[^\\"]|\\[\s\S])*")*\})*"/,greedy:!0,inside:{interpolation:{pattern:/(^|[^$])\$\{(?:[^{}"]|"(?:[^\\"]|\\[\s\S])*")*\}/,lookbehind:!0,inside:{type:{pattern:/(\b(?:count|data|local|module|path|self|terraform|var)\b\.)[\w\*]+/i,lookbehind:!0,alias:"variable"},keyword:/\b(?:count|data|local|module|path|self|terraform|var)\b/i,function:/\w+(?=\()/,string:{pattern:/"(?:\\[\s\S]|[^\\"])*"/,greedy:!0},number:/\b0x[\da-f]+\b|\b\d+(?:\.\d*)?(?:e[+-]?\d+)?/i,punctuation:/[!\$#%&'()*+,.\/;<=>@\[\\\]^`{|}~?:]/}}}},number:/\b0x[\da-f]+\b|\b\d+(?:\.\d*)?(?:e[+-]?\d+)?/i,boolean:/\b(?:false|true)\b/i,punctuation:/[=\[\]{}]/}},2503:()=>{!function(e){var t=/\b(?:abstract|assert|boolean|break|byte|case|catch|char|class|const|continue|default|do|double|else|enum|exports|extends|final|finally|float|for|goto|if|implements|import|instanceof|int|interface|long|module|native|new|non-sealed|null|open|opens|package|permits|private|protected|provides|public|record(?!\s*[(){}[\]<>=%~.:,;?+\-*/&|^])|requires|return|sealed|short|static|strictfp|super|switch|synchronized|this|throw|throws|to|transient|transitive|try|uses|var|void|volatile|while|with|yield)\b/,n=/(?:[a-z]\w*\s*\.\s*)*(?:[A-Z]\w*\s*\.\s*)*/.source,o={pattern:RegExp(/(^|[^\w.])/.source+n+/[A-Z](?:[\d_A-Z]*[a-z]\w*)?\b/.source),lookbehind:!0,inside:{namespace:{pattern:/^[a-z]\w*(?:\s*\.\s*[a-z]\w*)*(?:\s*\.)?/,inside:{punctuation:/\./}},punctuation:/\./}};e.languages.java=e.languages.extend("clike",{string:{pattern:/(^|[^\\])"(?:\\.|[^"\\\r\n])*"/,lookbehind:!0,greedy:!0},"class-name":[o,{pattern:RegExp(/(^|[^\w.])/.source+n+/[A-Z]\w*(?=\s+\w+\s*[;,=()]|\s*(?:\[[\s,]*\]\s*)?::\s*new\b)/.source),lookbehind:!0,inside:o.inside},{pattern:RegExp(/(\b(?:class|enum|extends|implements|instanceof|interface|new|record|throws)\s+)/.source+n+/[A-Z]\w*\b/.source),lookbehind:!0,inside:o.inside}],keyword:t,function:[e.languages.clike.function,{pattern:/(::\s*)[a-z_]\w*/,lookbehind:!0}],number:/\b0b[01][01_]*L?\b|\b0x(?:\.[\da-f_p+-]+|[\da-f_]+(?:\.[\da-f_p+-]+)?)\b|(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?\d[\d_]*)?[dfl]?/i,operator:{pattern:/(^|[^.])(?:<<=?|>>>?=?|->|--|\+\+|&&|\|\||::|[?:~]|[-+*/%&|^!=<>]=?)/m,lookbehind:!0},constant:/\b[A-Z][A-Z_\d]+\b/}),e.languages.insertBefore("java","string",{"triple-quoted-string":{pattern:/"""[ \t]*[\r\n](?:(?:"|"")?(?:\\.|[^"\\]))*"""/,greedy:!0,alias:"string"},char:{pattern:/'(?:\\.|[^'\\\r\n]){1,6}'/,greedy:!0}}),e.languages.insertBefore("java","class-name",{annotation:{pattern:/(^|[^.])@\w+(?:\s*\.\s*\w+)*/,lookbehind:!0,alias:"punctuation"},generics:{pattern:/<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&))*>)*>)*>)*>/,inside:{"class-name":o,keyword:t,punctuation:/[<>(),.:]/,operator:/[?&|]/}},import:[{pattern:RegExp(/(\bimport\s+)/.source+n+/(?:[A-Z]\w*|\*)(?=\s*;)/.source),lookbehind:!0,inside:{namespace:o.inside.namespace,punctuation:/\./,operator:/\*/,"class-name":/\w+/}},{pattern:RegExp(/(\bimport\s+static\s+)/.source+n+/(?:\w+|\*)(?=\s*;)/.source),lookbehind:!0,alias:"static",inside:{namespace:o.inside.namespace,static:/\b\w+$/,punctuation:/\./,operator:/\*/,"class-name":/\w+/}}],namespace:{pattern:RegExp(/(\b(?:exports|import(?:\s+static)?|module|open|opens|package|provides|requires|to|transitive|uses|with)\s+)(?!)[a-z]\w*(?:\.[a-z]\w*)*\.?/.source.replace(//g,(function(){return t.source}))),lookbehind:!0,inside:{punctuation:/\./}}})}(Prism)},2334:()=>{!function(e){e.languages.kotlin=e.languages.extend("clike",{keyword:{pattern:/(^|[^.])\b(?:abstract|actual|annotation|as|break|by|catch|class|companion|const|constructor|continue|crossinline|data|do|dynamic|else|enum|expect|external|final|finally|for|fun|get|if|import|in|infix|init|inline|inner|interface|internal|is|lateinit|noinline|null|object|open|operator|out|override|package|private|protected|public|reified|return|sealed|set|super|suspend|tailrec|this|throw|to|try|typealias|val|var|vararg|when|where|while)\b/,lookbehind:!0},function:[{pattern:/(?:`[^\r\n`]+`|\b\w+)(?=\s*\()/,greedy:!0},{pattern:/(\.)(?:`[^\r\n`]+`|\w+)(?=\s*\{)/,lookbehind:!0,greedy:!0}],number:/\b(?:0[xX][\da-fA-F]+(?:_[\da-fA-F]+)*|0[bB][01]+(?:_[01]+)*|\d+(?:_\d+)*(?:\.\d+(?:_\d+)*)?(?:[eE][+-]?\d+(?:_\d+)*)?[fFL]?)\b/,operator:/\+[+=]?|-[-=>]?|==?=?|!(?:!|==?)?|[\/*%<>]=?|[?:]:?|\.\.|&&|\|\||\b(?:and|inv|or|shl|shr|ushr|xor)\b/}),delete e.languages.kotlin["class-name"];var t={"interpolation-punctuation":{pattern:/^\$\{?|\}$/,alias:"punctuation"},expression:{pattern:/[\s\S]+/,inside:e.languages.kotlin}};e.languages.insertBefore("kotlin","string",{"string-literal":[{pattern:/"""(?:[^$]|\$(?:(?!\{)|\{[^{}]*\}))*?"""/,alias:"multiline",inside:{interpolation:{pattern:/\$(?:[a-z_]\w*|\{[^{}]*\})/i,inside:t},string:/[\s\S]+/}},{pattern:/"(?:[^"\\\r\n$]|\\.|\$(?:(?!\{)|\{[^{}]*\}))*"/,alias:"singleline",inside:{interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$(?:[a-z_]\w*|\{[^{}]*\})/i,lookbehind:!0,inside:t},string:/[\s\S]+/}}],char:{pattern:/'(?:[^'\\\r\n]|\\(?:.|u[a-fA-F0-9]{0,4}))'/,greedy:!0}}),delete e.languages.kotlin.string,e.languages.insertBefore("kotlin","keyword",{annotation:{pattern:/\B@(?:\w+:)?(?:[A-Z]\w*|\[[^\]]+\])/,alias:"builtin"}}),e.languages.insertBefore("kotlin","function",{label:{pattern:/\b\w+@|@\w+\b/,alias:"symbol"}}),e.languages.kt=e.languages.kotlin,e.languages.kts=e.languages.kotlin}(Prism)},6854:()=>{!function(e){function t(e,t){return"___"+e.toUpperCase()+t+"___"}Object.defineProperties(e.languages["markup-templating"]={},{buildPlaceholders:{value:function(n,o,r,s){if(n.language===o){var a=n.tokenStack=[];n.code=n.code.replace(r,(function(e){if("function"==typeof s&&!s(e))return e;for(var r,i=a.length;-1!==n.code.indexOf(r=t(o,i));)++i;return a[i]=e,r})),n.grammar=e.languages.markup}}},tokenizePlaceholders:{value:function(n,o){if(n.language===o&&n.tokenStack){n.grammar=e.languages[o];var r=0,s=Object.keys(n.tokenStack);!function a(i){for(var d=0;d=s.length);d++){var l=i[d];if("string"==typeof l||l.content&&"string"==typeof l.content){var c=s[r],u=n.tokenStack[c],p="string"==typeof l?l:l.content,f=t(o,c),g=p.indexOf(f);if(g>-1){++r;var m=p.substring(0,g),h=new e.Token(o,e.tokenize(u,n.grammar),"language-"+o,u),b=p.substring(g+f.length),y=[];m&&y.push.apply(y,a([m])),y.push(h),b&&y.push.apply(y,a([b])),"string"==typeof l?i.splice.apply(i,[d,1].concat(y)):l.content=y}}else l.content&&a(l.content)}return i}(n.tokens)}}}})}(Prism)},3436:()=>{!function(e){var t=/\$(?:\w[a-z\d]*(?:_[^\x00-\x1F\s"'\\()$]*)?|\{[^}\s"'\\]+\})/i;e.languages.nginx={comment:{pattern:/(^|[\s{};])#.*/,lookbehind:!0,greedy:!0},directive:{pattern:/(^|\s)\w(?:[^;{}"'\\\s]|\\.|"(?:[^"\\]|\\.)*"|'(?:[^'\\]|\\.)*'|\s+(?:#.*(?!.)|(?![#\s])))*?(?=\s*[;{])/,lookbehind:!0,greedy:!0,inside:{string:{pattern:/((?:^|[^\\])(?:\\\\)*)(?:"(?:[^"\\]|\\.)*"|'(?:[^'\\]|\\.)*')/,lookbehind:!0,greedy:!0,inside:{escape:{pattern:/\\["'\\nrt]/,alias:"entity"},variable:t}},comment:{pattern:/(\s)#.*/,lookbehind:!0,greedy:!0},keyword:{pattern:/^\S+/,greedy:!0},boolean:{pattern:/(\s)(?:off|on)(?!\S)/,lookbehind:!0},number:{pattern:/(\s)\d+[a-z]*(?!\S)/i,lookbehind:!0},variable:t}},punctuation:/[{};]/}}(Prism)},9385:()=>{!function(e){e.languages.ruby=e.languages.extend("clike",{comment:{pattern:/#.*|^=begin\s[\s\S]*?^=end/m,greedy:!0},"class-name":{pattern:/(\b(?:class|module)\s+|\bcatch\s+\()[\w.\\]+|\b[A-Z_]\w*(?=\s*\.\s*new\b)/,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:BEGIN|END|alias|and|begin|break|case|class|def|define_method|defined|do|each|else|elsif|end|ensure|extend|for|if|in|include|module|new|next|nil|not|or|prepend|private|protected|public|raise|redo|require|rescue|retry|return|self|super|then|throw|undef|unless|until|when|while|yield)\b/,operator:/\.{2,3}|&\.|===||[!=]?~|(?:&&|\|\||<<|>>|\*\*|[+\-*/%<>!^&|=])=?|[?:]/,punctuation:/[(){}[\].,;]/}),e.languages.insertBefore("ruby","operator",{"double-colon":{pattern:/::/,alias:"punctuation"}});var t={pattern:/((?:^|[^\\])(?:\\{2})*)#\{(?:[^{}]|\{[^{}]*\})*\}/,lookbehind:!0,inside:{content:{pattern:/^(#\{)[\s\S]+(?=\}$)/,lookbehind:!0,inside:e.languages.ruby},delimiter:{pattern:/^#\{|\}$/,alias:"punctuation"}}};delete e.languages.ruby.function;var n="(?:"+[/([^a-zA-Z0-9\s{(\[<=])(?:(?!\1)[^\\]|\\[\s\S])*\1/.source,/\((?:[^()\\]|\\[\s\S]|\((?:[^()\\]|\\[\s\S])*\))*\)/.source,/\{(?:[^{}\\]|\\[\s\S]|\{(?:[^{}\\]|\\[\s\S])*\})*\}/.source,/\[(?:[^\[\]\\]|\\[\s\S]|\[(?:[^\[\]\\]|\\[\s\S])*\])*\]/.source,/<(?:[^<>\\]|\\[\s\S]|<(?:[^<>\\]|\\[\s\S])*>)*>/.source].join("|")+")",o=/(?:"(?:\\.|[^"\\\r\n])*"|(?:\b[a-zA-Z_]\w*|[^\s\0-\x7F]+)[?!]?|\$.)/.source;e.languages.insertBefore("ruby","keyword",{"regex-literal":[{pattern:RegExp(/%r/.source+n+/[egimnosux]{0,6}/.source),greedy:!0,inside:{interpolation:t,regex:/[\s\S]+/}},{pattern:/(^|[^/])\/(?!\/)(?:\[[^\r\n\]]+\]|\\.|[^[/\\\r\n])+\/[egimnosux]{0,6}(?=\s*(?:$|[\r\n,.;})#]))/,lookbehind:!0,greedy:!0,inside:{interpolation:t,regex:/[\s\S]+/}}],variable:/[@$]+[a-zA-Z_]\w*(?:[?!]|\b)/,symbol:[{pattern:RegExp(/(^|[^:]):/.source+o),lookbehind:!0,greedy:!0},{pattern:RegExp(/([\r\n{(,][ \t]*)/.source+o+/(?=:(?!:))/.source),lookbehind:!0,greedy:!0}],"method-definition":{pattern:/(\bdef\s+)\w+(?:\s*\.\s*\w+)?/,lookbehind:!0,inside:{function:/\b\w+$/,keyword:/^self\b/,"class-name":/^\w+/,punctuation:/\./}}}),e.languages.insertBefore("ruby","string",{"string-literal":[{pattern:RegExp(/%[qQiIwWs]?/.source+n),greedy:!0,inside:{interpolation:t,string:/[\s\S]+/}},{pattern:/("|')(?:#\{[^}]+\}|#(?!\{)|\\(?:\r\n|[\s\S])|(?!\1)[^\\#\r\n])*\1/,greedy:!0,inside:{interpolation:t,string:/[\s\S]+/}},{pattern:/<<[-~]?([a-z_]\w*)[\r\n](?:.*[\r\n])*?[\t ]*\1/i,alias:"heredoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<[-~]?[a-z_]\w*|\b[a-z_]\w*$/i,inside:{symbol:/\b\w+/,punctuation:/^<<[-~]?/}},interpolation:t,string:/[\s\S]+/}},{pattern:/<<[-~]?'([a-z_]\w*)'[\r\n](?:.*[\r\n])*?[\t ]*\1/i,alias:"heredoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<[-~]?'[a-z_]\w*'|\b[a-z_]\w*$/i,inside:{symbol:/\b\w+/,punctuation:/^<<[-~]?'|'$/}},string:/[\s\S]+/}}],"command-literal":[{pattern:RegExp(/%x/.source+n),greedy:!0,inside:{interpolation:t,command:{pattern:/[\s\S]+/,alias:"string"}}},{pattern:/`(?:#\{[^}]+\}|#(?!\{)|\\(?:\r\n|[\s\S])|[^\\`#\r\n])*`/,greedy:!0,inside:{interpolation:t,command:{pattern:/[\s\S]+/,alias:"string"}}}]}),delete e.languages.ruby.string,e.languages.insertBefore("ruby","number",{builtin:/\b(?:Array|Bignum|Binding|Class|Continuation|Dir|Exception|FalseClass|File|Fixnum|Float|Hash|IO|Integer|MatchData|Method|Module|NilClass|Numeric|Object|Proc|Range|Regexp|Stat|String|Struct|Symbol|TMS|Thread|ThreadGroup|Time|TrueClass)\b/,constant:/\b[A-Z][A-Z0-9_]*(?:[?!]|\b)/}),e.languages.rb=e.languages.ruby}(Prism)},874:()=>{Prism.languages.swift={comment:{pattern:/(^|[^\\:])(?:\/\/.*|\/\*(?:[^/*]|\/(?!\*)|\*(?!\/)|\/\*(?:[^*]|\*(?!\/))*\*\/)*\*\/)/,lookbehind:!0,greedy:!0},"string-literal":[{pattern:RegExp(/(^|[^"#])/.source+"(?:"+/"(?:\\(?:\((?:[^()]|\([^()]*\))*\)|\r\n|[^(])|[^\\\r\n"])*"/.source+"|"+/"""(?:\\(?:\((?:[^()]|\([^()]*\))*\)|[^(])|[^\\"]|"(?!""))*"""/.source+")"+/(?!["#])/.source),lookbehind:!0,greedy:!0,inside:{interpolation:{pattern:/(\\\()(?:[^()]|\([^()]*\))*(?=\))/,lookbehind:!0,inside:null},"interpolation-punctuation":{pattern:/^\)|\\\($/,alias:"punctuation"},punctuation:/\\(?=[\r\n])/,string:/[\s\S]+/}},{pattern:RegExp(/(^|[^"#])(#+)/.source+"(?:"+/"(?:\\(?:#+\((?:[^()]|\([^()]*\))*\)|\r\n|[^#])|[^\\\r\n])*?"/.source+"|"+/"""(?:\\(?:#+\((?:[^()]|\([^()]*\))*\)|[^#])|[^\\])*?"""/.source+")\\2"),lookbehind:!0,greedy:!0,inside:{interpolation:{pattern:/(\\#+\()(?:[^()]|\([^()]*\))*(?=\))/,lookbehind:!0,inside:null},"interpolation-punctuation":{pattern:/^\)|\\#+\($/,alias:"punctuation"},string:/[\s\S]+/}}],directive:{pattern:RegExp(/#/.source+"(?:"+/(?:elseif|if)\b/.source+"(?:[ \t]*"+/(?:![ \t]*)?(?:\b\w+\b(?:[ \t]*\((?:[^()]|\([^()]*\))*\))?|\((?:[^()]|\([^()]*\))*\))(?:[ \t]*(?:&&|\|\|))?/.source+")+|"+/(?:else|endif)\b/.source+")"),alias:"property",inside:{"directive-name":/^#\w+/,boolean:/\b(?:false|true)\b/,number:/\b\d+(?:\.\d+)*\b/,operator:/!|&&|\|\||[<>]=?/,punctuation:/[(),]/}},literal:{pattern:/#(?:colorLiteral|column|dsohandle|file(?:ID|Literal|Path)?|function|imageLiteral|line)\b/,alias:"constant"},"other-directive":{pattern:/#\w+\b/,alias:"property"},attribute:{pattern:/@\w+/,alias:"atrule"},"function-definition":{pattern:/(\bfunc\s+)\w+/,lookbehind:!0,alias:"function"},label:{pattern:/\b(break|continue)\s+\w+|\b[a-zA-Z_]\w*(?=\s*:\s*(?:for|repeat|while)\b)/,lookbehind:!0,alias:"important"},keyword:/\b(?:Any|Protocol|Self|Type|actor|as|assignment|associatedtype|associativity|async|await|break|case|catch|class|continue|convenience|default|defer|deinit|didSet|do|dynamic|else|enum|extension|fallthrough|fileprivate|final|for|func|get|guard|higherThan|if|import|in|indirect|infix|init|inout|internal|is|isolated|lazy|left|let|lowerThan|mutating|none|nonisolated|nonmutating|open|operator|optional|override|postfix|precedencegroup|prefix|private|protocol|public|repeat|required|rethrows|return|right|safe|self|set|some|static|struct|subscript|super|switch|throw|throws|try|typealias|unowned|unsafe|var|weak|where|while|willSet)\b/,boolean:/\b(?:false|true)\b/,nil:{pattern:/\bnil\b/,alias:"constant"},"short-argument":/\$\d+\b/,omit:{pattern:/\b_\b/,alias:"keyword"},number:/\b(?:[\d_]+(?:\.[\de_]+)?|0x[a-f0-9_]+(?:\.[a-f0-9p_]+)?|0b[01_]+|0o[0-7_]+)\b/i,"class-name":/\b[A-Z](?:[A-Z_\d]*[a-z]\w*)?\b/,function:/\b[a-z_]\w*(?=\s*\()/i,constant:/\b(?:[A-Z_]{2,}|k[A-Z][A-Za-z_]+)\b/,operator:/[-+*/%=!<>&|^~?]+|\.[.\-+*/%=!<>&|^~?]+/,punctuation:/[{}[\]();,.:\\]/},Prism.languages.swift["string-literal"].forEach((function(e){e.inside.interpolation.inside=Prism.languages.swift}))},9930:()=>{!function(e){var t=/(?:[\w-]+|'[^'\n\r]*'|"(?:\\.|[^\\"\r\n])*")/.source;function n(e){return e.replace(/__/g,(function(){return t}))}e.languages.toml={comment:{pattern:/#.*/,greedy:!0},table:{pattern:RegExp(n(/(^[\t ]*\[\s*(?:\[\s*)?)__(?:\s*\.\s*__)*(?=\s*\])/.source),"m"),lookbehind:!0,greedy:!0,alias:"class-name"},key:{pattern:RegExp(n(/(^[\t ]*|[{,]\s*)__(?:\s*\.\s*__)*(?=\s*=)/.source),"m"),lookbehind:!0,greedy:!0,alias:"property"},string:{pattern:/"""(?:\\[\s\S]|[^\\])*?"""|'''[\s\S]*?'''|'[^'\n\r]*'|"(?:\\.|[^\\"\r\n])*"/,greedy:!0},date:[{pattern:/\b\d{4}-\d{2}-\d{2}(?:[T\s]\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z|[+-]\d{2}:\d{2})?)?\b/i,alias:"number"},{pattern:/\b\d{2}:\d{2}:\d{2}(?:\.\d+)?\b/,alias:"number"}],number:/(?:\b0(?:x[\da-zA-Z]+(?:_[\da-zA-Z]+)*|o[0-7]+(?:_[0-7]+)*|b[10]+(?:_[10]+)*))\b|[-+]?\b\d+(?:_\d+)*(?:\.\d+(?:_\d+)*)?(?:[eE][+-]?\d+(?:_\d+)*)?\b|[-+]?\b(?:inf|nan)\b/,boolean:/\b(?:false|true)\b/,punctuation:/[.,=[\]{}]/}}(Prism)},1472:(e,t,n)=>{var o={"./prism-groovy":485,"./prism-hcl":4677,"./prism-java":2503,"./prism-kotlin":2334,"./prism-nginx":3436,"./prism-ruby":9385,"./prism-swift":874,"./prism-toml":9930};function r(e){var t=s(e);return n(t)}function s(e){if(!n.o(o,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return o[e]}r.keys=function(){return Object.keys(o)},r.resolve=s,e.exports=r,r.id=1472},2703:(e,t,n)=>{"use strict";var o=n(414);function r(){}function s(){}s.resetWarningCache=r,e.exports=function(){function e(e,t,n,r,s,a){if(a!==o){var i=new Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw i.name="Invariant Violation",i}}function t(){return e}e.isRequired=e;var n={array:e,bigint:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:t,element:e,elementType:e,instanceOf:t,node:e,objectOf:t,oneOf:t,oneOfType:t,shape:t,exact:t,checkPropTypes:s,resetWarningCache:r};return n.PropTypes=n,n}},5697:(e,t,n)=>{e.exports=n(2703)()},414:e=>{"use strict";e.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},4448:(e,t,n)=>{"use strict";var o=n(7294),r=n(3840);function s(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n