app_versions.json 57 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970
  1. {
  2. "1.2.7": {
  3. "healthy": true,
  4. "supported": true,
  5. "healthy_error": null,
  6. "location": "/__w/apps/apps/trains/community/twofactor-auth/1.2.7",
  7. "last_update": "2025-09-02 11:33:24",
  8. "required_features": [],
  9. "human_version": "5.6.0_1.2.7",
  10. "version": "1.2.7",
  11. "app_metadata": {
  12. "annotations": {
  13. "min_scale_version": "24.10.2.2"
  14. },
  15. "app_version": "5.6.0",
  16. "capabilities": [],
  17. "categories": [
  18. "security"
  19. ],
  20. "changelog_url": "https://github.com/Bubka/2FAuth/blob/master/changelog.md",
  21. "date_added": "2024-09-18",
  22. "description": "2FAuth is a web based self-hosted alternative to One Time Passcode (OTP) generators like Google Authenticator, designed for both mobile and desktop.",
  23. "home": "https://docs.2fauth.app/",
  24. "host_mounts": [],
  25. "icon": "https://media.sys.truenas.net/apps/twofactor-auth/icons/icon.png",
  26. "keywords": [
  27. "security",
  28. "2fa",
  29. "otp"
  30. ],
  31. "lib_version": "2.1.49",
  32. "lib_version_hash": "e71e6b0122c9446fa5ea6fb07e7eb01b11fb42d549a19845426bbd7e21a42634",
  33. "maintainers": [
  34. {
  35. "email": "dev@ixsystems.com",
  36. "name": "truenas",
  37. "url": "https://www.truenas.com/"
  38. }
  39. ],
  40. "name": "twofactor-auth",
  41. "run_as_context": [
  42. {
  43. "description": "2FAuth runs as non-root user.",
  44. "gid": 1000,
  45. "group_name": "2fauth",
  46. "uid": 1000,
  47. "user_name": "2fauth"
  48. }
  49. ],
  50. "screenshots": [
  51. "https://media.sys.truenas.net/apps/twofactor-auth/screenshots/screenshot1.png"
  52. ],
  53. "sources": [
  54. "https://github.com/Bubka/2FAuth",
  55. "https://hub.docker.com/r/2fauth/2fauth/"
  56. ],
  57. "title": "2FAuth",
  58. "train": "community",
  59. "version": "1.2.7"
  60. },
  61. "schema": {
  62. "groups": [
  63. {
  64. "name": "2FAuth Configuration",
  65. "description": "Configure 2FAuth"
  66. },
  67. {
  68. "name": "User and Group Configuration",
  69. "description": "Configure User and Group for 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": "Labels Configuration",
  81. "description": "Configure Labels for 2FAuth"
  82. },
  83. {
  84. "name": "Resources Configuration",
  85. "description": "Configure Resources for 2FAuth"
  86. }
  87. ],
  88. "questions": [
  89. {
  90. "variable": "TZ",
  91. "group": "2FAuth Configuration",
  92. "label": "Timezone",
  93. "schema": {
  94. "type": "string",
  95. "default": "Etc/UTC",
  96. "required": true,
  97. "$ref": [
  98. "definitions/timezone"
  99. ]
  100. }
  101. },
  102. {
  103. "variable": "twofactor_auth",
  104. "label": "",
  105. "group": "2FAuth Configuration",
  106. "schema": {
  107. "type": "dict",
  108. "attrs": [
  109. {
  110. "variable": "app_key",
  111. "label": "App Key",
  112. "description": "The app key for 2FAuth.",
  113. "schema": {
  114. "type": "string",
  115. "required": true,
  116. "private": true,
  117. "min_length": 32,
  118. "max_length": 32,
  119. "default": ""
  120. }
  121. },
  122. {
  123. "variable": "app_name",
  124. "label": "App Name",
  125. "description": "The app name for 2FAuth.",
  126. "schema": {
  127. "type": "string",
  128. "required": true,
  129. "default": "2FAuth"
  130. }
  131. },
  132. {
  133. "variable": "app_url",
  134. "label": "App URL",
  135. "description": "The app URL for 2FAuth.</br>\nSetting this wrong will show a blank page.</br>\nExamples:</br>\nhttps://2fauth.example.com </br>\nhttp://192.168.1.100:30081\n",
  136. "schema": {
  137. "type": "uri",
  138. "required": true,
  139. "default": ""
  140. }
  141. },
  142. {
  143. "variable": "site_owner_email",
  144. "label": "Site Owner Email",
  145. "description": "The email address of the site owner.",
  146. "schema": {
  147. "type": "string",
  148. "required": true,
  149. "default": ""
  150. }
  151. },
  152. {
  153. "variable": "authentication_guard",
  154. "label": "Authentication Guard",
  155. "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",
  156. "schema": {
  157. "type": "string",
  158. "default": "web-guard",
  159. "required": true,
  160. "enum": [
  161. {
  162. "value": "web-guard",
  163. "description": "Web Guard"
  164. },
  165. {
  166. "value": "reverse-proxy-guard",
  167. "description": "Reverse Proxy Guard"
  168. }
  169. ]
  170. }
  171. },
  172. {
  173. "variable": "authentication_header_user",
  174. "label": "Authentication Proxy Header User",
  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. "authentication_guard",
  182. "=",
  183. "reverse-proxy-guard"
  184. ]
  185. ],
  186. "required": true
  187. }
  188. },
  189. {
  190. "variable": "authentication_header_email",
  191. "label": "Authentication Proxy Header Email",
  192. "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",
  193. "schema": {
  194. "type": "string",
  195. "default": "",
  196. "show_if": [
  197. [
  198. "authentication_guard",
  199. "=",
  200. "reverse-proxy-guard"
  201. ]
  202. ],
  203. "required": true
  204. }
  205. },
  206. {
  207. "variable": "webauthn_user_verification",
  208. "label": "WebAuthn User Verification",
  209. "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",
  210. "schema": {
  211. "type": "string",
  212. "default": "preferred",
  213. "required": true,
  214. "enum": [
  215. {
  216. "value": "preferred",
  217. "description": "Preferred"
  218. },
  219. {
  220. "value": "required",
  221. "description": "Required"
  222. },
  223. {
  224. "value": "discouraged",
  225. "description": "Discouraged"
  226. }
  227. ]
  228. }
  229. },
  230. {
  231. "variable": "trusted_proxies",
  232. "label": "Trusted Proxies",
  233. "description": "The list of proxies IP to trust",
  234. "schema": {
  235. "type": "list",
  236. "default": [],
  237. "items": [
  238. {
  239. "variable": "trustedProxy",
  240. "label": "Trusted Proxy",
  241. "schema": {
  242. "type": "string",
  243. "required": true
  244. }
  245. }
  246. ]
  247. }
  248. },
  249. {
  250. "variable": "additional_envs",
  251. "label": "Additional Environment Variables",
  252. "schema": {
  253. "type": "list",
  254. "default": [],
  255. "items": [
  256. {
  257. "variable": "env",
  258. "label": "Environment Variable",
  259. "schema": {
  260. "type": "dict",
  261. "attrs": [
  262. {
  263. "variable": "name",
  264. "label": "Name",
  265. "schema": {
  266. "type": "string",
  267. "required": true
  268. }
  269. },
  270. {
  271. "variable": "value",
  272. "label": "Value",
  273. "schema": {
  274. "type": "string"
  275. }
  276. }
  277. ]
  278. }
  279. }
  280. ]
  281. }
  282. }
  283. ]
  284. }
  285. },
  286. {
  287. "variable": "run_as",
  288. "label": "",
  289. "group": "User and Group Configuration",
  290. "schema": {
  291. "type": "dict",
  292. "attrs": [
  293. {
  294. "variable": "user",
  295. "label": "User ID",
  296. "description": "The user id that 2FAuth files will be owned by.",
  297. "schema": {
  298. "type": "int",
  299. "min": 568,
  300. "default": 568,
  301. "required": true
  302. }
  303. },
  304. {
  305. "variable": "group",
  306. "label": "Group ID",
  307. "description": "The group id that 2FAuth files will be owned by.",
  308. "schema": {
  309. "type": "int",
  310. "min": 568,
  311. "default": 568,
  312. "required": true
  313. }
  314. }
  315. ]
  316. }
  317. },
  318. {
  319. "variable": "network",
  320. "label": "",
  321. "group": "Network Configuration",
  322. "schema": {
  323. "type": "dict",
  324. "attrs": [
  325. {
  326. "variable": "host_network",
  327. "label": "Host Network",
  328. "description": "Bind to the host network. It's recommended to keep this disabled.\n",
  329. "schema": {
  330. "type": "boolean",
  331. "default": false
  332. }
  333. },
  334. {
  335. "variable": "web_port",
  336. "label": "WebUI Port",
  337. "schema": {
  338. "type": "dict",
  339. "show_if": [
  340. [
  341. "host_network",
  342. "=",
  343. false
  344. ]
  345. ],
  346. "attrs": [
  347. {
  348. "variable": "bind_mode",
  349. "label": "Port Bind Mode",
  350. "description": "The port bind mode.</br>\n- Publish: The port will be published on the host for external access.</br>\n- Expose: The port will be exposed for inter-container communication.</br>\n- None: The port will not be exposed or published.</br>\nNote: If the Dockerfile defines an EXPOSE directive,\nthe port will still be exposed for inter-container communication regardless of this setting.\n",
  351. "schema": {
  352. "type": "string",
  353. "default": "published",
  354. "enum": [
  355. {
  356. "value": "published",
  357. "description": "Publish port on the host for external access"
  358. },
  359. {
  360. "value": "exposed",
  361. "description": "Expose port for inter-container communication"
  362. },
  363. {
  364. "value": "",
  365. "description": "None"
  366. }
  367. ]
  368. }
  369. },
  370. {
  371. "variable": "port_number",
  372. "label": "Port Number",
  373. "schema": {
  374. "type": "int",
  375. "show_if": [
  376. [
  377. "bind_mode",
  378. "=",
  379. "published"
  380. ]
  381. ],
  382. "default": 30081,
  383. "min": 1,
  384. "max": 65535,
  385. "required": true
  386. }
  387. },
  388. {
  389. "variable": "host_ips",
  390. "label": "Host IPs",
  391. "description": "IPs on the host to bind this port",
  392. "schema": {
  393. "type": "list",
  394. "show_if": [
  395. [
  396. "bind_mode",
  397. "=",
  398. "published"
  399. ]
  400. ],
  401. "default": [],
  402. "items": [
  403. {
  404. "variable": "host_ip",
  405. "label": "Host IP",
  406. "schema": {
  407. "type": "string",
  408. "required": true,
  409. "$ref": [
  410. "definitions/node_bind_ip"
  411. ]
  412. }
  413. }
  414. ]
  415. }
  416. }
  417. ]
  418. }
  419. }
  420. ]
  421. }
  422. },
  423. {
  424. "variable": "storage",
  425. "label": "",
  426. "group": "Storage Configuration",
  427. "schema": {
  428. "type": "dict",
  429. "attrs": [
  430. {
  431. "variable": "config",
  432. "label": "2FAuth Config Storage",
  433. "description": "The path to store 2FAuth Config.",
  434. "schema": {
  435. "type": "dict",
  436. "attrs": [
  437. {
  438. "variable": "type",
  439. "label": "Type",
  440. "description": "ixVolume: Is dataset created automatically by the system.</br>\nHost Path: Is a path that already exists on the system.\n",
  441. "schema": {
  442. "type": "string",
  443. "required": true,
  444. "default": "ix_volume",
  445. "enum": [
  446. {
  447. "value": "host_path",
  448. "description": "Host Path (Path that already exists on the system)"
  449. },
  450. {
  451. "value": "ix_volume",
  452. "description": "ixVolume (Dataset created automatically by the system)"
  453. }
  454. ]
  455. }
  456. },
  457. {
  458. "variable": "ix_volume_config",
  459. "label": "ixVolume Configuration",
  460. "description": "The configuration for the ixVolume dataset.",
  461. "schema": {
  462. "type": "dict",
  463. "show_if": [
  464. [
  465. "type",
  466. "=",
  467. "ix_volume"
  468. ]
  469. ],
  470. "$ref": [
  471. "normalize/ix_volume"
  472. ],
  473. "attrs": [
  474. {
  475. "variable": "acl_enable",
  476. "label": "Enable ACL",
  477. "description": "Enable ACL for the storage.",
  478. "schema": {
  479. "type": "boolean",
  480. "default": false
  481. }
  482. },
  483. {
  484. "variable": "dataset_name",
  485. "label": "Dataset Name",
  486. "description": "The name of the dataset to use for storage.",
  487. "schema": {
  488. "type": "string",
  489. "required": true,
  490. "hidden": true,
  491. "default": "config"
  492. }
  493. },
  494. {
  495. "variable": "acl_entries",
  496. "label": "ACL Configuration",
  497. "schema": {
  498. "type": "dict",
  499. "show_if": [
  500. [
  501. "acl_enable",
  502. "=",
  503. true
  504. ]
  505. ],
  506. "attrs": []
  507. }
  508. }
  509. ]
  510. }
  511. },
  512. {
  513. "variable": "host_path_config",
  514. "label": "Host Path Configuration",
  515. "schema": {
  516. "type": "dict",
  517. "show_if": [
  518. [
  519. "type",
  520. "=",
  521. "host_path"
  522. ]
  523. ],
  524. "attrs": [
  525. {
  526. "variable": "acl_enable",
  527. "label": "Enable ACL",
  528. "description": "Enable ACL for the storage.",
  529. "schema": {
  530. "type": "boolean",
  531. "default": false
  532. }
  533. },
  534. {
  535. "variable": "acl",
  536. "label": "ACL Configuration",
  537. "schema": {
  538. "type": "dict",
  539. "show_if": [
  540. [
  541. "acl_enable",
  542. "=",
  543. true
  544. ]
  545. ],
  546. "attrs": [],
  547. "$ref": [
  548. "normalize/acl"
  549. ]
  550. }
  551. },
  552. {
  553. "variable": "path",
  554. "label": "Host Path",
  555. "description": "The host path to use for storage.",
  556. "schema": {
  557. "type": "hostpath",
  558. "show_if": [
  559. [
  560. "acl_enable",
  561. "=",
  562. false
  563. ]
  564. ],
  565. "required": true
  566. }
  567. }
  568. ]
  569. }
  570. }
  571. ]
  572. }
  573. },
  574. {
  575. "variable": "additional_storage",
  576. "label": "Additional Storage",
  577. "schema": {
  578. "type": "list",
  579. "default": [],
  580. "items": [
  581. {
  582. "variable": "storageEntry",
  583. "label": "Storage Entry",
  584. "schema": {
  585. "type": "dict",
  586. "attrs": [
  587. {
  588. "variable": "type",
  589. "label": "Type",
  590. "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 as a volume.\n",
  591. "schema": {
  592. "type": "string",
  593. "required": true,
  594. "default": "ix_volume",
  595. "enum": [
  596. {
  597. "value": "host_path",
  598. "description": "Host Path (Path that already exists on the system)"
  599. },
  600. {
  601. "value": "ix_volume",
  602. "description": "ixVolume (Dataset created automatically by the system)"
  603. },
  604. {
  605. "value": "cifs",
  606. "description": "SMB/CIFS Share (Mounts a volume to a SMB share)"
  607. }
  608. ]
  609. }
  610. },
  611. {
  612. "variable": "read_only",
  613. "label": "Read Only",
  614. "description": "Mount the volume as read only.",
  615. "schema": {
  616. "type": "boolean",
  617. "default": false
  618. }
  619. },
  620. {
  621. "variable": "mount_path",
  622. "label": "Mount Path",
  623. "description": "The path inside the container to mount the storage.",
  624. "schema": {
  625. "type": "path",
  626. "required": true
  627. }
  628. },
  629. {
  630. "variable": "host_path_config",
  631. "label": "Host Path Configuration",
  632. "schema": {
  633. "type": "dict",
  634. "show_if": [
  635. [
  636. "type",
  637. "=",
  638. "host_path"
  639. ]
  640. ],
  641. "attrs": [
  642. {
  643. "variable": "acl_enable",
  644. "label": "Enable ACL",
  645. "description": "Enable ACL for the storage.",
  646. "schema": {
  647. "type": "boolean",
  648. "default": false
  649. }
  650. },
  651. {
  652. "variable": "acl",
  653. "label": "ACL Configuration",
  654. "schema": {
  655. "type": "dict",
  656. "show_if": [
  657. [
  658. "acl_enable",
  659. "=",
  660. true
  661. ]
  662. ],
  663. "attrs": [],
  664. "$ref": [
  665. "normalize/acl"
  666. ]
  667. }
  668. },
  669. {
  670. "variable": "path",
  671. "label": "Host Path",
  672. "description": "The host path to use for storage.",
  673. "schema": {
  674. "type": "hostpath",
  675. "show_if": [
  676. [
  677. "acl_enable",
  678. "=",
  679. false
  680. ]
  681. ],
  682. "required": true
  683. }
  684. }
  685. ]
  686. }
  687. },
  688. {
  689. "variable": "ix_volume_config",
  690. "label": "ixVolume Configuration",
  691. "description": "The configuration for the ixVolume dataset.",
  692. "schema": {
  693. "type": "dict",
  694. "show_if": [
  695. [
  696. "type",
  697. "=",
  698. "ix_volume"
  699. ]
  700. ],
  701. "$ref": [
  702. "normalize/ix_volume"
  703. ],
  704. "attrs": [
  705. {
  706. "variable": "acl_enable",
  707. "label": "Enable ACL",
  708. "description": "Enable ACL for the storage.",
  709. "schema": {
  710. "type": "boolean",
  711. "default": false
  712. }
  713. },
  714. {
  715. "variable": "dataset_name",
  716. "label": "Dataset Name",
  717. "description": "The name of the dataset to use for storage.",
  718. "schema": {
  719. "type": "string",
  720. "required": true,
  721. "default": "storage_entry"
  722. }
  723. },
  724. {
  725. "variable": "acl_entries",
  726. "label": "ACL Configuration",
  727. "schema": {
  728. "type": "dict",
  729. "show_if": [
  730. [
  731. "acl_enable",
  732. "=",
  733. true
  734. ]
  735. ],
  736. "attrs": [],
  737. "$ref": [
  738. "normalize/acl"
  739. ]
  740. }
  741. }
  742. ]
  743. }
  744. },
  745. {
  746. "variable": "cifs_config",
  747. "label": "SMB Configuration",
  748. "description": "The configuration for the SMB dataset.",
  749. "schema": {
  750. "type": "dict",
  751. "show_if": [
  752. [
  753. "type",
  754. "=",
  755. "cifs"
  756. ]
  757. ],
  758. "attrs": [
  759. {
  760. "variable": "server",
  761. "label": "Server",
  762. "description": "The server to mount the SMB share.",
  763. "schema": {
  764. "type": "string",
  765. "required": true
  766. }
  767. },
  768. {
  769. "variable": "path",
  770. "label": "Path",
  771. "description": "The path to mount the SMB share.",
  772. "schema": {
  773. "type": "string",
  774. "required": true
  775. }
  776. },
  777. {
  778. "variable": "username",
  779. "label": "Username",
  780. "description": "The username to use for the SMB share.",
  781. "schema": {
  782. "type": "string",
  783. "required": true
  784. }
  785. },
  786. {
  787. "variable": "password",
  788. "label": "Password",
  789. "description": "The password to use for the SMB share.",
  790. "schema": {
  791. "type": "string",
  792. "required": true,
  793. "private": true
  794. }
  795. },
  796. {
  797. "variable": "domain",
  798. "label": "Domain",
  799. "description": "The domain to use for the SMB share.",
  800. "schema": {
  801. "type": "string"
  802. }
  803. }
  804. ]
  805. }
  806. }
  807. ]
  808. }
  809. }
  810. ]
  811. }
  812. }
  813. ]
  814. }
  815. },
  816. {
  817. "variable": "labels",
  818. "label": "",
  819. "group": "Labels Configuration",
  820. "schema": {
  821. "type": "list",
  822. "default": [],
  823. "items": [
  824. {
  825. "variable": "label",
  826. "label": "Label",
  827. "schema": {
  828. "type": "dict",
  829. "attrs": [
  830. {
  831. "variable": "key",
  832. "label": "Key",
  833. "schema": {
  834. "type": "string",
  835. "required": true
  836. }
  837. },
  838. {
  839. "variable": "value",
  840. "label": "Value",
  841. "schema": {
  842. "type": "string",
  843. "required": true
  844. }
  845. },
  846. {
  847. "variable": "containers",
  848. "label": "Containers",
  849. "description": "Containers where the label should be applied",
  850. "schema": {
  851. "type": "list",
  852. "items": [
  853. {
  854. "variable": "container",
  855. "label": "Container",
  856. "schema": {
  857. "type": "string",
  858. "required": true,
  859. "enum": [
  860. {
  861. "value": "twofactor-auth",
  862. "description": "twofactor-auth"
  863. }
  864. ]
  865. }
  866. }
  867. ]
  868. }
  869. }
  870. ]
  871. }
  872. }
  873. ]
  874. }
  875. },
  876. {
  877. "variable": "resources",
  878. "label": "",
  879. "group": "Resources Configuration",
  880. "schema": {
  881. "type": "dict",
  882. "attrs": [
  883. {
  884. "variable": "limits",
  885. "label": "Limits",
  886. "schema": {
  887. "type": "dict",
  888. "attrs": [
  889. {
  890. "variable": "cpus",
  891. "label": "CPUs",
  892. "description": "CPUs limit for 2FAuth.",
  893. "schema": {
  894. "type": "int",
  895. "default": 2,
  896. "required": true
  897. }
  898. },
  899. {
  900. "variable": "memory",
  901. "label": "Memory (in MB)",
  902. "description": "Memory limit for 2FAuth.",
  903. "schema": {
  904. "type": "int",
  905. "default": 4096,
  906. "required": true
  907. }
  908. }
  909. ]
  910. }
  911. }
  912. ]
  913. }
  914. }
  915. ]
  916. },
  917. "readme": "<h1>2FAuth</h1> <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>",
  918. "changelog": null,
  919. "chart_metadata": {
  920. "annotations": {
  921. "min_scale_version": "24.10.2.2"
  922. },
  923. "app_version": "5.6.0",
  924. "capabilities": [],
  925. "categories": [
  926. "security"
  927. ],
  928. "changelog_url": "https://github.com/Bubka/2FAuth/blob/master/changelog.md",
  929. "date_added": "2024-09-18",
  930. "description": "2FAuth is a web based self-hosted alternative to One Time Passcode (OTP) generators like Google Authenticator, designed for both mobile and desktop.",
  931. "home": "https://docs.2fauth.app/",
  932. "host_mounts": [],
  933. "icon": "https://media.sys.truenas.net/apps/twofactor-auth/icons/icon.png",
  934. "keywords": [
  935. "security",
  936. "2fa",
  937. "otp"
  938. ],
  939. "lib_version": "2.1.49",
  940. "lib_version_hash": "e71e6b0122c9446fa5ea6fb07e7eb01b11fb42d549a19845426bbd7e21a42634",
  941. "maintainers": [
  942. {
  943. "email": "dev@ixsystems.com",
  944. "name": "truenas",
  945. "url": "https://www.truenas.com/"
  946. }
  947. ],
  948. "name": "twofactor-auth",
  949. "run_as_context": [
  950. {
  951. "description": "2FAuth runs as non-root user.",
  952. "gid": 1000,
  953. "group_name": "2fauth",
  954. "uid": 1000,
  955. "user_name": "2fauth"
  956. }
  957. ],
  958. "screenshots": [
  959. "https://media.sys.truenas.net/apps/twofactor-auth/screenshots/screenshot1.png"
  960. ],
  961. "sources": [
  962. "https://github.com/Bubka/2FAuth",
  963. "https://hub.docker.com/r/2fauth/2fauth/"
  964. ],
  965. "title": "2FAuth",
  966. "train": "community",
  967. "version": "1.2.7"
  968. }
  969. }
  970. }