diff --git a/docusaurus.config.js b/docusaurus.config.js index c067e7233..898392f0c 100644 --- a/docusaurus.config.js +++ b/docusaurus.config.js @@ -4,6 +4,10 @@ const darkCodeTheme = require('prism-react-renderer').themes.nightOwl; const fs = require('fs'); const path = require('path'); +// Redirects handling: +const { getStaticRedirects } = require('./plugins/staticRedirects'); +const { redirectsPlugin } = require('./plugins/dynamicRedirects'); + // Define the directory containing your CSS files const cssDirectory = path.resolve(__dirname, './src/css'); @@ -32,296 +36,297 @@ function metadataPlugin(context, options) { } } -/** @type {import('@docusaurus/types').Config} */ -const config = { - title: 'The Cloud Posse Reference Architecture', - tagline: 'The turnkey architecture for AWS, Datadog & GitHub Actions to get up and running quickly using the Atmos open source framework.', - url: 'https://docs.cloudposse.com', - baseUrl: '/', - trailingSlash: true, - onBrokenLinks: 'throw', - onBrokenMarkdownLinks: 'warn', - onDuplicateRoutes: 'warn', - favicon: 'img/favicon.png', +async function createConfig() { + /** @type {import('@docusaurus/types').Config} */ + const config = { + title: 'The Cloud Posse Reference Architecture', + tagline: 'The turnkey architecture for AWS, Datadog & GitHub Actions to get up and running quickly using the Atmos open source framework.', + url: 'https://docs.cloudposse.com', + baseUrl: '/', + trailingSlash: true, + onBrokenLinks: 'throw', + onBrokenMarkdownLinks: 'warn', + onDuplicateRoutes: 'warn', + favicon: 'img/favicon.png', - organizationName: 'cloudposse', - projectName: 'docs', - deploymentBranch: 'master', - i18n: { - defaultLocale: 'en', - locales: ['en'], - }, + organizationName: 'cloudposse', + projectName: 'docs', + deploymentBranch: 'master', + i18n: { + defaultLocale: 'en', + locales: ['en'], + }, - plugins: [ - [ - '@docusaurus/plugin-google-tag-manager', - { - containerId: process.env.GOOGLE_TAG_MANAGER || 'GTM-ABCD123' - }, - ], - [ - 'docusaurus-plugin-image-zoom', {}, - ], - [ - '@docusaurus/plugin-client-redirects', { - redirects: [ - { - from: '/reference-architecture', - to: '/learn' - } - ], - }, - ], - [ - '@docusaurus/plugin-ideal-image', - { - quality: 90, - max: 1030, // max resized image's size. - min: 640, // min resized image's size. if original is lower, use that size. - steps: 2, // the max number of images generated between min and max (inclusive) - disableInDev: false, - } - ], - [ - 'custom-loaders', {} + plugins: [ + [ + '@docusaurus/plugin-google-tag-manager', + { + containerId: process.env.GOOGLE_TAG_MANAGER || 'GTM-ABCD123' + }, + ], + [ + 'docusaurus-plugin-image-zoom', {}, + ], + [ + '@docusaurus/plugin-ideal-image', + { + quality: 90, + max: 1030, // max resized image's size. + min: 640, // min resized image's size. if original is lower, use that size. + steps: 2, // the max number of images generated between min and max (inclusive) + disableInDev: false, + } + ], + [ + 'custom-loaders', {} + ], + metadataPlugin, + [ + "posthog-docusaurus", + { + apiKey: "phc_G3idXOACKt4vIzgRu2FVP8ORO1D2VlkeEwX9mE2jDvT", + appUrl: "https://us.i.posthog.com", + enableInDevelopment: false, // optional + }, + ], + [ + 'docusaurus-plugin-sentry', + { + DSN: 'b022344b0e7cc96f803033fff3b377ee@o56155.ingest.us.sentry.io/4507472203087872', + }, + ], + [ + '@docusaurus/plugin-client-redirects', + { + id: 'static-redirects', + redirects: getStaticRedirects(), + }, + ], + redirectsPlugin, ], - metadataPlugin, - [ - "posthog-docusaurus", - { - apiKey: "phc_G3idXOACKt4vIzgRu2FVP8ORO1D2VlkeEwX9mE2jDvT", - appUrl: "https://us.i.posthog.com", - enableInDevelopment: false, // optional - }, + + presets: [ + [ + 'classic', + /** @type {import('@docusaurus/preset-classic').Options} */ + ({ + docs: { + routeBasePath: '/', + sidebarPath: require.resolve('./sidebars.js'), + editUrl: ({versionDocsDirPath, docPath, locale}) => { + return `https://github.com/cloudposse/docs/edit/master/content/docs/${docPath}`; + }, + exclude: ['README.md'], + showLastUpdateTime: true, + showLastUpdateAuthor: true, + onInlineTags: 'warn', + tags: 'tags.yml' + }, + theme: { + customCss: customCssFiles, + }, + }), + ], ], - [ - 'docusaurus-plugin-sentry', + + scripts: [ { - DSN: 'b022344b0e7cc96f803033fff3b377ee@o56155.ingest.us.sentry.io/4507472203087872', + src: "https://kit.fontawesome.com/3a9f2eb5b9.js", }, - ] - ], - - presets: [ - [ - 'classic', - /** @type {import('@docusaurus/preset-classic').Options} */ - ({ - docs: { - routeBasePath: '/', - sidebarPath: require.resolve('./sidebars.js'), - editUrl: ({versionDocsDirPath, docPath, locale}) => { - return `https://github.com/cloudposse/docs/edit/master/content/docs/${docPath}`; - }, - exclude: ['README.md'], - showLastUpdateTime: true, - showLastUpdateAuthor: true, - onInlineTags: 'warn', - tags: 'tags.yml' - }, - theme: { - customCss: customCssFiles, - }, - }), ], - ], - scripts: [ - { - src: "https://kit.fontawesome.com/3a9f2eb5b9.js", + markdown: { + mermaid: true, }, - ], - - markdown: { - mermaid: true, - }, - themes: ['@docusaurus/theme-mermaid'], + themes: ['@docusaurus/theme-mermaid'], - themeConfig: - /** @type {import('@docusaurus/preset-classic').ThemeConfig} */ - ({ - metadata: [{ name: 'google-site-verification', content: process.env.GOOGLE_SITE_VERIFICATION_ID || 'preview-local' }], - docs: { - sidebar: { - hideable: true, - autoCollapseCategories: true - }, - }, - navbar: { - title: '', - logo: { - alt: 'Cloud Posse Developer Hub', - src: 'img/logo.svg', - srcDark: 'img/logo-light.svg', - }, - items: [ - { - to: '/learn', - position: 'left', - label: 'Learn', - }, - { - to: '/reference', - position: 'left', - label: 'Reference', - }, - { - to: '/community', - label: 'Community', - position: 'left', - }, - { - type: 'search', - position: 'right', - }, - { - href: 'https://github.com/cloudposse/', - className: 'header-github-link', - position: 'right', + themeConfig: + /** @type {import('@docusaurus/preset-classic').ThemeConfig} */ + ({ + metadata: [{ name: 'google-site-verification', content: process.env.GOOGLE_SITE_VERIFICATION_ID || 'preview-local' }], + docs: { + sidebar: { + hideable: true, + autoCollapseCategories: true }, - { - to: 'https://cloudposse.com/', - label: 'Get a Jumpstart', - position: 'right', - className: 'button button--primary navbar-cta-button' + }, + navbar: { + title: '', + logo: { + alt: 'Cloud Posse Developer Hub', + src: 'img/logo.svg', + srcDark: 'img/logo-light.svg', }, - ], - }, - - announcementBar: { - id: 'new_docs', - content: - 'We are in the process of updating our documentation. Please let us know what you think!', - backgroundColor: 'var(--announcement-bar-background)', - textColor: 'var(--announcement-bar-text-color)', - isCloseable: true, - }, - - colorMode: { - // "light" | "dark" - defaultMode: 'dark', - - // Hides the switch in the navbar - // Useful if you want to force a specific mode - disableSwitch: false, - - // Should respect the user's color scheme preference - // "light" | "dark" | "system" - respectPrefersColorScheme: false, - }, - - algolia: { - appId: process.env.ALGOLIA_APP_ID || '32YOERUX83', - apiKey: process.env.ALGOLIA_SEARCH_API_KEY || '557985309adf0e4df9dcf3cb29c61928', // this is SEARCH ONLY API key and is not sensitive information - indexName: process.env.ALGOLIA_INDEX_NAME || 'docs.cloudposse.com', - externalUrlRegex: 'atmos\\.tools', - contextualSearch: false - }, - footer: { - style: 'dark', - links: [{ - title: 'Docs', items: [ { + to: '/learn', + position: 'left', label: 'Learn', - to: '/learn/', }, { + to: '/reference', + position: 'left', label: 'Reference', - to: '/reference/', - } - ], - }, { - title: 'Community', - items: [ - { - label: 'GitHub Discussions', - href: 'https://github.com/orgs/cloudposse/discussions', - }, - { - label: 'Slack Community', - to: '/community/slack', }, { - label: 'Slack Archives', - href: 'https://archive.sweetops.com/refarch/', + to: '/community', + label: 'Community', + position: 'left', }, { - label: 'Office Hours', - to: '/community/office-hours/', + type: 'search', + position: 'right', }, - ], - }, { - title: 'Contact Us', - items: [ { - label: 'Support', - to: '/support', - }, - { - label: 'Our GitHub', href: 'https://github.com/cloudposse/', + className: 'header-github-link', + position: 'right', }, { - label: 'Contact Us', - to: '/community/contact-us/', - }], - }], - logo: { - alt: 'Cloud Posse', - src: '/img/logo-light.svg', - href: 'https://cloudposse.com/' + to: 'https://cloudposse.com/', + label: 'Get a Jumpstart', + position: 'right', + className: 'button button--primary navbar-cta-button' + }, + ], }, - copyright: `© ${new Date().getFullYear()} Cloud Posse, LLC`, - }, - mermaid: { - theme: { - light: 'neutral', - dark: 'dark', + + announcementBar: { + id: 'new_docs', + content: + 'We are in the process of updating our documentation. Please let us know what you think!', + backgroundColor: 'var(--announcement-bar-background)', + textColor: 'var(--announcement-bar-text-color)', + isCloseable: true, }, - options: { - flowchart: { - useMaxWidth: true, - curve: 'linear', - padding: 15, - diagramPadding: 20, - nodeSpacing: 40, - rankSpacing: 50, - ranksep: 100, - nodesep: 100, - titleTopMargin: 25, - titlePadding: 30, - labelPadding: 30, - subGraphTitleMargin: { - top: 5, - bottom: 5 - } + + colorMode: { + // "light" | "dark" + defaultMode: 'dark', + + // Hides the switch in the navbar + // Useful if you want to force a specific mode + disableSwitch: false, + + // Should respect the user's color scheme preference + // "light" | "dark" | "system" + respectPrefersColorScheme: false, + }, + + algolia: { + appId: process.env.ALGOLIA_APP_ID || '32YOERUX83', + apiKey: process.env.ALGOLIA_SEARCH_API_KEY || '557985309adf0e4df9dcf3cb29c61928', // this is SEARCH ONLY API key and is not sensitive information + indexName: process.env.ALGOLIA_INDEX_NAME || 'docs.cloudposse.com', + externalUrlRegex: 'atmos\\.tools', + contextualSearch: false + }, + footer: { + style: 'dark', + links: [{ + title: 'Docs', + items: [ + { + label: 'Learn', + to: '/learn/', + }, + { + label: 'Reference', + to: '/reference/', + } + ], + }, { + title: 'Community', + items: [ + { + label: 'GitHub Discussions', + href: 'https://github.com/orgs/cloudposse/discussions', + }, + { + label: 'Slack Community', + to: '/community/slack', + }, + { + label: 'Slack Archives', + href: 'https://archive.sweetops.com/refarch/', + }, + { + label: 'Office Hours', + to: '/community/office-hours/', + }, + ], + }, { + title: 'Contact Us', + items: [ + { + label: 'Support', + to: '/support', + }, + { + label: 'Our GitHub', + href: 'https://github.com/cloudposse/', + }, + { + label: 'Contact Us', + to: '/community/contact-us/', + }], + }], + logo: { + alt: 'Cloud Posse', + src: '/img/logo-light.svg', + href: 'https://cloudposse.com/' + }, + copyright: `© ${new Date().getFullYear()} Cloud Posse, LLC`, + }, + mermaid: { + theme: { + light: 'neutral', + dark: 'dark', }, + options: { + flowchart: { + useMaxWidth: true, + curve: 'linear', + padding: 15, + diagramPadding: 20, + nodeSpacing: 40, + rankSpacing: 50, + ranksep: 100, + nodesep: 100, + titleTopMargin: 25, + titlePadding: 30, + labelPadding: 30, + subGraphTitleMargin: { + top: 5, + bottom: 5 + } + }, - themeVariables: { - mainBkg: '#6f72723b', - background: '#333', - clusterBkg: '#6f72723b' + themeVariables: { + mainBkg: '#6f72723b', + background: '#333', + clusterBkg: '#6f72723b' + } } - } - }, - prism: { - theme: lightCodeTheme, - darkTheme: darkCodeTheme, - additionalLanguages: ['hcl', 'bash', 'rego'], - }, - zoom: { - selector: '.markdown > img', - config: { - // options you can specify via https://github.com/francoischalifour/medium-zoom#usage - background: { - light: 'rgb(255, 255, 255)', - dark: 'rgb(50, 50, 50)' + }, + prism: { + theme: lightCodeTheme, + darkTheme: darkCodeTheme, + additionalLanguages: ['hcl', 'bash', 'rego'], + }, + zoom: { + selector: '.markdown > img', + config: { + // options you can specify via https://github.com/francoischalifour/medium-zoom#usage + background: { + light: 'rgb(255, 255, 255)', + dark: 'rgb(50, 50, 50)' + } } } - } - }), -}; + }), + }; + return config; +} -module.exports = config; +module.exports = createConfig(); diff --git a/plugins/dynamicRedirects/index.js b/plugins/dynamicRedirects/index.js new file mode 100644 index 000000000..e70fb8ff2 --- /dev/null +++ b/plugins/dynamicRedirects/index.js @@ -0,0 +1,71 @@ +/* + * This plugin is not working yet! + * We have these redirects created with a static file in the staticRedirects plugin. + * We'll keep this file as reference for future improvements. + */ + +async function loadRedirects(allContent) { + const redirects = []; + + // Check if 'docusaurus-plugin-content-docs' is available and has the expected structure + const docsPlugin = allContent['docusaurus-plugin-content-docs']; + + // Check that docsPlugin and its required properties exist + if (!docsPlugin || !docsPlugin.default || !docsPlugin.default.loadedVersions) { + console.error("Docs plugin content is not available or improperly structured. Skipping redirects generation."); + return redirects; // Return empty array if the docs content is not available + } + + // Access the docs from the first loaded version + const docs = docsPlugin.default.loadedVersions[0]?.docs || []; + + // Iterate over docs to create redirects based on refarch_id + docs.forEach((doc) => { + if (doc.frontMatter?.refarch_id) { + redirects.push( + { + from: `/reference-architecture/${doc.frontMatter.refarch_id}`, + to: doc.permalink, + }, + { + from: `/${doc.frontMatter.refarch_id}`, + to: doc.permalink, + } + ); + } + }); + + console.debug('Loaded redirects:', redirects); + return redirects; +} + +function redirectsPlugin(context, options) { + return { + name: 'redirects-plugin', + + // Since the loadContent lifecycle method is synchronous, let's adjust this + async loadContent() { + // Returning an empty object as loadContent does not receive allContent directly + return {}; + }, + + async allContentLoaded({ actions, allContent }) { + const { setGlobalData } = actions; + + // Load redirects using the custom loadRedirects function + const redirects = await loadRedirects(allContent); + + // Set redirects in global data + setGlobalData({ + redirects, + }); + + console.debug('Global data set with redirects.'); + }, + }; +} + +// Export the plugin +module.exports = { + redirectsPlugin, +}; diff --git a/plugins/staticRedirects/index.js b/plugins/staticRedirects/index.js new file mode 100644 index 000000000..a24e4539b --- /dev/null +++ b/plugins/staticRedirects/index.js @@ -0,0 +1,17 @@ +const fs = require('fs'); +const path = require('path'); + +function getStaticRedirects() { + // Load redirects directly within this module + const docsRedirects = JSON.parse(fs.readFileSync(path.resolve(__dirname, 'redirects/docs.json'), 'utf-8')); + const legacyRedirects = JSON.parse(fs.readFileSync(path.resolve(__dirname, 'redirects/legacy_setup_docs.json'), 'utf-8')); + const refarchRedirects = JSON.parse(fs.readFileSync(path.resolve(__dirname, 'redirects/refarch.json'), 'utf-8')); + + // Combine the loaded redirects into a single array + return [...docsRedirects, ...legacyRedirects, ...refarchRedirects]; +} + +// Export the plugin and helper functions +module.exports = { + getStaticRedirects, +}; diff --git a/plugins/staticRedirects/redirects/docs.json b/plugins/staticRedirects/redirects/docs.json new file mode 100644 index 000000000..d8eb0ba62 --- /dev/null +++ b/plugins/staticRedirects/redirects/docs.json @@ -0,0 +1,6 @@ +[ + { + "from": "/reference-architecture", + "to": "/learn" + } +] diff --git a/plugins/staticRedirects/redirects/legacy_setup_docs.json b/plugins/staticRedirects/redirects/legacy_setup_docs.json new file mode 100644 index 000000000..1c1b63758 --- /dev/null +++ b/plugins/staticRedirects/redirects/legacy_setup_docs.json @@ -0,0 +1,98 @@ +[ + { + "from": "/reference-architecture/design-decisions/foundational-release-engineering/decide-on-self-hosted-github-runner-strategy", + "to": "/layers/software-delivery/design-decisions/decide-on-self-hosted-github-runner-strategy" + }, + { + "from": "/reference-architecture/fundamentals", + "to": "/learn/prerequisites" + }, + { + "from": "/reference-architecture/fundamentals", + "to": "/learn/prerequisites" + }, + { + "from": "/reference-architecture/fundamentals/ecs", + "to": "/layers/software-delivery/ecs-ecspresso" + }, + { + "from": "/reference-architecture/fundamentals/gitops", + "to": "/layers/gitops" + }, + { + "from": "/reference-architecture/how-to-guides/integrations/opsgenie", + "to": "/layers/alerting/opsgenie" + }, + { + "from": "/reference-architecture/how-to-guides/integrations/opsgenie/how-to-create-new-teams-in-opsgenie", + "to": "/layers/alerting/opsgenie/how-to-create-new-teams-in-opsgenie" + }, + { + "from": "/reference-architecture/how-to-guides/integrations/opsgenie/how-to-sign-up-for-opsgenie", + "to": "/layers/alerting/opsgenie/how-to-sign-up-for-opsgenie" + }, + { + "from": "/reference-architecture/how-to-guides/integrations/spacelift", + "to": "/layers/spacelift" + }, + { + "from": "/reference-architecture/how-to-guides/tutorials/how-to-setup-grafana", + "to": "/layers/monitoring/grafana" + }, + { + "from": "/reference-architecture/quickstart/eks", + "to": "/layers/eks" + }, + { + "from": "/reference-architecture/quickstart/iam-identity", + "to": "/layers/identity" + }, + { + "from": "/reference-architecture/reference/adrs/jumpstart/decide-on-vanity-domain", + "to": "/layers/network/design-decisions/decide-on-vanity-branded-domain" + }, + { + "from": "/reference-architecture/setup/cold-start", + "to": "/layers/accounts/deploy-accounts" + }, + { + "from": "/reference-architecture/setup/cold-start", + "to": "/layers/accounts/deploy-accounts" + }, + { + "from": "/reference-architecture/setup/cold-start/automated-configuration", + "to": "/layers/accounts/prepare-aws-organization" + }, + { + "from": "/reference-architecture/setup/cold-start/how-to-create-superadmin-user", + "to": "/layers/accounts/tutorials/how-to-create-superadmin-user" + }, + { + "from": "/reference-architecture/setup/cold-start/manual-configuration", + "to": "/layers/accounts/tutorials/manual-configuration" + }, + { + "from": "/reference-architecture/setup/eks", + "to": "/learn/maintenance/upgrades/how-to-upgrade-eks" + }, + { + "from": "/reference-architecture/setup/github-arc", + "to": "/layers/github-actions/eks-github-actions-controller" + }, + { + "from": "/reference-architecture/setup/github-runners", + "to": "/layers/github-actions" + }, + { + "from": "/reference-architecture/setup/identity", + "to": "/layers/identity" + }, + { + "from": "/reference-architecture/setup/network", + "to": "/layers/network/connect-network" + }, + { + "from": "/reference-architecture/setup/philips-labs-github-runners", + "to": "/layers/github-actions/philips-labs-github-runners" + } +] diff --git a/plugins/staticRedirects/redirects/refarch.json b/plugins/staticRedirects/redirects/refarch.json new file mode 100644 index 000000000..5c4d78bb0 --- /dev/null +++ b/plugins/staticRedirects/redirects/refarch.json @@ -0,0 +1,210 @@ +[ + { + "from": "/reference-architecture/REFARCH-34", + "to": "/layers/project/design-decisions/decide-on-1password-strategy" + }, + { + "from": "/REFARCH-34", + "to": "/layers/project/design-decisions/decide-on-1password-strategy" + }, + { + "from": "/reference-architecture/REFARCH-46", + "to": "/layers/network/design-decisions/decide-on-service-discovery-domain" + }, + { + "from": "/REFARCH-46", + "to": "/layers/network/design-decisions/decide-on-service-discovery-domain" + }, + { + "from": "/reference-architecture/REFARCH-49", + "to": "/layers/eks/design-decisions/decide-on-host-os-flavor-for-eks" + }, + { + "from": "/REFARCH-49", + "to": "/layers/eks/design-decisions/decide-on-host-os-flavor-for-eks" + }, + { + "from": "/reference-architecture/REFARCH-50", + "to": "/layers/accounts/design-decisions/decide-on-mfa-solution-for-aws-root-accounts" + }, + { + "from": "/REFARCH-50", + "to": "/layers/accounts/design-decisions/decide-on-mfa-solution-for-aws-root-accounts" + }, + { + "from": "/reference-architecture/REFARCH-51", + "to": "/layers/accounts/design-decisions/decide-on-email-address-format-for-aws-accounts" + }, + { + "from": "/REFARCH-51", + "to": "/layers/accounts/design-decisions/decide-on-email-address-format-for-aws-accounts" + }, + { + "from": "/reference-architecture/REFARCH-52", + "to": "/layers/project/design-decisions/decide-on-infrastructure-repository-name" + }, + { + "from": "/REFARCH-52", + "to": "/layers/project/design-decisions/decide-on-infrastructure-repository-name" + }, + { + "from": "/reference-architecture/REFARCH-53", + "to": "/layers/project/design-decisions/decide-on-namespace-abbreviation" + }, + { + "from": "/REFARCH-53", + "to": "/layers/project/design-decisions/decide-on-namespace-abbreviation" + }, + { + "from": "/reference-architecture/REFARCH-54", + "to": "/layers/network/design-decisions/decide-on-vanity-branded-domain" + }, + { + "from": "/REFARCH-54", + "to": "/layers/network/design-decisions/decide-on-vanity-branded-domain" + }, + { + "from": "/reference-architecture/REFARCH-55", + "to": "/layers/accounts/design-decisions/decide-on-aws-account-flavors-and-organizational-units" + }, + { + "from": "/REFARCH-55", + "to": "/layers/accounts/design-decisions/decide-on-aws-account-flavors-and-organizational-units" + }, + { + "from": "/reference-architecture/REFARCH-56", + "to": "/layers/network/design-decisions/decide-on-primary-aws-region" + }, + { + "from": "/REFARCH-56", + "to": "/layers/network/design-decisions/decide-on-primary-aws-region" + }, + { + "from": "/reference-architecture/REFARCH-79", + "to": "/resources/legacy/design-decisions/decide-on-transactional-email-smtp-provider-for-operational-email" + }, + { + "from": "/REFARCH-79", + "to": "/resources/legacy/design-decisions/decide-on-transactional-email-smtp-provider-for-operational-email" + }, + { + "from": "/reference-architecture/REFARCH-80", + "to": "/layers/network/design-decisions/decide-vpc-peering-requirements-e-g-to-legacy-env" + }, + { + "from": "/REFARCH-80", + "to": "/layers/network/design-decisions/decide-vpc-peering-requirements-e-g-to-legacy-env" + }, + { + "from": "/reference-architecture/REFARCH-81", + "to": "/layers/project/design-decisions/decide-on-secrets-management-strategy-for-terraform" + }, + { + "from": "/REFARCH-81", + "to": "/layers/project/design-decisions/decide-on-secrets-management-strategy-for-terraform" + }, + { + "from": "/reference-architecture/REFARCH-91", + "to": "/layers/software-delivery/design-decisions/decide-how-to-distribute-docker-images" + }, + { + "from": "/REFARCH-91", + "to": "/layers/software-delivery/design-decisions/decide-how-to-distribute-docker-images" + }, + { + "from": "/reference-architecture/REFARCH-111", + "to": "/layers/monitoring/design-decisions/decide-on-external-monitoring-solution" + }, + { + "from": "/REFARCH-111", + "to": "/layers/monitoring/design-decisions/decide-on-external-monitoring-solution" + }, + { + "from": "/reference-architecture/REFARCH-112", + "to": "/layers/software-delivery/design-decisions/decide-on-maintenance-page-solution" + }, + { + "from": "/REFARCH-112", + "to": "/layers/software-delivery/design-decisions/decide-on-maintenance-page-solution" + }, + { + "from": "/reference-architecture/REFARCH-144", + "to": "/layers/software-delivery/design-decisions/decide-on-database-seeding-strategy-for-ephemeral-preview-enviro" + }, + { + "from": "/REFARCH-144", + "to": "/layers/software-delivery/design-decisions/decide-on-database-seeding-strategy-for-ephemeral-preview-enviro" + }, + { + "from": "/reference-architecture/REFARCH-202", + "to": "/layers/eks/design-decisions/decide-on-email-address-for-cert-manager-support-emails" + }, + { + "from": "/REFARCH-202", + "to": "/layers/eks/design-decisions/decide-on-email-address-for-cert-manager-support-emails" + }, + { + "from": "/reference-architecture/REFARCH-207", + "to": "/layers/eks/design-decisions/decide-on-helm-chart-repository-strategy" + }, + { + "from": "/REFARCH-207", + "to": "/layers/eks/design-decisions/decide-on-helm-chart-repository-strategy" + }, + { + "from": "/reference-architecture/REFARCH-208", + "to": "/layers/network/design-decisions/decide-on-hostname-scheme-for-service-discovery" + }, + { + "from": "/REFARCH-208", + "to": "/layers/network/design-decisions/decide-on-hostname-scheme-for-service-discovery" + }, + { + "from": "/reference-architecture/REFARCH-209", + "to": "/layers/project/design-decisions/decide-on-regional-naming-scheme" + }, + { + "from": "/REFARCH-209", + "to": "/layers/project/design-decisions/decide-on-regional-naming-scheme" + }, + { + "from": "/reference-architecture/REFARCH-210", + "to": "/layers/data/design-decisions/decide-whether-to-use-rds-iam-authentication" + }, + { + "from": "/REFARCH-210", + "to": "/layers/data/design-decisions/decide-whether-to-use-rds-iam-authentication" + }, + { + "from": "/reference-architecture/REFARCH-211", + "to": "/layers/data/design-decisions/decide-on-rds-technology-and-architecture" + }, + { + "from": "/REFARCH-211", + "to": "/layers/data/design-decisions/decide-on-rds-technology-and-architecture" + }, + { + "from": "/reference-architecture/REFARCH-217", + "to": "/layers/network/design-decisions/decide-on-aws-account-vpc-subnet-cidr-strategy" + }, + { + "from": "/REFARCH-217", + "to": "/layers/network/design-decisions/decide-on-aws-account-vpc-subnet-cidr-strategy" + }, + { + "from": "/reference-architecture/REFARCH-236", + "to": "/layers/eks/design-decisions/decide-on-eks-node-pool-architecture" + }, + { + "from": "/REFARCH-236", + "to": "/layers/eks/design-decisions/decide-on-eks-node-pool-architecture" + }, + { + "from": "/reference-architecture/REFARCH-240", + "to": "/layers/network/design-decisions/decide-on-organization-supernet-cidr-ranges" + }, + { + "from": "/REFARCH-240", + "to": "/layers/network/design-decisions/decide-on-organization-supernet-cidr-ranges" + } +]