RF.Fusion is a spectrum-monitoring integration platform built to do three practical jobs well:
- collect files from remote monitoring stations
- catalog processed spectra and repository artifacts
- expose operational and analytical views through a web interface
At runtime, the project revolves around three main pieces:
appCataloga- MariaDB with
BPDATAandRFDATA webfusion
OpenVPN, nginx, Zabbix, Grafana and deployment scripts support that core, but the day-to-day behavior of the system lives in those three areas.
In practical terms, the active workflow is:
- monitoring stations generate raw files
appCatalogadiscovers and backs them up intoreposfiappCatalogaprocesses them locally or throughappAnaliseBPDATAstores operational state and lifecycle historyRFDATAstores sites, files, equipment and spectrawebfusionreads both databases and exposes the operator-facing workflow
This split is intentional:
-
BPDATAanswers operational questions- which host is online?
- which host task is pending?
- which file failed backup or processing?
-
RFDATAanswers analytical questions- where was a spectrum measured?
- which equipment produced it?
- which repository file contains it?
RF.Fusion was designed for a distributed monitoring environment with remote stations, central processing, shared storage and browser-based operational inspection.
If you want one picture that explains the runtime at a glance, start here.
Reading the diagram from left to right:
- remote stations and manual uploads feed the platform
appCatalogaorchestrates discovery, backup, processing and cleanupappAnalisecan export final artifacts that RF.Fusion later validates semantically- MariaDB splits operational state into
BPDATAand analytical state intoRFDATA webfusionqueries both worlds and exposes the operator-facing views
The diagrams below are still useful, but they are more infrastructure-oriented.
The current platform-level organization is represented below.
appCataloga is the operational core of RF.Fusion.
It is responsible for:
- host registration and orchestration
- discovery of remote files
- backup to the shared repository
- local processing and
appAnalise-based processing - metadata publication
- garbage collection of quarantined artifacts
Main documentation:
webfusion is the browser interface.
It currently provides:
- the Brazil-centered station map
- spectrum and file queries
- host and server inspection pages
- manual host-check request creation
- repository-backed downloads, preferably served directly by
nginx
Main documentation:
MariaDB is split into the two project databases described above.
Main documentation:
These are the contracts that matter most when changing code.
These are not the same thing.
-
HOSTinBPDATAis an operational object- connectivity
- busy state
- discovery / backup orchestration
- Zabbix-facing lifecycle
-
DIM_SPECTRUM_SITEinRFDATAis a measurement locality- centroid in
GEO_POINT - optional mobile geometry in
GEOGRAPHIC_PATH - administrative geography
- centroid in
-
DIM_SPECTRUM_EQUIPMENTinRFDATAis the receiver identity carried by the payload
This distinction matters because a measurement can exist without a meaningful
HOST correlation, especially for mobile or manually imported data.
The system uses two databases with different responsibilities.
-
BPDATAHOSTHOST_TASKFILE_TASKFILE_TASK_HISTORY
-
RFDATA- site dimensions
- file dimensions
- procedure / detector / unit / trace dimensions
- spectrum equipment
FACT_SPECTRUM- bridge tables
Operational state should not leak into RFDATA, and measurement semantics
should not be forced into BPDATA.
HOST_TASK is treated as durable workflow state, not as an append-only log of
endlessly created rows.
Current contract:
- one logical row per
FK_HOST + NU_TYPE - the backend refreshes timestamps, status and filter instead of creating a new row every time
- running tasks are preserved instead of being silently overwritten
webfusionfollows the backend queue contract instead of maintaining a second scheduling logic
In practice:
- backend internal tasks such as connection checks and statistics refresh still exist
- the
webfusionUI only exposes the conventional host-check entrypoint
FILE_TASK is transient workflow state.
FILE_TASK_HISTORY is the authoritative lifecycle record.
That means:
FILE_TASKcan be created, updated, suspended, resumed or deletedFILE_TASK_HISTORYis the record operators and garbage collection reason about- the garbage collector only marks deletion for the artifact currently referenced by
FILE_TASK_HISTORY
The shared repository under /mnt/reposfi is part of the workflow contract.
Current artifact semantics:
- canonical errored artifacts live under
trash/ - superseded source artifacts live under
trash/resolved_files/ - successful exported artifacts live in their final repository path
This distinction matters for appAnalise flows:
- when
appAnaliseexports a final artifact and RF.Fusion later rejects it semantically, the exported artifact becomes the error artifact - the original source file becomes a resolved input and moves to
resolved_files
The appAnalise path is no longer modeled as "one site per file".
Current behavior:
- site resolution is per spectrum
- equipment comes from the payload receiver per spectrum
- bad spectra are discarded selectively when possible
- the whole file only fails when no valid spectra remain
DIM_SPECTRUM_FILEremains the file artifact dimensionFACT_SPECTRUMcarries locality, equipment and timeBRIDGE_SPECTRUM_FILElinks both worlds
This is what allows mixed or aggregated payloads to be persisted honestly.
The current top-level structure is:
RF.Fusion/
├── data/ # project data area
├── docs/ # diagrams and reference docs
├── install/ # deployment material
├── src/ # application and service source code
├── test/ # active validation suite
└── LICENSE
Important subtrees:
install/appCatalogainstall/mariaDBinstall/webserversrc/appCatalogasrc/webfusionsrc/mariadb/scriptstest/
If you are new to the repository, this order works well:
- read this
README.md - read appCataloga overview
- read webfusion README
- read the install docs for the container you want to deploy
- run the active tests before making structural changes
The repository is currently documented around the Linux/Podman deployment flow.
Main entry points:
Typical deployment order:
- deploy MariaDB
- deploy the
appCatalogaruntime container - deploy the web container
- start the
appCatalogaworkers inside the mounted runtime
The appCataloga container provides the runtime environment, not the whole
orchestration by itself.
Once the container is available, the practical worker scripts live under:
Useful operational helpers:
MariaDB deployment initializes the project schemas:
BPDATAfromcreateProcessingDB-v9.sqlRFDATAfromcreateMeasureDB-v5.sql
The schema scripts live under:
The web container publishes webfusion behind nginx and waitress.
It is the preferred entry point for:
- map and host inspection
- spectrum and file queries
- manual host-check creation
- repository-backed downloads
There is more than one valid way to run the project, but the practical paths today are these:
cd /RFFusion/test
pytest tests -qMore details:
From inside the prepared appCataloga runtime:
cd /RFFusion/src/appCataloga/server_volume/usr/local/bin/appCataloga
./tool_start_all.shCheck status:
./tool_status_all.shStop:
./tool_stop_all.shThe supported path today is the documented web container deployment:
The metadata publication worker is part of the appCataloga stack:
It exports Parquet snapshots from RFDATA for downstream consumption.
The active suite lives under test/.
Current entry points include:
test/tests/sharedtest/tests/stationstest/tests/workerstest/tests/dbtest/tests/webfusion
Typical execution:
cd /RFFusion/test
pytest tests -qThese are the project practices that currently matter most.
- Keep
BPDATAoperational andRFDATAanalytical. - Treat
HOST,SITEandEQUIPMENTas different concepts. - Do not reintroduce "one site per file" assumptions into the appAnalise path.
- Prefer updating durable workflow state instead of creating new queue rows unnecessarily.
- Treat
FILE_TASK_HISTORYas the source of truth for lifecycle inspection. - Preserve the artifact contract between final path,
trash/andtrash/resolved_files/. - When changing queue behavior, make
webfusionfollow the backend contract instead of inventing a second one. - When changing worker behavior, update tests and README together.
- Prefer the active workers, handlers and tests over old assumptions from historical code.
The repository is active and functional, but it still mixes mature operational code with inherited historical structure and naming.
In practical terms:
appCatalogais the strongest and most actively maintained part of the system- the worker and garbage-collection contracts are much more explicit than before
webfusionis no longer just a thin query page; it is a real operational UI- some naming still reflects older stages of the project and may lag behind current behavior
When in doubt:
- trust the active workers over archived assumptions
- trust the current database handlers over old queue logic
- trust the active tests and refreshed READMEs over stale historical context
Contributions are welcome, especially when they improve:
- operational robustness
- documentation quality
- test coverage
- schema clarity
- maintainability of the worker pipeline
Distributed under the GNU General Public License (GPL), version 3.
See: