app_versions.json 108 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687
  1. {
  2. "2.0.4": {
  3. "healthy": true,
  4. "supported": false,
  5. "healthy_error": null,
  6. "location": "/__w/charts/charts/charts/wg-easy/2.0.4",
  7. "last_update": "2023-12-21 08:37:46",
  8. "required_features": [
  9. "normalize/ixVolume",
  10. "definitions/nodeIP",
  11. "normalize/acl"
  12. ],
  13. "human_version": "7_2.0.4",
  14. "version": "2.0.4",
  15. "chart_metadata": {
  16. "name": "wg-easy",
  17. "description": "WG-Easy is the easiest way to install & manage WireGuard!",
  18. "annotations": {
  19. "title": "WG Easy"
  20. },
  21. "type": "application",
  22. "version": "2.0.4",
  23. "apiVersion": "v2",
  24. "appVersion": "7",
  25. "kubeVersion": ">=1.16.0-0",
  26. "maintainers": [
  27. {
  28. "name": "truenas",
  29. "url": "https://www.truenas.com/",
  30. "email": "dev@ixsystems.com"
  31. }
  32. ],
  33. "dependencies": [
  34. {
  35. "name": "common",
  36. "repository": "file://../../../common",
  37. "version": "1.2.5"
  38. }
  39. ],
  40. "home": "https://github.com/WeeJeWel/wg-easy",
  41. "icon": "https://media.sys.truenas.net/apps/wg-easy/icons/icon.png",
  42. "sources": [
  43. "https://github.com/WeeJeWel/wg-easy",
  44. "https://github.com/truenas/charts/tree/master/charts/wg-easy"
  45. ],
  46. "keywords": [
  47. "wireguard",
  48. "network",
  49. "vpn"
  50. ]
  51. },
  52. "app_metadata": {
  53. "runAsContext": [
  54. {
  55. "userName": "root",
  56. "groupName": "root",
  57. "gid": 0,
  58. "uid": 0,
  59. "description": "WG Easy runs as root user."
  60. }
  61. ],
  62. "capabilities": [
  63. {
  64. "name": "NET_RAW",
  65. "description": "WG Easy is able to use raw sockets."
  66. },
  67. {
  68. "name": "SYS_MODULE",
  69. "description": "WG Easy is able to load kernel modules."
  70. },
  71. {
  72. "name": "NET_ADMIN",
  73. "description": "WG Easy is able to perform various network-related operations."
  74. }
  75. ],
  76. "hostMounts": []
  77. },
  78. "schema": {
  79. "groups": [
  80. {
  81. "name": "WG-Easy Configuration",
  82. "description": "Configure WG-Easy"
  83. },
  84. {
  85. "name": "Advanced Pod Configuration",
  86. "description": "Configure Advanced Pod Options for WG-Easy"
  87. },
  88. {
  89. "name": "Network Configuration",
  90. "description": "Configure Network for WG-Easy"
  91. },
  92. {
  93. "name": "Storage Configuration",
  94. "description": "Configure Storage for WG-Easy"
  95. },
  96. {
  97. "name": "Resources Configuration",
  98. "description": "Configure Resources for WG-Easy"
  99. }
  100. ],
  101. "portals": {
  102. "web_portal": {
  103. "protocols": [
  104. "$kubernetes-resource_configmap_portal_protocol"
  105. ],
  106. "host": [
  107. "$kubernetes-resource_configmap_portal_host"
  108. ],
  109. "ports": [
  110. "$kubernetes-resource_configmap_portal_port"
  111. ],
  112. "path": "$kubernetes-resource_configmap_portal_path"
  113. }
  114. },
  115. "questions": [
  116. {
  117. "variable": "wgNetwork",
  118. "label": "",
  119. "group": "Network Configuration",
  120. "schema": {
  121. "type": "dict",
  122. "attrs": [
  123. {
  124. "variable": "udpPort",
  125. "label": "UDP Port",
  126. "description": "The port for the WG-Easy Wireguard service.",
  127. "schema": {
  128. "type": "int",
  129. "default": 30057,
  130. "min": 9000,
  131. "max": 65535,
  132. "required": true
  133. }
  134. },
  135. {
  136. "variable": "webPort",
  137. "label": "Web Port",
  138. "description": "The port for the WG-Easy Web UI.",
  139. "schema": {
  140. "type": "int",
  141. "default": 30058,
  142. "min": 9000,
  143. "max": 65535,
  144. "required": true
  145. }
  146. },
  147. {
  148. "variable": "hostNetwork",
  149. "label": "Host Network",
  150. "schema": {
  151. "type": "boolean",
  152. "default": true
  153. }
  154. }
  155. ]
  156. }
  157. },
  158. {
  159. "variable": "podOptions",
  160. "label": "",
  161. "group": "Advanced Pod Configuration",
  162. "schema": {
  163. "type": "dict",
  164. "attrs": [
  165. {
  166. "variable": "dnsConfig",
  167. "label": "Advanced DNS Configuration",
  168. "schema": {
  169. "type": "dict",
  170. "attrs": [
  171. {
  172. "variable": "options",
  173. "label": "DNS Options",
  174. "schema": {
  175. "type": "list",
  176. "items": [
  177. {
  178. "variable": "optionsEntry",
  179. "label": "DNS Option Entry",
  180. "schema": {
  181. "type": "dict",
  182. "attrs": [
  183. {
  184. "variable": "name",
  185. "label": "Option Name",
  186. "schema": {
  187. "type": "string",
  188. "required": true
  189. }
  190. },
  191. {
  192. "variable": "value",
  193. "label": "Option Value",
  194. "schema": {
  195. "type": "string",
  196. "required": true
  197. }
  198. }
  199. ]
  200. }
  201. }
  202. ]
  203. }
  204. }
  205. ]
  206. }
  207. }
  208. ]
  209. }
  210. },
  211. {
  212. "variable": "wgConfig",
  213. "label": "",
  214. "group": "WG-Easy Configuration",
  215. "schema": {
  216. "type": "dict",
  217. "attrs": [
  218. {
  219. "variable": "host",
  220. "label": "Hostname or IP",
  221. "description": "The public hostname or IP of your VPN server.",
  222. "schema": {
  223. "type": "string",
  224. "required": true,
  225. "$ref": [
  226. "definitions/nodeIP"
  227. ],
  228. "default": "192.168.0.10"
  229. }
  230. },
  231. {
  232. "variable": "password",
  233. "label": "Password for WebUI",
  234. "description": "When set, requires a password when logging in to the Web UI.",
  235. "schema": {
  236. "type": "string",
  237. "private": true,
  238. "default": ""
  239. }
  240. },
  241. {
  242. "variable": "keepAlive",
  243. "label": "Persistent Keep Alive",
  244. "description": "Value in seconds to keep the \"connection\" open. If this value is 0, then connections won't be kept alive.",
  245. "schema": {
  246. "type": "int",
  247. "required": true,
  248. "default": 0
  249. }
  250. },
  251. {
  252. "variable": "clientMTU",
  253. "label": "Clients MTU",
  254. "description": "The MTU the clients will use.",
  255. "schema": {
  256. "type": "int",
  257. "required": true,
  258. "default": 1420
  259. }
  260. },
  261. {
  262. "variable": "clientAddressRange",
  263. "label": "Clients IP Address Range",
  264. "description": "Clients IP address range.",
  265. "schema": {
  266. "type": "string",
  267. "required": true,
  268. "default": "10.8.0.x"
  269. }
  270. },
  271. {
  272. "variable": "clientDNSServer",
  273. "label": "Clients DNS Server",
  274. "description": "Clients DNS Server.",
  275. "schema": {
  276. "type": "string",
  277. "required": true,
  278. "default": "1.1.1.1"
  279. }
  280. },
  281. {
  282. "variable": "allowedIPs",
  283. "label": "Allowed IPs",
  284. "description": "Allowed IPs clients will use. If none provided, <0.0.0.0/0,::/0> will be used.",
  285. "schema": {
  286. "type": "list",
  287. "default": [],
  288. "items": [
  289. {
  290. "variable": "entry",
  291. "label": "Allowed IP Entry",
  292. "schema": {
  293. "type": "string",
  294. "required": true,
  295. "default": ""
  296. }
  297. }
  298. ]
  299. }
  300. },
  301. {
  302. "variable": "additionalEnvs",
  303. "label": "Additional Environment Variables",
  304. "description": "Configure additional environment variables for WG-Easy.",
  305. "schema": {
  306. "type": "list",
  307. "default": [],
  308. "items": [
  309. {
  310. "variable": "env",
  311. "label": "Environment Variable",
  312. "schema": {
  313. "type": "dict",
  314. "attrs": [
  315. {
  316. "variable": "name",
  317. "label": "Name",
  318. "schema": {
  319. "type": "string",
  320. "required": true
  321. }
  322. },
  323. {
  324. "variable": "value",
  325. "label": "Value",
  326. "schema": {
  327. "type": "string",
  328. "required": true
  329. }
  330. }
  331. ]
  332. }
  333. }
  334. ]
  335. }
  336. }
  337. ]
  338. }
  339. },
  340. {
  341. "variable": "wgStorage",
  342. "label": "",
  343. "group": "Storage Configuration",
  344. "schema": {
  345. "type": "dict",
  346. "attrs": [
  347. {
  348. "variable": "config",
  349. "label": "WG-Easy Config Storage",
  350. "description": "The path to store WG-Easy Configuration.",
  351. "schema": {
  352. "type": "dict",
  353. "attrs": [
  354. {
  355. "variable": "type",
  356. "label": "Type",
  357. "description": "ixVolume: Is dataset created automatically by the system.</br>\nHost Path: Is a path that already exists on the system.\n",
  358. "schema": {
  359. "type": "string",
  360. "required": true,
  361. "immutable": true,
  362. "default": "ixVolume",
  363. "enum": [
  364. {
  365. "value": "hostPath",
  366. "description": "Host Path (Path that already exists on the system)"
  367. },
  368. {
  369. "value": "ixVolume",
  370. "description": "ixVolume (Dataset created automatically by the system)"
  371. }
  372. ]
  373. }
  374. },
  375. {
  376. "variable": "ixVolumeConfig",
  377. "label": "ixVolume Configuration",
  378. "description": "The configuration for the ixVolume dataset.",
  379. "schema": {
  380. "type": "dict",
  381. "show_if": [
  382. [
  383. "type",
  384. "=",
  385. "ixVolume"
  386. ]
  387. ],
  388. "$ref": [
  389. "normalize/ixVolume"
  390. ],
  391. "attrs": [
  392. {
  393. "variable": "aclEnable",
  394. "label": "Enable ACL",
  395. "description": "Enable ACL for the dataset.",
  396. "schema": {
  397. "type": "boolean",
  398. "default": false
  399. }
  400. },
  401. {
  402. "variable": "datasetName",
  403. "label": "Dataset Name",
  404. "description": "The name of the dataset to use for storage.",
  405. "schema": {
  406. "type": "string",
  407. "required": true,
  408. "immutable": true,
  409. "hidden": true,
  410. "default": "config"
  411. }
  412. },
  413. {
  414. "variable": "aclEntries",
  415. "label": "ACL Configuration",
  416. "schema": {
  417. "type": "dict",
  418. "show_if": [
  419. [
  420. "aclEnable",
  421. "=",
  422. true
  423. ]
  424. ],
  425. "attrs": [
  426. {
  427. "variable": "path",
  428. "label": "Path",
  429. "description": "Path to perform ACL",
  430. "schema": {
  431. "type": "string",
  432. "hidden": true
  433. }
  434. },
  435. {
  436. "variable": "entries",
  437. "label": "ACL Entries",
  438. "description": "ACL Entries",
  439. "schema": {
  440. "type": "list",
  441. "items": [
  442. {
  443. "variable": "aclEntry",
  444. "label": "ACL Entry",
  445. "schema": {
  446. "type": "dict",
  447. "attrs": [
  448. {
  449. "variable": "id_type",
  450. "label": "ID Type",
  451. "schema": {
  452. "type": "string",
  453. "enum": [
  454. {
  455. "value": "USER",
  456. "description": "Entry is for a USER"
  457. },
  458. {
  459. "value": "GROUP",
  460. "description": "Entry is for a GROUP"
  461. }
  462. ],
  463. "default": "USER"
  464. }
  465. },
  466. {
  467. "variable": "id",
  468. "label": "ID",
  469. "description": "Make sure to check the ID value is correct and aligns with RunAs user context of the application",
  470. "schema": {
  471. "type": "int",
  472. "required": true,
  473. "min": 0
  474. }
  475. },
  476. {
  477. "variable": "access",
  478. "label": "Access",
  479. "schema": {
  480. "type": "string",
  481. "enum": [
  482. {
  483. "value": "READ",
  484. "description": "Read Access"
  485. },
  486. {
  487. "value": "MODIFY",
  488. "description": "Modify Access"
  489. },
  490. {
  491. "value": "FULL_CONTROL",
  492. "description": "FULL_CONTROL Access"
  493. }
  494. ]
  495. }
  496. }
  497. ]
  498. }
  499. }
  500. ]
  501. }
  502. }
  503. ]
  504. }
  505. }
  506. ]
  507. }
  508. },
  509. {
  510. "variable": "hostPathConfig",
  511. "label": "Host Path Config",
  512. "schema": {
  513. "type": "dict",
  514. "show_if": [
  515. [
  516. "type",
  517. "=",
  518. "hostPath"
  519. ]
  520. ],
  521. "attrs": [
  522. {
  523. "variable": "aclEnable",
  524. "label": "Enable ACL",
  525. "description": "Enable ACL for the dataset.",
  526. "schema": {
  527. "type": "boolean",
  528. "default": false
  529. }
  530. },
  531. {
  532. "variable": "acl",
  533. "label": "ACL Configuration",
  534. "schema": {
  535. "type": "dict",
  536. "show_if": [
  537. [
  538. "aclEnable",
  539. "=",
  540. true
  541. ]
  542. ],
  543. "attrs": [
  544. {
  545. "variable": "path",
  546. "label": "Host Path",
  547. "description": "Host Path to perform ACL",
  548. "schema": {
  549. "type": "hostpath",
  550. "required": true,
  551. "empty": false
  552. }
  553. },
  554. {
  555. "variable": "entries",
  556. "label": "ACL Entries",
  557. "description": "ACL Entries",
  558. "schema": {
  559. "type": "list",
  560. "items": [
  561. {
  562. "variable": "aclEntry",
  563. "label": "ACL Entry",
  564. "schema": {
  565. "type": "dict",
  566. "attrs": [
  567. {
  568. "variable": "id_type",
  569. "label": "ID Type",
  570. "schema": {
  571. "type": "string",
  572. "enum": [
  573. {
  574. "value": "USER",
  575. "description": "Entry is for a USER"
  576. },
  577. {
  578. "value": "GROUP",
  579. "description": "Entry is for a GROUP"
  580. }
  581. ],
  582. "default": "USER"
  583. }
  584. },
  585. {
  586. "variable": "id",
  587. "label": "ID",
  588. "description": "Make sure to check the ID value is correct and aligns with RunAs user context of the application",
  589. "schema": {
  590. "type": "int",
  591. "required": true,
  592. "min": 0
  593. }
  594. },
  595. {
  596. "variable": "access",
  597. "label": "Access",
  598. "schema": {
  599. "type": "string",
  600. "enum": [
  601. {
  602. "value": "READ",
  603. "description": "Read Access"
  604. },
  605. {
  606. "value": "MODIFY",
  607. "description": "Modify Access"
  608. },
  609. {
  610. "value": "FULL_CONTROL",
  611. "description": "FULL_CONTROL Access"
  612. }
  613. ]
  614. }
  615. }
  616. ]
  617. }
  618. }
  619. ]
  620. }
  621. },
  622. {
  623. "variable": "options",
  624. "label": "ACL Options",
  625. "schema": {
  626. "type": "dict",
  627. "attrs": [
  628. {
  629. "variable": "force",
  630. "label": "Force Flag",
  631. "description": "Enabling `Force` applies ACL even if the path has existing data",
  632. "schema": {
  633. "type": "boolean",
  634. "default": false
  635. }
  636. }
  637. ]
  638. }
  639. }
  640. ],
  641. "$ref": [
  642. "normalize/acl"
  643. ]
  644. }
  645. },
  646. {
  647. "variable": "hostPath",
  648. "label": "Host Path",
  649. "description": "The host path to use for storage.",
  650. "schema": {
  651. "type": "hostpath",
  652. "show_if": [
  653. [
  654. "aclEnable",
  655. "=",
  656. false
  657. ]
  658. ],
  659. "required": true
  660. }
  661. }
  662. ]
  663. }
  664. }
  665. ]
  666. }
  667. },
  668. {
  669. "variable": "additionalStorages",
  670. "label": "Additional Storage",
  671. "description": "Additional storage for WG-Easy.",
  672. "schema": {
  673. "type": "list",
  674. "default": [],
  675. "items": [
  676. {
  677. "variable": "storageEntry",
  678. "label": "Storage Entry",
  679. "schema": {
  680. "type": "dict",
  681. "attrs": [
  682. {
  683. "variable": "type",
  684. "label": "Type",
  685. "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",
  686. "schema": {
  687. "type": "string",
  688. "required": true,
  689. "default": "ixVolume",
  690. "immutable": true,
  691. "enum": [
  692. {
  693. "value": "hostPath",
  694. "description": "Host Path (Path that already exists on the system)"
  695. },
  696. {
  697. "value": "ixVolume",
  698. "description": "ixVolume (Dataset created automatically by the system)"
  699. },
  700. {
  701. "value": "smb-pv-pvc",
  702. "description": "SMB Share (Mounts a persistent volume claim to a SMB share)"
  703. }
  704. ]
  705. }
  706. },
  707. {
  708. "variable": "readOnly",
  709. "label": "Read Only",
  710. "description": "Mount the volume as read only.",
  711. "schema": {
  712. "type": "boolean",
  713. "default": false
  714. }
  715. },
  716. {
  717. "variable": "mountPath",
  718. "label": "Mount Path",
  719. "description": "The path inside the container to mount the storage.",
  720. "schema": {
  721. "type": "path",
  722. "required": true
  723. }
  724. },
  725. {
  726. "variable": "hostPathConfig",
  727. "label": "Host Path Config",
  728. "schema": {
  729. "type": "dict",
  730. "show_if": [
  731. [
  732. "type",
  733. "=",
  734. "hostPath"
  735. ]
  736. ],
  737. "attrs": [
  738. {
  739. "variable": "aclEnable",
  740. "label": "Enable ACL",
  741. "description": "Enable ACL for the dataset.",
  742. "schema": {
  743. "type": "boolean",
  744. "default": false
  745. }
  746. },
  747. {
  748. "variable": "acl",
  749. "label": "ACL Configuration",
  750. "schema": {
  751. "type": "dict",
  752. "show_if": [
  753. [
  754. "aclEnable",
  755. "=",
  756. true
  757. ]
  758. ],
  759. "attrs": [
  760. {
  761. "variable": "path",
  762. "label": "Host Path",
  763. "description": "Host Path to perform ACL",
  764. "schema": {
  765. "type": "hostpath",
  766. "required": true,
  767. "empty": false
  768. }
  769. },
  770. {
  771. "variable": "entries",
  772. "label": "ACL Entries",
  773. "description": "ACL Entries",
  774. "schema": {
  775. "type": "list",
  776. "items": [
  777. {
  778. "variable": "aclEntry",
  779. "label": "ACL Entry",
  780. "schema": {
  781. "type": "dict",
  782. "attrs": [
  783. {
  784. "variable": "id_type",
  785. "label": "ID Type",
  786. "schema": {
  787. "type": "string",
  788. "enum": [
  789. {
  790. "value": "USER",
  791. "description": "Entry is for a USER"
  792. },
  793. {
  794. "value": "GROUP",
  795. "description": "Entry is for a GROUP"
  796. }
  797. ],
  798. "default": "USER"
  799. }
  800. },
  801. {
  802. "variable": "id",
  803. "label": "ID",
  804. "description": "Make sure to check the ID value is correct and aligns with RunAs user context of the application",
  805. "schema": {
  806. "type": "int",
  807. "required": true,
  808. "min": 0
  809. }
  810. },
  811. {
  812. "variable": "access",
  813. "label": "Access",
  814. "schema": {
  815. "type": "string",
  816. "enum": [
  817. {
  818. "value": "READ",
  819. "description": "Read Access"
  820. },
  821. {
  822. "value": "MODIFY",
  823. "description": "Modify Access"
  824. },
  825. {
  826. "value": "FULL_CONTROL",
  827. "description": "FULL_CONTROL Access"
  828. }
  829. ]
  830. }
  831. }
  832. ]
  833. }
  834. }
  835. ]
  836. }
  837. },
  838. {
  839. "variable": "options",
  840. "label": "ACL Options",
  841. "schema": {
  842. "type": "dict",
  843. "attrs": [
  844. {
  845. "variable": "force",
  846. "label": "Force Flag",
  847. "description": "Enabling `Force` applies ACL even if the path has existing data",
  848. "schema": {
  849. "type": "boolean",
  850. "default": false
  851. }
  852. }
  853. ]
  854. }
  855. }
  856. ],
  857. "$ref": [
  858. "normalize/acl"
  859. ]
  860. }
  861. },
  862. {
  863. "variable": "hostPath",
  864. "label": "Host Path",
  865. "description": "The host path to use for storage.",
  866. "schema": {
  867. "type": "hostpath",
  868. "show_if": [
  869. [
  870. "aclEnable",
  871. "=",
  872. false
  873. ]
  874. ],
  875. "required": true
  876. }
  877. }
  878. ]
  879. }
  880. },
  881. {
  882. "variable": "ixVolumeConfig",
  883. "label": "ixVolume Configuration",
  884. "description": "The configuration for the ixVolume dataset.",
  885. "schema": {
  886. "type": "dict",
  887. "show_if": [
  888. [
  889. "type",
  890. "=",
  891. "ixVolume"
  892. ]
  893. ],
  894. "$ref": [
  895. "normalize/ixVolume"
  896. ],
  897. "attrs": [
  898. {
  899. "variable": "aclEnable",
  900. "label": "Enable ACL",
  901. "description": "Enable ACL for the dataset.",
  902. "schema": {
  903. "type": "boolean",
  904. "default": false
  905. }
  906. },
  907. {
  908. "variable": "datasetName",
  909. "label": "Dataset Name",
  910. "description": "The name of the dataset to use for storage.",
  911. "schema": {
  912. "type": "string",
  913. "required": true,
  914. "immutable": true,
  915. "default": "storage_entry"
  916. }
  917. },
  918. {
  919. "variable": "aclEntries",
  920. "label": "ACL Configuration",
  921. "schema": {
  922. "type": "dict",
  923. "show_if": [
  924. [
  925. "aclEnable",
  926. "=",
  927. true
  928. ]
  929. ],
  930. "attrs": [
  931. {
  932. "variable": "path",
  933. "label": "Path",
  934. "description": "Path to perform ACL",
  935. "schema": {
  936. "type": "string",
  937. "hidden": true
  938. }
  939. },
  940. {
  941. "variable": "entries",
  942. "label": "ACL Entries",
  943. "description": "ACL Entries",
  944. "schema": {
  945. "type": "list",
  946. "items": [
  947. {
  948. "variable": "aclEntry",
  949. "label": "ACL Entry",
  950. "schema": {
  951. "type": "dict",
  952. "attrs": [
  953. {
  954. "variable": "id_type",
  955. "label": "ID Type",
  956. "schema": {
  957. "type": "string",
  958. "enum": [
  959. {
  960. "value": "USER",
  961. "description": "Entry is for a USER"
  962. },
  963. {
  964. "value": "GROUP",
  965. "description": "Entry is for a GROUP"
  966. }
  967. ],
  968. "default": "USER"
  969. }
  970. },
  971. {
  972. "variable": "id",
  973. "label": "ID",
  974. "description": "Make sure to check the ID value is correct and aligns with RunAs user context of the application",
  975. "schema": {
  976. "type": "int",
  977. "required": true,
  978. "min": 0
  979. }
  980. },
  981. {
  982. "variable": "access",
  983. "label": "Access",
  984. "schema": {
  985. "type": "string",
  986. "enum": [
  987. {
  988. "value": "READ",
  989. "description": "Read Access"
  990. },
  991. {
  992. "value": "MODIFY",
  993. "description": "Modify Access"
  994. },
  995. {
  996. "value": "FULL_CONTROL",
  997. "description": "FULL_CONTROL Access"
  998. }
  999. ]
  1000. }
  1001. }
  1002. ]
  1003. }
  1004. }
  1005. ]
  1006. }
  1007. }
  1008. ]
  1009. }
  1010. }
  1011. ]
  1012. }
  1013. },
  1014. {
  1015. "variable": "smbConfig",
  1016. "label": "SMB Share Configuration",
  1017. "description": "The configuration for the SMB Share.",
  1018. "schema": {
  1019. "type": "dict",
  1020. "show_if": [
  1021. [
  1022. "type",
  1023. "=",
  1024. "smb-pv-pvc"
  1025. ]
  1026. ],
  1027. "attrs": [
  1028. {
  1029. "variable": "server",
  1030. "label": "Server",
  1031. "description": "The server for the SMB share.",
  1032. "schema": {
  1033. "type": "string",
  1034. "required": true
  1035. }
  1036. },
  1037. {
  1038. "variable": "share",
  1039. "label": "Share",
  1040. "description": "The share name for the SMB share.",
  1041. "schema": {
  1042. "type": "string",
  1043. "required": true
  1044. }
  1045. },
  1046. {
  1047. "variable": "domain",
  1048. "label": "Domain (Optional)",
  1049. "description": "The domain for the SMB share.",
  1050. "schema": {
  1051. "type": "string"
  1052. }
  1053. },
  1054. {
  1055. "variable": "username",
  1056. "label": "Username",
  1057. "description": "The username for the SMB share.",
  1058. "schema": {
  1059. "type": "string",
  1060. "required": true
  1061. }
  1062. },
  1063. {
  1064. "variable": "password",
  1065. "label": "Password",
  1066. "description": "The password for the SMB share.",
  1067. "schema": {
  1068. "type": "string",
  1069. "required": true,
  1070. "private": true
  1071. }
  1072. },
  1073. {
  1074. "variable": "size",
  1075. "label": "Size (in Gi)",
  1076. "description": "The size of the volume quota.",
  1077. "schema": {
  1078. "type": "int",
  1079. "required": true,
  1080. "min": 1,
  1081. "default": 1
  1082. }
  1083. }
  1084. ]
  1085. }
  1086. }
  1087. ]
  1088. }
  1089. }
  1090. ]
  1091. }
  1092. }
  1093. ]
  1094. }
  1095. },
  1096. {
  1097. "variable": "resources",
  1098. "group": "Resources Configuration",
  1099. "label": "",
  1100. "schema": {
  1101. "type": "dict",
  1102. "attrs": [
  1103. {
  1104. "variable": "limits",
  1105. "label": "Limits",
  1106. "schema": {
  1107. "type": "dict",
  1108. "attrs": [
  1109. {
  1110. "variable": "cpu",
  1111. "label": "CPU",
  1112. "description": "CPU limit for WG-Easy.",
  1113. "schema": {
  1114. "type": "string",
  1115. "max_length": 6,
  1116. "valid_chars": "^(0\\.[1-9]|[1-9][0-9]*)(\\.[0-9]|m?)$",
  1117. "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",
  1118. "default": "4000m",
  1119. "required": true
  1120. }
  1121. },
  1122. {
  1123. "variable": "memory",
  1124. "label": "Memory",
  1125. "description": "Memory limit for WG-Easy.",
  1126. "schema": {
  1127. "type": "string",
  1128. "max_length": 12,
  1129. "valid_chars": "^[1-9][0-9]*([EPTGMK]i?|e[0-9]+)?$",
  1130. "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",
  1131. "default": "8Gi",
  1132. "required": true
  1133. }
  1134. }
  1135. ]
  1136. }
  1137. }
  1138. ]
  1139. }
  1140. }
  1141. ]
  1142. },
  1143. "app_readme": "<h1>WG-Easy</h1>\n<p><a href=\"https://github.com/WeeJeWel/wg-easy\">WG-Easy (WireGuard Easy)</a> is the easiest way to install &amp; manage WireGuard!</p>",
  1144. "detailed_readme": "<h1>WG-Easy</h1>\n<p><a href=\"https://github.com/WeeJeWel/wg-easy\">WG-Easy (WireGuard Easy)</a> is the easiest way to install &amp; manage WireGuard!</p>",
  1145. "changelog": null
  1146. },
  1147. "1.0.12": {
  1148. "healthy": true,
  1149. "supported": true,
  1150. "healthy_error": null,
  1151. "location": "/__w/charts/charts/charts/wg-easy/1.0.12",
  1152. "last_update": "2023-12-21 08:37:46",
  1153. "required_features": [
  1154. "normalize/ixVolume",
  1155. "definitions/nodeIP",
  1156. "validations/lockedHostPath"
  1157. ],
  1158. "human_version": "7_1.0.12",
  1159. "version": "1.0.12",
  1160. "chart_metadata": {
  1161. "name": "wg-easy",
  1162. "description": "WG-Easy is the easiest way to install & manage WireGuard!",
  1163. "annotations": {
  1164. "title": "WG Easy"
  1165. },
  1166. "type": "application",
  1167. "version": "1.0.12",
  1168. "apiVersion": "v2",
  1169. "appVersion": "7",
  1170. "kubeVersion": ">=1.16.0-0",
  1171. "maintainers": [
  1172. {
  1173. "name": "truenas",
  1174. "url": "https://www.truenas.com/",
  1175. "email": "dev@ixsystems.com"
  1176. }
  1177. ],
  1178. "dependencies": [
  1179. {
  1180. "name": "common",
  1181. "repository": "file://../../../common/2304.0.1",
  1182. "version": "2304.0.1"
  1183. }
  1184. ],
  1185. "home": "https://github.com/WeeJeWel/wg-easy",
  1186. "icon": "https://media.sys.truenas.net/apps/wg-easy/icons/icon.png",
  1187. "sources": [
  1188. "https://github.com/WeeJeWel/wg-easy",
  1189. "https://github.com/truenas/charts/tree/master/charts/wg-easy"
  1190. ],
  1191. "keywords": [
  1192. "wireguard",
  1193. "network",
  1194. "vpn"
  1195. ]
  1196. },
  1197. "app_metadata": {
  1198. "runAsContext": [
  1199. {
  1200. "userName": "root",
  1201. "groupName": "root",
  1202. "gid": 0,
  1203. "uid": 0,
  1204. "description": "WG Easy runs as root user."
  1205. }
  1206. ],
  1207. "capabilities": [
  1208. {
  1209. "name": "CHOWN",
  1210. "description": "WG Easy is able to chown files."
  1211. },
  1212. {
  1213. "name": "FOWNER",
  1214. "description": "WG Easy is able to bypass permission checks for it's sub-processes."
  1215. },
  1216. {
  1217. "name": "SYS_CHROOT",
  1218. "description": "WG Easy is able to use chroot."
  1219. },
  1220. {
  1221. "name": "MKNOD",
  1222. "description": "WG Easy is able to create device nodes."
  1223. },
  1224. {
  1225. "name": "DAC_OVERRIDE",
  1226. "description": "WG Easy is able to bypass permission checks."
  1227. },
  1228. {
  1229. "name": "FSETID",
  1230. "description": "WG Easy is able to set file capabilities."
  1231. },
  1232. {
  1233. "name": "KILL",
  1234. "description": "WG Easy is able to kill processes."
  1235. },
  1236. {
  1237. "name": "SETGID",
  1238. "description": "WG Easy is able to set group ID for it's sub-processes."
  1239. },
  1240. {
  1241. "name": "SETUID",
  1242. "description": "WG Easy is able to set user ID for it's sub-processes."
  1243. },
  1244. {
  1245. "name": "SETPCAP",
  1246. "description": "WG Easy is able to set process capabilities."
  1247. },
  1248. {
  1249. "name": "NET_BIND_SERVICE",
  1250. "description": "WG Easy is able to bind to privileged ports."
  1251. },
  1252. {
  1253. "name": "SETFCAP",
  1254. "description": "WG Easy is able to set file capabilities."
  1255. },
  1256. {
  1257. "name": "NET_RAW",
  1258. "description": "WG Easy is able to use raw sockets."
  1259. },
  1260. {
  1261. "name": "AUDIT_WRITE",
  1262. "description": "WG Easy is able to write to audit log."
  1263. },
  1264. {
  1265. "name": "SYS_MODULE",
  1266. "description": "WG Easy is able to load kernel modules."
  1267. },
  1268. {
  1269. "name": "NET_ADMIN",
  1270. "description": "WG Easy is able to perform various network-related operations."
  1271. }
  1272. ],
  1273. "hostMounts": []
  1274. },
  1275. "schema": {
  1276. "groups": [
  1277. {
  1278. "name": "Configuration",
  1279. "description": "WG-Easy application configuration"
  1280. },
  1281. {
  1282. "name": "Storage",
  1283. "description": "Configure storage for WG-Easy"
  1284. },
  1285. {
  1286. "name": "Networking",
  1287. "description": "Networking Configuration for WG-Easy"
  1288. },
  1289. {
  1290. "name": "Advanced DNS Settings",
  1291. "description": "Configure DNS settings"
  1292. },
  1293. {
  1294. "name": "Resource Limits",
  1295. "description": "Set CPU/memory limits for Kubernetes Pod"
  1296. }
  1297. ],
  1298. "portals": {
  1299. "web_portal": {
  1300. "protocols": [
  1301. "http"
  1302. ],
  1303. "host": [
  1304. "$node_ip"
  1305. ],
  1306. "ports": [
  1307. "$variable-webUIPort"
  1308. ],
  1309. "path": "/"
  1310. }
  1311. },
  1312. "questions": [
  1313. {
  1314. "variable": "wgUDPPort",
  1315. "label": "WireGuard UDP Node Port for WG-Easy",
  1316. "group": "Networking",
  1317. "schema": {
  1318. "type": "int",
  1319. "min": 9000,
  1320. "max": 65535,
  1321. "default": 20920,
  1322. "required": true
  1323. }
  1324. },
  1325. {
  1326. "variable": "webUIPort",
  1327. "label": "WebUI Node Port for WG-Easy",
  1328. "group": "Networking",
  1329. "schema": {
  1330. "type": "int",
  1331. "min": 9000,
  1332. "max": 65535,
  1333. "default": 20921,
  1334. "required": true
  1335. }
  1336. },
  1337. {
  1338. "variable": "hostNetwork",
  1339. "label": "Host Network",
  1340. "group": "Networking",
  1341. "schema": {
  1342. "type": "boolean",
  1343. "default": true
  1344. }
  1345. },
  1346. {
  1347. "variable": "dnsConfig",
  1348. "label": "DNS Configuration",
  1349. "group": "Advanced DNS Settings",
  1350. "schema": {
  1351. "type": "dict",
  1352. "attrs": [
  1353. {
  1354. "variable": "options",
  1355. "label": "DNS Options",
  1356. "schema": {
  1357. "type": "list",
  1358. "items": [
  1359. {
  1360. "variable": "optionsEntry",
  1361. "label": "Option Entry Configuration",
  1362. "schema": {
  1363. "type": "dict",
  1364. "attrs": [
  1365. {
  1366. "variable": "name",
  1367. "label": "Option Name",
  1368. "schema": {
  1369. "type": "string",
  1370. "required": true
  1371. }
  1372. },
  1373. {
  1374. "variable": "value",
  1375. "label": "Option Value",
  1376. "schema": {
  1377. "type": "string",
  1378. "required": true
  1379. }
  1380. }
  1381. ]
  1382. }
  1383. }
  1384. ]
  1385. }
  1386. }
  1387. ]
  1388. }
  1389. },
  1390. {
  1391. "variable": "wgeasy",
  1392. "label": "WG-Easy Configuration",
  1393. "group": "Configuration",
  1394. "schema": {
  1395. "type": "dict",
  1396. "additional_attrs": true,
  1397. "attrs": [
  1398. {
  1399. "variable": "host",
  1400. "label": "Hostname or IP",
  1401. "description": "The public hostname or IP of your VPN server.",
  1402. "schema": {
  1403. "type": "string",
  1404. "required": true,
  1405. "$ref": [
  1406. "definitions/nodeIP"
  1407. ],
  1408. "default": "192.168.0.10"
  1409. }
  1410. },
  1411. {
  1412. "variable": "password",
  1413. "label": "Password for WebUI",
  1414. "description": "When set, requires a password when logging in to the Web UI.",
  1415. "schema": {
  1416. "type": "string",
  1417. "private": true,
  1418. "default": ""
  1419. }
  1420. },
  1421. {
  1422. "variable": "keep_alive",
  1423. "label": "Persistent Keep Alive",
  1424. "description": "Value in seconds to keep the \"connection\" open. If this value is 0, then connections won't be kept alive.",
  1425. "schema": {
  1426. "type": "int",
  1427. "required": true,
  1428. "default": 0
  1429. }
  1430. },
  1431. {
  1432. "variable": "client_mtu",
  1433. "label": "Clients MTU",
  1434. "description": "The MTU the clients will use.",
  1435. "schema": {
  1436. "type": "int",
  1437. "required": true,
  1438. "default": 1420
  1439. }
  1440. },
  1441. {
  1442. "variable": "client_address_range",
  1443. "label": "Clients IP Address Range",
  1444. "description": "Clients IP address range.",
  1445. "schema": {
  1446. "type": "string",
  1447. "required": true,
  1448. "default": "10.8.0.x"
  1449. }
  1450. },
  1451. {
  1452. "variable": "client_dns_server",
  1453. "label": "Clients DNS Server",
  1454. "description": "Clients DNS Server.",
  1455. "schema": {
  1456. "type": "string",
  1457. "required": true,
  1458. "default": "1.1.1.1"
  1459. }
  1460. },
  1461. {
  1462. "variable": "allowed_ips",
  1463. "label": "Allowed IPs",
  1464. "description": "Allowed IPs clients will use. If none provided, <0.0.0.0/0,::/0> will be used.",
  1465. "schema": {
  1466. "type": "list",
  1467. "default": [],
  1468. "items": [
  1469. {
  1470. "variable": "entry",
  1471. "label": "Allowed IP Entry",
  1472. "schema": {
  1473. "type": "string",
  1474. "required": true,
  1475. "default": ""
  1476. }
  1477. }
  1478. ]
  1479. }
  1480. }
  1481. ]
  1482. }
  1483. },
  1484. {
  1485. "variable": "environmentVariables",
  1486. "label": "WG-Easy Environment",
  1487. "group": "Configuration",
  1488. "schema": {
  1489. "type": "list",
  1490. "default": [],
  1491. "items": [
  1492. {
  1493. "variable": "environmentVariable",
  1494. "label": "Environment Variable",
  1495. "schema": {
  1496. "type": "dict",
  1497. "attrs": [
  1498. {
  1499. "variable": "name",
  1500. "label": "Name",
  1501. "schema": {
  1502. "type": "string",
  1503. "required": true,
  1504. "default": ""
  1505. }
  1506. },
  1507. {
  1508. "variable": "value",
  1509. "label": "Value",
  1510. "schema": {
  1511. "type": "string",
  1512. "default": "",
  1513. "required": true
  1514. }
  1515. }
  1516. ]
  1517. }
  1518. }
  1519. ]
  1520. }
  1521. },
  1522. {
  1523. "variable": "appVolumeMounts",
  1524. "label": "WG-Easy Storage",
  1525. "group": "Storage",
  1526. "schema": {
  1527. "type": "dict",
  1528. "attrs": [
  1529. {
  1530. "variable": "config",
  1531. "label": "Configuration Volume",
  1532. "schema": {
  1533. "type": "dict",
  1534. "attrs": [
  1535. {
  1536. "variable": "datasetName",
  1537. "label": "Configuration Volume Dataset Name",
  1538. "schema": {
  1539. "type": "string",
  1540. "hidden": true,
  1541. "$ref": [
  1542. "normalize/ixVolume"
  1543. ],
  1544. "show_if": [
  1545. [
  1546. "hostPathEnabled",
  1547. "=",
  1548. false
  1549. ]
  1550. ],
  1551. "default": "ix-wg-easy_config",
  1552. "editable": false
  1553. }
  1554. },
  1555. {
  1556. "variable": "mountPath",
  1557. "label": "Configuration Mount Path",
  1558. "description": "Path where the volume will be mounted inside the pod",
  1559. "schema": {
  1560. "type": "path",
  1561. "hidden": true,
  1562. "editable": true,
  1563. "default": "/etc/wireguard"
  1564. }
  1565. },
  1566. {
  1567. "variable": "hostPathEnabled",
  1568. "label": "Enable Custom Host Path for WG-Easy Configuration Volume",
  1569. "schema": {
  1570. "type": "boolean",
  1571. "default": false,
  1572. "show_subquestions_if": true,
  1573. "subquestions": [
  1574. {
  1575. "variable": "hostPath",
  1576. "label": "Host Path for WG-Easy Configuration Volume",
  1577. "schema": {
  1578. "type": "hostpath",
  1579. "required": true,
  1580. "immutable": true,
  1581. "$ref": [
  1582. "validations/lockedHostPath"
  1583. ]
  1584. }
  1585. }
  1586. ]
  1587. }
  1588. }
  1589. ]
  1590. }
  1591. }
  1592. ]
  1593. }
  1594. },
  1595. {
  1596. "variable": "extraAppVolumeMounts",
  1597. "label": "Extra Host Path Volumes",
  1598. "group": "Storage",
  1599. "schema": {
  1600. "type": "list",
  1601. "items": [
  1602. {
  1603. "variable": "extraAppVolume",
  1604. "label": "Host Path Volume",
  1605. "description": "Add an extra host path volume for WG-Easy application",
  1606. "schema": {
  1607. "type": "dict",
  1608. "attrs": [
  1609. {
  1610. "variable": "mountPath",
  1611. "label": "Mount Path in Pod",
  1612. "description": "Path where the volume will be mounted inside the pod",
  1613. "schema": {
  1614. "type": "path",
  1615. "required": true
  1616. }
  1617. },
  1618. {
  1619. "variable": "hostPath",
  1620. "label": "Host Path",
  1621. "description": "Host path",
  1622. "schema": {
  1623. "type": "hostpath",
  1624. "required": true,
  1625. "$ref": [
  1626. "validations/lockedHostPath"
  1627. ]
  1628. }
  1629. }
  1630. ]
  1631. }
  1632. }
  1633. ]
  1634. }
  1635. },
  1636. {
  1637. "variable": "enableResourceLimits",
  1638. "label": "Enable Pod resource limits",
  1639. "group": "Resource Limits",
  1640. "schema": {
  1641. "type": "boolean",
  1642. "default": false
  1643. }
  1644. },
  1645. {
  1646. "variable": "cpuLimit",
  1647. "label": "CPU Limit resource limits",
  1648. "description": "CPU resource limit allow plain integer values with suffix m(milli) e.g 1000m, 100.",
  1649. "group": "Resource Limits",
  1650. "schema": {
  1651. "type": "string",
  1652. "show_if": [
  1653. [
  1654. "enableResourceLimits",
  1655. "=",
  1656. true
  1657. ]
  1658. ],
  1659. "valid_chars": "^\\d+(?:\\.\\d+(?!.*m$)|m?$)",
  1660. "default": "4000m"
  1661. }
  1662. },
  1663. {
  1664. "variable": "memLimit",
  1665. "label": "Memory Limit",
  1666. "group": "Resource Limits",
  1667. "description": "Memory limits is specified by number of bytes. Followed by quantity suffix like E,P,T,G,M,k and Ei,Pi,Ti,Mi,Gi,Ki can also be used. e.g 129e6, 129M, 128974848000m, 123Mi",
  1668. "schema": {
  1669. "type": "string",
  1670. "show_if": [
  1671. [
  1672. "enableResourceLimits",
  1673. "=",
  1674. true
  1675. ]
  1676. ],
  1677. "valid_chars": "^([+-]?[0-9.]+)([eEinumkKMGTP]*[-+]?[0-9]*)$",
  1678. "default": "8Gi"
  1679. }
  1680. }
  1681. ]
  1682. },
  1683. "app_readme": "<h1>WG-Easy</h1>\n<p><a href=\"https://github.com/WeeJeWel/wg-easy\">WG-Easy (WireGuard Easy)</a> is the easiest way to install &amp; manage WireGuard!</p>",
  1684. "detailed_readme": "<h1>WG-Easy</h1>\n<p><a href=\"https://github.com/WeeJeWel/wg-easy\">WG-Easy (WireGuard Easy)</a> is the easiest way to install &amp; manage WireGuard!</p>",
  1685. "changelog": null
  1686. }
  1687. }