Ziel:
Du entwickelst Odoo-Community-Module lokal unter Windows mit WSL. Die eigentliche Odoo-Installation, PostgreSQL, Python-Umgebung und die Modulquellen liegen in Linux/WSL unter dem Benutzer alex. Die Programmierung erfolgt mit Visual Studio Code über die WSL-Erweiterung. Die Module werden in GitHub gepflegt. Jedes einzelne Modul kann ein eigenes Repository sein. Wenn ein Repository mehrere Odoo-Untermodule enthält, wird das in der Addons-Struktur automatisch berücksichtigt.
Die lokale Odoo-Instanz läuft ausschließlich über:
http://localhost:8069
Die WSL-Struktur wird so aufgebaut:
/home/alex/odoo-dev/
├── odoo/ # Odoo Community Quellcode
├── venv/ # Python Virtual Environment
├── custom-addons/ # Eigene GitHub-Repositories
│ ├── ahd_einzelmodul/ # Einzelnes Odoo-Modul als eigenes Repo
│ │ ├── __manifest__.py
│ │ ├── models/
│ │ ├── views/
│ │ └── security/
│ │
│ └── odoo_weinbau/ # Repository mit mehreren Odoo-Untermodulen
│ ├── weinbau_base/
│ │ └── __manifest__.py
│ ├── weinbau_sale/
│ │ └── __manifest__.py
│ └── weinbau_stock/
│ └── __manifest__.py
│
├── config/
│ ├── odoo-dev.conf # Entwicklungsmodus
│ └── odoo-prodtest.conf # produktionsnaher Testmodus
│
├── scripts/
│ ├── generate-addons-path.py # erkennt Einzelmodule und Multi-Modul-Repos
│ ├── start-odoo.sh # startet Odoo aus WSL
│ └── repo-manager.sh # Repos laden, aktualisieren, hinzufügen, entfernen
│
├── logs/
│ ├── odoo-dev.log
│ └── odoo-prodtest.log
│
└── repos.txt # Liste deiner GitHub-Repositories
Die Windows-Startdateien liegen später z. B. hier:
C:\OdooDev\
├── start_odoo.bat
├── repo_manager.bat
└── open_vscode_odoo.bat
Diese Anleitung trennt bewusst zwischen drei Bereichen:
Odoo-Quellcode
Dieser liegt unter /home/alex/odoo-dev/odoo.
Eigene Module
Diese liegen unter /home/alex/odoo-dev/custom-addons.
Start- und Verwaltungslogik
Diese liegt unter /home/alex/odoo-dev/scripts.
Dadurch bleibt Odoo selbst sauber aktualisierbar, während deine eigenen Module unabhängig über GitHub gepflegt werden.
Öffne PowerShell als Administrator und führe aus:
wsl --install -d Ubuntu
Prüfe anschließend:
wsl -l -v
Die Ausgabe sollte ungefähr so aussehen:
NAME STATE VERSION
Ubuntu Running 2
Falls Ubuntu noch nicht auf WSL 2 läuft:
wsl --set-default-version 2
wsl --set-version Ubuntu 2
Beim ersten Start von Ubuntu legst du den Linux-Benutzer an:
alex
Installiere Visual Studio Code unter Windows.
Wichtig: Während der Installation sollte die Option aktiviert sein:
Add to PATH
Installiere anschließend in VS Code die Erweiterung:
WSL
Später öffnest du dein Odoo-Projekt direkt aus WSL mit:
cd /home/alex/odoo-dev
code .
Alternativ kann das später auch per .bat erfolgen.
Öffne Ubuntu/WSL und führe aus:
sudo apt update
sudo apt upgrade -y
Installiere anschließend die benötigten Pakete:
sudo apt install -y \
git curl wget ca-certificates gnupg lsb-release nano unzip zip \
build-essential \
python3 python3-dev python3-venv python3-pip python3-wheel python3-setuptools \
libfreetype6-dev libxml2-dev libzip-dev libldap2-dev libsasl2-dev \
libjpeg-dev zlib1g-dev libpq-dev libxslt1-dev libffi-dev libssl-dev \
postgresql postgresql-client postgresql-contrib \
nodejs npm \
wkhtmltopdf
Installiere außerdem rtlcss, das Odoo für Rechts-nach-links-Sprachen benötigen kann:
sudo npm install -g rtlcss
Prüfe die Versionen:
python3 --version
psql --version
wkhtmltopdf --version
git --version
Odoo soll lokal mit PostgreSQL laufen. Da der Linux-Benutzer alex heißt, wird auch ein PostgreSQL-Benutzer alex angelegt.
sudo -u postgres createuser -d -R -S alex
Bedeutung:
-d darf Datenbanken erstellen
-R darf keine Rollen erstellen
-S ist kein Superuser
Erstelle die erste Entwicklungsdatenbank:
createdb odoo_dev
Prüfe die Verbindung:
psql -d odoo_dev -c "SELECT current_user, current_database();"
Die Ausgabe sollte zeigen:
current_user | current_database
-------------+-----------------
alex | odoo_dev
Lege die Projektstruktur an:
mkdir -p /home/alex/odoo-dev
cd /home/alex/odoo-dev
Klonen von Odoo Community:
git clone --depth 1 --branch 19.0 https://github.com/odoo/odoo.git odoo
Falls du eine andere Odoo-Version einsetzen möchtest, ersetze 19.0 durch den passenden Branch, z. B.:
18.0
17.0
cd /home/alex/odoo-dev
python3 -m venv venv
Aktivieren:
source /home/alex/odoo-dev/venv/bin/activate
Pip aktualisieren:
pip install --upgrade pip wheel setuptools
Odoo-Abhängigkeiten installieren:
pip install -r /home/alex/odoo-dev/odoo/requirements.txt
Zusätzliche Pakete für Entwicklung und Debugging:
pip install watchdog ipdb debugpy
Wenn später ein Python-Modul fehlt, installierst du es immer innerhalb dieser Umgebung:
source /home/alex/odoo-dev/venv/bin/activate
pip install PAKETNAME
mkdir -p /home/alex/odoo-dev/custom-addons
mkdir -p /home/alex/odoo-dev/config
mkdir -p /home/alex/odoo-dev/scripts
mkdir -p /home/alex/odoo-dev/logs
touch /home/alex/odoo-dev/repos.txt
Datei öffnen:
nano /home/alex/odoo-dev/config/odoo-dev.conf
Inhalt einfügen:
[options]
; Lokale Entwicklungsinstanz
; Aufruf über: http://localhost:8069
admin_passwd = HIER_EIN_STARKES_MASTERPASSWORT_SETZEN
; addons_path wird beim Start zusätzlich dynamisch per Script übergeben.
addons_path = /home/alex/odoo-dev/odoo/addons,/home/alex/odoo-dev/custom-addons
data_dir = /home/alex/odoo-dev/.local/share/Odoo
logfile = /home/alex/odoo-dev/logs/odoo-dev.log
http_interface = 127.0.0.1
http_port = 8069
gevent_port = 8072
; Lokale Entwicklung ohne Reverse Proxy
proxy_mode = False
; Nur Entwicklungsdatenbanken anzeigen
dbfilter = ^odoo_dev.*$
list_db = True
; Entwicklungsmodus: keine Worker, damit Änderungen einfacher getestet werden können
workers = 0
max_cron_threads = 1
; Lange Tests, Installationen und Updates nicht zu früh abbrechen
limit_time_cpu = 600
limit_time_real = 1200
limit_request = 8192
; Für Entwicklung erlaubt.
; Für echte produktive Systeme sollte Demo-Daten-Nutzung bewusst entschieden werden.
without_demo = False
Speichern mit:
STRG + O
ENTER
STRG + X
Dieser Modus ist sinnvoll, wenn ein Modul fertig entwickelt ist und du prüfen möchtest, wie es sich mit Workern, Cron-Jobs und produktionsnäherem Verhalten verhält.
Datei öffnen:
nano /home/alex/odoo-dev/config/odoo-prodtest.conf
Inhalt einfügen:
[options]
; Lokaler produktionsnaher Testmodus
; Aufruf über: http://localhost:8069
admin_passwd = HIER_EIN_STARKES_MASTERPASSWORT_SETZEN
addons_path = /home/alex/odoo-dev/odoo/addons,/home/alex/odoo-dev/custom-addons
data_dir = /home/alex/odoo-dev/.local/share/Odoo
logfile = /home/alex/odoo-dev/logs/odoo-prodtest.log
http_interface = 127.0.0.1
http_port = 8069
gevent_port = 8072
proxy_mode = False
dbfilter = ^odoo_dev.*$
list_db = True
; Produktionsnaher Modus
workers = 2
max_cron_threads = 1
limit_memory_soft = 629145600
limit_memory_hard = 1677721600
limit_time_cpu = 600
limit_time_real = 1200
limit_request = 8192
without_demo = False
Wichtig:
workers = 0) sind Codeänderungen einfacher zu testen.workers = 2) solltest du Odoo nach Codeänderungen neu starten.127.0.0.1 läuft, wird kein Reverse Proxy benötigt.addons_pathOdoo erkennt Module nur, wenn der passende Addons-Pfad gesetzt ist.
Dabei gibt es zwei Fälle:
custom-addons/
└── ahd_einzelmodul/
├── __manifest__.py
├── models/
└── views/
Dann reicht dieser Addons-Pfad:
/home/alex/odoo-dev/custom-addons
custom-addons/
└── odoo_weinbau/
├── weinbau_base/
│ └── __manifest__.py
├── weinbau_sale/
│ └── __manifest__.py
└── weinbau_stock/
└── __manifest__.py
Dann muss zusätzlich dieser Pfad in addons_path enthalten sein:
/home/alex/odoo-dev/custom-addons/odoo_weinbau
Damit du das nicht manuell pflegen musst, wird ein Script erstellt.
Datei öffnen:
nano /home/alex/odoo-dev/scripts/generate-addons-path.py
Inhalt einfügen:
#!/usr/bin/env python3
from pathlib import Path
BASE = Path("/home/alex/odoo-dev")
ODOO_ADDONS = BASE / "odoo" / "addons"
CUSTOM_ADDONS = BASE / "custom-addons"
paths = []
def add_path(path: Path):
path = path.resolve()
if path.exists() and path not in paths:
paths.append(path)
# Standard-Odoo-Addons
add_path(ODOO_ADDONS)
# Parent-Pfad für Einzelmodul-Repositories
add_path(CUSTOM_ADDONS)
# Zusätzliche Pfade für Repositories mit mehreren Untermodulen
if CUSTOM_ADDONS.exists():
for repo_dir in sorted(CUSTOM_ADDONS.iterdir()):
if not repo_dir.is_dir():
continue
if repo_dir.name.startswith("."):
continue
has_child_modules = any(
child.is_dir() and (child / "__manifest__.py").exists()
for child in repo_dir.iterdir()
)
if has_child_modules:
add_path(repo_dir)
print(",".join(str(path) for path in paths))
Ausführbar machen:
chmod +x /home/alex/odoo-dev/scripts/generate-addons-path.py
Test:
/home/alex/odoo-dev/scripts/generate-addons-path.py
Beispielausgabe:
/home/alex/odoo-dev/odoo/addons,/home/alex/odoo-dev/custom-addons,/home/alex/odoo-dev/custom-addons/odoo_weinbau
Datei öffnen:
nano /home/alex/odoo-dev/scripts/start-odoo.sh
Inhalt einfügen:
#!/usr/bin/env bash
set -e
BASE="/home/alex/odoo-dev"
ODOO_DIR="$BASE/odoo"
VENV="$BASE/venv"
CONFIG_DEV="$BASE/config/odoo-dev.conf"
CONFIG_PRODTEST="$BASE/config/odoo-prodtest.conf"
ADDONS_SCRIPT="$BASE/scripts/generate-addons-path.py"
MODE="${1:-dev}"
if [ "$MODE" = "prodtest" ]; then
CONFIG="$CONFIG_PRODTEST"
echo "Starte Odoo im produktionsnahen Testmodus..."
else
CONFIG="$CONFIG_DEV"
echo "Starte Odoo im Entwicklungsmodus..."
fi
if [ ! -d "$ODOO_DIR" ]; then
echo "FEHLER: Odoo-Verzeichnis nicht gefunden: $ODOO_DIR"
exit 1
fi
if [ ! -f "$CONFIG" ]; then
echo "FEHLER: Konfigurationsdatei nicht gefunden: $CONFIG"
exit 1
fi
if [ ! -d "$VENV" ]; then
echo "FEHLER: Python venv nicht gefunden: $VENV"
exit 1
fi
ADDONS_PATH="$(python3 "$ADDONS_SCRIPT")"
echo
echo "Verwendeter addons_path:"
echo "$ADDONS_PATH"
echo
source "$VENV/bin/activate"
cd "$ODOO_DIR"
if [ "$MODE" = "prodtest" ]; then
exec python3 odoo-bin \
-c "$CONFIG" \
--addons-path="$ADDONS_PATH"
else
exec python3 odoo-bin \
-c "$CONFIG" \
--addons-path="$ADDONS_PATH" \
--dev=xml,qweb,assets
fi
Ausführbar machen:
chmod +x /home/alex/odoo-dev/scripts/start-odoo.sh
Test aus WSL:
/home/alex/odoo-dev/scripts/start-odoo.sh dev
Produktionsnaher Test:
/home/alex/odoo-dev/scripts/start-odoo.sh prodtest
Der Repository-Manager kann:
.removed-Ordner verschiebenDatei öffnen:
nano /home/alex/odoo-dev/scripts/repo-manager.sh
Inhalt einfügen:
#!/usr/bin/env bash
set -e
BASE="/home/alex/odoo-dev"
CUSTOM_ADDONS="$BASE/custom-addons"
REPO_FILE="$BASE/repos.txt"
REMOVED_DIR="$CUSTOM_ADDONS/.removed"
mkdir -p "$CUSTOM_ADDONS"
touch "$REPO_FILE"
derive_folder_name() {
local url="$1"
local name
name="$(basename "$url")"
name="${name%.git}"
echo "$name"
}
sync_one_repo() {
local url="$1"
local branch="$2"
local folder="$3"
if [ -z "$url" ]; then
return
fi
if [[ "$url" =~ ^# ]]; then
return
fi
if [ -z "$folder" ]; then
folder="$(derive_folder_name "$url")"
fi
local target="$CUSTOM_ADDONS/$folder"
echo
echo "Repository: $url"
echo "Zielordner: $target"
if [ ! -d "$target/.git" ]; then
echo "Klonen..."
if [ -n "$branch" ]; then
git clone --branch "$branch" "$url" "$target"
else
git clone "$url" "$target"
fi
else
echo "Aktualisieren..."
cd "$target"
git fetch --all --prune
if [ -n "$branch" ]; then
git checkout "$branch"
fi
git pull --ff-only
fi
if [ -f "$target/.gitmodules" ]; then
echo "Git-Submodules aktualisieren..."
cd "$target"
git submodule update --init --recursive
fi
}
sync_all() {
echo
echo "Alle Repositories aus $REPO_FILE werden synchronisiert..."
echo
while IFS='|' read -r url branch folder; do
# Leere Zeilen überspringen
if [ -z "$url" ]; then
continue
fi
# Kommentare überspringen
if [[ "$url" =~ ^# ]]; then
continue
fi
sync_one_repo "$url" "$branch" "$folder"
done < "$REPO_FILE"
echo
echo "Fertig. Aktueller addons_path:"
python3 "$BASE/scripts/generate-addons-path.py"
echo
}
add_repo() {
echo
read -rp "GitHub-URL oder SSH-URL des Repositories: " url
if [ -z "$url" ]; then
echo "Keine URL angegeben."
return
fi
read -rp "Branch, z. B. main oder 19.0, leer = Standardbranch: " branch
default_folder="$(derive_folder_name "$url")"
read -rp "Lokaler Ordnername unter custom-addons [$default_folder]: " folder
folder="${folder:-$default_folder}"
echo "${url}|${branch}|${folder}" >> "$REPO_FILE"
echo
echo "Repository wurde in repos.txt eingetragen."
echo "Jetzt wird es direkt synchronisiert..."
sync_one_repo "$url" "$branch" "$folder"
}
remove_repo() {
echo
echo "Aktuelle Einträge:"
nl -w2 -s") " "$REPO_FILE"
echo
read -rp "Nummer des zu entfernenden Eintrags: " number
if ! [[ "$number" =~ ^[0-9]+$ ]]; then
echo "Ungültige Nummer."
return
fi
line="$(sed -n "${number}p" "$REPO_FILE")"
if [ -z "$line" ]; then
echo "Eintrag nicht gefunden."
return
fi
IFS='|' read -r url branch folder <<< "$line"
if [ -z "$folder" ]; then
folder="$(derive_folder_name "$url")"
fi
target="$CUSTOM_ADDONS/$folder"
tmp_file="$(mktemp)"
sed "${number}d" "$REPO_FILE" > "$tmp_file"
mv "$tmp_file" "$REPO_FILE"
echo
echo "Eintrag wurde aus repos.txt entfernt."
if [ -d "$target" ]; then
read -rp "Lokalen Ordner nach .removed verschieben? [j/N]: " answer
if [[ "$answer" =~ ^[JjYy]$ ]]; then
mkdir -p "$REMOVED_DIR"
timestamp="$(date +%Y%m%d-%H%M%S)"
mv "$target" "$REMOVED_DIR/${folder}-${timestamp}"
echo "Ordner wurde verschoben nach: $REMOVED_DIR/${folder}-${timestamp}"
else
echo "Lokaler Ordner bleibt erhalten: $target"
fi
fi
}
show_addons_path() {
echo
python3 "$BASE/scripts/generate-addons-path.py"
echo
}
show_menu() {
clear
echo "Odoo Repository Manager"
echo "======================="
echo
echo "1) Alle Repositories neu laden / aktualisieren"
echo "2) Neues Repository hinzufügen"
echo "3) Repository aus Liste entfernen"
echo "4) Aktuellen addons_path anzeigen"
echo "5) repos.txt anzeigen"
echo "0) Beenden"
echo
}
while true; do
show_menu
read -rp "Auswahl: " choice
case "$choice" in
1) sync_all ;;
2) add_repo ;;
3) remove_repo ;;
4) show_addons_path ;;
5) echo; cat "$REPO_FILE"; echo ;;
0) exit 0 ;;
*) echo "Ungültige Auswahl." ;;
esac
echo
read -rp "Weiter mit ENTER..."
done
Ausführbar machen:
chmod +x /home/alex/odoo-dev/scripts/repo-manager.sh
Test:
/home/alex/odoo-dev/scripts/repo-manager.sh
repos.txtDie Datei liegt hier:
/home/alex/odoo-dev/repos.txt
Format je Zeile:
REPOSITORY_URL|BRANCH|LOKALER_ORDNERNAME
Beispiel mit HTTPS:
https://github.com/DEIN-GITHUB-NAME/ahd_einzelmodul.git|main|ahd_einzelmodul
https://github.com/DEIN-GITHUB-NAME/odoo_weinbau.git|main|odoo_weinbau
Beispiel mit SSH:
git@github.com:DEIN-GITHUB-NAME/ahd_einzelmodul.git|main|ahd_einzelmodul
git@github.com:DEIN-GITHUB-NAME/odoo_weinbau.git|main|odoo_weinbau
Der Repository-Manager kann die Datei über das Menü automatisch ergänzen.
Empfohlen ist SSH, damit du nicht ständig Benutzername oder Token eingeben musst.
SSH-Key erzeugen:
ssh-keygen -t ed25519 -C "alexander.hahn112@googlemail.com"
Bei den Abfragen kannst du ENTER drücken.
Public Key anzeigen:
cat ~/.ssh/id_ed25519.pub
Diesen Key in GitHub hinterlegen:
GitHub → Settings → SSH and GPG keys → New SSH key
Verbindung testen:
ssh -T git@github.com
Die Ausgabe sollte sinngemäß sagen, dass du erfolgreich authentifiziert bist.
Beispiel: Du möchtest ein Modul ahd_kundenportal erstellen.
cd /home/alex/odoo-dev/custom-addons
source /home/alex/odoo-dev/venv/bin/activate
python3 /home/alex/odoo-dev/odoo/odoo-bin scaffold ahd_kundenportal .
Danach liegt das Modul hier:
/home/alex/odoo-dev/custom-addons/ahd_kundenportal/
├── __manifest__.py
├── controllers/
├── demo/
├── models/
├── security/
└── views/
Git initialisieren:
cd /home/alex/odoo-dev/custom-addons/ahd_kundenportal
git init
git add .
git commit -m "Initiales Odoo-Modul ahd_kundenportal"
GitHub-Repository verbinden:
git remote add origin git@github.com:DEIN-GITHUB-NAME/ahd_kundenportal.git
git branch -M main
git push -u origin main
Eintrag in repos.txt:
git@github.com:DEIN-GITHUB-NAME/ahd_kundenportal.git|main|ahd_kundenportal
Beispiel: Ein Repository odoo_weinbau enthält mehrere Odoo-Module.
cd /home/alex/odoo-dev/custom-addons
mkdir odoo_weinbau
cd odoo_weinbau
source /home/alex/odoo-dev/venv/bin/activate
Untermodule erzeugen:
python3 /home/alex/odoo-dev/odoo/odoo-bin scaffold weinbau_base .
python3 /home/alex/odoo-dev/odoo/odoo-bin scaffold weinbau_sale .
python3 /home/alex/odoo-dev/odoo/odoo-bin scaffold weinbau_stock .
Ergebnis:
/home/alex/odoo-dev/custom-addons/odoo_weinbau/
├── weinbau_base/
│ └── __manifest__.py
├── weinbau_sale/
│ └── __manifest__.py
└── weinbau_stock/
└── __manifest__.py
Git initialisieren:
git init
git add .
git commit -m "Initiale Weinbau-Module"
git remote add origin git@github.com:DEIN-GITHUB-NAME/odoo_weinbau.git
git branch -M main
git push -u origin main
Eintrag in repos.txt:
git@github.com:DEIN-GITHUB-NAME/odoo_weinbau.git|main|odoo_weinbau
Warum funktioniert das?
Das Script generate-addons-path.py erkennt automatisch, dass im Repository odoo_weinbau mehrere Unterordner mit __manifest__.py liegen. Deshalb wird zusätzlich folgender Pfad in den addons_path aufgenommen:
/home/alex/odoo-dev/custom-addons/odoo_weinbau
Ein typisches Modul sollte so aufgebaut sein:
mein_modul/
├── __init__.py
├── __manifest__.py
├── models/
│ ├── __init__.py
│ └── mein_model.py
├── security/
│ └── ir.model.access.csv
├── views/
│ └── mein_model_views.xml
├── data/
│ └── sequence.xml
├── report/
│ └── mein_report.xml
├── static/
│ └── description/
│ └── icon.png
└── README.md
Wichtig:
__manifest__.py.__init__.py.security/ir.model.access.csv.views/.data/.demo/.README.md.Falls du die Datenbank odoo_dev noch nicht über die Weboberfläche erstellt hast, kannst du sie per CLI initialisieren.
source /home/alex/odoo-dev/venv/bin/activate
cd /home/alex/odoo-dev/odoo
python3 odoo-bin \
-c /home/alex/odoo-dev/config/odoo-dev.conf \
--addons-path="$(python3 /home/alex/odoo-dev/scripts/generate-addons-path.py)" \
-d odoo_dev \
-i base \
--stop-after-init
Danach kannst du Odoo starten.
Entwicklungsmodus:
/home/alex/odoo-dev/scripts/start-odoo.sh dev
Produktionsnaher Testmodus:
/home/alex/odoo-dev/scripts/start-odoo.sh prodtest
Anschließend im Windows-Browser öffnen:
http://localhost:8069
Lege unter Windows den Ordner an:
C:\OdooDev
Erstelle die Datei:
C:\OdooDev\start_odoo.bat
Inhalt:
@echo off
title Odoo Community WSL Starter
echo ============================================
echo Odoo Community lokal ueber WSL starten
echo ============================================
echo.
echo 1) Entwicklungsmodus
echo 2) Produktionsnaher Testmodus
echo.
set /p MODE=Bitte Modus waehlen [1/2]:
if "%MODE%"=="2" (
set RUNMODE=prodtest
) else (
set RUNMODE=dev
)
echo.
echo Starte Odoo in WSL als Benutzer alex...
echo Zum Beenden dieses Fensters Odoo mit STRG+C stoppen.
echo.
wsl -d Ubuntu -u alex -- bash -lc "/home/alex/odoo-dev/scripts/start-odoo.sh %RUNMODE%"
echo.
pause
Jetzt kannst du Odoo per Doppelklick starten.
Erstelle die Datei:
C:\OdooDev\repo_manager.bat
Inhalt:
@echo off
title Odoo Repository Manager
echo ============================================
echo Odoo GitHub Repository Manager
echo ============================================
echo.
echo Dieses Tool laeuft in WSL als Benutzer alex.
echo.
wsl -d Ubuntu -u alex -- bash -lc "/home/alex/odoo-dev/scripts/repo-manager.sh"
echo.
pause
Damit kannst du per Doppelklick:
addons_path prüfenErstelle die Datei:
C:\OdooDev\open_vscode_odoo.bat
Inhalt:
@echo off
title VS Code Odoo WSL
echo Odoo-Projekt in Visual Studio Code ueber WSL oeffnen...
echo.
code --remote wsl+Ubuntu /home/alex/odoo-dev
echo.
Wenn code nicht gefunden wird:
STRG + SHIFT + PShell Command: Install 'code' command in PATH
Danach die .bat erneut ausführen.
Öffne das Projekt über:
C:\OdooDev\open_vscode_odoo.bat
Oder direkt aus WSL:
cd /home/alex/odoo-dev
code .
Unten links in VS Code sollte stehen:
WSL: Ubuntu
Wenn dort nicht WSL steht, arbeitest du wahrscheinlich im Windows-Dateisystem. Für Odoo-Entwicklung solltest du im WSL-Dateisystem bleiben, also unter:
/home/alex/odoo-dev
Nicht empfohlen für Odoo-Quellcode:
/mnt/c/...
Grund: Dateizugriffe und Rechte sind unter /home/alex/... in der Regel deutlich sauberer und schneller.
Installiere diese Erweiterungen in der WSL-Umgebung von VS Code:
Python
Pylance
XML
GitLens
Odoo Snippets
Odoo
EditorConfig
Wichtig: Wenn VS Code in WSL geöffnet ist, fragt VS Code oft, ob die Erweiterung in WSL installiert werden soll. Das solltest du bestätigen.
Erstelle:
nano /home/alex/odoo-dev/odoo-dev.code-workspace
Inhalt:
{
"folders": [
{
"name": "Odoo Community",
"path": "/home/alex/odoo-dev/odoo"
},
{
"name": "Custom Addons",
"path": "/home/alex/odoo-dev/custom-addons"
},
{
"name": "Scripts",
"path": "/home/alex/odoo-dev/scripts"
},
{
"name": "Config",
"path": "/home/alex/odoo-dev/config"
}
],
"settings": {
"python.defaultInterpreterPath": "/home/alex/odoo-dev/venv/bin/python",
"python.analysis.extraPaths": [
"/home/alex/odoo-dev/odoo"
],
"files.exclude": {
"**/__pycache__": true,
"**/*.pyc": true
},
"editor.formatOnSave": false
}
}
Öffnen:
code /home/alex/odoo-dev/odoo-dev.code-workspace
Nachdem du ein neues Modul erstellt oder geklont hast:
http://localhost:8069
Wenn ein Modul nicht sichtbar ist:
/home/alex/odoo-dev/scripts/generate-addons-path.py
Prüfe, ob der Pfad deines Moduls enthalten ist.
Danach Odoo neu starten.
Wenn du Python-Code, XML-Views, Security-Dateien oder Daten geändert hast, solltest du das Modul aktualisieren.
Beispiel:
source /home/alex/odoo-dev/venv/bin/activate
cd /home/alex/odoo-dev/odoo
python3 odoo-bin \
-c /home/alex/odoo-dev/config/odoo-dev.conf \
--addons-path="$(python3 /home/alex/odoo-dev/scripts/generate-addons-path.py)" \
-d odoo_dev \
-u DEIN_MODULNAME \
--stop-after-init
Beispiel für mehrere Module:
python3 odoo-bin \
-c /home/alex/odoo-dev/config/odoo-dev.conf \
--addons-path="$(python3 /home/alex/odoo-dev/scripts/generate-addons-path.py)" \
-d odoo_dev \
-u weinbau_base,weinbau_sale,weinbau_stock \
--stop-after-init
Alle installierten Module aktualisieren:
python3 odoo-bin \
-c /home/alex/odoo-dev/config/odoo-dev.conf \
--addons-path="$(python3 /home/alex/odoo-dev/scripts/generate-addons-path.py)" \
-d odoo_dev \
-u all \
--stop-after-init
Per Doppelklick:
C:\OdooDev\repo_manager.bat
Dann Option 1 wählen:
Alle Repositories neu laden / aktualisieren
C:\OdooDev\open_vscode_odoo.bat
C:\OdooDev\start_odoo.bat
Zuerst Entwicklungsmodus wählen.
Dateien bearbeiten unter:
/home/alex/odoo-dev/custom-addons/
Bei XML, Security, Daten oder Manifest-Änderungen:
cd /home/alex/odoo-dev/odoo
source /home/alex/odoo-dev/venv/bin/activate
python3 odoo-bin \
-c /home/alex/odoo-dev/config/odoo-dev.conf \
--addons-path="$(python3 /home/alex/odoo-dev/scripts/generate-addons-path.py)" \
-d odoo_dev \
-u DEIN_MODULNAME \
--stop-after-init
cd /home/alex/odoo-dev/custom-addons/DEIN_MODUL
git status
git add .
git commit -m "Beschreibung der Änderung"
git push
Empfohlen:
main stabile Version
develop laufende Entwicklung
feature/* einzelne neue Funktionen
bugfix/* Fehlerkorrekturen
release/* Vorbereitung einer Version
Beispiel:
git checkout -b feature/neue-funktion
Nach Fertigstellung:
git add .
git commit -m "Neue Funktion ergänzt"
git push -u origin feature/neue-funktion
Danach in GitHub einen Pull Request nach develop oder main erstellen.
In der __manifest__.py sollte die Version gepflegt werden.
Beispiel:
{
"name": "AHD Kundenportal",
"version": "19.0.1.0.0",
"summary": "Kundenportal-Erweiterung für Odoo",
"author": "IT-Service AHD",
"website": "https://it-service-ahd.de",
"category": "Custom",
"depends": ["base"],
"data": [
"security/ir.model.access.csv",
"views/kundenportal_views.xml",
],
"installable": True,
"application": False,
"license": "LGPL-3",
}
Empfohlene Versionierung:
19.0.1.0.0
│ │ │ │
│ │ │ └─ kleine Korrektur
│ │ └─── funktionale Erweiterung
│ └───── Modulversion
└────────── Odoo-Version
Wenn ein Modul grundsätzlich funktioniert, teste es im produktionsnahen Modus:
C:\OdooDev\start_odoo.bat
Dann Option 2 wählen:
Produktionsnaher Testmodus
Prüfe insbesondere:
Logs anzeigen:
tail -f /home/alex/odoo-dev/logs/odoo-prodtest.log
Vor größeren Änderungen:
mkdir -p /home/alex/odoo-dev/backups
pg_dump -Fc odoo_dev > /home/alex/odoo-dev/backups/odoo_dev_$(date +%Y%m%d-%H%M%S).dump
Wiederherstellen in eine neue Datenbank:
createdb odoo_dev_restore
pg_restore -d odoo_dev_restore /home/alex/odoo-dev/backups/DATEINAME.dump
Prüfen:
/home/alex/odoo-dev/scripts/generate-addons-path.py
Wenn das Repository mehrere Untermodule enthält, muss der Repository-Ordner selbst im addons_path stehen.
Beispiel:
/home/alex/odoo-dev/custom-addons/odoo_weinbau
Danach:
Permission deniedPrüfen:
ls -la /home/alex/odoo-dev
ls -la /home/alex/odoo-dev/custom-addons
Besitzrechte korrigieren:
sudo chown -R alex:alex /home/alex/odoo-dev
Prüfen:
ss -tulpen | grep 8069
Prozess beenden, falls es eine alte Odoo-Instanz ist:
pkill -f odoo-bin
Danach erneut starten.
Prüfen:
sudo service postgresql status
Falls PostgreSQL nicht läuft:
sudo service postgresql start
Prüfen, ob der Benutzer existiert:
sudo -u postgres psql -c "\du"
Falls alex fehlt:
sudo -u postgres createuser -d -R -S alex
Immer zuerst venv aktivieren:
source /home/alex/odoo-dev/venv/bin/activate
Dann Paket installieren:
pip install PAKETNAME
Danach Odoo neu starten.
Empfehlung: SSH nutzen.
Prüfen:
ssh -T git@github.com
Remote-URL prüfen:
git remote -v
Falls noch HTTPS genutzt wird:
git remote set-url origin git@github.com:DEIN-GITHUB-NAME/DEIN-REPO.git
Auch wenn die Instanz lokal läuft, sollte sie sauber aufgebaut sein:
admin_passwd setzenadmin/admin arbeiten127.0.0.1 bindenRepositories aktualisieren:
C:\OdooDev\repo_manager.bat
VS Code öffnen:
C:\OdooDev\open_vscode_odoo.bat
Odoo starten:
C:\OdooDev\start_odoo.bat
Browser öffnen:
http://localhost:8069
Modul aktualisieren:
cd /home/alex/odoo-dev/odoo
source /home/alex/odoo-dev/venv/bin/activate
python3 odoo-bin \
-c /home/alex/odoo-dev/config/odoo-dev.conf \
--addons-path="$(python3 /home/alex/odoo-dev/scripts/generate-addons-path.py)" \
-d odoo_dev \
-u DEIN_MODULNAME \
--stop-after-init
Änderungen speichern:
cd /home/alex/odoo-dev/custom-addons/DEIN_MODUL
git add .
git commit -m "Änderung beschrieben"
git push
Diese Anleitung orientiert sich an folgenden offiziellen Dokumentationen:
Odoo 19 Quelleninstallation:
https://www.odoo.com/documentation/19.0/de/administration/on_premise/source.html
Odoo 19 Systemkonfiguration und Worker-Modus:
https://www.odoo.com/documentation/19.0/administration/on_premise/deploy.html
Odoo 19 CLI und odoo-bin:
https://www.odoo.com/documentation/19.0/developer/reference/cli.html
Visual Studio Code mit WSL:
https://code.visualstudio.com/docs/remote/wsl
GitHub Repository klonen:
https://docs.github.com/en/repositories/creating-and-managing-repositories/cloning-a-repository
Git Submodules:
https://git-scm.com/docs/git-submodule
Nach dieser Einrichtung hast du:
localhost:8069custom-addons.bat zum direkten Starten von Odoo.bat zum Laden, Aktualisieren, Hinzufügen und Entfernen von Repositories