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

Get sandstorm user id in launcher script #1

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
46 changes: 46 additions & 0 deletions .sandstorm/get-sandstorm-id.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
#!/usr/bin/python3
from http.server import BaseHTTPRequestHandler, HTTPServer
import os, tempfile, sys

os.chdir(os.path.split(__file__)[0])

[_, serverPort, reloadDelay, envOutputPath] = sys.argv
serverPort = int(serverPort)

hostName = "0.0.0.0"

class MyServer(BaseHTTPRequestHandler):
def write_id(self, sandstorm_id):
dir_path = os.path.split(envOutputPath)[0]
f = tempfile.NamedTemporaryFile(mode='w', dir=dir_path, delete=False)
f.write(sandstorm_id)
f.close()
os.rename(f.name, envOutputPath)

def do_GET(self):
self.write_id(self.headers['X-Sandstorm-User-Id'])
self.send_response(200)
self.send_header("Content-type", "text/html")
self.end_headers()

# reloadDelay ms "hopefully" is enough time for the next server to start
Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This could be risky with the migration. I'm not sure how long it'll take. Sandstorm might be forgiving on the first request and let you do a long migration, but this makes an extra request to get the sandstorm ID. If you set it too low, the next server won't be there when it reloads the page. I wonder if Caddy could handle it smoothly though.

# can make this marginally faster and more reliable by returning
# 503 and using Caddy's load balancer to wait for the service to start
self.wfile.write(bytes(f"<script>setTimeout(() => window.location = '/', {reloadDelay})</script>", "utf-8"))
# Quit so that the service can start with the sandstorm id
exit(0)

if __name__ == "__main__":
if os.path.exists(envOutputPath):
exit(0)

webServer = HTTPServer((hostName, serverPort), MyServer)
print("Server started http://%s:%s" % (hostName, serverPort))

try:
webServer.serve_forever()
except KeyboardInterrupt:
pass

webServer.server_close()
print("Server stopped.")
5 changes: 4 additions & 1 deletion .sandstorm/launcher.sh
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,9 @@ done

redis-server --daemonize yes

./get-sandstorm-id.py 8000 1000 /var/sandstorm-id
echo "Sandstorm User ID: $(cat /var/sandstorm-id)" # whatever you need to do with it

cd /opt/paperless/src
$VENV/bin/python3 manage.py migrate
$VENV/bin/python3 manage.py runserver
$VENV/bin/python3 manage.py runserver