├── .dev ├── build-docker.sh ├── prepare-release.sh ├── tag-release.sh └── versions.env ├── .github └── FUNDING.yml ├── .gitignore ├── CHANGELOG.md ├── CONTRIBUTING.md ├── Dockerfile.uhf ├── README.md └── docker-compose.yml /.dev/build-docker.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set -e 3 | 4 | # Colors 5 | RED='\033[0;31m' 6 | GREEN='\033[0;32m' 7 | BLUE='\033[0;34m' 8 | YELLOW='\033[1;33m' 9 | NC='\033[0m' # No Color 10 | 11 | # Load versions 12 | source "$(dirname "$0")/versions.env" 13 | 14 | # Build image tag 15 | if [ -n "$DOCKER_REVISION" ]; then 16 | IMAGE_TAG="uhf-${UHF_VERSION}-ffmpeg${FFMPEG_VERSION}-${DOCKER_REVISION}" 17 | else 18 | IMAGE_TAG="uhf-${UHF_VERSION}-ffmpeg${FFMPEG_VERSION}" 19 | fi 20 | 21 | # Build and push multi-arch image 22 | echo -e "\n${BLUE}🏗️ Building and pushing for ${YELLOW}amd64, arm64${BLUE} with version ${YELLOW}${IMAGE_TAG}${NC}..." 23 | 24 | # Ensure buildx builder exists and supports multi-arch 25 | docker buildx create --use --name multiarch-builder 2>/dev/null || docker buildx use multiarch-builder 26 | docker buildx inspect --bootstrap 27 | 28 | # Build multi-arch image 29 | docker buildx build \ 30 | --pull \ 31 | --no-cache \ 32 | --platform linux/amd64,linux/arm64 \ 33 | --build-arg UHF_VERSION="${UHF_VERSION}" \ 34 | -f ./Dockerfile.uhf \ 35 | -t "solidpixel/uhf-server:${IMAGE_TAG}" \ 36 | -t "solidpixel/uhf-server:latest" \ 37 | --push \ 38 | .. 39 | 40 | echo -e "\n${GREEN}✨ Done! Docker images:${NC}" 41 | echo -e "${BLUE}📦 solidpixel/uhf-server:${YELLOW}${IMAGE_TAG}${NC}" 42 | echo -e "${BLUE}📦 solidpixel/uhf-server:${YELLOW}latest${NC}\n" 43 | 44 | # Ask to clean up local images 45 | echo -e "${BLUE}🧹 Clean up local images?${NC}" 46 | echo -e "${YELLOW}This will remove the following images from your laptop:${NC}" 47 | echo -e " ${BLUE}• solidpixel/uhf-server:${YELLOW}${IMAGE_TAG}${NC}" 48 | echo -e " ${BLUE}• solidpixel/uhf-server:${YELLOW}latest${NC}" 49 | read -p "$(echo -e ${BLUE}Delete these images? [y/N]${NC} )" -n 1 -r 50 | echo 51 | 52 | if [[ $REPLY =~ ^[Yy]$ ]]; then 53 | echo -e "\n${BLUE}🗑️ Removing local images...${NC}" 54 | docker rmi "solidpixel/uhf-server:${IMAGE_TAG}" "solidpixel/uhf-server:latest" 2>/dev/null || true 55 | echo -e "${GREEN}✨ Cleanup complete!${NC}\n" 56 | else 57 | echo -e "\n${BLUE}ℹ️ Keeping local images${NC}\n" 58 | fi -------------------------------------------------------------------------------- /.dev/prepare-release.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set -e 3 | 4 | # Colors 5 | RED='\033[0;31m' 6 | GREEN='\033[0;32m' 7 | BLUE='\033[0;34m' 8 | YELLOW='\033[1;33m' 9 | NC='\033[0m' # No Color 10 | 11 | # Source versions 12 | source "$(dirname "$0")/versions.env" 13 | 14 | # Generate Docker image version (includes optional patch revision) 15 | if [ -n "$DOCKER_REVISION" ]; then 16 | DOCKER_VERSION="uhf-${UHF_VERSION}-ffmpeg${FFMPEG_VERSION}-${DOCKER_REVISION}" 17 | else 18 | DOCKER_VERSION="uhf-${UHF_VERSION}-ffmpeg${FFMPEG_VERSION}" 19 | fi 20 | 21 | # Path to files 22 | README_PATH="$(dirname "$0")/../README.md" 23 | COMPOSE_PATH="$(dirname "$0")/../docker-compose.yml" 24 | CHANGELOG_PATH="$(dirname "$0")/../CHANGELOG.md" 25 | 26 | # Function to update badge 27 | update_badge() { 28 | local name="$1" 29 | local version="$2" 30 | local color="$3" 31 | sed -i '' "s|${name}-[^-]*-${color}\.svg|${name}-${version}-${color}.svg|g" "$README_PATH" 32 | } 33 | 34 | echo -e "\n${BLUE}🚀 Preparing release ${YELLOW}${REPO_VERSION}${NC}..." 35 | 36 | # Update badges 37 | echo -e "\n${BLUE}🎯 Updating badges...${NC}" 38 | update_badge "repo" "$REPO_VERSION" "purple" 39 | update_badge "uhf_server" "$UHF_VERSION" "orange" 40 | update_badge "ffmpeg" "$FFMPEG_VERSION" "green" 41 | 42 | # Update docker-compose.yml version 43 | echo -e "\n${BLUE}📝 Updating docker-compose.yml...${NC}" 44 | sed -i '' "s|solidpixel/uhf-server:[^[:space:]]*|solidpixel/uhf-server:${DOCKER_VERSION}|g" "$COMPOSE_PATH" 45 | 46 | # Update changelog if new version 47 | if ! grep -q "## Version ${REPO_VERSION}" "$CHANGELOG_PATH"; then 48 | echo -e "\n${BLUE}📋 Adding new changelog entry...${NC}" 49 | # Get current date in YYYY-MM-DD format 50 | TODAY=$(date +%Y-%m-%d) 51 | 52 | # Create new changelog entry 53 | NEW_ENTRY="## Version ${REPO_VERSION} – ${TODAY}\n\n#### Changes\n- \n\n" 54 | 55 | # Insert after comment line 56 | awk -v entry="$NEW_ENTRY" '//{print;print entry;next}1' "$CHANGELOG_PATH" > "$CHANGELOG_PATH.tmp" && mv "$CHANGELOG_PATH.tmp" "$CHANGELOG_PATH" 57 | 58 | echo -e "${GREEN}✅ Added new changelog entry for ${YELLOW}${REPO_VERSION}${NC}" 59 | echo -e "${YELLOW}⚠️ Please edit CHANGELOG.md to add your changes!${NC}" 60 | echo -e "${BLUE}Press any key to continue after editing the changelog...${NC}" 61 | read -n 1 62 | fi 63 | 64 | echo -e "\n${GREEN}✨ Done!${NC}" 65 | echo -e "\n${YELLOW}✅ Now open a PR and merge it.${NC}" 66 | echo -e "${BLUE}After merging, run:${NC}" 67 | echo -e "${YELLOW}./.dev/tag-release.sh${NC}\n" -------------------------------------------------------------------------------- /.dev/tag-release.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set -e 3 | 4 | # Colors 5 | RED='\033[0;31m' 6 | GREEN='\033[0;32m' 7 | BLUE='\033[0;34m' 8 | YELLOW='\033[1;33m' 9 | NC='\033[0m' # No Color 10 | 11 | # Source versions 12 | source "$(dirname "$0")/versions.env" 13 | 14 | # Make sure we are on main 15 | git checkout main 16 | git pull origin main 17 | 18 | # Create and push git tag 19 | echo -e "\n${BLUE}🏷️ Tagging version ${YELLOW}${REPO_VERSION}${NC}..." 20 | git tag -f "${REPO_VERSION}" 21 | git push -f origin "${REPO_VERSION}" 22 | 23 | echo -e "\n${GREEN}✅ Git tag ${YELLOW}${REPO_VERSION}${GREEN} created and pushed.${NC}" 24 | echo -e "\n${BLUE}ℹ️ Now you can build and push the Docker images by running:${NC}" 25 | echo -e "${YELLOW}./.dev/build-docker.sh${NC}\n" -------------------------------------------------------------------------------- /.dev/versions.env: -------------------------------------------------------------------------------- 1 | # Version definitions for UHF Server Docker 2 | 3 | # Tag of this repo itself (e.g. config/scripts/compose changes) 4 | REPO_VERSION=1.3.0 5 | 6 | # The actual UHF version used inside the image 7 | UHF_VERSION=1.3.0 8 | 9 | # FFmpeg version used as base 10 | FFMPEG_VERSION=7.1.1 11 | 12 | # Optional Docker-level patch version (use d1, d2, etc to track image-only changes) 13 | DOCKER_REVISION=d1 14 | 15 | # Docker image version is generated from UHF_VERSION, FFMPEG_VERSION, and optional DOCKER_REVISION 16 | # Format: uhf-${UHF_VERSION}-ffmpeg${FFMPEG_VERSION}-${DOCKER_REVISION} 17 | # Example: uhf-1.3.0-ffmpeg7.1.1-d1 -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | github: [solid-pixel] # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] 4 | ko_fi: solidpixel 5 | # patreon: # Replace with a single Patreon username 6 | # open_collective: # Replace with a single Open Collective username 7 | # tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel 8 | # community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry 9 | # liberapay: # Replace with a single Liberapay username 10 | # issuehunt: # Replace with a single IssueHunt username 11 | # lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry 12 | # polar: # Replace with a single Polar username 13 | # buy_me_a_coffee: # Replace with a single Buy Me a Coffee username 14 | # thanks_dev: # Replace with a single thanks.dev username 15 | # custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] 16 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Local data directory 2 | uhf-data/ 3 | 4 | # OS files 5 | .DS_Store 6 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Changelog 2 | 3 | 4 | ## Version 1.3.0 – 2025-05-20 5 | 6 | #### Docker Image Changes 7 | - Updated `uhf-server` to version `1.3.0` ([Changelog](https://github.com/swapplications/uhf-server-dist/blob/main/CHANGELOG.md)) 8 | 9 | #### Docker Compose Changes 10 | - Update `image` tag to `solidpixel/uhf-server:uhf-1.3.0-ffmpeg7.1.1-d1` 11 | 12 | 13 | ## Version 1.2.6 – 2025-04-29 14 | 15 | Fixes [Issue #16](https://github.com/solid-pixel/uhf-server-docker/issues/16) 16 | 17 | #### Docker Compose Changes 18 | - Update `image` tag to `solidpixel/uhf-server:uhf-1.2.0-ffmpeg7.1.1-d1` 19 | 20 | #### Docker Image Changes 21 | - New Docker image tag: `solidpixel/uhf-server:uhf-1.2.0-ffmpeg7.1.1-d1` 22 | - Updated FFmpeg to standard version `7.1.1` (previously used custom build) 23 | - Switched to `Ubuntu 25.04` (previously used `Debian Bookworm`) 24 | 25 | ## Version 1.2.5 – 2025-04-25 26 | 27 | #### Docker Compose Changes 28 | - Moved healthcheck from Dockerfile into `docker-compose.yml` (monitored via `/server/stats` every 30s) 29 | - Added optional recordings override volume (`./uhf-recordings:/var/lib/uhf-server/recordings`) 30 | - Added comments to `docker-compose.yml` for better onboarding 31 | 32 | #### Docker Image Changes 33 | - New Docker image tag: `solidpixel/uhf-server:uhf-1.2.0-ffmpeg7.0.2-d2` 34 | - Removed healthcheck from Dockerfile (now in `docker-compose.yml`) 35 | 36 | #### Dev Changes 37 | - Dev: Support optional `DOCKER_REVISION` for patch-level image tags in `.dev/versions.env` 38 | - Dev: Split release process into two separate scripts: `prepare-release.sh` and `tag-release.sh` 39 | - Dev: Updated `build-docker.sh` to build and push multi-arch images automatically 40 | - Dev: Updated contribution guidelines to reflect the new release workflow 41 | 42 | #### Documentation Changes 43 | - Updated README with optional recordings mount and healthcheck details 44 | - Updated CONTRIBUTING.md to match the new release process 45 | 46 | ## Version 1.2.4 – 2025-04-24 47 | 48 | #### Internal Changes 49 | > These changes only affect development and maintenance of the project. No action needed for end users. 50 | 51 | - Simplified release workflow with two scripts: `release.sh` and `build-docker.sh` 52 | - Moved UHF server installation directly into Dockerfile for better version control 53 | - Removed automated GitHub Actions workflow in favor of manual releases 54 | - Added version-specific UHF server installation (no longer using latest) 55 | - Added colored output and emojis to dev scripts for better UX 56 | 57 | ## Version 1.2.3 – 2025-04-23 58 | 59 | #### ⚠️ Breaking Changes 60 | - Switched from host network mode to port mapping (8000:8000) to improve compatibility with non-Linux systems. If you were using a custom port, you'll need to update the `ports` section in docker-compose.yml 61 | 62 | #### Docker Changes 63 | - Updated FFmpeg to version 7.0.2 64 | - Added container health monitoring via `/server/stats` endpoint (built into image) 65 | - Now using version-locked UHF server builds instead of latest 66 | 67 | ## Version 1.2.0 – 2025-04-22 68 | 69 | #### Repository Changes 70 | - Initial release 71 | - Automated builds 72 | - Multi-arch support (amd64, arm64) 73 | 74 | ## Version 1.1.2 – 2025-04-22 75 | 76 | #### Repository Changes 77 | - Fixed GitHub Actions permissions for automated releases 78 | 79 | ## Version 1.1.1 – 2025-04-22 80 | 81 | #### Docker Image Changes 82 | - Added multi-architecture support (amd64, arm64) 83 | 84 | #### Repository Changes 85 | - Added GitHub Actions workflow for multi-arch builds 86 | - Updated documentation with architecture support info 87 | 88 | ## Version 1.1.0 – 2025-04-21 89 | 90 | #### Docker Image Changes 91 | - Published image to Docker Hub (`solidpixel/uhf-server:1.1.0`) 92 | 93 | #### Repository Changes 94 | - Added Docker Hub run instructions to README 95 | - Switched to environment-based configuration (API_HOST, API_PORT, etc.) 96 | - Improved documentation with customization options 97 | - Restructured README for better clarity 98 | 99 | ## Version 1.0.0 100 | 101 | Initial release 102 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Contributing to UHF Server Docker 2 | 3 | Thank you for your interest in contributing to the UHF Server Docker project! This document provides guidelines and steps for contributing. 4 | 5 | ## Development Process 6 | 7 | 1. Fork the repository 8 | 2. Create a feature branch 9 | 3. Make your changes 10 | 4. Submit a pull request 11 | 12 | ## Version Management 13 | 14 | This project uses semantic versioning. 15 | **Version numbers will be assigned by maintainers after merge**, so you don't need to update version numbers in your PR. 16 | 17 | When submitting a PR: 18 | 1. Document your changes in `CHANGELOG.md` under a temporary heading (e.g., "## Unreleased") 19 | 2. Note any breaking changes in your PR description 20 | 3. The maintainers will handle version bumps, tagging, and changelog organization after merging 21 | 22 | ## Building and Testing 23 | 24 | ### Local Testing 25 | ```bash 26 | # Build and run locally 27 | docker compose up --build 28 | 29 | # Test the container 30 | curl http://localhost:8000/server/stats 31 | ``` 32 | 33 | ### Production Releases 34 | 35 | The project uses separate scripts for preparing and tagging releases: 36 | 37 | ```bash 38 | # 1. First update versions in .dev/versions.env 39 | vim .dev/versions.env 40 | 41 | # 2. Prepare release (updates badges, docker-compose.yml, and changelog) 42 | ./.dev/prepare-release.sh 43 | # The script will pause for you to edit the changelog manually. 44 | 45 | # 3. Open a pull request and merge it. 46 | 47 | # 4. Build and push Docker images (must be done before tagging) 48 | ./.dev/build-docker.sh 49 | 50 | # 5. After images are online, create and push the Git tag 51 | ./.dev/tag-release.sh 52 | ``` 53 | 54 | The scripts handle different parts of the release process: 55 | - `prepare-release.sh` updates documentation, badges, docker-compose.yml, and adds a changelog entry 56 | - `build-docker.sh` builds and pushes multi-arch Docker images (before tagging) 57 | - `tag-release.sh` creates and pushes the Git tag (after Docker images are online) 58 | 59 | Docker images are pushed with these tags: 60 | - `solidpixel/uhf-server:latest` 61 | - `solidpixel/uhf-server:` (where `` includes UHF version, FFmpeg version, and optional Docker revision, e.g., `uhf-1.3.0-ffmpeg7.1.1-d1`) 62 | 63 | ## Pull Request Guidelines 64 | 65 | 1. Include a clear description of the changes 66 | 2. Update documentation as needed 67 | 3. Add appropriate labels 68 | 4. Reference any related issues 69 | 70 | ## Commit Messages 71 | 72 | ### Format 73 | Format your commit messages as follows: 74 | - For documentation: `docs: Update installation guide` 75 | - For build changes: `build: Update Dockerfile dependencies` 76 | - For general changes: `chore: Update .gitignore` 77 | - For features: `feat: Add new environment variable` 78 | - For fixes: `fix: Correct port mapping` 79 | 80 | ### Examples 81 | ```bash 82 | # Changes that need Docker rebuild: 83 | git commit -m "build: Update Dockerfile dependencies" 84 | 85 | # Changes that don't need Docker rebuild: 86 | git commit -m "docs: Update installation guide" 87 | ``` 88 | 89 | ## Need Help? 90 | 91 | Feel free to open an issue for: 92 | - Bug reports 93 | - Feature requests 94 | - Questions about the codebase 95 | - Documentation improvements 96 | -------------------------------------------------------------------------------- /Dockerfile.uhf: -------------------------------------------------------------------------------- 1 | # Final image on Ubuntu 25.04 2 | FROM ubuntu:25.04 3 | 4 | # Install dependencies and FFmpeg 7.x from Ubuntu repos 5 | RUN apt-get update && apt-get install -y curl bash unzip ffmpeg && rm -rf /var/lib/apt/lists/* 6 | 7 | # Install UHF server with specific version 8 | ARG TARGETARCH 9 | ARG UHF_VERSION 10 | RUN REPO="swapplications/uhf-server-dist" \ 11 | && INSTALL_DIR="/opt/uhf-server" \ 12 | && BIN_NAME="uhf-server" \ 13 | && ARCH="$TARGETARCH" \ 14 | && if [ "$ARCH" = "amd64" ]; then \ 15 | PLATFORM="x64"; \ 16 | elif [ "$ARCH" = "arm64" ]; then \ 17 | PLATFORM="arm64"; \ 18 | else \ 19 | echo "❌ Unsupported architecture: $ARCH" && exit 1; \ 20 | fi \ 21 | && echo "🔖 Installing version: $UHF_VERSION" \ 22 | && ASSET_FILENAME="UHF.Server-linux-${PLATFORM}-${UHF_VERSION}.zip" \ 23 | && ASSET_URL="https://github.com/$REPO/releases/download/${UHF_VERSION}/${ASSET_FILENAME}" \ 24 | && echo "📥 Downloading from: $ASSET_URL" \ 25 | && TMP_DIR=$(mktemp -d) \ 26 | && curl -L "$ASSET_URL" -o "$TMP_DIR/uhf-server.zip" \ 27 | && echo "📦 Unzipping..." \ 28 | && unzip -q "$TMP_DIR/uhf-server.zip" -d "$TMP_DIR/extracted" \ 29 | && echo "🚚 Installing to $INSTALL_DIR..." \ 30 | && rm -rf "$INSTALL_DIR" \ 31 | && mkdir -p "$INSTALL_DIR" \ 32 | && cp -r "$TMP_DIR/extracted/"* "$INSTALL_DIR" \ 33 | && ln -sf "$INSTALL_DIR/$BIN_NAME" /usr/local/bin/$BIN_NAME \ 34 | && chmod +x "$INSTALL_DIR/$BIN_NAME" \ 35 | && rm -rf "$TMP_DIR" \ 36 | && echo "✅ UHF Server $UHF_VERSION installed successfully!" 37 | 38 | # Create directory for recordings and database 39 | RUN mkdir -p /var/lib/uhf-server/recordings 40 | 41 | # Set working directory 42 | WORKDIR /var/lib/uhf-server 43 | 44 | # Start UHF server 45 | CMD ["bash"] -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # UHF Server – Docker Setup 2 | 3 | [![Repo](https://img.shields.io/badge/repo-1.3.0-purple.svg)](CHANGELOG.md) 4 | [![UHF Server](https://img.shields.io/badge/uhf_server-1.3.0-orange.svg)](https://github.com/swapplications/uhf-server-dist) 5 | [![FFmpeg](https://img.shields.io/badge/ffmpeg-7.1.1-green.svg)](https://ffmpeg.org/) 6 | [![Docker](https://img.shields.io/badge/Docker-uhf--1.3.0--ffmpeg7.1.1--d1-blue?logo=docker)](https://hub.docker.com/r/solidpixel/uhf-server/tags) 7 | 8 | Run the [UHF Recording Server](https://www.uhfapp.com/server) using Docker. No manual setup, no system-level dependencies — just `docker compose up` and visit port 8000 (or your custom port). 9 | 10 | --- 11 | 12 | ## Table of Contents 13 | 14 | - ✨ [Features](#-features) 15 | - 📋 [Requirements](#-requirements) 16 | - 🚀 [Getting Started](#-getting-started) 17 | - ⚙️ [Customization](#️-customization) 18 | - 🖥️ [Running on Unraid](#️-running-on-unraid-and-truenas-scale) 19 | - 👥 [Credits](#-credits) 20 | - 📜 [License](#-license) 21 | - 🕧 [Changelog](#-changelog) 22 | 23 | --- 24 | 25 | ## ✨ Features 26 | 27 | - Fully containerized [UHF Server](https://github.com/swapplications/uhf-server-dist) 28 | - Version-locked UHF server and FFmpeg builds 29 | - Docker + Compose setup (no system install required) 30 | - Persistent volume for recordings 31 | - Multi-arch support (amd64, arm64) 32 | - Container health monitoring 33 | 34 | --- 35 | 36 | ## 📋 Requirements 37 | 38 | - Docker 39 | - Docker Compose v2+ 40 | 41 | --- 42 | 43 | > ⚠️ **Disclaimer:** 44 | This Docker wrapper is _not officially developed or maintained_ by Swapplications (the creators of UHF Server). 45 | > I'm not affiliated with them — I just built this to make deployment easier for the community. 46 | > 47 | > I do **not** maintain the `uhf-server` script itself — only the Docker setup. 48 | > If you run into issues with the actual recording logic or the server code, you'll need to contact the UHF devs directly. 49 | > 50 | > For bugs, suggestions, or Docker-related issues, please **open an Issue or PR on GitHub**. Reddit and Discord DMs won't be monitored. 51 | 52 | > **Note:** This README and repository are built with Docker Compose in mind. While other methods of running the container may work, they are not officially supported and are up to the user to figure out. 53 | 54 | --- 55 | 56 | ## 🚀 Getting Started 57 | 58 | Clone this repo and run: 59 | 60 | ```bash 61 | git clone https://github.com/solid-pixel/uhf-server-docker 62 | cd uhf-server-docker 63 | docker compose up -d # Will automatically pull image from Docker Hub 64 | ``` 65 | 66 | Then open UHF, go to the Recordings tab, and add: 67 | 68 | - SERVER ADDRESS: `` 69 | - SERVER PORT: `8000` (or the port you set up in `docker-compose.yml`) 70 | 71 | That's it! No building required. 72 | 73 | --- 74 | 75 | ## ⚙️ Customization 76 | 77 | The following environment variables can be configured in `docker-compose.yml`: 78 | - **API_HOST**: Bind to all interfaces (default: `0.0.0.0`) 79 | - **API_PORT**: Default API port inside container (default: `8000`) - changing this might break healthchecks 80 | - **RECORDINGS_DIR**: Location for recordings (default: `/var/lib/uhf-server/recordings`) 81 | - **DB_PATH**: Path to database file (default: `/var/lib/uhf-server/db.json`) 82 | - **LOG_LEVEL**: Logging verbosity (default: `INFO`) - (DEBUG, INFO, WARNING, ERROR, CRITICAL) 83 | 84 | You can also customize: 85 | - **Storage location:** adjust the `volumes:` path in `docker-compose.yml` 86 | - **Port mapping:** change `8000:8000` to `YOUR_PORT:8000` in `docker-compose.yml` to use a different external port 87 | - **Auto-restart:** enabled via `restart: unless-stopped` in `docker-compose.yml` 88 | - **Health checks:** container health is monitored every 30s via `/server/stats` endpoint 89 | - **Recordings folder:** override only the recordings directory by uncommenting `./uhf-recordings:/var/lib/uhf-server/recordings` in `docker-compose.yml` (optional; in addition to the main data mount) 90 | 91 | --- 92 | 93 | ## 🖥️ Running on Unraid and TrueNAS SCALE 94 | 95 | If you’re not using Docker Compose, make sure to set the container’s command to `uhf-server` manually in the UI. These platforms don’t use `docker-compose.yml`, so the default entrypoint won’t be applied. Without this, the server won’t start. 96 | 97 | --- 98 | 99 | ## 👥 Credits 100 | 101 | - [UHF Server](https://www.uhfapp.com/server) by Swapplications 102 | - Docker wrapper by [Alessandro Benassi](https://github.com/solid-pixel) 103 | - All the Discord legends that helped me test this 104 | 105 | --- 106 | 107 | ## 📜 License 108 | 109 | MIT — do what you want, no warranty 110 | 111 | --- 112 | 113 | ## 🕧 Changelog 114 | 115 | See [CHANGELOG.md](CHANGELOG.md) for version history. 116 | -------------------------------------------------------------------------------- /docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '3.8' 2 | 3 | services: 4 | 5 | uhf-server: 6 | 7 | image: solidpixel/uhf-server:uhf-1.3.0-ffmpeg7.1.1-d1 8 | container_name: uhf-server 9 | restart: unless-stopped 10 | 11 | volumes: 12 | # Persist both recordings (uhf-server/recordings) and database (uhf-server/db.json) by mounting the full data directory: 13 | - ./uhf-data:/var/lib/uhf-server 14 | 15 | # OPTIONAL: store recordings in a different location 16 | # Uncomment the line below IN ADDITION to the one above. 17 | # This will override only the /recordings folder inside the container: 18 | # - ./uhf-recordings:/var/lib/uhf-server/recordings 19 | 20 | ports: 21 | - 8000:8000 # : 22 | # is what you set in UHF settings. 23 | # must match API_PORT (default is 8000) 24 | 25 | # Optional container environment config: 26 | # Uncomment to customize internal container settings (usually not needed) 27 | # environment: 28 | # - API_HOST=0.0.0.0 29 | # - API_PORT=8000 30 | # - RECORDINGS_DIR=/var/lib/uhf-server/recordings 31 | # - DB_PATH=/var/lib/uhf-server/db.json 32 | # - LOG_LEVEL=INFO # Options: DEBUG, INFO, WARNING, ERROR, CRITICAL 33 | 34 | command: ["uhf-server"] 35 | 36 | healthcheck: 37 | test: ["CMD", "curl", "-f", "http://localhost:8000/server/stats"] 38 | interval: 30s 39 | timeout: 5s 40 | retries: 3 41 | # ⚠️ If you change API_PORT from 8000, you must update the healthcheck URL. --------------------------------------------------------------------------------