Executar como root funciona
Se eu executar streamlit
como root:
streamlit hello \
--browser.serverAddress dharmatech.dev \
--browser.serverPort 8502 \
--server.sslCertFile /etc/letsencrypt/live/dharmatech.dev/fullchain.pem \
--server.sslKeyFile /etc/letsencrypt/live/dharmatech.dev/privkey.pem
funciona bem e posso acessar o site em:
https://dharmatech.dev:8502/
Não rodando como root
Claro, eu prefiro não rodar streamlit
como root.
Se eu executá-lo como um usuário normal, recebo o seguinte:
$ streamlit hello --browser.serverAddress dharmatech.dev --browser.serverPort 8502 --server.sslCertFile /etc/letsencrypt/live/dharmatech.dev/fullchain.pem --server.sslKeyFile /etc/letsencrypt/live/dharmatech.dev/privkey.pem
Collecting usage statistics. To deactivate, set browser.gatherUsageStats to false.
Traceback (most recent call last):
File "/home/dharmatech/python-environments/env-3.10-streamlit/bin/streamlit", line 8, in <module>
sys.exit(main())
File "/home/dharmatech/python-environments/env-3.10-streamlit/lib/python3.10/site-packages/click/core.py", line 1157, in __call__
return self.main(*args, **kwargs)
File "/home/dharmatech/python-environments/env-3.10-streamlit/lib/python3.10/site-packages/click/core.py", line 1078, in main
rv = self.invoke(ctx)
File "/home/dharmatech/python-environments/env-3.10-streamlit/lib/python3.10/site-packages/click/core.py", line 1688, in invoke
return _process_result(sub_ctx.command.invoke(sub_ctx))
File "/home/dharmatech/python-environments/env-3.10-streamlit/lib/python3.10/site-packages/click/core.py", line 1434, in invoke
return ctx.invoke(self.callback, **ctx.params)
File "/home/dharmatech/python-environments/env-3.10-streamlit/lib/python3.10/site-packages/click/core.py", line 783, in invoke
return __callback(*args, **kwargs)
File "/home/dharmatech/python-environments/env-3.10-streamlit/lib/python3.10/site-packages/streamlit/web/cli.py", line 188, in main_hello
_main_run(filename, flag_options=kwargs)
File "/home/dharmatech/python-environments/env-3.10-streamlit/lib/python3.10/site-packages/streamlit/web/cli.py", line 270, in _main_run
bootstrap.run(file, is_hello, args, flag_options)
File "/home/dharmatech/python-environments/env-3.10-streamlit/lib/python3.10/site-packages/streamlit/web/bootstrap.py", line 405, in run
asyncio.run(run_server())
File "/usr/lib/python3.10/asyncio/runners.py", line 44, in run
return loop.run_until_complete(main)
File "/usr/lib/python3.10/asyncio/base_events.py", line 649, in run_until_complete
return future.result()
File "/home/dharmatech/python-environments/env-3.10-streamlit/lib/python3.10/site-packages/streamlit/web/bootstrap.py", line 393, in run_server
await server.start()
File "/home/dharmatech/python-environments/env-3.10-streamlit/lib/python3.10/site-packages/streamlit/web/server/server.py", line 269, in start
start_listening(app)
File "/home/dharmatech/python-environments/env-3.10-streamlit/lib/python3.10/site-packages/streamlit/web/server/server.py", line 118, in start_listening
ssl_options = _get_ssl_options(cert_file, key_file)
File "/home/dharmatech/python-environments/env-3.10-streamlit/lib/python3.10/site-packages/streamlit/web/server/server.py", line 143, in _get_ssl_options
if not Path(cert_file).exists():
File "/usr/lib/python3.10/pathlib.py", line 1290, in exists
self.stat()
File "/usr/lib/python3.10/pathlib.py", line 1097, in stat
return self._accessor.stat(self, follow_symlinks=follow_symlinks)
PermissionError: [Errno 13] Permission denied: '/etc/letsencrypt/live/dharmatech.dev/fullchain.pem'
Pergunta
Portanto, o problema é que o usuário comum não tem acesso aos arquivos fullchain.pem
e privkey.pem
.
Qual é a melhor prática para permitir streamlit
o acesso a esses arquivos sem executar como root?
Abordagem: alterar permissões
Eu poderia chmod
os arquivos e diretórios conforme apropriado. No entanto, já vi mencionado que os letsencrypt
arquivos têm as permissões redefinidas periodicamente. Portanto, esta não parece ser uma abordagem sustentável.
Abordagem: pós-renovação
Esta resposta:
https://serverfault.com/a/1085282/102828
menciona uma abordagem de script. No entanto, não vi ninguém sugerir essa abordagem, então estou me perguntando se essa é realmente a melhor prática aqui.