diff --git a/SETUP.md b/SETUP.md index ff636ca..1324dae 100644 --- a/SETUP.md +++ b/SETUP.md @@ -3,9 +3,9 @@ ## Quick Start ```bash # Clone and initialize the blog repository -git clone https://git.argobox.com/KeyArgo/laforceit-blog.git -cd laforceit-blog -./scripts/init-blog-repo.sh +git clone https://gitea.argobox.com/InovinLabs/argobox.git # Updated URL +cd argobox # Updated directory name +# ./scripts/init-blog-repo.sh # This script might need review/removal depending on its purpose ``` ## What This Does diff --git a/astro.config.mjs b/astro.config.mjs index 6db0753..31864e2 100644 --- a/astro.config.mjs +++ b/astro.config.mjs @@ -3,19 +3,19 @@ import { defineConfig } from 'astro/config'; import mdx from '@astrojs/mdx'; import sitemap from '@astrojs/sitemap'; import tailwind from '@astrojs/tailwind'; -// import cloudflare from '@astrojs/cloudflare'; // Commented out for local development +import cloudflare from '@astrojs/cloudflare'; // Import cloudflare adapter // https://astro.build/config export default defineConfig({ - site: 'https://argobox.com', // Updated site URL for ArgoBox + site: 'https://argobox.com', // Keep original site URL output: 'static', - // adapter: cloudflare(), // Commented out for local development + adapter: cloudflare(), // Enable cloudflare adapter integrations: [ mdx(), sitemap(), tailwind(), ], - markdown: { + markdown: { // Add markdown config shikiConfig: { theme: 'one-dark-pro', wrap: true @@ -24,7 +24,7 @@ export default defineConfig({ rehypePlugins: [] }, compressHTML: false, // Disable HTML compression to avoid parsing errors - build: { - format: 'file', // Use 'file' instead of 'directory' format + build: { // Add build format + format: 'file', } }); \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 9359874..ab2764b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,22 +1,22 @@ { - "name": "laforceit-blog", + "name": "argobox-astro", "version": "0.0.1", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "laforceit-blog", + "name": "argobox-astro", "version": "0.0.1", "dependencies": { - "@astrojs/cloudflare": "latest", - "@astrojs/mdx": "latest", - "@astrojs/rss": "latest", - "@astrojs/sitemap": "latest", - "@astrojs/tailwind": "latest", - "astro": "latest", + "@astrojs/cloudflare": "12.5.0", + "@astrojs/mdx": "4.2.4", + "@astrojs/rss": "4.0.11", + "@astrojs/sitemap": "3.3.0", + "@astrojs/tailwind": "6.0.2", + "astro": "5.7.4", "nodemailer": "^6.10.1", "resend": "^4.4.1", - "tailwindcss": "^3.0.24" + "tailwindcss": "3.4.17" }, "devDependencies": { "@tailwindcss/typography": "^0.5.16" @@ -280,9 +280,9 @@ } }, "node_modules/@cloudflare/workerd-darwin-64": { - "version": "1.20250417.0", - "resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-64/-/workerd-darwin-64-1.20250417.0.tgz", - "integrity": "sha512-4Adfl92aKepjxb8e6af2d+xpD2sBOADgHqvkyXsFmoLb80weMEDDRGJi1p1m5q1M78/oVnGcpdmuRCAathanRg==", + "version": "1.20250424.0", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-64/-/workerd-darwin-64-1.20250424.0.tgz", + "integrity": "sha512-E+9tyQfwKwg7iz+vI50UeF9m9MhO6uCTnn6VPBTobhgi0rKcfmCteUGz6YJejG6ex9OIfFHg/tIcr1+ywGZtiA==", "cpu": [ "x64" ], @@ -296,9 +296,9 @@ } }, "node_modules/@cloudflare/workerd-darwin-arm64": { - "version": "1.20250417.0", - "resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-arm64/-/workerd-darwin-arm64-1.20250417.0.tgz", - "integrity": "sha512-dSlk18F4i3T1OTzFBxx3pKpXRMP6w2xZ26+oIV32BFWrCi/HxGzUd6gVA0q37oLGqITRt8xU693J4Gl1CwC/Ag==", + "version": "1.20250424.0", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-arm64/-/workerd-darwin-arm64-1.20250424.0.tgz", + "integrity": "sha512-5vReSs+Gx4vPNR3zoU3a7BVBoTEc7aoe2gGcaxSSQKMOvVkp3bo9poOGZbISodhYnCCRXltZcl8Vgyi0l/YZLA==", "cpu": [ "arm64" ], @@ -312,9 +312,9 @@ } }, "node_modules/@cloudflare/workerd-linux-64": { - "version": "1.20250417.0", - "resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-64/-/workerd-linux-64-1.20250417.0.tgz", - "integrity": "sha512-27MVzOa/lENcqewC2L9EcqstXW843UhjBMcwV1umDfsjwLyZOEv6Gtm/6j5r0L0gASvkRTam3fAmtPk/gt48TA==", + "version": "1.20250424.0", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-64/-/workerd-linux-64-1.20250424.0.tgz", + "integrity": "sha512-8kBNy7LpW/E4XKGrx/1Xql3Hfy8viDb+tFudu+sN/b6A2tNczNoOzDyNeWeWa99/zfyzncah1l0Wl2RBmVvY+Q==", "cpu": [ "x64" ], @@ -328,9 +328,9 @@ } }, "node_modules/@cloudflare/workerd-linux-arm64": { - "version": "1.20250417.0", - "resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-arm64/-/workerd-linux-arm64-1.20250417.0.tgz", - "integrity": "sha512-34qBk0htAXmUneOTQxW6/g6pjNVR91r0vJzz2FID84cAIOYVl4hZLijkjmVl+MMDU6boXUs+yDwhItdg06YvAg==", + "version": "1.20250424.0", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-arm64/-/workerd-linux-arm64-1.20250424.0.tgz", + "integrity": "sha512-R4wLZNobQo5K96e3BEaTwCbZhyspeoW81k/yrkSRseLpSoIpLNguw6ckk5sGCjUkXEZQyu9TG6PzdYqlQo70gw==", "cpu": [ "arm64" ], @@ -344,9 +344,9 @@ } }, "node_modules/@cloudflare/workerd-windows-64": { - "version": "1.20250417.0", - "resolved": "https://registry.npmjs.org/@cloudflare/workerd-windows-64/-/workerd-windows-64-1.20250417.0.tgz", - "integrity": "sha512-PDwATFioff+geVHfgTzSWsxgwjgotrdXStb0EL0lMyMT5zNmHArAnOx83CbDtud63Uv9rVX1BAfPP4tyD1O+5A==", + "version": "1.20250424.0", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-windows-64/-/workerd-windows-64-1.20250424.0.tgz", + "integrity": "sha512-uwzZhNaKjJKq6NGFPd0hQWecpf5OTZCrlWKQZm4kkufZ7uIzkn5t3kOjh/J3L9puM/GvIPxCiDUE2aG66P6YxA==", "cpu": [ "x64" ], @@ -360,9 +360,9 @@ } }, "node_modules/@cloudflare/workers-types": { - "version": "4.20250423.0", - "resolved": "https://registry.npmjs.org/@cloudflare/workers-types/-/workers-types-4.20250423.0.tgz", - "integrity": "sha512-uzy7fvgYIs9YCEaPScC+RnZvd+yJJCqLCEe/n/6p2PZTxWbDmiZjtJQiP5Zx6G0p64ZD/0ZRmtALfDZDNYBDHg==", + "version": "4.20250428.0", + "resolved": "https://registry.npmjs.org/@cloudflare/workers-types/-/workers-types-4.20250428.0.tgz", + "integrity": "sha512-r/K1xuR+lW6SeGKRloVdR+BnK+9shBQci717070EBB2VLbcrZCCh0eo6NweLFa1rD8use5rE5JTVDZ/mXqMeNg==", "license": "MIT OR Apache-2.0" }, "node_modules/@cspotcode/source-map-support": { @@ -1406,9 +1406,9 @@ "license": "MIT" }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.40.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.40.0.tgz", - "integrity": "sha512-+Fbls/diZ0RDerhE8kyC6hjADCXA1K4yVNlH0EYfd2XjyH0UGgzaQ8MlT0pCXAThfxv3QUAczHaL+qSv1E4/Cg==", + "version": "4.40.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.40.1.tgz", + "integrity": "sha512-kxz0YeeCrRUHz3zyqvd7n+TVRlNyTifBsmnmNPtk3hQURUyG9eAB+usz6DAwagMusjx/zb3AjvDUvhFGDAexGw==", "cpu": [ "arm" ], @@ -1419,9 +1419,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.40.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.40.0.tgz", - "integrity": "sha512-PPA6aEEsTPRz+/4xxAmaoWDqh67N7wFbgFUJGMnanCFs0TV99M0M8QhhaSCks+n6EbQoFvLQgYOGXxlMGQe/6w==", + "version": "4.40.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.40.1.tgz", + "integrity": "sha512-PPkxTOisoNC6TpnDKatjKkjRMsdaWIhyuMkA4UsBXT9WEZY4uHezBTjs6Vl4PbqQQeu6oION1w2voYZv9yquCw==", "cpu": [ "arm64" ], @@ -1432,9 +1432,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.40.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.40.0.tgz", - "integrity": "sha512-GwYOcOakYHdfnjjKwqpTGgn5a6cUX7+Ra2HeNj/GdXvO2VJOOXCiYYlRFU4CubFM67EhbmzLOmACKEfvp3J1kQ==", + "version": "4.40.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.40.1.tgz", + "integrity": "sha512-VWXGISWFY18v/0JyNUy4A46KCFCb9NVsH+1100XP31lud+TzlezBbz24CYzbnA4x6w4hx+NYCXDfnvDVO6lcAA==", "cpu": [ "arm64" ], @@ -1445,9 +1445,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.40.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.40.0.tgz", - "integrity": "sha512-CoLEGJ+2eheqD9KBSxmma6ld01czS52Iw0e2qMZNpPDlf7Z9mj8xmMemxEucinev4LgHalDPczMyxzbq+Q+EtA==", + "version": "4.40.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.40.1.tgz", + "integrity": "sha512-nIwkXafAI1/QCS7pxSpv/ZtFW6TXcNUEHAIA9EIyw5OzxJZQ1YDrX+CL6JAIQgZ33CInl1R6mHet9Y/UZTg2Bw==", "cpu": [ "x64" ], @@ -1458,9 +1458,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.40.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.40.0.tgz", - "integrity": "sha512-r7yGiS4HN/kibvESzmrOB/PxKMhPTlz+FcGvoUIKYoTyGd5toHp48g1uZy1o1xQvybwwpqpe010JrcGG2s5nkg==", + "version": "4.40.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.40.1.tgz", + "integrity": "sha512-BdrLJ2mHTrIYdaS2I99mriyJfGGenSaP+UwGi1kB9BLOCu9SR8ZpbkmmalKIALnRw24kM7qCN0IOm6L0S44iWw==", "cpu": [ "arm64" ], @@ -1471,9 +1471,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.40.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.40.0.tgz", - "integrity": "sha512-mVDxzlf0oLzV3oZOr0SMJ0lSDd3xC4CmnWJ8Val8isp9jRGl5Dq//LLDSPFrasS7pSm6m5xAcKaw3sHXhBjoRw==", + "version": "4.40.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.40.1.tgz", + "integrity": "sha512-VXeo/puqvCG8JBPNZXZf5Dqq7BzElNJzHRRw3vjBE27WujdzuOPecDPc/+1DcdcTptNBep3861jNq0mYkT8Z6Q==", "cpu": [ "x64" ], @@ -1484,9 +1484,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.40.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.40.0.tgz", - "integrity": "sha512-y/qUMOpJxBMy8xCXD++jeu8t7kzjlOCkoxxajL58G62PJGBZVl/Gwpm7JK9+YvlB701rcQTzjUZ1JgUoPTnoQA==", + "version": "4.40.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.40.1.tgz", + "integrity": "sha512-ehSKrewwsESPt1TgSE/na9nIhWCosfGSFqv7vwEtjyAqZcvbGIg4JAcV7ZEh2tfj/IlfBeZjgOXm35iOOjadcg==", "cpu": [ "arm" ], @@ -1497,9 +1497,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.40.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.40.0.tgz", - "integrity": "sha512-GoCsPibtVdJFPv/BOIvBKO/XmwZLwaNWdyD8TKlXuqp0veo2sHE+A/vpMQ5iSArRUz/uaoj4h5S6Pn0+PdhRjg==", + "version": "4.40.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.40.1.tgz", + "integrity": "sha512-m39iO/aaurh5FVIu/F4/Zsl8xppd76S4qoID8E+dSRQvTyZTOI2gVk3T4oqzfq1PtcvOfAVlwLMK3KRQMaR8lg==", "cpu": [ "arm" ], @@ -1510,9 +1510,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.40.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.40.0.tgz", - "integrity": "sha512-L5ZLphTjjAD9leJzSLI7rr8fNqJMlGDKlazW2tX4IUF9P7R5TMQPElpH82Q7eNIDQnQlAyiNVfRPfP2vM5Avvg==", + "version": "4.40.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.40.1.tgz", + "integrity": "sha512-Y+GHnGaku4aVLSgrT0uWe2o2Rq8te9hi+MwqGF9r9ORgXhmHK5Q71N757u0F8yU1OIwUIFy6YiJtKjtyktk5hg==", "cpu": [ "arm64" ], @@ -1523,9 +1523,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.40.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.40.0.tgz", - "integrity": "sha512-ATZvCRGCDtv1Y4gpDIXsS+wfFeFuLwVxyUBSLawjgXK2tRE6fnsQEkE4csQQYWlBlsFztRzCnBvWVfcae/1qxQ==", + "version": "4.40.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.40.1.tgz", + "integrity": "sha512-jEwjn3jCA+tQGswK3aEWcD09/7M5wGwc6+flhva7dsQNRZZTe30vkalgIzV4tjkopsTS9Jd7Y1Bsj6a4lzz8gQ==", "cpu": [ "arm64" ], @@ -1536,9 +1536,9 @@ ] }, "node_modules/@rollup/rollup-linux-loongarch64-gnu": { - "version": "4.40.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.40.0.tgz", - "integrity": "sha512-wG9e2XtIhd++QugU5MD9i7OnpaVb08ji3P1y/hNbxrQ3sYEelKJOq1UJ5dXczeo6Hj2rfDEL5GdtkMSVLa/AOg==", + "version": "4.40.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.40.1.tgz", + "integrity": "sha512-ySyWikVhNzv+BV/IDCsrraOAZ3UaC8SZB67FZlqVwXwnFhPihOso9rPOxzZbjp81suB1O2Topw+6Ug3JNegejQ==", "cpu": [ "loong64" ], @@ -1549,9 +1549,9 @@ ] }, "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.40.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.40.0.tgz", - "integrity": "sha512-vgXfWmj0f3jAUvC7TZSU/m/cOE558ILWDzS7jBhiCAFpY2WEBn5jqgbqvmzlMjtp8KlLcBlXVD2mkTSEQE6Ixw==", + "version": "4.40.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.40.1.tgz", + "integrity": "sha512-BvvA64QxZlh7WZWqDPPdt0GH4bznuL6uOO1pmgPnnv86rpUpc8ZxgZwcEgXvo02GRIZX1hQ0j0pAnhwkhwPqWg==", "cpu": [ "ppc64" ], @@ -1562,9 +1562,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.40.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.40.0.tgz", - "integrity": "sha512-uJkYTugqtPZBS3Z136arevt/FsKTF/J9dEMTX/cwR7lsAW4bShzI2R0pJVw+hcBTWF4dxVckYh72Hk3/hWNKvA==", + "version": "4.40.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.40.1.tgz", + "integrity": "sha512-EQSP+8+1VuSulm9RKSMKitTav89fKbHymTf25n5+Yr6gAPZxYWpj3DzAsQqoaHAk9YX2lwEyAf9S4W8F4l3VBQ==", "cpu": [ "riscv64" ], @@ -1575,9 +1575,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.40.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.40.0.tgz", - "integrity": "sha512-rKmSj6EXQRnhSkE22+WvrqOqRtk733x3p5sWpZilhmjnkHkpeCgWsFFo0dGnUGeA+OZjRl3+VYq+HyCOEuwcxQ==", + "version": "4.40.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.40.1.tgz", + "integrity": "sha512-n/vQ4xRZXKuIpqukkMXZt9RWdl+2zgGNx7Uda8NtmLJ06NL8jiHxUawbwC+hdSq1rrw/9CghCpEONor+l1e2gA==", "cpu": [ "riscv64" ], @@ -1588,9 +1588,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.40.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.40.0.tgz", - "integrity": "sha512-SpnYlAfKPOoVsQqmTFJ0usx0z84bzGOS9anAC0AZ3rdSo3snecihbhFTlJZ8XMwzqAcodjFU4+/SM311dqE5Sw==", + "version": "4.40.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.40.1.tgz", + "integrity": "sha512-h8d28xzYb98fMQKUz0w2fMc1XuGzLLjdyxVIbhbil4ELfk5/orZlSTpF/xdI9C8K0I8lCkq+1En2RJsawZekkg==", "cpu": [ "s390x" ], @@ -1601,9 +1601,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.40.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.40.0.tgz", - "integrity": "sha512-RcDGMtqF9EFN8i2RYN2W+64CdHruJ5rPqrlYw+cgM3uOVPSsnAQps7cpjXe9be/yDp8UC7VLoCoKC8J3Kn2FkQ==", + "version": "4.40.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.40.1.tgz", + "integrity": "sha512-XiK5z70PEFEFqcNj3/zRSz/qX4bp4QIraTy9QjwJAb/Z8GM7kVUsD0Uk8maIPeTyPCP03ChdI+VVmJriKYbRHQ==", "cpu": [ "x64" ], @@ -1614,9 +1614,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.40.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.40.0.tgz", - "integrity": "sha512-HZvjpiUmSNx5zFgwtQAV1GaGazT2RWvqeDi0hV+AtC8unqqDSsaFjPxfsO6qPtKRRg25SisACWnJ37Yio8ttaw==", + "version": "4.40.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.40.1.tgz", + "integrity": "sha512-2BRORitq5rQ4Da9blVovzNCMaUlyKrzMSvkVR0D4qPuOy/+pMCrh1d7o01RATwVy+6Fa1WBw+da7QPeLWU/1mQ==", "cpu": [ "x64" ], @@ -1627,9 +1627,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.40.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.40.0.tgz", - "integrity": "sha512-UtZQQI5k/b8d7d3i9AZmA/t+Q4tk3hOC0tMOMSq2GlMYOfxbesxG4mJSeDp0EHs30N9bsfwUvs3zF4v/RzOeTQ==", + "version": "4.40.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.40.1.tgz", + "integrity": "sha512-b2bcNm9Kbde03H+q+Jjw9tSfhYkzrDUf2d5MAd1bOJuVplXvFhWz7tRtWvD8/ORZi7qSCy0idW6tf2HgxSXQSg==", "cpu": [ "arm64" ], @@ -1640,9 +1640,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.40.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.40.0.tgz", - "integrity": "sha512-+m03kvI2f5syIqHXCZLPVYplP8pQch9JHyXKZ3AGMKlg8dCyr2PKHjwRLiW53LTrN/Nc3EqHOKxUxzoSPdKddA==", + "version": "4.40.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.40.1.tgz", + "integrity": "sha512-DfcogW8N7Zg7llVEfpqWMZcaErKfsj9VvmfSyRjCyo4BI3wPEfrzTtJkZG6gKP/Z92wFm6rz2aDO7/JfiR/whA==", "cpu": [ "ia32" ], @@ -1653,9 +1653,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.40.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.40.0.tgz", - "integrity": "sha512-lpPE1cLfP5oPzVjKMx10pgBmKELQnFJXHgvtHCtuJWOv8MxqdEIMNtgHgBFf7Ea2/7EuVwa9fodWUfXAlXZLZQ==", + "version": "4.40.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.40.1.tgz", + "integrity": "sha512-ECyOuDeH3C1I8jH2MK1RtBJW+YPMvSfT0a5NN0nHfQYnDSJ6tUiZH3gzwVP5/Kfh/+Tt7tpWVF9LXNTnhTJ3kA==", "cpu": [ "x64" ], @@ -1834,9 +1834,9 @@ } }, "node_modules/@types/node": { - "version": "22.14.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.14.1.tgz", - "integrity": "sha512-u0HuPQwe/dHrItgHHpmw3N2fYCR6x4ivMNbPHRkBVP4CvN+kiRrKHWk3i8tXiO/joPwXLMYvF9TTF0eqgHIuOw==", + "version": "22.15.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.15.3.tgz", + "integrity": "sha512-lX7HFZeHf4QG/J7tBZqrCAXwz9J5RD56Y6MpP0eJkka8p+K0RY/yBTW7CYFJ4VGCclxqOLKmiGP5juQc6MKgcw==", "license": "MIT", "dependencies": { "undici-types": "~6.21.0" @@ -2890,9 +2890,9 @@ "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.5.140", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.140.tgz", - "integrity": "sha512-o82Rj+ONp4Ip7Cl1r7lrqx/pXhbp/lh9DpKcMNscFJdh8ebyRofnc7Sh01B4jx403RI0oqTBvlZ7OBIZLMr2+Q==", + "version": "1.5.143", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.143.tgz", + "integrity": "sha512-QqklJMOFBMqe46k8iIOwA9l2hz57V2OKMmP5eSWcUvwx+mASAsbU+wkF1pHjn9ZVSBPrsYWr4/W/95y5SwYg2g==", "license": "ISC" }, "node_modules/emoji-regex": { @@ -2901,12 +2901,6 @@ "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", "license": "MIT" }, - "node_modules/emoji-regex-xs": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex-xs/-/emoji-regex-xs-1.0.0.tgz", - "integrity": "sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg==", - "license": "MIT" - }, "node_modules/entities": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.0.tgz", @@ -3380,19 +3374,19 @@ "license": "BSD-2-Clause" }, "node_modules/h3": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/h3/-/h3-1.15.1.tgz", - "integrity": "sha512-+ORaOBttdUm1E2Uu/obAyCguiI7MbBvsLTndc3gyK3zU+SYLoZXlyCP9Xgy0gikkGufFLTZXCXD6+4BsufnmHA==", + "version": "1.15.3", + "resolved": "https://registry.npmjs.org/h3/-/h3-1.15.3.tgz", + "integrity": "sha512-z6GknHqyX0h9aQaTx22VZDf6QyZn+0Nh+Ym8O/u0SGSkyF5cuTJYKlc8MkzW3Nzf9LE1ivcpmYC3FUGpywhuUQ==", "license": "MIT", "dependencies": { "cookie-es": "^1.2.2", - "crossws": "^0.3.3", + "crossws": "^0.3.4", "defu": "^6.1.4", - "destr": "^2.0.3", + "destr": "^2.0.5", "iron-webcrypto": "^1.2.1", "node-mock-http": "^1.0.0", "radix3": "^1.1.2", - "ufo": "^1.5.4", + "ufo": "^1.6.1", "uncrypto": "^0.1.3" } }, @@ -5150,9 +5144,9 @@ } }, "node_modules/miniflare": { - "version": "4.20250417.0", - "resolved": "https://registry.npmjs.org/miniflare/-/miniflare-4.20250417.0.tgz", - "integrity": "sha512-bROKLQKr4CoS93tnGuw5e08VaNwM3VowTL3Z2Cps1HzY6a4Bq8uNtggQ7WogriMq77jcHn6kbz64bvWyF//Jkw==", + "version": "4.20250424.1", + "resolved": "https://registry.npmjs.org/miniflare/-/miniflare-4.20250424.1.tgz", + "integrity": "sha512-CqBzp8DPO76DLRBSx5/1GM200B5SbfpkNA9n/IxFGY7n6YNc1ypPYy/J0tQqj7vOA62jyD/3kPVbUXxbPKe5SQ==", "license": "MIT", "dependencies": { "@cspotcode/source-map-support": "0.8.1", @@ -5162,7 +5156,7 @@ "glob-to-regexp": "0.4.1", "stoppable": "1.1.0", "undici": "^5.28.5", - "workerd": "1.20250417.0", + "workerd": "1.20250424.0", "ws": "8.18.0", "youch": "3.3.4", "zod": "3.22.3" @@ -5395,19 +5389,18 @@ "license": "MIT" }, "node_modules/oniguruma-parser": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/oniguruma-parser/-/oniguruma-parser-0.11.2.tgz", - "integrity": "sha512-F7Ld4oDZJCI5/wCZ8AOffQbqjSzIRpKH7I/iuSs1SkhZeCj0wS6PMZ4W6VA16TWHrAo0Y9bBKEJOe7tvwcTXnw==", + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/oniguruma-parser/-/oniguruma-parser-0.12.0.tgz", + "integrity": "sha512-fD9o5ebCmEAA9dLysajdQvuKzLL7cj+w7DQjuO3Cb6IwafENfx6iL+RGkmyW82pVRsvgzixsWinHvgxTMJvdIA==", "license": "MIT" }, "node_modules/oniguruma-to-es": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/oniguruma-to-es/-/oniguruma-to-es-4.2.0.tgz", - "integrity": "sha512-MDPs6KSOLS0tKQ7joqg44dRIRZUyotfTy0r+7oEEs6VwWWP0+E2PPDYWMFN0aqOjRyWHBYq7RfKw9GQk2S2z5g==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/oniguruma-to-es/-/oniguruma-to-es-4.3.1.tgz", + "integrity": "sha512-VtX1kepWO+7HG7IWV5v72JhiqofK7XsiHmtgnvurnNOTdIvE5mrdWYtsOrQyrXCv1L2Ckm08hywp+MFO7rC4Ug==", "license": "MIT", "dependencies": { - "emoji-regex-xs": "^1.0.0", - "oniguruma-parser": "^0.11.0", + "oniguruma-parser": "^0.12.0", "regex": "^6.0.1", "regex-recursion": "^6.0.2" } @@ -6314,9 +6307,9 @@ } }, "node_modules/rollup": { - "version": "4.40.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.40.0.tgz", - "integrity": "sha512-Noe455xmA96nnqH5piFtLobsGbCij7Tu+tb3c1vYjNbTkfzGqXqQXG3wJaYXkRZuQ0vEYN4bhwg7QnIrqB5B+w==", + "version": "4.40.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.40.1.tgz", + "integrity": "sha512-C5VvvgCCyfyotVITIAv+4efVytl5F7wt+/I2i9q9GZcEXW9BP52YYOXC58igUi+LFZVHukErIIqQSWwv/M3WRw==", "license": "MIT", "dependencies": { "@types/estree": "1.0.7" @@ -6329,26 +6322,26 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.40.0", - "@rollup/rollup-android-arm64": "4.40.0", - "@rollup/rollup-darwin-arm64": "4.40.0", - "@rollup/rollup-darwin-x64": "4.40.0", - "@rollup/rollup-freebsd-arm64": "4.40.0", - "@rollup/rollup-freebsd-x64": "4.40.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.40.0", - "@rollup/rollup-linux-arm-musleabihf": "4.40.0", - "@rollup/rollup-linux-arm64-gnu": "4.40.0", - "@rollup/rollup-linux-arm64-musl": "4.40.0", - "@rollup/rollup-linux-loongarch64-gnu": "4.40.0", - "@rollup/rollup-linux-powerpc64le-gnu": "4.40.0", - "@rollup/rollup-linux-riscv64-gnu": "4.40.0", - "@rollup/rollup-linux-riscv64-musl": "4.40.0", - "@rollup/rollup-linux-s390x-gnu": "4.40.0", - "@rollup/rollup-linux-x64-gnu": "4.40.0", - "@rollup/rollup-linux-x64-musl": "4.40.0", - "@rollup/rollup-win32-arm64-msvc": "4.40.0", - "@rollup/rollup-win32-ia32-msvc": "4.40.0", - "@rollup/rollup-win32-x64-msvc": "4.40.0", + "@rollup/rollup-android-arm-eabi": "4.40.1", + "@rollup/rollup-android-arm64": "4.40.1", + "@rollup/rollup-darwin-arm64": "4.40.1", + "@rollup/rollup-darwin-x64": "4.40.1", + "@rollup/rollup-freebsd-arm64": "4.40.1", + "@rollup/rollup-freebsd-x64": "4.40.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.40.1", + "@rollup/rollup-linux-arm-musleabihf": "4.40.1", + "@rollup/rollup-linux-arm64-gnu": "4.40.1", + "@rollup/rollup-linux-arm64-musl": "4.40.1", + "@rollup/rollup-linux-loongarch64-gnu": "4.40.1", + "@rollup/rollup-linux-powerpc64le-gnu": "4.40.1", + "@rollup/rollup-linux-riscv64-gnu": "4.40.1", + "@rollup/rollup-linux-riscv64-musl": "4.40.1", + "@rollup/rollup-linux-s390x-gnu": "4.40.1", + "@rollup/rollup-linux-x64-gnu": "4.40.1", + "@rollup/rollup-linux-x64-musl": "4.40.1", + "@rollup/rollup-win32-arm64-msvc": "4.40.1", + "@rollup/rollup-win32-ia32-msvc": "4.40.1", + "@rollup/rollup-win32-x64-msvc": "4.40.1", "fsevents": "~2.3.2" } }, @@ -6543,9 +6536,9 @@ "license": "MIT" }, "node_modules/smol-toml": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/smol-toml/-/smol-toml-1.3.3.tgz", - "integrity": "sha512-KMVLNWu490KlNfD0lbfDBUktJIEaZRBj1eeK0SMfdpO/rfyARIzlnPVI1Ge4l0vtSJmQUAiGKxMyLGrCT38iyA==", + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/smol-toml/-/smol-toml-1.3.4.tgz", + "integrity": "sha512-UOPtVuYkzYGee0Bd2Szz8d2G3RfMfJ2t3qVdZUAozZyAk+a0Sxa+QKix0YCwjL/A1RR0ar44nCxaoN9FxdJGwA==", "license": "BSD-3-Clause", "engines": { "node": ">= 18" @@ -6952,9 +6945,9 @@ "license": "0BSD" }, "node_modules/type-fest": { - "version": "4.40.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.40.0.tgz", - "integrity": "sha512-ABHZ2/tS2JkvH1PEjxFDTUWC8dB5OsIGZP4IFLhR293GqT5Y5qB1WwL2kMPYhQW9DVgVD8Hd7I8gjwPIf5GFkw==", + "version": "4.40.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.40.1.tgz", + "integrity": "sha512-9YvLNnORDpI+vghLU/Nf+zSv0kL47KbVJ1o3sKgoTefl6i+zebxbiDQWoe/oWWqPhIgQdRZRT1KA9sCPL810SA==", "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=16" @@ -7212,19 +7205,19 @@ } }, "node_modules/unstorage": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/unstorage/-/unstorage-1.15.0.tgz", - "integrity": "sha512-m40eHdGY/gA6xAPqo8eaxqXgBuzQTlAKfmB1iF7oCKXE1HfwHwzDJBywK+qQGn52dta+bPlZluPF7++yR3p/bg==", + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/unstorage/-/unstorage-1.16.0.tgz", + "integrity": "sha512-WQ37/H5A7LcRPWfYOrDa1Ys02xAbpPJq6q5GkO88FBXVSQzHd7+BjEwfRqyaSWCv9MbsJy058GWjjPjcJ16GGA==", "license": "MIT", "dependencies": { "anymatch": "^3.1.3", "chokidar": "^4.0.3", - "destr": "^2.0.3", - "h3": "^1.15.0", + "destr": "^2.0.5", + "h3": "^1.15.2", "lru-cache": "^10.4.3", "node-fetch-native": "^1.6.6", "ofetch": "^1.4.1", - "ufo": "^1.5.4" + "ufo": "^1.6.1" }, "peerDependencies": { "@azure/app-configuration": "^1.8.0", @@ -7233,7 +7226,7 @@ "@azure/identity": "^4.6.0", "@azure/keyvault-secrets": "^4.9.0", "@azure/storage-blob": "^12.26.0", - "@capacitor/preferences": "^6.0.3", + "@capacitor/preferences": "^6.0.3 || ^7.0.0", "@deno/kv": ">=0.9.0", "@netlify/blobs": "^6.5.0 || ^7.0.0 || ^8.1.0", "@planetscale/database": "^1.19.0", @@ -7410,17 +7403,17 @@ } }, "node_modules/vite": { - "version": "6.3.2", - "resolved": "https://registry.npmjs.org/vite/-/vite-6.3.2.tgz", - "integrity": "sha512-ZSvGOXKGceizRQIZSz7TGJ0pS3QLlVY/9hwxVh17W3re67je1RKYzFHivZ/t0tubU78Vkyb9WnHPENSBCzbckg==", + "version": "6.3.3", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.3.3.tgz", + "integrity": "sha512-5nXH+QsELbFKhsEfWLkHrvgRpTdGJzqOZ+utSdmPTvwHmvU6ITTm3xx+mRusihkcI8GeC7lCDyn3kDtiki9scw==", "license": "MIT", "dependencies": { "esbuild": "^0.25.0", - "fdir": "^6.4.3", + "fdir": "^6.4.4", "picomatch": "^4.0.2", "postcss": "^8.5.3", "rollup": "^4.34.9", - "tinyglobby": "^0.2.12" + "tinyglobby": "^0.2.13" }, "bin": { "vite": "bin/vite.js" @@ -7567,9 +7560,9 @@ } }, "node_modules/workerd": { - "version": "1.20250417.0", - "resolved": "https://registry.npmjs.org/workerd/-/workerd-1.20250417.0.tgz", - "integrity": "sha512-naz6oJiVODd3/Lkp9l3vtc56HKOOvx+AWDvEsTa5eSfi5SI9V0HYpLYSPblAwrfazbQ4ff1Vl3jkTl/5JxqCAA==", + "version": "1.20250424.0", + "resolved": "https://registry.npmjs.org/workerd/-/workerd-1.20250424.0.tgz", + "integrity": "sha512-3Nb69De9pfC21vLMW8Xpp5JXEPYd7e8MGcaEfo/6z1jOX9CFJVaqrAXr8RwYxDgN528ZahHqM51YQEcVlOu1Cw==", "hasInstallScript": true, "license": "Apache-2.0", "bin": { @@ -7579,27 +7572,27 @@ "node": ">=16" }, "optionalDependencies": { - "@cloudflare/workerd-darwin-64": "1.20250417.0", - "@cloudflare/workerd-darwin-arm64": "1.20250417.0", - "@cloudflare/workerd-linux-64": "1.20250417.0", - "@cloudflare/workerd-linux-arm64": "1.20250417.0", - "@cloudflare/workerd-windows-64": "1.20250417.0" + "@cloudflare/workerd-darwin-64": "1.20250424.0", + "@cloudflare/workerd-darwin-arm64": "1.20250424.0", + "@cloudflare/workerd-linux-64": "1.20250424.0", + "@cloudflare/workerd-linux-arm64": "1.20250424.0", + "@cloudflare/workerd-windows-64": "1.20250424.0" } }, "node_modules/wrangler": { - "version": "4.12.1", - "resolved": "https://registry.npmjs.org/wrangler/-/wrangler-4.12.1.tgz", - "integrity": "sha512-jYrz8y2ffhsRqvQLO2dXFi9HLvPUJk3jn7U71GWfBBCHm0I6r2ik7Vs9ajpRcTGlbNw1RY0uIHVJBVR/7bEN5A==", + "version": "4.13.2", + "resolved": "https://registry.npmjs.org/wrangler/-/wrangler-4.13.2.tgz", + "integrity": "sha512-CryA3MRzjNceFVef78ymqhxXrIYQoYKQIPITvvd/Yn3SX4UAADZOOrztatNcgRAyXssjdGH4JRw7fKoSnOaOog==", "license": "MIT OR Apache-2.0", "dependencies": { "@cloudflare/kv-asset-handler": "0.4.0", "@cloudflare/unenv-preset": "2.3.1", "blake3-wasm": "2.1.5", "esbuild": "0.25.2", - "miniflare": "4.20250417.0", + "miniflare": "4.20250424.1", "path-to-regexp": "6.3.0", "unenv": "2.0.0-rc.15", - "workerd": "1.20250417.0" + "workerd": "1.20250424.0" }, "bin": { "wrangler": "bin/wrangler.js", @@ -7613,7 +7606,7 @@ "sharp": "^0.33.5" }, "peerDependencies": { - "@cloudflare/workers-types": "^4.20250417.0" + "@cloudflare/workers-types": "^4.20250424.0" }, "peerDependenciesMeta": { "@cloudflare/workers-types": { diff --git a/package.json b/package.json index 47e470b..7b37c26 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,5 @@ { - "name": "laforceit-blog", + "name": "argobox-astro", "type": "module", "version": "0.0.1", "scripts": { @@ -9,15 +9,15 @@ "astro": "astro" }, "dependencies": { - "@astrojs/cloudflare": "latest", - "@astrojs/mdx": "latest", - "@astrojs/rss": "latest", - "@astrojs/sitemap": "latest", - "@astrojs/tailwind": "latest", - "astro": "latest", + "@astrojs/cloudflare": "12.5.0", + "@astrojs/mdx": "4.2.4", + "@astrojs/rss": "4.0.11", + "@astrojs/sitemap": "3.3.0", + "@astrojs/tailwind": "6.0.2", + "astro": "5.7.4", "nodemailer": "^6.10.1", "resend": "^4.4.1", - "tailwindcss": "^3.0.24" + "tailwindcss": "3.4.17" }, "devDependencies": { "@tailwindcss/typography": "^0.5.16" diff --git a/public/android-chrome-192x192.png b/public/android-chrome-192x192.png new file mode 100644 index 0000000..efeec45 Binary files /dev/null and b/public/android-chrome-192x192.png differ diff --git a/public/android-chrome-512x512.png b/public/android-chrome-512x512.png new file mode 100644 index 0000000..c22f7b4 Binary files /dev/null and b/public/android-chrome-512x512.png differ diff --git a/public/apple-touch-icon.png b/public/apple-touch-icon.png new file mode 100644 index 0000000..41de665 Binary files /dev/null and b/public/apple-touch-icon.png differ diff --git a/public/favicon-16x16.png b/public/favicon-16x16.png new file mode 100644 index 0000000..9e3c703 Binary files /dev/null and b/public/favicon-16x16.png differ diff --git a/public/favicon-32x32.png b/public/favicon-32x32.png new file mode 100644 index 0000000..4048abb Binary files /dev/null and b/public/favicon-32x32.png differ diff --git a/public/favicon.ico b/public/favicon.ico new file mode 100644 index 0000000..35dac89 Binary files /dev/null and b/public/favicon.ico differ diff --git a/public/favicon.svg b/public/favicon.svg deleted file mode 100644 index f157bd1..0000000 --- a/public/favicon.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - diff --git a/public/images/posts/blog-cloudflare-tunnel.jpg b/public/images/posts/blog-cloudflare-tunnel.jpg new file mode 100644 index 0000000..67d127c Binary files /dev/null and b/public/images/posts/blog-cloudflare-tunnel.jpg differ diff --git a/public/images/posts/blog-default-hero.jpg b/public/images/posts/blog-default-hero.jpg deleted file mode 100644 index 385bb2a..0000000 --- a/public/images/posts/blog-default-hero.jpg +++ /dev/null @@ -1 +0,0 @@ -data:image/jpeg;base64,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 \ No newline at end of file diff --git a/public/images/posts/blog-digital-garden.jpg b/public/images/posts/blog-digital-garden.jpg new file mode 100644 index 0000000..5ca66f2 Binary files /dev/null and b/public/images/posts/blog-digital-garden.jpg differ diff --git a/public/images/posts/blog-filebrowser-setup.jpg b/public/images/posts/blog-filebrowser-setup.jpg new file mode 100644 index 0000000..3a8668b Binary files /dev/null and b/public/images/posts/blog-filebrowser-setup.jpg differ diff --git a/public/images/posts/blog-gitops-with-flux-cd.jpg b/public/images/posts/blog-gitops-with-flux-cd.jpg new file mode 100644 index 0000000..85db6f4 Binary files /dev/null and b/public/images/posts/blog-gitops-with-flux-cd.jpg differ diff --git a/public/images/posts/blog-home-lab-with-rancher.jpg b/public/images/posts/blog-home-lab-with-rancher.jpg new file mode 100644 index 0000000..265f709 Binary files /dev/null and b/public/images/posts/blog-home-lab-with-rancher.jpg differ diff --git a/public/images/posts/blog-infrastructure-as-code.jpg b/public/images/posts/blog-infrastructure-as-code.jpg new file mode 100644 index 0000000..9fe50f4 Binary files /dev/null and b/public/images/posts/blog-infrastructure-as-code.jpg differ diff --git a/public/images/posts/blog-prometheus-monitoring.jpg b/public/images/posts/blog-prometheus-monitoring.jpg new file mode 100644 index 0000000..ea35db8 Binary files /dev/null and b/public/images/posts/blog-prometheus-monitoring.jpg differ diff --git a/public/images/posts/blog-proxmox-setup.jpg b/public/images/posts/blog-proxmox-setup.jpg new file mode 100644 index 0000000..eb5b466 Binary files /dev/null and b/public/images/posts/blog-proxmox-setup.jpg differ diff --git a/public/images/posts/blog-quartz-digital-garden.jpg b/public/images/posts/blog-quartz-digital-garden.jpg new file mode 100644 index 0000000..d56d2a9 Binary files /dev/null and b/public/images/posts/blog-quartz-digital-garden.jpg differ diff --git a/public/images/posts/blog-self-hosted-git.jpg b/public/images/posts/blog-self-hosted-git.jpg new file mode 100644 index 0000000..1b0ef29 Binary files /dev/null and b/public/images/posts/blog-self-hosted-git.jpg differ diff --git a/public/images/posts/blog-setting-up-k3-cluster.jpg b/public/images/posts/blog-setting-up-k3-cluster.jpg new file mode 100644 index 0000000..54a8fdc Binary files /dev/null and b/public/images/posts/blog-setting-up-k3-cluster.jpg differ diff --git a/public/images/posts/blog-vs-code-server.jpg b/public/images/posts/blog-vs-code-server.jpg new file mode 100644 index 0000000..b2b8592 Binary files /dev/null and b/public/images/posts/blog-vs-code-server.jpg differ diff --git a/public/images/posts/cloudflare-tunnel-hero.png b/public/images/posts/cloudflare-tunnel-hero.png deleted file mode 100644 index 4f2872c..0000000 Binary files a/public/images/posts/cloudflare-tunnel-hero.png and /dev/null differ diff --git a/public/images/posts/config-cloudflare-tunnel.jpg b/public/images/posts/config-cloudflare-tunnel.jpg new file mode 100644 index 0000000..e6c58f1 Binary files /dev/null and b/public/images/posts/config-cloudflare-tunnel.jpg differ diff --git a/public/images/posts/config-gitops-pipline.jpg b/public/images/posts/config-gitops-pipline.jpg new file mode 100644 index 0000000..4b3693e Binary files /dev/null and b/public/images/posts/config-gitops-pipline.jpg differ diff --git a/public/images/posts/config-traefik.jpg b/public/images/posts/config-traefik.jpg new file mode 100644 index 0000000..b23e8a5 Binary files /dev/null and b/public/images/posts/config-traefik.jpg differ diff --git a/public/images/posts/guide-k3-installation.jpg b/public/images/posts/guide-k3-installation.jpg new file mode 100644 index 0000000..4296024 Binary files /dev/null and b/public/images/posts/guide-k3-installation.jpg differ diff --git a/public/images/posts/guide-k3s-cluster.jpg b/public/images/posts/guide-k3s-cluster.jpg new file mode 100644 index 0000000..dc978e4 Binary files /dev/null and b/public/images/posts/guide-k3s-cluster.jpg differ diff --git a/public/images/posts/k3installation.png b/public/images/posts/k3installation.png deleted file mode 100644 index 22e7c54..0000000 Binary files a/public/images/posts/k3installation.png and /dev/null differ diff --git a/public/images/posts/k3s-hero-image.jpg b/public/images/posts/k3s-hero-image.jpg deleted file mode 100644 index ca48a91..0000000 --- a/public/images/posts/k3s-hero-image.jpg +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - K3s Kubernetes - Lightweight Kubernetes for Edge and IoT - - - - - - \ No newline at end of file diff --git a/public/images/posts/prometheusk8.png b/public/images/posts/prometheusk8.png deleted file mode 100644 index d141834..0000000 Binary files a/public/images/posts/prometheusk8.png and /dev/null differ diff --git a/src/components/Footer.astro b/src/components/Footer.astro index dd209e8..92311ad 100644 --- a/src/components/Footer.astro +++ b/src/components/Footer.astro @@ -23,14 +23,15 @@ const categories = [ { name: 'Docker Compose', path: '/resources/docker-compose' }, { name: 'Configuration Files', path: '/resources/config-files' }, { name: 'Infrastructure Code', path: '/resources/iac' }, - { name: 'Tutorials', path: '/resources/tutorials' } + { name: 'Tutorials', path: '/resources/tutorials' }, + { name: 'All Resources', path: '/resources' } // Added Resources link ] }, { title: 'Projects', links: [ - { name: 'HomeLab Setup', url: 'https://argobox.com' }, - { name: 'Tech Stack', url: 'https://argobox.com/#services' }, + { name: 'HomeLab Setup', path: '/homelab' }, + { name: 'Tech Stack', path: '/tech-stack' }, // Updated Tech Stack link { name: 'Github Repos', path: '/projects/github' }, { name: 'Live Services', path: '/projects/services' }, { name: 'Obsidian Templates', path: '/projects/obsidian' } @@ -47,12 +48,12 @@ const socialLinks = [ }, { name: 'Twitter', - url: 'https://twitter.com/yourusername', + url: 'https://www.x.com/danlaforce', // Updated Twitter URL icon: '' }, { name: 'LinkedIn', - url: 'https://linkedin.com/in/yourusername', + url: 'https://www.linkedin.com/in/danlaforce', // Updated LinkedIn URL icon: '' }, { @@ -115,7 +116,11 @@ const services = [ {socialLinks.map(social => ( ))} @@ -175,6 +180,8 @@ const services = [ | Terms of Use | + Contact + | Sitemap diff --git a/src/components/Header.astro b/src/components/Header.astro index 123c1b6..6794dc2 100644 --- a/src/components/Header.astro +++ b/src/components/Header.astro @@ -11,7 +11,7 @@ const navItems = [ { name: 'Home Lab', url: '/homelab' }, // Updated URL { name: 'Resources', url: '/resources' }, { name: 'About', url: 'https://ArgoBox.com' }, - { name: 'Contact', url: 'https://ArgoBox.com/index.html#contact' } + { name: 'Contact', url: '/contact' } ]; // Get current URL path for active nav item highlighting diff --git a/src/components/KnowledgeGraph.astro b/src/components/KnowledgeGraph.astro index 5b947ab..12c00b4 100644 --- a/src/components/KnowledgeGraph.astro +++ b/src/components/KnowledgeGraph.astro @@ -413,6 +413,49 @@ const nodeTypeCounts = { setTimeout(() => { loadingEl.classList.add('hidden'); }, 500); } +// --- Fullscreen Toggle Functionality --- + if (fullscreenToggle) { + fullscreenToggle.addEventListener('click', toggleFullscreen); + } + + // Toggle fullscreen function + function toggleFullscreen() { + isFullscreen = !isFullscreen; + + if (isFullscreen) { + // Enable fullscreen mode + graphWrapper.classList.add('fullscreen'); + fullscreenEnterIcon.classList.add('hidden'); + fullscreenExitIcon.classList.remove('hidden'); + + // Hide the node details panel if it's visible + if (nodeDetailsEl) nodeDetailsEl.classList.remove('active'); + + // In fullscreen, we adjust the cytoscape layout to fit + setTimeout(() => { + cy.resize(); + cy.fit(null, 30); + }, 300); // Wait for transition to complete + } else { + // Disable fullscreen mode + graphWrapper.classList.remove('fullscreen'); + fullscreenEnterIcon.classList.remove('hidden'); + fullscreenExitIcon.classList.add('hidden'); + + // Hide the full post content panel + if (fullPostContent) { + fullPostContent.classList.remove('active'); + // Ensure display is set back to none if needed, though CSS handles visibility + // fullPostContent.style.display = 'none'; + } + + // Reset the cytoscape layout + setTimeout(() => { + cy.resize(); + cy.fit(null, 30); + }, 300); // Wait for transition to complete + } + } // --- Fullscreen Toggle Functionality --- if (fullscreenToggle) { fullscreenToggle.addEventListener('click', toggleFullscreen); @@ -764,6 +807,7 @@ const nodeTypeCounts = { if (nodeDetailsEl) nodeDetailsEl.classList.remove('active'); if (isFullscreen && fullPostContent) { fullPostContent.classList.remove('active'); + fullPostContent.style.display = 'none'; // Ensure display is none } cy.elements().removeClass('selected highlighted faded'); } @@ -776,6 +820,17 @@ const nodeTypeCounts = { cy.elements().removeClass('highlighted faded'); }); } +// Close full post panel button + if (closeFullPostBtn) { + closeFullPostBtn.addEventListener('click', () => { + if (fullPostContent) { + fullPostContent.classList.remove('active'); + fullPostContent.style.display = 'none'; // Ensure display is none + } + cy.$(':selected').unselect(); + cy.elements().removeClass('highlighted faded'); + }); + } // Close full post panel button if (closeFullPostBtn) { @@ -1979,4 +2034,350 @@ const nodeTypeCounts = { @keyframes spin { to { transform: rotate(360deg); } } +/* Fullscreen mode styles */ + .graph-container-wrapper.fullscreen { + position: fixed; + top: 0; + left: 0; + width: 100vw; + height: 100vh; + max-height: 100vh; + z-index: 9999; + margin: 0; + padding: 20px; + background: var(--bg-primary); + backdrop-filter: blur(10px); + display: flex; + border-radius: 0; + transition: all 0.5s cubic-bezier(0.19, 1, 0.22, 1); + } + + /* Adjust graph container in fullscreen mode */ + .graph-container-wrapper.fullscreen .graph-container { + position: relative; + width: 60%; + height: 100%; + border-radius: 12px; + margin-right: 20px; + } + + /* Fullscreen Toggle Button */ + .fullscreen-toggle { + position: absolute; + top: 20px; + right: 20px; + width: 40px; + height: 40px; + border-radius: 8px; + background: rgba(30, 41, 59, 0.7); + border: 1px solid var(--border-primary); + color: var(--text-primary); + display: flex; + align-items: center; + justify-content: center; + cursor: pointer; + z-index: 4; + transition: all 0.2s ease; + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15); + } + + .fullscreen-toggle:hover { + background: rgba(30, 41, 59, 0.9); + transform: translateY(-2px); + box-shadow: 0 6px 16px rgba(0, 0, 0, 0.2); + } + + .graph-container-wrapper.fullscreen .fullscreen-toggle { + top: 25px; + right: 25px; + } + + /* Hide one of the fullscreen icons */ + .hidden { + display: none; + } + + /* Full Post Content Panel */ + .full-post-content { + position: absolute; + top: 0; + right: 0; + width: 0; + height: 100%; + overflow: hidden; + transition: all 0.3s cubic-bezier(0.19, 1, 0.22, 1); + background: var(--bg-secondary); + border-radius: 12px; + opacity: 0; + z-index: 4; + border: 1px solid var(--card-border); + box-shadow: 0 10px 30px rgba(0, 0, 0, 0.2); + visibility: hidden; + display: none; + } + + /* Full post panel in fullscreen mode */ + .graph-container-wrapper.fullscreen .full-post-content { + position: relative; + width: 40%; + height: 100%; + background: rgba(30, 41, 59, 0.7); + backdrop-filter: blur(10px); + display: flex; + flex-direction: column; + opacity: 1; + visibility: visible; + } + + .graph-container-wrapper.fullscreen .full-post-content.active { + display: flex; + } + + .full-post-header { + display: flex; + justify-content: space-between; + align-items: flex-start; + padding: 1.5rem; + border-bottom: 1px solid var(--border-primary); + } + + .full-post-title { + font-size: 1.5rem; + margin: 0; + color: var(--text-primary); + font-weight: 600; + line-height: 1.3; + } + + .full-post-metadata { + padding: 1rem 1.5rem; + display: flex; + flex-wrap: wrap; + gap: 1rem; + align-items: center; + border-bottom: 1px solid rgba(255, 255, 255, 0.05); + } + + .full-post-category { + display: inline-block; + padding: 0.25rem 0.75rem; + border-radius: 20px; + font-size: 0.85rem; + font-weight: 500; + font-family: var(--font-mono); + } + + .full-post-tags { + display: flex; + gap: 0.5rem; + flex-wrap: wrap; + } + + .post-tag { + background: rgba(16, 185, 129, 0.1); + color: #10B981; + padding: 0.25rem 0.5rem; + border-radius: 4px; + font-size: 0.75rem; + font-family: var(--font-mono); + } + + .full-post-container { + flex: 1; + padding: 1.5rem; + overflow-y: auto; + color: var(--text-primary); + } + + .full-post-container::-webkit-scrollbar { + width: 8px; + } + + .full-post-container::-webkit-scrollbar-track { + background: rgba(30, 41, 59, 0.5); + border-radius: 4px; + } + + .full-post-container::-webkit-scrollbar-thumb { + background: rgba(226, 232, 240, 0.1); + border-radius: 4px; + } + + .full-post-container::-webkit-scrollbar-thumb:hover { + background: rgba(226, 232, 240, 0.2); + } + + .full-post-placeholder { + height: 100%; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + color: var(--text-secondary); + text-align: center; + padding: 2rem; + } + + .full-post-placeholder svg { + margin-bottom: 1rem; + opacity: 0.5; + } + + .post-content { + line-height: 1.7; + font-size: 1rem; + } + + .post-content h1, .post-content h2, .post-content h3, + .post-content h4, .post-content h5, .post-content h6 { + margin-top: 1.5rem; + margin-bottom: 1rem; + color: var(--text-primary); + font-weight: 600; + } + + .post-content p { + margin-bottom: 1.25rem; + } + + .post-content a { + color: var(--accent-primary); + text-decoration: none; + border-bottom: 1px dotted var(--accent-primary); + transition: all 0.2s ease; + } + + .post-content a:hover { + color: var(--accent-secondary); + border-bottom-style: solid; + } + + .post-content pre { + background: rgba(15, 23, 42, 0.6); + padding: 1rem; + border-radius: 6px; + overflow-x: auto; + margin: 1.5rem 0; + border: 1px solid var(--border-primary); + } + + .post-content code { + font-family: var(--font-mono); + font-size: 0.9rem; + } + + .post-content img { + max-width: 100%; + height: auto; + margin: 1.5rem 0; + border-radius: 6px; + box-shadow: 0 4px 20px rgba(0, 0, 0, 0.2); + } + + .post-content blockquote { + border-left: 4px solid var(--accent-primary); + padding-left: 1rem; + margin-left: 0; + margin-right: 0; + font-style: italic; + color: var(--text-secondary); + } + + .post-content ul, .post-content ol { + padding-left: 1.5rem; + margin-bottom: 1.25rem; + } + + .post-content li { + margin-bottom: 0.5rem; + } + + .full-post-link { + display: flex; + align-items: center; + justify-content: center; + gap: 0.5rem; + padding: 1rem; + background: linear-gradient(90deg, var(--accent-primary), var(--accent-secondary)); + color: var(--bg-primary); + text-decoration: none; + font-weight: 500; + transition: all 0.3s ease; + } + + .full-post-link:hover { + background: linear-gradient(90deg, var(--accent-secondary), var(--accent-primary)); + } + + /* Media Queries */ + @media screen and (max-width: 992px) { + /* Adjust fullscreen layout for smaller screens */ + .graph-container-wrapper.fullscreen { + flex-direction: column; + padding: 15px; + } + + .graph-container-wrapper.fullscreen .graph-container { + width: 100%; + height: 50%; + margin-right: 0; + margin-bottom: 15px; + } + + .graph-container-wrapper.fullscreen .full-post-content { + width: 100%; + height: 50%; + } + } + + @media screen and (max-width: 768px) { + .fullscreen-toggle { + top: 15px; + right: 15px; + width: 36px; + height: 36px; + } + + .graph-container-wrapper.fullscreen .graph-container { + height: 40%; + } + + .graph-container-wrapper.fullscreen .full-post-content { + height: 60%; + } + + .full-post-header { + padding: 1rem; + } + + .full-post-title { + font-size: 1.25rem; + } + + .full-post-metadata { + padding: 0.75rem 1rem; + } + + .full-post-container { + padding: 1rem; + } + } + + @media screen and (max-width: 480px) { + .graph-container-wrapper.fullscreen { + padding: 10px; + } + + .graph-container-wrapper.fullscreen .graph-container { + height: 35%; + } + + .graph-container-wrapper.fullscreen .full-post-content { + height: 65%; + } + + .full-post-title { + font-size: 1.1rem; + } + } \ No newline at end of file diff --git a/src/components/homelab/HeroSection.astro b/src/components/homelab/HeroSection.astro new file mode 100644 index 0000000..00eec9b --- /dev/null +++ b/src/components/homelab/HeroSection.astro @@ -0,0 +1,230 @@ +--- +// src/components/homelab/HeroSection.astro - Ultra minimal version +const { servicesCount } = Astro.props; +--- + +
+
+
+
+

+ Enterprise-Grade Home Lab Environment +

+

+ A production-ready infrastructure platform for DevOps experimentation, distributed systems, and automating everything with code. +

+ + +
+
+
Services:
+
{servicesCount}+
+
+
+
CPU Cores:
+
32+
+
+
+
Memory:
+
64GB
+
+
+
Storage:
+
12TB
+
+
+ + +
+ + +
+
+
System Status
+
+
+
+ Nodes: + 2 (Ready) +
+
+ Running Pods: + 32 +
+
+ Uptime: + 154 days +
+
+ Load: + 0.22, 0.18, 0.15 +
+
+
+
+
+
+ + \ No newline at end of file diff --git a/src/components/homelab/ProjectsSection.astro b/src/components/homelab/ProjectsSection.astro new file mode 100644 index 0000000..9988d96 --- /dev/null +++ b/src/components/homelab/ProjectsSection.astro @@ -0,0 +1,119 @@ +--- +// src/components/homelab/ProjectsSection.astro +// Making sure we properly handle the projectsData prop +const { projectsData } = Astro.props; + +// If projectsData is undefined or not an array, provide a fallback +const projects = Array.isArray(projectsData) ? projectsData : []; + +// Debug logging +console.log("ProjectsSection received projectsData:", !!projectsData); +console.log("ProjectsSection projects count:", projects.length); +--- + +
+
+
+

