| author | |
| committer | |
| log | dd75657461727cf1146fb33cb1d6f0649c09e9b9 |
| tree | 5215c462c216a452527df7d84a9a62ae705a9655 |
| parent | 914005dab4ce28f6ba6f52c236f3c621549630ce |
| signature |
10 files changed, 352 insertions(+), 175 deletions(-)
.env.example+1| ... | @@ -8,6 +8,7 @@ APP_ROOT=./.apps | ... | @@ -8,6 +8,7 @@ APP_ROOT=./.apps |
| 8 | STORE_ROOT=/Volumes | 8 | STORE_ROOT=/Volumes |
| 9 | CLOVER_ROOT=/Volumes/clover | 9 | CLOVER_ROOT=/Volumes/clover |
| 10 | MEDIA_ROOT=/Volumes/media | 10 | MEDIA_ROOT=/Volumes/media |
| 11 | TORRENT_TEMP= | ||
| 11 | 12 | ||
| 12 | MAILER_ADDRESS=smtp.example.com | 13 | MAILER_ADDRESS=smtp.example.com |
| 13 | MAILER_USERNAME=me@paperclover.net | 14 | MAILER_USERNAME=me@paperclover.net |
compose.yaml+26-15| ... | @@ -98,7 +98,7 @@ services: | ... | @@ -98,7 +98,7 @@ services: |
| 98 | keycloak: | 98 | keycloak: |
| 99 | condition: service_healthy | 99 | condition: service_healthy |
| 100 | volumes: | 100 | volumes: |
| 101 | - "${APP_ROOT}/keycloak/forward-auth:/shared/forward-auth:ro" | 101 | - "${APP_ROOT}/keycloak:/shared:ro" |
| 102 | # file manager | 102 | # file manager |
| 103 | copyparty: # port 80 | 103 | copyparty: # port 80 |
| 104 | image: copyparty/ac | 104 | image: copyparty/ac |
| ... | @@ -146,37 +146,46 @@ services: | ... | @@ -146,37 +146,46 @@ services: |
| 146 | # git hosting | 146 | # git hosting |
| 147 | forgejo: # port 3000 | 147 | forgejo: # port 3000 |
| 148 | container_name: forgejo | 148 | container_name: forgejo |
| 149 | image: code.forgejo.org/forgejo/forgejo:13 | ||
| 150 | entrypoint: ["/bin/sh", "/custom/init/entry.sh"] | ||
| 151 | ports: | ||
| 152 | - 22:22 | ||
| 153 | - 40244:3000 # port used for forgejo-runner | ||
| 149 | environment: | 154 | environment: |
| 150 | USER_UID: "$USER_ID" | 155 | USER_UID: "$USER_ID" |
| 151 | USER_GID: "$GROUP_ID" | 156 | USER_GID: "$GROUP_ID" |
| 157 | HOME_DOMAIN: "${HOME_DOMAIN}" | ||
| 152 | FORGEJO_CUSTOM: "/custom" | 158 | FORGEJO_CUSTOM: "/custom" |
| 153 | FORGEJO__MAILER__SMTP_ADDR: "${MAILER_ADDRESS}" | 159 | MAILER_ADDRESS: "${MAILER_ADDRESS}" |
| 154 | FORGEJO__MAILER__USER: "${MAILER_USERNAME}" | 160 | MAILER_USERNAME: "${MAILER_USERNAME}" |
| 155 | FORGEJO__MAILER__PASSWD: "${MAILER_PASSWORD}" | 161 | MAILER_PASSWORD: "${MAILER_PASSWORD}" |
| 156 | FORGEJO__SERVER__LFS_JWT_SECRET: "${FORGEJO_SERVER_LFS_JWT_SECRET}" | 162 | FORGEJO_SERVER_LFS_JWT_SECRET: "${FORGEJO_SERVER_LFS_JWT_SECRET}" |
| 157 | FORGEJO__OAUTH2__JWT_SECRET: "${FORGEJO_OAUTH2_JWT_SECRET}" | 163 | FORGEJO_OAUTH2_JWT_SECRET: "${FORGEJO_OAUTH2_JWT_SECRET}" |
| 158 | FORGEJO__SECURITY__SECRET_KEY: "${FORGEJO_SECURITY_SECRET_KEY}" | 164 | FORGEJO_SECURITY_SECRET_KEY: "${FORGEJO_SECURITY_SECRET_KEY}" |
| 159 | FORGEJO__SECURITY__INTERNAL_TOKEN: "${FORGEJO_SECURITY_INTERNAL_TOKEN}" | 165 | FORGEJO_SECURITY_INTERNAL_TOKEN: "${FORGEJO_SECURITY_INTERNAL_TOKEN}" |
| 160 | image: code.forgejo.org/forgejo/forgejo:13 | ||
| 161 | ports: | ||
| 162 | - 22:22 | ||
| 163 | - 40244:3000 | ||
| 164 | restart: unless-stopped | 166 | restart: unless-stopped |
| 165 | volumes: | 167 | volumes: |
| 168 | - "${APP_ROOT}/keycloak:/shared-keys:ro" | ||
| 166 | - "${APP_ROOT}/forgejo:/data:rw" | 169 | - "${APP_ROOT}/forgejo:/data:rw" |
| 167 | - "/etc/timezone:/etc/timezone:ro" | 170 | - "/etc/timezone:/etc/timezone:ro" |
| 168 | - "/etc/localtime:/etc/localtime:ro" | 171 | - "/etc/localtime:/etc/localtime:ro" |
| 169 | - ./config/forgejo:/custom:ro | 172 | - ./config/forgejo/public:/custom/public:ro |
| 173 | - ./config/forgejo/templates:/custom/templates:ro | ||
| 170 | - ./config/font:/custom/public/assets/font:ro | 174 | - ./config/font:/custom/public/assets/font:ro |
| 175 | - ./config/forgejo/init:/custom/init:ro | ||
| 171 | labels: | 176 | labels: |
| 172 | net.paperclover.list.name: Clover Git Forge | 177 | net.paperclover.list.name: Clover Git Forge |
| 173 | net.paperclover.list.domain: git | 178 | net.paperclover.list.domain: git |
| 174 | net.paperclover.list.priority: 105 | 179 | net.paperclover.list.priority: 105 |
| 175 | depends_on: | 180 | depends_on: |
| 181 | postgres: | ||
| 182 | condition: service_healthy | ||
| 183 | redis: | ||
| 184 | condition: service_healthy | ||
| 176 | keycloak: | 185 | keycloak: |
| 177 | condition: service_healthy | 186 | condition: service_healthy |
| 178 | # forgejo-anubis: | 187 | forgejo-anubis: |
| 179 | # condition: service_healthy | 188 | condition: service_started |
| 180 | forgejo-anubis: | 189 | forgejo-anubis: |
| 181 | container_name: forgejo-anubis | 190 | container_name: forgejo-anubis |
| 182 | image: ghcr.io/techarohq/anubis:latest | 191 | image: ghcr.io/techarohq/anubis:latest |
| ... | @@ -385,6 +394,8 @@ services: | ... | @@ -385,6 +394,8 @@ services: |
| 385 | timeout: 5s | 394 | timeout: 5s |
| 386 | retries: 5 | 395 | retries: 5 |
| 387 | start_period: 10s | 396 | start_period: 10s |
| 397 | ports: | ||
| 398 | - 5432:5432 | ||
| 388 | pgadmin: # port 80 | 399 | pgadmin: # port 80 |
| 389 | container_name: pgadmin | 400 | container_name: pgadmin |
| 390 | entrypoint: ["/bin/sh", "/init/pgadmin-init.sh"] | 401 | entrypoint: ["/bin/sh", "/init/pgadmin-init.sh"] |
config/Caddyfile+3| ... | @@ -68,6 +68,9 @@ db.{$HOME_DOMAIN} { | ... | @@ -68,6 +68,9 @@ db.{$HOME_DOMAIN} { |
| 68 | 	reverse_proxy "http://clover-source-of-truth" | 68 | 	reverse_proxy "http://clover-source-of-truth" |
| 69 | } | 69 | } |
| 70 | git.{$HOME_DOMAIN} { | 70 | git.{$HOME_DOMAIN} { |
| 71 | handle /user/login { | ||
| 72 | rewrite /user/oauth2/snow | ||
| 73 | } | ||
| 71 | 	reverse_proxy "http://forgejo-anubis" { | 74 | 	reverse_proxy "http://forgejo-anubis" { |
| 72 | 		header_up X-Real-Ip {remote_host} | 75 | 		header_up X-Real-Ip {remote_host} |
| 73 | 		header_up X-Http-Version {http.request.proto} | 76 | 		header_up X-Http-Version {http.request.proto} |
config/forgejo/conf/app.ini deleted-105| ... | @@ -1,105 +0,0 @@ | ||
| 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/init/app.ini created+121| ... | @@ -0,0 +1,121 @@ | ||
| 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 | DISABLE_FORKS=true | ||
| 14 | DEFAULT_BRANCH=master | ||
| 15 | |||
| 16 | [repository.local] | ||
| 17 | LOCAL_COPY_PATH=/data/work/tmp/local-repo | ||
| 18 | |||
| 19 | [repository.upload] | ||
| 20 | TEMP_PATH=/data/work/uploads | ||
| 21 | |||
| 22 | [ui] | ||
| 23 | EXPLORE_PAGING_NUM=100 | ||
| 24 | ISSUE_PAGING_NUM=500 | ||
| 25 | MEMBERS_PAGING_NUM=100 | ||
| 26 | THEMES=clover | ||
| 27 | DEFAULT_THEME=clover | ||
| 28 | |||
| 29 | [server] | ||
| 30 | APP_DATA_PATH=/data/work | ||
| 31 | DOMAIN=git.$HOME_DOMAIN | ||
| 32 | SSH_DOMAIN=git.$HOME_DOMAIN | ||
| 33 | HTTP_PORT=3000 | ||
| 34 | ROOT_URL=https://git.$HOME_DOMAIN/ | ||
| 35 | DISABLE_SSH=false | ||
| 36 | SSH_PORT=22 | ||
| 37 | SSH_LISTEN_PORT=22 | ||
| 38 | LFS_JWT_SECRET=$FORGEJO_SERVER_LFS_JWT_SECRET | ||
| 39 | LFS_START_SERVER=true | ||
| 40 | OFFLINE_MODE=true | ||
| 41 | LANDING_PAGE=/explore/repos | ||
| 42 | |||
| 43 | [database] | ||
| 44 | PATH=/data/work/gitea.db | ||
| 45 | DB_TYPE=sqlite3 | ||
| 46 | HOST=localhost:3306 | ||
| 47 | NAME=gitea | ||
| 48 | USER=root | ||
| 49 | PASSWD= | ||
| 50 | LOG_SQL=false | ||
| 51 | SCHEMA= | ||
| 52 | SSL_MODE=disable | ||
| 53 | |||
| 54 | [indexer] | ||
| 55 | ISSUE_INDEXER_PATH=/data/work/indexers/issues.bleve | ||
| 56 | |||
| 57 | [session] | ||
| 58 | PROVIDER_CONFIG=/data/work/sessions | ||
| 59 | PROVIDER=file | ||
| 60 | |||
| 61 | [picture] | ||
| 62 | AVATAR_UPLOAD_PATH=/data/work/avatars | ||
| 63 | REPOSITORY_AVATAR_UPLOAD_PATH=/data/work/repo-avatars | ||
| 64 | |||
| 65 | [admin] | ||
| 66 | DISABLE_REGULAR_ORG_CREATION=true | ||
| 67 | |||
| 68 | [attachment] | ||
| 69 | PATH=/data/work/attachments | ||
| 70 | |||
| 71 | [log] | ||
| 72 | MODE=console | ||
| 73 | LEVEL=info | ||
| 74 | ROOT_PATH=/data/work/log | ||
| 75 | |||
| 76 | [security] | ||
| 77 | INSTALL_LOCK=true | ||
| 78 | REVERSE_PROXY_LIMIT=1 | ||
| 79 | REVERSE_PROXY_TRUSTED_PROXIES=* | ||
| 80 | PASSWORD_HASH_ALGO=pbkdf2_hi | ||
| 81 | SECRET_KEY=$FORGEJO_SECURITY_SECRET_KEY | ||
| 82 | INTERNAL_TOKEN=$FORGEJO_SECURITY_INTERNAL_TOKEN | ||
| 83 | |||
| 84 | [openid] | ||
| 85 | ENABLE_OPENID_SIGNIN=false | ||
| 86 | ENABLE_OPENID_SIGNUP=true | ||
| 87 | WHITELISTED_URIS=auth.local.test | ||
| 88 | |||
| 89 | [service] | ||
| 90 | ENABLE_INTERNAL_SIGNIN=false | ||
| 91 | DISABLE_REGISTRATION=false | ||
| 92 | ALLOW_ONLY_EXTERNAL_REGISTRATION=true | ||
| 93 | SHOW_REGISTRATION_BUTTON=false | ||
| 94 | REQUIRE_SIGNIN_VIEW=false | ||
| 95 | REGISTER_EMAIL_CONFIRM=true | ||
| 96 | ENABLE_NOTIFY_MAIL=true | ||
| 97 | DEFAULT_KEEP_EMAIL_PRIVATE=false | ||
| 98 | DEFAULT_ALLOW_CREATE_ORGANIZATION=true | ||
| 99 | DEFAULT_ENABLE_TIMETRACKING=true | ||
| 100 | NO_REPLY_ADDRESS=noreply.localhost | ||
| 101 | |||
| 102 | [lfs] | ||
| 103 | PATH = /data/git/lfs | ||
| 104 | |||
| 105 | [mailer] | ||
| 106 | ENABLED=false | ||
| 107 | FROM=noreply.git@$HOME_DOMAIN | ||
| 108 | PROTOCOL=smtps | ||
| 109 | SMTP_PORT=587 | ||
| 110 | SMTP_ADDR=$MAILER_ADDRESS | ||
| 111 | USER=$MAILER_USERNAME | ||
| 112 | PASSWD=$MAILER_PASSWORD | ||
| 113 | |||
| 114 | [repository.pull-request] | ||
| 115 | DEFAULT_MERGE_STYLE=squash | ||
| 116 | |||
| 117 | [repository.signing] | ||
| 118 | DEFAULT_TRUST_MODEL=committer | ||
| 119 | |||
| 120 | [oauth2] | ||
| 121 | JWT_SECRET=$FORGEJO_OAUTH2_JWT_SECRET | ||
config/forgejo/init/config.sh created+20| ... | @@ -0,0 +1,20 @@ | ||
| 1 | #!/bin/sh | ||
| 2 | set -e | ||
| 3 | |||
| 4 | FORGEJO_OPENID_SECRET="$(cat /shared-keys/forgejo)" | ||
| 5 | |||
| 6 | openid_args="--provider=openidConnect \ | ||
| 7 | --name=snow \ | ||
| 8 | --key=forgejo \ | ||
| 9 | --secret=$FORGEJO_OPENID_SECRET \ | ||
| 10 | --auto-discover-url=https://auth.$HOME_DOMAIN/realms/master/.well-known/openid-configuration \ | ||
| 11 | --scopes=openid email profile groups" | ||
| 12 | |||
| 13 | forgejo migrate | ||
| 14 | |||
| 15 | if ! forgejo admin auth add-oauth $openid_args; then | ||
| 16 | id=$(forgejo admin auth list | awk '$2=="snow" {print $1}') | ||
| 17 | if [ -n "$id" ]; then | ||
| 18 | forgejo admin auth update-oauth --id="$id" $openid_args | ||
| 19 | fi | ||
| 20 | fi | ||
config/forgejo/init/entry.sh created+14| ... | @@ -0,0 +1,14 @@ | ||
| 1 | #!/bin/sh | ||
| 2 | set -e | ||
| 3 | |||
| 4 | mkdir -p /custom/conf | ||
| 5 | envsubst </custom/init/app.ini >/custom/conf/app.ini | ||
| 6 | chmod 444 /custom/conf/app.ini | ||
| 7 | |||
| 8 | CADDY_IP="$(getent hosts caddy | awk '{print $1}')" | ||
| 9 | echo "${CADDY_IP} auth.${HOME_DOMAIN}" >>/etc/hosts | ||
| 10 | |||
| 11 | /usr/bin/entrypoint echo meow >/dev/null | ||
| 12 | su git -c "bash /custom/init/config.sh" | ||
| 13 | |||
| 14 | exec /usr/bin/entrypoint /usr/bin/s6-svscan /etc/s6 | ||
config/forgejo/public/assets/css/theme-clover.css+130-52| ... | @@ -2,32 +2,32 @@ | ... | @@ -2,32 +2,32 @@ |
| 2 | @import "theme-forgejo-dark.css" (prefers-color-scheme: dark); | 2 | @import "theme-forgejo-dark.css" (prefers-color-scheme: dark); |
| 3 | 3 | ||
| 4 | @font-face { | 4 | @font-face { |
| 5 | font-family: 'Name Mono'; | 5 | font-family: "Name Mono"; |
| 6 | src: url('../font/ATNameMono-Regular.woff2') format('woff2'); | 6 | src: url("../font/nm.woff2") format("woff2"); |
| 7 | font-weight: 400; | 7 | font-weight: 400; |
| 8 | font-style: normal; | 8 | font-style: normal; |
| 9 | font-display: swap; | 9 | font-display: swap; |
| 10 | } | 10 | } |
| 11 | 11 | ||
| 12 | @font-face { | 12 | @font-face { |
| 13 | font-family: 'Name Mono'; | 13 | font-family: "Name Mono"; |
| 14 | src: url('../font/ATNameMono-Bold.woff2') format('woff2'); | 14 | src: url("../font/nmb.woff2") format("woff2"); |
| 15 | font-weight: 700; | 15 | font-weight: 700; |
| 16 | font-style: normal; | 16 | font-style: normal; |
| 17 | font-display: swap; | 17 | font-display: swap; |
| 18 | } | 18 | } |
| 19 | 19 | ||
| 20 | @font-face { | 20 | @font-face { |
| 21 | font-family: 'Name Mono'; | 21 | font-family: "Name Mono"; |
| 22 | src: url('../font/ATNameMono-Italic.woff2') format('woff2'); | 22 | src: url("../font/nmi.woff2") format("woff2"); |
| 23 | font-weight: 400; | 23 | font-weight: 400; |
| 24 | font-style: italic; | 24 | font-style: italic; |
| 25 | font-display: swap; | 25 | font-display: swap; |
| 26 | } | 26 | } |
| 27 | 27 | ||
| 28 | @font-face { | 28 | @font-face { |
| 29 | font-family: 'Name Sans'; | 29 | font-family: "Name Sans"; |
| 30 | src: url('../font/ATNameSansVariable-Regular.woff2') format('woff2') tech(variations); | 30 | src: url("../font/nsv.woff2") format("woff2") tech(variations); |
| 31 | font-weight: 100 900; | 31 | font-weight: 100 900; |
| 32 | font-style: normal; | 32 | font-style: normal; |
| 33 | font-display: swap; | 33 | font-display: swap; |
| ... | @@ -35,8 +35,8 @@ | ... | @@ -35,8 +35,8 @@ |
| 35 | } | 35 | } |
| 36 | 36 | ||
| 37 | @font-face { | 37 | @font-face { |
| 38 | font-family: 'Name Sans'; | 38 | font-family: "Name Sans"; |
| 39 | src: url('../font/ATNameSansVariable-Italic.woff2') format('woff2') tech(variations); | 39 | src: url("../font/nsvi.woff2") format("woff2") tech(variations); |
| 40 | font-weight: 100 900; | 40 | font-weight: 100 900; |
| 41 | font-style: italic; | 41 | font-style: italic; |
| 42 | font-display: swap; | 42 | font-display: swap; |
| ... | @@ -44,9 +44,14 @@ | ... | @@ -44,9 +44,14 @@ |
| 44 | } | 44 | } |
| 45 | 45 | ||
| 46 | :root { | 46 | :root { |
| 47 | --fonts-proportional: 'Name Sans', -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Noto Sans', Helvetica, Arial, sans-serif !important; | 47 | --fonts-proportional: |
| 48 | --fonts-monospace: 'Name Mono', 'SF Mono', Monaco, 'Cascadia Code', 'Roboto Mono', Consolas, 'Courier New', monospace !important; | 48 | "Name Sans", -apple-system, BlinkMacSystemFont, "Segoe UI", "Noto Sans", |
| 49 | --fonts-emoji: 'Apple Color Emoji', 'Segoe UI Emoji', 'Noto Color Emoji' !important; | 49 | Helvetica, Arial, sans-serif !important; |
| 50 | --fonts-monospace: | ||
| 51 | "Name Mono", "SF Mono", Monaco, "Cascadia Code", "Roboto Mono", Consolas, | ||
| 52 | "Courier New", monospace !important; | ||
| 53 | --fonts-emoji: | ||
| 54 | "Apple Color Emoji", "Segoe UI Emoji", "Noto Color Emoji" !important; | ||
| 50 | --steel-900: oklch(0.15 0.08 320); | 55 | --steel-900: oklch(0.15 0.08 320); |
| 51 | --steel-850: oklch(0.18 0.07 320); | 56 | --steel-850: oklch(0.18 0.07 320); |
| 52 | --steel-800: oklch(0.21 0.06 320); | 57 | --steel-800: oklch(0.21 0.06 320); |
| ... | @@ -65,24 +70,24 @@ | ... | @@ -65,24 +70,24 @@ |
| 65 | --steel-150: oklch(0.90 0.04 320); | 70 | --steel-150: oklch(0.90 0.04 320); |
| 66 | --steel-100: oklch(0.95 0.01 320); | 71 | --steel-100: oklch(0.95 0.01 320); |
| 67 | 72 | ||
| 68 | --zinc-900: oklch(calc(0.15 * 1.05) calc(0.08/1.5) 320); | 73 | --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); | 74 | --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); | 75 | --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); | 76 | --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); | 77 | --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); | 78 | --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); | 79 | --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); | 80 | --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); | 81 | --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); | 82 | --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); | 83 | --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); | 84 | --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); | 85 | --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); | 86 | --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); | 87 | --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); | 88 | --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); | 89 | --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); | 90 | --zinc-50: oklch(calc(0.95 * 1.05) calc(0.01 / 1.5) 320); |
| 86 | 91 | ||
| 87 | --color-primary: #00896e; | 92 | --color-primary: #00896e; |
| 88 | --color-primary-contrast: #000; | 93 | --color-primary-contrast: #000; |
| ... | @@ -100,27 +105,63 @@ | ... | @@ -100,27 +105,63 @@ |
| 100 | --color-primary-light-5: color-mix(in srgb, var(--color-primary) 50%, black); | 105 | --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); | 106 | --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); | 107 | --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); | 108 | --color-primary-alpha-10: color-mix( |
| 104 | --color-primary-alpha-20: color-mix(in srgb, var(--color-primary) 20%, transparent); | 109 | in srgb, |
| 105 | --color-primary-alpha-30: color-mix(in srgb, var(--color-primary) 30%, transparent); | 110 | var(--color-primary) 10%, |
| 106 | --color-primary-alpha-40: color-mix(in srgb, var(--color-primary) 40%, transparent); | 111 | transparent |
| 107 | --color-primary-alpha-50: color-mix(in srgb, var(--color-primary) 50%, transparent); | 112 | ); |
| 108 | --color-primary-alpha-60: color-mix(in srgb, var(--color-primary) 60%, transparent); | 113 | --color-primary-alpha-20: color-mix( |
| 109 | --color-primary-alpha-70: color-mix(in srgb, var(--color-primary) 70%, transparent); | 114 | in srgb, |
| 110 | --color-primary-alpha-80: color-mix(in srgb, var(--color-primary) 80%, transparent); | 115 | var(--color-primary) 20%, |
| 111 | --color-primary-alpha-90: color-mix(in srgb, var(--color-primary) 90%, transparent); | 116 | transparent |
| 117 | ); | ||
| 118 | --color-primary-alpha-30: color-mix( | ||
| 119 | in srgb, | ||
| 120 | var(--color-primary) 30%, | ||
| 121 | transparent | ||
| 122 | ); | ||
| 123 | --color-primary-alpha-40: color-mix( | ||
| 124 | in srgb, | ||
| 125 | var(--color-primary) 40%, | ||
| 126 | transparent | ||
| 127 | ); | ||
| 128 | --color-primary-alpha-50: color-mix( | ||
| 129 | in srgb, | ||
| 130 | var(--color-primary) 50%, | ||
| 131 | transparent | ||
| 132 | ); | ||
| 133 | --color-primary-alpha-60: color-mix( | ||
| 134 | in srgb, | ||
| 135 | var(--color-primary) 60%, | ||
| 136 | transparent | ||
| 137 | ); | ||
| 138 | --color-primary-alpha-70: color-mix( | ||
| 139 | in srgb, | ||
| 140 | var(--color-primary) 70%, | ||
| 141 | transparent | ||
| 142 | ); | ||
| 143 | --color-primary-alpha-80: color-mix( | ||
| 144 | in srgb, | ||
| 145 | var(--color-primary) 80%, | ||
| 146 | transparent | ||
| 147 | ); | ||
| 148 | --color-primary-alpha-90: color-mix( | ||
| 149 | in srgb, | ||
| 150 | var(--color-primary) 90%, | ||
| 151 | transparent | ||
| 152 | ); | ||
| 112 | } | 153 | } |
| 113 | 154 | ||
| 114 | @media (prefers-color-scheme: dark) { | 155 | @media (prefers-color-scheme: dark) { |
| 115 | :root { | 156 | :root { |
| 116 | --is-dark-theme: true; | 157 | --is-dark-theme: true; |
| 117 | --color-primary: #45F0CE; | 158 | --color-primary: #45f0ce; |
| 118 | } | 159 | } |
| 119 | } | 160 | } |
| 120 | 161 | ||
| 121 | .warning { | 162 | .warning { |
| 122 | --color-primary: #c35b06; | 163 | --color-primary: #c35b06; |
| 123 | @media (prefers-color-scheme:dark) { | 164 | @media (prefers-color-scheme: dark) { |
| 124 | --color-primary: #ff9843; | 165 | --color-primary: #ff9843; |
| 125 | } | 166 | } |
| 126 | --color-primary-contrast: #000; | 167 | --color-primary-contrast: #000; |
| ... | @@ -138,13 +179,50 @@ | ... | @@ -138,13 +179,50 @@ |
| 138 | --color-primary-light-5: color-mix(in srgb, var(--color-primary) 50%, black); | 179 | --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); | 180 | --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); | 181 | --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 | |||
| 182 | --color-primary-alpha-10: color-mix( | ||
| 183 | in srgb, | ||
| 184 | var(--color-primary) 10%, | ||
| 185 | transparent | ||
| 186 | ); | ||
| 187 | --color-primary-alpha-20: color-mix( | ||
| 188 | in srgb, | ||
| 189 | var(--color-primary) 20%, | ||
| 190 | transparent | ||
| 191 | ); | ||
| 192 | --color-primary-alpha-30: color-mix( | ||
| 193 | in srgb, | ||
| 194 | var(--color-primary) 30%, | ||
| 195 | transparent | ||
| 196 | ); | ||
| 197 | --color-primary-alpha-40: color-mix( | ||
| 198 | in srgb, | ||
| 199 | var(--color-primary) 40%, | ||
| 200 | transparent | ||
| 201 | ); | ||
| 202 | --color-primary-alpha-50: color-mix( | ||
| 203 | in srgb, | ||
| 204 | var(--color-primary) 50%, | ||
| 205 | transparent | ||
| 206 | ); | ||
| 207 | --color-primary-alpha-60: color-mix( | ||
| 208 | in srgb, | ||
| 209 | var(--color-primary) 60%, | ||
| 210 | transparent | ||
| 211 | ); | ||
| 212 | --color-primary-alpha-70: color-mix( | ||
| 213 | in srgb, | ||
| 214 | var(--color-primary) 70%, | ||
| 215 | transparent | ||
| 216 | ); | ||
| 217 | --color-primary-alpha-80: color-mix( | ||
| 218 | in srgb, | ||
| 219 | var(--color-primary) 80%, | ||
| 220 | transparent | ||
| 221 | ); | ||
| 222 | --color-primary-alpha-90: color-mix( | ||
| 223 | in srgb, | ||
| 224 | var(--color-primary) 90%, | ||
| 225 | transparent | ||
| 226 | ); | ||
| 227 | } | ||
| 228 | |||
config/forgejo/templates/.gitignoreconfig/keycloak/init.py+37-3| ... | @@ -126,6 +126,42 @@ def configure(): | ... | @@ -126,6 +126,42 @@ def configure(): |
| 126 | else: | 126 | else: |
| 127 | logger.info(f"Group {group_name} already exists, skipping") | 127 | logger.info(f"Group {group_name} already exists, skipping") |
| 128 | 128 | ||
| 129 | Path("/shared").mkdir(parents=True, exist_ok=True) | ||
| 130 | |||
| 131 | # forgejo | ||
| 132 | client_id = kc_admin.create_client( | ||
| 133 | { | ||
| 134 | "protocol": "openid-connect", | ||
| 135 | "clientId": "forgejo", | ||
| 136 | "name": "Forgejo", | ||
| 137 | "description": "", | ||
| 138 | "publicClient": False, | ||
| 139 | "authorizationServicesEnabled": False, | ||
| 140 | "serviceAccountsEnabled": False, | ||
| 141 | "implicitFlowEnabled": False, | ||
| 142 | "directAccessGrantsEnabled": False, | ||
| 143 | "standardFlowEnabled": True, | ||
| 144 | "frontchannelLogout": True, | ||
| 145 | "attributes": { | ||
| 146 | "saml_idp_initiated_sso_url_name": "", | ||
| 147 | "standard.token.exchange.enabled": False, | ||
| 148 | "oauth2.device.authorization.grant.enabled": False, | ||
| 149 | "oidc.ciba.grant.enabled": False, | ||
| 150 | "pkce.code.challenge.method": "", | ||
| 151 | "dpop.bound.access.tokens": "false", | ||
| 152 | "post.logout.redirect.uris": "*", | ||
| 153 | }, | ||
| 154 | "alwaysDisplayInConsole": False, | ||
| 155 | "rootUrl": "", | ||
| 156 | "baseUrl": "", | ||
| 157 | "redirectUris": ["*"], | ||
| 158 | }, | ||
| 159 | skip_exists=True, | ||
| 160 | ) | ||
| 161 | client_data = kc_admin.get_client(client_id) | ||
| 162 | _ = Path("/shared/forgejo").write_text(client_data["secret"]) | ||
| 163 | |||
| 164 | # forward auth | ||
| 129 | client_id = kc_admin.create_client( | 165 | client_id = kc_admin.create_client( |
| 130 | { | 166 | { |
| 131 | "protocol": "openid-connect", | 167 | "protocol": "openid-connect", |
| ... | @@ -156,9 +192,7 @@ def configure(): | ... | @@ -156,9 +192,7 @@ def configure(): |
| 156 | skip_exists=True, | 192 | skip_exists=True, |
| 157 | ) | 193 | ) |
| 158 | client_data = kc_admin.get_client(client_id) | 194 | client_data = kc_admin.get_client(client_id) |
| 159 | fw_secret_path = Path("/shared/forward-auth") | 195 | _ = Path("/shared/forward-auth").write_text(client_data["secret"]) |
| 160 | fw_secret_path.parent.mkdir(parents=True, exist_ok=True) | ||
| 161 | _ = fw_secret_path.write_text(client_data["secret"]) | ||
| 162 | 196 | ||
| 163 | 197 | ||
| 164 | def main(): | 198 | def main(): |