diff --git a/public/404.html b/public/404.html new file mode 100644 index 0000000..0628f45 --- /dev/null +++ b/public/404.html @@ -0,0 +1,27 @@ +
+
+ +

404

+
+

This page could not be found.

+
+
+
diff --git a/public/android-chrome-192x192.png b/public/android-chrome-192x192.png new file mode 100644 index 0000000..7f0493c 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..faea4c2 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..eb281cb Binary files /dev/null and b/public/apple-touch-icon.png differ diff --git a/public/categories/index.html b/public/categories/index.html new file mode 100644 index 0000000..e4b0e19 --- /dev/null +++ b/public/categories/index.html @@ -0,0 +1,471 @@ + + + + + + + + + + + + + + Categories – Novoa en español + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+
+

Categories

+ +
+
+
+ +
+
+
+ + + + + + + + + + + + diff --git a/public/categories/index.xml b/public/categories/index.xml new file mode 100644 index 0000000..2254b86 --- /dev/null +++ b/public/categories/index.xml @@ -0,0 +1,18 @@ + + + Novoa en español – Categories + https://portal.novoa.nagoya/categories/ + Recent content in Categories on Novoa en español + Hugo -- gohugo.io + es-MX + + + + + + + + + + + diff --git a/public/css/compiled/main.min.2fd8982815d4baf33b6acf949e788eafe9a3ff0490ac38a7a749fe9d8f292278.css b/public/css/compiled/main.min.2fd8982815d4baf33b6acf949e788eafe9a3ff0490ac38a7a749fe9d8f292278.css new file mode 100644 index 0000000..ec849fa --- /dev/null +++ b/public/css/compiled/main.min.2fd8982815d4baf33b6acf949e788eafe9a3ff0490ac38a7a749fe9d8f292278.css @@ -0,0 +1 @@ +*,::before,::after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}::before,::after{--tw-content:''}html{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,segoe ui,Roboto,helvetica neue,Arial,noto sans,sans-serif,apple color emoji,segoe ui emoji,segoe ui symbol,noto color emoji;font-feature-settings:normal;font-variation-settings:normal}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,liberation mono,courier new,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,[type=button],[type=reset],[type=submit]{-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]{display:none}*,::before,::after{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgb(59 130 246 / 0.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: }::backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgb(59 130 246 / 0.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: }.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.pointer-events-none{pointer-events:none}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-0{inset:0}.inset-x-0{left:0;right:0}.inset-y-0{top:0;bottom:0}.bottom-0{bottom:0}.left-\[24px\]{left:24px}.left-\[36px\]{left:36px}.right-0{right:0}.top-0{top:0}.top-16{top:4rem}.top-8{top:2rem}.top-\[40\%\]{top:40%}.top-full{top:100%}.z-10{z-index:10}.z-20{z-index:20}.z-\[-1\]{z-index:-1}.order-last{order:9999}.m-\[11px\]{margin:11px}.mx-1{margin-left:.25rem;margin-right:.25rem}.mx-2{margin-left:.5rem;margin-right:.5rem}.mx-4{margin-left:1rem;margin-right:1rem}.mx-auto{margin-left:auto;margin-right:auto}.my-1{margin-top:.25rem;margin-bottom:.25rem}.my-1\.5{margin-top:.375rem;margin-bottom:.375rem}.my-2{margin-top:.5rem;margin-bottom:.5rem}.-mb-0{margin-bottom:0}.-mb-0\.5{margin-bottom:-.125rem}.-ml-2{margin-left:-.5rem}.-mr-2{margin-right:-.5rem}.-mt-20{margin-top:-5rem}.mb-10{margin-bottom:2.5rem}.mb-12{margin-bottom:3rem}.mb-16{margin-bottom:4rem}.mb-2{margin-bottom:.5rem}.mb-4{margin-bottom:1rem}.mb-6{margin-bottom:1.5rem}.mb-8{margin-bottom:2rem}.ml-1{margin-left:.25rem}.ml-4{margin-left:1rem}.mr-1{margin-right:.25rem}.mr-2{margin-right:.5rem}.mt-1{margin-top:.25rem}.mt-1\.5{margin-top:.375rem}.mt-12{margin-top:3rem}.mt-16{margin-top:4rem}.mt-2{margin-top:.5rem}.mt-4{margin-top:1rem}.mt-5{margin-top:1.25rem}.mt-6{margin-top:1.5rem}.mt-8{margin-top:2rem}.line-clamp-3{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:3}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.hidden{display:none}.aspect-auto{aspect-ratio:auto}.h-0{height:0}.h-16{height:4rem}.h-2{height:.5rem}.h-3{height:.75rem}.h-3\.5{height:.875rem}.h-4{height:1rem}.h-5{height:1.25rem}.h-7{height:1.75rem}.h-\[18px\]{height:18px}.h-full{height:100%}.max-h-64{max-height:16rem}.max-h-\[calc\(100vh-var\(--navbar-height\)-env\(safe-area-inset-bottom\)\)\]{max-height:calc(100vh - var(--navbar-height) - env(safe-area-inset-bottom))}.max-h-\[min\(calc\(50vh-11rem-env\(safe-area-inset-bottom\)\)\2c 400px\)\]{max-height:min(calc(50vh - 11rem - env(safe-area-inset-bottom)),400px)}.min-h-\[100px\]{min-height:100px}.min-h-\[calc\(100vh-var\(--navbar-height\)\)\]{min-height:calc(100vh - var(--navbar-height))}.w-2{width:.5rem}.w-3{width:.75rem}.w-3\.5{width:.875rem}.w-4{width:1rem}.w-64{width:16rem}.w-\[110\%\]{width:110%}.w-\[180\%\]{width:180%}.w-full{width:100%}.w-max{width:-moz-max-content;width:max-content}.w-screen{width:100vw}.min-w-0{min-width:0}.min-w-\[18px\]{min-width:18px}.min-w-\[24px\]{min-width:24px}.min-w-full{min-width:100%}.max-w-6xl{max-width:72rem}.max-w-\[50\%\]{max-width:50%}.max-w-\[90rem\]{max-width:90rem}.max-w-\[min\(calc\(100vw-2rem\)\2c calc\(100\%\+20rem\)\)\]{max-width:min(calc(100vw - 2rem),calc(100% + 20rem))}.max-w-full{max-width:100%}.max-w-none{max-width:none}.max-w-screen-xl{max-width:1280px}.shrink-0{flex-shrink:0}.grow{flex-grow:1}.origin-center{transform-origin:center}.cursor-default{cursor:default}.cursor-pointer{cursor:pointer}.select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.scroll-my-6{scroll-margin-top:1.5rem;scroll-margin-bottom:1.5rem}.scroll-py-6{scroll-padding-top:1.5rem;scroll-padding-bottom:1.5rem}.list-none{list-style-type:none}.appearance-none{-webkit-appearance:none;-moz-appearance:none;appearance:none}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-start{align-items:flex-start}.items-center{align-items:center}.justify-start{justify-content:flex-start}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.justify-items-start{justify-items:start}.gap-1{gap:.25rem}.gap-2{gap:.5rem}.gap-4{gap:1rem}.gap-x-1{-moz-column-gap:.25rem;column-gap:.25rem}.gap-x-1\.5{-moz-column-gap:.375rem;column-gap:.375rem}.gap-y-2{row-gap:.5rem}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.overflow-x-hidden{overflow-x:hidden}.overscroll-contain{overscroll-behavior:contain}.text-ellipsis{text-overflow:ellipsis}.whitespace-nowrap{white-space:nowrap}.break-words{overflow-wrap:break-word}.rounded{border-radius:.25rem}.rounded-3xl{border-radius:1.5rem}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-md{border-radius:.375rem}.rounded-sm{border-radius:.125rem}.rounded-xl{border-radius:.75rem}.rounded-t{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.border{border-width:1px}.border-b{border-bottom-width:1px}.border-b-2{border-bottom-width:2px}.border-l{border-left-width:1px}.border-t{border-top-width:1px}.border-black\/5{border-color:rgb(0 0 0/5%)}.border-blue-200{--tw-border-opacity:1;border-color:rgb(191 219 254/var(--tw-border-opacity))}.border-gray-200{--tw-border-opacity:1;border-color:rgb(229 231 235/var(--tw-border-opacity))}.border-gray-500{--tw-border-opacity:1;border-color:rgb(107 114 128/var(--tw-border-opacity))}.border-orange-100{--tw-border-opacity:1;border-color:rgb(255 237 213/var(--tw-border-opacity))}.border-red-200{--tw-border-opacity:1;border-color:rgb(254 202 202/var(--tw-border-opacity))}.border-transparent{border-color:transparent}.border-yellow-100{--tw-border-opacity:1;border-color:rgb(254 249 195/var(--tw-border-opacity))}.bg-black\/80{background-color:rgb(0 0 0/.8)}.bg-black\/\[\.05\]{background-color:rgb(0 0 0/5%)}.bg-blue-100{--tw-bg-opacity:1;background-color:rgb(219 234 254/var(--tw-bg-opacity))}.bg-gray-100{--tw-bg-opacity:1;background-color:rgb(243 244 246/var(--tw-bg-opacity))}.bg-neutral-50{--tw-bg-opacity:1;background-color:rgb(250 250 250/var(--tw-bg-opacity))}.bg-orange-50{--tw-bg-opacity:1;background-color:rgb(255 247 237/var(--tw-bg-opacity))}.bg-primary-100{--tw-bg-opacity:1;background-color:hsl(var(--primary-hue) var(--primary-saturation) 94%/var(--tw-bg-opacity))}.bg-primary-400{--tw-bg-opacity:1;background-color:hsl(var(--primary-hue) var(--primary-saturation) 66%/var(--tw-bg-opacity))}.bg-primary-600{--tw-bg-opacity:1;background-color:hsl(var(--primary-hue) var(--primary-saturation) 45%/var(--tw-bg-opacity))}.bg-primary-700\/5{background-color:hsl(var(--primary-hue) var(--primary-saturation) 39%/.05)}.bg-red-100{--tw-bg-opacity:1;background-color:rgb(254 226 226/var(--tw-bg-opacity))}.bg-transparent{background-color:transparent}.bg-white{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity))}.bg-yellow-50{--tw-bg-opacity:1;background-color:rgb(254 252 232/var(--tw-bg-opacity))}.bg-gradient-to-r{background-image:linear-gradient(to right,var(--tw-gradient-stops))}.from-gray-900{--tw-gradient-from:#111827 var(--tw-gradient-from-position);--tw-gradient-to:rgb(17 24 39 / 0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from), var(--tw-gradient-to)}.to-gray-600{--tw-gradient-to:#4b5563 var(--tw-gradient-to-position)}.bg-clip-text{-webkit-background-clip:text;background-clip:text}.p-0{padding:0}.p-0\.5{padding:.125rem}.p-1{padding:.25rem}.p-1\.5{padding:.375rem}.p-2{padding:.5rem}.p-4{padding:1rem}.p-6{padding:1.5rem}.px-1{padding-left:.25rem;padding-right:.25rem}.px-1\.5{padding-left:.375rem;padding-right:.375rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-12{padding-top:3rem;padding-bottom:3rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-2\.5{padding-top:.625rem;padding-bottom:.625rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.pb-8{padding-bottom:2rem}.pb-\[env\(safe-area-inset-bottom\)\]{padding-bottom:env(safe-area-inset-bottom)}.pb-px{padding-bottom:1px}.pl-5{padding-left:1.25rem}.pl-6{padding-left:1.5rem}.pl-\[max\(env\(safe-area-inset-left\)\2c 1\.5rem\)\]{padding-left:max(env(safe-area-inset-left),1.5rem)}.pr-2{padding-right:.5rem}.pr-4{padding-right:1rem}.pr-\[calc\(env\(safe-area-inset-right\)-1\.5rem\)\]{padding-right:calc(env(safe-area-inset-right) - 1.5rem)}.pr-\[max\(env\(safe-area-inset-left\)\2c 1\.5rem\)\]{padding-right:max(env(safe-area-inset-left),1.5rem)}.pr-\[max\(env\(safe-area-inset-right\)\2c 1\.5rem\)\]{padding-right:max(env(safe-area-inset-right),1.5rem)}.pt-4{padding-top:1rem}.pt-6{padding-top:1.5rem}.pt-8{padding-top:2rem}.text-left{text-align:left}.text-center{text-align:center}.align-text-bottom{vertical-align:text-bottom}.font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,liberation mono,courier new,monospace}.text-2xl{font-size:1.5rem}.text-4xl{font-size:2.25rem}.text-\[10px\]{font-size:10px}.text-base{font-size:1rem}.text-lg{font-size:1.125rem}.text-sm{font-size:.875rem}.text-xl{font-size:1.25rem}.text-xs{font-size:.75rem}.font-bold{font-weight:700}.font-extrabold{font-weight:800}.font-medium{font-weight:500}.font-normal{font-weight:400}.font-semibold{font-weight:600}.capitalize{text-transform:capitalize}.leading-5{line-height:1.25rem}.leading-6{line-height:1.5rem}.leading-7{line-height:1.75rem}.leading-none{line-height:1}.leading-tight{line-height:1.25}.tracking-tight{letter-spacing:-.015em}.text-\[color\:hsl\(var\(--primary-hue\)\2c 100\%\2c 50\%\)\]{--tw-text-opacity:1;color:hsl(var(--primary-hue) 100% 50%/var(--tw-text-opacity))}.text-blue-900{--tw-text-opacity:1;color:rgb(30 58 138/var(--tw-text-opacity))}.text-current{color:currentColor}.text-gray-100{--tw-text-opacity:1;color:rgb(243 244 246/var(--tw-text-opacity))}.text-gray-500{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity))}.text-gray-600{--tw-text-opacity:1;color:rgb(75 85 99/var(--tw-text-opacity))}.text-gray-700{--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity))}.text-gray-800{--tw-text-opacity:1;color:rgb(31 41 55/var(--tw-text-opacity))}.text-gray-900{--tw-text-opacity:1;color:rgb(17 24 39/var(--tw-text-opacity))}.text-orange-800{--tw-text-opacity:1;color:rgb(154 52 18/var(--tw-text-opacity))}.text-primary-800{--tw-text-opacity:1;color:hsl(var(--primary-hue) var(--primary-saturation) 32%/var(--tw-text-opacity))}.text-red-900{--tw-text-opacity:1;color:rgb(127 29 29/var(--tw-text-opacity))}.text-slate-900{--tw-text-opacity:1;color:rgb(15 23 42/var(--tw-text-opacity))}.text-transparent{color:transparent}.text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}.text-yellow-900{--tw-text-opacity:1;color:rgb(113 63 18/var(--tw-text-opacity))}.underline{text-decoration-line:underline}.no-underline{text-decoration-line:none}.decoration-from-font{text-decoration-thickness:from-font}.underline-offset-2{text-underline-offset:2px}.opacity-0{opacity:0}.opacity-50{opacity:.5}.opacity-80{opacity:.8}.shadow{--tw-shadow:0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1);--tw-shadow-colored:0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-\[0_-12px_16px_\#fff\]{--tw-shadow:0 -12px 16px #fff;--tw-shadow-colored:0 -12px 16px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-\[0_-12px_16px_white\]{--tw-shadow:0 -12px 16px white;--tw-shadow-colored:0 -12px 16px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-\[0_2px_4px_rgba\(0\2c 0\2c 0\2c \.02\)\2c 0_1px_0_rgba\(0\2c 0\2c 0\2c \.06\)\]{--tw-shadow:0 2px 4px rgba(0,0,0,.02),0 1px 0 rgba(0,0,0,.06);--tw-shadow-colored:0 2px 4px var(--tw-shadow-color), 0 1px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 2px 0 rgb(0 0 0 / 0.05);--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-xl{--tw-shadow:0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1);--tw-shadow-colored:0 20px 25px -5px var(--tw-shadow-color), 0 8px 10px -6px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-gray-100{--tw-shadow-color:#f3f4f6;--tw-shadow:var(--tw-shadow-colored)}.ring-1{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.ring-black\/5{--tw-ring-color:rgb(0 0 0 / 0.05)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:150ms}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:150ms}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:150ms}.transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:150ms}.transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:150ms}.duration-200{transition-duration:200ms}.duration-75{transition-duration:75ms}.ease-in{transition-timing-function:cubic-bezier(.4,0,1,1)}.\[-webkit-tap-highlight-color\:transparent\]{-webkit-tap-highlight-color:transparent}.\[-webkit-touch-callout\:none\]{-webkit-touch-callout:none}.\[counter-reset\:step\]{counter-reset:step}.\[hyphens\:auto\]{-webkit-hyphens:auto;hyphens:auto}.\[transition\:background-color_1\.5s_ease\]{transition:background-color 1.5s ease}.\[word-break\:break-word\]{word-break:break-word}.content :where(h1):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.5rem;font-size:2.25rem;font-weight:700;letter-spacing:-.015em;--tw-text-opacity:1;color:rgb(15 23 42/var(--tw-text-opacity))}:is(html[class~=dark] .content :where(h1):not(:where([class~=not-prose],[class~=not-prose] *))){--tw-text-opacity:1;color:rgb(241 245 249/var(--tw-text-opacity))}.content :where(h2):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2.5rem;border-bottom-width:1px;border-color:rgb(229 229 229/.7);padding-bottom:.25rem;font-size:1.875rem;font-weight:600;letter-spacing:-.015em;--tw-text-opacity:1;color:rgb(15 23 42/var(--tw-text-opacity))}@media(prefers-contrast:more){.content :where(h2):not(:where([class~=not-prose],[class~=not-prose] *)){--tw-border-opacity:1;border-color:rgb(163 163 163/var(--tw-border-opacity))}}:is(html[class~=dark] .content :where(h2):not(:where([class~=not-prose],[class~=not-prose] *))){border-color:hsl(var(--primary-hue) var(--primary-saturation) 94%/.1);--tw-text-opacity:1;color:rgb(241 245 249/var(--tw-text-opacity))}@media(prefers-contrast:more){:is(html[class~=dark] .content :where(h2):not(:where([class~=not-prose],[class~=not-prose] *))){--tw-border-opacity:1;border-color:rgb(163 163 163/var(--tw-border-opacity))}}.content :where(h3):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2rem;font-size:1.5rem;font-weight:600;letter-spacing:-.015em;--tw-text-opacity:1;color:rgb(15 23 42/var(--tw-text-opacity))}:is(html[class~=dark] .content :where(h3):not(:where([class~=not-prose],[class~=not-prose] *))){--tw-text-opacity:1;color:rgb(241 245 249/var(--tw-text-opacity))}.content :where(h4):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2rem;font-size:1.25rem;font-weight:600;letter-spacing:-.015em;--tw-text-opacity:1;color:rgb(15 23 42/var(--tw-text-opacity))}:is(html[class~=dark] .content :where(h4):not(:where([class~=not-prose],[class~=not-prose] *))){--tw-text-opacity:1;color:rgb(241 245 249/var(--tw-text-opacity))}.content :where(h5):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2rem;font-size:1.125rem;font-weight:600;letter-spacing:-.015em;--tw-text-opacity:1;color:rgb(15 23 42/var(--tw-text-opacity))}:is(html[class~=dark] .content :where(h5):not(:where([class~=not-prose],[class~=not-prose] *))){--tw-text-opacity:1;color:rgb(241 245 249/var(--tw-text-opacity))}.content :where(h6):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2rem;font-size:1rem;font-weight:600;letter-spacing:-.015em;--tw-text-opacity:1;color:rgb(15 23 42/var(--tw-text-opacity))}:is(html[class~=dark] .content :where(h6):not(:where([class~=not-prose],[class~=not-prose] *))){--tw-text-opacity:1;color:rgb(241 245 249/var(--tw-text-opacity))}.content :where(p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.5rem;line-height:1.75rem}.content :where(p):not(:where([class~=not-prose],[class~=not-prose] *)):first-child{margin-top:0}.content :where(a):not(:where([class~=not-prose],[class~=not-prose] *)){--tw-text-opacity:1;color:hsl(var(--primary-hue) var(--primary-saturation) 45%/var(--tw-text-opacity));text-decoration-line:underline;text-decoration-thickness:from-font;text-underline-position:from-font}.content :where(blockquote):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.5rem;--tw-border-opacity:1;border-color:rgb(209 213 219/var(--tw-border-opacity));font-style:italic;--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity))}.content :where(blockquote):not(:where([class~=not-prose],[class~=not-prose] *)):first-child{margin-top:0}:is([dir=ltr] .content :where(blockquote):not(:where([class~=not-prose],[class~=not-prose] *))){border-left-width:2px;padding-left:1.5rem}:is([dir=rtl] .content :where(blockquote):not(:where([class~=not-prose],[class~=not-prose] *))){border-right-width:2px;padding-right:1.5rem}:is(html[class~=dark] .content :where(blockquote):not(:where([class~=not-prose],[class~=not-prose] *))){--tw-border-opacity:1;border-color:rgb(55 65 81/var(--tw-border-opacity));--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity))}.content :where(pre):not(:where(.code-block pre,[class~=not-prose],[class~=not-prose] *)){margin-bottom:1rem;overflow-x:auto;border-radius:.75rem;background-color:hsl(var(--primary-hue) var(--primary-saturation) 39%/.05);padding-top:1rem;padding-bottom:1rem;font-size:.9em;font-weight:500;-webkit-font-smoothing:auto;-moz-osx-font-smoothing:auto}@media(prefers-contrast:more){.content :where(pre):not(:where(.code-block pre,[class~=not-prose],[class~=not-prose] *)){border-width:1px;border-color:hsl(var(--primary-hue) var(--primary-saturation) 24%/.2);--tw-contrast:contrast(1.5);filter:var(--tw-blur)var(--tw-brightness)var(--tw-contrast)var(--tw-grayscale)var(--tw-hue-rotate)var(--tw-invert)var(--tw-saturate)var(--tw-sepia)var(--tw-drop-shadow)}}:is(html[class~=dark] .content :where(pre):not(:where(.code-block pre,[class~=not-prose],[class~=not-prose] *))){background-color:hsl(var(--primary-hue) var(--primary-saturation) 77%/.1)}@media(prefers-contrast:more){:is(html[class~=dark] .content :where(pre):not(:where(.code-block pre,[class~=not-prose],[class~=not-prose] *))){border-color:hsl(var(--primary-hue) var(--primary-saturation) 94%/.4)}}.content :where(code):not(:where(.code-block code,[class~=not-prose],[class~=not-prose] *)){overflow-wrap:break-word;border-radius:.375rem;border-width:1px;border-color:rgb(0 0 0/var(--tw-border-opacity));--tw-border-opacity:0.04;background-color:rgb(0 0 0/var(--tw-bg-opacity));--tw-bg-opacity:0.03;padding-top:.125rem;padding-bottom:.125rem;padding-left:.25em;padding-right:.25em;font-size:.9em}:is(html[class~=dark] .content :where(code):not(:where(.code-block code,[class~=not-prose],[class~=not-prose] *))){border-color:rgb(255 255 255/.1);background-color:rgb(255 255 255/.1)}.content :where(table):not(:where(.code-block table,[class~=not-prose],[class~=not-prose] *)){margin-top:1.5rem;display:block;overflow-x:auto;padding:0}.content :where(table):not(:where(.code-block table,[class~=not-prose],[class~=not-prose] *)):first-child{margin-top:0}.content :where(table):not(:where(.code-block table,[class~=not-prose],[class~=not-prose] *)) tr{margin:0;border-top-width:1px;--tw-border-opacity:1;border-color:rgb(209 213 219/var(--tw-border-opacity));padding:0}.content :where(table):not(:where(.code-block table,[class~=not-prose],[class~=not-prose] *)) tr:nth-child(even){--tw-bg-opacity:1;background-color:rgb(243 244 246/var(--tw-bg-opacity))}:is(html[class~=dark] .content :where(table):not(:where(.code-block table,[class~=not-prose],[class~=not-prose] *)) tr){--tw-border-opacity:1;border-color:rgb(75 85 99/var(--tw-border-opacity))}:is(html[class~=dark] .content :where(table):not(:where(.code-block table,[class~=not-prose],[class~=not-prose] *)) tr):nth-child(even){background-color:rgb(75 85 99/.2)}.content :where(table):not(:where(.code-block table,[class~=not-prose],[class~=not-prose] *)) th{margin:0;border-width:1px;--tw-border-opacity:1;border-color:rgb(209 213 219/var(--tw-border-opacity));padding-left:1rem;padding-right:1rem;padding-top:.5rem;padding-bottom:.5rem;font-weight:600}:is(html[class~=dark] .content :where(table):not(:where(.code-block table,[class~=not-prose],[class~=not-prose] *)) th){--tw-border-opacity:1;border-color:rgb(75 85 99/var(--tw-border-opacity))}.content :where(table):not(:where(.code-block table,[class~=not-prose],[class~=not-prose] *)) td{margin:0;border-width:1px;--tw-border-opacity:1;border-color:rgb(209 213 219/var(--tw-border-opacity));padding-left:1rem;padding-right:1rem;padding-top:.5rem;padding-bottom:.5rem}:is(html[class~=dark] .content :where(table):not(:where(.code-block table,[class~=not-prose],[class~=not-prose] *)) td){--tw-border-opacity:1;border-color:rgb(75 85 99/var(--tw-border-opacity))}.content :where(ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.5rem;list-style-type:decimal}.content :where(ol):not(:where([class~=not-prose],[class~=not-prose] *)):first-child{margin-top:0}:is([dir=ltr] .content :where(ol):not(:where([class~=not-prose],[class~=not-prose] *))){margin-left:1.5rem}:is([dir=rtl] .content :where(ol):not(:where([class~=not-prose],[class~=not-prose] *))){margin-right:1.5rem}.content :where(ol):not(:where([class~=not-prose],[class~=not-prose] *)) li{margin-top:.5rem;margin-bottom:.5rem}.content :where(ul):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.5rem;list-style-type:disc}.content :where(ul):not(:where([class~=not-prose],[class~=not-prose] *)):first-child{margin-top:0}:is([dir=ltr] .content :where(ul):not(:where([class~=not-prose],[class~=not-prose] *))){margin-left:1.5rem}:is([dir=rtl] .content :where(ul):not(:where([class~=not-prose],[class~=not-prose] *))){margin-right:1.5rem}.content :where(ul):not(:where([class~=not-prose],[class~=not-prose] *)) li{margin-top:.5rem;margin-bottom:.5rem}.content :where(kbd):not(:where([class~=not-prose],[class~=not-prose] *)){overflow-wrap:break-word;border-radius:.375rem;border-width:1px;border-color:rgb(0 0 0/var(--tw-border-opacity));--tw-border-opacity:0.04;background-color:rgb(0 0 0/var(--tw-bg-opacity));--tw-bg-opacity:0.03;padding-top:.125rem;padding-bottom:.125rem;padding-left:.25em;padding-right:.25em;font-size:.9em}:is(html[class~=dark] .content :where(kbd):not(:where([class~=not-prose],[class~=not-prose] *))){border-color:rgb(255 255 255/.1);background-color:rgb(255 255 255/.1)}.content :where(pre.mermaid):not(:where(.code-block pre,[class~=not-prose],[class~=not-prose] *)){border-radius:0;background-color:transparent}:is(html[class~=dark] .content :where(pre.mermaid):not(:where(.code-block pre,[class~=not-prose],[class~=not-prose] *))){background-color:transparent}.content :where(img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-left:auto;margin-right:auto;margin-top:1rem;margin-bottom:1rem;border-radius:.375rem}.content :where(figure):not(:where([class~=not-prose],[class~=not-prose] *)) figcaption{margin-top:.5rem;display:block;text-align:center;font-size:.875rem;--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity))}:is(html[class~=dark] .content :where(figure):not(:where([class~=not-prose],[class~=not-prose] *)) figcaption){--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity))}.content .footnotes{margin-top:3rem;font-size:.875rem}.subheading-anchor{opacity:0;transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:150ms}:is([dir=ltr] .subheading-anchor){margin-left:.25rem}:is([dir=rtl] .subheading-anchor){margin-right:.25rem}span:target+.subheading-anchor,:hover>.subheading-anchor,.subheading-anchor:focus{opacity:1}span+.subheading-anchor,:hover>.subheading-anchor{text-decoration-line:none!important}.subheading-anchor:after{padding-left:.25rem;padding-right:.25rem;--tw-content:'#';content:var(--tw-content);--tw-text-opacity:1;color:rgb(209 213 219/var(--tw-text-opacity))}:is(html[class~=dark] .subheading-anchor):after{--tw-text-opacity:1;color:rgb(64 64 64/var(--tw-text-opacity))}span:target+.subheading-anchor:after{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity))}:is(html[class~=dark] span:target+.subheading-anchor):after{--tw-text-opacity:1;color:rgb(115 115 115/var(--tw-text-opacity))}article details>summary::-webkit-details-marker{display:none}article details>summary::before{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' class='h-5 w-5' viewBox='0 0 20 20' fill='currentColor'%3E%3Cpath fill-rule='evenodd' d='M7.293 14.707a1 1 0 010-1.414L10.586 10 7.293 6.707a1 1 0 011.414-1.414l4 4a1 1 0 010 1.414l-4 4a1 1 0 01-1.414 0z' clip-rule='evenodd' /%3E%3C/svg%3E");height:1.2em;width:1.2em;vertical-align:-4px}.highlight{}.highlight .chroma .err{color:#a61717;background-color:#e3d2d2}.highlight .chroma .lnlinks{outline:none;text-decoration:none;color:inherit}.highlight .chroma .line{display:flex}.highlight .chroma .k{color:#000;font-weight:700}.highlight .chroma .kc{color:#000;font-weight:700}.highlight .chroma .kd{color:#000;font-weight:700}.highlight .chroma .kn{color:#000;font-weight:700}.highlight .chroma .kp{color:#000;font-weight:700}.highlight .chroma .kr{color:#000;font-weight:700}.highlight .chroma .kt{color:#458;font-weight:700}.highlight .chroma .na{color:teal}.highlight .chroma .nb{color:#0086b3}.highlight .chroma .bp{color:#999}.highlight .chroma .nc{color:#458;font-weight:700}.highlight .chroma .no{color:teal}.highlight .chroma .nd{color:#3c5d5d;font-weight:700}.highlight .chroma .ni{color:purple}.highlight .chroma .ne{color:#900;font-weight:700}.highlight .chroma .nf{color:#900;font-weight:700}.highlight .chroma .nl{color:#900;font-weight:700}.highlight .chroma .nn{color:#555}.highlight .chroma .nt{color:navy}.highlight .chroma .nv{color:teal}.highlight .chroma .vc{color:teal}.highlight .chroma .vg{color:teal}.highlight .chroma .vi{color:teal}.highlight .chroma .s{color:#d14}.highlight .chroma .sa{color:#d14}.highlight .chroma .sb{color:#d14}.highlight .chroma .sc{color:#d14}.highlight .chroma .dl{color:#d14}.highlight .chroma .sd{color:#d14}.highlight .chroma .s2{color:#d14}.highlight .chroma .se{color:#d14}.highlight .chroma .sh{color:#d14}.highlight .chroma .si{color:#d14}.highlight .chroma .sx{color:#d14}.highlight .chroma .sr{color:#009926}.highlight .chroma .s1{color:#d14}.highlight .chroma .ss{color:#990073}.highlight .chroma .m{color:#099}.highlight .chroma .mb{color:#099}.highlight .chroma .mf{color:#099}.highlight .chroma .mh{color:#099}.highlight .chroma .mi{color:#099}.highlight .chroma .il{color:#099}.highlight .chroma .mo{color:#099}.highlight .chroma .o{color:#000;font-weight:700}.highlight .chroma .ow{color:#000;font-weight:700}.highlight .chroma .c{color:#998;font-style:italic}.highlight .chroma .ch{color:#998;font-style:italic}.highlight .chroma .cm{color:#998;font-style:italic}.highlight .chroma .c1{color:#998;font-style:italic}.highlight .chroma .cs{color:#999;font-weight:700;font-style:italic}.highlight .chroma .cp{color:#999;font-weight:700;font-style:italic}.highlight .chroma .cpf{color:#999;font-weight:700;font-style:italic}.highlight .chroma .gd{color:#000;background-color:#fdd}.highlight .chroma .ge{color:#000;font-style:italic}.highlight .chroma .gr{color:#a00}.highlight .chroma .gh{color:#999}.highlight .chroma .gi{color:#000;background-color:#dfd}.highlight .chroma .go{color:#888}.highlight .chroma .gp{color:#555}.highlight .chroma .gs{font-weight:700}.highlight .chroma .gu{color:#aaa}.highlight .chroma .gt{color:#a00}.highlight .chroma .gl{text-decoration:underline}.highlight .chroma .w{color:#bbb}.dark .highlight{}.dark .highlight .chroma .x{}.dark .highlight .chroma .err{color:#f85149}.dark .highlight .chroma .cl{}.dark .highlight .chroma .lnlinks{outline:none;text-decoration:none;color:inherit}.dark .highlight .chroma .line{display:flex}.dark .highlight .chroma .k{color:#ff7b72}.dark .highlight .chroma .kc{color:#79c0ff}.dark .highlight .chroma .kd{color:#ff7b72}.dark .highlight .chroma .kn{color:#ff7b72}.dark .highlight .chroma .kp{color:#79c0ff}.dark .highlight .chroma .kr{color:#ff7b72}.dark .highlight .chroma .kt{color:#ff7b72}.dark .highlight .chroma .n{}.dark .highlight .chroma .na{}.dark .highlight .chroma .nb{}.dark .highlight .chroma .bp{}.dark .highlight .chroma .nc{color:#f0883e;font-weight:700}.dark .highlight .chroma .no{color:#79c0ff;font-weight:700}.dark .highlight .chroma .nd{color:#d2a8ff;font-weight:700}.dark .highlight .chroma .ni{color:#ffa657}.dark .highlight .chroma .ne{color:#f0883e;font-weight:700}.dark .highlight .chroma .nf{color:#d2a8ff;font-weight:700}.dark .highlight .chroma .fm{}.dark .highlight .chroma .nl{color:#79c0ff;font-weight:700}.dark .highlight .chroma .nn{color:#ff7b72}.dark .highlight .chroma .nx{}.dark .highlight .chroma .py{color:#79c0ff}.dark .highlight .chroma .nt{color:#7ee787}.dark .highlight .chroma .nv{color:#79c0ff}.dark .highlight .chroma .vc{}.dark .highlight .chroma .vg{}.dark .highlight .chroma .vi{}.dark .highlight .chroma .vm{}.dark .highlight .chroma .l{color:#a5d6ff}.dark .highlight .chroma .ld{color:#79c0ff}.dark .highlight .chroma .s{color:#a5d6ff}.dark .highlight .chroma .sa{color:#79c0ff}.dark .highlight .chroma .sb{color:#a5d6ff}.dark .highlight .chroma .sc{color:#a5d6ff}.dark .highlight .chroma .dl{color:#79c0ff}.dark .highlight .chroma .sd{color:#a5d6ff}.dark .highlight .chroma .s2{color:#a5d6ff}.dark .highlight .chroma .se{color:#79c0ff}.dark .highlight .chroma .sh{color:#79c0ff}.dark .highlight .chroma .si{color:#a5d6ff}.dark .highlight .chroma .sx{color:#a5d6ff}.dark .highlight .chroma .sr{color:#79c0ff}.dark .highlight .chroma .s1{color:#a5d6ff}.dark .highlight .chroma .ss{color:#a5d6ff}.dark .highlight .chroma .m{color:#a5d6ff}.dark .highlight .chroma .mb{color:#a5d6ff}.dark .highlight .chroma .mf{color:#a5d6ff}.dark .highlight .chroma .mh{color:#a5d6ff}.dark .highlight .chroma .mi{color:#a5d6ff}.dark .highlight .chroma .il{color:#a5d6ff}.dark .highlight .chroma .mo{color:#a5d6ff}.dark .highlight .chroma .o{color:#ff7b72;font-weight:700}.dark .highlight .chroma .ow{color:#ff7b72;font-weight:700}.dark .highlight .chroma .p{}.dark .highlight .chroma .c{color:#8b949e;font-style:italic}.dark .highlight .chroma .ch{color:#8b949e;font-style:italic}.dark .highlight .chroma .cm{color:#8b949e;font-style:italic}.dark .highlight .chroma .c1{color:#8b949e;font-style:italic}.dark .highlight .chroma .cs{color:#8b949e;font-weight:700;font-style:italic}.dark .highlight .chroma .cp{color:#8b949e;font-weight:700;font-style:italic}.dark .highlight .chroma .cpf{color:#8b949e;font-weight:700;font-style:italic}.dark .highlight .chroma .g{}.dark .highlight .chroma .gd{color:#ffa198;background-color:#490202}.dark .highlight .chroma .ge{font-style:italic}.dark .highlight .chroma .gr{color:#ffa198}.dark .highlight .chroma .gh{color:#79c0ff;font-weight:700}.dark .highlight .chroma .gi{color:#56d364;background-color:#0f5323}.dark .highlight .chroma .go{color:#8b949e}.dark .highlight .chroma .gp{color:#8b949e}.dark .highlight .chroma .gs{font-weight:700}.dark .highlight .chroma .gu{color:#79c0ff}.dark .highlight .chroma .gt{color:#ff7b72}.dark .highlight .chroma .gl{text-decoration:underline}.dark .highlight .chroma .w{color:#6e7681}.code-block{font-size:.9em;line-height:1.25rem}.code-block pre{overflow-x:auto;background-color:hsl(var(--primary-hue) var(--primary-saturation) 39%/.05);font-size:.9em;font-weight:500;-webkit-font-smoothing:auto;-moz-osx-font-smoothing:auto}@media(prefers-contrast:more){.code-block pre{border-width:1px;border-color:hsl(var(--primary-hue) var(--primary-saturation) 24%/.2);--tw-contrast:contrast(1.5);filter:var(--tw-blur)var(--tw-brightness)var(--tw-contrast)var(--tw-grayscale)var(--tw-hue-rotate)var(--tw-invert)var(--tw-saturate)var(--tw-sepia)var(--tw-drop-shadow)}}:is(html[class~=dark] .code-block pre){background-color:hsl(var(--primary-hue) var(--primary-saturation) 77%/.1)}@media(prefers-contrast:more){:is(html[class~=dark] .code-block pre){border-color:hsl(var(--primary-hue) var(--primary-saturation) 94%/.4)}}.code-block .filename{position:absolute;top:0;z-index:1;width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;border-top-left-radius:.75rem;border-top-right-radius:.75rem;background-color:hsl(var(--primary-hue) var(--primary-saturation) 39%/.05);padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;padding-right:1rem;font-size:.75rem;--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity))}:is(html[class~=dark] .code-block .filename){background-color:hsl(var(--primary-hue) var(--primary-saturation) 77%/.1);--tw-text-opacity:1;color:rgb(229 231 235/var(--tw-text-opacity))}.code-block pre:not(.lntable pre){margin-bottom:1rem;border-radius:.75rem;padding-left:1rem;padding-right:1rem;padding-top:1rem;padding-bottom:1rem}.code-block div:nth-of-type(2) pre{padding-top:3rem;padding-bottom:1rem}.chroma .lntable{margin:0;display:block;width:auto;overflow:auto;border-radius:.75rem}.chroma .lntable pre{padding-top:1rem;padding-bottom:1rem}.chroma .ln,.chroma .lnt:not(.hl>.lnt),.chroma .hl:not(.line){min-width:2.6rem;padding-left:1rem;padding-right:1rem;--tw-text-opacity:1;color:rgb(82 82 82/var(--tw-text-opacity))}:is(html[class~=dark] .chroma .ln),:is(html[class~=dark] .chroma .lnt:not(.hl>.lnt)),:is(html[class~=dark] .chroma .hl:not(.line)){--tw-text-opacity:1;color:rgb(212 212 212/var(--tw-text-opacity))}.chroma .lntd{padding:0;vertical-align:top}.chroma .lntd:last-of-type{width:100%}.chroma .hl{display:block;width:100%;background-color:hsl(var(--primary-hue) var(--primary-saturation) 32%/.1)}.hextra-cards{grid-template-columns:repeat(auto-fill,minmax(max(250px,calc((100% - 1rem * 2)/var(--rows))),1fr))}.hextra-card img{-webkit-user-select:none;-moz-user-select:none;user-select:none}.hextra-card:hover svg{color:currentColor}.hextra-card svg{width:1.5rem;color:#0003;transition:color .3s ease}.hextra-card p{margin-top:.5rem}.dark .hextra-card svg{color:#fff6}.dark .hextra-card:hover svg{color:currentColor}.steps h3{counter-increment:step}.steps h3:before{position:absolute;height:33px;width:33px;border-width:4px;--tw-border-opacity:1;border-color:rgb(255 255 255/var(--tw-border-opacity));--tw-bg-opacity:1;background-color:rgb(243 244 246/var(--tw-bg-opacity))}:is(html[class~=dark] .steps h3):before{--tw-border-opacity:1;border-color:rgb(17 17 17/var(--tw-border-opacity));--tw-bg-opacity:1;background-color:rgb(38 38 38/var(--tw-bg-opacity))}.steps h3:before{border-radius:9999px;text-align:center;text-indent:-1px;font-size:1rem;font-weight:400;--tw-text-opacity:1;color:rgb(163 163 163/var(--tw-text-opacity));margin-top:3px;margin-left:-41px;content:counter(step)}.search-wrapper li{margin-left:.625rem;margin-right:.625rem;overflow-wrap:break-word;border-radius:.375rem;--tw-text-opacity:1;color:rgb(31 41 55/var(--tw-text-opacity))}@media(prefers-contrast:more){.search-wrapper li{border-width:1px;border-color:transparent}}:is(html[class~=dark] .search-wrapper li){--tw-text-opacity:1;color:rgb(209 213 219/var(--tw-text-opacity))}.search-wrapper li a{display:block;scroll-margin:3rem;padding-left:.625rem;padding-right:.625rem;padding-top:.5rem;padding-bottom:.5rem}.search-wrapper li .title{font-size:1rem;font-weight:600;line-height:1.25rem}.search-wrapper li .active{border-radius:.375rem;background-color:hsl(var(--primary-hue) var(--primary-saturation) 50%/.1)}@media(prefers-contrast:more){.search-wrapper li .active{--tw-border-opacity:1;border-color:hsl(var(--primary-hue) var(--primary-saturation) 50%/var(--tw-border-opacity))}}.search-wrapper .no-result{display:block;-webkit-user-select:none;-moz-user-select:none;user-select:none;padding:2rem;text-align:center;font-size:.875rem;--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity))}.search-wrapper .prefix{margin-left:.625rem;margin-right:.625rem;margin-bottom:.5rem;margin-top:1.5rem;-webkit-user-select:none;-moz-user-select:none;user-select:none;border-bottom-width:1px;border-color:rgb(0 0 0/.1);padding-left:.625rem;padding-right:.625rem;padding-bottom:.375rem;font-size:.75rem;font-weight:600;text-transform:uppercase;--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity))}.search-wrapper .prefix:first-child{margin-top:0}@media(prefers-contrast:more){.search-wrapper .prefix{--tw-border-opacity:1;border-color:rgb(75 85 99/var(--tw-border-opacity));--tw-text-opacity:1;color:rgb(17 24 39/var(--tw-text-opacity))}}:is(html[class~=dark] .search-wrapper .prefix){border-color:rgb(255 255 255/.2);--tw-text-opacity:1;color:rgb(209 213 219/var(--tw-text-opacity))}@media(prefers-contrast:more){:is(html[class~=dark] .search-wrapper .prefix){--tw-border-opacity:1;border-color:rgb(249 250 251/var(--tw-border-opacity));--tw-text-opacity:1;color:rgb(249 250 251/var(--tw-text-opacity))}}.search-wrapper .excerpt{margin-top:.25rem;overflow:hidden;text-overflow:ellipsis;font-size:.875rem;line-height:1.35rem;--tw-text-opacity:1;color:rgb(75 85 99/var(--tw-text-opacity))}:is(html[class~=dark] .search-wrapper .excerpt){--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity))}@media(prefers-contrast:more){:is(html[class~=dark] .search-wrapper .excerpt){--tw-text-opacity:1;color:rgb(249 250 251/var(--tw-text-opacity))}}.search-wrapper .excerpt{display:-webkit-box;line-clamp:1;-webkit-line-clamp:1;-webkit-box-orient:vertical}.search-wrapper .match{--tw-text-opacity:1;color:hsl(var(--primary-hue) var(--primary-saturation) 45%/var(--tw-text-opacity))}@media(max-width:767px){.sidebar-container{position:fixed;top:0;bottom:0;z-index:15;width:100%;overscroll-behavior:contain;--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity));padding-top:calc(var(--navbar-height))}:is(html[class~=dark] .sidebar-container){--tw-bg-opacity:1;background-color:rgb(17 17 17/var(--tw-bg-opacity))}.sidebar-container{transition:transform .8s cubic-bezier(.52,.16,.04,1);will-change:transform,opacity;contain:layout style;backface-visibility:hidden}}.sidebar-container li>div{height:0}.sidebar-container li.open>div{height:auto;padding-top:.25rem}.sidebar-container li.open>a>span>svg>path{--tw-rotate:90deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y))rotate(var(--tw-rotate))skewX(var(--tw-skew-x))skewY(var(--tw-skew-y))scaleX(var(--tw-scale-x))scaleY(var(--tw-scale-y))}nav .search-wrapper{display:none}@media(min-width:768px){nav .search-wrapper{display:inline-block}}@supports(((-webkit-backdrop-filter:blur(1px)) or (backdrop-filter:blur(1px)))){.nav-container-blur{background-color:rgb(255 255 255/.85);--tw-backdrop-blur:blur(12px);-webkit-backdrop-filter:var(--tw-backdrop-blur)var(--tw-backdrop-brightness)var(--tw-backdrop-contrast)var(--tw-backdrop-grayscale)var(--tw-backdrop-hue-rotate)var(--tw-backdrop-invert)var(--tw-backdrop-opacity)var(--tw-backdrop-saturate)var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur)var(--tw-backdrop-brightness)var(--tw-backdrop-contrast)var(--tw-backdrop-grayscale)var(--tw-backdrop-hue-rotate)var(--tw-backdrop-invert)var(--tw-backdrop-opacity)var(--tw-backdrop-saturate)var(--tw-backdrop-sepia)}:is(html[class~=dark] .nav-container-blur){background-color:rgb(17 17 17/.8)!important}}.hamburger-menu svg g{transform-origin:center;transition:transform .2s cubic-bezier(.25,1,.5,1)}.hamburger-menu svg path{opacity:1;transition:transform .2s cubic-bezier(.25,1,.5,1).2s,opacity .2s ease .2s}.hamburger-menu svg.open path{transition:transform .2s cubic-bezier(.25,1,.5,1),opacity 0s ease .2s}.hamburger-menu svg.open g{transition:transform .2s cubic-bezier(.25,1,.5,1).2s}.hamburger-menu svg.open>path{opacity:0}.hamburger-menu svg.open>g:nth-of-type(1){--tw-rotate:45deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y))rotate(var(--tw-rotate))skewX(var(--tw-skew-x))skewY(var(--tw-skew-y))scaleX(var(--tw-scale-x))scaleY(var(--tw-scale-y))}.hamburger-menu svg.open>g:nth-of-type(1) path{transform:translate3d(0,4px,0)}.hamburger-menu svg.open>g:nth-of-type(2){--tw-rotate:-45deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y))rotate(var(--tw-rotate))skewX(var(--tw-skew-x))skewY(var(--tw-skew-y))scaleX(var(--tw-scale-x))scaleY(var(--tw-scale-y))}.hamburger-menu svg.open>g:nth-of-type(2) path{transform:translate3d(0,-4px,0)}.hextra-scrollbar{scrollbar-width:thin;scrollbar-color:oklch(55.55% 0 0/40%)transparent;scrollbar-gutter:stable}.hextra-scrollbar::-webkit-scrollbar{height:.75rem;width:.75rem}.hextra-scrollbar::-webkit-scrollbar-track{background-color:transparent}.hextra-scrollbar::-webkit-scrollbar-thumb{border-radius:10px}.hextra-scrollbar:hover::-webkit-scrollbar-thumb{border:3px solid transparent;background-color:var(--tw-shadow-color);background-clip:content-box;--tw-shadow-color:rgb(115 115 115 / 0.2);--tw-shadow:var(--tw-shadow-colored)}.hextra-scrollbar:hover::-webkit-scrollbar-thumb:hover{--tw-shadow-color:rgb(115 115 115 / 0.4);--tw-shadow:var(--tw-shadow-colored)}@supports(((-webkit-backdrop-filter:blur(1px)) or (backdrop-filter:blur(1px)))){.code-copy-btn{--tw-bg-opacity:.85;--tw-backdrop-blur:blur(12px);-webkit-backdrop-filter:var(--tw-backdrop-blur)var(--tw-backdrop-brightness)var(--tw-backdrop-contrast)var(--tw-backdrop-grayscale)var(--tw-backdrop-hue-rotate)var(--tw-backdrop-invert)var(--tw-backdrop-opacity)var(--tw-backdrop-saturate)var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur)var(--tw-backdrop-brightness)var(--tw-backdrop-contrast)var(--tw-backdrop-grayscale)var(--tw-backdrop-hue-rotate)var(--tw-backdrop-invert)var(--tw-backdrop-opacity)var(--tw-backdrop-saturate)var(--tw-backdrop-sepia)}:is(html[class~=dark] .code-copy-btn){--tw-bg-opacity:0.8}}html{font-size:1rem;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-feature-settings:"rlig" 1,"calt" 1,"ss01" 1;-webkit-tap-highlight-color:transparent}body{width:100%;--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity))}:is(html[class~=dark] body){--tw-bg-opacity:1;background-color:rgb(17 17 17/var(--tw-bg-opacity));--tw-text-opacity:1;color:rgb(243 244 246/var(--tw-text-opacity))}:root{--primary-hue:212deg;--primary-saturation:100%;--navbar-height:4rem;--menu-height:3.75rem}.dark{--primary-hue:204deg;--primary-saturation:100%}.placeholder\:text-gray-500::-moz-placeholder{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity))}.placeholder\:text-gray-500::placeholder{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity))}.before\:pointer-events-none::before{content:var(--tw-content);pointer-events:none}.before\:absolute::before{content:var(--tw-content);position:absolute}.before\:inset-0::before{content:var(--tw-content);inset:0}.before\:inset-y-1::before{content:var(--tw-content);top:.25rem;bottom:.25rem}.before\:mr-1::before{content:var(--tw-content);margin-right:.25rem}.before\:inline-block::before{content:var(--tw-content);display:inline-block}.before\:w-px::before{content:var(--tw-content);width:1px}.before\:bg-gray-200::before{content:var(--tw-content);--tw-bg-opacity:1;background-color:rgb(229 231 235/var(--tw-bg-opacity))}.before\:opacity-25::before{content:var(--tw-content);opacity:.25}.before\:transition-transform::before{content:var(--tw-content);transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:150ms}.before\:content-\[\'\#\'\]::before{--tw-content:'#';content:var(--tw-content)}.before\:content-\[\'\'\]::before{--tw-content:'';content:var(--tw-content)}.before\:content-\[\\\"\\\"\]::before{--tw-content:\"\";content:var(--tw-content)}.first\:mt-0:first-child{margin-top:0}.last-of-type\:mb-0:last-of-type{margin-bottom:0}.hover\:border-gray-200:hover{--tw-border-opacity:1;border-color:rgb(229 231 235/var(--tw-border-opacity))}.hover\:border-gray-300:hover{--tw-border-opacity:1;border-color:rgb(209 213 219/var(--tw-border-opacity))}.hover\:border-gray-400:hover{--tw-border-opacity:1;border-color:rgb(156 163 175/var(--tw-border-opacity))}.hover\:border-gray-900:hover{--tw-border-opacity:1;border-color:rgb(17 24 39/var(--tw-border-opacity))}.hover\:bg-gray-100:hover{--tw-bg-opacity:1;background-color:rgb(243 244 246/var(--tw-bg-opacity))}.hover\:bg-gray-800\/5:hover{background-color:rgb(31 41 55/5%)}.hover\:bg-primary-50:hover{--tw-bg-opacity:1;background-color:hsl(var(--primary-hue) var(--primary-saturation) 97%/var(--tw-bg-opacity))}.hover\:bg-primary-700:hover{--tw-bg-opacity:1;background-color:hsl(var(--primary-hue) var(--primary-saturation) 39%/var(--tw-bg-opacity))}.hover\:bg-slate-50:hover{--tw-bg-opacity:1;background-color:rgb(248 250 252/var(--tw-bg-opacity))}.hover\:text-black:hover{--tw-text-opacity:1;color:rgb(0 0 0/var(--tw-text-opacity))}.hover\:text-gray-800:hover{--tw-text-opacity:1;color:rgb(31 41 55/var(--tw-text-opacity))}.hover\:text-gray-900:hover{--tw-text-opacity:1;color:rgb(17 24 39/var(--tw-text-opacity))}.hover\:text-primary-600:hover{--tw-text-opacity:1;color:hsl(var(--primary-hue) var(--primary-saturation) 45%/var(--tw-text-opacity))}.hover\:opacity-60:hover{opacity:.6}.hover\:opacity-75:hover{opacity:.75}.hover\:shadow-lg:hover{--tw-shadow:0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.hover\:shadow-md:hover{--tw-shadow:0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.hover\:shadow-gray-100:hover{--tw-shadow-color:#f3f4f6;--tw-shadow:var(--tw-shadow-colored)}.focus\:bg-white:focus{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity))}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:ring-4:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.focus\:ring-primary-300:focus{--tw-ring-opacity:1;--tw-ring-color:hsl(var(--primary-hue) var(--primary-saturation) 77% / var(--tw-ring-opacity))}.active\:bg-gray-400\/20:active{background-color:rgb(156 163 175/.2)}.active\:opacity-50:active{opacity:.5}.active\:shadow-sm:active{--tw-shadow:0 1px 2px 0 rgb(0 0 0 / 0.05);--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.active\:shadow-gray-200:active{--tw-shadow-color:#e5e7eb;--tw-shadow:var(--tw-shadow-colored)}.group[open] .group-open\:before\:rotate-90::before{content:var(--tw-content);--tw-rotate:90deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y))rotate(var(--tw-rotate))skewX(var(--tw-skew-x))skewY(var(--tw-skew-y))scaleX(var(--tw-scale-x))scaleY(var(--tw-scale-y))}.group:hover .group-hover\:underline{text-decoration-line:underline}.group\/code:hover .group-hover\/code\:opacity-100{opacity:1}.group\/copybtn.copied .group-\[\.copied\]\/copybtn\:block{display:block}.group\/copybtn.copied .group-\[\.copied\]\/copybtn\:hidden{display:none}.data-\[state\=selected\]\:block[data-state=selected]{display:block}.data-\[state\=closed\]\:hidden[data-state=closed]{display:none}.data-\[state\=open\]\:hidden[data-state=open]{display:none}.data-\[state\=selected\]\:border-primary-500[data-state=selected]{--tw-border-opacity:1;border-color:hsl(var(--primary-hue) var(--primary-saturation) 50%/var(--tw-border-opacity))}.data-\[state\=selected\]\:text-primary-600[data-state=selected]{--tw-text-opacity:1;color:hsl(var(--primary-hue) var(--primary-saturation) 45%/var(--tw-text-opacity))}.group[data-theme=dark] .group-data-\[theme\=dark\]\:hidden{display:none}.group[data-theme=light] .group-data-\[theme\=light\]\:hidden{display:none}:is([dir=ltr] .ltr\:right-1){right:.25rem}:is([dir=ltr] .ltr\:right-1\.5){right:.375rem}:is([dir=ltr] .ltr\:right-3){right:.75rem}:is([dir=ltr] .ltr\:-mr-4){margin-right:-1rem}:is([dir=ltr] .ltr\:ml-3){margin-left:.75rem}:is([dir=ltr] .ltr\:ml-auto){margin-left:auto}:is([dir=ltr] .ltr\:mr-auto){margin-right:auto}:is([dir=ltr] .ltr\:rotate-180){--tw-rotate:180deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y))rotate(var(--tw-rotate))skewX(var(--tw-skew-x))skewY(var(--tw-skew-y))scaleX(var(--tw-scale-x))scaleY(var(--tw-scale-y))}:is([dir=ltr] .ltr\:pl-12){padding-left:3rem}:is([dir=ltr] .ltr\:pl-16){padding-left:4rem}:is([dir=ltr] .ltr\:pl-3){padding-left:.75rem}:is([dir=ltr] .ltr\:pl-4){padding-left:1rem}:is([dir=ltr] .ltr\:pl-8){padding-left:2rem}:is([dir=ltr] .ltr\:pr-0){padding-right:0}:is([dir=ltr] .ltr\:pr-2){padding-right:.5rem}:is([dir=ltr] .ltr\:pr-4){padding-right:1rem}:is([dir=ltr] .ltr\:pr-9){padding-right:2.25rem}:is([dir=ltr] .ltr\:text-right){text-align:right}:is([dir=ltr] .ltr\:before\:left-0)::before{content:var(--tw-content);left:0}:is([dir=rtl] .rtl\:left-1){left:.25rem}:is([dir=rtl] .rtl\:left-1\.5){left:.375rem}:is([dir=rtl] .rtl\:left-3){left:.75rem}:is([dir=rtl] .rtl\:-ml-4){margin-left:-1rem}:is([dir=rtl] .rtl\:ml-auto){margin-left:auto}:is([dir=rtl] .rtl\:mr-3){margin-right:.75rem}:is([dir=rtl] .rtl\:mr-auto){margin-right:auto}:is([dir=rtl] .rtl\:-rotate-180){--tw-rotate:-180deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y))rotate(var(--tw-rotate))skewX(var(--tw-skew-x))skewY(var(--tw-skew-y))scaleX(var(--tw-scale-x))scaleY(var(--tw-scale-y))}:is([dir=rtl] .rtl\:pl-2){padding-left:.5rem}:is([dir=rtl] .rtl\:pl-4){padding-left:1rem}:is([dir=rtl] .rtl\:pl-9){padding-left:2.25rem}:is([dir=rtl] .rtl\:pr-12){padding-right:3rem}:is([dir=rtl] .rtl\:pr-16){padding-right:4rem}:is([dir=rtl] .rtl\:pr-3){padding-right:.75rem}:is([dir=rtl] .rtl\:pr-4){padding-right:1rem}:is([dir=rtl] .rtl\:pr-8){padding-right:2rem}:is([dir=rtl] .rtl\:text-left){text-align:left}:is([dir=rtl] .rtl\:before\:right-0)::before{content:var(--tw-content);right:0}:is([dir=rtl] .rtl\:before\:rotate-180)::before{content:var(--tw-content);--tw-rotate:180deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y))rotate(var(--tw-rotate))skewX(var(--tw-skew-x))skewY(var(--tw-skew-y))scaleX(var(--tw-scale-x))scaleY(var(--tw-scale-y))}@media(prefers-contrast:more){.contrast-more\:border{border-width:1px}.contrast-more\:border-t{border-top-width:1px}.contrast-more\:border-current{border-color:initial}.contrast-more\:border-gray-800{--tw-border-opacity:1;border-color:rgb(31 41 55/var(--tw-border-opacity))}.contrast-more\:border-gray-900{--tw-border-opacity:1;border-color:rgb(17 24 39/var(--tw-border-opacity))}.contrast-more\:border-neutral-400{--tw-border-opacity:1;border-color:rgb(163 163 163/var(--tw-border-opacity))}.contrast-more\:border-primary-500{--tw-border-opacity:1;border-color:hsl(var(--primary-hue) var(--primary-saturation) 50%/var(--tw-border-opacity))}.contrast-more\:border-transparent{border-color:transparent}.contrast-more\:font-bold{font-weight:700}.contrast-more\:text-current{color:currentColor}.contrast-more\:text-gray-700{--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity))}.contrast-more\:text-gray-800{--tw-text-opacity:1;color:rgb(31 41 55/var(--tw-text-opacity))}.contrast-more\:text-gray-900{--tw-text-opacity:1;color:rgb(17 24 39/var(--tw-text-opacity))}.contrast-more\:underline{text-decoration-line:underline}.contrast-more\:shadow-\[0_0_0_1px_\#000\]{--tw-shadow:0 0 0 1px #000;--tw-shadow-colored:0 0 0 1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.contrast-more\:shadow-none{--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.contrast-more\:hover\:border-gray-900:hover{--tw-border-opacity:1;border-color:rgb(17 24 39/var(--tw-border-opacity))}}:is(html[class~=dark] .dark\:block){display:block}:is(html[class~=dark] .dark\:hidden){display:none}:is(html[class~=dark] .dark\:border-blue-200\/30){border-color:rgb(191 219 254/.3)}:is(html[class~=dark] .dark\:border-gray-100\/20){border-color:rgb(243 244 246/.2)}:is(html[class~=dark] .dark\:border-gray-400){--tw-border-opacity:1;border-color:rgb(156 163 175/var(--tw-border-opacity))}:is(html[class~=dark] .dark\:border-neutral-700){--tw-border-opacity:1;border-color:rgb(64 64 64/var(--tw-border-opacity))}:is(html[class~=dark] .dark\:border-neutral-800){--tw-border-opacity:1;border-color:rgb(38 38 38/var(--tw-border-opacity))}:is(html[class~=dark] .dark\:border-orange-400\/30){border-color:rgb(251 146 60/.3)}:is(html[class~=dark] .dark\:border-red-200\/30){border-color:rgb(254 202 202/.3)}:is(html[class~=dark] .dark\:border-white\/10){border-color:rgb(255 255 255/.1)}:is(html[class~=dark] .dark\:border-yellow-200\/30){border-color:rgb(254 240 138/.3)}:is(html[class~=dark] .dark\:bg-black\/60){background-color:rgb(0 0 0/.6)}:is(html[class~=dark] .dark\:bg-blue-900\/30){background-color:rgb(30 58 138/.3)}:is(html[class~=dark] .dark\:bg-dark){--tw-bg-opacity:1;background-color:rgb(17 17 17/var(--tw-bg-opacity))}:is(html[class~=dark] .dark\:bg-dark\/50){background-color:rgb(17 17 17/.5)}:is(html[class~=dark] .dark\:bg-gray-50\/10){background-color:rgb(249 250 251/.1)}:is(html[class~=dark] .dark\:bg-neutral-800){--tw-bg-opacity:1;background-color:rgb(38 38 38/var(--tw-bg-opacity))}:is(html[class~=dark] .dark\:bg-neutral-900){--tw-bg-opacity:1;background-color:rgb(23 23 23/var(--tw-bg-opacity))}:is(html[class~=dark] .dark\:bg-orange-400\/20){background-color:rgb(251 146 60/.2)}:is(html[class~=dark] .dark\:bg-primary-300\/10){background-color:hsl(var(--primary-hue) var(--primary-saturation) 77%/.1)}:is(html[class~=dark] .dark\:bg-primary-400\/10){background-color:hsl(var(--primary-hue) var(--primary-saturation) 66%/.1)}:is(html[class~=dark] .dark\:bg-primary-600){--tw-bg-opacity:1;background-color:hsl(var(--primary-hue) var(--primary-saturation) 45%/var(--tw-bg-opacity))}:is(html[class~=dark] .dark\:bg-red-900\/30){background-color:rgb(127 29 29/.3)}:is(html[class~=dark] .dark\:bg-yellow-700\/30){background-color:rgb(161 98 7/.3)}:is(html[class~=dark] .dark\:from-gray-100){--tw-gradient-from:#f3f4f6 var(--tw-gradient-from-position);--tw-gradient-to:rgb(243 244 246 / 0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from), var(--tw-gradient-to)}:is(html[class~=dark] .dark\:to-gray-400){--tw-gradient-to:#9ca3af var(--tw-gradient-to-position)}:is(html[class~=dark] .dark\:text-blue-200){--tw-text-opacity:1;color:rgb(191 219 254/var(--tw-text-opacity))}:is(html[class~=dark] .dark\:text-gray-100){--tw-text-opacity:1;color:rgb(243 244 246/var(--tw-text-opacity))}:is(html[class~=dark] .dark\:text-gray-200){--tw-text-opacity:1;color:rgb(229 231 235/var(--tw-text-opacity))}:is(html[class~=dark] .dark\:text-gray-300){--tw-text-opacity:1;color:rgb(209 213 219/var(--tw-text-opacity))}:is(html[class~=dark] .dark\:text-gray-400){--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity))}:is(html[class~=dark] .dark\:text-gray-50){--tw-text-opacity:1;color:rgb(249 250 251/var(--tw-text-opacity))}:is(html[class~=dark] .dark\:text-neutral-200){--tw-text-opacity:1;color:rgb(229 229 229/var(--tw-text-opacity))}:is(html[class~=dark] .dark\:text-neutral-400){--tw-text-opacity:1;color:rgb(163 163 163/var(--tw-text-opacity))}:is(html[class~=dark] .dark\:text-orange-300){--tw-text-opacity:1;color:rgb(253 186 116/var(--tw-text-opacity))}:is(html[class~=dark] .dark\:text-primary-600){--tw-text-opacity:1;color:hsl(var(--primary-hue) var(--primary-saturation) 45%/var(--tw-text-opacity))}:is(html[class~=dark] .dark\:text-red-200){--tw-text-opacity:1;color:rgb(254 202 202/var(--tw-text-opacity))}:is(html[class~=dark] .dark\:text-slate-100){--tw-text-opacity:1;color:rgb(241 245 249/var(--tw-text-opacity))}:is(html[class~=dark] .dark\:text-yellow-200){--tw-text-opacity:1;color:rgb(254 240 138/var(--tw-text-opacity))}:is(html[class~=dark] .dark\:opacity-80){opacity:.8}:is(html[class~=dark] .dark\:shadow-\[0_-12px_16px_\#111\]){--tw-shadow:0 -12px 16px #111;--tw-shadow-colored:0 -12px 16px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}:is(html[class~=dark] .dark\:shadow-\[0_-1px_0_rgba\(255\2c 255\2c 255\2c \.1\)_inset\]){--tw-shadow:0 -1px 0 rgba(255,255,255,.1) inset;--tw-shadow-colored:inset 0 -1px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}:is(html[class~=dark] .dark\:shadow-none){--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}:is(html[class~=dark] .dark\:ring-white\/20){--tw-ring-color:rgb(255 255 255 / 0.2)}:is(html[class~=dark] .dark\:placeholder\:text-gray-400)::-moz-placeholder{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity))}:is(html[class~=dark] .dark\:placeholder\:text-gray-400)::placeholder{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity))}:is(html[class~=dark] .dark\:before\:bg-neutral-800)::before{content:var(--tw-content);--tw-bg-opacity:1;background-color:rgb(38 38 38/var(--tw-bg-opacity))}:is(html[class~=dark] .dark\:before\:invert)::before{content:var(--tw-content);--tw-invert:invert(100%);filter:var(--tw-blur)var(--tw-brightness)var(--tw-contrast)var(--tw-grayscale)var(--tw-hue-rotate)var(--tw-invert)var(--tw-saturate)var(--tw-sepia)var(--tw-drop-shadow)}:is(html[class~=dark] .dark\:hover\:border-gray-100:hover){--tw-border-opacity:1;border-color:rgb(243 244 246/var(--tw-border-opacity))}:is(html[class~=dark] .dark\:hover\:border-gray-600:hover){--tw-border-opacity:1;border-color:rgb(75 85 99/var(--tw-border-opacity))}:is(html[class~=dark] .dark\:hover\:border-neutral-500:hover){--tw-border-opacity:1;border-color:rgb(115 115 115/var(--tw-border-opacity))}:is(html[class~=dark] .dark\:hover\:border-neutral-700:hover){--tw-border-opacity:1;border-color:rgb(64 64 64/var(--tw-border-opacity))}:is(html[class~=dark] .dark\:hover\:border-neutral-800:hover){--tw-border-opacity:1;border-color:rgb(38 38 38/var(--tw-border-opacity))}:is(html[class~=dark] .dark\:hover\:bg-gray-100\/5:hover){background-color:rgb(243 244 246/5%)}:is(html[class~=dark] .dark\:hover\:bg-neutral-700:hover){--tw-bg-opacity:1;background-color:rgb(64 64 64/var(--tw-bg-opacity))}:is(html[class~=dark] .dark\:hover\:bg-neutral-800:hover){--tw-bg-opacity:1;background-color:rgb(38 38 38/var(--tw-bg-opacity))}:is(html[class~=dark] .dark\:hover\:bg-neutral-900:hover){--tw-bg-opacity:1;background-color:rgb(23 23 23/var(--tw-bg-opacity))}:is(html[class~=dark] .dark\:hover\:bg-primary-100\/5:hover){background-color:hsl(var(--primary-hue) var(--primary-saturation) 94%/.05)}:is(html[class~=dark] .dark\:hover\:bg-primary-700:hover){--tw-bg-opacity:1;background-color:hsl(var(--primary-hue) var(--primary-saturation) 39%/var(--tw-bg-opacity))}:is(html[class~=dark] .hover\:dark\:bg-primary-500\/10):hover{background-color:hsl(var(--primary-hue) var(--primary-saturation) 50%/.1)}:is(html[class~=dark] .dark\:hover\:text-gray-100:hover){--tw-text-opacity:1;color:rgb(243 244 246/var(--tw-text-opacity))}:is(html[class~=dark] .dark\:hover\:text-gray-200:hover){--tw-text-opacity:1;color:rgb(229 231 235/var(--tw-text-opacity))}:is(html[class~=dark] .dark\:hover\:text-gray-300:hover){--tw-text-opacity:1;color:rgb(209 213 219/var(--tw-text-opacity))}:is(html[class~=dark] .dark\:hover\:text-gray-50:hover){--tw-text-opacity:1;color:rgb(249 250 251/var(--tw-text-opacity))}:is(html[class~=dark] .dark\:hover\:text-neutral-50:hover){--tw-text-opacity:1;color:rgb(250 250 250/var(--tw-text-opacity))}:is(html[class~=dark] .dark\:hover\:text-white:hover){--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}:is(html[class~=dark] .hover\:dark\:text-primary-600):hover{--tw-text-opacity:1;color:hsl(var(--primary-hue) var(--primary-saturation) 45%/var(--tw-text-opacity))}:is(html[class~=dark] .dark\:hover\:shadow-none:hover){--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}:is(html[class~=dark] .dark\:focus\:bg-dark:focus){--tw-bg-opacity:1;background-color:rgb(17 17 17/var(--tw-bg-opacity))}:is(html[class~=dark] .dark\:focus\:ring-primary-800:focus){--tw-ring-opacity:1;--tw-ring-color:hsl(var(--primary-hue) var(--primary-saturation) 32% / var(--tw-ring-opacity))}@media(prefers-contrast:more){:is(html[class~=dark] .contrast-more\:dark\:border-current){border-color:initial}:is(html[class~=dark] .contrast-more\:dark\:border-gray-50){--tw-border-opacity:1;border-color:rgb(249 250 251/var(--tw-border-opacity))}:is(html[class~=dark] .contrast-more\:dark\:border-neutral-400){--tw-border-opacity:1;border-color:rgb(163 163 163/var(--tw-border-opacity))}:is(html[class~=dark] .contrast-more\:dark\:border-primary-500){--tw-border-opacity:1;border-color:hsl(var(--primary-hue) var(--primary-saturation) 50%/var(--tw-border-opacity))}:is(html[class~=dark] .dark\:contrast-more\:border-neutral-400){--tw-border-opacity:1;border-color:rgb(163 163 163/var(--tw-border-opacity))}:is(html[class~=dark] .contrast-more\:dark\:text-current){color:currentColor}:is(html[class~=dark] .contrast-more\:dark\:text-gray-100){--tw-text-opacity:1;color:rgb(243 244 246/var(--tw-text-opacity))}:is(html[class~=dark] .contrast-more\:dark\:text-gray-300){--tw-text-opacity:1;color:rgb(209 213 219/var(--tw-text-opacity))}:is(html[class~=dark] .contrast-more\:dark\:text-gray-50){--tw-text-opacity:1;color:rgb(249 250 251/var(--tw-text-opacity))}:is(html[class~=dark] .contrast-more\:dark\:shadow-\[0_0_0_1px_\#fff\]){--tw-shadow:0 0 0 1px #fff;--tw-shadow-colored:0 0 0 1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}:is(html[class~=dark] .contrast-more\:dark\:shadow-none){--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}:is(html[class~=dark] .contrast-more\:dark\:hover\:border-gray-50:hover){--tw-border-opacity:1;border-color:rgb(249 250 251/var(--tw-border-opacity))}}@media print{.print\:hidden{display:none}.print\:bg-transparent{background-color:transparent}}@media not all and (min-width:1280px){.max-xl\:hidden{display:none}}@media not all and (min-width:1024px){.max-lg\:min-h-\[340px\]{min-height:340px}}@media not all and (min-width:768px){.max-md\:hidden{display:none}.max-md\:min-h-\[340px\]{min-height:340px}.max-md\:\[transform\:translate3d\(0\2c -100\%\2c 0\)\]{transform:translate3d(0,-100%,0)}}@media(min-width:640px){.sm\:block{display:block}.sm\:flex{display:flex}.sm\:w-\[110\%\]{width:110%}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:items-start{align-items:flex-start}.sm\:text-xl{font-size:1.25rem}}@media(min-width:768px){.md\:sticky{position:sticky}.md\:top-16{top:4rem}.md\:inline-block{display:inline-block}.md\:hidden{display:none}.md\:aspect-\[1\.1\/1\]{aspect-ratio:1.1/1}.md\:h-\[calc\(100vh-var\(--navbar-height\)-var\(--menu-height\)\)\]{height:calc(100vh - var(--navbar-height) - var(--menu-height))}.md\:max-h-\[min\(calc\(100vh-5rem-env\(safe-area-inset-bottom\)\)\2c 400px\)\]{max-height:min(calc(100vh - 5rem - env(safe-area-inset-bottom)),400px)}.md\:w-64{width:16rem}.md\:shrink-0{flex-shrink:0}.md\:justify-start{justify-content:flex-start}.md\:self-start{align-self:flex-start}.md\:px-12{padding-left:3rem;padding-right:3rem}.md\:pt-12{padding-top:3rem}.md\:text-5xl{font-size:3rem}.md\:text-lg{font-size:1.125rem}.md\:text-sm{font-size:.875rem}:is([dir=ltr] .ltr\:md\:left-auto){left:auto}:is([dir=rtl] .rtl\:md\:right-auto){right:auto}}@media(min-width:1024px){.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}}@media(min-width:1280px){.xl\:block{display:block}} \ No newline at end of file diff --git a/public/css/custom.min.e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855.css b/public/css/custom.min.e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855.css new file mode 100644 index 0000000..e69de29 diff --git a/public/docs/fediverso/disclaimer/index.html b/public/docs/fediverso/disclaimer/index.html new file mode 100644 index 0000000..2c93d29 --- /dev/null +++ b/public/docs/fediverso/disclaimer/index.html @@ -0,0 +1,493 @@ + + + + + + + + + + + + + + Disclaimer – Novoa en español + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+
+ +
+ Fediverso +
Disclaimer
+
+ +
+

