@futo-org/backups-orchestrator-api 0.1.71

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (233) hide show
  1. package/LICENSE +41 -0
  2. package/dist/backends/backend.d.ts +23 -0
  3. package/dist/backends/backend.js +31 -0
  4. package/dist/backends/backend.js.map +1 -0
  5. package/dist/backends/local.backend.d.ts +24 -0
  6. package/dist/backends/local.backend.js +92 -0
  7. package/dist/backends/local.backend.js.map +1 -0
  8. package/dist/backends/s3.backend.d.ts +24 -0
  9. package/dist/backends/s3.backend.js +47 -0
  10. package/dist/backends/s3.backend.js.map +1 -0
  11. package/dist/backends/yucca.backend.d.ts +27 -0
  12. package/dist/backends/yucca.backend.js +63 -0
  13. package/dist/backends/yucca.backend.js.map +1 -0
  14. package/dist/const.d.ts +2 -0
  15. package/dist/const.js +6 -0
  16. package/dist/const.js.map +1 -0
  17. package/dist/controllers/auth.controller.d.ts +7 -0
  18. package/dist/controllers/auth.controller.js +38 -0
  19. package/dist/controllers/auth.controller.js.map +1 -0
  20. package/dist/controllers/backend.controller.d.ts +8 -0
  21. package/dist/controllers/backend.controller.js +52 -0
  22. package/dist/controllers/backend.controller.js.map +1 -0
  23. package/dist/controllers/development.controller.d.ts +6 -0
  24. package/dist/controllers/development.controller.js +35 -0
  25. package/dist/controllers/development.controller.js.map +1 -0
  26. package/dist/controllers/filesystem.controller.d.ts +7 -0
  27. package/dist/controllers/filesystem.controller.js +43 -0
  28. package/dist/controllers/filesystem.controller.js.map +1 -0
  29. package/dist/controllers/integrations.controller.d.ts +8 -0
  30. package/dist/controllers/integrations.controller.js +51 -0
  31. package/dist/controllers/integrations.controller.js.map +1 -0
  32. package/dist/controllers/onboarding.controller.d.ts +11 -0
  33. package/dist/controllers/onboarding.controller.js +80 -0
  34. package/dist/controllers/onboarding.controller.js.map +1 -0
  35. package/dist/controllers/repository.controller.d.ts +22 -0
  36. package/dist/controllers/repository.controller.js +227 -0
  37. package/dist/controllers/repository.controller.js.map +1 -0
  38. package/dist/controllers/runHistory.controller.d.ts +9 -0
  39. package/dist/controllers/runHistory.controller.js +55 -0
  40. package/dist/controllers/runHistory.controller.js.map +1 -0
  41. package/dist/controllers/runningTasks.controller.d.ts +8 -0
  42. package/dist/controllers/runningTasks.controller.js +52 -0
  43. package/dist/controllers/runningTasks.controller.js.map +1 -0
  44. package/dist/controllers/schedule.controller.d.ts +10 -0
  45. package/dist/controllers/schedule.controller.js +76 -0
  46. package/dist/controllers/schedule.controller.js.map +1 -0
  47. package/dist/dto/auth.dto.d.ts +4 -0
  48. package/dist/dto/auth.dto.js +27 -0
  49. package/dist/dto/auth.dto.js.map +1 -0
  50. package/dist/dto/backend.dto.d.ts +16 -0
  51. package/dist/dto/backend.dto.js +64 -0
  52. package/dist/dto/backend.dto.js.map +1 -0
  53. package/dist/dto/filesystem.dto.d.ts +12 -0
  54. package/dist/dto/filesystem.dto.js +56 -0
  55. package/dist/dto/filesystem.dto.js.map +1 -0
  56. package/dist/dto/integrations.dto.d.ts +35 -0
  57. package/dist/dto/integrations.dto.js +163 -0
  58. package/dist/dto/integrations.dto.js.map +1 -0
  59. package/dist/dto/onboarding.dto.d.ts +13 -0
  60. package/dist/dto/onboarding.dto.js +60 -0
  61. package/dist/dto/onboarding.dto.js.map +1 -0
  62. package/dist/dto/repository.dto.d.ts +113 -0
  63. package/dist/dto/repository.dto.js +421 -0
  64. package/dist/dto/repository.dto.js.map +1 -0
  65. package/dist/dto/runningTasks.dto.d.ts +14 -0
  66. package/dist/dto/runningTasks.dto.js +59 -0
  67. package/dist/dto/runningTasks.dto.js.map +1 -0
  68. package/dist/dto/schedule.dto.d.ts +29 -0
  69. package/dist/dto/schedule.dto.js +149 -0
  70. package/dist/dto/schedule.dto.js.map +1 -0
  71. package/dist/enum.d.ts +32 -0
  72. package/dist/enum.js +42 -0
  73. package/dist/enum.js.map +1 -0
  74. package/dist/events/events.gateway.d.ts +73 -0
  75. package/dist/events/events.gateway.js +79 -0
  76. package/dist/events/events.gateway.js.map +1 -0
  77. package/dist/index.d.ts +4 -0
  78. package/dist/index.js +24 -0
  79. package/dist/index.js.map +1 -0
  80. package/dist/moduleConfig.d.ts +20 -0
  81. package/dist/moduleConfig.js +5 -0
  82. package/dist/moduleConfig.js.map +1 -0
  83. package/dist/orchestrationApi.module.d.ts +5 -0
  84. package/dist/orchestrationApi.module.js +134 -0
  85. package/dist/orchestrationApi.module.js.map +1 -0
  86. package/dist/repositories/backend.repository.d.ts +19 -0
  87. package/dist/repositories/backend.repository.js +60 -0
  88. package/dist/repositories/backend.repository.js.map +1 -0
  89. package/dist/repositories/config.repository.d.ts +18 -0
  90. package/dist/repositories/config.repository.js +93 -0
  91. package/dist/repositories/config.repository.js.map +1 -0
  92. package/dist/repositories/database.repository.d.ts +11 -0
  93. package/dist/repositories/database.repository.js +85 -0
  94. package/dist/repositories/database.repository.js.map +1 -0
  95. package/dist/repositories/moduleConfig.repository.d.ts +12 -0
  96. package/dist/repositories/moduleConfig.repository.js +48 -0
  97. package/dist/repositories/moduleConfig.repository.js.map +1 -0
  98. package/dist/repositories/repository.repository.d.ts +18 -0
  99. package/dist/repositories/repository.repository.js +81 -0
  100. package/dist/repositories/repository.repository.js.map +1 -0
  101. package/dist/repositories/repositoryIntegrationImmich.repository.d.ts +14 -0
  102. package/dist/repositories/repositoryIntegrationImmich.repository.js +57 -0
  103. package/dist/repositories/repositoryIntegrationImmich.repository.js.map +1 -0
  104. package/dist/repositories/repositoryLocalMetrics.repository.d.ts +23 -0
  105. package/dist/repositories/repositoryLocalMetrics.repository.js +55 -0
  106. package/dist/repositories/repositoryLocalMetrics.repository.js.map +1 -0
  107. package/dist/repositories/repositoryPath.repository.d.ts +17 -0
  108. package/dist/repositories/repositoryPath.repository.js +48 -0
  109. package/dist/repositories/repositoryPath.repository.js.map +1 -0
  110. package/dist/repositories/restic.repository.d.ts +207 -0
  111. package/dist/repositories/restic.repository.js +96 -0
  112. package/dist/repositories/restic.repository.js.map +1 -0
  113. package/dist/repositories/runHistory.repository.d.ts +44 -0
  114. package/dist/repositories/runHistory.repository.js +191 -0
  115. package/dist/repositories/runHistory.repository.js.map +1 -0
  116. package/dist/repositories/runningTasks.repository.d.ts +14 -0
  117. package/dist/repositories/runningTasks.repository.js +77 -0
  118. package/dist/repositories/runningTasks.repository.js.map +1 -0
  119. package/dist/repositories/schedule.repository.d.ts +47 -0
  120. package/dist/repositories/schedule.repository.js +99 -0
  121. package/dist/repositories/schedule.repository.js.map +1 -0
  122. package/dist/repositories/storage.repository.d.ts +9 -0
  123. package/dist/repositories/storage.repository.js +39 -0
  124. package/dist/repositories/storage.repository.js.map +1 -0
  125. package/dist/schema/index.d.ts +20 -0
  126. package/dist/schema/index.js +3 -0
  127. package/dist/schema/index.js.map +1 -0
  128. package/dist/schema/migrations/20260218105210-InitialMigration.d.ts +3 -0
  129. package/dist/schema/migrations/20260218105210-InitialMigration.js +15 -0
  130. package/dist/schema/migrations/20260218105210-InitialMigration.js.map +1 -0
  131. package/dist/schema/migrations/20260218122600-AddRepositories.d.ts +3 -0
  132. package/dist/schema/migrations/20260218122600-AddRepositories.js +21 -0
  133. package/dist/schema/migrations/20260218122600-AddRepositories.js.map +1 -0
  134. package/dist/schema/migrations/20260224112323-RepositoryPathTable.d.ts +3 -0
  135. package/dist/schema/migrations/20260224112323-RepositoryPathTable.js +16 -0
  136. package/dist/schema/migrations/20260224112323-RepositoryPathTable.js.map +1 -0
  137. package/dist/schema/migrations/20260224123344-RunHistoryTable.d.ts +3 -0
  138. package/dist/schema/migrations/20260224123344-RunHistoryTable.js +20 -0
  139. package/dist/schema/migrations/20260224123344-RunHistoryTable.js.map +1 -0
  140. package/dist/schema/migrations/20260224125102-RepositoryMetricsTable.d.ts +3 -0
  141. package/dist/schema/migrations/20260224125102-RepositoryMetricsTable.js +16 -0
  142. package/dist/schema/migrations/20260224125102-RepositoryMetricsTable.js.map +1 -0
  143. package/dist/schema/migrations/20260304162353-ScheduleTable.d.ts +3 -0
  144. package/dist/schema/migrations/20260304162353-ScheduleTable.js +27 -0
  145. package/dist/schema/migrations/20260304162353-ScheduleTable.js.map +1 -0
  146. package/dist/schema/migrations/20260313222211-AddMetricsColumns.d.ts +3 -0
  147. package/dist/schema/migrations/20260313222211-AddMetricsColumns.js +13 -0
  148. package/dist/schema/migrations/20260313222211-AddMetricsColumns.js.map +1 -0
  149. package/dist/schema/migrations/20260330120000-RepositoryIntegrationImmichTable.d.ts +3 -0
  150. package/dist/schema/migrations/20260330120000-RepositoryIntegrationImmichTable.js +15 -0
  151. package/dist/schema/migrations/20260330120000-RepositoryIntegrationImmichTable.js.map +1 -0
  152. package/dist/schema/migrations/20260330130000-AddScheduleIdToImmichIntegration.d.ts +3 -0
  153. package/dist/schema/migrations/20260330130000-AddScheduleIdToImmichIntegration.js +14 -0
  154. package/dist/schema/migrations/20260330130000-AddScheduleIdToImmichIntegration.js.map +1 -0
  155. package/dist/schema/migrations/20260507120000-AddRunHistoryType.d.ts +3 -0
  156. package/dist/schema/migrations/20260507120000-AddRunHistoryType.js +18 -0
  157. package/dist/schema/migrations/20260507120000-AddRunHistoryType.js.map +1 -0
  158. package/dist/schema/migrations/20260512120000-AddRepositoryRetentionPolicy.d.ts +3 -0
  159. package/dist/schema/migrations/20260512120000-AddRepositoryRetentionPolicy.js +11 -0
  160. package/dist/schema/migrations/20260512120000-AddRepositoryRetentionPolicy.js.map +1 -0
  161. package/dist/schema/migrations/20260512120000-AddRepositoryRetentionPreset.d.ts +3 -0
  162. package/dist/schema/migrations/20260512120000-AddRepositoryRetentionPreset.js +18 -0
  163. package/dist/schema/migrations/20260512120000-AddRepositoryRetentionPreset.js.map +1 -0
  164. package/dist/schema/migrations/20260512130000-AllowForgetRunHistoryType.d.ts +3 -0
  165. package/dist/schema/migrations/20260512130000-AllowForgetRunHistoryType.js +47 -0
  166. package/dist/schema/migrations/20260512130000-AllowForgetRunHistoryType.js.map +1 -0
  167. package/dist/schema/tables/backend.table.d.ts +20 -0
  168. package/dist/schema/tables/backend.table.js +9 -0
  169. package/dist/schema/tables/backend.table.js.map +1 -0
  170. package/dist/schema/tables/config.table.d.ts +4 -0
  171. package/dist/schema/tables/config.table.js +9 -0
  172. package/dist/schema/tables/config.table.js.map +1 -0
  173. package/dist/schema/tables/repository.table.d.ts +5 -0
  174. package/dist/schema/tables/repository.table.js +10 -0
  175. package/dist/schema/tables/repository.table.js.map +1 -0
  176. package/dist/schema/tables/repositoryIntegrationImmich.table.d.ts +10 -0
  177. package/dist/schema/tables/repositoryIntegrationImmich.table.js +10 -0
  178. package/dist/schema/tables/repositoryIntegrationImmich.table.js.map +1 -0
  179. package/dist/schema/tables/repositoryLocalMetrics.table.d.ts +7 -0
  180. package/dist/schema/tables/repositoryLocalMetrics.table.js +12 -0
  181. package/dist/schema/tables/repositoryLocalMetrics.table.js.map +1 -0
  182. package/dist/schema/tables/repositoryPath.table.d.ts +4 -0
  183. package/dist/schema/tables/repositoryPath.table.js +9 -0
  184. package/dist/schema/tables/repositoryPath.table.js.map +1 -0
  185. package/dist/schema/tables/repositorySchedule.table.d.ts +4 -0
  186. package/dist/schema/tables/repositorySchedule.table.js +9 -0
  187. package/dist/schema/tables/repositorySchedule.table.js.map +1 -0
  188. package/dist/schema/tables/runHistory.table.d.ts +11 -0
  189. package/dist/schema/tables/runHistory.table.js +14 -0
  190. package/dist/schema/tables/runHistory.table.js.map +1 -0
  191. package/dist/schema/tables/schedule.table.d.ts +9 -0
  192. package/dist/schema/tables/schedule.table.js +14 -0
  193. package/dist/schema/tables/schedule.table.js.map +1 -0
  194. package/dist/services/auth.service.d.ts +16 -0
  195. package/dist/services/auth.service.js +85 -0
  196. package/dist/services/auth.service.js.map +1 -0
  197. package/dist/services/backend.service.d.ts +12 -0
  198. package/dist/services/backend.service.js +68 -0
  199. package/dist/services/backend.service.js.map +1 -0
  200. package/dist/services/bootstrap.service.d.ts +13 -0
  201. package/dist/services/bootstrap.service.js +44 -0
  202. package/dist/services/bootstrap.service.js.map +1 -0
  203. package/dist/services/database.service.d.ts +11 -0
  204. package/dist/services/database.service.js +39 -0
  205. package/dist/services/database.service.js.map +1 -0
  206. package/dist/services/development.service.d.ts +11 -0
  207. package/dist/services/development.service.js +59 -0
  208. package/dist/services/development.service.js.map +1 -0
  209. package/dist/services/filesystem.service.d.ts +7 -0
  210. package/dist/services/filesystem.service.js +43 -0
  211. package/dist/services/filesystem.service.js.map +1 -0
  212. package/dist/services/integrations.service.d.ts +22 -0
  213. package/dist/services/integrations.service.js +158 -0
  214. package/dist/services/integrations.service.js.map +1 -0
  215. package/dist/services/onboarding.service.d.ts +17 -0
  216. package/dist/services/onboarding.service.js +65 -0
  217. package/dist/services/onboarding.service.js.map +1 -0
  218. package/dist/services/repository.service.d.ts +65 -0
  219. package/dist/services/repository.service.js +623 -0
  220. package/dist/services/repository.service.js.map +1 -0
  221. package/dist/services/runHistory.service.d.ts +7 -0
  222. package/dist/services/runHistory.service.js +29 -0
  223. package/dist/services/runHistory.service.js.map +1 -0
  224. package/dist/services/runningTasks.service.d.ts +8 -0
  225. package/dist/services/runningTasks.service.js +34 -0
  226. package/dist/services/runningTasks.service.js.map +1 -0
  227. package/dist/services/schedule.service.d.ts +27 -0
  228. package/dist/services/schedule.service.js +197 -0
  229. package/dist/services/schedule.service.js.map +1 -0
  230. package/dist/utils/restic.d.ts +17 -0
  231. package/dist/utils/restic.js +26 -0
  232. package/dist/utils/restic.js.map +1 -0
  233. package/package.json +79 -0
