├── .gitignore ├── README.md ├── adguard-home └── compose.yaml ├── audiobookshelf └── compose.yaml ├── calibre-web ├── README.md ├── compose.yaml └── metadata.db ├── cloudflare-ddns ├── compose.yaml └── wiki │ └── images │ ├── api-tokens-summary-cloudflare.png │ └── cloudflare_ddns_api_token.png ├── code-server └── compose.yaml ├── dockprom ├── alertmanager │ └── config.yml ├── caddy │ └── Caddyfile ├── compose.yaml ├── docker-compose.exporters.yml ├── grafana │ └── provisioning │ │ ├── dashboards │ │ ├── dashboard.yml │ │ ├── docker_containers.json │ │ ├── docker_host.json │ │ ├── monitor_services.json │ │ └── nginx_container.json │ │ └── datasources │ │ └── datasource.yml └── prometheus │ ├── alert.rules │ └── prometheus.yml ├── duplicati └── compose.yaml ├── gitea └── compose.yaml ├── gotify └── compose.yaml ├── grocy └── compose.yaml ├── guacamole └── compose.yaml ├── home-assistant └── compose.yaml ├── homer ├── assets │ ├── additionnal-page.yml.dist │ ├── config.yml │ ├── config.yml.dist │ ├── config.yml.dist.sample-sui │ ├── custom.css.sample │ ├── icons │ │ ├── favicon-16x16.png │ │ ├── favicon-32x32.png │ │ ├── icon-any.png │ │ ├── icon-any.svg │ │ ├── icon-maskable.png │ │ └── safari-pinned-tab.svg │ ├── manifest.json │ └── tools │ │ ├── adguard.png │ │ ├── adminer.png │ │ ├── authelia.png │ │ ├── bazarr.png │ │ ├── bitwarden.png │ │ ├── bookstack.png │ │ ├── calibre-web.png │ │ ├── cloudcmd.png │ │ ├── cloudcmd2.png │ │ ├── dashmachine.png │ │ ├── deemix2.png │ │ ├── deezload.png │ │ ├── drawio.png │ │ ├── duplicati.png │ │ ├── example.png │ │ ├── filebot1.png │ │ ├── flood.png │ │ ├── freshrss.png │ │ ├── gitea.png │ │ ├── glances.png │ │ ├── gotify.png │ │ ├── grafana.png │ │ ├── handbrake.png │ │ ├── home-assist.png │ │ ├── jackett.png │ │ ├── jellyfin.png │ │ ├── joplin.png │ │ ├── kubernets.png │ │ ├── lidarr.png │ │ ├── mealie.png │ │ ├── mediainfo.png │ │ ├── netdata.png │ │ ├── nextcloud.png │ │ ├── nginx-proxy.png │ │ ├── npm.png │ │ ├── ombi.png │ │ ├── overleaf.png │ │ ├── overseerr.png │ │ ├── paperless.png │ │ ├── pasta.png │ │ ├── photoprism.png │ │ ├── pihole.png │ │ ├── plex.png │ │ ├── podcasts-n.png │ │ ├── portainer.png │ │ ├── prowlarr.png │ │ ├── proxmox-sm.png │ │ ├── proxmox.png │ │ ├── pyload.png │ │ ├── qbittorrent.png │ │ ├── qdirstat.png │ │ ├── radarr.png │ │ ├── rancher.png │ │ ├── readarr.png │ │ ├── sample.png │ │ ├── sample2.png │ │ ├── snapdrop.png │ │ ├── sonarr.png │ │ ├── sonarr2.png │ │ ├── tautulli.png │ │ ├── traggo.png │ │ ├── traggo_small.png │ │ ├── transmission.png │ │ ├── tube-archivist-logo-dark.png │ │ ├── unraid.png │ │ ├── unraid2.png │ │ ├── uptime.png │ │ ├── vikunja.png │ │ ├── virtman.png │ │ ├── vscode.png │ │ ├── wallabag.png │ │ ├── wikijs.png │ │ ├── wp2.png │ │ ├── youtube-dl.png │ │ └── youtubedl.png └── compose.yaml ├── immich ├── .env └── compose.yaml ├── joplin └── compose.yaml ├── mealie └── compose.yaml ├── nextcloud ├── Dockerfile ├── README.md ├── compose.yaml └── docker-compose-ffmpeg.yaml ├── nginx-proxy-manager └── compose.yaml ├── overseerr └── compose.yaml ├── pairdrop └── compose.yaml ├── paperless-ng ├── compose.yaml └── docker-compose.env ├── photoprism ├── compose.yaml └── jobs.ini ├── pihole └── compose.yaml ├── plex └── compose.yaml ├── podgrab └── compose.yaml ├── snapdrop └── compose.yaml ├── surfshark └── compose.yaml ├── traggo └── compose.yaml ├── tube-archivist └── compose.yaml ├── uptime-kuma └── compose.yaml ├── vaultwarden └── compose.yaml ├── vikunja ├── compose.yaml └── nginx.conf ├── wallabag └── compose.yaml ├── watchtower └── compose.yaml ├── wireguard ├── README.md └── compose.yaml └── wordpress └── compose.yaml /.gitignore: -------------------------------------------------------------------------------- 1 | **/.DS_Store 2 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # self-hosted_docker_setups 2 | A collection of my docker-compose files used to setup self-hosted services on Raspberry Pi 4 3 | 4 | --- 5 | 6 | ## List of services hosted (linked to their respective GitHub repositories) 7 | 8 | * [AdGuard-Home](https://github.com/AdguardTeam/AdGuardHome) 9 | * [Authelia](https://github.com/authelia/authelia) 10 | * [Bazarr](https://github.com/linuxserver/docker-bazarr) 11 | * [Calibre-web](https://github.com/janeczku/calibre-web) 12 | * [Cloudflare-DDNS](https://github.com/oznu/docker-cloudflare-ddns) 13 | * [Code-Server](https://github.com/linuxserver/docker-code-server) 14 | * [Dockprom](https://github.com/stefanprodan/dockprom) (Prometheus + Grafana + cAdvisor + Nodeexporter + Alertmanager + Pushgateway + Caddy) 15 | * [Duplicati](https://github.com/linuxserver/docker-duplicati) 16 | * [Flood](https://github.com/jesec/flood) 17 | * [Gitea](https://github.com/go-gitea/gitea) (Server + Database) 18 | * [Gotify](https://github.com/gotify) 19 | * [Grocy](https://github.com/linuxserver/docker-grocy) 20 | * [Guacamole](https://hub.docker.com/r/guacamole/guacamole) 21 | * [Home Assistant](https://github.com/linuxserver/docker-homeassistant) 22 | * [Immich](https://github.com/immich-app/immich) (Server + ML container + Redis + Database) 23 | * [Homer](https://github.com/bastienwirtz/homer) 24 | * [Joplin](https://github.com/flosoft/docker-joplin-server) (Server + Database) 25 | * [Lidarr](https://github.com/linuxserver/docker-lidarr) 26 | * [Mealie](https://github.com/hay-kot/mealie) 27 | * [Nextcloud](https://github.com/nextcloud/docker) (WebApp + Database + Redis + Cron) 28 | * [Nginx Proxy Manager](https://github.com/jc21/nginx-proxy-manager) (WebApp + Database) 29 | * [Overseerr](https://github.com/sct/overseerr) 30 | * [Paperless-ng](https://github.com/jonaswinkler/paperless-ng) (WebServer + Redis + Gotenberg + Tika) 31 | * [PhotoPrism](https://github.com/photoprism/photoprism) (Server + Database) 32 | * [Plex](https://github.com/linuxserver/docker-plex) 33 | * [PodGrab](https://github.com/akhilrex/podgrab) 34 | * [Portainer](https://documentation.portainer.io/v2.0/deploy/ceinstalldocker/) 35 | * [Prowlarr](https://github.com/linuxserver/docker-prowlarr) 36 | * [qBittorrent](https://github.com/linuxserver/docker-qbittorrent) 37 | * [Radarr](https://github.com/linuxserver/docker-radarr) 38 | * [Readarr](https://github.com/linuxserver/docker-readarr) 39 | * [Snapdrop](https://github.com/RobinLinus/snapdrop) 40 | * [Sonarr](https://github.com/linuxserver/docker-sonarr) 41 | * [SurfShark VPN](https://github.com/ilteoood/docker-surfshark) 42 | * [Traggo](https://github.com/traggo/server) 43 | * [Transmission](https://github.com/linuxserver/docker-transmission) 44 | * [Tube-Archivist](https://github.com/bbilly1/tubearchivist) (Frontend + ElasticSearch + RedisJSON) 45 | * [Uptime-Kuma](https://github.com/louislam/uptime-kuma) 46 | * [Vaultwarden](https://github.com/dani-garcia/vaultwarden) 47 | * [Vikunja](https://github.com/go-vikunja) (Frontend + API + Database + Redis + Proxy) 48 | * [Wallabag](https://github.com/wallabag/wallabag) (WebApp + Database + Redis) 49 | * [Watchtower](https://github.com/containrrr/watchtower) 50 | * [Wireguard](https://github.com/linuxserver/docker-wireguard) 51 | * [Wordpress](https://hub.docker.com/_/wordpress) (WebServer + Database + Redis) 52 | 53 | Discover other awesome self-hosted services at - https://github.com/awesome-selfhosted/awesome-selfhosted 54 | 55 | --- 56 | ## Getting started 57 | Install ```docker``` and ```docker-compose``` on your RPi to start building containers 58 | 59 | ### Update and Upgrade 60 | ``` bash 61 | sudo apt-get update && sudo apt-get upgrade 62 | ``` 63 | 64 | ### Install docker 65 | ``` bash 66 | curl -sSL https://get.docker.com | sh 67 | ``` 68 | 69 | ### Add a Non-Root User to the Docker group 70 | ``` bash 71 | # Add users to the Docker group (ex. pi) 72 | sudo usermod -aG docker pi 73 | 74 | # Add permissions for the current user 75 | sudo usermod -aG docker ${USER} 76 | 77 | # Check 78 | groups ${USER} 79 | ``` 80 | 81 | ### Install Docker-Compose 82 | ``` bash 83 | sudo apt-get install docker-compose plugin 84 | ``` 85 | 86 | ### Enable Docker to start your containers on boot 87 | ``` bash 88 | sudo systemctl enable docker 89 | ``` 90 | 91 | ### Test Docker with a ```hello-world``` container 92 | ``` bash 93 | docker run hello-world 94 | ``` 95 | 96 | ### Start a container using docker-compose 97 | Navigate to project root directory which contains the ```docker-compose.yml``` file 98 | ``` bash 99 | docker compose up -d 100 | ``` 101 | 102 | ### Upgrading containers with Docker-Compose 103 | ``` bash 104 | # Pull the latest images 105 | docker compose pull 106 | 107 | # Stop running containers 108 | docker compose stop 109 | 110 | # Remove stopped containers 111 | docker compose rm -f 112 | 113 | # Rebuild containers with updated images 114 | docker compose up -d --build 115 | ``` 116 | 117 | --- 118 | ## Docker Compose specifications 119 | 120 | Read more about the `compose.yaml` file specifications at - https://docs.docker.com/compose/compose-file/ -------------------------------------------------------------------------------- /adguard-home/compose.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | adguard-home: 3 | image: adguard/adguardhome 4 | container_name: adguard-home 5 | restart: unless-stopped 6 | volumes: 7 | - '/home/pi/adguard-home/work:/opt/adguardhome/work' 8 | - '/home/pi/adguard-home/conf:/opt/adguardhome/conf' 9 | ports: 10 | - '192.168.X.X:53:53/tcp' # Change this (IP address of host) 11 | - '192.168.X.X:53:53/udp' # Change this (IP address of host) 12 | - '67:67/udp' # Add if you want AdGuard as DHCP server 13 | - '68:68/tcp' # Add if you want AdGuard as DHCP server 14 | - '68:68/udp' # Add if you want AdGuard as DHCP server 15 | - '80:80/tcp' # Add if you want to use AdGuard web interface 16 | - '443:443/tcp' # Add if you want to use AdGuard web interface 17 | - '443:443/udp' # Add if you want to use AdGuard web interface 18 | - '3000:3000/tcp' # Add if you want to use AdGuard web interface 19 | - '853:853/tcp' # Add if you want to use AdGuard as DNS-over-TLS server 20 | - '853:853/udp' # Add if you want to use AdGuard as DNS-over-QUIC server 21 | - '5443:5443/tcp' # Add if you want to use AdGuard as DNSCrypt server 22 | - '5443:5443/udp' # Add if you want to use AdGuard as DNSCrypt server 23 | - '6060:6060/tcp' # debugging profiles 24 | cap_add: 25 | - NET_ADMIN 26 | network_mode: host # AdGuard sees client IPs correctly 27 | -------------------------------------------------------------------------------- /audiobookshelf/compose.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | audiobookshelf: 3 | image: ghcr.io/advplyr/audiobookshelf:latest 4 | ports: 5 | - 13378:80 6 | volumes: # Should be separate directories 7 | - :/audiobooks # Data directory (All audiobooks are stored here) 8 | - :/podcasts # Data directory (All podcasts are stored here) 9 | - :/config # Config directory (`audiobookshelf.db` is stored here) 10 | - :/metadata # Metadata directory (All metadata is stored here) 11 | environment: 12 | - TZ=America/Chicago 13 | -------------------------------------------------------------------------------- /calibre-web/README.md: -------------------------------------------------------------------------------- 1 | If you run into **Error 500 - Internal Server Error** after the installation, and find that `calibre-web` is unable to find the `metadata.db` file in `/books` 2 | 3 | Download the `metadata.db` file from this repository and follow these steps: 4 | 5 | Create /books folder on your container and chmod 6 | 7 | ```bash 8 | docker exec -it CONTAINER_ID mkdir /books 9 | docker exec -it CONTAINER_ID chmod a+w /books 10 | ``` 11 | 12 | Place the metadata.db file on the /books path and modifty to be writeable 13 | ```bash 14 | docker cp /path/METADATA.DB.FILE CONTAINER_ID:/books/ 15 | docker exec -it CONTAINER_ID chmod a+w /books/METADATA.DB.FILE 16 | ``` 17 | Verify 18 | ```bash 19 | docker exec -it CONTAINER_ID ls -lah /books 20 | ``` 21 | 22 | Credit to [tikg's comment](https://github.com/linuxserver/docker-calibre-web/issues/30#issuecomment-1370898505) on the [linuxserver/docker-calibre-web](https://github.com/linuxserver/docker-calibre-web) repository and [@viniciuspaes](https://github.com/viniciuspaes) for pointing this out. -------------------------------------------------------------------------------- /calibre-web/compose.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | calibre-web: 3 | image: linuxserver/calibre-web:latest 4 | container_name: calibre-web 5 | environment: 6 | - PUID=1000 7 | - PGID=1000 8 | - TZ=America/Chicago 9 | # I had some issues with Google's OAuth login and hence added the following two lines 10 | - OAUTHLIB_RELAX_TOKEN_SCOPE=1 11 | - OAUTHLIB_INSECURE_TRANSPORT=1 12 | volumes: 13 | - /home/pi/calibre-web:/config # Config directory (`app.db` is stored here) 14 | - /mnt/nfs-share/eBook_Library:/books # Data directory (All ebooks are stored here) 15 | ports: 16 | - 8083:8083 17 | restart: unless-stopped 18 | -------------------------------------------------------------------------------- /calibre-web/metadata.db: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abhilesh/self-hosted_docker_setups/399387d1fe599a26f6748b0462620aa752f78687/calibre-web/metadata.db -------------------------------------------------------------------------------- /cloudflare-ddns/compose.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | cloudflare-ddns: 3 | container_name: cloudflare-ddns 4 | image: oznu/cloudflare-ddns:latest 5 | restart: always 6 | environment: 7 | - API_KEY=XXXXXXXXXXXXXXXXXXXXX # Change to your cloudflare API token (https://developers.cloudflare.com/api/tokens/create) 8 | - ZONE=domain.com # Change to your domain 9 | - PROXIED=true 10 | - PUID=1000 # Change this 11 | - PGID=1000 # Change this -------------------------------------------------------------------------------- /cloudflare-ddns/wiki/images/api-tokens-summary-cloudflare.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abhilesh/self-hosted_docker_setups/399387d1fe599a26f6748b0462620aa752f78687/cloudflare-ddns/wiki/images/api-tokens-summary-cloudflare.png -------------------------------------------------------------------------------- /cloudflare-ddns/wiki/images/cloudflare_ddns_api_token.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abhilesh/self-hosted_docker_setups/399387d1fe599a26f6748b0462620aa752f78687/cloudflare-ddns/wiki/images/cloudflare_ddns_api_token.png -------------------------------------------------------------------------------- /code-server/compose.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | code-server: 3 | image: linuxserver/code-server 4 | container_name: code-server 5 | environment: 6 | - PUID=1000 7 | - PGID=1000 8 | - TZ=America/Chicago # Change this 9 | - PASSWORD= # Optional 10 | #- HASHED_PASSWORD= # Optional 11 | - SUDO_PASSWORD= # Optional 12 | #- SUDO_PASSWORD_HASH= # Optional 13 | #- PROXY_DOMAIN=code-server.my.domain # Optional 14 | volumes: 15 | # Mount additional volumes here 16 | - /home/pi/code-server/config:/config 17 | ports: 18 | - 8443:8443 19 | restart: unless-stopped 20 | -------------------------------------------------------------------------------- /dockprom/alertmanager/config.yml: -------------------------------------------------------------------------------- 1 | route: 2 | receiver: 'slack' 3 | 4 | receivers: 5 | - name: 'slack' 6 | slack_configs: 7 | - send_resolved: true 8 | text: "{{ .CommonAnnotations.description }}" 9 | username: 'Prometheus' 10 | channel: '#' 11 | api_url: 'https://hooks.slack.com/services/' 12 | -------------------------------------------------------------------------------- /dockprom/caddy/Caddyfile: -------------------------------------------------------------------------------- 1 | :9090 { 2 | basicauth /* { 3 | {$ADMIN_USER} {$ADMIN_PASSWORD_HASH} 4 | } 5 | reverse_proxy prometheus:9090 6 | } 7 | 8 | :9093 { 9 | basicauth /* { 10 | {$ADMIN_USER} {$ADMIN_PASSWORD_HASH} 11 | } 12 | reverse_proxy alertmanager:9093 13 | } 14 | 15 | :9091 { 16 | basicauth /* { 17 | {$ADMIN_USER} {$ADMIN_PASSWORD_HASH} 18 | } 19 | 20 | reverse_proxy pushgateway:9091 21 | } 22 | 23 | :3000 { 24 | reverse_proxy grafana:3000 25 | } -------------------------------------------------------------------------------- /dockprom/compose.yaml: -------------------------------------------------------------------------------- 1 | networks: 2 | monitor-net: 3 | driver: bridge 4 | 5 | volumes: 6 | prometheus_data: {} 7 | grafana_data: {} 8 | 9 | services: 10 | 11 | prometheus: 12 | image: prom/prometheus:v2.29.0 13 | container_name: prometheus 14 | volumes: 15 | - ./prometheus:/etc/prometheus 16 | - prometheus_data:/prometheus 17 | command: 18 | - '--config.file=/etc/prometheus/prometheus.yml' 19 | - '--storage.tsdb.path=/prometheus' 20 | - '--web.console.libraries=/etc/prometheus/console_libraries' 21 | - '--web.console.templates=/etc/prometheus/consoles' 22 | - '--storage.tsdb.retention.time=200h' 23 | - '--web.enable-lifecycle' 24 | restart: unless-stopped 25 | expose: 26 | - 9090 27 | networks: 28 | - monitor-net 29 | labels: 30 | org.label-schema.group: "monitoring" 31 | 32 | alertmanager: 33 | image: prom/alertmanager:v0.22.2 34 | container_name: alertmanager 35 | volumes: 36 | - ./alertmanager:/etc/alertmanager 37 | command: 38 | - '--config.file=/etc/alertmanager/config.yml' 39 | - '--storage.path=/alertmanager' 40 | restart: unless-stopped 41 | expose: 42 | - 9093 43 | networks: 44 | - monitor-net 45 | labels: 46 | org.label-schema.group: "monitoring" 47 | 48 | nodeexporter: 49 | image: prom/node-exporter:v1.2.2 50 | container_name: nodeexporter 51 | volumes: 52 | - /proc:/host/proc:ro 53 | - /sys:/host/sys:ro 54 | - /:/rootfs:ro 55 | command: 56 | - '--path.procfs=/host/proc' 57 | - '--path.rootfs=/rootfs' 58 | - '--path.sysfs=/host/sys' 59 | - '--collector.filesystem.mount-points-exclude=^/(sys|proc|dev|host|etc)($$|/)' 60 | restart: unless-stopped 61 | expose: 62 | - 9100 63 | networks: 64 | - monitor-net 65 | labels: 66 | org.label-schema.group: "monitoring" 67 | 68 | cadvisor: 69 | image: braingamer/cadvisor-arm:latest 70 | container_name: cadvisor 71 | volumes: 72 | - /:/rootfs:ro 73 | - /var/run:/var/run:rw 74 | - /sys:/sys:ro 75 | - /var/lib/docker:/var/lib/docker:ro 76 | #- /cgroup:/cgroup:ro #doesn't work on MacOS only for Linux 77 | command: 78 | # Additional configuration to limit cadvisor's resource use 79 | - '-housekeeping_interval=10s' 80 | - '-max_housekeeping_interval=35s' 81 | - '-event_storage_event_limit=default=0' 82 | - '-event_storage_age_limit=default=0' 83 | - '-allow_dynamic_housekeeping=true' 84 | - '_docker_only=true' 85 | restart: unless-stopped 86 | expose: 87 | - 8080 88 | networks: 89 | - monitor-net 90 | labels: 91 | org.label-schema.group: "monitoring" 92 | 93 | grafana: 94 | image: grafana/grafana:8.1.2 95 | container_name: grafana 96 | volumes: 97 | - grafana_data:/var/lib/grafana 98 | - ./grafana/provisioning/dashboards:/etc/grafana/provisioning/dashboards 99 | - ./grafana/provisioning/datasources:/etc/grafana/provisioning/datasources 100 | environment: 101 | - GF_SECURITY_ADMIN_USER=${ADMIN_USER:-admin} 102 | - GF_SECURITY_ADMIN_PASSWORD=${ADMIN_PASSWORD:-admin} 103 | - GF_USERS_ALLOW_SIGN_UP=false 104 | restart: unless-stopped 105 | expose: 106 | - 3000 107 | networks: 108 | - monitor-net 109 | labels: 110 | org.label-schema.group: "monitoring" 111 | 112 | pushgateway: 113 | image: prom/pushgateway:v1.4.1 114 | container_name: pushgateway 115 | restart: unless-stopped 116 | expose: 117 | - 9094 118 | networks: 119 | - monitor-net 120 | labels: 121 | org.label-schema.group: "monitoring" 122 | 123 | caddy: 124 | image: caddy:2.3.0 125 | container_name: caddy 126 | ports: 127 | - "3000:3000" 128 | - "9090:9090" 129 | - "9093:9093" 130 | - "9094:9094" 131 | volumes: 132 | - ./caddy:/etc/caddy 133 | environment: 134 | - ADMIN_USER=${ADMIN_USER:-admin} 135 | - ADMIN_PASSWORD=${ADMIN_PASSWORD:-admin} 136 | # Caddy v2 does not accept plaintext passwords 137 | # To generate a password hash, run the following after replacing 'ADMIN_PASSWORD' 138 | # docker run --rm caddy caddy hash-password --plaintext 'ADMIN_PASSWORD' 139 | - ADMIN_PASSWORD_HASH=${ADMIN_PASSWORD_HASH:-} # Change this 140 | restart: unless-stopped 141 | networks: 142 | - monitor-net 143 | labels: 144 | org.label-schema.group: "monitoring" 145 | -------------------------------------------------------------------------------- /dockprom/docker-compose.exporters.yml: -------------------------------------------------------------------------------- 1 | services: 2 | 3 | nodeexporter: 4 | image: prom/node-exporter:v1.2.2 5 | container_name: nodeexporter 6 | volumes: 7 | - /proc:/host/proc:ro 8 | - /sys:/host/sys:ro 9 | - /:/rootfs:ro 10 | command: 11 | - '--path.procfs=/host/proc' 12 | - '--path.rootfs=/rootfs' 13 | - '--path.sysfs=/host/sys' 14 | - '--collector.filesystem.mount-points-exclude=^/(sys|proc|dev|host|etc)($$|/)' 15 | restart: unless-stopped 16 | network_mode: host 17 | labels: 18 | org.label-schema.group: "monitoring" 19 | 20 | cadvisor: 21 | image: gcr.io/cadvisor/cadvisor:v0.40.0 22 | container_name: cadvisor 23 | volumes: 24 | - /:/rootfs:ro 25 | - /var/run:/var/run:rw 26 | - /sys:/sys:ro 27 | - /var/lib/docker/:/var/lib/docker:ro 28 | - /cgroup:/cgroup:ro 29 | restart: unless-stopped 30 | network_mode: host 31 | labels: 32 | org.label-schema.group: "monitoring" 33 | 34 | 35 | -------------------------------------------------------------------------------- /dockprom/grafana/provisioning/dashboards/dashboard.yml: -------------------------------------------------------------------------------- 1 | apiVersion: 1 2 | 3 | providers: 4 | - name: 'Prometheus' 5 | orgId: 1 6 | folder: '' 7 | type: file 8 | disableDeletion: false 9 | editable: true 10 | allowUiUpdates: true 11 | options: 12 | path: /etc/grafana/provisioning/dashboards -------------------------------------------------------------------------------- /dockprom/grafana/provisioning/dashboards/docker_containers.json: -------------------------------------------------------------------------------- 1 | { 2 | "id": null, 3 | "title": "Docker Containers", 4 | "description": "Containers metrics", 5 | "tags": [ 6 | "docker" 7 | ], 8 | "style": "dark", 9 | "timezone": "browser", 10 | "editable": true, 11 | "hideControls": false, 12 | "sharedCrosshair": true, 13 | "rows": [ 14 | { 15 | "collapse": false, 16 | "editable": true, 17 | "height": "150px", 18 | "panels": [ 19 | { 20 | "cacheTimeout": null, 21 | "colorBackground": false, 22 | "colorValue": false, 23 | "colors": [ 24 | "rgba(50, 172, 45, 0.97)", 25 | "rgba(237, 129, 40, 0.89)", 26 | "rgba(245, 54, 54, 0.9)" 27 | ], 28 | "datasource": "Prometheus", 29 | "decimals": 2, 30 | "editable": true, 31 | "error": false, 32 | "format": "percent", 33 | "gauge": { 34 | "maxValue": 100, 35 | "minValue": 0, 36 | "show": true, 37 | "thresholdLabels": false, 38 | "thresholdMarkers": true 39 | }, 40 | "id": 4, 41 | "interval": null, 42 | "isNew": true, 43 | "links": [], 44 | "mappingType": 1, 45 | "mappingTypes": [ 46 | { 47 | "name": "value to text", 48 | "value": 1 49 | }, 50 | { 51 | "name": "range to text", 52 | "value": 2 53 | } 54 | ], 55 | "maxDataPoints": 100, 56 | "nullPointMode": "connected", 57 | "nullText": null, 58 | "postfix": "", 59 | "postfixFontSize": "50%", 60 | "prefix": "", 61 | "prefixFontSize": "50%", 62 | "rangeMaps": [ 63 | { 64 | "from": "null", 65 | "text": "N/A", 66 | "to": "null" 67 | } 68 | ], 69 | "span": 2, 70 | "sparkline": { 71 | "fillColor": "rgba(31, 118, 189, 0.18)", 72 | "full": false, 73 | "lineColor": "rgb(31, 120, 193)", 74 | "show": false 75 | }, 76 | "targets": [ 77 | { 78 | "expr": "sum(rate(container_cpu_user_seconds_total{image!=\"\"}[1m])) / count(node_cpu_seconds_total{mode=\"user\"}) * 100", 79 | "interval": "10s", 80 | "intervalFactor": 1, 81 | "legendFormat": "", 82 | "refId": "A", 83 | "step": 10 84 | } 85 | ], 86 | "thresholds": "65, 90", 87 | "title": "CPU Load", 88 | "transparent": false, 89 | "type": "singlestat", 90 | "valueFontSize": "80%", 91 | "valueMaps": [ 92 | { 93 | "op": "=", 94 | "text": "N/A", 95 | "value": "null" 96 | } 97 | ], 98 | "valueName": "avg", 99 | "timeFrom": "10s", 100 | "hideTimeOverride": true 101 | }, 102 | { 103 | "cacheTimeout": null, 104 | "colorBackground": false, 105 | "colorValue": false, 106 | "colors": [ 107 | "rgba(245, 54, 54, 0.9)", 108 | "rgba(237, 129, 40, 0.89)", 109 | "rgba(50, 172, 45, 0.97)" 110 | ], 111 | "datasource": "Prometheus", 112 | "editable": true, 113 | "error": false, 114 | "format": "none", 115 | "gauge": { 116 | "maxValue": 100, 117 | "minValue": 0, 118 | "show": false, 119 | "thresholdLabels": false, 120 | "thresholdMarkers": true 121 | }, 122 | "id": 7, 123 | "interval": null, 124 | "isNew": true, 125 | "links": [], 126 | "mappingType": 1, 127 | "mappingTypes": [ 128 | { 129 | "name": "value to text", 130 | "value": 1 131 | }, 132 | { 133 | "name": "range to text", 134 | "value": 2 135 | } 136 | ], 137 | "maxDataPoints": 100, 138 | "nullPointMode": "connected", 139 | "nullText": null, 140 | "postfix": "", 141 | "postfixFontSize": "50%", 142 | "prefix": "", 143 | "prefixFontSize": "50%", 144 | "rangeMaps": [ 145 | { 146 | "from": "null", 147 | "text": "N/A", 148 | "to": "null" 149 | } 150 | ], 151 | "span": 2, 152 | "sparkline": { 153 | "fillColor": "rgba(31, 118, 189, 0.18)", 154 | "full": false, 155 | "lineColor": "rgb(31, 120, 193)", 156 | "show": false 157 | }, 158 | "targets": [ 159 | { 160 | "expr": "machine_cpu_cores", 161 | "interval": "", 162 | "intervalFactor": 2, 163 | "legendFormat": "", 164 | "metric": "machine_cpu_cores", 165 | "refId": "A", 166 | "step": 20 167 | } 168 | ], 169 | "thresholds": "", 170 | "title": "CPU Cores", 171 | "type": "singlestat", 172 | "valueFontSize": "80%", 173 | "valueMaps": [ 174 | { 175 | "op": "=", 176 | "text": "N/A", 177 | "value": "null" 178 | } 179 | ], 180 | "valueName": "avg" 181 | }, 182 | { 183 | "cacheTimeout": null, 184 | "colorBackground": false, 185 | "colorValue": false, 186 | "colors": [ 187 | "rgba(50, 172, 45, 0.97)", 188 | "rgba(237, 129, 40, 0.89)", 189 | "rgba(245, 54, 54, 0.9)" 190 | ], 191 | "datasource": "Prometheus", 192 | "editable": true, 193 | "error": false, 194 | "format": "percent", 195 | "gauge": { 196 | "maxValue": 100, 197 | "minValue": 0, 198 | "show": true, 199 | "thresholdLabels": false, 200 | "thresholdMarkers": true 201 | }, 202 | "id": 5, 203 | "interval": null, 204 | "isNew": true, 205 | "links": [], 206 | "mappingType": 1, 207 | "mappingTypes": [ 208 | { 209 | "name": "value to text", 210 | "value": 1 211 | }, 212 | { 213 | "name": "range to text", 214 | "value": 2 215 | } 216 | ], 217 | "maxDataPoints": 100, 218 | "nullPointMode": "connected", 219 | "nullText": null, 220 | "postfix": "", 221 | "postfixFontSize": "50%", 222 | "prefix": "", 223 | "prefixFontSize": "50%", 224 | "rangeMaps": [ 225 | { 226 | "from": "null", 227 | "text": "N/A", 228 | "to": "null" 229 | } 230 | ], 231 | "span": 2, 232 | "sparkline": { 233 | "fillColor": "rgba(31, 118, 189, 0.18)", 234 | "full": false, 235 | "lineColor": "rgb(31, 120, 193)", 236 | "show": false 237 | }, 238 | "targets": [ 239 | { 240 | "expr": "(sum(node_memory_MemTotal_bytes) - sum(node_memory_MemFree_bytes+node_memory_Buffers_bytes+node_memory_Cached_bytes) ) / sum(node_memory_MemTotal_bytes) * 100", 241 | "interval": "10s", 242 | "intervalFactor": 2, 243 | "legendFormat": "", 244 | "refId": "A", 245 | "step": 20 246 | } 247 | ], 248 | "thresholds": "65, 90", 249 | "title": "Memory Load", 250 | "transparent": false, 251 | "type": "singlestat", 252 | "valueFontSize": "80%", 253 | "valueMaps": [ 254 | { 255 | "op": "=", 256 | "text": "N/A", 257 | "value": "null" 258 | } 259 | ], 260 | "valueName": "avg", 261 | "timeFrom": "10s", 262 | "hideTimeOverride": true 263 | }, 264 | { 265 | "cacheTimeout": null, 266 | "colorBackground": false, 267 | "colorValue": false, 268 | "colors": [ 269 | "rgba(245, 54, 54, 0.9)", 270 | "rgba(237, 129, 40, 0.89)", 271 | "rgba(50, 172, 45, 0.97)" 272 | ], 273 | "datasource": "Prometheus", 274 | "decimals": 2, 275 | "editable": true, 276 | "error": false, 277 | "format": "bytes", 278 | "gauge": { 279 | "maxValue": 100, 280 | "minValue": 0, 281 | "show": false, 282 | "thresholdLabels": false, 283 | "thresholdMarkers": true 284 | }, 285 | "id": 2, 286 | "interval": null, 287 | "isNew": true, 288 | "links": [], 289 | "mappingType": 1, 290 | "mappingTypes": [ 291 | { 292 | "name": "value to text", 293 | "value": 1 294 | }, 295 | { 296 | "name": "range to text", 297 | "value": 2 298 | } 299 | ], 300 | "maxDataPoints": 100, 301 | "nullPointMode": "connected", 302 | "nullText": null, 303 | "postfix": "", 304 | "postfixFontSize": "50%", 305 | "prefix": "", 306 | "prefixFontSize": "50%", 307 | "rangeMaps": [ 308 | { 309 | "from": "null", 310 | "text": "N/A", 311 | "to": "null" 312 | } 313 | ], 314 | "span": 2, 315 | "sparkline": { 316 | "fillColor": "rgba(31, 118, 189, 0.18)", 317 | "full": false, 318 | "lineColor": "rgb(31, 120, 193)", 319 | "show": false 320 | }, 321 | "targets": [ 322 | { 323 | "expr": "sum(container_memory_usage_bytes{image!=\"\"})", 324 | "interval": "10s", 325 | "intervalFactor": 2, 326 | "legendFormat": "", 327 | "refId": "A", 328 | "step": 20 329 | } 330 | ], 331 | "thresholds": "", 332 | "timeFrom": "10s", 333 | "title": "Used Memory", 334 | "transparent": false, 335 | "type": "singlestat", 336 | "valueFontSize": "80%", 337 | "valueMaps": [ 338 | { 339 | "op": "=", 340 | "text": "N/A", 341 | "value": "null" 342 | } 343 | ], 344 | "valueName": "avg", 345 | "hideTimeOverride": true 346 | }, 347 | { 348 | "cacheTimeout": null, 349 | "colorBackground": false, 350 | "colorValue": false, 351 | "colors": [ 352 | "rgba(50, 172, 45, 0.97)", 353 | "rgba(237, 129, 40, 0.89)", 354 | "rgba(245, 54, 54, 0.9)" 355 | ], 356 | "datasource": "Prometheus", 357 | "decimals": null, 358 | "editable": true, 359 | "error": false, 360 | "format": "percent", 361 | "gauge": { 362 | "maxValue": 100, 363 | "minValue": 0, 364 | "show": true, 365 | "thresholdLabels": false, 366 | "thresholdMarkers": true 367 | }, 368 | "id": 6, 369 | "interval": null, 370 | "isNew": true, 371 | "links": [], 372 | "mappingType": 1, 373 | "mappingTypes": [ 374 | { 375 | "name": "value to text", 376 | "value": 1 377 | }, 378 | { 379 | "name": "range to text", 380 | "value": 2 381 | } 382 | ], 383 | "maxDataPoints": 100, 384 | "nullPointMode": "connected", 385 | "nullText": null, 386 | "postfix": "", 387 | "postfixFontSize": "50%", 388 | "prefix": "", 389 | "prefixFontSize": "50%", 390 | "rangeMaps": [ 391 | { 392 | "from": "null", 393 | "text": "N/A", 394 | "to": "null" 395 | } 396 | ], 397 | "span": 2, 398 | "sparkline": { 399 | "fillColor": "rgba(31, 118, 189, 0.18)", 400 | "full": false, 401 | "lineColor": "rgb(31, 120, 193)", 402 | "show": false 403 | }, 404 | "targets": [ 405 | { 406 | "expr": "(node_filesystem_size_bytes{fstype=\"aufs\"} - node_filesystem_free_bytes{fstype=\"aufs\"}) / node_filesystem_size_bytes{fstype=\"aufs\"} * 100", 407 | "interval": "30s", 408 | "intervalFactor": 1, 409 | "legendFormat": "", 410 | "refId": "A", 411 | "step": 30 412 | } 413 | ], 414 | "thresholds": "65, 90", 415 | "title": "Storage Load", 416 | "transparent": false, 417 | "type": "singlestat", 418 | "valueFontSize": "80%", 419 | "valueMaps": [ 420 | { 421 | "op": "=", 422 | "text": "N/A", 423 | "value": "null" 424 | } 425 | ], 426 | "valueName": "avg", 427 | "timeFrom": "10s", 428 | "hideTimeOverride": true 429 | }, 430 | { 431 | "cacheTimeout": null, 432 | "colorBackground": false, 433 | "colorValue": false, 434 | "colors": [ 435 | "rgba(245, 54, 54, 0.9)", 436 | "rgba(237, 129, 40, 0.89)", 437 | "rgba(50, 172, 45, 0.97)" 438 | ], 439 | "datasource": "Prometheus", 440 | "decimals": 2, 441 | "editable": true, 442 | "error": false, 443 | "format": "bytes", 444 | "gauge": { 445 | "maxValue": 100, 446 | "minValue": 0, 447 | "show": false, 448 | "thresholdLabels": false, 449 | "thresholdMarkers": true 450 | }, 451 | "id": 3, 452 | "interval": null, 453 | "isNew": true, 454 | "links": [], 455 | "mappingType": 1, 456 | "mappingTypes": [ 457 | { 458 | "name": "value to text", 459 | "value": 1 460 | }, 461 | { 462 | "name": "range to text", 463 | "value": 2 464 | } 465 | ], 466 | "maxDataPoints": 100, 467 | "nullPointMode": "connected", 468 | "nullText": null, 469 | "postfix": "", 470 | "postfixFontSize": "50%", 471 | "prefix": "", 472 | "prefixFontSize": "50%", 473 | "rangeMaps": [ 474 | { 475 | "from": "null", 476 | "text": "N/A", 477 | "to": "null" 478 | } 479 | ], 480 | "span": 2, 481 | "sparkline": { 482 | "fillColor": "rgba(31, 118, 189, 0.18)", 483 | "full": false, 484 | "lineColor": "rgb(31, 120, 193)", 485 | "show": false 486 | }, 487 | "targets": [ 488 | { 489 | "expr": "sum(container_fs_usage_bytes)", 490 | "interval": "30s", 491 | "intervalFactor": 2, 492 | "refId": "A", 493 | "step": 60 494 | } 495 | ], 496 | "thresholds": "", 497 | "title": "Used Storage", 498 | "transparent": false, 499 | "type": "singlestat", 500 | "valueFontSize": "80%", 501 | "valueMaps": [ 502 | { 503 | "op": "=", 504 | "text": "N/A", 505 | "value": "null" 506 | } 507 | ], 508 | "valueName": "avg", 509 | "timeFrom": "10s", 510 | "hideTimeOverride": true 511 | } 512 | ], 513 | "title": "Overview" 514 | }, 515 | { 516 | "collapse": false, 517 | "editable": true, 518 | "height": "150px", 519 | "panels": [ 520 | { 521 | "aliasColors": {}, 522 | "bars": true, 523 | "datasource": "Prometheus", 524 | "decimals": 0, 525 | "editable": true, 526 | "error": false, 527 | "fill": 1, 528 | "grid": { 529 | "threshold1": null, 530 | "threshold1Color": "rgba(216, 200, 27, 0.27)", 531 | "threshold2": null, 532 | "threshold2Color": "rgba(234, 112, 112, 0.22)", 533 | "thresholdLine": false 534 | }, 535 | "id": 9, 536 | "isNew": true, 537 | "legend": { 538 | "avg": false, 539 | "current": false, 540 | "max": false, 541 | "min": false, 542 | "show": false, 543 | "total": false, 544 | "values": false 545 | }, 546 | "lines": false, 547 | "linewidth": 2, 548 | "links": [], 549 | "nullPointMode": "connected", 550 | "percentage": false, 551 | "pointradius": 5, 552 | "points": false, 553 | "renderer": "flot", 554 | "seriesOverrides": [], 555 | "span": 4, 556 | "stack": false, 557 | "steppedLine": false, 558 | "targets": [ 559 | { 560 | "expr": "scalar(count(container_memory_usage_bytes{image!=\"\"}) > 0)", 561 | "interval": "", 562 | "intervalFactor": 2, 563 | "legendFormat": "containers", 564 | "refId": "A", 565 | "step": 2 566 | } 567 | ], 568 | "timeFrom": null, 569 | "timeShift": null, 570 | "title": "Running Containers", 571 | "tooltip": { 572 | "msResolution": true, 573 | "shared": true, 574 | "sort": 0, 575 | "value_type": "cumulative" 576 | }, 577 | "type": "graph", 578 | "xaxis": { 579 | "show": true 580 | }, 581 | "yaxes": [ 582 | { 583 | "format": "none", 584 | "label": "", 585 | "logBase": 1, 586 | "max": null, 587 | "min": 0, 588 | "show": true 589 | }, 590 | { 591 | "format": "short", 592 | "label": null, 593 | "logBase": 1, 594 | "max": null, 595 | "min": null, 596 | "show": false 597 | } 598 | ] 599 | }, 600 | { 601 | "aliasColors": {}, 602 | "bars": true, 603 | "datasource": "Prometheus", 604 | "decimals": 2, 605 | "editable": true, 606 | "error": false, 607 | "fill": 1, 608 | "grid": { 609 | "threshold1": null, 610 | "threshold1Color": "rgba(216, 200, 27, 0.27)", 611 | "threshold2": null, 612 | "threshold2Color": "rgba(234, 112, 112, 0.22)" 613 | }, 614 | "id": 10, 615 | "isNew": true, 616 | "legend": { 617 | "avg": false, 618 | "current": false, 619 | "max": false, 620 | "min": false, 621 | "show": false, 622 | "total": false, 623 | "values": false 624 | }, 625 | "lines": false, 626 | "linewidth": 2, 627 | "links": [], 628 | "nullPointMode": "connected", 629 | "percentage": false, 630 | "pointradius": 5, 631 | "points": false, 632 | "renderer": "flot", 633 | "seriesOverrides": [ 634 | { 635 | "alias": "load 1m", 636 | "color": "#BF1B00" 637 | } 638 | ], 639 | "span": 4, 640 | "stack": false, 641 | "steppedLine": false, 642 | "targets": [ 643 | { 644 | "expr": "node_load1", 645 | "interval": "", 646 | "intervalFactor": 2, 647 | "legendFormat": "load 1m", 648 | "metric": "node_load1", 649 | "refId": "A", 650 | "step": 2 651 | } 652 | ], 653 | "timeFrom": null, 654 | "timeShift": null, 655 | "title": "System Load", 656 | "tooltip": { 657 | "msResolution": true, 658 | "shared": true, 659 | "sort": 0, 660 | "value_type": "cumulative" 661 | }, 662 | "type": "graph", 663 | "xaxis": { 664 | "show": true 665 | }, 666 | "yaxes": [ 667 | { 668 | "format": "short", 669 | "label": null, 670 | "logBase": 1, 671 | "max": null, 672 | "min": 0, 673 | "show": true 674 | }, 675 | { 676 | "format": "short", 677 | "label": null, 678 | "logBase": 1, 679 | "max": null, 680 | "min": null, 681 | "show": false 682 | } 683 | ] 684 | }, 685 | { 686 | "aliasColors": {}, 687 | "bars": false, 688 | "datasource": "Prometheus", 689 | "editable": true, 690 | "error": false, 691 | "fill": 1, 692 | "grid": { 693 | "threshold1": null, 694 | "threshold1Color": "rgba(216, 200, 27, 0.27)", 695 | "threshold2": null, 696 | "threshold2Color": "rgba(234, 112, 112, 0.22)" 697 | }, 698 | "id": 15, 699 | "isNew": true, 700 | "legend": { 701 | "alignAsTable": true, 702 | "avg": true, 703 | "current": false, 704 | "max": true, 705 | "min": true, 706 | "rightSide": true, 707 | "show": false, 708 | "total": false, 709 | "values": true 710 | }, 711 | "lines": true, 712 | "linewidth": 2, 713 | "links": [], 714 | "nullPointMode": "connected", 715 | "percentage": false, 716 | "pointradius": 5, 717 | "points": false, 718 | "renderer": "flot", 719 | "seriesOverrides": [ 720 | { 721 | "alias": "read", 722 | "yaxis": 1 723 | }, 724 | { 725 | "alias": "written", 726 | "yaxis": 1 727 | }, 728 | { 729 | "alias": "io time", 730 | "yaxis": 2 731 | } 732 | ], 733 | "span": 4, 734 | "stack": false, 735 | "steppedLine": false, 736 | "targets": [ 737 | { 738 | "expr": "sum(irate(node_disk_read_bytes_total[5m]))", 739 | "interval": "2s", 740 | "intervalFactor": 4, 741 | "legendFormat": "read", 742 | "metric": "", 743 | "refId": "A", 744 | "step": 8 745 | }, 746 | { 747 | "expr": "sum(irate(node_disk_written_bytes_total[5m]))", 748 | "interval": "2s", 749 | "intervalFactor": 4, 750 | "legendFormat": "written", 751 | "metric": "", 752 | "refId": "B", 753 | "step": 8 754 | }, 755 | { 756 | "expr": "sum(irate(node_disk_io_time_seconds_total[5m]))", 757 | "interval": "2s", 758 | "intervalFactor": 4, 759 | "legendFormat": "io time", 760 | "metric": "", 761 | "refId": "C", 762 | "step": 8 763 | } 764 | ], 765 | "timeFrom": null, 766 | "timeShift": null, 767 | "title": "I/O Usage", 768 | "tooltip": { 769 | "msResolution": true, 770 | "shared": true, 771 | "sort": 0, 772 | "value_type": "cumulative" 773 | }, 774 | "type": "graph", 775 | "xaxis": { 776 | "show": true 777 | }, 778 | "yaxes": [ 779 | { 780 | "format": "bytes", 781 | "label": null, 782 | "logBase": 1, 783 | "max": null, 784 | "min": null, 785 | "show": true 786 | }, 787 | { 788 | "format": "ms", 789 | "label": null, 790 | "logBase": 1, 791 | "max": null, 792 | "min": null, 793 | "show": true 794 | } 795 | ] 796 | } 797 | ], 798 | "title": "Host stats" 799 | }, 800 | { 801 | "collapse": false, 802 | "editable": true, 803 | "height": "250px", 804 | "panels": [ 805 | { 806 | "aliasColors": {}, 807 | "bars": false, 808 | "datasource": "Prometheus", 809 | "decimals": 2, 810 | "editable": true, 811 | "error": false, 812 | "fill": 1, 813 | "grid": { 814 | "threshold1": null, 815 | "threshold1Color": "rgba(216, 200, 27, 0.27)", 816 | "threshold2": null, 817 | "threshold2Color": "rgba(234, 112, 112, 0.22)" 818 | }, 819 | "id": 8, 820 | "isNew": true, 821 | "legend": { 822 | "alignAsTable": true, 823 | "avg": true, 824 | "current": false, 825 | "max": true, 826 | "min": true, 827 | "rightSide": true, 828 | "show": true, 829 | "total": false, 830 | "values": true 831 | }, 832 | "lines": true, 833 | "linewidth": 2, 834 | "links": [], 835 | "nullPointMode": "connected", 836 | "percentage": false, 837 | "pointradius": 5, 838 | "points": false, 839 | "renderer": "flot", 840 | "seriesOverrides": [], 841 | "span": 12, 842 | "stack": false, 843 | "steppedLine": false, 844 | "targets": [ 845 | { 846 | "expr": "sum by (name) (rate(container_cpu_usage_seconds_total{image!=\"\",container_label_org_label_schema_group=\"\"}[1m])) / scalar(count(node_cpu_seconds_total{mode=\"user\"})) * 100", 847 | "intervalFactor": 10, 848 | "legendFormat": "{{ name }}", 849 | "metric": "container_cpu_user_seconds_total", 850 | "refId": "A", 851 | "step": 10 852 | } 853 | ], 854 | "timeFrom": null, 855 | "timeShift": null, 856 | "title": "Container CPU Usage", 857 | "tooltip": { 858 | "msResolution": true, 859 | "shared": true, 860 | "sort": 2, 861 | "value_type": "cumulative" 862 | }, 863 | "type": "graph", 864 | "xaxis": { 865 | "show": true 866 | }, 867 | "yaxes": [ 868 | { 869 | "format": "percent", 870 | "label": null, 871 | "logBase": 1, 872 | "max": null, 873 | "min": 0, 874 | "show": true 875 | }, 876 | { 877 | "format": "short", 878 | "label": null, 879 | "logBase": 1, 880 | "max": null, 881 | "min": null, 882 | "show": false 883 | } 884 | ] 885 | } 886 | ], 887 | "title": "CPU" 888 | }, 889 | { 890 | "collapse": false, 891 | "editable": true, 892 | "height": "250px", 893 | "panels": [ 894 | { 895 | "aliasColors": {}, 896 | "bars": false, 897 | "datasource": "Prometheus", 898 | "decimals": 2, 899 | "editable": true, 900 | "error": false, 901 | "fill": 1, 902 | "grid": { 903 | "threshold1": null, 904 | "threshold1Color": "rgba(216, 200, 27, 0.27)", 905 | "threshold2": null, 906 | "threshold2Color": "rgba(234, 112, 112, 0.22)" 907 | }, 908 | "id": 11, 909 | "isNew": true, 910 | "legend": { 911 | "alignAsTable": true, 912 | "avg": true, 913 | "current": false, 914 | "max": true, 915 | "min": true, 916 | "rightSide": true, 917 | "show": true, 918 | "total": false, 919 | "values": true 920 | }, 921 | "lines": true, 922 | "linewidth": 2, 923 | "links": [], 924 | "nullPointMode": "connected", 925 | "percentage": false, 926 | "pointradius": 5, 927 | "points": false, 928 | "renderer": "flot", 929 | "seriesOverrides": [], 930 | "span": 12, 931 | "stack": false, 932 | "steppedLine": false, 933 | "targets": [ 934 | { 935 | "expr": "sum by (name)(container_memory_usage_bytes{image!=\"\",container_label_org_label_schema_group=\"\"})", 936 | "intervalFactor": 1, 937 | "legendFormat": "{{ name }}", 938 | "metric": "container_memory_usage", 939 | "refId": "A", 940 | "step": 1 941 | } 942 | ], 943 | "timeFrom": null, 944 | "timeShift": null, 945 | "title": "Container Memory Usage", 946 | "tooltip": { 947 | "msResolution": true, 948 | "shared": true, 949 | "sort": 0, 950 | "value_type": "cumulative" 951 | }, 952 | "type": "graph", 953 | "xaxis": { 954 | "show": true 955 | }, 956 | "yaxes": [ 957 | { 958 | "format": "bytes", 959 | "label": null, 960 | "logBase": 1, 961 | "max": null, 962 | "min": 0, 963 | "show": true 964 | }, 965 | { 966 | "format": "short", 967 | "label": null, 968 | "logBase": 1, 969 | "max": null, 970 | "min": null, 971 | "show": false 972 | } 973 | ] 974 | }, 975 | { 976 | "aliasColors": {}, 977 | "bars": false, 978 | "datasource": "Prometheus", 979 | "decimals": 2, 980 | "editable": true, 981 | "error": false, 982 | "fill": 1, 983 | "grid": { 984 | "threshold1": null, 985 | "threshold1Color": "rgba(216, 200, 27, 0.27)", 986 | "threshold2": null, 987 | "threshold2Color": "rgba(234, 112, 112, 0.22)" 988 | }, 989 | "id": 12, 990 | "isNew": true, 991 | "legend": { 992 | "alignAsTable": true, 993 | "avg": true, 994 | "current": false, 995 | "max": true, 996 | "min": true, 997 | "rightSide": true, 998 | "show": true, 999 | "total": false, 1000 | "values": true 1001 | }, 1002 | "lines": true, 1003 | "linewidth": 2, 1004 | "links": [], 1005 | "nullPointMode": "connected", 1006 | "percentage": false, 1007 | "pointradius": 5, 1008 | "points": false, 1009 | "renderer": "flot", 1010 | "seriesOverrides": [], 1011 | "span": 12, 1012 | "stack": false, 1013 | "steppedLine": false, 1014 | "targets": [ 1015 | { 1016 | "expr": "sum by (name) (container_memory_cache{image!=\"\",container_label_org_label_schema_group=\"\"})", 1017 | "intervalFactor": 2, 1018 | "legendFormat": "{{name}}", 1019 | "metric": "container_memory_cache", 1020 | "refId": "A", 1021 | "step": 2 1022 | } 1023 | ], 1024 | "timeFrom": null, 1025 | "timeShift": null, 1026 | "title": "Container Cached Memory Usage", 1027 | "tooltip": { 1028 | "msResolution": true, 1029 | "shared": true, 1030 | "sort": 0, 1031 | "value_type": "cumulative" 1032 | }, 1033 | "type": "graph", 1034 | "xaxis": { 1035 | "show": true 1036 | }, 1037 | "yaxes": [ 1038 | { 1039 | "format": "bytes", 1040 | "label": null, 1041 | "logBase": 1, 1042 | "max": null, 1043 | "min": 0, 1044 | "show": true 1045 | }, 1046 | { 1047 | "format": "short", 1048 | "label": null, 1049 | "logBase": 1, 1050 | "max": null, 1051 | "min": null, 1052 | "show": false 1053 | } 1054 | ] 1055 | } 1056 | ], 1057 | "title": "Memory" 1058 | }, 1059 | { 1060 | "collapse": false, 1061 | "editable": true, 1062 | "height": "250px", 1063 | "panels": [ 1064 | { 1065 | "aliasColors": {}, 1066 | "bars": false, 1067 | "datasource": "Prometheus", 1068 | "decimals": 2, 1069 | "editable": true, 1070 | "error": false, 1071 | "fill": 1, 1072 | "grid": { 1073 | "threshold1": null, 1074 | "threshold1Color": "rgba(216, 200, 27, 0.27)", 1075 | "threshold2": null, 1076 | "threshold2Color": "rgba(234, 112, 112, 0.22)" 1077 | }, 1078 | "id": 13, 1079 | "isNew": true, 1080 | "legend": { 1081 | "alignAsTable": true, 1082 | "avg": true, 1083 | "current": false, 1084 | "max": true, 1085 | "min": true, 1086 | "rightSide": true, 1087 | "show": true, 1088 | "total": false, 1089 | "values": true 1090 | }, 1091 | "lines": true, 1092 | "linewidth": 2, 1093 | "links": [], 1094 | "nullPointMode": "connected", 1095 | "percentage": false, 1096 | "pointradius": 5, 1097 | "points": false, 1098 | "renderer": "flot", 1099 | "seriesOverrides": [], 1100 | "span": 12, 1101 | "stack": false, 1102 | "steppedLine": false, 1103 | "targets": [ 1104 | { 1105 | "expr": "sum by (name) (rate(container_network_receive_bytes_total{image!=\"\",container_label_org_label_schema_group=\"\"}[1m]))", 1106 | "intervalFactor": 10, 1107 | "legendFormat": "{{ name }}", 1108 | "metric": "container_network_receive_bytes_total", 1109 | "refId": "A", 1110 | "step": 10 1111 | } 1112 | ], 1113 | "timeFrom": null, 1114 | "timeShift": null, 1115 | "title": "Container Network Input", 1116 | "tooltip": { 1117 | "msResolution": true, 1118 | "shared": true, 1119 | "sort": 2, 1120 | "value_type": "cumulative" 1121 | }, 1122 | "type": "graph", 1123 | "xaxis": { 1124 | "show": true 1125 | }, 1126 | "yaxes": [ 1127 | { 1128 | "format": "bytes", 1129 | "label": null, 1130 | "logBase": 1, 1131 | "max": null, 1132 | "min": 0, 1133 | "show": true 1134 | }, 1135 | { 1136 | "format": "short", 1137 | "label": null, 1138 | "logBase": 1, 1139 | "max": null, 1140 | "min": null, 1141 | "show": false 1142 | } 1143 | ] 1144 | }, 1145 | { 1146 | "aliasColors": {}, 1147 | "bars": false, 1148 | "datasource": "Prometheus", 1149 | "decimals": 2, 1150 | "editable": true, 1151 | "error": false, 1152 | "fill": 1, 1153 | "grid": { 1154 | "threshold1": null, 1155 | "threshold1Color": "rgba(216, 200, 27, 0.27)", 1156 | "threshold2": null, 1157 | "threshold2Color": "rgba(234, 112, 112, 0.22)" 1158 | }, 1159 | "id": 14, 1160 | "isNew": true, 1161 | "legend": { 1162 | "alignAsTable": true, 1163 | "avg": true, 1164 | "current": false, 1165 | "max": true, 1166 | "min": true, 1167 | "rightSide": true, 1168 | "show": true, 1169 | "total": false, 1170 | "values": true 1171 | }, 1172 | "lines": true, 1173 | "linewidth": 2, 1174 | "links": [], 1175 | "nullPointMode": "connected", 1176 | "percentage": false, 1177 | "pointradius": 5, 1178 | "points": false, 1179 | "renderer": "flot", 1180 | "seriesOverrides": [], 1181 | "span": 12, 1182 | "stack": false, 1183 | "steppedLine": false, 1184 | "targets": [ 1185 | { 1186 | "expr": "sum by (name) (rate(container_network_transmit_bytes_total{image!=\"\",container_label_org_label_schema_group=\"\"}[1m]))", 1187 | "intervalFactor": 10, 1188 | "legendFormat": "{{ name }}", 1189 | "metric": "container_network_transmit_bytes_total", 1190 | "refId": "A", 1191 | "step": 10 1192 | } 1193 | ], 1194 | "timeFrom": null, 1195 | "timeShift": null, 1196 | "title": "Container Network Output", 1197 | "tooltip": { 1198 | "msResolution": true, 1199 | "shared": true, 1200 | "sort": 2, 1201 | "value_type": "cumulative" 1202 | }, 1203 | "type": "graph", 1204 | "xaxis": { 1205 | "show": true 1206 | }, 1207 | "yaxes": [ 1208 | { 1209 | "format": "bytes", 1210 | "label": null, 1211 | "logBase": 1, 1212 | "max": null, 1213 | "min": 0, 1214 | "show": true 1215 | }, 1216 | { 1217 | "format": "short", 1218 | "label": null, 1219 | "logBase": 1, 1220 | "max": null, 1221 | "min": null, 1222 | "show": false 1223 | } 1224 | ] 1225 | } 1226 | ], 1227 | "title": "Network" 1228 | } 1229 | ], 1230 | "time": { 1231 | "from": "now-15m", 1232 | "to": "now" 1233 | }, 1234 | "timepicker": { 1235 | "refresh_intervals": [ 1236 | "5s", 1237 | "10s", 1238 | "30s", 1239 | "1m", 1240 | "5m", 1241 | "15m", 1242 | "30m", 1243 | "1h", 1244 | "2h", 1245 | "1d" 1246 | ], 1247 | "time_options": [ 1248 | "5m", 1249 | "15m", 1250 | "1h", 1251 | "6h", 1252 | "12h", 1253 | "24h", 1254 | "2d", 1255 | "7d", 1256 | "30d" 1257 | ] 1258 | }, 1259 | "templating": { 1260 | "list": [] 1261 | }, 1262 | "annotations": { 1263 | "list": [] 1264 | }, 1265 | "refresh": "10s", 1266 | "schemaVersion": 12, 1267 | "version": 8, 1268 | "links": [], 1269 | "gnetId": null 1270 | } -------------------------------------------------------------------------------- /dockprom/grafana/provisioning/dashboards/nginx_container.json: -------------------------------------------------------------------------------- 1 | { 2 | "id": null, 3 | "title": "Nginx", 4 | "description": "Nginx exporter metrics", 5 | "tags": [ 6 | "nginx" 7 | ], 8 | "style": "dark", 9 | "timezone": "browser", 10 | "editable": true, 11 | "hideControls": false, 12 | "sharedCrosshair": true, 13 | "rows": [ 14 | { 15 | "collapse": false, 16 | "editable": true, 17 | "height": "250px", 18 | "panels": [ 19 | { 20 | "aliasColors": {}, 21 | "bars": false, 22 | "datasource": "Prometheus", 23 | "decimals": 2, 24 | "editable": true, 25 | "error": false, 26 | "fill": 1, 27 | "grid": { 28 | "threshold1": null, 29 | "threshold1Color": "rgba(216, 200, 27, 0.27)", 30 | "threshold2": null, 31 | "threshold2Color": "rgba(234, 112, 112, 0.22)" 32 | }, 33 | "id": 3, 34 | "isNew": true, 35 | "legend": { 36 | "alignAsTable": true, 37 | "avg": true, 38 | "current": true, 39 | "max": true, 40 | "min": true, 41 | "rightSide": true, 42 | "show": true, 43 | "total": false, 44 | "values": true 45 | }, 46 | "lines": true, 47 | "linewidth": 2, 48 | "links": [], 49 | "nullPointMode": "connected", 50 | "percentage": false, 51 | "pointradius": 5, 52 | "points": false, 53 | "renderer": "flot", 54 | "seriesOverrides": [], 55 | "span": 12, 56 | "stack": false, 57 | "steppedLine": false, 58 | "targets": [ 59 | { 60 | "expr": "sum(irate(nginx_connections_processed_total{stage=\"any\"}[5m])) by (stage)", 61 | "hide": false, 62 | "interval": "", 63 | "intervalFactor": 10, 64 | "legendFormat": "requests", 65 | "metric": "", 66 | "refId": "B", 67 | "step": 10 68 | } 69 | ], 70 | "timeFrom": null, 71 | "timeShift": null, 72 | "title": "Requests/sec", 73 | "tooltip": { 74 | "msResolution": false, 75 | "shared": true, 76 | "sort": 0, 77 | "value_type": "cumulative" 78 | }, 79 | "type": "graph", 80 | "xaxis": { 81 | "show": true 82 | }, 83 | "yaxes": [ 84 | { 85 | "format": "short", 86 | "label": null, 87 | "logBase": 1, 88 | "max": null, 89 | "min": 0, 90 | "show": true 91 | }, 92 | { 93 | "format": "short", 94 | "label": null, 95 | "logBase": 1, 96 | "max": null, 97 | "min": null, 98 | "show": true 99 | } 100 | ] 101 | }, 102 | { 103 | "aliasColors": {}, 104 | "bars": false, 105 | "datasource": "Prometheus", 106 | "decimals": 2, 107 | "editable": true, 108 | "error": false, 109 | "fill": 1, 110 | "grid": { 111 | "threshold1": null, 112 | "threshold1Color": "rgba(216, 200, 27, 0.27)", 113 | "threshold2": null, 114 | "threshold2Color": "rgba(234, 112, 112, 0.22)" 115 | }, 116 | "id": 2, 117 | "isNew": true, 118 | "legend": { 119 | "alignAsTable": true, 120 | "avg": true, 121 | "current": true, 122 | "max": true, 123 | "min": true, 124 | "rightSide": true, 125 | "show": true, 126 | "total": false, 127 | "values": true 128 | }, 129 | "lines": true, 130 | "linewidth": 2, 131 | "links": [], 132 | "nullPointMode": "connected", 133 | "percentage": false, 134 | "pointradius": 5, 135 | "points": false, 136 | "renderer": "flot", 137 | "seriesOverrides": [], 138 | "span": 12, 139 | "stack": false, 140 | "steppedLine": false, 141 | "targets": [ 142 | { 143 | "expr": "sum(nginx_connections_current) by (state)", 144 | "interval": "", 145 | "intervalFactor": 2, 146 | "legendFormat": "{{state}}", 147 | "metric": "", 148 | "refId": "A", 149 | "step": 2 150 | } 151 | ], 152 | "timeFrom": null, 153 | "timeShift": null, 154 | "title": "Connections", 155 | "tooltip": { 156 | "msResolution": false, 157 | "shared": true, 158 | "sort": 0, 159 | "value_type": "cumulative" 160 | }, 161 | "type": "graph", 162 | "xaxis": { 163 | "show": true 164 | }, 165 | "yaxes": [ 166 | { 167 | "format": "short", 168 | "label": null, 169 | "logBase": 1, 170 | "max": null, 171 | "min": 0, 172 | "show": true 173 | }, 174 | { 175 | "format": "short", 176 | "label": null, 177 | "logBase": 1, 178 | "max": null, 179 | "min": null, 180 | "show": true 181 | } 182 | ] 183 | }, 184 | { 185 | "aliasColors": {}, 186 | "bars": false, 187 | "datasource": "Prometheus", 188 | "decimals": 2, 189 | "editable": true, 190 | "error": false, 191 | "fill": 1, 192 | "grid": { 193 | "threshold1": null, 194 | "threshold1Color": "rgba(216, 200, 27, 0.27)", 195 | "threshold2": null, 196 | "threshold2Color": "rgba(234, 112, 112, 0.22)" 197 | }, 198 | "id": 1, 199 | "isNew": true, 200 | "legend": { 201 | "alignAsTable": true, 202 | "avg": true, 203 | "current": true, 204 | "max": true, 205 | "min": true, 206 | "rightSide": true, 207 | "show": true, 208 | "total": false, 209 | "values": true 210 | }, 211 | "lines": true, 212 | "linewidth": 2, 213 | "links": [], 214 | "nullPointMode": "connected", 215 | "percentage": false, 216 | "pointradius": 5, 217 | "points": false, 218 | "renderer": "flot", 219 | "seriesOverrides": [], 220 | "span": 12, 221 | "stack": false, 222 | "steppedLine": false, 223 | "targets": [ 224 | { 225 | "expr": "sum(irate(nginx_connections_processed_total{stage!=\"any\"}[5m])) by (stage)", 226 | "hide": false, 227 | "interval": "", 228 | "intervalFactor": 10, 229 | "legendFormat": "{{stage}}", 230 | "metric": "", 231 | "refId": "B", 232 | "step": 10 233 | } 234 | ], 235 | "timeFrom": null, 236 | "timeShift": null, 237 | "title": "Connections rate", 238 | "tooltip": { 239 | "msResolution": false, 240 | "shared": true, 241 | "sort": 0, 242 | "value_type": "cumulative" 243 | }, 244 | "type": "graph", 245 | "xaxis": { 246 | "show": true 247 | }, 248 | "yaxes": [ 249 | { 250 | "format": "short", 251 | "label": null, 252 | "logBase": 1, 253 | "max": null, 254 | "min": 0, 255 | "show": true 256 | }, 257 | { 258 | "format": "short", 259 | "label": null, 260 | "logBase": 1, 261 | "max": null, 262 | "min": null, 263 | "show": true 264 | } 265 | ] 266 | } 267 | ], 268 | "title": "Nginx exporter metrics" 269 | }, 270 | { 271 | "collapse": false, 272 | "editable": true, 273 | "height": "250px", 274 | "panels": [ 275 | { 276 | "aliasColors": {}, 277 | "bars": false, 278 | "datasource": null, 279 | "editable": true, 280 | "error": false, 281 | "fill": 1, 282 | "grid": { 283 | "threshold1": null, 284 | "threshold1Color": "rgba(216, 200, 27, 0.27)", 285 | "threshold2": null, 286 | "threshold2Color": "rgba(234, 112, 112, 0.22)" 287 | }, 288 | "id": 4, 289 | "isNew": true, 290 | "legend": { 291 | "alignAsTable": true, 292 | "avg": true, 293 | "current": true, 294 | "max": true, 295 | "min": true, 296 | "rightSide": true, 297 | "show": true, 298 | "total": false, 299 | "values": true 300 | }, 301 | "lines": true, 302 | "linewidth": 2, 303 | "links": [], 304 | "nullPointMode": "connected", 305 | "percentage": false, 306 | "pointradius": 5, 307 | "points": false, 308 | "renderer": "flot", 309 | "seriesOverrides": [], 310 | "span": 12, 311 | "stack": false, 312 | "steppedLine": false, 313 | "targets": [ 314 | { 315 | "expr": "sum(rate(container_cpu_usage_seconds_total{name=~\"nginx\"}[5m])) / count(node_cpu_seconds_total{mode=\"system\"}) * 100", 316 | "intervalFactor": 2, 317 | "legendFormat": "nginx", 318 | "refId": "A", 319 | "step": 2 320 | } 321 | ], 322 | "timeFrom": null, 323 | "timeShift": null, 324 | "title": "CPU usage", 325 | "tooltip": { 326 | "msResolution": false, 327 | "shared": true, 328 | "sort": 0, 329 | "value_type": "cumulative" 330 | }, 331 | "type": "graph", 332 | "xaxis": { 333 | "show": true 334 | }, 335 | "yaxes": [ 336 | { 337 | "format": "short", 338 | "label": null, 339 | "logBase": 1, 340 | "max": null, 341 | "min": null, 342 | "show": true 343 | }, 344 | { 345 | "format": "short", 346 | "label": null, 347 | "logBase": 1, 348 | "max": null, 349 | "min": null, 350 | "show": true 351 | } 352 | ] 353 | } 354 | ], 355 | "title": "Nginx container metrics" 356 | } 357 | ], 358 | "time": { 359 | "from": "now-15m", 360 | "to": "now" 361 | }, 362 | "timepicker": { 363 | "refresh_intervals": [ 364 | "5s", 365 | "10s", 366 | "30s", 367 | "1m", 368 | "5m", 369 | "15m", 370 | "30m", 371 | "1h", 372 | "2h", 373 | "1d" 374 | ], 375 | "time_options": [ 376 | "5m", 377 | "15m", 378 | "1h", 379 | "6h", 380 | "12h", 381 | "24h", 382 | "2d", 383 | "7d", 384 | "30d" 385 | ] 386 | }, 387 | "templating": { 388 | "list": [] 389 | }, 390 | "annotations": { 391 | "list": [] 392 | }, 393 | "refresh": "10s", 394 | "schemaVersion": 12, 395 | "version": 9, 396 | "links": [], 397 | "gnetId": null 398 | } -------------------------------------------------------------------------------- /dockprom/grafana/provisioning/datasources/datasource.yml: -------------------------------------------------------------------------------- 1 | apiVersion: 1 2 | 3 | datasources: 4 | - name: Prometheus 5 | type: prometheus 6 | access: proxy 7 | orgId: 1 8 | url: http://prometheus:9090 9 | basicAuth: false 10 | isDefault: true 11 | editable: true -------------------------------------------------------------------------------- /dockprom/prometheus/alert.rules: -------------------------------------------------------------------------------- 1 | groups: 2 | - name: targets 3 | rules: 4 | - alert: monitor_service_down 5 | expr: up == 0 6 | for: 30s 7 | labels: 8 | severity: critical 9 | annotations: 10 | summary: "Monitor service non-operational" 11 | description: "Service {{ $labels.instance }} is down." 12 | 13 | - name: host 14 | rules: 15 | - alert: high_cpu_load 16 | expr: node_load1 > 1.5 17 | for: 30s 18 | labels: 19 | severity: warning 20 | annotations: 21 | summary: "Server under high load" 22 | description: "Docker host is under high load, the avg load 1m is at {{ $value}}. Reported by instance {{ $labels.instance }} of job {{ $labels.job }}." 23 | 24 | - alert: high_memory_load 25 | expr: (sum(node_memory_MemTotal_bytes) - sum(node_memory_MemFree_bytes + node_memory_Buffers_bytes + node_memory_Cached_bytes) ) / sum(node_memory_MemTotal_bytes) * 100 > 85 26 | for: 30s 27 | labels: 28 | severity: warning 29 | annotations: 30 | summary: "Server memory is almost full" 31 | description: "Docker host memory usage is {{ humanize $value}}%. Reported by instance {{ $labels.instance }} of job {{ $labels.job }}." 32 | 33 | - alert: high_storage_load 34 | expr: (node_filesystem_size_bytes{fstype="aufs"} - node_filesystem_free_bytes{fstype="aufs"}) / node_filesystem_size_bytes{fstype="aufs"} * 100 > 85 35 | for: 30s 36 | labels: 37 | severity: warning 38 | annotations: 39 | summary: "Server storage is almost full" 40 | description: "Docker host storage usage is {{ humanize $value}}%. Reported by instance {{ $labels.instance }} of job {{ $labels.job }}." 41 | 42 | - name: containers 43 | rules: 44 | - alert: jenkins_down 45 | expr: absent(container_memory_usage_bytes{name="jenkins"}) 46 | for: 30s 47 | labels: 48 | severity: critical 49 | annotations: 50 | summary: "Jenkins down" 51 | description: "Jenkins container is down for more than 30 seconds." 52 | 53 | - alert: jenkins_high_cpu 54 | expr: sum(rate(container_cpu_usage_seconds_total{name="jenkins"}[1m])) / count(node_cpu_seconds_total{mode="system"}) * 100 > 10 55 | for: 30s 56 | labels: 57 | severity: warning 58 | annotations: 59 | summary: "Jenkins high CPU usage" 60 | description: "Jenkins CPU usage is {{ humanize $value}}%." 61 | 62 | - alert: jenkins_high_memory 63 | expr: sum(container_memory_usage_bytes{name="jenkins"}) > 1200000000 64 | for: 30s 65 | labels: 66 | severity: warning 67 | annotations: 68 | summary: "Jenkins high memory usage" 69 | description: "Jenkins memory consumption is at {{ humanize $value}}." 70 | 71 | -------------------------------------------------------------------------------- /dockprom/prometheus/prometheus.yml: -------------------------------------------------------------------------------- 1 | global: 2 | scrape_interval: 15s 3 | evaluation_interval: 15s 4 | 5 | # Attach these labels to any time series or alerts when communicating with 6 | # external systems (federation, remote storage, Alertmanager). 7 | external_labels: 8 | monitor: 'docker-host-alpha' 9 | 10 | # Load and evaluate rules in this file every 'evaluation_interval' seconds. 11 | rule_files: 12 | - "alert.rules" 13 | 14 | # A scrape configuration containing exactly one endpoint to scrape. 15 | scrape_configs: 16 | - job_name: 'nodeexporter' 17 | scrape_interval: 5s 18 | static_configs: 19 | - targets: ['nodeexporter:9100'] 20 | 21 | - job_name: 'cadvisor' 22 | scrape_interval: 5s 23 | static_configs: 24 | - targets: ['cadvisor:8080'] 25 | 26 | - job_name: 'prometheus' 27 | scrape_interval: 10s 28 | static_configs: 29 | - targets: ['localhost:9090'] 30 | 31 | - job_name: 'pushgateway' 32 | scrape_interval: 10s 33 | honor_labels: true 34 | static_configs: 35 | - targets: ['pushgateway:9091'] 36 | 37 | alerting: 38 | alertmanagers: 39 | - scheme: http 40 | static_configs: 41 | - targets: 42 | - 'alertmanager:9093' 43 | 44 | # - job_name: 'nginx' 45 | # scrape_interval: 10s 46 | # static_configs: 47 | # - targets: ['nginxexporter:9113'] 48 | 49 | # - job_name: 'aspnetcore' 50 | # scrape_interval: 10s 51 | # static_configs: 52 | # - targets: ['eventlog-proxy:5000', 'eventlog:5000'] 53 | -------------------------------------------------------------------------------- /duplicati/compose.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | duplicati: 3 | image: linuxserver/duplicati 4 | container_name: duplicati 5 | environment: 6 | - PUID=1000 # Change to PUID=0 for running Duplicati as root 7 | - PGID=1000 # Change to PUID=0 for running Duplicati as root 8 | - TZ=America/Chicago # Change this 9 | - CLI_ARGS= #optional # Additional CLI_args can be specified from https://duplicati.readthedocs.io/en/latest/07-other-command-line-utilities/ 10 | volumes: 11 | - /home/pi/duplicati/config:/config 12 | - /mnt/nfs-share/Duplicati_backups:/backups # Duplicati Backups are stored here 13 | - /mnt/nfs-source:/source:ro # Directories to backup (Remove ro while restoring backups) 14 | ports: 15 | - 8200:8200 16 | restart: unless-stopped -------------------------------------------------------------------------------- /gitea/compose.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | server: 3 | image: gitea/gitea:1.15.0 4 | container_name: gitea_app 5 | environment: 6 | - USER_UID=1000 7 | - USER_GID=1000 8 | - GITEA__database__DB_TYPE=mysql 9 | - GITEA__database__HOST=db:3306 10 | - GITEA__database__NAME=gitea 11 | - GITEA__database__USER=gitea 12 | - GITEA__database__PASSWD= # Change this 13 | restart: always 14 | networks: 15 | - gitea 16 | volumes: 17 | - /mnt/nfs-share/Gitea/data:/data 18 | - /etc/timezone:/etc/timezone:ro 19 | - /etc/localtime:/etc/localtime:ro 20 | ports: 21 | - "3000:3000" # Change the ports before ':' if already allocated 22 | - "22:22" 23 | depends_on: 24 | - db 25 | 26 | db: 27 | image: arm64v8/mariadb:10.5 28 | container_name: gitea_db 29 | restart: always 30 | environment: 31 | - MYSQL_ROOT_PASSWORD= # Change this 32 | - MYSQL_USER=gitea 33 | - MYSQL_PASSWORD= # Change this 34 | - MYSQL_DATABASE=gitea 35 | networks: 36 | - gitea 37 | volumes: 38 | - ./mysql:/var/lib/mysql 39 | 40 | networks: 41 | gitea: 42 | external: false 43 | -------------------------------------------------------------------------------- /gotify/compose.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | gotify: 3 | image: gotify/server-arm64 4 | container_name: gotify_server 5 | ports: 6 | - 80:80 # Change this 7 | environment: 8 | - TZ=America/Chicago # Change this 9 | - GOTIFY_DEFAULTUSER_NAME=admin # Change this 10 | - GOTIFY_DEFAULTUSER_PASS=admin # Change this 11 | volumes: 12 | - "/home/pi/gotify/data:/app/data" # Change this 13 | -------------------------------------------------------------------------------- /grocy/compose.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | grocy: 3 | image: linuxserver/grocy 4 | container_name: grocy 5 | environment: 6 | - PUID=1000 7 | - PGID=1000 8 | - TZ=Amrerica/Chicago # Change this 9 | volumes: 10 | - /home/pi/home-server/grocy/config:/config # Change this 11 | ports: 12 | - 80:80 # Change this 13 | restart: unless-stopped -------------------------------------------------------------------------------- /guacamole/compose.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | guacd: 3 | container_name: guacamole_guacd 4 | image: guacamole/guacd 5 | networks: 6 | guacnetwork_compose: 7 | restart: always 8 | volumes: 9 | - ./drive:/drive:rw 10 | - ./record:/record:rw 11 | 12 | postgres: 13 | container_name: guacamole_db 14 | environment: 15 | PGDATA: /var/lib/postgresql/data/guacamole 16 | POSTGRES_DB: guacamole_db 17 | POSTGRES_PASSWORD: guacamole_password # Change this 18 | POSTGRES_USER: guacamole_user 19 | image: postgres:13.4 20 | networks: 21 | guacnetwork_compose: 22 | restart: always 23 | volumes: 24 | - ./init:/docker-entrypoint-initdb.d:ro 25 | - ./data:/var/lib/postgresql/data:rw 26 | 27 | guacamole: 28 | container_name: guacamole_app 29 | depends_on: 30 | - guacd 31 | - postgres 32 | environment: 33 | GUACD_HOSTNAME: guacd 34 | POSTGRES_DATABASE: guacamole_db 35 | POSTGRES_HOSTNAME: postgres 36 | POSTGRES_PASSWORD: guacamole_password # Change this 37 | POSTGRES_USER: guacamole_user 38 | image: guacamole/guacamole 39 | links: 40 | - guacd 41 | networks: 42 | guacnetwork_compose: 43 | ports: 44 | - 9628:8080/tcp # Guacamole is on :8080/guacamole, not /. 45 | restart: always 46 | 47 | networks: 48 | guacnetwork_compose: 49 | driver: bridge -------------------------------------------------------------------------------- /home-assistant/compose.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | homeassistant: 3 | image: linuxserver/homeassistant 4 | container_name: homeassistant 5 | network_mode: host # Required for device discovery 6 | environment: 7 | - PUID=1000 8 | - PGID=1000 9 | - TZ=America/Chicago 10 | volumes: 11 | - /home/pi/home-assistant:/config # Config directory 12 | - /mnt/nfs-share:/extstorage # External storage mounted directly for some integrations 13 | #ports: 14 | # - 8123:8123 #optional 15 | #devices: 16 | # - /path/to/device:/path/to/device 17 | restart: unless-stopped 18 | -------------------------------------------------------------------------------- /homer/assets/additionnal-page.yml.dist: -------------------------------------------------------------------------------- 1 | --- 2 | # Additionnal page configuration 3 | 4 | # Additionnal configurations are loaded using its file name, minus the extension, as an anchor (https://#). 5 | # `config.yml` is still used as a base configuration, and all values here will overwrite it, so you don't have to re-defined everything 6 | 7 | 8 | subtitle: "this is another dashboard page" 9 | 10 | # This overwrites message config. Setting it to empty to remove message from this page and keep it only in the main one: 11 | message: ~ 12 | 13 | # as we want to include a differente link here (so we can get back to home page), we need to replicate all links or they will be revome when overwriting the links field: 14 | links: 15 | - name: "Home" 16 | icon: "fas fa-home" 17 | url: "#" 18 | - name: "Contribute" 19 | icon: "fab fa-github" 20 | url: "https://github.com/bastienwirtz/homer" 21 | target: "_blank" # optional html a tag target attribute 22 | - name: "Wiki" 23 | icon: "fas fa-book" 24 | url: "https://www.wikipedia.org/" 25 | 26 | services: 27 | - name: "More applications on another page!" 28 | icon: "fas fa-cloud" 29 | items: 30 | - name: "Awesome app on a second page!" 31 | logo: "assets/tools/sample.png" 32 | subtitle: "Bookmark example" 33 | tag: "app" 34 | url: "https://www.reddit.com/r/selfhosted/" 35 | target: "_blank" 36 | -------------------------------------------------------------------------------- /homer/assets/config.yml: -------------------------------------------------------------------------------- 1 | --- 2 | # Homepage configuration 3 | # See https://fontawesome.com/icons for icons options 4 | 5 | title: "Home Laboratory" 6 | subtitle: "Digital Abode" 7 | logo: "assets/icons/owl_logo.png" 8 | icon: "assests/icons/icon-any.png" # Optional icon 9 | 10 | header: true 11 | footer: false 12 | 13 | # Optional theme customization 14 | # Nord theme inspired from - https://github.com/thermatico/homer-nord 15 | theme: default 16 | colors: 17 | light: 18 | highlight-primary: "#3367d6" 19 | highlight-secondary: "#4285f4" 20 | highlight-hover: "#5a95f5" 21 | background: "#f5f5f5" 22 | card-background: "#ffffff" 23 | text: "#363636" 24 | text-header: "#ffffff" 25 | text-title: "#303030" 26 | text-subtitle: "#424242" 27 | card-shadow: rgba(0, 0, 0, 0.1) 28 | link-hover: "#363636" 29 | dark: 30 | highlight-primary: "#2E3440" 31 | highlight-secondary: "#4C566A" 32 | highlight-hover: "#81A1C1" 33 | background: "#3B4252" 34 | card-background: "#2E3440" 35 | text: "#D8DEE9" 36 | text-header: "#D8DEE9" 37 | text-title: "#81A1C1" 38 | text-subtitle: "#81A1C1" 39 | card-shadow: rgba(0, 0, 0, 0.4) 40 | link-hover: "#BF616A" 41 | 42 | # colors from Nord theme: https://github.com/arcticicestudio/nord 43 | 44 | # Optional message 45 | #message: 46 | #url: https://b4bz.io 47 | #style: "is-dark" # See https://bulma.io/documentation/components/message/#colors for styling options. 48 | #title: "Demo !" 49 | #icon: "fa fa-grin" 50 | #content: "This is a dummy homepage demo.
Find more information on github.com/bastienwirtz/homer" 51 | 52 | # Optional navbar 53 | # links: [] # Allows for navbar (dark mode, layout, and search) without any links 54 | links: 55 | - name: "Edit Config" 56 | icon: "far fa-edit" 57 | url: "https://vscode.example.com/?folder=/config/homer" 58 | target: "_blank" # optional html a tag target attribute 59 | 60 | # Services 61 | # First level array represent a group. 62 | # Leave only a "items" key if not using group (group name, icon & tagstyle are optional, section separation will not be displayed). 63 | # Place the icons in "assets/tools/" 64 | services: 65 | - name: "Cloud" 66 | icon: "fas fa-cloud" 67 | items: 68 | - name: "Bitwarden" 69 | logo: "assets/tools/bitwarden.png" 70 | subtitle: "Password Manager" 71 | tag: "passwords" 72 | url: "https://passwords.example.com/" 73 | target: "_blank" # optional html a tag target attribute 74 | - name: "Nextcloud" 75 | logo: "assets/tools/nextcloud.png" 76 | subtitle: "Cloud Solution" 77 | tag: "cloud" 78 | url: "https://cloud.example.com/" 79 | target: "_blank" 80 | 81 | - name: "Notes" 82 | icon: "fas fa-sticky-note" 83 | items: 84 | - name: "Joplin" 85 | logo: "assets/tools/joplin.png" 86 | subtitle: "Markdown-based Note Editor" 87 | tag: "notes" 88 | url: "https://notes.example.com/" 89 | target: "_blank" 90 | - name: "Vikunja" 91 | logo: "assets/tools/vikunja.png" 92 | subtitle: "Feature-rich Task Management" 93 | tag: "project management" 94 | url: "https://tasks.example.com/" 95 | target: "_blank" 96 | - name: "Mealie" 97 | logo: "assets/tools/mealie.png" 98 | subtitle: "Pantry and Recipe Management" 99 | tag: "recipes" 100 | url: "https://recipes.example.com/" 101 | target: "_blank" 102 | 103 | - name: "Repositories" 104 | icon: "fas fa-archive" 105 | items: 106 | - name: "Paperless" 107 | logo: "assets/tools/paperless.png" 108 | subtitle: "Documents Repository" 109 | tag: "documents" 110 | url: "https://paperless.example.com/" 111 | target: "_blank" 112 | - name: "Calibre-Web" 113 | logo: "assets/tools/calibre-web.png" 114 | subtitle: "Ebook Library" 115 | tag: "ebooks" 116 | url: "https://ebooks.example.com/" 117 | target: "_blank" 118 | - name: "Wallabag" 119 | logo: "assets/tools/wallabag.png" 120 | subtitle: "Read-It-Later Archiver" 121 | tag: "read-it-later" 122 | url: "https://wallabag.example.com/" 123 | target: "_blank" 124 | - name: "Gitea" 125 | logo: "assets/tools/gitea.png" 126 | subtitle: "Self-hosted Git Instance" 127 | tag: "github" 128 | url: "https://gitea.example.com/" 129 | target: "_blank" 130 | 131 | - name: "Media" 132 | icon: "fas fa-film" 133 | items: 134 | - name: "Plex" 135 | logo: "assets/tools/plex.png" 136 | subtitle: "Media Center" 137 | tag: "video" 138 | url: "https://plex.example.com/" 139 | target: "_blank" 140 | - name: "PodGrab" 141 | logo: "assets/tools/podcasts-n.png" 142 | subtitle: "Podcasts Downloader" 143 | tag: "podcast" 144 | url: "https://podcasts.example.com/" 145 | target: "_blank" 146 | - name: "PhotoPrism: Abhilesh" 147 | logo: "assets/tools/photoprism.png" 148 | subtitle: "Photo Management and Gallery" 149 | tag: "photo" 150 | url: "https://photos.example.com/" 151 | target: "_blank" 152 | - name: "PhotoPrism: Nadya" 153 | logo: "assets/tools/photoprism.png" 154 | subtitle: "Photo Management and Gallery" 155 | tag: "photo" 156 | url: "https://gallery.example.com/" 157 | target: "_blank" 158 | 159 | - name: "Indexers" 160 | icon: "fas fa-magic" 161 | items: 162 | - name: "Overseerr" 163 | logo: "assets/tools/overseerr.png" 164 | subtitle: "Media Requester" 165 | tag: "media-requests" 166 | url: "https://flix.example.com/" 167 | target: "_blank" 168 | - name: "Prowlarr" 169 | logo: "assets/tools/prowlarr.png" 170 | subtitle: "Indexers Management" 171 | tag: "indexer manager" 172 | url: "https://prowlarr.example.com/" 173 | target: "_blank" 174 | - name: "Sonarr" 175 | logo: "assets/tools/sonarr.png" 176 | subtitle: "TV Show Collection Manager" 177 | tag: "tv-shows manager" 178 | url: "https://sonarr.example.com/" 179 | target: "_blank" 180 | - name: "Radarr" 181 | logo: "assets/tools/radarr.png" 182 | subtitle: "Movie Collection Manager" 183 | tag: "movies manager" 184 | url: "https://radarr.example.com/" 185 | target: "_blank" 186 | - name: "Readarr" 187 | logo: "assets/tools/readarr.png" 188 | subtitle: "Books Collection Manager" 189 | tag: "books manager" 190 | url: "https://readarr.example.com/" 191 | target: "_blank" 192 | - name: "Lidarr" 193 | logo: "assets/tools/lidarr.png" 194 | subtitle: "Music Collection Manager" 195 | tag: "music manager" 196 | url: "https://lidarr.example.com/" 197 | target: "_blank" 198 | - name: "Bazarr" 199 | logo: "assets/tools/bazarr.png" 200 | subtitle: "Subtitles Collection Manager" 201 | tag: "subtitles manager" 202 | url: "https://bazarr.example.com/" 203 | target: "_blank" 204 | 205 | - name: "Download" 206 | icon: "fas fa-download" 207 | items: 208 | - name: "Tube Archivist" 209 | logo: "assets/tools/youtubedl.png" 210 | subtitle: "YouTube Downloader" 211 | tag: "YouTube-DL" 212 | url: "https://ytdl.example.com/" 213 | target: "_blank" 214 | - name: "Flood WebUI" 215 | logo: "assets/tools/flood.png" 216 | subtitle: "Beautiful WebUI for torrent clients" 217 | tag: "torrent webui" 218 | url: "https://flood.example.com/" 219 | target: "_blank" 220 | - name: "Transmission" 221 | logo: "assets/tools/transmission.png" 222 | subtitle: "Torrent Downloader" 223 | tag: "torrent" 224 | url: "https://transmission.example.com/" 225 | target: "_blank" 226 | - name: "Transmission-VPN" 227 | logo: "assets/tools/transmission.png" 228 | subtitle: "Torrent Downloader behind a VPN" 229 | tag: "torrent-vpn" 230 | url: "https://torrents.example.com/" 231 | target: "_blank" 232 | - name: "Qbittorrent-VPN" 233 | logo: "assets/tools/qbittorrent.png" 234 | subtitle: "Torrent Downloader behind a VPN" 235 | tag: "torrent-vpn" 236 | url: "https://qbittorrent.example.com/" 237 | target: "_blank" 238 | 239 | 240 | - name: "Tools" 241 | icon: "fas fa-tools" 242 | items: 243 | - name: "AdGuard Home" 244 | logo: "assets/tools/adguard.png" 245 | subtitle: "DNS-level Ad Blocking" 246 | tag: "adblocker" 247 | url: "https://adblock.example.com/" 248 | target: "_blank" 249 | - name: "Authelia" 250 | logo: "assets/tools/authelia.png" 251 | subtitle: "SSO Authentication" 252 | tag: "authentication" 253 | url: "https://auth.example.com/" 254 | target: "_blank" 255 | - name: "Home Assistant" 256 | logo: "assets/tools/home-assist.png" 257 | subtitle: "Smart Home Management" 258 | tag: "home" 259 | url: "https://home.example.com/" 260 | target: "_blank" 261 | - name: "Gotify" 262 | logo: "assets/tools/gotify.png" 263 | subtitle: "Push Notifications Server" 264 | tag: "push notifications" 265 | url: "https://gotify.example.com/" 266 | target: "_blank" 267 | - name: "Code-Server" 268 | logo: "assets/tools/vscode.png" 269 | subtitle: "Remote VS Code Editor" 270 | tag: "code editor" 271 | url: "https://vscode.example.com/" 272 | target: "_blank" 273 | 274 | - name: "Server" 275 | icon: "fas fa-server" 276 | items: 277 | - name: "Grafana" 278 | logo: "assets/tools/grafana.png" 279 | subtitle: "Server Monitoring Dashboards" 280 | tag: "monitoring" 281 | url: "https://status.example.com/" 282 | target: "_blank" 283 | - name: "Uptime-Kuma" 284 | logo: "assets/tools/uptime.png" 285 | subtitle: "Webservices monitor" 286 | tag: "uptime monitor" 287 | url: "https://uptime.example.com/" 288 | target: "_blank" 289 | - name: "Portainer" 290 | logo: "assets/tools/portainer.png" 291 | subtitle: "Docker Container Management" 292 | tag: "docker" 293 | url: "https://portainer.example.com/" 294 | - name: "Nginx Proxy Manager" 295 | logo: "assets/tools/nginx-proxy.png" 296 | subtitle: "Reverse Proxy Manager" 297 | tag: "reverse-proxy" 298 | url: "https://npm.example.com/" 299 | target: "_blank" 300 | -------------------------------------------------------------------------------- /homer/assets/config.yml.dist: -------------------------------------------------------------------------------- 1 | --- 2 | # Homepage configuration 3 | # See https://fontawesome.com/icons for icons options 4 | 5 | title: "Demo dashboard" 6 | subtitle: "Homer" 7 | logo: "logo.png" 8 | # icon: "fas fa-skull-crossbones" # Optional icon 9 | 10 | header: true 11 | footer: '

