fix: workflows

This commit is contained in:
2025-10-11 11:03:57 +02:00
parent 46ab66c600
commit c69e86fb95
10 changed files with 619 additions and 162 deletions

View File

@@ -1,6 +1,6 @@
{ {
"numStartups": 5, "numStartups": 6,
"installMethod": "unknown", "installMethod": "global",
"autoUpdates": true, "autoUpdates": true,
"tipsHistory": { "tipsHistory": {
"new-user-warmup": 1, "new-user-warmup": 1,
@@ -10,7 +10,9 @@
"theme-command": 4, "theme-command": 4,
"status-line": 4, "status-line": 4,
"prompt-queue": 5, "prompt-queue": 5,
"enter-to-steer-in-relatime": 5 "enter-to-steer-in-relatime": 5,
"shift-enter": 6,
"todo-list": 6
}, },
"cachedStatsigGates": { "cachedStatsigGates": {
"tengu_disable_bypass_permissions_mode": false, "tengu_disable_bypass_permissions_mode": false,
@@ -84,6 +86,10 @@
"/home/valknar": { "/home/valknar": {
"allowedTools": [], "allowedTools": [],
"history": [ "history": [
{
"display": "/init ",
"pastedContents": {}
},
{ {
"display": "Create a new", "display": "Create a new",
"pastedContents": {} "pastedContents": {}
@@ -102,7 +108,10 @@
"filesystem": { "filesystem": {
"type": "stdio", "type": "stdio",
"command": "pnpm", "command": "pnpm",
"args": ["mcp-server-filesystem", "repos/compose"], "args": [
"mcp-server-filesystem",
"repos/compose"
],
"env": {} "env": {}
} }
}, },
@@ -110,23 +119,30 @@
"disabledMcpjsonServers": [], "disabledMcpjsonServers": [],
"hasTrustDialogAccepted": true, "hasTrustDialogAccepted": true,
"ignorePatterns": [], "ignorePatterns": [],
"projectOnboardingSeenCount": 1, "projectOnboardingSeenCount": 2,
"hasClaudeMdExternalIncludesApproved": false, "hasClaudeMdExternalIncludesApproved": false,
"hasClaudeMdExternalIncludesWarningShown": false, "hasClaudeMdExternalIncludesWarningShown": false,
"exampleFiles": [], "exampleFiles": [
"app.vue",
"AppHeader.vue",
"main.css",
"page.tsx",
"nginx.conf"
],
"hasCompletedProjectOnboarding": true, "hasCompletedProjectOnboarding": true,
"lastTotalWebSearchRequests": 0, "lastTotalWebSearchRequests": 0,
"lastCost": 0.024666849999999997, "exampleFilesGeneratedAt": 1760172820128,
"lastAPIDuration": 8342, "lastCost": 0.35914274999999996,
"lastToolDuration": 0, "lastAPIDuration": 144999,
"lastDuration": 550590, "lastToolDuration": 4097,
"lastLinesAdded": 0, "lastDuration": 237951,
"lastLinesAdded": 259,
"lastLinesRemoved": 0, "lastLinesRemoved": 0,
"lastTotalInputTokens": 598, "lastTotalInputTokens": 24083,
"lastTotalOutputTokens": 98, "lastTotalOutputTokens": 5221,
"lastTotalCacheCreationInputTokens": 5375, "lastTotalCacheCreationInputTokens": 43371,
"lastTotalCacheReadInputTokens": 11518, "lastTotalCacheReadInputTokens": 291989,
"lastSessionId": "6f2214bc-384e-45bf-83c9-28390933589e" "lastSessionId": "f47f6bc3-f447-49f8-b62f-e1f9beec21fe"
} }
}, },
"hasOpusPlanDefault": false, "hasOpusPlanDefault": false,
@@ -135,9 +151,12 @@
"f474a499-f0bc-4bbb-9fca-5fcf55d8d86f": { "f474a499-f0bc-4bbb-9fca-5fcf55d8d86f": {
"hasAccess": false, "hasAccess": false,
"hasAccessNotAsDefault": false, "hasAccessNotAsDefault": false,
"timestamp": 1759837453920 "timestamp": 1760172817696
} }
}, },
"isQualifiedForDataSharing": false, "isQualifiedForDataSharing": false,
"fallbackAvailableWarningThreshold": 0.5 "fallbackAvailableWarningThreshold": 0.5,
"hasIdeOnboardingBeenShown": {
"vscode": true
}
} }

