Skip to content

Latest commit

 

History

6 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 

Repository files navigation

GonoPBX icon

CI-GonoPBX

Build pipeline that publishes container images for GonoPBX — an open-source Asterisk PBX web GUI — to ghcr.io/companionintelligence so it can be listed in CI-Marketplace (see issue #700, PR #703).

Why this repo exists

GonoPBX has no official pre-built images upstream — it's designed to be deployed by docker compose build-ing its asterisk/, backend/, and frontend/ directories from source. Every app in the CI-Marketplace catalog references a pre-built, tagged image, so this repo exists solely to check out a pinned upstream ref and build+push those three images. It does not vendor or modify GonoPBX's source — the workflow checks out ankaios76/gonopbx directly at build time.

What gets published

Image Upstream source dir Notes
ghcr.io/companionintelligence/gonopbx-frontend frontend/ React UI + nginx; nginx proxies /api and /ws to a service literally named backend, so the CI-Marketplace compose must keep that service name
ghcr.io/companionintelligence/gonopbx-backend backend/ FastAPI backend
ghcr.io/companionintelligence/gonopbx-asterisk asterisk/ Asterisk 20 (andrius/asterisk:20 base) with GonoPBX's sound/config overlay

Images are tagged to match the upstream git tag being built (e.g. v2.1.1), matching the version pinned in CI-Marketplace/apps/gonopbx/config.json.

⚠️ Licensing — needs a look before publishing

Upstream's README states the project is "open source and available under the MIT License," but no LICENSE file actually exists in the upstream repo (confirmed via GitHub's repo API and a direct 404 on /LICENSE). The stated intent is clearly MIT, but there's no committed license text to point to. Before treating these published images as freely redistributable, either:

  • Open an issue/PR upstream (ankaios76/gonopbx) asking them to commit the missing LICENSE file, or
  • Get explicit confirmation from the maintainer some other way,

and link the resolution here.

Screenshots

Pulled from upstream's own website/screenshots (linked directly from issue #700); mirrored here and in the CI-Marketplace store listing gallery.

Dashboard Extensions
Dashboard Extensions
SIP trunks Call history
SIP trunks Call history

Architecture

Four containers per install, isolated on their own compose network. Only the frontend goes through Hub's Traefik proxy — Asterisk needs direct UDP/TCP access for SIP and RTP, which can't go through an HTTP reverse proxy.

flowchart TB
    subgraph ext["External"]
        PHONE["SIP Phones / Softphones"]
        TRUNK["SIP Trunk Provider"]
        ADMIN["Admin Browser"]
    end

    subgraph hub["CI Hub"]
        TRAEFIK["Traefik reverse proxy"]
    end

    subgraph app["gonopbx app (isolated compose network)"]
        FE["gonopbx (frontend)<br/>nginx + React :80"]
        BE["backend<br/>FastAPI :8000"]
        AST["asterisk<br/>Asterisk 20<br/>:5060 SIP / :10000-10100 RTP"]
        PG[("postgres<br/>asterisk_gui")]
        VOL[("shared volume<br/>/etc/asterisk/custom")]
    end

    ADMIN -->|HTTPS| TRAEFIK --> FE
    FE -->|"/api, /ws"| BE
    BE -->|"AMI :5038"| AST
    BE -->|SQL| PG
    BE -. writes pjsip config .-> VOL
    VOL -. read on boot .-> AST
    PHONE -->|"SIP :5060"| AST
    TRUNK -->|"SIP :5060"| AST
    PHONE <-->|"RTP :10000-10100"| AST
    TRUNK <-->|"RTP :10000-10100"| AST
Loading

Call signaling and CDR logging for a typical inbound call:

sequenceDiagram
    participant Trunk as SIP Trunk
    participant Ast as asterisk
    participant Ext as Extension (SIP phone)
    participant BE as backend
    participant DB as postgres

    Trunk->>Ast: INVITE (inbound call, DID)
    Ast->>Ast: match DID -> ring group / IVR
    Ast->>Ext: INVITE (ring)
    Ext-->>Ast: 200 OK (answered)
    Ast-->>Trunk: 200 OK
    Note over Trunk,Ext: RTP media flows directly through Asterisk
    Ast->>BE: AMI event (call state)
    BE->>DB: write call detail record
    Ast->>Ext: BYE (call ends)
    Ast->>BE: AMI event (hangup)
    BE->>DB: update CDR
Loading

Triggering a build

.github/workflows/build-images.yml is manually triggered (workflow_dispatch) with a gonopbx_ref input (the upstream git tag/ref to build, e.g. v2.1.1). It builds all three images and pushes them tagged with that ref.

Known gap: the asterisk image's base (andrius/asterisk:20) isn't confirmed to support arm64. The workflow attempts multi-arch (amd64,arm64) for all three images — if the asterisk build fails on arm64, drop it from that job's platform list and update supported_architectures in the CI-Marketplace manifest accordingly.

After a successful build

  1. Confirm all three images pulled successfully on both architectures you intend to support.
  2. Flip available: true in CI-Marketplace/apps/gonopbx/config.json.
  3. Run scripts/verify-app.sh --slug gonopbx against a real Hub instance from the CI-Marketplace repo.

Icon

The store icon (docs/assets/icon.png, source docs/assets/icon.svg) is an original vector redraw of GonoPBX's own mark — the broken ring of connected nodes represents extensions/endpoints meshed through the PBX hub, and the center star nods to Asterisk (the engine underneath, and literally "a little star"). The original upstream logo is a wide wordmark lockup (docs/assets/wordmark.png) that doesn't crop cleanly to the square tile CI-Marketplace store listings need, so this repo maintains a proper square icon derived from the same visual language instead.

About

Build pipeline: publishes GonoPBX (ankaios76/gonopbx) Docker images to ghcr.io/companionintelligence for the CI-Marketplace catalog

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors