Install pgAdmin 9.18 in its own virtualenv and run it under gunicorn on port 5050 next to PostgreSQL and the bridge. On first start the entrypoint creates the pgAdmin login (PGADMIN_DEFAULT_EMAIL, default admin@example.com; PGADMIN_DEFAULT_PASSWORD, default POSTGRES_PASSWORD) and registers the bundled PostgreSQL server. pgAdmin is optional (PEO4C_PGADMIN=false) and a failure in it does not stop the container. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
61 lines
2.2 KiB
Docker
61 lines
2.2 KiB
Docker
# peo4c: neo4j-browser on top of PostgreSQL + Apache AGE.
|
|
#
|
|
# Stage 1 builds the neo4j-browser static frontend from source.
|
|
# Stage 2 is the Apache AGE image (PostgreSQL with the AGE extension) plus the
|
|
# peo4c bridge, which speaks the Bolt protocol to the browser and translates
|
|
# Cypher into AGE `cypher()` calls, and pgAdmin as a SQL interface.
|
|
|
|
ARG AGE_IMAGE=docker.io/apache/age:release_PG18_1.8.0
|
|
ARG PGADMIN_VERSION=9.18
|
|
|
|
FROM docker.io/library/node:16.20.2-bullseye AS browser
|
|
|
|
ARG NEO4J_BROWSER_REPO=https://github.com/neo4j/neo4j-browser.git
|
|
ARG NEO4J_BROWSER_REF=3928c10fd6f148fd615b391d27d3fd6ce43a9044
|
|
|
|
WORKDIR /src
|
|
RUN git init -q . \
|
|
&& git remote add origin "$NEO4J_BROWSER_REPO" \
|
|
&& git fetch -q --depth 1 origin "$NEO4J_BROWSER_REF" \
|
|
&& git checkout -q FETCH_HEAD
|
|
RUN yarn install --frozen-lockfile --network-timeout 600000
|
|
RUN yarn build && test -f dist/index.html
|
|
|
|
|
|
FROM ${AGE_IMAGE}
|
|
|
|
ARG PGADMIN_VERSION
|
|
|
|
RUN apt-get update \
|
|
&& apt-get install -y --no-install-recommends python3 python3-psycopg python3-venv \
|
|
&& rm -rf /var/lib/apt/lists/*
|
|
|
|
RUN python3 -m venv /opt/pgadmin \
|
|
&& /opt/pgadmin/bin/pip install --no-cache-dir "pgadmin4==${PGADMIN_VERSION}" gunicorn \
|
|
&& ln -s "$(/opt/pgadmin/bin/python -c 'import sysconfig; print(sysconfig.get_paths()["purelib"])')/pgadmin4" \
|
|
/opt/pgadmin/app \
|
|
&& mkdir -p /var/lib/pgadmin \
|
|
&& chown postgres:postgres /var/lib/pgadmin
|
|
|
|
COPY --from=browser /src/dist /opt/peo4c/browser
|
|
COPY bridge /opt/peo4c/bridge
|
|
COPY docker/initdb/ /docker-entrypoint-initdb.d/
|
|
COPY docker/pgadmin/config_distro.py /opt/peo4c/pgadmin/config_distro.py
|
|
COPY docker/peo4c-entrypoint.sh /usr/local/bin/peo4c-entrypoint.sh
|
|
|
|
ENV PEO4C_DEFAULT_GRAPH=neo4j \
|
|
PEO4C_BROWSER_DIR=/opt/peo4c/browser \
|
|
PEO4C_HTTP_PORT=7474 \
|
|
PEO4C_BOLT_PORT=7687 \
|
|
PEO4C_PG_HOST=127.0.0.1 \
|
|
PEO4C_PG_PORT=5432 \
|
|
PEO4C_PGADMIN=true \
|
|
PEO4C_PGADMIN_PORT=5050 \
|
|
CONFIG_DISTRO_FILE_PATH=/opt/peo4c/pgadmin/config_distro.py
|
|
|
|
# 7474: neo4j-browser (HTTP), 7687: Bolt, 5050: pgAdmin, 5432: PostgreSQL
|
|
EXPOSE 7474 7687 5050 5432
|
|
|
|
ENTRYPOINT ["/usr/local/bin/peo4c-entrypoint.sh"]
|
|
CMD ["postgres", "-c", "shared_preload_libraries=age"]
|