Advanced topics¶
This section covers advanced features of Odoo.sh related to containers, Git submodules, and scheduled actions.
Kontenery¶
Each build is isolated in its own container (Linux namespace container). The base is an Ubuntu-based system on which all of Odoo’s required dependencies, as well as common, useful packages, are installed.
If your project requires additional Python dependencies or more
recent releases, you can define a requirements.txt file at the root of your branches that
lists them. The platform will ensure these dependencies are installed in your containers.
Zobacz także
For a concrete example, check out the Odoo Community requirements.txt file.
Informacja
The requirements.txt files of submodules are also
taken into account. The platform looks for such files in the parent folder of each folder
containing an Odoo module.
Struktura katalogów¶
As the containers are Ubuntu-based, their directory structure follows the Filesystem Hierarchy Standard.
Zobacz także
The directories relevant to Odoo.sh are the following:
.
├── home
│ └── odoo
│ ├── backup.daily
│ ├── data
│ │ ├── filestore Database attachments, as well as the files of binary fields
│ │ └── sessions Visitors and users sessions
│ ├── logs
│ │ ├── install.log Database installation logs
│ │ ├── odoo.log Running server logs
│ │ ├── update.log Database updates logs
│ │ └── pip.log Python packages installation logs
│ └── src
│ ├── odoo Odoo Community source code
│ │ └── odoo-bin Odoo server executable
│ ├── enterprise Odoo Enterprise source code
│ ├── themes Odoo Themes source code
│ └── user Your repository branch source code
└── usr
├── lib
│ └── pythonX.XX
│ └── dist-packages Python X.XX standard libraries
├── local
│ └── lib
│ └── pythonX.XX
│ └── dist-packages Python X.XX third-party libraries
└── usr
└── bin
└── pythonX.X Python X.XX executable
Powłoka bazy danych¶
While accessing a container with the shell, you can access the database using the psql command.
odoo@odoo-master-1.odoo.sh:~$ psql
psql (16.9)
Type "help" for help.
odoo-master-1=>
Ostrzeżenie
Always use transactions (e.g.,
BEGIN (…) COMMIT / ROLLBACK) when an SQL statement leads to changes (e.g., UPDATE,
DELETE, ALTER, etc.) , especially for your production database. The transaction mechanism is
your safety net in case of a mistake. You simply have to rollback your changes to revert your
database to its previous state.
Do not forget to commit or roll back transactions. Open transactions may lock records in your tables, and a running database may wait for them to be released, causing a server to hang indefinitely.
In addition, use your staging databases to test your statements first. It gives you an extra safety net.
Example
You forgot to set your WHERE condition. In such a case, you can rollback to revert the
unwanted change:
odoo-master-1=> BEGIN;
BEGIN
odoo-master-1=> UPDATE res_users SET password = '***';
UPDATE 457
odoo-master-1=> ROLLBACK;
ROLLBACK
Then, rewrite the statement and commit the change:
odoo-master-1=> BEGIN;
BEGIN
odoo-master-1=> UPDATE res_users SET password = '***' WHERE id = 1;
UPDATE 1
odoo-master-1=> COMMIT;
COMMIT
Uruchom serwer Odoo¶
You can start an Odoo server instance from a container shell. You won’t be able to access it from the outside world with a web browser, but you can, for example:
Skorzystaj z powłoki Odoo:
odoo-bin shell >>> partner = env['res.partner'].search([('email', '=', 'asusteK@yourcompany.example.com')], limit=1) >>> partner.name 'ASUSTeK' >>> partner.name = 'Odoo' >>> env['res.partner'].search([('email', '=', 'asusteK@yourcompany.example.com')], limit=1).name 'Odoo'
Zainstaluj moduł:
odoo-bin -i sale --without-demo=all --stop-after-initWskazówka
Argument
--without-demo=allzapobiega wczytywaniu danych demonstracyjnych dla wszystkich modułów.Argument
--stop-after-initnatychmiast wyłącza instancję serwera po zakończeniu operacji.
Zaktualizuj moduł:
odoo-bin -u sale --stop-after-init
Uruchom testy dla modułu:
odoo-bin -i sale --test-enable --log-level=test --stop-after-init
Zobacz także
Aby znaleźć ścieżkę dodatków używaną przez Odoo.sh do uruchamiania serwera, poszukaj „odoo: addons paths” w logach (~/logs/odoo.log).
2025-02-19 10:51:39,267 4 INFO ? odoo: Odoo version 18.0
2025-02-19 10:51:39,268 4 INFO ? odoo: Using configuration file at /home/odoo/.config/odoo/odoo.conf
2025-02-19 10:51:39,268 4 INFO ? odoo: addons paths: ['/home/odoo/data/addons/18.0', '/home/odoo/src/user', '/home/odoo/src/enterprise', '/home/odoo/src/themes', '/home/odoo/src/odoo/addons', '/home/odoo/src/odoo/odoo/addons']
Ostrzeżenie
Operacje wykonywane na instancji serwera Odoo nie są izolowane; zmiany zostaną odzwierciedlone w bazie danych. Pamiętaj, aby zawsze przeprowadzać testy w bazach danych staging.
Debugowanie w Odoo.sh¶
Informacja
Debugowanie kompilacji (build) Odoo.sh niewiele różni się od debugowania innej aplikacji w Pythonie. Celem tej sekcji jest omówienie specyfiki i ograniczeń platformy Odoo.sh, przy założeniu, że użytkownik już wie, jak korzystać z debuggera.
Do debugowania kodu w Odoo.sh można użyć pdb, pudb lub ipdb. Ponieważ serwer działa poza powłoką, nie można uruchomić debuggera bezpośrednio z zaplecza Odoo, ponieważ wymaga on powłoki do działania.
pdb jest domyślnie zainstalowany w każdym kontenerze.
Wskazówka
Aby użyć pudb lub ipdb, należy je zainstalować w jeden z poniższych sposobów:
na stałe, dodając
pudblubipdbdo plikurequirements.txtprojektu, lubtymczasowo (tylko w bieżącej kompilacji), uruchamiając odpowiednie polecenie:
pip install pudb --user
pip install ipdb --user
Aby uruchomić debugger, dodaj to do kodu, który chcesz debugować:
import sys if sys.__stdin__.isatty(): import pdb; pdb.set_trace()
Informacja
Warunek
sys.__stdin__.isatty()to obejście umożliwiające wykrycie, czy Odoo jest uruchamiane z poziomu powłoki.Następnie zapisz plik i uruchom powłokę Odoo:
odoo-bin shell
Użyj powłoki Odoo, aby uruchomić kod, który chcesz debugować.
Podmoduły¶
Submoduły Git pozwalają połączyć zewnętrzne repozytoria bezpośrednio z projektem bez kopiowania kodu, usprawniając wdrażanie dzięki klonowaniu zależności razem z głównym kodem projektu. Zapewniają precyzyjną kontrolę wersji dzięki wyborowi konkretnych gałęzi i przypinaniu określonych rewizji commitów do aktualizacji według własnego uznania.
W Odoo.sh platforma automatycznie wykrywa submoduły i dodaje je do ścieżki dodatków w celu instalacji bazy danych, pod warunkiem, że przy integracji prywatnych repozytoriów skonfigurujesz klucz wdrożenia w ustawieniach projektu i repozytorium.
Dodawanie podmodułu¶
Informacja
Obecnie nie ma możliwości dodawania prywatnych repozytoriów za pomocą Odoo.sh. Można to jednak zrobić za pomocą Gita.
W widoku Gałęzie Twojego projektu Odoo.sh wybierz gałąź, do której chcesz dodać submoduł.
W prawym górnym rogu kliknij Submoduł, a następnie Uruchom na Odoo.sh.
W oknie dialogowym uzupełnij następujące pola:
Adres URL repozytorium: adres SSH repozytorium
Wskazówka
Na GitHubie kliknij Clone, wybierz SSH i skopiuj adres URL.
Gałąź: konkretna gałąź, która ma zostać użyta
Ścieżka: folder, do którego submoduł ma zostać dodany w Twojej gałęzi
W terminalu, w folderze, w którym sklonowano repozytorium Git, przełącz się na gałąź, do której chcesz dodać submoduł:
git checkout <branch>
Dodaj submoduł:
git submodule add -b <branch> <git@yourprovider.com>:<username/repository.git> <path>
<git@yourprovider.com>:<username/repository.git>: adres SSH repozytorium, które chcesz dodać jako submoduł
<branch>: gałąź, której chcesz użyć w powyższym repozytorium
<path>: folder, do którego chcesz dodać ten submoduł
Zatwierdź i wypchnij zmiany:
git commit -a && git push -u <remote> <branch><remote>: repozytorium, do którego chcesz wypchnąć swoje zmiany. W standardowej konfiguracji Gita jest to origin.
<branch>: gałąź, do której chcesz wypchnąć swoje zmiany. Najprawdopodobniej gałąź, którą wybrałeś w pierwszym kroku.
Wskazówka
Podczas dodawania repozytorium zawierającego wiele modułów, możesz chcieć zignorować niektóre z nich, jeśli są instalowane automatycznie. Aby to zrobić, poprzedź folder submodułu znakiem . (np. .folder). Platforma zignoruje ten folder, a Ty możesz ręcznie wybrać moduły, tworząc linki symboliczne do nich z innego folderu.
Zaplanowane akcje¶
Na platformie Odoo.sh zaplanowane działania są zaimplementowane nieco inaczej niż na zwykłym serwerze Odoo i są uruchamiane na zasadzie najlepszych starań. Wynika to z faktu, że na tym samym serwerze może znajdować się wielu klientów, a każdemu z nich gwarantowany jest sprawiedliwy podział zasobów serwera. Dlatego nie można zagwarantować dokładnego czasu wykonania zaplanowanych działań.
Ważne
Nie należy oczekiwać, że jakiekolwiek zaplanowane działanie będzie uruchamiane częściej niż co pięć minut.
Ponieważ czas wykonywania zaplanowanych akcji jest ograniczony, zaleca się dopilnowanie, aby te akcje:
Działały na małych partiach rekordów.
Zatwierdzały swoją pracę po przetworzeniu każdej partii, tak aby w razie przerwania z powodu limitu czasu nie trzeba było zaczynać od nowa.
Były idempotentne, tzn. nie mogą powodować efektów ubocznych, jeśli zostaną uruchomione częściej niż oczekiwano.
IP address change¶
Odoo.sh powiadamia administratorów projektu o zmianach adresu IP. Dodatkowo, gdy zmienia się adres IP instancji produkcyjnej, wysyłane jest żądanie HTTP GET do ścieżki /_odoo.sh/ip-change z nowym adresem IP dołączonym jako parametr zapytania (new), wraz z poprzednim adresem IP jako dodatkowym parametrem (old).
This mechanism allows custom actions to be triggered in response to the IP address change (e.g., sending an email, contacting a firewall API, configuring database objects, etc.)
Ze względów bezpieczeństwa ścieżka /_odoo.sh/ip-change jest dostępna wyłącznie wewnętrznie przez samą platformę i zwraca odpowiedź 403, jeśli zostanie do niej uzyskany dostęp w inny sposób.
Oto przykładowa pseudo-implementacja:
class IPChangeController(http.Controller):
@http.route('/_odoo.sh/ip-change', auth='public')
def ip_change(self, old=None, new=None):
_logger.info("IP address changed from %s to %s", old, new)
# Then perform whatever action is required for your use case, e.g., update an
# ir.config_parameter, send an email, contact an external firewall service's API, ...
return 'ok'