ODOO_SERVICE_PREFIX ?= sandbox-odoorepair-gfijxl MODULES ?= all CUSTOM_MODULES ?= dsrpt_repair_config,dsrpt_address_book,dsrpt_repair_technicians,dsrpt_repair_materials,dsrpt_repair_work_orders ODOO_CONFIG ?= /etc/odoo/odoo.conf REMOTE_APP_PATH ?= /etc/dokploy/applications/$(ODOO_SERVICE_PREFIX)/code REMOTE_ADDONS_SRC ?= $(REMOTE_APP_PATH)/odoo/addons REMOTE_ADDONS_DST ?= /var/lib/docker/volumes/repair_odoo_addons/_data ODOO_DB_NAME ?= ODOO_DB_USER ?= ODOO_DB_PASSWORD ?= ODOO_DB_HOST ?= ODOO_DB_PORT ?= GIT_REMOTE ?= origin GIT_BRANCH ?= main .PHONY: help install-modules update-modules install-custom update-custom restart-service logs shell repo-status repo-pull repo-set-ssh repo-set-https preflight-check remote-repo-pull sync-addons help: @echo "Targets:" @echo " make install-modules MODULES=module_a,module_b" @echo " make update-modules MODULES=module_a,module_b" @echo " make install-custom" @echo " make update-custom" @echo " make restart-service" @echo " make logs" @echo " make shell" @echo " make repo-status" @echo " make repo-set-ssh" @echo " make repo-set-https" @echo " make repo-pull GIT_BRANCH=main" @echo " env DOCKER_HOST=ssh://root@dsrptlab make update-custom" preflight-check: @if [ -n "$$(git status --porcelain)" ]; then \ echo "Working tree is not clean. Commit changes first."; \ exit 1; \ fi @if git rev-parse --abbrev-ref --symbolic-full-name '@{u}' >/dev/null 2>&1; then \ ahead="$$(git rev-list --count @{u}..HEAD)"; \ if [ "$$ahead" -gt 0 ]; then \ echo "Local branch is ahead by $$ahead commit(s). Run git push first."; \ exit 1; \ fi; \ fi remote-repo-pull: @echo "Pulling latest repo on remote host: $(REMOTE_APP_PATH)" @docker run --rm --entrypoint /bin/sh -v "$(REMOTE_APP_PATH):/repo" alpine/git -lc "set -e; cd /repo && git fetch $(GIT_REMOTE) && git pull --ff-only $(GIT_REMOTE) $(GIT_BRANCH)" sync-addons: @echo "Syncing addons to volume: $(REMOTE_ADDONS_DST)" @docker run --rm -v "$(REMOTE_ADDONS_SRC):/src" -v "$(REMOTE_ADDONS_DST):/dst" alpine:3.20 sh -lc '\ set -e; \ if [ "$(MODULES)" = "all" ]; then \ for src in /src/dsrpt_*; do \ [ -d "$$src" ] || continue; \ mod="$$(basename "$$src")"; \ rm -rf "/dst/$$mod"; \ cp -a "$$src" "/dst/$$mod"; \ echo "Synced $$mod"; \ done; \ else \ for mod in $$(echo "$(MODULES)" | tr "," " "); do \ mod="$${mod# }"; mod="$${mod% }"; \ [ -d "/src/$$mod" ] || { echo "Missing module in source: $$mod"; exit 1; }; \ rm -rf "/dst/$$mod"; \ cp -a "/src/$$mod" "/dst/$$mod"; \ echo "Synced $$mod"; \ done; \ fi' install-modules: @$(MAKE) preflight-check @$(MAKE) remote-repo-pull @$(MAKE) sync-addons MODULES='$(MODULES)' @container="$$(docker ps --filter 'name=$(ODOO_SERVICE_PREFIX)' --format '{{.Names}}' | head -1)"; \ if [ -z "$$container" ]; then \ echo "No Odoo container found for prefix: $(ODOO_SERVICE_PREFIX)"; \ exit 1; \ fi; \ db_name="$(ODOO_DB_NAME)"; \ db_user="$(ODOO_DB_USER)"; \ db_password="$(ODOO_DB_PASSWORD)"; \ db_host="$(ODOO_DB_HOST)"; \ db_port="$(ODOO_DB_PORT)"; \ if [ -z "$$db_name" ]; then db_name="$$(docker exec $$container printenv ODOO_DB_NAME 2>/dev/null || true)"; fi; \ if [ -z "$$db_user" ]; then db_user="$$(docker exec $$container printenv ODOO_DB_USER 2>/dev/null || true)"; fi; \ if [ -z "$$db_password" ]; then db_password="$$(docker exec $$container printenv ODOO_DB_PASSWORD 2>/dev/null || true)"; fi; \ if [ -z "$$db_host" ]; then db_host="$$(docker exec $$container printenv ODOO_DB_HOST 2>/dev/null || true)"; fi; \ if [ -z "$$db_port" ]; then db_port="$$(docker exec $$container printenv ODOO_DB_PORT 2>/dev/null || true)"; fi; \ if [ -z "$$db_name" ] || [ -z "$$db_user" ] || [ -z "$$db_password" ] || [ -z "$$db_host" ]; then \ echo "Cannot resolve ODOO_DB_* values. Set them in env or Make vars."; \ exit 1; \ fi; \ db_port_arg=""; \ if [ -n "$$db_port" ]; then db_port_arg="--db_port=$$db_port"; fi; \ echo "Installing modules: $(MODULES)"; \ docker exec $$container odoo -c '$(ODOO_CONFIG)' -d "$$db_name" -r "$$db_user" -w "$$db_password" --db_host="$$db_host" $$db_port_arg -i '$(MODULES)' --stop-after-init; \ $(MAKE) restart-service update-modules: @$(MAKE) preflight-check @$(MAKE) remote-repo-pull @$(MAKE) sync-addons MODULES='$(MODULES)' @container="$$(docker ps --filter 'name=$(ODOO_SERVICE_PREFIX)' --format '{{.Names}}' | head -1)"; \ if [ -z "$$container" ]; then \ echo "No Odoo container found for prefix: $(ODOO_SERVICE_PREFIX)"; \ exit 1; \ fi; \ db_name="$(ODOO_DB_NAME)"; \ db_user="$(ODOO_DB_USER)"; \ db_password="$(ODOO_DB_PASSWORD)"; \ db_host="$(ODOO_DB_HOST)"; \ db_port="$(ODOO_DB_PORT)"; \ if [ -z "$$db_name" ]; then db_name="$$(docker exec $$container printenv ODOO_DB_NAME 2>/dev/null || true)"; fi; \ if [ -z "$$db_user" ]; then db_user="$$(docker exec $$container printenv ODOO_DB_USER 2>/dev/null || true)"; fi; \ if [ -z "$$db_password" ]; then db_password="$$(docker exec $$container printenv ODOO_DB_PASSWORD 2>/dev/null || true)"; fi; \ if [ -z "$$db_host" ]; then db_host="$$(docker exec $$container printenv ODOO_DB_HOST 2>/dev/null || true)"; fi; \ if [ -z "$$db_port" ]; then db_port="$$(docker exec $$container printenv ODOO_DB_PORT 2>/dev/null || true)"; fi; \ if [ -z "$$db_name" ] || [ -z "$$db_user" ] || [ -z "$$db_password" ] || [ -z "$$db_host" ]; then \ echo "Cannot resolve ODOO_DB_* values. Set them in env or Make vars."; \ exit 1; \ fi; \ db_port_arg=""; \ if [ -n "$$db_port" ]; then db_port_arg="--db_port=$$db_port"; fi; \ echo "Updating modules: $(MODULES)"; \ docker exec $$container odoo -c '$(ODOO_CONFIG)' -d "$$db_name" -r "$$db_user" -w "$$db_password" --db_host="$$db_host" $$db_port_arg -u '$(MODULES)' --stop-after-init; \ $(MAKE) restart-service install-custom: @$(MAKE) install-modules MODULES='$(CUSTOM_MODULES)' update-custom: @$(MAKE) update-modules MODULES='$(CUSTOM_MODULES)' restart-service: @service="$$(docker service ls --format '{{.Name}}' | grep -m1 '^$(ODOO_SERVICE_PREFIX)')"; \ if [ -z "$$service" ]; then \ echo "No service found for prefix: $(ODOO_SERVICE_PREFIX)"; \ exit 1; \ fi; \ echo "Restarting service $$service"; \ docker service update --force $$service >/dev/null logs: @service="$$(docker service ls --format '{{.Name}}' | grep -m1 '^$(ODOO_SERVICE_PREFIX)')"; \ if [ -z "$$service" ]; then \ echo "No service found for prefix: $(ODOO_SERVICE_PREFIX)"; \ exit 1; \ fi; \ docker service logs --tail 100 -f $$service shell: @container="$$(docker ps --filter 'name=$(ODOO_SERVICE_PREFIX)' --format '{{.Names}}' | head -1)"; \ if [ -z "$$container" ]; then \ echo "No Odoo container found for prefix: $(ODOO_SERVICE_PREFIX)"; \ exit 1; \ fi; \ docker exec -it $$container bash repo-status: ; @git remote -v && git branch --show-current && git status -sb repo-pull: ; @git fetch $(GIT_REMOTE) && git pull --ff-only $(GIT_REMOTE) $(GIT_BRANCH) repo-set-ssh: ; @git remote set-url origin git@gitea-repair:dsrptlab/repair.git && git remote -v repo-set-https: ; @git remote set-url origin https://gitea.dsrptlab.com/dsrptlab/repair.git && git remote -v