From 03ba9bef8ddab261c1556455e5b85c50fc2f6d8a Mon Sep 17 00:00:00 2001 From: Akama Aka Date: Sat, 18 May 2024 22:33:38 +0200 Subject: [PATCH 01/12] Added Akamai & AWS Request ID Signed-off-by: Akama Aka --- server.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server.js b/server.js index a485576..9752e2d 100644 --- a/server.js +++ b/server.js @@ -78,7 +78,7 @@ module.exports = async function (fastify, opts) { console.error(err); } // Inject the CloudFlare Ray ID - let res = data.replace("__implement-ray-id__", req.headers["cf-ray"] || req.id); + let res = data.replace("__implement-ray-id__", req.headers["cf-ray"] || req.headers["X-Amz-Cf-Id"] || req.headers["akamai-x-get-request-id"] || req.id); // Inject the JavaScript Sources at the bottom of the Body res = res.replace('__implement_body_script__', ''); // Inject the Styling From 49e39228c06079cfc7841dc1cbedba4d923ee303 Mon Sep 17 00:00:00 2001 From: Akama Aka Date: Wed, 5 Jun 2024 11:52:25 +0200 Subject: [PATCH 02/12] Updated Documentation Signed-off-by: Akama Aka --- README.md | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 7c5065b..5800caf 100644 --- a/README.md +++ b/README.md @@ -26,6 +26,7 @@ The system utilizes the following environment variables: * `SERVER_HOSTNAME` - represents the hostname for the server. * `SERVER_LOG_LEVEL` - determines the log level used by the server. * `PATH_IDENTIFIER` - indicates the path name in the URL for which requests will be redirected to this server. +* `REDIS_HOST` - The hostname of your Redis Server ## Installation and setup @@ -69,8 +70,21 @@ services: - SERVER_HOSTNAME=127.0.0.1 - SERVER_LOG_LEVEL=info - PATH_IDENTIFIER=akami-cgi - ports: - - 8080:8080 + - REDIS_HOST=redis-server + ports: + - 8080:8080 + depends_on: + redis-server: + condition: service_started + required: true + redis-server: + image: redis:7.2.4-alpine + ports: + - :6379 + restart: always + healthcheck: + test: [ "CMD", "redis-cli", "--raw", "incr", "ping" ] + ``` To start the Docker Compose stack use this command: ```shell From eb6931e0b9212eb0713dd4ef5c04c645850b22b9 Mon Sep 17 00:00:00 2001 From: Akama Aka Date: Wed, 5 Jun 2024 12:36:41 +0200 Subject: [PATCH 03/12] Updated License to ASPL 1.0 Signed-off-by: Akama Aka --- LICENSE | 414 ++++++-------------------------------------------------- 1 file changed, 38 insertions(+), 376 deletions(-) diff --git a/LICENSE b/LICENSE index 236ac28..4b8ad5f 100644 --- a/LICENSE +++ b/LICENSE @@ -1,402 +1,64 @@ -Attribution-NonCommercial-NoDerivatives 4.0 International +Akami Solutions Public License (ASPL) v1.0 -======================================================================= +© 2024 Akami Solutions, https://akami-solutions.cc +Contact: contact@akami-solutions.cc +Copyright, DMCA, License Violation: dmca@akami-solutions.cc -Creative Commons Corporation ("Creative Commons") is not a law firm and -does not provide legal services or legal advice. Distribution of -Creative Commons public licenses does not create a lawyer-client or -other relationship. Creative Commons makes its licenses and related -information available on an "as-is" basis. Creative Commons gives no -warranties regarding its licenses, any material licensed under their -terms and conditions, or any related information. Creative Commons -disclaims all liability for damages resulting from their use to the -fullest extent possible. +IMPORTANT: THIS IS A LEGALLY BINDING DOCUMENT. READ THIS AGREEMENT CAREFULLY BEFORE USING, MODIFYING, OR DISTRIBUTING THE CODE. THE USE, MODIFICATION, OR DISTRIBUTION OF THE CODE IS SUBJECT TO THE TERMS OF THIS LICENSE. BY USING, MODIFYING, OR DISTRIBUTING THE CODE, YOU AGREE TO BE BOUND BY THE TERMS OF THIS LICENSE. -Using Creative Commons Public Licenses +Preamble -Creative Commons public licenses provide a standard set of terms and -conditions that creators and other rights holders may use to share -original works of authorship and other material subject to copyright -and certain other rights specified in the public license below. The -following considerations are for informational purposes only, are not -exhaustive, and do not form part of our licenses. +This license ("Akami Solutions Public License" or "ASPL") is provided by Akami Solutions ("We" or "Us") to regulate the use, modification, and distribution of the underlying code under the following terms. The aim of this license is to define the rights and obligations of all parties involved and to ensure that the code remains freely accessible for the benefit of the entire community. - Considerations for licensors: Our public licenses are - intended for use by those authorized to give the public - permission to use material in ways otherwise restricted by - copyright and certain other rights. Our licenses are - irrevocable. Licensors should read and understand the terms - and conditions of the license they choose before applying it. - Licensors should also secure all rights necessary before - applying our licenses so that the public can reuse the - material as expected. Licensors should clearly mark any - material not subject to the license. This includes other CC- - licensed material, or material used under an exception or - limitation to copyright. More considerations for licensors: - wiki.creativecommons.org/Considerations_for_licensors +This license applies to all previous and subsequent versions of the project. - Considerations for the public: By using one of our public - licenses, a licensor grants the public permission to use the - licensed material under specified terms and conditions. If - the licensor's permission is not necessary for any reason--for - example, because of any applicable exception or limitation to - copyright--then that use is not regulated by the license. Our - licenses grant only permissions under copyright and certain - other rights that a licensor has authority to grant. Use of - the licensed material may still be restricted for other - reasons, including because others have copyright or other - rights in the material. A licensor may make special requests, - such as asking that all changes be marked or described. - Although not required by our licenses, you are encouraged to - respect those requests where reasonable. More considerations - for the public: - wiki.creativecommons.org/Considerations_for_licensees +Section 1: Definitions -======================================================================= +1. "Project Owner": The term "Project Owner" refers to the original author or authors of the code released under this license. The Project Owner is the natural or legal person who owns the original rights to the code. +2. "Code": The term "Code" refers to the source code, including any modifications, derivations, and derivative works released under this license. +3. "Commercial Use": The term "Commercial Use" refers to any use of the code that aims to generate financial profit or support a business activity, regardless of whether the user directly benefits from the use or not. -Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 -International Public License +Section 2: Prohibited Uses -By exercising the Licensed Rights (defined below), You accept and agree -to be bound by the terms and conditions of this Creative Commons -Attribution-NonCommercial-NoDerivatives 4.0 International Public -License ("Public License"). To the extent this Public License may be -interpreted as a contract, You are granted the Licensed Rights in -consideration of Your acceptance of these terms and conditions, and the -Licensor grants You such rights in consideration of benefits the -Licensor receives from making the Licensed Material available under -these terms and conditions. +Under this license, it is expressly prohibited to: +1. Commercial Use: The use of the code for commercial purposes is strictly prohibited in any form. This includes, without limitation, selling, licensing, renting, or providing the code as part of a commercial product or service. +2. Resale: Any resale of the code or derivative works is prohibited. This includes direct sale, distribution for a fee, or inclusion of the code in commercial products or services. +3. Insertion of AI-generated Code: The insertion of code generated wholly or partly by artificial intelligence is prohibited. This is to protect the integrity of the code and prevent potential security risks. +4. Insertion of Malicious Code: The insertion of malicious code, including malware, worms, or viruses, is strictly prohibited. This includes any actions aimed at compromising the integrity or security of the code or violating the rights of other users. -Section 1 -- Definitions. +Section 3: Permitted Uses - a. Adapted Material means material subject to Copyright and Similar - Rights that is derived from or based upon the Licensed Material - and in which the Licensed Material is translated, altered, - arranged, transformed, or otherwise modified in a manner requiring - permission under the Copyright and Similar Rights held by the - Licensor. For purposes of this Public License, where the Licensed - Material is a musical work, performance, or sound recording, - Adapted Material is always produced where the Licensed Material is - synched in timed relation with a moving image. +Under this license, the following uses are expressly permitted: - b. Copyright and Similar Rights means copyright and/or similar rights - closely related to copyright including, without limitation, - performance, broadcast, sound recording, and Sui Generis Database - Rights, without regard to how the rights are labeled or - categorized. For purposes of this Public License, the rights - specified in Section 2(b)(1)-(2) are not Copyright and Similar - Rights. +1. Modify Code: The code may be modified as desired to meet the user's requirements and needs. +2. Replicate: The code may be copied and replicated in unmodified or modified form to promote distribution and availability for the community. +3. Distribute: The code and derivative works may be distributed, provided that the distribution complies with the terms of this license and maintains the integrity of the code. +4. Create Derivative Works: It is permitted to create new works based on the original code, provided that these new works also comply with the terms of this license. - c. Effective Technological Measures means those measures that, in the - absence of proper authority, may not be circumvented under laws - fulfilling obligations under Article 11 of the WIPO Copyright - Treaty adopted on December 20, 1996, and/or similar international - agreements. +Section 4: Conditions - d. Exceptions and Limitations means fair use, fair dealing, and/or - any other exception or limitation to Copyright and Similar Rights - that applies to Your use of the Licensed Material. +The following conditions must be adhered to for any use, modification, or distribution of the code under this license: - e. Licensed Material means the artistic or literary work, database, - or other material to which the Licensor applied this Public - License. +1. Mention of the Project Owner: The Project Owner must be mentioned in an appropriate manner in the documentation, user interfaces, and all accompanying materials that use, modify, or distribute the code. +2. Same License: All copies, modifications, and derivative works must be published under this same license. This means that any distribution of the code or derivative works must only occur under the terms of this license. - f. Licensed Rights means the rights granted to You subject to the - terms and conditions of this Public License, which are limited to - all Copyright and Similar Rights that apply to Your use of the - Licensed Material and that the Licensor has authority to license. +Section 5: Disclaimer of Liability - g. Licensor means the individual(s) or entity(ies) granting rights - under this Public License. +THE SOFTWARE IS PROVIDED "AS IS," WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES, OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT, OR OTHERWISE, ARISING FROM, OUT OF, OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - h. NonCommercial means not primarily intended for or directed towards - commercial advantage or monetary compensation. For purposes of - this Public License, the exchange of the Licensed Material for - other material subject to Copyright and Similar Rights by digital - file-sharing or similar means is NonCommercial provided there is - no payment of monetary compensation in connection with the - exchange. +Section 6: Retention and Amendment of License - i. Share means to provide material to the public by any means or - process that requires permission under the Licensed Rights, such - as reproduction, public display, public performance, distribution, - dissemination, communication, or importation, and to make material - available to the public including in ways that members of the - public may access the material from a place and at a time - individually chosen by them. +We reserve the right to modify or update this license. Any changes or updates to this license will be published on our website and will take effect immediately. It is the responsibility of the user to regularly review the current version of this license. - j. Sui Generis Database Rights means rights other than copyright - resulting from Directive 96/9/EC of the European Parliament and of - the Council of 11 March 1996 on the legal protection of databases, - as amended and/or succeeded, as well as other essentially - equivalent rights anywhere in the world. +Section 7: Choice of Law and Jurisdiction - k. You means the individual or entity exercising the Licensed Rights - under this Public License. Your has a corresponding meaning. +This license is governed by the laws of [COUNTRY], and any disputes related to this license are subject to the exclusive jurisdiction of the courts of [LOCATION]. +Section 8: Acceptance of License -Section 2 -- Scope. +By using, modifying, or distributing the code, you expressly agree to the terms of this license. If you do not agree with the terms of this license, you are not authorized to use, modify, or distribute the code. - a. License grant. +Section 9: Contact Information - 1. Subject to the terms and conditions of this Public License, - the Licensor hereby grants You a worldwide, royalty-free, - non-sublicensable, non-exclusive, irrevocable license to - exercise the Licensed Rights in the Licensed Material to: - - a. reproduce and Share the Licensed Material, in whole or - in part, for NonCommercial purposes only; and - - b. produce and reproduce, but not Share, Adapted Material - for NonCommercial purposes only. - - 2. Exceptions and Limitations. For the avoidance of doubt, where - Exceptions and Limitations apply to Your use, this Public - License does not apply, and You do not need to comply with - its terms and conditions. - - 3. Term. The term of this Public License is specified in Section - 6(a). - - 4. Media and formats; technical modifications allowed. The - Licensor authorizes You to exercise the Licensed Rights in - all media and formats whether now known or hereafter created, - and to make technical modifications necessary to do so. The - Licensor waives and/or agrees not to assert any right or - authority to forbid You from making technical modifications - necessary to exercise the Licensed Rights, including - technical modifications necessary to circumvent Effective - Technological Measures. For purposes of this Public License, - simply making modifications authorized by this Section 2(a) - (4) never produces Adapted Material. - - 5. Downstream recipients. - - a. Offer from the Licensor -- Licensed Material. Every - recipient of the Licensed Material automatically - receives an offer from the Licensor to exercise the - Licensed Rights under the terms and conditions of this - Public License. - - b. No downstream restrictions. You may not offer or impose - any additional or different terms or conditions on, or - apply any Effective Technological Measures to, the - Licensed Material if doing so restricts exercise of the - Licensed Rights by any recipient of the Licensed - Material. - - 6. No endorsement. Nothing in this Public License constitutes or - may be construed as permission to assert or imply that You - are, or that Your use of the Licensed Material is, connected - with, or sponsored, endorsed, or granted official status by, - the Licensor or others designated to receive attribution as - provided in Section 3(a)(1)(A)(i). - - b. Other rights. - - 1. Moral rights, such as the right of integrity, are not - licensed under this Public License, nor are publicity, - privacy, and/or other similar personality rights; however, to - the extent possible, the Licensor waives and/or agrees not to - assert any such rights held by the Licensor to the limited - extent necessary to allow You to exercise the Licensed - Rights, but not otherwise. - - 2. Patent and trademark rights are not licensed under this - Public License. - - 3. To the extent possible, the Licensor waives any right to - collect royalties from You for the exercise of the Licensed - Rights, whether directly or through a collecting society - under any voluntary or waivable statutory or compulsory - licensing scheme. In all other cases the Licensor expressly - reserves any right to collect such royalties, including when - the Licensed Material is used other than for NonCommercial - purposes. - - -Section 3 -- License Conditions. - -Your exercise of the Licensed Rights is expressly made subject to the -following conditions. - - a. Attribution. - - 1. If You Share the Licensed Material, You must: - - a. retain the following if it is supplied by the Licensor - with the Licensed Material: - - i. identification of the creator(s) of the Licensed - Material and any others designated to receive - attribution, in any reasonable manner requested by - the Licensor (including by pseudonym if - designated); - - ii. a copyright notice; - - iii. a notice that refers to this Public License; - - iv. a notice that refers to the disclaimer of - warranties; - - v. a URI or hyperlink to the Licensed Material to the - extent reasonably practicable; - - b. indicate if You modified the Licensed Material and - retain an indication of any previous modifications; and - - c. indicate the Licensed Material is licensed under this - Public License, and include the text of, or the URI or - hyperlink to, this Public License. - - For the avoidance of doubt, You do not have permission under - this Public License to Share Adapted Material. - - 2. You may satisfy the conditions in Section 3(a)(1) in any - reasonable manner based on the medium, means, and context in - which You Share the Licensed Material. For example, it may be - reasonable to satisfy the conditions by providing a URI or - hyperlink to a resource that includes the required - information. - - 3. If requested by the Licensor, You must remove any of the - information required by Section 3(a)(1)(A) to the extent - reasonably practicable. - - -Section 4 -- Sui Generis Database Rights. - -Where the Licensed Rights include Sui Generis Database Rights that -apply to Your use of the Licensed Material: - - a. for the avoidance of doubt, Section 2(a)(1) grants You the right - to extract, reuse, reproduce, and Share all or a substantial - portion of the contents of the database for NonCommercial purposes - only and provided You do not Share Adapted Material; - - b. if You include all or a substantial portion of the database - contents in a database in which You have Sui Generis Database - Rights, then the database in which You have Sui Generis Database - Rights (but not its individual contents) is Adapted Material; and - - c. You must comply with the conditions in Section 3(a) if You Share - all or a substantial portion of the contents of the database. - -For the avoidance of doubt, this Section 4 supplements and does not -replace Your obligations under this Public License where the Licensed -Rights include other Copyright and Similar Rights. - - -Section 5 -- Disclaimer of Warranties and Limitation of Liability. - - a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE - EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS - AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF - ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS, - IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION, - WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR - PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS, - ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT - KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT - ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU. - - b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE - TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION, - NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT, - INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES, - COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR - USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN - ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR - DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR - IN PART, THIS LIMITATION MAY NOT APPLY TO YOU. - - c. The disclaimer of warranties and limitation of liability provided - above shall be interpreted in a manner that, to the extent - possible, most closely approximates an absolute disclaimer and - waiver of all liability. - - -Section 6 -- Term and Termination. - - a. This Public License applies for the term of the Copyright and - Similar Rights licensed here. However, if You fail to comply with - this Public License, then Your rights under this Public License - terminate automatically. - - b. Where Your right to use the Licensed Material has terminated under - Section 6(a), it reinstates: - - 1. automatically as of the date the violation is cured, provided - it is cured within 30 days of Your discovery of the - violation; or - - 2. upon express reinstatement by the Licensor. - - For the avoidance of doubt, this Section 6(b) does not affect any - right the Licensor may have to seek remedies for Your violations - of this Public License. - - c. For the avoidance of doubt, the Licensor may also offer the - Licensed Material under separate terms or conditions or stop - distributing the Licensed Material at any time; however, doing so - will not terminate this Public License. - - d. Sections 1, 5, 6, 7, and 8 survive termination of this Public - License. - - -Section 7 -- Other Terms and Conditions. - - a. The Licensor shall not be bound by any additional or different - terms or conditions communicated by You unless expressly agreed. - - b. Any arrangements, understandings, or agreements regarding the - Licensed Material not stated herein are separate from and - independent of the terms and conditions of this Public License. - - -Section 8 -- Interpretation. - - a. For the avoidance of doubt, this Public License does not, and - shall not be interpreted to, reduce, limit, restrict, or impose - conditions on any use of the Licensed Material that could lawfully - be made without permission under this Public License. - - b. To the extent possible, if any provision of this Public License is - deemed unenforceable, it shall be automatically reformed to the - minimum extent necessary to make it enforceable. If the provision - cannot be reformed, it shall be severed from this Public License - without affecting the enforceability of the remaining terms and - conditions. - - c. No term or condition of this Public License will be waived and no - failure to comply consented to unless expressly agreed to by the - Licensor. - - d. Nothing in this Public License constitutes or may be interpreted - as a limitation upon, or waiver of, any privileges and immunities - that apply to the Licensor or You, including from the legal - processes of any jurisdiction or authority. - -======================================================================= - -Creative Commons is not a party to its public -licenses. Notwithstanding, Creative Commons may elect to apply one of -its public licenses to material it publishes and in those instances -will be considered the “Licensor.” The text of the Creative Commons -public licenses is dedicated to the public domain under the CC0 Public -Domain Dedication. Except for the limited purpose of indicating that -material is shared under a Creative Commons public license or as -otherwise permitted by the Creative Commons policies published at -creativecommons.org/policies, Creative Commons does not authorize the -use of the trademark "Creative Commons" or any other trademark or logo -of Creative Commons without its prior written consent including, -without limitation, in connection with any unauthorized modifications -to any of its public licenses or any other arrangements, -understandings, or agreements concerning use of licensed material. For -the avoidance of doubt, this paragraph does not form part of the -public licenses. - -Creative Commons may be contacted at creativecommons.org. \ No newline at end of file +For questions or concerns regarding this license, please contact us at contact@akami-solutions.cc. From 53388ee00e4555cba33432fff4a7dc3ac7fec35d Mon Sep 17 00:00:00 2001 From: Akama Aka Date: Wed, 5 Jun 2024 12:39:27 +0200 Subject: [PATCH 04/12] Fixed typo Signed-off-by: Akama Aka --- LICENSE | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/LICENSE b/LICENSE index 4b8ad5f..77c1c6b 100644 --- a/LICENSE +++ b/LICENSE @@ -53,7 +53,7 @@ We reserve the right to modify or update this license. Any changes or updates to Section 7: Choice of Law and Jurisdiction -This license is governed by the laws of [COUNTRY], and any disputes related to this license are subject to the exclusive jurisdiction of the courts of [LOCATION]. +This license is governed by the laws of Austria, and any disputes related to this license are subject to the exclusive jurisdiction of the courts of Vienna. Section 8: Acceptance of License From 47e2ea565de86b35730731575ce25d8e5a2d0394 Mon Sep 17 00:00:00 2001 From: Akama Aka Date: Tue, 11 Jun 2024 10:30:47 +0200 Subject: [PATCH 05/12] Added more request id header support Added request-id Support for: * Oracle Cloud * MS Azure * Google Cloud Signed-off-by: Akama Aka --- server.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/server.js b/server.js index e807c71..46f7fed 100644 --- a/server.js +++ b/server.js @@ -82,7 +82,7 @@ module.exports = async function (fastify, opts) { console.error(err); } // Inject the CloudFlare Ray ID - let res = data.replace("__implement-ray-id__", req.headers["cf-ray"] || req.headers["X-Amz-Cf-Id"] || req.headers["akamai-x-get-request-id"] || req.id); + let res = data.replace("__implement-ray-id__", req.headers["cf-ray"] || req.headers["X-Amz-Cf-Id"] || req.headers["akamai-x-get-request-id"] || req.headers["x-appengine-request-log-id"] || req.headers["requestId"] || req.headers["opc-request-id"] || req.id); // Inject the JavaScript Sources at the bottom of the Body res = res.replace('__implement_body_script__', ''); // Inject the Styling @@ -144,4 +144,4 @@ module.exports = async function (fastify, opts) { } } }) -} \ No newline at end of file +} From 00519ef3c8f7a66bb3b6d971d0a72633758668b3 Mon Sep 17 00:00:00 2001 From: Akama Aka Date: Wed, 12 Jun 2024 20:54:58 +0200 Subject: [PATCH 06/12] Aktualisieren von Dockerfile --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 311a43d..560a888 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM node:21-alpine +FROM node:current-alpine3.19 LABEL authors="Akama Aka" LABEL org.opencontainers.image.licenses="CC-BY-NC-ND 4.0" ENV VERSION=1.0.0.2 \ From b56266c7f1afe1973e9513fad4e3a3ec9c2542fc Mon Sep 17 00:00:00 2001 From: Akama Aka Date: Mon, 1 Jul 2024 11:31:07 +0200 Subject: [PATCH 07/12] Added BunnyCDN Support Signed-off-by: Akama Aka --- server.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/server.js b/server.js index 46f7fed..e056a8b 100644 --- a/server.js +++ b/server.js @@ -82,7 +82,7 @@ module.exports = async function (fastify, opts) { console.error(err); } // Inject the CloudFlare Ray ID - let res = data.replace("__implement-ray-id__", req.headers["cf-ray"] || req.headers["X-Amz-Cf-Id"] || req.headers["akamai-x-get-request-id"] || req.headers["x-appengine-request-log-id"] || req.headers["requestId"] || req.headers["opc-request-id"] || req.id); + let res = data.replace("__implement-ray-id__", req.headers["cf-ray"] || req.headers["cdn-requestid"] || req.headers["X-Amz-Cf-Id"] || req.headers["akamai-x-get-request-id"] || req.headers["x-appengine-request-log-id"] || req.headers["requestId"] || req.headers["opc-request-id"] || req.id); // Inject the JavaScript Sources at the bottom of the Body res = res.replace('__implement_body_script__', ''); // Inject the Styling @@ -105,9 +105,9 @@ module.exports = async function (fastify, opts) { let ttl = 7884000000; // 3 Monate let val = await getCache(ip); const rayResponse = function (response) { - return `Host=${req.headers[":authority"] || req.headers["host"]}\nrequest=${req.headers["cf-ray"] || req.id}\nip=${ip}\ncountry=${response["data"]["located_resources"][0]["locations"][0]["country"]} # IP resolution by RIPE DB & MaxMind` + return `Host=${req.headers[":authority"] || req.headers["host"]}\nrequest=${req.headers["cf-ray"] || req.headers["cdn-requestid"] || req.id}\nip=${ip}\ncountry=${response["data"]["located_resources"][0]["locations"][0]["country"]} # IP resolution by RIPE DB & MaxMind` } - const rayResponseLocal = `Host=${req.headers["host"]}\nRequest ID: ${req.headers["cf-ray"] || req.id}\nIP: ${ip}\nCountry: Local IP`; + const rayResponseLocal = `Host=${req.headers["host"]}\nRequest ID: ${req.headers["cf-ray"] || req.headers["cdn-requestid"] || req.id}\nIP: ${ip}\nCountry: Local IP`; if (!val) { return await fetch('https://stat.ripe.net/data/maxmind-geo-lite/data.json?resource=' + ip, options) .then(response => response.json()) From 2f415dbf96453af88c20a0741c13095aa72c223d Mon Sep 17 00:00:00 2001 From: Akama Aka Date: Mon, 1 Jul 2024 12:45:58 +0200 Subject: [PATCH 08/12] Add default headers and update response headers Default headers have been added to the server response. The "Content-Type" and "Cache-Control" headers have also been updated in the server responses for CSS, fonts, and JavaScript files. The "Cache-Control" values have been changed to 'public' and the max-age increased, to optimize the caching strategy. Signed-off-by: Akama Aka --- server.js | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/server.js b/server.js index e056a8b..879d81b 100644 --- a/server.js +++ b/server.js @@ -3,6 +3,11 @@ const {createReadStream,readFile} = require('node:fs'); const {join,basename,normalize,resolve } = require("node:path"); const {getCache, setCache} = require("./middleware/redis-connector"); require('dotenv').config(); +let defaultHeader = { + "Server": "Akami Solutions", + "X-Powered-By": "A DNS System by Akami Solutions", + "Cache-Control": "private, max-age=2592000" +} module.exports = async function (fastify, opts) { let path_name = process.env.PATH_IDENTIFIER; await fastify.register(require('@fastify/middie')) @@ -25,7 +30,10 @@ module.exports = async function (fastify, opts) { rep.status(403).send('Forbidden'); } else { const stream = createReadStream(filePath, 'utf8'); - rep.header("Content-Type", "text/css").send(stream || null); + rep.headers({ + "Content-Type": "text/css", + "Cache-Control": "public, max-age=2592000" + }).send(stream || null); } }) fastify.get(`/${path_name}/fonts/:asset`, (req, rep) => { @@ -34,7 +42,10 @@ module.exports = async function (fastify, opts) { return false; } const stream = createReadStream(path.join(__dirname, '/assets/fonts/'+req.params.asset), 'utf8'); - rep.header("Content-Type", "font/ttf").send(stream || null); + rep.headers({ + "Content-Type": "font/ttf", + "Cache-Control": "public, max-age=2592000" + }).send(stream || null); }) fastify.get(`/${path_name}/js/:asset`, (req, rep) => { const reg = /\.js$/.test(req.params.asset) @@ -42,7 +53,10 @@ module.exports = async function (fastify, opts) { return false; } const stream = createReadStream(join(__dirname, '/assets/js/'+req.params.asset), 'utf8'); - rep.header("Content-Type", "application/javascript").send(stream || null); + rep.headers({ + "Content-Type": "application/javascript", + "Cache-Control": "public, max-age=2592000" + }).send(stream || null); }) fastify.get(`/${path_name}/status/:code`, (req, rep) => { let fn; @@ -96,6 +110,7 @@ module.exports = async function (fastify, opts) { "Server": "Akami Solutions", "X-Powered-By": "A DNS System by Akami Solutions" }).send(result); + rep.headers(defaultHeader).send(result); }); }) fastify.get(`/${path_name}/xray`, async (req, rep) => { From 6202f02a6e166389143d7a65cb688367b0ff2afb Mon Sep 17 00:00:00 2001 From: Akama Aka Date: Mon, 1 Jul 2024 12:46:28 +0200 Subject: [PATCH 09/12] Refactor request IP and ID retrievals in server handling This commit updates the server.js to improve the way it retrieves request IPs and IDs. Instead of fetching this information in several lines of code across the functions, the refactor adopts a more efficient, streamlined approach by assigning these values to variables and reusing them. This change reduces code redundancy and enhances readability. Signed-off-by: Akama Aka --- server.js | 26 ++++++++++++-------------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/server.js b/server.js index 879d81b..6a04a16 100644 --- a/server.js +++ b/server.js @@ -60,6 +60,8 @@ module.exports = async function (fastify, opts) { }) fastify.get(`/${path_name}/status/:code`, (req, rep) => { let fn; + let req_id = req.headers["cf-ray"] || req.headers["cdn-requestid"] || req.headers["X-Amz-Cf-Id"] || req.headers["akamai-x-get-request-id"] || req.headers["x-appengine-request-log-id"] || req.headers["requestId"] || req.headers["opc-request-id"] || req.id; + let req_ip = req.headers["Cf-Connecting-Ip"] || req.headers["cf-connecting-ipv6"] || req.headers["x-real-ip"] || req.headers["x-forwarded-for"] || req.ip; switch (req.params.code) { case "403": fn = "accessForbidden.html"; @@ -96,7 +98,7 @@ module.exports = async function (fastify, opts) { console.error(err); } // Inject the CloudFlare Ray ID - let res = data.replace("__implement-ray-id__", req.headers["cf-ray"] || req.headers["cdn-requestid"] || req.headers["X-Amz-Cf-Id"] || req.headers["akamai-x-get-request-id"] || req.headers["x-appengine-request-log-id"] || req.headers["requestId"] || req.headers["opc-request-id"] || req.id); + let res = data.replace("__implement-ray-id__", req_id); // Inject the JavaScript Sources at the bottom of the Body res = res.replace('__implement_body_script__', ''); // Inject the Styling @@ -104,31 +106,27 @@ module.exports = async function (fastify, opts) { ' ') // Inject the Client IP - const result = res.replace("__implement-ip__", req.headers["cf-ip"] || req.ip); - rep.headers({ - "Content-Type": "text/html", - "Server": "Akami Solutions", - "X-Powered-By": "A DNS System by Akami Solutions" - }).send(result); + const result = res.replace("__implement-ip__", req_ip); rep.headers(defaultHeader).send(result); }); }) fastify.get(`/${path_name}/xray`, async (req, rep) => { // Resolve the IP Country const options = {method: 'GET', headers: {'User-Agent': 'insomnia/8.3.0'}}; - let ip = req.headers["Cf-Connecting-Ip"] || req.headers["x-forwarded-for"] || req.headers["cf-pseudo-ipv4"] || req.ip; + let req_id = req.headers["cf-ray"] || req.headers["cdn-requestid"] || req.headers["X-Amz-Cf-Id"] || req.headers["akamai-x-get-request-id"] || req.headers["x-appengine-request-log-id"] || req.headers["requestId"] || req.headers["opc-request-id"] || req.id; + let req_ip = req.headers["Cf-Connecting-Ip"] || req.headers["cf-connecting-ipv6"] || req.headers["x-real-ip"] || req.headers["x-forwarded-for"] || req.ip; let ttl = 7884000000; // 3 Monate - let val = await getCache(ip); + let val = await getCache(req_ip); const rayResponse = function (response) { - return `Host=${req.headers[":authority"] || req.headers["host"]}\nrequest=${req.headers["cf-ray"] || req.headers["cdn-requestid"] || req.id}\nip=${ip}\ncountry=${response["data"]["located_resources"][0]["locations"][0]["country"]} # IP resolution by RIPE DB & MaxMind` + return `Host=${req.headers[":authority"] || req.headers["host"]}\nrequest=${req_id}\nip=${req_ip}\ncountry=${response["data"]["located_resources"][0]["locations"][0]["country"]} # IP resolution by RIPE DB & MaxMind` } - const rayResponseLocal = `Host=${req.headers["host"]}\nRequest ID: ${req.headers["cf-ray"] || req.headers["cdn-requestid"] || req.id}\nIP: ${ip}\nCountry: Local IP`; + const rayResponseLocal = `Host=${req.headers["host"]}\nRequest ID: ${req_id}\nIP: ${req_ip}\nCountry: Local IP`; if (!val) { - return await fetch('https://stat.ripe.net/data/maxmind-geo-lite/data.json?resource=' + ip, options) + return await fetch('https://stat.ripe.net/data/maxmind-geo-lite/data.json?resource=' + req_ip, options) .then(response => response.json()) .then(response => { if (response && response["data"]["located_resources"].length > 0) { - return setCache(ip, response, ttl).then((r) => { + return setCache(req_ip, response, ttl).then((r) => { if (r.error) { fastify.log.error(r.error); return rep.headers("Content-Type", "text/plain").code(500).send("Internal Server Error"); @@ -139,7 +137,7 @@ module.exports = async function (fastify, opts) { return rep.headers("Content-Type", "text/plain").code(500).send("Internal Server Error"); }); } else { - return setCache(ip, response, ttl).then((r) => { + return setCache(req_ip, response, ttl).then((r) => { if (r.error) { fastify.log.error(r.error); } From 0422fcf47d8dc85faa0188225e75a02526b8404b Mon Sep 17 00:00:00 2001 From: Akama Aka Date: Tue, 2 Jul 2024 11:24:30 +0200 Subject: [PATCH 10/12] Update error page labels from CloudFlare Ray to Request ID The error page labels in our HTML files have been updated. The text "CloudFlare Ray" was replaced with "Request ID" to better reflect the information actually displayed. This change is relevant in multiple error instances across the site. Signed-off-by: Akama Aka --- html/accessForbidden.html | 2 +- html/badGateway.html | 2 +- html/directAccessForbidden.html | 2 +- html/gatewayTimeout.html | 2 +- html/internalServerError.html | 2 +- html/noDatabaseConnection.html | 2 +- html/pageNotFound.html | 2 +- html/serviceUnavailable.html | 2 +- html/sslError.html | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/html/accessForbidden.html b/html/accessForbidden.html index 07759b0..e190bd9 100644 --- a/html/accessForbidden.html +++ b/html/accessForbidden.html @@ -68,7 +68,7 @@

