mirror of
				https://github.com/NginxProxyManager/nginx-proxy-manager.git
				synced 2025-10-31 07:43:33 +00:00 
			
		
		
		
	Compare commits
	
		
			457 Commits
		
	
	
		
			2145df0dfb
			...
			openidc
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | fdb22e467b | ||
|  | 694d8a0f21 | ||
|  | 63d06da8a8 | ||
|  | b5a0d74654 | ||
|  | 99cce7e2b0 | ||
|  | 120d50e5c0 | ||
|  | 5454fd61b3 | ||
|  | b33012705b | ||
|  | e948b60194 | ||
|  | 7913c9a07d | ||
|  | d1c23b6286 | ||
|  | c7e2946dbf | ||
|  | 8936402229 | ||
|  | 001c77e686 | ||
|  | 5578e825b1 | ||
|  | c93656a7a1 | ||
|  | 50aeae234f | ||
|  | a5c06c1a34 | ||
|  | 51414ced3a | ||
|  | 5e35e538af | ||
|  | 13fec42d1f | ||
|  | b4560d7dde | ||
|  | 6f9eed8a61 | ||
|  | d66e4e03e6 | ||
|  | 1d19c29bb0 | ||
|  | e20a11de4a | ||
|  | d3a654b546 | ||
|  | bed387ebd4 | ||
|  | 6ac9a82279 | ||
|  | ef23e796ec | ||
|  | 3754a569ba | ||
|  | b383f46656 | ||
|  | 3ce477d350 | ||
|  | 516b4d991c | ||
|  | 12d77e3ab6 | ||
|  | 8d80af3a26 | ||
|  | 1f45e6a5e9 | ||
|  | dcb9628c36 | ||
|  | 029b184398 | ||
|  | 2422587530 | ||
|  | 4ee940d3dc | ||
|  | 47dddc548b | ||
|  | 256a667e2c | ||
|  | 79cd0c5294 | ||
|  | 09a03edfd7 | ||
|  | 35f0fe745d | ||
|  | f1e433714e | ||
|  | 035eaed0a4 | ||
|  | 4b100a384d | ||
|  | c5c5fa0a5a | ||
|  | 280bac8b43 | ||
|  | 02aefa50cd | ||
|  | 4d91cfc397 | ||
|  | 79a453f2fe | ||
|  | c62c09569d | ||
|  | 09bcf4010c | ||
|  | 6aeade6c98 | ||
|  | 8655b7d2db | ||
|  | 2d929dffa8 | ||
|  | 52eaa042d8 | ||
|  | b35aa50b88 | ||
|  | c575a706b5 | ||
|  | 587b97c2d3 | ||
|  | 317003beda | ||
|  | 5a761236c5 | ||
|  | b135527347 | ||
|  | abca9cc89c | ||
|  | 6721923601 | ||
|  | a88f77c1a5 | ||
|  | a5b21d0306 | ||
|  | 8eab8d71f2 | ||
|  | d06572bb5f | ||
|  | d40f9e06fc | ||
|  | 69ec017a53 | ||
|  | fa67f257ef | ||
|  | 0dcd648c9d | ||
|  | c989a282e3 | ||
|  | 5aff969c04 | ||
|  | bfbf7519ec | ||
|  | bf36c7966a | ||
|  | 63cd9ba08f | ||
|  | e3d4882c3d | ||
|  | 3e1b73143e | ||
|  | 10ece3548d | ||
|  | 0503a6af75 | ||
|  | 55d765e785 | ||
|  | 1fb9a75a33 | ||
|  | 9c2e838d61 | ||
|  | c55e47aacf | ||
|  | 40d81d6e44 | ||
|  | 1c84eaac02 | ||
|  | 577954ef8c | ||
|  | f0c75641d8 | ||
|  | e42e2acf12 | ||
|  | eaa11fe460 | ||
|  | 5b53825ccb | ||
|  | a94660120f | ||
|  | 39f4836485 | ||
|  | aec30207da | ||
|  | 209c1b3334 | ||
|  | 58138fbac4 | ||
|  | da820db4e1 | ||
|  | 47b868bfc6 | ||
|  | 89a405f60c | ||
|  | 0353051436 | ||
|  | a3630a6286 | ||
|  | 10d9760242 | ||
|  | c722eb1cea | ||
|  | 0472abacd2 | ||
|  | a2e85ceed8 | ||
|  | cddd6fb985 | ||
|  | db23c9a52f | ||
|  | 8646cb5a19 | ||
|  | fe0c04610f | ||
|  | 9f16dae2ff | ||
|  | 00264bcfb2 | ||
|  | 834fb1a361 | ||
|  | 1be87f48c1 | ||
|  | 9c54d1b718 | ||
|  | f7d1c490b3 | ||
|  | fe4bd9fed6 | ||
|  | 58ef9a688e | ||
|  | d19ebf5925 | ||
|  | 96fc6a20bb | ||
|  | e69684919c | ||
|  | be39253a6f | ||
|  | 30772a48bd | ||
|  | 33c867895c | ||
|  | a7fe687bae | ||
|  | 4028120f55 | ||
|  | d1119ec63f | ||
|  | 4c906283df | ||
|  | 8ec0c76f51 | ||
|  | c70f65d349 | ||
|  | 883a272b0a | ||
|  | 6aee2bbcba | ||
|  | 025fc9776b | ||
|  | b699f05f47 | ||
|  | f7c87f63bd | ||
|  | e4ef095254 | ||
|  | 09d5e2c94f | ||
|  | 459b7a2223 | ||
|  | 9c813bcce3 | ||
|  | b8596ac01c | ||
|  | 082c4e1008 | ||
|  | 2273eae6ee | ||
|  | 997e9d431b | ||
|  | b3564b6d4b | ||
|  | 4e27cdabc4 | ||
|  | 965873adc5 | ||
|  | 5de95a8c90 | ||
|  | fa557d8159 | ||
|  | bc8211a6a9 | ||
|  | 1c498f84ad | ||
|  | ea6e9757e3 | ||
|  | 1308ae42c2 | ||
|  | 7be548575b | ||
|  | c6aab8d4e6 | ||
|  | da55e93183 | ||
|  | af475ab5d4 | ||
|  | 7d85463dae | ||
|  | 13d4f98fdb | ||
|  | 388fff84f2 | ||
|  | 49a765516c | ||
|  | 27bc8c4e33 | ||
|  | 881a067aff | ||
|  | 1975e4a151 | ||
|  | 4704bd6a38 | ||
|  | ca56e0483f | ||
|  | 3b8cb86d72 | ||
|  | 5165de4a91 | ||
|  | 1ab3575c68 | ||
|  | ccf9cce825 | ||
|  | 3ad2188f78 | ||
|  | 33dbffb974 | ||
|  | 289e438c59 | ||
|  | e08a4d4490 | ||
|  | d1d1819677 | ||
|  | 4e0768d56c | ||
|  | 3666364418 | ||
|  | 9052502a17 | ||
|  | b608d3392d | ||
|  | edb81ecce0 | ||
|  | e24181936f | ||
|  | 940d06cac9 | ||
|  | 134902d127 | ||
|  | 2df4620d05 | ||
|  | f41b1069ae | ||
|  | 004a93fbc3 | ||
|  | 2d9f04edcd | ||
|  | 53dbe258a5 | ||
|  | e4ba22f0f8 | ||
|  | 3197de41de | ||
|  | 0f7be7987b | ||
|  | 853c48dff6 | ||
|  | 410c3484ab | ||
|  | 44e9f377f9 | ||
|  | 0f3b76f607 | ||
|  | f426e64569 | ||
|  | 4867db078c | ||
|  | 6b565e628f | ||
|  | 881d70502b | ||
|  | 62e4edddf0 | ||
|  | 4b9c02cc0c | ||
|  | 5af834e40b | ||
|  | 6f8db95249 | ||
|  | fe93cb3474 | ||
|  | fa851b61da | ||
|  | 3333a32612 | ||
|  | 9a79fce498 | ||
|  | b1180f5077 | ||
|  | 5454352fe5 | ||
|  | aee93a2f6f | ||
|  | f38cb5b500 | ||
|  | f1b7156c89 | ||
|  | 98465cf1b0 | ||
|  | 137e865b66 | ||
|  | e740fb4064 | ||
|  | f91f0ee8db | ||
|  | 1c9f751512 | ||
|  | a602bdd514 | ||
|  | f7b2be68cc | ||
|  | ab4586fc6b | ||
|  | a984a68065 | ||
|  | 52875fca6e | ||
|  | 63b50fcd95 | ||
|  | 5ab4aea03f | ||
|  | d73135378e | ||
|  | e19d685cb6 | ||
|  | c8caaa56d9 | ||
|  | 11a98f4c12 | ||
|  | 4a85d4ac4e | ||
|  | 3138ba46ce | ||
|  | cdd0b2e6d3 | ||
|  | f458730d87 | ||
|  | d20873dcbb | ||
|  | d1e9407e4d | ||
|  | 63ee69f432 | ||
|  | f39e527680 | ||
|  | 2dd4434ceb | ||
|  | 81054631f9 | ||
|  | 53d61bd626 | ||
|  | 847e879b3f | ||
|  | 4c59400731 | ||
|  | 824c837a38 | ||
|  | 2a06384a4a | ||
|  | 05307aa253 | ||
|  | 3d2406ac3d | ||
|  | 0127dc7f03 | ||
|  | 4349d42636 | ||
|  | 4b6f9d9419 | ||
|  | c3f019c911 | ||
|  | ecf0290203 | ||
|  | 4f41fe0c95 | ||
|  | c3735fdbbb | ||
|  | c432c34fb3 | ||
|  | a1245bc161 | ||
|  | db4ab1d548 | ||
|  | 86ddd9c83c | ||
|  | 67208e43cc | ||
|  | ddf80302c6 | ||
|  | 5f2576946d | ||
|  | 9fe07fa6c3 | ||
|  | d9b9af543e | ||
|  | eb2e2e0478 | ||
|  | 9225d5d442 | ||
|  | 308a7149ed | ||
|  | 8a4a7d0caf | ||
|  | 5d03ede100 | ||
|  | 4a86bb42cc | ||
|  | dad8561ea1 | ||
|  | 56a92e5c0e | ||
|  | 9d672f5813 | ||
|  | d5ed70dbb6 | ||
|  | c197e66d62 | ||
|  | 91cf3c8873 | ||
|  | 7f5e0414ac | ||
|  | d179887c15 | ||
|  | 35abb4d7ae | ||
|  | 61b290e220 | ||
|  | e1bcef6e5c | ||
|  | 81f51f9e2d | ||
|  | 661953db25 | ||
|  | 065c2dac42 | ||
|  | 2926844cbe | ||
|  | c1960f3793 | ||
|  | 11a29a8b67 | ||
|  | c40e48e678 | ||
|  | 124cb18e17 | ||
|  | 5ac9dc0758 | ||
|  | 9a799d51ce | ||
|  | 77eb618758 | ||
|  | 79fedfcea4 | ||
|  | 8fdb8ac853 | ||
|  | 4fdc80be01 | ||
|  | f8e6c8d018 | ||
|  | c3469de61b | ||
|  | ea61b15a40 | ||
|  | 60175e6d8c | ||
|  | 2a07445005 | ||
|  | dad3e1da7c | ||
|  | 82d9452001 | ||
|  | 095bc8f676 | ||
|  | 8c15340b83 | ||
|  | a13f7c3792 | ||
|  | 6748985669 | ||
|  | e2957f070b | ||
|  | fccbde1371 | ||
|  | fec36834f7 | ||
|  | 00aeef75b6 | ||
|  | 5b7682f13c | ||
|  | b30fcb50c8 | ||
|  | 100c56ad10 | ||
|  | 44bebf366a | ||
|  | 6a28701242 | ||
|  | 09d1d3744c | ||
|  | 84e0b30f8d | ||
|  | 546ce8d4bc | ||
|  | 9b40bb288d | ||
|  | c812b674b6 | ||
|  | 86e63197f6 | ||
|  | c371b2e953 | ||
|  | 2142e25029 | ||
|  | 30076a0e66 | ||
|  | 42bd39163a | ||
|  | cc4891d9ec | ||
|  | 40c26839f5 | ||
|  | 2ff66ee238 | ||
|  | 9d60b4a756 | ||
|  | d2becc0681 | ||
|  | 579c32a724 | ||
|  | b08ef17894 | ||
|  | 589ab8757e | ||
|  | abdaac8584 | ||
|  | d5c950a231 | ||
|  | d9a1701927 | ||
|  | 6e500c35dc | ||
|  | a06e96061f | ||
|  | f0513d34f9 | ||
|  | 09349efbbe | ||
|  | 06453e9668 | ||
|  | b1e904df84 | ||
|  | 5f435b6325 | ||
|  | 7b48488c29 | ||
|  | 3f6ad0d807 | ||
|  | edba369ae8 | ||
|  | b77d916bdd | ||
|  | 2706454635 | ||
|  | 32a3bb1d6d | ||
|  | 95665ca378 | ||
|  | 09d6cf7c48 | ||
|  | 2addc48a9b | ||
|  | ebf07a7912 | ||
|  | abe6493244 | ||
|  | 9f192ab275 | ||
|  | 52e013d289 | ||
|  | 331da3841e | ||
|  | e227f4177b | ||
|  | 88fa7cdfff | ||
|  | f3b3072711 | ||
|  | cf6cc7dcc5 | ||
|  | 448c8a2dd5 | ||
|  | 634cfe13f1 | ||
|  | 7597515c20 | ||
|  | 93f57aece5 | ||
|  | ef6da1bbe1 | ||
|  | 4ad9e68886 | ||
|  | 9b35e7c188 | ||
|  | 2aa6e55d6b | ||
|  | 1ac28410ff | ||
|  | b0fd976b97 | ||
|  | 7fe7e94fbd | ||
|  | 8864960eb4 | ||
|  | 23326895b2 | ||
|  | d2f707b76d | ||
|  | a7f0c3b730 | ||
|  | a9e84f1750 | ||
|  | 7ca3a9e7a6 | ||
|  | c80d099193 | ||
|  | 35aba13122 | ||
|  | b69e493c54 | ||
|  | 99d73a2da8 | ||
|  | 3c23aa935e | ||
|  | 8dee139810 | ||
|  | 6349cb6094 | ||
|  | 452838b04a | ||
|  | fd30cfe98b | ||
|  | 6f281fef42 | ||
|  | 5920b0cf5e | ||
|  | 41bbfcf165 | ||
|  | 80a93e17fa | ||
|  | 4a1eebc54b | ||
|  | 264ba71462 | ||
|  | e229fa89f8 | ||
|  | d3b72ae07d | ||
|  | b62b6b5112 | ||
|  | c44f8c6155 | ||
|  | 0dfa3d9ca3 | ||
|  | 8c7c84906b | ||
|  | 662143cf21 | ||
|  | c60fc7926e | ||
|  | cfbdc6c340 | ||
|  | 2f6d8257ec | ||
|  | b9a6b5d4f5 | ||
|  | 32f77dbcee | ||
|  | 052cb8f12d | ||
|  | 03b544023b | ||
|  | 5070499cfd | ||
|  | e77b13d36e | ||
|  | 4bb237d7c2 | ||
|  | aa5a7faa94 | ||
|  | 837f4dcbd4 | ||
|  | d73a246b66 | ||
|  | f85e82973d | ||
|  | 84afec567c | ||
|  | e1525e5d56 | ||
|  | d2688cf08c | ||
|  | 7372319568 | ||
|  | 60ffec5c64 | ||
|  | 23c88f6955 | ||
|  | dd14207b63 | ||
|  | 103adfbb57 | ||
|  | b673ebe2ca | ||
|  | 0e0c3df0cd | ||
|  | 8dbd482e08 | ||
|  | ab5f7c0f26 | ||
|  | 191f493eb9 | ||
|  | d1f4640a9c | ||
|  | 3d97f4578d | ||
|  | fb0ef08fd8 | ||
|  | 0de78205b5 | ||
|  | e0821bd927 | ||
|  | e5966b54a8 | ||
|  | d2f6b09901 | ||
|  | 5c8aa8517b | ||
|  | 1e5916db28 | ||
|  | a3ae6956e2 | ||
|  | 518b84b38b | ||
|  | 932dc4bf02 | ||
|  | bdc3a555b6 | ||
|  | d4dcb61ee6 | ||
|  | cce73beb2d | ||
|  | 063ac4619f | ||
|  | edf369a3d4 | ||
|  | 4251157ffa | ||
|  | 9866eec21c | ||
|  | a91dcb144d | ||
|  | e7f7be2a2b | ||
|  | 076d89b5b5 | ||
|  | 8539930f89 | ||
|  | 87d9babbd3 | ||
|  | 9f2d3a1737 | ||
|  | daf399163c | ||
|  | cdf702e545 | ||
|  | 5811345050 | ||
|  | 53792a5cf7 | ||
|  | 8e10b7da37 | 
| @@ -1,8 +0,0 @@ | ||||
| # Ignore everything | ||||
| * | ||||
|  | ||||
| # Only allow the following for docker build: | ||||
| !backend/ | ||||
| !docker/ | ||||
| !scripts/ | ||||
| !test/ | ||||
							
								
								
									
										21
									
								
								.github/workflows/stale.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								.github/workflows/stale.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,21 @@ | ||||
