From 345b7c18f74af579693f82f6b760a7b49d13cb52 Mon Sep 17 00:00:00 2001 From: ckonstanski Date: Sat, 22 Nov 2025 14:19:22 -0700 Subject: docker-compose --- ci/.gitignore | 2 ++ ci/Dockerfile | 13 +++++++++ ci/data/etc/ldapadmin/figwheel-main.edn | 34 +++++++++++++++++++++++ ci/data/etc/ldapadmin/options.lisp | 11 ++++++++ ci/data/etc/sbclrc | 6 +++++ ci/data/install-root.sh | 30 +++++++++++++++++++++ ci/data/install-user-sbcl.sh | 10 +++++++ ci/data/ldapadmin-starter.lisp | 7 +++++ ci/data/start_app.sh | 42 +++++++++++++++++++++++++++++ ci/docker-build.sh | 28 +++++++++++++++++++ ci/docker-compose.yaml.example | 48 +++++++++++++++++++++++++++++++++ ci/docker-run.sh | 7 +++++ ci/env.sh | 4 +++ lisp/ldapadmin.asd | 2 +- 14 files changed, 243 insertions(+), 1 deletion(-) create mode 100644 ci/.gitignore create mode 100644 ci/Dockerfile create mode 100644 ci/data/etc/ldapadmin/figwheel-main.edn create mode 100644 ci/data/etc/ldapadmin/options.lisp create mode 100644 ci/data/etc/sbclrc create mode 100755 ci/data/install-root.sh create mode 100755 ci/data/install-user-sbcl.sh create mode 100644 ci/data/ldapadmin-starter.lisp create mode 100755 ci/data/start_app.sh create mode 100755 ci/docker-build.sh create mode 100644 ci/docker-compose.yaml.example create mode 100755 ci/docker-run.sh create mode 100644 ci/env.sh diff --git a/ci/.gitignore b/ci/.gitignore new file mode 100644 index 0000000..416ae59 --- /dev/null +++ b/ci/.gitignore @@ -0,0 +1,2 @@ +tmp +docker-compose.yaml diff --git a/ci/Dockerfile b/ci/Dockerfile new file mode 100644 index 0000000..18a0dab --- /dev/null +++ b/ci/Dockerfile @@ -0,0 +1,13 @@ +FROM ubuntu:noble +MAINTAINER Carlos Konstanski +ADD tmp/docker-start.tar.xz / +ARG OLO_USERNAME=root +ARG OLO_GROUPNAME=root +ARG OLO_UID=0 +ARG OLO_GID=0 +RUN data/install-root.sh +USER ${OLO_UID}:${OLO_GID} +RUN data/install-user-sbcl.sh +ENTRYPOINT [ "data/start_app.sh" ] +#ENTRYPOINT [ "/bin/bash", "-l", "-c" ] +CMD [] diff --git a/ci/data/etc/ldapadmin/figwheel-main.edn b/ci/data/etc/ldapadmin/figwheel-main.edn new file mode 100644 index 0000000..864266c --- /dev/null +++ b/ci/data/etc/ldapadmin/figwheel-main.edn @@ -0,0 +1,34 @@ +;; Figwheel-main configuration options see: https://figwheel.org/config-options +;; these will be overriden by the metadata config options in dev.cljs.edn build file +{ + ;; Set the server port https://figwheel.org/config-options#ring-server-options + ;; :ring-server-options {:port 9500} + + ;; Change the target directory from the "target" to "resources" + ;; https://figwheel.org/config-options#target-dir + ;; :target-dir "resources" + + ;; Server Ring Handler (optional) https://figwheel.org/docs/ring-handler.html + ;; If you want to embed a ring handler into the figwheel server, this + ;; is for simple ring servers + ;; :ring-handler hello_world.server/handler + + ;; To be able to open files in your editor from the heads up display + ;; you will need to put a script on your path. This script will have + ;; to take a file path and a line number ie. + ;; in ~/bin/myfile-opener: + ;; + ;; #! /bin/sh + ;; emacsclient -n +$2:$3 $1 + ;; + ;; :open-file-command "myfile-opener" + + ;; if you are using emacsclient you can just use + ;; :open-file-command "emacsclient" + + ;; Logging output gets printed to the REPL, if you want to redirect it to a file: + ;; :log-file "figwheel-main.log" + + :target-dir "resources" + :open-url false +} diff --git a/ci/data/etc/ldapadmin/options.lisp b/ci/data/etc/ldapadmin/options.lisp new file mode 100644 index 0000000..3d35ea0 --- /dev/null +++ b/ci/data/etc/ldapadmin/options.lisp @@ -0,0 +1,11 @@ +((:name "ldapadmin" + :url "http://localhost:3006" + :document-root "ldapadmin" + :title "LDAP Administration Tool" + :meta-description "LDAP Administration Tool" + :ldap (:ldap-host "ldap.pippiandcarlos.com" + :sslflag nil + :username "cn=Manager,dc=pippiandcarlos,dc=com" + :password "ayluvmiym" + :base-dn "dc=pippiandcarlos,dc=com" + :debug-mode nil))) diff --git a/ci/data/etc/sbclrc b/ci/data/etc/sbclrc new file mode 100644 index 0000000..3a931d0 --- /dev/null +++ b/ci/data/etc/sbclrc @@ -0,0 +1,6 @@ +;;; The following lines added by ql:add-to-init-file: +#-quicklisp +(let ((quicklisp-init (merge-pathnames "quicklisp/setup.lisp" + (user-homedir-pathname)))) + (when (probe-file quicklisp-init) + (load quicklisp-init))) diff --git a/ci/data/install-root.sh b/ci/data/install-root.sh new file mode 100755 index 0000000..1aacb79 --- /dev/null +++ b/ci/data/install-root.sh @@ -0,0 +1,30 @@ +#!/bin/bash + +echo 'APT::Acquire::Retries "3";' > /etc/apt/apt.conf.d/80-retries +export DEBIAN_FRONTEND=noninteractive +apt-get update +apt-get -y -o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confold" dist-upgrade +apt-get -y install -o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confold" aptitude +aptitude -y install -o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confold" apt-transport-https ca-certificates software-properties-common language-pack-de +update-ca-certificates +aptitude update +aptitude -y install -o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confold" sbcl sbcl-source leiningen dnsutils bind9-host vim curl wget rlwrap pass rsync sudo jq lsof zip unzip ldap-utils + +rsync -av /data/ / + +if (( OLO_UID != 0 )); then + userdel ubuntu || true + groupdel ubuntu || true + rm -rf /home/ubuntu || true + export HOMEDIR="/home/${OLO_USERNAME}" + groupadd -g "${OLO_GID}" "${OLO_GROUPNAME}" || OLO_GROUPNAME=$(grep -F "x:${OLO_GID}:" /etc/group | awk -F: '{print $1}') + useradd -s /bin/bash -m -u "${OLO_UID}" -g "${OLO_GROUPNAME}" "${OLO_USERNAME}" || OLO_USERNAME=$(grep -F "x:${OLO_UID}:" /etc/passwd | awk -F: '{print $1}') + SUDOERS_FILENAME="${OLO_USERNAME//\./_}" + echo "${OLO_USERNAME} ALL=(ALL) NOPASSWD: ALL" > "/etc/sudoers.d/${SUDOERS_FILENAME}" + chmod 0440 "/etc/sudoers.d/${SUDOERS_FILENAME}" + mkdir -p "${HOMEDIR}/.gnupg" + chown "${OLO_USERNAME}":"${OLO_GROUPNAME}" "${HOMEDIR}/.gnupg" + chmod 0700 "${HOMEDIR}/.gnupg" +fi + +exit 0 diff --git a/ci/data/install-user-sbcl.sh b/ci/data/install-user-sbcl.sh new file mode 100755 index 0000000..8ab05ea --- /dev/null +++ b/ci/data/install-user-sbcl.sh @@ -0,0 +1,10 @@ +#!/bin/bash + +curl -o ~/quicklisp.lisp https://beta.quicklisp.org/quicklisp.lisp +sbcl --load ~/quicklisp.lisp --eval "(quicklisp-quickstart:install)" --eval "(sb-ext:exit)" +sbcl --eval "(loop for pkg in '(net-telent-date cl-ppcre uffi hunchentoot cl-log ironclad trivial-ldap cl-smtp drakma cl-json swank) do (ql:quickload (symbol-name pkg)))" --eval "(sb-ext:exit)" + +mkdir -p ~/.config/common-lisp +echo "(:source-registry (:tree (:home \"common-lisp/systems\")) :inherit-configuration)" | tee ~/.config/common-lisp/source-registry.conf + +exit 0 diff --git a/ci/data/ldapadmin-starter.lisp b/ci/data/ldapadmin-starter.lisp new file mode 100644 index 0000000..84cbd7a --- /dev/null +++ b/ci/data/ldapadmin-starter.lisp @@ -0,0 +1,7 @@ +(load "/etc/sbclrc") +(asdf:operate 'asdf:load-op 'swank) +(setf swank::*loopback-interface* "0.0.0.0") +(swank:create-server :port 4106 :dont-close t) +(asdf:operate 'asdf:load-op 'ldapadmin) +(in-package :ldapadmin) +(ldapadmin) diff --git a/ci/data/start_app.sh b/ci/data/start_app.sh new file mode 100755 index 0000000..0b40f17 --- /dev/null +++ b/ci/data/start_app.sh @@ -0,0 +1,42 @@ +#!/bin/bash + +mkdir -p ~/common-lisp/systems ~/opt +cd ~/opt +git clone -b master git@ns:repos/ldapadmin.git +git clone -b master git@github.com:ckonstanski/org-ckons-cljs.form.git +git clone -b master git@github.com:ckonstanski/org-ckons-cljs.notifications +git clone -b master git@github.com:ckonstanski/org-ckons-condition +git clone -b master git@github.com:ckonstanski/org-ckons-core +git clone -b master git@github.com:ckonstanski/org-ckons-http +git clone -b master git@github.com:ckonstanski/org-ckons-json + +logdir="/var/log/lisp" +mv -f ${logdir}/ldapadmin.log.1 ${logdir}/ldapadmin.log.2 +mv -f ${logdir}/${APPNAME}ldapadmin.log ${logdir}/ldapadmin.log.1 + +pushd ~/common-lisp/systems +ln -s ~/opt/ldapadmin/lisp/ldapadmin.asd ldapadmin.asd +ln -s ~/opt/org-ckons-condition/org-ckons-condition.asd org-ckons-condition.asd +ln -s ~/opt/org-ckons-core/org-ckons-core.asd org-ckons-core.asd +ln -s ~/opt/org-ckons-file/org-ckons-file.asd org-ckons-file.asd +ln -s ~/opt/org-ckons-http/org-ckons-http.asd org-ckons-http.asd +ln -s ~/opt/org-ckons-json/org-ckons-json.asd org-ckons-json.asd +popd + +pushd ~/opt/ldapadmin/lisp/webapps/ldapadmin/conf +ln -s /etc/ldapadmin/options.lisp options.lisp +popd + +pushd ~/opt/ldapadmin/lisp/webapps/ldapadmin/clojurescript/ldapadmin +ln -s /etc/ldapadmin/figwheel-main.edn figwheel-main.edn +mkdir checkouts +pushd checkouts +ln -s ~/opt/org-ckons-cljs.form org-ckons-cljs.form +ln -s ~/opt/org-ckons-cljs.notifications org-ckons-cljs.notifications +popd + +lein clean +lein fig:build | tee /tmp/ldapadmin/lein.log & +popd + +SBCL_HOME=/usr/lib/sbcl SBCL_SOURCE_ROOT=/usr/lib/sbcl/src exec sbcl --dynamic-space-size 256 --userinit /data/ldapadmin-starter.lisp | tee /tmp/ldapadmin/sbcl.log diff --git a/ci/docker-build.sh b/ci/docker-build.sh new file mode 100755 index 0000000..560cbc8 --- /dev/null +++ b/ci/docker-build.sh @@ -0,0 +1,28 @@ +#!/bin/bash -e + +. env.sh + +builddir='tmp' +container='ldapadmin' + +rm -rf ${builddir} +mkdir ${builddir} +rsync -aq data ${builddir} +pushd ${builddir} 2>/dev/null + +tar Jcvf docker-start.tar.xz data/ +docker stop ${container} || true +docker container prune -f +docker rmi --force ${container} || true + +DOCKER_BUILDKIT=0 docker compose \ + --progress "plain" \ + --ansi "never" \ + build \ + --no-cache \ + --pull + +popd 2>/dev/null +rm -rf tmp + +exit 0 diff --git a/ci/docker-compose.yaml.example b/ci/docker-compose.yaml.example new file mode 100644 index 0000000..78c8478 --- /dev/null +++ b/ci/docker-compose.yaml.example @@ -0,0 +1,48 @@ +services: + ldapadmin: + image: ldapadmin:v0.1 + tty: true + build: + context: . + args: + OLO_USERNAME: ${OLO_USERNAME} + OLO_GROUPNAME: ${OLO_GROUPNAME} + OLO_UID: ${OLO_UID} + OLO_GID: ${OLO_GID} + network_mode: "host" + container_name: ldapadmin + volumes: + - type: bind + source: ~/.m2 + target: /home/${OLO_USERNAME}/.m2 + - type: bind + source: ~/.bashrc + target: /home/${OLO_USERNAME}/.bashrc + - type: bind + source: ~/.bash_history + target: /home/${OLO_USERNAME}/.bash_history + - type: bind + source: ~/.vimrc + target: /home/${OLO_USERNAME}/.vimrc + - type: bind + source: ~/.gitconfig + target: /home/${OLO_USERNAME}/.gitconfig + - type: bind + source: ~/.ssh + target: /home/${OLO_USERNAME}/.ssh + - type: bind + source: /etc/hosts + target: /etc/hosts + - type: bind + source: /etc/ssh + target: /etc/ssh + - type: bind + source: /var/log/lisp + target: /var/log/lisp + environment: + - TERM=xterm-256color + - https_proxy=${https_proxy} + - http_proxy=${http_proxy} + - no_proxy=${no_proxy} + - GITHUB_TOKEN=${GITHUB_TOKEN} + command: [ "/bin/bash -l -c" ] diff --git a/ci/docker-run.sh b/ci/docker-run.sh new file mode 100755 index 0000000..c368224 --- /dev/null +++ b/ci/docker-run.sh @@ -0,0 +1,7 @@ +#!/bin/bash -e + +. env.sh + +docker compose --ansi "never" up -d + +exit 0 diff --git a/ci/env.sh b/ci/env.sh new file mode 100644 index 0000000..a49fb54 --- /dev/null +++ b/ci/env.sh @@ -0,0 +1,4 @@ +export OLO_USERNAME=$(id -un) +export OLO_GROUPNAME=$(id -gn) +export OLO_UID=$(id -u) +export OLO_GID=$(id -g) diff --git a/lisp/ldapadmin.asd b/lisp/ldapadmin.asd index 915e09f..c430075 100644 --- a/lisp/ldapadmin.asd +++ b/lisp/ldapadmin.asd @@ -18,7 +18,7 @@ :components ,components)) (defparameter *quicklisp-packages* '(net-telent-date cl-ppcre uffi hunchentoot cl-log ironclad trivial-ldap cl-smtp)) -(defparameter *asdf-packages* '(org-ckons-core org-ckons-http org-ckons-json)) +(defparameter *asdf-packages* '(org-ckons-core org-ckons-condition org-ckons-http org-ckons-json)) (defparameter *all-packages* (append *quicklisp-packages* *asdf-packages*)) (loop for pkg in *quicklisp-packages* do -- cgit v1.3