Publish curated LumaOps source from c85ee9ef8f1454f5c305398902afbb9e6738de40
Managed validation / full (push) Failing after 8s
Managed validation / full (push) Failing after 8s
This commit is contained in:
1 parent
91f8b3e3c1
commit
def7920856
10 files changed
+2399
-2352
No files matched your search
@@ -1,6 +1,8 @@
|
|||||||
name: Managed validation
|
name: Managed validation
|
||||||
|
|
||||||
on:
|
on:
|
||||||
|
push:
|
||||||
|
branches: [main]
|
||||||
pull_request:
|
pull_request:
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
inputs:
|
inputs:
|
||||||
@@ -23,7 +25,7 @@ jobs:
|
|||||||
name: full
|
name: full
|
||||||
# Public fork code must never execute automatically on the private runner.
|
# Public fork code must never execute automatically on the private runner.
|
||||||
if: ${{ gitea.event_name != 'pull_request' || gitea.event.pull_request.head.repo.full_name == gitea.repository }}
|
if: ${{ gitea.event_name != 'pull_request' || gitea.event.pull_request.head.repo.full_name == gitea.repository }}
|
||||||
runs-on: ubuntu-latest
|
runs-on: linux-validation
|
||||||
timeout-minutes: 40
|
timeout-minutes: 40
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||||
@@ -50,34 +52,7 @@ jobs:
|
|||||||
echo "Unresolved merge markers detected" >&2
|
echo "Unresolved merge markers detected" >&2
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
# Checkout recreates only `origin`; restore the documented upstream
|
||||||
# MANAGED_FAST_PATH: documentation and this baseline workflow cannot
|
|
||||||
# affect the shipped runtime. Keep the required status check, but do
|
|
||||||
# not install toolchains or execute the full product suite.
|
|
||||||
if [[ -n "${GITHUB_BASE_REF:-}" ]]; then
|
|
||||||
git fetch --no-tags --depth=1 origin "${GITHUB_BASE_REF}"
|
|
||||||
managed_base="origin/${GITHUB_BASE_REF}"
|
|
||||||
git diff --check "${managed_base}..HEAD"
|
|
||||||
mapfile -t managed_changed_files < <(
|
|
||||||
git diff --name-only --diff-filter=ACMR "${managed_base}..HEAD"
|
|
||||||
)
|
|
||||||
managed_runtime_change=0
|
|
||||||
for managed_path in "${managed_changed_files[@]}"; do
|
|
||||||
case "${managed_path}" in
|
|
||||||
*.md|*.mdx|docs/*|.github/ISSUE_TEMPLATE/*|.gitea/ISSUE_TEMPLATE/*|.gitea/runner-scope.sh|.gitea/workflows/managed-validation.yml)
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
managed_runtime_change=1
|
|
||||||
break
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
done
|
|
||||||
if [[ "${#managed_changed_files[@]}" -gt 0 && "${managed_runtime_change}" -eq 0 ]]; then
|
|
||||||
printf 'Managed validation fast path: %s non-runtime file(s); full product suite skipped.\n' \
|
|
||||||
"${#managed_changed_files[@]}"
|
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
fi # Checkout recreates only `origin`; restore the documented upstream
|
|
||||||
# identity required by the fork-boundary guard. The pinned baseline
|
# identity required by the fork-boundary guard. The pinned baseline
|
||||||
# tag is already part of this repository, so no upstream fetch occurs.
|
# tag is already part of this repository, so no upstream fetch occurs.
|
||||||
git remote add upstream https://gitlab.com/CalcProgrammer1/OpenRGB.git
|
git remote add upstream https://gitlab.com/CalcProgrammer1/OpenRGB.git
|
||||||
|
|||||||
+2274
-2269
File diff suppressed because it is too large.
Load diff
@@ -1,76 +1,68 @@
|
|||||||
# LumaOps
|
# LumaOps
|
||||||
|
|
||||||
LumaOps brengt al je ondersteunde RGB-hardware samen in één lokale webinterface.
|
<p align="center"><strong>Local control for the RGB devices you own.</strong></p>
|
||||||
Vanuit je browser beheer je apparaten, ruimtes, groepen, scènes, planningen, back-ups
|
<p align="center"><a href="#interface-tour">Interface tour</a> · <a href="#what-it-does">Capabilities</a> · <a href="#quick-start">Quick start</a> · <a href="#architecture">Architecture</a> · <a href="#deployment-and-hardware">Deployment</a></p>
|
||||||
en diagnostiek. Er is geen cloudaccount nodig: de toepassing, database en
|
|
||||||
hardware-engine draaien samen op je eigen Linux- of Unraid-server.
|
|
||||||
|
|
||||||
> **Release status:** 0.1.0 is een release candidate. Begin met één apparaat en een
|
LumaOps brings supported RGB hardware into one self-hosted web interface. Manage devices, rooms, groups, scenes, schedules, backups and diagnostics from a browser while the application, SQLite database and hardware engine stay on your Linux or Unraid server. No cloud account is required.
|
||||||
> statische kleur op lage helderheid. RGB-protocollen zijn vaak reverse-engineered;
|
|
||||||
> directe hardwarebesturing houdt altijd een beperkt risico in.
|
|
||||||
|
|
||||||
## Wat je krijgt
|
> **Release stage:** 0.1.0 is a release candidate. Start with one device and a low-brightness static colour. Some RGB protocols are reverse engineered; direct hardware control carries a bounded hardware risk.
|
||||||
|
|
||||||
- één responsieve interface voor inventaris, bediening, scènes en automatiseringen;
|
## Interface tour
|
||||||
- lokale opslag in SQLite met controleerbare back-up en restore;
|
|
||||||
- audit- en diagnostiekfuncties zonder ruwe secrets in exports;
|
|
||||||
- OpenRGB 1.0rc3 als ingebedde hardware-engine;
|
|
||||||
- een afgeschermde interne OpenRGB SDK-verbinding op `127.0.0.1:6742`;
|
|
||||||
- expliciete USB-, HID- en I²C-device mappings in plaats van een privileged container.
|
|
||||||
|
|
||||||
Native WLED- en Home Assistant-connectors zijn nog niet inbegrepen in 0.1.0.
|

|
||||||
|
|
||||||
## Snel starten
|
*Devices: inspect the inventory and control options before connecting hardware.*
|
||||||
|
|
||||||
Vereisten: Docker Compose v2, Linux/Unraid x86_64 en toegang tot de benodigde
|

|
||||||
hardware-device nodes.
|
|
||||||
|
*Scenes: organise reusable lighting presets for the devices and rooms you control.*
|
||||||
|
|
||||||
|
Both images show the actual frontend in test mode with synthetic API responses. They contain no real devices, accounts or operational data; they do not demonstrate hardware compatibility. Some interface labels currently remain in Dutch even when English is selected.
|
||||||
|
|
||||||
|
## What it does
|
||||||
|
|
||||||
|
| Area | Capability |
|
||||||
|
| --- | --- |
|
||||||
|
| Device inventory | Discover supported hardware and organise devices by room or group. |
|
||||||
|
| Lighting control | Apply colours, scenes and schedules through a responsive local UI. |
|
||||||
|
| Operations | Inspect diagnostics and audit records; create and restore local backups. |
|
||||||
|
| Hardware boundary | Map only required USB, HID and I²C devices into a non-privileged container. |
|
||||||
|
|
||||||
|
LumaOps embeds **OpenRGB 1.0rc3** as the hardware engine. Its SDK connection stays on `127.0.0.1:6742` inside the container. Native WLED and Home Assistant connectors are not included in 0.1.0.
|
||||||
|
|
||||||
|
## Quick start
|
||||||
|
|
||||||
|
Requirements: Docker Compose v2, Linux or Unraid x86_64, and the device nodes needed by your actual hardware. Inspect `docker-compose.yml` before starting; remove or replace example `/dev/hidraw0` and `/dev/i2c-0` mappings if your host uses different devices.
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
cp .env.example .env
|
cp .env.example .env
|
||||||
# Vervang LUMAOPS_ADMIN_TOKEN in .env door een unieke waarde:
|
openssl rand -base64 32 # put the result in LUMAOPS_ADMIN_TOKEN in .env
|
||||||
openssl rand -base64 32
|
|
||||||
docker compose build
|
docker compose build
|
||||||
docker compose up -d
|
docker compose up -d
|
||||||
```
|
```
|
||||||
|
|
||||||
Open vervolgens `http://SERVER-IP:1223`, meld je aan met de ingestelde beheertoken
|
Open `http://SERVER-IP:1223`, sign in with the token you configured, and complete the setup wizard. Authentication is required because the web interface listens on the LAN by default. Keep `SECURE_COOKIES=false` for direct HTTP on a trusted LAN; set it to `true` behind HTTPS.
|
||||||
en doorloop de setupwizard. De token is standaard verplicht omdat de webinterface
|
|
||||||
op het LAN luistert. Gebruik `SECURE_COOKIES=true` zodra je LumaOps achter HTTPS
|
|
||||||
plaatst; laat dit op `false` voor rechtstreekse HTTP-toegang op een vertrouwd LAN.
|
|
||||||
|
|
||||||
Map alleen de hardware die je werkelijk nodig hebt. Voor netwerkapparaten die
|
## Architecture
|
||||||
broadcast, multicast of mDNS vereisen, staat een gedocumenteerde host-network
|
|
||||||
override klaar:
|
```mermaid
|
||||||
|
flowchart LR
|
||||||
|
Browser[Browser UI] --> API[LumaOps application]
|
||||||
|
API --> DB[(SQLite and app data)]
|
||||||
|
API --> SDK[Loopback OpenRGB SDK]
|
||||||
|
SDK --> Hardware[Explicitly mapped devices]
|
||||||
|
```
|
||||||
|
|
||||||
|
The container has a read-only root filesystem, only bounded writable data and configuration paths, and no privileged mode. The OpenRGB SDK is **not authenticated or encrypted**: never publish port `6742`. Only map hardware nodes the application needs.
|
||||||
|
|
||||||
|
## Deployment and hardware
|
||||||
|
|
||||||
|
Persist `appdata/openrgb/`, `appdata/lumaops/`, `data/` and `logs/`, back up the application state, and test restore before relying on schedules. Use an HTTPS reverse proxy for access beyond a trusted LAN. Hardware that requires broadcast, multicast or mDNS can use the documented host-network override:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
docker compose -f docker-compose.yml -f docker/compose.host-network.yml up -d
|
docker compose -f docker-compose.yml -f docker/compose.host-network.yml up -d
|
||||||
```
|
```
|
||||||
|
|
||||||
Publiceer poort `6742` nooit. Het OpenRGB SDK-protocol heeft zelf geen
|
For device permissions, supported controllers and Unraid setup, see [hardware access](docs/HARDWARE_ACCESS.md) and [Unraid deployment](docs/UNRAID_DEPLOYMENT.md). Operational references include [backup and restore](docs/BACKUP_AND_RESTORE.md), [security](docs/SECURITY.md), [troubleshooting](docs/TROUBLESHOOTING.md) and [testing](docs/TESTING.md).
|
||||||
authenticatie of transportbeveiliging.
|
|
||||||
|
|
||||||
## Documentatie
|
The product application is in `lumaops/`; container integration is in `docker/`; the imported OpenRGB source and changes remain identifiable. LumaOps builds on [OpenRGB](https://openrgb.org) and is distributed under **GPL-2.0-or-later**; see [LICENSE](LICENSE) and [CONTRIBUTING.md](CONTRIBUTING.md).
|
||||||
|
|
||||||
- [Unraid-installatie](docs/UNRAID_DEPLOYMENT.md)
|
|
||||||
- [Hardwaretoegang](docs/HARDWARE_ACCESS.md)
|
|
||||||
- [Back-up en herstel](docs/BACKUP_AND_RESTORE.md)
|
|
||||||
- [Veiligheidsmodel](docs/SECURITY.md)
|
|
||||||
- [Probleemoplossing](docs/TROUBLESHOOTING.md)
|
|
||||||
- [Testen en verificatie](docs/TESTING.md)
|
|
||||||
- [OpenRGB upstream synchroniseren](docs/OPENRGB_UPSTREAM_SYNC.md)
|
|
||||||
- [Gedocumenteerde OpenRGB-corepatches](docs/CORE_PATCHES.md)
|
|
||||||
- [Publieke releasegrens](docs/PUBLIC_RELEASE.md)
|
|
||||||
|
|
||||||
De broncode is bewust als OpenRGB-fork opgebouwd. LumaOps staat onder `lumaops/`,
|
|
||||||
de containerlaag onder `docker/` en projectdocumentatie onder `docs/`.
|
|
||||||
|
|
||||||
## OpenRGB en licentie
|
|
||||||
|
|
||||||
LumaOps bouwt op [OpenRGB](https://openrgb.org), ontwikkeld door de OpenRGB-
|
|
||||||
community. De geïmporteerde 1.0rc3-bron, oorspronkelijke copyrightvermeldingen en
|
|
||||||
licentieteksten blijven behouden. LumaOps en de gecombineerde distributie vallen
|
|
||||||
onder **GPL-2.0-or-later**. Wie images of binaries verspreidt, moet de bijbehorende
|
|
||||||
broncode en wijzigingen onder die licentie beschikbaar maken.
|
|
||||||
|
|
||||||
Zie [LICENSE](LICENSE) voor de volledige licentietekst en [CONTRIBUTING.md](CONTRIBUTING.md)
|
|
||||||
voor de upstream bijdragevoorwaarden.
|
|
||||||
@@ -0,0 +1,45 @@
|
|||||||
|
# Append after docker-compose.yml and docker-compose.unraid.yml. These required
|
||||||
|
# paths are verified cold clones, including the otherwise anonymous /config.
|
||||||
|
# Pass MIGRATION_ENV_FILE as Compose --env-file to preserve interpolation parity.
|
||||||
|
name: lumaops-managed
|
||||||
|
services:
|
||||||
|
lumaops:
|
||||||
|
network_mode: ${MIGRATION_NETWORK:?exact original network required}
|
||||||
|
labels:
|
||||||
|
io.itworx.migration-attempt: ${MIGRATION_ATTEMPT:?journaled migration attempt required}
|
||||||
|
image: ${MIGRATION_IMAGE:?set an attempt-specific candidate image}
|
||||||
|
env_file:
|
||||||
|
- ${MIGRATION_ENV_FILE:?set the protected external runtime env file}
|
||||||
|
build:
|
||||||
|
labels:
|
||||||
|
org.opencontainers.image.source: jens/lumaops
|
||||||
|
org.opencontainers.image.revision: ${MIGRATION_SOURCE_REVISION:?full verified Git commit required}
|
||||||
|
org.opencontainers.image.source-tree: ${MIGRATION_SOURCE_TREE:?verified Git tree required}
|
||||||
|
org.opencontainers.image.version: ${MIGRATION_BUILD_ID:?broker build ID required}
|
||||||
|
org.opencontainers.image.created: ${MIGRATION_BUILD_DATE:?broker UTC build date required}
|
||||||
|
volumes:
|
||||||
|
- type: bind
|
||||||
|
source: ${MIGRATION_CONFIG_ROOT:?verified cold clone of anonymous config volume required}
|
||||||
|
target: /config
|
||||||
|
bind:
|
||||||
|
create_host_path: false
|
||||||
|
- type: bind
|
||||||
|
source: ${MIGRATION_OPENRGB_ROOT:?verified cold clone of openrgb configuration required}
|
||||||
|
target: /config/openrgb
|
||||||
|
bind:
|
||||||
|
create_host_path: false
|
||||||
|
- type: bind
|
||||||
|
source: ${MIGRATION_LUMA_CONFIG_ROOT:?verified cold clone of lumaops configuration required}
|
||||||
|
target: /config/lumaops
|
||||||
|
bind:
|
||||||
|
create_host_path: false
|
||||||
|
- type: bind
|
||||||
|
source: ${MIGRATION_DATA_ROOT:?verified cold clone of application data required}
|
||||||
|
target: /data
|
||||||
|
bind:
|
||||||
|
create_host_path: false
|
||||||
|
- type: bind
|
||||||
|
source: ${MIGRATION_LOGS_ROOT:?verified cold clone of logs required}
|
||||||
|
target: /logs
|
||||||
|
bind:
|
||||||
|
create_host_path: false
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
# Controlled legacy deployment migration
|
||||||
|
|
||||||
|
`docker-compose.migration.yml` is an optional operator override after the base and
|
||||||
|
Unraid Compose files; it does not alter the default deployment. Follow the explicit
|
||||||
|
ProjectBrain `scripts/legacy-deployment-migration/` transaction, not a normal retry.
|
||||||
|
|
||||||
|
Every writable mount must be cold-cloned after the original container stops:
|
||||||
|
the anonymous `/config` volume, `/config/openrgb`, `/config/lumaops`, `/data` and
|
||||||
|
`/logs`. Required migration variables point only to those verified clones.
|
||||||
|
Original data, immutable image and container are retained for rollback.
|
||||||
|
|
||||||
|
The override requires immutable build metadata, an attempt-specific image and
|
||||||
|
container ownership label. Missing variables fail closed; missing mount sources
|
||||||
|
are not silently created. Preserve runtime environment and device/security settings.
|
||||||
|
Commit the new broker configuration only after verifying health, HTTP behavior
|
||||||
|
and the actual receipt. Never fabricate the old image's unknown source revision.
|
||||||
|
|
||||||
|
Real offline Compose rendering tests verify merged mounts and missing-variable
|
||||||
|
rejection. This file alone does not prove a completed production migration.
|
||||||
|
|
||||||
|
`MIGRATION_NETWORK` is mandatory and must preserve the inspected existing
|
||||||
|
`lumaops_default` network, overriding the normal Unraid bridge setting only for
|
||||||
|
this migration. Device bindings, capabilities, root filesystem protection,
|
||||||
|
security options and tmpfs are validated against the original before cutover.
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
# Image provenance
|
||||||
|
|
||||||
|
`devices-demo.png` was captured from the real LumaOps Vite frontend at 1440 × 900 pixels. A local browser intercepted the API and supplied three explicitly synthetic RGB devices in test mode. The screenshot contains no real hardware, account or infrastructure data. It illustrates the interface; it does not prove hardware integration or deployment readiness.
|
||||||
|
|
||||||
|
`scenes-demo.png` was captured from the same frontend and browser session at 1440 × 900 pixels. The intercepted API supplied three synthetic lighting scenes in test mode. The image illustrates scene management; no physical lights were controlled.
|
||||||
Binary file not shown.
|
After Width: | Height: | Size: 167 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 189 KiB |
@@ -27,6 +27,7 @@ git -C "$ROOT_DIR" archive --format=tar HEAD | tar -xf - -C "$OUTPUT_DIR"
|
|||||||
|
|
||||||
# Production deployment dispatch belongs to the private operations repository.
|
# Production deployment dispatch belongs to the private operations repository.
|
||||||
rm -f "$OUTPUT_DIR/.gitea/workflows/unraid-deploy.yml"
|
rm -f "$OUTPUT_DIR/.gitea/workflows/unraid-deploy.yml"
|
||||||
|
rm -f "$OUTPUT_DIR/.gitea/workflows/public-source-sync.yml"
|
||||||
|
|
||||||
for forbidden in \
|
for forbidden in \
|
||||||
'.env' '*.pem' '*.key' '*.p12' '*.pfx' '*.db' '*.sqlite' '*.sqlite3' \
|
'.env' '*.pem' '*.key' '*.p12' '*.pfx' '*.db' '*.sqlite' '*.sqlite3' \
|
||||||
|
|||||||
Regular → Executable
File mode changed.
Reference in new issue
Block a user