mirror of
				https://github.com/NginxProxyManager/nginx-proxy-manager.git
				synced 2025-10-31 07:43:33 +00:00 
			
		
		
		
	Compare commits
	
		
			1020 Commits
		
	
	
		
			2.0.14
			...
			2145df0dfb
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | 2145df0dfb | ||
|  | 331c761a1c | ||
|  | 03b3b6379b | ||
|  | 050c087a51 | ||
|  | 61c41b8ec3 | ||
|  | 47d7896301 | ||
|  | d048d1fc98 | ||
|  | 3774a40498 | ||
|  | 208037946f | ||
|  | f23299f793 | ||
|  | aa15052eea | ||
|  | c556b8acef | ||
|  | 4d60876394 | ||
|  | 6e820a36ac | ||
|  | a277a5d167 | ||
|  | 8434a2d1fa | ||
|  | bee6a83f33 | ||
|  | b37ef94c22 | ||
|  | 3f6ac9a021 | ||
|  | 1d5f390f9b | ||
|  | d2048e540d | ||
|  | d121de808c | ||
|  | 4d3d37eaed | ||
|  | 0cd2e07fd3 | ||
|  | 0a18a565c7 | ||
|  | c4db4a2647 | ||
|  | e78dd069f1 | ||
|  | 9a2e5c92d5 | ||
|  | 833dd23dce | ||
|  | 514520ce1a | ||
|  | 21e3bce95d | ||
|  | 5dd81c071f | ||
|  | 269d088a60 | ||
|  | f73e09007a | ||
|  | 16c0276401 | ||
|  | 1831fdff2d | ||
|  | 8474b1cdec | ||
|  | 6d2cf77fb2 | ||
|  | ac0074ea86 | ||
|  | 52bd7b1d8f | ||
|  | 70cfbfb1b0 | ||
|  | 42cd1f2866 | ||
|  | ecc3b2b5b7 | ||
|  | ae9504584c | ||
|  | fb880616c7 | ||
|  | e1b757e177 | ||
|  | 6a8197d156 | ||
|  | be0ce673ff | ||
|  | 6da020aab1 | ||
|  | 689bcb0077 | ||
|  | fd041d9b3c | ||
|  | 9ac0e8c943 | ||
|  | 155e09407f | ||
|  | db95a465c8 | ||
|  | 6584f87dd2 | ||
|  | b076f5b3b6 | ||
|  | e5ade3b4ea | ||
|  | 7f9a1f5a98 | ||
|  | d94e304f31 | ||
|  | 3379f3a665 | ||
|  | 4ec1b4ed5a | ||
|  | 43d989474e | ||
|  | 1e0baa3911 | ||
|  | d8a3726f3a | ||
|  | 9faa36315f | ||
|  | e4e70ae6be | ||
|  | d555af68fe | ||
|  | 26f708d980 | ||
|  | 2ffb54a720 | ||
|  | b123ca4fd0 | ||
|  | 72b071dbaa | ||
|  | fd277973cd | ||
|  | aae95798b2 | ||
|  | d437c6b743 | ||
|  | f3018115ba | ||
|  | a0e17f9678 | ||
|  | 9b32329f41 | ||
|  | 001583b308 | ||
|  | 3df8e74bc8 | ||
|  | 042a74cc21 | ||
|  | fd7095ad88 | ||
|  | 6d6021c9bb | ||
|  | 824a22efad | ||
|  | ed609f0bec | ||
|  | b437119535 | ||
|  | d5a75bb708 | ||
|  | 512f5109d4 | ||
|  | d300095ab5 | ||
|  | 8d8921a0dd | ||
|  | ac8fa0d737 | ||
|  | b2592d9351 | ||
|  | adf0030b1c | ||
|  | 63845377d9 | ||
|  | 4b4c7baea4 | ||
|  | 94b6971ef7 | ||
|  | b725153a5e | ||
|  | da82020be4 | ||
|  | e7791c2a0f | ||
|  | 0461689d65 | ||
|  | aec0a606af | ||
|  | f55a7a792f | ||
|  | 4b0d901c93 | ||
|  | 4a57956093 | ||
|  | 88f3953f92 | ||
|  | 0d3e152306 | ||
|  | 9234c2c007 | ||
|  | 98ff4a7dcc | ||
|  | 7edcb8e3cc | ||
|  | 0387d36ebe | ||
|  | 047c4bf6e6 | ||
|  | 8cefea916a | ||
|  | 3c1b4fdf34 | ||
|  | e0773b1c06 | ||
|  | 3301800f42 | ||
|  | 4dd6fd06f4 | ||
|  | 1c57a9b2a5 | ||
|  | a9d1ccde38 | ||
|  | dde368f733 | ||
|  | cbcb0cc0f8 | ||
|  | fd365dc8fd | ||
|  | c849938da2 | ||
|  | 4b39ef0eba | ||
|  | 1ae247b2a6 | ||
|  | a2f192280b | ||
|  | 81c1a7eb16 | ||
|  | 030f3c9d83 | ||
|  | b4365f5c54 | ||
|  | e889714642 | ||
|  | e61cf52a65 | ||
|  | e6ae25d081 | ||
|  | ceb62fb0f2 | ||
|  | 29990110b1 | ||
|  | b4e5b8b6db | ||
|  | d6e96dc3cb | ||
|  | ab772d645b | ||
|  | f43e41d7d0 | ||
|  | fb8ca0b02f | ||
|  | e7ef809b10 | ||
|  | 798db6cb21 | ||
|  | 7745f8242b | ||
|  | 00aaa024a6 | ||
|  | a5166435ff | ||
|  | e3ce8b4d12 | ||
|  | c0c89e5d15 | ||
|  | fe46da3355 | ||
|  | 6ab5224353 | ||
|  | 12909de3c1 | ||
|  | 700518a0a2 | ||
|  | e959e54dc8 | ||
|  | 471ffa8dff | ||
|  | 35cc486fd7 | ||
|  | 292a209195 | ||
|  | 215083f6cf | ||
|  | 35550082bf | ||
|  | 15e4900133 | ||
|  | 6df4ea4d69 | ||
|  | cc9d556665 | ||
|  | cb3f0ec9b4 | ||
|  | 0244187c29 | ||
|  | 0dd713e634 | ||
|  | 972e53df71 | ||
|  | 91fe448782 | ||
|  | cfbd7f05d0 | ||
|  | 3ea9f805f4 | ||
|  | fc2df47753 | ||
|  | 7455accf58 | ||
|  | 83a9666807 | ||
|  | 6681da605e | ||
|  | e433bdaeec | ||
|  | 5b4fe24957 | ||
|  | 7166654215 | ||
|  | c8a255178e | ||
|  | 5f27b9243f | ||
|  | 6b7ae48570 | ||
|  | bc3d9ec099 | ||
|  | 0eeed1695c | ||
|  | 83e432793b | ||
|  | 6cdfd9ebc1 | ||
|  | ecbc55f318 | ||
|  | c288886fd4 | ||
|  | 80315bd50e | ||
|  | a2b4fbc36f | ||
|  | df33db24bb | ||
|  | 437b06b64b | ||
|  | f649e2946e | ||
|  | 1b61176818 | ||
|  | 374447ccc7 | ||
|  | af9349d4a7 | ||
|  | 4ff911def0 | ||
|  | e890bfcf10 | ||
|  | 9a5cbbba49 | ||
|  | b877bea86c | ||
|  | 306ac20457 | ||
|  | ba138581e1 | ||
|  | 456c59c746 | ||
|  | 6c76c041c4 | ||
|  | a239be993c | ||
|  | a82df0d931 | ||
|  | e4595860f5 | ||
|  | 18ecda7955 | ||
|  | 8ddb191a7a | ||
|  | cd6b772e72 | ||
|  | 29a4ac42d0 | ||
|  | 5d3bc0fabd | ||
|  | 1d5d3ecd7a | ||
|  | 8033d052fe | ||
|  | 6d0bf1c68b | ||
|  | 560f3d9b29 | ||
|  | 7ea64c46e9 | ||
|  | 88b46ef9ef | ||
|  | ef34f01914 | ||
|  | f5b3568893 | ||
|  | 6147ee925e | ||
|  | 5586d16afd | ||
|  | ca4d92d793 | ||
|  | 0a50672ab6 | ||
|  | f6b219772d | ||
|  | ad848a6478 | ||
|  | 0418264070 | ||
|  | 882674867c | ||
|  | e39f18b0d1 | ||
|  | 6efa4e2beb | ||
|  | 17a108f75f | ||
|  | bc6825c148 | ||
|  | 395152c1ab | ||
|  | 5e5f0de0e2 | ||
|  | b3ae2f4dbb | ||
|  | 726b6e69f7 | ||
|  | c00b690ed3 | ||
|  | 8d37f5df8d | ||
|  | 5b6dbaf43e | ||
|  | b8008606fd | ||
|  | f51c12ed9a | ||
|  | 3c0af95468 | ||
|  | ee4c6a3a8b | ||
|  | d44f75af1b | ||
|  | b221446bb0 | ||
|  | 523449f050 | ||
|  | 322048d5af | ||
|  | 671715042e | ||
|  | f37bb2e7dc | ||
|  | 3267832fe5 | ||
|  | e31b01b80e | ||
|  | 0a18432860 | ||
|  | a2baa85b08 | ||
|  | 3bfdc21256 | ||
|  | 49da5d7acc | ||
|  | 5bc2cd9be4 | ||
|  | 07739ee84e | ||
|  | 91d23be4e3 | ||
|  | 9dcb1e1c9c | ||
|  | 5729dddaf9 | ||
|  | d1bb22d768 | ||
|  | db61a9a175 | ||
|  | e4a97d4813 | ||
|  | 8dd6880f8c | ||
|  | 34dfbe2c36 | ||
|  | 2110ecc382 | ||
|  | 4db34f5894 | ||
|  | d1a338107b | ||
|  | 0d0b7e117f | ||
|  | 3538f9719f | ||
|  | feaafdc559 | ||
|  | eb148eb8f0 | ||
|  | e879d41ee4 | ||
|  | bb26f5b2c7 | ||
|  | 8e61d3eadf | ||
|  | 749ab36b1a | ||
|  | c68874743d | ||
|  | 1a76f4ebfc | ||
|  | 59238d1dc1 | ||
|  | 661f3d6899 | ||
|  | 14b889a85f | ||
|  | ac25171420 | ||
|  | 7281ed5968 | ||
|  | dc541b2c72 | ||
|  | 9a854fd8fe | ||
|  | 8eb44c404d | ||
|  | 61b25e1213 | ||
|  | d3a5a3d0d6 | ||
|  | 366fcf0bed | ||
|  | 29c0fcbad6 | ||
|  | de84d5d463 | ||
|  | 078114ee67 | ||
|  | 49f350fb00 | ||
|  | e141b5ff20 | ||
|  | 181f163cb5 | ||
|  | 30a9d3ae8d | ||
|  | 83e09ad5a7 | ||
|  | 8e5255a275 | ||
|  | e4f06368bb | ||
|  | 0edd87324c | ||
|  | 96e034aa75 | ||
|  | 821432263a | ||
|  | 5edb16f36e | ||
|  | a233bc0045 | ||
|  | eed40d095e | ||
|  | 0d0e5295f4 | ||
|  | 51ac4bc688 | ||
|  | 4f97592965 | ||
|  | be5a763d39 | ||
|  | c435ce0224 | ||
|  | 67d8ede247 | ||
|  | 5e98ce32b7 | ||
|  | a2c01655f0 | ||
|  | 3a71281937 | ||
|  | f235ec8b5a | ||
|  | fa7df05b92 | ||
|  | 1f3ac7a9ec | ||
|  | 5bd002a568 | ||
|  | 5fb0cc5fab | ||
|  | 818b9595aa | ||
|  | c78f641e85 | ||
|  | 081380c8d5 | ||
|  | 7e451bce0b | ||
|  | a082ec0604 | ||
|  | 973a10a9d1 | ||
|  | 1ec95096d5 | ||
|  | e81cc45405 | ||
|  | b9ef11e8bf | ||
|  | 0d8dd03c3d | ||
|  | 74d610d9ad | ||
|  | 9146ca6c63 | ||
|  | d7e0ae0fa0 | ||
|  | 29ee48530c | ||
|  | abe53a4bdd | ||
|  | 2d23bedf12 | ||
|  | 4e17fb476b | ||
|  | c803ec7e26 | ||
|  | 7e67f33766 | ||
|  | 9dd5644183 | ||
|  | 5a8028a72d | ||
|  | 747de511d4 | ||
|  | 7800938fd2 | ||
|  | ab80fe13e9 | ||
|  | 5d106c4064 | ||
|  | 2ac1026e4b | ||
|  | b78c7e1c53 | ||
|  | 849bdcda7b | ||
|  | 5aae8cd0e3 | ||
|  | adc5a2020a | ||
|  | 40b1521f72 | ||
|  | ac23c66659 | ||
|  | 84bc33db8a | ||
|  | 6392df36c3 | ||
|  | c82843279c | ||
|  | b394eb8e55 | ||
|  | bb422d4454 | ||
|  | 3dfe23836c | ||
|  | d45f39aae3 | ||
|  | cb091040a8 | ||
|  | ddd538944a | ||
|  | 1f879f67a9 | ||
|  | ee89dedd0f | ||
|  | 9ab5333652 | ||
|  | 3bd97ae1b0 | ||
|  | 432062e0f4 | ||
|  | 0c8bbb4bc2 | ||
|  | 48e96c46d5 | ||
|  | 25e9acf618 | ||
|  | a517e80236 | ||
|  | 3d4d3bc73b | ||
|  | cf4d1f73fa | ||
|  | c203d1a0d8 | ||
|  | 5f29f6b039 | ||
|  | f75b5b867b | ||
|  | 67463ca136 | ||
|  | 8db541f37f | ||
|  | a5229d0e92 | ||
|  | 38ec0f9f95 | ||
|  | 3d80759a21 | ||
|  | d95cd36b3e | ||
|  | 4c6b96ad5d | ||
|  | c3bef2867e | ||
|  | efc5bff2e1 | ||
|  | ffe3db8c08 | ||
|  | 4ada0feae3 | ||
|  | e17de6058e | ||
|  | 9efe6cfb39 | ||
|  | c86a1a50bd | ||
|  | c55476b196 | ||
|  | 3b47decbb0 | ||
|  | d0bfa082e0 | ||
|  | 6b7a8b009e | ||
|  | ca59e585d8 | ||
|  | bbde7a108a | ||
|  | 87731a8b5c | ||
|  | 29d4bd4ccf | ||
|  | 925ad90f91 | ||
|  | 650ae61c43 | ||
|  | 02f3f9704f | ||
|  | da7c3057b4 | ||
|  | 040b45cafa | ||
|  | 8ece310b9f | ||
|  | 96959db3c2 | ||
|  | 6360100611 | ||
|  | b833044cea | ||
|  | 97909830f5 | ||
|  | 8ae2de2f49 | ||
|  | bf7b659e89 | ||
|  | 4e3c7749af | ||
|  | f63441921f | ||
|  | 725ba83606 | ||
|  | 281906c0b5 | ||
|  | 8ed121f43d | ||
|  | 81a9cab2b3 | ||
|  | 8d98a417c5 | ||
|  | 6fa81b179b | ||
|  | 9e169fbb42 | ||
|  | 27f84f880a | ||
|  | 0d9c941b4e | ||
|  | 8865aa9c8c | ||
|  | 6d8c4218f1 | ||
|  | c134a43337 | ||
|  | 780759dc27 | ||
|  | 85128f08f3 | ||
|  | d2f8c1e5f1 | ||
|  | 9c88b9c1e9 | ||
|  | 13fd2ce4e2 | ||
|  | 9979f516d6 | ||
|  | 39a5cd2d6e | ||
|  | 784516283f | ||
|  | ce503232c3 | ||
|  | f2edf9130f | ||
|  | 413ab50fc4 | ||
|  | c1880bd3ff | ||
|  | 0f0a672275 | ||
|  | 06c5f991e7 | ||
|  | babc5b7a38 | ||
|  | b96c996a45 | ||
|  | fb8f2c2f9a | ||
|  | 6794937391 | ||
|  | f022e84979 | ||
|  | fd5ac952cc | ||
|  | 07f60e5c77 | ||
|  | 628b8a7e1f | ||
|  | 30a442807d | ||
|  | 1626c8edd1 | ||
|  | ca6561bf6c | ||
|  | 273a81471d | ||
|  | 8b07a67133 | ||
|  | 32089ea272 | ||
|  | 658acd147c | ||
|  | ca3370a6ac | ||
|  | c4e2557de2 | ||
|  | 6f2b4fdf86 | ||
|  | f302ff71c9 | ||
|  | fee87a44d6 | ||
|  | 8944609b63 | ||
|  | be87c45f27 | ||
|  | 1b1807c79a | ||
|  | a8f4699816 | ||
|  | ac3df6dd77 | ||
|  | 5c67908460 | ||
|  | 7b67ef3015 | ||
|  | e5a3b5ee2f | ||
|  | 5e9ff4d2bf | ||
|  | daa71764b6 | ||
|  | 6a6c2ef192 | ||
|  | 320315956d | ||
|  | 4f10d129c2 | ||
|  | 62eb3fcd85 | ||
|  | ab40e4e2cf | ||
|  | 0bb9450642 | ||
|  | a6e15532b9 | ||
|  | 9a89a8a77e | ||
|  | fe3675dc7a | ||
|  | 5c9acc2bff | ||
|  | c94e937a50 | ||
|  | 3e4e10e644 | ||
|  | ba7bb57ca2 | ||
|  | 14c125150a | ||
|  | 053701a702 | ||
|  | 3fc3e43042 | ||
|  | b0dc68d7d4 | ||
|  | e895baaeb4 | ||
|  | c47f6fdb21 | ||
|  | 9e188e441a | ||
|  | f6efcdf9f9 | ||
|  | b1ceda3af4 | ||
|  | cd3a0684d0 | ||
|  | f25e54c6cb | ||
|  | 66f86cf497 | ||
|  | d260edc547 | ||
|  | ba1e6fa984 | ||
|  | 6b59f36213 | ||
|  | 1894960762 | ||
|  | 83c5c55f32 | ||
|  | fb8c0b9a48 | ||
|  | d34691152c | ||
|  | cea80b482e | ||
|  | c460a8fa5c | ||
|  | 5f852437fe | ||
|  | 8aded1a685 | ||
|  | f2acb9e150 | ||
|  | 6f3a00c9b8 | ||
|  | fbae107c04 | ||
|  | 6c1ae77a2a | ||
|  | 67e8ca6714 | ||
|  | a56d976947 | ||
|  | ac0bb6bee2 | ||
|  | dee67dac75 | ||
|  | 9458cfbd1a | ||
|  | 4b8bdd22b3 | ||
|  | a4c143e2d1 | ||
|  | e91019feb9 | ||
|  | 8a37ec72b7 | ||
|  | c263a33095 | ||
|  | 4b2c0115db | ||
|  | 673f40bd85 | ||
|  | b9f8108cd3 | ||
|  | a16ecf656b | ||
|  | 842cff130b | ||
|  | 346b9b4b79 | ||
|  | 56c317d223 | ||
|  | b7b150a979 | ||
|  | fae848bd1b | ||
|  | a5b8087dc5 | ||
|  | 7aa078e025 | ||
|  | 4b6b276b64 | ||
|  | 0373daae5c | ||
|  | 7f30dd0475 | ||
|  | d2a77c2371 | ||
|  | 104f65b541 | ||
|  | d0fb4b6914 | ||
|  | 42c3272def | ||
|  | 2812889d61 | ||
|  | bd3a13b2a5 | ||
|  | 289d179142 | ||
|  | deca493912 | ||
|  | d16bf7d6c0 | ||
|  | 3f1415dad1 | ||
|  | 3e744b6b2d | ||
|  | 56c4f8a106 | ||
|  | 99ef8bae4c | ||
|  | b7f0343730 | ||
|  | c807b59fb4 | ||
|  | 60fc57431a | ||
|  | d988a3a307 | ||
|  | de763d3fa9 | ||
|  | 21bfb61cc8 | ||
|  | a79adeb280 | ||
|  | 9b7a019222 | ||
|  | e65143d276 | ||
|  | 61bb183eda | ||
|  | f3d3a6db91 | ||
|  | 9ebb443cb7 | ||
|  | fa4c4d0a8d | ||
|  | 3e1518fef6 | ||
|  | e59db84721 | ||
|  | c281b31fc8 | ||
|  | 1c93ca9896 | ||
|  | df5836e573 | ||
|  | 41ef35f0d0 | ||
|  | 5e6ce8643f | ||
|  | f575400bc8 | ||
|  | 6d9a335b0e | ||
|  | f94eb5f318 | ||
|  | 245fa421a2 | ||
|  | 655094a816 | ||
|  | d544650b05 | ||
|  | d9d682585c | ||
|  | 44a202552e | ||
|  | fd6673420b | ||
|  | 0e9cd5db9c | ||
|  | 6da6e6f145 | ||
|  | bdaa7460e4 | ||
|  | d6d1c1ac35 | ||
|  | 67958155fc | ||
|  | 198bd74ec6 | ||
|  | 92eec95dad | ||
|  | b73a034fca | ||
|  | 11b508f021 | ||
|  | c2b5be37f9 | ||
|  | 1a04863a08 | ||
|  | 077d3eb993 | ||
|  | ac38221bdf | ||
|  | 9f146b8fc3 | ||
|  | 9a2d9659a7 | ||
|  | 6faae5350a | ||
|  | 2616709e7f | ||
|  | bed9ff084c | ||
|  | fb3082b0bb | ||
|  | c8439b8429 | ||
|  | 4c3632d3e7 | ||
|  | 24d8cd57da | ||
|  | b7c0a8b0c2 | ||
|  | d6d7b22b1e | ||
|  | 5269c957ce | ||
|  | bf8d2672c8 | ||
|  | 8461acab9b | ||
|  | 731ae43fe8 | ||
|  | 5354c85352 | ||
|  | 22a37bb923 | ||
|  | 07bbece704 | ||
|  | 9af2f50d81 | ||
|  | 7b148f7970 | ||
|  | a1e52d919f | ||
|  | 899b487daa | ||
|  | 86eeb5fc44 | ||
|  | 62a708b416 | ||
|  | a7ce8704b3 | ||
|  | 7319a13077 | ||
|  | 95bd4d93c5 | ||
|  | 69c33f0395 | ||
|  | cd4caea2dc | ||
|  | c9daf19940 | ||
|  | 7c2540b193 | ||
|  | 3e600552dc | ||
|  | 69ee6b1699 | ||
|  | ca1ea042b2 | ||
|  | f26df7d9bb | ||
|  | ba45705571 | ||
|  | bf8ea71c77 | ||
|  | 7deb64a5de | ||
|  | e283865d3d | ||
|  | a32be3e96b | ||
|  | 0cfd6eab3f | ||
|  | c2361f13e6 | ||
|  | bc81de54b9 | ||
|  | 07884bc9b1 | ||
|  | 58c3204187 | ||
|  | 19d3deddd4 | ||
|  | f0233b947e | ||
|  | c6a90a2fd0 | ||
|  | 3607c30d98 | ||
|  | 717105f243 | ||
|  | 2373e4a06d | ||
|  | 4c76803f13 | ||
|  | 6a46e88f8f | ||
|  | e4e94d5be0 | ||
|  | a3b896fa70 | ||
|  | 60347a90e9 | ||
|  | a02d4ec46f | ||
|  | 485bae8f22 | ||
|  | 655477316b | ||
|  | e22f87dee7 | ||
|  | d3337322dd | ||
|  | 6202f4f943 | ||
|  | b42cc9ed3e | ||
|  | fbf72c0f61 | ||
|  | cbd0b0c070 | ||
|  | 874f049323 | ||
|  | 42ab4020e2 | ||
|  | 7ab9683b87 | ||
|  | 865facfd05 | ||
|  | 0951f4a202 | ||
|  | 882ec27969 | ||
|  | a84158c1ff | ||
|  | 161d3ec817 | ||
|  | 5b15249689 | ||
|  | 602fce1c7e | ||
|  | f2f653e345 | ||
|  | b55738bd6e | ||
|  | b39a59ce72 | ||
|  | 9872daf29f | ||
|  | 91044e730b | ||
|  | 656a7dceef | ||
|  | d636502eaa | ||
|  | 389fd158ad | ||
|  | 30fa63b379 | ||
|  | 691063545c | ||
|  | 421934efed | ||
|  | f056b9dc7f | ||
|  | 48d421ba28 | ||
|  | 096b714117 | ||
|  | 0d25dc1aaa | ||
|  | 63d3c2d06f | ||
|  | 5fc704ccad | ||
|  | 61d99561c1 | ||
|  | c26ce2083f | ||
|  | 847d71f72a | ||
|  | 3c35039445 | ||
|  | 1a64d44857 | ||
|  | ba5f0c212c | ||
|  | 4eddb5d7f3 | ||
|  | 3b104710d5 | ||
|  | 74db0004bd | ||
|  | 6e67352a0f | ||
|  | b127f02468 | ||
|  | c9c53d9670 | ||
|  | d36dbb868b | ||
|  | b7fb2cfe92 | ||
|  | d0a0c77556 | ||
|  | 9469b9c78a | ||
|  | e4988f34c7 | ||
|  | 1fe9e24f0a | ||
|  | 9c39de3454 | ||
|  | 9bb68ad4eb | ||
|  | 5bf774bee1 | ||
|  | 99514464fb | ||
|  | 3bf1c1e531 | ||
|  | e2e31094aa | ||
|  | f29ff15167 | ||
|  | 1c64252015 | ||
|  | ead19915f3 | ||
|  | 967e0dd98a | ||
|  | bd0324dba0 | ||
|  | 607fb83a1e | ||
|  | bb5fc58f3a | ||
|  | afbec0aca9 | ||
|  | 1e5d9dfbff | ||
|  | cfcb657cde | ||
|  | 7f243e6f06 | ||
|  | 7e7032c051 | ||
|  | b7b808d98d | ||
|  | a21289bf11 | ||
|  | 4a8d01224a | ||
|  | f0eebc43e3 | ||
|  | 49fbf031d1 | ||
|  | 4060718e5c | ||
|  | 49b0f11ae7 | ||
|  | 9b83d35ef4 | ||
|  | eb20add0c7 | ||
|  | 1f122e9145 | ||
|  | 329d0ecaed | ||
|  | 77a2ee948a | ||
|  | ebeda6345e | ||
|  | e35138ebed | ||
|  | 8ba6c4f7e7 | ||
|  | 6df7b72e08 | ||
|  | fe13b12f43 | ||
|  | ea28da90b2 | ||
|  | b243324c65 | ||
|  | a2dde00f40 | ||
|  | 5ff07faa7e | ||
|  | 272c652847 | ||
|  | 3964bbf3fe | ||
|  | 11175aaa5f | ||
|  | 7fcc4a7ef0 | ||
|  | 5abb9458c7 | ||
|  | 0ca5587a6f | ||
|  | d29650882b | ||
|  | 9c3a7b02ec | ||
|  | ef3a073af5 | ||
|  | 15c4857a4b | ||
|  | 63a71afbc8 | ||
|  | 64761ee9c6 | ||
|  | d6c344b5ec | ||
|  | d27826d10e | ||
|  | 4ac52a0e25 | ||
|  | efa841d75a | ||
|  | d1fac583ea | ||
|  | 8cb44c7b97 | ||
|  | f2293a9dda | ||
|  | da0d1d4a2f | ||
|  | 6a8d5e2166 | ||
|  | d732665a23 | ||
|  | e0748c9bc7 | ||
|  | 23573543a3 | ||
|  | bfb328238e | ||
|  | 64cc4f57d6 | ||
|  | 7a3c91c6a4 | ||
|  | 508bc62852 | ||
|  | 59e8446d47 | ||
|  | d13596d2f7 | ||
|  | 9adccfa341 | ||
|  | 5cc3b53378 | ||
|  | b62b0a2fb7 | ||
|  | 1faac4edf2 | ||
|  | 4c60dce169 | ||
|  | 771f31f44d | ||
|  | 8bedb95e1d | ||
|  | ac4be08df2 | ||
|  | 0d6e058e23 | ||
|  | bee2ceb667 | ||
|  | 6af13d4f40 | ||
|  | 9dd0ebd899 | ||
|  | 6e97bfa717 | ||
|  | 07b69f41eb | ||
|  | 6bd2ac7d6d | ||
|  | 528e5ef3bc | ||
|  | bc1c50ac92 | ||
|  | 8c2ab42b75 | ||
|  | 62053d15d4 | ||
|  | 6fed642aba | ||
|  | 72ac549a58 | ||
|  | 9f38617135 | ||
|  | 94eec805df | ||
|  | 05a940e732 | ||
|  | 1c43cc2181 | ||
|  | 657ee73ff1 | ||
|  | 4ee5d993cf | ||
|  | 70a445e2d7 | ||
|  | 2115da210d | ||
|  | 540554c4f6 | ||
|  | 1337c50d28 | ||
|  | c5ceb3b2b1 | ||
|  | 57fc1d8f08 | ||
|  | 1518ecd1e9 | ||
|  | 6be0343918 | ||
|  | cf8812c932 | ||
|  | 5bc3e474a9 | ||
|  | 13eaa346bc | ||
|  | d7437cc4a7 | ||
|  | ddb3c6590c | ||
|  | 89d6773bda | ||
|  | 3651b9484f | ||
|  | 2200c950b7 | ||
|  | 14f84f01b5 | ||
|  | cb014027bb | ||
|  | 32e5155783 | ||
|  | a3159ad59e | ||
|  | 60a40197f1 | ||
|  | 7d693a4271 | ||
|  | f192748bf9 | ||
|  | 96f401cba6 | ||
|  | ffd2430160 | ||
|  | 190cd2d6bb | ||
|  | 7ba58bdbd3 | ||
|  | 08ab62108f | ||
|  | 1028de8158 | ||
|  | 301499dc52 | ||
|  | 5c2f13ed8e | ||
|  | e30ad81f69 | ||
|  | 21f36f535f | ||
|  | c14236823a | ||
|  | 551a9fe1c6 | ||
|  | e3399e1035 | ||
|  | c413b4af3f | ||
|  | dbf5dec23b | ||
|  | 10f0eb17d7 | ||
|  | e3b680c351 | ||
|  | 0df0545777 | ||
|  | 165bfc9f5f | ||
|  | 5830bd73b9 | ||
|  | 3c4ce839b9 | ||
|  | ac9f052309 | ||
|  | 049e424957 | ||
|  | 07e78aec48 | ||
|  | 3fec135fe5 | ||
|  | 867fe1322b | ||
|  | 95208a50a7 | ||
|  | 514b13fcc2 | ||
|  | 4cbc1f5bbe | ||
|  | 64de36cdf2 | ||
|  | 093b48ad7b | ||
|  | 05f6a55a0b | ||
|  | 2523424f68 | ||
|  | b81325d7bf | ||
|  | 3e10b7b2b1 | ||
|  | e5cb750015 | ||
|  | 28f72086ec | ||
|  | a6b9bd7b01 | ||
|  | 2c5eac9dad | ||
|  | 87f61b8527 | ||
|  | 74bfe490c6 | ||
|  | 015167f34d | ||
|  | 4bafc7ff1a | ||
|  | bf8beb50b4 | ||
|  | e5034a34f5 | ||
|  | a561605653 | ||
|  | e8596c1554 | ||
|  | ab67481e99 | ||
|  | 1b611e67c8 | ||
|  | c5aa2b9f77 | ||
|  | cff6c4d1f5 | ||
|  | 077cf75ef2 | ||
|  | ff1770204c | ||
|  | b9a95840e0 | ||
|  | 2d7576c57e | ||
|  | 251aac716a | ||
|  | 6694a42270 | ||
|  | f78a4c6ad1 | ||
|  | 83fad8bcda | ||
|  | f539e813aa | ||
|  | 5d65166777 | ||
|  | 70346138a7 | ||
|  | d68656559c | ||
|  | 01660b5b80 | ||
|  | 74010acd85 | ||
|  | 7c7d255172 | ||
|  | 058f1e9835 | ||
|  | b4fc629ec0 | ||
|  | ae06b2da75 | ||
|  | 54d423a11f | ||
|  | 5da6c97a00 | ||
|  | bf2f13443f | ||
|  | 9ce4c3fe2f | ||
|  | 4a07bf666d | ||
|  | 5be46b4b20 | ||
|  | 7fd825b76b | ||
|  | b23d59dec7 | ||
|  | 492d450d26 | ||
|  | 04412f3624 | ||
|  | c41057b28a | ||
|  | 8312bc0100 | ||
|  | 85ac43bc5e | ||
|  | d1a0780c7a | ||
|  | f9b8d76527 | ||
|  | 26f00eeae4 | ||
|  | 1bc2df2178 | ||
|  | 8dfbcef198 | ||
|  | 6690b7735d | ||
|  | a9e7222e5e | ||
|  | f8edeb2775 | ||
|  | d1786fe159 | ||
|  | 157a12fb7c | ||
|  | 3f723b1638 | ||
|  | e2e9835d01 | ||
|  | 7599617b67 | ||
|  | 18a5b11033 | ||
|  | fff31b0f34 | ||
|  | c02e30663a | ||
|  | 4c6527cafc | ||
|  | 55bddb12e5 | ||
|  | d95861e1fb | ||
|  | 94754a5cb3 | ||
|  | 546f862236 | ||
|  | f105e29e56 | ||
|  | 5c15993d06 | ||
|  | a369ea1080 | ||
|  | 98068c0f57 | ||
|  | e0ef8683a2 | ||
|  | 66412a75f9 | ||
|  | 84d8fb0899 | ||
|  | c631537dbe | ||
|  | 8d2f49541c | ||
|  | 55a28e3437 | ||
|  | 67ea2d01c8 | ||
|  | dab229e37c | ||
|  | 7084473330 | ||
|  | dd2e335fae | ||
|  | 1ff87bbc12 | ||
|  | 2ebfdcf0c9 | ||
|  | 8ab161a3ee | ||
|  | e74b9617be | ||
|  | c3d88c83e3 | ||
|  | 3e912a7474 | ||
|  | 0d726a1d83 | ||
|  | affabf065e | ||
|  | e6ea77d263 | ||
|  | df73c2a458 | ||
|  | 96c5c79aef | ||
|  | 64922f07ff | ||
|  | bae21f3210 | ||
|  | 0702a4e58e | ||
|  | 31f1d304d6 | ||
|  | 291a74c295 | ||
|  | c0e9d1eb2f | ||
|  | a7cabdde3a | ||
|  | 3af560c2d0 | ||
|  | 1d23d5c761 | ||
|  | 995db12f22 | ||
|  | 4c60bfb66b | ||
|  | 1716747047 | ||
|  | 090b4d0388 | ||
|  | a9f068daa8 | ||
|  | f5ee91aeb3 | ||
|  | e2ee2cbf2d | ||
|  | dcf8364899 | ||
|  | b783602786 | ||
|  | 005e64eb9f | ||
|  | e9e5d293cc | ||
|  | a57255350f | ||
|  | 781442bf1e | ||
|  | 604bd2c576 | ||
|  | d9e1e1bbb7 | ||
|  | 907e9e182d | ||
|  | 0f238a5021 | ||
|  | 8d432bd60a | ||
|  | fd932c7678 | ||
|  | 46a9f5cb96 | ||
|  | f990d3f674 | ||
|  | 4a6de8deee | ||
|  | 9a7a216b23 | ||
|  | fccaaaae4d | ||
|  | a882b0be82 | ||
|  | db7bbab768 | ||
|  | 030e553549 | ||
|  | 8b0ca8e367 | ||
|  | 83b2b07200 | ||
|  | bdb591af9e | ||
|  | 2993a08777 | ||
|  | 2a2d3d57ec | ||
|  | 33c2c131c2 | ||
|  | e4286c96a7 | ||
|  | 2d9486b6fd | ||
|  | 632ee2d0bd | ||
|  | b09f201819 | ||
|  | baaf39c23d | ||
|  | b7467c10e8 | ||
|  | 701ef18606 | ||
|  | 3e7d2b216b | ||
|  | 41f16c20b6 | ||
|  | 96bc0b53c3 | ||
|  | b80baa78ef | ||
|  | ce88e0745d | ||
|  | 256bd2336f | ||
|  | 1b6993ee70 | ||
|  | af319b4729 | ||
|  | 1a15b4f18d | ||
|  | 3ddd3b49fd | ||
|  | e2c4b32311 | ||
|  | 8fb2821343 | ||
|  | 93f29734b7 | ||
|  | 569d2b0dce | ||
|  | b7e1e4fd9e | ||
|  | a1cebb889c | ||
|  | f040de5788 | ||
|  | e869c76e63 | ||
|  | 6f298ada61 | ||
|  | 26a8e234fa | ||
|  | 43b5720532 | ||
|  | a25f196ceb | ||
|  | f9e15a4470 | ||
|  | 447cf12629 | ||
|  | bb0f4bfa62 | ||
|  | bf036cbb88 | ||
|  | 8a9495de18 | ||
|  | 3e9614879a | ||
|  | 0057c793ee | ||
|  | ea5bdab374 | ||
|  | 0e96ad62bb | ||
|  | aa26f3908b | ||
|  | d3f90647f5 | ||
|  | 7d6c6129f2 | ||
|  | 13767d13d6 | ||
|  | a215958cec | ||
|  | 288086c78d | 
							
								
								
									
										12
									
								
								.babelrc
									
									
									
									
									
								
							
							
						
						
									
										12
									
								
								.babelrc
									
									
									
									
									
								
							| @@ -1,12 +0,0 @@ | ||||
