Compare commits
8 Commits
daccaf3819
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
7cde2f5123
|
|||
|
b6efc9f55a
|
|||
|
888fac609f
|
|||
|
f6d7848914
|
|||
|
a38f0c6487
|
|||
|
c48fb6bf3a
|
|||
|
b1a09b76b3
|
|||
|
bda189c903
|
@@ -7,7 +7,6 @@ services:
|
|||||||
- "traefik.http.routers.actual-web.middlewares=redirect-to-https@file"
|
- "traefik.http.routers.actual-web.middlewares=redirect-to-https@file"
|
||||||
- "traefik.http.routers.actual.rule=Host(`actual.skrd.fun`)"
|
- "traefik.http.routers.actual.rule=Host(`actual.skrd.fun`)"
|
||||||
- "traefik.http.routers.actual.entrypoints=websecure"
|
- "traefik.http.routers.actual.entrypoints=websecure"
|
||||||
- "traefik.http.routers.actual.middlewares=crowdsec@file"
|
|
||||||
- "traefik.http.routers.actual.tls.certresolver=cf"
|
- "traefik.http.routers.actual.tls.certresolver=cf"
|
||||||
- "traefik.http.services.actual.loadbalancer.server.port=5006"
|
- "traefik.http.services.actual.loadbalancer.server.port=5006"
|
||||||
networks:
|
networks:
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
services:
|
services:
|
||||||
actual_server:
|
actual_server:
|
||||||
image: ghcr.io/actualbudget/actual:latest
|
image: ghcr.io/actualbudget/actual:v26.2.0
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
volumes:
|
volumes:
|
||||||
- ${DATA_DIR}:/data
|
- ${DATA_DIR}:/data
|
||||||
|
|||||||
@@ -1,3 +0,0 @@
|
|||||||
DATA_DIR="./crowdsec"
|
|
||||||
COLLECTIONS="crowdsecurity/traefik crowdsecurity/http-cve crowdsecurity/base-http-scenarios crowdsecurity/sshd crowdsecurity/linux crowdsecurity/appsec-generic-rules crowdsecurity/appsec-virtual-patching crowdsecurity/appsec-crs"
|
|
||||||
GID=1000
|
|
||||||
@@ -1,24 +0,0 @@
|
|||||||
services:
|
|
||||||
crowdsec:
|
|
||||||
image: crowdsecurity/crowdsec
|
|
||||||
restart: unless-stopped
|
|
||||||
ports:
|
|
||||||
- 127.0.0.1:9876:8080
|
|
||||||
expose:
|
|
||||||
- 8080
|
|
||||||
- 6060
|
|
||||||
- 7422
|
|
||||||
environment:
|
|
||||||
COLLECTIONS: "${COLLECTIONS}"
|
|
||||||
GID: "${GID-1000}"
|
|
||||||
volumes:
|
|
||||||
- "${DATA_ROOT}/crowdsec/data:/var/lib/crowdsec/data/"
|
|
||||||
- "${DATA_ROOT}/crowdsec/config:/etc/crowdsec/"
|
|
||||||
- "${DATA_ROOT}/traefik/logs:/var/log/traefik:ro"
|
|
||||||
- /var/log/auth.log:/var/log/auth.log:ro
|
|
||||||
- /var/log/syslog:/var/log/syslog:ro
|
|
||||||
networks:
|
|
||||||
- traefik
|
|
||||||
networks:
|
|
||||||
traefik:
|
|
||||||
external: true
|
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
services:
|
services:
|
||||||
cloudflare-ddns:
|
cloudflare-ddns:
|
||||||
image: favonia/cloudflare-ddns:latest
|
image: favonia/cloudflare-ddns:1.15.1
|
||||||
restart: always
|
restart: always
|
||||||
user: "1000:1000"
|
user: "1000:1000"
|
||||||
read_only: true
|
read_only: true
|
||||||
|
|||||||
@@ -7,7 +7,6 @@ services:
|
|||||||
- "traefik.http.routers.gametabs-web.middlewares=redirect-to-https@file"
|
- "traefik.http.routers.gametabs-web.middlewares=redirect-to-https@file"
|
||||||
- "traefik.http.routers.gametabs.rule=Host(`gametabs.skrd.fun`)"
|
- "traefik.http.routers.gametabs.rule=Host(`gametabs.skrd.fun`)"
|
||||||
- "traefik.http.routers.gametabs.entrypoints=websecure"
|
- "traefik.http.routers.gametabs.entrypoints=websecure"
|
||||||
- "traefik.http.routers.gametabs.middlewares=crowdsec@file"
|
|
||||||
- "traefik.http.routers.gametabs.tls.certresolver=cf"
|
- "traefik.http.routers.gametabs.tls.certresolver=cf"
|
||||||
- "traefik.http.services.gametabs.loadbalancer.server.port=80"
|
- "traefik.http.services.gametabs.loadbalancer.server.port=80"
|
||||||
|
|
||||||
|
|||||||
@@ -11,7 +11,6 @@ services:
|
|||||||
- "traefik.http.routers.gitea-web.middlewares=redirect-to-https@file"
|
- "traefik.http.routers.gitea-web.middlewares=redirect-to-https@file"
|
||||||
- "traefik.http.routers.gitea.rule=Host(`git.skrd.fun`)"
|
- "traefik.http.routers.gitea.rule=Host(`git.skrd.fun`)"
|
||||||
- "traefik.http.routers.gitea.entrypoints=websecure"
|
- "traefik.http.routers.gitea.entrypoints=websecure"
|
||||||
- "traefik.http.routers.gitea.middlewares=crowdsec@file"
|
|
||||||
- "traefik.http.routers.gitea.tls.certresolver=cf"
|
- "traefik.http.routers.gitea.tls.certresolver=cf"
|
||||||
- "traefik.http.services.gitea.loadbalancer.server.port=3000"
|
- "traefik.http.services.gitea.loadbalancer.server.port=3000"
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
services:
|
services:
|
||||||
gitea:
|
gitea:
|
||||||
image: gitea/gitea:latest
|
image: gitea/gitea:1.25.4
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
environment:
|
environment:
|
||||||
USER_UID: ${USER_UID}
|
USER_UID: ${USER_UID}
|
||||||
@@ -13,7 +13,7 @@ services:
|
|||||||
- gitea-db
|
- gitea-db
|
||||||
|
|
||||||
runner:
|
runner:
|
||||||
image: gitea/act_runner:latest
|
image: gitea/act_runner:0.2.13
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
environment:
|
environment:
|
||||||
CONFIG_FILE: /config/config.yaml
|
CONFIG_FILE: /config/config.yaml
|
||||||
|
|||||||
@@ -8,7 +8,6 @@ services:
|
|||||||
- "traefik.http.routers.immich-web.middlewares=redirect-to-https@file"
|
- "traefik.http.routers.immich-web.middlewares=redirect-to-https@file"
|
||||||
- "traefik.http.routers.immich.rule=Host(`photos.skrd.fun`)"
|
- "traefik.http.routers.immich.rule=Host(`photos.skrd.fun`)"
|
||||||
- "traefik.http.routers.immich.entrypoints=websecure"
|
- "traefik.http.routers.immich.entrypoints=websecure"
|
||||||
- "traefik.http.routers.immich.middlewares=crowdsec@file"
|
|
||||||
- "traefik.http.routers.immich.tls.certresolver=cf"
|
- "traefik.http.routers.immich.tls.certresolver=cf"
|
||||||
- "traefik.http.services.immich.loadbalancer.server.port=2283"
|
- "traefik.http.services.immich.loadbalancer.server.port=2283"
|
||||||
networks:
|
networks:
|
||||||
|
|||||||
@@ -8,7 +8,6 @@ services:
|
|||||||
- "traefik.http.routers.jellyfin.rule=Host(`jelly.skrd.fun`)"
|
- "traefik.http.routers.jellyfin.rule=Host(`jelly.skrd.fun`)"
|
||||||
- "traefik.http.routers.jellyfin.entrypoints=websecure"
|
- "traefik.http.routers.jellyfin.entrypoints=websecure"
|
||||||
- "traefik.http.routers.jellyfin.tls.certresolver=cf"
|
- "traefik.http.routers.jellyfin.tls.certresolver=cf"
|
||||||
- "traefik.http.routers.jellyfin.middlewares=crowdsec@file"
|
|
||||||
- "traefik.http.services.jellyfin.loadbalancer.server.port=8096"
|
- "traefik.http.services.jellyfin.loadbalancer.server.port=8096"
|
||||||
networks:
|
networks:
|
||||||
default:
|
default:
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
services:
|
services:
|
||||||
jellyfin:
|
jellyfin:
|
||||||
image: jellyfin/jellyfin
|
image: jellyfin/jellyfin:10
|
||||||
restart: "unless-stopped"
|
restart: "unless-stopped"
|
||||||
user: 1000:1000
|
user: 1000:1000
|
||||||
volumes:
|
volumes:
|
||||||
|
|||||||
@@ -5,12 +5,9 @@ services:
|
|||||||
- "traefik.http.routers.books-web.rule=Host(`books.skrd.fun`)"
|
- "traefik.http.routers.books-web.rule=Host(`books.skrd.fun`)"
|
||||||
- "traefik.http.routers.books-web.entrypoints=web"
|
- "traefik.http.routers.books-web.entrypoints=web"
|
||||||
- "traefik.http.routers.books-web.middlewares=redirect-to-https@file"
|
- "traefik.http.routers.books-web.middlewares=redirect-to-https@file"
|
||||||
|
|
||||||
- "traefik.http.routers.books.rule=Host(`books.skrd.fun`)"
|
- "traefik.http.routers.books.rule=Host(`books.skrd.fun`)"
|
||||||
- "traefik.http.routers.books.entrypoints=websecure"
|
- "traefik.http.routers.books.entrypoints=websecure"
|
||||||
- "traefik.http.routers.books.middlewares=crowdsec@file"
|
|
||||||
- "traefik.http.routers.books.tls.certresolver=cf"
|
- "traefik.http.routers.books.tls.certresolver=cf"
|
||||||
|
|
||||||
- "traefik.http.services.books.loadbalancer.server.port=5000"
|
- "traefik.http.services.books.loadbalancer.server.port=5000"
|
||||||
|
|
||||||
networks:
|
networks:
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
services:
|
services:
|
||||||
kavita:
|
kavita:
|
||||||
image: jvmilazz0/kavita:latest
|
image: jvmilazz0/kavita:0.7.8
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
volumes:
|
volumes:
|
||||||
- "${MEDIA_BOOKS}:/books"
|
- "${MEDIA_BOOKS}:/books"
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ POSTGRES_USER="miniflux"
|
|||||||
POSTGRES_PASSWORD="secret"
|
POSTGRES_PASSWORD="secret"
|
||||||
POSTGRES_DB="miniflux"
|
POSTGRES_DB="miniflux"
|
||||||
|
|
||||||
|
DATA_DIR="./database"
|
||||||
DATABASE_URL="postgres://miniflux:secret@db/miniflux?sslmode=disable"
|
DATABASE_URL="postgres://miniflux:secret@db/miniflux?sslmode=disable"
|
||||||
|
|
||||||
ADMIN_USERNAME="ryuuji"
|
ADMIN_USERNAME="ryuuji"
|
||||||
|
|||||||
@@ -8,7 +8,6 @@ services:
|
|||||||
- "traefik.http.routers.rss-web.middlewares=redirect-to-https@file"
|
- "traefik.http.routers.rss-web.middlewares=redirect-to-https@file"
|
||||||
- "traefik.http.routers.rss.rule=Host(`rss.skrd.fun`)"
|
- "traefik.http.routers.rss.rule=Host(`rss.skrd.fun`)"
|
||||||
- "traefik.http.routers.rss.entrypoints=websecure"
|
- "traefik.http.routers.rss.entrypoints=websecure"
|
||||||
- "traefik.http.routers.rss.middlewares=crowdsec@file"
|
|
||||||
- "traefik.http.routers.rss.tls.certresolver=cf"
|
- "traefik.http.routers.rss.tls.certresolver=cf"
|
||||||
- "traefik.http.services.rss.loadbalancer.server.port=8080"
|
- "traefik.http.services.rss.loadbalancer.server.port=8080"
|
||||||
networks:
|
networks:
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
services:
|
services:
|
||||||
miniflux:
|
miniflux:
|
||||||
image: miniflux/miniflux:latest
|
image: miniflux/miniflux:2.2.17
|
||||||
depends_on:
|
depends_on:
|
||||||
db:
|
db:
|
||||||
condition: service_healthy
|
condition: service_healthy
|
||||||
@@ -18,11 +18,8 @@ services:
|
|||||||
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
|
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
|
||||||
POSTGRES_DB: ${POSTGRES_DB}
|
POSTGRES_DB: ${POSTGRES_DB}
|
||||||
volumes:
|
volumes:
|
||||||
- miniflux-db:/var/lib/postgresql
|
- ${DATA_DIR}:/var/lib/postgresql
|
||||||
healthcheck:
|
healthcheck:
|
||||||
test: ["CMD", "pg_isready", "-U", "miniflux"]
|
test: ["CMD", "pg_isready", "-U", "${POSTGRES_USER}"]
|
||||||
interval: 10s
|
interval: 10s
|
||||||
start_period: 30s
|
start_period: 30s
|
||||||
|
|
||||||
volumes:
|
|
||||||
miniflux-db:
|
|
||||||
|
|||||||
@@ -7,7 +7,6 @@ services:
|
|||||||
- "traefik.http.routers.navidrome-web.middlewares=redirect-to-https@file"
|
- "traefik.http.routers.navidrome-web.middlewares=redirect-to-https@file"
|
||||||
- "traefik.http.routers.navidrome.rule=Host(`navi.skrd.fun`)"
|
- "traefik.http.routers.navidrome.rule=Host(`navi.skrd.fun`)"
|
||||||
- "traefik.http.routers.navidrome.entrypoints=websecure"
|
- "traefik.http.routers.navidrome.entrypoints=websecure"
|
||||||
- "traefik.http.routers.navidrome.middlewares=crowdsec@file"
|
|
||||||
- "traefik.http.routers.navidrome.tls.certresolver=cf"
|
- "traefik.http.routers.navidrome.tls.certresolver=cf"
|
||||||
- "traefik.http.services.navidrome.loadbalancer.server.port=4533"
|
- "traefik.http.services.navidrome.loadbalancer.server.port=4533"
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
services:
|
services:
|
||||||
navidrome:
|
navidrome:
|
||||||
image: deluan/navidrome:latest
|
image: deluan/navidrome:0.60.3
|
||||||
user: 1000:1000
|
user: 1000:1000
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
environment:
|
environment:
|
||||||
|
|||||||
@@ -7,7 +7,6 @@ services:
|
|||||||
- "traefik.http.routers.qbittorrent-web.middlewares=redirect-to-https@file"
|
- "traefik.http.routers.qbittorrent-web.middlewares=redirect-to-https@file"
|
||||||
- "traefik.http.routers.qbittorrent.rule=Host(`torrent.skrd.fun`)"
|
- "traefik.http.routers.qbittorrent.rule=Host(`torrent.skrd.fun`)"
|
||||||
- "traefik.http.routers.qbittorrent.entrypoints=websecure"
|
- "traefik.http.routers.qbittorrent.entrypoints=websecure"
|
||||||
- "traefik.http.routers.qbittorrent.middlewares=crowdsec@file"
|
|
||||||
- "traefik.http.routers.qbittorrent.tls.certresolver=cf"
|
- "traefik.http.routers.qbittorrent.tls.certresolver=cf"
|
||||||
- "traefik.http.services.qbittorrent.loadbalancer.server.port=${WEBUI_PORT}"
|
- "traefik.http.services.qbittorrent.loadbalancer.server.port=${WEBUI_PORT}"
|
||||||
networks:
|
networks:
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
services:
|
services:
|
||||||
qbittorrent:
|
qbittorrent:
|
||||||
image: lscr.io/linuxserver/qbittorrent:latest
|
image: lscr.io/linuxserver/qbittorrent:5.1.4
|
||||||
environment:
|
environment:
|
||||||
- PUID=${PUID}
|
- PUID=${PUID}
|
||||||
- PGID=${PGID}
|
- PGID=${PGID}
|
||||||
@@ -9,6 +9,7 @@ services:
|
|||||||
- TORRENTING_PORT=${TORRENTING_PORT}
|
- TORRENTING_PORT=${TORRENTING_PORT}
|
||||||
ports:
|
ports:
|
||||||
- "${TORRENTING_PORT}:${TORRENTING_PORT}"
|
- "${TORRENTING_PORT}:${TORRENTING_PORT}"
|
||||||
|
- "${TORRENTING_PORT}:${TORRENTING_PORT}/udp"
|
||||||
volumes:
|
volumes:
|
||||||
- ${DATA_DIR}:/config
|
- ${DATA_DIR}:/config
|
||||||
- ${DOWNLOADS_DIR}:/downloads
|
- ${DOWNLOADS_DIR}:/downloads
|
||||||
|
|||||||
@@ -7,7 +7,6 @@ services:
|
|||||||
- "traefik.http.routers.speed-web.middlewares=redirect-to-https@file"
|
- "traefik.http.routers.speed-web.middlewares=redirect-to-https@file"
|
||||||
- "traefik.http.routers.speed.rule=Host(`speed.skrd.fun`)"
|
- "traefik.http.routers.speed.rule=Host(`speed.skrd.fun`)"
|
||||||
- "traefik.http.routers.speed.entrypoints=websecure"
|
- "traefik.http.routers.speed.entrypoints=websecure"
|
||||||
- "traefik.http.routers.speed.middlewares=crowdsec@file"
|
|
||||||
- "traefik.http.routers.speed.tls.certresolver=cf"
|
- "traefik.http.routers.speed.tls.certresolver=cf"
|
||||||
- "traefik.http.services.speed.loadbalancer.server.port=3000"
|
- "traefik.http.services.speed.loadbalancer.server.port=3000"
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
services:
|
services:
|
||||||
speedtest:
|
speedtest:
|
||||||
image: openspeedtest/latest
|
image: openspeedtest/latest:v2.0.6
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
|
|||||||
@@ -3,4 +3,3 @@ DYNAMIC_DIR="./dynamic"
|
|||||||
|
|
||||||
CF_API_EMAIL=email@example.com
|
CF_API_EMAIL=email@example.com
|
||||||
CF_DNS_API_TOKEN=secret
|
CF_DNS_API_TOKEN=secret
|
||||||
CROWDSEC_LAPI_KEY="secret"
|
|
||||||
|
|||||||
@@ -1,9 +1,8 @@
|
|||||||
services:
|
services:
|
||||||
traefik:
|
traefik:
|
||||||
image: traefik:v3.5
|
image: traefik:v3.6
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
command:
|
command:
|
||||||
- "--log.level=DEBUG"
|
|
||||||
- "--accesslog=true"
|
- "--accesslog=true"
|
||||||
- "--accesslog.filepath=/logs/traefik-access.log"
|
- "--accesslog.filepath=/logs/traefik-access.log"
|
||||||
- "--accesslog.format=json"
|
- "--accesslog.format=json"
|
||||||
@@ -16,15 +15,12 @@ services:
|
|||||||
- "--providers.docker.exposedbydefault=false"
|
- "--providers.docker.exposedbydefault=false"
|
||||||
- "--providers.file.directory=/dynamic"
|
- "--providers.file.directory=/dynamic"
|
||||||
- "--providers.file.watch=true"
|
- "--providers.file.watch=true"
|
||||||
- "--serversTransport.insecureSkipVerify=true"
|
|
||||||
- "--entryPoints.web.address=:80"
|
- "--entryPoints.web.address=:80"
|
||||||
- "--entryPoints.websecure.address=:443"
|
- "--entryPoints.websecure.address=:443"
|
||||||
- "--certificatesresolvers.cf.acme.dnschallenge=true"
|
- "--certificatesresolvers.cf.acme.dnschallenge=true"
|
||||||
- "--certificatesresolvers.cf.acme.dnschallenge.provider=cloudflare"
|
- "--certificatesresolvers.cf.acme.dnschallenge.provider=cloudflare"
|
||||||
- "--certificatesresolvers.cf.acme.email=tls@skrd.fun"
|
- "--certificatesresolvers.cf.acme.email=tls@skrd.fun"
|
||||||
- "--certificatesresolvers.cf.acme.storage=/letsencrypt/acme.json"
|
- "--certificatesresolvers.cf.acme.storage=/letsencrypt/acme.json"
|
||||||
- "--experimental.plugins.bouncer.modulename=github.com/maxlerebourg/crowdsec-bouncer-traefik-plugin"
|
|
||||||
- "--experimental.plugins.bouncer.version=v1.4.6"
|
|
||||||
ports:
|
ports:
|
||||||
- "80:80"
|
- "80:80"
|
||||||
- "443:443"
|
- "443:443"
|
||||||
@@ -38,7 +34,7 @@ services:
|
|||||||
- "traefik.http.routers.dashboard.tls=true"
|
- "traefik.http.routers.dashboard.tls=true"
|
||||||
- "traefik.http.routers.dashboard.tls.certresolver=cf"
|
- "traefik.http.routers.dashboard.tls.certresolver=cf"
|
||||||
- "traefik.http.routers.dashboard.service=api@internal"
|
- "traefik.http.routers.dashboard.service=api@internal"
|
||||||
- "traefik.http.routers.dashboard.middlewares=local-only@file, crowdsec@file"
|
- "traefik.http.routers.dashboard.middlewares=local-only@file"
|
||||||
volumes:
|
volumes:
|
||||||
- "/var/run/docker.sock:/var/run/docker.sock"
|
- "/var/run/docker.sock:/var/run/docker.sock"
|
||||||
- "${DYNAMIC_DIR}:/dynamic"
|
- "${DYNAMIC_DIR}:/dynamic"
|
||||||
|
|||||||
@@ -12,25 +12,3 @@ http:
|
|||||||
replacePathRegex:
|
replacePathRegex:
|
||||||
regex: ^/$
|
regex: ^/$
|
||||||
replacement: /admin/
|
replacement: /admin/
|
||||||
crowdsec:
|
|
||||||
plugin:
|
|
||||||
bouncer:
|
|
||||||
enabled: true
|
|
||||||
defaultDecisionSeconds: 60
|
|
||||||
crowdsecMode: live
|
|
||||||
crowdsecAppsecEnabled: true
|
|
||||||
crowdsecAppsecHost: crowdsec:7422
|
|
||||||
crowdsecAppsecFailureBlock: true
|
|
||||||
crowdsecAppsecUnreachableBlock: true
|
|
||||||
crowdsecLapiKey: mvBM8BzhJ1/P8Lcb72gsIn5JNgQCzwsRSKNuBJqJ/0Q
|
|
||||||
crowdsecLapiHost: crowdsec:8080
|
|
||||||
crowdsecLapiScheme: http
|
|
||||||
crowdsecLapiTLSInsecureVerify: false
|
|
||||||
forwardedHeadersTrustedIPs:
|
|
||||||
- 10.0.0.0/8
|
|
||||||
- 172.16.0.0/12
|
|
||||||
- 192.168.0.0/16
|
|
||||||
clientTrustedIPs:
|
|
||||||
- 10.0.0.0/8
|
|
||||||
- 172.16.0.0/12
|
|
||||||
- 192.168.0.0/16
|
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
version: "3"
|
|
||||||
services:
|
services:
|
||||||
db:
|
db:
|
||||||
image: mariadb
|
image: mariadb
|
||||||
|
|||||||
Reference in New Issue
Block a user