[GH-ISSUE #21] permission denied, mkdir '/home/electerm/data/sqlite' #16

Open
opened 2026-02-27 01:55:16 +03:00 by kerem · 9 comments
Owner

Originally created by @wolfcdd on GitHub (Oct 11, 2025).
Original GitHub issue: https://github.com/electerm/electerm-web-docker/issues/21

升级后登录,提示这个错误,是需要手动更换为sqlite吗,原来的数据可以导入吗?

error › unhandledRejection Error: EACCES: permission denied, mkdir '/home/electerm/data/sqlite'
49
at Object.mkdirSync (node:fs:1363:26)
50
at file:///app/electerm-web/src/app/lib/sqlite.js:20:6
51
at ModuleJob.run (node:internal/modules/esm/module_job:345:25)
52
at async onImport.tracePromise.proto (node:internal/modules/esm/loader:665:26)
53
at async getDbModule (file:///app/electerm-web/src/app/lib/db.js:10:16)
54
at async dbAction (file:///app/electerm-web/src/app/lib/db.js:16:14)
55
at async getConfig (file:///app/electerm-web/src/app/lib/init.js:12:22)
56
at async getConstants (file:///app/electerm-web/src/app/lib/get-constants.js:15:18)

Originally created by @wolfcdd on GitHub (Oct 11, 2025). Original GitHub issue: https://github.com/electerm/electerm-web-docker/issues/21 升级后登录,提示这个错误,是需要手动更换为sqlite吗,原来的数据可以导入吗? error › unhandledRejection Error: EACCES: permission denied, mkdir '/home/electerm/data/sqlite' 49 at Object.mkdirSync (node:fs:1363:26) 50 at file:///app/electerm-web/src/app/lib/sqlite.js:20:6 51 at ModuleJob.run (node:internal/modules/esm/module_job:345:25) 52 at async onImport.tracePromise.__proto__ (node:internal/modules/esm/loader:665:26) 53 at async getDbModule (file:///app/electerm-web/src/app/lib/db.js:10:16) 54 at async dbAction (file:///app/electerm-web/src/app/lib/db.js:16:14) 55 at async getConfig (file:///app/electerm-web/src/app/lib/init.js:12:22) 56 at async getConstants (file:///app/electerm-web/src/app/lib/get-constants.js:15:18)
Author
Owner

@zxdong262 commented on GitHub (Oct 11, 2025):

切换到旧版,在数据同步那里导出数据,升级到新版后在数据同步那里导入

<!-- gh-comment-id:3392896310 --> @zxdong262 commented on GitHub (Oct 11, 2025): 切换到旧版,在数据同步那里导出数据,升级到新版后在数据同步那里导入
Author
Owner

@zxdong262 commented on GitHub (Oct 11, 2025):

也需要写入文件夹权限,如果没有可以试试创建文件夹,在本地映射文件夹,注意一定要有写入权限

<!-- gh-comment-id:3392896852 --> @zxdong262 commented on GitHub (Oct 11, 2025): 也需要写入文件夹权限,如果没有可以试试创建文件夹,在本地映射文件夹,注意一定要有写入权限
Author
Owner

@sailcom commented on GitHub (Jan 31, 2026):

也需要写入文件夹权限,如果没有可以试试创建文件夹,在本地映射文件夹,注意一定要有写入权限

在docker里新安装的也出现这个报错。

在宿主机建立了对应的文件夹之后,不再报 permission denied, mkdir '/home/electerm/data/sqlite' 这个错了。

错误变成了:

2026/01/31 22:50:00 | stdout | Received SIGTERM, cleaning up widgets...
2026/01/31 22:50:11 | stdout | 14:50:11 info › app start
2026/01/31 22:50:11 | stdout | 14:50:11 info › server runs on http://0.0.0.0:5577
2026/01/31 22:50:33 | stdout | GET / 200 5756 - 227.573 ms
2026/01/31 22:50:34 | stdout | GET /rle.wasm 304 - - 3.044 ms
2026/01/31 22:50:35 | stdout | (node:1) ExperimentalWarning: SQLite is an experimental feature and might change at any time
2026/01/31 22:50:35 | stdout | (Use `node --trace-warnings ...` to show where the warning was created)
2026/01/31 22:50:35 | stdout | 14:50:35 error › unhandledRejection Error: unable to open database file
2026/01/31 22:50:35 | stdout | at file:///app/electerm-web/src/app/lib/sqlite.js:23:16
2026/01/31 22:50:35 | stdout | at ModuleJob.run (node:internal/modules/esm/module_job:343:25)
2026/01/31 22:50:35 | stdout | at async onImport.tracePromise.__proto__ (node:internal/modules/esm/loader:665:26)
2026/01/31 22:50:35 | stdout | at async getDbModule (file:///app/electerm-web/src/app/lib/db.js:10:16)
2026/01/31 22:50:35 | stdout | at async dbAction (file:///app/electerm-web/src/app/lib/db.js:16:14)
2026/01/31 22:50:35 | stdout | at async getConfig (file:///app/electerm-web/src/app/lib/init.js:12:22)
2026/01/31 22:50:35 | stdout | at async getConstants (file:///app/electerm-web/src/app/lib/get-constants.js:15:18)
<!-- gh-comment-id:3828675973 --> @sailcom commented on GitHub (Jan 31, 2026): > 也需要写入文件夹权限,如果没有可以试试创建文件夹,在本地映射文件夹,注意一定要有写入权限 在docker里**新安装**的也出现这个报错。 在宿主机建立了对应的文件夹之后,不再报 `permission denied, mkdir '/home/electerm/data/sqlite'` 这个错了。 错误变成了: ``` 2026/01/31 22:50:00 | stdout | Received SIGTERM, cleaning up widgets... 2026/01/31 22:50:11 | stdout | 14:50:11 info › app start 2026/01/31 22:50:11 | stdout | 14:50:11 info › server runs on http://0.0.0.0:5577 2026/01/31 22:50:33 | stdout | GET / 200 5756 - 227.573 ms 2026/01/31 22:50:34 | stdout | GET /rle.wasm 304 - - 3.044 ms 2026/01/31 22:50:35 | stdout | (node:1) ExperimentalWarning: SQLite is an experimental feature and might change at any time 2026/01/31 22:50:35 | stdout | (Use `node --trace-warnings ...` to show where the warning was created) 2026/01/31 22:50:35 | stdout | 14:50:35 error › unhandledRejection Error: unable to open database file 2026/01/31 22:50:35 | stdout | at file:///app/electerm-web/src/app/lib/sqlite.js:23:16 2026/01/31 22:50:35 | stdout | at ModuleJob.run (node:internal/modules/esm/module_job:343:25) 2026/01/31 22:50:35 | stdout | at async onImport.tracePromise.__proto__ (node:internal/modules/esm/loader:665:26) 2026/01/31 22:50:35 | stdout | at async getDbModule (file:///app/electerm-web/src/app/lib/db.js:10:16) 2026/01/31 22:50:35 | stdout | at async dbAction (file:///app/electerm-web/src/app/lib/db.js:16:14) 2026/01/31 22:50:35 | stdout | at async getConfig (file:///app/electerm-web/src/app/lib/init.js:12:22) 2026/01/31 22:50:35 | stdout | at async getConstants (file:///app/electerm-web/src/app/lib/get-constants.js:15:18) ```
Author
Owner

@zxdong262 commented on GitHub (Feb 1, 2026):

也需要写入文件夹权限,如果没有可以试试创建文件夹,在本地映射文件夹,注意一定要有写入权限

在docker里新安装的也出现这个报错。

在宿主机建立了对应的文件夹之后,不再报 permission denied, mkdir '/home/electerm/data/sqlite' 这个错了。

错误变成了:

2026/01/31 22:50:00 | stdout | Received SIGTERM, cleaning up widgets...
2026/01/31 22:50:11 | stdout | 14:50:11 info › app start
2026/01/31 22:50:11 | stdout | 14:50:11 info › server runs on http://0.0.0.0:5577
2026/01/31 22:50:33 | stdout | GET / 200 5756 - 227.573 ms
2026/01/31 22:50:34 | stdout | GET /rle.wasm 304 - - 3.044 ms
2026/01/31 22:50:35 | stdout | (node:1) ExperimentalWarning: SQLite is an experimental feature and might change at any time
2026/01/31 22:50:35 | stdout | (Use `node --trace-warnings ...` to show where the warning was created)
2026/01/31 22:50:35 | stdout | 14:50:35 error › unhandledRejection Error: unable to open database file
2026/01/31 22:50:35 | stdout | at file:///app/electerm-web/src/app/lib/sqlite.js:23:16
2026/01/31 22:50:35 | stdout | at ModuleJob.run (node:internal/modules/esm/module_job:343:25)
2026/01/31 22:50:35 | stdout | at async onImport.tracePromise.__proto__ (node:internal/modules/esm/loader:665:26)
2026/01/31 22:50:35 | stdout | at async getDbModule (file:///app/electerm-web/src/app/lib/db.js:10:16)
2026/01/31 22:50:35 | stdout | at async dbAction (file:///app/electerm-web/src/app/lib/db.js:16:14)
2026/01/31 22:50:35 | stdout | at async getConfig (file:///app/electerm-web/src/app/lib/init.js:12:22)
2026/01/31 22:50:35 | stdout | at async getConstants (file:///app/electerm-web/src/app/lib/get-constants.js:15:18)

看看数据文件是不是损坏了,如果损坏了可以删除试试

<!-- gh-comment-id:3830301737 --> @zxdong262 commented on GitHub (Feb 1, 2026): > > 也需要写入文件夹权限,如果没有可以试试创建文件夹,在本地映射文件夹,注意一定要有写入权限 > > 在docker里**新安装**的也出现这个报错。 > > 在宿主机建立了对应的文件夹之后,不再报 `permission denied, mkdir '/home/electerm/data/sqlite'` 这个错了。 > > 错误变成了: > > ``` > 2026/01/31 22:50:00 | stdout | Received SIGTERM, cleaning up widgets... > 2026/01/31 22:50:11 | stdout | 14:50:11 info › app start > 2026/01/31 22:50:11 | stdout | 14:50:11 info › server runs on http://0.0.0.0:5577 > 2026/01/31 22:50:33 | stdout | GET / 200 5756 - 227.573 ms > 2026/01/31 22:50:34 | stdout | GET /rle.wasm 304 - - 3.044 ms > 2026/01/31 22:50:35 | stdout | (node:1) ExperimentalWarning: SQLite is an experimental feature and might change at any time > 2026/01/31 22:50:35 | stdout | (Use `node --trace-warnings ...` to show where the warning was created) > 2026/01/31 22:50:35 | stdout | 14:50:35 error › unhandledRejection Error: unable to open database file > 2026/01/31 22:50:35 | stdout | at file:///app/electerm-web/src/app/lib/sqlite.js:23:16 > 2026/01/31 22:50:35 | stdout | at ModuleJob.run (node:internal/modules/esm/module_job:343:25) > 2026/01/31 22:50:35 | stdout | at async onImport.tracePromise.__proto__ (node:internal/modules/esm/loader:665:26) > 2026/01/31 22:50:35 | stdout | at async getDbModule (file:///app/electerm-web/src/app/lib/db.js:10:16) > 2026/01/31 22:50:35 | stdout | at async dbAction (file:///app/electerm-web/src/app/lib/db.js:16:14) > 2026/01/31 22:50:35 | stdout | at async getConfig (file:///app/electerm-web/src/app/lib/init.js:12:22) > 2026/01/31 22:50:35 | stdout | at async getConstants (file:///app/electerm-web/src/app/lib/get-constants.js:15:18) > ``` 看看数据文件是不是损坏了,如果损坏了可以删除试试
Author
Owner

@sailcom commented on GitHub (Feb 1, 2026):

在docker里新安装的也出现这个报错。
在宿主机建立了对应的文件夹之后,不再报 permission denied, mkdir '/home/electerm/data/sqlite' 这个错了。
错误变成了:

2026/01/31 22:50:00 | stdout | Received SIGTERM, cleaning up widgets...
2026/01/31 22:50:11 | stdout | 14:50:11 info › app start
2026/01/31 22:50:11 | stdout | 14:50:11 info › server runs on http://0.0.0.0:5577
2026/01/31 22:50:33 | stdout | GET / 200 5756 - 227.573 ms
2026/01/31 22:50:34 | stdout | GET /rle.wasm 304 - - 3.044 ms
2026/01/31 22:50:35 | stdout | (node:1) ExperimentalWarning: SQLite is an experimental feature and might change at any time
2026/01/31 22:50:35 | stdout | (Use `node --trace-warnings ...` to show where the warning was created)
2026/01/31 22:50:35 | stdout | 14:50:35 error › unhandledRejection Error: unable to open database file
2026/01/31 22:50:35 | stdout | at file:///app/electerm-web/src/app/lib/sqlite.js:23:16
2026/01/31 22:50:35 | stdout | at ModuleJob.run (node:internal/modules/esm/module_job:343:25)
2026/01/31 22:50:35 | stdout | at async onImport.tracePromise.__proto__ (node:internal/modules/esm/loader:665:26)
2026/01/31 22:50:35 | stdout | at async getDbModule (file:///app/electerm-web/src/app/lib/db.js:10:16)
2026/01/31 22:50:35 | stdout | at async dbAction (file:///app/electerm-web/src/app/lib/db.js:16:14)
2026/01/31 22:50:35 | stdout | at async getConfig (file:///app/electerm-web/src/app/lib/init.js:12:22)
2026/01/31 22:50:35 | stdout | at async getConstants (file:///app/electerm-web/src/app/lib/get-constants.js:15:18)

看看数据文件是不是损坏了,如果损坏了可以删除试试

这个是新安装时候的报错,目录下不存在任何的数据文件

是不是系统不能自动创建数据库文件呀?

如果不能自动创建,我可以在那个目录下新建一个空的数据库文件吗?

<!-- gh-comment-id:3830357993 --> @sailcom commented on GitHub (Feb 1, 2026): > > 在docker里**新安装**的也出现这个报错。 > > 在宿主机建立了对应的文件夹之后,不再报 `permission denied, mkdir '/home/electerm/data/sqlite'` 这个错了。 > > 错误变成了: > > ``` > > 2026/01/31 22:50:00 | stdout | Received SIGTERM, cleaning up widgets... > > 2026/01/31 22:50:11 | stdout | 14:50:11 info › app start > > 2026/01/31 22:50:11 | stdout | 14:50:11 info › server runs on http://0.0.0.0:5577 > > 2026/01/31 22:50:33 | stdout | GET / 200 5756 - 227.573 ms > > 2026/01/31 22:50:34 | stdout | GET /rle.wasm 304 - - 3.044 ms > > 2026/01/31 22:50:35 | stdout | (node:1) ExperimentalWarning: SQLite is an experimental feature and might change at any time > > 2026/01/31 22:50:35 | stdout | (Use `node --trace-warnings ...` to show where the warning was created) > > 2026/01/31 22:50:35 | stdout | 14:50:35 error › unhandledRejection Error: unable to open database file > > 2026/01/31 22:50:35 | stdout | at file:///app/electerm-web/src/app/lib/sqlite.js:23:16 > > 2026/01/31 22:50:35 | stdout | at ModuleJob.run (node:internal/modules/esm/module_job:343:25) > > 2026/01/31 22:50:35 | stdout | at async onImport.tracePromise.__proto__ (node:internal/modules/esm/loader:665:26) > > 2026/01/31 22:50:35 | stdout | at async getDbModule (file:///app/electerm-web/src/app/lib/db.js:10:16) > > 2026/01/31 22:50:35 | stdout | at async dbAction (file:///app/electerm-web/src/app/lib/db.js:16:14) > > 2026/01/31 22:50:35 | stdout | at async getConfig (file:///app/electerm-web/src/app/lib/init.js:12:22) > > 2026/01/31 22:50:35 | stdout | at async getConstants (file:///app/electerm-web/src/app/lib/get-constants.js:15:18) > > ``` > > 看看数据文件是不是损坏了,如果损坏了可以删除试试 这个是新安装时候的报错,目录下不存在任何的数据文件 是不是系统不能自动创建数据库文件呀? 如果不能自动创建,我可以在那个目录下新建一个空的数据库文件吗?
Author
Owner

@zxdong262 commented on GitHub (Feb 1, 2026):

在docker里新安装的也出现这个报错。
在宿主机建立了对应的文件夹之后,不再报 permission denied, mkdir '/home/electerm/data/sqlite' 这个错了。
错误变成了:

2026/01/31 22:50:00 | stdout | Received SIGTERM, cleaning up widgets...
2026/01/31 22:50:11 | stdout | 14:50:11 info › app start
2026/01/31 22:50:11 | stdout | 14:50:11 info › server runs on http://0.0.0.0:5577
2026/01/31 22:50:33 | stdout | GET / 200 5756 - 227.573 ms
2026/01/31 22:50:34 | stdout | GET /rle.wasm 304 - - 3.044 ms
2026/01/31 22:50:35 | stdout | (node:1) ExperimentalWarning: SQLite is an experimental feature and might change at any time
2026/01/31 22:50:35 | stdout | (Use `node --trace-warnings ...` to show where the warning was created)
2026/01/31 22:50:35 | stdout | 14:50:35 error › unhandledRejection Error: unable to open database file
2026/01/31 22:50:35 | stdout | at file:///app/electerm-web/src/app/lib/sqlite.js:23:16
2026/01/31 22:50:35 | stdout | at ModuleJob.run (node:internal/modules/esm/module_job:343:25)
2026/01/31 22:50:35 | stdout | at async onImport.tracePromise.__proto__ (node:internal/modules/esm/loader:665:26)
2026/01/31 22:50:35 | stdout | at async getDbModule (file:///app/electerm-web/src/app/lib/db.js:10:16)
2026/01/31 22:50:35 | stdout | at async dbAction (file:///app/electerm-web/src/app/lib/db.js:16:14)
2026/01/31 22:50:35 | stdout | at async getConfig (file:///app/electerm-web/src/app/lib/init.js:12:22)
2026/01/31 22:50:35 | stdout | at async getConstants (file:///app/electerm-web/src/app/lib/get-constants.js:15:18)

看看数据文件是不是损坏了,如果损坏了可以删除试试

这个是新安装时候的报错,目录下不存在任何的数据文件

是不是系统不能自动创建数据库文件呀?

如果不能自动创建,我可以在那个目录下新建一个空的数据库文件吗?

那就还是权限问题,我刚试了新建个文件夹作为数据文件夹可以正常创建数据文件和运行 /Users/zxd/dev/electerm-web-docker/temp/data

docker run --init -v /Users/zxd/dev/electerm-web-docker/temp/data:/home/electerm/data \
  -e "DB_PATH=/home/electerm/data" \
  -e "HOST=0.0.0.0" \
  -p 8082:5577 \
  zxdong262/electerm-web
<!-- gh-comment-id:3830542688 --> @zxdong262 commented on GitHub (Feb 1, 2026): > > > 在docker里**新安装**的也出现这个报错。 > > > 在宿主机建立了对应的文件夹之后,不再报 `permission denied, mkdir '/home/electerm/data/sqlite'` 这个错了。 > > > 错误变成了: > > > ``` > > > 2026/01/31 22:50:00 | stdout | Received SIGTERM, cleaning up widgets... > > > 2026/01/31 22:50:11 | stdout | 14:50:11 info › app start > > > 2026/01/31 22:50:11 | stdout | 14:50:11 info › server runs on http://0.0.0.0:5577 > > > 2026/01/31 22:50:33 | stdout | GET / 200 5756 - 227.573 ms > > > 2026/01/31 22:50:34 | stdout | GET /rle.wasm 304 - - 3.044 ms > > > 2026/01/31 22:50:35 | stdout | (node:1) ExperimentalWarning: SQLite is an experimental feature and might change at any time > > > 2026/01/31 22:50:35 | stdout | (Use `node --trace-warnings ...` to show where the warning was created) > > > 2026/01/31 22:50:35 | stdout | 14:50:35 error › unhandledRejection Error: unable to open database file > > > 2026/01/31 22:50:35 | stdout | at file:///app/electerm-web/src/app/lib/sqlite.js:23:16 > > > 2026/01/31 22:50:35 | stdout | at ModuleJob.run (node:internal/modules/esm/module_job:343:25) > > > 2026/01/31 22:50:35 | stdout | at async onImport.tracePromise.__proto__ (node:internal/modules/esm/loader:665:26) > > > 2026/01/31 22:50:35 | stdout | at async getDbModule (file:///app/electerm-web/src/app/lib/db.js:10:16) > > > 2026/01/31 22:50:35 | stdout | at async dbAction (file:///app/electerm-web/src/app/lib/db.js:16:14) > > > 2026/01/31 22:50:35 | stdout | at async getConfig (file:///app/electerm-web/src/app/lib/init.js:12:22) > > > 2026/01/31 22:50:35 | stdout | at async getConstants (file:///app/electerm-web/src/app/lib/get-constants.js:15:18) > > > ``` > > > > > > 看看数据文件是不是损坏了,如果损坏了可以删除试试 > > 这个是新安装时候的报错,目录下不存在任何的数据文件 > > 是不是系统不能自动创建数据库文件呀? > > 如果不能自动创建,我可以在那个目录下新建一个空的数据库文件吗? 那就还是权限问题,我刚试了新建个文件夹作为数据文件夹可以正常创建数据文件和运行 `/Users/zxd/dev/electerm-web-docker/temp/data` ``` docker run --init -v /Users/zxd/dev/electerm-web-docker/temp/data:/home/electerm/data \ -e "DB_PATH=/home/electerm/data" \ -e "HOST=0.0.0.0" \ -p 8082:5577 \ zxdong262/electerm-web ```
Author
Owner

@sailcom commented on GitHub (Feb 2, 2026):

那就还是权限问题,我刚试了新建个文件夹作为数据文件夹可以正常创建数据文件和运行 /Users/zxd/dev/electerm-web-docker/temp/data

docker run --init -v /Users/zxd/dev/electerm-web-docker/temp/data:/home/electerm/data \
  -e "DB_PATH=/home/electerm/data" \
  -e "HOST=0.0.0.0" \
  -p 8082:5577 \
  zxdong262/electerm-web

感谢 @zxdong262 大佬的详细解答。今天下午我在两台服务器分别尝试【新安装】了docker,并仔细分析了权限

服务器1:debian系统(已解决)

提前建立好目录,并使用上面的命令安装,安装后无法访问,查看日志报错:permission denied, mkdir '/home/electerm/data/sqlite'

使用 docker exec electerm-web id 命令查看docker运行时的用户,发现是 999(electerm)

uid=999(electerm) gid=999(electerm) groups=999(electerm)

之后,我把宿主机的映射目录的所有者也修改为999

sudo chown -R 999:999 /www/wwwroot/electerm

此时再访问页面,得以成功连接!

服务器2:群晖系统(未解决)

在群晖同样按照上述步骤操作,修改映射目录的用户为999,发现仍然无法连接。

sudo chown -R 999:999 /volume1/docker/Electerm/data

经过询问AI得知,虽然映射目录已改为了999,但是 999 这个用户并没有访问其父级目录 /volume1的权限,导致无法连接。

之后AI告诉我第二种方式,让docker以 root 的身份运行。
也就是在启动docker时,使用环境变量 PUIDPGID 修改运行用户为0(root),也就是在启动时加入以下参数:

docker run --name electerm-web --init \
  -v /volume1/docker/Electerm/data:/home/electerm/data \
  -e "PUID=0" \
  -e "PGID=0" \
  -e "DB_PATH=/home/electerm/data" \
  -e "HOST=0.0.0.0" \
  -p 8082:5577 \
  --restart always \
  zxdong262/electerm-web

容器运行后,使用 docker exec electerm-web id 命令再次查看运行的用户,
发现仍然是 999(electerm),也就是说,PUID、PGID这两个参数并没有生效。

期望

针对这个问题,我有两种改进的建议,仅供大佬参考:

  1. 将docker容器运行的用户由999(electerm)改为 0(root),这样可以解决一大部分人在linux系统安装docker后,因为权限导致无法使用的问题(不过AI提示这样会有一定的安全风险:容器一旦被攻破,攻击者将直接获得宿主机的 Root 权限);
  2. 如果为了安全起见,不想修改默认用户的话,希望容器支持 PUID/PGID 启动脚本(需要在镜像内部增加相关的处理逻辑)。这样既可以保证安全,又可以让使用者在不同设备下使用docker镜像(比如群晖)。

以上,感谢大佬抽出时间阅读。谢谢!

<!-- gh-comment-id:3834172976 --> @sailcom commented on GitHub (Feb 2, 2026): > 那就还是权限问题,我刚试了新建个文件夹作为数据文件夹可以正常创建数据文件和运行 `/Users/zxd/dev/electerm-web-docker/temp/data` > > ``` > docker run --init -v /Users/zxd/dev/electerm-web-docker/temp/data:/home/electerm/data \ > -e "DB_PATH=/home/electerm/data" \ > -e "HOST=0.0.0.0" \ > -p 8082:5577 \ > zxdong262/electerm-web > ``` ### 感谢 @zxdong262 大佬的详细解答。今天下午我在两台服务器分别尝试【新安装】了docker,并仔细分析了权限 ## 服务器1:debian系统(已解决) 提前建立好目录,并使用上面的命令安装,安装后无法访问,查看日志报错:`permission denied, mkdir '/home/electerm/data/sqlite'`。 使用 `docker exec electerm-web id` 命令查看docker运行时的用户,发现是 `999(electerm)` ``` uid=999(electerm) gid=999(electerm) groups=999(electerm) ``` 之后,我把宿主机的映射目录的所有者也修改为999 ``` sudo chown -R 999:999 /www/wwwroot/electerm ``` 此时再访问页面,得以成功连接! ## 服务器2:群晖系统(未解决) 在群晖同样按照上述步骤操作,修改映射目录的用户为`999`,发现仍然无法连接。 ``` sudo chown -R 999:999 /volume1/docker/Electerm/data ``` 经过询问AI得知,虽然映射目录已改为了999,但是 999 这个用户并没有访问其父级目录 `/volume1`的权限,导致无法连接。 之后AI告诉我第二种方式,让docker以 `root` 的身份运行。 也就是在启动docker时,使用环境变量 `PUID` 和 `PGID` 修改运行用户为`0(root)`,也就是在启动时加入以下参数: ``` docker run --name electerm-web --init \ -v /volume1/docker/Electerm/data:/home/electerm/data \ -e "PUID=0" \ -e "PGID=0" \ -e "DB_PATH=/home/electerm/data" \ -e "HOST=0.0.0.0" \ -p 8082:5577 \ --restart always \ zxdong262/electerm-web ``` 容器运行后,使用 `docker exec electerm-web id` 命令再次查看运行的用户, 发现仍然是 `999(electerm)`,也就是说,PUID、PGID这两个参数并没有生效。 ## 期望 针对这个问题,我有两种改进的建议,仅供大佬参考: 1. 将docker容器运行的用户由`999(electerm)`改为 `0(root)`,这样可以解决一大部分人在linux系统安装docker后,因为权限导致无法使用的问题(不过AI提示这样会有一定的安全风险:容器一旦被攻破,攻击者将直接获得宿主机的 Root 权限); 2. 如果为了安全起见,不想修改默认用户的话,希望容器支持 PUID/PGID 启动脚本(需要在镜像内部增加相关的处理逻辑)。这样既可以保证安全,又可以让使用者在不同设备下使用docker镜像(比如群晖)。 以上,感谢大佬抽出时间阅读。谢谢!
Author
Owner

@zxdong262 commented on GitHub (Feb 2, 2026):

那就还是权限问题,我刚试了新建个文件夹作为数据文件夹可以正常创建数据文件和运行 /Users/zxd/dev/electerm-web-docker/temp/data

docker run --init -v /Users/zxd/dev/electerm-web-docker/temp/data:/home/electerm/data \
  -e "DB_PATH=/home/electerm/data" \
  -e "HOST=0.0.0.0" \
  -p 8082:5577 \
  zxdong262/electerm-web

感谢 @zxdong262 大佬的详细解答。今天下午我在两台服务器分别尝试【新安装】了docker,并仔细分析了权限

服务器1:debian系统(已解决)

提前建立好目录,并使用上面的命令安装,安装后无法访问,查看日志报错:permission denied, mkdir '/home/electerm/data/sqlite'

使用 docker exec electerm-web id 命令查看docker运行时的用户,发现是 999(electerm)

uid=999(electerm) gid=999(electerm) groups=999(electerm)

之后,我把宿主机的映射目录的所有者也修改为999

sudo chown -R 999:999 /www/wwwroot/electerm

此时再访问页面,得以成功连接!

服务器2:群晖系统(未解决)

在群晖同样按照上述步骤操作,修改映射目录的用户为999,发现仍然无法连接。

sudo chown -R 999:999 /volume1/docker/Electerm/data

经过询问AI得知,虽然映射目录已改为了999,但是 999 这个用户并没有访问其父级目录 /volume1的权限,导致无法连接。

之后AI告诉我第二种方式,让docker以 root 的身份运行。 也就是在启动docker时,使用环境变量 PUIDPGID 修改运行用户为0(root),也就是在启动时加入以下参数:

docker run --name electerm-web --init \
  -v /volume1/docker/Electerm/data:/home/electerm/data \
  -e "PUID=0" \
  -e "PGID=0" \
  -e "DB_PATH=/home/electerm/data" \
  -e "HOST=0.0.0.0" \
  -p 8082:5577 \
  --restart always \
  zxdong262/electerm-web

容器运行后,使用 docker exec electerm-web id 命令再次查看运行的用户, 发现仍然是 999(electerm),也就是说,PUID、PGID这两个参数并没有生效。

期望

针对这个问题,我有两种改进的建议,仅供大佬参考:

  1. 将docker容器运行的用户由999(electerm)改为 0(root),这样可以解决一大部分人在linux系统安装docker后,因为权限导致无法使用的问题(不过AI提示这样会有一定的安全风险:容器一旦被攻破,攻击者将直接获得宿主机的 Root 权限);
  2. 如果为了安全起见,不想修改默认用户的话,希望容器支持 PUID/PGID 启动脚本(需要在镜像内部增加相关的处理逻辑)。这样既可以保证安全,又可以让使用者在不同设备下使用docker镜像(比如群晖)。

以上,感谢大佬抽出时间阅读。谢谢!

感谢反馈,现在最新版已发布,支持--user,这样就没有问题了

docker run --init \
  --user "$(id -u):$(id -g)" \
  -v $(pwd)/electerm-web-data:/home/electerm/data \
  -e "DB_PATH=/home/electerm/data" \
  -e "HOST=0.0.0.0" \
  -p 8082:5577 \
  zxdong262/electerm-web
<!-- gh-comment-id:3834781290 --> @zxdong262 commented on GitHub (Feb 2, 2026): > > 那就还是权限问题,我刚试了新建个文件夹作为数据文件夹可以正常创建数据文件和运行 `/Users/zxd/dev/electerm-web-docker/temp/data` > > ``` > > docker run --init -v /Users/zxd/dev/electerm-web-docker/temp/data:/home/electerm/data \ > > -e "DB_PATH=/home/electerm/data" \ > > -e "HOST=0.0.0.0" \ > > -p 8082:5577 \ > > zxdong262/electerm-web > > ``` > > ### 感谢 [@zxdong262](https://github.com/zxdong262) 大佬的详细解答。今天下午我在两台服务器分别尝试【新安装】了docker,并仔细分析了权限 > ## 服务器1:debian系统(已解决) > 提前建立好目录,并使用上面的命令安装,安装后无法访问,查看日志报错:`permission denied, mkdir '/home/electerm/data/sqlite'`。 > > 使用 `docker exec electerm-web id` 命令查看docker运行时的用户,发现是 `999(electerm)` > > ``` > uid=999(electerm) gid=999(electerm) groups=999(electerm) > ``` > > 之后,我把宿主机的映射目录的所有者也修改为999 > > ``` > sudo chown -R 999:999 /www/wwwroot/electerm > ``` > > 此时再访问页面,得以成功连接! > > ## 服务器2:群晖系统(未解决) > 在群晖同样按照上述步骤操作,修改映射目录的用户为`999`,发现仍然无法连接。 > > ``` > sudo chown -R 999:999 /volume1/docker/Electerm/data > ``` > > 经过询问AI得知,虽然映射目录已改为了999,但是 999 这个用户并没有访问其父级目录 `/volume1`的权限,导致无法连接。 > > 之后AI告诉我第二种方式,让docker以 `root` 的身份运行。 也就是在启动docker时,使用环境变量 `PUID` 和 `PGID` 修改运行用户为`0(root)`,也就是在启动时加入以下参数: > > ``` > docker run --name electerm-web --init \ > -v /volume1/docker/Electerm/data:/home/electerm/data \ > -e "PUID=0" \ > -e "PGID=0" \ > -e "DB_PATH=/home/electerm/data" \ > -e "HOST=0.0.0.0" \ > -p 8082:5577 \ > --restart always \ > zxdong262/electerm-web > ``` > > 容器运行后,使用 `docker exec electerm-web id` 命令再次查看运行的用户, 发现仍然是 `999(electerm)`,也就是说,PUID、PGID这两个参数并没有生效。 > > ## 期望 > 针对这个问题,我有两种改进的建议,仅供大佬参考: > > 1. 将docker容器运行的用户由`999(electerm)`改为 `0(root)`,这样可以解决一大部分人在linux系统安装docker后,因为权限导致无法使用的问题(不过AI提示这样会有一定的安全风险:容器一旦被攻破,攻击者将直接获得宿主机的 Root 权限); > 2. 如果为了安全起见,不想修改默认用户的话,希望容器支持 PUID/PGID 启动脚本(需要在镜像内部增加相关的处理逻辑)。这样既可以保证安全,又可以让使用者在不同设备下使用docker镜像(比如群晖)。 > > 以上,感谢大佬抽出时间阅读。谢谢! 感谢反馈,现在最新版已发布,支持--user,这样就没有问题了 ``` docker run --init \ --user "$(id -u):$(id -g)" \ -v $(pwd)/electerm-web-data:/home/electerm/data \ -e "DB_PATH=/home/electerm/data" \ -e "HOST=0.0.0.0" \ -p 8082:5577 \ zxdong262/electerm-web ``` ```
Author
Owner

@sailcom commented on GitHub (Feb 2, 2026):

感谢反馈,现在最新版已发布,支持--user,这样就没有问题了

docker run --init \
  --user "$(id -u):$(id -g)" \
  -v $(pwd)/electerm-web-data:/home/electerm/data \
  -e "DB_PATH=/home/electerm/data" \
  -e "HOST=0.0.0.0" \
  -p 8082:5577 \
  zxdong262/electerm-web

大佬神速!
在群晖安装新版本,使用root权限已成功运行,感谢!
👍👍👍

<!-- gh-comment-id:3835269922 --> @sailcom commented on GitHub (Feb 2, 2026): > 感谢反馈,现在最新版已发布,支持--user,这样就没有问题了 > > ``` > docker run --init \ > --user "$(id -u):$(id -g)" \ > -v $(pwd)/electerm-web-data:/home/electerm/data \ > -e "DB_PATH=/home/electerm/data" \ > -e "HOST=0.0.0.0" \ > -p 8082:5577 \ > zxdong262/electerm-web > ``` 大佬神速! 在群晖安装新版本,使用root权限已成功运行,感谢! 👍👍👍
Sign in to join this conversation.
No labels
pull-request
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
starred/electerm-web-docker#16
No description provided.