[{"data":1,"prerenderedAt":4},["ShallowReactive",2],{"readme-html:EDM115\u002Fwebsite:master":3},"\u003Ch1 id=\"edm-115-website\" tabindex=\"-1\">\u003Cspan\n                class=\"header-copy-icon\"\n                role=\"button\"\n                data-slug=\"edm-115-website\"\n              >\n                \u003Csvg>\u003Cpath fill=\"currentColor\" d=\"M10.59 13.41c.41.39.41 1.03 0 1.42c-.39.39-1.03.39-1.42 0a5.003 5.003 0 0 1 0-7.07l3.54-3.54a5.003 5.003 0 0 1 7.07 0a5.003 5.003 0 0 1 0 7.07l-1.49 1.49c.01-.82-.12-1.64-.4-2.42l.47-.48a2.98 2.98 0 0 0 0-4.24a2.98 2.98 0 0 0-4.24 0l-3.53 3.53a2.98 2.98 0 0 0 0 4.24m2.82-4.24c.39-.39 1.03-.39 1.42 0a5.003 5.003 0 0 1 0 7.07l-3.54 3.54a5.003 5.003 0 0 1-7.07 0a5.003 5.003 0 0 1 0-7.07l1.49-1.49c-.01.82.12 1.64.4 2.43l-.47.47a2.98 2.98 0 0 0 0 4.24a2.98 2.98 0 0 0 4.24 0l3.53-3.53a2.98 2.98 0 0 0 0-4.24a.973.973 0 0 1 0-1.42\"\u002F>\u003C\u002Fsvg>\n              \u003C\u002Fspan>\u003Ca class=\"header-anchor\" href=\"#edm-115-website\">\u003Ccode class=\"hljs\">EDM115\u002Fwebsite\u003C\u002Fcode>\u003C\u002Fa>\u003C\u002Fh1>\n\u003Cp>Basically my website, hosted at \u003Ca href=\"https:\u002F\u002Fedm115.dev\" target=\"_blank\" rel=\"noopener noreferrer\">edm115.dev\u003C\u002Fa>, real-time preview of the latest commit at \u003Ca href=\"https:\u002F\u002Fnext.edm115.dev\" target=\"_blank\" rel=\"noopener noreferrer\">next.edm115.dev\u003C\u002Fa>\u003Cbr>\n\u003Cbr>\n\u003C\u002Fp>\n\u003Cp>\u003Ca href=\"https:\u002F\u002Fapp.deepsource.com\u002Fgh\u002FEDM115\u002Fwebsite\u002F\" target=\"_blank\" rel=\"noopener noreferrer\">\u003Cimg src=\"https:\u002F\u002Fapp.deepsource.com\u002Fgh\u002FEDM115\u002Fwebsite.svg\u002F?label=active+issues&amp;show_trend=true&amp;token=N0wq5KKIR-8bZ-Jsa88xTbRm\" alt=\"DeepSource - Active issues\" loading=\"lazy\">\u003C\u002Fa> \u003Ca href=\"https:\u002F\u002Fapp.deepsource.com\u002Fgh\u002FEDM115\u002Fwebsite\u002F\" target=\"_blank\" rel=\"noopener noreferrer\">\u003Cimg src=\"https:\u002F\u002Fapp.deepsource.com\u002Fgh\u002FEDM115\u002Fwebsite.svg\u002F?label=resolved+issues&amp;show_trend=true&amp;token=N0wq5KKIR-8bZ-Jsa88xTbRm\" alt=\"DeepSource - Resolved issues\" loading=\"lazy\">\u003C\u002Fa>\u003C\u002Fp>\n\u003Chr>\n\u003Ch2 id=\"overview\" tabindex=\"-1\">\u003Cspan\n                class=\"header-copy-icon\"\n                role=\"button\"\n                data-slug=\"overview\"\n              >\n                \u003Csvg>\u003Cpath fill=\"currentColor\" d=\"M10.59 13.41c.41.39.41 1.03 0 1.42c-.39.39-1.03.39-1.42 0a5.003 5.003 0 0 1 0-7.07l3.54-3.54a5.003 5.003 0 0 1 7.07 0a5.003 5.003 0 0 1 0 7.07l-1.49 1.49c.01-.82-.12-1.64-.4-2.42l.47-.48a2.98 2.98 0 0 0 0-4.24a2.98 2.98 0 0 0-4.24 0l-3.53 3.53a2.98 2.98 0 0 0 0 4.24m2.82-4.24c.39-.39 1.03-.39 1.42 0a5.003 5.003 0 0 1 0 7.07l-3.54 3.54a5.003 5.003 0 0 1-7.07 0a5.003 5.003 0 0 1 0-7.07l1.49-1.49c-.01.82.12 1.64.4 2.43l-.47.47a2.98 2.98 0 0 0 0 4.24a2.98 2.98 0 0 0 4.24 0l3.53-3.53a2.98 2.98 0 0 0 0-4.24a.973.973 0 0 1 0-1.42\"\u002F>\u003C\u002Fsvg>\n              \u003C\u002Fspan>\u003Ca class=\"header-anchor\" href=\"#overview\">Overview\u003C\u002Fa>\u003C\u002Fh2>\n\u003Ch3 id=\"technologies-used\" tabindex=\"-1\">\u003Cspan\n                class=\"header-copy-icon\"\n                role=\"button\"\n                data-slug=\"technologies-used\"\n              >\n                \u003Csvg>\u003Cpath fill=\"currentColor\" d=\"M10.59 13.41c.41.39.41 1.03 0 1.42c-.39.39-1.03.39-1.42 0a5.003 5.003 0 0 1 0-7.07l3.54-3.54a5.003 5.003 0 0 1 7.07 0a5.003 5.003 0 0 1 0 7.07l-1.49 1.49c.01-.82-.12-1.64-.4-2.42l.47-.48a2.98 2.98 0 0 0 0-4.24a2.98 2.98 0 0 0-4.24 0l-3.53 3.53a2.98 2.98 0 0 0 0 4.24m2.82-4.24c.39-.39 1.03-.39 1.42 0a5.003 5.003 0 0 1 0 7.07l-3.54 3.54a5.003 5.003 0 0 1-7.07 0a5.003 5.003 0 0 1 0-7.07l1.49-1.49c-.01.82.12 1.64.4 2.43l-.47.47a2.98 2.98 0 0 0 0 4.24a2.98 2.98 0 0 0 4.24 0l3.53-3.53a2.98 2.98 0 0 0 0-4.24a.973.973 0 0 1 0-1.42\"\u002F>\u003C\u002Fsvg>\n              \u003C\u002Fspan>\u003Ca class=\"header-anchor\" href=\"#technologies-used\">Technologies used\u003C\u002Fa>\u003C\u002Fh3>\n\u003Cul>\n\u003Cli>Nuxt 4 (Vue 3, Vite 7)\u003C\u002Fli>\n\u003Cli>Typescript\u003C\u002Fli>\n\u003Cli>SCSS\u003C\u002Fli>\n\u003Cli>Markdown-it\u003C\u002Fli>\n\u003Cli>highlight.js\u003C\u002Fli>\n\u003Cli>WASM (assemblyscript)\u003C\u002Fli>\n\u003Cli>Vueuse\u003C\u002Fli>\n\u003Cli>OxLint + EsLint (Stylistic)\u003C\u002Fli>\n\u003Cli>PNPM\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3 id=\"interesting-features\" tabindex=\"-1\">\u003Cspan\n                class=\"header-copy-icon\"\n                role=\"button\"\n                data-slug=\"interesting-features\"\n              >\n                \u003Csvg>\u003Cpath fill=\"currentColor\" d=\"M10.59 13.41c.41.39.41 1.03 0 1.42c-.39.39-1.03.39-1.42 0a5.003 5.003 0 0 1 0-7.07l3.54-3.54a5.003 5.003 0 0 1 7.07 0a5.003 5.003 0 0 1 0 7.07l-1.49 1.49c.01-.82-.12-1.64-.4-2.42l.47-.48a2.98 2.98 0 0 0 0-4.24a2.98 2.98 0 0 0-4.24 0l-3.53 3.53a2.98 2.98 0 0 0 0 4.24m2.82-4.24c.39-.39 1.03-.39 1.42 0a5.003 5.003 0 0 1 0 7.07l-3.54 3.54a5.003 5.003 0 0 1-7.07 0a5.003 5.003 0 0 1 0-7.07l1.49-1.49c-.01.82.12 1.64.4 2.43l-.47.47a2.98 2.98 0 0 0 0 4.24a2.98 2.98 0 0 0 4.24 0l3.53-3.53a2.98 2.98 0 0 0 0-4.24a.973.973 0 0 1 0-1.42\"\u002F>\u003C\u002Fsvg>\n              \u003C\u002Fspan>\u003Ca class=\"header-anchor\" href=\"#interesting-features\">Interesting features\u003C\u002Fa>\u003C\u002Fh3>\n\u003Cul>\n\u003Cli>Static Site Generation (SSG) to ship smaller and faster pages\u003C\u002Fli>\n\u003Cli>Automatic light\u002Fdark mode + switch animation\u003C\u002Fli>\n\u003Cli>Automatic EN\u002FFR language detection\u003C\u002Fli>\n\u003Cli>Fully responsive design\u003C\u002Fli>\n\u003Cli>Blog posts written in Markdown, with custom theme, syntax highlighting, multiple plugins (headings anchor links, image lazyload, dynamic table of contents, …). Posts from my Telegram channel have also been ported here\u003C\u002Fli>\n\u003Cli>Homemade blog posts fuzzy search with tags and date filtering + fast WASM-based keyword &amp; full-text search powered by \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fdocfind\" target=\"_blank\" rel=\"noopener noreferrer\">docfind\u003C\u002Fa> and \u003Ca href=\"https:\u002F\u002Fpagefind.app\u002F\" target=\"_blank\" rel=\"noopener noreferrer\">pagefind\u003C\u002Fa>\u003C\u002Fli>\n\u003Cli>The projects page actually fetches the repo README at build time and pre-renders it with the above pipeline + some cleanup of GitHub-first Markdown quirks\u003C\u002Fli>\n\u003Cli>The “polychrome” effect on my logo (Balatro inspired) uses multiple layers (glow, color overlay and caustic waves) with usage of Web Workers and WASM for better performance. Check the code to find how to enable the alternative rendering 😉\u003C\u002Fli>\n\u003Cli>Nice “liquid-esque” effect on the navbar buttons + stylish mobile menu\u003C\u002Fli>\n\u003Cli>The odometers have been created using a personal fork of an existing library to make it smaller and faster\u003C\u002Fli>\n\u003Cli>Every single UI component is custom made. No Vuetify, no Tailwind, no shadcn-vue, …\u003C\u002Fli>\n\u003Cli>Everything has been optimized for performance and will continue to be !\u003C\u002Fli>\n\u003Cli>A job runs every week to update the Open Source contributions list, as well as another one to check the build status on PRs\u003C\u002Fli>\n\u003Cli>Local fonts with Country Flags polyfill for Windows and custom ligature sets\u003C\u002Fli>\n\u003Cli>Image optimization + lazyloading + progressive quality\u003C\u002Fli>\n\u003Cli>Working Open Graph with dynamically generated custom images at build time\u003C\u002Fli>\n\u003Cli>Privacy-respectful analytics (Cloudflare Web Analytics) + any click outside of the banner is considered as reject :)\u003C\u002Fli>\n\u003Cli>100% Lighthouse score (desktop)\u003C\u002Fli>\n\u003Cli>Automatic redirection of URLs from the v1 website\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Chr>\n\u003Ch2 id=\"contributing\" tabindex=\"-1\">\u003Cspan\n                class=\"header-copy-icon\"\n                role=\"button\"\n                data-slug=\"contributing\"\n              >\n                \u003Csvg>\u003Cpath fill=\"currentColor\" d=\"M10.59 13.41c.41.39.41 1.03 0 1.42c-.39.39-1.03.39-1.42 0a5.003 5.003 0 0 1 0-7.07l3.54-3.54a5.003 5.003 0 0 1 7.07 0a5.003 5.003 0 0 1 0 7.07l-1.49 1.49c.01-.82-.12-1.64-.4-2.42l.47-.48a2.98 2.98 0 0 0 0-4.24a2.98 2.98 0 0 0-4.24 0l-3.53 3.53a2.98 2.98 0 0 0 0 4.24m2.82-4.24c.39-.39 1.03-.39 1.42 0a5.003 5.003 0 0 1 0 7.07l-3.54 3.54a5.003 5.003 0 0 1-7.07 0a5.003 5.003 0 0 1 0-7.07l1.49-1.49c-.01.82.12 1.64.4 2.43l-.47.47a2.98 2.98 0 0 0 0 4.24a2.98 2.98 0 0 0 4.24 0l3.53-3.53a2.98 2.98 0 0 0 0-4.24a.973.973 0 0 1 0-1.42\"\u002F>\u003C\u002Fsvg>\n              \u003C\u002Fspan>\u003Ca class=\"header-anchor\" href=\"#contributing\">Contributing\u003C\u002Fa>\u003C\u002Fh2>\n\u003Cp>Start :\u003C\u002Fp>\n\n          \u003Cdiv class='code-block'>\n            \u003Cdiv class='code-block-header'>\n              \u003Cspan class='code-block-lang'>zsh\u003C\u002Fspan>\n              \u003Cbutton class='copy-code-button' type='button'>\n                Copy\n              \u003C\u002Fbutton>\n            \u003C\u002Fdiv>\n            \u003Cpre>\u003Ccode class='hljs zsh'>git \u003Cspan class=\"hljs-built_in\">clone\u003C\u002Fspan> https:\u002F\u002Fgithub.com\u002FEDM115\u002Fwebsite.git &amp;&amp; \u003Cspan class=\"hljs-built_in\">cd\u003C\u002Fspan> website\npnpm i --frozen-lockfile\npnpm install-docfind:linux \u003Cspan class=\"hljs-comment\"># or windows\u003C\u002Fspan>\npnpm prebuild\npnpm dev\n\u003C\u002Fcode>\u003C\u002Fpre>\n          \u003C\u002Fdiv>\n        \u003Cp>Before commits :\u003C\u002Fp>\n\n          \u003Cdiv class='code-block'>\n            \u003Cdiv class='code-block-header'>\n              \u003Cspan class='code-block-lang'>zsh\u003C\u002Fspan>\n              \u003Cbutton class='copy-code-button' type='button'>\n                Copy\n              \u003C\u002Fbutton>\n            \u003C\u002Fdiv>\n            \u003Cpre>\u003Ccode class='hljs zsh'>pnpm format\npnpm lint:fix\n\u003C\u002Fcode>\u003C\u002Fpre>\n          \u003C\u002Fdiv>\n        \u003Cp>Test builds :\u003C\u002Fp>\n\n          \u003Cdiv class='code-block'>\n            \u003Cdiv class='code-block-header'>\n              \u003Cspan class='code-block-lang'>zsh\u003C\u002Fspan>\n              \u003Cbutton class='copy-code-button' type='button'>\n                Copy\n              \u003C\u002Fbutton>\n            \u003C\u002Fdiv>\n            \u003Cpre>\u003Ccode class='hljs zsh'>pnpm build\npnpm start:ssr\n\u003C\u002Fcode>\u003C\u002Fpre>\n          \u003C\u002Fdiv>\n        \u003Cp>Test the actual rendered builds :\u003C\u002Fp>\n\n          \u003Cdiv class='code-block'>\n            \u003Cdiv class='code-block-header'>\n              \u003Cspan class='code-block-lang'>zsh\u003C\u002Fspan>\n              \u003Cbutton class='copy-code-button' type='button'>\n                Copy\n              \u003C\u002Fbutton>\n            \u003C\u002Fdiv>\n            \u003Cpre>\u003Ccode class='hljs zsh'>pnpm generate\npnpm start:ssg\n\u003C\u002Fcode>\u003C\u002Fpre>\n          \u003C\u002Fdiv>\n        \u003Chr>\n\u003Cdetails>\n\u003Csummary>Considered additions\u003C\u002Fsummary>\n\u003Cul>\n\u003Cli>Mermaid support in markdown-it\u003C\u002Fli>\n\u003Cli>Better GFM support (=&gt; \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fnpm\u002Fmarky-markdown#dependencies\" target=\"_blank\" rel=\"noopener noreferrer\">https:\u002F\u002Fgithub.com\u002Fnpm\u002Fmarky-markdown#dependencies\u003C\u002Fa> &amp; \u003Ca href=\"https:\u002F\u002Fgithub.github.com\u002Fgfm\u002F\" target=\"_blank\" rel=\"noopener noreferrer\">https:\u002F\u002Fgithub.github.com\u002Fgfm\u002F\u003C\u002Fa> + \u003Ca href=\"https:\u002F\u002Fmdxjs.com\u002Fguides\u002Fgfm\u002F\" target=\"_blank\" rel=\"noopener noreferrer\">https:\u002F\u002Fmdxjs.com\u002Fguides\u002Fgfm\u002F\u003C\u002Fa>)\u003C\u002Fli>\n\u003Cli>RSS feed\u003C\u002Fli>\n\u003C\u002Ful>\n\u003C\u002Fdetails>\n\u003Chr>\n\u003Ch3 id=\"status\" tabindex=\"-1\">\u003Cspan\n                class=\"header-copy-icon\"\n                role=\"button\"\n                data-slug=\"status\"\n              >\n                \u003Csvg>\u003Cpath fill=\"currentColor\" d=\"M10.59 13.41c.41.39.41 1.03 0 1.42c-.39.39-1.03.39-1.42 0a5.003 5.003 0 0 1 0-7.07l3.54-3.54a5.003 5.003 0 0 1 7.07 0a5.003 5.003 0 0 1 0 7.07l-1.49 1.49c.01-.82-.12-1.64-.4-2.42l.47-.48a2.98 2.98 0 0 0 0-4.24a2.98 2.98 0 0 0-4.24 0l-3.53 3.53a2.98 2.98 0 0 0 0 4.24m2.82-4.24c.39-.39 1.03-.39 1.42 0a5.003 5.003 0 0 1 0 7.07l-3.54 3.54a5.003 5.003 0 0 1-7.07 0a5.003 5.003 0 0 1 0-7.07l1.49-1.49c-.01.82.12 1.64.4 2.43l-.47.47a2.98 2.98 0 0 0 0 4.24a2.98 2.98 0 0 0 4.24 0l3.53-3.53a2.98 2.98 0 0 0 0-4.24a.973.973 0 0 1 0-1.42\"\u002F>\u003C\u002Fsvg>\n              \u003C\u002Fspan>\u003Ca class=\"header-anchor\" href=\"#status\">Status\u003C\u002Fa>\u003C\u002Fh3>\n\u003Cul>\n\u003Cli>\u003Cstrong>\u003Ca href=\"https:\u002F\u002Fedm115.dev\" target=\"_blank\" rel=\"noopener noreferrer\">Main website\u003C\u002Fa> status :\u003C\u002Fstrong> \u003Ca href=\"https:\u002F\u002Fup.edm115.dev\u002F\" target=\"_blank\" rel=\"noopener noreferrer\">\u003Cimg src=\"https:\u002F\u002Fbetteruptime.com\u002Fstatus-badges\u002Fv1\u002Fmonitor\u002Fn6oc.svg\" alt=\"Better Uptime Badge\" loading=\"lazy\">\u003C\u002Fa>\u003C\u002Fli>\n\u003Cli>\u003Cstrong>\u003Ca href=\"https:\u002F\u002Fedm115.netlify.app\" target=\"_blank\" rel=\"noopener noreferrer\">Latest commit preview\u003C\u002Fa> status :\u003C\u002Fstrong> \u003Cimg src=\"https:\u002F\u002Fapi.netlify.com\u002Fapi\u002Fv1\u002Fbadges\u002F6ffb8504-c2c9-4482-a56c-0efd83a3a4d6\u002Fdeploy-status\" alt=\"Netlify Status\" loading=\"lazy\">\u003C\u002Fli>\n\u003Cli>\u003Cstrong>\u003Ca href=\"https:\u002F\u002Fedm115.eu.org\" target=\"_blank\" rel=\"noopener noreferrer\">Main website (mirror)\u003C\u002Fa> status :\u003C\u002Fstrong> \u003Ca href=\"https:\u002F\u002Fup.edm115.dev\u002F\" target=\"_blank\" rel=\"noopener noreferrer\">\u003Cimg src=\"https:\u002F\u002Fbetteruptime.com\u002Fstatus-badges\u002Fv1\u002Fmonitor\u002Fiker.svg\" alt=\"Better Uptime Badge\" loading=\"lazy\">\u003C\u002Fa>\u003C\u002Fli>\n\u003Cli>\u003Cstrong>\u003Ca href=\"https:\u002F\u002Fedm115.github.io\u002Fwebsite\u002F\" target=\"_blank\" rel=\"noopener noreferrer\">Main website (GitHub Pages mirror)\u003C\u002Fa> status :\u003C\u002Fstrong> \u003Ca href=\"https:\u002F\u002Fup.edm115.dev\u002F\" target=\"_blank\" rel=\"noopener noreferrer\">\u003Cimg src=\"https:\u002F\u002Fbetteruptime.com\u002Fstatus-badges\u002Fv1\u002Fmonitor\u002F27w6u.svg\" alt=\"Better Uptime Badge\" loading=\"lazy\">\u003C\u002Fa>\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Chr>\n\u003Ch3 id=\"nginx-setup-on-my-vps\" tabindex=\"-1\">\u003Cspan\n                class=\"header-copy-icon\"\n                role=\"button\"\n                data-slug=\"nginx-setup-on-my-vps\"\n              >\n                \u003Csvg>\u003Cpath fill=\"currentColor\" d=\"M10.59 13.41c.41.39.41 1.03 0 1.42c-.39.39-1.03.39-1.42 0a5.003 5.003 0 0 1 0-7.07l3.54-3.54a5.003 5.003 0 0 1 7.07 0a5.003 5.003 0 0 1 0 7.07l-1.49 1.49c.01-.82-.12-1.64-.4-2.42l.47-.48a2.98 2.98 0 0 0 0-4.24a2.98 2.98 0 0 0-4.24 0l-3.53 3.53a2.98 2.98 0 0 0 0 4.24m2.82-4.24c.39-.39 1.03-.39 1.42 0a5.003 5.003 0 0 1 0 7.07l-3.54 3.54a5.003 5.003 0 0 1-7.07 0a5.003 5.003 0 0 1 0-7.07l1.49-1.49c-.01.82.12 1.64.4 2.43l-.47.47a2.98 2.98 0 0 0 0 4.24a2.98 2.98 0 0 0 4.24 0l3.53-3.53a2.98 2.98 0 0 0 0-4.24a.973.973 0 0 1 0-1.42\"\u002F>\u003C\u002Fsvg>\n              \u003C\u002Fspan>\u003Ca class=\"header-anchor\" href=\"#nginx-setup-on-my-vps\">NGINX setup (on my VPS)\u003C\u002Fa>\u003C\u002Fh3>\n\u003Cp>Install NGINX outside of the distro packages (to have the latest version). Ubuntu example : \u003Ca href=\"https:\u002F\u002Fnginx.org\u002Fen\u002Flinux_packages.html#Ubuntu\" target=\"_blank\" rel=\"noopener noreferrer\">https:\u002F\u002Fnginx.org\u002Fen\u002Flinux_packages.html#Ubuntu\u003C\u002Fa>\u003Cbr>\nInstall the needed dynamic module :\u003C\u002Fp>\n\n          \u003Cdiv class='code-block'>\n            \u003Cdiv class='code-block-header'>\n              \u003Cspan class='code-block-lang'>zsh\u003C\u002Fspan>\n              \u003Cbutton class='copy-code-button' type='button'>\n                Copy\n              \u003C\u002Fbutton>\n            \u003C\u002Fdiv>\n            \u003Cpre>\u003Ccode class='hljs zsh'>\u003Cspan class=\"hljs-built_in\">sudo\u003C\u002Fspan> apt install nginx-module-njs\n\u003C\u002Fcode>\u003C\u002Fpre>\n          \u003C\u002Fdiv>\n        \u003Cp>Prepare for Brotli compression (optional but recommended) :\u003C\u002Fp>\n\n          \u003Cdiv class='code-block'>\n            \u003Cdiv class='code-block-header'>\n              \u003Cspan class='code-block-lang'>zsh\u003C\u002Fspan>\n              \u003Cbutton class='copy-code-button' type='button'>\n                Copy\n              \u003C\u002Fbutton>\n            \u003C\u002Fdiv>\n            \u003Cpre>\u003Ccode class='hljs zsh'>\u003Cspan class=\"hljs-built_in\">sudo\u003C\u002Fspan> apt install brotli build-essential git ca-certificates wget libpcre2-dev zlib1g-dev libssl-dev\n\u003Cspan class=\"hljs-comment\"># Get NGINX&#x27;s version\u003C\u002Fspan>\nnginx -V  \u003Cspan class=\"hljs-comment\"># here 1.30.0, note the flags\u003C\u002Fspan>\n\u003Cspan class=\"hljs-built_in\">mkdir\u003C\u002Fspan> -p \u002Ftmp\u002Fnginx-brotli-build\n\u003Cspan class=\"hljs-built_in\">cd\u003C\u002Fspan> \u002Ftmp\u002Fnginx-brotli-build\nwget http:\u002F\u002Fnginx.org\u002Fdownload\u002Fnginx-1.30.0.tar.gz\ntar xf nginx-1.30.0.tar.gz\ngit \u003Cspan class=\"hljs-built_in\">clone\u003C\u002Fspan> https:\u002F\u002Fgithub.com\u002Fgoogle\u002Fngx_brotli.git\n\u003Cspan class=\"hljs-built_in\">cd\u003C\u002Fspan> ngx_brotli\ngit submodule update --init --recursive\n\u003Cspan class=\"hljs-built_in\">cd\u003C\u002Fspan> ..\n\u003Cspan class=\"hljs-comment\"># Run configure with the EXACT flags you had, plus the brotli module on top\u003C\u002Fspan>\n\u003Cspan class=\"hljs-comment\"># Check for &quot;adding module in \u002Ftmp\u002Fnginx-brotli-build\u002Fngx_brotli&quot; &amp; &quot;+ ngx_brotli was configured&quot; in the output. Example :\u003C\u002Fspan>\n\u003Cspan class=\"hljs-built_in\">cd\u003C\u002Fspan> \u002Ftmp\u002Fnginx-brotli-build\u002Fnginx-1.30.0\n.\u002Fconfigure \\\n  --prefix=\u002Fetc\u002Fnginx \\\n  --sbin-path=\u002Fusr\u002Fsbin\u002Fnginx \\\n  --modules-path=\u002Fusr\u002Flib\u002Fnginx\u002Fmodules \\\n  --conf-path=\u002Fetc\u002Fnginx\u002Fnginx.conf \\\n  --error-log-path=\u002Fvar\u002Flog\u002Fnginx\u002Ferror.log \\\n  --http-log-path=\u002Fvar\u002Flog\u002Fnginx\u002Faccess.log \\\n  --pid-path=\u002Frun\u002Fnginx.pid \\\n  --lock-path=\u002Frun\u002Fnginx.lock \\\n  --http-client-body-temp-path=\u002Fvar\u002Fcache\u002Fnginx\u002Fclient_temp \\\n  --http-proxy-temp-path=\u002Fvar\u002Fcache\u002Fnginx\u002Fproxy_temp \\\n  --http-fastcgi-temp-path=\u002Fvar\u002Fcache\u002Fnginx\u002Ffastcgi_temp \\\n  --http-uwsgi-temp-path=\u002Fvar\u002Fcache\u002Fnginx\u002Fuwsgi_temp \\\n  --http-scgi-temp-path=\u002Fvar\u002Fcache\u002Fnginx\u002Fscgi_temp \\\n  --user=nginx \\\n  --group=nginx \\\n  --with-compat \\\n  --with-file-aio \\\n  --with-threads \\\n  --with-http_addition_module \\\n  --with-http_auth_request_module \\\n  --with-http_dav_module \\\n  --with-http_flv_module \\\n  --with-http_gunzip_module \\\n  --with-http_gzip_static_module \\\n  --with-http_mp4_module \\\n  --with-http_random_index_module \\\n  --with-http_realip_module \\\n  --with-http_secure_link_module \\\n  --with-http_slice_module \\\n  --with-http_ssl_module \\\n  --with-http_stub_status_module \\\n  --with-http_sub_module \\\n  --with-http_v2_module \\\n  --with-http_v3_module \\\n  --with-mail \\\n  --with-mail_ssl_module \\\n  --with-stream \\\n  --with-stream_realip_module \\\n  --with-stream_ssl_module \\\n  --with-stream_ssl_preread_module \\\n  --with-cc-opt=\u003Cspan class=\"hljs-string\">&#x27;-g -O2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -ffile-prefix-map=\u002Fhome\u002Fbuilder\u002Fdebuild\u002Fnginx-1.30.0\u002Fdebian\u002Fdebuild-base\u002Fnginx-1.30.0=. -flto=auto -ffat-lto-objects -fstack-protector-strong -fstack-clash-protection -Wformat -Werror=format-security -fcf-protection -fdebug-prefix-map=\u002Fhome\u002Fbuilder\u002Fdebuild\u002Fnginx-1.28.3\u002Fdebian\u002Fdebuild-base\u002Fnginx-1.30.0=\u002Fusr\u002Fsrc\u002Fnginx-1.30.0-1~noble -fPIC&#x27;\u003C\u002Fspan> \\\n  --with-ld-opt=\u003Cspan class=\"hljs-string\">&#x27;-Wl,-Bsymbolic-functions -flto=auto -ffat-lto-objects -Wl,-z,relro -Wl,-z,now -Wl,--as-needed -pie&#x27;\u003C\u002Fspan> \\\n  --add-dynamic-module=\u002Ftmp\u002Fnginx-brotli-build\u002Fngx_brotli\nmake modules\n\u003Cspan class=\"hljs-comment\"># Install the files\u003C\u002Fspan>\n\u003Cspan class=\"hljs-built_in\">sudo\u003C\u002Fspan> \u003Cspan class=\"hljs-built_in\">cp\u003C\u002Fspan> objs\u002Fngx_http_brotli_filter_module.so \u002Fusr\u002Flib\u002Fnginx\u002Fmodules\u002F\n\u003Cspan class=\"hljs-built_in\">sudo\u003C\u002Fspan> \u003Cspan class=\"hljs-built_in\">cp\u003C\u002Fspan> objs\u002Fngx_http_brotli_static_module.so \u002Fusr\u002Flib\u002Fnginx\u002Fmodules\u002F\n\u003C\u002Fcode>\u003C\u002Fpre>\n          \u003C\u002Fdiv>\n        \u003Cdiv class=\"markdown-alert markdown-alert-caution\">\n\u003Cp class=\"markdown-alert-title\">Caution\u003C\u002Fp>\n\u003Cp>You will need to redo all that on \u003Cstrong>each NGINX update\u003C\u002Fstrong> !\u003C\u002Fp>\n\u003C\u002Fdiv>\n\u003Cp>Then start NGINX :\u003C\u002Fp>\n\n          \u003Cdiv class='code-block'>\n            \u003Cdiv class='code-block-header'>\n              \u003Cspan class='code-block-lang'>zsh\u003C\u002Fspan>\n              \u003Cbutton class='copy-code-button' type='button'>\n                Copy\n              \u003C\u002Fbutton>\n            \u003C\u002Fdiv>\n            \u003Cpre>\u003Ccode class='hljs zsh'>\u003Cspan class=\"hljs-built_in\">sudo\u003C\u002Fspan> systemctl start nginx\n\u003Cspan class=\"hljs-built_in\">sudo\u003C\u002Fspan> systemctl \u003Cspan class=\"hljs-built_in\">enable\u003C\u002Fspan> --now nginx\n\u003C\u002Fcode>\u003C\u002Fpre>\n          \u003C\u002Fdiv>\n        \u003Ch4 id=\"etc-nginx-nginx-conf\" tabindex=\"-1\">\u003Cspan\n                class=\"header-copy-icon\"\n                role=\"button\"\n                data-slug=\"etc-nginx-nginx-conf\"\n              >\n                \u003Csvg>\u003Cpath fill=\"currentColor\" d=\"M10.59 13.41c.41.39.41 1.03 0 1.42c-.39.39-1.03.39-1.42 0a5.003 5.003 0 0 1 0-7.07l3.54-3.54a5.003 5.003 0 0 1 7.07 0a5.003 5.003 0 0 1 0 7.07l-1.49 1.49c.01-.82-.12-1.64-.4-2.42l.47-.48a2.98 2.98 0 0 0 0-4.24a2.98 2.98 0 0 0-4.24 0l-3.53 3.53a2.98 2.98 0 0 0 0 4.24m2.82-4.24c.39-.39 1.03-.39 1.42 0a5.003 5.003 0 0 1 0 7.07l-3.54 3.54a5.003 5.003 0 0 1-7.07 0a5.003 5.003 0 0 1 0-7.07l1.49-1.49c-.01.82.12 1.64.4 2.43l-.47.47a2.98 2.98 0 0 0 0 4.24a2.98 2.98 0 0 0 4.24 0l3.53-3.53a2.98 2.98 0 0 0 0-4.24a.973.973 0 0 1 0-1.42\"\u002F>\u003C\u002Fsvg>\n              \u003C\u002Fspan>\u003Ca class=\"header-anchor\" href=\"#etc-nginx-nginx-conf\">\u003Ccode class=\"hljs\">\u003Cspan class=\"hljs-regexp\">\u002Fetc\u002F\u003C\u002Fspan>nginx\u002Fnginx.conf\u003C\u002Fcode>\u003C\u002Fa>\u003C\u002Fh4>\n\n          \u003Cdiv class='code-block'>\n            \u003Cdiv class='code-block-header'>\n              \u003Cspan class='code-block-lang'>nginx\u003C\u002Fspan>\n              \u003Cbutton class='copy-code-button' type='button'>\n                Copy\n              \u003C\u002Fbutton>\n            \u003C\u002Fdiv>\n            \u003Cpre>\u003Ccode class='hljs nginx'>\u003Cspan class=\"hljs-attribute\">user\u003C\u002Fspan> nginx;\n\u003Cspan class=\"hljs-attribute\">worker_processes\u003C\u002Fspan> auto;\n\u003Cspan class=\"hljs-attribute\">worker_rlimit_nofile\u003C\u002Fspan> \u003Cspan class=\"hljs-number\">65535\u003C\u002Fspan>;\n\n\u003Cspan class=\"hljs-attribute\">error_log\u003C\u002Fspan> \u002Fvar\u002Flog\u002Fnginx\u002F\u003Cspan class=\"hljs-literal\">error\u003C\u002Fspan>.log \u003Cspan class=\"hljs-literal\">notice\u003C\u002Fspan>;\n\u003Cspan class=\"hljs-attribute\">pid\u003C\u002Fspan>       \u002Frun\u002Fnginx.pid;\n\n\u003Cspan class=\"hljs-attribute\">load_module\u003C\u002Fspan> modules\u002Fngx_http_js_module.so;\n\u003Cspan class=\"hljs-comment\"># Only if you built Brotli support\u003C\u002Fspan>\n\u003Cspan class=\"hljs-attribute\">load_module\u003C\u002Fspan> modules\u002Fngx_http_brotli_filter_module.so;\n\u003Cspan class=\"hljs-attribute\">load_module\u003C\u002Fspan> modules\u002Fngx_http_brotli_static_module.so;\n\n\u003Cspan class=\"hljs-section\">events\u003C\u002Fspan> {\n  \u003Cspan class=\"hljs-attribute\">worker_connections\u003C\u002Fspan> \u003Cspan class=\"hljs-number\">2048\u003C\u002Fspan>;\n}\n\n\n\u003Cspan class=\"hljs-section\">http\u003C\u002Fspan> {\n  \u003Cspan class=\"hljs-attribute\">include\u003C\u002Fspan>      \u002Fetc\u002Fnginx\u002Fmime.types;\n  \u003Cspan class=\"hljs-attribute\">default_type\u003C\u002Fspan> application\u002Foctet-stream;\n\n  \u003Cspan class=\"hljs-attribute\">log_format\u003C\u002Fspan> main \u003Cspan class=\"hljs-string\">&#x27;\u003Cspan class=\"hljs-variable\">$remote_addr\u003C\u002Fspan> - \u003Cspan class=\"hljs-variable\">$remote_user\u003C\u002Fspan> [\u003Cspan class=\"hljs-variable\">$time_local\u003C\u002Fspan>] &quot;\u003Cspan class=\"hljs-variable\">$request\u003C\u002Fspan>&quot; &#x27;\u003C\u002Fspan>\n                  \u003Cspan class=\"hljs-string\">&#x27;\u003Cspan class=\"hljs-variable\">$status\u003C\u002Fspan> \u003Cspan class=\"hljs-variable\">$body_bytes_sent\u003C\u002Fspan> &quot;\u003Cspan class=\"hljs-variable\">$http_referer\u003C\u002Fspan>&quot; &#x27;\u003C\u002Fspan>\n                  \u003Cspan class=\"hljs-string\">&#x27;&quot;\u003Cspan class=\"hljs-variable\">$http_user_agent\u003C\u002Fspan>&quot; &quot;\u003Cspan class=\"hljs-variable\">$http_x_forwarded_for\u003C\u002Fspan>&quot;&#x27;\u003C\u002Fspan>;\n\n  \u003Cspan class=\"hljs-attribute\">access_log\u003C\u002Fspan> \u002Fvar\u002Flog\u002Fnginx\u002Faccess.log main;\n\n  \u003Cspan class=\"hljs-attribute\">sendfile\u003C\u002Fspan>        \u003Cspan class=\"hljs-literal\">on\u003C\u002Fspan>;\n  \u003Cspan class=\"hljs-comment\"># tcp_nopush    on;\u003C\u002Fspan>\n  \u003Cspan class=\"hljs-attribute\">tcp_nodelay\u003C\u002Fspan>     \u003Cspan class=\"hljs-literal\">on\u003C\u002Fspan>;\n\n  \u003Cspan class=\"hljs-attribute\">keepalive_timeout\u003C\u002Fspan> \u003Cspan class=\"hljs-number\">30\u003C\u002Fspan>;\n\n  \u003Cspan class=\"hljs-attribute\">gzip\u003C\u002Fspan> \u003Cspan class=\"hljs-literal\">on\u003C\u002Fspan>;\n  \u003Cspan class=\"hljs-attribute\">gzip_vary\u003C\u002Fspan> \u003Cspan class=\"hljs-literal\">on\u003C\u002Fspan>;\n  \u003Cspan class=\"hljs-comment\"># Only if Brotli is available\u003C\u002Fspan>\n  \u003Cspan class=\"hljs-attribute\">brotli\u003C\u002Fspan> \u003Cspan class=\"hljs-literal\">on\u003C\u002Fspan>;\n  \u003Cspan class=\"hljs-attribute\">brotli_static\u003C\u002Fspan> \u003Cspan class=\"hljs-literal\">on\u003C\u002Fspan>;\n  \u003Cspan class=\"hljs-attribute\">brotli_comp_level\u003C\u002Fspan> \u003Cspan class=\"hljs-number\">6\u003C\u002Fspan>;\n  \u003Cspan class=\"hljs-attribute\">brotli_types\u003C\u002Fspan>\n    text\u002Fplain\n    text\u002Fcss\n    \u003Cspan class=\"hljs-comment\"># text\u002Fhtml\u003C\u002Fspan>\n    text\u002Fxml\n    application\u002Fxml\n    application\u002Fjson\n    application\u002Fjavascript\n    image\u002Fsvg+xml;\n  \u003Cspan class=\"hljs-comment\">#\u003C\u002Fspan>\n\n  \u003Cspan class=\"hljs-attribute\">server_tokens\u003C\u002Fspan> \u003Cspan class=\"hljs-literal\">off\u003C\u002Fspan>;\n\n  \u003Cspan class=\"hljs-comment\"># pcre_jit on;\u003C\u002Fspan>\n\n  \u003Cspan class=\"hljs-attribute\">include\u003C\u002Fspan> \u002Fetc\u002Fnginx\u002Fsites-available\u002F*;\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n          \u003C\u002Fdiv>\n        \u003Ch4 id=\"etc-nginx-snippets-ssl-cloudflare-origin-conf\" tabindex=\"-1\">\u003Cspan\n                class=\"header-copy-icon\"\n                role=\"button\"\n                data-slug=\"etc-nginx-snippets-ssl-cloudflare-origin-conf\"\n              >\n                \u003Csvg>\u003Cpath fill=\"currentColor\" d=\"M10.59 13.41c.41.39.41 1.03 0 1.42c-.39.39-1.03.39-1.42 0a5.003 5.003 0 0 1 0-7.07l3.54-3.54a5.003 5.003 0 0 1 7.07 0a5.003 5.003 0 0 1 0 7.07l-1.49 1.49c.01-.82-.12-1.64-.4-2.42l.47-.48a2.98 2.98 0 0 0 0-4.24a2.98 2.98 0 0 0-4.24 0l-3.53 3.53a2.98 2.98 0 0 0 0 4.24m2.82-4.24c.39-.39 1.03-.39 1.42 0a5.003 5.003 0 0 1 0 7.07l-3.54 3.54a5.003 5.003 0 0 1-7.07 0a5.003 5.003 0 0 1 0-7.07l1.49-1.49c-.01.82.12 1.64.4 2.43l-.47.47a2.98 2.98 0 0 0 0 4.24a2.98 2.98 0 0 0 4.24 0l3.53-3.53a2.98 2.98 0 0 0 0-4.24a.973.973 0 0 1 0-1.42\"\u002F>\u003C\u002Fsvg>\n              \u003C\u002Fspan>\u003Ca class=\"header-anchor\" href=\"#etc-nginx-snippets-ssl-cloudflare-origin-conf\">\u003Ccode class=\"hljs\">\u003Cspan class=\"hljs-regexp\">\u002Fetc\u002F\u003C\u002Fspan>nginx\u003Cspan class=\"hljs-regexp\">\u002Fsnippets\u002F\u003C\u002Fspan>ssl-cloudflare-origin.conf\u003C\u002Fcode>\u003C\u002Fa>\u003C\u002Fh4>\n\n          \u003Cdiv class='code-block'>\n            \u003Cdiv class='code-block-header'>\n              \u003Cspan class='code-block-lang'>nginx\u003C\u002Fspan>\n              \u003Cbutton class='copy-code-button' type='button'>\n                Copy\n              \u003C\u002Fbutton>\n            \u003C\u002Fdiv>\n            \u003Cpre>\u003Ccode class='hljs nginx'>\u003Cspan class=\"hljs-attribute\">ssl_certificate\u003C\u002Fspan>     \u002Fhome\u002Fedm115\u002F.secure\u002Fcloudflare-origin-server.pem;\n\u003Cspan class=\"hljs-attribute\">ssl_certificate_key\u003C\u002Fspan> \u002Fhome\u002Fedm115\u002F.secure\u002Fcloudflare-origin-server.key;\n\u003C\u002Fcode>\u003C\u002Fpre>\n          \u003C\u002Fdiv>\n        \u003Ch4 id=\"etc-nginx-snippets-proxy-common-conf\" tabindex=\"-1\">\u003Cspan\n                class=\"header-copy-icon\"\n                role=\"button\"\n                data-slug=\"etc-nginx-snippets-proxy-common-conf\"\n              >\n                \u003Csvg>\u003Cpath fill=\"currentColor\" d=\"M10.59 13.41c.41.39.41 1.03 0 1.42c-.39.39-1.03.39-1.42 0a5.003 5.003 0 0 1 0-7.07l3.54-3.54a5.003 5.003 0 0 1 7.07 0a5.003 5.003 0 0 1 0 7.07l-1.49 1.49c.01-.82-.12-1.64-.4-2.42l.47-.48a2.98 2.98 0 0 0 0-4.24a2.98 2.98 0 0 0-4.24 0l-3.53 3.53a2.98 2.98 0 0 0 0 4.24m2.82-4.24c.39-.39 1.03-.39 1.42 0a5.003 5.003 0 0 1 0 7.07l-3.54 3.54a5.003 5.003 0 0 1-7.07 0a5.003 5.003 0 0 1 0-7.07l1.49-1.49c-.01.82.12 1.64.4 2.43l-.47.47a2.98 2.98 0 0 0 0 4.24a2.98 2.98 0 0 0 4.24 0l3.53-3.53a2.98 2.98 0 0 0 0-4.24a.973.973 0 0 1 0-1.42\"\u002F>\u003C\u002Fsvg>\n              \u003C\u002Fspan>\u003Ca class=\"header-anchor\" href=\"#etc-nginx-snippets-proxy-common-conf\">\u003Ccode class=\"hljs\">\u003Cspan class=\"hljs-regexp\">\u002Fetc\u002F\u003C\u002Fspan>nginx\u003Cspan class=\"hljs-regexp\">\u002Fsnippets\u002F\u003C\u002Fspan>proxy-common.conf\u003C\u002Fcode>\u003C\u002Fa>\u003C\u002Fh4>\n\n          \u003Cdiv class='code-block'>\n            \u003Cdiv class='code-block-header'>\n              \u003Cspan class='code-block-lang'>nginx\u003C\u002Fspan>\n              \u003Cbutton class='copy-code-button' type='button'>\n                Copy\n              \u003C\u002Fbutton>\n            \u003C\u002Fdiv>\n            \u003Cpre>\u003Ccode class='hljs nginx'>\u003Cspan class=\"hljs-attribute\">proxy_http_version\u003C\u002Fspan> \u003Cspan class=\"hljs-number\">1\u003C\u002Fspan>.\u003Cspan class=\"hljs-number\">1\u003C\u002Fspan>;\n\n\u003Cspan class=\"hljs-attribute\">proxy_set_header\u003C\u002Fspan> Host              \u003Cspan class=\"hljs-variable\">$host\u003C\u002Fspan>;\n\u003Cspan class=\"hljs-attribute\">proxy_set_header\u003C\u002Fspan> X-Real-IP         \u003Cspan class=\"hljs-variable\">$remote_addr\u003C\u002Fspan>;\n\u003Cspan class=\"hljs-attribute\">proxy_set_header\u003C\u002Fspan> X-Forwarded-For   \u003Cspan class=\"hljs-variable\">$proxy_add_x_forwarded_for\u003C\u002Fspan>;\n\u003Cspan class=\"hljs-attribute\">proxy_set_header\u003C\u002Fspan> X-Forwarded-Proto \u003Cspan class=\"hljs-variable\">$scheme\u003C\u002Fspan>;\n\u003Cspan class=\"hljs-attribute\">proxy_set_header\u003C\u002Fspan> X-Forwarded-Host  \u003Cspan class=\"hljs-variable\">$host\u003C\u002Fspan>;\n\n\u003Cspan class=\"hljs-attribute\">proxy_connect_timeout\u003C\u002Fspan> \u003Cspan class=\"hljs-number\">10s\u003C\u002Fspan>;\n\u003Cspan class=\"hljs-attribute\">proxy_send_timeout\u003C\u002Fspan>    \u003Cspan class=\"hljs-number\">60s\u003C\u002Fspan>;\n\u003Cspan class=\"hljs-attribute\">proxy_read_timeout\u003C\u002Fspan>    \u003Cspan class=\"hljs-number\">60s\u003C\u002Fspan>;\n\u003C\u002Fcode>\u003C\u002Fpre>\n          \u003C\u002Fdiv>\n        \u003Ch4 id=\"etc-nginx-snippets-static-edm115-site-conf\" tabindex=\"-1\">\u003Cspan\n                class=\"header-copy-icon\"\n                role=\"button\"\n                data-slug=\"etc-nginx-snippets-static-edm115-site-conf\"\n              >\n                \u003Csvg>\u003Cpath fill=\"currentColor\" d=\"M10.59 13.41c.41.39.41 1.03 0 1.42c-.39.39-1.03.39-1.42 0a5.003 5.003 0 0 1 0-7.07l3.54-3.54a5.003 5.003 0 0 1 7.07 0a5.003 5.003 0 0 1 0 7.07l-1.49 1.49c.01-.82-.12-1.64-.4-2.42l.47-.48a2.98 2.98 0 0 0 0-4.24a2.98 2.98 0 0 0-4.24 0l-3.53 3.53a2.98 2.98 0 0 0 0 4.24m2.82-4.24c.39-.39 1.03-.39 1.42 0a5.003 5.003 0 0 1 0 7.07l-3.54 3.54a5.003 5.003 0 0 1-7.07 0a5.003 5.003 0 0 1 0-7.07l1.49-1.49c-.01.82.12 1.64.4 2.43l-.47.47a2.98 2.98 0 0 0 0 4.24a2.98 2.98 0 0 0 4.24 0l3.53-3.53a2.98 2.98 0 0 0 0-4.24a.973.973 0 0 1 0-1.42\"\u002F>\u003C\u002Fsvg>\n              \u003C\u002Fspan>\u003Ca class=\"header-anchor\" href=\"#etc-nginx-snippets-static-edm115-site-conf\">\u003Ccode class=\"hljs\">\u003Cspan class=\"hljs-regexp\">\u002Fetc\u002F\u003C\u002Fspan>nginx\u003Cspan class=\"hljs-regexp\">\u002Fsnippets\u002F\u003C\u002Fspan>\u003Cspan class=\"hljs-keyword\">static\u003C\u002Fspan>-edm115-site.conf\u003C\u002Fcode>\u003C\u002Fa>\u003C\u002Fh4>\n\n          \u003Cdiv class='code-block'>\n            \u003Cdiv class='code-block-header'>\n              \u003Cspan class='code-block-lang'>nginx\u003C\u002Fspan>\n              \u003Cbutton class='copy-code-button' type='button'>\n                Copy\n              \u003C\u002Fbutton>\n            \u003C\u002Fdiv>\n            \u003Cpre>\u003Ccode class='hljs nginx'>\u003Cspan class=\"hljs-attribute\">root\u003C\u002Fspan> \u002Fhome\u002Fedm115\u002Fwebsite\u002Fdist;\n\u003Cspan class=\"hljs-attribute\">index\u003C\u002Fspan> index.html;\n\n\u003Cspan class=\"hljs-section\">location\u003C\u002Fspan>\u003Cspan class=\"hljs-regexp\"> ^~\u003C\u002Fspan> \u002F_nuxt\u002F {\n  \u003Cspan class=\"hljs-attribute\">try_files\u003C\u002Fspan> \u003Cspan class=\"hljs-variable\">$uri\u003C\u002Fspan> =\u003Cspan class=\"hljs-number\">404\u003C\u002Fspan>;\n\n  \u003Cspan class=\"hljs-attribute\">expires\u003C\u002Fspan> \u003Cspan class=\"hljs-number\">1d\u003C\u002Fspan>;\n  \u003Cspan class=\"hljs-attribute\">add_header\u003C\u002Fspan> Cache-Control \u003Cspan class=\"hljs-string\">&quot;public, max-age=86400&quot;\u003C\u002Fspan> always;\n\n  \u003Cspan class=\"hljs-attribute\">access_log\u003C\u002Fspan> \u003Cspan class=\"hljs-literal\">off\u003C\u002Fspan>;\n  \u003Cspan class=\"hljs-attribute\">log_not_found\u003C\u002Fspan> \u003Cspan class=\"hljs-literal\">off\u003C\u002Fspan>;\n}\n\n\u003Cspan class=\"hljs-section\">location\u003C\u002Fspan> \u003Cspan class=\"hljs-regexp\">~* \\.(?:js|mjs|css|map|json|txt|xml|webmanifest|png|jpe?g|gif|webp|avif|svg|ico|woff2?|ttf|otf|eot)$\u003C\u002Fspan> {\n  \u003Cspan class=\"hljs-attribute\">try_files\u003C\u002Fspan> \u003Cspan class=\"hljs-variable\">$uri\u003C\u002Fspan> =\u003Cspan class=\"hljs-number\">404\u003C\u002Fspan>;\n\n  \u003Cspan class=\"hljs-attribute\">expires\u003C\u002Fspan> \u003Cspan class=\"hljs-number\">1d\u003C\u002Fspan>;\n  \u003Cspan class=\"hljs-attribute\">add_header\u003C\u002Fspan> Cache-Control \u003Cspan class=\"hljs-string\">&quot;public, max-age=86400&quot;\u003C\u002Fspan> always;\n\n  \u003Cspan class=\"hljs-attribute\">access_log\u003C\u002Fspan> \u003Cspan class=\"hljs-literal\">off\u003C\u002Fspan>;\n  \u003Cspan class=\"hljs-attribute\">log_not_found\u003C\u002Fspan> \u003Cspan class=\"hljs-literal\">off\u003C\u002Fspan>;\n}\n\n\u003Cspan class=\"hljs-section\">location\u003C\u002Fspan> = \u002Findex.html {\n  \u003Cspan class=\"hljs-attribute\">try_files\u003C\u002Fspan> \u003Cspan class=\"hljs-variable\">$uri\u003C\u002Fspan> =\u003Cspan class=\"hljs-number\">404\u003C\u002Fspan>;\n  \u003Cspan class=\"hljs-attribute\">add_header\u003C\u002Fspan> Cache-Control \u003Cspan class=\"hljs-string\">&quot;no-cache, must-revalidate&quot;\u003C\u002Fspan> always;\n}\n\n\u003Cspan class=\"hljs-section\">location\u003C\u002Fspan> \u003Cspan class=\"hljs-regexp\">~* \\.html$\u003C\u002Fspan> {\n  \u003Cspan class=\"hljs-attribute\">try_files\u003C\u002Fspan> \u003Cspan class=\"hljs-variable\">$uri\u003C\u002Fspan> =\u003Cspan class=\"hljs-number\">404\u003C\u002Fspan>;\n  \u003Cspan class=\"hljs-attribute\">add_header\u003C\u002Fspan> Cache-Control \u003Cspan class=\"hljs-string\">&quot;no-cache, must-revalidate&quot;\u003C\u002Fspan> always;\n}\n\n\u003Cspan class=\"hljs-section\">location\u003C\u002Fspan> \u002F {\n  \u003Cspan class=\"hljs-attribute\">try_files\u003C\u002Fspan> \u003Cspan class=\"hljs-variable\">$uri\u003C\u002Fspan> \u003Cspan class=\"hljs-variable\">$uri\u003C\u002Fspan>\u002F \u002F\u003Cspan class=\"hljs-number\">404\u003C\u002Fspan>.html;\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n          \u003C\u002Fdiv>\n        \u003Ch4 id=\"etc-nginx-sites-available-00-http-redirect-conf\" tabindex=\"-1\">\u003Cspan\n                class=\"header-copy-icon\"\n                role=\"button\"\n                data-slug=\"etc-nginx-sites-available-00-http-redirect-conf\"\n              >\n                \u003Csvg>\u003Cpath fill=\"currentColor\" d=\"M10.59 13.41c.41.39.41 1.03 0 1.42c-.39.39-1.03.39-1.42 0a5.003 5.003 0 0 1 0-7.07l3.54-3.54a5.003 5.003 0 0 1 7.07 0a5.003 5.003 0 0 1 0 7.07l-1.49 1.49c.01-.82-.12-1.64-.4-2.42l.47-.48a2.98 2.98 0 0 0 0-4.24a2.98 2.98 0 0 0-4.24 0l-3.53 3.53a2.98 2.98 0 0 0 0 4.24m2.82-4.24c.39-.39 1.03-.39 1.42 0a5.003 5.003 0 0 1 0 7.07l-3.54 3.54a5.003 5.003 0 0 1-7.07 0a5.003 5.003 0 0 1 0-7.07l1.49-1.49c-.01.82.12 1.64.4 2.43l-.47.47a2.98 2.98 0 0 0 0 4.24a2.98 2.98 0 0 0 4.24 0l3.53-3.53a2.98 2.98 0 0 0 0-4.24a.973.973 0 0 1 0-1.42\"\u002F>\u003C\u002Fsvg>\n              \u003C\u002Fspan>\u003Ca class=\"header-anchor\" href=\"#etc-nginx-sites-available-00-http-redirect-conf\">\u003Ccode class=\"hljs\">\u003Cspan class=\"hljs-regexp\">\u002Fetc\u002F\u003C\u002Fspan>nginx\u003Cspan class=\"hljs-regexp\">\u002Fsites-available\u002F\u003C\u002Fspan>\u003Cspan class=\"hljs-number\">00\u003C\u002Fspan>-http-redirect.conf\u003C\u002Fcode>\u003C\u002Fa>\u003C\u002Fh4>\n\n          \u003Cdiv class='code-block'>\n            \u003Cdiv class='code-block-header'>\n              \u003Cspan class='code-block-lang'>nginx\u003C\u002Fspan>\n              \u003Cbutton class='copy-code-button' type='button'>\n                Copy\n              \u003C\u002Fbutton>\n            \u003C\u002Fdiv>\n            \u003Cpre>\u003Ccode class='hljs nginx'>\u003Cspan class=\"hljs-section\">server\u003C\u002Fspan> {\n  \u003Cspan class=\"hljs-attribute\">listen\u003C\u002Fspan> \u003Cspan class=\"hljs-number\">80\u003C\u002Fspan>;\n  \u003Cspan class=\"hljs-attribute\">listen\u003C\u002Fspan> [::]:\u003Cspan class=\"hljs-number\">80\u003C\u002Fspan>;\n  \u003Cspan class=\"hljs-attribute\">server_name\u003C\u002Fspan> edm115.dev \u003Cspan class=\"hljs-regexp\">*.edm\u003C\u002Fspan>115.dev;\n\n  \u003Cspan class=\"hljs-attribute\">return\u003C\u002Fspan> \u003Cspan class=\"hljs-number\">301\u003C\u002Fspan> https:\u002F\u002F\u003Cspan class=\"hljs-variable\">$host\u003C\u002Fspan>\u003Cspan class=\"hljs-variable\">$request_uri\u003C\u002Fspan>;\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n          \u003C\u002Fdiv>\n        \u003Ch4 id=\"etc-nginx-sites-available-10-edm115-static-conf\" tabindex=\"-1\">\u003Cspan\n                class=\"header-copy-icon\"\n                role=\"button\"\n                data-slug=\"etc-nginx-sites-available-10-edm115-static-conf\"\n              >\n                \u003Csvg>\u003Cpath fill=\"currentColor\" d=\"M10.59 13.41c.41.39.41 1.03 0 1.42c-.39.39-1.03.39-1.42 0a5.003 5.003 0 0 1 0-7.07l3.54-3.54a5.003 5.003 0 0 1 7.07 0a5.003 5.003 0 0 1 0 7.07l-1.49 1.49c.01-.82-.12-1.64-.4-2.42l.47-.48a2.98 2.98 0 0 0 0-4.24a2.98 2.98 0 0 0-4.24 0l-3.53 3.53a2.98 2.98 0 0 0 0 4.24m2.82-4.24c.39-.39 1.03-.39 1.42 0a5.003 5.003 0 0 1 0 7.07l-3.54 3.54a5.003 5.003 0 0 1-7.07 0a5.003 5.003 0 0 1 0-7.07l1.49-1.49c-.01.82.12 1.64.4 2.43l-.47.47a2.98 2.98 0 0 0 0 4.24a2.98 2.98 0 0 0 4.24 0l3.53-3.53a2.98 2.98 0 0 0 0-4.24a.973.973 0 0 1 0-1.42\"\u002F>\u003C\u002Fsvg>\n              \u003C\u002Fspan>\u003Ca class=\"header-anchor\" href=\"#etc-nginx-sites-available-10-edm115-static-conf\">\u003Ccode class=\"hljs\">\u003Cspan class=\"hljs-regexp\">\u002Fetc\u002F\u003C\u002Fspan>nginx\u003Cspan class=\"hljs-regexp\">\u002Fsites-available\u002F\u003C\u002Fspan>\u003Cspan class=\"hljs-number\">10\u003C\u002Fspan>-edm115-\u003Cspan class=\"hljs-keyword\">static\u003C\u002Fspan>.conf\u003C\u002Fcode>\u003C\u002Fa>\u003C\u002Fh4>\n\n          \u003Cdiv class='code-block'>\n            \u003Cdiv class='code-block-header'>\n              \u003Cspan class='code-block-lang'>nginx\u003C\u002Fspan>\n              \u003Cbutton class='copy-code-button' type='button'>\n                Copy\n              \u003C\u002Fbutton>\n            \u003C\u002Fdiv>\n            \u003Cpre>\u003Ccode class='hljs nginx'>\u003Cspan class=\"hljs-attribute\">js_import\u003C\u002Fspan> blog from \u002Fetc\u002Fnginx\u002Fjs\u002Fblog.js;\n\u003Cspan class=\"hljs-attribute\">js_set\u003C\u002Fspan> \u003Cspan class=\"hljs-variable\">$blog_search_redirect\u003C\u002Fspan> blog.blog_redirect;\n\n\u003Cspan class=\"hljs-section\">server\u003C\u002Fspan> {\n  \u003Cspan class=\"hljs-attribute\">listen\u003C\u002Fspan> \u003Cspan class=\"hljs-number\">443\u003C\u002Fspan> ssl;\n  \u003Cspan class=\"hljs-attribute\">listen\u003C\u002Fspan> [::]:\u003Cspan class=\"hljs-number\">443\u003C\u002Fspan> ssl;\n  \u003Cspan class=\"hljs-attribute\">http2\u003C\u002Fspan> \u003Cspan class=\"hljs-literal\">on\u003C\u002Fspan>;\n\n  \u003Cspan class=\"hljs-attribute\">server_name\u003C\u002Fspan> edm115.dev www.edm115.dev;\n  \u003Cspan class=\"hljs-attribute\">include\u003C\u002Fspan> \u002Fetc\u002Fnginx\u002Fsnippets\u002Fssl-cloudflare-origin.conf;\n\n  \u003Cspan class=\"hljs-attribute\">include\u003C\u002Fspan> \u002Fetc\u002Fnginx\u002Fmime.types;\n  \u003Cspan class=\"hljs-attribute\">default_type\u003C\u002Fspan> application\u002Foctet-stream;\n\n  \u003Cspan class=\"hljs-section\">location\u003C\u002Fspan> \u003Cspan class=\"hljs-regexp\">~ &#x27;^\u002Fblog(?:\u002Ftelegram)?\u002F\\d\u003C\u002Fspan>{4}(?:\u002F\\d{2}(?:\u002F\\d{2})?)?\u002F?$&#x27; {\n    \u003Cspan class=\"hljs-attribute\">add_header\u003C\u002Fspan> X-Redirect \u003Cspan class=\"hljs-variable\">$blog_search_redirect\u003C\u002Fspan> always;\n\n    \u003Cspan class=\"hljs-attribute\">if\u003C\u002Fspan> (\u003Cspan class=\"hljs-variable\">$blog_search_redirect\u003C\u002Fspan> = \u003Cspan class=\"hljs-string\">&quot;&quot;\u003C\u002Fspan>) {\n      \u003Cspan class=\"hljs-attribute\">return\u003C\u002Fspan> \u003Cspan class=\"hljs-number\">500\u003C\u002Fspan>;\n    }\n\n    \u003Cspan class=\"hljs-attribute\">return\u003C\u002Fspan> \u003Cspan class=\"hljs-number\">301\u003C\u002Fspan> \u003Cspan class=\"hljs-variable\">$scheme\u003C\u002Fspan>:\u002F\u002F\u003Cspan class=\"hljs-variable\">$host\u003C\u002Fspan>\u003Cspan class=\"hljs-variable\">$blog_search_redirect\u003C\u002Fspan>;\n  }\n\n  \u003Cspan class=\"hljs-attribute\">include\u003C\u002Fspan> \u002Fetc\u002Fnginx\u002Fsnippets\u002Fstatic-edm115-site.conf;\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n          \u003C\u002Fdiv>\n        \u003Ch4 id=\"etc-nginx-sites-available-20-proxies-conf\" tabindex=\"-1\">\u003Cspan\n                class=\"header-copy-icon\"\n                role=\"button\"\n                data-slug=\"etc-nginx-sites-available-20-proxies-conf\"\n              >\n                \u003Csvg>\u003Cpath fill=\"currentColor\" d=\"M10.59 13.41c.41.39.41 1.03 0 1.42c-.39.39-1.03.39-1.42 0a5.003 5.003 0 0 1 0-7.07l3.54-3.54a5.003 5.003 0 0 1 7.07 0a5.003 5.003 0 0 1 0 7.07l-1.49 1.49c.01-.82-.12-1.64-.4-2.42l.47-.48a2.98 2.98 0 0 0 0-4.24a2.98 2.98 0 0 0-4.24 0l-3.53 3.53a2.98 2.98 0 0 0 0 4.24m2.82-4.24c.39-.39 1.03-.39 1.42 0a5.003 5.003 0 0 1 0 7.07l-3.54 3.54a5.003 5.003 0 0 1-7.07 0a5.003 5.003 0 0 1 0-7.07l1.49-1.49c-.01.82.12 1.64.4 2.43l-.47.47a2.98 2.98 0 0 0 0 4.24a2.98 2.98 0 0 0 4.24 0l3.53-3.53a2.98 2.98 0 0 0 0-4.24a.973.973 0 0 1 0-1.42\"\u002F>\u003C\u002Fsvg>\n              \u003C\u002Fspan>\u003Ca class=\"header-anchor\" href=\"#etc-nginx-sites-available-20-proxies-conf\">\u003Ccode class=\"hljs\">\u003Cspan class=\"hljs-regexp\">\u002Fetc\u002F\u003C\u002Fspan>nginx\u003Cspan class=\"hljs-regexp\">\u002Fsites-available\u002F\u003C\u002Fspan>\u003Cspan class=\"hljs-number\">20\u003C\u002Fspan>-proxies.conf\u003C\u002Fcode>\u003C\u002Fa>\u003C\u002Fh4>\n\n          \u003Cdiv class='code-block'>\n            \u003Cdiv class='code-block-header'>\n              \u003Cspan class='code-block-lang'>nginx\u003C\u002Fspan>\n              \u003Cbutton class='copy-code-button' type='button'>\n                Copy\n              \u003C\u002Fbutton>\n            \u003C\u002Fdiv>\n            \u003Cpre>\u003Ccode class='hljs nginx'>\u003Cspan class=\"hljs-comment\"># jm-vps.edm115.dev -&gt; :9898\u003C\u002Fspan>\n\u003Cspan class=\"hljs-section\">server\u003C\u002Fspan> {\n  \u003Cspan class=\"hljs-attribute\">listen\u003C\u002Fspan> \u003Cspan class=\"hljs-number\">443\u003C\u002Fspan> ssl;\n  \u003Cspan class=\"hljs-attribute\">listen\u003C\u002Fspan> [::]:\u003Cspan class=\"hljs-number\">443\u003C\u002Fspan> ssl;\n  \u003Cspan class=\"hljs-attribute\">http2\u003C\u002Fspan> \u003Cspan class=\"hljs-literal\">on\u003C\u002Fspan>;\n  \u003Cspan class=\"hljs-attribute\">server_name\u003C\u002Fspan> jm-vps.edm115.dev;\n  \u003Cspan class=\"hljs-attribute\">include\u003C\u002Fspan> \u002Fetc\u002Fnginx\u002Fsnippets\u002Fssl-cloudflare-origin.conf;\n\n  \u003Cspan class=\"hljs-section\">location\u003C\u002Fspan> \u002F {\n    \u003Cspan class=\"hljs-attribute\">include\u003C\u002Fspan> \u002Fetc\u002Fnginx\u002Fsnippets\u002Fproxy-common.conf;\n    \u003Cspan class=\"hljs-attribute\">proxy_pass\u003C\u002Fspan> http:\u002F\u002F127.0.0.1:9898;\n  }\n}\n\n\u003Cspan class=\"hljs-comment\"># dicewizard-vps.edm115.dev -&gt; :8686\u003C\u002Fspan>\n\u003Cspan class=\"hljs-section\">server\u003C\u002Fspan> {\n  \u003Cspan class=\"hljs-attribute\">listen\u003C\u002Fspan> \u003Cspan class=\"hljs-number\">443\u003C\u002Fspan> ssl;\n  \u003Cspan class=\"hljs-attribute\">listen\u003C\u002Fspan> [::]:\u003Cspan class=\"hljs-number\">443\u003C\u002Fspan> ssl;\n  \u003Cspan class=\"hljs-attribute\">http2\u003C\u002Fspan> \u003Cspan class=\"hljs-literal\">on\u003C\u002Fspan>;\n  \u003Cspan class=\"hljs-attribute\">server_name\u003C\u002Fspan> dicewizard-vps.edm115.dev;\n  \u003Cspan class=\"hljs-attribute\">include\u003C\u002Fspan> \u002Fetc\u002Fnginx\u002Fsnippets\u002Fssl-cloudflare-origin.conf;\n\n  \u003Cspan class=\"hljs-section\">location\u003C\u002Fspan> \u002F {\n    \u003Cspan class=\"hljs-attribute\">include\u003C\u002Fspan> \u002Fetc\u002Fnginx\u002Fsnippets\u002Fproxy-common.conf;\n    \u003Cspan class=\"hljs-attribute\">proxy_pass\u003C\u002Fspan> http:\u002F\u002F127.0.0.1:8686;\n  }\n}\n\n\u003Cspan class=\"hljs-comment\"># edm115-discord-vps.edm115.dev -&gt; :8888\u003C\u002Fspan>\n\u003Cspan class=\"hljs-section\">server\u003C\u002Fspan> {\n  \u003Cspan class=\"hljs-attribute\">listen\u003C\u002Fspan> \u003Cspan class=\"hljs-number\">443\u003C\u002Fspan> ssl;\n  \u003Cspan class=\"hljs-attribute\">listen\u003C\u002Fspan> [::]:\u003Cspan class=\"hljs-number\">443\u003C\u002Fspan> ssl;\n  \u003Cspan class=\"hljs-attribute\">http2\u003C\u002Fspan> \u003Cspan class=\"hljs-literal\">on\u003C\u002Fspan>;\n  \u003Cspan class=\"hljs-attribute\">server_name\u003C\u002Fspan> edm115-discord-vps.edm115.dev;\n  \u003Cspan class=\"hljs-attribute\">include\u003C\u002Fspan> \u002Fetc\u002Fnginx\u002Fsnippets\u002Fssl-cloudflare-origin.conf;\n\n  \u003Cspan class=\"hljs-section\">location\u003C\u002Fspan> \u002F {\n    \u003Cspan class=\"hljs-attribute\">include\u003C\u002Fspan> \u002Fetc\u002Fnginx\u002Fsnippets\u002Fproxy-common.conf;\n    \u003Cspan class=\"hljs-attribute\">proxy_pass\u003C\u002Fspan> http:\u002F\u002F127.0.0.1:8888;\n  }\n}\n\n\u003Cspan class=\"hljs-comment\"># logs-vps.edm115.dev -&gt; :10000\u003C\u002Fspan>\n\u003Cspan class=\"hljs-section\">server\u003C\u002Fspan> {\n  \u003Cspan class=\"hljs-attribute\">listen\u003C\u002Fspan> \u003Cspan class=\"hljs-number\">443\u003C\u002Fspan> ssl;\n  \u003Cspan class=\"hljs-attribute\">listen\u003C\u002Fspan> [::]:\u003Cspan class=\"hljs-number\">443\u003C\u002Fspan> ssl;\n  \u003Cspan class=\"hljs-attribute\">http2\u003C\u002Fspan> \u003Cspan class=\"hljs-literal\">on\u003C\u002Fspan>;\n  \u003Cspan class=\"hljs-attribute\">server_name\u003C\u002Fspan> logs-vps.edm115.dev;\n  \u003Cspan class=\"hljs-attribute\">include\u003C\u002Fspan> \u002Fetc\u002Fnginx\u002Fsnippets\u002Fssl-cloudflare-origin.conf;\n\n  \u003Cspan class=\"hljs-section\">location\u003C\u002Fspan> \u002F {\n    \u003Cspan class=\"hljs-attribute\">include\u003C\u002Fspan> \u002Fetc\u002Fnginx\u002Fsnippets\u002Fproxy-common.conf;\n    \u003Cspan class=\"hljs-attribute\">proxy_pass\u003C\u002Fspan> http:\u002F\u002F127.0.0.1:10000;\n  }\n}\n\n\u003Cspan class=\"hljs-comment\"># maps.edm115.dev -&gt; :27400\u003C\u002Fspan>\n\u003Cspan class=\"hljs-section\">server\u003C\u002Fspan> {\n  \u003Cspan class=\"hljs-attribute\">listen\u003C\u002Fspan> \u003Cspan class=\"hljs-number\">443\u003C\u002Fspan> ssl;\n  \u003Cspan class=\"hljs-attribute\">listen\u003C\u002Fspan> [::]:\u003Cspan class=\"hljs-number\">443\u003C\u002Fspan> ssl;\n  \u003Cspan class=\"hljs-attribute\">http2\u003C\u002Fspan> \u003Cspan class=\"hljs-literal\">on\u003C\u002Fspan>;\n  \u003Cspan class=\"hljs-attribute\">server_name\u003C\u002Fspan> maps.edm115.dev;\n  \u003Cspan class=\"hljs-attribute\">include\u003C\u002Fspan> \u002Fetc\u002Fnginx\u002Fsnippets\u002Fssl-cloudflare-origin.conf;\n\n  \u003Cspan class=\"hljs-section\">location\u003C\u002Fspan> \u002F {\n    \u003Cspan class=\"hljs-attribute\">include\u003C\u002Fspan> \u002Fetc\u002Fnginx\u002Fsnippets\u002Fproxy-common.conf;\n    \u003Cspan class=\"hljs-attribute\">proxy_pass\u003C\u002Fspan> http:\u002F\u002F127.0.0.1:27400;\n  }\n}\n\n\u003Cspan class=\"hljs-comment\"># spendly.edm115.dev -&gt; :60000\u003C\u002Fspan>\n\u003Cspan class=\"hljs-section\">server\u003C\u002Fspan> {\n  \u003Cspan class=\"hljs-attribute\">listen\u003C\u002Fspan> \u003Cspan class=\"hljs-number\">443\u003C\u002Fspan> ssl;\n  \u003Cspan class=\"hljs-attribute\">listen\u003C\u002Fspan> [::]:\u003Cspan class=\"hljs-number\">443\u003C\u002Fspan> ssl;\n  \u003Cspan class=\"hljs-attribute\">http2\u003C\u002Fspan> \u003Cspan class=\"hljs-literal\">on\u003C\u002Fspan>;\n  \u003Cspan class=\"hljs-attribute\">server_name\u003C\u002Fspan> spendly.edm115.dev;\n  \u003Cspan class=\"hljs-attribute\">include\u003C\u002Fspan> \u002Fetc\u002Fnginx\u002Fsnippets\u002Fssl-cloudflare-origin.conf;\n\n  \u003Cspan class=\"hljs-section\">location\u003C\u002Fspan> \u002F {\n    \u003Cspan class=\"hljs-attribute\">include\u003C\u002Fspan> \u002Fetc\u002Fnginx\u002Fsnippets\u002Fproxy-common.conf;\n    \u003Cspan class=\"hljs-attribute\">proxy_pass\u003C\u002Fspan> http:\u002F\u002F127.0.0.1:60000;\n  }\n}\n\n\u003Cspan class=\"hljs-comment\"># senescalade.edm115.dev -&gt; github redirect\u003C\u002Fspan>\n\u003Cspan class=\"hljs-section\">server\u003C\u002Fspan> {\n  \u003Cspan class=\"hljs-attribute\">listen\u003C\u002Fspan> \u003Cspan class=\"hljs-number\">443\u003C\u002Fspan> ssl;\n  \u003Cspan class=\"hljs-attribute\">listen\u003C\u002Fspan> [::]:\u003Cspan class=\"hljs-number\">443\u003C\u002Fspan> ssl;\n  \u003Cspan class=\"hljs-attribute\">http2\u003C\u002Fspan> \u003Cspan class=\"hljs-literal\">on\u003C\u002Fspan>;\n  \u003Cspan class=\"hljs-attribute\">server_name\u003C\u002Fspan> senescalade.edm115.dev;\n  \u003Cspan class=\"hljs-attribute\">include\u003C\u002Fspan> \u002Fetc\u002Fnginx\u002Fsnippets\u002Fssl-cloudflare-origin.conf;\n\n  \u003Cspan class=\"hljs-attribute\">return\u003C\u002Fspan> \u003Cspan class=\"hljs-number\">301\u003C\u002Fspan> https:\u002F\u002Fgithub.com\u002FEDM115-org\u002FSenescalade;\n}\n\n\u003Cspan class=\"hljs-comment\"># next.edm115.dev -&gt; netlify redirect\u003C\u002Fspan>\n\u003Cspan class=\"hljs-section\">server\u003C\u002Fspan> {\n  \u003Cspan class=\"hljs-attribute\">listen\u003C\u002Fspan> \u003Cspan class=\"hljs-number\">443\u003C\u002Fspan> ssl;\n  \u003Cspan class=\"hljs-attribute\">listen\u003C\u002Fspan> [::]:\u003Cspan class=\"hljs-number\">443\u003C\u002Fspan> ssl;\n  \u003Cspan class=\"hljs-attribute\">http2\u003C\u002Fspan> \u003Cspan class=\"hljs-literal\">on\u003C\u002Fspan>;\n  \u003Cspan class=\"hljs-attribute\">server_name\u003C\u002Fspan> next.edm115.dev;\n  \u003Cspan class=\"hljs-attribute\">include\u003C\u002Fspan> \u002Fetc\u002Fnginx\u002Fsnippets\u002Fssl-cloudflare-origin.conf;\n\n  \u003Cspan class=\"hljs-attribute\">return\u003C\u002Fspan> \u003Cspan class=\"hljs-number\">301\u003C\u002Fspan> https:\u002F\u002Fedm115.netlify.app\u003Cspan class=\"hljs-variable\">$request_uri\u003C\u002Fspan>;\n}\n\n\u003Cspan class=\"hljs-comment\">## defunct services\u003C\u002Fspan>\n\u003Cspan class=\"hljs-comment\"># foudre-vps.edm115.dev -&gt; :8989\u003C\u002Fspan>\n\u003Cspan class=\"hljs-comment\"># cursedchess-vps.edm115.dev -&gt; :6969\u003C\u002Fspan>\n\u003Cspan class=\"hljs-comment\"># trackfit.edm115.dev -&gt; :56000\u003C\u002Fspan>\n\u003Cspan class=\"hljs-comment\"># trackfit-api.edm115.dev -&gt; :56001\u003C\u002Fspan>\n\u003C\u002Fcode>\u003C\u002Fpre>\n          \u003C\u002Fdiv>\n        \u003Ch4 id=\"etc-nginx-sites-available-99-catchall-ssl-conf\" tabindex=\"-1\">\u003Cspan\n                class=\"header-copy-icon\"\n                role=\"button\"\n                data-slug=\"etc-nginx-sites-available-99-catchall-ssl-conf\"\n              >\n                \u003Csvg>\u003Cpath fill=\"currentColor\" d=\"M10.59 13.41c.41.39.41 1.03 0 1.42c-.39.39-1.03.39-1.42 0a5.003 5.003 0 0 1 0-7.07l3.54-3.54a5.003 5.003 0 0 1 7.07 0a5.003 5.003 0 0 1 0 7.07l-1.49 1.49c.01-.82-.12-1.64-.4-2.42l.47-.48a2.98 2.98 0 0 0 0-4.24a2.98 2.98 0 0 0-4.24 0l-3.53 3.53a2.98 2.98 0 0 0 0 4.24m2.82-4.24c.39-.39 1.03-.39 1.42 0a5.003 5.003 0 0 1 0 7.07l-3.54 3.54a5.003 5.003 0 0 1-7.07 0a5.003 5.003 0 0 1 0-7.07l1.49-1.49c-.01.82.12 1.64.4 2.43l-.47.47a2.98 2.98 0 0 0 0 4.24a2.98 2.98 0 0 0 4.24 0l3.53-3.53a2.98 2.98 0 0 0 0-4.24a.973.973 0 0 1 0-1.42\"\u002F>\u003C\u002Fsvg>\n              \u003C\u002Fspan>\u003Ca class=\"header-anchor\" href=\"#etc-nginx-sites-available-99-catchall-ssl-conf\">\u003Ccode class=\"hljs\">\u003Cspan class=\"hljs-regexp\">\u002Fetc\u002F\u003C\u002Fspan>nginx\u003Cspan class=\"hljs-regexp\">\u002Fsites-available\u002F\u003C\u002Fspan>\u003Cspan class=\"hljs-number\">99\u003C\u002Fspan>-catchall-ssl.conf\u003C\u002Fcode>\u003C\u002Fa>\u003C\u002Fh4>\n\n          \u003Cdiv class='code-block'>\n            \u003Cdiv class='code-block-header'>\n              \u003Cspan class='code-block-lang'>nginx\u003C\u002Fspan>\n              \u003Cbutton class='copy-code-button' type='button'>\n                Copy\n              \u003C\u002Fbutton>\n            \u003C\u002Fdiv>\n            \u003Cpre>\u003Ccode class='hljs nginx'>\u003Cspan class=\"hljs-comment\"># Catch-all requests, can be used for unparked subdomains or redirect old URLs\u003C\u002Fspan>\n\u003Cspan class=\"hljs-section\">server\u003C\u002Fspan> {\n  \u003Cspan class=\"hljs-attribute\">listen\u003C\u002Fspan> \u003Cspan class=\"hljs-number\">443\u003C\u002Fspan> ssl default_server;\n  \u003Cspan class=\"hljs-attribute\">listen\u003C\u002Fspan> [::]:\u003Cspan class=\"hljs-number\">443\u003C\u002Fspan> ssl default_server;\n  \u003Cspan class=\"hljs-attribute\">http2\u003C\u002Fspan> \u003Cspan class=\"hljs-literal\">on\u003C\u002Fspan>;\n  \u003Cspan class=\"hljs-attribute\">server_name\u003C\u002Fspan> _;\n\n  \u003Cspan class=\"hljs-attribute\">include\u003C\u002Fspan> \u002Fetc\u002Fnginx\u002Fsnippets\u002Fssl-cloudflare-origin.conf;\n\n  \u003Cspan class=\"hljs-attribute\">return\u003C\u002Fspan> \u003Cspan class=\"hljs-number\">301\u003C\u002Fspan> https:\u002F\u002Fedm115.dev;\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n          \u003C\u002Fdiv>\n        \u003Ch4 id=\"etc-nginx-js-blog-js\" tabindex=\"-1\">\u003Cspan\n                class=\"header-copy-icon\"\n                role=\"button\"\n                data-slug=\"etc-nginx-js-blog-js\"\n              >\n                \u003Csvg>\u003Cpath fill=\"currentColor\" d=\"M10.59 13.41c.41.39.41 1.03 0 1.42c-.39.39-1.03.39-1.42 0a5.003 5.003 0 0 1 0-7.07l3.54-3.54a5.003 5.003 0 0 1 7.07 0a5.003 5.003 0 0 1 0 7.07l-1.49 1.49c.01-.82-.12-1.64-.4-2.42l.47-.48a2.98 2.98 0 0 0 0-4.24a2.98 2.98 0 0 0-4.24 0l-3.53 3.53a2.98 2.98 0 0 0 0 4.24m2.82-4.24c.39-.39 1.03-.39 1.42 0a5.003 5.003 0 0 1 0 7.07l-3.54 3.54a5.003 5.003 0 0 1-7.07 0a5.003 5.003 0 0 1 0-7.07l1.49-1.49c-.01.82.12 1.64.4 2.43l-.47.47a2.98 2.98 0 0 0 0 4.24a2.98 2.98 0 0 0 4.24 0l3.53-3.53a2.98 2.98 0 0 0 0-4.24a.973.973 0 0 1 0-1.42\"\u002F>\u003C\u002Fsvg>\n              \u003C\u002Fspan>\u003Ca class=\"header-anchor\" href=\"#etc-nginx-js-blog-js\">\u003Ccode class=\"hljs\">\u003Cspan class=\"hljs-regexp\">\u002Fetc\u002F\u003C\u002Fspan>nginx\u003Cspan class=\"hljs-regexp\">\u002Fjs\u002F\u003C\u002Fspan>blog.js\u003C\u002Fcode>\u003C\u002Fa>\u003C\u002Fh4>\n\n          \u003Cdiv class='code-block'>\n            \u003Cdiv class='code-block-header'>\n              \u003Cspan class='code-block-lang'>javascript\u003C\u002Fspan>\n              \u003Cbutton class='copy-code-button' type='button'>\n                Copy\n              \u003C\u002Fbutton>\n            \u003C\u002Fdiv>\n            \u003Cpre>\u003Ccode class='hljs javascript'>\u003Cspan class=\"hljs-keyword\">function\u003C\u002Fspan> \u003Cspan class=\"hljs-title function_\">blog_redirect\u003C\u002Fspan>(\u003Cspan class=\"hljs-params\">r\u003C\u002Fspan>) {\n  \u003Cspan class=\"hljs-comment\">\u002F\u002F strip trailing slash\u003C\u002Fspan>\n  \u003Cspan class=\"hljs-keyword\">const\u003C\u002Fspan> uri = (r.\u003Cspan class=\"hljs-property\">uri\u003C\u002Fspan> || \u003Cspan class=\"hljs-string\">&quot;&quot;\u003C\u002Fspan>).\u003Cspan class=\"hljs-title function_\">replace\u003C\u002Fspan>(\u003Cspan class=\"hljs-regexp\">\u002F\\\u002F+$\u002F\u003C\u002Fspan>, \u003Cspan class=\"hljs-string\">&quot;&quot;\u003C\u002Fspan>)\n  \u003Cspan class=\"hljs-keyword\">const\u003C\u002Fspan> m = uri.\u003Cspan class=\"hljs-title function_\">match\u003C\u002Fspan>(\u003Cspan class=\"hljs-regexp\">\u002F^\\\u002Fblog(\\\u002Ftelegram)?\\\u002F(\\d{4})(?:\\\u002F(\\d{2})(?:\\\u002F(\\d{2}))?)?$\u002F\u003C\u002Fspan>)\n\n  \u003Cspan class=\"hljs-keyword\">if\u003C\u002Fspan> (!m) {\n    r.\u003Cspan class=\"hljs-title function_\">warn\u003C\u002Fspan>(\u003Cspan class=\"hljs-string\">`blog_redirect : no match for \u003Cspan class=\"hljs-subst\">${uri}\u003C\u002Fspan>`\u003C\u002Fspan>)\n\n    \u003Cspan class=\"hljs-comment\">\u002F\u002F safe default to avoid empty Location on 3xx\u003C\u002Fspan>\n    \u003Cspan class=\"hljs-keyword\">return\u003C\u002Fspan> \u003Cspan class=\"hljs-string\">&quot;\u002Fblog&quot;\u003C\u002Fspan>\n  }\n\n  \u003Cspan class=\"hljs-comment\">\u002F\u002F &quot;&quot; or &quot;\u002Ftelegram&quot;\u003C\u002Fspan>\n  \u003Cspan class=\"hljs-keyword\">const\u003C\u002Fspan> sub = m[\u003Cspan class=\"hljs-number\">1\u003C\u002Fspan>] || \u003Cspan class=\"hljs-string\">&quot;&quot;\u003C\u002Fspan>\n  \u003Cspan class=\"hljs-comment\">\u002F\u002F &quot;MM&quot; or undefined\u003C\u002Fspan>\n  \u003Cspan class=\"hljs-keyword\">const\u003C\u002Fspan> mmS = m[\u003Cspan class=\"hljs-number\">3\u003C\u002Fspan>]\n  \u003Cspan class=\"hljs-comment\">\u002F\u002F &quot;DD&quot; or undefined\u003C\u002Fspan>\n  \u003Cspan class=\"hljs-keyword\">const\u003C\u002Fspan> ddS = m[\u003Cspan class=\"hljs-number\">4\u003C\u002Fspan>]\n  \u003Cspan class=\"hljs-keyword\">const\u003C\u002Fspan> base = \u003Cspan class=\"hljs-string\">`\u002Fblog\u003Cspan class=\"hljs-subst\">${sub}\u003C\u002Fspan>`\u003C\u002Fspan>\n\n  \u003Cspan class=\"hljs-keyword\">if\u003C\u002Fspan> (ddS) {\n    \u003Cspan class=\"hljs-comment\">\u002F\u002F \u002FYYYY\u002FMM\u002FDD -&gt; ?search=at:YYYY-MM-DD\u003C\u002Fspan>\n    \u003Cspan class=\"hljs-keyword\">return\u003C\u002Fspan> \u003Cspan class=\"hljs-string\">`\u003Cspan class=\"hljs-subst\">${base}\u003C\u002Fspan>?search=at:\u003Cspan class=\"hljs-subst\">${m[\u003Cspan class=\"hljs-number\">2\u003C\u002Fspan>]}\u003C\u002Fspan>-\u003Cspan class=\"hljs-subst\">${mmS}\u003C\u002Fspan>-\u003Cspan class=\"hljs-subst\">${ddS}\u003C\u002Fspan>`\u003C\u002Fspan>\n  }\n\n  \u003Cspan class=\"hljs-keyword\">if\u003C\u002Fspan> (mmS) {\n    \u003Cspan class=\"hljs-comment\">\u002F\u002F \u002FYYYY\u002FMM -&gt; ?search=at:YYYY-MM\u003C\u002Fspan>\n    \u003Cspan class=\"hljs-keyword\">return\u003C\u002Fspan> \u003Cspan class=\"hljs-string\">`\u003Cspan class=\"hljs-subst\">${base}\u003C\u002Fspan>?search=at:\u003Cspan class=\"hljs-subst\">${m[\u003Cspan class=\"hljs-number\">2\u003C\u002Fspan>]}\u003C\u002Fspan>-\u003Cspan class=\"hljs-subst\">${mmS}\u003C\u002Fspan>`\u003C\u002Fspan>\n  }\n\n  \u003Cspan class=\"hljs-comment\">\u002F\u002F \u002FYYYY -&gt; ?search=at:YYYY\u003C\u002Fspan>\n  \u003Cspan class=\"hljs-keyword\">return\u003C\u002Fspan> \u003Cspan class=\"hljs-string\">`\u003Cspan class=\"hljs-subst\">${base}\u003C\u002Fspan>?search=at:\u003Cspan class=\"hljs-subst\">${m[\u003Cspan class=\"hljs-number\">2\u003C\u002Fspan>]}\u003C\u002Fspan>`\u003C\u002Fspan>\n}\n\n\u003Cspan class=\"hljs-keyword\">export\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">default\u003C\u002Fspan> { blog_redirect }\n\u003C\u002Fcode>\u003C\u002Fpre>\n          \u003C\u002Fdiv>\n        \u003Cp>Finally, set the correct permissions \u003Cem>(assuming that the repo is at \u003Ccode class=\"hljs\">\u002Fhome\u002Fedm115\u002Fwebsite\u003C\u002Fcode> and that it is built)\u003C\u002Fem> :\u003C\u002Fp>\n\n          \u003Cdiv class='code-block'>\n            \u003Cdiv class='code-block-header'>\n              \u003Cspan class='code-block-lang'>zsh\u003C\u002Fspan>\n              \u003Cbutton class='copy-code-button' type='button'>\n                Copy\n              \u003C\u002Fbutton>\n            \u003C\u002Fdiv>\n            \u003Cpre>\u003Ccode class='hljs zsh'>\u003Cspan class=\"hljs-built_in\">sudo\u003C\u002Fspan> find \u002Fhome\u002Fedm115\u002Fwebsite\u002Fdist -\u003Cspan class=\"hljs-built_in\">type\u003C\u002Fspan> d -\u003Cspan class=\"hljs-built_in\">exec\u003C\u002Fspan> \u003Cspan class=\"hljs-built_in\">chmod\u003C\u002Fspan> 755 {} \\;\n\u003Cspan class=\"hljs-built_in\">sudo\u003C\u002Fspan> find \u002Fhome\u002Fedm115\u002Fwebsite\u002Fdist -\u003Cspan class=\"hljs-built_in\">type\u003C\u002Fspan> f -\u003Cspan class=\"hljs-built_in\">exec\u003C\u002Fspan> \u003Cspan class=\"hljs-built_in\">chmod\u003C\u002Fspan> 644 {} \\;\n\u003Cspan class=\"hljs-built_in\">sudo\u003C\u002Fspan> \u003Cspan class=\"hljs-built_in\">chmod\u003C\u002Fspan> -R 755 \u002Fhome\u002Fedm115\u002Fwebsite\u002Fdist\n\u003Cspan class=\"hljs-built_in\">sudo\u003C\u002Fspan> \u003Cspan class=\"hljs-built_in\">chmod\u003C\u002Fspan> -R 755 \u002Fhome\u002Fedm115\u002Fwebsite\n\u003C\u002Fcode>\u003C\u002Fpre>\n          \u003C\u002Fdiv>\n        \u003Cp>Test and restart :\u003C\u002Fp>\n\n          \u003Cdiv class='code-block'>\n            \u003Cdiv class='code-block-header'>\n              \u003Cspan class='code-block-lang'>zsh\u003C\u002Fspan>\n              \u003Cbutton class='copy-code-button' type='button'>\n                Copy\n              \u003C\u002Fbutton>\n            \u003C\u002Fdiv>\n            \u003Cpre>\u003Ccode class='hljs zsh'>\u003Cspan class=\"hljs-built_in\">sudo\u003C\u002Fspan> nginx -t\n\u003Cspan class=\"hljs-built_in\">sudo\u003C\u002Fspan> systemctl restart nginx\n\u003C\u002Fcode>\u003C\u002Fpre>\n          \u003C\u002Fdiv>\n        ",1779532541972]