FX 0.9.48 ("poor man's function as a service") as the 13th package:
pre-compiled goreleaser release binary with sha256 pin on
cloudron/base:4.0.0. fx is a CLI with no user concept, so the package
is a workstation: pinned binary + persistent workspace
(functions/ssh/kube) driven from the Cloudron web terminal, with an
auth-proxied landing page as the only HTTP surface (httpAuth proxy).
Deploys target remote Docker hosts over key-based SSH or Kubernetes
via FX_KUBECONF. Build green; runtime smoke (landing page, workspace
seeding, fx -v) green. Docs gardened to 13 packages.
Ticket: https://projects.knownelement.com/issues/640
102 lines
4.1 KiB
Markdown
102 lines
4.1 KiB
Markdown
# FX — Cloudron Package
|
|
|
|
[fx](https://github.com/metrue/fx) is "poor man's function as a service":
|
|
a CLI that turns a stateless function file (JavaScript, Python, Go, Ruby,
|
|
Java, PHP, Perl, Crystal, Rust, Julia, D) into a running HTTP service on
|
|
your own Docker host or Kubernetes cluster, in seconds. fx packages the
|
|
function, ships it to the target over SSH (key-based) or the K8s API, and
|
|
the target runs the container.
|
|
|
|
This package is an **fx workstation**: the pinned fx binary plus a
|
|
persistent workspace, driven from the Cloudron web terminal. Cloudron app
|
|
containers have no Docker daemon (and no access to the host's), so
|
|
deploys always target a **remote** Docker host or a Kubernetes cluster —
|
|
never the app container itself.
|
|
|
|
## Packaging overview
|
|
|
|
| Aspect | Choice |
|
|
|--------|--------|
|
|
| Pattern | Pre-compiled binaries (JOURNAL pattern #5) |
|
|
| Base image | `cloudron/base:4.0.0` (Ubuntu 22.04; the goreleaser binary is glibc-built) |
|
|
| Upstream binary | `fx_0.9.48-alpha.d91a7a0_Tux_64-bit.tar.gz` (linux/amd64), sha256-pinned in the Dockerfile (checksum from upstream `checksums.txt`) |
|
|
| Addons | `localstorage` only (workspace persistence; no database) |
|
|
| Auth | No user concept → `httpAuth.type = proxy` (see below) |
|
|
| Runtime | `start.sh` seeds the workspace and serves the landing page; fx runs on demand from the terminal |
|
|
|
|
Why pre-compiled: the last published release is `0.9.48-alpha.d91a7a0`
|
|
(2021-06-10) — the same artifact the official `scripts/install.sh`
|
|
installs, and the binary reports version `0.9.48`. Repo master (2023) has
|
|
no newer release; building the go 1.12-era, packr-using codebase from
|
|
source would buy nothing over the official binary.
|
|
|
|
## Authentication (auth gate verdict: proxy)
|
|
|
|
- fx has **no user concept**: no web UI, no accounts, no SSO hooks — it
|
|
is a terminal tool.
|
|
- The manifest declares `httpAuth: {"type": "proxy"}`: Cloudron's auth
|
|
proxy gates the landing page, which is the only HTTP surface this app
|
|
has. Access to the terminal (and therefore the workspace and SSH keys)
|
|
is Cloudron's app access list — restrict the app to the admins who
|
|
should wield it.
|
|
- The SSH keys stored in `/app/data/ssh/` are the credentials for the
|
|
*deploy targets*; guard them with the app's access list and file
|
|
permissions.
|
|
|
|
## Usage
|
|
|
|
1. Open the app's **web terminal** (or `cloudron exec`).
|
|
2. Drop an SSH private key into `/app/data/ssh/` (e.g. via the file
|
|
manager) for your Docker target, or a kubeconfig into
|
|
`/app/data/kube/` for a Kubernetes target.
|
|
3. Deploy:
|
|
|
|
```bash
|
|
fx up --host deploy@example.com --ssh_key /app/data/ssh/id_rsa \
|
|
--name hello /app/data/functions/hello.js
|
|
|
|
fx list --host deploy@example.com # deployed services
|
|
fx down --host deploy@example.com hello
|
|
```
|
|
|
|
Kubernetes:
|
|
|
|
```bash
|
|
export FX_KUBECONF=/app/data/kube/config
|
|
fx up --name hello /app/data/functions/hello.py
|
|
```
|
|
|
|
The two seeded starters (`hello.js`, `hello.py`) use the exact upstream
|
|
example shapes: a Koa-style `ctx` handler for JS, a plain `fx(request)`
|
|
callable for Python.
|
|
|
|
Knobs: `FX_HOST` (default deploy target, `<user>@<host>`) and
|
|
`FX_KUBECONF` (path to kubeconfig) can be set once via Cloudron's
|
|
environment settings instead of per-command flags — see `.env.example`.
|
|
|
|
## Ports
|
|
|
|
| Port | Type | Purpose |
|
|
|------|------|---------|
|
|
| 8000 | `httpPort` | Landing/usage page + platform health check (behind Cloudron auth proxy) |
|
|
|
|
fx itself listens on nothing; deployed functions listen on their target
|
|
host, outside this app.
|
|
|
|
## Build & test
|
|
|
|
```bash
|
|
docker build --cgroup-parent ukrrs-batch.slice -t fx-cloudron:test Package-Workspace/DevOps-Tools/fx/
|
|
docker run --rm --entrypoint /usr/local/bin/fx fx-cloudron:test -v # -> 0.9.48
|
|
```
|
|
|
|
## Files
|
|
|
|
- `Dockerfile` — pinned release download + sha256 gate on cloudron/base:4.0.0
|
|
- `CloudronManifest.json` — manifestVersion 2, httpAuth proxy, localstorage only
|
|
- `start.sh` — workspace seeding + landing-page server (committed executable)
|
|
- `status.html` — auth-proxied landing/usage page
|
|
- `.env.example` — FX_HOST / FX_KUBECONF knobs
|
|
- `.dockerignore` — excludes the cloned `repo/` from the build context
|
|
- `logo.png` — 256x256 monogram (fx ships no logo asset)
|