| name: 'Close stale issues and PRs' | ||||
| on: | ||||
|   schedule: | ||||
|     - cron: '30 1 * * *' | ||||
|   workflow_dispatch: | ||||
|  | ||||
| jobs: | ||||
|   stale: | ||||
|     runs-on: ubuntu-latest | ||||
|     steps: | ||||
|       - uses: actions/stale@v9 | ||||
|         with: | ||||
|           stale-issue-label: 'stale' | ||||
|           stale-pr-label: 'stale' | ||||
|           stale-issue-message: 'Issue is now considered stale. If you want to keep it open, please comment :+1:' | ||||
|           stale-pr-message: 'PR is now considered stale. If you want to keep it open, please comment :+1:' | ||||
|           close-issue-message: 'Issue was closed due to inactivity.' | ||||
|           close-pr-message: 'PR was closed due to inactivity.' | ||||
|           days-before-stale: 182 | ||||
|           days-before-close: 365 | ||||
|           operations-per-run: 50 | ||||
							
								
								
									
										28
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										28
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @@ -1,29 +1,9 @@ | ||||
| git.idea | ||||
| .env | ||||
| .DS_Store | ||||
| .idea | ||||
| ._* | ||||
| *.code-workspace | ||||
| vendor | ||||
| bin/* | ||||
| backend/config.json | ||||
| backend/embed/assets | ||||
| backend/.task | ||||
| backend/coverage.out | ||||
| backend/coverage.html | ||||
| .vscode | ||||
| certbot-help.txt | ||||
| 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 | ||||
| backend/embed/acme.sh | ||||
| docker/dev/resolv.conf | ||||
| docker/dev/dnsrouter-config.json.tmp | ||||
| thunder-tests | ||||
| test/cypress/videos | ||||
| docker/dev/resolv.conf | ||||
|   | ||||
							
								
								
									
										151
									
								
								Jenkinsfile
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										151
									
								
								Jenkinsfile
									
									
									
									
										vendored
									
									
								
							| @@ -1,33 +1,22 @@ | ||||
| import groovy.transform.Field | ||||
|  | ||||
| @Field | ||||
| def shOutput = "" | ||||
| 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 { | ||||
| 	agent { | ||||
| 		label 'docker-multiarch' | ||||
| 	} | ||||
| 	options { | ||||
| 		buildDiscarder(logRotator(numToKeepStr: '10')) | ||||
| 		buildDiscarder(logRotator(numToKeepStr: '5')) | ||||
| 		disableConcurrentBuilds() | ||||
| 		ansiColor('xterm') | ||||
| 	} | ||||
| 	environment { | ||||
| 		DOCKER_ORG                 = 'jc21' | ||||
| 		IMAGE                      = 'nginx-proxy-manager' | ||||
| 		BUILD_VERSION              = getVersion() | ||||
| 		BUILD_COMMIT               = getCommit() | ||||
| 		MAJOR_VERSION              = '3' | ||||
| 		MAJOR_VERSION              = '2' | ||||
| 		BRANCH_LOWER               = "${BRANCH_NAME.toLowerCase().replaceAll('\\\\', '-').replaceAll('/', '-').replaceAll('\\.', '-')}" | ||||
| 		BUILDX_NAME                = "npm_${BRANCH_LOWER}_${BUILD_NUMBER}" | ||||
| 		COMPOSE_INTERACTIVE_NO_CLI = 1 | ||||
| @@ -41,9 +30,7 @@ pipeline { | ||||
| 					} | ||||
| 					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' | ||||
| 							buildxPushTags = "-t docker.io/jc21/${IMAGE}:${BUILD_VERSION} -t docker.io/jc21/${IMAGE}:${MAJOR_VERSION} -t docker.io/jc21/${IMAGE}:latest" | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
| @@ -56,44 +43,44 @@ pipeline { | ||||
| 					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" | ||||
| 							buildxPushTags = "-t docker.io/jc21/${IMAGE}:github-${BRANCH_LOWER}" | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
| 				stage('Versions') { | ||||
| 					steps { | ||||
| 						sh 'cat frontend/package.json | jq --arg BUILD_VERSION "${BUILD_VERSION}" \'.version = $BUILD_VERSION\' | sponge frontend/package.json' | ||||
| 						sh 'echo -e "\\E[1;36mFrontend Version is:\\E[1;33m $(cat frontend/package.json | jq -r .version)\\E[0m"' | ||||
| 						sh 'cat backend/package.json | jq --arg BUILD_VERSION "${BUILD_VERSION}" \'.version = $BUILD_VERSION\' | sponge backend/package.json' | ||||
| 						sh 'echo -e "\\E[1;36mBackend Version is:\\E[1;33m  $(cat backend/package.json | jq -r .version)\\E[0m"' | ||||
| 						sh 'sed -i -E "s/(version-)[0-9]+\\.[0-9]+\\.[0-9]+(-green)/\\1${BUILD_VERSION}\\2/" README.md' | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 		stage('Build') { | ||||
| 		stage('Builds') { | ||||
| 			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}" \\ | ||||
| 							. | ||||
| 						''' | ||||
| 						script { | ||||
| 							// Frontend and Backend | ||||
| 							def shStatusCode = sh(label: 'Checking and Building', returnStatus: true, script: ''' | ||||
| 								set -e | ||||
| 								./scripts/ci/frontend-build > ${WORKSPACE}/tmp-sh-build 2>&1 | ||||
| 								./scripts/ci/test-and-build > ${WORKSPACE}/tmp-sh-build 2>&1 | ||||
| 							''') | ||||
| 							shOutput = readFile "${env.WORKSPACE}/tmp-sh-build" | ||||
| 							if (shStatusCode != 0) { | ||||
| 								error "${shOutput}" | ||||
| 							} | ||||
| 						} | ||||
| 					} | ||||
| 					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 | ||||
| 							]) | ||||
| 						always { | ||||
| 							sh 'rm -f ${WORKSPACE}/tmp-sh-build' | ||||
| 						} | ||||
| 						failure { | ||||
| 							npmGithubPrComment("CI Error:\n\n```\n${shOutput}\n```", true) | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
| @@ -110,7 +97,7 @@ pipeline { | ||||
| 		stage('Test Sqlite') { | ||||
| 			environment { | ||||
| 				COMPOSE_PROJECT_NAME = "npm_${BRANCH_LOWER}_${BUILD_NUMBER}_sqlite" | ||||
| 				COMPOSE_FILE         = 'docker/docker-compose.ci.yml' | ||||
| 				COMPOSE_FILE         = 'docker/docker-compose.ci.yml:docker/docker-compose.ci.sqlite.yml' | ||||
| 			} | ||||
| 			when { | ||||
| 				not { | ||||
| @@ -120,8 +107,6 @@ pipeline { | ||||
| 			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 { | ||||
| @@ -165,39 +150,6 @@ pipeline { | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 		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' | ||||
|  | ||||
| 					junit 'test/results/junit/*' | ||||
| 					sh 'docker-compose down --remove-orphans --volumes -t 30 || true' | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 		stage('MultiArch Build') { | ||||
| 			when { | ||||
| 				not { | ||||
| @@ -208,7 +160,6 @@ pipeline { | ||||
| 				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' | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| @@ -217,7 +168,7 @@ pipeline { | ||||
| 				stage('Docs Job') { | ||||
| 					when { | ||||
| 						allOf { | ||||
| 							branch pattern: "^(develop|master|v3)\$", comparator: "REGEXP" | ||||
| 							branch pattern: "^(develop|master)\$", comparator: "REGEXP" | ||||
| 							not { | ||||
| 								equals expected: 'UNSTABLE', actual: currentBuild.result | ||||
| 							} | ||||
| @@ -247,22 +198,32 @@ pipeline { | ||||
| 	} | ||||
| 	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() | ||||
| 			sh 'echo Reverting ownership' | ||||
| 			sh 'docker run --rm -v "$(pwd):/data" jc21/ci-tools chown -R "$(id -u):$(id -g)" /data' | ||||
| 		} | ||||
| 		success { | ||||
| 			juxtapose event: 'success' | ||||
| 			sh 'figlet "SUCCESS"' | ||||
| 		} | ||||
| 		failure { | ||||
| 			archiveArtifacts(artifacts: 'debug/**/*', allowEmptyArchive: true) | ||||
| 			dir(path: 'test') { | ||||
| 				archiveArtifacts allowEmptyArchive: true, artifacts: 'results/**/*', excludes: '**/*.xml' | ||||
| 			} | ||||
| 			archiveArtifacts(artifacts: 'debug/**/*.*', allowEmptyArchive: true) | ||||
| 			juxtapose event: 'failure' | ||||
| 			sh 'figlet "FAILURE"' | ||||
| 		} | ||||
| 		unstable { | ||||
| 			archiveArtifacts(artifacts: 'debug/**/*', allowEmptyArchive: true) | ||||
| 			dir(path: 'test') { | ||||
| 				archiveArtifacts allowEmptyArchive: true, artifacts: 'results/**/*', excludes: '**/*.xml' | ||||
| 			} | ||||
| 			archiveArtifacts(artifacts: 'debug/**/*.*', allowEmptyArchive: true) | ||||
| 			juxtapose event: 'unstable' | ||||
| 			sh 'figlet "UNSTABLE"' | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| 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() | ||||
| } | ||||
|   | ||||
							
								
								
									
										47
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										47
									
								
								README.md
									
									
									
									
									
								
							| @@ -1,7 +1,7 @@ | ||||
