| author | |
| committer | |
| log | 4f9fc9b6a085ffbb5f78850f91023a01ed4c410f |
| tree | c223efaa1256bb3550cba9d39dbffee9152482a2 |
| signature |
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/radarr38 files changed, 1323 insertions(+), 0 deletions(-)
.env.example created+26| ... | @@ -0,0 +1,26 @@ | ||
| 1 | # shellcheck disable | ||
| 2 | HOME_DOMAIN=local.test | ||
| 3 | ADMIN_EMAIL= | ||
| 4 | USER_ID="501" | ||
| 5 | GROUP_ID="20" | ||
| 6 | |||
| 7 | APP_ROOT=./.apps | ||
| 8 | STORE_ROOT=/Volumes | ||
| 9 | CLOVER_ROOT=/Volumes/clover | ||
| 10 | MEDIA_ROOT=/Volumes/media | ||
| 11 | |||
| 12 | MAILER_ADDRESS=smtp.example.com | ||
| 13 | MAILER_USERNAME=me@paperclover.net | ||
| 14 | MAILER_PASSWORD=yolo | ||
| 15 | |||
| 16 | POSTGRES_PASSWORD= | ||
| 17 | POSTGRES_PASSWORD_AUTHELIA= | ||
| 18 | POSTGRES_PASSWORD_FORGEJO= | ||
| 19 | POSTGRES_PASSWORD_DAWARICH= | ||
| 20 | POSTGRES_PASSWORD_JELLYFIN= | ||
| 21 | |||
| 22 | CLOVER_SOT_KEY= | ||
| 23 | |||
| 24 | FORGEJO_SERVER_LFS_JWT_SECRET= | ||
| 25 | FORGEJO_OAUTH2_JWT_SECRET= | ||
| 26 | FORGEJO_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 @@ | ||
| 1 | services: | ||
| 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 | |||
| 415 | secrets: | ||
| 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 @@ | ||
| 1 | local.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} | ||
| 14 | import ./jellyfin/Caddyfile | ||
| 15 | |||
| 16 | auth.{$HOME_DOMAIN} { | ||
| 17 | 	reverse_proxy "authelia:9091" | ||
| 18 | } | ||
| 19 | dawarich.{$HOME_DOMAIN} { | ||
| 20 | 	reverse_proxy "dawarich:30161" | ||
| 21 | } | ||
| 22 | db.{$HOME_DOMAIN} { | ||
| 23 | 	reverse_proxy "clover-source-of-truth:80" | ||
| 24 | } | ||
| 25 | nas.{$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 | } | ||
| 40 | git.{$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 | } | ||
| 46 | music.{$HOME_DOMAIN} { | ||
| 47 | 	reverse_proxy "navidrome:4533" | ||
| 48 | } | ||
| 49 | qbt.{$HOME_DOMAIN} { | ||
| 50 | 	import auth | ||
| 51 | 	reverse_proxy "qbittorrent:23938" | ||
| 52 | } | ||
| 53 | snr.{$HOME_DOMAIN} { | ||
| 54 | 	import auth | ||
| 55 | 	reverse_proxy "sonarr:8989" { | ||
| 56 | 		header_up Authorization "Basic dXNlcm5hbWU6cGFzc3dvcmQ=" | ||
| 57 | 	} | ||
| 58 | } | ||
| 59 | rdr.{$HOME_DOMAIN} { | ||
| 60 | 	import auth | ||
| 61 | 	reverse_proxy "radarr:7878" { | ||
| 62 | 		header_up Authorization "Basic dXNlcm5hbWU6cGFzc3dvcmQ=" | ||
| 63 | 	} | ||
| 64 | } | ||
| 65 | jkt.{$HOME_DOMAIN} { | ||
| 66 | 	import auth | ||
| 67 | 	reverse_proxy "jackett:9117" { | ||
| 68 | 		header_up Authorization "Basic dXNlcm5hbWU6cGFzc3dvcmQ=" | ||
| 69 | 	} | ||
| 70 | } | ||
| 71 | speedtest.{$HOME_DOMAIN} { | ||
| 72 | 	reverse_proxy "openspeedtest:3000" | ||
| 73 | } | ||
| 74 | opencode.{$HOME_DOMAIN} { | ||
| 75 | 	import auth | ||
| 76 | 	reverse_proxy "opencode:3923" | ||
| 77 | } | ||
| 78 | pg.{$HOME_DOMAIN} { | ||
| 79 | 	import auth | ||
| 80 | 	reverse_proxy "pgadmin:80" | ||
| 81 | } | ||
| 82 | redis.{$HOME_DOMAIN} { | ||
| 83 | 	import auth | ||
| 84 | 	reverse_proxy "redis-insight:5540" | ||
| 85 | } | ||
| 86 | sync.{$HOME_DOMAIN} { | ||
| 87 | 	import auth | ||
| 88 | 	reverse_proxy "syncthing:8384" | ||
| 89 | } | ||
| 90 | |||
| 91 | # redirections | ||
| 92 | paperclover.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 @@ | ||
| 1 | storage: | ||
| 2 | postgres: | ||
| 3 | address: "tcp://postgres:5432" | ||
| 4 | database: "authelia" | ||
| 5 | schema: "public" | ||
| 6 | username: "authelia" | ||
| 7 | timeout: "5s" | ||
| 8 | authentication_backend: | ||
| 9 | refresh_interval: "5m" | ||
| 10 | file: | ||
| 11 | watch: true | ||
| 12 | path: "/config/users.yaml" | ||
| 13 | search: | ||
| 14 | email: true | ||
| 15 | case_insensitive: true | ||
| 16 | totp: | ||
| 17 | issuer: "local.test" | ||
| 18 | session: | ||
| 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" | ||
| 28 | notifier: | ||
| 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}" | ||
| 38 | access_control: | ||
| 39 | default_policy: one_factor | ||
| 40 | rules: | ||
| 41 | - domain: "nas.local.test" | ||
| 42 | policy: bypass # optional | ||
| 43 | regulation: | ||
| 44 | max_retries: 10 | ||
| 45 | find_time: "2 minutes" | ||
| 46 | ban_time: "5 minutes" | ||
config/authelia/users.yaml created+11| ... | @@ -0,0 +1,11 @@ | ||
| 1 | users: | ||
| 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 @@ | ||
| 1 | The fonts in this directory MUST be purchased to use: | ||
| 2 | https://www.arrowtype.com/name-sans | ||
| 3 | https://www.arrowtype.com/name-mono | ||
| 4 | |||
| 5 | The full license from ArrowType: https://www.arrowtype.com/licensing/commercial | ||
| 6 | |||
| 7 | This license specifically grants me, Clover M Caruso, the right to embed these | ||
| 8 | webfonts on domains I control. | ||
| 9 | |||
| 10 | > The webfonts may only be installed on website domains that are under your | ||
| 11 | > direct control. | ||
| 12 | |||
| 13 | Since 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 @@ | ||
| 1 | APP_NAME="clover's git" | ||
| 2 | APP_SLOGAL=and then we knew, just like paper airplanes: that we could fly... | ||
| 3 | RUN_MODE=prod | ||
| 4 | RUN_USER=git | ||
| 5 | WORK_PATH=/data/work | ||
| 6 | |||
| 7 | [repository] | ||
| 8 | MAX_CREATION_LIMIT=0 | ||
| 9 | ROOT=/data/git/repositories | ||
| 10 | DEFAULT_CLOSE_ISSUES_VIA_COMMITS_IN_ANY_BRANCH=true | ||
| 11 | DEFAULT_REPO_UNITS=repo.code,repo.issues,repo.pulls | ||
| 12 | DISABLE_STARS=true | ||
| 13 | DEFAULT_BRANCH=master | ||
| 14 | |||
| 15 | [repository.local] | ||
| 16 | LOCAL_COPY_PATH=/data/work/tmp/local-repo | ||
| 17 | |||
| 18 | [repository.upload] | ||
| 19 | TEMP_PATH=/data/work/uploads | ||
| 20 | |||
| 21 | [ui] | ||
| 22 | EXPLORE_PAGING_NUM=100 | ||
| 23 | ISSUE_PAGING_NUM=500 | ||
| 24 | MEMBERS_PAGING_NUM=100 | ||
| 25 | THEMES=clover | ||
| 26 | DEFAULT_THEME=clover | ||
| 27 | |||
| 28 | [server] | ||
| 29 | APP_DATA_PATH=/data/work | ||
| 30 | DOMAIN=git.paperclover.net | ||
| 31 | SSH_DOMAIN=git.paperclover.net | ||
| 32 | HTTP_PORT=3000 | ||
| 33 | ROOT_URL=https://git.paperclover.net/ | ||
| 34 | DISABLE_SSH=false | ||
| 35 | SSH_PORT=22 | ||
| 36 | SSH_LISTEN_PORT=22 | ||
| 37 | LFS_START_SERVER=true | ||
| 38 | OFFLINE_MODE=true | ||
| 39 | LANDING_PAGE=/explore/repos | ||
| 40 | |||
| 41 | [database] | ||
| 42 | PATH=/data/work/gitea.db | ||
| 43 | DB_TYPE=sqlite3 | ||
| 44 | HOST=localhost:3306 | ||
| 45 | NAME=gitea | ||
| 46 | USER=root | ||
| 47 | PASSWD= | ||
| 48 | LOG_SQL=false | ||
| 49 | SCHEMA= | ||
| 50 | SSL_MODE=disable | ||
| 51 | |||
| 52 | [indexer] | ||
| 53 | ISSUE_INDEXER_PATH=/data/work/indexers/issues.bleve | ||
| 54 | |||
| 55 | [session] | ||
| 56 | PROVIDER_CONFIG=/data/work/sessions | ||
| 57 | PROVIDER=file | ||
| 58 | |||
| 59 | [picture] | ||
| 60 | AVATAR_UPLOAD_PATH=/data/work/avatars | ||
| 61 | REPOSITORY_AVATAR_UPLOAD_PATH=/data/work/repo-avatars | ||
| 62 | |||
| 63 | [admin] | ||
| 64 | DISABLE_REGULAR_ORG_CREATION=true | ||
| 65 | |||
| 66 | [attachment] | ||
| 67 | PATH=/data/work/attachments | ||
| 68 | |||
| 69 | [log] | ||
| 70 | MODE=console | ||
| 71 | LEVEL=info | ||
| 72 | ROOT_PATH=/data/work/log | ||
| 73 | |||
| 74 | [security] | ||
| 75 | INSTALL_LOCK=true | ||
| 76 | REVERSE_PROXY_LIMIT=1 | ||
| 77 | REVERSE_PROXY_TRUSTED_PROXIES=* | ||
| 78 | PASSWORD_HASH_ALGO=pbkdf2_hi | ||
| 79 | |||
| 80 | [service] | ||
| 81 | DISABLE_REGISTRATION=false | ||
| 82 | REQUIRE_SIGNIN_VIEW=false | ||
| 83 | REGISTER_EMAIL_CONFIRM=true | ||
| 84 | ENABLE_NOTIFY_MAIL=true | ||
| 85 | ALLOW_ONLY_EXTERNAL_REGISTRATION=false | ||
| 86 | DEFAULT_KEEP_EMAIL_PRIVATE=false | ||
| 87 | DEFAULT_ALLOW_CREATE_ORGANIZATION=true | ||
| 88 | DEFAULT_ENABLE_TIMETRACKING=true | ||
| 89 | NO_REPLY_ADDRESS=noreply.localhost | ||
| 90 | |||
| 91 | [lfs] | ||
| 92 | PATH = /data/git/lfs | ||
| 93 | |||
| 94 | [mailer] | ||
| 95 | ENABLED = true | ||
| 96 | FROM=noreply.git@paperclover.net | ||
| 97 | PROTOCOL=smtps | ||
| 98 | SMTP_PORT=587 | ||
| 99 | IS_TLS_ENABLED=true | ||
| 100 | |||
| 101 | [repository.pull-request] | ||
| 102 | DEFAULT_MERGE_STYLE=squash | ||
| 103 | |||
| 104 | [repository.signing] | ||
| 105 | DEFAULT_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/.gitignoreconfig/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 @@ | ||
| 1 | jelly.{$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/.gitignoreconfig/opencode/Dockerfile created+57| ... | @@ -0,0 +1,57 @@ | ||
| 1 | FROM fedora:latest | ||
| 2 | |||
| 3 | # system utilities | ||
| 4 | RUN 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 | ||
| 18 | RUN 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 | ||
| 22 | RUN groupadd -g 3000 agent && \ | ||
| 23 | useradd -u 3000 -g 3000 -m -s /bin/zsh agent | ||
| 24 | USER agent | ||
| 25 | ENV HOME=/home/agent | ||
| 26 | WORKDIR /home/agent | ||
| 27 | |||
| 28 | # nvm | ||
| 29 | ENV NODE_VERSION=24 | ||
| 30 | RUN 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 | |||
| 36 | ENV EDITOR=nvim | ||
| 37 | RUN echo "TERM=xterm-256color" > $HOME/.zshrc | ||
| 38 | |||
| 39 | # curl installations | ||
| 40 | RUN curl -fsSL https://deno.land/install.sh | sh | ||
| 41 | RUN curl -fsSL https://dprint.dev/install.sh | sh | ||
| 42 | RUN curl -fsSL https://opencode.ai/install | bash | ||
| 43 | |||
| 44 | # cargo binstall | ||
| 45 | RUN curl -L --proto '=https' --tlsv1.2 -sSf https://raw.githubusercontent.com/cargo-bins/cargo-binstall/main/install-from-binstall-release.sh | bash | ||
| 46 | RUN cargo binstall --strategies crate-meta-data jj-cli -y | ||
| 47 | |||
| 48 | ENV PATH="$PATH:$HOME/.nvm-current/bin:\ | ||
| 49 | $HOME/.opencode/bin:\ | ||
| 50 | $HOME/.deno/bin:\ | ||
| 51 | $HOME/.dprint/bin:\ | ||
| 52 | $HOME/.cargo/bin" | ||
| 53 | |||
| 54 | ENV SHELL=/bin/zsh | ||
| 55 | WORKDIR /code | ||
| 56 | EXPOSE 4096 | ||
| 57 | CMD ["opencode", "serve", "--hostname", "0.0.0.0"] | ||
config/openvpn/ca.rsa.2048.crt created+33| ... | @@ -0,0 +1,33 @@ | ||
| 1 | -----BEGIN CERTIFICATE----- | ||
| 2 | MIIFqzCCBJOgAwIBAgIJAKZ7D5Yv87qDMA0GCSqGSIb3DQEBDQUAMIHoMQswCQYD | ||
| 3 | VQQGEwJVUzELMAkGA1UECBMCQ0ExEzARBgNVBAcTCkxvc0FuZ2VsZXMxIDAeBgNV | ||
| 4 | BAoTF1ByaXZhdGUgSW50ZXJuZXQgQWNjZXNzMSAwHgYDVQQLExdQcml2YXRlIElu | ||
| 5 | dGVybmV0IEFjY2VzczEgMB4GA1UEAxMXUHJpdmF0ZSBJbnRlcm5ldCBBY2Nlc3Mx | ||
| 6 | IDAeBgNVBCkTF1ByaXZhdGUgSW50ZXJuZXQgQWNjZXNzMS8wLQYJKoZIhvcNAQkB | ||
| 7 | FiBzZWN1cmVAcHJpdmF0ZWludGVybmV0YWNjZXNzLmNvbTAeFw0xNDA0MTcxNzM1 | ||
| 8 | MThaFw0zNDA0MTIxNzM1MThaMIHoMQswCQYDVQQGEwJVUzELMAkGA1UECBMCQ0Ex | ||
| 9 | EzARBgNVBAcTCkxvc0FuZ2VsZXMxIDAeBgNVBAoTF1ByaXZhdGUgSW50ZXJuZXQg | ||
| 10 | QWNjZXNzMSAwHgYDVQQLExdQcml2YXRlIEludGVybmV0IEFjY2VzczEgMB4GA1UE | ||
| 11 | AxMXUHJpdmF0ZSBJbnRlcm5ldCBBY2Nlc3MxIDAeBgNVBCkTF1ByaXZhdGUgSW50 | ||
| 12 | ZXJuZXQgQWNjZXNzMS8wLQYJKoZIhvcNAQkBFiBzZWN1cmVAcHJpdmF0ZWludGVy | ||
| 13 | bmV0YWNjZXNzLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAPXD | ||
| 14 | L1L9tX6DGf36liA7UBTy5I869z0UVo3lImfOs/GSiFKPtInlesP65577nd7UNzzX | ||
| 15 | lH/P/CnFPdBWlLp5ze3HRBCc/Avgr5CdMRkEsySL5GHBZsx6w2cayQ2EcRhVTwWp | ||
| 16 | cdldeNO+pPr9rIgPrtXqT4SWViTQRBeGM8CDxAyTopTsobjSiYZCF9Ta1gunl0G/ | ||
| 17 | 8Vfp+SXfYCC+ZzWvP+L1pFhPRqzQQ8k+wMZIovObK1s+nlwPaLyayzw9a8sUnvWB | ||
| 18 | /5rGPdIYnQWPgoNlLN9HpSmsAcw2z8DXI9pIxbr74cb3/HSfuYGOLkRqrOk6h4RC | ||
| 19 | OfuWoTrZup1uEOn+fw8CAwEAAaOCAVQwggFQMB0GA1UdDgQWBBQv63nQ/pJAt5tL | ||
| 20 | y8VJcbHe22ZOsjCCAR8GA1UdIwSCARYwggESgBQv63nQ/pJAt5tLy8VJcbHe22ZO | ||
| 21 | sqGB7qSB6zCB6DELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAkNBMRMwEQYDVQQHEwpM | ||
| 22 | b3NBbmdlbGVzMSAwHgYDVQQKExdQcml2YXRlIEludGVybmV0IEFjY2VzczEgMB4G | ||
| 23 | A1UECxMXUHJpdmF0ZSBJbnRlcm5ldCBBY2Nlc3MxIDAeBgNVBAMTF1ByaXZhdGUg | ||
| 24 | SW50ZXJuZXQgQWNjZXNzMSAwHgYDVQQpExdQcml2YXRlIEludGVybmV0IEFjY2Vz | ||
| 25 | czEvMC0GCSqGSIb3DQEJARYgc2VjdXJlQHByaXZhdGVpbnRlcm5ldGFjY2Vzcy5j | ||
| 26 | b22CCQCmew+WL/O6gzAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBDQUAA4IBAQAn | ||
| 27 | a5PgrtxfwTumD4+3/SYvwoD66cB8IcK//h1mCzAduU8KgUXocLx7QgJWo9lnZ8xU | ||
| 28 | ryXvWab2usg4fqk7FPi00bED4f4qVQFVfGfPZIH9QQ7/48bPM9RyfzImZWUCenK3 | ||
| 29 | 7pdw4Bvgoys2rHLHbGen7f28knT2j/cbMxd78tQc20TIObGjo8+ISTRclSTRBtyC | ||
| 30 | GohseKYpTS9himFERpUgNtefvYHbn70mIOzfOJFTVqfrptf9jXa9N8Mpy3ayfodz | ||
| 31 | 1wiqdteqFXkTYoSDctgKMiZ6GdocK9nMroQipIQtpnwd4yBDWIyC6Bvlkrq5TQUt | ||
| 32 | YDQ8z9v+DMO6iwyIDRiU | ||
| 33 | -----END CERTIFICATE----- | ||
config/openvpn/crl.rsa.2048.pem created+15| ... | @@ -0,0 +1,15 @@ | ||
| 1 | -----BEGIN X509 CRL----- | ||
| 2 | MIICWDCCAUAwDQYJKoZIhvcNAQENBQAwgegxCzAJBgNVBAYTAlVTMQswCQYDVQQI | ||
| 3 | EwJDQTETMBEGA1UEBxMKTG9zQW5nZWxlczEgMB4GA1UEChMXUHJpdmF0ZSBJbnRl | ||
| 4 | cm5ldCBBY2Nlc3MxIDAeBgNVBAsTF1ByaXZhdGUgSW50ZXJuZXQgQWNjZXNzMSAw | ||
| 5 | HgYDVQQDExdQcml2YXRlIEludGVybmV0IEFjY2VzczEgMB4GA1UEKRMXUHJpdmF0 | ||
| 6 | ZSBJbnRlcm5ldCBBY2Nlc3MxLzAtBgkqhkiG9w0BCQEWIHNlY3VyZUBwcml2YXRl | ||
| 7 | aW50ZXJuZXRhY2Nlc3MuY29tFw0xNjA3MDgxOTAwNDZaFw0zNjA3MDMxOTAwNDZa | ||
| 8 | MCYwEQIBARcMMTYwNzA4MTkwMDQ2MBECAQYXDDE2MDcwODE5MDA0NjANBgkqhkiG | ||
| 9 | 9w0BAQ0FAAOCAQEAQZo9X97ci8EcPYu/uK2HB152OZbeZCINmYyluLDOdcSvg6B5 | ||
| 10 | jI+ffKN3laDvczsG6CxmY3jNyc79XVpEYUnq4rT3FfveW1+Ralf+Vf38HdpwB8EW | ||
| 11 | B4hZlQ205+21CALLvZvR8HcPxC9KEnev1mU46wkTiov0EKc+EdRxkj5yMgv0V2Re | ||
| 12 | ze7AP+NQ9ykvDScH4eYCsmufNpIjBLhpLE2cuZZXBLcPhuRzVoU3l7A9lvzG9mjA | ||
| 13 | 5YijHJGHNjlWFqyrn1CfYS6koa4TGEPngBoAziWRbDGdhEgJABHrpoaFYaL61zqy | ||
| 14 | MR6jC0K2ps9qyZAN74LEBedEfK7tBOzWMwr58A== | ||
| 15 | -----END X509 CRL----- | ||
config/openvpn/profile.ovpn created+53| ... | @@ -0,0 +1,53 @@ | ||
| 1 | client | ||
| 2 | dev tun | ||
| 3 | proto udp | ||
| 4 | remote us-siliconvalley.privacy.network 1198 | ||
| 5 | resolv-retry infinite | ||
| 6 | nobind | ||
| 7 | persist-key | ||
| 8 | cipher aes-128-cbc | ||
| 9 | auth sha1 | ||
| 10 | tls-client | ||
| 11 | remote-cert-tls server | ||
| 12 | |||
| 13 | auth-user-pass /run/secrets/openvpn-credentials | ||
| 14 | comp-lzo no | ||
| 15 | verb 1 | ||
| 16 | |||
| 17 | <ca> | ||
| 18 | -----BEGIN CERTIFICATE----- | ||
| 19 | MIIFqzCCBJOgAwIBAgIJAKZ7D5Yv87qDMA0GCSqGSIb3DQEBDQUAMIHoMQswCQYD | ||
| 20 | VQQGEwJVUzELMAkGA1UECBMCQ0ExEzARBgNVBAcTCkxvc0FuZ2VsZXMxIDAeBgNV | ||
| 21 | BAoTF1ByaXZhdGUgSW50ZXJuZXQgQWNjZXNzMSAwHgYDVQQLExdQcml2YXRlIElu | ||
| 22 | dGVybmV0IEFjY2VzczEgMB4GA1UEAxMXUHJpdmF0ZSBJbnRlcm5ldCBBY2Nlc3Mx | ||
| 23 | IDAeBgNVBCkTF1ByaXZhdGUgSW50ZXJuZXQgQWNjZXNzMS8wLQYJKoZIhvcNAQkB | ||
| 24 | FiBzZWN1cmVAcHJpdmF0ZWludGVybmV0YWNjZXNzLmNvbTAeFw0xNDA0MTcxNzM1 | ||
| 25 | MThaFw0zNDA0MTIxNzM1MThaMIHoMQswCQYDVQQGEwJVUzELMAkGA1UECBMCQ0Ex | ||
| 26 | EzARBgNVBAcTCkxvc0FuZ2VsZXMxIDAeBgNVBAoTF1ByaXZhdGUgSW50ZXJuZXQg | ||
| 27 | QWNjZXNzMSAwHgYDVQQLExdQcml2YXRlIEludGVybmV0IEFjY2VzczEgMB4GA1UE | ||
| 28 | AxMXUHJpdmF0ZSBJbnRlcm5ldCBBY2Nlc3MxIDAeBgNVBCkTF1ByaXZhdGUgSW50 | ||
| 29 | ZXJuZXQgQWNjZXNzMS8wLQYJKoZIhvcNAQkBFiBzZWN1cmVAcHJpdmF0ZWludGVy | ||
| 30 | bmV0YWNjZXNzLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAPXD | ||
| 31 | L1L9tX6DGf36liA7UBTy5I869z0UVo3lImfOs/GSiFKPtInlesP65577nd7UNzzX | ||
| 32 | lH/P/CnFPdBWlLp5ze3HRBCc/Avgr5CdMRkEsySL5GHBZsx6w2cayQ2EcRhVTwWp | ||
| 33 | cdldeNO+pPr9rIgPrtXqT4SWViTQRBeGM8CDxAyTopTsobjSiYZCF9Ta1gunl0G/ | ||
| 34 | 8Vfp+SXfYCC+ZzWvP+L1pFhPRqzQQ8k+wMZIovObK1s+nlwPaLyayzw9a8sUnvWB | ||
| 35 | /5rGPdIYnQWPgoNlLN9HpSmsAcw2z8DXI9pIxbr74cb3/HSfuYGOLkRqrOk6h4RC | ||
| 36 | OfuWoTrZup1uEOn+fw8CAwEAAaOCAVQwggFQMB0GA1UdDgQWBBQv63nQ/pJAt5tL | ||
| 37 | y8VJcbHe22ZOsjCCAR8GA1UdIwSCARYwggESgBQv63nQ/pJAt5tLy8VJcbHe22ZO | ||
| 38 | sqGB7qSB6zCB6DELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAkNBMRMwEQYDVQQHEwpM | ||
| 39 | b3NBbmdlbGVzMSAwHgYDVQQKExdQcml2YXRlIEludGVybmV0IEFjY2VzczEgMB4G | ||
| 40 | A1UECxMXUHJpdmF0ZSBJbnRlcm5ldCBBY2Nlc3MxIDAeBgNVBAMTF1ByaXZhdGUg | ||
| 41 | SW50ZXJuZXQgQWNjZXNzMSAwHgYDVQQpExdQcml2YXRlIEludGVybmV0IEFjY2Vz | ||
| 42 | czEvMC0GCSqGSIb3DQEJARYgc2VjdXJlQHByaXZhdGVpbnRlcm5ldGFjY2Vzcy5j | ||
| 43 | b22CCQCmew+WL/O6gzAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBDQUAA4IBAQAn | ||
| 44 | a5PgrtxfwTumD4+3/SYvwoD66cB8IcK//h1mCzAduU8KgUXocLx7QgJWo9lnZ8xU | ||
| 45 | ryXvWab2usg4fqk7FPi00bED4f4qVQFVfGfPZIH9QQ7/48bPM9RyfzImZWUCenK3 | ||
| 46 | 7pdw4Bvgoys2rHLHbGen7f28knT2j/cbMxd78tQc20TIObGjo8+ISTRclSTRBtyC | ||
| 47 | GohseKYpTS9himFERpUgNtefvYHbn70mIOzfOJFTVqfrptf9jXa9N8Mpy3ayfodz | ||
| 48 | 1wiqdteqFXkTYoSDctgKMiZ6GdocK9nMroQipIQtpnwd4yBDWIyC6Bvlkrq5TQUt | ||
| 49 | YDQ8z9v+DMO6iwyIDRiU | ||
| 50 | -----END CERTIFICATE----- | ||
| 51 | </ca> | ||
| 52 | |||
| 53 | disable-occ | ||
config/postgres/Dockerfile created+19| ... | @@ -0,0 +1,19 @@ | ||
| 1 | FROM postgres:17 | ||
| 2 | |||
| 3 | ARG USER_ID | ||
| 4 | ARG GROUP_ID | ||
| 5 | |||
| 6 | RUN groupmod -g $GROUP_ID postgres || true | ||
| 7 | RUN usermod -u $USER_ID -g $GROUP_ID postgres | ||
| 8 | |||
| 9 | ENV POSTGIS_MAJOR 3 | ||
| 10 | RUN 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 | |||
| 17 | COPY ./init.sh /usr/local/bin/clover-postgres-init.sh | ||
| 18 | |||
| 19 | ENTRYPOINT ["/usr/local/bin/clover-postgres-init.sh"] | ||
config/postgres/init.sh created+40| ... | @@ -0,0 +1,40 @@ | ||
| 1 | #!/bin/sh | ||
| 2 | set -e | ||
| 3 | docker-entrypoint.sh postgres & | ||
| 4 | PG_PID=$! | ||
| 5 | printf "Waiting for database\n" | ||
| 6 | until pg_isready -U postgres; do | ||
| 7 | sleep 1 | ||
| 8 | done | ||
| 9 | |||
| 10 | ensure_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 | ||
| 29 | SQL | ||
| 30 | } | ||
| 31 | |||
| 32 | ensure_db_user "clover" "$POSTGRES_PASSWORD" | ||
| 33 | ensure_db_user "authelia" "$POSTGRES_PASSWORD_AUTHELIA" | ||
| 34 | ensure_db_user "dawarich" "$POSTGRES_PASSWORD_DAWARICH" | ||
| 35 | ensure_db_user "forgejo" "$POSTGRES_PASSWORD_FORGEJO" | ||
| 36 | ensure_db_user "jellyfin" "$POSTGRES_PASSWORD_JELLYFIN" | ||
| 37 | |||
| 38 | printf "Everything is ready!" | ||
| 39 | |||
| 40 | wait $PG_PID | ||
local-dns.sh created+16| ... | @@ -0,0 +1,16 @@ | ||
| 1 | #!/bin/sh | ||
| 2 | /opt/homebrew/bin/brew install dnsmasq | ||
| 3 | echo "address=/.local.test/127.0.0.1" >"$(/opt/homebrew/bin/brew --prefix)/etc/dnsmasq.conf" | ||
| 4 | echo "port=53" >>"$(/opt/homebrew/bin/brew --prefix)/etc/dnsmasq.conf" | ||
| 5 | sudo /opt/homebrew/bin/brew services restart dnsmasq | ||
| 6 | sudo mkdir -p /etc/resolver | ||
| 7 | echo "nameserver 127.0.0.1" | sudo tee /etc/resolver/local.test | ||
| 8 | |||
| 9 | docker compose up -d caddy | ||
| 10 | |||
| 11 | while ! [ -f .apps/caddy/pki/authorities/local/root.crt ]; do | ||
| 12 | echo waiting for certificate | ||
| 13 | sleep 1 | ||
| 14 | done | ||
| 15 | |||
| 16 | sudo 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 | |||
| 3 | this codebase is used for all docker services on my home nas, including personal | ||
| 4 | customization. | ||
| 5 | |||
| 6 | ## usage | ||
| 7 | |||
| 8 | ``` | ||
| 9 | git clone https://git.paperclover.net/clo/home-infra.git | ||
| 10 | cd home-infra | ||
| 11 | |||
| 12 | # setup repo | ||
| 13 | rm config/font/* | ||
| 14 | git clone https://git.paperclover.net/clo/sitegen.git | ||
| 15 | cp .env.example .env | ||
| 16 | |||
| 17 | # fill secrets | ||
| 18 | vi .env | ||
| 19 | vi secrets/authelia-encryption-key.txt | ||
| 20 | vi secrets/authelia-session-secret.txt | ||
| 21 | vi secrets/authelia-jwt-secret.txt | ||
| 22 | vi secrets/openvpn-credentials.txt | ||
| 23 | |||
| 24 | docker compose up -d | ||
| 25 | ``` | ||
| 26 | |||
| 27 | ## license | ||
| 28 | |||
| 29 | this repository is for example usage only. you may not re-host it in full, | ||
| 30 | privately or publicly, but you may learn from my usage. please note that some | ||
| 31 | components here are under licenses which do not permit redistribution. | ||
secrets/.gitignore created+1| ... | @@ -0,0 +1 @@ | ||
| 1 | *.txt | ||