Geavanceerde onderwerpen¶
In dit gedeelte worden geavanceerde functies van Odoo.sh behandeld met betrekking tot containers, Git-submodules en geplande acties.
Containers¶
Elke build is geïsoleerd in zijn eigen container (Linux namespace container). De basis is een op Ubuntu gebaseerd systeem waarop alle vereiste afhankelijkheden van Odoo zijn geïnstalleerd, evenals algemene, nuttige pakketten.
Als je project extra Python-afhankelijkheden of recentere versies vereist, kun je in de hoofdmap van je branches een requirements.txt-bestand definiëren waarin deze worden vermeld. Het platform zorgt ervoor dat deze afhankelijkheden in je containers worden geïnstalleerd.
Zie ook
Bekijk voor een concreet voorbeeld het Odoo Community requirements.txt-bestand.
Notitie
Er wordt ook rekening gehouden met de requirements.txt-bestanden van submodules. Het platform zoekt naar dergelijke bestanden in de bovenliggende map van elke map die een Odoo-module bevat.
Directorystructuur¶
Aangezien de containers op Ubuntu zijn gebaseerd, volgt hun directorystructuur de Filesystem Hierarchy Standard.
De directories die relevant zijn voor Odoo.sh zijn de volgende:
.
├── 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
Databaseshell¶
Wanneer je via de shell toegang hebt tot een container, kun je toegang krijgen tot de database met het commando psql.
odoo@odoo-master-1.odoo.sh:~$ psql
psql (16.9)
Type "help" for help.
odoo-master-1=>
Waarschuwing
Gebruik altijd transacties (bv. BEGIN (…) COMMIT / ROLLBACK) wanneer een SQL-statement tot wijzigingen leidt (bv. UPDATE, DELETE, ALTER, enz.), vooral voor je productiedatabase. Het transactiemechanisme is je vangnet in het geval van een fout. Je hoeft je wijzigingen alleen maar terug te draaien om je database terug te zetten naar de vorige staat.
Vergeet niet om transacties te committen of terug te draaien. Openstaande transacties kunnen records in je tabellen vergrendelen en een actieve database kan wachten tot deze worden vrijgegeven, waardoor een server voor onbepaalde tijd kan vastlopen.
Gebruik daarnaast eerst je staging-databases om je statements te testen. Dit biedt je een extra vangnet.
Example
Je bent vergeten je WHERE-voorwaarde in te stellen. In zo’n geval kun je een rollback uitvoeren om de ongewenste wijziging terug te draaien:
odoo-master-1=> BEGIN;
BEGIN
odoo-master-1=> UPDATE res_users SET password = '***';
UPDATE 457
odoo-master-1=> ROLLBACK;
ROLLBACK
Herschrijf vervolgens het statement en commit de wijziging:
odoo-master-1=> BEGIN;
BEGIN
odoo-master-1=> UPDATE res_users SET password = '***' WHERE id = 1;
UPDATE 1
odoo-master-1=> COMMIT;
COMMIT
Voer een Odoo-server jeit¶
Je kunt een Odoo-serverinstantie starten vanuit een containershell. Je hebt er vanaf de buitenwereld geen toegang toe met een webbrowser, maar je kunt bijvoorbeeld:
Gebruik de Odoo-shell:
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'
Installeer een module:
odoo-bin -i sale --without-demo=all --stop-after-initTip
Het argument
--without-demo=allvoorkomt dat er demodata wordt geladen voor alle modules.Het argument
--stop-after-initsluit de serverinstantie onmiddellijk af nadat de bewerking is voltooid.
Werk een module bij:
odoo-bin -u sale --stop-after-init
Voer de tests voor een module uit:
odoo-bin -i sale --test-enable --log-level=test --stop-after-init
Zie ook
Om het addons-pad te vinden dat Odoo.sh gebruikt om je server uit te voeren, zoek je naar “odoo: addons paths” in de logs (~/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']
Waarschuwing
Bewerkingen die je uitvoert op een Odoo-serverinstantie zijn niet geïsoleerd; wijzigingen worden doorgevoerd in de database. Vergeet niet om altijd tests uit te voeren in je staging-databases.
Foutopsporing in Odoo.sh¶
Notitie
Het debuggen van een Odoo.sh-build verschilt niet echt van het debuggen van een andere Python-app. Het doel van dit onderdeel is dan ook de bijzonderheden en beperkingen van het Odoo.sh-platform te behandelen, waarbij ervan wordt uitgegaan dat je al weet hoe je een debugger moet gebruiken.
Je kunt pdb, pudb of ipdb gebruiken om code op Odoo.sh te debuggen. Omdat de server buiten een shell draait, kun je de debugger niet rechtstreeks vanuit je Odoo-backend starten, aangezien deze een shell nodig heeft om te werken.
pdb wordt standaard in elke container geïnstalleerd.
Tip
Om pudb of ipdb te gebruiken, is het nodig om ze te installeren, ofwel:
permanent door
pudbofipdbtoe te voegen aan het bestandrequirements.txtvan je project, oftijdelijk (alleen in de huidige build) door de betreffende opdracht uit te voeren:
pip install pudb --user
pip install ipdb --user
Voeg dit toe aan de code die je wilt debuggen om de debugger te activeren:
import sys if sys.__stdin__.isatty(): import pdb; pdb.set_trace()
Notitie
De voorwaarde
sys.__stdin__.isatty()is een workaround om te detecteren of je Odoo vanuit een shell uitvoert.Sla vervolgens het bestand op en voer de Odoo-shell uit:
odoo-bin shell
Gebruik de Odoo-shell om de code te activeren die je wilt debuggen.
Submodules¶
Git submodules stellen je in staat om externe repositories rechtstreeks aan je project te koppelen zonder code te kopiëren en te plakken. Dit stroomlijnt de implementatie door afhankelijkheden samen met je primaire codebase te klonen. Je behoudt nauwkeurig versiebeheer door exacte branches te kiezen en specifieke commit-revisies vast te pinnen, zodat je deze kunt bijwerken wanneer je maar wilt.
Op Odoo.sh detecteert het platform automatisch submodules en voegt ze toe aan je addons-pad voor database-installatie, op voorwaarde dat je een deploy key configureert in je project- en repository-instellingen bij het integreren van private repositories.
Een submodule toevoegen¶
Notitie
Momenteel is het niet mogelijk om private repositories toe te voegen met Odoo.sh. Je kunt dit echter wel doen met Git.
Kies in de weergave Filialen van je Odoo.sh-project het filiaal waarin je een submodule wilt toevoegen.
Klik in de rechterbovenhoek op Submodule en vervolgens op Uitvoeren op Odoo.sh.
Vul in het dialoogvenster het volgende in:
Repository-URL: de SSH-URL van de repository
Tip
Klik op GitHub op Clone, selecteer SSH en kopieer de URL.
Filiaal: het specifieke filiaal dat moet worden gebruikt
Pad: de map waarin de submodule moet worden toegevoegd in je filiaal
In een terminal, in de map waar je Git-repository is gekloond, check je de branch uit waarin je een submodule wilt toevoegen:
git checkout <branch>
Voeg de submodule toe:
git submodule add -b <branch> <git@yourprovider.com>:<username/repository.git> <path>
<git@yourprovider.com>:<username/repository.git>: de SSH-URL van de repository die je als submodule wilt toevoegen
<branch>: het filiaal dat je wilt gebruiken in de bovenstaande repository
<path>: de map waarin je deze submodule wilt toevoegen
Commit en push de wijzigingen:
git commit -a && git push -u <remote> <branch><remote>: de repository waarnaar je je wijzigingen wilt pushen. Bij een standaard Git-configuratie is dit origin.
<branch>: het filiaal waarnaar je je wijzigingen wilt pushen. Hoogstwaarschijnlijk het filiaal dat je in de eerste stap hebt uitgecheckt.
Tip
Wanneer je een repository toevoegt die veel modules bevat, wil je er mogelijk enkele negeren als deze automatisch worden geïnstalleerd. Plaats hiervoor een . (bv. .folder) voor je submodulemap. Het platform zal deze map negeren en je kunt de modules handmatig selecteren door vanuit een andere map symbolische links ernaartoe te maken.
Geplande acties¶
Op het Odoo.sh-platform zijn geplande acties net iets anders geïmplementeerd dan op een reguliere Odoo-server en worden ze uitgevoerd op basis van best effort. Dit komt omdat er meerdere klanten op dezelfde server kunnen staan en elke klant verzekerd is van een eerlijk deel van de resources van de server. Daarom kan een exacte uitvoeringstijd voor geplande acties niet worden gegarandeerd.
Belangrijk
Verwacht niet dat een geplande actie vaker dan om de vijf minuten wordt uitgevoerd.
Omdat de uitvoeringstijd van geplande acties beperkt is, is het raadzaam om ervoor te zorgen dat je geplande acties:
Met kleine batches records werken.
Hun werk na de verwerking van elke batch vastleggen (commit), zodat ze niet opnieuw hoeven te beginnen als ze door de tijdslimiet worden onderbroken.
Idempotent zijn, d.w.z. dat ze geen neveneffecten mogen veroorzaken als ze vaker worden gestart dan verwacht.
IP-adres wijzigen¶
Odoo.sh informeert projectbeheerders over IP-adreswijzigingen. Daarnaast wordt, wanneer het IP-adres van een productie-instantie verandert, een HTTP GET-verzoek gedaan naar het pad /_odoo.sh/ip-change met het nieuwe IP-adres als een querystringparameter (new), samen met het vorige IP-adres als een extra parameter (old).
Met dit mechanisme kunnen aangepaste acties worden geactiveerd als reactie op de wijziging van het IP-adres (bijv. een e-mail verzenden, contact opnemen met een firewall-API, databaseobjecten configureren, enz.).
Om veiligheidsredenen is de route /_odoo.sh/ip-change alleen intern toegankelijk voor het platform zelf en retourneert een 403-respons bij toegang via andere middelen.
Hier is een voorbeeld van een pseudo-implementatie:
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'