snapshot
This commit is contained in:
@@ -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
|
||||||
40
artifacts/SupportStack/config/homepage/config.yaml
Normal file
40
artifacts/SupportStack/config/homepage/config.yaml
Normal 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: "*"
|
||||||
3
artifacts/SupportStack/config/homepage/docker.yaml
Normal file
3
artifacts/SupportStack/config/homepage/docker.yaml
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
---
|
||||||
|
# Docker configuration for Homepage service discovery
|
||||||
|
socket: /var/run/docker.sock
|
||||||
8
artifacts/SupportStack/config/homepage/services.yaml
Normal file
8
artifacts/SupportStack/config/homepage/services.yaml
Normal 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
|
||||||
@@ -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: "*"
|
||||||
@@ -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
|
|
||||||
@@ -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
|
|
||||||
@@ -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
|
|
||||||
@@ -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}
|
||||||
@@ -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}
|
||||||
@@ -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
|
||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
37
artifacts/SupportStack/tests/test_wakaapi_discovery.sh
Executable file
37
artifacts/SupportStack/tests/test_wakaapi_discovery.sh
Executable 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
|
||||||
@@ -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'"
|
||||||
|
}
|
||||||
80
artifacts/ToolboxStack/toolbox-base/Dockerfile
Normal file
80
artifacts/ToolboxStack/toolbox-base/Dockerfile
Normal 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"]
|
||||||
8
artifacts/ToolboxStack/toolbox-base/aqua.yaml
Normal file
8
artifacts/ToolboxStack/toolbox-base/aqua.yaml
Normal 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
|
||||||
19
artifacts/ToolboxStack/toolbox-base/build.sh
Executable file
19
artifacts/ToolboxStack/toolbox-base/build.sh
Executable 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}"
|
||||||
18
artifacts/ToolboxStack/toolbox-base/docker-compose.yml
Normal file
18
artifacts/ToolboxStack/toolbox-base/docker-compose.yml
Normal 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
|
||||||
31
artifacts/ToolboxStack/toolbox-base/run.sh
Executable file
31
artifacts/ToolboxStack/toolbox-base/run.sh
Executable 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
|
||||||
61
collab/CloudronStack/GitUrlList.txt
Normal file
61
collab/CloudronStack/GitUrlList.txt
Normal 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
|
||||||
76
collab/CloudronStack/README.md
Normal file
76
collab/CloudronStack/README.md
Normal 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
|
||||||
@@ -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
|
||||||
|
|||||||
4
collab/SupportStack/CharlesThoughts
Normal file
4
collab/SupportStack/CharlesThoughts
Normal 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
|
||||||
@@ -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: 12‑factor 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
|
|
||||||
|
|
||||||
|
|||||||
31
collab/ToolboxStack/TSYSDevStack-toolbox-prompt.md
Normal file
31
collab/ToolboxStack/TSYSDevStack-toolbox-prompt.md
Normal 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
|
||||||
|
|
||||||
Reference in New Issue
Block a user