119 lines
3.9 KiB
Bash
Executable File
119 lines
3.9 KiB
Bash
Executable File
#!/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'
|
|
# Use a valid Langflow image tag
|
|
LANGFLOW_IMAGE='docker.io/langflowai/langflow:1.6.9'
|
|
POSTGRES_CTR_NAME='postgres'
|
|
# Match original docker-compose version
|
|
POSTGRES_IMAGE='docker.io/library/postgres:16'
|
|
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 (ignore errors if they don't exist)
|
|
podman rm -f "$LANGFLOW_CTR_NAME" || true
|
|
podman rm -f "$POSTGRES_CTR_NAME" || true
|
|
|
|
# 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=$?)"
|
|
|
|
# Wait for Postgres to be ready before starting Langflow
|
|
# This avoids initial connection-refused errors in Langflow logs
|
|
# and ensures DB-backed features (like Global Variables) are
|
|
# available as soon as Langflow starts.
|
|
echo "Waiting for Postgres to be ready..."
|
|
for attempt in $(seq 1 30); do
|
|
if podman exec "$POSTGRES_CTR_NAME" pg_isready -U langflow -d langflow >/dev/null 2>&1; then
|
|
echo "Postgres is ready."
|
|
break
|
|
fi
|
|
sleep 2
|
|
if [ "$attempt" -eq 30 ]; then
|
|
echo "ERROR: Postgres did not become ready in time." >&2
|
|
exit 1
|
|
fi
|
|
done
|
|
|
|
# Langflow container
|
|
# In a Podman pod all containers share the same network namespace,
|
|
# so Postgres is reachable via localhost instead of the container name.
|
|
podman run -d --name "$LANGFLOW_CTR_NAME" --pod "$POD_NAME" \
|
|
-e LANGFLOW_DATABASE_URL=postgresql://langflow:langflow@localhost:5432/langflow \
|
|
-e LANGFLOW_CONFIG_DIR=/app/langflow \
|
|
-e LANGFLOW_LOG_FILE=/app/langflow/langflow.log \
|
|
-e LANGFLOW_LOG_ENV=default \
|
|
-e LANGFLOW_PRETTY_LOGS=true \
|
|
-e LANGFLOW_LOG_LEVEL=INFO \
|
|
-e DO_NOT_TRACK=True \
|
|
-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
|