Odoo 설치 · 18 min read · Nov 17, 2025

Rocky Linux 9에 Odoo 17 ERP 소프트웨어 설치하는 방법

Odoo(구 OpenERP)는 CRM, 전자상거래, 회계, 재고, 프로젝트 관리 및 판매 시점을 포함한 다양한 비즈니스 요구를 위한 10,000개 이상의 오픈 소스 애플리케이션으로 구성된 자체 호스팅 스위트입니다. 이러한 애플리케이션은 완전히 통합되어 있으며 친숙한 웹 인터페이스를 통해 접근할 수 있습니다.

이 튜토리얼에서는 Rocky Linux 9 서버에 Odoo 16 스택을 설치하는 방법을 배웁니다.

필수 조건

  1. Odoo 스택을 호스팅하기 위한 최소 2GB RAM을 갖춘 Rocky Linux 9 서버.
  2. PostgreSQL 데이터베이스를 호스팅하기 위한 최소 2GB RAM을 갖춘 두 번째 Rocky Linux 9 서버. 그러나 Odoo와 동일한 서버에 데이터베이스를 설치할 수 있지만, 프로덕션 환경에서는 별도의 서버에 설치하는 것이 강력히 권장됩니다. 원하는 공급자의 관리형 데이터베이스 옵션 중 하나를 선택할 수도 있습니다.
  3. RAM 요구 사항은 스택을 사용할 동시 사용자 수에 따라 달라집니다. 시스템 요구 사항을 계산하는 방법에 대한 자세한 가이드는 Odoo의 문서에서 확인할 수 있습니다.
  4. 시스템을 업데이트 상태로 유지하십시오. $ sudo dnf update
  5. 두 서버 모두에서 sudo 권한이 있는 비루트 사용자.
  6. Fail2Ban이 설치되어 있어야 합니다. 이 단계는 선택 사항입니다. Rocky Linux에 Fail2Ban을 설치하는 방법에 대한 가이드를 따를 수 있습니다.
  7. SELinux는 비활성화되어야 합니다.
  8. 시스템에서 필요한 몇 가지 패키지. $ sudo dnf install wget curl nano unzip yum-utils policycoreutils-python-utils -y 이러한 패키지 중 일부는 이미 시스템에 설치되어 있을 수 있습니다.

1단계 - 방화벽 규칙 구성

첫 번째 단계는 방화벽을 구성하는 것입니다. Rocky Linux는 Firewalld 방화벽을 사용합니다. 이 튜토리얼에서는 두 서버 모두에 Firewalld 방화벽이 설치되어 있다고 가정합니다.

방화벽의 상태를 확인하십시오.

$ sudo firewall-cmd --state
running

방화벽은 서로 다른 영역과 함께 작동하며, 공용 영역이 우리가 사용할 기본 영역입니다. 방화벽에서 활성화된 모든 서비스와 포트를 나열합니다.

$ sudo firewall-cmd --zone=public --list-all

다음과 같은 출력을 보여야 합니다.

public
  target: default
  icmp-block-inversion: no
  interfaces: eth0
  sources: 
  services: cockpit dhcpv6-client ssh
  ports: 
  protocols: 
  forward: yes
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules:

Odoo 서버에서는 포트 22, 80, 443, 6010, 5432 및 8069를 열어야 합니다. 22는 SSH에 사용되고, 80은 HTTP에, 443은 HTTPS에, 6010은 Odoo 통신에, 5432는 PostgreSQL에, 8069는 Odoo 서버 애플리케이션에 사용됩니다.

Odoo 서버에서 필요한 포트를 열기 위해 다음 명령을 실행하십시오.

$ sudo firewall-cmd --zone=public --add-port={6010,5432,8069,8072}/tcp
$ sudo firewall-cmd --zone=public --add-service=http
$ sudo firewall-cmd --zone=public --add-service=https

방화벽의 상태를 확인하십시오.

$ sudo firewall-cmd --zone=public --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0
  sources: 
  services: cockpit dhcpv6-client http https ssh
  ports: 6010/tcp 5432/tcp 8069/tcp 8072/tcp
  protocols: 
  forward: yes
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules:

PostgreSQL 서버에서는 포트 22, 6010 및 5432를 열어야 합니다. 다음 명령을 사용하여 열어주십시오.

$ sudo firewall-cmd --zone=public --add-port={6010,5432}/tcp

모든 변경 사항을 영구적으로 만들고 방화벽을 다시 로드하여 변경 사항을 적용합니다.

$ sudo firewall-cmd --runtime-to-permanent
$ sudo firewall-cmd --reload

2단계 - 호스트 이름 할당

서버의 IP 주소를 사용하거나 사용 가능한 경우 완전한 도메인 이름(FQDN)을 사용할 수 있습니다. 이 튜토리얼에서는 FQDN을 사용할 것이며, 이를 위해 두 서버에서 호스트 이름을 설정해야 합니다.

다음 명령을 사용하여 Odoo 서버에서 호스트 이름을 설정하십시오.

$ sudo hostnamectl set-hostname odoo.yourdomain.com

다음 명령을 사용하여 PostgreSQL 서버에서 호스트 이름을 설정하십시오.

$ sudo hostnamectl set-hostname postgresql.yourdomain.com

Odoo 서버에서 /etc/hosts 파일을 엽니다.

$ sudo nano /etc/hosts

다음과 같이 보이는지 확인하십시오.

127.0.0.1  localhost
127.0.0.1  odoo.yourdomain.com  odoo
10.1.1.10  postgresql.yourdomain.com  postgresql

PostgreSQL 서버에서 파일을 열고 다음과 같이 보이는지 확인하십시오.

127.0.0.1  localhost
127.0.0.1  postgresql.yourdomain.com  postgresql
10.1.2.10  odoo.yourdomain.com  odoo

편집기를 닫으려면 Ctrl + X를 누르고 파일을 저장하라는 메시지가 표시되면 Y를 누릅니다.

3단계 - PostgreSQL 설치 및 구성

Rocky Linux 9는 기본적으로 PostgreSQL 13을 제공하며 PostgreSQL 15는 postgresql:15 모듈 스트림으로 제공됩니다. 그러나 이 튜토리얼을 작성할 당시의 최신 버전인 PostgreSQL 16을 공식 저장소에서 설치할 것입니다.

PostgreSQL 저장소 RPM을 설치합니다.

$ sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-9-x86_64/pgdg-redhat-repo-latest.noarch.rpm

내장 PostgreSQL 모듈을 비활성화합니다.

$ sudo dnf -qy module disable postgresql

PostgreSQL 16을 설치합니다.

$ sudo dnf install -y postgresql16-server postgresql16-contrib

데이터베이스를 초기화합니다.

$ sudo /usr/pgsql-16/bin/postgresql-16-setup initdb

PostgreSQL 서비스를 활성화하고 시작합니다.

$ sudo systemctl enable postgresql-16
$ sudo systemctl start postgresql-16

서비스의 상태를 확인합니다.

$ sudo systemctl status postgresql-16

비슷한 출력을 얻어야 합니다.

? postgresql-16.service - PostgreSQL 16 database server
     Loaded: loaded (/usr/lib/systemd/system/postgresql-16.service; enabled; preset: disabled)
     Active: active (running) since Sun 2024-04-07 02:22:42 UTC; 3s ago
       Docs: https://www.postgresql.org/docs/16/static/
    Process: 8673 ExecStartPre=/usr/pgsql-16/bin/postgresql-16-check-db-dir ${PGDATA} (code=exited, status=0/SUCCESS)
   Main PID: 8678 (postgres)
      Tasks: 7 (limit: 10819)
     Memory: 17.4M
        CPU: 60ms
     CGroup: /system.slice/postgresql-16.service
             ??8678 /usr/pgsql-16/bin/postgres -D /var/lib/pgsql/16/data/
             ??8679 "postgres: logger "
             ??8680 "postgres: checkpointer "
             ??8681 "postgres: background writer "
             ??8683 "postgres: walwriter "
             ??8684 "postgres: autovacuum launcher "
             ??8685 "postgres: logical replication launcher "

Apr 07 02:22:42 postgresql systemd[1]: Starting PostgreSQL 16 database server...
Apr 07 02:22:42 postgresql postgres[8678]: 2024-04-07 02:22:42.370 UTC [8678] LOG:  redirecting log output to logging collector process
Apr 07 02:22:42 postgresql postgres[8678]: 2024-04-07 02:22:42.370 UTC [8678] HINT:  Future log output will appear in directory "log".
Apr 07 02:22:42 postgresql systemd[1]: Started PostgreSQL 16 database server.

다음으로, 데이터베이스 사용자 odoo를 생성해야 합니다. 역할에 대한 비밀번호를 입력하라는 메시지가 표시됩니다. 원하는 강력한 비밀번호를 입력하십시오.

$ sudo -u postgres createuser odoo -U postgres -dP

옵션 -upostgres 사용자로 명령을 실행합니다.

옵션 -U는 연결할 사용자 이름을 나타냅니다.

옵션 -d는 사용자가 데이터베이스를 생성할 수 있는 권한을 부여합니다.

옵션 -p는 새 사용자의 비밀번호를 입력하라는 메시지를 표시합니다.

호스트 기반 인증 구성

PostgreSQL 서비스가 Odoo 서버에 연결할 수 있도록 권한을 부여해야 합니다.

먼저 PostgreSQL 서비스를 중지합니다.

$ sudo systemctl stop postgresql-16

PostgreSQL 클라이언트 인증 파일이 저장된 위치를 찾으려면 PostgreSQL 셸을 시작하는 다음 명령을 실행합니다.

$ sudo -u postgres psql

파일의 위치를 찾기 위해 다음 쿼리를 실행합니다.

postgres=# SHOW hba_file;

다음과 같은 출력을 받을 것입니다.

              hba_file              
------------------------------------
 /var/lib/pgsql/16/data/pg_hba.conf
(1 row)

셸을 종료하려면 exit를 입력하십시오.

편집을 위해 /var/lib/pgsql/16/data/pg_hba.conf 파일을 엽니다.

