feat: add OpenProject 17 docker compose stack and test data seeder

- Configure OpenProject 17 with PostgreSQL 17 and Memcached

- Add scripts/seed-test-data.rb for test project, work packages, and API key generation

- Add scripts/seed.sh to orchestrate container health check and seed execution

- Add scripts/start.sh and scripts/stop.sh stack lifecycle helpers

- Provide .env.example with defaults
This commit is contained in:
Lucas Winther
2026-09-05 16:31:15 +02:00
parent e70e329e9d
commit 105a954e54
6 changed files with 362 additions and 0 deletions
+65
View File
@@ -0,0 +1,65 @@
#!/usr/bin/env bash
# ==============================================================================
# OpenProject MCP Companion - Seed Script
# Waits for OpenProject to be healthy, runs test data seeder, and saves API key.
# ==============================================================================
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
ROOT_DIR="$(cd "${SCRIPT_DIR}/.." && pwd)"
BASE_URL="${OPENPROJECT_BASE_URL:-http://localhost:8080}"
MAX_WAIT_SECONDS=180
INTERVAL=5
echo "[seed.sh] Waiting for OpenProject to be healthy at ${BASE_URL}..."
elapsed=0
until curl -s -f "${BASE_URL}/health_checks/default" >/dev/null 2>&1; do
if [ "$elapsed" -ge "$MAX_WAIT_SECONDS" ]; then
echo "[seed.sh] ERROR: Timed out waiting for OpenProject after ${MAX_WAIT_SECONDS} seconds."
echo "[seed.sh] Check container logs with: docker compose logs web"
exit 1
fi
echo "[seed.sh] OpenProject not ready yet. Retrying in ${INTERVAL}s (${elapsed}s / ${MAX_WAIT_SECONDS}s)..."
sleep "$INTERVAL"
elapsed=$((elapsed + INTERVAL))
done
echo "[seed.sh] OpenProject is up and healthy!"
echo "[seed.sh] Running seed script inside container..."
SEED_OUTPUT=$(docker compose -f "${ROOT_DIR}/docker-compose.yml" exec -T web bundle exec rails runner /scripts/seed-test-data.rb)
echo "${SEED_OUTPUT}"
JSON_PAYLOAD=$(echo "${SEED_OUTPUT}" | sed -n '/---SEED_RESULT_START---/,/---SEED_RESULT_END---/p' | grep -v -- '---SEED_RESULT_')
if [ -z "${JSON_PAYLOAD}" ]; then
echo "[seed.sh] ERROR: Could not extract seed payload from output."
exit 1
fi
API_KEY=$(python3 -c "import json, sys; print(json.loads(sys.stdin.read())['apiKey'])" <<< "${JSON_PAYLOAD}")
PROJECT_IDENTIFIER=$(python3 -c "import json, sys; print(json.loads(sys.stdin.read())['projectIdentifier'])" <<< "${JSON_PAYLOAD}")
# Update .env.test
cat <<EOF > "${ROOT_DIR}/.env.test"
# Auto-generated by scripts/seed.sh on $(date -u +"%Y-%m-%dT%H:%M:%SZ")
OPENPROJECT_BASE_URL=${BASE_URL}
OPENPROJECT_API_KEY=${API_KEY}
OPENPROJECT_TEST_PROJECT=${PROJECT_IDENTIFIER}
EOF
# Also update .env.local if not present or populate key
if [ ! -f "${ROOT_DIR}/.env.local" ]; then
cp "${ROOT_DIR}/.env.test" "${ROOT_DIR}/.env.local"
fi
echo ""
echo "[seed.sh] Success! Test environment configured."
echo "[seed.sh] API credentials written to .env.test and .env.local"
echo "[seed.sh] Base URL: ${BASE_URL}"
echo "[seed.sh] API Key: ${API_KEY}"
echo "[seed.sh] Test Project: ${PROJECT_IDENTIFIER}"