Compare commits

..
15 Commits
Author SHA1 Message Date
adrien 7bd2fea25c Plenty changes 2026-05-15 21:42:50 +00:00
adrien cbc9cd0b20 Kopia gcp to Kopia cloud 2025-09-21 21:45:29 +00:00
adrien 8e9ecbeb58 Fix 2025-09-21 21:44:56 +00:00
adrien b6fbe161c1 Removec arch gpu for ollama 2025-09-21 21:44:47 +00:00
adrien c18c745400 Update README 2025-07-07 21:59:28 +00:00
adrien 5d3aff6df5 Added more limit to arch cpu 2025-07-07 21:59:23 +00:00
adrien fc91496720 Added shared dir between filwbrowser and libreoffice 2025-07-07 21:59:15 +00:00
adrien f334c2185e Fix type 2025-07-01 16:38:12 +00:00
adrien 9233278247 Removed useless quote and fix some indent 2025-06-30 21:36:09 +00:00
adrien 6eb8b29716 Deleted old website.yml 2025-06-30 21:24:01 +00:00
adrien 3ccda644e2 Added registry and arch VMS based on it
2 VM one CPU and one GPU
Also have a simple UI for the registry
Added readTimeout because big layers take too long to transfert
2025-06-30 21:15:46 +00:00
adrien 7ff800f97c Renamed gitea to developer 2025-06-29 17:55:25 +00:00
adrien e23db82aac Renamed gitea to developer 2025-06-29 17:55:10 +00:00
adrien 68e720bce3 Commented out ollama 2025-06-29 17:54:42 +00:00
adrien 24105c4ab5 Update arch machine 2025-06-29 17:54:35 +00:00
12 changed files with 378 additions and 380 deletions
+3
View File
@@ -6,3 +6,6 @@ letsencrypt
website-pro website-pro
config/gitea/conf config/gitea/conf
config/affine/private.key config/affine/private.key
kopia-gcp-key.json
config/garage
DragnCards
@@ -9,7 +9,6 @@ RUN pacman -Syu --noconfirm && \
vim \ vim \
nvim \ nvim \
nano \ nano \
htop \
lazygit \ lazygit \
ttyd \ ttyd \
sudo \ sudo \
@@ -17,24 +16,28 @@ RUN pacman -Syu --noconfirm && \
net-tools \ net-tools \
iputils \ iputils \
bind-tools \ bind-tools \
unzip \
yazi \
go \
zig \
ripgrep \
openssh && \ openssh && \
pacman -Scc --noconfirm pacman -Scc --noconfirm
# Create a workspace directory # Create a workspace directory
RUN mkdir -p /data RUN mkdir -p /data
# Create entrypoint script
RUN echo '#!/bin/bash' > /entrypoint.sh && \
echo 'chmod 600 /root/.ssh/id_rsa' >> /entrypoint.sh && \
echo 'exec ttyd -c $TTYD_USERNAME:$TTYD_PASSWORD -W -p 7681 bash' >> /entrypoint.sh && \
chmod +x /entrypoint.sh
# Install Astronvim # Install Astronvim
RUN git clone --depth 1 https://github.com/AstroNvim/template ~/.config/nvim && \ RUN git clone --depth 1 https://github.com/AstroNvim/template ~/.config/nvim && \
rm -rf ~/.config/nvim/.git rm -rf ~/.config/nvim/.git
# Setup Git
RUN git config --global user.email "git@bouvais.lu"
RUN git config --global user.name "adrien"
# Add Gopls
RUN go install golang.org/x/tools/gopls@latest
WORKDIR /data WORKDIR /data
EXPOSE 7681 EXPOSE 7681
ENTRYPOINT ["/entrypoint.sh"]
+8
View File
@@ -0,0 +1,8 @@
FROM registry.bouvais.lu/vms/arch-ttyd-cpu:1.0.0
RUN pacman -Syu --noconfirm && \
pacman -S --noconfirm \
nvidia \
cuda \
nvidia-utils && \
pacman -Scc --noconfirm
+25 -26
View File
@@ -1,36 +1,35 @@
# Self-Hosted Services # Self-Hosted Services
This repository contains my personal Docker Compose configuration for various self-hosted services, all exposed via Traefik. This repository contains my personal Docker Compose configuration for various self-hosted services, all exposed via Traefik. It serves primarily as a personal deployment configuration and a reference for others.
It serves primarily as a personal deployment configuration and a reference for others.
--- ***
### Services Included: ### Services Included:
- **Traefik:** Reverse proxy and load balancer with automatic HTTPS, now also handling SSH entry points and `bouvais.lu` redirection. * **Traefik:** Reverse proxy and load balancer with automatic HTTPS, now also handling SSH entry points and `bouvais.lu` redirection.
- **Prometheus:** Monitoring system. * **Monitoring Stack:**
- **Grafana:** Data visualization and dashboarding for Prometheus. * **Prometheus:** Monitoring system.
- **cAdvisor:** Container resource usage and performance analysis. * **Grafana:** Data visualization and dashboarding for Prometheus.
- **Node Exporter:** Exposes hardware and OS metrics for Prometheus. * **cAdvisor:** Container resource usage and performance analysis.
- **Nvidia GPU Exporter:** Exposes NVIDIA GPU metrics for Prometheus. * **Node Exporter:** Exposes hardware and OS metrics for Prometheus.
- **Fail2Ban:** Intrusion prevention for various services, specifically configured to monitor Docker logs. * **Nvidia GPU Exporter:** Exposes NVIDIA GPU metrics for Prometheus.
- **Vaultwarden:** Unofficial Bitwarden server implementation, with an added secure admin interface. * **Fail2Ban:** Intrusion prevention for various services, specifically configured to monitor Traefik's access logs.
- **Kopia:** Fast, secure, and incremental backups, with a web UI. * **Vaultwarden:** Unofficial Bitwarden server implementation, with an added secure admin interface.
- **Siyuan:** A local-first personal knowledge management system (replaces Memos). * **Kopia:** Two instances for fast, secure, and incremental backups: one for local backups (`kopia`) and another for off-site backups to Google Cloud Platform (`kopia-gcp`).
- **Jellyfin:** Free software media system. * **Siyuan:** A local-first personal knowledge management system.
- **Filebrowser:** Web interface to browse and manage files. * **Jellyfin:** Free software media system.
- **Gitea:** Lightweight Git service (this repository is hosted on it!), also serving documentation via MkDocs. * **Filebrowser:** Web interface to browse and manage files.
- **Gitea Runner:** A runner for Gitea actions. * **LibreOffice Online:** A web-based version of the LibreOffice suite for in-browser document editing.
- **MkDocs ZipponDB:** Serves documentation generated by MkDocs. * **Gitea & Gitea Runner:** A lightweight Git service and a runner for Gitea actions.
- **Actual Budget:** Local-first personal finance app. * **MkDocs:** Serves a static documentation site generated by MkDocs.
- **MinIO:** High performance, S3 compatible object storage. * **Docker Registry & UI:** A private Docker registry to store custom images, complete with a web interface for management.
- **Open WebUI:** A user-friendly interface for interacting with large language models. * **Actual Budget:** Local-first personal finance app.
- **Ollama:** A framework for running large language models locally, with GPU support. * **MinIO:** High performance, S3 compatible object storage. For DVC.
- **Personal Website (website-pro):** A custom-built professional website. * **Open WebUI & Pipelines:** A user-friendly interface for interacting with large language models, supported by a backend pipeline service.
* **Web-based Arch Linux Terminals:** Two `ttyd`-based containers (`arch-cpu` and `arch-gpu`) providing persistent Arch Linux environments accessible through a web browser, with one configured for GPU access.
--- ***
### Usage ### Usage
This repository is not intended for direct cloning and deployment as-is. It is highly tailored to my specific setup, including domain names (`bouvais.lu`), paths, and personal configurations. This repository is not intended for direct cloning and deployment as-is. It is highly tailored to my specific setup, including domain names (`bouvais.lu`), paths, and personal configurations. However, you can use this repository as an example or reference.
However, you can use this repository as an example or reference.
+69 -82
View File
@@ -1,17 +1,4 @@
services: services:
#memos:
# image: neosmemo/memos:stable
# container_name: memos
# restart: unless-stopped
# volumes:
# - "./hdd0/memos:/var/opt/memos"
# labels:
# - "traefik.enable=true"
# - "traefik.http.routers.memos.rule=Host(`notes.bouvais.lu`)"
# - "traefik.http.routers.memos.entrypoints=websecure"
# - "traefik.http.routers.memos.tls.certresolver=myresolver"
# - "traefik.http.services.memos.loadbalancer.server.port=5230"
jellyfin: jellyfin:
image: jellyfin/jellyfin image: jellyfin/jellyfin
container_name: jellyfin container_name: jellyfin
@@ -20,17 +7,17 @@ services:
- '107' #render - '107' #render
- '44' #video - '44' #video
volumes: volumes:
- "./cache/jellyfin/cache:/cache" - ./cache/jellyfin/cache:/cache
- "./hdd0/jellyfin/config:/config" - ./hdd0/jellyfin/config:/config
- type: bind - type: bind
source: ./hdd0/media source: ./hdd0/media
target: /media target: /media
labels: labels:
- "traefik.enable=true" - traefik.enable=true
- "traefik.http.routers.jellyfin.rule=Host(`jellyfin.bouvais.lu`)" - traefik.http.routers.jellyfin.rule=Host(`jellyfin.bouvais.lu`)
- "traefik.http.routers.jellyfin.entrypoints=websecure" - traefik.http.routers.jellyfin.entrypoints=websecure
- "traefik.http.routers.jellyfin.tls.certresolver=myresolver" - traefik.http.routers.jellyfin.tls.certresolver=myresolver
- "traefik.http.services.jellyfin.loadbalancer.server.port=8096" - traefik.http.services.jellyfin.loadbalancer.server.port=8096
filebrowser: filebrowser:
image: filebrowser/filebrowser:latest image: filebrowser/filebrowser:latest
@@ -40,70 +27,41 @@ services:
TZ: Europe/Luxembourg TZ: Europe/Luxembourg
FB_BASEURL: / FB_BASEURL: /
volumes: volumes:
- "./config/filebrowser/filebrowser.json:/.filebrowser.json" - ./config/filebrowser/filebrowser.json:/.filebrowser.json
- "./hdd0/filebrowser/filebrowser.db:/database.db" - ./hdd0/filebrowser/filebrowser.db:/database.db
- "./hdd0/my_files:/srv" - ./hdd0/my_files:/srv
- ./hdd0/media:/srv/media
labels: labels:
- "traefik.enable=true" - traefik.enable=true
- "traefik.http.routers.filebrowser.rule=Host(`files.bouvais.lu`)" - traefik.http.routers.filebrowser.rule=Host(`files.bouvais.lu`)
- "traefik.http.routers.filebrowser.entrypoints=websecure" - traefik.http.routers.filebrowser.entrypoints=websecure
- "traefik.http.routers.filebrowser.tls.certresolver=myresolver" - traefik.http.routers.filebrowser.tls.certresolver=myresolver
- "traefik.http.services.filebrowser.loadbalancer.server.port=80" - traefik.http.services.filebrowser.loadbalancer.server.port=80
actualbudget:
image: actualbudget/actual-server:latest
container_name: actualbudget
restart: unless-stopped
volumes:
- "./hdd0/actualbudget:/data"
environment:
- TZ=Europe/Luxembourg
labels:
- "traefik.enable=true"
- "traefik.http.routers.actualbudget.rule=Host(`budget.bouvais.lu`)"
- "traefik.http.routers.actualbudget.entrypoints=websecure"
- "traefik.http.routers.actualbudget.tls.certresolver=myresolver"
- "traefik.http.services.actualbudget.loadbalancer.server.port=5006"
vaultwarden: vaultwarden:
image: vaultwarden/server:1.33.2 image: vaultwarden/server:latest
container_name: vaultwarden container_name: vaultwarden
restart: unless-stopped restart: unless-stopped
environment: environment:
DOMAIN: "https://vault.bouvais.lu" DOMAIN: https://vault.bouvais.lu
SIGNUPS_ALLOWED: false SIGNUPS_ALLOWED: true
ADMIN_TOKEN: ${ADMIN_PASSWORD}
ports:
- "80:80"
volumes: volumes:
- "./hdd0/vaultwarden:/data/" - ./hdd0/vaultwarden:/data/
labels: labels:
- "traefik.enable=true" - traefik.enable=true
- "traefik.http.services.my-vaultwarden-service.loadbalancer.server.port=80" - traefik.http.services.my-vaultwarden-service.loadbalancer.server.port=80
- "traefik.http.routers.vaultwarden.rule=Host(`vault.bouvais.lu`)" - traefik.http.routers.vaultwarden.rule=Host(`vault.bouvais.lu`)
- "traefik.http.routers.vaultwarden.entrypoints=websecure" - traefik.http.routers.vaultwarden.entrypoints=websecure
- "traefik.http.routers.vaultwarden.tls.certresolver=myresolver" - traefik.http.routers.vaultwarden.tls.certresolver=myresolver
- "traefik.http.routers.vaultwarden.service=my-vaultwarden-service@docker" - traefik.http.routers.vaultwarden.service=my-vaultwarden-service@docker
- "traefik.http.routers.vaultwarden-admin.rule=Host(`vault.bouvais.lu`) && PathPrefix(`/admin`)" - traefik.http.routers.vaultwarden-admin.rule=Host(`vault.bouvais.lu`) && PathPrefix(`/admin`)
- "traefik.http.routers.vaultwarden-admin.entrypoints=websecure" - traefik.http.routers.vaultwarden-admin.entrypoints=websecure
- "traefik.http.routers.vaultwarden-admin.tls.certresolver=myresolver" - traefik.http.routers.vaultwarden-admin.tls.certresolver=myresolver
- "traefik.http.routers.vaultwarden-admin.middlewares=auth@docker" - traefik.http.routers.vaultwarden-admin.middlewares=auth@docker
- "traefik.http.routers.vaultwarden-admin.service=my-vaultwarden-service@docker" - traefik.http.routers.vaultwarden-admin.service=my-vaultwarden-service@docker
siyuan:
image: b3log/siyuan
container_name: siyuan
command: ['--workspace=/siyuan/workspace/']
volumes:
- /siyuan/workspace:/siyuan/workspace
- "./hdd0/siyuan/workspace:/siyuan/workspace"
restart: unless-stopped
environment:
- TZ=Europe/Luxembourg
- SIYUAN_ACCESS_AUTH_CODE=${SIYUAN_ACCESS_AUTH_CODE}
labels:
- "traefik.enable=true"
- "traefik.http.routers.siyuan.rule=Host(`notes.bouvais.lu`)"
- "traefik.http.routers.siyuan.entrypoints=websecure"
- "traefik.http.routers.siyuan.tls.certresolver=myresolver"
- "traefik.http.services.siyuan.loadbalancer.server.port=6806"
libreoffice: libreoffice:
image: lscr.io/linuxserver/libreoffice:latest image: lscr.io/linuxserver/libreoffice:latest
@@ -115,14 +73,43 @@ services:
- PASSWORD=${MASTER_PASSWORD} - PASSWORD=${MASTER_PASSWORD}
- TZ=Europe/Luxembourg - TZ=Europe/Luxembourg
ports: ports:
- "3000:3000" - 3000:3000
- "3001:3001" - 3001:3001
volumes: volumes:
- ./hdd0/libreoffice:/config - ./hdd0/libreoffice:/config
- ./hdd0/my_files/:/data
restart: unless-stopped restart: unless-stopped
labels:
- traefik.enable=true
- traefik.http.routers.libreoffice.rule=Host(`libreoffice.bouvais.lu`)
- traefik.http.routers.libreoffice.entrypoints=websecure
- traefik.http.routers.libreoffice.tls.certresolver=myresolver
- traefik.http.services.libreoffice.loadbalancer.server.port=3000
home:
image: registry.bouvais.lu/home:v0.1.4
container_name: home
restart: unless-stopped
depends_on:
- registry
labels: labels:
- "traefik.enable=true" - "traefik.enable=true"
- "traefik.http.routers.libreoffice.rule=Host(`libreoffice.bouvais.lu`)" - "traefik.http.routers.myapp.rule=Host(`home.bouvais.lu`)"
- "traefik.http.routers.libreoffice.entrypoints=websecure" - "traefik.http.routers.myapp.entrypoints=websecure"
- "traefik.http.routers.libreoffice.tls.certresolver=myresolver" - "traefik.http.routers.myapp.tls.certresolver=myresolver"
- "traefik.http.services.libreoffice.loadbalancer.server.port=3000" - "traefik.http.services.myapp.loadbalancer.server.port=8080"
drawio:
image: jgraph/drawio:latest
container_name: drawio
restart: unless-stopped
environment:
- TZ=Europe/Luxembourg
labels:
- "traefik.enable=true"
- "traefik.http.routers.drawio.rule=Host(`draw.bouvais.lu`)"
- "traefik.http.routers.drawio.entrypoints=websecure"
- "traefik.http.routers.drawio.tls.certresolver=myresolver"
- "traefik.http.services.drawio.loadbalancer.server.port=8080"
+126
View File
@@ -0,0 +1,126 @@
services:
gitea:
image: docker.gitea.com/gitea:1.23.8
container_name: gitea
restart: always
environment:
- GITEA_CUSTOM=/etc/gitea
volumes:
- ./hdd0/gitea:/data
- ./config/gitea:/etc/gitea
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
labels:
- traefik.enable=true
# HTTP/S
- traefik.http.routers.gitea.rule=Host(`git.bouvais.lu`)
- traefik.http.routers.gitea.entrypoints=websecure
- traefik.http.routers.gitea.tls.certresolver=myresolver
- traefik.http.services.gitea.loadbalancer.server.port=3000
# SSH
- traefik.tcp.routers.gitea-ssh.rule=HostSNI(`*`)
- traefik.tcp.routers.gitea-ssh.entrypoints=ssh
- traefik.tcp.services.gitea-ssh.loadbalancer.server.port=22
deploy:
resources:
limits:
memory: 4G
cpus: 2
reservations:
memory: 512M
cpus: 1
gitea-runner:
image: docker.io/gitea/act_runner:latest
container_name: gitea-runner
restart: unless-stopped
environment:
CONFIG_FILE: /config.yaml
GITEA_INSTANCE_URL: https://git.bouvais.lu/
GITEA_RUNNER_REGISTRATION_TOKEN: jBEK4cLzDp2wqv1Ru3SHyzC0xzl1FV94IcsGe5kd
volumes:
- ./config/gitea-runner/config.yaml:/config.yaml
- ./hdd0/gitea-runner:/data
- /var/run/docker.sock:/var/run/docker.sock
- ./hdd0/mkdocs-sites:/sites
registry:
image: registry:2
container_name: registry
restart: unless-stopped
environment:
- REGISTRY_AUTH_HTPASSWD_REALM=Bouvais Registry
- REGISTRY_AUTH_HTPASSWD_PATH=/etc/docker/registry/htpasswd
- REGISTRY_HTTP_SECRET=${MASTER_PASSWORD}
- REGISTRY_HEALTH_STORAGEDRIVER_ENABLED=true
- REGISTRY_STORAGE_DELETE_ENABLED=true
volumes:
- ./hdd0/registry/data:/var/lib/registry
- ./hdd0/registry/htpasswd:/etc/docker/registry/htpasswd:ro
labels:
- traefik.enable=true
- traefik.http.routers.registry.rule=Host(`registry.bouvais.lu`)
- traefik.http.routers.registry.entrypoints=websecure
- traefik.http.routers.registry.tls.certresolver=myresolver
- traefik.http.services.registry.loadbalancer.server.port=5000
registry-ui:
image: joxit/docker-registry-ui:latest
container_name: registry-ui
depends_on: [registry]
restart: unless-stopped
environment:
- DELETE_IMAGES=true
- REGISTRY_TITLE=Bouvais Docker Registry
- NGINX_PROXY_PASS_URL=http://registry:5000
- SINGLE_REGISTRY=true
labels:
- traefik.enable=true
- traefik.http.routers.registry_ui.rule=Host(`registry-ui.bouvais.lu`)
- traefik.http.routers.registry_ui.entrypoints=websecure
- traefik.http.routers.registry_ui.tls.certresolver=myresolver
- traefik.http.services.registry_ui.loadbalancer.server.port=80
garage:
image: dxflrs/garage:v2.1.0
container_name: garage
restart: unless-stopped
volumes:
- ./config/garage/garage.toml:/etc/garage.toml
- ./hdd0/garage/meta:/var/lib/garage/meta
- ./hdd0/garage/data:/var/lib/garage/data
environment:
- RUST_LOG=garage=info
labels:
- traefik.enable=true
# S3 API
- traefik.http.routers.garages3.rule=Host(`s3.garage.bouvais.lu`)
- traefik.http.routers.garages3.entrypoints=websecure
- traefik.http.routers.garages3.tls.certresolver=myresolver
- traefik.http.routers.garages3.service=garages3
- traefik.http.services.garages3.loadbalancer.server.port=3900
# Admin API
- traefik.http.routers.garageadmin.rule=Host(`admin.garage.bouvais.lu`)
- traefik.http.routers.garageadmin.entrypoints=websecure
- traefik.http.routers.garageadmin.tls.certresolver=myresolver
- traefik.http.routers.garageadmin.service=garageadmin
- traefik.http.services.garageadmin.loadbalancer.server.port=3903
# Web (Garage's internal web endpoint)
- traefik.http.routers.garageweb.rule=Host(`web.garage.bouvais.lu`)
- traefik.http.routers.garageweb.entrypoints=websecure
- traefik.http.routers.garageweb.tls.certresolver=myresolver
- traefik.http.routers.garageweb.service=garageweb_svc
- traefik.http.services.garageweb_svc.loadbalancer.server.port=3902
- traefik.http.routers.mystaticsite.rule=Host(`zig-dimal.bouvais.lu`)
- traefik.http.routers.mystaticsite.entrypoints=websecure
- traefik.http.routers.mystaticsite.tls.certresolver=myresolver
- traefik.http.routers.mystaticsite.service=garageweb_svc
- traefik.http.routers.mystaticsite.rule=Host(`zigma.bouvais.lu`)
- traefik.http.routers.mystaticsite.entrypoints=websecure
- traefik.http.routers.mystaticsite.tls.certresolver=myresolver
- traefik.http.routers.mystaticsite.service=garageweb_svc
+80 -83
View File
@@ -1,33 +1,33 @@
include: include:
- apps.yml - apps.yml
- gitea.yml - developer.yml
- llm.yml - llm.yml
- monitoring.yml
- vms.yml
services: services:
traefik: traefik:
image: "traefik:v3.4" image: traefik:latest
container_name: "traefik" container_name: traefik
restart: unless-stopped restart: unless-stopped
command: command:
# HTTPS TSL stuff # HTTPS TSL stuff
- "--providers.docker=true" - --providers.docker=true
- "--providers.docker.exposedbydefault=false" - --providers.docker.exposedbydefault=false
- "--entryPoints.websecure.address=:443" - --entryPoints.websecure.address=:443
- "--certificatesresolvers.myresolver.acme.tlschallenge=true" - --certificatesresolvers.myresolver.acme.tlschallenge=true
- "--certificatesresolvers.myresolver.acme.email=adrien.bouvais.pro@gmail.com" - --certificatesresolvers.myresolver.acme.email=adrien.bouvais.pro@gmail.com
- "--certificatesresolvers.myresolver.acme.storage=/letsencrypt/acme.json" # Relative path on SSD - --certificatesresolvers.myresolver.acme.storage=/letsencrypt/acme.json
# Enable Traefik API and Dashboard (securely) # Enable Traefik API and Dashboard (securely)
- "--api.dashboard=true" - --api.dashboard=true
- "--metrics.prometheus=true" - --metrics.prometheus=true
- "--metrics.prometheus.buckets=0.1,0.3,1.2,5.0" - --metrics.prometheus.buckets=0.1,0.3,1.2,5.0
- "--entryPoints.ssh.address=:2101" - --entryPoints.ssh.address=:2101
- --entrypoints.web.transport.respondingTimeouts.readTimeout=180m
- --entrypoints.websecure.transport.respondingTimeouts.readTimeout=180m
# Logs - Traefik will write its logs to /logs within the container, which maps to /data/logs on host # Logs - Traefik will write its logs to /logs within the container, which maps to /data/logs on host
- "--accesslog=true" - --accesslog=true
- "--accesslog.format=json" - --accesslog.format=json
- "--accesslog.filepath=/logs/access.log" - --accesslog.filepath=/logs/access.log
- "--accesslog.bufferingSize=0" - --accesslog.bufferingSize=0
ports: ports:
- target: 443 - target: 443
published: 443 published: 443
@@ -38,30 +38,30 @@ services:
protocol: tcp protocol: tcp
mode: host mode: host
volumes: volumes:
- "./letsencrypt:/letsencrypt" - ./letsencrypt:/letsencrypt
- "/var/run/docker.sock:/var/run/docker.sock:ro" - /var/run/docker.sock:/var/run/docker.sock:ro
- "./config/users.cred:/users.cred" - ./config/users.cred:/users.cred
- "./hdd0/logs:/logs" - ./hdd0/logs:/logs
labels: labels:
- "traefik.enable=true" - traefik.enable=true
# Dashboard Router # Dashboard Router
- "traefik.http.routers.dashboard.rule=Host(`traefik.bouvais.lu`)" - traefik.http.routers.dashboard.rule=Host(`traefik.bouvais.lu`)
- "traefik.http.routers.dashboard.entrypoints=websecure" - traefik.http.routers.dashboard.entrypoints=websecure
- "traefik.http.routers.dashboard.service=api@internal" - traefik.http.routers.dashboard.service=api@internal
- "traefik.http.routers.dashboard.middlewares=auth@docker" - traefik.http.routers.dashboard.middlewares=auth@docker
- "traefik.http.routers.dashboard.tls.certresolver=myresolver" - traefik.http.routers.dashboard.tls.certresolver=myresolver
# Traefik Middleware # Traefik Middleware
- "traefik.http.middlewares.auth.basicauth.usersfile=/users.cred" - traefik.http.middlewares.auth.basicauth.usersfile=/users.cred
- "traefik.http.middlewares.ratelimit.ratelimit.average=20" - traefik.http.middlewares.ratelimit.ratelimit.average=20
- "traefik.http.middlewares.ratelimit.ratelimit.burst=40" - traefik.http.middlewares.ratelimit.ratelimit.burst=40
# bouvais.lu redirection # bouvais.lu redirection
- "traefik.http.routers.bouvais-redirect.rule=Host(`bouvais.lu`)" - traefik.http.routers.bouvais-redirect.rule=Host(`bouvais.lu`)
- "traefik.http.routers.bouvais-redirect.entrypoints=websecure" - traefik.http.routers.bouvais-redirect.entrypoints=websecure
- "traefik.http.routers.bouvais-redirect.middlewares=redirect-to-gitea@docker" - traefik.http.routers.bouvais-redirect.middlewares=redirect-to-gitea@docker
- "traefik.http.routers.bouvais-redirect.tls.certresolver=myresolver" - traefik.http.routers.bouvais-redirect.tls.certresolver=myresolver
- "traefik.http.middlewares.redirect-to-gitea.redirectregex.regex=^https?://(www\\.)?bouvais\\.lu(.*)" - traefik.http.middlewares.redirect-to-gitea.redirectregex.regex=^https?://(www\\.)?bouvais\\.lu(.*)
- "traefik.http.middlewares.redirect-to-gitea.redirectregex.replacement=https://git.bouvais.lu$${2}" - traefik.http.middlewares.redirect-to-gitea.redirectregex.replacement=https://git.bouvais.lu$${2}
- "traefik.http.middlewares.redirect-to-gitea.redirectregex.permanent=true" - traefik.http.middlewares.redirect-to-gitea.redirectregex.permanent=true
fail2ban: fail2ban:
image: crazymax/fail2ban:1.1.0 image: crazymax/fail2ban:1.1.0
@@ -72,11 +72,11 @@ services:
- NET_RAW - NET_RAW
network_mode: host network_mode: host
volumes: volumes:
- "./hdd0/fail2ban/data:/data" - ./hdd0/fail2ban/data:/data
- "./hdd0/fail2ban/log:/var/log" - ./hdd0/fail2ban/log:/var/log
- "./hdd0/logs:/logs:ro" - ./hdd0/logs:/logs:ro
- "/etc/localtime:/etc/localtime:ro" - /etc/localtime:/etc/localtime:ro
- "/etc/timezone:/etc/timezone:ro" - /etc/timezone:/etc/timezone:ro
environment: environment:
- F2B_IPTABLES_CHAIN=DOCKER-USER - F2B_IPTABLES_CHAIN=DOCKER-USER
@@ -84,56 +84,53 @@ services:
image: kopia/kopia:latest image: kopia/kopia:latest
container_name: kopia container_name: kopia
restart: unless-stopped restart: unless-stopped
ports:
- 51515:51515
command: command:
- server - server
- start - start
#- --disable-csrf-token-checks
- --insecure - --insecure
- --address=0.0.0.0:51515 - --address=0.0.0.0:51515
- --server-username=adrien - --server-username=adrien
- --server-password=${MASTER_PASSWORD} - --server-password=${MASTER_PASSWORD}
environment: environment:
KOPIA_PASSWORD: ${MASTER_PASSWORD} - KOPIA_PASSWORD=${MASTER_PASSWORD}
USER: "adrien" - USER=adrien
volumes: volumes:
# Mount local folders needed by kopia
- ./config/kopia:/app/config - ./config/kopia:/app/config
- ./cache/kopia:/app/cache - ./cache/kopia:/app/cache
- ./hdd0/logs/:/app/logs - ./hdd0/logs/:/app/logs
- ./hdd0:/hdd0 # Mount local folders to snapshot - ./hdd0:/hdd0
- ./hdd0_backups/kopia/dir:/repository # Mount repository location - ./hdd0_backups/kopia/dir:/repository
- ./hdd0_backups/kopia/shared:/tmp:shared # Mount path for browsing mounted snaphots - ./hdd0_backups/kopia/shared:/tmp:shared
labels: labels:
- "traefik.enable=true" - traefik.enable=true
- "traefik.http.routers.kopia.rule=Host(`kopia.bouvais.lu`)" - traefik.http.routers.kopia.rule=Host(`kopia.bouvais.lu`)
- "traefik.http.routers.kopia.entrypoints=websecure" - traefik.http.routers.kopia.entrypoints=websecure
- "traefik.http.routers.kopia.tls.certresolver=myresolver" - traefik.http.routers.kopia.tls.certresolver=myresolver
- "traefik.http.services.kopia.loadbalancer.server.port=51515" - traefik.http.services.kopia.loadbalancer.server.port=51515
minio: # kopia-cloud:
image: minio/minio:latest # image: kopia/kopia:latest
container_name: minio # container_name: kopia-cloud
restart: unless-stopped # restart: unless-stopped
environment: # command:
MINIO_ROOT_USER: adrien # - server
MINIO_ROOT_PASSWORD: ${MASTER_PASSWORD} # - start
command: server /data --console-address ":9001" # - --insecure
volumes: # - --address=0.0.0.0:51516
- ./hdd0/minio_data:/data # - --server-username=adrien
labels: # - --server-password=${MASTER_PASSWORD}
- "traefik.enable=true" # environment:
# Router and service for the MinIO API # KOPIA_PASSWORD: ${MASTER_PASSWORD}
- "traefik.http.routers.minio-api.rule=Host(`minio-api.bouvais.lu`)" # USER: "adrien"
- "traefik.http.routers.minio-api.entrypoints=websecure" # volumes:
- "traefik.http.routers.minio-api.tls.certresolver=myresolver" # - ./config/kopia-cloud:/app/config
- "traefik.http.services.minio-api-service.loadbalancer.server.port=9000" # - ./cache/kopia-cloud:/app/cache
- "traefik.http.routers.minio-api.service=minio-api-service" # - ./hdd0/logs/kopia-cloud:/app/logs
# - ./hdd0:/hdd0
# Router and service for the MinIO Console (WebUI) # - ./kopia-gcp-key.json:/cred.json
- "traefik.http.routers.minio-console.rule=Host(`minio-console.bouvais.lu`)" # labels:
- "traefik.http.routers.minio-console.entrypoints=websecure" # - traefik.enable=true
- "traefik.http.routers.minio-console.tls.certresolver=myresolver" # - traefik.http.routers.kopia_gcp.rule=Host(`kopia-cloud.bouvais.lu`)
- "traefik.http.services.minio-console-service.loadbalancer.server.port=9001" # - traefik.http.routers.kopia_gcp.entrypoints=websecure
- "traefik.http.routers.minio-console.service=minio-console-service" # - traefik.http.routers.kopia_gcp.tls.certresolver=myresolver
# - traefik.http.services.kopia_gcp.loadbalancer.server.port=51516
-51
View File
@@ -1,51 +0,0 @@
services:
gitea:
image: "docker.gitea.com/gitea:1.23.8"
container_name: gitea
restart: unless-stopped
environment:
- GITEA_CUSTOM=/etc/gitea
volumes:
- "./hdd0/gitea:/data"
- "./config/gitea:/etc/gitea"
- "/etc/timezone:/etc/timezone:ro"
- "/etc/localtime:/etc/localtime:ro"
labels:
- "traefik.enable=true"
# HTTP/S
- "traefik.http.routers.gitea.rule=Host(`git.bouvais.lu`)"
- "traefik.http.routers.gitea.entrypoints=websecure"
- "traefik.http.routers.gitea.tls.certresolver=myresolver"
- "traefik.http.services.gitea.loadbalancer.server.port=3000"
# SSH
- "traefik.tcp.routers.gitea-ssh.rule=HostSNI(`*`)"
- "traefik.tcp.routers.gitea-ssh.entrypoints=ssh"
- "traefik.tcp.services.gitea-ssh.loadbalancer.server.port=22"
gitea-runner:
image: docker.io/gitea/act_runner:latest
container_name: gitea-runner
restart: unless-stopped
environment:
CONFIG_FILE: /config.yaml
GITEA_INSTANCE_URL: https://git.bouvais.lu/
GITEA_RUNNER_REGISTRATION_TOKEN: jBEK4cLzDp2wqv1Ru3SHyzC0xzl1FV94IcsGe5kd
volumes:
- ./config/gitea-runner/config.yaml:/config.yaml
- ./hdd0/gitea-runner:/data
- /var/run/docker.sock:/var/run/docker.sock
- ./hdd0/mkdocs-sites:/sites
mkdocs-zippondb:
image: squidfunk/mkdocs-material
container_name: mkdocs-zippondb
restart: unless-stopped
volumes:
- ./hdd0/mkdocs-sites/zippondb:/docs
labels:
- "traefik.enable=true"
- "traefik.http.routers.gitea.rule=Host(`docs.bouvais.lu`)"
- "traefik.http.routers.gitea.entrypoints=websecure"
- "traefik.http.routers.gitea.tls.certresolver=myresolver"
- "traefik.http.routers.gitea.middlewares=auth@docker"
- "traefik.http.services.gitea.loadbalancer.server.port=3000"
+22 -19
View File
@@ -6,32 +6,35 @@ services:
volumes: volumes:
- ./hdd0/openwebui:/app/backend/data - ./hdd0/openwebui:/app/backend/data
labels: labels:
- "traefik.enable=true" - traefik.enable=true
- "traefik.http.routers.openwebui.rule=Host(`openwebui.bouvais.lu`)" - traefik.http.routers.openwebui.rule=Host(`openwebui.bouvais.lu`)
- "traefik.http.routers.openwebui.entrypoints=websecure" - traefik.http.routers.openwebui.entrypoints=websecure
- "traefik.http.routers.openwebui.tls.certresolver=myresolver" - traefik.http.routers.openwebui.tls.certresolver=myresolver
- "traefik.http.services.openwebui.loadbalancer.server.port=8080" - traefik.http.services.openwebui.loadbalancer.server.port=8080
environment: environment:
OLLAMA_BASE_URLS: http://ollama:11434 OLLAMA_BASE_URLS: http://ollama:11434
ollama:
image: ollama/ollama:latest
container_name: ollama
volumes:
- ./hdd0/ollama:/root/.ollama
deploy:
resources:
reservations:
devices:
- driver: nvidia
capabilities: ["gpu"]
count: all
openwebui-pipeline: openwebui-pipeline:
image: ghcr.io/open-webui/pipelines:main image: ghcr.io/open-webui/pipelines:main
container_name: openwebui-pipelines container_name: openwebui-pipelines
restart: unless-stopped restart: unless-stopped
ports: ports:
- "9099:9099" - 9099:9099
volumes: volumes:
- ./hdd0/openwebui-pipelines:/app/pipelines - ./hdd0/openwebui-pipelines:/app/pipelines
ollama:
image: ollama/ollama:latest
container_name: ollama
restart: unless-stopped
volumes:
- ./usb1/ollama:/root/.ollama
environment:
- OLLAMA_CONTEXT_LENGTH=64000
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: 1
capabilities: [gpu]
+24 -60
View File
@@ -9,22 +9,19 @@ services:
- ./config/prometheus:/etc/prometheus - ./config/prometheus:/etc/prometheus
- ./hdd0/prometheus:/prometheus - ./hdd0/prometheus:/prometheus
command: command:
- '--config.file=/etc/prometheus/prometheus.yml' - --config.file=/etc/prometheus/prometheus.yml
- '--storage.tsdb.path=/prometheus' - --storage.tsdb.path=/prometheus
- '--web.console.libraries=/usr/share/prometheus/console_libraries' - --web.console.libraries=/usr/share/prometheus/console_libraries
- '--web.console.templates=/usr/share/prometheus/consoles' - --web.console.templates=/usr/share/prometheus/consoles
- '--web.enable-lifecycle' - --web.enable-lifecycle
labels: labels:
- "traefik.enable=true" - traefik.enable=true
- "traefik.http.routers.prometheus.rule=Host(`prometheus.bouvais.lu`)" - traefik.http.routers.prometheus.rule=Host(`prometheus.bouvais.lu`)
- "traefik.http.routers.prometheus.entrypoints=websecure" - traefik.http.routers.prometheus.entrypoints=websecure
- "traefik.http.routers.prometheus.tls.certresolver=myresolver" - traefik.http.routers.prometheus.tls.certresolver=myresolver
- "traefik.http.routers.prometheus.service=prometheus" - traefik.http.routers.prometheus.service=prometheus
- "traefik.http.services.prometheus.loadbalancer.server.port=9090" - traefik.http.services.prometheus.loadbalancer.server.port=9090
- "traefik.http.routers.prometheus.middlewares=auth@docker" - traefik.http.routers.prometheus.middlewares=auth@docker
depends_on:
- cadvisor
- node-exporter
grafana: grafana:
image: grafana/grafana:12.0.1 image: grafana/grafana:12.0.1
@@ -39,30 +36,16 @@ services:
- GF_SECURITY_ADMIN_PASSWORD=${GRAFANA_MY_PASSWORD} - GF_SECURITY_ADMIN_PASSWORD=${GRAFANA_MY_PASSWORD}
- GF_SERVER_ROOT_URL=https://grafana.bouvais.lu - GF_SERVER_ROOT_URL=https://grafana.bouvais.lu
labels: labels:
- "traefik.enable=true" - traefik.enable=true
- "traefik.http.routers.grafana.rule=Host(`grafana.bouvais.lu`)" - traefik.http.routers.grafana.rule=Host(`grafana.bouvais.lu`)
- "traefik.http.routers.grafana.entrypoints=websecure" - traefik.http.routers.grafana.entrypoints=websecure
- "traefik.http.routers.grafana.tls.certresolver=myresolver" - traefik.http.routers.grafana.tls.certresolver=myresolver
- "traefik.http.routers.grafana.service=grafana" - traefik.http.routers.grafana.service=grafana
- "traefik.http.services.grafana.loadbalancer.server.port=3000" - traefik.http.services.grafana.loadbalancer.server.port=3000
- "traefik.http.routers.grafana.middlewares=auth@docker" - traefik.http.routers.grafana.middlewares=auth@docker
depends_on: depends_on:
- prometheus - prometheus
#
cadvisor:
image: gcr.io/cadvisor/cadvisor:v0.52.0
container_name: cadvisor
privileged: true
restart: unless-stopped
volumes:
- /:/rootfs:ro
- /var/run:/var/run:rw
- /sys:/sys:ro
- /var/lib/docker/:/var/lib/docker:ro
- /dev/disk/:/dev/disk:ro
devices:
- /dev/kmsg:/dev/kmsg
node-exporter: node-exporter:
image: prom/node-exporter:v1.9.1 image: prom/node-exporter:v1.9.1
container_name: node-exporter container_name: node-exporter
@@ -73,26 +56,7 @@ services:
- /sys:/host/sys:ro - /sys:/host/sys:ro
- /:/rootfs:ro - /:/rootfs:ro
command: command:
- '--path.procfs=/host/proc' - --path.procfs=/host/proc
- '--path.sysfs=/host/sys' - --path.sysfs=/host/sys
- '--path.rootfs=/rootfs' - --path.rootfs=/rootfs
- '--collector.filesystem.mount-points-exclude=^/(sys|proc|dev|host|etc|rootfs/var/lib/docker/containers|rootfs/var/lib/docker/overlay2|rootfs/run/docker/netns|rootfs/var/lib/docker/aufs)($$|/)' - --collector.filesystem.mount-points-exclude=^/(sys|proc|dev|host|etc|rootfs/var/lib/docker/containers|rootfs/var/lib/docker/overlay2|rootfs/run/docker/netns|rootfs/var/lib/docker/aufs)($$|/)
nvidia-gpu-exporter:
image: utkuozdemir/nvidia_gpu_exporter:1.3.1
container_name: nvidia-gpu-exporter
restart: unless-stopped
privileged: true # This might be needed for full access to devices, or try without first
devices:
- /dev/nvidia0:/dev/nvidia0
volumes:
- /usr/bin/nvidia-smi:/usr/bin/nvidia-smi:ro
- /usr/lib/x86_64-linux-gnu/libnvidia-ml.so:/usr/lib/x86_64-linux-gnu/libnvidia-ml.so:ro
- /usr/lib/x86_64-linux-gnu/libnvidia-ml.so.1:/usr/lib/x86_64-linux-gnu/libnvidia-ml.so.1:ro
command:
- --web.listen-address=:9835
- --web.telemetry-path=/metrics
- --nvidia-smi-command=nvidia-smi
- --log.level=info
- --query-field-names=AUTO
- --log.format=logfmt
-28
View File
@@ -1,28 +0,0 @@
services:
arch-ttyd:
build:
context: .
dockerfile: Dockerfile.arch-ttyd
container_name: arch-ttyd
restart: unless-stopped
volumes:
- ./hdd0/vms/arch/data:/data
- ./hdd0/vms/arch/root:/root
- ~/.ssh/id_rsa:/root/.ssh/id_rsa:ro
environment:
- TTYD_USERNAME=${TTYD_USERNAME:-admin}
- TTYD_PASSWORD=${MASTER_PASSWORD:-changeme}
labels:
- "traefik.enable=true"
- "traefik.http.routers.arch.rule=Host(`arch.bouvais.lu`)"
- "traefik.http.routers.arch.entrypoints=websecure"
- "traefik.http.routers.arch.tls.certresolver=myresolver"
- "traefik.http.services.arch.loadbalancer.server.port=7681"
deploy:
resources:
limits:
cpus: '1.0'
memory: 512M
reservations:
cpus: '0.5'
memory: 256M
-13
View File
@@ -1,13 +0,0 @@
services:
website-pro:
build:
context: ./website-pro
dockerfile: Dockerfile
container_name: website-pro
restart: unless-stopped
labels:
- "traefik.enable=true"
- "traefik.http.routers.www.rule=Host(`www.bouvais.lu`)"
- "traefik.http.routers.www.entrypoints=websecure"
- "traefik.http.routers.www.tls.certresolver=myresolver"
- "traefik.http.services.www.loadbalancer.server.port=8080"