authorgravatar for git@paperclover.netclover caruso <git@paperclover.net> 2025-12-30 19:56:42-08:00
committergravatar for git@paperclover.netclover caruso <git@paperclover.net> 2026-01-01 14:52:46-08:00
log4f9fc9b6a085ffbb5f78850f91023a01ed4c410f
treec223efaa1256bb3550cba9d39dbffee9152482a2
signaturelock-open Commit is signed but in an unrecognized format.

rework local infrastructure into one docker compose project

i didn't commit any earlier because i had passwords in some files, but now that i added single sign on with authelia i can delete all those. changelog since dockge multi-stack compose file: - add single sign on - eliminate `network-mode: host` - theme forgejo - theme jellyfin - fix pgadmin / redis insight - add domains for all services - regress sonarr/radarr

38 files changed, 1323 insertions(+), 0 deletions(-)

.env.example created+26
......@@ -0,0 +1,26 @@
1# shellcheck disable
2HOME_DOMAIN=local.test
3ADMIN_EMAIL=
4USER_ID="501"
5GROUP_ID="20"
6
7APP_ROOT=./.apps
8STORE_ROOT=/Volumes
9CLOVER_ROOT=/Volumes/clover
10MEDIA_ROOT=/Volumes/media
11
12MAILER_ADDRESS=smtp.example.com
13MAILER_USERNAME=me@paperclover.net
14MAILER_PASSWORD=yolo
15
16POSTGRES_PASSWORD=
17POSTGRES_PASSWORD_AUTHELIA=
18POSTGRES_PASSWORD_FORGEJO=
19POSTGRES_PASSWORD_DAWARICH=
20POSTGRES_PASSWORD_JELLYFIN=
21
22CLOVER_SOT_KEY=
23
24FORGEJO_SERVER_LFS_JWT_SECRET=
25FORGEJO_OAUTH2_JWT_SECRET=
26FORGEJO_SECURITY_INTERNAL_TOKEN=
.gitignore created+4
......@@ -0,0 +1,4 @@
1.env
2/.apps
3/certs
4/sitegen
compose.yaml created+423
......@@ -0,0 +1,423 @@
1services:
2 # web server
3 caddy:
4 container_name: caddy
5 image: caddy:latest
6 ports:
7 - 80:80
8 - 443:443
9 restart: unless-stopped
10 user: "$USER_ID:$GROUP_ID"
11 volumes:
12 - "./config:/etc/caddy:ro"
13 - "${APP_ROOT}/caddy:/data/caddy:rw"
14 environment:
15 - HOME_DOMAIN
16 develop:
17 watch:
18 - path: ./config/Caddyfile
19 action: restart
20 # SSO
21 authelia:
22 image: "authelia/authelia"
23 container_name: authelia
24 volumes:
25 - "./config/authelia:/config"
26 restart: "unless-stopped"
27 secrets:
28 - "authelia-jwt-secret"
29 - "authelia-session-secret"
30 - "authelia-encryption-key"
31 environment:
32 PUID: "$USER_ID"
33 PGID: "$GROUP_ID"
34 TZ: America/Los_Angelas
35 AUTHELIA_IDENTITY_VALIDATION_RESET_PASSWORD_JWT_SECRET_FILE: "/run/secrets/authelia-jwt-secret"
36 AUTHELIA_SESSION_SECRET_FILE: "/run/secrets/authelia-session-secret"
37 AUTHELIA_STORAGE_ENCRYPTION_KEY_FILE: "/run/secrets/authelia-encryption-key"
38 AUTHELIA_STORAGE_POSTGRES_ADDRESS: postgres:5432
39 AUTHELIA_STORAGE_POSTGRES_DATABASE: authelia
40 AUTHELIA_STORAGE_POSTGRES_USERNAME: authelia
41 AUTHELIA_STORAGE_POSTGRES_PASSWORD: "${POSTGRES_PASSWORD_AUTHELIA}"
42 AUTHELIA_NOTIFIER_SMTP_ADDRESS: "smtp://${MAILER_ADDRESS}"
43 AUTHELIA_NOTIFIER_SMTP_USERNAME: "${MAILER_USERNAME}"
44 AUTHELIA_NOTIFIER_SMTP_PASSWORD: "${MAILER_PASSWORD}"
45 # file manager
46 copyparty: # port 3923
47 image: copyparty/ac
48 container_name: copyparty
49 user: "$USER_ID:$GROUP_ID"
50 volumes:
51 - "${STORE_ROOT}:/w"
52 - "${APP_ROOT}/copyparty:/cfg"
53 - ./config/copyparty.conf:/cfg/copyparty.conf
54 restart: unless-stopped
55 # paper clover's database service
56 clover-source-of-truth:
57 build:
58 context: sitegen/
59 dockerfile: src/source-of-truth.dockerfile
60 pull_policy: build
61 container_name: clover-source-of-truth
62 user: "$USER_ID:$GROUP_ID"
63 environment:
64 - "PORT=80"
65 - "CLOVER_DB=/data"
66 - "CLOVER_FILE_RAW=/published"
67 - "CLOVER_FILE_DERIVED=/data/derived"
68 - "CLOVER_SOT_KEY=${CLOVER_SOT_KEY}"
69 restart: unless-stopped
70 volumes:
71 - "$CLOVER_ROOT/Documents/Config/paperclover:/data:rw"
72 - "$CLOVER_ROOT/Published:/published:ro"
73 healthcheck:
74 test: ["CMD", "curl", "-f", "http://localhost:80"]
75 interval: 10s
76 timeout: 5s
77 retries: 3
78 start_period: 40s
79 # git hosting
80 forgejo: # port 3000
81 container_name: forgejo
82 environment:
83 USER_UID: "$USER_ID"
84 USER_GID: "$GROUP_ID"
85 FORGEJO_CUSTOM: "/custom"
86 FORGEJO__MAILER__SMTP_ADDR: "${MAILER_ADDRESS}"
87 FORGEJO__MAILER__USER: "${MAILER_USERNAME}"
88 FORGEJO__MAILER__PASSWD: "${MAILER_PASSWORD}"
89 FORGEJO__SERVER__LFS_JWT_SECRET: "${FORGEJO_SERVER_LFS_JWT_SECRET}"
90 FORGEJO__OAUTH2__JWT_SECRET: "${FORGEJO_OAUTH2_JWT_SECRET}"
91 FORGEJO__SECURITY__SECRET_KEY: "${FORGEJO_SECURITY_SECRET_KEY}"
92 FORGEJO__SECURITY__INTERNAL_TOKEN: "${FORGEJO_SECURITY_INTERNAL_TOKEN}"
93 image: code.forgejo.org/forgejo/forgejo:13
94 ports:
95 - 22:22
96 - 40244:3000
97 restart: unless-stopped
98 volumes:
99 - "${APP_ROOT}/forgejo:/data:rw"
100 - "/etc/timezone:/etc/timezone:ro"
101 - "/etc/localtime:/etc/localtime:ro"
102 - ./config/forgejo:/custom:ro
103 - ./config/font:/custom/public/assets/font:ro
104 forgejo-anubis:
105 container_name: forgejo-anubis
106 image: ghcr.io/techarohq/anubis:latest
107 user: "$USER_ID:$GROUP_ID"
108 restart: unless-stopped
109 environment:
110 BIND: :80
111 TARGET: http://forgejo:3000
112 forgejo-runner:
113 container_name: forgejo-runner
114 image: code.forgejo.org/forgejo/runner:12
115 links:
116 - docker-in-docker
117 depends_on:
118 docker-in-docker:
119 condition: service_started
120 environment:
121 DOCKER_HOST: tcp://docker-in-docker:2375
122 user: "$USER_ID:$GROUP_ID"
123 volumes:
124 - "${APP_ROOT}/forgejo-runner:/data"
125 restart: unless-stopped
126 command: forgejo-runner daemon
127 docker-in-docker:
128 container_name: docker-in-docker
129 image: docker:dind
130 privileged: "true"
131 command:
132 - dockerd
133 - -H
134 - tcp://0.0.0.0:2375
135 - --tls=false
136 restart: unless-stopped
137 # media consumption
138 jellyfin: # port 8096
139 container_name: jellyfin
140 user: "$USER_ID:$GROUP_ID"
141 environment:
142 - "JELLYFIN_PublishedServerUrl=https://jelly.${HOME_DOMAIN}"
143 image: jellyfin/jellyfin
144 restart: unless-stopped
145 ports:
146 - 8096:8096
147 volumes:
148 - "${MEDIA_ROOT}:/media:rw"
149 - "${APP_ROOT}/jellyfin:/config:rw"
150 - "${APP_ROOT}/jellyfin/cache:/cache:rw"
151 - "./config/jellyfin:/config/custom:ro"
152 - "./config/jellyfin/branding.xml:/config/config/branding.xml:ro"
153 - "./config/font:/usr/local/share/fonts/custom:ro"
154 navidrome: # port 4533
155 container_name: navidrome
156 image: deluan/navidrome:latest
157 user: "$USER_ID:$GROUP_ID"
158 restart: unless-stopped
159 volumes:
160 - "${APP_ROOT}/navidrone:/data:rw"
161 - "${MEDIA_ROOT}/music:/music:ro"
162 environment:
163 - ND_SCANNER_GROUPALBUMRELEASES=1
164 - ND_BASEURL=https://nd.${HOME_DOMAIN}/
165 - ND_PID_ALBUM=folder
166 # media aquisition
167 qbittorrent: # webui on port 23938
168 platform: linux/amd64 # not available for aarch64
169 container_name: qbittorrent
170 image: binhex/arch-qbittorrentvpn
171 restart: unless-stopped
172 cap_add:
173 - NET_ADMIN
174 secrets:
175 - openvpn-credentials
176 environment:
177 - VPN_ENABLED=yes
178 - VPN_PROV=pia
179 - VPN_CLIENT=openvpn
180 - ENABLE_STARTUP_SCRIPTS=no
181 - ENABLE_PRIVOXY=no
182 - STRICT_PORT_FORWARD=no
183 - USERSPACE_WIREGUARD=no
184 - ENABLE_SOCKS=no
185 - SOCKS_USER=admin
186 - SOCKS_PASS=socks
187 - LAN_NETWORK=192.168.86.0/24
188 - NAME_SERVERS=84.200.69.80,37.235.1.174,1.1.1.1,37.235.1.177,84.200.70.40,1.0.0.1
189 - VPN_INPUT_PORTS=1234
190 - VPN_OUTPUT_PORTS=5678
191 - DEBUG=false
192 - WEBUI_PORT=23938
193 - UMASK=000
194 - PUID=$USER_ID
195 - PGID=$GROUP_ID
196 volumes:
197 - "${TORRENT_TEMP:-${APP_ROOT}/qbittorrent/tmp}:/data/tmp"
198 - "${MEDIA_ROOT}:/data/media"
199 - "${APP_ROOT}/qbittorrent:/config"
200 - "./config/openvpn:/config/openvpn:ro"
201 - "/etc/localtime:/etc/localtime:ro"
202 # jackett: # port 9117
203 # container_name: jackett
204 # environment:
205 # - "PUID=$USER_ID"
206 # - "PGID=$GROUP_ID"
207 # - "TZ=America/Los_Angelas"
208 # image: lscr.io/linuxserver/jackett:latest
209 # restart: unless-stopped
210 # volumes:
211 # - "${APP_ROOT}/jackett:/config/Jackett"
212 # sonarr: # port 8989
213 # container_name: sonarr
214 # environment:
215 # - "PUID=$USER_ID"
216 # - "PGID=$GROUP_ID"
217 # - "TZ=America/Los_Angelas"
218 # image: lscr.io/linuxserver/sonarr:latest
219 # volumes:
220 # - "${APP_ROOT}/sonarr:/config"
221 # - "${TORRENT_TEMP:-${APP_ROOT}/qbittorrent/tmp}:/data/tmp"
222 # - "${MEDIA_ROOT}:/data/media"
223 # restart: unless-stopped
224 # radarr: # port 7878
225 # container_name: radarr
226 # environment:
227 # - "PUID=$USER_ID"
228 # - "PGID=$GROUP_ID"
229 # - "TZ=America/Los_Angelas"
230 # image: lscr.io/linuxserver/radarr:latest
231 # volumes:
232 # - "${APP_ROOT}/radarr:/config"
233 # - "${TORRENT_TEMP:-${APP_ROOT}/qbittorrent/tmp}:/data/tmp"
234 # - "${MEDIA_ROOT}:/data/media"
235 # restart: unless-stopped
236 # language models
237 opencode: # port 4096
238 container_name: opencode
239 build:
240 context: config/opencode/
241 dockerfile: Dockerfile
242 pull_policy: build
243 user: "$USER_ID:$GROUP_ID"
244 volumes:
245 - "${APP_ROOT}/opencode/.ssh:/home/clover/.ssh"
246 - "${APP_ROOT}/opencode/.config:/home/clover/.config"
247 - "${APP_ROOT}/opencode/.local:/home/clover/.local"
248 - "${APP_ROOT}/opencode/code:/home/clover/code"
249 # databases
250 postgres:
251 container_name: postgres
252 build:
253 context: config/postgres/
254 dockerfile: Dockerfile
255 args:
256 USER_ID: $USER_ID
257 GROUP_ID: $GROUP_ID
258 pull_policy: build
259 restart: unless-stopped
260 user: "$USER_ID:$GROUP_ID"
261 environment:
262 POSTGRES_PASSWORD: "${POSTGRES_PASSWORD}"
263 POSTGRES_PASSWORD_FORGEJO: "${POSTGRES_PASSWORD_FORGEJO}"
264 POSTGRES_PASSWORD_AUTHELIA: "${POSTGRES_PASSWORD_AUTHELIA}"
265 POSTGRES_PASSWORD_DAWARICH: "${POSTGRES_PASSWORD_DAWARICH}"
266 POSTGRES_PASSWORD_JELLYFIN: "${POSTGRES_PASSWORD_JELLYFIN}"
267 volumes:
268 - "${APP_ROOT}/pg_data:/var/lib/postgresql/data/"
269 healthcheck:
270 test: ["CMD-SHELL", "pg_isready -U authelia -d authelia"]
271 interval: 10s
272 timeout: 5s
273 retries: 5
274 start_period: 10s
275 pgadmin: # port 80
276 container_name: pgadmin
277 image: "docker.io/dpage/pgadmin4:latest"
278 user: "5050:5050"
279 environment:
280 PGADMIN_DEFAULT_EMAIL: "pgadmin4@pgadmin.org"
281 PGADMIN_DEFAULT_PASSWORD: "secret"
282 PGADMIN_CONFIG_MASTER_PASSWORD_REQUIRED: "False"
283 PGADMIN_CONFIG_SERVER_MODE: "False"
284 volumes:
285 - "${APP_ROOT}/pg_admin:/var/lib/pgadmin"
286 restart: unless-stopped
287 depends_on:
288 postgres:
289 condition: service_healthy
290 redis: # port 6379
291 container_name: redis
292 image: redis:8
293 user: "$USER_ID:$GROUP_ID"
294 restart: unless-stopped
295 volumes:
296 - "${APP_ROOT}/redis:/data"
297 redis-insight: # port 5540
298 container_name: redis-insight
299 image: redis/redisinsight:latest
300 environment:
301 RI_REDIS_HOST: redis
302 restart: unless-stopped
303 # location history
304 dawarich-app: # port 30161
305 image: freikin/dawarich:latest
306 container_name: dawarich-app
307 volumes:
308 - "${APP_ROOT}/dawarich_public:/var/app/public"
309 - "${APP_ROOT}/dawarich_watched:/var/app/tmp/imports/watched"
310 - "${APP_ROOT}/dawarich_storage:/var/app/storage"
311 - "${APP_ROOT}/dawarich_data:/dawarich_db_data"
312 entrypoint: web-entrypoint.sh
313 command:
314 - bin/rails
315 - server
316 - -p
317 - "30161"
318 - -b
319 - "::"
320 restart: on-failure
321 user: "$USER_ID:$GROUP_ID"
322 environment:
323 RAILS_ENV: production
324 REDIS_URL: "redis://redis:6379"
325 DATABASE_HOST: postgres
326 DATABASE_USERNAME: dawarich
327 DATABASE_PASSWORD: "${POSTGRES_PASSWORD_DAWARICH}"
328 DATABASE_NAME: dawarich
329 MIN_MINUTES_SPENT_IN_CITY: 60
330 APPLICATION_HOSTS: "localhost,zenith,dawarich.${HOME_DOMAIN}"
331 TIME_ZONE: America/Los_Angeles
332 APPLICATION_PROTOCOL: http
333 PROMETHEUS_EXPORTER_ENABLED: "false"
334 PROMETHEUS_EXPORTER_HOST: 0.0.0.0
335 PROMETHEUS_EXPORTER_PORT: 9394
336 SELF_HOSTED: "true"
337 STORE_GEODATA: "true"
338 deploy:
339 resources:
340 limits:
341 cpus: "0.50"
342 memory: 4G
343 dawarich-sidekiq:
344 image: freikin/dawarich:latest
345 container_name: dawarich-sidekiq
346 volumes:
347 - "${APP_ROOT}/dawarich_public:/var/app/public"
348 - "${APP_ROOT}/dawarich_watched:/var/app/tmp/imports/watched"
349 - "${APP_ROOT}/dawarich_storage:/var/app/storage"
350 entrypoint: sidekiq-entrypoint.sh
351 command: ["sidekiq"]
352 restart: on-failure
353 user: "$USER_ID:$GROUP_ID"
354 environment:
355 RAILS_ENV: production
356 REDIS_URL: "redis://redis:6379"
357 DATABASE_HOST: postgres
358 DATABASE_USERNAME: dawarich
359 DATABASE_PASSWORD: "${POSTGRES_PASSWORD_DAWARICH}"
360 DATABASE_NAME: dawarich
361 APPLICATION_HOSTS: localhost
362 BACKGROUND_PROCESSING_CONCURRENCY: 10
363 APPLICATION_PROTOCOL: http
364 PROMETHEUS_EXPORTER_ENABLED: "false"
365 PROMETHEUS_EXPORTER_HOST: dawarich_app
366 PROMETHEUS_EXPORTER_PORT: 9394
367 SELF_HOSTED: "true"
368 STORE_GEODATA: "true"
369 logging:
370 driver: json-file
371 options:
372 max-size: 100m
373 max-file: "5"
374 # file sync
375 syncthing: # port 8384
376 image: lscr.io/linuxserver/syncthing:latest
377 container_name: syncthing
378 environment:
379 PUID: "$USER_ID"
380 PGID: "$GROUP_ID"
381 TZ: America/Los_Angelas
382 volumes:
383 - "${APP_ROOT}/syncthing:/config"
384 - "${STORE_ROOT}:${STORE_ROOT}"
385 ports:
386 - 22000:22000/tcp
387 - 22000:22000/udp
388 - 21027:21027/udp
389 restart: unless-stopped
390 # administration
391 openspeedtest: # port 3000
392 restart: unless-stopped
393 container_name: openspeedtest
394 image: openspeedtest/latest
395 user: "$USER_ID:$GROUP_ID"
396 technitium-dns:
397 image: technitium/dns-server
398 container_name: technitium-dns
399 user: "$USER_ID:$GROUP_ID"
400 ports:
401 - 53:53/udp
402 - 53:53/tcp
403 - 67:67/udp
404 - 68:68/udp
405 - 5380:5380/tcp # Web console
406 - 8053:8053/tcp # dns over http
407 volumes:
408 - "${APP_ROOT}/technitium/config:/app/config"
409 - "${APP_ROOT}/technitium/ssl:/etc/ssl"
410 - "${APP_ROOT}/technitium/logs:/app/config/logs"
411 restart: unless-stopped
412 sysctls:
413 - net.ipv4.ip_local_port_range=1024 65000
414
415secrets:
416 openvpn-credentials:
417 file: ./secrets/openvpn-credentials.txt
418 authelia-jwt-secret:
419 file: ./secrets/authelia-jwt-secret.txt
420 authelia-session-secret:
421 file: ./secrets/authelia-session-secret.txt
422 authelia-encryption-key:
423 file: ./secrets/authelia-encryption-key.txt
config/Caddyfile created+115
......@@ -0,0 +1,115 @@
1local.test, *.local.test {
2 tls internal
3}
4
5(auth) {
6 @not_websocket not header Connection Upgrade
7 forward_auth @not_websocket authelia:9091 {
8 uri /api/authz/forward-auth
9 copy_headers Remote-User Remote-Groups Remote-Email Remote-Name
10 }
11}
12
13# jelly.{$HOME_DOMAIN}
14import ./jellyfin/Caddyfile
15
16auth.{$HOME_DOMAIN} {
17 reverse_proxy "authelia:9091"
18}
19dawarich.{$HOME_DOMAIN} {
20 reverse_proxy "dawarich:30161"
21}
22db.{$HOME_DOMAIN} {
23 reverse_proxy "clover-source-of-truth:80"
24}
25nas.{$HOME_DOMAIN} {
26 forward_auth authelia:9091 {
27 uri /api/authz/forward-auth
28 copy_headers Remote-User Remote-Groups Remote-Email Remote-Name
29 }
30 route {
31 @login path /login
32 redir @login https://auth.{$HOME_DOMAIN}?rd=https%3A%2F%2Fnas.{$HOME_DOMAIN}{?rd}
33
34 @logout path /logout
35 redir @logout https://auth.{$HOME_DOMAIN}/logout?rd=https://nas.{$HOME_DOMAIN}
36
37 reverse_proxy copyparty:3923
38 }
39}
40git.{$HOME_DOMAIN} {
41 reverse_proxy "forgejo-anubis:80" {
42 header_up X-Real-Ip {remote_host}
43 header_up X-Http-Version {http.request.proto}
44 }
45}
46music.{$HOME_DOMAIN} {
47 reverse_proxy "navidrome:4533"
48}
49qbt.{$HOME_DOMAIN} {
50 import auth
51 reverse_proxy "qbittorrent:23938"
52}
53snr.{$HOME_DOMAIN} {
54 import auth
55 reverse_proxy "sonarr:8989" {
56 header_up Authorization "Basic dXNlcm5hbWU6cGFzc3dvcmQ="
57 }
58}
59rdr.{$HOME_DOMAIN} {
60 import auth
61 reverse_proxy "radarr:7878" {
62 header_up Authorization "Basic dXNlcm5hbWU6cGFzc3dvcmQ="
63 }
64}
65jkt.{$HOME_DOMAIN} {
66 import auth
67 reverse_proxy "jackett:9117" {
68 header_up Authorization "Basic dXNlcm5hbWU6cGFzc3dvcmQ="
69 }
70}
71speedtest.{$HOME_DOMAIN} {
72 reverse_proxy "openspeedtest:3000"
73}
74opencode.{$HOME_DOMAIN} {
75 import auth
76 reverse_proxy "opencode:3923"
77}
78pg.{$HOME_DOMAIN} {
79 import auth
80 reverse_proxy "pgadmin:80"
81}
82redis.{$HOME_DOMAIN} {
83 import auth
84 reverse_proxy "redis-insight:5540"
85}
86sync.{$HOME_DOMAIN} {
87 import auth
88 reverse_proxy "syncthing:8384"
89}
90
91# redirections
92paperclover.dev {
93 redir "https://git.paperclover.net{uri}"
94 tls {
95 on_demand
96 }
97}
98
99:80, :443 {
100 handle_errors {
101 rewrite * /{err.status_code}
102 reverse_proxy https://http.cat {
103 header_up Host {upstream_hostport}
104 replace_status {err.status_code}
105 }
106 }
107
108 handle_path /generate_204 {
109 respond "" 204
110 }
111 handle {
112 respond "the 'Not Found' page was not found: {http.request.host}" 404
113 }
114}
115
config/authelia/configuration.yml created+46
......@@ -0,0 +1,46 @@
1storage:
2 postgres:
3 address: "tcp://postgres:5432"
4 database: "authelia"
5 schema: "public"
6 username: "authelia"
7 timeout: "5s"
8authentication_backend:
9 refresh_interval: "5m"
10 file:
11 watch: true
12 path: "/config/users.yaml"
13 search:
14 email: true
15 case_insensitive: true
16totp:
17 issuer: "local.test"
18session:
19 name: "authelia_session"
20 same_site: "lax"
21 inactivity: "5m"
22 expiration: "1h"
23 remember_me: "3M"
24 cookies:
25 - name: "clover-authelia"
26 domain: "local.test"
27 authelia_url: "https://auth.local.test"
28notifier:
29 disable_startup_check: true
30 smtp:
31 address: "smtp://127.0.0.1:25"
32 timeout: "5s"
33 username: "test"
34 password: "password"
35 sender: "clover bot <noreply.auth@paperclover.net>"
36 identifier: "localhost"
37 subject: "[Authelia] {title}"
38access_control:
39 default_policy: one_factor
40 rules:
41 - domain: "nas.local.test"
42 policy: bypass # optional
43regulation:
44 max_retries: 10
45 find_time: "2 minutes"
46 ban_time: "5 minutes"
config/authelia/users.yaml created+11
......@@ -0,0 +1,11 @@
1users:
2 snow:
3 disabled: false
4 displayname: "snow"
5 password: "$6$rounds=50000$BpLnfgDsc2WD8F2q$Zis.ixdg9s/UOJYrs56b5QEZFiZECu0qZVNsIYxBaNJ7ucIL.nlxVCT5tqh8KHG8X4tlwCFm5r6NTOZZ5qRFN/"
6 email: "account@paperclover.net"
7 fish:
8 disabled: false
9 displayname: "fish"
10 password: "$6$rounds=50000$BpLnfgDsc2WD8F2q$Zis.ixdg9s/UOJYrs56b5QEZFiZECu0qZVNsIYxBaNJ7ucIL.nlxVCT5tqh8KHG8X4tlwCFm5r6NTOZZ5qRFN/"
11 email: "julia@paperclover.net"
config/copyparty.conf created+41
......@@ -0,0 +1,41 @@
1[global]
2 # e2dsa # enable file indexing and filesystem scanning
3 # e2ts # enable multimedia indexing
4 ansi # enable colors in log messages
5 shr: /shr # set the virtual path for shares
6 df: 16 # stop accepting uploads if less than 16 GB free disk space
7 ver # show copyparty version in the controlpanel
8 theme: 2 # monokai
9 name: clover nas # change the server-name that's displayed in the browser
10 stats, nos-dup # enable the prometheus endpoint, but disable the dupes counter (too slow)
11
12 # authelia
13 xff-src: lan # accept X-Forwarded-For from `lan`
14 idp-h-usr: remote-user
15 idp-h-grp: remote-groups
16 idp-login: /login?rd={dst} # caddy redirect to avoid hardcoding a domain here
17 idp-logout: /logout
18 idp-login-t: with sso (snow sign on)
19
20[/] # webroot
21 /w
22 accs:
23 rwmda: snow
24[/clover]
25 /w/clover
26 accs:
27 rwmda: snow
28[/media] # mediaroot
29 /w/media
30 accs:
31 rwmda: snow
32 rwmd: rain, fish, akira
33[/home/${u}]
34 /w/home/${u}
35 accs:
36 rwmda: ${u}, @su
37[/clover/Public]
38 /w/clover/Public
39 accs:
40 r: *
41 rwm: @acct
config/font/README.txt created+14
......@@ -0,0 +1,14 @@
1The fonts in this directory MUST be purchased to use:
2https://www.arrowtype.com/name-sans
3https://www.arrowtype.com/name-mono
4
5The full license from ArrowType: https://www.arrowtype.com/licensing/commercial
6
7This license specifically grants me, Clover M Caruso, the right to embed these
8webfonts on domains I control.
9
10> The webfonts may only be installed on website domains that are under your
11> direct control.
12
13Since this git repo is hosted on a domain I control, using hardware I control
14(local git server in my home), I
config/font/nm.woff2
Binary files /dev/null and b/config/font/nm.woff2 differ
config/font/nmb.woff2
Binary files /dev/null and b/config/font/nmb.woff2 differ
config/font/nmi.woff2
Binary files /dev/null and b/config/font/nmi.woff2 differ
config/font/nsv.woff2
Binary files /dev/null and b/config/font/nsv.woff2 differ
config/font/nsvi.woff2
Binary files /dev/null and b/config/font/nsvi.woff2 differ
config/forgejo/conf/app.ini created+105
......@@ -0,0 +1,105 @@
1APP_NAME="clover's git"
2APP_SLOGAL=and then we knew, just like paper airplanes: that we could fly...
3RUN_MODE=prod
4RUN_USER=git
5WORK_PATH=/data/work
6
7[repository]
8MAX_CREATION_LIMIT=0
9ROOT=/data/git/repositories
10DEFAULT_CLOSE_ISSUES_VIA_COMMITS_IN_ANY_BRANCH=true
11DEFAULT_REPO_UNITS=repo.code,repo.issues,repo.pulls
12DISABLE_STARS=true
13DEFAULT_BRANCH=master
14
15[repository.local]
16LOCAL_COPY_PATH=/data/work/tmp/local-repo
17
18[repository.upload]
19TEMP_PATH=/data/work/uploads
20
21[ui]
22EXPLORE_PAGING_NUM=100
23ISSUE_PAGING_NUM=500
24MEMBERS_PAGING_NUM=100
25THEMES=clover
26DEFAULT_THEME=clover
27
28[server]
29APP_DATA_PATH=/data/work
30DOMAIN=git.paperclover.net
31SSH_DOMAIN=git.paperclover.net
32HTTP_PORT=3000
33ROOT_URL=https://git.paperclover.net/
34DISABLE_SSH=false
35SSH_PORT=22
36SSH_LISTEN_PORT=22
37LFS_START_SERVER=true
38OFFLINE_MODE=true
39LANDING_PAGE=/explore/repos
40
41[database]
42PATH=/data/work/gitea.db
43DB_TYPE=sqlite3
44HOST=localhost:3306
45NAME=gitea
46USER=root
47PASSWD=
48LOG_SQL=false
49SCHEMA=
50SSL_MODE=disable
51
52[indexer]
53ISSUE_INDEXER_PATH=/data/work/indexers/issues.bleve
54
55[session]
56PROVIDER_CONFIG=/data/work/sessions
57PROVIDER=file
58
59[picture]
60AVATAR_UPLOAD_PATH=/data/work/avatars
61REPOSITORY_AVATAR_UPLOAD_PATH=/data/work/repo-avatars
62
63[admin]
64DISABLE_REGULAR_ORG_CREATION=true
65
66[attachment]
67PATH=/data/work/attachments
68
69[log]
70MODE=console
71LEVEL=info
72ROOT_PATH=/data/work/log
73
74[security]
75INSTALL_LOCK=true
76REVERSE_PROXY_LIMIT=1
77REVERSE_PROXY_TRUSTED_PROXIES=*
78PASSWORD_HASH_ALGO=pbkdf2_hi
79
80[service]
81DISABLE_REGISTRATION=false
82REQUIRE_SIGNIN_VIEW=false
83REGISTER_EMAIL_CONFIRM=true
84ENABLE_NOTIFY_MAIL=true
85ALLOW_ONLY_EXTERNAL_REGISTRATION=false
86DEFAULT_KEEP_EMAIL_PRIVATE=false
87DEFAULT_ALLOW_CREATE_ORGANIZATION=true
88DEFAULT_ENABLE_TIMETRACKING=true
89NO_REPLY_ADDRESS=noreply.localhost
90
91[lfs]
92PATH = /data/git/lfs
93
94[mailer]
95ENABLED = true
96FROM=noreply.git@paperclover.net
97PROTOCOL=smtps
98SMTP_PORT=587
99IS_TLS_ENABLED=true
100
101[repository.pull-request]
102DEFAULT_MERGE_STYLE=squash
103
104[repository.signing]
105DEFAULT_TRUST_MODEL=committer
config/forgejo/public/assets/css/theme-clover.css created+150
......@@ -0,0 +1,150 @@
1@import "theme-forgejo-light.css";
2@import "theme-forgejo-dark.css" (prefers-color-scheme: dark);
3
4@font-face {
5 font-family: 'Name Mono';
6 src: url('../font/ATNameMono-Regular.woff2') format('woff2');
7 font-weight: 400;
8 font-style: normal;
9 font-display: swap;
10}
11
12@font-face {
13 font-family: 'Name Mono';
14 src: url('../font/ATNameMono-Bold.woff2') format('woff2');
15 font-weight: 700;
16 font-style: normal;
17 font-display: swap;
18}
19
20@font-face {
21 font-family: 'Name Mono';
22 src: url('../font/ATNameMono-Italic.woff2') format('woff2');
23 font-weight: 400;
24 font-style: italic;
25 font-display: swap;
26}
27
28@font-face {
29 font-family: 'Name Sans';
30 src: url('../font/ATNameSansVariable-Regular.woff2') format('woff2') tech(variations);
31 font-weight: 100 900;
32 font-style: normal;
33 font-display: swap;
34 font-stretch: 75% 125%;
35}
36
37@font-face {
38 font-family: 'Name Sans';
39 src: url('../font/ATNameSansVariable-Italic.woff2') format('woff2') tech(variations);
40 font-weight: 100 900;
41 font-style: italic;
42 font-display: swap;
43 font-stretch: 75% 125%;
44}
45
46:root {
47 --fonts-proportional: 'Name Sans', -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Noto Sans', Helvetica, Arial, sans-serif !important;
48 --fonts-monospace: 'Name Mono', 'SF Mono', Monaco, 'Cascadia Code', 'Roboto Mono', Consolas, 'Courier New', monospace !important;
49 --fonts-emoji: 'Apple Color Emoji', 'Segoe UI Emoji', 'Noto Color Emoji' !important;
50 --steel-900: oklch(0.15 0.08 320);
51 --steel-850: oklch(0.18 0.07 320);
52 --steel-800: oklch(0.21 0.06 320);
53 --steel-750: oklch(0.24 0.06 320);
54 --steel-700: oklch(0.27 0.04 320);
55 --steel-650: oklch(0.30 0.05 320);
56 --steel-600: oklch(0.35 0.04 320);
57 --steel-550: oklch(0.40 0.03 320);
58 --steel-500: oklch(0.45 0.02 320);
59 --steel-450: oklch(0.50 0.03 320);
60 --steel-400: oklch(0.55 0.04 320);
61 --steel-350: oklch(0.60 0.04 320);
62 --steel-300: oklch(0.65 0.06 320);
63 --steel-250: oklch(0.70 0.06 320);
64 --steel-200: oklch(0.75 0.07 320);
65 --steel-150: oklch(0.90 0.04 320);
66 --steel-100: oklch(0.95 0.01 320);
67
68 --zinc-900: oklch(calc(0.15 * 1.05) calc(0.08/1.5) 320);
69 --zinc-850: oklch(calc(0.18 * 1.05) calc(0.07/1.5) 320);
70 --zinc-800: oklch(calc(0.21 * 1.05) calc(0.06/1.5) 320);
71 --zinc-750: oklch(calc(0.24 * 1.05) calc(0.06/1.5) 320);
72 --zinc-700: oklch(calc(0.27 * 1.05) calc(0.04/1.5) 320);
73 --zinc-650: oklch(calc(0.30 * 1.05) calc(0.05/1.5) 320);
74 --zinc-600: oklch(calc(0.35 * 1.05) calc(0.04/1.5) 320);
75 --zinc-550: oklch(calc(0.40 * 1.05) calc(0.03/1.5) 320);
76 --zinc-500: oklch(calc(0.45 * 1.05) calc(0.02/1.5) 320);
77 --zinc-450: oklch(calc(0.50 * 1.05) calc(0.03/1.5) 320);
78 --zinc-400: oklch(calc(0.55 * 1.05) calc(0.04/1.5) 320);
79 --zinc-350: oklch(calc(0.60 * 1.05) calc(0.04/1.5) 320);
80 --zinc-300: oklch(calc(0.65 * 1.05) calc(0.06/1.5) 320);
81 --zinc-250: oklch(calc(0.70 * 1.05) calc(0.06/1.5) 320);
82 --zinc-200: oklch(calc(0.75 * 1.05) calc(0.07/1.5) 320);
83 --zinc-150: oklch(calc(0.90 * 1.05) calc(0.04/1.5) 320);
84 --zinc-100: oklch(calc(0.95 * 1.05) calc(0.01/1.5) 320);
85 --zinc-50: oklch(calc(0.95 * 1.05) calc(0.01/1.5) 320);
86
87 --color-primary: #00896e;
88 --color-primary-contrast: #000;
89 --color-primary-dark-1: color-mix(in srgb, var(--color-primary) 90%, white);
90 --color-primary-dark-2: color-mix(in srgb, var(--color-primary) 80%, white);
91 --color-primary-dark-3: color-mix(in srgb, var(--color-primary) 70%, white);
92 --color-primary-dark-4: color-mix(in srgb, var(--color-primary) 60%, white);
93 --color-primary-dark-5: color-mix(in srgb, var(--color-primary) 50%, white);
94 --color-primary-dark-6: color-mix(in srgb, var(--color-primary) 40%, white);
95 --color-primary-dark-7: color-mix(in srgb, var(--color-primary) 30%, white);
96 --color-primary-light-1: color-mix(in srgb, var(--color-primary) 90%, black);
97 --color-primary-light-2: color-mix(in srgb, var(--color-primary) 80%, black);
98 --color-primary-light-3: color-mix(in srgb, var(--color-primary) 70%, black);
99 --color-primary-light-4: color-mix(in srgb, var(--color-primary) 60%, black);
100 --color-primary-light-5: color-mix(in srgb, var(--color-primary) 50%, black);
101 --color-primary-light-6: color-mix(in srgb, var(--color-primary) 40%, black);
102 --color-primary-light-7: color-mix(in srgb, var(--color-primary) 30%, black);
103 --color-primary-alpha-10: color-mix(in srgb, var(--color-primary) 10%, transparent);
104 --color-primary-alpha-20: color-mix(in srgb, var(--color-primary) 20%, transparent);
105 --color-primary-alpha-30: color-mix(in srgb, var(--color-primary) 30%, transparent);
106 --color-primary-alpha-40: color-mix(in srgb, var(--color-primary) 40%, transparent);
107 --color-primary-alpha-50: color-mix(in srgb, var(--color-primary) 50%, transparent);
108 --color-primary-alpha-60: color-mix(in srgb, var(--color-primary) 60%, transparent);
109 --color-primary-alpha-70: color-mix(in srgb, var(--color-primary) 70%, transparent);
110 --color-primary-alpha-80: color-mix(in srgb, var(--color-primary) 80%, transparent);
111 --color-primary-alpha-90: color-mix(in srgb, var(--color-primary) 90%, transparent);
112}
113
114@media (prefers-color-scheme: dark) {
115 :root {
116 --is-dark-theme: true;
117 --color-primary: #45F0CE;
118 }
119}
120
121.warning {
122 --color-primary: #c35b06;
123 @media (prefers-color-scheme:dark) {
124 --color-primary: #ff9843;
125 }
126 --color-primary-contrast: #000;
127 --color-primary-dark-1: color-mix(in srgb, var(--color-primary) 90%, white);
128 --color-primary-dark-2: color-mix(in srgb, var(--color-primary) 80%, white);
129 --color-primary-dark-3: color-mix(in srgb, var(--color-primary) 70%, white);
130 --color-primary-dark-4: color-mix(in srgb, var(--color-primary) 60%, white);
131 --color-primary-dark-5: color-mix(in srgb, var(--color-primary) 50%, white);
132 --color-primary-dark-6: color-mix(in srgb, var(--color-primary) 40%, white);
133 --color-primary-dark-7: color-mix(in srgb, var(--color-primary) 30%, white);
134 --color-primary-light-1: color-mix(in srgb, var(--color-primary) 90%, black);
135 --color-primary-light-2: color-mix(in srgb, var(--color-primary) 80%, black);
136 --color-primary-light-3: color-mix(in srgb, var(--color-primary) 70%, black);
137 --color-primary-light-4: color-mix(in srgb, var(--color-primary) 60%, black);
138 --color-primary-light-5: color-mix(in srgb, var(--color-primary) 50%, black);
139 --color-primary-light-6: color-mix(in srgb, var(--color-primary) 40%, black);
140 --color-primary-light-7: color-mix(in srgb, var(--color-primary) 30%, black);
141 --color-primary-alpha-10: color-mix(in srgb, var(--color-primary) 10%, transparent);
142 --color-primary-alpha-20: color-mix(in srgb, var(--color-primary) 20%, transparent);
143 --color-primary-alpha-30: color-mix(in srgb, var(--color-primary) 30%, transparent);
144 --color-primary-alpha-40: color-mix(in srgb, var(--color-primary) 40%, transparent);
145 --color-primary-alpha-50: color-mix(in srgb, var(--color-primary) 50%, transparent);
146 --color-primary-alpha-60: color-mix(in srgb, var(--color-primary) 60%, transparent);
147 --color-primary-alpha-70: color-mix(in srgb, var(--color-primary) 70%, transparent);
148 --color-primary-alpha-80: color-mix(in srgb, var(--color-primary) 80%, transparent);
149 --color-primary-alpha-90: color-mix(in srgb, var(--color-primary) 90%, transparent);
150}
\ No newline at end of file
config/forgejo/public/assets/font/.gitignore
config/forgejo/public/assets/img/apple-touch-icon.png
Binary files /dev/null and b/config/forgejo/public/assets/img/apple-touch-icon.png differ
config/forgejo/public/assets/img/avatar_default.png
Binary files /dev/null and b/config/forgejo/public/assets/img/avatar_default.png differ
config/forgejo/public/assets/img/favicon.png
Binary files /dev/null and b/config/forgejo/public/assets/img/favicon.png differ
config/forgejo/public/assets/img/favicon.svg created+12
......@@ -0,0 +1,12 @@
1<svg width="128" height="128" viewBox="0 0 128 128" fill="none" xmlns="http://www.w3.org/2000/svg">
2<g clip-path="url(#clip0_523_15)">
3<path d="M61.5684 7.70693C64.6721 6.36448 68.4195 6.34704 72.8377 7.95803C78.4656 10.0101 81.822 13.6905 83.4253 18.2209C84.9933 22.6513 84.8283 27.7225 83.8362 32.602C83.1517 35.9688 82.0523 39.3417 80.7608 42.4955C83.2729 40.1358 85.9589 37.891 88.7742 36.051C92.5601 33.5765 96.7168 31.7349 101.149 31.3476C105.629 30.956 110.236 32.0661 114.834 35.2354C119.332 38.3354 121.817 41.6962 122.656 45.1777C123.496 48.6664 122.596 51.9159 121.055 54.6115C119.523 57.2915 117.299 59.5384 115.233 61.1723C114.688 61.6029 114.136 62.0035 113.595 62.3676C113.816 62.5214 114.036 62.6823 114.254 62.8501C115.888 64.1045 117.584 65.8607 118.76 68.0806C119.948 70.3239 120.6 73.0369 120.102 76.0991C119.607 79.1459 118.003 82.3677 114.978 85.7011C114.966 85.714 114.953 85.7269 114.941 85.7395C110.213 90.681 104.403 93.4854 96.4482 92.6675C89.6435 91.9678 81.3978 88.6287 70.9762 82.0674C72.694 88.3469 74.3384 94.8737 78.0952 101.562L78.668 102.51C81.5917 107.215 85.3784 111.364 90.3472 114.142C91.0848 114.554 91.4828 115.387 91.3391 116.22L91.059 117.838C90.9383 118.536 90.4561 119.118 89.792 119.366C89.128 119.613 88.3824 119.489 87.8341 119.04C81.7308 114.043 77.609 108.813 74.6608 103.583L74.1679 102.726C70.7723 96.6952 68.6672 90.1784 67.2554 84.7724C65.3529 89.4079 62.4867 94.8711 58.9422 99.8487C56.145 103.777 52.8689 107.488 49.2272 110.273C45.5886 113.057 41.4772 114.998 37.052 115.178C32.696 115.356 29.3115 114.521 26.8202 112.851C24.3032 111.163 22.9005 108.759 22.2839 106.212C21.5522 103.19 21.9034 99.9029 22.8037 97.0763C22.1909 97.2224 21.5663 97.3438 20.936 97.4321C18.5514 97.7664 15.9393 97.6607 13.5971 96.5813C11.1866 95.4704 9.26035 93.417 8.19018 90.2686C7.14318 87.1881 6.92726 83.1097 7.71703 77.835C8.51931 72.4773 10.5455 68.3231 13.4539 65.2075C16.3514 62.1036 20.0244 60.1363 23.9658 58.9746C26.7593 58.1513 29.7185 57.7244 32.6951 57.5863C26.5793 54.1602 22.8016 49.8458 21.2255 45.0158C18.6343 37.0743 22.2931 28.7267 29.3312 22.3412C35.0781 17.1273 41.2623 15.3343 46.3395 17.0401C48.7744 17.8582 50.7713 19.4182 52.2279 21.5381C52.8123 19.0746 53.6545 16.5316 54.8779 14.2718C56.3634 11.5281 58.4981 9.03495 61.5684 7.70693ZM71.4733 11.7006C67.76 10.3467 65.0992 10.5217 63.1507 11.3645C61.1687 12.2217 59.6062 13.9071 58.3819 16.1685C55.8955 20.7612 55.1707 27.0364 54.9371 30.6669C54.869 31.725 53.9843 32.5448 52.9241 32.5315C51.8641 32.518 51.0004 31.6765 50.9589 30.6171C50.7439 25.126 48.2279 21.8778 45.0705 20.817C41.8427 19.7326 37.1246 20.6502 32.0082 25.2921C25.6178 31.0901 23.0931 37.8949 25.0128 43.779C26.9469 49.7068 33.6929 55.677 48.0848 59.0535L48.5008 59.1489C48.632 59.1789 48.7639 59.2097 48.8962 59.2392H48.8951C48.9027 59.241 48.9104 59.2426 48.918 59.2444C49.9845 59.4956 50.6487 60.5609 50.4038 61.6288C50.1588 62.6967 49.097 63.3667 48.0277 63.1281C47.9686 63.1149 47.9092 63.101 47.8503 63.0877C47.642 63.0392 47.4321 62.9904 47.2205 62.9434C40.3492 61.4175 31.9904 60.7642 25.0926 62.7971C21.673 63.8051 18.6745 65.4536 16.3664 67.926C14.0693 70.3869 12.3547 73.7707 11.6578 78.4244C10.9195 83.3551 11.1962 86.7315 11.9629 88.9871C12.7065 91.1746 13.9159 92.3402 15.2656 92.9622C16.6836 93.6156 18.4565 93.7572 20.383 93.4872C22.2968 93.219 24.2165 92.5633 25.8003 91.798C26.6186 91.4025 27.6017 91.6116 28.1888 92.3054C28.7755 92.9991 28.8179 94.0023 28.2926 94.7437C26.5752 97.1681 25.2789 101.651 26.1562 105.274C26.5761 107.008 27.4757 108.493 29.0386 109.541C30.6275 110.606 33.1005 111.352 36.8891 111.198C40.2346 111.061 43.5751 109.581 46.8064 107.109C50.0345 104.639 53.0461 101.26 55.6966 97.538C61.0223 90.0591 64.6533 81.5321 65.6243 77.0413L65.6918 76.8047C65.8802 76.2657 66.2928 75.8292 66.83 75.6135C67.4441 75.3673 68.1405 75.4419 68.6883 75.8128C81.1217 84.2291 90.0903 88.0082 96.856 88.7039C103.413 89.378 108.046 87.1707 112.037 83.0106C114.672 80.1045 115.827 77.5678 116.17 75.46C116.51 73.3653 116.076 71.526 115.239 69.9451C114.389 68.3406 113.118 67.0008 111.828 66.0095C110.504 64.9928 109.325 64.4669 108.771 64.3411C107.875 64.1379 107.234 63.3491 107.22 62.4309C107.205 61.5126 107.82 60.7028 108.708 60.4708C109.322 60.3106 110.908 59.5132 112.762 58.047C114.565 56.6219 116.391 54.7429 117.597 52.6339C118.793 50.5408 119.319 48.3377 118.783 46.1105C118.244 43.8757 116.55 41.2571 112.574 38.5163C108.698 35.845 105.005 35.0096 101.495 35.3164C97.9362 35.6274 94.4098 37.1273 90.9542 39.3858C83.9718 43.9495 77.8319 51.2056 72.7703 56.6182C72.0376 57.4017 70.8162 57.4647 70.0071 56.7604C69.1981 56.056 69.0923 54.8371 69.7674 54.0035C72.9557 50.067 78.093 40.8519 79.9318 31.8082C80.8491 27.2966 80.9019 23.0332 79.6692 19.5501C78.4719 16.167 76.0099 13.3548 71.4733 11.7006Z" fill="black" stroke="#021913" stroke-width="8" stroke-linejoin="round"/>
4<path d="M47.6524 60.9984C18.3025 54.1218 17.2406 36 30.6697 23.8163C41.5332 13.9602 52.474 18.3985 52.9493 30.5395C53.4196 23.2312 55.8923 3.89927 72.1556 9.8294C92.4847 17.2421 78.0501 46.9427 71.315 55.2579C81.2089 44.6781 96.7546 25.194 113.704 36.8757C130.653 48.5573 113.243 61.3462 109.211 62.3987C112.922 63.2408 124.837 71.8732 113.502 84.3619C104.777 93.4811 92.6033 94.4063 67.5719 77.4622C69.9445 85.0046 71.4211 93.7638 76.3781 102.572C79.498 107.874 83.6818 112.699 89.3756 115.881L89.0962 117.499C83.1772 112.652 79.2097 107.604 76.3781 102.572C71.2061 93.7839 68.9573 83.6842 67.5983 77.5808L67.5719 77.4622C65.4926 87.0789 52.5122 112.554 36.9707 113.188C20.6808 113.853 22.6921 99.2029 26.6675 93.5918C19.734 96.9425 6.63107 98.5412 9.68752 78.1296C12.6858 58.1065 33.6113 57.8801 47.6524 60.9984Z" fill="#285A4E"/>
5<path d="M61.5684 7.70693C64.6721 6.36448 68.4195 6.34704 72.8377 7.95803C78.4656 10.0101 81.822 13.6905 83.4253 18.2209C84.9933 22.6513 84.8283 27.7225 83.8362 32.602C83.1517 35.9688 82.0523 39.3417 80.7608 42.4955C83.2729 40.1358 85.9589 37.891 88.7742 36.051C92.5601 33.5765 96.7168 31.7349 101.149 31.3476C105.629 30.956 110.236 32.0661 114.834 35.2354C119.332 38.3354 121.817 41.6962 122.656 45.1777C123.496 48.6664 122.596 51.9159 121.055 54.6115C119.523 57.2915 117.299 59.5384 115.233 61.1723C114.688 61.6029 114.136 62.0035 113.595 62.3676C113.816 62.5214 114.036 62.6823 114.254 62.8501C115.888 64.1045 117.584 65.8607 118.76 68.0806C119.948 70.3239 120.6 73.0369 120.102 76.0991C119.607 79.1459 118.003 82.3677 114.978 85.7011C114.966 85.714 114.953 85.7269 114.941 85.7395C110.213 90.681 104.403 93.4854 96.4482 92.6675C89.6435 91.9678 81.3978 88.6287 70.9762 82.0674C72.694 88.3469 74.3384 94.8737 78.0952 101.562L78.668 102.51C81.5917 107.215 85.3784 111.364 90.3472 114.142C91.0848 114.554 91.4828 115.387 91.3391 116.22L91.059 117.838C90.9383 118.536 90.4561 119.118 89.792 119.366C89.128 119.613 88.3824 119.489 87.8341 119.04C81.7308 114.043 77.609 108.813 74.6608 103.583L74.1679 102.726C70.7723 96.6952 68.6672 90.1784 67.2554 84.7724C65.3529 89.4079 62.4867 94.8711 58.9422 99.8487C56.145 103.777 52.8689 107.488 49.2272 110.273C45.5886 113.057 41.4772 114.998 37.052 115.178C32.696 115.356 29.3115 114.521 26.8202 112.851C24.3032 111.163 22.9005 108.759 22.2839 106.212C21.5522 103.19 21.9034 99.9029 22.8037 97.0763C22.1909 97.2224 21.5663 97.3438 20.936 97.4321C18.5514 97.7664 15.9393 97.6607 13.5971 96.5813C11.1866 95.4704 9.26035 93.417 8.19018 90.2686C7.14318 87.1881 6.92726 83.1097 7.71703 77.835C8.51931 72.4773 10.5455 68.3231 13.4539 65.2075C16.3514 62.1036 20.0244 60.1363 23.9658 58.9746C26.7593 58.1513 29.7185 57.7244 32.6951 57.5863C26.5793 54.1602 22.8016 49.8458 21.2255 45.0158C18.6343 37.0743 22.2931 28.7267 29.3312 22.3412C35.0781 17.1273 41.2623 15.3343 46.3395 17.0401C48.7744 17.8582 50.7713 19.4182 52.2279 21.5381C52.8123 19.0746 53.6545 16.5316 54.8779 14.2718C56.3634 11.5281 58.4981 9.03495 61.5684 7.70693ZM71.4733 11.7006C67.76 10.3467 65.0992 10.5217 63.1507 11.3645C61.1687 12.2217 59.6062 13.9071 58.3819 16.1685C55.8955 20.7612 55.1707 27.0364 54.9371 30.6669C54.869 31.725 53.9843 32.5448 52.9241 32.5315C51.8641 32.518 51.0004 31.6765 50.9589 30.6171C50.7439 25.126 48.2279 21.8778 45.0705 20.817C41.8427 19.7326 37.1246 20.6502 32.0082 25.2921C25.6178 31.0901 23.0931 37.8949 25.0128 43.779C26.9469 49.7068 33.6929 55.677 48.0848 59.0535L48.5008 59.1489C48.632 59.1789 48.7639 59.2097 48.8962 59.2392H48.8951C48.9027 59.241 48.9104 59.2426 48.918 59.2444C49.9845 59.4956 50.6487 60.5609 50.4038 61.6288C50.1588 62.6967 49.097 63.3667 48.0277 63.1281C47.9686 63.1149 47.9092 63.101 47.8503 63.0877C47.642 63.0392 47.4321 62.9904 47.2205 62.9434C40.3492 61.4175 31.9904 60.7642 25.0926 62.7971C21.673 63.8051 18.6745 65.4536 16.3664 67.926C14.0693 70.3869 12.3547 73.7707 11.6578 78.4244C10.9195 83.3551 11.1962 86.7315 11.9629 88.9871C12.7065 91.1746 13.9159 92.3402 15.2656 92.9622C16.6836 93.6156 18.4565 93.7572 20.383 93.4872C22.2968 93.219 24.2165 92.5633 25.8003 91.798C26.6186 91.4025 27.6017 91.6116 28.1888 92.3054C28.7755 92.9991 28.8179 94.0023 28.2926 94.7437C26.5752 97.1681 25.2789 101.651 26.1562 105.274C26.5761 107.008 27.4757 108.493 29.0386 109.541C30.6275 110.606 33.1005 111.352 36.8891 111.198C40.2346 111.061 43.5751 109.581 46.8064 107.109C50.0345 104.639 53.0461 101.26 55.6966 97.538C61.0223 90.0591 64.6533 81.5321 65.6243 77.0413L65.6918 76.8047C65.8802 76.2657 66.2928 75.8292 66.83 75.6135C67.4441 75.3673 68.1405 75.4419 68.6883 75.8128C81.1217 84.2291 90.0903 88.0082 96.856 88.7039C103.413 89.378 108.046 87.1707 112.037 83.0106C114.672 80.1045 115.827 77.5678 116.17 75.46C116.51 73.3653 116.076 71.526 115.239 69.9451C114.389 68.3406 113.118 67.0008 111.828 66.0095C110.504 64.9928 109.325 64.4669 108.771 64.3411C107.875 64.1379 107.234 63.3491 107.22 62.4309C107.205 61.5126 107.82 60.7028 108.708 60.4708C109.322 60.3106 110.908 59.5132 112.762 58.047C114.565 56.6219 116.391 54.7429 117.597 52.6339C118.793 50.5408 119.319 48.3377 118.783 46.1105C118.244 43.8757 116.55 41.2571 112.574 38.5163C108.698 35.845 105.005 35.0096 101.495 35.3164C97.9362 35.6274 94.4098 37.1273 90.9542 39.3858C83.9718 43.9495 77.8319 51.2056 72.7703 56.6182C72.0376 57.4017 70.8162 57.4647 70.0071 56.7604C69.1981 56.056 69.0923 54.8371 69.7674 54.0035C72.9557 50.067 78.093 40.8519 79.9318 31.8082C80.8491 27.2966 80.9019 23.0332 79.6692 19.5501C78.4719 16.167 76.0099 13.3548 71.4733 11.7006Z" fill="#00FFCC"/>
6</g>
7<defs>
8<clipPath id="clip0_523_15">
9<rect width="128" height="128" fill="white"/>
10</clipPath>
11</defs>
12</svg>
config/forgejo/public/assets/img/logo.png
Binary files /dev/null and b/config/forgejo/public/assets/img/logo.png differ
config/forgejo/public/assets/img/logo.svg created+12
......@@ -0,0 +1,12 @@
1<svg width="128" height="128" viewBox="0 0 128 128" fill="none" xmlns="http://www.w3.org/2000/svg">
2<g clip-path="url(#clip0_523_15)">
3<path d="M61.5684 7.70693C64.6721 6.36448 68.4195 6.34704 72.8377 7.95803C78.4656 10.0101 81.822 13.6905 83.4253 18.2209C84.9933 22.6513 84.8283 27.7225 83.8362 32.602C83.1517 35.9688 82.0523 39.3417 80.7608 42.4955C83.2729 40.1358 85.9589 37.891 88.7742 36.051C92.5601 33.5765 96.7168 31.7349 101.149 31.3476C105.629 30.956 110.236 32.0661 114.834 35.2354C119.332 38.3354 121.817 41.6962 122.656 45.1777C123.496 48.6664 122.596 51.9159 121.055 54.6115C119.523 57.2915 117.299 59.5384 115.233 61.1723C114.688 61.6029 114.136 62.0035 113.595 62.3676C113.816 62.5214 114.036 62.6823 114.254 62.8501C115.888 64.1045 117.584 65.8607 118.76 68.0806C119.948 70.3239 120.6 73.0369 120.102 76.0991C119.607 79.1459 118.003 82.3677 114.978 85.7011C114.966 85.714 114.953 85.7269 114.941 85.7395C110.213 90.681 104.403 93.4854 96.4482 92.6675C89.6435 91.9678 81.3978 88.6287 70.9762 82.0674C72.694 88.3469 74.3384 94.8737 78.0952 101.562L78.668 102.51C81.5917 107.215 85.3784 111.364 90.3472 114.142C91.0848 114.554 91.4828 115.387 91.3391 116.22L91.059 117.838C90.9383 118.536 90.4561 119.118 89.792 119.366C89.128 119.613 88.3824 119.489 87.8341 119.04C81.7308 114.043 77.609 108.813 74.6608 103.583L74.1679 102.726C70.7723 96.6952 68.6672 90.1784 67.2554 84.7724C65.3529 89.4079 62.4867 94.8711 58.9422 99.8487C56.145 103.777 52.8689 107.488 49.2272 110.273C45.5886 113.057 41.4772 114.998 37.052 115.178C32.696 115.356 29.3115 114.521 26.8202 112.851C24.3032 111.163 22.9005 108.759 22.2839 106.212C21.5522 103.19 21.9034 99.9029 22.8037 97.0763C22.1909 97.2224 21.5663 97.3438 20.936 97.4321C18.5514 97.7664 15.9393 97.6607 13.5971 96.5813C11.1866 95.4704 9.26035 93.417 8.19018 90.2686C7.14318 87.1881 6.92726 83.1097 7.71703 77.835C8.51931 72.4773 10.5455 68.3231 13.4539 65.2075C16.3514 62.1036 20.0244 60.1363 23.9658 58.9746C26.7593 58.1513 29.7185 57.7244 32.6951 57.5863C26.5793 54.1602 22.8016 49.8458 21.2255 45.0158C18.6343 37.0743 22.2931 28.7267 29.3312 22.3412C35.0781 17.1273 41.2623 15.3343 46.3395 17.0401C48.7744 17.8582 50.7713 19.4182 52.2279 21.5381C52.8123 19.0746 53.6545 16.5316 54.8779 14.2718C56.3634 11.5281 58.4981 9.03495 61.5684 7.70693ZM71.4733 11.7006C67.76 10.3467 65.0992 10.5217 63.1507 11.3645C61.1687 12.2217 59.6062 13.9071 58.3819 16.1685C55.8955 20.7612 55.1707 27.0364 54.9371 30.6669C54.869 31.725 53.9843 32.5448 52.9241 32.5315C51.8641 32.518 51.0004 31.6765 50.9589 30.6171C50.7439 25.126 48.2279 21.8778 45.0705 20.817C41.8427 19.7326 37.1246 20.6502 32.0082 25.2921C25.6178 31.0901 23.0931 37.8949 25.0128 43.779C26.9469 49.7068 33.6929 55.677 48.0848 59.0535L48.5008 59.1489C48.632 59.1789 48.7639 59.2097 48.8962 59.2392H48.8951C48.9027 59.241 48.9104 59.2426 48.918 59.2444C49.9845 59.4956 50.6487 60.5609 50.4038 61.6288C50.1588 62.6967 49.097 63.3667 48.0277 63.1281C47.9686 63.1149 47.9092 63.101 47.8503 63.0877C47.642 63.0392 47.4321 62.9904 47.2205 62.9434C40.3492 61.4175 31.9904 60.7642 25.0926 62.7971C21.673 63.8051 18.6745 65.4536 16.3664 67.926C14.0693 70.3869 12.3547 73.7707 11.6578 78.4244C10.9195 83.3551 11.1962 86.7315 11.9629 88.9871C12.7065 91.1746 13.9159 92.3402 15.2656 92.9622C16.6836 93.6156 18.4565 93.7572 20.383 93.4872C22.2968 93.219 24.2165 92.5633 25.8003 91.798C26.6186 91.4025 27.6017 91.6116 28.1888 92.3054C28.7755 92.9991 28.8179 94.0023 28.2926 94.7437C26.5752 97.1681 25.2789 101.651 26.1562 105.274C26.5761 107.008 27.4757 108.493 29.0386 109.541C30.6275 110.606 33.1005 111.352 36.8891 111.198C40.2346 111.061 43.5751 109.581 46.8064 107.109C50.0345 104.639 53.0461 101.26 55.6966 97.538C61.0223 90.0591 64.6533 81.5321 65.6243 77.0413L65.6918 76.8047C65.8802 76.2657 66.2928 75.8292 66.83 75.6135C67.4441 75.3673 68.1405 75.4419 68.6883 75.8128C81.1217 84.2291 90.0903 88.0082 96.856 88.7039C103.413 89.378 108.046 87.1707 112.037 83.0106C114.672 80.1045 115.827 77.5678 116.17 75.46C116.51 73.3653 116.076 71.526 115.239 69.9451C114.389 68.3406 113.118 67.0008 111.828 66.0095C110.504 64.9928 109.325 64.4669 108.771 64.3411C107.875 64.1379 107.234 63.3491 107.22 62.4309C107.205 61.5126 107.82 60.7028 108.708 60.4708C109.322 60.3106 110.908 59.5132 112.762 58.047C114.565 56.6219 116.391 54.7429 117.597 52.6339C118.793 50.5408 119.319 48.3377 118.783 46.1105C118.244 43.8757 116.55 41.2571 112.574 38.5163C108.698 35.845 105.005 35.0096 101.495 35.3164C97.9362 35.6274 94.4098 37.1273 90.9542 39.3858C83.9718 43.9495 77.8319 51.2056 72.7703 56.6182C72.0376 57.4017 70.8162 57.4647 70.0071 56.7604C69.1981 56.056 69.0923 54.8371 69.7674 54.0035C72.9557 50.067 78.093 40.8519 79.9318 31.8082C80.8491 27.2966 80.9019 23.0332 79.6692 19.5501C78.4719 16.167 76.0099 13.3548 71.4733 11.7006Z" fill="black" stroke="#021913" stroke-width="8" stroke-linejoin="round"/>
4<path d="M47.6524 60.9984C18.3025 54.1218 17.2406 36 30.6697 23.8163C41.5332 13.9602 52.474 18.3985 52.9493 30.5395C53.4196 23.2312 55.8923 3.89927 72.1556 9.8294C92.4847 17.2421 78.0501 46.9427 71.315 55.2579C81.2089 44.6781 96.7546 25.194 113.704 36.8757C130.653 48.5573 113.243 61.3462 109.211 62.3987C112.922 63.2408 124.837 71.8732 113.502 84.3619C104.777 93.4811 92.6033 94.4063 67.5719 77.4622C69.9445 85.0046 71.4211 93.7638 76.3781 102.572C79.498 107.874 83.6818 112.699 89.3756 115.881L89.0962 117.499C83.1772 112.652 79.2097 107.604 76.3781 102.572C71.2061 93.7839 68.9573 83.6842 67.5983 77.5808L67.5719 77.4622C65.4926 87.0789 52.5122 112.554 36.9707 113.188C20.6808 113.853 22.6921 99.2029 26.6675 93.5918C19.734 96.9425 6.63107 98.5412 9.68752 78.1296C12.6858 58.1065 33.6113 57.8801 47.6524 60.9984Z" fill="#285A4E"/>
5<path d="M61.5684 7.70693C64.6721 6.36448 68.4195 6.34704 72.8377 7.95803C78.4656 10.0101 81.822 13.6905 83.4253 18.2209C84.9933 22.6513 84.8283 27.7225 83.8362 32.602C83.1517 35.9688 82.0523 39.3417 80.7608 42.4955C83.2729 40.1358 85.9589 37.891 88.7742 36.051C92.5601 33.5765 96.7168 31.7349 101.149 31.3476C105.629 30.956 110.236 32.0661 114.834 35.2354C119.332 38.3354 121.817 41.6962 122.656 45.1777C123.496 48.6664 122.596 51.9159 121.055 54.6115C119.523 57.2915 117.299 59.5384 115.233 61.1723C114.688 61.6029 114.136 62.0035 113.595 62.3676C113.816 62.5214 114.036 62.6823 114.254 62.8501C115.888 64.1045 117.584 65.8607 118.76 68.0806C119.948 70.3239 120.6 73.0369 120.102 76.0991C119.607 79.1459 118.003 82.3677 114.978 85.7011C114.966 85.714 114.953 85.7269 114.941 85.7395C110.213 90.681 104.403 93.4854 96.4482 92.6675C89.6435 91.9678 81.3978 88.6287 70.9762 82.0674C72.694 88.3469 74.3384 94.8737 78.0952 101.562L78.668 102.51C81.5917 107.215 85.3784 111.364 90.3472 114.142C91.0848 114.554 91.4828 115.387 91.3391 116.22L91.059 117.838C90.9383 118.536 90.4561 119.118 89.792 119.366C89.128 119.613 88.3824 119.489 87.8341 119.04C81.7308 114.043 77.609 108.813 74.6608 103.583L74.1679 102.726C70.7723 96.6952 68.6672 90.1784 67.2554 84.7724C65.3529 89.4079 62.4867 94.8711 58.9422 99.8487C56.145 103.777 52.8689 107.488 49.2272 110.273C45.5886 113.057 41.4772 114.998 37.052 115.178C32.696 115.356 29.3115 114.521 26.8202 112.851C24.3032 111.163 22.9005 108.759 22.2839 106.212C21.5522 103.19 21.9034 99.9029 22.8037 97.0763C22.1909 97.2224 21.5663 97.3438 20.936 97.4321C18.5514 97.7664 15.9393 97.6607 13.5971 96.5813C11.1866 95.4704 9.26035 93.417 8.19018 90.2686C7.14318 87.1881 6.92726 83.1097 7.71703 77.835C8.51931 72.4773 10.5455 68.3231 13.4539 65.2075C16.3514 62.1036 20.0244 60.1363 23.9658 58.9746C26.7593 58.1513 29.7185 57.7244 32.6951 57.5863C26.5793 54.1602 22.8016 49.8458 21.2255 45.0158C18.6343 37.0743 22.2931 28.7267 29.3312 22.3412C35.0781 17.1273 41.2623 15.3343 46.3395 17.0401C48.7744 17.8582 50.7713 19.4182 52.2279 21.5381C52.8123 19.0746 53.6545 16.5316 54.8779 14.2718C56.3634 11.5281 58.4981 9.03495 61.5684 7.70693ZM71.4733 11.7006C67.76 10.3467 65.0992 10.5217 63.1507 11.3645C61.1687 12.2217 59.6062 13.9071 58.3819 16.1685C55.8955 20.7612 55.1707 27.0364 54.9371 30.6669C54.869 31.725 53.9843 32.5448 52.9241 32.5315C51.8641 32.518 51.0004 31.6765 50.9589 30.6171C50.7439 25.126 48.2279 21.8778 45.0705 20.817C41.8427 19.7326 37.1246 20.6502 32.0082 25.2921C25.6178 31.0901 23.0931 37.8949 25.0128 43.779C26.9469 49.7068 33.6929 55.677 48.0848 59.0535L48.5008 59.1489C48.632 59.1789 48.7639 59.2097 48.8962 59.2392H48.8951C48.9027 59.241 48.9104 59.2426 48.918 59.2444C49.9845 59.4956 50.6487 60.5609 50.4038 61.6288C50.1588 62.6967 49.097 63.3667 48.0277 63.1281C47.9686 63.1149 47.9092 63.101 47.8503 63.0877C47.642 63.0392 47.4321 62.9904 47.2205 62.9434C40.3492 61.4175 31.9904 60.7642 25.0926 62.7971C21.673 63.8051 18.6745 65.4536 16.3664 67.926C14.0693 70.3869 12.3547 73.7707 11.6578 78.4244C10.9195 83.3551 11.1962 86.7315 11.9629 88.9871C12.7065 91.1746 13.9159 92.3402 15.2656 92.9622C16.6836 93.6156 18.4565 93.7572 20.383 93.4872C22.2968 93.219 24.2165 92.5633 25.8003 91.798C26.6186 91.4025 27.6017 91.6116 28.1888 92.3054C28.7755 92.9991 28.8179 94.0023 28.2926 94.7437C26.5752 97.1681 25.2789 101.651 26.1562 105.274C26.5761 107.008 27.4757 108.493 29.0386 109.541C30.6275 110.606 33.1005 111.352 36.8891 111.198C40.2346 111.061 43.5751 109.581 46.8064 107.109C50.0345 104.639 53.0461 101.26 55.6966 97.538C61.0223 90.0591 64.6533 81.5321 65.6243 77.0413L65.6918 76.8047C65.8802 76.2657 66.2928 75.8292 66.83 75.6135C67.4441 75.3673 68.1405 75.4419 68.6883 75.8128C81.1217 84.2291 90.0903 88.0082 96.856 88.7039C103.413 89.378 108.046 87.1707 112.037 83.0106C114.672 80.1045 115.827 77.5678 116.17 75.46C116.51 73.3653 116.076 71.526 115.239 69.9451C114.389 68.3406 113.118 67.0008 111.828 66.0095C110.504 64.9928 109.325 64.4669 108.771 64.3411C107.875 64.1379 107.234 63.3491 107.22 62.4309C107.205 61.5126 107.82 60.7028 108.708 60.4708C109.322 60.3106 110.908 59.5132 112.762 58.047C114.565 56.6219 116.391 54.7429 117.597 52.6339C118.793 50.5408 119.319 48.3377 118.783 46.1105C118.244 43.8757 116.55 41.2571 112.574 38.5163C108.698 35.845 105.005 35.0096 101.495 35.3164C97.9362 35.6274 94.4098 37.1273 90.9542 39.3858C83.9718 43.9495 77.8319 51.2056 72.7703 56.6182C72.0376 57.4017 70.8162 57.4647 70.0071 56.7604C69.1981 56.056 69.0923 54.8371 69.7674 54.0035C72.9557 50.067 78.093 40.8519 79.9318 31.8082C80.8491 27.2966 80.9019 23.0332 79.6692 19.5501C78.4719 16.167 76.0099 13.3548 71.4733 11.7006Z" fill="#00FFCC"/>
6</g>
7<defs>
8<clipPath id="clip0_523_15">
9<rect width="128" height="128" fill="white"/>
10</clipPath>
11</defs>
12</svg>
config/jellyfin/Caddyfile created+91
......@@ -0,0 +1,91 @@
1jelly.{$HOME_DOMAIN} {
2 handle_path /web/main.jellyfin*.css {
3 header Content-Type "text/css"
4 respond 200 {
5 body `
6 @import url("/original{http.request.uri.path}") layer(base);
7 @import url("/original/web/themes/dark/theme.css") layer(basetheme);
8 @import url("https://jellyfin.catppuccin.com/theme.css") layer(cat);
9 @import url("https://jellyfin.catppuccin.com/catppuccin-macchiato.css");
10 @import url("https://jellyfin.catppuccin.com/catppuccin-latte.css") (prefers-color-scheme: light);
11 @font-face {
12 font-family: 'Name Sans';
13 src: url('/web/extra/font/ATNameSansVariable-Regular.woff2') format('woff2') tech(variations);
14 font-weight: 100 900;
15 font-style: normal;
16 font-display: swap;
17 font-stretch: 75% 125%;
18 }
19
20 @font-face {
21 font-family: 'Name Sans';
22 src: url('/web/extra/font/ATNameSansVariable-Italic.woff2') format('woff2') tech(variations);
23 font-weight: 100 900;
24 font-style: italic;
25 font-display: swap;
26 font-stretch: 75% 125%;
27 }
28
29 body { font-family: "Name Sans", sans-serif;}
30 .preload, .touch-menu-la, .mainDrawer-scrollContainer {
31 background-color: var(--main-background);
32 color: var(--main-text);
33 }
34 :root {
35 --main-color: var(--sapphire);
36 --jf-font-button: 500 0.875rem / 1.75 "Name Sans", sans-serif;
37 --jf-font-h1: 300 1.8rem / 1.167 "Name Sans", sans-serif;
38 --jf-font-h2: 300 1.5rem / 1.2 "Name Sans", sans-serif;
39 --jf-font-h3: 400 1.17rem / 1.167 "Name Sans", sans-serif;
40 --jf-font-h4: 400 2.125rem / 1.235 "Name Sans", sans-serif;
41 --jf-font-h5: 400 1.5rem / 1.334 "Name Sans", sans-serif;
42 --jf-font-h6: 500 1.25rem / 1.6 "Name Sans", sans-serif;
43 --jf-font-subtitle1: 400 1rem / 1.75 "Name Sans", sans-serif;
44 --jf-font-subtitle2: 500 0.875rem / 1.57 "Name Sans", sans-serif;
45 --jf-font-body1: 400 1rem / 1.5 "Name Sans", sans-serif;
46 --jf-font-body2: 400 0.875rem / 1.43 "Name Sans", sans-serif;
47 --jf-font-caption: 400 0.75rem / 1.66 "Name Sans", sans-serif;
48 --jf-font-overline: 400 0.75rem / 2.66 "Name Sans", sans-serif;
49 --jf-font-inherit: inherit inherit / inherit inherit;
50 }
51
52 .pageTitleWithDefaultLogo { background-image: url(/web/extra/cloverfin-banner.png)!important; }
53 .layout-tv .pageTitleWithDefaultLogo { background-image: url(/web/extra/cloverfin-icon.png)!important; }
54 .splashLogo { background-image: url(/web/extra/cloverfin-icon.png)!important; }
55
56 @media (min-device-width: 992px) {
57 .splashLogo { background-image: url(/web/extra/cloverfin-banner.png)!important; }
58 }
59
60 @media (prefers-color-scheme: light) {
61 .pageTitleWithDefaultLogo { background-image: url(/web/extra/cloverfin-banner-light.png)!important;}
62 .layout-tv .pageTitleWithDefaultLogo { background-image: url(/web/extra/cloverfin-icon-light.png)!important;}
63 .splashLogo { background-image: url(/web/extra/cloverfin-icon-light.png)!important; }
64 }
65
66 @media (min-device-width: 992px) and (prefers-color-scheme: light) {
67 .splashLogo { background-image: url(/web/extra/cloverfin-banner-light.png)!important; }
68 }
69 `
70 }
71 }
72 handle_path /web/themes/dark/theme.css {
73 header Content-Type "text/css"
74 respond 200 ""
75 }
76 handle_path /original/* {
77 uri strip_prefix /original
78 reverse_proxy "jellyfin:8096"
79 }
80 handle_path /web/extra/font/* {
81 uri strip_prefix /web/extra/font
82 root /etc/caddy/font
83 file_server
84 }
85 handle_path /web/extra/* {
86 uri strip_prefix /web/extra
87 root /etc/caddy/jellyfin
88 file_server
89 }
90 reverse_proxy "jellyfin:8096"
91}
config/jellyfin/branding.xml created+8
......@@ -0,0 +1,8 @@
1<?xml version="1.0" encoding="utf-8"?>
2<BrandingOptions xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
3 <LoginDisclaimer>and then we knew, just like paper airplanes: that we could fly.</LoginDisclaimer>
4 <CustomCss></CustomCss>
5 <SplashscreenEnabled>true</SplashscreenEnabled>
6 <SplashscreenLocation>/config/upload/splashscreen-upload.jpg</SplashscreenLocation>
7</BrandingOptions>
8
config/jellyfin/cloverfin-banner-light.png
Binary files /dev/null and b/config/jellyfin/cloverfin-banner-light.png differ
config/jellyfin/cloverfin-banner.png
Binary files /dev/null and b/config/jellyfin/cloverfin-banner.png differ
config/jellyfin/cloverfin-icon-light.png
Binary files /dev/null and b/config/jellyfin/cloverfin-icon-light.png differ
config/jellyfin/cloverfin-icon.png
Binary files /dev/null and b/config/jellyfin/cloverfin-icon.png differ
config/jellyfin/font/.gitignore
config/opencode/Dockerfile created+57
......@@ -0,0 +1,57 @@
1FROM fedora:latest
2
3# system utilities
4RUN dnf update -y && \
5 dnf install -y \
6 neovim \
7 bash \
8 cargo \
9 curl \
10 git \
11 jq \
12 llvm \
13 tree \
14 unzip \
15 wget \
16 zsh \
17 && dnf clean all
18RUN curl -fsSL https://git.paperclover.net/nix/config/src/branch/main/packages/autofmt/autofmt.js -o /usr/local/bin/autofmt && \
19 chmod +x /usr/local/bin/autofmt
20
21# create user
22RUN groupadd -g 3000 agent && \
23 useradd -u 3000 -g 3000 -m -s /bin/zsh agent
24USER agent
25ENV HOME=/home/agent
26WORKDIR /home/agent
27
28# nvm
29ENV NODE_VERSION=24
30RUN curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/master/install.sh | bash && \
31 . "$HOME/.nvm/nvm.sh" && \
32 nvm install $NODE_VERSION && \
33 ln -s "$(dirname $(dirname $(nvm which $NODE_VERSION)))" $HOME/.nvm-current && \
34 npm i -g pnpm typescript jsr
35
36ENV EDITOR=nvim
37RUN echo "TERM=xterm-256color" > $HOME/.zshrc
38
39# curl installations
40RUN curl -fsSL https://deno.land/install.sh | sh
41RUN curl -fsSL https://dprint.dev/install.sh | sh
42RUN curl -fsSL https://opencode.ai/install | bash
43
44# cargo binstall
45RUN curl -L --proto '=https' --tlsv1.2 -sSf https://raw.githubusercontent.com/cargo-bins/cargo-binstall/main/install-from-binstall-release.sh | bash
46RUN cargo binstall --strategies crate-meta-data jj-cli -y
47
48ENV PATH="$PATH:$HOME/.nvm-current/bin:\
49$HOME/.opencode/bin:\
50$HOME/.deno/bin:\
51$HOME/.dprint/bin:\
52$HOME/.cargo/bin"
53
54ENV SHELL=/bin/zsh
55WORKDIR /code
56EXPOSE 4096
57CMD ["opencode", "serve", "--hostname", "0.0.0.0"]
config/openvpn/ca.rsa.2048.crt created+33
......@@ -0,0 +1,33 @@
1-----BEGIN CERTIFICATE-----
2MIIFqzCCBJOgAwIBAgIJAKZ7D5Yv87qDMA0GCSqGSIb3DQEBDQUAMIHoMQswCQYD
3VQQGEwJVUzELMAkGA1UECBMCQ0ExEzARBgNVBAcTCkxvc0FuZ2VsZXMxIDAeBgNV
4BAoTF1ByaXZhdGUgSW50ZXJuZXQgQWNjZXNzMSAwHgYDVQQLExdQcml2YXRlIElu
5dGVybmV0IEFjY2VzczEgMB4GA1UEAxMXUHJpdmF0ZSBJbnRlcm5ldCBBY2Nlc3Mx
6IDAeBgNVBCkTF1ByaXZhdGUgSW50ZXJuZXQgQWNjZXNzMS8wLQYJKoZIhvcNAQkB
7FiBzZWN1cmVAcHJpdmF0ZWludGVybmV0YWNjZXNzLmNvbTAeFw0xNDA0MTcxNzM1
8MThaFw0zNDA0MTIxNzM1MThaMIHoMQswCQYDVQQGEwJVUzELMAkGA1UECBMCQ0Ex
9EzARBgNVBAcTCkxvc0FuZ2VsZXMxIDAeBgNVBAoTF1ByaXZhdGUgSW50ZXJuZXQg
10QWNjZXNzMSAwHgYDVQQLExdQcml2YXRlIEludGVybmV0IEFjY2VzczEgMB4GA1UE
11AxMXUHJpdmF0ZSBJbnRlcm5ldCBBY2Nlc3MxIDAeBgNVBCkTF1ByaXZhdGUgSW50
12ZXJuZXQgQWNjZXNzMS8wLQYJKoZIhvcNAQkBFiBzZWN1cmVAcHJpdmF0ZWludGVy
13bmV0YWNjZXNzLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAPXD
14L1L9tX6DGf36liA7UBTy5I869z0UVo3lImfOs/GSiFKPtInlesP65577nd7UNzzX
15lH/P/CnFPdBWlLp5ze3HRBCc/Avgr5CdMRkEsySL5GHBZsx6w2cayQ2EcRhVTwWp
16cdldeNO+pPr9rIgPrtXqT4SWViTQRBeGM8CDxAyTopTsobjSiYZCF9Ta1gunl0G/
178Vfp+SXfYCC+ZzWvP+L1pFhPRqzQQ8k+wMZIovObK1s+nlwPaLyayzw9a8sUnvWB
18/5rGPdIYnQWPgoNlLN9HpSmsAcw2z8DXI9pIxbr74cb3/HSfuYGOLkRqrOk6h4RC
19OfuWoTrZup1uEOn+fw8CAwEAAaOCAVQwggFQMB0GA1UdDgQWBBQv63nQ/pJAt5tL
20y8VJcbHe22ZOsjCCAR8GA1UdIwSCARYwggESgBQv63nQ/pJAt5tLy8VJcbHe22ZO
21sqGB7qSB6zCB6DELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAkNBMRMwEQYDVQQHEwpM
22b3NBbmdlbGVzMSAwHgYDVQQKExdQcml2YXRlIEludGVybmV0IEFjY2VzczEgMB4G
23A1UECxMXUHJpdmF0ZSBJbnRlcm5ldCBBY2Nlc3MxIDAeBgNVBAMTF1ByaXZhdGUg
24SW50ZXJuZXQgQWNjZXNzMSAwHgYDVQQpExdQcml2YXRlIEludGVybmV0IEFjY2Vz
25czEvMC0GCSqGSIb3DQEJARYgc2VjdXJlQHByaXZhdGVpbnRlcm5ldGFjY2Vzcy5j
26b22CCQCmew+WL/O6gzAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBDQUAA4IBAQAn
27a5PgrtxfwTumD4+3/SYvwoD66cB8IcK//h1mCzAduU8KgUXocLx7QgJWo9lnZ8xU
28ryXvWab2usg4fqk7FPi00bED4f4qVQFVfGfPZIH9QQ7/48bPM9RyfzImZWUCenK3
297pdw4Bvgoys2rHLHbGen7f28knT2j/cbMxd78tQc20TIObGjo8+ISTRclSTRBtyC
30GohseKYpTS9himFERpUgNtefvYHbn70mIOzfOJFTVqfrptf9jXa9N8Mpy3ayfodz
311wiqdteqFXkTYoSDctgKMiZ6GdocK9nMroQipIQtpnwd4yBDWIyC6Bvlkrq5TQUt
32YDQ8z9v+DMO6iwyIDRiU
33-----END CERTIFICATE-----
config/openvpn/crl.rsa.2048.pem created+15
......@@ -0,0 +1,15 @@
1-----BEGIN X509 CRL-----
2MIICWDCCAUAwDQYJKoZIhvcNAQENBQAwgegxCzAJBgNVBAYTAlVTMQswCQYDVQQI
3EwJDQTETMBEGA1UEBxMKTG9zQW5nZWxlczEgMB4GA1UEChMXUHJpdmF0ZSBJbnRl
4cm5ldCBBY2Nlc3MxIDAeBgNVBAsTF1ByaXZhdGUgSW50ZXJuZXQgQWNjZXNzMSAw
5HgYDVQQDExdQcml2YXRlIEludGVybmV0IEFjY2VzczEgMB4GA1UEKRMXUHJpdmF0
6ZSBJbnRlcm5ldCBBY2Nlc3MxLzAtBgkqhkiG9w0BCQEWIHNlY3VyZUBwcml2YXRl
7aW50ZXJuZXRhY2Nlc3MuY29tFw0xNjA3MDgxOTAwNDZaFw0zNjA3MDMxOTAwNDZa
8MCYwEQIBARcMMTYwNzA4MTkwMDQ2MBECAQYXDDE2MDcwODE5MDA0NjANBgkqhkiG
99w0BAQ0FAAOCAQEAQZo9X97ci8EcPYu/uK2HB152OZbeZCINmYyluLDOdcSvg6B5
10jI+ffKN3laDvczsG6CxmY3jNyc79XVpEYUnq4rT3FfveW1+Ralf+Vf38HdpwB8EW
11B4hZlQ205+21CALLvZvR8HcPxC9KEnev1mU46wkTiov0EKc+EdRxkj5yMgv0V2Re
12ze7AP+NQ9ykvDScH4eYCsmufNpIjBLhpLE2cuZZXBLcPhuRzVoU3l7A9lvzG9mjA
135YijHJGHNjlWFqyrn1CfYS6koa4TGEPngBoAziWRbDGdhEgJABHrpoaFYaL61zqy
14MR6jC0K2ps9qyZAN74LEBedEfK7tBOzWMwr58A==
15-----END X509 CRL-----
config/openvpn/profile.ovpn created+53
......@@ -0,0 +1,53 @@
1client
2dev tun
3proto udp
4remote us-siliconvalley.privacy.network 1198
5resolv-retry infinite
6nobind
7persist-key
8cipher aes-128-cbc
9auth sha1
10tls-client
11remote-cert-tls server
12
13auth-user-pass /run/secrets/openvpn-credentials
14comp-lzo no
15verb 1
16
17<ca>
18-----BEGIN CERTIFICATE-----
19MIIFqzCCBJOgAwIBAgIJAKZ7D5Yv87qDMA0GCSqGSIb3DQEBDQUAMIHoMQswCQYD
20VQQGEwJVUzELMAkGA1UECBMCQ0ExEzARBgNVBAcTCkxvc0FuZ2VsZXMxIDAeBgNV
21BAoTF1ByaXZhdGUgSW50ZXJuZXQgQWNjZXNzMSAwHgYDVQQLExdQcml2YXRlIElu
22dGVybmV0IEFjY2VzczEgMB4GA1UEAxMXUHJpdmF0ZSBJbnRlcm5ldCBBY2Nlc3Mx
23IDAeBgNVBCkTF1ByaXZhdGUgSW50ZXJuZXQgQWNjZXNzMS8wLQYJKoZIhvcNAQkB
24FiBzZWN1cmVAcHJpdmF0ZWludGVybmV0YWNjZXNzLmNvbTAeFw0xNDA0MTcxNzM1
25MThaFw0zNDA0MTIxNzM1MThaMIHoMQswCQYDVQQGEwJVUzELMAkGA1UECBMCQ0Ex
26EzARBgNVBAcTCkxvc0FuZ2VsZXMxIDAeBgNVBAoTF1ByaXZhdGUgSW50ZXJuZXQg
27QWNjZXNzMSAwHgYDVQQLExdQcml2YXRlIEludGVybmV0IEFjY2VzczEgMB4GA1UE
28AxMXUHJpdmF0ZSBJbnRlcm5ldCBBY2Nlc3MxIDAeBgNVBCkTF1ByaXZhdGUgSW50
29ZXJuZXQgQWNjZXNzMS8wLQYJKoZIhvcNAQkBFiBzZWN1cmVAcHJpdmF0ZWludGVy
30bmV0YWNjZXNzLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAPXD
31L1L9tX6DGf36liA7UBTy5I869z0UVo3lImfOs/GSiFKPtInlesP65577nd7UNzzX
32lH/P/CnFPdBWlLp5ze3HRBCc/Avgr5CdMRkEsySL5GHBZsx6w2cayQ2EcRhVTwWp
33cdldeNO+pPr9rIgPrtXqT4SWViTQRBeGM8CDxAyTopTsobjSiYZCF9Ta1gunl0G/
348Vfp+SXfYCC+ZzWvP+L1pFhPRqzQQ8k+wMZIovObK1s+nlwPaLyayzw9a8sUnvWB
35/5rGPdIYnQWPgoNlLN9HpSmsAcw2z8DXI9pIxbr74cb3/HSfuYGOLkRqrOk6h4RC
36OfuWoTrZup1uEOn+fw8CAwEAAaOCAVQwggFQMB0GA1UdDgQWBBQv63nQ/pJAt5tL
37y8VJcbHe22ZOsjCCAR8GA1UdIwSCARYwggESgBQv63nQ/pJAt5tLy8VJcbHe22ZO
38sqGB7qSB6zCB6DELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAkNBMRMwEQYDVQQHEwpM
39b3NBbmdlbGVzMSAwHgYDVQQKExdQcml2YXRlIEludGVybmV0IEFjY2VzczEgMB4G
40A1UECxMXUHJpdmF0ZSBJbnRlcm5ldCBBY2Nlc3MxIDAeBgNVBAMTF1ByaXZhdGUg
41SW50ZXJuZXQgQWNjZXNzMSAwHgYDVQQpExdQcml2YXRlIEludGVybmV0IEFjY2Vz
42czEvMC0GCSqGSIb3DQEJARYgc2VjdXJlQHByaXZhdGVpbnRlcm5ldGFjY2Vzcy5j
43b22CCQCmew+WL/O6gzAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBDQUAA4IBAQAn
44a5PgrtxfwTumD4+3/SYvwoD66cB8IcK//h1mCzAduU8KgUXocLx7QgJWo9lnZ8xU
45ryXvWab2usg4fqk7FPi00bED4f4qVQFVfGfPZIH9QQ7/48bPM9RyfzImZWUCenK3
467pdw4Bvgoys2rHLHbGen7f28knT2j/cbMxd78tQc20TIObGjo8+ISTRclSTRBtyC
47GohseKYpTS9himFERpUgNtefvYHbn70mIOzfOJFTVqfrptf9jXa9N8Mpy3ayfodz
481wiqdteqFXkTYoSDctgKMiZ6GdocK9nMroQipIQtpnwd4yBDWIyC6Bvlkrq5TQUt
49YDQ8z9v+DMO6iwyIDRiU
50-----END CERTIFICATE-----
51</ca>
52
53disable-occ
config/postgres/Dockerfile created+19
......@@ -0,0 +1,19 @@
1FROM postgres:17
2
3ARG USER_ID
4ARG GROUP_ID
5
6RUN groupmod -g $GROUP_ID postgres || true
7RUN usermod -u $USER_ID -g $GROUP_ID postgres
8
9ENV POSTGIS_MAJOR 3
10RUN apt-get update \
11 && apt-cache showpkg postgresql-$PG_MAJOR-postgis-$POSTGIS_MAJOR \
12 && apt-get install -y --no-install-recommends \
13 postgresql-$PG_MAJOR-postgis-$POSTGIS_MAJOR \
14 postgresql-$PG_MAJOR-postgis-$POSTGIS_MAJOR-scripts \
15 && rm -rf /var/lib/apt/lists/*
16
17COPY ./init.sh /usr/local/bin/clover-postgres-init.sh
18
19ENTRYPOINT ["/usr/local/bin/clover-postgres-init.sh"]
config/postgres/init.sh created+40
......@@ -0,0 +1,40 @@
1#!/bin/sh
2set -e
3docker-entrypoint.sh postgres &
4PG_PID=$!
5printf "Waiting for database\n"
6until pg_isready -U postgres; do
7 sleep 1
8done
9
10ensure_db_user() {
11 printf "Configuring Database %s\n" "$1"
12 user="$1"
13 pass="$2"
14
15 psql -v ON_ERROR_STOP=1 -U postgres postgres <<-SQL
16 DO \$\$
17 BEGIN
18 IF EXISTS (SELECT FROM pg_user WHERE usename = '$user') THEN
19 ALTER USER "$user" WITH PASSWORD '$pass';
20 ELSE
21 CREATE USER "$user" WITH PASSWORD '$pass';
22 END IF;
23 END
24 \$\$;
25
26 SELECT 'CREATE DATABASE "$user" OWNER "$user"'
27 WHERE NOT EXISTS (SELECT FROM pg_database WHERE datname = '$user')
28 \gexec
29SQL
30}
31
32ensure_db_user "clover" "$POSTGRES_PASSWORD"
33ensure_db_user "authelia" "$POSTGRES_PASSWORD_AUTHELIA"
34ensure_db_user "dawarich" "$POSTGRES_PASSWORD_DAWARICH"
35ensure_db_user "forgejo" "$POSTGRES_PASSWORD_FORGEJO"
36ensure_db_user "jellyfin" "$POSTGRES_PASSWORD_JELLYFIN"
37
38printf "Everything is ready!"
39
40wait $PG_PID
local-dns.sh created+16
......@@ -0,0 +1,16 @@
1#!/bin/sh
2/opt/homebrew/bin/brew install dnsmasq
3echo "address=/.local.test/127.0.0.1" >"$(/opt/homebrew/bin/brew --prefix)/etc/dnsmasq.conf"
4echo "port=53" >>"$(/opt/homebrew/bin/brew --prefix)/etc/dnsmasq.conf"
5sudo /opt/homebrew/bin/brew services restart dnsmasq
6sudo mkdir -p /etc/resolver
7echo "nameserver 127.0.0.1" | sudo tee /etc/resolver/local.test
8
9docker compose up -d caddy
10
11while ! [ -f .apps/caddy/pki/authorities/local/root.crt ]; do
12 echo waiting for certificate
13 sleep 1
14done
15
16sudo security add-trusted-cert -d -r trustRoot -k /Library/Keychains/System.keychain .apps/caddy/pki/authorities/local/root.crt
readme.md created+31
......@@ -0,0 +1,31 @@
1# clover's home infrastructure
2
3this codebase is used for all docker services on my home nas, including personal
4customization.
5
6## usage
7
8```
9git clone https://git.paperclover.net/clo/home-infra.git
10cd home-infra
11
12# setup repo
13rm config/font/*
14git clone https://git.paperclover.net/clo/sitegen.git
15cp .env.example .env
16
17# fill secrets
18vi .env
19vi secrets/authelia-encryption-key.txt
20vi secrets/authelia-session-secret.txt
21vi secrets/authelia-jwt-secret.txt
22vi secrets/openvpn-credentials.txt
23
24docker compose up -d
25```
26
27## license
28
29this repository is for example usage only. you may not re-host it in full,
30privately or publicly, but you may learn from my usage. please note that some
31components here are under licenses which do not permit redistribution.
secrets/.gitignore created+1
......@@ -0,0 +1 @@
1*.txt