Compare commits
95 Commits
a953071dbb
...
main
Author | SHA1 | Date | |
---|---|---|---|
8488001461 | |||
34020ece2f | |||
74e451fdf2 | |||
4fba524f00 | |||
258c204163 | |||
78e524d61c | |||
724c6056f4 | |||
fe1d9d5a5b | |||
924dd25b42 | |||
a9fead8950 | |||
20c6e2e223 | |||
42fe309722 | |||
48d89faaee | |||
![]() |
5ca6236450 | ||
![]() |
cae7ef2ed6 | ||
c28ad9632b | |||
![]() |
3dda03eee0 | ||
![]() |
ea305d6b04 | ||
5e67277ab5 | |||
b3361c697f | |||
e66e518eef | |||
1de5d814db | |||
4feed08d9d | |||
be60210294 | |||
70eb3e0432 | |||
b65a887720 | |||
63f19bcab7 | |||
c67e052225 | |||
a1dbc3053b | |||
502486efb7 | |||
db3998f36e | |||
e607c7a914 | |||
912ca6072d | |||
d8322be853 | |||
9c5d06a7d9 | |||
4f446c9360 | |||
a98e483cf8 | |||
706bbc2ebf | |||
0c6ac285c3 | |||
d9d3a2193e | |||
1ef6b80b6e | |||
18e88f0aba | |||
d886f7b563 | |||
c2053375b1 | |||
f3f9b0494b | |||
13fae7d8fb | |||
1de0cb3d7a | |||
0467abeb28 | |||
a42bd5b5aa | |||
e67e637d0d | |||
0369eb123e | |||
3f9646c62d | |||
e8372b1b42 | |||
520f645798 | |||
bb77431fd1 | |||
51fc175a54 | |||
a6932ac724 | |||
da397a0ca2 | |||
87a4c1fad9 | |||
e9eddf15e3 | |||
b39f777252 | |||
36f3ae7d59 | |||
f89c69d17b | |||
98faa391f0 | |||
d2789c07aa | |||
8b1564fb1f | |||
9505e9d4d9 | |||
7eed7a6374 | |||
569e9e4e70 | |||
6bff22d52f | |||
4d2fdae7d5 | |||
53393c1d20 | |||
25e630bddb | |||
f9928defd1 | |||
8c0d15ab8b | |||
271fb8709e | |||
619a9e6294 | |||
3cf2c8726b | |||
7c59cc9dc7 | |||
ffa423dfe2 | |||
f9d4c0647e | |||
dbe033daa4 | |||
80baa059ce | |||
611db63535 | |||
a4db908a18 | |||
81b2788651 | |||
8025390bc1 | |||
0626b1f939 | |||
60b9938484 | |||
ce8d530592 | |||
087af75a42 | |||
976147a09b | |||
e9220c76da | |||
aa5cae0e83 | |||
b5df81f2ad |
4
.gitignore
vendored
@@ -1,2 +1,4 @@
|
||||
/private
|
||||
.env
|
||||
.env
|
||||
/private_volume/*
|
||||
!.gitkeep
|
||||
|
@@ -26,7 +26,9 @@ Edit the generated `.env` files to fill in the required fields:
|
||||
- `./sftpgo/.env`
|
||||
- `./vaultwarden/.env`
|
||||
- `./wg_easy/.env`
|
||||
- `./ghost/.env`
|
||||
- `./caddy/.env`
|
||||
- `./caddy/Caddyfile.private`
|
||||
|
||||
### 4. Start Services
|
||||
Launch all services with the following command:
|
||||
|
@@ -1,3 +1,8 @@
|
||||
############# Grafana #############
|
||||
GRAFANA_DOMAIN=
|
||||
GRAFANA_CRT=
|
||||
GRAFANA_KEY=
|
||||
|
||||
############# Gitea #############
|
||||
GITEA_DOMAIN=
|
||||
GITEA_CRT=
|
||||
@@ -26,7 +31,22 @@ VAULTWARDEN_KEY=
|
||||
############# Sftpgo #############
|
||||
SFTPGO_DOMAIN=
|
||||
|
||||
############# Searxng #############
|
||||
SEARXNG_DOMAIN=
|
||||
SEARXNG_CRT=
|
||||
SEARXNG_KEY=
|
||||
############# Glance #############
|
||||
GLANCE_DOMAIN=
|
||||
GLANCE_CRT=
|
||||
GLANCE_KEY=
|
||||
|
||||
############# Ghost #############
|
||||
GHOST_DOMAIN=
|
||||
GHOST_CRT=
|
||||
GHOST_KEY=
|
||||
|
||||
############# Immich #############
|
||||
IMMICH_DOMAIN=
|
||||
IMMICH_CRT=
|
||||
IMMICH_KEY=
|
||||
|
||||
############# Uptime Kuma #############
|
||||
UPTIME_KUMA_DOMAIN=
|
||||
UPTIME_KUMA_CRT=
|
||||
UPTIME_KUMA_KEY=
|
||||
|
6
caddy/.gitignore
vendored
@@ -1,2 +1,6 @@
|
||||
/ssl/*
|
||||
!.gitkeep
|
||||
/data/*
|
||||
/data/config/*
|
||||
!/data/config/
|
||||
!.gitkeep
|
||||
Caddyfile.private
|
||||
|
184
caddy/Caddyfile
@@ -1,5 +1,28 @@
|
||||
{
|
||||
admin off
|
||||
metrics {
|
||||
per_host
|
||||
}
|
||||
}
|
||||
|
||||
:2019 {
|
||||
metrics
|
||||
}
|
||||
|
||||
############## grafana ##############
|
||||
{$GRAFANA_DOMAIN} {
|
||||
tls /etc/ssl/custom/{$GRAFANA_CRT} /etc/ssl/custom/{$GRAFANA_KEY}
|
||||
|
||||
request_body {
|
||||
max_size 2048MB
|
||||
}
|
||||
|
||||
reverse_proxy http://grafana:3000 {
|
||||
header_up X-Real-IP {http.request.header.Cf-Connecting-Ip}
|
||||
header_up X-Forwarded-For {http.request.header.Cf-Connecting-Ip}
|
||||
header_up X-Country-Code {http.request.header.Cf-Ipcountry}
|
||||
header_up -CF-*
|
||||
}
|
||||
}
|
||||
|
||||
############## gitea ##############
|
||||
@@ -39,7 +62,7 @@
|
||||
tls /etc/ssl/custom/{$MEMOS_CRT} /etc/ssl/custom/{$MEMOS_KEY}
|
||||
|
||||
request_body {
|
||||
max_size 128MB
|
||||
max_size 1024MB
|
||||
}
|
||||
|
||||
reverse_proxy http://memos:5230 {
|
||||
@@ -96,101 +119,76 @@
|
||||
}
|
||||
}
|
||||
|
||||
############## searxng ##############
|
||||
{$SEARXNG_DOMAIN} {
|
||||
tls /etc/ssl/custom/{$SEARXNG_CRT} /etc/ssl/custom/{$SEARXNG_KEY}
|
||||
############## glance ##############
|
||||
{$GLANCE_DOMAIN} {
|
||||
tls /etc/ssl/custom/{$GLANCE_CRT} /etc/ssl/custom/{$GLANCE_KEY}
|
||||
|
||||
request_body {
|
||||
max_size 128MB
|
||||
max_size 64MB
|
||||
}
|
||||
|
||||
@api {
|
||||
path /config
|
||||
path /healthz
|
||||
path /stats/errors
|
||||
path /stats/checker
|
||||
}
|
||||
|
||||
@static {
|
||||
path /static/*
|
||||
}
|
||||
|
||||
@notstatic {
|
||||
not path /static/*
|
||||
}
|
||||
|
||||
@imageproxy {
|
||||
path /image_proxy
|
||||
}
|
||||
|
||||
@notimageproxy {
|
||||
not path /image_proxy
|
||||
}
|
||||
|
||||
header {
|
||||
# Enable HTTP Strict Transport Security (HSTS) to force clients to always connect via HTTPS
|
||||
Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
|
||||
|
||||
# Enable cross-site filter (XSS) and tell browser to block detected attacks
|
||||
X-XSS-Protection "1; mode=block"
|
||||
|
||||
# Prevent some browsers from MIME-sniffing a response away from the declared Content-Type
|
||||
X-Content-Type-Options "nosniff"
|
||||
|
||||
# Disable some features
|
||||
Permissions-Policy "accelerometer=(),ambient-light-sensor=(),autoplay=(),camera=(),encrypted-media=(),focus-without-user-activation=(),geolocation=(),gyroscope=(),magnetometer=(),microphone=(),midi=(),payment=(),picture-in-picture=(),speaker=(),sync-xhr=(),usb=(),vr=()"
|
||||
|
||||
# Disable some features (legacy)
|
||||
Feature-Policy "accelerometer 'none';ambient-light-sensor 'none'; autoplay 'none';camera 'none';encrypted-media 'none';focus-without-user-activation 'none'; geolocation 'none';gyroscope 'none';magnetometer 'none';microphone 'none';midi 'none';payment 'none';picture-in-picture 'none'; speaker 'none';sync-xhr 'none';usb 'none';vr 'none'"
|
||||
|
||||
# Referer
|
||||
Referrer-Policy "no-referrer"
|
||||
|
||||
# X-Robots-Tag
|
||||
X-Robots-Tag "noindex, noarchive, nofollow"
|
||||
|
||||
# Remove Server header
|
||||
-Server
|
||||
}
|
||||
|
||||
header @api {
|
||||
Access-Control-Allow-Methods "GET, OPTIONS"
|
||||
Access-Control-Allow-Origin "*"
|
||||
}
|
||||
|
||||
# Cache
|
||||
header @static {
|
||||
# Cache
|
||||
Cache-Control "public, max-age=31536000"
|
||||
defer
|
||||
}
|
||||
|
||||
header @notstatic {
|
||||
# No Cache
|
||||
Cache-Control "no-cache, no-store"
|
||||
Pragma "no-cache"
|
||||
}
|
||||
|
||||
# CSP (see http://content-security-policy.com/ )
|
||||
header @imageproxy {
|
||||
Content-Security-Policy "default-src 'none'; img-src 'self' data:"
|
||||
}
|
||||
|
||||
header @notimageproxy {
|
||||
Content-Security-Policy "upgrade-insecure-requests; default-src 'none'; script-src 'self'; style-src 'self' 'unsafe-inline'; form-action 'self' https://github.com/searxng/searxng/issues/new; font-src 'self'; frame-ancestors 'self'; base-uri 'self'; connect-src 'self' https://overpass-api.de; img-src 'self' data: https://*.tile.openstreetmap.org; frame-src https://www.youtube-nocookie.com https://player.vimeo.com https://www.dailymotion.com https://www.deezer.com https://www.mixcloud.com https://w.soundcloud.com https://embed.spotify.com"
|
||||
}
|
||||
|
||||
# SearXNG
|
||||
handle {
|
||||
encode zstd gzip
|
||||
|
||||
reverse_proxy searxng:8080 {
|
||||
header_up X-Forwarded-Port {http.request.port}
|
||||
header_up X-Forwarded-Proto {http.request.scheme}
|
||||
header_up X-Real-IP {http.request.header.Cf-Connecting-Ip}
|
||||
header_up X-Forwarded-For {http.request.header.Cf-Connecting-Ip}
|
||||
header_up X-Country-Code {http.request.header.Cf-Ipcountry}
|
||||
header_up -CF-*
|
||||
}
|
||||
reverse_proxy http://glance:8080 {
|
||||
header_up X-Real-IP {http.request.header.Cf-Connecting-Ip}
|
||||
header_up X-Forwarded-For {http.request.header.Cf-Connecting-Ip}
|
||||
header_up X-Country-Code {http.request.header.Cf-Ipcountry}
|
||||
header_up -CF-*
|
||||
}
|
||||
}
|
||||
|
||||
############## ghost ##############
|
||||
{$GHOST_DOMAIN} {
|
||||
tls /etc/ssl/custom/{$GHOST_CRT} /etc/ssl/custom/{$GHOST_KEY}
|
||||
|
||||
request_body {
|
||||
max_size 124MB
|
||||
}
|
||||
|
||||
reverse_proxy http://ghost:2368 {
|
||||
header_up X-Real-IP {http.request.header.Cf-Connecting-Ip}
|
||||
header_up X-Forwarded-For {http.request.header.Cf-Connecting-Ip}
|
||||
header_up X-Country-Code {http.request.header.Cf-Ipcountry}
|
||||
header_up X-Forwarded-Proto {http.request.scheme}
|
||||
header_up Host {http.request.host}
|
||||
header_up -CF-*
|
||||
}
|
||||
}
|
||||
|
||||
############## immich ##############
|
||||
{$IMMICH_DOMAIN} {
|
||||
tls /etc/ssl/custom/{$IMMICH_CRT} /etc/ssl/custom/{$IMMICH_KEY}
|
||||
|
||||
request_body {
|
||||
max_size 1024MB
|
||||
}
|
||||
|
||||
reverse_proxy http://immich_server:2283 {
|
||||
header_up X-Real-IP {http.request.header.Cf-Connecting-Ip}
|
||||
header_up X-Forwarded-For {http.request.header.Cf-Connecting-Ip}
|
||||
header_up X-Country-Code {http.request.header.Cf-Ipcountry}
|
||||
header_up X-Forwarded-Proto {http.request.scheme}
|
||||
header_up Host {http.request.host}
|
||||
header_up -CF-*
|
||||
}
|
||||
}
|
||||
|
||||
############## uptime-kuma ##############
|
||||
{$UPTIME_KUMA_DOMAIN} {
|
||||
tls /etc/ssl/custom/{$UPTIME_KUMA_CRT} /etc/ssl/custom/{$UPTIME_KUMA_KEY}
|
||||
|
||||
request_body {
|
||||
max_size 1024MB
|
||||
}
|
||||
|
||||
reverse_proxy http://uptime_kuma:3001 {
|
||||
header_up X-Real-IP {http.request.header.Cf-Connecting-Ip}
|
||||
header_up X-Forwarded-For {http.request.header.Cf-Connecting-Ip}
|
||||
header_up X-Country-Code {http.request.header.Cf-Ipcountry}
|
||||
header_up X-Forwarded-Proto {http.request.scheme}
|
||||
header_up Host {http.request.host}
|
||||
header_up -CF-*
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
import Caddyfile.private
|
||||
|
1
caddy/Caddyfile.private.example
Normal file
@@ -0,0 +1 @@
|
||||
# Private Caddy config
|
@@ -1,6 +1,12 @@
|
||||
networks:
|
||||
caddy:
|
||||
name: caddy
|
||||
driver: bridge
|
||||
external: true
|
||||
|
||||
services:
|
||||
caddy:
|
||||
image: caddy:2.8.4
|
||||
image: caddy:2.10.0-alpine
|
||||
container_name: caddy
|
||||
restart: unless-stopped
|
||||
networks:
|
||||
@@ -11,12 +17,10 @@ services:
|
||||
- "443:443/udp"
|
||||
volumes:
|
||||
- ./Caddyfile:/etc/caddy/Caddyfile
|
||||
- ./Caddyfile.private:/etc/caddy/Caddyfile.private
|
||||
- ./ssl:/etc/ssl/custom/
|
||||
- ./data/data:/data
|
||||
- ./data/config:/config
|
||||
- ../private_volume:/private_volume
|
||||
env_file:
|
||||
- ./.env
|
||||
|
||||
networks:
|
||||
caddy:
|
||||
name: caddy
|
||||
driver: bridge
|
||||
external: true
|
||||
|
7
ghost/.env.example
Normal file
@@ -0,0 +1,7 @@
|
||||
URL=
|
||||
MAIL_HOST=
|
||||
MAIL_PORT=465
|
||||
MAIL_SECURE=true
|
||||
MAIL_USERNAME=
|
||||
MAIL_PASSWORD=
|
||||
MAIL_FROM=
|
2
ghost/.gitignore
vendored
Normal file
@@ -0,0 +1,2 @@
|
||||
/data/*
|
||||
!.gitkeep
|
0
ghost/data/.gitkeep
Normal file
31
ghost/docker-compose.yml
Normal file
@@ -0,0 +1,31 @@
|
||||
networks:
|
||||
caddy:
|
||||
name: caddy
|
||||
driver: bridge
|
||||
external: true
|
||||
|
||||
services:
|
||||
ghost:
|
||||
image: ghost:6-alpine
|
||||
container_name: ghost
|
||||
restart: unless-stopped
|
||||
networks:
|
||||
- caddy
|
||||
environment:
|
||||
# DB
|
||||
database__client: sqlite3
|
||||
database__connection__filename: content/data/ghost.db
|
||||
# App
|
||||
NODE_ENV: production
|
||||
url: ${URL}
|
||||
# Mail
|
||||
mail__options__host: ${MAIL_HOST}
|
||||
mail__options__port: ${MAIL_PORT}
|
||||
mail__options__secure: ${MAIL_SECURE}
|
||||
mail__options__auth__user: ${MAIL_USERNAME}
|
||||
mail__options__auth__pass: ${MAIL_PASSWORD}
|
||||
mail__from: ${MAIL_FROM}
|
||||
mail__options__service: SMTP
|
||||
mail__transport: SMTP
|
||||
volumes:
|
||||
- ./data:/var/lib/ghost/content
|
3
gitea/.gitignore
vendored
@@ -1,3 +1,4 @@
|
||||
/data/*
|
||||
/act-data/*
|
||||
!.gitkeep
|
||||
!/act-data/config.yaml
|
||||
!.gitkeep
|
||||
|
3
gitea/act-data/config.yaml
Normal file
@@ -0,0 +1,3 @@
|
||||
container:
|
||||
network: gitea
|
||||
options: ""
|
@@ -1,6 +1,6 @@
|
||||
networks:
|
||||
gitea:
|
||||
external: false
|
||||
external: true
|
||||
caddy:
|
||||
name: caddy
|
||||
driver: bridge
|
||||
@@ -8,7 +8,7 @@ networks:
|
||||
|
||||
services:
|
||||
server:
|
||||
image: gitea/gitea:1.22.6
|
||||
image: gitea/gitea:1.24.3
|
||||
container_name: gitea
|
||||
environment:
|
||||
- USER_UID=${USER_UID}
|
||||
@@ -21,6 +21,10 @@ services:
|
||||
- ./data:/data
|
||||
- /etc/timezone:/etc/timezone:ro
|
||||
- /etc/localtime:/etc/localtime:ro
|
||||
deploy:
|
||||
resources:
|
||||
limits:
|
||||
memory: 1G
|
||||
|
||||
act:
|
||||
image: gitea/act_runner:0.2.11
|
||||
@@ -30,6 +34,7 @@ services:
|
||||
- GITEA_INSTANCE_URL=${GITEA_INSTANCE_URL}
|
||||
- GITEA_RUNNER_REGISTRATION_TOKEN=${GITEA_RUNNER_REGISTRATION_TOKEN}
|
||||
- GITEA_RUNNER_NAME=${GITEA_RUNNER_NAME}
|
||||
- CONFIG_FILE=/data/config.yaml
|
||||
networks:
|
||||
- gitea
|
||||
volumes:
|
||||
|
3
glance/.env.example
Normal file
@@ -0,0 +1,3 @@
|
||||
GITHUB_TOKEN=
|
||||
SECRET_KEY=
|
||||
ADMIN_PASSWORD=
|
BIN
glance/assets/ghost.png
Normal file
After Width: | Height: | Size: 44 KiB |
1
glance/assets/gitea.svg
Normal file
@@ -0,0 +1 @@
|
||||
<svg version="1.1" id="main_outline" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" style="enable-background:new 0 0 640 640;" xml:space="preserve" viewBox="5.67 143.05 628.65 387.55"> <g> <path id="teabag" style="fill:#FFFFFF" d="M395.9,484.2l-126.9-61c-12.5-6-17.9-21.2-11.8-33.8l61-126.9c6-12.5,21.2-17.9,33.8-11.8 c17.2,8.3,27.1,13,27.1,13l-0.1-109.2l16.7-0.1l0.1,117.1c0,0,57.4,24.2,83.1,40.1c3.7,2.3,10.2,6.8,12.9,14.4 c2.1,6.1,2,13.1-1,19.3l-61,126.9C423.6,484.9,408.4,490.3,395.9,484.2z"></path> <g> <g> <path style="fill:#609926" d="M622.7,149.8c-4.1-4.1-9.6-4-9.6-4s-117.2,6.6-177.9,8c-13.3,0.3-26.5,0.6-39.6,0.7c0,39.1,0,78.2,0,117.2 c-5.5-2.6-11.1-5.3-16.6-7.9c0-36.4-0.1-109.2-0.1-109.2c-29,0.4-89.2-2.2-89.2-2.2s-141.4-7.1-156.8-8.5 c-9.8-0.6-22.5-2.1-39,1.5c-8.7,1.8-33.5,7.4-53.8,26.9C-4.9,212.4,6.6,276.2,8,285.8c1.7,11.7,6.9,44.2,31.7,72.5 c45.8,56.1,144.4,54.8,144.4,54.8s12.1,28.9,30.6,55.5c25,33.1,50.7,58.9,75.7,62c63,0,188.9-0.1,188.9-0.1s12,0.1,28.3-10.3 c14-8.5,26.5-23.4,26.5-23.4s12.9-13.8,30.9-45.3c5.5-9.7,10.1-19.1,14.1-28c0,0,55.2-117.1,55.2-231.1 C633.2,157.9,624.7,151.8,622.7,149.8z M125.6,353.9c-25.9-8.5-36.9-18.7-36.9-18.7S69.6,321.8,60,295.4 c-16.5-44.2-1.4-71.2-1.4-71.2s8.4-22.5,38.5-30c13.8-3.7,31-3.1,31-3.1s7.1,59.4,15.7,94.2c7.2,29.2,24.8,77.7,24.8,77.7 S142.5,359.9,125.6,353.9z M425.9,461.5c0,0-6.1,14.5-19.6,15.4c-5.8,0.4-10.3-1.2-10.3-1.2s-0.3-0.1-5.3-2.1l-112.9-55 c0,0-10.9-5.7-12.8-15.6c-2.2-8.1,2.7-18.1,2.7-18.1L322,273c0,0,4.8-9.7,12.2-13c0.6-0.3,2.3-1,4.5-1.5c8.1-2.1,18,2.8,18,2.8 l110.7,53.7c0,0,12.6,5.7,15.3,16.2c1.9,7.4-0.5,14-1.8,17.2C474.6,363.8,425.9,461.5,425.9,461.5z"></path> <path style="fill:#609926" d="M326.8,380.1c-8.2,0.1-15.4,5.8-17.3,13.8c-1.9,8,2,16.3,9.1,20c7.7,4,17.5,1.8,22.7-5.4 c5.1-7.1,4.3-16.9-1.8-23.1l24-49.1c1.5,0.1,3.7,0.2,6.2-0.5c4.1-0.9,7.1-3.6,7.1-3.6c4.2,1.8,8.6,3.8,13.2,6.1 c4.8,2.4,9.3,4.9,13.4,7.3c0.9,0.5,1.8,1.1,2.8,1.9c1.6,1.3,3.4,3.1,4.7,5.5c1.9,5.5-1.9,14.9-1.9,14.9 c-2.3,7.6-18.4,40.6-18.4,40.6c-8.1-0.2-15.3,5-17.7,12.5c-2.6,8.1,1.1,17.3,8.9,21.3c7.8,4,17.4,1.7,22.5-5.3 c5-6.8,4.6-16.3-1.1-22.6c1.9-3.7,3.7-7.4,5.6-11.3c5-10.4,13.5-30.4,13.5-30.4c0.9-1.7,5.7-10.3,2.7-21.3 c-2.5-11.4-12.6-16.7-12.6-16.7c-12.2-7.9-29.2-15.2-29.2-15.2s0-4.1-1.1-7.1c-1.1-3.1-2.8-5.1-3.9-6.3c4.7-9.7,9.4-19.3,14.1-29 c-4.1-2-8.1-4-12.2-6.1c-4.8,9.8-9.7,19.7-14.5,29.5c-6.7-0.1-12.9,3.5-16.1,9.4c-3.4,6.3-2.7,14.1,1.9,19.8 C343.2,346.5,335,363.3,326.8,380.1z"></path> </g> </g> </g> </svg>
|
After Width: | Height: | Size: 2.5 KiB |
BIN
glance/assets/immich.png
Normal file
After Width: | Height: | Size: 15 KiB |
BIN
glance/assets/memos.png
Normal file
After Width: | Height: | Size: 56 KiB |
BIN
glance/assets/seradar.png
Normal file
After Width: | Height: | Size: 17 KiB |
BIN
glance/assets/sftpgo.png
Normal file
After Width: | Height: | Size: 14 KiB |
1
glance/assets/slash.svg
Normal file
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-circle-slash"><line x1="9" x2="15" y1="15" y2="9"/><circle cx="12" cy="12" r="10"/></svg>
|
After Width: | Height: | Size: 291 B |
BIN
glance/assets/uptime_kuma.png
Normal file
After Width: | Height: | Size: 36 KiB |
0
glance/assets/user.css
Normal file
5
glance/assets/vaultwarden.svg
Normal file
@@ -0,0 +1,5 @@
|
||||
<svg version="1.1" viewBox="0 0 60 60" xmlns="http://www.w3.org/2000/svg">
|
||||
<title>Vaultwarden</title>
|
||||
<path class="tw-fill-marketing-logo" d="m18 11-5.6.00073 15 42h5.3l15-42h-5.6l-9.5 27c-.63 1.7-1.2 3.4-1.6 4.9-.43 1.5-.79 2.9-1.1 4.3-.28-1.4-.63-2.8-1.1-4.4-.43-1.5-.97-3.2-1.6-5l-9.5-27z"></path>
|
||||
<path class="tw-fill-marketing-logo" d="m30 0.05c-0.19 0.068-0.34 0.2-0.44 0.37l-1.5 2.5c-0.27 0.022-0.53 0.046-0.8 0.076l-2-2.2c-0.43-0.44-1.2-0.29-1.4 0.29l-1 2.8c-0.26 0.074-0.51 0.15-0.77 0.23l-2.4-1.8c-0.52-0.45-1.3-0.12-1.4 0.56l-0.44 2.9c-0.23 0.12-0.47 0.24-0.7 0.37l-2.7-1.3c-0.58-0.26-1.2 0.18-1.2 0.81l0.14 3c-0.2 0.16-0.4 0.33-0.6 0.49l-2.9-0.72c-0.59-0.12-1.1 0.41-1 1l0.72 2.9c-0.17 0.2-0.33 0.4-0.49 0.6l-3-0.14c-0.63-0.027-1.1 0.62-0.81 1.2l1.3 2.7c-0.13 0.23-0.25 0.46-0.37 0.7l-2.9 0.44c-0.68 0.068-1 0.88-0.56 1.4l1.8 2.4c-0.081 0.25-0.16 0.51-0.23 0.77l-2.8 1c-0.58 0.22-0.73 0.97-0.29 1.4l2.2 2c-0.03 0.26-0.054 0.53-0.076 0.8l-2.5 1.5c-0.6 0.32-0.6 1.2 0 1.5l2.5 1.5c0.022 0.27 0.046 0.53 0.076 0.8l-2.2 2c-0.44 0.43-0.29 1.2 0.29 1.4l2.8 1c0.074 0.26 0.15 0.51 0.23 0.77l-1.8 2.4c-0.45 0.52-0.12 1.3 0.56 1.4l2.9 0.44c0.12 0.23 0.24 0.47 0.37 0.7l-1.3 2.7c-0.26 0.58 0.18 1.2 0.81 1.2l3-0.14c0.16 0.2 0.33 0.4 0.49 0.6l-0.72 2.9c-0.12 0.59 0.41 1.1 1 1l2.9-0.72c0.2 0.17 0.4 0.33 0.6 0.49l-0.14 3c-0.027 0.63 0.62 1.1 1.2 0.81l2.7-1.3c0.23 0.13 0.46 0.25 0.7 0.37l0.44 2.9c0.068 0.68 0.88 1 1.4 0.56l2.4-1.8c0.25 0.081 0.51 0.16 0.77 0.23l1 2.8c0.22 0.58 0.97 0.73 1.4 0.29l2-2.2c0.26 0.03 0.53 0.054 0.8 0.076l1.5 2.5c0.32 0.6 1.2 0.6 1.5 0l1.5-2.5c0.27-0.022 0.53-0.046 0.8-0.076l2 2.2c0.43 0.44 1.2 0.29 1.4-0.29l1-2.8c0.26-0.074 0.51-0.15 0.77-0.23l2.4 1.8c0.52 0.45 1.3 0.12 1.4-0.56l0.44-2.9c0.23-0.12 0.47-0.24 0.7-0.37l2.7 1.3c0.58 0.26 1.2-0.18 1.2-0.81l-0.14-3c0.2-0.16 0.4-0.33 0.6-0.49l2.9 0.72c0.59 0.12 1.1-0.41 1-1l-0.72-2.9c0.17-0.2 0.33-0.4 0.49-0.6l3 0.14c0.63 0.027 1.1-0.62 0.81-1.2l-1.3-2.7c0.13-0.23 0.25-0.46 0.37-0.7l2.9-0.44c0.68-0.068 1-0.88 0.56-1.4l-1.8-2.4c0.081-0.25 0.16-0.51 0.23-0.77l2.8-1c0.58-0.22 0.73-0.97 0.29-1.4l-2.2-2c0.03-0.26 0.054-0.53 0.076-0.8l2.5-1.5c0.6-0.32 0.6-1.2 0-1.5l-2.5-1.5c-0.022-0.27-0.046-0.53-0.076-0.8l2.2-2c0.44-0.43 0.29-1.2-0.29-1.4l-2.8-1c-0.074-0.26-0.15-0.51-0.23-0.77l1.8-2.4c0.45-0.52 0.12-1.3-0.56-1.4l-2.9-0.44c-0.12-0.23-0.24-0.47-0.37-0.7l1.3-2.7c0.26-0.58-0.18-1.2-0.81-1.2l-3 0.14c-0.16-0.2-0.33-0.4-0.49-0.6l0.72-2.9c0.12-0.59-0.41-1.1-1-1l-2.9 0.72c-0.2-0.17-0.4-0.33-0.6-0.49l0.14-3c0.027-0.63-0.62-1.1-1.2-0.81l-2.7 1.3c-0.23-0.13-0.46-0.25-0.7-0.37l-0.44-2.9c-0.068-0.68-0.88-1-1.4-0.56l-2.4 1.8c-0.25-0.081-0.51-0.16-0.77-0.23l-1-2.8c-0.22-0.58-0.97-0.73-1.4-0.29l-2 2.2c-0.26-0.03-0.53-0.054-0.8-0.076l-1.5-2.5c-0.2-0.34-0.62-0.5-1-0.37zm0.29 5.4c0.94 0 1.7 0.76 1.7 1.7s-0.76 1.7-1.7 1.7-1.7-0.76-1.7-1.7 0.76-1.7 1.7-1.7zm-4 2.9 2.8 2.8c0.66 0.66 1.7 0.66 2.4 0l2.8-2.8c6.6 1.2 12 5.4 15 11l-1.8 3.6c-0.43 0.84-0.097 1.9 0.75 2.3l3.6 1.8c0.12 0.92 0.18 1.9 0.18 2.8 0 5.8-2.3 11-6 15l-4-0.63c-0.94-0.18-1.8 0.45-2 1.4l-0.63 4c-2.8 1.3-6 2.1-9.4 2.1s-6.5-0.76-9.4-2.1l-0.63-4c-0.15-0.95-1.1-1.6-2-1.4l-4 0.63c-3.7-3.9-6-9.2-6-15 0-0.96 0.064-1.9 0.18-2.8l3.6-1.8c0.85-0.42 1.2-1.5 0.75-2.3l-1.8-3.6c3.1-5.7 8.6-9.8 15-11zm-18 13c0.16 0.0045 0.32 0.032 0.48 0.083 0.93 0.29 1.4 1.3 1.1 2.2-0.29 0.93-1.3 1.4-2.2 1.1-0.93-0.29-1.4-1.3-1.1-2.2 0.23-0.74 0.93-1.2 1.7-1.2zm43 0c0.77-0.034 1.5 0.46 1.7 1.2 0.33 0.91-0.17 1.9-1.1 2.2-0.91 0.33-1.9-0.17-2.2-1.1-0.33-0.91 0.17-1.9 1.1-2.2 0.16-0.051 0.32-0.079 0.48-0.083zm-35 25c0.33 0.017 0.64 0.13 0.91 0.32 0.78 0.55 0.95 1.6 0.38 2.4-0.55 0.78-1.6 0.95-2.4 0.38-0.78-0.55-0.95-1.6-0.38-2.4 0.34-0.48 0.91-0.74 1.5-0.7zm27 0c0.59-0.042 1.2 0.22 1.5 0.7 0.57 0.77 0.4 1.8-0.38 2.4-0.77 0.57-1.8 0.4-2.4-0.38-0.57-0.77-0.4-1.8 0.38-2.4 0.27-0.19 0.58-0.3 0.91-0.32z"></path>
|
||||
</svg>
|
After Width: | Height: | Size: 3.7 KiB |
BIN
glance/assets/wireguard.png
Normal file
After Width: | Height: | Size: 21 KiB |
46
glance/config/glance.yml
Normal file
@@ -0,0 +1,46 @@
|
||||
server:
|
||||
assets-path: /app/assets
|
||||
|
||||
auth:
|
||||
secret-key: ${SECRET_KEY}
|
||||
users:
|
||||
admin:
|
||||
password: ${ADMIN_PASSWORD}
|
||||
|
||||
theme:
|
||||
background-color: 240 13 14
|
||||
primary-color: 51 33 68
|
||||
negative-color: 358 100 68
|
||||
contrast-multiplier: 1.2
|
||||
|
||||
presets:
|
||||
neon-focus:
|
||||
background-color: 255 14 6
|
||||
primary-color: 156 50 65
|
||||
negative-color: 342 65 65
|
||||
contrast-multiplier: 0.9
|
||||
text-saturation-multiplier: 0.8
|
||||
|
||||
gruvbox-dark:
|
||||
background-color: 0 0 16
|
||||
primary-color: 43 59 81
|
||||
positive-color: 61 66 44
|
||||
negative-color: 6 96 59
|
||||
|
||||
catppuccin-macchiato:
|
||||
background-color: 232 23 18
|
||||
contrast-multiplier: 1.2
|
||||
primary-color: 220 83 75
|
||||
positive-color: 105 48 72
|
||||
negative-color: 351 74 73
|
||||
|
||||
peachy:
|
||||
light: true
|
||||
background-color: 28 40 77
|
||||
primary-color: 155 100 20
|
||||
negative-color: 0 100 60
|
||||
contrast-multiplier: 1.1
|
||||
text-saturation-multiplier: 0.5
|
||||
|
||||
pages:
|
||||
$include: home.yml
|
112
glance/config/home.yml
Normal file
@@ -0,0 +1,112 @@
|
||||
- name: Home
|
||||
columns:
|
||||
- size: small
|
||||
widgets:
|
||||
- type: server-stats
|
||||
servers:
|
||||
- type: local
|
||||
name: Services
|
||||
|
||||
- type: monitor
|
||||
cache: 1s
|
||||
title: Services
|
||||
sites:
|
||||
- title: seradar.net
|
||||
url: https://seradar.net/auth
|
||||
icon: /assets/seradar.png
|
||||
- title: git.aykhans.me
|
||||
url: https://git.aykhans.me/aykhans
|
||||
icon: /assets/gitea.svg
|
||||
- title: ftp.aykhans.me
|
||||
url: https://ftp.aykhans.me/web/client/login
|
||||
icon: /assets/sftpgo.png
|
||||
- title: notes.aykhans.me
|
||||
url: https://notes.aykhans.me/signin
|
||||
icon: /assets/memos.png
|
||||
- title: url.aykhans.me
|
||||
url: https://url.aykhans.me/auth
|
||||
icon: /assets/slash.svg
|
||||
- title: vault.aykhans.me
|
||||
url: https://vault.aykhans.me/#/login
|
||||
icon: /assets/vaultwarden.svg
|
||||
- title: wg.aykhans.me
|
||||
url: https://wg.aykhans.me/
|
||||
icon: /assets/wireguard.png
|
||||
- title: photos.aykhans.me
|
||||
url: https://photos.aykhans.me/
|
||||
icon: /assets/immich.png
|
||||
- title: up.aykhans.me
|
||||
url: https://up.aykhans.me/
|
||||
icon: /assets/uptime_kuma.png
|
||||
- title: aykhans.me
|
||||
url: https://aykhans.me/
|
||||
icon: /assets/ghost.png
|
||||
|
||||
- type: docker-containers
|
||||
cache: 0s
|
||||
hide-by-default: false
|
||||
|
||||
- type: releases
|
||||
cache: 1d
|
||||
collapse-after: 5
|
||||
# Without authentication the Github API allows for up to 60 requests per hour. You can create a
|
||||
# read-only token from your Github account settings and use it here to increase the limit.
|
||||
token: ${GITHUB_TOKEN}
|
||||
repositories:
|
||||
- caddyserver/caddy
|
||||
- louislam/uptime-kuma
|
||||
- immich-app/immich
|
||||
- glanceapp/glance
|
||||
- go-gitea/gitea
|
||||
- drakkan/sftpgo
|
||||
- usememos/memos
|
||||
- yourselfhosted/slash
|
||||
- dani-garcia/vaultwarden
|
||||
- wg-easy/wg-easy
|
||||
- pocketbase/pocketbase
|
||||
- prometheus/prometheus
|
||||
- grafana/grafana
|
||||
- TryGhost/Ghost
|
||||
|
||||
- size: full
|
||||
widgets:
|
||||
- type: to-do
|
||||
title: To-Do
|
||||
id: general
|
||||
|
||||
- type: group
|
||||
widgets:
|
||||
- type: hacker-news
|
||||
- type: lobsters
|
||||
|
||||
- type: rss
|
||||
limit: 150
|
||||
collapse-after: 5
|
||||
cache: 1h
|
||||
style: horizontal-cards
|
||||
feeds:
|
||||
- url: https://registerspill.thorstenball.com/feed
|
||||
title: Thorsten Ball
|
||||
- url: https://selfh.st/rss/
|
||||
title: selfh.st
|
||||
|
||||
- size: small
|
||||
widgets:
|
||||
- type: calendar
|
||||
first-day-of-week: monday
|
||||
|
||||
- type: weather
|
||||
location: Baku, Azerbaijan
|
||||
units: metric # alternatively "imperial"
|
||||
hour-format: 12h # alternatively "24h"
|
||||
|
||||
- type: markets
|
||||
markets:
|
||||
- symbol: BTC-USD
|
||||
name: Bitcoin
|
||||
- symbol: DYDX-USD
|
||||
name: DYDX
|
||||
- symbol: FET-USD
|
||||
name: FET
|
||||
- symbol: SUI20947-USD
|
||||
name: SUI
|
21
glance/docker-compose.yml
Normal file
@@ -0,0 +1,21 @@
|
||||
networks:
|
||||
glance:
|
||||
external: false
|
||||
caddy:
|
||||
name: caddy
|
||||
driver: bridge
|
||||
external: true
|
||||
|
||||
services:
|
||||
glance:
|
||||
image: glanceapp/glance:v0.8.4
|
||||
container_name: glance
|
||||
restart: unless-stopped
|
||||
networks:
|
||||
- glance
|
||||
- caddy
|
||||
volumes:
|
||||
- ./config:/app/config
|
||||
- ./assets:/app/assets
|
||||
- /var/run/docker.sock:/var/run/docker.sock:ro
|
||||
env_file: .env
|
2237
grafana/data/grafana/dashboards/caddy.json
Normal file
774
grafana/data/grafana/dashboards/cadvisor-exporter.json
Normal file
@@ -0,0 +1,774 @@
|
||||
{
|
||||
"annotations": {
|
||||
"list": [
|
||||
{
|
||||
"builtIn": 1,
|
||||
"datasource": {
|
||||
"type": "datasource",
|
||||
"uid": "grafana"
|
||||
},
|
||||
"enable": true,
|
||||
"hide": true,
|
||||
"iconColor": "rgba(0, 211, 255, 1)",
|
||||
"name": "Annotations & Alerts",
|
||||
"type": "dashboard"
|
||||
}
|
||||
]
|
||||
},
|
||||
"description": "Simple exporter for cadvisor only",
|
||||
"editable": true,
|
||||
"fiscalYearStartMonth": 0,
|
||||
"graphTooltip": 0,
|
||||
"id": 4,
|
||||
"links": [],
|
||||
"panels": [
|
||||
{
|
||||
"collapsed": false,
|
||||
"gridPos": {
|
||||
"h": 1,
|
||||
"w": 24,
|
||||
"x": 0,
|
||||
"y": 0
|
||||
},
|
||||
"id": 8,
|
||||
"panels": [],
|
||||
"title": "CPU",
|
||||
"type": "row"
|
||||
},
|
||||
{
|
||||
"datasource": {
|
||||
"type": "prometheus",
|
||||
"uid": "prometheusdatasource"
|
||||
},
|
||||
"fieldConfig": {
|
||||
"defaults": {
|
||||
"color": {
|
||||
"mode": "palette-classic"
|
||||
},
|
||||
"custom": {
|
||||
"axisBorderShow": false,
|
||||
"axisCenteredZero": false,
|
||||
"axisColorMode": "text",
|
||||
"axisLabel": "",
|
||||
"axisPlacement": "auto",
|
||||
"barAlignment": 0,
|
||||
"barWidthFactor": 0.6,
|
||||
"drawStyle": "line",
|
||||
"fillOpacity": 10,
|
||||
"gradientMode": "none",
|
||||
"hideFrom": {
|
||||
"legend": false,
|
||||
"tooltip": false,
|
||||
"viz": false
|
||||
},
|
||||
"insertNulls": false,
|
||||
"lineInterpolation": "linear",
|
||||
"lineWidth": 1,
|
||||
"pointSize": 5,
|
||||
"scaleDistribution": {
|
||||
"type": "linear"
|
||||
},
|
||||
"showPoints": "never",
|
||||
"spanNulls": false,
|
||||
"stacking": {
|
||||
"group": "A",
|
||||
"mode": "normal"
|
||||
},
|
||||
"thresholdsStyle": {
|
||||
"mode": "off"
|
||||
}
|
||||
},
|
||||
"mappings": [],
|
||||
"thresholds": {
|
||||
"mode": "absolute",
|
||||
"steps": [
|
||||
{
|
||||
"color": "green"
|
||||
},
|
||||
{
|
||||
"color": "red",
|
||||
"value": 80
|
||||
}
|
||||
]
|
||||
},
|
||||
"unit": "percent"
|
||||
},
|
||||
"overrides": []
|
||||
},
|
||||
"gridPos": {
|
||||
"h": 7,
|
||||
"w": 24,
|
||||
"x": 0,
|
||||
"y": 1
|
||||
},
|
||||
"id": 15,
|
||||
"options": {
|
||||
"alertThreshold": true,
|
||||
"legend": {
|
||||
"calcs": [
|
||||
"mean",
|
||||
"max"
|
||||
],
|
||||
"displayMode": "table",
|
||||
"placement": "right",
|
||||
"showLegend": true
|
||||
},
|
||||
"tooltip": {
|
||||
"hideZeros": false,
|
||||
"mode": "multi",
|
||||
"sort": "none"
|
||||
}
|
||||
},
|
||||
"pluginVersion": "11.6.0",
|
||||
"targets": [
|
||||
{
|
||||
"datasource": {
|
||||
"type": "prometheus",
|
||||
"uid": "prometheusdatasource"
|
||||
},
|
||||
"expr": "sum(rate(container_cpu_usage_seconds_total{instance=~\"$host\",name=~\"$container\",name=~\".+\"}[5m])) by (name) *100",
|
||||
"hide": false,
|
||||
"interval": "",
|
||||
"legendFormat": "{{name}}",
|
||||
"refId": "A"
|
||||
}
|
||||
],
|
||||
"title": "CPU Usage",
|
||||
"type": "timeseries"
|
||||
},
|
||||
{
|
||||
"collapsed": false,
|
||||
"gridPos": {
|
||||
"h": 1,
|
||||
"w": 24,
|
||||
"x": 0,
|
||||
"y": 8
|
||||
},
|
||||
"id": 11,
|
||||
"panels": [],
|
||||
"title": "Memory",
|
||||
"type": "row"
|
||||
},
|
||||
{
|
||||
"datasource": {
|
||||
"type": "prometheus",
|
||||
"uid": "prometheusdatasource"
|
||||
},
|
||||
"fieldConfig": {
|
||||
"defaults": {
|
||||
"color": {
|
||||
"mode": "palette-classic"
|
||||
},
|
||||
"custom": {
|
||||
"axisBorderShow": false,
|
||||
"axisCenteredZero": false,
|
||||
"axisColorMode": "text",
|
||||
"axisLabel": "",
|
||||
"axisPlacement": "auto",
|
||||
"barAlignment": 0,
|
||||
"barWidthFactor": 0.6,
|
||||
"drawStyle": "line",
|
||||
"fillOpacity": 10,
|
||||
"gradientMode": "none",
|
||||
"hideFrom": {
|
||||
"legend": false,
|
||||
"tooltip": false,
|
||||
"viz": false
|
||||
},
|
||||
"insertNulls": false,
|
||||
"lineInterpolation": "linear",
|
||||
"lineWidth": 1,
|
||||
"pointSize": 5,
|
||||
"scaleDistribution": {
|
||||
"type": "linear"
|
||||
},
|
||||
"showPoints": "never",
|
||||
"spanNulls": false,
|
||||
"stacking": {
|
||||
"group": "A",
|
||||
"mode": "normal"
|
||||
},
|
||||
"thresholdsStyle": {
|
||||
"mode": "off"
|
||||
}
|
||||
},
|
||||
"mappings": [],
|
||||
"thresholds": {
|
||||
"mode": "absolute",
|
||||
"steps": [
|
||||
{
|
||||
"color": "green"
|
||||
},
|
||||
{
|
||||
"color": "red",
|
||||
"value": 80
|
||||
}
|
||||
]
|
||||
},
|
||||
"unit": "bytes"
|
||||
},
|
||||
"overrides": []
|
||||
},
|
||||
"gridPos": {
|
||||
"h": 8,
|
||||
"w": 12,
|
||||
"x": 0,
|
||||
"y": 9
|
||||
},
|
||||
"id": 9,
|
||||
"options": {
|
||||
"alertThreshold": true,
|
||||
"legend": {
|
||||
"calcs": [
|
||||
"mean",
|
||||
"max"
|
||||
],
|
||||
"displayMode": "table",
|
||||
"placement": "right",
|
||||
"showLegend": true
|
||||
},
|
||||
"tooltip": {
|
||||
"hideZeros": false,
|
||||
"mode": "multi",
|
||||
"sort": "none"
|
||||
}
|
||||
},
|
||||
"pluginVersion": "11.6.0",
|
||||
"targets": [
|
||||
{
|
||||
"datasource": {
|
||||
"type": "prometheus",
|
||||
"uid": "prometheusdatasource"
|
||||
},
|
||||
"expr": "sum(container_memory_rss{instance=~\"$host\",name=~\"$container\",name=~\".+\"}) by (name)",
|
||||
"hide": false,
|
||||
"interval": "",
|
||||
"legendFormat": "{{name}}",
|
||||
"refId": "A"
|
||||
}
|
||||
],
|
||||
"title": "Memory Usage",
|
||||
"type": "timeseries"
|
||||
},
|
||||
{
|
||||
"datasource": {
|
||||
"type": "prometheus",
|
||||
"uid": "prometheusdatasource"
|
||||
},
|
||||
"fieldConfig": {
|
||||
"defaults": {
|
||||
"color": {
|
||||
"mode": "palette-classic"
|
||||
},
|
||||
"custom": {
|
||||
"axisBorderShow": false,
|
||||
"axisCenteredZero": false,
|
||||
"axisColorMode": "text",
|
||||
"axisLabel": "",
|
||||
"axisPlacement": "auto",
|
||||
"barAlignment": 0,
|
||||
"barWidthFactor": 0.6,
|
||||
"drawStyle": "line",
|
||||
"fillOpacity": 10,
|
||||
"gradientMode": "none",
|
||||
"hideFrom": {
|
||||
"legend": false,
|
||||
"tooltip": false,
|
||||
"viz": false
|
||||
},
|
||||
"insertNulls": false,
|
||||
"lineInterpolation": "linear",
|
||||
"lineWidth": 1,
|
||||
"pointSize": 5,
|
||||
"scaleDistribution": {
|
||||
"type": "linear"
|
||||
},
|
||||
"showPoints": "never",
|
||||
"spanNulls": false,
|
||||
"stacking": {
|
||||
"group": "A",
|
||||
"mode": "normal"
|
||||
},
|
||||
"thresholdsStyle": {
|
||||
"mode": "off"
|
||||
}
|
||||
},
|
||||
"mappings": [],
|
||||
"thresholds": {
|
||||
"mode": "absolute",
|
||||
"steps": [
|
||||
{
|
||||
"color": "green"
|
||||
},
|
||||
{
|
||||
"color": "red",
|
||||
"value": 80
|
||||
}
|
||||
]
|
||||
},
|
||||
"unit": "bytes"
|
||||
},
|
||||
"overrides": []
|
||||
},
|
||||
"gridPos": {
|
||||
"h": 8,
|
||||
"w": 12,
|
||||
"x": 12,
|
||||
"y": 9
|
||||
},
|
||||
"id": 14,
|
||||
"options": {
|
||||
"alertThreshold": true,
|
||||
"legend": {
|
||||
"calcs": [
|
||||
"mean",
|
||||
"max"
|
||||
],
|
||||
"displayMode": "table",
|
||||
"placement": "right",
|
||||
"showLegend": true
|
||||
},
|
||||
"tooltip": {
|
||||
"hideZeros": false,
|
||||
"mode": "multi",
|
||||
"sort": "none"
|
||||
}
|
||||
},
|
||||
"pluginVersion": "11.6.0",
|
||||
"targets": [
|
||||
{
|
||||
"datasource": {
|
||||
"type": "prometheus",
|
||||
"uid": "prometheusdatasource"
|
||||
},
|
||||
"expr": "sum(container_memory_cache{instance=~\"$host\",name=~\"$container\",name=~\".+\"}) by (name)",
|
||||
"hide": false,
|
||||
"interval": "",
|
||||
"legendFormat": "{{name}}",
|
||||
"refId": "A"
|
||||
}
|
||||
],
|
||||
"title": "Memory Cached",
|
||||
"type": "timeseries"
|
||||
},
|
||||
{
|
||||
"collapsed": false,
|
||||
"gridPos": {
|
||||
"h": 1,
|
||||
"w": 24,
|
||||
"x": 0,
|
||||
"y": 17
|
||||
},
|
||||
"id": 2,
|
||||
"panels": [],
|
||||
"title": "Network",
|
||||
"type": "row"
|
||||
},
|
||||
{
|
||||
"datasource": {
|
||||
"type": "prometheus",
|
||||
"uid": "prometheusdatasource"
|
||||
},
|
||||
"fieldConfig": {
|
||||
"defaults": {
|
||||
"color": {
|
||||
"mode": "palette-classic"
|
||||
},
|
||||
"custom": {
|
||||
"axisBorderShow": false,
|
||||
"axisCenteredZero": false,
|
||||
"axisColorMode": "text",
|
||||
"axisLabel": "",
|
||||
"axisPlacement": "auto",
|
||||
"barAlignment": 0,
|
||||
"barWidthFactor": 0.6,
|
||||
"drawStyle": "line",
|
||||
"fillOpacity": 10,
|
||||
"gradientMode": "none",
|
||||
"hideFrom": {
|
||||
"legend": false,
|
||||
"tooltip": false,
|
||||
"viz": false
|
||||
},
|
||||
"insertNulls": false,
|
||||
"lineInterpolation": "linear",
|
||||
"lineWidth": 1,
|
||||
"pointSize": 5,
|
||||
"scaleDistribution": {
|
||||
"type": "linear"
|
||||
},
|
||||
"showPoints": "never",
|
||||
"spanNulls": false,
|
||||
"stacking": {
|
||||
"group": "A",
|
||||
"mode": "none"
|
||||
},
|
||||
"thresholdsStyle": {
|
||||
"mode": "off"
|
||||
}
|
||||
},
|
||||
"mappings": [],
|
||||
"thresholds": {
|
||||
"mode": "absolute",
|
||||
"steps": [
|
||||
{
|
||||
"color": "green"
|
||||
},
|
||||
{
|
||||
"color": "red",
|
||||
"value": 80
|
||||
}
|
||||
]
|
||||
},
|
||||
"unit": "Bps"
|
||||
},
|
||||
"overrides": []
|
||||
},
|
||||
"gridPos": {
|
||||
"h": 8,
|
||||
"w": 12,
|
||||
"x": 0,
|
||||
"y": 18
|
||||
},
|
||||
"id": 4,
|
||||
"options": {
|
||||
"alertThreshold": true,
|
||||
"legend": {
|
||||
"calcs": [
|
||||
"mean",
|
||||
"max"
|
||||
],
|
||||
"displayMode": "table",
|
||||
"placement": "right",
|
||||
"showLegend": true
|
||||
},
|
||||
"tooltip": {
|
||||
"hideZeros": false,
|
||||
"mode": "multi",
|
||||
"sort": "none"
|
||||
}
|
||||
},
|
||||
"pluginVersion": "11.6.0",
|
||||
"targets": [
|
||||
{
|
||||
"datasource": {
|
||||
"type": "prometheus",
|
||||
"uid": "prometheusdatasource"
|
||||
},
|
||||
"expr": "sum(rate(container_network_receive_bytes_total{instance=~\"$host\",name=~\"$container\",name=~\".+\"}[5m])) by (name)",
|
||||
"hide": false,
|
||||
"interval": "",
|
||||
"legendFormat": "{{name}}",
|
||||
"refId": "A"
|
||||
}
|
||||
],
|
||||
"title": "Received Network Traffic",
|
||||
"type": "timeseries"
|
||||
},
|
||||
{
|
||||
"datasource": {
|
||||
"type": "prometheus",
|
||||
"uid": "prometheusdatasource"
|
||||
},
|
||||
"fieldConfig": {
|
||||
"defaults": {
|
||||
"color": {
|
||||
"mode": "palette-classic"
|
||||
},
|
||||
"custom": {
|
||||
"axisBorderShow": false,
|
||||
"axisCenteredZero": false,
|
||||
"axisColorMode": "text",
|
||||
"axisLabel": "",
|
||||
"axisPlacement": "auto",
|
||||
"barAlignment": 0,
|
||||
"barWidthFactor": 0.6,
|
||||
"drawStyle": "line",
|
||||
"fillOpacity": 10,
|
||||
"gradientMode": "none",
|
||||
"hideFrom": {
|
||||
"legend": false,
|
||||
"tooltip": false,
|
||||
"viz": false
|
||||
},
|
||||
"insertNulls": false,
|
||||
"lineInterpolation": "linear",
|
||||
"lineWidth": 1,
|
||||
"pointSize": 5,
|
||||
"scaleDistribution": {
|
||||
"type": "linear"
|
||||
},
|
||||
"showPoints": "never",
|
||||
"spanNulls": false,
|
||||
"stacking": {
|
||||
"group": "A",
|
||||
"mode": "none"
|
||||
},
|
||||
"thresholdsStyle": {
|
||||
"mode": "off"
|
||||
}
|
||||
},
|
||||
"mappings": [],
|
||||
"thresholds": {
|
||||
"mode": "absolute",
|
||||
"steps": [
|
||||
{
|
||||
"color": "green"
|
||||
},
|
||||
{
|
||||
"color": "red",
|
||||
"value": 80
|
||||
}
|
||||
]
|
||||
},
|
||||
"unit": "Bps"
|
||||
},
|
||||
"overrides": []
|
||||
},
|
||||
"gridPos": {
|
||||
"h": 8,
|
||||
"w": 12,
|
||||
"x": 12,
|
||||
"y": 18
|
||||
},
|
||||
"id": 6,
|
||||
"options": {
|
||||
"alertThreshold": true,
|
||||
"legend": {
|
||||
"calcs": [
|
||||
"mean",
|
||||
"max"
|
||||
],
|
||||
"displayMode": "table",
|
||||
"placement": "right",
|
||||
"showLegend": true
|
||||
},
|
||||
"tooltip": {
|
||||
"hideZeros": false,
|
||||
"mode": "multi",
|
||||
"sort": "none"
|
||||
}
|
||||
},
|
||||
"pluginVersion": "11.6.0",
|
||||
"targets": [
|
||||
{
|
||||
"datasource": {
|
||||
"type": "prometheus",
|
||||
"uid": "prometheusdatasource"
|
||||
},
|
||||
"expr": "sum(rate(container_network_transmit_bytes_total{instance=~\"$host\",name=~\"$container\",name=~\".+\"}[5m])) by (name)",
|
||||
"interval": "",
|
||||
"legendFormat": "{{name}}",
|
||||
"refId": "A"
|
||||
}
|
||||
],
|
||||
"title": "Sent Network Traffic",
|
||||
"type": "timeseries"
|
||||
},
|
||||
{
|
||||
"collapsed": false,
|
||||
"gridPos": {
|
||||
"h": 1,
|
||||
"w": 24,
|
||||
"x": 0,
|
||||
"y": 26
|
||||
},
|
||||
"id": 19,
|
||||
"panels": [],
|
||||
"title": "Misc",
|
||||
"type": "row"
|
||||
},
|
||||
{
|
||||
"datasource": {
|
||||
"type": "prometheus",
|
||||
"uid": "prometheusdatasource"
|
||||
},
|
||||
"fieldConfig": {
|
||||
"defaults": {
|
||||
"custom": {
|
||||
"filterable": false
|
||||
},
|
||||
"mappings": [],
|
||||
"thresholds": {
|
||||
"mode": "absolute",
|
||||
"steps": [
|
||||
{
|
||||
"color": "green"
|
||||
},
|
||||
{
|
||||
"color": "red",
|
||||
"value": 80
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"overrides": [
|
||||
{
|
||||
"matcher": {
|
||||
"id": "byName",
|
||||
"options": "id"
|
||||
},
|
||||
"properties": [
|
||||
{
|
||||
"id": "custom.width",
|
||||
"value": 260
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"matcher": {
|
||||
"id": "byName",
|
||||
"options": "Running"
|
||||
},
|
||||
"properties": [
|
||||
{
|
||||
"id": "unit",
|
||||
"value": "d"
|
||||
},
|
||||
{
|
||||
"id": "decimals",
|
||||
"value": 1
|
||||
},
|
||||
{
|
||||
"id": "custom.cellOptions",
|
||||
"value": {
|
||||
"type": "color-text"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "color",
|
||||
"value": {
|
||||
"fixedColor": "dark-green",
|
||||
"mode": "fixed"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
"gridPos": {
|
||||
"h": 10,
|
||||
"w": 24,
|
||||
"x": 0,
|
||||
"y": 27
|
||||
},
|
||||
"id": 17,
|
||||
"options": {
|
||||
"showHeader": true,
|
||||
"sortBy": []
|
||||
},
|
||||
"pluginVersion": "7.4.5",
|
||||
"targets": [
|
||||
{
|
||||
"datasource": {
|
||||
"type": "prometheus",
|
||||
"uid": "prometheusdatasource"
|
||||
},
|
||||
"expr": "(time() - container_start_time_seconds{instance=~\"$host\",name=~\"$container\",name=~\".+\"})/86400",
|
||||
"format": "table",
|
||||
"instant": true,
|
||||
"interval": "",
|
||||
"legendFormat": "{{name}}",
|
||||
"refId": "A"
|
||||
}
|
||||
],
|
||||
"title": "Containers Info",
|
||||
"transformations": [
|
||||
{
|
||||
"id": "filterFieldsByName",
|
||||
"options": {
|
||||
"include": {
|
||||
"names": [
|
||||
"container_label_com_docker_compose_project",
|
||||
"container_label_com_docker_compose_project_working_dir",
|
||||
"image",
|
||||
"instance",
|
||||
"name",
|
||||
"Value",
|
||||
"container_label_com_docker_compose_service"
|
||||
]
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "organize",
|
||||
"options": {
|
||||
"excludeByName": {},
|
||||
"indexByName": {},
|
||||
"renameByName": {
|
||||
"Value": "Running",
|
||||
"container_label_com_docker_compose_project": "Label",
|
||||
"container_label_com_docker_compose_project_working_dir": "Working dir",
|
||||
"container_label_com_docker_compose_service": "Service",
|
||||
"image": "Registry Image",
|
||||
"instance": "Instance",
|
||||
"name": "Name"
|
||||
}
|
||||
}
|
||||
}
|
||||
],
|
||||
"type": "table"
|
||||
}
|
||||
],
|
||||
"preload": false,
|
||||
"refresh": "",
|
||||
"schemaVersion": 41,
|
||||
"tags": [
|
||||
"cadvisor",
|
||||
"docker"
|
||||
],
|
||||
"templating": {
|
||||
"list": [
|
||||
{
|
||||
"allValue": ".*",
|
||||
"current": {
|
||||
"text": "All",
|
||||
"value": "$__all"
|
||||
},
|
||||
"datasource": "prometheusdatasource",
|
||||
"definition": "label_values({__name__=~\"container.*\"},instance)",
|
||||
"includeAll": true,
|
||||
"label": "Host",
|
||||
"name": "host",
|
||||
"options": [],
|
||||
"query": {
|
||||
"query": "label_values({__name__=~\"container.*\"},instance)",
|
||||
"refId": "Prometheus-host-Variable-Query"
|
||||
},
|
||||
"refresh": 1,
|
||||
"regex": "",
|
||||
"sort": 5,
|
||||
"type": "query"
|
||||
},
|
||||
{
|
||||
"allValue": ".*",
|
||||
"current": {
|
||||
"text": "All",
|
||||
"value": "$__all"
|
||||
},
|
||||
"datasource": "prometheusdatasource",
|
||||
"definition": "label_values({__name__=~\"container.*\", instance=~\"$host\"},name)",
|
||||
"includeAll": true,
|
||||
"label": "Container",
|
||||
"name": "container",
|
||||
"options": [],
|
||||
"query": {
|
||||
"query": "label_values({__name__=~\"container.*\", instance=~\"$host\"},name)",
|
||||
"refId": "Prometheus-container-Variable-Query"
|
||||
},
|
||||
"refresh": 1,
|
||||
"regex": "",
|
||||
"type": "query"
|
||||
}
|
||||
]
|
||||
},
|
||||
"time": {
|
||||
"from": "now-6h",
|
||||
"to": "now"
|
||||
},
|
||||
"timepicker": {},
|
||||
"timezone": "",
|
||||
"title": "Cadvisor exporter",
|
||||
"uid": "pMEd7m0Mz",
|
||||
"version": 1
|
||||
}
|
23512
grafana/data/grafana/dashboards/node-exporter-full.json
Normal file
27
grafana/data/provisioning/dashboard.yaml
Normal file
@@ -0,0 +1,27 @@
|
||||
apiVersion: 1
|
||||
|
||||
providers:
|
||||
# Unique name for the provider
|
||||
- name: 'general'
|
||||
# Organization ID. 1 usually corresponds to the default 'Main Org.'
|
||||
orgId: 1
|
||||
# Optional: Assign dashboards to a specific folder in Grafana UI
|
||||
folder: ''
|
||||
# Provider type: 'file' means loading from filesystem
|
||||
type: file
|
||||
# Optional: Prevents deletion of dashboards from Grafana UI
|
||||
# (they will reappear on restart if deleted)
|
||||
disableDeletion: false
|
||||
# Optional: Allow users to edit dashboards in the Grafana UI.
|
||||
# Changes will be overwritten on restart unless you save them elsewhere.
|
||||
editable: true
|
||||
updateIntervalSeconds: 10
|
||||
allowUiUpdates: true
|
||||
# Options specific to the 'file' type provider
|
||||
options:
|
||||
# Path inside the container where Grafana should look for dashboard JSON files.
|
||||
# This MUST match the target path of your dashboard JSON volume mount below.
|
||||
path: /var/lib/grafana/dashboards
|
||||
# Optional: Set to true to automatically update dashboards based on file changes
|
||||
# without restarting Grafana (requires polling).
|
||||
# updateIntervalSeconds: 10
|
9
grafana/data/provisioning/datasource.yaml
Normal file
@@ -0,0 +1,9 @@
|
||||
apiVersion: 1
|
||||
|
||||
datasources:
|
||||
- name: Prometheus
|
||||
uid: prometheusdatasource
|
||||
type: prometheus
|
||||
access: proxy
|
||||
url: http://prometheus:9090
|
||||
isDefault: true
|
26
grafana/docker-compose.yml
Normal file
@@ -0,0 +1,26 @@
|
||||
networks:
|
||||
grafana:
|
||||
name: grafana
|
||||
driver: bridge
|
||||
external: true
|
||||
caddy:
|
||||
name: caddy
|
||||
driver: bridge
|
||||
external: true
|
||||
|
||||
services:
|
||||
grafana:
|
||||
image: grafana/grafana-enterprise:12.1.0
|
||||
container_name: grafana
|
||||
restart: unless-stopped
|
||||
networks:
|
||||
- grafana
|
||||
- caddy
|
||||
volumes:
|
||||
- grafana-data:/var/lib/grafana
|
||||
- ./data/grafana/dashboards:/var/lib/grafana/dashboards
|
||||
- ./data/provisioning/dashboard.yaml:/etc/grafana/provisioning/dashboards/dashboard.yaml
|
||||
- ./data/provisioning/datasource.yaml:/etc/grafana/provisioning/datasources/datasource.yaml
|
||||
|
||||
volumes:
|
||||
grafana-data:
|
12
immich/.env.example
Normal file
@@ -0,0 +1,12 @@
|
||||
# The location where your uploaded files are stored
|
||||
UPLOAD_LOCATION=./data/server
|
||||
|
||||
# The location where your database files are stored. Network shares are not supported for the database
|
||||
DB_DATA_LOCATION=./data/postgres
|
||||
|
||||
DB_PASSWORD=postgres
|
||||
|
||||
# The values below this line do not need to be changed
|
||||
###################################################################################
|
||||
DB_USERNAME=postgres
|
||||
DB_DATABASE_NAME=immich
|
2
immich/.gitignore
vendored
Normal file
@@ -0,0 +1,2 @@
|
||||
/data/*
|
||||
!.gitkeep
|
0
immich/data/.gitkeep
Normal file
80
immich/docker-compose.yml
Normal file
@@ -0,0 +1,80 @@
|
||||
networks:
|
||||
immich:
|
||||
external: false
|
||||
caddy:
|
||||
name: caddy
|
||||
driver: bridge
|
||||
external: true
|
||||
|
||||
services:
|
||||
immich-server:
|
||||
container_name: immich_server
|
||||
image: ghcr.io/immich-app/immich-server:v1.138.1
|
||||
volumes:
|
||||
# Do not edit the next line. If you want to change the media storage location on your system, edit the value of UPLOAD_LOCATION in the .env file
|
||||
- ${UPLOAD_LOCATION}:/data
|
||||
- /etc/localtime:/etc/localtime:ro
|
||||
env_file:
|
||||
- .env
|
||||
ports:
|
||||
- "2283:2283"
|
||||
depends_on:
|
||||
- redis
|
||||
- database
|
||||
networks:
|
||||
- immich
|
||||
- caddy
|
||||
deploy:
|
||||
resources:
|
||||
limits:
|
||||
cpus: "1.5"
|
||||
memory: 1G
|
||||
restart: unless-stopped
|
||||
healthcheck:
|
||||
disable: false
|
||||
|
||||
immich-machine-learning:
|
||||
container_name: immich_machine_learning
|
||||
image: ghcr.io/immich-app/immich-machine-learning:release
|
||||
volumes:
|
||||
- model-cache:/cache
|
||||
env_file:
|
||||
- .env
|
||||
networks:
|
||||
- immich
|
||||
# deploy:
|
||||
# resources:
|
||||
# limits:
|
||||
# cpus: "1"
|
||||
# memory: 600M
|
||||
restart: unless-stopped
|
||||
healthcheck:
|
||||
disable: false
|
||||
|
||||
redis:
|
||||
container_name: immich_redis
|
||||
image: docker.io/valkey/valkey:8-bookworm@sha256:facc1d2c3462975c34e10fccb167bfa92b0e0dbd992fc282c29a61c3243afb11
|
||||
networks:
|
||||
- immich
|
||||
healthcheck:
|
||||
test: redis-cli ping || exit 1
|
||||
restart: unless-stopped
|
||||
|
||||
database:
|
||||
container_name: immich_postgres
|
||||
image: ghcr.io/immich-app/postgres:14-vectorchord0.4.3-pgvectors0.2.0@sha256:32324a2f41df5de9efe1af166b7008c3f55646f8d0e00d9550c16c9822366b4a
|
||||
environment:
|
||||
POSTGRES_PASSWORD: ${DB_PASSWORD}
|
||||
POSTGRES_USER: ${DB_USERNAME}
|
||||
POSTGRES_DB: ${DB_DATABASE_NAME}
|
||||
POSTGRES_INITDB_ARGS: "--data-checksums"
|
||||
networks:
|
||||
- immich
|
||||
volumes:
|
||||
# Do not edit the next line. If you want to change the database storage location on your system, edit the value of DB_DATA_LOCATION in the .env file
|
||||
- ${DB_DATA_LOCATION}:/var/lib/postgresql/data
|
||||
shm_size: 128mb
|
||||
restart: unless-stopped
|
||||
|
||||
volumes:
|
||||
model-cache:
|
157
main.sh
@@ -55,18 +55,52 @@ check_docker_compose() {
|
||||
|
||||
generate_env_files() {
|
||||
cp --update=none ./gitea/.env.example ./gitea/.env
|
||||
# cp --update=none ./memos/.env.example ./memos/.env
|
||||
cp --update=none ./searxng/.env.example ./searxng/.env
|
||||
cp --update=none ./sftpgo/.env.example ./sftpgo/.env
|
||||
# cp --update=none ./slash/.env.example ./slash/.env
|
||||
cp --update=none ./vaultwarden/.env.example ./vaultwarden/.env
|
||||
cp --update=none ./wg_easy/.env.example ./wg_easy/.env
|
||||
cp --update=none ./caddy/.env.example ./caddy/.env
|
||||
cp --update=none ./glance/.env.example ./glance/.env
|
||||
cp --update=none ./ghost/.env.example ./ghost/.env
|
||||
cp --update=none ./immich/.env.example ./immich/.env
|
||||
cp --update=none ./uptime_kuma/.env.example ./uptime_kuma/.env
|
||||
cp --update=none ./caddy/Caddyfile.private.example ./caddy/Caddyfile.private
|
||||
# cp --update=none ./slash/.env.example ./slash/.env
|
||||
# cp --update=none ./grafana/.env.example ./grafana/.env
|
||||
# cp --update=none ./prometheus/.env.example ./prometheus/.env
|
||||
print_success ".env files generated."
|
||||
}
|
||||
|
||||
start_services() {
|
||||
docker network create caddy 2>/dev/null
|
||||
docker network create grafana 2>/dev/null
|
||||
docker network create gitea 2>/dev/null
|
||||
|
||||
echo "Starting prometheus..."
|
||||
$DOCKER_COMPOSE_COMMAND -f ./prometheus/docker-compose.yml up -d
|
||||
if [ $? -eq 0 ]; then
|
||||
print_success "Prometheus started successfully."
|
||||
else
|
||||
print_error "failed to start Prometheus!"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "Starting Grafana..."
|
||||
$DOCKER_COMPOSE_COMMAND -f ./grafana/docker-compose.yml up -d
|
||||
if [ $? -eq 0 ]; then
|
||||
print_success "Grafana started successfully."
|
||||
else
|
||||
print_error "failed to start Grafana!"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "Starting Gitea..."
|
||||
$DOCKER_COMPOSE_COMMAND -f ./gitea/docker-compose.yml up -d
|
||||
if [ $? -eq 0 ]; then
|
||||
print_success "Gitea started successfully."
|
||||
else
|
||||
print_error "failed to start Gitea!"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "Starting gitea..."
|
||||
$DOCKER_COMPOSE_COMMAND -f ./gitea/docker-compose.yml up -d
|
||||
@@ -86,15 +120,6 @@ start_services() {
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "Starting searxng..."
|
||||
$DOCKER_COMPOSE_COMMAND -f ./searxng/docker-compose.yml up -d
|
||||
if [ $? -eq 0 ]; then
|
||||
print_success "Searxng started successfully."
|
||||
else
|
||||
print_error "failed to start Searxng!"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "Starting sftpgo..."
|
||||
$DOCKER_COMPOSE_COMMAND -f ./sftpgo/docker-compose.yml up -d
|
||||
if [ $? -eq 0 ]; then
|
||||
@@ -131,6 +156,42 @@ start_services() {
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "Starting glance..."
|
||||
$DOCKER_COMPOSE_COMMAND -f ./glance/docker-compose.yml up -d
|
||||
if [ $? -eq 0 ]; then
|
||||
print_success "Glance started successfully."
|
||||
else
|
||||
print_error "failed to start Glance!"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "Starting ghost..."
|
||||
$DOCKER_COMPOSE_COMMAND -f ./ghost/docker-compose.yml up -d
|
||||
if [ $? -eq 0 ]; then
|
||||
print_success "Ghost started successfully."
|
||||
else
|
||||
print_error "failed to start Ghost!"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "Starting immich..."
|
||||
$DOCKER_COMPOSE_COMMAND -f ./immich/docker-compose.yml up -d
|
||||
if [ $? -eq 0 ]; then
|
||||
print_success "Immich started successfully."
|
||||
else
|
||||
print_error "failed to start Immich!"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "Starting uptime kuma..."
|
||||
$DOCKER_COMPOSE_COMMAND -f ./uptime_kuma/docker-compose.yml up -d
|
||||
if [ $? -eq 0 ]; then
|
||||
print_success "Uptime kuma started successfully."
|
||||
else
|
||||
print_error "failed to start Uptime kuma!"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "Starting caddy..."
|
||||
$DOCKER_COMPOSE_COMMAND -f ./caddy/docker-compose.yml up -d
|
||||
if [ $? -eq 0 ]; then
|
||||
@@ -142,6 +203,33 @@ start_services() {
|
||||
}
|
||||
|
||||
stop_services() {
|
||||
echo "Stopping grafana..."
|
||||
$DOCKER_COMPOSE_COMMAND -f ./grafana/docker-compose.yml down
|
||||
if [ $? -eq 0 ]; then
|
||||
print_success "Grafana stopped successfully."
|
||||
else
|
||||
print_error "failed to stop Grafana!"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "Stopping prometheus..."
|
||||
$DOCKER_COMPOSE_COMMAND -f ./prometheus/docker-compose.yml down
|
||||
if [ $? -eq 0 ]; then
|
||||
print_success "Prometheus stopped successfully."
|
||||
else
|
||||
print_error "failed to stop Prometheus!"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "Stopping gitea..."
|
||||
$DOCKER_COMPOSE_COMMAND -f ./gitea/docker-compose.yml down
|
||||
if [ $? -eq 0 ]; then
|
||||
print_success "Gitea stopped successfully."
|
||||
else
|
||||
print_error "failed to stop Gitea!"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "Stopping gitea..."
|
||||
$DOCKER_COMPOSE_COMMAND -f ./gitea/docker-compose.yml down
|
||||
if [ $? -eq 0 ]; then
|
||||
@@ -160,15 +248,6 @@ stop_services() {
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "Stopping searxng..."
|
||||
$DOCKER_COMPOSE_COMMAND -f ./searxng/docker-compose.yml down
|
||||
if [ $? -eq 0 ]; then
|
||||
print_success "Searxng stopped successfully."
|
||||
else
|
||||
print_error "failed to stop Searxng!"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "Stopping sftpgo..."
|
||||
$DOCKER_COMPOSE_COMMAND -f ./sftpgo/docker-compose.yml down
|
||||
if [ $? -eq 0 ]; then
|
||||
@@ -205,6 +284,42 @@ stop_services() {
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "Stopping glance..."
|
||||
$DOCKER_COMPOSE_COMMAND -f ./glance/docker-compose.yml down
|
||||
if [ $? -eq 0 ]; then
|
||||
print_success "Glance stopped successfully."
|
||||
else
|
||||
print_error "failed to stop Glance!"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "Stopping ghost..."
|
||||
$DOCKER_COMPOSE_COMMAND -f ./ghost/docker-compose.yml down
|
||||
if [ $? -eq 0 ]; then
|
||||
print_success "Ghost stopped successfully."
|
||||
else
|
||||
print_error "failed to stop Ghost!"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "Stopping immich..."
|
||||
$DOCKER_COMPOSE_COMMAND -f ./immich/docker-compose.yml down
|
||||
if [ $? -eq 0 ]; then
|
||||
print_success "Immich stopped successfully."
|
||||
else
|
||||
print_error "failed to stop Immich!"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "Stopping uptime kuma..."
|
||||
$DOCKER_COMPOSE_COMMAND -f ./uptime_kuma/docker-compose.yml down
|
||||
if [ $? -eq 0 ]; then
|
||||
print_success "Uptime kuma stopped successfully."
|
||||
else
|
||||
print_error "failed to stop Uptime kuma!"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "Stopping caddy..."
|
||||
$DOCKER_COMPOSE_COMMAND -f ./caddy/docker-compose.yml down
|
||||
if [ $? -eq 0 ]; then
|
||||
|
16
memos/docker-compose.yaml
Normal file
@@ -0,0 +1,16 @@
|
||||
networks:
|
||||
caddy:
|
||||
name: caddy
|
||||
driver: bridge
|
||||
external: true
|
||||
|
||||
services:
|
||||
memos:
|
||||
image: neosmemo/memos:0.25
|
||||
container_name: memos
|
||||
volumes:
|
||||
- ./data/app:/var/opt/memos
|
||||
ports:
|
||||
- 5230:5230
|
||||
networks:
|
||||
- caddy
|
@@ -1,18 +0,0 @@
|
||||
networks:
|
||||
memos:
|
||||
external: false
|
||||
caddy:
|
||||
name: caddy
|
||||
driver: bridge
|
||||
external: true
|
||||
|
||||
services:
|
||||
server:
|
||||
image: neosmemo/memos:0.23.0
|
||||
container_name: memos
|
||||
restart: unless-stopped
|
||||
networks:
|
||||
- memos
|
||||
- caddy
|
||||
volumes:
|
||||
- ./data/:/var/opt/memos
|
0
private_volume/.gitkeep
Normal file
2
prometheus/.gitignore
vendored
Normal file
@@ -0,0 +1,2 @@
|
||||
/data/*
|
||||
!/data/config
|
18
prometheus/data/config/prometheus.yaml
Normal file
@@ -0,0 +1,18 @@
|
||||
global:
|
||||
scrape_interval: 10s
|
||||
|
||||
scrape_configs:
|
||||
- job_name: "node_exporter"
|
||||
scrape_interval: 2s
|
||||
static_configs:
|
||||
- targets: ["node_exporter:9100"]
|
||||
|
||||
- job_name: "cadvisor"
|
||||
scrape_interval: 2s
|
||||
static_configs:
|
||||
- targets: ["cadvisor:8080"]
|
||||
|
||||
- job_name: caddy
|
||||
scrape_interval: 2s
|
||||
static_configs:
|
||||
- targets: ["caddy:2019"]
|
58
prometheus/docker-compose.yml
Normal file
@@ -0,0 +1,58 @@
|
||||
networks:
|
||||
prometheus:
|
||||
external: false
|
||||
grafana:
|
||||
name: grafana
|
||||
driver: bridge
|
||||
external: true
|
||||
caddy:
|
||||
name: caddy
|
||||
driver: bridge
|
||||
external: true
|
||||
|
||||
services:
|
||||
prometheus:
|
||||
image: prom/prometheus:v3.5.0
|
||||
container_name: prometheus
|
||||
restart: unless-stopped
|
||||
networks:
|
||||
- prometheus
|
||||
- grafana
|
||||
- caddy
|
||||
command: "--config.file=/etc/prometheus/prometheus.yaml --storage.tsdb.retention.time=10d --storage.tsdb.retention.size=15GB"
|
||||
volumes:
|
||||
- ./data/config/prometheus.yaml:/etc/prometheus/prometheus.yaml:ro
|
||||
- prometheus-data:/prometheus
|
||||
|
||||
node_exporter:
|
||||
image: quay.io/prometheus/node-exporter:v1.9.1
|
||||
container_name: node_exporter
|
||||
restart: unless-stopped
|
||||
networks:
|
||||
- prometheus
|
||||
command:
|
||||
- "--path.rootfs=/host"
|
||||
pid: host
|
||||
volumes:
|
||||
- "/:/host:ro,rslave"
|
||||
|
||||
cadvisor:
|
||||
image: gcr.io/cadvisor/cadvisor:v0.49.1
|
||||
container_name: cadvisor
|
||||
restart: unless-stopped
|
||||
networks:
|
||||
- prometheus
|
||||
volumes:
|
||||
- "/:/rootfs:ro"
|
||||
- "/var/run:/var/run:ro"
|
||||
- "/sys:/sys:ro"
|
||||
- "/var/lib/docker/:/var/lib/docker:ro"
|
||||
- "/dev/disk/:/dev/disk:ro"
|
||||
privileged: true
|
||||
devices:
|
||||
- "/dev/kmsg:/dev/kmsg"
|
||||
command:
|
||||
- --disable_metrics=advtcp,cpu_topology,cpuset,hugetlb,memory_numa,process,referenced_memory,resctrl,sched,tcp,udp,percpu,disk,diskIO,oom_event,perf_event
|
||||
|
||||
volumes:
|
||||
prometheus-data:
|
@@ -1,14 +0,0 @@
|
||||
# By default listen on https://localhost
|
||||
# To change this:
|
||||
# * uncomment SEARXNG_HOSTNAME, and replace <host> by the SearXNG hostname
|
||||
# * uncomment LETSENCRYPT_EMAIL, and replace <email> by your email (require to create a Let's Encrypt certificate)
|
||||
|
||||
SEARXNG_HOSTNAME=
|
||||
# LETSENCRYPT_EMAIL=<email>
|
||||
|
||||
# Optional:
|
||||
# If you run a very small or a very large instance, you might want to change the amount of used uwsgi workers and threads per worker
|
||||
# More workers (= processes) means that more search requests can be handled at the same time, but it also causes more resource usage
|
||||
|
||||
# SEARXNG_UWSGI_WORKERS=4
|
||||
# SEARXNG_UWSGI_THREADS=4
|
3
searxng/data/.gitignore
vendored
@@ -1,3 +0,0 @@
|
||||
/searxng/*
|
||||
/valkey-data2/*
|
||||
!.gitkeep
|
@@ -1,42 +0,0 @@
|
||||
networks:
|
||||
searxng:
|
||||
external: false
|
||||
caddy:
|
||||
name: caddy
|
||||
driver: bridge
|
||||
external: true
|
||||
|
||||
services:
|
||||
redis:
|
||||
container_name: searxng_redis
|
||||
image: docker.io/valkey/valkey:8-alpine
|
||||
command: valkey-server --save 30 1 --loglevel warning
|
||||
restart: unless-stopped
|
||||
networks:
|
||||
- searxng
|
||||
volumes:
|
||||
- ./data/valkey-data2:/data
|
||||
logging:
|
||||
driver: "json-file"
|
||||
options:
|
||||
max-size: "1m"
|
||||
max-file: "1"
|
||||
|
||||
searxng:
|
||||
container_name: searxng
|
||||
image: docker.io/searxng/searxng:2024.12.1-0245e82bd
|
||||
restart: unless-stopped
|
||||
networks:
|
||||
- searxng
|
||||
- caddy
|
||||
volumes:
|
||||
- ./data/searxng:/etc/searxng:rw
|
||||
environment:
|
||||
- SEARXNG_BASE_URL=https://${SEARXNG_HOSTNAME:-localhost}/
|
||||
- UWSGI_WORKERS=${SEARXNG_UWSGI_WORKERS:-4}
|
||||
- UWSGI_THREADS=${SEARXNG_UWSGI_THREADS:-4}
|
||||
logging:
|
||||
driver: "json-file"
|
||||
options:
|
||||
max-size: "1m"
|
||||
max-file: "1"
|
@@ -6,7 +6,7 @@ networks:
|
||||
|
||||
services:
|
||||
server:
|
||||
image: drakkan/sftpgo:v2
|
||||
image: drakkan/sftpgo:v2.6.6
|
||||
container_name: sftpgo
|
||||
restart: unless-stopped
|
||||
environment:
|
||||
|
1
uptime_kuma/.env.example
Normal file
@@ -0,0 +1 @@
|
||||
CADDY_DOMAIN=sub.example.com
|
2
uptime_kuma/.gitignore
vendored
Normal file
@@ -0,0 +1,2 @@
|
||||
/data/*
|
||||
!.gitkeep
|
0
uptime_kuma/data/.gitkeep
Normal file
19
uptime_kuma/docker-compose.yml
Normal file
@@ -0,0 +1,19 @@
|
||||
networks:
|
||||
caddy:
|
||||
name: caddy
|
||||
driver: bridge
|
||||
external: true
|
||||
|
||||
services:
|
||||
uptime-kuma:
|
||||
image: louislam/uptime-kuma:1
|
||||
container_name: uptime_kuma
|
||||
restart: unless-stopped
|
||||
volumes:
|
||||
- ./data/app:/app/data
|
||||
- /var/run/docker.sock:/var/run/docker.sock:ro
|
||||
networks:
|
||||
- caddy
|
||||
labels:
|
||||
caddy: ${CADDY_DOMAIN}
|
||||
caddy.reverse_proxy: "* {{upstreams 3001}}"
|
@@ -6,7 +6,7 @@ networks:
|
||||
|
||||
services:
|
||||
server:
|
||||
image: vaultwarden/server:1.32.7
|
||||
image: vaultwarden/server:1.34.2
|
||||
container_name: vaultwarden
|
||||
restart: unless-stopped
|
||||
environment:
|
||||
|
@@ -1,7 +0,0 @@
|
||||
# Language of web page (e.g. en)
|
||||
LANG=
|
||||
# The public hostname or IP of your VPN server (e.g. vpn.example.com, 1.1.1.1)
|
||||
WG_HOST=
|
||||
# (Optional) When set, requires a password when logging in to the Web UI.
|
||||
# See How to generate a hash: https://github.com/wg-easy/wg-easy/blob/master/How_to_generate_an_bcrypt_hash.md
|
||||
PASSWORD_HASH=
|
@@ -1,57 +1,43 @@
|
||||
# volumes:
|
||||
# etc_wireguard:
|
||||
networks:
|
||||
caddy:
|
||||
name: caddy
|
||||
driver: bridge
|
||||
external: true
|
||||
|
||||
services:
|
||||
wg-easy:
|
||||
environment:
|
||||
# Change Language:
|
||||
# (Supports: en, ua, ru, tr, no, pl, fr, de, ca, es, ko, vi, nl, is, pt, chs, cht, it, th, hi, ja)
|
||||
- LANG=${LANG:-en}
|
||||
# ⚠️ Required:
|
||||
# Change this to your host's public address
|
||||
- WG_HOST=${WG_HOST}
|
||||
wg-easy:
|
||||
image: ghcr.io/wg-easy/wg-easy:15
|
||||
container_name: wg-easy
|
||||
networks:
|
||||
caddy:
|
||||
interface_name: wgeth1
|
||||
wg:
|
||||
ipv4_address: 10.42.42.42
|
||||
ipv6_address: fdcc:ad94:bacf:61a3::2a
|
||||
interface_name: wgeth0
|
||||
environment:
|
||||
WG_DEVICE: wgeth0
|
||||
volumes:
|
||||
- ./data:/etc/wireguard
|
||||
- /lib/modules:/lib/modules:ro
|
||||
ports:
|
||||
- "51820:51820/udp"
|
||||
# - "51821:51821/tcp"
|
||||
restart: unless-stopped
|
||||
cap_add:
|
||||
- NET_ADMIN
|
||||
- SYS_MODULE
|
||||
sysctls:
|
||||
- net.ipv4.ip_forward=1
|
||||
- net.ipv4.conf.all.src_valid_mark=1
|
||||
- net.ipv6.conf.all.disable_ipv6=0
|
||||
- net.ipv6.conf.all.forwarding=1
|
||||
- net.ipv6.conf.default.forwarding=1
|
||||
|
||||
# Optional:
|
||||
- PASSWORD_HASH=${PASSWORD_HASH}
|
||||
# - PORT=51821
|
||||
# - WG_PORT=51820
|
||||
# - WG_CONFIG_PORT=92820
|
||||
# - WG_DEFAULT_ADDRESS=10.8.0.x
|
||||
# - WG_DEFAULT_DNS=1.1.1.1
|
||||
# - WG_MTU=1420
|
||||
# - WG_ALLOWED_IPS=192.168.15.0/24, 10.0.1.0/24
|
||||
# - WG_PERSISTENT_KEEPALIVE=25
|
||||
# - WG_PRE_UP=echo "Pre Up" > /etc/wireguard/pre-up.txt
|
||||
# - WG_POST_UP=echo "Post Up" > /etc/wireguard/post-up.txt
|
||||
# - WG_PRE_DOWN=echo "Pre Down" > /etc/wireguard/pre-down.txt
|
||||
# - WG_POST_DOWN=echo "Post Down" > /etc/wireguard/post-down.txt
|
||||
# - UI_TRAFFIC_STATS=true
|
||||
# - UI_CHART_TYPE=0 # (0 Charts disabled, 1 # Line chart, 2 # Area chart, 3 # Bar chart)
|
||||
# - WG_ENABLE_ONE_TIME_LINKS=true
|
||||
# - UI_ENABLE_SORT_CLIENTS=true
|
||||
# - WG_ENABLE_EXPIRES_TIME=true
|
||||
# - ENABLE_PROMETHEUS_METRICS=false
|
||||
# - PROMETHEUS_METRICS_PASSWORD=$$2a$$12$$vkvKpeEAHD78gasyawIod.1leBMKg8sBwKW.pQyNsq78bXV3INf2G # (needs double $$, hash of 'prometheus_password'; see "How_to_generate_an_bcrypt_hash.md" for generate the hash)
|
||||
|
||||
image: ghcr.io/wg-easy/wg-easy:14
|
||||
container_name: wg-easy
|
||||
volumes:
|
||||
- ./data:/etc/wireguard
|
||||
networks:
|
||||
- caddy
|
||||
ports:
|
||||
- "51820:51820/udp"
|
||||
# - "51821:51821/tcp"
|
||||
restart: unless-stopped
|
||||
cap_add:
|
||||
- NET_ADMIN
|
||||
- SYS_MODULE
|
||||
# - NET_RAW # ⚠️ Uncomment if using Podman
|
||||
sysctls:
|
||||
- net.ipv4.ip_forward=1
|
||||
- net.ipv4.conf.all.src_valid_mark=1
|
||||
networks:
|
||||
caddy:
|
||||
name: caddy
|
||||
driver: bridge
|
||||
external: true
|
||||
wg:
|
||||
driver: bridge
|
||||
enable_ipv6: true
|
||||
ipam:
|
||||
driver: default
|
||||
config:
|
||||
- subnet: 10.42.42.0/24
|
||||
- subnet: fdcc:ad94:bacf:61a3::/64
|
||||
|