| { | ||||
|   "presets": [ | ||||
|     ["env", { | ||||
|       "targets": { | ||||
|         "browsers": ["Chrome >= 65"] | ||||
|       }, | ||||
|       "debug": false, | ||||
|       "modules": false, | ||||
|       "useBuiltIns": "usage" | ||||
|     }] | ||||
|   ] | ||||
| } | ||||
							
								
								
									
										8
									
								
								.dockerignore
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								.dockerignore
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,8 @@ | ||||
| # Ignore everything | ||||
| * | ||||
|  | ||||
| # Only allow the following for docker build: | ||||
| !backend/ | ||||
| !docker/ | ||||
| !scripts/ | ||||
| !test/ | ||||
							
								
								
									
										33
									
								
								.github/ISSUE_TEMPLATE/bug_report.md
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										33
									
								
								.github/ISSUE_TEMPLATE/bug_report.md
									
									
									
									
										vendored
									
									
								
							| @@ -6,15 +6,30 @@ labels: bug | ||||
| assignees: '' | ||||
|  | ||||
| --- | ||||
| <!-- | ||||
|   | ||||
| Are you in the right place? | ||||
| - If you are looking for support on how to get your upstream server forwarding, please consider asking the community on Reddit. | ||||
| - If you are writing code changes to contribute and need to ask about the internals of the software, Gitter is the best place to ask. | ||||
| - If you think you found a bug with NPM (not Nginx, or your upstream server or MySql) then you are in the *right place.* | ||||
|  | ||||
| --> | ||||
|  | ||||
| **Checklist** | ||||
| - Have you pulled and found the error with `jc21/nginx-proxy-manager:latest` docker image? | ||||
|   - Yes / No | ||||
| - Are you sure you're not using someone else's docker image? | ||||
| - If having problems with Lets Encrypt, have you made absolutely sure your site is accessible from outside of your network? | ||||
|   - Yes / No | ||||
| - Have you searched for similar issues (both open and closed)? | ||||
|   - Yes / No | ||||
|  | ||||
| **Describe the bug** | ||||
| - A clear and concise description of what the bug is. | ||||
| - What version of Nginx Proxy Manager is reported on the login page? | ||||
| <!-- A clear and concise description of what the bug is. --> | ||||
|  | ||||
|  | ||||
| **Nginx Proxy Manager Version** | ||||
| <!-- What version of Nginx Proxy Manager is reported on the login page? --> | ||||
|  | ||||
|  | ||||
| **To Reproduce** | ||||
| Steps to reproduce the behavior: | ||||
| @@ -23,14 +38,18 @@ Steps to reproduce the behavior: | ||||
| 3. Scroll down to '....' | ||||
| 4. See error | ||||
|  | ||||
|  | ||||
| **Expected behavior** | ||||
| A clear and concise description of what you expected to happen. | ||||
| <!-- A clear and concise description of what you expected to happen. --> | ||||
|  | ||||
|  | ||||
| **Screenshots** | ||||
| If applicable, add screenshots to help explain your problem. | ||||
| <!-- If applicable, add screenshots to help explain your problem. --> | ||||
|  | ||||
|  | ||||
| **Operating System** | ||||
| - Please specify if using a Rpi, Mac, orchestration tool or any other setups that might affect the reproduction of this error. | ||||
| <!-- Please specify if using a Rpi, Mac, orchestration tool or any other setups that might affect the reproduction of this error. --> | ||||
|  | ||||
|  | ||||
| **Additional context** | ||||
| Add any other context about the problem here, docker version, browser version if applicable to the problem. Too much info is better than too little. | ||||
| <!-- Add any other context about the problem here, docker version, browser version, logs if applicable to the problem. Too much info is better than too little. --> | ||||
|   | ||||
							
								
								
									
										18
									
								
								.github/ISSUE_TEMPLATE/dns_challenge_request.md
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								.github/ISSUE_TEMPLATE/dns_challenge_request.md
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,18 @@ | ||||
| --- | ||||
| name: DNS challenge provider request | ||||
| about: Suggest a new provider to be available for a certificate DNS challenge | ||||
| title: '' | ||||
| labels: dns provider request | ||||
| assignees: '' | ||||
|  | ||||
| --- | ||||
|  | ||||
| **What provider would you like to see added to NPM?** | ||||
| <!-- What is this provider called? --> | ||||
|  | ||||
|  | ||||
| **Have you checked if a certbot plugin exists?** | ||||
| <!--  | ||||
| Currently NPM only supports DNS challenge providers for which a certbot plugin exists.  | ||||
| You can visit pypi.org, and search for a package with the name `certbot-dns-<privider>`. | ||||
| --> | ||||
							
								
								
									
										20
									
								
								.github/ISSUE_TEMPLATE/feature_request.md
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										20
									
								
								.github/ISSUE_TEMPLATE/feature_request.md
									
									
									
									
										vendored
									
									
								
							| @@ -7,14 +7,26 @@ assignees: '' | ||||
