<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://entorb.net//wiki/index.php?action=history&amp;feed=atom&amp;title=Uberspace</id>
	<title>Uberspace - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://entorb.net//wiki/index.php?action=history&amp;feed=atom&amp;title=Uberspace"/>
	<link rel="alternate" type="text/html" href="https://entorb.net//wiki/index.php?title=Uberspace&amp;action=history"/>
	<updated>2026-05-06T10:25:31Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.1</generator>
	<entry>
		<id>https://entorb.net//wiki/index.php?title=Uberspace&amp;diff=5404&amp;oldid=prev</id>
		<title>Torben: /* Streamlit */</title>
		<link rel="alternate" type="text/html" href="https://entorb.net//wiki/index.php?title=Uberspace&amp;diff=5404&amp;oldid=prev"/>
		<updated>2026-04-08T05:44:30Z</updated>

		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;Streamlit&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 07:44, 8 April 2026&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l241&quot;&gt;Line 241:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 241:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  [program:strava-streamlit]&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  [program:strava-streamlit]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  directory=%(ENV_HOME)s/strava-streamlit&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  directory=%(ENV_HOME)s/strava-streamlit&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;command=streamlit run src/app.py&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  command=python3.11 -O -m streamlit run src/app.py&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt; # or &lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-added&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt; # &lt;/del&gt;command=python3.11 -O -m streamlit run src/app.py&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-added&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  # for env var:&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  # for env var:&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  environment=MY_VAR=&amp;quot;asdf&amp;quot;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  environment=MY_VAR=&amp;quot;asdf&amp;quot;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Torben</name></author>
	</entry>
	<entry>
		<id>https://entorb.net//wiki/index.php?title=Uberspace&amp;diff=5403&amp;oldid=prev</id>
		<title>Torben: /* Streamlit */</title>
		<link rel="alternate" type="text/html" href="https://entorb.net//wiki/index.php?title=Uberspace&amp;diff=5403&amp;oldid=prev"/>
		<updated>2026-04-08T05:44:01Z</updated>

		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;Streamlit&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 07:44, 8 April 2026&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l231&quot;&gt;Line 231:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 231:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Add web backend&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Add web backend&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  uberspace web backend set /strava-streamlit --http --port 8501&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  uberspace web backend set /strava-streamlit --http --port 8501&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt; maybe add --remove-prefix&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Access it via browser&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Access it via browser&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l243&quot;&gt;Line 243:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 244:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  # or  &lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  # or  &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  # command=python3.11 -O -m streamlit run src/app.py&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  # command=python3.11 -O -m streamlit run src/app.py&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt; # for env var:&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt; environment=MY_VAR=&quot;asdf&quot;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  loglevel=info&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  loglevel=info&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Torben</name></author>
	</entry>
	<entry>
		<id>https://entorb.net//wiki/index.php?title=Uberspace&amp;diff=5358&amp;oldid=prev</id>
		<title>Torben: /* Python FastAPI */</title>
		<link rel="alternate" type="text/html" href="https://entorb.net//wiki/index.php?title=Uberspace&amp;diff=5358&amp;oldid=prev"/>
		<updated>2025-10-18T22:35:57Z</updated>

		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;Python FastAPI&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;[[Category:Webserver]][[Category:Linux]]&lt;br /&gt;
==Manuals==&lt;br /&gt;
https://manual.uberspace.de and https://lab.uberspace.de&lt;br /&gt;
&lt;br /&gt;
==PHP==&lt;br /&gt;
see https://manual.uberspace.de/lang-php/&lt;br /&gt;
&lt;br /&gt;
to restart&lt;br /&gt;
 uberspace tools restart php&lt;br /&gt;
&lt;br /&gt;
===php-fpm===&lt;br /&gt;
 less /opt/uberspace/etc/$USER/php-fpm.conf&lt;br /&gt;