View File

@@ -46,13 +46,3 @@ jobs:
target: /var/www/docs.pivoine.art # Set to your deployment directory (for example /public_html) target: /var/www/docs.pivoine.art # Set to your deployment directory (for example /public_html)
strip_components: 1 # This ensures that a subdirectory is not created strip_components: 1 # This ensures that a subdirectory is not created
rm: 1 rm: 1
- name: Docker compose restart
uses: appleboy/ssh-action@v1
with:
host: ${{ secrets.HOST }}
username: ${{ secrets.USERNAME }}
password: ${{ secrets.PASSWORD }}
port: ${{ secrets.PORT }}
script: |
cd Projects/kompose/docs
docker compose restart

View File

@@ -61,13 +61,3 @@ jobs:
target: /var/www/sexy.pivoine.art # Set to your deployment directory (for example /public_html) target: /var/www/sexy.pivoine.art # Set to your deployment directory (for example /public_html)
strip_components: 1 # This ensures that a subdirectory is not created strip_components: 1 # This ensures that a subdirectory is not created
rm: 1 rm: 1
- name: Docker compose restart
uses: appleboy/ssh-action@v1
with:
host: ${{ secrets.HOST }}
username: ${{ secrets.USERNAME }}
password: ${{ secrets.PASSWORD }}
port: ${{ secrets.PORT }}
script: |
cd Projects/kompose/sexy
docker compose restart

View File

@@ -10,10 +10,12 @@ rm -rf $CURRENT_PROJECT/.env $CURRENT_PROJECT/**/uploads/ $CURRENT_PROJECT/**/*.
if [[ `git add -A && git diff --quiet && git diff --cached --quiet` ]]; then if [[ `git add -A && git diff --quiet && git diff --cached --quiet` ]]; then
# Changes # Changes
echo "CHANGES in ${CURRENT_PROJECT} - Mirroring..."
git commit -m "$1" git commit -m "$1"
git push git push
else else
# No changes # No changes
echo "NO CHANGES in ${CURRENT_PROJECT} - Aborting..."
git reset git reset
echo "no changes to latest posts" echo "no changes to latest posts"
exit 0 exit 0

View File

