mirror of
https://github.com/gristlabs/grist-core.git
synced 2024-10-27 20:44:07 +00:00
Co-authored-by: Florent FAYOLLE <florent.fayolle@beta.gouv.fr>
This commit is contained in:
parent
a56b0448ff
commit
b6b2d05be0
@ -1124,7 +1124,6 @@ export class FlexServer implements GristServer {
|
||||
await this.loadConfig();
|
||||
this.addComm();
|
||||
|
||||
await this.create.configure?.();
|
||||
if (!isSingleUserMode()) {
|
||||
const externalStorage = appSettings.section('externalStorage');
|
||||
const haveExternalStorage = Object.values(externalStorage.nested)
|
||||
@ -1135,6 +1134,7 @@ export class FlexServer implements GristServer {
|
||||
this._disableExternalStorage = true;
|
||||
externalStorage.flag('active').set(false);
|
||||
}
|
||||
await this.create.configure?.();
|
||||
const workers = this._docWorkerMap;
|
||||
const docWorkerId = await this._addSelfAsWorker(workers);
|
||||
|
||||
|
@ -50,6 +50,7 @@ export interface ICreateActiveDocOptions {
|
||||
export interface ICreateStorageOptions {
|
||||
name: string;
|
||||
check(): boolean;
|
||||
checkBackend?(): Promise<void>;
|
||||
create(purpose: 'doc'|'meta', extraPrefix: string): ExternalStorage|undefined;
|
||||
}
|
||||
|
||||
@ -119,7 +120,10 @@ export function makeSimpleCreator(opts: {
|
||||
},
|
||||
async configure() {
|
||||
for (const s of storage || []) {
|
||||
if (s.check()) { break; }
|
||||
if (s.check()) {
|
||||
await s.checkBackend?.();
|
||||
break;
|
||||
}
|
||||
}
|
||||
},
|
||||
...(opts.shell && {
|
||||
|
@ -107,6 +107,11 @@ export class MinIOExternalStorage implements ExternalStorage {
|
||||
}
|
||||
}
|
||||
|
||||
public async hasVersioning(): Promise<Boolean> {
|
||||
const versioning = await this._s3.getBucketVersioning(this.bucket);
|
||||
return versioning && versioning.Status === 'Enabled';
|
||||
}
|
||||
|
||||
public async versions(key: string, options?: { includeDeleteMarkers?: boolean }) {
|
||||
const results: minio.BucketItem[] = [];
|
||||
await new Promise((resolve, reject) => {
|
||||
|
@ -60,3 +60,16 @@ export function checkMinIOExternalStorage() {
|
||||
region
|
||||
};
|
||||
}
|
||||
|
||||
export async function checkMinIOBucket() {
|
||||
const options = checkMinIOExternalStorage();
|
||||
if (!options) {
|
||||
throw new Error('Configuration check failed for MinIO backend storage.');
|
||||
}
|
||||
|
||||
const externalStorage = new MinIOExternalStorage(options.bucket, options);
|
||||
if (!await externalStorage.hasVersioning()) {
|
||||
await externalStorage.close();
|
||||
throw new Error(`FATAL: the MinIO bucket "${options.bucket}" does not have versioning enabled`);
|
||||
}
|
||||
}
|
||||
|
@ -106,44 +106,49 @@ export async function main(port: number, serverTypes: ServerType[],
|
||||
server.addApiMiddleware();
|
||||
await server.addBillingMiddleware();
|
||||
|
||||
await server.start();
|
||||
try {
|
||||
await server.start();
|
||||
|
||||
if (includeHome) {
|
||||
server.addUsage();
|
||||
if (!includeDocs) {
|
||||
server.addDocApiForwarder();
|
||||
if (includeHome) {
|
||||
server.addUsage();
|
||||
if (!includeDocs) {
|
||||
server.addDocApiForwarder();
|
||||
}
|
||||
server.addJsonSupport();
|
||||
await server.addLandingPages();
|
||||
// todo: add support for home api to standalone app
|
||||
server.addHomeApi();
|
||||
server.addBillingApi();
|
||||
server.addNotifier();
|
||||
server.addTelemetry();
|
||||
await server.addHousekeeper();
|
||||
await server.addLoginRoutes();
|
||||
server.addAccountPage();
|
||||
server.addBillingPages();
|
||||
server.addWelcomePaths();
|
||||
server.addLogEndpoint();
|
||||
server.addGoogleAuthEndpoint();
|
||||
}
|
||||
server.addJsonSupport();
|
||||
await server.addLandingPages();
|
||||
// todo: add support for home api to standalone app
|
||||
server.addHomeApi();
|
||||
server.addBillingApi();
|
||||
server.addNotifier();
|
||||
server.addTelemetry();
|
||||
await server.addHousekeeper();
|
||||
await server.addLoginRoutes();
|
||||
server.addAccountPage();
|
||||
server.addBillingPages();
|
||||
server.addWelcomePaths();
|
||||
server.addLogEndpoint();
|
||||
server.addGoogleAuthEndpoint();
|
||||
|
||||
if (includeDocs) {
|
||||
server.addJsonSupport();
|
||||
server.addTelemetry();
|
||||
await server.addDoc();
|
||||
}
|
||||
|
||||
if (includeHome) {
|
||||
server.addClientSecrets();
|
||||
}
|
||||
|
||||
server.finalize();
|
||||
|
||||
server.checkOptionCombinations();
|
||||
server.summary();
|
||||
return server;
|
||||
} catch(e) {
|
||||
await server.close();
|
||||
throw e;
|
||||
}
|
||||
|
||||
if (includeDocs) {
|
||||
server.addJsonSupport();
|
||||
server.addTelemetry();
|
||||
await server.addDoc();
|
||||
}
|
||||
|
||||
if (includeHome) {
|
||||
server.addClientSecrets();
|
||||
}
|
||||
|
||||
server.finalize();
|
||||
|
||||
server.checkOptionCombinations();
|
||||
server.summary();
|
||||
return server;
|
||||
}
|
||||
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
import { checkMinIOExternalStorage,
|
||||
import { checkMinIOBucket, checkMinIOExternalStorage,
|
||||
configureMinIOExternalStorage } from 'app/server/lib/configureMinIOExternalStorage';
|
||||
import { makeSimpleCreator } from 'app/server/lib/ICreate';
|
||||
import { Telemetry } from 'app/server/lib/Telemetry';
|
||||
@ -12,6 +12,7 @@ export const create = makeSimpleCreator({
|
||||
{
|
||||
name: 'minio',
|
||||
check: () => checkMinIOExternalStorage() !== undefined,
|
||||
checkBackend: () => checkMinIOBucket(),
|
||||
create: configureMinIOExternalStorage,
|
||||
},
|
||||
],
|
||||
|
@ -117,5 +117,7 @@ export async function main() {
|
||||
}
|
||||
|
||||
if (require.main === module) {
|
||||
main().catch((err) => console.error(err));
|
||||
main().catch((err) => {
|
||||
console.error(err);
|
||||
});
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user