@@ -0,0 +1,623 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
12
+ return function (target, key) { decorator(target, key, paramIndex); }
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.RepositoryService = void 0;
16
+ const common_1 = require("@nestjs/common");
17
+ const node_path_1 = require("node:path");
18
+ const backend_1 = require("../backends/backend");
19
+ const enum_1 = require("../enum");
20
+ const events_gateway_1 = require("../events/events.gateway");
21
+ const backend_repository_1 = require("../repositories/backend.repository");
22
+ const config_repository_1 = require("../repositories/config.repository");
23
+ const database_repository_1 = require("../repositories/database.repository");
24
+ const moduleConfig_repository_1 = require("../repositories/moduleConfig.repository");
25
+ const repository_repository_1 = require("../repositories/repository.repository");
26
+ const repositoryLocalMetrics_repository_1 = require("../repositories/repositoryLocalMetrics.repository");
27
+ const repositoryPath_repository_1 = require("../repositories/repositoryPath.repository");
28
+ const restic_repository_1 = require("../repositories/restic.repository");
29
+ const runHistory_repository_1 = require("../repositories/runHistory.repository");
30
+ const runningTasks_repository_1 = require("../repositories/runningTasks.repository");
31
+ const storage_repository_1 = require("../repositories/storage.repository");
32
+ const restic_1 = require("../utils/restic");
33
+ const bootstrap_service_1 = require("./bootstrap.service");
34
+ let RepositoryService = class RepositoryService {
35
+ tasks;
36
+ events;
37
+ backend;
38
+ config;
39
+ database;
40
+ restic;
41
+ runHistory;
42
+ repository;
43
+ repositoryPath;
44
+ repositoryLocalMetrics;
45
+ moduleConfig;
46
+ storage;
47
+ bootstrap;
48
+ constructor(tasks, events, backend, config, database, restic, runHistory, repository, repositoryPath, repositoryLocalMetrics, moduleConfig, storage, bootstrap) {
49
+ this.tasks = tasks;
50
+ this.events = events;
51
+ this.backend = backend;
52
+ this.config = config;
53
+ this.database = database;
54
+ this.restic = restic;
55
+ this.runHistory = runHistory;
56
+ this.repository = repository;
57
+ this.repositoryPath = repositoryPath;
58
+ this.repositoryLocalMetrics = repositoryLocalMetrics;
59
+ this.moduleConfig = moduleConfig;
60
+ this.storage = storage;
61
+ this.bootstrap = bootstrap;
62
+ }
63
+ async getLocalRepository(id, configuration, metrics) {
64
+ if (!configuration) {
65
+ const [paths, { retentionPolicy }] = await Promise.all([this.repositoryPath.get(id), this.repository.get(id)]);
66
+ configuration = { paths, retentionPolicy };
67
+ }
68
+ metrics ??= await this.repositoryLocalMetrics.get(id);
69
+ return {
70
+ metrics,
71
+ configuration,
72
+ };
73
+ }
74
+ async createRepository(dto, backendId) {
75
+ if (!backendId) {
76
+ const backends = await this.backend.getBackends();
77
+ backendId = backends[0].id;
78
+ }
79
+ const { configuration } = await this.backend.getBackend(backendId);
80
+ const backend = backend_1.Backend.from(configuration, this.moduleConfig.get());
81
+ const { repository: remote } = await backend.createRepository(dto);
82
+ const endpoint = await backend.getResticEndpoint(remote.id);
83
+ const key = await this.config.deriveEncryptionKey(`repository-${remote.id}`);
84
+ await this.restic.init(endpoint, key);
85
+ await this.repository.create({
86
+ id: remote.id,
87
+ backendId,
88
+ retentionPolicy: restic_1.DEFAULT_RETENTION_POLICY,
89
+ });
90
+ const paths = dto.paths ?? [];
91
+ for (const path of paths) {
92
+ await this.repositoryPath.create({ id: remote.id, path });
93
+ }
94
+ const repository = {
95
+ ...(await this.getLocalRepository(remote.id, { paths, retentionPolicy: restic_1.DEFAULT_RETENTION_POLICY })),
96
+ ...remote,
97
+ backends: {
98
+ primary: {
99
+ id: backendId,
100
+ online: true,
101
+ type: configuration.type,
102
+ },
103
+ secondary: [],
104
+ },
105
+ };
106
+ this.events.publish({
107
+ type: 'RepositoryCreate',
108
+ repository,
109
+ });
110
+ return {
111
+ repository,
112
+ };
113
+ }
114
+ async getRepositories() {
115
+ const backends = await this.backend.getBackends();
116
+ const repositories = [];
117
+ const backendsById = Object.fromEntries(backends.map((backend) => [backend.id, backend]));
118
+ const remoteRepositories = {};
119
+ for (const { id: backendId, configuration } of backends) {
120
+ const backend = backend_1.Backend.from(configuration, this.moduleConfig.get());
121
+ remoteRepositories[backendId] = {};
122
+ try {
123
+ const { repositories: list } = await backend.getRepositories();
124
+ for (const repository of list) {
125
+ remoteRepositories[backendId][repository.id] = repository;
126
+ }
127
+ }
128
+ catch (error) {
129
+ console.error('Backend', backendId, 'threw', error);
130
+ }
131
+ }
132
+ const localRepositories = await this.repository.getAll();
133
+ const localPaths = await this.repositoryPath.getAll();
134
+ const localMetrics = await this.repositoryLocalMetrics.getAll();
135
+ for (const { id, backendId, retentionPolicy } of localRepositories) {
136
+ const remoteRepository = remoteRepositories[backendId][id];
137
+ const configuration = {
138
+ paths: localPaths.filter((entry) => entry.id === id).map(({ path }) => path),
139
+ retentionPolicy,
140
+ };
141
+ const metrics = localMetrics.find((entry) => entry.id === id);
142
+ if (remoteRepository) {
143
+ repositories.push({
144
+ ...remoteRepository,
145
+ ...(await this.getLocalRepository(id, configuration, metrics)),
146
+ backends: {
147
+ primary: {
148
+ id: backendId,
149
+ type: backendsById[backendId].configuration.type,
150
+ online: true,
151
+ },
152
+ secondary: [],
153
+ },
154
+ });
155
+ delete remoteRepositories[backendId][id];
156
+ }
157
+ else {
158
+ repositories.push({
159
+ id,
160
+ name: 'Unknown',
161
+ worm: false,
162
+ ...(await this.getLocalRepository(id, configuration, metrics)),
163
+ backends: {
164
+ primary: {
165
+ id: backendId,
166
+ type: backendsById[backendId].configuration.type,
167
+ online: false,
168
+ },
169
+ secondary: [],
170
+ },
171
+ });
172
+ }
173
+ }
174
+ for (const [backendId, list] of Object.entries(remoteRepositories)) {
175
+ for (const remoteRepository of Object.values(list)) {
176
+ repositories.push({
177
+ ...remoteRepository,
178
+ backends: {
179
+ primary: {
180
+ id: backendId,
181
+ type: backendsById[backendId].configuration.type,
182
+ online: true,
183
+ },
184
+ secondary: [],
185
+ },
186
+ });
187
+ }
188
+ }
189
+ return {
190
+ repositories,
191
+ };
192
+ }
193
+ async inspectRepositories() {
194
+ const { repositories } = await this.getRepositories();
195
+ const snapshots = await Promise.allSettled(repositories.map(async (repository) => {
196
+ const { endpoint, key } = await this.getResticParameters(repository.id, repository.backends?.primary.id);
197
+ return this.restic.snapshots(endpoint, key);
198
+ }));
199
+ return {
200
+ repositories: repositories.map((repository, idx) => ({
201
+ ...repository,
202
+ snapshots: snapshots[idx].status === 'fulfilled'
203
+ ? snapshots[idx].value.map((snapshot) => this.mapSnapshot(snapshot))
204
+ : undefined,
205
+ })),
206
+ };
207
+ }
208
+ mapSnapshot({ summary, ...snapshot }) {
209
+ return {
210
+ ...snapshot,
211
+ time: snapshot.time.toISOString(),
212
+ summary: summary
213
+ ? {
214
+ filesNew: summary.files_new,
215
+ filesChanged: summary.files_changed,
216
+ filesUnmodified: summary.files_unmodified,
217
+ totalFiles: summary.total_files_processed,
218
+ totalBytes: summary.total_bytes_processed,
219
+ dataAdded: summary.data_added,
220
+ }
221
+ : undefined,
222
+ };
223
+ }
224
+ async updateRepository(id, dto, backendId) {
225
+ if (!backendId) {
226
+ const localRepository = await this.repository.get(id);
227
+ backendId = localRepository.backendId;
228
+ }
229
+ const backend = await this.backend.getBackend(backendId);
230
+ const backendInstance = backend_1.Backend.from(backend.configuration, this.moduleConfig.get());
231
+ let remote;
232
+ if (dto.name) {
233
+ ({ repository: remote } = await backendInstance.updateRepository(id, dto));
234
+ }
235
+ else {
236
+ ({ repository: remote } = await backendInstance.getRepository(id));
237
+ }
238
+ if (dto.paths) {
239
+ const currentPaths = new Set(await this.repositoryPath.get(id));
240
+ const requestedPaths = new Set(dto.paths);
241
+ const removedPaths = currentPaths.difference(requestedPaths);
242
+ const newPaths = requestedPaths.difference(currentPaths);
243
+ for (const path of removedPaths) {
244
+ await this.repositoryPath.delete(id, path);
245
+ }
246
+ for (const path of newPaths) {
247
+ await this.repositoryPath.create({
248
+ id,
249
+ path,
250
+ });
251
+ }
252
+ }
253
+ if (dto.retentionPolicy !== undefined) {
254
+ await this.repository.update(id, { retentionPolicy: dto.retentionPolicy });
255
+ }
256
+ const metrics = await this.repositoryLocalMetrics.get(id);
257
+ const repository = {
258
+ ...remote,
259
+ ...(await this.getLocalRepository(id, undefined, metrics)),
260
+ backends: {
261
+ primary: {
262
+ id: backendId,
263
+ type: backend.configuration.type,
264
+ online: true,
265
+ },
266
+ secondary: [],
267
+ },
268
+ };
269
+ this.events.publish({
270
+ type: 'RepositoryUpdate',
271
+ repositoryId: id,
272
+ repository,
273
+ });
274
+ return {
275
+ repository,
276
+ };
277
+ }
278
+ async deleteRepository(id) {
279
+ await this.repository.delete(id);
280
+ this.events.publish({
281
+ type: 'RepositoryDelete',
282
+ repositoryId: id,
283
+ });
284
+ }
285
+ async getResticParameters(id, backendId) {
286
+ if (!backendId) {
287
+ const localRepository = await this.repository.get(id);
288
+ if (!localRepository) {
289
+ throw new common_1.BadRequestException('Repository not found locally');
290
+ }
291
+ backendId = localRepository.backendId;
292
+ }
293
+ const backend = await this.backend.getBackend(backendId);
294
+ const backendInstance = backend_1.Backend.from(backend.configuration, this.moduleConfig.get());
295
+ const endpoint = await backendInstance.getResticEndpoint(id);
296
+ const key = await this.config.deriveEncryptionKey(`repository-${id}`);
297
+ return { endpoint, key };
298
+ }
299
+ async updateLocalMetrics(id, options) {
300
+ const metrics = {
301
+ ...options.additionalMetrics,
302
+ };
303
+ try {
304
+ if (options.resticParameters) {
305
+ const { endpoint, key } = options.resticParameters;
306
+ const { total_size } = await this.restic.stats(endpoint, key);
307
+ metrics.sizeBytes = total_size;
308
+ }
309
+ const updatedMetrics = await this.repositoryLocalMetrics.save(id, metrics);
310
+ this.events.publish({
311
+ type: 'RepositoryUpdate',
312
+ repositoryId: id,
313
+ repository: {
314
+ metrics: updatedMetrics,
315
+ },
316
+ });
317
+ if (metrics.sizeBytes) {
318
+ const { backendId } = await this.repository.get(id);
319
+ const { configuration } = await this.backend.getBackend(backendId);
320
+ const backend = backend_1.Backend.from(configuration, this.moduleConfig.get());
321
+ if (backend.isMetricsCapable()) {
322
+ await backend.submitMetricRepositorySize(id, metrics.sizeBytes);
323
+ }
324
+ }
325
+ }
326
+ catch {
327
+ }
328
+ }
329
+ async createBackup(id, signal) {
330
+ if (!this.tasks.canStart(id)) {
331
+ throw new common_1.BadRequestException('Task already running!');
332
+ }
333
+ const { backendId } = await this.repository.get(id);
334
+ const { configuration } = await this.backend.getBackend(backendId);
335
+ const backend = backend_1.Backend.from(configuration, this.moduleConfig.get());
336
+ const { endpoint, key } = await this.getResticParameters(id);
337
+ const paths = await this.repositoryPath.get(id);
338
+ if (paths.length === 0) {
339
+ throw new common_1.BadRequestException('Missing configuration paths');
340
+ }
341
+ return new Promise((resolve) => {
342
+ const startTime = Date.now();
343
+ const task = new Promise((complete, fail) => void this.runHistory.createLog(id, enum_1.TaskType.Backup, async (log, logId) => {
344
+ resolve({
345
+ task,
346
+ logId,
347
+ });
348
+ if (backend.isMetricsCapable()) {
349
+ await backend.submitMetricBackupStart(id);
350
+ }
351
+ try {
352
+ const taskSignal = this.tasks.startTask(id, enum_1.TaskType.Backup, logId, signal);
353
+ await this.restic.unlockAll(endpoint, key);
354
+ await this.restic.backup(endpoint, key, paths, log, taskSignal);
355
+ const { retentionPolicy: policy } = await this.repository.get(id);
356
+ if (policy) {
357
+ await this.runForgetAndPrune(endpoint, key, policy, log, taskSignal);
358
+ }
359
+ }
360
+ finally {
361
+ this.tasks.endTask(id);
362
+ }
363
+ }, async (error) => {
364
+ const lastBackup = new Date().toISOString();
365
+ const lastSuccessfulBackup = error ? undefined : lastBackup;
366
+ const lastBackupDuration = Date.now() - startTime;
367
+ void this.updateLocalMetrics(id, {
368
+ resticParameters: { endpoint, key },
369
+ additionalMetrics: {
370
+ lastBackup,
371
+ lastSuccessfulBackup,
372
+ lastBackupDuration,
373
+ },
374
+ });
375
+ if (error) {
376
+ fail(error);
377
+ }
378
+ else {
379
+ complete();
380
+ }
381
+ if (backend.isMetricsCapable()) {
382
+ await backend.submitMetricBackupEnd(id, !error, lastBackupDuration);
383
+ }
384
+ }));
385
+ task.catch(() => { });
386
+ });
387
+ }
388
+ async runForgetAndPrune(endpoint, key, policy, log, signal) {
389
+ const events = await this.restic.forgetByPolicy(endpoint, key, policy, signal);
390
+ for (const { keep, remove, reasons } of events) {
391
+ if (keep) {
392
+ for (const { id, time } of keep) {
393
+ log.write(JSON.stringify({
394
+ message_type: 'yucca_prune_kept',
395
+ id,
396
+ time,
397
+ matches: reasons?.find((reason) => reason.snapshot.id === id)?.matches,
398
+ }) + '\n');
399
+ }
400
+ }
401
+ if (remove) {
402
+ for (const { id, time } of remove) {
403
+ log.write(JSON.stringify({ message_type: 'yucca_prune_removed', id, time }) + '\n');
404
+ }
405
+ }
406
+ }
407
+ await this.restic.prune(endpoint, key, signal);
408
+ }
409
+ async pruneRepository(id, signal) {
410
+ if (!this.tasks.canStart(id)) {
411
+ throw new common_1.BadRequestException('Task already running!');
412
+ }
413
+ const { retentionPolicy: policy } = await this.repository.get(id);
414
+ if (!policy) {
415
+ throw new common_1.BadRequestException('No retention policy configured for this repository');
416
+ }
417
+ const { endpoint, key } = await this.getResticParameters(id);
418
+ return new Promise((resolve) => {
419
+ const task = new Promise((complete, fail) => void this.runHistory.createLog(id, enum_1.TaskType.Forget, async (log, logId) => {
420
+ resolve({ task, logId });
421
+ await this.restic.unlockAll(endpoint, key);
422
+ await this.runForgetAndPrune(endpoint, key, policy, log, signal);
423
+ }, (error) => {
424
+ void this.updateLocalMetrics(id, {
425
+ resticParameters: { endpoint, key },
426
+ });
427
+ if (error) {
428
+ fail(error);
429
+ }
430
+ else {
431
+ complete();
432
+ }
433
+ }));
434
+ task.catch(() => { });
435
+ });
436
+ }
437
+ async checkImportRepository(id, backendId) {
438
+ const { endpoint, key } = await this.getResticParameters(id, backendId);
439
+ try {
440
+ await this.restic.snapshots(endpoint, key);
441
+ return {
442
+ readable: true,
443
+ };
444
+ }
445
+ catch {
446
+ return {
447
+ readable: false,
448
+ };
449
+ }
450
+ }
451
+ async importRepository(id, backendId) {
452
+ const { configuration } = await this.backend.getBackend(backendId);
453
+ const backend = backend_1.Backend.from(configuration, this.moduleConfig.get());
454
+ const { repository: remote } = await backend.getRepository(id);
455
+ const endpoint = await backend.getResticEndpoint(remote.id);
456
+ const key = await this.config.deriveEncryptionKey(`repository-${remote.id}`);
457
+ await this.restic.keyList(endpoint, key);
458
+ let paths = [];
459
+ try {
460
+ const snapshots = await this.restic.snapshots(endpoint, key);
461
+ snapshots.sort((a, b) => +b.time - +a.time);
462
+ paths = snapshots[0].paths;
463
+ }
464
+ catch {
465
+ }
466
+ await this.repository.create({
467
+ id: remote.id,
468
+ backendId,
469
+ retentionPolicy: restic_1.DEFAULT_RETENTION_POLICY,
470
+ });
471
+ const repository = {
472
+ ...(await this.getLocalRepository(id, { paths, retentionPolicy: restic_1.DEFAULT_RETENTION_POLICY })),
473
+ ...remote,
474
+ backends: {
475
+ primary: {
476
+ id: backendId,
477
+ online: true,
478
+ type: configuration.type,
479
+ },
480
+ secondary: [],
481
+ },
482
+ };
483
+ this.events.publish({
484
+ type: 'RepositoryCreate',
485
+ repository,
486
+ });
487
+ return {
488
+ repository,
489
+ };
490
+ }
491
+ async getSnapshots(id) {
492
+ const { endpoint, key } = await this.getResticParameters(id);
493
+ const snapshots = await this.restic.snapshots(endpoint, key);
494
+ return {
495
+ snapshots: snapshots.map((snapshot) => this.mapSnapshot(snapshot)),
496
+ };
497
+ }
498
+ async restoreSnapshot(id, snapshotId, dto) {
499
+ return new Promise((resolve) => {
500
+ const task = new Promise((complete, fail) => void this.runHistory.createLog(id, enum_1.TaskType.Restore, async (log, logId) => {
501
+ resolve({
502
+ task,
503
+ logId,
504
+ });
505
+ const { endpoint, key } = await this.getResticParameters(id);
506
+ try {
507
+ const signal = this.tasks.startTask(id, enum_1.TaskType.Restore, logId);
508
+ await this.restic.restore(endpoint, key, snapshotId, dto, log, signal);
509
+ }
510
+ finally {
511
+ this.tasks.endTask(id);
512
+ }
513
+ }, (error) => {
514
+ if (error) {
515
+ fail(error);
516
+ }
517
+ else {
518
+ complete();
519
+ }
520
+ }));
521
+ task.catch(() => { });
522
+ });
523
+ }
524
+ async restoreFromPoint(id, snapshotId, backendId, dto) {
525
+ return new Promise((resolve) => {
526
+ const task = new Promise((complete, fail) => void this.runHistory.createEphemeralLog(async (log, logId) => {
527
+ resolve({
528
+ task,
529
+ logId,
530
+ });
531
+ const { endpoint, key } = await this.getResticParameters(id, backendId);
532
+ try {
533
+ const signal = this.tasks.startTask(id, enum_1.TaskType.Restore, logId);
534
+ await this.restic.restore(endpoint, key, snapshotId, { include: dto.include }, log, signal);
535
+ if (dto.yuccaConfig) {
536
+ const target = await this.storage.tempdir();
537
+ await this.restic.restore(endpoint, key, snapshotId, { include: [dto.yuccaConfig], target }, log, signal);
538
+ const { statePath } = this.moduleConfig.get();
539
+ const restoredState = (0, node_path_1.join)(target, dto.yuccaConfig);
540
+ await this.storage.cp(restoredState, statePath, {
541
+ recursive: true,
542
+ filter: (src) => !src.endsWith('.sqlite3'),
543
+ });
544
+ await this.database.restoreFrom((0, node_path_1.join)(restoredState, 'state.sqlite3'));
545
+ await this.bootstrap.onApplicationBootstrap();
546
+ }
547
+ }
548
+ finally {
549
+ this.tasks.endTask(id);
550
+ }
551
+ }, (error) => {
552
+ if (error) {
553
+ fail(error);
554
+ }
555
+ else {
556
+ complete();
557
+ }
558
+ }));
559
+ task.catch(() => { });
560
+ });
561
+ }
562
+ async forgetSnapshot(id, snapshotId) {
563
+ if (!this.tasks.canStart(id)) {
564
+ throw new common_1.BadRequestException('Task already running!');
565
+ }
566
+ const { endpoint, key } = await this.getResticParameters(id);
567
+ try {
568
+ const signal = this.tasks.startTask(id, enum_1.TaskType.Forget);
569
+ await this.restic.unlockAll(endpoint, key);
570
+ await this.restic.forget(endpoint, key, snapshotId, true, signal);
571
+ }
572
+ finally {
573
+ this.tasks.endTask(id);
574
+ }
575
+ await this.updateLocalMetrics(id, {
576
+ resticParameters: { endpoint, key },
577
+ });
578
+ }
579
+ async getSnapshotListing(id, snapshotId, dto) {
580
+ const path = dto.path ?? '/';
581
+ const { endpoint, key } = await this.getResticParameters(id);
582
+ const files = await this.restic.ls(endpoint, key, snapshotId, path);
583
+ return {
584
+ parent: (0, node_path_1.dirname)(path),
585
+ path,
586
+ items: files
587
+ .filter((file) => file.message_type === 'node')
588
+ .filter((file) => file.path !== path)
589
+ .map((file) => ({
590
+ path: file.path,
591
+ isDirectory: file.type === 'dir',
592
+ })),
593
+ };
594
+ }
595
+ async getRunHistory(id) {
596
+ const runs = await this.runHistory.getAll(id);
597
+ return {
598
+ runs,
599
+ };
600
+ }
601
+ observableLog(id) {
602
+ return this.runHistory.getObservable(id);
603
+ }
604
+ };
605
+ exports.RepositoryService = RepositoryService;
606
+ exports.RepositoryService = RepositoryService = __decorate([
607
+ (0, common_1.Injectable)(),
608
+ __param(12, (0, common_1.Inject)((0, common_1.forwardRef)(() => bootstrap_service_1.BootstrapService))),
609
+ __metadata("design:paramtypes", [runningTasks_repository_1.RunningTasksRepository,
610
+ events_gateway_1.EventsGateway,
611
+ backend_repository_1.BackendRepository,
612
+ config_repository_1.ConfigRepository,
613
+ database_repository_1.DatabaseRepository,
614
+ restic_repository_1.ResticRepository,
615
+ runHistory_repository_1.RunHistoryRepository,
616
+ repository_repository_1.RepositoryRepository,
617
+ repositoryPath_repository_1.RepositoryPathRepository,
618
+ repositoryLocalMetrics_repository_1.RepositoryLocalMetricsRepository,
619
+ moduleConfig_repository_1.ModuleConfigRepository,
620
+ storage_repository_1.StorageRepository,
621
+ bootstrap_service_1.BootstrapService])
622
+ ], RepositoryService);
623
+ //# sourceMappingURL=repository.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repository.service.js","sourceRoot":"","sources":["../../src/services/repository.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { Observable } from 'rxjs';
2
+ import { RunHistoryRepository } from '../repositories/runHistory.repository';
3
+ export declare class RunHistoryService {
4
+ private readonly runHistory;
5
+ constructor(runHistory: RunHistoryRepository);
6
+ observableLog(id: string): Observable<MessageEvent>;
7
+ }