commit 9f14ad110e0658f6379c205417eecea01a86b40f
parent 106b1b56be19b8496031260daf73108878e5e767
Author: Katja (ctucx) <git@ctu.cx>
Date: Wed, 23 Apr 2025 19:52:35 +0200
parent 106b1b56be19b8496031260daf73108878e5e767
Author: Katja (ctucx) <git@ctu.cx>
Date: Wed, 23 Apr 2025 19:52:35 +0200
configurations/nixos/websites: remove `storage.home.ctu.cx`
2 files changed, 0 insertions(+), 363 deletions(-)
D
|
42
------------------------------------------
D
|
321
-------------------------------------------------------------------------------
diff --git a/configurations/nixos/websites/storage.home.ctu.cx/default.nix b/configurations/nixos/websites/storage.home.ctu.cx/default.nix @@ -1,42 +0,0 @@ -{ config, lib, ... }: - -{ - - dns.zones."ctu.cx".subdomains."storage.home".CNAME = [ "${config.networking.fqdn}." ]; - - services.nginx.virtualHosts = { - "storage.home.ctu.cx" = { - useACMEHost = "${config.networking.fqdn"; - forceSSL = true; - kTLS = true; - - basicAuthFile = "/var/src/secrets/nginx/storage.htpasswd"; - - locations."= /" = { - alias = "${./web-root}/"; - extraConfig = '' - try_files index.html =404; - ''; - }; - - locations."/_/" = { - alias = "/data/"; - extraConfig = '' - autoindex on; - autoindex_format json; - - client_body_temp_path /data; - dav_methods PUT DELETE MKCOL COPY MOVE; - create_full_put_path on; - dav_access group:rw all:r; - client_max_body_size 1G; - ''; - }; - }; - }; - - systemd.services.nginx.serviceConfig = { - ReadWritePaths = [ "/data" ]; - }; -} -
diff --git a/configurations/nixos/websites/storage.home.ctu.cx/web-root/index.html b/configurations/nixos/websites/storage.home.ctu.cx/web-root/index.html @@ -1,321 +0,0 @@ -<!DOCTYPE html> -<html> - <head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> - <title>storage.home.ctu.cx</title> - - <style> - * { - margin: 0; - padding: 0; - } - - body { - font-family: Roboto; - color: #222222; - } - - header { - } - - header > .title { - padding: 3em; - min-height: 3em; - } - - header > .title > h1 { - color: #222222; - } - - header > .menu { - padding: 1em 3em; - } - - header > .menu > button, - header > .menu > input { - height: 3em; - min-width: 3em; - } - - main { - } - - .listing { - display: flex; - width: 100%; - flex-direction: column; - } - - .listing-item { - padding: 1em 3em; - display: flex; - flex-direction: row; - flex-wrap: wrap; - min-height: 3em; - - border-top-style: solid; - border-width: 1px; - border-color: #F0F0F0; - } - - .listing-item:hover { - background-color: rgb(245, 245, 245); - } - - .listing-item > .detail { - flex: auto; - } - - .listing-item > .detail > a { - display: block; - height: 100%; - width: 100%; - } - - .listing-item button { - height: 3em; - min-width: 3em; - } - - button, input[type="file"] { - border-style: none; - background-color: transparent; - min-width: 3em; - height: 3em; - border-radius: 0.2em; - } - - button:hover { - background-color: #DDDDDD; - } - - .loading { - margin: auto; - } - @keyframes spinner { - 0% { - transform: translate3d(-50%, -50%, 0) rotate(0deg); - } - 100% { - transform: translate3d(-50%, -50%, 0) rotate(360deg); - } - } - .loading::before { - display: block; - animation: 1.5s linear infinite spinner; - animation-play-state: inherit; - border: solid 5px #cfd0d1; - border-bottom-color: #1c87c9; - border-radius: 50%; - content: ""; - height: 40px; - width: 40px; - transform: translate3d(-50%, -50%, 0); - will-change: transform; - } - </style> - </head> - <body> - <header> - <div class="title"> - <h1 id="path"></h1> - </div> - <div class="menu"> - <button onclick="createDirectoryButton();">📁 +</button> - <input id="files" type="file" multiple> <button onclick="uploadFilesButton();">⭫</button> - </div> - </header> - <main> - <div id="listing"></div> - </main> - <script> - let path_field = document.getElementById("path"); - let listing_field = document.getElementById("listing"); - - let base_path = "/_"; - - if (window.location.hash === "") { - window.location.hash = "#/"; - } - - let current_path = window.location.hash.substring(1); - - function deleteFile(path) { - fetch(base_path + path, { - method: 'DELETE', - }) - .then((response) => { - console.log(response); - if (!response.ok) { - throw new Error("Removing file failed"); - } - }) - .then(() => { - listFiles(); - }); - } - - function deleteFileButton(path) { - if (confirm("Are you sure you wanna delete " + path + "?")) { - deleteFile(path); - } - } - - function createDirectory(path) { - fetch(base_path + path, { - method: 'MKCOL', - }) - .then((response) => { - console.log(response); - if (!response.ok) { - throw new Error("Creating directory failed"); - } - }) - .then(() => { - listFiles(); - }); - } - - function createDirectoryButton() { - let dir_name = prompt("Directory name"); - if (dir_name !== null) { - createDirectory(current_path + dir_name + "/"); - } - } - - function uploadFile(path, file) { - - fetch(base_path + path, { - method: 'PUT', - body: file, - }) - .then((response) => { - console.log(response); - if (!response.ok) { - throw new Error("Upload failed"); - } - }) - .then(() => { - listFiles(); - }); - } - - function uploadFilesButton() { - let files = document.getElementById("files").files; - for (let i = 0; i < files.length; i++) { - uploadFile(current_path + files[i].name, files[i]); - } - document.getElementById("files").value = ""; - } - - function moveFile(old_path, new_path) { - fetch(base_path + old_path, { - method: 'MOVE', - headers: { - 'Destination': base_path + new_path, - }, - }) - .then((response) => { - console.log(response); - if (!response.ok) { - throw new Error("Rename file failed"); - } - }) - .then(() => { - listFiles(); - }); - } - - function moveFileButton(path) { - let new_path = prompt("New file path", path); - moveFile(path, new_path); - } - - function renameFileButton(path) { - let new_name = prompt("New file name"); - moveFile(path, current_path + new_name); - } - - function copyFile(path, new_path) { - fetch(base_path + path, { - method: 'COPY', - headers: { - 'Destination': base_path + new_path, - }, - }) - .then((response) => { - console.log(response); - if (!response.ok) { - throw new Error("Copy file failed"); - } - }) - .then(() => { - listFiles(); - }); - } - - function duplicateFileButton(path) { - let new_path = prompt("New file path", path); - copyFile(path, new_path); - } - - function listFiles() { - listing_field.innerHTML = '<div class="loading"></div>'; - - path_field.innerHTML = '<a href="#/">⌂</a>'; - - let path_blocks = current_path.split('/').slice(1); - for (let i = 0; i < path_blocks.length; i++) { - path_field.innerHTML += ' / <a href="#/' + path_blocks.slice(0, i+1).join('/') + '/">' + path_blocks[i] + '</a>'; - } - - fetch(base_path + current_path) - .then((response) => { - console.log(response); - if (!response.ok) { - throw new Error("Can't fetch directory"); - } - return response.json(); - }) - .then((listing) => { - console.log(listing); - let out = '<div class="listing">'; - for (let i = 0; i < listing.length; i++) { - let listing_path = current_path + encodeURIComponent(listing[i]["name"]); - let listing_link = "#"; - let listing_icon = ""; - if (listing[i]["type"] === "directory") { - listing_path += '/'; - listing_link = '#' + listing_path; - listing_icon = "📁"; - } - else { - listing_link = base_path + listing_path; - } - out += '<div class="listing-item">' - + '<div class="detail">' - + '<a href="' + listing_link + '">' + listing_icon + " " + listing[i]["name"] + '</a>' - + '</div>' - + '<div class="options">' - + '<button onclick="renameFileButton(\'' + listing_path + '\');" alt="rename">✎</button>' - + '<button onclick="duplicateFileButton(\'' + listing_path + '\');">●●</button>' - + '<button onclick="moveFileButton(\'' + listing_path + '\');">⇨</button>' - + '<button onclick="deleteFileButton(\'' + listing_path + '\');">❌</button>' - + '</div>' - + '</div>'; - } - out += '</div>'; - listing_field.innerHTML = out; - }); - } - - listFiles(); - - window.onhashchange = () => { - current_path = window.location.hash.substring(1); - listFiles(); - } - </script> - </body> -</html>