diff --git a/docker/.dockerignore b/docker/.dockerignore index 7cae75457..737244fba 100644 --- a/docker/.dockerignore +++ b/docker/.dockerignore @@ -4,4 +4,6 @@ node_modules **/node_modules/ dist/ **/build/ -src/backend/langflow/frontend \ No newline at end of file +src/backend/langflow/frontend +**/langflow-pre.db +**/langflow.db \ No newline at end of file diff --git a/docker/build_and_push.Dockerfile b/docker/build_and_push.Dockerfile index 6b3aff368..3a34db188 100644 --- a/docker/build_and_push.Dockerfile +++ b/docker/build_and_push.Dockerfile @@ -72,15 +72,18 @@ COPY Makefile ./ COPY README.md ./ RUN --mount=type=cache,target=/root/.cache \ curl -sSL https://install.python-poetry.org | python3 - +RUN useradd -m -u 1000 user && \ + mkdir -p /app/langflow && \ + chown -R user:user /app && \ + chmod -R u+w /app/langflow + +# Update PATH with home/user/.local/bin +ENV PATH="/home/user/.local/bin:${PATH}" RUN python -m pip install requests && cd ./scripts && python update_dependencies.py RUN $POETRY_HOME/bin/poetry lock RUN $POETRY_HOME/bin/poetry build # Copy virtual environment and built .tar.gz from builder base -RUN useradd -m -u 1000 user && \ - mkdir -p /app/langflow && \ - chown -R user:user /app \ - chmod -R u+w /app/langflow USER user # Install the package from the .tar.gz RUN python -m pip install /app/dist/*.tar.gz --user diff --git a/docker/build_and_push_base.Dockerfile b/docker/build_and_push_base.Dockerfile index 42f1e9984..f70a517da 100644 --- a/docker/build_and_push_base.Dockerfile +++ b/docker/build_and_push_base.Dockerfile @@ -78,13 +78,16 @@ RUN cd src/frontend && npm run build COPY src/backend ./src/backend RUN cp -r src/frontend/build src/backend/base/langflow/frontend RUN rm -rf src/backend/base/dist +RUN useradd -m -u 1000 user && \ + mkdir -p /app/langflow && \ + chown -R user:user /app && \ + chmod -R u+w /app/langflow + +# Update PATH with home/user/.local/bin +ENV PATH="/home/user/.local/bin:${PATH}" RUN cd src/backend/base && $POETRY_HOME/bin/poetry build # Copy virtual environment and built .tar.gz from builder base -RUN useradd -m -u 1000 user && \ - mkdir -p /app/langflow && \ - chown -R user:user /app \ - chmod -R u+w /app/langflow USER user # Install the package from the .tar.gz diff --git a/src/backend/base/langflow/alembic/versions/012fb73ac359_add_folder_table.py b/src/backend/base/langflow/alembic/versions/012fb73ac359_add_folder_table.py index 84ebd9ff7..a9b9b6c00 100644 --- a/src/backend/base/langflow/alembic/versions/012fb73ac359_add_folder_table.py +++ b/src/backend/base/langflow/alembic/versions/012fb73ac359_add_folder_table.py @@ -49,10 +49,11 @@ def upgrade() -> None: batch_op.create_index(batch_op.f("ix_folder_name"), ["name"], unique=False) column_names = [column["name"] for column in inspector.get_columns("flow")] - if "folder_id" not in column_names: - with op.batch_alter_table("flow", schema=None) as batch_op: + with op.batch_alter_table("flow", schema=None) as batch_op: + if "folder_id" not in column_names: batch_op.add_column(sa.Column("folder_id", sqlmodel.sql.sqltypes.GUID(), nullable=True)) batch_op.create_foreign_key("flow_folder_id_fkey", "folder", ["folder_id"], ["id"]) + if "folder" in column_names: batch_op.drop_column("folder") # ### end Alembic commands ### @@ -64,11 +65,12 @@ def downgrade() -> None: table_names = inspector.get_table_names() # ### commands auto generated by Alembic - please adjust! ### column_names = [column["name"] for column in inspector.get_columns("flow")] - if "folder_id" in column_names: - with op.batch_alter_table("flow", schema=None) as batch_op: + with op.batch_alter_table("flow", schema=None) as batch_op: + if "folder" not in column_names: batch_op.add_column(sa.Column("folder", sa.VARCHAR(), nullable=True)) - batch_op.drop_constraint("flow_folder_id_fkey", type_="foreignkey") + if "folder_id" in column_names: batch_op.drop_column("folder_id") + batch_op.drop_constraint("flow_folder_id_fkey", type_="foreignkey") indexes = inspector.get_indexes("folder") if "ix_folder_name" in [index["name"] for index in indexes]: diff --git a/src/backend/base/langflow/alembic/versions/7d2162acc8b2_adds_updated_at_and_folder_cols.py b/src/backend/base/langflow/alembic/versions/7d2162acc8b2_adds_updated_at_and_folder_cols.py index b46400899..7499b32ae 100644 --- a/src/backend/base/langflow/alembic/versions/7d2162acc8b2_adds_updated_at_and_folder_cols.py +++ b/src/backend/base/langflow/alembic/versions/7d2162acc8b2_adds_updated_at_and_folder_cols.py @@ -52,9 +52,14 @@ def upgrade() -> None: def downgrade() -> None: # ### commands auto generated by Alembic - please adjust! ### try: + conn = op.get_bind() + inspector = Inspector.from_engine(conn) # type: ignore + column_names = [column["name"] for column in inspector.get_columns("flow")] with op.batch_alter_table("flow", schema=None) as batch_op: - batch_op.drop_column("folder") - batch_op.drop_column("updated_at") + if "folder" in column_names: + batch_op.drop_column("folder") + if "updated_at" in column_names: + batch_op.drop_column("updated_at") except Exception as e: print(e) pass diff --git a/src/backend/base/langflow/main.py b/src/backend/base/langflow/main.py index 697cfa226..07ecae396 100644 --- a/src/backend/base/langflow/main.py +++ b/src/backend/base/langflow/main.py @@ -34,7 +34,12 @@ class JavaScriptMIMETypeMiddleware(BaseHTTPMiddleware): def get_lifespan(fix_migration=False, socketio_server=None): - from langflow.version import __version__ # type: ignore + try: + from langflow.version import __version__ # type: ignore + except ImportError: + from importlib.metadata import version + + __version__ = version("langflow-base") @asynccontextmanager async def lifespan(app: FastAPI): diff --git a/src/backend/base/langflow/services/settings/base.py b/src/backend/base/langflow/services/settings/base.py index f62ccacd4..f7c6440f2 100644 --- a/src/backend/base/langflow/services/settings/base.py +++ b/src/backend/base/langflow/services/settings/base.py @@ -146,7 +146,13 @@ class Settings(BaseSettings): # if there is a database in that location if not info.data["config_dir"]: raise ValueError("config_dir not set, please set it or provide a database_url") - from langflow.version import is_pre_release # type: ignore + try: + from langflow.version import is_pre_release # type: ignore + except ImportError: + from importlib import metadata + + version = metadata.version("langflow-base") + is_pre_release = "a" in version or "b" in version or "rc" in version if info.data["save_db_in_config_dir"]: database_dir = info.data["config_dir"]