feat(rathole): add clean Cloudron package using base 5.0.0 with server/client config and health endpoint
This commit is contained in:
7
CloudronPackages/Rathole/.dockerignore
Normal file
7
CloudronPackages/Rathole/.dockerignore
Normal file
@@ -0,0 +1,7 @@
|
||||
.git
|
||||
.gitignore
|
||||
*.log
|
||||
dist
|
||||
build
|
||||
.DS_Store
|
||||
|
18
CloudronPackages/Rathole/CloudronManifest.json
Normal file
18
CloudronPackages/Rathole/CloudronManifest.json
Normal file
@@ -0,0 +1,18 @@
|
||||
{
|
||||
"manifestVersion": 2,
|
||||
"id": "io.knel.rathole",
|
||||
"title": "Rathole",
|
||||
"author": "KNEL",
|
||||
"description": "A reverse proxy that enables secure tunnels between local services and the internet.",
|
||||
"website": "https://github.com/rathole-org/rathole",
|
||||
"contactEmail": "admin@knownelement.com",
|
||||
"version": "0.1.0",
|
||||
"changelog": "Initial Cloudron package (server/client configurable).",
|
||||
"healthCheckPath": "/",
|
||||
"httpPort": 3000,
|
||||
"addons": {
|
||||
"localstorage": {}
|
||||
},
|
||||
"tags": ["network", "tunnel", "reverse-proxy"]
|
||||
}
|
||||
|
43
CloudronPackages/Rathole/Dockerfile
Normal file
43
CloudronPackages/Rathole/Dockerfile
Normal file
@@ -0,0 +1,43 @@
|
||||
FROM cloudron/base:5.0.0
|
||||
|
||||
ARG RATHOLE_VERSION=v0.5.0
|
||||
ARG ARCH=x86_64-unknown-linux-gnu
|
||||
|
||||
USER root
|
||||
RUN apt-get update \
|
||||
&& apt-get install -y --no-install-recommends curl ca-certificates tar \
|
||||
&& rm -rf /var/lib/apt/lists/*
|
||||
|
||||
WORKDIR /app/pkg
|
||||
|
||||
# Download Rathole release binary (adjust version/arch via build args)
|
||||
RUN set -eux; \
|
||||
url="https://github.com/rathole-org/rathole/releases/download/${RATHOLE_VERSION}/rathole-${ARCH}.tar.gz"; \
|
||||
echo "Fetching ${url}"; \
|
||||
curl -fsSL "$url" -o rathole.tar.gz; \
|
||||
tar -xzf rathole.tar.gz; \
|
||||
rm rathole.tar.gz; \
|
||||
mv rathole /app/pkg/rathole; \
|
||||
chmod +x /app/pkg/rathole; \
|
||||
chown cloudron:cloudron /app/pkg/rathole
|
||||
|
||||
# Start script
|
||||
COPY start.sh /app/pkg/start.sh
|
||||
RUN chmod +x /app/pkg/start.sh && chown cloudron:cloudron /app/pkg/start.sh
|
||||
|
||||
WORKDIR /app/code
|
||||
RUN mkdir -p /app/data && chown -R cloudron:cloudron /app/data
|
||||
|
||||
USER cloudron
|
||||
|
||||
ENV APP_PORT=3000 \
|
||||
RATHOLE_MODE=server \
|
||||
RATHOLE_CONFIG_PATH=/app/data/rathole.toml
|
||||
|
||||
EXPOSE 3000
|
||||
|
||||
HEALTHCHECK --interval=30s --timeout=5s --start-period=20s --retries=3 \
|
||||
CMD curl -fsS http://127.0.0.1:${APP_PORT}/ || exit 1
|
||||
|
||||
CMD ["/app/pkg/start.sh"]
|
||||
|
37
CloudronPackages/Rathole/README.md
Normal file
37
CloudronPackages/Rathole/README.md
Normal file
@@ -0,0 +1,37 @@
|
||||
# Rathole (Cloudron Package)
|
||||
|
||||
Rathole is a reverse proxy that provides secure tunnels for local services.
|
||||
Upstream project: https://github.com/rathole-org/rathole
|
||||
|
||||
This Cloudron package runs Rathole and a lightweight HTTP health endpoint.
|
||||
|
||||
## Defaults
|
||||
- Mode: `server` (set `RATHOLE_MODE=client` to run client)
|
||||
- Config path: `/app/data/rathole.toml`
|
||||
- Health port: `3000` (Cloudron `httpPort`)
|
||||
|
||||
## Configuration
|
||||
- Put your Rathole TOML config at `/app/data/rathole.toml`, or provide it via the `RATHOLE_CONFIG` environment variable on first start.
|
||||
- Example minimal server config is auto-generated if none exists.
|
||||
|
||||
## Build (inside packaging container)
|
||||
```
|
||||
scripts/packaging-up.sh
|
||||
scripts/packaging-exec.sh "docker build -t rathole:dev CloudronPackages/Rathole"
|
||||
```
|
||||
|
||||
## Run locally (inside packaging container)
|
||||
```
|
||||
scripts/packaging-exec.sh "docker run --rm -p 3000:3000 -p 2333:2333 -v rathole-data:/app/data rathole:dev"
|
||||
```
|
||||
|
||||
Note: expose additional service ports as needed per your TOML.
|
||||
|
||||
## Deploy to Cloudron
|
||||
Use Cloudron CLI from inside the packaging container:
|
||||
```
|
||||
scripts/packaging-enter.sh
|
||||
cloudron login
|
||||
cloudron install --image rathole:dev
|
||||
```
|
||||
|
43
CloudronPackages/Rathole/start.sh
Normal file
43
CloudronPackages/Rathole/start.sh
Normal file
@@ -0,0 +1,43 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
log() { echo "[rathole] $(date -Is) $*"; }
|
||||
abort() { echo "[rathole] ERROR: $*" >&2; exit 1; }
|
||||
|
||||
: "${APP_PORT:=3000}"
|
||||
: "${RATHOLE_MODE:=server}" # server|client
|
||||
: "${RATHOLE_CONFIG_PATH:=/app/data/rathole.toml}"
|
||||
|
||||
# Ensure data dir exists
|
||||
mkdir -p /app/data
|
||||
chown -R cloudron:cloudron /app/data || true
|
||||
|
||||
# If RATHOLE_CONFIG is provided, write it to config path if file not present
|
||||
if [[ ! -f "$RATHOLE_CONFIG_PATH" && -n "${RATHOLE_CONFIG:-}" ]]; then
|
||||
log "Writing config from RATHOLE_CONFIG env to ${RATHOLE_CONFIG_PATH}"
|
||||
printf "%s\n" "${RATHOLE_CONFIG}" > "$RATHOLE_CONFIG_PATH"
|
||||
fi
|
||||
|
||||
# If still no config, create a minimal example for server mode
|
||||
if [[ ! -f "$RATHOLE_CONFIG_PATH" ]]; then
|
||||
log "No config found. Writing a minimal example config (server). Adjust in /app/data/rathole.toml"
|
||||
cat > "$RATHOLE_CONFIG_PATH" <<'TOML'
|
||||
# Minimal Rathole server config example
|
||||
[server]
|
||||
bind_addr = "0.0.0.0:2333"
|
||||
|
||||
# Define services below as needed, for example:
|
||||
# [server.services.echo]
|
||||
# type = "tcp"
|
||||
# local_addr = "127.0.0.1:7"
|
||||
TOML
|
||||
fi
|
||||
|
||||
# Background: lightweight HTTP health endpoint
|
||||
python3 -m http.server "$APP_PORT" --bind 0.0.0.0 >/dev/null 2>&1 &
|
||||
HEALTH_PID=$!
|
||||
log "Started health endpoint on :${APP_PORT} (pid ${HEALTH_PID})"
|
||||
|
||||
log "Launching rathole in ${RATHOLE_MODE} mode with config ${RATHOLE_CONFIG_PATH}"
|
||||
exec /app/pkg/rathole "$RATHOLE_MODE" -c "$RATHOLE_CONFIG_PATH"
|
||||
|
Reference in New Issue
Block a user