Skip to content

this is not a quickstart #13

@allen-munsch

Description

@allen-munsch

I've been trying to get the quickstart running and hit blockers at nearly every entry point:

  • install.sh requires chmod +x and fails without Docker Desktop (why is Docker Desktop specifically required?)
  • Configurator fails to start
  • Dashboard shows error toasts (though migrations do seem to run behind them)
  • Frontend doesn't compile due to lockfile mismatch
  • Tiltfile uses bash syntax but runs with sh
  • Various login issues with the dashboard

I've attached a diff with fixes I've attempted, including:

  • docker-compose > docker compose (the former is deprecated)
  • Bash substring syntax > POSIX-compatible cut
  • Added minikube/kubectl setup as an alternative to Docker Desktop's Kubernetes

Even with these changes, tilt up fails with:

Configurator: ERR_MODULE_NOT_FOUND: Cannot find module '/app/src/lib/graphql/client'

  • Dashboard: Cannot query field "settings" on type "AppExtension"
  • Frontend: pnpm-lock.yaml is not up to date with package.json (next version mismatch: 14.1.3 vs 14.2.35)

This is frustrating because I had a working Saleor deployment on Fly.io for ~$25/month about 11 months ago, simple setup, payments working, custom storefront. I was hoping to revisit the project and potentially migrate to Saleor Cloud if things took off, but I can't even get the local dev environment running now.
I'd be happy to contribute fixes if there's interest, but the current state of the quickstart is a significant barrier to entry.

09:36:42 jm@pop-os saleor-platform ±|main✔|→ lsb_release -a
No LSB modules are available.
Distributor ID:	Pop
Description:	Pop!_OS 22.04 LTS
Release:	22.04
Codename:	jammy

09:36:43 jm@pop-os saleor-platform ±|main✔|→ uname -a
Linux pop-os 6.17.4-76061704-generic #202510191616~1762410050~22.04~898873a SMP PREEMPT_DYNAMIC Thu N x86_64 x86_64 x86_64 GNU/Linux

diff --git a/Tiltfile b/Tiltfile
index b3fbf8b..214353f 100644
--- a/Tiltfile
+++ b/Tiltfile
@@ -34,7 +34,7 @@ dc_resource('mailpit', labels=['backend'])
 # Apply database migrations
 local_resource(
     name='apply-migrations',
-    cmd='cd backend/saleor-platform && docker-compose run --rm api python3 manage.py migrate',
+    cmd='cd backend/saleor-platform && docker compose run --rm api python3 manage.py migrate',
     deps=['backend/saleor-platform'],
     resource_deps=['create-namespace'],
     labels=['backend']
@@ -43,7 +43,7 @@ local_resource(
 # Populate database with initial data
 local_resource(
     name='populate-db',
-    cmd='cd backend/saleor-platform && docker-compose run --rm api python3 manage.py populatedb --createsuperuser',
+    cmd='cd backend/saleor-platform && docker compose run --rm api python3 manage.py populatedb --createsuperuser',
     deps=['backend/saleor-platform'],
     resource_deps=['apply-migrations'],
     labels=['backend']
@@ -63,7 +63,7 @@ local_resource(
             echo "Attempt $i: Checking API status..." && \
             curl -v http://localhost:8000/graphql/ 2>&1 && \
             echo "API is ready. Generating schema..." && \
-            docker-compose run --rm api python3 manage.py get_graphql_schema > ../../frontend/storefront/schema.graphql && \
+            docker compose run --rm api python3 manage.py get_graphql_schema > ../../frontend/storefront/schema.graphql && \
             echo "Schema generated. Checking file:" && \
             ls -l ../../frontend/storefront/schema.graphql && \
             head -n 5 ../../frontend/storefront/schema.graphql && \
@@ -215,7 +215,7 @@ local_resource(
         if [ -f service/configurator/permission_setup_status ] && [ "$(cat service/configurator/permission_setup_status)" != "failed" ]; then
             echo "✅ Permission setup completed successfully on attempt $attempt!"
             TOKEN=$(cat service/configurator/permission_setup_status)
-            echo "Token will be applied: ${TOKEN:0:5}..."
+            echo "Token will be applied: $(echo $TOKEN | cut -c1-5)..."
             exit 0
         else
             echo "❌ Permission setup failed on attempt $attempt."
diff --git a/install.sh b/install.sh
old mode 100644
new mode 100755
index 5eb8509..8b9f874
--- a/install.sh
+++ b/install.sh
@@ -45,90 +45,44 @@ check_docker() {
     fi
 }
 
-# Check if jq is installed
-check_jq() {
-    if ! command -v jq &> /dev/null; then
-        echo "❌ jq not found"
-        if [ "$OS" = "Darwin" ]; then
-            echo "🔄 Installing jq for Mac..."
-            if ! command -v brew &> /dev/null; then
-                echo "❌ Homebrew is required but not installed"
-                echo "Please install Homebrew first and try again"
-                exit 1
-            fi
-            brew install jq
-        elif [ "$OS" = "Linux" ]; then
-            echo "🔄 Installing jq for Linux..."
-            if command -v apt-get &> /dev/null; then
-                sudo apt-get update
-                sudo apt-get install -y jq
-            elif command -v yum &> /dev/null; then
-                sudo yum install -y jq
-            elif command -v dnf &> /dev/null; then
-                sudo dnf install -y jq
-            else
-                echo "⚠️ Unable to determine package manager. Please install jq manually:"
-                echo "https://stedolan.github.io/jq/download/"
-                exit 1
-            fi
-        else
-            echo "⚠️ Please install jq manually from https://stedolan.github.io/jq/download/"
-            exit 1
-        fi
+# Check if kubectl is installed
+check_kubectl() {
+    if ! command -v kubectl &> /dev/null; then
+        echo "❌ kubectl not found"
+        echo "🔄 Installing kubectl for Linux..."
+        
+        # Download the latest release of kubectl
+        curl -LO "https://storage.googleapis.com/kubernetes-release/release/v1.24.0/bin/linux/amd64/kubectl"
+        chmod +x kubectl
+        sudo mv kubectl /usr/local/bin/
+        echo "✅ kubectl is installed"
     else
-        echo "✅ jq is installed"
-        jq_version=$(jq --version)
-        echo "📦 jq version: $jq_version"
+        echo "✅ kubectl is already installed"
     fi
 }
 
-# Check if Tilt is installed
-check_tilt() {
-    if ! command -v tilt &> /dev/null; then
-        echo "❌ Tilt not found"
-        if [ "$OS" = "Darwin" ]; then
-            echo "🔄 Installing Tilt for Mac..."
-            if ! command -v brew &> /dev/null; then
-                echo "❌ Homebrew is required but not installed"
-                echo "📥 Installing Homebrew..."
-                if [ "$ARCH" = "arm64" ]; then
-                    echo "Using Homebrew installation for Apple Silicon Mac"
-                    /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
-                    echo 'eval "$(/opt/homebrew/bin/brew shellenv)"' >> ~/.zprofile
-                    eval "$(/opt/homebrew/bin/brew shellenv)"
-                else
-                    echo "Using Homebrew installation for Intel Mac"
-                    /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
-                fi
-            fi
-            brew install tilt
-        elif [ "$OS" = "Linux" ]; then
-            echo "🔄 Installing Tilt for Linux..."
-            curl -fsSL https://raw.githubusercontent.com/tilt-dev/tilt/master/scripts/install.sh | bash
-        else
-            echo "⚠️ Please install Tilt manually from https://docs.tilt.dev/install.html"
-            exit 1
-        fi
+# Check if Minikube is installed
+check_minikube() {
+    if ! command -v minikube &> /dev/null; then
+        echo "❌ Minikube not found"
+        echo "🔄 Installing Minikube for Linux..."
+        
+        # Install Minikube
+        curl -Lo minikube https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
+        chmod +x minikube
+        sudo mv minikube /usr/local/bin/
+        echo "✅ Minikube is installed"
     else
-        echo "✅ Tilt is installed"
-        tilt_version=$(tilt version | head -n1 | awk '{print $2}')
-        echo "📦 Tilt version: $tilt_version"
+        echo "✅ Minikube is already installed"
     fi
 }
 
-# Check if Kubernetes is enabled
-check_kubernetes() {
-    if ! kubectl version &> /dev/null; then
-        echo "❌ Kubernetes is not enabled"
-        echo "⚠️ Please enable Kubernetes in Docker Desktop:"
-        echo "1. Open Docker Desktop"
-        echo "2. Go to Settings -> Kubernetes"
-        echo "3. Check 'Enable Kubernetes'"
-        echo "4. Click 'Apply & Restart'"
-        exit 1
-    else
-        echo "✅ Kubernetes is enabled"
-    fi
+# Start Minikube
+start_minikube() {
+    echo "🔄 Starting Minikube Kubernetes cluster..."
+    minikube start --driver=docker
+    export KUBEVIRTUAL_KUBECONFIG=$HOME/.kube/config
+    echo "✅ Minikube Kubernetes cluster is running"
 }
 
 # Pull required Docker images
@@ -142,10 +96,12 @@ pull_images() {
 main() {
     echo "🔍 Checking requirements..."
     check_docker
-    check_tilt
-    check_kubernetes
-    check_jq
+    check_minikube
+    check_kubectl
     
+    echo "🔧 Starting Minikube Kubernetes cluster..."
+    start_minikube
+
     echo "🔧 Setting up environment..."
     pull_images
     
@@ -161,4 +117,4 @@ Next steps:
 }
 
 # Run main installation
-main
\ No newline at end of file
+main

Even with those changes, when I go to run tilt up

Configuration fails:

Node.js v20.19.6
 ELIFECYCLE  Command failed with exit code 1.
[event: pod saleor/saleor-configurator-655dcc665b-m5d8r] Back-off restarting failed container saleor-configurator in pod saleor-configurator-655dcc665b-m5d8r_saleor(b296a33b-75ba-4418-b879-a9facdf3f181)
[event: pod saleor/saleor-configurator-655dcc665b-m5d8r] Container image "saleor-configurator:tilt-eb47d84fcf02744d" already present on machine
Detected container restart. Pod: saleor-configurator-655dcc665b-m5d8r. Container: saleor-configurator.
Using schema provided by volume mount

> saleor-configurator@ bootstrap /app
> tsx src/commands/bootstrap.ts


node:internal/modules/run_main:123
    triggerUncaughtException(
    ^
Error [ERR_MODULE_NOT_FOUND]: Cannot find module '/app/src/lib/graphql/client' imported from /app/src/commands/setup.ts
    at finalizeResolution (node:internal/modules/esm/resolve:283:11)
    at moduleResolve (node:internal/modules/esm/resolve:952:10)
    at defaultResolve (node:internal/modules/esm/resolve:1188:11)
    at nextResolve (node:internal/modules/esm/hooks:864:28)
    at resolveBase (file:///app/node_modules/.pnpm/tsx@4.21.0/node_modules/tsx/dist/esm/index.mjs?1766891376263:2:3744)
    at async resolveDirectory (file:///app/node_modules/.pnpm/tsx@4.21.0/node_modules/tsx/dist/esm/index.mjs?1766891376263:2:4237)
    at async resolve (file:///app/node_modules/.pnpm/tsx@4.21.0/node_modules/tsx/dist/esm/index.mjs?1766891376263:2:5355)
    at async nextResolve (node:internal/modules/esm/hooks:864:22)
    at async Hooks.resolve (node:internal/modules/esm/hooks:306:24)
    at async handleMessage (node:internal/modules/esm/worker:196:18) {
  code: 'ERR_MODULE_NOT_FOUND',
  url: 'file:///app/src/lib/graphql/client'
}

graphql endpoints are busted for the saleor-dashboard:

Cannot query field "settings" on type "AppExtension".

Frontend doesn't compile:

     [deps 6/6] RUN pnpm install --frozen-lockfile --prefer-offline
       → ! Corepack is about to download https://registry.npmjs.org/pnpm/-/pnpm-9.6.0.tgz
       →  ERR_PNPM_OUTDATED_LOCKFILE  Cannot install with "frozen-lockfile" because pnpm-lock.yaml is not up to date with package.json
       → 
       → Note that in CI environments this setting is true by default. If you still need to run install in such cases, use "pnpm install --no-frozen-lockfile"
       → 
       →     Failure reason:
       →     specifiers in the lockfile ({"@adyen/adyen-web":"5.53.3","@adyen/api-library":"15.0.0-beta","@headlessui/react":"1.7.18","@saleor/auth-sdk":"1.0.1","@stripe/react-stripe-js":"2.6.2","@stripe/stripe-js":"2.2.0","@tailwindcss/container-queries":"0.1.1","clsx":"2.1.0","editorjs-html":"3.4.3","formik":"2.4.5","libphonenumber-js":"1.10.58","lodash-es":"4.17.21","lucide-react":"0.358.0","next":"14.1.3","query-string":"8.1.0","react":"18.2.0","react-dom":"18.2.0","react-error-boundary":"4.0.13","react-spinners":"0.13.8","react-test-renderer":"18.2.0","react-toastify":"9.1.3","sharp":"0.33.2","ts-invariant":"0.10.3","url-join":"5.0.0","urql":"4.0.6","xss":"1.0.15","yup":"1.3.2","zustand":"4.4.6","@graphql-codegen/cli":"5.0.0","@graphql-codegen/client-preset":"4.1.0","@graphql-typed-document-node/core":"3.2.0","@next/env":"14.0.4","@parcel/watcher":"2.3.0","@playwright/test":"1.40.1","@tailwindcss/forms":"0.5.7","@tailwindcss/typography":"0.5.10","@types/lodash-es":"4.17.12","@types/node":"20.10.0","@types/react":"18.2.38","@types/react-dom":"18.2.17","@types/url-join":"4.0.3","@typescript-eslint/eslint-plugin":"6.14.0","@typescript-eslint/parser":"6.14.0","autoprefixer":"10.4.16","eslint":"8.56.0","eslint-config-next":"14.0.4","eslint-config-prettier":"9.1.0","eslint-plugin-import":"2.29.1","eslint-plugin-playwright":"0.18.0","graphql-tag":"2.12.6","husky":"8.0.3","lint-staged":"15.1.0","postcss":"8.4.32","prettier":"3.1.1","prettier-plugin-tailwindcss":"0.5.9","schema-dts":"1.1.2","tailwindcss":"3.4.0","typescript":"5.3.3","wonka":"6.3.4"}) don't match specs in package.json ({"@graphql-codegen/cli":"5.0.0","@graphql-codegen/client-preset":"4.1.0","@graphql-typed-document-node/core":"3.2.0","@next/env":"14.0.4","@parcel/watcher":"2.3.0","@playwright/test":"1.40.1","@tailwindcss/forms":"0.5.7","@tailwindcss/typography":"0.5.10","@types/lodash-es":"4.17.12","@types/node":"20.10.0","@types/react":"18.2.38","@types/react-dom":"18.2.17","@types/url-join":"4.0.3","@typescript-eslint/eslint-plugin":"6.14.0","@typescript-eslint/parser":"6.14.0","autoprefixer":"10.4.16","eslint":"8.56.0","eslint-config-next":"14.0.4","eslint-config-prettier":"9.1.0","eslint-plugin-import":"2.29.1","eslint-plugin-playwright":"0.18.0","graphql-tag":"2.12.6","husky":"8.0.3","lint-staged":"15.1.0","postcss":"8.4.32","prettier":"3.1.1","prettier-plugin-tailwindcss":"0.5.9","schema-dts":"1.1.2","tailwindcss":"3.4.0","typescript":"5.3.3","wonka":"6.3.4","@adyen/adyen-web":"5.53.3","@adyen/api-library":"15.0.0-beta","@headlessui/react":"1.7.18","@saleor/auth-sdk":"1.0.1","@stripe/react-stripe-js":"2.6.2","@stripe/stripe-js":"2.2.0","@tailwindcss/container-queries":"0.1.1","clsx":"2.1.0","editorjs-html":"3.4.3","formik":"2.4.5","libphonenumber-js":"1.10.58","lodash-es":"4.17.21","lucide-react":"0.358.0","next":"14.2.35","query-string":"8.1.0","react":"18.2.0","react-dom":"18.2.0","react-error-boundary":"4.0.13","react-spinners":"0.13.8","react-test-renderer":"18.2.0","react-toastify":"9.1.3","sharp":"0.33.2","ts-invariant":"0.10.3","url-join":"5.0.0","urql":"4.0.6","xss":"1.0.15","yup":"1.3.2","zustand":"4.4.6"})
     
     ERROR IN: [deps 6/6] RUN pnpm install --frozen-lockfile --prefer-offline

Build Failed: ImageBuild: process "/bin/sh -c pnpm install --frozen-lockfile --prefer-offline" did not complete successfully: exit code: 1

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions