Docker services on my home NAS
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

283 lines
6.7 KiB

#!/usr/bin/env bash
set -e
source ./custom.env
###########################
### Configs - Automatic ###
###########################
gid_of() {
getent group "$1" | cut -d':' -f3
}
# network
BRIDGE_SUBNET='172.16.10.0/24'
DNS_IP='172.16.10.53'
DNS_NAME=adguard
# samba/wsdd service
SMB_GID_PRIVATE=$(stat -c '%g' "${SMB_PATH_PRIVATE}")
SMB_GID_PROTECT=$(stat -c '%g' "${SMB_PATH_PROTECT}")
SMB_GID_PUBLIC=$(stat -c '%g' "${SMB_PATH_PUBLIC}")
SMB_UID_GUEST=$(stat -c '%u' "${SMB_PATH_PUBLIC}")
SMB_UGID_GUEST=$(stat -c '%u:%g' "${SMB_PATH_PUBLIC}")
SMB_UID_ADMIN=$(id -u ${SMB_UNAME_ADMIN})
# media(jellyfin) service
MEDIA_UGID=$(stat -c '%u:%g' "${MEDIA_PATH}")
MEDIA_GID_VIDEO=$(gid_of video)
DEV_DRI_RENDER='/dev/dri/renderD128'
if [ -c "${DEV_DRI_RENDER}" ]; then
MEDIA_GID_RENDER=$(stat -c '%g' "${DEV_DRI_RENDER}")
fi
if [ "${MEDIA_GID_VIDEO}" = "${MEDIA_GID_RENDER}" ]; then
unset MEDIA_GID_RENDER
fi
cat <<-EOF >docker-compose.yml
version: '3'
services:
# smartdns:
# image: "lanhost.top/smartdns"
# build:
# context: ./smartdns
# args:
# - ALPINE_VERSION=${ARGS_ALPINE_VERSION}
# - APK_MIRROR=${ARGS_APK_MIRROR}
# networks:
# localnet:
# ipv4_address: ${DNS_IP}
# ports:
# - 53:53/udp
# - 53:53/tcp
# volumes:
# - smartdns_cache:/smartdns
# restart: unless-stopped
adguard:
image: "adguard/adguardhome:${ARGS_ADGUARD_VERSION}"
networks:
localnet:
ipv4_address: ${DNS_IP}
ports:
- 53:53/udp
- 53:53/tcp
volumes:
- adguard_data:/opt/adguardhome
restart: unless-stopped
proxy:
image: "lanhost.top/proxy"
build:
context: ./proxy
args:
- PYTHON_VERSION=${ARGS_PYTHON_VERSION}
- ALPINE_VERSION=${ARGS_ALPINE_VERSION}
- APK_MIRROR=${ARGS_APK_MIRROR}
environment:
- NMP_ENDPOINT=${PROXY_NMP_ENDPOINT}
- NMP_TOKEN=${PROXY_NMP_TOKEN}
networks:
- localnet
dns:
- ${DNS_IP}
ports:
- ${PROXY_SOCKS_PORT}:10086
- ${PROXY_HTTP_PORT}:10080
# - 20080:20080
# - 20086:20086
depends_on:
- ${DNS_NAME}
restart: unless-stopped
samba:
image: "lanhost.top/samba"
build:
context: ./samba
args:
- ALPINE_VERSION=${ARGS_ALPINE_VERSION}
- APK_MIRROR=${ARGS_APK_MIRROR}
environment:
- GID_PRIVATE=${SMB_GID_PRIVATE}
- GID_PROTECT=${SMB_GID_PROTECT}
- GID_PUBLIC=${SMB_GID_PUBLIC}
- UID_GUEST=${SMB_UID_GUEST}
- UID_ADMIN=${SMB_UID_ADMIN}
- ADMIN_NAME=${SMB_UNAME_ADMIN}
- ADMIN_PASSWD=${SMB_ADMIN_PASSWD}
networks:
- localnet
ports:
- 137:137/udp
- 138:138/udp
- 139:139/tcp
- 445:445/tcp
volumes:
- ${SMB_PATH_PRIVATE}:/mnt/share/private
- ${SMB_PATH_PROTECT}:/mnt/share/protect
- ${SMB_PATH_PUBLIC}:/mnt/share/public
- ${SMB_PATH_TMP}:/mnt/share/tmp
restart: unless-stopped
wsdd2:
image: "lanhost.top/wsdd2"
build:
context: ./wsdd2
args:
- ALPINE_VERSION=${ARGS_ALPINE_VERSION}
- APK_MIRROR=${ARGS_APK_MIRROR}
environment:
- HOSTNAME=$(hostname)
- WORKGROUP=${SMB_WORKGROUP:-WORKGROUP}
network_mode: host
restart: unless-stopped
caddy:
image: "lanhost.top/caddy"
build:
context: ./caddy
args:
- CADDY_VERSION=${ARGS_CADDY_VERSION}
# - APK_MIRROR=${ARGS_APK_MIRROR}
# environment:
# - TITLE:${SPEED_TITLE}
# - PASSWORD:${SPEED_PASSWD}
networks:
- localnet
ports:
- 80:80
volumes:
- http_data:/srv/http/motd:rw
- motd_data:/srv/http/motd:ro
- /srv/share/protect:/srv/http/files/protect:ro
- /srv/share/public:/srv/http/files/public:ro
- /srv/share/tmp:/srv/http/files/tmp:ro
restart: unless-stopped
files:
image: "filebrowser/filebrowser:${ARGS_FILEBROWSER_VERSION}"
user: ${SMB_UGID_GUEST}
networks:
- localnet
volumes:
- /srv/share/protect:/srv/protect:ro
- /srv/share/public:/srv/public
- /srv/share/tmp:/srv/tmp
- /srv/share/tmp/.filebrowser.db:/database.db
restart: unless-stopped
jellyfin:
image: "lanhost.top/jellyfin"
build:
context: ./jellyfin
args:
- JELLYFIN_VERSION=${ARGS_JELLYFIN_VERSION}
user: ${MEDIA_UGID}
group_add:
- "$(gid_of video)"$( \
if [ -n "${MEDIA_GID_RENDER}" ]; then
echo
echo " - \"${MEDIA_GID_RENDER}\""
fi)$( \
for GNAME in "${MEDIA_GNAME_EXTRA[@]}"; do
echo
echo " - \"$(gid_of $GNAME)\""
done)$( \
if [ -n "${MEDIA_PUBLISHED_URL}" ]; then
echo
echo ' environment:'
echo " - JELLYFIN_PublishedServerUrl=${MEDIA_PUBLISHED_URL}"
fi)
network_mode: host
dns:
- ${DNS_IP}
volumes:
- ${VOLUME_PATH}/jellyfin/config:/config
- ${VOLUME_PATH}/jellyfin/cache:/cache
- ${VOLUME_PATH}/jellyfin/fonts:/fonts
- ${MEDIA_PATH}:/media$( \
if [ -c "${DEV_DRI_RENDER}" ]; then
echo
echo ' devices:'
echo ' - /dev/dri:/dev/dri'
fi)$( \
ls /dev/video* >/dev/null 2>&1 && echo && echo ' devices:' && for dev in /dev/video*; do
echo " - $dev:$dev"
done)
depends_on:
- ${DNS_NAME}
restart: unless-stopped
motd:
image: "lanhost.top/motd"
build:
context: ./motd
args:
- ALPINE_VERSION=${ARGS_ALPINE_VERSION}
- APK_MIRROR=${ARGS_APK_MIRROR}
environment:
- TZ=${TZ:-Asia/Shanghai}
networks:
- localnet
dns:
- ${DNS_IP}
volumes:
- motd_data:/mnt/motd
depends_on:
- ${DNS_NAME}
restart: unless-stopped
$(for CONF in ${ARIA2_CONFS[@]}; do
SRV_NAME="aria2-$(echo $CONF | cut -d':' -f1)"
SRV_PATH="$(echo $CONF | cut -d':' -f2)"
SRV_UGID=$(stat -c '%u:%g' "${SRV_PATH}")
cat <<-EOF_ARIA2
$SRV_NAME:
image: "lanhost.top/aria2"
build:
context: ./aria2
args:
- ALPINE_VERSION=${ARGS_ALPINE_VERSION}
- APK_MIRROR=${ARGS_APK_MIRROR}
user: ${SRV_UGID}
networks:
- localnet
volumes:
- ${SRV_PATH}:/mnt/downloads
depends_on:
- ${DNS_NAME}
- proxy
restart: unless-stopped
EOF_ARIA2
done)
portainer:
image: "portainer/portainer-ce:${ARGS_PORTAINER_VERSION}"
networks:
- localnet
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- portainer_data:/data
restart: unless-stopped
networks:
localnet:
driver: bridge
attachable: false
ipam:
driver: default
config:
- subnet: "${BRIDGE_SUBNET}"
volumes:
# smartdns_cache:
motd_data:
adguard_data:
http_data:
portainer_data:
EOF