diff --git a/nextcloud_devenv/README.md b/nextcloud_devenv/README.md index 2bdcf3c..4263574 100644 --- a/nextcloud_devenv/README.md +++ b/nextcloud_devenv/README.md @@ -63,3 +63,33 @@ utiliser la base de donnee postgres et non le SQLLite ? ./migrate_db_sqlite2postgres.sh + +# NEW PLAIN nextcloud dev + +setup + +``` +git clone git@github.com:juliusknorr/nextcloud-docker-dev.git +git git@github.com:nextcloud/server.git +``` + +check nextcloud-docker-dev.env then + +``` +cp nextcloud-docker-dev.env nextcloud-docker-dev.git/.env +``` + +https setup, local private PKI. + +missing setup cert and setupcert host ... mkcert compilation + install + +update-certs update-hosts + +https://nextcloud-dev.l0g.eu + + +then will be done as sudo ( RootLess or podman limitation ? ) + +``` +./runit.sh +``` diff --git a/nextcloud_devenv/lib/metascript.sh b/nextcloud_devenv/lib/metascript.sh index 945030c..632bc4a 100644 --- a/nextcloud_devenv/lib/metascript.sh +++ b/nextcloud_devenv/lib/metascript.sh @@ -1,30 +1,72 @@ #!/bin/bash - +# SPDX-FileCopyrightText: 2025 artlog@l0g.eu +# SPDX-License-Identifier: AGPL-3.0-or-later +# # metascript to include # -# usual way if no parameters used by outer script : -# -# source $(dirname "$0")/metascript.sh -# -# defaultmetainit $@ +# to generate file header for caller script do : +# bash /metascript.sh header +# ex: +# bash lib/metascript.sh header + +# if called directly +if [[ "$0" =~ ^(.*)/metascript.sh$ ]] +then + prefix=${BASH_REMATCH[1]} + if [[ $1 == header ]] + then + cat </dev/null +toolsdir=\$(pwd) +source metascript.sh +popd >/dev/null + +while [[ \$# > 0 ]] +do + case "\$1" in + *) + parsemetaarg "\$1" + ;; + esac + shift +done + +exit 0 +EOF + else + echo "[WARNING] only header argument is supported. (prefix=$prefix)" >&2 + fi + exit 0 +fi + +if [[ "$metascript_included" == "yes" ]] +then + log_warn "metascript already included ($0)" +else metascript_included=yes + -# assume all tools are in lib/ -toolsdir=$(dirname $(readlink -f $0))/lib -# all tools resources are relative to this directory +# at this step $(pwd) should be this of metascript.sh +# while $0 is this of caller script using metascript -# project directory -# relative -# toolsparentdir=$(realpath --relative-to "$(pwd)" $(readlink -f $0))/ -# absolute -toolsparentdir=$(realpath $(readlink -f $0))/ +if [[ -z $toolsdir ]] +then + # assume all tools are in lib/ + toolsdir=$(dirname $(readlink -f $0))/lib + # all tools resources are relative to this directory +fi if [[ -z $log_functions ]] then log_functions=$toolsdir/log_functions.sh - [[ -f $log_functions ]] || { echo "[FATAL] Missing $log_functions" >&2 ; exit 1 ;} + [[ -f $log_functions ]] || { echo "[FATAL] Missing $log_functions , toolsdir=$toolsdir script=$0" >&2 ; exit 1 ;} source $log_functions fi @@ -36,7 +78,7 @@ metascript commands : help|usage help or usage of this {$0} tool dryrun|show|showdoc display what should/will be done -defersource= script file defining defer() non sandard function +defersource= script file defining defer() non standard function defer= defer function to use, default is showdoc toolsresourcesdir= where to pick resource default to parent of script $toolsresourcesdir @@ -54,7 +96,12 @@ usage() showinfo() { - echo $@ + echo "$@" +} + +metarun() +{ + $defer $metasudo "$@" } showdoc() @@ -62,10 +109,10 @@ showdoc() if [[ $1 =~ ^tools/ ]] then # assumes it handles ENV_METASCRIPT_DEFER - $@ + "$@" else echo '```' - autoquoteargs $@ + autoquoteargs "$@" echo echo '```' fi @@ -92,11 +139,11 @@ execredirectfrom() if [[ -n $defer ]] then echo '```' - autoquoteargs $@ + autoquoteargs "$@" echo ' < '"$tofile" echo '```' else - $@ < $tofile + "$@" < $tofile fi } @@ -107,7 +154,7 @@ execredirectto() if [[ -n $defer ]] then echo '```' - autoquoteargs $@ + autoquoteargs "$@" echo ' > '"$tofile" echo '```' else @@ -115,19 +162,34 @@ execredirectto() fi } +execredirecttoroot() +{ + tofile=$1 + shift + if [[ -n $defer ]] + then + echo '```' + autoquoteargs "$@" + echo ' | sudo tee '"$tofile" + echo '```' + else + "$@" | sudo tee $tofile + fi +} + pipeto() { if [[ -n $defer ]] then echo '```' echo -n 'cat << EOF| ' - autoquoteargs $@ + autoquoteargs "$@" echo cat echo "EOF" echo '```' else - cat | $@ + cat | "$@" fi } @@ -355,6 +417,9 @@ parsemetaarg() dryrun|show|showdoc) defer=showdoc ;; + metasudo=*) + metasudo=${1/metasudo=} + ;; help|usage) usage ;; @@ -528,7 +593,7 @@ check_variable_in() shift 2 local value="" - local values=$@ + local values="$@" eval value='$'"$var" @@ -570,17 +635,148 @@ get_timestamp_second() echo "$(date +"%Y%m%d%H%M%S")" } -if [[ -z $ENV_METASCRIPT_RESOURCESDIR ]] +todo() +{ + log_any TODO "$@" +} + +get_resource_var() { + local varname="$1" + local default_value="$2" + + eval value='$'"$varname" + if [[ -z $value ]] + then + echo "# ($0:metascript.sh:$LINENO) $(date)" >>$collect_context + if [[ -z $default_value ]] + then + log_error "resource $varname does not exists and no non empty default provided" + echo "# $varname=" >>$collect_context + exit 1 + fi + log_warn "($0) Using default value '$varname'='$default_value' HARDCODED in script : should be fixed with proper default file .resources.var, see traces in $collect_context" + read "$varname" <<<"$default_value" + echo "$varname=$default_value" >>$collect_context + fi +} + +setup_resources_var() +{ + local resource_var="$1" + enforcefile "$resource_var" exists + while read line + do + if [[ $line =~ ^([a-zA-Z0-9_]+)=(.+)$ ]] + then + varname=${BASH_REMATCH[1]} + value=${BASH_REMATCH[2]} + read "$varname" <<<"$value" + elif [[ $line =~ ^# ]] + then + echo "$line" + else + log_warn "Invalid syntax in $resource_var '$line' does not match any expected expression" + fi + done <"$resource_var" +} + +# allow to check mounted points +mountpoint_get_device() +{ + local mount_point="$1" + $defer awk "{ if (\$2 == \""$mount_point"\") print \$1 ;}" /proc/mounts +} + +device_get_mountpoints() +{ + local device="$1" + $defer awk "{ if (\$1 == \""$device"\") print \$2 ;}" /proc/mounts +} + +mount_if_needed() +{ + local mountpoint="$1" + local mountdevice="$2" + local param="$3" + device=$(mountpoint_get_device "$mountpoint") + + enforcedir "$mountpoint" exists + # device is a device ... + # enforcefile "$mountdevice" exists + + if [[ -z $device ]] + then + $metarun mount $param "$mountdevice" "$device" + elif [[ "$device" == "$mountdevice" ]] + then + log_info "$device already mounted on $mountdevice" + else + log_warn "Another device $device is mounted on $mountdevice, not $mountdevice" + fi +} + +umount_if_needed() +{ + local mountpoint="$1" + local mountdevice="$2" + device=$(mountpoint_get_device "$mountpoint") + if [[ -n "$device" ]] + then + if [[ "$device" == "$mountpoint" ]] + then + $metarun umount "$mountpoint" + else + log_warn "Another device $device is mounted on $mountdevice, not $mountdevice" + fi + fi +} + +# collect all hardcoded values. +mkdir -p ~/.artlog +collect_context=~/.artlog/collect_context.var + +if [[ -z $toolsresourcesdir ]] then - toolsresourcesdir=$toolsparentdir -else - toolsresourcesdir=$ENV_METASCRIPT_RESOURCESDIR + # project directory + + # from current $(pwd) will follow parent dir hierarchy to find .resources.var + dir="$(pwd)" + while [[ -n $dir ]] && [[ -d $dir ]] && [[ ! -f $dir/.resources.var ]] + do + new_dir=$(dirname "$dir") + if [[ $new_dir == $dir ]] + then + # protect against infinite loop + break + fi + dir="$new_dir" + done + if [[ -f $dir/.resources.var ]] + then + toolsresourcesdir=$dir + else + if [[ -z $ENV_METASCRIPT_RESOURCESDIR ]] + then + toolsresourcesdir=$toolsparentdir + else + toolsresourcesdir=$ENV_METASCRIPT_RESOURCESDIR + fi + fi fi -# quick way to give scl patches to fill scl_arg array -if [[ -f $toolsparentdir/.scl_env ]] +resources_var=$toolsresourcesdir/.resources.var +if [[ -f $resources_var ]] then - source $toolsparentdir/.scl_env + setup_resources_var "$resources_var" +else + log_warn "No $resources_var found" +fi + + +# quick way to give scl patches to fill scl_arg array +if [[ -f $toolsresourcesdir/.scl_env ]] +then + source $toolsresourcesdir/.scl_env fi # empty defer means doit @@ -588,6 +784,11 @@ defer=$ENV_METASCRIPT_DEFER showinfo=showinfo -allparms=$@ +allparms="$@" applymetaargs=applymetaargs + +metarun=$defer + +# metascript included +fi diff --git a/nextcloud_devenv/nextcloud-docker-dev.env b/nextcloud_devenv/nextcloud-docker-dev.env new file mode 100644 index 0000000..63023ee --- /dev/null +++ b/nextcloud_devenv/nextcloud-docker-dev.env @@ -0,0 +1,72 @@ +COMPOSE_PROJECT_NAME=master + +# Default protocol to use for Nextcloud and other containers +# check the readme for details how to setup https +PROTOCOL=https + +# Paths +REPO_PATH_SERVER=/home/plhardy/clients/astrolabe/nextcloud/poll/jugement_majoritaire/nextcloud_devenv/server + +# Specify a path to apps which will be shared between all containers. Useful for apps that support multiple nextcloud versions +# ADDITIONAL_APPS_PATH=/home/alice/nextcloud-docker-dev/workspace/server/apps-shared + +# Stable releases root directory +# STABLE_ROOT_PATH=/home/alice/nextcloud-docker-dev/workspace + +# Install Nextcloud apps per default +# NEXTCLOUD_AUTOINSTALL_APPS="viewer activity" +# Retry enabling apps for a provided amount of time (can be useful when using the containers in CI) +# NEXTCLOUD_AUTOINSTALL_APPS_WAIT_TIME=0 + +# Blackfire configuration +# BLACKFIRE_CLIENT_ID= +# BLACKFIRE_CLIENT_TOKEN= +# BLACKFIRE_SERVER_ID= +# BLACKFIRE_SERVER_TOKEN= + +# By default the published ports are only accessible at 127.0.0.1 (your localhost). +# Set this to '0.0.0.0' to make them accessible from your whole local network. +# IP_BIND=127.0.0.1 + +# can be used to run separate setups besides each other +# DOCKER_SUBNET=192.168.15.0/24 +# PORTBASE=815 + + +# Main dns names for ssl proxy +# This can be used to append a custom domain name to the container names +DOMAIN_SUFFIX=-dev.l0g.eu + +# May be used to set the PHP version. Defaults to 7.2. +# PHP_VERSION=71 +# PHP_VERSION=72 +# PHP_VERSION=73 +# PHP_VERSION=74 +# PHP_VERSION=80 +PHP_VERSION=81 + +# May be used to choose database (sqlite, pgsql, mysql) +SQL=mysql + +# The mode of the xdebuger extention. This can be a comma separated list of +# the entries none, develop, debug, trace, and profile. +PHP_XDEBUG_MODE=develop + +# Docker socket location, use it when you run rootless Docker +# Replace "1000" with the uid used by your Docker engine (default $(id -u)) +# DOCKER_SOCKET=/run/user/1000/docker.sock +DOCKER_SOCKET=/var/run/podman/podman.sock + +# Nextcloud AppAPI Docker Socket Proxy +# ------------------------------------ +# NC_HAPROXY_PASSWORD=some_secure_password +# BIND_ADDRESS=172.17.0.1 +# CERT_PATH=./data/ssl/app_api/app_api.pem +# NETWORK_MODE=host +# HAPROXY_PORT=2375 +# TIMEOUT_CONNECT=10s +# TIMEOUT_CLIENT=30s +# TIMEOUT_SERVER=30s +# EX_APPS_NET=ipv4@localhost +# EX_APPS_COUNT=50 +# ------------------------------------ diff --git a/nextcloud_devenv/runit.sh b/nextcloud_devenv/runit.sh new file mode 100755 index 0000000..3c1afee --- /dev/null +++ b/nextcloud_devenv/runit.sh @@ -0,0 +1,43 @@ +#!/bin/bash +# SPDX-FileCopyrightText: 2025 artlog@l0g.eu +# SPDX-License-Identifier: AGPL-3.0-or-later +# +toolsdir=lib +pushd $toolsdir >/dev/null +toolsdir=$(pwd) +source metascript.sh +popd >/dev/null + +while [[ $# > 0 ]] +do + case "$1" in + up|down) + action=$1 + ;; + *) + parsemetaarg "$1" + ;; + esac + shift +done + +metarun=metarun +metasudo=sudo + +enforcedir nextcloud-docker-dev exists + +pushd nextcloud-docker-dev + +if [[ $action = down ]] +then + $metarun podman-compose down +fi + +services=(nextcloud proxy database-mysql) + +if [[ $action == up ]] +then + $metarun podman-compose --env-file $(pwd)/.env $action "${services[@]}" +fi + +popd