Related Projects

+

+ Explore associated projects and repositories related to the ArgoBox lab. +

+
+ +
+ {projects.length > 0 ? ( + projects.map(project => ( + +
+
+

{project.title}

+
+

{project.description}

+
+ {project.tech && project.tech.map(tech => ( + {tech} + ))} +
+
+ )) + ) : ( +
+

No projects available at this time.

+
+ )} +
+
+
+ + \ No newline at end of file diff --git a/src/components/homelab/ServiceCategory.astro b/src/components/homelab/ServiceCategory.astro new file mode 100644 index 0000000..b88aaac --- /dev/null +++ b/src/components/homelab/ServiceCategory.astro @@ -0,0 +1,80 @@ +// src/components/homelab/ServiceCategory.astro + +--- +const { category } = Astro.props; + +function getCategoryIcon(categoryKey) { + if (categoryKey === 'development') return 'fa-code'; + if (categoryKey === 'media') return 'fa-photo-video'; + if (categoryKey === 'utilities') return 'fa-tools'; + return 'fa-cogs'; // Default for infrastructure +} + +const categoryIcon = getCategoryIcon(category.key); +const categoryTitle = category.key.charAt(0).toUpperCase() + category.key.slice(1); +--- + + + + \ No newline at end of file diff --git a/src/components/homelab/ServicesSection.astro b/src/components/homelab/ServicesSection.astro new file mode 100644 index 0000000..58f01da --- /dev/null +++ b/src/components/homelab/ServicesSection.astro @@ -0,0 +1,201 @@ +--- +// src/components/homelab/ServicesSection.astro +// Making sure servicesData is properly handled + +const { servicesData } = Astro.props; + +// Helper functions +function getCategoryIcon(category) { + if (category === 'development') return 'fa-code'; + if (category === 'media') return 'fa-photo-video'; + if (category === 'utilities') return 'fa-tools'; + return 'fa-cogs'; // Default for infrastructure +} + +function formatServiceName(name) { + return name.toLowerCase().replace(/\s+/g, '-'); +} + +// Create a safe version of the data in case it's undefined +const safeServicesData = servicesData || {}; + +// Prepare data for rendering to minimize template expressions +const categoryEntries = Object.entries(safeServicesData).map(([key, services]) => { + return { + key, + title: key.charAt(0).toUpperCase() + key.slice(1), + services: Array.isArray(services) ? services : [] + }; +}); + +// Debug logging +console.log("ServicesSection received servicesData:", !!servicesData); +console.log("ServicesSection categories count:", categoryEntries.length); +--- + +
+
+
+

Available Services

+

+ Explore the various services and applications hosted in the ArgoBox environment. +

+
+ +
+ +

Some services require authentication and are restricted. Available public services are highlighted and clickable.

+
+ +
+ {categoryEntries.length > 0 ? ( + categoryEntries.map(category => ( + + )) + ) : ( +
+

No services available at this time.

+
+ )} +
+
+
+ + \ No newline at end of file diff --git a/src/content/config.ts b/src/content/config.ts index 6531b14..1f5d06e 100644 --- a/src/content/config.ts +++ b/src/content/config.ts @@ -35,22 +35,6 @@ const postsCollection = defineCollection({ }), }); -// Define the external posts collection (for external articles) -const externalPostsCollection = defineCollection({ - type: 'content', - schema: z.object({ - title: z.string(), - description: z.string().optional(), - pubDate: z.coerce.date(), - url: z.string().url(), - heroImage: z.string().optional(), - source: z.string().optional(), - category: z.string().optional(), - categories: z.array(z.string()).optional(), - tags: z.array(z.string()).default([]), - }), -}); - // Define the configurations collection (for config files) const configurationsCollection = defineCollection({ type: 'content', @@ -94,7 +78,6 @@ const projectsCollection = defineCollection({ // Export the collections export const collections = { posts: postsCollection, - 'external-posts': externalPostsCollection, configurations: configurationsCollection, projects: projectsCollection, }; \ No newline at end of file diff --git a/src/content/posts/Infrastructure-as-code.md b/src/content/posts/Infrastructure-as-code.md new file mode 100644 index 0000000..6b8fb2f --- /dev/null +++ b/src/content/posts/Infrastructure-as-code.md @@ -0,0 +1,65 @@ +--- +title: 'Getting Started with Infrastructure as Code' +description: 'Learn the basics of Infrastructure as Code and how to start using it in your projects.' +pubDate: '2023-11-15' +heroImage: '/images/posts/blog-infrastructure-as-code.jpg' +categories: ['Infrastructure', 'DevOps'] +tags: ['terraform', 'infrastructure', 'cloud', 'automation'] +minutesRead: '5 min' +--- + +# Getting Started with Infrastructure as Code + +Infrastructure as Code (IaC) is a key DevOps practice that involves managing and provisioning infrastructure through code instead of manual processes. This approach brings the same rigor, transparency, and version control to infrastructure that developers have long applied to application code. + +## Why Infrastructure as Code? + +IaC offers numerous benefits for modern DevOps teams: + +- **Consistency**: Infrastructure deployments become reproducible and standardized +- **Version Control**: Track changes to your infrastructure just like application code +- **Automation**: Reduce manual errors and increase deployment speed +- **Documentation**: Your code becomes self-documenting +- **Testing**: Infrastructure can be tested before deployment + +## Popular IaC Tools + +There are several powerful tools for implementing IaC: + +1. **Terraform**: Cloud-agnostic, works with multiple providers +2. **AWS CloudFormation**: Specific to AWS infrastructure +3. **Azure Resource Manager**: Microsoft's native IaC solution +4. **Google Cloud Deployment Manager**: For Google Cloud resources +5. **Pulumi**: Uses general-purpose programming languages + +## Basic Terraform Example + +Here's a simple example of Terraform code that provisions an AWS EC2 instance: + +```hcl +provider "aws" { + region = "us-west-2" +} + +resource "aws_instance" "web_server" { + ami = "ami-0c55b159cbfafe1f0" + instance_type = "t2.micro" + + tags = { + Name = "Web Server" + Environment = "Development" + } +} +``` + +## Getting Started + +To begin your IaC journey: + +1. Choose a tool that fits your infrastructure needs +2. Start small with a simple resource +3. Learn about state management +4. Implement CI/CD for your infrastructure code +5. Consider using modules for reusability + +Infrastructure as Code transforms how teams provision and manage resources, enabling more reliable, consistent deployments while reducing overhead and errors. \ No newline at end of file diff --git a/src/content/posts/README.md b/src/content/posts/README.md deleted file mode 100644 index aed2830..0000000 --- a/src/content/posts/README.md +++ /dev/null @@ -1,27 +0,0 @@ ---- -title: "Blog Posts Collection" -description: "Documentation for blog posts" -pubDate: 2025-04-18 -draft: true ---- - -# Blog Posts Collection - -This directory contains blog posts for the ArgoBox digital garden. - -## Content Guidelines - -- All posts should include proper frontmatter -- Use Markdown for formatting content -- Images should be placed in the public/blog/images directory - -## Frontmatter Requirements - -Every post needs at minimum: - -``` ---- -title: "Post Title" -pubDate: YYYY-MM-DD ---- -``` diff --git a/src/content/posts/Test.md b/src/content/posts/Test.md deleted file mode 100644 index 2e17100..0000000 --- a/src/content/posts/Test.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -title: This is a test -description: How to set up Cloudflare Tunnels for secure remote access to your home lab services -pubDate: Jul 22 2023 -heroImage: /images/posts/prometheusk8.png -category: networking -tags: - - Tag A - - Tag B - - Tag C -readTime: "7 min read" ---- diff --git a/src/content/posts/cloudflare-tunnel-setup.md b/src/content/posts/cloudflare-tunnels.md similarity index 97% rename from src/content/posts/cloudflare-tunnel-setup.md rename to src/content/posts/cloudflare-tunnels.md index 4e8345f..205d636 100644 --- a/src/content/posts/cloudflare-tunnel-setup.md +++ b/src/content/posts/cloudflare-tunnels.md @@ -2,7 +2,7 @@ title: Secure Remote Access with Cloudflare Tunnels description: How to set up Cloudflare Tunnels for secure remote access to your home lab services pubDate: 2025-04-19 -heroImage: /images/posts/prometheusk8.png +heroImage: /images/posts/blog-cloudflare-tunnel.jpg category: networking tags: - cloudflare diff --git a/src/content/posts/filebrowser-setup.md b/src/content/posts/filebrowser-setup.md index 98617f0..07ef04b 100644 --- a/src/content/posts/filebrowser-setup.md +++ b/src/content/posts/filebrowser-setup.md @@ -10,7 +10,7 @@ tags: - kubernetes - docker - file-management -heroImage: /images/posts/prometheusk8.png +heroImage: /images/posts/blog-filebrowser-setup.jpg --- I've said it before, and I'll say it again - the journey to a well-organized digital life begins with proper file management. If you're like me, you've got files scattered across multiple devices, cloud services, and servers. What if I told you there's a lightweight, sleek solution that puts you back in control without relying on third-party services? diff --git a/src/content/posts/gitea-self-hosted-git.md b/src/content/posts/gitea-self-hosted-git.md index 971f0a1..f2b79c0 100644 --- a/src/content/posts/gitea-self-hosted-git.md +++ b/src/content/posts/gitea-self-hosted-git.md @@ -10,7 +10,7 @@ tags: - self-hosted - devops - kubernetes -heroImage: /images/posts/prometheusk8.png +heroImage: /images/posts/blog-self-hosted-git.jpg --- If you're a developer like me who values ownership and privacy, you've probably wondered if there's a way to get the convenience of GitHub or GitLab without handing over your code to a third party. Enter Gitea - a painless, self-hosted Git service written in Go that I've been using for my personal projects for the past year. diff --git a/src/content/posts/gitops-with-flux-cd.md b/src/content/posts/gitops-with-flux-cd.md index ca990ec..9c5b74e 100644 --- a/src/content/posts/gitops-with-flux-cd.md +++ b/src/content/posts/gitops-with-flux-cd.md @@ -2,7 +2,7 @@ title: GitOps with Flux CD description: Implementing GitOps workflows on Kubernetes using Flux CD pubDate: 2025-04-19 -heroImage: /images/posts/prometheusk8.png +heroImage: /images/posts/blog-gitops-with-flux-cd.jpg category: devops tags: - kubernetes diff --git a/src/content/posts/k3s-installation-guide.md b/src/content/posts/guide-k3s-installation.md similarity index 95% rename from src/content/posts/k3s-installation-guide.md rename to src/content/posts/guide-k3s-installation.md index db0f6f6..88364f7 100644 --- a/src/content/posts/k3s-installation-guide.md +++ b/src/content/posts/guide-k3s-installation.md @@ -2,7 +2,7 @@ title: K3s Installation Guide description: A comprehensive guide to installing and configuring K3s for your home lab pubDate: 2025-04-19 -heroImage: /images/posts/k3installation.png +heroImage: /images/posts/guide-k3-installation.jpg category: kubernetes tags: - kubernetes diff --git a/src/content/posts/k3s-cluster.md b/src/content/posts/k3s-cluster.md index d92f5da..db6544d 100644 --- a/src/content/posts/k3s-cluster.md +++ b/src/content/posts/k3s-cluster.md @@ -2,7 +2,7 @@ title: "Setting Up a K3s Kubernetes Cluster" description: "A comprehensive guide to setting up a K3s cluster for your home lab or edge environment, with high availability and persistent storage." pubDate: "2023-11-15" -heroImage: "/blog/images/posts/k3installation.png" +heroImage: "/images/posts/guide-k3s-cluster.jpg" category: "Kubernetes" tags: ["kubernetes", "k3s", "homelab", "infrastructure"] draft: false diff --git a/src/content/posts/prometheus-monitoring.md b/src/content/posts/prometheus-monitoring.md index 3d36abc..91d7f44 100644 --- a/src/content/posts/prometheus-monitoring.md +++ b/src/content/posts/prometheus-monitoring.md @@ -2,7 +2,7 @@ title: "Monitoring Your Kubernetes Cluster with Prometheus and Grafana" description: "A comprehensive guide to setting up a robust monitoring solution for your Kubernetes cluster using Prometheus and Grafana." pubDate: "2023-09-25" -heroImage: "/blog/images/posts/prometheus-dashboard.svg" +heroImage: "/images/posts/blog-prometheus-monitoring.jpg" category: "Monitoring" tags: ["kubernetes", "prometheus", "grafana", "monitoring", "observability"] draft: false diff --git a/src/content/posts/proxmox-setup-guide.md b/src/content/posts/proxmox-setup-guide.md index 064f02c..b72cdfa 100644 --- a/src/content/posts/proxmox-setup-guide.md +++ b/src/content/posts/proxmox-setup-guide.md @@ -2,7 +2,7 @@ title: Complete Proxmox VE Setup Guide description: A step-by-step guide to setting up Proxmox VE for your home lab virtualization needs pubDate: 2025-04-19 -heroImage: /images/posts/prometheusk8.png +heroImage: /images/posts/blog-proxmox-setup.jpg category: infrastructure tags: - proxmox diff --git a/src/content/posts/quartz-digital-garden.md b/src/content/posts/quartz-digital-garden.md index 4e86606..c5c3f80 100644 --- a/src/content/posts/quartz-digital-garden.md +++ b/src/content/posts/quartz-digital-garden.md @@ -10,7 +10,7 @@ tags: - digital-garden - knowledge-management - astro -heroImage: /images/posts/prometheusk8.png +heroImage: /images/posts/blog-quartz-digital-garden.jpg --- I've been taking digital notes for decades now. From simple `.txt` files to OneNote, Evernote, Notion, and now Obsidian. But for years, I've been wrestling with a question: how do I share my knowledge with others in a way that preserves the connections between ideas? diff --git a/src/content/posts/rancher-kubernetes-management.md b/src/content/posts/rancher-kubernetes-management.md index 67ca4c6..b823022 100644 --- a/src/content/posts/rancher-kubernetes-management.md +++ b/src/content/posts/rancher-kubernetes-management.md @@ -10,7 +10,7 @@ tags: - k3s - devops - containers -heroImage: /images/posts/prometheusk8.png +heroImage: /images/posts/blog-home-lab-with-rancher.jpg --- I've been running Kubernetes at home for years now, and I've tried just about every management tool out there. From kubectl and a bunch of YAML files to various dashboards and UIs, I've experimented with it all. But the one tool that's been a constant in my home lab journey is [Rancher](https://rancher.com/) - a complete container management platform that makes Kubernetes management almost... dare I say it... enjoyable? diff --git a/src/content/posts/starting-my-digital-garden.md b/src/content/posts/starting-my-digital-garden.md index 362b9de..8930397 100644 --- a/src/content/posts/starting-my-digital-garden.md +++ b/src/content/posts/starting-my-digital-garden.md @@ -2,7 +2,7 @@ title: "Starting My Digital Garden" description: "How and why I'm approaching this blog as a digital garden rather than a traditional chronological blog." pubDate: "2023-10-05" -heroImage: "/blog/images/placeholders/default.jpg" +heroImage: "/images/posts/blog-digital-garden.jpg" category: "Meta" tags: ["digital-garden", "knowledge-management", "learning-in-public"] draft: false diff --git a/src/content/posts/test-post.md b/src/content/posts/test-post.md deleted file mode 100644 index 5622a76..0000000 --- a/src/content/posts/test-post.md +++ /dev/null @@ -1,14 +0,0 @@ ---- -title: Test Post -pubDate: 2024-03-20 -description: This is a test post to verify the blog setup -category: Test -tags: - - test -draft: true -heroImage: /images/posts/prometheusk8.png ---- - -# Test Post - -This is a test post to verify that the blog setup is working correctly. \ No newline at end of file diff --git a/src/content/posts/vscode-server-remote-development.md b/src/content/posts/vscode-server-remote-development.md index 32eeb32..82ddd8b 100644 --- a/src/content/posts/vscode-server-remote-development.md +++ b/src/content/posts/vscode-server-remote-development.md @@ -10,7 +10,7 @@ tags: - self-hosted - coding - homelab -heroImage: /images/posts/prometheusk8.png +heroImage: /images/posts/blog-vs-code-server.jpg --- If you're like me, you probably find yourself coding on multiple devices - maybe a desktop at home, a laptop when traveling, or even occasionally on a tablet. For years, keeping development environments in sync was a pain point. Enter [VS Code Server](https://code.visualstudio.com/docs/remote/vscode-server), the solution that has completely transformed my development workflow. diff --git a/src/data/homelabData.ts b/src/data/homelabData.ts new file mode 100644 index 0000000..f7f963b --- /dev/null +++ b/src/data/homelabData.ts @@ -0,0 +1,40 @@ +export const servicesData = { + development: [ + { name: "Gitea", description: "Self-hosted Git service", url: "https://git.argobox.com", status: "live", icon: "fas fa-code-branch", available: true }, + { name: "VS Code Server", description: "Remote development environment", url: "https://code.argobox.com", status: "live", icon: "fas fa-terminal", available: true }, + { name: "Drone CI", description: "Continuous Integration server", url: "https://drone.argobox.com", status: "live", icon: "fas fa-cogs", available: true }, + ], + media: [ + { name: "Plex", description: "Media streaming server", url: "https://plex.argobox.com", status: "live", icon: "fas fa-play-circle", available: true }, + { name: "Jellyfin", description: "Open source media system", url: "https://jellyfin.argobox.com", status: "live", icon: "fas fa-film", available: true }, + { name: "Sonarr", description: "TV show management", url: "#", status: "restricted", icon: "fas fa-tv", available: false }, + { name: "Radarr", description: "Movie management", url: "#", status: "restricted", icon: "fas fa-video", available: false }, + { name: "Prowlarr", description: "Indexer management", url: "#", status: "restricted", icon: "fas fa-search", available: false }, + ], + utilities: [ + { name: "File Browser", description: "Web file manager", url: "https://files.argobox.com", status: "live", icon: "fas fa-folder-open", available: true }, + { name: "Vaultwarden", description: "Password manager", url: "#", status: "restricted", icon: "fas fa-key", available: false }, + { name: "Homepage", description: "Service dashboard", url: "https://dash.argobox.com", status: "live", icon: "fas fa-tachometer-alt", available: true }, + { name: "Uptime Kuma", description: "Status monitoring", url: "https://status.argobox.com", status: "live", icon: "fas fa-heartbeat", available: true }, + ], + infrastructure: [ + { name: "Proxmox VE", description: "Virtualization platform", url: "#", status: "restricted", icon: "fas fa-server", available: false }, + { name: "Kubernetes (K3s)", description: "Container orchestration", url: "#", status: "restricted", icon: "fas fa-dharmachakra", available: false }, + { name: "Traefik", description: "Ingress controller", url: "#", status: "restricted", icon: "fas fa-route", available: false }, + { name: "OPNsense", description: "Firewall/Router", url: "#", status: "restricted", icon: "fas fa-shield-alt", available: false }, + ] +}; + +export const projectsData = [ + { title: "Ansible Playbooks", description: "Collection of playbooks for automating system configuration and application deployment.", icon: "fab fa-ansible", tech: ["Ansible", "YAML", "Jinja2"], url: "/resources/iac" }, + { title: "Kubernetes Manifests", description: "YAML definitions for deploying various applications and services on Kubernetes.", icon: "fas fa-dharmachakra", tech: ["Kubernetes", "YAML", "Helm"], url: "/resources/kubernetes" }, + { title: "Monitoring Dashboards", description: "Grafana dashboards for visualizing infrastructure and application metrics.", icon: "fas fa-chart-line", tech: ["Grafana", "PromQL", "JSON"], url: "/resources/config-files" }, + { title: "Cloudflare Tunnel Setup", description: "Securely exposing home lab services to the internet using Cloudflare Tunnels.", icon: "fas fa-cloud", tech: ["Cloudflare", "Networking", "Security"], url: "/posts/cloudflare-tunnel-setup" } +]; + +export const dashboardsData = [ + { title: "Infrastructure Overview", description: "Key metrics for Proxmox hosts, network devices, and storage.", previewClass: "infrastructure", url: "https://dash.argobox.com/goto/...", icon: "fas fa-server" }, + { title: "Kubernetes Cluster", description: "Detailed view of K3s cluster resources, node status, and pod health.", previewClass: "kubernetes", url: "https://dash.argobox.com/goto/...", icon: "fas fa-dharmachakra" }, + { title: "Network Traffic", description: "Real-time and historical network usage, firewall logs, and connection tracking.", previewClass: "network", url: "https://dash.argobox.com/goto/...", icon: "fas fa-network-wired" }, + { title: "Service Performance", description: "Application-specific metrics, request latency, and error rates.", previewClass: "services", url: "https://dash.argobox.com/goto/...", icon: "fas fa-cogs" } +]; \ No newline at end of file diff --git a/src/layouts/BaseLayout.astro b/src/layouts/BaseLayout.astro index 8ada813..061cca3 100644 --- a/src/layouts/BaseLayout.astro +++ b/src/layouts/BaseLayout.astro @@ -79,6 +79,9 @@ const { + + + diff --git a/src/layouts/MinimalLayout.astro b/src/layouts/MinimalLayout.astro new file mode 100644 index 0000000..6b20a1f --- /dev/null +++ b/src/layouts/MinimalLayout.astro @@ -0,0 +1,15 @@ +--- +// src/layouts/MinimalLayout.astro +--- + + + + + Minimal Test + + +
+ +
+ + \ No newline at end of file diff --git a/src/pages/api/contact.ts b/src/pages/api/contact.ts index f0c8ce7..bcc3c40 100644 --- a/src/pages/api/contact.ts +++ b/src/pages/api/contact.ts @@ -1,10 +1,6 @@ import type { APIRoute } from 'astro'; import { Resend } from 'resend'; -// Initialize Resend with API key from environment variables -// IMPORTANT: Set RESEND_API_KEY in your deployment environment (e.g., Cloudflare Pages) -const resend = new Resend(import.meta.env.RESEND_API_KEY); - // Define the expected structure of the form data interface FormData { name: string; @@ -14,6 +10,10 @@ interface FormData { } export const POST: APIRoute = async ({ request }) => { + // Initialize Resend inside the handler to access runtime env vars/secrets + // IMPORTANT: Set RESEND_API_KEY in your deployment environment (e.g., Cloudflare Pages) + const resend = new Resend(import.meta.env.RESEND_API_KEY); + // Check if API key is configured if (!import.meta.env.RESEND_API_KEY) { console.error("Resend API key is not configured."); @@ -56,7 +56,7 @@ export const POST: APIRoute = async ({ request }) => {

