diff --git a/.gitea/workflows/init_setup_environment.yml b/.gitea/workflows/init_setup_environment.yml new file mode 100644 index 000000000..5f5009158 --- /dev/null +++ b/.gitea/workflows/init_setup_environment.yml @@ -0,0 +1,116 @@ +name: Setup Native Action + +on: + push: + branches: [main,dev] + pull_request: + branches: [main,dev] +# options in commit : @native @docker @push_image @run_test @no_cleanup @restore_db +jobs: + native: + if: contains(github.event.head_commit.message, '@native') + runs-on: ubuntu-latest + env: + DB_USER: ${{ secrets.DB_USER }} + DB_PASSWORD: ${{ secrets.DB_PASSWORD }} + DB_SERVER: ${{ vars.DB_SERVER }} + DB_PORT: ${{ vars.DB_PORT }} + strategy: + matrix: + python-version: [3.12.7] + steps: + - name: Checkout Repository + uses: actions/checkout@v4 + with: + ref: ${{ github.ref_name }} + + - name: Set up Python + uses: actions/setup-python@v4 + with: + python-version: ${{ matrix.python-version }} + + - name: Create Python virtual environment + run: python -m venv venv + + - name: Activate virtual environment and install dependencies + run: make install + + - name: Generate Config + run: make gen_config + + - name: Run Tests + run: make run_test + + docker: + if: contains(github.event.head_commit.message, '@docker') + runs-on: host + env: + DB_USER: ${{ secrets.DB_USER }} + DB_PASSWORD: ${{ secrets.DB_PASSWORD }} + DB_SERVER: ${{ vars.DB_SERVER }} + DB_PORT: ${{ vars.DB_PORT }} + strategy: + matrix: + python-version: [3.12.7] + steps: + - name: Checkout Repository + uses: actions/checkout@v4 + with: + ref: ${{ github.ref_name }} + + # - name: Set up Python + # uses: actions/setup-python@v4 + # with: + # python-version: ${{ matrix.python-version }} + + - name: Create Python virtual environment + run: python -m venv venv + + - name: Activate virtual environment and install dependencies + run: ./venv/bin/pip install python-dotenv + + - name: Update Tag + run: make update_tag CURR_BRANCH=${{ github.ref_name }} + + - name: Install Docker compose + uses: KengoTODA/actions-setup-docker-compose@v1 + with: + version: '2.14.2' + - name: Stop Server Docker + run: make stop_server_docker + + - name: Generate Config + run: make gen_config_docker + + - name: Build Image + run: make build_image + + - name: Start Server + run: make run_server_docker + + - name: Sleep for 10 seconds + run: sleep 10 + + - name: Restore Database + if: contains(github.event.head_commit.message, '@restore_db') + run: make restore_database_docker + + - name: Run Tests + if: contains(github.event.head_commit.message, '@run_test') + run: make run_test_docker + + - name: Login Docker hub + if: contains(github.event.head_commit.message, '@push_image') + run: echo ${{ secrets.DOCKER_PASSWORD }} | docker login -u ${{ secrets.DOCKER_USER }} --password-stdin ${{ secrets.DOCKER_HUB }} + + - name: Push Image + if: contains(github.event.head_commit.message, '@push_image') + run: make push_image + + - name: Logout Docker hub + if: contains(github.event.head_commit.message, '@push_image') + run: docker logout ${{ secrets.DOCKER_HUB }} + + - name: Clean Up + if: "!contains(github.event.head_commit.message, '@no_cleanup')" + run: make clean_up diff --git a/.gitea/workflows/setup_docker.yml b/.gitea/workflows/setup_docker.yml deleted file mode 100644 index 5920935b2..000000000 --- a/.gitea/workflows/setup_docker.yml +++ /dev/null @@ -1,60 +0,0 @@ -name: Setup Docker Action -on: - push: - branches: - - main - # - develop - # pull_request: - # branches: - # - main -jobs: - setup_docker: - runs-on: host - strategy: - matrix: - python: - - 3.12.7 - steps: - - name: Checkout Repository - uses: actions/checkout@v4 - with: - ref: ${{ github.ref_name }} - - name: Clean up Virtual Environment - run: ./setup/clean_up_virtualenvs.sh 0 - - - name: Create Virtual Environment - run: pyenv virtualenv "${{ github.ref_name }}-$(git rev-parse --short "$GITHUB_SHA")" - - - name: Install dotenv - run: pip install python-dotenv - - - name: Update Tag - run: make update_tag CURR_BRANCH=${{ github.ref_name }} - - - name: Stop Server Docker - run: make stop_server_docker - - - name: Generate Config - run: make gen_config - - - name: Build Image - run: make build_image - - - name: Start Server - run: make run_server_docker - - name: Sleep for 30 seconds - run: sleep 30s - - - name: Restore Database - run: make restore_database - - - name: Run Tests - run: make run_test_docker - - - name: Login Docker hub - run: echo ${{ secrets.DOCKER_PASSWORD }} | docker login -u ${{ secrets.DOCKER_USER }} --password-stdin ${{ secrets.DOCKER_HUB }} - - name: Push Image - run: make push_image - - - name: Clean Up - run: make clean_up diff --git a/.github/workflows/setup_docker.yml b/.github/workflows/setup_docker.yml index 164a3d472..551ef4fbd 100644 --- a/.github/workflows/setup_docker.yml +++ b/.github/workflows/setup_docker.yml @@ -1,19 +1,19 @@ name: Setup Docker Action on: push: - branches: + branches: - main - # - develop - # pull_request: - # branches: - # - main + - dev + - feature/* jobs: setup_docker: + if: contains(github.event.head_commit.message, '@docker') runs-on: self-hosted strategy: matrix: python: - 3.12.7 + steps: - name: Fix Permission run: | @@ -40,7 +40,7 @@ jobs: run: make stop_server_docker - name: Generate Config - run: make gen_config + run: make gen_config_docker - name: Build Image run: make build_image @@ -51,7 +51,7 @@ jobs: run: sleep 30s - name: Restore Database - run: make restore_database + run: make restore_database_docker - name: Run Tests run: make run_test_docker diff --git a/.gitignore b/.gitignore index 62dbb6f84..55a140535 100644 --- a/.gitignore +++ b/.gitignore @@ -50,4 +50,5 @@ package.json /share/ /src/ /deployment/postgresql/* -/venv/ \ No newline at end of file +/venv/ +/deployment/backup/*.zip diff --git a/Dockerfile b/Dockerfile index 7a9d93046..0045b4bf9 100644 --- a/Dockerfile +++ b/Dockerfile @@ -2,15 +2,18 @@ FROM odoo:18.0 # Overwrite odoo with addons COPY ./odoo /usr/lib/python3/dist-packages/ COPY ./addons /usr/lib/python3/dist-packages/odoo +COPY ./deployment/entrypoint.sh / # Copy entrypoint script and Odoo configuration file # COPY deployment/entrypoint.sh / # COPY deployment/odoo.conf /etc/odoo/ -# Set permissions and Mount /var/lib/odoo to allow restoring filestore and /mnt/extra-addons for users addons +# Set permissions and Mount /var/lib/odoo to allow restoring filestore and /mnt/extra-addons for users addons and /mnt/backup for backup RUN chown odoo /etc/odoo/odoo.conf \ && mkdir -p /mnt/extra-addons \ - && chown -R odoo /mnt/extra-addons -VOLUME ["/var/lib/odoo", "/mnt/extra-addons"] + && chown -R odoo /mnt/extra-addons \ + && mkdir -p /var/lib/odoo/backup \ + && chown -R odoo /var/lib/odoo/backup +VOLUME ["/var/lib/odoo", "/mnt/extra-addons","/var/lib/odoo/backup"] # Expose Odoo services EXPOSE 8069 8071 8072 diff --git a/Jenkinsfile b/Jenkinsfile index 012b0ace3..6708f10ea 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -11,12 +11,12 @@ node('Node-Dev-100163') { stage('Build') { // sh 'make install' sh 'make stop_server_docker' - sh 'make gen_config' + sh 'make gen_config_docker' sh 'make build_image' } stage('Start'){ sh 'make run_server_docker' - sh 'make restore_database' + sh 'make restore_database_docker' } stage('Testing') { sh 'make run_test_docker' diff --git a/Makefile b/Makefile index 8aa91138f..e21342681 100644 --- a/Makefile +++ b/Makefile @@ -2,34 +2,67 @@ PWD = $(shell pwd) UID = $(shell id -u) GID = $(shell id -g) -PYTHON=python +PIP=${PWD}/venv/bin/pip +PYTHON=${PWD}/venv/bin/python DOCKERCMD=docker DOCKER_COMPOSE_CMD=docker-compose DOCKER_BUILD=$(DOCKERCMD) build DOCKER_PUSH=$(DOCKERCMD) push DOCKER_IMAGE=$(DOCKERCMD) image +DOCKER_EXEC=$(DOCKERCMD) exec DEPLOY_PATH=${PWD}/deployment SETUP_PATH=${PWD}/setup CONFIG=odoo.conf -ODOO_IMAGE=hub.nextzenos.com/nexterp/odoo -TAG := $(shell rev-parse --abbrev-ref HEAD) -CONTAINER_ID=odoo-${TAG} +HUB=hub.nextzenos.com +CDN=https://cdn.nextzenos.com/CDN/NextERP +ORGANIZATION=nexterp +PROJECT := odoo18 +ODOO_IMAGE=${HUB}/${ORGANIZATION}/$(PROJECT) +TAG := $(shell git rev-parse --abbrev-ref HEAD) +CONTAINER_ID=${PROJECT}-${TAG} +VERSION := community +ADDONS=${PWD}/addons,${PWD}/odoo/addons +BACKUP=${CDN}/raw/branch/main/backup/${VERSION}/odoo18-main_2025-01-15_08-05-47.zip +##### Native Deployment######### install: - sudo apt -y update && \ - sudo apt install -y build-essential python3-full python3-pip libldap2-dev libpq-dev libsasl2-dev -run_test_docker: - sudo docker exec ${CONTAINER_ID} odoo --test-tags :TestAccountMove.test_out_invoice_auto_post_monthly,TestAccountMove.test_included_tax --log-level=test --test-enable -d testdb --stop-after-init --config=/etc/odoo/${CONFIG} --xmlrpc-port=8071 && \ - sudo docker exec ${CONTAINER_ID} odoo db --config=/etc/odoo/${CONFIG} drop testdb -run_test_local: - odoo-bin -i all_modules --log-level=test --test-enable -d testdb --stop-after-init --config=${CONFIG} + sudo apt update -y && \ + sudo apt install -y python3-pip libldap2-dev libpq-dev libsasl2-dev postgresql-client && \ + ${PIP} install --no-input -r requirements.txt --break-system-packages +download_backup: + @if [ -z "${LINKDB}" ]; then \ + LinkDB=${BACKUP}; \ + read -p "LinkDownload [default: ${BACKUP}]: " InputLinkDB; \ + LinkDB=$${InputLinkDB:-${BACKUP}}; \ + else \ + LinkDB=${LINKDB}; \ + fi; \ + Filename=$$(basename $$LinkDB); \ + echo "Downloading $$Filename from: $$LinkDB"; \ + ${PWD}/setup/download_backup.sh $$LinkDB backup.zip gen_config: - ${PWD}/setup/init_config.sh ${ODOO_IMAGE} ${TAG} ${CONTAINER_ID} + $(MAKE) download_backup LINKDB=${BACKUP} + ${PWD}/setup/init_config.sh --native ${ADDONS} +run_server: + ${PYTHON} odoo-bin --config=${CONFIG} +run_test: + ${PYTHON} odoo-bin --test-tags :TestAccountMove.test_out_invoice_auto_post_monthly,TestAccountMove.test_included_tax --log-level=test --test-enable -d testdb-${TAG} --stop-after-init --config=${CONFIG} + ${PYTHON} odoo-bin db --config=${CONFIG} drop testdb-${TAG} +restore_database: + @read -p "Enter the database name: " DBNAME; \ + echo "Restoring database: $$DBNAME"; \ + ${PYTHON} odoo-bin db --config=${CONFIG} load $$DBNAME ${PWD}/deployment/backup/backup.zip + +##### Docker Deployment ######### +run_test_docker: + sudo ${DOCKER_EXEC} ${CONTAINER_ID} odoo --test-tags :TestAccountMove.test_out_invoice_auto_post_monthly,TestAccountMove.test_included_tax --log-level=test --test-enable -d testdb-${TAG} --stop-after-init --config=/etc/odoo/${CONFIG} --xmlrpc-port=8071 && \ + sudo ${DOCKER_EXEC} ${CONTAINER_ID} odoo db --config=/etc/odoo/${CONFIG} drop testdb-${TAG} +gen_config_docker: + $(MAKE) download_backup LINKDB=${BACKUP} + ${PWD}/setup/init_config.sh --docker ${ODOO_IMAGE} ${TAG} ${CONTAINER_ID} build_image: DOCKER_BUILDKIT=1 ${DOCKER_BUILD} . --progress plain --tag ${ODOO_IMAGE}:${TAG} push_image: $(DOCKER_PUSH) ${ODOO_IMAGE}:${TAG} -run_server_local: - ${PYTHON} odoo-bin --config=${CONFIG} run_server_docker: @if ! docker ps | grep -q "${CONTAINER_ID}"; then \ echo "Container not found. Running docker-compose up -d"; \ @@ -40,15 +73,8 @@ run_server_docker: ${DOCKER_COMPOSE_CMD} up -d update_tag: ${SETUP_PATH}/update_tag.sh $(CURR_BRANCH) -restore_database: - @echo "Checking for backup.zip in container..." - @if sudo docker exec ${CONTAINER_ID} test -f /etc/odoo/backup/backup.zip; then \ - echo "Restoring database from backup..."; \ - sudo docker exec ${CONTAINER_ID} odoo db --config=/etc/odoo/${CONFIG} load backup /etc/odoo/backup/backup.zip; \ - else \ - echo "Error: backup.zip not found in container. Aborting restore."; \ - fi - +restore_database_docker: + sudo ${DOCKER_EXEC} ${CONTAINER_ID} odoo db -c /etc/odoo/odoo.conf load backup /var/lib/odoo/backup/backup.zip stop_server_docker: @if ! docker ps | grep -q "${CONTAINER_ID}"; then \ echo "Container not found. Skipping"; \ diff --git a/deployment/backup/ce/backup.zip b/deployment/backup/ce/backup.zip deleted file mode 100755 index 758e0d91e..000000000 Binary files a/deployment/backup/ce/backup.zip and /dev/null differ diff --git a/deployment/docker-compose.yml b/deployment/docker-compose.yml index 6f4734282..15ddad26d 100755 --- a/deployment/docker-compose.yml +++ b/deployment/docker-compose.yml @@ -3,7 +3,7 @@ services: app: image: ${ODOO_IMAGE:-odoo}:${ODOO_TAG:-18} container_name: ${ODOO_CONTAINER:-odoo} - user: root + # user: root depends_on: - db ports: @@ -16,14 +16,13 @@ services: - USER=${PG_USER:-changeme} - PASSWORD=${PG_PASS:-password} volumes: - - ${ENTRYPOINT:-./entrypoint.sh}:/entrypoint.sh # use for install additional package (Optional) - ${ODOO_ADDONS:-./addons}:/mnt/extra-addons - ${ODOO_CONFIG:-./etc}:/etc/odoo - - ${ODOO_BACKUP:-./backup/ce}:/etc/odoo/backup + - ${ODOO_BACKUP:-./backup}:/var/lib/odoo/backup restart: always db: image: postgres:16 - user: root + # user: root environment: - POSTGRES_USER=${PG_USER:-changeme} - POSTGRES_PASSWORD=${PG_PASS:-password} diff --git a/deployment/env.template b/deployment/env.template index 61b59b595..009edac12 100755 --- a/deployment/env.template +++ b/deployment/env.template @@ -7,10 +7,9 @@ ODOO_CONTAINER= # ODOO_CHAT_PORT= ODOO_ADDONS=./addons ODOO_CONFIG=./etc -ODOO_BACKUP=./backup/ce +ODOO_BACKUP=./backup #Database PG_PORT= -PG_DB= PG_USER= PG_PASS= ENTRYPOINT=./entrypoint.sh diff --git a/deployment/etc/odoo.conf b/deployment/etc/odoo.conf new file mode 100644 index 000000000..ca1198737 --- /dev/null +++ b/deployment/etc/odoo.conf @@ -0,0 +1,9 @@ +[options] +addons_path = /mnt/extra-addons +data_dir = /var/lib/odoo +db_host = db +db_port = 5432 +db_user = default_repo +db_password = smartyourlife +proxy_mode = True + diff --git a/odoo.conf.sample b/odoo.conf.template similarity index 52% rename from odoo.conf.sample rename to odoo.conf.template index adb122353..e27989fd7 100644 --- a/odoo.conf.sample +++ b/odoo.conf.template @@ -3,4 +3,7 @@ db_host = db_port = 5432 db_user = db_password = - +xmlrpc_port = +addons_path = +dbfilter = +proxy_mode = \ No newline at end of file diff --git a/setup/clean_up_virtualenvs.sh b/setup/clean_up_virtualenvs.sh index 0224b8465..f383c2fb3 100755 --- a/setup/clean_up_virtualenvs.sh +++ b/setup/clean_up_virtualenvs.sh @@ -20,7 +20,7 @@ if (( keep_count > 0 )); then # Loop through the oldest virtual environments and delete them for venv in $oldest_venvs; do echo "Deleting virtual environment: $venv" - pyenv virtualenv-delete "$venv" -f + pyenv virtualenv-delete -f "$venv" done fi diff --git a/setup/download_backup.sh b/setup/download_backup.sh new file mode 100755 index 000000000..f213445c4 --- /dev/null +++ b/setup/download_backup.sh @@ -0,0 +1,82 @@ +#!/usr/bin/bash + +export PATH=/usr/sbin:$PATH +export DEBIAN_FRONTEND=noninteractive +set -euo pipefail +readonly COLOUR_RESET='\e[0m' +readonly aCOLOUR=( + '\e[38;5;154m' # green | Lines, bullets and separators + '\e[1m' # Bold white | Main descriptions + '\e[90m' # Grey | Credits + '\e[91m' # Red | Update notifications Alert + '\e[33m' # Yellow | Emphasis +) +trap 'onCtrlC' INT +onCtrlC() { + echo -e "${COLOUR_RESET}" + exit 1 +} + +Show() { + # OK + if (($1 == 0)); then + echo -e "${aCOLOUR[2]}[$COLOUR_RESET${aCOLOUR[0]} OK $COLOUR_RESET${aCOLOUR[2]}]$COLOUR_RESET $2" + # FAILED + elif (($1 == 1)); then + echo -e "${aCOLOUR[2]}[$COLOUR_RESET${aCOLOUR[3]}FAILED$COLOUR_RESET${aCOLOUR[2]}]$COLOUR_RESET $2" + exit 1 + # INFO + elif (($1 == 2)); then + echo -e "${aCOLOUR[2]}[$COLOUR_RESET${aCOLOUR[0]} INFO $COLOUR_RESET${aCOLOUR[2]}]$COLOUR_RESET $2" + # NOTICE + elif (($1 == 3)); then + echo -e "${aCOLOUR[2]}[$COLOUR_RESET${aCOLOUR[4]}NOTICE$COLOUR_RESET${aCOLOUR[2]}]$COLOUR_RESET $2" + fi +} + +Warn() { + echo -e "${aCOLOUR[3]}$1$COLOUR_RESET" +} + +GreyStart() { + echo -e "${aCOLOUR[2]}\c" +} + +ColorReset() { + echo -e "$COLOUR_RESET\c" +} + + +main() { + DEPLOYMENT_DIR=$(pwd)/deployment + BACKUP_DIR="$DEPLOYMENT_DIR/backup" + DOWNLOAD_URL="$1" + BACKUP_FILE="$BACKUP_DIR/$2" + # Check if the deployment and backup directories exist, create them if not + if [[ ! -d "$BACKUP_DIR" ]]; then + echo "Backup directory does not exist. Creating: $BACKUP_DIR" + mkdir -p "$BACKUP_DIR" + fi + + # Check if the download URL is valid + echo "Checking if the URL is valid: $DOWNLOAD_URL" + if curl --head --silent --fail "$DOWNLOAD_URL" > /dev/null; then + echo "URL is valid. Proceeding with download..." + else + Show 1 "Error: Invalid or inaccessible URL: $DOWNLOAD_URL" + exit 1 + fi + + # Download the file and rename it to backup.zip + wget -O "$BACKUP_FILE" "$DOWNLOAD_URL" + + # Check if the file was downloaded + if [[ -f "$BACKUP_FILE" ]]; then + Show 0 "Backup file successfully downloaded to: $BACKUP_FILE" + else + Show 1 "Error: Backup file was not downloaded." + exit 1 + fi +} + +main "$@" \ No newline at end of file diff --git a/setup/gen_config.py b/setup/gen_config.py new file mode 100644 index 000000000..b0a38390e --- /dev/null +++ b/setup/gen_config.py @@ -0,0 +1,67 @@ +#!/usr/bin/env python3 +import argparse +import configparser +import shutil +import os +from dotenv import set_key +from pathlib import Path +import socket +import secrets +import string +import color_log +def find_available_port(start_port=80): + """Finds an available port starting from the given port.""" + with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock: + while True: + try: + sock.bind(('0.0.0.0', start_port)) + color_log.Show(3,f" {start_port} is Open") + return start_port + except OSError as e: + if e.errno == 98: # Address already in use + print(f"{start_port} already in use , Try other port ...") + start_port += 1 + else: + raise +def main(): + """ + Generates a random password and finds an available port. + Updates the Odoo configuration file and .env file with these values. + """ + parser = argparse.ArgumentParser(description="Generate Odoo configuration") + parser.add_argument('--db_user', type=str, help='') + parser.add_argument('--db_pass', type=str, help='') + parser.add_argument('--deploy_path', type=str, help='') + parser.add_argument('--addons_path', type=str, help='') + # parser.add_argument('--db_filter', type=str, help='') + parser.add_argument('--db_port', type=int, help='') + parser.add_argument('--db_server', type=str, help='') + args = parser.parse_args() + db_port = args.db_port + db_user = args.db_user + db_pass = args.db_pass + db_server = args.db_server + app_port = find_available_port(8069) + addons_path = args.addons_path + base_dir= args.deploy_path + # db_filter= args.db_filter + # Copy template files + os.makedirs(f"{base_dir}/etc", exist_ok=True) + color_log.Show(3,f"Copy {base_dir}/odoo.conf.template to {base_dir}/etc/odoo.conf") + shutil.copyfile(f'{base_dir}/odoo.conf.template', f'{base_dir}/odoo.conf') + + # Update Odoo configuration file + config = configparser.ConfigParser() + config.read(f'{base_dir}/odoo.conf') + config['options']['db_host'] = str(db_server) + config['options']['db_user'] = db_user + config['options']['db_password'] = db_pass + config['options']['db_port'] = str(db_port) + config['options']['addons_path'] = addons_path + config['options']['xmlrpc_port'] = str(app_port) + config['options']['dbfilter'] = ".*" + config['options']['proxy_mode'] = "True" + with open(f'{base_dir}/odoo.conf', 'w') as configfile: + config.write(configfile) +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/setup/gen-config.py b/setup/gen_config_docker.py similarity index 90% rename from setup/gen-config.py rename to setup/gen_config_docker.py index d6e9f3c67..ce15bc55f 100755 --- a/setup/gen-config.py +++ b/setup/gen_config_docker.py @@ -19,7 +19,7 @@ def find_available_port(start_port=80): with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock: while True: try: - sock.bind(('localhost', start_port)) + sock.bind(('0.0.0.0', start_port)) color_log.Show(3,f" {start_port} is Open") return start_port except OSError as e: @@ -78,7 +78,7 @@ def main(): # Update .env file env_file_path = Path("deployment/.env") set_key(dotenv_path=env_file_path, key_to_set="COMPOSE_PROJECT_NAME", value_to_set=f"odoo-{tag}",quote_mode="never") - set_key(dotenv_path=env_file_path, key_to_set="PG_PORT", value_to_set=find_available_port(5432),quote_mode="never") + set_key(dotenv_path=env_file_path, key_to_set="PG_PORT", value_to_set=find_available_port(int(os.getenv('DB_PORT','5432'))+1),quote_mode="never") set_key(dotenv_path=env_file_path, key_to_set="PG_USER", value_to_set=db_user,quote_mode="never") set_key(dotenv_path=env_file_path, key_to_set="PG_PASS", value_to_set=db_pass,quote_mode="never") set_key(dotenv_path=env_file_path, key_to_set="ODOO_CONFIG", value_to_set=config_path,quote_mode="never") @@ -87,9 +87,7 @@ def main(): set_key(dotenv_path=env_file_path, key_to_set="ODOO_IMAGE", value_to_set=image,quote_mode="never") set_key(dotenv_path=env_file_path, key_to_set="ODOO_TAG", value_to_set=tag,quote_mode="never") set_key(dotenv_path=env_file_path, key_to_set="ODOO_CONTAINER", value_to_set=container,quote_mode="never") - if (backup == 'community'): - set_key(dotenv_path=env_file_path, key_to_set="ODOO_BACKUP", value_to_set=f'{base_dir}/backup/ce',quote_mode="never") - if (backup == 'enterprise'): - set_key(dotenv_path=env_file_path, key_to_set="ODOO_BACKUP", value_to_set=f'{base_dir}/backup/enterprise',quote_mode="never") + set_key(dotenv_path=env_file_path, key_to_set="ODOO_BACKUP", value_to_set=backup,quote_mode="never") + if __name__ == "__main__": main() diff --git a/setup/init_config.sh b/setup/init_config.sh index f2c887c7c..3df30a4e4 100755 --- a/setup/init_config.sh +++ b/setup/init_config.sh @@ -5,15 +5,15 @@ export DEBIAN_FRONTEND=noninteractive set -euo pipefail DEPLOY_PATH=$(pwd)/deployment SETUP_PATH=$(pwd)/setup -ODOO_IMAGE=$1 -ODOO_TAG=$2 -ODOO_CONTAINER=$3 -PG_USER=nexterp -ODOO_ADDONS=./addons -ODOO_CONFIG=./etc + +PIP=$(pwd)/venv/bin/pip +PYTHON=$(pwd)/venv/bin/python +ODOO_ADDONS=${DEPLOY_PATH}/addons +ODOO_CONFIG=${DEPLOY_PATH}/etc +ODOO_BACKUP=${DEPLOY_PATH}/backup # System -DEPENDS_PACKAGE=('wget' 'curl' 'git' 'unzip' 'make' 'wkhtmltopdf') -DEPENDS_COMMAND=('wget' 'curl' 'git' 'unzip' 'make' 'wkhtmltopdf') +DEPENDS_PACKAGE=('wget' 'curl' 'git' 'unzip' 'make' 'wkhtmltopdf' 'postgresql-client') +DEPENDS_COMMAND=('wget' 'curl' 'git' 'unzip' 'make' 'wkhtmltopdf' 'psql') ((EUID)) && sudo_cmd="sudo" || sudo_cmd="" readonly MINIMUM_DOCER_VERSION="20" UNAME_U="$(uname -s)" @@ -86,16 +86,6 @@ Check_OS() { exit 1 fi } -Generate_Config(){ - if [[ ! -f "${DEPLOY_PATH}/.env" ]]; then - cp "${DEPLOY_PATH}/env.template" "${DEPLOY_PATH}/.env" - fi - python "$SETUP_PATH/gen-config.py" --db_port 5432 --db_user $PG_USER --deploy_path "$DEPLOY_PATH" \ - --image "${ODOO_IMAGE}" --container "${ODOO_CONTAINER}" --tag "${ODOO_TAG:=latest}" \ - --addons "${ODOO_ADDONS}" --config "${ODOO_CONFIG}" --backup community - Show 0 " Generate Config Complete" -} - Install_Depends() { for ((i = 0; i < ${#DEPENDS_COMMAND[@]}; i++)); do cmd=${DEPENDS_COMMAND[i]} @@ -188,9 +178,68 @@ Check_Docker_Install_Final() { exit 1 fi } -Check_OS -# Update_Package_Resource -# Install_Depends -# Check_Dependency_Installation -# Check_Docker_Install -Generate_Config \ No newline at end of file +Generate_Config_Docker(){ + ODOO_IMAGE=${1:-} + ODOO_TAG=${2:-} + ODOO_CONTAINER=${3:-} + if [[ ! -f "${DEPLOY_PATH}/.env" ]]; then + cp "${DEPLOY_PATH}/env.template" "${DEPLOY_PATH}/.env" + fi + USER="${REPO_NAME:-"default_repo"}" + # Convert to lowercase + USER="${USER,,}" + ${PYTHON} "$SETUP_PATH/gen_config_docker.py" --db_port 5432 --db_user $USER --deploy_path "$DEPLOY_PATH" \ + --image "${ODOO_IMAGE}" --container "${ODOO_CONTAINER}" --tag "${ODOO_TAG:=latest}" \ + --addons "${ODOO_ADDONS}" --config "${ODOO_CONFIG}" --backup "${ODOO_BACKUP}" + Show 0 " Generate Config Complete" +} +Generate_Config_Native(){ + # Load environment variables from .env file + Show 2 "Environment variables loaded:" + printenv | sort + ADDONS=${1:-} + REPO_NAME=$(basename "$(git rev-parse --show-toplevel)" | sed -E 's/[.-]/_/g') + USER="${REPO_NAME:-"default_repo"}" + # Convert to lowercase + USER="${USER,,}" + PASSWORD="$(openssl rand -hex 24)" + # Check if the user already exists + USER_EXISTS=$(psql "postgresql://${DB_USER}:${DB_PASSWORD}@${DB_SERVER}:${DB_PORT}/postgres" -t -A -c "SELECT COUNT(*) FROM pg_roles WHERE rolname='$USER';") + + if [ $USER_EXISTS -eq 0 ]; then + # User does not exist, create the user + Show 2 "Create the new PostgreSQL username: $USER with password: $PASSWORD" + psql "postgresql://${DB_USER}:${DB_PASSWORD}@${DB_SERVER}:${DB_PORT}/postgres" -c "CREATE USER $USER WITH PASSWORD '$PASSWORD';" + Show 2 "Grant $USER superuser (admin) privileges" + psql "postgresql://${DB_USER}:${DB_PASSWORD}@${DB_SERVER}:${DB_PORT}/postgres" -c "ALTER USER $USER WITH SUPERUSER;" + else + # User exists, update the password (do not try to create) + Show 2 "User $USER already exists, updating password to $PASSWORD" + psql "postgresql://${DB_USER}:${DB_PASSWORD}@${DB_SERVER}:${DB_PORT}/postgres" -c "ALTER USER $USER WITH PASSWORD '$PASSWORD';" + fi + ${PYTHON} "$SETUP_PATH/gen_config.py" --db_user $USER --db_pass $PASSWORD --deploy_path "$(pwd)" \ + --addons_path $ADDONS --db_port $DB_PORT --db_server $DB_SERVER + Show 0 " Generate Config Complete" +} +main(){ + TYPE=${1:-} + Check_OS + # Update_Package_Resource + # Install_Depends + # Check_Dependency_Installation + # Check_Docker_Install + case "$TYPE" in + --native) + Generate_Config_Native $2 + ;; + --docker) + Generate_Config_Docker $2 $3 $4 + ;; + *) + # else + Show 1 "Invalid argument (--docker|--native)" + ;; + esac +} + +main ${1:-} ${2:-} ${3:-} ${4:-}