Часті технічні питання¶
«Заплановані дії не виконуються точно в очікуваний час»¶
На платформі Odoo.sh ми не можемо гарантувати точний час виконання запланованих дій.
Це пов’язано з тим, що на одному сервері може бути кілька клієнтів, і ми повинні гарантувати справедливий розподіл ресурсів сервера для кожного клієнта. Тому заплановані дії реалізовані дещо інакше, ніж на звичайному сервері Odoo, і виконуються за принципом максимальних зусиль.
Попередження
Не очікуйте, що будь-яка запланована дія виконуватиметься частіше, ніж кожні 5 хвилин.
Чи існують «найкращі практики» щодо запланованих дій?¶
Odoo.sh завжди обмежує час виконання запланованих дій (*тобто* cron-задач). Тому ви повинні враховувати це при розробці власних cron-задач.
Ми радимо:
Ваші заплановані дії повинні працювати з невеликими пакетами записів.
Ваші заплановані дії повинні фіксувати свою роботу після обробки кожного пакета; таким чином, якщо їх буде перервано через обмеження часу, не потрібно починати спочатку.
Ваші заплановані дії повинні бути ідемпотентними: вони не повинні спричиняти побічних ефектів, якщо запускаються частіше, ніж очікувалося.
Як можна автоматизувати задачі при зміні IP-адреси?¶
Odoo.sh повідомляє адміністраторів проекту про зміни IP-адреси. Крім того, коли змінюється IP-адреса виробничого екземпляра, надсилається HTTP-запит GET за шляхом /_odoo.sh/ip-change з новою IP-адресою, включеною як параметр рядка запиту (new), разом з попередньою IP-адресою як додатковим параметром (old).
Цей механізм дозволяє застосовувати власні дії у відповідь на зміну IP-адреси (наприклад, надсилання електронного листа, звернення до API брандмауера, налаштування об’єктів бази даних тощо)
З міркувань безпеки маршрут /_odoo.sh/ip-change доступний лише внутрішньо самою платформою і повертає відповідь 403, якщо до нього звертаються будь-яким іншим способом.
Ось приклад псевдореалізації:
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 required for your use case, e.g., update an
# ir.config_parameter, send an email, contact an external firewall service's API, ...
return 'ok'