# 3E Eğitim — Custom PostgreSQL Image
# Base: TimescaleDB HA (PostgreSQL 18 + TimescaleDB + Toolkit)
# Ek: PostgreSQL Anonymizer (AD-16 dump anonimleştirme), unaccent (AD-01)
#
# Build:
#   docker build -t 3eegitim/postgresql:18-custom deployment/postgresql
#
# PostgreSQL 17 -> 18 (Sets karari, 26.07.2026). TimescaleDB surumu degismedi
# (2.28.3) — yukseltme yalniz PostgreSQL major'unu tasidi.
#
# Anonymizer 1.3.2 -> 3.1.3: 2.x ile birlikte proje C'den pgrx (Rust)'a gecti ve
# 1.3 serisi PG18'i tanimiyor. PGDG bu dagitim/mimari icin (arm64/jammy) hazir
# paket sunmuyor — dogrulandi, kaynaktan derleme tercih degil zorunluluk.
#
# ⚠ IKI ASAMALI BUILD ZORUNLU. Tek asamada derleyip sonra `apt purge` + `rm`
# yapmak imaji KUCULTMEZ: silinen dosyalar onceki katmanlarda durmaya devam eder.
# Ilk denemede imaj 11.8 GB cikti (PG17'de 4 GB). Rust toolchain'i, kaynak agaci
# ve pgrx'in kendi PostgreSQL kopyasi builder asamasinda kalir; final imaja
# yalnizca uretilen .so ve extension dosyalari kopyalanir.

ARG PG_MAJOR=18
# Sade varyant bilincli: `-all` bize gerekmeyen onlarca uzanti tasiyor ve imaji
# 8.5 GB'a cikariyor. Sade taban ihtiyacimiz olan her seyi iceriyor
# (timescaledb, toolkit, pgcrypto, unaccent, pg_trgm, btree_gin,
# pg_stat_statements, uuid-ossp) — dogrulandi. PG17'de de sade varyant
# kullaniliyordu; parite korunuyor.
ARG BASE_IMAGE=timescale/timescaledb-ha:pg18.4-ts2.28.3

# =============================================================================
# 1) builder — anonymizer'i derler, ciktisi disinda hicbir sey tasinmaz
# =============================================================================
FROM ${BASE_IMAGE} AS builder

ARG PG_MAJOR
ENV PGRX_VERSION=0.18.1 \
    ANON_VERSION=3.1.3 \
    CARGO_HOME=/opt/rust/cargo \
    RUSTUP_HOME=/opt/rust/rustup
ENV PATH="${CARGO_HOME}/bin:/usr/lib/postgresql/${PG_MAJOR}/bin:${PATH}"

USER root

# clang/libclang pgrx'in bindgen'i icin zorunlu.
RUN apt-get update && apt-get install -y --no-install-recommends \
    build-essential \
    ca-certificates \
    clang \
    curl \
    git \
    libclang-dev \
    libssl-dev \
    make \
    pkg-config \
    postgresql-server-dev-${PG_MAJOR} \
    && rm -rf /var/lib/apt/lists/*

RUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs \
      | sh -s -- -y --profile minimal --default-toolchain stable

# cargo-pgrx surumu Cargo.toml'daki pgrx ile AYNI olmak zorunda (0.18.1);
# uyusmazsa `cargo pgrx package` acik hata verir.
RUN cargo install cargo-pgrx --version ${PGRX_VERSION} --locked

# Sistemdeki PostgreSQL kullanilir, pgrx kendi kopyasini indirmesin.
RUN cargo pgrx init --pg${PG_MAJOR} "$(which pg_config)"

# Ciktiyi tek bir dizine toplayip final asamaya oradan kopyalayacagiz.
RUN cd /tmp && \
    git clone --depth 1 --branch ${ANON_VERSION} https://gitlab.com/dalibo/postgresql_anonymizer.git && \
    cd postgresql_anonymizer && \
    PGVER=pg${PG_MAJOR} make extension && \
    PGVER=pg${PG_MAJOR} make install && \
    mkdir -p /out/lib /out/share && \
    cp "$(pg_config --pkglibdir)"/anon.so /out/lib/ && \
    cp -r "$(pg_config --sharedir)"/extension/anon* /out/share/

# =============================================================================
# 2) final — temiz taban + yalnizca derlenmis uzanti
# =============================================================================
FROM ${BASE_IMAGE}

ARG PG_MAJOR

LABEL maintainer="3E Group"
LABEL description="PostgreSQL 18 + TimescaleDB + Toolkit + Anonymizer (3E Egitim)"

USER root

COPY --from=builder /out/lib/anon.so /usr/lib/postgresql/${PG_MAJOR}/lib/
COPY --from=builder /out/share/ /usr/share/postgresql/${PG_MAJOR}/extension/

COPY init-extensions.sql /docker-entrypoint-initdb.d/

USER postgres
