app_versions.json 100 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584
  1. {
  2. "1.0.15": {
  3. "healthy": true,
  4. "supported": true,
  5. "healthy_error": null,
  6. "location": "/__w/apps/apps/trains/community/crafty-4/1.0.15",
  7. "last_update": "2025-09-03 12:56:43",
  8. "required_features": [],
  9. "human_version": "4.5.3_1.0.15",
  10. "version": "1.0.15",
  11. "app_metadata": {
  12. "app_version": "4.5.3",
  13. "capabilities": [],
  14. "categories": [
  15. "games"
  16. ],
  17. "changelog_url": "https://gitlab.com/crafty-controller/crafty-4/-/releases",
  18. "date_added": "2025-04-04",
  19. "description": "Crafty 4 is the next iteration of our Minecraft Server Wrapper/Controller/Launcher",
  20. "home": "https://craftycontrol.com/",
  21. "host_mounts": [],
  22. "icon": "https://media.sys.truenas.net/apps/crafty-4/icons/icon.png",
  23. "keywords": [
  24. "minecraft",
  25. "crafty"
  26. ],
  27. "lib_version": "2.1.49",
  28. "lib_version_hash": "e71e6b0122c9446fa5ea6fb07e7eb01b11fb42d549a19845426bbd7e21a42634",
  29. "maintainers": [
  30. {
  31. "email": "dev@ixsystems.com",
  32. "name": "truenas",
  33. "url": "https://www.truenas.com/"
  34. }
  35. ],
  36. "name": "crafty-4",
  37. "run_as_context": [
  38. {
  39. "description": "Crafty 4 runs as non-root user.",
  40. "gid": 1000,
  41. "group_name": "crafty",
  42. "uid": 1000,
  43. "user_name": "crafty"
  44. }
  45. ],
  46. "screenshots": [],
  47. "sources": [
  48. "https://gitlab.com/crafty-controller/crafty-4"
  49. ],
  50. "title": "Crafty 4",
  51. "train": "community",
  52. "version": "1.0.15"
  53. },
  54. "schema": {
  55. "groups": [
  56. {
  57. "name": "Crafty 4 Configuration",
  58. "description": "Configure Crafty 4"
  59. },
  60. {
  61. "name": "Network Configuration",
  62. "description": "Configure Network for Crafty 4"
  63. },
  64. {
  65. "name": "Storage Configuration",
  66. "description": "Configure Storage for Crafty 4"
  67. },
  68. {
  69. "name": "Labels Configuration",
  70. "description": "Configure Labels for Crafty 4"
  71. },
  72. {
  73. "name": "Resources Configuration",
  74. "description": "Configure Resources for Crafty 4"
  75. }
  76. ],
  77. "questions": [
  78. {
  79. "variable": "TZ",
  80. "group": "Crafty 4 Configuration",
  81. "label": "Timezone",
  82. "schema": {
  83. "type": "string",
  84. "default": "Etc/UTC",
  85. "required": true,
  86. "$ref": [
  87. "definitions/timezone"
  88. ]
  89. }
  90. },
  91. {
  92. "variable": "crafty",
  93. "label": "",
  94. "group": "Crafty 4 Configuration",
  95. "schema": {
  96. "type": "dict",
  97. "attrs": [
  98. {
  99. "variable": "additional_envs",
  100. "label": "Additional Environment Variables",
  101. "schema": {
  102. "type": "list",
  103. "default": [],
  104. "items": [
  105. {
  106. "variable": "env",
  107. "label": "Environment Variable",
  108. "schema": {
  109. "type": "dict",
  110. "attrs": [
  111. {
  112. "variable": "name",
  113. "label": "Name",
  114. "schema": {
  115. "type": "string",
  116. "required": true
  117. }
  118. },
  119. {
  120. "variable": "value",
  121. "label": "Value",
  122. "schema": {
  123. "type": "string"
  124. }
  125. }
  126. ]
  127. }
  128. }
  129. ]
  130. }
  131. }
  132. ]
  133. }
  134. },
  135. {
  136. "variable": "network",
  137. "label": "",
  138. "group": "Network Configuration",
  139. "schema": {
  140. "type": "dict",
  141. "attrs": [
  142. {
  143. "variable": "web_port",
  144. "label": "WebUI Port",
  145. "schema": {
  146. "type": "dict",
  147. "show_if": [
  148. [
  149. "host_network",
  150. "=",
  151. false
  152. ]
  153. ],
  154. "attrs": [
  155. {
  156. "variable": "bind_mode",
  157. "label": "Port Bind Mode",
  158. "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",
  159. "schema": {
  160. "type": "string",
  161. "default": "published",
  162. "enum": [
  163. {
  164. "value": "published",
  165. "description": "Publish port on the host for external access"
  166. },
  167. {
  168. "value": "exposed",
  169. "description": "Expose port for inter-container communication"
  170. },
  171. {
  172. "value": "",
  173. "description": "None"
  174. }
  175. ]
  176. }
  177. },
  178. {
  179. "variable": "port_number",
  180. "label": "Port Number",
  181. "schema": {
  182. "type": "int",
  183. "default": 30146,
  184. "show_if": [
  185. [
  186. "bind_mode",
  187. "=",
  188. "published"
  189. ]
  190. ],
  191. "min": 1,
  192. "max": 65535,
  193. "required": true
  194. }
  195. },
  196. {
  197. "variable": "host_ips",
  198. "label": "Host IPs",
  199. "description": "IPs on the host to bind this port",
  200. "schema": {
  201. "type": "list",
  202. "show_if": [
  203. [
  204. "bind_mode",
  205. "=",
  206. "published"
  207. ]
  208. ],
  209. "default": [],
  210. "items": [
  211. {
  212. "variable": "host_ip",
  213. "label": "Host IP",
  214. "schema": {
  215. "type": "string",
  216. "required": true,
  217. "$ref": [
  218. "definitions/node_bind_ip"
  219. ]
  220. }
  221. }
  222. ]
  223. }
  224. }
  225. ]
  226. }
  227. },
  228. {
  229. "variable": "additional_ports",
  230. "label": "Additional Ports",
  231. "schema": {
  232. "type": "list",
  233. "show_if": [
  234. [
  235. "host_network",
  236. "=",
  237. false
  238. ]
  239. ],
  240. "items": [
  241. {
  242. "variable": "port",
  243. "label": "Port",
  244. "schema": {
  245. "type": "dict",
  246. "attrs": [
  247. {
  248. "variable": "bind_mode",
  249. "label": "Port Bind Mode",
  250. "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",
  251. "schema": {
  252. "type": "string",
  253. "default": "published",
  254. "enum": [
  255. {
  256. "value": "published",
  257. "description": "Publish port on the host for external access"
  258. },
  259. {
  260. "value": "exposed",
  261. "description": "Expose port for inter-container communication"
  262. }
  263. ]
  264. }
  265. },
  266. {
  267. "variable": "port_number",
  268. "label": "Port Number",
  269. "schema": {
  270. "type": "int",
  271. "min": 1,
  272. "max": 65535,
  273. "required": true
  274. }
  275. },
  276. {
  277. "variable": "container_port",
  278. "label": "Container Port",
  279. "schema": {
  280. "type": "int",
  281. "min": 1,
  282. "max": 65535,
  283. "required": true
  284. }
  285. },
  286. {
  287. "variable": "protocol",
  288. "label": "Protocol",
  289. "schema": {
  290. "type": "string",
  291. "required": true,
  292. "default": "tcp",
  293. "enum": [
  294. {
  295. "value": "tcp",
  296. "description": "TCP"
  297. },
  298. {
  299. "value": "udp",
  300. "description": "UDP"
  301. }
  302. ]
  303. }
  304. },
  305. {
  306. "variable": "host_ips",
  307. "label": "Host IPs",
  308. "description": "IPs on the host to bind this port",
  309. "schema": {
  310. "type": "list",
  311. "show_if": [
  312. [
  313. "bind_mode",
  314. "=",
  315. "published"
  316. ]
  317. ],
  318. "default": [],
  319. "items": [
  320. {
  321. "variable": "host_ip",
  322. "label": "Host IP",
  323. "schema": {
  324. "type": "string",
  325. "required": true,
  326. "$ref": [
  327. "definitions/node_bind_ip"
  328. ]
  329. }
  330. }
  331. ]
  332. }
  333. }
  334. ]
  335. }
  336. }
  337. ]
  338. }
  339. },
  340. {
  341. "variable": "additional_port_ranges",
  342. "label": "Additional Port Ranges",
  343. "description": "Additional port ranges for SFTPGo.",
  344. "schema": {
  345. "type": "list",
  346. "default": [],
  347. "show_if": [
  348. [
  349. "host_network",
  350. "=",
  351. false
  352. ]
  353. ],
  354. "items": [
  355. {
  356. "variable": "port_range",
  357. "label": "Port Range",
  358. "schema": {
  359. "type": "dict",
  360. "attrs": [
  361. {
  362. "variable": "bind_mode",
  363. "label": "Port Bind Mode",
  364. "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",
  365. "schema": {
  366. "type": "string",
  367. "default": "published",
  368. "enum": [
  369. {
  370. "value": "published",
  371. "description": "Publish port on the host for external access"
  372. },
  373. {
  374. "value": "exposed",
  375. "description": "Expose port for inter-container communication"
  376. }
  377. ]
  378. }
  379. },
  380. {
  381. "variable": "protocol",
  382. "label": "Protocol",
  383. "schema": {
  384. "type": "string",
  385. "required": true,
  386. "default": "tcp",
  387. "enum": [
  388. {
  389. "value": "tcp",
  390. "description": "TCP"
  391. },
  392. {
  393. "value": "udp",
  394. "description": "UDP"
  395. }
  396. ]
  397. }
  398. },
  399. {
  400. "variable": "start",
  401. "label": "Start",
  402. "description": "The start of the range.",
  403. "schema": {
  404. "type": "int",
  405. "min": 1,
  406. "max": 65535,
  407. "required": true
  408. }
  409. },
  410. {
  411. "variable": "end",
  412. "label": "End",
  413. "description": "The end of the range.",
  414. "schema": {
  415. "type": "int",
  416. "min": 1,
  417. "max": 65535,
  418. "required": true
  419. }
  420. },
  421. {
  422. "variable": "host_ips",
  423. "label": "Host IPs",
  424. "description": "IPs on the host to bind this port",
  425. "schema": {
  426. "type": "list",
  427. "show_if": [
  428. [
  429. "bind_mode",
  430. "=",
  431. "published"
  432. ]
  433. ],
  434. "default": [],
  435. "items": [
  436. {
  437. "variable": "host_ip",
  438. "label": "Host IP",
  439. "schema": {
  440. "type": "string",
  441. "required": true,
  442. "$ref": [
  443. "definitions/node_bind_ip"
  444. ]
  445. }
  446. }
  447. ]
  448. }
  449. }
  450. ]
  451. }
  452. }
  453. ]
  454. }
  455. },
  456. {
  457. "variable": "host_network",
  458. "label": "Host Network",
  459. "description": "Bind to the host network. It's recommended to keep this disabled.\n",
  460. "schema": {
  461. "type": "boolean",
  462. "default": false
  463. }
  464. }
  465. ]
  466. }
  467. },
  468. {
  469. "variable": "storage",
  470. "label": "",
  471. "group": "Storage Configuration",
  472. "schema": {
  473. "type": "dict",
  474. "attrs": [
  475. {
  476. "variable": "config",
  477. "label": "Crafty 4 Config Storage",
  478. "description": "The path to store Crafty 4 Config.",
  479. "schema": {
  480. "type": "dict",
  481. "attrs": [
  482. {
  483. "variable": "type",
  484. "label": "Type",
  485. "description": "ixVolume: Is dataset created automatically by the system.</br>\nHost Path: Is a path that already exists on the system.\n",
  486. "schema": {
  487. "type": "string",
  488. "required": true,
  489. "default": "ix_volume",
  490. "enum": [
  491. {
  492. "value": "host_path",
  493. "description": "Host Path (Path that already exists on the system)"
  494. },
  495. {
  496. "value": "ix_volume",
  497. "description": "ixVolume (Dataset created automatically by the system)"
  498. }
  499. ]
  500. }
  501. },
  502. {
  503. "variable": "ix_volume_config",
  504. "label": "ixVolume Configuration",
  505. "description": "The configuration for the ixVolume dataset.",
  506. "schema": {
  507. "type": "dict",
  508. "show_if": [
  509. [
  510. "type",
  511. "=",
  512. "ix_volume"
  513. ]
  514. ],
  515. "$ref": [
  516. "normalize/ix_volume"
  517. ],
  518. "attrs": [
  519. {
  520. "variable": "acl_enable",
  521. "label": "Enable ACL",
  522. "description": "Enable ACL for the storage.",
  523. "schema": {
  524. "type": "boolean",
  525. "default": false
  526. }
  527. },
  528. {
  529. "variable": "dataset_name",
  530. "label": "Dataset Name",
  531. "description": "The name of the dataset to use for storage.",
  532. "schema": {
  533. "type": "string",
  534. "required": true,
  535. "hidden": true,
  536. "default": "config"
  537. }
  538. },
  539. {
  540. "variable": "acl_entries",
  541. "label": "ACL Configuration",
  542. "schema": {
  543. "type": "dict",
  544. "show_if": [
  545. [
  546. "acl_enable",
  547. "=",
  548. true
  549. ]
  550. ],
  551. "attrs": []
  552. }
  553. }
  554. ]
  555. }
  556. },
  557. {
  558. "variable": "host_path_config",
  559. "label": "Host Path Configuration",
  560. "schema": {
  561. "type": "dict",
  562. "show_if": [
  563. [
  564. "type",
  565. "=",
  566. "host_path"
  567. ]
  568. ],
  569. "attrs": [
  570. {
  571. "variable": "acl_enable",
  572. "label": "Enable ACL",
  573. "description": "Enable ACL for the storage.",
  574. "schema": {
  575. "type": "boolean",
  576. "default": false
  577. }
  578. },
  579. {
  580. "variable": "acl",
  581. "label": "ACL Configuration",
  582. "schema": {
  583. "type": "dict",
  584. "show_if": [
  585. [
  586. "acl_enable",
  587. "=",
  588. true
  589. ]
  590. ],
  591. "attrs": [],
  592. "$ref": [
  593. "normalize/acl"
  594. ]
  595. }
  596. },
  597. {
  598. "variable": "path",
  599. "label": "Host Path",
  600. "description": "The host path to use for storage.",
  601. "schema": {
  602. "type": "hostpath",
  603. "show_if": [
  604. [
  605. "acl_enable",
  606. "=",
  607. false
  608. ]
  609. ],
  610. "required": true
  611. }
  612. }
  613. ]
  614. }
  615. }
  616. ]
  617. }
  618. },
  619. {
  620. "variable": "servers",
  621. "label": "Crafty 4 Servers Storage",
  622. "description": "The path to store Crafty 4 Servers.",
  623. "schema": {
  624. "type": "dict",
  625. "attrs": [
  626. {
  627. "variable": "type",
  628. "label": "Type",
  629. "description": "ixVolume: Is dataset created automatically by the system.</br>\nHost Path: Is a path that already exists on the system.\n",
  630. "schema": {
  631. "type": "string",
  632. "required": true,
  633. "default": "ix_volume",
  634. "enum": [
  635. {
  636. "value": "host_path",
  637. "description": "Host Path (Path that already exists on the system)"
  638. },
  639. {
  640. "value": "ix_volume",
  641. "description": "ixVolume (Dataset created automatically by the system)"
  642. }
  643. ]
  644. }
  645. },
  646. {
  647. "variable": "ix_volume_config",
  648. "label": "ixVolume Configuration",
  649. "description": "The configuration for the ixVolume dataset.",
  650. "schema": {
  651. "type": "dict",
  652. "show_if": [
  653. [
  654. "type",
  655. "=",
  656. "ix_volume"
  657. ]
  658. ],
  659. "$ref": [
  660. "normalize/ix_volume"
  661. ],
  662. "attrs": [
  663. {
  664. "variable": "acl_enable",
  665. "label": "Enable ACL",
  666. "description": "Enable ACL for the storage.",
  667. "schema": {
  668. "type": "boolean",
  669. "default": false
  670. }
  671. },
  672. {
  673. "variable": "dataset_name",
  674. "label": "Dataset Name",
  675. "description": "The name of the dataset to use for storage.",
  676. "schema": {
  677. "type": "string",
  678. "required": true,
  679. "hidden": true,
  680. "default": "servers"
  681. }
  682. },
  683. {
  684. "variable": "acl_entries",
  685. "label": "ACL Configuration",
  686. "schema": {
  687. "type": "dict",
  688. "show_if": [
  689. [
  690. "acl_enable",
  691. "=",
  692. true
  693. ]
  694. ],
  695. "attrs": []
  696. }
  697. }
  698. ]
  699. }
  700. },
  701. {
  702. "variable": "host_path_config",
  703. "label": "Host Path Configuration",
  704. "schema": {
  705. "type": "dict",
  706. "show_if": [
  707. [
  708. "type",
  709. "=",
  710. "host_path"
  711. ]
  712. ],
  713. "attrs": [
  714. {
  715. "variable": "acl_enable",
  716. "label": "Enable ACL",
  717. "description": "Enable ACL for the storage.",
  718. "schema": {
  719. "type": "boolean",
  720. "default": false
  721. }
  722. },
  723. {
  724. "variable": "acl",
  725. "label": "ACL Configuration",
  726. "schema": {
  727. "type": "dict",
  728. "show_if": [
  729. [
  730. "acl_enable",
  731. "=",
  732. true
  733. ]
  734. ],
  735. "attrs": [],
  736. "$ref": [
  737. "normalize/acl"
  738. ]
  739. }
  740. },
  741. {
  742. "variable": "path",
  743. "label": "Host Path",
  744. "description": "The host path to use for storage.",
  745. "schema": {
  746. "type": "hostpath",
  747. "show_if": [
  748. [
  749. "acl_enable",
  750. "=",
  751. false
  752. ]
  753. ],
  754. "required": true
  755. }
  756. }
  757. ]
  758. }
  759. }
  760. ]
  761. }
  762. },
  763. {
  764. "variable": "logs",
  765. "label": "Crafty 4 Logs Storage",
  766. "description": "The path to store Crafty 4 Logs.",
  767. "schema": {
  768. "type": "dict",
  769. "attrs": [
  770. {
  771. "variable": "type",
  772. "label": "Type",
  773. "description": "ixVolume: Is dataset created automatically by the system.</br>\nHost Path: Is a path that already exists on the system.\n",
  774. "schema": {
  775. "type": "string",
  776. "required": true,
  777. "default": "ix_volume",
  778. "enum": [
  779. {
  780. "value": "host_path",
  781. "description": "Host Path (Path that already exists on the system)"
  782. },
  783. {
  784. "value": "ix_volume",
  785. "description": "ixVolume (Dataset created automatically by the system)"
  786. }
  787. ]
  788. }
  789. },
  790. {
  791. "variable": "ix_volume_config",
  792. "label": "ixVolume Configuration",
  793. "description": "The configuration for the ixVolume dataset.",
  794. "schema": {
  795. "type": "dict",
  796. "show_if": [
  797. [
  798. "type",
  799. "=",
  800. "ix_volume"
  801. ]
  802. ],
  803. "$ref": [
  804. "normalize/ix_volume"
  805. ],
  806. "attrs": [
  807. {
  808. "variable": "acl_enable",
  809. "label": "Enable ACL",
  810. "description": "Enable ACL for the storage.",
  811. "schema": {
  812. "type": "boolean",
  813. "default": false
  814. }
  815. },
  816. {
  817. "variable": "dataset_name",
  818. "label": "Dataset Name",
  819. "description": "The name of the dataset to use for storage.",
  820. "schema": {
  821. "type": "string",
  822. "required": true,
  823. "hidden": true,
  824. "default": "logs"
  825. }
  826. },
  827. {
  828. "variable": "acl_entries",
  829. "label": "ACL Configuration",
  830. "schema": {
  831. "type": "dict",
  832. "show_if": [
  833. [
  834. "acl_enable",
  835. "=",
  836. true
  837. ]
  838. ],
  839. "attrs": []
  840. }
  841. }
  842. ]
  843. }
  844. },
  845. {
  846. "variable": "host_path_config",
  847. "label": "Host Path Configuration",
  848. "schema": {
  849. "type": "dict",
  850. "show_if": [
  851. [
  852. "type",
  853. "=",
  854. "host_path"
  855. ]
  856. ],
  857. "attrs": [
  858. {
  859. "variable": "acl_enable",
  860. "label": "Enable ACL",
  861. "description": "Enable ACL for the storage.",
  862. "schema": {
  863. "type": "boolean",
  864. "default": false
  865. }
  866. },
  867. {
  868. "variable": "acl",
  869. "label": "ACL Configuration",
  870. "schema": {
  871. "type": "dict",
  872. "show_if": [
  873. [
  874. "acl_enable",
  875. "=",
  876. true
  877. ]
  878. ],
  879. "attrs": [],
  880. "$ref": [
  881. "normalize/acl"
  882. ]
  883. }
  884. },
  885. {
  886. "variable": "path",
  887. "label": "Host Path",
  888. "description": "The host path to use for storage.",
  889. "schema": {
  890. "type": "hostpath",
  891. "show_if": [
  892. [
  893. "acl_enable",
  894. "=",
  895. false
  896. ]
  897. ],
  898. "required": true
  899. }
  900. }
  901. ]
  902. }
  903. }
  904. ]
  905. }
  906. },
  907. {
  908. "variable": "backups",
  909. "label": "Crafty 4 Backups Storage",
  910. "description": "The path to store Crafty 4 Backups.",
  911. "schema": {
  912. "type": "dict",
  913. "attrs": [
  914. {
  915. "variable": "type",
  916. "label": "Type",
  917. "description": "ixVolume: Is dataset created automatically by the system.</br>\nHost Path: Is a path that already exists on the system.\n",
  918. "schema": {
  919. "type": "string",
  920. "required": true,
  921. "default": "ix_volume",
  922. "enum": [
  923. {
  924. "value": "host_path",
  925. "description": "Host Path (Path that already exists on the system)"
  926. },
  927. {
  928. "value": "ix_volume",
  929. "description": "ixVolume (Dataset created automatically by the system)"
  930. }
  931. ]
  932. }
  933. },
  934. {
  935. "variable": "ix_volume_config",
  936. "label": "ixVolume Configuration",
  937. "description": "The configuration for the ixVolume dataset.",
  938. "schema": {
  939. "type": "dict",
  940. "show_if": [
  941. [
  942. "type",
  943. "=",
  944. "ix_volume"
  945. ]
  946. ],
  947. "$ref": [
  948. "normalize/ix_volume"
  949. ],
  950. "attrs": [
  951. {
  952. "variable": "acl_enable",
  953. "label": "Enable ACL",
  954. "description": "Enable ACL for the storage.",
  955. "schema": {
  956. "type": "boolean",
  957. "default": false
  958. }
  959. },
  960. {
  961. "variable": "dataset_name",
  962. "label": "Dataset Name",
  963. "description": "The name of the dataset to use for storage.",
  964. "schema": {
  965. "type": "string",
  966. "required": true,
  967. "hidden": true,
  968. "default": "backups"
  969. }
  970. },
  971. {
  972. "variable": "acl_entries",
  973. "label": "ACL Configuration",
  974. "schema": {
  975. "type": "dict",
  976. "show_if": [
  977. [
  978. "acl_enable",
  979. "=",
  980. true
  981. ]
  982. ],
  983. "attrs": []
  984. }
  985. }
  986. ]
  987. }
  988. },
  989. {
  990. "variable": "host_path_config",
  991. "label": "Host Path Configuration",
  992. "schema": {
  993. "type": "dict",
  994. "show_if": [
  995. [
  996. "type",
  997. "=",
  998. "host_path"
  999. ]
  1000. ],
  1001. "attrs": [
  1002. {
  1003. "variable": "acl_enable",
  1004. "label": "Enable ACL",
  1005. "description": "Enable ACL for the storage.",
  1006. "schema": {
  1007. "type": "boolean",
  1008. "default": false
  1009. }
  1010. },
  1011. {
  1012. "variable": "acl",
  1013. "label": "ACL Configuration",
  1014. "schema": {
  1015. "type": "dict",
  1016. "show_if": [
  1017. [
  1018. "acl_enable",
  1019. "=",
  1020. true
  1021. ]
  1022. ],
  1023. "attrs": [],
  1024. "$ref": [
  1025. "normalize/acl"
  1026. ]
  1027. }
  1028. },
  1029. {
  1030. "variable": "path",
  1031. "label": "Host Path",
  1032. "description": "The host path to use for storage.",
  1033. "schema": {
  1034. "type": "hostpath",
  1035. "show_if": [
  1036. [
  1037. "acl_enable",
  1038. "=",
  1039. false
  1040. ]
  1041. ],
  1042. "required": true
  1043. }
  1044. }
  1045. ]
  1046. }
  1047. }
  1048. ]
  1049. }
  1050. },
  1051. {
  1052. "variable": "import",
  1053. "label": "Crafty 4 Import Storage",
  1054. "description": "The path to store Crafty 4 Import.",
  1055. "schema": {
  1056. "type": "dict",
  1057. "attrs": [
  1058. {
  1059. "variable": "type",
  1060. "label": "Type",
  1061. "description": "ixVolume: Is dataset created automatically by the system.</br>\nHost Path: Is a path that already exists on the system.\n",
  1062. "schema": {
  1063. "type": "string",
  1064. "required": true,
  1065. "default": "ix_volume",
  1066. "enum": [
  1067. {
  1068. "value": "host_path",
  1069. "description": "Host Path (Path that already exists on the system)"
  1070. },
  1071. {
  1072. "value": "ix_volume",
  1073. "description": "ixVolume (Dataset created automatically by the system)"
  1074. }
  1075. ]
  1076. }
  1077. },
  1078. {
  1079. "variable": "ix_volume_config",
  1080. "label": "ixVolume Configuration",
  1081. "description": "The configuration for the ixVolume dataset.",
  1082. "schema": {
  1083. "type": "dict",
  1084. "show_if": [
  1085. [
  1086. "type",
  1087. "=",
  1088. "ix_volume"
  1089. ]
  1090. ],
  1091. "$ref": [
  1092. "normalize/ix_volume"
  1093. ],
  1094. "attrs": [
  1095. {
  1096. "variable": "acl_enable",
  1097. "label": "Enable ACL",
  1098. "description": "Enable ACL for the storage.",
  1099. "schema": {
  1100. "type": "boolean",
  1101. "default": false
  1102. }
  1103. },
  1104. {
  1105. "variable": "dataset_name",
  1106. "label": "Dataset Name",
  1107. "description": "The name of the dataset to use for storage.",
  1108. "schema": {
  1109. "type": "string",
  1110. "required": true,
  1111. "hidden": true,
  1112. "default": "import"
  1113. }
  1114. },
  1115. {
  1116. "variable": "acl_entries",
  1117. "label": "ACL Configuration",
  1118. "schema": {
  1119. "type": "dict",
  1120. "show_if": [
  1121. [
  1122. "acl_enable",
  1123. "=",
  1124. true
  1125. ]
  1126. ],
  1127. "attrs": []
  1128. }
  1129. }
  1130. ]
  1131. }
  1132. },
  1133. {
  1134. "variable": "host_path_config",
  1135. "label": "Host Path Configuration",
  1136. "schema": {
  1137. "type": "dict",
  1138. "show_if": [
  1139. [
  1140. "type",
  1141. "=",
  1142. "host_path"
  1143. ]
  1144. ],
  1145. "attrs": [
  1146. {
  1147. "variable": "acl_enable",
  1148. "label": "Enable ACL",
  1149. "description": "Enable ACL for the storage.",
  1150. "schema": {
  1151. "type": "boolean",
  1152. "default": false
  1153. }
  1154. },
  1155. {
  1156. "variable": "acl",
  1157. "label": "ACL Configuration",
  1158. "schema": {
  1159. "type": "dict",
  1160. "show_if": [
  1161. [
  1162. "acl_enable",
  1163. "=",
  1164. true
  1165. ]
  1166. ],
  1167. "attrs": [],
  1168. "$ref": [
  1169. "normalize/acl"
  1170. ]
  1171. }
  1172. },
  1173. {
  1174. "variable": "path",
  1175. "label": "Host Path",
  1176. "description": "The host path to use for storage.",
  1177. "schema": {
  1178. "type": "hostpath",
  1179. "show_if": [
  1180. [
  1181. "acl_enable",
  1182. "=",
  1183. false
  1184. ]
  1185. ],
  1186. "required": true
  1187. }
  1188. }
  1189. ]
  1190. }
  1191. }
  1192. ]
  1193. }
  1194. },
  1195. {
  1196. "variable": "additional_storage",
  1197. "label": "Additional Storage",
  1198. "schema": {
  1199. "type": "list",
  1200. "default": [],
  1201. "items": [
  1202. {
  1203. "variable": "storageEntry",
  1204. "label": "Storage Entry",
  1205. "schema": {
  1206. "type": "dict",
  1207. "attrs": [
  1208. {
  1209. "variable": "type",
  1210. "label": "Type",
  1211. "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",
  1212. "schema": {
  1213. "type": "string",
  1214. "required": true,
  1215. "default": "ix_volume",
  1216. "enum": [
  1217. {
  1218. "value": "host_path",
  1219. "description": "Host Path (Path that already exists on the system)"
  1220. },
  1221. {
  1222. "value": "ix_volume",
  1223. "description": "ixVolume (Dataset created automatically by the system)"
  1224. },
  1225. {
  1226. "value": "cifs",
  1227. "description": "SMB/CIFS Share (Mounts a volume to a SMB share)"
  1228. }
  1229. ]
  1230. }
  1231. },
  1232. {
  1233. "variable": "read_only",
  1234. "label": "Read Only",
  1235. "description": "Mount the volume as read only.",
  1236. "schema": {
  1237. "type": "boolean",
  1238. "default": false
  1239. }
  1240. },
  1241. {
  1242. "variable": "mount_path",
  1243. "label": "Mount Path",
  1244. "description": "The path inside the container to mount the storage.",
  1245. "schema": {
  1246. "type": "path",
  1247. "required": true
  1248. }
  1249. },
  1250. {
  1251. "variable": "host_path_config",
  1252. "label": "Host Path Configuration",
  1253. "schema": {
  1254. "type": "dict",
  1255. "show_if": [
  1256. [
  1257. "type",
  1258. "=",
  1259. "host_path"
  1260. ]
  1261. ],
  1262. "attrs": [
  1263. {
  1264. "variable": "acl_enable",
  1265. "label": "Enable ACL",
  1266. "description": "Enable ACL for the storage.",
  1267. "schema": {
  1268. "type": "boolean",
  1269. "default": false
  1270. }
  1271. },
  1272. {
  1273. "variable": "acl",
  1274. "label": "ACL Configuration",
  1275. "schema": {
  1276. "type": "dict",
  1277. "show_if": [
  1278. [
  1279. "acl_enable",
  1280. "=",
  1281. true
  1282. ]
  1283. ],
  1284. "attrs": [],
  1285. "$ref": [
  1286. "normalize/acl"
  1287. ]
  1288. }
  1289. },
  1290. {
  1291. "variable": "path",
  1292. "label": "Host Path",
  1293. "description": "The host path to use for storage.",
  1294. "schema": {
  1295. "type": "hostpath",
  1296. "show_if": [
  1297. [
  1298. "acl_enable",
  1299. "=",
  1300. false
  1301. ]
  1302. ],
  1303. "required": true
  1304. }
  1305. }
  1306. ]
  1307. }
  1308. },
  1309. {
  1310. "variable": "ix_volume_config",
  1311. "label": "ixVolume Configuration",
  1312. "description": "The configuration for the ixVolume dataset.",
  1313. "schema": {
  1314. "type": "dict",
  1315. "show_if": [
  1316. [
  1317. "type",
  1318. "=",
  1319. "ix_volume"
  1320. ]
  1321. ],
  1322. "$ref": [
  1323. "normalize/ix_volume"
  1324. ],
  1325. "attrs": [
  1326. {
  1327. "variable": "acl_enable",
  1328. "label": "Enable ACL",
  1329. "description": "Enable ACL for the storage.",
  1330. "schema": {
  1331. "type": "boolean",
  1332. "default": false
  1333. }
  1334. },
  1335. {
  1336. "variable": "dataset_name",
  1337. "label": "Dataset Name",
  1338. "description": "The name of the dataset to use for storage.",
  1339. "schema": {
  1340. "type": "string",
  1341. "required": true,
  1342. "default": "storage_entry"
  1343. }
  1344. },
  1345. {
  1346. "variable": "acl_entries",
  1347. "label": "ACL Configuration",
  1348. "schema": {
  1349. "type": "dict",
  1350. "show_if": [
  1351. [
  1352. "acl_enable",
  1353. "=",
  1354. true
  1355. ]
  1356. ],
  1357. "attrs": [],
  1358. "$ref": [
  1359. "normalize/acl"
  1360. ]
  1361. }
  1362. }
  1363. ]
  1364. }
  1365. },
  1366. {
  1367. "variable": "cifs_config",
  1368. "label": "SMB Configuration",
  1369. "description": "The configuration for the SMB dataset.",
  1370. "schema": {
  1371. "type": "dict",
  1372. "show_if": [
  1373. [
  1374. "type",
  1375. "=",
  1376. "cifs"
  1377. ]
  1378. ],
  1379. "attrs": [
  1380. {
  1381. "variable": "server",
  1382. "label": "Server",
  1383. "description": "The server to mount the SMB share.",
  1384. "schema": {
  1385. "type": "string",
  1386. "required": true
  1387. }
  1388. },
  1389. {
  1390. "variable": "path",
  1391. "label": "Path",
  1392. "description": "The path to mount the SMB share.",
  1393. "schema": {
  1394. "type": "string",
  1395. "required": true
  1396. }
  1397. },
  1398. {
  1399. "variable": "username",
  1400. "label": "Username",
  1401. "description": "The username to use for the SMB share.",
  1402. "schema": {
  1403. "type": "string",
  1404. "required": true
  1405. }
  1406. },
  1407. {
  1408. "variable": "password",
  1409. "label": "Password",
  1410. "description": "The password to use for the SMB share.",
  1411. "schema": {
  1412. "type": "string",
  1413. "required": true,
  1414. "private": true
  1415. }
  1416. },
  1417. {
  1418. "variable": "domain",
  1419. "label": "Domain",
  1420. "description": "The domain to use for the SMB share.",
  1421. "schema": {
  1422. "type": "string"
  1423. }
  1424. }
  1425. ]
  1426. }
  1427. }
  1428. ]
  1429. }
  1430. }
  1431. ]
  1432. }
  1433. }
  1434. ]
  1435. }
  1436. },
  1437. {
  1438. "variable": "labels",
  1439. "label": "",
  1440. "group": "Labels Configuration",
  1441. "schema": {
  1442. "type": "list",
  1443. "default": [],
  1444. "items": [
  1445. {
  1446. "variable": "label",
  1447. "label": "Label",
  1448. "schema": {
  1449. "type": "dict",
  1450. "attrs": [
  1451. {
  1452. "variable": "key",
  1453. "label": "Key",
  1454. "schema": {
  1455. "type": "string",
  1456. "required": true
  1457. }
  1458. },
  1459. {
  1460. "variable": "value",
  1461. "label": "Value",
  1462. "schema": {
  1463. "type": "string",
  1464. "required": true
  1465. }
  1466. },
  1467. {
  1468. "variable": "containers",
  1469. "label": "Containers",
  1470. "description": "Containers where the label should be applied",
  1471. "schema": {
  1472. "type": "list",
  1473. "items": [
  1474. {
  1475. "variable": "container",
  1476. "label": "Container",
  1477. "schema": {
  1478. "type": "string",
  1479. "required": true,
  1480. "enum": [
  1481. {
  1482. "value": "crafty-4",
  1483. "description": "crafty-4"
  1484. }
  1485. ]
  1486. }
  1487. }
  1488. ]
  1489. }
  1490. }
  1491. ]
  1492. }
  1493. }
  1494. ]
  1495. }
  1496. },
  1497. {
  1498. "variable": "resources",
  1499. "label": "",
  1500. "group": "Resources Configuration",
  1501. "schema": {
  1502. "type": "dict",
  1503. "attrs": [
  1504. {
  1505. "variable": "limits",
  1506. "label": "Limits",
  1507. "schema": {
  1508. "type": "dict",
  1509. "attrs": [
  1510. {
  1511. "variable": "cpus",
  1512. "label": "CPUs",
  1513. "description": "CPUs limit for Crafty 4.",
  1514. "schema": {
  1515. "type": "int",
  1516. "default": 2,
  1517. "required": true
  1518. }
  1519. },
  1520. {
  1521. "variable": "memory",
  1522. "label": "Memory (in MB)",
  1523. "description": "Memory limit for Crafty 4.",
  1524. "schema": {
  1525. "type": "int",
  1526. "default": 4096,
  1527. "required": true
  1528. }
  1529. }
  1530. ]
  1531. }
  1532. }
  1533. ]
  1534. }
  1535. }
  1536. ]
  1537. },
  1538. "readme": "<h1>Crafty 4</h1> <p><a href=\"https://craftycontrol.com/\">Crafty 4</a> is the next iteration of our Minecraft Server Wrapper/Controller/Launcher</p>",
  1539. "changelog": null,
  1540. "chart_metadata": {
  1541. "app_version": "4.5.3",
  1542. "capabilities": [],
  1543. "categories": [
  1544. "games"
  1545. ],
  1546. "changelog_url": "https://gitlab.com/crafty-controller/crafty-4/-/releases",
  1547. "date_added": "2025-04-04",
  1548. "description": "Crafty 4 is the next iteration of our Minecraft Server Wrapper/Controller/Launcher",
  1549. "home": "https://craftycontrol.com/",
  1550. "host_mounts": [],
  1551. "icon": "https://media.sys.truenas.net/apps/crafty-4/icons/icon.png",
  1552. "keywords": [
  1553. "minecraft",
  1554. "crafty"
  1555. ],
  1556. "lib_version": "2.1.49",
  1557. "lib_version_hash": "e71e6b0122c9446fa5ea6fb07e7eb01b11fb42d549a19845426bbd7e21a42634",
  1558. "maintainers": [
  1559. {
  1560. "email": "dev@ixsystems.com",
  1561. "name": "truenas",
  1562. "url": "https://www.truenas.com/"
  1563. }
  1564. ],
  1565. "name": "crafty-4",
  1566. "run_as_context": [
  1567. {
  1568. "description": "Crafty 4 runs as non-root user.",
  1569. "gid": 1000,
  1570. "group_name": "crafty",
  1571. "uid": 1000,
  1572. "user_name": "crafty"
  1573. }
  1574. ],
  1575. "screenshots": [],
  1576. "sources": [
  1577. "https://gitlab.com/crafty-controller/crafty-4"
  1578. ],
  1579. "title": "Crafty 4",
  1580. "train": "community",
  1581. "version": "1.0.15"
  1582. }
  1583. }
  1584. }