#!/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