mirror of
https://github.com/theoleuthardt/homelab-docker-compose.git
synced 2026-06-05 23:41:07 +00:00
remove stale services, rename awx-ansible and satisfactory, add dockhand and gitignore
This commit is contained in:
parent
3edcee69f8
commit
db67c88d04
11 changed files with 17 additions and 473 deletions
4
.gitignore
vendored
Normal file
4
.gitignore
vendored
Normal file
|
|
@ -0,0 +1,4 @@
|
||||||
|
dockploy/
|
||||||
|
privatebin/
|
||||||
|
calibre/
|
||||||
|
rstudio/
|
||||||
|
|
@ -1,20 +0,0 @@
|
||||||
services:
|
|
||||||
calibre-web:
|
|
||||||
image: lscr.io/linuxserver/calibre-web:latest
|
|
||||||
container_name: calibre-web
|
|
||||||
environment:
|
|
||||||
- PUID=1000
|
|
||||||
- PGID=1000
|
|
||||||
- TZ=Etc/UTC
|
|
||||||
- OAUTHLIB_RELAX_TOKEN_SCOPE=1 #optional
|
|
||||||
volumes:
|
|
||||||
- calibre_web_config:/config
|
|
||||||
- ebooks_library:/books
|
|
||||||
ports:
|
|
||||||
- 8083:8083
|
|
||||||
restart: unless-stopped
|
|
||||||
|
|
||||||
volumes:
|
|
||||||
calibre_web_config:
|
|
||||||
ebooks_library:
|
|
||||||
external: True
|
|
||||||
13
dockhand/docker-compose.yml
Normal file
13
dockhand/docker-compose.yml
Normal file
|
|
@ -0,0 +1,13 @@
|
||||||
|
services:
|
||||||
|
dockhand:
|
||||||
|
image: ghcr.io/dockhand/dockhand:latest
|
||||||
|
container_name: dockhand
|
||||||
|
restart: unless-stopped
|
||||||
|
ports:
|
||||||
|
- "3001:3001"
|
||||||
|
volumes:
|
||||||
|
- /var/run/docker.sock:/var/run/docker.sock
|
||||||
|
- dockhand_data:/data
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
dockhand_data:
|
||||||
|
|
@ -1,107 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
|
|
||||||
install_dokploy() {
|
|
||||||
if [ "$(id -u)" != "0" ]; then
|
|
||||||
echo "This script must be run as root" >&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ "$(uname)" = "Darwin" ]; then
|
|
||||||
echo "This script must be run on Linux" >&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ -f /.dockerenv ]; then
|
|
||||||
echo "This script must be run on Linux" >&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
command_exists() {
|
|
||||||
command -v "$@" > /dev/null 2>&1
|
|
||||||
}
|
|
||||||
|
|
||||||
if command_exists docker; then
|
|
||||||
echo "Docker already installed"
|
|
||||||
else
|
|
||||||
curl -sSL https://get.docker.com | sh
|
|
||||||
fi
|
|
||||||
|
|
||||||
if command_exists docker compose; then
|
|
||||||
echo "Docker Compose already installed"
|
|
||||||
else
|
|
||||||
echo "Installing Docker Compose..."
|
|
||||||
curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
|
|
||||||
chmod +x /usr/local/bin/docker-compose
|
|
||||||
fi
|
|
||||||
|
|
||||||
mkdir -p /etc/dokploy
|
|
||||||
chmod 777 /etc/dokploy
|
|
||||||
|
|
||||||
cat <<EOF > /etc/dokploy/docker-compose.yml
|
|
||||||
services:
|
|
||||||
postgres:
|
|
||||||
image: postgres:16
|
|
||||||
container_name: dokploy-postgres
|
|
||||||
environment:
|
|
||||||
POSTGRES_USER: dokploy
|
|
||||||
POSTGRES_DB: dokploy
|
|
||||||
POSTGRES_PASSWORD: amukds4wi9001583845717ad2
|
|
||||||
volumes:
|
|
||||||
- dokploy-postgres-database:/var/lib/postgresql/data
|
|
||||||
restart: unless-stopped
|
|
||||||
|
|
||||||
redis:
|
|
||||||
image: redis:7
|
|
||||||
container_name: dokploy-redis
|
|
||||||
volumes:
|
|
||||||
- redis-data-volume:/data
|
|
||||||
restart: unless-stopped
|
|
||||||
|
|
||||||
dokploy:
|
|
||||||
image: dokploy/dokploy:latest
|
|
||||||
container_name: dokploy
|
|
||||||
ports:
|
|
||||||
- "3000:3000"
|
|
||||||
volumes:
|
|
||||||
- /var/run/docker.sock:/var/run/docker.sock
|
|
||||||
- /etc/dokploy:/etc/dokploy
|
|
||||||
- dokploy-docker-config:/root/.docker
|
|
||||||
environment:
|
|
||||||
- ADVERTISE_ADDR=\${ADVERTISE_ADDR}
|
|
||||||
restart: unless-stopped
|
|
||||||
|
|
||||||
volumes:
|
|
||||||
dokploy-postgres-database:
|
|
||||||
redis-data-volume:
|
|
||||||
dokploy-docker-config:
|
|
||||||
EOF
|
|
||||||
|
|
||||||
export ADVERTISE_ADDR=$(hostname -I | awk '{print $1}')
|
|
||||||
echo "Using advertise address: $ADVERTISE_ADDR"
|
|
||||||
|
|
||||||
cd /etc/dokploy
|
|
||||||
docker compose up -d
|
|
||||||
|
|
||||||
GREEN="\033[0;32m"
|
|
||||||
YELLOW="\033[1;33m"
|
|
||||||
BLUE="\033[0;34m"
|
|
||||||
NC="\033[0m"
|
|
||||||
|
|
||||||
echo ""
|
|
||||||
printf "${GREEN}Congratulations, Dokploy is installed using Docker Compose!${NC}\n"
|
|
||||||
printf "${YELLOW}Please go to http://localhost:3000 or http://<your-server-ip>:3000${NC}\n\n"
|
|
||||||
}
|
|
||||||
|
|
||||||
update_dokploy() {
|
|
||||||
echo "Updating Dokploy..."
|
|
||||||
cd /etc/dokploy
|
|
||||||
docker compose pull dokploy
|
|
||||||
docker compose up -d
|
|
||||||
echo "Dokploy has been updated to the latest version."
|
|
||||||
}
|
|
||||||
|
|
||||||
if [ "$1" = "update" ]; then
|
|
||||||
update_dokploy
|
|
||||||
else
|
|
||||||
install_dokploy
|
|
||||||
fi
|
|
||||||
|
|
@ -1,201 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
install_dokploy() {
|
|
||||||
if [ "$(id -u)" != "0" ]; then
|
|
||||||
echo "This script must be run as root" >&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# check if is Mac OS
|
|
||||||
if [ "$(uname)" = "Darwin" ]; then
|
|
||||||
echo "This script must be run on Linux" >&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# check if is running inside a container
|
|
||||||
if [ -f /.dockerenv ]; then
|
|
||||||
echo "This script must be run on Linux" >&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# check if something is running on port 80
|
|
||||||
# if ss -tulnp | grep ':80 ' >/dev/null; then
|
|
||||||
# echo "Error: something is already running on port 80" >&2
|
|
||||||
# exit 1
|
|
||||||
# fi
|
|
||||||
|
|
||||||
command_exists() {
|
|
||||||
command -v "$@" > /dev/null 2>&1
|
|
||||||
}
|
|
||||||
|
|
||||||
if command_exists docker; then
|
|
||||||
echo "Docker already installed"
|
|
||||||
else
|
|
||||||
curl -sSL https://get.docker.com | sh
|
|
||||||
fi
|
|
||||||
|
|
||||||
docker swarm leave --force 2>/dev/null
|
|
||||||
|
|
||||||
get_ip() {
|
|
||||||
local ip=""
|
|
||||||
|
|
||||||
# Try IPv4 first
|
|
||||||
# First attempt: ifconfig.io
|
|
||||||
ip=$(curl -4s --connect-timeout 5 https://ifconfig.io 2>/dev/null)
|
|
||||||
|
|
||||||
# Second attempt: icanhazip.com
|
|
||||||
if [ -z "$ip" ]; then
|
|
||||||
ip=$(curl -4s --connect-timeout 5 https://icanhazip.com 2>/dev/null)
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Third attempt: ipecho.net
|
|
||||||
if [ -z "$ip" ]; then
|
|
||||||
ip=$(curl -4s --connect-timeout 5 https://ipecho.net/plain 2>/dev/null)
|
|
||||||
fi
|
|
||||||
|
|
||||||
# If no IPv4, try IPv6
|
|
||||||
if [ -z "$ip" ]; then
|
|
||||||
# Try IPv6 with ifconfig.io
|
|
||||||
ip=$(curl -6s --connect-timeout 5 https://ifconfig.io 2>/dev/null)
|
|
||||||
|
|
||||||
# Try IPv6 with icanhazip.com
|
|
||||||
if [ -z "$ip" ]; then
|
|
||||||
ip=$(curl -6s --connect-timeout 5 https://icanhazip.com 2>/dev/null)
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Try IPv6 with ipecho.net
|
|
||||||
if [ -z "$ip" ]; then
|
|
||||||
ip=$(curl -6s --connect-timeout 5 https://ipecho.net/plain 2>/dev/null)
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ -z "$ip" ]; then
|
|
||||||
echo "Error: Could not determine server IP address automatically (neither IPv4 nor IPv6)." >&2
|
|
||||||
echo "Please set the ADVERTISE_ADDR environment variable manually." >&2
|
|
||||||
echo "Example: export ADVERTISE_ADDR=<your-server-ip>" >&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo "$ip"
|
|
||||||
}
|
|
||||||
|
|
||||||
get_private_ip() {
|
|
||||||
ip addr show | grep -E "inet (192\.168\.|10\.|172\.1[6-9]\.|172\.2[0-9]\.|172\.3[0-1]\.)" | head -n1 | awk '{print $2}' | cut -d/ -f1
|
|
||||||
}
|
|
||||||
|
|
||||||
advertise_addr="${ADVERTISE_ADDR:-$(get_private_ip)}"
|
|
||||||
|
|
||||||
if [ -z "$advertise_addr" ]; then
|
|
||||||
echo "ERROR: We couldn't find a private IP address."
|
|
||||||
echo "Please set the ADVERTISE_ADDR environment variable manually."
|
|
||||||
echo "Example: export ADVERTISE_ADDR=192.168.1.100"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
echo "Using advertise address: $advertise_addr"
|
|
||||||
|
|
||||||
docker swarm init --advertise-addr $advertise_addr
|
|
||||||
|
|
||||||
if [ $? -ne 0 ]; then
|
|
||||||
echo "Error: Failed to initialize Docker Swarm" >&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo "Swarm initialized"
|
|
||||||
|
|
||||||
docker network rm -f dokploy-network 2>/dev/null
|
|
||||||
docker network create --driver overlay --attachable dokploy-network
|
|
||||||
|
|
||||||
echo "Network created"
|
|
||||||
|
|
||||||
mkdir -p /etc/dokploy
|
|
||||||
|
|
||||||
chmod 777 /etc/dokploy
|
|
||||||
|
|
||||||
docker service create \
|
|
||||||
--name dokploy-postgres \
|
|
||||||
--constraint 'node.role==manager' \
|
|
||||||
--network dokploy-network \
|
|
||||||
--env POSTGRES_USER=dokploy \
|
|
||||||
--env POSTGRES_DB=dokploy \
|
|
||||||
--env POSTGRES_PASSWORD=amukds4wi9001583845717ad2 \
|
|
||||||
--mount type=volume,source=dokploy-postgres-database,target=/var/lib/postgresql/data \
|
|
||||||
postgres:16
|
|
||||||
|
|
||||||
docker service create \
|
|
||||||
--name dokploy-redis \
|
|
||||||
--constraint 'node.role==manager' \
|
|
||||||
--network dokploy-network \
|
|
||||||
--mount type=volume,source=redis-data-volume,target=/data \
|
|
||||||
redis:7
|
|
||||||
|
|
||||||
# Installation
|
|
||||||
docker service create \
|
|
||||||
--name dokploy \
|
|
||||||
--replicas 1 \
|
|
||||||
--network dokploy-network \
|
|
||||||
--mount type=bind,source=/var/run/docker.sock,target=/var/run/docker.sock \
|
|
||||||
--mount type=bind,source=/etc/dokploy,target=/etc/dokploy \
|
|
||||||
--mount type=volume,source=dokploy-docker-config,target=/root/.docker \
|
|
||||||
--publish published=3000,target=3000,mode=host \
|
|
||||||
--update-parallelism 1 \
|
|
||||||
--update-order stop-first \
|
|
||||||
--constraint 'node.role == manager' \
|
|
||||||
-e ADVERTISE_ADDR=$advertise_addr \
|
|
||||||
dokploy/dokploy:latest
|
|
||||||
|
|
||||||
sleep 4
|
|
||||||
|
|
||||||
# Optional: Use docker service create instead of docker run
|
|
||||||
# docker service create \
|
|
||||||
# --name dokploy-traefik \
|
|
||||||
# --constraint 'node.role==manager' \
|
|
||||||
# --network dokploy-network \
|
|
||||||
# --mount type=bind,source=/etc/dokploy/traefik/traefik.yml,target=/etc/traefik/traefik.yml \
|
|
||||||
# --mount type=bind,source=/etc/dokploy/traefik/dynamic,target=/etc/dokploy/traefik/dynamic \
|
|
||||||
# --mount type=bind,source=/var/run/docker.sock,target=/var/run/docker.sock \
|
|
||||||
# --publish mode=host,published=443,target=443 \
|
|
||||||
# --publish mode=host,published=80,target=80 \
|
|
||||||
# --publish mode=host,published=443,target=443,protocol=udp \
|
|
||||||
# traefik:v3.1.2
|
|
||||||
|
|
||||||
GREEN="\033[0;32m"
|
|
||||||
YELLOW="\033[1;33m"
|
|
||||||
BLUE="\033[0;34m"
|
|
||||||
NC="\033[0m" # No Color
|
|
||||||
|
|
||||||
format_ip_for_url() {
|
|
||||||
local ip="$1"
|
|
||||||
if echo "$ip" | grep -q ':'; then
|
|
||||||
# IPv6
|
|
||||||
echo "[${ip}]"
|
|
||||||
else
|
|
||||||
# IPv4
|
|
||||||
echo "${ip}"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
public_ip="${ADVERTISE_ADDR:-$(get_ip)}"
|
|
||||||
formatted_addr=$(format_ip_for_url "$public_ip")
|
|
||||||
echo ""
|
|
||||||
printf "${GREEN}Congratulations, Dokploy is installed!${NC}\n"
|
|
||||||
printf "${BLUE}Wait 15 seconds for the server to start${NC}\n"
|
|
||||||
printf "${YELLOW}Please go to http://${formatted_addr}:3000${NC}\n\n"
|
|
||||||
}
|
|
||||||
|
|
||||||
update_dokploy() {
|
|
||||||
echo "Updating Dokploy..."
|
|
||||||
|
|
||||||
# Pull the latest image
|
|
||||||
docker pull dokploy/dokploy:latest
|
|
||||||
|
|
||||||
# Update the service
|
|
||||||
docker service update --image dokploy/dokploy:latest dokploy
|
|
||||||
|
|
||||||
echo "Dokploy has been updated to the latest version."
|
|
||||||
}
|
|
||||||
|
|
||||||
# Main script execution
|
|
||||||
if [ "$1" = "update" ]; then
|
|
||||||
update_dokploy
|
|
||||||
else
|
|
||||||
install_dokploy
|
|
||||||
fi
|
|
||||||
|
|
@ -1,52 +0,0 @@
|
||||||
services:
|
|
||||||
jellyfin:
|
|
||||||
image: jellyfin/jellyfin
|
|
||||||
container_name: jellyfin
|
|
||||||
ports:
|
|
||||||
- "8096:8096"
|
|
||||||
- "8920:8920"
|
|
||||||
volumes:
|
|
||||||
- jellyfin_config:/config
|
|
||||||
- jellyfin_cache:/cache
|
|
||||||
- jellyfin_media:/media
|
|
||||||
restart: unless-stopped
|
|
||||||
|
|
||||||
sonarr:
|
|
||||||
image: linuxserver/sonarr
|
|
||||||
container_name: sonarr
|
|
||||||
environment:
|
|
||||||
- PUID=1000
|
|
||||||
- PGID=1000
|
|
||||||
- TZ=Europe/Berlin
|
|
||||||
ports:
|
|
||||||
- "8989:8989"
|
|
||||||
volumes:
|
|
||||||
- sonarr_config:/config
|
|
||||||
- jellyfin_download:/downloads
|
|
||||||
- jellyfin_media:/media
|
|
||||||
restart: unless-stopped
|
|
||||||
|
|
||||||
radarr:
|
|
||||||
image: linuxserver/radarr
|
|
||||||
container_name: radarr
|
|
||||||
environment:
|
|
||||||
- PUID=1000
|
|
||||||
- PGID=1000
|
|
||||||
- TZ=Europe/Berlin
|
|
||||||
ports:
|
|
||||||
- "7878:7878"
|
|
||||||
volumes:
|
|
||||||
- radarr_config:/config
|
|
||||||
- jellyfin_download:/downloads
|
|
||||||
- jellyfin_media:/media
|
|
||||||
restart: unless-stopped
|
|
||||||
|
|
||||||
volumes:
|
|
||||||
jellyfin_config:
|
|
||||||
jellyfin_cache:
|
|
||||||
sonarr_config:
|
|
||||||
radarr_config:
|
|
||||||
jellyfin_media:
|
|
||||||
external: true
|
|
||||||
jellyfin_download:
|
|
||||||
external: true
|
|
||||||
|
|
@ -1,27 +0,0 @@
|
||||||
services:
|
|
||||||
open-webui:
|
|
||||||
volumes:
|
|
||||||
- open-webui:/app/backend/data
|
|
||||||
environment:
|
|
||||||
- OLLAMA_BASE_URL=http://192.168.12.151:11434
|
|
||||||
container_name: open-webui
|
|
||||||
restart: always
|
|
||||||
image: ghcr.io/open-webui/open-webui:main
|
|
||||||
|
|
||||||
ollama:
|
|
||||||
restart: always
|
|
||||||
devices:
|
|
||||||
- /dev/kfd
|
|
||||||
- /dev/dri
|
|
||||||
volumes:
|
|
||||||
- ollama:/root/.ollama
|
|
||||||
ports:
|
|
||||||
- 11434:11434
|
|
||||||
container_name: ollama
|
|
||||||
environment:
|
|
||||||
- HSA_OVERRIDE_GFX_VERSION=10.3.0
|
|
||||||
- HCC_AMDGPU_TARGET=gfx1030
|
|
||||||
image: ollama/ollama:rocm
|
|
||||||
volumes:
|
|
||||||
ollama:
|
|
||||||
open-webui:
|
|
||||||
|
|
@ -1,52 +0,0 @@
|
||||||
services:
|
|
||||||
sharelatex:
|
|
||||||
restart: always
|
|
||||||
image: sharelatex/sharelatex
|
|
||||||
container_name: sharelatex
|
|
||||||
depends_on:
|
|
||||||
mongo:
|
|
||||||
condition: service_healthy
|
|
||||||
redis:
|
|
||||||
condition: service_started
|
|
||||||
ports:
|
|
||||||
- "3001:80"
|
|
||||||
stop_grace_period: 60s
|
|
||||||
volumes:
|
|
||||||
- overleaf_sharelatex_data:/var/lib/overleaf
|
|
||||||
environment:
|
|
||||||
OVERLEAF_APP_NAME: Overleaf by TheoCloud
|
|
||||||
OVERLEAF_MONGO_URL: mongodb://mongo/sharelatex
|
|
||||||
OVERLEAF_REDIS_HOST: redis
|
|
||||||
ENABLED_LINKED_FILE_TYPES: 'project_file,project_output_file'
|
|
||||||
ENABLE_CONVERSIONS: 'true'
|
|
||||||
EMAIL_CONFIRMATION_DISABLED: 'true'
|
|
||||||
TEXMFVAR: /var/lib/overleaf/tmp/texmf-var
|
|
||||||
OVERLEAF_SITE_URL: http://overleaf.theocloud.dev
|
|
||||||
|
|
||||||
mongo:
|
|
||||||
restart: always
|
|
||||||
image: mongo:5.0
|
|
||||||
container_name: mongo
|
|
||||||
command: '--replSet overleaf'
|
|
||||||
volumes:
|
|
||||||
- overleaf_mongo_data:/data/db
|
|
||||||
- ./mongodb-init-replica-set.js:/docker-entrypoint-initdb.d/mongodb-init-replica-set.js
|
|
||||||
environment:
|
|
||||||
MONGO_INITDB_DATABASE: sharelatex
|
|
||||||
healthcheck:
|
|
||||||
test: echo 'db.stats().ok' | mongo localhost:27017/test --quiet
|
|
||||||
interval: 10s
|
|
||||||
timeout: 10s
|
|
||||||
retries: 5
|
|
||||||
|
|
||||||
redis:
|
|
||||||
restart: always
|
|
||||||
image: redis:6.2
|
|
||||||
container_name: redis
|
|
||||||
volumes:
|
|
||||||
- redis_data:/data
|
|
||||||
|
|
||||||
volumes:
|
|
||||||
overleaf_sharelatex_data:
|
|
||||||
overleaf_mongo_data:
|
|
||||||
redis_data:
|
|
||||||
|
|
@ -1,14 +0,0 @@
|
||||||
services:
|
|
||||||
privatebin:
|
|
||||||
image: privatebin/nginx-fpm-alpine
|
|
||||||
container_name: privatebin
|
|
||||||
restart: always
|
|
||||||
read_only: true
|
|
||||||
user: "1000:1000"
|
|
||||||
ports:
|
|
||||||
- "8888:8080"
|
|
||||||
volumes:
|
|
||||||
- data:/srv/data
|
|
||||||
|
|
||||||
volumes:
|
|
||||||
data:
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue