commit 123a3f241bb988e95b87fbb3d4781f7225583cf9 Author: Заид Омар Медхат Date: Sat Jul 25 22:06:50 2026 +0500 init diff --git a/.forgejo/workflows/deploy.yaml b/.forgejo/workflows/deploy.yaml new file mode 100644 index 0000000..0b23586 --- /dev/null +++ b/.forgejo/workflows/deploy.yaml @@ -0,0 +1,58 @@ +name: Deploy + +# Deploy on every push to master (and allow manual runs from the Actions tab). +on: + push: + branches: [master] + workflow_dispatch: + +# A STABLE compose project name so the named volume (dispatcharr_data) is the +# same on every run. Compose prefixes volumes with the project name; if that +# name changed between runs (e.g. a different checkout path) you'd silently get +# a fresh empty volume and lose Dispatcharr's database/config on each deploy. +env: + COMPOSE_PROJECT_NAME: livetv + +jobs: + deploy: + # `docker` label => node:22-bookworm with the host Docker socket available. + runs-on: docker + steps: + - name: Checkout + uses: actions/checkout@v4 + + # The job image has the Docker socket available but may not ship the docker + # CLI / compose plugin. Install them only if missing (no-op otherwise) so + # `docker compose ...` can talk to the host daemon. + - name: Ensure Docker CLI + Compose plugin + run: | + if ! command -v docker >/dev/null 2>&1; then + curl -fsSL https://download.docker.com/linux/static/stable/x86_64/docker-27.3.1.tgz \ + | tar -xz -C /usr/local/bin --strip-components=1 docker/docker + fi + if ! docker compose version >/dev/null 2>&1; then + mkdir -p /usr/local/lib/docker/cli-plugins + curl -fsSL https://github.com/docker/compose/releases/download/v2.29.7/docker-compose-linux-x86_64 \ + -o /usr/local/lib/docker/cli-plugins/docker-compose + chmod +x /usr/local/lib/docker/cli-plugins/docker-compose + fi + docker version + docker compose version + + # `proxy` is the shared external network Nginx Proxy Manager sits on. + # Create it if it doesn't exist yet so `docker compose up` won't fail. + - name: Ensure 'proxy' network exists + run: docker network inspect proxy >/dev/null 2>&1 || docker network create proxy + + # Pull the latest images referenced in docker-compose.yaml. + - name: Pull images + run: docker compose pull + + # Reconcile the stack: compose only recreates services whose config or + # image actually changed, and cleans up any services removed from the file. + - name: Deploy stack + run: docker compose up -d --remove-orphans + + # Free disk on the shared runner by dropping old, untagged images. + - name: Prune old images + run: docker image prune -f diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..0152a51 --- /dev/null +++ b/.gitignore @@ -0,0 +1,20 @@ +# Claude Code local settings (machine-specific, not for sharing) +.claude/settings.local.json + +# Environment files / secrets (never commit real credentials) +.env +.env.* +!.env.example + +# Local compose overrides (per-machine tweaks) +docker-compose.override.yml +docker-compose.override.yaml + +# OS / editor cruft +.DS_Store +Thumbs.db +desktop.ini +*.swp +*~ +.idea/ +.vscode/ diff --git a/docker-compose.yaml b/docker-compose.yaml new file mode 100644 index 0000000..53bce0f --- /dev/null +++ b/docker-compose.yaml @@ -0,0 +1,54 @@ +services: + # --------------------------------------------------------------------------- + # Dispatcharr — ingests the Xtream API (URL + user + pass) and re-serves it as + # an HDHomeRun tuner + M3U + EPG for Jellyfin. NOT exposed publicly. + # --------------------------------------------------------------------------- + dispatcharr: + image: ghcr.io/dispatcharr/dispatcharr:latest + container_name: dispatcharr + restart: unless-stopped + volumes: + - dispatcharr_data:/data + environment: + DISPATCHARR_ENV: aio + REDIS_HOST: localhost + CELERY_BROKER_URL: redis://localhost:6379/0 + DISPATCHARR_LOG_LEVEL: info + # No published ports. NPM (on the `proxy` network) reaches it by name for + # both the admin UI and Jellyfin's tuner/EPG: http://dispatcharr:9191 + # - Admin UI -> NPM host dispatcharr.altricade.com (add an Access List) + # - Jellyfin -> internal http://dispatcharr:9191 (no exposure) + networks: + - proxy + + # --------------------------------------------------------------------------- + # Jellyfin — the app you and others actually watch in. This is the ONLY + # public-facing service: expose it via Nginx Proxy Manager (see notes below). + # In NPM: forward hostname = jellyfin , port = 8096 , scheme http , WS on. + # --------------------------------------------------------------------------- + jellyfin: + image: jellyfin/jellyfin:latest + container_name: jellyfin + restart: unless-stopped + volumes: + - jellyfin_config:/config + - jellyfin_cache:/cache + # Optional media library (VOD / DVR recordings). Point at a real path: + # - /srv/media:/media + environment: + # Helps clients build correct absolute URLs behind the HTTPS proxy. + JELLYFIN_PublishedServerUrl: https://jellyfin.altricade.com + networks: + - proxy + # Optional Intel/AMD hardware transcoding (uncomment if your VPS has a GPU): + # devices: + # - /dev/dri:/dev/dri + +volumes: + dispatcharr_data: + jellyfin_config: + jellyfin_cache: + +networks: + proxy: + external: true