Initial PlayBull release with Trilogy Hub integration.

Includes homelab deploy tooling, image position/zoom manifest persistence, and full trading/casino stack.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-07-02 08:31:36 +02:00
commit 94b6cc3be9
60 changed files with 9206 additions and 0 deletions

32
deploy/duckdns-update.sh Normal file
View File

@@ -0,0 +1,32 @@
#!/usr/bin/env bash
# DuckDNS IP-Updater — holt oeffentliche IPv4/IPv6 und meldet sie an DuckDNS.
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
# shellcheck source=/dev/null
source "${SCRIPT_DIR}/env.homelab"
: "${DUCKDNS_TOKEN:?DUCKDNS_TOKEN fehlt in deploy/env.homelab}"
: "${DUCKDNS_DOMAIN:?DUCKDNS_DOMAIN fehlt in deploy/env.homelab}"
SUBDOMAIN="${DUCKDNS_DOMAIN%%.*}"
IPV4="$(curl -4 -fsS --max-time 15 https://api.ipify.org 2>/dev/null || true)"
IPV6="$(curl -6 -fsS --max-time 15 https://api64.ipify.org 2>/dev/null || true)"
if [[ -z "${IPV4}" && -z "${IPV6}" ]]; then
echo "duckdns-update: keine oeffentliche IP ermittelbar" >&2
exit 1
fi
URL="https://www.duckdns.org/update?domains=${SUBDOMAIN}&token=${DUCKDNS_TOKEN}&verbose=true"
[[ -n "${IPV4}" ]] && URL+="&ip=${IPV4}"
[[ -n "${IPV6}" ]] && URL+="&ipv6=${IPV6}"
RESP="$(curl -fsS --max-time 20 "${URL}")"
echo "$(date -Is) duckdns ${SUBDOMAIN}: ${RESP} (v4=${IPV4:-none} v6=${IPV6:-none})"
case "${RESP}" in
OK*) exit 0 ;;
*) exit 1 ;;
esac