&lt;br /&gt;
==Python FastAPI==&lt;br /&gt;
see https://lab.uberspace.de/guide_fastapi/&lt;br /&gt;
 &lt;br /&gt;
 # var 1: venv&lt;br /&gt;
 python3.11 -m venv venv&lt;br /&gt;
 source venv/bin/activate&lt;br /&gt;
 pip install fastapi uvicorn&lt;br /&gt;
 pip install fastapi.responses&lt;br /&gt;
 pip install gunicorn uvloop httptools&lt;br /&gt;
 deactivate&lt;br /&gt;
 &lt;br /&gt;
 # var 2: not use venv&lt;br /&gt;
 pip3.11 install --user fastapi uvicorn fastapi.responses gunicorn uvloop httptools&lt;br /&gt;
 &lt;br /&gt;
 # config backend&lt;br /&gt;
 uberspace web backend set /strava-be --http --port 9001&lt;br /&gt;
 # --remove-prefix&lt;br /&gt;
 uberspace web backend list&lt;br /&gt;
 &lt;br /&gt;
 supervisorctl restart fastapi&lt;br /&gt;
 &lt;br /&gt;
~/fastapi/conf.py&lt;br /&gt;
 #!/usr/bin/env python3.10&lt;br /&gt;
 &lt;br /&gt;
 # apply changes via&lt;br /&gt;
 # supervisorctl restart fastapi&lt;br /&gt;
 &lt;br /&gt;
 import os&lt;br /&gt;
 &lt;br /&gt;
 app_path = os.environ[&amp;quot;HOME&amp;quot;] + &amp;quot;/fastapi&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 # Gunicorn configuration&lt;br /&gt;
 wsgi_app = &amp;quot;main:api&amp;quot;&lt;br /&gt;
 bind = &amp;quot;:9001&amp;quot;&lt;br /&gt;
 chdir = app_path&lt;br /&gt;
 workers = 1&lt;br /&gt;
 worker_class = &amp;quot;uvicorn.workers.UvicornWorker&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 # errorlog = app_path + &amp;quot;/errors.log&amp;quot;&lt;br /&gt;
 # accesslog = app_path + &amp;quot;/access.log&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
~/fastapi/main.py&lt;br /&gt;
 #!/usr/bin/env python3.10&lt;br /&gt;
 &lt;br /&gt;
 # apply changes via&lt;br /&gt;
 # supervisorctl restart fastapi&lt;br /&gt;
 &lt;br /&gt;
 from fastapi import FastAPI&lt;br /&gt;
 from fastapi.responses import JSONResponse&lt;br /&gt;
 from pydantic import BaseModel&lt;br /&gt;
 &lt;br /&gt;
 import subprocess&lt;br /&gt;
  &lt;br /&gt;
 class StravaSession(BaseModel):&lt;br /&gt;
     sessionId: str&lt;br /&gt;
 &lt;br /&gt;
 api = FastAPI()&lt;br /&gt;
  &lt;br /&gt;
 @api.post(&amp;quot;/strava-be/activityStats2/&amp;quot;)&lt;br /&gt;
 async def activityStats2(session: StravaSession):&lt;br /&gt;
     # return {session}&lt;br /&gt;
     response = {}&lt;br /&gt;
     # response = {&amp;quot;session&amp;quot;: session.sessionId}&lt;br /&gt;
     process = subprocess.run(&lt;br /&gt;
         [&lt;br /&gt;
             &amp;quot;python3.10&amp;quot;,&lt;br /&gt;
             &amp;quot;/var/www/virtual/entorb/html/strava/activityStats2.py&amp;quot;,&lt;br /&gt;
             session.sessionId,&lt;br /&gt;
         ],&lt;br /&gt;
         capture_output=True,&lt;br /&gt;
     )&lt;br /&gt;
 &lt;br /&gt;
     if process.returncode == 0:&lt;br /&gt;
         response[&amp;quot;status&amp;quot;] = &amp;quot;ok&amp;quot;&lt;br /&gt;
         response_code = 200&lt;br /&gt;
         # response[&amp;quot;process_stdout&amp;quot;] = process.stdout.decode()&lt;br /&gt;
     else:&lt;br /&gt;
         response[&amp;quot;status&amp;quot;] = &amp;quot;error&amp;quot;&lt;br /&gt;
         response_code = 400&lt;br /&gt;
         # response[&amp;quot;process_stdout&amp;quot;] = process.stdout.decode()&lt;br /&gt;
         response[&amp;quot;error_message&amp;quot;] = process.stderr.decode()&lt;br /&gt;
     return JSONResponse(content=response, status_code=response_code)&lt;br /&gt;
 &lt;br /&gt;
 # To test this app locally, uncomment:&lt;br /&gt;
 # import uvicorn&lt;br /&gt;
 # uvicorn.run(api, host=&amp;quot;localhost&amp;quot;, port=8001)&lt;br /&gt;
 &lt;br /&gt;
 # curl -i -X POST &amp;quot;https://entorb.net/strava-be/activityStats2/&amp;quot; -H &amp;quot;Content-Type: application/json&amp;quot; -d &amp;#039;{&amp;quot;sessionId&amp;quot;: &amp;quot;1234&amp;quot;}&amp;#039;&lt;br /&gt;
