Initial commit
This commit is contained in:
@@ -0,0 +1,5 @@
|
||||
.env
|
||||
|
||||
data/*
|
||||
|
||||
!data/glance/
|
||||
@@ -0,0 +1,24 @@
|
||||
services:
|
||||
gitea:
|
||||
image: gitea/gitea
|
||||
container_name: gitea
|
||||
restart: unless-stopped
|
||||
networks:
|
||||
- proxy
|
||||
ports:
|
||||
- "22:22"
|
||||
volumes:
|
||||
- ./data/gitea:/data
|
||||
- /etc/timezone:/etc/timezone:ro
|
||||
- /etc/localtime:/etc/localtime:ro
|
||||
labels:
|
||||
- "traefik.enable=true"
|
||||
- "traefik.http.services.gitea.loadbalancer.server.port=3000"
|
||||
- "traefik.http.routers.gitea.rule=Host(`${GITEA_HOST}`)"
|
||||
- "traefik.http.routers.gitea.entrypoints=websecure"
|
||||
- "traefik.http.routers.gitea.tls.certresolver=le"
|
||||
|
||||
networks:
|
||||
proxy:
|
||||
name: proxy
|
||||
external: true
|
||||
@@ -0,0 +1 @@
|
||||
GITEA_HOST=
|
||||
@@ -0,0 +1,109 @@
|
||||
pages:
|
||||
- name: Home
|
||||
head-widgets:
|
||||
- type: monitor
|
||||
cache: 1m
|
||||
title: Services
|
||||
hide-header: true
|
||||
sites:
|
||||
- title: Git
|
||||
url: https://git.ksar.dev
|
||||
icon: sh:gitea
|
||||
- title: Wiki
|
||||
url: https://wiki.ksar.dev
|
||||
icon: https://cdn.jsdelivr.net/gh/selfhst/icons@main/png/outline.png
|
||||
- title: Notes
|
||||
url: https://notes.ksar.dev
|
||||
icon: https://cdn.jsdelivr.net/gh/selfhst/icons@main/png/memos.png
|
||||
- title: RSS
|
||||
url: https://rss.ksar.dev
|
||||
icon: https://cdn.jsdelivr.net/gh/selfhst/icons@main/png/miniflux-light.png
|
||||
- title: Vaultwarden
|
||||
url: https://bw.ksar.dev
|
||||
icon: https://cdn.jsdelivr.net/gh/selfhst/icons@main/png/vaultwarden-light.png
|
||||
|
||||
columns:
|
||||
- size: small
|
||||
widgets:
|
||||
- type: weather
|
||||
hide-header: true
|
||||
location: Moscow, Russia
|
||||
units: metric
|
||||
hour-format: 24h
|
||||
|
||||
- type: calendar
|
||||
hide-header: true
|
||||
first-day-of-week: monday
|
||||
|
||||
- type: releases
|
||||
hide-header: true
|
||||
show-source-icon: true
|
||||
repositories:
|
||||
- docmost/docmost
|
||||
- glanceapp/glance
|
||||
- traefik/traefik
|
||||
- usememos/memos
|
||||
- miniflux/v2
|
||||
- MHSanaei/3x-ui
|
||||
- go-gitea/gitea
|
||||
- dani-garcia/vaultwarden
|
||||
- dockerhub:gitlab/gitlab-ce
|
||||
- dockerhub:jetbrains/youtrack
|
||||
|
||||
- size: full
|
||||
widgets:
|
||||
- type: search
|
||||
search-engine: kagi
|
||||
hide-header: true
|
||||
|
||||
- type: group
|
||||
widgets:
|
||||
- type: hacker-news
|
||||
limit: 30
|
||||
collapse-after: 10
|
||||
- type: lobsters
|
||||
limit: 30
|
||||
collapse-after: 10
|
||||
- type: reddit
|
||||
subreddit: technology
|
||||
show-thumbnails: true
|
||||
limit: 30
|
||||
collapse-after: 10
|
||||
top-period: week
|
||||
sort-by: best
|
||||
- type: reddit
|
||||
subreddit: selfhosted
|
||||
show-thumbnails: true
|
||||
limit: 30
|
||||
collapse-after: 10
|
||||
top-period: week
|
||||
sort-by: best
|
||||
- type: reddit
|
||||
subreddit: science
|
||||
show-thumbnails: true
|
||||
limit: 30
|
||||
collapse-after: 10
|
||||
top-period: week
|
||||
sort-by: best
|
||||
|
||||
- size: small
|
||||
widgets:
|
||||
- type: videos
|
||||
style: vertical-list
|
||||
hide-header: true
|
||||
collapse-after: 15
|
||||
channels:
|
||||
- UCDaIW2zPRWhzQ9Hj7a0QP1w # Руслан Усачев
|
||||
- UCY6zVRa3Km52bsBmpyQnk6A # Vert Dider
|
||||
- UCJQlWxJziHWs0Bq59D2Qw8A # РЫНДЫЧ
|
||||
- UC2q4mHrzoR48mwSuAYtVPtQ # Александр Панчин
|
||||
- UCerK03vbFNIDc8ABS87gHzw # ЛЕСНЫЕ
|
||||
- UCYulscWJwKgs35FTF9FaNlw # Дмитрий Машков
|
||||
- UCbS8hyArQ_VWPSBcc56FsLw # ПроВокруг
|
||||
- UCQwRlx8hVI-CFv_E-v5s84Q # Адвокат Егоров
|
||||
- UC2Ru64PHqW4FxoP0xhQRvJg # ТОПЛЕС
|
||||
- UCY1kMZp36IQSyNx_9h4mpCg # Mark Rober
|
||||
- UCt9SXdrwKnV_4WwRjUmHZsQ # Михаил Лидин
|
||||
- UC6cqazSR6CnVMClY0bJI0Lg # BadComedian
|
||||
- UCXUPKJO5MZQN11PqgIvyuvQ # Andrej Karpathy
|
||||
- UCisCR8RgtPcHGpUXblKxrvQ # Клинический случай
|
||||
@@ -0,0 +1,20 @@
|
||||
services:
|
||||
glance:
|
||||
image: glanceapp/glance
|
||||
container_name: glance
|
||||
restart: unless-stopped
|
||||
networks:
|
||||
- proxy
|
||||
volumes:
|
||||
- ./data/glance:/app/config
|
||||
labels:
|
||||
- "traefik.enable=true"
|
||||
- "traefik.http.services.glance.loadbalancer.server.port=8080"
|
||||
- "traefik.http.routers.glance.rule=Host(`${GLANCE_HOST}`)"
|
||||
- "traefik.http.routers.glance.entrypoints=websecure"
|
||||
- "traefik.http.routers.glance.tls.certresolver=le"
|
||||
|
||||
networks:
|
||||
proxy:
|
||||
name: proxy
|
||||
external: true
|
||||
@@ -0,0 +1 @@
|
||||
GLANCE_HOST=
|
||||
@@ -0,0 +1,24 @@
|
||||
services:
|
||||
memos:
|
||||
image: neosmemo/memos:stable
|
||||
container_name: memos
|
||||
restart: unless-stopped
|
||||
networks:
|
||||
- proxy
|
||||
volumes:
|
||||
- ./data/memos:/var/opt/memos
|
||||
environment:
|
||||
MEMOS_PORT: 5230
|
||||
MEMOS_DRIVER: sqlite
|
||||
MEMOS_INSTANCE_URL: https://${MEMOS_HOST}/
|
||||
labels:
|
||||
- "traefik.enable=true"
|
||||
- "traefik.http.services.memos.loadbalancer.server.port=5230"
|
||||
- "traefik.http.routers.memos.rule=Host(`${MEMOS_HOST}`)"
|
||||
- "traefik.http.routers.memos.entrypoints=websecure"
|
||||
- "traefik.http.routers.memos.tls.certresolver=le"
|
||||
|
||||
networks:
|
||||
proxy:
|
||||
name: proxy
|
||||
external: true
|
||||
@@ -0,0 +1 @@
|
||||
MEMOS_HOST=
|
||||
@@ -0,0 +1,51 @@
|
||||
services:
|
||||
miniflux:
|
||||
image: miniflux/miniflux:latest
|
||||
container_name: miniflux
|
||||
restart: unless-stopped
|
||||
depends_on:
|
||||
miniflux-db:
|
||||
condition: service_healthy
|
||||
networks:
|
||||
- proxy
|
||||
- miniflux
|
||||
environment:
|
||||
- DATABASE_URL=postgres://miniflux:${MINIFLUX_POSTGRES_PASSWORD}@minifluxdb/miniflux?sslmode=disable
|
||||
- RUN_MIGRATIONS=1
|
||||
- OAUTH2_PROVIDER=oidc
|
||||
- OAUTH2_CLIENT_ID=${MINIFLUX_OAUTH2_CLIENT_ID}
|
||||
- OAUTH2_CLIENT_SECRET=${MINIFLUX_OAUTH2_CLIENT_SECRET}
|
||||
- OAUTH2_REDIRECT_URL=https://${MINIFLUX_HOST}/oauth2/oidc/callback
|
||||
- OAUTH2_OIDC_DISCOVERY_ENDPOINT=https://${MINIFLUX_OAUTH2_OIDC_DISCOVERY_ENDPOINT}
|
||||
- OAUTH2_USER_CREATION=1
|
||||
labels:
|
||||
- "traefik.enable=true"
|
||||
- "traefik.http.services.miniflux.loadbalancer.server.port=8080"
|
||||
- "traefik.http.routers.miniflux.rule=Host(`${MINIFLUX_HOST}`)"
|
||||
- "traefik.http.routers.miniflux.entrypoints=websecure"
|
||||
- "traefik.http.routers.miniflux.tls.certresolver=le"
|
||||
|
||||
miniflux-db:
|
||||
image: postgres:latest
|
||||
container_name: miniflux-db
|
||||
restart: unless-stopped
|
||||
networks:
|
||||
- miniflux
|
||||
environment:
|
||||
- POSTGRES_USER=miniflux
|
||||
- POSTGRES_PASSWORD=${MINIFLUX_POSTGRES_PASSWORD}
|
||||
- POSTGRES_DB=miniflux
|
||||
volumes:
|
||||
- ./data/miniflux-db:/var/lib/postgresql
|
||||
healthcheck:
|
||||
test: ["CMD-SHELL", "pg_isready -U outline -d outline"]
|
||||
interval: 10s
|
||||
timeout: 5s
|
||||
retries: 5
|
||||
|
||||
networks:
|
||||
proxy:
|
||||
name: proxy
|
||||
external: true
|
||||
miniflux:
|
||||
name: miniflux
|
||||
@@ -0,0 +1,5 @@
|
||||
MINIFLUX_HOST=
|
||||
MINIFLUX_POSTGRES_PASSWORD=
|
||||
MINIFLUX_OAUTH2_CLIENT_ID=
|
||||
MINIFLUX_OAUTH2_CLIENT_SECRET=
|
||||
MINIFLUX_OAUTH2_OIDC_DISCOVERY_ENDPOINT=
|
||||
@@ -0,0 +1,80 @@
|
||||
services:
|
||||
outline:
|
||||
image: outlinewiki/outline:latest
|
||||
container_name: outline
|
||||
restart: unless-stopped
|
||||
networks:
|
||||
- proxy
|
||||
- outline
|
||||
environment:
|
||||
- NODE_ENV=production
|
||||
- URL=https://${OUTLINE_HOST}
|
||||
- PORT=3000
|
||||
- FILE_STORAGE_UPLOAD_MAX_SIZE=1024000000
|
||||
- SECRET_KEY=${OUTLINE_SECRET_KEY}
|
||||
- UTILS_SECRET=${OUTLINE_UTILS_SECRET}
|
||||
- POSTGRES_PASSWORD=${OUTLINE_POSTGRES_PASSWORD}
|
||||
- DATABASE_URL=postgres://outline:${OUTLINE_POSTGRES_PASSWORD}@outline-db:5432/outline
|
||||
- PGSSLMODE=disable
|
||||
- REDIS_URL=redis://outline-redis:6379
|
||||
- FILE_STORAGE=local
|
||||
- FILE_STORAGE_LOCAL_ROOT_DIR=/var/lib/outline/data
|
||||
- OIDC_ISSUER_URL=https://${OUTLINE_OIDC_ISSUER_URL}
|
||||
- OIDC_CLIENT_ID=${OUTLINE_OIDC_CLIENT_ID}
|
||||
- OIDC_CLIENT_SECRET=${OUTLINE_OIDC_CLIENT_SECRET}
|
||||
- OIDC_DISPLAY_NAME=Gitea
|
||||
- OIDC_SCOPES=openid profile email
|
||||
- OIDC_USERNAME_CLAIM=preferred_username
|
||||
- OIDC_LOGOUT_URI=https://${OUTLINE_HOST}
|
||||
volumes:
|
||||
- ./data/outline:/var/lib/outline/data
|
||||
depends_on:
|
||||
outline-db:
|
||||
condition: service_healthy
|
||||
outline-redis:
|
||||
condition: service_healthy
|
||||
labels:
|
||||
- "traefik.enable=true"
|
||||
- "traefik.http.services.outline.loadbalancer.server.port=3000"
|
||||
- "traefik.http.routers.outline.rule=Host(`${OUTLINE_HOST}`)"
|
||||
- "traefik.http.routers.outline.entrypoints=websecure"
|
||||
- "traefik.http.routers.outline.tls.certresolver=le"
|
||||
|
||||
outline-db:
|
||||
image: postgres:latest
|
||||
container_name: outline-db
|
||||
restart: unless-stopped
|
||||
networks:
|
||||
- outline
|
||||
environment:
|
||||
POSTGRES_USER: outline
|
||||
POSTGRES_PASSWORD: ${OUTLINE_POSTGRES_PASSWORD}
|
||||
POSTGRES_DB: outline
|
||||
volumes:
|
||||
- ./data/outline-db:/var/lib/postgresql
|
||||
healthcheck:
|
||||
test: ["CMD-SHELL", "pg_isready -U outline -d outline"]
|
||||
interval: 10s
|
||||
timeout: 5s
|
||||
retries: 5
|
||||
|
||||
outline-redis:
|
||||
image: redis:7-alpine
|
||||
container_name: outline-redis
|
||||
restart: unless-stopped
|
||||
networks:
|
||||
- outline
|
||||
volumes:
|
||||
- ./data/outline-redis:/data
|
||||
healthcheck:
|
||||
test: ["CMD", "redis-cli", "ping"]
|
||||
interval: 10s
|
||||
timeout: 5s
|
||||
retries: 5
|
||||
|
||||
networks:
|
||||
proxy:
|
||||
name: proxy
|
||||
external: true
|
||||
outline:
|
||||
name: outline
|
||||
@@ -0,0 +1,7 @@
|
||||
OUTLINE_HOST=
|
||||
OUTLINE_SECRET_KEY= # openssl rand -hex 32
|
||||
OUTLINE_UTILS_SECRET=
|
||||
OUTLINE_POSTGRES_PASSWORD=
|
||||
OUTLINE_OIDC_CLIENT_ID=
|
||||
OUTLINE_OIDC_CLIENT_SECRET=
|
||||
OUTLINE_OIDC_ISSUER_URL=
|
||||
@@ -0,0 +1,29 @@
|
||||
services:
|
||||
traefik:
|
||||
image: traefik:latest
|
||||
container_name: traefik
|
||||
restart: unless-stopped
|
||||
networks:
|
||||
- proxy
|
||||
command:
|
||||
- "--api.insecure=false"
|
||||
- "--providers.docker=true"
|
||||
- "--providers.docker.exposedbydefault=false"
|
||||
- "--entryPoints.web.address=:80"
|
||||
- "--entryPoints.web.http.redirections.entryPoint.to=websecure"
|
||||
- "--entryPoints.web.http.redirections.entryPoint.scheme=https"
|
||||
- "--entryPoints.websecure.address=:443"
|
||||
- "--certificatesresolvers.le.acme.tlschallenge=true"
|
||||
- "--certificatesresolvers.le.acme.email=${TRAEFIK_MAIL}"
|
||||
- "--certificatesresolvers.le.acme.storage=/letsencrypt/acme.json"
|
||||
- "--providers.docker.network=proxy"
|
||||
ports:
|
||||
- "80:80"
|
||||
- "443:443"
|
||||
volumes:
|
||||
- ./data/traefik:/letsencrypt
|
||||
- /var/run/docker.sock:/var/run/docker.sock:ro
|
||||
|
||||
networks:
|
||||
proxy:
|
||||
name: proxy
|
||||
@@ -0,0 +1 @@
|
||||
TRAEFIK_MAIL=
|
||||
@@ -0,0 +1,29 @@
|
||||
services:
|
||||
vaultwarden:
|
||||
image: vaultwarden/server:latest
|
||||
container_name: vaultwarden
|
||||
restart: unless-stopped
|
||||
networks:
|
||||
- proxy
|
||||
environment:
|
||||
DOMAIN: "https://${VAULTWARDEN_HOST}"
|
||||
SIGNUPS_ALLOWED: "false"
|
||||
SSO_ENABLED: "true"
|
||||
SSO_ONLY: "true"
|
||||
SSO_SIGNUPS_MATCH_EMAIL: "true"
|
||||
SSO_AUTHORITY: https://${VAULTWARDEN_SSO_AUTHORITY}
|
||||
SSO_CLIENT_ID: ${VAULTWARDEN_SSO_CLIENT_ID}
|
||||
SSO_CLIENT_SECRET: ${VAULTWARDEN_SSO_CLIENT_SECRET}
|
||||
volumes:
|
||||
- ./data/vaultwarden:/data/
|
||||
labels:
|
||||
- "traefik.enable=true"
|
||||
- "traefik.http.services.vaultwarden.loadbalancer.server.port=80"
|
||||
- "traefik.http.routers.vaultwarden.rule=Host(`${VAULTWARDEN_HOST}`)"
|
||||
- "traefik.http.routers.vaultwarden.entrypoints=websecure"
|
||||
- "traefik.http.routers.vaultwarden.tls.certresolver=le"
|
||||
|
||||
networks:
|
||||
proxy:
|
||||
name: proxy
|
||||
external: true
|
||||
@@ -0,0 +1,4 @@
|
||||
VAULTWARDEN_HOST=
|
||||
VAULTWARDEN_SSO_AUTHORITY=
|
||||
VAULTWARDEN_SSO_CLIENT_ID=
|
||||
VAULTWARDEN_SSO_CLIENT_SECRET=
|
||||
Reference in New Issue
Block a user