This commit is contained in:
2025-10-28 19:57:51 -05:00
parent 9f17603c1e
commit 65b278e33f
27 changed files with 875 additions and 227 deletions

View File

@@ -0,0 +1,72 @@
# TSYSDevStack SupportStack Demo - Environment Settings
# Auto-generated file for MVP components: docker-socket-proxy, homepage, wakaapi
# General Settings
TSYSDEVSTACK_ENVIRONMENT=demo
TSYSDEVSTACK_PROJECT_NAME=TSYSDevStack-SupportStack-Demo
TSYSDEVSTACK_NETWORK_NAME=tsysdevstack_supportstack_network
# User/Group Settings
TSYSDEVSTACK_UID=1000
TSYSDEVSTACK_GID=1000
TSYSDEVSTACK_DOCKER_GID=996
# Docker Socket Proxy Settings
DOCKER_SOCKET_PROXY_NAME=tsysdevstack-supportstack-demo-docker-socket-proxy
DOCKER_SOCKET_PROXY_IMAGE=tecnativa/docker-socket-proxy:0.1
DOCKER_SOCKET_PROXY_SOCKET_PATH=/var/run/docker.sock
DOCKER_SOCKET_PROXY_NETWORK=tsysdevstack_supportstack_network
# Docker API Permissions
DOCKER_SOCKET_PROXY_CONTAINERS=1
DOCKER_SOCKET_PROXY_IMAGES=1
DOCKER_SOCKET_PROXY_NETWORKS=1
DOCKER_SOCKET_PROXY_VOLUMES=1
DOCKER_SOCKET_PROXY_BUILD=1
DOCKER_SOCKET_PROXY_MANIFEST=1
DOCKER_SOCKET_PROXY_PLUGINS=1
DOCKER_SOCKET_PROXY_VERSION=1
# Homepage Settings
HOMEPAGE_NAME=tsysdevstack-supportstack-demo-homepage
HOMEPAGE_IMAGE=gethomepage/homepage:latest
HOMEPAGE_PORT=4000
HOMEPAGE_NETWORK=tsysdevstack_supportstack_network
HOMEPAGE_CONFIG_PATH=./config/homepage
# WakaAPI Settings
WAKAAPI_NAME=tsysdevstack-supportstack-demo-wakaapi
WAKAAPI_IMAGE=n1try/wakapi:latest
WAKAAPI_PORT=4001
WAKAAPI_NETWORK=tsysdevstack_supportstack_network
WAKAAPI_CONFIG_PATH=./config/wakaapi
WAKAAPI_WAKATIME_API_KEY=
WAKAAPI_DATABASE_PATH=./config/wakaapi/database
# Resource Limits (for single user demo capacity)
# docker-socket-proxy
DOCKER_SOCKET_PROXY_MEM_LIMIT=128m
DOCKER_SOCKET_PROXY_CPU_LIMIT=0.25
# homepage
HOMEPAGE_MEM_LIMIT=256m
HOMEPAGE_CPU_LIMIT=0.5
# wakaapi
WAKAAPI_MEM_LIMIT=192m
WAKAAPI_CPU_LIMIT=0.3
# Health Check Settings
HEALTH_CHECK_INTERVAL=30s
HEALTH_CHECK_TIMEOUT=10s
HEALTH_CHECK_START_PERIOD=30s
HEALTH_CHECK_RETRIES=3
# Timeouts
DOCKER_SOCKET_PROXY_CONNECTION_TIMEOUT=30s
HOMEPAGE_STARTUP_TIMEOUT=60s
WAKAAPI_INITIALIZATION_TIMEOUT=45s
DOCKER_COMPOSE_STARTUP_TIMEOUT=120s
# Localhost binding
BIND_ADDRESS=127.0.0.1

View File

@@ -0,0 +1,40 @@
---
# Homepage configuration - Enable Docker service discovery
title: TSYSDevStack SupportStack
# Docker configuration - Enable automatic service discovery
docker:
socket: /var/run/docker.sock
# Services configuration - Enable Docker discovery
services: []
# Bookmarks
bookmarks:
- Developer:
- Github:
href: https://github.com/
abbr: GH
- Social:
- Reddit:
href: https://reddit.com/
abbr: RE
- Entertainment:
- YouTube:
href: https://youtube.com/
abbr: YT
# Widgets
widgets:
- resources:
cpu: true
memory: true
disk: /
- search:
provider: duckduckgo
target: _blank
# Proxy configuration
proxy:
allowedHosts: "*"
allowedHeaders: "*"

View File

@@ -0,0 +1,3 @@
---
# Docker configuration for Homepage service discovery
socket: /var/run/docker.sock

View File

@@ -0,0 +1,8 @@
---
# Services configuration for Homepage Docker discovery
# Automatically discover Docker services with Homepage labels
- Support Stack:
- tsysdevstack-docker-socket-proxy
- tsysdevstack-homepage
- tsysdevstack-wakaapi

View File

@@ -1,25 +1,42 @@
---
# Homepage configuration
title: TSYSDevStack SupportStack title: TSYSDevStack SupportStack
background: /images/background-1.jpg background:
headerStyle: boxed headerStyle: boxed
layout:
Support Stack:
style: row
columns: 4
items:
- type: docker
name: Docker Socket Proxy
icon: docker.png
href: http://tsysdevstack-docker-socket-proxy:2375
container: tsysdevstack-docker-socket-proxy
showStats: true
- type: wakapi
name: WakaAPI
icon: wakatime.png
href: http://127.0.0.1:4001
container: tsysdevstack-wakaapi
showStats: true
# Configure allowed hosts for the proxy # Docker configuration
docker:
socket: /var/run/docker.sock
# Services configuration
services: []
# Bookmarks
bookmarks:
- Developer:
- Github:
href: https://github.com/
abbr: GH
- Social:
- Reddit:
href: https://reddit.com/
abbr: RE
- Entertainment:
- YouTube:
href: https://youtube.com/
abbr: YT
# Widgets
widgets:
- resources:
cpu: true
memory: true
disk: /
- search:
provider: duckduckgo
target: _blank
# Proxy configuration
proxy: proxy:
allowedHosts: "*" allowedHosts: "*"
allowedHeaders: "*" allowedHeaders: "*"

View File

@@ -1,40 +0,0 @@
services:
docker-socket-proxy:
image: tecnativa/docker-socket-proxy:0.1
container_name: tsysdevstack-docker-socket-proxy
restart: unless-stopped
networks:
- tsysdevstack_supportstack_network
environment:
CONTAINERS: "1"
IMAGES: "1"
NETWORKS: "1"
VOLUMES: "1"
BUILD: "1"
MANIFEST: "1"
PLUGINS: "1"
VERSION: "1"
volumes:
- /var/run/docker.sock:/var/run/docker.sock
mem_limit: 128m
mem_reservation: 128m
deploy:
resources:
limits:
cpus: '0.25'
memory: 128M
reservations:
cpus: '0.25'
memory: 128M
healthcheck:
test: ["CMD", "wget", "--quiet", "--tries=1", "--spider", "http://localhost/"]
interval: 30s
timeout: 10s
start_period: 30s
retries: 3
# Note: No ports exposed as per requirement for internal network only
networks:
tsysdevstack_supportstack_network:
external: true
name: tsysdevstack_supportstack_network

View File