Disclaimer

+

Robado sin descaro de misskey-hub, pero sigue siendo bastante válido para esta instancia.

+

Consideraciones importantes +

Hay algunos puntos que deben tenerse en cuenta al utilizar servicios que utilizan Misskey.

+

Debido a su naturaleza descentralizada, una vez subidos, los datos no están garantizados para ser eliminados de todos los demás servidores, incluso si se borran.(Sin embargo, esto también es cierto para Internet en general). +Incluso si un mensaje se crea como privado, no hay garantía de que los otros servidores lo traten también como privado, así que por favor, ten cuidado cuando publiques información personal o confidencial (aunque esto también ocurre en Internet en general).

+

Por favor, comprenda estos puntos y disfrute utilizando nuestros servicios.

+ +
+ +
Última actualización
+ + +
+
+
+ + + + + + + + + + + + diff --git a/public/docs/fediverso/index.html b/public/docs/fediverso/index.html new file mode 100644 index 0000000..5ba95c5 --- /dev/null +++ b/public/docs/fediverso/index.html @@ -0,0 +1,500 @@ + + + + + + + + + + + + + + Fediverso – Novoa en español + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+
+
Fediverso
+
+ +
+

Fediverso

+

Por cierto en esta sección pondré muchas “páginas” que tenía en misskey.

