Spaces:
Build error
Build error
import subprocess | |
import os | |
import time | |
from huggingface_hub import HfApi | |
def start_mastodon(): | |
# Ensure secrets are available | |
required_secrets = [ | |
"SECRET_KEY_BASE", | |
"OTP_SECRET", | |
"VAPID_PRIVATE_KEY", | |
"VAPID_PUBLIC_KEY" | |
] | |
for secret in required_secrets: | |
if not os.getenv(secret): | |
raise ValueError(f"Missing required secret: {secret}") | |
# Set environment variables, use port 7860 | |
os.environ["RAILS_ENV"] = "development" | |
os.environ["PORT"] = "7860" # Changed from 3000 to 7860 | |
os.environ["BIND"] = "0.0.0.0" | |
os.environ["LOCAL_DOMAIN"] = os.getenv("LOCAL_DOMAIN", "localhost") | |
os.environ["RAILS_SERVE_STATIC_FILES"] = os.getenv("RAILS_SERVE_STATIC_FILES", "true") | |
# Change to Mastodon directory | |
os.chdir("/app/mastodon") | |
# Patch Mastodon to use custom storage | |
with open("config/initializers/custom_storage.rb", "w") as f: | |
f.write(""" | |
# Custom storage initializer | |
require 'open3' | |
module CustomStorage | |
def self.call_python(action, *args) | |
cmd = ['python3', '/app/mastodon/mastodon_config.py', action, *args] | |
stdout, stderr, status = Open3.capture3(*cmd) | |
stdout.strip if status.success? | |
end | |
end | |
# Override User model (example) | |
class User | |
def self.find_by_username(username) | |
data = CustomStorage.call_python('get_user', username) | |
data ? new(JSON.parse(data)) : nil | |
end | |
def save | |
CustomStorage.call_python('save_user', username, to_json) | |
end | |
end | |
# Override Status model (example) | |
class Status | |
def save | |
CustomStorage.call_python('save_post', id.to_s, to_json) | |
end | |
def self.find(id) | |
data = CustomStorage.call_python('get_post', id.to_s) | |
data ? new(JSON.parse(data)) : nil | |
end | |
end | |
""") | |
# Start Puma server | |
process = subprocess.Popen( | |
["/root/.rbenv/shims/bundle", "exec", "puma", "-C", "config/puma.rb"], | |
env=os.environ, | |
stdout=subprocess.PIPE, | |
stderr=subprocess.PIPE | |
) | |
# Stream logs | |
while True: | |
output = process.stdout.readline() | |
if output == b'' and process.poll() is not None: | |
break | |
if output: | |
print(output.decode().strip()) | |
return process | |
if __name__ == "__main__": | |
print("Starting Mastodon with Hugging Face Secrets and Storage on port 7860...") | |
mastodon_process = start_mastodon() | |
mastodon_process.wait() |