Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

使用环境变量配置服务器启动参数 #43

Closed
bonjour-py opened this issue Jun 12, 2024 · 12 comments
Closed

使用环境变量配置服务器启动参数 #43

bonjour-py opened this issue Jun 12, 2024 · 12 comments

Comments

@bonjour-py
Copy link
Contributor

bonjour-py commented Jun 12, 2024

目前容器启动几乎完全无法配置。
似乎对rootless容器的兼容也有问题(chown called by entrypoint)。

我想来帮忙

@rexzhang
Copy link
Owner

一开始设计的是完全基于配置文件,这样可以简单的修改配置文件然后重启即可.修改环境变量是需要重建容器的,对self-hosting不太友好

另外,你有什么具体的修改想法么?

@bonjour-py
Copy link
Contributor Author

bonjour-py commented Jun 12, 2024

docker方向的容器环境就是为了短生命周期,只要保存好持久数据(配置文件不应被视作数据),销毁重建容器应当被接受。重建容器也能推进用户进行版本升级。

可以使用entrypoint去处理环境变量
demo

##dockerfile
ENTRYPOINT [  "/app/entrypoint.sh"  ]
CMD [ "serve"]

## entrypoint.sh
if [ -z "$WEBDAV_HOST" ]; then
	WEBDAV_HOST=0.0.0.0
fi

if [ -z "$WEBDAV_PORT" ]; then
	WEBDAV_PORT=8000
fi

## 这里在下面说
if [ ! -f "config/webdav.json" ] && [ ! -z "$WEBDAV_AUTH" ]; then
	mkdir config && touch config/wedav.json
	echo "$WEBDAV_AUTH" | tee config/webdav.json
fi

if [ "$1" == "serve" ]; then
                exec python -m asgi_webdav \
		--host "$WEBDAV_HOST" \
		--port "$WEBDAV_PORT" \
		--config config/webdav.json \
		--logging-no-display-datetime \
		--logging-no-use-colors 
else
	exec $*
fi

以上我正在写。

关于webdav.json , 我想使用

WEBDAV_AUTH__0__USER=username 
WEBDAV_AUTH__0__PASS=password 
WEBDAV_AUTH__0__PERMIT__0='+' 
WEBDAV_AUTH__0__PERMIT__1='-^/xxx' 
WEBDAV_AUTH__1__USER=username 
WEBDAV_AUTH__1__PASS=password 
WEBDAV_AUTH__1__PERMIT__0='+' 

对类似的环境变量做处理 去填充配置文件 (我自己的困难:需要纯sh去实现 突然发现不用做自由完全的转换,一共只有2个键,2层,键也固定的)
不优雅的方案:demo中直接把文件内容放里(肯定不能用)

关于用户定义 UID GID (chown in entrypoint)目前有点疑惑不知缘由
之前见过的实现多数是
1.使用docker 参数--user 去控制 使用哪个用户 (多数)
2.固定UID GID (nginx)
需要更多调查

@bonjour-py
Copy link
Contributor Author

或者可能应该在config.py 中处理

@rexzhang
Copy link
Owner

集中在配置文件还是在环境变量配置服务的问题

  • 在self-hosting的人群中(他们绝大部分都不是IT相关从业者)环境变量是非常不友好的.
    • 因为在不少环境(如群晖)环境变量是没法备份的;所以,如果引入环境变量,技术上没问题,但对这个人群没有任何意义.这个项目的初衷就是为self-hosting需求的
  • 配置文件也可以是数据,这个取决于定义者的偏好.从业者的定义,离开业务环境不一定就是对的
  • 将配置文件作为数据备份最大的缺点是密码安全
  • 如果太多参数在环境变量也可以设置话(一般来说环境变量的优先级是高于配置文件的),对后续配置信息(数据结构等)做调整也会变困难,有点得不偿失
  • 关于“docker方向的容器环境就是为了短生命周期”,这个同样对目标用户来说也是不存在的,很多人用watchtower自动更新容器镜像的,确实创建了新的容器,但是他们不会天天去盯着是否更新了,是否需要调整环境变量什么的.某种意义上更像是:容器是短生命周期的,但是容器环境是长生命周期的

