Compare commits

...

60 Commits

Author SHA1 Message Date
Andras Bacsai
9137e8bc32 Merge pull request #469 from coollabsio/v2.9.11
v2.9.11
2022-06-20 20:48:30 +02:00
Andras Bacsai
35bd2b23d5 fix: lock file 2022-06-20 20:47:33 +02:00
Andras Bacsai
10a514d9ac fix: be able to change database + service versions 2022-06-20 20:47:10 +02:00
Andras Bacsai
71096acdff chore: version++ 2022-06-17 09:11:03 +02:00
Andras Bacsai
07da696397 Merge pull request #463 from execreate/main
Upgrade PSQL version to fix an issue with indices corruption
2022-06-17 09:10:40 +02:00
Jorilla Abdullaev
41baf150c2 upgrade PSQL version to fix an issue with CREATE INDEX CONCURRENTLY and REINDEX CONCURRENTLY that could cause silent data corruption of indexes 2022-06-17 11:08:47 +05:00
Andras Bacsai
f0a52b2ef4 Merge pull request #460 from coollabsio/scshiv29-dev/main
v2.9.9
2022-06-10 10:45:55 +02:00
Andras Bacsai
54e83fdff1 fix: remove package-lock 2022-06-10 10:45:32 +02:00
Andras Bacsai
46327ff2fc chore: version++ 2022-06-10 10:44:15 +02:00
Andras Bacsai
8b26acc841 fix: host and reload for uvicorn 2022-06-10 10:42:58 +02:00
Andras Bacsai
b90cb5a731 Merge pull request #420 from scshiv29-dev/main
Uvicorn ASGI for Python #388
2022-06-10 10:16:26 +02:00
Andras Bacsai
cd9b642c5e Merge branch 'feat/python' into main 2022-06-10 10:15:54 +02:00
Andras Bacsai
41a928d41b Merge branch 'main' into scshiv29-dev/main 2022-06-10 10:14:50 +02:00
Andras Bacsai
1388bee62c Merge pull request #459 from pucilpet/pucilpet-patch-1
Removed space from the version number
2022-06-10 08:51:36 +02:00
Petteri Pucilowski
8ebc778d40 Removed space from the version number 2022-06-10 01:30:46 +03:00
Andras Bacsai
3a59091b41 fix: nocodb persistency 2022-06-09 19:44:41 +02:00
Andras Bacsai
e764c4651c Merge pull request #454 from coollabsio/next
v2.9.8
2022-06-09 15:50:30 +02:00
Andras Bacsai
10f04d2177 fix: persistent nocodb 2022-06-09 15:49:21 +02:00
Andras Bacsai
119f994b50 chore: version++ 2022-06-09 15:49:07 +02:00
Andras Bacsai
e39541c318 fix: Traefik middleware 2022-06-09 15:18:21 +02:00
Andras Bacsai
cf88885c94 Merge pull request #452 from coollabsio/next
Fixes for v2.9.7
2022-06-09 14:01:20 +02:00
Andras Bacsai
1192346ce3 fix: remove comments 2022-06-09 14:00:41 +02:00
Andras Bacsai
0e3bd85847 fix: remove console log 2022-06-09 14:00:08 +02:00
Andras Bacsai
edeb6c6965 fix: Plausible script and middlewares 2022-06-09 13:59:09 +02:00
Andras Bacsai
138fd5cb6d Merge pull request #451 from coollabsio/next
v2.9.7
2022-06-09 13:34:02 +02:00
Andras Bacsai
155410bd44 Merge branch 'next' of github.com:coollabsio/coolify into next 2022-06-09 13:31:10 +02:00
Andras Bacsai
20bd829c2e Merge pull request #448 from titouanmathis/feat/gitlab-filter-projects-branches
feat: Add support for search for GitLab applications
2022-06-09 13:31:06 +02:00
Andras Bacsai
7b7e222946 chore: version++ 2022-06-09 13:30:29 +02:00
Andras Bacsai
98d901d06c fix: Plausible custom script 2022-06-08 13:45:42 +02:00
Titouan Mathis
4e862cda6f Add support for accessing all projects and branches for GitLab applications
Fix #236
2022-06-03 12:21:42 +02:00
Andras Bacsai
4e940807ae Merge pull request #446 from coollabsio/next
v2.9.6
2022-06-02 22:05:31 +02:00
Andras Bacsai
b081743f54 fix: pnpm command 2022-06-02 21:59:51 +02:00
Andras Bacsai
34bb9f301f fix: Fider changed an env variable name 2022-06-02 20:37:45 +02:00
Andras Bacsai
ed8a6daeea chore: version++ 2022-06-02 20:37:31 +02:00
Andras Bacsai
9e81ab43ac Merge pull request #445 from coollabsio/next
v2.9.5
2022-06-02 11:24:50 +02:00
Andras Bacsai
32d94cbe97 fix: proxy stop missing argument 2022-06-02 11:13:27 +02:00
Andras Bacsai
46a83aa457 chore: version++ 2022-06-02 11:13:14 +02:00
Andras Bacsai
08d7593ca9 Merge pull request #444 from coollabsio/next
v2.9.4
2022-06-01 10:43:30 +02:00
Andras Bacsai
a50f7a7cc2 fix: Revert gh and gl cloning 2022-06-01 10:42:17 +02:00
Andras Bacsai
2c33447f9f fix: typo 2022-05-31 23:23:39 +02:00
Andras Bacsai
d67a3f51ec fix: Demo version forms 2022-05-31 23:09:55 +02:00
Andras Bacsai
2719974262 chore: Version++ 2022-05-31 22:41:33 +02:00
Andras Bacsai
eb5aebd58d Merge pull request #442 from coollabsio/next
fix: Only reconfigure coolify proxy if its missconfigured
2022-05-31 22:30:09 +02:00
Andras Bacsai
98dbf3d8a5 fix: Only reconfigure coolify proxy if its missconfigured 2022-05-31 22:29:50 +02:00
Andras Bacsai
d9489a2cb4 Merge pull request #441 from coollabsio/next
fix: versions
2022-05-31 22:18:16 +02:00
Andras Bacsai
95832d34f7 fix: versions 2022-05-31 22:17:51 +02:00
Andras Bacsai
d3e9aea63d Merge pull request #440 from coollabsio/next
v2.9.3
2022-05-31 22:14:06 +02:00
Andras Bacsai
d6972e2ed1 fix: Recurisve clone instead of submodule 2022-05-31 21:52:25 +02:00
Andras Bacsai
50844e98be chore: version++ 2022-05-31 21:52:12 +02:00
Andras Bacsai
5c6fcfebf9 Merge pull request #439 from coollabsio/next
v2.9.2
2022-05-31 20:54:55 +02:00
Andras Bacsai
84cfe6fb42 fix: Add GIT ENV variable for submodules 2022-05-31 20:50:47 +02:00
Andras Bacsai
abf0aeb2a8 fix: Force restart proxy on seeding 2022-05-31 20:50:28 +02:00
Andras Bacsai
a7aca0ce8b fix: Only restart coolify proxy in case of version prior to 2.9.2 2022-05-31 20:25:39 +02:00
Andras Bacsai
67bb5d973b fix: force restart proxy 2022-05-31 19:39:25 +02:00
Andras Bacsai
662948d622 fix: TrustProxy 2022-05-31 19:35:07 +02:00
Andras Bacsai
f5bedfdf7f chore: Version++ 2022-05-31 19:34:55 +02:00
scshiv29-dev
da86f0076b Merge branch 'main' into main 2022-05-19 09:54:10 +05:30
scshiv29-dev
9d8551a9be minor fix 2022-05-19 04:23:23 +00:00
scshiv29-dev
c376123877 added uvicorn 2022-05-11 22:54:13 +05:30
scshiv29-dev
cd3663038f added uvicorn 2022-05-11 22:45:50 +05:30
28 changed files with 391 additions and 12210 deletions

9
.gitpod.yml Normal file
View File

@@ -0,0 +1,9 @@
# This configuration file was automatically generated by Gitpod.
# Please adjust to your needs (see https://www.gitpod.io/docs/config-gitpod-file)
# and commit this file to your remote git repository to share the goodness with others.
tasks:
- init: npm install && npm run build
command: npm run start

12004
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -1,7 +1,7 @@
{ {
"name": "coolify", "name": "coolify",
"description": "An open-source & self-hostable Heroku / Netlify alternative.", "description": "An open-source & self-hostable Heroku / Netlify alternative.",
"version": "2.9.1", "version": "2.9.11",
"license": "AGPL-3.0", "license": "AGPL-3.0",
"scripts": { "scripts": {
"dev": "docker-compose -f docker-compose-dev.yaml up -d && cross-env NODE_ENV=development & svelte-kit dev --host 0.0.0.0", "dev": "docker-compose -f docker-compose-dev.yaml up -d && cross-env NODE_ENV=development & svelte-kit dev --host 0.0.0.0",

153
pnpm-lock.yaml generated
View File

@@ -156,7 +156,6 @@ packages:
integrity: sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg== integrity: sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg==
} }
engines: { node: '>= 12' } engines: { node: '>= 12' }
dev: true
/@cspotcode/source-map-support/0.7.0: /@cspotcode/source-map-support/0.7.0:
resolution: resolution:
@@ -166,7 +165,6 @@ packages:
engines: { node: '>=12' } engines: { node: '>=12' }
dependencies: dependencies:
'@cspotcode/source-map-consumer': 0.8.0 '@cspotcode/source-map-consumer': 0.8.0
dev: true
/@eslint/eslintrc/0.4.3: /@eslint/eslintrc/0.4.3:
resolution: resolution:
@@ -250,7 +248,6 @@ packages:
dependencies: dependencies:
'@nodelib/fs.stat': 2.0.5 '@nodelib/fs.stat': 2.0.5
run-parallel: 1.2.0 run-parallel: 1.2.0
dev: true
/@nodelib/fs.stat/2.0.5: /@nodelib/fs.stat/2.0.5:
resolution: resolution:
@@ -258,7 +255,6 @@ packages:
integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==
} }
engines: { node: '>= 8' } engines: { node: '>= 8' }
dev: true
/@nodelib/fs.walk/1.2.8: /@nodelib/fs.walk/1.2.8:
resolution: resolution:
@@ -269,7 +265,6 @@ packages:
dependencies: dependencies:
'@nodelib/fs.scandir': 2.1.5 '@nodelib/fs.scandir': 2.1.5
fastq: 1.13.0 fastq: 1.13.0
dev: true
/@prisma/client/3.11.1_prisma@3.11.1: /@prisma/client/3.11.1_prisma@3.11.1:
resolution: resolution:
@@ -301,7 +296,6 @@ packages:
integrity: sha512-MILbsGnvmnhCbFGa2/iSnsyGyazU3afzD7ldjCIeLIGKkNBMSZgA2IvpYsAXl+6qFHKGrS3B2otKfV31dwMSQw== integrity: sha512-MILbsGnvmnhCbFGa2/iSnsyGyazU3afzD7ldjCIeLIGKkNBMSZgA2IvpYsAXl+6qFHKGrS3B2otKfV31dwMSQw==
} }
requiresBuild: true requiresBuild: true
dev: true
/@rollup/pluginutils/4.1.2: /@rollup/pluginutils/4.1.2:
resolution: resolution:
@@ -500,28 +494,24 @@ packages:
{ {
integrity: sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg== integrity: sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg==
} }
dev: true
/@tsconfig/node12/1.0.9: /@tsconfig/node12/1.0.9:
resolution: resolution:
{ {
integrity: sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw== integrity: sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw==
} }
dev: true
/@tsconfig/node14/1.0.1: /@tsconfig/node14/1.0.1:
resolution: resolution:
{ {
integrity: sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg== integrity: sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg==
} }
dev: true
/@tsconfig/node16/1.0.2: /@tsconfig/node16/1.0.2:
resolution: resolution:
{ {
integrity: sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA== integrity: sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA==
} }
dev: true
/@types/cacheable-request/6.0.2: /@types/cacheable-request/6.0.2:
resolution: resolution:
@@ -765,7 +755,6 @@ packages:
acorn: 7.4.1 acorn: 7.4.1
acorn-walk: 7.2.0 acorn-walk: 7.2.0
xtend: 4.0.2 xtend: 4.0.2
dev: true
/acorn-walk/7.2.0: /acorn-walk/7.2.0:
resolution: resolution:
@@ -773,7 +762,6 @@ packages:
integrity: sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== integrity: sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==
} }
engines: { node: '>=0.4.0' } engines: { node: '>=0.4.0' }
dev: true
/acorn-walk/8.2.0: /acorn-walk/8.2.0:
resolution: resolution:
@@ -781,7 +769,6 @@ packages:
integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==
} }
engines: { node: '>=0.4.0' } engines: { node: '>=0.4.0' }
dev: true
/acorn/7.4.1: /acorn/7.4.1:
resolution: resolution:
@@ -790,7 +777,6 @@ packages:
} }
engines: { node: '>=0.4.0' } engines: { node: '>=0.4.0' }
hasBin: true hasBin: true
dev: true
/acorn/8.5.0: /acorn/8.5.0:
resolution: resolution:
@@ -799,7 +785,6 @@ packages:
} }
engines: { node: '>=0.4.0' } engines: { node: '>=0.4.0' }
hasBin: true hasBin: true
dev: true
/agent-base/6.0.2: /agent-base/6.0.2:
resolution: resolution:
@@ -929,21 +914,18 @@ packages:
dependencies: dependencies:
normalize-path: 3.0.0 normalize-path: 3.0.0
picomatch: 2.3.0 picomatch: 2.3.0
dev: true
/arg/4.1.3: /arg/4.1.3:
resolution: resolution:
{ {
integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==
} }
dev: true
/arg/5.0.1: /arg/5.0.1:
resolution: resolution:
{ {
integrity: sha512-e0hDa9H2Z9AwFkk2qDlwhoMYE4eToKarchkQHovNdLTCYMHZHeRjI71crOh+dio4K6u1IcwubQqo79Ga4CyAQA== integrity: sha512-e0hDa9H2Z9AwFkk2qDlwhoMYE4eToKarchkQHovNdLTCYMHZHeRjI71crOh+dio4K6u1IcwubQqo79Ga4CyAQA==
} }
dev: true
/argparse/1.0.10: /argparse/1.0.10:
resolution: resolution:
@@ -1047,6 +1029,8 @@ packages:
private: 0.1.8 private: 0.1.8
slash: 1.0.0 slash: 1.0.0
source-map: 0.5.7 source-map: 0.5.7
transitivePeerDependencies:
- supports-color
dev: true dev: true
/babel-generator/6.26.1: /babel-generator/6.26.1:
@@ -1071,6 +1055,8 @@ packages:
babel-runtime: 6.26.0 babel-runtime: 6.26.0
babel-traverse: 6.26.0 babel-traverse: 6.26.0
babel-types: 6.26.0 babel-types: 6.26.0
transitivePeerDependencies:
- supports-color
dev: true dev: true
/babel-helper-builder-binary-assignment-operator-visitor/6.24.1: /babel-helper-builder-binary-assignment-operator-visitor/6.24.1:
@@ -1079,6 +1065,8 @@ packages:
babel-helper-explode-assignable-expression: 6.24.1 babel-helper-explode-assignable-expression: 6.24.1
babel-runtime: 6.26.0 babel-runtime: 6.26.0
babel-types: 6.26.0 babel-types: 6.26.0
transitivePeerDependencies:
- supports-color
dev: true dev: true
/babel-helper-call-delegate/6.24.1: /babel-helper-call-delegate/6.24.1:
@@ -1088,6 +1076,8 @@ packages:
babel-runtime: 6.26.0 babel-runtime: 6.26.0
babel-traverse: 6.26.0 babel-traverse: 6.26.0
babel-types: 6.26.0 babel-types: 6.26.0
transitivePeerDependencies:
- supports-color
dev: true dev: true
/babel-helper-define-map/6.26.0: /babel-helper-define-map/6.26.0:
@@ -1097,6 +1087,8 @@ packages:
babel-runtime: 6.26.0 babel-runtime: 6.26.0
babel-types: 6.26.0 babel-types: 6.26.0
lodash: 4.17.21 lodash: 4.17.21
transitivePeerDependencies:
- supports-color
dev: true dev: true
/babel-helper-explode-assignable-expression/6.24.1: /babel-helper-explode-assignable-expression/6.24.1:
@@ -1105,6 +1097,8 @@ packages:
babel-runtime: 6.26.0 babel-runtime: 6.26.0
babel-traverse: 6.26.0 babel-traverse: 6.26.0
babel-types: 6.26.0 babel-types: 6.26.0
transitivePeerDependencies:
- supports-color
dev: true dev: true
/babel-helper-explode-class/6.24.1: /babel-helper-explode-class/6.24.1:
@@ -1114,6 +1108,8 @@ packages:
babel-runtime: 6.26.0 babel-runtime: 6.26.0
babel-traverse: 6.26.0 babel-traverse: 6.26.0
babel-types: 6.26.0 babel-types: 6.26.0
transitivePeerDependencies:
- supports-color
dev: true dev: true
/babel-helper-function-name/6.24.1: /babel-helper-function-name/6.24.1:
@@ -1124,6 +1120,8 @@ packages:
babel-template: 6.26.0 babel-template: 6.26.0
babel-traverse: 6.26.0 babel-traverse: 6.26.0
babel-types: 6.26.0 babel-types: 6.26.0
transitivePeerDependencies:
- supports-color
dev: true dev: true
/babel-helper-get-function-arity/6.24.1: /babel-helper-get-function-arity/6.24.1:
@@ -1163,6 +1161,8 @@ packages:
babel-template: 6.26.0 babel-template: 6.26.0
babel-traverse: 6.26.0 babel-traverse: 6.26.0
babel-types: 6.26.0 babel-types: 6.26.0
transitivePeerDependencies:
- supports-color
dev: true dev: true
/babel-helper-replace-supers/6.24.1: /babel-helper-replace-supers/6.24.1:
@@ -1174,6 +1174,8 @@ packages:
babel-template: 6.26.0 babel-template: 6.26.0
babel-traverse: 6.26.0 babel-traverse: 6.26.0
babel-types: 6.26.0 babel-types: 6.26.0
transitivePeerDependencies:
- supports-color
dev: true dev: true
/babel-helpers/6.24.1: /babel-helpers/6.24.1:
@@ -1181,6 +1183,8 @@ packages:
dependencies: dependencies:
babel-runtime: 6.26.0 babel-runtime: 6.26.0
babel-template: 6.26.0 babel-template: 6.26.0
transitivePeerDependencies:
- supports-color
dev: true dev: true
/babel-messages/6.23.0: /babel-messages/6.23.0:
@@ -1249,6 +1253,8 @@ packages:
babel-helper-remap-async-to-generator: 6.24.1 babel-helper-remap-async-to-generator: 6.24.1
babel-plugin-syntax-async-generators: 6.13.0 babel-plugin-syntax-async-generators: 6.13.0
babel-runtime: 6.26.0 babel-runtime: 6.26.0
transitivePeerDependencies:
- supports-color
dev: true dev: true
/babel-plugin-transform-async-to-generator/6.24.1: /babel-plugin-transform-async-to-generator/6.24.1:
@@ -1257,6 +1263,8 @@ packages:
babel-helper-remap-async-to-generator: 6.24.1 babel-helper-remap-async-to-generator: 6.24.1
babel-plugin-syntax-async-functions: 6.13.0 babel-plugin-syntax-async-functions: 6.13.0
babel-runtime: 6.26.0 babel-runtime: 6.26.0
transitivePeerDependencies:
- supports-color
dev: true dev: true
/babel-plugin-transform-class-constructor-call/6.24.1: /babel-plugin-transform-class-constructor-call/6.24.1:
@@ -1265,6 +1273,8 @@ packages:
babel-plugin-syntax-class-constructor-call: 6.18.0 babel-plugin-syntax-class-constructor-call: 6.18.0
babel-runtime: 6.26.0 babel-runtime: 6.26.0
babel-template: 6.26.0 babel-template: 6.26.0
transitivePeerDependencies:
- supports-color
dev: true dev: true
/babel-plugin-transform-class-properties/6.24.1: /babel-plugin-transform-class-properties/6.24.1:
@@ -1274,6 +1284,8 @@ packages:
babel-plugin-syntax-class-properties: 6.13.0 babel-plugin-syntax-class-properties: 6.13.0
babel-runtime: 6.26.0 babel-runtime: 6.26.0
babel-template: 6.26.0 babel-template: 6.26.0
transitivePeerDependencies:
- supports-color
dev: true dev: true
/babel-plugin-transform-decorators/6.24.1: /babel-plugin-transform-decorators/6.24.1:
@@ -1284,6 +1296,8 @@ packages:
babel-runtime: 6.26.0 babel-runtime: 6.26.0
babel-template: 6.26.0 babel-template: 6.26.0
babel-types: 6.26.0 babel-types: 6.26.0
transitivePeerDependencies:
- supports-color
dev: true dev: true
/babel-plugin-transform-do-expressions/6.22.0: /babel-plugin-transform-do-expressions/6.22.0:
@@ -1313,6 +1327,8 @@ packages:
babel-traverse: 6.26.0 babel-traverse: 6.26.0
babel-types: 6.26.0 babel-types: 6.26.0
lodash: 4.17.21 lodash: 4.17.21
transitivePeerDependencies:
- supports-color
dev: true dev: true
/babel-plugin-transform-es2015-classes/6.24.1: /babel-plugin-transform-es2015-classes/6.24.1:
@@ -1327,6 +1343,8 @@ packages:
babel-template: 6.26.0 babel-template: 6.26.0
babel-traverse: 6.26.0 babel-traverse: 6.26.0
babel-types: 6.26.0 babel-types: 6.26.0
transitivePeerDependencies:
- supports-color
dev: true dev: true
/babel-plugin-transform-es2015-computed-properties/6.24.1: /babel-plugin-transform-es2015-computed-properties/6.24.1:
@@ -1334,6 +1352,8 @@ packages:
dependencies: dependencies:
babel-runtime: 6.26.0 babel-runtime: 6.26.0
babel-template: 6.26.0 babel-template: 6.26.0
transitivePeerDependencies:
- supports-color
dev: true dev: true
/babel-plugin-transform-es2015-destructuring/6.23.0: /babel-plugin-transform-es2015-destructuring/6.23.0:
@@ -1361,6 +1381,8 @@ packages:
babel-helper-function-name: 6.24.1 babel-helper-function-name: 6.24.1
babel-runtime: 6.26.0 babel-runtime: 6.26.0
babel-types: 6.26.0 babel-types: 6.26.0
transitivePeerDependencies:
- supports-color
dev: true dev: true
/babel-plugin-transform-es2015-literals/6.22.0: /babel-plugin-transform-es2015-literals/6.22.0:
@@ -1375,6 +1397,8 @@ packages:
babel-plugin-transform-es2015-modules-commonjs: 6.26.2 babel-plugin-transform-es2015-modules-commonjs: 6.26.2
babel-runtime: 6.26.0 babel-runtime: 6.26.0
babel-template: 6.26.0 babel-template: 6.26.0
transitivePeerDependencies:
- supports-color
dev: true dev: true
/babel-plugin-transform-es2015-modules-commonjs/6.26.2: /babel-plugin-transform-es2015-modules-commonjs/6.26.2:
@@ -1387,6 +1411,8 @@ packages:
babel-runtime: 6.26.0 babel-runtime: 6.26.0
babel-template: 6.26.0 babel-template: 6.26.0
babel-types: 6.26.0 babel-types: 6.26.0
transitivePeerDependencies:
- supports-color
dev: true dev: true
/babel-plugin-transform-es2015-modules-systemjs/6.24.1: /babel-plugin-transform-es2015-modules-systemjs/6.24.1:
@@ -1395,6 +1421,8 @@ packages:
babel-helper-hoist-variables: 6.24.1 babel-helper-hoist-variables: 6.24.1
babel-runtime: 6.26.0 babel-runtime: 6.26.0
babel-template: 6.26.0 babel-template: 6.26.0
transitivePeerDependencies:
- supports-color
dev: true dev: true
/babel-plugin-transform-es2015-modules-umd/6.24.1: /babel-plugin-transform-es2015-modules-umd/6.24.1:
@@ -1403,6 +1431,8 @@ packages:
babel-plugin-transform-es2015-modules-amd: 6.24.1 babel-plugin-transform-es2015-modules-amd: 6.24.1
babel-runtime: 6.26.0 babel-runtime: 6.26.0
babel-template: 6.26.0 babel-template: 6.26.0
transitivePeerDependencies:
- supports-color
dev: true dev: true
/babel-plugin-transform-es2015-object-super/6.24.1: /babel-plugin-transform-es2015-object-super/6.24.1:
@@ -1410,6 +1440,8 @@ packages:
dependencies: dependencies:
babel-helper-replace-supers: 6.24.1 babel-helper-replace-supers: 6.24.1
babel-runtime: 6.26.0 babel-runtime: 6.26.0
transitivePeerDependencies:
- supports-color
dev: true dev: true
/babel-plugin-transform-es2015-parameters/6.24.1: /babel-plugin-transform-es2015-parameters/6.24.1:
@@ -1421,6 +1453,8 @@ packages:
babel-template: 6.26.0 babel-template: 6.26.0
babel-traverse: 6.26.0 babel-traverse: 6.26.0
babel-types: 6.26.0 babel-types: 6.26.0
transitivePeerDependencies:
- supports-color
dev: true dev: true
/babel-plugin-transform-es2015-shorthand-properties/6.24.1: /babel-plugin-transform-es2015-shorthand-properties/6.24.1:
@@ -1470,6 +1504,8 @@ packages:
babel-helper-builder-binary-assignment-operator-visitor: 6.24.1 babel-helper-builder-binary-assignment-operator-visitor: 6.24.1
babel-plugin-syntax-exponentiation-operator: 6.13.0 babel-plugin-syntax-exponentiation-operator: 6.13.0
babel-runtime: 6.26.0 babel-runtime: 6.26.0
transitivePeerDependencies:
- supports-color
dev: true dev: true
/babel-plugin-transform-export-extensions/6.22.0: /babel-plugin-transform-export-extensions/6.22.0:
@@ -1534,6 +1570,8 @@ packages:
babel-plugin-transform-es2015-typeof-symbol: 6.23.0 babel-plugin-transform-es2015-typeof-symbol: 6.23.0
babel-plugin-transform-es2015-unicode-regex: 6.24.1 babel-plugin-transform-es2015-unicode-regex: 6.24.1
babel-plugin-transform-regenerator: 6.26.0 babel-plugin-transform-regenerator: 6.26.0
transitivePeerDependencies:
- supports-color
dev: true dev: true
/babel-preset-stage-0/6.24.1: /babel-preset-stage-0/6.24.1:
@@ -1542,6 +1580,8 @@ packages:
babel-plugin-transform-do-expressions: 6.22.0 babel-plugin-transform-do-expressions: 6.22.0
babel-plugin-transform-function-bind: 6.22.0 babel-plugin-transform-function-bind: 6.22.0
babel-preset-stage-1: 6.24.1 babel-preset-stage-1: 6.24.1
transitivePeerDependencies:
- supports-color
dev: true dev: true
/babel-preset-stage-1/6.24.1: /babel-preset-stage-1/6.24.1:
@@ -1550,6 +1590,8 @@ packages:
babel-plugin-transform-class-constructor-call: 6.24.1 babel-plugin-transform-class-constructor-call: 6.24.1
babel-plugin-transform-export-extensions: 6.22.0 babel-plugin-transform-export-extensions: 6.22.0
babel-preset-stage-2: 6.24.1 babel-preset-stage-2: 6.24.1
transitivePeerDependencies:
- supports-color
dev: true dev: true
/babel-preset-stage-2/6.24.1: /babel-preset-stage-2/6.24.1:
@@ -1559,6 +1601,8 @@ packages:
babel-plugin-transform-class-properties: 6.24.1 babel-plugin-transform-class-properties: 6.24.1
babel-plugin-transform-decorators: 6.24.1 babel-plugin-transform-decorators: 6.24.1
babel-preset-stage-3: 6.24.1 babel-preset-stage-3: 6.24.1
transitivePeerDependencies:
- supports-color
dev: true dev: true
/babel-preset-stage-3/6.24.1: /babel-preset-stage-3/6.24.1:
@@ -1569,6 +1613,8 @@ packages:
babel-plugin-transform-async-to-generator: 6.24.1 babel-plugin-transform-async-to-generator: 6.24.1
babel-plugin-transform-exponentiation-operator: 6.24.1 babel-plugin-transform-exponentiation-operator: 6.24.1
babel-plugin-transform-object-rest-spread: 6.26.0 babel-plugin-transform-object-rest-spread: 6.26.0
transitivePeerDependencies:
- supports-color
dev: true dev: true
/babel-register/6.26.0: /babel-register/6.26.0:
@@ -1581,6 +1627,8 @@ packages:
lodash: 4.17.21 lodash: 4.17.21
mkdirp: 0.5.5 mkdirp: 0.5.5
source-map-support: 0.4.18 source-map-support: 0.4.18
transitivePeerDependencies:
- supports-color
dev: true dev: true
/babel-runtime/6.26.0: /babel-runtime/6.26.0:
@@ -1598,6 +1646,8 @@ packages:
babel-types: 6.26.0 babel-types: 6.26.0
babylon: 6.18.0 babylon: 6.18.0
lodash: 4.17.21 lodash: 4.17.21
transitivePeerDependencies:
- supports-color
dev: true dev: true
/babel-traverse/6.26.0: /babel-traverse/6.26.0:
@@ -1612,6 +1662,8 @@ packages:
globals: 9.18.0 globals: 9.18.0
invariant: 2.2.4 invariant: 2.2.4
lodash: 4.17.21 lodash: 4.17.21
transitivePeerDependencies:
- supports-color
dev: true dev: true
/babel-types/6.26.0: /babel-types/6.26.0:
@@ -1660,7 +1712,6 @@ packages:
integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==
} }
engines: { node: '>=8' } engines: { node: '>=8' }
dev: true
/bl/4.1.0: /bl/4.1.0:
resolution: resolution:
@@ -1690,7 +1741,6 @@ packages:
engines: { node: '>=8' } engines: { node: '>=8' }
dependencies: dependencies:
fill-range: 7.0.1 fill-range: 7.0.1
dev: true
/browserslist/4.20.3: /browserslist/4.20.3:
resolution: resolution:
@@ -1782,7 +1832,6 @@ packages:
integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA== integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==
} }
engines: { node: '>= 6' } engines: { node: '>= 6' }
dev: true
/camelcase/5.3.1: /camelcase/5.3.1:
resolution: resolution:
@@ -1849,7 +1898,6 @@ packages:
readdirp: 3.6.0 readdirp: 3.6.0
optionalDependencies: optionalDependencies:
fsevents: 2.3.2 fsevents: 2.3.2
dev: true
/chownr/1.1.4: /chownr/1.1.4:
resolution: resolution:
@@ -1940,7 +1988,6 @@ packages:
{ {
integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
} }
dev: true
/colorette/2.0.16: /colorette/2.0.16:
resolution: resolution:
@@ -2018,7 +2065,6 @@ packages:
{ {
integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==
} }
dev: true
/cron-parser/4.2.1: /cron-parser/4.2.1:
resolution: resolution:
@@ -2069,6 +2115,8 @@ packages:
babel-register: 6.26.0 babel-register: 6.26.0
cross-spawn: 5.1.0 cross-spawn: 5.1.0
exit: 0.1.2 exit: 0.1.2
transitivePeerDependencies:
- supports-color
dev: true dev: true
/cssesc/3.0.0: /cssesc/3.0.0:
@@ -2078,7 +2126,6 @@ packages:
} }
engines: { node: '>=4' } engines: { node: '>=4' }
hasBin: true hasBin: true
dev: true
/cuid/2.1.8: /cuid/2.1.8:
resolution: resolution:
@@ -2099,6 +2146,11 @@ packages:
{ {
integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==
} }
peerDependencies:
supports-color: '*'
peerDependenciesMeta:
supports-color:
optional: true
dependencies: dependencies:
ms: 2.0.0 ms: 2.0.0
dev: true dev: true
@@ -2160,7 +2212,6 @@ packages:
/defined/1.0.0: /defined/1.0.0:
resolution: { integrity: sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM= } resolution: { integrity: sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM= }
dev: true
/denque/1.5.1: /denque/1.5.1:
resolution: resolution:
@@ -2196,14 +2247,12 @@ packages:
acorn-node: 1.8.2 acorn-node: 1.8.2
defined: 1.0.0 defined: 1.0.0
minimist: 1.2.5 minimist: 1.2.5
dev: true
/didyoumean/1.2.2: /didyoumean/1.2.2:
resolution: resolution:
{ {
integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw== integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==
} }
dev: true
/diff/4.0.2: /diff/4.0.2:
resolution: resolution:
@@ -2211,7 +2260,6 @@ packages:
integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==
} }
engines: { node: '>=0.3.1' } engines: { node: '>=0.3.1' }
dev: true
/dir-glob/3.0.1: /dir-glob/3.0.1:
resolution: resolution:
@@ -2228,7 +2276,6 @@ packages:
{ {
integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA== integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==
} }
dev: true
/docker-modem/3.0.3: /docker-modem/3.0.3:
resolution: resolution:
@@ -2884,7 +2931,6 @@ packages:
glob-parent: 5.1.2 glob-parent: 5.1.2
merge2: 1.4.1 merge2: 1.4.1
micromatch: 4.0.4 micromatch: 4.0.4
dev: true
/fast-json-stable-stringify/2.1.0: /fast-json-stable-stringify/2.1.0:
resolution: resolution:
@@ -2904,7 +2950,6 @@ packages:
} }
dependencies: dependencies:
reusify: 1.0.4 reusify: 1.0.4
dev: true
/file-entry-cache/6.0.1: /file-entry-cache/6.0.1:
resolution: resolution:
@@ -2924,7 +2969,6 @@ packages:
engines: { node: '>=8' } engines: { node: '>=8' }
dependencies: dependencies:
to-regex-range: 5.0.1 to-regex-range: 5.0.1
dev: true
/flat-cache/3.0.4: /flat-cache/3.0.4:
resolution: resolution:
@@ -2976,7 +3020,6 @@ packages:
engines: { node: ^8.16.0 || ^10.6.0 || >=11.0.0 } engines: { node: ^8.16.0 || ^10.6.0 || >=11.0.0 }
os: [darwin] os: [darwin]
requiresBuild: true requiresBuild: true
dev: true
optional: true optional: true
/function-bind/1.1.1: /function-bind/1.1.1:
@@ -2984,7 +3027,6 @@ packages:
{ {
integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==
} }
dev: true
/function.name/1.0.13: /function.name/1.0.13:
resolution: resolution:
@@ -3047,7 +3089,6 @@ packages:
engines: { node: '>= 6' } engines: { node: '>= 6' }
dependencies: dependencies:
is-glob: 4.0.3 is-glob: 4.0.3
dev: true
/glob-parent/6.0.2: /glob-parent/6.0.2:
resolution: resolution:
@@ -3057,7 +3098,6 @@ packages:
engines: { node: '>=10.13.0' } engines: { node: '>=10.13.0' }
dependencies: dependencies:
is-glob: 4.0.3 is-glob: 4.0.3
dev: true
/glob/7.2.0: /glob/7.2.0:
resolution: resolution:
@@ -3176,7 +3216,6 @@ packages:
engines: { node: '>= 0.4.0' } engines: { node: '>= 0.4.0' }
dependencies: dependencies:
function-bind: 1.1.1 function-bind: 1.1.1
dev: true
/home-or-tmp/2.0.0: /home-or-tmp/2.0.0:
resolution: { integrity: sha1-42w/LSyufXRqhX440Y1fMqeILbg= } resolution: { integrity: sha1-42w/LSyufXRqhX440Y1fMqeILbg= }
@@ -3340,7 +3379,6 @@ packages:
engines: { node: '>=8' } engines: { node: '>=8' }
dependencies: dependencies:
binary-extensions: 2.2.0 binary-extensions: 2.2.0
dev: true
/is-core-module/2.8.1: /is-core-module/2.8.1:
resolution: resolution:
@@ -3349,12 +3387,10 @@ packages:
} }
dependencies: dependencies:
has: 1.0.3 has: 1.0.3
dev: true
/is-extglob/2.1.1: /is-extglob/2.1.1:
resolution: { integrity: sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= } resolution: { integrity: sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= }
engines: { node: '>=0.10.0' } engines: { node: '>=0.10.0' }
dev: true
/is-finite/1.1.0: /is-finite/1.1.0:
resolution: resolution:
@@ -3388,7 +3424,6 @@ packages:
engines: { node: '>=0.10.0' } engines: { node: '>=0.10.0' }
dependencies: dependencies:
is-extglob: 2.1.1 is-extglob: 2.1.1
dev: true
/is-ip/4.0.0: /is-ip/4.0.0:
resolution: resolution:
@@ -3406,7 +3441,6 @@ packages:
integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==
} }
engines: { node: '>=0.12.0' } engines: { node: '>=0.12.0' }
dev: true
/is-stream/2.0.1: /is-stream/2.0.1:
resolution: resolution:
@@ -3581,7 +3615,6 @@ packages:
integrity: sha512-xaYmXZtTHPAw5m+xLN8ab9C+3a8YmV3asNSPOATITbtwrfbwaLJj8h66H1WMIpALCkqsIzK3h7oQ+PdX+LQ9Eg== integrity: sha512-xaYmXZtTHPAw5m+xLN8ab9C+3a8YmV3asNSPOATITbtwrfbwaLJj8h66H1WMIpALCkqsIzK3h7oQ+PdX+LQ9Eg==
} }
engines: { node: '>=10' } engines: { node: '>=10' }
dev: true
/lint-staged/12.4.1: /lint-staged/12.4.1:
resolution: resolution:
@@ -3776,7 +3809,6 @@ packages:
{ {
integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==
} }
dev: true
/merge-stream/2.0.0: /merge-stream/2.0.0:
resolution: resolution:
@@ -3791,7 +3823,6 @@ packages:
integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==
} }
engines: { node: '>= 8' } engines: { node: '>= 8' }
dev: true
/micromatch/4.0.4: /micromatch/4.0.4:
resolution: resolution:
@@ -3802,7 +3833,6 @@ packages:
dependencies: dependencies:
braces: 3.0.2 braces: 3.0.2
picomatch: 2.3.0 picomatch: 2.3.0
dev: true
/mimic-fn/2.1.0: /mimic-fn/2.1.0:
resolution: resolution:
@@ -3849,7 +3879,6 @@ packages:
{ {
integrity: sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== integrity: sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==
} }
dev: true
/mkdirp-classic/0.5.3: /mkdirp-classic/0.5.3:
resolution: resolution:
@@ -3930,7 +3959,6 @@ packages:
} }
engines: { node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1 } engines: { node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1 }
hasBin: true hasBin: true
dev: true
/natural-compare/1.4.0: /natural-compare/1.4.0:
resolution: { integrity: sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= } resolution: { integrity: sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= }
@@ -3980,7 +4008,6 @@ packages:
integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==
} }
engines: { node: '>=0.10.0' } engines: { node: '>=0.10.0' }
dev: true
/normalize-range/0.1.2: /normalize-range/0.1.2:
resolution: { integrity: sha1-LRDAa9/TEuqXd2laTShDlFa3WUI= } resolution: { integrity: sha1-LRDAa9/TEuqXd2laTShDlFa3WUI= }
@@ -4011,7 +4038,6 @@ packages:
integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw== integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==
} }
engines: { node: '>= 6' } engines: { node: '>= 6' }
dev: true
/object-inspect/1.12.0: /object-inspect/1.12.0:
resolution: resolution:
@@ -4122,7 +4148,6 @@ packages:
{ {
integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==
} }
dev: true
/path-type/4.0.0: /path-type/4.0.0:
resolution: resolution:
@@ -4137,7 +4162,6 @@ packages:
{ {
integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==
} }
dev: true
/picomatch/2.3.0: /picomatch/2.3.0:
resolution: resolution:
@@ -4145,7 +4169,6 @@ packages:
integrity: sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw== integrity: sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==
} }
engines: { node: '>=8.6' } engines: { node: '>=8.6' }
dev: true
/pidtree/0.5.0: /pidtree/0.5.0:
resolution: resolution:
@@ -4167,7 +4190,6 @@ packages:
dependencies: dependencies:
camelcase-css: 2.0.1 camelcase-css: 2.0.1
postcss: 8.4.13 postcss: 8.4.13
dev: true
/postcss-load-config/3.1.4_4jqnslpwnj4ifyjfqbkuebd4fy: /postcss-load-config/3.1.4_4jqnslpwnj4ifyjfqbkuebd4fy:
resolution: resolution:
@@ -4188,7 +4210,6 @@ packages:
postcss: 8.4.13 postcss: 8.4.13
ts-node: 10.7.0_3smuweqyuzdazdnyhhezld6mfa ts-node: 10.7.0_3smuweqyuzdazdnyhhezld6mfa
yaml: 1.10.2 yaml: 1.10.2
dev: true
/postcss-nested/5.0.6_postcss@8.4.13: /postcss-nested/5.0.6_postcss@8.4.13:
resolution: resolution:
@@ -4201,7 +4222,6 @@ packages:
dependencies: dependencies:
postcss: 8.4.13 postcss: 8.4.13
postcss-selector-parser: 6.0.10 postcss-selector-parser: 6.0.10
dev: true
/postcss-selector-parser/6.0.10: /postcss-selector-parser/6.0.10:
resolution: resolution:
@@ -4212,14 +4232,12 @@ packages:
dependencies: dependencies:
cssesc: 3.0.0 cssesc: 3.0.0
util-deprecate: 1.0.2 util-deprecate: 1.0.2
dev: true
/postcss-value-parser/4.2.0: /postcss-value-parser/4.2.0:
resolution: resolution:
{ {
integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==
} }
dev: true
/postcss/8.4.13: /postcss/8.4.13:
resolution: resolution:
@@ -4231,7 +4249,6 @@ packages:
nanoid: 3.3.4 nanoid: 3.3.4
picocolors: 1.0.0 picocolors: 1.0.0
source-map-js: 1.0.2 source-map-js: 1.0.2
dev: true
/prelude-ls/1.2.1: /prelude-ls/1.2.1:
resolution: resolution:
@@ -4285,7 +4302,6 @@ packages:
requiresBuild: true requiresBuild: true
dependencies: dependencies:
'@prisma/engines': 3.11.1-1.1a2506facaf1a4727b7c26850735e88ec779dee9 '@prisma/engines': 3.11.1-1.1a2506facaf1a4727b7c26850735e88ec779dee9
dev: true
/private/0.1.8: /private/0.1.8:
resolution: resolution:
@@ -4330,7 +4346,6 @@ packages:
{ {
integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==
} }
dev: true
/quick-lru/5.1.1: /quick-lru/5.1.1:
resolution: resolution:
@@ -4359,7 +4374,6 @@ packages:
engines: { node: '>=8.10.0' } engines: { node: '>=8.10.0' }
dependencies: dependencies:
picomatch: 2.3.0 picomatch: 2.3.0
dev: true
/redis-commands/1.7.0: /redis-commands/1.7.0:
resolution: resolution:
@@ -4476,7 +4490,6 @@ packages:
is-core-module: 2.8.1 is-core-module: 2.8.1
path-parse: 1.0.7 path-parse: 1.0.7
supports-preserve-symlinks-flag: 1.0.0 supports-preserve-symlinks-flag: 1.0.0
dev: true
/responselike/2.0.0: /responselike/2.0.0:
resolution: resolution:
@@ -4504,7 +4517,6 @@ packages:
integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==
} }
engines: { iojs: '>=1.0.0', node: '>=0.10.0' } engines: { iojs: '>=1.0.0', node: '>=0.10.0' }
dev: true
/rfdc/1.3.0: /rfdc/1.3.0:
resolution: resolution:
@@ -4551,7 +4563,6 @@ packages:
} }
dependencies: dependencies:
queue-microtask: 1.2.3 queue-microtask: 1.2.3
dev: true
/rxjs/7.5.2: /rxjs/7.5.2:
resolution: resolution:
@@ -4728,7 +4739,6 @@ packages:
integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==
} }
engines: { node: '>=0.10.0' } engines: { node: '>=0.10.0' }
dev: true
/source-map-support/0.4.18: /source-map-support/0.4.18:
resolution: resolution:
@@ -4914,7 +4924,6 @@ packages:
integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==
} }
engines: { node: '>= 0.4' } engines: { node: '>= 0.4' }
dev: true
/svelte-check/2.7.1_f2ke6qjyzu5axsjd6yk3u4tn7a: /svelte-check/2.7.1_f2ke6qjyzu5axsjd6yk3u4tn7a:
resolution: resolution:
@@ -5105,7 +5114,6 @@ packages:
resolve: 1.22.0 resolve: 1.22.0
transitivePeerDependencies: transitivePeerDependencies:
- ts-node - ts-node
dev: true
/tar-fs/2.0.1: /tar-fs/2.0.1:
resolution: resolution:
@@ -5164,7 +5172,6 @@ packages:
engines: { node: '>=8.0' } engines: { node: '>=8.0' }
dependencies: dependencies:
is-number: 7.0.0 is-number: 7.0.0
dev: true
/trim-right/1.0.1: /trim-right/1.0.1:
resolution: { integrity: sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM= } resolution: { integrity: sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM= }
@@ -5203,7 +5210,6 @@ packages:
typescript: 4.6.4 typescript: 4.6.4
v8-compile-cache-lib: 3.0.0 v8-compile-cache-lib: 3.0.0
yn: 3.1.1 yn: 3.1.1
dev: true
/tslib/1.14.1: /tslib/1.14.1:
resolution: resolution:
@@ -5268,7 +5274,6 @@ packages:
} }
engines: { node: '>=4.2.0' } engines: { node: '>=4.2.0' }
hasBin: true hasBin: true
dev: true
/typpy/2.3.11: /typpy/2.3.11:
resolution: resolution:
@@ -5312,7 +5317,6 @@ packages:
{ {
integrity: sha512-mpSYqfsFvASnSn5qMiwrr4VKfumbPyONLCOPmsR3A6pTY/r0+tSaVbgPWSAIuzbk3lCTa+FForeTiO+wBQGkjA== integrity: sha512-mpSYqfsFvASnSn5qMiwrr4VKfumbPyONLCOPmsR3A6pTY/r0+tSaVbgPWSAIuzbk3lCTa+FForeTiO+wBQGkjA==
} }
dev: true
/v8-compile-cache/2.3.0: /v8-compile-cache/2.3.0:
resolution: resolution:
@@ -5409,7 +5413,6 @@ packages:
integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==
} }
engines: { node: '>=0.4' } engines: { node: '>=0.4' }
dev: true
/yallist/2.1.2: /yallist/2.1.2:
resolution: { integrity: sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= } resolution: { integrity: sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= }
@@ -5428,7 +5431,6 @@ packages:
integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==
} }
engines: { node: '>= 6' } engines: { node: '>= 6' }
dev: true
/yn/3.1.1: /yn/3.1.1:
resolution: resolution:
@@ -5436,7 +5438,6 @@ packages:
integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==
} }
engines: { node: '>=6' } engines: { node: '>=6' }
dev: true
/yocto-queue/1.0.0: /yocto-queue/1.0.0:
resolution: resolution:

View File

@@ -5,6 +5,12 @@ const prisma = new PrismaClient();
const crypto = require('crypto'); const crypto = require('crypto');
const generator = require('generate-password'); const generator = require('generate-password');
const cuid = require('cuid'); const cuid = require('cuid');
const compare = require('compare-versions');
const { version } = require('../package.json');
const child = require('child_process');
const util = require('util');
const algorithm = 'aes-256-ctr';
function generatePassword(length = 24) { function generatePassword(length = 24) {
return generator.generate({ return generator.generate({
@@ -13,7 +19,7 @@ function generatePassword(length = 24) {
strict: true strict: true
}); });
} }
const algorithm = 'aes-256-ctr'; const asyncExecShell = util.promisify(child.exec);
async function main() { async function main() {
// Enable registration for the first user // Enable registration for the first user
@@ -64,6 +70,56 @@ async function main() {
} }
}); });
} }
if (settings.isTraefikUsed) {
// Force stop Coolify Proxy, as it had a bug in < 2.9.2. TrustProxy + api.insecure
try {
const { stdout } = await asyncExecShell(
`docker inspect coolify-proxy --format '{{json .Config.Cmd}}'`
);
if (
!stdout
.replaceAll('[', '')
.replaceAll(']', '')
.replaceAll('"', '')
.replace('\n', '')
.split(',')
.includes('--entrypoints.web.forwardedHeaders.insecure=true')
) {
console.log('Reconfiguring Coolify Proxy (Traefik)...');
await asyncExecShell(`docker stop -t 0 coolify-proxy && docker rm coolify-proxy`);
const { stdout: Config } = await asyncExecShell(
`docker network inspect bridge --format '{{json .IPAM.Config }}'`
);
const ip = JSON.parse(Config)[0].Gateway;
await asyncExecShell(
`docker run --restart always \
--add-host 'host.docker.internal:host-gateway' \
--add-host 'host.docker.internal:${ip}' \
-v coolify-traefik-letsencrypt:/etc/traefik/acme \
-v /var/run/docker.sock:/var/run/docker.sock \
--network coolify-infra \
-p "80:80" \
-p "443:443" \
--name coolify-proxy \
-d traefik:v2.6 \
--entrypoints.web.address=:80 \
--entrypoints.web.forwardedHeaders.insecure=true \
--entrypoints.websecure.address=:443 \
--entrypoints.websecure.forwardedHeaders.insecure=true \
--providers.docker=true \
--providers.docker.exposedbydefault=false \
--providers.http.endpoint=http://coolify:3000/webhooks/traefik/main.json \
--providers.http.pollTimeout=5s \
--certificatesresolvers.letsencrypt.acme.httpchallenge=true \
--certificatesresolvers.letsencrypt.acme.storage=/etc/traefik/acme/acme.json \
--certificatesresolvers.letsencrypt.acme.httpchallenge.entrypoint=web \
--log.level=error`
);
}
} catch (error) {
console.log(error);
}
}
} }
main() main()
.catch((e) => { .catch((e) => {

View File

@@ -10,8 +10,7 @@ const createDockerfile = async (data, image): Promise<void> => {
Dockerfile.push('WORKDIR /app'); Dockerfile.push('WORKDIR /app');
Dockerfile.push(`LABEL coolify.buildId=${buildId}`); Dockerfile.push(`LABEL coolify.buildId=${buildId}`);
if (isPnpm) { if (isPnpm) {
Dockerfile.push('RUN curl -f https://get.pnpm.io/v6.16.js | node - add --global pnpm'); Dockerfile.push('RUN curl -f https://get.pnpm.io/v6.16.js | node - add --global pnpm@7');
Dockerfile.push('RUN pnpm add -g pnpm');
} }
Dockerfile.push(`COPY --from=${applicationId}:${tag}-cache /app/${baseDirectory || ''} ./`); Dockerfile.push(`COPY --from=${applicationId}:${tag}-cache /app/${baseDirectory || ''} ./`);

View File

@@ -35,8 +35,7 @@ const createDockerfile = async (data, image): Promise<void> => {
}); });
} }
if (isPnpm) { if (isPnpm) {
Dockerfile.push('RUN curl -f https://get.pnpm.io/v6.16.js | node - add --global pnpm'); Dockerfile.push('RUN curl -f https://get.pnpm.io/v6.16.js | node - add --global pnpm@7');
Dockerfile.push('RUN pnpm add -g pnpm');
} }
Dockerfile.push(`COPY .${baseDirectory || ''} ./`); Dockerfile.push(`COPY .${baseDirectory || ''} ./`);
Dockerfile.push(`RUN ${installCommand}`); Dockerfile.push(`RUN ${installCommand}`);

View File

@@ -36,8 +36,7 @@ const createDockerfile = async (data, image): Promise<void> => {
}); });
} }
if (isPnpm) { if (isPnpm) {
Dockerfile.push('RUN curl -f https://get.pnpm.io/v6.16.js | node - add --global pnpm'); Dockerfile.push('RUN curl -f https://get.pnpm.io/v6.16.js | node - add --global pnpm@7');
Dockerfile.push('RUN pnpm add -g pnpm');
} }
Dockerfile.push(`COPY .${baseDirectory || ''} ./`); Dockerfile.push(`COPY .${baseDirectory || ''} ./`);
Dockerfile.push(`RUN ${installCommand}`); Dockerfile.push(`RUN ${installCommand}`);

View File

@@ -35,8 +35,7 @@ const createDockerfile = async (data, image): Promise<void> => {
}); });
} }
if (isPnpm) { if (isPnpm) {
Dockerfile.push('RUN curl -f https://get.pnpm.io/v6.16.js | node - add --global pnpm'); Dockerfile.push('RUN curl -f https://get.pnpm.io/v6.16.js | node - add --global pnpm@7');
Dockerfile.push('RUN pnpm add -g pnpm');
} }
Dockerfile.push(`COPY .${baseDirectory || ''} ./`); Dockerfile.push(`COPY .${baseDirectory || ''} ./`);
Dockerfile.push(`RUN ${installCommand}`); Dockerfile.push(`RUN ${installCommand}`);