&lt;br /&gt;
==Checkliste neuer U7 Account==&lt;br /&gt;
 ~/.bashrc und ~/.bash_profile von altem angeglichen&lt;br /&gt;
Logs aktiviert&lt;br /&gt;
 uberspace web log access enable&lt;br /&gt;
 uberspace web log apache_error enable&lt;br /&gt;
 uberspace web log php_error enable&lt;br /&gt;
 uberspace web errorpage 500 disable&lt;br /&gt;
&lt;br /&gt;
==Probleme bei der Migration Uberspace U6 zu U7==&lt;br /&gt;
===0. E-Mails===&lt;br /&gt;
Es scheinen keine E-Mails mehr rein und raus zu gehen. (Account xxx@entorb.net). &lt;br /&gt;
&lt;br /&gt;
Neuer Webmailer ist https://webmail.uberspace.de , dieser zeigt aber erst nach Abschluss der Migration auf das neue Postfach. Solange die Migration nicht abgeschlossen ist, muss im Mail Client (wie Thunderbird) dieser Login für den U7 Mail Account verwendet werden:&lt;br /&gt;
statt xxx@entorb.net -&amp;gt; xxx@entorb.uber.space&lt;br /&gt;
&lt;br /&gt;
===1. HTTPS Zertifikat===&lt;br /&gt;
HTTPS Zertifikat war auf einmal nicht mehr gültig für https://www.entorb.net . Das hatte erst auch auf dem U7 funktioniert, nun plötzlich nicht mehr. UPDATE: Problem verschwand von alleine, hing vielleicht mit dem DNS Umzug zusammen.&lt;br /&gt;
&lt;br /&gt;
===2. bestehende ezmlm Mailinglisten===&lt;br /&gt;
ezmlm ist gemäß [https://lab.uberspace.de/guide_ezmlm.html Anleitung] installiert, allerdings sagt mir&lt;br /&gt;
 ezmlm-make -+ ~/ezmlm/oldlist ~/.qmail-oldlist oldlist entorb.uber.space&lt;br /&gt;
 &amp;gt; ezmlm-make: fatal: unable to stat /etc/ezmlm/de: file does not exist&lt;br /&gt;
&lt;br /&gt;
Wenn ich hingegen testweise einen neuen Verteiler anlege tut es:&lt;br /&gt;
 ezmlm-make -A -u -m -5 xxx@entorb.net ~/ezmlm/mylist ~/.qmail-mylist&lt;br /&gt;
mylist entorb.uber.space&lt;br /&gt;
und diesen kann ich dann auch bearbeiten via&lt;br /&gt;
 ezmlm-make -+ ~/ezmlm/mylist ~/.qmail-mylist mylist entorb.uber.space&lt;br /&gt;
&lt;br /&gt;
Lösung:&lt;br /&gt;
 in ezmlm/oldlist/ezmlmrc die entsprechende Zeile löschen&lt;br /&gt;
&lt;br /&gt;
===3. Zugriff auf Dateien außerhab von ~/html===&lt;br /&gt;
Ich hatte einige Dateien (wie zB eine sqlite DB) in meinem Home (~/) liegen. Auf diese sollen Skripte die sich unter&lt;br /&gt;
 ~/html-&amp;gt;/var/www/virtual/entorb/html &lt;br /&gt;
befinden zugreifen können. Das funktionierte nicht mehr, da SELinux hier rein grätscht &lt;br /&gt;
&lt;br /&gt;
Beste Lösung: Die Dateien auf die der httpd zugreifen soll nach&lt;br /&gt;
 /var/www/virtual/entorb/ &lt;br /&gt;
verschieben und im Home Symlink hinterlassen.&lt;br /&gt;
&lt;br /&gt;
Erster Ansatz: der SELinux Kontexte lässt sich so setzen (Siehe [https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/selinux_users_and_administrators_guide/sect-security-enhanced_linux-working_with_selinux-selinux_contexts_labeling_files]&lt;br /&gt;
).&lt;br /&gt;
 chcon -t httpd_sys_content_t file-name&lt;br /&gt;
half hier aber nicht:&lt;br /&gt;
 ls -laZ /home/ |grep ento&lt;br /&gt;
 drwx------. entorb      entorb      unconfined_u:object_r:user_home_dir_t:s0 entorb&lt;br /&gt;
&lt;br /&gt;
===4. Perl Module, wie zB Excel::Writer::XLSX===&lt;br /&gt;
Installiert via&lt;br /&gt;
 cpanm Excel::Writer::XLSX&lt;br /&gt;
&lt;br /&gt;
Führe ich das Skript ~/html/test.pl in der Shell aus, wird das Modul&lt;br /&gt;
gefunden und geladen. Im Browser via https://entorb.net/test.pl wird&lt;br /&gt;
das Modul nicht gefunden.&lt;br /&gt;
&lt;br /&gt;
Ursache 4.1 war dass SELinux den Zugriff des httpd auf /home/entorb/perl5 blockierte&lt;br /&gt;
&lt;br /&gt;
Lösung:&lt;br /&gt;
~/perl5 Verzeichnis nach &lt;br /&gt;
 /var/www/virtual/entorb/perl5&lt;br /&gt;
verschoben und im Home einen Symlink hinterlassen. &lt;br /&gt;
&lt;br /&gt;
Dann zuerst lib::local installiert, dann andere Module.&lt;br /&gt;
&lt;br /&gt;
Ursache 4.2 war dass ich in der .bashrc dies gesetzt habe:&lt;br /&gt;
 eval $(perl -I$HOME/perl5/lib/perl5 -Mlocal::lib)&lt;br /&gt;
das musste ich im Perl Skript ebenfalls hinterlegen:&lt;br /&gt;
 use lib (&amp;#039;/var/www/virtual/entorb/perl5/lib/perl5&amp;#039;);&lt;br /&gt;
 # aber !kein! use local::lib; !!!&lt;br /&gt;
&lt;br /&gt;
===5. sendmail===&lt;br /&gt;
ich stellte fest, dass ich im U7 aus Python oder Perl CGI Skripten nicht mehr auf sendmail zugreifen kann. Über die Shell kommt die Mail sofort an. Beispiel:&lt;br /&gt;
8&amp;lt;---&lt;br /&gt;
 import os&lt;br /&gt;
 SENDMAIL = &amp;quot;/usr/sbin/sendmail&amp;quot;&lt;br /&gt;
 to = &amp;quot;xxx@entorb.net&amp;quot;&lt;br /&gt;
 subject   = &amp;quot;testmail&amp;quot;&lt;br /&gt;
 sender = &amp;quot;U7 &amp;lt;no-reply@entorb.net&amp;gt;&amp;quot;&lt;br /&gt;
 body = &amp;quot;leer&amp;quot;&lt;br /&gt;
 mail = f&amp;quot;To: {to}\nSubject: {subject}\nFrom: {sender}\nContent-Type:&lt;br /&gt;
 text/plain; charset=\&amp;quot;utf-8\&amp;quot;\n\n{body}&amp;quot;&lt;br /&gt;
 p = os.popen(f&amp;quot;{SENDMAIL} -t -i&amp;quot;, &amp;quot;w&amp;quot;)&lt;br /&gt;
 p.write(mail)&lt;br /&gt;
 p.close()&lt;br /&gt;
 8&amp;lt;---&lt;br /&gt;
Lösung: statt Versand aus Web-Skripten/Seiten via sendmail, besser aus den Skripten ein Insert in eine SQLite DB machen und diese via cronjob und php mail() Funktion periodisch abarbeiten.&lt;br /&gt;
&lt;br /&gt;
===6. Wiederholung der Migration===&lt;br /&gt;
Entweder einfach Migration auf dem U6 nochmal starten via&lt;br /&gt;
 uberspace-move-account -u entorb&lt;br /&gt;
oder in Dashboard den Umzug abbrechen und neu starten -&amp;gt; anderer Server.&lt;br /&gt;
&lt;br /&gt;
===7. MySQL DB Passwort angeblich zu kurz===&lt;br /&gt;
Das Migrationsskript hatte behauptet, dass mein MySQL Passwort zu kurz sei. Stimmte nicht, vermutlich kam es mit den Sonderzeichen durcheinander. Habe daher ein neues langes ohne Sonderzeichen vergeben.&lt;br /&gt;
&lt;br /&gt;
==Streamlit==&lt;br /&gt;
see also [https://github.com/entorb/strava-streamlit/blob/main/README.md strava-streamlit readme]&lt;br /&gt;
&lt;br /&gt;
Installation&lt;br /&gt;
 pip3.11 install --user streamlit&lt;br /&gt;
&lt;br /&gt;
Setup dir and config&lt;br /&gt;
 mkdir ~/strava-streamlit&lt;br /&gt;
 cd ~/strava-streamlit&lt;br /&gt;
 mkdir .streamlit&lt;br /&gt;
 vim .streamlit/config.toml&lt;br /&gt;
&lt;br /&gt;
 [browser]&lt;br /&gt;
 gatherUsageStats = false&lt;br /&gt;
 &lt;br /&gt;
 [server]&lt;br /&gt;
 headless = true&lt;br /&gt;
 port = 8501&lt;br /&gt;
 baseUrlPath = &amp;quot;/strava-streamlit&amp;quot;&lt;br /&gt;
&lt;br /&gt;
baseUrlPath is important when not running in web server document root &lt;br /&gt;
&lt;br /&gt;
create minimal Streamlit app&lt;br /&gt;
 vim src/app.py&lt;br /&gt;
&lt;br /&gt;
 import streamlit as st&lt;br /&gt;
 st.title(&amp;quot;Test&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
start it manually as testrun (stop by ctrl+c)&lt;br /&gt;
 streamlit run src/app.py&lt;br /&gt;
&lt;br /&gt;
Add web backend&lt;br /&gt;
 uberspace web backend set /strava-streamlit --http --port 8501&lt;br /&gt;
&lt;br /&gt;
Access it via browser&lt;br /&gt;
https://entorb.net/strava-streamlit&lt;br /&gt;
&lt;br /&gt;
Create Service&lt;br /&gt;
 vim ~/etc/services.d/strava-streamlit.ini&lt;br /&gt;
&lt;br /&gt;
 [program:strava-streamlit]&lt;br /&gt;
 directory=%(ENV_HOME)s/strava-streamlit&lt;br /&gt;
 command=streamlit run src/app.py&lt;br /&gt;
 # or &lt;br /&gt;
 # command=python3.11 -O -m streamlit run src/app.py&lt;br /&gt;
 loglevel=info&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Start Service&lt;br /&gt;
 supervisorctl reread&lt;br /&gt;
 supervisorctl update&lt;br /&gt;
 supervisorctl status&lt;br /&gt;
 supervisorctl restart strava-streamlit&lt;br /&gt;
&lt;br /&gt;
Check log&lt;br /&gt;
 supervisorctl tail -f strava-streamlit&lt;br /&gt;
 # as this is empty:&lt;br /&gt;
 tail -f ~/logs/supervisord.log&lt;/div&gt;</summary>
		<author><name>Torben</name></author>
	</entry>
</feed>