# syntax=docker/dockerfile:1.7
#
# 1С:Сервер взаимодействия 30.0.42 — образ на все три компонента поставки.
#
# Один образ, три роли (см. entrypoint.sh): cs, elasticsearch, hazelcast.
# Компоненты приезжают ОДНИМ дистрибутивом и одним установщиком, поэтому и
# образ один: собирать три образа из одного tar.gz значит трижды распаковать
# 269 МБ ради того же содержимого. Роль выбирается командой контейнера.
#
# Дистрибутив в репозиторий не кладётся и в контекст сборки не входит: он
# приходит ОТДЕЛЬНЫМ контекстом `dist` (compose: build.additional_contexts),
# путь к нему задаётся переменной CS_DIST_DIR. Откуда его взять — README.

ARG JDK_IMAGE=bellsoft/liberica-openjdk-debian:11

# --- Установка -------------------------------------------------------------
# Отдельная ступень нужна ровно из-за размера: слой с 269-мегабайтным архивом
# остался бы в образе навсегда, даже если удалить файл следующей командой.
# Сюда он попадает, здесь же и остаётся; в готовый образ едет только результат.
FROM ${JDK_IMAGE} AS installer

ARG CS_DIST_FILE=1c_cs_30.0.42_linux_x86_64.tar.gz

COPY --from=dist ${CS_DIST_FILE} /tmp/cs-dist.tar.gz

# `install all` ставит все пять компонентов поставки: сервер, Elasticsearch,
# Hazelcast, site и web-chat, плюс утилиту ring. Ровно то же, что ставит
# оконный установщик на Windows.
#
# --ignore-signature-warnings обязателен: сам установщик и ring в поставке 1С
# не подписаны, и без ключа установка встаёт вопросом в консоли.
# --ignore-hardware-checks — контейнеру не нужна проверка памяти хоста.
RUN set -eux; \
    mkdir -p /tmp/distro; \
    tar -xzf /tmp/cs-dist.tar.gz -C /tmp/distro; \
    cd /tmp/distro; \
    ./1ce-installer-cli install all \
        --ignore-hardware-checks \
        --ignore-signature-warnings; \
    rm -rf /tmp/distro /tmp/cs-dist.tar.gz

# --- Рабочий образ ---------------------------------------------------------
FROM ${JDK_IMAGE}

LABEL org.opencontainers.image.title="1C:Collaboration server" \
      org.opencontainers.image.version="30.0.42" \
      org.opencontainers.image.vendor="1C-Soft LLC (дистрибутив), nizamov.school (упаковка)"

# curl нужен и в healthcheck, и в регистрации хранилища при первом старте;
# procps — чтобы было чем посмотреть процессы внутри контейнера.
#
# gawk здесь не для нас: пусковой скрипт ring вызывает awk с функцией gensub,
# которой у mawk из debian-slim нет. Работать ring от этого не перестаёт, но
# каждый его вызов печатает «awk: function gensub never defined» — строку,
# которую потом ищут в журнале как причину отказа.
RUN set -eux; \
    apt-get update; \
    apt-get install -y --no-install-recommends curl ca-certificates procps gawk; \
    rm -rf /var/lib/apt/lists/*

# Установщик кладёт продукт в /opt/1C, а реестр установленного — в /etc/1C.
# Без второго ring не находит компоненты и отвечает «команда не поддерживается».
COPY --from=installer /opt/1C /opt/1C
COPY --from=installer /etc/1C /etc/1C
COPY --from=installer /etc/profile.d/1ce.sh /etc/profile.d/1ce.sh

# Elasticsearch 5.6 отказывается стартовать от root — это его собственная
# проверка, а не наша осторожность. Поэтому пользователь заводится здесь, и от
# него же работают остальные две роли.
#
# Каталоги экземпляров создаются ЗАРАНЕЕ и с нужным владельцем: именованный том
# docker наследует владельца и права того каталога, поверх которого его
# монтируют. Не создать их здесь — том приедет от root, и процесс под cs не
# сможет записать ни конфигурацию, ни журнал.
RUN set -eux; \
    groupadd -g 1000 cs; \
    useradd -u 1000 -g cs -M -d /var/lib/1ce -s /bin/bash cs; \
    mkdir -p /var/lib/1ce/cs /var/lib/1ce/es /var/lib/1ce/hc; \
    chown -R cs:cs /var/lib/1ce /opt/1C /etc/1C

COPY --chown=cs:cs entrypoint.sh /usr/local/bin/cs-entrypoint
RUN chmod 0755 /usr/local/bin/cs-entrypoint

USER cs
WORKDIR /var/lib/1ce

# Порты внутри контейнера. Наружу их выставляет compose (README, раздел «Порты»).
#   8087 — REST обслуживания (/rs/health, /admin/**)
#   9999 — WebSocket, к нему подключается 1С:Предприятие
#   8443 — точка подключения интеграций (Webhook)
#   8444 — endpoint конференций (наружу не выставляется)
#   9200/9300 — Elasticsearch, 5701 — Hazelcast
EXPOSE 8087 9999 8443 8444 9200 9300 5701

ENTRYPOINT ["/usr/local/bin/cs-entrypoint"]
CMD ["cs"]
