diff --git a/Caddyfile b/Caddyfile
index cbf9fc3..95fe91a 100644
--- a/Caddyfile
+++ b/Caddyfile
@@ -1,3 +1,8 @@
+tomasrivera.ch {
+ root * /srv/www
+ file_server
+}
+
archive.tomasrivera.ch {
reverse_proxy archivebox:8000
}
diff --git a/compose.yml b/compose.yml
index 67a19c0..1170b7b 100644
--- a/compose.yml
+++ b/compose.yml
@@ -17,6 +17,7 @@ services:
- ./Caddyfile:/etc/caddy/Caddyfile:ro
- caddy_data:/data
- caddy_config:/config
+ - /home/tomasr/vps-config/web-server:/srv/www
extra_hosts:
- "host.docker.internal:host-gateway"
diff --git a/web-server/index.html b/web-server/index.html
new file mode 100644
index 0000000..6545bf0
--- /dev/null
+++ b/web-server/index.html
@@ -0,0 +1,70 @@
+
+
+
+
+
+ Private VPS Server
+
+
+
+
+
+
+ Private VPS Server
+
+ Welcome to my private server. This VPS hosts my personal services,
+ tools, and applications that I use for productivity, archiving,
+ reading, and managing my own data. Everything here is self-hosted
+ and maintained by me.
+
+
+
+
+ Self-hosting
+
+
+
+
+ URL
+ Name
+ Description
+
+
+
+
+
+ archive.tomasrivera.ch
+ ArchiveBox
+ Personal web archive for saving webpages, articles, and online content.
+
+
+
+ video-archive.tomasrivera.ch
+ FileBrowser
+ Web archive of videos as I can't get ArchiveBox to use yt-dlp correctly
+
+
+ hledger.tomasrivera.ch
+ hledger-web
+ Web version of hledger, a robust, friendly, fast plain text accounting software
+
+
+
+ rss.tomasrivera.ch
+ FreshRSS
+ Self-hosted RSS reader for following websites and news feeds.
+
+
+
+ tomasrivera.ch
+ Personal Website
+ This homepage served directly by Caddy.
+
+
+
+
+ All of these services behind a login screen. If you need acces to one of these services, contact me.
+ This vps config is hosted on GitHub
+
+
+
diff --git a/web-server/style.css b/web-server/style.css
new file mode 100644
index 0000000..ae0b5d4
--- /dev/null
+++ b/web-server/style.css
@@ -0,0 +1,74 @@
+:root {
+ font-family: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
+ color: #222;
+ background: #f5f5f5;
+}
+
+body {
+ margin: 0;
+ padding: 2rem;
+}
+
+main {
+ max-width: 900px;
+ margin: auto;
+ background: white;
+ padding: 2.5rem;
+ border-radius: 12px;
+}
+
+h1 {
+ margin-top: 0;
+ font-size: 2.2rem;
+}
+
+h2 {
+ margin-top: 2.5rem;
+ border-bottom: 1px solid #ddd;
+ padding-bottom: 0.5rem;
+}
+
+p {
+ line-height: 1.6;
+ color: #555;
+}
+
+table {
+ width: 100%;
+ border-collapse: collapse;
+ margin-top: 1rem;
+}
+
+th {
+ text-align: left;
+ background: #f0f0f0;
+}
+
+th,
+td {
+ padding: 0.75rem;
+ border-bottom: 1px solid #ddd;
+}
+
+a {
+ color: #0066cc;
+ text-decoration: none;
+}
+
+a:hover {
+ text-decoration: underline;
+}
+
+@media (max-width: 700px) {
+ body {
+ padding: 1rem;
+ }
+
+ main {
+ padding: 1.5rem;
+ }
+
+ table {
+ font-size: 0.9rem;
+ }
+}