#!/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