v0.1.4 — prebuilt Docker image on GHCR (closes #5)

Adds a GitHub Actions workflow that builds and pushes the Docker image
to ghcr.io/rgjorge/containerflow on every tag push, so end users can run
ContainerFlow without cloning the repo or building locally.

- New workflow: .github/workflows/docker-release.yml
- docker-compose.yml: uses the prebuilt image from GHCR by default
- New docker-compose.local.yml: override for building from source (devs)
- .env.example: simplified + adds COMPOSE_FILE toggle for local build
- README EN + ES: quick-start updated to no-clone flow
- .gitignore: ignore task/ planning notes dir
This commit is contained in:
RGJorge
2026-05-16 01:26:28 +00:00
parent dd6d2599f0
commit 2a660c1828
8 changed files with 127 additions and 45 deletions
+23 -37
View File
@@ -1,60 +1,46 @@
# ──────────────────────────────────────────────────────────────
# Servidor
# Server
# ──────────────────────────────────────────────────────────────
# Puerto del servidor (por defecto: 9470)
PORT=9470
# Token de autenticacion — dejar vacio para acceso solo en localhost (sin login)
# Poner un valor para activar auth + acceso remoto (0.0.0.0)
# Auth token. Empty = localhost only, no login.
# Set a value = login enabled + remote access (0.0.0.0).
AUTH_TOKEN=
# ──────────────────────────────────────────────────────────────
# Persistencia
# Persistence
# ──────────────────────────────────────────────────────────────
# Directorio donde se guardan archivos persistentes (SQLite de stats,
# config Discord, container settings, posiciones de nodos, env file overrides).
# Default nativo: ./data (relativo al cwd). En docker-compose.yml se setea
# a /app/data (montado en el volumen containerflow-data).
# El directorio se crea automaticamente al startup si no existe.
# Where SQLite, configs, node positions and env file overrides are stored.
# Default native: ./data. In docker: /app/data (containerflow-data volume).
# DATA_DIR=/app/data
# ──────────────────────────────────────────────────────────────
# Acceso a compose files (rebuild / remove)
# Compose file access (rebuild / remove)
# ──────────────────────────────────────────────────────────────
# Path adicional a montar en el container de ContainerFlow para que
# pueda leer compose files fuera de los defaults (/home, /opt, /srv, /root).
# Solo necesario si tus proyectos viven en una ruta no estandar.
# Ejemplo: HOST_PROJECTS_DIR=/data/apps
# Extra host path to mount so rebuild/remove can read compose files
# outside /home, /opt, /srv, /root. Example: /data/apps
# HOST_PROJECTS_DIR=
# ──────────────────────────────────────────────────────────────
# Control de acceso por path (multi-usuario)
# Access control (multi-tenant)
# ──────────────────────────────────────────────────────────────
# Lista separada por ":" de prefijos donde se permiten acciones
# (start/stop/restart/rebuild/remove/exec). Visualizacion, stats y
# logs siempre disponibles para todos los containers.
#
# Vacio = modo permisivo (todas las acciones permitidas).
# Con valores = modo estricto (containers fuera de estas rutas
# aparecen con candado y acciones deshabilitadas).
#
# Ejemplo single-user:
# ALLOWED_PATHS=/home/jorge
#
# Ejemplo multi-path:
# ALLOWED_PATHS=/home/jorge:/srv/myapp:/opt/legacy
# Empty = permissive (all actions allowed).
# Set = strict (only containers under these paths are actionable; rest locked).
# Colon-separated. Example: /home/jorge:/srv/myapp
# ALLOWED_PATHS=
# Solo aplica cuando ALLOWED_PATHS esta activo. Si ALLOWED_PATHS esta
# vacio, esta variable no tiene efecto (todo es accionable por default).
#
# Cuando ALLOWED_PATHS esta activo, controla si containers no-compose
# (corridos con `docker run` directo, sin labels de compose) permiten
# acciones:
# false (default) = bloqueados, aparecen con candado
# true = permitidos (util para watchtower, traefik, etc.)
# Only applies when ALLOWED_PATHS is active.
# false = block actions on non-compose containers.
# true = allow them (useful for watchtower, traefik, etc.).
# ALLOW_NON_COMPOSE=false
# ──────────────────────────────────────────────────────────────
# Dev mode (build from source instead of pulling the image)
# ──────────────────────────────────────────────────────────────
# Uncomment, then run: docker compose up -d --build
# COMPOSE_FILE=docker-compose.yml:docker-compose.local.yml
+48
View File
@@ -0,0 +1,48 @@
name: Docker Release
on:
push:
tags:
- 'v*'
permissions:
contents: read
packages: write
jobs:
build-and-push:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Login to GitHub Container Registry
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Extract metadata (tags, labels)
id: meta
uses: docker/metadata-action@v5
with:
images: ghcr.io/${{ github.repository_owner }}/containerflow
tags: |
type=ref,event=tag
type=semver,pattern={{version}}
type=semver,pattern={{major}}.{{minor}}
type=raw,value=latest
- name: Build and push
uses: docker/build-push-action@v5
with:
context: .
push: true
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
cache-from: type=gha
cache-to: type=gha,mode=max
+3
View File
@@ -18,3 +18,6 @@ recomendaciones.md
docs/reddit.md
# AI assistant context — internal, not for public repo
CLAUDE.md
# Planning notes — internal, not for public repo
task/
+17 -3
View File
@@ -29,16 +29,30 @@ Las herramientas existentes te muestran números. ContainerFlow además:
## Quick start
No necesitas clonar el repo. Descarga la imagen pre-built desde GHCR:
```bash
git clone https://github.com/RGJorge/containerflow.git
cd containerflow
curl -O https://raw.githubusercontent.com/RGJorge/ContainerFlow/main/docker-compose.yml
curl -O https://raw.githubusercontent.com/RGJorge/ContainerFlow/main/.env.example
cp .env.example .env
docker compose up -d
```
Abre `http://localhost:9470`. Listo.
Para desarrollo nativo (hot reload): `bun install && bun run dev`.
### Build desde source
Si clonaste el repo y querés buildear local (porque modificaste el código):
```bash
git clone https://github.com/RGJorge/containerflow.git
cd containerflow
cp .env.example .env
# En .env, descomenta: COMPOSE_FILE=docker-compose.yml:docker-compose.local.yml
docker compose up -d --build
```
Para desarrollo nativo (hot reload, sin Docker): `bun install && bun run dev`.
## Documentación
+17 -3
View File
@@ -29,16 +29,30 @@ Existing tools show you numbers. ContainerFlow also:
## Quick start
No clone needed. Pull the prebuilt image from GHCR:
```bash
git clone https://github.com/RGJorge/containerflow.git
cd containerflow
curl -O https://raw.githubusercontent.com/RGJorge/ContainerFlow/main/docker-compose.yml
curl -O https://raw.githubusercontent.com/RGJorge/ContainerFlow/main/.env.example
cp .env.example .env
docker compose up -d
```
Open `http://localhost:9470`. Done.
For native development (hot reload): `bun install && bun run dev`.
### Build from source instead
If you cloned the repo and want to build locally (e.g. you modified the code):
```bash
git clone https://github.com/RGJorge/containerflow.git
cd containerflow
cp .env.example .env
# In .env, uncomment: COMPOSE_FILE=docker-compose.yml:docker-compose.local.yml
docker compose up -d --build
```
For native development (hot reload, no Docker): `bun install && bun run dev`.
## Documentation
+15
View File
@@ -0,0 +1,15 @@
# Override compose file for local development / building from source.
# Activated via COMPOSE_FILE env var in .env (see .env.example).
#
# Usage:
# 1. In .env, set: COMPOSE_FILE=docker-compose.yml:docker-compose.local.yml
# 2. Run: docker compose up -d --build
#
# This overrides the `image:` from docker-compose.yml with a local build,
# tagging it as `containerflow:local` so it's distinguishable from
# prebuilt versions.
services:
containerflow:
build: .
image: containerflow:local
+3 -1
View File
@@ -1,6 +1,8 @@
services:
containerflow:
build: .
# Pulls the latest prebuilt image from GHCR.
# To build from source locally instead, see docker-compose.local.yml + COMPOSE_FILE in .env.
image: ghcr.io/rgjorge/containerflow:latest
ports:
- "${EXTERNAL_PORT:-9470}:9470"
volumes:
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "containerflow",
"version": "0.1.3",
"version": "0.1.4",
"license": "AGPL-3.0-or-later",
"author": "Jorge Gonzalez D. (RGJorge)",
"type": "module",