DS918+ + Portainer 조합에서 반복해서 걸린 문제들. 새 컨테이너를 올리기 전에 이 문서를 먼저 볼 것.
PermissionError: [Errno 13] Permission denied: '/usr/src/paperless/data/log'
/var/opt/memos is not writable, using current directory
unable to open database file (14)
sudo mkdir 로 만든 호스트 폴더는 root 소유/volume1/docker 는 시놀로지 공유폴더라 ACL이 걸려 있어 chmod 777 로도 안 뚫리는 경우가 있다 volumes:
- memos_data:/var/opt/memos # 바인드 대신
volumes:
memos_data:
도커가 컨테이너 사용자에 맞춰 소유권을 잡아주므로 권한 문제가 원천적으로 없다.
실제 데이터 위치: /volume1/@docker/volumes/<볼륨명>/_data
(File Station에서는 안 보이는 시스템 폴더 — "폴더가 비었다"고 착각하기 쉬움)
백업은 /volume1/@docker/volumes 전체를 한 번에 잡으면 되므로 오히려 관리가 단순해진다.
파일을 호스트에서 넣고 빼야 하는 경우(예: Paperless의 consume 폴더):
# 이미지의 실행 UID 확인
sudo docker run --rm --entrypoint id <이미지> <사용자명>
# 그 UID로 소유권 지정
sudo mkdir -p /volume1/docker/<앱>
sudo chown -R 1000:1000 /volume1/docker/<앱>
ls -ln /volume1/docker | grep <앱> # 1000 1000 으로 바뀌었는지 확인
ls -ln 결과에 + 가 붙어 있으면 ACL이 걸린 것:
sudo synoacltool -get /volume1/docker/<앱>
sudo find /volume1/docker/<앱> -exec synoacltool -del {} \;
Bind mount failed: '/data/compose/13/beszel_agent_data' does not exist
인터넷에서 가져온 compose에 흔한 ./폴더 형태. Portainer가 자기 내부 경로로 해석하는데
도커 데몬은 그 경로를 볼 수 없다.
# ❌
- ./beszel_agent_data:/var/lib/beszel-agent
# ✅ 네임드 볼륨
- beszel_agent_data:/var/lib/beszel-agent
# 또는 절대 경로
- /volume1/docker/beszel/agent:/var/lib/beszel-agent
컨테이너가 20개 가까이 되면서 포트가 촘촘해졌다. 새 컨테이너를 올리기 전에 반드시 확인:
sudo docker ps --format "{{.Names}}: {{.Ports}}"
sudo netstat -tlnp | grep <포트>
실제 사고: Beszel을 8090에 배포 → 이미 IT Tools가 쓰고 있어서 IT Tools 화면이 떴고,
"계정 생성 화면이 없다"고 한참 헤맸다.
$# ❌ 따옴표가 값의 일부가 된다 (KEY= 뒤에서 시작하므로)
- KEY='ssh-ed25519 AAAA...'
# ✅ 항목 전체를 감싼다
- "KEY=ssh-ed25519 AAAA..."
실제 사고: 위 실수로 값 끝에 ' 가 붙어 Beszel 에이전트가
illegal base64 data at input byte 68 로 기동 실패.
environment:
KEY: "ssh-ed25519 AAAA..."
TOKEN: abc123
키: 값 구조라 따옴표가 값에만 적용된다.
$ 는 따옴표로도 못 막는다docker compose가 변수로 해석하므로 $$ 로 두 번 써야 한다.
ADMIN_TOKEN: "$$argon2id$$v=19$$m=65540..."
결론: DB 비밀번호 같이 사람이 입력하지 않는 값은 기호 없이 영문+숫자 20자로.
길이만 충분하면 강도는 같고, 이스케이프 사고가 사라진다.
password authentication failed for user "wikijs"
POSTGRES_PASSWORD 는 DB 볼륨이 처음 만들어질 때만 계정 생성에 쓰인다.
나중에 스택에서 값을 바꿔도 DB에는 반영되지 않는다.
sudo docker rm -f <앱> <앱>-db
sudo docker volume ls -q | grep -i <앱> | xargs -r sudo docker volume rm
그다음 재배포. (데이터가 있으면 ALTER USER ... PASSWORD 로 DB 안에서 바꿀 것)
컨테이너를 재시작하면 IP가 바뀔 수 있다. 실제로 이것 때문에 NPM이 5일간 반쯤 죽어 있었다.
→ 트러블슈팅 기록
DB_HOST: db # ✅ 서비스 이름
DB_MYSQL_HOST: nginx-proxy-manager-db # ✅ 컨테이너 이름
DB_HOST: 172.19.0.2 # ❌ 재시작 시 깨짐
같은 스택 안에 두면 도커가 전용 네트워크와 DNS를 만들어주므로 이름으로 항상 찾아간다.