@@ -0,0 +1,315 @@
# Kompose Configuration Update - Migration Guide
## Overview
This update restructures your Kompose project to be more secure and maintainable by:
1. **Separating sensitive data** - All secrets moved to `secrets.env`
2. **Stack-scoped variables** - Configuration variables prefixed with stack names
3. **Centralized configuration** - All variables defined in top-level `.env`
4. **Automatic secret generation** - Generate cryptographically secure secrets with one command
5. **Traefik control** - Enable/disable Traefik per service with `${STACK}_TRAEFIK_ENABLED`
## Files Created
### 1. `.env` (Updated)
- Contains **NON-SENSITIVE** configuration for all stacks
- Variables are scoped with stack names (e.g., `TRACK_TRAEFIK_HOST`, `AUTH_DB_NAME`)
- Committed to git
### 2. `secrets.env.template`
- Template file for generating secrets
- Contains placeholder values: `CHANGE_ME_GENERATE_WITH_KOMPOSE`
- Committed to git as a reference
### 3. `secrets.env` (Generated)
- Contains **ALL SENSITIVE DATA** (passwords, tokens, keys)
- Auto-generated from template with `./kompose.sh --generate-secrets`
- **NEVER committed to git** (automatically added to `.gitignore`)
### 4. `kompose.sh` (Updated)
- Now loads both `.env` and `secrets.env`
- New `--generate-secrets` command for generating random secrets
- Automatically backs up existing `secrets.env` before regeneration
## Migration Steps
### Step 1: Generate Secrets
```bash
# This will create secrets.env from the template
./kompose.sh --generate-secrets
```
This command will:
- Read `secrets.env.template`
- Generate cryptographically secure random values for all secrets
- Save them to `secrets.env`
- Add `secrets.env` to `.gitignore` if not already present
- Backup existing `secrets.env` if it exists
### Step 2: Update Your Stack Files
Each stack needs to be updated to use the new variable naming pattern:
#### Before (track/.env):
```bash
COMPOSE_PROJECT_NAME=track
DOCKER_IMAGE=ghcr.io/umami-software/umami:postgresql-latest
DB_NAME=umami
TRAEFIK_HOST=umami.pivoine.art
APP_PORT=3000
APP_SECRET=changeme
```
#### After (track/.env):
```bash
COMPOSE_PROJECT_NAME=track
# All other variables are now in root .env and secrets.env
```
#### Before (track/compose.yaml):
```yaml
environment:
DATABASE_URL: postgresql://${DB_USER}:${DB_PASSWORD}@${DB_HOST}:${DB_PORT}/${DB_NAME}
APP_SECRET: ${APP_SECRET}
labels:
- 'traefik.enable=true'
- 'traefik.http.routers.${COMPOSE_PROJECT_NAME}-web.rule=Host(`$TRAEFIK_HOST`)'
```
#### After (track/compose.yaml):
```yaml
environment:
DATABASE_URL: postgresql://${DB_USER}:${DB_PASSWORD}@${DB_HOST}:${DB_PORT}/${TRACK_DB_NAME}
APP_SECRET: ${TRACK_APP_SECRET}
labels:
- 'traefik.enable=${TRACK_TRAEFIK_ENABLED}'
- 'traefik.http.routers.${COMPOSE_PROJECT_NAME}-web.rule=Host(`${TRACK_TRAEFIK_HOST}`)'
```
### Step 3: Update Root .env
Add configuration for each stack in the root `.env`:
```bash
# -------------------------------------------------------------------
# TRACK Stack (Umami Analytics)
# -------------------------------------------------------------------
TRACK_TRAEFIK_ENABLED=true
TRACK_TRAEFIK_HOST=umami.pivoine.art
TRACK_DB_NAME=umami
TRACK_DOCKER_IMAGE=ghcr.io/umami-software/umami:postgresql-latest
TRACK_APP_PORT=3000
```
### Step 4: Update secrets.env.template
Add secret placeholders for each stack:
```bash
# -------------------------------------------------------------------
# TRACK Stack Secrets (Umami)
# -------------------------------------------------------------------
TRACK_APP_SECRET=CHANGE_ME_GENERATE_WITH_KOMPOSE
```
### Step 5: Regenerate Secrets (if needed)
After updating the template, regenerate secrets:
```bash
./kompose.sh --generate-secrets
```
Your old secrets will be backed up automatically.
## Variable Naming Convention
### Stack Configuration Variables (in root .env)
```
{STACK_NAME}_{VARIABLE_NAME}
Examples:
TRACK_TRAEFIK_HOST=umami.pivoine.art
TRACK_DB_NAME=umami
TRACK_DOCKER_IMAGE=ghcr.io/umami-software/umami:postgresql-latest
AUTH_TRAEFIK_HOST=auth.pivoine.art
AUTH_DB_NAME=keycloak
```
### Stack Secrets (in secrets.env)
```
{STACK_NAME}_{SECRET_NAME}
Examples:
TRACK_APP_SECRET=<generated-64-char-hex>
AUTH_KC_ADMIN_PASSWORD=<generated-32-char-password>
DB_PASSWORD=<generated-32-char-password>
```
### Shared Variables (in root .env)
```
DB_USER=valknar
DB_HOST=postgres
DB_PORT=5432
ADMIN_EMAIL=admin@example.com
NETWORK_NAME=kompose
```
## Example Stack Configurations
### Example 1: Track Stack (Umami)
**Root .env:**
```bash
TRACK_TRAEFIK_ENABLED=true
TRACK_TRAEFIK_HOST=umami.pivoine.art
TRACK_DB_NAME=umami
TRACK_DOCKER_IMAGE=ghcr.io/umami-software/umami:postgresql-latest
```
**secrets.env.template:**
```bash
TRACK_APP_SECRET=CHANGE_ME_GENERATE_WITH_KOMPOSE
```
**track/compose.yaml:**
```yaml
services:
umami:
image: ${TRACK_DOCKER_IMAGE}
environment:
DATABASE_URL: postgresql://${DB_USER}:${DB_PASSWORD}@${DB_HOST}:${DB_PORT}/${TRACK_DB_NAME}
APP_SECRET: ${TRACK_APP_SECRET}
labels:
- 'traefik.enable=${TRACK_TRAEFIK_ENABLED}'
- 'traefik.http.routers.${COMPOSE_PROJECT_NAME}-web.rule=Host(`${TRACK_TRAEFIK_HOST}`)'
```
### Example 2: Auth Stack (Keycloak)
**Root .env:**
```bash
AUTH_TRAEFIK_ENABLED=true
AUTH_TRAEFIK_HOST=auth.pivoine.art
AUTH_DB_NAME=keycloak
AUTH_DOCKER_IMAGE=quay.io/keycloak/keycloak:latest
```
**secrets.env.template:**
```bash
AUTH_KC_ADMIN_PASSWORD=CHANGE_ME_GENERATE_WITH_KOMPOSE
```
**auth/compose.yaml:**
```yaml
services:
keycloak:
image: ${AUTH_DOCKER_IMAGE}
environment:
KC_DB_URL: jdbc:postgresql://${DB_HOST}:${DB_PORT}/${AUTH_DB_NAME}
KC_BOOTSTRAP_ADMIN_PASSWORD: ${AUTH_KC_ADMIN_PASSWORD}
labels:
- 'traefik.enable=${AUTH_TRAEFIK_ENABLED}'
- 'traefik.http.routers.${COMPOSE_PROJECT_NAME}-web.rule=Host(`${AUTH_TRAEFIK_HOST}`)'
```
## Traefik Control
Every service now has a `${STACK}_TRAEFIK_ENABLED` variable that controls whether Traefik routes to it:
```yaml
labels:
- 'traefik.enable=${TRACK_TRAEFIK_ENABLED}' # true or false
```
To disable Traefik for a stack, simply set it to `false` in the root `.env`:
```bash
TRACK_TRAEFIK_ENABLED=false
```
## Secret Generation Patterns
The `--generate-secrets` command generates different types of secrets based on variable naming:
| Variable Pattern | Generated Secret Type | Length | Example |
|-----------------|----------------------|--------|---------|
| `*_PASSWORD` | Alphanumeric password | 32 chars | `DB_PASSWORD`, `ADMIN_PASSWORD` |
| `*_SECRET`, `*_ENCRYPTION_KEY` | Hex string | 64 chars (32 bytes) | `TRACK_APP_SECRET`, `N8N_ENCRYPTION_KEY` |
| `*_TOKEN` | Alphanumeric token | 40 chars | `GITEA_RUNNER_TOKEN` |
| `*_HASH` | Hex hash | 64 chars (32 bytes) | `PASSWORD_HASH` |
| Default | Alphanumeric | 32 chars | Any other variable |
## Security Best Practices
### ✅ DO:
- Keep `secrets.env` in `.gitignore`
- Use the provided `secrets.env.template` as reference
- Regenerate secrets when setting up new environments
- Use stack-scoped variable names
- Store secrets in `secrets.env` only
### ❌ DON'T:
- Commit `secrets.env` to git
- Hard-code secrets in compose files
- Share secrets in plain text (use password managers)
- Use the same secrets across environments
- Store configuration in stack `.env` files anymore
## Quick Reference
### Generate secrets:
```bash
./kompose.sh --generate-secrets
```
### Start all stacks:
```bash
./kompose.sh "*" up -d
```
### View help:
```bash
./kompose.sh --help
```
### List stacks:
```bash
./kompose.sh --list
```
## Troubleshooting
### "Secrets file not found"
Run: `./kompose.sh --generate-secrets`
### "Variable not set" errors
Make sure you've:
1. Updated root `.env` with stack-scoped variables
2. Generated `secrets.env`
3. Updated compose files to use new variable names
### Need to regenerate a single secret?
Edit `secrets.env` directly and replace the value, or regenerate all secrets (old secrets will be backed up).
## Example Complete Setup
See the `.new` files in `track/` and `auth/` directories for complete examples of the new structure.
To apply them:
```bash
cd track
mv compose.yaml.new compose.yaml
mv .env.new .env
cd ../auth
mv compose.yaml.new compose.yaml
mv .env.new .env
```
Then regenerate your secrets:
```bash
./kompose.sh --generate-secrets
```

View File

@@ -0,0 +1,6 @@
# Stack identification
COMPOSE_PROJECT_NAME=auth
# Note: All configuration variables are now in the root .env file
# with AUTH_ prefix (e.g., AUTH_TRAEFIK_HOST, AUTH_DOCKER_IMAGE, AUTH_DB_NAME)
# All secrets are in secrets.env (e.g., AUTH_KC_ADMIN_PASSWORD)

View File

@@ -0,0 +1,41 @@
name: auth
services:
keycloak:
image: ${AUTH_DOCKER_IMAGE}
container_name: ${COMPOSE_PROJECT_NAME}_keycloak
restart: unless-stopped
environment:
KC_DB: postgres
KC_DB_URL: jdbc:postgresql://${DB_HOST}:${DB_PORT}/${AUTH_DB_NAME}
KC_DB_USERNAME: ${DB_USER}
KC_DB_PASSWORD: ${DB_PASSWORD}
KC_DB_SCHEMA: public
KC_HOSTNAME: https://${AUTH_TRAEFIK_HOST}
KC_HTTP_ENABLED: true
HTTP_ADDRESS_FORWARDING: true
KC_BOOTSTRAP_ADMIN_USERNAME: admin
KC_BOOTSTRAP_ADMIN_PASSWORD: ${AUTH_KC_ADMIN_PASSWORD}
KC_PROXY: edge
KC_FEATURES: docker
command: start
networks:
- kompose_network
labels:
- 'traefik.enable=${AUTH_TRAEFIK_ENABLED}'
- 'traefik.http.middlewares.${COMPOSE_PROJECT_NAME}-redirect-web-secure.redirectscheme.scheme=https'
- 'traefik.http.routers.${COMPOSE_PROJECT_NAME}-web.middlewares=${COMPOSE_PROJECT_NAME}-redirect-web-secure'
- 'traefik.http.routers.${COMPOSE_PROJECT_NAME}-web.rule=Host(`${AUTH_TRAEFIK_HOST}`)'
- 'traefik.http.routers.${COMPOSE_PROJECT_NAME}-web.entrypoints=web'
- 'traefik.http.routers.${COMPOSE_PROJECT_NAME}-web-secure.rule=Host(`${AUTH_TRAEFIK_HOST}`)'
- 'traefik.http.routers.${COMPOSE_PROJECT_NAME}-web-secure.tls.certresolver=resolver'
- 'traefik.http.routers.${COMPOSE_PROJECT_NAME}-web-secure.entrypoints=web-secure'
- 'traefik.http.middlewares.${COMPOSE_PROJECT_NAME}-web-secure-compress.compress=true'
- 'traefik.http.routers.${COMPOSE_PROJECT_NAME}-web-secure.middlewares=${COMPOSE_PROJECT_NAME}-web-secure-compress'
- 'traefik.http.services.${COMPOSE_PROJECT_NAME}-web-secure.loadbalancer.server.port=8080'
- 'traefik.docker.network=${NETWORK_NAME:-kompose}'
networks:
kompose_network:
name: ${NETWORK_NAME:-kompose}
external: true

