diff options
Diffstat (limited to 'compose')
-rwxr-xr-x | compose | 122 |
1 files changed, 122 insertions, 0 deletions
@@ -0,0 +1,122 @@ +#!/bin/sh +### CRIMSON --- A simple PHP framework. +### Copyright © 2024 Freya Murphy <contact@freyacat.org> +### +### This file is part of CRIMSON. +### +### CRIMSON is free software; you can redistribute it and/or modify it +### under the terms of the GNU General Public License as published by +### the Free Software Foundation; either version 3 of the License, or (at +### your option) any later version. +### +### CRIMSON is distributed in the hope that it will be useful, but +### WITHOUT ANY WARRANTY; without even the implied warranty of +### MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +### GNU General Public License for more details. +### +### You should have received a copy of the GNU General Public License +### along with CRIMSON. If not, see <http://www.gnu.org/licenses/>. + +# `compose` +# This script will provide a docker compose interface with all the CRIMSON +# environment setup. This script may request root privilages since it needs all +# docker containers to run with user 1000:1000. If you are not user 1000:1000, +# root privlage is required to create volume folders with uid/gid 1000. + +# Make sure errors fail to avoid nasal demons +set -e + +# ========================================================= PERMISSION CHECK == +# Make sure we are either root or user 1000:1000. This is required for crimson. + +args="$@" +command="$0 $args" + +uid=$(id -u) +gid=$(id -g) + +if [[ $uid -eq 1000 ]] && [[ $gid -eq 1000 ]]; then + true # all set +elif [[ $uid -eq 0 ]] && [[ $gid -eq 0 ]]; then + true # all set +else + # root required (1000:1000 may not exist) + exec sudo -E $command +fi + +# ================================================================ CONSTANTS == +# ROOT: This is the folder the crimson project is located in. ROOT is used to +# access docker-compose files, base.env, and other crimson files. +# CALL_ROOT: This is the folder that the user who called `compose` is currently +# in. For crimson to work this must be the folder that your project using +# crimson is. This is because crimson loads `.env` here to load any user +# specified environment. `.env` is needed for $DATA and $SOURCE. Read base.env +# for more information. + +ROOT="$(realpath "$(dirname "$0")")" +CALL_ROOT="$(pwd)" + +# ================================================================ FUNCTIONS == +# add_arg - adds arguments to the docker compose command to be run +# include_env - loads a .env file +# include - adds the docker compose file to be included called +# docker-compose.<$1>.yml + +docker_args="" +function add_arg { + docker_args="$docker_args $@" +} + +function include_env { + local file + file="$1" + if [ -f "$file" ]; then + source "$file" + add_arg --env-file $file + fi +} + +function include { + local file + if [ "$2" = "true" ]; then + file="$ROOT/docker/docker-compose.$1.yml" + add_arg -f $file + fi +} + +# ================================================================ BOOTSTRAP == +# Enter the crimson project directory, load all .env files, and pick which +# docker-compose.*.yml files are requested. Then make the docker volumes here +# with the correct permissions. If we let docker do it, it will make them owned +# by root (thanks) and break our containers. + +cd "$ROOT" + +# get docker file includes +include_env "$ROOT/base.env" +include_env "$CALL_ROOT/.env" +include "base" "true" +include "db" "$POSTGRES_ENABLED" +include "api" "$API_ENABLED" + +# assert SOURCE and DATA are set +if [ -z "$SOURCE" ]; then + printf "fatal: SOURCE is not set. See '$ROOT/base.env'\n" + exit 1 +fi + +if [ -z "$DATA" ]; then + printf "fatal: DATA is not set. See '$ROOT/base.env'\n" + exit 1 +fi + +# preset perms (postgres will crash if not) +if [ ! -d "$DATA" ]; then + mkdir -p "$DATA" + mkdir -p "$DATA/crimson" + mkdir -p "$DATA/schemas" + chown -R 1000:1000 "$DATA" +fi + +# run docker compose +exec -a docker -- docker compose -p $PROJECT_NAME $docker_args "$@" |