mirror of
https://github.com/hcengineering/platform.git
synced 2024-11-26 04:23:58 +03:00
parent
56d764d451
commit
b3e516beb4
@ -104,6 +104,7 @@ specifiers:
|
|||||||
'@rush-temp/platform': file:./projects/platform.tgz
|
'@rush-temp/platform': file:./projects/platform.tgz
|
||||||
'@rush-temp/platform-rig': file:./projects/platform-rig.tgz
|
'@rush-temp/platform-rig': file:./projects/platform-rig.tgz
|
||||||
'@rush-temp/pod-account': file:./projects/pod-account.tgz
|
'@rush-temp/pod-account': file:./projects/pod-account.tgz
|
||||||
|
'@rush-temp/pod-backup': file:./projects/pod-backup.tgz
|
||||||
'@rush-temp/preference': file:./projects/preference.tgz
|
'@rush-temp/preference': file:./projects/preference.tgz
|
||||||
'@rush-temp/preference-assets': file:./projects/preference-assets.tgz
|
'@rush-temp/preference-assets': file:./projects/preference-assets.tgz
|
||||||
'@rush-temp/presentation': file:./projects/presentation.tgz
|
'@rush-temp/presentation': file:./projects/presentation.tgz
|
||||||
@ -386,6 +387,7 @@ dependencies:
|
|||||||
'@rush-temp/platform': file:projects/platform.tgz
|
'@rush-temp/platform': file:projects/platform.tgz
|
||||||
'@rush-temp/platform-rig': file:projects/platform-rig.tgz_6fa5d152813644f44d2852d983dc9002
|
'@rush-temp/platform-rig': file:projects/platform-rig.tgz_6fa5d152813644f44d2852d983dc9002
|
||||||
'@rush-temp/pod-account': file:projects/pod-account.tgz
|
'@rush-temp/pod-account': file:projects/pod-account.tgz
|
||||||
|
'@rush-temp/pod-backup': file:projects/pod-backup.tgz
|
||||||
'@rush-temp/preference': file:projects/preference.tgz
|
'@rush-temp/preference': file:projects/preference.tgz
|
||||||
'@rush-temp/preference-assets': file:projects/preference-assets.tgz
|
'@rush-temp/preference-assets': file:projects/preference-assets.tgz
|
||||||
'@rush-temp/presentation': file:projects/presentation.tgz_3b42a51b6c974062237d417c554d9dd7
|
'@rush-temp/presentation': file:projects/presentation.tgz_3b42a51b6c974062237d417c554d9dd7
|
||||||
@ -3162,7 +3164,7 @@ packages:
|
|||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
/assert-plus/1.0.0:
|
/assert-plus/1.0.0:
|
||||||
resolution: {integrity: sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=}
|
resolution: {integrity: sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==}
|
||||||
engines: {node: '>=0.8'}
|
engines: {node: '>=0.8'}
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
@ -3242,7 +3244,7 @@ packages:
|
|||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
/aws-sign2/0.7.0:
|
/aws-sign2/0.7.0:
|
||||||
resolution: {integrity: sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=}
|
resolution: {integrity: sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==}
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
/aws4/1.11.0:
|
/aws4/1.11.0:
|
||||||
@ -3371,7 +3373,7 @@ packages:
|
|||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
/bcrypt-pbkdf/1.0.2:
|
/bcrypt-pbkdf/1.0.2:
|
||||||
resolution: {integrity: sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=}
|
resolution: {integrity: sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==}
|
||||||
dependencies:
|
dependencies:
|
||||||
tweetnacl: 0.14.5
|
tweetnacl: 0.14.5
|
||||||
dev: false
|
dev: false
|
||||||
@ -3699,7 +3701,7 @@ packages:
|
|||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
/caseless/0.12.0:
|
/caseless/0.12.0:
|
||||||
resolution: {integrity: sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=}
|
resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==}
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
/chalk/2.4.2:
|
/chalk/2.4.2:
|
||||||
@ -4179,7 +4181,7 @@ packages:
|
|||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
/dashdash/1.14.1:
|
/dashdash/1.14.1:
|
||||||
resolution: {integrity: sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=}
|
resolution: {integrity: sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==}
|
||||||
engines: {node: '>=0.10'}
|
engines: {node: '>=0.10'}
|
||||||
dependencies:
|
dependencies:
|
||||||
assert-plus: 1.0.0
|
assert-plus: 1.0.0
|
||||||
@ -4496,7 +4498,7 @@ packages:
|
|||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
/ecc-jsbn/0.1.2:
|
/ecc-jsbn/0.1.2:
|
||||||
resolution: {integrity: sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=}
|
resolution: {integrity: sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==}
|
||||||
dependencies:
|
dependencies:
|
||||||
jsbn: 0.1.1
|
jsbn: 0.1.1
|
||||||
safer-buffer: 2.1.2
|
safer-buffer: 2.1.2
|
||||||
@ -5274,7 +5276,7 @@ packages:
|
|||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
/extsprintf/1.3.0:
|
/extsprintf/1.3.0:
|
||||||
resolution: {integrity: sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=}
|
resolution: {integrity: sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==}
|
||||||
engines: {'0': node >=0.6.0}
|
engines: {'0': node >=0.6.0}
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
@ -5492,7 +5494,7 @@ packages:
|
|||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
/forever-agent/0.6.1:
|
/forever-agent/0.6.1:
|
||||||
resolution: {integrity: sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=}
|
resolution: {integrity: sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==}
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
/form-data/2.3.3:
|
/form-data/2.3.3:
|
||||||
@ -5633,7 +5635,7 @@ packages:
|
|||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
/getpass/0.1.7:
|
/getpass/0.1.7:
|
||||||
resolution: {integrity: sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=}
|
resolution: {integrity: sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==}
|
||||||
dependencies:
|
dependencies:
|
||||||
assert-plus: 1.0.0
|
assert-plus: 1.0.0
|
||||||
dev: false
|
dev: false
|
||||||
@ -5733,7 +5735,7 @@ packages:
|
|||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
/har-schema/2.0.0:
|
/har-schema/2.0.0:
|
||||||
resolution: {integrity: sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=}
|
resolution: {integrity: sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==}
|
||||||
engines: {node: '>=4'}
|
engines: {node: '>=4'}
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
@ -5983,7 +5985,7 @@ packages:
|
|||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
/http-signature/1.2.0:
|
/http-signature/1.2.0:
|
||||||
resolution: {integrity: sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=}
|
resolution: {integrity: sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==}
|
||||||
engines: {node: '>=0.8', npm: '>=1.3.7'}
|
engines: {node: '>=0.8', npm: '>=1.3.7'}
|
||||||
dependencies:
|
dependencies:
|
||||||
assert-plus: 1.0.0
|
assert-plus: 1.0.0
|
||||||
@ -6371,7 +6373,7 @@ packages:
|
|||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
/isstream/0.1.2:
|
/isstream/0.1.2:
|
||||||
resolution: {integrity: sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=}
|
resolution: {integrity: sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==}
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
/istanbul-lib-coverage/3.2.0:
|
/istanbul-lib-coverage/3.2.0:
|
||||||
@ -6923,7 +6925,7 @@ packages:
|
|||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
/jsbn/0.1.1:
|
/jsbn/0.1.1:
|
||||||
resolution: {integrity: sha1-peZUwuWi3rXyAdls77yoDA7y9RM=}
|
resolution: {integrity: sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==}
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
/jsdom/16.7.0:
|
/jsdom/16.7.0:
|
||||||
@ -7007,7 +7009,7 @@ packages:
|
|||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
/json-stringify-safe/5.0.1:
|
/json-stringify-safe/5.0.1:
|
||||||
resolution: {integrity: sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=}
|
resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==}
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
/json5/0.5.1:
|
/json5/0.5.1:
|
||||||
@ -13045,6 +13047,37 @@ packages:
|
|||||||
- supports-color
|
- supports-color
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
|
file:projects/pod-backup.tgz:
|
||||||
|
resolution: {integrity: sha512-DMl1JkvmMx9OJgpA9yGV0OOqpGBDDRCdiyrnk+cBr519KYLSkhakYULl7qvejWgP7eSAKs+ZVTOqBg8rCMKzyg==, tarball: file:projects/pod-backup.tgz}
|
||||||
|
name: '@rush-temp/pod-backup'
|
||||||
|
version: 0.0.0
|
||||||
|
dependencies:
|
||||||
|
'@rushstack/heft': 0.44.13
|
||||||
|
'@types/heft-jest': 1.0.2
|
||||||
|
'@types/minio': 7.0.13
|
||||||
|
'@types/node': 16.11.33
|
||||||
|
'@typescript-eslint/eslint-plugin': 5.22.0_27efc1da00e78084f5aa1809ff6483a1
|
||||||
|
'@typescript-eslint/parser': 5.22.0_eslint@7.32.0+typescript@4.6.4
|
||||||
|
cross-env: 7.0.3
|
||||||
|
dotenv: 16.0.0
|
||||||
|
esbuild: 0.12.29
|
||||||
|
eslint: 7.32.0
|
||||||
|
eslint-config-standard-with-typescript: 21.0.1_d91f81f4c73639e41ff8a6e8953d9ef2
|
||||||
|
eslint-plugin-import: 2.26.0_eslint@7.32.0
|
||||||
|
eslint-plugin-node: 11.1.0_eslint@7.32.0
|
||||||
|
eslint-plugin-promise: 5.2.0_eslint@7.32.0
|
||||||
|
got: 11.8.5
|
||||||
|
minio: 7.0.28
|
||||||
|
mongodb: 4.5.0
|
||||||
|
prettier: 2.6.2
|
||||||
|
ts-node: 10.5.0_fd4b5ff48b408bf425abfec4a641da13
|
||||||
|
typescript: 4.6.4
|
||||||
|
transitivePeerDependencies:
|
||||||
|
- '@swc/core'
|
||||||
|
- '@swc/wasm'
|
||||||
|
- supports-color
|
||||||
|
dev: false
|
||||||
|
|
||||||
file:projects/preference-assets.tgz:
|
file:projects/preference-assets.tgz:
|
||||||
resolution: {integrity: sha512-XMs/Zw64oLNq4NoRjxGI9vBIEdZrCXC8nHKW78fk7GYN+lXSvE4bSY3H8EFiBVAIL5i9F9bXK/VXZVUYAEY8Aw==, tarball: file:projects/preference-assets.tgz}
|
resolution: {integrity: sha512-XMs/Zw64oLNq4NoRjxGI9vBIEdZrCXC8nHKW78fk7GYN+lXSvE4bSY3H8EFiBVAIL5i9F9bXK/VXZVUYAEY8Aw==, tarball: file:projects/preference-assets.tgz}
|
||||||
name: '@rush-temp/preference-assets'
|
name: '@rush-temp/preference-assets'
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
roots='./server/server ./server/front ./pods/account ./products/tracker'
|
roots='./server/server ./server/front ./pods/account ./pods/backup ./products/tracker'
|
||||||
|
|
||||||
for r in $roots
|
for r in $roots
|
||||||
do
|
do
|
||||||
|
7
pods/backup/.eslintrc.js
Normal file
7
pods/backup/.eslintrc.js
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
module.exports = {
|
||||||
|
extends: ['./node_modules/@anticrm/platform-rig/profiles/default/config/eslint.config.json'],
|
||||||
|
parserOptions: {
|
||||||
|
tsconfigRootDir: __dirname,
|
||||||
|
project: './tsconfig.json'
|
||||||
|
}
|
||||||
|
}
|
4
pods/backup/.npmignore
Normal file
4
pods/backup/.npmignore
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
*
|
||||||
|
!/lib/**
|
||||||
|
!CHANGELOG.md
|
||||||
|
/lib/**/__tests__/
|
9
pods/backup/Dockerfile
Normal file
9
pods/backup/Dockerfile
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
|
||||||
|
FROM node
|
||||||
|
|
||||||
|
WORKDIR /usr/src/app
|
||||||
|
|
||||||
|
COPY bundle.js ./
|
||||||
|
|
||||||
|
EXPOSE 3000
|
||||||
|
CMD [ "node", "bundle.js" ]
|
19
pods/backup/build.sh
Executable file
19
pods/backup/build.sh
Executable file
@ -0,0 +1,19 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
#
|
||||||
|
# Copyright © 2022 Hardcore Engineering Inc.
|
||||||
|
#
|
||||||
|
# Licensed under the Eclipse Public License, Version 2.0 (the "License");
|
||||||
|
# you may not use this file except in compliance with the License. You may
|
||||||
|
# obtain a copy of the License at https://www.eclipse.org/legal/epl-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing, software
|
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
#
|
||||||
|
# See the License for the specific language governing permissions and
|
||||||
|
# limitations under the License.
|
||||||
|
#
|
||||||
|
|
||||||
|
rushx bundle
|
||||||
|
rushx docker:build
|
||||||
|
rushx docker:push
|
18
pods/backup/config/rig.json
Normal file
18
pods/backup/config/rig.json
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
// The "rig.json" file directs tools to look for their config files in an external package.
|
||||||
|
// Documentation for this system: https://www.npmjs.com/package/@rushstack/rig-package
|
||||||
|
{
|
||||||
|
"$schema": "https://developer.microsoft.com/json-schemas/rig-package/rig.schema.json",
|
||||||
|
|
||||||
|
/**
|
||||||
|
* (Required) The name of the rig package to inherit from.
|
||||||
|
* It should be an NPM package name with the "-rig" suffix.
|
||||||
|
*/
|
||||||
|
"rigPackageName": "@anticrm/platform-rig"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* (Optional) Selects a config profile from the rig package. The name must consist of
|
||||||
|
* lowercase alphanumeric words separated by hyphens, for example "sample-profile".
|
||||||
|
* If omitted, then the "default" profile will be used."
|
||||||
|
*/
|
||||||
|
// "rigProfile": "your-profile-name"
|
||||||
|
}
|
52
pods/backup/package.json
Normal file
52
pods/backup/package.json
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
{
|
||||||
|
"name": "@anticrm/pod-backup",
|
||||||
|
"version": "0.6.0",
|
||||||
|
"main": "lib/index.js",
|
||||||
|
"author": "Anticrm Platform Contributors",
|
||||||
|
"license": "EPL-2.0",
|
||||||
|
"scripts": {
|
||||||
|
"start": "ts-node src/index.ts",
|
||||||
|
"build": "heft build",
|
||||||
|
"build:watch": "tsc",
|
||||||
|
"lint:fix": "eslint --fix src",
|
||||||
|
"bundle": "esbuild src/index.ts --bundle --minify --platform=node > bundle.js",
|
||||||
|
"docker:build": "docker build -t hardcoreeng/backup .",
|
||||||
|
"docker:staging": "../../common/scripts/docker_tag.sh hardcoreeng/backup staging",
|
||||||
|
"docker:push": "../../common/scripts/docker_tag.sh hardcoreeng/backup",
|
||||||
|
"run-local": "cross-env ACCOUNTS_URL=http://localhost:3000/ SECRET=secret MINIO_ACCESS_KEY=minioadmin MINIO_SECRET_KEY=minioadmin MINIO_ENDPOINT=localhost TRANSACTOR_URL=ws:/localhost:3333 BUCKET_NAME=backups INTERVAL=30 ts-node src/index.ts",
|
||||||
|
"lint": "eslint src",
|
||||||
|
"format": "prettier --write src && eslint --fix src"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"cross-env": "~7.0.3",
|
||||||
|
"@anticrm/platform-rig": "~0.6.0",
|
||||||
|
"@types/heft-jest": "^1.0.2",
|
||||||
|
"@types/node": "~16.11.12",
|
||||||
|
"@typescript-eslint/eslint-plugin": "^5.21.0",
|
||||||
|
"eslint-plugin-import": "^2.25.3",
|
||||||
|
"eslint-plugin-promise": "^5.1.1",
|
||||||
|
"eslint-plugin-node": "^11.1.0",
|
||||||
|
"eslint": "^7.32.0",
|
||||||
|
"esbuild": "^0.12.26",
|
||||||
|
"@typescript-eslint/parser": "^5.4.0",
|
||||||
|
"eslint-config-standard-with-typescript": "^21.0.1",
|
||||||
|
"prettier": "^2.4.1",
|
||||||
|
"ts-node": "~10.5.0",
|
||||||
|
"@rushstack/heft": "^0.44.13",
|
||||||
|
"typescript": "^4.3.5",
|
||||||
|
"@types/minio": "~7.0.11"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"@anticrm/platform": "~0.6.6",
|
||||||
|
"mongodb": "^4.1.1",
|
||||||
|
"@anticrm/server-tool": "~0.6.0",
|
||||||
|
"@anticrm/server-token": "~0.6.0",
|
||||||
|
"@anticrm/client": "~0.6.2",
|
||||||
|
"@anticrm/client-resources": "~0.6.4",
|
||||||
|
"@anticrm/core": "~0.6.16",
|
||||||
|
"dotenv": "~16.0.0",
|
||||||
|
"got": "^11.8.3",
|
||||||
|
"@anticrm/server-backup": "~0.6.0",
|
||||||
|
"minio": "^7.0.26"
|
||||||
|
}
|
||||||
|
}
|
75
pods/backup/src/config.ts
Normal file
75
pods/backup/src/config.ts
Normal file
@ -0,0 +1,75 @@
|
|||||||
|
//
|
||||||
|
// Copyright © 2022 Hardcore Engineering Inc.
|
||||||
|
//
|
||||||
|
// Licensed under the Eclipse Public License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License. You may
|
||||||
|
// obtain a copy of the License at https://www.eclipse.org/legal/epl-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
//
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
//
|
||||||
|
|
||||||
|
interface Config {
|
||||||
|
TransactorURL: string
|
||||||
|
AccountsURL: string
|
||||||
|
ServiceID: string
|
||||||
|
Secret: string
|
||||||
|
|
||||||
|
Interval: number
|
||||||
|
BucketName: string
|
||||||
|
|
||||||
|
MinioEndpoint: string
|
||||||
|
MinioAccessKey: string
|
||||||
|
MinioSecretKey: string
|
||||||
|
}
|
||||||
|
|
||||||
|
const envMap: { [key in keyof Config]: string } = {
|
||||||
|
TransactorURL: 'TRANSACTOR_URL',
|
||||||
|
AccountsURL: 'ACCOUNTS_URL',
|
||||||
|
ServiceID: 'SERVICE_ID',
|
||||||
|
Secret: 'SECRET',
|
||||||
|
BucketName: 'BUCKET_NAME',
|
||||||
|
Interval: 'INTERVAL',
|
||||||
|
MinioEndpoint: 'MINIO_ENDPOINT',
|
||||||
|
MinioAccessKey: 'MINIO_ACCESS_KEY',
|
||||||
|
MinioSecretKey: 'MINIO_SECRET_KEY'
|
||||||
|
}
|
||||||
|
|
||||||
|
const required: Array<keyof Config> = [
|
||||||
|
'TransactorURL',
|
||||||
|
'AccountsURL',
|
||||||
|
'Secret',
|
||||||
|
'ServiceID',
|
||||||
|
'BucketName',
|
||||||
|
'MinioEndpoint',
|
||||||
|
'MinioAccessKey',
|
||||||
|
'MinioSecretKey'
|
||||||
|
]
|
||||||
|
|
||||||
|
const config: Config = (() => {
|
||||||
|
const params: Partial<Config> = {
|
||||||
|
TransactorURL: process.env[envMap.TransactorURL],
|
||||||
|
AccountsURL: process.env[envMap.AccountsURL],
|
||||||
|
Secret: process.env[envMap.Secret],
|
||||||
|
BucketName: process.env[envMap.BucketName],
|
||||||
|
ServiceID: process.env[envMap.ServiceID] ?? 'backup-service',
|
||||||
|
Interval: parseInt(process.env[envMap.Interval] ?? '3600'),
|
||||||
|
MinioEndpoint: process.env[envMap.MinioEndpoint],
|
||||||
|
MinioAccessKey: process.env[envMap.MinioAccessKey],
|
||||||
|
MinioSecretKey: process.env[envMap.MinioSecretKey]
|
||||||
|
}
|
||||||
|
|
||||||
|
const missingEnv = required.filter((key) => params[key] === undefined).map((key) => envMap[key])
|
||||||
|
|
||||||
|
if (missingEnv.length > 0) {
|
||||||
|
throw Error(`Missing env variables: ${missingEnv.join(', ')}`)
|
||||||
|
}
|
||||||
|
|
||||||
|
return params as Config
|
||||||
|
})()
|
||||||
|
|
||||||
|
export default config
|
36
pods/backup/src/index.ts
Normal file
36
pods/backup/src/index.ts
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
//
|
||||||
|
// Copyright © 2022 Hardcore Engineering Inc.
|
||||||
|
//
|
||||||
|
// Licensed under the Eclipse Public License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License. You may
|
||||||
|
// obtain a copy of the License at https://www.eclipse.org/legal/epl-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
//
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
//
|
||||||
|
|
||||||
|
import { PlatformWorker } from './platform'
|
||||||
|
|
||||||
|
const main = async (): Promise<void> => {
|
||||||
|
const platformWorker = await PlatformWorker.create()
|
||||||
|
|
||||||
|
const shutdown = (): void => {
|
||||||
|
void platformWorker.close().then(() => {
|
||||||
|
process.exit()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
process.on('SIGINT', shutdown)
|
||||||
|
process.on('SIGTERM', shutdown)
|
||||||
|
process.on('uncaughtException', (e) => {
|
||||||
|
console.error(e)
|
||||||
|
})
|
||||||
|
process.on('unhandledRejection', (e) => {
|
||||||
|
console.error(e)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
void main()
|
96
pods/backup/src/platform.ts
Normal file
96
pods/backup/src/platform.ts
Normal file
@ -0,0 +1,96 @@
|
|||||||
|
//
|
||||||
|
// Copyright © 2022 Hardcore Engineering Inc.
|
||||||
|
//
|
||||||
|
// Licensed under the Eclipse Public License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License. You may
|
||||||
|
// obtain a copy of the License at https://www.eclipse.org/legal/epl-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
//
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
//
|
||||||
|
|
||||||
|
import { setMetadata } from '@anticrm/platform'
|
||||||
|
import { backup, createMinioBackupStorage } from '@anticrm/server-backup'
|
||||||
|
import got from 'got'
|
||||||
|
import { Client as MinioClient } from 'minio'
|
||||||
|
import config from './config'
|
||||||
|
import serverToken from '@anticrm/server-token'
|
||||||
|
|
||||||
|
async function getWorkspaces (): Promise<string[]> {
|
||||||
|
const { body }: { body: { error?: string, result?: any[] } } = await got.post(config.AccountsURL, {
|
||||||
|
json: {
|
||||||
|
method: 'listWorkspaces',
|
||||||
|
params: []
|
||||||
|
},
|
||||||
|
responseType: 'json'
|
||||||
|
})
|
||||||
|
|
||||||
|
if (body.error !== undefined) {
|
||||||
|
throw Error(body.error)
|
||||||
|
}
|
||||||
|
|
||||||
|
return (body.result ?? []).map((x) => x.workspace)
|
||||||
|
}
|
||||||
|
|
||||||
|
export class PlatformWorker {
|
||||||
|
minio?: MinioClient
|
||||||
|
|
||||||
|
async close (): Promise<void> {}
|
||||||
|
|
||||||
|
async init (): Promise<void> {
|
||||||
|
setMetadata(serverToken.metadata.Secret, config.Secret)
|
||||||
|
let minioPort = 9000
|
||||||
|
let minioEndpoint = config.MinioEndpoint
|
||||||
|
const sp = minioEndpoint.split(':')
|
||||||
|
if (sp.length > 1) {
|
||||||
|
minioEndpoint = sp[0]
|
||||||
|
minioPort = parseInt(sp[1])
|
||||||
|
}
|
||||||
|
|
||||||
|
this.minio = new MinioClient({
|
||||||
|
endPoint: minioEndpoint,
|
||||||
|
port: minioPort,
|
||||||
|
useSSL: false,
|
||||||
|
accessKey: config.MinioAccessKey,
|
||||||
|
secretKey: config.MinioSecretKey
|
||||||
|
})
|
||||||
|
|
||||||
|
await this.backup().then(() => {
|
||||||
|
void this.schedule()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
async schedule (): Promise<void> {
|
||||||
|
console.log('schedule timeout for', config.Interval, ' seconds')
|
||||||
|
setTimeout(() => {
|
||||||
|
void this.backup().then(() => {
|
||||||
|
void this.schedule()
|
||||||
|
})
|
||||||
|
}, config.Interval * 1000)
|
||||||
|
}
|
||||||
|
|
||||||
|
async backup (): Promise<void> {
|
||||||
|
const workspaces = await getWorkspaces()
|
||||||
|
for (const ws of workspaces) {
|
||||||
|
console.log('\n\nBACKUP WORKSPACE ', ws)
|
||||||
|
try {
|
||||||
|
const storage = await createMinioBackupStorage(this.minio as MinioClient, 'backups', ws)
|
||||||
|
await backup(config.TransactorURL, ws, storage)
|
||||||
|
} catch (err: any) {
|
||||||
|
console.error('\n\nFAILED to BACKUP', ws, err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static async create (): Promise<PlatformWorker> {
|
||||||
|
const worker = new PlatformWorker()
|
||||||
|
await worker.init()
|
||||||
|
return worker
|
||||||
|
}
|
||||||
|
|
||||||
|
private constructor () {}
|
||||||
|
}
|
9
pods/backup/tsconfig.json
Normal file
9
pods/backup/tsconfig.json
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
{
|
||||||
|
"extends": "./node_modules/@anticrm/platform-rig/profiles/default/tsconfig.json",
|
||||||
|
|
||||||
|
"compilerOptions": {
|
||||||
|
"rootDir": "./src",
|
||||||
|
"outDir": "./lib",
|
||||||
|
"esModuleInterop": true
|
||||||
|
}
|
||||||
|
}
|
@ -7,6 +7,7 @@
|
|||||||
"allowJs": true,
|
"allowJs": true,
|
||||||
"sourceMap": true,
|
"sourceMap": true,
|
||||||
"moduleResolution": "node",
|
"moduleResolution": "node",
|
||||||
|
"skipLibCheck": true,
|
||||||
"allowSyntheticDefaultImports": true,
|
"allowSyntheticDefaultImports": true,
|
||||||
"lib": [
|
"lib": [
|
||||||
"es2016",
|
"es2016",
|
||||||
|
@ -1307,6 +1307,11 @@
|
|||||||
"packageName": "@anticrm/server-backup",
|
"packageName": "@anticrm/server-backup",
|
||||||
"projectFolder": "server/backup",
|
"projectFolder": "server/backup",
|
||||||
"shouldPublish": true
|
"shouldPublish": true
|
||||||
}
|
},
|
||||||
|
{
|
||||||
|
"packageName": "@anticrm/pod-backup",
|
||||||
|
"projectFolder": "pods/backup",
|
||||||
|
"shouldPublish": false
|
||||||
|
},
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user