What you can do?

- CloudFlare Ray: __implement-ray-id__ + Request ID: __implement-ray-id__
IP Address: __implement-ip__ diff --git a/html/badGateway.html b/html/badGateway.html index 7ff221d..5436f30 100644 --- a/html/badGateway.html +++ b/html/badGateway.html @@ -53,7 +53,7 @@

What you can do?

- CloudFlare Ray: __implement-ray-id__ + Request ID: __implement-ray-id__
IP Address: __implement-ip__ diff --git a/html/directAccessForbidden.html b/html/directAccessForbidden.html index 43ad917..7065f5a 100644 --- a/html/directAccessForbidden.html +++ b/html/directAccessForbidden.html @@ -55,7 +55,7 @@

What you can do?

- CloudFlare Ray: __implement-ray-id__ + Request ID: __implement-ray-id__
IP Address: __implement-ip__ diff --git a/html/gatewayTimeout.html b/html/gatewayTimeout.html index c6a9110..014e162 100644 --- a/html/gatewayTimeout.html +++ b/html/gatewayTimeout.html @@ -53,7 +53,7 @@

What you can do?

- CloudFlare Ray: __implement-ray-id__ + Request ID: __implement-ray-id__
IP Address: __implement-ip__ diff --git a/html/internalServerError.html b/html/internalServerError.html index 31e2206..ab35052 100644 --- a/html/internalServerError.html +++ b/html/internalServerError.html @@ -53,7 +53,7 @@

