Skip to content

Commit 1e51f18

Browse files
authored
Merge pull request #147 from stac-utils/pip-docker-example
Pip docker example
2 parents 523a6bb + 1f0fdda commit 1e51f18

File tree

8 files changed

+282
-2
lines changed

8 files changed

+282
-2
lines changed

.pre-commit-config.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
repos:
22
- repo: https://github.com/PyCQA/isort
3-
rev: 5.10.1
3+
rev: 5.12.0
44
hooks:
55
- id: isort
66
- repo: https://github.com/psf/black

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,9 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
88
## [Unreleased]
99

1010
### Added
11+
12+
- Examples folder with example docker setup for running sfes from pip [#147](https://github.com/stac-utils/stac-fastapi-elasticsearch/pull/147)
13+
1114
### Changed
1215
### Fixed
1316

README.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
1-
# STAC FastAPI Elasticsearch
1+
# STAC FastAPI Elasticsearch (sfes)
22

33
## Elasticsearch backend for stac-fastapi
44

55
#### Join our [Gitter](https://gitter.im/stac-fastapi-elasticsearch/community) page
66

77
#### Check out the public Postman documentation [Postman](https://documenter.getpostman.com/view/12888943/2s8ZDSdRHA)
88

9+
#### Check out the examples folder for deployment options, ex. running sfes from pip in docker
10+
911
#### For changes, see the [Changelog](CHANGELOG.md)
1012

1113

examples/README.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
# stac-fastapi-elasticsearch (sfes) deployment examples
2+
3+
## Deploy sfes from pip in docker
4+
5+
```shell
6+
cd pip_docker
7+
docker-compose up
8+
```

examples/pip_docker/Dockerfile

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
FROM python:3.10-slim
2+
3+
4+
# update apt pkgs, and install build-essential for ciso8601
5+
RUN apt-get update && \
6+
apt-get -y upgrade && \
7+
apt-get install -y build-essential && \
8+
apt-get clean && \
9+
rm -rf /var/lib/apt/lists/*
10+
11+
# update certs used by Requests
12+
ENV CURL_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt
13+
14+
WORKDIR /app
15+
16+
COPY . /app
17+
18+
RUN pip install stac-fastapi.elasticsearch==0.3.0
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
version: '3'
2+
3+
services:
4+
app-elasticsearch:
5+
container_name: stac-fastapi-es
6+
image: stac-utils/stac-fastapi-es
7+
restart: always
8+
build:
9+
context: .
10+
dockerfile: Dockerfile
11+
platform: linux/amd64
12+
environment:
13+
- APP_HOST=0.0.0.0
14+
- APP_PORT=8080
15+
- RELOAD=true
16+
- ENVIRONMENT=local
17+
- WEB_CONCURRENCY=10
18+
- ES_HOST=172.17.0.1
19+
- ES_PORT=9200
20+
- ES_USE_SSL=false
21+
- ES_VERIFY_CERTS=false
22+
ports:
23+
- "8080:8080"
24+
volumes:
25+
- ./stac_fastapi:/app/stac_fastapi
26+
- ./scripts:/app/scripts
27+
depends_on:
28+
- elasticsearch
29+
command:
30+
bash -c "./scripts/wait-for-it-es.sh es-container:9200 && python -m stac_fastapi.elasticsearch.app"
31+
32+
elasticsearch:
33+
container_name: es-container
34+
image: docker.elastic.co/elasticsearch/elasticsearch:${ELASTICSEARCH_VERSION:-8.1.3}
35+
environment:
36+
ES_JAVA_OPTS: -Xms512m -Xmx1g
37+
volumes:
38+
- ./elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
39+
- ./elasticsearch/snapshots:/usr/share/elasticsearch/snapshots
40+
ports:
41+
- "9200:9200"
42+
43+
networks:
44+
default:
45+
name: stac-fastapi-network
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
## Cluster Settings
2+
cluster.name: stac-cluster
3+
node.name: es01
4+
network.host: 0.0.0.0
5+
transport.host: 0.0.0.0
6+
discovery.type: single-node
7+
http.port: 9200
8+
9+
path:
10+
repo:
11+
- /usr/share/elasticsearch/snapshots
12+
13+
## License
14+
xpack.license.self_generated.type: basic
15+
16+
# Security
17+
xpack.security.enabled: false
18+
xpack.security.transport.ssl.enabled: false
Lines changed: 186 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,186 @@
1+
#!/usr/bin/env bash
2+
# Use this script to test if a given TCP host/port are available
3+
4+
######################################################
5+
# Copied from https://github.com/vishnubob/wait-for-it
6+
######################################################
7+
8+
WAITFORIT_cmdname=${0##*/}
9+
10+
echoerr() { if [[ $WAITFORIT_QUIET -ne 1 ]]; then echo "$@" 1>&2; fi }
11+
12+
usage()
13+
{
14+
cat << USAGE >&2
15+
Usage:
16+
$WAITFORIT_cmdname host:port [-s] [-t timeout] [-- command args]
17+
-h HOST | --host=HOST Host or IP under test
18+
-p PORT | --port=PORT TCP port under test
19+
Alternatively, you specify the host and port as host:port
20+
-s | --strict Only execute subcommand if the test succeeds
21+
-q | --quiet Don't output any status messages
22+
-t TIMEOUT | --timeout=TIMEOUT
23+
Timeout in seconds, zero for no timeout
24+
-- COMMAND ARGS Execute command with args after the test finishes
25+
USAGE
26+
exit 1
27+
}
28+
29+
wait_for()
30+
{
31+
if [[ $WAITFORIT_TIMEOUT -gt 0 ]]; then
32+
echoerr "$WAITFORIT_cmdname: waiting $WAITFORIT_TIMEOUT seconds for $WAITFORIT_HOST:$WAITFORIT_PORT"
33+
else
34+
echoerr "$WAITFORIT_cmdname: waiting for $WAITFORIT_HOST:$WAITFORIT_PORT without a timeout"
35+
fi
36+
WAITFORIT_start_ts=$(date +%s)
37+
while :
38+
do
39+
if [[ $WAITFORIT_ISBUSY -eq 1 ]]; then
40+
nc -z $WAITFORIT_HOST $WAITFORIT_PORT
41+
WAITFORIT_result=$?
42+
else
43+
(echo -n > /dev/tcp/$WAITFORIT_HOST/$WAITFORIT_PORT) >/dev/null 2>&1
44+
WAITFORIT_result=$?
45+
fi
46+
if [[ $WAITFORIT_result -eq 0 ]]; then
47+
WAITFORIT_end_ts=$(date +%s)
48+
echoerr "$WAITFORIT_cmdname: $WAITFORIT_HOST:$WAITFORIT_PORT is available after $((WAITFORIT_end_ts - WAITFORIT_start_ts)) seconds"
49+
break
50+
fi
51+
sleep 1
52+
done
53+
return $WAITFORIT_result
54+
}
55+
56+
wait_for_wrapper()
57+
{
58+
# In order to support SIGINT during timeout: http://unix.stackexchange.com/a/57692
59+
if [[ $WAITFORIT_QUIET -eq 1 ]]; then
60+
timeout $WAITFORIT_BUSYTIMEFLAG $WAITFORIT_TIMEOUT $0 --quiet --child --host=$WAITFORIT_HOST --port=$WAITFORIT_PORT --timeout=$WAITFORIT_TIMEOUT &
61+
else
62+
timeout $WAITFORIT_BUSYTIMEFLAG $WAITFORIT_TIMEOUT $0 --child --host=$WAITFORIT_HOST --port=$WAITFORIT_PORT --timeout=$WAITFORIT_TIMEOUT &
63+
fi
64+
WAITFORIT_PID=$!
65+
trap "kill -INT -$WAITFORIT_PID" INT
66+
wait $WAITFORIT_PID
67+
WAITFORIT_RESULT=$?
68+
if [[ $WAITFORIT_RESULT -ne 0 ]]; then
69+
echoerr "$WAITFORIT_cmdname: timeout occurred after waiting $WAITFORIT_TIMEOUT seconds for $WAITFORIT_HOST:$WAITFORIT_PORT"
70+
fi
71+
return $WAITFORIT_RESULT
72+
}
73+
74+
# process arguments
75+
while [[ $# -gt 0 ]]
76+
do
77+
case "$1" in
78+
*:* )
79+
WAITFORIT_hostport=(${1//:/ })
80+
WAITFORIT_HOST=${WAITFORIT_hostport[0]}
81+
WAITFORIT_PORT=${WAITFORIT_hostport[1]}
82+
shift 1
83+
;;
84+
--child)
85+
WAITFORIT_CHILD=1
86+
shift 1
87+
;;
88+
-q | --quiet)
89+
WAITFORIT_QUIET=1
90+
shift 1
91+
;;
92+
-s | --strict)
93+
WAITFORIT_STRICT=1
94+
shift 1
95+
;;
96+
-h)
97+
WAITFORIT_HOST="$2"
98+
if [[ $WAITFORIT_HOST == "" ]]; then break; fi
99+
shift 2
100+
;;
101+
--host=*)
102+
WAITFORIT_HOST="${1#*=}"
103+
shift 1
104+
;;
105+
-p)
106+
WAITFORIT_PORT="$2"
107+
if [[ $WAITFORIT_PORT == "" ]]; then break; fi
108+
shift 2
109+
;;
110+
--port=*)
111+
WAITFORIT_PORT="${1#*=}"
112+
shift 1
113+
;;
114+
-t)
115+
WAITFORIT_TIMEOUT="$2"
116+
if [[ $WAITFORIT_TIMEOUT == "" ]]; then break; fi
117+
shift 2
118+
;;
119+
--timeout=*)
120+
WAITFORIT_TIMEOUT="${1#*=}"
121+
shift 1
122+
;;
123+
--)
124+
shift
125+
WAITFORIT_CLI=("$@")
126+
break
127+
;;
128+
--help)
129+
usage
130+
;;
131+
*)
132+
echoerr "Unknown argument: $1"
133+
usage
134+
;;
135+
esac
136+
done
137+
138+
if [[ "$WAITFORIT_HOST" == "" || "$WAITFORIT_PORT" == "" ]]; then
139+
echoerr "Error: you need to provide a host and port to test."
140+
usage
141+
fi
142+
143+
WAITFORIT_TIMEOUT=${WAITFORIT_TIMEOUT:-45}
144+
WAITFORIT_STRICT=${WAITFORIT_STRICT:-0}
145+
WAITFORIT_CHILD=${WAITFORIT_CHILD:-0}
146+
WAITFORIT_QUIET=${WAITFORIT_QUIET:-0}
147+
148+
# Check to see if timeout is from busybox?
149+
WAITFORIT_TIMEOUT_PATH=$(type -p timeout)
150+
WAITFORIT_TIMEOUT_PATH=$(realpath $WAITFORIT_TIMEOUT_PATH 2>/dev/null || readlink -f $WAITFORIT_TIMEOUT_PATH)
151+
152+
WAITFORIT_BUSYTIMEFLAG=""
153+
if [[ $WAITFORIT_TIMEOUT_PATH =~ "busybox" ]]; then
154+
WAITFORIT_ISBUSY=1
155+
# Check if busybox timeout uses -t flag
156+
# (recent Alpine versions don't support -t anymore)
157+
if timeout &>/dev/stdout | grep -q -e '-t '; then
158+
WAITFORIT_BUSYTIMEFLAG="-t"
159+
fi
160+
else
161+
WAITFORIT_ISBUSY=0
162+
fi
163+
164+
if [[ $WAITFORIT_CHILD -gt 0 ]]; then
165+
wait_for
166+
WAITFORIT_RESULT=$?
167+
exit $WAITFORIT_RESULT
168+
else
169+
if [[ $WAITFORIT_TIMEOUT -gt 0 ]]; then
170+
wait_for_wrapper
171+
WAITFORIT_RESULT=$?
172+
else
173+
wait_for
174+
WAITFORIT_RESULT=$?
175+
fi
176+
fi
177+
178+
if [[ $WAITFORIT_CLI != "" ]]; then
179+
if [[ $WAITFORIT_RESULT -ne 0 && $WAITFORIT_STRICT -eq 1 ]]; then
180+
echoerr "$WAITFORIT_cmdname: strict mode, refusing to execute subprocess"
181+
exit $WAITFORIT_RESULT
182+
fi
183+
exec "${WAITFORIT_CLI[@]}"
184+
else
185+
exit $WAITFORIT_RESULT
186+
fi

0 commit comments

Comments
 (0)