View File

@@ -34,6 +34,8 @@ const createDockerfile = async (data, image): Promise<void> => {
} }
if (pythonWSGI?.toLowerCase() === 'gunicorn') { if (pythonWSGI?.toLowerCase() === 'gunicorn') {
Dockerfile.push(`RUN pip install gunicorn`); Dockerfile.push(`RUN pip install gunicorn`);
} else if (pythonWSGI?.toLowerCase() === 'uvicorn') {
Dockerfile.push(`RUN pip install uvicorn`);
} else if (pythonWSGI?.toLowerCase() === 'uwsgi') { } else if (pythonWSGI?.toLowerCase() === 'uwsgi') {
Dockerfile.push(`RUN apk add --no-cache uwsgi-python3`); Dockerfile.push(`RUN apk add --no-cache uwsgi-python3`);
// Dockerfile.push(`RUN pip install --no-cache-dir uwsgi`) // Dockerfile.push(`RUN pip install --no-cache-dir uwsgi`)
@@ -50,6 +52,8 @@ const createDockerfile = async (data, image): Promise<void> => {
Dockerfile.push(`EXPOSE ${port}`); Dockerfile.push(`EXPOSE ${port}`);
if (pythonWSGI?.toLowerCase() === 'gunicorn') { if (pythonWSGI?.toLowerCase() === 'gunicorn') {
Dockerfile.push(`CMD gunicorn -w=4 -b=0.0.0.0:8000 ${pythonModule}:${pythonVariable}`); Dockerfile.push(`CMD gunicorn -w=4 -b=0.0.0.0:8000 ${pythonModule}:${pythonVariable}`);
} else if (pythonWSGI?.toLowerCase() === 'uvicorn') {
Dockerfile.push(`CMD uvicorn ${pythonModule}:${pythonVariable} --port ${port} --host 0.0.0.0`);
} else if (pythonWSGI?.toLowerCase() === 'uwsgi') { } else if (pythonWSGI?.toLowerCase() === 'uwsgi') {
Dockerfile.push( Dockerfile.push(
`CMD uwsgi --master -p 4 --http-socket 0.0.0.0:8000 --uid uwsgi --plugins python3 --protocol uwsgi --wsgi ${pythonModule}:${pythonVariable}` `CMD uwsgi --master -p 4 --http-socket 0.0.0.0:8000 --uid uwsgi --plugins python3 --protocol uwsgi --wsgi ${pythonModule}:${pythonVariable}`

View File

@@ -62,7 +62,7 @@ export const supportedDatabaseTypesAndVersions = [
name: 'postgresql', name: 'postgresql',
fancyName: 'PostgreSQL', fancyName: 'PostgreSQL',
baseImage: 'bitnami/postgresql', baseImage: 'bitnami/postgresql',
versions: ['14.2.0', '13.6.0', '12.10.0 ', '11.15.0', '10.20.0'] versions: ['14.4.0', '13.6.0', '12.10.0', '11.15.0', '10.20.0']
}, },
{ {
name: 'redis', name: 'redis',

View File

@@ -66,8 +66,7 @@ export async function buildCacheImageWithNode(data, imageForBuild) {
}); });
} }
if (isPnpm) { if (isPnpm) {
Dockerfile.push('RUN curl -f https://get.pnpm.io/v6.16.js | node - add --global pnpm'); Dockerfile.push('RUN curl -f https://get.pnpm.io/v6.16.js | node - add --global pnpm@7');
Dockerfile.push('RUN pnpm add -g pnpm');
} }
if (installCommand) { if (installCommand) {
Dockerfile.push(`COPY .${baseDirectory || ''}/package.json ./`); Dockerfile.push(`COPY .${baseDirectory || ''}/package.json ./`);

View File

@@ -161,6 +161,7 @@ export async function startTraefikTCPProxy(
image: 'traefik:v2.6', image: 'traefik:v2.6',
command: [ command: [
`--entrypoints.tcp.address=:${publicPort}`, `--entrypoints.tcp.address=:${publicPort}`,
`--entryPoints.tcp.forwardedHeaders.insecure=true`,
`--providers.http.endpoint=${otherTraefikEndpoint}?id=${id}&privatePort=${privatePort}&publicPort=${publicPort}&type=tcp&address=${dependentId}`, `--providers.http.endpoint=${otherTraefikEndpoint}?id=${id}&privatePort=${privatePort}&publicPort=${publicPort}&type=tcp&address=${dependentId}`,
'--providers.http.pollTimeout=2s', '--providers.http.pollTimeout=2s',
'--log.level=error' '--log.level=error'
@@ -257,6 +258,7 @@ export async function startTraefikHTTPProxy(
image: 'traefik:v2.6', image: 'traefik:v2.6',
command: [ command: [
`--entrypoints.http.address=:${publicPort}`, `--entrypoints.http.address=:${publicPort}`,
`--entryPoints.http.forwardedHeaders.insecure=true`,
`--providers.http.endpoint=${otherTraefikEndpoint}?id=${id}&privatePort=${privatePort}&publicPort=${publicPort}&type=http`, `--providers.http.endpoint=${otherTraefikEndpoint}?id=${id}&privatePort=${privatePort}&publicPort=${publicPort}&type=http`,
'--providers.http.pollTimeout=2s', '--providers.http.pollTimeout=2s',
'--certificatesresolvers.letsencrypt.acme.httpchallenge=true', '--certificatesresolvers.letsencrypt.acme.httpchallenge=true',
@@ -368,12 +370,12 @@ export async function startTraefikProxy(engine: string): Promise<void> {
--network coolify-infra \ --network coolify-infra \
-p "80:80" \ -p "80:80" \
-p "443:443" \ -p "443:443" \
-p "8080:8080" \
--name coolify-proxy \ --name coolify-proxy \
-d ${defaultTraefikImage} \ -d ${defaultTraefikImage} \
--api.insecure=true \
--entrypoints.web.address=:80 \ --entrypoints.web.address=:80 \
--entrypoints.web.forwardedHeaders.insecure=true \
--entrypoints.websecure.address=:443 \ --entrypoints.websecure.address=:443 \
--entrypoints.websecure.forwardedHeaders.insecure=true \
--providers.docker=true \ --providers.docker=true \
--providers.docker.exposedbydefault=false \ --providers.docker.exposedbydefault=false \
--providers.http.endpoint=${mainTraefikEndpoint} \ --providers.http.endpoint=${mainTraefikEndpoint} \

View File

@@ -49,7 +49,7 @@ export default async function ({
applicationId applicationId
}); });
await asyncExecShell( await asyncExecShell(
`GIT_SSH_COMMAND='ssh -o StrictHostKeyChecking=no' git clone -q -b ${branch} https://x-access-token:${token}@${url}/${repository}.git ${workdir}/ && cd ${workdir} && git submodule update --init --recursive && git lfs pull && cd .. ` `git clone -q -b ${branch} https://x-access-token:${token}@${url}/${repository}.git ${workdir}/ && cd ${workdir} && git submodule update --init --recursive && git lfs pull && cd .. `
); );
const { stdout: commit } = await asyncExecShell(`cd ${workdir}/ && git rev-parse HEAD`); const { stdout: commit } = await asyncExecShell(`cd ${workdir}/ && git rev-parse HEAD`);
return commit.replace('\n', ''); return commit.replace('\n', '');

View File

@@ -31,7 +31,7 @@ export default async function ({
}); });
await asyncExecShell( await asyncExecShell(
`GIT_SSH_COMMAND='ssh -o StrictHostKeyChecking=no' git clone -q -b ${branch} git@${url}:${repository}.git --config core.sshCommand="ssh -q -i ${repodir}id.rsa -o StrictHostKeyChecking=no" ${workdir}/ && cd ${workdir}/ && git submodule update --init --recursive && git lfs pull && cd .. ` `git clone -q -b ${branch} git@${url}:${repository}.git --config core.sshCommand="ssh -q -i ${repodir}id.rsa -o StrictHostKeyChecking=no" ${workdir}/ && cd ${workdir}/ && git submodule update --init --recursive && git lfs pull && cd .. `
); );
const { stdout: commit } = await asyncExecShell(`cd ${workdir}/ && git rev-parse HEAD`); const { stdout: commit } = await asyncExecShell(`cd ${workdir}/ && git rev-parse HEAD`);
return commit.replace('\n', ''); return commit.replace('\n', '');

View File

@@ -1,6 +1,7 @@
<script lang="ts"> <script lang="ts">
export let application; export let application;
export let appId; export let appId;
import Select from 'svelte-select';
import { page, session } from '$app/stores'; import { page, session } from '$app/stores';
import { onMount } from 'svelte'; import { onMount } from 'svelte';
import { errorNotification } from '$lib/form'; import { errorNotification } from '$lib/form';
@@ -33,6 +34,10 @@
let showSave = false; let showSave = false;
let autodeploy = application.settings.autodeploy || true; let autodeploy = application.settings.autodeploy || true;
let search = {
project: '',
branch: ''
};
let selected = { let selected = {
group: undefined, group: undefined,
project: undefined, project: undefined,
@@ -84,16 +89,49 @@
}, 100); }, 100);
} }
function selectGroup(event) {
selected.group = event.detail;
selected.project = null;
selected.branch = null;
showSave = false;
loadProjects();
}
async function searchProjects(searchText) {
if (!selected.group) {
return;
}
search.project = searchText;
await loadProjects();
return projects;
}
function selectProject(event) {
selected.project = event.detail;
selected.branch = null;
showSave = false;
loadBranches();
}
async function loadProjects() { async function loadProjects() {
const params = new URLSearchParams({
page: 1,
per_page: 25,
archived: false
});
if (search.project) {
params.append('search', search.project);
}
loading.projects = true; loading.projects = true;
if (username === selected.group.name) { if (username === selected.group.name) {
try { try {
projects = await get( params.append('min_access_level', 40);
`${apiUrl}/v4/users/${selected.group.name}/projects?min_access_level=40&page=1&per_page=25&archived=false`, projects = await get(`${apiUrl}/v4/users/${selected.group.name}/projects?${params}`, {
{ Authorization: `Bearer ${$gitTokens.gitlabToken}`
Authorization: `Bearer ${$gitTokens.gitlabToken}` });
}
);
} catch (error) { } catch (error) {
errorNotification(error); errorNotification(error);
throw new Error(error); throw new Error(error);
@@ -102,12 +140,9 @@
} }
} else { } else {
try { try {
projects = await get( projects = await get(`${apiUrl}/v4/groups/${selected.group.id}/projects?${params}`, {
`${apiUrl}/v4/groups/${selected.group.id}/projects?page=1&per_page=25&archived=false`, Authorization: `Bearer ${$gitTokens.gitlabToken}`
{ });
Authorization: `Bearer ${$gitTokens.gitlabToken}`
}
);
} catch (error) { } catch (error) {
errorNotification(error); errorNotification(error);
throw new Error(error); throw new Error(error);
@@ -117,11 +152,35 @@
} }
} }
async function searchBranches(searchText) {
if (!selected.project) {
return;
}
search.branch = searchText;
await loadBranches();
return branches;
}
function selectBranch(event) {
selected.branch = event.detail;
isBranchAlreadyUsed();
}
async function loadBranches() { async function loadBranches() {
const params = new URLSearchParams({
page: 1,
per_page: 100
});
if (search.branch) {
params.append('search', search.branch);
}
loading.branches = true; loading.branches = true;
try { try {
branches = await get( branches = await get(
`${apiUrl}/v4/projects/${selected.project.id}/repository/branches?per_page=100&page=1`, `${apiUrl}/v4/projects/${selected.project.id}/repository/branches?${params}`,
{ {
Authorization: `Bearer ${$gitTokens.gitlabToken}` Authorization: `Bearer ${$gitTokens.gitlabToken}`
} }
@@ -267,70 +326,79 @@
<form on:submit={handleSubmit}> <form on:submit={handleSubmit}>
<div class="flex flex-col space-y-2 px-4 xl:flex-row xl:space-y-0 xl:space-x-2 "> <div class="flex flex-col space-y-2 px-4 xl:flex-row xl:space-y-0 xl:space-x-2 ">
{#if loading.base} <div class="custom-select-wrapper">
<select name="group" disabled class="w-96"> <Select
<option selected value="">{$t('application.configuration.loading_groups')}</option> placeholder={loading.base
</select> ? $t('application.configuration.loading_groups')
{:else} : $t('application.configuration.select_a_group')}
<select name="group" class="w-96" bind:value={selected.group} on:change={loadProjects}> id="group"
<option value="" disabled selected>{$t('application.configuration.select_a_group')}</option> showIndicator={!loading.base}
{#each groups as group} isWaiting={loading.base}
<option value={group}>{group.full_name}</option> on:select={selectGroup}
{/each} on:clear={() => {
</select> showSave = false;
{/if} projects = [];
{#if loading.projects} branches = [];
<select name="project" disabled class="w-96"> selected.group = null;
<option selected value="">{$t('application.configuration.loading_projects')}</option> selected.project = null;
</select> selected.branch = null;
{:else if !loading.projects && projects.length > 0} }}
<select value={selected.group}
name="project" isDisabled={loading.base}
class="w-96" isClearable={false}
bind:value={selected.project} items={groups}
on:change={loadBranches} labelIdentifier="full_name"
disabled={!selected.group} optionIdentifier="id"
> />
<option value="" disabled selected </div>
>{$t('application.configuration.select_a_project')}</option <div class="custom-select-wrapper">
> <Select
{#each projects as project} placeholder={loading.projects
<option value={project}>{project.name}</option> ? $t('application.configuration.loading_projects')
{/each} : $t('application.configuration.select_a_project')}
</select> noOptionsMessage={$t('application.configuration.no_projects_found')}
{:else} id="project"
<select name="project" disabled class="w-96"> showIndicator={!loading.projects}
<option disabled selected value="" isWaiting={loading.projects}
>{$t('application.configuration.no_projects_found')}</option isDisabled={loading.projects || !selected.group}
> on:select={selectProject}
</select> on:clear={() => {
{/if} showSave = false;
branches = [];
{#if loading.branches} selected.project = null;
<select name="branch" disabled class="w-96"> selected.branch = null;
<option selected value="">{$t('application.configuration.loading_branches')}</option> }}
</select> value={selected.project}
{:else if !loading.branches && branches.length > 0} isClearable={false}
<select items={projects}
name="branch" loadOptions={searchProjects}
class="w-96" labelIdentifier="name"
bind:value={selected.branch} optionIdentifier="id"
on:change={isBranchAlreadyUsed} />
disabled={!selected.project} </div>
> <div class="custom-select-wrapper">
<option value="" disabled selected>{$t('application.configuration.select_a_branch')}</option <Select
> placeholder={loading.branches
{#each branches as branch} ? $t('application.configuration.loading_branches')
<option value={branch}>{branch.name}</option> : $t('application.configuration.select_a_branch')}
{/each} noOptionsMessage={$t('application.configuration.no_branches_found')}
</select> id="branch"
{:else} showIndicator={!loading.branches}
<select name="project" disabled class="w-96"> isWaiting={loading.branches}
<option disabled selected value="" isDisabled={loading.branches || !selected.project}
>{$t('application.configuration.no_branches_found')}</option on:select={selectBranch}
> on:clear={() => {
</select> showSave = false;
{/if} selected.branch = null;
}}
value={selected.branch}
isClearable={false}
items={branches}
loadOptions={searchBranches}
labelIdentifier="name"
optionIdentifier="web_url"
/>
</div>
</div> </div>
<div class="flex flex-col items-center justify-center space-y-4 pt-5"> <div class="flex flex-col items-center justify-center space-y-4 pt-5">
<button <button

View File

@@ -10,7 +10,6 @@
} }
const endpoint = `/applications/${params.id}.json`; const endpoint = `/applications/${params.id}.json`;
const res = await fetch(endpoint); const res = await fetch(endpoint);
if (res.ok) { if (res.ok) {
return { return {
props: { props: {
@@ -18,7 +17,6 @@
} }
}; };
} }
return { return {
status: res.status, status: res.status,
error: new Error(`Could not load ${endpoint}`) error: new Error(`Could not load ${endpoint}`)
@@ -39,7 +37,6 @@
import { errorNotification } from '$lib/form'; import { errorNotification } from '$lib/form';
import { onDestroy, onMount } from 'svelte'; import { onDestroy, onMount } from 'svelte';
import Select from 'svelte-select'; import Select from 'svelte-select';
import Explainer from '$lib/components/Explainer.svelte'; import Explainer from '$lib/components/Explainer.svelte';
import Setting from '$lib/components/Setting.svelte'; import Setting from '$lib/components/Setting.svelte';
import type Prisma from '@prisma/client'; import type Prisma from '@prisma/client';
@@ -51,9 +48,7 @@
import { disabledButton, status } from '$lib/store'; import { disabledButton, status } from '$lib/store';
import { t } from '$lib/translations'; import { t } from '$lib/translations';
const { id } = $page.params; const { id } = $page.params;
let domainEl: HTMLInputElement; let domainEl: HTMLInputElement;
let loading = false; let loading = false;
let usageLoading = false; let usageLoading = false;
@@ -69,12 +64,12 @@
let previews = application.settings.previews; let previews = application.settings.previews;
let dualCerts = application.settings.dualCerts; let dualCerts = application.settings.dualCerts;
let autodeploy = application.settings.autodeploy; let autodeploy = application.settings.autodeploy;
let nonWWWDomain = application.fqdn && getDomain(application.fqdn).replace(/^www\./, ''); let nonWWWDomain = application.fqdn && getDomain(application.fqdn).replace(/^www\./, '');
let isNonWWWDomainOK = false; let isNonWWWDomainOK = false;
let isWWWDomainOK = false; let isWWWDomainOK = false;
$: isDisabled = !$session.isAdmin || $status.application.isRunning; $: isDisabled = !$session.isAdmin || $status.application.isRunning;
let wsgis = [ let wsgis = [
{ {
value: 'None', value: 'None',
@@ -83,6 +78,10 @@
{ {
value: 'Gunicorn', value: 'Gunicorn',
label: 'Gunicorn' label: 'Gunicorn'
},
{
value: 'Uvicorn',
label: 'Uvicorn'
} }
]; ];
function containerClass() { function containerClass() {
@@ -102,7 +101,7 @@
onMount(async () => { onMount(async () => {
if (browser && window.location.hostname === 'demo.coolify.io' && !application.fqdn) { if (browser && window.location.hostname === 'demo.coolify.io' && !application.fqdn) {
application.fqdn = `http://${cuid()}.demo.coolify.io`; application.fqdn = `http://${cuid()}.demo.coolify.io`;
await post(`/applications/${id}.json`, { ...application }); await handleSubmit();
} }
domainEl.focus(); domainEl.focus();
await getUsage(); await getUsage();
@@ -110,7 +109,6 @@
await getUsage(); await getUsage();
}, 1000); }, 1000);
}); });
async function changeSettings(name) { async function changeSettings(name) {
if (name === 'debug') { if (name === 'debug') {
debug = !debug; debug = !debug;
@@ -196,7 +194,6 @@
application.baseBuildImage = event.detail.value; application.baseBuildImage = event.detail.value;
await handleSubmit(); await handleSubmit();
} }
async function isDNSValid(domain, isWWW) { async function isDNSValid(domain, isWWW) {
try { try {
await get(`/applications/${id}/check.json?domain=${domain}`); await get(`/applications/${id}/check.json?domain=${domain}`);
@@ -218,7 +215,6 @@
</div> </div>
<span class="text-xs">{application.name} </span> <span class="text-xs">{application.name} </span>
</div> </div>
{#if application.fqdn} {#if application.fqdn}
<a <a
href={application.fqdn} href={application.fqdn}
@@ -433,7 +429,6 @@
<label for="baseBuildImage" class="text-base font-bold text-stone-100" <label for="baseBuildImage" class="text-base font-bold text-stone-100"
>{$t('application.base_build_image')}</label >{$t('application.base_build_image')}</label
> >
<div class="custom-select-wrapper"> <div class="custom-select-wrapper">
<Select <Select
{isDisabled} {isDisabled}
@@ -530,12 +525,11 @@
</div> </div>
{#if application.buildPack === 'python'} {#if application.buildPack === 'python'}
<div class="grid grid-cols-2 items-center"> <div class="grid grid-cols-2 items-center">
<label for="pythonModule" class="text-base font-bold text-stone-100">WSGI</label> <label for="pythonModule" class="text-base font-bold text-stone-100">WSGI / ASGI</label>
<div class="custom-select-wrapper"> <div class="custom-select-wrapper">
<Select id="wsgi" items={wsgis} on:select={selectWSGI} value={application.pythonWSGI} /> <Select id="wsgi" items={wsgis} on:select={selectWSGI} value={application.pythonWSGI} />
</div> </div>
</div> </div>
<div class="grid grid-cols-2 items-center"> <div class="grid grid-cols-2 items-center">
<label for="pythonModule" class="text-base font-bold text-stone-100">Module</label> <label for="pythonModule" class="text-base font-bold text-stone-100">Module</label>
<input <input
@@ -544,7 +538,7 @@
id="pythonModule" id="pythonModule"
required required
bind:value={application.pythonModule} bind:value={application.pythonModule}
placeholder={application.pythonWSGI?.toLowerCase() !== 'gunicorn' ? 'main.py' : 'main'} placeholder={application.pythonWSGI?.toLowerCase() !== 'none' ? 'main' : 'main.py'}
/> />
</div> </div>
{#if application.pythonWSGI?.toLowerCase() === 'gunicorn'} {#if application.pythonWSGI?.toLowerCase() === 'gunicorn'}
@@ -560,6 +554,19 @@
/> />
</div> </div>
{/if} {/if}
{#if application.pythonWSGI?.toLowerCase() === 'uvicorn'}
<div class="grid grid-cols-2 items-center">
<label for="pythonVariable" class="text-base font-bold text-stone-100">Variable</label>
<input
readonly={!$session.isAdmin}
name="pythonVariable"
id="pythonVariable"
required
bind:value={application.pythonVariable}
placeholder="default: app"
/>
</div>
{/if}
{/if} {/if}
{#if !staticDeployments.includes(application.buildPack)} {#if !staticDeployments.includes(application.buildPack)}
<div class="grid grid-cols-2 items-center"> <div class="grid grid-cols-2 items-center">
@@ -694,7 +701,6 @@
> >
<Explainer text={$t('application.publish_directory_explainer')} /> <Explainer text={$t('application.publish_directory_explainer')} />
</div> </div>
<input <input
readonly={!$session.isAdmin} readonly={!$session.isAdmin}
name="publishDirectory" name="publishDirectory"

View File

@@ -188,7 +188,7 @@
{/each} {/each}
{:else} {:else}
<div class="flex-col"> <div class="flex-col">
<div class="text-center font-bold text-xl"> <div class="text-center text-xl font-bold">
{$t('application.preview.no_previews_available')} {$t('application.preview.no_previews_available')}
</div> </div>
</div> </div>

View File

@@ -152,9 +152,19 @@
</div> </div>
<div class="grid grid-cols-2 items-center"> <div class="grid grid-cols-2 items-center">
<label for="version" class="text-base font-bold text-stone-100">{$t('forms.version')}</label <label for="version" class="text-base font-bold text-stone-100">Version / Tag</label>
<a
href={$session.isAdmin && !isRunning
? `/databases/${id}/configuration/version?from=/databases/${id}`
: ''}
class="no-underline"
>
<input
value={database.version}
disabled={isRunning}
class:cursor-pointer={!isRunning}
/></a
> >
<input value={database.version} readonly disabled class="bg-transparent " />
</div> </div>
</div> </div>

View File

@@ -50,7 +50,14 @@
<div class="flex space-x-1 p-6 font-bold"> <div class="flex space-x-1 p-6 font-bold">
<div class="mr-4 text-2xl tracking-tight">{$t('database.select_database_version')}</div> <div class="mr-4 text-2xl tracking-tight">{$t('database.select_database_version')}</div>
</div> </div>
{#if from}
<div class="pb-10 text-center">
Warning: you are about to change the version of this database.<br />This could cause problem
after you restart the database,
<span class="font-bold text-pink-600">like losing your data, incompatibility issues, etc</span
>.<br />Only do if you know what you are doing!
</div>
{/if}
<div class="flex flex-wrap justify-center"> <div class="flex flex-wrap justify-center">
{#each versions as version} {#each versions as version}
<div class="p-2"> <div class="p-2">

View File

@@ -12,7 +12,7 @@ export const del: RequestHandler = async (event) => {
const database = await db.getDatabase({ id, teamId }); const database = await db.getDatabase({ id, teamId });
if (database.destinationDockerId) { if (database.destinationDockerId) {
const everStarted = await stopDatabase(database); const everStarted = await stopDatabase(database);
if (everStarted) await stopTcpHttpProxy(database.destinationDocker, database.publicPort); if (everStarted) await stopTcpHttpProxy(id, database.destinationDocker, database.publicPort);
} }
await db.removeDatabase({ id }); await db.removeDatabase({ id });
return { status: 200 }; return { status: 200 };

View File

@@ -29,7 +29,7 @@ export const post: RequestHandler = async (event) => {
} }
} else { } else {
await db.prisma.database.update({ where: { id }, data: { publicPort: null } }); await db.prisma.database.update({ where: { id }, data: { publicPort: null } });
await stopTcpHttpProxy(destinationDocker, oldPublicPort); await stopTcpHttpProxy(id, destinationDocker, oldPublicPort);
} }
} }
return { return {

View File

@@ -13,7 +13,7 @@ export const post: RequestHandler = async (event) => {
try { try {
const database = await db.getDatabase({ id, teamId }); const database = await db.getDatabase({ id, teamId });
const everStarted = await stopDatabase(database); const everStarted = await stopDatabase(database);
if (everStarted) await stopTcpHttpProxy(database.destinationDocker, database.publicPort); if (everStarted) await stopTcpHttpProxy(id, database.destinationDocker, database.publicPort);
await db.setDatabase({ id, isPublic: false }); await db.setDatabase({ id, isPublic: false });
await db.prisma.database.update({ where: { id }, data: { publicPort: null } }); await db.prisma.database.update({ where: { id }, data: { publicPort: null } });
@@ -21,6 +21,7 @@ export const post: RequestHandler = async (event) => {
status: 200 status: 200
}; };
} catch (error) { } catch (error) {
console.log(error);
return ErrorHandler(error); return ErrorHandler(error);
} }
}; };

View File

@@ -74,7 +74,23 @@
onMount(async () => { onMount(async () => {
if (browser && window.location.hostname === 'demo.coolify.io' && !service.fqdn) { if (browser && window.location.hostname === 'demo.coolify.io' && !service.fqdn) {
service.fqdn = `http://${cuid()}.demo.coolify.io`; service.fqdn = `http://${cuid()}.demo.coolify.io`;
await post(`/services/${id}/${service.type}.json`, { ...service }); if (service.type === 'wordpress') {
service.wordpress.mysqlDatabase = 'db';
}
if (service.type === 'plausibleanalytics') {
service.plausibleAnalytics.email = 'noreply@demo.com';
service.plausibleAnalytics.username = 'admin';
}
if (service.type === 'minio') {
service.minio.apiFqdn = `http://${cuid()}.demo.coolify.io`;
}
if (service.type === 'ghost') {
service.ghost.mariadbDatabase = 'db';
}
if (service.type === 'fider') {
service.fider.emailNoreply = 'noreply@demo.com';
}
await handleSubmit();
} }
}); });
</script> </script>
@@ -124,7 +140,7 @@
<div class="grid grid-cols-2 items-center px-10"> <div class="grid grid-cols-2 items-center px-10">
<label for="version" class="text-base font-bold text-stone-100">Version / Tag</label> <label for="version" class="text-base font-bold text-stone-100">Version / Tag</label>
<a <a
href={$session.isAdmin href={$session.isAdmin && !isRunning
? `/services/${id}/configuration/version?from=/services/${id}` ? `/services/${id}/configuration/version?from=/services/${id}`
: ''} : ''}
class="no-underline" class="no-underline"
@@ -132,8 +148,8 @@
<input <input
value={service.version} value={service.version}
id="service" id="service"
disabled disabled={isRunning}
class="cursor-pointer hover:bg-coolgray-500" class:cursor-pointer={!isRunning}
/></a /></a
> >
</div> </div>

View File

@@ -59,7 +59,7 @@ export const post: RequestHandler = async (event) => {
fider: { fider: {
image: `${image}:${version}`, image: `${image}:${version}`,
environmentVariables: { environmentVariables: {
HOST_DOMAIN: domain, BASE_URL: domain,
DATABASE_URL: `postgresql://${postgresqlUser}:${postgresqlPassword}@${id}-postgresql:5432/${postgresqlDatabase}?sslmode=disable`, DATABASE_URL: `postgresql://${postgresqlUser}:${postgresqlPassword}@${id}-postgresql:5432/${postgresqlDatabase}?sslmode=disable`,
JWT_SECRET: `${jwtSecret.replace(/\$/g, '$$$')}`, JWT_SECRET: `${jwtSecret.replace(/\$/g, '$$$')}`,
EMAIL_NOREPLY: emailNoreply, EMAIL_NOREPLY: emailNoreply,

View File

@@ -27,6 +27,7 @@ export const post: RequestHandler = async (event) => {
const config = { const config = {
image: `${image}:${version}`, image: `${image}:${version}`,
volume: `${id}-nc:/usr/app/data`,
environmentVariables: {} environmentVariables: {}
}; };
if (serviceSecret.length > 0) { if (serviceSecret.length > 0) {
@@ -41,6 +42,7 @@ export const post: RequestHandler = async (event) => {
container_name: id, container_name: id,
image: config.image, image: config.image,
networks: [network], networks: [network],
volumes: [config.volume],
environment: config.environmentVariables, environment: config.environmentVariables,
restart: 'always', restart: 'always',
...(exposePort ? { ports: [`${exposePort}:${port}`] } : {}), ...(exposePort ? { ports: [`${exposePort}:${port}`] } : {}),
@@ -59,6 +61,11 @@ export const post: RequestHandler = async (event) => {
[network]: { [network]: {
external: true external: true
} }
},
volumes: {
[config.volume.split(':')[0]]: {
name: config.volume.split(':')[0]
}
} }
}; };
const composeFileDestination = `${workdir}/docker-compose.yaml`; const composeFileDestination = `${workdir}/docker-compose.yaml`;

View File

@@ -6,7 +6,6 @@ import * as db from '$lib/database';
import type { RequestHandler } from '@sveltejs/kit'; import type { RequestHandler } from '@sveltejs/kit';
import compare from 'compare-versions'; import compare from 'compare-versions';
import got from 'got'; import got from 'got';
import { checkContainer, startCoolifyProxy, startTraefikProxy } from '$lib/haproxy';
export const get: RequestHandler = async (request) => { export const get: RequestHandler = async (request) => {
try { try {

View File

@@ -7,7 +7,7 @@ import { checkContainer } from '$lib/haproxy';
import type { RequestHandler } from '@sveltejs/kit'; import type { RequestHandler } from '@sveltejs/kit';
function configureMiddleware( function configureMiddleware(
{ id, container, port, domain, nakedDomain, isHttps, isWWW, isDualCerts }, { id, container, port, domain, nakedDomain, isHttps, isWWW, isDualCerts, scriptName, type },
traefik traefik
) { ) {
if (isHttps) { if (isHttps) {
@@ -125,6 +125,15 @@ function configureMiddleware(
} }
} }
} }
if (type === 'plausibleanalytics' && scriptName && scriptName !== 'plausible.js') {
if (!traefik.http.routers[`${id}`].middlewares.includes(`${id}-redir`)) {
traefik.http.routers[`${id}`].middlewares.push(`${id}-redir`);
}
if (!traefik.http.routers[`${id}-secure`].middlewares.includes(`${id}-redir`)) {
traefik.http.routers[`${id}-secure`].middlewares.push(`${id}-redir`);
}
}
} }
export const get: RequestHandler = async (event) => { export const get: RequestHandler = async (event) => {
const traefik = { const traefik = {
@@ -176,7 +185,7 @@ export const get: RequestHandler = async (event) => {
} = application; } = application;
if (destinationDockerId) { if (destinationDockerId) {
const { engine, network } = destinationDocker; const { engine, network } = destinationDocker;
const isRunning = await checkContainer(engine, id); const isRunning = true;
if (fqdn) { if (fqdn) {
const domain = getDomain(fqdn); const domain = getDomain(fqdn);
const nakedDomain = domain.replace(/^www\./, ''); const nakedDomain = domain.replace(/^www\./, '');
@@ -244,7 +253,7 @@ export const get: RequestHandler = async (event) => {
if (found) { if (found) {
const port = found.ports.main; const port = found.ports.main;
const publicPort = service[type]?.publicPort; const publicPort = service[type]?.publicPort;
const isRunning = await checkContainer(engine, id); const isRunning = true;
if (fqdn) { if (fqdn) {
const domain = getDomain(fqdn); const domain = getDomain(fqdn);
const nakedDomain = domain.replace(/^www\./, ''); const nakedDomain = domain.replace(/^www\./, '');
@@ -335,11 +344,6 @@ export const get: RequestHandler = async (event) => {
replacement: '/js/plausible.js' replacement: '/js/plausible.js'
} }
}; };
if (traefik.http.routers[id].middlewares.length > 0) {
traefik.http.routers[id].middlewares.push(`${id}-redir`);
} else {
traefik.http.routers[id].middlewares = [`${id}-redir`];
}
} }
} }
for (const coolify of data.coolify) { for (const coolify of data.coolify) {