컨테이너

입출고 현황

각 빌드는 자체 컨테이너 (Linux 네임스페이스 컨테이너) 내에 별도 보관되어 있습니다.

Ubuntu 시스템을 기본으로 하며, 여기에는 Odoo의 모든 필수 종속 요소과 일반적으로 사용되는 유용한 패키지가 설치되어 있습니다.

If your project requires additional Python dependencies, or more recent releases, you can define a requirements.txt file in the root of your branches listing them. The platform will take care to install these dependencies in your containers. The pip requirements specifiers documentation can help you write a requirements.txt file. To have a concrete example, check out the requirements.txt file of Odoo.

하위 모듈의 requirements.txt 파일도 고려합니다. 플랫폼에서는 Odoo 모듈이 포함된 각 폴더에서 requirements.txt 파일을 찾습니다. 모듈 폴더 자체가 아니라 해당 상위 폴더에서 파일을 찾습니다.

디렉토리 구조

컨테이너는 Ubuntu를 기준으로 하며, 디렉토리 구조는 Linux 파일 시스템 계층 표준을 따릅니다. Ubuntu의 파일 시스템 트리 전체보기 에서 주요 디렉토리에 대해 설명합니다.

Odoo.sh 관련 디렉토리는 다음과 같습니다.

.
├── home
│    └── odoo
│         ├── 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
│         ├── 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
└── usr
     ├── lib
     │    ├── python2.7
     │         └── dist-packages       Python 2.7 standard libraries
     │    ├── python3
     │         └── dist-packages       Python 3 standard libraries
     │    └── python3.5
     │         └── dist-packages       Python 3.5 standard libraries
     ├── local
     │    └── lib
     │         ├── python2.7
     │         │    └── dist-packages  Python 2.7 third-party libraries
     │         └── python3.5
     │              └── dist-packages  Python 3.5 third-party libraries
     └── usr
          └── bin
               ├── python2.7           Python 2.7 executable
               └── python3.5           Python 3.5 executable

Python 2.7과 3.5 모두를 컨테이너에 설치합니다. 다만:

  • 프로젝트에서 Odoo 10.0을 사용하도록 설정되어 있는 경우 Python 2.7로 Odoo 서버를 실행합니다.

  • 프로젝트에서 Odoo 11.0 이상을 사용하도록 설정되어 있는 경우 Python 3.5로 Odoo 서버를 실행합니다.

데이터베이스 쉘

셸을 사용하여 컨테이너에 액세스할 경우 *psql*을 사용하여 데이터베이스에 액세스할 수 있습니다.

odoo@odoo-addons-master-1.odoo.sh:~$ psql
psql (9.5.2, server 9.5.11)
SSL connection (protocol: TLSv1.2, cipher: ECDHE-RSA-AES256-GCM-SHA384, bits: 256, compression: off)
Type "help" for help.

odoo-addons-master-1=>

주의하세요! 특히 프로덕션 데이터베이스의 경우 변경되는 (*업데이트*, *삭제*, *변경*, …)모든 *sql* 구문에 트랜잭션 (BEGIN…COMMIT/ROLLBACK) 을 사용하도록 합니다.

트랜젝션 매커니즘은 실수에 대비하는 안전망입니다. 변경 사항을 롤백하기만 하면 데이터베이스를 이전 상태로 되돌릴 수 있습니다.

예를 들어 WHERE 조건을 설정하는 것을 잊어버리는 경우가 발생할 수 있습니다.

odoo-addons-master-1=> BEGIN;
BEGIN
odoo-addons-master-1=> UPDATE res_users SET password = '***';
UPDATE 457
odoo-addons-master-1=> ROLLBACK;
ROLLBACK

이러한 경우에는 실수로 수행된 원치 않는 변경 사항을 롤백을 통해서 되돌리고 구문을 다시 작성할 수 있습니다.

odoo-addons-master-1=> BEGIN;
BEGIN
odoo-addons-master-1=> UPDATE res_users SET password = '***' WHERE id = 1;
UPDATE 1
odoo-addons-master-1=> COMMIT;
COMMIT

다만 트랜잭션을 완료한 후에는 커밋하거나 롤백하는 것을 잊지 않도록 합니다. 트랜잭션이 계속 진행 중으로 있으면 표에서 레코드를 잠글 수 있으며 실행 중인 데이터베이스는 해당 레코드가 해제될 때까지 기다리게 됩니다. 이로 인해 서버가 무기한 중단될 수 있습니다.

