From 482d4ff1b8b55a2c45276fcfcdf5fb4608bc322a Mon Sep 17 00:00:00 2001 From: ReachableCEO Date: Thu, 2 Oct 2025 12:07:09 -0500 Subject: [PATCH] Scaffold Cloudron packaging workspace and automation --- .gitea/workflows/ci.yml | 26 ++ .gitignore | 4 + GEMINI/AUDIT-SNAPSHOT1.md | 74 ++++ Makefile | 16 + README.md | 129 ++++++- STARTHERE.md | 177 ++++++++++ apps/apache-apisix/CloudronManifest.json | 20 ++ apps/apache-apisix/Dockerfile | 22 ++ apps/apache-apisix/README.md | 20 ++ apps/apache-apisix/app/.gitkeep | 0 apps/apache-apisix/metadata.json | 9 + apps/apache-apisix/start.sh | 8 + apps/apache-apisix/test/smoke.sh | 16 + apps/autobom/CloudronManifest.json | 20 ++ apps/autobom/Dockerfile | 22 ++ apps/autobom/README.md | 20 ++ apps/autobom/app/.gitkeep | 0 apps/autobom/metadata.json | 9 + apps/autobom/start.sh | 8 + apps/autobom/test/smoke.sh | 16 + apps/catalog.json | 335 +++++++++++++++++++ apps/chirpstack/CloudronManifest.json | 20 ++ apps/chirpstack/Dockerfile | 22 ++ apps/chirpstack/README.md | 20 ++ apps/chirpstack/app/.gitkeep | 0 apps/chirpstack/metadata.json | 9 + apps/chirpstack/start.sh | 8 + apps/chirpstack/test/smoke.sh | 16 + apps/consuldemocracy/CloudronManifest.json | 20 ++ apps/consuldemocracy/Dockerfile | 22 ++ apps/consuldemocracy/README.md | 20 ++ apps/consuldemocracy/app/.gitkeep | 0 apps/consuldemocracy/metadata.json | 9 + apps/consuldemocracy/start.sh | 8 + apps/consuldemocracy/test/smoke.sh | 16 + apps/craig/CloudronManifest.json | 20 ++ apps/craig/Dockerfile | 22 ++ apps/craig/README.md | 20 ++ apps/craig/app/.gitkeep | 0 apps/craig/metadata.json | 9 + apps/craig/start.sh | 8 + apps/craig/test/smoke.sh | 16 + apps/database-gateway/CloudronManifest.json | 20 ++ apps/database-gateway/Dockerfile | 22 ++ apps/database-gateway/README.md | 20 ++ apps/database-gateway/app/.gitkeep | 0 apps/database-gateway/metadata.json | 9 + apps/database-gateway/start.sh | 8 + apps/database-gateway/test/smoke.sh | 16 + apps/datahub/CloudronManifest.json | 20 ++ apps/datahub/Dockerfile | 22 ++ apps/datahub/README.md | 20 ++ apps/datahub/app/.gitkeep | 0 apps/datahub/metadata.json | 9 + apps/datahub/start.sh | 8 + apps/datahub/test/smoke.sh | 16 + apps/docassemble/CloudronManifest.json | 20 ++ apps/docassemble/Dockerfile | 22 ++ apps/docassemble/README.md | 20 ++ apps/docassemble/app/.gitkeep | 0 apps/docassemble/metadata.json | 9 + apps/docassemble/start.sh | 8 + apps/docassemble/test/smoke.sh | 16 + apps/docker-webhook/CloudronManifest.json | 20 ++ apps/docker-webhook/Dockerfile | 22 ++ apps/docker-webhook/README.md | 20 ++ apps/docker-webhook/app/.gitkeep | 0 apps/docker-webhook/metadata.json | 9 + apps/docker-webhook/start.sh | 8 + apps/docker-webhook/test/smoke.sh | 16 + apps/drawio/CloudronManifest.json | 20 ++ apps/drawio/Dockerfile | 22 ++ apps/drawio/README.md | 20 ++ apps/drawio/app/.gitkeep | 0 apps/drawio/metadata.json | 9 + apps/drawio/start.sh | 8 + apps/drawio/test/smoke.sh | 16 + apps/easy-gate/CloudronManifest.json | 20 ++ apps/easy-gate/Dockerfile | 22 ++ apps/easy-gate/README.md | 20 ++ apps/easy-gate/app/.gitkeep | 0 apps/easy-gate/metadata.json | 9 + apps/easy-gate/start.sh | 8 + apps/easy-gate/test/smoke.sh | 16 + apps/elabftw/CloudronManifest.json | 20 ++ apps/elabftw/Dockerfile | 22 ++ apps/elabftw/README.md | 20 ++ apps/elabftw/app/.gitkeep | 0 apps/elabftw/metadata.json | 9 + apps/elabftw/start.sh | 8 + apps/elabftw/test/smoke.sh | 16 + apps/fleetdm-fleet/CloudronManifest.json | 20 ++ apps/fleetdm-fleet/Dockerfile | 22 ++ apps/fleetdm-fleet/README.md | 20 ++ apps/fleetdm-fleet/app/.gitkeep | 0 apps/fleetdm-fleet/metadata.json | 9 + apps/fleetdm-fleet/start.sh | 8 + apps/fleetdm-fleet/test/smoke.sh | 16 + apps/fonoster/CloudronManifest.json | 20 ++ apps/fonoster/Dockerfile | 22 ++ apps/fonoster/README.md | 20 ++ apps/fonoster/app/.gitkeep | 0 apps/fonoster/metadata.json | 9 + apps/fonoster/start.sh | 8 + apps/fonoster/test/smoke.sh | 16 + apps/grist/CloudronManifest.json | 20 ++ apps/grist/Dockerfile | 22 ++ apps/grist/README.md | 20 ++ apps/grist/app/.gitkeep | 0 apps/grist/metadata.json | 9 + apps/grist/start.sh | 8 + apps/grist/test/smoke.sh | 16 + apps/healthchecks/CloudronManifest.json | 20 ++ apps/healthchecks/Dockerfile | 22 ++ apps/healthchecks/README.md | 20 ++ apps/healthchecks/app/.gitkeep | 0 apps/healthchecks/metadata.json | 9 + apps/healthchecks/start.sh | 8 + apps/healthchecks/test/smoke.sh | 16 + apps/huginn/CloudronManifest.json | 20 ++ apps/huginn/Dockerfile | 22 ++ apps/huginn/README.md | 20 ++ apps/huginn/app/.gitkeep | 0 apps/huginn/metadata.json | 9 + apps/huginn/start.sh | 8 + apps/huginn/test/smoke.sh | 16 + apps/hyperswitch/CloudronManifest.json | 20 ++ apps/hyperswitch/Dockerfile | 22 ++ apps/hyperswitch/README.md | 20 ++ apps/hyperswitch/app/.gitkeep | 0 apps/hyperswitch/metadata.json | 9 + apps/hyperswitch/start.sh | 8 + apps/hyperswitch/test/smoke.sh | 16 + apps/inventree/CloudronManifest.json | 20 ++ apps/inventree/Dockerfile | 22 ++ apps/inventree/README.md | 20 ++ apps/inventree/app/.gitkeep | 0 apps/inventree/metadata.json | 9 + apps/inventree/start.sh | 8 + apps/inventree/test/smoke.sh | 16 + apps/jamovi/CloudronManifest.json | 20 ++ apps/jamovi/Dockerfile | 22 ++ apps/jamovi/README.md | 20 ++ apps/jamovi/app/.gitkeep | 0 apps/jamovi/metadata.json | 9 + apps/jamovi/start.sh | 8 + apps/jamovi/test/smoke.sh | 16 + apps/jenkins/CloudronManifest.json | 20 ++ apps/jenkins/Dockerfile | 22 ++ apps/jenkins/README.md | 20 ++ apps/jenkins/app/.gitkeep | 0 apps/jenkins/metadata.json | 9 + apps/jenkins/start.sh | 8 + apps/jenkins/test/smoke.sh | 16 + apps/kibot/CloudronManifest.json | 20 ++ apps/kibot/Dockerfile | 22 ++ apps/kibot/README.md | 20 ++ apps/kibot/app/.gitkeep | 0 apps/kibot/metadata.json | 9 + apps/kibot/start.sh | 8 + apps/kibot/test/smoke.sh | 16 + apps/killbill/CloudronManifest.json | 20 ++ apps/killbill/Dockerfile | 22 ++ apps/killbill/README.md | 20 ++ apps/killbill/app/.gitkeep | 0 apps/killbill/metadata.json | 9 + apps/killbill/start.sh | 8 + apps/killbill/test/smoke.sh | 16 + apps/langfuse/CloudronManifest.json | 20 ++ apps/langfuse/Dockerfile | 22 ++ apps/langfuse/README.md | 20 ++ apps/langfuse/app/.gitkeep | 0 apps/langfuse/metadata.json | 9 + apps/langfuse/start.sh | 8 + apps/langfuse/test/smoke.sh | 16 + apps/manyfold/CloudronManifest.json | 20 ++ apps/manyfold/Dockerfile | 22 ++ apps/manyfold/README.md | 20 ++ apps/manyfold/app/.gitkeep | 0 apps/manyfold/metadata.json | 9 + apps/manyfold/start.sh | 8 + apps/manyfold/test/smoke.sh | 16 + apps/mender-server/CloudronManifest.json | 20 ++ apps/mender-server/Dockerfile | 22 ++ apps/mender-server/README.md | 20 ++ apps/mender-server/app/.gitkeep | 0 apps/mender-server/metadata.json | 9 + apps/mender-server/start.sh | 8 + apps/mender-server/test/smoke.sh | 16 + apps/midday/CloudronManifest.json | 20 ++ apps/midday/Dockerfile | 22 ++ apps/midday/README.md | 20 ++ apps/midday/app/.gitkeep | 0 apps/midday/metadata.json | 9 + apps/midday/start.sh | 8 + apps/midday/test/smoke.sh | 16 + apps/mirlo/CloudronManifest.json | 20 ++ apps/mirlo/Dockerfile | 22 ++ apps/mirlo/README.md | 20 ++ apps/mirlo/app/.gitkeep | 0 apps/mirlo/metadata.json | 9 + apps/mirlo/start.sh | 8 + apps/mirlo/test/smoke.sh | 16 + apps/nautilus-trader/CloudronManifest.json | 20 ++ apps/nautilus-trader/Dockerfile | 22 ++ apps/nautilus-trader/README.md | 20 ++ apps/nautilus-trader/app/.gitkeep | 0 apps/nautilus-trader/metadata.json | 9 + apps/nautilus-trader/start.sh | 8 + apps/nautilus-trader/test/smoke.sh | 16 + apps/netbox-docker/CloudronManifest.json | 20 ++ apps/netbox-docker/Dockerfile | 22 ++ apps/netbox-docker/README.md | 20 ++ apps/netbox-docker/app/.gitkeep | 0 apps/netbox-docker/metadata.json | 9 + apps/netbox-docker/start.sh | 8 + apps/netbox-docker/test/smoke.sh | 16 + apps/openblocks/CloudronManifest.json | 20 ++ apps/openblocks/Dockerfile | 22 ++ apps/openblocks/README.md | 20 ++ apps/openblocks/app/.gitkeep | 0 apps/openblocks/metadata.json | 9 + apps/openblocks/start.sh | 8 + apps/openblocks/test/smoke.sh | 16 + apps/openboxes-docker/CloudronManifest.json | 20 ++ apps/openboxes-docker/Dockerfile | 22 ++ apps/openboxes-docker/README.md | 20 ++ apps/openboxes-docker/app/.gitkeep | 0 apps/openboxes-docker/metadata.json | 9 + apps/openboxes-docker/start.sh | 8 + apps/openboxes-docker/test/smoke.sh | 16 + apps/openfile/CloudronManifest.json | 20 ++ apps/openfile/Dockerfile | 22 ++ apps/openfile/README.md | 20 ++ apps/openfile/app/.gitkeep | 0 apps/openfile/metadata.json | 9 + apps/openfile/start.sh | 8 + apps/openfile/test/smoke.sh | 16 + apps/payroll-engine/CloudronManifest.json | 20 ++ apps/payroll-engine/Dockerfile | 22 ++ apps/payroll-engine/README.md | 20 ++ apps/payroll-engine/app/.gitkeep | 0 apps/payroll-engine/metadata.json | 9 + apps/payroll-engine/start.sh | 8 + apps/payroll-engine/test/smoke.sh | 16 + apps/plmore/CloudronManifest.json | 20 ++ apps/plmore/Dockerfile | 22 ++ apps/plmore/README.md | 20 ++ apps/plmore/app/.gitkeep | 0 apps/plmore/metadata.json | 9 + apps/plmore/start.sh | 8 + apps/plmore/test/smoke.sh | 16 + apps/puter/CloudronManifest.json | 20 ++ apps/puter/Dockerfile | 22 ++ apps/puter/README.md | 20 ++ apps/puter/app/.gitkeep | 0 apps/puter/metadata.json | 9 + apps/puter/start.sh | 8 + apps/puter/test/smoke.sh | 16 + apps/rathole/CloudronManifest.json | 20 ++ apps/rathole/Dockerfile | 22 ++ apps/rathole/README.md | 20 ++ apps/rathole/app/.gitkeep | 0 apps/rathole/metadata.json | 9 + apps/rathole/start.sh | 8 + apps/rathole/test/smoke.sh | 16 + apps/resgrid/CloudronManifest.json | 20 ++ apps/resgrid/Dockerfile | 22 ++ apps/resgrid/README.md | 20 ++ apps/resgrid/app/.gitkeep | 0 apps/resgrid/metadata.json | 9 + apps/resgrid/start.sh | 8 + apps/resgrid/test/smoke.sh | 16 + apps/reviewboard/CloudronManifest.json | 20 ++ apps/reviewboard/Dockerfile | 22 ++ apps/reviewboard/README.md | 20 ++ apps/reviewboard/app/.gitkeep | 0 apps/reviewboard/metadata.json | 9 + apps/reviewboard/start.sh | 8 + apps/reviewboard/test/smoke.sh | 16 + apps/rundeck/CloudronManifest.json | 20 ++ apps/rundeck/Dockerfile | 22 ++ apps/rundeck/README.md | 20 ++ apps/rundeck/app/.gitkeep | 0 apps/rundeck/metadata.json | 9 + apps/rundeck/start.sh | 8 + apps/rundeck/test/smoke.sh | 16 + apps/runme/CloudronManifest.json | 20 ++ apps/runme/Dockerfile | 22 ++ apps/runme/README.md | 20 ++ apps/runme/app/.gitkeep | 0 apps/runme/metadata.json | 9 + apps/runme/start.sh | 8 + apps/runme/test/smoke.sh | 16 + apps/satnogs-kaitai/CloudronManifest.json | 20 ++ apps/satnogs-kaitai/Dockerfile | 22 ++ apps/satnogs-kaitai/README.md | 20 ++ apps/satnogs-kaitai/app/.gitkeep | 0 apps/satnogs-kaitai/metadata.json | 9 + apps/satnogs-kaitai/start.sh | 8 + apps/satnogs-kaitai/test/smoke.sh | 16 + apps/satnogs-webgui/CloudronManifest.json | 20 ++ apps/satnogs-webgui/Dockerfile | 22 ++ apps/satnogs-webgui/README.md | 20 ++ apps/satnogs-webgui/app/.gitkeep | 0 apps/satnogs-webgui/metadata.json | 9 + apps/satnogs-webgui/start.sh | 8 + apps/satnogs-webgui/test/smoke.sh | 16 + apps/sdrangel/CloudronManifest.json | 20 ++ apps/sdrangel/Dockerfile | 22 ++ apps/sdrangel/README.md | 20 ++ apps/sdrangel/app/.gitkeep | 0 apps/sdrangel/metadata.json | 9 + apps/sdrangel/start.sh | 8 + apps/sdrangel/test/smoke.sh | 16 + apps/seatunnel/CloudronManifest.json | 20 ++ apps/seatunnel/Dockerfile | 22 ++ apps/seatunnel/README.md | 20 ++ apps/seatunnel/app/.gitkeep | 0 apps/seatunnel/metadata.json | 9 + apps/seatunnel/start.sh | 8 + apps/seatunnel/test/smoke.sh | 16 + apps/signoz/CloudronManifest.json | 20 ++ apps/signoz/Dockerfile | 22 ++ apps/signoz/README.md | 20 ++ apps/signoz/app/.gitkeep | 0 apps/signoz/metadata.json | 9 + apps/signoz/start.sh | 8 + apps/signoz/test/smoke.sh | 16 + apps/slurm/CloudronManifest.json | 20 ++ apps/slurm/Dockerfile | 22 ++ apps/slurm/README.md | 20 ++ apps/slurm/app/.gitkeep | 0 apps/slurm/metadata.json | 11 + apps/slurm/start.sh | 8 + apps/slurm/test/smoke.sh | 16 + apps/sniperphish/CloudronManifest.json | 20 ++ apps/sniperphish/Dockerfile | 22 ++ apps/sniperphish/README.md | 20 ++ apps/sniperphish/app/.gitkeep | 0 apps/sniperphish/metadata.json | 9 + apps/sniperphish/start.sh | 8 + apps/sniperphish/test/smoke.sh | 16 + apps/swupdate/CloudronManifest.json | 20 ++ apps/swupdate/Dockerfile | 22 ++ apps/swupdate/README.md | 20 ++ apps/swupdate/app/.gitkeep | 0 apps/swupdate/metadata.json | 9 + apps/swupdate/start.sh | 8 + apps/swupdate/test/smoke.sh | 16 + apps/tak-server/CloudronManifest.json | 20 ++ apps/tak-server/Dockerfile | 22 ++ apps/tak-server/README.md | 20 ++ apps/tak-server/app/.gitkeep | 0 apps/tak-server/metadata.json | 9 + apps/tak-server/start.sh | 8 + apps/tak-server/test/smoke.sh | 16 + apps/target-goalert/CloudronManifest.json | 20 ++ apps/target-goalert/Dockerfile | 22 ++ apps/target-goalert/README.md | 20 ++ apps/target-goalert/app/.gitkeep | 0 apps/target-goalert/metadata.json | 9 + apps/target-goalert/start.sh | 8 + apps/target-goalert/test/smoke.sh | 16 + apps/warp/CloudronManifest.json | 20 ++ apps/warp/Dockerfile | 22 ++ apps/warp/README.md | 20 ++ apps/warp/app/.gitkeep | 0 apps/warp/metadata.json | 9 + apps/warp/start.sh | 8 + apps/warp/test/smoke.sh | 16 + apps/windmill/CloudronManifest.json | 20 ++ apps/windmill/Dockerfile | 22 ++ apps/windmill/README.md | 20 ++ apps/windmill/app/.gitkeep | 0 apps/windmill/metadata.json | 9 + apps/windmill/start.sh | 8 + apps/windmill/test/smoke.sh | 16 + apps/wireflow/CloudronManifest.json | 20 ++ apps/wireflow/Dockerfile | 22 ++ apps/wireflow/README.md | 20 ++ apps/wireflow/app/.gitkeep | 0 apps/wireflow/metadata.json | 9 + apps/wireflow/start.sh | 8 + apps/wireflow/test/smoke.sh | 16 + apps/wireviz-web/CloudronManifest.json | 20 ++ apps/wireviz-web/Dockerfile | 22 ++ apps/wireviz-web/README.md | 20 ++ apps/wireviz-web/app/.gitkeep | 0 apps/wireviz-web/metadata.json | 9 + apps/wireviz-web/start.sh | 8 + apps/wireviz-web/test/smoke.sh | 16 + docker/ci-runner/Dockerfile | 26 ++ docker/packager/Dockerfile | 34 ++ docs/APP_STATUS.md | 61 ++++ docs/CI_CD_GITEA.md | 35 ++ docs/LOCAL_TESTING.md | 33 ++ docs/PACKAGING_GUIDE.md | 82 +++++ docs/PRIORITY_MILESTONES.md | 49 +++ scripts/ci_local.sh | 83 +++++ scripts/generate_status.py | 75 +++++ scripts/hooks/install_hooks.sh | 16 + scripts/hooks/post-commit | 11 + scripts/hooks/pre-commit | 11 + scripts/hooks/pre-push | 11 + scripts/lint_repo.py | 96 ++++++ scripts/new_app.py | 126 +++++++ scripts/run_packager.sh | 16 + templates/cloudron-app/CloudronManifest.json | 20 ++ templates/cloudron-app/Dockerfile | 22 ++ templates/cloudron-app/README.md | 20 ++ templates/cloudron-app/app/.gitkeep | 0 templates/cloudron-app/start.sh | 8 + templates/cloudron-app/test/smoke.sh | 16 + 414 files changed, 6837 insertions(+), 2 deletions(-) create mode 100644 .gitea/workflows/ci.yml create mode 100644 .gitignore create mode 100644 GEMINI/AUDIT-SNAPSHOT1.md create mode 100644 Makefile create mode 100644 STARTHERE.md create mode 100644 apps/apache-apisix/CloudronManifest.json create mode 100644 apps/apache-apisix/Dockerfile create mode 100644 apps/apache-apisix/README.md create mode 100644 apps/apache-apisix/app/.gitkeep create mode 100644 apps/apache-apisix/metadata.json create mode 100755 apps/apache-apisix/start.sh create mode 100755 apps/apache-apisix/test/smoke.sh create mode 100644 apps/autobom/CloudronManifest.json create mode 100644 apps/autobom/Dockerfile create mode 100644 apps/autobom/README.md create mode 100644 apps/autobom/app/.gitkeep create mode 100644 apps/autobom/metadata.json create mode 100755 apps/autobom/start.sh create mode 100755 apps/autobom/test/smoke.sh create mode 100644 apps/catalog.json create mode 100644 apps/chirpstack/CloudronManifest.json create mode 100644 apps/chirpstack/Dockerfile create mode 100644 apps/chirpstack/README.md create mode 100644 apps/chirpstack/app/.gitkeep create mode 100644 apps/chirpstack/metadata.json create mode 100755 apps/chirpstack/start.sh create mode 100755 apps/chirpstack/test/smoke.sh create mode 100644 apps/consuldemocracy/CloudronManifest.json create mode 100644 apps/consuldemocracy/Dockerfile create mode 100644 apps/consuldemocracy/README.md create mode 100644 apps/consuldemocracy/app/.gitkeep create mode 100644 apps/consuldemocracy/metadata.json create mode 100755 apps/consuldemocracy/start.sh create mode 100755 apps/consuldemocracy/test/smoke.sh create mode 100644 apps/craig/CloudronManifest.json create mode 100644 apps/craig/Dockerfile create mode 100644 apps/craig/README.md create mode 100644 apps/craig/app/.gitkeep create mode 100644 apps/craig/metadata.json create mode 100755 apps/craig/start.sh create mode 100755 apps/craig/test/smoke.sh create mode 100644 apps/database-gateway/CloudronManifest.json create mode 100644 apps/database-gateway/Dockerfile create mode 100644 apps/database-gateway/README.md create mode 100644 apps/database-gateway/app/.gitkeep create mode 100644 apps/database-gateway/metadata.json create mode 100755 apps/database-gateway/start.sh create mode 100755 apps/database-gateway/test/smoke.sh create mode 100644 apps/datahub/CloudronManifest.json create mode 100644 apps/datahub/Dockerfile create mode 100644 apps/datahub/README.md create mode 100644 apps/datahub/app/.gitkeep create mode 100644 apps/datahub/metadata.json create mode 100755 apps/datahub/start.sh create mode 100755 apps/datahub/test/smoke.sh create mode 100644 apps/docassemble/CloudronManifest.json create mode 100644 apps/docassemble/Dockerfile create mode 100644 apps/docassemble/README.md create mode 100644 apps/docassemble/app/.gitkeep create mode 100644 apps/docassemble/metadata.json create mode 100755 apps/docassemble/start.sh create mode 100755 apps/docassemble/test/smoke.sh create mode 100644 apps/docker-webhook/CloudronManifest.json create mode 100644 apps/docker-webhook/Dockerfile create mode 100644 apps/docker-webhook/README.md create mode 100644 apps/docker-webhook/app/.gitkeep create mode 100644 apps/docker-webhook/metadata.json create mode 100755 apps/docker-webhook/start.sh create mode 100755 apps/docker-webhook/test/smoke.sh create mode 100644 apps/drawio/CloudronManifest.json create mode 100644 apps/drawio/Dockerfile create mode 100644 apps/drawio/README.md create mode 100644 apps/drawio/app/.gitkeep create mode 100644 apps/drawio/metadata.json create mode 100755 apps/drawio/start.sh create mode 100755 apps/drawio/test/smoke.sh create mode 100644 apps/easy-gate/CloudronManifest.json create mode 100644 apps/easy-gate/Dockerfile create mode 100644 apps/easy-gate/README.md create mode 100644 apps/easy-gate/app/.gitkeep create mode 100644 apps/easy-gate/metadata.json create mode 100755 apps/easy-gate/start.sh create mode 100755 apps/easy-gate/test/smoke.sh create mode 100644 apps/elabftw/CloudronManifest.json create mode 100644 apps/elabftw/Dockerfile create mode 100644 apps/elabftw/README.md create mode 100644 apps/elabftw/app/.gitkeep create mode 100644 apps/elabftw/metadata.json create mode 100755 apps/elabftw/start.sh create mode 100755 apps/elabftw/test/smoke.sh create mode 100644 apps/fleetdm-fleet/CloudronManifest.json create mode 100644 apps/fleetdm-fleet/Dockerfile create mode 100644 apps/fleetdm-fleet/README.md create mode 100644 apps/fleetdm-fleet/app/.gitkeep create mode 100644 apps/fleetdm-fleet/metadata.json create mode 100755 apps/fleetdm-fleet/start.sh create mode 100755 apps/fleetdm-fleet/test/smoke.sh create mode 100644 apps/fonoster/CloudronManifest.json create mode 100644 apps/fonoster/Dockerfile create mode 100644 apps/fonoster/README.md create mode 100644 apps/fonoster/app/.gitkeep create mode 100644 apps/fonoster/metadata.json create mode 100755 apps/fonoster/start.sh create mode 100755 apps/fonoster/test/smoke.sh create mode 100644 apps/grist/CloudronManifest.json create mode 100644 apps/grist/Dockerfile create mode 100644 apps/grist/README.md create mode 100644 apps/grist/app/.gitkeep create mode 100644 apps/grist/metadata.json create mode 100755 apps/grist/start.sh create mode 100755 apps/grist/test/smoke.sh create mode 100644 apps/healthchecks/CloudronManifest.json create mode 100644 apps/healthchecks/Dockerfile create mode 100644 apps/healthchecks/README.md create mode 100644 apps/healthchecks/app/.gitkeep create mode 100644 apps/healthchecks/metadata.json create mode 100755 apps/healthchecks/start.sh create mode 100755 apps/healthchecks/test/smoke.sh create mode 100644 apps/huginn/CloudronManifest.json create mode 100644 apps/huginn/Dockerfile create mode 100644 apps/huginn/README.md create mode 100644 apps/huginn/app/.gitkeep create mode 100644 apps/huginn/metadata.json create mode 100755 apps/huginn/start.sh create mode 100755 apps/huginn/test/smoke.sh create mode 100644 apps/hyperswitch/CloudronManifest.json create mode 100644 apps/hyperswitch/Dockerfile create mode 100644 apps/hyperswitch/README.md create mode 100644 apps/hyperswitch/app/.gitkeep create mode 100644 apps/hyperswitch/metadata.json create mode 100755 apps/hyperswitch/start.sh create mode 100755 apps/hyperswitch/test/smoke.sh create mode 100644 apps/inventree/CloudronManifest.json create mode 100644 apps/inventree/Dockerfile create mode 100644 apps/inventree/README.md create mode 100644 apps/inventree/app/.gitkeep create mode 100644 apps/inventree/metadata.json create mode 100755 apps/inventree/start.sh create mode 100755 apps/inventree/test/smoke.sh create mode 100644 apps/jamovi/CloudronManifest.json create mode 100644 apps/jamovi/Dockerfile create mode 100644 apps/jamovi/README.md create mode 100644 apps/jamovi/app/.gitkeep create mode 100644 apps/jamovi/metadata.json create mode 100755 apps/jamovi/start.sh create mode 100755 apps/jamovi/test/smoke.sh create mode 100644 apps/jenkins/CloudronManifest.json create mode 100644 apps/jenkins/Dockerfile create mode 100644 apps/jenkins/README.md create mode 100644 apps/jenkins/app/.gitkeep create mode 100644 apps/jenkins/metadata.json create mode 100755 apps/jenkins/start.sh create mode 100755 apps/jenkins/test/smoke.sh create mode 100644 apps/kibot/CloudronManifest.json create mode 100644 apps/kibot/Dockerfile create mode 100644 apps/kibot/README.md create mode 100644 apps/kibot/app/.gitkeep create mode 100644 apps/kibot/metadata.json create mode 100755 apps/kibot/start.sh create mode 100755 apps/kibot/test/smoke.sh create mode 100644 apps/killbill/CloudronManifest.json create mode 100644 apps/killbill/Dockerfile create mode 100644 apps/killbill/README.md create mode 100644 apps/killbill/app/.gitkeep create mode 100644 apps/killbill/metadata.json create mode 100755 apps/killbill/start.sh create mode 100755 apps/killbill/test/smoke.sh create mode 100644 apps/langfuse/CloudronManifest.json create mode 100644 apps/langfuse/Dockerfile create mode 100644 apps/langfuse/README.md create mode 100644 apps/langfuse/app/.gitkeep create mode 100644 apps/langfuse/metadata.json create mode 100755 apps/langfuse/start.sh create mode 100755 apps/langfuse/test/smoke.sh create mode 100644 apps/manyfold/CloudronManifest.json create mode 100644 apps/manyfold/Dockerfile create mode 100644 apps/manyfold/README.md create mode 100644 apps/manyfold/app/.gitkeep create mode 100644 apps/manyfold/metadata.json create mode 100755 apps/manyfold/start.sh create mode 100755 apps/manyfold/test/smoke.sh create mode 100644 apps/mender-server/CloudronManifest.json create mode 100644 apps/mender-server/Dockerfile create mode 100644 apps/mender-server/README.md create mode 100644 apps/mender-server/app/.gitkeep create mode 100644 apps/mender-server/metadata.json create mode 100755 apps/mender-server/start.sh create mode 100755 apps/mender-server/test/smoke.sh create mode 100644 apps/midday/CloudronManifest.json create mode 100644 apps/midday/Dockerfile create mode 100644 apps/midday/README.md create mode 100644 apps/midday/app/.gitkeep create mode 100644 apps/midday/metadata.json create mode 100755 apps/midday/start.sh create mode 100755 apps/midday/test/smoke.sh create mode 100644 apps/mirlo/CloudronManifest.json create mode 100644 apps/mirlo/Dockerfile create mode 100644 apps/mirlo/README.md create mode 100644 apps/mirlo/app/.gitkeep create mode 100644 apps/mirlo/metadata.json create mode 100755 apps/mirlo/start.sh create mode 100755 apps/mirlo/test/smoke.sh create mode 100644 apps/nautilus-trader/CloudronManifest.json create mode 100644 apps/nautilus-trader/Dockerfile create mode 100644 apps/nautilus-trader/README.md create mode 100644 apps/nautilus-trader/app/.gitkeep create mode 100644 apps/nautilus-trader/metadata.json create mode 100755 apps/nautilus-trader/start.sh create mode 100755 apps/nautilus-trader/test/smoke.sh create mode 100644 apps/netbox-docker/CloudronManifest.json create mode 100644 apps/netbox-docker/Dockerfile create mode 100644 apps/netbox-docker/README.md create mode 100644 apps/netbox-docker/app/.gitkeep create mode 100644 apps/netbox-docker/metadata.json create mode 100755 apps/netbox-docker/start.sh create mode 100755 apps/netbox-docker/test/smoke.sh create mode 100644 apps/openblocks/CloudronManifest.json create mode 100644 apps/openblocks/Dockerfile create mode 100644 apps/openblocks/README.md create mode 100644 apps/openblocks/app/.gitkeep create mode 100644 apps/openblocks/metadata.json create mode 100755 apps/openblocks/start.sh create mode 100755 apps/openblocks/test/smoke.sh create mode 100644 apps/openboxes-docker/CloudronManifest.json create mode 100644 apps/openboxes-docker/Dockerfile create mode 100644 apps/openboxes-docker/README.md create mode 100644 apps/openboxes-docker/app/.gitkeep create mode 100644 apps/openboxes-docker/metadata.json create mode 100755 apps/openboxes-docker/start.sh create mode 100755 apps/openboxes-docker/test/smoke.sh create mode 100644 apps/openfile/CloudronManifest.json create mode 100644 apps/openfile/Dockerfile create mode 100644 apps/openfile/README.md create mode 100644 apps/openfile/app/.gitkeep create mode 100644 apps/openfile/metadata.json create mode 100755 apps/openfile/start.sh create mode 100755 apps/openfile/test/smoke.sh create mode 100644 apps/payroll-engine/CloudronManifest.json create mode 100644 apps/payroll-engine/Dockerfile create mode 100644 apps/payroll-engine/README.md create mode 100644 apps/payroll-engine/app/.gitkeep create mode 100644 apps/payroll-engine/metadata.json create mode 100755 apps/payroll-engine/start.sh create mode 100755 apps/payroll-engine/test/smoke.sh create mode 100644 apps/plmore/CloudronManifest.json create mode 100644 apps/plmore/Dockerfile create mode 100644 apps/plmore/README.md create mode 100644 apps/plmore/app/.gitkeep create mode 100644 apps/plmore/metadata.json create mode 100755 apps/plmore/start.sh create mode 100755 apps/plmore/test/smoke.sh create mode 100644 apps/puter/CloudronManifest.json create mode 100644 apps/puter/Dockerfile create mode 100644 apps/puter/README.md create mode 100644 apps/puter/app/.gitkeep create mode 100644 apps/puter/metadata.json create mode 100755 apps/puter/start.sh create mode 100755 apps/puter/test/smoke.sh create mode 100644 apps/rathole/CloudronManifest.json create mode 100644 apps/rathole/Dockerfile create mode 100644 apps/rathole/README.md create mode 100644 apps/rathole/app/.gitkeep create mode 100644 apps/rathole/metadata.json create mode 100755 apps/rathole/start.sh create mode 100755 apps/rathole/test/smoke.sh create mode 100644 apps/resgrid/CloudronManifest.json create mode 100644 apps/resgrid/Dockerfile create mode 100644 apps/resgrid/README.md create mode 100644 apps/resgrid/app/.gitkeep create mode 100644 apps/resgrid/metadata.json create mode 100755 apps/resgrid/start.sh create mode 100755 apps/resgrid/test/smoke.sh create mode 100644 apps/reviewboard/CloudronManifest.json create mode 100644 apps/reviewboard/Dockerfile create mode 100644 apps/reviewboard/README.md create mode 100644 apps/reviewboard/app/.gitkeep create mode 100644 apps/reviewboard/metadata.json create mode 100755 apps/reviewboard/start.sh create mode 100755 apps/reviewboard/test/smoke.sh create mode 100644 apps/rundeck/CloudronManifest.json create mode 100644 apps/rundeck/Dockerfile create mode 100644 apps/rundeck/README.md create mode 100644 apps/rundeck/app/.gitkeep create mode 100644 apps/rundeck/metadata.json create mode 100755 apps/rundeck/start.sh create mode 100755 apps/rundeck/test/smoke.sh create mode 100644 apps/runme/CloudronManifest.json create mode 100644 apps/runme/Dockerfile create mode 100644 apps/runme/README.md create mode 100644 apps/runme/app/.gitkeep create mode 100644 apps/runme/metadata.json create mode 100755 apps/runme/start.sh create mode 100755 apps/runme/test/smoke.sh create mode 100644 apps/satnogs-kaitai/CloudronManifest.json create mode 100644 apps/satnogs-kaitai/Dockerfile create mode 100644 apps/satnogs-kaitai/README.md create mode 100644 apps/satnogs-kaitai/app/.gitkeep create mode 100644 apps/satnogs-kaitai/metadata.json create mode 100755 apps/satnogs-kaitai/start.sh create mode 100755 apps/satnogs-kaitai/test/smoke.sh create mode 100644 apps/satnogs-webgui/CloudronManifest.json create mode 100644 apps/satnogs-webgui/Dockerfile create mode 100644 apps/satnogs-webgui/README.md create mode 100644 apps/satnogs-webgui/app/.gitkeep create mode 100644 apps/satnogs-webgui/metadata.json create mode 100755 apps/satnogs-webgui/start.sh create mode 100755 apps/satnogs-webgui/test/smoke.sh create mode 100644 apps/sdrangel/CloudronManifest.json create mode 100644 apps/sdrangel/Dockerfile create mode 100644 apps/sdrangel/README.md create mode 100644 apps/sdrangel/app/.gitkeep create mode 100644 apps/sdrangel/metadata.json create mode 100755 apps/sdrangel/start.sh create mode 100755 apps/sdrangel/test/smoke.sh create mode 100644 apps/seatunnel/CloudronManifest.json create mode 100644 apps/seatunnel/Dockerfile create mode 100644 apps/seatunnel/README.md create mode 100644 apps/seatunnel/app/.gitkeep create mode 100644 apps/seatunnel/metadata.json create mode 100755 apps/seatunnel/start.sh create mode 100755 apps/seatunnel/test/smoke.sh create mode 100644 apps/signoz/CloudronManifest.json create mode 100644 apps/signoz/Dockerfile create mode 100644 apps/signoz/README.md create mode 100644 apps/signoz/app/.gitkeep create mode 100644 apps/signoz/metadata.json create mode 100755 apps/signoz/start.sh create mode 100755 apps/signoz/test/smoke.sh create mode 100644 apps/slurm/CloudronManifest.json create mode 100644 apps/slurm/Dockerfile create mode 100644 apps/slurm/README.md create mode 100644 apps/slurm/app/.gitkeep create mode 100644 apps/slurm/metadata.json create mode 100755 apps/slurm/start.sh create mode 100755 apps/slurm/test/smoke.sh create mode 100644 apps/sniperphish/CloudronManifest.json create mode 100644 apps/sniperphish/Dockerfile create mode 100644 apps/sniperphish/README.md create mode 100644 apps/sniperphish/app/.gitkeep create mode 100644 apps/sniperphish/metadata.json create mode 100755 apps/sniperphish/start.sh create mode 100755 apps/sniperphish/test/smoke.sh create mode 100644 apps/swupdate/CloudronManifest.json create mode 100644 apps/swupdate/Dockerfile create mode 100644 apps/swupdate/README.md create mode 100644 apps/swupdate/app/.gitkeep create mode 100644 apps/swupdate/metadata.json create mode 100755 apps/swupdate/start.sh create mode 100755 apps/swupdate/test/smoke.sh create mode 100644 apps/tak-server/CloudronManifest.json create mode 100644 apps/tak-server/Dockerfile create mode 100644 apps/tak-server/README.md create mode 100644 apps/tak-server/app/.gitkeep create mode 100644 apps/tak-server/metadata.json create mode 100755 apps/tak-server/start.sh create mode 100755 apps/tak-server/test/smoke.sh create mode 100644 apps/target-goalert/CloudronManifest.json create mode 100644 apps/target-goalert/Dockerfile create mode 100644 apps/target-goalert/README.md create mode 100644 apps/target-goalert/app/.gitkeep create mode 100644 apps/target-goalert/metadata.json create mode 100755 apps/target-goalert/start.sh create mode 100755 apps/target-goalert/test/smoke.sh create mode 100644 apps/warp/CloudronManifest.json create mode 100644 apps/warp/Dockerfile create mode 100644 apps/warp/README.md create mode 100644 apps/warp/app/.gitkeep create mode 100644 apps/warp/metadata.json create mode 100755 apps/warp/start.sh create mode 100755 apps/warp/test/smoke.sh create mode 100644 apps/windmill/CloudronManifest.json create mode 100644 apps/windmill/Dockerfile create mode 100644 apps/windmill/README.md create mode 100644 apps/windmill/app/.gitkeep create mode 100644 apps/windmill/metadata.json create mode 100755 apps/windmill/start.sh create mode 100755 apps/windmill/test/smoke.sh create mode 100644 apps/wireflow/CloudronManifest.json create mode 100644 apps/wireflow/Dockerfile create mode 100644 apps/wireflow/README.md create mode 100644 apps/wireflow/app/.gitkeep create mode 100644 apps/wireflow/metadata.json create mode 100755 apps/wireflow/start.sh create mode 100755 apps/wireflow/test/smoke.sh create mode 100644 apps/wireviz-web/CloudronManifest.json create mode 100644 apps/wireviz-web/Dockerfile create mode 100644 apps/wireviz-web/README.md create mode 100644 apps/wireviz-web/app/.gitkeep create mode 100644 apps/wireviz-web/metadata.json create mode 100755 apps/wireviz-web/start.sh create mode 100755 apps/wireviz-web/test/smoke.sh create mode 100644 docker/ci-runner/Dockerfile create mode 100644 docker/packager/Dockerfile create mode 100644 docs/APP_STATUS.md create mode 100644 docs/CI_CD_GITEA.md create mode 100644 docs/LOCAL_TESTING.md create mode 100644 docs/PACKAGING_GUIDE.md create mode 100644 docs/PRIORITY_MILESTONES.md create mode 100755 scripts/ci_local.sh create mode 100755 scripts/generate_status.py create mode 100755 scripts/hooks/install_hooks.sh create mode 100755 scripts/hooks/post-commit create mode 100755 scripts/hooks/pre-commit create mode 100755 scripts/hooks/pre-push create mode 100755 scripts/lint_repo.py create mode 100755 scripts/new_app.py create mode 100755 scripts/run_packager.sh create mode 100644 templates/cloudron-app/CloudronManifest.json create mode 100644 templates/cloudron-app/Dockerfile create mode 100644 templates/cloudron-app/README.md create mode 100644 templates/cloudron-app/app/.gitkeep create mode 100644 templates/cloudron-app/start.sh create mode 100644 templates/cloudron-app/test/smoke.sh diff --git a/.gitea/workflows/ci.yml b/.gitea/workflows/ci.yml new file mode 100644 index 0000000..4432785 --- /dev/null +++ b/.gitea/workflows/ci.yml @@ -0,0 +1,26 @@ +name: cloudron-packages-ci + +on: + workflow_dispatch: + inputs: + tasks: + description: "Space-separated list of tasks to run via scripts/ci_local.sh" + required: false + default: "all" + +jobs: + lint-and-smoke: + runs-on: ubuntu-22.04 + steps: + - name: Checkout repository + uses: https://gitea.com/actions/checkout@v4 + + - name: Build CI harness image + run: docker build -t knel/cloudron-ci docker/ci-runner + + - name: Run requested tasks + env: + TASKS: ${{ github.event.inputs.tasks }} + run: | + export CI_IMAGE=knel/cloudron-ci + ./scripts/ci_local.sh ${TASKS:-all} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..81b6d00 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +__pycache__/ +*.pyc +*.swp +.DS_Store diff --git a/GEMINI/AUDIT-SNAPSHOT1.md b/GEMINI/AUDIT-SNAPSHOT1.md new file mode 100644 index 0000000..2cfa1ee --- /dev/null +++ b/GEMINI/AUDIT-SNAPSHOT1.md @@ -0,0 +1,74 @@ +# Gemini Audit Report: KNELCloudronPackages (Snapshot 1) + +**Date:** 2025-10-02 +**Auditor:** Gemini +**Scope:** Full repository review, focusing on production-readiness, security, and maintainability. + +--- + +## 1. Executive Summary + +The `KNELCloudronPackages` repository establishes a commendable and well-documented foundation for packaging a large portfolio of applications for Cloudron. The core concepts—a centralized catalog, scaffolding automation, a dedicated packager container, and a local CI harness—are excellent choices for ensuring consistency and a clean host environment. + +However, this audit reveals that while the **intent** is production-grade, the **current implementation is not**. The automation scripts and application templates contain systemic weaknesses, brittle logic, and promote anti-patterns that will be replicated across all ~60 applications. This will create significant, immediate technical debt, increase security risks, and lead to high maintenance overhead. + +**The project is at a critical inflection point.** Correcting these foundational issues now is paramount. Proceeding without addressing them will guarantee that every package built will be flawed, inconsistent, and require substantial rework. + +**Overall Grade: D+ (Needs Major Rework)** + +--- + +## 2. Critical Issues & Security Vulnerabilities + +These issues require immediate attention before any further packaging work proceeds. + +| ID | Severity | Issue | Component | Recommendation | +|---|---|---|---|---| +| **C-01** | **Critical** | **Naive Cloudron App ID Generation** | `scripts/new_app.py` | The `build_app_id` function improperly sanitizes slugs, creating invalid IDs (e.g., `com.knel.some..app`). This will break Cloudron deployments. **Action:** Replace the function with a robust slugification library or a more intelligent regex-based sanitizer. | +| **C-02** | **High** | **Insecure Dockerfile Practices** | `templates/cloudron-app/Dockerfile` | The template encourages copying raw source code (`COPY ./app`) instead of using multi-stage builds. This bloats images with unnecessary build dependencies, development secrets, and increases the attack surface. **Action:** The template **must** be updated to provide a canonical multi-stage build example. The documentation must enforce this as the default pattern. | +| **C-03** | **High** | **Missing File Permissions/Ownership** | `templates/cloudron-app/Dockerfile` | The Dockerfile switches to the `cloudron` user but fails to `chown` the application files. Files copied in as `root` will not be readable/writable by the application at runtime, causing crashes. **Action:** Add a `RUN chown -R cloudron:cloudron /app` command before the `USER cloudron` directive in the template. | +| **C-04** | **High** | **Wildly Incorrect Resource Allocation** | `templates/cloudron-app/CloudronManifest.json` | The manifest template hardcodes a `memoryLimit` of 512MB for all applications. This is dangerously incorrect for resource-heavy apps like NetBox or DataHub (which require 8GB+ RAM) and wasteful for tiny ones. **Action:** Remove the hardcoded limit. The `PACKAGING_GUIDE.md` and per-app `README.md` must make it a mandatory step for the developer to determine and set a realistic limit. | + +--- + +## 3. Major Concerns & Architectural Flaws + +These issues point to fundamental weaknesses in the project's architecture and tooling. + +| ID | Severity | Issue | Component | Recommendation | +|---|---|---|---|---| +| **M-01** | **Major** | **Brittle Automation Logic** | `scripts/lint_repo.py`, `scripts/generate_status.py` | The scripts rely on naive string-matching for validation (e.g., `grep "Replace start.sh"`). This is not a reliable indicator of completeness. The Dockerfile linter incorrectly checks for the base image, making it incompatible with multi-stage builds. **Action:** Refactor the linting and status detection. Use Abstract Syntax Trees (AST) for script analysis, a JSON schema for manifest validation, and parse the Dockerfile properly to check the final build stage. | +| **M-02** | **Major** | **Overly Simplistic Templates** | `templates/cloudron-app/*` | The templates are "one-size-fits-none." They lack placeholders for essential, common Cloudron features like databases (`postgresql`, `redis`), mail (`sendmail`), or LDAP. This forces developers to add significant boilerplate for almost every app. **Action:** Create a more comprehensive template or multiple templates (e.g., `web-app`, `worker-app`) that include commented-out sections for common addons and configurations. | +| **M-03** | **Major** | **Inefficient Scaffolding** | `scripts/new_app.py` | The script uses a crude `copy-then-replace` method. This is inefficient and error-prone. The `date` command bug in the `README.md` template is a direct result of this. **Action:** Replace the custom replacement logic with a standard templating engine like **Jinja2**. This is the industry standard for this exact task. | + +--- + +## 4. Minor Concerns & Recommendations + +| ID | Severity | Issue | Component | Recommendation | +|---|---|---|---|---| +| **R-01** | **Medium** | **Inconsistent Shell Usage** | `templates/cloudron-app/start.sh` | The script has a `#!/bin/bash` shebang, but the placeholder command uses `exec /bin/sh -c`. This can lead to subtle bugs if shell-specific syntax is used. **Action:** Ensure consistency. Use `bash -c` if the script is intended to be run with bash. | +| **R-02** | **Low** | **Unexecuted Template Command** | `templates/cloudron-app/README.md` | The `$(date ...)` command is not executed during scaffolding, leaving a literal string in the generated READMEs. **Action:** This will be fixed by moving to a proper templating engine (see **M-03**). | +| **R-03** | **Low** | **Simplistic Health & Smoke Tests** | `templates/cloudron-app/*` | The default `healthCheckPath` (`/`) and the smoke test are too basic and will fail for many apps, creating immediate rework for the developer. **Action:** Update documentation to make it clear these are mandatory placeholders to be adapted, not sensible defaults. | +| **R-04** | **Low** | **Lack of Schema Validation** | `scripts/lint_repo.py` | The linter only checks for the presence of a few keys in `CloudronManifest.json`. It does not validate data types, enums, or the overall structure. **Action:** Create a JSON schema for `CloudronManifest.json` and use a library like `jsonschema` in the linter to perform proper validation. | + +--- + +## 5. Actionable Next Steps (Prioritized) + +1. **Halt All Scaffolding:** Do not generate any more apps with the current tooling. +2. **Fix Critical Issues (C-01 to C-04):** + * Rewrite `build_app_id` in `new_app.py`. + * Update the `Dockerfile` template to include a multi-stage build example and a `chown` command. + * Remove the hardcoded `memoryLimit` from the manifest template and update documentation accordingly. +3. **Re-architect Tooling (M-01 to M-03):** + * Replace the custom find-and-replace logic in `new_app.py` with **Jinja2**. + * Refactor `lint_repo.py` to correctly parse Dockerfiles for multi-stage builds and validate `CloudronManifest.json` against a proper JSON schema. +4. **Enhance Templates:** + * Add commented-out examples for common addons (`postgresql`, `redis`, `sendmail`) to `CloudronManifest.json`. +5. **Re-Scaffold and Verify:** + * Once the tooling is fixed, delete the existing `apps/` directory. + * Re-run the scaffolding script for all applications. + * Verify that the generated files are correct and pass the new, more robust lint checks. + +Only after these foundational elements are corrected should the actual work of packaging the individual applications begin. The current path leads to a portfolio of flawed, insecure, and difficult-to-maintain packages. diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..533e5cc --- /dev/null +++ b/Makefile @@ -0,0 +1,16 @@ +.PHONY: scaffold lint status packager-shell + +scaffold: + python3 scripts/new_app.py --force + +lint: + python3 scripts/lint_repo.py + +status: + python3 scripts/generate_status.py + +packager-shell: + BUILD=1 scripts/run_packager.sh + +ci-local: + ./scripts/ci_local.sh all diff --git a/README.md b/README.md index 0a7dd3d..3bee43d 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,128 @@ -# KNELCloudronPackages +# KNEL Cloudron Packages + +This repository scaffolds Cloudron packages for Known Element's portfolio. It provides: + +- A reusable application template (`templates/cloudron-app`) matching Cloudron packaging conventions. +- Automation helpers in `scripts/` to instantiate per-app scaffolds and run builds inside a dedicated Docker container. +- A curated catalog (`apps/catalog.json`) that maps Known Element issue IDs to upstream projects. +- Documentation under `docs/` to guide packaging, testing, and release workflows. + +## Quick start + +```bash +# Generate all app scaffolds from the catalog +python3 scripts/new_app.py + +# Or regenerate scaffolds via Makefile +make scaffold + +# Work on a single app skeleton +python3 scripts/new_app.py --slug apache-apisix + +# Update the status table +make status + +# Lint generated apps +make lint + +# Run the full CI harness locally +make ci-local + +# Build and enter the Cloudron packager container +BUILD=1 scripts/run_packager.sh +scripts/run_packager.sh +``` + +Within the container, use the Cloudron CLI to build, test, and publish packages without touching the host environment: + +```bash +cloudron login my.example.cloudron +cloudron build +cloudron install --app my-example +cloudron push +``` + +Refer to `docs/PACKAGING_GUIDE.md` for detailed guidance. + +See `docs/APP_STATUS.md` for the automatically generated status table. + +## Repository layout + +- `apps/` – generated app scaffolds and metadata +- `docs/` – playbooks and architecture notes +- `docs/CI_CD_GITEA.md` – instructions for running CI/CD and publishing images via the Gitea instance +- `docker/packager/` – Docker image for Cloudron packaging workflows +- `scripts/` – helper scripts (scaffolding, tooling entrypoints) +- `templates/` – base Cloudron app template + +## Application catalog + +| Slug | Issue | Upstream | +| --- | --- | --- | +| apache-apisix | https://projects.knownelement.com/issues/179 | https://github.com/apache/apisix.git | +| target-goalert | https://projects.knownelement.com/issues/204 | https://github.com/target/goalert.git | +| consuldemocracy | https://projects.knownelement.com/issues/189 | https://github.com/consuldemocracy/consuldemocracy.git | +| fleetdm-fleet | https://projects.knownelement.com/issues/195 | https://github.com/fleetdm/fleet.git | +| fonoster | https://projects.knownelement.com/issues/227 | https://github.com/fonoster/fonoster.git | +| healthchecks | https://projects.knownelement.com/issues/192 | https://github.com/healthchecks/healthchecks.git | +| hyperswitch | https://projects.knownelement.com/issues/209 | https://github.com/juspay/hyperswitch | +| netbox-docker | https://projects.knownelement.com/issues/201 | https://github.com/netbox-community/netbox-docker.git | +| openboxes-docker | https://projects.knownelement.com/issues/205 | https://github.com/openboxes/openboxes-docker.git | +| openfile | https://projects.knownelement.com/issues/316 | https://github.com/openfiletax/openfile.git | +| sniperphish | https://projects.knownelement.com/issues/211 | https://github.com/GemGeorge/SniperPhish-Docker.git | +| datahub | https://projects.knownelement.com/issues/309 | https://github.com/datahub-project/datahub.git | +| easy-gate | https://projects.knownelement.com/issues/54 | https://github.com/wiredlush/easy-gate.git | +| payroll-engine | https://projects.knownelement.com/issues/208 | https://github.com/Payroll-Engine/PayrollEngine.git | +| huginn | https://projects.knownelement.com/issues/194 | https://github.com/huginn/huginn.git | +| grist | https://projects.knownelement.com/issues/191 | https://github.com/gristlabs/grist-core | +| docassemble | https://projects.knownelement.com/issues/277 | https://github.com/jhpyle/docassemble.git | +| database-gateway | https://projects.knownelement.com/issues/273 | https://github.com/kazhuravlev/database-gateway.git | +| rundeck | https://projects.knownelement.com/issues/217 | https://github.com/rundeck/rundeck.git | +| slurm | https://projects.knownelement.com/issues/222 | https://github.com/SchedMD/slurm.git | +| rathole | https://projects.knownelement.com/issues/225 | https://github.com/rathole-org/rathole.git | +| jenkins | https://projects.knownelement.com/issues/234 | https://github.com/jenkinsci/jenkins.git | +| runme | https://projects.knownelement.com/issues/322 | https://github.com/runmedev/runme.git | +| seatunnel | https://projects.knownelement.com/issues/301 | https://github.com/apache/seatunnel | +| docker-webhook | https://projects.knownelement.com/issues/271 | https://github.com/thecatlady/docker-webhook | +| inventree | https://projects.knownelement.com/issues/173 | https://github.com/inventree/InvenTree.git | +| tak-server | https://projects.knownelement.com/issues/180 | https://github.com/Cloud-RF/tak-server | +| midday | https://projects.knownelement.com/issues/178 | https://github.com/midday-ai/midday.git | +| killbill | https://projects.knownelement.com/issues/181 | https://github.com/killbill/killbill.git | +| chirpstack | https://projects.knownelement.com/issues/184 | https://github.com/chirpstack/chirpstack.git | +| craig | https://projects.knownelement.com/issues/185 | https://github.com/CraigChat/craig.git | +| elabftw | https://projects.knownelement.com/issues/188 | https://github.com/elabftw/elabftw.git | +| jamovi | https://projects.knownelement.com/issues/196 | https://github.com/jamovi/jamovi.git | +| kibot | https://projects.knownelement.com/issues/197 | https://github.com/INTI-CMNB/KiBot.git | +| resgrid | https://projects.knownelement.com/issues/214 | https://github.com/Resgrid/Core | +| reviewboard | https://projects.knownelement.com/issues/216 | https://github.com/reviewboard/reviewboard.git | +| satnogs-kaitai | https://projects.knownelement.com/issues/218 | https://gitlab.com/librespacefoundation/satnogs/docker-kaitai.git | +| satnogs-webgui | https://projects.knownelement.com/issues/218 | https://gitlab.com/librespacefoundation/satnogs/docker-satnogs-webgui.git | +| sdrangel | https://projects.knownelement.com/issues/219 | https://github.com/f4exb/sdrangel-docker | +| signoz | https://projects.knownelement.com/issues/221 | https://github.com/SigNoz/signoz.git | +| warp | https://projects.knownelement.com/issues/228 | https://github.com/sebo-b/warp.git | +| drawio | https://projects.knownelement.com/issues/272 | https://github.com/jgraph/docker-drawio | +| openblocks | https://projects.knownelement.com/issues/274 | https://github.com/openblocks-dev/openblocks.git | +| wireviz-web | https://projects.knownelement.com/issues/276 | https://github.com/wireviz/wireviz-web.git | +| autobom | https://projects.knownelement.com/issues/278 | https://github.com/opulo-inc/autobom.git | +| plmore | https://projects.knownelement.com/issues/279 | https://github.com/PLMore/PLMore | +| manyfold | https://projects.knownelement.com/issues/282 | https://github.com/manyfold3d/manyfold.git | +| langfuse | https://projects.knownelement.com/issues/283 | https://github.com/langfuse/oss-llmops-stack.git | +| puter | https://projects.knownelement.com/issues/286 | https://github.com/HeyPuter/puter.git | +| windmill | https://projects.knownelement.com/issues/285 | https://github.com/windmill-labs/windmill.git | +| swupdate | https://projects.knownelement.com/issues/326 | https://github.com/sbabic/swupdate.git | +| mender-server | https://projects.knownelement.com/issues/300 | https://github.com/mendersoftware/mender-server.git | +| wireflow | https://projects.knownelement.com/issues/50 | https://github.com/vanila-io/wireflow.git | +| nautilus-trader | https://projects.knownelement.com/issues/226 | https://github.com/nautechsystems/nautilus_trader.git | +| mirlo | TBD | https://github.com/funmusicplace/mirlo.git | + +All entries are initially marked as `todo`; update individual READMEs as progress is made. + + +## Local Harness + +Run `./scripts/ci_local.sh` (or `make ci-local`) to execute the same lint and smoke tests that the future Gitea runner will use. Install git hooks via `./scripts/hooks/install_hooks.sh` so pre-commit, post-commit, and pre-push events invoke the harness automatically. Export `SKIP_CI_HOOKS=1` to bypass them when necessary. See `docs/LOCAL_TESTING.md` for full details. + +## CI/CD + +Once a runner is provisioned, enable `.gitea/workflows/ci.yml` to call the same harness remotely (it currently requires manual `workflow_dispatch`). Mirror `actions/checkout@v4` and label the runner `ubuntu-22.04`. See `docs/CI_CD_GITEA.md` for setup details. -KNELCloudronPackages \ No newline at end of file diff --git a/STARTHERE.md b/STARTHERE.md new file mode 100644 index 0000000..0e2f188 --- /dev/null +++ b/STARTHERE.md @@ -0,0 +1,177 @@ +Can you help me package up a large number of off the shelf applications for Cloudron? + +Use web search to obtain the most up to date information to guide the process. + +All of the packaging work needs to be done in docker containers , no host pollution of any kind. You may use docker on the host to orchestrate the workflows. You may use git to commit/push/tag as needed. + +Presume that I’m starting with an empty directory / repository. I’ll need you to scaffold everything up for me following best common practices. Keep the repo layout clean. + +Here is a list of software that I want to package. The format of the list is: + +link to redmine ticket +link to the software repository + +#https://projects.knownelement.com/issues/179 +https://github.com/apache/apisix.git + +#https://projects.knownelement.com/issues/204 +https://github.com/target/goalert.git + +#https://projects.knownelement.com/issues/189 +https://github.com/consuldemocracy/consuldemocracy.git + +#https://projects.knownelement.com/issues/195 +https://github.com/fleetdm/fleet.git + +#https://projects.knownelement.com/issues/227 +https://github.com/fonoster/fonoster.git + +#https://projects.knownelement.com/issues/192 +https://github.com/healthchecks/healthchecks.git + +#https://projects.knownelement.com/issues/209 +https://github.com/juspay/hyperswitch + +#https://projects.knownelement.com/issues/201 +https://github.com/netbox-community/netbox-docker.git + +#https://projects.knownelement.com/issues/205 +https://github.com/openboxes/openboxes-docker.git + +#https://projects.knownelement.com/issues/316 +https://github.com/openfiletax/openfile.git + +#https://projects.knownelement.com/issues/211 +https://github.com/GemGeorge/SniperPhish-Docker.git + +#https://projects.knownelement.com/issues/309 +https://github.com/datahub-project/datahub.git + +#https://projects.knownelement.com/issues/54 +https://github.com/wiredlush/easy-gate.git + +#https://projects.knownelement.com/issues/208 +https://github.com/Payroll-Engine/PayrollEngine.git + +#https://projects.knownelement.com/issues/194 +https://github.com/huginn/huginn.git + +#https://projects.knownelement.com/issues/191 +https://github.com/gristlabs/grist-core + +#https://projects.knownelement.com/issues/277 +https://github.com/jhpyle/docassemble.git + +#https://projects.knownelement.com/issues/273 +https://github.com/kazhuravlev/database-gateway.git + +#https://projects.knownelement.com/issues/217 +https://github.com/rundeck/rundeck.git + +#https://projects.knownelement.com/issues/222 +https://github.com/SchedMD/slurm.git +https://github.com/giovtorres/slurm-docker-cluster.git + +#https://projects.knownelement.com/issues/225 +https://github.com/rathole-org/rathole.git + +#https://projects.knownelement.com/issues/234 +https://github.com/jenkinsci/jenkins.git + +#https://projects.knownelement.com/issues/322 +https://github.com/runmedev/runme.git + +#https://projects.knownelement.com/issues/301 +https://github.com/apache/seatunnel + +#https://projects.knownelement.com/issues/271 +https://github.com/thecatlady/docker-webhook + +#https://projects.knownelement.com/issues/173 +https://github.com/inventree/InvenTree.git + +#https://projects.knownelement.com/issues/180 +https://github.com/Cloud-RF/tak-server + +#https://projects.knownelement.com/issues/178 +https://github.com/midday-ai/midday.git + +#https://projects.knownelement.com/issues/181 +https://github.com/killbill/killbill.git + +#https://projects.knownelement.com/issues/184 +https://github.com/chirpstack/chirpstack.git + +#https://projects.knownelement.com/issues/185 +https://github.com/CraigChat/craig.git + +#https://projects.knownelement.com/issues/188 +https://github.com/elabftw/elabftw.git + +#https://projects.knownelement.com/issues/196 +https://github.com/jamovi/jamovi.git + +#https://projects.knownelement.com/issues/197 +https://github.com/INTI-CMNB/KiBot.git + +#https://projects.knownelement.com/issues/214 +https://github.com/Resgrid/Core + +#https://projects.knownelement.com/issues/216 +https://github.com/reviewboard/reviewboard.git + +#https://projects.knownelement.com/issues/218 +https://gitlab.com/librespacefoundation/satnogs/docker-kaitai.git +https://gitlab.com/librespacefoundation/satnogs/docker-satnogs-webgui.git + +#https://projects.knownelement.com/issues/219 +https://github.com/f4exb/sdrangel-docker + +#https://projects.knownelement.com/issues/221 +https://github.com/SigNoz/signoz.git + +#https://projects.knownelement.com/issues/228 +https://github.com/sebo-b/warp.git + +#https://projects.knownelement.com/issues/272 +https://github.com/jgraph/docker-drawio + +#https://projects.knownelement.com/issues/274 +https://github.com/openblocks-dev/openblocks.git + +#https://projects.knownelement.com/issues/276 +https://github.com/wireviz/wireviz-web.git + +#https://projects.knownelement.com/issues/278 +https://github.com/opulo-inc/autobom.git + +#https://projects.knownelement.com/issues/279 +https://github.com/PLMore/PLMore + +#https://projects.knownelement.com/issues/282 +https://github.com/manyfold3d/manyfold.git + +#https://projects.knownelement.com/issues/283 +https://github.com/langfuse/oss-llmops-stack.git + +#https://projects.knownelement.com/issues/286 +https://github.com/HeyPuter/puter.git + +#https://projects.knownelement.com/issues/285 +https://github.com/windmill-labs/windmill.git + +#https://projects.knownelement.com/issues/326 +https://github.com/sbabic/swupdate.git + +#https://projects.knownelement.com/issues/300 +https://github.com/mendersoftware/mender-server.git + +#https://projects.knownelement.com/issues/50 +https://github.com/vanila-io/wireflow.git + +#https://projects.knownelement.com/issues/226 +https://github.com/nautechsystems/nautilus_trader.git + +#TBD +https://github.com/funmusicplace/mirlo.git + diff --git a/apps/apache-apisix/CloudronManifest.json b/apps/apache-apisix/CloudronManifest.json new file mode 100644 index 0000000..8770844 --- /dev/null +++ b/apps/apache-apisix/CloudronManifest.json @@ -0,0 +1,20 @@ +{ + "manifestVersion": 2, + "id": "com.knel.apache.apisix", + "title": "Apache APISIX", + "author": "Known Element Packaging Team", + "tagline": "TODO: Short one-line pitch", + "description": "TODO: Comprehensive description for the Cloudron App Store entry.", + "changelog": "Initial scaffold", + "website": "https://github.com/apache/apisix", + "supportUrl": "https://projects.knownelement.com/issues/179", + "sourceUrl": "https://github.com/apache/apisix.git", + "version": "0.1.0", + "tags": ["custom", "known-element"], + "healthCheckPath": "/", + "memoryLimit": 536870912, + "httpPort": 3000, + "addons": { + "localstorage": {} + } +} diff --git a/apps/apache-apisix/Dockerfile b/apps/apache-apisix/Dockerfile new file mode 100644 index 0000000..c6930a7 --- /dev/null +++ b/apps/apache-apisix/Dockerfile @@ -0,0 +1,22 @@ +# syntax=docker/dockerfile:1 +FROM cloudron/base:5.0.0 + +LABEL org.opencontainers.image.source="https://github.com/apache/apisix.git" +LABEL org.opencontainers.image.description="Cloudron package for Apache APISIX" + +ARG APP_VERSION +ENV APP_VERSION=${APP_VERSION:-latest} + +# Copy application source into image at build time +# Replace this with a multi-stage build if upstream provides Docker images. +COPY ./app /app/code + +# Copy start script and make it executable +COPY ./start.sh /app/pkg/start.sh +RUN chmod +x /app/pkg/start.sh + +# Cloudron expects all processes to run as cloudron user +USER cloudron +WORKDIR /app/code + +CMD ["/app/pkg/start.sh"] diff --git a/apps/apache-apisix/README.md b/apps/apache-apisix/README.md new file mode 100644 index 0000000..22c4888 --- /dev/null +++ b/apps/apache-apisix/README.md @@ -0,0 +1,20 @@ +# Apache APISIX on Cloudron + +- **Upstream repository**: https://github.com/apache/apisix.git +- **Implementation issue**: https://projects.knownelement.com/issues/179 +- **Status**: Draft scaffolding generated on $(date -u +"%Y-%m-%dT%H:%M:%SZ") + +## Packaging Checklist + +1. Review upstream deployment requirements and map them to Cloudron services (database, cache, object storage, workers). +2. Update `Dockerfile` with the correct build steps and runtime dependencies. +3. Implement `start.sh` to configure the app from Cloudron-provided environment variables and launch the primary process. +4. Edit `CloudronManifest.json` with accurate metadata, permissions, ports, addons, and health checks. +5. Add integration and smoke tests under `test/` to validate the package. +6. Document manual configuration steps, migration requirements, and known gaps in this README. + +## Notes + +- Replace the placeholder long-running process in `start.sh`. +- Populate the `app/` directory with the application build artefacts or git submodules. +- Use the shared packaging container (`docker/packager`) to run `cloudron build` and `cloudron install` so the host remains clean. diff --git a/apps/apache-apisix/app/.gitkeep b/apps/apache-apisix/app/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/apps/apache-apisix/metadata.json b/apps/apache-apisix/metadata.json new file mode 100644 index 0000000..51557f6 --- /dev/null +++ b/apps/apache-apisix/metadata.json @@ -0,0 +1,9 @@ +{ + "slug": "apache-apisix", + "title": "Apache APISIX", + "issue": "https://projects.knownelement.com/issues/179", + "repo": "https://github.com/apache/apisix.git", + "additionalRepos": [], + "created": "2025-10-02T16:46:49Z", + "notes": "TODO: capture packaging notes" +} \ No newline at end of file diff --git a/apps/apache-apisix/start.sh b/apps/apache-apisix/start.sh new file mode 100755 index 0000000..4b919bb --- /dev/null +++ b/apps/apache-apisix/start.sh @@ -0,0 +1,8 @@ +#!/bin/bash +set -euo pipefail + +# Cloudron injects configuration via environment variables and files under /run +# Use this script to render config files and launch the upstream service. + +# TODO: Replace the command below with the correct process supervisor. +exec /bin/sh -c "echo 'Replace start.sh with application startup logic for Apache APISIX' && sleep infinity" diff --git a/apps/apache-apisix/test/smoke.sh b/apps/apache-apisix/test/smoke.sh new file mode 100755 index 0000000..ebd1134 --- /dev/null +++ b/apps/apache-apisix/test/smoke.sh @@ -0,0 +1,16 @@ +#!/bin/bash +set -euo pipefail + +# Basic container reachability check executed inside the packaging container. +# Replace curl target with an endpoint exposed by the app once the package is functional. +cloudron_app_url=${CLOUDRON_APP_ORIGIN:-"http://localhost"} + +http_code=$(curl -s -o /tmp/smoke.log -w "%{http_code}" "${cloudron_app_url}") + +if [[ "${http_code}" != "200" ]]; then + echo "Unexpected HTTP status: ${http_code}" >&2 + cat /tmp/smoke.log >&2 + exit 1 +fi + +echo "Smoke test passed" diff --git a/apps/autobom/CloudronManifest.json b/apps/autobom/CloudronManifest.json new file mode 100644 index 0000000..19dc2c6 --- /dev/null +++ b/apps/autobom/CloudronManifest.json @@ -0,0 +1,20 @@ +{ + "manifestVersion": 2, + "id": "com.knel.autobom", + "title": "Autobom", + "author": "Known Element Packaging Team", + "tagline": "TODO: Short one-line pitch", + "description": "TODO: Comprehensive description for the Cloudron App Store entry.", + "changelog": "Initial scaffold", + "website": "https://github.com/opulo-inc/autobom", + "supportUrl": "https://projects.knownelement.com/issues/278", + "sourceUrl": "https://github.com/opulo-inc/autobom.git", + "version": "0.1.0", + "tags": ["custom", "known-element"], + "healthCheckPath": "/", + "memoryLimit": 536870912, + "httpPort": 3000, + "addons": { + "localstorage": {} + } +} diff --git a/apps/autobom/Dockerfile b/apps/autobom/Dockerfile new file mode 100644 index 0000000..375a8cf --- /dev/null +++ b/apps/autobom/Dockerfile @@ -0,0 +1,22 @@ +# syntax=docker/dockerfile:1 +FROM cloudron/base:5.0.0 + +LABEL org.opencontainers.image.source="https://github.com/opulo-inc/autobom.git" +LABEL org.opencontainers.image.description="Cloudron package for Autobom" + +ARG APP_VERSION +ENV APP_VERSION=${APP_VERSION:-latest} + +# Copy application source into image at build time +# Replace this with a multi-stage build if upstream provides Docker images. +COPY ./app /app/code + +# Copy start script and make it executable +COPY ./start.sh /app/pkg/start.sh +RUN chmod +x /app/pkg/start.sh + +# Cloudron expects all processes to run as cloudron user +USER cloudron +WORKDIR /app/code + +CMD ["/app/pkg/start.sh"] diff --git a/apps/autobom/README.md b/apps/autobom/README.md new file mode 100644 index 0000000..12603d5 --- /dev/null +++ b/apps/autobom/README.md @@ -0,0 +1,20 @@ +# Autobom on Cloudron + +- **Upstream repository**: https://github.com/opulo-inc/autobom.git +- **Implementation issue**: https://projects.knownelement.com/issues/278 +- **Status**: Draft scaffolding generated on $(date -u +"%Y-%m-%dT%H:%M:%SZ") + +## Packaging Checklist + +1. Review upstream deployment requirements and map them to Cloudron services (database, cache, object storage, workers). +2. Update `Dockerfile` with the correct build steps and runtime dependencies. +3. Implement `start.sh` to configure the app from Cloudron-provided environment variables and launch the primary process. +4. Edit `CloudronManifest.json` with accurate metadata, permissions, ports, addons, and health checks. +5. Add integration and smoke tests under `test/` to validate the package. +6. Document manual configuration steps, migration requirements, and known gaps in this README. + +## Notes + +- Replace the placeholder long-running process in `start.sh`. +- Populate the `app/` directory with the application build artefacts or git submodules. +- Use the shared packaging container (`docker/packager`) to run `cloudron build` and `cloudron install` so the host remains clean. diff --git a/apps/autobom/app/.gitkeep b/apps/autobom/app/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/apps/autobom/metadata.json b/apps/autobom/metadata.json new file mode 100644 index 0000000..5a03fa2 --- /dev/null +++ b/apps/autobom/metadata.json @@ -0,0 +1,9 @@ +{ + "slug": "autobom", + "title": "Autobom", + "issue": "https://projects.knownelement.com/issues/278", + "repo": "https://github.com/opulo-inc/autobom.git", + "additionalRepos": [], + "created": "2025-10-02T16:46:49Z", + "notes": "TODO: capture packaging notes" +} \ No newline at end of file diff --git a/apps/autobom/start.sh b/apps/autobom/start.sh new file mode 100755 index 0000000..c577586 --- /dev/null +++ b/apps/autobom/start.sh @@ -0,0 +1,8 @@ +#!/bin/bash +set -euo pipefail + +# Cloudron injects configuration via environment variables and files under /run +# Use this script to render config files and launch the upstream service. + +# TODO: Replace the command below with the correct process supervisor. +exec /bin/sh -c "echo 'Replace start.sh with application startup logic for Autobom' && sleep infinity" diff --git a/apps/autobom/test/smoke.sh b/apps/autobom/test/smoke.sh new file mode 100755 index 0000000..ebd1134 --- /dev/null +++ b/apps/autobom/test/smoke.sh @@ -0,0 +1,16 @@ +#!/bin/bash +set -euo pipefail + +# Basic container reachability check executed inside the packaging container. +# Replace curl target with an endpoint exposed by the app once the package is functional. +cloudron_app_url=${CLOUDRON_APP_ORIGIN:-"http://localhost"} + +http_code=$(curl -s -o /tmp/smoke.log -w "%{http_code}" "${cloudron_app_url}") + +if [[ "${http_code}" != "200" ]]; then + echo "Unexpected HTTP status: ${http_code}" >&2 + cat /tmp/smoke.log >&2 + exit 1 +fi + +echo "Smoke test passed" diff --git a/apps/catalog.json b/apps/catalog.json new file mode 100644 index 0000000..f4f9758 --- /dev/null +++ b/apps/catalog.json @@ -0,0 +1,335 @@ +[ + { + "slug": "apache-apisix", + "title": "Apache APISIX", + "issue": "https://projects.knownelement.com/issues/179", + "repo": "https://github.com/apache/apisix.git" + }, + { + "slug": "target-goalert", + "title": "GoAlert", + "issue": "https://projects.knownelement.com/issues/204", + "repo": "https://github.com/target/goalert.git" + }, + { + "slug": "consuldemocracy", + "title": "CONSUL Democracy", + "issue": "https://projects.knownelement.com/issues/189", + "repo": "https://github.com/consuldemocracy/consuldemocracy.git" + }, + { + "slug": "fleetdm-fleet", + "title": "FleetDM Fleet", + "issue": "https://projects.knownelement.com/issues/195", + "repo": "https://github.com/fleetdm/fleet.git" + }, + { + "slug": "fonoster", + "title": "Fonoster", + "issue": "https://projects.knownelement.com/issues/227", + "repo": "https://github.com/fonoster/fonoster.git" + }, + { + "slug": "healthchecks", + "title": "Healthchecks", + "issue": "https://projects.knownelement.com/issues/192", + "repo": "https://github.com/healthchecks/healthchecks.git" + }, + { + "slug": "hyperswitch", + "title": "HyperSwitch", + "issue": "https://projects.knownelement.com/issues/209", + "repo": "https://github.com/juspay/hyperswitch" + }, + { + "slug": "netbox-docker", + "title": "NetBox Docker", + "issue": "https://projects.knownelement.com/issues/201", + "repo": "https://github.com/netbox-community/netbox-docker.git" + }, + { + "slug": "openboxes-docker", + "title": "OpenBoxes Docker", + "issue": "https://projects.knownelement.com/issues/205", + "repo": "https://github.com/openboxes/openboxes-docker.git" + }, + { + "slug": "openfile", + "title": "OpenFile", + "issue": "https://projects.knownelement.com/issues/316", + "repo": "https://github.com/openfiletax/openfile.git" + }, + { + "slug": "sniperphish", + "title": "SniperPhish", + "issue": "https://projects.knownelement.com/issues/211", + "repo": "https://github.com/GemGeorge/SniperPhish-Docker.git" + }, + { + "slug": "datahub", + "title": "DataHub", + "issue": "https://projects.knownelement.com/issues/309", + "repo": "https://github.com/datahub-project/datahub.git" + }, + { + "slug": "easy-gate", + "title": "Easy Gate", + "issue": "https://projects.knownelement.com/issues/54", + "repo": "https://github.com/wiredlush/easy-gate.git" + }, + { + "slug": "payroll-engine", + "title": "Payroll Engine", + "issue": "https://projects.knownelement.com/issues/208", + "repo": "https://github.com/Payroll-Engine/PayrollEngine.git" + }, + { + "slug": "huginn", + "title": "Huginn", + "issue": "https://projects.knownelement.com/issues/194", + "repo": "https://github.com/huginn/huginn.git" + }, + { + "slug": "grist", + "title": "Grist", + "issue": "https://projects.knownelement.com/issues/191", + "repo": "https://github.com/gristlabs/grist-core" + }, + { + "slug": "docassemble", + "title": "Docassemble", + "issue": "https://projects.knownelement.com/issues/277", + "repo": "https://github.com/jhpyle/docassemble.git" + }, + { + "slug": "database-gateway", + "title": "Database Gateway", + "issue": "https://projects.knownelement.com/issues/273", + "repo": "https://github.com/kazhuravlev/database-gateway.git" + }, + { + "slug": "rundeck", + "title": "Rundeck", + "issue": "https://projects.knownelement.com/issues/217", + "repo": "https://github.com/rundeck/rundeck.git" + }, + { + "slug": "slurm", + "title": "Slurm", + "issue": "https://projects.knownelement.com/issues/222", + "repo": "https://github.com/SchedMD/slurm.git", + "additionalRepos": [ + "https://github.com/giovtorres/slurm-docker-cluster.git" + ] + }, + { + "slug": "rathole", + "title": "rathole", + "issue": "https://projects.knownelement.com/issues/225", + "repo": "https://github.com/rathole-org/rathole.git" + }, + { + "slug": "jenkins", + "title": "Jenkins", + "issue": "https://projects.knownelement.com/issues/234", + "repo": "https://github.com/jenkinsci/jenkins.git" + }, + { + "slug": "runme", + "title": "Runme", + "issue": "https://projects.knownelement.com/issues/322", + "repo": "https://github.com/runmedev/runme.git" + }, + { + "slug": "seatunnel", + "title": "SeaTunnel", + "issue": "https://projects.knownelement.com/issues/301", + "repo": "https://github.com/apache/seatunnel" + }, + { + "slug": "docker-webhook", + "title": "docker-webhook", + "issue": "https://projects.knownelement.com/issues/271", + "repo": "https://github.com/thecatlady/docker-webhook" + }, + { + "slug": "inventree", + "title": "InvenTree", + "issue": "https://projects.knownelement.com/issues/173", + "repo": "https://github.com/inventree/InvenTree.git" + }, + { + "slug": "tak-server", + "title": "TAK Server", + "issue": "https://projects.knownelement.com/issues/180", + "repo": "https://github.com/Cloud-RF/tak-server" + }, + { + "slug": "midday", + "title": "Midday", + "issue": "https://projects.knownelement.com/issues/178", + "repo": "https://github.com/midday-ai/midday.git" + }, + { + "slug": "killbill", + "title": "Kill Bill", + "issue": "https://projects.knownelement.com/issues/181", + "repo": "https://github.com/killbill/killbill.git" + }, + { + "slug": "chirpstack", + "title": "ChirpStack", + "issue": "https://projects.knownelement.com/issues/184", + "repo": "https://github.com/chirpstack/chirpstack.git" + }, + { + "slug": "craig", + "title": "Craig (FOSS Discord Recorder)", + "issue": "https://projects.knownelement.com/issues/185", + "repo": "https://github.com/CraigChat/craig.git" + }, + { + "slug": "elabftw", + "title": "eLabFTW", + "issue": "https://projects.knownelement.com/issues/188", + "repo": "https://github.com/elabftw/elabftw.git" + }, + { + "slug": "jamovi", + "title": "jamovi", + "issue": "https://projects.knownelement.com/issues/196", + "repo": "https://github.com/jamovi/jamovi.git" + }, + { + "slug": "kibot", + "title": "KiBot", + "issue": "https://projects.knownelement.com/issues/197", + "repo": "https://github.com/INTI-CMNB/KiBot.git" + }, + { + "slug": "resgrid", + "title": "Resgrid Core", + "issue": "https://projects.knownelement.com/issues/214", + "repo": "https://github.com/Resgrid/Core" + }, + { + "slug": "reviewboard", + "title": "Review Board", + "issue": "https://projects.knownelement.com/issues/216", + "repo": "https://github.com/reviewboard/reviewboard.git" + }, + { + "slug": "satnogs-kaitai", + "title": "SatNOGS Kaitai", + "issue": "https://projects.knownelement.com/issues/218", + "repo": "https://gitlab.com/librespacefoundation/satnogs/docker-kaitai.git" + }, + { + "slug": "satnogs-webgui", + "title": "SatNOGS WebGUI", + "issue": "https://projects.knownelement.com/issues/218", + "repo": "https://gitlab.com/librespacefoundation/satnogs/docker-satnogs-webgui.git" + }, + { + "slug": "sdrangel", + "title": "SDRAngel", + "issue": "https://projects.knownelement.com/issues/219", + "repo": "https://github.com/f4exb/sdrangel-docker" + }, + { + "slug": "signoz", + "title": "SigNoz", + "issue": "https://projects.knownelement.com/issues/221", + "repo": "https://github.com/SigNoz/signoz.git" + }, + { + "slug": "warp", + "title": "Warp", + "issue": "https://projects.knownelement.com/issues/228", + "repo": "https://github.com/sebo-b/warp.git" + }, + { + "slug": "drawio", + "title": "draw.io", + "issue": "https://projects.knownelement.com/issues/272", + "repo": "https://github.com/jgraph/docker-drawio" + }, + { + "slug": "openblocks", + "title": "OpenBlocks", + "issue": "https://projects.knownelement.com/issues/274", + "repo": "https://github.com/openblocks-dev/openblocks.git" + }, + { + "slug": "wireviz-web", + "title": "Wireviz Web", + "issue": "https://projects.knownelement.com/issues/276", + "repo": "https://github.com/wireviz/wireviz-web.git" + }, + { + "slug": "autobom", + "title": "Autobom", + "issue": "https://projects.knownelement.com/issues/278", + "repo": "https://github.com/opulo-inc/autobom.git" + }, + { + "slug": "plmore", + "title": "PLMore", + "issue": "https://projects.knownelement.com/issues/279", + "repo": "https://github.com/PLMore/PLMore" + }, + { + "slug": "manyfold", + "title": "Manyfold", + "issue": "https://projects.knownelement.com/issues/282", + "repo": "https://github.com/manyfold3d/manyfold.git" + }, + { + "slug": "langfuse", + "title": "Langfuse OSS LLMOps Stack", + "issue": "https://projects.knownelement.com/issues/283", + "repo": "https://github.com/langfuse/oss-llmops-stack.git" + }, + { + "slug": "puter", + "title": "Puter", + "issue": "https://projects.knownelement.com/issues/286", + "repo": "https://github.com/HeyPuter/puter.git" + }, + { + "slug": "windmill", + "title": "Windmill", + "issue": "https://projects.knownelement.com/issues/285", + "repo": "https://github.com/windmill-labs/windmill.git" + }, + { + "slug": "swupdate", + "title": "swupdate", + "issue": "https://projects.knownelement.com/issues/326", + "repo": "https://github.com/sbabic/swupdate.git" + }, + { + "slug": "mender-server", + "title": "Mender Server", + "issue": "https://projects.knownelement.com/issues/300", + "repo": "https://github.com/mendersoftware/mender-server.git" + }, + { + "slug": "wireflow", + "title": "Wireflow", + "issue": "https://projects.knownelement.com/issues/50", + "repo": "https://github.com/vanila-io/wireflow.git" + }, + { + "slug": "nautilus-trader", + "title": "Nautilus Trader", + "issue": "https://projects.knownelement.com/issues/226", + "repo": "https://github.com/nautechsystems/nautilus_trader.git" + }, + { + "slug": "mirlo", + "title": "Mirlo", + "issue": "https://projects.knownelement.com/issues/TBD", + "repo": "https://github.com/funmusicplace/mirlo.git" + } +] diff --git a/apps/chirpstack/CloudronManifest.json b/apps/chirpstack/CloudronManifest.json new file mode 100644 index 0000000..8065bbb --- /dev/null +++ b/apps/chirpstack/CloudronManifest.json @@ -0,0 +1,20 @@ +{ + "manifestVersion": 2, + "id": "com.knel.chirpstack", + "title": "ChirpStack", + "author": "Known Element Packaging Team", + "tagline": "TODO: Short one-line pitch", + "description": "TODO: Comprehensive description for the Cloudron App Store entry.", + "changelog": "Initial scaffold", + "website": "https://github.com/chirpstack/chirpstack", + "supportUrl": "https://projects.knownelement.com/issues/184", + "sourceUrl": "https://github.com/chirpstack/chirpstack.git", + "version": "0.1.0", + "tags": ["custom", "known-element"], + "healthCheckPath": "/", + "memoryLimit": 536870912, + "httpPort": 3000, + "addons": { + "localstorage": {} + } +} diff --git a/apps/chirpstack/Dockerfile b/apps/chirpstack/Dockerfile new file mode 100644 index 0000000..884ac7c --- /dev/null +++ b/apps/chirpstack/Dockerfile @@ -0,0 +1,22 @@ +# syntax=docker/dockerfile:1 +FROM cloudron/base:5.0.0 + +LABEL org.opencontainers.image.source="https://github.com/chirpstack/chirpstack.git" +LABEL org.opencontainers.image.description="Cloudron package for ChirpStack" + +ARG APP_VERSION +ENV APP_VERSION=${APP_VERSION:-latest} + +# Copy application source into image at build time +# Replace this with a multi-stage build if upstream provides Docker images. +COPY ./app /app/code + +# Copy start script and make it executable +COPY ./start.sh /app/pkg/start.sh +RUN chmod +x /app/pkg/start.sh + +# Cloudron expects all processes to run as cloudron user +USER cloudron +WORKDIR /app/code + +CMD ["/app/pkg/start.sh"] diff --git a/apps/chirpstack/README.md b/apps/chirpstack/README.md new file mode 100644 index 0000000..2791195 --- /dev/null +++ b/apps/chirpstack/README.md @@ -0,0 +1,20 @@ +# ChirpStack on Cloudron + +- **Upstream repository**: https://github.com/chirpstack/chirpstack.git +- **Implementation issue**: https://projects.knownelement.com/issues/184 +- **Status**: Draft scaffolding generated on $(date -u +"%Y-%m-%dT%H:%M:%SZ") + +## Packaging Checklist + +1. Review upstream deployment requirements and map them to Cloudron services (database, cache, object storage, workers). +2. Update `Dockerfile` with the correct build steps and runtime dependencies. +3. Implement `start.sh` to configure the app from Cloudron-provided environment variables and launch the primary process. +4. Edit `CloudronManifest.json` with accurate metadata, permissions, ports, addons, and health checks. +5. Add integration and smoke tests under `test/` to validate the package. +6. Document manual configuration steps, migration requirements, and known gaps in this README. + +## Notes + +- Replace the placeholder long-running process in `start.sh`. +- Populate the `app/` directory with the application build artefacts or git submodules. +- Use the shared packaging container (`docker/packager`) to run `cloudron build` and `cloudron install` so the host remains clean. diff --git a/apps/chirpstack/app/.gitkeep b/apps/chirpstack/app/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/apps/chirpstack/metadata.json b/apps/chirpstack/metadata.json new file mode 100644 index 0000000..fffe1d7 --- /dev/null +++ b/apps/chirpstack/metadata.json @@ -0,0 +1,9 @@ +{ + "slug": "chirpstack", + "title": "ChirpStack", + "issue": "https://projects.knownelement.com/issues/184", + "repo": "https://github.com/chirpstack/chirpstack.git", + "additionalRepos": [], + "created": "2025-10-02T16:46:49Z", + "notes": "TODO: capture packaging notes" +} \ No newline at end of file diff --git a/apps/chirpstack/start.sh b/apps/chirpstack/start.sh new file mode 100755 index 0000000..2c6b121 --- /dev/null +++ b/apps/chirpstack/start.sh @@ -0,0 +1,8 @@ +#!/bin/bash +set -euo pipefail + +# Cloudron injects configuration via environment variables and files under /run +# Use this script to render config files and launch the upstream service. + +# TODO: Replace the command below with the correct process supervisor. +exec /bin/sh -c "echo 'Replace start.sh with application startup logic for ChirpStack' && sleep infinity" diff --git a/apps/chirpstack/test/smoke.sh b/apps/chirpstack/test/smoke.sh new file mode 100755 index 0000000..ebd1134 --- /dev/null +++ b/apps/chirpstack/test/smoke.sh @@ -0,0 +1,16 @@ +#!/bin/bash +set -euo pipefail + +# Basic container reachability check executed inside the packaging container. +# Replace curl target with an endpoint exposed by the app once the package is functional. +cloudron_app_url=${CLOUDRON_APP_ORIGIN:-"http://localhost"} + +http_code=$(curl -s -o /tmp/smoke.log -w "%{http_code}" "${cloudron_app_url}") + +if [[ "${http_code}" != "200" ]]; then + echo "Unexpected HTTP status: ${http_code}" >&2 + cat /tmp/smoke.log >&2 + exit 1 +fi + +echo "Smoke test passed" diff --git a/apps/consuldemocracy/CloudronManifest.json b/apps/consuldemocracy/CloudronManifest.json new file mode 100644 index 0000000..e9685c4 --- /dev/null +++ b/apps/consuldemocracy/CloudronManifest.json @@ -0,0 +1,20 @@ +{ + "manifestVersion": 2, + "id": "com.knel.consuldemocracy", + "title": "CONSUL Democracy", + "author": "Known Element Packaging Team", + "tagline": "TODO: Short one-line pitch", + "description": "TODO: Comprehensive description for the Cloudron App Store entry.", + "changelog": "Initial scaffold", + "website": "https://github.com/consuldemocracy/consuldemocracy", + "supportUrl": "https://projects.knownelement.com/issues/189", + "sourceUrl": "https://github.com/consuldemocracy/consuldemocracy.git", + "version": "0.1.0", + "tags": ["custom", "known-element"], + "healthCheckPath": "/", + "memoryLimit": 536870912, + "httpPort": 3000, + "addons": { + "localstorage": {} + } +} diff --git a/apps/consuldemocracy/Dockerfile b/apps/consuldemocracy/Dockerfile new file mode 100644 index 0000000..5065900 --- /dev/null +++ b/apps/consuldemocracy/Dockerfile @@ -0,0 +1,22 @@ +# syntax=docker/dockerfile:1 +FROM cloudron/base:5.0.0 + +LABEL org.opencontainers.image.source="https://github.com/consuldemocracy/consuldemocracy.git" +LABEL org.opencontainers.image.description="Cloudron package for CONSUL Democracy" + +ARG APP_VERSION +ENV APP_VERSION=${APP_VERSION:-latest} + +# Copy application source into image at build time +# Replace this with a multi-stage build if upstream provides Docker images. +COPY ./app /app/code + +# Copy start script and make it executable +COPY ./start.sh /app/pkg/start.sh +RUN chmod +x /app/pkg/start.sh + +# Cloudron expects all processes to run as cloudron user +USER cloudron +WORKDIR /app/code + +CMD ["/app/pkg/start.sh"] diff --git a/apps/consuldemocracy/README.md b/apps/consuldemocracy/README.md new file mode 100644 index 0000000..fa83577 --- /dev/null +++ b/apps/consuldemocracy/README.md @@ -0,0 +1,20 @@ +# CONSUL Democracy on Cloudron + +- **Upstream repository**: https://github.com/consuldemocracy/consuldemocracy.git +- **Implementation issue**: https://projects.knownelement.com/issues/189 +- **Status**: Draft scaffolding generated on $(date -u +"%Y-%m-%dT%H:%M:%SZ") + +## Packaging Checklist + +1. Review upstream deployment requirements and map them to Cloudron services (database, cache, object storage, workers). +2. Update `Dockerfile` with the correct build steps and runtime dependencies. +3. Implement `start.sh` to configure the app from Cloudron-provided environment variables and launch the primary process. +4. Edit `CloudronManifest.json` with accurate metadata, permissions, ports, addons, and health checks. +5. Add integration and smoke tests under `test/` to validate the package. +6. Document manual configuration steps, migration requirements, and known gaps in this README. + +## Notes + +- Replace the placeholder long-running process in `start.sh`. +- Populate the `app/` directory with the application build artefacts or git submodules. +- Use the shared packaging container (`docker/packager`) to run `cloudron build` and `cloudron install` so the host remains clean. diff --git a/apps/consuldemocracy/app/.gitkeep b/apps/consuldemocracy/app/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/apps/consuldemocracy/metadata.json b/apps/consuldemocracy/metadata.json new file mode 100644 index 0000000..45bac95 --- /dev/null +++ b/apps/consuldemocracy/metadata.json @@ -0,0 +1,9 @@ +{ + "slug": "consuldemocracy", + "title": "CONSUL Democracy", + "issue": "https://projects.knownelement.com/issues/189", + "repo": "https://github.com/consuldemocracy/consuldemocracy.git", + "additionalRepos": [], + "created": "2025-10-02T16:46:49Z", + "notes": "TODO: capture packaging notes" +} \ No newline at end of file diff --git a/apps/consuldemocracy/start.sh b/apps/consuldemocracy/start.sh new file mode 100755 index 0000000..3508d70 --- /dev/null +++ b/apps/consuldemocracy/start.sh @@ -0,0 +1,8 @@ +#!/bin/bash +set -euo pipefail + +# Cloudron injects configuration via environment variables and files under /run +# Use this script to render config files and launch the upstream service. + +# TODO: Replace the command below with the correct process supervisor. +exec /bin/sh -c "echo 'Replace start.sh with application startup logic for CONSUL Democracy' && sleep infinity" diff --git a/apps/consuldemocracy/test/smoke.sh b/apps/consuldemocracy/test/smoke.sh new file mode 100755 index 0000000..ebd1134 --- /dev/null +++ b/apps/consuldemocracy/test/smoke.sh @@ -0,0 +1,16 @@ +#!/bin/bash +set -euo pipefail + +# Basic container reachability check executed inside the packaging container. +# Replace curl target with an endpoint exposed by the app once the package is functional. +cloudron_app_url=${CLOUDRON_APP_ORIGIN:-"http://localhost"} + +http_code=$(curl -s -o /tmp/smoke.log -w "%{http_code}" "${cloudron_app_url}") + +if [[ "${http_code}" != "200" ]]; then + echo "Unexpected HTTP status: ${http_code}" >&2 + cat /tmp/smoke.log >&2 + exit 1 +fi + +echo "Smoke test passed" diff --git a/apps/craig/CloudronManifest.json b/apps/craig/CloudronManifest.json new file mode 100644 index 0000000..60f8d24 --- /dev/null +++ b/apps/craig/CloudronManifest.json @@ -0,0 +1,20 @@ +{ + "manifestVersion": 2, + "id": "com.knel.craig", + "title": "Craig (FOSS Discord Recorder)", + "author": "Known Element Packaging Team", + "tagline": "TODO: Short one-line pitch", + "description": "TODO: Comprehensive description for the Cloudron App Store entry.", + "changelog": "Initial scaffold", + "website": "https://github.com/CraigChat/cra", + "supportUrl": "https://projects.knownelement.com/issues/185", + "sourceUrl": "https://github.com/CraigChat/craig.git", + "version": "0.1.0", + "tags": ["custom", "known-element"], + "healthCheckPath": "/", + "memoryLimit": 536870912, + "httpPort": 3000, + "addons": { + "localstorage": {} + } +} diff --git a/apps/craig/Dockerfile b/apps/craig/Dockerfile new file mode 100644 index 0000000..c45d25d --- /dev/null +++ b/apps/craig/Dockerfile @@ -0,0 +1,22 @@ +# syntax=docker/dockerfile:1 +FROM cloudron/base:5.0.0 + +LABEL org.opencontainers.image.source="https://github.com/CraigChat/craig.git" +LABEL org.opencontainers.image.description="Cloudron package for Craig (FOSS Discord Recorder)" + +ARG APP_VERSION +ENV APP_VERSION=${APP_VERSION:-latest} + +# Copy application source into image at build time +# Replace this with a multi-stage build if upstream provides Docker images. +COPY ./app /app/code + +# Copy start script and make it executable +COPY ./start.sh /app/pkg/start.sh +RUN chmod +x /app/pkg/start.sh + +# Cloudron expects all processes to run as cloudron user +USER cloudron +WORKDIR /app/code + +CMD ["/app/pkg/start.sh"] diff --git a/apps/craig/README.md b/apps/craig/README.md new file mode 100644 index 0000000..81b6dc4 --- /dev/null +++ b/apps/craig/README.md @@ -0,0 +1,20 @@ +# Craig (FOSS Discord Recorder) on Cloudron + +- **Upstream repository**: https://github.com/CraigChat/craig.git +- **Implementation issue**: https://projects.knownelement.com/issues/185 +- **Status**: Draft scaffolding generated on $(date -u +"%Y-%m-%dT%H:%M:%SZ") + +## Packaging Checklist + +1. Review upstream deployment requirements and map them to Cloudron services (database, cache, object storage, workers). +2. Update `Dockerfile` with the correct build steps and runtime dependencies. +3. Implement `start.sh` to configure the app from Cloudron-provided environment variables and launch the primary process. +4. Edit `CloudronManifest.json` with accurate metadata, permissions, ports, addons, and health checks. +5. Add integration and smoke tests under `test/` to validate the package. +6. Document manual configuration steps, migration requirements, and known gaps in this README. + +## Notes + +- Replace the placeholder long-running process in `start.sh`. +- Populate the `app/` directory with the application build artefacts or git submodules. +- Use the shared packaging container (`docker/packager`) to run `cloudron build` and `cloudron install` so the host remains clean. diff --git a/apps/craig/app/.gitkeep b/apps/craig/app/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/apps/craig/metadata.json b/apps/craig/metadata.json new file mode 100644 index 0000000..60c68d1 --- /dev/null +++ b/apps/craig/metadata.json @@ -0,0 +1,9 @@ +{ + "slug": "craig", + "title": "Craig (FOSS Discord Recorder)", + "issue": "https://projects.knownelement.com/issues/185", + "repo": "https://github.com/CraigChat/craig.git", + "additionalRepos": [], + "created": "2025-10-02T16:46:49Z", + "notes": "TODO: capture packaging notes" +} \ No newline at end of file diff --git a/apps/craig/start.sh b/apps/craig/start.sh new file mode 100755 index 0000000..2f595aa --- /dev/null +++ b/apps/craig/start.sh @@ -0,0 +1,8 @@ +#!/bin/bash +set -euo pipefail + +# Cloudron injects configuration via environment variables and files under /run +# Use this script to render config files and launch the upstream service. + +# TODO: Replace the command below with the correct process supervisor. +exec /bin/sh -c "echo 'Replace start.sh with application startup logic for Craig (FOSS Discord Recorder)' && sleep infinity" diff --git a/apps/craig/test/smoke.sh b/apps/craig/test/smoke.sh new file mode 100755 index 0000000..ebd1134 --- /dev/null +++ b/apps/craig/test/smoke.sh @@ -0,0 +1,16 @@ +#!/bin/bash +set -euo pipefail + +# Basic container reachability check executed inside the packaging container. +# Replace curl target with an endpoint exposed by the app once the package is functional. +cloudron_app_url=${CLOUDRON_APP_ORIGIN:-"http://localhost"} + +http_code=$(curl -s -o /tmp/smoke.log -w "%{http_code}" "${cloudron_app_url}") + +if [[ "${http_code}" != "200" ]]; then + echo "Unexpected HTTP status: ${http_code}" >&2 + cat /tmp/smoke.log >&2 + exit 1 +fi + +echo "Smoke test passed" diff --git a/apps/database-gateway/CloudronManifest.json b/apps/database-gateway/CloudronManifest.json new file mode 100644 index 0000000..27af355 --- /dev/null +++ b/apps/database-gateway/CloudronManifest.json @@ -0,0 +1,20 @@ +{ + "manifestVersion": 2, + "id": "com.knel.database.gateway", + "title": "Database Gateway", + "author": "Known Element Packaging Team", + "tagline": "TODO: Short one-line pitch", + "description": "TODO: Comprehensive description for the Cloudron App Store entry.", + "changelog": "Initial scaffold", + "website": "https://github.com/kazhuravlev/database-gateway", + "supportUrl": "https://projects.knownelement.com/issues/273", + "sourceUrl": "https://github.com/kazhuravlev/database-gateway.git", + "version": "0.1.0", + "tags": ["custom", "known-element"], + "healthCheckPath": "/", + "memoryLimit": 536870912, + "httpPort": 3000, + "addons": { + "localstorage": {} + } +} diff --git a/apps/database-gateway/Dockerfile b/apps/database-gateway/Dockerfile new file mode 100644 index 0000000..a577c80 --- /dev/null +++ b/apps/database-gateway/Dockerfile @@ -0,0 +1,22 @@ +# syntax=docker/dockerfile:1 +FROM cloudron/base:5.0.0 + +LABEL org.opencontainers.image.source="https://github.com/kazhuravlev/database-gateway.git" +LABEL org.opencontainers.image.description="Cloudron package for Database Gateway" + +ARG APP_VERSION +ENV APP_VERSION=${APP_VERSION:-latest} + +# Copy application source into image at build time +# Replace this with a multi-stage build if upstream provides Docker images. +COPY ./app /app/code + +# Copy start script and make it executable +COPY ./start.sh /app/pkg/start.sh +RUN chmod +x /app/pkg/start.sh + +# Cloudron expects all processes to run as cloudron user +USER cloudron +WORKDIR /app/code + +CMD ["/app/pkg/start.sh"] diff --git a/apps/database-gateway/README.md b/apps/database-gateway/README.md new file mode 100644 index 0000000..75e8cbb --- /dev/null +++ b/apps/database-gateway/README.md @@ -0,0 +1,20 @@ +# Database Gateway on Cloudron + +- **Upstream repository**: https://github.com/kazhuravlev/database-gateway.git +- **Implementation issue**: https://projects.knownelement.com/issues/273 +- **Status**: Draft scaffolding generated on $(date -u +"%Y-%m-%dT%H:%M:%SZ") + +## Packaging Checklist + +1. Review upstream deployment requirements and map them to Cloudron services (database, cache, object storage, workers). +2. Update `Dockerfile` with the correct build steps and runtime dependencies. +3. Implement `start.sh` to configure the app from Cloudron-provided environment variables and launch the primary process. +4. Edit `CloudronManifest.json` with accurate metadata, permissions, ports, addons, and health checks. +5. Add integration and smoke tests under `test/` to validate the package. +6. Document manual configuration steps, migration requirements, and known gaps in this README. + +## Notes + +- Replace the placeholder long-running process in `start.sh`. +- Populate the `app/` directory with the application build artefacts or git submodules. +- Use the shared packaging container (`docker/packager`) to run `cloudron build` and `cloudron install` so the host remains clean. diff --git a/apps/database-gateway/app/.gitkeep b/apps/database-gateway/app/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/apps/database-gateway/metadata.json b/apps/database-gateway/metadata.json new file mode 100644 index 0000000..4f83acc --- /dev/null +++ b/apps/database-gateway/metadata.json @@ -0,0 +1,9 @@ +{ + "slug": "database-gateway", + "title": "Database Gateway", + "issue": "https://projects.knownelement.com/issues/273", + "repo": "https://github.com/kazhuravlev/database-gateway.git", + "additionalRepos": [], + "created": "2025-10-02T16:46:49Z", + "notes": "TODO: capture packaging notes" +} \ No newline at end of file diff --git a/apps/database-gateway/start.sh b/apps/database-gateway/start.sh new file mode 100755 index 0000000..6edb28b --- /dev/null +++ b/apps/database-gateway/start.sh @@ -0,0 +1,8 @@ +#!/bin/bash +set -euo pipefail + +# Cloudron injects configuration via environment variables and files under /run +# Use this script to render config files and launch the upstream service. + +# TODO: Replace the command below with the correct process supervisor. +exec /bin/sh -c "echo 'Replace start.sh with application startup logic for Database Gateway' && sleep infinity" diff --git a/apps/database-gateway/test/smoke.sh b/apps/database-gateway/test/smoke.sh new file mode 100755 index 0000000..ebd1134 --- /dev/null +++ b/apps/database-gateway/test/smoke.sh @@ -0,0 +1,16 @@ +#!/bin/bash +set -euo pipefail + +# Basic container reachability check executed inside the packaging container. +# Replace curl target with an endpoint exposed by the app once the package is functional. +cloudron_app_url=${CLOUDRON_APP_ORIGIN:-"http://localhost"} + +http_code=$(curl -s -o /tmp/smoke.log -w "%{http_code}" "${cloudron_app_url}") + +if [[ "${http_code}" != "200" ]]; then + echo "Unexpected HTTP status: ${http_code}" >&2 + cat /tmp/smoke.log >&2 + exit 1 +fi + +echo "Smoke test passed" diff --git a/apps/datahub/CloudronManifest.json b/apps/datahub/CloudronManifest.json new file mode 100644 index 0000000..f7ecc28 --- /dev/null +++ b/apps/datahub/CloudronManifest.json @@ -0,0 +1,20 @@ +{ + "manifestVersion": 2, + "id": "com.knel.datahub", + "title": "DataHub", + "author": "Known Element Packaging Team", + "tagline": "TODO: Short one-line pitch", + "description": "TODO: Comprehensive description for the Cloudron App Store entry.", + "changelog": "Initial scaffold", + "website": "https://github.com/datahub-project/datahub", + "supportUrl": "https://projects.knownelement.com/issues/309", + "sourceUrl": "https://github.com/datahub-project/datahub.git", + "version": "0.1.0", + "tags": ["custom", "known-element"], + "healthCheckPath": "/", + "memoryLimit": 536870912, + "httpPort": 3000, + "addons": { + "localstorage": {} + } +} diff --git a/apps/datahub/Dockerfile b/apps/datahub/Dockerfile new file mode 100644 index 0000000..f073227 --- /dev/null +++ b/apps/datahub/Dockerfile @@ -0,0 +1,22 @@ +# syntax=docker/dockerfile:1 +FROM cloudron/base:5.0.0 + +LABEL org.opencontainers.image.source="https://github.com/datahub-project/datahub.git" +LABEL org.opencontainers.image.description="Cloudron package for DataHub" + +ARG APP_VERSION +ENV APP_VERSION=${APP_VERSION:-latest} + +# Copy application source into image at build time +# Replace this with a multi-stage build if upstream provides Docker images. +COPY ./app /app/code + +# Copy start script and make it executable +COPY ./start.sh /app/pkg/start.sh +RUN chmod +x /app/pkg/start.sh + +# Cloudron expects all processes to run as cloudron user +USER cloudron +WORKDIR /app/code + +CMD ["/app/pkg/start.sh"] diff --git a/apps/datahub/README.md b/apps/datahub/README.md new file mode 100644 index 0000000..8fb4f2b --- /dev/null +++ b/apps/datahub/README.md @@ -0,0 +1,20 @@ +# DataHub on Cloudron + +- **Upstream repository**: https://github.com/datahub-project/datahub.git +- **Implementation issue**: https://projects.knownelement.com/issues/309 +- **Status**: Draft scaffolding generated on $(date -u +"%Y-%m-%dT%H:%M:%SZ") + +## Packaging Checklist + +1. Review upstream deployment requirements and map them to Cloudron services (database, cache, object storage, workers). +2. Update `Dockerfile` with the correct build steps and runtime dependencies. +3. Implement `start.sh` to configure the app from Cloudron-provided environment variables and launch the primary process. +4. Edit `CloudronManifest.json` with accurate metadata, permissions, ports, addons, and health checks. +5. Add integration and smoke tests under `test/` to validate the package. +6. Document manual configuration steps, migration requirements, and known gaps in this README. + +## Notes + +- Replace the placeholder long-running process in `start.sh`. +- Populate the `app/` directory with the application build artefacts or git submodules. +- Use the shared packaging container (`docker/packager`) to run `cloudron build` and `cloudron install` so the host remains clean. diff --git a/apps/datahub/app/.gitkeep b/apps/datahub/app/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/apps/datahub/metadata.json b/apps/datahub/metadata.json new file mode 100644 index 0000000..8792248 --- /dev/null +++ b/apps/datahub/metadata.json @@ -0,0 +1,9 @@ +{ + "slug": "datahub", + "title": "DataHub", + "issue": "https://projects.knownelement.com/issues/309", + "repo": "https://github.com/datahub-project/datahub.git", + "additionalRepos": [], + "created": "2025-10-02T16:46:49Z", + "notes": "TODO: capture packaging notes" +} \ No newline at end of file diff --git a/apps/datahub/start.sh b/apps/datahub/start.sh new file mode 100755 index 0000000..ce6d986 --- /dev/null +++ b/apps/datahub/start.sh @@ -0,0 +1,8 @@ +#!/bin/bash +set -euo pipefail + +# Cloudron injects configuration via environment variables and files under /run +# Use this script to render config files and launch the upstream service. + +# TODO: Replace the command below with the correct process supervisor. +exec /bin/sh -c "echo 'Replace start.sh with application startup logic for DataHub' && sleep infinity" diff --git a/apps/datahub/test/smoke.sh b/apps/datahub/test/smoke.sh new file mode 100755 index 0000000..ebd1134 --- /dev/null +++ b/apps/datahub/test/smoke.sh @@ -0,0 +1,16 @@ +#!/bin/bash +set -euo pipefail + +# Basic container reachability check executed inside the packaging container. +# Replace curl target with an endpoint exposed by the app once the package is functional. +cloudron_app_url=${CLOUDRON_APP_ORIGIN:-"http://localhost"} + +http_code=$(curl -s -o /tmp/smoke.log -w "%{http_code}" "${cloudron_app_url}") + +if [[ "${http_code}" != "200" ]]; then + echo "Unexpected HTTP status: ${http_code}" >&2 + cat /tmp/smoke.log >&2 + exit 1 +fi + +echo "Smoke test passed" diff --git a/apps/docassemble/CloudronManifest.json b/apps/docassemble/CloudronManifest.json new file mode 100644 index 0000000..2ecf43a --- /dev/null +++ b/apps/docassemble/CloudronManifest.json @@ -0,0 +1,20 @@ +{ + "manifestVersion": 2, + "id": "com.knel.docassemble", + "title": "Docassemble", + "author": "Known Element Packaging Team", + "tagline": "TODO: Short one-line pitch", + "description": "TODO: Comprehensive description for the Cloudron App Store entry.", + "changelog": "Initial scaffold", + "website": "https://github.com/jhpyle/docassemble", + "supportUrl": "https://projects.knownelement.com/issues/277", + "sourceUrl": "https://github.com/jhpyle/docassemble.git", + "version": "0.1.0", + "tags": ["custom", "known-element"], + "healthCheckPath": "/", + "memoryLimit": 536870912, + "httpPort": 3000, + "addons": { + "localstorage": {} + } +} diff --git a/apps/docassemble/Dockerfile b/apps/docassemble/Dockerfile new file mode 100644 index 0000000..4947c40 --- /dev/null +++ b/apps/docassemble/Dockerfile @@ -0,0 +1,22 @@ +# syntax=docker/dockerfile:1 +FROM cloudron/base:5.0.0 + +LABEL org.opencontainers.image.source="https://github.com/jhpyle/docassemble.git" +LABEL org.opencontainers.image.description="Cloudron package for Docassemble" + +ARG APP_VERSION +ENV APP_VERSION=${APP_VERSION:-latest} + +# Copy application source into image at build time +# Replace this with a multi-stage build if upstream provides Docker images. +COPY ./app /app/code + +# Copy start script and make it executable +COPY ./start.sh /app/pkg/start.sh +RUN chmod +x /app/pkg/start.sh + +# Cloudron expects all processes to run as cloudron user +USER cloudron +WORKDIR /app/code + +CMD ["/app/pkg/start.sh"] diff --git a/apps/docassemble/README.md b/apps/docassemble/README.md new file mode 100644 index 0000000..f689344 --- /dev/null +++ b/apps/docassemble/README.md @@ -0,0 +1,20 @@ +# Docassemble on Cloudron + +- **Upstream repository**: https://github.com/jhpyle/docassemble.git +- **Implementation issue**: https://projects.knownelement.com/issues/277 +- **Status**: Draft scaffolding generated on $(date -u +"%Y-%m-%dT%H:%M:%SZ") + +## Packaging Checklist + +1. Review upstream deployment requirements and map them to Cloudron services (database, cache, object storage, workers). +2. Update `Dockerfile` with the correct build steps and runtime dependencies. +3. Implement `start.sh` to configure the app from Cloudron-provided environment variables and launch the primary process. +4. Edit `CloudronManifest.json` with accurate metadata, permissions, ports, addons, and health checks. +5. Add integration and smoke tests under `test/` to validate the package. +6. Document manual configuration steps, migration requirements, and known gaps in this README. + +## Notes + +- Replace the placeholder long-running process in `start.sh`. +- Populate the `app/` directory with the application build artefacts or git submodules. +- Use the shared packaging container (`docker/packager`) to run `cloudron build` and `cloudron install` so the host remains clean. diff --git a/apps/docassemble/app/.gitkeep b/apps/docassemble/app/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/apps/docassemble/metadata.json b/apps/docassemble/metadata.json new file mode 100644 index 0000000..883f50e --- /dev/null +++ b/apps/docassemble/metadata.json @@ -0,0 +1,9 @@ +{ + "slug": "docassemble", + "title": "Docassemble", + "issue": "https://projects.knownelement.com/issues/277", + "repo": "https://github.com/jhpyle/docassemble.git", + "additionalRepos": [], + "created": "2025-10-02T16:46:49Z", + "notes": "TODO: capture packaging notes" +} \ No newline at end of file diff --git a/apps/docassemble/start.sh b/apps/docassemble/start.sh new file mode 100755 index 0000000..dbe42aa --- /dev/null +++ b/apps/docassemble/start.sh @@ -0,0 +1,8 @@ +#!/bin/bash +set -euo pipefail + +# Cloudron injects configuration via environment variables and files under /run +# Use this script to render config files and launch the upstream service. + +# TODO: Replace the command below with the correct process supervisor. +exec /bin/sh -c "echo 'Replace start.sh with application startup logic for Docassemble' && sleep infinity" diff --git a/apps/docassemble/test/smoke.sh b/apps/docassemble/test/smoke.sh new file mode 100755 index 0000000..ebd1134 --- /dev/null +++ b/apps/docassemble/test/smoke.sh @@ -0,0 +1,16 @@ +#!/bin/bash +set -euo pipefail + +# Basic container reachability check executed inside the packaging container. +# Replace curl target with an endpoint exposed by the app once the package is functional. +cloudron_app_url=${CLOUDRON_APP_ORIGIN:-"http://localhost"} + +http_code=$(curl -s -o /tmp/smoke.log -w "%{http_code}" "${cloudron_app_url}") + +if [[ "${http_code}" != "200" ]]; then + echo "Unexpected HTTP status: ${http_code}" >&2 + cat /tmp/smoke.log >&2 + exit 1 +fi + +echo "Smoke test passed" diff --git a/apps/docker-webhook/CloudronManifest.json b/apps/docker-webhook/CloudronManifest.json new file mode 100644 index 0000000..c154f43 --- /dev/null +++ b/apps/docker-webhook/CloudronManifest.json @@ -0,0 +1,20 @@ +{ + "manifestVersion": 2, + "id": "com.knel.docker.webhook", + "title": "docker-webhook", + "author": "Known Element Packaging Team", + "tagline": "TODO: Short one-line pitch", + "description": "TODO: Comprehensive description for the Cloudron App Store entry.", + "changelog": "Initial scaffold", + "website": "https://github.com/thecatlady/docker-webhook", + "supportUrl": "https://projects.knownelement.com/issues/271", + "sourceUrl": "https://github.com/thecatlady/docker-webhook", + "version": "0.1.0", + "tags": ["custom", "known-element"], + "healthCheckPath": "/", + "memoryLimit": 536870912, + "httpPort": 3000, + "addons": { + "localstorage": {} + } +} diff --git a/apps/docker-webhook/Dockerfile b/apps/docker-webhook/Dockerfile new file mode 100644 index 0000000..e243d53 --- /dev/null +++ b/apps/docker-webhook/Dockerfile @@ -0,0 +1,22 @@ +# syntax=docker/dockerfile:1 +FROM cloudron/base:5.0.0 + +LABEL org.opencontainers.image.source="https://github.com/thecatlady/docker-webhook" +LABEL org.opencontainers.image.description="Cloudron package for docker-webhook" + +ARG APP_VERSION +ENV APP_VERSION=${APP_VERSION:-latest} + +# Copy application source into image at build time +# Replace this with a multi-stage build if upstream provides Docker images. +COPY ./app /app/code + +# Copy start script and make it executable +COPY ./start.sh /app/pkg/start.sh +RUN chmod +x /app/pkg/start.sh + +# Cloudron expects all processes to run as cloudron user +USER cloudron +WORKDIR /app/code + +CMD ["/app/pkg/start.sh"] diff --git a/apps/docker-webhook/README.md b/apps/docker-webhook/README.md new file mode 100644 index 0000000..4cf7917 --- /dev/null +++ b/apps/docker-webhook/README.md @@ -0,0 +1,20 @@ +# docker-webhook on Cloudron + +- **Upstream repository**: https://github.com/thecatlady/docker-webhook +- **Implementation issue**: https://projects.knownelement.com/issues/271 +- **Status**: Draft scaffolding generated on $(date -u +"%Y-%m-%dT%H:%M:%SZ") + +## Packaging Checklist + +1. Review upstream deployment requirements and map them to Cloudron services (database, cache, object storage, workers). +2. Update `Dockerfile` with the correct build steps and runtime dependencies. +3. Implement `start.sh` to configure the app from Cloudron-provided environment variables and launch the primary process. +4. Edit `CloudronManifest.json` with accurate metadata, permissions, ports, addons, and health checks. +5. Add integration and smoke tests under `test/` to validate the package. +6. Document manual configuration steps, migration requirements, and known gaps in this README. + +## Notes + +- Replace the placeholder long-running process in `start.sh`. +- Populate the `app/` directory with the application build artefacts or git submodules. +- Use the shared packaging container (`docker/packager`) to run `cloudron build` and `cloudron install` so the host remains clean. diff --git a/apps/docker-webhook/app/.gitkeep b/apps/docker-webhook/app/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/apps/docker-webhook/metadata.json b/apps/docker-webhook/metadata.json new file mode 100644 index 0000000..0764f51 --- /dev/null +++ b/apps/docker-webhook/metadata.json @@ -0,0 +1,9 @@ +{ + "slug": "docker-webhook", + "title": "docker-webhook", + "issue": "https://projects.knownelement.com/issues/271", + "repo": "https://github.com/thecatlady/docker-webhook", + "additionalRepos": [], + "created": "2025-10-02T16:46:49Z", + "notes": "TODO: capture packaging notes" +} \ No newline at end of file diff --git a/apps/docker-webhook/start.sh b/apps/docker-webhook/start.sh new file mode 100755 index 0000000..82895e9 --- /dev/null +++ b/apps/docker-webhook/start.sh @@ -0,0 +1,8 @@ +#!/bin/bash +set -euo pipefail + +# Cloudron injects configuration via environment variables and files under /run +# Use this script to render config files and launch the upstream service. + +# TODO: Replace the command below with the correct process supervisor. +exec /bin/sh -c "echo 'Replace start.sh with application startup logic for docker-webhook' && sleep infinity" diff --git a/apps/docker-webhook/test/smoke.sh b/apps/docker-webhook/test/smoke.sh new file mode 100755 index 0000000..ebd1134 --- /dev/null +++ b/apps/docker-webhook/test/smoke.sh @@ -0,0 +1,16 @@ +#!/bin/bash +set -euo pipefail + +# Basic container reachability check executed inside the packaging container. +# Replace curl target with an endpoint exposed by the app once the package is functional. +cloudron_app_url=${CLOUDRON_APP_ORIGIN:-"http://localhost"} + +http_code=$(curl -s -o /tmp/smoke.log -w "%{http_code}" "${cloudron_app_url}") + +if [[ "${http_code}" != "200" ]]; then + echo "Unexpected HTTP status: ${http_code}" >&2 + cat /tmp/smoke.log >&2 + exit 1 +fi + +echo "Smoke test passed" diff --git a/apps/drawio/CloudronManifest.json b/apps/drawio/CloudronManifest.json new file mode 100644 index 0000000..8d5fc2c --- /dev/null +++ b/apps/drawio/CloudronManifest.json @@ -0,0 +1,20 @@ +{ + "manifestVersion": 2, + "id": "com.knel.drawio", + "title": "draw.io", + "author": "Known Element Packaging Team", + "tagline": "TODO: Short one-line pitch", + "description": "TODO: Comprehensive description for the Cloudron App Store entry.", + "changelog": "Initial scaffold", + "website": "https://github.com/jgraph/docker-drawio", + "supportUrl": "https://projects.knownelement.com/issues/272", + "sourceUrl": "https://github.com/jgraph/docker-drawio", + "version": "0.1.0", + "tags": ["custom", "known-element"], + "healthCheckPath": "/", + "memoryLimit": 536870912, + "httpPort": 3000, + "addons": { + "localstorage": {} + } +} diff --git a/apps/drawio/Dockerfile b/apps/drawio/Dockerfile new file mode 100644 index 0000000..d90aa4d --- /dev/null +++ b/apps/drawio/Dockerfile @@ -0,0 +1,22 @@ +# syntax=docker/dockerfile:1 +FROM cloudron/base:5.0.0 + +LABEL org.opencontainers.image.source="https://github.com/jgraph/docker-drawio" +LABEL org.opencontainers.image.description="Cloudron package for draw.io" + +ARG APP_VERSION +ENV APP_VERSION=${APP_VERSION:-latest} + +# Copy application source into image at build time +# Replace this with a multi-stage build if upstream provides Docker images. +COPY ./app /app/code + +# Copy start script and make it executable +COPY ./start.sh /app/pkg/start.sh +RUN chmod +x /app/pkg/start.sh + +# Cloudron expects all processes to run as cloudron user +USER cloudron +WORKDIR /app/code + +CMD ["/app/pkg/start.sh"] diff --git a/apps/drawio/README.md b/apps/drawio/README.md new file mode 100644 index 0000000..d98b4dc --- /dev/null +++ b/apps/drawio/README.md @@ -0,0 +1,20 @@ +# draw.io on Cloudron + +- **Upstream repository**: https://github.com/jgraph/docker-drawio +- **Implementation issue**: https://projects.knownelement.com/issues/272 +- **Status**: Draft scaffolding generated on $(date -u +"%Y-%m-%dT%H:%M:%SZ") + +## Packaging Checklist + +1. Review upstream deployment requirements and map them to Cloudron services (database, cache, object storage, workers). +2. Update `Dockerfile` with the correct build steps and runtime dependencies. +3. Implement `start.sh` to configure the app from Cloudron-provided environment variables and launch the primary process. +4. Edit `CloudronManifest.json` with accurate metadata, permissions, ports, addons, and health checks. +5. Add integration and smoke tests under `test/` to validate the package. +6. Document manual configuration steps, migration requirements, and known gaps in this README. + +## Notes + +- Replace the placeholder long-running process in `start.sh`. +- Populate the `app/` directory with the application build artefacts or git submodules. +- Use the shared packaging container (`docker/packager`) to run `cloudron build` and `cloudron install` so the host remains clean. diff --git a/apps/drawio/app/.gitkeep b/apps/drawio/app/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/apps/drawio/metadata.json b/apps/drawio/metadata.json new file mode 100644 index 0000000..26d7555 --- /dev/null +++ b/apps/drawio/metadata.json @@ -0,0 +1,9 @@ +{ + "slug": "drawio", + "title": "draw.io", + "issue": "https://projects.knownelement.com/issues/272", + "repo": "https://github.com/jgraph/docker-drawio", + "additionalRepos": [], + "created": "2025-10-02T16:46:49Z", + "notes": "TODO: capture packaging notes" +} \ No newline at end of file diff --git a/apps/drawio/start.sh b/apps/drawio/start.sh new file mode 100755 index 0000000..9071112 --- /dev/null +++ b/apps/drawio/start.sh @@ -0,0 +1,8 @@ +#!/bin/bash +set -euo pipefail + +# Cloudron injects configuration via environment variables and files under /run +# Use this script to render config files and launch the upstream service. + +# TODO: Replace the command below with the correct process supervisor. +exec /bin/sh -c "echo 'Replace start.sh with application startup logic for draw.io' && sleep infinity" diff --git a/apps/drawio/test/smoke.sh b/apps/drawio/test/smoke.sh new file mode 100755 index 0000000..ebd1134 --- /dev/null +++ b/apps/drawio/test/smoke.sh @@ -0,0 +1,16 @@ +#!/bin/bash +set -euo pipefail + +# Basic container reachability check executed inside the packaging container. +# Replace curl target with an endpoint exposed by the app once the package is functional. +cloudron_app_url=${CLOUDRON_APP_ORIGIN:-"http://localhost"} + +http_code=$(curl -s -o /tmp/smoke.log -w "%{http_code}" "${cloudron_app_url}") + +if [[ "${http_code}" != "200" ]]; then + echo "Unexpected HTTP status: ${http_code}" >&2 + cat /tmp/smoke.log >&2 + exit 1 +fi + +echo "Smoke test passed" diff --git a/apps/easy-gate/CloudronManifest.json b/apps/easy-gate/CloudronManifest.json new file mode 100644 index 0000000..e7465e4 --- /dev/null +++ b/apps/easy-gate/CloudronManifest.json @@ -0,0 +1,20 @@ +{ + "manifestVersion": 2, + "id": "com.knel.easy.gate", + "title": "Easy Gate", + "author": "Known Element Packaging Team", + "tagline": "TODO: Short one-line pitch", + "description": "TODO: Comprehensive description for the Cloudron App Store entry.", + "changelog": "Initial scaffold", + "website": "https://github.com/wiredlush/easy-gate", + "supportUrl": "https://projects.knownelement.com/issues/54", + "sourceUrl": "https://github.com/wiredlush/easy-gate.git", + "version": "0.1.0", + "tags": ["custom", "known-element"], + "healthCheckPath": "/", + "memoryLimit": 536870912, + "httpPort": 3000, + "addons": { + "localstorage": {} + } +} diff --git a/apps/easy-gate/Dockerfile b/apps/easy-gate/Dockerfile new file mode 100644 index 0000000..62f8bbe --- /dev/null +++ b/apps/easy-gate/Dockerfile @@ -0,0 +1,22 @@ +# syntax=docker/dockerfile:1 +FROM cloudron/base:5.0.0 + +LABEL org.opencontainers.image.source="https://github.com/wiredlush/easy-gate.git" +LABEL org.opencontainers.image.description="Cloudron package for Easy Gate" + +ARG APP_VERSION +ENV APP_VERSION=${APP_VERSION:-latest} + +# Copy application source into image at build time +# Replace this with a multi-stage build if upstream provides Docker images. +COPY ./app /app/code + +# Copy start script and make it executable +COPY ./start.sh /app/pkg/start.sh +RUN chmod +x /app/pkg/start.sh + +# Cloudron expects all processes to run as cloudron user +USER cloudron +WORKDIR /app/code + +CMD ["/app/pkg/start.sh"] diff --git a/apps/easy-gate/README.md b/apps/easy-gate/README.md new file mode 100644 index 0000000..ba2d7eb --- /dev/null +++ b/apps/easy-gate/README.md @@ -0,0 +1,20 @@ +# Easy Gate on Cloudron + +- **Upstream repository**: https://github.com/wiredlush/easy-gate.git +- **Implementation issue**: https://projects.knownelement.com/issues/54 +- **Status**: Draft scaffolding generated on $(date -u +"%Y-%m-%dT%H:%M:%SZ") + +## Packaging Checklist + +1. Review upstream deployment requirements and map them to Cloudron services (database, cache, object storage, workers). +2. Update `Dockerfile` with the correct build steps and runtime dependencies. +3. Implement `start.sh` to configure the app from Cloudron-provided environment variables and launch the primary process. +4. Edit `CloudronManifest.json` with accurate metadata, permissions, ports, addons, and health checks. +5. Add integration and smoke tests under `test/` to validate the package. +6. Document manual configuration steps, migration requirements, and known gaps in this README. + +## Notes + +- Replace the placeholder long-running process in `start.sh`. +- Populate the `app/` directory with the application build artefacts or git submodules. +- Use the shared packaging container (`docker/packager`) to run `cloudron build` and `cloudron install` so the host remains clean. diff --git a/apps/easy-gate/app/.gitkeep b/apps/easy-gate/app/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/apps/easy-gate/metadata.json b/apps/easy-gate/metadata.json new file mode 100644 index 0000000..405ee70 --- /dev/null +++ b/apps/easy-gate/metadata.json @@ -0,0 +1,9 @@ +{ + "slug": "easy-gate", + "title": "Easy Gate", + "issue": "https://projects.knownelement.com/issues/54", + "repo": "https://github.com/wiredlush/easy-gate.git", + "additionalRepos": [], + "created": "2025-10-02T16:46:49Z", + "notes": "TODO: capture packaging notes" +} \ No newline at end of file diff --git a/apps/easy-gate/start.sh b/apps/easy-gate/start.sh new file mode 100755 index 0000000..4389be0 --- /dev/null +++ b/apps/easy-gate/start.sh @@ -0,0 +1,8 @@ +#!/bin/bash +set -euo pipefail + +# Cloudron injects configuration via environment variables and files under /run +# Use this script to render config files and launch the upstream service. + +# TODO: Replace the command below with the correct process supervisor. +exec /bin/sh -c "echo 'Replace start.sh with application startup logic for Easy Gate' && sleep infinity" diff --git a/apps/easy-gate/test/smoke.sh b/apps/easy-gate/test/smoke.sh new file mode 100755 index 0000000..ebd1134 --- /dev/null +++ b/apps/easy-gate/test/smoke.sh @@ -0,0 +1,16 @@ +#!/bin/bash +set -euo pipefail + +# Basic container reachability check executed inside the packaging container. +# Replace curl target with an endpoint exposed by the app once the package is functional. +cloudron_app_url=${CLOUDRON_APP_ORIGIN:-"http://localhost"} + +http_code=$(curl -s -o /tmp/smoke.log -w "%{http_code}" "${cloudron_app_url}") + +if [[ "${http_code}" != "200" ]]; then + echo "Unexpected HTTP status: ${http_code}" >&2 + cat /tmp/smoke.log >&2 + exit 1 +fi + +echo "Smoke test passed" diff --git a/apps/elabftw/CloudronManifest.json b/apps/elabftw/CloudronManifest.json new file mode 100644 index 0000000..d5195f7 --- /dev/null +++ b/apps/elabftw/CloudronManifest.json @@ -0,0 +1,20 @@ +{ + "manifestVersion": 2, + "id": "com.knel.elabftw", + "title": "eLabFTW", + "author": "Known Element Packaging Team", + "tagline": "TODO: Short one-line pitch", + "description": "TODO: Comprehensive description for the Cloudron App Store entry.", + "changelog": "Initial scaffold", + "website": "https://github.com/elabftw/elabftw", + "supportUrl": "https://projects.knownelement.com/issues/188", + "sourceUrl": "https://github.com/elabftw/elabftw.git", + "version": "0.1.0", + "tags": ["custom", "known-element"], + "healthCheckPath": "/", + "memoryLimit": 536870912, + "httpPort": 3000, + "addons": { + "localstorage": {} + } +} diff --git a/apps/elabftw/Dockerfile b/apps/elabftw/Dockerfile new file mode 100644 index 0000000..d268faa --- /dev/null +++ b/apps/elabftw/Dockerfile @@ -0,0 +1,22 @@ +# syntax=docker/dockerfile:1 +FROM cloudron/base:5.0.0 + +LABEL org.opencontainers.image.source="https://github.com/elabftw/elabftw.git" +LABEL org.opencontainers.image.description="Cloudron package for eLabFTW" + +ARG APP_VERSION +ENV APP_VERSION=${APP_VERSION:-latest} + +# Copy application source into image at build time +# Replace this with a multi-stage build if upstream provides Docker images. +COPY ./app /app/code + +# Copy start script and make it executable +COPY ./start.sh /app/pkg/start.sh +RUN chmod +x /app/pkg/start.sh + +# Cloudron expects all processes to run as cloudron user +USER cloudron +WORKDIR /app/code + +CMD ["/app/pkg/start.sh"] diff --git a/apps/elabftw/README.md b/apps/elabftw/README.md new file mode 100644 index 0000000..b6b0dd4 --- /dev/null +++ b/apps/elabftw/README.md @@ -0,0 +1,20 @@ +# eLabFTW on Cloudron + +- **Upstream repository**: https://github.com/elabftw/elabftw.git +- **Implementation issue**: https://projects.knownelement.com/issues/188 +- **Status**: Draft scaffolding generated on $(date -u +"%Y-%m-%dT%H:%M:%SZ") + +## Packaging Checklist + +1. Review upstream deployment requirements and map them to Cloudron services (database, cache, object storage, workers). +2. Update `Dockerfile` with the correct build steps and runtime dependencies. +3. Implement `start.sh` to configure the app from Cloudron-provided environment variables and launch the primary process. +4. Edit `CloudronManifest.json` with accurate metadata, permissions, ports, addons, and health checks. +5. Add integration and smoke tests under `test/` to validate the package. +6. Document manual configuration steps, migration requirements, and known gaps in this README. + +## Notes + +- Replace the placeholder long-running process in `start.sh`. +- Populate the `app/` directory with the application build artefacts or git submodules. +- Use the shared packaging container (`docker/packager`) to run `cloudron build` and `cloudron install` so the host remains clean. diff --git a/apps/elabftw/app/.gitkeep b/apps/elabftw/app/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/apps/elabftw/metadata.json b/apps/elabftw/metadata.json new file mode 100644 index 0000000..828b0cf --- /dev/null +++ b/apps/elabftw/metadata.json @@ -0,0 +1,9 @@ +{ + "slug": "elabftw", + "title": "eLabFTW", + "issue": "https://projects.knownelement.com/issues/188", + "repo": "https://github.com/elabftw/elabftw.git", + "additionalRepos": [], + "created": "2025-10-02T16:46:49Z", + "notes": "TODO: capture packaging notes" +} \ No newline at end of file diff --git a/apps/elabftw/start.sh b/apps/elabftw/start.sh new file mode 100755 index 0000000..83175fb --- /dev/null +++ b/apps/elabftw/start.sh @@ -0,0 +1,8 @@ +#!/bin/bash +set -euo pipefail + +# Cloudron injects configuration via environment variables and files under /run +# Use this script to render config files and launch the upstream service. + +# TODO: Replace the command below with the correct process supervisor. +exec /bin/sh -c "echo 'Replace start.sh with application startup logic for eLabFTW' && sleep infinity" diff --git a/apps/elabftw/test/smoke.sh b/apps/elabftw/test/smoke.sh new file mode 100755 index 0000000..ebd1134 --- /dev/null +++ b/apps/elabftw/test/smoke.sh @@ -0,0 +1,16 @@ +#!/bin/bash +set -euo pipefail + +# Basic container reachability check executed inside the packaging container. +# Replace curl target with an endpoint exposed by the app once the package is functional. +cloudron_app_url=${CLOUDRON_APP_ORIGIN:-"http://localhost"} + +http_code=$(curl -s -o /tmp/smoke.log -w "%{http_code}" "${cloudron_app_url}") + +if [[ "${http_code}" != "200" ]]; then + echo "Unexpected HTTP status: ${http_code}" >&2 + cat /tmp/smoke.log >&2 + exit 1 +fi + +echo "Smoke test passed" diff --git a/apps/fleetdm-fleet/CloudronManifest.json b/apps/fleetdm-fleet/CloudronManifest.json new file mode 100644 index 0000000..c41d67a --- /dev/null +++ b/apps/fleetdm-fleet/CloudronManifest.json @@ -0,0 +1,20 @@ +{ + "manifestVersion": 2, + "id": "com.knel.fleetdm.fleet", + "title": "FleetDM Fleet", + "author": "Known Element Packaging Team", + "tagline": "TODO: Short one-line pitch", + "description": "TODO: Comprehensive description for the Cloudron App Store entry.", + "changelog": "Initial scaffold", + "website": "https://github.com/fleetdm/flee", + "supportUrl": "https://projects.knownelement.com/issues/195", + "sourceUrl": "https://github.com/fleetdm/fleet.git", + "version": "0.1.0", + "tags": ["custom", "known-element"], + "healthCheckPath": "/", + "memoryLimit": 536870912, + "httpPort": 3000, + "addons": { + "localstorage": {} + } +} diff --git a/apps/fleetdm-fleet/Dockerfile b/apps/fleetdm-fleet/Dockerfile new file mode 100644 index 0000000..0faa653 --- /dev/null +++ b/apps/fleetdm-fleet/Dockerfile @@ -0,0 +1,22 @@ +# syntax=docker/dockerfile:1 +FROM cloudron/base:5.0.0 + +LABEL org.opencontainers.image.source="https://github.com/fleetdm/fleet.git" +LABEL org.opencontainers.image.description="Cloudron package for FleetDM Fleet" + +ARG APP_VERSION +ENV APP_VERSION=${APP_VERSION:-latest} + +# Copy application source into image at build time +# Replace this with a multi-stage build if upstream provides Docker images. +COPY ./app /app/code + +# Copy start script and make it executable +COPY ./start.sh /app/pkg/start.sh +RUN chmod +x /app/pkg/start.sh + +# Cloudron expects all processes to run as cloudron user +USER cloudron +WORKDIR /app/code + +CMD ["/app/pkg/start.sh"] diff --git a/apps/fleetdm-fleet/README.md b/apps/fleetdm-fleet/README.md new file mode 100644 index 0000000..c0f3a99 --- /dev/null +++ b/apps/fleetdm-fleet/README.md @@ -0,0 +1,20 @@ +# FleetDM Fleet on Cloudron + +- **Upstream repository**: https://github.com/fleetdm/fleet.git +- **Implementation issue**: https://projects.knownelement.com/issues/195 +- **Status**: Draft scaffolding generated on $(date -u +"%Y-%m-%dT%H:%M:%SZ") + +## Packaging Checklist + +1. Review upstream deployment requirements and map them to Cloudron services (database, cache, object storage, workers). +2. Update `Dockerfile` with the correct build steps and runtime dependencies. +3. Implement `start.sh` to configure the app from Cloudron-provided environment variables and launch the primary process. +4. Edit `CloudronManifest.json` with accurate metadata, permissions, ports, addons, and health checks. +5. Add integration and smoke tests under `test/` to validate the package. +6. Document manual configuration steps, migration requirements, and known gaps in this README. + +## Notes + +- Replace the placeholder long-running process in `start.sh`. +- Populate the `app/` directory with the application build artefacts or git submodules. +- Use the shared packaging container (`docker/packager`) to run `cloudron build` and `cloudron install` so the host remains clean. diff --git a/apps/fleetdm-fleet/app/.gitkeep b/apps/fleetdm-fleet/app/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/apps/fleetdm-fleet/metadata.json b/apps/fleetdm-fleet/metadata.json new file mode 100644 index 0000000..c8a03a5 --- /dev/null +++ b/apps/fleetdm-fleet/metadata.json @@ -0,0 +1,9 @@ +{ + "slug": "fleetdm-fleet", + "title": "FleetDM Fleet", + "issue": "https://projects.knownelement.com/issues/195", + "repo": "https://github.com/fleetdm/fleet.git", + "additionalRepos": [], + "created": "2025-10-02T16:46:49Z", + "notes": "TODO: capture packaging notes" +} \ No newline at end of file diff --git a/apps/fleetdm-fleet/start.sh b/apps/fleetdm-fleet/start.sh new file mode 100755 index 0000000..34827af --- /dev/null +++ b/apps/fleetdm-fleet/start.sh @@ -0,0 +1,8 @@ +#!/bin/bash +set -euo pipefail + +# Cloudron injects configuration via environment variables and files under /run +# Use this script to render config files and launch the upstream service. + +# TODO: Replace the command below with the correct process supervisor. +exec /bin/sh -c "echo 'Replace start.sh with application startup logic for FleetDM Fleet' && sleep infinity" diff --git a/apps/fleetdm-fleet/test/smoke.sh b/apps/fleetdm-fleet/test/smoke.sh new file mode 100755 index 0000000..ebd1134 --- /dev/null +++ b/apps/fleetdm-fleet/test/smoke.sh @@ -0,0 +1,16 @@ +#!/bin/bash +set -euo pipefail + +# Basic container reachability check executed inside the packaging container. +# Replace curl target with an endpoint exposed by the app once the package is functional. +cloudron_app_url=${CLOUDRON_APP_ORIGIN:-"http://localhost"} + +http_code=$(curl -s -o /tmp/smoke.log -w "%{http_code}" "${cloudron_app_url}") + +if [[ "${http_code}" != "200" ]]; then + echo "Unexpected HTTP status: ${http_code}" >&2 + cat /tmp/smoke.log >&2 + exit 1 +fi + +echo "Smoke test passed" diff --git a/apps/fonoster/CloudronManifest.json b/apps/fonoster/CloudronManifest.json new file mode 100644 index 0000000..b3b14b9 --- /dev/null +++ b/apps/fonoster/CloudronManifest.json @@ -0,0 +1,20 @@ +{ + "manifestVersion": 2, + "id": "com.knel.fonoster", + "title": "Fonoster", + "author": "Known Element Packaging Team", + "tagline": "TODO: Short one-line pitch", + "description": "TODO: Comprehensive description for the Cloudron App Store entry.", + "changelog": "Initial scaffold", + "website": "https://github.com/fonoster/fonoster", + "supportUrl": "https://projects.knownelement.com/issues/227", + "sourceUrl": "https://github.com/fonoster/fonoster.git", + "version": "0.1.0", + "tags": ["custom", "known-element"], + "healthCheckPath": "/", + "memoryLimit": 536870912, + "httpPort": 3000, + "addons": { + "localstorage": {} + } +} diff --git a/apps/fonoster/Dockerfile b/apps/fonoster/Dockerfile new file mode 100644 index 0000000..cfc7486 --- /dev/null +++ b/apps/fonoster/Dockerfile @@ -0,0 +1,22 @@ +# syntax=docker/dockerfile:1 +FROM cloudron/base:5.0.0 + +LABEL org.opencontainers.image.source="https://github.com/fonoster/fonoster.git" +LABEL org.opencontainers.image.description="Cloudron package for Fonoster" + +ARG APP_VERSION +ENV APP_VERSION=${APP_VERSION:-latest} + +# Copy application source into image at build time +# Replace this with a multi-stage build if upstream provides Docker images. +COPY ./app /app/code + +# Copy start script and make it executable +COPY ./start.sh /app/pkg/start.sh +RUN chmod +x /app/pkg/start.sh + +# Cloudron expects all processes to run as cloudron user +USER cloudron +WORKDIR /app/code + +CMD ["/app/pkg/start.sh"] diff --git a/apps/fonoster/README.md b/apps/fonoster/README.md new file mode 100644 index 0000000..8918fd9 --- /dev/null +++ b/apps/fonoster/README.md @@ -0,0 +1,20 @@ +# Fonoster on Cloudron + +- **Upstream repository**: https://github.com/fonoster/fonoster.git +- **Implementation issue**: https://projects.knownelement.com/issues/227 +- **Status**: Draft scaffolding generated on $(date -u +"%Y-%m-%dT%H:%M:%SZ") + +## Packaging Checklist + +1. Review upstream deployment requirements and map them to Cloudron services (database, cache, object storage, workers). +2. Update `Dockerfile` with the correct build steps and runtime dependencies. +3. Implement `start.sh` to configure the app from Cloudron-provided environment variables and launch the primary process. +4. Edit `CloudronManifest.json` with accurate metadata, permissions, ports, addons, and health checks. +5. Add integration and smoke tests under `test/` to validate the package. +6. Document manual configuration steps, migration requirements, and known gaps in this README. + +## Notes + +- Replace the placeholder long-running process in `start.sh`. +- Populate the `app/` directory with the application build artefacts or git submodules. +- Use the shared packaging container (`docker/packager`) to run `cloudron build` and `cloudron install` so the host remains clean. diff --git a/apps/fonoster/app/.gitkeep b/apps/fonoster/app/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/apps/fonoster/metadata.json b/apps/fonoster/metadata.json new file mode 100644 index 0000000..ca95edd --- /dev/null +++ b/apps/fonoster/metadata.json @@ -0,0 +1,9 @@ +{ + "slug": "fonoster", + "title": "Fonoster", + "issue": "https://projects.knownelement.com/issues/227", + "repo": "https://github.com/fonoster/fonoster.git", + "additionalRepos": [], + "created": "2025-10-02T16:46:49Z", + "notes": "TODO: capture packaging notes" +} \ No newline at end of file diff --git a/apps/fonoster/start.sh b/apps/fonoster/start.sh new file mode 100755 index 0000000..2da2bd6 --- /dev/null +++ b/apps/fonoster/start.sh @@ -0,0 +1,8 @@ +#!/bin/bash +set -euo pipefail + +# Cloudron injects configuration via environment variables and files under /run +# Use this script to render config files and launch the upstream service. + +# TODO: Replace the command below with the correct process supervisor. +exec /bin/sh -c "echo 'Replace start.sh with application startup logic for Fonoster' && sleep infinity" diff --git a/apps/fonoster/test/smoke.sh b/apps/fonoster/test/smoke.sh new file mode 100755 index 0000000..ebd1134 --- /dev/null +++ b/apps/fonoster/test/smoke.sh @@ -0,0 +1,16 @@ +#!/bin/bash +set -euo pipefail + +# Basic container reachability check executed inside the packaging container. +# Replace curl target with an endpoint exposed by the app once the package is functional. +cloudron_app_url=${CLOUDRON_APP_ORIGIN:-"http://localhost"} + +http_code=$(curl -s -o /tmp/smoke.log -w "%{http_code}" "${cloudron_app_url}") + +if [[ "${http_code}" != "200" ]]; then + echo "Unexpected HTTP status: ${http_code}" >&2 + cat /tmp/smoke.log >&2 + exit 1 +fi + +echo "Smoke test passed" diff --git a/apps/grist/CloudronManifest.json b/apps/grist/CloudronManifest.json new file mode 100644 index 0000000..c3146aa --- /dev/null +++ b/apps/grist/CloudronManifest.json @@ -0,0 +1,20 @@ +{ + "manifestVersion": 2, + "id": "com.knel.grist", + "title": "Grist", + "author": "Known Element Packaging Team", + "tagline": "TODO: Short one-line pitch", + "description": "TODO: Comprehensive description for the Cloudron App Store entry.", + "changelog": "Initial scaffold", + "website": "https://github.com/gristlabs/grist-core", + "supportUrl": "https://projects.knownelement.com/issues/191", + "sourceUrl": "https://github.com/gristlabs/grist-core", + "version": "0.1.0", + "tags": ["custom", "known-element"], + "healthCheckPath": "/", + "memoryLimit": 536870912, + "httpPort": 3000, + "addons": { + "localstorage": {} + } +} diff --git a/apps/grist/Dockerfile b/apps/grist/Dockerfile new file mode 100644 index 0000000..2415285 --- /dev/null +++ b/apps/grist/Dockerfile @@ -0,0 +1,22 @@ +# syntax=docker/dockerfile:1 +FROM cloudron/base:5.0.0 + +LABEL org.opencontainers.image.source="https://github.com/gristlabs/grist-core" +LABEL org.opencontainers.image.description="Cloudron package for Grist" + +ARG APP_VERSION +ENV APP_VERSION=${APP_VERSION:-latest} + +# Copy application source into image at build time +# Replace this with a multi-stage build if upstream provides Docker images. +COPY ./app /app/code + +# Copy start script and make it executable +COPY ./start.sh /app/pkg/start.sh +RUN chmod +x /app/pkg/start.sh + +# Cloudron expects all processes to run as cloudron user +USER cloudron +WORKDIR /app/code + +CMD ["/app/pkg/start.sh"] diff --git a/apps/grist/README.md b/apps/grist/README.md new file mode 100644 index 0000000..454612b --- /dev/null +++ b/apps/grist/README.md @@ -0,0 +1,20 @@ +# Grist on Cloudron + +- **Upstream repository**: https://github.com/gristlabs/grist-core +- **Implementation issue**: https://projects.knownelement.com/issues/191 +- **Status**: Draft scaffolding generated on $(date -u +"%Y-%m-%dT%H:%M:%SZ") + +## Packaging Checklist + +1. Review upstream deployment requirements and map them to Cloudron services (database, cache, object storage, workers). +2. Update `Dockerfile` with the correct build steps and runtime dependencies. +3. Implement `start.sh` to configure the app from Cloudron-provided environment variables and launch the primary process. +4. Edit `CloudronManifest.json` with accurate metadata, permissions, ports, addons, and health checks. +5. Add integration and smoke tests under `test/` to validate the package. +6. Document manual configuration steps, migration requirements, and known gaps in this README. + +## Notes + +- Replace the placeholder long-running process in `start.sh`. +- Populate the `app/` directory with the application build artefacts or git submodules. +- Use the shared packaging container (`docker/packager`) to run `cloudron build` and `cloudron install` so the host remains clean. diff --git a/apps/grist/app/.gitkeep b/apps/grist/app/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/apps/grist/metadata.json b/apps/grist/metadata.json new file mode 100644 index 0000000..2b011ad --- /dev/null +++ b/apps/grist/metadata.json @@ -0,0 +1,9 @@ +{ + "slug": "grist", + "title": "Grist", + "issue": "https://projects.knownelement.com/issues/191", + "repo": "https://github.com/gristlabs/grist-core", + "additionalRepos": [], + "created": "2025-10-02T16:46:49Z", + "notes": "TODO: capture packaging notes" +} \ No newline at end of file diff --git a/apps/grist/start.sh b/apps/grist/start.sh new file mode 100755 index 0000000..edac226 --- /dev/null +++ b/apps/grist/start.sh @@ -0,0 +1,8 @@ +#!/bin/bash +set -euo pipefail + +# Cloudron injects configuration via environment variables and files under /run +# Use this script to render config files and launch the upstream service. + +# TODO: Replace the command below with the correct process supervisor. +exec /bin/sh -c "echo 'Replace start.sh with application startup logic for Grist' && sleep infinity" diff --git a/apps/grist/test/smoke.sh b/apps/grist/test/smoke.sh new file mode 100755 index 0000000..ebd1134 --- /dev/null +++ b/apps/grist/test/smoke.sh @@ -0,0 +1,16 @@ +#!/bin/bash +set -euo pipefail + +# Basic container reachability check executed inside the packaging container. +# Replace curl target with an endpoint exposed by the app once the package is functional. +cloudron_app_url=${CLOUDRON_APP_ORIGIN:-"http://localhost"} + +http_code=$(curl -s -o /tmp/smoke.log -w "%{http_code}" "${cloudron_app_url}") + +if [[ "${http_code}" != "200" ]]; then + echo "Unexpected HTTP status: ${http_code}" >&2 + cat /tmp/smoke.log >&2 + exit 1 +fi + +echo "Smoke test passed" diff --git a/apps/healthchecks/CloudronManifest.json b/apps/healthchecks/CloudronManifest.json new file mode 100644 index 0000000..d210294 --- /dev/null +++ b/apps/healthchecks/CloudronManifest.json @@ -0,0 +1,20 @@ +{ + "manifestVersion": 2, + "id": "com.knel.healthchecks", + "title": "Healthchecks", + "author": "Known Element Packaging Team", + "tagline": "TODO: Short one-line pitch", + "description": "TODO: Comprehensive description for the Cloudron App Store entry.", + "changelog": "Initial scaffold", + "website": "https://github.com/healthchecks/healthchecks", + "supportUrl": "https://projects.knownelement.com/issues/192", + "sourceUrl": "https://github.com/healthchecks/healthchecks.git", + "version": "0.1.0", + "tags": ["custom", "known-element"], + "healthCheckPath": "/", + "memoryLimit": 536870912, + "httpPort": 3000, + "addons": { + "localstorage": {} + } +} diff --git a/apps/healthchecks/Dockerfile b/apps/healthchecks/Dockerfile new file mode 100644 index 0000000..f3a7101 --- /dev/null +++ b/apps/healthchecks/Dockerfile @@ -0,0 +1,22 @@ +# syntax=docker/dockerfile:1 +FROM cloudron/base:5.0.0 + +LABEL org.opencontainers.image.source="https://github.com/healthchecks/healthchecks.git" +LABEL org.opencontainers.image.description="Cloudron package for Healthchecks" + +ARG APP_VERSION +ENV APP_VERSION=${APP_VERSION:-latest} + +# Copy application source into image at build time +# Replace this with a multi-stage build if upstream provides Docker images. +COPY ./app /app/code + +# Copy start script and make it executable +COPY ./start.sh /app/pkg/start.sh +RUN chmod +x /app/pkg/start.sh + +# Cloudron expects all processes to run as cloudron user +USER cloudron +WORKDIR /app/code + +CMD ["/app/pkg/start.sh"] diff --git a/apps/healthchecks/README.md b/apps/healthchecks/README.md new file mode 100644 index 0000000..38ec902 --- /dev/null +++ b/apps/healthchecks/README.md @@ -0,0 +1,20 @@ +# Healthchecks on Cloudron + +- **Upstream repository**: https://github.com/healthchecks/healthchecks.git +- **Implementation issue**: https://projects.knownelement.com/issues/192 +- **Status**: Draft scaffolding generated on $(date -u +"%Y-%m-%dT%H:%M:%SZ") + +## Packaging Checklist + +1. Review upstream deployment requirements and map them to Cloudron services (database, cache, object storage, workers). +2. Update `Dockerfile` with the correct build steps and runtime dependencies. +3. Implement `start.sh` to configure the app from Cloudron-provided environment variables and launch the primary process. +4. Edit `CloudronManifest.json` with accurate metadata, permissions, ports, addons, and health checks. +5. Add integration and smoke tests under `test/` to validate the package. +6. Document manual configuration steps, migration requirements, and known gaps in this README. + +## Notes + +- Replace the placeholder long-running process in `start.sh`. +- Populate the `app/` directory with the application build artefacts or git submodules. +- Use the shared packaging container (`docker/packager`) to run `cloudron build` and `cloudron install` so the host remains clean. diff --git a/apps/healthchecks/app/.gitkeep b/apps/healthchecks/app/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/apps/healthchecks/metadata.json b/apps/healthchecks/metadata.json new file mode 100644 index 0000000..96a2735 --- /dev/null +++ b/apps/healthchecks/metadata.json @@ -0,0 +1,9 @@ +{ + "slug": "healthchecks", + "title": "Healthchecks", + "issue": "https://projects.knownelement.com/issues/192", + "repo": "https://github.com/healthchecks/healthchecks.git", + "additionalRepos": [], + "created": "2025-10-02T16:46:49Z", + "notes": "TODO: capture packaging notes" +} \ No newline at end of file diff --git a/apps/healthchecks/start.sh b/apps/healthchecks/start.sh new file mode 100755 index 0000000..cd644c2 --- /dev/null +++ b/apps/healthchecks/start.sh @@ -0,0 +1,8 @@ +#!/bin/bash +set -euo pipefail + +# Cloudron injects configuration via environment variables and files under /run +# Use this script to render config files and launch the upstream service. + +# TODO: Replace the command below with the correct process supervisor. +exec /bin/sh -c "echo 'Replace start.sh with application startup logic for Healthchecks' && sleep infinity" diff --git a/apps/healthchecks/test/smoke.sh b/apps/healthchecks/test/smoke.sh new file mode 100755 index 0000000..ebd1134 --- /dev/null +++ b/apps/healthchecks/test/smoke.sh @@ -0,0 +1,16 @@ +#!/bin/bash +set -euo pipefail + +# Basic container reachability check executed inside the packaging container. +# Replace curl target with an endpoint exposed by the app once the package is functional. +cloudron_app_url=${CLOUDRON_APP_ORIGIN:-"http://localhost"} + +http_code=$(curl -s -o /tmp/smoke.log -w "%{http_code}" "${cloudron_app_url}") + +if [[ "${http_code}" != "200" ]]; then + echo "Unexpected HTTP status: ${http_code}" >&2 + cat /tmp/smoke.log >&2 + exit 1 +fi + +echo "Smoke test passed" diff --git a/apps/huginn/CloudronManifest.json b/apps/huginn/CloudronManifest.json new file mode 100644 index 0000000..4e787a1 --- /dev/null +++ b/apps/huginn/CloudronManifest.json @@ -0,0 +1,20 @@ +{ + "manifestVersion": 2, + "id": "com.knel.huginn", + "title": "Huginn", + "author": "Known Element Packaging Team", + "tagline": "TODO: Short one-line pitch", + "description": "TODO: Comprehensive description for the Cloudron App Store entry.", + "changelog": "Initial scaffold", + "website": "https://github.com/huginn/huginn", + "supportUrl": "https://projects.knownelement.com/issues/194", + "sourceUrl": "https://github.com/huginn/huginn.git", + "version": "0.1.0", + "tags": ["custom", "known-element"], + "healthCheckPath": "/", + "memoryLimit": 536870912, + "httpPort": 3000, + "addons": { + "localstorage": {} + } +} diff --git a/apps/huginn/Dockerfile b/apps/huginn/Dockerfile new file mode 100644 index 0000000..a25a23a --- /dev/null +++ b/apps/huginn/Dockerfile @@ -0,0 +1,22 @@ +# syntax=docker/dockerfile:1 +FROM cloudron/base:5.0.0 + +LABEL org.opencontainers.image.source="https://github.com/huginn/huginn.git" +LABEL org.opencontainers.image.description="Cloudron package for Huginn" + +ARG APP_VERSION +ENV APP_VERSION=${APP_VERSION:-latest} + +# Copy application source into image at build time +# Replace this with a multi-stage build if upstream provides Docker images. +COPY ./app /app/code + +# Copy start script and make it executable +COPY ./start.sh /app/pkg/start.sh +RUN chmod +x /app/pkg/start.sh + +# Cloudron expects all processes to run as cloudron user +USER cloudron +WORKDIR /app/code + +CMD ["/app/pkg/start.sh"] diff --git a/apps/huginn/README.md b/apps/huginn/README.md new file mode 100644 index 0000000..1ce6a36 --- /dev/null +++ b/apps/huginn/README.md @@ -0,0 +1,20 @@ +# Huginn on Cloudron + +- **Upstream repository**: https://github.com/huginn/huginn.git +- **Implementation issue**: https://projects.knownelement.com/issues/194 +- **Status**: Draft scaffolding generated on $(date -u +"%Y-%m-%dT%H:%M:%SZ") + +## Packaging Checklist + +1. Review upstream deployment requirements and map them to Cloudron services (database, cache, object storage, workers). +2. Update `Dockerfile` with the correct build steps and runtime dependencies. +3. Implement `start.sh` to configure the app from Cloudron-provided environment variables and launch the primary process. +4. Edit `CloudronManifest.json` with accurate metadata, permissions, ports, addons, and health checks. +5. Add integration and smoke tests under `test/` to validate the package. +6. Document manual configuration steps, migration requirements, and known gaps in this README. + +## Notes + +- Replace the placeholder long-running process in `start.sh`. +- Populate the `app/` directory with the application build artefacts or git submodules. +- Use the shared packaging container (`docker/packager`) to run `cloudron build` and `cloudron install` so the host remains clean. diff --git a/apps/huginn/app/.gitkeep b/apps/huginn/app/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/apps/huginn/metadata.json b/apps/huginn/metadata.json new file mode 100644 index 0000000..3b77f2b --- /dev/null +++ b/apps/huginn/metadata.json @@ -0,0 +1,9 @@ +{ + "slug": "huginn", + "title": "Huginn", + "issue": "https://projects.knownelement.com/issues/194", + "repo": "https://github.com/huginn/huginn.git", + "additionalRepos": [], + "created": "2025-10-02T16:46:49Z", + "notes": "TODO: capture packaging notes" +} \ No newline at end of file diff --git a/apps/huginn/start.sh b/apps/huginn/start.sh new file mode 100755 index 0000000..a4bcefe --- /dev/null +++ b/apps/huginn/start.sh @@ -0,0 +1,8 @@ +#!/bin/bash +set -euo pipefail + +# Cloudron injects configuration via environment variables and files under /run +# Use this script to render config files and launch the upstream service. + +# TODO: Replace the command below with the correct process supervisor. +exec /bin/sh -c "echo 'Replace start.sh with application startup logic for Huginn' && sleep infinity" diff --git a/apps/huginn/test/smoke.sh b/apps/huginn/test/smoke.sh new file mode 100755 index 0000000..ebd1134 --- /dev/null +++ b/apps/huginn/test/smoke.sh @@ -0,0 +1,16 @@ +#!/bin/bash +set -euo pipefail + +# Basic container reachability check executed inside the packaging container. +# Replace curl target with an endpoint exposed by the app once the package is functional. +cloudron_app_url=${CLOUDRON_APP_ORIGIN:-"http://localhost"} + +http_code=$(curl -s -o /tmp/smoke.log -w "%{http_code}" "${cloudron_app_url}") + +if [[ "${http_code}" != "200" ]]; then + echo "Unexpected HTTP status: ${http_code}" >&2 + cat /tmp/smoke.log >&2 + exit 1 +fi + +echo "Smoke test passed" diff --git a/apps/hyperswitch/CloudronManifest.json b/apps/hyperswitch/CloudronManifest.json new file mode 100644 index 0000000..7ee83bc --- /dev/null +++ b/apps/hyperswitch/CloudronManifest.json @@ -0,0 +1,20 @@ +{ + "manifestVersion": 2, + "id": "com.knel.hyperswitch", + "title": "HyperSwitch", + "author": "Known Element Packaging Team", + "tagline": "TODO: Short one-line pitch", + "description": "TODO: Comprehensive description for the Cloudron App Store entry.", + "changelog": "Initial scaffold", + "website": "https://github.com/juspay/hyperswitch", + "supportUrl": "https://projects.knownelement.com/issues/209", + "sourceUrl": "https://github.com/juspay/hyperswitch", + "version": "0.1.0", + "tags": ["custom", "known-element"], + "healthCheckPath": "/", + "memoryLimit": 536870912, + "httpPort": 3000, + "addons": { + "localstorage": {} + } +} diff --git a/apps/hyperswitch/Dockerfile b/apps/hyperswitch/Dockerfile new file mode 100644 index 0000000..4781e5a --- /dev/null +++ b/apps/hyperswitch/Dockerfile @@ -0,0 +1,22 @@ +# syntax=docker/dockerfile:1 +FROM cloudron/base:5.0.0 + +LABEL org.opencontainers.image.source="https://github.com/juspay/hyperswitch" +LABEL org.opencontainers.image.description="Cloudron package for HyperSwitch" + +ARG APP_VERSION +ENV APP_VERSION=${APP_VERSION:-latest} + +# Copy application source into image at build time +# Replace this with a multi-stage build if upstream provides Docker images. +COPY ./app /app/code + +# Copy start script and make it executable +COPY ./start.sh /app/pkg/start.sh +RUN chmod +x /app/pkg/start.sh + +# Cloudron expects all processes to run as cloudron user +USER cloudron +WORKDIR /app/code + +CMD ["/app/pkg/start.sh"] diff --git a/apps/hyperswitch/README.md b/apps/hyperswitch/README.md new file mode 100644 index 0000000..322f328 --- /dev/null +++ b/apps/hyperswitch/README.md @@ -0,0 +1,20 @@ +# HyperSwitch on Cloudron + +- **Upstream repository**: https://github.com/juspay/hyperswitch +- **Implementation issue**: https://projects.knownelement.com/issues/209 +- **Status**: Draft scaffolding generated on $(date -u +"%Y-%m-%dT%H:%M:%SZ") + +## Packaging Checklist + +1. Review upstream deployment requirements and map them to Cloudron services (database, cache, object storage, workers). +2. Update `Dockerfile` with the correct build steps and runtime dependencies. +3. Implement `start.sh` to configure the app from Cloudron-provided environment variables and launch the primary process. +4. Edit `CloudronManifest.json` with accurate metadata, permissions, ports, addons, and health checks. +5. Add integration and smoke tests under `test/` to validate the package. +6. Document manual configuration steps, migration requirements, and known gaps in this README. + +## Notes + +- Replace the placeholder long-running process in `start.sh`. +- Populate the `app/` directory with the application build artefacts or git submodules. +- Use the shared packaging container (`docker/packager`) to run `cloudron build` and `cloudron install` so the host remains clean. diff --git a/apps/hyperswitch/app/.gitkeep b/apps/hyperswitch/app/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/apps/hyperswitch/metadata.json b/apps/hyperswitch/metadata.json new file mode 100644 index 0000000..45b52fc --- /dev/null +++ b/apps/hyperswitch/metadata.json @@ -0,0 +1,9 @@ +{ + "slug": "hyperswitch", + "title": "HyperSwitch", + "issue": "https://projects.knownelement.com/issues/209", + "repo": "https://github.com/juspay/hyperswitch", + "additionalRepos": [], + "created": "2025-10-02T16:46:49Z", + "notes": "TODO: capture packaging notes" +} \ No newline at end of file diff --git a/apps/hyperswitch/start.sh b/apps/hyperswitch/start.sh new file mode 100755 index 0000000..a29a1c2 --- /dev/null +++ b/apps/hyperswitch/start.sh @@ -0,0 +1,8 @@ +#!/bin/bash +set -euo pipefail + +# Cloudron injects configuration via environment variables and files under /run +# Use this script to render config files and launch the upstream service. + +# TODO: Replace the command below with the correct process supervisor. +exec /bin/sh -c "echo 'Replace start.sh with application startup logic for HyperSwitch' && sleep infinity" diff --git a/apps/hyperswitch/test/smoke.sh b/apps/hyperswitch/test/smoke.sh new file mode 100755 index 0000000..ebd1134 --- /dev/null +++ b/apps/hyperswitch/test/smoke.sh @@ -0,0 +1,16 @@ +#!/bin/bash +set -euo pipefail + +# Basic container reachability check executed inside the packaging container. +# Replace curl target with an endpoint exposed by the app once the package is functional. +cloudron_app_url=${CLOUDRON_APP_ORIGIN:-"http://localhost"} + +http_code=$(curl -s -o /tmp/smoke.log -w "%{http_code}" "${cloudron_app_url}") + +if [[ "${http_code}" != "200" ]]; then + echo "Unexpected HTTP status: ${http_code}" >&2 + cat /tmp/smoke.log >&2 + exit 1 +fi + +echo "Smoke test passed" diff --git a/apps/inventree/CloudronManifest.json b/apps/inventree/CloudronManifest.json new file mode 100644 index 0000000..4ffcd02 --- /dev/null +++ b/apps/inventree/CloudronManifest.json @@ -0,0 +1,20 @@ +{ + "manifestVersion": 2, + "id": "com.knel.inventree", + "title": "InvenTree", + "author": "Known Element Packaging Team", + "tagline": "TODO: Short one-line pitch", + "description": "TODO: Comprehensive description for the Cloudron App Store entry.", + "changelog": "Initial scaffold", + "website": "https://github.com/inventree/InvenTree", + "supportUrl": "https://projects.knownelement.com/issues/173", + "sourceUrl": "https://github.com/inventree/InvenTree.git", + "version": "0.1.0", + "tags": ["custom", "known-element"], + "healthCheckPath": "/", + "memoryLimit": 536870912, + "httpPort": 3000, + "addons": { + "localstorage": {} + } +} diff --git a/apps/inventree/Dockerfile b/apps/inventree/Dockerfile new file mode 100644 index 0000000..e6d4f0f --- /dev/null +++ b/apps/inventree/Dockerfile @@ -0,0 +1,22 @@ +# syntax=docker/dockerfile:1 +FROM cloudron/base:5.0.0 + +LABEL org.opencontainers.image.source="https://github.com/inventree/InvenTree.git" +LABEL org.opencontainers.image.description="Cloudron package for InvenTree" + +ARG APP_VERSION +ENV APP_VERSION=${APP_VERSION:-latest} + +# Copy application source into image at build time +# Replace this with a multi-stage build if upstream provides Docker images. +COPY ./app /app/code + +# Copy start script and make it executable +COPY ./start.sh /app/pkg/start.sh +RUN chmod +x /app/pkg/start.sh + +# Cloudron expects all processes to run as cloudron user +USER cloudron +WORKDIR /app/code + +CMD ["/app/pkg/start.sh"] diff --git a/apps/inventree/README.md b/apps/inventree/README.md new file mode 100644 index 0000000..d1a4af9 --- /dev/null +++ b/apps/inventree/README.md @@ -0,0 +1,20 @@ +# InvenTree on Cloudron + +- **Upstream repository**: https://github.com/inventree/InvenTree.git +- **Implementation issue**: https://projects.knownelement.com/issues/173 +- **Status**: Draft scaffolding generated on $(date -u +"%Y-%m-%dT%H:%M:%SZ") + +## Packaging Checklist + +1. Review upstream deployment requirements and map them to Cloudron services (database, cache, object storage, workers). +2. Update `Dockerfile` with the correct build steps and runtime dependencies. +3. Implement `start.sh` to configure the app from Cloudron-provided environment variables and launch the primary process. +4. Edit `CloudronManifest.json` with accurate metadata, permissions, ports, addons, and health checks. +5. Add integration and smoke tests under `test/` to validate the package. +6. Document manual configuration steps, migration requirements, and known gaps in this README. + +## Notes + +- Replace the placeholder long-running process in `start.sh`. +- Populate the `app/` directory with the application build artefacts or git submodules. +- Use the shared packaging container (`docker/packager`) to run `cloudron build` and `cloudron install` so the host remains clean. diff --git a/apps/inventree/app/.gitkeep b/apps/inventree/app/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/apps/inventree/metadata.json b/apps/inventree/metadata.json new file mode 100644 index 0000000..04d09aa --- /dev/null +++ b/apps/inventree/metadata.json @@ -0,0 +1,9 @@ +{ + "slug": "inventree", + "title": "InvenTree", + "issue": "https://projects.knownelement.com/issues/173", + "repo": "https://github.com/inventree/InvenTree.git", + "additionalRepos": [], + "created": "2025-10-02T16:46:49Z", + "notes": "TODO: capture packaging notes" +} \ No newline at end of file diff --git a/apps/inventree/start.sh b/apps/inventree/start.sh new file mode 100755 index 0000000..9d56749 --- /dev/null +++ b/apps/inventree/start.sh @@ -0,0 +1,8 @@ +#!/bin/bash +set -euo pipefail + +# Cloudron injects configuration via environment variables and files under /run +# Use this script to render config files and launch the upstream service. + +# TODO: Replace the command below with the correct process supervisor. +exec /bin/sh -c "echo 'Replace start.sh with application startup logic for InvenTree' && sleep infinity" diff --git a/apps/inventree/test/smoke.sh b/apps/inventree/test/smoke.sh new file mode 100755 index 0000000..ebd1134 --- /dev/null +++ b/apps/inventree/test/smoke.sh @@ -0,0 +1,16 @@ +#!/bin/bash +set -euo pipefail + +# Basic container reachability check executed inside the packaging container. +# Replace curl target with an endpoint exposed by the app once the package is functional. +cloudron_app_url=${CLOUDRON_APP_ORIGIN:-"http://localhost"} + +http_code=$(curl -s -o /tmp/smoke.log -w "%{http_code}" "${cloudron_app_url}") + +if [[ "${http_code}" != "200" ]]; then + echo "Unexpected HTTP status: ${http_code}" >&2 + cat /tmp/smoke.log >&2 + exit 1 +fi + +echo "Smoke test passed" diff --git a/apps/jamovi/CloudronManifest.json b/apps/jamovi/CloudronManifest.json new file mode 100644 index 0000000..d3f804f --- /dev/null +++ b/apps/jamovi/CloudronManifest.json @@ -0,0 +1,20 @@ +{ + "manifestVersion": 2, + "id": "com.knel.jamovi", + "title": "jamovi", + "author": "Known Element Packaging Team", + "tagline": "TODO: Short one-line pitch", + "description": "TODO: Comprehensive description for the Cloudron App Store entry.", + "changelog": "Initial scaffold", + "website": "https://github.com/jamovi/jamov", + "supportUrl": "https://projects.knownelement.com/issues/196", + "sourceUrl": "https://github.com/jamovi/jamovi.git", + "version": "0.1.0", + "tags": ["custom", "known-element"], + "healthCheckPath": "/", + "memoryLimit": 536870912, + "httpPort": 3000, + "addons": { + "localstorage": {} + } +} diff --git a/apps/jamovi/Dockerfile b/apps/jamovi/Dockerfile new file mode 100644 index 0000000..25d4262 --- /dev/null +++ b/apps/jamovi/Dockerfile @@ -0,0 +1,22 @@ +# syntax=docker/dockerfile:1 +FROM cloudron/base:5.0.0 + +LABEL org.opencontainers.image.source="https://github.com/jamovi/jamovi.git" +LABEL org.opencontainers.image.description="Cloudron package for jamovi" + +ARG APP_VERSION +ENV APP_VERSION=${APP_VERSION:-latest} + +# Copy application source into image at build time +# Replace this with a multi-stage build if upstream provides Docker images. +COPY ./app /app/code + +# Copy start script and make it executable +COPY ./start.sh /app/pkg/start.sh +RUN chmod +x /app/pkg/start.sh + +# Cloudron expects all processes to run as cloudron user +USER cloudron +WORKDIR /app/code + +CMD ["/app/pkg/start.sh"] diff --git a/apps/jamovi/README.md b/apps/jamovi/README.md new file mode 100644 index 0000000..57df295 --- /dev/null +++ b/apps/jamovi/README.md @@ -0,0 +1,20 @@ +# jamovi on Cloudron + +- **Upstream repository**: https://github.com/jamovi/jamovi.git +- **Implementation issue**: https://projects.knownelement.com/issues/196 +- **Status**: Draft scaffolding generated on $(date -u +"%Y-%m-%dT%H:%M:%SZ") + +## Packaging Checklist + +1. Review upstream deployment requirements and map them to Cloudron services (database, cache, object storage, workers). +2. Update `Dockerfile` with the correct build steps and runtime dependencies. +3. Implement `start.sh` to configure the app from Cloudron-provided environment variables and launch the primary process. +4. Edit `CloudronManifest.json` with accurate metadata, permissions, ports, addons, and health checks. +5. Add integration and smoke tests under `test/` to validate the package. +6. Document manual configuration steps, migration requirements, and known gaps in this README. + +## Notes + +- Replace the placeholder long-running process in `start.sh`. +- Populate the `app/` directory with the application build artefacts or git submodules. +- Use the shared packaging container (`docker/packager`) to run `cloudron build` and `cloudron install` so the host remains clean. diff --git a/apps/jamovi/app/.gitkeep b/apps/jamovi/app/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/apps/jamovi/metadata.json b/apps/jamovi/metadata.json new file mode 100644 index 0000000..d884446 --- /dev/null +++ b/apps/jamovi/metadata.json @@ -0,0 +1,9 @@ +{ + "slug": "jamovi", + "title": "jamovi", + "issue": "https://projects.knownelement.com/issues/196", + "repo": "https://github.com/jamovi/jamovi.git", + "additionalRepos": [], + "created": "2025-10-02T16:46:49Z", + "notes": "TODO: capture packaging notes" +} \ No newline at end of file diff --git a/apps/jamovi/start.sh b/apps/jamovi/start.sh new file mode 100755 index 0000000..19105c0 --- /dev/null +++ b/apps/jamovi/start.sh @@ -0,0 +1,8 @@ +#!/bin/bash +set -euo pipefail + +# Cloudron injects configuration via environment variables and files under /run +# Use this script to render config files and launch the upstream service. + +# TODO: Replace the command below with the correct process supervisor. +exec /bin/sh -c "echo 'Replace start.sh with application startup logic for jamovi' && sleep infinity" diff --git a/apps/jamovi/test/smoke.sh b/apps/jamovi/test/smoke.sh new file mode 100755 index 0000000..ebd1134 --- /dev/null +++ b/apps/jamovi/test/smoke.sh @@ -0,0 +1,16 @@ +#!/bin/bash +set -euo pipefail + +# Basic container reachability check executed inside the packaging container. +# Replace curl target with an endpoint exposed by the app once the package is functional. +cloudron_app_url=${CLOUDRON_APP_ORIGIN:-"http://localhost"} + +http_code=$(curl -s -o /tmp/smoke.log -w "%{http_code}" "${cloudron_app_url}") + +if [[ "${http_code}" != "200" ]]; then + echo "Unexpected HTTP status: ${http_code}" >&2 + cat /tmp/smoke.log >&2 + exit 1 +fi + +echo "Smoke test passed" diff --git a/apps/jenkins/CloudronManifest.json b/apps/jenkins/CloudronManifest.json new file mode 100644 index 0000000..e8f1220 --- /dev/null +++ b/apps/jenkins/CloudronManifest.json @@ -0,0 +1,20 @@ +{ + "manifestVersion": 2, + "id": "com.knel.jenkins", + "title": "Jenkins", + "author": "Known Element Packaging Team", + "tagline": "TODO: Short one-line pitch", + "description": "TODO: Comprehensive description for the Cloudron App Store entry.", + "changelog": "Initial scaffold", + "website": "https://github.com/jenkinsci/jenkins", + "supportUrl": "https://projects.knownelement.com/issues/234", + "sourceUrl": "https://github.com/jenkinsci/jenkins.git", + "version": "0.1.0", + "tags": ["custom", "known-element"], + "healthCheckPath": "/", + "memoryLimit": 536870912, + "httpPort": 3000, + "addons": { + "localstorage": {} + } +} diff --git a/apps/jenkins/Dockerfile b/apps/jenkins/Dockerfile new file mode 100644 index 0000000..1e3f3eb --- /dev/null +++ b/apps/jenkins/Dockerfile @@ -0,0 +1,22 @@ +# syntax=docker/dockerfile:1 +FROM cloudron/base:5.0.0 + +LABEL org.opencontainers.image.source="https://github.com/jenkinsci/jenkins.git" +LABEL org.opencontainers.image.description="Cloudron package for Jenkins" + +ARG APP_VERSION +ENV APP_VERSION=${APP_VERSION:-latest} + +# Copy application source into image at build time +# Replace this with a multi-stage build if upstream provides Docker images. +COPY ./app /app/code + +# Copy start script and make it executable +COPY ./start.sh /app/pkg/start.sh +RUN chmod +x /app/pkg/start.sh + +# Cloudron expects all processes to run as cloudron user +USER cloudron +WORKDIR /app/code + +CMD ["/app/pkg/start.sh"] diff --git a/apps/jenkins/README.md b/apps/jenkins/README.md new file mode 100644 index 0000000..0f32be0 --- /dev/null +++ b/apps/jenkins/README.md @@ -0,0 +1,20 @@ +# Jenkins on Cloudron + +- **Upstream repository**: https://github.com/jenkinsci/jenkins.git +- **Implementation issue**: https://projects.knownelement.com/issues/234 +- **Status**: Draft scaffolding generated on $(date -u +"%Y-%m-%dT%H:%M:%SZ") + +## Packaging Checklist + +1. Review upstream deployment requirements and map them to Cloudron services (database, cache, object storage, workers). +2. Update `Dockerfile` with the correct build steps and runtime dependencies. +3. Implement `start.sh` to configure the app from Cloudron-provided environment variables and launch the primary process. +4. Edit `CloudronManifest.json` with accurate metadata, permissions, ports, addons, and health checks. +5. Add integration and smoke tests under `test/` to validate the package. +6. Document manual configuration steps, migration requirements, and known gaps in this README. + +## Notes + +- Replace the placeholder long-running process in `start.sh`. +- Populate the `app/` directory with the application build artefacts or git submodules. +- Use the shared packaging container (`docker/packager`) to run `cloudron build` and `cloudron install` so the host remains clean. diff --git a/apps/jenkins/app/.gitkeep b/apps/jenkins/app/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/apps/jenkins/metadata.json b/apps/jenkins/metadata.json new file mode 100644 index 0000000..824aeca --- /dev/null +++ b/apps/jenkins/metadata.json @@ -0,0 +1,9 @@ +{ + "slug": "jenkins", + "title": "Jenkins", + "issue": "https://projects.knownelement.com/issues/234", + "repo": "https://github.com/jenkinsci/jenkins.git", + "additionalRepos": [], + "created": "2025-10-02T16:46:49Z", + "notes": "TODO: capture packaging notes" +} \ No newline at end of file diff --git a/apps/jenkins/start.sh b/apps/jenkins/start.sh new file mode 100755 index 0000000..ffd86bb --- /dev/null +++ b/apps/jenkins/start.sh @@ -0,0 +1,8 @@ +#!/bin/bash +set -euo pipefail + +# Cloudron injects configuration via environment variables and files under /run +# Use this script to render config files and launch the upstream service. + +# TODO: Replace the command below with the correct process supervisor. +exec /bin/sh -c "echo 'Replace start.sh with application startup logic for Jenkins' && sleep infinity" diff --git a/apps/jenkins/test/smoke.sh b/apps/jenkins/test/smoke.sh new file mode 100755 index 0000000..ebd1134 --- /dev/null +++ b/apps/jenkins/test/smoke.sh @@ -0,0 +1,16 @@ +#!/bin/bash +set -euo pipefail + +# Basic container reachability check executed inside the packaging container. +# Replace curl target with an endpoint exposed by the app once the package is functional. +cloudron_app_url=${CLOUDRON_APP_ORIGIN:-"http://localhost"} + +http_code=$(curl -s -o /tmp/smoke.log -w "%{http_code}" "${cloudron_app_url}") + +if [[ "${http_code}" != "200" ]]; then + echo "Unexpected HTTP status: ${http_code}" >&2 + cat /tmp/smoke.log >&2 + exit 1 +fi + +echo "Smoke test passed" diff --git a/apps/kibot/CloudronManifest.json b/apps/kibot/CloudronManifest.json new file mode 100644 index 0000000..603ee3e --- /dev/null +++ b/apps/kibot/CloudronManifest.json @@ -0,0 +1,20 @@ +{ + "manifestVersion": 2, + "id": "com.knel.kibot", + "title": "KiBot", + "author": "Known Element Packaging Team", + "tagline": "TODO: Short one-line pitch", + "description": "TODO: Comprehensive description for the Cloudron App Store entry.", + "changelog": "Initial scaffold", + "website": "https://github.com/INTI-CMNB/KiBo", + "supportUrl": "https://projects.knownelement.com/issues/197", + "sourceUrl": "https://github.com/INTI-CMNB/KiBot.git", + "version": "0.1.0", + "tags": ["custom", "known-element"], + "healthCheckPath": "/", + "memoryLimit": 536870912, + "httpPort": 3000, + "addons": { + "localstorage": {} + } +} diff --git a/apps/kibot/Dockerfile b/apps/kibot/Dockerfile new file mode 100644 index 0000000..ce47068 --- /dev/null +++ b/apps/kibot/Dockerfile @@ -0,0 +1,22 @@ +# syntax=docker/dockerfile:1 +FROM cloudron/base:5.0.0 + +LABEL org.opencontainers.image.source="https://github.com/INTI-CMNB/KiBot.git" +LABEL org.opencontainers.image.description="Cloudron package for KiBot" + +ARG APP_VERSION +ENV APP_VERSION=${APP_VERSION:-latest} + +# Copy application source into image at build time +# Replace this with a multi-stage build if upstream provides Docker images. +COPY ./app /app/code + +# Copy start script and make it executable +COPY ./start.sh /app/pkg/start.sh +RUN chmod +x /app/pkg/start.sh + +# Cloudron expects all processes to run as cloudron user +USER cloudron +WORKDIR /app/code + +CMD ["/app/pkg/start.sh"] diff --git a/apps/kibot/README.md b/apps/kibot/README.md new file mode 100644 index 0000000..e210fbb --- /dev/null +++ b/apps/kibot/README.md @@ -0,0 +1,20 @@ +# KiBot on Cloudron + +- **Upstream repository**: https://github.com/INTI-CMNB/KiBot.git +- **Implementation issue**: https://projects.knownelement.com/issues/197 +- **Status**: Draft scaffolding generated on $(date -u +"%Y-%m-%dT%H:%M:%SZ") + +## Packaging Checklist + +1. Review upstream deployment requirements and map them to Cloudron services (database, cache, object storage, workers). +2. Update `Dockerfile` with the correct build steps and runtime dependencies. +3. Implement `start.sh` to configure the app from Cloudron-provided environment variables and launch the primary process. +4. Edit `CloudronManifest.json` with accurate metadata, permissions, ports, addons, and health checks. +5. Add integration and smoke tests under `test/` to validate the package. +6. Document manual configuration steps, migration requirements, and known gaps in this README. + +## Notes + +- Replace the placeholder long-running process in `start.sh`. +- Populate the `app/` directory with the application build artefacts or git submodules. +- Use the shared packaging container (`docker/packager`) to run `cloudron build` and `cloudron install` so the host remains clean. diff --git a/apps/kibot/app/.gitkeep b/apps/kibot/app/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/apps/kibot/metadata.json b/apps/kibot/metadata.json new file mode 100644 index 0000000..6da2238 --- /dev/null +++ b/apps/kibot/metadata.json @@ -0,0 +1,9 @@ +{ + "slug": "kibot", + "title": "KiBot", + "issue": "https://projects.knownelement.com/issues/197", + "repo": "https://github.com/INTI-CMNB/KiBot.git", + "additionalRepos": [], + "created": "2025-10-02T16:46:49Z", + "notes": "TODO: capture packaging notes" +} \ No newline at end of file diff --git a/apps/kibot/start.sh b/apps/kibot/start.sh new file mode 100755 index 0000000..7b4ffa6 --- /dev/null +++ b/apps/kibot/start.sh @@ -0,0 +1,8 @@ +#!/bin/bash +set -euo pipefail + +# Cloudron injects configuration via environment variables and files under /run +# Use this script to render config files and launch the upstream service. + +# TODO: Replace the command below with the correct process supervisor. +exec /bin/sh -c "echo 'Replace start.sh with application startup logic for KiBot' && sleep infinity" diff --git a/apps/kibot/test/smoke.sh b/apps/kibot/test/smoke.sh new file mode 100755 index 0000000..ebd1134 --- /dev/null +++ b/apps/kibot/test/smoke.sh @@ -0,0 +1,16 @@ +#!/bin/bash +set -euo pipefail + +# Basic container reachability check executed inside the packaging container. +# Replace curl target with an endpoint exposed by the app once the package is functional. +cloudron_app_url=${CLOUDRON_APP_ORIGIN:-"http://localhost"} + +http_code=$(curl -s -o /tmp/smoke.log -w "%{http_code}" "${cloudron_app_url}") + +if [[ "${http_code}" != "200" ]]; then + echo "Unexpected HTTP status: ${http_code}" >&2 + cat /tmp/smoke.log >&2 + exit 1 +fi + +echo "Smoke test passed" diff --git a/apps/killbill/CloudronManifest.json b/apps/killbill/CloudronManifest.json new file mode 100644 index 0000000..2a836f5 --- /dev/null +++ b/apps/killbill/CloudronManifest.json @@ -0,0 +1,20 @@ +{ + "manifestVersion": 2, + "id": "com.knel.killbill", + "title": "Kill Bill", + "author": "Known Element Packaging Team", + "tagline": "TODO: Short one-line pitch", + "description": "TODO: Comprehensive description for the Cloudron App Store entry.", + "changelog": "Initial scaffold", + "website": "https://github.com/killbill/killbill", + "supportUrl": "https://projects.knownelement.com/issues/181", + "sourceUrl": "https://github.com/killbill/killbill.git", + "version": "0.1.0", + "tags": ["custom", "known-element"], + "healthCheckPath": "/", + "memoryLimit": 536870912, + "httpPort": 3000, + "addons": { + "localstorage": {} + } +} diff --git a/apps/killbill/Dockerfile b/apps/killbill/Dockerfile new file mode 100644 index 0000000..43eb669 --- /dev/null +++ b/apps/killbill/Dockerfile @@ -0,0 +1,22 @@ +# syntax=docker/dockerfile:1 +FROM cloudron/base:5.0.0 + +LABEL org.opencontainers.image.source="https://github.com/killbill/killbill.git" +LABEL org.opencontainers.image.description="Cloudron package for Kill Bill" + +ARG APP_VERSION +ENV APP_VERSION=${APP_VERSION:-latest} + +# Copy application source into image at build time +# Replace this with a multi-stage build if upstream provides Docker images. +COPY ./app /app/code + +# Copy start script and make it executable +COPY ./start.sh /app/pkg/start.sh +RUN chmod +x /app/pkg/start.sh + +# Cloudron expects all processes to run as cloudron user +USER cloudron +WORKDIR /app/code + +CMD ["/app/pkg/start.sh"] diff --git a/apps/killbill/README.md b/apps/killbill/README.md new file mode 100644 index 0000000..6620513 --- /dev/null +++ b/apps/killbill/README.md @@ -0,0 +1,20 @@ +# Kill Bill on Cloudron + +- **Upstream repository**: https://github.com/killbill/killbill.git +- **Implementation issue**: https://projects.knownelement.com/issues/181 +- **Status**: Draft scaffolding generated on $(date -u +"%Y-%m-%dT%H:%M:%SZ") + +## Packaging Checklist + +1. Review upstream deployment requirements and map them to Cloudron services (database, cache, object storage, workers). +2. Update `Dockerfile` with the correct build steps and runtime dependencies. +3. Implement `start.sh` to configure the app from Cloudron-provided environment variables and launch the primary process. +4. Edit `CloudronManifest.json` with accurate metadata, permissions, ports, addons, and health checks. +5. Add integration and smoke tests under `test/` to validate the package. +6. Document manual configuration steps, migration requirements, and known gaps in this README. + +## Notes + +- Replace the placeholder long-running process in `start.sh`. +- Populate the `app/` directory with the application build artefacts or git submodules. +- Use the shared packaging container (`docker/packager`) to run `cloudron build` and `cloudron install` so the host remains clean. diff --git a/apps/killbill/app/.gitkeep b/apps/killbill/app/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/apps/killbill/metadata.json b/apps/killbill/metadata.json new file mode 100644 index 0000000..38c4aad --- /dev/null +++ b/apps/killbill/metadata.json @@ -0,0 +1,9 @@ +{ + "slug": "killbill", + "title": "Kill Bill", + "issue": "https://projects.knownelement.com/issues/181", + "repo": "https://github.com/killbill/killbill.git", + "additionalRepos": [], + "created": "2025-10-02T16:46:49Z", + "notes": "TODO: capture packaging notes" +} \ No newline at end of file diff --git a/apps/killbill/start.sh b/apps/killbill/start.sh new file mode 100755 index 0000000..35ae79b --- /dev/null +++ b/apps/killbill/start.sh @@ -0,0 +1,8 @@ +#!/bin/bash +set -euo pipefail + +# Cloudron injects configuration via environment variables and files under /run +# Use this script to render config files and launch the upstream service. + +# TODO: Replace the command below with the correct process supervisor. +exec /bin/sh -c "echo 'Replace start.sh with application startup logic for Kill Bill' && sleep infinity" diff --git a/apps/killbill/test/smoke.sh b/apps/killbill/test/smoke.sh new file mode 100755 index 0000000..ebd1134 --- /dev/null +++ b/apps/killbill/test/smoke.sh @@ -0,0 +1,16 @@ +#!/bin/bash +set -euo pipefail + +# Basic container reachability check executed inside the packaging container. +# Replace curl target with an endpoint exposed by the app once the package is functional. +cloudron_app_url=${CLOUDRON_APP_ORIGIN:-"http://localhost"} + +http_code=$(curl -s -o /tmp/smoke.log -w "%{http_code}" "${cloudron_app_url}") + +if [[ "${http_code}" != "200" ]]; then + echo "Unexpected HTTP status: ${http_code}" >&2 + cat /tmp/smoke.log >&2 + exit 1 +fi + +echo "Smoke test passed" diff --git a/apps/langfuse/CloudronManifest.json b/apps/langfuse/CloudronManifest.json new file mode 100644 index 0000000..24cc5ba --- /dev/null +++ b/apps/langfuse/CloudronManifest.json @@ -0,0 +1,20 @@ +{ + "manifestVersion": 2, + "id": "com.knel.langfuse", + "title": "Langfuse OSS LLMOps Stack", + "author": "Known Element Packaging Team", + "tagline": "TODO: Short one-line pitch", + "description": "TODO: Comprehensive description for the Cloudron App Store entry.", + "changelog": "Initial scaffold", + "website": "https://github.com/langfuse/oss-llmops-stack", + "supportUrl": "https://projects.knownelement.com/issues/283", + "sourceUrl": "https://github.com/langfuse/oss-llmops-stack.git", + "version": "0.1.0", + "tags": ["custom", "known-element"], + "healthCheckPath": "/", + "memoryLimit": 536870912, + "httpPort": 3000, + "addons": { + "localstorage": {} + } +} diff --git a/apps/langfuse/Dockerfile b/apps/langfuse/Dockerfile new file mode 100644 index 0000000..a91ad4b --- /dev/null +++ b/apps/langfuse/Dockerfile @@ -0,0 +1,22 @@ +# syntax=docker/dockerfile:1 +FROM cloudron/base:5.0.0 + +LABEL org.opencontainers.image.source="https://github.com/langfuse/oss-llmops-stack.git" +LABEL org.opencontainers.image.description="Cloudron package for Langfuse OSS LLMOps Stack" + +ARG APP_VERSION +ENV APP_VERSION=${APP_VERSION:-latest} + +# Copy application source into image at build time +# Replace this with a multi-stage build if upstream provides Docker images. +COPY ./app /app/code + +# Copy start script and make it executable +COPY ./start.sh /app/pkg/start.sh +RUN chmod +x /app/pkg/start.sh + +# Cloudron expects all processes to run as cloudron user +USER cloudron +WORKDIR /app/code + +CMD ["/app/pkg/start.sh"] diff --git a/apps/langfuse/README.md b/apps/langfuse/README.md new file mode 100644 index 0000000..e6693d5 --- /dev/null +++ b/apps/langfuse/README.md @@ -0,0 +1,20 @@ +# Langfuse OSS LLMOps Stack on Cloudron + +- **Upstream repository**: https://github.com/langfuse/oss-llmops-stack.git +- **Implementation issue**: https://projects.knownelement.com/issues/283 +- **Status**: Draft scaffolding generated on $(date -u +"%Y-%m-%dT%H:%M:%SZ") + +## Packaging Checklist + +1. Review upstream deployment requirements and map them to Cloudron services (database, cache, object storage, workers). +2. Update `Dockerfile` with the correct build steps and runtime dependencies. +3. Implement `start.sh` to configure the app from Cloudron-provided environment variables and launch the primary process. +4. Edit `CloudronManifest.json` with accurate metadata, permissions, ports, addons, and health checks. +5. Add integration and smoke tests under `test/` to validate the package. +6. Document manual configuration steps, migration requirements, and known gaps in this README. + +## Notes + +- Replace the placeholder long-running process in `start.sh`. +- Populate the `app/` directory with the application build artefacts or git submodules. +- Use the shared packaging container (`docker/packager`) to run `cloudron build` and `cloudron install` so the host remains clean. diff --git a/apps/langfuse/app/.gitkeep b/apps/langfuse/app/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/apps/langfuse/metadata.json b/apps/langfuse/metadata.json new file mode 100644 index 0000000..89d53e4 --- /dev/null +++ b/apps/langfuse/metadata.json @@ -0,0 +1,9 @@ +{ + "slug": "langfuse", + "title": "Langfuse OSS LLMOps Stack", + "issue": "https://projects.knownelement.com/issues/283", + "repo": "https://github.com/langfuse/oss-llmops-stack.git", + "additionalRepos": [], + "created": "2025-10-02T16:46:49Z", + "notes": "TODO: capture packaging notes" +} \ No newline at end of file diff --git a/apps/langfuse/start.sh b/apps/langfuse/start.sh new file mode 100755 index 0000000..ab3529c --- /dev/null +++ b/apps/langfuse/start.sh @@ -0,0 +1,8 @@ +#!/bin/bash +set -euo pipefail + +# Cloudron injects configuration via environment variables and files under /run +# Use this script to render config files and launch the upstream service. + +# TODO: Replace the command below with the correct process supervisor. +exec /bin/sh -c "echo 'Replace start.sh with application startup logic for Langfuse OSS LLMOps Stack' && sleep infinity" diff --git a/apps/langfuse/test/smoke.sh b/apps/langfuse/test/smoke.sh new file mode 100755 index 0000000..ebd1134 --- /dev/null +++ b/apps/langfuse/test/smoke.sh @@ -0,0 +1,16 @@ +#!/bin/bash +set -euo pipefail + +# Basic container reachability check executed inside the packaging container. +# Replace curl target with an endpoint exposed by the app once the package is functional. +cloudron_app_url=${CLOUDRON_APP_ORIGIN:-"http://localhost"} + +http_code=$(curl -s -o /tmp/smoke.log -w "%{http_code}" "${cloudron_app_url}") + +if [[ "${http_code}" != "200" ]]; then + echo "Unexpected HTTP status: ${http_code}" >&2 + cat /tmp/smoke.log >&2 + exit 1 +fi + +echo "Smoke test passed" diff --git a/apps/manyfold/CloudronManifest.json b/apps/manyfold/CloudronManifest.json new file mode 100644 index 0000000..d36b970 --- /dev/null +++ b/apps/manyfold/CloudronManifest.json @@ -0,0 +1,20 @@ +{ + "manifestVersion": 2, + "id": "com.knel.manyfold", + "title": "Manyfold", + "author": "Known Element Packaging Team", + "tagline": "TODO: Short one-line pitch", + "description": "TODO: Comprehensive description for the Cloudron App Store entry.", + "changelog": "Initial scaffold", + "website": "https://github.com/manyfold3d/manyfold", + "supportUrl": "https://projects.knownelement.com/issues/282", + "sourceUrl": "https://github.com/manyfold3d/manyfold.git", + "version": "0.1.0", + "tags": ["custom", "known-element"], + "healthCheckPath": "/", + "memoryLimit": 536870912, + "httpPort": 3000, + "addons": { + "localstorage": {} + } +} diff --git a/apps/manyfold/Dockerfile b/apps/manyfold/Dockerfile new file mode 100644 index 0000000..d5da0be --- /dev/null +++ b/apps/manyfold/Dockerfile @@ -0,0 +1,22 @@ +# syntax=docker/dockerfile:1 +FROM cloudron/base:5.0.0 + +LABEL org.opencontainers.image.source="https://github.com/manyfold3d/manyfold.git" +LABEL org.opencontainers.image.description="Cloudron package for Manyfold" + +ARG APP_VERSION +ENV APP_VERSION=${APP_VERSION:-latest} + +# Copy application source into image at build time +# Replace this with a multi-stage build if upstream provides Docker images. +COPY ./app /app/code + +# Copy start script and make it executable +COPY ./start.sh /app/pkg/start.sh +RUN chmod +x /app/pkg/start.sh + +# Cloudron expects all processes to run as cloudron user +USER cloudron +WORKDIR /app/code + +CMD ["/app/pkg/start.sh"] diff --git a/apps/manyfold/README.md b/apps/manyfold/README.md new file mode 100644 index 0000000..7cf6a96 --- /dev/null +++ b/apps/manyfold/README.md @@ -0,0 +1,20 @@ +# Manyfold on Cloudron + +- **Upstream repository**: https://github.com/manyfold3d/manyfold.git +- **Implementation issue**: https://projects.knownelement.com/issues/282 +- **Status**: Draft scaffolding generated on $(date -u +"%Y-%m-%dT%H:%M:%SZ") + +## Packaging Checklist + +1. Review upstream deployment requirements and map them to Cloudron services (database, cache, object storage, workers). +2. Update `Dockerfile` with the correct build steps and runtime dependencies. +3. Implement `start.sh` to configure the app from Cloudron-provided environment variables and launch the primary process. +4. Edit `CloudronManifest.json` with accurate metadata, permissions, ports, addons, and health checks. +5. Add integration and smoke tests under `test/` to validate the package. +6. Document manual configuration steps, migration requirements, and known gaps in this README. + +## Notes + +- Replace the placeholder long-running process in `start.sh`. +- Populate the `app/` directory with the application build artefacts or git submodules. +- Use the shared packaging container (`docker/packager`) to run `cloudron build` and `cloudron install` so the host remains clean. diff --git a/apps/manyfold/app/.gitkeep b/apps/manyfold/app/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/apps/manyfold/metadata.json b/apps/manyfold/metadata.json new file mode 100644 index 0000000..6aca927 --- /dev/null +++ b/apps/manyfold/metadata.json @@ -0,0 +1,9 @@ +{ + "slug": "manyfold", + "title": "Manyfold", + "issue": "https://projects.knownelement.com/issues/282", + "repo": "https://github.com/manyfold3d/manyfold.git", + "additionalRepos": [], + "created": "2025-10-02T16:46:49Z", + "notes": "TODO: capture packaging notes" +} \ No newline at end of file diff --git a/apps/manyfold/start.sh b/apps/manyfold/start.sh new file mode 100755 index 0000000..4e94bfe --- /dev/null +++ b/apps/manyfold/start.sh @@ -0,0 +1,8 @@ +#!/bin/bash +set -euo pipefail + +# Cloudron injects configuration via environment variables and files under /run +# Use this script to render config files and launch the upstream service. + +# TODO: Replace the command below with the correct process supervisor. +exec /bin/sh -c "echo 'Replace start.sh with application startup logic for Manyfold' && sleep infinity" diff --git a/apps/manyfold/test/smoke.sh b/apps/manyfold/test/smoke.sh new file mode 100755 index 0000000..ebd1134 --- /dev/null +++ b/apps/manyfold/test/smoke.sh @@ -0,0 +1,16 @@ +#!/bin/bash +set -euo pipefail + +# Basic container reachability check executed inside the packaging container. +# Replace curl target with an endpoint exposed by the app once the package is functional. +cloudron_app_url=${CLOUDRON_APP_ORIGIN:-"http://localhost"} + +http_code=$(curl -s -o /tmp/smoke.log -w "%{http_code}" "${cloudron_app_url}") + +if [[ "${http_code}" != "200" ]]; then + echo "Unexpected HTTP status: ${http_code}" >&2 + cat /tmp/smoke.log >&2 + exit 1 +fi + +echo "Smoke test passed" diff --git a/apps/mender-server/CloudronManifest.json b/apps/mender-server/CloudronManifest.json new file mode 100644 index 0000000..bcafb3d --- /dev/null +++ b/apps/mender-server/CloudronManifest.json @@ -0,0 +1,20 @@ +{ + "manifestVersion": 2, + "id": "com.knel.mender.server", + "title": "Mender Server", + "author": "Known Element Packaging Team", + "tagline": "TODO: Short one-line pitch", + "description": "TODO: Comprehensive description for the Cloudron App Store entry.", + "changelog": "Initial scaffold", + "website": "https://github.com/mendersoftware/mender-server", + "supportUrl": "https://projects.knownelement.com/issues/300", + "sourceUrl": "https://github.com/mendersoftware/mender-server.git", + "version": "0.1.0", + "tags": ["custom", "known-element"], + "healthCheckPath": "/", + "memoryLimit": 536870912, + "httpPort": 3000, + "addons": { + "localstorage": {} + } +} diff --git a/apps/mender-server/Dockerfile b/apps/mender-server/Dockerfile new file mode 100644 index 0000000..dedf727 --- /dev/null +++ b/apps/mender-server/Dockerfile @@ -0,0 +1,22 @@ +# syntax=docker/dockerfile:1 +FROM cloudron/base:5.0.0 + +LABEL org.opencontainers.image.source="https://github.com/mendersoftware/mender-server.git" +LABEL org.opencontainers.image.description="Cloudron package for Mender Server" + +ARG APP_VERSION +ENV APP_VERSION=${APP_VERSION:-latest} + +# Copy application source into image at build time +# Replace this with a multi-stage build if upstream provides Docker images. +COPY ./app /app/code + +# Copy start script and make it executable +COPY ./start.sh /app/pkg/start.sh +RUN chmod +x /app/pkg/start.sh + +# Cloudron expects all processes to run as cloudron user +USER cloudron +WORKDIR /app/code + +CMD ["/app/pkg/start.sh"] diff --git a/apps/mender-server/README.md b/apps/mender-server/README.md new file mode 100644 index 0000000..8c64cef --- /dev/null +++ b/apps/mender-server/README.md @@ -0,0 +1,20 @@ +# Mender Server on Cloudron + +- **Upstream repository**: https://github.com/mendersoftware/mender-server.git +- **Implementation issue**: https://projects.knownelement.com/issues/300 +- **Status**: Draft scaffolding generated on $(date -u +"%Y-%m-%dT%H:%M:%SZ") + +## Packaging Checklist + +1. Review upstream deployment requirements and map them to Cloudron services (database, cache, object storage, workers). +2. Update `Dockerfile` with the correct build steps and runtime dependencies. +3. Implement `start.sh` to configure the app from Cloudron-provided environment variables and launch the primary process. +4. Edit `CloudronManifest.json` with accurate metadata, permissions, ports, addons, and health checks. +5. Add integration and smoke tests under `test/` to validate the package. +6. Document manual configuration steps, migration requirements, and known gaps in this README. + +## Notes + +- Replace the placeholder long-running process in `start.sh`. +- Populate the `app/` directory with the application build artefacts or git submodules. +- Use the shared packaging container (`docker/packager`) to run `cloudron build` and `cloudron install` so the host remains clean. diff --git a/apps/mender-server/app/.gitkeep b/apps/mender-server/app/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/apps/mender-server/metadata.json b/apps/mender-server/metadata.json new file mode 100644 index 0000000..74e473f --- /dev/null +++ b/apps/mender-server/metadata.json @@ -0,0 +1,9 @@ +{ + "slug": "mender-server", + "title": "Mender Server", + "issue": "https://projects.knownelement.com/issues/300", + "repo": "https://github.com/mendersoftware/mender-server.git", + "additionalRepos": [], + "created": "2025-10-02T16:46:50Z", + "notes": "TODO: capture packaging notes" +} \ No newline at end of file diff --git a/apps/mender-server/start.sh b/apps/mender-server/start.sh new file mode 100755 index 0000000..1bd1633 --- /dev/null +++ b/apps/mender-server/start.sh @@ -0,0 +1,8 @@ +#!/bin/bash +set -euo pipefail + +# Cloudron injects configuration via environment variables and files under /run +# Use this script to render config files and launch the upstream service. + +# TODO: Replace the command below with the correct process supervisor. +exec /bin/sh -c "echo 'Replace start.sh with application startup logic for Mender Server' && sleep infinity" diff --git a/apps/mender-server/test/smoke.sh b/apps/mender-server/test/smoke.sh new file mode 100755 index 0000000..ebd1134 --- /dev/null +++ b/apps/mender-server/test/smoke.sh @@ -0,0 +1,16 @@ +#!/bin/bash +set -euo pipefail + +# Basic container reachability check executed inside the packaging container. +# Replace curl target with an endpoint exposed by the app once the package is functional. +cloudron_app_url=${CLOUDRON_APP_ORIGIN:-"http://localhost"} + +http_code=$(curl -s -o /tmp/smoke.log -w "%{http_code}" "${cloudron_app_url}") + +if [[ "${http_code}" != "200" ]]; then + echo "Unexpected HTTP status: ${http_code}" >&2 + cat /tmp/smoke.log >&2 + exit 1 +fi + +echo "Smoke test passed" diff --git a/apps/midday/CloudronManifest.json b/apps/midday/CloudronManifest.json new file mode 100644 index 0000000..51dec30 --- /dev/null +++ b/apps/midday/CloudronManifest.json @@ -0,0 +1,20 @@ +{ + "manifestVersion": 2, + "id": "com.knel.midday", + "title": "Midday", + "author": "Known Element Packaging Team", + "tagline": "TODO: Short one-line pitch", + "description": "TODO: Comprehensive description for the Cloudron App Store entry.", + "changelog": "Initial scaffold", + "website": "https://github.com/midday-ai/midday", + "supportUrl": "https://projects.knownelement.com/issues/178", + "sourceUrl": "https://github.com/midday-ai/midday.git", + "version": "0.1.0", + "tags": ["custom", "known-element"], + "healthCheckPath": "/", + "memoryLimit": 536870912, + "httpPort": 3000, + "addons": { + "localstorage": {} + } +} diff --git a/apps/midday/Dockerfile b/apps/midday/Dockerfile new file mode 100644 index 0000000..7d04f95 --- /dev/null +++ b/apps/midday/Dockerfile @@ -0,0 +1,22 @@ +# syntax=docker/dockerfile:1 +FROM cloudron/base:5.0.0 + +LABEL org.opencontainers.image.source="https://github.com/midday-ai/midday.git" +LABEL org.opencontainers.image.description="Cloudron package for Midday" + +ARG APP_VERSION +ENV APP_VERSION=${APP_VERSION:-latest} + +# Copy application source into image at build time +# Replace this with a multi-stage build if upstream provides Docker images. +COPY ./app /app/code + +# Copy start script and make it executable +COPY ./start.sh /app/pkg/start.sh +RUN chmod +x /app/pkg/start.sh + +# Cloudron expects all processes to run as cloudron user +USER cloudron +WORKDIR /app/code + +CMD ["/app/pkg/start.sh"] diff --git a/apps/midday/README.md b/apps/midday/README.md new file mode 100644 index 0000000..2adee84 --- /dev/null +++ b/apps/midday/README.md @@ -0,0 +1,20 @@ +# Midday on Cloudron + +- **Upstream repository**: https://github.com/midday-ai/midday.git +- **Implementation issue**: https://projects.knownelement.com/issues/178 +- **Status**: Draft scaffolding generated on $(date -u +"%Y-%m-%dT%H:%M:%SZ") + +## Packaging Checklist + +1. Review upstream deployment requirements and map them to Cloudron services (database, cache, object storage, workers). +2. Update `Dockerfile` with the correct build steps and runtime dependencies. +3. Implement `start.sh` to configure the app from Cloudron-provided environment variables and launch the primary process. +4. Edit `CloudronManifest.json` with accurate metadata, permissions, ports, addons, and health checks. +5. Add integration and smoke tests under `test/` to validate the package. +6. Document manual configuration steps, migration requirements, and known gaps in this README. + +## Notes + +- Replace the placeholder long-running process in `start.sh`. +- Populate the `app/` directory with the application build artefacts or git submodules. +- Use the shared packaging container (`docker/packager`) to run `cloudron build` and `cloudron install` so the host remains clean. diff --git a/apps/midday/app/.gitkeep b/apps/midday/app/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/apps/midday/metadata.json b/apps/midday/metadata.json new file mode 100644 index 0000000..3f65881 --- /dev/null +++ b/apps/midday/metadata.json @@ -0,0 +1,9 @@ +{ + "slug": "midday", + "title": "Midday", + "issue": "https://projects.knownelement.com/issues/178", + "repo": "https://github.com/midday-ai/midday.git", + "additionalRepos": [], + "created": "2025-10-02T16:46:49Z", + "notes": "TODO: capture packaging notes" +} \ No newline at end of file diff --git a/apps/midday/start.sh b/apps/midday/start.sh new file mode 100755 index 0000000..b1e7058 --- /dev/null +++ b/apps/midday/start.sh @@ -0,0 +1,8 @@ +#!/bin/bash +set -euo pipefail + +# Cloudron injects configuration via environment variables and files under /run +# Use this script to render config files and launch the upstream service. + +# TODO: Replace the command below with the correct process supervisor. +exec /bin/sh -c "echo 'Replace start.sh with application startup logic for Midday' && sleep infinity" diff --git a/apps/midday/test/smoke.sh b/apps/midday/test/smoke.sh new file mode 100755 index 0000000..ebd1134 --- /dev/null +++ b/apps/midday/test/smoke.sh @@ -0,0 +1,16 @@ +#!/bin/bash +set -euo pipefail + +# Basic container reachability check executed inside the packaging container. +# Replace curl target with an endpoint exposed by the app once the package is functional. +cloudron_app_url=${CLOUDRON_APP_ORIGIN:-"http://localhost"} + +http_code=$(curl -s -o /tmp/smoke.log -w "%{http_code}" "${cloudron_app_url}") + +if [[ "${http_code}" != "200" ]]; then + echo "Unexpected HTTP status: ${http_code}" >&2 + cat /tmp/smoke.log >&2 + exit 1 +fi + +echo "Smoke test passed" diff --git a/apps/mirlo/CloudronManifest.json b/apps/mirlo/CloudronManifest.json new file mode 100644 index 0000000..2ce04a7 --- /dev/null +++ b/apps/mirlo/CloudronManifest.json @@ -0,0 +1,20 @@ +{ + "manifestVersion": 2, + "id": "com.knel.mirlo", + "title": "Mirlo", + "author": "Known Element Packaging Team", + "tagline": "TODO: Short one-line pitch", + "description": "TODO: Comprehensive description for the Cloudron App Store entry.", + "changelog": "Initial scaffold", + "website": "https://github.com/funmusicplace/mirlo", + "supportUrl": "https://projects.knownelement.com/issues/TBD", + "sourceUrl": "https://github.com/funmusicplace/mirlo.git", + "version": "0.1.0", + "tags": ["custom", "known-element"], + "healthCheckPath": "/", + "memoryLimit": 536870912, + "httpPort": 3000, + "addons": { + "localstorage": {} + } +} diff --git a/apps/mirlo/Dockerfile b/apps/mirlo/Dockerfile new file mode 100644 index 0000000..c07958f --- /dev/null +++ b/apps/mirlo/Dockerfile @@ -0,0 +1,22 @@ +# syntax=docker/dockerfile:1 +FROM cloudron/base:5.0.0 + +LABEL org.opencontainers.image.source="https://github.com/funmusicplace/mirlo.git" +LABEL org.opencontainers.image.description="Cloudron package for Mirlo" + +ARG APP_VERSION +ENV APP_VERSION=${APP_VERSION:-latest} + +# Copy application source into image at build time +# Replace this with a multi-stage build if upstream provides Docker images. +COPY ./app /app/code + +# Copy start script and make it executable +COPY ./start.sh /app/pkg/start.sh +RUN chmod +x /app/pkg/start.sh + +# Cloudron expects all processes to run as cloudron user +USER cloudron +WORKDIR /app/code + +CMD ["/app/pkg/start.sh"] diff --git a/apps/mirlo/README.md b/apps/mirlo/README.md new file mode 100644 index 0000000..fb5bb08 --- /dev/null +++ b/apps/mirlo/README.md @@ -0,0 +1,20 @@ +# Mirlo on Cloudron + +- **Upstream repository**: https://github.com/funmusicplace/mirlo.git +- **Implementation issue**: https://projects.knownelement.com/issues/TBD +- **Status**: Draft scaffolding generated on $(date -u +"%Y-%m-%dT%H:%M:%SZ") + +## Packaging Checklist + +1. Review upstream deployment requirements and map them to Cloudron services (database, cache, object storage, workers). +2. Update `Dockerfile` with the correct build steps and runtime dependencies. +3. Implement `start.sh` to configure the app from Cloudron-provided environment variables and launch the primary process. +4. Edit `CloudronManifest.json` with accurate metadata, permissions, ports, addons, and health checks. +5. Add integration and smoke tests under `test/` to validate the package. +6. Document manual configuration steps, migration requirements, and known gaps in this README. + +## Notes + +- Replace the placeholder long-running process in `start.sh`. +- Populate the `app/` directory with the application build artefacts or git submodules. +- Use the shared packaging container (`docker/packager`) to run `cloudron build` and `cloudron install` so the host remains clean. diff --git a/apps/mirlo/app/.gitkeep b/apps/mirlo/app/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/apps/mirlo/metadata.json b/apps/mirlo/metadata.json new file mode 100644 index 0000000..28e7d29 --- /dev/null +++ b/apps/mirlo/metadata.json @@ -0,0 +1,9 @@ +{ + "slug": "mirlo", + "title": "Mirlo", + "issue": "https://projects.knownelement.com/issues/TBD", + "repo": "https://github.com/funmusicplace/mirlo.git", + "additionalRepos": [], + "created": "2025-10-02T16:46:50Z", + "notes": "TODO: capture packaging notes" +} \ No newline at end of file diff --git a/apps/mirlo/start.sh b/apps/mirlo/start.sh new file mode 100755 index 0000000..249ac7a --- /dev/null +++ b/apps/mirlo/start.sh @@ -0,0 +1,8 @@ +#!/bin/bash +set -euo pipefail + +# Cloudron injects configuration via environment variables and files under /run +# Use this script to render config files and launch the upstream service. + +# TODO: Replace the command below with the correct process supervisor. +exec /bin/sh -c "echo 'Replace start.sh with application startup logic for Mirlo' && sleep infinity" diff --git a/apps/mirlo/test/smoke.sh b/apps/mirlo/test/smoke.sh new file mode 100755 index 0000000..ebd1134 --- /dev/null +++ b/apps/mirlo/test/smoke.sh @@ -0,0 +1,16 @@ +#!/bin/bash +set -euo pipefail + +# Basic container reachability check executed inside the packaging container. +# Replace curl target with an endpoint exposed by the app once the package is functional. +cloudron_app_url=${CLOUDRON_APP_ORIGIN:-"http://localhost"} + +http_code=$(curl -s -o /tmp/smoke.log -w "%{http_code}" "${cloudron_app_url}") + +if [[ "${http_code}" != "200" ]]; then + echo "Unexpected HTTP status: ${http_code}" >&2 + cat /tmp/smoke.log >&2 + exit 1 +fi + +echo "Smoke test passed" diff --git a/apps/nautilus-trader/CloudronManifest.json b/apps/nautilus-trader/CloudronManifest.json new file mode 100644 index 0000000..a2a518c --- /dev/null +++ b/apps/nautilus-trader/CloudronManifest.json @@ -0,0 +1,20 @@ +{ + "manifestVersion": 2, + "id": "com.knel.nautilus.trader", + "title": "Nautilus Trader", + "author": "Known Element Packaging Team", + "tagline": "TODO: Short one-line pitch", + "description": "TODO: Comprehensive description for the Cloudron App Store entry.", + "changelog": "Initial scaffold", + "website": "https://github.com/nautechsystems/nautilus_trader", + "supportUrl": "https://projects.knownelement.com/issues/226", + "sourceUrl": "https://github.com/nautechsystems/nautilus_trader.git", + "version": "0.1.0", + "tags": ["custom", "known-element"], + "healthCheckPath": "/", + "memoryLimit": 536870912, + "httpPort": 3000, + "addons": { + "localstorage": {} + } +} diff --git a/apps/nautilus-trader/Dockerfile b/apps/nautilus-trader/Dockerfile new file mode 100644 index 0000000..09a6fbf --- /dev/null +++ b/apps/nautilus-trader/Dockerfile @@ -0,0 +1,22 @@ +# syntax=docker/dockerfile:1 +FROM cloudron/base:5.0.0 + +LABEL org.opencontainers.image.source="https://github.com/nautechsystems/nautilus_trader.git" +LABEL org.opencontainers.image.description="Cloudron package for Nautilus Trader" + +ARG APP_VERSION +ENV APP_VERSION=${APP_VERSION:-latest} + +# Copy application source into image at build time +# Replace this with a multi-stage build if upstream provides Docker images. +COPY ./app /app/code + +# Copy start script and make it executable +COPY ./start.sh /app/pkg/start.sh +RUN chmod +x /app/pkg/start.sh + +# Cloudron expects all processes to run as cloudron user +USER cloudron +WORKDIR /app/code + +CMD ["/app/pkg/start.sh"] diff --git a/apps/nautilus-trader/README.md b/apps/nautilus-trader/README.md new file mode 100644 index 0000000..e5c4686 --- /dev/null +++ b/apps/nautilus-trader/README.md @@ -0,0 +1,20 @@ +# Nautilus Trader on Cloudron + +- **Upstream repository**: https://github.com/nautechsystems/nautilus_trader.git +- **Implementation issue**: https://projects.knownelement.com/issues/226 +- **Status**: Draft scaffolding generated on $(date -u +"%Y-%m-%dT%H:%M:%SZ") + +## Packaging Checklist + +1. Review upstream deployment requirements and map them to Cloudron services (database, cache, object storage, workers). +2. Update `Dockerfile` with the correct build steps and runtime dependencies. +3. Implement `start.sh` to configure the app from Cloudron-provided environment variables and launch the primary process. +4. Edit `CloudronManifest.json` with accurate metadata, permissions, ports, addons, and health checks. +5. Add integration and smoke tests under `test/` to validate the package. +6. Document manual configuration steps, migration requirements, and known gaps in this README. + +## Notes + +- Replace the placeholder long-running process in `start.sh`. +- Populate the `app/` directory with the application build artefacts or git submodules. +- Use the shared packaging container (`docker/packager`) to run `cloudron build` and `cloudron install` so the host remains clean. diff --git a/apps/nautilus-trader/app/.gitkeep b/apps/nautilus-trader/app/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/apps/nautilus-trader/metadata.json b/apps/nautilus-trader/metadata.json new file mode 100644 index 0000000..92e9cd8 --- /dev/null +++ b/apps/nautilus-trader/metadata.json @@ -0,0 +1,9 @@ +{ + "slug": "nautilus-trader", + "title": "Nautilus Trader", + "issue": "https://projects.knownelement.com/issues/226", + "repo": "https://github.com/nautechsystems/nautilus_trader.git", + "additionalRepos": [], + "created": "2025-10-02T16:46:50Z", + "notes": "TODO: capture packaging notes" +} \ No newline at end of file diff --git a/apps/nautilus-trader/start.sh b/apps/nautilus-trader/start.sh new file mode 100755 index 0000000..46cd694 --- /dev/null +++ b/apps/nautilus-trader/start.sh @@ -0,0 +1,8 @@ +#!/bin/bash +set -euo pipefail + +# Cloudron injects configuration via environment variables and files under /run +# Use this script to render config files and launch the upstream service. + +# TODO: Replace the command below with the correct process supervisor. +exec /bin/sh -c "echo 'Replace start.sh with application startup logic for Nautilus Trader' && sleep infinity" diff --git a/apps/nautilus-trader/test/smoke.sh b/apps/nautilus-trader/test/smoke.sh new file mode 100755 index 0000000..ebd1134 --- /dev/null +++ b/apps/nautilus-trader/test/smoke.sh @@ -0,0 +1,16 @@ +#!/bin/bash +set -euo pipefail + +# Basic container reachability check executed inside the packaging container. +# Replace curl target with an endpoint exposed by the app once the package is functional. +cloudron_app_url=${CLOUDRON_APP_ORIGIN:-"http://localhost"} + +http_code=$(curl -s -o /tmp/smoke.log -w "%{http_code}" "${cloudron_app_url}") + +if [[ "${http_code}" != "200" ]]; then + echo "Unexpected HTTP status: ${http_code}" >&2 + cat /tmp/smoke.log >&2 + exit 1 +fi + +echo "Smoke test passed" diff --git a/apps/netbox-docker/CloudronManifest.json b/apps/netbox-docker/CloudronManifest.json new file mode 100644 index 0000000..eea35dc --- /dev/null +++ b/apps/netbox-docker/CloudronManifest.json @@ -0,0 +1,20 @@ +{ + "manifestVersion": 2, + "id": "com.knel.netbox.docker", + "title": "NetBox Docker", + "author": "Known Element Packaging Team", + "tagline": "TODO: Short one-line pitch", + "description": "TODO: Comprehensive description for the Cloudron App Store entry.", + "changelog": "Initial scaffold", + "website": "https://github.com/netbox-community/netbox-docker", + "supportUrl": "https://projects.knownelement.com/issues/201", + "sourceUrl": "https://github.com/netbox-community/netbox-docker.git", + "version": "0.1.0", + "tags": ["custom", "known-element"], + "healthCheckPath": "/", + "memoryLimit": 536870912, + "httpPort": 3000, + "addons": { + "localstorage": {} + } +} diff --git a/apps/netbox-docker/Dockerfile b/apps/netbox-docker/Dockerfile new file mode 100644 index 0000000..8977490 --- /dev/null +++ b/apps/netbox-docker/Dockerfile @@ -0,0 +1,22 @@ +# syntax=docker/dockerfile:1 +FROM cloudron/base:5.0.0 + +LABEL org.opencontainers.image.source="https://github.com/netbox-community/netbox-docker.git" +LABEL org.opencontainers.image.description="Cloudron package for NetBox Docker" + +ARG APP_VERSION +ENV APP_VERSION=${APP_VERSION:-latest} + +# Copy application source into image at build time +# Replace this with a multi-stage build if upstream provides Docker images. +COPY ./app /app/code + +# Copy start script and make it executable +COPY ./start.sh /app/pkg/start.sh +RUN chmod +x /app/pkg/start.sh + +# Cloudron expects all processes to run as cloudron user +USER cloudron +WORKDIR /app/code + +CMD ["/app/pkg/start.sh"] diff --git a/apps/netbox-docker/README.md b/apps/netbox-docker/README.md new file mode 100644 index 0000000..b5d197c --- /dev/null +++ b/apps/netbox-docker/README.md @@ -0,0 +1,20 @@ +# NetBox Docker on Cloudron + +- **Upstream repository**: https://github.com/netbox-community/netbox-docker.git +- **Implementation issue**: https://projects.knownelement.com/issues/201 +- **Status**: Draft scaffolding generated on $(date -u +"%Y-%m-%dT%H:%M:%SZ") + +## Packaging Checklist + +1. Review upstream deployment requirements and map them to Cloudron services (database, cache, object storage, workers). +2. Update `Dockerfile` with the correct build steps and runtime dependencies. +3. Implement `start.sh` to configure the app from Cloudron-provided environment variables and launch the primary process. +4. Edit `CloudronManifest.json` with accurate metadata, permissions, ports, addons, and health checks. +5. Add integration and smoke tests under `test/` to validate the package. +6. Document manual configuration steps, migration requirements, and known gaps in this README. + +## Notes + +- Replace the placeholder long-running process in `start.sh`. +- Populate the `app/` directory with the application build artefacts or git submodules. +- Use the shared packaging container (`docker/packager`) to run `cloudron build` and `cloudron install` so the host remains clean. diff --git a/apps/netbox-docker/app/.gitkeep b/apps/netbox-docker/app/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/apps/netbox-docker/metadata.json b/apps/netbox-docker/metadata.json new file mode 100644 index 0000000..a0220ac --- /dev/null +++ b/apps/netbox-docker/metadata.json @@ -0,0 +1,9 @@ +{ + "slug": "netbox-docker", + "title": "NetBox Docker", + "issue": "https://projects.knownelement.com/issues/201", + "repo": "https://github.com/netbox-community/netbox-docker.git", + "additionalRepos": [], + "created": "2025-10-02T16:46:49Z", + "notes": "TODO: capture packaging notes" +} \ No newline at end of file diff --git a/apps/netbox-docker/start.sh b/apps/netbox-docker/start.sh new file mode 100755 index 0000000..bc06dd2 --- /dev/null +++ b/apps/netbox-docker/start.sh @@ -0,0 +1,8 @@ +#!/bin/bash +set -euo pipefail + +# Cloudron injects configuration via environment variables and files under /run +# Use this script to render config files and launch the upstream service. + +# TODO: Replace the command below with the correct process supervisor. +exec /bin/sh -c "echo 'Replace start.sh with application startup logic for NetBox Docker' && sleep infinity" diff --git a/apps/netbox-docker/test/smoke.sh b/apps/netbox-docker/test/smoke.sh new file mode 100755 index 0000000..ebd1134 --- /dev/null +++ b/apps/netbox-docker/test/smoke.sh @@ -0,0 +1,16 @@ +#!/bin/bash +set -euo pipefail + +# Basic container reachability check executed inside the packaging container. +# Replace curl target with an endpoint exposed by the app once the package is functional. +cloudron_app_url=${CLOUDRON_APP_ORIGIN:-"http://localhost"} + +http_code=$(curl -s -o /tmp/smoke.log -w "%{http_code}" "${cloudron_app_url}") + +if [[ "${http_code}" != "200" ]]; then + echo "Unexpected HTTP status: ${http_code}" >&2 + cat /tmp/smoke.log >&2 + exit 1 +fi + +echo "Smoke test passed" diff --git a/apps/openblocks/CloudronManifest.json b/apps/openblocks/CloudronManifest.json new file mode 100644 index 0000000..19ff25f --- /dev/null +++ b/apps/openblocks/CloudronManifest.json @@ -0,0 +1,20 @@ +{ + "manifestVersion": 2, + "id": "com.knel.openblocks", + "title": "OpenBlocks", + "author": "Known Element Packaging Team", + "tagline": "TODO: Short one-line pitch", + "description": "TODO: Comprehensive description for the Cloudron App Store entry.", + "changelog": "Initial scaffold", + "website": "https://github.com/openblocks-dev/openblocks", + "supportUrl": "https://projects.knownelement.com/issues/274", + "sourceUrl": "https://github.com/openblocks-dev/openblocks.git", + "version": "0.1.0", + "tags": ["custom", "known-element"], + "healthCheckPath": "/", + "memoryLimit": 536870912, + "httpPort": 3000, + "addons": { + "localstorage": {} + } +} diff --git a/apps/openblocks/Dockerfile b/apps/openblocks/Dockerfile new file mode 100644 index 0000000..c3d705a --- /dev/null +++ b/apps/openblocks/Dockerfile @@ -0,0 +1,22 @@ +# syntax=docker/dockerfile:1 +FROM cloudron/base:5.0.0 + +LABEL org.opencontainers.image.source="https://github.com/openblocks-dev/openblocks.git" +LABEL org.opencontainers.image.description="Cloudron package for OpenBlocks" + +ARG APP_VERSION +ENV APP_VERSION=${APP_VERSION:-latest} + +# Copy application source into image at build time +# Replace this with a multi-stage build if upstream provides Docker images. +COPY ./app /app/code + +# Copy start script and make it executable +COPY ./start.sh /app/pkg/start.sh +RUN chmod +x /app/pkg/start.sh + +# Cloudron expects all processes to run as cloudron user +USER cloudron +WORKDIR /app/code + +CMD ["/app/pkg/start.sh"] diff --git a/apps/openblocks/README.md b/apps/openblocks/README.md new file mode 100644 index 0000000..4fb034a --- /dev/null +++ b/apps/openblocks/README.md @@ -0,0 +1,20 @@ +# OpenBlocks on Cloudron + +- **Upstream repository**: https://github.com/openblocks-dev/openblocks.git +- **Implementation issue**: https://projects.knownelement.com/issues/274 +- **Status**: Draft scaffolding generated on $(date -u +"%Y-%m-%dT%H:%M:%SZ") + +## Packaging Checklist + +1. Review upstream deployment requirements and map them to Cloudron services (database, cache, object storage, workers). +2. Update `Dockerfile` with the correct build steps and runtime dependencies. +3. Implement `start.sh` to configure the app from Cloudron-provided environment variables and launch the primary process. +4. Edit `CloudronManifest.json` with accurate metadata, permissions, ports, addons, and health checks. +5. Add integration and smoke tests under `test/` to validate the package. +6. Document manual configuration steps, migration requirements, and known gaps in this README. + +## Notes + +- Replace the placeholder long-running process in `start.sh`. +- Populate the `app/` directory with the application build artefacts or git submodules. +- Use the shared packaging container (`docker/packager`) to run `cloudron build` and `cloudron install` so the host remains clean. diff --git a/apps/openblocks/app/.gitkeep b/apps/openblocks/app/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/apps/openblocks/metadata.json b/apps/openblocks/metadata.json new file mode 100644 index 0000000..3ebe41d --- /dev/null +++ b/apps/openblocks/metadata.json @@ -0,0 +1,9 @@ +{ + "slug": "openblocks", + "title": "OpenBlocks", + "issue": "https://projects.knownelement.com/issues/274", + "repo": "https://github.com/openblocks-dev/openblocks.git", + "additionalRepos": [], + "created": "2025-10-02T16:46:49Z", + "notes": "TODO: capture packaging notes" +} \ No newline at end of file diff --git a/apps/openblocks/start.sh b/apps/openblocks/start.sh new file mode 100755 index 0000000..110241d --- /dev/null +++ b/apps/openblocks/start.sh @@ -0,0 +1,8 @@ +#!/bin/bash +set -euo pipefail + +# Cloudron injects configuration via environment variables and files under /run +# Use this script to render config files and launch the upstream service. + +# TODO: Replace the command below with the correct process supervisor. +exec /bin/sh -c "echo 'Replace start.sh with application startup logic for OpenBlocks' && sleep infinity" diff --git a/apps/openblocks/test/smoke.sh b/apps/openblocks/test/smoke.sh new file mode 100755 index 0000000..ebd1134 --- /dev/null +++ b/apps/openblocks/test/smoke.sh @@ -0,0 +1,16 @@ +#!/bin/bash +set -euo pipefail + +# Basic container reachability check executed inside the packaging container. +# Replace curl target with an endpoint exposed by the app once the package is functional. +cloudron_app_url=${CLOUDRON_APP_ORIGIN:-"http://localhost"} + +http_code=$(curl -s -o /tmp/smoke.log -w "%{http_code}" "${cloudron_app_url}") + +if [[ "${http_code}" != "200" ]]; then + echo "Unexpected HTTP status: ${http_code}" >&2 + cat /tmp/smoke.log >&2 + exit 1 +fi + +echo "Smoke test passed" diff --git a/apps/openboxes-docker/CloudronManifest.json b/apps/openboxes-docker/CloudronManifest.json new file mode 100644 index 0000000..832122f --- /dev/null +++ b/apps/openboxes-docker/CloudronManifest.json @@ -0,0 +1,20 @@ +{ + "manifestVersion": 2, + "id": "com.knel.openboxes.docker", + "title": "OpenBoxes Docker", + "author": "Known Element Packaging Team", + "tagline": "TODO: Short one-line pitch", + "description": "TODO: Comprehensive description for the Cloudron App Store entry.", + "changelog": "Initial scaffold", + "website": "https://github.com/openboxes/openboxes-docker", + "supportUrl": "https://projects.knownelement.com/issues/205", + "sourceUrl": "https://github.com/openboxes/openboxes-docker.git", + "version": "0.1.0", + "tags": ["custom", "known-element"], + "healthCheckPath": "/", + "memoryLimit": 536870912, + "httpPort": 3000, + "addons": { + "localstorage": {} + } +} diff --git a/apps/openboxes-docker/Dockerfile b/apps/openboxes-docker/Dockerfile new file mode 100644 index 0000000..92ac4b5 --- /dev/null +++ b/apps/openboxes-docker/Dockerfile @@ -0,0 +1,22 @@ +# syntax=docker/dockerfile:1 +FROM cloudron/base:5.0.0 + +LABEL org.opencontainers.image.source="https://github.com/openboxes/openboxes-docker.git" +LABEL org.opencontainers.image.description="Cloudron package for OpenBoxes Docker" + +ARG APP_VERSION +ENV APP_VERSION=${APP_VERSION:-latest} + +# Copy application source into image at build time +# Replace this with a multi-stage build if upstream provides Docker images. +COPY ./app /app/code + +# Copy start script and make it executable +COPY ./start.sh /app/pkg/start.sh +RUN chmod +x /app/pkg/start.sh + +# Cloudron expects all processes to run as cloudron user +USER cloudron +WORKDIR /app/code + +CMD ["/app/pkg/start.sh"] diff --git a/apps/openboxes-docker/README.md b/apps/openboxes-docker/README.md new file mode 100644 index 0000000..e36312b --- /dev/null +++ b/apps/openboxes-docker/README.md @@ -0,0 +1,20 @@ +# OpenBoxes Docker on Cloudron + +- **Upstream repository**: https://github.com/openboxes/openboxes-docker.git +- **Implementation issue**: https://projects.knownelement.com/issues/205 +- **Status**: Draft scaffolding generated on $(date -u +"%Y-%m-%dT%H:%M:%SZ") + +## Packaging Checklist + +1. Review upstream deployment requirements and map them to Cloudron services (database, cache, object storage, workers). +2. Update `Dockerfile` with the correct build steps and runtime dependencies. +3. Implement `start.sh` to configure the app from Cloudron-provided environment variables and launch the primary process. +4. Edit `CloudronManifest.json` with accurate metadata, permissions, ports, addons, and health checks. +5. Add integration and smoke tests under `test/` to validate the package. +6. Document manual configuration steps, migration requirements, and known gaps in this README. + +## Notes + +- Replace the placeholder long-running process in `start.sh`. +- Populate the `app/` directory with the application build artefacts or git submodules. +- Use the shared packaging container (`docker/packager`) to run `cloudron build` and `cloudron install` so the host remains clean. diff --git a/apps/openboxes-docker/app/.gitkeep b/apps/openboxes-docker/app/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/apps/openboxes-docker/metadata.json b/apps/openboxes-docker/metadata.json new file mode 100644 index 0000000..31cef30 --- /dev/null +++ b/apps/openboxes-docker/metadata.json @@ -0,0 +1,9 @@ +{ + "slug": "openboxes-docker", + "title": "OpenBoxes Docker", + "issue": "https://projects.knownelement.com/issues/205", + "repo": "https://github.com/openboxes/openboxes-docker.git", + "additionalRepos": [], + "created": "2025-10-02T16:46:49Z", + "notes": "TODO: capture packaging notes" +} \ No newline at end of file diff --git a/apps/openboxes-docker/start.sh b/apps/openboxes-docker/start.sh new file mode 100755 index 0000000..136ae8e --- /dev/null +++ b/apps/openboxes-docker/start.sh @@ -0,0 +1,8 @@ +#!/bin/bash +set -euo pipefail + +# Cloudron injects configuration via environment variables and files under /run +# Use this script to render config files and launch the upstream service. + +# TODO: Replace the command below with the correct process supervisor. +exec /bin/sh -c "echo 'Replace start.sh with application startup logic for OpenBoxes Docker' && sleep infinity" diff --git a/apps/openboxes-docker/test/smoke.sh b/apps/openboxes-docker/test/smoke.sh new file mode 100755 index 0000000..ebd1134 --- /dev/null +++ b/apps/openboxes-docker/test/smoke.sh @@ -0,0 +1,16 @@ +#!/bin/bash +set -euo pipefail + +# Basic container reachability check executed inside the packaging container. +# Replace curl target with an endpoint exposed by the app once the package is functional. +cloudron_app_url=${CLOUDRON_APP_ORIGIN:-"http://localhost"} + +http_code=$(curl -s -o /tmp/smoke.log -w "%{http_code}" "${cloudron_app_url}") + +if [[ "${http_code}" != "200" ]]; then + echo "Unexpected HTTP status: ${http_code}" >&2 + cat /tmp/smoke.log >&2 + exit 1 +fi + +echo "Smoke test passed" diff --git a/apps/openfile/CloudronManifest.json b/apps/openfile/CloudronManifest.json new file mode 100644 index 0000000..24788ec --- /dev/null +++ b/apps/openfile/CloudronManifest.json @@ -0,0 +1,20 @@ +{ + "manifestVersion": 2, + "id": "com.knel.openfile", + "title": "OpenFile", + "author": "Known Element Packaging Team", + "tagline": "TODO: Short one-line pitch", + "description": "TODO: Comprehensive description for the Cloudron App Store entry.", + "changelog": "Initial scaffold", + "website": "https://github.com/openfiletax/openfile", + "supportUrl": "https://projects.knownelement.com/issues/316", + "sourceUrl": "https://github.com/openfiletax/openfile.git", + "version": "0.1.0", + "tags": ["custom", "known-element"], + "healthCheckPath": "/", + "memoryLimit": 536870912, + "httpPort": 3000, + "addons": { + "localstorage": {} + } +} diff --git a/apps/openfile/Dockerfile b/apps/openfile/Dockerfile new file mode 100644 index 0000000..8a35754 --- /dev/null +++ b/apps/openfile/Dockerfile @@ -0,0 +1,22 @@ +# syntax=docker/dockerfile:1 +FROM cloudron/base:5.0.0 + +LABEL org.opencontainers.image.source="https://github.com/openfiletax/openfile.git" +LABEL org.opencontainers.image.description="Cloudron package for OpenFile" + +ARG APP_VERSION +ENV APP_VERSION=${APP_VERSION:-latest} + +# Copy application source into image at build time +# Replace this with a multi-stage build if upstream provides Docker images. +COPY ./app /app/code + +# Copy start script and make it executable +COPY ./start.sh /app/pkg/start.sh +RUN chmod +x /app/pkg/start.sh + +# Cloudron expects all processes to run as cloudron user +USER cloudron +WORKDIR /app/code + +CMD ["/app/pkg/start.sh"] diff --git a/apps/openfile/README.md b/apps/openfile/README.md new file mode 100644 index 0000000..6c50eaf --- /dev/null +++ b/apps/openfile/README.md @@ -0,0 +1,20 @@ +# OpenFile on Cloudron + +- **Upstream repository**: https://github.com/openfiletax/openfile.git +- **Implementation issue**: https://projects.knownelement.com/issues/316 +- **Status**: Draft scaffolding generated on $(date -u +"%Y-%m-%dT%H:%M:%SZ") + +## Packaging Checklist + +1. Review upstream deployment requirements and map them to Cloudron services (database, cache, object storage, workers). +2. Update `Dockerfile` with the correct build steps and runtime dependencies. +3. Implement `start.sh` to configure the app from Cloudron-provided environment variables and launch the primary process. +4. Edit `CloudronManifest.json` with accurate metadata, permissions, ports, addons, and health checks. +5. Add integration and smoke tests under `test/` to validate the package. +6. Document manual configuration steps, migration requirements, and known gaps in this README. + +## Notes + +- Replace the placeholder long-running process in `start.sh`. +- Populate the `app/` directory with the application build artefacts or git submodules. +- Use the shared packaging container (`docker/packager`) to run `cloudron build` and `cloudron install` so the host remains clean. diff --git a/apps/openfile/app/.gitkeep b/apps/openfile/app/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/apps/openfile/metadata.json b/apps/openfile/metadata.json new file mode 100644 index 0000000..af408f7 --- /dev/null +++ b/apps/openfile/metadata.json @@ -0,0 +1,9 @@ +{ + "slug": "openfile", + "title": "OpenFile", + "issue": "https://projects.knownelement.com/issues/316", + "repo": "https://github.com/openfiletax/openfile.git", + "additionalRepos": [], + "created": "2025-10-02T16:46:49Z", + "notes": "TODO: capture packaging notes" +} \ No newline at end of file diff --git a/apps/openfile/start.sh b/apps/openfile/start.sh new file mode 100755 index 0000000..238c8af --- /dev/null +++ b/apps/openfile/start.sh @@ -0,0 +1,8 @@ +#!/bin/bash +set -euo pipefail + +# Cloudron injects configuration via environment variables and files under /run +# Use this script to render config files and launch the upstream service. + +# TODO: Replace the command below with the correct process supervisor. +exec /bin/sh -c "echo 'Replace start.sh with application startup logic for OpenFile' && sleep infinity" diff --git a/apps/openfile/test/smoke.sh b/apps/openfile/test/smoke.sh new file mode 100755 index 0000000..ebd1134 --- /dev/null +++ b/apps/openfile/test/smoke.sh @@ -0,0 +1,16 @@ +#!/bin/bash +set -euo pipefail + +# Basic container reachability check executed inside the packaging container. +# Replace curl target with an endpoint exposed by the app once the package is functional. +cloudron_app_url=${CLOUDRON_APP_ORIGIN:-"http://localhost"} + +http_code=$(curl -s -o /tmp/smoke.log -w "%{http_code}" "${cloudron_app_url}") + +if [[ "${http_code}" != "200" ]]; then + echo "Unexpected HTTP status: ${http_code}" >&2 + cat /tmp/smoke.log >&2 + exit 1 +fi + +echo "Smoke test passed" diff --git a/apps/payroll-engine/CloudronManifest.json b/apps/payroll-engine/CloudronManifest.json new file mode 100644 index 0000000..6dc658f --- /dev/null +++ b/apps/payroll-engine/CloudronManifest.json @@ -0,0 +1,20 @@ +{ + "manifestVersion": 2, + "id": "com.knel.payroll.engine", + "title": "Payroll Engine", + "author": "Known Element Packaging Team", + "tagline": "TODO: Short one-line pitch", + "description": "TODO: Comprehensive description for the Cloudron App Store entry.", + "changelog": "Initial scaffold", + "website": "https://github.com/Payroll-Engine/PayrollEngine", + "supportUrl": "https://projects.knownelement.com/issues/208", + "sourceUrl": "https://github.com/Payroll-Engine/PayrollEngine.git", + "version": "0.1.0", + "tags": ["custom", "known-element"], + "healthCheckPath": "/", + "memoryLimit": 536870912, + "httpPort": 3000, + "addons": { + "localstorage": {} + } +} diff --git a/apps/payroll-engine/Dockerfile b/apps/payroll-engine/Dockerfile new file mode 100644 index 0000000..7d29ef9 --- /dev/null +++ b/apps/payroll-engine/Dockerfile @@ -0,0 +1,22 @@ +# syntax=docker/dockerfile:1 +FROM cloudron/base:5.0.0 + +LABEL org.opencontainers.image.source="https://github.com/Payroll-Engine/PayrollEngine.git" +LABEL org.opencontainers.image.description="Cloudron package for Payroll Engine" + +ARG APP_VERSION +ENV APP_VERSION=${APP_VERSION:-latest} + +# Copy application source into image at build time +# Replace this with a multi-stage build if upstream provides Docker images. +COPY ./app /app/code + +# Copy start script and make it executable +COPY ./start.sh /app/pkg/start.sh +RUN chmod +x /app/pkg/start.sh + +# Cloudron expects all processes to run as cloudron user +USER cloudron +WORKDIR /app/code + +CMD ["/app/pkg/start.sh"] diff --git a/apps/payroll-engine/README.md b/apps/payroll-engine/README.md new file mode 100644 index 0000000..407e38a --- /dev/null +++ b/apps/payroll-engine/README.md @@ -0,0 +1,20 @@ +# Payroll Engine on Cloudron + +- **Upstream repository**: https://github.com/Payroll-Engine/PayrollEngine.git +- **Implementation issue**: https://projects.knownelement.com/issues/208 +- **Status**: Draft scaffolding generated on $(date -u +"%Y-%m-%dT%H:%M:%SZ") + +## Packaging Checklist + +1. Review upstream deployment requirements and map them to Cloudron services (database, cache, object storage, workers). +2. Update `Dockerfile` with the correct build steps and runtime dependencies. +3. Implement `start.sh` to configure the app from Cloudron-provided environment variables and launch the primary process. +4. Edit `CloudronManifest.json` with accurate metadata, permissions, ports, addons, and health checks. +5. Add integration and smoke tests under `test/` to validate the package. +6. Document manual configuration steps, migration requirements, and known gaps in this README. + +## Notes + +- Replace the placeholder long-running process in `start.sh`. +- Populate the `app/` directory with the application build artefacts or git submodules. +- Use the shared packaging container (`docker/packager`) to run `cloudron build` and `cloudron install` so the host remains clean. diff --git a/apps/payroll-engine/app/.gitkeep b/apps/payroll-engine/app/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/apps/payroll-engine/metadata.json b/apps/payroll-engine/metadata.json new file mode 100644 index 0000000..e82391a --- /dev/null +++ b/apps/payroll-engine/metadata.json @@ -0,0 +1,9 @@ +{ + "slug": "payroll-engine", + "title": "Payroll Engine", + "issue": "https://projects.knownelement.com/issues/208", + "repo": "https://github.com/Payroll-Engine/PayrollEngine.git", + "additionalRepos": [], + "created": "2025-10-02T16:46:49Z", + "notes": "TODO: capture packaging notes" +} \ No newline at end of file diff --git a/apps/payroll-engine/start.sh b/apps/payroll-engine/start.sh new file mode 100755 index 0000000..d257922 --- /dev/null +++ b/apps/payroll-engine/start.sh @@ -0,0 +1,8 @@ +#!/bin/bash +set -euo pipefail + +# Cloudron injects configuration via environment variables and files under /run +# Use this script to render config files and launch the upstream service. + +# TODO: Replace the command below with the correct process supervisor. +exec /bin/sh -c "echo 'Replace start.sh with application startup logic for Payroll Engine' && sleep infinity" diff --git a/apps/payroll-engine/test/smoke.sh b/apps/payroll-engine/test/smoke.sh new file mode 100755 index 0000000..ebd1134 --- /dev/null +++ b/apps/payroll-engine/test/smoke.sh @@ -0,0 +1,16 @@ +#!/bin/bash +set -euo pipefail + +# Basic container reachability check executed inside the packaging container. +# Replace curl target with an endpoint exposed by the app once the package is functional. +cloudron_app_url=${CLOUDRON_APP_ORIGIN:-"http://localhost"} + +http_code=$(curl -s -o /tmp/smoke.log -w "%{http_code}" "${cloudron_app_url}") + +if [[ "${http_code}" != "200" ]]; then + echo "Unexpected HTTP status: ${http_code}" >&2 + cat /tmp/smoke.log >&2 + exit 1 +fi + +echo "Smoke test passed" diff --git a/apps/plmore/CloudronManifest.json b/apps/plmore/CloudronManifest.json new file mode 100644 index 0000000..23e00dd --- /dev/null +++ b/apps/plmore/CloudronManifest.json @@ -0,0 +1,20 @@ +{ + "manifestVersion": 2, + "id": "com.knel.plmore", + "title": "PLMore", + "author": "Known Element Packaging Team", + "tagline": "TODO: Short one-line pitch", + "description": "TODO: Comprehensive description for the Cloudron App Store entry.", + "changelog": "Initial scaffold", + "website": "https://github.com/PLMore/PLMore", + "supportUrl": "https://projects.knownelement.com/issues/279", + "sourceUrl": "https://github.com/PLMore/PLMore", + "version": "0.1.0", + "tags": ["custom", "known-element"], + "healthCheckPath": "/", + "memoryLimit": 536870912, + "httpPort": 3000, + "addons": { + "localstorage": {} + } +} diff --git a/apps/plmore/Dockerfile b/apps/plmore/Dockerfile new file mode 100644 index 0000000..5693c7c --- /dev/null +++ b/apps/plmore/Dockerfile @@ -0,0 +1,22 @@ +# syntax=docker/dockerfile:1 +FROM cloudron/base:5.0.0 + +LABEL org.opencontainers.image.source="https://github.com/PLMore/PLMore" +LABEL org.opencontainers.image.description="Cloudron package for PLMore" + +ARG APP_VERSION +ENV APP_VERSION=${APP_VERSION:-latest} + +# Copy application source into image at build time +# Replace this with a multi-stage build if upstream provides Docker images. +COPY ./app /app/code + +# Copy start script and make it executable +COPY ./start.sh /app/pkg/start.sh +RUN chmod +x /app/pkg/start.sh + +# Cloudron expects all processes to run as cloudron user +USER cloudron +WORKDIR /app/code + +CMD ["/app/pkg/start.sh"] diff --git a/apps/plmore/README.md b/apps/plmore/README.md new file mode 100644 index 0000000..0cd4293 --- /dev/null +++ b/apps/plmore/README.md @@ -0,0 +1,20 @@ +# PLMore on Cloudron + +- **Upstream repository**: https://github.com/PLMore/PLMore +- **Implementation issue**: https://projects.knownelement.com/issues/279 +- **Status**: Draft scaffolding generated on $(date -u +"%Y-%m-%dT%H:%M:%SZ") + +## Packaging Checklist + +1. Review upstream deployment requirements and map them to Cloudron services (database, cache, object storage, workers). +2. Update `Dockerfile` with the correct build steps and runtime dependencies. +3. Implement `start.sh` to configure the app from Cloudron-provided environment variables and launch the primary process. +4. Edit `CloudronManifest.json` with accurate metadata, permissions, ports, addons, and health checks. +5. Add integration and smoke tests under `test/` to validate the package. +6. Document manual configuration steps, migration requirements, and known gaps in this README. + +## Notes + +- Replace the placeholder long-running process in `start.sh`. +- Populate the `app/` directory with the application build artefacts or git submodules. +- Use the shared packaging container (`docker/packager`) to run `cloudron build` and `cloudron install` so the host remains clean. diff --git a/apps/plmore/app/.gitkeep b/apps/plmore/app/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/apps/plmore/metadata.json b/apps/plmore/metadata.json new file mode 100644 index 0000000..7a9d9bc --- /dev/null +++ b/apps/plmore/metadata.json @@ -0,0 +1,9 @@ +{ + "slug": "plmore", + "title": "PLMore", + "issue": "https://projects.knownelement.com/issues/279", + "repo": "https://github.com/PLMore/PLMore", + "additionalRepos": [], + "created": "2025-10-02T16:46:49Z", + "notes": "TODO: capture packaging notes" +} \ No newline at end of file diff --git a/apps/plmore/start.sh b/apps/plmore/start.sh new file mode 100755 index 0000000..aaa1e5d --- /dev/null +++ b/apps/plmore/start.sh @@ -0,0 +1,8 @@ +#!/bin/bash +set -euo pipefail + +# Cloudron injects configuration via environment variables and files under /run +# Use this script to render config files and launch the upstream service. + +# TODO: Replace the command below with the correct process supervisor. +exec /bin/sh -c "echo 'Replace start.sh with application startup logic for PLMore' && sleep infinity" diff --git a/apps/plmore/test/smoke.sh b/apps/plmore/test/smoke.sh new file mode 100755 index 0000000..ebd1134 --- /dev/null +++ b/apps/plmore/test/smoke.sh @@ -0,0 +1,16 @@ +#!/bin/bash +set -euo pipefail + +# Basic container reachability check executed inside the packaging container. +# Replace curl target with an endpoint exposed by the app once the package is functional. +cloudron_app_url=${CLOUDRON_APP_ORIGIN:-"http://localhost"} + +http_code=$(curl -s -o /tmp/smoke.log -w "%{http_code}" "${cloudron_app_url}") + +if [[ "${http_code}" != "200" ]]; then + echo "Unexpected HTTP status: ${http_code}" >&2 + cat /tmp/smoke.log >&2 + exit 1 +fi + +echo "Smoke test passed" diff --git a/apps/puter/CloudronManifest.json b/apps/puter/CloudronManifest.json new file mode 100644 index 0000000..560a814 --- /dev/null +++ b/apps/puter/CloudronManifest.json @@ -0,0 +1,20 @@ +{ + "manifestVersion": 2, + "id": "com.knel.puter", + "title": "Puter", + "author": "Known Element Packaging Team", + "tagline": "TODO: Short one-line pitch", + "description": "TODO: Comprehensive description for the Cloudron App Store entry.", + "changelog": "Initial scaffold", + "website": "https://github.com/HeyPuter/puter", + "supportUrl": "https://projects.knownelement.com/issues/286", + "sourceUrl": "https://github.com/HeyPuter/puter.git", + "version": "0.1.0", + "tags": ["custom", "known-element"], + "healthCheckPath": "/", + "memoryLimit": 536870912, + "httpPort": 3000, + "addons": { + "localstorage": {} + } +} diff --git a/apps/puter/Dockerfile b/apps/puter/Dockerfile new file mode 100644 index 0000000..7b9868c --- /dev/null +++ b/apps/puter/Dockerfile @@ -0,0 +1,22 @@ +# syntax=docker/dockerfile:1 +FROM cloudron/base:5.0.0 + +LABEL org.opencontainers.image.source="https://github.com/HeyPuter/puter.git" +LABEL org.opencontainers.image.description="Cloudron package for Puter" + +ARG APP_VERSION +ENV APP_VERSION=${APP_VERSION:-latest} + +# Copy application source into image at build time +# Replace this with a multi-stage build if upstream provides Docker images. +COPY ./app /app/code + +# Copy start script and make it executable +COPY ./start.sh /app/pkg/start.sh +RUN chmod +x /app/pkg/start.sh + +# Cloudron expects all processes to run as cloudron user +USER cloudron +WORKDIR /app/code + +CMD ["/app/pkg/start.sh"] diff --git a/apps/puter/README.md b/apps/puter/README.md new file mode 100644 index 0000000..812a572 --- /dev/null +++ b/apps/puter/README.md @@ -0,0 +1,20 @@ +# Puter on Cloudron + +- **Upstream repository**: https://github.com/HeyPuter/puter.git +- **Implementation issue**: https://projects.knownelement.com/issues/286 +- **Status**: Draft scaffolding generated on $(date -u +"%Y-%m-%dT%H:%M:%SZ") + +## Packaging Checklist + +1. Review upstream deployment requirements and map them to Cloudron services (database, cache, object storage, workers). +2. Update `Dockerfile` with the correct build steps and runtime dependencies. +3. Implement `start.sh` to configure the app from Cloudron-provided environment variables and launch the primary process. +4. Edit `CloudronManifest.json` with accurate metadata, permissions, ports, addons, and health checks. +5. Add integration and smoke tests under `test/` to validate the package. +6. Document manual configuration steps, migration requirements, and known gaps in this README. + +## Notes + +- Replace the placeholder long-running process in `start.sh`. +- Populate the `app/` directory with the application build artefacts or git submodules. +- Use the shared packaging container (`docker/packager`) to run `cloudron build` and `cloudron install` so the host remains clean. diff --git a/apps/puter/app/.gitkeep b/apps/puter/app/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/apps/puter/metadata.json b/apps/puter/metadata.json new file mode 100644 index 0000000..828a6b7 --- /dev/null +++ b/apps/puter/metadata.json @@ -0,0 +1,9 @@ +{ + "slug": "puter", + "title": "Puter", + "issue": "https://projects.knownelement.com/issues/286", + "repo": "https://github.com/HeyPuter/puter.git", + "additionalRepos": [], + "created": "2025-10-02T16:46:49Z", + "notes": "TODO: capture packaging notes" +} \ No newline at end of file diff --git a/apps/puter/start.sh b/apps/puter/start.sh new file mode 100755 index 0000000..b719ec9 --- /dev/null +++ b/apps/puter/start.sh @@ -0,0 +1,8 @@ +#!/bin/bash +set -euo pipefail + +# Cloudron injects configuration via environment variables and files under /run +# Use this script to render config files and launch the upstream service. + +# TODO: Replace the command below with the correct process supervisor. +exec /bin/sh -c "echo 'Replace start.sh with application startup logic for Puter' && sleep infinity" diff --git a/apps/puter/test/smoke.sh b/apps/puter/test/smoke.sh new file mode 100755 index 0000000..ebd1134 --- /dev/null +++ b/apps/puter/test/smoke.sh @@ -0,0 +1,16 @@ +#!/bin/bash +set -euo pipefail + +# Basic container reachability check executed inside the packaging container. +# Replace curl target with an endpoint exposed by the app once the package is functional. +cloudron_app_url=${CLOUDRON_APP_ORIGIN:-"http://localhost"} + +http_code=$(curl -s -o /tmp/smoke.log -w "%{http_code}" "${cloudron_app_url}") + +if [[ "${http_code}" != "200" ]]; then + echo "Unexpected HTTP status: ${http_code}" >&2 + cat /tmp/smoke.log >&2 + exit 1 +fi + +echo "Smoke test passed" diff --git a/apps/rathole/CloudronManifest.json b/apps/rathole/CloudronManifest.json new file mode 100644 index 0000000..a016221 --- /dev/null +++ b/apps/rathole/CloudronManifest.json @@ -0,0 +1,20 @@ +{ + "manifestVersion": 2, + "id": "com.knel.rathole", + "title": "rathole", + "author": "Known Element Packaging Team", + "tagline": "TODO: Short one-line pitch", + "description": "TODO: Comprehensive description for the Cloudron App Store entry.", + "changelog": "Initial scaffold", + "website": "https://github.com/rathole-org/rathole", + "supportUrl": "https://projects.knownelement.com/issues/225", + "sourceUrl": "https://github.com/rathole-org/rathole.git", + "version": "0.1.0", + "tags": ["custom", "known-element"], + "healthCheckPath": "/", + "memoryLimit": 536870912, + "httpPort": 3000, + "addons": { + "localstorage": {} + } +} diff --git a/apps/rathole/Dockerfile b/apps/rathole/Dockerfile new file mode 100644 index 0000000..09c8478 --- /dev/null +++ b/apps/rathole/Dockerfile @@ -0,0 +1,22 @@ +# syntax=docker/dockerfile:1 +FROM cloudron/base:5.0.0 + +LABEL org.opencontainers.image.source="https://github.com/rathole-org/rathole.git" +LABEL org.opencontainers.image.description="Cloudron package for rathole" + +ARG APP_VERSION +ENV APP_VERSION=${APP_VERSION:-latest} + +# Copy application source into image at build time +# Replace this with a multi-stage build if upstream provides Docker images. +COPY ./app /app/code + +# Copy start script and make it executable +COPY ./start.sh /app/pkg/start.sh +RUN chmod +x /app/pkg/start.sh + +# Cloudron expects all processes to run as cloudron user +USER cloudron +WORKDIR /app/code + +CMD ["/app/pkg/start.sh"] diff --git a/apps/rathole/README.md b/apps/rathole/README.md new file mode 100644 index 0000000..98fef3d --- /dev/null +++ b/apps/rathole/README.md @@ -0,0 +1,20 @@ +# rathole on Cloudron + +- **Upstream repository**: https://github.com/rathole-org/rathole.git +- **Implementation issue**: https://projects.knownelement.com/issues/225 +- **Status**: Draft scaffolding generated on $(date -u +"%Y-%m-%dT%H:%M:%SZ") + +## Packaging Checklist + +1. Review upstream deployment requirements and map them to Cloudron services (database, cache, object storage, workers). +2. Update `Dockerfile` with the correct build steps and runtime dependencies. +3. Implement `start.sh` to configure the app from Cloudron-provided environment variables and launch the primary process. +4. Edit `CloudronManifest.json` with accurate metadata, permissions, ports, addons, and health checks. +5. Add integration and smoke tests under `test/` to validate the package. +6. Document manual configuration steps, migration requirements, and known gaps in this README. + +## Notes + +- Replace the placeholder long-running process in `start.sh`. +- Populate the `app/` directory with the application build artefacts or git submodules. +- Use the shared packaging container (`docker/packager`) to run `cloudron build` and `cloudron install` so the host remains clean. diff --git a/apps/rathole/app/.gitkeep b/apps/rathole/app/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/apps/rathole/metadata.json b/apps/rathole/metadata.json new file mode 100644 index 0000000..f7df99f --- /dev/null +++ b/apps/rathole/metadata.json @@ -0,0 +1,9 @@ +{ + "slug": "rathole", + "title": "rathole", + "issue": "https://projects.knownelement.com/issues/225", + "repo": "https://github.com/rathole-org/rathole.git", + "additionalRepos": [], + "created": "2025-10-02T16:46:49Z", + "notes": "TODO: capture packaging notes" +} \ No newline at end of file diff --git a/apps/rathole/start.sh b/apps/rathole/start.sh new file mode 100755 index 0000000..3af1a8f --- /dev/null +++ b/apps/rathole/start.sh @@ -0,0 +1,8 @@ +#!/bin/bash +set -euo pipefail + +# Cloudron injects configuration via environment variables and files under /run +# Use this script to render config files and launch the upstream service. + +# TODO: Replace the command below with the correct process supervisor. +exec /bin/sh -c "echo 'Replace start.sh with application startup logic for rathole' && sleep infinity" diff --git a/apps/rathole/test/smoke.sh b/apps/rathole/test/smoke.sh new file mode 100755 index 0000000..ebd1134 --- /dev/null +++ b/apps/rathole/test/smoke.sh @@ -0,0 +1,16 @@ +#!/bin/bash +set -euo pipefail + +# Basic container reachability check executed inside the packaging container. +# Replace curl target with an endpoint exposed by the app once the package is functional. +cloudron_app_url=${CLOUDRON_APP_ORIGIN:-"http://localhost"} + +http_code=$(curl -s -o /tmp/smoke.log -w "%{http_code}" "${cloudron_app_url}") + +if [[ "${http_code}" != "200" ]]; then + echo "Unexpected HTTP status: ${http_code}" >&2 + cat /tmp/smoke.log >&2 + exit 1 +fi + +echo "Smoke test passed" diff --git a/apps/resgrid/CloudronManifest.json b/apps/resgrid/CloudronManifest.json new file mode 100644 index 0000000..d23c7dd --- /dev/null +++ b/apps/resgrid/CloudronManifest.json @@ -0,0 +1,20 @@ +{ + "manifestVersion": 2, + "id": "com.knel.resgrid", + "title": "Resgrid Core", + "author": "Known Element Packaging Team", + "tagline": "TODO: Short one-line pitch", + "description": "TODO: Comprehensive description for the Cloudron App Store entry.", + "changelog": "Initial scaffold", + "website": "https://github.com/Resgrid/Core", + "supportUrl": "https://projects.knownelement.com/issues/214", + "sourceUrl": "https://github.com/Resgrid/Core", + "version": "0.1.0", + "tags": ["custom", "known-element"], + "healthCheckPath": "/", + "memoryLimit": 536870912, + "httpPort": 3000, + "addons": { + "localstorage": {} + } +} diff --git a/apps/resgrid/Dockerfile b/apps/resgrid/Dockerfile new file mode 100644 index 0000000..bf8422a --- /dev/null +++ b/apps/resgrid/Dockerfile @@ -0,0 +1,22 @@ +# syntax=docker/dockerfile:1 +FROM cloudron/base:5.0.0 + +LABEL org.opencontainers.image.source="https://github.com/Resgrid/Core" +LABEL org.opencontainers.image.description="Cloudron package for Resgrid Core" + +ARG APP_VERSION +ENV APP_VERSION=${APP_VERSION:-latest} + +# Copy application source into image at build time +# Replace this with a multi-stage build if upstream provides Docker images. +COPY ./app /app/code + +# Copy start script and make it executable +COPY ./start.sh /app/pkg/start.sh +RUN chmod +x /app/pkg/start.sh + +# Cloudron expects all processes to run as cloudron user +USER cloudron +WORKDIR /app/code + +CMD ["/app/pkg/start.sh"] diff --git a/apps/resgrid/README.md b/apps/resgrid/README.md new file mode 100644 index 0000000..012af0e --- /dev/null +++ b/apps/resgrid/README.md @@ -0,0 +1,20 @@ +# Resgrid Core on Cloudron + +- **Upstream repository**: https://github.com/Resgrid/Core +- **Implementation issue**: https://projects.knownelement.com/issues/214 +- **Status**: Draft scaffolding generated on $(date -u +"%Y-%m-%dT%H:%M:%SZ") + +## Packaging Checklist + +1. Review upstream deployment requirements and map them to Cloudron services (database, cache, object storage, workers). +2. Update `Dockerfile` with the correct build steps and runtime dependencies. +3. Implement `start.sh` to configure the app from Cloudron-provided environment variables and launch the primary process. +4. Edit `CloudronManifest.json` with accurate metadata, permissions, ports, addons, and health checks. +5. Add integration and smoke tests under `test/` to validate the package. +6. Document manual configuration steps, migration requirements, and known gaps in this README. + +## Notes + +- Replace the placeholder long-running process in `start.sh`. +- Populate the `app/` directory with the application build artefacts or git submodules. +- Use the shared packaging container (`docker/packager`) to run `cloudron build` and `cloudron install` so the host remains clean. diff --git a/apps/resgrid/app/.gitkeep b/apps/resgrid/app/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/apps/resgrid/metadata.json b/apps/resgrid/metadata.json new file mode 100644 index 0000000..9989dc7 --- /dev/null +++ b/apps/resgrid/metadata.json @@ -0,0 +1,9 @@ +{ + "slug": "resgrid", + "title": "Resgrid Core", + "issue": "https://projects.knownelement.com/issues/214", + "repo": "https://github.com/Resgrid/Core", + "additionalRepos": [], + "created": "2025-10-02T16:46:49Z", + "notes": "TODO: capture packaging notes" +} \ No newline at end of file diff --git a/apps/resgrid/start.sh b/apps/resgrid/start.sh new file mode 100755 index 0000000..a36f73e --- /dev/null +++ b/apps/resgrid/start.sh @@ -0,0 +1,8 @@ +#!/bin/bash +set -euo pipefail + +# Cloudron injects configuration via environment variables and files under /run +# Use this script to render config files and launch the upstream service. + +# TODO: Replace the command below with the correct process supervisor. +exec /bin/sh -c "echo 'Replace start.sh with application startup logic for Resgrid Core' && sleep infinity" diff --git a/apps/resgrid/test/smoke.sh b/apps/resgrid/test/smoke.sh new file mode 100755 index 0000000..ebd1134 --- /dev/null +++ b/apps/resgrid/test/smoke.sh @@ -0,0 +1,16 @@ +#!/bin/bash +set -euo pipefail + +# Basic container reachability check executed inside the packaging container. +# Replace curl target with an endpoint exposed by the app once the package is functional. +cloudron_app_url=${CLOUDRON_APP_ORIGIN:-"http://localhost"} + +http_code=$(curl -s -o /tmp/smoke.log -w "%{http_code}" "${cloudron_app_url}") + +if [[ "${http_code}" != "200" ]]; then + echo "Unexpected HTTP status: ${http_code}" >&2 + cat /tmp/smoke.log >&2 + exit 1 +fi + +echo "Smoke test passed" diff --git a/apps/reviewboard/CloudronManifest.json b/apps/reviewboard/CloudronManifest.json new file mode 100644 index 0000000..543c961 --- /dev/null +++ b/apps/reviewboard/CloudronManifest.json @@ -0,0 +1,20 @@ +{ + "manifestVersion": 2, + "id": "com.knel.reviewboard", + "title": "Review Board", + "author": "Known Element Packaging Team", + "tagline": "TODO: Short one-line pitch", + "description": "TODO: Comprehensive description for the Cloudron App Store entry.", + "changelog": "Initial scaffold", + "website": "https://github.com/reviewboard/reviewboard", + "supportUrl": "https://projects.knownelement.com/issues/216", + "sourceUrl": "https://github.com/reviewboard/reviewboard.git", + "version": "0.1.0", + "tags": ["custom", "known-element"], + "healthCheckPath": "/", + "memoryLimit": 536870912, + "httpPort": 3000, + "addons": { + "localstorage": {} + } +} diff --git a/apps/reviewboard/Dockerfile b/apps/reviewboard/Dockerfile new file mode 100644 index 0000000..db4a987 --- /dev/null +++ b/apps/reviewboard/Dockerfile @@ -0,0 +1,22 @@ +# syntax=docker/dockerfile:1 +FROM cloudron/base:5.0.0 + +LABEL org.opencontainers.image.source="https://github.com/reviewboard/reviewboard.git" +LABEL org.opencontainers.image.description="Cloudron package for Review Board" + +ARG APP_VERSION +ENV APP_VERSION=${APP_VERSION:-latest} + +# Copy application source into image at build time +# Replace this with a multi-stage build if upstream provides Docker images. +COPY ./app /app/code + +# Copy start script and make it executable +COPY ./start.sh /app/pkg/start.sh +RUN chmod +x /app/pkg/start.sh + +# Cloudron expects all processes to run as cloudron user +USER cloudron +WORKDIR /app/code + +CMD ["/app/pkg/start.sh"] diff --git a/apps/reviewboard/README.md b/apps/reviewboard/README.md new file mode 100644 index 0000000..b1c1a20 --- /dev/null +++ b/apps/reviewboard/README.md @@ -0,0 +1,20 @@ +# Review Board on Cloudron + +- **Upstream repository**: https://github.com/reviewboard/reviewboard.git +- **Implementation issue**: https://projects.knownelement.com/issues/216 +- **Status**: Draft scaffolding generated on $(date -u +"%Y-%m-%dT%H:%M:%SZ") + +## Packaging Checklist + +1. Review upstream deployment requirements and map them to Cloudron services (database, cache, object storage, workers). +2. Update `Dockerfile` with the correct build steps and runtime dependencies. +3. Implement `start.sh` to configure the app from Cloudron-provided environment variables and launch the primary process. +4. Edit `CloudronManifest.json` with accurate metadata, permissions, ports, addons, and health checks. +5. Add integration and smoke tests under `test/` to validate the package. +6. Document manual configuration steps, migration requirements, and known gaps in this README. + +## Notes + +- Replace the placeholder long-running process in `start.sh`. +- Populate the `app/` directory with the application build artefacts or git submodules. +- Use the shared packaging container (`docker/packager`) to run `cloudron build` and `cloudron install` so the host remains clean. diff --git a/apps/reviewboard/app/.gitkeep b/apps/reviewboard/app/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/apps/reviewboard/metadata.json b/apps/reviewboard/metadata.json new file mode 100644 index 0000000..cc3d215 --- /dev/null +++ b/apps/reviewboard/metadata.json @@ -0,0 +1,9 @@ +{ + "slug": "reviewboard", + "title": "Review Board", + "issue": "https://projects.knownelement.com/issues/216", + "repo": "https://github.com/reviewboard/reviewboard.git", + "additionalRepos": [], + "created": "2025-10-02T16:46:49Z", + "notes": "TODO: capture packaging notes" +} \ No newline at end of file diff --git a/apps/reviewboard/start.sh b/apps/reviewboard/start.sh new file mode 100755 index 0000000..c440b67 --- /dev/null +++ b/apps/reviewboard/start.sh @@ -0,0 +1,8 @@ +#!/bin/bash +set -euo pipefail + +# Cloudron injects configuration via environment variables and files under /run +# Use this script to render config files and launch the upstream service. + +# TODO: Replace the command below with the correct process supervisor. +exec /bin/sh -c "echo 'Replace start.sh with application startup logic for Review Board' && sleep infinity" diff --git a/apps/reviewboard/test/smoke.sh b/apps/reviewboard/test/smoke.sh new file mode 100755 index 0000000..ebd1134 --- /dev/null +++ b/apps/reviewboard/test/smoke.sh @@ -0,0 +1,16 @@ +#!/bin/bash +set -euo pipefail + +# Basic container reachability check executed inside the packaging container. +# Replace curl target with an endpoint exposed by the app once the package is functional. +cloudron_app_url=${CLOUDRON_APP_ORIGIN:-"http://localhost"} + +http_code=$(curl -s -o /tmp/smoke.log -w "%{http_code}" "${cloudron_app_url}") + +if [[ "${http_code}" != "200" ]]; then + echo "Unexpected HTTP status: ${http_code}" >&2 + cat /tmp/smoke.log >&2 + exit 1 +fi + +echo "Smoke test passed" diff --git a/apps/rundeck/CloudronManifest.json b/apps/rundeck/CloudronManifest.json new file mode 100644 index 0000000..49e18b0 --- /dev/null +++ b/apps/rundeck/CloudronManifest.json @@ -0,0 +1,20 @@ +{ + "manifestVersion": 2, + "id": "com.knel.rundeck", + "title": "Rundeck", + "author": "Known Element Packaging Team", + "tagline": "TODO: Short one-line pitch", + "description": "TODO: Comprehensive description for the Cloudron App Store entry.", + "changelog": "Initial scaffold", + "website": "https://github.com/rundeck/rundeck", + "supportUrl": "https://projects.knownelement.com/issues/217", + "sourceUrl": "https://github.com/rundeck/rundeck.git", + "version": "0.1.0", + "tags": ["custom", "known-element"], + "healthCheckPath": "/", + "memoryLimit": 536870912, + "httpPort": 3000, + "addons": { + "localstorage": {} + } +} diff --git a/apps/rundeck/Dockerfile b/apps/rundeck/Dockerfile new file mode 100644 index 0000000..29f7210 --- /dev/null +++ b/apps/rundeck/Dockerfile @@ -0,0 +1,22 @@ +# syntax=docker/dockerfile:1 +FROM cloudron/base:5.0.0 + +LABEL org.opencontainers.image.source="https://github.com/rundeck/rundeck.git" +LABEL org.opencontainers.image.description="Cloudron package for Rundeck" + +ARG APP_VERSION +ENV APP_VERSION=${APP_VERSION:-latest} + +# Copy application source into image at build time +# Replace this with a multi-stage build if upstream provides Docker images. +COPY ./app /app/code + +# Copy start script and make it executable +COPY ./start.sh /app/pkg/start.sh +RUN chmod +x /app/pkg/start.sh + +# Cloudron expects all processes to run as cloudron user +USER cloudron +WORKDIR /app/code + +CMD ["/app/pkg/start.sh"] diff --git a/apps/rundeck/README.md b/apps/rundeck/README.md new file mode 100644 index 0000000..412ccc0 --- /dev/null +++ b/apps/rundeck/README.md @@ -0,0 +1,20 @@ +# Rundeck on Cloudron + +- **Upstream repository**: https://github.com/rundeck/rundeck.git +- **Implementation issue**: https://projects.knownelement.com/issues/217 +- **Status**: Draft scaffolding generated on $(date -u +"%Y-%m-%dT%H:%M:%SZ") + +## Packaging Checklist + +1. Review upstream deployment requirements and map them to Cloudron services (database, cache, object storage, workers). +2. Update `Dockerfile` with the correct build steps and runtime dependencies. +3. Implement `start.sh` to configure the app from Cloudron-provided environment variables and launch the primary process. +4. Edit `CloudronManifest.json` with accurate metadata, permissions, ports, addons, and health checks. +5. Add integration and smoke tests under `test/` to validate the package. +6. Document manual configuration steps, migration requirements, and known gaps in this README. + +## Notes + +- Replace the placeholder long-running process in `start.sh`. +- Populate the `app/` directory with the application build artefacts or git submodules. +- Use the shared packaging container (`docker/packager`) to run `cloudron build` and `cloudron install` so the host remains clean. diff --git a/apps/rundeck/app/.gitkeep b/apps/rundeck/app/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/apps/rundeck/metadata.json b/apps/rundeck/metadata.json new file mode 100644 index 0000000..38532ae --- /dev/null +++ b/apps/rundeck/metadata.json @@ -0,0 +1,9 @@ +{ + "slug": "rundeck", + "title": "Rundeck", + "issue": "https://projects.knownelement.com/issues/217", + "repo": "https://github.com/rundeck/rundeck.git", + "additionalRepos": [], + "created": "2025-10-02T16:46:49Z", + "notes": "TODO: capture packaging notes" +} \ No newline at end of file diff --git a/apps/rundeck/start.sh b/apps/rundeck/start.sh new file mode 100755 index 0000000..6a0fb24 --- /dev/null +++ b/apps/rundeck/start.sh @@ -0,0 +1,8 @@ +#!/bin/bash +set -euo pipefail + +# Cloudron injects configuration via environment variables and files under /run +# Use this script to render config files and launch the upstream service. + +# TODO: Replace the command below with the correct process supervisor. +exec /bin/sh -c "echo 'Replace start.sh with application startup logic for Rundeck' && sleep infinity" diff --git a/apps/rundeck/test/smoke.sh b/apps/rundeck/test/smoke.sh new file mode 100755 index 0000000..ebd1134 --- /dev/null +++ b/apps/rundeck/test/smoke.sh @@ -0,0 +1,16 @@ +#!/bin/bash +set -euo pipefail + +# Basic container reachability check executed inside the packaging container. +# Replace curl target with an endpoint exposed by the app once the package is functional. +cloudron_app_url=${CLOUDRON_APP_ORIGIN:-"http://localhost"} + +http_code=$(curl -s -o /tmp/smoke.log -w "%{http_code}" "${cloudron_app_url}") + +if [[ "${http_code}" != "200" ]]; then + echo "Unexpected HTTP status: ${http_code}" >&2 + cat /tmp/smoke.log >&2 + exit 1 +fi + +echo "Smoke test passed" diff --git a/apps/runme/CloudronManifest.json b/apps/runme/CloudronManifest.json new file mode 100644 index 0000000..4742ce9 --- /dev/null +++ b/apps/runme/CloudronManifest.json @@ -0,0 +1,20 @@ +{ + "manifestVersion": 2, + "id": "com.knel.runme", + "title": "Runme", + "author": "Known Element Packaging Team", + "tagline": "TODO: Short one-line pitch", + "description": "TODO: Comprehensive description for the Cloudron App Store entry.", + "changelog": "Initial scaffold", + "website": "https://github.com/runmedev/runme", + "supportUrl": "https://projects.knownelement.com/issues/322", + "sourceUrl": "https://github.com/runmedev/runme.git", + "version": "0.1.0", + "tags": ["custom", "known-element"], + "healthCheckPath": "/", + "memoryLimit": 536870912, + "httpPort": 3000, + "addons": { + "localstorage": {} + } +} diff --git a/apps/runme/Dockerfile b/apps/runme/Dockerfile new file mode 100644 index 0000000..df79d5b --- /dev/null +++ b/apps/runme/Dockerfile @@ -0,0 +1,22 @@ +# syntax=docker/dockerfile:1 +FROM cloudron/base:5.0.0 + +LABEL org.opencontainers.image.source="https://github.com/runmedev/runme.git" +LABEL org.opencontainers.image.description="Cloudron package for Runme" + +ARG APP_VERSION +ENV APP_VERSION=${APP_VERSION:-latest} + +# Copy application source into image at build time +# Replace this with a multi-stage build if upstream provides Docker images. +COPY ./app /app/code + +# Copy start script and make it executable +COPY ./start.sh /app/pkg/start.sh +RUN chmod +x /app/pkg/start.sh + +# Cloudron expects all processes to run as cloudron user +USER cloudron +WORKDIR /app/code + +CMD ["/app/pkg/start.sh"] diff --git a/apps/runme/README.md b/apps/runme/README.md new file mode 100644 index 0000000..9020da2 --- /dev/null +++ b/apps/runme/README.md @@ -0,0 +1,20 @@ +# Runme on Cloudron + +- **Upstream repository**: https://github.com/runmedev/runme.git +- **Implementation issue**: https://projects.knownelement.com/issues/322 +- **Status**: Draft scaffolding generated on $(date -u +"%Y-%m-%dT%H:%M:%SZ") + +## Packaging Checklist + +1. Review upstream deployment requirements and map them to Cloudron services (database, cache, object storage, workers). +2. Update `Dockerfile` with the correct build steps and runtime dependencies. +3. Implement `start.sh` to configure the app from Cloudron-provided environment variables and launch the primary process. +4. Edit `CloudronManifest.json` with accurate metadata, permissions, ports, addons, and health checks. +5. Add integration and smoke tests under `test/` to validate the package. +6. Document manual configuration steps, migration requirements, and known gaps in this README. + +## Notes + +- Replace the placeholder long-running process in `start.sh`. +- Populate the `app/` directory with the application build artefacts or git submodules. +- Use the shared packaging container (`docker/packager`) to run `cloudron build` and `cloudron install` so the host remains clean. diff --git a/apps/runme/app/.gitkeep b/apps/runme/app/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/apps/runme/metadata.json b/apps/runme/metadata.json new file mode 100644 index 0000000..a3fd4ec --- /dev/null +++ b/apps/runme/metadata.json @@ -0,0 +1,9 @@ +{ + "slug": "runme", + "title": "Runme", + "issue": "https://projects.knownelement.com/issues/322", + "repo": "https://github.com/runmedev/runme.git", + "additionalRepos": [], + "created": "2025-10-02T16:46:49Z", + "notes": "TODO: capture packaging notes" +} \ No newline at end of file diff --git a/apps/runme/start.sh b/apps/runme/start.sh new file mode 100755 index 0000000..378564c --- /dev/null +++ b/apps/runme/start.sh @@ -0,0 +1,8 @@ +#!/bin/bash +set -euo pipefail + +# Cloudron injects configuration via environment variables and files under /run +# Use this script to render config files and launch the upstream service. + +# TODO: Replace the command below with the correct process supervisor. +exec /bin/sh -c "echo 'Replace start.sh with application startup logic for Runme' && sleep infinity" diff --git a/apps/runme/test/smoke.sh b/apps/runme/test/smoke.sh new file mode 100755 index 0000000..ebd1134 --- /dev/null +++ b/apps/runme/test/smoke.sh @@ -0,0 +1,16 @@ +#!/bin/bash +set -euo pipefail + +# Basic container reachability check executed inside the packaging container. +# Replace curl target with an endpoint exposed by the app once the package is functional. +cloudron_app_url=${CLOUDRON_APP_ORIGIN:-"http://localhost"} + +http_code=$(curl -s -o /tmp/smoke.log -w "%{http_code}" "${cloudron_app_url}") + +if [[ "${http_code}" != "200" ]]; then + echo "Unexpected HTTP status: ${http_code}" >&2 + cat /tmp/smoke.log >&2 + exit 1 +fi + +echo "Smoke test passed" diff --git a/apps/satnogs-kaitai/CloudronManifest.json b/apps/satnogs-kaitai/CloudronManifest.json new file mode 100644 index 0000000..c0ca30e --- /dev/null +++ b/apps/satnogs-kaitai/CloudronManifest.json @@ -0,0 +1,20 @@ +{ + "manifestVersion": 2, + "id": "com.knel.satnogs.kaitai", + "title": "SatNOGS Kaitai", + "author": "Known Element Packaging Team", + "tagline": "TODO: Short one-line pitch", + "description": "TODO: Comprehensive description for the Cloudron App Store entry.", + "changelog": "Initial scaffold", + "website": "https://gitlab.com/librespacefoundation/satnogs/docker-kaita", + "supportUrl": "https://projects.knownelement.com/issues/218", + "sourceUrl": "https://gitlab.com/librespacefoundation/satnogs/docker-kaitai.git", + "version": "0.1.0", + "tags": ["custom", "known-element"], + "healthCheckPath": "/", + "memoryLimit": 536870912, + "httpPort": 3000, + "addons": { + "localstorage": {} + } +} diff --git a/apps/satnogs-kaitai/Dockerfile b/apps/satnogs-kaitai/Dockerfile new file mode 100644 index 0000000..4f6e7a5 --- /dev/null +++ b/apps/satnogs-kaitai/Dockerfile @@ -0,0 +1,22 @@ +# syntax=docker/dockerfile:1 +FROM cloudron/base:5.0.0 + +LABEL org.opencontainers.image.source="https://gitlab.com/librespacefoundation/satnogs/docker-kaitai.git" +LABEL org.opencontainers.image.description="Cloudron package for SatNOGS Kaitai" + +ARG APP_VERSION +ENV APP_VERSION=${APP_VERSION:-latest} + +# Copy application source into image at build time +# Replace this with a multi-stage build if upstream provides Docker images. +COPY ./app /app/code + +# Copy start script and make it executable +COPY ./start.sh /app/pkg/start.sh +RUN chmod +x /app/pkg/start.sh + +# Cloudron expects all processes to run as cloudron user +USER cloudron +WORKDIR /app/code + +CMD ["/app/pkg/start.sh"] diff --git a/apps/satnogs-kaitai/README.md b/apps/satnogs-kaitai/README.md new file mode 100644 index 0000000..61a2227 --- /dev/null +++ b/apps/satnogs-kaitai/README.md @@ -0,0 +1,20 @@ +# SatNOGS Kaitai on Cloudron + +- **Upstream repository**: https://gitlab.com/librespacefoundation/satnogs/docker-kaitai.git +- **Implementation issue**: https://projects.knownelement.com/issues/218 +- **Status**: Draft scaffolding generated on $(date -u +"%Y-%m-%dT%H:%M:%SZ") + +## Packaging Checklist + +1. Review upstream deployment requirements and map them to Cloudron services (database, cache, object storage, workers). +2. Update `Dockerfile` with the correct build steps and runtime dependencies. +3. Implement `start.sh` to configure the app from Cloudron-provided environment variables and launch the primary process. +4. Edit `CloudronManifest.json` with accurate metadata, permissions, ports, addons, and health checks. +5. Add integration and smoke tests under `test/` to validate the package. +6. Document manual configuration steps, migration requirements, and known gaps in this README. + +## Notes + +- Replace the placeholder long-running process in `start.sh`. +- Populate the `app/` directory with the application build artefacts or git submodules. +- Use the shared packaging container (`docker/packager`) to run `cloudron build` and `cloudron install` so the host remains clean. diff --git a/apps/satnogs-kaitai/app/.gitkeep b/apps/satnogs-kaitai/app/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/apps/satnogs-kaitai/metadata.json b/apps/satnogs-kaitai/metadata.json new file mode 100644 index 0000000..7ed513b --- /dev/null +++ b/apps/satnogs-kaitai/metadata.json @@ -0,0 +1,9 @@ +{ + "slug": "satnogs-kaitai", + "title": "SatNOGS Kaitai", + "issue": "https://projects.knownelement.com/issues/218", + "repo": "https://gitlab.com/librespacefoundation/satnogs/docker-kaitai.git", + "additionalRepos": [], + "created": "2025-10-02T16:46:49Z", + "notes": "TODO: capture packaging notes" +} \ No newline at end of file diff --git a/apps/satnogs-kaitai/start.sh b/apps/satnogs-kaitai/start.sh new file mode 100755 index 0000000..5bae151 --- /dev/null +++ b/apps/satnogs-kaitai/start.sh @@ -0,0 +1,8 @@ +#!/bin/bash +set -euo pipefail + +# Cloudron injects configuration via environment variables and files under /run +# Use this script to render config files and launch the upstream service. + +# TODO: Replace the command below with the correct process supervisor. +exec /bin/sh -c "echo 'Replace start.sh with application startup logic for SatNOGS Kaitai' && sleep infinity" diff --git a/apps/satnogs-kaitai/test/smoke.sh b/apps/satnogs-kaitai/test/smoke.sh new file mode 100755 index 0000000..ebd1134 --- /dev/null +++ b/apps/satnogs-kaitai/test/smoke.sh @@ -0,0 +1,16 @@ +#!/bin/bash +set -euo pipefail + +# Basic container reachability check executed inside the packaging container. +# Replace curl target with an endpoint exposed by the app once the package is functional. +cloudron_app_url=${CLOUDRON_APP_ORIGIN:-"http://localhost"} + +http_code=$(curl -s -o /tmp/smoke.log -w "%{http_code}" "${cloudron_app_url}") + +if [[ "${http_code}" != "200" ]]; then + echo "Unexpected HTTP status: ${http_code}" >&2 + cat /tmp/smoke.log >&2 + exit 1 +fi + +echo "Smoke test passed" diff --git a/apps/satnogs-webgui/CloudronManifest.json b/apps/satnogs-webgui/CloudronManifest.json new file mode 100644 index 0000000..9081a05 --- /dev/null +++ b/apps/satnogs-webgui/CloudronManifest.json @@ -0,0 +1,20 @@ +{ + "manifestVersion": 2, + "id": "com.knel.satnogs.webgui", + "title": "SatNOGS WebGUI", + "author": "Known Element Packaging Team", + "tagline": "TODO: Short one-line pitch", + "description": "TODO: Comprehensive description for the Cloudron App Store entry.", + "changelog": "Initial scaffold", + "website": "https://gitlab.com/librespacefoundation/satnogs/docker-satnogs-webgu", + "supportUrl": "https://projects.knownelement.com/issues/218", + "sourceUrl": "https://gitlab.com/librespacefoundation/satnogs/docker-satnogs-webgui.git", + "version": "0.1.0", + "tags": ["custom", "known-element"], + "healthCheckPath": "/", + "memoryLimit": 536870912, + "httpPort": 3000, + "addons": { + "localstorage": {} + } +} diff --git a/apps/satnogs-webgui/Dockerfile b/apps/satnogs-webgui/Dockerfile new file mode 100644 index 0000000..e3c1677 --- /dev/null +++ b/apps/satnogs-webgui/Dockerfile @@ -0,0 +1,22 @@ +# syntax=docker/dockerfile:1 +FROM cloudron/base:5.0.0 + +LABEL org.opencontainers.image.source="https://gitlab.com/librespacefoundation/satnogs/docker-satnogs-webgui.git" +LABEL org.opencontainers.image.description="Cloudron package for SatNOGS WebGUI" + +ARG APP_VERSION +ENV APP_VERSION=${APP_VERSION:-latest} + +# Copy application source into image at build time +# Replace this with a multi-stage build if upstream provides Docker images. +COPY ./app /app/code + +# Copy start script and make it executable +COPY ./start.sh /app/pkg/start.sh +RUN chmod +x /app/pkg/start.sh + +# Cloudron expects all processes to run as cloudron user +USER cloudron +WORKDIR /app/code + +CMD ["/app/pkg/start.sh"] diff --git a/apps/satnogs-webgui/README.md b/apps/satnogs-webgui/README.md new file mode 100644 index 0000000..74c6243 --- /dev/null +++ b/apps/satnogs-webgui/README.md @@ -0,0 +1,20 @@ +# SatNOGS WebGUI on Cloudron + +- **Upstream repository**: https://gitlab.com/librespacefoundation/satnogs/docker-satnogs-webgui.git +- **Implementation issue**: https://projects.knownelement.com/issues/218 +- **Status**: Draft scaffolding generated on $(date -u +"%Y-%m-%dT%H:%M:%SZ") + +## Packaging Checklist + +1. Review upstream deployment requirements and map them to Cloudron services (database, cache, object storage, workers). +2. Update `Dockerfile` with the correct build steps and runtime dependencies. +3. Implement `start.sh` to configure the app from Cloudron-provided environment variables and launch the primary process. +4. Edit `CloudronManifest.json` with accurate metadata, permissions, ports, addons, and health checks. +5. Add integration and smoke tests under `test/` to validate the package. +6. Document manual configuration steps, migration requirements, and known gaps in this README. + +## Notes + +- Replace the placeholder long-running process in `start.sh`. +- Populate the `app/` directory with the application build artefacts or git submodules. +- Use the shared packaging container (`docker/packager`) to run `cloudron build` and `cloudron install` so the host remains clean. diff --git a/apps/satnogs-webgui/app/.gitkeep b/apps/satnogs-webgui/app/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/apps/satnogs-webgui/metadata.json b/apps/satnogs-webgui/metadata.json new file mode 100644 index 0000000..14b5fc2 --- /dev/null +++ b/apps/satnogs-webgui/metadata.json @@ -0,0 +1,9 @@ +{ + "slug": "satnogs-webgui", + "title": "SatNOGS WebGUI", + "issue": "https://projects.knownelement.com/issues/218", + "repo": "https://gitlab.com/librespacefoundation/satnogs/docker-satnogs-webgui.git", + "additionalRepos": [], + "created": "2025-10-02T16:46:49Z", + "notes": "TODO: capture packaging notes" +} \ No newline at end of file diff --git a/apps/satnogs-webgui/start.sh b/apps/satnogs-webgui/start.sh new file mode 100755 index 0000000..37c15dd --- /dev/null +++ b/apps/satnogs-webgui/start.sh @@ -0,0 +1,8 @@ +#!/bin/bash +set -euo pipefail + +# Cloudron injects configuration via environment variables and files under /run +# Use this script to render config files and launch the upstream service. + +# TODO: Replace the command below with the correct process supervisor. +exec /bin/sh -c "echo 'Replace start.sh with application startup logic for SatNOGS WebGUI' && sleep infinity" diff --git a/apps/satnogs-webgui/test/smoke.sh b/apps/satnogs-webgui/test/smoke.sh new file mode 100755 index 0000000..ebd1134 --- /dev/null +++ b/apps/satnogs-webgui/test/smoke.sh @@ -0,0 +1,16 @@ +#!/bin/bash +set -euo pipefail + +# Basic container reachability check executed inside the packaging container. +# Replace curl target with an endpoint exposed by the app once the package is functional. +cloudron_app_url=${CLOUDRON_APP_ORIGIN:-"http://localhost"} + +http_code=$(curl -s -o /tmp/smoke.log -w "%{http_code}" "${cloudron_app_url}") + +if [[ "${http_code}" != "200" ]]; then + echo "Unexpected HTTP status: ${http_code}" >&2 + cat /tmp/smoke.log >&2 + exit 1 +fi + +echo "Smoke test passed" diff --git a/apps/sdrangel/CloudronManifest.json b/apps/sdrangel/CloudronManifest.json new file mode 100644 index 0000000..05c0ba9 --- /dev/null +++ b/apps/sdrangel/CloudronManifest.json @@ -0,0 +1,20 @@ +{ + "manifestVersion": 2, + "id": "com.knel.sdrangel", + "title": "SDRAngel", + "author": "Known Element Packaging Team", + "tagline": "TODO: Short one-line pitch", + "description": "TODO: Comprehensive description for the Cloudron App Store entry.", + "changelog": "Initial scaffold", + "website": "https://github.com/f4exb/sdrangel-docker", + "supportUrl": "https://projects.knownelement.com/issues/219", + "sourceUrl": "https://github.com/f4exb/sdrangel-docker", + "version": "0.1.0", + "tags": ["custom", "known-element"], + "healthCheckPath": "/", + "memoryLimit": 536870912, + "httpPort": 3000, + "addons": { + "localstorage": {} + } +} diff --git a/apps/sdrangel/Dockerfile b/apps/sdrangel/Dockerfile new file mode 100644 index 0000000..b4454ae --- /dev/null +++ b/apps/sdrangel/Dockerfile @@ -0,0 +1,22 @@ +# syntax=docker/dockerfile:1 +FROM cloudron/base:5.0.0 + +LABEL org.opencontainers.image.source="https://github.com/f4exb/sdrangel-docker" +LABEL org.opencontainers.image.description="Cloudron package for SDRAngel" + +ARG APP_VERSION +ENV APP_VERSION=${APP_VERSION:-latest} + +# Copy application source into image at build time +# Replace this with a multi-stage build if upstream provides Docker images. +COPY ./app /app/code + +# Copy start script and make it executable +COPY ./start.sh /app/pkg/start.sh +RUN chmod +x /app/pkg/start.sh + +# Cloudron expects all processes to run as cloudron user +USER cloudron +WORKDIR /app/code + +CMD ["/app/pkg/start.sh"] diff --git a/apps/sdrangel/README.md b/apps/sdrangel/README.md new file mode 100644 index 0000000..9587182 --- /dev/null +++ b/apps/sdrangel/README.md @@ -0,0 +1,20 @@ +# SDRAngel on Cloudron + +- **Upstream repository**: https://github.com/f4exb/sdrangel-docker +- **Implementation issue**: https://projects.knownelement.com/issues/219 +- **Status**: Draft scaffolding generated on $(date -u +"%Y-%m-%dT%H:%M:%SZ") + +## Packaging Checklist + +1. Review upstream deployment requirements and map them to Cloudron services (database, cache, object storage, workers). +2. Update `Dockerfile` with the correct build steps and runtime dependencies. +3. Implement `start.sh` to configure the app from Cloudron-provided environment variables and launch the primary process. +4. Edit `CloudronManifest.json` with accurate metadata, permissions, ports, addons, and health checks. +5. Add integration and smoke tests under `test/` to validate the package. +6. Document manual configuration steps, migration requirements, and known gaps in this README. + +## Notes + +- Replace the placeholder long-running process in `start.sh`. +- Populate the `app/` directory with the application build artefacts or git submodules. +- Use the shared packaging container (`docker/packager`) to run `cloudron build` and `cloudron install` so the host remains clean. diff --git a/apps/sdrangel/app/.gitkeep b/apps/sdrangel/app/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/apps/sdrangel/metadata.json b/apps/sdrangel/metadata.json new file mode 100644 index 0000000..32104da --- /dev/null +++ b/apps/sdrangel/metadata.json @@ -0,0 +1,9 @@ +{ + "slug": "sdrangel", + "title": "SDRAngel", + "issue": "https://projects.knownelement.com/issues/219", + "repo": "https://github.com/f4exb/sdrangel-docker", + "additionalRepos": [], + "created": "2025-10-02T16:46:49Z", + "notes": "TODO: capture packaging notes" +} \ No newline at end of file diff --git a/apps/sdrangel/start.sh b/apps/sdrangel/start.sh new file mode 100755 index 0000000..e73f3bb --- /dev/null +++ b/apps/sdrangel/start.sh @@ -0,0 +1,8 @@ +#!/bin/bash +set -euo pipefail + +# Cloudron injects configuration via environment variables and files under /run +# Use this script to render config files and launch the upstream service. + +# TODO: Replace the command below with the correct process supervisor. +exec /bin/sh -c "echo 'Replace start.sh with application startup logic for SDRAngel' && sleep infinity" diff --git a/apps/sdrangel/test/smoke.sh b/apps/sdrangel/test/smoke.sh new file mode 100755 index 0000000..ebd1134 --- /dev/null +++ b/apps/sdrangel/test/smoke.sh @@ -0,0 +1,16 @@ +#!/bin/bash +set -euo pipefail + +# Basic container reachability check executed inside the packaging container. +# Replace curl target with an endpoint exposed by the app once the package is functional. +cloudron_app_url=${CLOUDRON_APP_ORIGIN:-"http://localhost"} + +http_code=$(curl -s -o /tmp/smoke.log -w "%{http_code}" "${cloudron_app_url}") + +if [[ "${http_code}" != "200" ]]; then + echo "Unexpected HTTP status: ${http_code}" >&2 + cat /tmp/smoke.log >&2 + exit 1 +fi + +echo "Smoke test passed" diff --git a/apps/seatunnel/CloudronManifest.json b/apps/seatunnel/CloudronManifest.json new file mode 100644 index 0000000..65a388c --- /dev/null +++ b/apps/seatunnel/CloudronManifest.json @@ -0,0 +1,20 @@ +{ + "manifestVersion": 2, + "id": "com.knel.seatunnel", + "title": "SeaTunnel", + "author": "Known Element Packaging Team", + "tagline": "TODO: Short one-line pitch", + "description": "TODO: Comprehensive description for the Cloudron App Store entry.", + "changelog": "Initial scaffold", + "website": "https://github.com/apache/seatunnel", + "supportUrl": "https://projects.knownelement.com/issues/301", + "sourceUrl": "https://github.com/apache/seatunnel", + "version": "0.1.0", + "tags": ["custom", "known-element"], + "healthCheckPath": "/", + "memoryLimit": 536870912, + "httpPort": 3000, + "addons": { + "localstorage": {} + } +} diff --git a/apps/seatunnel/Dockerfile b/apps/seatunnel/Dockerfile new file mode 100644 index 0000000..b0b1495 --- /dev/null +++ b/apps/seatunnel/Dockerfile @@ -0,0 +1,22 @@ +# syntax=docker/dockerfile:1 +FROM cloudron/base:5.0.0 + +LABEL org.opencontainers.image.source="https://github.com/apache/seatunnel" +LABEL org.opencontainers.image.description="Cloudron package for SeaTunnel" + +ARG APP_VERSION +ENV APP_VERSION=${APP_VERSION:-latest} + +# Copy application source into image at build time +# Replace this with a multi-stage build if upstream provides Docker images. +COPY ./app /app/code + +# Copy start script and make it executable +COPY ./start.sh /app/pkg/start.sh +RUN chmod +x /app/pkg/start.sh + +# Cloudron expects all processes to run as cloudron user +USER cloudron +WORKDIR /app/code + +CMD ["/app/pkg/start.sh"] diff --git a/apps/seatunnel/README.md b/apps/seatunnel/README.md new file mode 100644 index 0000000..ddb836b --- /dev/null +++ b/apps/seatunnel/README.md @@ -0,0 +1,20 @@ +# SeaTunnel on Cloudron + +- **Upstream repository**: https://github.com/apache/seatunnel +- **Implementation issue**: https://projects.knownelement.com/issues/301 +- **Status**: Draft scaffolding generated on $(date -u +"%Y-%m-%dT%H:%M:%SZ") + +## Packaging Checklist + +1. Review upstream deployment requirements and map them to Cloudron services (database, cache, object storage, workers). +2. Update `Dockerfile` with the correct build steps and runtime dependencies. +3. Implement `start.sh` to configure the app from Cloudron-provided environment variables and launch the primary process. +4. Edit `CloudronManifest.json` with accurate metadata, permissions, ports, addons, and health checks. +5. Add integration and smoke tests under `test/` to validate the package. +6. Document manual configuration steps, migration requirements, and known gaps in this README. + +## Notes + +- Replace the placeholder long-running process in `start.sh`. +- Populate the `app/` directory with the application build artefacts or git submodules. +- Use the shared packaging container (`docker/packager`) to run `cloudron build` and `cloudron install` so the host remains clean. diff --git a/apps/seatunnel/app/.gitkeep b/apps/seatunnel/app/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/apps/seatunnel/metadata.json b/apps/seatunnel/metadata.json new file mode 100644 index 0000000..b443e55 --- /dev/null +++ b/apps/seatunnel/metadata.json @@ -0,0 +1,9 @@ +{ + "slug": "seatunnel", + "title": "SeaTunnel", + "issue": "https://projects.knownelement.com/issues/301", + "repo": "https://github.com/apache/seatunnel", + "additionalRepos": [], + "created": "2025-10-02T16:46:49Z", + "notes": "TODO: capture packaging notes" +} \ No newline at end of file diff --git a/apps/seatunnel/start.sh b/apps/seatunnel/start.sh new file mode 100755 index 0000000..7182f69 --- /dev/null +++ b/apps/seatunnel/start.sh @@ -0,0 +1,8 @@ +#!/bin/bash +set -euo pipefail + +# Cloudron injects configuration via environment variables and files under /run +# Use this script to render config files and launch the upstream service. + +# TODO: Replace the command below with the correct process supervisor. +exec /bin/sh -c "echo 'Replace start.sh with application startup logic for SeaTunnel' && sleep infinity" diff --git a/apps/seatunnel/test/smoke.sh b/apps/seatunnel/test/smoke.sh new file mode 100755 index 0000000..ebd1134 --- /dev/null +++ b/apps/seatunnel/test/smoke.sh @@ -0,0 +1,16 @@ +#!/bin/bash +set -euo pipefail + +# Basic container reachability check executed inside the packaging container. +# Replace curl target with an endpoint exposed by the app once the package is functional. +cloudron_app_url=${CLOUDRON_APP_ORIGIN:-"http://localhost"} + +http_code=$(curl -s -o /tmp/smoke.log -w "%{http_code}" "${cloudron_app_url}") + +if [[ "${http_code}" != "200" ]]; then + echo "Unexpected HTTP status: ${http_code}" >&2 + cat /tmp/smoke.log >&2 + exit 1 +fi + +echo "Smoke test passed" diff --git a/apps/signoz/CloudronManifest.json b/apps/signoz/CloudronManifest.json new file mode 100644 index 0000000..803f5b4 --- /dev/null +++ b/apps/signoz/CloudronManifest.json @@ -0,0 +1,20 @@ +{ + "manifestVersion": 2, + "id": "com.knel.signoz", + "title": "SigNoz", + "author": "Known Element Packaging Team", + "tagline": "TODO: Short one-line pitch", + "description": "TODO: Comprehensive description for the Cloudron App Store entry.", + "changelog": "Initial scaffold", + "website": "https://github.com/SigNoz/signoz", + "supportUrl": "https://projects.knownelement.com/issues/221", + "sourceUrl": "https://github.com/SigNoz/signoz.git", + "version": "0.1.0", + "tags": ["custom", "known-element"], + "healthCheckPath": "/", + "memoryLimit": 536870912, + "httpPort": 3000, + "addons": { + "localstorage": {} + } +} diff --git a/apps/signoz/Dockerfile b/apps/signoz/Dockerfile new file mode 100644 index 0000000..fd79eaf --- /dev/null +++ b/apps/signoz/Dockerfile @@ -0,0 +1,22 @@ +# syntax=docker/dockerfile:1 +FROM cloudron/base:5.0.0 + +LABEL org.opencontainers.image.source="https://github.com/SigNoz/signoz.git" +LABEL org.opencontainers.image.description="Cloudron package for SigNoz" + +ARG APP_VERSION +ENV APP_VERSION=${APP_VERSION:-latest} + +# Copy application source into image at build time +# Replace this with a multi-stage build if upstream provides Docker images. +COPY ./app /app/code + +# Copy start script and make it executable +COPY ./start.sh /app/pkg/start.sh +RUN chmod +x /app/pkg/start.sh + +# Cloudron expects all processes to run as cloudron user +USER cloudron +WORKDIR /app/code + +CMD ["/app/pkg/start.sh"] diff --git a/apps/signoz/README.md b/apps/signoz/README.md new file mode 100644 index 0000000..704b780 --- /dev/null +++ b/apps/signoz/README.md @@ -0,0 +1,20 @@ +# SigNoz on Cloudron + +- **Upstream repository**: https://github.com/SigNoz/signoz.git +- **Implementation issue**: https://projects.knownelement.com/issues/221 +- **Status**: Draft scaffolding generated on $(date -u +"%Y-%m-%dT%H:%M:%SZ") + +## Packaging Checklist + +1. Review upstream deployment requirements and map them to Cloudron services (database, cache, object storage, workers). +2. Update `Dockerfile` with the correct build steps and runtime dependencies. +3. Implement `start.sh` to configure the app from Cloudron-provided environment variables and launch the primary process. +4. Edit `CloudronManifest.json` with accurate metadata, permissions, ports, addons, and health checks. +5. Add integration and smoke tests under `test/` to validate the package. +6. Document manual configuration steps, migration requirements, and known gaps in this README. + +## Notes + +- Replace the placeholder long-running process in `start.sh`. +- Populate the `app/` directory with the application build artefacts or git submodules. +- Use the shared packaging container (`docker/packager`) to run `cloudron build` and `cloudron install` so the host remains clean. diff --git a/apps/signoz/app/.gitkeep b/apps/signoz/app/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/apps/signoz/metadata.json b/apps/signoz/metadata.json new file mode 100644 index 0000000..a2a977d --- /dev/null +++ b/apps/signoz/metadata.json @@ -0,0 +1,9 @@ +{ + "slug": "signoz", + "title": "SigNoz", + "issue": "https://projects.knownelement.com/issues/221", + "repo": "https://github.com/SigNoz/signoz.git", + "additionalRepos": [], + "created": "2025-10-02T16:46:49Z", + "notes": "TODO: capture packaging notes" +} \ No newline at end of file diff --git a/apps/signoz/start.sh b/apps/signoz/start.sh new file mode 100755 index 0000000..3e7249b --- /dev/null +++ b/apps/signoz/start.sh @@ -0,0 +1,8 @@ +#!/bin/bash +set -euo pipefail + +# Cloudron injects configuration via environment variables and files under /run +# Use this script to render config files and launch the upstream service. + +# TODO: Replace the command below with the correct process supervisor. +exec /bin/sh -c "echo 'Replace start.sh with application startup logic for SigNoz' && sleep infinity" diff --git a/apps/signoz/test/smoke.sh b/apps/signoz/test/smoke.sh new file mode 100755 index 0000000..ebd1134 --- /dev/null +++ b/apps/signoz/test/smoke.sh @@ -0,0 +1,16 @@ +#!/bin/bash +set -euo pipefail + +# Basic container reachability check executed inside the packaging container. +# Replace curl target with an endpoint exposed by the app once the package is functional. +cloudron_app_url=${CLOUDRON_APP_ORIGIN:-"http://localhost"} + +http_code=$(curl -s -o /tmp/smoke.log -w "%{http_code}" "${cloudron_app_url}") + +if [[ "${http_code}" != "200" ]]; then + echo "Unexpected HTTP status: ${http_code}" >&2 + cat /tmp/smoke.log >&2 + exit 1 +fi + +echo "Smoke test passed" diff --git a/apps/slurm/CloudronManifest.json b/apps/slurm/CloudronManifest.json new file mode 100644 index 0000000..e37ddd4 --- /dev/null +++ b/apps/slurm/CloudronManifest.json @@ -0,0 +1,20 @@ +{ + "manifestVersion": 2, + "id": "com.knel.slurm", + "title": "Slurm", + "author": "Known Element Packaging Team", + "tagline": "TODO: Short one-line pitch", + "description": "TODO: Comprehensive description for the Cloudron App Store entry.", + "changelog": "Initial scaffold", + "website": "https://github.com/SchedMD/slurm", + "supportUrl": "https://projects.knownelement.com/issues/222", + "sourceUrl": "https://github.com/SchedMD/slurm.git", + "version": "0.1.0", + "tags": ["custom", "known-element"], + "healthCheckPath": "/", + "memoryLimit": 536870912, + "httpPort": 3000, + "addons": { + "localstorage": {} + } +} diff --git a/apps/slurm/Dockerfile b/apps/slurm/Dockerfile new file mode 100644 index 0000000..98a2df8 --- /dev/null +++ b/apps/slurm/Dockerfile @@ -0,0 +1,22 @@ +# syntax=docker/dockerfile:1 +FROM cloudron/base:5.0.0 + +LABEL org.opencontainers.image.source="https://github.com/SchedMD/slurm.git" +LABEL org.opencontainers.image.description="Cloudron package for Slurm" + +ARG APP_VERSION +ENV APP_VERSION=${APP_VERSION:-latest} + +# Copy application source into image at build time +# Replace this with a multi-stage build if upstream provides Docker images. +COPY ./app /app/code + +# Copy start script and make it executable +COPY ./start.sh /app/pkg/start.sh +RUN chmod +x /app/pkg/start.sh + +# Cloudron expects all processes to run as cloudron user +USER cloudron +WORKDIR /app/code + +CMD ["/app/pkg/start.sh"] diff --git a/apps/slurm/README.md b/apps/slurm/README.md new file mode 100644 index 0000000..1183c27 --- /dev/null +++ b/apps/slurm/README.md @@ -0,0 +1,20 @@ +# Slurm on Cloudron + +- **Upstream repository**: https://github.com/SchedMD/slurm.git +- **Implementation issue**: https://projects.knownelement.com/issues/222 +- **Status**: Draft scaffolding generated on $(date -u +"%Y-%m-%dT%H:%M:%SZ") + +## Packaging Checklist + +1. Review upstream deployment requirements and map them to Cloudron services (database, cache, object storage, workers). +2. Update `Dockerfile` with the correct build steps and runtime dependencies. +3. Implement `start.sh` to configure the app from Cloudron-provided environment variables and launch the primary process. +4. Edit `CloudronManifest.json` with accurate metadata, permissions, ports, addons, and health checks. +5. Add integration and smoke tests under `test/` to validate the package. +6. Document manual configuration steps, migration requirements, and known gaps in this README. + +## Notes + +- Replace the placeholder long-running process in `start.sh`. +- Populate the `app/` directory with the application build artefacts or git submodules. +- Use the shared packaging container (`docker/packager`) to run `cloudron build` and `cloudron install` so the host remains clean. diff --git a/apps/slurm/app/.gitkeep b/apps/slurm/app/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/apps/slurm/metadata.json b/apps/slurm/metadata.json new file mode 100644 index 0000000..549e778 --- /dev/null +++ b/apps/slurm/metadata.json @@ -0,0 +1,11 @@ +{ + "slug": "slurm", + "title": "Slurm", + "issue": "https://projects.knownelement.com/issues/222", + "repo": "https://github.com/SchedMD/slurm.git", + "additionalRepos": [ + "https://github.com/giovtorres/slurm-docker-cluster.git" + ], + "created": "2025-10-02T16:46:49Z", + "notes": "TODO: capture packaging notes" +} \ No newline at end of file diff --git a/apps/slurm/start.sh b/apps/slurm/start.sh new file mode 100755 index 0000000..5e4691c --- /dev/null +++ b/apps/slurm/start.sh @@ -0,0 +1,8 @@ +#!/bin/bash +set -euo pipefail + +# Cloudron injects configuration via environment variables and files under /run +# Use this script to render config files and launch the upstream service. + +# TODO: Replace the command below with the correct process supervisor. +exec /bin/sh -c "echo 'Replace start.sh with application startup logic for Slurm' && sleep infinity" diff --git a/apps/slurm/test/smoke.sh b/apps/slurm/test/smoke.sh new file mode 100755 index 0000000..ebd1134 --- /dev/null +++ b/apps/slurm/test/smoke.sh @@ -0,0 +1,16 @@ +#!/bin/bash +set -euo pipefail + +# Basic container reachability check executed inside the packaging container. +# Replace curl target with an endpoint exposed by the app once the package is functional. +cloudron_app_url=${CLOUDRON_APP_ORIGIN:-"http://localhost"} + +http_code=$(curl -s -o /tmp/smoke.log -w "%{http_code}" "${cloudron_app_url}") + +if [[ "${http_code}" != "200" ]]; then + echo "Unexpected HTTP status: ${http_code}" >&2 + cat /tmp/smoke.log >&2 + exit 1 +fi + +echo "Smoke test passed" diff --git a/apps/sniperphish/CloudronManifest.json b/apps/sniperphish/CloudronManifest.json new file mode 100644 index 0000000..396b6aa --- /dev/null +++ b/apps/sniperphish/CloudronManifest.json @@ -0,0 +1,20 @@ +{ + "manifestVersion": 2, + "id": "com.knel.sniperphish", + "title": "SniperPhish", + "author": "Known Element Packaging Team", + "tagline": "TODO: Short one-line pitch", + "description": "TODO: Comprehensive description for the Cloudron App Store entry.", + "changelog": "Initial scaffold", + "website": "https://github.com/GemGeorge/SniperPhish-Docker", + "supportUrl": "https://projects.knownelement.com/issues/211", + "sourceUrl": "https://github.com/GemGeorge/SniperPhish-Docker.git", + "version": "0.1.0", + "tags": ["custom", "known-element"], + "healthCheckPath": "/", + "memoryLimit": 536870912, + "httpPort": 3000, + "addons": { + "localstorage": {} + } +} diff --git a/apps/sniperphish/Dockerfile b/apps/sniperphish/Dockerfile new file mode 100644 index 0000000..436fdaf --- /dev/null +++ b/apps/sniperphish/Dockerfile @@ -0,0 +1,22 @@ +# syntax=docker/dockerfile:1 +FROM cloudron/base:5.0.0 + +LABEL org.opencontainers.image.source="https://github.com/GemGeorge/SniperPhish-Docker.git" +LABEL org.opencontainers.image.description="Cloudron package for SniperPhish" + +ARG APP_VERSION +ENV APP_VERSION=${APP_VERSION:-latest} + +# Copy application source into image at build time +# Replace this with a multi-stage build if upstream provides Docker images. +COPY ./app /app/code + +# Copy start script and make it executable +COPY ./start.sh /app/pkg/start.sh +RUN chmod +x /app/pkg/start.sh + +# Cloudron expects all processes to run as cloudron user +USER cloudron +WORKDIR /app/code + +CMD ["/app/pkg/start.sh"] diff --git a/apps/sniperphish/README.md b/apps/sniperphish/README.md new file mode 100644 index 0000000..f351b75 --- /dev/null +++ b/apps/sniperphish/README.md @@ -0,0 +1,20 @@ +# SniperPhish on Cloudron + +- **Upstream repository**: https://github.com/GemGeorge/SniperPhish-Docker.git +- **Implementation issue**: https://projects.knownelement.com/issues/211 +- **Status**: Draft scaffolding generated on $(date -u +"%Y-%m-%dT%H:%M:%SZ") + +## Packaging Checklist + +1. Review upstream deployment requirements and map them to Cloudron services (database, cache, object storage, workers). +2. Update `Dockerfile` with the correct build steps and runtime dependencies. +3. Implement `start.sh` to configure the app from Cloudron-provided environment variables and launch the primary process. +4. Edit `CloudronManifest.json` with accurate metadata, permissions, ports, addons, and health checks. +5. Add integration and smoke tests under `test/` to validate the package. +6. Document manual configuration steps, migration requirements, and known gaps in this README. + +## Notes + +- Replace the placeholder long-running process in `start.sh`. +- Populate the `app/` directory with the application build artefacts or git submodules. +- Use the shared packaging container (`docker/packager`) to run `cloudron build` and `cloudron install` so the host remains clean. diff --git a/apps/sniperphish/app/.gitkeep b/apps/sniperphish/app/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/apps/sniperphish/metadata.json b/apps/sniperphish/metadata.json new file mode 100644 index 0000000..6144939 --- /dev/null +++ b/apps/sniperphish/metadata.json @@ -0,0 +1,9 @@ +{ + "slug": "sniperphish", + "title": "SniperPhish", + "issue": "https://projects.knownelement.com/issues/211", + "repo": "https://github.com/GemGeorge/SniperPhish-Docker.git", + "additionalRepos": [], + "created": "2025-10-02T16:46:49Z", + "notes": "TODO: capture packaging notes" +} \ No newline at end of file diff --git a/apps/sniperphish/start.sh b/apps/sniperphish/start.sh new file mode 100755 index 0000000..4dbd474 --- /dev/null +++ b/apps/sniperphish/start.sh @@ -0,0 +1,8 @@ +#!/bin/bash +set -euo pipefail + +# Cloudron injects configuration via environment variables and files under /run +# Use this script to render config files and launch the upstream service. + +# TODO: Replace the command below with the correct process supervisor. +exec /bin/sh -c "echo 'Replace start.sh with application startup logic for SniperPhish' && sleep infinity" diff --git a/apps/sniperphish/test/smoke.sh b/apps/sniperphish/test/smoke.sh new file mode 100755 index 0000000..ebd1134 --- /dev/null +++ b/apps/sniperphish/test/smoke.sh @@ -0,0 +1,16 @@ +#!/bin/bash +set -euo pipefail + +# Basic container reachability check executed inside the packaging container. +# Replace curl target with an endpoint exposed by the app once the package is functional. +cloudron_app_url=${CLOUDRON_APP_ORIGIN:-"http://localhost"} + +http_code=$(curl -s -o /tmp/smoke.log -w "%{http_code}" "${cloudron_app_url}") + +if [[ "${http_code}" != "200" ]]; then + echo "Unexpected HTTP status: ${http_code}" >&2 + cat /tmp/smoke.log >&2 + exit 1 +fi + +echo "Smoke test passed" diff --git a/apps/swupdate/CloudronManifest.json b/apps/swupdate/CloudronManifest.json new file mode 100644 index 0000000..a535cbe --- /dev/null +++ b/apps/swupdate/CloudronManifest.json @@ -0,0 +1,20 @@ +{ + "manifestVersion": 2, + "id": "com.knel.swupdate", + "title": "swupdate", + "author": "Known Element Packaging Team", + "tagline": "TODO: Short one-line pitch", + "description": "TODO: Comprehensive description for the Cloudron App Store entry.", + "changelog": "Initial scaffold", + "website": "https://github.com/sbabic/swupdate", + "supportUrl": "https://projects.knownelement.com/issues/326", + "sourceUrl": "https://github.com/sbabic/swupdate.git", + "version": "0.1.0", + "tags": ["custom", "known-element"], + "healthCheckPath": "/", + "memoryLimit": 536870912, + "httpPort": 3000, + "addons": { + "localstorage": {} + } +} diff --git a/apps/swupdate/Dockerfile b/apps/swupdate/Dockerfile new file mode 100644 index 0000000..9b7e620 --- /dev/null +++ b/apps/swupdate/Dockerfile @@ -0,0 +1,22 @@ +# syntax=docker/dockerfile:1 +FROM cloudron/base:5.0.0 + +LABEL org.opencontainers.image.source="https://github.com/sbabic/swupdate.git" +LABEL org.opencontainers.image.description="Cloudron package for swupdate" + +ARG APP_VERSION +ENV APP_VERSION=${APP_VERSION:-latest} + +# Copy application source into image at build time +# Replace this with a multi-stage build if upstream provides Docker images. +COPY ./app /app/code + +# Copy start script and make it executable +COPY ./start.sh /app/pkg/start.sh +RUN chmod +x /app/pkg/start.sh + +# Cloudron expects all processes to run as cloudron user +USER cloudron +WORKDIR /app/code + +CMD ["/app/pkg/start.sh"] diff --git a/apps/swupdate/README.md b/apps/swupdate/README.md new file mode 100644 index 0000000..a3e984e --- /dev/null +++ b/apps/swupdate/README.md @@ -0,0 +1,20 @@ +# swupdate on Cloudron + +- **Upstream repository**: https://github.com/sbabic/swupdate.git +- **Implementation issue**: https://projects.knownelement.com/issues/326 +- **Status**: Draft scaffolding generated on $(date -u +"%Y-%m-%dT%H:%M:%SZ") + +## Packaging Checklist + +1. Review upstream deployment requirements and map them to Cloudron services (database, cache, object storage, workers). +2. Update `Dockerfile` with the correct build steps and runtime dependencies. +3. Implement `start.sh` to configure the app from Cloudron-provided environment variables and launch the primary process. +4. Edit `CloudronManifest.json` with accurate metadata, permissions, ports, addons, and health checks. +5. Add integration and smoke tests under `test/` to validate the package. +6. Document manual configuration steps, migration requirements, and known gaps in this README. + +## Notes + +- Replace the placeholder long-running process in `start.sh`. +- Populate the `app/` directory with the application build artefacts or git submodules. +- Use the shared packaging container (`docker/packager`) to run `cloudron build` and `cloudron install` so the host remains clean. diff --git a/apps/swupdate/app/.gitkeep b/apps/swupdate/app/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/apps/swupdate/metadata.json b/apps/swupdate/metadata.json new file mode 100644 index 0000000..15d5e8b --- /dev/null +++ b/apps/swupdate/metadata.json @@ -0,0 +1,9 @@ +{ + "slug": "swupdate", + "title": "swupdate", + "issue": "https://projects.knownelement.com/issues/326", + "repo": "https://github.com/sbabic/swupdate.git", + "additionalRepos": [], + "created": "2025-10-02T16:46:50Z", + "notes": "TODO: capture packaging notes" +} \ No newline at end of file diff --git a/apps/swupdate/start.sh b/apps/swupdate/start.sh new file mode 100755 index 0000000..8b7dffc --- /dev/null +++ b/apps/swupdate/start.sh @@ -0,0 +1,8 @@ +#!/bin/bash +set -euo pipefail + +# Cloudron injects configuration via environment variables and files under /run +# Use this script to render config files and launch the upstream service. + +# TODO: Replace the command below with the correct process supervisor. +exec /bin/sh -c "echo 'Replace start.sh with application startup logic for swupdate' && sleep infinity" diff --git a/apps/swupdate/test/smoke.sh b/apps/swupdate/test/smoke.sh new file mode 100755 index 0000000..ebd1134 --- /dev/null +++ b/apps/swupdate/test/smoke.sh @@ -0,0 +1,16 @@ +#!/bin/bash +set -euo pipefail + +# Basic container reachability check executed inside the packaging container. +# Replace curl target with an endpoint exposed by the app once the package is functional. +cloudron_app_url=${CLOUDRON_APP_ORIGIN:-"http://localhost"} + +http_code=$(curl -s -o /tmp/smoke.log -w "%{http_code}" "${cloudron_app_url}") + +if [[ "${http_code}" != "200" ]]; then + echo "Unexpected HTTP status: ${http_code}" >&2 + cat /tmp/smoke.log >&2 + exit 1 +fi + +echo "Smoke test passed" diff --git a/apps/tak-server/CloudronManifest.json b/apps/tak-server/CloudronManifest.json new file mode 100644 index 0000000..25fa12a --- /dev/null +++ b/apps/tak-server/CloudronManifest.json @@ -0,0 +1,20 @@ +{ + "manifestVersion": 2, + "id": "com.knel.tak.server", + "title": "TAK Server", + "author": "Known Element Packaging Team", + "tagline": "TODO: Short one-line pitch", + "description": "TODO: Comprehensive description for the Cloudron App Store entry.", + "changelog": "Initial scaffold", + "website": "https://github.com/Cloud-RF/tak-server", + "supportUrl": "https://projects.knownelement.com/issues/180", + "sourceUrl": "https://github.com/Cloud-RF/tak-server", + "version": "0.1.0", + "tags": ["custom", "known-element"], + "healthCheckPath": "/", + "memoryLimit": 536870912, + "httpPort": 3000, + "addons": { + "localstorage": {} + } +} diff --git a/apps/tak-server/Dockerfile b/apps/tak-server/Dockerfile new file mode 100644 index 0000000..53a1b56 --- /dev/null +++ b/apps/tak-server/Dockerfile @@ -0,0 +1,22 @@ +# syntax=docker/dockerfile:1 +FROM cloudron/base:5.0.0 + +LABEL org.opencontainers.image.source="https://github.com/Cloud-RF/tak-server" +LABEL org.opencontainers.image.description="Cloudron package for TAK Server" + +ARG APP_VERSION +ENV APP_VERSION=${APP_VERSION:-latest} + +# Copy application source into image at build time +# Replace this with a multi-stage build if upstream provides Docker images. +COPY ./app /app/code + +# Copy start script and make it executable +COPY ./start.sh /app/pkg/start.sh +RUN chmod +x /app/pkg/start.sh + +# Cloudron expects all processes to run as cloudron user +USER cloudron +WORKDIR /app/code + +CMD ["/app/pkg/start.sh"] diff --git a/apps/tak-server/README.md b/apps/tak-server/README.md new file mode 100644 index 0000000..a4ffb17 --- /dev/null +++ b/apps/tak-server/README.md @@ -0,0 +1,20 @@ +# TAK Server on Cloudron + +- **Upstream repository**: https://github.com/Cloud-RF/tak-server +- **Implementation issue**: https://projects.knownelement.com/issues/180 +- **Status**: Draft scaffolding generated on $(date -u +"%Y-%m-%dT%H:%M:%SZ") + +## Packaging Checklist + +1. Review upstream deployment requirements and map them to Cloudron services (database, cache, object storage, workers). +2. Update `Dockerfile` with the correct build steps and runtime dependencies. +3. Implement `start.sh` to configure the app from Cloudron-provided environment variables and launch the primary process. +4. Edit `CloudronManifest.json` with accurate metadata, permissions, ports, addons, and health checks. +5. Add integration and smoke tests under `test/` to validate the package. +6. Document manual configuration steps, migration requirements, and known gaps in this README. + +## Notes + +- Replace the placeholder long-running process in `start.sh`. +- Populate the `app/` directory with the application build artefacts or git submodules. +- Use the shared packaging container (`docker/packager`) to run `cloudron build` and `cloudron install` so the host remains clean. diff --git a/apps/tak-server/app/.gitkeep b/apps/tak-server/app/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/apps/tak-server/metadata.json b/apps/tak-server/metadata.json new file mode 100644 index 0000000..eab8fc1 --- /dev/null +++ b/apps/tak-server/metadata.json @@ -0,0 +1,9 @@ +{ + "slug": "tak-server", + "title": "TAK Server", + "issue": "https://projects.knownelement.com/issues/180", + "repo": "https://github.com/Cloud-RF/tak-server", + "additionalRepos": [], + "created": "2025-10-02T16:46:49Z", + "notes": "TODO: capture packaging notes" +} \ No newline at end of file diff --git a/apps/tak-server/start.sh b/apps/tak-server/start.sh new file mode 100755 index 0000000..4e78626 --- /dev/null +++ b/apps/tak-server/start.sh @@ -0,0 +1,8 @@ +#!/bin/bash +set -euo pipefail + +# Cloudron injects configuration via environment variables and files under /run +# Use this script to render config files and launch the upstream service. + +# TODO: Replace the command below with the correct process supervisor. +exec /bin/sh -c "echo 'Replace start.sh with application startup logic for TAK Server' && sleep infinity" diff --git a/apps/tak-server/test/smoke.sh b/apps/tak-server/test/smoke.sh new file mode 100755 index 0000000..ebd1134 --- /dev/null +++ b/apps/tak-server/test/smoke.sh @@ -0,0 +1,16 @@ +#!/bin/bash +set -euo pipefail + +# Basic container reachability check executed inside the packaging container. +# Replace curl target with an endpoint exposed by the app once the package is functional. +cloudron_app_url=${CLOUDRON_APP_ORIGIN:-"http://localhost"} + +http_code=$(curl -s -o /tmp/smoke.log -w "%{http_code}" "${cloudron_app_url}") + +if [[ "${http_code}" != "200" ]]; then + echo "Unexpected HTTP status: ${http_code}" >&2 + cat /tmp/smoke.log >&2 + exit 1 +fi + +echo "Smoke test passed" diff --git a/apps/target-goalert/CloudronManifest.json b/apps/target-goalert/CloudronManifest.json new file mode 100644 index 0000000..e264963 --- /dev/null +++ b/apps/target-goalert/CloudronManifest.json @@ -0,0 +1,20 @@ +{ + "manifestVersion": 2, + "id": "com.knel.target.goalert", + "title": "GoAlert", + "author": "Known Element Packaging Team", + "tagline": "TODO: Short one-line pitch", + "description": "TODO: Comprehensive description for the Cloudron App Store entry.", + "changelog": "Initial scaffold", + "website": "https://github.com/target/goaler", + "supportUrl": "https://projects.knownelement.com/issues/204", + "sourceUrl": "https://github.com/target/goalert.git", + "version": "0.1.0", + "tags": ["custom", "known-element"], + "healthCheckPath": "/", + "memoryLimit": 536870912, + "httpPort": 3000, + "addons": { + "localstorage": {} + } +} diff --git a/apps/target-goalert/Dockerfile b/apps/target-goalert/Dockerfile new file mode 100644 index 0000000..bdcf1f7 --- /dev/null +++ b/apps/target-goalert/Dockerfile @@ -0,0 +1,22 @@ +# syntax=docker/dockerfile:1 +FROM cloudron/base:5.0.0 + +LABEL org.opencontainers.image.source="https://github.com/target/goalert.git" +LABEL org.opencontainers.image.description="Cloudron package for GoAlert" + +ARG APP_VERSION +ENV APP_VERSION=${APP_VERSION:-latest} + +# Copy application source into image at build time +# Replace this with a multi-stage build if upstream provides Docker images. +COPY ./app /app/code + +# Copy start script and make it executable +COPY ./start.sh /app/pkg/start.sh +RUN chmod +x /app/pkg/start.sh + +# Cloudron expects all processes to run as cloudron user +USER cloudron +WORKDIR /app/code + +CMD ["/app/pkg/start.sh"] diff --git a/apps/target-goalert/README.md b/apps/target-goalert/README.md new file mode 100644 index 0000000..b2076f2 --- /dev/null +++ b/apps/target-goalert/README.md @@ -0,0 +1,20 @@ +# GoAlert on Cloudron + +- **Upstream repository**: https://github.com/target/goalert.git +- **Implementation issue**: https://projects.knownelement.com/issues/204 +- **Status**: Draft scaffolding generated on $(date -u +"%Y-%m-%dT%H:%M:%SZ") + +## Packaging Checklist + +1. Review upstream deployment requirements and map them to Cloudron services (database, cache, object storage, workers). +2. Update `Dockerfile` with the correct build steps and runtime dependencies. +3. Implement `start.sh` to configure the app from Cloudron-provided environment variables and launch the primary process. +4. Edit `CloudronManifest.json` with accurate metadata, permissions, ports, addons, and health checks. +5. Add integration and smoke tests under `test/` to validate the package. +6. Document manual configuration steps, migration requirements, and known gaps in this README. + +## Notes + +- Replace the placeholder long-running process in `start.sh`. +- Populate the `app/` directory with the application build artefacts or git submodules. +- Use the shared packaging container (`docker/packager`) to run `cloudron build` and `cloudron install` so the host remains clean. diff --git a/apps/target-goalert/app/.gitkeep b/apps/target-goalert/app/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/apps/target-goalert/metadata.json b/apps/target-goalert/metadata.json new file mode 100644 index 0000000..ac002c4 --- /dev/null +++ b/apps/target-goalert/metadata.json @@ -0,0 +1,9 @@ +{ + "slug": "target-goalert", + "title": "GoAlert", + "issue": "https://projects.knownelement.com/issues/204", + "repo": "https://github.com/target/goalert.git", + "additionalRepos": [], + "created": "2025-10-02T16:46:49Z", + "notes": "TODO: capture packaging notes" +} \ No newline at end of file diff --git a/apps/target-goalert/start.sh b/apps/target-goalert/start.sh new file mode 100755 index 0000000..20611ee --- /dev/null +++ b/apps/target-goalert/start.sh @@ -0,0 +1,8 @@ +#!/bin/bash +set -euo pipefail + +# Cloudron injects configuration via environment variables and files under /run +# Use this script to render config files and launch the upstream service. + +# TODO: Replace the command below with the correct process supervisor. +exec /bin/sh -c "echo 'Replace start.sh with application startup logic for GoAlert' && sleep infinity" diff --git a/apps/target-goalert/test/smoke.sh b/apps/target-goalert/test/smoke.sh new file mode 100755 index 0000000..ebd1134 --- /dev/null +++ b/apps/target-goalert/test/smoke.sh @@ -0,0 +1,16 @@ +#!/bin/bash +set -euo pipefail + +# Basic container reachability check executed inside the packaging container. +# Replace curl target with an endpoint exposed by the app once the package is functional. +cloudron_app_url=${CLOUDRON_APP_ORIGIN:-"http://localhost"} + +http_code=$(curl -s -o /tmp/smoke.log -w "%{http_code}" "${cloudron_app_url}") + +if [[ "${http_code}" != "200" ]]; then + echo "Unexpected HTTP status: ${http_code}" >&2 + cat /tmp/smoke.log >&2 + exit 1 +fi + +echo "Smoke test passed" diff --git a/apps/warp/CloudronManifest.json b/apps/warp/CloudronManifest.json new file mode 100644 index 0000000..fa06489 --- /dev/null +++ b/apps/warp/CloudronManifest.json @@ -0,0 +1,20 @@ +{ + "manifestVersion": 2, + "id": "com.knel.warp", + "title": "Warp", + "author": "Known Element Packaging Team", + "tagline": "TODO: Short one-line pitch", + "description": "TODO: Comprehensive description for the Cloudron App Store entry.", + "changelog": "Initial scaffold", + "website": "https://github.com/sebo-b/warp", + "supportUrl": "https://projects.knownelement.com/issues/228", + "sourceUrl": "https://github.com/sebo-b/warp.git", + "version": "0.1.0", + "tags": ["custom", "known-element"], + "healthCheckPath": "/", + "memoryLimit": 536870912, + "httpPort": 3000, + "addons": { + "localstorage": {} + } +} diff --git a/apps/warp/Dockerfile b/apps/warp/Dockerfile new file mode 100644 index 0000000..6204067 --- /dev/null +++ b/apps/warp/Dockerfile @@ -0,0 +1,22 @@ +# syntax=docker/dockerfile:1 +FROM cloudron/base:5.0.0 + +LABEL org.opencontainers.image.source="https://github.com/sebo-b/warp.git" +LABEL org.opencontainers.image.description="Cloudron package for Warp" + +ARG APP_VERSION +ENV APP_VERSION=${APP_VERSION:-latest} + +# Copy application source into image at build time +# Replace this with a multi-stage build if upstream provides Docker images. +COPY ./app /app/code + +# Copy start script and make it executable +COPY ./start.sh /app/pkg/start.sh +RUN chmod +x /app/pkg/start.sh + +# Cloudron expects all processes to run as cloudron user +USER cloudron +WORKDIR /app/code + +CMD ["/app/pkg/start.sh"] diff --git a/apps/warp/README.md b/apps/warp/README.md new file mode 100644 index 0000000..4a3f3eb --- /dev/null +++ b/apps/warp/README.md @@ -0,0 +1,20 @@ +# Warp on Cloudron + +- **Upstream repository**: https://github.com/sebo-b/warp.git +- **Implementation issue**: https://projects.knownelement.com/issues/228 +- **Status**: Draft scaffolding generated on $(date -u +"%Y-%m-%dT%H:%M:%SZ") + +## Packaging Checklist + +1. Review upstream deployment requirements and map them to Cloudron services (database, cache, object storage, workers). +2. Update `Dockerfile` with the correct build steps and runtime dependencies. +3. Implement `start.sh` to configure the app from Cloudron-provided environment variables and launch the primary process. +4. Edit `CloudronManifest.json` with accurate metadata, permissions, ports, addons, and health checks. +5. Add integration and smoke tests under `test/` to validate the package. +6. Document manual configuration steps, migration requirements, and known gaps in this README. + +## Notes + +- Replace the placeholder long-running process in `start.sh`. +- Populate the `app/` directory with the application build artefacts or git submodules. +- Use the shared packaging container (`docker/packager`) to run `cloudron build` and `cloudron install` so the host remains clean. diff --git a/apps/warp/app/.gitkeep b/apps/warp/app/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/apps/warp/metadata.json b/apps/warp/metadata.json new file mode 100644 index 0000000..1bc1fa2 --- /dev/null +++ b/apps/warp/metadata.json @@ -0,0 +1,9 @@ +{ + "slug": "warp", + "title": "Warp", + "issue": "https://projects.knownelement.com/issues/228", + "repo": "https://github.com/sebo-b/warp.git", + "additionalRepos": [], + "created": "2025-10-02T16:46:49Z", + "notes": "TODO: capture packaging notes" +} \ No newline at end of file diff --git a/apps/warp/start.sh b/apps/warp/start.sh new file mode 100755 index 0000000..0c19b00 --- /dev/null +++ b/apps/warp/start.sh @@ -0,0 +1,8 @@ +#!/bin/bash +set -euo pipefail + +# Cloudron injects configuration via environment variables and files under /run +# Use this script to render config files and launch the upstream service. + +# TODO: Replace the command below with the correct process supervisor. +exec /bin/sh -c "echo 'Replace start.sh with application startup logic for Warp' && sleep infinity" diff --git a/apps/warp/test/smoke.sh b/apps/warp/test/smoke.sh new file mode 100755 index 0000000..ebd1134 --- /dev/null +++ b/apps/warp/test/smoke.sh @@ -0,0 +1,16 @@ +#!/bin/bash +set -euo pipefail + +# Basic container reachability check executed inside the packaging container. +# Replace curl target with an endpoint exposed by the app once the package is functional. +cloudron_app_url=${CLOUDRON_APP_ORIGIN:-"http://localhost"} + +http_code=$(curl -s -o /tmp/smoke.log -w "%{http_code}" "${cloudron_app_url}") + +if [[ "${http_code}" != "200" ]]; then + echo "Unexpected HTTP status: ${http_code}" >&2 + cat /tmp/smoke.log >&2 + exit 1 +fi + +echo "Smoke test passed" diff --git a/apps/windmill/CloudronManifest.json b/apps/windmill/CloudronManifest.json new file mode 100644 index 0000000..2a2ec8e --- /dev/null +++ b/apps/windmill/CloudronManifest.json @@ -0,0 +1,20 @@ +{ + "manifestVersion": 2, + "id": "com.knel.windmill", + "title": "Windmill", + "author": "Known Element Packaging Team", + "tagline": "TODO: Short one-line pitch", + "description": "TODO: Comprehensive description for the Cloudron App Store entry.", + "changelog": "Initial scaffold", + "website": "https://github.com/windmill-labs/windmill", + "supportUrl": "https://projects.knownelement.com/issues/285", + "sourceUrl": "https://github.com/windmill-labs/windmill.git", + "version": "0.1.0", + "tags": ["custom", "known-element"], + "healthCheckPath": "/", + "memoryLimit": 536870912, + "httpPort": 3000, + "addons": { + "localstorage": {} + } +} diff --git a/apps/windmill/Dockerfile b/apps/windmill/Dockerfile new file mode 100644 index 0000000..83e9002 --- /dev/null +++ b/apps/windmill/Dockerfile @@ -0,0 +1,22 @@ +# syntax=docker/dockerfile:1 +FROM cloudron/base:5.0.0 + +LABEL org.opencontainers.image.source="https://github.com/windmill-labs/windmill.git" +LABEL org.opencontainers.image.description="Cloudron package for Windmill" + +ARG APP_VERSION +ENV APP_VERSION=${APP_VERSION:-latest} + +# Copy application source into image at build time +# Replace this with a multi-stage build if upstream provides Docker images. +COPY ./app /app/code + +# Copy start script and make it executable +COPY ./start.sh /app/pkg/start.sh +RUN chmod +x /app/pkg/start.sh + +# Cloudron expects all processes to run as cloudron user +USER cloudron +WORKDIR /app/code + +CMD ["/app/pkg/start.sh"] diff --git a/apps/windmill/README.md b/apps/windmill/README.md new file mode 100644 index 0000000..7d979f9 --- /dev/null +++ b/apps/windmill/README.md @@ -0,0 +1,20 @@ +# Windmill on Cloudron + +- **Upstream repository**: https://github.com/windmill-labs/windmill.git +- **Implementation issue**: https://projects.knownelement.com/issues/285 +- **Status**: Draft scaffolding generated on $(date -u +"%Y-%m-%dT%H:%M:%SZ") + +## Packaging Checklist + +1. Review upstream deployment requirements and map them to Cloudron services (database, cache, object storage, workers). +2. Update `Dockerfile` with the correct build steps and runtime dependencies. +3. Implement `start.sh` to configure the app from Cloudron-provided environment variables and launch the primary process. +4. Edit `CloudronManifest.json` with accurate metadata, permissions, ports, addons, and health checks. +5. Add integration and smoke tests under `test/` to validate the package. +6. Document manual configuration steps, migration requirements, and known gaps in this README. + +## Notes + +- Replace the placeholder long-running process in `start.sh`. +- Populate the `app/` directory with the application build artefacts or git submodules. +- Use the shared packaging container (`docker/packager`) to run `cloudron build` and `cloudron install` so the host remains clean. diff --git a/apps/windmill/app/.gitkeep b/apps/windmill/app/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/apps/windmill/metadata.json b/apps/windmill/metadata.json new file mode 100644 index 0000000..32af7a5 --- /dev/null +++ b/apps/windmill/metadata.json @@ -0,0 +1,9 @@ +{ + "slug": "windmill", + "title": "Windmill", + "issue": "https://projects.knownelement.com/issues/285", + "repo": "https://github.com/windmill-labs/windmill.git", + "additionalRepos": [], + "created": "2025-10-02T16:46:50Z", + "notes": "TODO: capture packaging notes" +} \ No newline at end of file diff --git a/apps/windmill/start.sh b/apps/windmill/start.sh new file mode 100755 index 0000000..11257fd --- /dev/null +++ b/apps/windmill/start.sh @@ -0,0 +1,8 @@ +#!/bin/bash +set -euo pipefail + +# Cloudron injects configuration via environment variables and files under /run +# Use this script to render config files and launch the upstream service. + +# TODO: Replace the command below with the correct process supervisor. +exec /bin/sh -c "echo 'Replace start.sh with application startup logic for Windmill' && sleep infinity" diff --git a/apps/windmill/test/smoke.sh b/apps/windmill/test/smoke.sh new file mode 100755 index 0000000..ebd1134 --- /dev/null +++ b/apps/windmill/test/smoke.sh @@ -0,0 +1,16 @@ +#!/bin/bash +set -euo pipefail + +# Basic container reachability check executed inside the packaging container. +# Replace curl target with an endpoint exposed by the app once the package is functional. +cloudron_app_url=${CLOUDRON_APP_ORIGIN:-"http://localhost"} + +http_code=$(curl -s -o /tmp/smoke.log -w "%{http_code}" "${cloudron_app_url}") + +if [[ "${http_code}" != "200" ]]; then + echo "Unexpected HTTP status: ${http_code}" >&2 + cat /tmp/smoke.log >&2 + exit 1 +fi + +echo "Smoke test passed" diff --git a/apps/wireflow/CloudronManifest.json b/apps/wireflow/CloudronManifest.json new file mode 100644 index 0000000..5770e5b --- /dev/null +++ b/apps/wireflow/CloudronManifest.json @@ -0,0 +1,20 @@ +{ + "manifestVersion": 2, + "id": "com.knel.wireflow", + "title": "Wireflow", + "author": "Known Element Packaging Team", + "tagline": "TODO: Short one-line pitch", + "description": "TODO: Comprehensive description for the Cloudron App Store entry.", + "changelog": "Initial scaffold", + "website": "https://github.com/vanila-io/wireflow", + "supportUrl": "https://projects.knownelement.com/issues/50", + "sourceUrl": "https://github.com/vanila-io/wireflow.git", + "version": "0.1.0", + "tags": ["custom", "known-element"], + "healthCheckPath": "/", + "memoryLimit": 536870912, + "httpPort": 3000, + "addons": { + "localstorage": {} + } +} diff --git a/apps/wireflow/Dockerfile b/apps/wireflow/Dockerfile new file mode 100644 index 0000000..22109b4 --- /dev/null +++ b/apps/wireflow/Dockerfile @@ -0,0 +1,22 @@ +# syntax=docker/dockerfile:1 +FROM cloudron/base:5.0.0 + +LABEL org.opencontainers.image.source="https://github.com/vanila-io/wireflow.git" +LABEL org.opencontainers.image.description="Cloudron package for Wireflow" + +ARG APP_VERSION +ENV APP_VERSION=${APP_VERSION:-latest} + +# Copy application source into image at build time +# Replace this with a multi-stage build if upstream provides Docker images. +COPY ./app /app/code + +# Copy start script and make it executable +COPY ./start.sh /app/pkg/start.sh +RUN chmod +x /app/pkg/start.sh + +# Cloudron expects all processes to run as cloudron user +USER cloudron +WORKDIR /app/code + +CMD ["/app/pkg/start.sh"] diff --git a/apps/wireflow/README.md b/apps/wireflow/README.md new file mode 100644 index 0000000..ec5474f --- /dev/null +++ b/apps/wireflow/README.md @@ -0,0 +1,20 @@ +# Wireflow on Cloudron + +- **Upstream repository**: https://github.com/vanila-io/wireflow.git +- **Implementation issue**: https://projects.knownelement.com/issues/50 +- **Status**: Draft scaffolding generated on $(date -u +"%Y-%m-%dT%H:%M:%SZ") + +## Packaging Checklist + +1. Review upstream deployment requirements and map them to Cloudron services (database, cache, object storage, workers). +2. Update `Dockerfile` with the correct build steps and runtime dependencies. +3. Implement `start.sh` to configure the app from Cloudron-provided environment variables and launch the primary process. +4. Edit `CloudronManifest.json` with accurate metadata, permissions, ports, addons, and health checks. +5. Add integration and smoke tests under `test/` to validate the package. +6. Document manual configuration steps, migration requirements, and known gaps in this README. + +## Notes + +- Replace the placeholder long-running process in `start.sh`. +- Populate the `app/` directory with the application build artefacts or git submodules. +- Use the shared packaging container (`docker/packager`) to run `cloudron build` and `cloudron install` so the host remains clean. diff --git a/apps/wireflow/app/.gitkeep b/apps/wireflow/app/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/apps/wireflow/metadata.json b/apps/wireflow/metadata.json new file mode 100644 index 0000000..89c253a --- /dev/null +++ b/apps/wireflow/metadata.json @@ -0,0 +1,9 @@ +{ + "slug": "wireflow", + "title": "Wireflow", + "issue": "https://projects.knownelement.com/issues/50", + "repo": "https://github.com/vanila-io/wireflow.git", + "additionalRepos": [], + "created": "2025-10-02T16:46:50Z", + "notes": "TODO: capture packaging notes" +} \ No newline at end of file diff --git a/apps/wireflow/start.sh b/apps/wireflow/start.sh new file mode 100755 index 0000000..18c7425 --- /dev/null +++ b/apps/wireflow/start.sh @@ -0,0 +1,8 @@ +#!/bin/bash +set -euo pipefail + +# Cloudron injects configuration via environment variables and files under /run +# Use this script to render config files and launch the upstream service. + +# TODO: Replace the command below with the correct process supervisor. +exec /bin/sh -c "echo 'Replace start.sh with application startup logic for Wireflow' && sleep infinity" diff --git a/apps/wireflow/test/smoke.sh b/apps/wireflow/test/smoke.sh new file mode 100755 index 0000000..ebd1134 --- /dev/null +++ b/apps/wireflow/test/smoke.sh @@ -0,0 +1,16 @@ +#!/bin/bash +set -euo pipefail + +# Basic container reachability check executed inside the packaging container. +# Replace curl target with an endpoint exposed by the app once the package is functional. +cloudron_app_url=${CLOUDRON_APP_ORIGIN:-"http://localhost"} + +http_code=$(curl -s -o /tmp/smoke.log -w "%{http_code}" "${cloudron_app_url}") + +if [[ "${http_code}" != "200" ]]; then + echo "Unexpected HTTP status: ${http_code}" >&2 + cat /tmp/smoke.log >&2 + exit 1 +fi + +echo "Smoke test passed" diff --git a/apps/wireviz-web/CloudronManifest.json b/apps/wireviz-web/CloudronManifest.json new file mode 100644 index 0000000..351bbe6 --- /dev/null +++ b/apps/wireviz-web/CloudronManifest.json @@ -0,0 +1,20 @@ +{ + "manifestVersion": 2, + "id": "com.knel.wireviz.web", + "title": "Wireviz Web", + "author": "Known Element Packaging Team", + "tagline": "TODO: Short one-line pitch", + "description": "TODO: Comprehensive description for the Cloudron App Store entry.", + "changelog": "Initial scaffold", + "website": "https://github.com/wireviz/wireviz-web", + "supportUrl": "https://projects.knownelement.com/issues/276", + "sourceUrl": "https://github.com/wireviz/wireviz-web.git", + "version": "0.1.0", + "tags": ["custom", "known-element"], + "healthCheckPath": "/", + "memoryLimit": 536870912, + "httpPort": 3000, + "addons": { + "localstorage": {} + } +} diff --git a/apps/wireviz-web/Dockerfile b/apps/wireviz-web/Dockerfile new file mode 100644 index 0000000..3baad74 --- /dev/null +++ b/apps/wireviz-web/Dockerfile @@ -0,0 +1,22 @@ +# syntax=docker/dockerfile:1 +FROM cloudron/base:5.0.0 + +LABEL org.opencontainers.image.source="https://github.com/wireviz/wireviz-web.git" +LABEL org.opencontainers.image.description="Cloudron package for Wireviz Web" + +ARG APP_VERSION +ENV APP_VERSION=${APP_VERSION:-latest} + +# Copy application source into image at build time +# Replace this with a multi-stage build if upstream provides Docker images. +COPY ./app /app/code + +# Copy start script and make it executable +COPY ./start.sh /app/pkg/start.sh +RUN chmod +x /app/pkg/start.sh + +# Cloudron expects all processes to run as cloudron user +USER cloudron +WORKDIR /app/code + +CMD ["/app/pkg/start.sh"] diff --git a/apps/wireviz-web/README.md b/apps/wireviz-web/README.md new file mode 100644 index 0000000..1e0c6f1 --- /dev/null +++ b/apps/wireviz-web/README.md @@ -0,0 +1,20 @@ +# Wireviz Web on Cloudron + +- **Upstream repository**: https://github.com/wireviz/wireviz-web.git +- **Implementation issue**: https://projects.knownelement.com/issues/276 +- **Status**: Draft scaffolding generated on $(date -u +"%Y-%m-%dT%H:%M:%SZ") + +## Packaging Checklist + +1. Review upstream deployment requirements and map them to Cloudron services (database, cache, object storage, workers). +2. Update `Dockerfile` with the correct build steps and runtime dependencies. +3. Implement `start.sh` to configure the app from Cloudron-provided environment variables and launch the primary process. +4. Edit `CloudronManifest.json` with accurate metadata, permissions, ports, addons, and health checks. +5. Add integration and smoke tests under `test/` to validate the package. +6. Document manual configuration steps, migration requirements, and known gaps in this README. + +## Notes + +- Replace the placeholder long-running process in `start.sh`. +- Populate the `app/` directory with the application build artefacts or git submodules. +- Use the shared packaging container (`docker/packager`) to run `cloudron build` and `cloudron install` so the host remains clean. diff --git a/apps/wireviz-web/app/.gitkeep b/apps/wireviz-web/app/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/apps/wireviz-web/metadata.json b/apps/wireviz-web/metadata.json new file mode 100644 index 0000000..5eb5e70 --- /dev/null +++ b/apps/wireviz-web/metadata.json @@ -0,0 +1,9 @@ +{ + "slug": "wireviz-web", + "title": "Wireviz Web", + "issue": "https://projects.knownelement.com/issues/276", + "repo": "https://github.com/wireviz/wireviz-web.git", + "additionalRepos": [], + "created": "2025-10-02T16:46:49Z", + "notes": "TODO: capture packaging notes" +} \ No newline at end of file diff --git a/apps/wireviz-web/start.sh b/apps/wireviz-web/start.sh new file mode 100755 index 0000000..a88a7f1 --- /dev/null +++ b/apps/wireviz-web/start.sh @@ -0,0 +1,8 @@ +#!/bin/bash +set -euo pipefail + +# Cloudron injects configuration via environment variables and files under /run +# Use this script to render config files and launch the upstream service. + +# TODO: Replace the command below with the correct process supervisor. +exec /bin/sh -c "echo 'Replace start.sh with application startup logic for Wireviz Web' && sleep infinity" diff --git a/apps/wireviz-web/test/smoke.sh b/apps/wireviz-web/test/smoke.sh new file mode 100755 index 0000000..ebd1134 --- /dev/null +++ b/apps/wireviz-web/test/smoke.sh @@ -0,0 +1,16 @@ +#!/bin/bash +set -euo pipefail + +# Basic container reachability check executed inside the packaging container. +# Replace curl target with an endpoint exposed by the app once the package is functional. +cloudron_app_url=${CLOUDRON_APP_ORIGIN:-"http://localhost"} + +http_code=$(curl -s -o /tmp/smoke.log -w "%{http_code}" "${cloudron_app_url}") + +if [[ "${http_code}" != "200" ]]; then + echo "Unexpected HTTP status: ${http_code}" >&2 + cat /tmp/smoke.log >&2 + exit 1 +fi + +echo "Smoke test passed" diff --git a/docker/ci-runner/Dockerfile b/docker/ci-runner/Dockerfile new file mode 100644 index 0000000..d6fad2d --- /dev/null +++ b/docker/ci-runner/Dockerfile @@ -0,0 +1,26 @@ +# CI harness image mirroring the Actions environment used by act_runner +FROM ghcr.io/catthehacker/ubuntu:act-22.04 + +ENV DEBIAN_FRONTEND=noninteractive + +RUN apt-get update \ + && apt-get install --yes --no-install-recommends \ + ca-certificates \ + curl \ + git \ + gnupg \ + jq \ + make \ + python3 \ + python3-pip \ + python3-venv \ + docker.io \ + && rm -rf /var/lib/apt/lists/* + +# Configure git to trust any mounted workspace path inside the container +RUN git config --system --add safe.directory '*' + +WORKDIR /workspace + +ENTRYPOINT ["/bin/bash", "-lc"] +CMD ["sleep infinity"] diff --git a/docker/packager/Dockerfile b/docker/packager/Dockerfile new file mode 100644 index 0000000..39194fb --- /dev/null +++ b/docker/packager/Dockerfile @@ -0,0 +1,34 @@ +# Containerised build environment for Cloudron packaging +FROM node:20-bullseye + +ARG CLOUDRON_CLI_VERSION=latest + +ENV DEBIAN_FRONTEND=noninteractive + +RUN apt-get update \ + && apt-get install --yes --no-install-recommends \ + ca-certificates \ + curl \ + git \ + jq \ + python3 \ + python3-pip \ + rsync \ + sudo \ + tini \ + unzip \ + wget \ + docker.io \ + && rm -rf /var/lib/apt/lists/* + +RUN npm install --global "cloudron@${CLOUDRON_CLI_VERSION}" + +# Create non-root user that matches Cloudron packaging expectations +RUN useradd --create-home --shell /bin/bash packager \ + && echo 'packager ALL=(ALL) NOPASSWD:ALL' > /etc/sudoers.d/packager + +USER packager +WORKDIR /workspace + +ENTRYPOINT ["tini", "--"] +CMD ["bash"] diff --git a/docs/APP_STATUS.md b/docs/APP_STATUS.md new file mode 100644 index 0000000..9669d1a --- /dev/null +++ b/docs/APP_STATUS.md @@ -0,0 +1,61 @@ +# Application Status + +_Updated: 2025-10-02T16:50:06Z_ + +| Slug | Title | Version | Status | Issue | +| --- | --- | --- | --- | --- | +| apache-apisix | Apache APISIX | 0.1.0 | todo | https://projects.knownelement.com/issues/179 | +| target-goalert | GoAlert | 0.1.0 | todo | https://projects.knownelement.com/issues/204 | +| consuldemocracy | CONSUL Democracy | 0.1.0 | todo | https://projects.knownelement.com/issues/189 | +| fleetdm-fleet | FleetDM Fleet | 0.1.0 | todo | https://projects.knownelement.com/issues/195 | +| fonoster | Fonoster | 0.1.0 | todo | https://projects.knownelement.com/issues/227 | +| healthchecks | Healthchecks | 0.1.0 | todo | https://projects.knownelement.com/issues/192 | +| hyperswitch | HyperSwitch | 0.1.0 | todo | https://projects.knownelement.com/issues/209 | +| netbox-docker | NetBox Docker | 0.1.0 | todo | https://projects.knownelement.com/issues/201 | +| openboxes-docker | OpenBoxes Docker | 0.1.0 | todo | https://projects.knownelement.com/issues/205 | +| openfile | OpenFile | 0.1.0 | todo | https://projects.knownelement.com/issues/316 | +| sniperphish | SniperPhish | 0.1.0 | todo | https://projects.knownelement.com/issues/211 | +| datahub | DataHub | 0.1.0 | todo | https://projects.knownelement.com/issues/309 | +| easy-gate | Easy Gate | 0.1.0 | todo | https://projects.knownelement.com/issues/54 | +| payroll-engine | Payroll Engine | 0.1.0 | todo | https://projects.knownelement.com/issues/208 | +| huginn | Huginn | 0.1.0 | todo | https://projects.knownelement.com/issues/194 | +| grist | Grist | 0.1.0 | todo | https://projects.knownelement.com/issues/191 | +| docassemble | Docassemble | 0.1.0 | todo | https://projects.knownelement.com/issues/277 | +| database-gateway | Database Gateway | 0.1.0 | todo | https://projects.knownelement.com/issues/273 | +| rundeck | Rundeck | 0.1.0 | todo | https://projects.knownelement.com/issues/217 | +| slurm | Slurm | 0.1.0 | todo | https://projects.knownelement.com/issues/222 | +| rathole | rathole | 0.1.0 | todo | https://projects.knownelement.com/issues/225 | +| jenkins | Jenkins | 0.1.0 | todo | https://projects.knownelement.com/issues/234 | +| runme | Runme | 0.1.0 | todo | https://projects.knownelement.com/issues/322 | +| seatunnel | SeaTunnel | 0.1.0 | todo | https://projects.knownelement.com/issues/301 | +| docker-webhook | docker-webhook | 0.1.0 | todo | https://projects.knownelement.com/issues/271 | +| inventree | InvenTree | 0.1.0 | todo | https://projects.knownelement.com/issues/173 | +| tak-server | TAK Server | 0.1.0 | todo | https://projects.knownelement.com/issues/180 | +| midday | Midday | 0.1.0 | todo | https://projects.knownelement.com/issues/178 | +| killbill | Kill Bill | 0.1.0 | todo | https://projects.knownelement.com/issues/181 | +| chirpstack | ChirpStack | 0.1.0 | todo | https://projects.knownelement.com/issues/184 | +| craig | Craig (FOSS Discord Recorder) | 0.1.0 | todo | https://projects.knownelement.com/issues/185 | +| elabftw | eLabFTW | 0.1.0 | todo | https://projects.knownelement.com/issues/188 | +| jamovi | jamovi | 0.1.0 | todo | https://projects.knownelement.com/issues/196 | +| kibot | KiBot | 0.1.0 | todo | https://projects.knownelement.com/issues/197 | +| resgrid | Resgrid Core | 0.1.0 | todo | https://projects.knownelement.com/issues/214 | +| reviewboard | Review Board | 0.1.0 | todo | https://projects.knownelement.com/issues/216 | +| satnogs-kaitai | SatNOGS Kaitai | 0.1.0 | todo | https://projects.knownelement.com/issues/218 | +| satnogs-webgui | SatNOGS WebGUI | 0.1.0 | todo | https://projects.knownelement.com/issues/218 | +| sdrangel | SDRAngel | 0.1.0 | todo | https://projects.knownelement.com/issues/219 | +| signoz | SigNoz | 0.1.0 | todo | https://projects.knownelement.com/issues/221 | +| warp | Warp | 0.1.0 | todo | https://projects.knownelement.com/issues/228 | +| drawio | draw.io | 0.1.0 | todo | https://projects.knownelement.com/issues/272 | +| openblocks | OpenBlocks | 0.1.0 | todo | https://projects.knownelement.com/issues/274 | +| wireviz-web | Wireviz Web | 0.1.0 | todo | https://projects.knownelement.com/issues/276 | +| autobom | Autobom | 0.1.0 | todo | https://projects.knownelement.com/issues/278 | +| plmore | PLMore | 0.1.0 | todo | https://projects.knownelement.com/issues/279 | +| manyfold | Manyfold | 0.1.0 | todo | https://projects.knownelement.com/issues/282 | +| langfuse | Langfuse OSS LLMOps Stack | 0.1.0 | todo | https://projects.knownelement.com/issues/283 | +| puter | Puter | 0.1.0 | todo | https://projects.knownelement.com/issues/286 | +| windmill | Windmill | 0.1.0 | todo | https://projects.knownelement.com/issues/285 | +| swupdate | swupdate | 0.1.0 | todo | https://projects.knownelement.com/issues/326 | +| mender-server | Mender Server | 0.1.0 | todo | https://projects.knownelement.com/issues/300 | +| wireflow | Wireflow | 0.1.0 | todo | https://projects.knownelement.com/issues/50 | +| nautilus-trader | Nautilus Trader | 0.1.0 | todo | https://projects.knownelement.com/issues/226 | +| mirlo | Mirlo | 0.1.0 | todo | https://projects.knownelement.com/issues/TBD | diff --git a/docs/CI_CD_GITEA.md b/docs/CI_CD_GITEA.md new file mode 100644 index 0000000..99db959 --- /dev/null +++ b/docs/CI_CD_GITEA.md @@ -0,0 +1,35 @@ +# Gitea CI/CD and Registry Integration + +This project uses the Gitea Actions runner and the built-in container registry hosted at `https://git.knownelement.com`. The workflow definition lives under `.gitea/workflows/ci.yml` and targets the Gitea Actions runtime (1.21+) alongside the built-in container registry available on current releases. The workflow is currently configured for manual `workflow_dispatch` runs so all routine testing stays on the local harness until a runner is available. citeturn0search0turn1search0 + +## Prerequisites + +1. **Enable Actions** on the Gitea instance and mirror required upstream actions (`actions/checkout@v4`, optional others) via the "Actions" admin panel. citeturn0search0 +2. **Provision a runner** (e.g. `act_runner`) with Docker access so jobs can launch containers. citeturn0search5 +3. **Authenticate to the registry** by generating a Gitea access token (scope `write:package`) and logging in via Docker: + ```bash + docker login git.knownelement.com -u -p + ``` + citeturn1search0 + +## Workflow overview + +The manual `workflow_dispatch` job builds the `docker/ci-runner` image, then executes `scripts/ci_local.sh` with the requested task list (default `all`). This mirrors the local harness, so whatever succeeds locally will succeed in CI. + +> Re-enable push/PR triggers once a runner is available and `make ci-local` is consistently green. + +## Container registry usage + +- Tag Cloudron packages against the registry namespace, e.g. `git.knownelement.com/knel/cloudron/apache-apisix:`. +- The packager helper script reads `IMAGE_NAME`; override it when pushing to the registry: + ```bash + IMAGE_NAME=git.knownelement.com/knel/cloudron-packager BUILD=1 scripts/run_packager.sh + docker push git.knownelement.com/knel/cloudron-packager + ``` +- Cloudron’s CLI can push directly to the registry once you log in within the packager container. + +## Future enhancements + +- Add `make lint` and `make status` as required checks in Gitea branch protection. +- Extend the workflow with matrix builds for priority apps (e.g. run smoke scripts once implemented). + diff --git a/docs/LOCAL_TESTING.md b/docs/LOCAL_TESTING.md new file mode 100644 index 0000000..65bb6f9 --- /dev/null +++ b/docs/LOCAL_TESTING.md @@ -0,0 +1,33 @@ +# Local Test Harness + +All verification runs locally inside Docker containers so your workstation matches the eventual Gitea Actions runner exactly. + +## CI-equivalent container + +- `docker/ci-runner/Dockerfile` builds the image `knel/cloudron-ci`, derived from the same base the Gitea runner will use. +- `scripts/ci_local.sh` orchestrates tasks inside that container. Run `BUILD=1 ./scripts/ci_local.sh lint` the first time to build the image. +- Tasks: + - `lint` → `make lint` + `make status` + `git diff docs/APP_STATUS.md` + - `packager-smoke` → builds `docker/packager` and runs `cloudron --help` + - `all` (default) → runs both. + +The script mounts `/var/run/docker.sock` so Docker CLI calls inside the container reuse the host daemon. + +## Git hooks + +Use `scripts/hooks/install_hooks.sh` to install local hooks: + +```bash +./scripts/hooks/install_hooks.sh +``` + +- `pre-commit` runs `./scripts/ci_local.sh lint`. +- `post-commit` refreshes `docs/APP_STATUS.md` (non-fatal). +- `pre-push` runs the packager smoke test. + +Set `SKIP_CI_HOOKS=1` when you need to bypass the hooks temporarily. + +## Alignment with Gitea Actions + +The `.gitea/workflows/ci.yml` workflow wraps the same `scripts/ci_local.sh` entrypoint and is currently manual-only (`workflow_dispatch`). Enable push/PR triggers once a runner is provisioned. + diff --git a/docs/PACKAGING_GUIDE.md b/docs/PACKAGING_GUIDE.md new file mode 100644 index 0000000..6c5e705 --- /dev/null +++ b/docs/PACKAGING_GUIDE.md @@ -0,0 +1,82 @@ +# Cloudron Packaging Playbook + +This repository standardises the workflow for building and maintaining Cloudron packages for the Known Element portfolio. + +## Reference workflow + +1. Generate a package scaffold from the shared template using `scripts/new_app.py`. +2. Run all build, test, and release tasks inside the `docker/packager` container to avoid host pollution. +3. Implement application-specific build steps in `apps//Dockerfile` and configure the runtime via `start.sh`. +4. Update `CloudronManifest.json` with accurate metadata, addons, ports, and health checks based on the upstream project. +5. Build and test locally with the Cloudron CLI (`cloudron build`, `cloudron install --app `) inside the packaging container. +6. Push the image to the Cloudron registry (`cloudron push`) and publish once happy with smoke-test coverage. + +## Cloudron packaging essentials + +- **Base image**: Start from `cloudron/base:` and add only the dependencies the app requires. +- **CloudronManifest**: The manifest declares metadata, exposed ports, resource limits, addons (databases, object storage, email), and health checks. Always keep the `id` stable since it uniquely identifies the package inside Cloudron ecosystems. +- **Start script**: Use `start.sh` to render configuration from environment variables and launch the primary process under the `cloudron` user. +- **Tests**: Provide smoke tests in `test/` that Cloudron can run via `cloudron build --test`. +- **Updates**: Bump the manifest `version`, document the change in `changelog`, and rebuild when upstream releases. + +## Repository linting + +Run the scaffold lint checks after editing an app to catch placeholder artefacts: + +```bash +python3 scripts/lint_repo.py +``` + +Set `CLOUDRON_BASE` to override the expected base image version when needed. + +Use the Makefile shortcuts for common tasks: + +```bash +make scaffold # regenerate scaffolds from catalog +make lint # run repo lint checks +make status # refresh docs/APP_STATUS.md +``` + +Leverage the Gitea Actions workflow (`.gitea/workflows/ci.yml`) to enforce `make lint` and status generation on every push; instructions for runner setup live in `docs/CI_CD_GITEA.md`. + +Run the local harness via `./scripts/ci_local.sh` (or `make ci-local`) to replicate the CI pipeline without relying on a remote runner; see `docs/LOCAL_TESTING.md` for hook integration. + +## Using the packager container + +```bash +# Build the helper image +BUILD=1 scripts/run_packager.sh + +# Launch an interactive shell inside the packaging environment +scripts/run_packager.sh +``` + +The container bundles the Cloudron CLI, Docker CLI, git, curl, and other tooling for reproducible builds. The host Docker socket is mounted so you can reuse local credentials while keeping the host clean. + +## Adding a new application + +```bash +# Create the full scaffold for all catalog entries +python3 scripts/new_app.py + +# Or generate a single skeleton +python3 scripts/new_app.py --slug apache-apisix +``` + +Each scaffold contains: + +- `Dockerfile` – build instructions +- `start.sh` – runtime entrypoint +- `CloudronManifest.json` – metadata and permissions +- `test/smoke.sh` – placeholder smoke test +- `metadata.json` – issue and upstream bookkeeping +- `README.md` – packaging checklist + +Update these files with the app-specific details, add upstream artefacts under `app/`, and commit the changes. + +## Repository etiquette + +- Document design decisions and manual steps in `docs/` or the per-app README. +- Keep automation scripts idempotent; rerunning them should not damage uncommitted work. +- Use semantic versioning in manifest files (`MAJOR.MINOR.PATCH`). + diff --git a/docs/PRIORITY_MILESTONES.md b/docs/PRIORITY_MILESTONES.md new file mode 100644 index 0000000..238f673 --- /dev/null +++ b/docs/PRIORITY_MILESTONES.md @@ -0,0 +1,49 @@ +# Priority Packaging Milestones + +_Target date references assume today is 2025-10-02._ + +## 1. Apache APISIX +- **Dependencies**: Requires etcd for configuration storage; default proxy port 9080 and Admin API on 9180 (traditional mode). citeturn1search1turn1search4 +- **Cloudron add-ons**: Package etcd as an internal service (local or addon) or provision external managed etcd. +- **Key tasks**: + 1. Implement multi-container Docker build that bundles APISIX gateway and colocated etcd with supervised lifecycle. + 2. Expose Cloudron TCP proxy support for 9080/9443 proxy & 9180 admin, restrict Admin API via Cloudron ACL. + 3. Template `conf/config.yaml` to align with Cloudron env vars, including dynamic Admin API keys and optional standalone mode for static config. + 4. Provide smoke test hitting `/apisix/admin/routes` with Cloudron-issued token. +- **Milestone window**: Design + PoC by 2025-10-16; functional package & review by 2025-11-01. + +## 2. NetBox (netbox-docker) +- **Dependencies**: PostgreSQL 14+, Redis ≥4.0, persistent media storage; official guidance discourages external Redis and highlights resource needs (8 vCPU, 24 GB RAM for HA). citeturn2search0turn2search1turn2search2 +- **Cloudron add-ons**: Postgres, Redis, object storage (optional), mail outbox. +- **Key tasks**: + 1. Adapt upstream docker-compose into Cloudron single-image bundle with supervisord orchestrating web, worker, scheduler. + 2. Configure manifests for dual Redis (cache + rq) using Cloudron Redis addon namespaces. + 3. Wire migrations into `start.sh`; ensure plugin directories mounted from `/app/data` for persistence. + 4. Expand smoke tests to include `/api/` health probe and Celery worker queue check. +- **Milestone window**: Packaging draft by 2025-10-23; regression-tested release candidate by 2025-11-08. + +## 3. Jenkins +- **Dependencies**: Requires Java 17/21 runtime; official Docker images now default to Java 21 with long-term support for Java 17+. citeturn3search0turn3search9turn3search11 +- **Cloudron add-ons**: Local storage (persistent), optional object storage for builds, outbound mail. +- **Key tasks**: + 1. Base image customization layering on top of `jenkins/jenkins:lts-jdk21`; harden permissions and align user IDs with Cloudron. + 2. Inject Cloudron env integration (admin user + credentials in secrets); support optional LDAP via Cloudron directory service when available. + 3. Provide maintenance script for plugin catalog sync and backup to `/app/data/backups`. + 4. Smoke test to assert controller readiness on `/login` and verify Java version output. +- **Milestone window**: Container adaptation by 2025-10-09; plugin bootstrap + documentation by 2025-10-20. + +## 4. DataHub +- **Dependencies**: Core services (GMS, frontend, Kafka, MySQL, Elasticsearch, optional Neo4j) shipped via docker-compose; quickstart expects 2 CPUs, 8 GB RAM. citeturn4search0turn4search3 +- **Cloudron add-ons**: MySQL addon (primary metadata store), optional Kafka/Elasticsearch via external services or sidecar containers; large persistent volumes. +- **Key tasks**: + 1. Determine feasibility of multi-container package (supervisord) vs. encouraging managed dependencies; document resource footprint. + 2. Externalize credentials & admin user provisioning through Cloudron secrets. + 3. Provide scripted ingestion of sample metadata gated behind env flag. + 4. Implement health probes for GMS (`/health`), frontend (`/health`) and background consumer status. +- **Milestone window**: Architecture decision record by 2025-10-18; initial Cloudron package by 2025-11-12. + +## Cross-cutting Actions +- Update Cloudron base image references repo-wide automatically when new base images (currently `cloudron/base:5.0.0` from the 8.3 release) ship. citeturn0search1 +- Use `make lint` and `make status` gates in CI to enforce placeholder removal before PRs merge. +- Capture app-specific ADRs under `docs/apps//ADR-0001.md` as work begins. + diff --git a/scripts/ci_local.sh b/scripts/ci_local.sh new file mode 100755 index 0000000..8a78033 --- /dev/null +++ b/scripts/ci_local.sh @@ -0,0 +1,83 @@ +#!/bin/bash +set -euo pipefail + +REPO_ROOT=$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd) +CI_IMAGE=${CI_IMAGE:-knel/cloudron-ci} +BUILD=${BUILD:-0} + +ensure_image() { + if [[ "${BUILD}" == "1" ]]; then + docker build -t "${CI_IMAGE}" "${REPO_ROOT}/docker/ci-runner" + return + fi + + if ! docker image inspect "${CI_IMAGE}" >/dev/null 2>&1; then + docker build -t "${CI_IMAGE}" "${REPO_ROOT}/docker/ci-runner" + fi +} + +run_in_ci() { + local cmd=$1 + docker run --rm -t \ + -v "${REPO_ROOT}:/workspace" \ + -v /var/run/docker.sock:/var/run/docker.sock \ + "${CI_IMAGE}" "${cmd}" +} + +lint() { + run_in_ci 'git config --global --add safe.directory /workspace && make lint && make status && git diff --exit-code docs/APP_STATUS.md' +} + +packager_smoke() { + run_in_ci 'git config --global --add safe.directory /workspace && docker build -t knel/cloudron-packager-test docker/packager && docker run --rm knel/cloudron-packager-test cloudron --help' +} + +usage() { + cat <&2 + usage + exit 1 + ;; + esac +} + +main "$@" diff --git a/scripts/generate_status.py b/scripts/generate_status.py new file mode 100755 index 0000000..ed0a795 --- /dev/null +++ b/scripts/generate_status.py @@ -0,0 +1,75 @@ +#!/usr/bin/env python3 +"""Produce status documentation for all apps.""" + +import json +import pathlib +from datetime import datetime +from typing import Dict, List + +ROOT = pathlib.Path(__file__).resolve().parents[1] + + +def load_catalog() -> List[Dict[str, str]]: + catalog_path = ROOT / "apps" / "catalog.json" + return json.loads(catalog_path.read_text(encoding="utf-8")) + + +def load_manifest(app_dir: pathlib.Path) -> Dict[str, object]: + manifest_path = app_dir / "CloudronManifest.json" + if not manifest_path.exists(): + return {} + try: + return json.loads(manifest_path.read_text(encoding="utf-8")) + except json.JSONDecodeError: + return {} + + +def detect_status(app_dir: pathlib.Path) -> str: + manifest = load_manifest(app_dir) + start_script = (app_dir / "start.sh").read_text(encoding="utf-8") if (app_dir / "start.sh").exists() else "" + placeholders = 0 + if "TODO" in json.dumps(manifest): + placeholders += 1 + if "Replace start.sh" in start_script: + placeholders += 1 + + if placeholders == 0: + return "ready" + if placeholders == 1: + return "in-progress" + return "todo" + + +def render_table(rows: List[Dict[str, str]]) -> str: + header = "| Slug | Title | Version | Status | Issue |\n| --- | --- | --- | --- | --- |" + lines = [header] + for row in rows: + lines.append( + f"| {row['slug']} | {row['title']} | {row['version']} | {row['status']} | {row['issue']} |" + ) + return "\n".join(lines) + + +def main() -> None: + catalog = load_catalog() + rows: List[Dict[str, str]] = [] + for entry in catalog: + slug = entry["slug"] + app_dir = ROOT / "apps" / slug + manifest = load_manifest(app_dir) + rows.append({ + "slug": slug, + "title": entry["title"], + "version": manifest.get("version", "0.1.0"), + "status": detect_status(app_dir), + "issue": entry.get("issue", "") + }) + + output = ["# Application Status", "", f"_Updated: {datetime.utcnow().isoformat(timespec='seconds')}Z_", "", render_table(rows)] + status_path = ROOT / "docs" / "APP_STATUS.md" + status_path.write_text("\n".join(output) + "\n", encoding="utf-8") + print(f"Updated {status_path.relative_to(ROOT)}") + + +if __name__ == "__main__": + main() diff --git a/scripts/hooks/install_hooks.sh b/scripts/hooks/install_hooks.sh new file mode 100755 index 0000000..31e9f43 --- /dev/null +++ b/scripts/hooks/install_hooks.sh @@ -0,0 +1,16 @@ +#!/bin/bash +set -euo pipefail + +REPO_ROOT=$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd) +HOOK_DIR="${REPO_ROOT}/.git/hooks" + +if [[ ! -d "${HOOK_DIR}" ]]; then + echo "This script must be run inside a git repository." >&2 + exit 1 +fi + +for hook in pre-commit post-commit pre-push; do + ln -sf "${REPO_ROOT}/scripts/hooks/${hook}" "${HOOK_DIR}/${hook}" + chmod +x "${HOOK_DIR}/${hook}" + echo "Installed ${hook} hook" +done diff --git a/scripts/hooks/post-commit b/scripts/hooks/post-commit new file mode 100755 index 0000000..09b46bc --- /dev/null +++ b/scripts/hooks/post-commit @@ -0,0 +1,11 @@ +#!/bin/bash +set -euo pipefail + +if [[ "${SKIP_CI_HOOKS:-}" == "1" ]]; then + echo "Skipping CI hooks because SKIP_CI_HOOKS=1" + exit 0 +fi + +REPO_ROOT=$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd) + +${REPO_ROOT}/scripts/ci_local.sh status || true diff --git a/scripts/hooks/pre-commit b/scripts/hooks/pre-commit new file mode 100755 index 0000000..eb178af --- /dev/null +++ b/scripts/hooks/pre-commit @@ -0,0 +1,11 @@ +#!/bin/bash +set -euo pipefail + +if [[ "${SKIP_CI_HOOKS:-}" == "1" ]]; then + echo "Skipping CI hooks because SKIP_CI_HOOKS=1" + exit 0 +fi + +REPO_ROOT=$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd) + +${REPO_ROOT}/scripts/ci_local.sh lint diff --git a/scripts/hooks/pre-push b/scripts/hooks/pre-push new file mode 100755 index 0000000..dc47e31 --- /dev/null +++ b/scripts/hooks/pre-push @@ -0,0 +1,11 @@ +#!/bin/bash +set -euo pipefail + +if [[ "${SKIP_CI_HOOKS:-}" == "1" ]]; then + echo "Skipping CI hooks because SKIP_CI_HOOKS=1" + exit 0 +fi + +REPO_ROOT=$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd) + +${REPO_ROOT}/scripts/ci_local.sh packager-smoke diff --git a/scripts/lint_repo.py b/scripts/lint_repo.py new file mode 100755 index 0000000..9503a8a --- /dev/null +++ b/scripts/lint_repo.py @@ -0,0 +1,96 @@ +#!/usr/bin/env python3 +"""Basic sanity checks for Cloudron packaging scaffolds.""" + +import json +import os +import pathlib +import sys +from typing import Dict, List + +ROOT = pathlib.Path(__file__).resolve().parents[1] +EXPECTED_BASE = os.environ.get("CLOUDRON_BASE", "cloudron/base:5.0.0") + + +def find_apps(apps_dir: pathlib.Path) -> List[pathlib.Path]: + return sorted(p for p in apps_dir.iterdir() if p.is_dir()) + + +def check_manifest(app_dir: pathlib.Path) -> List[str]: + issues: List[str] = [] + manifest = app_dir / "CloudronManifest.json" + if not manifest.exists(): + issues.append("missing CloudronManifest.json") + return issues + try: + data = json.loads(manifest.read_text(encoding="utf-8")) + except json.JSONDecodeError as exc: + issues.append(f"manifest JSON invalid: {exc}") + return issues + for key in ("id", "title", "version"): + if not data.get(key): + issues.append(f"manifest missing {key}") + tagline = data.get("tagline", "") + description = data.get("description", "") + if "TODO" in tagline: + issues.append("manifest tagline still contains TODO placeholder") + if "TODO" in description: + issues.append("manifest description still contains TODO placeholder") + return issues + + +def check_dockerfile(app_dir: pathlib.Path) -> List[str]: + issues: List[str] = [] + dockerfile = app_dir / "Dockerfile" + if not dockerfile.exists(): + issues.append("missing Dockerfile") + return issues + first_from = None + for line in dockerfile.read_text(encoding="utf-8").splitlines(): + line = line.strip() + if line.startswith("FROM "): + first_from = line.split()[1] + break + if first_from != EXPECTED_BASE: + issues.append(f"Dockerfile base image '{first_from}' != '{EXPECTED_BASE}'") + return issues + + +def check_start_script(app_dir: pathlib.Path) -> List[str]: + issues: List[str] = [] + start = app_dir / "start.sh" + if not start.exists(): + issues.append("missing start.sh") + return issues + mode = start.stat().st_mode + if not mode & 0o111: + issues.append("start.sh is not executable") + if "Replace start.sh" in start.read_text(encoding="utf-8"): + issues.append("start.sh still contains placeholder command") + return issues + + +def main() -> int: + apps_dir = ROOT / "apps" + if not apps_dir.exists(): + print("No apps directory present", file=sys.stderr) + return 1 + failures = 0 + for app_dir in find_apps(apps_dir): + app_issues: List[str] = [] + app_issues.extend(check_manifest(app_dir)) + app_issues.extend(check_dockerfile(app_dir)) + app_issues.extend(check_start_script(app_dir)) + if app_issues: + failures += 1 + print(f"[FAIL] {app_dir.relative_to(ROOT)}") + for issue in app_issues: + print(f" - {issue}") + if failures: + print(f"\n{failures} app(s) require updates", file=sys.stderr) + return 2 + print("All apps passed lint checks") + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/scripts/new_app.py b/scripts/new_app.py new file mode 100755 index 0000000..6dfb96f --- /dev/null +++ b/scripts/new_app.py @@ -0,0 +1,126 @@ +#!/usr/bin/env python3 +import argparse +import datetime +import json +import os +import pathlib +import shutil +from typing import Dict, List + +ROOT = pathlib.Path(__file__).resolve().parents[1] + + +def load_catalog(path: pathlib.Path) -> List[Dict[str, object]]: + with path.open("r", encoding="utf-8") as handle: + return json.load(handle) + + +def build_app_id(slug: str) -> str: + sanitized = ''.join(ch.lower() if ch.isalnum() else '.' for ch in slug) + sanitized = '.'.join(filter(None, sanitized.split('.'))) + return f"com.knel.{sanitized}" + + +def default_tags() -> List[str]: + return ["custom", "known-element"] + + +def default_placeholder_map(entry: Dict[str, object]) -> Dict[str, str]: + slug = entry["slug"] + title = entry["title"] + repo = entry["repo"] + issue = entry.get("issue", "") + website = entry.get("website") or repo.rstrip(".git") + description = entry.get("description") or "TODO: Add package description." + tags = entry.get("tags") or default_tags() + http_port = str(entry.get("httpPort", 3000)) + base_image = entry.get("baseImage", "cloudron/base:5.0.0") + + placeholder_map = { + "{{APP_ID}}": build_app_id(slug), + "{{APP_TITLE}}": title, + "{{APP_SLUG}}": slug, + "{{APP_REPO}}": repo, + "{{APP_ISSUE}}": issue, + "{{APP_WEBSITE}}": website, + "{{APP_DESCRIPTION}}": description, + "{{HTTP_PORT}}": http_port, + "{{BASE_IMAGE}}": base_image, + "{{APP_TAGS}}": json.dumps(tags) + } + + return placeholder_map + + +def render_templates(template_dir: pathlib.Path, destination: pathlib.Path, entry: Dict[str, object]) -> None: + shutil.copytree(template_dir, destination, dirs_exist_ok=True) + + placeholders = default_placeholder_map(entry) + + for path in destination.rglob('*'): + if path.is_dir(): + continue + text = path.read_text(encoding='utf-8') + for key, value in placeholders.items(): + text = text.replace(key, value) + path.write_text(text, encoding='utf-8') + + # Ensure critical scripts are executable + for relpath in ["start.sh", "test/smoke.sh"]: + target = destination / relpath + if target.exists(): + mode = target.stat().st_mode + target.chmod(mode | 0o111) + + # Drop metadata file for bookkeeping + metadata = { + "slug": entry["slug"], + "title": entry["title"], + "issue": entry.get("issue"), + "repo": entry.get("repo"), + "additionalRepos": entry.get("additionalRepos", []), + "created": datetime.datetime.utcnow().replace(microsecond=0).isoformat() + "Z", + "notes": entry.get("notes", "TODO: capture packaging notes") + } + with (destination / "metadata.json").open("w", encoding="utf-8") as handle: + json.dump(metadata, handle, indent=2) + + +def ensure_app_directory(entry: Dict[str, object], template_dir: pathlib.Path, apps_dir: pathlib.Path, force: bool) -> pathlib.Path: + app_dir = apps_dir / entry["slug"] + if app_dir.exists(): + if not force: + raise FileExistsError(f"Destination {app_dir} already exists. Use --force to overwrite.") + shutil.rmtree(app_dir) + render_templates(template_dir, app_dir, entry) + return app_dir + + +def main() -> None: + parser = argparse.ArgumentParser(description="Scaffold Cloudron app packages from catalog entries") + parser.add_argument("--slug", help="Generate scaffold for a single slug", default=None) + parser.add_argument("--catalog", default=str(ROOT / "apps" / "catalog.json"), help="Path to catalog JSON") + parser.add_argument("--template", default=str(ROOT / "templates" / "cloudron-app"), help="Template directory") + parser.add_argument("--apps-dir", default=str(ROOT / "apps"), help="Destination apps directory") + parser.add_argument("--force", action="store_true", help="Overwrite existing app directory") + args = parser.parse_args() + + catalog = load_catalog(pathlib.Path(args.catalog)) + + entries = catalog + if args.slug: + entries = [entry for entry in catalog if entry["slug"] == args.slug] + if not entries: + raise SystemExit(f"Slug {args.slug} not found in catalog") + + template_dir = pathlib.Path(args.template) + apps_dir = pathlib.Path(args.apps_dir) + apps_dir.mkdir(parents=True, exist_ok=True) + + for entry in entries: + app_dir = ensure_app_directory(entry, template_dir, apps_dir, args.force) + print(f"Created {app_dir.relative_to(ROOT)}") + + +if __name__ == "__main__": + main() diff --git a/scripts/run_packager.sh b/scripts/run_packager.sh new file mode 100755 index 0000000..9c4697f --- /dev/null +++ b/scripts/run_packager.sh @@ -0,0 +1,16 @@ +#!/bin/bash +set -euo pipefail + +REPO_ROOT=$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd) +IMAGE_NAME=${IMAGE_NAME:-knel/cloudron-packager} +BUILD=${BUILD:-0} + +if [[ "${BUILD}" == "1" ]]; then + docker build -t "${IMAGE_NAME}" "${REPO_ROOT}/docker/packager" +fi + +docker run --rm -it \ + -v "${REPO_ROOT}:/workspace" \ + -v /var/run/docker.sock:/var/run/docker.sock \ + -e HOME=/home/packager \ + "${IMAGE_NAME}" "$@" diff --git a/templates/cloudron-app/CloudronManifest.json b/templates/cloudron-app/CloudronManifest.json new file mode 100644 index 0000000..cc9989a --- /dev/null +++ b/templates/cloudron-app/CloudronManifest.json @@ -0,0 +1,20 @@ +{ + "manifestVersion": 2, + "id": "{{APP_ID}}", + "title": "{{APP_TITLE}}", + "author": "Known Element Packaging Team", + "tagline": "TODO: Short one-line pitch", + "description": "TODO: Comprehensive description for the Cloudron App Store entry.", + "changelog": "Initial scaffold", + "website": "{{APP_WEBSITE}}", + "supportUrl": "{{APP_ISSUE}}", + "sourceUrl": "{{APP_REPO}}", + "version": "0.1.0", + "tags": {{APP_TAGS}}, + "healthCheckPath": "/", + "memoryLimit": 536870912, + "httpPort": {{HTTP_PORT}}, + "addons": { + "localstorage": {} + } +} diff --git a/templates/cloudron-app/Dockerfile b/templates/cloudron-app/Dockerfile new file mode 100644 index 0000000..11ebb4a --- /dev/null +++ b/templates/cloudron-app/Dockerfile @@ -0,0 +1,22 @@ +# syntax=docker/dockerfile:1 +FROM {{BASE_IMAGE}} + +LABEL org.opencontainers.image.source="{{APP_REPO}}" +LABEL org.opencontainers.image.description="Cloudron package for {{APP_TITLE}}" + +ARG APP_VERSION +ENV APP_VERSION=${APP_VERSION:-latest} + +# Copy application source into image at build time +# Replace this with a multi-stage build if upstream provides Docker images. +COPY ./app /app/code + +# Copy start script and make it executable +COPY ./start.sh /app/pkg/start.sh +RUN chmod +x /app/pkg/start.sh + +# Cloudron expects all processes to run as cloudron user +USER cloudron +WORKDIR /app/code + +CMD ["/app/pkg/start.sh"] diff --git a/templates/cloudron-app/README.md b/templates/cloudron-app/README.md new file mode 100644 index 0000000..ac30fae --- /dev/null +++ b/templates/cloudron-app/README.md @@ -0,0 +1,20 @@ +# {{APP_TITLE}} on Cloudron + +- **Upstream repository**: {{APP_REPO}} +- **Implementation issue**: {{APP_ISSUE}} +- **Status**: Draft scaffolding generated on $(date -u +"%Y-%m-%dT%H:%M:%SZ") + +## Packaging Checklist + +1. Review upstream deployment requirements and map them to Cloudron services (database, cache, object storage, workers). +2. Update `Dockerfile` with the correct build steps and runtime dependencies. +3. Implement `start.sh` to configure the app from Cloudron-provided environment variables and launch the primary process. +4. Edit `CloudronManifest.json` with accurate metadata, permissions, ports, addons, and health checks. +5. Add integration and smoke tests under `test/` to validate the package. +6. Document manual configuration steps, migration requirements, and known gaps in this README. + +## Notes + +- Replace the placeholder long-running process in `start.sh`. +- Populate the `app/` directory with the application build artefacts or git submodules. +- Use the shared packaging container (`docker/packager`) to run `cloudron build` and `cloudron install` so the host remains clean. diff --git a/templates/cloudron-app/app/.gitkeep b/templates/cloudron-app/app/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/templates/cloudron-app/start.sh b/templates/cloudron-app/start.sh new file mode 100644 index 0000000..8fdf09b --- /dev/null +++ b/templates/cloudron-app/start.sh @@ -0,0 +1,8 @@ +#!/bin/bash +set -euo pipefail + +# Cloudron injects configuration via environment variables and files under /run +# Use this script to render config files and launch the upstream service. + +# TODO: Replace the command below with the correct process supervisor. +exec /bin/sh -c "echo 'Replace start.sh with application startup logic for {{APP_TITLE}}' && sleep infinity" diff --git a/templates/cloudron-app/test/smoke.sh b/templates/cloudron-app/test/smoke.sh new file mode 100644 index 0000000..ebd1134 --- /dev/null +++ b/templates/cloudron-app/test/smoke.sh @@ -0,0 +1,16 @@ +#!/bin/bash +set -euo pipefail + +# Basic container reachability check executed inside the packaging container. +# Replace curl target with an endpoint exposed by the app once the package is functional. +cloudron_app_url=${CLOUDRON_APP_ORIGIN:-"http://localhost"} + +http_code=$(curl -s -o /tmp/smoke.log -w "%{http_code}" "${cloudron_app_url}") + +if [[ "${http_code}" != "200" ]]; then + echo "Unexpected HTTP status: ${http_code}" >&2 + cat /tmp/smoke.log >&2 + exit 1 +fi + +echo "Smoke test passed"