commit c16d5ea349256de3bbbb1f79e6e2487187a97649 Author: ncd Date: Thu Dec 4 22:00:05 2025 +0100 Creates pod with Langflow and Postgres diff --git a/bin/create_pod_langflow.sh b/bin/create_pod_langflow.sh new file mode 100755 index 0000000..209cbdc --- /dev/null +++ b/bin/create_pod_langflow.sh @@ -0,0 +1,92 @@ +#!/bin/bash + +# To be run by user ncd to create pod and Langflow + Postgres containers + +set -e + +# Environment variables +POD_NAME='langflow_pod' +LANGFLOW_CTR_NAME='langflow_ctr' +LANGFLOW_IMAGE='docker.io/langflowai/langflow:v1.6.9' +POSTGRES_CTR_NAME='postgres' +POSTGRES_IMAGE='docker.io/library/postgres:18.1' +HOST_LOCAL_IP='127.0.0.1' +# Expose Langflow on 8090 -> 7860; Postgres is only reachable inside the pod +LANGFLOW_HOST_PORT='8090' +LANGFLOW_CONTAINER_PORT='7860' +BIND_DIR="$HOME/.local/share/$POD_NAME" +LANGFLOW_DATA_DIR="$BIND_DIR/langflow-data" +POSTGRES_DATA_DIR="$BIND_DIR/postgres-data" +USER_SYSTEMD_DIR="$HOME/.config/systemd/user" + +# Prepare directories +mkdir -p "$LANGFLOW_DATA_DIR" "$POSTGRES_DATA_DIR" "$USER_SYSTEMD_DIR" + +# Create pod if not yet existing +if ! podman pod exists "$POD_NAME"; then + podman pod create -n "$POD_NAME" \ + -p "$HOST_LOCAL_IP:$LANGFLOW_HOST_PORT:$LANGFLOW_CONTAINER_PORT" + echo "Pod '$POD_NAME' created (rc=$?)" +else + echo "Pod '$POD_NAME' already exists." +fi + +# Remove any old containers +podman rm -f "$LANGFLOW_CTR_NAME" +podman rm -f "$POSTGRES_CTR_NAME" + +# Postgres container +podman run -d --name "$POSTGRES_CTR_NAME" --pod "$POD_NAME" \ + -e POSTGRES_USER=langflow \ + -e POSTGRES_PASSWORD=langflow \ + -e POSTGRES_DB=langflow \ + -v "$POSTGRES_DATA_DIR:/var/lib/postgresql/data:Z" \ + "$POSTGRES_IMAGE" +echo "Container '$POSTGRES_CTR_NAME' started (rc=$?)" + +# Langflow container +podman run -d --name "$LANGFLOW_CTR_NAME" --pod "$POD_NAME" \ + -e LANGFLOW_DATABASE_URL=postgresql://langflow:langflow@postgres:5432/langflow \ + -e LANGFLOW_CONFIG_DIR=/app/langflow \ + -v "$LANGFLOW_DATA_DIR:/app/langflow:Z" \ + "$LANGFLOW_IMAGE" +echo "Container '$LANGFLOW_CTR_NAME' started (rc=$?)" + +# Generate systemd service files +cd "$USER_SYSTEMD_DIR" +podman generate systemd --name --new --files "$POD_NAME" +echo "Generated systemd service files (rc=$?)" + +# Stop & remove live pod and containers +podman pod stop --ignore --time 15 "$POD_NAME" +podman pod rm -f --ignore "$POD_NAME" +if podman pod exists "$POD_NAME"; then + echo "ERROR: Pod $POD_NAME still exists." >&2 + exit 1 +else + echo "Stopped & removed live pod $POD_NAME and containers." +fi + +# Enable systemd user services +systemctl --user daemon-reload +# pod service (creates pod + containers) +systemctl --user enable --now "pod-${POD_NAME}.service" +systemctl --user is-enabled "pod-${POD_NAME}.service" +systemctl --user is-active "pod-${POD_NAME}.service" +echo "Enabled systemd service pod-${POD_NAME}.service (rc=$?)" +echo "To view status: systemctl --user status pod-${POD_NAME}.service" +echo "To view logs: journalctl --user -u pod-${POD_NAME}.service -f" + +# Wait for API readiness +CHECK_URL="http://$HOST_LOCAL_IP:$LANGFLOW_HOST_PORT" +for attempt in $(seq 1 30); do + if curl -fsS "$CHECK_URL" >/dev/null 2>&1; then + echo "Langflow REST API is reachable at http://$HOST_LOCAL_IP:$LANGFLOW_HOST_PORT." + break + fi + sleep 2 + if [ "$attempt" -eq 30 ]; then + echo "timeout error." >&2 + exit 1 + fi + done