diff --git a/api/_common/middleware.js b/api/_common/middleware.js index b00f3b6b..2c5d801f 100644 --- a/api/_common/middleware.js +++ b/api/_common/middleware.js @@ -8,6 +8,9 @@ const TIMEOUT = process.env.API_TIMEOUT_LIMIT ? parseInt(process.env.API_TIMEOUT // If present, set CORS allowed origins for responses const ALLOWED_ORIGINS = process.env.API_CORS_ORIGIN || '*'; +// Disable everything :( Setting this env var will turn off the instance, and show message +const DISABLE_EVERYTHING = !!process.env.VITE_DISABLE_EVERYTHING; + // Set the platform currently being used let PLATFORM = 'NETLIFY'; if (process.env.PLATFORM) { PLATFORM = process.env.PLATFORM.toUpperCase(); } @@ -21,7 +24,6 @@ const headers = { 'Content-Type': 'application/json;charset=UTF-8', }; - const timeoutErrorMsg = 'You can re-trigger this request, by clicking "Retry"\n' + 'If you\'re running your own instance of Web Check, then you can ' + 'resolve this issue, by increasing the timeout limit in the ' @@ -31,6 +33,14 @@ const timeoutErrorMsg = 'You can re-trigger this request, by clicking "Retry"\n' + 'in order to keep running costs affordable, so that Web Check can ' + 'remain freely available for everyone.'; +const disabledErrorMsg = 'Error - WebCheck Temporarily Disabled.\n\n' ++ 'We\'re sorry, but due to the increased cost of running Web Check ' ++ 'we\'ve had to temporatily disable the public instand. ' ++ 'We\'re activley looking for affordable ways to keep Web Check running, ' ++ 'while free to use for everybody.\n' ++ 'In the meantime, since we\'ve made our code free and open source, ' ++ 'you can get Web Check running on your own system, by following the instructions in our GitHub repo'; + // A middleware function used by all API routes on all platforms const commonMiddleware = (handler) => { @@ -45,6 +55,11 @@ const commonMiddleware = (handler) => { // Vercel const vercelHandler = async (request, response) => { + + if (DISABLE_EVERYTHING) { + response.status(503).json({ error: disabledErrorMsg }); + } + const queryParams = request.query || {}; const rawUrl = queryParams.url; @@ -83,6 +98,15 @@ const commonMiddleware = (handler) => { const queryParams = event.queryStringParameters || event.query || {}; const rawUrl = queryParams.url; + if (DISABLE_EVERYTHING) { + callback(null, { + statusCode: 503, + body: JSON.stringify({ error: 'Web-Check is temporarily disabled. Please try again later.' }), + headers, + }); + return; + } + if (!rawUrl) { callback(null, { statusCode: 500, diff --git a/src/components/homepage/TempDisabled.astro b/src/components/homepage/TempDisabled.astro new file mode 100644 index 00000000..7ff564fe --- /dev/null +++ b/src/components/homepage/TempDisabled.astro @@ -0,0 +1,27 @@ +
+ + diff --git a/src/pages/index.astro b/src/pages/index.astro index 60e41202..2ba3b726 100644 --- a/src/pages/index.astro +++ b/src/pages/index.astro @@ -1,12 +1,15 @@ --- import BaseLayout from '@layouts/Base.astro'; import HeroForm from '@components/homepage/HeroForm.astro'; +import TempDisabled from '@/components/homepage/TempDisabled.astro'; import HomeBackground from '@/components/homepage/HomeBackground'; import AboutSection from '@/components/homepage/AboutSection.astro'; import Footer from '@components/scafold/Footer.astro'; const isBossServer = import.meta.env.BOSS_SERVER === true; +const disableEverything = import.meta.env.VITE_DISABLE_EVERYTHING === true; + // Redirect strait to /check or /check/:url if running as self-hosted instance if (!isBossServer) { const searchUrl = new URLSearchParams(new URL(Astro.request.url).search).get('url'); @@ -20,6 +23,7 @@ if (!isBossServer) {