$ sudo nano /var/lib/pgsql/16/data/pg_hba.conf

다음 줄을 끝에 붙여넣습니다.

host        all         odoo        odoo.yourdomain.com        scram-sha-256

이 줄은 odoo 사용자가 이 서버 내의 모든 데이터베이스에 연결할 수 있는 권한을 부여합니다. all 키워드 대신 데이터베이스 이름을 지정할 수도 있습니다.

편집기를 닫으려면 Ctrl + X를 누르고 파일을 저장하라는 메시지가 표시되면 Y를 누릅니다.

PostgreSQL 수신 주소 구성

다음으로, 데이터베이스 서버가 원격 연결을 수신할 수 있도록 허용해야 합니다.

PostgreSQL 셸을 시작하고 PostgreSQL 구성 파일의 위치를 찾기 위해 다음 명령을 실행합니다.

$ sudo -u postgres psql
postgres=# SHOW config_file;

다음과 같은 출력을 받을 것입니다.

              config_file               
----------------------------------------
 /var/lib/pgsql/16/data/postgresql.conf
(1 row)

셸을 종료하려면 exit를 입력하십시오.

편집을 위해 /var/lib/pgsql/16/data/postgresql.conf 파일을 엽니다.

$ sudo nano /var/lib/pgsql/16/data/postgresql.conf

listen_addresses 줄을 다음과 같이 변경합니다.

#listen_addresses = 'localhost' # what IP address(es) to listen on;

다음과 같이 변경합니다.

listen_addresses = '*'

*는 모든 IP 주소를 수신하도록 설정합니다. Odoo 인스턴스의 IP 주소로 변경할 수 있습니다.

listen_addresses = 'localhost, '

편집기를 닫으려면 Ctrl + X를 누르고 파일을 저장하라는 메시지가 표시되면 Y를 누릅니다.

PostgreSQL 서비스 활성화 및 시작

구성이 완료되었으므로 PostgreSQL 서비스를 시작할 시간입니다.

$ sudo systemctl start postgresql-16    

4단계 - Odoo 설치

Python 3.10 설치

Rocky Linux 9는 Python 3.9를 기본으로 제공하지만 Odoo 17은 Python 3.10 이상이 필요합니다. 따라서 먼저 이를 설치해야 합니다.

현재 사용 가능한 버전을 먼저 확인할 수 있습니다.

$ python --version
Python 3.9.18

Python에 필요한 종속성을 설치합니다.

$ sudo dnf groupinstall "Development Tools"
$ sudo dnf install readline-devel ncurses-devel openssl-devel sqlite-devel tk-devel gdbm-devel libc6-dev libbz2-dev libffi-dev zlib1g-dev
$ sudo dnf install -y openssl-devel bzip2-devel libffi-devel readline-devel ncurses-devel sqlite-devel tk-devel

Python 웹사이트에서 소스 코드를 다운로드합니다. 이 튜토리얼을 작성할 당시 사용한 최신 3.10.x 버전은 3.10.14입니다.

$ wget https://www.python.org/ftp/python/3.10.14/Python-3.10.14.tgz

아카이브를 추출합니다.

$ tar xzf Python-3.10.14.tgz

추출된 디렉토리로 이동합니다.

$ cd Python-3.10.14

소스 코드를 구성합니다.

$ ./configure --enable-optimizations

Python 3.10.14를 설치합니다. altinstall 명령은 시스템의 Python 버전을 덮어쓰지 않도록 사용됩니다.

$ sudo make altinstall

설치가 완료되었는지 확인합니다.

$ python3.10 -V
OR
$ python3.10 --version

다음과 같은 출력을 얻어야 합니다.

Python 3.10.14

다음으로 Python 3.10을 기본 Python 버전으로 설정해야 합니다. 서버에 설치된 각 Python 버전에 대한 심볼릭 링크를 생성합니다. 심볼릭 버전을 생성할 때는 명령에 Python의 정확한 버전을 포함해야 합니다. 다음 명령을 실행하여 심볼릭 링크를 생성합니다.

$ sudo update-alternatives --install /usr/bin/python3 python3 /usr/local/bin/python3.10 1
$ sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.9 2

사용 가능한 Python 버전을 보려면 다음 명령을 사용하십시오.

$ sudo update-alternatives --config python3

다음과 같은 출력을 보게 될 것입니다.

There are 2 programs which provide 'python3'.

  Selection    Command
-----------------------------------------------
   1           /usr/local/bin/python3.10
*+ 2           /usr/bin/python3.9

Enter to keep the current selection[+], or type selection number:

번호 1을 선택하여 Python 3.10으로 전환합니다.

터미널에서 로그아웃한 후 다시 로그인하여 Python 버전을 전환합니다. 이제 python을 직접 사용하여 Python 3.10.14를 사용할 수 있습니다.

종속성 설치 및 설치 준비

Odoo 프로세스를 관리하기 위해 Odoo 서버에서 홈 디렉토리를 /opt/odoo로 설정하여 새로운 시스템 사용자를 생성합니다. 이는 루트 사용자로 실행하여 발생할 수 있는 보안 위험을 방지하기 위함입니다.