What you can do?

- CloudFlare Ray: __implement-ray-id__ + Request ID: __implement-ray-id__
IP Address: __implement-ip__ diff --git a/html/noDatabaseConnection.html b/html/noDatabaseConnection.html index e49ba03..4644b72 100644 --- a/html/noDatabaseConnection.html +++ b/html/noDatabaseConnection.html @@ -58,7 +58,7 @@

What you can do?

- CloudFlare Ray: __implement-ray-id__ + Request ID: __implement-ray-id__
IP Address: __implement-ip__ diff --git a/html/pageNotFound.html b/html/pageNotFound.html index 09fb71a..59e6de2 100644 --- a/html/pageNotFound.html +++ b/html/pageNotFound.html @@ -53,7 +53,7 @@

What you can do?

- CloudFlare Ray: __implement-ray-id__ + Request ID: __implement-ray-id__
IP Address: __implement-ip__ diff --git a/html/serviceUnavailable.html b/html/serviceUnavailable.html index c61e447..e25b635 100644 --- a/html/serviceUnavailable.html +++ b/html/serviceUnavailable.html @@ -54,7 +54,7 @@

What you can do?

- CloudFlare Ray: __implement-ray-id__ + Request ID: __implement-ray-id__
IP Address: __implement-ip__ diff --git a/html/sslError.html b/html/sslError.html index 8fb3ba6..3862312 100644 --- a/html/sslError.html +++ b/html/sslError.html @@ -71,7 +71,7 @@

What you can do?

- CloudFlare Ray: __implement-ray-id__ + Request ID: __implement-ray-id__
IP Address: __implement-ip__ From 057c6a71c2cf7e8d786b7a676262e168fba23ef6 Mon Sep 17 00:00:00 2001 From: Akama Aka Date: Tue, 2 Jul 2024 12:35:04 +0200 Subject: [PATCH 11/12] Add multilingual error descriptions to lang.json A new file named lang.json has been created to store error descriptions in different languages. The descriptions cover a range of HTTP status codes and other common errors. This will help in conveying clear error messages to users, enhancing the user's understanding of any issues encountered. Currently, the languages supported are English, German (Germany), and German (Austria). Signed-off-by: Akama Aka --- lang/lang.json | 188 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 188 insertions(+) create mode 100644 lang/lang.json diff --git a/lang/lang.json b/lang/lang.json new file mode 100644 index 0000000..e5ef0de --- /dev/null +++ b/lang/lang.json @@ -0,0 +1,188 @@ +{ + "en-en": { + "client": "Client", + "networking": "Networking", + "subtitle1": "What happened?", + "subtitle2": "What you can do?", + "requestId": "Request ID:", + "ipAddress": "IP Address:", + "database": "Database", + "301": { + "title": "Moved Permanently, Trail the New Path", + "text1": "Bumped into a \"Moved Permanently\" (301)? It's like heading to your usual coffee shop only to find a sign saying they've moved. Time to change your GPS destination (check the new URL or ask the website's support for directions).", + "text2": "Seeing a \"Moved Permanently\" (301) is like trying to find a shop that's changed locations. The establishment you were looking for has moved to a new address (URL). Check the new address or talk to the movers (the support team) to find the shop's new home." + }, + "304": { + "title": "Not Modified, You're Up-To-Date", + "text1": "Dealing with a \"Not Modified\" (304)? Imagine refreshing your news feed only to find no new posts. The web page hasn't changed since your last visit, so your cached copy is still valid. Go on, hang tight & save those data bytes.", + "text2": "Runs into \"Not Modified\" (304)? It's like flipping to a favorite channel and seeing a re-run of a show you've already seen. The webpage content hasn't updated since your last visit. So, you can continue to use your cached version. Enjoy the rerun!" + }, + "400": { + "title": "Oops! Bad Request", + "text1": "Wrestling with a \"Bad Request\" (400)? Picture dialing a phone number but accidentally pressing the wrong keys. Your browser sent a request that the server didn't understand. Double-check your input or consult with the operator (contact the support team)!", + "text2": "Encountering a \"Bad Request\" (400) can feel like speaking an alien language to someone. The server didn't understand your request. Make sure you're speaking the same language (check your syntax or request format). If the confusion persist, ask for a translator's help (website's support team)." + }, + "403": { + "title": "Uh oh! You're in Forbidden Territory", + "text1": "The \"Forbidden\" error (403) is like trying to walk into a private, ‘members only’ club without a membership card. You may have tried to access a page or perform a task you're not permitted to. Check your credentials, make sure you're not crossing any boundary lines, or touch base with the site's management for assistance.", + "text2": "It’s like trying to join a secret society. Hitting the \"Forbidden\" (403) sign means that you tried to peak into a restricted room. It seems the access to the secret treasure (or page) is locked. Try the key (user credentials) again, or ask the society's leader (the site admin) for help!" + }, + "404": { + "title": "Eek! Page Not Found", + "text1": "The pesky \"404 Not Found\" is like reading a treasure map and finding no treasure. Could've been moved, or maybe we have the wrong map (URL). Try clearing your cache, or navigating from the home (main) page.", + "text2": "Seeing a 404 is kind of like looking for your socks and not finding them. Maybe they're in the laundry (clear your cache), or you're looking in the wrong drawer (check the URL). If all else fails, you might need to buy new socks (contact the administrator or look for your content elsewhere)." + }, + "500": { + "title": "Uh oh! Internal Server Mix-Up", + "text1": "A \"500 Internal Server Error\" is like finding a mess inside a room, but not knowing who made it. The janitors (devs) are probably already cleaning up. Give 'em a moment and try later.", + "text2": "Getting a \"500 Internal Server Error\" can feel like trying to read a book in the dark. Your best light source might be refreshing the page, clearing your cache, or coming back later." + }, + "502": { + "title": "Oops! Bad Gateway Ahead", + "text1": "Encountering a \"502 Bad Gateway\" is like knocking on a door and getting no answer. Try knocking again (refreshing the page) or maybe clean your shoes (clear your browser's cache) before the next visit. If no one's answering, they might be busy fixing some issues inside. Try again later or ring up the site's support team!", + "text2": "Facing a \"502 Bad Gateway\" can feel like being stuck behind a road closure. Try turning around (refreshing the page), or clearing the road (your browser's cache). If the road remains closed, it could be under repair. Your best bet may be to return later or reach out to the responsible highway department (the website's support team)." + }, + "503": { + "title": "Hang Tight, Service Unavailable", + "text1": "With an off-stage \"503 Service Unavailable\", think of the website like a theater with a closed curtain. They're just setting up the stage for the next act. Freshen up (try a refresh) or come back in a while.", + "text2": "Encountering a \"503 Service Unavailable\" is like waiting in line for a rollercoaster that's under maintenance. They're probably tightening the screws and oiling the tracks. Maybe use this break for a corn dog and try again later?" + }, + "504": { + "title": "Server Says Timeout", + "text1": "A \"504 Gateway Timeout\"? Consider it as going to a fast-food joint where they aren't so fast. It might just be a lunch rush, or maybe the fryer's down. Give it a few, then press F5 or refresh. Still not fixing it? Could be time to contact the shop (website's support).", + "text2": "Facing a \"504 Gateway Timeout\" error can be as frustrating as being in a slow-moving checkout queue. Try refreshing the page or come back in a while. If the line continues to move slowly, reach out to the store manager (website's support)." + }, + "1000": { + "title": "Access Blocked! No Direct Entry", + "text1": "The \"Direct Access Forbidden\" error is like a private party where only guests with invitations are allowed. Your direct attempt to visit was turned away at the door because your name (IP address) is not on the list. Try entering through the main gate (appropriate domain or URL), or discuss with the event organizer (website's support).", + "text2": "Hitting the \"Direct Access Forbidden\" wall is just like trying to enter a club without a VIP pass. You tried to get in directly, but the bouncer (server) said, 'No admission without domain entry!' Ensure you're entering via the front door (using the correct URL or intended path) and not the staff entrance (direct IP). If all else fails, consider having a chat with the club's manager (website's support)!" + }, + "1001": { + "title": "Database Unavailable", + "text1": "Running into \"Service Unavailable\" is like going to a library, only to find it temporarily closed for inventory check. The database, our digital librarian, is currently unavailable, perhaps busy with a network hiccup, a rest period or overly crowded with requests. Our technicians, eager as bookworms, are on the case. We appreciate your understanding.", + "text2": "A closed library door, that's what a \"Database Error\" feels like. But don't worry, it might just be a quick clean-up or rearrangement of shelves. Try refreshing the page or come back in a while. If the door still won't budge, reach out to the town hall (our support) and we'll sort this out." + } + }, + "de-de": { + "client": "Klient", + "networking": "Netzwerk", + "subtitle1": "Was ist passiert?", + "subtitle2": "Was kannst du tun?", + "requestId": "Anfrage-ID:", + "ipAddress": "IP-Adresse:", + "database": "Datenbank", + "301": { + "title": "Dauerhaft verschoben, verfolge den neuen Pfad", + "text1": "Du bist auf einen \"Dauerhaft verschoben\" (301) Fehler gestoßen? Das ist so, als würdest du zu deinem üblichen Café gehen, nur um festzustellen, dass es umgezogen ist. Es ist Zeit, dein GPS-Ziel zu ändern (überprüfe die neue URL oder frage den Support der Webseite nach Anweisungen).", + "text2": "Wenn du einen \"Dauerhaft verschoben\" (301) Fehler siehst, ist das so, als würdest du versuchen, ein Geschäft zu finden, das den Standort gewechselt hat. Das Geschäft, das du gesucht hast, ist an eine neue Adresse (URL) umgezogen. Überprüfe die neue Adresse oder sprich mit den Umzugshelfern (dem Support-Team), um das neue Zuhause des Geschäftes zu finden." + }, + "304": { + "title": "Nicht verändert, du bist auf dem neuesten Stand", + "text1": "Du hast mit einem \"Nicht verändert\" (304) Fehler zu tun? Stelle dir vor, du aktualisierst deinen News-Feed und findest keine neuen Beiträge. Die Webseite hat sich seit deinem letzten Besuch nicht verändert, daher ist deine zwischengespeicherte Kopie immer noch gültig. Mach weiter, halte durch und spare diese Datenbits.", + "text2": "Triffst du auf einen \"Nicht verändert\" (304) Fehler? Das ist so, als würdest du zu einem Lieblingskanal umschalten und eine Wiederholung einer bereits gesehenen Show sehen. Der Inhalt der Webseite hat sich seit deinem letzten Besuch nicht aktualisiert. Daher kannst du weiterhin deine zwischengespeicherte Version verwenden. Genieße die Wiederholung!" + }, + "400": { + "title": "Hoppla! Schlechte Anfrage", + "text1": "Du kämpfst mit einer \"Schlechte Anfrage\" (400)? Stelle dir vor, du wählst eine Telefonnummer, drückst aber versehentlich die falschen Tasten. Dein Browser hat eine Anforderung gesendet, die der Server nicht verstanden hat. Überprüfe deine Eingabe doppelt oder konsultiere den Betreiber (kontaktiere das Support-Team)!", + "text2": "Begegnest du einer \"Schlechte Anfrage\" (400), ist das so, als würdest du eine fremde Sprache zu jemandem sprechen. Der Server hat deine Anforderung nicht verstanden. Stelle sicher, dass du die gleiche Sprache sprichst (überprüfe deine Syntax oder das Format deiner Anfrage). Wenn die Verwirrung weiterhin besteht, frage nach Hilfe eines Übersetzers (Support-Team der Website)." + }, + "403": { + "title": "Uh oh! Du bist in verbotenem Gebiet", + "text1": "Der \"Verboten\" Fehler (403) tritt auf, wenn du versuchst, in einen privaten, nur für Mitglieder zugänglichen Club zu gehen, ohne eine Mitgliedskarte zu haben. Du hast vielleicht versucht, auf eine Seite zuzugreifen oder eine Aufgabe auszuführen, die dir nicht erlaubt ist. Überprüfe deine Anmeldedaten, stelle sicher, dass du keine Grenzen überschreitest, oder setze dich mit der Leitung der Website in Verbindung, um Hilfe zu erhalten.", + "text2": "Es ist wie der Versuch, einer Geheimgesellschaft beizutreten. Das Auftreten des \"Verboten\" (403) Schildes bedeutet, dass du versucht hast, in einen abgesperrten Raum zu schauen. Es scheint, dass der Zugang zum geheimen Schatz (oder zur Seite) gesperrt ist. Versuche den Schlüssel (Benutzerdaten) erneut oder frage den Leiter der Gesellschaft (den Administrator der Website) um Hilfe!" + }, + "404": { + "title": "Eek! Seite nicht gefunden", + "text1": "Der lästige \"Nicht gefunden\" (404) Fehler tritt auf, wenn du eine Schatzkarte liest und keinen Schatz findest. Könnte verschoben worden sein, oder vielleicht haben wir die falsche Karte (URL). Versuche, deinen Cache zu löschen oder navigiere von der Hauptseite.", + "text2": "Einen 404-Fehler zu sehen, ist so, als würde man nach seinen Socken suchen und sie nicht finden. Vielleicht sind sie in der Wäsche (lösche deinen Cache), oder du suchst in der falschen Schublade (überprüfe die URL). Wenn alles andere scheitert, musst du vielleicht neue Socken kaufen (kontaktiere den Administrator oder suche deinen Inhalt woanders)." + }, + "500": { + "title": "Uh oh! Interner Server Durcheinander", + "text1": "Ein \"500 Interner Serverfehler\" ist wie eine Unordnung in einem Raum zu finden, ohne zu wissen, wer sie verursacht hat. Die Reinigungskräfte (Entwickler) sind wahrscheinlich schon dabei, aufzuräumen. Gib ihnen ein Moment und versuche es später.", + "text2": "Ein \"500 Interner Serverfehler\" zu bekommen, kann sich so anfühlen, als würde man versuchen, ein Buch im Dunkeln zu lesen. Deine beste Lichtquelle könnte das Aktualisieren der Seite, das Löschen deines Caches oder das Später-Wiederkommen sein." + }, + "502": { + "title": "Hoppla! Schlechtes Gateway voraus", + "text1": "Beim Auftreten eines \"502 Schlechtes Gateway\" Fehlers ist es, als würdest du an eine Tür klopfen und keine Antwort erhalten. Versuche, noch einmal zu klopfen (aktualisiere die Seite) oder vielleicht deine Schuhe zu säubern (lösche den Cache deines Browsers), bevor du den nächsten Besuch machst. Wenn niemand antwortet, sind sie vielleicht damit beschäftigt, einige Probleme im Inneren zu beheben. Versuche es später erneut oder rufe das Support-Team der Seite an!", + "text2": "Einem \"502 Schlechtes Gateway\" Fehler zu begegnen, kann sich anfühlen, als würde man hinter einer Straßensperre feststecken. Versuche, umzudrehen (aktualisiere die Seite), oder die Straße frei zu machen (den Cache deines Browsers zu löschen). Wenn die Straße weiterhin geschlossen bleibt, könnte sie repariert werden. Deine beste Wahl könnte sein, später zurückzukehren oder sich an die zuständige Autobahnbehörde (das Support-Team der Website) zu wenden." + }, + "503": { + "title": "Bleib dran, Dienst nicht verfügbar", + "text1": "Bei einem nicht vorhandenen \"503 Service nicht verfügbar\", denke an die Webseite wie an ein Theater mit geschlossenem Vorhang. Sie stellen gerade die Bühne für den nächsten Akt auf. Frische dich auf (versuche eine Aktualisierung) oder komm später wieder.", + "text2": "Beim Auftreten eines \"503 Service nicht verfügbar\" Fehlers ist es, als würde man in der Reihe für eine Achterbahn warten, die sich in Wartung befindet. Wahrscheinlich ziehen sie gerade die Schrauben fest und ölen die Spuren. Vielleicht nutzt du diese Pause für einen Hotdog und versuchst es später nochmal?" + }, + "504": { + "title": "Server meldet Zeitüberschreitung", + "text1": "Ein \"504 Gateway Timeout\"? Betrachte es so, als würdest du in ein Fast-Food-Restaurant gehen, wo es nicht so schnell geht. Es könnte gerade Stoßzeit sein oder vielleicht ist die Fritteuse ausgefallen. Warte ein wenig, dann drücke F5 oder aktualisiere. Behebt das immer noch nicht das Problem? Dann könnte es an der Zeit sein, den Shop (den Support der Website) zu kontaktieren.", + "text2": "Einem \"504 Gateway Timeout\" Fehler zu begegnen kann so frustrierend sein, wie in einer langsam bewegenden Kassenschlange zu stehen. Versuche, die Seite zu aktualisieren oder komme in einer Weile zurück. Wenn die Schlange sich weiterhin langsam bewegt, wende dich an den Filialleiter (den Support der Website)." + }, + "1000": { + "title": "Zugriff blockiert! Kein direkter Eintritt", + "text1": "Der Fehler \"Direkter Zugriff verboten\" ist wie eine private Party, zu der nur Gäste mit Einladung zugelassen sind. Dein direkter Versuch, den Besuch wurde an der Tür abgewiesen, weil dein Name (IP-Adresse) nicht auf der Liste stand. Versuche, durch das Haupttor (geeignete Domain oder URL) einzutreten, oder spreche mit dem Veranstalter (Support der Website).", + "text2": "Auf die \"Direkter Zugriff verboten\" Mauer zu stoßen ist so, als würde man versuchen, einen Club ohne VIP-Pass zu betreten. Du hast versucht, direkt reinzukommen, aber der Türsteher (Server) sagte: 'Kein Eintritt ohne Domain-Eingang!' Stelle sicher, dass du durch die Vordertür (mit der korrekten URL oder dem vorgesehenen Pfad) eintrittst und nicht durch den Personaleingang (direkte IP). Falls alles andere fehlschlägt, erwäge ein Gespräch mit dem Clubmanager (Support der Webseite)!" + }, + "1001": { + "title": "Datenbank nicht verfügbar", + "text2": "Eine geschlossene Bibliothekstür, so fühlt sich ein \"Datenbankfehler\" an. Aber keine Sorge, es könnte nur eine schnelle Reinigung oder Neuordnung der Regale sein. Versuche, die Seite zu aktualisieren oder komme in einer Weile wieder. Wenn die Tür immer noch verschlossen ist, wende dich an das Rathaus (unser Support), und wir werden das klären." + } + }, + "de-at": { + "client": "Kunde", + "networking": "Netzwerk", + "subtitle1": "Wos is passiert?", + "subtitle2": "Wos kannst du tun?", + "requestId": "Anfrage-ID:", + "ipAddress": "IP Adresse:", + "database": "Datenbank", + "301": { + "title": "Permanent umzogn, geh da neuen Weg", + "text1": "Du bist auf einen \"Permanent umzogn\" (301) Fehler gestoßn? Stell da voa, du gehst zu deinem Lieblingscafé und findest ein Schild, dass sie umgezogn san. Zeit, dass du dein Navi nei adjustierst (schau die neue URL an oder frag den Webseiten-Support nach wegweisungen).", + "text2": "Mit einem \"Permanent umzogn\" (301) konfrontiert zu werdn is wie a Gschäft zu suchn, des umzogn is. Das Geschäft, das du gsucht hast, is zu ner neichn Adresse (URL) umzogn. Guad is, wannst die neue Adresse nachschaugst oder redst mit die Umzugshelfer (die Supportmitarbeiter) ums neue Geschäft zu findn." + }, + "304": { + "title": "Nix Neichs, alles beim Alten", + "text1": "Ein \"304 Nicht geändert\" Fehler is wie wennst zu deinem Lieblings-Wirtshaus gehst und sie immer noch dasselbe Menü haben. Deine Anfrage war erfolgreich, aber es gibt nix Neichs zur letzten Anfrage. Mach dir ka Sorgen, dein Browser wird einfach die bestehenden Daten verwenden.", + "text2": "Wennst a \"304 Nicht geändert\" Nachricht bekommst, dann is es so, als würdest du deinen Postkasten öffnen und finden, dass die Post noch nix Neichs geliefert hat. Du kriegst vielleicht die gleichen Nachrichten, die du vorhin schon bekommen hast. Da musst nicht nervös werden, dein Browser wird einfach die alten Meldungen nochmal ausgeben." + }, + "400": { + "title": "Heast! Falsche Anfrage", + "text1": "Du kämpfst mit einer \"Falsche Anfrage\" (400)? Stell dir vor, du wählst a Telefonnummer, drückst aber aus Versehen die falschen Tasten. Dein Browser hat a Anforderung gesendet, die der Server net hat verstehen können. Überprüf deine Eingabe doppelt oder frag beim Betreiber (kontaktiere das Support-Team) nach!", + "text2": "Hasts a \"Falsche Anfrage\" (400) bekommen, fühlts sich an als würdest du mit jemandem in a fremder Sprache reden. Der Server hat deine Anfrage ned verstanden. Schau, dass ihr dieselbe Sprache redets (überprüfe deine Syntax oder das Format deiner Anfrage). Wenn die Verwirrung weiterhin besteht, frag nach Hilfe eines Übersetzers (Support-Team der Website)." + }, + "403": { + "title": "Oje! Du bist im verbotenen Gebiet", + "text1": "Der \"Verboten\" Fehler (403), is wie wennst probierst, in an privaten, nur fia Mitglieder zugänglichen Club zu kommen, ohne an Ausweis. Vielleicht hast probiert, auf a Seite zuzugreifen oder a Aufgabe auszuführen, die dir ned erlaubt is. Überprüf deine Anmeldedaten, schau, dass du ka Grenzen überschreitst, oder meld dich beim Website's Management für Hilfe.", + "text2": "Hast das \"Verboten\" (403) Schild erwischt, hast wahrscheinlich probiert, in a abgesperrten Raum zu schauen. Zugang zum versteckten Schatz (oder zur Seite) is gesperrt. Probier den Schlüssel (Benutzerdaten) noch mal oder frag den Chef von der Gesellschaft (Website-Admin) um Hilfe!" + }, + "404": { + "title": "Eieiei! Seite net gefunden", + "text1": "Der lästige \"Net gefunden\" (404) Fehler is wie a Schatzkarte zu lesen und ka Schatz zu finden. Könnt's verschoben worden sein, oder vielleicht haben wir die falsche Karte (URL). Versuch, deinen Cache zu leeren oder geh von da Hauptseite aus weiter.", + "text2": "A 404 zu sehen is so, als würdest du nach deinen Socken suchen und sie nicht finden. Vielleicht san sie in der Wäsche (leer deinen Cache), oder du suchst in der falschen Lade (überprüf die URL). Wenn alles andere fehlschlägt, musst vielleicht neue Socken kaufen (kontaktier den Administrator oder such dein Inhalt anderswo)." + }, + "500": { + "title": "Autschn! Da is was schief gangen", + "text1": "Du erlebst an \"500 Interner Server Fehler\"? Is wie wennst zu an Kirtag gehst und zufällig das Riesenrad kaputt is. Unsere Maschinerie (der Server) hat a Problem und wir wissen noch net genau was. Unsere besten Mechaniker (Website-Techniker) arbeiten aber schon dran.", + "text2": "Mit einem \"500 Interner Server Fehler\" knackt die Glückssträhne leider. Is wie wennst das Gewinnlos kaufst und dann feststellst, dass der Hauptpreis ein kaputts Riesenrad is. Jedenfalls is unsere Maschine (Server) grad stecken geblieben. Aber mach dir ka Sorgen, die besten Mechaniker der Stadt (unsere IT-Abteilung) sind schon dran." + }, + "503": { + "title": "Bedienung net verfügbar, wir machen Pause", + "text1": "Hast'n \"503 Service Unavailable\" erhalten? Anscheinend braucht unser Server (wie ein Kellner in der Mittagspause) kurz a Auszeit. Entweder is er überlastet oder wegen Wartung kurz offline. Versuche es später noch einmal.", + "text2": "Bekommen zu haben a \"503 Service Unavailable\" is wie wenn dein Lieblings-Wurstelstand gerade zuat is. Unser Server (Wurstelstand) is derzeit unerreichbar. Es könnt' sein, dass er gerade eine große Menge Bestellungen bewältigt oder eine Wartung durchführt. Komme bitte später wieder." + }, + "504": { + "title": "Der Server braucht a bissl länger", + "text1": "Du hast an \"504 Gateway Timeout\" Fehler? Das is wie wennst in a Fast-Food-Lokal geht und es a bissal länger dauert. Vielleicht is gerade viel Betrieb oder die Fritter ist kaputt. Wart a bissal und dann drück auf F5 oder aktualisiere die Seite. Hilft's immer noch net? Dann is's vielleicht Zeit, den Inhaber (Website-Support) zu kontaktieren.", + "text2": "A \"504 Gateway Timeout\" Fehler zu erleben kann so frustrierend sein, wie in a lange Schlange zu stehen, die sich kaum bewegt. Probier, die Seite zu aktualisieren oder dann später wieder zu schauen. Bewegt sich die Schlange immer noch langsam, sprich mit dem Manager (Website-Support)." + }, + "1000": { + "title": "Zugang blockiert! Du kommst hier net rein", + "text1": "Der Fehler \"Direkter Zugang verboten\" is wie a private Party, wo nur Leut mit Einladung hin dürfen. Dein Versuch, direkt hin zu kommen, is an der Türe abgelehnt worden, weilst net auf der Liste warst (deine IP-Adresse). Probier's durch's Haupthaus (richtige Domain oder URL), oder sprich mit'm Gastgeber (Website-Support).", + "text2": "Mit'm \"Direkter Zugang verboten\" Schild daran zustoßen is wie zu versuchen, in a Disco ohne VIP-Pass zu gehen. Du hast versucht, direkt rein zu kommen, aber der Türsteher (Server) hat gsagt: 'Ohne Domain-Einlass, kein Zutritt!' Stell sicher, dass du durch die Haustür (richtige URL oder vorgesehener Weg) reingehst und nicht durch den Dienst-Eingang (direkte IP). Wenn alles scheitert, überleg dir, ob'd mit'm Club-Manager (Website-Support) reden willst!" + }, + "1001": { + "title": "Datenbank is grad net da", + "text1": "Bekommst'n \"Dienst net verfügbar\" Fehler, is's wie wennst zur Bücherei willst und die zusperren, weil's grad das Inventar überprüfen. Die Datenbank, unser digitaler Bibliothekar, is grad net da. Könnt a Netzwerkproblem sein, oder die is überlastet. Unsere Techniker sind schon dran. Wir danken dir für dein Verständnis.", + "text2": "A geschlossene Büchereitüre, so fühlt sich an \"Datenbankfehler\" an. Aber mach dir ka Sorgen, könnt' nur a schnelle Reinigung oder eine Neuordnung der Bücher sein. Versuch, die Seite zu aktualisieren oder komm später wieder. Wenn die Tür immer noch zu is, wende dich ans Gemeindeamt (unser Support), und wir klären das." + } + } +} \ No newline at end of file From 4a514a1f89448c4e29b987907e64ad26ca07c8e2 Mon Sep 17 00:00:00 2001 From: Akama Aka Date: Tue, 2 Jul 2024 12:52:34 +0200 Subject: [PATCH 12/12] Add Dutch translations to error messages in lang.json The Dutch language has been included in the lang.json file for each error message. These messages help users understand technical problems that may occur on the website. Providing these explanations in Dutch will make our website more accessible to Dutch-speaking users. Signed-off-by: Akama Aka --- lang/lang.json | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) diff --git a/lang/lang.json b/lang/lang.json index e5ef0de..61d9822 100644 --- a/lang/lang.json +++ b/lang/lang.json @@ -184,5 +184,69 @@ "text1": "Bekommst'n \"Dienst net verfügbar\" Fehler, is's wie wennst zur Bücherei willst und die zusperren, weil's grad das Inventar überprüfen. Die Datenbank, unser digitaler Bibliothekar, is grad net da. Könnt a Netzwerkproblem sein, oder die is überlastet. Unsere Techniker sind schon dran. Wir danken dir für dein Verständnis.", "text2": "A geschlossene Büchereitüre, so fühlt sich an \"Datenbankfehler\" an. Aber mach dir ka Sorgen, könnt' nur a schnelle Reinigung oder eine Neuordnung der Bücher sein. Versuch, die Seite zu aktualisieren oder komm später wieder. Wenn die Tür immer noch zu is, wende dich ans Gemeindeamt (unser Support), und wir klären das." } + }, + "nl": { + "client": "Cliënt", + "networking": "Netwerken", + "subtitle1": "Wat is er gebeurd?", + "subtitle2": "Wat kun je doen?", + "requestId": "Verzoek-ID:", + "ipAddress": "IP-adres:", + "database": "Database", + "301": { + "title": "Permanent Verplaatst, Volg het Nieuwe Pad", + "text1": "Een 'Permanent Verplaatst' (301) tegengekomen? Het is alsof je naar je gebruikelijke koffieshop gaat en een bordje ziet dat ze verhuisd zijn. Tijd om je GPS-bestemming te wijzigen (controleer de nieuwe URL of vraag de support van de website om hulp).", + "text2": "Een 'Permanent Verplaatst' (301) zien is als proberen een winkel te vinden die van locatie is veranderd. De zaak die je zocht is naar een nieuw adres (URL) verhuisd. Controleer het nieuwe adres of praat met de verhuizers (het supportteam) om de nieuwe locatie te vinden." + }, + "304": { + "title": "Niet Gewijzigd, Je Bent Up-to-Date", + "text1": "Heb je te maken met een 'Niet Gewijzigd' (304)? Stel je voor dat je je nieuwsfeed ververst en geen nieuwe berichten vindt. De webpagina is sinds je laatste bezoek niet veranderd, dus je cachekopie is nog steeds geldig. Ga door, blijf rustig en bespaar die databytes.", + "text2": "Komt een 'Niet Gewijzigd' (304) tegen? Het is als naar je favoriete zender schakelen en een herhaling van een programma zien dat je al hebt gezien. De inhoud van de webpagina is sinds je laatste bezoek niet bijgewerkt. Je kunt je gecachte versie blijven gebruiken. Geniet van de herhaling!" + }, + "400": { + "title": "Oeps! Slechte Verzoek", + "text1": "Een 'Slechte Verzoek' (400) aan het uitvechten? Stel je voor dat je een telefoonnummer belt maar per ongeluk de verkeerde toetsen indrukt. Je browser heeft een verzoek gestuurd dat de server niet begreep. Controleer je invoer dubbel of raadpleeg de operator (neem contact op met het supportteam)!", + "text2": "Een 'Slechte Verzoek' (400) tegenkomen kan voelen als een buitenaardse taal spreken tegen iemand. De server begreep je verzoek niet. Zorg ervoor dat je dezelfde taal spreekt (controleer je syntax of verzoekformaat). Als de verwarring aanhoudt, vraag om hulp van een vertaler (het supportteam van de website)." + }, + "403": { + "title": "Uh oh! Je bevindt je in Verboden Gebied", + "text1": "De 'Verboden' fout (403) is als proberen een privé, 'leden alleen' club binnen te lopen zonder lidmaatschapskaart. Je hebt mogelijk geprobeerd een pagina te openen of een taak uit te voeren die je niet bent toegestaan. Controleer je inloggegevens, zorg ervoor dat je geen grens overschrijdt, of neem contact op met het sitebeheer voor hulp.", + "text2": "Het is als proberen lid te worden van een geheime samenleving. Tegen het 'Verboden' (403) bord aanlopen betekent dat je probeerde in een beperkte ruimte te gluren. Het lijkt erop dat de toegang tot de geheime schat (of pagina) is vergrendeld. Probeer de sleutel (gebruikersgegevens) opnieuw, of vraag de leider van de samenleving (de sitebeheerder) om hulp!" + }, + "404": { + "title": "Oei! Pagina Niet Gevonden", + "text1": "De vervelende '404 Niet Gevonden' is als een schatkaart lezen en geen schat vinden. Het kan zijn verplaatst, of misschien hebben we de verkeerde kaart (URL). Probeer je cache te wissen, of navigeer vanaf de homepagina.", + "text2": "Een 404 zien is een beetje als naar je sokken zoeken en ze niet vinden. Misschien zijn ze in de was (wis je cache), of zoek je in de verkeerde la (controleer de URL). Als alles mislukt, moet je misschien nieuwe sokken kopen (neem contact op met de beheerder of zoek je inhoud elders)." + }, + "500": { + "title": "Uh oh! Interne Serverfout", + "text1": "Een '500 Interne Serverfout' is als een puinhoop in een kamer vinden, maar niet weten wie het heeft gemaakt. De schoonmakers (developers) zijn waarschijnlijk al aan het opruimen. Geef ze een moment en probeer het later opnieuw.", + "text2": "Een '500 Interne Serverfout' krijgen kan voelen als proberen een boek in het donker te lezen. Je beste lichtbron kan zijn om de pagina te verversen, je cache te wissen, of later terug te komen." + }, + "502": { + "title": "Oeps! Slechte Netwerkpunt", + "text1": "Een '502 Slechte Netwerkpunt' tegenkomen is als kloppen op een deur en geen antwoord krijgen. Probeer opnieuw te kloppen (de pagina te verversen) of misschien je schoenen schoon te maken (wis de cache van je browser) voor het volgende bezoek. Als niemand antwoordt, zijn ze misschien bezig met het oplossen van problemen binnen. Probeer het later opnieuw of bel het supportteam van de site!", + "text2": "Een '502 Slechte Netwerkpunt' tegenkomen kan voelen als vastzitten achter een wegafsluiting. Probeer om te keren (de pagina te verversen), of de weg schoon te maken (de cache van je browser). Als de weg afgesloten blijft, kan het onder reparatie zijn. Je beste gok kan zijn om later terug te keren of contact op te nemen met de verantwoordelijke snelwegafdeling (het supportteam van de website)." + }, + "503": { + "title": "Even Geduld, Service Niet Beschikbaar", + "text1": "Met een 'Service Niet Beschikbaar' (503), denk aan de website als een theater met een gesloten gordijn. Ze zijn gewoon het podium aan het klaarmaken voor de volgende act. Verfris jezelf (probeer een verversing) of kom later terug.", + "text2": "Een 'Service Niet Beschikbaar' (503) tegenkomen is als wachten in de rij voor een achtbaan die onderhoud nodig heeft. Ze zijn waarschijnlijk de schroeven aan het aandraaien en de rails aan het oliën. Misschien kun je deze pauze gebruiken voor een corn dog en later opnieuw proberen?" + }, + "504": { + "title": "Server Time-out", + "text1": "Een '504 Gateway Time-out'? Beschouw het als naar een fastfoodtent gaan waar ze niet zo snel zijn. Het kan gewoon druk zijn, of misschien is de frituurpan kapot. Geef het even, druk dan op F5 of ververs. Lost het nog steeds niet op? Het kan tijd zijn om contact op te nemen met de winkel (het supportteam van de website).", + "text2": "Een '504 Gateway Time-out' fout tegenkomen kan zo frustrerend zijn als in een langzaam bewegende kassarij staan. Probeer de pagina te verversen of kom later terug. Als de rij langzaam blijft bewegen, neem contact op met de winkelmanager (het supportteam van de website)." + }, + "1000": { + "title": "Toegang Geblokkeerd! Geen Directe Invoer", + "text1": "De 'Directe Toegang Verboden' fout is als een privéfeestje waar alleen gasten met uitnodigingen zijn toegestaan. Je directe poging om te bezoeken werd aan de deur afgewezen omdat je naam (IP-adres) niet op de lijst staat. Probeer via de hoofdingang (juiste domein of URL) binnen te komen, of bespreek het met de organisator (support van de website).", + "text2": "Tegen de 'Directe Toegang Verboden' muur aanlopen is net als proberen een club binnen te komen zonder VIP-pas. Je probeerde direct binnen te komen, maar de uitsmijter (server) zei: 'Geen toegang zonder domeininvoer!' Zorg ervoor dat je via de voordeur binnenkomt (gebruik de juiste URL of beoogd pad) en niet via de personeelsingang (direct IP). Als alles mislukt, overweeg dan om een gesprek te voeren met de manager van de club (support van de website)!" + }, + "1001": { + "title": "Database Niet Beschikbaar", + "text1": "Een 'Service Niet Beschikbaar' tegenkomen is als naar een bibliotheek gaan, maar merken dat deze tijdelijk gesloten is voor een inventariscontrole. De database, onze digitale bibliothecaris, is momenteel niet beschikbaar, misschien vanwege een netwerkprobleem, een rustperiode of te veel verzoeken. Onze technici, gretig als boekenwurmen, zijn ermee bezig. We waarderen je begrip.", + "text2": "Een gesloten bibliotheekdeur, dat is wat een 'Databasefout' voelt als. Maar maak je geen zorgen, het kan gewoon een snelle schoonmaak of herinrichting van de planken zijn. Probeer de pagina te verversen of kom later terug. Als de deur nog steeds niet opengaat, neem contact op met het gemeentehuis (onze support) en we lossen het op." + } } } \ No newline at end of file