| <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"> | ||||
| 	<img src="https://img.shields.io/badge/version-2.11.3-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> | ||||
| @@ -19,7 +19,7 @@ running at home or otherwise, including free SSL, without having to know too muc | ||||
|  | ||||
| ## Project Goal | ||||
|  | ||||
| I created this project to fill a personal need to provide users with a easy way to accomplish reverse | ||||
| I created this project to fill a personal need to provide users with an easy way to accomplish reverse | ||||
| proxying hosts with SSL termination and it had to be so easy that a monkey could do it. This goal hasn't changed. | ||||
| 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. | ||||
| @@ -29,7 +29,7 @@ so that the barrier for entry here is low. | ||||
|  | ||||
| ## Features | ||||
|  | ||||
| - Beautiful and Secure Admin Interface based on [Chakra UI](https://chakra-ui.com/) | ||||
| - Beautiful and Secure Admin Interface based on [Tabler](https://tabler.github.io/) | ||||
| - 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 | ||||
| - Access Lists and basic HTTP Authentication for your hosts | ||||
| @@ -46,8 +46,7 @@ I won't go in to too much detail here but here are the basics for someone new to | ||||
| 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 | ||||
| ## Quick Setup | ||||
|  | ||||
| 1. Install Docker and Docker-Compose | ||||
|  | ||||
| @@ -57,10 +56,9 @@ I won't go in to too much detail here but here are the basics for someone new to | ||||
| 2. Create a docker-compose.yml file similar to this: | ||||
|  | ||||
| ```yml | ||||
| version: '3' | ||||
| services: | ||||
|   app: | ||||
|     image: 'jc21/nginx-proxy-manager:v3' | ||||
|     image: 'docker.io/jc21/nginx-proxy-manager:latest' | ||||
|     restart: unless-stopped | ||||
|     ports: | ||||
|       - '80:80' | ||||
| @@ -68,8 +66,11 @@ services: | ||||
|       - '443:443' | ||||
|     volumes: | ||||
|       - ./data:/data | ||||
|       - ./letsencrypt:/etc/letsencrypt | ||||
| ``` | ||||
|  | ||||
| This is the bare minimum configuration required. See the [documentation](https://nginxproxymanager.com/setup/) for more. | ||||
|  | ||||
| 3. Bring up your stack by running | ||||
|  | ||||
| ```bash | ||||
| @@ -77,25 +78,43 @@ 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. | ||||
| Sometimes this can take a little bit because of the entropy of keys. | ||||
|  | ||||
| [http://127.0.0.1:81](http://127.0.0.1:81) | ||||
|  | ||||
| ## Contributors | ||||
| Default Admin 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. | ||||
|  | ||||
|  | ||||
| ## Contributing | ||||
|  | ||||
| All are welcome to create pull requests for this project, against the `develop` branch. Official releases are created from the `master` branch. | ||||
|  | ||||
| CI is used in this project. All PR's must pass before being considered. After passing, | ||||
| docker builds for PR's are available on dockerhub for manual verifications. | ||||
|  | ||||
| Documentation within the `develop` branch is available for preview at | ||||
| [https://develop.nginxproxymanager.com](https://develop.nginxproxymanager.com) | ||||
|  | ||||
|  | ||||
| ### 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). | ||||
| 3. [Reddit](https://reddit.com/r/nginxproxymanager) | ||||
|   | ||||
| @@ -1,8 +0,0 @@ | ||||
| root = true | ||||
|  | ||||
| [*] | ||||
| indent_style = tab | ||||
| indent_size = 4 | ||||
| charset = utf-8 | ||||
| trim_trailing_whitespace = true | ||||
| insert_final_newline = false | ||||
							
								
								
									
										73
									
								
								backend/.eslintrc.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										73
									
								
								backend/.eslintrc.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,73 @@ | ||||
| { | ||||
| 	"env": { | ||||
| 		"node": true, | ||||
| 		"es6": true | ||||
| 	}, | ||||
| 	"extends": [ | ||||
| 		"eslint:recommended" | ||||
| 	], | ||||
| 	"globals": { | ||||
| 		"Atomics": "readonly", | ||||
| 		"SharedArrayBuffer": "readonly" | ||||
| 	}, | ||||
| 	"parserOptions": { | ||||
| 		"ecmaVersion": 2018, | ||||
| 		"sourceType": "module" | ||||
| 	}, | ||||
| 	"plugins": [ | ||||
| 		"align-assignments" | ||||
| 	], | ||||
| 	"rules": { | ||||
| 		"arrow-parens": [ | ||||
| 			"error", | ||||
| 			"always" | ||||
| 		], | ||||
| 		"indent": [ | ||||
| 			"error", | ||||
| 			"tab" | ||||
| 		], | ||||
| 		"linebreak-style": [ | ||||
| 			"error", | ||||
| 			"unix" | ||||
| 		], | ||||
| 		"quotes": [ | ||||
| 			"error", | ||||
| 			"single" | ||||
| 		], | ||||
| 		"semi": [ | ||||
| 			"error", | ||||
| 			"always" | ||||
| 		], | ||||
| 		"key-spacing": [ | ||||
| 			"error", | ||||
| 			{ | ||||
| 				"align": "value" | ||||
| 			} | ||||
| 		], | ||||
| 		"comma-spacing": [ | ||||
| 			"error", | ||||
| 			{ | ||||
| 				"before": false, | ||||
| 				"after": true | ||||
| 			} | ||||
| 		], | ||||
| 		"func-call-spacing": [ | ||||
| 			"error", | ||||
| 			"never" | ||||
| 		], | ||||
| 		"keyword-spacing": [ | ||||
| 			"error", | ||||
| 			{ | ||||
| 				"before": true | ||||
| 			} | ||||
| 		], | ||||
| 		"no-irregular-whitespace": "error", | ||||
| 		"no-unused-expressions": 0, | ||||
| 		"align-assignments/align-assignments": [ | ||||
| 			2, | ||||
| 			{ | ||||
| 				"requiresOnly": false | ||||
| 			} | ||||
| 		] | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										8
									
								
								backend/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								backend/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,8 @@ | ||||
| config/development.json | ||||
| data/* | ||||
| yarn-error.log | ||||
| tmp | ||||
| certbot.log | ||||
| node_modules | ||||
| core.* | ||||
|  | ||||
| @@ -1,63 +0,0 @@ | ||||
| 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 | ||||
| @@ -1,11 +1,11 @@ | ||||
| { | ||||
| 	"printWidth": 80, | ||||
| 	"tabWidth": 2, | ||||
| 	"printWidth": 320, | ||||
| 	"tabWidth": 4, | ||||
| 	"useTabs": true, | ||||
| 	"semi": true, | ||||
| 	"singleQuote": false, | ||||
| 	"singleQuote": true, | ||||
| 	"bracketSpacing": true, | ||||
| 	"bracketSameLine": true, | ||||
| 	"jsxBracketSameLine": true, | ||||
| 	"trailingComma": "all", | ||||
| 	"proseWrap": "always" | ||||
| } | ||||
| @@ -1,21 +0,0 @@ | ||||
| --- | ||||
|  | ||||
| # (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 | ||||
							
								
								
									
										8
									
								
								backend/.vscode/settings.json
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								backend/.vscode/settings.json
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,8 @@ | ||||
| { | ||||
| 	"editor.insertSpaces": false, | ||||
| 	"editor.formatOnSave": true, | ||||
| 	"files.trimTrailingWhitespace": true, | ||||
| 	"editor.codeActionsOnSave": { | ||||
| 		"source.fixAll.eslint": true | ||||
| 	} | ||||
| } | ||||
| @@ -1,6 +0,0 @@ | ||||
| # Backend | ||||
|  | ||||
| ## Guides and materials | ||||
|  | ||||
| -   [Nginx Proxy Protocol](https://docs.nginx.com/nginx/admin-guide/load-balancer/using-proxy-protocol/) | ||||
| - | ||||
| @@ -1,70 +0,0 @@ | ||||
| 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 | ||||
							
								
								
									
										90
									
								
								backend/app.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										90
									
								
								backend/app.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,90 @@ | ||||
| const express     = require('express'); | ||||
| const bodyParser  = require('body-parser'); | ||||
| const fileUpload  = require('express-fileupload'); | ||||
| const compression = require('compression'); | ||||
| const config      = require('./lib/config'); | ||||
| const log         = require('./logger').express; | ||||
|  | ||||
| /** | ||||
|  * App | ||||
|  */ | ||||
| const app = express(); | ||||
| app.use(fileUpload()); | ||||
| app.use(bodyParser.json()); | ||||
| app.use(bodyParser.urlencoded({extended: true})); | ||||
|  | ||||
| // Gzip | ||||
| app.use(compression()); | ||||
|  | ||||
| /** | ||||
|  * General Logging, BEFORE routes | ||||
|  */ | ||||
|  | ||||
| app.disable('x-powered-by'); | ||||
| app.enable('trust proxy', ['loopback', 'linklocal', 'uniquelocal']); | ||||
| app.enable('strict routing'); | ||||
|  | ||||
| // pretty print JSON when not live | ||||
| if (config.debug()) { | ||||
| 	app.set('json spaces', 2); | ||||
| } | ||||
|  | ||||
| // CORS for everything | ||||
| app.use(require('./lib/express/cors')); | ||||
|  | ||||
| // General security/cache related headers + server header | ||||
| app.use(function (req, res, next) { | ||||
| 	let x_frame_options = 'DENY'; | ||||
|  | ||||
| 	if (typeof process.env.X_FRAME_OPTIONS !== 'undefined' && process.env.X_FRAME_OPTIONS) { | ||||
| 		x_frame_options = process.env.X_FRAME_OPTIONS; | ||||
| 	} | ||||
|  | ||||
| 	res.set({ | ||||
| 		'X-XSS-Protection':       '1; mode=block', | ||||
| 		'X-Content-Type-Options': 'nosniff', | ||||
| 		'X-Frame-Options':        x_frame_options, | ||||
| 		'Cache-Control':          'no-cache, no-store, max-age=0, must-revalidate', | ||||
| 		Pragma:                   'no-cache', | ||||
| 		Expires:                  0 | ||||
| 	}); | ||||
| 	next(); | ||||
| }); | ||||
|  | ||||
| app.use(require('./lib/express/jwt')()); | ||||
| app.use('/', require('./routes/api/main')); | ||||
|  | ||||
| // production error handler | ||||
| // no stacktraces leaked to user | ||||
| // eslint-disable-next-line | ||||
| app.use(function (err, req, res, next) { | ||||
|  | ||||
| 	let payload = { | ||||
| 		error: { | ||||
| 			code:    err.status, | ||||
| 			message: err.public ? err.message : 'Internal Error' | ||||
| 		} | ||||
| 	}; | ||||
|  | ||||
| 	if (config.debug() || (req.baseUrl + req.path).includes('nginx/certificates')) { | ||||
| 		payload.debug = { | ||||
| 			stack:    typeof err.stack !== 'undefined' && err.stack ? err.stack.split('\n') : null, | ||||
| 			previous: err.previous | ||||
| 		}; | ||||
| 	} | ||||
|  | ||||
| 	// Not every error is worth logging - but this is good for now until it gets annoying. | ||||
| 	if (typeof err.stack !== 'undefined' && err.stack) { | ||||
| 		if (config.debug()) { | ||||
| 			log.debug(err.stack); | ||||
| 		} else if (typeof err.public == 'undefined' || !err.public) { | ||||
| 			log.warn(err.message); | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	res | ||||
| 		.status(err.status || 500) | ||||
| 		.send(payload); | ||||
| }); | ||||
|  | ||||
| module.exports = app; | ||||
| @@ -1,125 +0,0 @@ | ||||
| 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 | ||||
| } | ||||
| @@ -1,84 +0,0 @@ | ||||
| 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) | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										2
									
								
								backend/config/README.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								backend/config/README.md
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,2 @@ | ||||
| These files are use in development and are not deployed as part of the final product. | ||||
|   | ||||
							
								
								
									
										10
									
								
								backend/config/default.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								backend/config/default.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,10 @@ | ||||
| { | ||||
|   "database": { | ||||
|     "engine": "mysql", | ||||
|     "host": "db", | ||||
|     "name": "npm", | ||||
|     "user": "npm", | ||||
|     "password": "npm", | ||||
|     "port": 3306 | ||||
|   } | ||||
| } | ||||
							
								
								
									
										26
									
								
								backend/config/sqlite-test-db.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								backend/config/sqlite-test-db.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,26 @@ | ||||
| { | ||||
|   "database": { | ||||
|       "engine": "knex-native", | ||||
|       "knex": { | ||||
|         "client": "sqlite3", | ||||
|         "connection": { | ||||
|           "filename": "/app/config/mydb.sqlite" | ||||
|         }, | ||||
|         "pool": { | ||||
|           "min": 0, | ||||
|           "max": 1, | ||||
|           "createTimeoutMillis": 3000, | ||||
|           "acquireTimeoutMillis": 30000, | ||||
|           "idleTimeoutMillis": 30000, | ||||
|           "reapIntervalMillis": 1000, | ||||
|           "createRetryIntervalMillis": 100, | ||||
|           "propagateCreateError": false | ||||
|         }, | ||||
|         "migrations": { | ||||
|           "tableName": "migrations", | ||||
|           "stub": "src/backend/lib/migrate_template.js", | ||||
|           "directory": "src/backend/migrations" | ||||
|         } | ||||
|       } | ||||
|     } | ||||
| } | ||||
							
								
								
									
										27
									
								
								backend/db.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								backend/db.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,27 @@ | ||||
| const config = require('./lib/config'); | ||||
|  | ||||
| if (!config.has('database')) { | ||||
| 	throw new Error('Database config does not exist! Please read the instructions: https://nginxproxymanager.com/setup/'); | ||||
| } | ||||
|  | ||||
| function generateDbConfig() { | ||||
| 	const cfg = config.get('database'); | ||||
| 	if (cfg.engine === 'knex-native') { | ||||
| 		return cfg.knex; | ||||
| 	} | ||||
| 	return { | ||||
| 		client:     cfg.engine, | ||||
| 		connection: { | ||||
| 			host:     cfg.host, | ||||
| 			user:     cfg.user, | ||||
| 			password: cfg.password, | ||||
| 			database: cfg.name, | ||||
| 			port:     cfg.port | ||||
| 		}, | ||||
| 		migrations: { | ||||
| 			tableName: 'migrations' | ||||
| 		} | ||||
| 	}; | ||||
| } | ||||
|  | ||||
| module.exports = require('knex')(generateDbConfig()); | ||||
							
								
								
									
										1456
									
								
								backend/doc/api.swagger.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1456
									
								
								backend/doc/api.swagger.json
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -1,310 +0,0 @@ | ||||
| { | ||||
| 	"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" | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @@ -1,13 +0,0 @@ | ||||
| { | ||||
| 	"type": "array", | ||||
| 	"description": "AuthConfigObject", | ||||
| 	"minItems": 1, | ||||
| 	"items": { | ||||
| 		"type": "string", | ||||
| 		"enum": [ | ||||
| 			"local", | ||||
| 			"ldap", | ||||
| 			"oauth" | ||||
| 		] | ||||
| 	} | ||||
| } | ||||
| @@ -1,40 +0,0 @@ | ||||
| { | ||||
| 	"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" | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @@ -1,57 +0,0 @@ | ||||
| { | ||||
| 	"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" | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @@ -1,40 +0,0 @@ | ||||
| { | ||||
| 	"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" | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @@ -1,86 +0,0 @@ | ||||
| { | ||||
| 	"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" | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @@ -1,4 +0,0 @@ | ||||
| { | ||||
| 	"type": "object", | ||||
| 	"description": "ConfigObject" | ||||
| } | ||||
| @@ -1,40 +0,0 @@ | ||||
| { | ||||
| 	"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" | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @@ -1,51 +0,0 @@ | ||||
| { | ||||
| 	"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" | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @@ -1,15 +0,0 @@ | ||||
| { | ||||
| 	"type": "object", | ||||
| 	"description": "DeletedItemResponse", | ||||
| 	"additionalProperties": false, | ||||
| 	"required": ["result"], | ||||
| 	"properties": { | ||||
| 		"result": { | ||||
| 			"type": "boolean", | ||||
| 			"nullable": true | ||||
| 		}, | ||||
| 		"error": { | ||||
| 			"$ref": "#/components/schemas/ErrorObject" | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @@ -1,17 +0,0 @@ | ||||
| { | ||||
| 	"type": "object", | ||||
| 	"description": "ErrorObject", | ||||
| 	"additionalProperties": false, | ||||
| 	"required": ["code", "message"], | ||||
| 	"properties": { | ||||
| 		"code": { | ||||
| 			"type": "integer", | ||||
| 			"description": "Error code", | ||||
| 			"minimum": 0 | ||||
| 		}, | ||||
| 		"message": { | ||||
| 			"type": "string", | ||||
| 			"description": "Error message" | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @@ -1,24 +0,0 @@ | ||||
| { | ||||
| 	"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" | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @@ -1,31 +0,0 @@ | ||||
| { | ||||
| 	"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 | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @@ -1,40 +0,0 @@ | ||||
| { | ||||
| 	"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" | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @@ -1,55 +0,0 @@ | ||||
| { | ||||
| 	"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" | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @@ -1,40 +0,0 @@ | ||||
| { | ||||
| 	"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" | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @@ -1,46 +0,0 @@ | ||||
| { | ||||
| 	"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 | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @@ -1,40 +0,0 @@ | ||||
| { | ||||
| 	"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" | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @@ -1,51 +0,0 @@ | ||||
| { | ||||
| 	"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" | ||||
| 				} | ||||
| 			] | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @@ -1,17 +0,0 @@ | ||||
| { | ||||
| 	"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)$" | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @@ -1,40 +0,0 @@ | ||||
| { | ||||
| 	"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" | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @@ -1,57 +0,0 @@ | ||||
| { | ||||
| 	"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 | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @@ -1,17 +0,0 @@ | ||||
| { | ||||
| 	"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" | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @@ -1,40 +0,0 @@ | ||||
| { | ||||
| 	"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" | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @@ -1,140 +0,0 @@ | ||||
| { | ||||
| 	"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" | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @@ -1,30 +0,0 @@ | ||||
| { | ||||
| 	"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)$" | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @@ -1,40 +0,0 @@ | ||||
| { | ||||
| 	"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" | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @@ -1,69 +0,0 @@ | ||||
| { | ||||
| 	"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 | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @@ -1,28 +0,0 @@ | ||||
| { | ||||
| 	"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" | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @@ -1,75 +0,0 @@ | ||||
| { | ||||
| 	"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" | ||||
| 								} | ||||
| 							} | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @@ -1,34 +0,0 @@ | ||||
| { | ||||
| 	"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" | ||||
| 								} | ||||
| 							} | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @@ -1,34 +0,0 @@ | ||||
| { | ||||
| 	"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" | ||||
| 								} | ||||
| 							} | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @@ -1,39 +0,0 @@ | ||||
| { | ||||
| 	"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 | ||||
| 							} | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @@ -1,53 +0,0 @@ | ||||
| { | ||||
| 	"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 | ||||
| 								} | ||||
| 							} | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @@ -1,62 +0,0 @@ | ||||
| { | ||||
| 	"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 | ||||
| 								} | ||||
| 							} | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @@ -1,93 +0,0 @@ | ||||
| { | ||||
| 	"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 | ||||
| 										} | ||||
| 									] | ||||
| 								} | ||||
| 							} | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @@ -1,49 +0,0 @@ | ||||
| { | ||||
| 	"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 | ||||
| 								} | ||||
| 							} | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @@ -1,60 +0,0 @@ | ||||
| { | ||||
| 	"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!" | ||||
| 								} | ||||
| 							} | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @@ -1,56 +0,0 @@ | ||||
| { | ||||
| 	"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" | ||||
| 								} | ||||
| 							} | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @@ -1,65 +0,0 @@ | ||||
| { | ||||
| 	"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" | ||||
| 								} | ||||
| 							} | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @@ -1,87 +0,0 @@ | ||||
| { | ||||
| 	"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" | ||||
| 										} | ||||
| 									] | ||||
| 								} | ||||
| 							} | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @@ -1,52 +0,0 @@ | ||||
| { | ||||
| 	"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" | ||||
| 								} | ||||
| 							} | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @@ -1,35 +0,0 @@ | ||||
| { | ||||
| 	"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" | ||||
| 									} | ||||
| 								} | ||||
| 							} | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @@ -1,83 +0,0 @@ | ||||
| { | ||||
| 	"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" | ||||
| 											} | ||||
| 										} | ||||
| 									] | ||||
| 								} | ||||
| 							} | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @@ -1,50 +0,0 @@ | ||||
| { | ||||
| 	"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" | ||||
| 									} | ||||
| 								} | ||||
| 							} | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @@ -1,60 +0,0 @@ | ||||
| { | ||||
| 	"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!" | ||||
| 								} | ||||
| 							} | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @@ -1,54 +0,0 @@ | ||||
| { | ||||
| 	"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" | ||||
| 									} | ||||
| 								} | ||||
| 							} | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @@ -1,65 +0,0 @@ | ||||
| { | ||||
| 	"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" | ||||
| 										} | ||||
| 									} | ||||
| 								} | ||||
| 							} | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @@ -1,44 +0,0 @@ | ||||
| { | ||||
| 	"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 | ||||
| 								} | ||||
| 							} | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @@ -1,94 +0,0 @@ | ||||
| { | ||||
| 	"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 | ||||
| 										} | ||||
| 									] | ||||
| 								} | ||||
| 							} | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @@ -1,60 +0,0 @@ | ||||
| { | ||||
| 	"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!" | ||||
| 								} | ||||
| 							} | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @@ -1,65 +0,0 @@ | ||||
| { | ||||
| 	"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 | ||||
| 								} | ||||
| 							} | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @@ -1,43 +0,0 @@ | ||||
| { | ||||
| 	"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" | ||||
| 							} | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @@ -1,74 +0,0 @@ | ||||
| { | ||||
| 	"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 | ||||
| 								} | ||||
| 							} | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @@ -1,61 +0,0 @@ | ||||
| { | ||||
| 	"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 | ||||
| 								} | ||||
| 							} | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @@ -1,80 +0,0 @@ | ||||
| { | ||||
| 	"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" | ||||
| 										} | ||||
| 									] | ||||
| 								} | ||||
| 							} | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @@ -1,47 +0,0 @@ | ||||
| { | ||||
| 	"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" | ||||
| 								} | ||||
| 							} | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @@ -1,58 +0,0 @@ | ||||
| { | ||||
| 	"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!" | ||||
| 								} | ||||
| 							} | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @@ -1,51 +0,0 @@ | ||||
| { | ||||
| 	"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" | ||||
| 								} | ||||
| 							} | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @@ -1,60 +0,0 @@ | ||||
| { | ||||
| 	"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" | ||||
| 								} | ||||
| 							} | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @@ -1,9 +0,0 @@ | ||||
| { | ||||
| 	"operationId": "schema", | ||||
| 	"summary": "Returns this swagger API schema", | ||||
| 	"responses": { | ||||
| 		"200": { | ||||
| 			"description": "200 response" | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @@ -1,81 +0,0 @@ | ||||
| { | ||||
| 	"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" | ||||
| 											} | ||||
| 										} | ||||
| 									] | ||||
| 								} | ||||
| 							} | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @@ -1,52 +0,0 @@ | ||||
| { | ||||
| 	"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" | ||||
| 									} | ||||
| 								} | ||||
| 							} | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @@ -1,61 +0,0 @@ | ||||
| { | ||||
| 	"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" | ||||
| 									} | ||||
| 								} | ||||
| 							} | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @@ -1,48 +0,0 @@ | ||||
| { | ||||
| 	"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" | ||||
| 									} | ||||
| 								} | ||||
| 							} | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @@ -1,70 +0,0 @@ | ||||
| { | ||||
| 	"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"] | ||||
| 								} | ||||
| 							} | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @@ -1,39 +0,0 @@ | ||||
| { | ||||
| 	"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" | ||||
| 							} | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @@ -1,60 +0,0 @@ | ||||
| { | ||||
| 	"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!" | ||||
| 								} | ||||
| 							} | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @@ -1,43 +0,0 @@ | ||||
| { | ||||
| 	"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" | ||||
| 							} | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @@ -1,52 +0,0 @@ | ||||
| { | ||||
| 	"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" | ||||
| 							} | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @@ -1,286 +0,0 @@ | ||||
| { | ||||
| 	"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 | ||||
| 												} | ||||
| 											] | ||||
| 										} | ||||
| 									] | ||||
| 								} | ||||
| 							} | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @@ -1,81 +0,0 @@ | ||||
| { | ||||
| 	"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 | ||||
| 										} | ||||
| 									] | ||||
| 								} | ||||
| 							} | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @@ -1,58 +0,0 @@ | ||||
| { | ||||
| 	"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!" | ||||
| 								} | ||||
| 							} | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @@ -1,82 +0,0 @@ | ||||
| { | ||||
| 	"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 | ||||
| 										} | ||||
| 									] | ||||
| 								} | ||||
| 							} | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @@ -1,43 +0,0 @@ | ||||
| { | ||||
| 	"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" | ||||
| 							} | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @@ -1,94 +0,0 @@ | ||||
| { | ||||
| 	"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 | ||||
| 										} | ||||
| 									] | ||||
| 								} | ||||
| 							} | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @@ -1,111 +0,0 @@ | ||||
| { | ||||
| 	"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" | ||||
| 											] | ||||
| 										} | ||||
| 									] | ||||
| 								} | ||||
| 							} | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user