app_versions.json 108 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689
  1. {
  2. "2.0.0": {
  3. "healthy": true,
  4. "supported": false,
  5. "healthy_error": null,
  6. "location": "/__w/charts/charts/charts/wg-easy/2.0.0",
  7. "last_update": "2023-12-01 12:58:12",
  8. "required_features": [
  9. "normalize/ixVolume",
  10. "normalize/acl",
  11. "definitions/nodeIP"
  12. ],
  13. "human_version": "7_2.0.0",
  14. "version": "2.0.0",
  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.0",
  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.3"
  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": "Web 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. "immutable": true,
  660. "required": true
  661. }
  662. }
  663. ]
  664. }
  665. }
  666. ]
  667. }
  668. },
  669. {
  670. "variable": "additionalStorages",
  671. "label": "Additional Storage",
  672. "description": "Additional storage for WG-Easy.",
  673. "schema": {
  674. "type": "list",
  675. "default": [],
  676. "items": [
  677. {
  678. "variable": "storageEntry",
  679. "label": "Storage Entry",
  680. "schema": {
  681. "type": "dict",
  682. "attrs": [
  683. {
  684. "variable": "type",
  685. "label": "Type",
  686. "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",
  687. "schema": {
  688. "type": "string",
  689. "required": true,
  690. "default": "ixVolume",
  691. "immutable": true,
  692. "enum": [
  693. {
  694. "value": "hostPath",
  695. "description": "Host Path (Path that already exists on the system)"
  696. },
  697. {
  698. "value": "ixVolume",
  699. "description": "ixVolume (Dataset created automatically by the system)"
  700. },
  701. {
  702. "value": "smb-pv-pvc",
  703. "description": "SMB Share (Mounts a persistent volume claim to a SMB share)"
  704. }
  705. ]
  706. }
  707. },
  708. {
  709. "variable": "readOnly",
  710. "label": "Read Only",
  711. "description": "Mount the volume as read only.",
  712. "schema": {
  713. "type": "boolean",
  714. "default": false
  715. }
  716. },
  717. {
  718. "variable": "mountPath",
  719. "label": "Mount Path",
  720. "description": "The path inside the container to mount the storage.",
  721. "schema": {
  722. "type": "path",
  723. "required": true
  724. }
  725. },
  726. {
  727. "variable": "hostPathConfig",
  728. "label": "Host Path Config",
  729. "schema": {
  730. "type": "dict",
  731. "show_if": [
  732. [
  733. "type",
  734. "=",
  735. "hostPath"
  736. ]
  737. ],
  738. "attrs": [
  739. {
  740. "variable": "aclEnable",
  741. "label": "Enable ACL",
  742. "description": "Enable ACL for the dataset.",
  743. "schema": {
  744. "type": "boolean",
  745. "default": false
  746. }
  747. },
  748. {
  749. "variable": "acl",
  750. "label": "ACL Configuration",
  751. "schema": {
  752. "type": "dict",
  753. "show_if": [
  754. [
  755. "aclEnable",
  756. "=",
  757. true
  758. ]
  759. ],
  760. "attrs": [
  761. {
  762. "variable": "path",
  763. "label": "Host Path",
  764. "description": "Host Path to perform ACL",
  765. "schema": {
  766. "type": "hostpath",
  767. "required": true,
  768. "empty": false
  769. }
  770. },
  771. {
  772. "variable": "entries",
  773. "label": "ACL Entries",
  774. "description": "ACL Entries",
  775. "schema": {
  776. "type": "list",
  777. "items": [
  778. {
  779. "variable": "aclEntry",
  780. "label": "ACL Entry",
  781. "schema": {
  782. "type": "dict",
  783. "attrs": [
  784. {
  785. "variable": "id_type",
  786. "label": "ID Type",
  787. "schema": {
  788. "type": "string",
  789. "enum": [
  790. {
  791. "value": "USER",
  792. "description": "Entry is for a USER"
  793. },
  794. {
  795. "value": "GROUP",
  796. "description": "Entry is for a GROUP"
  797. }
  798. ],
  799. "default": "USER"
  800. }
  801. },
  802. {
  803. "variable": "id",
  804. "label": "ID",
  805. "description": "Make sure to check the ID value is correct and aligns with RunAs user context of the application",
  806. "schema": {
  807. "type": "int",
  808. "required": true,
  809. "min": 0
  810. }
  811. },
  812. {
  813. "variable": "access",
  814. "label": "Access",
  815. "schema": {
  816. "type": "string",
  817. "enum": [
  818. {
  819. "value": "READ",
  820. "description": "Read Access"
  821. },
  822. {
  823. "value": "MODIFY",
  824. "description": "Modify Access"
  825. },
  826. {
  827. "value": "FULL_CONTROL",
  828. "description": "FULL_CONTROL Access"
  829. }
  830. ]
  831. }
  832. }
  833. ]
  834. }
  835. }
  836. ]
  837. }
  838. },
  839. {
  840. "variable": "options",
  841. "label": "ACL Options",
  842. "schema": {
  843. "type": "dict",
  844. "attrs": [
  845. {
  846. "variable": "force",
  847. "label": "Force Flag",
  848. "description": "Enabling `Force` applies ACL even if the path has existing data",
  849. "schema": {
  850. "type": "boolean",
  851. "default": false
  852. }
  853. }
  854. ]
  855. }
  856. }
  857. ],
  858. "$ref": [
  859. "normalize/acl"
  860. ]
  861. }
  862. },
  863. {
  864. "variable": "hostPath",
  865. "label": "Host Path",
  866. "description": "The host path to use for storage.",
  867. "schema": {
  868. "type": "hostpath",
  869. "show_if": [
  870. [
  871. "aclEnable",
  872. "=",
  873. false
  874. ]
  875. ],
  876. "immutable": true,
  877. "required": true
  878. }
  879. }
  880. ]
  881. }
  882. },
  883. {
  884. "variable": "ixVolumeConfig",
  885. "label": "ixVolume Configuration",
  886. "description": "The configuration for the ixVolume dataset.",
  887. "schema": {
  888. "type": "dict",
  889. "show_if": [
  890. [
  891. "type",
  892. "=",
  893. "ixVolume"
  894. ]
  895. ],
  896. "$ref": [
  897. "normalize/ixVolume"
  898. ],
  899. "attrs": [
  900. {
  901. "variable": "aclEnable",
  902. "label": "Enable ACL",
  903. "description": "Enable ACL for the dataset.",
  904. "schema": {
  905. "type": "boolean",
  906. "default": false
  907. }
  908. },
  909. {
  910. "variable": "datasetName",
  911. "label": "Dataset Name",
  912. "description": "The name of the dataset to use for storage.",
  913. "schema": {
  914. "type": "string",
  915. "required": true,
  916. "immutable": true,
  917. "default": "storage_entry"
  918. }
  919. },
  920. {
  921. "variable": "aclEntries",
  922. "label": "ACL Configuration",
  923. "schema": {
  924. "type": "dict",
  925. "show_if": [
  926. [
  927. "aclEnable",
  928. "=",
  929. true
  930. ]
  931. ],
  932. "attrs": [
  933. {
  934. "variable": "path",
  935. "label": "Path",
  936. "description": "Path to perform ACL",
  937. "schema": {
  938. "type": "string",
  939. "hidden": true
  940. }
  941. },
  942. {
  943. "variable": "entries",
  944. "label": "ACL Entries",
  945. "description": "ACL Entries",
  946. "schema": {
  947. "type": "list",
  948. "items": [
  949. {
  950. "variable": "aclEntry",
  951. "label": "ACL Entry",
  952. "schema": {
  953. "type": "dict",
  954. "attrs": [
  955. {
  956. "variable": "id_type",
  957. "label": "ID Type",
  958. "schema": {
  959. "type": "string",
  960. "enum": [
  961. {
  962. "value": "USER",
  963. "description": "Entry is for a USER"
  964. },
  965. {
  966. "value": "GROUP",
  967. "description": "Entry is for a GROUP"
  968. }
  969. ],
  970. "default": "USER"
  971. }
  972. },
  973. {
  974. "variable": "id",
  975. "label": "ID",
  976. "description": "Make sure to check the ID value is correct and aligns with RunAs user context of the application",
  977. "schema": {
  978. "type": "int",
  979. "required": true,
  980. "min": 0
  981. }
  982. },
  983. {
  984. "variable": "access",
  985. "label": "Access",
  986. "schema": {
  987. "type": "string",
  988. "enum": [
  989. {
  990. "value": "READ",
  991. "description": "Read Access"
  992. },
  993. {
  994. "value": "MODIFY",
  995. "description": "Modify Access"
  996. },
  997. {
  998. "value": "FULL_CONTROL",
  999. "description": "FULL_CONTROL Access"
  1000. }
  1001. ]
  1002. }
  1003. }
  1004. ]
  1005. }
  1006. }
  1007. ]
  1008. }
  1009. }
  1010. ]
  1011. }
  1012. }
  1013. ]
  1014. }
  1015. },
  1016. {
  1017. "variable": "smbConfig",
  1018. "label": "SMB Share Configuration",
  1019. "description": "The configuration for the SMB Share.",
  1020. "schema": {
  1021. "type": "dict",
  1022. "show_if": [
  1023. [
  1024. "type",
  1025. "=",
  1026. "smb-pv-pvc"
  1027. ]
  1028. ],
  1029. "attrs": [
  1030. {
  1031. "variable": "server",
  1032. "label": "Server",
  1033. "description": "The server for the SMB share.",
  1034. "schema": {
  1035. "type": "string",
  1036. "required": true
  1037. }
  1038. },
  1039. {
  1040. "variable": "share",
  1041. "label": "Share",
  1042. "description": "The share name for the SMB share.",
  1043. "schema": {
  1044. "type": "string",
  1045. "required": true
  1046. }
  1047. },
  1048. {
  1049. "variable": "domain",
  1050. "label": "Domain (Optional)",
  1051. "description": "The domain for the SMB share.",
  1052. "schema": {
  1053. "type": "string"
  1054. }
  1055. },
  1056. {
  1057. "variable": "username",
  1058. "label": "Username",
  1059. "description": "The username for the SMB share.",
  1060. "schema": {
  1061. "type": "string",
  1062. "required": true
  1063. }
  1064. },
  1065. {
  1066. "variable": "password",
  1067. "label": "Password",
  1068. "description": "The password for the SMB share.",
  1069. "schema": {
  1070. "type": "string",
  1071. "required": true,
  1072. "private": true
  1073. }
  1074. },
  1075. {
  1076. "variable": "size",
  1077. "label": "Size (in Gi)",
  1078. "description": "The size of the volume quota.",
  1079. "schema": {
  1080. "type": "int",
  1081. "required": true,
  1082. "min": 1,
  1083. "default": 1
  1084. }
  1085. }
  1086. ]
  1087. }
  1088. }
  1089. ]
  1090. }
  1091. }
  1092. ]
  1093. }
  1094. }
  1095. ]
  1096. }
  1097. },
  1098. {
  1099. "variable": "resources",
  1100. "group": "Resources Configuration",
  1101. "label": "",
  1102. "schema": {
  1103. "type": "dict",
  1104. "attrs": [
  1105. {
  1106. "variable": "limits",
  1107. "label": "Limits",
  1108. "schema": {
  1109. "type": "dict",
  1110. "attrs": [
  1111. {
  1112. "variable": "cpu",
  1113. "label": "CPU",
  1114. "description": "CPU limit for WG-Easy.",
  1115. "schema": {
  1116. "type": "string",
  1117. "max_length": 6,
  1118. "valid_chars": "^(0\\.[1-9]|[1-9][0-9]*)(\\.[0-9]|m?)$",
  1119. "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",
  1120. "default": "4000m",
  1121. "required": true
  1122. }
  1123. },
  1124. {
  1125. "variable": "memory",
  1126. "label": "Memory",
  1127. "description": "Memory limit for WG-Easy.",
  1128. "schema": {
  1129. "type": "string",
  1130. "max_length": 12,
  1131. "valid_chars": "^[1-9][0-9]*([EPTGMK]i?|e[0-9]+)?$",
  1132. "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",
  1133. "default": "8Gi",
  1134. "required": true
  1135. }
  1136. }
  1137. ]
  1138. }
  1139. }
  1140. ]
  1141. }
  1142. }
  1143. ]
  1144. },
  1145. "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>",
  1146. "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>",
  1147. "changelog": null
  1148. },
  1149. "1.0.12": {
  1150. "healthy": true,
  1151. "supported": true,
  1152. "healthy_error": null,
  1153. "location": "/__w/charts/charts/charts/wg-easy/1.0.12",
  1154. "last_update": "2023-12-01 12:58:12",
  1155. "required_features": [
  1156. "normalize/ixVolume",
  1157. "definitions/nodeIP",
  1158. "validations/lockedHostPath"
  1159. ],
  1160. "human_version": "7_1.0.12",
  1161. "version": "1.0.12",
  1162. "chart_metadata": {
  1163. "name": "wg-easy",
  1164. "description": "WG-Easy is the easiest way to install & manage WireGuard!",
  1165. "annotations": {
  1166. "title": "WG Easy"
  1167. },
  1168. "type": "application",
  1169. "version": "1.0.12",
  1170. "apiVersion": "v2",
  1171. "appVersion": "7",
  1172. "kubeVersion": ">=1.16.0-0",
  1173. "maintainers": [
  1174. {
  1175. "name": "truenas",
  1176. "url": "https://www.truenas.com/",
  1177. "email": "dev@ixsystems.com"
  1178. }
  1179. ],
  1180. "dependencies": [
  1181. {
  1182. "name": "common",
  1183. "repository": "file://../../../common/2304.0.1",
  1184. "version": "2304.0.1"
  1185. }
  1186. ],
  1187. "home": "https://github.com/WeeJeWel/wg-easy",
  1188. "icon": "https://media.sys.truenas.net/apps/wg-easy/icons/icon.png",
  1189. "sources": [
  1190. "https://github.com/WeeJeWel/wg-easy",
  1191. "https://github.com/truenas/charts/tree/master/charts/wg-easy"
  1192. ],
  1193. "keywords": [
  1194. "wireguard",
  1195. "network",
  1196. "vpn"
  1197. ]
  1198. },
  1199. "app_metadata": {
  1200. "runAsContext": [
  1201. {
  1202. "userName": "root",
  1203. "groupName": "root",
  1204. "gid": 0,
  1205. "uid": 0,
  1206. "description": "WG Easy runs as root user."
  1207. }
  1208. ],
  1209. "capabilities": [
  1210. {
  1211. "name": "CHOWN",
  1212. "description": "WG Easy is able to chown files."
  1213. },
  1214. {
  1215. "name": "FOWNER",
  1216. "description": "WG Easy is able to bypass permission checks for it's sub-processes."
  1217. },
  1218. {
  1219. "name": "SYS_CHROOT",
  1220. "description": "WG Easy is able to use chroot."
  1221. },
  1222. {
  1223. "name": "MKNOD",
  1224. "description": "WG Easy is able to create device nodes."
  1225. },
  1226. {
  1227. "name": "DAC_OVERRIDE",
  1228. "description": "WG Easy is able to bypass permission checks."
  1229. },
  1230. {
  1231. "name": "FSETID",
  1232. "description": "WG Easy is able to set file capabilities."
  1233. },
  1234. {
  1235. "name": "KILL",
  1236. "description": "WG Easy is able to kill processes."
  1237. },
  1238. {
  1239. "name": "SETGID",
  1240. "description": "WG Easy is able to set group ID for it's sub-processes."
  1241. },
  1242. {
  1243. "name": "SETUID",
  1244. "description": "WG Easy is able to set user ID for it's sub-processes."
  1245. },
  1246. {
  1247. "name": "SETPCAP",
  1248. "description": "WG Easy is able to set process capabilities."
  1249. },
  1250. {
  1251. "name": "NET_BIND_SERVICE",
  1252. "description": "WG Easy is able to bind to privileged ports."
  1253. },
  1254. {
  1255. "name": "SETFCAP",
  1256. "description": "WG Easy is able to set file capabilities."
  1257. },
  1258. {
  1259. "name": "NET_RAW",
  1260. "description": "WG Easy is able to use raw sockets."
  1261. },
  1262. {
  1263. "name": "AUDIT_WRITE",
  1264. "description": "WG Easy is able to write to audit log."
  1265. },
  1266. {
  1267. "name": "SYS_MODULE",
  1268. "description": "WG Easy is able to load kernel modules."
  1269. },
  1270. {
  1271. "name": "NET_ADMIN",
  1272. "description": "WG Easy is able to perform various network-related operations."
  1273. }
  1274. ],
  1275. "hostMounts": []
  1276. },
  1277. "schema": {
  1278. "groups": [
  1279. {
  1280. "name": "Configuration",
  1281. "description": "WG-Easy application configuration"
  1282. },
  1283. {
  1284. "name": "Storage",
  1285. "description": "Configure storage for WG-Easy"
  1286. },
  1287. {
  1288. "name": "Networking",
  1289. "description": "Networking Configuration for WG-Easy"
  1290. },
  1291. {
  1292. "name": "Advanced DNS Settings",
  1293. "description": "Configure DNS settings"
  1294. },
  1295. {
  1296. "name": "Resource Limits",
  1297. "description": "Set CPU/memory limits for Kubernetes Pod"
  1298. }
  1299. ],
  1300. "portals": {
  1301. "web_portal": {
  1302. "protocols": [
  1303. "http"
  1304. ],
  1305. "host": [
  1306. "$node_ip"
  1307. ],
  1308. "ports": [
  1309. "$variable-webUIPort"
  1310. ],
  1311. "path": "/"
  1312. }
  1313. },
  1314. "questions": [
  1315. {
  1316. "variable": "wgUDPPort",
  1317. "label": "WireGuard UDP Node Port for WG-Easy",
  1318. "group": "Networking",
  1319. "schema": {
  1320. "type": "int",
  1321. "min": 9000,
  1322. "max": 65535,
  1323. "default": 20920,
  1324. "required": true
  1325. }
  1326. },
  1327. {
  1328. "variable": "webUIPort",
  1329. "label": "WebUI Node Port for WG-Easy",
  1330. "group": "Networking",
  1331. "schema": {
  1332. "type": "int",
  1333. "min": 9000,
  1334. "max": 65535,
  1335. "default": 20921,
  1336. "required": true
  1337. }
  1338. },
  1339. {
  1340. "variable": "hostNetwork",
  1341. "label": "Host Network",
  1342. "group": "Networking",
  1343. "schema": {
  1344. "type": "boolean",
  1345. "default": true
  1346. }
  1347. },
  1348. {
  1349. "variable": "dnsConfig",
  1350. "label": "DNS Configuration",
  1351. "group": "Advanced DNS Settings",
  1352. "schema": {
  1353. "type": "dict",
  1354. "attrs": [
  1355. {
  1356. "variable": "options",
  1357. "label": "DNS Options",
  1358. "schema": {
  1359. "type": "list",
  1360. "items": [
  1361. {
  1362. "variable": "optionsEntry",
  1363. "label": "Option Entry Configuration",
  1364. "schema": {
  1365. "type": "dict",
  1366. "attrs": [
  1367. {
  1368. "variable": "name",
  1369. "label": "Option Name",
  1370. "schema": {
  1371. "type": "string",
  1372. "required": true
  1373. }
  1374. },
  1375. {
  1376. "variable": "value",
  1377. "label": "Option Value",
  1378. "schema": {
  1379. "type": "string",
  1380. "required": true
  1381. }
  1382. }
  1383. ]
  1384. }
  1385. }
  1386. ]
  1387. }
  1388. }
  1389. ]
  1390. }
  1391. },
  1392. {
  1393. "variable": "wgeasy",
  1394. "label": "WG-Easy Configuration",
  1395. "group": "Configuration",
  1396. "schema": {
  1397. "type": "dict",
  1398. "additional_attrs": true,
  1399. "attrs": [
  1400. {
  1401. "variable": "host",
  1402. "label": "Hostname or IP",
  1403. "description": "The public hostname or IP of your VPN server.",
  1404. "schema": {
  1405. "type": "string",
  1406. "required": true,
  1407. "$ref": [
  1408. "definitions/nodeIP"
  1409. ],
  1410. "default": "192.168.0.10"
  1411. }
  1412. },
  1413. {
  1414. "variable": "password",
  1415. "label": "Password for WebUI",
  1416. "description": "When set, requires a password when logging in to the Web UI.",
  1417. "schema": {
  1418. "type": "string",
  1419. "private": true,
  1420. "default": ""
  1421. }
  1422. },
  1423. {
  1424. "variable": "keep_alive",
  1425. "label": "Persistent Keep Alive",
  1426. "description": "Value in seconds to keep the \"connection\" open. If this value is 0, then connections won't be kept alive.",
  1427. "schema": {
  1428. "type": "int",
  1429. "required": true,
  1430. "default": 0
  1431. }
  1432. },
  1433. {
  1434. "variable": "client_mtu",
  1435. "label": "Clients MTU",
  1436. "description": "The MTU the clients will use.",
  1437. "schema": {
  1438. "type": "int",
  1439. "required": true,
  1440. "default": 1420
  1441. }
  1442. },
  1443. {
  1444. "variable": "client_address_range",
  1445. "label": "Clients IP Address Range",
  1446. "description": "Clients IP address range.",
  1447. "schema": {
  1448. "type": "string",
  1449. "required": true,
  1450. "default": "10.8.0.x"
  1451. }
  1452. },
  1453. {
  1454. "variable": "client_dns_server",
  1455. "label": "Clients DNS Server",
  1456. "description": "Clients DNS Server.",
  1457. "schema": {
  1458. "type": "string",
  1459. "required": true,
  1460. "default": "1.1.1.1"
  1461. }
  1462. },
  1463. {
  1464. "variable": "allowed_ips",
  1465. "label": "Allowed IPs",
  1466. "description": "Allowed IPs clients will use. If none provided, <0.0.0.0/0,::/0> will be used.",
  1467. "schema": {
  1468. "type": "list",
  1469. "default": [],
  1470. "items": [
  1471. {
  1472. "variable": "entry",
  1473. "label": "Allowed IP Entry",
  1474. "schema": {
  1475. "type": "string",
  1476. "required": true,
  1477. "default": ""
  1478. }
  1479. }
  1480. ]
  1481. }
  1482. }
  1483. ]
  1484. }
  1485. },
  1486. {
  1487. "variable": "environmentVariables",
  1488. "label": "WG-Easy Environment",
  1489. "group": "Configuration",
  1490. "schema": {
  1491. "type": "list",
  1492. "default": [],
  1493. "items": [
  1494. {
  1495. "variable": "environmentVariable",
  1496. "label": "Environment Variable",
  1497. "schema": {
  1498. "type": "dict",
  1499. "attrs": [
  1500. {
  1501. "variable": "name",
  1502. "label": "Name",
  1503. "schema": {
  1504. "type": "string",
  1505. "required": true,
  1506. "default": ""
  1507. }
  1508. },
  1509. {
  1510. "variable": "value",
  1511. "label": "Value",
  1512. "schema": {
  1513. "type": "string",
  1514. "default": "",
  1515. "required": true
  1516. }
  1517. }
  1518. ]
  1519. }
  1520. }
  1521. ]
  1522. }
  1523. },
  1524. {
  1525. "variable": "appVolumeMounts",
  1526. "label": "WG-Easy Storage",
  1527. "group": "Storage",
  1528. "schema": {
  1529. "type": "dict",
  1530. "attrs": [
  1531. {
  1532. "variable": "config",
  1533. "label": "Configuration Volume",
  1534. "schema": {
  1535. "type": "dict",
  1536. "attrs": [
  1537. {
  1538. "variable": "datasetName",
  1539. "label": "Configuration Volume Dataset Name",
  1540. "schema": {
  1541. "type": "string",
  1542. "hidden": true,
  1543. "$ref": [
  1544. "normalize/ixVolume"
  1545. ],
  1546. "show_if": [
  1547. [
  1548. "hostPathEnabled",
  1549. "=",
  1550. false
  1551. ]
  1552. ],
  1553. "default": "ix-wg-easy_config",
  1554. "editable": false
  1555. }
  1556. },
  1557. {
  1558. "variable": "mountPath",
  1559. "label": "Configuration Mount Path",
  1560. "description": "Path where the volume will be mounted inside the pod",
  1561. "schema": {
  1562. "type": "path",
  1563. "hidden": true,
  1564. "editable": true,
  1565. "default": "/etc/wireguard"
  1566. }
  1567. },
  1568. {
  1569. "variable": "hostPathEnabled",
  1570. "label": "Enable Custom Host Path for WG-Easy Configuration Volume",
  1571. "schema": {
  1572. "type": "boolean",
  1573. "default": false,
  1574. "show_subquestions_if": true,
  1575. "subquestions": [
  1576. {
  1577. "variable": "hostPath",
  1578. "label": "Host Path for WG-Easy Configuration Volume",
  1579. "schema": {
  1580. "type": "hostpath",
  1581. "required": true,
  1582. "immutable": true,
  1583. "$ref": [
  1584. "validations/lockedHostPath"
  1585. ]
  1586. }
  1587. }
  1588. ]
  1589. }
  1590. }
  1591. ]
  1592. }
  1593. }
  1594. ]
  1595. }
  1596. },
  1597. {
  1598. "variable": "extraAppVolumeMounts",
  1599. "label": "Extra Host Path Volumes",
  1600. "group": "Storage",
  1601. "schema": {
  1602. "type": "list",
  1603. "items": [
  1604. {
  1605. "variable": "extraAppVolume",
  1606. "label": "Host Path Volume",
  1607. "description": "Add an extra host path volume for WG-Easy application",
  1608. "schema": {
  1609. "type": "dict",
  1610. "attrs": [
  1611. {
  1612. "variable": "mountPath",
  1613. "label": "Mount Path in Pod",
  1614. "description": "Path where the volume will be mounted inside the pod",
  1615. "schema": {
  1616. "type": "path",
  1617. "required": true
  1618. }
  1619. },
  1620. {
  1621. "variable": "hostPath",
  1622. "label": "Host Path",
  1623. "description": "Host path",
  1624. "schema": {
  1625. "type": "hostpath",
  1626. "required": true,
  1627. "$ref": [
  1628. "validations/lockedHostPath"
  1629. ]
  1630. }
  1631. }
  1632. ]
  1633. }
  1634. }
  1635. ]
  1636. }
  1637. },
  1638. {
  1639. "variable": "enableResourceLimits",
  1640. "label": "Enable Pod resource limits",
  1641. "group": "Resource Limits",
  1642. "schema": {
  1643. "type": "boolean",
  1644. "default": false
  1645. }
  1646. },
  1647. {
  1648. "variable": "cpuLimit",
  1649. "label": "CPU Limit resource limits",
  1650. "description": "CPU resource limit allow plain integer values with suffix m(milli) e.g 1000m, 100.",
  1651. "group": "Resource Limits",
  1652. "schema": {
  1653. "type": "string",
  1654. "show_if": [
  1655. [
  1656. "enableResourceLimits",
  1657. "=",
  1658. true
  1659. ]
  1660. ],
  1661. "valid_chars": "^\\d+(?:\\.\\d+(?!.*m$)|m?$)",
  1662. "default": "4000m"
  1663. }
  1664. },
  1665. {
  1666. "variable": "memLimit",
  1667. "label": "Memory Limit",
  1668. "group": "Resource Limits",
  1669. "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",
  1670. "schema": {
  1671. "type": "string",
  1672. "show_if": [
  1673. [
  1674. "enableResourceLimits",
  1675. "=",
  1676. true
  1677. ]
  1678. ],
  1679. "valid_chars": "^([+-]?[0-9.]+)([eEinumkKMGTP]*[-+]?[0-9]*)$",
  1680. "default": "8Gi"
  1681. }
  1682. }
  1683. ]
  1684. },
  1685. "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>",
  1686. "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>",
  1687. "changelog": null
  1688. }
  1689. }