$ sudo useradd -m -d /opt/odoo -U -r -s /bin/bash odoo

Odoo 17 설정에 필요한 시스템 종속성을 설치합니다.

$ sudo dnf install -y git libxslt-devel bzip2-devel openldap-devel libjpeg-devel freetype-devel libpq-devel

Nodejs를 설치합니다. Rocky Linux 9는 현재 LTS 버전인 Node 18.x를 기본으로 제공합니다. 그러나 우리는 공식 Nodesource 저장소를 사용할 것입니다.

Node 20 저장소를 추가합니다.

$ curl -fsSL https://rpm.nodesource.com/setup_20.x | sudo bash -

Nodejs를 설치합니다.

$ sudo dnf -y install nodejs

Node 버전을 확인합니다.

$ node --version
v20.12.1

Node를 사용하여 Less CSS 패키지를 설치합니다. 오른쪽에서 왼쪽으로 인터페이스가 있는 언어를 사용하는 경우 rtlcss 패키지도 설치하십시오.

$ sudo npm install -g less rtlcss

wkhtmltopdf를 설치합니다. 우리는 Wkhtmltopdf GitHub 패키징 저장소에서 RPM 패키지를 사용할 것입니다. 이 튜토리얼을 작성할 당시 사용 가능한 최신 버전은 0.12.6.1 r3입니다.

Wkhtmltopdf RPM을 다운로드합니다.

$ cd ~
$ wget https://github.com/wkhtmltopdf/packaging/releases/download/0.12.6.1-3/wkhtmltox-0.12.6.1-3.almalinux9.x86_64.rpm

Wkhtmltopdf에 필요한 글꼴을 설치합니다.

$ sudo dnf install xorg-x11-fonts-75dpi.noarch xorg-x11-fonts-Type1.noarch

Wkhtmltopdf를 설치합니다.

$ sudo rpm -i wkhtmltox-0.12.6.1-3.almalinux9.x86_64.rpm

설치된 wkhtmltopdf의 버전을 확인합니다.

$ wkhtmltopdf --version
wkhtmltopdf 0.12.6.1 (with patched qt)

Odoo 파일 다운로드

Odoo 시스템 사용자로 전환합니다.

$ sudo su - odoo

Odoo의 GitHub 저장소를 시스템에 클론합니다.

$ git clone https://github.com/odoo/odoo.git --depth 1 --branch 17.0 --single-branch

우리의 목적을 위해 Odoo를 /opt/odoo 디렉토리에 복사하고 여기에서 설치할 것입니다. 이렇게 하면 설치에 사용할 /opt/odoo/odoo 디렉토리가 생성됩니다.

가상 환경 Python 환경 설정

이 단계는 선택 사항이지만 Odoo에 대한 가상 Python 환경을 설정하면 운영 체제의 Python 모듈과의 충돌을 피하는 데 도움이 되므로 권장됩니다.

이를 위해 virtualenv를 사용할 것입니다.

  1. Odoo를 위한 새로운 virtualenv 환경을 생성합니다. $ python3 -m venv odoo-env
  2. 가상 환경을 활성화합니다. 시스템 사용자의 홈 디렉토리 아래에 환경을 생성하고 있습니다. 원하는 위치를 선택할 수 있습니다. $ source odoo-env/bin/activate
  3. 만일을 대비해 PIP를 업데이트합니다. (odoo-env) $ pip3 install --upgrade pip
  4. 가상 환경에 Python의 wheel을 설치합니다. $ pip3 install wheel

Python 종속성 설치

Odoo 17에 필요한 Python 종속성을 설치합니다.

$ pip3 install -r /opt/odoo/odoo/requirements.txt

요구 사항이 설치되는 데 시간이 걸리므로 인내심을 가지십시오.

설치된 Python 모듈 목록을 확인하여 요구 사항이 올바르게 설치되었는지 확인합니다.

$ pip3 list
Package           Version
----------------- --------
attrs             23.2.0
Babel             2.9.1
beautifulsoup4    4.12.3
cached-property   1.5.2
certifi           2024.2.2
cffi              1.16.0
chardet           4.0.0
cryptography      3.4.8
decorator         4.4.2
docopt            0.6.2
docutils          0.17
ebaysdk           2.1.5
freezegun         1.1.0
geoip2            2.9.0
gevent            21.8.0
greenlet          1.1.2
idna              2.10
isodate           0.6.1
Jinja2            3.0.3
libsass           0.20.1
lxml              4.8.0
MarkupSafe        2.0.1
maxminddb         2.6.0
num2words         0.5.10
ofxparse          0.21
passlib           1.7.4
Pillow            9.0.1
pip               24.0
platformdirs      4.2.0
polib             1.1.1
psutil            5.9.0
psycopg2          2.9.2
pyasn1            0.6.0
pyasn1_modules    0.4.0
pycparser         2.22
pydot             1.4.2
pyOpenSSL         21.0.0
pyparsing         3.1.2
PyPDF2            1.26.0
pyserial          3.5
python-dateutil   2.8.1
python-ldap       3.4.0
python-stdnum     1.17
pytz              2024.1
pyusb             1.2.1
qrcode            7.3.1
reportlab         3.6.8
requests          2.25.1
requests-file     2.0.0
requests-toolbelt 1.0.0
rjsmin            1.1.0
setuptools        65.5.0
six               1.16.0
soupsieve         2.5
urllib3           1.26.5
vobject           0.9.6.1
Werkzeug          2.0.2
wheel             0.43.0
xlrd              1.2.0
XlsxWriter        3.0.2
xlwt              1.3.0
zeep              4.1.0
zope.event        5.0
zope.interface    6.2

