diff --git a/.env.example b/.env.example index 62c26c8..00ff663 100644 --- a/.env.example +++ b/.env.example @@ -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 diff --git a/.github/workflows/docker-release.yml b/.github/workflows/docker-release.yml new file mode 100644 index 0000000..92c9b6b --- /dev/null +++ b/.github/workflows/docker-release.yml @@ -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 diff --git a/.gitignore b/.gitignore index 7630d56..ebed4cf 100644 --- a/.gitignore +++ b/.gitignore @@ -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/ diff --git a/README.es.md b/README.es.md index 4c10456..02ea997 100644 --- a/README.es.md +++ b/README.es.md @@ -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 diff --git a/README.md b/README.md index 76e0407..c539cc0 100644 --- a/README.md +++ b/README.md @@ -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 diff --git a/docker-compose.local.yml b/docker-compose.local.yml new file mode 100644 index 0000000..749d163 --- /dev/null +++ b/docker-compose.local.yml @@ -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 diff --git a/docker-compose.yml b/docker-compose.yml index 578b567..ad90fae 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -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: diff --git a/package.json b/package.json index f6da914..2ecb38e 100644 --- a/package.json +++ b/package.json @@ -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",