annyoung

flask with libreoffice (docx to pdf) 본문

프로그래밍

flask with libreoffice (docx to pdf)

nopsled 2022. 2. 25. 20:03

docx에서 pdf로 변환하는 API를 만들고 있는데, 여러 이슈가 발생했다.

 

첫 번째로, docx 생성을 위해 tmp 디렉토리에 접근이 불가능한 에러가 발생했다. (/tmp/가 아닌 실행 경로의 ./tmp이다.)

PermissionError: [Errno 13] Permission denied: 'tmp/17b2e17c-17ed-4a02-8a3b-e9a9e5e17758.docx'

이 이슈는 uwsgi가 www-data 권한으로 돌아가고 있기 때문인데, ./tmp는 root:root로 설정되어 있기 때문에 골머리 썩기 싫기 때문에 uwsgi 돌리는 권한을 root 퍼미션으로 줬다.

 

그리고, libreoffice와 관련된 모든 파일들도 root 권한으로 설정되어 있기 때문에 어쩔 수 없이 uwsgi 권한도 root로 주는게 맞다고 본다.

 

systemd에 등록해 놓은 데몬에서 다음과 같이 User, Group을 root로 주고 서버를 재시작했다.

[Unit]
Description=uWSGI instance to serve copies-
After=network.target

[Service]
#User=www-data
#Group=www-data
# Sorry for root... smlee....
User=root
Group=root


이로써 docx가 생성은 됐으나 두번째 이슈가 발생했고 컨버팅된 파일을 찾을 수 없다고 한다.

FileNotFoundError: [Errno 2] No such file or directory: 'tmp/201b182f-4276-48c4-9bfa-d2f76163c016.pdf'


이 말은, docx는 생성이 됐으나 컨버팅이 안됐다는 뜻인데, uwsgi 로그를 보니 다음과 같은 에러가 발생했다.

/usr/bin/libreoffice: 46: dirname: not found
/usr/bin/libreoffice: 48: basename: not found
/usr/bin/libreoffice: 49: sed: not found
/usr/bin/libreoffice: 49: ls: not found
/usr/bin/libreoffice: 51: dirname: not found
/usr/bin/libreoffice: 145: grep: not found
/usr/bin/libreoffice: 151: uname: not found
/usr/bin/libreoffice: 191: exec: /var/www/copies-server/oosplash: not found


뭔 에러지..? 보아하니 다음 이슈와 같았다.

https://ask.libreoffice.org/t/ce-usr-lib64-libreoffice-program-soffice-line-54-dirname-command-not-found/32388


그래서 뭔가 환경변수 에러인것 같아서 환경변수를 뽑아보니 다음과 같이 `PATH`에 대한 환경변수가 다음 뿐이었다.

{'LANG': 'C.UTF-8', 'PATH': '/var/www/copies-sever/venv/bin', 'HOME': '/root', 'LOGNAME': 'root', 'USER': 'root', 'SHELL': '/bin/sh', 'INVOCATION_ID': '6afea86fbb584ea09f9fd8641a245363', 'JOURNAL_STREAM': '8:656648', 'UWSGI_RELOADS': '1', 'UWSGI_ORIGINAL_PROC_NAME': '/var/www/copies-server/venv/bin/uwsgi'}

 

root 계정에서 echo $PATH를 통해서 환경변수를 출력하고, 나온 결과를 uwsgi에 통째로 삽입했다.

root@ip-172-31-40-67:/var/log/uwsgi/app# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
[uwsgi]
...
env=PATH=/var/www/copies-server/venv/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin

 

그랬더니 에러없이 컨버팅도 되고 다운로드도 되고 정상적으로 동작한다.

컨버팅 로그
다운로드 되어진 화면

Comments