Python 가상 환경에서 나옵니다.

$ deactivate

제3자 애드온을 위한 디렉토리 생성

$ mkdir /opt/odoo/odoo/custom-addons

이 디렉토리는 Odoo가 모듈을 찾는 디렉토리를 정의하는 addons_path 매개변수에 추가되어야 합니다. Odoo 시스템 사용자에서 나옵니다.

$ exit

5단계 - Odoo 구성

기본 Odoo 구성 파일을 복사하여 새 파일을 만듭니다.

$ sudo cp /opt/odoo/odoo/debian/odoo.conf /etc/odoo.conf

편집을 위해 파일을 엽니다.

$ sudo nano /etc/odoo.conf

파일을 다음과 같이 수정합니다.

[options]
; This is the password that allows database operations:
admin_passwd = admin
db_host = postgresql.yourdomain.com
db_port = False
db_user = odoo
db_password = odoo_password
addons_path = /opt/odoo/odoo/addons, /opt/odoo/odoo/custom-addons
xmlrpc_port = 8069
default_productivity_apps = True

편집기를 닫으려면 Ctrl + X를 누르고 파일을 저장하라는 메시지가 표시되면 Y를 누릅니다.

admin_passwd 옵션은 Odoo GUI 내에서 관리 작업을 허용하는 비밀번호입니다. 안전한 비밀번호를 선택하십시오.

db_host 옵션은 PostgreSQL 서버의 FQDN 또는 IP 주소입니다.

db_port 옵션은 기본 PostgreSQL 포트 5432가 사용되고 있으므로 false로 설정됩니다. 다른 포트를 사용하려면 이 값을 업데이트해야 합니다.

db_user 옵션은 PostgreSQL 사용자 이름입니다.

db_password 옵션은 이전에 PostgreSQL 서버에서 생성한 PostgreSQL ‘odoo’ 사용자 비밀번호입니다.

addons_path 옵션은 기본 애드온 경로입니다. 애드온에 대한 사용자 지정 경로를 추가할 수도 있으며, 쉼표로 구분합니다.

xmlrpc_port 옵션은 Odoo가 수신하는 포트입니다.

default_productivity_apps 옵션은 기본 생산성 앱(즉, 직원, 이메일 마케팅, 프로젝트 및 설문조사)이 활성화된 상태로 유지되도록 합니다. 이 네 가지 앱은 Odoo 커뮤니티 에디션의 기본 앱입니다. 엔터프라이즈 에디션에서는 기본적으로 활성화할 수 있는 추가 생산성 앱이 있습니다.

Odoo 서비스 생성

시스템이 재부팅된 후에도 Odoo가 계속 실행되도록 하려면 Odoo 서비스를 생성해야 합니다.

/lib/systemd/system/odoo-server.service 파일을 생성하고 편집을 위해 엽니다.

$ sudo nano /lib/systemd/system/odoo-server.service

다음 코드를 붙여넣습니다.

[Unit]
Description=Odoo Open Source ERP and CRM
Requires=postgresql-16.service
After=network.target postgresql-16.service

[Service]
Type=simple
SyslogIdentifier=odoo-server
User=odoo
Group=odoo
ExecStart=/opt/odoo/odoo-env/bin/python3 /opt/odoo/odoo/odoo-bin --config=/etc/odoo.conf --addons-path=/opt/odoo/odoo/addons/ --logfile /var/log/odoo/odoo-server.log
WorkingDirectory=/opt/odoo/odoo/
StandardOutput=journal+console
KillMode=mixed

[Install]
WantedBy=multi-user.target

/home/를 Python 가상 환경을 설치하기 위해 선택한 위치로 바꿉니다.

편집기를 닫으려면 Ctrl + X를 누르고 파일을 저장하라는 메시지가 표시되면 Y를 누릅니다.

Odoo 로그 디렉토리 생성

$ sudo mkdir /var/log/odoo

파일 권한 설정

odoo-server.service 파일에 대한 권한을 설정하여 Odoo 사용자만 읽거나 실행할 수 있도록 합니다.

$ sudo chmod 755 /lib/systemd/system/odoo-server.service
$ sudo chown odoo: /lib/systemd/system/odoo-server.service

Python 환경, Odoo 설치 및 로그 디렉토리에 대한 소유권을 설정합니다.

$ sudo chown -R odoo: /opt/odoo/
$ sudo chown -R odoo: /opt/odoo/odoo-env
$ sudo chown -R odoo: /var/log/odoo

Odoo 구성 파일의 소유권을 제한합니다.

$ sudo chown odoo: /etc/odoo.conf
$ sudo chmod 640 /etc/odoo.conf

