FROM debian:bookworm-slim

RUN apt-get update && apt-get install -y curl gpg sudo lsb-release ca-certificates wget
RUN echo "deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list
RUN curl -fsSL https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/postgresql.gpg
RUN apt-get update && apt-get install -y build-essential make gcc pkg-config clang gettext autoconf automake libssl-dev

# install nfs & iscsi
RUN apt-get install -y nfs-common
RUN apt-get install -y open-iscsi

# postgresql build libs
RUN apt-get install -y python3 python3-dev libpython3-dev python3-postgresql postgresql-plpython3-17
RUN apt-get install -y perl perl-tk libgtk3-perl libperl-dev less dialog
RUN apt-get install -y tcl tcllib tcl-dev postgresql-pltcl-17
RUN apt-get install -y postgis postgresql-postgis postgresql-postgis-scripts postgresql-17-postgis-3 postgresql-17-postgis-3
RUN apt-get install -y pkg-config bison flex libicu-dev icu-devtools readline-common libreadline-dev libreadline-java rlwrap
RUN apt-get install -y libpam-modules libpam-modules-bin python3-pam python3-pampy
RUN apt-get install -y llvm-19 llvm-dev lld libclang-dev clang clang-19 clang-tools
RUN apt-get install -y net-tools iputils-ping iputils-tracepath iputils-clockdiff iputils-arping
RUN apt-get install -y postgresql-server-dev-17 libssl-dev

# postgresql install
RUN apt-get install -y postgresql-17
ENV PATH=$PATH:/usr/lib/postgresql/17/bin

# postgresql-17 extensions; including postgis and foreign data wrappers
RUN apt-get install -y -V libsybdb5 freetds-dev freetds-common # tds file support for Sybase and Microsoft SQL Server
RUN apt-get install -y --no-install-recommends \
    postgresql-17-pgvector \
    postgresql-17-pgaudit \
    postgresql-17-pg-failover-slots \
    postgresql-17-pglogical \
    postgresql-17-timescaledb \
    postgresql-17-mysql-fdw \
    postgresql-17-oracle-fdw \
    postgresql-17-orafce \
    postgresql-17-pgl-ddl-deploy \
    postgresql-17-pg-hint-plan \
    postgresql-17-pgpool2 \
    postgresql-17-pgrouting \
    postgresql-17-pg-stat-kcache \
    postgresql-17-pg-wait-sampling \
    postgresql-17-powa \
    postgresql-17-plr \
    postgresql-17-show-plans \
    postgresql-17-slony1-2 \
    postgresql-17-tds-fdw \
    postgresql-client-17

# apache arrow
RUN wget https://packages.apache.org/artifactory/arrow/$(lsb_release --id --short | tr 'A-Z' 'a-z')/apache-arrow-apt-source-latest-$(lsb_release --codename --short).deb
RUN apt install -y -V ./apache-arrow-apt-source-latest-$(lsb_release --codename --short).deb
RUN apt update
RUN apt install -y -V libarrow-dev # For C++
RUN apt install -y -V libarrow-glib-dev # For GLib (C)
RUN apt install -y -V libarrow-dataset-dev # For Apache Arrow Dataset C++
RUN apt install -y -V libarrow-dataset-glib-dev # For Apache Arrow Dataset GLib (C)
RUN apt install -y -V libarrow-acero-dev # For Apache Arrow Acero
RUN apt install -y -V libarrow-flight-dev # For Apache Arrow Flight C++
RUN apt install -y -V libarrow-flight-glib-dev # For Apache Arrow Flight GLib (C)
RUN apt install -y -V libarrow-flight-sql-dev # For Apache Arrow Flight SQL C++
RUN apt install -y -V libarrow-flight-sql-glib-dev # For Apache Arrow Flight SQL GLib (C)
RUN apt install -y -V libgandiva-dev # For Gandiva C++
RUN apt install -y -V libgandiva-glib-dev # For Gandiva GLib (C)
RUN apt install -y -V libparquet-dev # For Apache Parquet C++
RUN apt install -y -V libparquet-glib-dev # For Apache Parquet GLib (C)

ENV PGDATA=/var/lib/postgresql/data
RUN install --verbose --directory --owner postgres --group postgres --mode 3777 /var/run/postgresql
RUN install --verbose --directory --owner postgres --group postgres --mode 1777 "$PGDATA"
VOLUME /var/lib/postgresql/data

# gosu - postgres
RUN apt-get install -y gosu

# make the "en_US.UTF-8" locale so postgres will be utf-8 enabled by default
RUN set -eux; \
	if [ -f /etc/dpkg/dpkg.cfg.d/docker ]; then \
# if this file exists, we're likely in "debian:xxx-slim", and locales are thus being excluded so we need to remove that exclusion (since we need locales)
		grep -q '/usr/share/locale' /etc/dpkg/dpkg.cfg.d/docker; \
		sed -ri '/\/usr\/share\/locale/d' /etc/dpkg/dpkg.cfg.d/docker; \
		! grep -q '/usr/share/locale' /etc/dpkg/dpkg.cfg.d/docker; \
	fi; \
	apt-get update; apt-get install -y --no-install-recommends locales; rm -rf /var/lib/apt/lists/*; \
	echo 'en_US.UTF-8 UTF-8' >> /etc/locale.gen; \
	locale-gen; \
	locale -a | grep 'en_US.utf8'
ENV LANG=en_US.utf8

RUN set -eux; \
	apt-get update; \
	apt-get install -y --no-install-recommends \
		libnss-wrapper \
		xz-utils \
		zstd \
	; \
	rm -rf /var/lib/apt/lists/*

RUN mkdir /docker-entrypoint-initdb.d

# Install barman-cloud
COPY requirements.txt /
RUN set -xe; \
        apt-get update; \
        apt-get install -y --no-install-recommends \
                # We require build-essential and python3-dev to build lz4 on arm64 since there isn't a pre-compiled wheel available
                build-essential python3-dev \
                python3-pip \
                python3-psycopg2 \
                python3-setuptools \
        ; \
        pip3 install --break-system-packages --upgrade pip; \
        # TODO: Remove --no-deps once https://github.com/pypa/pip/issues/9644 is solved
        pip3 install --break-system-packages --no-deps -r requirements.txt; \
        apt-get remove -y --purge --autoremove build-essential python3-dev; \
        rm -rf /var/lib/apt/lists/*;

ENV PG_MAJOR=17
ENV PATH=$PATH:/usr/lib/postgresql/$PG_MAJOR/bin`

COPY docker-entrypoint.sh docker-ensure-initdb.sh /usr/local/bin/
RUN ln -sT docker-ensure-initdb.sh /usr/local/bin/docker-enforce-initdb.sh
ENTRYPOINT ["docker-entrypoint.sh"]

# Change the uid of postgres to 26
RUN usermod -u 26 postgres
RUN chown -R postgres:postgres /etc/postgresql
RUN chown -R postgres:postgres /var/lib/postgresql
RUN chown -R postgres:postgres /var/log/postgresql
RUN chown postgres:postgres /var/run/postgresql
USER 26

STOPSIGNAL SIGINT

EXPOSE 5432
CMD ["postgres"]