Created with ❤️ with bulma, vuejs & font awesome // Fork me on

' # set false if you want to hide it. 12 | 13 | # Optional theme customization 14 | theme: default 15 | colors: 16 | light: 17 | highlight-primary: "#3367d6" 18 | highlight-secondary: "#4285f4" 19 | highlight-hover: "#5a95f5" 20 | background: "#f5f5f5" 21 | card-background: "#ffffff" 22 | text: "#363636" 23 | text-header: "#ffffff" 24 | text-title: "#303030" 25 | text-subtitle: "#424242" 26 | card-shadow: rgba(0, 0, 0, 0.1) 27 | link-hover: "#363636" 28 | dark: 29 | highlight-primary: "#3367d6" 30 | highlight-secondary: "#4285f4" 31 | highlight-hover: "#5a95f5" 32 | background: "#131313" 33 | card-background: "#2b2b2b" 34 | text: "#eaeaea" 35 | text-header: "#ffffff" 36 | text-title: "#fafafa" 37 | text-subtitle: "#f5f5f5" 38 | card-shadow: rgba(0, 0, 0, 0.4) 39 | link-hover: "#ffdd57" 40 | 41 | # Optional message 42 | message: 43 | #url: https://b4bz.io 44 | style: "is-dark" # See https://bulma.io/documentation/components/message/#colors for styling options. 45 | title: "Demo !" 46 | icon: "fa fa-grin" 47 | content: "This is a dummy homepage demo.
Find more information on github.com/bastienwirtz/homer" 48 | 49 | # Optional navbar 50 | # links: [] # Allows for navbar (dark mode, layout, and search) without any links 51 | links: 52 | - name: "Contribute" 53 | icon: "fab fa-github" 54 | url: "https://github.com/bastienwirtz/homer" 55 | target: "_blank" # optional html a tag target attribute 56 | - name: "Wiki" 57 | icon: "fas fa-book" 58 | url: "https://www.wikipedia.org/" 59 | # this will link to a second homer page that will load config from additionnal-page.yml and keep default config values as in config.yml file 60 | # see url field and assets/additionnal-page.yml.dist used in this example: 61 | - name: "another page!" 62 | icon: "fas fa-file-alt" 63 | url: "#additionnal-page" 64 | 65 | # Services 66 | # First level array represent a group. 67 | # Leave only a "items" key if not using group (group name, icon & tagstyle are optional, section separation will not be displayed). 68 | services: 69 | - name: "Applications" 70 | icon: "fas fa-cloud" 71 | items: 72 | - name: "Awesome app" 73 | logo: "assets/tools/sample.png" 74 | subtitle: "Bookmark example" 75 | tag: "app" 76 | url: "https://www.reddit.com/r/selfhosted/" 77 | target: "_blank" # optional html a tag target attribute 78 | - name: "Another one" 79 | logo: "assets/tools/sample2.png" 80 | subtitle: "Another application" 81 | tag: "app" 82 | url: "#" 83 | -------------------------------------------------------------------------------- /homer/assets/config.yml.dist.sample-sui: -------------------------------------------------------------------------------- 1 | --- 2 | # Homepage configuration 3 | # See https://fontawesome.com/icons for icons options 4 | 5 | title: "Hello beautiful!" 6 | subtitle: "App dashboard" 7 | logo: false 8 | # icon: "fas fa-skull-crossbones" Optional icon 9 | 10 | header: true 11 | 12 | # Optional theme customization 13 | theme: sui 14 | colors: 15 | light: 16 | highlight-primary: transparent 17 | highlight-secondary: transparent 18 | highlight-hover: "#4a4a4a" 19 | text-subtitle: "#424242" 20 | dark: 21 | background: "#2B2C56" 22 | highlight-primary: transparent 23 | highlight-secondary: transparent 24 | highlight-hover: "#200b35" 25 | text-subtitle: "#6375e8" 26 | 27 | # Optional navbar 28 | # links: [] # Allows for navbar (dark mode, layout, and search) without any links 29 | links: [] 30 | 31 | # Services 32 | # First level array represent a group. 33 | # Leave only a "items" key if not using group (group name, icon & tagstyle are optional, section separation will not be displayed). 34 | services: 35 | - name: "APPLICATIONS" 36 | items: 37 | - name: "Jenkins" 38 | logo: "assets/tools/jenkins.png" 39 | subtitle: "Continuous integration server" 40 | url: "https://jenkins.io/" 41 | - name: "RabbitMQ Management" 42 | logo: "assets/tools/rabbitmq.png" 43 | subtitle: "Manage & monitor RabbitMQ server" 44 | # Optional tagstyle 45 | # Same styling options as the optional message. 46 | tagstyle: "is-success" 47 | url: "https://www.rabbitmq.com/" 48 | - name: "M/Monit" 49 | logo: "assets/tools/monit.png" 50 | subtitle: "Monitor & manage all monit enabled hosts" 51 | url: "https://mmonit.com/monit/" 52 | - name: "Grafana" 53 | logo: "assets/tools/grafana.png" 54 | subtitle: "Metric analytics & dashboards" 55 | url: "https://grafana.com/" 56 | - name: "Kibana" 57 | logo: "assets/tools/elastic.png" 58 | subtitle: "Explore & visualize logs" 59 | url: "https://www.elastic.co/products/kibana" 60 | - name: "Website monitoring" 61 | logo: "assets/tools/pingdom.png" 62 | subtitle: "Pingdom public reports overview" 63 | tag: "CI" 64 | url: "https://www.pingdom.com/" 65 | -------------------------------------------------------------------------------- /homer/assets/custom.css.sample: -------------------------------------------------------------------------------- 1 | @charset "UTF-8"; 2 | 3 | /* Custom card colors */ 4 | /* Use with `class:` property of services in config.yml */ 5 | body #app .card.green { 6 | background-color: #006600; 7 | color: #00ff00; 8 | } 9 | -------------------------------------------------------------------------------- /homer/assets/icons/favicon-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abhilesh/self-hosted_docker_setups/399387d1fe599a26f6748b0462620aa752f78687/homer/assets/icons/favicon-16x16.png -------------------------------------------------------------------------------- /homer/assets/icons/favicon-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abhilesh/self-hosted_docker_setups/399387d1fe599a26f6748b0462620aa752f78687/homer/assets/icons/favicon-32x32.png -------------------------------------------------------------------------------- /homer/assets/icons/icon-any.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abhilesh/self-hosted_docker_setups/399387d1fe599a26f6748b0462620aa752f78687/homer/assets/icons/icon-any.png -------------------------------------------------------------------------------- /homer/assets/icons/icon-any.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /homer/assets/icons/icon-maskable.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abhilesh/self-hosted_docker_setups/399387d1fe599a26f6748b0462620aa752f78687/homer/assets/icons/icon-maskable.png -------------------------------------------------------------------------------- /homer/assets/icons/safari-pinned-tab.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /homer/assets/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "icons": [ 3 | { 4 | "src": "./img/icons/android-chrome-192x192.png", 5 | "sizes": "192x192", 6 | "type": "image/png" 7 | }, 8 | { 9 | "src": "./img/icons/android-chrome-512x512.png", 10 | "sizes": "512x512", 11 | "type": "image/png" 12 | }, 13 | { 14 | "src": "./img/icons/android-chrome-maskable-192x192.png", 15 | "sizes": "192x192", 16 | "type": "image/png", 17 | "purpose": "maskable" 18 | }, 19 | { 20 | "src": "./img/icons/android-chrome-maskable-512x512.png", 21 | "sizes": "512x512", 22 | "type": "image/png", 23 | "purpose": "maskable" 24 | }, 25 | { 26 | "src": "./img/icons/apple-touch-icon-60x60.png", 27 | "sizes": "60x60", 28 | "type": "image/png" 29 | }, 30 | { 31 | "src": "./img/icons/apple-touch-icon-76x76.png", 32 | "sizes": "76x76", 33 | "type": "image/png" 34 | }, 35 | { 36 | "src": "./img/icons/apple-touch-icon-120x120.png", 37 | "sizes": "120x120", 38 | "type": "image/png" 39 | }, 40 | { 41 | "src": "./img/icons/apple-touch-icon-152x152.png", 42 | "sizes": "152x152", 43 | "type": "image/png" 44 | }, 45 | { 46 | "src": "./img/icons/apple-touch-icon-180x180.png", 47 | "sizes": "180x180", 48 | "type": "image/png" 49 | }, 50 | { 51 | "src": "./img/icons/apple-touch-icon.png", 52 | "sizes": "180x180", 53 | "type": "image/png" 54 | }, 55 | { 56 | "src": "./img/icons/favicon-16x16.png", 57 | "sizes": "16x16", 58 | "type": "image/png" 59 | }, 60 | { 61 | "src": "./img/icons/favicon-32x32.png", 62 | "sizes": "32x32", 63 | "type": "image/png" 64 | }, 65 | { 66 | "src": "./img/icons/msapplication-icon-144x144.png", 67 | "sizes": "144x144", 68 | "type": "image/png" 69 | }, 70 | { 71 | "src": "./img/icons/mstile-150x150.png", 72 | "sizes": "150x150", 73 | "type": "image/png" 74 | } 75 | ] 76 | } -------------------------------------------------------------------------------- /homer/assets/tools/adguard.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abhilesh/self-hosted_docker_setups/399387d1fe599a26f6748b0462620aa752f78687/homer/assets/tools/adguard.png -------------------------------------------------------------------------------- /homer/assets/tools/adminer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abhilesh/self-hosted_docker_setups/399387d1fe599a26f6748b0462620aa752f78687/homer/assets/tools/adminer.png -------------------------------------------------------------------------------- /homer/assets/tools/authelia.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abhilesh/self-hosted_docker_setups/399387d1fe599a26f6748b0462620aa752f78687/homer/assets/tools/authelia.png -------------------------------------------------------------------------------- /homer/assets/tools/bazarr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abhilesh/self-hosted_docker_setups/399387d1fe599a26f6748b0462620aa752f78687/homer/assets/tools/bazarr.png -------------------------------------------------------------------------------- /homer/assets/tools/bitwarden.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abhilesh/self-hosted_docker_setups/399387d1fe599a26f6748b0462620aa752f78687/homer/assets/tools/bitwarden.png -------------------------------------------------------------------------------- /homer/assets/tools/bookstack.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abhilesh/self-hosted_docker_setups/399387d1fe599a26f6748b0462620aa752f78687/homer/assets/tools/bookstack.png -------------------------------------------------------------------------------- /homer/assets/tools/calibre-web.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abhilesh/self-hosted_docker_setups/399387d1fe599a26f6748b0462620aa752f78687/homer/assets/tools/calibre-web.png -------------------------------------------------------------------------------- /homer/assets/tools/cloudcmd.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abhilesh/self-hosted_docker_setups/399387d1fe599a26f6748b0462620aa752f78687/homer/assets/tools/cloudcmd.png -------------------------------------------------------------------------------- /homer/assets/tools/cloudcmd2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abhilesh/self-hosted_docker_setups/399387d1fe599a26f6748b0462620aa752f78687/homer/assets/tools/cloudcmd2.png -------------------------------------------------------------------------------- /homer/assets/tools/dashmachine.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abhilesh/self-hosted_docker_setups/399387d1fe599a26f6748b0462620aa752f78687/homer/assets/tools/dashmachine.png -------------------------------------------------------------------------------- /homer/assets/tools/deemix2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abhilesh/self-hosted_docker_setups/399387d1fe599a26f6748b0462620aa752f78687/homer/assets/tools/deemix2.png -------------------------------------------------------------------------------- /homer/assets/tools/deezload.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abhilesh/self-hosted_docker_setups/399387d1fe599a26f6748b0462620aa752f78687/homer/assets/tools/deezload.png -------------------------------------------------------------------------------- /homer/assets/tools/drawio.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abhilesh/self-hosted_docker_setups/399387d1fe599a26f6748b0462620aa752f78687/homer/assets/tools/drawio.png -------------------------------------------------------------------------------- /homer/assets/tools/duplicati.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abhilesh/self-hosted_docker_setups/399387d1fe599a26f6748b0462620aa752f78687/homer/assets/tools/duplicati.png -------------------------------------------------------------------------------- /homer/assets/tools/example.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abhilesh/self-hosted_docker_setups/399387d1fe599a26f6748b0462620aa752f78687/homer/assets/tools/example.png -------------------------------------------------------------------------------- /homer/assets/tools/filebot1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abhilesh/self-hosted_docker_setups/399387d1fe599a26f6748b0462620aa752f78687/homer/assets/tools/filebot1.png -------------------------------------------------------------------------------- /homer/assets/tools/flood.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abhilesh/self-hosted_docker_setups/399387d1fe599a26f6748b0462620aa752f78687/homer/assets/tools/flood.png -------------------------------------------------------------------------------- /homer/assets/tools/freshrss.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abhilesh/self-hosted_docker_setups/399387d1fe599a26f6748b0462620aa752f78687/homer/assets/tools/freshrss.png -------------------------------------------------------------------------------- /homer/assets/tools/gitea.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abhilesh/self-hosted_docker_setups/399387d1fe599a26f6748b0462620aa752f78687/homer/assets/tools/gitea.png -------------------------------------------------------------------------------- /homer/assets/tools/glances.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abhilesh/self-hosted_docker_setups/399387d1fe599a26f6748b0462620aa752f78687/homer/assets/tools/glances.png -------------------------------------------------------------------------------- /homer/assets/tools/gotify.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abhilesh/self-hosted_docker_setups/399387d1fe599a26f6748b0462620aa752f78687/homer/assets/tools/gotify.png -------------------------------------------------------------------------------- /homer/assets/tools/grafana.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abhilesh/self-hosted_docker_setups/399387d1fe599a26f6748b0462620aa752f78687/homer/assets/tools/grafana.png -------------------------------------------------------------------------------- /homer/assets/tools/handbrake.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abhilesh/self-hosted_docker_setups/399387d1fe599a26f6748b0462620aa752f78687/homer/assets/tools/handbrake.png -------------------------------------------------------------------------------- /homer/assets/tools/home-assist.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abhilesh/self-hosted_docker_setups/399387d1fe599a26f6748b0462620aa752f78687/homer/assets/tools/home-assist.png -------------------------------------------------------------------------------- /homer/assets/tools/jackett.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abhilesh/self-hosted_docker_setups/399387d1fe599a26f6748b0462620aa752f78687/homer/assets/tools/jackett.png -------------------------------------------------------------------------------- /homer/assets/tools/jellyfin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abhilesh/self-hosted_docker_setups/399387d1fe599a26f6748b0462620aa752f78687/homer/assets/tools/jellyfin.png -------------------------------------------------------------------------------- /homer/assets/tools/joplin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abhilesh/self-hosted_docker_setups/399387d1fe599a26f6748b0462620aa752f78687/homer/assets/tools/joplin.png -------------------------------------------------------------------------------- /homer/assets/tools/kubernets.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abhilesh/self-hosted_docker_setups/399387d1fe599a26f6748b0462620aa752f78687/homer/assets/tools/kubernets.png -------------------------------------------------------------------------------- /homer/assets/tools/lidarr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abhilesh/self-hosted_docker_setups/399387d1fe599a26f6748b0462620aa752f78687/homer/assets/tools/lidarr.png -------------------------------------------------------------------------------- /homer/assets/tools/mealie.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abhilesh/self-hosted_docker_setups/399387d1fe599a26f6748b0462620aa752f78687/homer/assets/tools/mealie.png -------------------------------------------------------------------------------- /homer/assets/tools/mediainfo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abhilesh/self-hosted_docker_setups/399387d1fe599a26f6748b0462620aa752f78687/homer/assets/tools/mediainfo.png -------------------------------------------------------------------------------- /homer/assets/tools/netdata.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abhilesh/self-hosted_docker_setups/399387d1fe599a26f6748b0462620aa752f78687/homer/assets/tools/netdata.png -------------------------------------------------------------------------------- /homer/assets/tools/nextcloud.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abhilesh/self-hosted_docker_setups/399387d1fe599a26f6748b0462620aa752f78687/homer/assets/tools/nextcloud.png -------------------------------------------------------------------------------- /homer/assets/tools/nginx-proxy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abhilesh/self-hosted_docker_setups/399387d1fe599a26f6748b0462620aa752f78687/homer/assets/tools/nginx-proxy.png -------------------------------------------------------------------------------- /homer/assets/tools/npm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abhilesh/self-hosted_docker_setups/399387d1fe599a26f6748b0462620aa752f78687/homer/assets/tools/npm.png -------------------------------------------------------------------------------- /homer/assets/tools/ombi.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abhilesh/self-hosted_docker_setups/399387d1fe599a26f6748b0462620aa752f78687/homer/assets/tools/ombi.png -------------------------------------------------------------------------------- /homer/assets/tools/overleaf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abhilesh/self-hosted_docker_setups/399387d1fe599a26f6748b0462620aa752f78687/homer/assets/tools/overleaf.png -------------------------------------------------------------------------------- /homer/assets/tools/overseerr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abhilesh/self-hosted_docker_setups/399387d1fe599a26f6748b0462620aa752f78687/homer/assets/tools/overseerr.png -------------------------------------------------------------------------------- /homer/assets/tools/paperless.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abhilesh/self-hosted_docker_setups/399387d1fe599a26f6748b0462620aa752f78687/homer/assets/tools/paperless.png -------------------------------------------------------------------------------- /homer/assets/tools/pasta.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abhilesh/self-hosted_docker_setups/399387d1fe599a26f6748b0462620aa752f78687/homer/assets/tools/pasta.png -------------------------------------------------------------------------------- /homer/assets/tools/photoprism.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abhilesh/self-hosted_docker_setups/399387d1fe599a26f6748b0462620aa752f78687/homer/assets/tools/photoprism.png -------------------------------------------------------------------------------- /homer/assets/tools/pihole.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abhilesh/self-hosted_docker_setups/399387d1fe599a26f6748b0462620aa752f78687/homer/assets/tools/pihole.png -------------------------------------------------------------------------------- /homer/assets/tools/plex.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abhilesh/self-hosted_docker_setups/399387d1fe599a26f6748b0462620aa752f78687/homer/assets/tools/plex.png -------------------------------------------------------------------------------- /homer/assets/tools/podcasts-n.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abhilesh/self-hosted_docker_setups/399387d1fe599a26f6748b0462620aa752f78687/homer/assets/tools/podcasts-n.png -------------------------------------------------------------------------------- /homer/assets/tools/portainer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abhilesh/self-hosted_docker_setups/399387d1fe599a26f6748b0462620aa752f78687/homer/assets/tools/portainer.png -------------------------------------------------------------------------------- /homer/assets/tools/prowlarr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abhilesh/self-hosted_docker_setups/399387d1fe599a26f6748b0462620aa752f78687/homer/assets/tools/prowlarr.png -------------------------------------------------------------------------------- /homer/assets/tools/proxmox-sm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abhilesh/self-hosted_docker_setups/399387d1fe599a26f6748b0462620aa752f78687/homer/assets/tools/proxmox-sm.png -------------------------------------------------------------------------------- /homer/assets/tools/proxmox.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abhilesh/self-hosted_docker_setups/399387d1fe599a26f6748b0462620aa752f78687/homer/assets/tools/proxmox.png -------------------------------------------------------------------------------- /homer/assets/tools/pyload.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abhilesh/self-hosted_docker_setups/399387d1fe599a26f6748b0462620aa752f78687/homer/assets/tools/pyload.png -------------------------------------------------------------------------------- /homer/assets/tools/qbittorrent.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abhilesh/self-hosted_docker_setups/399387d1fe599a26f6748b0462620aa752f78687/homer/assets/tools/qbittorrent.png -------------------------------------------------------------------------------- /homer/assets/tools/qdirstat.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abhilesh/self-hosted_docker_setups/399387d1fe599a26f6748b0462620aa752f78687/homer/assets/tools/qdirstat.png -------------------------------------------------------------------------------- /homer/assets/tools/radarr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abhilesh/self-hosted_docker_setups/399387d1fe599a26f6748b0462620aa752f78687/homer/assets/tools/radarr.png -------------------------------------------------------------------------------- /homer/assets/tools/rancher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abhilesh/self-hosted_docker_setups/399387d1fe599a26f6748b0462620aa752f78687/homer/assets/tools/rancher.png -------------------------------------------------------------------------------- /homer/assets/tools/readarr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abhilesh/self-hosted_docker_setups/399387d1fe599a26f6748b0462620aa752f78687/homer/assets/tools/readarr.png -------------------------------------------------------------------------------- /homer/assets/tools/sample.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abhilesh/self-hosted_docker_setups/399387d1fe599a26f6748b0462620aa752f78687/homer/assets/tools/sample.png -------------------------------------------------------------------------------- /homer/assets/tools/sample2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abhilesh/self-hosted_docker_setups/399387d1fe599a26f6748b0462620aa752f78687/homer/assets/tools/sample2.png -------------------------------------------------------------------------------- /homer/assets/tools/snapdrop.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abhilesh/self-hosted_docker_setups/399387d1fe599a26f6748b0462620aa752f78687/homer/assets/tools/snapdrop.png -------------------------------------------------------------------------------- /homer/assets/tools/sonarr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abhilesh/self-hosted_docker_setups/399387d1fe599a26f6748b0462620aa752f78687/homer/assets/tools/sonarr.png -------------------------------------------------------------------------------- /homer/assets/tools/sonarr2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abhilesh/self-hosted_docker_setups/399387d1fe599a26f6748b0462620aa752f78687/homer/assets/tools/sonarr2.png -------------------------------------------------------------------------------- /homer/assets/tools/tautulli.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abhilesh/self-hosted_docker_setups/399387d1fe599a26f6748b0462620aa752f78687/homer/assets/tools/tautulli.png -------------------------------------------------------------------------------- /homer/assets/tools/traggo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abhilesh/self-hosted_docker_setups/399387d1fe599a26f6748b0462620aa752f78687/homer/assets/tools/traggo.png -------------------------------------------------------------------------------- /homer/assets/tools/traggo_small.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abhilesh/self-hosted_docker_setups/399387d1fe599a26f6748b0462620aa752f78687/homer/assets/tools/traggo_small.png -------------------------------------------------------------------------------- /homer/assets/tools/transmission.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abhilesh/self-hosted_docker_setups/399387d1fe599a26f6748b0462620aa752f78687/homer/assets/tools/transmission.png -------------------------------------------------------------------------------- /homer/assets/tools/tube-archivist-logo-dark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abhilesh/self-hosted_docker_setups/399387d1fe599a26f6748b0462620aa752f78687/homer/assets/tools/tube-archivist-logo-dark.png -------------------------------------------------------------------------------- /homer/assets/tools/unraid.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abhilesh/self-hosted_docker_setups/399387d1fe599a26f6748b0462620aa752f78687/homer/assets/tools/unraid.png -------------------------------------------------------------------------------- /homer/assets/tools/unraid2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abhilesh/self-hosted_docker_setups/399387d1fe599a26f6748b0462620aa752f78687/homer/assets/tools/unraid2.png -------------------------------------------------------------------------------- /homer/assets/tools/uptime.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abhilesh/self-hosted_docker_setups/399387d1fe599a26f6748b0462620aa752f78687/homer/assets/tools/uptime.png -------------------------------------------------------------------------------- /homer/assets/tools/vikunja.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abhilesh/self-hosted_docker_setups/399387d1fe599a26f6748b0462620aa752f78687/homer/assets/tools/vikunja.png -------------------------------------------------------------------------------- /homer/assets/tools/virtman.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abhilesh/self-hosted_docker_setups/399387d1fe599a26f6748b0462620aa752f78687/homer/assets/tools/virtman.png -------------------------------------------------------------------------------- /homer/assets/tools/vscode.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abhilesh/self-hosted_docker_setups/399387d1fe599a26f6748b0462620aa752f78687/homer/assets/tools/vscode.png -------------------------------------------------------------------------------- /homer/assets/tools/wallabag.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abhilesh/self-hosted_docker_setups/399387d1fe599a26f6748b0462620aa752f78687/homer/assets/tools/wallabag.png -------------------------------------------------------------------------------- /homer/assets/tools/wikijs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abhilesh/self-hosted_docker_setups/399387d1fe599a26f6748b0462620aa752f78687/homer/assets/tools/wikijs.png -------------------------------------------------------------------------------- /homer/assets/tools/wp2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abhilesh/self-hosted_docker_setups/399387d1fe599a26f6748b0462620aa752f78687/homer/assets/tools/wp2.png -------------------------------------------------------------------------------- /homer/assets/tools/youtube-dl.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abhilesh/self-hosted_docker_setups/399387d1fe599a26f6748b0462620aa752f78687/homer/assets/tools/youtube-dl.png -------------------------------------------------------------------------------- /homer/assets/tools/youtubedl.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abhilesh/self-hosted_docker_setups/399387d1fe599a26f6748b0462620aa752f78687/homer/assets/tools/youtubedl.png -------------------------------------------------------------------------------- /homer/compose.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | homer: 3 | image: b4bz/homer 4 | #To build from source, comment previous line and uncomment below 5 | #build: . 6 | container_name: homer 7 | volumes: 8 | - /home/pi/homer/assets/:/www/assets 9 | ports: 10 | - 8080:8080 11 | environment: 12 | - UID=1000 13 | - GID=1000 14 | restart: unless-stopped 15 | -------------------------------------------------------------------------------- /immich/.env: -------------------------------------------------------------------------------- 1 | # You can find documentation for all the supported env variables at https://immich.app/docs/install/environment-variables 2 | 3 | # The location where your uploaded files are stored 4 | UPLOAD_LOCATION=/mnt/nfs-share/Immich # Change this 5 | 6 | UID=1000 7 | GID=1000 8 | 9 | # The Immich version to use. You can pin this to a specific version like "v1.71.0" 10 | IMMICH_VERSION=release 11 | 12 | # Connection secrets for postgres and typesense. You should change these to random passwords 13 | DB_PASSWORD=postgres # Change this 14 | 15 | DISABLE_REVERSE_GEOCODING=false 16 | REVERSE_GEOCODING_PRECISION=1 17 | 18 | # The values below this line do not need to be changed 19 | ################################################################################### 20 | DB_HOSTNAME=immich_postgres 21 | DB_USERNAME=postgres 22 | DB_DATABASE_NAME=immich 23 | 24 | REDIS_HOSTNAME=immich_redis 25 | 26 | PUBLIC_LOGIN_PAGE_MESSAGE="Immich photo server" -------------------------------------------------------------------------------- /immich/compose.yaml: -------------------------------------------------------------------------------- 1 | # 2 | # WARNING: Make sure to use the docker-compose.yml of the current release: 3 | # 4 | # https://github.com/immich-app/immich/releases/latest/download/docker-compose.yml 5 | # 6 | # The compose file on main may not be compatible with the latest release. 7 | # 8 | 9 | name: immich 10 | 11 | services: 12 | immich-server: 13 | container_name: immich_server 14 | image: ghcr.io/immich-app/immich-server:${IMMICH_VERSION:-release} 15 | # extends: 16 | # file: hwaccel.transcoding.yml 17 | # service: cpu # set to one of [nvenc, quicksync, rkmpp, vaapi, vaapi-wsl] for accelerated transcoding 18 | volumes: 19 | # 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 20 | - ${UPLOAD_LOCATION}:/usr/src/app/upload 21 | - /etc/localtime:/etc/localtime:ro 22 | env_file: 23 | - .env 24 | ports: 25 | - 2283:3001 26 | depends_on: 27 | - redis 28 | - database 29 | restart: always 30 | healthcheck: 31 | disable: false 32 | 33 | immich-machine-learning: 34 | container_name: immich_machine_learning 35 | # For hardware acceleration, add one of -[armnn, cuda, openvino] to the image tag. 36 | # Example tag: ${IMMICH_VERSION:-release}-cuda 37 | image: ghcr.io/immich-app/immich-machine-learning:${IMMICH_VERSION:-release} 38 | # extends: # uncomment this section for hardware acceleration - see https://immich.app/docs/features/ml-hardware-acceleration 39 | # file: hwaccel.ml.yml 40 | # service: cpu # set to one of [armnn, cuda, openvino, openvino-wsl] for accelerated inference - use the `-wsl` version for WSL2 where applicable 41 | volumes: 42 | - model-cache:/cache 43 | env_file: 44 | - .env 45 | restart: always 46 | healthcheck: 47 | disable: false 48 | 49 | redis: 50 | container_name: immich_redis 51 | image: docker.io/redis:6.2-alpine@sha256:e3b17ba9479deec4b7d1eeec1548a253acc5374d68d3b27937fcfe4df8d18c7e 52 | healthcheck: 53 | test: redis-cli ping || exit 1 54 | restart: always 55 | 56 | database: 57 | container_name: immich_postgres 58 | image: docker.io/tensorchord/pgvecto-rs:pg14-v0.2.0@sha256:90724186f0a3517cf6914295b5ab410db9ce23190a2d9d0b9dd6463e3fa298f0 59 | environment: 60 | POSTGRES_PASSWORD: ${DB_PASSWORD} 61 | POSTGRES_USER: ${DB_USERNAME} 62 | POSTGRES_DB: ${DB_DATABASE_NAME} 63 | POSTGRES_INITDB_ARGS: '--data-checksums' 64 | volumes: 65 | # 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 66 | - ${DB_DATA_LOCATION}:/var/lib/postgresql/data 67 | healthcheck: 68 | test: pg_isready --dbname='${DB_DATABASE_NAME}' --username='${DB_USERNAME}' || exit 1; Chksum="$$(psql --dbname='${DB_DATABASE_NAME}' --username='${DB_USERNAME}' --tuples-only --no-align --command='SELECT COALESCE(SUM(checksum_failures), 0) FROM pg_stat_database')"; echo "checksum failure count is $$Chksum"; [ "$$Chksum" = '0' ] || exit 1 69 | interval: 5m 70 | start_interval: 30s 71 | start_period: 5m 72 | command: ["postgres", "-c", "shared_preload_libraries=vectors.so", "-c", 'search_path="$$user", public, vectors', "-c", "logging_collector=on", "-c", "max_wal_size=2GB", "-c", "shared_buffers=512MB", "-c", "wal_compression=on"] 73 | restart: always 74 | 75 | volumes: 76 | model-cache: 77 | -------------------------------------------------------------------------------- /joplin/compose.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | app: 3 | environment: 4 | - APP_BASE_URL=https://joplin.example.com # Change this 5 | - APP_PORT=22300 6 | - POSTGRES_PASSWORD=joplin 7 | - POSTGRES_DATABASE=joplin 8 | - POSTGRES_USER=joplin 9 | - POSTGRES_PORT=5432 10 | - POSTGRES_HOST=db 11 | - DB_CLIENT=pg 12 | restart: unless-stopped 13 | image: florider89/joplin-server:2.4.3-beta 14 | platform: linux/arm64 15 | ports: 16 | - "22300:22300" 17 | db: 18 | restart: unless-stopped 19 | image: postgres:13.1 20 | ports: 21 | - "5432:5432" 22 | volumes: 23 | - /home/pi/joplin-data:/var/lib/postgresql/data # Change this 24 | environment: 25 | - POSTGRES_PASSWORD=joplin 26 | - POSTGRES_USER=joplin 27 | - POSTGRES_DB=joplin 28 | -------------------------------------------------------------------------------- /mealie/compose.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | mealie: 3 | container_name: mealie 4 | image: hkotel/mealie:latest 5 | restart: always 6 | ports: 7 | - 80:80 # Change this 8 | environment: 9 | DB_TYPE: sqlite 10 | DEFAULT_EMAIL: # Change this 11 | DEFAULT_PASSWORD: # Change this 12 | TOKEN_TIME: 3 13 | TZ: America/Chicago # Change this 14 | volumes: 15 | - /mnt/nfs-share/Recipe_Book/data:/app/data # Change this 16 | -------------------------------------------------------------------------------- /nextcloud/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM nextcloud 2 | 3 | RUN set -ex; \ 4 | \ 5 | apt-get update; \ 6 | apt-get install -y --no-install-recommends \ 7 | ffmpeg \ 8 | libmagickcore-6.q16-6-extra && \ 9 | rm -rf /var/lib/apt/lists/*; 10 | 11 | ENV NEXTCLOUD_UPDATE=1 -------------------------------------------------------------------------------- /nextcloud/README.md: -------------------------------------------------------------------------------- 1 | The [official nextcloud docker image](https://github.com/nextcloud/docker) does not come with [`ffmpeg`](https://ffmpeg.org/) pre-installed, which is required for media transcoding and generating previews. You can install `ffmpeg` by running the following command: 2 | 3 | Replace CONTAINER_ID with the ID of the nextcloud container. 4 | 5 | ```bash 6 | docker exec -it CONTAINER_ID apt-get update && apt-get install -y ffmpeg 7 | ``` 8 | 9 | However, this command would need to be re-run everytime we pull a new nextcloud image. To persistently install `ffmpeg`, we create a custom Dockerfile that extends the official nextcloud image and installs `ffmpeg` [(docker-compose-ffmpeg.yml)](./docker-compose-ffmpeg.yml): 10 | 11 | To build the custom image, run: 12 | 13 | ```bash 14 | docker compose build 15 | 16 | docker compose up -d 17 | ``` 18 | 19 | To pull the latest nextcloud image for building the custom image, run: 20 | 21 | ```bash 22 | docker compose build --pull 23 | 24 | docker compose up -d 25 | ``` 26 | 27 | Some nextcloud workflows such as the [Automated media conversion](https://github.com/cwilby/nextcloud-workflow-media-converter?tab=readme-ov-file) run `ffmpeg` commands as a background process. If you are using such workflows, you may need to build the custom image for `cron` with `ffmpeg` installed. -------------------------------------------------------------------------------- /nextcloud/compose.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | db: 3 | image: arm64v8/mariadb:10.5 4 | container_name: nextcloud_db 5 | command: --transaction-isolation=READ-COMMITTED --binlog-format=ROW 6 | restart: always 7 | volumes: 8 | - type: volume 9 | source: db 10 | target: /var/lib/mysql 11 | environment: 12 | - MYSQL_ROOT_PASSWORD= # Change this 13 | - MYSQL_PASSWORD= # Change this 14 | - MYSQL_DATABASE=nextcloud 15 | - MYSQL_USER=nextcloud 16 | 17 | redis: 18 | image: redis:alpine 19 | container_name: nextcloud_redis 20 | command: redis-server --requirepass . # Change this 21 | restart: always 22 | 23 | app: 24 | image: nextcloud 25 | container_name: nextcloud_app 26 | ports: 27 | - target: 80 28 | published: 8088 # Serving on port 8088, change if you'd like a different port 29 | protocol: tcp 30 | volumes: 31 | - type: bind 32 | source: /mnt/nfs-share/Nextcloud 33 | target: /var/www/html # Change this to where you would like Nextcloud data (preferably external storage) 34 | environment: 35 | - MYSQL_HOST=db 36 | - MYSQL_PASSWORD= # Change this (same as defined in `db`) 37 | - MYSQL_DATABASE=nextcloud 38 | - MYSQL_USER=nextcloud 39 | - REDIS_HOST=redis 40 | - REDIS_HOST_PASSWORD= . # Change this (same as defined in `redis`) 41 | - NEXTCLOUD_ADMIN_USER=ncadmin # Change this 42 | - NEXTCLOUD_ADMIN_PASSWORD= # Change this 43 | - NEXTCLOUD_HOSTNAME=cloud.example.com # Change this 44 | - SMTP_HOST=smtp.gmail.com # Using gmail's smtp server for emails 45 | - SMTP_SECURE=tls 46 | - SMTP_PORT=587 47 | - SMTP_AUTHTYPE=LOGIN 48 | - SMTP_NAME= # Change this 49 | - SMTP_PASSWORD= # Change this 50 | - MAIL_FROM_ADDRESS= # Change this 51 | - MAIL_DOMAIN=gmail.com 52 | restart: always 53 | depends_on: 54 | - db 55 | - redis 56 | 57 | cron: 58 | image: nextcloud 59 | container_name: nextcloud_cron 60 | restart: always 61 | volumes: 62 | - type: bind 63 | source: /mnt/nfs-share/Nextcloud 64 | target: /var/www/html # Point to nextcloud data directory 65 | entrypoint: /cron.sh 66 | depends_on: 67 | - db 68 | - redis 69 | 70 | volumes: 71 | nextcloud: 72 | db: 73 | -------------------------------------------------------------------------------- /nextcloud/docker-compose-ffmpeg.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | db: 3 | image: arm64v8/mariadb:10.5 4 | container_name: nextcloud_db 5 | command: --transaction-isolation=READ-COMMITTED --binlog-format=ROW 6 | restart: always 7 | volumes: 8 | - type: volume 9 | source: db 10 | target: /var/lib/mysql 11 | environment: 12 | - MYSQL_ROOT_PASSWORD= # Change this 13 | - MYSQL_PASSWORD= # Change this 14 | - MYSQL_DATABASE=nextcloud 15 | - MYSQL_USER=nextcloud 16 | 17 | redis: 18 | image: redis:alpine 19 | container_name: nextcloud_redis 20 | command: redis-server --requirepass . # Change this 21 | restart: always 22 | 23 | app: 24 | build: 25 | context: . 26 | dockerfile: Dockerfile # Ensure dockerfile is in the same directory as the docker-compose file 27 | container_name: nextcloud_app 28 | ports: 29 | - target: 80 30 | published: 8088 # Serving on port 8088, change if you'd like a different port 31 | protocol: tcp 32 | volumes: 33 | - type: bind 34 | source: /mnt/nfs-share/Nextcloud 35 | target: /var/www/html # Change this to where you would like Nextcloud data (preferably external storage) 36 | environment: 37 | - MYSQL_HOST=db 38 | - MYSQL_PASSWORD= # Change this (same as defined in `db`) 39 | - MYSQL_DATABASE=nextcloud 40 | - MYSQL_USER=nextcloud 41 | - REDIS_HOST=redis 42 | - REDIS_HOST_PASSWORD= . # Change this (same as defined in `redis`) 43 | - NEXTCLOUD_ADMIN_USER=ncadmin # Change this 44 | - NEXTCLOUD_ADMIN_PASSWORD= # Change this 45 | - NEXTCLOUD_HOSTNAME=cloud.example.com # Change this 46 | - SMTP_HOST=smtp.gmail.com # Using gmail's smtp server for emails 47 | - SMTP_SECURE=tls 48 | - SMTP_PORT=587 49 | - SMTP_AUTHTYPE=LOGIN 50 | - SMTP_NAME= # Change this 51 | - SMTP_PASSWORD= # Change this 52 | - MAIL_FROM_ADDRESS= # Change this 53 | - MAIL_DOMAIN=gmail.com 54 | restart: always 55 | depends_on: 56 | - db 57 | - redis 58 | 59 | cron: 60 | build: 61 | context: . 62 | dockerfile: Dockerfile # Ensure dockerfile is in the same directory as the docker-compose file 63 | container_name: nextcloud_cron 64 | restart: always 65 | volumes: 66 | - type: bind 67 | source: /mnt/nfs-share/Nextcloud 68 | target: /var/www/html # Point to nextcloud data directory 69 | entrypoint: /cron.sh 70 | depends_on: 71 | - db 72 | - redis 73 | 74 | volumes: 75 | nextcloud: 76 | db: -------------------------------------------------------------------------------- /nginx-proxy-manager/compose.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | app: 3 | image: 'jc21/nginx-proxy-manager:latest' 4 | container_name: nginx_proxy_app 5 | ports: 6 | - '80:80' 7 | - '81:81' 8 | - '443:443' 9 | volumes: 10 | - ./config.json:/app/config/production.json 11 | - ./data:/data 12 | - ./letsencrypt:/etc/letsencrypt 13 | restart: always 14 | db: 15 | #image: 'yobasystems/alpine-mariadb:latest' # for armhf 16 | image: arm64v8/mariadb:10.5 17 | container_name: nginx_proxy_db 18 | environment: 19 | MYSQL_ROOT_PASSWORD: '' # Change this 20 | MYSQL_DATABASE: 'npm' 21 | MYSQL_USER: 'npm' 22 | MYSQL_PASSWORD: '' # Change this 23 | volumes: 24 | - ./data/mysql:/var/lib/mysql 25 | restart: always 26 | -------------------------------------------------------------------------------- /overseerr/compose.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | overseerr: 3 | image: sctx/overseerr:latest 4 | container_name: overseerr 5 | environment: 6 | - LOG_LEVEL=debug 7 | - TZ=America/Chicago # Change this 8 | ports: 9 | - 5055:5055 10 | volumes: 11 | - /home/pi/overseerr/config:/app/config 12 | restart: unless-stopped 13 | -------------------------------------------------------------------------------- /pairdrop/compose.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | pairdrop: 3 | image: lscr.io/linuxserver/pairdrop:latest 4 | container_name: pairdrop 5 | environment: 6 | - PUID=1000 7 | - PGID=1000 8 | - TZ=Etc/UTC # Change this 9 | - RATE_LIMIT=false # optional 10 | - WS_FALLBACK=false # optional 11 | - RTC_CONFIG= # optional 12 | - DEBUG_MODE=false # optional 13 | ports: 14 | - 3000:3000 # Change this 15 | restart: unless-stopped 16 | -------------------------------------------------------------------------------- /paperless-ng/compose.yaml: -------------------------------------------------------------------------------- 1 | # docker-compose file for running paperless from the Docker Hub. 2 | # This file contains everything paperless needs to run. 3 | # Paperless supports amd64, arm and arm64 hardware. 4 | # 5 | # All compose files of paperless configure paperless in the following way: 6 | # 7 | # - Paperless is (re)started on system boot, if it was running before shutdown. 8 | # - Docker volumes for storing data are managed by Docker. 9 | # - Folders for importing and exporting files are created in the same directory 10 | # as this file and mounted to the correct folders inside the container. 11 | # - Paperless listens on port 8000. 12 | # 13 | # SQLite is used as the database. The SQLite file is stored in the data volume. 14 | # 15 | # In addition to that, this docker-compose file adds the following optional 16 | # configurations: 17 | # 18 | # - Apache Tika and Gotenberg servers are started with paperless and paperless 19 | # is configured to use these services. These provide support for consuming 20 | # Office documents (Word, Excel, Power Point and their LibreOffice counter- 21 | # parts. 22 | # 23 | # To install and update paperless with this file, do the following: 24 | # 25 | # - Copy this file as 'docker-compose.yml' and the files 'docker-compose.env' 26 | # and '.env' into a folder. 27 | # - Run 'docker-compose pull'. 28 | # - Run 'docker-compose run --rm webserver createsuperuser' to create a user. 29 | # - Run 'docker-compose up -d'. 30 | # 31 | # For more extensive installation and update instructions, refer to the 32 | # documentation. 33 | 34 | services: 35 | broker: 36 | container_name: paperless_broker 37 | image: redis:6.0 38 | restart: unless-stopped 39 | 40 | webserver: 41 | container_name: paperless_webserver 42 | image: jonaswinkler/paperless-ng:latest 43 | restart: unless-stopped 44 | depends_on: 45 | - broker 46 | - gotenberg 47 | - tika 48 | ports: 49 | - 8000:8000 50 | healthcheck: 51 | test: ["CMD", "curl", "-f", "http://localhost:8000"] 52 | interval: 30s 53 | timeout: 10s 54 | retries: 5 55 | volumes: 56 | - /mnt/nfs-share/Paperless/data:/usr/src/paperless/data 57 | - /mnt/nfs-share/Paperless/media:/usr/src/paperless/media 58 | - /mnt/nfs-share/Paperless/export:/usr/src/paperless/export 59 | - /mnt/nfs-share/Paperless/consume:/usr/src/paperless/consume 60 | env_file: docker-compose.env 61 | environment: 62 | PAPERLESS_REDIS: redis://broker:6379 63 | PAPERLESS_TIKA_ENABLED: 1 64 | PAPERLESS_TIKA_GOTENBERG_ENDPOINT: http://gotenberg:3000 65 | PAPERLESS_TIKA_ENDPOINT: http://tika:9998 66 | 67 | gotenberg: 68 | container_name: paperless_gotenberg 69 | image: thecodingmachine/gotenberg 70 | restart: unless-stopped 71 | environment: 72 | DISABLE_GOOGLE_CHROME: 1 73 | 74 | tika: 75 | container_name: paperless_tika 76 | image: abhilesh7/apache-tika-arm:latest 77 | restart: unless-stopped 78 | 79 | volumes: 80 | data: 81 | media: 82 | 83 | -------------------------------------------------------------------------------- /paperless-ng/docker-compose.env: -------------------------------------------------------------------------------- 1 | # The UID and GID of the user used to run paperless in the container. Set this 2 | # to your UID and GID on the host so that you have write access to the 3 | # consumption directory. 4 | USERMAP_UID=1000 5 | USERMAP_GID=1000 6 | 7 | # Additional languages to install for text recognition, separated by a 8 | # whitespace. Note that this is 9 | # different from PAPERLESS_OCR_LANGUAGE (default=eng), which defines the 10 | # language used for OCR. 11 | # The container installs English, German, Italian, Spanish and French by 12 | # default. 13 | # See https://packages.debian.org/search?keywords=tesseract-ocr-&searchon=names&suite=buster 14 | # for available languages. 15 | #PAPERLESS_OCR_LANGUAGES=tur ces 16 | 17 | ############################################################################### 18 | # Paperless-specific settings # 19 | ############################################################################### 20 | 21 | # All settings defined in the paperless.conf.example can be used here. The 22 | # Docker setup does not use the configuration file. 23 | # A few commonly adjusted settings are provided below. 24 | 25 | # Adjust this key if you plan to make paperless available publicly. It should 26 | # be a very long sequence of random characters. You don't need to remember it. 27 | #PAPERLESS_SECRET_KEY=change-me 28 | 29 | # Use this variable to set a timezone for the Paperless Docker containers. If not specified, defaults to UTC. 30 | PAPERLESS_TIME_ZONE=America/Chicago 31 | 32 | # The default language to use for OCR. Set this to the language most of your 33 | # documents are written in. 34 | #PAPERLESS_OCR_LANGUAGE=eng 35 | 36 | # Paperless will only OCR the first page of the documents 37 | #PAPERLESS_OCR_PAGES=1 38 | 39 | # Configure Paperless to use only 2 workers and 1 thread 40 | PAPERLESS_TASK_WORKERS=2 41 | PAPERLESS_THREADS_PER_WORKER=1 42 | 43 | # Configure Paperless to save some memory on the webserver 44 | PAPERLESS_WEBSERVER_WORKERS=1 45 | 46 | #### Configure Tika and Gotenberg for parsing and converting "Office" documents (such as ".doc", ".xlsx" and ".odt") 47 | 48 | # Enable the Tika parser 49 | PAPERLESS_TIKA_ENABLED=1 50 | 51 | # Set the endpoint URL where Paperless can reach your Tika server 52 | PAPERLESS_TIKA_ENDPOINT="http://localhost:9998" 53 | 54 | # Set the endpoint URL where Paperless can reach your Gotenberg server 55 | PAPERLESS_TIKA_GOTENBERG_ENDPOINT="http://localhost:3000" -------------------------------------------------------------------------------- /photoprism/compose.yaml: -------------------------------------------------------------------------------- 1 | # Example Docker Compose config file for PhotoPrism (Raspberry Pi / ARM64) 2 | # 3 | # Documentation : https://docs.photoprism.org/getting-started/raspberry-pi/ 4 | # Docker Hub URL: https://hub.docker.com/r/photoprism/photoprism-arm64/ 5 | # 6 | # Please run behind a reverse proxy like Caddy, Traefik or Nginx if you need HTTPS / SSL support 7 | # e.g. when running PhotoPrism on a public server outside your home network. 8 | # 9 | # ------------------------------------------------------------------- 10 | # DOCKER COMPOSE COMMAND REFERENCE 11 | # ------------------------------------------------------------------- 12 | # Start | docker-compose up -d 13 | # Stop | docker-compose stop 14 | # Update | docker-compose pull 15 | # Logs | docker-compose logs --tail=25 -f 16 | # Terminal | docker-compose exec photoprism bash 17 | # Help | docker-compose exec photoprism photoprism help 18 | # Config | docker-compose exec photoprism photoprism config 19 | # Reset | docker-compose exec photoprism photoprism reset 20 | # Backup | docker-compose exec photoprism photoprism backup -a -i 21 | # Restore | docker-compose exec photoprism photoprism restore -a -i 22 | # Index | docker-compose exec photoprism photoprism index 23 | # Reindex | docker-compose exec photoprism photoprism index -a 24 | # Import | docker-compose exec photoprism photoprism import 25 | # ------------------------------------------------------------------- 26 | # Note: All commands may have to be prefixed with "sudo" when not running as root. 27 | # This will change the home directory "~" to "/root" in your configuration. 28 | 29 | services: 30 | photoprism: 31 | # Use photoprism/photoprism:preview instead for testing preview builds: 32 | image: photoprism/photoprism:latest 33 | container_name: photoprism_app 34 | # Only enable automatic restarts once your installation is properly 35 | # configured as it otherwise may get stuck in a restart loop: 36 | # https://docs.photoprism.org/getting-started/faq/#why-is-photoprism-getting-stuck-in-a-restart-loop 37 | restart: unless-stopped 38 | security_opt: 39 | - seccomp:unconfined 40 | - apparmor:unconfined 41 | ports: 42 | - 2342:2342 # [local port]:[container port] 43 | environment: 44 | PHOTOPRISM_ADMIN_PASSWORD: "" # PLEASE CHANGE: Your initial admin password (min 4 characters) 45 | PHOTOPRISM_ORIGINALS_LIMIT: 100 # File size limit for originals in MB (increase for high-res video) 46 | PHOTOPRISM_HTTP_COMPRESSION: "gzip" # Improves transfer speed and bandwidth utilization (none or gzip) 47 | PHOTOPRISM_WORKERS: 1 # Limits the number of indexing workers to reduce system load 48 | PHOTOPRISM_DEBUG: "false" # Run in debug mode (shows additional log messages) 49 | PHOTOPRISM_PUBLIC: "false" # No authentication required (disables password protection) 50 | PHOTOPRISM_READONLY: "false" # Don't modify originals directory (reduced functionality) 51 | PHOTOPRISM_EXPERIMENTAL: "false" # Enables experimental features 52 | PHOTOPRISM_DISABLE_WEBDAV: "false" # Disables built-in WebDAV server 53 | PHOTOPRISM_DISABLE_SETTINGS: "false" # Disables Settings in Web UI 54 | PHOTOPRISM_DISABLE_TENSORFLOW: "false" # Disables using TensorFlow for image classification 55 | PHOTOPRISM_DISABLE_FACES: "false" # Disables facial recognition 56 | PHOTOPRISM_DISABLE_CLASSIFICATION: "false" # Disables image classification 57 | PHOTOPRISM_DARKTABLE_PRESETS: "true" # Enables Darktable presets and disables concurrent RAW conversion 58 | # PHOTOPRISM_FFMPEG_ENCODER: "h264_v4l2m2m" # FFmpeg AVC encoder for video transcoding (default: libx264) 59 | # PHOTOPRISM_FFMPEG_BUFFERS: "64" # FFmpeg capture buffers (default: 32) 60 | PHOTOPRISM_DETECT_NSFW: "false" # Flag photos as private that MAY be offensive 61 | PHOTOPRISM_UPLOAD_NSFW: "true" # Allow uploads that MAY be offensive 62 | # PHOTOPRISM_DATABASE_DRIVER: "sqlite" # SQLite is an embedded database that doesn't require a server 63 | PHOTOPRISM_DATABASE_DRIVER: "mysql" # Use MariaDB (or MySQL) instead of SQLite for improved performance 64 | PHOTOPRISM_DATABASE_SERVER: "mariadb:3306" # MariaDB database server (hostname:port) 65 | PHOTOPRISM_DATABASE_NAME: "photoprism" # MariaDB database schema name 66 | PHOTOPRISM_DATABASE_USER: "photoprism" # MariaDB database user name 67 | PHOTOPRISM_DATABASE_PASSWORD: "" # MariaDB database user password 68 | PHOTOPRISM_SITE_URL: "http://localhost:2342/" # Public PhotoPrism URL 69 | PHOTOPRISM_SITE_TITLE: "PhotoPrism" 70 | PHOTOPRISM_SITE_CAPTION: "Browse Your Life" 71 | PHOTOPRISM_SITE_DESCRIPTION: "" 72 | PHOTOPRISM_SITE_AUTHOR: "" 73 | HOME: "/photoprism" 74 | # You may optionally set a user / group id using environment variables if your Docker version or NAS does not 75 | # support this natively (see next example): 76 | # UID: 1000 77 | # GID: 1000 78 | # UMASK: 0000 79 | # Uncomment and edit the following line to set a specific user / group id (native): 80 | user: "1000:1000" 81 | working_dir: "/photoprism" 82 | # For hardware AVC transcoding using the h264_v4l2m2m encoder: 83 | # devices: 84 | # - "/dev/video11:/dev/video11" 85 | volumes: 86 | # Your photo and video files ([local path]:[container path]): 87 | - "/mnt/Pictures:/photoprism/originals" # Change this 88 | # Multiple folders can be indexed by mounting them as sub-folders of /photoprism/originals: 89 | # - "/mnt/Family:/photoprism/originals/Family" # [folder_1]:/photoprism/originals/[folder_1] 90 | # - "/mnt/Friends:/photoprism/originals/Friends" # [folder_2]:/photoprism/originals/[folder_2] 91 | # Mounting an import folder is optional (see docs): 92 | # - "~/Import:/photoprism/import" 93 | # Permanent storage for settings, index & sidecar files (DON'T REMOVE): 94 | - "/mnt/nfs-share/PhotoPrism/storage:/photoprism/storage" # Change this 95 | - "/etc/localtime:/etc/localtime:ro" # Use host's localtime, mounted read-only 96 | - "/etc/timezone:/etc/timezone:ro" # Use host's timezone, mounted read-only 97 | 98 | mariadb: 99 | image: arm64v8/mariadb:10.6 100 | container_name: photoprism_db 101 | restart: unless-stopped 102 | security_opt: 103 | - seccomp:unconfined 104 | - apparmor:unconfined 105 | command: mysqld --transaction-isolation=READ-COMMITTED --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --max-connections=512 --innodb-rollback-on-timeout=OFF --innodb-lock-wait-timeout=50 106 | volumes: # Don't remove permanent storage for index database files! 107 | - "./database:/var/lib/mysql" 108 | - "/etc/localtime:/etc/localtime:ro" # Use host's localtime, mounted read-only 109 | - "/etc/timezone:/etc/timezone:ro" # Use host's timezone, mounted read-only 110 | environment: 111 | MYSQL_ROOT_PASSWORD: "" 112 | MYSQL_DATABASE: "photoprism" 113 | MYSQL_USER: "photoprism" 114 | MYSQL_PASSWORD: "" 115 | 116 | ## Ofelia Job Runner (required) 117 | ## see https://github.com/mcuadros/ofelia 118 | ofelia: 119 | restart: unless-stopped 120 | image: mcuadros/ofelia:latest 121 | container_name: photoprism_ofelia_curie 122 | volumes: 123 | - "/var/run/docker.sock:/var/run/docker.sock:ro" 124 | - "./jobs.ini:/etc/ofelia/config.ini" 125 | - "/etc/localtime:/etc/localtime:ro" # Use host's localtime, mounted read-only 126 | - "/etc/timezone:/etc/timezone:ro" # Use host's timezone, mounted read-only 127 | 128 | # Adding NFS volumes 129 | volumes: 130 | originals: 131 | driver: local 132 | driver_opts: 133 | type: nfs 134 | o: "addr=192.168.X.X,soft,rw,nfsvers=4" # Change IP to host connected to the NFS drives 135 | device: "192.168.X.X:/mnt/nfs-share/PhotoPrism/originals" # Change IP to host connected to the NFS drives 136 | storage: 137 | driver: local 138 | driver_opts: 139 | type: nfs 140 | o: "addr=192.168.X.X,soft,rw,nfsvers=4" # Change IP to host connected to the NFS drives 141 | device: "192.168.X.X:/mnt/nfs-share/PhotoPrism/storage" # Change IP to host connected to the NFS drives 142 | 143 | # Uncomment the following lines to upgrade automatically, whenever there is a new Docker image available: 144 | # 145 | # watchtower: 146 | # image: containrrr/watchtower 147 | # container_name: watchtower 148 | # restart: unless-stopped 149 | # environment: 150 | # WATCHTOWER_CLEANUP: "true" 151 | # WATCHTOWER_POLL_INTERVAL: 7200 # Checks for updates every two hours 152 | # volumes: 153 | # - "/var/run/docker.sock:/var/run/docker.sock" 154 | # - "~/.docker/config.json:/config.json" # Optional, for authentication if you have a Docker Hub account 155 | -------------------------------------------------------------------------------- /photoprism/jobs.ini: -------------------------------------------------------------------------------- 1 | # See https://github.com/mcuadros/ofelia/blob/master/docs/jobs.md for job settings! 2 | # 3 | # Cron expressions in "schedule" represent times using 6 space-separated fields: 4 | # 5 | # Field name | Mandatory? | Allowed values | Allowed special characters 6 | # ---------- | ---------- | -------------- | -------------------------- 7 | # Seconds | Yes | 0-59 | * / , - 8 | # Minutes | Yes | 0-59 | * / , - 9 | # Hours | Yes | 0-23 | * / , - 10 | # Day of month | Yes | 1-31 | * / , - ? 11 | # Month | Yes | 1-12 or JAN-DEC | * / , - 12 | # Day of week | Yes | 0-6 or SUN-SAT | * / , - ? 13 | 14 | # Uncomment to enable background indexing of files in your originals folder at 1am: 15 | # 16 | [job-exec "photoprism index"] 17 | schedule = 0 0 1 * * * 18 | container = photoprism_app 19 | command = photoprism index --cleanup 20 | no-overlap = true 21 | 22 | # Uncomment to automatically import every 2 hours: 23 | # 24 | # [job-exec "photoprism import"] 25 | # schedule = @every 2h 26 | # container = photoprism_app 27 | # command = photoprism import 28 | # no-overlap = true 29 | 30 | [job-exec "photoprism convert"] 31 | schedule = @daily 32 | container = photoprism_app 33 | command = photoprism convert 34 | no-overlap = true 35 | 36 | [job-exec "photoprism backup"] 37 | schedule = @daily 38 | container = photoprism_app 39 | command = photoprism backup -a -i -f /photoprism/storage/index-backup.sql 40 | no-overlap = true -------------------------------------------------------------------------------- /pihole/compose.yaml: -------------------------------------------------------------------------------- 1 | # More info at https://github.com/pi-hole/docker-pi-hole/ and https://docs.pi-hole.net/ 2 | services: 3 | pihole: 4 | container_name: pihole 5 | image: pihole/pihole:latest 6 | ports: 7 | - "192.168.X.X:53:53/tcp" # Change this 8 | - "192.168.X.X:53:53/udp" # Change this 9 | - "67:67/udp" 10 | - "8053:80/tcp" 11 | environment: 12 | TZ: 'America/Chicago' # Change this 13 | # WEBPASSWORD: 'set a secure password here or it will be random' 14 | # Volumes store your data between container upgrades 15 | volumes: 16 | - '/home/pi/pihole/etc-pihole:/etc/pihole/' 17 | - '/home/pi/pihole/etc-dnsmasq.d/:/etc/dnsmasq.d/' 18 | # Recommended but not required (DHCP needs NET_ADMIN) 19 | # https://github.com/pi-hole/docker-pi-hole#note-on-capabilities 20 | cap_add: 21 | - NET_ADMIN 22 | restart: unless-stopped 23 | -------------------------------------------------------------------------------- /plex/compose.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | plex: 3 | image: ghcr.io/linuxserver/plex 4 | container_name: plex 5 | network_mode: bridge 6 | environment: 7 | - PUID=1000 8 | - PGID=1000 9 | - VERSION=docker 10 | - TZ=America/Chicago # Change this 11 | - PLEX_CLAIM= # Optional 12 | ports: 13 | - 32400:32400 14 | - 1900:1900/udp 15 | - 3005:3005 16 | - 8324:8324 17 | - 32410:32410/udp 18 | - 32412:32412/udp 19 | - 32413:32413/udp 20 | - 32414:32414/udp 21 | - 32469:32469 22 | volumes: 23 | - /home/pi/plex:/config 24 | - /mnt/nfs-share/Plex_Library/TV Shows:/tv # TV directory 25 | - /mnt/nfs-share/Plex_Library/Movies:/movies # Movie directory 26 | - /mnt/nfs-share/Plex_Library/Documentaries:/documentaries # Documentary directory 27 | - /mnt/nfs-share/Plex_Library/Audiobooks:/audiobooks # Audiobook directory 28 | restart: unless-stopped -------------------------------------------------------------------------------- /podgrab/compose.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | podgrab: 3 | image: akhilrex/podgrab 4 | container_name: podgrab 5 | environment: 6 | - CHECK_FREQUENCY=240 7 | - PASSWORD= ## Uncomment to enable basic authentication, username = podgrab 8 | user: "1000:1000" 9 | volumes: 10 | - /mnt/nfs-share/PodGrab/config:/config 11 | - /mnt/nfs-share/PodGrab/data:/assets 12 | ports: 13 | - 8080:8080 14 | restart: unless-stopped 15 | -------------------------------------------------------------------------------- /snapdrop/compose.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | snapdrop: 3 | image: linuxserver/snapdrop 4 | container_name: snapdrop 5 | environment: 6 | - PUID=1000 7 | - PGID=1000 8 | - TZ=America/Chicago # Change this 9 | volumes: 10 | - /mnt/nfs-share/snapdrop/config:/config # Change this 11 | ports: 12 | - 80:80 # Change this (HTTP port) 13 | - 443:443 # Change this (HTTPS port) 14 | restart: unless-stopped 15 | -------------------------------------------------------------------------------- /surfshark/compose.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | surfshark: 3 | # Image from https://github.com/ilteoood/docker-surfshark 4 | image: ilteoood/docker-surfshark 5 | container_name: surfshark 6 | environment: 7 | # Get your credentials from https://my.surfshark.com/vpn/manual-setup/main 8 | - SURFSHARK_USER= # Change this 9 | - SURFSHARK_PASSWORD= # Change this 10 | # Get the closest location server from https://my.surfshark.com/vpn/manual-setup/main 11 | - SURFSHARK_COUNTRY=can # Change this 12 | - SURFSHARK_CITY=tor # Change this 13 | - CONNECTION_TYPE=udp 14 | - LAN_NETWORK=192.168.1.0/24 #Optional - Need to specify subnet to access containers WebUI 15 | cap_add: 16 | - NET_ADMIN 17 | devices: 18 | - /dev/net/tun 19 | ports: 20 | # We open the ports here, as this container will be the access point for the others 21 | # 192.168.1.XX = Host machine's LAN IP 22 | - 192.168.1.XX:9091:9091 # Transmission_VPN 23 | - 192.168.1.XX:3002:3002 # Flood 24 | - 192.168.1.XX:9696:9696 # Prowlarr 25 | - 192.168.1.XX:8989:8989 # Sonarr 26 | - 192.168.1.XX:7878:7878 # Radarr 27 | - 192.168.1.XX:8787:8787 # Readarr 28 | - 192.168.1.XX:8686:8686 # Lidarr 29 | - 192.168.1.XX:6767:6767 # Bazarr 30 | restart: unless-stopped 31 | dns: 32 | - 1.1.1.1 33 | 34 | # Container to test the external IP of the containers 35 | # Alternatively, the external IP can be found by running `curl ifconfig.me` from within the container 36 | #service_test: 37 | # image: byrnedo/alpine-curl 38 | # container_name: alpine 39 | # command: -L 'https://ipinfo.io' 40 | # depends_on: 41 | # - surfshark 42 | # network_mode: service:surfshark 43 | # restart: always 44 | 45 | 46 | transmission_vpn: 47 | image: linuxserver/transmission 48 | container_name: transmission_vpn 49 | environment: 50 | - PUID=1000 51 | - PGID=1000 52 | - TZ=America/Chicago 53 | - TRANSMISSION_WEB_HOME=/flood-for-transmission/ 54 | volumes: 55 | - /home/pi/surfshark/transmission/config:/config # Change this 56 | - /mnt/nfs-share/Transmission-VPN/Downloaded:/downloads # Change this 57 | - /mnt/nfs-share/Transmission-VPN/Incoming:/watch # Change this 58 | # We specify ports in the surfshark container 59 | #ports: 60 | #- 9091:9091 61 | network_mode: service:surfshark 62 | restart: unless-stopped 63 | 64 | flood: 65 | image: jesec/flood 66 | container_name: flood-ui 67 | command: --port 3002 --allowedpath /data/torrents 68 | environment: 69 | - PUID=1000 70 | - PGID=1000 71 | - TZ=America/Chicago 72 | volumes: 73 | - /home/pi/surfshark/flood/config:/config # Change this 74 | - /mnt/nfs-share/Arr_Library/torrents:/data/torrents # Change this 75 | # We specify ports in the surfshark container 76 | #ports: 77 | #- 3002:3002 78 | network_mode: service:surfshark 79 | restart: unless-stopped 80 | 81 | qbittorrent_vpn: 82 | image: linuxserver/qbittorrent 83 | container_name: qbittorrent_vpn 84 | environment: 85 | - PUID=1000 86 | - PGID=1000 87 | - TZ=America/Chicago 88 | - WEBUI_PORT=8090 89 | volumes: 90 | - /home/pi/surfshark/qbittorrent/config:/config # Change this 91 | - /mnt/nfs-share/Arr_Library/torrents:/data/torrents # Change this 92 | # We specify ports in the surfshark container 93 | #ports: 94 | #- 8090:8090 95 | network_mode: service:surfshark 96 | restart: unless-stopped 97 | 98 | prowlarr: 99 | image: linuxserver/prowlarr:develop 100 | container_name: prowlarr 101 | environment: 102 | - PUID=1000 103 | - PGID=1000 104 | - TZ=America/Chicago 105 | volumes: 106 | - /home/pi/surfshark/prowlarr:/config # Change this 107 | # We specify ports in the surfshark container 108 | #ports: 109 | #- 9696:9696 110 | network_mode: service:surfshark 111 | restart: unless-stopped 112 | 113 | sonarr: 114 | image: linuxserver/sonarr 115 | container_name: sonarr 116 | environment: 117 | - PUID=1000 118 | - PGID=1000 119 | - TZ=America/Chicago 120 | volumes: 121 | - /home/pi/surfshark/sonarr:/config # Change this 122 | - /mnt/nfs-share/Arr_Library:/data # Change this 123 | # We specify ports in the surfshark container 124 | #ports: 125 | #- 8989:8989 126 | network_mode: service:surfshark 127 | restart: unless-stopped 128 | 129 | radarr: 130 | image: linuxserver/radarr 131 | container_name: radarr 132 | environment: 133 | - PUID=1000 134 | - PGID=1000 135 | - TZ=America/Chicago 136 | volumes: 137 | - /home/pi/surfshark/radarr:/config # Change this 138 | - /mnt/nfs-share/Arr_Library:/data # Change this 139 | # We specify ports in the surfshark container 140 | #ports: 141 | #- 7878:7878 142 | network_mode: service:surfshark 143 | restart: unless-stopped 144 | 145 | readarr: 146 | image: linuxserver/readarr:nightly 147 | container_name: readarr 148 | environment: 149 | - PUID=1000 150 | - PGID=1000 151 | - TZ=America/Chicago 152 | volumes: 153 | - /home/pi/surfshark/readarr:/config # Change this 154 | - /mnt/nfs-share/Arr_Library:/data # Change this 155 | # We specify ports in the surfshark container 156 | #ports: 157 | #- 8787:8787 158 | network_mode: service:surfshark 159 | restart: unless-stopped 160 | 161 | lidarr: 162 | image: linuxserver/lidarr 163 | container_name: lidarr 164 | environment: 165 | - PUID=1000 166 | - PGID=1000 167 | - TZ=America/Chicago 168 | volumes: 169 | - /home/pi/surfshark/lidarr:/config # Change this 170 | - /mnt/nfs-share/Arr_Library:/data # Change this 171 | # We specify ports in the surfshark container 172 | #ports: 173 | #- 8686:8686 174 | network_mode: service:surfshark 175 | restart: unless-stopped 176 | 177 | bazarr: 178 | image: linuxserver/bazarr 179 | container_name: bazarr 180 | environment: 181 | - PUID=1000 182 | - PGID=1000 183 | - TZ=America/Chicago 184 | volumes: 185 | - /home/pi/surfshark/bazarr:/config # Change this 186 | - /mnt/nfs-share/Arr_Library:/data # Change this 187 | # We specify ports in the surfshark container 188 | #ports: 189 | #- 6767:6767 190 | network_mode: service:surfshark 191 | restart: unless-stopped 192 | -------------------------------------------------------------------------------- /traggo/compose.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | traggo: 3 | image: traggo/server:latest 4 | container_name: traggo 5 | ports: 6 | - 3030:3030 7 | environment: 8 | TRAGGO_DEFAULT_USER_NAME: "" 9 | TRAGGO_DEFAULT_USER_PASS: "" 10 | volumes: 11 | - ./traggodata:/opt/traggo/data 12 | -------------------------------------------------------------------------------- /tube-archivist/compose.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | tubearchivist: 3 | container_name: tubearchivist 4 | restart: unless-stopped 5 | image: bbilly1/tubearchivist:latest 6 | ports: 7 | - 8000:8000 8 | volumes: 9 | - /home/pi/volumes/tubearchivist/media:/youtube 10 | - /home/pi/volumes/tubearchivist/cache:/cache 11 | environment: 12 | - ES_URL=http://archivist-es:9200 13 | - REDIS_HOST=archivist-redis 14 | - HOST_UID=1000 15 | - HOST_GID=1000 16 | - TA_HOST=tubearchivist.local # set your host name (if you get Bad Request (400) error, change TA_HOST for your IP Address) 17 | - TA_USERNAME=tubearchivist # Change login username 18 | - TA_PASSWORD=secret # Change login password 19 | - ELASTIC_PASSWORD=verysecret # Change ElasticSearch password 20 | - TZ=America/New_York # set your time zone 21 | depends_on: 22 | - archivist-es 23 | - archivist-redis 24 | archivist-redis: 25 | image: redis/redis-stack-server 26 | container_name: archivist-redis 27 | restart: unless-stopped 28 | expose: 29 | - "6379" 30 | volumes: 31 | - /home/pi/volumes/tubearchivist/redis:/data 32 | depends_on: 33 | - archivist-es 34 | archivist-es: 35 | image: docker.elastic.co/elasticsearch/elasticsearch:8.9.0 36 | container_name: archivist-es 37 | restart: always 38 | environment: 39 | - "ELASTIC_PASSWORD=verysecret" # matching Elasticsearch password 40 | - "ES_JAVA_OPTS=-Xms512m -Xmx512m" 41 | - "xpack.security.enabled=true" 42 | - "discovery.type=single-node" 43 | - "path.repo=/usr/share/elasticsearch/data/snapshot" 44 | ulimits: 45 | memlock: 46 | soft: -1 47 | hard: -1 48 | volumes: 49 | - /home/pi/volumes/tubearchivist/es:/usr/share/elasticsearch/data # check for permission error when using bind mount, see readme 50 | expose: 51 | - "9200" 52 | volumes: 53 | media: # do not update this field 54 | cache: # do not update this field 55 | redis: # do not update this field 56 | es: # do not update this field 57 | -------------------------------------------------------------------------------- /uptime-kuma/compose.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | uptime-kuma: 3 | image: louislam/uptime-kuma 4 | container_name: uptime-kuma 5 | volumes: 6 | - ./uptime-kuma:/app/data 7 | ports: 8 | - 3001:3001 9 | dns: 192.168.X.X # IP address of router 10 | -------------------------------------------------------------------------------- /vaultwarden/compose.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | vaultwarden: 3 | image: vaultwarden/server:latest 4 | container_name: vaultwarden 5 | restart: always 6 | environment: 7 | - WEBSOCKET_ENABLED=true # Enable WebSocket notifications. 8 | volumes: 9 | - ./vw-data:/data 10 | ports: 11 | - 8080:80 # Change this -------------------------------------------------------------------------------- /vikunja/compose.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | api: 3 | image: vikunja/api 4 | container_name: vikunja_api 5 | environment: 6 | # For definitions of the following variables, goto - https://vikunja.io/docs/config-options/ 7 | VIKUNJA_DATABASE_HOST: 'db' 8 | VIKUNJA_DATABASE_PASSWORD: '' # Change this 9 | VIKUNJA_DATABASE_TYPE: 'mysql' 10 | VIKUNJA_DATABASE_USER: 'vikunja' 11 | VIKUNJA_DATABASE_DATABASE: 'vikunja' 12 | VIKUNJA_REDIS_ENABLED: 1 13 | VIKUNJA_REDIS_HOST: 'redis:6379' 14 | VIKUNJA_CACHE_ENABLED: 1 15 | VIKUNJA_CACHE_TYPE: 'redis' 16 | VIKUNJA_SERVICE_ROOTPATH: '/home/pi/vikunja' # Change this 17 | VIKUNJA_SERVICE_FRONTENDURL: 'https://vikunja.example.com' # Change this 18 | VIKUNJA_SERVICE_ENABLECALDAV: 'true' 19 | VIKUNJA_SERVICE_ENABLELINKSHARING: 'true' 20 | VIKUNJA_SERVICE_ENABLETASKATTACHMENTS: 'true' 21 | VIKUNJA_SERVICE_ENABLETASKCOMMENTS: 'true' 22 | VIKUNJA_SERVICE_TIMEZONE: 'America/Chicago' # Change this 23 | VIKUNJA_SERVICE_ENABLETOTP: 'true' 24 | VIKUNJA_SERVICE_ENABLEUSERDELETION: 'true' 25 | VIKUNJA_MAILER_ENABLED: 'true' 26 | VIKUNJA_MAILER_HOST: 'smtp.gmail.com' # Using gmail's smtp servers 27 | VIKUNJA_MAILER_PORT: 587 28 | VIKUNJA_MAILER_USERNAME: '' # Change this 29 | VIKUNJA_MAILER_PASSWORD: '' # Change this 30 | VIKUNJA_MAILER_FROMEMAIL: '' # Change this 31 | VIKUNJA_BACKGROUNDS_ENABLED: 'true' 32 | VIKUNJA_MIGRATION_TODOIST_ENABLE: 'true' # Enable todoist migrator to import from todoist 33 | VIKUNJA_MIGRATION_TODOIST_CLIENTID: '' # Change this 34 | VIKUNJA_MIGRATION_TODOIST_CLIENTSECRET: '' # Change this 35 | VIKUNJA_MIGRATION_TODOIST_REDIRECTURL: 'https://vikunja.example.com' # Should be the same as FRONTENDURL above 36 | volumes: 37 | - ./files:/app/vikunja/files 38 | depends_on: 39 | - db 40 | - redis 41 | restart: unless-stopped 42 | 43 | redis: 44 | image: redis 45 | container_name: vikunja_redis 46 | restart: unless-stopped 47 | 48 | db: 49 | image: mariadb:10 50 | container_name: vikunja_db 51 | command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci 52 | environment: 53 | MYSQL_ROOT_PASSWORD: '' # Change this 54 | MYSQL_USER: 'vikunja' 55 | MYSQL_PASSWORD: '' # Change this 56 | MYSQL_DATABASE: 'vikunja' 57 | volumes: 58 | - ./db:/var/lib/mysql 59 | restart: unless-stopped 60 | 61 | frontend: 62 | image: vikunja/frontend 63 | container_name: vikunja_frontend 64 | restart: unless-stopped 65 | 66 | proxy: 67 | image: nginx 68 | container_name: vikunja_proxy 69 | ports: 70 | - 80:80 # Change the number before : if you want vikunja on a different port 71 | volumes: 72 | - ./nginx.conf:/etc/nginx/conf.d/default.conf:ro 73 | depends_on: 74 | - api 75 | - frontend 76 | restart: unless-stopped 77 | -------------------------------------------------------------------------------- /vikunja/nginx.conf: -------------------------------------------------------------------------------- 1 | server { 2 | listen 80; 3 | 4 | location / { 5 | proxy_pass http://frontend:80; 6 | } 7 | 8 | location ~* ^/(api|dav|\.well-known)/ { 9 | proxy_pass http://api:3456; 10 | client_max_body_size 20M; 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /wallabag/compose.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | wallabag: 3 | image: abhilesh7/wallabag-arm 4 | container_name: wallabag_app 5 | environment: 6 | - MYSQL_ROOT_PASSWORD= # Change this 7 | - SYMFONY__ENV__DATABASE_DRIVER=pdo_mysql 8 | - SYMFONY__ENV__DATABASE_HOST=db 9 | - SYMFONY__ENV__DATABASE_PORT=3306 10 | - SYMFONY__ENV__DATABASE_NAME=wallabag 11 | - SYMFONY__ENV__DATABASE_USER=wallabag 12 | - SYMFONY__ENV__DATABASE_PASSWORD= # Change this 13 | - SYMFONY__ENV__DATABASE_CHARSET=utf8mb4 14 | - SYMFONY__ENV__MAILER_HOST=smtp.gmail.com # Using gmail's smtp server 15 | - SYMFONY__ENV__MAILER_USER= # Change this 16 | - SYMFONY__ENV__MAILER_PASSWORD= # Change this 17 | - SYMFONY__ENV__FROM_EMAIL= # Change this 18 | - SYMFONY__ENV__DOMAIN_NAME=https://wallabag.example.com # Change this 19 | - SYMFONY__ENV__SERVER_NAME="Your wallabag instance" 20 | # If using watchtower, uncomment the line below to disable automatic updates 21 | #labels: 22 | # - "com.centurylinklabs.watchtower.enable=false" 23 | ports: 24 | - 8543:80 # Serving on port '8543', can change to a different port 25 | volumes: 26 | - /opt/wallabag/images:/var/www/wallabag/web/assets/images 27 | healthcheck: 28 | test: ["CMD", "wget" ,"--no-verbose", "--tries=1", "--spider", "http://localhost"] 29 | interval: 1m 30 | timeout: 3s 31 | depends_on: 32 | - db 33 | - redis 34 | db: 35 | image: mariadb 36 | container_name: wallabag_db 37 | environment: 38 | - MYSQL_ROOT_PASSWORD= 39 | volumes: 40 | - /opt/wallabag/data:/var/lib/mysql 41 | healthcheck: 42 | test: ["CMD", "mysqladmin" ,"ping", "-h", "localhost"] 43 | interval: 20s 44 | timeout: 3s 45 | redis: 46 | image: redis:alpine 47 | container_name: wallabag_redis 48 | healthcheck: 49 | test: ["CMD", "redis-cli", "ping"] 50 | interval: 20s 51 | timeout: 3s 52 | 53 | -------------------------------------------------------------------------------- /watchtower/compose.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | watchtower: 3 | image: containrrr/watchtower:latest 4 | container_name: watchtower 5 | environment: 6 | TZ: America/Chicago # Change this 7 | WATCHTOWER_ROLLING_RESTART: 'true' 8 | #WATCHTOWER_MONITOR_ONLY: 'true' 9 | WATCHTOWER_SCHEDULE: '0 0 3 * * *' 10 | WATCHTOWER_CLEANUP: 'true' 11 | # Settings for email notifications 12 | #WATCHTOWER_NOTIFICATIONS: email 13 | #WATCHTOWER_NOTIFICATION_EMAIL_FROM: # Change this 14 | #WATCHTOWER_NOTIFICATION_EMAIL_TO: # Change this 15 | # you have to use a network alias here, if you use your own certificate 16 | #WATCHTOWER_NOTIFICATION_EMAIL_SERVER: smtp.gmail.com # Using gmail as SMTP server 17 | #WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PORT: 587 18 | #WATCHTOWER_NOTIFICATION_EMAIL_SERVER_USER: # Change this 19 | #WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PASSWORD: # Change this 20 | #WATCHTOWER_NOTIFICATION_EMAIL_DELAY: 2 21 | # Settings for gotify notifications 22 | WATCHTOWER_NOTIFICATIONS: gotify 23 | WATCHTOWER_NOTIFICATION_GOTIFY_URL: https://gotify.example.com # Change this to gotify address 24 | WATCHTOWER_NOTIFICATION_GOTIFY_TOKEN: # Get gotify client tokens from the gotify server 25 | volumes: 26 | - /var/run/docker.sock:/var/run/docker.sock 27 | restart: unless-stopped 28 | -------------------------------------------------------------------------------- /wireguard/README.md: -------------------------------------------------------------------------------- 1 | ### Setting up clients 2 | 3 | The number of clients to generate cryptographic keys for is configured with the `PEERS=` environmental variable. Configuration files for the clients will be located at `/home/pi/wireguard/config/` folder. Copy the `peer1/peer1.conf` file to your client and use that to establish the VPN tunnel. 4 | 5 | For mobile phone clients, a QR code can generated using the command - 6 | ``` bash 7 | docker exec -it wireguard /app/show-peer 8 | ``` 9 | 10 | ### Adding more clients 11 | Increment the `PEERS` environmental variable in the `docker-compose.yml` file and recreate the container using - 12 | 13 | ``` bash 14 | docker-compose up -d --force-recreate 15 | ``` 16 | -------------------------------------------------------------------------------- /wireguard/compose.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | wireguard: 3 | image: linuxserver/wireguard 4 | container_name: wireguard 5 | cap_add: 6 | - NET_ADMIN 7 | - SYS_MODULE 8 | environment: 9 | - PUID=1000 10 | - PGID=1000 11 | - TZ=America/Chicago # Change this 12 | - SERVERURL=auto #optional # Set to automatically server's external IP 13 | - SERVERPORT=51820 #optional 14 | - PEERS=1 #optional # Change this to the number of clients needed 15 | - PEERDNS=auto #optional 16 | - INTERNAL_SUBNET=10.13.13.0 #optional 17 | - ALLOWEDIPS=0.0.0.0/0 #optional 18 | volumes: 19 | - /home/pi/wireguard/config:/config # Change this 20 | - /lib/modules:/lib/modules 21 | ports: 22 | - 51820:51820/udp # Forward port 51820/udp on your router to the server IP 23 | sysctls: 24 | - net.ipv4.conf.all.src_valid_mark=1 25 | - net.ipv4.ip_forward=1 26 | restart: unless-stopped 27 | -------------------------------------------------------------------------------- /wordpress/compose.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | wp_db: 3 | # Mariadb image that supports both amd64 & arm64 architecture 4 | image: mariadb:10.6.5-focal 5 | # If you really want to use MySQL, uncomment the following line 6 | #image: mysql:8.0.27 7 | command: '--default-authentication-plugin=mysql_native_password' 8 | volumes: 9 | - db_data:/var/lib/mysql 10 | restart: always 11 | environment: 12 | - MYSQL_ROOT_PASSWORD= # Change this 13 | - MYSQL_DATABASE=wordpress 14 | - MYSQL_USER=wordpress 15 | - MYSQL_PASSWORD= # Change this 16 | expose: 17 | - 3306 18 | - 33060 19 | 20 | wp_redis: 21 | image: redis:alpine 22 | restart: always 23 | 24 | wordpress: 25 | image: wordpress:latest 26 | depends_on: 27 | - wp_db 28 | - wp_redis 29 | volumes: 30 | - wp_data:/var/www/html 31 | ports: 32 | - 80:80 33 | restart: always 34 | environment: 35 | - WORDPRESS_DB_HOST=wp_db 36 | - WORDPRESS_DB_USER=wordpress 37 | - WORDPRESS_DB_PASSWORD= # Change this (same as defined in `wp_db`) 38 | - WORDPRESS_DB_NAME=wordpress 39 | - | 40 | WORDPRESS_CONFIG_EXTRA= 41 | define( 'WP_HOME', 'https://example.com' ); # Change this to your domain 42 | define( 'WP_SITEURL', 'https://example.com' ); # Change this to your domain 43 | define( 'WP_REDIS_CLIENT', 'predis' ); define( 'WP_REDIS_SCHEME', 'tcp' ); 44 | define( 'WP_REDIS_HOST', 'wp_redis' ); define( 'WP_REDIS_PORT', '6379' ); 45 | define( 'WP_REDIS_PASSWORD', '' ); define( 'WP_REDIS_DATABASE', '0' ); 46 | define( 'WP_REDIS_MAXTTL', '900' ); define( 'WP_REDIS_SELECTIVE_FLUSH', 'xx_ '); 47 | volumes: 48 | db_data: 49 | wp_data: --------------------------------------------------------------------------------