Odoo 서버 시작

Odoo 서버를 시작하고 활성화합니다.

$ sudo systemctl start odoo-server
$ sudo systemctl enable odoo-server

서버의 상태를 확인합니다.

$ sudo systemctl status odoo-server
? odoo-server.service - Odoo Open Source ERP and CRM
     Loaded: loaded (/usr/lib/systemd/system/odoo-server.service; enabled; preset: disabled)
     Active: active (running) since Tue 2024-04-09 23:59:38 UTC; 1s ago
   Main PID: 102598 (python3)
      Tasks: 4 (limit: 10736)
     Memory: 69.6M
        CPU: 895ms
     CGroup: /system.slice/odoo-server.service
             ??102598 /opt/odoo/odoo-env/bin/python3 /opt/odoo/odoo/odoo-bin --config=/etc/odoo.conf --addons-path=/opt/odoo/odoo/addons/ --logfile /var/log/odoo/odoo-server.log

Apr 09 23:59:38 odoo.yourdomain.com systemd[1]: Started Odoo Open Source ERP and CRM.

6단계 - Nginx 설치 및 구성

Rocky Linux 9는 이전 버전의 Nginx를 제공합니다. 최신 버전을 설치하려면 공식 Nginx 저장소를 사용해야 합니다.

/etc/yum.repos.d/nginx.repo 파일을 생성하고 편집을 위해 엽니다.

$ sudo nano /etc/yum.repos.d/nginx.repo

다음 코드를 붙여넣습니다.

[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

작업이 끝나면 Ctrl + X를 눌러 파일을 저장하라는 메시지가 표시되면 Y를 누릅니다. 우리는 위 파일에서 메인라인 섹션 아래에 enabled=1을 사용하여 메인라인 저장소를 활성화했으므로 메인라인 버전을 사용할 것입니다. 둘 중 하나를 선택할 수 있습니다.

Nginx를 설치합니다.

$ sudo dnf install -y nginx

설치가 완료되었는지 확인합니다.

$ nginx -v
nginx version: nginx/1.25.4

Nginx 서버 서비스를 활성화하고 시작합니다.

$ sudo systemctl enable nginx --now

서비스 상태를 확인합니다.

$ sudo systemctl status nginx
? nginx.service - nginx - high performance web server
     Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; preset: disabled)
     Active: active (running) since Wed 2024-04-10 06:52:14 UTC; 3s ago
       Docs: http://nginx.org/en/docs/
    Process: 103452 ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf (code=exited, status=0/SUCCESS)
   Main PID: 103453 (nginx)
      Tasks: 3 (limit: 10736)
     Memory: 3.1M
        CPU: 17ms
     CGroup: /system.slice/nginx.service
             ??103453 "nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf"
             ??103454 "nginx: worker process"
             ??103455 "nginx: worker process"

7단계 - SSL 설치

Certbot을 설치하여 Let’s Encrypt에서 제공하는 무료 SSL 인증서를 생성해야 합니다. 이를 위해 Snapd 패키지 설치 관리자를 사용할 것입니다. EPEL(Extra Packages for Enterprise Linux) 저장소가 필요합니다.

EPEL 저장소를 설치합니다.

$ sudo dnf install -y epel-release

Rocky Linux 9에는 Snapd가 설치되어 있지 않습니다. Snapd 패키지를 설치합니다.

$ sudo dnf install -y snapd

Snap 서비스를 활성화하고 시작합니다.

$ sudo systemctl enable snapd --now

Snap 코어 패키지를 설치하고 Snapd 버전이 최신인지 확인합니다.

$ sudo snap install core
$ sudo snap refresh core

Snapd가 작동하도록 필요한 링크를 생성합니다.

$ sudo ln -s /var/lib/snapd/snap /snap
$ echo 'export PATH=$PATH:/var/lib/snapd/snap/bin' | sudo tee -a /etc/profile.d/snapd.sh

Certbot을 설치합니다.

$ sudo snap install --classic certbot

Certbot 명령이 /usr/bin 디렉토리에서 실행될 수 있도록 심볼릭 링크를 생성합니다.

$ sudo ln -s /snap/bin/certbot /usr/bin/certbot

Certbot이 제대로 작동하는지 확인합니다.

$ certbot --version
certbot 2.10.0

인증서를 생성합니다. DHParams 인증서도 생성해야 합니다.

$ sudo certbot certonly --nginx --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m [email protected] -d odoo.yourdomain.com

Diffie-Hellman 키 교환 인증서를 생성합니다.

$ sudo openssl dhparam -dsaparam -out /etc/ssl/certs/dhparam.pem 4096

Certbot 갱신 스케줄러 서비스 확인합니다.

$ sudo systemctl list-timers

스케줄된 서비스 중 하나로 snap.certbot.renew.service를 찾을 수 있습니다.