또한 가능하면 스테이징 데이터베이스로 구문을 먼저 테스트하세요. 이를 통해 추가적인 안전망을 둘 수 있습니다.

Odoo 서버 실행하기

컨테이너 셸에서 Odoo 서버 인스턴스를 시작할 수 있습니다. 외부에서 브라우저를 사용하여 액세스할 수는 없으나 다음과 같은 작업을 수행할 수 있습니다.

  • 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'
  • 모듈을 설치하고,

$  odoo-bin -i sale --without-demo=all --stop-after-init
  • 모듈을 업데이트하고,

$  odoo-bin -u sale --stop-after-init
  • 모듈에 대한 테스트를 실행하고,

$  odoo-bin -i sale --test-enable --log-level=test --stop-after-init

위 명령에서 인수는 다음과 같습니다.

  • ``–without-demo=all``은 모든 모듈에 데모 데이터가 로드되지 않도록 합니다.

  • --stop-after-init 은 요청한 작업을 완료한 후 서버 인스턴스를 즉시 종료합니다.

더 많은 항목을 선택할 수 있으며 자세한 내용은 CLI 문서 를 참조하세요.

Odoo.sh에서 서버를 시작하는 데 사용하는 로그온 정보를 로그 (~/logs/odoo.log)에서 찾을 수 있습니다. “odoo: 애드온 경로” 를 찾아 보세요.

2018-02-19 10:51:39,267 4 INFO ? odoo: Odoo version 16.0
2018-02-19 10:51:39,268 4 INFO ? odoo: Using configuration file at /home/odoo/.config/odoo/odoo.conf
2018-02-19 10:51:39,268 4 INFO ? odoo: addons paths: ['/home/odoo/data/addons/16.0', '/home/odoo/src/user', '/home/odoo/src/enterprise', '/home/odoo/src/themes', '/home/odoo/src/odoo/addons', '/home/odoo/src/odoo/odoo/addons']

특히 프로덕션 데이터베이스의 경우 더욱 주의하세요. 이 Odoo 서버 인스턴스를 실행 중에 수행하는 작업은 별도로 격리되지 않습니다. 변경 사항은 데이터베이스에 적용됩니다. 항상 스테이징 데이터베이스에서 테스트하시기 바랍니다.

Odoo.sh에서 디버깅하기

Odoo.sh 빌드 디버깅은 사실 다른 Python 앱과 큰 차이가 없습니다. 이 문서에서는 Odoo.sh 플랫폼의 특수성과 한계에 대해서만 설명하고 사용자가 디버거 사용법을 이미 알고 있는 것으로 가정합니다.

참고

아직 Python 애플리케이션을 디버깅하는 방법을 모르는 경우에는 인터넷에서 여러 가지 입문 과정을 쉽게 찾아볼 수 있습니다.

pdb, pudb 또는 ipdb 를 사용하여 Odoo.sh에서 코드를 디버깅할 수 있습니다. 서버가 셸 외부에서 실행되기 때문에 디버거를 작동하려면 셸이 필요하므로 Odoo 인스턴스 백엔드에서 직접 디버거를 시작할 수 없습니다.

  • pdb 는 모든 컨테이너에 기본적으로 설치됩니다.

  • pudb 또는 ipdb 를 사용하려면 먼저 설치를 해야 합니다.

    진행하려면 다음 두 가지 중에서 선택합니다.

    • 임시 (현재 빌드에서만):

      $  pip install pudb --user
      

      또는

      $  pip install ipdb --user
      
    • 영구적으로: 프로젝트 requirements.txt 파일에 pudb 또는 ``ipdb``를 추가합니다.

그런 다음 디버거를 트리거하는 코드를 편집하고 다음 내용을 추가합니다.

import sys
if sys.__stdin__.isatty():
    import pdb; pdb.set_trace()

sys.__stdin__.isatty() 조건으로 쉘에서 Odoo를 실행하는지 감지할 수 있습니다.

파일을 저장한 다음 Odoo 셸을 실행합니다.

$ odoo-bin shell

마지막으로 Odoo 셸을 통하여 디버깅하려는 코드/함수/메서드 항목을 트리거할 수 있습니다.

Odoo.sh 셸에서 실행되는 ``pdb``가 나타나 있는 콘솔 스크린샷