Merge remote-tracking branch 'origin/dev' into huyen_dev
This commit is contained in:
commit
c92860a140
116
.gitea/workflows/init_setup_environment.yml
Normal file
116
.gitea/workflows/init_setup_environment.yml
Normal file
@ -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
|
@ -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
|
|
14
.github/workflows/setup_docker.yml
vendored
14
.github/workflows/setup_docker.yml
vendored
@ -1,19 +1,19 @@
|
|||||||
name: Setup Docker Action
|
name: Setup Docker Action
|
||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
branches:
|
branches:
|
||||||
- main
|
- main
|
||||||
# - develop
|
- dev
|
||||||
# pull_request:
|
- feature/*
|
||||||
# branches:
|
|
||||||
# - main
|
|
||||||
jobs:
|
jobs:
|
||||||
setup_docker:
|
setup_docker:
|
||||||
|
if: contains(github.event.head_commit.message, '@docker')
|
||||||
runs-on: self-hosted
|
runs-on: self-hosted
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
python:
|
python:
|
||||||
- 3.12.7
|
- 3.12.7
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Fix Permission
|
- name: Fix Permission
|
||||||
run: |
|
run: |
|
||||||
@ -40,7 +40,7 @@ jobs:
|
|||||||
run: make stop_server_docker
|
run: make stop_server_docker
|
||||||
|
|
||||||
- name: Generate Config
|
- name: Generate Config
|
||||||
run: make gen_config
|
run: make gen_config_docker
|
||||||
|
|
||||||
- name: Build Image
|
- name: Build Image
|
||||||
run: make build_image
|
run: make build_image
|
||||||
@ -51,7 +51,7 @@ jobs:
|
|||||||
run: sleep 30s
|
run: sleep 30s
|
||||||
|
|
||||||
- name: Restore Database
|
- name: Restore Database
|
||||||
run: make restore_database
|
run: make restore_database_docker
|
||||||
|
|
||||||
- name: Run Tests
|
- name: Run Tests
|
||||||
run: make run_test_docker
|
run: make run_test_docker
|
||||||
|
3
.gitignore
vendored
3
.gitignore
vendored
@ -50,4 +50,5 @@ package.json
|
|||||||
/share/
|
/share/
|
||||||
/src/
|
/src/
|
||||||
/deployment/postgresql/*
|
/deployment/postgresql/*
|
||||||
/venv/
|
/venv/
|
||||||
|
/deployment/backup/*.zip
|
||||||
|
@ -2,15 +2,18 @@ FROM odoo:18.0
|
|||||||
# Overwrite odoo with addons
|
# Overwrite odoo with addons
|
||||||
COPY ./odoo /usr/lib/python3/dist-packages/
|
COPY ./odoo /usr/lib/python3/dist-packages/
|
||||||
COPY ./addons /usr/lib/python3/dist-packages/odoo
|
COPY ./addons /usr/lib/python3/dist-packages/odoo
|
||||||
|
COPY ./deployment/entrypoint.sh /
|
||||||
# Copy entrypoint script and Odoo configuration file
|
# Copy entrypoint script and Odoo configuration file
|
||||||
# COPY deployment/entrypoint.sh /
|
# COPY deployment/entrypoint.sh /
|
||||||
# COPY deployment/odoo.conf /etc/odoo/
|
# 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 \
|
RUN chown odoo /etc/odoo/odoo.conf \
|
||||||
&& mkdir -p /mnt/extra-addons \
|
&& mkdir -p /mnt/extra-addons \
|
||||||
&& chown -R odoo /mnt/extra-addons
|
&& chown -R odoo /mnt/extra-addons \
|
||||||
VOLUME ["/var/lib/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 Odoo services
|
||||||
EXPOSE 8069 8071 8072
|
EXPOSE 8069 8071 8072
|
||||||
|
4
Jenkinsfile
vendored
4
Jenkinsfile
vendored
@ -11,12 +11,12 @@ node('Node-Dev-100163') {
|
|||||||
stage('Build') {
|
stage('Build') {
|
||||||
// sh 'make install'
|
// sh 'make install'
|
||||||
sh 'make stop_server_docker'
|
sh 'make stop_server_docker'
|
||||||
sh 'make gen_config'
|
sh 'make gen_config_docker'
|
||||||
sh 'make build_image'
|
sh 'make build_image'
|
||||||
}
|
}
|
||||||
stage('Start'){
|
stage('Start'){
|
||||||
sh 'make run_server_docker'
|
sh 'make run_server_docker'
|
||||||
sh 'make restore_database'
|
sh 'make restore_database_docker'
|
||||||
}
|
}
|
||||||
stage('Testing') {
|
stage('Testing') {
|
||||||
sh 'make run_test_docker'
|
sh 'make run_test_docker'
|
||||||
|
72
Makefile
72
Makefile
@ -2,34 +2,67 @@
|
|||||||
PWD = $(shell pwd)
|
PWD = $(shell pwd)
|
||||||
UID = $(shell id -u)
|
UID = $(shell id -u)
|
||||||
GID = $(shell id -g)
|
GID = $(shell id -g)
|
||||||
PYTHON=python
|
PIP=${PWD}/venv/bin/pip
|
||||||
|
PYTHON=${PWD}/venv/bin/python
|
||||||
DOCKERCMD=docker
|
DOCKERCMD=docker
|
||||||
DOCKER_COMPOSE_CMD=docker-compose
|
DOCKER_COMPOSE_CMD=docker-compose
|
||||||
DOCKER_BUILD=$(DOCKERCMD) build
|
DOCKER_BUILD=$(DOCKERCMD) build
|
||||||
DOCKER_PUSH=$(DOCKERCMD) push
|
DOCKER_PUSH=$(DOCKERCMD) push
|
||||||
DOCKER_IMAGE=$(DOCKERCMD) image
|
DOCKER_IMAGE=$(DOCKERCMD) image
|
||||||
|
DOCKER_EXEC=$(DOCKERCMD) exec
|
||||||
DEPLOY_PATH=${PWD}/deployment
|
DEPLOY_PATH=${PWD}/deployment
|
||||||
SETUP_PATH=${PWD}/setup
|
SETUP_PATH=${PWD}/setup
|
||||||
CONFIG=odoo.conf
|
CONFIG=odoo.conf
|
||||||
ODOO_IMAGE=hub.nextzenos.com/nexterp/odoo
|
HUB=hub.nextzenos.com
|
||||||
TAG := $(shell rev-parse --abbrev-ref HEAD)
|
CDN=https://cdn.nextzenos.com/CDN/NextERP
|
||||||
CONTAINER_ID=odoo-${TAG}
|
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:
|
install:
|
||||||
sudo apt -y update && \
|
sudo apt update -y && \
|
||||||
sudo apt install -y build-essential python3-full python3-pip libldap2-dev libpq-dev libsasl2-dev
|
sudo apt install -y python3-pip libldap2-dev libpq-dev libsasl2-dev postgresql-client && \
|
||||||
run_test_docker:
|
${PIP} install --no-input -r requirements.txt --break-system-packages
|
||||||
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 && \
|
download_backup:
|
||||||
sudo docker exec ${CONTAINER_ID} odoo db --config=/etc/odoo/${CONFIG} drop testdb
|
@if [ -z "${LINKDB}" ]; then \
|
||||||
run_test_local:
|
LinkDB=${BACKUP}; \
|
||||||
odoo-bin -i all_modules --log-level=test --test-enable -d testdb --stop-after-init --config=${CONFIG}
|
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:
|
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:
|
build_image:
|
||||||
DOCKER_BUILDKIT=1 ${DOCKER_BUILD} . --progress plain --tag ${ODOO_IMAGE}:${TAG}
|
DOCKER_BUILDKIT=1 ${DOCKER_BUILD} . --progress plain --tag ${ODOO_IMAGE}:${TAG}
|
||||||
push_image:
|
push_image:
|
||||||
$(DOCKER_PUSH) ${ODOO_IMAGE}:${TAG}
|
$(DOCKER_PUSH) ${ODOO_IMAGE}:${TAG}
|
||||||
run_server_local:
|
|
||||||
${PYTHON} odoo-bin --config=${CONFIG}
|
|
||||||
run_server_docker:
|
run_server_docker:
|
||||||
@if ! docker ps | grep -q "${CONTAINER_ID}"; then \
|
@if ! docker ps | grep -q "${CONTAINER_ID}"; then \
|
||||||
echo "Container not found. Running docker-compose up -d"; \
|
echo "Container not found. Running docker-compose up -d"; \
|
||||||
@ -40,15 +73,8 @@ run_server_docker:
|
|||||||
${DOCKER_COMPOSE_CMD} up -d
|
${DOCKER_COMPOSE_CMD} up -d
|
||||||
update_tag:
|
update_tag:
|
||||||
${SETUP_PATH}/update_tag.sh $(CURR_BRANCH)
|
${SETUP_PATH}/update_tag.sh $(CURR_BRANCH)
|
||||||
restore_database:
|
restore_database_docker:
|
||||||
@echo "Checking for backup.zip in container..."
|
sudo ${DOCKER_EXEC} ${CONTAINER_ID} odoo db -c /etc/odoo/odoo.conf load backup /var/lib/odoo/backup/backup.zip
|
||||||
@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
|
|
||||||
|
|
||||||
stop_server_docker:
|
stop_server_docker:
|
||||||
@if ! docker ps | grep -q "${CONTAINER_ID}"; then \
|
@if ! docker ps | grep -q "${CONTAINER_ID}"; then \
|
||||||
echo "Container not found. Skipping"; \
|
echo "Container not found. Skipping"; \
|
||||||
|
Binary file not shown.
@ -3,7 +3,7 @@ services:
|
|||||||
app:
|
app:
|
||||||
image: ${ODOO_IMAGE:-odoo}:${ODOO_TAG:-18}
|
image: ${ODOO_IMAGE:-odoo}:${ODOO_TAG:-18}
|
||||||
container_name: ${ODOO_CONTAINER:-odoo}
|
container_name: ${ODOO_CONTAINER:-odoo}
|
||||||
user: root
|
# user: root
|
||||||
depends_on:
|
depends_on:
|
||||||
- db
|
- db
|
||||||
ports:
|
ports:
|
||||||
@ -16,14 +16,13 @@ services:
|
|||||||
- USER=${PG_USER:-changeme}
|
- USER=${PG_USER:-changeme}
|
||||||
- PASSWORD=${PG_PASS:-password}
|
- PASSWORD=${PG_PASS:-password}
|
||||||
volumes:
|
volumes:
|
||||||
- ${ENTRYPOINT:-./entrypoint.sh}:/entrypoint.sh # use for install additional package (Optional)
|
|
||||||
- ${ODOO_ADDONS:-./addons}:/mnt/extra-addons
|
- ${ODOO_ADDONS:-./addons}:/mnt/extra-addons
|
||||||
- ${ODOO_CONFIG:-./etc}:/etc/odoo
|
- ${ODOO_CONFIG:-./etc}:/etc/odoo
|
||||||
- ${ODOO_BACKUP:-./backup/ce}:/etc/odoo/backup
|
- ${ODOO_BACKUP:-./backup}:/var/lib/odoo/backup
|
||||||
restart: always
|
restart: always
|
||||||
db:
|
db:
|
||||||
image: postgres:16
|
image: postgres:16
|
||||||
user: root
|
# user: root
|
||||||
environment:
|
environment:
|
||||||
- POSTGRES_USER=${PG_USER:-changeme}
|
- POSTGRES_USER=${PG_USER:-changeme}
|
||||||
- POSTGRES_PASSWORD=${PG_PASS:-password}
|
- POSTGRES_PASSWORD=${PG_PASS:-password}
|
||||||
|
@ -7,10 +7,9 @@ ODOO_CONTAINER=
|
|||||||
# ODOO_CHAT_PORT=
|
# ODOO_CHAT_PORT=
|
||||||
ODOO_ADDONS=./addons
|
ODOO_ADDONS=./addons
|
||||||
ODOO_CONFIG=./etc
|
ODOO_CONFIG=./etc
|
||||||
ODOO_BACKUP=./backup/ce
|
ODOO_BACKUP=./backup
|
||||||
#Database
|
#Database
|
||||||
PG_PORT=
|
PG_PORT=
|
||||||
PG_DB=
|
|
||||||
PG_USER=
|
PG_USER=
|
||||||
PG_PASS=
|
PG_PASS=
|
||||||
ENTRYPOINT=./entrypoint.sh
|
ENTRYPOINT=./entrypoint.sh
|
||||||
|
9
deployment/etc/odoo.conf
Normal file
9
deployment/etc/odoo.conf
Normal file
@ -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
|
||||||
|
|
@ -3,4 +3,7 @@ db_host =
|
|||||||
db_port = 5432
|
db_port = 5432
|
||||||
db_user =
|
db_user =
|
||||||
db_password =
|
db_password =
|
||||||
|
xmlrpc_port =
|
||||||
|
addons_path =
|
||||||
|
dbfilter =
|
||||||
|
proxy_mode =
|
@ -20,7 +20,7 @@ if (( keep_count > 0 )); then
|
|||||||
# Loop through the oldest virtual environments and delete them
|
# Loop through the oldest virtual environments and delete them
|
||||||
for venv in $oldest_venvs; do
|
for venv in $oldest_venvs; do
|
||||||
echo "Deleting virtual environment: $venv"
|
echo "Deleting virtual environment: $venv"
|
||||||
pyenv virtualenv-delete "$venv" -f
|
pyenv virtualenv-delete -f "$venv"
|
||||||
done
|
done
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
82
setup/download_backup.sh
Executable file
82
setup/download_backup.sh
Executable file
@ -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 "$@"
|
67
setup/gen_config.py
Normal file
67
setup/gen_config.py
Normal file
@ -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()
|
@ -19,7 +19,7 @@ def find_available_port(start_port=80):
|
|||||||
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
|
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
|
||||||
while True:
|
while True:
|
||||||
try:
|
try:
|
||||||
sock.bind(('localhost', start_port))
|
sock.bind(('0.0.0.0', start_port))
|
||||||
color_log.Show(3,f" {start_port} is Open")
|
color_log.Show(3,f" {start_port} is Open")
|
||||||
return start_port
|
return start_port
|
||||||
except OSError as e:
|
except OSError as e:
|
||||||
@ -78,7 +78,7 @@ def main():
|
|||||||
# Update .env file
|
# Update .env file
|
||||||
env_file_path = Path("deployment/.env")
|
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="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_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="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")
|
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_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_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")
|
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=backup,quote_mode="never")
|
||||||
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")
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
main()
|
main()
|
@ -5,15 +5,15 @@ export DEBIAN_FRONTEND=noninteractive
|
|||||||
set -euo pipefail
|
set -euo pipefail
|
||||||
DEPLOY_PATH=$(pwd)/deployment
|
DEPLOY_PATH=$(pwd)/deployment
|
||||||
SETUP_PATH=$(pwd)/setup
|
SETUP_PATH=$(pwd)/setup
|
||||||
ODOO_IMAGE=$1
|
|
||||||
ODOO_TAG=$2
|
PIP=$(pwd)/venv/bin/pip
|
||||||
ODOO_CONTAINER=$3
|
PYTHON=$(pwd)/venv/bin/python
|
||||||
PG_USER=nexterp
|
ODOO_ADDONS=${DEPLOY_PATH}/addons
|
||||||
ODOO_ADDONS=./addons
|
ODOO_CONFIG=${DEPLOY_PATH}/etc
|
||||||
ODOO_CONFIG=./etc
|
ODOO_BACKUP=${DEPLOY_PATH}/backup
|
||||||
# System
|
# System
|
||||||
DEPENDS_PACKAGE=('wget' 'curl' 'git' 'unzip' 'make' 'wkhtmltopdf')
|
DEPENDS_PACKAGE=('wget' 'curl' 'git' 'unzip' 'make' 'wkhtmltopdf' 'postgresql-client')
|
||||||
DEPENDS_COMMAND=('wget' 'curl' 'git' 'unzip' 'make' 'wkhtmltopdf')
|
DEPENDS_COMMAND=('wget' 'curl' 'git' 'unzip' 'make' 'wkhtmltopdf' 'psql')
|
||||||
((EUID)) && sudo_cmd="sudo" || sudo_cmd=""
|
((EUID)) && sudo_cmd="sudo" || sudo_cmd=""
|
||||||
readonly MINIMUM_DOCER_VERSION="20"
|
readonly MINIMUM_DOCER_VERSION="20"
|
||||||
UNAME_U="$(uname -s)"
|
UNAME_U="$(uname -s)"
|
||||||
@ -86,16 +86,6 @@ Check_OS() {
|
|||||||
exit 1
|
exit 1
|
||||||
fi
|
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() {
|
Install_Depends() {
|
||||||
for ((i = 0; i < ${#DEPENDS_COMMAND[@]}; i++)); do
|
for ((i = 0; i < ${#DEPENDS_COMMAND[@]}; i++)); do
|
||||||
cmd=${DEPENDS_COMMAND[i]}
|
cmd=${DEPENDS_COMMAND[i]}
|
||||||
@ -188,9 +178,68 @@ Check_Docker_Install_Final() {
|
|||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
Check_OS
|
Generate_Config_Docker(){
|
||||||
# Update_Package_Resource
|
ODOO_IMAGE=${1:-}
|
||||||
# Install_Depends
|
ODOO_TAG=${2:-}
|
||||||
# Check_Dependency_Installation
|
ODOO_CONTAINER=${3:-}
|
||||||
# Check_Docker_Install
|
if [[ ! -f "${DEPLOY_PATH}/.env" ]]; then
|
||||||
Generate_Config
|
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:-}
|
||||||
|
Loading…
Reference in New Issue
Block a user