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