@@ -1,45 +0,0 @@
services:
homepage:
image: gethomepage/homepage:latest
container_name: tsysdevstack-homepage
restart: unless-stopped
networks:
- tsysdevstack_supportstack_network
ports:
- "127.0.0.1:4000:3000"
environment:
- PORT=3000
- HOMEPAGE_URL=http://localhost:4000
- BASE_URL=http://localhost:4000
- HOMEPAGE_ALLOWED_HOSTS=localhost:4000,127.0.0.1:4000
volumes:
- ./config/homepage:/app/config
- /var/run/docker.sock:/var/run/docker.sock:ro # For Docker integration
mem_limit: 256m
mem_reservation: 128m
deploy:
resources:
limits:
cpus: '0.5'
memory: 256M
reservations:
cpus: '0.25'
memory: 128M
healthcheck:
test: ["CMD", "wget", "--quiet", "--tries=1", "--spider", "http://localhost:3000/api/health"]
interval: 30s
timeout: 10s
start_period: 60s # Longer start period for homepage
retries: 3
# Homepage integration labels for automatic discovery
labels:
homepage.group: "Support Stack"
homepage.name: "Homepage Dashboard"
homepage.icon: "homepage.png"
homepage.href: "http://127.0.0.1:4000"
homepage.description: "Homepage dashboard for Support Stack"
networks:
tsysdevstack_supportstack_network:
external: true
name: tsysdevstack_supportstack_network

View File

@@ -1,51 +0,0 @@
services:
wakaapi:
image: n1try/wakapi:latest
container_name: tsysdevstack-wakaapi
restart: unless-stopped
networks:
- tsysdevstack_supportstack_network
ports:
- "127.0.0.1:4001:3000"
environment:
- WAKAPI_PASSWORD_SALT=TSYSDevStackSupportStackDemoSalt12345678
- WAKAPI_DB_TYPE=sqlite3
- WAKAPI_DB_NAME=/data/wakapi.db
- WAKAPI_PORT=3000
- WAKAPI_PUBLIC_URL=http://127.0.0.1:4001
- WAKAPI_ALLOW_SIGNUP=true
- WAKAPI_WAKATIME_API_KEY=${WAKAAPI_WAKATIME_API_KEY:-""}
volumes:
- wakaapi_data:/data
mem_limit: 192m
mem_reservation: 128m
deploy:
resources:
limits:
cpus: '0.3'
memory: 192M
reservations:
cpus: '0.2'
memory: 128M
healthcheck:
test: ["CMD", "wget", "--quiet", "--tries=1", "--spider", "http://localhost:3000/api"]
interval: 30s
timeout: 10s
start_period: 60s # Longer start period for wakaapi
retries: 5
# Homepage integration labels for automatic discovery
labels:
homepage.group: "Development Tools"
homepage.name: "WakaAPI"
homepage.icon: "wakatime.png"
homepage.href: "http://127.0.0.1:4001"
homepage.description: "WakaTime API for coding metrics"
networks:
tsysdevstack_supportstack_network:
external: true
name: tsysdevstack_supportstack_network
volumes:
wakaapi_data:
name: wakaapi_data
external: true

View File

@@ -0,0 +1,49 @@
services:
docker-socket-proxy:
image: ${DOCKER_SOCKET_PROXY_IMAGE}
container_name: ${DOCKER_SOCKET_PROXY_NAME}
restart: unless-stopped
networks:
- tsysdevstack_supportstack_network
environment:
CONTAINERS: ${DOCKER_SOCKET_PROXY_CONTAINERS}
IMAGES: ${DOCKER_SOCKET_PROXY_IMAGES}
NETWORKS: ${DOCKER_SOCKET_PROXY_NETWORKS}
VOLUMES: ${DOCKER_SOCKET_PROXY_VOLUMES}
BUILD: ${DOCKER_SOCKET_PROXY_BUILD}
MANIFEST: ${DOCKER_SOCKET_PROXY_MANIFEST}
PLUGINS: ${DOCKER_SOCKET_PROXY_PLUGINS}
VERSION: ${DOCKER_SOCKET_PROXY_VERSION}
volumes:
- ${DOCKER_SOCKET_PROXY_SOCKET_PATH}:${DOCKER_SOCKET_PROXY_SOCKET_PATH}
mem_limit: ${DOCKER_SOCKET_PROXY_MEM_LIMIT}
mem_reservation: ${DOCKER_SOCKET_PROXY_MEM_LIMIT}
deploy:
resources:
limits:
cpus: '${DOCKER_SOCKET_PROXY_CPU_LIMIT}'
memory: ${DOCKER_SOCKET_PROXY_MEM_LIMIT}
reservations:
cpus: '${DOCKER_SOCKET_PROXY_CPU_LIMIT}'
memory: ${DOCKER_SOCKET_PROXY_MEM_LIMIT}
healthcheck:
test: ["CMD", "wget", "--quiet", "--tries=1", "--spider", "http://localhost/"]
interval: ${HEALTH_CHECK_INTERVAL}
timeout: ${HEALTH_CHECK_TIMEOUT}
start_period: ${HEALTH_CHECK_START_PERIOD}
retries: ${HEALTH_CHECK_RETRIES}
# Homepage integration labels for automatic discovery
labels:
homepage.group: "Support Stack"
homepage.name: "Docker Socket Proxy"
homepage.icon: "docker.png"
homepage.href: "http://${BIND_ADDRESS}:${HOMEPAGE_PORT}"
homepage.description: "Docker socket proxy for secure access"
homepage.type: "docker"
# NOTE: Docker-socket-proxy must run as root to configure HAProxy
# user: "${TSYSDEVSTACK_UID}:${TSYSDEVSTACK_DOCKER_GID}" # Read-only access to Docker socket
networks:
tsysdevstack_supportstack_network:
external: true
name: ${TSYSDEVSTACK_NETWORK_NAME}

View File

@@ -0,0 +1,47 @@
services:
homepage:
image: ${HOMEPAGE_IMAGE}
container_name: ${HOMEPAGE_NAME}
restart: unless-stopped
networks:
- tsysdevstack_supportstack_network
ports:
- "${BIND_ADDRESS}:${HOMEPAGE_PORT}:3000"
environment:
- PORT=3000
- HOMEPAGE_URL=http://${BIND_ADDRESS}:${HOMEPAGE_PORT}
- BASE_URL=http://${BIND_ADDRESS}:${HOMEPAGE_PORT}
- HOMEPAGE_ALLOWED_HOSTS=${BIND_ADDRESS}:${HOMEPAGE_PORT},localhost:${HOMEPAGE_PORT}
volumes:
- ${HOMEPAGE_CONFIG_PATH}:/app/config
- ${DOCKER_SOCKET_PROXY_SOCKET_PATH}:${DOCKER_SOCKET_PROXY_SOCKET_PATH}:ro # For Docker integration
mem_limit: ${HOMEPAGE_MEM_LIMIT}
mem_reservation: ${HOMEPAGE_MEM_LIMIT}
deploy:
resources:
limits:
cpus: '${HOMEPAGE_CPU_LIMIT}'
memory: ${HOMEPAGE_MEM_LIMIT}
reservations:
cpus: '${HOMEPAGE_CPU_LIMIT}'
memory: ${HOMEPAGE_MEM_LIMIT}
healthcheck:
test: ["CMD", "wget", "--quiet", "--tries=1", "--spider", "http://localhost:3000/api/health"]
interval: ${HEALTH_CHECK_INTERVAL}
timeout: ${HEALTH_CHECK_TIMEOUT}
start_period: ${HOMEPAGE_STARTUP_TIMEOUT} # Longer start period for homepage
retries: ${HEALTH_CHECK_RETRIES}
# Homepage integration labels for automatic discovery
labels:
homepage.group: "Support Stack"
homepage.name: "Homepage Dashboard"
homepage.icon: "homepage.png"
homepage.href: "http://${BIND_ADDRESS}:${HOMEPAGE_PORT}"
homepage.description: "Homepage dashboard for Support Stack"
homepage.type: "homepage"
user: "${TSYSDEVSTACK_UID}:${TSYSDEVSTACK_DOCKER_GID}" # Direct access to Docker socket for discovery
networks:
tsysdevstack_supportstack_network:
external: true
name: ${TSYSDEVSTACK_NETWORK_NAME}

View File

@@ -0,0 +1,53 @@
services:
wakaapi:
image: ${WAKAAPI_IMAGE}
container_name: ${WAKAAPI_NAME}
restart: unless-stopped
networks:
- tsysdevstack_supportstack_network
ports:
- "${BIND_ADDRESS}:${WAKAAPI_PORT}:3000"
environment:
- WAKAPI_PASSWORD_SALT=TSYSDevStackSupportStackDemoSalt12345678
- WAKAPI_DB_TYPE=sqlite3
- WAKAPI_DB_NAME=/data/wakapi.db
- WAKAPI_PORT=3000
- WAKAPI_PUBLIC_URL=http://${BIND_ADDRESS}:${WAKAAPI_PORT}
- WAKAPI_ALLOW_SIGNUP=true
- WAKAPI_WAKATIME_API_KEY=${WAKAAPI_WAKATIME_API_KEY:-""}
volumes:
- wakaapi_data:/data
mem_limit: ${WAKAAPI_MEM_LIMIT}
mem_reservation: ${WAKAAPI_MEM_LIMIT}
deploy:
resources:
limits:
cpus: '${WAKAAPI_CPU_LIMIT}'
memory: ${WAKAAPI_MEM_LIMIT}
reservations:
cpus: '${WAKAAPI_CPU_LIMIT}'
memory: ${WAKAAPI_MEM_LIMIT}
healthcheck:
test: ["CMD", "wget", "--quiet", "--tries=1", "--spider", "http://localhost:3000/api"]
interval: ${HEALTH_CHECK_INTERVAL}
timeout: ${HEALTH_CHECK_TIMEOUT}
start_period: ${WAKAAPI_INITIALIZATION_TIMEOUT} # Longer start period for wakaapi
retries: ${HEALTH_CHECK_RETRIES}
# Homepage integration labels for automatic discovery
labels:
homepage.group: "Development Tools"
homepage.name: "WakaAPI"
homepage.icon: "wakapi.png"
homepage.href: "http://${BIND_ADDRESS}:${WAKAAPI_PORT}"
homepage.description: "WakaTime API for coding metrics"
homepage.type: "wakapi"
user: "${TSYSDEVSTACK_UID}" # Regular user access for non-Docker containers
networks:
tsysdevstack_supportstack_network:
external: true
name: ${TSYSDEVSTACK_NETWORK_NAME}
volumes:
wakaapi_data:
name: ${WAKAAPI_NAME}_data
external: true

View File