什么信息不应该在docker环境变量配置

  • 容器切换部署环境(比如从TrueNAS的apps切换到Jailmaker中的docker standalone)的时候确定不会发生改变的
    • 帐户其实就算这一类,因为多账号是本项目的一个特色
    • 现在项目中的的WEBDAV_USERNAME变量其实更多的是为唯一账号,或者快速起步设计的,现在看来设计得并不好,我认识的人中用这个方式的基本没有,属于比较失败的特性
  • 结构和内容复杂的信息,比如群晖这种NAS,当仅需要修改环境变量的时候,是需要删除然后重新创建容器的;但是又只能通过GUI界面来完成,非常繁琐.当然群晖也可以ssh进去用命令行,但这个手段对项目的假定用户群体来说是不存在的

什么信息应该在环境变量中配置

  • 更换部署环境就会/容易发生变化的信息
    • host/port是最应该添加的,欢迎PR
    • 其它的欢迎讨论

rootless的方案

  • 使用环境变量自定义UID/GID这个参考的是LinuxServer.io(Understanding PUID and PGID)的设计
  • 算是一个遗留问题
  • 关于切换到新版本docker --user,打算未来参考LinuxServer.io的迁移解决方案,也欢迎提解决方案

@rexzhang
Copy link
Owner

补充一下,self-hosting意味着:

  • 安装配置是一个人
  • 维护也是这个人
  • 使用往往也只有这个人
  • 这个人还大概率并不懂docker,很多时候就是依葫芦画瓢搞定所有问题.所以解决问题的方案要简单;最好只有一个方案;而非多个方案,某个方案最佳

@bonjour-py
Copy link
Contributor Author

bonjour-py commented Jun 13, 2024

那我把

--host "$WEBDAV_HOST" 
--port "$WEBDAV_PORT" 

使用entrypoint 处理了吧

以及

  • 将webdav.json 放在data下的确很方便,但是建议允许自定义文件路径,允许放在数据目录外。 所以请求再添一个环境变量写明配置文件路径,即处理--config "$WEBDAV_CONFIGFILE"。当然 默认值还是原来的/data/webdav.json。
  • 建议使用CMD作为ENTRYPOINT参数以允许以下行为
    • 建议在entrypoint中使用 exec su-exec runner python .... 使python 作为PID 1
    • 建议在entrypoint中使用 exec $* 允许方便的进入容器内
      demo:
##dockerfile
ENTRYPOINT [  "/app/entrypoint.sh"  ]
CMD [ "serve"]
## entrypoint.sh
if [ "$1" == "serve" ]; then
          exec su-exec runner \
                 python -m asgi_webdav \
		--host "$WEBDAV_HOST" \
		--port "$WEBDAV_PORT" \
		--config config/webdav.json \
		--logging-no-display-datetime \
		--logging-no-use-colors 
else
	exec $*
fi

@bonjour-py
Copy link
Contributor Author

以上建议都是entrypoint处理的

@rexzhang
Copy link
Owner

可以,具体在PR讨论?

配置文件 webdav.json 默认会暴露到网络上这个设计

  • 方便用户快速启动服务后,通过webdav协议挂载到win/mac系统下用自己擅长的编辑器做复杂编辑
  • 安全问题其实是有最佳实践的
docker -v /mnt/photos:/mnt/photos
"provider_mapping":[
   {
       "prefix":"/",
       "uri":"file:///data/root",
       "read_only": true
   },
   {
       "prefix":"/photos",
       "uri":"file:///mnt/photos"
   }
   ...
]

基础用户给他们开箱即用,高级用户给他们高级方案

  • 关于这部分,更大的问题其实是在解析配置后启动服务时,没有对用户的不安全设置做完善的警告和最佳实践引导.这部分也欢迎PR
  • 如果你有兴趣深入了解本项目,欢迎从撰写中文文档开始 ;-),如果能顺便再完善下其它语言就更好了,哈哈哈

@rexzhang
Copy link
Owner

嗯...在docker环境使用 $WEBDAV_CONFIGFILE 来控制docker实例的启动参数,似乎并不会对普通用户造成困扰,而且这样的话,用户可以直接将默认的 /data 路径作为所有数据文件的根目录,这样更容易理解.

@rexzhang
Copy link
Owner

这个issue我关了,其它问题分别开单独的issue. issue只讨论技术方案的,具体的技术细节在PR Draft中讨论

@rexzhang
Copy link
Owner

啊,抱歉忘了,还需要更新相关的文档

@rexzhang rexzhang reopened this Jun 14, 2024
@rexzhang
Copy link
Owner

e91eb09

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants