ave-http 0.11.0

HTTP API server for the Ave runtime, auth system, and admin surface
# Dockerfile optimizado con cross-compilation nativa para SQLite
# Este Dockerfile usa cross-compilation en lugar de emulación para ARM64

ARG RUST_IMAGE=rust:1.95.0-slim-trixie

# ============================================================================
# Etapa base común para ambas arquitecturas
# ============================================================================
FROM ${RUST_IMAGE} AS base
RUN apt-get update && apt-get install --no-install-recommends -y \
    ca-certificates \
    curl \
    gcc \
    libc6-dev \
    libssl-dev \
    pkg-config \
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/*

# ============================================================================
# Etapa de compilación para AMD64 (nativa)
# ============================================================================
FROM base AS builder-amd64
RUN rustup target add x86_64-unknown-linux-gnu wasm32-unknown-unknown

ARG CARGO_PROFILE=release
ARG FEATURES=""
ENV CARGO_PROFILE=$CARGO_PROFILE
ENV CARGO_FEATURES=$FEATURES

COPY ./ave/http/Cargo.toml ./ave/http/Cargo.toml
COPY ./ave/identity/Cargo.toml ./ave/identity/Cargo.toml
COPY ./ave/core/Cargo.toml ./ave/core/Cargo.toml
COPY ./ave/bridge/Cargo.toml ./ave/bridge/Cargo.toml
COPY ./ave/network/Cargo.toml ./ave/network/Cargo.toml
COPY ./ave/common/Cargo.toml ./ave/common/Cargo.toml
COPY ./ave/Cargo.toml ./ave/Cargo.toml
COPY ./ave/Cargo.lock ./ave/Cargo.lock
COPY ./ave/README.md ./ave/README.md

COPY ./ave-actors/actor/Cargo.toml ./ave-actors/actor/Cargo.toml
COPY ./ave-actors/actor/README.md ./ave-actors/actor/README.md
COPY ./ave-actors/databases/rocksdb_db/Cargo.toml ./ave-actors/databases/rocksdb_db/Cargo.toml
COPY ./ave-actors/databases/rocksdb_db/README.md ./ave-actors/databases/rocksdb_db/README.md
COPY ./ave-actors/databases/sqlite_db/Cargo.toml ./ave-actors/databases/sqlite_db/Cargo.toml
COPY ./ave-actors/databases/sqlite_db/README.md ./ave-actors/databases/sqlite_db/README.md
COPY ./ave-actors/store/Cargo.toml ./ave-actors/store/Cargo.toml
COPY ./ave-actors/store/README.md ./ave-actors/store/README.md
COPY ./ave-actors/Cargo.toml ./ave-actors/Cargo.toml
COPY ./ave-actors/Cargo.lock ./ave-actors/Cargo.lock
COPY ./ave-actors/README.md ./ave-actors/README.md

COPY ./ave/http/src ./ave/http/src
COPY ./ave/http/migrations ./ave/http/migrations
COPY ./ave/src ./ave/src
COPY ./ave/identity/src ./ave/identity/src
COPY ./ave/core/src ./ave/core/src
COPY ./ave/core/migrations ./ave/core/migrations
COPY ./ave/bridge/src ./ave/bridge/src
COPY ./ave/network/src ./ave/network/src
COPY ./ave/common/src ./ave/common/src

COPY ./ave-actors/actor/src ./ave-actors/actor/src
COPY ./ave-actors/databases/rocksdb_db/src ./ave-actors/databases/rocksdb_db/src
COPY ./ave-actors/databases/sqlite_db/src ./ave-actors/databases/sqlite_db/src
COPY ./ave-actors/store/src ./ave-actors/store/src
COPY ./ave-actors/src ./ave-actors/src

WORKDIR /ave/http
RUN cargo build --target x86_64-unknown-linux-gnu --profile "$CARGO_PROFILE" --no-default-features --features "$CARGO_FEATURES"
RUN mkdir -p /contracts/contracts /contracts/vendor /contracts/target /tmp/contract-template/src /tmp/contract-template/.cargo && \
    cp /ave/core/src/evaluation/compiler/contract_Cargo.toml /tmp/contract-template/Cargo.toml && \
    cp /ave/core/src/evaluation/compiler/contract_stub.rs /tmp/contract-template/src/lib.rs
RUN cargo vendor --manifest-path /tmp/contract-template/Cargo.toml /contracts/vendor && \
    cat <<'EOF' > /tmp/contract-template/.cargo/config.toml
[build]
target-dir = "/contracts/target"

[net]
offline = true

[source.crates-io]
replace-with = "vendored-sources"

[source.vendored-sources]
directory = "/contracts/vendor"
EOF
RUN cargo build --manifest-path /tmp/contract-template/Cargo.toml --target wasm32-unknown-unknown --release --offline

# ============================================================================
# Etapa de compilación para ARM64 (cross-compilation nativa)
# ============================================================================
FROM base AS builder-arm64
RUN dpkg --add-architecture arm64 && \
    apt-get update && apt-get install --no-install-recommends -y \
    gcc-aarch64-linux-gnu \
    g++-aarch64-linux-gnu \
    libc6-dev-arm64-cross \
    libssl-dev:arm64 \
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/*

RUN rustup target add aarch64-unknown-linux-gnu wasm32-unknown-unknown && \
    mkdir -p ~/.cargo && \
    echo '[target.aarch64-unknown-linux-gnu]' > ~/.cargo/config.toml && \
    echo 'linker = "aarch64-linux-gnu-gcc"' >> ~/.cargo/config.toml && \
    echo 'rustflags = ["-C", "link-arg=-lgcc"]' >> ~/.cargo/config.toml

ARG CARGO_PROFILE=release
ARG FEATURES=""
ENV CARGO_PROFILE=$CARGO_PROFILE
ENV CARGO_FEATURES=$FEATURES

ENV CC_aarch64_unknown_linux_gnu=aarch64-linux-gnu-gcc
ENV CXX_aarch64_unknown_linux_gnu=aarch64-linux-gnu-g++
ENV AR_aarch64_unknown_linux_gnu=aarch64-linux-gnu-ar
ENV CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_LINKER=aarch64-linux-gnu-gcc
ENV PKG_CONFIG_ALLOW_CROSS=1
ENV PKG_CONFIG_PATH=/usr/lib/aarch64-linux-gnu/pkgconfig
ENV OPENSSL_DIR=/usr
ENV OPENSSL_LIB_DIR=/usr/lib/aarch64-linux-gnu
ENV OPENSSL_INCLUDE_DIR=/usr/include

COPY ./ave/http/Cargo.toml ./ave/http/Cargo.toml
COPY ./ave/identity/Cargo.toml ./ave/identity/Cargo.toml
COPY ./ave/core/Cargo.toml ./ave/core/Cargo.toml
COPY ./ave/bridge/Cargo.toml ./ave/bridge/Cargo.toml
COPY ./ave/network/Cargo.toml ./ave/network/Cargo.toml
COPY ./ave/common/Cargo.toml ./ave/common/Cargo.toml
COPY ./ave/Cargo.toml ./ave/Cargo.toml
COPY ./ave/Cargo.lock ./ave/Cargo.lock
COPY ./ave/README.md ./ave/README.md

COPY ./ave-actors/actor/Cargo.toml ./ave-actors/actor/Cargo.toml
COPY ./ave-actors/actor/README.md ./ave-actors/actor/README.md
COPY ./ave-actors/databases/rocksdb_db/Cargo.toml ./ave-actors/databases/rocksdb_db/Cargo.toml
COPY ./ave-actors/databases/rocksdb_db/README.md ./ave-actors/databases/rocksdb_db/README.md
COPY ./ave-actors/databases/sqlite_db/Cargo.toml ./ave-actors/databases/sqlite_db/Cargo.toml
COPY ./ave-actors/databases/sqlite_db/README.md ./ave-actors/databases/sqlite_db/README.md
COPY ./ave-actors/store/Cargo.toml ./ave-actors/store/Cargo.toml
COPY ./ave-actors/store/README.md ./ave-actors/store/README.md
COPY ./ave-actors/Cargo.toml ./ave-actors/Cargo.toml
COPY ./ave-actors/Cargo.lock ./ave-actors/Cargo.lock
COPY ./ave-actors/README.md ./ave-actors/README.md

COPY ./ave/http/src ./ave/http/src
COPY ./ave/http/migrations ./ave/http/migrations
COPY ./ave/src ./ave/src
COPY ./ave/identity/src ./ave/identity/src
COPY ./ave/core/src ./ave/core/src
COPY ./ave/core/migrations ./ave/core/migrations
COPY ./ave/bridge/src ./ave/bridge/src
COPY ./ave/network/src ./ave/network/src
COPY ./ave/common/src ./ave/common/src

COPY ./ave-actors/actor/src ./ave-actors/actor/src
COPY ./ave-actors/databases/rocksdb_db/src ./ave-actors/databases/rocksdb_db/src
COPY ./ave-actors/databases/sqlite_db/src ./ave-actors/databases/sqlite_db/src
COPY ./ave-actors/store/src ./ave-actors/store/src
COPY ./ave-actors/src ./ave-actors/src

WORKDIR /ave/http
RUN cargo build --target aarch64-unknown-linux-gnu --profile "$CARGO_PROFILE" --no-default-features --features "$CARGO_FEATURES"
RUN mkdir -p /contracts/contracts /contracts/vendor /contracts/target /tmp/contract-template/src /tmp/contract-template/.cargo && \
    cp /ave/core/src/evaluation/compiler/contract_Cargo.toml /tmp/contract-template/Cargo.toml && \
    cp /ave/core/src/evaluation/compiler/contract_stub.rs /tmp/contract-template/src/lib.rs
RUN cargo vendor --manifest-path /tmp/contract-template/Cargo.toml /contracts/vendor && \
    cat <<'EOF' > /tmp/contract-template/.cargo/config.toml
[build]
target-dir = "/contracts/target"

[net]
offline = true

[source.crates-io]
replace-with = "vendored-sources"

[source.vendored-sources]
directory = "/contracts/vendor"
EOF
RUN cargo build --manifest-path /tmp/contract-template/Cargo.toml --target wasm32-unknown-unknown --release --offline

# ============================================================================
# Imágenes finales
# ============================================================================
FROM --platform=linux/amd64 ${RUST_IMAGE} AS amd64
ARG CARGO_PROFILE=release
RUN apt-get update && apt-get install --no-install-recommends -y \
    ca-certificates \
    libssl3t64 \
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/*
RUN rustup target add wasm32-unknown-unknown
RUN groupadd --system --gid 10001 ave \
    && useradd --system --uid 10001 --gid 10001 --create-home --home-dir /app --shell /usr/sbin/nologin ave \
    && mkdir -p /app /app/contracts \
    && chown -R ave:ave /app \
    && chmod -R u+rwX /app
COPY --from=builder-amd64 --chown=ave:ave ./ave/target/x86_64-unknown-linux-gnu/${CARGO_PROFILE}/ave-http /app/ave-http
COPY --from=builder-amd64 --chown=ave:ave /contracts/ /app/contracts/
WORKDIR /app
USER ave
CMD ["./ave-http"]

FROM --platform=linux/arm64 ${RUST_IMAGE} AS arm64
ARG CARGO_PROFILE=release
RUN apt-get update && apt-get install --no-install-recommends -y \
    ca-certificates \
    libssl3t64 \
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/*
RUN rustup target add wasm32-unknown-unknown
RUN groupadd --system --gid 10001 ave \
    && useradd --system --uid 10001 --gid 10001 --create-home --home-dir /app --shell /usr/sbin/nologin ave \
    && mkdir -p /app /app/contracts \
    && chown -R ave:ave /app \
    && chmod -R u+rwX /app
COPY --from=builder-arm64 --chown=ave:ave ./ave/target/aarch64-unknown-linux-gnu/${CARGO_PROFILE}/ave-http /app/ave-http
COPY --from=builder-arm64 --chown=ave:ave /contracts/ /app/contracts/
WORKDIR /app
USER ave
CMD ["./ave-http"]