@@ -7,8 +7,7 @@ set -e
# Load environment settings # Load environment settings
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
CONFIG_DIR="${SCRIPT_DIR}/config" ENV_FILE="${SCRIPT_DIR}/TSYSDevStack-SupportStack-Demo-Settings"
ENV_FILE="${CONFIG_DIR}/TSYSDevStack-SupportStack-Demo-Settings"
if [ ! -f "$ENV_FILE" ]; then if [ ! -f "$ENV_FILE" ]; then
echo "Error: Environment settings file not found at $ENV_FILE" echo "Error: Environment settings file not found at $ENV_FILE"
@@ -22,10 +21,14 @@ test_docker_socket_proxy() {
echo "Testing docker-socket-proxy availability and functionality..." echo "Testing docker-socket-proxy availability and functionality..."
# Check if the container exists and is running # Check if the container exists and is running
echo "Looking for container: $DOCKER_SOCKET_PROXY_NAME"
if docker ps | grep -q "$DOCKER_SOCKET_PROXY_NAME"; then if docker ps | grep -q "$DOCKER_SOCKET_PROXY_NAME"; then
echo "✓ docker-socket-proxy container is running" echo "✓ docker-socket-proxy container is running"
else else
echo "✗ docker-socket-proxy container is NOT running" echo "✗ docker-socket-proxy container is NOT running"
# Check if another container with similar name is running
echo "Checking all containers:"
docker ps | grep -i docker
return 1 return 1
fi fi

View File

@@ -7,8 +7,7 @@ set -e
# Load environment settings # Load environment settings
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
CONFIG_DIR="${SCRIPT_DIR}/config" ENV_FILE="${SCRIPT_DIR}/TSYSDevStack-SupportStack-Demo-Settings"
ENV_FILE="${CONFIG_DIR}/TSYSDevStack-SupportStack-Demo-Settings"
if [ ! -f "$ENV_FILE" ]; then if [ ! -f "$ENV_FILE" ]; then
echo "Error: Environment settings file not found at $ENV_FILE" echo "Error: Environment settings file not found at $ENV_FILE"

View File

@@ -7,8 +7,7 @@ set -e
# Load environment settings # Load environment settings
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
CONFIG_DIR="${SCRIPT_DIR}/config" ENV_FILE="${SCRIPT_DIR}/TSYSDevStack-SupportStack-Demo-Settings"
ENV_FILE="${CONFIG_DIR}/TSYSDevStack-SupportStack-Demo-Settings"
if [ ! -f "$ENV_FILE" ]; then if [ ! -f "$ENV_FILE" ]; then
echo "Error: Environment settings file not found at $ENV_FILE" echo "Error: Environment settings file not found at $ENV_FILE"

View File

@@ -0,0 +1,37 @@
#!/bin/bash
# Test to verify WakaAPI is discovered and displayed on homepage
# Following TDD: Write test → Execute test → Test fails → Write minimal code to pass test
set -e
echo "Testing WakaAPI discovery on homepage..."
# Check if WakaAPI container is running
if ! docker ps | grep -q "tsysdevstack-wakaapi"; then
echo "❌ WakaAPI container is not running"
exit 1
fi
# Check if homepage container is running
if ! docker ps | grep -q "tsysdevstack-homepage"; then
echo "❌ Homepage container is not running"
exit 1
fi
# Test if we can access WakaAPI directly
if ! curl -f -s "http://127.0.0.1:4001/" > /dev/null 2>&1; then
echo "❌ WakaAPI is not accessible at http://127.0.0.1:4001"
exit 1
fi
# Check if WakaAPI appears on the homepage
content=$(curl -s http://127.0.0.1:4000/)
if [[ "$content" == *"WakaAPI"* ]] || [[ "$content" == *"wakaapi"* ]] || [[ "$content" == *"wakapi"* ]]; then
echo "✅ WakaAPI is displayed on homepage"
exit 0
else
echo "❌ WakaAPI is NOT displayed on homepage"
echo "Test failed: WakaAPI not discovered by homepage"
exit 1
fi

View File

@@ -0,0 +1,14 @@
{
"name": "TSYSDevStack Toolbox Base",
"dockerComposeFile": [
"../docker-compose.yml"
],
"service": "toolbox-base",
"workspaceFolder": "/workspace",
"remoteUser": "toolbox",
"runServices": [
"toolbox-base"
],
"overrideCommand": false,
"postCreateCommand": "zsh -lc 'starship --version >/dev/null'"
}

View File

@@ -0,0 +1,80 @@
FROM ubuntu:24.04
ARG USER_ID=1000
ARG GROUP_ID=1000
ARG USERNAME=toolbox
ENV DEBIAN_FRONTEND=noninteractive
RUN apt-get update \
&& apt-get install -y --no-install-recommends \
ca-certificates \
curl \
fish \
fzf \
git \
jq \
locales \
openssh-client \
ripgrep \
tmux \
fd-find \
bat \
wget \
zsh \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/*
# Provide common aliases for fd and bat binaries
RUN ln -sf /usr/bin/fdfind /usr/local/bin/fd \
&& ln -sf /usr/bin/batcat /usr/local/bin/bat
# Configure locale to ensure consistent tool behavior
RUN locale-gen en_US.UTF-8
ENV LANG=en_US.UTF-8 \
LANGUAGE=en_US:en \
LC_ALL=en_US.UTF-8
# Install Starship prompt
RUN curl -fsSL https://starship.rs/install.sh | sh -s -- -y -b /usr/local/bin
# Install aqua package manager (manages additional CLI tooling)
RUN curl -sSfL https://raw.githubusercontent.com/aquaproj/aqua-installer/v2.3.1/aqua-installer | AQUA_ROOT_DIR=/usr/local/share/aquaproj-aqua bash \
&& ln -sf /usr/local/share/aquaproj-aqua/bin/aqua /usr/local/bin/aqua
# Create non-root user with matching UID/GID for host mapping
RUN if getent passwd "${USER_ID}" >/dev/null; then \
existing_user="$(getent passwd "${USER_ID}" | cut -d: -f1)"; \
userdel --remove "${existing_user}"; \
fi \
&& if ! getent group "${GROUP_ID}" >/dev/null; then \
groupadd --gid "${GROUP_ID}" "${USERNAME}"; \
fi \
&& useradd --uid "${USER_ID}" --gid "${GROUP_ID}" --shell /usr/bin/zsh --create-home "${USERNAME}"
# Install Oh My Zsh for the unprivileged user
RUN su - "${USERNAME}" -c 'git clone --depth=1 https://github.com/ohmyzsh/ohmyzsh.git ~/.oh-my-zsh' \
&& su - "${USERNAME}" -c 'cp ~/.oh-my-zsh/templates/zshrc.zsh-template ~/.zshrc' \
&& su - "${USERNAME}" -c 'mkdir -p ~/.config' \
&& su - "${USERNAME}" -c 'sed -i "s/^plugins=(git)$/plugins=(git fzf)/" ~/.zshrc' \
&& su - "${USERNAME}" -c 'printf "\nexport PATH=\"\$HOME/.local/share/aquaproj-aqua/bin:\$HOME/.local/bin:\$PATH\"\n" >> ~/.zshrc' \
&& su - "${USERNAME}" -c 'printf "\n# Starship prompt\neval \"\$(starship init zsh)\"\n" >> ~/.zshrc'
COPY aqua.yaml /tmp/aqua.yaml
RUN chown "${USER_ID}:${GROUP_ID}" /tmp/aqua.yaml \
&& su - "${USERNAME}" -c 'mkdir -p ~/.config/aquaproj-aqua' \
&& su - "${USERNAME}" -c 'cp /tmp/aqua.yaml ~/.config/aquaproj-aqua/aqua.yaml' \
&& su - "${USERNAME}" -c 'AQUA_GLOBAL_CONFIG=~/.config/aquaproj-aqua/aqua.yaml aqua install'
# Prepare workspace directory with appropriate ownership
RUN mkdir -p /workspace \
&& chown "${USER_ID}:${GROUP_ID}" /workspace
ENV SHELL=/usr/bin/zsh \
PATH=/home/${USERNAME}/.local/share/aquaproj-aqua/bin:/home/${USERNAME}/.local/bin:${PATH}
WORKDIR /workspace
USER ${USERNAME}
CMD ["/usr/bin/zsh"]

View File

@@ -0,0 +1,8 @@
version: 1.0.0
registries:
- type: standard
ref: v4.200.0
packages:
- name: cli/cli@latest
- name: go-gitea/tea@latest
- name: jesseduffield/lazygit@latest

View File

@@ -0,0 +1,19 @@
#!/usr/bin/env bash
set -euo pipefail
IMAGE_NAME="tsysdevstack-toolboxstack-toolbox-base"
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
USER_ID="${USER_ID_OVERRIDE:-$(id -u)}"
GROUP_ID="${GROUP_ID_OVERRIDE:-$(id -g)}"
USERNAME="${USERNAME_OVERRIDE:-toolbox}"
echo "Building ${IMAGE_NAME} with UID=${USER_ID} GID=${GROUP_ID} USERNAME=${USERNAME}"
docker build \
--build-arg USER_ID="${USER_ID}" \
--build-arg GROUP_ID="${GROUP_ID}" \
--build-arg USERNAME="${USERNAME}" \
--tag "${IMAGE_NAME}" \
"${SCRIPT_DIR}"

View File

@@ -0,0 +1,18 @@
services:
toolbox-base:
container_name: tsysdevstack-toolboxstack-toolbox-base
image: tsysdevstack-toolboxstack-toolbox-base
build:
context: .
args:
USER_ID: ${LOCAL_UID:-1000}
GROUP_ID: ${LOCAL_GID:-1000}
USERNAME: ${LOCAL_USERNAME:-toolbox}
user: "${LOCAL_UID:-1000}:${LOCAL_GID:-1000}"
working_dir: /workspace
command: ["sleep", "infinity"]
init: true
tty: true
stdin_open: true
volumes:
- .:/workspace:rw

View File

@@ -0,0 +1,31 @@
#!/usr/bin/env bash
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
COMPOSE_FILE="${SCRIPT_DIR}/docker-compose.yml"
export LOCAL_UID="${USER_ID_OVERRIDE:-$(id -u)}"
export LOCAL_GID="${GROUP_ID_OVERRIDE:-$(id -g)}"
export LOCAL_USERNAME="${USERNAME_OVERRIDE:-toolbox}"
if [[ ! -f "${COMPOSE_FILE}" ]]; then
echo "Error: docker-compose.yml not found at ${COMPOSE_FILE}" >&2
exit 1
fi
ACTION="${1:-up}"
shift || true
case "${ACTION}" in
up)
docker compose -f "${COMPOSE_FILE}" up --build --detach "$@"
;;
down)
docker compose -f "${COMPOSE_FILE}" down "$@"
;;
*)
echo "Usage: $0 [up|down] [additional docker compose args]" >&2
exit 1
;;
esac

View File

@@ -0,0 +1,61 @@
https://github.com/target/goalert
https://github.com/tirrenotechnologies/tirreno
https://github.com/runmedev/runme
https://github.com/datahub-project/datahub
https://github.com/jhpyle/docassemble
https://github.com/pimcore/pimcore
https://github.com/kazhuravlev/database-gateway
https://github.com/adnanh/webhook
https://github.com/metrue/fx
https://github.com/fonoster/fonoster
https://github.com/oat-sa
https://github.com/rundeck/rundeck
https://github.com/juspay/hyperswitch
https://github.com/Payroll-Engine/PayrollEngine
https://github.com/openboxes/openboxes
https://github.com/nautechsystems/nautilus_trader
https://github.com/apache/apisix
https://github.com/gristlabs/grist-core
https://github.com/healthchecks/healthchecks
https://github.com/fleetdm/fleet
https://github.com/netbox-community/netbox
https://github.com/apache/seatunnel
https://github.com/rapiz1/rathole
https://github.com/wiredlush/easy-gate
https://github.com/huginn/huginn
https://github.com/consuldemocracy/consuldemocracy
https://github.com/BOINC/boinc
https://github.com/SchedMD/slurm
https://github.com/gophish/gophish
https://github.com/GemGeorge/SniperPhish
https://github.com/inventree/InvenTree
https://github.com/mendersoftware/mender
https://github.com/langfuse/langfuse
https://github.com/wireviz/wireviz-web
https://github.com/wireviz/WireViz
https://github.com/killbill/killbill
https://github.com/opulo-inc/autobom
https://github.com/midday-ai/midday
https://github.com/openblocks-dev/openblocks
https://github.com/jgraph/docker-drawio
https://github.com/SigNoz/signoz
https://github.com/getsentry/sentry
https://github.com/chirpstack/chirpstack
https://github.com/elabftw/elabftw
https://github.com/PLMore/PLMore
https://gitlab.com/librespacefoundation/satnogs
https://github.com/jamovi/jamovi
https://github.com/reviewboard/reviewboard
https://github.com/Resgrid/Core
https://github.com/f4exb/sdrangel
https://github.com/stephengpope/no-code-architects-toolkit
https://github.com/sebo-b/warp
https://github.com/windmill-labs/windmill
https://github.com/cortezaproject/corteza
https://github.com/mendersoftware
https://github.com/security-companion/security-awareness-training
https://github.com/strongdm/comply
https://github.com/todogroup/policies
https://github.com/sebo-b/warp
https://github.com/windmill-labs/windmill
https://github.com/HeyPuter/puter

View File

@@ -0,0 +1,76 @@
# Cloudron Packages for Knowne ELement Enterprises
This repository contains all of the Cloudron packaging artifacts for the following upstream projects:
## Monitoring & Observability
- https://github.com/getsentry/sentry
- https://github.com/healthchecks/healthchecks
- https://github.com/SigNoz/signoz
- https://github.com/target/goalert
## Security & Compliance
- https://github.com/fleetdm/fleet
- https://github.com/GemGeorge/SniperPhish
- https://github.com/gophish/gophish
- https://github.com/kazhuravlev/database-gateway
- https://github.com/security-companion/security-awareness-training
- https://github.com/strongdm/comply
- https://github.com/tirrenotechnologies/tirreno
- https://github.com/todogroup/policies
- https://github.com/wiredlush/easy-gate
## Developer Platforms & Automation
- https://github.com/adnanh/webhook
- https://github.com/huginn/huginn
- https://github.com/metrue/fx
- https://github.com/openblocks-dev/openblocks
- https://github.com/reviewboard/reviewboard
- https://github.com/runmedev/runme
- https://github.com/stephengpope/no-code-architects-toolkit
- https://github.com/windmill-labs/windmill
## Infrastructure & Operations
- https://github.com/apache/apisix
- https://github.com/fonoster/fonoster
- https://github.com/mendersoftware/mender
- https://github.com/netbox-community/netbox
- https://github.com/rapiz1/rathole
- https://github.com/rundeck/rundeck
- https://github.com/SchedMD/slurm
## Data & Analytics
- https://github.com/apache/seatunnel
- https://github.com/datahub-project/datahub
- https://github.com/gristlabs/grist-core
- https://github.com/jamovi/jamovi
- https://github.com/langfuse/langfuse
- https://github.com/nautechsystems/nautilus_trader
## Business & Productivity
- https://github.com/cortezaproject/corteza
- https://github.com/HeyPuter/puter
- https://github.com/inventree/InvenTree
- https://github.com/jgraph/docker-drawio
- https://github.com/jhpyle/docassemble
- https://github.com/juspay/hyperswitch
- https://github.com/killbill/killbill
- https://github.com/midday-ai/midday
- https://github.com/oat-sa/package-tao
- https://github.com/openboxes/openboxes
- https://github.com/Payroll-Engine/PayrollEngine
- https://github.com/pimcore/pimcore
- https://github.com/PLMore/PLMore
- https://github.com/sebo-b/warp
## Industry & Specialized Solutions
- https://github.com/BOINC/boinc
- https://github.com/chirpstack/chirpstack
- https://github.com/consuldemocracy/consuldemocracy
- https://github.com/elabftw/elabftw
- https://github.com/f4exb/sdrangel
- https://gitlab.com/librespacefoundation/satnogs
- https://github.com/opulo-inc/autobom
- https://github.com/Resgrid/Core
- https://github.com/wireviz/wireviz-web
- https://github.com/wireviz/WireViz

View File

@@ -7,13 +7,21 @@ Create an out-of-the-box, localhost-bound only, ephemeral Docker volume-only dem
Create a proof of concept with docker-socket-proxy, homepage, and wakaapi components that demonstrate proper homepage integration via Docker Compose labels. This MVP will serve as a validation of the full approach before proceeding with the complete stack implementation. Create a proof of concept with docker-socket-proxy, homepage, and wakaapi components that demonstrate proper homepage integration via Docker Compose labels. This MVP will serve as a validation of the full approach before proceeding with the complete stack implementation.
## Architecture Requirements ## Architecture Requirements
- All Docker artifacts must be prefixed with `TSYSDevStack-SupportStack-Demo` - All Docker artifacts must be prefixed with `tsysdevstack-supportstack-demo-`
- This includes containers, networks, volumes, and any other Docker artifacts
- Example: `tsysdevstack-supportstack-demo-homepage`, `tsysdevstack-supportstack-demo-network`, etc.
- Run exclusively on localhost (localhost binding only) - Run exclusively on localhost (localhost binding only)
- Ephemeral volumes only (no persistent storage) - Ephemeral volumes only (no persistent storage)
- Resource limits set for single-user demo capacity - Resource limits set for single-user demo capacity
- No external network access (localhost bound only) - No external network access (localhost bound only)
- Components: docker-socket-proxy, portainer, homepage as foundational elements - Components: docker-socket-proxy, portainer, homepage as foundational elements
- All artifacts must go into artifacts/SupportStack directory to keep the directory well organized and avoid cluttering the root directory - All artifacts must go into artifacts/SupportStack directory to keep the directory well organized and avoid cluttering the root directory
- Homepage container needs direct access to Docker socket for labels to auto-populate (not through proxy)
- Docker socket proxy is for other containers that need Docker access but don't require direct socket access
- Portainer can use docker-socket-proxy for read-only access, but homepage needs direct socket access
- All containers need proper UID/GID mapping for security
- Docker group GID must be mapped properly for containers using Docker socket
- Non-Docker socket using containers should use invoking UID/GID
## Development Methodology ## Development Methodology
- Strict Test Driven Development (TDD) process - Strict Test Driven Development (TDD) process
@@ -29,13 +37,16 @@ Create a proof of concept with docker-socket-proxy, homepage, and wakaapi compon
## MVP Component Development Sequence (Test Run) ## MVP Component Development Sequence (Test Run)
1. **MVP**: docker-socket-proxy, homepage, wakaapi (each must fully satisfy Definition of Done before proceeding) 1. **MVP**: docker-socket-proxy, homepage, wakaapi (each must fully satisfy Definition of Done before proceeding)
- docker-socket-proxy: Enable Docker socket access for homepage integration - docker-socket-proxy: Enable Docker socket access for containers that need it (not homepage)
- homepage: Configure to access Docker socket and discover labeled containers - homepage: Configure to access Docker socket directly for automatic label discovery
- wakaapi: Integrate with homepage using proper labels - wakaapi: Integrate with homepage using proper labels
- All services must utilize Docker Compose labels to automatically show up in homepage - All services must utilize Docker Compose labels to automatically show up in homepage
- Implement proper service discovery for homepage integration using gethomepage labels - Implement proper service discovery for homepage integration using gethomepage labels
- Ensure all components are properly labeled with homepage integration labels - Ensure all components are properly labeled with homepage integration labels
- Implement proper startup ordering using depends_on with health checks - Implement proper startup ordering using depends_on with health checks
- Homepage container requires direct Docker socket access for automatic service discovery
- Docker socket proxy provides controlled access for other containers
- All containers must have proper UID/GID mapping for security
## Component Completion Validation ## Component Completion Validation
- Each component must pass health checks for 5 consecutive minutes before moving to the next - Each component must pass health checks for 5 consecutive minutes before moving to the next
@@ -45,7 +56,7 @@ Create a proof of concept with docker-socket-proxy, homepage, and wakaapi compon
- Homepage must automatically detect and display all services with proper labels - Homepage must automatically detect and display all services with proper labels
- Specific validation checkpoints after each service deployment: - Specific validation checkpoints after each service deployment:
- docker-socket-proxy: Validate Docker socket access and network connectivity to Docker daemon - docker-socket-proxy: Validate Docker socket access and network connectivity to Docker daemon
- homepage: Validate homepage starts and can connect to Docker socket proxy, verify UI is accessible - homepage: Validate homepage starts and can connect to Docker socket directly, verify UI is accessible
- wakaapi: Validate service starts and can be integrated into homepage with proper labels - wakaapi: Validate service starts and can be integrated into homepage with proper labels
- Each service must be validated in homepage dashboard after integration - Each service must be validated in homepage dashboard after integration
- Detailed homepage integration validation steps: - Detailed homepage integration validation steps:
@@ -54,6 +65,9 @@ Create a proof of concept with docker-socket-proxy, homepage, and wakaapi compon
- Validate service URL in homepage correctly links to the service - Validate service URL in homepage correctly links to the service
- Verify service group assignment in homepage is correct - Verify service group assignment in homepage is correct
- Check that any configured widgets appear properly in homepage - Check that any configured widgets appear properly in homepage
- Homepage must automatically discover services via Docker labels without manual configuration
- Validate Docker socket connectivity for automatic service discovery
- Confirm homepage can access and display service status information
- Update STATUS.md with validation results for each component - Update STATUS.md with validation results for each component
## Technical Specifications ## Technical Specifications
@@ -72,9 +86,9 @@ Create a proof of concept with docker-socket-proxy, homepage, and wakaapi compon
- docker-socket-proxy: Internal network only, no external ports exposed - docker-socket-proxy: Internal network only, no external ports exposed
- homepage: Port 4000 (localhost only) - configurable via environment variable - homepage: Port 4000 (localhost only) - configurable via environment variable
- wakaapi: Port 4001 (localhost only) - configurable via environment variable - wakaapi: Port 4001 (localhost only) - configurable via environment variable
- All environment variables must be pre-set in TSYSDevStack-SupportStack-Demo-Settings file (single settings file for simplicity in demo) - All environment variables must be pre-set in tsysdevstack-supportstack-demo-Settings file (single settings file for simplicity in demo)
- All docker compose files (one per component) should be prefixed with: TSYSDevStack-SupportStack-Demo-DockerCompose- - All docker compose files (one per component) should be prefixed with: tsysdevstack-supportstack-demo-DockerCompose-
- All docker compose files should use environment variables for everything (variables will be set in TSYSDevStack-SupportStack-Demo-Settings file) - All docker compose files should use environment variables for everything (variables will be set in tsysdevstack-supportstack-demo-Settings file)
- Health checks must validate service readiness before proceeding with dependent components - Health checks must validate service readiness before proceeding with dependent components
- Health check endpoints must be accessible only from internal network - Health check endpoints must be accessible only from internal network
- Health check configurations must be parameterized via environment variables - Health check configurations must be parameterized via environment variables
@@ -89,11 +103,20 @@ Create a proof of concept with docker-socket-proxy, homepage, and wakaapi compon
- Implement security scanning during build process (for demo, secrets via environment variables are acceptable) - Implement security scanning during build process (for demo, secrets via environment variables are acceptable)
- Define network policies for internal communication only - Define network policies for internal communication only
- Use depends_on with health checks to ensure proper startup ordering of services - Use depends_on with health checks to ensure proper startup ordering of services
- Homepage container requires direct Docker socket access (not through proxy) for automatic label discovery
- Docker socket proxy provides controlled access for other containers that need Docker access
- Portainer can use docker-socket-proxy for read-only access
- All containers must have proper UID/GID mapping for security
- Docker group GID must be mapped for containers using Docker socket
- Homepage container must have Docker socket access for labels to auto-populate
## Stack Control ## Stack Control
- All control of the stack should go into a script called TSYSDevStack-SupportStack-Demo-Control.sh - All control of the stack should go into a script called tsysdevstack-supportstack-demo-Control.sh
- The script should take the following arguments: start/stop/uninstall/update/test - The script should take the following arguments: start/stop/uninstall/update/test
- Ensure script is executable and contains error handling - Ensure script is executable and contains error handling
- Script must handle UID/GID mapping for non-Docker socket using containers
- Script must map host Docker GID to containers using Docker socket
- Script should warn about Docker socket access requirements for homepage
## Component Definition of Done ## Component Definition of Done
- All health checks pass consistently for each component - All health checks pass consistently for each component
@@ -116,6 +139,16 @@ Create a proof of concept with docker-socket-proxy, homepage, and wakaapi compon
- Component properly labeled with homepage integration labels (homepage.group, homepage.name, homepage.icon, etc.) - Component properly labeled with homepage integration labels (homepage.group, homepage.name, homepage.icon, etc.)
- Container uses pinned image tags rather than 'latest' - Container uses pinned image tags rather than 'latest'
- Services validate properly in homepage after integration - Services validate properly in homepage after integration
- Homepage container has direct Docker socket access for automatic service discovery
- Homepage automatically discovers and displays services with proper labels
- Homepage validates Docker socket connectivity and service discovery
- All homepage integration labels are properly applied and validated
- Services appear in homepage with correct grouping, naming, and icons
- Homepage container has direct Docker socket access for automatic label discovery
- Docker socket proxy provides access for other containers that need Docker access
- Proper UID/GID mapping implemented for all containers
- Docker group GID properly mapped for containers using Docker socket
- All warnings addressed and resolved during implementation
## Testing Requirements ## Testing Requirements
- Unit tests for each component configuration - Unit tests for each component configuration

View File

@@ -0,0 +1,4 @@
THings to add in to SupportStack
MCP Server Manager of some kind (CLI? Web? BOth?)
SO many options exist right now

View File

@@ -36,75 +36,157 @@ Notes:
I have been focused on the operations and infrastructure of building my businesses. I have been focused on the operations and infrastructure of building my businesses.
Hence deployment of Cloudron and the services on it and moving data into it from various SAAS and legacy LAMP systems. Hence deployment of Cloudron and the services on it and moving data into it from various SAAS and legacy LAMP systems.
Now I am focusing on setting up my development environment. I have a Debian 12 VM . I am setting up a fully dockerized development environment. Now I am focusing on setting up my development environment on a Debian 12 VM. Below is an organized, left-justified reference of the selected SupportStack services — software name links to the project website and the second column links to the repository (link text: repository).
I have been putting together a list of support services to run. This is meant to run locally on my workstation and be highly personal/customized.
So far I have selected: Core utilities
| Icon | Software (website) | Repository |
|:---|:---|:---|
| 🐚 | [atuin](https://atuin.sh) | [repository](https://github.com/ellie/atuin) |
| 🧪 | [httpbin](https://httpbin.org) | [repository](https://github.com/postmanlabs/httpbin) |
| 📁 | [Dozzle](https://github.com/amir20/dozzle) | [repository](https://github.com/amir20/dozzle) |
| 🖥️ | [code-server](https://coder.com/code-server) | [repository](https://github.com/coder/code-server) |
| 📬 | [MailHog](https://mailhog.github.io/) | [repository](https://github.com/mailhog/MailHog) |
| 🧾 | [Adminer](https://www.adminer.org) | [repository](https://github.com/vrana/adminer) |
| 🧰 | [Portainer](https://www.portainer.io) | [repository](https://github.com/portainer/portainer) |
| 🔁 | [Watchtower](https://containrrr.dev/watchtower) | [repository](https://github.com/containrrr/watchtower) |
atuin API, docs and mocking
httpbin | Icon | Software (website) | Repository |
Dozzle |:---|:---|:---|
code-server | 🧩 | [wiremock](http://wiremock.org) | [repository](https://github.com/wiremock/wiremock) |
wiremock | 🔗 | [hoppscotch](https://hoppscotch.io) | [repository](https://github.com/hoppscotch/hoppscotch) |
kroki | 🧾 | [swagger-ui](https://swagger.io/tools/swagger-ui/) | [repository](https://github.com/swagger-api/swagger-ui) |
redoc | 📚 | [redoc](https://redoc.ly) | [repository](https://github.com/Redocly/redoc) |
mailhog | 🔔 | [webhook.site](https://webhook.site) | [repository](https://github.com/search?q=webhook.site) |
archivebox | 🧪 | [pact_broker](https://docs.pact.io/pact_broker) | [repository](https://github.com/pact-foundation/pact_broker) |
tubearchivst | 🧰 | [httpbin (reference)](https://httpbin.org) | [repository](https://github.com/postmanlabs/httpbin) |
toxiproxy
reactiveresume Observability & tracing
wakaapi | Icon | Software (website) | Repository |
atomic tracker |:---|:---|:---|
portainer | 🔍 | [Jaeger All-In-One](https://www.jaegertracing.io) | [repository](https://github.com/jaegertracing/jaeger) |
hoppscotch | 📊 | [Loki](https://grafana.com/oss/loki/) | [repository](https://github.com/grafana/loki) |
Jaeger All In One | 📤 | [Promtail](https://grafana.com/docs/loki/latest/clients/promtail/) | [repository](https://github.com/grafana/loki) |
swagger-ui | 🧭 | [OpenTelemetry Collector](https://opentelemetry.io/docs/collector/) | [repository](https://github.com/open-telemetry/opentelemetry-collector) |
webhook.site | 🧮 | [node-exporter (Prometheus)](https://prometheus.io/docs/guides/node-exporter/) | [repository](https://github.com/prometheus/node_exporter) |
Adminer | 📦 | [google/cadvisor](https://github.com/google/cadvisor) | [repository](https://github.com/google/cadvisor) |
Watchtower
https://github.com/google/cadvisor Chaos, networking & proxies
node-exporter (containerized and exporting host system metrics) | Icon | Software (website) | Repository |
pumba |:---|:---|:---|
Loki | 🌩️ | [toxiproxy](https://github.com/Shopify/toxiproxy) | [repository](https://github.com/Shopify/toxiproxy) |
Promtail | 🧨 | [pumba](https://github.com/alexei-led/pumba) | [repository](https://github.com/alexei-led/pumba) |
OpenTelemetry Collector | 🧭 | [CoreDNS](https://coredns.io) | [repository](https://github.com/coredns/coredns) |
Registry2 | 🔐 | [step-ca (smallstep)](https://smallstep.com/docs/step-ca/) | [repository](https://github.com/smallstep/certificates) |
CoreDNS
step-ca Devops, CI/CD & registries
Unleash | Icon | Software (website) | Repository |
OpenPolicyAgent |:---|:---|:---|
Cadence workflow engine | 📦 | [Registry (Distribution v2)](https://docs.docker.com/registry/) | [repository](https://github.com/distribution/distribution) |
https://github.com/pact-foundation/pact_broker | ⚙️ | [Core workflow: Cadence](https://cadenceworkflow.io) | [repository](https://github.com/uber/cadence) |
| 🧾 | [Unleash (feature flags)](https://www.getunleash.io) | [repository](https://github.com/Unleash/unleash) |
| 🛡️ | [OpenPolicyAgent](https://www.openpolicyagent.org) | [repository](https://github.com/open-policy-agent/opa) |
Rendering, diagrams & misc developer tools
| Icon | Software (website) | Repository |
|:---|:---|:---|
| 🖼️ | [Kroki](https://kroki.io) | [repository](https://github.com/yuzutech/kroki) |
| 🧭 | [Dozzle (logs)](https://github.com/amir20/dozzle) | [repository](https://github.com/amir20/dozzle) |
| 📚 | [ArchiveBox](https://archivebox.io) | [repository](https://github.com/ArchiveBox/ArchiveBox) |
| 🧩 | [Registry tools / misc searches] | [repository](https://github.com/search?q=registry2) |
Personal / community / uncertain (link targets go to GitHub search where official page/repo was ambiguous)
| Icon | Software (website / search) | Repository |
|:---|:---|:---|
| 🧭 | [reactiveresume (search)](https://github.com/search?q=reactive+resume) | [repository](https://github.com/search?q=reactive+resume) |
| 🎞️ | [tubearchivst (search)](https://github.com/search?q=tubearchivst) | [repository](https://github.com/search?q=tubearchivst) |
| ⏱️ | [atomic tracker (search)](https://github.com/search?q=atomic+tracker) | [repository](https://github.com/search?q=atomic+tracker) |
| 📈 | [wakaapi (search)](https://github.com/search?q=wakaapi) | [repository](https://github.com/search?q=wakaapi) |
Notes:
- Where an authoritative project website exists it is linked in the Software column; where a dedicated site was not apparent the link points to a curated GitHub page or a GitHub search (to avoid guessing official domains).
- Let me know if you want this exported as Markdown, HTML, or rendered into your Cloudron/Stack documentation format.
Overview
This SupportStack is the always-on, developer-shared utility layer for local work and personal use. It is separate from per-project stacks (which own their DBs and runtime dependencies)
and separate from the LifecycleStack (build/package/release tooling).
All of the docker artifacts must be prefixed with TSYSDevStack-SupportStack-Demo . A full unit and end to end test suite providing greater than 75% coverage with 100% of the tests │ Services here are intended to be stable, long-running, and reusable across projects.
passing is required. Test driven development process must be STRICTLY adhered to. This means that a test is written, the test is executed, the test fails, then the minimal amount of code is written to get the test to pass. Also │
since this stack has such a large number of components, I want the work to be done on one component at a time until it's fully working. The foundational elements of docker socket proxy , portainer, homepage should be done │
first. Resource limits should be set on the components sufficient for a single user demo.
Architecture & constraints
- Dev environment: Debian 12 VM with a devcontainer base + specialized containers. Each project ships an identical docker-compose.yml in dev and prod.
- Deployment model: 12factor principles. Per-project stateful services (databases, caches) live inside each project stack, not in SupportStack.
- LifecycleStack: build/package/release tooling (Trivy, credential management container, artifact signing, CI runners) lives in a separate stack.
- Cloud policy: no public cloud for local infrastructure (Hard NO). Cloud-targeted tools may exist only for cloud dev environments (run in the cloud).
- Networking/UI: access services by ports. No need for reverse proxies (Caddy/Traefik) in SupportStack; the homepage provides the unified entry point.
- Credentials: projects consume secrets from the creds container in LifecycleStack. Do NOT add a credential injector to SupportStack.
- Data ownership: SupportStack contains developer & personal services (MailHog, Atuin, personal analytics). Project production data and DBs are explicitly outside SupportStack.
Operational guidelines
- Use explicit ports and stable hostnames for each service to keep UX predictable.
- Pin container images (digest or specific semver) and include healthchecks.
- Limit resource usage per container (cpu/memory) to avoid noisy neighbors.
- Persist data to named volumes and schedule regular backups.
- Centralize logs and metrics (Prometheus + Grafana + Loki) and add basic alerting.
- Use network isolation where appropriate (bridge networks per stack) and document exposed ports.
- Use a single canonical docker-compose schema across dev and prod to reduce drift.
- Document service purpose, default ports, and admin credentials in a small README inside the SupportStack repo (no secrets in repo).
I use Tailscale across Cloudron, my dev vm, my laptop/iphone/ipad to securely access all my workstation hosted services. Suggested additions to the SupportStack (with rationale)
Cloudron apps are 100% 2fa/SSO - Local artifact/cache proxies
- apt/aptly or apt-cacher-ng — speed package installs and reduce external hits.
- npm/yarn registry proxy (Verdaccio) — speed front-end dependency installs.
- Backup & restore
- restic or Duplicity plus a scheduled job to back up named volumes (or push to MinIO).
- Object storage & S3 tooling
- MinIO (already listed) — ensure lifecycle for backups and dev S3 workloads.
- s3gateway tools / rclone GUI for manual data movement.
- Registry & image tooling
- Private Docker Registry (distribution v2) — already listed; consider adding simple GC and retention policies.
- Image vulnerability dashboard (registry + Trivy / Polaris integrations) — surface image risks (Trivy stays in LifecycleStack for scanning).
- Caching & fast storage
- Redis — local cache for dev apps and simple feature testing.
- memcached — lightweight alternative where needed.
- Dev UX tooling
- filebrowser or chevereto-like lightweight file manager — quick SFTP/HTTP access to files.
- code-server (already listed) — ensure secure defaults for dev access.
- Networking & secure access
- WireGuard or a local VPN appliance — secure remote developer access without exposing services publicly.
- CoreDNS (already listed) — DNS for local hostnames and service discovery.
- Observability & testing
- Blackbox exporter or Uptime Kuma (already listed) — external checks on service ports.
- Tempo or Jaeger (already listed) — distributed tracing for local microservice testing.
- Loki + Promtail (already listed) — central logs; ensure retention policies.
- Development mocks & API tooling
- Wiremock / Mock servers (already listed) — richer API contract testing.
- Postman/hoppscotch (already listed) — request building and collection testing.
- CI/CD helpers (lightweight)
- Local runner (small container to run builds/tests) that mirrors prod runner environment.
- Container image pruning tools / reclaimers for long-running dev VM.
- Misc useful tools
- Sentry (or a lightweight error aggregator) — collect local app exceptions during dev runs.
- ArchiveBox / Archive utilities (already listed) — reproducible web captures.
- A small SMTP relay for inbound testing (MailHog already present).
- A small DB admin (Adminer already listed) and optional pgAdmin if need richer DB tools.
- Optional: a minimal artifact repository (Nexus/Harbor) if storing compiled artifacts or OCI images beyond the simple registry.
I have a separate development stack that I am developing. It has a devcontainer base and then various specialized containers to extend it. Each project will ship with an identical docker compose file in dev and in prod (we don't have any other environments). We use 12 factor for everything. Operational checklist to add to repo
I have a separate lifecycle (build/package/release) stack that I am developing. That is where things like Trivy will go. - Compose file naming and versioning policy (same file for dev & prod).
We DO NOT use the public cloud. Hard NO. However we have some products which customers may deploy to the public cloud. So our dev environment will need public cloud tooling. Any cloud dev will happen in the cloud in a cloud dev environment. No local support needed. - Port assignment table (avoid collisions).
- Volume & backup policy (what to snapshot and when).
- Upgrade policy and maintenance window for SupportStack.
- Quick restore steps for any critical service.
We DO NOT use the public cloud. Hard NO. However we have some products which customers may deploy to the public cloud. So our dev environment will need public cloud tooling. Any cloud dev will happen in the cloud in a cloud dev environment. No local support needed. Short example priorities for next additions
1. Verdaccio (npm proxy) + apt-cacher-ng — speed & reproducible installs.
2. Restic backup container that snapshots SupportStack volumes to MinIO.
3. WireGuard for secure remote dev access.
4. Image pruning/cleanup job and clear registry retention policy.
5. Add Redis and a lightweight error aggregator (Sentry) for local dev testing.
I am fine with using ports to access all the services. No need for Caddy/Traefik. Homepage provides a nice unified entry point for good UI/UX/DX already. This expanded description is designed to be pasted along with the rest of the SupportStack file to prompt ideation from ChatGPT/CoPilot/Grok/Qwen.
I do not need a personal kanban/roadmap. That all lives in Redmine.
I have a local influxdb/grafana for my own data collection that isn't for my startup/projects/clients. Its for personal data like my Apple Health exports.
Each of my dev projects will use the creds container in the lifecycle stack. As such , I don't need cred injector in the support stack.
A database and other dependencies would be setup per project. Not in the SupportStack. The SupportStack is an always running no matter what stack. Does that make sense? It's meant to be leveraged across projects (things like Mailhog and Atuin for example) as well as by the developer for their personal enjoyment/use (atomic tracker for example). Use the suggestions list to generate additional service proposals, playbooks, and compose templates for each recommended service.
Do you have any ideas for what other things I could add to my list of services in the SupportStack?
We will have separate conversations about the LifecycleStack for build/package/release tooling

View File

@@ -0,0 +1,31 @@
# TSYS Dev Stack Project - DevStack - Toolbox
This prompt file is the starting off point for the ToolboxStack category of the complete TSYSDevStack.
## Category Context
The TSYSDevStack consists of four categories:
- CloudronStack (Free/libre/open software packages that Known Element Enterprises has packaged up for Cloudron hosting)
- LifecycleStack (build/test/package/release tooling)
- SupportStack (always on tooling meant to run on developer workstations)
- ToolboxStack (devcontainer base and various functional area specific devcontainers).
## Introduction
## Artifact Naming
## Common Service Dependencies
## toolbox-base
- mise
- zsh / oh-my-zsh / completions /
-
## toolbox-gis
## toolbox-weather