NEXT                        LEFT          LAST                        PASSED   UNIT                         ACTIVATES
....                        ....          ....                        ......   ....                         ..........
Wed 2024-04-10 13:32:11 UTC 1h 42min left Wed 2024-04-10 11:43:41 UTC 5min ago dnf-makecache.timer          dnf-makecache.service
Wed 2024-04-10 19:08:00 UTC 7h left       -                           -        snap.certbot.renew.timer     snap.certbot.renew.service
Thu 2024-04-11 00:00:00 UTC 12h left      Wed 2024-04-10 00:00:36 UTC 11h ago  logrotate.timer              logrotate.service

SSL 갱신이 잘 작동하는지 확인하기 위해 프로세스를 드라이 런합니다.

$ sudo certbot renew --dry-run

오류가 없으면 모든 설정이 완료된 것입니다. 인증서는 자동으로 갱신됩니다.

8단계 - Nginx 구성

Nginx를 통해 실행하려면 Odoo를 로컬호스트에서 실행해야 합니다. 이를 변경하기 위해 Odoo 서비스를 중지합니다.

$ sudo systemctl stop odoo-server

Odoo 서버 구성 파일을 엽니다.

$ sudo nano /etc/odoo.conf

다음 줄을 추가합니다.

xmlrpc_interface = 127.0.0.1
proxy_mode = True

Odoo를 위한 Nginx 구성 파일을 생성합니다.

$ sudo nano /etc/nginx/conf.d/odoo.conf

아래 코드를 붙여넣습니다.

#odoo server
upstream odoo {
 server 127.0.0.1:8069;
}
upstream odoochat {
 server 127.0.0.1:8072;
}
map $http_upgrade $connection_upgrade {
  default upgrade;
  ''      close;
}
map $sent_http_content_type $content_type_csp {
    default "";
    ~image/ "default-src 'none'";
}

# http -> https
server {
   listen 80;
   listen [::]:80;
   server_name odoo.yourdomain.com;
   return 301 https://$host$request_uri;
}

server {
 listen 443 ssl;
 listen [::]:443 ssl;
 http2 on;
 http3 on;
 quic_retry on;

 server_name odoo.yourdomain.com;

 proxy_read_timeout 720s;
 proxy_connect_timeout 720s;
 proxy_send_timeout 720s;

 # Add Headers for odoo proxy mode
 proxy_set_header X-Forwarded-Host $host;
 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
 proxy_set_header X-Forwarded-Proto $scheme;
 proxy_set_header X-Real-IP $remote_addr;

 # SSL parameters
 ssl_certificate /etc/letsencrypt/live/odoo.yourdomain.com/fullchain.pem;
 ssl_certificate_key /etc/letsencrypt/live/odoo.yourdomain.com/privkey.pem;
 ssl_trusted_certificate /etc/letsencrypt/live/odoo.yourdomain.com/chain.pem;

 ssl_session_timeout 30m;
 ssl_session_cache shared:MozSSL:10m;  # about 40000 sessions
 ssl_session_tickets off;

 ssl_protocols TLSv1.2 TLSv1.3;
 ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
 ssl_ecdh_curve X25519:prime256v1:secp384r1:secp521r1;
 ssl_prefer_server_ciphers off;
 ssl_stapling on;
 ssl_stapling_verify on;
 ssl_dhparam /etc/ssl/certs/dhparam.pem;

 # log
 access_log /var/log/nginx/odoo.access.log;
 error_log /var/log/nginx/odoo.error.log;

 # Redirect longpoll requests to odoo longpolling port
 location /longpolling {
   proxy_pass http://odoochat;
 }

 location /websocket {
   proxy_pass http://odoochat;
   proxy_set_header Upgrade $http_upgrade;
   proxy_set_header Connection $connection_upgrade;
   proxy_set_header X-Forwarded-Host $http_host;
   proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
   proxy_set_header X-Forwarded-Proto $scheme;
   proxy_set_header X-Real-IP $remote_addr;
   proxy_cookie_flags session_id samesite=lax secure;  # requires nginx 1.19.8
 }

 # Redirect requests to odoo backend server
 location / {
  # Add Headers for odoo proxy mode
   proxy_set_header X-Forwarded-Host $http_host;
   proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
   proxy_set_header X-Forwarded-Proto $scheme;
   proxy_set_header X-Real-IP $remote_addr;
   proxy_redirect off;
   proxy_pass http://odoo;
   proxy_cookie_flags session_id samesite=lax secure;  # requires nginx 1.19.8
 }

 # common gzip
 gzip_types text/css text/scss text/plain text/xml application/xml application/json application/javascript;
 gzip on;

 # Serve static files right away
 location ~ ^/[^/]+/static/.+$ {
   # root and try_files both depend on your addons paths
   root /opt/odoo/odoo;
   try_files /opt/odoo/odoo/addons$uri @odoo;
   expires 24h;
   add_header Content-Security-Policy $content_type_csp;
 }
}

편집기를 닫으려면 Ctrl + X를 누르고 파일을 저장하라는 메시지가 표시되면 Y를 누릅니다.

/etc/nginx/nginx.conf 파일을 편집하기 위해 엽니다.

$ sudo nano /etc/nginx/nginx.conf

