Skip to content

Instantly share code, notes, and snippets.

@huobazi
Forked from corbtastik/minio.sh
Created July 6, 2022 07:21
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save huobazi/5c65e8b4ac44a51a6e165d627cc0e64c to your computer and use it in GitHub Desktop.
Save huobazi/5c65e8b4ac44a51a6e165d627cc0e64c to your computer and use it in GitHub Desktop.
Bash script to configure, start and stop single node MinIO container instance on Docker
#!/bin/bash
# --------------------------------------------------------------------
# [init] Create run dir, env file if they don't exist, then source env
# --------------------------------------------------------------------
init() {
MINIO_CONTAINER_NAME=$1
MINIO_RUN_DIR=/data1/run/${MINIO_CONTAINER_NAME}
MINIO_DATA=${MINIO_RUN_DIR}/data
MINIO_CERTS=${MINIO_RUN_DIR}/certs
# create run dir for container instance
if [ ! -d "${MINIO_RUN_DIR}" ]; then
echo "Creating MinIO run dir: ${MINIO_RUN_DIR}"
mkdir -p ${MINIO_DATA}
mkdir -p ${MINIO_CERTS}
fi
# create .env file for container instance
if [ ! -f ${MINIO_RUN_DIR}/minio.env ]; then
echo "Creating ${MINIO_RUN_DIR}/minio.env file."
cat <<-ENV_FILE > ${MINIO_RUN_DIR}/minio.env
MINIO_HOST_NAME=${MINIO_HOST_NAME:-localhost}
MINIO_PORT=${MINIO_PORT:-9000}
MINIO_CONSOLE_PORT=${MINIO_CONSOLE_PORT:-9001}
MINIO_CONTAINER_NAME=${MINIO_CONTAINER_NAME}
MINIO_DATA=${MINIO_DATA}
MINIO_CERTS=${MINIO_CERTS}
MINIO_USERNAME=${MINIO_USERNAME:-minioadmin}
MINIO_PASSWORD=${MINIO_PASSWORD:-$(openssl rand -base64 9)}
ENV_FILE
fi
# hydrate env
source ${MINIO_RUN_DIR}/minio.env 2>/dev/null
}
# --------------------------------------------------------------------
# [certs] Generate self-signed cert to enable TLS for minio server
# --------------------------------------------------------------------
certs() {
openssl req -new -newkey rsa:4096 \
-days 365 -nodes -x509 \
-subj "/CN=${MINIO_HOST_NAME}" \
-addext "subjectAltName = DNS:${MINIO_HOST_NAME}" \
-keyout ${MINIO_RUN_DIR}/certs/private.key \
-out ${MINIO_RUN_DIR}/certs/public.crt 2>/dev/null
}
# -------------------------------------------------------------------
# [run] Start container if it exists otherwise start new container
# -------------------------------------------------------------------
run() {
# Do nothing if container is aleady running
if [ $(docker ps -aq -f status=running -f name=${MINIO_CONTAINER_NAME}) ]; then
echo "Container ${MINIO_CONTAINER_NAME} is already running."
return
fi
# Start stopped container
if [ $(docker ps -aq -f status=exited -f name=${MINIO_CONTAINER_NAME}) ]; then
echo "Starting existing container ${MINIO_CONTAINER_NAME}..."
docker start ${MINIO_CONTAINER_NAME}
return
fi
# Generate certs for minio server
echo "Generating certs for ${MINIO_CONTAINER_NAME}"
certs ${MINIO_CONTAINER_NAME}
# Start new container
echo "Starting new container ${MINIO_CONTAINER_NAME} ${MINIO_USERNAME}:${MINIO_PASSWORD}"
docker run -d \
-p ${MINIO_PORT}:${MINIO_PORT} \
-p ${MINIO_CONSOLE_PORT}:${MINIO_CONSOLE_PORT} \
--user $(id -u):$(id -g) \
--name ${MINIO_CONTAINER_NAME} \
-e MINIO_ROOT_USER=${MINIO_USERNAME} \
-e MINIO_ROOT_PASSWORD=${MINIO_PASSWORD} \
-e MINIO_SERVER_URL=https://${MINIO_HOST_NAME}:${MINIO_PORT} \
-v ${MINIO_DATA}:/data \
-v ${MINIO_CERTS}:/run/certs \
minio/minio server /data \
--console-address ":${MINIO_CONSOLE_PORT}" \
--certs-dir "/run/certs/"
}
# -------------------------------------------------------------------
# [stop] Stop MinIO container
# -------------------------------------------------------------------
stop() {
docker container stop ${MINIO_CONTAINER_NAME}
}
# -------------------------------------------------------------------
# [status] Docker stats
# -------------------------------------------------------------------
status() {
docker container stats --no-stream ${MINIO_CONTAINER_NAME}
}
# -------------------------------------------------------------------
# [clean] Stop and remove MinIO container.
# -------------------------------------------------------------------
clean() {
docker container rm --force ${MINIO_CONTAINER_NAME} 2>/dev/null
}
# -------------------------------------------------------------------
# [usage] Print script usage.
# -------------------------------------------------------------------
usage() {
echo "----------------------------------------------------"
echo "Usage: $0 {run|stop|status|clean} NAME"
echo "----------------------------------------------------"
echo " $0 run my-minio-server"
echo " $0 stop my-minio-server"
echo " $0 status my-minio-server"
echo " $0 clean my-minio-server"
echo "----------------------------------------------------"
}
# -------------------------------------------------------------------
# [main] - init and flow
# -------------------------------------------------------------------
main() {
if [ $# -lt 2 ]; then
usage
exit 1
fi
init $2
case "$1" in
run) run $2 ;;
stop) stop $2 ;;
status) status $2 ;;
clean) clean $2 ;;
*)
usage
exit 1
esac
}
# -------------------------------------------------------------------
# ENTRYPOINT
# -------------------------------------------------------------------
main $@
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment