I am trying to create a podman compose file to create instant Elasticsearch, Kibana, Logstash. All data should be backed up via volumes. The problem seems to be transferring the Kibana API key from Elastic to Kibana.
My test system is an AlmaLinux without SeLinux activated.
My current compose file looks like this, does anyone have any idea how I can get it to run correctly with podman?
version: "0.1"
services:
elasticsearch:
userns: "keep-id"
image: docker.elastic.co/elasticsearch/elasticsearch:8.10.2
container_name: elasticsearch
environment:
- discovery.type=single-node
- xpack.security.enabled=true
- xpack.security.http.ssl.enabled=true
- xpack.security.http.ssl.key=/usr/share/elasticsearch/config/certs/privkey.pem
- xpack.security.http.ssl.certificate=/usr/share/elasticsearch/config/certs/fullchain.pem
- xpack.security.http.ssl.verification_mode=certificate
- ELASTIC_PASSWORD=something_safe
volumes:
- ${HOME}/podman_project/elasticsearch/data:/usr/share/elasticsearch/data
- ${HOME}/podman_project/elasticsearch/certs:/usr/share/elasticsearch/config/certs:ro
ports:
- "9200:9200"
networks:
- elastic_network
healthcheck:
test: curl -k -u elastic:$$ELASTIC_PASSWORD https://localhost:9200 && exit 0 || exit 1
interval: 10s
timeout: 10s
retries: 20
token-generator:
userns: "keep-id"
image: alpine:latest
container_name: token-generator
depends_on:
- elasticsearch
environment:
- ELASTIC_PASSWORD=something_safe
volumes:
- ${HOME}/podman_project/kibana/config/token:/kibana-token
- ${HOME}/podman_project/scripts/generate-token.sh:/generate-token.sh:ro
networks:
- elastic_network
command: >
sh -c "export ELASTIC_PASSWORD=something_safe && \
apk update && apk add --no-cache curl jq && \
sleep 10 && \
RESPONSE=`curl -s -k -u elastic:$ELASTIC_PASSWORD -X POST -H 'Content-Type: application/json' https://elasticsearch:9200/_security/service/elastic/kibana/credential/token` && \
echo 'Response: ' \$RESPONSE && \
TOKEN=`echo \$RESPONSE | jq -r '.token.value'` && \
echo 'Token: ' \$TOKEN && \
echo \$TOKEN > /kibana-token/token && \
sleep 5"
restart: "no"
kibana:
userns: "keep-id"
image: docker.elastic.co/kibana/kibana:8.10.2
container_name: kibana
depends_on:
elasticsearch:
condition: service_healthy
environment:
- ELASTICSEARCH_SERVICEACCOUNTTOKEN=file:/usr/share/kibana/config/token/token
- ELASTICSEARCH_HOSTS=https://elasticsearch:9200
- SERVER_SSL_ENABLED=true
- SERVER_SSL_KEY=/usr/share/kibana/config/certs/privkey.pem
- SERVER_SSL_CERTIFICATE=/usr/share/kibana/config/certs/fullchain.pem
- ELASTICSEARCH_SSL_VERIFICATIONMODE=none
volumes:
- ${HOME}/podman_project/kibana/config:/usr/share/kibana/config
- ${HOME}/podman_project/kibana/certs:/usr/share/kibana/config/certs:ro
- ${HOME}/podman_project/kibana/config/token:/usr/share/kibana/config/token:ro
ports:
- "5601:5601"
networks:
- elastic_network
command: >
sh -c "echo 'Waiting for token file...'; \
while [ ! -f /usr/share/kibana/config/token/token ]; do sleep 1; done; \
echo 'Token found. Starting Kibana.'; \
exec /usr/share/kibana/bin/kibana"
logstash:
userns: "keep-id"
image: docker.elastic.co/logstash/logstash:8.10.2
container_name: logstash
environment:
- LS_JAVA_OPTS=-Xms256m -Xmx256m
volumes:
- ${HOME}/podman_project/logstash/config:/usr/share/logstash/config:ro
- ${HOME}/podman_project/logstash/pipeline:/usr/share/logstash/pipeline:ro
- ${HOME}/podman_project/logstash/input:/usr/share/logstash/input:ro
- ${HOME}/podman_project/elasticsearch/certs:/usr/share/logstash/certs:ro
ports:
- "5000:5000"
networks:
- elastic_network
networks:
elastic_network:
driver: bridge