Compare commits
25 Commits
a989f41f08
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| e3d3ade4f7 | |||
| b41ad62aa1 | |||
| 0566bf8a2d | |||
| 46344bf719 | |||
|
e417287103
|
|||
|
194173c32e
|
|||
|
57d6021be3
|
|||
| d6f05752a6 | |||
|
dd34d0ab22
|
|||
| 698f16c819 | |||
|
80f278a74c
|
|||
|
816cca7f4f
|
|||
| 60a0239682 | |||
|
70c14f241e
|
|||
| 756049f74e | |||
| d4e6c7b732 | |||
|
8076a49199
|
|||
|
ba9d3d292c
|
|||
|
3ac2b710ba
|
|||
|
4d4289670e
|
|||
|
865c02a3a4
|
|||
| 64ea7cb6e6 | |||
| 2bf9ef29ac | |||
| b66697d924 | |||
| b9cccf5c50 |
25
README.md
25
README.md
@@ -18,3 +18,28 @@ zfs create -o mountpoint=/data hdd/data
|
|||||||
zfs set compression=on hdd/data
|
zfs set compression=on hdd/data
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## act_runner
|
||||||
|
|
||||||
|
```bash
|
||||||
|
pushd /tmp
|
||||||
|
wget https://gitea.com/gitea/act_runner/releases/download/v0.2.13/act_runner-0.2.13-linux-amd64.xz
|
||||||
|
xz -d act_runner-0.2.13-linux-amd64.xz
|
||||||
|
mv act_runner-0.2.13-linux-amd64 /usr/bin/act_runner
|
||||||
|
chmod +x /usr/bin/act_runner
|
||||||
|
mkdir /home/matthew/act_runner
|
||||||
|
```
|
||||||
|
|
||||||
|
## Systemd
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Add services
|
||||||
|
ln -s $PWD/*.service /etc/systemd/system/
|
||||||
|
systemctl enable homelab
|
||||||
|
systemctl start homelab
|
||||||
|
|
||||||
|
cd ~/act_runner
|
||||||
|
/usr/bin/act_runner register --config /home/matthew/homelab/host-runner.yaml
|
||||||
|
|
||||||
|
systemctl enable act_runner
|
||||||
|
systemctl start act_runner
|
||||||
|
```
|
||||||
|
|||||||
16
act_runner.service
Normal file
16
act_runner.service
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
[Unit]
|
||||||
|
Description=Gitea Actions runner
|
||||||
|
Documentation=https://gitea.com/gitea/act_runner
|
||||||
|
After=docker.service
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
ExecStart=/usr/bin/act_runner daemon --config /home/matthew/homelab/host-runner.yaml
|
||||||
|
ExecReload=/bin/kill -s HUP $MAINPID
|
||||||
|
WorkingDirectory=/home/matthew/act_runner
|
||||||
|
TimeoutSec=0
|
||||||
|
RestartSec=10
|
||||||
|
Restart=always
|
||||||
|
User=matthew
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
@@ -6,7 +6,7 @@ authentication_backend:
|
|||||||
password_change:
|
password_change:
|
||||||
disable: false
|
disable: false
|
||||||
file:
|
file:
|
||||||
path: '/config/users.yml'
|
path: '/data/users.yml'
|
||||||
watch: false
|
watch: false
|
||||||
search:
|
search:
|
||||||
email: false
|
email: false
|
||||||
@@ -37,18 +37,72 @@ session:
|
|||||||
remember_me: '1d'
|
remember_me: '1d'
|
||||||
notifier:
|
notifier:
|
||||||
disable_startup_check: false
|
disable_startup_check: false
|
||||||
filesystem:
|
# filesystem:
|
||||||
filename: '/config/notification.txt'
|
# filename: '/data/notification.txt'
|
||||||
|
smtp:
|
||||||
|
address: 'smtp://mail:25'
|
||||||
|
sender: 'Authelia <auth@loadingm.xyz>'
|
||||||
|
disable_require_tls: true # Determine if this is needed
|
||||||
|
disable_starttls: true
|
||||||
storage:
|
storage:
|
||||||
local:
|
local:
|
||||||
path: '/config/db.sqlite3'
|
path: '/data/db.sqlite3'
|
||||||
access_control:
|
access_control:
|
||||||
default_policy: deny
|
default_policy: deny
|
||||||
rules:
|
rules:
|
||||||
- domain: '*.loadingm.xyz'
|
- domain: 'servarr.loadingm.xyz'
|
||||||
|
subject:
|
||||||
|
- 'group:admins'
|
||||||
policy: one_factor
|
policy: one_factor
|
||||||
|
# - domain: '*.loadingm.xyz'
|
||||||
|
# policy: one_factor
|
||||||
server:
|
server:
|
||||||
endpoints:
|
endpoints:
|
||||||
authz:
|
authz:
|
||||||
auth-request:
|
auth-request:
|
||||||
implementation: 'AuthRequest'
|
implementation: 'AuthRequest'
|
||||||
|
identity_providers:
|
||||||
|
oidc:
|
||||||
|
# enable_client_debug_messages: false
|
||||||
|
# minimum_parameter_entropy: 8
|
||||||
|
# enforce_pkce: 'public_clients_only'
|
||||||
|
# enable_pkce_plain_challenge: false
|
||||||
|
# enable_jwt_access_token_stateless_introspection: false
|
||||||
|
# discovery_signed_response_alg: 'none'
|
||||||
|
# discovery_signed_response_key_id: ''
|
||||||
|
# require_pushed_authorization_requests: false
|
||||||
|
# authorization_policies:
|
||||||
|
# policy_name:
|
||||||
|
# default_policy: 'two_factor'
|
||||||
|
# rules:
|
||||||
|
# - policy: 'deny'
|
||||||
|
# subject: 'group:services'
|
||||||
|
# networks:
|
||||||
|
# - '192.168.1.0/24'
|
||||||
|
# - '192.168.2.51'
|
||||||
|
lifespans:
|
||||||
|
access_token: '1h'
|
||||||
|
authorize_code: '1m'
|
||||||
|
id_token: '1h'
|
||||||
|
refresh_token: '90m'
|
||||||
|
# claims_policies:
|
||||||
|
# policy_name:
|
||||||
|
# id_token: []
|
||||||
|
# access_token: []
|
||||||
|
# id_token_audience_mode: 'specification'
|
||||||
|
# custom_claims:
|
||||||
|
# claim_name:
|
||||||
|
# name: 'claim_name'
|
||||||
|
# attribute: 'attribute_name'
|
||||||
|
# scopes:
|
||||||
|
# scope_name:
|
||||||
|
# claims: []
|
||||||
|
# cors:
|
||||||
|
# endpoints:
|
||||||
|
# - 'authorization'
|
||||||
|
# - 'token'
|
||||||
|
# - 'revocation'
|
||||||
|
# - 'introspection'
|
||||||
|
# allowed_origins:
|
||||||
|
# - 'https://example.com'
|
||||||
|
# allowed_origins_from_client_redirect_uris: false
|
||||||
|
|||||||
31
authelia/secret-template.yml
Normal file
31
authelia/secret-template.yml
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
# rand() {
|
||||||
|
# docker run --rm authelia/authelia:latest authelia crypto rand --length $1 --charset rfc3986
|
||||||
|
# }
|
||||||
|
# hash() {
|
||||||
|
# docker run --rm authelia/authelia:latest authelia crypto hash generate pbkdf2 --variant sha512 --random --random.length $1 --random.charset rfc3986
|
||||||
|
# }
|
||||||
|
identity_providers:
|
||||||
|
oidc:
|
||||||
|
## The other portions of the mandatory OpenID Connect 1.0 configuration go here.
|
||||||
|
## See: https://www.authelia.com/c/oidc
|
||||||
|
clients:
|
||||||
|
- client_name: 'Gitea'
|
||||||
|
client_id: '$(rand 72)'
|
||||||
|
client_secret: '$(hash 72)'
|
||||||
|
public: false
|
||||||
|
authorization_policy: 'two_factor'
|
||||||
|
require_pkce: false
|
||||||
|
pkce_challenge_method: ''
|
||||||
|
redirect_uris:
|
||||||
|
- 'https://gitea.loadingm.xyz/user/oauth2/authelia/callback'
|
||||||
|
scopes:
|
||||||
|
- 'openid'
|
||||||
|
- 'email'
|
||||||
|
- 'profile'
|
||||||
|
response_types:
|
||||||
|
- 'code'
|
||||||
|
grant_types:
|
||||||
|
- 'authorization_code'
|
||||||
|
access_token_signed_response_alg: 'none'
|
||||||
|
userinfo_signed_response_alg: 'none'
|
||||||
|
token_endpoint_auth_method: 'client_secret_basic'
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
|
|
||||||
docker compose run --rm certbot certonly --webroot --webroot-path /var/www/certbot/ \
|
docker compose run --rm certbot certonly -v --webroot --webroot-path /var/www/certbot/ \
|
||||||
-d loadingm.xyz \
|
-d loadingm.xyz \
|
||||||
-d gitea.loadingm.xyz \
|
-d gitea.loadingm.xyz \
|
||||||
-d auth.loadingm.xyz \
|
-d auth.loadingm.xyz \
|
||||||
@@ -7,4 +7,6 @@ docker compose run --rm certbot certonly --webroot --webroot-path /var/www/certb
|
|||||||
-d jellyseerr.loadingm.xyz \
|
-d jellyseerr.loadingm.xyz \
|
||||||
-d servarr.loadingm.xyz \
|
-d servarr.loadingm.xyz \
|
||||||
-d karakeep.loadingm.xyz \
|
-d karakeep.loadingm.xyz \
|
||||||
-d ollama.loadingm.xyz
|
-d ollama.loadingm.xyz \
|
||||||
|
-d memos.loadingm.xyz \
|
||||||
|
-d gpodder.loadingm.xyz
|
||||||
|
|||||||
@@ -3,13 +3,13 @@ include:
|
|||||||
- ./jellyfin-compose.yaml
|
- ./jellyfin-compose.yaml
|
||||||
secrets:
|
secrets:
|
||||||
JWT_SECRET:
|
JWT_SECRET:
|
||||||
file: './authelia/secrets/JWT_SECRET'
|
file: '/data/authelia/secrets/JWT_SECRET'
|
||||||
SESSION_SECRET:
|
SESSION_SECRET:
|
||||||
file: './authelia/secrets/SESSION_SECRET'
|
file: '/data/authelia/secrets/SESSION_SECRET'
|
||||||
STORAGE_PASSWORD:
|
STORAGE_PASSWORD:
|
||||||
file: './authelia/secrets/STORAGE_PASSWORD'
|
file: '/data/authelia/secrets/STORAGE_PASSWORD'
|
||||||
STORAGE_ENCRYPTION_KEY:
|
STORAGE_ENCRYPTION_KEY:
|
||||||
file: './authelia/secrets/STORAGE_ENCRYPTION_KEY'
|
file: '/data/authelia/secrets/STORAGE_ENCRYPTION_KEY'
|
||||||
volumes:
|
volumes:
|
||||||
meilisearch:
|
meilisearch:
|
||||||
karakeep:
|
karakeep:
|
||||||
@@ -30,6 +30,12 @@ networks:
|
|||||||
external: false
|
external: false
|
||||||
gitea:
|
gitea:
|
||||||
external: false
|
external: false
|
||||||
|
gpodder:
|
||||||
|
external: false
|
||||||
|
memos:
|
||||||
|
external: false
|
||||||
|
mail:
|
||||||
|
external: false
|
||||||
services:
|
services:
|
||||||
web:
|
web:
|
||||||
image: "nginx"
|
image: "nginx"
|
||||||
@@ -50,6 +56,8 @@ services:
|
|||||||
- jellyfin-int
|
- jellyfin-int
|
||||||
- auth
|
- auth
|
||||||
- gitea
|
- gitea
|
||||||
|
- gpodder
|
||||||
|
- memos
|
||||||
depends_on:
|
depends_on:
|
||||||
- jellyfin
|
- jellyfin
|
||||||
- ollama-webui
|
- ollama-webui
|
||||||
@@ -57,6 +65,8 @@ services:
|
|||||||
- authelia
|
- authelia
|
||||||
- qbittorrent
|
- qbittorrent
|
||||||
- gitea
|
- gitea
|
||||||
|
- gpodder
|
||||||
|
- memos
|
||||||
logging: &logging
|
logging: &logging
|
||||||
options:
|
options:
|
||||||
max-size: "50m"
|
max-size: "50m"
|
||||||
@@ -71,18 +81,23 @@ services:
|
|||||||
- /data/certbot/www/:/var/www/certbot/:rw
|
- /data/certbot/www/:/var/www/certbot/:rw
|
||||||
- /data/certbot/conf/:/etc/letsencrypt/:rw
|
- /data/certbot/conf/:/etc/letsencrypt/:rw
|
||||||
authelia:
|
authelia:
|
||||||
container_name: 'authelia'
|
|
||||||
image: 'docker.io/authelia/authelia:latest'
|
image: 'docker.io/authelia/authelia:latest'
|
||||||
|
command:
|
||||||
|
- 'authelia'
|
||||||
|
- '--config=/config/configuration.yml'
|
||||||
|
- '--config=/data/configuration.yml'
|
||||||
restart: 'unless-stopped'
|
restart: 'unless-stopped'
|
||||||
secrets: ['JWT_SECRET', 'SESSION_SECRET', 'STORAGE_PASSWORD', 'STORAGE_ENCRYPTION_KEY']
|
secrets: ['JWT_SECRET', 'SESSION_SECRET', 'STORAGE_PASSWORD', 'STORAGE_ENCRYPTION_KEY']
|
||||||
networks:
|
networks:
|
||||||
- auth
|
- auth
|
||||||
|
- mail
|
||||||
environment:
|
environment:
|
||||||
AUTHELIA_IDENTITY_VALIDATION_RESET_PASSWORD_JWT_SECRET_FILE: '/run/secrets/JWT_SECRET'
|
AUTHELIA_IDENTITY_VALIDATION_RESET_PASSWORD_JWT_SECRET_FILE: '/run/secrets/JWT_SECRET'
|
||||||
AUTHELIA_SESSION_SECRET_FILE: '/run/secrets/SESSION_SECRET'
|
AUTHELIA_SESSION_SECRET_FILE: '/run/secrets/SESSION_SECRET'
|
||||||
AUTHELIA_STORAGE_ENCRYPTION_KEY_FILE: '/run/secrets/STORAGE_ENCRYPTION_KEY'
|
AUTHELIA_STORAGE_ENCRYPTION_KEY_FILE: '/run/secrets/STORAGE_ENCRYPTION_KEY'
|
||||||
volumes:
|
volumes:
|
||||||
- './authelia/:/config'
|
- './authelia/:/config:ro'
|
||||||
|
- '/data/authelia/:/data'
|
||||||
logging: *logging
|
logging: *logging
|
||||||
minecraft:
|
minecraft:
|
||||||
image: itzg/minecraft-server:latest
|
image: itzg/minecraft-server:latest
|
||||||
@@ -116,18 +131,24 @@ services:
|
|||||||
gitea:
|
gitea:
|
||||||
image: docker.gitea.com/gitea:1.24
|
image: docker.gitea.com/gitea:1.24
|
||||||
environment:
|
environment:
|
||||||
- USER_UID=1000
|
- USER_UID=106
|
||||||
- USER_GID=1000
|
- USER_GID=110
|
||||||
|
- ENABLE_NOTIFY_MAIL=true
|
||||||
|
# -
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
networks:
|
networks:
|
||||||
- gitea
|
- gitea
|
||||||
|
- mail
|
||||||
volumes:
|
volumes:
|
||||||
- /data/gitea/data:/data
|
- /data/gitea/data:/data
|
||||||
|
- /home/git/.ssh/:/data/git/.ssh
|
||||||
- /etc/timezone:/etc/timezone:ro
|
- /etc/timezone:/etc/timezone:ro
|
||||||
- /etc/localtime:/etc/localtime:ro
|
- /etc/localtime:/etc/localtime:ro
|
||||||
ports:
|
ports:
|
||||||
- "222:22"
|
- "222:22"
|
||||||
logging: *logging
|
logging: *logging
|
||||||
|
depends_on:
|
||||||
|
- authelia
|
||||||
gitea-runner:
|
gitea-runner:
|
||||||
image: docker.gitea.com/act_runner:latest
|
image: docker.gitea.com/act_runner:latest
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
@@ -144,6 +165,50 @@ services:
|
|||||||
logging: *logging
|
logging: *logging
|
||||||
depends_on:
|
depends_on:
|
||||||
- gitea
|
- gitea
|
||||||
|
gpodder:
|
||||||
|
image: gitea.loadingm.xyz/the10thwiz/gpodder-rs:latest
|
||||||
|
restart: unless-stopped
|
||||||
|
environment:
|
||||||
|
- ROCKET_SECRET_KEY=${GPODDER_SECRET_KEY}
|
||||||
|
networks:
|
||||||
|
- gpodder
|
||||||
|
volumes:
|
||||||
|
- /data/gpodder:/data
|
||||||
|
logging: *logging
|
||||||
|
tftp:
|
||||||
|
image: kaczmar2/tftp-server
|
||||||
|
restart: unless-stopped
|
||||||
|
environment:
|
||||||
|
- ENABLE_WEB_SERVER=false
|
||||||
|
network_mode: host
|
||||||
|
volumes:
|
||||||
|
- /data/tftp:/srv/tftp:ro
|
||||||
|
- /etc/localtime:/etc/localtime:ro
|
||||||
|
logging: *logging
|
||||||
|
memos:
|
||||||
|
image: neosmemo/memos:stable
|
||||||
|
networks:
|
||||||
|
- memos
|
||||||
|
volumes:
|
||||||
|
- /data/memos:/var/opt/memos
|
||||||
|
environment:
|
||||||
|
- MEMOS_MODE=prod
|
||||||
|
- MEMOS_PORT=5230
|
||||||
|
restart: unless-stopped
|
||||||
|
logging: *logging
|
||||||
|
mail:
|
||||||
|
image: boky/postfix
|
||||||
|
restart: unless-stopped
|
||||||
|
logging: *logging
|
||||||
|
environment:
|
||||||
|
- ALLOWED_SENDER_DOMAINS=loadingm.xyz
|
||||||
|
- POSTFIX_myhostname=mail
|
||||||
|
volumes:
|
||||||
|
- /data/mail:/etc/opendkim/keys
|
||||||
|
networks:
|
||||||
|
- mail
|
||||||
|
ports:
|
||||||
|
- 127.0.0.1:25:25
|
||||||
# calibre:
|
# calibre:
|
||||||
# image: "linuxserver/calibre-web"
|
# image: "linuxserver/calibre-web"
|
||||||
# 5d-diplomacy-frontend:
|
# 5d-diplomacy-frontend:
|
||||||
|
|||||||
@@ -45,6 +45,7 @@ runner:
|
|||||||
- "ubuntu-22.04:docker://docker.gitea.com/runner-images:ubuntu-22.04"
|
- "ubuntu-22.04:docker://docker.gitea.com/runner-images:ubuntu-22.04"
|
||||||
- "ubuntu-20.04:docker://docker.gitea.com/runner-images:ubuntu-20.04"
|
- "ubuntu-20.04:docker://docker.gitea.com/runner-images:ubuntu-20.04"
|
||||||
- "rustup-all:docker://gitea.loadingm.xyz/the10thwiz/rustup:latest"
|
- "rustup-all:docker://gitea.loadingm.xyz/the10thwiz/rustup:latest"
|
||||||
|
- "rustup-all-musl:docker://gitea.loadingm.xyz/the10thwiz/rustup:musl-latest"
|
||||||
- "rustup-stable:docker://gitea.loadingm.xyz/the10thwiz/rustup:stable"
|
- "rustup-stable:docker://gitea.loadingm.xyz/the10thwiz/rustup:stable"
|
||||||
- "rustup-beta:docker://gitea.loadingm.xyz/the10thwiz/rustup:beta"
|
- "rustup-beta:docker://gitea.loadingm.xyz/the10thwiz/rustup:beta"
|
||||||
- "rustup-nightly:docker://gitea.loadingm.xyz/the10thwiz/rustup:nightly"
|
- "rustup-nightly:docker://gitea.loadingm.xyz/the10thwiz/rustup:nightly"
|
||||||
|
|||||||
20
homelab.service
Normal file
20
homelab.service
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
[Unit]
|
||||||
|
Description=Homelab services
|
||||||
|
Requires=docker.service
|
||||||
|
After=docker.service
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Restart=always
|
||||||
|
User=root
|
||||||
|
Group=docker
|
||||||
|
TimeoutStopSec=15
|
||||||
|
WorkingDirectory=/home/matthew/homelab
|
||||||
|
# Shutdown container (if running) when unit is started
|
||||||
|
ExecStartPre=/usr/bin/docker compose -f docker-compose.yaml down
|
||||||
|
# Start container when unit is started
|
||||||
|
ExecStart=/usr/bin/docker compose -f docker-compose.yaml up
|
||||||
|
# Stop container when unit is stopped
|
||||||
|
ExecStop=/usr/bin/docker compose -f docker-compose.yaml down
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
@@ -1,7 +1,37 @@
|
|||||||
services:
|
services:
|
||||||
|
gluetun:
|
||||||
|
image: qmcgaw/gluetun
|
||||||
|
cap_add:
|
||||||
|
- NET_ADMIN
|
||||||
|
ports:
|
||||||
|
- 8080:8080
|
||||||
|
- 51820:51820
|
||||||
|
- 51820:51820/udp
|
||||||
|
- 46931:46931
|
||||||
|
- 46931:46931/udp
|
||||||
|
networks:
|
||||||
|
- jellyfin-int
|
||||||
|
environment:
|
||||||
|
- VPN_SERVICE_PROVIDER=custom
|
||||||
|
- VPN_TYPE=wireguard
|
||||||
|
- VPN_ENDPOINT_IP=${ENDPOINT_IP}
|
||||||
|
- VPN_ENDPOINT_PORT=${ENDPOINT_PORT}
|
||||||
|
- WIREGUARD_ADDRESSES=${WIREGUARD_ADDR}
|
||||||
|
- VPN_DNS_ADDRESS=${DNS_ADDRESS}
|
||||||
|
- WIREGUARD_PUBLIC_KEY=${PUBLIC_KEY}
|
||||||
|
- WIREGUARD_PRIVATE_KEY=${PRIVATE_KEY}
|
||||||
|
- VPN_PORT_FORWARDING=on
|
||||||
|
- VPN_PORT_FORWARDING_PROVIDER=protonvpn
|
||||||
|
- VPN_PORT_FORWARDING_STATUS_FILE=/tmp/gluetun/forwarded_port
|
||||||
|
- TZ=${TZ}
|
||||||
|
- UPDATER_PERIOD=24h
|
||||||
|
restart: always
|
||||||
|
volumes:
|
||||||
|
- /data/jellyfin:/data/jellyfin
|
||||||
|
- /data/jellyfin/gluetun:/tmp/gluetun
|
||||||
qbittorrent:
|
qbittorrent:
|
||||||
image: lscr.io/linuxserver/qbittorrent:latest
|
image: lscr.io/linuxserver/qbittorrent:latest
|
||||||
container_name: qbittorrent
|
network_mode: service:gluetun
|
||||||
environment:
|
environment:
|
||||||
- WEBUI_PORT=8080
|
- WEBUI_PORT=8080
|
||||||
- PUID=0
|
- PUID=0
|
||||||
@@ -12,16 +42,17 @@ services:
|
|||||||
- /data/jellyfin:/data/jellyfin
|
- /data/jellyfin:/data/jellyfin
|
||||||
- /data/jellyfin/configs/qbittorrent:/config
|
- /data/jellyfin/configs/qbittorrent:/config
|
||||||
# - /data/jellyfin/qbittorrent/downloads:/data/jellyfin/qbittorrent/downloads
|
# - /data/jellyfin/qbittorrent/downloads:/data/jellyfin/qbittorrent/downloads
|
||||||
ports:
|
# ports:
|
||||||
- 8080:8080
|
# - 8080:8080
|
||||||
- 6881:6881
|
# - 6881:6881
|
||||||
- 6881:6881/udp
|
# - 6881:6881/udp
|
||||||
networks:
|
# networks:
|
||||||
- jellyfin-int
|
# - jellyfin-int
|
||||||
|
depends_on:
|
||||||
|
- gluetun
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
flaresolverr:
|
flaresolverr:
|
||||||
image: ghcr.io/flaresolverr/flaresolverr:latest
|
image: ghcr.io/flaresolverr/flaresolverr:latest
|
||||||
container_name: flaresolverr
|
|
||||||
environment:
|
environment:
|
||||||
- LOG_LEVEL=${LOG_LEVEL:-info}
|
- LOG_LEVEL=${LOG_LEVEL:-info}
|
||||||
- LOG_HTML=${LOG_HTML:-false}
|
- LOG_HTML=${LOG_HTML:-false}
|
||||||
@@ -36,7 +67,6 @@ services:
|
|||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
prowlarr:
|
prowlarr:
|
||||||
image: lscr.io/linuxserver/prowlarr:latest
|
image: lscr.io/linuxserver/prowlarr:latest
|
||||||
container_name: prowlarr
|
|
||||||
environment:
|
environment:
|
||||||
- PUID=0
|
- PUID=0
|
||||||
- PGID=0
|
- PGID=0
|
||||||
@@ -50,7 +80,6 @@ services:
|
|||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
jackett:
|
jackett:
|
||||||
image: lscr.io/linuxserver/jackett:latest
|
image: lscr.io/linuxserver/jackett:latest
|
||||||
container_name: jackett
|
|
||||||
environment:
|
environment:
|
||||||
- PUID=0
|
- PUID=0
|
||||||
- PGID=0
|
- PGID=0
|
||||||
@@ -64,7 +93,6 @@ services:
|
|||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
sonarr:
|
sonarr:
|
||||||
image: lscr.io/linuxserver/sonarr:latest
|
image: lscr.io/linuxserver/sonarr:latest
|
||||||
container_name: sonarr
|
|
||||||
environment:
|
environment:
|
||||||
- PUID=0
|
- PUID=0
|
||||||
- PGID=0
|
- PGID=0
|
||||||
@@ -81,7 +109,6 @@ services:
|
|||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
radarr:
|
radarr:
|
||||||
image: lscr.io/linuxserver/radarr:latest
|
image: lscr.io/linuxserver/radarr:latest
|
||||||
container_name: radarr
|
|
||||||
environment:
|
environment:
|
||||||
- PUID=0
|
- PUID=0
|
||||||
- PGID=0
|
- PGID=0
|
||||||
@@ -98,7 +125,6 @@ services:
|
|||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
jellyfin:
|
jellyfin:
|
||||||
image: lscr.io/linuxserver/jellyfin:latest
|
image: lscr.io/linuxserver/jellyfin:latest
|
||||||
container_name: jellyfin
|
|
||||||
environment:
|
environment:
|
||||||
- PUID=0
|
- PUID=0
|
||||||
- PGID=0
|
- PGID=0
|
||||||
@@ -121,17 +147,20 @@ services:
|
|||||||
- /data/jellyfin/radarr/movies:/data/movies
|
- /data/jellyfin/radarr/movies:/data/movies
|
||||||
- /data/jellyfin/qbittorrent/downloads:/data/media_downloads
|
- /data/jellyfin/qbittorrent/downloads:/data/media_downloads
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
runtime: nvidia
|
group_add:
|
||||||
deploy:
|
- '993'
|
||||||
resources:
|
devices:
|
||||||
reservations:
|
- /dev/dri/renderD128:/dev/dri/renderD128
|
||||||
devices:
|
# runtime: nvidia
|
||||||
- driver: nvidia
|
# deploy:
|
||||||
count: all
|
# resources:
|
||||||
capabilities: [gpu]
|
# reservations:
|
||||||
|
# devices:
|
||||||
|
# - driver: intel
|
||||||
|
# count: all
|
||||||
|
# capabilities: [gpu]
|
||||||
jellyseerr:
|
jellyseerr:
|
||||||
image: fallenbagel/jellyseerr:latest
|
image: fallenbagel/jellyseerr:latest
|
||||||
container_name: jellyseerr
|
|
||||||
environment:
|
environment:
|
||||||
- LOG_LEVEL=debug
|
- LOG_LEVEL=debug
|
||||||
- TZ=${TZ}
|
- TZ=${TZ}
|
||||||
|
|||||||
@@ -56,7 +56,6 @@ services:
|
|||||||
volumes:
|
volumes:
|
||||||
- .:/code
|
- .:/code
|
||||||
- /data/library/ollama/ollama:/root/.ollama
|
- /data/library/ollama/ollama:/root/.ollama
|
||||||
container_name: ollama
|
|
||||||
pull_policy: always
|
pull_policy: always
|
||||||
tty: true
|
tty: true
|
||||||
restart: always
|
restart: always
|
||||||
@@ -69,7 +68,6 @@ services:
|
|||||||
|
|
||||||
ollama-webui:
|
ollama-webui:
|
||||||
image: ghcr.io/open-webui/open-webui:main
|
image: ghcr.io/open-webui/open-webui:main
|
||||||
container_name: ollama-webui
|
|
||||||
volumes:
|
volumes:
|
||||||
- /data/library/ollama/ollama-webui:/app/backend/data
|
- /data/library/ollama/ollama-webui:/app/backend/data
|
||||||
depends_on:
|
depends_on:
|
||||||
|
|||||||
80
nginx/sites-enabled/gpodder
Normal file
80
nginx/sites-enabled/gpodder
Normal file
@@ -0,0 +1,80 @@
|
|||||||
|
##
|
||||||
|
# You should look at the following URL's in order to grasp a solid understanding
|
||||||
|
# of Nginx configuration files in order to fully unleash the power of Nginx.
|
||||||
|
# https://www.nginx.com/resources/wiki/start/
|
||||||
|
# https://www.nginx.com/resources/wiki/start/topics/tutorials/config_pitfalls/
|
||||||
|
# https://wiki.debian.org/Nginx/DirectoryStructure
|
||||||
|
#
|
||||||
|
# In most cases, administrators will remove this file from sites-enabled/ and
|
||||||
|
# leave it as reference inside of sites-available where it will continue to be
|
||||||
|
# updated by the nginx packaging team.
|
||||||
|
#
|
||||||
|
# This file will automatically load configuration files provided by other
|
||||||
|
# applications, such as Drupal or Wordpress. These applications will be made
|
||||||
|
# available underneath a path with that package name, such as /drupal8.
|
||||||
|
#
|
||||||
|
# Please see /usr/share/doc/nginx-doc/examples/ for more detailed examples.
|
||||||
|
##
|
||||||
|
|
||||||
|
server {
|
||||||
|
listen 80;
|
||||||
|
listen [::]:80;
|
||||||
|
server_name gpodder.loadingm.xyz;
|
||||||
|
|
||||||
|
location /.well-known/acme-challenge/ {
|
||||||
|
root /var/www/certbot;
|
||||||
|
}
|
||||||
|
|
||||||
|
# Uncomment to redirect HTTP to HTTPS
|
||||||
|
location / {
|
||||||
|
return 301 https://$host$request_uri;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Default server configuration
|
||||||
|
#
|
||||||
|
server {
|
||||||
|
|
||||||
|
# SSL configuration
|
||||||
|
listen 443 ssl;
|
||||||
|
listen [::]:443 ssl;
|
||||||
|
http2 on;
|
||||||
|
|
||||||
|
server_name gpodder.loadingm.xyz;
|
||||||
|
|
||||||
|
ssl_certificate /etc/letsencrypt/live/loadingm.xyz/fullchain.pem;
|
||||||
|
ssl_certificate_key /etc/letsencrypt/live/loadingm.xyz/privkey.pem;
|
||||||
|
# include /etc/letsencrypt/options-ssl-nginx.conf;
|
||||||
|
# ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
|
||||||
|
ssl_trusted_certificate /etc/letsencrypt/live/loadingm.xyz/chain.pem;
|
||||||
|
|
||||||
|
# Security / XSS Mitigation Headers
|
||||||
|
add_header X-Content-Type-Options "nosniff";
|
||||||
|
|
||||||
|
# Permissions policy. May cause issues with some clients
|
||||||
|
add_header Permissions-Policy "accelerometer=(), ambient-light-sensor=(), battery=(), bluetooth=(), camera=(), clipboard-read=(), display-capture=(), document-domain=(), encrypted-media=(), gamepad=(), geolocation=(), gyroscope=(), hid=(), idle-detection=(), interest-cohort=(), keyboard-map=(), local-fonts=(), magnetometer=(), microphone=(), payment=(), publickey-credentials-get=(), serial=(), sync-xhr=(), usb=(), xr-spatial-tracking=()" always;
|
||||||
|
|
||||||
|
# Content Security Policy
|
||||||
|
# See: https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP
|
||||||
|
# Enforces https content and restricts JS/CSS to origin
|
||||||
|
# External Javascript (such as cast_sender.js for Chromecast) must be whitelisted.
|
||||||
|
add_header Content-Security-Policy "default-src https: data: blob: ; img-src 'self' https://* ; style-src 'self' 'unsafe-inline'; script-src 'self' 'unsafe-inline' https://www.gstatic.com https://www.youtube.com blob:; worker-src 'self' blob:; connect-src 'self'; object-src 'none'; frame-ancestors 'self'; font-src 'self'";
|
||||||
|
|
||||||
|
location /.well-known/acme-challenge/ {
|
||||||
|
root /var/www/certbot;
|
||||||
|
}
|
||||||
|
|
||||||
|
location / {
|
||||||
|
# Proxy main karakeep traffic
|
||||||
|
proxy_pass http://gpodder:8000;
|
||||||
|
proxy_set_header Host $host;
|
||||||
|
proxy_set_header X-Real-IP $remote_addr;
|
||||||
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||||
|
proxy_set_header X-Forwarded-Proto $scheme;
|
||||||
|
proxy_set_header X-Forwarded-Protocol $scheme;
|
||||||
|
proxy_set_header X-Forwarded-Host $http_host;
|
||||||
|
|
||||||
|
# Disable buffering when the nginx proxy gets very resource heavy upon streaming
|
||||||
|
proxy_buffering off;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -40,7 +40,17 @@ server {
|
|||||||
# See: https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP
|
# See: https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP
|
||||||
# Enforces https content and restricts JS/CSS to origin
|
# Enforces https content and restricts JS/CSS to origin
|
||||||
# External Javascript (such as cast_sender.js for Chromecast) must be whitelisted.
|
# External Javascript (such as cast_sender.js for Chromecast) must be whitelisted.
|
||||||
add_header Content-Security-Policy "default-src https: data: blob: ; img-src 'self' https://* ; style-src 'self' 'unsafe-inline'; script-src 'self' 'unsafe-inline' https://www.gstatic.com https://www.youtube.com blob:; worker-src 'self' blob:; connect-src 'self'; object-src 'none'; frame-ancestors 'self'; font-src 'self'";
|
set $CSP "default-src https: data: blob:";
|
||||||
|
set $CSP "$CSP; img-src 'self' https://* data:";
|
||||||
|
set $CSP "$CSP; style-src 'self' 'unsafe-inline' data:";
|
||||||
|
set $CSP "$CSP; style-src-elem 'self' 'unsafe-inline' data:";
|
||||||
|
set $CSP "$CSP; script-src 'self' 'unsafe-inline' https://www.gstatic.com https://www.youtubse.com blob: data:";
|
||||||
|
set $CSP "$CSP; worker-src 'self' blob: data:";
|
||||||
|
set $CSP "$CSP; connect-src 'self' data:";
|
||||||
|
set $CSP "$CSP; object-src 'none' data:";
|
||||||
|
set $CSP "$CSP; frame-ancestors 'self' data:";
|
||||||
|
set $CSP "$CSP; font-src 'self' data:";
|
||||||
|
add_header Content-Security-Policy $CSP;
|
||||||
|
|
||||||
location /.well-known/acme-challenge/ {
|
location /.well-known/acme-challenge/ {
|
||||||
root /var/www/certbot;
|
root /var/www/certbot;
|
||||||
@@ -55,6 +65,7 @@ server {
|
|||||||
proxy_set_header X-Forwarded-Proto $scheme;
|
proxy_set_header X-Forwarded-Proto $scheme;
|
||||||
proxy_set_header X-Forwarded-Protocol $scheme;
|
proxy_set_header X-Forwarded-Protocol $scheme;
|
||||||
proxy_set_header X-Forwarded-Host $http_host;
|
proxy_set_header X-Forwarded-Host $http_host;
|
||||||
|
proxy_hide_header Content-Security-Policy;
|
||||||
|
|
||||||
# Disable buffering when the nginx proxy gets very resource heavy upon streaming
|
# Disable buffering when the nginx proxy gets very resource heavy upon streaming
|
||||||
proxy_buffering off;
|
proxy_buffering off;
|
||||||
|
|||||||
62
nginx/sites-enabled/memos
Normal file
62
nginx/sites-enabled/memos
Normal file
@@ -0,0 +1,62 @@
|
|||||||
|
server {
|
||||||
|
listen 80;
|
||||||
|
listen [::]:80;
|
||||||
|
server_name memos.loadingm.xyz;
|
||||||
|
|
||||||
|
location /.well-known/acme-challenge/ {
|
||||||
|
root /var/www/certbot;
|
||||||
|
}
|
||||||
|
|
||||||
|
# Uncomment to redirect HTTP to HTTPS
|
||||||
|
location / {
|
||||||
|
return 301 https://$host$request_uri;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
server {
|
||||||
|
# Nginx versions 1.25+
|
||||||
|
listen 443 ssl;
|
||||||
|
listen [::]:443 ssl;
|
||||||
|
http2 on;
|
||||||
|
|
||||||
|
server_name memos.loadingm.xyz;
|
||||||
|
|
||||||
|
## The default `client_max_body_size` is 1M, this might not be enough for some posters, etc.
|
||||||
|
client_max_body_size 200G;
|
||||||
|
|
||||||
|
ssl_certificate /etc/letsencrypt/live/loadingm.xyz/fullchain.pem;
|
||||||
|
ssl_certificate_key /etc/letsencrypt/live/loadingm.xyz/privkey.pem;
|
||||||
|
# include /etc/letsencrypt/options-ssl-nginx.conf;
|
||||||
|
# ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
|
||||||
|
ssl_trusted_certificate /etc/letsencrypt/live/loadingm.xyz/chain.pem;
|
||||||
|
|
||||||
|
# Security / XSS Mitigation Headers
|
||||||
|
add_header X-Content-Type-Options "nosniff";
|
||||||
|
|
||||||
|
# Permissions policy. May cause issues with some clients
|
||||||
|
add_header Permissions-Policy "accelerometer=(), ambient-light-sensor=(), battery=(), bluetooth=(), camera=(), clipboard-read=(), display-capture=(), document-domain=(), encrypted-media=(), gamepad=(), geolocation=(), gyroscope=(), hid=(), idle-detection=(), interest-cohort=(), keyboard-map=(), local-fonts=(), magnetometer=(), microphone=(), payment=(), publickey-credentials-get=(), serial=(), sync-xhr=(), usb=(), xr-spatial-tracking=()" always;
|
||||||
|
|
||||||
|
# Content Security Policy
|
||||||
|
# See: https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP
|
||||||
|
# Enforces https content and restricts JS/CSS to origin
|
||||||
|
# External Javascript (such as cast_sender.js for Chromecast) must be whitelisted.
|
||||||
|
add_header Content-Security-Policy "default-src https: data: blob: ; img-src 'self' https://* ; style-src 'self' 'unsafe-inline'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https://www.gstatic.com https://www.youtube.com blob:; worker-src 'self' blob:; connect-src 'self'; object-src 'none'; frame-ancestors 'self'; font-src 'self'";
|
||||||
|
|
||||||
|
location /.well-known/acme-challenge/ {
|
||||||
|
root /var/www/certbot;
|
||||||
|
}
|
||||||
|
|
||||||
|
location / {
|
||||||
|
# Proxy main karakeep traffic
|
||||||
|
proxy_pass http://memos:5230;
|
||||||
|
proxy_set_header Host $host;
|
||||||
|
proxy_set_header X-Real-IP $remote_addr;
|
||||||
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||||
|
proxy_set_header X-Forwarded-Proto $scheme;
|
||||||
|
proxy_set_header X-Forwarded-Protocol $scheme;
|
||||||
|
proxy_set_header X-Forwarded-Host $http_host;
|
||||||
|
|
||||||
|
# Disable buffering when the nginx proxy gets very resource heavy upon streaming
|
||||||
|
proxy_buffering off;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -13,7 +13,8 @@ server {
|
|||||||
location /qbt/ {
|
location /qbt/ {
|
||||||
# include /etc/nginx/snippets/proxy.conf;
|
# include /etc/nginx/snippets/proxy.conf;
|
||||||
include /etc/nginx/snippets/authelia-authrequest.conf;
|
include /etc/nginx/snippets/authelia-authrequest.conf;
|
||||||
proxy_pass http://qbittorrent:8080/;
|
# proxy_pass http://qbittorrent:8080/;
|
||||||
|
proxy_pass http://gluetun:8080/;
|
||||||
proxy_http_version 1.1;
|
proxy_http_version 1.1;
|
||||||
proxy_set_header Host $proxy_host;
|
proxy_set_header Host $proxy_host;
|
||||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||||
|
|||||||
Reference in New Issue
Block a user