app_versions.json 84 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110
  1. {
  2. "1.2.14": {
  3. "healthy": true,
  4. "supported": false,
  5. "healthy_error": null,
  6. "location": "/__w/charts/charts/community/twofactor-auth/1.2.14",
  7. "last_update": "2025-03-06 08:26:26",
  8. "required_features": [
  9. "normalize/ixVolume",
  10. "normalize/acl"
  11. ],
  12. "human_version": "5.4.3_1.2.14",
  13. "version": "1.2.14",
  14. "chart_metadata": {
  15. "name": "twofactor-auth",
  16. "description": "2FAuth is a web based self-hosted alternative to One Time Passcode (OTP) generators like Google Authenticator, designed for both mobile and desktop.",
  17. "annotations": {
  18. "title": "2FAuth"
  19. },
  20. "type": "application",
  21. "version": "1.2.14",
  22. "apiVersion": "v2",
  23. "appVersion": "5.4.3",
  24. "kubeVersion": ">=1.16.0-0",
  25. "maintainers": [
  26. {
  27. "name": "truenas",
  28. "url": "https://www.truenas.com/",
  29. "email": "dev@ixsystems.com"
  30. }
  31. ],
  32. "dependencies": [
  33. {
  34. "name": "common",
  35. "repository": "file://../../../common",
  36. "version": "1.2.9"
  37. }
  38. ],
  39. "home": "https://docs.2fauth.app/",
  40. "icon": "https://media.sys.truenas.net/apps/twofactor-auth/icons/icon.png",
  41. "sources": [
  42. "https://github.com/Bubka/2FAuth",
  43. "https://github.com/truenas/charts/tree/master/library/ix-dev/community/2fauth",
  44. "https://hub.docker.com/r/2fauth/2fauth/"
  45. ],
  46. "keywords": [
  47. "security",
  48. "2fa",
  49. "otp"
  50. ]
  51. },
  52. "app_metadata": {
  53. "runAsContext": [
  54. {
  55. "userName": "twofauth",
  56. "groupName": "twofauthreadarr",
  57. "gid": 1000,
  58. "uid": 1000,
  59. "description": "2FAuth runs as a non-root user."
  60. }
  61. ],
  62. "capabilities": [],
  63. "hostMounts": []
  64. },
  65. "schema": {
  66. "groups": [
  67. {
  68. "name": "2FAuth Configuration",
  69. "description": "Configure 2FAuth"
  70. },
  71. {
  72. "name": "Network Configuration",
  73. "description": "Configure Network for 2FAuth"
  74. },
  75. {
  76. "name": "Storage Configuration",
  77. "description": "Configure Storage for 2FAuth"
  78. },
  79. {
  80. "name": "Resources Configuration",
  81. "description": "Configure Resources for 2FAuth"
  82. }
  83. ],
  84. "portals": {
  85. "web_portal": {
  86. "protocols": [
  87. "$kubernetes-resource_configmap_portal_protocol"
  88. ],
  89. "host": [
  90. "$kubernetes-resource_configmap_portal_host"
  91. ],
  92. "ports": [
  93. "$kubernetes-resource_configmap_portal_port"
  94. ],
  95. "path": "$kubernetes-resource_configmap_portal_path"
  96. }
  97. },
  98. "questions": [
  99. {
  100. "variable": "twofauthConfig",
  101. "label": "",
  102. "group": "2FAuth Configuration",
  103. "schema": {
  104. "type": "dict",
  105. "attrs": [
  106. {
  107. "variable": "appName",
  108. "label": "App Name",
  109. "description": "The name of the 2FAuth.",
  110. "schema": {
  111. "type": "string",
  112. "default": "2FAuth",
  113. "required": true
  114. }
  115. },
  116. {
  117. "variable": "appUrl",
  118. "label": "App URL",
  119. "description": "The URL that 2FAuth will be accessible from.</br>\nExample: </br>\nhttp://server.ip:30081</br>\nhttps://2fauth.example.com\n",
  120. "schema": {
  121. "type": "uri",
  122. "default": "",
  123. "required": true
  124. }
  125. },
  126. {
  127. "variable": "siteOwnerEmail",
  128. "label": "Site Owner Email",
  129. "description": "The email address of the site owner.",
  130. "schema": {
  131. "type": "string",
  132. "default": "",
  133. "required": true
  134. }
  135. },
  136. {
  137. "variable": "authenticationGuard",
  138. "label": "Authentication Guard",
  139. "description": "When using 'reverse-proxy-guard' 2FAuth only look for the dedicated headers and skip all\nother built-in authentication checks. That means your proxy is fully responsible of the\nauthentication process, 2FAuth will trust him as long as headers are presents.\n",
  140. "schema": {
  141. "type": "string",
  142. "default": "web-guard",
  143. "required": true,
  144. "enum": [
  145. {
  146. "value": "web-guard",
  147. "description": "Web Guard"
  148. },
  149. {
  150. "value": "reverse-proxy-guard",
  151. "description": "Reverse Proxy Guard"
  152. }
  153. ]
  154. }
  155. },
  156. {
  157. "variable": "authProxyHeaderUser",
  158. "label": "Authentication Proxy Header User",
  159. "description": "Name of the HTTP headers sent by the reverse proxy that identifies the authenticated\nuser at proxy level. Check your proxy documentation to find out how these headers are named.\n",
  160. "schema": {
  161. "type": "string",
  162. "default": "",
  163. "show_if": [
  164. [
  165. "authenticationGuard",
  166. "=",
  167. "reverse-proxy-guard"
  168. ]
  169. ],
  170. "required": true
  171. }
  172. },
  173. {
  174. "variable": "authProxyHeaderEmail",
  175. "label": "Authentication Proxy Header Email",
  176. "description": "Name of the HTTP headers sent by the reverse proxy that identifies the authenticated\nuser at proxy level. Check your proxy documentation to find out how these headers are named.\n",
  177. "schema": {
  178. "type": "string",
  179. "default": "",
  180. "show_if": [
  181. [
  182. "authenticationGuard",
  183. "=",
  184. "reverse-proxy-guard"
  185. ]
  186. ],
  187. "required": true
  188. }
  189. },
  190. {
  191. "variable": "webauthnUserVerification",
  192. "label": "WebAuthn User Verification",
  193. "description": "Most authenticators and smartphones will ask the user to actively verify\nthemselves for log in. For example, through a touch plus pin code,\npassword entry, or biometric recognition (e.g., presenting a fingerprint).\nThe intent is to distinguish one user from any other.\n",
  194. "schema": {
  195. "type": "string",
  196. "default": "preferred",
  197. "required": true,
  198. "enum": [
  199. {
  200. "value": "preferred",
  201. "description": "Preferred"
  202. },
  203. {
  204. "value": "required",
  205. "description": "Required"
  206. },
  207. {
  208. "value": "discouraged",
  209. "description": "Discouraged"
  210. }
  211. ]
  212. }
  213. },
  214. {
  215. "variable": "trustedProxies",
  216. "label": "Trusted Proxies",
  217. "description": "The list of proxies IP to trust",
  218. "schema": {
  219. "type": "list",
  220. "default": [],
  221. "items": [
  222. {
  223. "variable": "trustedProxy",
  224. "label": "Trusted Proxy",
  225. "schema": {
  226. "type": "string",
  227. "required": true
  228. }
  229. }
  230. ]
  231. }
  232. },
  233. {
  234. "variable": "additionalEnvs",
  235. "label": "Additional Environment Variables",
  236. "description": "Configure additional environment variables for 2FAuth.",
  237. "schema": {
  238. "type": "list",
  239. "default": [],
  240. "items": [
  241. {
  242. "variable": "env",
  243. "label": "Environment Variable",
  244. "schema": {
  245. "type": "dict",
  246. "attrs": [
  247. {
  248. "variable": "name",
  249. "label": "Name",
  250. "schema": {
  251. "type": "string",
  252. "required": true
  253. }
  254. },
  255. {
  256. "variable": "value",
  257. "label": "Value",
  258. "schema": {
  259. "type": "string",
  260. "required": true
  261. }
  262. }
  263. ]
  264. }
  265. }
  266. ]
  267. }
  268. }
  269. ]
  270. }
  271. },
  272. {
  273. "variable": "twofauthNetwork",
  274. "label": "",
  275. "group": "Network Configuration",
  276. "schema": {
  277. "type": "dict",
  278. "attrs": [
  279. {
  280. "variable": "webPort",
  281. "label": "Web Port",
  282. "description": "The port for the 2FAuth Web UI.",
  283. "schema": {
  284. "type": "int",
  285. "default": 30081,
  286. "min": 9000,
  287. "max": 65535,
  288. "required": true
  289. }
  290. },
  291. {
  292. "variable": "hostNetwork",
  293. "label": "Host Network",
  294. "description": "Bind to the host network. It's recommended to keep this disabled.</br>\n",
  295. "schema": {
  296. "type": "boolean",
  297. "default": false
  298. }
  299. }
  300. ]
  301. }
  302. },
  303. {
  304. "variable": "twofauthStorage",
  305. "label": "",
  306. "group": "Storage Configuration",
  307. "schema": {
  308. "type": "dict",
  309. "attrs": [
  310. {
  311. "variable": "config",
  312. "label": "2FAuth Config Storage",
  313. "description": "The path to store 2FAuth Configuration.",
  314. "schema": {
  315. "type": "dict",
  316. "attrs": [
  317. {
  318. "variable": "type",
  319. "label": "Type",
  320. "description": "ixVolume: Is dataset created automatically by the system.</br>\nHost Path: Is a path that already exists on the system.\n",
  321. "schema": {
  322. "type": "string",
  323. "required": true,
  324. "immutable": true,
  325. "default": "ixVolume",
  326. "enum": [
  327. {
  328. "value": "hostPath",
  329. "description": "Host Path (Path that already exists on the system)"
  330. },
  331. {
  332. "value": "ixVolume",
  333. "description": "ixVolume (Dataset created automatically by the system)"
  334. }
  335. ]
  336. }
  337. },
  338. {
  339. "variable": "ixVolumeConfig",
  340. "label": "ixVolume Configuration",
  341. "description": "The configuration for the ixVolume dataset.",
  342. "schema": {
  343. "type": "dict",
  344. "show_if": [
  345. [
  346. "type",
  347. "=",
  348. "ixVolume"
  349. ]
  350. ],
  351. "$ref": [
  352. "normalize/ixVolume"
  353. ],
  354. "attrs": [
  355. {
  356. "variable": "aclEnable",
  357. "label": "Enable ACL",
  358. "description": "Enable ACL for the dataset.",
  359. "schema": {
  360. "type": "boolean",
  361. "default": false
  362. }
  363. },
  364. {
  365. "variable": "datasetName",
  366. "label": "Dataset Name",
  367. "description": "The name of the dataset to use for storage.",
  368. "schema": {
  369. "type": "string",
  370. "required": true,
  371. "immutable": true,
  372. "hidden": true,
  373. "default": "config"
  374. }
  375. },
  376. {
  377. "variable": "aclEntries",
  378. "label": "ACL Configuration",
  379. "schema": {
  380. "type": "dict",
  381. "show_if": [
  382. [
  383. "aclEnable",
  384. "=",
  385. true
  386. ]
  387. ],
  388. "attrs": [
  389. {
  390. "variable": "path",
  391. "label": "Path",
  392. "description": "Path to perform ACL",
  393. "schema": {
  394. "type": "string",
  395. "hidden": true
  396. }
  397. },
  398. {
  399. "variable": "entries",
  400. "label": "ACL Entries",
  401. "description": "ACL Entries",
  402. "schema": {
  403. "type": "list",
  404. "items": [
  405. {
  406. "variable": "aclEntry",
  407. "label": "ACL Entry",
  408. "schema": {
  409. "type": "dict",
  410. "attrs": [
  411. {
  412. "variable": "id_type",
  413. "label": "ID Type",
  414. "schema": {
  415. "type": "string",
  416. "enum": [
  417. {
  418. "value": "USER",
  419. "description": "Entry is for a USER"
  420. },
  421. {
  422. "value": "GROUP",
  423. "description": "Entry is for a GROUP"
  424. }
  425. ],
  426. "default": "USER"
  427. }
  428. },
  429. {
  430. "variable": "id",
  431. "label": "ID",
  432. "description": "Make sure to check the ID value is correct and aligns with RunAs user context of the application",
  433. "schema": {
  434. "type": "int",
  435. "required": true,
  436. "min": 0
  437. }
  438. },
  439. {
  440. "variable": "access",
  441. "label": "Access",
  442. "schema": {
  443. "type": "string",
  444. "enum": [
  445. {
  446. "value": "READ",
  447. "description": "Read Access"
  448. },
  449. {
  450. "value": "MODIFY",
  451. "description": "Modify Access"
  452. },
  453. {
  454. "value": "FULL_CONTROL",
  455. "description": "FULL_CONTROL Access"
  456. }
  457. ]
  458. }
  459. }
  460. ]
  461. }
  462. }
  463. ]
  464. }
  465. }
  466. ]
  467. }
  468. }
  469. ]
  470. }
  471. },
  472. {
  473. "variable": "hostPathConfig",
  474. "label": "Host Path Configuration",
  475. "schema": {
  476. "type": "dict",
  477. "show_if": [
  478. [
  479. "type",
  480. "=",
  481. "hostPath"
  482. ]
  483. ],
  484. "attrs": [
  485. {
  486. "variable": "aclEnable",
  487. "label": "Enable ACL",
  488. "description": "Enable ACL for the dataset.",
  489. "schema": {
  490. "type": "boolean",
  491. "default": false
  492. }
  493. },
  494. {
  495. "variable": "acl",
  496. "label": "ACL Configuration",
  497. "schema": {
  498. "type": "dict",
  499. "show_if": [
  500. [
  501. "aclEnable",
  502. "=",
  503. true
  504. ]
  505. ],
  506. "attrs": [
  507. {
  508. "variable": "path",
  509. "label": "Host Path",
  510. "description": "Host Path to perform ACL",
  511. "schema": {
  512. "type": "hostpath",
  513. "required": true,
  514. "empty": false
  515. }
  516. },
  517. {
  518. "variable": "entries",
  519. "label": "ACL Entries",
  520. "description": "ACL Entries",
  521. "schema": {
  522. "type": "list",
  523. "items": [
  524. {
  525. "variable": "aclEntry",
  526. "label": "ACL Entry",
  527. "schema": {
  528. "type": "dict",
  529. "attrs": [
  530. {
  531. "variable": "id_type",
  532. "label": "ID Type",
  533. "schema": {
  534. "type": "string",
  535. "enum": [
  536. {
  537. "value": "USER",
  538. "description": "Entry is for a USER"
  539. },
  540. {
  541. "value": "GROUP",
  542. "description": "Entry is for a GROUP"
  543. }
  544. ],
  545. "default": "USER"
  546. }
  547. },
  548. {
  549. "variable": "id",
  550. "label": "ID",
  551. "description": "Make sure to check the ID value is correct and aligns with RunAs user context of the application",
  552. "schema": {
  553. "type": "int",
  554. "required": true,
  555. "min": 0
  556. }
  557. },
  558. {
  559. "variable": "access",
  560. "label": "Access",
  561. "schema": {
  562. "type": "string",
  563. "enum": [
  564. {
  565. "value": "READ",
  566. "description": "Read Access"
  567. },
  568. {
  569. "value": "MODIFY",
  570. "description": "Modify Access"
  571. },
  572. {
  573. "value": "FULL_CONTROL",
  574. "description": "FULL_CONTROL Access"
  575. }
  576. ]
  577. }
  578. }
  579. ]
  580. }
  581. }
  582. ]
  583. }
  584. },
  585. {
  586. "variable": "options",
  587. "label": "ACL Options",
  588. "schema": {
  589. "type": "dict",
  590. "attrs": [
  591. {
  592. "variable": "force",
  593. "label": "Force Flag",
  594. "description": "Enabling `Force` applies ACL even if the path has existing data",
  595. "schema": {
  596. "type": "boolean",
  597. "default": false
  598. }
  599. }
  600. ]
  601. }
  602. }
  603. ],
  604. "$ref": [
  605. "normalize/acl"
  606. ]
  607. }
  608. },
  609. {
  610. "variable": "hostPath",
  611. "label": "Host Path",
  612. "description": "The host path to use for storage.",
  613. "schema": {
  614. "type": "hostpath",
  615. "show_if": [
  616. [
  617. "aclEnable",
  618. "=",
  619. false
  620. ]
  621. ],
  622. "required": true
  623. }
  624. }
  625. ]
  626. }
  627. }
  628. ]
  629. }
  630. },
  631. {
  632. "variable": "additionalStorages",
  633. "label": "Additional Storage",
  634. "description": "Additional storage for 2FAuth.",
  635. "schema": {
  636. "type": "list",
  637. "default": [],
  638. "items": [
  639. {
  640. "variable": "storageEntry",
  641. "label": "Storage Entry",
  642. "schema": {
  643. "type": "dict",
  644. "attrs": [
  645. {
  646. "variable": "type",
  647. "label": "Type",
  648. "description": "ixVolume: Is dataset created automatically by the system.</br>\nHost Path: Is a path that already exists on the system.</br>\nSMB Share: Is a SMB share that is mounted to a persistent volume claim.\n",
  649. "schema": {
  650. "type": "string",
  651. "required": true,
  652. "default": "ixVolume",
  653. "immutable": true,
  654. "enum": [
  655. {
  656. "value": "hostPath",
  657. "description": "Host Path (Path that already exists on the system)"
  658. },
  659. {
  660. "value": "ixVolume",
  661. "description": "ixVolume (Dataset created automatically by the system)"
  662. },
  663. {
  664. "value": "smb-pv-pvc",
  665. "description": "SMB Share (Mounts a persistent volume claim to a SMB share)"
  666. }
  667. ]
  668. }
  669. },
  670. {
  671. "variable": "readOnly",
  672. "label": "Read Only",
  673. "description": "Mount the volume as read only.",
  674. "schema": {
  675. "type": "boolean",
  676. "default": false
  677. }
  678. },
  679. {
  680. "variable": "mountPath",
  681. "label": "Mount Path",
  682. "description": "The path inside the container to mount the storage.",
  683. "schema": {
  684. "type": "path",
  685. "required": true
  686. }
  687. },
  688. {
  689. "variable": "hostPathConfig",
  690. "label": "Host Path Configuration",
  691. "schema": {
  692. "type": "dict",
  693. "show_if": [
  694. [
  695. "type",
  696. "=",
  697. "hostPath"
  698. ]
  699. ],
  700. "attrs": [
  701. {
  702. "variable": "aclEnable",
  703. "label": "Enable ACL",
  704. "description": "Enable ACL for the dataset.",
  705. "schema": {
  706. "type": "boolean",
  707. "default": false
  708. }
  709. },
  710. {
  711. "variable": "acl",
  712. "label": "ACL Configuration",
  713. "schema": {
  714. "type": "dict",
  715. "show_if": [
  716. [
  717. "aclEnable",
  718. "=",
  719. true
  720. ]
  721. ],
  722. "attrs": [
  723. {
  724. "variable": "path",
  725. "label": "Host Path",
  726. "description": "Host Path to perform ACL",
  727. "schema": {
  728. "type": "hostpath",
  729. "required": true,
  730. "empty": false
  731. }
  732. },
  733. {
  734. "variable": "entries",
  735. "label": "ACL Entries",
  736. "description": "ACL Entries",
  737. "schema": {
  738. "type": "list",
  739. "items": [
  740. {
  741. "variable": "aclEntry",
  742. "label": "ACL Entry",
  743. "schema": {
  744. "type": "dict",
  745. "attrs": [
  746. {
  747. "variable": "id_type",
  748. "label": "ID Type",
  749. "schema": {
  750. "type": "string",
  751. "enum": [
  752. {
  753. "value": "USER",
  754. "description": "Entry is for a USER"
  755. },
  756. {
  757. "value": "GROUP",
  758. "description": "Entry is for a GROUP"
  759. }
  760. ],
  761. "default": "USER"
  762. }
  763. },
  764. {
  765. "variable": "id",
  766. "label": "ID",
  767. "description": "Make sure to check the ID value is correct and aligns with RunAs user context of the application",
  768. "schema": {
  769. "type": "int",
  770. "required": true,
  771. "min": 0
  772. }
  773. },
  774. {
  775. "variable": "access",
  776. "label": "Access",
  777. "schema": {
  778. "type": "string",
  779. "enum": [
  780. {
  781. "value": "READ",
  782. "description": "Read Access"
  783. },
  784. {
  785. "value": "MODIFY",
  786. "description": "Modify Access"
  787. },
  788. {
  789. "value": "FULL_CONTROL",
  790. "description": "FULL_CONTROL Access"
  791. }
  792. ]
  793. }
  794. }
  795. ]
  796. }
  797. }
  798. ]
  799. }
  800. },
  801. {
  802. "variable": "options",
  803. "label": "ACL Options",
  804. "schema": {
  805. "type": "dict",
  806. "attrs": [
  807. {
  808. "variable": "force",
  809. "label": "Force Flag",
  810. "description": "Enabling `Force` applies ACL even if the path has existing data",
  811. "schema": {
  812. "type": "boolean",
  813. "default": false
  814. }
  815. }
  816. ]
  817. }
  818. }
  819. ],
  820. "$ref": [
  821. "normalize/acl"
  822. ]
  823. }
  824. },
  825. {
  826. "variable": "hostPath",
  827. "label": "Host Path",
  828. "description": "The host path to use for storage.",
  829. "schema": {
  830. "type": "hostpath",
  831. "show_if": [
  832. [
  833. "aclEnable",
  834. "=",
  835. false
  836. ]
  837. ],
  838. "required": true
  839. }
  840. }
  841. ]
  842. }
  843. },
  844. {
  845. "variable": "ixVolumeConfig",
  846. "label": "ixVolume Configuration",
  847. "description": "The configuration for the ixVolume dataset.",
  848. "schema": {
  849. "type": "dict",
  850. "show_if": [
  851. [
  852. "type",
  853. "=",
  854. "ixVolume"
  855. ]
  856. ],
  857. "$ref": [
  858. "normalize/ixVolume"
  859. ],
  860. "attrs": [
  861. {
  862. "variable": "aclEnable",
  863. "label": "Enable ACL",
  864. "description": "Enable ACL for the dataset.",
  865. "schema": {
  866. "type": "boolean",
  867. "default": false
  868. }
  869. },
  870. {
  871. "variable": "datasetName",
  872. "label": "Dataset Name",
  873. "description": "The name of the dataset to use for storage.",
  874. "schema": {
  875. "type": "string",
  876. "required": true,
  877. "immutable": true,
  878. "default": "storage_entry"
  879. }
  880. },
  881. {
  882. "variable": "aclEntries",
  883. "label": "ACL Configuration",
  884. "schema": {
  885. "type": "dict",
  886. "show_if": [
  887. [
  888. "aclEnable",
  889. "=",
  890. true
  891. ]
  892. ],
  893. "attrs": [
  894. {
  895. "variable": "path",
  896. "label": "Path",
  897. "description": "Path to perform ACL",
  898. "schema": {
  899. "type": "string",
  900. "hidden": true
  901. }
  902. },
  903. {
  904. "variable": "entries",
  905. "label": "ACL Entries",
  906. "description": "ACL Entries",
  907. "schema": {
  908. "type": "list",
  909. "items": [
  910. {
  911. "variable": "aclEntry",
  912. "label": "ACL Entry",
  913. "schema": {
  914. "type": "dict",
  915. "attrs": [
  916. {
  917. "variable": "id_type",
  918. "label": "ID Type",
  919. "schema": {
  920. "type": "string",
  921. "enum": [
  922. {
  923. "value": "USER",
  924. "description": "Entry is for a USER"
  925. },
  926. {
  927. "value": "GROUP",
  928. "description": "Entry is for a GROUP"
  929. }
  930. ],
  931. "default": "USER"
  932. }
  933. },
  934. {
  935. "variable": "id",
  936. "label": "ID",
  937. "description": "Make sure to check the ID value is correct and aligns with RunAs user context of the application",
  938. "schema": {
  939. "type": "int",
  940. "required": true,
  941. "min": 0
  942. }
  943. },
  944. {
  945. "variable": "access",
  946. "label": "Access",
  947. "schema": {
  948. "type": "string",
  949. "enum": [
  950. {
  951. "value": "READ",
  952. "description": "Read Access"
  953. },
  954. {
  955. "value": "MODIFY",
  956. "description": "Modify Access"
  957. },
  958. {
  959. "value": "FULL_CONTROL",
  960. "description": "FULL_CONTROL Access"
  961. }
  962. ]
  963. }
  964. }
  965. ]
  966. }
  967. }
  968. ]
  969. }
  970. }
  971. ]
  972. }
  973. }
  974. ]
  975. }
  976. },
  977. {
  978. "variable": "smbConfig",
  979. "label": "SMB Share Configuration",
  980. "description": "The configuration for the SMB Share.",
  981. "schema": {
  982. "type": "dict",
  983. "show_if": [
  984. [
  985. "type",
  986. "=",
  987. "smb-pv-pvc"
  988. ]
  989. ],
  990. "attrs": [
  991. {
  992. "variable": "server",
  993. "label": "Server",
  994. "description": "The server for the SMB share.",
  995. "schema": {
  996. "type": "string",
  997. "required": true
  998. }
  999. },
  1000. {
  1001. "variable": "share",
  1002. "label": "Share",
  1003. "description": "The share name for the SMB share.",
  1004. "schema": {
  1005. "type": "string",
  1006. "required": true
  1007. }
  1008. },
  1009. {
  1010. "variable": "domain",
  1011. "label": "Domain (Optional)",
  1012. "description": "The domain for the SMB share.",
  1013. "schema": {
  1014. "type": "string"
  1015. }
  1016. },
  1017. {
  1018. "variable": "username",
  1019. "label": "Username",
  1020. "description": "The username for the SMB share.",
  1021. "schema": {
  1022. "type": "string",
  1023. "required": true
  1024. }
  1025. },
  1026. {
  1027. "variable": "password",
  1028. "label": "Password",
  1029. "description": "The password for the SMB share.",
  1030. "schema": {
  1031. "type": "string",
  1032. "required": true,
  1033. "private": true
  1034. }
  1035. },
  1036. {
  1037. "variable": "size",
  1038. "label": "Size (in Gi)",
  1039. "description": "The size of the volume quota.",
  1040. "schema": {
  1041. "type": "int",
  1042. "required": true,
  1043. "min": 1,
  1044. "default": 1
  1045. }
  1046. }
  1047. ]
  1048. }
  1049. }
  1050. ]
  1051. }
  1052. }
  1053. ]
  1054. }
  1055. }
  1056. ]
  1057. }
  1058. },
  1059. {
  1060. "variable": "resources",
  1061. "group": "Resources Configuration",
  1062. "label": "",
  1063. "schema": {
  1064. "type": "dict",
  1065. "attrs": [
  1066. {
  1067. "variable": "limits",
  1068. "label": "Limits",
  1069. "schema": {
  1070. "type": "dict",
  1071. "attrs": [
  1072. {
  1073. "variable": "cpu",
  1074. "label": "CPU",
  1075. "description": "CPU limit for 2FAuth.",
  1076. "schema": {
  1077. "type": "string",
  1078. "max_length": 6,
  1079. "valid_chars": "^(0\\.[1-9]|[1-9][0-9]*)(\\.[0-9]|m?)$",
  1080. "valid_chars_error": "Valid CPU limit formats are</br>\n- Plain Integer - eg. 1</br>\n- Float - eg. 0.5</br>\n- Milicpu - eg. 500m\n",
  1081. "default": "4000m",
  1082. "required": true
  1083. }
  1084. },
  1085. {
  1086. "variable": "memory",
  1087. "label": "Memory",
  1088. "description": "Memory limit for 2FAuth.",
  1089. "schema": {
  1090. "type": "string",
  1091. "max_length": 12,
  1092. "valid_chars": "^[1-9][0-9]*([EPTGMK]i?|e[0-9]+)?$",
  1093. "valid_chars_error": "Valid Memory limit formats are</br>\n- Suffixed with E/P/T/G/M/K - eg. 1G</br>\n- Suffixed with Ei/Pi/Ti/Gi/Mi/Ki - eg. 1Gi</br>\n- Plain Integer in bytes - eg. 1024</br>\n- Exponent - eg. 134e6\n",
  1094. "default": "8Gi",
  1095. "required": true
  1096. }
  1097. }
  1098. ]
  1099. }
  1100. }
  1101. ]
  1102. }
  1103. }
  1104. ]
  1105. },
  1106. "app_readme": "<h1>2FAuth</h1>\n<p><a href=\"https://docs.2fauth.app/\">2FAuth</a> is a web based self-hosted alternative to One Time Passcode (OTP) generators like Google Authenticator, designed for both mobile and desktop.</p>\n<blockquote>\n<p>When application is installed, a container will be launched with <strong>root</strong> privileges.\nThis is required in order to apply the correct permissions to the <code>2FAuth</code> directories.\nAfterward, the <code>2FAuth</code> container will run as a <strong>non</strong>-root user (<code>1000</code>).\nAll mounted storage(s) will be <code>chown</code>ed only if the parent directory does not match the configured user.</p>\n</blockquote>",
  1107. "detailed_readme": "<h1>2FAuth</h1>\n<p><a href=\"https://docs.2fauth.app/\">2FAuth</a> is a web based self-hosted alternative to One Time Passcode (OTP) generators like Google Authenticator, designed for both mobile and desktop.</p>\n<blockquote>\n<p>When application is installed, a container will be launched with <strong>root</strong> privileges.\nThis is required in order to apply the correct permissions to the <code>2FAuth</code> directories.\nAfterward, the <code>2FAuth</code> container will run as a <strong>non</strong>-root user (<code>1000</code>).\nAll mounted storage(s) will be <code>chown</code>ed only if the parent directory does not match the configured user.</p>\n</blockquote>",
  1108. "changelog": null
  1109. }
  1110. }