Compare commits

...

95 Commits

Author SHA1 Message Date
8488001461 Give docker socket access to uptime kuma 2025-08-19 12:58:46 +00:00
34020ece2f Increase prometheus storage retention size 2025-08-19 12:46:06 +00:00
74e451fdf2 bump immich to v1.138.1 2025-08-19 12:45:18 +00:00
4fba524f00 Add uptime kuma 2025-08-15 18:40:40 +00:00
258c204163 Add immich 2025-08-09 13:26:23 +00:00
78e524d61c bump ghost to 6 2025-08-09 11:47:11 +00:00
724c6056f4 replace blinko with memos 2025-08-03 10:52:46 +00:00
fe1d9d5a5b bump vaultwarden to 1.34.2 2025-07-29 06:48:38 +00:00
924dd25b42 bump blinko to v1.2.2 2025-07-26 10:50:32 +00:00
a9fead8950 bump grafana to 12.1.0 2025-07-26 10:48:51 +00:00
20c6e2e223 bump blinko to v1.2.0 2025-07-19 12:16:17 +00:00
42fe309722 bump gitea to v1.24.3 2025-07-16 06:54:42 +00:00
48d89faaee bump prometheus to 3.5.0 2025-07-16 06:53:24 +00:00
Aykhan Shahsuvarov
5ca6236450 wg_easy: add interface name to networks 2025-07-05 11:41:50 +00:00
Aykhan Shahsuvarov
cae7ef2ed6 increase gitea memory limit 2025-07-05 10:13:05 +00:00
c28ad9632b Add restart policy 2025-07-02 14:01:40 +04:00
Aykhan Shahsuvarov
3dda03eee0 add gitea network to main.sh 2025-07-01 21:06:01 +00:00
Aykhan Shahsuvarov
ea305d6b04 bump blinko to v1.1.2 2025-07-01 20:19:31 +00:00
5e67277ab5 bump gitea to 1.24.2 2025-06-21 18:27:55 +00:00
b3361c697f bump gitea to 1.24.1 2025-06-21 10:12:35 +00:00
e66e518eef bump grafana to 12.0.2 2025-06-21 10:11:51 +00:00
1de5d814db bump blinko to 1.1.1 2025-06-17 15:24:06 +00:00
4feed08d9d bump blinko to 1.1.0 2025-06-11 20:53:20 +00:00
be60210294 bump prometheus to 3.4.1 2025-06-11 17:53:39 +00:00
70eb3e0432 bump glance to v0.8.4 2025-06-11 17:50:43 +00:00
b65a887720 bump gitea to 1.24.0 2025-06-11 17:49:36 +00:00
63f19bcab7 update glance home page 2025-06-08 17:50:34 +00:00
c67e052225 update gitea compose file 2025-06-07 14:39:50 +00:00
a1dbc3053b bump blinko to 1.0.7 2025-06-06 11:25:37 +00:00
502486efb7 bump blinko to 1.0.4 2025-05-30 00:57:40 +00:00
db3998f36e bump blinko to 1.0.3 2025-05-29 13:22:11 +00:00
e607c7a914 bump wg easy to 15 2025-05-28 17:32:13 +00:00
912ca6072d bump vaultwarden to 1.34.1 2025-05-27 00:59:27 +00:00
d8322be853 bump grafana to 12.0.1 2025-05-24 12:27:30 +00:00
9c5d06a7d9 bump prometheus to 3.4.0 2025-05-20 20:24:18 +00:00
4f446c9360 bump glance to v0.8.3 2025-05-20 20:10:27 +00:00
a98e483cf8 bump glance to 0.8.2 2025-05-14 21:47:49 +00:00
706bbc2ebf glance: add to-do widget 2025-05-14 23:46:22 +04:00
0c6ac285c3 bump gitea to 1.23.8 2025-05-14 19:43:38 +00:00
d9d3a2193e glance: update themes 2025-05-14 19:43:00 +00:00
1ef6b80b6e bump glance to v0.8.0 and add admin user 2025-05-14 23:34:55 +04:00
18e88f0aba remove glance basic auth 2025-05-14 23:28:27 +04:00
d886f7b563 add 'private_volume' 2025-05-13 16:31:52 +04:00
c2053375b1 bump grafan to 12.0.0 2025-05-05 19:02:10 +00:00
f3f9b0494b bump prometheus v3.3.1 2025-05-03 15:56:48 +00:00
13fae7d8fb bump caddy to 2.10.0-alpine 2025-05-03 15:51:00 +00:00
1de0cb3d7a Update glance home page 2025-04-28 04:45:42 +04:00
0467abeb28 Update compose and env files 2025-04-27 22:35:22 +00:00
a42bd5b5aa Update ghost compose file 2025-04-28 01:49:21 +04:00
e67e637d0d Add ghost 2025-04-28 01:42:12 +04:00
0369eb123e bump grafana to 11.6.1 2025-04-26 12:29:58 +00:00
3f9646c62d bump glance to 0.7.13 2025-04-23 12:25:27 +00:00
e8372b1b42 bump prometheus to 3.3.0 2025-04-19 19:02:57 +00:00
520f645798 update glance home page 2025-04-16 11:57:47 +00:00
bb77431fd1 bump glance to 0.7.12 2025-04-16 11:56:34 +00:00
51fc175a54 bump blinko to 0.52.3 2025-04-16 11:55:36 +00:00
a6932ac724 Update compose file 2025-04-12 11:27:14 +00:00
da397a0ca2 Update compose file 2025-04-11 19:38:28 +00:00
87a4c1fad9 Fix compose file 2025-04-11 01:08:37 +04:00
e9eddf15e3 Fix compose file 2025-04-11 01:05:55 +04:00
b39f777252 Add grafana and prometheus services 2025-04-11 00:52:30 +04:00
36f3ae7d59 Add grafana to Caddyfile and .env.example 2025-04-11 00:49:59 +04:00
f89c69d17b Add grafana 2025-04-11 00:49:31 +04:00
98faa391f0 Add prometheus 2025-04-11 00:41:27 +04:00
d2789c07aa Update compose file 2025-04-11 00:40:33 +04:00
8b1564fb1f Update glance 2025-04-10 12:27:37 +04:00
9505e9d4d9 bumo gitea to 1.23.7 2025-04-09 13:32:38 +00:00
7eed7a6374 bump blinko to 0.50. 2025-04-07 19:50:07 +00:00
569e9e4e70 Update gitea service 2025-04-07 19:46:35 +00:00
6bff22d52f Change blinko image tag 2025-04-02 01:31:52 +04:00
4d2fdae7d5 Replace memos with blinko 2025-04-02 01:29:16 +04:00
53393c1d20 Replace memos with blinko 2025-04-02 01:25:22 +04:00
25e630bddb Replace memos with blinko 2025-04-02 01:08:35 +04:00
f9928defd1 Update caddy/.gitignore 2025-03-31 20:16:28 +00:00
8c0d15ab8b Add data and config volumes to caddy container 2025-04-01 00:12:00 +04:00
271fb8709e bump glance to 0.7.8 2025-03-27 20:57:51 +00:00
619a9e6294 bump gitea to 1.23.6 2025-03-26 18:59:15 +00:00
3cf2c8726b bump memos to 0.24.2 2025-03-23 15:52:57 +00:00
7c59cc9dc7 update 'home.yml' 2025-03-18 23:00:08 +04:00
ffa423dfe2 Fuck reddit 2025-03-18 01:00:35 +04:00
f9d4c0647e add glance 2025-03-17 23:26:08 +04:00
dbe033daa4 bump valutwarden to 1.33.2 2025-03-16 12:23:06 +00:00
80baa059ce bump sftpgo to 2.6.6 2025-03-16 12:19:53 +00:00
611db63535 bump memos to 0.24.1 2025-03-16 12:17:14 +00:00
a4db908a18 bump gitea to 1.23.5 2025-03-16 12:14:24 +00:00
81b2788651 Add act runner config.yaml to git 2025-03-13 00:02:15 +00:00
8025390bc1 Add act runner config file 2025-03-13 00:01:34 +00:00
0626b1f939 Make gitea network external 2025-03-13 00:01:13 +00:00
60b9938484 'searxng' removed from services 2025-03-06 23:05:07 +00:00
ce8d530592 added 'Caddyfile.private' 2025-02-27 02:19:50 +04:00
087af75a42 bump caddy to 2.9.1 2025-02-07 18:18:00 +00:00
976147a09b bump vaultwarden to 1.33.1 2025-02-07 18:14:48 +00:00
e9220c76da bump sftp to 2.6.5 2025-02-07 18:12:03 +00:00
aa5cae0e83 bump memos to 0.24.0 2025-02-07 18:08:00 +00:00
b5df81f2ad bump gitea to 1.23.3 2025-02-07 18:06:03 +00:00
59 changed files with 27352 additions and 271 deletions

4
.gitignore vendored
View File

@@ -1,2 +1,4 @@
/private
.env
.env
/private_volume/*
!.gitkeep

View File

@@ -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:

View File

@@ -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
View File

@@ -1,2 +1,6 @@
/ssl/*
!.gitkeep
/data/*
/data/config/*
!/data/config/
!.gitkeep
Caddyfile.private

View File

@@ -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

View File

@@ -0,0 +1 @@
# Private Caddy config

View File

@@ -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
View 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
View File

@@ -0,0 +1,2 @@
/data/*
!.gitkeep

0
ghost/data/.gitkeep Normal file
View File

31
ghost/docker-compose.yml Normal file
View 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
View File

@@ -1,3 +1,4 @@
/data/*
/act-data/*
!.gitkeep
!/act-data/config.yaml
!.gitkeep

View File

@@ -0,0 +1,3 @@
container:
network: gitea
options: ""

View File

@@ -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
View File

@@ -0,0 +1,3 @@
GITHUB_TOKEN=
SECRET_KEY=
ADMIN_PASSWORD=

BIN
glance/assets/ghost.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

1
glance/assets/gitea.svg Normal file
View 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

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

BIN
glance/assets/memos.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 56 KiB

BIN
glance/assets/seradar.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

BIN
glance/assets/sftpgo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

1
glance/assets/slash.svg Normal file
View 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

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

0
glance/assets/user.css Normal file
View File

View 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

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

46
glance/config/glance.yml Normal file
View 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
View 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
View 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

File diff suppressed because it is too large Load Diff

View 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
}

File diff suppressed because it is too large Load Diff

View 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

View File

@@ -0,0 +1,9 @@
apiVersion: 1
datasources:
- name: Prometheus
uid: prometheusdatasource
type: prometheus
access: proxy
url: http://prometheus:9090
isDefault: true

View 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
View 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
View File

@@ -0,0 +1,2 @@
/data/*
!.gitkeep

0
immich/data/.gitkeep Normal file
View File

80
immich/docker-compose.yml Normal file
View 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
View File

@@ -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
View 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

View File

@@ -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
View File

2
prometheus/.gitignore vendored Normal file
View File

@@ -0,0 +1,2 @@
/data/*
!/data/config

View 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"]

View 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:

View File

@@ -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

View File

@@ -1,3 +0,0 @@
/searxng/*
/valkey-data2/*
!.gitkeep

View File

@@ -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"

View File

@@ -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
View File

@@ -0,0 +1 @@
CADDY_DOMAIN=sub.example.com

2
uptime_kuma/.gitignore vendored Normal file
View File

@@ -0,0 +1,2 @@
/data/*
!.gitkeep

View File

View 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}}"

View File

@@ -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:

View File

@@ -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=

View File

@@ -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