Message:

${data.message.replace(/\n/g, '
')}

`, - reply_to: data.email, // Set the reply-to header to the sender's email + replyTo: data.email, // Set the reply-to header to the sender's email }); if (emailError) { diff --git a/src/pages/blog/index.astro b/src/pages/blog/index.astro index bd6622d..ac3e82c 100644 --- a/src/pages/blog/index.astro +++ b/src/pages/blog/index.astro @@ -99,17 +99,17 @@ sortedPosts // Terminal commands for tech effect const commands = [ { - prompt: "[laforceit@argobox]$ ", + prompt: "[user@argobox]$ ", command: "find ./posts -type f -name \"*.md\" | sort -n | wc -l", output: [`${allPosts.length} posts found`] }, { - prompt: "[laforceit@argobox]$ ", + prompt: "[user@argobox]$ ", command: "ls -la ./tags", output: allTags.map(tag => `${tag}`) }, { - prompt: "[laforceit@argobox]$ ", + prompt: "[user@argobox]$ ", command: "grep -r \"kubernetes\" --include=\"*.md\" ./posts | wc -l", output: [`${allPosts.filter(post => post.data.tags?.includes('kubernetes') || diff --git a/src/pages/homelab.astro b/src/pages/homelab.astro index 79cc4e2..7a6c807 100644 --- a/src/pages/homelab.astro +++ b/src/pages/homelab.astro @@ -1,838 +1,56 @@ --- -// src/pages/homelab.astro - Converted from static homelab.html +// src/pages/homelab.astro - Fixed main file with proper component imports import BaseLayout from '../layouts/BaseLayout.astro'; import Header from '../components/Header.astro'; import Footer from '../components/Footer.astro'; +import HeroSection from '../components/homelab/HeroSection.astro'; +import ServicesSection from '../components/homelab/ServicesSection.astro'; +import ProjectsSection from '../components/homelab/ProjectsSection.astro'; +import { servicesData, projectsData, dashboardsData } from '../data/homelabData'; -const title = "Home Lab | Argobox - ArgoBox Tech Hub"; +const title = "Home Lab | ArgoBox - ArgoBox Tech Hub"; const description = "ArgoBox - A production-grade Kubernetes homelab for DevOps experimentation, infrastructure automation, and containerized application deployment."; -// Data for services (can be fetched or defined here) -// Example structure - replace with actual data source if needed -const servicesData = { - development: [ - { name: "Gitea", description: "Self-hosted Git service", url: "https://git.argobox.com", status: "live", icon: "fas fa-code-branch", available: true }, - { name: "VS Code Server", description: "Remote development environment", url: "https://code.argobox.com", status: "live", icon: "fas fa-terminal", available: true }, - { name: "Drone CI", description: "Continuous Integration server", url: "https://drone.argobox.com", status: "live", icon: "fas fa-cogs", available: true }, - ], - media: [ - { name: "Plex", description: "Media streaming server", url: "https://plex.argobox.com", status: "live", icon: "fas fa-play-circle", available: true }, - { name: "Jellyfin", description: "Open source media system", url: "https://jellyfin.argobox.com", status: "live", icon: "fas fa-film", available: true }, - { name: "Sonarr", description: "TV show management", url: "#", status: "restricted", icon: "fas fa-tv", available: false }, - { name: "Radarr", description: "Movie management", url: "#", status: "restricted", icon: "fas fa-video", available: false }, - { name: "Prowlarr", description: "Indexer management", url: "#", status: "restricted", icon: "fas fa-search", available: false }, - ], - utilities: [ - { name: "File Browser", description: "Web file manager", url: "https://files.argobox.com", status: "live", icon: "fas fa-folder-open", available: true }, - { name: "Vaultwarden", description: "Password manager", url: "https://vault.argobox.com", status: "live", icon: "fas fa-key", available: true }, - { name: "Homepage", description: "Service dashboard", url: "https://dash.argobox.com", status: "live", icon: "fas fa-tachometer-alt", available: true }, - { name: "Uptime Kuma", description: "Status monitoring", url: "https://status.argobox.com", status: "live", icon: "fas fa-heartbeat", available: true }, - ], - infrastructure: [ - { name: "Proxmox VE", description: "Virtualization platform", url: "#", status: "restricted", icon: "fas fa-server", available: false }, - { name: "Kubernetes (K3s)", description: "Container orchestration", url: "#", status: "restricted", icon: "fas fa-dharmachakra", available: false }, - { name: "Traefik", description: "Ingress controller", url: "#", status: "restricted", icon: "fas fa-route", available: false }, - { name: "OPNsense", description: "Firewall/Router", url: "#", status: "restricted", icon: "fas fa-shield-alt", available: false }, - ] -}; - -// Data for projects (can be fetched or defined here) -const projectsData = [ - { title: "Ansible Playbooks", description: "Collection of playbooks for automating system configuration and application deployment.", icon: "fab fa-ansible", tech: ["Ansible", "YAML", "Jinja2"], url: "/resources/iac" }, // Link to relevant resource page - { title: "Kubernetes Manifests", description: "YAML definitions for deploying various applications and services on Kubernetes.", icon: "fas fa-dharmachakra", tech: ["Kubernetes", "YAML", "Helm"], url: "/resources/kubernetes" }, - { title: "Monitoring Dashboards", description: "Grafana dashboards for visualizing infrastructure and application metrics.", icon: "fas fa-chart-line", tech: ["Grafana", "PromQL", "JSON"], url: "/resources/config-files" }, // Link to relevant resource page - { title: "Cloudflare Tunnel Setup", description: "Securely exposing home lab services to the internet using Cloudflare Tunnels.", icon: "fas fa-cloud", tech: ["Cloudflare", "Networking", "Security"], url: "/posts/cloudflare-tunnel-setup" } // Link to blog post -]; - -// Data for dashboards (can be fetched or defined here) -const dashboardsData = [ - { title: "Infrastructure Overview", description: "Key metrics for Proxmox hosts, network devices, and storage.", previewClass: "infrastructure", url: "https://dash.argobox.com/goto/...", icon: "fas fa-server" }, - { title: "Kubernetes Cluster", description: "Detailed view of K3s cluster resources, node status, and pod health.", previewClass: "kubernetes", url: "https://dash.argobox.com/goto/...", icon: "fas fa-dharmachakra" }, - { title: "Network Traffic", description: "Real-time and historical network usage, firewall logs, and connection tracking.", previewClass: "network", url: "https://dash.argobox.com/goto/...", icon: "fas fa-network-wired" }, - { title: "Service Performance", description: "Application-specific metrics, request latency, and error rates.", previewClass: "services", url: "https://dash.argobox.com/goto/...", icon: "fas fa-cogs" } -]; - -// Data for contact form (if keeping it on this page) -// const contactInfo = { email: "daniel.laforce@argobox.com", /* other info */ }; - +// Calculate total services count for the hero section +const servicesCount = Object.values(servicesData).flat().length; --- - {/* Add Font Awesome if not loaded globally by BaseLayout */} - {/* */}
- - -
-
-
-
-
-

- Enterprise-Grade Home Lab Environment -

-

- A production-ready infrastructure platform for DevOps experimentation, distributed systems, and automating everything with code. -

-
-
-
-
-
32+
-
CPU Cores
-
-
-
-
-
-
64GB
-
RAM
-
-
-
-
-
-
12TB
-
Storage
-
-
-
-
-
-
{Object.values(servicesData).flat().length}+
-
Services
-
-
-
- -
-
-
-
- - - -
-
argobox ~ k8s-status
-
-
-
$ kubectl get nodes
-
NAME STATUS ROLES AGE VERSION
-
argobox Ready control-plane,master 154d v1.25.16+k3s1
-
argobox-lite Ready worker 154d v1.25.16+k3s1
-
 
-
$ kubectl get pods -A | grep Running | wc -l
-
32
-
 
-
$ uptime
-
14:30:25 up 154 days, 23:12, 1 user, load average: 0.22, 0.18, 0.15
-
 
-
$ ansible-playbook status.yml
-
PLAY [Check system status] *******************************************
-
TASK [Gathering Facts] **********************************************
-
ok: [argobox]
-
ok: [argobox-lite]
-
TASK [Check service status] *****************************************
-
ok: [argobox]
-
ok: [argobox-lite]
-
PLAY RECAP **********************************************************
-
argobox : ok=2 changed=0 unreachable=0 failed=0 skipped=0
-
argobox-lite: ok=2 changed=0 unreachable=0 failed=0 skipped=0
-
$ |
-
-
-
-
-
- - -
-
-
-

Infrastructure Architecture

-

- Enterprise-grade network topology with redundancy, virtualization, and secure segmentation. -

-
- {/* Consider replacing with an actual image or a more maintainable diagram component */} - ArgoBox Architecture Diagram - {/* Fallback or simplified diagram if image isn't available */} -
-
-
-

Network Security

-

- Enterprise firewall with network segmentation using VLANs and strict access controls. Redundant routing with automatic failover between OPNsense and OpenWrt. -

-
-
-
-

Virtualization

-

- Proxmox virtualization platform with ZFS storage pools in RAID10 configuration. Optimized storage pools for VMs and containers with proper resource allocation. -

-
-
-
-

High Availability

-

- Full redundancy with failover routing, replicated storage, and resilient services. Automatic service recovery and load balancing across nodes. -

-
-
-
-
- - -
-
-
-

Core Technologies

-

- The ArgoBox lab leverages cutting-edge open source technologies to create a powerful, flexible infrastructure. -

-
-
- {/* Data could be externalized */} -
-
-

Kubernetes (K3s)

-

Lightweight Kubernetes distribution running across multiple nodes for container orchestration. Powers all microservices and applications.

-
Multi-node clusterPersistent volumesTraefik ingressAuto-healing
-
- -
-
-

Proxmox

-

Enterprise-class virtualization platform running virtual machines and containers with ZFS storage backend for data integrity.

-
ZFS storageResource balancingLive migrationHardware passthrough
-
-
-
-

Zero Trust Security

-

Comprehensive security architecture with Cloudflare tunnels, network segmentation, and authentication at all service boundaries.

-
Cloudflare tunnelsOPNsense firewallVLAN segmentationWireGuard VPN
-
-
-
-

PostgreSQL

-

Enterprise database cluster for application data storage with automated backups, replication, and performance optimization.

-
Automated backupsConnection poolingOptimized for K8sMulti-app support
-
-
-
-

Monitoring Stack

-

Comprehensive monitoring with Prometheus, Grafana, and AlertManager for real-time visibility into all infrastructure components.

-
Prometheus metricsGrafana dashboardsAutomated alertsHistorical data
-
-
-
-
- - -
-
-
-

Available Services

-

- Explore the various services and applications hosted in the ArgoBox environment. -

-
-
- -

Some services require authentication and are restricted. Available public services are highlighted and clickable.

-
-
- {Object.entries(servicesData).map(([categoryKey, categoryServices]) => ( -
-

- - {categoryKey.charAt(0).toUpperCase() + categoryKey.slice(1)} Tools -

- -
- ))} -
-
-
- - -
-
-
-

Related Projects & Code

-

- Explore associated projects, configurations, and code repositories related to the ArgoBox lab. -

-
- -
-
- - -
-
-
-

Live Dashboards

-

- Real-time monitoring dashboards providing insights into the lab's performance and status. (Authentication Required) -

-
-
{/* Reusing banner style */} - -

Access to live dashboards requires authentication via Cloudflare Access.

-
- -
-
- - {/* Contact Section - Optional: Can be moved to a separate page */} - {/* -
-
-
-

Get In Touch

-

Have questions or want to collaborate? Reach out!

-
-
-
-
-
-

Email

- {contactInfo.email} -
- Add other contact items like LinkedIn, GitHub etc. -
-
-
-
- - -
-
- - -
-
- - -
-
- - -
- -
-
-
-
-
- */} - + + +