v1.2.json 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528
  1. [
  2. {
  3. "key": "general",
  4. "title": "General",
  5. "vars": [
  6. {
  7. "name": "service_name",
  8. "description": "Service name",
  9. "type": "str",
  10. "required": true
  11. },
  12. {
  13. "name": "container_name",
  14. "description": "Container name",
  15. "type": "str"
  16. },
  17. {
  18. "name": "container_hostname",
  19. "description": "Container internal hostname",
  20. "type": "str"
  21. },
  22. {
  23. "name": "container_timezone",
  24. "description": "Container timezone (e.g., Europe/Berlin)",
  25. "type": "str"
  26. },
  27. {
  28. "name": "user_uid",
  29. "description": "User UID for container process",
  30. "type": "int",
  31. "default": 1000
  32. },
  33. {
  34. "name": "user_gid",
  35. "description": "User GID for container process",
  36. "type": "int",
  37. "default": 1000
  38. },
  39. {
  40. "name": "container_loglevel",
  41. "description": "Container log level",
  42. "type": "enum",
  43. "options": ["debug", "info", "warn", "error"]
  44. },
  45. {
  46. "name": "restart_policy",
  47. "description": "Container restart policy",
  48. "type": "enum",
  49. "options": ["unless-stopped", "always", "on-failure", "no"],
  50. "default": "unless-stopped",
  51. "required": true
  52. }
  53. ]
  54. },
  55. {
  56. "key": "network",
  57. "title": "Network",
  58. "vars": [
  59. {
  60. "name": "network_mode",
  61. "description": "Docker network mode",
  62. "type": "enum",
  63. "options": ["bridge", "host", "macvlan"],
  64. "extra": "bridge=default Docker networking, host=use host network stack, macvlan=dedicated MAC address on physical network"
  65. },
  66. {
  67. "name": "network_name",
  68. "description": "Docker network name",
  69. "type": "str",
  70. "default": "bridge",
  71. "needs": ["network_mode=bridge,macvlan"],
  72. "required": true
  73. },
  74. {
  75. "name": "network_external",
  76. "description": "Use existing Docker network (external)",
  77. "type": "bool",
  78. "default": false,
  79. "needs": ["network_mode=bridge,macvlan"]
  80. },
  81. {
  82. "name": "network_macvlan_ipv4_address",
  83. "description": "Static IP address for container",
  84. "type": "str",
  85. "default": "192.168.1.253",
  86. "needs": ["network_mode=macvlan"],
  87. "required": true
  88. },
  89. {
  90. "name": "network_macvlan_parent_interface",
  91. "description": "Host network interface name",
  92. "type": "str",
  93. "default": "eth0",
  94. "needs": ["network_mode=macvlan"],
  95. "required": true
  96. },
  97. {
  98. "name": "network_macvlan_subnet",
  99. "description": "Network subnet in CIDR notation",
  100. "type": "str",
  101. "default": "192.168.1.0/24",
  102. "needs": ["network_mode=macvlan"],
  103. "required": true
  104. },
  105. {
  106. "name": "network_macvlan_gateway",
  107. "description": "Network gateway IP address",
  108. "type": "str",
  109. "default": "192.168.1.1",
  110. "needs": ["network_mode=macvlan"],
  111. "required": true
  112. }
  113. ]
  114. },
  115. {
  116. "key": "ports",
  117. "title": "Ports",
  118. "needs": ["network_mode!=host,macvlan"],
  119. "description": "Expose service ports to the host.",
  120. "vars": [
  121. {
  122. "name": "ports_http",
  123. "description": "HTTP port on host",
  124. "type": "int",
  125. "needs": ["traefik_enabled=false"],
  126. "default": 8080,
  127. "required": true
  128. },
  129. {
  130. "name": "ports_https",
  131. "description": "HTTPS port on host",
  132. "type": "int",
  133. "needs": ["traefik_enabled=false"],
  134. "default": 8443,
  135. "required": true
  136. },
  137. {
  138. "name": "ports_ssh",
  139. "description": "SSH port on host",
  140. "type": "int",
  141. "default": 22,
  142. "required": true
  143. },
  144. {
  145. "name": "ports_dns",
  146. "description": "DNS port on host",
  147. "type": "int",
  148. "default": 53,
  149. "required": true
  150. },
  151. {
  152. "name": "ports_dhcp",
  153. "description": "DHCP port on host",
  154. "type": "int",
  155. "default": 67,
  156. "required": true
  157. },
  158. {
  159. "name": "ports_smtp",
  160. "description": "SMTP port on host",
  161. "type": "int",
  162. "default": 25,
  163. "required": true
  164. },
  165. {
  166. "name": "ports_snmp",
  167. "description": "SNMP trap port",
  168. "type": "int",
  169. "default": 162,
  170. "required": true
  171. }
  172. ]
  173. },
  174. {
  175. "key": "traefik",
  176. "title": "Traefik",
  177. "toggle": "traefik_enabled",
  178. "needs": ["network_mode!=host,macvlan"],
  179. "description": "Traefik routes external traffic to your service.",
  180. "vars": [
  181. {
  182. "name": "traefik_enabled",
  183. "description": "Enable Traefik reverse proxy integration",
  184. "type": "bool",
  185. "default": false
  186. },
  187. {
  188. "name": "traefik_network",
  189. "description": "Traefik network name",
  190. "type": "str",
  191. "default": "traefik",
  192. "required": true
  193. },
  194. {
  195. "name": "traefik_host",
  196. "description": "Service subdomain or full hostname (e.g., 'app' or 'app.example.com')",
  197. "type": "str",
  198. "required": true
  199. },
  200. {
  201. "name": "traefik_domain",
  202. "description": "Base domain (e.g., example.com)",
  203. "type": "str",
  204. "default": "home.arpa",
  205. "required": true
  206. }
  207. ]
  208. },
  209. {
  210. "key": "traefik_tls",
  211. "title": "Traefik TLS/SSL",
  212. "toggle": "traefik_tls_enabled",
  213. "needs": ["traefik_enabled=true", "network_mode!=host,macvlan"],
  214. "description": "Enable HTTPS/TLS for Traefik with certificate management.",
  215. "vars": [
  216. {
  217. "name": "traefik_tls_enabled",
  218. "description": "Enable HTTPS/TLS",
  219. "type": "bool",
  220. "default": true
  221. },
  222. {
  223. "name": "traefik_tls_certresolver",
  224. "description": "Traefik certificate resolver name",
  225. "type": "str",
  226. "default": "cloudflare",
  227. "required": true
  228. }
  229. ]
  230. },
  231. {
  232. "key": "volume",
  233. "title": "Volume Storage",
  234. "description": "Configure persistent storage for your service.",
  235. "vars": [
  236. {
  237. "name": "volume_mode",
  238. "description": "Volume storage backend",
  239. "type": "enum",
  240. "options": ["local", "mount", "nfs"],
  241. "default": "local",
  242. "required": true
  243. },
  244. {
  245. "name": "volume_mount_path",
  246. "description": "Host path for bind mounts",
  247. "type": "str",
  248. "default": "/mnt/storage",
  249. "needs": ["volume_mode=mount"],
  250. "required": true
  251. },
  252. {
  253. "name": "volume_nfs_server",
  254. "description": "NFS server address",
  255. "type": "str",
  256. "default": "192.168.1.1",
  257. "needs": ["volume_mode=nfs"],
  258. "required": true
  259. },
  260. {
  261. "name": "volume_nfs_path",
  262. "description": "NFS export path",
  263. "type": "str",
  264. "default": "/export",
  265. "needs": ["volume_mode=nfs"],
  266. "required": true
  267. },
  268. {
  269. "name": "volume_nfs_options",
  270. "description": "NFS mount options (comma-separated)",
  271. "type": "str",
  272. "default": "rw,nolock,soft",
  273. "needs": ["volume_mode=nfs"],
  274. "required": true
  275. }
  276. ]
  277. },
  278. {
  279. "key": "resources",
  280. "title": "Resource Limits",
  281. "toggle": "resources_enabled",
  282. "description": "Set CPU and memory limits for the service.",
  283. "vars": [
  284. {
  285. "name": "resources_enabled",
  286. "description": "Enable resource limits",
  287. "type": "bool",
  288. "default": false
  289. },
  290. {
  291. "name": "resources_cpu_limit",
  292. "description": "Maximum CPU cores (e.g., 0.5, 1.0, 2.0)",
  293. "type": "str",
  294. "default": "1.0",
  295. "required": true
  296. },
  297. {
  298. "name": "resources_cpu_reservation",
  299. "description": "Reserved CPU cores",
  300. "type": "str",
  301. "default": "0.25",
  302. "needs": ["swarm_enabled=true"],
  303. "required": true
  304. },
  305. {
  306. "name": "resources_memory_limit",
  307. "description": "Maximum memory (e.g., 512M, 1G, 2G)",
  308. "type": "str",
  309. "default": "1G",
  310. "required": true
  311. },
  312. {
  313. "name": "resources_memory_reservation",
  314. "description": "Reserved memory",
  315. "type": "str",
  316. "default": "512M",
  317. "needs": ["swarm_enabled=true"],
  318. "required": true
  319. }
  320. ]
  321. },
  322. {
  323. "key": "swarm",
  324. "title": "Docker Swarm",
  325. "toggle": "swarm_enabled",
  326. "needs": ["network_mode!=host,macvlan"],
  327. "description": "Deploy service in Docker Swarm mode.",
  328. "vars": [
  329. {
  330. "name": "swarm_enabled",
  331. "description": "Enable Docker Swarm mode",
  332. "type": "bool",
  333. "default": false
  334. },
  335. {
  336. "name": "swarm_placement_mode",
  337. "description": "Swarm placement mode",
  338. "type": "enum",
  339. "options": ["replicated", "global"],
  340. "default": "replicated",
  341. "required": true
  342. },
  343. {
  344. "name": "swarm_replicas",
  345. "description": "Number of replicas",
  346. "type": "int",
  347. "default": 1,
  348. "needs": ["swarm_placement_mode=replicated"],
  349. "required": true
  350. },
  351. {
  352. "name": "swarm_placement_host",
  353. "description": "Target hostname for placement constraint",
  354. "type": "str",
  355. "default": "",
  356. "needs": ["swarm_placement_mode=replicated"],
  357. "extra": "Constrains service to run on specific node by hostname"
  358. }
  359. ]
  360. },
  361. {
  362. "key": "database",
  363. "title": "Database",
  364. "toggle": "database_enabled",
  365. "description": "Connect to external database (PostgreSQL or MySQL)",
  366. "vars": [
  367. {
  368. "name": "database_enabled",
  369. "description": "Enable external database integration",
  370. "type": "bool",
  371. "default": false
  372. },
  373. {
  374. "name": "database_type",
  375. "description": "Database type",
  376. "type": "enum",
  377. "options": ["sqlite", "postgres", "mysql"],
  378. "default": "sqlite",
  379. "required": true
  380. },
  381. {
  382. "name": "database_external",
  383. "description": "Use an external database server?",
  384. "extra": "skips creation of internal database container",
  385. "type": "bool",
  386. "needs": ["database_type=postgres,mysql"],
  387. "default": false
  388. },
  389. {
  390. "name": "database_host",
  391. "description": "Database host",
  392. "type": "str",
  393. "needs": ["database_external=true;database_type=postgres,mysql"],
  394. "required": true
  395. },
  396. {
  397. "name": "database_port",
  398. "description": "Database port",
  399. "type": "int",
  400. "needs": ["database_external=true;database_type=postgres,mysql"],
  401. "required": true
  402. },
  403. {
  404. "name": "database_name",
  405. "description": "Database name",
  406. "type": "str",
  407. "needs": ["database_type=postgres,mysql"],
  408. "required": true
  409. },
  410. {
  411. "name": "database_user",
  412. "description": "Database user",
  413. "type": "str",
  414. "needs": ["database_type=postgres,mysql"],
  415. "required": true
  416. },
  417. {
  418. "name": "database_password",
  419. "description": "Database password",
  420. "type": "str",
  421. "needs": ["database_type=postgres,mysql"],
  422. "sensitive": true,
  423. "autogenerated": true,
  424. "required": true
  425. }
  426. ]
  427. },
  428. {
  429. "key": "email",
  430. "title": "Email Server",
  431. "toggle": "email_enabled",
  432. "description": "Configure email server for notifications and user management.",
  433. "vars": [
  434. {
  435. "name": "email_enabled",
  436. "description": "Enable email server configuration",
  437. "type": "bool",
  438. "default": false
  439. },
  440. {
  441. "name": "email_host",
  442. "description": "SMTP server hostname",
  443. "type": "str",
  444. "required": true
  445. },
  446. {
  447. "name": "email_port",
  448. "description": "SMTP server port",
  449. "type": "int",
  450. "default": 25,
  451. "required": true
  452. },
  453. {
  454. "name": "email_username",
  455. "description": "SMTP username",
  456. "type": "str",
  457. "required": true
  458. },
  459. {
  460. "name": "email_password",
  461. "description": "SMTP password",
  462. "type": "str",
  463. "sensitive": true,
  464. "required": true
  465. },
  466. {
  467. "name": "email_from",
  468. "description": "From email address",
  469. "type": "str",
  470. "required": true
  471. },
  472. {
  473. "name": "email_encryption",
  474. "description": "Email encryption method to use",
  475. "type": "enum",
  476. "options": ["none", "starttls", "ssl"]
  477. }
  478. ]
  479. },
  480. {
  481. "key": "authentik",
  482. "title": "Authentik SSO",
  483. "toggle": "authentik_enabled",
  484. "description": "Integrate with Authentik for Single Sign-On authentication.",
  485. "vars": [
  486. {
  487. "name": "authentik_enabled",
  488. "description": "Enable Authentik SSO integration",
  489. "type": "bool",
  490. "default": false
  491. },
  492. {
  493. "name": "authentik_url",
  494. "description": "Authentik base URL (e.g., https://auth.example.com)",
  495. "type": "url",
  496. "required": true
  497. },
  498. {
  499. "name": "authentik_slug",
  500. "description": "Authentik application slug",
  501. "type": "str",
  502. "required": true
  503. },
  504. {
  505. "name": "authentik_traefik_middleware",
  506. "description": "Traefik middleware name for Authentik authentication",
  507. "type": "str",
  508. "default": "authentik-middleware@file",
  509. "needs": ["traefik_enabled=true"],
  510. "required": true
  511. },
  512. {
  513. "name": "authentik_client_id",
  514. "description": "Authentik OAuth2 client ID",
  515. "type": "str",
  516. "sensitive": true,
  517. "required": true
  518. },
  519. {
  520. "name": "authentik_client_secret",
  521. "description": "Authentik OAuth2 client secret",
  522. "type": "str",
  523. "sensitive": true,
  524. "required": true
  525. }
  526. ]
  527. }
  528. ]