#!/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 "$@"