+

Son varías las bifurcaciones del fediverso, por un lado, esta pleroma y el otro mastodon, mientras en el medio quizás un tanto aislado se encuentra misskey, pues su funcionalidad u orientación del software y proyecto es distinta a la de los otros dos equivalencias de twitter.

+

Sé que nada de lo que digo ahora tiene sentido para ti si vienes de fuera, pero lo tendrá al final de este texto.

+

El fediverso es una red interconectada de distintos servidores (o instancias) que operan y se comunican mediante un protocolo llamado Activity Pub (sin embargo, también hay otros protocolos) lo que esto permite es que diferentes sitios compartan información de sus usuarios unos con otros, en otras palabras los servidores se comunican y de esta manera también sus usuarios.

+

Hay varias orientaciones en el fediverso, distintos tipos de software o servidores que se orientan a distintas tareas, por ejemplo peertube que busca ser una alternativa federada a youtube. Donde estamos ahora es en el lado social, interactivo y variado del fediverso; Mastodon que se creó para ser tan cercano a twitter como le sea posible, Pleroma creado para ser compatible con mastodon, pero al mismo tiempo con sus propias peculiaridades y finalmente Misskey, donde estás ahora leyendo esto si eres usuario de esta instancia, que como te darás cuenta es más bien un software que plantea ser sí mismo con la ocurrencia de que también es federado y se comunica con los otros dos tipos de instancia.

+

Puedes identificar cada una de estas por sus iconos en algunas ocasiones, mástodon es azul con un elefante, pleroma por defecto tiene una P naranja con un fondo oscuro y algunos de sus administradores le ponen también una pl a su subdominio, por otro lado, algunos administradores de misskey le ponen una mk a su dirección web (mk.dirección.tld).

+

Hay otros recursos que explican en mucho más detalle lo que es el fediverso como los que enlazaré a continuación (aunque están en inglés). Personalmente, pienso que es el futuro y de lo que nunca nos deberíamos haber desviado con las web centralizada de FAGMAN (Facebook, Amazon. Google, Microsoft, Apple, Netflix), somos entonces la alternativa y los pocos que nos hemos salido de ahí por una razón u otra.

+

Es así también un oasis o un relicario de la era olvidada del internet de los principios de los 2000s y quizás un poco antes de, de la cultura que también sobrevivió de una manera u otra en 4chan y otros foros aislados, si eres de fuera, tienes que comprender algo crucial, y eso es el anonimato, este internet se rige por avatares, no por tu persona ‘real’, de esta manera “culturalmente” no es esperado que des información personal, pues es más bien confidencial pues es completamente abierto al público, la idea, de que todo lo que se sube al internet permanece ahí para siempre es completamente verdadera aquí en el fediverso, así que anda con cuidado y más allá de eso, diviértete con tus experiencias aquí, con cualquier icono que hayas seleccionado, quizás y hasta es más verdadero e interesante de lo que imaginas ;)

+

Más información sobre el fediverso: +

https://fediverse.party/

+

https://jointhefedi.com/

+

Fediverse Observer | Misskey

+

GitHub - emilebosch/awesome-fediverse: A curated, collaborative list of awesome Fediverse resources

+

Historia del Fediverso +

Gente con mucho mejor prosa que la mía actual ya ha escrito sobre los temas de esta página (sin embargo en inglés) recomiendo mucho su lectura si es de interés:
+GNU Social y el inicio de Mastodon - https://robek.world/featured/what-is-gnu-social-and-is-mastodon-social-a-twitter-clone/
+Otra reflexión antigua sobre el Fediverso por Lain(o lambdalambda, creador de Pleroma) - https://robek.world/futurology/an-admin-what-if-there-was-twitter-without-nazis/

+ +
+ +
Última actualización
+ + +
+
+
+ + + + + + + + + + + + diff --git a/public/docs/fediverso/index.xml b/public/docs/fediverso/index.xml new file mode 100644 index 0000000..b0b646e --- /dev/null +++ b/public/docs/fediverso/index.xml @@ -0,0 +1,38 @@ + + + Novoa en español – Fediverso + https://portal.novoa.nagoya/docs/fediverso/ + Recent content in Fediverso on Novoa en español + Hugo -- gohugo.io + es-MX + Sat, 13 Jan 2024 21:39:10 -0600 + + + + + + + + + + + Disclaimer + https://portal.novoa.nagoya/docs/fediverso/disclaimer/ + Sat, 13 Jan 2024 22:01:28 -0600 + + https://portal.novoa.nagoya/docs/fediverso/disclaimer/ + + + + <p>Robado sin descaro de misskey-hub, pero sigue siendo bastante válido para esta instancia.</p> +<h2>Consideraciones importantes<span class="absolute -mt-20" id="consideraciones-importantes"></span> + <a href="#consideraciones-importantes" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Hay algunos puntos que deben tenerse en cuenta al utilizar servicios que utilizan Misskey.</p> +<p>Debido a su naturaleza descentralizada, una vez subidos, los datos no están garantizados para ser eliminados de todos los demás servidores, incluso si se borran.(Sin embargo, esto también es cierto para Internet en general). +Incluso si un mensaje se crea como privado, no hay garantía de que los otros servidores lo traten también como privado, así que por favor, ten cuidado cuando publiques información personal o confidencial (aunque esto también ocurre en Internet en general).</p> +<p>Por favor, comprenda estos puntos y disfrute utilizando nuestros servicios.</p> + + + + + + diff --git a/public/docs/index.html b/public/docs/index.html new file mode 100644 index 0000000..0add31c --- /dev/null +++ b/public/docs/index.html @@ -0,0 +1,466 @@ + + + + + + + + + + + + + + Documentación de Novoa – Novoa en español + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+
Documentación de Novoa
+
+ +
+

Documentación de Novoa

+

Este espacio es para la documentación general del servidor, en cada sección subirñe documentación pertinente a cada servicio.

+

Iré avanzando lentamente porque me da un poco de pereza y tengo tambien muchas otras cosas que hacer, lo que ves es lo que hay aunque puede que aveces suceda que no actualize la página.

+

Ya que mis servidores usan Debian y OpenBSD todo lo escrito en la documentación y guías sera en los entornos de alguno de estos sistemas.

+

Comparto el repositorio el cual esta aquí↗ por transparencia y por si dejo de subir actualizaciones al servidor.

+ +
+ +
Última actualización
+ + +
+
+
+ + + + + + + + + + + + diff --git a/public/docs/index.xml b/public/docs/index.xml new file mode 100644 index 0000000..fd47b2c --- /dev/null +++ b/public/docs/index.xml @@ -0,0 +1,306 @@ + + + Novoa en español – Documentación de Novoa + https://portal.novoa.nagoya/docs/ + Recent content in Documentación de Novoa on Novoa en español + Hugo -- gohugo.io + es-MX + Sat, 13 Jan 2024 13:59:34 -0600 + + + + + + + + + + + Disclaimer + https://portal.novoa.nagoya/docs/fediverso/disclaimer/ + Sat, 13 Jan 2024 22:01:28 -0600 + + https://portal.novoa.nagoya/docs/fediverso/disclaimer/ + + + + <p>Robado sin descaro de misskey-hub, pero sigue siendo bastante válido para esta instancia.</p> +<h2>Consideraciones importantes<span class="absolute -mt-20" id="consideraciones-importantes"></span> + <a href="#consideraciones-importantes" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Hay algunos puntos que deben tenerse en cuenta al utilizar servicios que utilizan Misskey.</p> +<p>Debido a su naturaleza descentralizada, una vez subidos, los datos no están garantizados para ser eliminados de todos los demás servidores, incluso si se borran.(Sin embargo, esto también es cierto para Internet en general). +Incluso si un mensaje se crea como privado, no hay garantía de que los otros servidores lo traten también como privado, así que por favor, ten cuidado cuando publiques información personal o confidencial (aunque esto también ocurre en Internet en general).</p> +<p>Por favor, comprenda estos puntos y disfrute utilizando nuestros servicios.</p> + + + + + + Actualizar Misskey + https://portal.novoa.nagoya/docs/misskey/actualizar/ + Mon, 01 Jan 0001 00:00:00 +0000 + + https://portal.novoa.nagoya/docs/misskey/actualizar/ + + + + <p>Para actualizar a la versión de misskey más reciente, cualquier versión posterior a la instalación o migrarse a algún fork los comandos generales son:</p> +<p>Para actualizar a la versión más reciente dentro de la rama master, que es la principal y supuestamente estable:</p> +<div class="code-block relative mt-6 first:mt-0 group/code"><div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">git checkout master +</span></span><span class="line"><span class="cl">git pull +</span></span><span class="line"><span class="cl">git submodule update --init +</span></span><span class="line"><span class="cl"><span class="nv">NODE_ENV</span><span class="o">=</span>production pnpm install --frozen-lockfile +</span></span><span class="line"><span class="cl"><span class="nv">NODE_ENV</span><span class="o">=</span>production pnpm run build +</span></span><span class="line"><span class="cl">pnpm run migrate</span></span></code></pre></div></div><div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0"> + <button + class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50" + title="Copy code" + > + <div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4"></div> + <div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4"></div> + </button> + </div> +</div> +<p>Para actualizar a un lanzamiento o versión específica de misskey:</p> +<p><code>git checkout (git tag -l | grep -v 'rc[0-9]*' | sort -V | tail -n 1)</code></p> +<p>o</p> +<p><code>git checkout $TAG</code> por ejemplo <code>git checkout 2023.12.2</code></p> +<p>y despues:</p> +<div class="code-block relative mt-6 first:mt-0 group/code"><div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">git pull +</span></span><span class="line"><span class="cl">git submodule update --init +</span></span><span class="line"><span class="cl"><span class="nv">NODE_ENV</span><span class="o">=</span>production pnpm install --frozen-lockfile +</span></span><span class="line"><span class="cl"><span class="nv">NODE_ENV</span><span class="o">=</span>production pnpm run build +</span></span><span class="line"><span class="cl">pnpm run migrate</span></span></code></pre></div></div><div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0"> + <button + class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50" + title="Copy code" + > + <div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4"></div> + <div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4"></div> + </button> + </div> +</div> +<p>Ambas métodos de actualización son un poco automatizados en especial en la parte del comando git.</p> +<p>En detalle y la forma correcta y más tardada de hacerlo sería checar primero las notas o cambios (en japonés).</p> +<p>Obtener los cambios en el repositorio en nuestra copia local y situarnos en la rama que queramos usar, ya sea master, develop o alguna versión particular.</p> +<div class="code-block relative mt-6 first:mt-0 group/code"><div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">git fetch +</span></span><span class="line"><span class="cl">git checkout <span class="nv">$TAG</span></span></span></code></pre></div></div><div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0"> + <button + class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50" + title="Copy code" + > + <div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4"></div> + <div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4"></div> + </button> + </div> +</div> +<p>Posteriormente comparar las diferencias o cambios que se han hecho dentro del código.</p> +<div class="code-block relative mt-6 first:mt-0 group/code"><div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">git status</span></span></code></pre></div></div><div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0"> + <button + class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50" + title="Copy code" + > + <div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4"></div> + <div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4"></div> + </button> + </div> +</div> +<p>Habiendo comparado y estando seguros de que no habrá conflictos vamos a actualizar la rama sobre la que estamos trabajando (la que seleccionamos despues del checkout).</p> +<div class="code-block relative mt-6 first:mt-0 group/code"><div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">git merge</span></span></code></pre></div></div><div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0"> + <button + class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50" + title="Copy code" + > + <div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4"></div> + <div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4"></div> + </button> + </div> +</div> +<p>Y finalmente actualizar misskey, el primer comando para actualizar las dependencias de JavaScript, el segundo para compilar el programa y el tercero para efectuar todos los cambios en la base de datos necesaria para acomodar a la nueva versión.</p> +<div class="code-block relative mt-6 first:mt-0 group/code"><div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nv">NODE_ENV</span><span class="o">=</span>production pnpm install --frozen-lockfile +</span></span><span class="line"><span class="cl"><span class="nv">NODE_ENV</span><span class="o">=</span>production pnpm run build +</span></span><span class="line"><span class="cl">pnpm run migrate</span></span></code></pre></div></div><div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0"> + <button + class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50" + title="Copy code" + > + <div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4"></div> + <div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4"></div> + </button> + </div> +</div> + + + + + + Integración al sistema + https://portal.novoa.nagoya/docs/misskey/sys-units/ + Mon, 01 Jan 0001 00:00:00 +0000 + + https://portal.novoa.nagoya/docs/misskey/sys-units/ + + + + <p>Esta parte es un poco complicada porque habla de linux como sistema de nuevo.</p> +<p>No voy a ahondar en detalle porque el archivo ya explica (aunque en inglés) y estoy cansado.</p> +<p>Esta es la unidad del sistema que uso en Novoa, como es algo que escribí de manera personalizada lo he situado dentro de /etc/systemd/system/misskey.service para que no se confundiera con otros archivos.</p> + + +<div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;"> + <a + class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://portal.novoa.nagoya/docs/misskey/misskey.service" ><span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50"><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M3 7v10a2 2 0 002 2h14a2 2 0 002-2V9a2 2 0 00-2-2h-6l-2-2H5a2 2 0 00-2 2z"/></svg>Archivo directo para descarga</span></a> +</div> + +<div class="code-block relative mt-6 first:mt-0 group/code"><div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-systemd" data-lang="systemd"><span class="line"><span class="cl"><span class="k">[Unit]</span> +</span></span><span class="line"><span class="cl"><span class="na">Description</span><span class="o">=</span><span class="s">Misskey daemon</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"><span class="k">[Service]</span> +</span></span><span class="line"><span class="cl"><span class="na">Type</span><span class="o">=</span><span class="s">simple</span> +</span></span><span class="line"><span class="cl"><span class="na">User</span><span class="o">=</span><span class="s">misskey</span> +</span></span><span class="line"><span class="cl"><span class="na">ExecStart</span><span class="o">=</span><span class="s">/usr/bin/pnpm start</span> +</span></span><span class="line"><span class="cl"><span class="na">WorkingDirectory</span><span class="o">=</span><span class="s">/other-dir/misskey</span> +</span></span><span class="line"><span class="cl"><span class="na">Environment</span><span class="o">=</span><span class="s">&#34;NODE_ENV=production&#34;</span> +</span></span><span class="line"><span class="cl"><span class="na">TimeoutSec</span><span class="o">=</span><span class="s">60</span> +</span></span><span class="line"><span class="cl"><span class="na">SyslogIdentifier</span><span class="o">=</span><span class="s">misskey</span> +</span></span><span class="line"><span class="cl"><span class="na">Restart</span><span class="o">=</span><span class="s">always</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"><span class="c">; Some security directives.</span> +</span></span><span class="line"><span class="cl"><span class="c">; Use private /tmp and /var/tmp folders inside a new file system namespace, which are discarded after the process stops.</span> +</span></span><span class="line"><span class="cl"><span class="na">PrivateTmp</span><span class="o">=</span><span class="s">true</span> +</span></span><span class="line"><span class="cl"><span class="c">; The /home, /root, and /run/user folders can not be accessed by this service anymore. If your misskey user has its home folder in one of the restricted places, or use one of these folders as its working directory, you have to set this to false.</span> +</span></span><span class="line"><span class="cl"><span class="na">ProtectHome</span><span class="o">=</span><span class="s">true</span> +</span></span><span class="line"><span class="cl"><span class="c">; Sets up a new /dev mount for the process and only adds API pseudo devices like /dev/null, /dev/zero or /dev/random but not physical devices. Disabled by default because it may not work on devices like the Raspberry Pi.</span> +</span></span><span class="line"><span class="cl"><span class="na">PrivateDevices</span><span class="o">=</span><span class="s">true</span> +</span></span><span class="line"><span class="cl"><span class="c">; Drops the sysadmin capability from the daemon.</span> +</span></span><span class="line"><span class="cl"><span class="na">CapabilityBoundingSet</span><span class="o">=</span><span class="s">~CAP_SYS_ADMIN</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"><span class="c"># Make the system tree read-only.</span> +</span></span><span class="line"><span class="cl"><span class="na">ProtectSystem</span><span class="o">=</span><span class="s">strict</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"><span class="c"># Make some paths aviable and readable by the process</span> +</span></span><span class="line"><span class="cl"><span class="na">ReadWritePaths</span><span class="o">=</span><span class="s">/other-dir/misskey</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"><span class="c"># Allocate a separate /tmp.</span> +</span></span><span class="line"><span class="cl"><span class="na">PrivateTmp</span><span class="o">=</span><span class="s">yes</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"><span class="c"># Ensure the service can never gain new privileges.</span> +</span></span><span class="line"><span class="cl"><span class="na">NoNewPrivileges</span><span class="o">=</span><span class="s">yes</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"><span class="c"># Prohibit access to any kind of namespacing.</span> +</span></span><span class="line"><span class="cl"><span class="na">RestrictNamespaces</span><span class="o">=</span><span class="s">yes</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"><span class="c"># Make cgroup file system hierarchy inaccessible.</span> +</span></span><span class="line"><span class="cl"><span class="na">ProtectControlGroups</span><span class="o">=</span><span class="s">yes</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"><span class="c"># Deny kernel module loading.</span> +</span></span><span class="line"><span class="cl"><span class="na">ProtectKernelModules</span><span class="o">=</span><span class="s">yes</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"><span class="c"># Make kernel variables (e.g. /proc/sys) read-only.</span> +</span></span><span class="line"><span class="cl"><span class="na">ProtectKernelTunables</span><span class="o">=</span><span class="s">yes</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"><span class="c"># Deny hostname changing.</span> +</span></span><span class="line"><span class="cl"><span class="na">ProtectHostname</span><span class="o">=</span><span class="s">yes</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"><span class="c"># Deny realtime scheduling.</span> +</span></span><span class="line"><span class="cl"><span class="na">RestrictRealtime</span><span class="o">=</span><span class="s">yes</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"><span class="c"># Deny access to the kernel log ring buffer.</span> +</span></span><span class="line"><span class="cl"><span class="na">ProtectKernelLogs</span><span class="o">=</span><span class="s">yes</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"><span class="c"># Deny setting the hardware or system clock.</span> +</span></span><span class="line"><span class="cl"><span class="na">ProtectClock</span><span class="o">=</span><span class="s">yes</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"><span class="c"># Filter dangerous system calls. The following is listed as safe basic</span> +</span></span><span class="line"><span class="cl"><span class="c"># choice in systemd.exec(5).</span> +</span></span><span class="line"><span class="cl"><span class="na">SystemCallArchitectures</span><span class="o">=</span><span class="s">native</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"><span class="c"># Deny kernel execution domain changing.</span> +</span></span><span class="line"><span class="cl"><span class="na">LockPersonality</span><span class="o">=</span><span class="s">yes</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"><span class="c"># Deny memory mappings that are writable and executable.</span> +</span></span><span class="line"><span class="cl"><span class="c"># Node fucking dies if this is enabled.</span> +</span></span><span class="line"><span class="cl"><span class="c">#MemoryDenyWriteExecute=yes</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"><span class="k">[Install]</span> +</span></span><span class="line"><span class="cl"><span class="na">WantedBy</span><span class="o">=</span><span class="s">multi-user.target</span></span></span></code></pre></div></div><div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0"> + <button + class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50" + title="Copy code" + > + <div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4"></div> + <div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4"></div> + </button> + </div> +</div> +<p>Después de copiar y pegar esto y hacer respectivas modificaciones como en WorkingDirectory con systemd puedes iniciar el servicio/programa y notarás que utiliza el usuario misskey para ello.</p> +<div class="code-block relative mt-6 first:mt-0 group/code"><div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">sudo systemctl daemon-reload +</span></span><span class="line"><span class="cl">sudo systemctl start misskey</span></span></code></pre></div></div><div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0"> + <button + class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50" + title="Copy code" + > + <div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4"></div> + <div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4"></div> + </button> + </div> +</div> +<p>Puedes utilizar este comando para habilitar que se inicie automáticamente al encender el servidor.</p> +<div class="code-block relative mt-6 first:mt-0 group/code"><div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">sudo systemctl <span class="nb">enable</span> misskey</span></span></code></pre></div></div><div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0"> + <button + class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50" + title="Copy code" + > + <div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4"></div> + <div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4"></div> + </button> + </div> +</div> + + + + + + Servidor HTTP + https://portal.novoa.nagoya/docs/misskey/http-server/ + Mon, 01 Jan 0001 00:00:00 +0000 + + https://portal.novoa.nagoya/docs/misskey/http-server/ + + + + <p>Usa e instala caddy</p> +<p>Modifica /etc/caddy/Caddyfile</p> +<p>Añade</p> +<div class="code-block relative mt-6 first:mt-0 group/code"><pre><code>tu.dominio.tld { +    reverse_proxy localhost:$PUERTO_DE_MISSKEY +}</code></pre><div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0"> + <button + class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50" + title="Copy code" + > + <div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4"></div> + <div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4"></div> + </button> + </div> +</div> +<p>Inicia caddy.</p> + + + + + + Servidores + https://portal.novoa.nagoya/docs/sysadmin/util/ + Mon, 01 Jan 0001 00:00:00 +0000 + + https://portal.novoa.nagoya/docs/sysadmin/util/ + + + + <h1>Programas y utilidades</h1><p><code>curl neovim git</code></p> + + + + + + diff --git a/public/docs/misskey/actualizar/index.html b/public/docs/misskey/actualizar/index.html new file mode 100644 index 0000000..38f498c --- /dev/null +++ b/public/docs/misskey/actualizar/index.html @@ -0,0 +1,568 @@ + + + + + + + + + + + + + + Actualizar Misskey – Novoa en español + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+
+ +
Actualizar Misskey
+
+ +
+

