Odoo 설치 · 18 min read · Nov 17, 2025
Rocky Linux 9에 Odoo 17 ERP 소프트웨어 설치하는 방법

Odoo(구 OpenERP)는 CRM, 전자상거래, 회계, 재고, 프로젝트 관리 및 판매 시점을 포함한 다양한 비즈니스 요구를 위한 10,000개 이상의 오픈 소스 애플리케이션으로 구성된 자체 호스팅 스위트입니다. 이러한 애플리케이션은 완전히 통합되어 있으며 친숙한 웹 인터페이스를 통해 접근할 수 있습니다.
이 튜토리얼에서는 Rocky Linux 9 서버에 Odoo 16 스택을 설치하는 방법을 배웁니다.
필수 조건
- Odoo 스택을 호스팅하기 위한 최소 2GB RAM을 갖춘 Rocky Linux 9 서버.
- PostgreSQL 데이터베이스를 호스팅하기 위한 최소 2GB RAM을 갖춘 두 번째 Rocky Linux 9 서버. 그러나 Odoo와 동일한 서버에 데이터베이스를 설치할 수 있지만, 프로덕션 환경에서는 별도의 서버에 설치하는 것이 강력히 권장됩니다. 원하는 공급자의 관리형 데이터베이스 옵션 중 하나를 선택할 수도 있습니다.
- RAM 요구 사항은 스택을 사용할 동시 사용자 수에 따라 달라집니다. 시스템 요구 사항을 계산하는 방법에 대한 자세한 가이드는 Odoo의 문서에서 확인할 수 있습니다.
- 시스템을 업데이트 상태로 유지하십시오.
$ sudo dnf update - 두 서버 모두에서 sudo 권한이 있는 비루트 사용자.
- Fail2Ban이 설치되어 있어야 합니다. 이 단계는 선택 사항입니다. Rocky Linux에 Fail2Ban을 설치하는 방법에 대한 가이드를 따를 수 있습니다.
- SELinux는 비활성화되어야 합니다.
- 시스템에서 필요한 몇 가지 패키지.
$ 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 --reload2단계 - 호스트 이름 할당
서버의 IP 주소를 사용하거나 사용 가능한 경우 완전한 도메인 이름(FQDN)을 사용할 수 있습니다. 이 튜토리얼에서는 FQDN을 사용할 것이며, 이를 위해 두 서버에서 호스트 이름을 설정해야 합니다.
다음 명령을 사용하여 Odoo 서버에서 호스트 이름을 설정하십시오.
$ sudo hostnamectl set-hostname odoo.yourdomain.com다음 명령을 사용하여 PostgreSQL 서버에서 호스트 이름을 설정하십시오.
$ sudo hostnamectl set-hostname postgresql.yourdomain.comOdoo 서버에서 /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 postgresqlPostgreSQL 서버에서 파일을 열고 다음과 같이 보이는지 확인하십시오.
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 postgresqlPostgreSQL 16을 설치합니다.
$ sudo dnf install -y postgresql16-server postgresql16-contrib데이터베이스를 초기화합니다.
$ sudo /usr/pgsql-16/bin/postgresql-16-setup initdbPostgreSQL 서비스를 활성화하고 시작합니다.
$ 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옵션 -u는 postgres 사용자로 명령을 실행합니다.
옵션 -U는 연결할 사용자 이름을 나타냅니다.
옵션 -d는 사용자가 데이터베이스를 생성할 수 있는 권한을 부여합니다.
옵션 -p는 새 사용자의 비밀번호를 입력하라는 메시지를 표시합니다.
호스트 기반 인증 구성
PostgreSQL 서비스가 Odoo 서버에 연결할 수 있도록 권한을 부여해야 합니다.
먼저 PostgreSQL 서비스를 중지합니다.
$ sudo systemctl stop postgresql-16PostgreSQL 클라이언트 인증 파일이 저장된 위치를 찾으려면 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.conflisten_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.18Python에 필요한 종속성을 설치합니다.
$ 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-develPython 웹사이트에서 소스 코드를 다운로드합니다. 이 튜토리얼을 작성할 당시 사용한 최신 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-optimizationsPython 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 odooOdoo 17 설정에 필요한 시스템 종속성을 설치합니다.
$ sudo dnf install -y git libxslt-devel bzip2-devel openldap-devel libjpeg-devel freetype-devel libpq-develNodejs를 설치합니다. 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 nodejsNode 버전을 확인합니다.
$ node --version
v20.12.1Node를 사용하여 Less CSS 패키지를 설치합니다. 오른쪽에서 왼쪽으로 인터페이스가 있는 언어를 사용하는 경우 rtlcss 패키지도 설치하십시오.
$ sudo npm install -g less rtlcsswkhtmltopdf를 설치합니다. 우리는 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.rpmWkhtmltopdf에 필요한 글꼴을 설치합니다.
$ sudo dnf install xorg-x11-fonts-75dpi.noarch xorg-x11-fonts-Type1.noarchWkhtmltopdf를 설치합니다.
$ 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 - odooOdoo의 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를 사용할 것입니다.
- Odoo를 위한 새로운
virtualenv환경을 생성합니다.$ python3 -m venv odoo-env - 가상 환경을 활성화합니다. 시스템 사용자의 홈 디렉토리 아래에 환경을 생성하고 있습니다. 원하는 위치를 선택할 수 있습니다.
$ source odoo-env/bin/activate - 만일을 대비해 PIP를 업데이트합니다.
(odoo-env) $ pip3 install --upgrade pip - 가상 환경에 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.2Python 가상 환경에서 나옵니다.
$ deactivate제3자 애드온을 위한 디렉토리 생성
$ mkdir /opt/odoo/odoo/custom-addons이 디렉토리는 Odoo가 모듈을 찾는 디렉토리를 정의하는 addons_path 매개변수에 추가되어야 합니다. Odoo 시스템 사용자에서 나옵니다.
$ exit5단계 - 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.servicePython 환경, Odoo 설치 및 로그 디렉토리에 대한 소유권을 설정합니다.
$ sudo chown -R odoo: /opt/odoo/
$ sudo chown -R odoo: /opt/odoo/odoo-env
$ sudo chown -R odoo: /var/log/odooOdoo 구성 파일의 소유권을 제한합니다.
$ sudo chown odoo: /etc/odoo.conf
$ sudo chmod 640 /etc/odoo.confOdoo 서버 시작
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.4Nginx 서버 서비스를 활성화하고 시작합니다.
$ 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-releaseRocky Linux 9에는 Snapd가 설치되어 있지 않습니다. Snapd 패키지를 설치합니다.
$ sudo dnf install -y snapdSnap 서비스를 활성화하고 시작합니다.
$ sudo systemctl enable snapd --nowSnap 코어 패키지를 설치하고 Snapd 버전이 최신인지 확인합니다.
$ sudo snap install core
$ sudo snap refresh coreSnapd가 작동하도록 필요한 링크를 생성합니다.
$ sudo ln -s /var/lib/snapd/snap /snap
$ echo 'export PATH=$PATH:/var/lib/snapd/snap/bin' | sudo tee -a /etc/profile.d/snapd.shCertbot을 설치합니다.
$ sudo snap install --classic certbotCertbot 명령이 /usr/bin 디렉토리에서 실행될 수 있도록 심볼릭 링크를 생성합니다.
$ sudo ln -s /snap/bin/certbot /usr/bin/certbotCertbot이 제대로 작동하는지 확인합니다.
$ 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.comDiffie-Hellman 키 교환 인증서를 생성합니다.
$ sudo openssl dhparam -dsaparam -out /etc/ssl/certs/dhparam.pem 4096Certbot 갱신 스케줄러 서비스 확인합니다.
$ 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.serviceSSL 갱신이 잘 작동하는지 확인하기 위해 프로세스를 드라이 런합니다.
$ sudo certbot renew --dry-run오류가 없으면 모든 설정이 완료된 것입니다. 인증서는 자동으로 갱신됩니다.
8단계 - Nginx 구성
Nginx를 통해 실행하려면 Odoo를 로컬호스트에서 실행해야 합니다. 이를 변경하기 위해 Odoo 서비스를 중지합니다.
$ sudo systemctl stop odoo-serverOdoo 서버 구성 파일을 엽니다.
$ sudo nano /etc/odoo.conf다음 줄을 추가합니다.
xmlrpc_interface = 127.0.0.1
proxy_mode = TrueOdoo를 위한 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.confinclude /etc/nginx/conf.d/*.conf; 줄 앞에 다음 줄을 추가합니다.
server_names_hash_bucket_size 64;Ctrl + X를 눌러 파일을 저장하라는 메시지가 표시되면 Y를 누릅니다.
Nginx 구성을 테스트합니다.
$ sudo nginx -t오류가 없으면 준비가 완료된 것입니다. Nginx 서버를 재시작합니다.
$ sudo systemctl restart nginx9단계 - Odoo 시작
모든 설정이 완료된 후 Odoo 서버를 다시 시작할 수 있습니다.
$ sudo systemctl start odoo-server브라우저에서 https://odoo.yourdomain.com으로 Odoo를 실행합니다. 브라우저에서 http:// 또는 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-serverOdoo 시스템 사용자로 전환합니다.
$ sudo su - odooGitHub에서 최신 소스 코드를 가져옵니다.
$ git fetch
$ git rebase --autostash두 번째 명령은 소스 코드를 수동으로 변경하면 충돌이 발생할 수 있습니다. 충돌이 발생한 파일 목록이 제공됩니다. 모든 파일을 수동으로 변경하고 명령을 다시 실행하여 문제를 해결해야 합니다.
충돌하는 변경 사항을 버리려면 다음 명령을 실행하여 소스를 재설정할 수 있습니다.
$ git reset --hardPython 가상 환경을 활성화합니다.
$ source odoo-env/bin/activatePython 종속성을 설치합니다.
$ pip3 install -r /opt/odoo/odoo/requirements.txtPython 가상 환경에서 나옵니다.
$ deactivateOdoo 서버를 시작합니다.
$ sudo systemctl start odoo-server11단계 - 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를 설치하고 구성하는 튜토리얼이 마무리되었습니다. 질문이 있으시면 아래 댓글로 남겨주세요.
새 게시물을 받은 편지함에서 받기
스팸은 없습니다. 언제든지 구독 해지 가능합니다.