commit
123a3f241b
3 changed files with 132 additions and 0 deletions
58
.forgejo/workflows/deploy.yaml
Normal file
58
.forgejo/workflows/deploy.yaml
Normal file
|
|
@ -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
|
||||||
20
.gitignore
vendored
Normal file
20
.gitignore
vendored
Normal file
|
|
@ -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/
|
||||||
54
docker-compose.yaml
Normal file
54
docker-compose.yaml
Normal file
|
|
@ -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
|
||||||
Loading…
Reference in a new issue