Actualizar Misskey

+

Para actualizar a la versión de misskey más reciente, cualquier versión posterior a la instalación o migrarse a algún fork los comandos generales son:

+

Para actualizar a la versión más reciente dentro de la rama master, que es la principal y supuestamente estable:

+
git checkout master
+git pull
+git submodule update --init
+NODE_ENV=production pnpm install --frozen-lockfile
+NODE_ENV=production pnpm run build
+pnpm run migrate
+ +
+
+

Para actualizar a un lanzamiento o versión específica de misskey:

+

git checkout (git tag -l | grep -v 'rc[0-9]*' | sort -V | tail -n 1)

+

o

+

git checkout $TAG por ejemplo git checkout 2023.12.2

+

y despues:

+
git pull
+git submodule update --init
+NODE_ENV=production pnpm install --frozen-lockfile
+NODE_ENV=production pnpm run build
+pnpm run migrate
+ +
+
+

Ambas métodos de actualización son un poco automatizados en especial en la parte del comando git.

+

En detalle y la forma correcta y más tardada de hacerlo sería checar primero las notas o cambios (en japonés).

+

Obtener los cambios en el repositorio en nuestra copia local y situarnos en la rama que queramos usar, ya sea master, develop o alguna versión particular.

+
git fetch
+git checkout $TAG
+ +
+
+

Posteriormente comparar las diferencias o cambios que se han hecho dentro del código.

+
git status
+ +
+
+

Habiendo comparado y estando seguros de que no habrá conflictos vamos a actualizar la rama sobre la que estamos trabajando (la que seleccionamos despues del checkout).

+
git merge
+ +
+
+

Y finalmente actualizar misskey, el primer comando para actualizar las dependencias de JavaScript, el segundo para compilar el programa y el tercero para efectuar todos los cambios en la base de datos necesaria para acomodar a la nueva versión.

+
NODE_ENV=production pnpm install --frozen-lockfile
+NODE_ENV=production pnpm run build
+pnpm run migrate
+ +
+
+ +
+ +
Última actualización
+ + +
+
+
+ + + + + + + + + + + + diff --git a/public/docs/misskey/http-server/index.html b/public/docs/misskey/http-server/index.html new file mode 100644 index 0000000..4fdc3aa --- /dev/null +++ b/public/docs/misskey/http-server/index.html @@ -0,0 +1,499 @@ + + + + + + + + + + + + + + Servidor HTTP – Novoa en español + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+
+ +
Servidor HTTP
+
+ +
+

Servidor HTTP

+

Usa e instala caddy

+

Modifica /etc/caddy/Caddyfile

+

Añade

+
tu.dominio.tld {
+    reverse_proxy localhost:$PUERTO_DE_MISSKEY
+}
+ +
+
+

Inicia caddy.

+ +
+ +
Última actualización
+ + +
+
+
+ + + + + + + + + + + + diff --git a/public/docs/misskey/index.html b/public/docs/misskey/index.html new file mode 100644 index 0000000..721311b --- /dev/null +++ b/public/docs/misskey/index.html @@ -0,0 +1,718 @@ + + + + + + + + + + + + + + Misskey en Novoa – Novoa en español + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+
+
Misskey en Novoa
+
+ +
+

Misskey en Novoa

+

Esta guía/documentación esta planteada para una instalación completamente manual sobre algún servidor gnu/linux como Debian de manera directa, es decir no hará uso de kubernetes, docker o cualquier otro software de virtualización, también asume que tienes un acceso a root mediante shell a tu sistema ya sea este un servidor virtual o uno montado en el hardware directamente.

+

Estoy adaptando un poco la guía que esta ahí fuera sobre misskey porque también fue lo que hice. Cuando inicié esta instancia recuerdo que la única documentación que existía estaba literalmente en chino y en japonés ⬅️ Esa es la guía base y más actualizada sobre como instalar misskey.

+

Preparaciones para instalar Misskey +

Crear el usuario +

Primero crear la carpeta donde estará alojado todo lo pertinente a nuestra instancia

+

sudo mkdir /sys-users/ o cualquier ruta de archivo que se desee.

+

Posteriormente los usuarios deberían ser creados con privilegios mínimos:

+
adduser --system --disabled-password --disabled-login --shell=/bin/false --home /sys-users/mk misskey
+ +
+
+

misskey al final puede ser cambiado por cualquier otro nombre de usuario.

+

El comando anterior va a crear una carpeta donde todos los permisos los tiene el usuario recientemente creado en /sys-users/mk.

+

Quizá algunas de esas opciones sean redundantes como --disabled-login --shell=/bin/false pues no se puede iniciar sesión sin acceso a shell pero prefiero redundancia y explicidad, además de que no causa ningún problema.

+

Lo que cada una de estas opciones (flags en inglés) marca o configura es que:

+
    +
  • +

    --system: Crea un usuario del sistema con un uid < 1000. Usuarios normales tienen un uid > 1000.

    +
  • +
  • +

    --disabled-password: El usuario no puede iniciar sesión usando una contraseña, solo se puede iniciar sesión desde o siendo super usuario o con un usuario con privilegios de super usuario.

    +
  • +
  • +

    --disabled-login: Bloquea el intento de inicio de sesión.

    +
  • +
  • +

    --shell=/bin/false: La opción shell configura la shell por defecto que usara el usuario, al marcar esta opción como falsa el usuario no podrá acceder a ningun entorno de la línea de comandos, es decir no podrá ejecutar ningun comando desde alguna terminal de manera directa.

    +
  • +
  • +

    --no-create-home: el usuario misskey no tenga un directorio dentro de /home.

    +
  • +
  • +

    --base-dir/DIRECTORIO_BASE: Es donde todos los usuarios serán creados por defecto, y se concatena con el nombre del usuario. Por defecto es /home entonces en este caso si no se cambia nada el directorio y variable $HOME del usuario sería /home/misskey. Si solo se cambia esta opción y no la que sigue el directorio terminaría siendo algo como /directorio-distinto/misskey.

    +
  • +
  • +

    --home /DIRECTORIO_HOME: En este caso es para más control sobre donde se colocará al usuario. Simplemente hay que poner la ruta completa de la carpeta como /directorio-distinto/un-nombre-distinto y ahí es donde se le asiganara el valor de $HOME al usuario, sin embargo hay que tomar en cuenta que el programa no creará ninguna carpeta así que hay que hacerlas directamente con mkdir.

    +
  • +
+

Dependencias del sistema 📦 +

Dependiendo de que sistema operativo uses los comandos que tengas que utilizar para instalar programas serán distintos, si quieres ayuda con alguno me puedes contactar directamente en XMPP, pues estoy familiarizado con varias versiones de linux.

+

Antes de instalar las dependencias debes que saber que dependiendo de la versión de misskey (o sus forks) cada una de estos componentes variaran en las versiones mínimas necesarias, por ejemplo cuando yo instalé misskey por primera vez estaba usando postgres 13 y de hecho lo seguía usando incluso cuando ya no era soportado supuestamente y no resultó en ningún problema. Misskey tampoco hace una revisión de las versiones de los programas fuera de node, dicho esto, puede que sea una mejor opción optar por las versiones otorgadas en el repositorio base de tu sistema.

+

He adjuntado un link a cada uno de los programas necesarios para instalar y ejecturar misskey, quizá en algún futuro haga una documentación sobre como los instale yo en mi sistema ya que cada uno de estos links tiene instrucciones específicas:

+
    +
  • +

    Node.js >= 20.4.x ➡️ se usa como la base del servidor, misskey esta construido sobre node.

    +
  • +
  • +

    PostgreSQL >= 15.x ➡️ Base de datos donde se almacenarán todos los posts y las relaciones entre usuarios. instancias. etc. de manera permanente.

    +
  • +
  • +

    Redis >= 7.0 ➡️ Base de datos transaccional usada como caché, para listas y relaciones no permanentes.

    +
  • +
  • +

    FFmpeg ➡️ Usado para pasar un formato de multimedia a otro.

    +
  • +
  • +

    En la guía original se menciona instalar build-essential para distribuciones basadas en Debian.

    +
  • +
  • +

    Varias utilidades usadas para el manejo del sistema como git y neo/vim.

    +
  • +
+

Asumiendo que esta usando Debian y agregaste todos esos repositorios al administrador de paquetes (o vas a usar solo los paquetes que provee Debian) tu comando final para instalarlos debería quedar algo como:

+
sudo apt install build-essential nodejs postgresql redis ffmpeg
+ +
+
+

Hacer una base de datos en PostgreSQL +

Actualmente misskey no tiene una manera de crear usuarios en postgres automáticamente así que tendremos que hacer uno y establecer su contraseña y métodos de acceso de manera manual.

+

Primero cambiar al usuario postgres

+

su - postgres

+

Dentro de ese usuario se creará un usuario exclusivo de misskey para acceder a la base de datos desde el software.

+

createuser -P example-misskey-user

+

Este comando pedirá una contraseña que debe ser introducida 2 veces.

+

Finalmente vamos a hacer una base de datos para misskey con el usuario que acabamos de crear.

+

createdb -O example-misskey-user misskey-database

+

Sin haber nada más que hacer en postgres la manera de salir de la sesión es escribiendo exit, lo cual nos llevara a la sesión anterior.

+

Preparar el entorno de compilación +

Misskey al ser un progama escrito en JavaScript todas las librerías que usa son en este mismo lenguaje que tiene su propio administrador de paquetes fuera de apt/debian, para esto debemos habilitar pnpm y para la compilación y tener las caracteristicas de un servidor en producción se debe que declarar variable de entorno:

+
sudo corepack enable
+export NODE_ENV=production
+ +
+
+

Instalar dependencias de JavaScript +

Usuarios de compilación +

Hay bastantes maneras de hacer esto:

+
    +
  1. +

    Es mediante tu mismo usuario y despues cambiando la propiedad de la carpeta en la que instalaste misskey recursivamente. Esta manera es un poco sucia a falta de una mejor palabra en este momento, pero sirve y es la más sencilla.

    +
      +
    1. Aquí harías todos los pasos siguentes mediante tu usuario y despues dentro de la carpeta donde instalaste misskey ejecutar sudo chown -R misskey:misskey . - El punto dentro de cualquier shell toma el valor de la carpeta en la que estas actualmente, puedes revisar en que carpeta estas con otro comando pwd o en vez del punto puedes usar la ruta completa para seleccionar en que carpeta quieres efectuar el comando.
    2. +
    +
  2. +
  3. +

    Hacerlo todo desde el usuario misskey iniciando sesión, desde otro usuario para esto usaríamos el comando su que cambia de usuario, conscisamente sudo su - misskey.

    +
      +
    1. +

      Hacerlo de esta manera es casi lo mismo que la anterior solo que ya no hay que cambiar la poseción de ningun arhivo.

      +
    2. +
    3. +

      Sin embargo tambien si habilitaste que misskey no pueda acceder a ninguna shell este paso será imposible de realizar a menos que cambies la configuración, así que tenlo en cuenta.

      +
    4. +
    +
  4. +
  5. +

    La tercera forma que esta en medio de ambas es algo sencilla tambien y da los beneficios de ambas sin comprometer seguridad de alguna manera. No podemos acceder a una interfaz de linea de comandos como shell, pero sí es posible ejecutar comandos como ese otro usuario, para esto a todos los comandos que vayamos a ejecutar antes hay que añadirles sudo -Hu misskey ...

    +
      +
    1. Un truco para realizar los comandos de una manera más sencilla es hacer un alias temporal dentro de la terminal simplemente ejecutando algo como alias smk="sudo -Hu misskey" y ahora cada que ejecutes smk dentro de esa sesión el programa correra bajo el usuario misskey.
    2. +
    +
  6. +
+

En todos los casos debemos que ir a la carpeta $HOME de nuestro usuario, en este caso con el comando cd /sys-users/mk

+
+

Para todas las opciones deberas ejecutar los siguientes comandos:

+
git clone --recursive https://github.com/misskey-dev/misskey.git -b master
+cd misskey
+git submodule update --init
+pnpm install --frozen-lockfile
+ +
+
+
+

Los cuales clonan el repositiorio y los archivos base para compilar misskey y pnpm instala dependencias de javascript de este.

+

Configuración +

Hay un archivo plantilla para la configuración de misskey, como en muchos paquetes de Debian. Este paso es relativamente sencillo pues no hay que configurar mucho y el archivo se explica a sí mismo. Hay algunas notas importantes como nunca cambiar el nombre de dominio de un servidor una vez que haya empezado a utilizarlo.

+

cp .config/example.yml .config/default.yml: Copia .config/example.yml y lo renombra a default.yml.

+

Y este último archivo editalo con tu editor de textos favoritos y ya que probablemente estas haciendo esto desde una terminal los comandos que podrias usar son nano vi vim nvim etc. dependiendo de que tengas instalado.

+

Consideraciones de configuración +

En la configuración por defecto todos los archivos que se suban al servidor (drive), sean imágenes, vídeos, pdf, lo que sea, todo se almacenará dentro de la carpeta raíz donde se descargó el repositorio mediante git en una carpeta llamada files/ y es un poco díficil de administrar sin usar misskey (y no se debería hacer pues también hay una relación existente en la base de datos) pues se guardan con nombres generados por el programa.

+

Compilación +

Son solo dos comandos, uno va a compilar el software y el segundo va a dejar todo listo para el uso del programa haciendo modificaciones necesarias en la base de datos.

+
pnpm run build
+pnpm run init
+ +
+
+

Finalmente vamos a iniciar el servidor con:

+
NODE_ENV=production pnpm run start
+ +
+
+

Errores de instalación

Limpiar todo el caché manualmente y reinstalar por completo.

+
    +
  • pnpm run clean y pnpm run clean-all
  • +
  • pnpm rebuild
  • +
+

Agradecimientos y recursos de referencia:

Pleroma Documentation

+

Misskeyを手動で構築する | Misskey Hub

+

Ubuntu Misskey Installation Instructions +Description of the instance settings and other settings to be set up first on a Misskey instance +Set up squid proxies to protect Misskey +Let’s back up Misskey’s database [OCI Object Storage] +Use Oracle Cloud Infrastructure Always Free to set up Misskey instances for free +If your Always Free OCI Arm instance is stopped…

+ +
+ +
Última actualización
+ + +
+
+
+ + + + + + + + + + + + diff --git a/public/docs/misskey/index.xml b/public/docs/misskey/index.xml new file mode 100644 index 0000000..9a49aab --- /dev/null +++ b/public/docs/misskey/index.xml @@ -0,0 +1,273 @@ + + + Novoa en español – Misskey en Novoa + https://portal.novoa.nagoya/docs/misskey/ + Recent content in Misskey en Novoa on Novoa en español + Hugo -- gohugo.io + es-MX + Sat, 13 Jan 2024 13:29:17 -0600 + + + + + + + + + + + Actualizar Misskey + https://portal.novoa.nagoya/docs/misskey/actualizar/ + Mon, 01 Jan 0001 00:00:00 +0000 + + https://portal.novoa.nagoya/docs/misskey/actualizar/ + + + + <p>Para actualizar a la versión de misskey más reciente, cualquier versión posterior a la instalación o migrarse a algún fork los comandos generales son:</p> +<p>Para actualizar a la versión más reciente dentro de la rama master, que es la principal y supuestamente estable:</p> +<div class="code-block relative mt-6 first:mt-0 group/code"><div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">git checkout master +</span></span><span class="line"><span class="cl">git pull +</span></span><span class="line"><span class="cl">git submodule update --init +</span></span><span class="line"><span class="cl"><span class="nv">NODE_ENV</span><span class="o">=</span>production pnpm install --frozen-lockfile +</span></span><span class="line"><span class="cl"><span class="nv">NODE_ENV</span><span class="o">=</span>production pnpm run build +</span></span><span class="line"><span class="cl">pnpm run migrate</span></span></code></pre></div></div><div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0"> + <button + class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50" + title="Copy code" + > + <div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4"></div> + <div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4"></div> + </button> + </div> +</div> +<p>Para actualizar a un lanzamiento o versión específica de misskey:</p> +<p><code>git checkout (git tag -l | grep -v 'rc[0-9]*' | sort -V | tail -n 1)</code></p> +<p>o</p> +<p><code>git checkout $TAG</code> por ejemplo <code>git checkout 2023.12.2</code></p> +<p>y despues:</p> +<div class="code-block relative mt-6 first:mt-0 group/code"><div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">git pull +</span></span><span class="line"><span class="cl">git submodule update --init +</span></span><span class="line"><span class="cl"><span class="nv">NODE_ENV</span><span class="o">=</span>production pnpm install --frozen-lockfile +</span></span><span class="line"><span class="cl"><span class="nv">NODE_ENV</span><span class="o">=</span>production pnpm run build +</span></span><span class="line"><span class="cl">pnpm run migrate</span></span></code></pre></div></div><div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0"> + <button + class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50" + title="Copy code" + > + <div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4"></div> + <div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4"></div> + </button> + </div> +</div> +<p>Ambas métodos de actualización son un poco automatizados en especial en la parte del comando git.</p> +<p>En detalle y la forma correcta y más tardada de hacerlo sería checar primero las notas o cambios (en japonés).</p> +<p>Obtener los cambios en el repositorio en nuestra copia local y situarnos en la rama que queramos usar, ya sea master, develop o alguna versión particular.</p> +<div class="code-block relative mt-6 first:mt-0 group/code"><div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">git fetch +</span></span><span class="line"><span class="cl">git checkout <span class="nv">$TAG</span></span></span></code></pre></div></div><div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0"> + <button + class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50" + title="Copy code" + > + <div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4"></div> + <div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4"></div> + </button> + </div> +</div> +<p>Posteriormente comparar las diferencias o cambios que se han hecho dentro del código.</p> +<div class="code-block relative mt-6 first:mt-0 group/code"><div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">git status</span></span></code></pre></div></div><div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0"> + <button + class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50" + title="Copy code" + > + <div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4"></div> + <div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4"></div> + </button> + </div> +</div> +<p>Habiendo comparado y estando seguros de que no habrá conflictos vamos a actualizar la rama sobre la que estamos trabajando (la que seleccionamos despues del checkout).</p> +<div class="code-block relative mt-6 first:mt-0 group/code"><div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">git merge</span></span></code></pre></div></div><div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0"> + <button + class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50" + title="Copy code" + > + <div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4"></div> + <div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4"></div> + </button> + </div> +</div> +<p>Y finalmente actualizar misskey, el primer comando para actualizar las dependencias de JavaScript, el segundo para compilar el programa y el tercero para efectuar todos los cambios en la base de datos necesaria para acomodar a la nueva versión.</p> +<div class="code-block relative mt-6 first:mt-0 group/code"><div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nv">NODE_ENV</span><span class="o">=</span>production pnpm install --frozen-lockfile +</span></span><span class="line"><span class="cl"><span class="nv">NODE_ENV</span><span class="o">=</span>production pnpm run build +</span></span><span class="line"><span class="cl">pnpm run migrate</span></span></code></pre></div></div><div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0"> + <button + class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50" + title="Copy code" + > + <div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4"></div> + <div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4"></div> + </button> + </div> +</div> + + + + + + Integración al sistema + https://portal.novoa.nagoya/docs/misskey/sys-units/ + Mon, 01 Jan 0001 00:00:00 +0000 + + https://portal.novoa.nagoya/docs/misskey/sys-units/ + + + + <p>Esta parte es un poco complicada porque habla de linux como sistema de nuevo.</p> +<p>No voy a ahondar en detalle porque el archivo ya explica (aunque en inglés) y estoy cansado.</p> +<p>Esta es la unidad del sistema que uso en Novoa, como es algo que escribí de manera personalizada lo he situado dentro de /etc/systemd/system/misskey.service para que no se confundiera con otros archivos.</p> + + +<div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;"> + <a + class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://portal.novoa.nagoya/docs/misskey/misskey.service" ><span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50"><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M3 7v10a2 2 0 002 2h14a2 2 0 002-2V9a2 2 0 00-2-2h-6l-2-2H5a2 2 0 00-2 2z"/></svg>Archivo directo para descarga</span></a> +</div> + +<div class="code-block relative mt-6 first:mt-0 group/code"><div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-systemd" data-lang="systemd"><span class="line"><span class="cl"><span class="k">[Unit]</span> +</span></span><span class="line"><span class="cl"><span class="na">Description</span><span class="o">=</span><span class="s">Misskey daemon</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"><span class="k">[Service]</span> +</span></span><span class="line"><span class="cl"><span class="na">Type</span><span class="o">=</span><span class="s">simple</span> +</span></span><span class="line"><span class="cl"><span class="na">User</span><span class="o">=</span><span class="s">misskey</span> +</span></span><span class="line"><span class="cl"><span class="na">ExecStart</span><span class="o">=</span><span class="s">/usr/bin/pnpm start</span> +</span></span><span class="line"><span class="cl"><span class="na">WorkingDirectory</span><span class="o">=</span><span class="s">/other-dir/misskey</span> +</span></span><span class="line"><span class="cl"><span class="na">Environment</span><span class="o">=</span><span class="s">&#34;NODE_ENV=production&#34;</span> +</span></span><span class="line"><span class="cl"><span class="na">TimeoutSec</span><span class="o">=</span><span class="s">60</span> +</span></span><span class="line"><span class="cl"><span class="na">SyslogIdentifier</span><span class="o">=</span><span class="s">misskey</span> +</span></span><span class="line"><span class="cl"><span class="na">Restart</span><span class="o">=</span><span class="s">always</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"><span class="c">; Some security directives.</span> +</span></span><span class="line"><span class="cl"><span class="c">; Use private /tmp and /var/tmp folders inside a new file system namespace, which are discarded after the process stops.</span> +</span></span><span class="line"><span class="cl"><span class="na">PrivateTmp</span><span class="o">=</span><span class="s">true</span> +</span></span><span class="line"><span class="cl"><span class="c">; The /home, /root, and /run/user folders can not be accessed by this service anymore. If your misskey user has its home folder in one of the restricted places, or use one of these folders as its working directory, you have to set this to false.</span> +</span></span><span class="line"><span class="cl"><span class="na">ProtectHome</span><span class="o">=</span><span class="s">true</span> +</span></span><span class="line"><span class="cl"><span class="c">; Sets up a new /dev mount for the process and only adds API pseudo devices like /dev/null, /dev/zero or /dev/random but not physical devices. Disabled by default because it may not work on devices like the Raspberry Pi.</span> +</span></span><span class="line"><span class="cl"><span class="na">PrivateDevices</span><span class="o">=</span><span class="s">true</span> +</span></span><span class="line"><span class="cl"><span class="c">; Drops the sysadmin capability from the daemon.</span> +</span></span><span class="line"><span class="cl"><span class="na">CapabilityBoundingSet</span><span class="o">=</span><span class="s">~CAP_SYS_ADMIN</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"><span class="c"># Make the system tree read-only.</span> +</span></span><span class="line"><span class="cl"><span class="na">ProtectSystem</span><span class="o">=</span><span class="s">strict</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"><span class="c"># Make some paths aviable and readable by the process</span> +</span></span><span class="line"><span class="cl"><span class="na">ReadWritePaths</span><span class="o">=</span><span class="s">/other-dir/misskey</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"><span class="c"># Allocate a separate /tmp.</span> +</span></span><span class="line"><span class="cl"><span class="na">PrivateTmp</span><span class="o">=</span><span class="s">yes</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"><span class="c"># Ensure the service can never gain new privileges.</span> +</span></span><span class="line"><span class="cl"><span class="na">NoNewPrivileges</span><span class="o">=</span><span class="s">yes</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"><span class="c"># Prohibit access to any kind of namespacing.</span> +</span></span><span class="line"><span class="cl"><span class="na">RestrictNamespaces</span><span class="o">=</span><span class="s">yes</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"><span class="c"># Make cgroup file system hierarchy inaccessible.</span> +</span></span><span class="line"><span class="cl"><span class="na">ProtectControlGroups</span><span class="o">=</span><span class="s">yes</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"><span class="c"># Deny kernel module loading.</span> +</span></span><span class="line"><span class="cl"><span class="na">ProtectKernelModules</span><span class="o">=</span><span class="s">yes</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"><span class="c"># Make kernel variables (e.g. /proc/sys) read-only.</span> +</span></span><span class="line"><span class="cl"><span class="na">ProtectKernelTunables</span><span class="o">=</span><span class="s">yes</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"><span class="c"># Deny hostname changing.</span> +</span></span><span class="line"><span class="cl"><span class="na">ProtectHostname</span><span class="o">=</span><span class="s">yes</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"><span class="c"># Deny realtime scheduling.</span> +</span></span><span class="line"><span class="cl"><span class="na">RestrictRealtime</span><span class="o">=</span><span class="s">yes</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"><span class="c"># Deny access to the kernel log ring buffer.</span> +</span></span><span class="line"><span class="cl"><span class="na">ProtectKernelLogs</span><span class="o">=</span><span class="s">yes</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"><span class="c"># Deny setting the hardware or system clock.</span> +</span></span><span class="line"><span class="cl"><span class="na">ProtectClock</span><span class="o">=</span><span class="s">yes</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"><span class="c"># Filter dangerous system calls. The following is listed as safe basic</span> +</span></span><span class="line"><span class="cl"><span class="c"># choice in systemd.exec(5).</span> +</span></span><span class="line"><span class="cl"><span class="na">SystemCallArchitectures</span><span class="o">=</span><span class="s">native</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"><span class="c"># Deny kernel execution domain changing.</span> +</span></span><span class="line"><span class="cl"><span class="na">LockPersonality</span><span class="o">=</span><span class="s">yes</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"><span class="c"># Deny memory mappings that are writable and executable.</span> +</span></span><span class="line"><span class="cl"><span class="c"># Node fucking dies if this is enabled.</span> +</span></span><span class="line"><span class="cl"><span class="c">#MemoryDenyWriteExecute=yes</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"><span class="k">[Install]</span> +</span></span><span class="line"><span class="cl"><span class="na">WantedBy</span><span class="o">=</span><span class="s">multi-user.target</span></span></span></code></pre></div></div><div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0"> + <button + class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50" + title="Copy code" + > + <div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4"></div> + <div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4"></div> + </button> + </div> +</div> +<p>Después de copiar y pegar esto y hacer respectivas modificaciones como en WorkingDirectory con systemd puedes iniciar el servicio/programa y notarás que utiliza el usuario misskey para ello.</p> +<div class="code-block relative mt-6 first:mt-0 group/code"><div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">sudo systemctl daemon-reload +</span></span><span class="line"><span class="cl">sudo systemctl start misskey</span></span></code></pre></div></div><div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0"> + <button + class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50" + title="Copy code" + > + <div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4"></div> + <div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4"></div> + </button> + </div> +</div> +<p>Puedes utilizar este comando para habilitar que se inicie automáticamente al encender el servidor.</p> +<div class="code-block relative mt-6 first:mt-0 group/code"><div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">sudo systemctl <span class="nb">enable</span> misskey</span></span></code></pre></div></div><div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0"> + <button + class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50" + title="Copy code" + > + <div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4"></div> + <div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4"></div> + </button> + </div> +</div> + + + + + + Servidor HTTP + https://portal.novoa.nagoya/docs/misskey/http-server/ + Mon, 01 Jan 0001 00:00:00 +0000 + + https://portal.novoa.nagoya/docs/misskey/http-server/ + + + + <p>Usa e instala caddy</p> +<p>Modifica /etc/caddy/Caddyfile</p> +<p>Añade</p> +<div class="code-block relative mt-6 first:mt-0 group/code"><pre><code>tu.dominio.tld { +    reverse_proxy localhost:$PUERTO_DE_MISSKEY +}</code></pre><div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0"> + <button + class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50" + title="Copy code" + > + <div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4"></div> + <div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4"></div> + </button> + </div> +</div> +<p>Inicia caddy.</p> + + + + + + diff --git a/public/docs/misskey/misskey.service b/public/docs/misskey/misskey.service new file mode 100644 index 0000000..85eb8c2 --- /dev/null +++ b/public/docs/misskey/misskey.service @@ -0,0 +1,72 @@ +[Unit] +Description=Misskey daemon + +[Service] +Type=simple +User=misskey +ExecStart=/usr/bin/pnpm start +WorkingDirectory=/other-dir/misskey +Environment="NODE_ENV=production" +TimeoutSec=60 +SyslogIdentifier=misskey +Restart=always + +; Some security directives. +; Use private /tmp and /var/tmp folders inside a new file system namespace, which are discarded after the process stops. +PrivateTmp=true +; The /home, /root, and /run/user folders can not be accessed by this service anymore. If your misskey user has its home folder in one of the restricted places, or use one of these folders as its working directory, you have to set this to false. +ProtectHome=true +; Sets up a new /dev mount for the process and only adds API pseudo devices like /dev/null, /dev/zero or /dev/random but not physical devices. Disabled by default because it may not work on devices like the Raspberry Pi. +PrivateDevices=true +; Drops the sysadmin capability from the daemon. +CapabilityBoundingSet=~CAP_SYS_ADMIN + +# Make the system tree read-only. +ProtectSystem=strict + +# Make some paths aviable and readable by the process +ReadWritePaths=/other-dir/misskey + +# Allocate a separate /tmp. +PrivateTmp=yes + +# Ensure the service can never gain new privileges. +NoNewPrivileges=yes + +# Prohibit access to any kind of namespacing. +RestrictNamespaces=yes + +# Make cgroup file system hierarchy inaccessible. +ProtectControlGroups=yes + +# Deny kernel module loading. +ProtectKernelModules=yes + +# Make kernel variables (e.g. /proc/sys) read-only. +ProtectKernelTunables=yes + +# Deny hostname changing. +ProtectHostname=yes + +# Deny realtime scheduling. +RestrictRealtime=yes + +# Deny access to the kernel log ring buffer. +ProtectKernelLogs=yes + +# Deny setting the hardware or system clock. +ProtectClock=yes + +# Filter dangerous system calls. The following is listed as safe basic +# choice in systemd.exec(5). +SystemCallArchitectures=native + +# Deny kernel execution domain changing. +LockPersonality=yes + +# Deny memory mappings that are writable and executable. +# Node fucking dies if this is enabled. +#MemoryDenyWriteExecute=yes + +[Install] +WantedBy=multi-user.target diff --git a/public/docs/misskey/sys-units/index.html b/public/docs/misskey/sys-units/index.html new file mode 100644 index 0000000..3b590fc --- /dev/null +++ b/public/docs/misskey/sys-units/index.html @@ -0,0 +1,601 @@ + + + + + + + + + + + + + + Integración al sistema – Novoa en español + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+
+ +
Integración al sistema
+
+ +
+

Integración al sistema

+

Esta parte es un poco complicada porque habla de linux como sistema de nuevo.

+

No voy a ahondar en detalle porque el archivo ya explica (aunque en inglés) y estoy cansado.

+

Esta es la unidad del sistema que uso en Novoa, como es algo que escribí de manera personalizada lo he situado dentro de /etc/systemd/system/misskey.service para que no se confundiera con otros archivos.

+ + + + +
[Unit]
+Description=Misskey daemon
+
+[Service]
+Type=simple
+User=misskey
+ExecStart=/usr/bin/pnpm start
+WorkingDirectory=/other-dir/misskey
+Environment="NODE_ENV=production"
+TimeoutSec=60
+SyslogIdentifier=misskey
+Restart=always
+
+; Some security directives.
+; Use private /tmp and /var/tmp folders inside a new file system namespace, which are discarded after the process stops.
+PrivateTmp=true
+; The /home, /root, and /run/user folders can not be accessed by this service anymore. If your misskey user has its home folder in one of the restricted places, or use one of these folders as its working directory, you have to set this to false.
+ProtectHome=true
+; Sets up a new /dev mount for the process and only adds API pseudo devices like /dev/null, /dev/zero or /dev/random but not physical devices. Disabled by default because it may not work on devices like the Raspberry Pi.
+PrivateDevices=true
+; Drops the sysadmin capability from the daemon.
+CapabilityBoundingSet=~CAP_SYS_ADMIN
+
+# Make the system tree read-only.
+ProtectSystem=strict
+
+# Make some paths aviable and readable by the process
+ReadWritePaths=/other-dir/misskey
+
+# Allocate a separate /tmp.
+PrivateTmp=yes
+
+# Ensure the service can never gain new privileges.
+NoNewPrivileges=yes
+
+# Prohibit access to any kind of namespacing.
+RestrictNamespaces=yes
+
+# Make cgroup file system hierarchy inaccessible.
+ProtectControlGroups=yes
+
+# Deny kernel module loading.
+ProtectKernelModules=yes
+
+# Make kernel variables (e.g. /proc/sys) read-only.
+ProtectKernelTunables=yes
+
+# Deny hostname changing.
+ProtectHostname=yes
+
+# Deny realtime scheduling.
+RestrictRealtime=yes
+
+# Deny access to the kernel log ring buffer.
+ProtectKernelLogs=yes
+
+# Deny setting the hardware or system clock.
+ProtectClock=yes
+
+# Filter dangerous system calls. The following is listed as safe basic
+# choice in systemd.exec(5).
+SystemCallArchitectures=native
+
+# Deny kernel execution domain changing.
+LockPersonality=yes
+
+# Deny memory mappings that are writable and executable.
+# Node fucking dies if this is enabled.
+#MemoryDenyWriteExecute=yes
+
+[Install]
+WantedBy=multi-user.target
+ +
+
+

Después de copiar y pegar esto y hacer respectivas modificaciones como en WorkingDirectory con systemd puedes iniciar el servicio/programa y notarás que utiliza el usuario misskey para ello.

+
sudo systemctl daemon-reload
+sudo systemctl start misskey
+ +
+
+

Puedes utilizar este comando para habilitar que se inicie automáticamente al encender el servidor.

+
sudo systemctl enable misskey
+ +
+
+ +
+ +
Última actualización
+ + +
+
+
+ + + + + + + + + + + + diff --git a/public/docs/sysadmin/index.html b/public/docs/sysadmin/index.html new file mode 100644 index 0000000..661873c --- /dev/null +++ b/public/docs/sysadmin/index.html @@ -0,0 +1,504 @@ + + + + + + + + + + + + + + Administración de servidores – Novoa en español + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+
+
Administración de servidores
+
+ +
+

Administración de servidores

+

Recomendaciones generales +

Creo que en primer lugar debes saber y conocer el entorno y/o sistema con el que estas trabajando, en mis servidores he optado por Debian por su versatilidad (en términos de servidores), disponibilidad y estabilidad.

+

Sobre Debian debes de saber que hay muchos paquetes o software de servidor que puedes instalar directamente desde su administrador de paquetes, no teniendo que compilar el software ni variables de entorno ni nada, lo único que quedaría en manos del administrador sería justamente administrar los servicios, sin necesidad de complicaciones en absoluto.

+

Usuarios en linux/UNIX +

Estos sistemas fueron diseñados desde un inicio para ser utilizados por varios usuarios de manera simultanea, cada uno con un entorno más o menos aisaldo unos con otros, es decir los programas y datos usados por un usuario no pueden ser usados por otro y viceversa.

+

Sin embargo también hay un usuario principal llamado super usuario, este usuario también es conocido como root, que es el usuario que puede cambiar todas las configuraciones del sistema e instalar y ejecutar programas a su antojo y sobre otros usuarios, es el usuario que tiene control sobre todo y con el que también se terminan realizando multiples tareas de mantenimiento y administración (como la actualización de software).

+

Siendo este usuario tan imporante es una buena idea usarlo en la menor medida si no sabes exactamente lo que el comando que estas usando esta realmente realizando, de esta manera, como es un poco imposible verificar y checar todo el código existente en tu sistema lo que se realiza de manera general es hacer un usuario por cada servicio o programa que estes ejecutando (que es también lo que hacen varias distribuciones como Debian).

+

He de mencionar que hay programas más complejos que quizá requieran el uso de grupos como tareas de respaldo pero eso lo detallaré en otra entrada.

+

Privilegios de usuarios +

Lo mejor aquí es que ya que son usuarios de alguna u otra manera virtual, creados solo para ejecutar un programa los queremos de una manera aislada y con los privilegios mínimos que se les puedan otorgar, así si el servicio que operamos tiene una falla causará el menor daño en el sistema, el propósito de esto es mitigar las superficie de ataque y este es un patrón es algo usado en todos los programas, como en sus usuarios, sus entornos de ejecución y sus unidades de servicio.

+ +
+ +
Última actualización
+ + +
+
+
+ + + + + + + + + + + + diff --git a/public/docs/sysadmin/index.xml b/public/docs/sysadmin/index.xml new file mode 100644 index 0000000..420e1fc --- /dev/null +++ b/public/docs/sysadmin/index.xml @@ -0,0 +1,33 @@ + + + Novoa en español – Administración de servidores + https://portal.novoa.nagoya/docs/sysadmin/ + Recent content in Administración de servidores on Novoa en español + Hugo -- gohugo.io + es-MX + Sat, 13 Jan 2024 13:36:16 -0600 + + + + + + + + + + + Servidores + https://portal.novoa.nagoya/docs/sysadmin/util/ + Mon, 01 Jan 0001 00:00:00 +0000 + + https://portal.novoa.nagoya/docs/sysadmin/util/ + + + + <h1>Programas y utilidades</h1><p><code>curl neovim git</code></p> + + + + + + diff --git a/public/docs/sysadmin/util/index.html b/public/docs/sysadmin/util/index.html new file mode 100644 index 0000000..efd1433 --- /dev/null +++ b/public/docs/sysadmin/util/index.html @@ -0,0 +1,474 @@ + + + + + + + + + + + + + + Servidores – Novoa en español + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+ + +
+

Servidores

+

Programas y utilidades

curl neovim git

+ +
+ +
Última actualización
+ + +
+
+
+ + + + + + + + + + + + diff --git a/public/en.search-data.json b/public/en.search-data.json new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/public/en.search-data.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/public/en.search.min.9afdc7c586c6f971dd94df10b989f10faaf38e5702571fd8cfc9ff9135c2d495.js b/public/en.search.min.9afdc7c586c6f971dd94df10b989f10faaf38e5702571fd8cfc9ff9135c2d495.js new file mode 100644 index 0000000..80046ed --- /dev/null +++ b/public/en.search.min.9afdc7c586c6f971dd94df10b989f10faaf38e5702571fd8cfc9ff9135c2d495.js @@ -0,0 +1,8 @@ +document.addEventListener("DOMContentLoaded",function(){if(/iPad|iPhone|Macintosh/.test(navigator.userAgent)){const e=document.querySelectorAll(".search-wrapper kbd");e.forEach(e=>{e.innerHTML='K'})}}),function(){const l="/en.search-data.json",d=document.querySelectorAll(".search-input");for(const e of d)e.addEventListener("focus",s),e.addEventListener("keyup",h),e.addEventListener("keydown",o);function e(){const e=Array.from(document.querySelectorAll(".search-wrapper")).filter(e=>e.clientHeight>0);return e.length===1?{wrapper:e[0],inputElement:e[0].querySelector(".search-input"),resultsElement:e[0].querySelector(".search-results")}:void 0}const r=["input","select","button","textarea"];document.addEventListener("keydown",function(t){const{inputElement:n}=e();if(!n)return;const s=document.activeElement,o=s&&s.tagName;if(n===s||!o||r.includes(o)||s&&s.isContentEditable)return;t.key==="/"||t.key==="k"&&(t.metaKey||t.ctrlKey)?(t.preventDefault(),n.focus()):t.key==="Escape"&&n.value&&n.blur()}),document.addEventListener("mousedown",function(n){const{inputElement:o,resultsElement:s}=e();if(!o||!s)return;n.target!==o&&n.target!==s&&!s.contains(n.target)&&t()});function i(){const{resultsElement:n}=e();if(!n)return{result:void 0,index:-1};const t=n.querySelector(".active");if(!t)return{result:void 0,index:-1};const s=parseInt(t.dataset.index,10);return{result:t,index:s}}function a(t){const{resultsElement:s}=e();if(!s)return;const{result:o}=i();o&&o.classList.remove("active");const n=s.querySelector(`[data-index="${t}"]`);n&&(n.classList.add("active"),n.focus())}function c(){const{resultsElement:t}=e();return t?t.dataset.count:0}function n(){const{inputElement:n}=e();if(!n)return;t(),n.value="",n.blur()}function t(){const{resultsElement:t}=e();if(!t)return;t.classList.add("hidden")}function o(s){const{inputElement:r}=e();if(!r)return;const d=c(),{result:l,index:o}=i();switch(s.key){case"ArrowUp":s.preventDefault(),o>0&&a(o-1);break;case"ArrowDown":s.preventDefault(),o+1e._page_rk===t._page_rk?e._section_rk-t._section_rk:s[e._page_rk]!==s[t._page_rk]?s[t._page_rk]-s[e._page_rk]:e._page_rk-t._page_rk).map(e=>({id:`${e._page_rk}_${e._section_rk}`,route:e.route,prefix:e.prefix,children:e.children}));m(c,i)}function m(t,s){const{resultsElement:i}=e();if(!i)return;if(!t.length){i.innerHTML=`No results found.`;return}function r(e,t){const n=t.replace(/[-\\^$*+?.()|[\]{}]/g,"\\$&"),s=new RegExp(n,"gi");return e.replace(s,e=>`${e}`)}function c(e){const t=document.createElement("div");return t.innerHTML=e.trim(),t.firstChild}function l(e){const t=e.target.closest("a");if(t){const e=i.querySelector("a.active");e&&e.classList.remove("active"),t.classList.add("active")}}const a=document.createDocumentFragment();for(let i=0;i${e.prefix}`));let d=c(` +
  • + +
    `+r(e.children.title,s)+`
    `+(e.children.content?`
    `+r(e.children.content,s)+`
    `:"")+` +
    +
  • `);d.addEventListener("mousemove",l),d.addEventListener("keydown",o),d.querySelector("a").addEventListener("click",n),a.appendChild(d)}i.appendChild(a),i.dataset.count=t.length}}() \ No newline at end of file diff --git a/public/en/404.html b/public/en/404.html new file mode 100644 index 0000000..0628f45 --- /dev/null +++ b/public/en/404.html @@ -0,0 +1,27 @@ +
    +
    + +

    404

    +
    +

    This page could not be found.

    +
    +
    +
    diff --git a/public/en/categories/index.html b/public/en/categories/index.html new file mode 100644 index 0000000..279cae1 --- /dev/null +++ b/public/en/categories/index.html @@ -0,0 +1,291 @@ + + + + + + + + + + + + + + Categories – Novoa in english + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + +
    +
    +
    +

    Categories

    + +
    +
    +
    + +
    +
    +
    + +
    +
    +
    +
    +
    + + + + + + + + + + diff --git a/public/en/categories/index.xml b/public/en/categories/index.xml new file mode 100644 index 0000000..3afed21 --- /dev/null +++ b/public/en/categories/index.xml @@ -0,0 +1,18 @@ + + + Novoa in english – Categories + https://portal.novoa.nagoya/en/categories/ + Recent content in Categories on Novoa in english + Hugo -- gohugo.io + en-US + + + + + + + + + + + diff --git a/public/en/index.html b/public/en/index.html new file mode 100644 index 0000000..1b35bc0 --- /dev/null +++ b/public/en/index.html @@ -0,0 +1,307 @@ + + + + + + + + + + + + + + + Novoa in english + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + +
    +
    +

    Novoa in english

    +
    + +
    +
    +
    +
    + +
    + + +
    +

    +
    +
    +
    +
    + + + + + + + + + + diff --git a/public/en/sitemap.xml b/public/en/sitemap.xml new file mode 100644 index 0000000..387aaec --- /dev/null +++ b/public/en/sitemap.xml @@ -0,0 +1,41 @@ + + + + https://portal.novoa.nagoya/en/categories/ + + + + https://portal.novoa.nagoya/en/ + + + + https://portal.novoa.nagoya/en/tags/ + + + + diff --git a/public/en/tags/index.html b/public/en/tags/index.html new file mode 100644 index 0000000..421648d --- /dev/null +++ b/public/en/tags/index.html @@ -0,0 +1,291 @@ + + + + + + + + + + + + + + Tags – Novoa in english + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + +
    +
    +
    +

    Tags

    + +
    +
    +
    + +
    +
    +
    + +
    +
    +
    +
    +
    + + + + + + + + + + diff --git a/public/en/tags/index.xml b/public/en/tags/index.xml new file mode 100644 index 0000000..1879c5b --- /dev/null +++ b/public/en/tags/index.xml @@ -0,0 +1,18 @@ + + + Novoa in english – Tags + https://portal.novoa.nagoya/en/tags/ + Recent content in Tags on Novoa in english + Hugo -- gohugo.io + en-US + + + + + + + + + + + diff --git a/public/es.search-data.json b/public/es.search-data.json new file mode 100644 index 0000000..9c372de --- /dev/null +++ b/public/es.search-data.json @@ -0,0 +1 @@ +{"/docs/":{"data":{"":"Este espacio es para la documentación general del servidor, en cada sección subirñe documentación pertinente a cada servicio.\nIré avanzando lentamente porque me da un poco de pereza y tengo tambien muchas otras cosas que hacer, lo que ves es lo que hay aunque puede que aveces suceda que no actualize la página.\nYa que mis servidores usan Debian y OpenBSD todo lo escrito en la documentación y guías sera en los entornos de alguno de estos sistemas.\nComparto el repositorio el cual esta aquí↗ por transparencia y por si dejo de subir actualizaciones al servidor."},"title":"Documentación de Novoa"},"/docs/fediverso/":{"data":{"":"Por cierto en esta sección pondré muchas “páginas” que tenía en misskey.\nSon varías las bifurcaciones del fediverso, por un lado, esta pleroma y el otro mastodon, mientras en el medio quizás un tanto aislado se encuentra misskey, pues su funcionalidad u orientación del software y proyecto es distinta a la de los otros dos equivalencias de twitter.\nSé que nada de lo que digo ahora tiene sentido para ti si vienes de fuera, pero lo tendrá al final de este texto.\nEl fediverso es una red interconectada de distintos servidores (o instancias) que operan y se comunican mediante un protocolo llamado Activity Pub (sin embargo, también hay otros protocolos) lo que esto permite es que diferentes sitios compartan información de sus usuarios unos con otros, en otras palabras los servidores se comunican y de esta manera también sus usuarios.\nHay varias orientaciones en el fediverso, distintos tipos de software o servidores que se orientan a distintas tareas, por ejemplo peertube que busca ser una alternativa federada a youtube. Donde estamos ahora es en el lado social, interactivo y variado del fediverso; Mastodon que se creó para ser tan cercano a twitter como le sea posible, Pleroma creado para ser compatible con mastodon, pero al mismo tiempo con sus propias peculiaridades y finalmente Misskey, donde estás ahora leyendo esto si eres usuario de esta instancia, que como te darás cuenta es más bien un software que plantea ser sí mismo con la ocurrencia de que también es federado y se comunica con los otros dos tipos de instancia.\nPuedes identificar cada una de estas por sus iconos en algunas ocasiones, mástodon es azul con un elefante, pleroma por defecto tiene una P naranja con un fondo oscuro y algunos de sus administradores le ponen también una pl a su subdominio, por otro lado, algunos administradores de misskey le ponen una mk a su dirección web (mk.dirección.tld).\nHay otros recursos que explican en mucho más detalle lo que es el fediverso como los que enlazaré a continuación (aunque están en inglés). Personalmente, pienso que es el futuro y de lo que nunca nos deberíamos haber desviado con las web centralizada de FAGMAN (Facebook, Amazon. Google, Microsoft, Apple, Netflix), somos entonces la alternativa y los pocos que nos hemos salido de ahí por una razón u otra.\nEs así también un oasis o un relicario de la era olvidada del internet de los principios de los 2000s y quizás un poco antes de, de la cultura que también sobrevivió de una manera u otra en 4chan y otros foros aislados, si eres de fuera, tienes que comprender algo crucial, y eso es el anonimato, este internet se rige por avatares, no por tu persona ‘real’, de esta manera “culturalmente” no es esperado que des información personal, pues es más bien confidencial pues es completamente abierto al público, la idea, de que todo lo que se sube al internet permanece ahí para siempre es completamente verdadera aquí en el fediverso, así que anda con cuidado y más allá de eso, diviértete con tus experiencias aquí, con cualquier icono que hayas seleccionado, quizás y hasta es más verdadero e interesante de lo que imaginas ;)","historia-del-fediverso#Historia del Fediverso":"Gente con mucho mejor prosa que la mía actual ya ha escrito sobre los temas de esta página (sin embargo en inglés) recomiendo mucho su lectura si es de interés:\nGNU Social y el inicio de Mastodon - https://robek.world/featured/what-is-gnu-social-and-is-mastodon-social-a-twitter-clone/\nOtra reflexión antigua sobre el Fediverso por Lain(o lambdalambda, creador de Pleroma) - https://robek.world/futurology/an-admin-what-if-there-was-twitter-without-nazis/","más-información-sobre-el-fediverso#Más información sobre el fediverso:":"https://fediverse.party/\nhttps://jointhefedi.com/\nFediverse Observer | Misskey\nGitHub - emilebosch/awesome-fediverse: A curated, collaborative list of awesome Fediverse resources"},"title":"Fediverso"},"/docs/fediverso/disclaimer/":{"data":{"":"Robado sin descaro de misskey-hub, pero sigue siendo bastante válido para esta instancia.","consideraciones-importantes#Consideraciones importantes":"Hay algunos puntos que deben tenerse en cuenta al utilizar servicios que utilizan Misskey.\nDebido a su naturaleza descentralizada, una vez subidos, los datos no están garantizados para ser eliminados de todos los demás servidores, incluso si se borran.(Sin embargo, esto también es cierto para Internet en general). Incluso si un mensaje se crea como privado, no hay garantía de que los otros servidores lo traten también como privado, así que por favor, ten cuidado cuando publiques información personal o confidencial (aunque esto también ocurre en Internet en general).\nPor favor, comprenda estos puntos y disfrute utilizando nuestros servicios."},"title":"Disclaimer"},"/docs/misskey/":{"data":{"":"Esta guía/documentación esta planteada para una instalación completamente manual sobre algún servidor gnu/linux como Debian de manera directa, es decir no hará uso de kubernetes, docker o cualquier otro software de virtualización, también asume que tienes un acceso a root mediante shell a tu sistema ya sea este un servidor virtual o uno montado en el hardware directamente.\nEstoy adaptando un poco la guía que esta ahí fuera sobre misskey porque también fue lo que hice. Cuando inicié esta instancia recuerdo que la única documentación que existía estaba literalmente en chino y en japonés ⬅️ Esa es la guía base y más actualizada sobre como instalar misskey.","agradecimientos-y-recursos-de-referencia#Agradecimientos y recursos de referencia:":"Pleroma Documentation\nMisskeyを手動で構築する | Misskey Hub\nUbuntu Misskey Installation Instructions Description of the instance settings and other settings to be set up first on a Misskey instance Set up squid proxies to protect Misskey Let’s back up Misskey’s database [OCI Object Storage] Use Oracle Cloud Infrastructure Always Free to set up Misskey instances for free If your Always Free OCI Arm instance is stopped…","compilación#Compilación":"Son solo dos comandos, uno va a compilar el software y el segundo va a dejar todo listo para el uso del programa haciendo modificaciones necesarias en la base de datos.\npnpm run build pnpm run init Finalmente vamos a iniciar el servidor con:\nNODE_ENV=production pnpm run start ","configuración#Configuración":"Hay un archivo plantilla para la configuración de misskey, como en muchos paquetes de Debian. Este paso es relativamente sencillo pues no hay que configurar mucho y el archivo se explica a sí mismo. Hay algunas notas importantes como nunca cambiar el nombre de dominio de un servidor una vez que haya empezado a utilizarlo.\ncp .config/example.yml .config/default.yml: Copia .config/example.yml y lo renombra a default.yml.\nY este último archivo editalo con tu editor de textos favoritos y ya que probablemente estas haciendo esto desde una terminal los comandos que podrias usar son nano vi vim nvim etc. dependiendo de que tengas instalado.\nConsideraciones de configuración En la configuración por defecto todos los archivos que se suban al servidor (drive), sean imágenes, vídeos, pdf, lo que sea, todo se almacenará dentro de la carpeta raíz donde se descargó el repositorio mediante git en una carpeta llamada files/ y es un poco díficil de administrar sin usar misskey (y no se debería hacer pues también hay una relación existente en la base de datos) pues se guardan con nombres generados por el programa.","errores-de-instalación#Errores de instalación":"Limpiar todo el caché manualmente y reinstalar por completo.\npnpm run clean y pnpm run clean-all pnpm rebuild ","preparaciones-para-instalar-misskey#Preparaciones para instalar Misskey":"Crear el usuario Primero crear la carpeta donde estará alojado todo lo pertinente a nuestra instancia\nsudo mkdir /sys-users/ o cualquier ruta de archivo que se desee.\nPosteriormente los usuarios deberían ser creados con privilegios mínimos:\nadduser --system --disabled-password --disabled-login --shell=/bin/false --home /sys-users/mk misskey misskey al final puede ser cambiado por cualquier otro nombre de usuario.\nEl comando anterior va a crear una carpeta donde todos los permisos los tiene el usuario recientemente creado en /sys-users/mk.\nQuizá algunas de esas opciones sean redundantes como --disabled-login --shell=/bin/false pues no se puede iniciar sesión sin acceso a shell pero prefiero redundancia y explicidad, además de que no causa ningún problema.\nLo que cada una de estas opciones (flags en inglés) marca o configura es que:\n--system: Crea un usuario del sistema con un uid \u003c 1000. Usuarios normales tienen un uid \u003e 1000.\n--disabled-password: El usuario no puede iniciar sesión usando una contraseña, solo se puede iniciar sesión desde o siendo super usuario o con un usuario con privilegios de super usuario.\n--disabled-login: Bloquea el intento de inicio de sesión.\n--shell=/bin/false: La opción shell configura la shell por defecto que usara el usuario, al marcar esta opción como falsa el usuario no podrá acceder a ningun entorno de la línea de comandos, es decir no podrá ejecutar ningun comando desde alguna terminal de manera directa.\n--no-create-home: el usuario misskey no tenga un directorio dentro de /home.\n--base-dir/DIRECTORIO_BASE: Es donde todos los usuarios serán creados por defecto, y se concatena con el nombre del usuario. Por defecto es /home entonces en este caso si no se cambia nada el directorio y variable $HOME del usuario sería /home/misskey. Si solo se cambia esta opción y no la que sigue el directorio terminaría siendo algo como /directorio-distinto/misskey.\n--home /DIRECTORIO_HOME: En este caso es para más control sobre donde se colocará al usuario. Simplemente hay que poner la ruta completa de la carpeta como /directorio-distinto/un-nombre-distinto y ahí es donde se le asiganara el valor de $HOME al usuario, sin embargo hay que tomar en cuenta que el programa no creará ninguna carpeta así que hay que hacerlas directamente con mkdir.\nDependencias del sistema :package: Dependiendo de que sistema operativo uses los comandos que tengas que utilizar para instalar programas serán distintos, si quieres ayuda con alguno me puedes contactar directamente en XMPP, pues estoy familiarizado con varias versiones de linux.\nAntes de instalar las dependencias debes que saber que dependiendo de la versión de misskey (o sus forks) cada una de estos componentes variaran en las versiones mínimas necesarias, por ejemplo cuando yo instalé misskey por primera vez estaba usando postgres 13 y de hecho lo seguía usando incluso cuando ya no era soportado supuestamente y no resultó en ningún problema. Misskey tampoco hace una revisión de las versiones de los programas fuera de node, dicho esto, puede que sea una mejor opción optar por las versiones otorgadas en el repositorio base de tu sistema.\nHe adjuntado un link a cada uno de los programas necesarios para instalar y ejecturar misskey, quizá en algún futuro haga una documentación sobre como los instale yo en mi sistema ya que cada uno de estos links tiene instrucciones específicas:\nNode.js \u003e= 20.4.x ➡️ se usa como la base del servidor, misskey esta construido sobre node.\nPostgreSQL \u003e= 15.x ➡️ Base de datos donde se almacenarán todos los posts y las relaciones entre usuarios. instancias. etc. de manera permanente.\nRedis \u003e= 7.0 ➡️ Base de datos transaccional usada como caché, para listas y relaciones no permanentes.\nFFmpeg ➡️ Usado para pasar un formato de multimedia a otro.\nEn la guía original se menciona instalar build-essential para distribuciones basadas en Debian.\nVarias utilidades usadas para el manejo del sistema como git y neo/vim.\nAsumiendo que esta usando Debian y agregaste todos esos repositorios al administrador de paquetes (o vas a usar solo los paquetes que provee Debian) tu comando final para instalarlos debería quedar algo como:\nsudo apt install build-essential nodejs postgresql redis ffmpeg Hacer una base de datos en PostgreSQL Actualmente misskey no tiene una manera de crear usuarios en postgres automáticamente así que tendremos que hacer uno y establecer su contraseña y métodos de acceso de manera manual.\nPrimero cambiar al usuario postgres\nsu - postgres\nDentro de ese usuario se creará un usuario exclusivo de misskey para acceder a la base de datos desde el software.\ncreateuser -P example-misskey-user\nEste comando pedirá una contraseña que debe ser introducida 2 veces.\nFinalmente vamos a hacer una base de datos para misskey con el usuario que acabamos de crear.\ncreatedb -O example-misskey-user misskey-database\nSin haber nada más que hacer en postgres la manera de salir de la sesión es escribiendo exit, lo cual nos llevara a la sesión anterior.\nPreparar el entorno de compilación Misskey al ser un progama escrito en JavaScript todas las librerías que usa son en este mismo lenguaje que tiene su propio administrador de paquetes fuera de apt/debian, para esto debemos habilitar pnpm y para la compilación y tener las caracteristicas de un servidor en producción se debe que declarar variable de entorno:\nsudo corepack enable export NODE_ENV=production Instalar dependencias de JavaScript Usuarios de compilación Hay bastantes maneras de hacer esto:\nEs mediante tu mismo usuario y despues cambiando la propiedad de la carpeta en la que instalaste misskey recursivamente. Esta manera es un poco sucia a falta de una mejor palabra en este momento, pero sirve y es la más sencilla.\nAquí harías todos los pasos siguentes mediante tu usuario y despues dentro de la carpeta donde instalaste misskey ejecutar sudo chown -R misskey:misskey . - El punto dentro de cualquier shell toma el valor de la carpeta en la que estas actualmente, puedes revisar en que carpeta estas con otro comando pwd o en vez del punto puedes usar la ruta completa para seleccionar en que carpeta quieres efectuar el comando. Hacerlo todo desde el usuario misskey iniciando sesión, desde otro usuario para esto usaríamos el comando su que cambia de usuario, conscisamente sudo su - misskey.\nHacerlo de esta manera es casi lo mismo que la anterior solo que ya no hay que cambiar la poseción de ningun arhivo.\nSin embargo tambien si habilitaste que misskey no pueda acceder a ninguna shell este paso será imposible de realizar a menos que cambies la configuración, así que tenlo en cuenta.\nLa tercera forma que esta en medio de ambas es algo sencilla tambien y da los beneficios de ambas sin comprometer seguridad de alguna manera. No podemos acceder a una interfaz de linea de comandos como shell, pero sí es posible ejecutar comandos como ese otro usuario, para esto a todos los comandos que vayamos a ejecutar antes hay que añadirles sudo -Hu misskey ...\nUn truco para realizar los comandos de una manera más sencilla es hacer un alias temporal dentro de la terminal simplemente ejecutando algo como alias smk=\"sudo -Hu misskey\" y ahora cada que ejecutes smk dentro de esa sesión el programa correra bajo el usuario misskey. En todos los casos debemos que ir a la carpeta $HOME de nuestro usuario, en este caso con el comando cd /sys-users/mk\nPara todas las opciones deberas ejecutar los siguientes comandos:\ngit clone --recursive https://github.com/misskey-dev/misskey.git -b master cd misskey git submodule update --init pnpm install --frozen-lockfile Los cuales clonan el repositiorio y los archivos base para compilar misskey y pnpm instala dependencias de javascript de este."},"title":"Misskey en Novoa"},"/docs/misskey/actualizar/":{"data":{"":"Para actualizar a la versión de misskey más reciente, cualquier versión posterior a la instalación o migrarse a algún fork los comandos generales son:\nPara actualizar a la versión más reciente dentro de la rama master, que es la principal y supuestamente estable:\ngit checkout master git pull git submodule update --init NODE_ENV=production pnpm install --frozen-lockfile NODE_ENV=production pnpm run build pnpm run migrate Para actualizar a un lanzamiento o versión específica de misskey:\ngit checkout (git tag -l | grep -v 'rc[0-9]*' | sort -V | tail -n 1)\no\ngit checkout $TAG por ejemplo git checkout 2023.12.2\ny despues:\ngit pull git submodule update --init NODE_ENV=production pnpm install --frozen-lockfile NODE_ENV=production pnpm run build pnpm run migrate Ambas métodos de actualización son un poco automatizados en especial en la parte del comando git.\nEn detalle y la forma correcta y más tardada de hacerlo sería checar primero las notas o cambios (en japonés).\nObtener los cambios en el repositorio en nuestra copia local y situarnos en la rama que queramos usar, ya sea master, develop o alguna versión particular.\ngit fetch git checkout $TAG Posteriormente comparar las diferencias o cambios que se han hecho dentro del código.\ngit status Habiendo comparado y estando seguros de que no habrá conflictos vamos a actualizar la rama sobre la que estamos trabajando (la que seleccionamos despues del checkout).\ngit merge Y finalmente actualizar misskey, el primer comando para actualizar las dependencias de JavaScript, el segundo para compilar el programa y el tercero para efectuar todos los cambios en la base de datos necesaria para acomodar a la nueva versión.\nNODE_ENV=production pnpm install --frozen-lockfile NODE_ENV=production pnpm run build pnpm run migrate "},"title":"Actualizar Misskey"},"/docs/misskey/http-server/":{"data":{"":"Usa e instala caddy\nModifica /etc/caddy/Caddyfile\nAñade\ntu.dominio.tld { reverse_proxy localhost:$PUERTO_DE_MISSKEY } Inicia caddy."},"title":"Servidor HTTP"},"/docs/misskey/sys-units/":{"data":{"":"Esta parte es un poco complicada porque habla de linux como sistema de nuevo.\nNo voy a ahondar en detalle porque el archivo ya explica (aunque en inglés) y estoy cansado.\nEsta es la unidad del sistema que uso en Novoa, como es algo que escribí de manera personalizada lo he situado dentro de /etc/systemd/system/misskey.service para que no se confundiera con otros archivos.\nArchivo directo para descarga [Unit] Description=Misskey daemon [Service] Type=simple User=misskey ExecStart=/usr/bin/pnpm start WorkingDirectory=/other-dir/misskey Environment=\"NODE_ENV=production\" TimeoutSec=60 SyslogIdentifier=misskey Restart=always ; Some security directives. ; Use private /tmp and /var/tmp folders inside a new file system namespace, which are discarded after the process stops. PrivateTmp=true ; The /home, /root, and /run/user folders can not be accessed by this service anymore. If your misskey user has its home folder in one of the restricted places, or use one of these folders as its working directory, you have to set this to false. ProtectHome=true ; Sets up a new /dev mount for the process and only adds API pseudo devices like /dev/null, /dev/zero or /dev/random but not physical devices. Disabled by default because it may not work on devices like the Raspberry Pi. PrivateDevices=true ; Drops the sysadmin capability from the daemon. CapabilityBoundingSet=~CAP_SYS_ADMIN # Make the system tree read-only. ProtectSystem=strict # Make some paths aviable and readable by the process ReadWritePaths=/other-dir/misskey # Allocate a separate /tmp. PrivateTmp=yes # Ensure the service can never gain new privileges. NoNewPrivileges=yes # Prohibit access to any kind of namespacing. RestrictNamespaces=yes # Make cgroup file system hierarchy inaccessible. ProtectControlGroups=yes # Deny kernel module loading. ProtectKernelModules=yes # Make kernel variables (e.g. /proc/sys) read-only. ProtectKernelTunables=yes # Deny hostname changing. ProtectHostname=yes # Deny realtime scheduling. RestrictRealtime=yes # Deny access to the kernel log ring buffer. ProtectKernelLogs=yes # Deny setting the hardware or system clock. ProtectClock=yes # Filter dangerous system calls. The following is listed as safe basic # choice in systemd.exec(5). SystemCallArchitectures=native # Deny kernel execution domain changing. LockPersonality=yes # Deny memory mappings that are writable and executable. # Node fucking dies if this is enabled. #MemoryDenyWriteExecute=yes [Install] WantedBy=multi-user.target Después de copiar y pegar esto y hacer respectivas modificaciones como en WorkingDirectory con systemd puedes iniciar el servicio/programa y notarás que utiliza el usuario misskey para ello.\nsudo systemctl daemon-reload sudo systemctl start misskey Puedes utilizar este comando para habilitar que se inicie automáticamente al encender el servidor.\nsudo systemctl enable misskey "},"title":"Integración al sistema"},"/docs/sysadmin/":{"data":{"":"","recomendaciones-generales#Recomendaciones generales":"Creo que en primer lugar debes saber y conocer el entorno y/o sistema con el que estas trabajando, en mis servidores he optado por Debian por su versatilidad (en términos de servidores), disponibilidad y estabilidad.\nSobre Debian debes de saber que hay muchos paquetes o software de servidor que puedes instalar directamente desde su administrador de paquetes, no teniendo que compilar el software ni variables de entorno ni nada, lo único que quedaría en manos del administrador sería justamente administrar los servicios, sin necesidad de complicaciones en absoluto.","usuarios-en-linuxunix#Usuarios en linux/UNIX":"Estos sistemas fueron diseñados desde un inicio para ser utilizados por varios usuarios de manera simultanea, cada uno con un entorno más o menos aisaldo unos con otros, es decir los programas y datos usados por un usuario no pueden ser usados por otro y viceversa.\nSin embargo también hay un usuario principal llamado super usuario, este usuario también es conocido como root, que es el usuario que puede cambiar todas las configuraciones del sistema e instalar y ejecutar programas a su antojo y sobre otros usuarios, es el usuario que tiene control sobre todo y con el que también se terminan realizando multiples tareas de mantenimiento y administración (como la actualización de software).\nSiendo este usuario tan imporante es una buena idea usarlo en la menor medida si no sabes exactamente lo que el comando que estas usando esta realmente realizando, de esta manera, como es un poco imposible verificar y checar todo el código existente en tu sistema lo que se realiza de manera general es hacer un usuario por cada servicio o programa que estes ejecutando (que es también lo que hacen varias distribuciones como Debian).\nHe de mencionar que hay programas más complejos que quizá requieran el uso de grupos como tareas de respaldo pero eso lo detallaré en otra entrada.\nPrivilegios de usuarios Lo mejor aquí es que ya que son usuarios de alguna u otra manera virtual, creados solo para ejecutar un programa los queremos de una manera aislada y con los privilegios mínimos que se les puedan otorgar, así si el servicio que operamos tiene una falla causará el menor daño en el sistema, el propósito de esto es mitigar las superficie de ataque y este es un patrón es algo usado en todos los programas, como en sus usuarios, sus entornos de ejecución y sus unidades de servicio."},"title":"Administración de servidores"},"/docs/sysadmin/util/":{"data":{"programas-y-utilidades#Programas y utilidades":"Programas y utilidadescurl neovim git"},"title":"Servidores"},"/novoa/":{"data":{"centeresta-huevada-sigue-en-construccióncenter#\u003ccenter\u003eESTA HUEVADA SIGUE EN CONSTRUCCIÓN\u003c/center\u003e":"This is the about page.\nAquí no hay nada aún pero haré un copy paste supongo.\nESTA HUEVADA SIGUE EN CONSTRUCCIÓN"},"title":"Acerca de Novoa"}} \ No newline at end of file diff --git a/public/es.search.min.ced554fa9fb00d08f43737c0ce27b4adf5cdf36086f3d69dd33fb94c3d8be0bd.js b/public/es.search.min.ced554fa9fb00d08f43737c0ce27b4adf5cdf36086f3d69dd33fb94c3d8be0bd.js new file mode 100644 index 0000000..e758d4d --- /dev/null +++ b/public/es.search.min.ced554fa9fb00d08f43737c0ce27b4adf5cdf36086f3d69dd33fb94c3d8be0bd.js @@ -0,0 +1,8 @@ +document.addEventListener("DOMContentLoaded",function(){if(/iPad|iPhone|Macintosh/.test(navigator.userAgent)){const e=document.querySelectorAll(".search-wrapper kbd");e.forEach(e=>{e.innerHTML='K'})}}),function(){const l="/es.search-data.json",d=document.querySelectorAll(".search-input");for(const e of d)e.addEventListener("focus",s),e.addEventListener("keyup",h),e.addEventListener("keydown",o);function e(){const e=Array.from(document.querySelectorAll(".search-wrapper")).filter(e=>e.clientHeight>0);return e.length===1?{wrapper:e[0],inputElement:e[0].querySelector(".search-input"),resultsElement:e[0].querySelector(".search-results")}:void 0}const r=["input","select","button","textarea"];document.addEventListener("keydown",function(t){const{inputElement:n}=e();if(!n)return;const s=document.activeElement,o=s&&s.tagName;if(n===s||!o||r.includes(o)||s&&s.isContentEditable)return;t.key==="/"||t.key==="k"&&(t.metaKey||t.ctrlKey)?(t.preventDefault(),n.focus()):t.key==="Escape"&&n.value&&n.blur()}),document.addEventListener("mousedown",function(n){const{inputElement:o,resultsElement:s}=e();if(!o||!s)return;n.target!==o&&n.target!==s&&!s.contains(n.target)&&t()});function i(){const{resultsElement:n}=e();if(!n)return{result:void 0,index:-1};const t=n.querySelector(".active");if(!t)return{result:void 0,index:-1};const s=parseInt(t.dataset.index,10);return{result:t,index:s}}function a(t){const{resultsElement:s}=e();if(!s)return;const{result:o}=i();o&&o.classList.remove("active");const n=s.querySelector(`[data-index="${t}"]`);n&&(n.classList.add("active"),n.focus())}function c(){const{resultsElement:t}=e();return t?t.dataset.count:0}function n(){const{inputElement:n}=e();if(!n)return;t(),n.value="",n.blur()}function t(){const{resultsElement:t}=e();if(!t)return;t.classList.add("hidden")}function o(s){const{inputElement:r}=e();if(!r)return;const d=c(),{result:l,index:o}=i();switch(s.key){case"ArrowUp":s.preventDefault(),o>0&&a(o-1);break;case"ArrowDown":s.preventDefault(),o+1e._page_rk===t._page_rk?e._section_rk-t._section_rk:s[e._page_rk]!==s[t._page_rk]?s[t._page_rk]-s[e._page_rk]:e._page_rk-t._page_rk).map(e=>({id:`${e._page_rk}_${e._section_rk}`,route:e.route,prefix:e.prefix,children:e.children}));m(c,i)}function m(t,s){const{resultsElement:i}=e();if(!i)return;if(!t.length){i.innerHTML=`No hubo resultados.`;return}function r(e,t){const n=t.replace(/[-\\^$*+?.()|[\]{}]/g,"\\$&"),s=new RegExp(n,"gi");return e.replace(s,e=>`${e}`)}function c(e){const t=document.createElement("div");return t.innerHTML=e.trim(),t.firstChild}function l(e){const t=e.target.closest("a");if(t){const e=i.querySelector("a.active");e&&e.classList.remove("active"),t.classList.add("active")}}const a=document.createDocumentFragment();for(let i=0;i${e.prefix}`));let d=c(` +
  • + +
    `+r(e.children.title,s)+`
    `+(e.children.content?`
    `+r(e.children.content,s)+`
    `:"")+` +
    +
  • `);d.addEventListener("mousemove",l),d.addEventListener("keydown",o),d.querySelector("a").addEventListener("click",n),a.appendChild(d)}i.appendChild(a),i.dataset.count=t.length}}() \ No newline at end of file diff --git a/public/es/index.html b/public/es/index.html new file mode 100644 index 0000000..c6e9288 --- /dev/null +++ b/public/es/index.html @@ -0,0 +1,10 @@ + + + + https://portal.novoa.nagoya/ + + + + + + diff --git a/public/es/sitemap.xml b/public/es/sitemap.xml new file mode 100644 index 0000000..0af138d --- /dev/null +++ b/public/es/sitemap.xml @@ -0,0 +1,72 @@ + + + + https://portal.novoa.nagoya/docs/fediverso/disclaimer/ + 2024-01-13T22:32:44-06:00 + + https://portal.novoa.nagoya/docs/fediverso/ + 2024-01-13T22:32:44-06:00 + + https://portal.novoa.nagoya/docs/ + 2024-01-13T22:32:44-06:00 + + https://portal.novoa.nagoya/docs/sysadmin/ + 2024-01-13T22:32:44-06:00 + + https://portal.novoa.nagoya/docs/misskey/ + 2024-01-13T22:32:44-06:00 + + https://portal.novoa.nagoya/novoa/ + 2024-01-13T22:32:44-06:00 + + https://portal.novoa.nagoya/docs/misskey/actualizar/ + 2024-01-13T22:32:44-06:00 + + https://portal.novoa.nagoya/categories/ + + + + https://portal.novoa.nagoya/docs/misskey/sys-units/ + 2024-01-13T22:58:43-06:00 + + https://portal.novoa.nagoya/ + 2024-01-13T22:32:44-06:00 + + + + https://portal.novoa.nagoya/docs/misskey/http-server/ + 2024-01-13T22:32:44-06:00 + + https://portal.novoa.nagoya/docs/sysadmin/util/ + 2024-01-13T22:32:44-06:00 + + https://portal.novoa.nagoya/tags/ + + + + diff --git a/public/favicon-16x16.png b/public/favicon-16x16.png new file mode 100644 index 0000000..0f2dd2b 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..5c1aea5 Binary files /dev/null and b/public/favicon-32x32.png differ diff --git a/public/favicon-dark.svg b/public/favicon-dark.svg new file mode 100644 index 0000000..3b49e35 --- /dev/null +++ b/public/favicon-dark.svg @@ -0,0 +1,13 @@ + + + diff --git a/public/favicon.ico b/public/favicon.ico new file mode 100644 index 0000000..553fa15 Binary files /dev/null and b/public/favicon.ico differ diff --git a/public/favicon.svg b/public/favicon.svg new file mode 100644 index 0000000..6a08d10 --- /dev/null +++ b/public/favicon.svg @@ -0,0 +1,13 @@ + + + diff --git a/public/images/logo-dark.svg b/public/images/logo-dark.svg new file mode 100644 index 0000000..2857264 --- /dev/null +++ b/public/images/logo-dark.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/images/logo.svg b/public/images/logo.svg new file mode 100644 index 0000000..1ed7daf --- /dev/null +++ b/public/images/logo.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/index.html b/public/index.html new file mode 100644 index 0000000..c6eea51 --- /dev/null +++ b/public/index.html @@ -0,0 +1,400 @@ + + + + + + + + + + + + + + + Novoa en español + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + +
    +
    +

    Novoa Index

    +
    +

    This is the landing page.

    +

    Y esta completamente en construcción pero la publicaré de todas formas.

    +

    Explorar más +

    + + + +

    Documentación del tema +

    For more information, visit Hextra.

    + +
    +
    +
    +
    + +
    + + +
    +

    +
    +
    +
    +
    + + + + + + + + + + diff --git a/public/js/main.min.a0311b78f3a0a229e5789d65bad5f0d6127911b5a7643b3f83714b8de2f52e03.js b/public/js/main.min.a0311b78f3a0a229e5789d65bad5f0d6127911b5a7643b3f83714b8de2f52e03.js new file mode 100644 index 0000000..e749963 --- /dev/null +++ b/public/js/main.min.a0311b78f3a0a229e5789d65bad5f0d6127911b5a7643b3f83714b8de2f52e03.js @@ -0,0 +1,6 @@ +(function(){const t="system",e=document.querySelectorAll(".theme-toggle");localStorage.getItem("color-theme")==="dark"||!("color-theme"in localStorage)&&(window.matchMedia("(prefers-color-scheme: dark)").matches&&t==="system"||t==="dark")?e.forEach(e=>e.dataset.theme="dark"):e.forEach(e=>e.dataset.theme="light"),e.forEach(e=>{e.addEventListener("click",function(){localStorage.getItem("color-theme")?localStorage.getItem("color-theme")==="light"?(setDarkTheme(),localStorage.setItem("color-theme","dark")):(setLightTheme(),localStorage.setItem("color-theme","light")):document.documentElement.classList.contains("dark")?(setLightTheme(),localStorage.setItem("color-theme","light")):(setDarkTheme(),localStorage.setItem("color-theme","dark")),e.dataset.theme=document.documentElement.classList.contains("dark")?"dark":"light"})}),window.matchMedia("(prefers-color-scheme: dark)").addEventListener("change",n=>{t==="system"&&!("color-theme"in localStorage)&&(n.matches?setDarkTheme():setLightTheme(),e.forEach(e=>e.dataset.theme=document.documentElement.classList.contains("dark")?"dark":"light"))})})(),document.addEventListener("DOMContentLoaded",function(){const n=document.querySelector(".hamburger-menu"),e=document.querySelector(".mobile-menu-overlay"),s=document.querySelector(".sidebar-container"),t=["fixed","inset-0","z-10","bg-black/80","dark:bg-black/60"];e.classList.add("bg-transparent"),e.classList.remove("hidden",...t);function o(){n.querySelector("svg").classList.toggle("open"),s.classList.toggle("max-md:[transform:translate3d(0,-100%,0)]"),s.classList.toggle("max-md:[transform:translate3d(0,0,0)]"),document.body.classList.toggle("overflow-hidden"),document.body.classList.toggle("md:overflow-auto")}n.addEventListener("click",n=>{n.preventDefault(),o(),e.classList.contains("bg-transparent")?(e.classList.add(...t),e.classList.remove("bg-transparent")):(e.classList.remove(...t),e.classList.add("bg-transparent"))}),e.addEventListener("click",n=>{n.preventDefault(),o(),e.classList.remove(...t),e.classList.add("bg-transparent")})}),document.addEventListener("DOMContentLoaded",function(){const e=()=>{const e=document.createElementNS("http://www.w3.org/2000/svg","svg");return e.innerHTML=` + + `,e.setAttribute("fill","none"),e.setAttribute("viewBox","0 0 24 24"),e.setAttribute("stroke","currentColor"),e.setAttribute("stroke-width","2"),e},t=()=>{const e=document.createElementNS("http://www.w3.org/2000/svg","svg");return e.innerHTML=` + + `,e.setAttribute("fill","none"),e.setAttribute("viewBox","0 0 24 24"),e.setAttribute("stroke","currentColor"),e.setAttribute("stroke-width","2"),e};document.querySelectorAll(".code-copy-btn").forEach(function(n){n.querySelector(".copy-icon")?.appendChild(e()),n.querySelector(".success-icon")?.appendChild(t()),n.addEventListener("click",function(e){e.preventDefault();const s=n.parentElement.previousElementSibling;let t;if(s.tagName==="CODE")t=s;else{const e=s.querySelectorAll("code");t=e[e.length-1]}if(t){let e=t.innerText;"lang"in t.dataset&&(e=e.replace(/\n\n/g,` +`)),navigator.clipboard.writeText(e).then(function(){n.classList.add("copied"),setTimeout(function(){n.classList.remove("copied")},500)}).catch(function(e){console.error("Failed to copy text: ",e)})}else console.error("Target element not found")})})}),document.querySelectorAll(".tabs-toggle").forEach(function(e){e.addEventListener("click",function(e){const n=Array.from(e.target.parentElement.querySelectorAll(".tabs-toggle"));n.map(e=>e.dataset.state=""),e.target.dataset.state="selected";const t=e.target.parentElement.nextElementSibling;Array.from(t.children).forEach(function(e){e.dataset.state=""});const s=e.target.getAttribute("aria-controls"),o=t.querySelector(`#${s}`);o.dataset.state="selected"})}),function(){const e=document.querySelectorAll(".language-switcher");e.forEach(e=>{e.addEventListener("click",t=>{t.preventDefault(),e.dataset.state=e.dataset.state==="open"?"closed":"open";const n=e.nextElementSibling;n.classList.toggle("hidden");const s=e.getBoundingClientRect(),o=s.top-window.innerHeight-15;n.style.transform=`translate3d(${s.left}px, ${o}px, 0)`,n.style.minWidth=`${Math.max(s.width,50)}px`})}),document.addEventListener("click",t=>{t.target.closest(".language-switcher")===null&&e.forEach(e=>{e.dataset.state="closed";const t=e.nextElementSibling;t.classList.add("hidden")})})}(),document.addEventListener("DOMContentLoaded",function(){const e=document.querySelectorAll(".hextra-filetree-folder");e.forEach(function(e){e.addEventListener("click",function(){Array.from(e.children).forEach(function(e){e.dataset.state=e.dataset.state==="open"?"closed":"open"}),e.nextElementSibling.dataset.state=e.nextElementSibling.dataset.state==="open"?"closed":"open"})})}),document.addEventListener("DOMContentLoaded",function(){const e=document.querySelectorAll(".hextra-sidebar-collapsible-button");e.forEach(function(e){e.addEventListener("click",function(t){t.preventDefault();const n=e.parentElement.parentElement;n&&n.classList.toggle("open")})})}),document.addEventListener("DOMContentLoaded",function(){const e=document.querySelector("#backToTop");e&&document.addEventListener("scroll",t=>{window.scrollY>300?e.classList.remove("opacity-0"):e.classList.add("opacity-0")})});function scrollUp(){window.scroll({top:0,left:0,behavior:"smooth"})} \ No newline at end of file diff --git a/public/lib/flexsearch/flexsearch.bundle.min.0425860527cc9968f9f049421c7a56b39327d475e2e3a8f550416be3a9134327.js b/public/lib/flexsearch/flexsearch.bundle.min.0425860527cc9968f9f049421c7a56b39327d475e2e3a8f550416be3a9134327.js new file mode 100644 index 0000000..4ebf76e --- /dev/null +++ b/public/lib/flexsearch/flexsearch.bundle.min.0425860527cc9968f9f049421c7a56b39327d475e2e3a8f550416be3a9134327.js @@ -0,0 +1,39 @@ +/** + * Skipped minification because the original files appears to be already minified. + * Original file: /npm/flexsearch@0.7.31/dist/flexsearch.bundle.js + * + * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files + */ +/**! + * FlexSearch.js v0.7.31 (Bundle) + * Copyright 2018-2022 Nextapps GmbH + * Author: Thomas Wilkerling + * Licence: Apache-2.0 + * https://github.com/nextapps-de/flexsearch + */ +(function _f(self){'use strict';try{if(module)self=module}catch(e){}self._factory=_f;var t;function u(a){return"undefined"!==typeof a?a:!0}function aa(a){const b=Array(a);for(let c=0;c=this.B&&(w||!n[l])){var f=L(q,d,r),g="";switch(this.G){case "full":if(2f;h--)if(h-f>=this.B){var k=L(q,d,r,e,f);g=l.substring(f,h);M(this,n,g,k,a,c)}break}case "reverse":if(1=this.B&&M(this,n, +g,L(q,d,r,e,h),a,c);g=""}case "forward":if(1=this.B&&M(this,n,g,f,a,c);break}default:if(this.C&&(f=Math.min(f/this.C(b,l,r)|0,q-1)),M(this,n,l,f,a,c),w&&1=this.B&&!e[l]){e[l]=1;const p=this.l&&l>f;M(this,m,p?f:l,L(g+(d/2>g?0:1),d,r,h-1,k-1),a,c,p?l:f)}}}}this.m||(this.register[a]=1)}}return this}; +function L(a,b,c,d,e){return c&&1=this.B&&!c[q])if(this.s||f||this.map[q])k[w++]=q,c[q]=1;else return d;a=k;e=a.length}if(!e)return d;b||(b=100);h=this.depth&&1=d)))break;if(n){if(f)return ta(k,d,0);b[b.length]=k;return}}return!c&&k}function ta(a,b,c){a=1===a.length?a[0]:[].concat.apply([],a);return c||a.length>b?a.slice(c,c+b):a} +function ua(a,b,c,d){c?(d=d&&b>c,a=(a=a[d?b:c])&&a[d?c:b]):a=a[b];return a}t.contain=function(a){return!!this.register[a]};t.update=function(a,b){return this.remove(a).add(a,b)}; +t.remove=function(a,b){const c=this.register[a];if(c){if(this.m)for(let d=0,e;db||c)e=e.slice(c,c+b);d&&(e=za.call(this,e));return{tag:a,result:e}}}function za(a){const b=Array(a.length);for(let c=0,d;c + + + + + + + + + + + + + Acerca de Novoa – Novoa en español + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + +
    +
    +
    +

    Acerca de Novoa

    +
    +
    +

    This is the about page.

    +

    Aquí no hay nada aún pero haré un copy paste supongo.

    +

    ESTA HUEVADA SIGUE EN CONSTRUCCIÓN

    +
    +
    + +
    +
    +
    + +
    + + +
    +

    +
    +
    +
    +
    + + + + + + + + + + diff --git a/public/robots.txt b/public/robots.txt new file mode 100644 index 0000000..4f9540b --- /dev/null +++ b/public/robots.txt @@ -0,0 +1 @@ +User-agent: * \ No newline at end of file diff --git a/public/servicios/abstract-shape-mini.png b/public/servicios/abstract-shape-mini.png new file mode 100644 index 0000000..9f53ec5 Binary files /dev/null and b/public/servicios/abstract-shape-mini.png differ diff --git a/public/servicios/abstract-shape.png b/public/servicios/abstract-shape.png new file mode 100644 index 0000000..75850fe Binary files /dev/null and b/public/servicios/abstract-shape.png differ diff --git a/public/servicios/index.html b/public/servicios/index.html new file mode 100644 index 0000000..05d02de --- /dev/null +++ b/public/servicios/index.html @@ -0,0 +1,95 @@ + + + + + + + + + + + + + + + + Novoa + + + + + + + + + + +
    +

    Esta es una lista de todos los servicios que ofrece el servidor de una época cuando las cosas eran más simples

    +

    Lista de servicios

    + +

    XMPP: sarvo@novoa.nagoya

    +

    Fediverso: @sarvo@novoa.nagoya

    +
    + + + diff --git a/public/site.webmanifest b/public/site.webmanifest new file mode 100644 index 0000000..c36f3b3 --- /dev/null +++ b/public/site.webmanifest @@ -0,0 +1,20 @@ +{ + "name": "Hextra", + "short_name": "Hextra", + "start_url": "index.html", + "icons": [ + { + "src": "android-chrome-192x192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "android-chrome-512x512.png", + "sizes": "512x512", + "type": "image/png" + } + ], + "theme_color": "#000000", + "background_color": "#000000", + "display": "standalone" +} diff --git a/public/sitemap.xml b/public/sitemap.xml new file mode 100644 index 0000000..d63b943 --- /dev/null +++ b/public/sitemap.xml @@ -0,0 +1,16 @@ + + + + + https://portal.novoa.nagoya/es/sitemap.xml + + 2024-01-13T22:58:43-06:00 + + + + + https://portal.novoa.nagoya/en/sitemap.xml + + + + diff --git a/public/tags/index.html b/public/tags/index.html new file mode 100644 index 0000000..c3720aa --- /dev/null +++ b/public/tags/index.html @@ -0,0 +1,471 @@ + + + + + + + + + + + + + + Tags – Novoa en español + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + +
    +
    +
    +

    Tags

    + +
    +
    +
    + +
    +
    +
    + +
    +
    +
    +
    +
    + + + + + + + + + + diff --git a/public/tags/index.xml b/public/tags/index.xml new file mode 100644 index 0000000..3bb96b7 --- /dev/null +++ b/public/tags/index.xml @@ -0,0 +1,18 @@ + + + Novoa en español – Tags + https://portal.novoa.nagoya/tags/ + Recent content in Tags on Novoa en español + Hugo -- gohugo.io + es-MX + + + + + + + + + + +