app_versions.json 36 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620
  1. {
  2. "1.1.2": {
  3. "healthy": true,
  4. "supported": true,
  5. "healthy_error": null,
  6. "location": "/__w/charts/charts/community/twofactor-auth/1.1.2",
  7. "last_update": "2023-11-14 10:11:57",
  8. "required_features": [
  9. "normalize/ixVolume"
  10. ],
  11. "human_version": "4.2.3_1.1.2",
  12. "version": "1.1.2",
  13. "chart_metadata": {
  14. "name": "twofactor-auth",
  15. "description": "2FAuth is a web based self-hosted alternative to One Time Passcode (OTP) generators like Google Authenticator, designed for both mobile and desktop.",
  16. "annotations": {
  17. "title": "2FAuth"
  18. },
  19. "type": "application",
  20. "version": "1.1.2",
  21. "apiVersion": "v2",
  22. "appVersion": "4.2.3",
  23. "kubeVersion": ">=1.16.0-0",
  24. "maintainers": [
  25. {
  26. "name": "truenas",
  27. "url": "https://www.truenas.com/",
  28. "email": "dev@ixsystems.com"
  29. }
  30. ],
  31. "dependencies": [
  32. {
  33. "name": "common",
  34. "repository": "file://../../../common",
  35. "version": "1.2.2"
  36. }
  37. ],
  38. "home": "https://docs.2fauth.app/",
  39. "icon": "https://media.sys.truenas.net/apps/twofactor-auth/icons/icon.png",
  40. "sources": [
  41. "https://github.com/Bubka/2FAuth",
  42. "https://github.com/truenas/charts/tree/master/library/ix-dev/community/2fauth",
  43. "https://hub.docker.com/r/2fauth/2fauth/"
  44. ],
  45. "keywords": [
  46. "security",
  47. "2fa",
  48. "otp"
  49. ]
  50. },
  51. "app_metadata": {
  52. "runAsContext": [
  53. {
  54. "userName": "twofauth",
  55. "groupName": "twofauthreadarr",
  56. "gid": 1000,
  57. "uid": 1000,
  58. "description": "2FAuth runs as a non-root user."
  59. }
  60. ],
  61. "capabilities": [],
  62. "hostMounts": []
  63. },
  64. "schema": {
  65. "groups": [
  66. {
  67. "name": "2FAuth Configuration",
  68. "description": "Configure 2FAuth"
  69. },
  70. {
  71. "name": "Network Configuration",
  72. "description": "Configure Network for 2FAuth"
  73. },
  74. {
  75. "name": "Storage Configuration",
  76. "description": "Configure Storage for 2FAuth"
  77. },
  78. {
  79. "name": "Resources Configuration",
  80. "description": "Configure Resources for 2FAuth"
  81. }
  82. ],
  83. "portals": {
  84. "web_portal": {
  85. "protocols": [
  86. "$kubernetes-resource_configmap_portal_protocol"
  87. ],
  88. "host": [
  89. "$kubernetes-resource_configmap_portal_host"
  90. ],
  91. "ports": [
  92. "$kubernetes-resource_configmap_portal_port"
  93. ],
  94. "path": "$kubernetes-resource_configmap_portal_path"
  95. }
  96. },
  97. "questions": [
  98. {
  99. "variable": "twofauthConfig",
  100. "label": "",
  101. "group": "2FAuth Configuration",
  102. "schema": {
  103. "type": "dict",
  104. "attrs": [
  105. {
  106. "variable": "appName",
  107. "label": "App Name",
  108. "description": "The name of the 2FAuth.",
  109. "schema": {
  110. "type": "string",
  111. "default": "2FAuth",
  112. "required": true
  113. }
  114. },
  115. {
  116. "variable": "appUrl",
  117. "label": "App URL",
  118. "description": "The URL that 2FAuth will be accessible from.</br>\nExample: </br>\nhttp://server.ip:30081</br>\nhttps://2fauth.example.com\n",
  119. "schema": {
  120. "type": "uri",
  121. "default": "",
  122. "required": true
  123. }
  124. },
  125. {
  126. "variable": "siteOwnerEmail",
  127. "label": "Site Owner Email",
  128. "description": "The email address of the site owner.",
  129. "schema": {
  130. "type": "string",
  131. "default": "",
  132. "required": true
  133. }
  134. },
  135. {
  136. "variable": "authenticationGuard",
  137. "label": "Authentication Guard",
  138. "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",
  139. "schema": {
  140. "type": "string",
  141. "default": "web-guard",
  142. "required": true,
  143. "enum": [
  144. {
  145. "value": "web-guard",
  146. "description": "Web Guard"
  147. },
  148. {
  149. "value": "reverse-proxy-guard",
  150. "description": "Reverse Proxy Guard"
  151. }
  152. ]
  153. }
  154. },
  155. {
  156. "variable": "authProxyHeaderUser",
  157. "label": "Authentication Proxy Header User",
  158. "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",
  159. "schema": {
  160. "type": "string",
  161. "default": "",
  162. "show_if": [
  163. [
  164. "authenticationGuard",
  165. "=",
  166. "reverse-proxy-guard"
  167. ]
  168. ],
  169. "required": true
  170. }
  171. },
  172. {
  173. "variable": "authProxyHeaderEmail",
  174. "label": "Authentication Proxy Header Email",
  175. "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",
  176. "schema": {
  177. "type": "string",
  178. "default": "",
  179. "show_if": [
  180. [
  181. "authenticationGuard",
  182. "=",
  183. "reverse-proxy-guard"
  184. ]
  185. ],
  186. "required": true
  187. }
  188. },
  189. {
  190. "variable": "webauthnUserVerification",
  191. "label": "WebAuthn User Verification",
  192. "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",
  193. "schema": {
  194. "type": "string",
  195. "default": "preferred",
  196. "required": true,
  197. "enum": [
  198. {
  199. "value": "preferred",
  200. "description": "Preferred"
  201. },
  202. {
  203. "value": "required",
  204. "description": "Required"
  205. },
  206. {
  207. "value": "discouraged",
  208. "description": "Discouraged"
  209. }
  210. ]
  211. }
  212. },
  213. {
  214. "variable": "trustedProxies",
  215. "label": "Trusted Proxies",
  216. "description": "The list of proxies IP to trust",
  217. "schema": {
  218. "type": "list",
  219. "default": [],
  220. "items": [
  221. {
  222. "variable": "trustedProxy",
  223. "label": "Trusted Proxy",
  224. "schema": {
  225. "type": "string",
  226. "required": true
  227. }
  228. }
  229. ]
  230. }
  231. },
  232. {
  233. "variable": "additionalEnvs",
  234. "label": "Additional Environment Variables",
  235. "description": "Configure additional environment variables for 2FAuth.",
  236. "schema": {
  237. "type": "list",
  238. "default": [],
  239. "items": [
  240. {
  241. "variable": "env",
  242. "label": "Environment Variable",
  243. "schema": {
  244. "type": "dict",
  245. "attrs": [
  246. {
  247. "variable": "name",
  248. "label": "Name",
  249. "schema": {
  250. "type": "string",
  251. "required": true
  252. }
  253. },
  254. {
  255. "variable": "value",
  256. "label": "Value",
  257. "schema": {
  258. "type": "string",
  259. "required": true
  260. }
  261. }
  262. ]
  263. }
  264. }
  265. ]
  266. }
  267. }
  268. ]
  269. }
  270. },
  271. {
  272. "variable": "twofauthNetwork",
  273. "label": "",
  274. "group": "Network Configuration",
  275. "schema": {
  276. "type": "dict",
  277. "attrs": [
  278. {
  279. "variable": "webPort",
  280. "label": "Web Port",
  281. "description": "The port for the 2FAuth Web UI.",
  282. "schema": {
  283. "type": "int",
  284. "default": 30081,
  285. "min": 9000,
  286. "max": 65535,
  287. "required": true
  288. }
  289. },
  290. {
  291. "variable": "hostNetwork",
  292. "label": "Host Network",
  293. "description": "Bind to the host network. It's recommended to keep this disabled.</br>\n",
  294. "schema": {
  295. "type": "boolean",
  296. "default": false
  297. }
  298. }
  299. ]
  300. }
  301. },
  302. {
  303. "variable": "twofauthStorage",
  304. "label": "",
  305. "group": "Storage Configuration",
  306. "schema": {
  307. "type": "dict",
  308. "attrs": [
  309. {
  310. "variable": "config",
  311. "label": "2FAuth Config Storage",
  312. "description": "The path to store 2FAuth Configuration.",
  313. "schema": {
  314. "type": "dict",
  315. "attrs": [
  316. {
  317. "variable": "type",
  318. "label": "Type",
  319. "description": "ixVolume: Is dataset created automatically by the system.</br>\nHost Path: Is a path that already exists on the system.\n",
  320. "schema": {
  321. "type": "string",
  322. "required": true,
  323. "immutable": true,
  324. "default": "ixVolume",
  325. "enum": [
  326. {
  327. "value": "hostPath",
  328. "description": "Host Path (Path that already exists on the system)"
  329. },
  330. {
  331. "value": "ixVolume",
  332. "description": "ixVolume (Dataset created automatically by the system)"
  333. }
  334. ]
  335. }
  336. },
  337. {
  338. "variable": "datasetName",
  339. "label": "Dataset Name",
  340. "schema": {
  341. "type": "string",
  342. "show_if": [
  343. [
  344. "type",
  345. "=",
  346. "ixVolume"
  347. ]
  348. ],
  349. "required": true,
  350. "hidden": true,
  351. "immutable": true,
  352. "default": "config",
  353. "$ref": [
  354. "normalize/ixVolume"
  355. ]
  356. }
  357. },
  358. {
  359. "variable": "hostPath",
  360. "label": "Host Path",
  361. "schema": {
  362. "type": "hostpath",
  363. "show_if": [
  364. [
  365. "type",
  366. "=",
  367. "hostPath"
  368. ]
  369. ],
  370. "immutable": true,
  371. "required": true
  372. }
  373. }
  374. ]
  375. }
  376. },
  377. {
  378. "variable": "additionalStorages",
  379. "label": "Additional Storage",
  380. "description": "Additional storage for 2FAuth.",
  381. "schema": {
  382. "type": "list",
  383. "default": [],
  384. "items": [
  385. {
  386. "variable": "storageEntry",
  387. "label": "Storage Entry",
  388. "schema": {
  389. "type": "dict",
  390. "attrs": [
  391. {
  392. "variable": "type",
  393. "label": "Type",
  394. "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",
  395. "schema": {
  396. "type": "string",
  397. "required": true,
  398. "default": "ixVolume",
  399. "immutable": true,
  400. "enum": [
  401. {
  402. "value": "hostPath",
  403. "description": "Host Path (Path that already exists on the system)"
  404. },
  405. {
  406. "value": "ixVolume",
  407. "description": "ixVolume (Dataset created automatically by the system)"
  408. },
  409. {
  410. "value": "smb-pv-pvc",
  411. "description": "SMB Share (Mounts a persistent volume claim to a SMB share)"
  412. }
  413. ]
  414. }
  415. },
  416. {
  417. "variable": "mountPath",
  418. "label": "Mount Path",
  419. "description": "The path inside the container to mount the storage.",
  420. "schema": {
  421. "type": "path",
  422. "required": true
  423. }
  424. },
  425. {
  426. "variable": "hostPath",
  427. "label": "Host Path",
  428. "description": "The host path to use for storage.",
  429. "schema": {
  430. "type": "hostpath",
  431. "show_if": [
  432. [
  433. "type",
  434. "=",
  435. "hostPath"
  436. ]
  437. ],
  438. "required": true
  439. }
  440. },
  441. {
  442. "variable": "datasetName",
  443. "label": "Dataset Name",
  444. "description": "The name of the dataset to use for storage.",
  445. "schema": {
  446. "type": "string",
  447. "show_if": [
  448. [
  449. "type",
  450. "=",
  451. "ixVolume"
  452. ]
  453. ],
  454. "required": true,
  455. "immutable": true,
  456. "default": "storage_entry",
  457. "$ref": [
  458. "normalize/ixVolume"
  459. ]
  460. }
  461. },
  462. {
  463. "variable": "server",
  464. "label": "Server",
  465. "description": "The server for the SMB share.",
  466. "schema": {
  467. "type": "string",
  468. "show_if": [
  469. [
  470. "type",
  471. "=",
  472. "smb-pv-pvc"
  473. ]
  474. ],
  475. "required": true
  476. }
  477. },
  478. {
  479. "variable": "share",
  480. "label": "Share",
  481. "description": "The share name for the SMB share.",
  482. "schema": {
  483. "type": "string",
  484. "show_if": [
  485. [
  486. "type",
  487. "=",
  488. "smb-pv-pvc"
  489. ]
  490. ],
  491. "required": true
  492. }
  493. },
  494. {
  495. "variable": "domain",
  496. "label": "Domain (Optional)",
  497. "description": "The domain for the SMB share.",
  498. "schema": {
  499. "type": "string",
  500. "show_if": [
  501. [
  502. "type",
  503. "=",
  504. "smb-pv-pvc"
  505. ]
  506. ]
  507. }
  508. },
  509. {
  510. "variable": "username",
  511. "label": "Username",
  512. "description": "The username for the SMB share.",
  513. "schema": {
  514. "type": "string",
  515. "show_if": [
  516. [
  517. "type",
  518. "=",
  519. "smb-pv-pvc"
  520. ]
  521. ],
  522. "required": true
  523. }
  524. },
  525. {
  526. "variable": "password",
  527. "label": "Password",
  528. "description": "The password for the SMB share.",
  529. "schema": {
  530. "type": "string",
  531. "show_if": [
  532. [
  533. "type",
  534. "=",
  535. "smb-pv-pvc"
  536. ]
  537. ],
  538. "required": true,
  539. "private": true
  540. }
  541. },
  542. {
  543. "variable": "size",
  544. "label": "Size (in Gi)",
  545. "description": "The size of the volume quota.",
  546. "schema": {
  547. "type": "int",
  548. "show_if": [
  549. [
  550. "type",
  551. "=",
  552. "smb-pv-pvc"
  553. ]
  554. ],
  555. "required": true,
  556. "min": 1,
  557. "default": 1
  558. }
  559. }
  560. ]
  561. }
  562. }
  563. ]
  564. }
  565. }
  566. ]
  567. }
  568. },
  569. {
  570. "variable": "resources",
  571. "group": "Resources Configuration",
  572. "label": "",
  573. "schema": {
  574. "type": "dict",
  575. "attrs": [
  576. {
  577. "variable": "limits",
  578. "label": "Limits",
  579. "schema": {
  580. "type": "dict",
  581. "attrs": [
  582. {
  583. "variable": "cpu",
  584. "label": "CPU",
  585. "description": "CPU limit for 2FAuth.",
  586. "schema": {
  587. "type": "string",
  588. "max_length": 6,
  589. "valid_chars": "^(0\\.[1-9]|[1-9][0-9]*)(\\.[0-9]|m?)$",
  590. "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",
  591. "default": "4000m",
  592. "required": true
  593. }
  594. },
  595. {
  596. "variable": "memory",
  597. "label": "Memory",
  598. "description": "Memory limit for 2FAuth.",
  599. "schema": {
  600. "type": "string",
  601. "max_length": 12,
  602. "valid_chars": "^[1-9][0-9]*([EPTGMK]i?|e[0-9]+)?$",
  603. "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",
  604. "default": "8Gi",
  605. "required": true
  606. }
  607. }
  608. ]
  609. }
  610. }
  611. ]
  612. }
  613. }
  614. ]
  615. },
  616. "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>",
  617. "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>",
  618. "changelog": null
  619. }
  620. }