include /etc/nginx/conf.d/*.conf; 줄 앞에 다음 줄을 추가합니다.

server_names_hash_bucket_size 64;

Ctrl + X를 눌러 파일을 저장하라는 메시지가 표시되면 Y를 누릅니다.

Nginx 구성을 테스트합니다.

$ sudo nginx -t

오류가 없으면 준비가 완료된 것입니다. Nginx 서버를 재시작합니다.

$ sudo systemctl restart nginx

9단계 - Odoo 시작

모든 설정이 완료된 후 Odoo 서버를 다시 시작할 수 있습니다.

$ sudo systemctl start odoo-server

브라우저에서 https://odoo.yourdomain.com으로 Odoo를 실행합니다. 브라우저에서 http://:8069 또는 http://odoo.yourdomain.com:8069 URL을 엽니다. 모든 것이 제대로 작동하면 Odoo의 데이터베이스 생성 화면이 표시됩니다.

이메일과 비밀번호를 선택하여 로그인 자격 증명을 생성합니다. 마스터 비밀번호는 /etc/odoo.conf 파일에 추가한 admin_passwd입니다. 나머지 필드를 모두 입력하십시오.

데이터베이스를 샘플 데이터로 채우려면 Demo Data 필드를 체크하십시오. 인터넷에 노출된 서버에서는 데모 데이터를 설치하지 마십시오. 데모 데이터가 포함된 데이터베이스는 시스템에 접근할 수 있는 기본 로그인 및 비밀번호를 포함하고 있어 상당한 문제를 일으킬 수 있습니다. 우리는 오직 튜토리얼 목적으로만 사용하고 있습니다.

Create database 버튼을 클릭하여 설치를 완료합니다. 데이터베이스를 처음 생성할 때 애드온 페이지가 로드되는 데 시간이 걸리므로 페이지를 새로 고치지 마십시오. 데이터베이스가 생성되면 자동으로 다음 로그인 페이지로 리디렉션됩니다.

이전 단계에서 사용한 자격 증명을 입력하여 Odoo ERP에 로그인하면 아래와 같은 대시보드 페이지로 이동합니다. 데모 데이터로 미리 채워져 있습니다. 데이터베이스 생성 페이지에서 데모 데이터 옵션을 체크하지 않았다면 훨씬 더 깔끔한 대시보드를 보게 될 것입니다.

여기에서 비즈니스를 관리하기 위해 Odoo를 사용할 수 있습니다.

10단계 - Odoo 업데이트

Odoo 서버를 중지합니다.

$ sudo systemctl stop odoo-server

Odoo 시스템 사용자로 전환합니다.

$ sudo su - odoo

GitHub에서 최신 소스 코드를 가져옵니다.

$ git fetch
$ git rebase --autostash

두 번째 명령은 소스 코드를 수동으로 변경하면 충돌이 발생할 수 있습니다. 충돌이 발생한 파일 목록이 제공됩니다. 모든 파일을 수동으로 변경하고 명령을 다시 실행하여 문제를 해결해야 합니다.

충돌하는 변경 사항을 버리려면 다음 명령을 실행하여 소스를 재설정할 수 있습니다.

$ git reset --hard

Python 가상 환경을 활성화합니다.

$ source odoo-env/bin/activate

Python 종속성을 설치합니다.

$ pip3 install -r /opt/odoo/odoo/requirements.txt

Python 가상 환경에서 나옵니다.

$ deactivate

Odoo 서버를 시작합니다.

$ sudo systemctl start odoo-server

11단계 - Fail2Ban을 사용하여 Odoo 보안 강화

이 단계는 선택 사항이지만 Fail2Ban이 설치되어 있는 경우 Odoo를 보호하기 위한 구성을 추가할 수 있습니다.

odoo-login.conf 파일을 생성하고 편집을 위해 엽니다.

$ sudo nano /etc/fail2ban/jail.d/odoo-login.conf

다음 코드를 붙여넣습니다.

[odoo-login]
enabled = true
port = http,https
bantime = 900  ; 15 min ban
maxretry = 10  ; if 10 attempts
findtime = 60  ; within 1 min  /!\ Should be adjusted with the TZ offset
logpath = /var/log/odoo.log  ;  set the actual odoo log path here

편집기를 닫으려면 Ctrl + X를 누르고 파일을 저장하라는 메시지가 표시되면 Y를 누릅니다.

odoo-login.conf 필터 파일을 생성하고 편집을 위해 엽니다.

$ sudo nano /etc/fail2ban/filter.d/odoo-login.conf

다음 코드를 붙여넣습니다.

[Definition]
failregex = ^ \d+ INFO \S+ \S+ Login failed for db:\S+ login:\S+ from 
ignoreregex =

편집기를 닫으려면 Ctrl + X를 누르고 파일을 저장하라는 메시지가 표시되면 Y를 누릅니다.

Fail2Ban을 재시작합니다.

$ sudo systemctl restart fail2ban

결론

이로써 Rocky Linux 9 서버에 Odoo를 설치하고 구성하는 튜토리얼이 마무리되었습니다. 질문이 있으시면 아래 댓글로 남겨주세요.

Share: X/Twitter LinkedIn

새 게시물을 받은 편지함에서 받기

스팸은 없습니다. 언제든지 구독 해지 가능합니다.