View File

@@ -0,0 +1,51 @@
# ===================================================================
# KOMPOSE - Secrets Configuration
# ===================================================================
# This file contains SENSITIVE data and should NOT be committed to git.
# Add secrets.env to your .gitignore file!
#
# Generate random secrets with: ./kompose.sh --generate-secrets
# ===================================================================
# -------------------------------------------------------------------
# Database Passwords (Shared)
# -------------------------------------------------------------------
DB_PASSWORD=CHANGE_ME_GENERATE_WITH_KOMPOSE
# -------------------------------------------------------------------
# Admin Passwords
# -------------------------------------------------------------------
ADMIN_PASSWORD=CHANGE_ME_GENERATE_WITH_KOMPOSE
# -------------------------------------------------------------------
# Email/SMTP Passwords
# -------------------------------------------------------------------
EMAIL_SMTP_PASSWORD=CHANGE_ME_GENERATE_WITH_KOMPOSE
# -------------------------------------------------------------------
# AUTH Stack Secrets (Keycloak)
# -------------------------------------------------------------------
AUTH_KC_ADMIN_PASSWORD=CHANGE_ME_GENERATE_WITH_KOMPOSE
# -------------------------------------------------------------------
# TRACK Stack Secrets (Umami)
# -------------------------------------------------------------------
# APP_SECRET for Umami (64 character hex string)
TRACK_APP_SECRET=CHANGE_ME_GENERATE_WITH_KOMPOSE
# -------------------------------------------------------------------
# Add more stack secrets below (scope them with stack name)
# -------------------------------------------------------------------
# BLOG_SECRET_KEY=CHANGE_ME_GENERATE_WITH_KOMPOSE
# CHAT_ENCRYPTION_KEY=CHANGE_ME_GENERATE_WITH_KOMPOSE
# DATA_DIRECTUS_SECRET=CHANGE_ME_GENERATE_WITH_KOMPOSE
# CODE_GITEA_RUNNER_TOKEN=CHANGE_ME_GENERATE_WITH_KOMPOSE
# etc...
# Example secrets from your current .env that should be scoped:
# GITEA_RUNNER_REGISTRATION_TOKEN=CHANGE_ME_GENERATE_WITH_KOMPOSE
# NEXTAUTH_SECRET=CHANGE_ME_GENERATE_WITH_KOMPOSE
# JWT_TOKEN=CHANGE_ME_GENERATE_WITH_KOMPOSE
# N8N_ENCRYPTION_KEY=CHANGE_ME_GENERATE_WITH_KOMPOSE
# DIRECTUS_SECRET=CHANGE_ME_GENERATE_WITH_KOMPOSE
# PASSWORD_HASH=CHANGE_ME_GENERATE_WITH_KOMPOSE

View File

@@ -0,0 +1,6 @@
# Stack identification
COMPOSE_PROJECT_NAME=track
# Note: All configuration variables are now in the root .env file
# with TRACK_ prefix (e.g., TRACK_TRAEFIK_HOST, TRACK_DOCKER_IMAGE)
# All secrets are in secrets.env (e.g., TRACK_APP_SECRET)

View File

@@ -0,0 +1,37 @@
name: track
services:
umami:
image: ${TRACK_DOCKER_IMAGE}
container_name: ${COMPOSE_PROJECT_NAME}_app
restart: unless-stopped
environment:
DATABASE_URL: postgresql://${DB_USER}:${DB_PASSWORD}@${DB_HOST}:${DB_PORT}/${TRACK_DB_NAME}
DATABASE_TYPE: postgresql
APP_SECRET: ${TRACK_APP_SECRET}
networks:
- kompose_network
healthcheck:
test: ["CMD-SHELL", "curl -f http://localhost:3000/api/heartbeat || exit 1"]
interval: 30s
timeout: 10s
retries: 5
start_period: 40s
labels:
- 'traefik.enable=${TRACK_TRAEFIK_ENABLED}'
- 'traefik.http.middlewares.${COMPOSE_PROJECT_NAME}-redirect-web-secure.redirectscheme.scheme=https'
- 'traefik.http.routers.${COMPOSE_PROJECT_NAME}-web.middlewares=${COMPOSE_PROJECT_NAME}-redirect-web-secure'
- 'traefik.http.routers.${COMPOSE_PROJECT_NAME}-web.rule=Host(`${TRACK_TRAEFIK_HOST}`)'
- 'traefik.http.routers.${COMPOSE_PROJECT_NAME}-web.entrypoints=web'
- 'traefik.http.routers.${COMPOSE_PROJECT_NAME}-web-secure.rule=Host(`${TRACK_TRAEFIK_HOST}`)'
- 'traefik.http.routers.${COMPOSE_PROJECT_NAME}-web-secure.tls.certresolver=resolver'
- 'traefik.http.routers.${COMPOSE_PROJECT_NAME}-web-secure.entrypoints=web-secure'
- 'traefik.http.middlewares.${COMPOSE_PROJECT_NAME}-web-secure-compress.compress=true'
- 'traefik.http.routers.${COMPOSE_PROJECT_NAME}-web-secure.middlewares=${COMPOSE_PROJECT_NAME}-web-secure-compress'
- 'traefik.http.services.${COMPOSE_PROJECT_NAME}-web-secure.loadbalancer.server.port=3000'
- 'traefik.docker.network=${NETWORK_NAME:-kompose}'
networks:
kompose_network:
name: ${NETWORK_NAME:-kompose}
external: true