|  | ||||
| --- | ||||
|  | ||||
| <!-- | ||||
|  | ||||
| Are you in the right place? | ||||
| - If you are looking for support on how to get your upstream server forwarding, please consider asking the community on Reddit. | ||||
| - If you are writing code changes to contribute and need to ask about the internals of the software, Gitter is the best place to ask. | ||||
| - If you think you found a bug with NPM (not Nginx, or your upstream server or MySql) then you are in the *right place.* | ||||
|  | ||||
| --> | ||||
|  | ||||
| **Is your feature request related to a problem? Please describe.** | ||||
| A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] | ||||
| <!-- A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] --> | ||||
|  | ||||
|  | ||||
| **Describe the solution you'd like** | ||||
| A clear and concise description of what you want to happen. | ||||
| <!-- A clear and concise description of what you want to happen. --> | ||||
|  | ||||
|  | ||||
| **Describe alternatives you've considered** | ||||
| A clear and concise description of any alternative solutions or features you've considered. | ||||
| <!-- A clear and concise description of any alternative solutions or features you've considered. --> | ||||
|  | ||||
|  | ||||
| **Additional context** | ||||
| Add any other context or screenshots about the feature request here. | ||||
| <!-- Add any other context or screenshots about the feature request here. --> | ||||
|   | ||||
							
								
								
									
										37
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										37
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @@ -1,14 +1,29 @@ | ||||
| git.idea | ||||
| .env | ||||
| .DS_Store | ||||
| .idea | ||||
| ._* | ||||
| node_modules | ||||
| core* | ||||
| config/development.json | ||||
| *.code-workspace | ||||
| vendor | ||||
| bin/* | ||||
| backend/config.json | ||||
| backend/embed/assets | ||||
| backend/.task | ||||
| backend/coverage.out | ||||
| backend/coverage.html | ||||
| test/node_modules | ||||
| */node_modules | ||||
| docs/.vuepress/dist | ||||
| frontend/build | ||||
| frontend/yarn-error.log | ||||
| frontend/.npmrc | ||||
| frontend/src/locale/lang | ||||
| test/cypress/fixtures/example.json | ||||
| .vscode | ||||
| docker-build | ||||
| data | ||||
| dist | ||||
| webpack_stats.html | ||||
| data/* | ||||
| yarn-error.log | ||||
| yarn.lock | ||||
| tmp | ||||
| certbot.log | ||||
|  | ||||
| backend/embed/acme.sh | ||||
| docker/dev/resolv.conf | ||||
| docker/dev/dnsrouter-config.json.tmp | ||||
| thunder-tests | ||||
| test/cypress/videos | ||||
|   | ||||
							
								
								
									
										39
									
								
								Dockerfile
									
									
									
									
									
								
							
							
						
						
									
										39
									
								
								Dockerfile
									
									
									
									
									
								
							| @@ -1,39 +0,0 @@ | ||||
| FROM jc21/nginx-proxy-manager-base:latest | ||||
|  | ||||
| MAINTAINER Jamie Curnow <jc@jc21.com> | ||||
| LABEL maintainer="Jamie Curnow <jc@jc21.com>" | ||||
|  | ||||
| ENV SUPPRESS_NO_CONFIG_WARNING=1 | ||||
| ENV S6_FIX_ATTRS_HIDDEN=1 | ||||
| RUN echo "fs.file-max = 65535" > /etc/sysctl.conf | ||||
|  | ||||
| # Nginx, Node and required packages should already be installed from the base image | ||||
|  | ||||
| # root filesystem | ||||
| COPY rootfs / | ||||
|  | ||||
| # s6 overlay | ||||
| RUN curl -L -o /tmp/s6-overlay-amd64.tar.gz "https://github.com/just-containers/s6-overlay/releases/download/v1.21.4.0/s6-overlay-amd64.tar.gz" \ | ||||
|     && tar xzf /tmp/s6-overlay-amd64.tar.gz -C / | ||||
|  | ||||
| # App | ||||
| ENV NODE_ENV=production | ||||
|  | ||||
| ADD dist                /app/dist | ||||
| ADD node_modules        /app/node_modules | ||||
| ADD src/backend         /app/src/backend | ||||
| ADD package.json        /app/package.json | ||||
| ADD knexfile.js         /app/knexfile.js | ||||
|  | ||||
| # Volumes | ||||
| VOLUME [ "/data", "/etc/letsencrypt" ] | ||||
| CMD [ "/init" ] | ||||
|  | ||||
| # Ports | ||||
| EXPOSE 80 | ||||
| EXPOSE 81 | ||||
| EXPOSE 443 | ||||
| EXPOSE 9876 | ||||
|  | ||||
| HEALTHCHECK --interval=15s --timeout=3s CMD curl -f http://localhost:9876/health || exit 1 | ||||
|  | ||||
| @@ -1,38 +0,0 @@ | ||||
| FROM jc21/nginx-proxy-manager-base:arm64 | ||||
|  | ||||
| MAINTAINER Jamie Curnow <jc@jc21.com> | ||||
| LABEL maintainer="Jamie Curnow <jc@jc21.com>" | ||||
|  | ||||
| ENV SUPPRESS_NO_CONFIG_WARNING=1 | ||||
| ENV S6_FIX_ATTRS_HIDDEN=1 | ||||
| RUN echo "fs.file-max = 65535" > /etc/sysctl.conf | ||||
|  | ||||
| # Nginx, Node and required packages should already be installed from the base image | ||||
|  | ||||
| # root filesystem | ||||
| COPY rootfs / | ||||
|  | ||||
| # s6 overlay | ||||
| RUN curl -L -o /tmp/s6-overlay-aarch64.tar.gz "https://github.com/just-containers/s6-overlay/releases/download/v1.21.8.0/s6-overlay-aarch64.tar.gz" \ | ||||
|     && tar xzf /tmp/s6-overlay-aarch64.tar.gz -C / | ||||
|  | ||||
| # App | ||||
| ENV NODE_ENV=production | ||||
|  | ||||
| ADD dist                /app/dist | ||||
| ADD node_modules        /app/node_modules | ||||
| ADD src/backend         /app/src/backend | ||||
| ADD package.json        /app/package.json | ||||
| ADD knexfile.js         /app/knexfile.js | ||||
|  | ||||
| # Volumes | ||||
| VOLUME [ "/data", "/etc/letsencrypt" ] | ||||
| CMD [ "/init" ] | ||||
|  | ||||
| # Ports | ||||
| EXPOSE 80 | ||||
| EXPOSE 81 | ||||
| EXPOSE 443 | ||||
| EXPOSE 9876 | ||||
|  | ||||
| HEALTHCHECK --interval=15s --timeout=3s CMD curl -f http://localhost:9876/health || exit 1 | ||||
| @@ -1,38 +0,0 @@ | ||||
| FROM jc21/nginx-proxy-manager-base:armv6 | ||||
|  | ||||
| MAINTAINER Jamie Curnow <jc@jc21.com> | ||||
| LABEL maintainer="Jamie Curnow <jc@jc21.com>" | ||||
|  | ||||
| ENV SUPPRESS_NO_CONFIG_WARNING=1 | ||||
| ENV S6_FIX_ATTRS_HIDDEN=1 | ||||
| RUN echo "fs.file-max = 65535" > /etc/sysctl.conf | ||||
|  | ||||
| # Nginx, Node and required packages should already be installed from the base image | ||||
|  | ||||
| # root filesystem | ||||
| COPY rootfs / | ||||
|  | ||||
| # s6 overlay | ||||
| RUN curl -L -o /tmp/s6-overlay-arm.tar.gz "https://github.com/just-containers/s6-overlay/releases/download/v1.21.8.0/s6-overlay-arm.tar.gz" \ | ||||
|     && tar xzf /tmp/s6-overlay-arm.tar.gz -C / | ||||
|  | ||||
| # App | ||||
| ENV NODE_ENV=production | ||||
|  | ||||
| ADD dist                /app/dist | ||||
| ADD node_modules        /app/node_modules | ||||
| ADD src/backend         /app/src/backend | ||||
| ADD package.json        /app/package.json | ||||
| ADD knexfile.js         /app/knexfile.js | ||||
|  | ||||
| # Volumes | ||||
| VOLUME [ "/data", "/etc/letsencrypt" ] | ||||
| CMD [ "/init" ] | ||||
|  | ||||
| # Ports | ||||
| EXPOSE 80 | ||||
| EXPOSE 81 | ||||
| EXPOSE 443 | ||||
| EXPOSE 9876 | ||||
|  | ||||
| HEALTHCHECK --interval=15s --timeout=3s CMD curl -f http://localhost:9876/health || exit 1 | ||||
| @@ -1,38 +0,0 @@ | ||||
| FROM jc21/nginx-proxy-manager-base:armhf | ||||
|  | ||||
| MAINTAINER Jamie Curnow <jc@jc21.com> | ||||
| LABEL maintainer="Jamie Curnow <jc@jc21.com>" | ||||
|  | ||||
| ENV SUPPRESS_NO_CONFIG_WARNING=1 | ||||
| ENV S6_FIX_ATTRS_HIDDEN=1 | ||||
| RUN echo "fs.file-max = 65535" > /etc/sysctl.conf | ||||
|  | ||||
| # Nginx, Node and required packages should already be installed from the base image | ||||
|  | ||||
| # root filesystem | ||||
| COPY rootfs / | ||||
|  | ||||
| # s6 overlay | ||||
| RUN curl -L -o /tmp/s6-overlay-armhf.tar.gz "https://github.com/just-containers/s6-overlay/releases/download/v1.21.4.0/s6-overlay-armhf.tar.gz" \ | ||||
|     && tar xzf /tmp/s6-overlay-armhf.tar.gz -C / | ||||
|  | ||||
| # App | ||||
| ENV NODE_ENV=production | ||||
|  | ||||
| ADD dist                /app/dist | ||||
| ADD node_modules        /app/node_modules | ||||
| ADD src/backend         /app/src/backend | ||||
| ADD package.json        /app/package.json | ||||
| ADD knexfile.js         /app/knexfile.js | ||||
|  | ||||
| # Volumes | ||||
| VOLUME [ "/data", "/etc/letsencrypt" ] | ||||
| CMD [ "/init" ] | ||||
|  | ||||
| # Ports | ||||
| EXPOSE 80 | ||||
| EXPOSE 81 | ||||
| EXPOSE 443 | ||||
| EXPOSE 9876 | ||||
|  | ||||
| HEALTHCHECK --interval=15s --timeout=3s CMD curl -f http://localhost:9876/health || exit 1 | ||||
							
								
								
									
										622
									
								
								Jenkinsfile
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										622
									
								
								Jenkinsfile
									
									
									
									
										vendored
									
									
								
							| @@ -1,360 +1,268 @@ | ||||
| import groovy.transform.Field | ||||
|  | ||||
| @Field | ||||
| def buildxPushTags = "" | ||||
|  | ||||
| def getVersion() { | ||||
| 	ver = sh(script: 'cat .version', returnStdout: true) | ||||
| 	return ver.trim() | ||||
| } | ||||
|  | ||||
| def getCommit() { | ||||
| 	ver = sh(script: 'git log -n 1 --format=%h', returnStdout: true) | ||||
| 	return ver.trim() | ||||
| } | ||||
|  | ||||
| pipeline { | ||||
|   options { | ||||
|     buildDiscarder(logRotator(numToKeepStr: '10')) | ||||
|     disableConcurrentBuilds() | ||||
|   } | ||||
|   agent any | ||||
|   environment { | ||||
|     IMAGE            = "nginx-proxy-manager" | ||||
|     BASE_IMAGE       = "jc21/${IMAGE}-base" | ||||
|     TEMP_IMAGE       = "${IMAGE}-build_${BUILD_NUMBER}" | ||||
|     TAG_VERSION      = getPackageVersion() | ||||
|     MAJOR_VERSION    = "2" | ||||
|     BRANCH_LOWER     = "${BRANCH_NAME.toLowerCase()}" | ||||
|     // Architectures: | ||||
|     AMD64_TAG        = "amd64" | ||||
|     ARMV6_TAG        = "armv6l" | ||||
|     ARMV7_TAG        = "armv7l" | ||||
|     ARM64_TAG        = "arm64" | ||||
|   } | ||||
|   stages { | ||||
|     stage('Build PR') { | ||||
|       when { | ||||
|         changeRequest() | ||||
|       } | ||||
|       steps { | ||||
|         ansiColor('xterm') { | ||||
|           // Codebase | ||||
|           sh 'docker run --rm -v $(pwd):/app -w /app ${BASE_IMAGE} yarn install' | ||||
|           sh 'docker run --rm -v $(pwd):/app -w /app ${BASE_IMAGE} npm run-script build' | ||||
|           sh 'rm -rf node_modules' | ||||
|           sh 'docker run --rm -v $(pwd):/app -w /app ${BASE_IMAGE} yarn install --prod' | ||||
|           sh 'docker run --rm -v $(pwd):/data ${DOCKER_CI_TOOLS} node-prune' | ||||
| 	agent { | ||||
| 		label 'docker-multiarch' | ||||
| 	} | ||||
| 	options { | ||||
| 		buildDiscarder(logRotator(numToKeepStr: '10')) | ||||
| 		disableConcurrentBuilds() | ||||
| 		ansiColor('xterm') | ||||
| 	} | ||||
| 	environment { | ||||
| 		DOCKER_ORG                 = 'jc21' | ||||
| 		IMAGE                      = 'nginx-proxy-manager' | ||||
| 		BUILD_VERSION              = getVersion() | ||||
| 		BUILD_COMMIT               = getCommit() | ||||
| 		MAJOR_VERSION              = '3' | ||||
| 		BRANCH_LOWER               = "${BRANCH_NAME.toLowerCase().replaceAll('\\\\', '-').replaceAll('/', '-').replaceAll('\\.', '-')}" | ||||
| 		BUILDX_NAME                = "npm_${BRANCH_LOWER}_${BUILD_NUMBER}" | ||||
| 		COMPOSE_INTERACTIVE_NO_CLI = 1 | ||||
| 	} | ||||
| 	stages { | ||||
| 		stage('Environment') { | ||||
| 			parallel { | ||||
| 				stage('Master') { | ||||
| 					when { | ||||
| 						branch 'master' | ||||
| 					} | ||||
| 					steps { | ||||
| 						script { | ||||
| 							buildxPushTags = "-t docker.io/${DOCKER_ORG}/${IMAGE}:${BUILD_VERSION} -t docker.io/${DOCKER_ORG}/${IMAGE}:${MAJOR_VERSION} -t docker.io/${DOCKER_ORG}/${IMAGE}:latest" | ||||
| 							echo 'Building on Master is disabled!' | ||||
| 							sh 'exit 1' | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
| 				stage('Other') { | ||||
| 					when { | ||||
| 						not { | ||||
| 							branch 'master' | ||||
| 						} | ||||
| 					} | ||||
| 					steps { | ||||
| 						script { | ||||
| 							// Defaults to the Branch name, which is applies to all branches AND pr's | ||||
| 							// buildxPushTags = "-t docker.io/jc21/${IMAGE}:github-${BRANCH_LOWER}" | ||||
| 							buildxPushTags = "-t docker.io/${DOCKER_ORG}/${IMAGE}:v3" | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 		stage('Build') { | ||||
| 			parallel { | ||||
| 				stage('Project') { | ||||
| 					steps { | ||||
| 						sh './scripts/ci/build-frontend' | ||||
| 						sh './scripts/ci/test-backend' | ||||
| 						// Temporarily disable building backend binaries | ||||
| 						// sh './scripts/ci/build-backend' | ||||
| 						// Build the docker image used for testing below | ||||
| 						sh '''docker build --pull --no-cache \\ | ||||
| 							-t "${IMAGE}:${BRANCH_LOWER}-ci-${BUILD_NUMBER}" \\ | ||||
| 							-f docker/Dockerfile \\ | ||||
| 							--build-arg BUILD_COMMIT="${BUILD_COMMIT}" \\ | ||||
| 							--build-arg BUILD_DATE="$(date '+%Y-%m-%d %T %Z')" \\ | ||||
| 							--build-arg BUILD_VERSION="${BUILD_VERSION}" \\ | ||||
| 							. | ||||
| 						''' | ||||
| 					} | ||||
| 					post { | ||||
| 						success { | ||||
| 							junit 'test/results/junit/*' | ||||
| 							// archiveArtifacts allowEmptyArchive: false, artifacts: 'bin/*' | ||||
| 							publishHTML([ | ||||
| 								allowMissing: false, | ||||
| 								alwaysLinkToLastBuild: false, | ||||
| 								keepAll: false, | ||||
| 								reportDir: 'test/results/html-reports', | ||||
| 								reportFiles: 'backend-coverage.html', | ||||
| 								reportName: 'HTML Reports', | ||||
| 								useWrapperFileDirectly: true | ||||
| 							]) | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
| 				stage('Docs') { | ||||
| 					steps { | ||||
| 						dir(path: 'docs') { | ||||
| 							sh 'yarn install' | ||||
| 							sh 'yarn build' | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 		stage('Test Sqlite') { | ||||
| 			environment { | ||||
| 				COMPOSE_PROJECT_NAME = "npm_${BRANCH_LOWER}_${BUILD_NUMBER}_sqlite" | ||||
| 				COMPOSE_FILE         = 'docker/docker-compose.ci.yml' | ||||
| 			} | ||||
| 			when { | ||||
| 				not { | ||||
| 					equals expected: 'UNSTABLE', actual: currentBuild.result | ||||
| 				} | ||||
| 			} | ||||
| 			steps { | ||||
| 				sh 'rm -rf ./test/results/junit/*' | ||||
| 				sh './scripts/ci/fulltest-cypress' | ||||
| 				// Adding this here as the schema needs to come from a running stack, but this will be used by docs later | ||||
| 				sh 'docker-compose exec -T fullstack curl -s --output /temp-docs/api-schema.json "http://fullstack:81/api/schema"' | ||||
| 			} | ||||
| 			post { | ||||
| 				always { | ||||
| 					// Dumps to analyze later | ||||
| 					sh 'mkdir -p debug/sqlite' | ||||
| 					sh 'docker logs $(docker-compose ps --all -q fullstack) > debug/sqlite/docker_fullstack.log 2>&1' | ||||
| 					sh 'docker logs $(docker-compose ps --all -q stepca) > debug/sqlite/docker_stepca.log 2>&1' | ||||
| 					sh 'docker logs $(docker-compose ps --all -q pdns) > debug/sqlite/docker_pdns.log 2>&1' | ||||
| 					sh 'docker logs $(docker-compose ps --all -q pdns-db) > debug/sqlite/docker_pdns-db.log 2>&1' | ||||
| 					sh 'docker logs $(docker-compose ps --all -q dnsrouter) > debug/sqlite/docker_dnsrouter.log 2>&1' | ||||
| 					junit 'test/results/junit/*' | ||||
| 					sh 'docker-compose down --remove-orphans --volumes -t 30 || true' | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 		stage('Test Mysql') { | ||||
| 			environment { | ||||
| 				COMPOSE_PROJECT_NAME = "npm_${BRANCH_LOWER}_${BUILD_NUMBER}_mysql" | ||||
| 				COMPOSE_FILE         = 'docker/docker-compose.ci.yml:docker/docker-compose.ci.mysql.yml' | ||||
| 			} | ||||
| 			when { | ||||
| 				not { | ||||
| 					equals expected: 'UNSTABLE', actual: currentBuild.result | ||||
| 				} | ||||
| 			} | ||||
| 			steps { | ||||
| 				sh 'rm -rf ./test/results/junit/*' | ||||
| 				sh './scripts/ci/fulltest-cypress' | ||||
| 			} | ||||
| 			post { | ||||
| 				always { | ||||
| 					// Dumps to analyze later | ||||
| 					sh 'mkdir -p debug/mysql' | ||||
| 					sh 'docker logs $(docker-compose ps --all -q fullstack) > debug/mysql/docker_fullstack.log 2>&1' | ||||
| 					sh 'docker logs $(docker-compose ps --all -q stepca) > debug/mysql/docker_stepca.log 2>&1' | ||||
| 					sh 'docker logs $(docker-compose ps --all -q pdns) > debug/mysql/docker_pdns.log 2>&1' | ||||
| 					sh 'docker logs $(docker-compose ps --all -q pdns-db) > debug/mysql/docker_pdns-db.log 2>&1' | ||||
| 					sh 'docker logs $(docker-compose ps --all -q dnsrouter) > debug/mysql/docker_dnsrouter.log 2>&1' | ||||
| 					junit 'test/results/junit/*' | ||||
| 					sh 'docker-compose down --remove-orphans --volumes -t 30 || true' | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 		stage('Test Postgres') { | ||||
| 			environment { | ||||
| 				COMPOSE_PROJECT_NAME = "npm_${BRANCH_LOWER}_${BUILD_NUMBER}_postgres" | ||||
| 				COMPOSE_FILE         = 'docker/docker-compose.ci.yml:docker/docker-compose.ci.postgres.yml' | ||||
| 			} | ||||
| 			when { | ||||
| 				not { | ||||
| 					equals expected: 'UNSTABLE', actual: currentBuild.result | ||||
| 				} | ||||
| 			} | ||||
| 			steps { | ||||
| 				sh 'rm -rf ./test/results/junit/*' | ||||
| 				sh './scripts/ci/fulltest-cypress' | ||||
| 			} | ||||
| 			post { | ||||
| 				always { | ||||
| 					// Dumps to analyze later | ||||
| 					sh 'mkdir -p debug/postgres' | ||||
| 					sh 'docker logs $(docker-compose ps --all -q fullstack) > debug/postgres/docker_fullstack.log 2>&1' | ||||
| 					sh 'docker logs $(docker-compose ps --all -q stepca) > debug/postgres/docker_stepca.log 2>&1' | ||||
| 					sh 'docker logs $(docker-compose ps --all -q pdns) > debug/postgres/docker_pdns.log 2>&1' | ||||
| 					sh 'docker logs $(docker-compose ps --all -q pdns-db) > debug/postgres/docker_pdns-db.log 2>&1' | ||||
| 					sh 'docker logs $(docker-compose ps --all -q dnsrouter) > debug/postgres/docker_dnsrouter.log 2>&1' | ||||
| 					sh 'docker logs $(docker-compose ps --all -q db-postgres) > debug/postgres/docker_db.log 2>&1' | ||||
| 					sh 'docker logs $(docker-compose ps --all -q authentik) > debug/postgres/docker_authentik.log 2>&1' | ||||
| 					sh 'docker logs $(docker-compose ps --all -q authentik-redis) > debug/postgres/docker_authentik-redis.log 2>&1' | ||||
| 					sh 'docker logs $(docker-compose ps --all -q authentik-ldap) > debug/postgres/docker_authentik-ldap.log 2>&1' | ||||
|  | ||||
|           // Docker Build | ||||
|           sh 'docker build --pull --no-cache --squash --compress -t ${TEMP_IMAGE}-${AMD64_TAG} .' | ||||
|  | ||||
|           // Dockerhub | ||||
|           sh 'docker tag ${TEMP_IMAGE}-${AMD64_TAG} docker.io/jc21/${IMAGE}:github-${BRANCH_LOWER}-${AMD64_TAG}' | ||||
|           withCredentials([usernamePassword(credentialsId: 'jc21-dockerhub', passwordVariable: 'dpass', usernameVariable: 'duser')]) { | ||||
|             sh "docker login -u '${duser}' -p '${dpass}'" | ||||
|             sh 'docker push docker.io/jc21/${IMAGE}:github-${BRANCH_LOWER}-${AMD64_TAG}' | ||||
|           } | ||||
|  | ||||
|           sh 'docker rmi ${TEMP_IMAGE}-${AMD64_TAG}' | ||||
|  | ||||
|           script { | ||||
|             def comment = pullRequest.comment("Docker Image for build ${BUILD_NUMBER} is available on [DockerHub](https://cloud.docker.com/repository/docker/jc21/${IMAGE}) as `jc21/${IMAGE}:github-${BRANCH_LOWER}-${AMD64_TAG}`") | ||||
|           } | ||||
|         } | ||||
|       } | ||||
|     } | ||||
|     stage('Build Develop') { | ||||
|       when { | ||||
|         branch 'develop' | ||||
|       } | ||||
|       steps { | ||||
|         ansiColor('xterm') { | ||||
|           // Codebase | ||||
|           sh 'docker run --rm -v $(pwd):/app -w /app ${BASE_IMAGE} yarn install' | ||||
|           sh 'docker run --rm -v $(pwd):/app -w /app ${BASE_IMAGE} npm run-script build' | ||||
|           sh 'rm -rf node_modules' | ||||
|           sh 'docker run --rm -v $(pwd):/app -w /app ${BASE_IMAGE} yarn install --prod' | ||||
|           sh 'docker run --rm -v $(pwd):/data ${DOCKER_CI_TOOLS} node-prune' | ||||
|  | ||||
|           // Docker Build | ||||
|           sh 'docker build --pull --no-cache --squash --compress -t ${TEMP_IMAGE}-${AMD64_TAG} .' | ||||
|  | ||||
|           // Dockerhub | ||||
|           sh 'docker tag ${TEMP_IMAGE}-${AMD64_TAG} docker.io/jc21/${IMAGE}:develop-${AMD64_TAG}' | ||||
|           withCredentials([usernamePassword(credentialsId: 'jc21-dockerhub', passwordVariable: 'dpass', usernameVariable: 'duser')]) { | ||||
|             sh "docker login -u '${duser}' -p '${dpass}'" | ||||
|             sh 'docker push docker.io/jc21/${IMAGE}:develop-${AMD64_TAG}' | ||||
|           } | ||||
|  | ||||
|           sh 'docker rmi ${TEMP_IMAGE}-${AMD64_TAG}' | ||||
|         } | ||||
|       } | ||||
|     } | ||||
|     stage('Build Master') { | ||||
|       when { | ||||
|         branch 'master' | ||||
|       } | ||||
|       parallel { | ||||
|         // ======================== | ||||
|         // amd64 | ||||
|         // ======================== | ||||
|         stage('amd64') { | ||||
|           agent { | ||||
|             label 'amd64' | ||||
|           } | ||||
|           steps { | ||||
|             ansiColor('xterm') { | ||||
|               // Codebase | ||||
|               sh 'docker run --rm -v $(pwd):/app -w /app ${BASE_IMAGE} yarn install' | ||||
|               sh 'docker run --rm -v $(pwd):/app -w /app ${BASE_IMAGE} npm run-script build' | ||||
|               sh 'rm -rf node_modules' | ||||
|               sh 'docker run --rm -v $(pwd):/app -w /app ${BASE_IMAGE} yarn install --prod' | ||||
|               sh 'docker run --rm -v $(pwd):/data ${DOCKER_CI_TOOLS} node-prune' | ||||
|  | ||||
|               // Docker Build | ||||
|               sh 'docker build --pull --no-cache --squash --compress -t ${TEMP_IMAGE}-${AMD64_TAG} .' | ||||
|  | ||||
|               // Dockerhub | ||||
|               sh 'docker tag ${TEMP_IMAGE}-${AMD64_TAG} docker.io/jc21/${IMAGE}:${TAG_VERSION}-${AMD64_TAG}' | ||||
|               sh 'docker tag ${TEMP_IMAGE}-${AMD64_TAG} docker.io/jc21/${IMAGE}:${MAJOR_VERSION}-${AMD64_TAG}' | ||||
|               sh 'docker tag ${TEMP_IMAGE}-${AMD64_TAG} docker.io/jc21/${IMAGE}:latest-${AMD64_TAG}' | ||||
|  | ||||
|               withCredentials([usernamePassword(credentialsId: 'jc21-dockerhub', passwordVariable: 'dpass', usernameVariable: 'duser')]) { | ||||
|                 sh "docker login -u '${duser}' -p '${dpass}'" | ||||
|                 sh 'docker push docker.io/jc21/${IMAGE}:${TAG_VERSION}-${AMD64_TAG}' | ||||
|                 sh 'docker push docker.io/jc21/${IMAGE}:${MAJOR_VERSION}-${AMD64_TAG}' | ||||
|                 sh 'docker push docker.io/jc21/${IMAGE}:latest-${AMD64_TAG}' | ||||
|               } | ||||
|  | ||||
|               sh 'docker rmi ${TEMP_IMAGE}-${AMD64_TAG}' | ||||
|             } | ||||
|           } | ||||
|         } | ||||
|         // ======================== | ||||
|         // arm64 | ||||
|         // ======================== | ||||
|         stage('arm64') { | ||||
|           agent { | ||||
|             label 'arm64' | ||||
|           } | ||||
|           steps { | ||||
|             ansiColor('xterm') { | ||||
|               // Codebase | ||||
|               sh 'docker run --rm -v $(pwd):/app -w /app ${BASE_IMAGE} yarn install' | ||||
|               sh 'docker run --rm -v $(pwd):/app -w /app ${BASE_IMAGE} npm run-script build' | ||||
|               sh 'sudo rm -rf node_modules' | ||||
|               sh 'docker run --rm -v $(pwd):/app -w /app ${BASE_IMAGE} yarn install --prod' | ||||
|  | ||||
|               // Docker Build | ||||
|               sh 'docker build --pull --no-cache --squash --compress -t ${TEMP_IMAGE}-${ARM64_TAG} -f Dockerfile.${ARM64_TAG} .' | ||||
|  | ||||
|               // Dockerhub | ||||
|               sh 'docker tag ${TEMP_IMAGE}-${ARM64_TAG} docker.io/jc21/${IMAGE}:${TAG_VERSION}-${ARM64_TAG}' | ||||
|               sh 'docker tag ${TEMP_IMAGE}-${ARM64_TAG} docker.io/jc21/${IMAGE}:${MAJOR_VERSION}-${ARM64_TAG}' | ||||
|               sh 'docker tag ${TEMP_IMAGE}-${ARM64_TAG} docker.io/jc21/${IMAGE}:latest-${ARM64_TAG}' | ||||
|  | ||||
|               withCredentials([usernamePassword(credentialsId: 'jc21-dockerhub', passwordVariable: 'dpass', usernameVariable: 'duser')]) { | ||||
|                 sh "docker login -u '${duser}' -p '${dpass}'" | ||||
|                 sh 'docker push docker.io/jc21/${IMAGE}:${TAG_VERSION}-${ARM64_TAG}' | ||||
|                 sh 'docker push docker.io/jc21/${IMAGE}:${MAJOR_VERSION}-${ARM64_TAG}' | ||||
|                 sh 'docker push docker.io/jc21/${IMAGE}:latest-${ARM64_TAG}' | ||||
|               } | ||||
|  | ||||
|               sh 'docker rmi ${TEMP_IMAGE}-${ARM64_TAG}' | ||||
|             } | ||||
|           } | ||||
|         } | ||||
|         // ======================== | ||||
|         // armv7l | ||||
|         // ======================== | ||||
|         stage('armv7l') { | ||||
|           agent { | ||||
|             label 'armv7l' | ||||
|           } | ||||
|           steps { | ||||
|             ansiColor('xterm') { | ||||
|               // Codebase | ||||
|               sh 'docker run --rm -v $(pwd):/app -w /app ${BASE_IMAGE} yarn install' | ||||
|               sh 'docker run --rm -v $(pwd):/app -w /app ${BASE_IMAGE} npm run-script build' | ||||
|               sh 'rm -rf node_modules' | ||||
|               sh 'docker run --rm -v $(pwd):/app -w /app ${BASE_IMAGE} yarn install --prod' | ||||
|  | ||||
|               // Docker Build | ||||
|               sh 'docker build --pull --no-cache --squash --compress -t ${TEMP_IMAGE}-${ARMV7_TAG} -f Dockerfile.${ARMV7_TAG} .' | ||||
|  | ||||
|               // Dockerhub | ||||
|               sh 'docker tag ${TEMP_IMAGE}-${ARMV7_TAG} docker.io/jc21/${IMAGE}:${TAG_VERSION}-${ARMV7_TAG}' | ||||
|               sh 'docker tag ${TEMP_IMAGE}-${ARMV7_TAG} docker.io/jc21/${IMAGE}:${MAJOR_VERSION}-${ARMV7_TAG}' | ||||
|               sh 'docker tag ${TEMP_IMAGE}-${ARMV7_TAG} docker.io/jc21/${IMAGE}:latest-${ARMV7_TAG}' | ||||
|  | ||||
|               withCredentials([usernamePassword(credentialsId: 'jc21-dockerhub', passwordVariable: 'dpass', usernameVariable: 'duser')]) { | ||||
|                 sh "docker login -u '${duser}' -p '${dpass}'" | ||||
|                 sh 'docker push docker.io/jc21/${IMAGE}:${TAG_VERSION}-${ARMV7_TAG}' | ||||
|                 sh 'docker push docker.io/jc21/${IMAGE}:${MAJOR_VERSION}-${ARMV7_TAG}' | ||||
|                 sh 'docker push docker.io/jc21/${IMAGE}:latest-${ARMV7_TAG}' | ||||
|               } | ||||
|  | ||||
|               sh 'docker rmi ${TEMP_IMAGE}-${ARMV7_TAG}' | ||||
|             } | ||||
|           } | ||||
|         } | ||||
|         // ======================== | ||||
|         // armv6l - Disabled for the time being | ||||
|         // ======================== | ||||
|         /* | ||||
|         stage('armv6l') { | ||||
|           agent { | ||||
|             label 'armv6l' | ||||
|           } | ||||
|           steps { | ||||
|             ansiColor('xterm') { | ||||
|               // Codebase | ||||
|               sh 'docker run --rm -v $(pwd):/app -w /app ${BASE_IMAGE} yarn install' | ||||
|               sh 'docker run --rm -v $(pwd):/app -w /app ${BASE_IMAGE} npm run-script build' | ||||
|               sh 'rm -rf node_modules' | ||||
|               sh 'docker run --rm -v $(pwd):/app -w /app ${BASE_IMAGE} yarn install --prod' | ||||
|  | ||||
|               // Docker Build | ||||
|               sh 'docker build --pull --no-cache --squash --compress -t ${TEMP_IMAGE}-${ARMV6_TAG} -f Dockerfile.${ARMV6_TAG} .' | ||||
|  | ||||
|               // Dockerhub | ||||
|               sh 'docker tag ${TEMP_IMAGE}-${ARMV6_TAG} docker.io/jc21/${IMAGE}:${TAG_VERSION}-${ARMV6_TAG}' | ||||
|               sh 'docker tag ${TEMP_IMAGE}-${ARMV6_TAG} docker.io/jc21/${IMAGE}:${MAJOR_VERSION}-${ARMV6_TAG}' | ||||
|               sh 'docker tag ${TEMP_IMAGE}-${ARMV6_TAG} docker.io/jc21/${IMAGE}:latest-${ARMV6_TAG}' | ||||
|  | ||||
|               withCredentials([usernamePassword(credentialsId: 'jc21-dockerhub', passwordVariable: 'dpass', usernameVariable: 'duser')]) { | ||||
|                 sh "docker login -u '${duser}' -p '${dpass}'" | ||||
|                 sh 'docker push docker.io/jc21/${IMAGE}:${TAG_VERSION}-${ARMV6_TAG}' | ||||
|                 sh 'docker push docker.io/jc21/${IMAGE}:${MAJOR_VERSION}-${ARMV6_TAG}' | ||||
|                 sh 'docker push docker.io/jc21/${IMAGE}:latest-${ARMV6_TAG}' | ||||
|               } | ||||
|  | ||||
|               sh 'docker rmi ${TEMP_IMAGE}-${ARMV6_TAG}' | ||||
|             } | ||||
|           } | ||||
|         } | ||||
|         */ | ||||
|       } | ||||
|     } | ||||
|     // ======================== | ||||
|     // latest manifest | ||||
|     // ======================== | ||||
|     stage('Latest Manifest') { | ||||
|       when { | ||||
|         branch 'master' | ||||
|       } | ||||
|       steps { | ||||
|         ansiColor('xterm') { | ||||
|           // ======================= | ||||
|           // latest | ||||
|           // ======================= | ||||
|           sh 'docker pull jc21/${IMAGE}:latest-${AMD64_TAG}' | ||||
|           sh 'docker pull jc21/${IMAGE}:latest-${ARM64_TAG}' | ||||
|           sh 'docker pull jc21/${IMAGE}:latest-${ARMV7_TAG}' | ||||
|           //sh 'docker pull jc21/${IMAGE}:latest-${ARMV6_TAG}' | ||||
|  | ||||
|           sh 'docker manifest push --purge jc21/${IMAGE}:latest || echo ""' | ||||
|           sh 'docker manifest create jc21/${IMAGE}:latest jc21/${IMAGE}:latest-${AMD64_TAG} jc21/${IMAGE}:latest-${ARM64_TAG} jc21/${IMAGE}:latest-${ARMV7_TAG}' | ||||
|  | ||||
|           sh 'docker manifest annotate jc21/${IMAGE}:latest jc21/${IMAGE}:latest-${AMD64_TAG} --arch ${AMD64_TAG}' | ||||
|           sh 'docker manifest annotate jc21/${IMAGE}:latest jc21/${IMAGE}:latest-${ARM64_TAG} --os linux --arch ${ARM64_TAG}' | ||||
|           sh 'docker manifest annotate jc21/${IMAGE}:latest jc21/${IMAGE}:latest-${ARMV7_TAG} --os linux --arch arm --variant ${ARMV7_TAG}' | ||||
|           //sh 'docker manifest annotate jc21/${IMAGE}:latest jc21/${IMAGE}:latest-${ARMV6_TAG} --os linux --arch arm --variant ${ARMV6_TAG}' | ||||
|           sh 'docker manifest push --purge jc21/${IMAGE}:latest' | ||||
|  | ||||
|           // ======================= | ||||
|           // major version | ||||
|           // ======================= | ||||
|           sh 'docker pull jc21/${IMAGE}:${MAJOR_VERSION}-${AMD64_TAG}' | ||||
|           sh 'docker pull jc21/${IMAGE}:${MAJOR_VERSION}-${ARM64_TAG}' | ||||
|           sh 'docker pull jc21/${IMAGE}:${MAJOR_VERSION}-${ARMV7_TAG}' | ||||
|           //sh 'docker pull jc21/${IMAGE}:${MAJOR_VERSION}-${ARMV6_TAG}' | ||||
|  | ||||
|           sh 'docker manifest push --purge jc21/${IMAGE}:${MAJOR_VERSION} || echo ""' | ||||
|           sh 'docker manifest create jc21/${IMAGE}:${MAJOR_VERSION} jc21/${IMAGE}:${MAJOR_VERSION}-${AMD64_TAG} jc21/${IMAGE}:${MAJOR_VERSION}-${ARM64_TAG} jc21/${IMAGE}:${MAJOR_VERSION}-${ARMV7_TAG}' | ||||
|  | ||||
|           sh 'docker manifest annotate jc21/${IMAGE}:${MAJOR_VERSION} jc21/${IMAGE}:${MAJOR_VERSION}-${AMD64_TAG} --arch ${AMD64_TAG}' | ||||
|           sh 'docker manifest annotate jc21/${IMAGE}:${MAJOR_VERSION} jc21/${IMAGE}:${MAJOR_VERSION}-${ARM64_TAG} --os linux --arch ${ARM64_TAG}' | ||||
|           sh 'docker manifest annotate jc21/${IMAGE}:${MAJOR_VERSION} jc21/${IMAGE}:${MAJOR_VERSION}-${ARMV7_TAG} --os linux --arch arm --variant ${ARMV7_TAG}' | ||||
|           //sh 'docker manifest annotate jc21/${IMAGE}:${MAJOR_VERSION} jc21/${IMAGE}:${MAJOR_VERSION}-${ARMV6_TAG} --os linux --arch arm --variant ${ARMV6_TAG}' | ||||
|  | ||||
|           // ======================= | ||||
|           // version | ||||
|           // ======================= | ||||
|           sh 'docker pull jc21/${IMAGE}:${TAG_VERSION}-${AMD64_TAG}' | ||||
|           sh 'docker pull jc21/${IMAGE}:${TAG_VERSION}-${ARM64_TAG}' | ||||
|           sh 'docker pull jc21/${IMAGE}:${TAG_VERSION}-${ARMV7_TAG}' | ||||
|           //sh 'docker pull jc21/${IMAGE}:${TAG_VERSION}-${ARMV6_TAG}' | ||||
|  | ||||
|           sh 'docker manifest push --purge jc21/${IMAGE}:${TAG_VERSION} || echo ""' | ||||
|           sh 'docker manifest create jc21/${IMAGE}:${TAG_VERSION} jc21/${IMAGE}:${TAG_VERSION}-${AMD64_TAG} jc21/${IMAGE}:${TAG_VERSION}-${ARM64_TAG} jc21/${IMAGE}:${TAG_VERSION}-${ARMV7_TAG}' | ||||
|  | ||||
|           sh 'docker manifest annotate jc21/${IMAGE}:${TAG_VERSION} jc21/${IMAGE}:${TAG_VERSION}-${AMD64_TAG} --arch ${AMD64_TAG}' | ||||
|           sh 'docker manifest annotate jc21/${IMAGE}:${TAG_VERSION} jc21/${IMAGE}:${TAG_VERSION}-${ARM64_TAG} --os linux --arch ${ARM64_TAG}' | ||||
|           sh 'docker manifest annotate jc21/${IMAGE}:${TAG_VERSION} jc21/${IMAGE}:${TAG_VERSION}-${ARMV7_TAG} --os linux --arch arm --variant ${ARMV7_TAG}' | ||||
|           //sh 'docker manifest annotate jc21/${IMAGE}:${TAG_VERSION} jc21/${IMAGE}:${TAG_VERSION}-${ARMV6_TAG} --os linux --arch arm --variant ${ARMV6_TAG}' | ||||
|         } | ||||
|       } | ||||
|     } | ||||
|     // ======================== | ||||
|     // develop | ||||
|     // ======================== | ||||
|     stage('Develop Manifest') { | ||||
|       when { | ||||
|         branch 'develop' | ||||
|       } | ||||
|       steps { | ||||
|         ansiColor('xterm') { | ||||
|           sh 'docker pull jc21/${IMAGE}:develop-${AMD64_TAG}' | ||||
|           //sh 'docker pull jc21/${IMAGE}:develop-${ARM64_TAG}' | ||||
|           //sh 'docker pull jc21/${IMAGE}:develop-${ARMV7_TAG}' | ||||
|           //sh 'docker pull jc21/${IMAGE}:${TAG_VERSION}-${ARMV6_TAG}' | ||||
|  | ||||
|           sh 'docker manifest push --purge jc21/${IMAGE}:develop || :' | ||||
|           sh 'docker manifest create jc21/${IMAGE}:develop jc21/${IMAGE}:develop-${AMD64_TAG}' | ||||
|  | ||||
|           sh 'docker manifest annotate jc21/${IMAGE}:develop jc21/${IMAGE}:develop-${AMD64_TAG} --arch ${AMD64_TAG}' | ||||
|           //sh 'docker manifest annotate jc21/${IMAGE}:develop jc21/${IMAGE}:develop-${ARM64_TAG} --os linux --arch ${ARM64_TAG}' | ||||
|           //sh 'docker manifest annotate jc21/${IMAGE}:develop jc21/${IMAGE}:develop-${ARMV7_TAG} --os linux --arch arm --variant ${ARMV7_TAG}' | ||||
|           //sh 'docker manifest annotate jc21/${IMAGE}:develop jc21/${IMAGE}:develop-${ARMV6_TAG} --os linux --arch arm --variant ${ARMV6_TAG}' | ||||
|         } | ||||
|       } | ||||
|     } | ||||
|     // ======================== | ||||
|     // cleanup | ||||
|     // ======================== | ||||
|     stage('Latest Cleanup') { | ||||
|       when { | ||||
|         branch 'master' | ||||
|       } | ||||
|       steps { | ||||
|         ansiColor('xterm') { | ||||
|           sh 'docker rmi jc21/${IMAGE}:latest jc21/${IMAGE}:latest-${AMD64_TAG} jc21/${IMAGE}:latest-${ARM64_TAG} jc21/${IMAGE}:latest-${ARMV7_TAG} || echo ""' | ||||
|           sh 'docker rmi jc21/${IMAGE}:${MAJOR_VERSION}-${AMD64_TAG} jc21/${IMAGE}:${MAJOR_VERSION}-${ARM64_TAG} jc21/${IMAGE}:${MAJOR_VERSION}-${ARMV7_TAG} || echo ""' | ||||
|           sh 'docker rmi jc21/${IMAGE}:${TAG_VERSION}-${AMD64_TAG} jc21/${IMAGE}:${TAG_VERSION}-${ARM64_TAG} jc21/${IMAGE}:${TAG_VERSION}-${ARMV7_TAG} || echo ""' | ||||
|         } | ||||
|       } | ||||
|     } | ||||
|     stage('Develop Cleanup') { | ||||
|       when { | ||||
|         branch 'develop' | ||||
|       } | ||||
|       steps { | ||||
|         ansiColor('xterm') { | ||||
|           sh 'docker rmi jc21/${IMAGE}:develop jc21/${IMAGE}:develop-${AMD64_TAG} || echo ""' | ||||
|         } | ||||
|       } | ||||
|     } | ||||
|     stage('PR Cleanup') { | ||||
|       when { | ||||
|         changeRequest() | ||||
|       } | ||||
|       steps { | ||||
|         ansiColor('xterm') { | ||||
|           sh 'docker rmi jc21/${IMAGE}:github-${BRANCH_LOWER}-${AMD64_TAG} || echo ""' | ||||
|         } | ||||
|       } | ||||
|     } | ||||
|   } | ||||
|   post { | ||||
|     success { | ||||
|       juxtapose event: 'success' | ||||
|       sh 'figlet "SUCCESS"' | ||||
|     } | ||||
|     failure { | ||||
|       juxtapose event: 'failure' | ||||
|       sh 'figlet "FAILURE"' | ||||
|     } | ||||
|   } | ||||
| } | ||||
|  | ||||
| def getPackageVersion() { | ||||
|   ver = sh(script: 'docker run --rm -v $(pwd):/data ${DOCKER_CI_TOOLS} bash -c "cat /data/package.json|jq -r \'.version\'"', returnStdout: true) | ||||
|   return ver.trim() | ||||
| 					junit 'test/results/junit/*' | ||||
| 					sh 'docker-compose down --remove-orphans --volumes -t 30 || true' | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 		stage('MultiArch Build') { | ||||
| 			when { | ||||
| 				not { | ||||
| 					equals expected: 'UNSTABLE', actual: currentBuild.result | ||||
| 				} | ||||
| 			} | ||||
| 			steps { | ||||
| 				withCredentials([usernamePassword(credentialsId: 'jc21-dockerhub', passwordVariable: 'dpass', usernameVariable: 'duser')]) { | ||||
| 					sh 'docker login -u "${duser}" -p "${dpass}"' | ||||
| 					sh "./scripts/buildx --push ${buildxPushTags}" | ||||
| 					// sh './scripts/buildx -o type=local,dest=docker-build' | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 		stage('Docs / Comment') { | ||||
| 			parallel { | ||||
| 				stage('Docs Job') { | ||||
| 					when { | ||||
| 						allOf { | ||||
| 							branch pattern: "^(develop|master|v3)\$", comparator: "REGEXP" | ||||
| 							not { | ||||
| 								equals expected: 'UNSTABLE', actual: currentBuild.result | ||||
| 							} | ||||
| 						} | ||||
| 					} | ||||
| 					steps { | ||||
| 						build wait: false, job: 'nginx-proxy-manager-docs', parameters: [string(name: 'docs_branch', value: "$BRANCH_NAME")] | ||||
| 					} | ||||
| 				} | ||||
| 				stage('PR Comment') { | ||||
| 					when { | ||||
| 						allOf { | ||||
| 							changeRequest() | ||||
| 							not { | ||||
| 								equals expected: 'UNSTABLE', actual: currentBuild.result | ||||
| 							} | ||||
| 						} | ||||
| 					} | ||||
| 					steps { | ||||
| 						script { | ||||
| 							npmGithubPrComment("Docker Image for build ${BUILD_NUMBER} is available on [DockerHub](https://cloud.docker.com/repository/docker/jc21/${IMAGE}) as `jc21/${IMAGE}:github-${BRANCH_LOWER}`\n\n**Note:** ensure you backup your NPM instance before testing this PR image! Especially if this PR contains database changes.", true) | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 	post { | ||||
| 		always { | ||||
| 			sh './scripts/ci/build-cleanup' | ||||
| 			echo 'Reverting ownership' | ||||
| 			sh 'docker run --rm -v $(pwd):/data jc21/gotools:latest chown -R "$(id -u):$(id -g)" /data' | ||||
| 			printResult() | ||||
| 		} | ||||
| 		failure { | ||||
| 			archiveArtifacts(artifacts: 'debug/**/*', allowEmptyArchive: true) | ||||
| 			dir(path: 'test') { | ||||
| 				archiveArtifacts allowEmptyArchive: true, artifacts: 'results/**/*', excludes: '**/*.xml' | ||||
| 			} | ||||
| 		} | ||||
| 		unstable { | ||||
| 			archiveArtifacts(artifacts: 'debug/**/*', allowEmptyArchive: true) | ||||
| 			dir(path: 'test') { | ||||
| 				archiveArtifacts allowEmptyArchive: true, artifacts: 'results/**/*', excludes: '**/*.xml' | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|   | ||||
							
								
								
									
										134
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										134
									
								
								README.md
									
									
									
									
									
								
							| @@ -1,15 +1,22 @@ | ||||
|  | ||||
|  | ||||
| # Nginx Proxy Manager | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| <p align="center"> | ||||
| 	<img src="https://nginxproxymanager.com/github.png"> | ||||
| 	<br><br> | ||||
| 	<img src="https://img.shields.io/badge/version-2.9.19-green.svg?style=for-the-badge"> | ||||
| 	<a href="https://hub.docker.com/repository/docker/jc21/nginx-proxy-manager"> | ||||
| 		<img src="https://img.shields.io/docker/stars/jc21/nginx-proxy-manager.svg?style=for-the-badge"> | ||||
| 	</a> | ||||
| 	<a href="https://hub.docker.com/repository/docker/jc21/nginx-proxy-manager"> | ||||
| 		<img src="https://img.shields.io/docker/pulls/jc21/nginx-proxy-manager.svg?style=for-the-badge"> | ||||
| 	</a> | ||||
| </p> | ||||
|  | ||||
| This project comes as a pre-built docker image that enables you to easily forward to your websites | ||||
| running at home or otherwise, including free SSL, without having to know too much about Nginx or Letsencrypt. | ||||
|  | ||||
|   | ||||
| - [Quick Setup](#quick-setup) | ||||
| - [Full Setup](https://nginxproxymanager.com/setup/) | ||||
| - [Screenshots](https://nginxproxymanager.com/screenshots/) | ||||
|  | ||||
| ## Project Goal | ||||
|  | ||||
| I created this project to fill a personal need to provide users with a easy way to accomplish reverse | ||||
| @@ -17,71 +24,78 @@ proxying hosts with SSL termination and it had to be so easy that a monkey could | ||||
| While there might be advanced options they are optional and the project should be as simple as possible | ||||
| so that the barrier for entry here is low. | ||||
|  | ||||
| <a href="https://www.buymeacoffee.com/jc21" target="_blank"><img src="http://public.jc21.com/github/by-me-a-coffee.png" alt="Buy Me A Coffee" style="height: 51px !important;width: 217px !important;" ></a> | ||||
|  | ||||
|  | ||||
| ## Features | ||||
|  | ||||
| - Beautiful and Secure Admin Interface based on [Tabler](https://tabler.github.io/) | ||||
| - Beautiful and Secure Admin Interface based on [Chakra UI](https://chakra-ui.com/) | ||||
| - Easily create forwarding domains, redirections, streams and 404 hosts without knowing anything about Nginx | ||||
| - Free SSL using Let's Encrypt or provide your own custom SSL certificates  | ||||
| - Free SSL using Let's Encrypt or provide your own custom SSL certificates | ||||
| - Access Lists and basic HTTP Authentication for your hosts | ||||
| - Advanced Nginx configuration available for super users | ||||
| - User management, permissions and audit log | ||||
|  | ||||
|  | ||||
| ## Screenshots | ||||
|  | ||||
| [](https://public.jc21.com/nginx-proxy-manager/v2/large/login.jpg) | ||||
| [](https://public.jc21.com/nginx-proxy-manager/v2/large/dashboard.jpg) | ||||
| [](https://public.jc21.com/nginx-proxy-manager/v2/large/proxy-hosts.jpg) | ||||
| [](https://public.jc21.com/nginx-proxy-manager/v2/large/proxy-hosts-new1.jpg) | ||||
| [](https://public.jc21.com/nginx-proxy-manager/v2/large/proxy-hosts-new2.jpg) | ||||
| [](https://public.jc21.com/nginx-proxy-manager/v2/large/redirection-hosts.jpg) | ||||
| [](https://public.jc21.com/nginx-proxy-manager/v2/large/redirection-hosts-new1.jpg) | ||||
| [](https://public.jc21.com/nginx-proxy-manager/v2/large/streams.jpg) | ||||
| [](https://public.jc21.com/nginx-proxy-manager/v2/large/streams-new1.jpg) | ||||
| [](https://public.jc21.com/nginx-proxy-manager/v2/large/dead-hosts.jpg) | ||||
| [](https://public.jc21.com/nginx-proxy-manager/v2/large/dead-hosts-new1.jpg) | ||||
| [](https://public.jc21.com/nginx-proxy-manager/v2/large/certificates.jpg) | ||||
| [](https://public.jc21.com/nginx-proxy-manager/v2/large/certificates-new1.jpg) | ||||
| [](https://public.jc21.com/nginx-proxy-manager/v2/large/certificates-new2.jpg) | ||||
| [](https://public.jc21.com/nginx-proxy-manager/v2/large/access-lists.jpg) | ||||
| [](https://public.jc21.com/nginx-proxy-manager/v2/large/access-lists-new1.jpg) | ||||
| [](https://public.jc21.com/nginx-proxy-manager/v2/large/users.jpg) | ||||
| [](https://public.jc21.com/nginx-proxy-manager/v2/large/users-permissions.jpg) | ||||
| [](https://public.jc21.com/nginx-proxy-manager/v2/large/audit-log.jpg) | ||||
|  | ||||
|  | ||||
| ## Getting started | ||||
|  | ||||
| Please consult the [installation instructions](doc/INSTALL.md) for a complete guide or | ||||
| if you just want to get up and running in the quickest time possible, grab all the files in the `doc/example/` folder and run `docker-compose up -d`  | ||||
|  | ||||
|  | ||||
| ## Administration | ||||
|  | ||||
| When your docker container is running, connect to it on port `81` for the admin interface. | ||||
|  | ||||
| [http://localhost:81](http://localhost:81) | ||||
|  | ||||
| Note: Requesting SSL Certificates won't work until this project is accessible from the outside world, as explained below. | ||||
|  | ||||
|  | ||||
| ### Default Administrator User | ||||
|  | ||||
| ``` | ||||
| Email:    admin@example.com | ||||
| Password: changeme | ||||
| ``` | ||||
|  | ||||
| Immediately after logging in with this default user you will be asked to modify your details and change your password. | ||||
|  | ||||
|  | ||||
| ## Hosting your home network | ||||
|  | ||||
| I won't go in to too much detail here but here are the basics for someone new to this self-hosted world. | ||||
|  | ||||
| 1. Your home router will have a Port Forwarding section somewhere. Log in and find it | ||||
| 2. Add port forwarding for port 80 and 443 to the server hosting this project | ||||
| 3. Configure your domain name details to point to your home, either with a static ip or a service like DuckDNS | ||||
| 4. Use the Nginx Proxy Manager here as your gateway to forward to your other web based services | ||||
| 3. Configure your domain name details to point to your home, either with a static ip or a service like DuckDNS or [Amazon Route53](https://github.com/jc21/route53-ddns) | ||||
| 4. Use the Nginx Proxy Manager as your gateway to forward to your other web based services | ||||
|  | ||||
|  | ||||
| ## Quickest Setup | ||||
|  | ||||
| 1. Install Docker and Docker-Compose | ||||
|  | ||||
| - [Docker Install documentation](https://docs.docker.com/install/) | ||||
| - [Docker-Compose Install documentation](https://docs.docker.com/compose/install/) | ||||
|  | ||||
| 2. Create a docker-compose.yml file similar to this: | ||||
|  | ||||
| ```yml | ||||
| version: '3' | ||||
| services: | ||||
|   app: | ||||
|     image: 'jc21/nginx-proxy-manager:v3' | ||||
|     restart: unless-stopped | ||||
|     ports: | ||||
|       - '80:80' | ||||
|       - '81:81' | ||||
|       - '443:443' | ||||
|     volumes: | ||||
|       - ./data:/data | ||||
| ``` | ||||
|  | ||||
| 3. Bring up your stack by running | ||||
|  | ||||
| ```bash | ||||
| docker-compose up -d | ||||
|  | ||||
| # If using docker-compose-plugin | ||||
| docker compose up -d | ||||
| ``` | ||||
|  | ||||
| 4. Log in to the Admin UI | ||||
|  | ||||
| When your docker container is running, connect to it on port `81` for the admin interface. | ||||
|  | ||||
| [http://127.0.0.1:81](http://127.0.0.1:81) | ||||
|  | ||||
| ## Contributors | ||||
|  | ||||
| Special thanks to [all of our contributors](https://github.com/NginxProxyManager/nginx-proxy-manager/graphs/contributors). | ||||
|  | ||||
| ## Getting Support | ||||
|  | ||||
| 1. [Found a bug?](https://github.com/NginxProxyManager/nginx-proxy-manager/issues) | ||||
| 2. [Discussions](https://github.com/NginxProxyManager/nginx-proxy-manager/discussions) | ||||
| 3. [Development Gitter](https://gitter.im/nginx-proxy-manager/community) | ||||
| 4. [Reddit](https://reddit.com/r/nginxproxymanager) | ||||
|  | ||||
| ## Become a Contributor | ||||
|  | ||||
| A guide to setting up your own development environment [is found here](DEV-README.md). | ||||
|   | ||||
							
								
								
									
										8
									
								
								backend/.editorconfig
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								backend/.editorconfig
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,8 @@ | ||||
| root = true | ||||
|  | ||||
| [*] | ||||
| indent_style = tab | ||||
| indent_size = 4 | ||||
| charset = utf-8 | ||||
| trim_trailing_whitespace = true | ||||
| insert_final_newline = false | ||||
							
								
								
									
										63
									
								
								backend/.golangci.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										63
									
								
								backend/.golangci.yml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,63 @@ | ||||
| linters: | ||||
|     enable: | ||||
|         - bodyclose | ||||
|         - errcheck | ||||
|         - gosimple | ||||
|         - govet | ||||
|         - gosec | ||||
|         - goconst | ||||
|         - gocritic | ||||
|         - gocyclo | ||||
|         - gofmt | ||||
|         - goimports | ||||
|         - ineffassign | ||||
|         - misspell | ||||
|         - nakedret | ||||
|         - prealloc | ||||
|         #- revive | ||||
|         - staticcheck | ||||
|         - typecheck | ||||
|         - unused | ||||
|         - unconvert | ||||
|         - unparam | ||||
| linters-settings: | ||||
|     gosec: | ||||
|       excludes: | ||||
|         - G115 | ||||
|     errcheck: | ||||
|       exclude-functions: | ||||
|         - fmt.Fprint | ||||
|         - fmt.Fprintf | ||||
|     goconst: | ||||
|         # minimal length of string constant | ||||
|         # default: 3 | ||||
|         min-len: 2 | ||||
|         # minimum number of occurrences of string constant | ||||
|         # default: 3 | ||||
|         min-occurences: 2 | ||||
|     misspell: | ||||
|         locale: UK | ||||
|         ignore-words: | ||||
|             - color | ||||
| issues: | ||||
|     # Maximum count of issues with the same text. Set to 0 to disable. Default is 3. | ||||
|     # We have chosen an arbitrary value that works based on practical usage. | ||||
|     max-same: 20 | ||||
|     # See cmdline flag documentation for more info about default excludes --exclude-use-default | ||||
|     # Nothing is excluded by default | ||||
|     exclude-use-default: false | ||||
|     # Excluding configuration per-path, per-linter, per-text and per-source | ||||
|     exclude-rules: | ||||
|         # Exclude some linters from running on tests files. # TODO: Add examples why this is good | ||||
|  | ||||
|         - path: _test\.go | ||||
|           linters: | ||||
|               # Tests should be simple? Add example why this is good? | ||||
|               - gocyclo | ||||
|               # Error checking adds verbosity and complexity for minimal value | ||||
|               - errcheck | ||||
|               # Table test encourage duplication in defining the table tests. | ||||
|               - dupl | ||||
|               # Hard coded example tokens, SQL injection and other bad practices may | ||||
|               # want to be tested | ||||
|               - gosec | ||||
							
								
								
									
										21
									
								
								backend/.testcoverage.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								backend/.testcoverage.yml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,21 @@ | ||||
| --- | ||||
|  | ||||
| # (mandatory) | ||||
| # Path to coverprofile file (output of `go test -coverprofile` command). | ||||
| profile: coverage.out | ||||
|  | ||||
| # (optional; but recommended to set) | ||||
| # When specified reported file paths will not contain local prefix in the output | ||||
| local-prefix: "npm" | ||||
|  | ||||
| # Holds coverage thresholds percentages, values should be in range [0-100] | ||||
| threshold: | ||||
|   # (optional; default 0) | ||||
|   # The minimum coverage that each file should have | ||||
|   # file: 70 | ||||
|   # (optional; default 0) | ||||
|   # The minimum coverage that each package should have | ||||
|   # package: 30 | ||||
|   # (optional; default 0) | ||||
|   # The minimum total coverage project should have | ||||
|   total: 30 | ||||
							
								
								
									
										6
									
								
								backend/README.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								backend/README.md
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,6 @@ | ||||
| # Backend | ||||
|  | ||||
| ## Guides and materials | ||||
|  | ||||
| -   [Nginx Proxy Protocol](https://docs.nginx.com/nginx/admin-guide/load-balancer/using-proxy-protocol/) | ||||
| - | ||||
							
								
								
									
										70
									
								
								backend/Taskfile.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										70
									
								
								backend/Taskfile.yml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,70 @@ | ||||
| version: "3" | ||||
|  | ||||
| tasks: | ||||
|     default: | ||||
|         cmds: | ||||
|             - task: run | ||||
|  | ||||
|     run: | ||||
|         desc: Build and run | ||||
|         sources: | ||||
|             - internal/**/*.go | ||||
|             - cmd/**/*.go | ||||
|             - ../frontend/src/locale/src/*.json | ||||
|         cmds: | ||||
|             - task: locale | ||||
|             - task: build | ||||
|               force: true | ||||
|             - cmd: echo -e "==> Running..." | ||||
|               silent: true | ||||
|             - cmd: ../dist/bin/server | ||||
|               ignore_error: true | ||||
|               silent: true | ||||
|         env: | ||||
|             LOG_LEVEL: debug | ||||
|  | ||||
|     build: | ||||
|         desc: Build the server | ||||
|         cmds: | ||||
|             - cmd: echo -e "==> Building..." | ||||
|               silent: true | ||||
|             - cmd: rm -f dist/bin/* | ||||
|               silent: true | ||||
|             - cmd: go build -tags 'json1' -buildvcs=false -ldflags="-X main.commit={{.GIT_COMMIT}} -X main.version={{.VERSION}}" -o ../dist/bin/server ./cmd/server/main.go | ||||
|               silent: true | ||||
|             - cmd: go build -buildvcs=false -ldflags="-X main.commit={{.GIT_COMMIT}} -X main.version={{.VERSION}}" -o ../dist/bin/ipranges ./cmd/ipranges/main.go | ||||
|               silent: true | ||||
|             - cmd: rm -f /etc/nginx/conf.d/include/ipranges.conf && /app/dist/bin/ipranges > /etc/nginx/conf.d/include/ipranges.conf | ||||
|             - task: lint | ||||
|         vars: | ||||
|             GIT_COMMIT: | ||||
|                 sh: git log -n 1 --format=%h | ||||
|             VERSION: | ||||
|                 sh: cat ../.version | ||||
|  | ||||
|     lint: | ||||
|         desc: Linting | ||||
|         cmds: | ||||
|             - cmd: echo -e "==> Linting..." | ||||
|               silent: true | ||||
|             - cmd: bash scripts/lint.sh | ||||
|               silent: true | ||||
|  | ||||
|     test: | ||||
|         desc: Testing | ||||
|         cmds: | ||||
|             - cmd: echo -e "==> Testing..." | ||||
|               silent: true | ||||
|             - cmd: bash scripts/test.sh | ||||
|               silent: true | ||||
|  | ||||
|     locale: | ||||
|         desc: Locale | ||||
|         dir: /app/frontend | ||||
|         cmds: | ||||
|             - cmd: yarn locale-compile | ||||
|               silent: true | ||||
|               ignore_error: true | ||||
|             - cmd: chown -R "$PUID:$PGID" src/locale/lang | ||||
|               silent: true | ||||
|               ignore_error: true | ||||
							
								
								
									
										125
									
								
								backend/cmd/ipranges/main.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										125
									
								
								backend/cmd/ipranges/main.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,125 @@ | ||||
| package main | ||||
|  | ||||
| import ( | ||||
| 	"bufio" | ||||
| 	"encoding/json" | ||||
| 	"fmt" | ||||
| 	"io" | ||||
| 	"net/http" | ||||
| 	"os" | ||||
|  | ||||
| 	"npm/internal/config" | ||||
| 	"npm/internal/model" | ||||
|  | ||||
| 	"github.com/rotisserie/eris" | ||||
| ) | ||||
|  | ||||
| var commit string | ||||
| var version string | ||||
|  | ||||
| var cloudfrontURL = "https://ip-ranges.amazonaws.com/ip-ranges.json" | ||||
| var cloudflare4URL = "https://www.cloudflare.com/ips-v4" | ||||
| var cloudflare6URL = "https://www.cloudflare.com/ips-v6" | ||||
|  | ||||
| func main() { | ||||
| 	config.InitArgs(&version, &commit) | ||||
| 	if err := config.InitIPRanges(&version, &commit); err != nil { | ||||
| 		fmt.Printf("# Config ERROR: %v\n", err) | ||||
| 		os.Exit(1) | ||||
| 	} | ||||
|  | ||||
| 	exitCode := 0 | ||||
|  | ||||
| 	// Cloudfront | ||||
| 	fmt.Printf("# Cloudfront Ranges from: %s\n", cloudfrontURL) | ||||
| 	if ranges, err := parseCloudfront(); err == nil { | ||||
| 		for _, item := range ranges { | ||||
| 			fmt.Printf("set_real_ip_from %s;\n", item) | ||||
| 		} | ||||
| 	} else { | ||||
| 		fmt.Printf("# ERROR: %v\n", err) | ||||
| 	} | ||||
|  | ||||
| 	// Cloudflare ipv4 | ||||
| 	if !config.Configuration.DisableIPV4 { | ||||
| 		fmt.Printf("\n# Cloudflare Ranges from: %s\n", cloudflare4URL) | ||||
| 		if ranges, err := parseCloudflare(cloudflare4URL); err == nil { | ||||
| 			for _, item := range ranges { | ||||
| 				fmt.Printf("set_real_ip_from %s;\n", item) | ||||
| 			} | ||||
| 		} else { | ||||
| 			fmt.Printf("# ERROR: %v\n", err) | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	// Cloudflare ipv6 | ||||
| 	if !config.Configuration.DisableIPV6 { | ||||
| 		fmt.Printf("\n# Cloudflare Ranges from: %s\n", cloudflare6URL) | ||||
| 		if ranges, err := parseCloudflare(cloudflare6URL); err == nil { | ||||
| 			for _, item := range ranges { | ||||
| 				fmt.Printf("set_real_ip_from %s;\n", item) | ||||
| 			} | ||||
| 		} else { | ||||
| 			fmt.Printf("# ERROR: %v\n", err) | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	// Done | ||||
| 	os.Exit(exitCode) | ||||
| } | ||||
|  | ||||
| func parseCloudfront() ([]string, error) { | ||||
| 	// nolint: gosec | ||||
| 	resp, err := http.Get(cloudfrontURL) | ||||
| 	if err != nil { | ||||
| 		return nil, eris.Wrapf(err, "Failed to download Cloudfront IP Ranges from %s", cloudfrontURL) | ||||
| 	} | ||||
|  | ||||
| 	// nolint: errcheck, gosec | ||||
| 	defer resp.Body.Close() | ||||
| 	body, err := io.ReadAll(resp.Body) | ||||
| 	if err != nil { | ||||
| 		return nil, eris.Wrapf(err, "Failed to read Cloudfront IP Ranges body") | ||||
| 	} | ||||
|  | ||||
| 	var result model.CloudfrontIPRanges | ||||
| 	if err := json.Unmarshal(body, &result); err != nil { | ||||
| 		return nil, eris.Wrapf(err, "Failed to unmarshal Cloudfront IP Ranges file") | ||||
| 	} | ||||
|  | ||||
| 	ranges := make([]string, 0) | ||||
| 	if !config.Configuration.DisableIPV4 { | ||||
| 		for _, item := range result.IPV4Prefixes { | ||||
| 			ranges = append(ranges, item.Value) | ||||
| 		} | ||||
| 	} | ||||
| 	if !config.Configuration.DisableIPV6 { | ||||
| 		for _, item := range result.IPV6Prefixes { | ||||
| 			ranges = append(ranges, item.Value) | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	return ranges, nil | ||||
| } | ||||
|  | ||||
| func parseCloudflare(url string) ([]string, error) { | ||||
| 	// nolint: gosec | ||||
| 	resp, err := http.Get(url) | ||||
| 	if err != nil { | ||||
| 		return nil, eris.Wrapf(err, "Failed to download Cloudflare IP Ranges from %s", url) | ||||
| 	} | ||||
|  | ||||
| 	// nolint: errcheck, gosec | ||||
| 	defer resp.Body.Close() | ||||
|  | ||||
| 	scanner := bufio.NewScanner(resp.Body) | ||||
| 	scanner.Split(bufio.ScanLines) | ||||
|  | ||||
| 	ranges := make([]string, 0) | ||||
| 	for scanner.Scan() { | ||||
| 		if scanner.Text() != "" { | ||||
| 			ranges = append(ranges, scanner.Text()) | ||||
| 		} | ||||
| 	} | ||||
| 	return ranges, nil | ||||
| } | ||||
							
								
								
									
										84
									
								
								backend/cmd/server/main.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										84
									
								
								backend/cmd/server/main.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,84 @@ | ||||
| package main | ||||
|  | ||||
| import ( | ||||
| 	"os" | ||||
| 	"os/signal" | ||||
| 	"syscall" | ||||
|  | ||||
| 	"npm/internal/api" | ||||
| 	"npm/internal/config" | ||||
| 	"npm/internal/database" | ||||
| 	"npm/internal/entity/certificate" | ||||
| 	"npm/internal/entity/host" | ||||
| 	"npm/internal/entity/user" | ||||
| 	"npm/internal/errors" | ||||
| 	"npm/internal/jobqueue" | ||||
| 	"npm/internal/jwt" | ||||
| 	"npm/internal/logger" | ||||
| ) | ||||
|  | ||||
| var commit string | ||||
| var version string | ||||
|  | ||||
| func main() { | ||||
| 	config.InitArgs(&version, &commit) | ||||
| 	config.Init(&version, &commit) | ||||
| 	config.CreateDataFolders() | ||||
| 	logger.Info("Build Version: %s (%s)", version, commit) | ||||
|  | ||||
| 	database.Migrate(func() { | ||||
| 		if err := jwt.LoadKeys(); err != nil { | ||||
| 			logger.Error("KeysError", err) | ||||
| 			os.Exit(1) | ||||
| 		} | ||||
|  | ||||
| 		checkSetup() | ||||
|  | ||||
| 		// Internal Job Queue | ||||
| 		jobqueue.Start() | ||||
| 		certificate.AddPendingJobs() | ||||
| 		host.AddPendingJobs() | ||||
|  | ||||
| 		// Http server | ||||
| 		api.StartServer() | ||||
| 		irqchan := make(chan os.Signal, 1) | ||||
| 		signal.Notify(irqchan, syscall.SIGINT, syscall.SIGTERM) | ||||
|  | ||||
| 		for irq := range irqchan { | ||||
| 			if irq == syscall.SIGINT || irq == syscall.SIGTERM { | ||||
| 				logger.Info("Got ", irq, " shutting server down ...") | ||||
| 				// Close db | ||||
| 				sqlDB, _ := database.GetDB().DB() | ||||
| 				err := sqlDB.Close() | ||||
| 				if err != nil { | ||||
| 					logger.Error("DatabaseCloseError", err) | ||||
| 				} | ||||
| 				// nolint | ||||
| 				jobqueue.Shutdown() | ||||
| 				break | ||||
| 			} | ||||
| 		} | ||||
| 	}) | ||||
| } | ||||
|  | ||||
| // checkSetup Quick check by counting the number of users in the database | ||||
| func checkSetup() { | ||||
| 	db := database.GetDB() | ||||
| 	var count int64 | ||||
|  | ||||
| 	if db != nil { | ||||
| 		db.Model(&user.Model{}). | ||||
| 			Where("is_disabled = ?", false). | ||||
| 			Where("is_system = ?", false). | ||||
| 			Count(&count) | ||||
|  | ||||
| 		if count == 0 { | ||||
| 			logger.Warn("No users found, starting in Setup Mode") | ||||
| 		} else { | ||||
| 			config.IsSetup = true | ||||
| 			logger.Info("Application is setup") | ||||
| 		} | ||||
| 	} else { | ||||
| 		logger.Error("DatabaseError", errors.ErrDatabaseUnavailable) | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										310
									
								
								backend/embed/api_docs/api.swagger.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										310
									
								
								backend/embed/api_docs/api.swagger.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,310 @@ | ||||
| { | ||||
| 	"openapi": "3.0.0", | ||||
| 	"info": { | ||||
| 		"title": "Nginx Proxy Manager API", | ||||
| 		"version": "{{VERSION}}" | ||||
| 	}, | ||||
| 	"paths": { | ||||
| 		"/": { | ||||
| 			"get": { | ||||
| 				"$ref": "file://./paths/get.json" | ||||
| 			} | ||||
| 		}, | ||||
| 		"/auth": { | ||||
| 			"get": { | ||||
| 				"$ref": "file://./paths/auth/get.json" | ||||
| 			}, | ||||
| 			"post": { | ||||
| 				"$ref": "file://./paths/auth/post.json" | ||||
| 			} | ||||
| 		}, | ||||
| 		"/auth/refresh": { | ||||
| 			"post": { | ||||
| 				"$ref": "file://./paths/auth/refresh/post.json" | ||||
| 			} | ||||
| 		}, | ||||
| 		"/auth/sse": { | ||||
| 			"post": { | ||||
| 				"$ref": "file://./paths/auth/sse/post.json" | ||||
| 			} | ||||
| 		}, | ||||
| 		"/certificates": { | ||||
| 			"get": { | ||||
| 				"$ref": "file://./paths/certificates/get.json" | ||||
| 			}, | ||||
| 			"post": { | ||||
| 				"$ref": "file://./paths/certificates/post.json" | ||||
| 			} | ||||
| 		}, | ||||
| 		"/certificates/{certificateID}": { | ||||
| 			"get": { | ||||
| 				"$ref": "file://./paths/certificates/certificateID/get.json" | ||||
| 			}, | ||||
| 			"put": { | ||||
| 				"$ref": "file://./paths/certificates/certificateID/put.json" | ||||
| 			}, | ||||
| 			"delete": { | ||||
| 				"$ref": "file://./paths/certificates/certificateID/delete.json" | ||||
| 			} | ||||
| 		}, | ||||
| 		"/certificates-authorities": { | ||||
| 			"get": { | ||||
| 				"$ref": "file://./paths/certificates-authorities/get.json" | ||||
| 			}, | ||||
| 			"post": { | ||||
| 				"$ref": "file://./paths/certificates-authorities/post.json" | ||||
| 			} | ||||
| 		}, | ||||
| 		"/certificates-authorities/{caID}": { | ||||
| 			"get": { | ||||
| 				"$ref": "file://./paths/certificates-authorities/caID/get.json" | ||||
| 			}, | ||||
| 			"put": { | ||||
| 				"$ref": "file://./paths/certificates-authorities/caID/put.json" | ||||
| 			}, | ||||
| 			"delete": { | ||||
| 				"$ref": "file://./paths/certificates-authorities/caID/delete.json" | ||||
| 			} | ||||
| 		}, | ||||
| 		"/config": { | ||||
| 			"get": { | ||||
| 				"$ref": "file://./paths/config/get.json" | ||||
| 			} | ||||
| 		}, | ||||
| 		"/dns-providers": { | ||||
| 			"get": { | ||||
| 				"$ref": "file://./paths/dns-providers/get.json" | ||||
| 			}, | ||||
| 			"post": { | ||||
| 				"$ref": "file://./paths/dns-providers/post.json" | ||||
| 			} | ||||
| 		}, | ||||
| 		"/dns-providers/{providerID}": { | ||||
| 			"get": { | ||||
| 				"$ref": "file://./paths/dns-providers/providerID/get.json" | ||||
| 			}, | ||||
| 			"put": { | ||||
| 				"$ref": "file://./paths/dns-providers/providerID/put.json" | ||||
| 			}, | ||||
| 			"delete": { | ||||
| 				"$ref": "file://./paths/dns-providers/providerID/delete.json" | ||||
| 			} | ||||
| 		}, | ||||
| 		"/hosts": { | ||||
| 			"get": { | ||||
| 				"$ref": "file://./paths/hosts/get.json" | ||||
| 			}, | ||||
| 			"post": { | ||||
| 				"$ref": "file://./paths/hosts/post.json" | ||||
| 			} | ||||
| 		}, | ||||
| 		"/hosts/{hostID}": { | ||||
| 			"get": { | ||||
| 				"$ref": "file://./paths/hosts/hostID/get.json" | ||||
| 			}, | ||||
| 			"put": { | ||||
| 				"$ref": "file://./paths/hosts/hostID/put.json" | ||||
| 			}, | ||||
| 			"delete": { | ||||
| 				"$ref": "file://./paths/hosts/hostID/delete.json" | ||||
| 			} | ||||
| 		}, | ||||
| 		"/hosts/{hostID}/nginx-config": { | ||||
| 			"get": { | ||||
| 				"$ref": "file://./paths/hosts/hostID/nginx-config/get.json" | ||||
| 			} | ||||
| 		}, | ||||
| 		"/nginx-templates": { | ||||
| 			"get": { | ||||
| 				"$ref": "file://./paths/nginx-templates/get.json" | ||||
| 			}, | ||||
| 			"post": { | ||||
| 				"$ref": "file://./paths/nginx-templates/post.json" | ||||
| 			} | ||||
| 		}, | ||||
| 		"/nginx-templates/{templateID}": { | ||||
| 			"get": { | ||||
| 				"$ref": "file://./paths/nginx-templates/templateID/get.json" | ||||
| 			}, | ||||
| 			"put": { | ||||
| 				"$ref": "file://./paths/nginx-templates/templateID/put.json" | ||||
| 			}, | ||||
| 			"delete": { | ||||
| 				"$ref": "file://./paths/nginx-templates/templateID/delete.json" | ||||
| 			} | ||||
| 		}, | ||||
| 		"/schema": { | ||||
| 			"get": { | ||||
| 				"$ref": "file://./paths/schema/get.json" | ||||
| 			} | ||||
| 		}, | ||||
| 		"/settings": { | ||||
| 			"get": { | ||||
| 				"$ref": "file://./paths/settings/get.json" | ||||
| 			}, | ||||
| 			"post": { | ||||
| 				"$ref": "file://./paths/settings/post.json" | ||||
| 			} | ||||
| 		}, | ||||
| 		"/settings/{name}": { | ||||
| 			"get": { | ||||
| 				"$ref": "file://./paths/settings/name/get.json" | ||||
| 			}, | ||||
| 			"put": { | ||||
| 				"$ref": "file://./paths/settings/name/put.json" | ||||
| 			} | ||||
| 		}, | ||||
| 		"/streams": { | ||||
| 			"get": { | ||||
| 				"$ref": "file://./paths/streams/get.json" | ||||
| 			}, | ||||
| 			"post": { | ||||
| 				"$ref": "file://./paths/streams/post.json" | ||||
| 			} | ||||
| 		}, | ||||
| 		"/streams/{streamID}": { | ||||
| 			"get": { | ||||
| 				"$ref": "file://./paths/streams/streamID/get.json" | ||||
| 			}, | ||||
| 			"put": { | ||||
| 				"$ref": "file://./paths/streams/streamID/put.json" | ||||
| 			}, | ||||
| 			"delete": { | ||||
| 				"$ref": "file://./paths/streams/streamID/delete.json" | ||||
| 			} | ||||
| 		}, | ||||
| 		"/upstreams": { | ||||
| 			"get": { | ||||
| 				"$ref": "file://./paths/upstreams/get.json" | ||||
| 			}, | ||||
| 			"post": { | ||||
| 				"$ref": "file://./paths/upstreams/post.json" | ||||
| 			} | ||||
| 		}, | ||||
| 		"/upstreams/{upstreamID}": { | ||||
| 			"get": { | ||||
| 				"$ref": "file://./paths/upstreams/upstreamID/get.json" | ||||
| 			}, | ||||
| 			"put": { | ||||
| 				"$ref": "file://./paths/upstreams/upstreamID/put.json" | ||||
| 			}, | ||||
| 			"delete": { | ||||
| 				"$ref": "file://./paths/upstreams/upstreamID/delete.json" | ||||
| 			} | ||||
| 		}, | ||||
| 		"/upstreams/{upstreamID}/nginx-config": { | ||||
| 			"get": { | ||||
| 				"$ref": "file://./paths/upstreams/upstreamID/nginx-config/get.json" | ||||
| 			} | ||||
| 		}, | ||||
| 		"/users": { | ||||
| 			"get": { | ||||
| 				"$ref": "file://./paths/users/get.json" | ||||
| 			}, | ||||
| 			"post": { | ||||
| 				"$ref": "file://./paths/users/post.json" | ||||
| 			} | ||||
| 		}, | ||||
| 		"/users/{userID}": { | ||||
| 			"get": { | ||||
| 				"$ref": "file://./paths/users/userID/get.json" | ||||
| 			}, | ||||
| 			"put": { | ||||
| 				"$ref": "file://./paths/users/userID/put.json" | ||||
| 			}, | ||||
| 			"delete": { | ||||
| 				"$ref": "file://./paths/users/userID/delete.json" | ||||
| 			} | ||||
| 		}, | ||||
| 		"/users/{userID}/auth": { | ||||
| 			"post": { | ||||
| 				"$ref": "file://./paths/users/userID/auth/post.json" | ||||
| 			} | ||||
| 		} | ||||
| 	}, | ||||
| 	"components": { | ||||
| 		"schemas": { | ||||
| 			"AuthConfigObject": { | ||||
| 				"$ref": "file://./components/AuthConfigObject.json" | ||||
| 			}, | ||||
| 			"CertificateAuthorityList": { | ||||
| 				"$ref": "file://./components/CertificateAuthorityList.json" | ||||
| 			}, | ||||
| 			"CertificateAuthorityObject": { | ||||
| 				"$ref": "file://./components/CertificateAuthorityObject.json" | ||||
| 			}, | ||||
| 			"CertificateList": { | ||||
| 				"$ref": "file://./components/CertificateList.json" | ||||
| 			}, | ||||
| 			"CertificateObject": { | ||||
| 				"$ref": "file://./components/CertificateObject.json" | ||||
| 			}, | ||||
| 			"ConfigObject": { | ||||
| 				"$ref": "file://./components/ConfigObject.json" | ||||
| 			}, | ||||
| 			"DeletedItemResponse": { | ||||
| 				"$ref": "file://./components/DeletedItemResponse.json" | ||||
| 			}, | ||||
| 			"DNSProviderList": { | ||||
| 				"$ref": "file://./components/DNSProviderList.json" | ||||
| 			}, | ||||
| 			"DNSProviderObject": { | ||||
| 				"$ref": "file://./components/DNSProviderObject.json" | ||||
| 			}, | ||||
| 			"ErrorObject": { | ||||
| 				"$ref": "file://./components/ErrorObject.json" | ||||
| 			}, | ||||
| 			"FilterObject": { | ||||
| 				"$ref": "file://./components/FilterObject.json" | ||||
| 			}, | ||||
| 			"HealthObject": { | ||||
| 				"$ref": "file://./components/HealthObject.json" | ||||
| 			}, | ||||
| 			"HostList": { | ||||
| 				"$ref": "file://./components/HostList.json" | ||||
| 			}, | ||||
| 			"HostObject": { | ||||
| 				"$ref": "file://./components/HostObject.json" | ||||
| 			}, | ||||
| 			"NginxTemplateList": { | ||||
| 				"$ref": "file://./components/NginxTemplateList.json" | ||||
| 			}, | ||||
| 			"NginxTemplateObject": { | ||||
| 				"$ref": "file://./components/NginxTemplateObject.json" | ||||
| 			}, | ||||
| 			"SettingList": { | ||||
| 				"$ref": "file://./components/SettingList.json" | ||||
| 			}, | ||||
| 			"SettingObject": { | ||||
| 				"$ref": "file://./components/SettingObject.json" | ||||
| 			}, | ||||
| 			"SortObject": { | ||||
| 				"$ref": "file://./components/SortObject.json" | ||||
| 			}, | ||||
| 			"StreamList": { | ||||
| 				"$ref": "file://./components/StreamList.json" | ||||
| 			}, | ||||
| 			"StreamObject": { | ||||
| 				"$ref": "file://./components/StreamObject.json" | ||||
| 			}, | ||||
| 			"TokenObject": { | ||||
| 				"$ref": "file://./components/TokenObject.json" | ||||
| 			}, | ||||
| 			"UpstreamList": { | ||||
| 				"$ref": "file://./components/UpstreamList.json" | ||||
| 			}, | ||||
| 			"UpstreamObject": { | ||||
| 				"$ref": "file://./components/UpstreamObject.json" | ||||
| 			}, | ||||
| 			"UserAuthObject": { | ||||
| 				"$ref": "file://./components/UserAuthObject.json" | ||||
| 			}, | ||||
| 			"UserList": { | ||||
| 				"$ref": "file://./components/UserList.json" | ||||
| 			}, | ||||
| 			"UserObject": { | ||||
| 				"$ref": "file://./components/UserObject.json" | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										13
									
								
								backend/embed/api_docs/components/AuthConfigObject.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								backend/embed/api_docs/components/AuthConfigObject.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,13 @@ | ||||
| { | ||||
| 	"type": "array", | ||||
| 	"description": "AuthConfigObject", | ||||
| 	"minItems": 1, | ||||
| 	"items": { | ||||
| 		"type": "string", | ||||
| 		"enum": [ | ||||
| 			"local", | ||||
| 			"ldap", | ||||
| 			"oauth" | ||||
| 		] | ||||
| 	} | ||||
| } | ||||
| @@ -0,0 +1,40 @@ | ||||
| { | ||||
| 	"type": "object", | ||||
| 	"description": "CertificateAuthorityList", | ||||
| 	"additionalProperties": false, | ||||
| 	"required": ["total", "offset", "limit", "sort"], | ||||
| 	"properties": { | ||||
| 		"total": { | ||||
| 			"type": "integer", | ||||
| 			"description": "Total number of rows" | ||||
| 		}, | ||||
| 		"offset": { | ||||
| 			"type": "integer", | ||||
| 			"description": "Pagination Offset" | ||||
| 		}, | ||||
| 		"limit": { | ||||
| 			"type": "integer", | ||||
| 			"description": "Pagination Limit" | ||||
| 		}, | ||||
| 		"sort": { | ||||
| 			"type": "array", | ||||
| 			"description": "Sorting", | ||||
| 			"items": { | ||||
| 				"$ref": "#/components/schemas/SortObject" | ||||
| 			} | ||||
| 		}, | ||||
| 		"filter": { | ||||
| 			"type": "array", | ||||
| 			"description": "Filters", | ||||
| 			"items": { | ||||
| 				"$ref": "#/components/schemas/FilterObject" | ||||
| 			} | ||||
| 		}, | ||||
| 		"items": { | ||||
| 			"type": "array", | ||||
| 			"items": { | ||||
| 				"$ref": "#/components/schemas/CertificateAuthorityObject" | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @@ -0,0 +1,57 @@ | ||||
| { | ||||
| 	"type": "object", | ||||
| 	"description": "CertificateAuthorityObject", | ||||
| 	"additionalProperties": false, | ||||
| 	"required": [ | ||||
| 		"id", | ||||
| 		"created_at", | ||||
| 		"updated_at", | ||||
| 		"name", | ||||
| 		"acmesh_server", | ||||
| 		"ca_bundle", | ||||
| 		"max_domains", | ||||
| 		"is_wildcard_supported", | ||||
| 		"is_readonly" | ||||
| 	], | ||||
| 	"properties": { | ||||
| 		"id": { | ||||
| 			"type": "integer", | ||||
| 			"minimum": 1 | ||||
| 		}, | ||||
| 		"created_at": { | ||||
| 			"type": "integer", | ||||
| 			"minimum": 1, | ||||
| 			"description": "Created Unix time with milliseconds" | ||||
| 		}, | ||||
| 		"updated_at": { | ||||
| 			"type": "integer", | ||||
| 			"minimum": 1, | ||||
| 			"description": "Updated Unix time with milliseconds" | ||||
| 		}, | ||||
| 		"name": { | ||||
| 			"type": "string", | ||||
| 			"minLength": 1, | ||||
| 			"maxLength": 100 | ||||
| 		}, | ||||
| 		"acmesh_server": { | ||||
| 			"type": "string", | ||||
| 			"minLength": 2, | ||||
| 			"maxLength": 255 | ||||
| 		}, | ||||
| 		"ca_bundle": { | ||||
| 			"type": "string", | ||||
| 			"minLength": 0, | ||||
| 			"maxLength": 255 | ||||
| 		}, | ||||
| 		"max_domains": { | ||||
| 			"type": "integer", | ||||
| 			"minimum": 1 | ||||
| 		}, | ||||
| 		"is_wildcard_supported": { | ||||
| 			"type": "boolean" | ||||
| 		}, | ||||
| 		"is_readonly": { | ||||
| 			"type": "boolean" | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										40
									
								
								backend/embed/api_docs/components/CertificateList.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										40
									
								
								backend/embed/api_docs/components/CertificateList.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,40 @@ | ||||
| { | ||||
| 	"type": "object", | ||||
| 	"description": "CertificateList", | ||||
| 	"additionalProperties": false, | ||||
| 	"required": ["total", "offset", "limit", "sort"], | ||||
| 	"properties": { | ||||
| 		"total": { | ||||
| 			"type": "integer", | ||||
| 			"description": "Total number of rows" | ||||
| 		}, | ||||
| 		"offset": { | ||||
| 			"type": "integer", | ||||
| 			"description": "Pagination Offset" | ||||
| 		}, | ||||
| 		"limit": { | ||||
| 			"type": "integer", | ||||
| 			"description": "Pagination Limit" | ||||
| 		}, | ||||
| 		"sort": { | ||||
| 			"type": "array", | ||||
| 			"description": "Sorting", | ||||
| 			"items": { | ||||
| 				"$ref": "#/components/schemas/SortObject" | ||||
| 			} | ||||
| 		}, | ||||
| 		"filter": { | ||||
| 			"type": "array", | ||||
| 			"description": "Filters", | ||||
| 			"items": { | ||||
| 				"$ref": "#/components/schemas/FilterObject" | ||||
| 			} | ||||
| 		}, | ||||
| 		"items": { | ||||
| 			"type": "array", | ||||
| 			"items": { | ||||
| 				"$ref": "#/components/schemas/CertificateObject" | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										86
									
								
								backend/embed/api_docs/components/CertificateObject.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										86
									
								
								backend/embed/api_docs/components/CertificateObject.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,86 @@ | ||||
| { | ||||
| 	"type": "object", | ||||
| 	"description": "CertificateObject", | ||||
| 	"additionalProperties": false, | ||||
| 	"required": [ | ||||
| 		"id", | ||||
| 		"created_at", | ||||
| 		"updated_at", | ||||
| 		"expires_on", | ||||
| 		"type", | ||||
| 		"user_id", | ||||
| 		"certificate_authority_id", | ||||
| 		"dns_provider_id", | ||||
| 		"name", | ||||
| 		"is_ecc", | ||||
| 		"status", | ||||
| 		"domain_names" | ||||
| 	], | ||||
| 	"properties": { | ||||
| 		"id": { | ||||
| 			"type": "integer", | ||||
| 			"minimum": 1 | ||||
| 		}, | ||||
| 		"created_at": { | ||||
| 			"type": "integer", | ||||
| 			"minimum": 1, | ||||
| 			"description": "Created Unix time with milliseconds" | ||||
| 		}, | ||||
| 		"updated_at": { | ||||
| 			"type": "integer", | ||||
| 			"minimum": 1, | ||||
| 			"description": "Updated Unix time with milliseconds" | ||||
| 		}, | ||||
| 		"expires_on": { | ||||
| 			"type": "integer", | ||||
| 			"minimum": 0, | ||||
| 			"nullable": true | ||||
| 		}, | ||||
| 		"type": { | ||||
| 			"type": "string", | ||||
| 			"enum": ["custom", "http", "dns"] | ||||
| 		}, | ||||
| 		"user_id": { | ||||
| 			"type": "integer", | ||||
| 			"minimum": 1 | ||||
| 		}, | ||||
| 		"certificate_authority_id": { | ||||
| 			"type": "integer", | ||||
| 			"minimum": 0 | ||||
| 		}, | ||||
| 		"certificate_authority": { | ||||
| 			"$ref": "#/components/schemas/CertificateAuthorityObject" | ||||
| 		}, | ||||
| 		"dns_provider_id": { | ||||
| 			"type": "integer", | ||||
| 			"minimum": 0, | ||||
| 			"nullable": true | ||||
| 		}, | ||||
| 		"name": { | ||||
| 			"type": "string", | ||||
| 			"minLength": 1, | ||||
| 			"maxLength": 100 | ||||
| 		}, | ||||
| 		"domain_names": { | ||||
| 			"type": "array", | ||||
| 			"minItems": 1, | ||||
| 			"items": { | ||||
| 				"type": "string", | ||||
| 				"minLength": 4 | ||||
| 			} | ||||
| 		}, | ||||
| 		"status": { | ||||
| 			"type": "string", | ||||
| 			"enum": ["ready", "requesting", "failed", "provided"] | ||||
| 		}, | ||||
| 		"is_ecc": { | ||||
| 			"type": "boolean" | ||||
| 		}, | ||||
| 		"error_message": { | ||||
| 			"type": "string" | ||||
| 		}, | ||||
| 		"user": { | ||||
| 			"$ref": "#/components/schemas/UserObject" | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										4
									
								
								backend/embed/api_docs/components/ConfigObject.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								backend/embed/api_docs/components/ConfigObject.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,4 @@ | ||||
| { | ||||
| 	"type": "object", | ||||
| 	"description": "ConfigObject" | ||||
| } | ||||
							
								
								
									
										40
									
								
								backend/embed/api_docs/components/DNSProviderList.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										40
									
								
								backend/embed/api_docs/components/DNSProviderList.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,40 @@ | ||||
| { | ||||
| 	"type": "object", | ||||
| 	"description": "DNSProviderList", | ||||
| 	"additionalProperties": false, | ||||
| 	"required": ["total", "offset", "limit", "sort"], | ||||
| 	"properties": { | ||||
| 		"total": { | ||||
| 			"type": "integer", | ||||
| 			"description": "Total number of rows" | ||||
| 		}, | ||||
| 		"offset": { | ||||
| 			"type": "integer", | ||||
| 			"description": "Pagination Offset" | ||||
| 		}, | ||||
| 		"limit": { | ||||
| 			"type": "integer", | ||||
| 			"description": "Pagination Limit" | ||||
| 		}, | ||||
| 		"sort": { | ||||
| 			"type": "array", | ||||
| 			"description": "Sorting", | ||||
| 			"items": { | ||||
| 				"$ref": "#/components/schemas/SortObject" | ||||
| 			} | ||||
| 		}, | ||||
| 		"filter": { | ||||
| 			"type": "array", | ||||
| 			"description": "Filters", | ||||
| 			"items": { | ||||
| 				"$ref": "#/components/schemas/FilterObject" | ||||
| 			} | ||||
| 		}, | ||||
| 		"items": { | ||||
| 			"type": "array", | ||||
| 			"items": { | ||||
| 				"$ref": "#/components/schemas/DNSProviderObject" | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										51
									
								
								backend/embed/api_docs/components/DNSProviderObject.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										51
									
								
								backend/embed/api_docs/components/DNSProviderObject.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,51 @@ | ||||
| { | ||||
| 	"type": "object", | ||||
| 	"description": "DNSProviderObject", | ||||
| 	"additionalProperties": false, | ||||
| 	"required": [ | ||||
| 		"id", | ||||
| 		"created_at", | ||||
| 		"updated_at", | ||||
| 		"user_id", | ||||
| 		"name", | ||||
| 		"acmesh_name", | ||||
| 		"dns_sleep", | ||||
| 		"meta" | ||||
| 	], | ||||
| 	"properties": { | ||||
| 		"id": { | ||||
| 			"type": "integer", | ||||
| 			"minimum": 1 | ||||
| 		}, | ||||
| 		"created_at": { | ||||
| 			"type": "integer", | ||||
| 			"minimum": 1, | ||||
| 			"description": "Created Unix time with milliseconds" | ||||
| 		}, | ||||
| 		"updated_at": { | ||||
| 			"type": "integer", | ||||
| 			"minimum": 1, | ||||
| 			"description": "Updated Unix time with milliseconds" | ||||
| 		}, | ||||
| 		"user_id": { | ||||
| 			"type": "integer", | ||||
| 			"minimum": 1 | ||||
| 		}, | ||||
| 		"name": { | ||||
| 			"type": "string", | ||||
| 			"minLength": 1, | ||||
| 			"maxLength": 100 | ||||
| 		}, | ||||
| 		"acmesh_name": { | ||||
| 			"type": "string", | ||||
| 			"minLength": 4, | ||||
| 			"maxLength": 50 | ||||
| 		}, | ||||
| 		"dns_sleep": { | ||||
| 			"type": "integer" | ||||
| 		}, | ||||
| 		"meta": { | ||||
| 			"type": "object" | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										15
									
								
								backend/embed/api_docs/components/DeletedItemResponse.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								backend/embed/api_docs/components/DeletedItemResponse.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,15 @@ | ||||
| { | ||||
| 	"type": "object", | ||||
| 	"description": "DeletedItemResponse", | ||||
| 	"additionalProperties": false, | ||||
| 	"required": ["result"], | ||||
| 	"properties": { | ||||
| 		"result": { | ||||
| 			"type": "boolean", | ||||
| 			"nullable": true | ||||
| 		}, | ||||
| 		"error": { | ||||
| 			"$ref": "#/components/schemas/ErrorObject" | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										17
									
								
								backend/embed/api_docs/components/ErrorObject.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								backend/embed/api_docs/components/ErrorObject.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,17 @@ | ||||
| { | ||||
| 	"type": "object", | ||||
| 	"description": "ErrorObject", | ||||
| 	"additionalProperties": false, | ||||
| 	"required": ["code", "message"], | ||||
| 	"properties": { | ||||
| 		"code": { | ||||
| 			"type": "integer", | ||||
| 			"description": "Error code", | ||||
| 			"minimum": 0 | ||||
| 		}, | ||||
| 		"message": { | ||||
| 			"type": "string", | ||||
| 			"description": "Error message" | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										24
									
								
								backend/embed/api_docs/components/FilterObject.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								backend/embed/api_docs/components/FilterObject.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,24 @@ | ||||
| { | ||||
| 	"type": "object", | ||||
| 	"description": "FilterObject", | ||||
| 	"additionalProperties": false, | ||||
| 	"required": ["field", "modifier", "value"], | ||||
| 	"properties": { | ||||
| 		"field": { | ||||
| 			"type": "string", | ||||
| 			"description": "Field to filter with" | ||||
| 		}, | ||||
| 		"modifier": { | ||||
| 			"type": "string", | ||||
| 			"description": "Filter modifier", | ||||
| 			"pattern": "^(equals|not|min|max|greater|lesser|contains|starts|ends|in|notin)$" | ||||
| 		}, | ||||
| 		"value": { | ||||
| 			"type": "array", | ||||
| 			"description": "Values used for filtering", | ||||
| 			"items": { | ||||
| 				"type": "string" | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										31
									
								
								backend/embed/api_docs/components/HealthObject.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								backend/embed/api_docs/components/HealthObject.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,31 @@ | ||||
| { | ||||
| 	"type": "object", | ||||
| 	"description": "HealthObject", | ||||
| 	"additionalProperties": false, | ||||
| 	"required": ["version", "commit", "healthy", "setup"], | ||||
| 	"properties": { | ||||
| 		"version": { | ||||
| 			"type": "string", | ||||
| 			"description": "Version", | ||||
| 			"minLength": 1 | ||||
| 		}, | ||||
| 		"commit": { | ||||
| 			"type": "string", | ||||
| 			"description": "Commit hash", | ||||
| 			"minLength": 7 | ||||
| 		}, | ||||
| 		"healthy": { | ||||
| 			"type": "boolean", | ||||
| 			"description": "Healthy?" | ||||
| 		}, | ||||
| 		"setup": { | ||||
| 			"type": "boolean", | ||||
| 			"description": "Is the application set up?" | ||||
| 		}, | ||||
| 		"acme.sh": { | ||||
| 			"type": "string", | ||||
| 			"description": "Acme.sh version", | ||||
| 			"minLength": 1 | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										40
									
								
								backend/embed/api_docs/components/HostList.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										40
									
								
								backend/embed/api_docs/components/HostList.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,40 @@ | ||||
| { | ||||
| 	"type": "object", | ||||
| 	"description": "HostList", | ||||
| 	"additionalProperties": false, | ||||
| 	"required": ["total", "offset", "limit", "sort"], | ||||
| 	"properties": { | ||||
| 		"total": { | ||||
| 			"type": "integer", | ||||
| 			"description": "Total number of rows" | ||||
| 		}, | ||||
| 		"offset": { | ||||
| 			"type": "integer", | ||||
| 			"description": "Pagination Offset" | ||||
| 		}, | ||||
| 		"limit": { | ||||
| 			"type": "integer", | ||||
| 			"description": "Pagination Limit" | ||||
| 		}, | ||||
| 		"sort": { | ||||
| 			"type": "array", | ||||
| 			"description": "Sorting", | ||||
| 			"items": { | ||||
| 				"$ref": "#/components/schemas/SortObject" | ||||
| 			} | ||||
| 		}, | ||||
| 		"filter": { | ||||
| 			"type": "array", | ||||
| 			"description": "Filters", | ||||
| 			"items": { | ||||
| 				"$ref": "#/components/schemas/FilterObject" | ||||
| 			} | ||||
| 		}, | ||||
| 		"items": { | ||||
| 			"type": "array", | ||||
| 			"items": { | ||||
| 				"$ref": "#/components/schemas/HostObject" | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										55
									
								
								backend/embed/api_docs/components/HostObject.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										55
									
								
								backend/embed/api_docs/components/HostObject.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,55 @@ | ||||
| { | ||||
| 	"type": "object", | ||||
| 	"description": "HostObject", | ||||
| 	"additionalProperties": false, | ||||
| 	"required": [ | ||||
| 		"id", | ||||
| 		"created_at", | ||||
| 		"updated_at", | ||||
| 		"user_id", | ||||
| 		"provider", | ||||
| 		"name", | ||||
| 		"domain_names" | ||||
| 	], | ||||
| 	"properties": { | ||||
| 		"id": { | ||||
| 			"type": "integer", | ||||
| 			"minimum": 1 | ||||
| 		}, | ||||
| 		"created_at": { | ||||
| 			"type": "integer", | ||||
| 			"minimum": 1, | ||||
| 			"description": "Created Unix time with milliseconds" | ||||
| 		}, | ||||
| 		"updated_at": { | ||||
| 			"type": "integer", | ||||
| 			"minimum": 1, | ||||
| 			"description": "Updated Unix time with milliseconds" | ||||
| 		}, | ||||
| 		"user_id": { | ||||
| 			"type": "integer", | ||||
| 			"minimum": 1 | ||||
| 		}, | ||||
| 		"provider": { | ||||
| 			"type": "string", | ||||
| 			"minLength": 1, | ||||
| 			"maxLength": 100 | ||||
| 		}, | ||||
| 		"name": { | ||||
| 			"type": "string", | ||||
| 			"minLength": 1, | ||||
| 			"maxLength": 100 | ||||
| 		}, | ||||
| 		"domain_names": { | ||||
| 			"type": "array", | ||||
| 			"minItems": 1, | ||||
| 			"items": { | ||||
| 				"type": "string", | ||||
| 				"minLength": 4 | ||||
| 			} | ||||
| 		}, | ||||
| 		"user": { | ||||
| 			"$ref": "#/components/schemas/UserObject" | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										40
									
								
								backend/embed/api_docs/components/NginxTemplateList.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										40
									
								
								backend/embed/api_docs/components/NginxTemplateList.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,40 @@ | ||||
| { | ||||
| 	"type": "object", | ||||
| 	"description": "NginxTemplateList", | ||||
| 	"additionalProperties": false, | ||||
| 	"required": ["total", "offset", "limit", "sort"], | ||||
| 	"properties": { | ||||
| 		"total": { | ||||
| 			"type": "integer", | ||||
| 			"description": "Total number of rows" | ||||
| 		}, | ||||
| 		"offset": { | ||||
| 			"type": "integer", | ||||
| 			"description": "Pagination Offset" | ||||
| 		}, | ||||
| 		"limit": { | ||||
| 			"type": "integer", | ||||
| 			"description": "Pagination Limit" | ||||
| 		}, | ||||
| 		"sort": { | ||||
| 			"type": "array", | ||||
| 			"description": "Sorting", | ||||
| 			"items": { | ||||
| 				"$ref": "#/components/schemas/SortObject" | ||||
| 			} | ||||
| 		}, | ||||
| 		"filter": { | ||||
| 			"type": "array", | ||||
| 			"description": "Filters", | ||||
| 			"items": { | ||||
| 				"$ref": "#/components/schemas/FilterObject" | ||||
| 			} | ||||
| 		}, | ||||
| 		"items": { | ||||
| 			"type": "array", | ||||
| 			"items": { | ||||
| 				"$ref": "#/components/schemas/NginxTemplateObject" | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										46
									
								
								backend/embed/api_docs/components/NginxTemplateObject.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										46
									
								
								backend/embed/api_docs/components/NginxTemplateObject.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,46 @@ | ||||
| { | ||||
| 	"type": "object", | ||||
| 	"description": "NginxTemplateObject", | ||||
| 	"additionalProperties": false, | ||||
| 	"required": [ | ||||
| 		"id", | ||||
| 		"created_at", | ||||
| 		"updated_at", | ||||
| 		"user_id", | ||||
| 		"name", | ||||
| 		"type", | ||||
| 		"template" | ||||
| 	], | ||||
| 	"properties": { | ||||
| 		"id": { | ||||
| 			"type": "integer", | ||||
| 			"minimum": 1 | ||||
| 		}, | ||||
| 		"created_at": { | ||||
| 			"type": "integer", | ||||
| 			"minimum": 1, | ||||
| 			"description": "Created Unix time with milliseconds" | ||||
| 		}, | ||||
| 		"updated_at": { | ||||
| 			"type": "integer", | ||||
| 			"minimum": 1, | ||||
| 			"description": "Updated Unix time with milliseconds" | ||||
| 		}, | ||||
| 		"user_id": { | ||||
| 			"type": "integer", | ||||
| 			"minimum": 1 | ||||
| 		}, | ||||
| 		"name": { | ||||
| 			"type": "string", | ||||
| 			"minLength": 1 | ||||
| 		}, | ||||
| 		"type": { | ||||
| 			"type": "string", | ||||
| 			"pattern": "^proxy|redirect|dead|stream|upstream$" | ||||
| 		}, | ||||
| 		"template": { | ||||
| 			"type": "string", | ||||
| 			"minLength": 20 | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										40
									
								
								backend/embed/api_docs/components/SettingList.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										40
									
								
								backend/embed/api_docs/components/SettingList.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,40 @@ | ||||
| { | ||||
| 	"type": "object", | ||||
| 	"description": "SettingList", | ||||
| 	"additionalProperties": false, | ||||
| 	"required": ["total", "offset", "limit", "sort"], | ||||
| 	"properties": { | ||||
| 		"total": { | ||||
| 			"type": "integer", | ||||
| 			"description": "Total number of rows" | ||||
| 		}, | ||||
| 		"offset": { | ||||
| 			"type": "integer", | ||||
| 			"description": "Pagination Offset" | ||||
| 		}, | ||||
| 		"limit": { | ||||
| 			"type": "integer", | ||||
| 			"description": "Pagination Limit" | ||||
| 		}, | ||||
| 		"sort": { | ||||
| 			"type": "array", | ||||
| 			"description": "Sorting", | ||||
| 			"items": { | ||||
| 				"$ref": "#/components/schemas/SortObject" | ||||
| 			} | ||||
| 		}, | ||||
| 		"filter": { | ||||
| 			"type": "array", | ||||
| 			"description": "Filters", | ||||
| 			"items": { | ||||
| 				"$ref": "#/components/schemas/FilterObject" | ||||
| 			} | ||||
| 		}, | ||||
| 		"items": { | ||||
| 			"type": "array", | ||||
| 			"items": { | ||||
| 				"$ref": "#/components/schemas/SettingObject" | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										51
									
								
								backend/embed/api_docs/components/SettingObject.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										51
									
								
								backend/embed/api_docs/components/SettingObject.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,51 @@ | ||||
| { | ||||
| 	"type": "object", | ||||
| 	"description": "SettingObject", | ||||
| 	"additionalProperties": false, | ||||
| 	"required": ["id", "created_at", "updated_at", "name", "value"], | ||||
| 	"properties": { | ||||
| 		"id": { | ||||
| 			"type": "integer", | ||||
| 			"minimum": 1 | ||||
| 		}, | ||||
| 		"created_at": { | ||||
| 			"type": "integer", | ||||
| 			"minimum": 1, | ||||
| 			"description": "Created Unix time with milliseconds" | ||||
| 		}, | ||||
| 		"updated_at": { | ||||
| 			"type": "integer", | ||||
| 			"minimum": 1, | ||||
| 			"description": "Updated Unix time with milliseconds" | ||||
| 		}, | ||||
| 		"name": { | ||||
| 			"type": "string", | ||||
| 			"minLength": 2, | ||||
| 			"maxLength": 100 | ||||
| 		}, | ||||
| 		"description": { | ||||
| 			"type": "string", | ||||
| 			"minLength": 0, | ||||
| 			"maxLength": 100 | ||||
| 		}, | ||||
| 		"value": { | ||||
| 			"oneOf": [ | ||||
| 				{ | ||||
| 					"type": "array" | ||||
| 				}, | ||||
| 				{ | ||||
| 					"type": "boolean" | ||||
| 				}, | ||||
| 				{ | ||||
| 					"type": "object" | ||||
| 				}, | ||||
| 				{ | ||||
| 					"type": "integer" | ||||
| 				}, | ||||
| 				{ | ||||
| 					"type": "string" | ||||
| 				} | ||||
| 			] | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										17
									
								
								backend/embed/api_docs/components/SortObject.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								backend/embed/api_docs/components/SortObject.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,17 @@ | ||||
| { | ||||
| 	"type": "object", | ||||
| 	"description": "SortObject", | ||||
| 	"additionalProperties": false, | ||||
| 	"required": ["field", "direction"], | ||||
| 	"properties": { | ||||
| 		"field": { | ||||
| 			"type": "string", | ||||
| 			"description": "Field for sorting on" | ||||
| 		}, | ||||
| 		"direction": { | ||||
| 			"type": "string", | ||||
| 			"description": "Sort order", | ||||
| 			"pattern": "^(ASC|DESC)$" | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										40
									
								
								backend/embed/api_docs/components/StreamList.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										40
									
								
								backend/embed/api_docs/components/StreamList.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,40 @@ | ||||
| { | ||||
| 	"type": "object", | ||||
| 	"description": "StreamList", | ||||
| 	"additionalProperties": false, | ||||
| 	"required": ["total", "offset", "limit", "sort"], | ||||
| 	"properties": { | ||||
| 		"total": { | ||||
| 			"type": "integer", | ||||
| 			"description": "Total number of rows" | ||||
| 		}, | ||||
| 		"offset": { | ||||
| 			"type": "integer", | ||||
| 			"description": "Pagination Offset" | ||||
| 		}, | ||||
| 		"limit": { | ||||
| 			"type": "integer", | ||||
| 			"description": "Pagination Limit" | ||||
| 		}, | ||||
| 		"sort": { | ||||
| 			"type": "array", | ||||
| 			"description": "Sorting", | ||||
| 			"items": { | ||||
| 				"$ref": "#/components/schemas/SortObject" | ||||
| 			} | ||||
| 		}, | ||||
| 		"filter": { | ||||
| 			"type": "array", | ||||
| 			"description": "Filters", | ||||
| 			"items": { | ||||
| 				"$ref": "#/components/schemas/FilterObject" | ||||
| 			} | ||||
| 		}, | ||||
| 		"items": { | ||||
| 			"type": "array", | ||||
| 			"items": { | ||||
| 				"$ref": "#/components/schemas/StreamObject" | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										57
									
								
								backend/embed/api_docs/components/StreamObject.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										57
									
								
								backend/embed/api_docs/components/StreamObject.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,57 @@ | ||||
| { | ||||
| 	"type": "object", | ||||
| 	"description": "StreamObject", | ||||
| 	"additionalProperties": false, | ||||
| 	"required": [ | ||||
| 		"id", | ||||
| 		"created_at", | ||||
| 		"updated_at", | ||||
| 		"expires_on", | ||||
| 		"user_id", | ||||
| 		"provider", | ||||
| 		"name", | ||||
| 		"domain_names" | ||||
| 	], | ||||
| 	"properties": { | ||||
| 		"id": { | ||||
| 			"type": "integer", | ||||
| 			"minimum": 1 | ||||
| 		}, | ||||
| 		"created_at": { | ||||
| 			"type": "integer", | ||||
| 			"minimum": 1, | ||||
| 			"description": "Created Unix time with milliseconds" | ||||
| 		}, | ||||
| 		"updated_at": { | ||||
| 			"type": "integer", | ||||
| 			"minimum": 1, | ||||
| 			"description": "Updated Unix time with milliseconds" | ||||
| 		}, | ||||
| 		"expires_on": { | ||||
| 			"type": "integer", | ||||
| 			"minimum": 1 | ||||
| 		}, | ||||
| 		"user_id": { | ||||
| 			"type": "integer", | ||||
| 			"minimum": 1 | ||||
| 		}, | ||||
| 		"provider": { | ||||
| 			"type": "string", | ||||
| 			"minLength": 1, | ||||
| 			"maxLength": 100 | ||||
| 		}, | ||||
| 		"name": { | ||||
| 			"type": "string", | ||||
| 			"minLength": 1, | ||||
| 			"maxLength": 100 | ||||
| 		}, | ||||
| 		"domain_names": { | ||||
| 			"type": "array", | ||||
| 			"minItems": 1, | ||||
| 			"items": { | ||||
| 				"type": "string", | ||||
| 				"minLength": 4 | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										17
									
								
								backend/embed/api_docs/components/TokenObject.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								backend/embed/api_docs/components/TokenObject.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,17 @@ | ||||
| { | ||||
| 	"type": "object", | ||||
| 	"description": "TokenObject", | ||||
| 	"additionalProperties": false, | ||||
| 	"required": ["expires", "token"], | ||||
| 	"properties": { | ||||
| 		"expires": { | ||||
| 			"type": "number", | ||||
| 			"description": "Token Expiry Unix Time", | ||||
| 			"minimum": 1 | ||||
| 		}, | ||||
| 		"token": { | ||||
| 			"type": "string", | ||||
| 			"description": "JWT Token" | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										40
									
								
								backend/embed/api_docs/components/UpstreamList.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										40
									
								
								backend/embed/api_docs/components/UpstreamList.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,40 @@ | ||||
| { | ||||
| 	"type": "object", | ||||
| 	"description": "UpstreamList", | ||||
| 	"additionalProperties": false, | ||||
| 	"required": ["total", "offset", "limit", "sort"], | ||||
| 	"properties": { | ||||
| 		"total": { | ||||
| 			"type": "integer", | ||||
| 			"description": "Total number of rows" | ||||
| 		}, | ||||
| 		"offset": { | ||||
| 			"type": "integer", | ||||
| 			"description": "Pagination Offset" | ||||
| 		}, | ||||
| 		"limit": { | ||||
| 			"type": "integer", | ||||
| 			"description": "Pagination Limit" | ||||
| 		}, | ||||
| 		"sort": { | ||||
| 			"type": "array", | ||||
| 			"description": "Sorting", | ||||
| 			"items": { | ||||
| 				"$ref": "#/components/schemas/SortObject" | ||||
| 			} | ||||
| 		}, | ||||
| 		"filter": { | ||||
| 			"type": "array", | ||||
| 			"description": "Filters", | ||||
| 			"items": { | ||||
| 				"$ref": "#/components/schemas/FilterObject" | ||||
| 			} | ||||
| 		}, | ||||
| 		"items": { | ||||
| 			"type": "array", | ||||
| 			"items": { | ||||
| 				"$ref": "#/components/schemas/UpstreamObject" | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										140
									
								
								backend/embed/api_docs/components/UpstreamObject.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										140
									
								
								backend/embed/api_docs/components/UpstreamObject.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,140 @@ | ||||
| { | ||||
| 	"type": "object", | ||||
| 	"description": "UpstreamObject", | ||||
| 	"additionalProperties": false, | ||||
| 	"required": [ | ||||
| 		"id", | ||||
| 		"created_at", | ||||
| 		"updated_at", | ||||
| 		"user_id", | ||||
| 		"name", | ||||
| 		"nginx_template_id", | ||||
| 		"ip_hash", | ||||
| 		"ntlm", | ||||
| 		"keepalive", | ||||
| 		"keepalive_requests", | ||||
| 		"keepalive_time", | ||||
| 		"keepalive_timeout", | ||||
| 		"advanced_config", | ||||
| 		"status", | ||||
| 		"error_message", | ||||
| 		"servers" | ||||
| 	], | ||||
| 	"properties": { | ||||
| 		"id": { | ||||
| 			"type": "integer", | ||||
| 			"minimum": 1 | ||||
| 		}, | ||||
| 		"created_at": { | ||||
| 			"type": "integer", | ||||
| 			"minimum": 1, | ||||
| 			"description": "Created Unix time with milliseconds" | ||||
| 		}, | ||||
| 		"updated_at": { | ||||
| 			"type": "integer", | ||||
| 			"minimum": 1, | ||||
| 			"description": "Updated Unix time with milliseconds" | ||||
| 		}, | ||||
| 		"user_id": { | ||||
| 			"type": "integer", | ||||
| 			"minimum": 1 | ||||
| 		}, | ||||
| 		"name": { | ||||
| 			"type": "string", | ||||
| 			"minLength": 1, | ||||
| 			"maxLength": 100 | ||||
| 		}, | ||||
| 		"nginx_template_id": { | ||||
| 			"type": "integer", | ||||
| 			"minimum": 1 | ||||
| 		}, | ||||
| 		"ip_hash": { | ||||
| 			"type": "boolean" | ||||
| 		}, | ||||
| 		"ntlm": { | ||||
| 			"type": "boolean" | ||||
| 		}, | ||||
| 		"keepalive": { | ||||
| 			"type": "integer" | ||||
| 		}, | ||||
| 		"keepalive_requests": { | ||||
| 			"type": "integer" | ||||
| 		}, | ||||
| 		"keepalive_time": { | ||||
| 			"type": "string" | ||||
| 		}, | ||||
| 		"keepalive_timeout": { | ||||
| 			"type": "string" | ||||
| 		}, | ||||
| 		"advanced_config": { | ||||
| 			"type": "string" | ||||
| 		}, | ||||
| 		"status": { | ||||
| 			"type": "string" | ||||
| 		}, | ||||
| 		"error_message": { | ||||
| 			"type": "string" | ||||
| 		}, | ||||
| 		"user": { | ||||
| 			"$ref": "#/components/schemas/UserObject" | ||||
| 		}, | ||||
| 		"servers": { | ||||
| 			"type": "array", | ||||
| 			"items": { | ||||
| 				"type": "object", | ||||
| 				"additionalProperties": false, | ||||
| 				"required": [ | ||||
| 					"id", | ||||
| 					"created_at", | ||||
| 					"updated_at", | ||||
| 					"upstream_id", | ||||
| 					"server", | ||||
| 					"weight", | ||||
| 					"max_conns", | ||||
| 					"max_fails", | ||||
| 					"fail_timeout", | ||||
| 					"backup" | ||||
| 				], | ||||
| 				"properties": { | ||||
| 					"id": { | ||||
| 						"type": "integer", | ||||
| 						"minimum": 1 | ||||
| 					}, | ||||
| 					"created_at": { | ||||
| 						"type": "integer", | ||||
| 						"minimum": 1, | ||||
| 						"description": "Created Unix time with milliseconds" | ||||
| 					}, | ||||
| 					"updated_at": { | ||||
| 						"type": "integer", | ||||
| 						"minimum": 1, | ||||
| 						"description": "Updated Unix time with milliseconds" | ||||
| 					}, | ||||
| 					"upstream_id": { | ||||
| 						"type": "integer", | ||||
| 						"minimum": 1 | ||||
| 					}, | ||||
| 					"server": { | ||||
| 						"type": "string", | ||||
| 						"minLength": 2 | ||||
| 					}, | ||||
| 					"weight": { | ||||
| 						"type": "integer" | ||||
| 					}, | ||||
| 					"max_conns": { | ||||
| 						"type": "integer" | ||||
| 					}, | ||||
| 					"max_fails": { | ||||
| 						"type": "integer" | ||||
| 					}, | ||||
| 					"fail_timeout": { | ||||
| 						"type": "integer" | ||||
| 					}, | ||||
| 					"backup": { | ||||
| 						"type": "boolean" | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										30
									
								
								backend/embed/api_docs/components/UserAuthObject.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								backend/embed/api_docs/components/UserAuthObject.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,30 @@ | ||||
| { | ||||
| 	"type": "object", | ||||
| 	"description": "UserAuthObject", | ||||
| 	"additionalProperties": false, | ||||
| 	"required": ["id", "user_id", "type", "created_at", "updated_at"], | ||||
| 	"properties": { | ||||
| 		"id": { | ||||
| 			"type": "integer", | ||||
| 			"minimum": 1 | ||||
| 		}, | ||||
| 		"created_at": { | ||||
| 			"type": "integer", | ||||
| 			"minimum": 1, | ||||
| 			"description": "Created Unix time with milliseconds" | ||||
| 		}, | ||||
| 		"updated_at": { | ||||
| 			"type": "integer", | ||||
| 			"minimum": 1, | ||||
| 			"description": "Updated Unix time with milliseconds" | ||||
| 		}, | ||||
| 		"user_id": { | ||||
| 			"type": "integer", | ||||
| 			"minimum": 1 | ||||
| 		}, | ||||
| 		"type": { | ||||
| 			"type": "string", | ||||
| 			"pattern": "^(local|ldap|oauth)$" | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										40
									
								
								backend/embed/api_docs/components/UserList.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										40
									
								
								backend/embed/api_docs/components/UserList.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,40 @@ | ||||
| { | ||||
| 	"type": "object", | ||||
| 	"description": "UserList", | ||||
| 	"additionalProperties": false, | ||||
| 	"required": ["total", "offset", "limit", "sort"], | ||||
| 	"properties": { | ||||
| 		"total": { | ||||
| 			"type": "integer", | ||||
| 			"description": "Total number of rows" | ||||
| 		}, | ||||
| 		"offset": { | ||||
| 			"type": "integer", | ||||
| 			"description": "Pagination Offset" | ||||
| 		}, | ||||
| 		"limit": { | ||||
| 			"type": "integer", | ||||
| 			"description": "Pagination Limit" | ||||
| 		}, | ||||
| 		"sort": { | ||||
| 			"type": "array", | ||||
| 			"description": "Sorting", | ||||
| 			"items": { | ||||
| 				"$ref": "#/components/schemas/SortObject" | ||||
| 			} | ||||
| 		}, | ||||
| 		"filter": { | ||||
| 			"type": "array", | ||||
| 			"description": "Filters", | ||||
| 			"items": { | ||||
| 				"$ref": "#/components/schemas/FilterObject" | ||||
| 			} | ||||
| 		}, | ||||
| 		"items": { | ||||
| 			"type": "array", | ||||
| 			"items": { | ||||
| 				"$ref": "#/components/schemas/UserObject" | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										69
									
								
								backend/embed/api_docs/components/UserObject.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										69
									
								
								backend/embed/api_docs/components/UserObject.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,69 @@ | ||||
| { | ||||
| 	"type": "object", | ||||
| 	"description": "UserObject", | ||||
| 	"additionalProperties": false, | ||||
| 	"required": [ | ||||
| 		"id", | ||||
| 		"created_at", | ||||
| 		"updated_at", | ||||
| 		"name", | ||||
| 		"email", | ||||
| 		"is_disabled" | ||||
| 	], | ||||
| 	"properties": { | ||||
| 		"id": { | ||||
| 			"type": "integer", | ||||
| 			"minimum": 1 | ||||
| 		}, | ||||
| 		"created_at": { | ||||
| 			"type": "integer", | ||||
| 			"minimum": 1, | ||||
| 			"description": "Created Unix time with milliseconds" | ||||
| 		}, | ||||
| 		"updated_at": { | ||||
| 			"type": "integer", | ||||
| 			"minimum": 1, | ||||
| 			"description": "Updated Unix time with milliseconds" | ||||
| 		}, | ||||
| 		"name": { | ||||
| 			"type": "string", | ||||
| 			"minLength": 2, | ||||
| 			"maxLength": 50 | ||||
| 		}, | ||||
| 		"email": { | ||||
| 			"type": "string", | ||||
| 			"minLength": 5, | ||||
| 			"maxLength": 150 | ||||
| 		}, | ||||
| 		"gravatar_url": { | ||||
| 			"type": "string" | ||||
| 		}, | ||||
| 		"is_disabled": { | ||||
| 			"type": "boolean" | ||||
| 		}, | ||||
| 		"is_system": { | ||||
| 			"type": "boolean" | ||||
| 		}, | ||||
| 		"auth": { | ||||
| 			"type": "object", | ||||
| 			"required": ["type"], | ||||
| 			"properties": { | ||||
| 				"id": { | ||||
| 					"type": "integer" | ||||
| 				}, | ||||
| 				"type": { | ||||
| 					"type": "string", | ||||
| 					"pattern": "^(local|ldap|oauth)$" | ||||
| 				} | ||||
| 			} | ||||
| 		}, | ||||
| 		"capabilities": { | ||||
| 			"type": "array", | ||||
| 			"minItems": 1, | ||||
| 			"items": { | ||||
| 				"type": "string", | ||||
| 				"minLength": 1 | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										28
									
								
								backend/embed/api_docs/paths/auth/get.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								backend/embed/api_docs/paths/auth/get.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,28 @@ | ||||
| { | ||||
| 	"operationId": "getAuthConfig", | ||||
| 	"summary": "Returns auth configuration", | ||||
| 	"tags": ["Auth"], | ||||
| 	"responses": { | ||||
| 		"200": { | ||||
| 			"description": "200 response", | ||||
| 			"content": { | ||||
| 				"application/json": { | ||||
| 					"schema": { | ||||
| 						"type": "object", | ||||
| 						"required": ["result"], | ||||
| 						"properties": { | ||||
| 							"result": { | ||||
| 								"$ref": "#/components/schemas/AuthConfigObject" | ||||
| 							} | ||||
| 						} | ||||
| 					}, | ||||
| 					"examples": { | ||||
| 						"default": { | ||||
| 							"value": "todo" | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										75
									
								
								backend/embed/api_docs/paths/auth/post.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										75
									
								
								backend/embed/api_docs/paths/auth/post.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,75 @@ | ||||
| { | ||||
| 	"operationId": "requestToken", | ||||
| 	"summary": "Request a new access token from credentials", | ||||
| 	"tags": ["Auth"], | ||||
| 	"requestBody": { | ||||
| 		"description": "Credentials Payload", | ||||
| 		"required": true, | ||||
| 		"content": { | ||||
| 			"application/json": { | ||||
| 				"schema": "{{schema.GetToken}}" | ||||
| 			} | ||||
| 		} | ||||
| 	}, | ||||
| 	"responses": { | ||||
| 		"200": { | ||||
| 			"description": "200 response", | ||||
| 			"content": { | ||||
| 				"application/json": { | ||||
| 					"schema": { | ||||
| 						"type": "object", | ||||
| 						"required": ["result"], | ||||
| 						"properties": { | ||||
| 							"result": { | ||||
| 								"$ref": "#/components/schemas/TokenObject" | ||||
| 							} | ||||
| 						} | ||||
| 					}, | ||||
| 					"examples": { | ||||
| 						"default": { | ||||
| 							"value": { | ||||
| 								"result": { | ||||
| 									"expires": 1566540510, | ||||
| 									"token": "eyJhbGciOiJSUzUxMiIsInR5cCI6IkpXVCJ9.ey...xaHKYr3Kk6MvkUjcC4", | ||||
| 									"scope": "user" | ||||
| 								} | ||||
| 							} | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		}, | ||||
| 		"403": { | ||||
| 			"description": "403 response", | ||||
| 			"content": { | ||||
| 				"application/json": { | ||||
| 					"schema": { | ||||
| 						"type": "object", | ||||
| 						"additionalProperties": false, | ||||
| 						"required": ["error"], | ||||
| 						"properties": { | ||||
| 							"result": { | ||||
| 								"type": "object", | ||||
| 								"nullable": true | ||||
| 							}, | ||||
| 							"error": { | ||||
| 								"$ref": "#/components/schemas/ErrorObject" | ||||
| 							} | ||||
| 						} | ||||
| 					}, | ||||
| 					"examples": { | ||||
| 						"default": { | ||||
| 							"value": { | ||||
| 								"result": null, | ||||
| 								"error": { | ||||
| 									"code": 403, | ||||
| 									"message": "Not available during setup phase" | ||||
| 								} | ||||
| 							} | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										34
									
								
								backend/embed/api_docs/paths/auth/refresh/post.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								backend/embed/api_docs/paths/auth/refresh/post.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,34 @@ | ||||
| { | ||||
| 	"operationId": "refreshToken", | ||||
| 	"summary": "Refresh your access token", | ||||
| 	"tags": ["Auth"], | ||||
| 	"responses": { | ||||
| 		"200": { | ||||
| 			"description": "200 response", | ||||
| 			"content": { | ||||
| 				"application/json": { | ||||
| 					"schema": { | ||||
| 						"type": "object", | ||||
| 						"required": ["result"], | ||||
| 						"properties": { | ||||
| 							"result": { | ||||
| 								"$ref": "#/components/schemas/TokenObject" | ||||
| 							} | ||||
| 						} | ||||
| 					}, | ||||
| 					"examples": { | ||||
| 						"default": { | ||||
| 							"value": { | ||||
| 								"result": { | ||||
| 									"expires": 1566540510, | ||||
| 									"token": "eyJhbGciOiJSUzUxMiIsInR5cCI6IkpXVCJ9.ey...xaHKYr3Kk6MvkUjcC4", | ||||
| 									"scope": "user" | ||||
| 								} | ||||
| 							} | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										34
									
								
								backend/embed/api_docs/paths/auth/sse/post.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								backend/embed/api_docs/paths/auth/sse/post.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,34 @@ | ||||
| { | ||||
| 	"operationId": "requestSSEToken", | ||||
| 	"summary": "Request a new SSE token", | ||||
| 	"tags": ["Auth"], | ||||
| 	"responses": { | ||||
| 		"200": { | ||||
| 			"description": "200 response", | ||||
| 			"content": { | ||||
| 				"application/json": { | ||||
| 					"schema": { | ||||
| 						"type": "object", | ||||
| 						"required": ["result"], | ||||
| 						"properties": { | ||||
| 							"result": { | ||||
| 								"$ref": "#/components/schemas/TokenObject" | ||||
| 							} | ||||
| 						} | ||||
| 					}, | ||||
| 					"examples": { | ||||
| 						"default": { | ||||
| 							"value": { | ||||
| 								"result": { | ||||
| 									"expires": 1566540510, | ||||
| 									"token": "eyJhbGciOiJSUzUxMiIsInR5cCI6IkpXVCJ9.ey...xaHKYr3Kk6MvkUjcC4", | ||||
| 									"scope": "user" | ||||
| 								} | ||||
| 							} | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @@ -0,0 +1,39 @@ | ||||
| { | ||||
| 	"operationId": "deleteCertificateAuthority", | ||||
| 	"summary": "Delete a Certificate Authority", | ||||
| 	"tags": [ | ||||
| 		"Certificate Authorities" | ||||
| 	], | ||||
| 	"parameters": [ | ||||
| 		{ | ||||
| 			"in": "path", | ||||
| 			"name": "caID", | ||||
| 			"schema": { | ||||
| 				"type": "integer", | ||||
| 				"minimum": 1 | ||||
| 			}, | ||||
| 			"required": true, | ||||
| 			"description": "Numeric ID of the Certificate Authority", | ||||
| 			"example": 1 | ||||
| 		} | ||||
| 	], | ||||
| 	"responses": { | ||||
| 		"200": { | ||||
| 			"description": "200 response", | ||||
| 			"content": { | ||||
| 				"application/json": { | ||||
| 					"schema": { | ||||
| 						"$ref": "#/components/schemas/DeletedItemResponse" | ||||
| 					}, | ||||
| 					"examples": { | ||||
| 						"default": { | ||||
| 							"value": { | ||||
| 								"result": true | ||||
| 							} | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @@ -0,0 +1,53 @@ | ||||
| { | ||||
| 	"operationId": "getCertificateAuthority", | ||||
| 	"summary": "Get a Certificate Authority object by ID", | ||||
| 	"tags": ["Certificate Authorities"], | ||||
| 	"parameters": [ | ||||
| 		{ | ||||
| 			"in": "path", | ||||
| 			"name": "caID", | ||||
| 			"schema": { | ||||
| 				"type": "integer", | ||||
| 				"minimum": 1 | ||||
| 			}, | ||||
| 			"required": true, | ||||
| 			"description": "ID of the Certificate Authority", | ||||
| 			"example": 1 | ||||
| 		} | ||||
| 	], | ||||
| 	"responses": { | ||||
| 		"200": { | ||||
| 			"description": "200 response", | ||||
| 			"content": { | ||||
| 				"application/json": { | ||||
| 					"schema": { | ||||
| 						"type": "object", | ||||
| 						"required": ["result"], | ||||
| 						"properties": { | ||||
| 							"result": { | ||||
| 								"$ref": "#/components/schemas/CertificateAuthorityObject" | ||||
| 							} | ||||
| 						} | ||||
| 					}, | ||||
| 					"examples": { | ||||
| 						"default": { | ||||
| 							"value": { | ||||
| 								"result": { | ||||
| 									"id": 1, | ||||
| 									"created_at": 1627531400000, | ||||
| 									"updated_at": 1627531400000, | ||||
| 									"name": "ZeroSSL", | ||||
| 									"acmesh_server": "zerossl", | ||||
| 									"ca_bundle": "", | ||||
| 									"max_domains": 10, | ||||
| 									"is_wildcard_supported": true, | ||||
| 									"is_readonly": false | ||||
| 								} | ||||
| 							} | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @@ -0,0 +1,62 @@ | ||||
| { | ||||
| 	"operationId": "updateCertificateAuthority", | ||||
| 	"summary": "Update an existing Certificate Authority", | ||||
| 	"tags": ["Certificate Authorities"], | ||||
| 	"parameters": [ | ||||
| 		{ | ||||
| 			"in": "path", | ||||
| 			"name": "caID", | ||||
| 			"schema": { | ||||
| 				"type": "integer", | ||||
| 				"minimum": 1 | ||||
| 			}, | ||||
| 			"required": true, | ||||
| 			"description": "ID of the Certificate Authority", | ||||
| 			"example": 1 | ||||
| 		} | ||||
| 	], | ||||
| 	"requestBody": { | ||||
| 		"description": "Certificate Authority details to update", | ||||
| 		"required": true, | ||||
| 		"content": { | ||||
| 			"application/json": { | ||||
| 				"schema": "{{schema.UpdateCertificateAuthority}}" | ||||
| 			} | ||||
| 		} | ||||
| 	}, | ||||
| 	"responses": { | ||||
| 		"200": { | ||||
| 			"description": "200 response", | ||||
| 			"content": { | ||||
| 				"application/json": { | ||||
| 					"schema": { | ||||
| 						"type": "object", | ||||
| 						"required": ["result"], | ||||
| 						"properties": { | ||||
| 							"result": { | ||||
| 								"$ref": "#/components/schemas/CertificateAuthorityObject" | ||||
| 							} | ||||
| 						} | ||||
| 					}, | ||||
| 					"examples": { | ||||
| 						"default": { | ||||
| 							"value": { | ||||
| 								"result": { | ||||
| 									"id": 1, | ||||
| 									"created_at": 1627531400000, | ||||
| 									"updated_at": 1627531400000, | ||||
| 									"name": "ZeroSSL", | ||||
| 									"acmesh_server": "zerossl", | ||||
| 									"ca_bundle": "", | ||||
| 									"max_domains": 10, | ||||
| 									"is_wildcard_supported": true, | ||||
| 									"is_readonly": false | ||||
| 								} | ||||
| 							} | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @@ -0,0 +1,93 @@ | ||||
| { | ||||
| 	"operationId": "getCertificateAuthorities", | ||||
| 	"summary": "Get a list of Certificate Authorities", | ||||
| 	"tags": ["Certificate Authorities"], | ||||
| 	"parameters": [ | ||||
| 		{ | ||||
| 			"in": "query", | ||||
| 			"name": "offset", | ||||
| 			"schema": { | ||||
| 				"type": "number" | ||||
| 			}, | ||||
| 			"description": "The pagination row offset, default 0", | ||||
| 			"example": 0 | ||||
| 		}, | ||||
| 		{ | ||||
| 			"in": "query", | ||||
| 			"name": "limit", | ||||
| 			"schema": { | ||||
| 				"type": "number" | ||||
| 			}, | ||||
| 			"description": "The pagination row limit, default 10", | ||||
| 			"example": 10 | ||||
| 		}, | ||||
| 		{ | ||||
| 			"in": "query", | ||||
| 			"name": "sort", | ||||
| 			"schema": { | ||||
| 				"type": "string" | ||||
| 			}, | ||||
| 			"description": "The sorting of the list", | ||||
| 			"example": "id,name.asc,value.desc" | ||||
| 		} | ||||
| 	], | ||||
| 	"responses": { | ||||
| 		"200": { | ||||
| 			"description": "200 response", | ||||
| 			"content": { | ||||
| 				"application/json": { | ||||
| 					"schema": { | ||||
| 						"type": "object", | ||||
| 						"required": ["result"], | ||||
| 						"properties": { | ||||
| 							"result": { | ||||
| 								"$ref": "#/components/schemas/CertificateAuthorityList" | ||||
| 							} | ||||
| 						} | ||||
| 					}, | ||||
| 					"examples": { | ||||
| 						"default": { | ||||
| 							"value": { | ||||
| 								"result": { | ||||
| 									"total": 2, | ||||
| 									"offset": 0, | ||||
| 									"limit": 10, | ||||
| 									"sort": [ | ||||
| 										{ | ||||
| 											"field": "name", | ||||
| 											"direction": "ASC" | ||||
| 										} | ||||
| 									], | ||||
| 									"items": [ | ||||
| 										{ | ||||
| 											"id": 1, | ||||
| 											"created_at": 1627531400000, | ||||
| 											"updated_at": 1627531400000, | ||||
| 											"name": "ZeroSSL", | ||||
| 											"acmesh_server": "zerossl", | ||||
| 											"ca_bundle": "", | ||||
| 											"max_domains": 10, | ||||
| 											"is_wildcard_supported": true, | ||||
| 											"is_setup": true | ||||
| 										}, | ||||
| 										{ | ||||
| 											"id": 2, | ||||
| 											"created_at": 1627531400000, | ||||
| 											"updated_at": 1627531400000, | ||||
| 											"name": "Let's Encrypt", | ||||
| 											"acmesh_server": "https://acme-v02.api.letsencrypt.org/directory", | ||||
| 											"ca_bundle": "", | ||||
| 											"max_domains": 10, | ||||
| 											"is_wildcard_supported": true, | ||||
| 											"is_setup": true | ||||
| 										} | ||||
| 									] | ||||
| 								} | ||||
| 							} | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @@ -0,0 +1,49 @@ | ||||
| { | ||||
| 	"operationId": "createCertificateAuthority", | ||||
| 	"summary": "Create a new Certificate Authority", | ||||
| 	"tags": ["Certificate Authorities"], | ||||
| 	"requestBody": { | ||||
| 		"description": "Certificate Authority to Create", | ||||
| 		"required": true, | ||||
| 		"content": { | ||||
| 			"application/json": { | ||||
| 				"schema": "{{schema.CreateCertificateAuthority}}" | ||||
| 			} | ||||
| 		} | ||||
| 	}, | ||||
| 	"responses": { | ||||
| 		"201": { | ||||
| 			"description": "201 response", | ||||
| 			"content": { | ||||
| 				"application/json": { | ||||
| 					"schema": { | ||||
| 						"type": "object", | ||||
| 						"required": ["result"], | ||||
| 						"properties": { | ||||
| 							"result": { | ||||
| 								"$ref": "#/components/schemas/CertificateAuthorityObject" | ||||
| 							} | ||||
| 						} | ||||
| 					}, | ||||
| 					"examples": { | ||||
| 						"default": { | ||||
| 							"value": { | ||||
| 								"result": { | ||||
| 									"id": 1, | ||||
| 									"created_at": 1627531400000, | ||||
| 									"updated_at": 1627531400000, | ||||
| 									"name": "ZeroSSL", | ||||
| 									"acmesh_server": "zerossl", | ||||
| 									"ca_bundle": "", | ||||
| 									"max_domains": 10, | ||||
| 									"is_wildcard_supported": true, | ||||
| 									"is_readonly": false | ||||
| 								} | ||||
| 							} | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @@ -0,0 +1,60 @@ | ||||
| { | ||||
| 	"operationId": "deleteCertificate", | ||||
| 	"summary": "Delete a Certificate", | ||||
| 	"tags": [ | ||||
| 		"Certificates" | ||||
| 	], | ||||
| 	"parameters": [ | ||||
| 		{ | ||||
| 			"in": "path", | ||||
| 			"name": "certificateID", | ||||
| 			"schema": { | ||||
| 				"type": "integer", | ||||
| 				"minimum": 1 | ||||
| 			}, | ||||
| 			"required": true, | ||||
| 			"description": "Numeric ID of the certificate", | ||||
| 			"example": 1 | ||||
| 		} | ||||
| 	], | ||||
| 	"responses": { | ||||
| 		"200": { | ||||
| 			"description": "200 response", | ||||
| 			"content": { | ||||
| 				"application/json": { | ||||
| 					"schema": { | ||||
| 						"$ref": "#/components/schemas/DeletedItemResponse" | ||||
| 					}, | ||||
| 					"examples": { | ||||
| 						"default": { | ||||
| 							"value": { | ||||
| 								"result": true | ||||
| 							} | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		}, | ||||
| 		"400": { | ||||
| 			"description": "400 response", | ||||
| 			"content": { | ||||
| 				"application/json": { | ||||
| 					"schema": { | ||||
| 						"$ref": "#/components/schemas/DeletedItemResponse" | ||||
| 					}, | ||||
| 					"examples": { | ||||
| 						"default": { | ||||
| 							"value": { | ||||
| 								"result": null, | ||||
| 								"error": { | ||||
| 									"code": 400, | ||||
| 									"message": "You cannot delete a certificate that is in use!" | ||||
| 								} | ||||
| 							} | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @@ -0,0 +1,56 @@ | ||||
| { | ||||
| 	"operationId": "getCertificate", | ||||
| 	"summary": "Get a certificate object by ID", | ||||
| 	"tags": ["Certificates"], | ||||
| 	"parameters": [ | ||||
| 		{ | ||||
| 			"in": "path", | ||||
| 			"name": "certificateID", | ||||
| 			"schema": { | ||||
| 				"type": "integer", | ||||
| 				"minimum": 1 | ||||
| 			}, | ||||
| 			"required": true, | ||||
| 			"description": "ID of the certificate", | ||||
| 			"example": 1 | ||||
| 		} | ||||
| 	], | ||||
| 	"responses": { | ||||
| 		"200": { | ||||
| 			"description": "200 response", | ||||
| 			"content": { | ||||
| 				"application/json": { | ||||
| 					"schema": { | ||||
| 						"type": "object", | ||||
| 						"required": ["result"], | ||||
| 						"properties": { | ||||
| 							"result": { | ||||
| 								"$ref": "#/components/schemas/CertificateObject" | ||||
| 							} | ||||
| 						} | ||||
| 					}, | ||||
| 					"examples": { | ||||
| 						"default": { | ||||
| 							"value": { | ||||
| 								"result": { | ||||
| 									"id": 1, | ||||
| 									"created_at": 1604536109000, | ||||
| 									"updated_at": 1604536109000, | ||||
| 									"expires_on": null, | ||||
| 									"type": "dns", | ||||
| 									"user_id": 1, | ||||
| 									"certificate_authority_id": 2, | ||||
| 									"dns_provider_id": 1, | ||||
| 									"name": "test1.jc21.com.au", | ||||
| 									"domain_names": ["test1.jc21.com.au"], | ||||
| 									"is_ecc": 0, | ||||
| 									"status": "ready" | ||||
| 								} | ||||
| 							} | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @@ -0,0 +1,65 @@ | ||||
| { | ||||
| 	"operationId": "updateCertificate", | ||||
| 	"summary": "Update an existing Certificate", | ||||
| 	"tags": ["Certificates"], | ||||
| 	"parameters": [ | ||||
| 		{ | ||||
| 			"in": "path", | ||||
| 			"name": "certificateID", | ||||
| 			"schema": { | ||||
| 				"type": "integer", | ||||
| 				"minimum": 1 | ||||
| 			}, | ||||
| 			"required": true, | ||||
| 			"description": "ID of the certificate", | ||||
| 			"example": 1 | ||||
| 		} | ||||
| 	], | ||||
| 	"requestBody": { | ||||
| 		"description": "Certificate details to update", | ||||
| 		"required": true, | ||||
| 		"content": { | ||||
| 			"application/json": { | ||||
| 				"schema": "{{schema.UpdateCertificate}}" | ||||
| 			} | ||||
| 		} | ||||
| 	}, | ||||
| 	"responses": { | ||||
| 		"200": { | ||||
| 			"description": "200 response", | ||||
| 			"content": { | ||||
| 				"application/json": { | ||||
| 					"schema": { | ||||
| 						"type": "object", | ||||
| 						"required": ["result"], | ||||
| 						"properties": { | ||||
| 							"result": { | ||||
| 								"$ref": "#/components/schemas/CertificateObject" | ||||
| 							} | ||||
| 						} | ||||
| 					}, | ||||
| 					"examples": { | ||||
| 						"default": { | ||||
| 							"value": { | ||||
| 								"result": { | ||||
| 									"id": 1, | ||||
| 									"created_at": 1604536109000, | ||||
| 									"updated_at": 1604536109000, | ||||
| 									"expires_on": null, | ||||
| 									"type": "dns", | ||||
| 									"user_id": 1, | ||||
| 									"certificate_authority_id": 2, | ||||
| 									"dns_provider_id": 1, | ||||
| 									"name": "test1.jc21.com.au", | ||||
| 									"domain_names": ["test1.jc21.com.au"], | ||||
| 									"is_ecc": 0, | ||||
| 									"status": "ready" | ||||
| 								} | ||||
| 							} | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										87
									
								
								backend/embed/api_docs/paths/certificates/get.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										87
									
								
								backend/embed/api_docs/paths/certificates/get.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,87 @@ | ||||
| { | ||||
| 	"operationId": "getCertificates", | ||||
| 	"summary": "Get a list of certificates", | ||||
| 	"tags": ["Certificates"], | ||||
| 	"parameters": [ | ||||
| 		{ | ||||
| 			"in": "query", | ||||
| 			"name": "offset", | ||||
| 			"schema": { | ||||
| 				"type": "number" | ||||
| 			}, | ||||
| 			"description": "The pagination row offset, default 0", | ||||
| 			"example": 0 | ||||
| 		}, | ||||
| 		{ | ||||
| 			"in": "query", | ||||
| 			"name": "limit", | ||||
| 			"schema": { | ||||
| 				"type": "number" | ||||
| 			}, | ||||
| 			"description": "The pagination row limit, default 10", | ||||
| 			"example": 10 | ||||
| 		}, | ||||
| 		{ | ||||
| 			"in": "query", | ||||
| 			"name": "sort", | ||||
| 			"schema": { | ||||
| 				"type": "string" | ||||
| 			}, | ||||
| 			"description": "The sorting of the list", | ||||
| 			"example": "id,name.asc,value.desc" | ||||
| 		} | ||||
| 	], | ||||
| 	"responses": { | ||||
| 		"200": { | ||||
| 			"description": "200 response", | ||||
| 			"content": { | ||||
| 				"application/json": { | ||||
| 					"schema": { | ||||
| 						"type": "object", | ||||
| 						"required": ["result"], | ||||
| 						"properties": { | ||||
| 							"result": { | ||||
| 								"$ref": "#/components/schemas/CertificateList" | ||||
| 							} | ||||
| 						} | ||||
| 					}, | ||||
| 					"examples": { | ||||
| 						"default": { | ||||
| 							"value": { | ||||
| 								"result": { | ||||
| 									"total": 1, | ||||
| 									"offset": 0, | ||||
| 									"limit": 10, | ||||
| 									"sort": [ | ||||
| 										{ | ||||
| 											"field": "name", | ||||
| 											"direction": "ASC" | ||||
| 										} | ||||
| 									], | ||||
| 									"items": [ | ||||
| 										{ | ||||
| 											"id": 1, | ||||
| 											"created_at": 1604536109000, | ||||
| 											"updated_at": 1604536109000, | ||||
| 											"expires_on": null, | ||||
| 											"type": "dns", | ||||
| 											"user_id": 1, | ||||
| 											"certificate_authority_id": 2, | ||||
| 											"dns_provider_id": 1, | ||||
| 											"name": "test1.jc21.com.au", | ||||
| 											"domain_names": [ | ||||
| 												"test1.jc21.com.au" | ||||
| 											], | ||||
| 											"is_ecc": 0, | ||||
| 											"status": "ready" | ||||
| 										} | ||||
| 									] | ||||
| 								} | ||||
| 							} | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										52
									
								
								backend/embed/api_docs/paths/certificates/post.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										52
									
								
								backend/embed/api_docs/paths/certificates/post.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,52 @@ | ||||
| { | ||||
| 	"operationId": "createCertificate", | ||||
| 	"summary": "Create a new Certificate", | ||||
| 	"tags": ["Certificates"], | ||||
| 	"requestBody": { | ||||
| 		"description": "Certificate to create", | ||||
| 		"required": true, | ||||
| 		"content": { | ||||
| 			"application/json": { | ||||
| 				"schema": "{{schema.CreateCertificate}}" | ||||
| 			} | ||||
| 		} | ||||
| 	}, | ||||
| 	"responses": { | ||||
| 		"201": { | ||||
| 			"description": "201 response", | ||||
| 			"content": { | ||||
| 				"application/json": { | ||||
| 					"schema": { | ||||
| 						"type": "object", | ||||
| 						"required": ["result"], | ||||
| 						"properties": { | ||||
| 							"result": { | ||||
| 								"$ref": "#/components/schemas/CertificateObject" | ||||
| 							} | ||||
| 						} | ||||
| 					}, | ||||
| 					"examples": { | ||||
| 						"default": { | ||||
| 							"value": { | ||||
| 								"result": { | ||||
| 									"id": 1, | ||||
| 									"created_at": 1604536109000, | ||||
| 									"updated_at": 1604536109000, | ||||
| 									"expires_on": null, | ||||
| 									"type": "dns", | ||||
| 									"user_id": 1, | ||||
| 									"certificate_authority_id": 2, | ||||
| 									"dns_provider_id": 1, | ||||
| 									"name": "test1.jc21.com.au", | ||||
| 									"domain_names": ["test1.jc21.com.au"], | ||||
| 									"is_ecc": 0, | ||||
| 									"status": "ready" | ||||
| 								} | ||||
| 							} | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										35
									
								
								backend/embed/api_docs/paths/config/get.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										35
									
								
								backend/embed/api_docs/paths/config/get.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,35 @@ | ||||
| { | ||||
| 	"operationId": "config", | ||||
| 	"summary": "Returns the API Service configuration", | ||||
| 	"responses": { | ||||
| 		"200": { | ||||
| 			"description": "200 response", | ||||
| 			"content": { | ||||
| 				"application/json": { | ||||
| 					"schema": { | ||||
| 						"type": "object", | ||||
| 						"required": ["result"], | ||||
| 						"properties": { | ||||
| 							"result": { | ||||
| 								"$ref": "#/components/schemas/ConfigObject" | ||||
| 							} | ||||
| 						} | ||||
| 					}, | ||||
| 					"examples": { | ||||
| 						"default": { | ||||
| 							"value": { | ||||
| 								"result": { | ||||
| 									"data": "/data", | ||||
| 									"log": { | ||||
| 										"level": "debug", | ||||
| 										"format": "nice" | ||||
| 									} | ||||
| 								} | ||||
| 							} | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										83
									
								
								backend/embed/api_docs/paths/dns-providers/get.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										83
									
								
								backend/embed/api_docs/paths/dns-providers/get.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,83 @@ | ||||
| { | ||||
| 	"operationId": "getDNSProviders", | ||||
| 	"summary": "Get a list of DNS Providers", | ||||
| 	"tags": ["DNS Providers"], | ||||
| 	"parameters": [ | ||||
| 		{ | ||||
| 			"in": "query", | ||||
| 			"name": "offset", | ||||
| 			"schema": { | ||||
| 				"type": "number" | ||||
| 			}, | ||||
| 			"description": "The pagination row offset, default 0", | ||||
| 			"example": 0 | ||||
| 		}, | ||||
| 		{ | ||||
| 			"in": "query", | ||||
| 			"name": "limit", | ||||
| 			"schema": { | ||||
| 				"type": "number" | ||||
| 			}, | ||||
| 			"description": "The pagination row limit, default 10", | ||||
| 			"example": 10 | ||||
| 		}, | ||||
| 		{ | ||||
| 			"in": "query", | ||||
| 			"name": "sort", | ||||
| 			"schema": { | ||||
| 				"type": "string" | ||||
| 			}, | ||||
| 			"description": "The sorting of the list", | ||||
| 			"example": "id,name.asc,value.desc" | ||||
| 		} | ||||
| 	], | ||||
| 	"responses": { | ||||
| 		"200": { | ||||
| 			"description": "200 response", | ||||
| 			"content": { | ||||
| 				"application/json": { | ||||
| 					"schema": { | ||||
| 						"type": "object", | ||||
| 						"required": ["result"], | ||||
| 						"properties": { | ||||
| 							"result": { | ||||
| 								"$ref": "#/components/schemas/DNSProviderList" | ||||
| 							} | ||||
| 						} | ||||
| 					}, | ||||
| 					"examples": { | ||||
| 						"default": { | ||||
| 							"value": { | ||||
| 								"result": { | ||||
| 									"total": 1, | ||||
| 									"offset": 0, | ||||
| 									"limit": 10, | ||||
| 									"sort": [ | ||||
| 										{ | ||||
| 											"field": "name", | ||||
| 											"direction": "ASC" | ||||
| 										} | ||||
| 									], | ||||
| 									"items": [ | ||||
| 										{ | ||||
| 											"id": 1, | ||||
| 											"created_at": 1602593653000, | ||||
| 											"updated_at": 1602593653000, | ||||
| 											"user_id": 1, | ||||
| 											"name": "Route53", | ||||
| 											"acmesh_name": "dns_aws", | ||||
| 											"meta": { | ||||
| 												"AWS_ACCESS_KEY_ID": "abc123", | ||||
| 												"AWS_SECRET_ACCESS_KEY": "def098" | ||||
| 											} | ||||
| 										} | ||||
| 									] | ||||
| 								} | ||||
| 							} | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										50
									
								
								backend/embed/api_docs/paths/dns-providers/post.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										50
									
								
								backend/embed/api_docs/paths/dns-providers/post.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,50 @@ | ||||
| { | ||||
| 	"operationId": "createDNSProvider", | ||||
| 	"summary": "Create a new DNS Provider", | ||||
| 	"tags": ["DNS Providers"], | ||||
| 	"requestBody": { | ||||
| 		"description": "DNS Provider to Create", | ||||
| 		"required": true, | ||||
| 		"content": { | ||||
| 			"application/json": { | ||||
| 				"schema": "{{schema.CreateDNSProvider}}" | ||||
| 			} | ||||
| 		} | ||||
| 	}, | ||||
| 	"responses": { | ||||
| 		"201": { | ||||
| 			"description": "201 response", | ||||
| 			"content": { | ||||
| 				"application/json": { | ||||
| 					"schema": { | ||||
| 						"type": "object", | ||||
| 						"required": ["result"], | ||||
| 						"properties": { | ||||
| 							"result": { | ||||
| 								"$ref": "#/components/schemas/DNSProviderObject" | ||||
| 							} | ||||
| 						} | ||||
| 					}, | ||||
| 					"examples": { | ||||
| 						"default": { | ||||
| 							"value": { | ||||
| 								"result": { | ||||
| 									"id": 1, | ||||
| 									"created_at": 1602593653000, | ||||
| 									"updated_at": 1602593653000, | ||||
| 									"user_id": 1, | ||||
| 									"name": "Route53", | ||||
| 									"acmesh_name": "dns_aws", | ||||
| 									"meta": { | ||||
| 										"AWS_ACCESS_KEY_ID": "abc123", | ||||
| 										"AWS_SECRET_ACCESS_KEY": "def098" | ||||
| 									} | ||||
| 								} | ||||
| 							} | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @@ -0,0 +1,60 @@ | ||||
| { | ||||
| 	"operationId": "deleteDNSProvider", | ||||
| 	"summary": "Delete a DNS Provider", | ||||
| 	"tags": [ | ||||
| 		"DNS Providers" | ||||
| 	], | ||||
| 	"parameters": [ | ||||
| 		{ | ||||
| 			"in": "path", | ||||
| 			"name": "providerID", | ||||
| 			"schema": { | ||||
| 				"type": "integer", | ||||
| 				"minimum": 1 | ||||
| 			}, | ||||
| 			"required": true, | ||||
| 			"description": "Numeric ID of the DNS Provider", | ||||
| 			"example": 1 | ||||
| 		} | ||||
| 	], | ||||
| 	"responses": { | ||||
| 		"200": { | ||||
| 			"description": "200 response", | ||||
| 			"content": { | ||||
| 				"application/json": { | ||||
| 					"schema": { | ||||
| 						"$ref": "#/components/schemas/DeletedItemResponse" | ||||
| 					}, | ||||
| 					"examples": { | ||||
| 						"default": { | ||||
| 							"value": { | ||||
| 								"result": true | ||||
| 							} | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		}, | ||||
| 		"400": { | ||||
| 			"description": "400 response", | ||||
| 			"content": { | ||||
| 				"application/json": { | ||||
| 					"schema": { | ||||
| 						"$ref": "#/components/schemas/DeletedItemResponse" | ||||
| 					}, | ||||
| 					"examples": { | ||||
| 						"default": { | ||||
| 							"value": { | ||||
| 								"result": null, | ||||
| 								"error": { | ||||
| 									"code": 400, | ||||
| 									"message": "You cannot delete a DNS Provider that is in use!" | ||||
| 								} | ||||
| 							} | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @@ -0,0 +1,54 @@ | ||||
| { | ||||
| 	"operationId": "getDNSProvider", | ||||
| 	"summary": "Get a DNS Provider object by ID", | ||||
| 	"tags": ["DNS Providers"], | ||||
| 	"parameters": [ | ||||
| 		{ | ||||
| 			"in": "path", | ||||
| 			"name": "providerID", | ||||
| 			"schema": { | ||||
| 				"type": "integer", | ||||
| 				"minimum": 1 | ||||
| 			}, | ||||
| 			"required": true, | ||||
| 			"description": "ID of the DNS Provider", | ||||
| 			"example": 1 | ||||
| 		} | ||||
| 	], | ||||
| 	"responses": { | ||||
| 		"200": { | ||||
| 			"description": "200 response", | ||||
| 			"content": { | ||||
| 				"application/json": { | ||||
| 					"schema": { | ||||
| 						"type": "object", | ||||
| 						"required": ["result"], | ||||
| 						"properties": { | ||||
| 							"result": { | ||||
| 								"$ref": "#/components/schemas/DNSProviderObject" | ||||
| 							} | ||||
| 						} | ||||
| 					}, | ||||
| 					"examples": { | ||||
| 						"default": { | ||||
| 							"value": { | ||||
| 								"result": { | ||||
| 									"id": 1, | ||||
| 									"created_at": 1602593653000, | ||||
| 									"updated_at": 1602593653000, | ||||
| 									"user_id": 1, | ||||
| 									"name": "Route53", | ||||
| 									"acmesh_name": "dns_aws", | ||||
| 									"meta": { | ||||
| 										"AWS_ACCESS_KEY_ID": "abc123", | ||||
| 										"AWS_SECRET_ACCESS_KEY": "def098" | ||||
| 									} | ||||
| 								} | ||||
| 							} | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @@ -0,0 +1,65 @@ | ||||
| { | ||||
| 	"operationId": "updateDNSProvider", | ||||
| 	"summary": "Update an existing DNS Provider", | ||||
| 	"tags": ["DNS Providers"], | ||||
| 	"parameters": [ | ||||
| 		{ | ||||
| 			"in": "path", | ||||
| 			"name": "providerID", | ||||
| 			"schema": { | ||||
| 				"type": "integer", | ||||
| 				"minimum": 1 | ||||
| 			}, | ||||
| 			"required": true, | ||||
| 			"description": "ID of the DNS Provider", | ||||
| 			"example": 1 | ||||
| 		} | ||||
| 	], | ||||
| 	"requestBody": { | ||||
| 		"description": "DNS Provider details to update", | ||||
| 		"required": true, | ||||
| 		"content": { | ||||
| 			"application/json": { | ||||
| 				"schema": "{{schema.UpdateDNSProvider}}" | ||||
| 			} | ||||
| 		} | ||||
| 	}, | ||||
| 	"responses": { | ||||
| 		"200": { | ||||
| 			"description": "200 response", | ||||
| 			"content": { | ||||
| 				"application/json": { | ||||
| 					"schema": { | ||||
| 						"type": "object", | ||||
| 						"required": ["result"], | ||||
| 						"properties": { | ||||
| 							"result": { | ||||
| 								"$ref": "#/components/schemas/DNSProviderObject" | ||||
| 							} | ||||
| 						} | ||||
| 					}, | ||||
| 					"examples": { | ||||
| 						"default": { | ||||
| 							"value": { | ||||
| 								"result": { | ||||
| 									"result": { | ||||
| 										"id": 1, | ||||
| 										"created_at": 1602593653000, | ||||
| 										"updated_at": 1602593653000, | ||||
| 										"user_id": 1, | ||||
| 										"name": "Route53", | ||||
| 										"acmesh_name": "dns_aws", | ||||
| 										"meta": { | ||||
| 											"AWS_ACCESS_KEY_ID": "abc123", | ||||
| 											"AWS_SECRET_ACCESS_KEY": "def098" | ||||
| 										} | ||||
| 									} | ||||
| 								} | ||||
| 							} | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										44
									
								
								backend/embed/api_docs/paths/get.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										44
									
								
								backend/embed/api_docs/paths/get.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,44 @@ | ||||
| { | ||||
| 	"operationId": "health", | ||||
| 	"summary": "Returns the API health status", | ||||
| 	"responses": { | ||||
| 		"200": { | ||||
| 			"description": "200 response", | ||||
| 			"content": { | ||||
| 				"application/json": { | ||||
| 					"schema": { | ||||
| 						"type": "object", | ||||
| 						"required": ["result"], | ||||
| 						"properties": { | ||||
| 							"result": { | ||||
| 								"$ref": "#/components/schemas/HealthObject" | ||||
| 							} | ||||
| 						} | ||||
| 					}, | ||||
| 					"examples": { | ||||
| 						"default": { | ||||
| 							"value": { | ||||
| 								"result": { | ||||
| 									"version": "3.0.0", | ||||
| 									"commit": "9f119b6", | ||||
| 									"healthy": true, | ||||
| 									"setup": true | ||||
| 								} | ||||
| 							} | ||||
| 						}, | ||||
| 						"unhealthy": { | ||||
| 							"value": { | ||||
| 								"result": { | ||||
| 									"version": "3.0.0", | ||||
| 									"commit": "9f119b6", | ||||
| 									"healthy": false, | ||||
| 									"setup": true | ||||
| 								} | ||||
| 							} | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										94
									
								
								backend/embed/api_docs/paths/hosts/get.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										94
									
								
								backend/embed/api_docs/paths/hosts/get.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,94 @@ | ||||
| { | ||||
| 	"operationId": "getHosts", | ||||
| 	"summary": "Get a list of Hosts", | ||||
| 	"tags": ["Hosts"], | ||||
| 	"parameters": [ | ||||
| 		{ | ||||
| 			"in": "query", | ||||
| 			"name": "offset", | ||||
| 			"schema": { | ||||
| 				"type": "number" | ||||
| 			}, | ||||
| 			"description": "The pagination row offset, default 0", | ||||
| 			"example": 0 | ||||
| 		}, | ||||
| 		{ | ||||
| 			"in": "query", | ||||
| 			"name": "limit", | ||||
| 			"schema": { | ||||
| 				"type": "number" | ||||
| 			}, | ||||
| 			"description": "The pagination row limit, default 10", | ||||
| 			"example": 10 | ||||
| 		}, | ||||
| 		{ | ||||
| 			"in": "query", | ||||
| 			"name": "sort", | ||||
| 			"schema": { | ||||
| 				"type": "string" | ||||
| 			}, | ||||
| 			"description": "The sorting of the list", | ||||
| 			"example": "id,name.asc,value.desc" | ||||
| 		} | ||||
| 	], | ||||
| 	"responses": { | ||||
| 		"200": { | ||||
| 			"description": "200 response", | ||||
| 			"content": { | ||||
| 				"application/json": { | ||||
| 					"schema": { | ||||
| 						"type": "object", | ||||
| 						"required": ["result"], | ||||
| 						"properties": { | ||||
| 							"result": { | ||||
| 								"$ref": "#/components/schemas/HostList" | ||||
| 							} | ||||
| 						} | ||||
| 					}, | ||||
| 					"examples": { | ||||
| 						"default": { | ||||
| 							"value": { | ||||
| 								"result": { | ||||
| 									"total": 1, | ||||
| 									"offset": 0, | ||||
| 									"limit": 10, | ||||
| 									"sort": [ | ||||
| 										{ | ||||
| 											"field": "domain_names", | ||||
| 											"direction": "ASC" | ||||
| 										} | ||||
| 									], | ||||
| 									"items": [ | ||||
| 										{ | ||||
| 											"id": 1, | ||||
| 											"created_at": 1646279455000, | ||||
| 											"updated_at": 1646279455000, | ||||
| 											"user_id": 2, | ||||
| 											"type": "proxy", | ||||
| 											"nginx_template_id": 1, | ||||
| 											"listen_interface": "", | ||||
| 											"domain_names": ["jc21.com"], | ||||
| 											"upstream_id": 0, | ||||
| 											"certificate_id": 0, | ||||
| 											"access_list_id": 0, | ||||
| 											"ssl_forced": false, | ||||
| 											"caching_enabled": false, | ||||
| 											"block_exploits": false, | ||||
| 											"allow_websocket_upgrade": false, | ||||
| 											"http2_support": false, | ||||
| 											"hsts_enabled": false, | ||||
| 											"hsts_subdomains": false, | ||||
| 											"paths": "", | ||||
| 											"advanced_config": "", | ||||
| 											"is_disabled": false | ||||
| 										} | ||||
| 									] | ||||
| 								} | ||||
| 							} | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										60
									
								
								backend/embed/api_docs/paths/hosts/hostID/delete.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										60
									
								
								backend/embed/api_docs/paths/hosts/hostID/delete.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,60 @@ | ||||
| { | ||||
| 	"operationId": "deleteHost", | ||||
| 	"summary": "Delete a Host", | ||||
| 	"tags": [ | ||||
| 		"Hosts" | ||||
| 	], | ||||
| 	"parameters": [ | ||||
| 		{ | ||||
| 			"in": "path", | ||||
| 			"name": "hostID", | ||||
| 			"schema": { | ||||
| 				"type": "integer", | ||||
| 				"minimum": 1 | ||||
| 			}, | ||||
| 			"required": true, | ||||
| 			"description": "Numeric ID of the Host", | ||||
| 			"example": 1 | ||||
| 		} | ||||
| 	], | ||||
| 	"responses": { | ||||
| 		"200": { | ||||
| 			"description": "200 response", | ||||
| 			"content": { | ||||
| 				"application/json": { | ||||
| 					"schema": { | ||||
| 						"$ref": "#/components/schemas/DeletedItemResponse" | ||||
| 					}, | ||||
| 					"examples": { | ||||
| 						"default": { | ||||
| 							"value": { | ||||
| 								"result": true | ||||
| 							} | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		}, | ||||
| 		"400": { | ||||
| 			"description": "400 response", | ||||
| 			"content": { | ||||
| 				"application/json": { | ||||
| 					"schema": { | ||||
| 						"$ref": "#/components/schemas/DeletedItemResponse" | ||||
| 					}, | ||||
| 					"examples": { | ||||
| 						"default": { | ||||
| 							"value": { | ||||
| 								"result": null, | ||||
| 								"error": { | ||||
| 									"code": 400, | ||||
| 									"message": "You cannot delete a host that is in use!" | ||||
| 								} | ||||
| 							} | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										65
									
								
								backend/embed/api_docs/paths/hosts/hostID/get.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										65
									
								
								backend/embed/api_docs/paths/hosts/hostID/get.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,65 @@ | ||||
| { | ||||
| 	"operationId": "getHost", | ||||
| 	"summary": "Get a Host object by ID", | ||||
| 	"tags": ["Hosts"], | ||||
| 	"parameters": [ | ||||
| 		{ | ||||
| 			"in": "path", | ||||
| 			"name": "hostID", | ||||
| 			"schema": { | ||||
| 				"type": "integer", | ||||
| 				"minimum": 1 | ||||
| 			}, | ||||
| 			"required": true, | ||||
| 			"description": "ID of the Host", | ||||
| 			"example": 1 | ||||
| 		} | ||||
| 	], | ||||
| 	"responses": { | ||||
| 		"200": { | ||||
| 			"description": "200 response", | ||||
| 			"content": { | ||||
| 				"application/json": { | ||||
| 					"schema": { | ||||
| 						"type": "object", | ||||
| 						"required": ["result"], | ||||
| 						"properties": { | ||||
| 							"result": { | ||||
| 								"$ref": "#/components/schemas/HostObject" | ||||
| 							} | ||||
| 						} | ||||
| 					}, | ||||
| 					"examples": { | ||||
| 						"default": { | ||||
| 							"value": { | ||||
| 								"result": { | ||||
| 									"id": 1, | ||||
| 									"created_at": 1646279455000, | ||||
| 									"updated_at": 1646279455000, | ||||
| 									"user_id": 2, | ||||
| 									"type": "proxy", | ||||
| 									"nginx_template_id": 1, | ||||
| 									"listen_interface": "", | ||||
| 									"domain_names": ["jc21.com"], | ||||
| 									"upstream_id": 0, | ||||
| 									"certificate_id": 0, | ||||
| 									"access_list_id": 0, | ||||
| 									"ssl_forced": false, | ||||
| 									"caching_enabled": false, | ||||
| 									"block_exploits": false, | ||||
| 									"allow_websocket_upgrade": false, | ||||
| 									"http2_support": false, | ||||
| 									"hsts_enabled": false, | ||||
| 									"hsts_subdomains": false, | ||||
| 									"paths": "", | ||||
| 									"advanced_config": "", | ||||
| 									"is_disabled": false | ||||
| 								} | ||||
| 							} | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @@ -0,0 +1,43 @@ | ||||
| { | ||||
| 	"operationId": "getHostNginxConfig", | ||||
| 	"summary": "Get a Host Nginx Config object by ID", | ||||
| 	"tags": ["Hosts"], | ||||
| 	"parameters": [ | ||||
| 		{ | ||||
| 			"in": "path", | ||||
| 			"name": "hostID", | ||||
| 			"schema": { | ||||
| 				"type": "integer", | ||||
| 				"minimum": 1 | ||||
| 			}, | ||||
| 			"required": true, | ||||
| 			"description": "ID of the Host", | ||||
| 			"example": 1 | ||||
| 		} | ||||
| 	], | ||||
| 	"responses": { | ||||
| 		"200": { | ||||
| 			"description": "200 response", | ||||
| 			"content": { | ||||
| 				"application/json": { | ||||
| 					"schema": { | ||||
| 						"type": "object", | ||||
| 						"required": ["result"], | ||||
| 						"properties": { | ||||
| 							"result": { | ||||
| 								"type": "string" | ||||
| 							} | ||||
| 						} | ||||
| 					}, | ||||
| 					"examples": { | ||||
| 						"default": { | ||||
| 							"value": { | ||||
| 								"result": "# ------------------------------------------------------------\n# a.example.com\n# ------------------------------------------------------------\nserver {\n  listen 80;\n  server_name a.example.com ;\n  access_log /data/logs/host-1_access.log proxy;\n  error_log /data/logs/host-1_error.log warn;\n  # locations ?\n  # default location:\n  location / {\n    # Access Rules ? todo\n    # Access checks must...? todo\n    # Proxy!\n    add_header       X-Served-By $host;\n    proxy_set_header Host $host;\n    proxy_set_header X-Forwarded-Scheme $scheme;\n    proxy_set_header X-Forwarded-Proto  $scheme;\n    proxy_set_header X-Forwarded-For    $remote_addr;\n    proxy_http_version 1.1;\n    # proxy a single host\n    proxy_pass http://192.168.0.10:80;\n  }\n  # Legacy Custom Configuration\n  include /data/nginx/custom/server_proxy[.]conf;\n}\n" | ||||
| 							} | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										74
									
								
								backend/embed/api_docs/paths/hosts/hostID/put.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										74
									
								
								backend/embed/api_docs/paths/hosts/hostID/put.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,74 @@ | ||||
| { | ||||
| 	"operationId": "updateHost", | ||||
| 	"summary": "Update an existing Host", | ||||
| 	"tags": ["Hosts"], | ||||
| 	"parameters": [ | ||||
| 		{ | ||||
| 			"in": "path", | ||||
| 			"name": "hostID", | ||||
| 			"schema": { | ||||
| 				"type": "integer", | ||||
| 				"minimum": 1 | ||||
| 			}, | ||||
| 			"required": true, | ||||
| 			"description": "ID of the Host", | ||||
| 			"example": 1 | ||||
| 		} | ||||
| 	], | ||||
| 	"requestBody": { | ||||
| 		"description": "Host details to update", | ||||
| 		"required": true, | ||||
| 		"content": { | ||||
| 			"application/json": { | ||||
| 				"schema": "{{schema.UpdateHost}}" | ||||
| 			} | ||||
| 		} | ||||
| 	}, | ||||
| 	"responses": { | ||||
| 		"200": { | ||||
| 			"description": "200 response", | ||||
| 			"content": { | ||||
| 				"application/json": { | ||||
| 					"schema": { | ||||
| 						"type": "object", | ||||
| 						"required": ["result"], | ||||
| 						"properties": { | ||||
| 							"result": { | ||||
| 								"$ref": "#/components/schemas/HostObject" | ||||
| 							} | ||||
| 						} | ||||
| 					}, | ||||
| 					"examples": { | ||||
| 						"default": { | ||||
| 							"value": { | ||||
| 								"result": { | ||||
| 									"id": 1, | ||||
| 									"created_at": 1646279455000, | ||||
| 									"updated_at": 1646279455000, | ||||
| 									"user_id": 2, | ||||
| 									"type": "proxy", | ||||
| 									"nginx_template_id": 1, | ||||
| 									"listen_interface": "", | ||||
| 									"domain_names": ["jc21.com"], | ||||
| 									"upstream_id": 0, | ||||
| 									"certificate_id": 0, | ||||
| 									"access_list_id": 0, | ||||
| 									"ssl_forced": false, | ||||
| 									"caching_enabled": false, | ||||
| 									"block_exploits": false, | ||||
| 									"allow_websocket_upgrade": false, | ||||
| 									"http2_support": false, | ||||
| 									"hsts_enabled": false, | ||||
| 									"hsts_subdomains": false, | ||||
| 									"paths": "", | ||||
| 									"advanced_config": "", | ||||
| 									"is_disabled": false | ||||
| 								} | ||||
| 							} | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										61
									
								
								backend/embed/api_docs/paths/hosts/post.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										61
									
								
								backend/embed/api_docs/paths/hosts/post.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,61 @@ | ||||
| { | ||||
| 	"operationId": "createHost", | ||||
| 	"summary": "Create a new Host", | ||||
| 	"tags": ["Hosts"], | ||||
| 	"requestBody": { | ||||
| 		"description": "Host to Create", | ||||
| 		"required": true, | ||||
| 		"content": { | ||||
| 			"application/json": { | ||||
| 				"schema": "{{schema.CreateHost}}" | ||||
| 			} | ||||
| 		} | ||||
| 	}, | ||||
| 	"responses": { | ||||
| 		"201": { | ||||
| 			"description": "201 response", | ||||
| 			"content": { | ||||
| 				"application/json": { | ||||
| 					"schema": { | ||||
| 						"type": "object", | ||||
| 						"required": ["result"], | ||||
| 						"properties": { | ||||
| 							"result": { | ||||
| 								"$ref": "#/components/schemas/HostObject" | ||||
| 							} | ||||
| 						} | ||||
| 					}, | ||||
| 					"examples": { | ||||
| 						"default": { | ||||
| 							"value": { | ||||
| 								"result": { | ||||
| 									"id": 1, | ||||
| 									"created_at": 1645700556000, | ||||
| 									"updated_at": 1645700556000, | ||||
| 									"user_id": 2, | ||||
| 									"type": "proxy", | ||||
| 									"nginx_template_id": 1, | ||||
| 									"listen_interface": "", | ||||
| 									"domain_names": ["jc21.com"], | ||||
| 									"upstream_id": 0, | ||||
| 									"certificate_id": 0, | ||||
| 									"access_list_id": 0, | ||||
| 									"ssl_forced": false, | ||||
| 									"caching_enabled": false, | ||||
| 									"block_exploits": false, | ||||
| 									"allow_websocket_upgrade": false, | ||||
| 									"http2_support": false, | ||||
| 									"hsts_enabled": false, | ||||
| 									"hsts_subdomains": false, | ||||
| 									"paths": "", | ||||
| 									"advanced_config": "", | ||||
| 									"is_disabled": false | ||||
| 								} | ||||
| 							} | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										80
									
								
								backend/embed/api_docs/paths/nginx-templates/get.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										80
									
								
								backend/embed/api_docs/paths/nginx-templates/get.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,80 @@ | ||||
| { | ||||
| 	"operationId": "getNginxTemplates", | ||||
| 	"summary": "Get a list of Nginx Templates", | ||||
| 	"tags": ["Nginx Templates"], | ||||
| 	"parameters": [ | ||||
| 		{ | ||||
| 			"in": "query", | ||||
| 			"name": "offset", | ||||
| 			"schema": { | ||||
| 				"type": "number" | ||||
| 			}, | ||||
| 			"description": "The pagination row offset, default 0", | ||||
| 			"example": 0 | ||||
| 		}, | ||||
| 		{ | ||||
| 			"in": "query", | ||||
| 			"name": "limit", | ||||
| 			"schema": { | ||||
| 				"type": "number" | ||||
| 			}, | ||||
| 			"description": "The pagination row limit, default 10", | ||||
| 			"example": 10 | ||||
| 		}, | ||||
| 		{ | ||||
| 			"in": "query", | ||||
| 			"name": "sort", | ||||
| 			"schema": { | ||||
| 				"type": "string" | ||||
| 			}, | ||||
| 			"description": "The sorting of the list", | ||||
| 			"example": "id,name.asc,value.desc" | ||||
| 		} | ||||
| 	], | ||||
| 	"responses": { | ||||
| 		"200": { | ||||
| 			"description": "200 response", | ||||
| 			"content": { | ||||
| 				"application/json": { | ||||
| 					"schema": { | ||||
| 						"type": "object", | ||||
| 						"required": ["result"], | ||||
| 						"properties": { | ||||
| 							"result": { | ||||
| 								"$ref": "#/components/schemas/NginxTemplateList" | ||||
| 							} | ||||
| 						} | ||||
| 					}, | ||||
| 					"examples": { | ||||
| 						"default": { | ||||
| 							"value": { | ||||
| 								"result": { | ||||
| 									"total": 1, | ||||
| 									"offset": 0, | ||||
| 									"limit": 10, | ||||
| 									"sort": [ | ||||
| 										{ | ||||
| 											"field": "created_at", | ||||
| 											"direction": "ASC" | ||||
| 										} | ||||
| 									], | ||||
| 									"items": [ | ||||
| 										{ | ||||
| 											"id": 1, | ||||
| 											"created_at": 1646218093000, | ||||
| 											"updated_at": 1646218093000, | ||||
| 											"user_id": 1, | ||||
| 											"name": "Default Proxy Template", | ||||
| 											"type": "proxy", | ||||
| 											"template": "# this is a proxy template" | ||||
| 										} | ||||
| 									] | ||||
| 								} | ||||
| 							} | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										47
									
								
								backend/embed/api_docs/paths/nginx-templates/post.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										47
									
								
								backend/embed/api_docs/paths/nginx-templates/post.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,47 @@ | ||||
| { | ||||
| 	"operationId": "createNginxTemplate", | ||||
| 	"summary": "Create a new Nginx Template", | ||||
| 	"tags": ["Nginx Templates"], | ||||
| 	"requestBody": { | ||||
| 		"description": "Template to Create", | ||||
| 		"required": true, | ||||
| 		"content": { | ||||
| 			"application/json": { | ||||
| 				"schema": "{{schema.CreateNginxTemplate}}" | ||||
| 			} | ||||
| 		} | ||||
| 	}, | ||||
| 	"responses": { | ||||
| 		"201": { | ||||
| 			"description": "201 response", | ||||
| 			"content": { | ||||
| 				"application/json": { | ||||
| 					"schema": { | ||||
| 						"type": "object", | ||||
| 						"required": ["result"], | ||||
| 						"properties": { | ||||
| 							"result": { | ||||
| 								"$ref": "#/components/schemas/NginxTemplateObject" | ||||
| 							} | ||||
| 						} | ||||
| 					}, | ||||
| 					"examples": { | ||||
| 						"default": { | ||||
| 							"value": { | ||||
| 								"result": { | ||||
| 									"id": 10, | ||||
| 									"created_at": 1646218093000, | ||||
| 									"updated_at": 1646218093000, | ||||
| 									"user_id": 1, | ||||
| 									"name": "My proxy template", | ||||
| 									"type": "proxy", | ||||
| 									"template": "# this is a proxy template" | ||||
| 								} | ||||
| 							} | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @@ -0,0 +1,58 @@ | ||||
| { | ||||
| 	"operationId": "deleteNginxTemplate", | ||||
| 	"summary": "Delete a Nginx Template", | ||||
| 	"tags": ["Nginx Templates"], | ||||
| 	"parameters": [ | ||||
| 		{ | ||||
| 			"in": "path", | ||||
| 			"name": "templateID", | ||||
| 			"schema": { | ||||
| 				"type": "integer", | ||||
| 				"minimum": 1 | ||||
| 			}, | ||||
| 			"required": true, | ||||
| 			"description": "Numeric ID of the Template", | ||||
| 			"example": 1 | ||||
| 		} | ||||
| 	], | ||||
| 	"responses": { | ||||
| 		"200": { | ||||
| 			"description": "200 response", | ||||
| 			"content": { | ||||
| 				"application/json": { | ||||
| 					"schema": { | ||||
| 						"$ref": "#/components/schemas/DeletedItemResponse" | ||||
| 					}, | ||||
| 					"examples": { | ||||
| 						"default": { | ||||
| 							"value": { | ||||
| 								"result": true | ||||
| 							} | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		}, | ||||
| 		"400": { | ||||
| 			"description": "400 response", | ||||
| 			"content": { | ||||
| 				"application/json": { | ||||
| 					"schema": { | ||||
| 						"$ref": "#/components/schemas/DeletedItemResponse" | ||||
| 					}, | ||||
| 					"examples": { | ||||
| 						"default": { | ||||
| 							"value": { | ||||
| 								"result": null, | ||||
| 								"error": { | ||||
| 									"code": 400, | ||||
| 									"message": "You cannot delete a template that is in use!" | ||||
| 								} | ||||
| 							} | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @@ -0,0 +1,51 @@ | ||||
| { | ||||
| 	"operationId": "getNginxTemplate", | ||||
| 	"summary": "Get a Nginx Template object by ID", | ||||
| 	"tags": ["Nginx Templates"], | ||||
| 	"parameters": [ | ||||
| 		{ | ||||
| 			"in": "path", | ||||
| 			"name": "templateID", | ||||
| 			"schema": { | ||||
| 				"type": "integer", | ||||
| 				"minimum": 1 | ||||
| 			}, | ||||
| 			"required": true, | ||||
| 			"description": "ID of the Host Template", | ||||
| 			"example": 1 | ||||
| 		} | ||||
| 	], | ||||
| 	"responses": { | ||||
| 		"200": { | ||||
| 			"description": "200 response", | ||||
| 			"content": { | ||||
| 				"application/json": { | ||||
| 					"schema": { | ||||
| 						"type": "object", | ||||
| 						"required": ["result"], | ||||
| 						"properties": { | ||||
| 							"result": { | ||||
| 								"$ref": "#/components/schemas/NginxTemplateObject" | ||||
| 							} | ||||
| 						} | ||||
| 					}, | ||||
| 					"examples": { | ||||
| 						"default": { | ||||
| 							"value": { | ||||
| 								"result": { | ||||
| 									"id": 1, | ||||
| 									"created_at": 1646218093000, | ||||
| 									"updated_at": 1646218093000, | ||||
| 									"user_id": 1, | ||||
| 									"name": "Default Proxy Template", | ||||
| 									"type": "proxy", | ||||
| 									"template": "# this is a proxy template" | ||||
| 								} | ||||
| 							} | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @@ -0,0 +1,60 @@ | ||||
| { | ||||
| 	"operationId": "updateNginxTemplate", | ||||
| 	"summary": "Update an existing Nginx Template", | ||||
| 	"tags": ["Nginx Templates"], | ||||
| 	"parameters": [ | ||||
| 		{ | ||||
| 			"in": "path", | ||||
| 			"name": "templateID", | ||||
| 			"schema": { | ||||
| 				"type": "integer", | ||||
| 				"minimum": 1 | ||||
| 			}, | ||||
| 			"required": true, | ||||
| 			"description": "ID of the Template", | ||||
| 			"example": 1 | ||||
| 		} | ||||
| 	], | ||||
| 	"requestBody": { | ||||
| 		"description": "Template details to update", | ||||
| 		"required": true, | ||||
| 		"content": { | ||||
| 			"application/json": { | ||||
| 				"schema": "{{schema.UpdateNginxTemplate}}" | ||||
| 			} | ||||
| 		} | ||||
| 	}, | ||||
| 	"responses": { | ||||
| 		"200": { | ||||
| 			"description": "200 response", | ||||
| 			"content": { | ||||
| 				"application/json": { | ||||
| 					"schema": { | ||||
| 						"type": "object", | ||||
| 						"required": ["result"], | ||||
| 						"properties": { | ||||
| 							"result": { | ||||
| 								"$ref": "#/components/schemas/NginxTemplateObject" | ||||
| 							} | ||||
| 						} | ||||
| 					}, | ||||
| 					"examples": { | ||||
| 						"default": { | ||||
| 							"value": { | ||||
| 								"result": { | ||||
| 									"id": 1, | ||||
| 									"created_at": 1646218093000, | ||||
| 									"updated_at": 1646218093000, | ||||
| 									"user_id": 1, | ||||
| 									"name": "My renamed proxy template", | ||||
| 									"type": "proxy", | ||||
| 									"template": "# this is a proxy template" | ||||
| 								} | ||||
| 							} | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										9
									
								
								backend/embed/api_docs/paths/schema/get.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								backend/embed/api_docs/paths/schema/get.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,9 @@ | ||||
| { | ||||
| 	"operationId": "schema", | ||||
| 	"summary": "Returns this swagger API schema", | ||||
| 	"responses": { | ||||
| 		"200": { | ||||
| 			"description": "200 response" | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										81
									
								
								backend/embed/api_docs/paths/settings/get.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										81
									
								
								backend/embed/api_docs/paths/settings/get.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,81 @@ | ||||
| { | ||||
| 	"operationId": "getSettings", | ||||
| 	"summary": "Get a list of settings", | ||||
| 	"tags": ["Settings"], | ||||
| 	"parameters": [ | ||||
| 		{ | ||||
| 			"in": "query", | ||||
| 			"name": "offset", | ||||
| 			"schema": { | ||||
| 				"type": "number" | ||||
| 			}, | ||||
| 			"description": "The pagination row offset, default 0", | ||||
| 			"example": 0 | ||||
| 		}, | ||||
| 		{ | ||||
| 			"in": "query", | ||||
| 			"name": "limit", | ||||
| 			"schema": { | ||||
| 				"type": "number" | ||||
| 			}, | ||||
| 			"description": "The pagination row limit, default 10", | ||||
| 			"example": 10 | ||||
| 		}, | ||||
| 		{ | ||||
| 			"in": "query", | ||||
| 			"name": "sort", | ||||
| 			"schema": { | ||||
| 				"type": "string" | ||||
| 			}, | ||||
| 			"description": "The sorting of the list", | ||||
| 			"example": "id,name.asc,value.desc" | ||||
| 		} | ||||
| 	], | ||||
| 	"responses": { | ||||
| 		"200": { | ||||
| 			"description": "200 response", | ||||
| 			"content": { | ||||
| 				"application/json": { | ||||
| 					"schema": { | ||||
| 						"type": "object", | ||||
| 						"required": ["result"], | ||||
| 						"properties": { | ||||
| 							"result": { | ||||
| 								"$ref": "#/components/schemas/SettingList" | ||||
| 							} | ||||
| 						} | ||||
| 					}, | ||||
| 					"examples": { | ||||
| 						"default": { | ||||
| 							"value": { | ||||
| 								"result": { | ||||
| 									"total": 1, | ||||
| 									"offset": 0, | ||||
| 									"limit": 10, | ||||
| 									"sort": [ | ||||
| 										{ | ||||
| 											"field": "name", | ||||
| 											"direction": "ASC" | ||||
| 										} | ||||
| 									], | ||||
| 									"items": [ | ||||
| 										{ | ||||
| 											"id": 1, | ||||
| 											"created_at": 1578010090000, | ||||
| 											"updated_at": 1578010095000, | ||||
| 											"name": "default-site", | ||||
| 											"value": { | ||||
| 												"html": "<p>not found</p>", | ||||
| 												"type": "custom" | ||||
| 											} | ||||
| 										} | ||||
| 									] | ||||
| 								} | ||||
| 							} | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										52
									
								
								backend/embed/api_docs/paths/settings/name/get.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										52
									
								
								backend/embed/api_docs/paths/settings/name/get.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,52 @@ | ||||
| { | ||||
| 	"operationId": "getSetting", | ||||
| 	"summary": "Get a setting object by name", | ||||
| 	"tags": ["Settings"], | ||||
| 	"parameters": [ | ||||
| 		{ | ||||
| 			"in": "path", | ||||
| 			"name": "name", | ||||
| 			"schema": { | ||||
| 				"type": "string", | ||||
| 				"minLength": 2 | ||||
| 			}, | ||||
| 			"required": true, | ||||
| 			"description": "Name of the setting", | ||||
| 			"example": "default-site" | ||||
| 		} | ||||
| 	], | ||||
| 	"responses": { | ||||
| 		"200": { | ||||
| 			"description": "200 response", | ||||
| 			"content": { | ||||
| 				"application/json": { | ||||
| 					"schema": { | ||||
| 						"type": "object", | ||||
| 						"required": ["result"], | ||||
| 						"properties": { | ||||
| 							"result": { | ||||
| 								"$ref": "#/components/schemas/SettingObject" | ||||
| 							} | ||||
| 						} | ||||
| 					}, | ||||
| 					"examples": { | ||||
| 						"default": { | ||||
| 							"value": { | ||||
| 								"result": { | ||||
| 									"id": 2, | ||||
| 									"created_at": 1578010090000, | ||||
| 									"updated_at": 1578010095000, | ||||
| 									"name": "default-site", | ||||
| 									"value": { | ||||
| 										"html": "<p>not found</p>", | ||||
| 										"type": "custom" | ||||
| 									} | ||||
| 								} | ||||
| 							} | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										61
									
								
								backend/embed/api_docs/paths/settings/name/put.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										61
									
								
								backend/embed/api_docs/paths/settings/name/put.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,61 @@ | ||||
| { | ||||
| 	"operationId": "updateSetting", | ||||
| 	"summary": "Update an existing Setting", | ||||
| 	"tags": ["Settings"], | ||||
| 	"parameters": [ | ||||
| 		{ | ||||
| 			"in": "path", | ||||
| 			"name": "name", | ||||
| 			"schema": { | ||||
| 				"type": "string", | ||||
| 				"minLength": 2 | ||||
| 			}, | ||||
| 			"required": true, | ||||
| 			"description": "Name of the setting", | ||||
| 			"example": "default-site" | ||||
| 		} | ||||
| 	], | ||||
| 	"requestBody": { | ||||
| 		"description": "Setting details to update", | ||||
| 		"required": true, | ||||
| 		"content": { | ||||
| 			"application/json": { | ||||
| 				"schema": "{{schema.UpdateSetting}}" | ||||
| 			} | ||||
| 		} | ||||
| 	}, | ||||
| 	"responses": { | ||||
| 		"200": { | ||||
| 			"description": "200 response", | ||||
| 			"content": { | ||||
| 				"application/json": { | ||||
| 					"schema": { | ||||
| 						"type": "object", | ||||
| 						"required": ["result"], | ||||
| 						"properties": { | ||||
| 							"result": { | ||||
| 								"$ref": "#/components/schemas/SettingObject" | ||||
| 							} | ||||
| 						} | ||||
| 					}, | ||||
| 					"examples": { | ||||
| 						"default": { | ||||
| 							"value": { | ||||
| 								"result": { | ||||
| 									"id": 2, | ||||
| 									"created_at": 1578010090000, | ||||
| 									"updated_at": 1578010090000, | ||||
| 									"name": "default-site", | ||||
| 									"value": { | ||||
| 										"html": "<p>not found</p>", | ||||
| 										"type": "custom" | ||||
| 									} | ||||
| 								} | ||||
| 							} | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										48
									
								
								backend/embed/api_docs/paths/settings/post.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										48
									
								
								backend/embed/api_docs/paths/settings/post.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,48 @@ | ||||
| { | ||||
| 	"operationId": "createSetting", | ||||
| 	"summary": "Create a new Setting", | ||||
| 	"tags": ["Settings"], | ||||
| 	"requestBody": { | ||||
| 		"description": "Setting to Create", | ||||
| 		"required": true, | ||||
| 		"content": { | ||||
| 			"application/json": { | ||||
| 				"schema": "{{schema.CreateSetting}}" | ||||
| 			} | ||||
| 		} | ||||
| 	}, | ||||
| 	"responses": { | ||||
| 		"201": { | ||||
| 			"description": "201 response", | ||||
| 			"content": { | ||||
| 				"application/json": { | ||||
| 					"schema": { | ||||
| 						"type": "object", | ||||
| 						"required": ["result"], | ||||
| 						"properties": { | ||||
| 							"result": { | ||||
| 								"$ref": "#/components/schemas/SettingObject" | ||||
| 							} | ||||
| 						} | ||||
| 					}, | ||||
| 					"examples": { | ||||
| 						"default": { | ||||
| 							"value": { | ||||
| 								"result": { | ||||
| 									"id": 2, | ||||
| 									"created_at": 1578010090000, | ||||
| 									"updated_at": 1578010090000, | ||||
| 									"name": "default-site", | ||||
| 									"value": { | ||||
| 										"html": "<p>not found</p>", | ||||
| 										"type": "custom" | ||||
| 									} | ||||
| 								} | ||||
| 							} | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										70
									
								
								backend/embed/api_docs/paths/streams/get.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										70
									
								
								backend/embed/api_docs/paths/streams/get.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,70 @@ | ||||
| { | ||||
| 	"operationId": "getStreams", | ||||
| 	"summary": "Get a list of Streams", | ||||
| 	"tags": ["Streams"], | ||||
| 	"parameters": [ | ||||
| 		{ | ||||
| 			"in": "query", | ||||
| 			"name": "offset", | ||||
| 			"schema": { | ||||
| 				"type": "number" | ||||
| 			}, | ||||
| 			"description": "The pagination row offset, default 0", | ||||
| 			"example": 0 | ||||
| 		}, | ||||
| 		{ | ||||
| 			"in": "query", | ||||
| 			"name": "limit", | ||||
| 			"schema": { | ||||
| 				"type": "number" | ||||
| 			}, | ||||
| 			"description": "The pagination row limit, default 10", | ||||
| 			"example": 10 | ||||
| 		}, | ||||
| 		{ | ||||
| 			"in": "query", | ||||
| 			"name": "sort", | ||||
| 			"schema": { | ||||
| 				"type": "string" | ||||
| 			}, | ||||
| 			"description": "The sorting of the list", | ||||
| 			"example": "id,name.asc,value.desc" | ||||
| 		} | ||||
| 	], | ||||
| 	"responses": { | ||||
| 		"200": { | ||||
| 			"description": "200 response", | ||||
| 			"content": { | ||||
| 				"application/json": { | ||||
| 					"schema": { | ||||
| 						"type": "object", | ||||
| 						"required": ["result"], | ||||
| 						"properties": { | ||||
| 							"result": { | ||||
| 								"$ref": "#/components/schemas/StreamList" | ||||
| 							} | ||||
| 						} | ||||
| 					}, | ||||
| 					"examples": { | ||||
| 						"default": { | ||||
| 							"value": { | ||||
| 								"result": { | ||||
| 									"total": 1, | ||||
| 									"offset": 0, | ||||
| 									"limit": 10, | ||||
| 									"sort": [ | ||||
| 										{ | ||||
| 											"field": "name", | ||||
| 											"direction": "ASC" | ||||
| 										} | ||||
| 									], | ||||
| 									"items": ["TODO"] | ||||
| 								} | ||||
| 							} | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										39
									
								
								backend/embed/api_docs/paths/streams/post.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										39
									
								
								backend/embed/api_docs/paths/streams/post.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,39 @@ | ||||
| { | ||||
| 	"operationId": "createStream", | ||||
| 	"summary": "Create a new Stream", | ||||
| 	"tags": ["Streams"], | ||||
| 	"requestBody": { | ||||
| 		"description": "Stream to Create", | ||||
| 		"required": true, | ||||
| 		"content": { | ||||
| 			"application/json": { | ||||
| 				"schema": "{{schema.CreateStream}}" | ||||
| 			} | ||||
| 		} | ||||
| 	}, | ||||
| 	"responses": { | ||||
| 		"201": { | ||||
| 			"description": "201 response", | ||||
| 			"content": { | ||||
| 				"application/json": { | ||||
| 					"schema": { | ||||
| 						"type": "object", | ||||
| 						"required": ["result"], | ||||
| 						"properties": { | ||||
| 							"result": { | ||||
| 								"$ref": "#/components/schemas/StreamObject" | ||||
| 							} | ||||
| 						} | ||||
| 					}, | ||||
| 					"examples": { | ||||
| 						"default": { | ||||
| 							"value": { | ||||
| 								"result": "TODO" | ||||
| 							} | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										60
									
								
								backend/embed/api_docs/paths/streams/streamID/delete.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										60
									
								
								backend/embed/api_docs/paths/streams/streamID/delete.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,60 @@ | ||||
| { | ||||
| 	"operationId": "deleteStream", | ||||
| 	"summary": "Delete a Stream", | ||||
| 	"tags": [ | ||||
| 		"Streams" | ||||
| 	], | ||||
| 	"parameters": [ | ||||
| 		{ | ||||
| 			"in": "path", | ||||
| 			"name": "streamID", | ||||
| 			"schema": { | ||||
| 				"type": "integer", | ||||
| 				"minimum": 1 | ||||
| 			}, | ||||
| 			"required": true, | ||||
| 			"description": "Numeric ID of the Stream", | ||||
| 			"example": 1 | ||||
| 		} | ||||
| 	], | ||||
| 	"responses": { | ||||
| 		"200": { | ||||
| 			"description": "200 response", | ||||
| 			"content": { | ||||
| 				"application/json": { | ||||
| 					"schema": { | ||||
| 						"$ref": "#/components/schemas/DeletedItemResponse" | ||||
| 					}, | ||||
| 					"examples": { | ||||
| 						"default": { | ||||
| 							"value": { | ||||
| 								"result": true | ||||
| 							} | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		}, | ||||
| 		"400": { | ||||
| 			"description": "400 response", | ||||
| 			"content": { | ||||
| 				"application/json": { | ||||
| 					"schema": { | ||||
| 						"$ref": "#/components/schemas/DeletedItemResponse" | ||||
| 					}, | ||||
| 					"examples": { | ||||
| 						"default": { | ||||
| 							"value": { | ||||
| 								"result": null, | ||||
| 								"error": { | ||||
| 									"code": 400, | ||||
| 									"message": "You cannot delete a Stream that is in use!" | ||||
| 								} | ||||
| 							} | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										43
									
								
								backend/embed/api_docs/paths/streams/streamID/get.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										43
									
								
								backend/embed/api_docs/paths/streams/streamID/get.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,43 @@ | ||||
| { | ||||
| 	"operationId": "getStream", | ||||
| 	"summary": "Get a Stream object by ID", | ||||
| 	"tags": ["Streams"], | ||||
| 	"parameters": [ | ||||
| 		{ | ||||
| 			"in": "path", | ||||
| 			"name": "streamID", | ||||
| 			"schema": { | ||||
| 				"type": "integer", | ||||
| 				"minimum": 1 | ||||
| 			}, | ||||
| 			"required": true, | ||||
| 			"description": "ID of the Stream", | ||||
| 			"example": 1 | ||||
| 		} | ||||
| 	], | ||||
| 	"responses": { | ||||
| 		"200": { | ||||
| 			"description": "200 response", | ||||
| 			"content": { | ||||
| 				"application/json": { | ||||
| 					"schema": { | ||||
| 						"type": "object", | ||||
| 						"required": ["result"], | ||||
| 						"properties": { | ||||
| 							"result": { | ||||
| 								"$ref": "#/components/schemas/StreamObject" | ||||
| 							} | ||||
| 						} | ||||
| 					}, | ||||
| 					"examples": { | ||||
| 						"default": { | ||||
| 							"value": { | ||||
| 								"result": "TODO" | ||||
| 							} | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										52
									
								
								backend/embed/api_docs/paths/streams/streamID/put.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										52
									
								
								backend/embed/api_docs/paths/streams/streamID/put.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,52 @@ | ||||
| { | ||||
| 	"operationId": "updateStream", | ||||
| 	"summary": "Update an existing Stream", | ||||
| 	"tags": ["Streams"], | ||||
| 	"parameters": [ | ||||
| 		{ | ||||
| 			"in": "path", | ||||
| 			"name": "streamID", | ||||
| 			"schema": { | ||||
| 				"type": "integer", | ||||
| 				"minimum": 1 | ||||
| 			}, | ||||
| 			"required": true, | ||||
| 			"description": "ID of the Stream", | ||||
| 			"example": 1 | ||||
| 		} | ||||
| 	], | ||||
| 	"requestBody": { | ||||
| 		"description": "Stream details to update", | ||||
| 		"required": true, | ||||
| 		"content": { | ||||
| 			"application/json": { | ||||
| 				"schema": "{{schema.UpdateStream}}" | ||||
| 			} | ||||
| 		} | ||||
| 	}, | ||||
| 	"responses": { | ||||
| 		"200": { | ||||
| 			"description": "200 response", | ||||
| 			"content": { | ||||
| 				"application/json": { | ||||
| 					"schema": { | ||||
| 						"type": "object", | ||||
| 						"required": ["result"], | ||||
| 						"properties": { | ||||
| 							"result": { | ||||
| 								"$ref": "#/components/schemas/StreamObject" | ||||
| 							} | ||||
| 						} | ||||
| 					}, | ||||
| 					"examples": { | ||||
| 						"default": { | ||||
| 							"value": { | ||||
| 								"result": "TODO" | ||||
| 							} | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										286
									
								
								backend/embed/api_docs/paths/upstreams/get.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										286
									
								
								backend/embed/api_docs/paths/upstreams/get.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,286 @@ | ||||
| { | ||||
| 	"operationId": "getUpstreams", | ||||
| 	"summary": "Get a list of Upstreams", | ||||
| 	"tags": ["Upstreams"], | ||||
| 	"parameters": [ | ||||
| 		{ | ||||
| 			"in": "query", | ||||
| 			"name": "offset", | ||||
| 			"schema": { | ||||
| 				"type": "number" | ||||
| 			}, | ||||
| 			"description": "The pagination row offset, default 0", | ||||
| 			"example": 0 | ||||
| 		}, | ||||
| 		{ | ||||
| 			"in": "query", | ||||
| 			"name": "limit", | ||||
| 			"schema": { | ||||
| 				"type": "number" | ||||
| 			}, | ||||
| 			"description": "The pagination row limit, default 10", | ||||
| 			"example": 10 | ||||
| 		}, | ||||
| 		{ | ||||
| 			"in": "query", | ||||
| 			"name": "sort", | ||||
| 			"schema": { | ||||
| 				"type": "string" | ||||
| 			}, | ||||
| 			"description": "The sorting of the list", | ||||
| 			"example": "id,name.asc,value.desc" | ||||
| 		} | ||||
| 	], | ||||
| 	"responses": { | ||||
| 		"200": { | ||||
| 			"description": "200 response", | ||||
| 			"content": { | ||||
| 				"application/json": { | ||||
| 					"schema": { | ||||
| 						"type": "object", | ||||
| 						"required": ["result"], | ||||
| 						"properties": { | ||||
| 							"result": { | ||||
| 								"$ref": "#/components/schemas/UpstreamList" | ||||
| 							} | ||||
| 						} | ||||
| 					}, | ||||
| 					"examples": { | ||||
| 						"default": { | ||||
| 							"value": { | ||||
| 								"result": { | ||||
| 									"total": 5, | ||||
| 									"offset": 0, | ||||
| 									"limit": 10, | ||||
| 									"sort": [ | ||||
| 										{ | ||||
| 											"field": "name", | ||||
| 											"direction": "ASC" | ||||
| 										} | ||||
| 									], | ||||
| 									"items": [ | ||||
| 										{ | ||||
| 											"id": 1, | ||||
| 											"created_at": 1672804124000, | ||||
| 											"updated_at": 1672804124000, | ||||
| 											"user_id": 2, | ||||
| 											"name": "API servers", | ||||
| 											"nginx_template_id": 5, | ||||
| 											"ip_hash": true, | ||||
| 											"ntlm": false, | ||||
| 											"keepalive": 10, | ||||
| 											"keepalive_requests": 10, | ||||
| 											"keepalive_time": "60s", | ||||
| 											"keepalive_timeout": "3s", | ||||
| 											"advanced_config": "", | ||||
| 											"status": "ok", | ||||
| 											"error_message": "", | ||||
| 											"servers": [ | ||||
| 												{ | ||||
| 													"id": 1, | ||||
| 													"created_at": 1672804124000, | ||||
| 													"updated_at": 1672804124000, | ||||
| 													"upstream_group_id": 1, | ||||
| 													"server": "192.168.0.10:80", | ||||
| 													"weight": 100, | ||||
| 													"max_conns": 0, | ||||
| 													"max_fails": 0, | ||||
| 													"fail_timeout": 0, | ||||
| 													"backup": false | ||||
| 												}, | ||||
| 												{ | ||||
| 													"id": 2, | ||||
| 													"created_at": 1672804124000, | ||||
| 													"updated_at": 1672804124000, | ||||
| 													"upstream_group_id": 1, | ||||
| 													"server": "192.168.0.11:80", | ||||
| 													"weight": 50, | ||||
| 													"max_conns": 0, | ||||
| 													"max_fails": 0, | ||||
| 													"fail_timeout": 0, | ||||
| 													"backup": false | ||||
| 												} | ||||
| 											] | ||||
| 										}, | ||||
| 										{ | ||||
| 											"id": 2, | ||||
| 											"created_at": 1672804197000, | ||||
| 											"updated_at": 1672804197000, | ||||
| 											"user_id": 2, | ||||
| 											"name": "API servers 2", | ||||
| 											"nginx_template_id": 5, | ||||
| 											"ip_hash": false, | ||||
| 											"ntlm": false, | ||||
| 											"keepalive": 0, | ||||
| 											"keepalive_requests": 0, | ||||
| 											"keepalive_time": "", | ||||
| 											"keepalive_timeout": "", | ||||
| 											"advanced_config": "", | ||||
| 											"status": "ok", | ||||
| 											"error_message": "", | ||||
| 											"servers": [ | ||||
| 												{ | ||||
| 													"id": 3, | ||||
| 													"created_at": 1672804197000, | ||||
| 													"updated_at": 1672804197000, | ||||
| 													"upstream_group_id": 2, | ||||
| 													"server": "192.168.0.10:80", | ||||
| 													"weight": 100, | ||||
| 													"max_conns": 0, | ||||
| 													"max_fails": 0, | ||||
| 													"fail_timeout": 0, | ||||
| 													"backup": false | ||||
| 												}, | ||||
| 												{ | ||||
| 													"id": 4, | ||||
| 													"created_at": 1672804197000, | ||||
| 													"updated_at": 1672804197000, | ||||
| 													"upstream_group_id": 2, | ||||
| 													"server": "192.168.0.11:80", | ||||
| 													"weight": 50, | ||||
| 													"max_conns": 0, | ||||
| 													"max_fails": 0, | ||||
| 													"fail_timeout": 0, | ||||
| 													"backup": false | ||||
| 												} | ||||
| 											] | ||||
| 										}, | ||||
| 										{ | ||||
| 											"id": 3, | ||||
| 											"created_at": 1672804200000, | ||||
| 											"updated_at": 1672804200000, | ||||
| 											"user_id": 2, | ||||
| 											"name": "API servers 2", | ||||
| 											"nginx_template_id": 5, | ||||
| 											"ip_hash": false, | ||||
| 											"ntlm": false, | ||||
| 											"keepalive": 0, | ||||
| 											"keepalive_requests": 0, | ||||
| 											"keepalive_time": "", | ||||
| 											"keepalive_timeout": "", | ||||
| 											"advanced_config": "", | ||||
| 											"status": "ok", | ||||
| 											"error_message": "", | ||||
| 											"servers": [ | ||||
| 												{ | ||||
| 													"id": 5, | ||||
| 													"created_at": 1672804200000, | ||||
| 													"updated_at": 1672804200000, | ||||
| 													"upstream_group_id": 3, | ||||
| 													"server": "192.168.0.10:80", | ||||
| 													"weight": 100, | ||||
| 													"max_conns": 0, | ||||
| 													"max_fails": 0, | ||||
| 													"fail_timeout": 0, | ||||
| 													"backup": false | ||||
| 												}, | ||||
| 												{ | ||||
| 													"id": 6, | ||||
| 													"created_at": 1672804200000, | ||||
| 													"updated_at": 1672804200000, | ||||
| 													"upstream_group_id": 3, | ||||
| 													"server": "192.168.0.11:80", | ||||
| 													"weight": 50, | ||||
| 													"max_conns": 0, | ||||
| 													"max_fails": 0, | ||||
| 													"fail_timeout": 0, | ||||
| 													"backup": false | ||||
| 												} | ||||
| 											] | ||||
| 										}, | ||||
| 										{ | ||||
| 											"id": 4, | ||||
| 											"created_at": 1672804201000, | ||||
| 											"updated_at": 1672804201000, | ||||
| 											"user_id": 2, | ||||
| 											"name": "API servers 2", | ||||
| 											"nginx_template_id": 5, | ||||
| 											"ip_hash": false, | ||||
| 											"ntlm": false, | ||||
| 											"keepalive": 0, | ||||
| 											"keepalive_requests": 0, | ||||
| 											"keepalive_time": "", | ||||
| 											"keepalive_timeout": "", | ||||
| 											"advanced_config": "", | ||||
| 											"status": "ok", | ||||
| 											"error_message": "", | ||||
| 											"servers": [ | ||||
| 												{ | ||||
| 													"id": 7, | ||||
| 													"created_at": 1672804201000, | ||||
| 													"updated_at": 1672804201000, | ||||
| 													"upstream_group_id": 4, | ||||
| 													"server": "192.168.0.10:80", | ||||
| 													"weight": 100, | ||||
| 													"max_conns": 0, | ||||
| 													"max_fails": 0, | ||||
| 													"fail_timeout": 0, | ||||
| 													"backup": false | ||||
| 												}, | ||||
| 												{ | ||||
| 													"id": 8, | ||||
| 													"created_at": 1672804201000, | ||||
| 													"updated_at": 1672804201000, | ||||
| 													"upstream_group_id": 4, | ||||
| 													"server": "192.168.0.11:80", | ||||
| 													"weight": 50, | ||||
| 													"max_conns": 0, | ||||
| 													"max_fails": 0, | ||||
| 													"fail_timeout": 0, | ||||
| 													"backup": false | ||||
| 												} | ||||
| 											] | ||||
| 										}, | ||||
| 										{ | ||||
| 											"id": 5, | ||||
| 											"created_at": 1672804201000, | ||||
| 											"updated_at": 1672804201000, | ||||
| 											"user_id": 2, | ||||
| 											"name": "API servers 2", | ||||
| 											"nginx_template_id": 5, | ||||
| 											"ip_hash": false, | ||||
| 											"ntlm": false, | ||||
| 											"keepalive": 0, | ||||
| 											"keepalive_requests": 0, | ||||
| 											"keepalive_time": "", | ||||
| 											"keepalive_timeout": "", | ||||
| 											"advanced_config": "", | ||||
| 											"status": "ok", | ||||
| 											"error_message": "", | ||||
| 											"servers": [ | ||||
| 												{ | ||||
| 													"id": 9, | ||||
| 													"created_at": 1672804201000, | ||||
| 													"updated_at": 1672804201000, | ||||
| 													"upstream_group_id": 5, | ||||
| 													"server": "192.168.0.10:80", | ||||
| 													"weight": 100, | ||||
| 													"max_conns": 0, | ||||
| 													"max_fails": 0, | ||||
| 													"fail_timeout": 0, | ||||
| 													"backup": false | ||||
| 												}, | ||||
| 												{ | ||||
| 													"id": 10, | ||||
| 													"created_at": 1672804201000, | ||||
| 													"updated_at": 1672804201000, | ||||
| 													"upstream_group_id": 5, | ||||
| 													"server": "192.168.0.11:80", | ||||
| 													"weight": 50, | ||||
| 													"max_conns": 0, | ||||
| 													"max_fails": 0, | ||||
| 													"fail_timeout": 0, | ||||
| 													"backup": false | ||||
| 												} | ||||
| 											] | ||||
| 										} | ||||
| 									] | ||||
| 								} | ||||
| 							} | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										81
									
								
								backend/embed/api_docs/paths/upstreams/post.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										81
									
								
								backend/embed/api_docs/paths/upstreams/post.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,81 @@ | ||||
| { | ||||
| 	"operationId": "createUpstream", | ||||
| 	"summary": "Create a new Upstream", | ||||
| 	"tags": ["Upstreams"], | ||||
| 	"requestBody": { | ||||
| 		"description": "Upstream to Create", | ||||
| 		"required": true, | ||||
| 		"content": { | ||||
| 			"application/json": { | ||||
| 				"schema": "{{schema.CreateUpstream}}" | ||||
| 			} | ||||
| 		} | ||||
| 	}, | ||||
| 	"responses": { | ||||
| 		"201": { | ||||
| 			"description": "201 response", | ||||
| 			"content": { | ||||
| 				"application/json": { | ||||
| 					"schema": { | ||||
| 						"type": "object", | ||||
| 						"required": ["result"], | ||||
| 						"properties": { | ||||
| 							"result": { | ||||
| 								"$ref": "#/components/schemas/UpstreamObject" | ||||
| 							} | ||||
| 						} | ||||
| 					}, | ||||
| 					"examples": { | ||||
| 						"default": { | ||||
| 							"value": { | ||||
| 								"result": { | ||||
| 									"id": 6, | ||||
| 									"created_at": 1672806857000, | ||||
| 									"updated_at": 1672806857000, | ||||
| 									"user_id": 2, | ||||
| 									"name": "API servers 2", | ||||
| 									"nginx_template_id": 5, | ||||
| 									"ip_hash": false, | ||||
| 									"ntlm": false, | ||||
| 									"keepalive": 0, | ||||
| 									"keepalive_requests": 0, | ||||
| 									"keepalive_time": "", | ||||
| 									"keepalive_timeout": "", | ||||
| 									"advanced_config": "", | ||||
| 									"status": "ready", | ||||
| 									"error_message": "", | ||||
| 									"servers": [ | ||||
| 										{ | ||||
| 											"id": 11, | ||||
| 											"created_at": 1672806857000, | ||||
| 											"updated_at": 1672806857000, | ||||
| 											"upstream_id": 6, | ||||
| 											"server": "192.168.0.10:80", | ||||
| 											"weight": 100, | ||||
| 											"max_conns": 0, | ||||
| 											"max_fails": 0, | ||||
| 											"fail_timeout": 0, | ||||
| 											"backup": false | ||||
| 										}, | ||||
| 										{ | ||||
| 											"id": 12, | ||||
| 											"created_at": 1672806857000, | ||||
| 											"updated_at": 1672806857000, | ||||
| 											"upstream_id": 6, | ||||
| 											"server": "192.168.0.11:80", | ||||
| 											"weight": 50, | ||||
| 											"max_conns": 0, | ||||
| 											"max_fails": 0, | ||||
| 											"fail_timeout": 0, | ||||
| 											"backup": false | ||||
| 										} | ||||
| 									] | ||||
| 								} | ||||
| 							} | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @@ -0,0 +1,58 @@ | ||||
| { | ||||
| 	"operationId": "deleteUpstream", | ||||
| 	"summary": "Delete a Upstream", | ||||
| 	"tags": ["Upstreams"], | ||||
| 	"parameters": [ | ||||
| 		{ | ||||
| 			"in": "path", | ||||
| 			"name": "upstreamID", | ||||
| 			"schema": { | ||||
| 				"type": "integer", | ||||
| 				"minimum": 1 | ||||
| 			}, | ||||
| 			"required": true, | ||||
| 			"description": "Numeric ID of the Upstream", | ||||
| 			"example": 1 | ||||
| 		} | ||||
| 	], | ||||
| 	"responses": { | ||||
| 		"200": { | ||||
| 			"description": "200 response", | ||||
| 			"content": { | ||||
| 				"application/json": { | ||||
| 					"schema": { | ||||
| 						"$ref": "#/components/schemas/DeletedItemResponse" | ||||
| 					}, | ||||
| 					"examples": { | ||||
| 						"default": { | ||||
| 							"value": { | ||||
| 								"result": true | ||||
| 							} | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		}, | ||||
| 		"400": { | ||||
| 			"description": "400 response", | ||||
| 			"content": { | ||||
| 				"application/json": { | ||||
| 					"schema": { | ||||
| 						"$ref": "#/components/schemas/DeletedItemResponse" | ||||
| 					}, | ||||
| 					"examples": { | ||||
| 						"default": { | ||||
| 							"value": { | ||||
| 								"result": null, | ||||
| 								"error": { | ||||
| 									"code": 400, | ||||
| 									"message": "You cannot delete a Upstream that is in use!" | ||||
| 								} | ||||
| 							} | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										82
									
								
								backend/embed/api_docs/paths/upstreams/upstreamID/get.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										82
									
								
								backend/embed/api_docs/paths/upstreams/upstreamID/get.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,82 @@ | ||||
| { | ||||
| 	"operationId": "getUpstream", | ||||
| 	"summary": "Get a Upstream object by ID", | ||||
| 	"tags": ["Upstreams"], | ||||
| 	"parameters": [ | ||||
| 		{ | ||||
| 			"in": "path", | ||||
| 			"name": "upstreamID", | ||||
| 			"schema": { | ||||
| 				"type": "integer", | ||||
| 				"minimum": 1 | ||||
| 			}, | ||||
| 			"required": true, | ||||
| 			"description": "ID of the Upstream", | ||||
| 			"example": 1 | ||||
| 		} | ||||
| 	], | ||||
| 	"responses": { | ||||
| 		"200": { | ||||
| 			"description": "200 response", | ||||
| 			"content": { | ||||
| 				"application/json": { | ||||
| 					"schema": { | ||||
| 						"type": "object", | ||||
| 						"required": ["result"], | ||||
| 						"properties": { | ||||
| 							"result": { | ||||
| 								"$ref": "#/components/schemas/UpstreamObject" | ||||
| 							} | ||||
| 						} | ||||
| 					}, | ||||
| 					"examples": { | ||||
| 						"default": { | ||||
| 							"value": { | ||||
| 								"result": { | ||||
| 									"id": 1, | ||||
| 									"created_at": 1672786008000, | ||||
| 									"updated_at": 1672786008000, | ||||
| 									"user_id": 2, | ||||
| 									"name": "API servers 3", | ||||
| 									"ip_hash": true, | ||||
| 									"ntlm": false, | ||||
| 									"keepalive": 10, | ||||
| 									"keepalive_requests": 10, | ||||
| 									"keepalive_time": "60s", | ||||
| 									"keepalive_timeout": "3s", | ||||
| 									"advanced_config": "", | ||||
| 									"servers": [ | ||||
| 										{ | ||||
| 											"id": 1, | ||||
| 											"created_at": 1672786009000, | ||||
| 											"updated_at": 1672786009000, | ||||
| 											"upstream_id": 1, | ||||
| 											"server": "api1.localhost:1234", | ||||
| 											"weight": 100, | ||||
| 											"max_conns": 0, | ||||
| 											"max_fails": 0, | ||||
| 											"fail_timeout": 0, | ||||
| 											"backup": false | ||||
| 										}, | ||||
| 										{ | ||||
| 											"id": 2, | ||||
| 											"created_at": 1672786009000, | ||||
| 											"updated_at": 1672786009000, | ||||
| 											"upstream_id": 1, | ||||
| 											"server": "api2.localhost:1234", | ||||
| 											"weight": 50, | ||||
| 											"max_conns": 0, | ||||
| 											"max_fails": 0, | ||||
| 											"fail_timeout": 0, | ||||
| 											"backup": true | ||||
| 										} | ||||
| 									] | ||||
| 								} | ||||
| 							} | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @@ -0,0 +1,43 @@ | ||||
| { | ||||
| 	"operationId": "getUpstreamNginxConfig", | ||||
| 	"summary": "Get a Upstream Nginx Config object by ID", | ||||
| 	"tags": ["Upstreams"], | ||||
| 	"parameters": [ | ||||
| 		{ | ||||
| 			"in": "path", | ||||
| 			"name": "upstreamID", | ||||
| 			"schema": { | ||||
| 				"type": "integer", | ||||
| 				"minimum": 1 | ||||
| 			}, | ||||
| 			"required": true, | ||||
| 			"description": "ID of the Upstream", | ||||
| 			"example": 1 | ||||
| 		} | ||||
| 	], | ||||
| 	"responses": { | ||||
| 		"200": { | ||||
| 			"description": "200 response", | ||||
| 			"content": { | ||||
| 				"application/json": { | ||||
| 					"schema": { | ||||
| 						"type": "object", | ||||
| 						"required": ["result"], | ||||
| 						"properties": { | ||||
| 							"result": { | ||||
| 								"type": "string" | ||||
| 							} | ||||
| 						} | ||||
| 					}, | ||||
| 					"examples": { | ||||
| 						"default": { | ||||
| 							"value": { | ||||
| 								"result": "# ------------------------------------------------------------\n# Upstream 1: API servers\n# ------------------------------------------------------------\nupstream npm_upstream_1 {\nserver 192.168.0.10:80 weight=100 ;\n  server 192.168.0.11:80 weight=50 ;\n}\n" | ||||
| 							} | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										94
									
								
								backend/embed/api_docs/paths/upstreams/upstreamID/put.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										94
									
								
								backend/embed/api_docs/paths/upstreams/upstreamID/put.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,94 @@ | ||||
| { | ||||
| 	"operationId": "updateUpstream", | ||||
| 	"summary": "Update an existing Upstream", | ||||
| 	"tags": ["Upstreams"], | ||||
| 	"parameters": [ | ||||
| 		{ | ||||
| 			"in": "path", | ||||
| 			"name": "upstreamID", | ||||
| 			"schema": { | ||||
| 				"type": "integer", | ||||
| 				"minimum": 1 | ||||
| 			}, | ||||
| 			"required": true, | ||||
| 			"description": "ID of the Upstream", | ||||
| 			"example": 1 | ||||
| 		} | ||||
| 	], | ||||
| 	"requestBody": { | ||||
| 		"description": "Upstream details to update", | ||||
| 		"required": true, | ||||
| 		"content": { | ||||
| 			"application/json": { | ||||
| 				"schema": "{{schema.UpdateUpstream}}" | ||||
| 			} | ||||
| 		} | ||||
| 	}, | ||||
| 	"responses": { | ||||
| 		"200": { | ||||
| 			"description": "200 response", | ||||
| 			"content": { | ||||
| 				"application/json": { | ||||
| 					"schema": { | ||||
| 						"type": "object", | ||||
| 						"required": ["result"], | ||||
| 						"properties": { | ||||
| 							"result": { | ||||
| 								"$ref": "#/components/schemas/UpstreamObject" | ||||
| 							} | ||||
| 						} | ||||
| 					}, | ||||
| 					"examples": { | ||||
| 						"default": { | ||||
| 							"value": { | ||||
| 								"result": { | ||||
| 									"id": 1, | ||||
| 									"created_at": 1673234177000, | ||||
| 									"updated_at": 1673244559000, | ||||
| 									"user_id": 2, | ||||
| 									"name": "API servers 2", | ||||
| 									"nginx_template_id": 5, | ||||
| 									"ip_hash": false, | ||||
| 									"ntlm": false, | ||||
| 									"keepalive": 0, | ||||
| 									"keepalive_requests": 0, | ||||
| 									"keepalive_time": "", | ||||
| 									"keepalive_timeout": "", | ||||
| 									"advanced_config": "", | ||||
| 									"status": "ready", | ||||
| 									"error_message": "", | ||||
| 									"servers": [ | ||||
| 										{ | ||||
| 											"id": 1, | ||||
| 											"created_at": 1673234177000, | ||||
| 											"updated_at": 1673244559000, | ||||
| 											"upstream_id": 1, | ||||
| 											"server": "192.168.0.10:80", | ||||
| 											"weight": 100, | ||||
| 											"max_conns": 0, | ||||
| 											"max_fails": 0, | ||||
| 											"fail_timeout": 0, | ||||
| 											"backup": false | ||||
| 										}, | ||||
| 										{ | ||||
| 											"id": 2, | ||||
| 											"created_at": 1673234177000, | ||||
| 											"updated_at": 1673244559000, | ||||
| 											"upstream_id": 1, | ||||
| 											"server": "192.168.0.11:80", | ||||
| 											"weight": 50, | ||||
| 											"max_conns": 0, | ||||
| 											"max_fails": 0, | ||||
| 											"fail_timeout": 0, | ||||
| 											"backup": false | ||||
| 										} | ||||
| 									] | ||||
| 								} | ||||
| 							} | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										111
									
								
								backend/embed/api_docs/paths/users/get.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										111
									
								
								backend/embed/api_docs/paths/users/get.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,111 @@ | ||||
| { | ||||
| 	"operationId": "getUsers", | ||||
| 	"summary": "Get a list of users", | ||||
| 	"tags": ["Users"], | ||||
| 	"parameters": [ | ||||
| 		{ | ||||
| 			"in": "query", | ||||
| 			"name": "offset", | ||||
| 			"schema": { | ||||
| 				"type": "number" | ||||
| 			}, | ||||
| 			"description": "The pagination row offset, default 0", | ||||
| 			"example": 0 | ||||
| 		}, | ||||
| 		{ | ||||
| 			"in": "query", | ||||
| 			"name": "limit", | ||||
| 			"schema": { | ||||
| 				"type": "number" | ||||
| 			}, | ||||
| 			"description": "The pagination row limit, default 10", | ||||
| 			"example": 10 | ||||
| 		}, | ||||
| 		{ | ||||
| 			"in": "query", | ||||
| 			"name": "sort", | ||||
| 			"schema": { | ||||
| 				"type": "string" | ||||
| 			}, | ||||
| 			"description": "The sorting of the list", | ||||
| 			"example": "name,email.asc" | ||||
| 		} | ||||
| 	], | ||||
| 	"responses": { | ||||
| 		"200": { | ||||
| 			"description": "200 response", | ||||
| 			"content": { | ||||
| 				"application/json": { | ||||
| 					"schema": { | ||||
| 						"type": "object", | ||||
| 						"required": ["result"], | ||||
| 						"properties": { | ||||
| 							"result": { | ||||
| 								"$ref": "#/components/schemas/UserList" | ||||
| 							} | ||||
| 						} | ||||
| 					}, | ||||
| 					"examples": { | ||||
| 						"default": { | ||||
| 							"value": { | ||||
| 								"result": { | ||||
| 									"total": 3, | ||||
| 									"offset": 0, | ||||
| 									"limit": 100, | ||||
| 									"sort": [ | ||||
| 										{ | ||||
| 											"field": "name", | ||||
| 											"direction": "ASC" | ||||
| 										}, | ||||
| 										{ | ||||
| 											"field": "email", | ||||
| 											"direction": "ASC" | ||||
| 										} | ||||
| 									], | ||||
| 									"items": [ | ||||
| 										{ | ||||
| 											"id": 1, | ||||
| 											"name": "Jamie Curnow", | ||||
| 											"email": "jc@jc21.com", | ||||
| 											"created_at": 1578010090000, | ||||
| 											"updated_at": 1578010095000, | ||||
| 											"gravatar_url": "https://www.gravatar.com/avatar/6193176330f8d38747f038c170ddb193?d=mm&r=pg&s=128", | ||||
| 											"is_disabled": false, | ||||
| 											"capabilities": ["full-admin"] | ||||
| 										}, | ||||
| 										{ | ||||
| 											"id": 2, | ||||
| 											"name": "John Doe", | ||||
| 											"email": "johdoe@example.com", | ||||
| 											"created_at": 1578010100000, | ||||
| 											"updated_at": 1578010105000, | ||||
| 											"gravatar_url": "https://www.gravatar.com/avatar/6193176330f8d38747f038c170ddb193?d=mm&r=pg&s=128", | ||||
| 											"is_disabled": false, | ||||
| 											"capabilities": [ | ||||
| 												"hosts.view", | ||||
| 												"hosts.manage" | ||||
| 											] | ||||
| 										}, | ||||
| 										{ | ||||
| 											"id": 3, | ||||
| 											"name": "Jane Doe", | ||||
| 											"email": "janedoe@example.com", | ||||
| 											"created_at": 1578010110000, | ||||
| 											"updated_at": 1578010115000, | ||||
| 											"gravatar_url": "https://www.gravatar.com/avatar/6193176330f8d38747f038c170ddb193?d=mm&r=pg&s=128", | ||||
| 											"is_disabled": false, | ||||
| 											"capabilities": [ | ||||
| 												"hosts.view", | ||||
| 												"hosts.manage" | ||||
| 											] | ||||
| 										} | ||||
| 									] | ||||
| 								} | ||||
| 							} | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										81
									
								
								backend/embed/api_docs/paths/users/post.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										81
									
								
								backend/embed/api_docs/paths/users/post.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,81 @@ | ||||
| { | ||||
| 	"operationId": "createUser", | ||||
| 	"summary": "Create a new User", | ||||
| 	"tags": ["Users"], | ||||
| 	"requestBody": { | ||||
| 		"description": "User to Create", | ||||
| 		"required": true, | ||||
| 		"content": { | ||||
| 			"application/json": { | ||||
| 				"schema": "{{schema.CreateUser}}" | ||||
| 			} | ||||
| 		} | ||||
| 	}, | ||||
| 	"responses": { | ||||
| 		"201": { | ||||
| 			"description": "201 response", | ||||
| 			"content": { | ||||
| 				"application/json": { | ||||
| 					"schema": { | ||||
| 						"type": "object", | ||||
| 						"required": ["result"], | ||||
| 						"properties": { | ||||
| 							"result": { | ||||
| 								"$ref": "#/components/schemas/UserObject" | ||||
| 							} | ||||
| 						} | ||||
| 					}, | ||||
| 					"examples": { | ||||
| 						"default": { | ||||
| 							"value": { | ||||
| 								"result": { | ||||
| 									"id": 1, | ||||
| 									"name": "Jamie Curnow", | ||||
| 									"email": "jc@jc21.com", | ||||
| 									"created_at": 1578010100000, | ||||
| 									"updated_at": 1578010100000, | ||||
| 									"gravatar_url": "https://www.gravatar.com/avatar/6193176330f8d38747f038c170ddb193?d=mm&r=pg&s=128", | ||||
| 									"is_disabled": false, | ||||
| 									"auth": { | ||||
| 										"$ref": "#/components/schemas/UserAuthObject" | ||||
| 									}, | ||||
| 									"capabilities": ["full-admin"] | ||||
| 								} | ||||
| 							} | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		}, | ||||
| 		"400": { | ||||
| 			"description": "400 response", | ||||
| 			"content": { | ||||
| 				"application/json": { | ||||
| 					"schema": { | ||||
| 						"type": "object", | ||||
| 						"required": ["error"], | ||||
| 						"properties": { | ||||
| 							"result": { | ||||
| 								"type": "object", | ||||
| 								"nullable": true | ||||
| 							}, | ||||
| 							"error": { | ||||
| 								"$ref": "#/components/schemas/ErrorObject" | ||||
| 							} | ||||
| 						} | ||||
| 					}, | ||||
| 					"examples": { | ||||
| 						"default": { | ||||
| 							"value": { | ||||
| 								"error": { | ||||
| 									"code": 400, | ||||
| 									"message": "An user already exists with this email address" | ||||
| 								} | ||||
| 							} | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										66
									
								
								backend/embed/api_docs/paths/users/userID/auth/post.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										66
									
								
								backend/embed/api_docs/paths/users/userID/auth/post.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,66 @@ | ||||
| { | ||||
| 	"operationId": "setPassword", | ||||
| 	"summary": "Set a User's password", | ||||
| 	"tags": ["Users"], | ||||
| 	"parameters": [ | ||||
| 		{ | ||||
| 			"in": "path", | ||||
| 			"name": "userID", | ||||
| 			"schema": { | ||||
| 				"oneOf": [ | ||||
| 					{ | ||||
| 						"type": "integer", | ||||
| 						"minimum": 1 | ||||
| 					}, | ||||
| 					{ | ||||
| 						"type": "string", | ||||
| 						"pattern": "^me$" | ||||
| 					} | ||||
| 				] | ||||
| 			}, | ||||
| 			"required": true, | ||||
| 			"description": "Numeric ID of the user or 'me' to set yourself", | ||||
| 			"example": 1 | ||||
| 		} | ||||
| 	], | ||||
| 	"requestBody": { | ||||
| 		"description": "Credentials to set", | ||||
| 		"required": true, | ||||
| 		"content": { | ||||
| 			"application/json": { | ||||
| 				"schema": "{{schema.SetAuth}}" | ||||
| 			} | ||||
| 		} | ||||
| 	}, | ||||
| 	"responses": { | ||||
| 		"200": { | ||||
| 			"description": "200 response", | ||||
| 			"content": { | ||||
| 				"application/json": { | ||||
| 					"schema": { | ||||
| 						"type": "object", | ||||
| 						"required": ["result"], | ||||
| 						"properties": { | ||||
| 							"result": { | ||||
| 								"$ref": "#/components/schemas/UserAuthObject" | ||||
| 							} | ||||
| 						} | ||||
| 					}, | ||||
| 					"examples": { | ||||
| 						"default": { | ||||
| 							"value": { | ||||
| 								"result": { | ||||
| 									"id": 2, | ||||
| 									"created_at": 1648422222000, | ||||
| 									"updated_at": 1648423979000, | ||||
| 									"user_id": 3, | ||||
| 									"type": "password" | ||||
| 								} | ||||
| 							} | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										60
									
								
								backend/embed/api_docs/paths/users/userID/delete.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										60
									
								
								backend/embed/api_docs/paths/users/userID/delete.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,60 @@ | ||||
| { | ||||
| 	"operationId": "deleteUser", | ||||
| 	"summary": "Delete a User", | ||||
| 	"tags": [ | ||||
| 		"Users" | ||||
| 	], | ||||
| 	"parameters": [ | ||||
| 		{ | ||||
| 			"in": "path", | ||||
| 			"name": "userID", | ||||
| 			"schema": { | ||||
| 				"type": "integer", | ||||
| 				"minimum": 1 | ||||
| 			}, | ||||
| 			"required": true, | ||||
| 			"description": "Numeric ID of the user", | ||||
| 			"example": 1 | ||||
| 		} | ||||
| 	], | ||||
| 	"responses": { | ||||
| 		"200": { | ||||
| 			"description": "200 response", | ||||
| 			"content": { | ||||
| 				"application/json": { | ||||
| 					"schema": { | ||||
| 						"$ref": "#/components/schemas/DeletedItemResponse" | ||||
| 					}, | ||||
| 					"examples": { | ||||
| 						"default": { | ||||
| 							"value": { | ||||
| 								"result": true | ||||
| 							} | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		}, | ||||
| 		"400": { | ||||
| 			"description": "400 response", | ||||
| 			"content": { | ||||
| 				"application/json": { | ||||
| 					"schema": { | ||||
| 						"$ref": "#/components/schemas/DeletedItemResponse" | ||||
| 					}, | ||||
| 					"examples": { | ||||
| 						"default": { | ||||
| 							"value": { | ||||
| 								"result": null, | ||||
| 								"error": { | ||||
| 									"code": 400, | ||||
| 									"message": "You cannot delete yourself!" | ||||
| 								} | ||||
| 							} | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user