고급 주제¶
컨테이너¶
각 빌드는 자체 컨테이너(Linux 네임스페이스 컨테이너)에 격리됩니다. 기본 시스템은 Ubuntu 기반 시스템으로, Odoo의 모든 필수 종속성과 유용하고 일반적인 패키지가 설치되어 있습니다.
프로젝트에 추가 Python 종속성이나 더 최신 릴리스가 필요한 경우, 브랜치 루트에 이를 나열하는 requirements.txt 파일을 정의할 수 있습니다. 플랫폼에서 이러한 종속성이 컨테이너에 설치되도록 합니다.
더 보기:
구체적인 예는 Odoo Community의 requirements.txt 파일을 확인하세요.
참고
requirements.txt 파일은 서브모듈의 경우에도 고려됩니다. 플랫폼은 Odoo 모듈이 포함된 각 폴더의 상위 폴더에서 이러한 파일을 찾습니다.
디렉토리 구조¶
컨테이너는 Ubuntu 기반이므로 디렉터리 구조는 파일 시스템 계층 표준을 따릅니다.
더 보기:
Odoo.sh와 관련된 디렉터리는 다음과 같습니다:
.
├── 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
데이터베이스 쉘¶
셸을 통해 컨테이너에 접속한 상태에서 psql 명령을 사용하여 데이터베이스에 액세스할 수 있습니다.
odoo@odoo-master-1.odoo.sh:~$ psql
psql (16.9)
Type "help" for help.
odoo-master-1=>
경고
SQL 문으로 인해 변경 사항이 발생하는 경우(예: UPDATE, DELETE, ALTER 등), 특히 프로덕션 데이터베이스에서는 항상 트랜잭션 (예: BEGIN (…) COMMIT / ROLLBACK)을 사용하세요. 실수할 경우 트랜잭션 메커니즘이 안전망 역할을 합니다. 데이터베이스를 이전 상태로 되돌리려면 변경 사항을 롤백하기만 하면 됩니다.
트랜잭션을 커밋하거나 롤백하는 것을 잊지 마세요. 열려 있는 트랜잭션은 테이블의 레코드를 잠글 수 있으며, 실행 중인 데이터베이스가 잠금 해제를 기다리면서 서버가 무기한 응답하지 않을 수 있습니다.
또한 스테이징 데이터베이스를 사용하여 구문을 먼저 테스트하세요. 추가적인 안전망을 확보할 수 있습니다.
Example
WHERE 조건을 지정하지 않은 경우 다음과 같이 롤백하여 원치 않는 변경 사항을 되돌릴 수 있습니다:
odoo-master-1=> BEGIN;
BEGIN
odoo-master-1=> UPDATE res_users SET password = '***';
UPDATE 457
odoo-master-1=> ROLLBACK;
ROLLBACK
그런 다음 구문을 다시 작성하고 변경 사항을 커밋합니다:
odoo-master-1=> BEGIN;
BEGIN
odoo-master-1=> UPDATE res_users SET password = '***' WHERE id = 1;
UPDATE 1
odoo-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팁
--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
더 보기:
Odoo.sh에서 서버를 실행하는 데 사용하는 애드온 경로를 찾으려면 로그(~/logs/odoo.log)에서 “odoo: addons paths”를 확인하세요.
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']
경고
Odoo 서버 인스턴스에서 수행하는 작업은 격리되지 않으며 변경 사항이 데이터베이스에 반영됩니다. 항상 스테이징 데이터베이스에서 테스트를 수행하세요.
Odoo.sh에서 디버깅하기¶
참고
Odoo.sh 빌드를 디버깅하는 것은 다른 Python 앱을 디버깅하는 것과 크게 다르지 않습니다. 따라서 이 섹션에서는 Odoo.sh 플랫폼의 고유한 특성과 제한 사항을 다루며, 사용자가 이미 디버거 사용법을 알고 있다고 가정합니다.
Odoo.sh에서 코드를 디버깅할 때 pdb, pudb 또는 `ipdb`를 사용할 수 있습니다. 디버거가 작동하려면 셸이 필요하지만 서버는 셸 외부에서 실행되므로, Odoo 백엔드에서 디버거를 직접 실행할 수는 없습니다.
pdb 는 모든 컨테이너에 기본적으로 설치됩니다.
팁
pudb 또는 ipdb 를 사용하려면 다음 방법 중 하나로 설치해야 합니다:
프로젝트의
requirements.txt파일에pudb또는 `ipdb`를 추가하여 영구적으로 적용하거나,해당 명령을 실행하여 임시로(현재 빌드에만 적용) 설치할 수 있습니다:
pip install pudb --user
pip install ipdb --user
디버거를 실행하려면 디버깅할 코드에 다음 내용을 추가하십시오:
import sys if sys.__stdin__.isatty(): import pdb; pdb.set_trace()
참고
sys.__stdin__.isatty()조건은 Odoo가 셸에서 실행 중인지 감지하기 위한 해결 방법입니다.다음으로 파일을 저장하고 Odoo 셸을 실행합니다:
odoo-bin shell
Odoo 셸을 사용하여 디버깅하려는 코드를 실행하십시오.
하위 모듈¶
Git 서브모듈을 사용하면 코드를 복사하여 붙여넣지 않고도 외부 저장소를 프로젝트에 직접 연결할 수 있으며, 기본 코드베이스와 함께 종속 항목을 복제하여 배포를 간소화할 수 있습니다. 정확한 브랜치를 선택하고 특정 커밋 리비전을 고정하여 원하는 시점에 업데이트함으로써 정밀한 버전 관리를 유지할 수 있습니다.
Odoo.sh에서는 비공개 저장소를 통합할 때 프로젝트 및 저장소 설정에서 배포 키를 구성하면 플랫폼이 서브모듈을 자동으로 감지하여 데이터베이스 설치 시 애드온 경로에 추가합니다.
하위 모듈 추가하기¶
참고
현재 Odoo.sh에서는 비공개 저장소를 추가할 수 없습니다. 하지만 Git을 사용하면 추가할 수 있습니다.
Odoo.sh 프로젝트의 브랜치보기에서 서브모듈을 추가할 브랜치를 선택합니다.
오른쪽 상단에서 서브모듈을 클릭한 다음 Odoo.sh에서 실행을 클릭합니다.
대화 상자에서 다음 항목을 입력합니다:
저장소 URL:저장소의 SSH URL
팁
GitHub에서 복제를 클릭하고 SSH를 선택한 후 URL을 복사합니다.
브랜치:사용할 특정 브랜치
경로:해당 브랜치에서 서브모듈을 추가할 폴더
터미널 내 Git 저장소가 복제되어 있는 폴더에서 하위 모듈을 추가하려는 브랜치를 체크아웃합니다.
git checkout <branch>
서브모듈을 추가합니다:
git submodule add -b <branch> <git@yourprovider.com>:<username/repository.git> <path>
<git@yourprovider.com>:<username/repository.git>: 서브모듈로 추가할 저장소의 SSH URL
<branch>: 위의 저장소에서 사용할 브랜치
<path>: 이 서브모듈을 추가할 폴더
변경 사항을 커밋하고 푸시합니다:
git commit -a && git push -u <remote> <branch><remote>:변경 사항을 푸시하려는 저장소입니다. 표준 Git 설정에서는 *origin*입니다.
<branch>:변경 사항을 푸시하려는 브랜치입니다. 대부분의 경우 첫 번째 단계에서 체크아웃한 브랜치입니다.
팁
여러 모듈이 포함된 저장소를 추가할 때, 일부 모듈이 자동으로 설치된다면 무시하도록 설정할 수 있습니다. 그렇게 하려면 하위 모듈 폴더 이름 앞에 .을 붙입니다 (예: .folder). 플랫폼에서 이 폴더를 무시하므로, 다른 폴더에서 해당 모듈로 연결되는 심볼릭 링크를 생성하여 원하는 모듈을 직접 선택할 수 있습니다.
예약된 활동¶
Odoo.sh 플랫폼의 예약 작업은 일반 Odoo 서버와 약간 다르게 구현되며 최선 노력(best-effort) 방식으로 실행됩니다. 이는 동일한 서버에 여러 고객이 있을 수 있으며, 각 고객에게 서버 리소스가 공정하게 배분되어야 하기 때문입니다. 따라서 예약 작업의 정확한 실행 시간은 보장되지 않습니다.
중요
예약 작업이 5분보다 더 자주 실행될 것으로 기대해서는 안 됩니다.
예약 작업의 실행 시간은 제한되어 있으므로 다음 사항을 확인하는 것이 좋습니다:
레코드를 소규모 배치 단위로 나누어 처리합니다.
시간 제한으로 작업이 중단되더라도 처음부터 다시 시작할 필요가 없도록 각 배치를 처리한 후 커밋합니다.
멱등성을 유지해야 합니다. 즉, 예상보다 자주 실행되더라도 부작용이 발생하지 않아야 합니다.
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 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'