Services#
SkyPortal runs as a set of supervised background processes. On make run, every
directory under services.paths (baselayer/services/ and services/, plus any
external service you cloned) becomes a supervisor program.
Disabling services#
Everything runs by default. Name what you do not want in your config.yaml:
services:
disabled:
- dask
- slack
Or invert the choice, turning everything off and naming what to run:
services:
disabled: "*"
enabled:
- app
- nginx
A name matching no service is ignored silently, so check the spelling below when a service you meant to disable keeps starting.
Most services already sleep when the feature they serve is unconfigured, so disabling them saves a process and its database connections, not CPU. The ones worth listing are those that poll for something you do not use.
baselayer services#
| Service | Role | Disable |
| ——————- | —————————————————————————– | —————————————— |
| app | Tornado backends serving the API and the frontend, server.processes of them | Required |
| nginx | Reverse proxy in front of the app processes | Required |
| migration_manager | Applies alembic migrations at startup, then answers readiness checks | Required |
| message_proxy | ZeroMQ proxy carrying internal messages to websocket_server | Required |
| websocket_server | Pushes live updates to open browsers | Required |
| status_server | Serves the “being provisioned” page until the app answers | Never, it only serves the boot page |
| cron | Runs the jobs declared under cron in the config | No jobs declared |
| external_logging | Tails the logs and forwards them to a remote syslog | Not shipping logs |
| fake_oauth2 | Stub Google OAuth provider for server.auth.debug_login | Real OAuth |
| rspack | Watches the frontend sources and rebuilds the bundle | Production, where the bundle is built once |
| dask | Scheduler and four workers that nothing in SkyPortal connects to | Always, disabled by default |
SkyPortal services#
| Service | Role | Disable |
| ———————————- | ————————————————————————————— | ————————————————- |
| health_monitor | Polls each app process and restarts the ones that stop answering | Supervising the processes yourself |
| pgbouncer | Bundled connection pooler | Already inert without database.pooler.enabled |
| notification_queue | Delivers user notifications (email, SMS, Slack, push) | Never, notifications stop being delivered |
| facility_queue | Submits and polls follow-up requests to observing facilities | No follow-up |
| observation_plan_queue | Builds and submits the observation plans of the MMA workflow | No MMA |
| recurring_apis | Calls the RecurringAPI records users created | Feature unused |
| reminders | Delivers the reminders users set on sources, GCN events and shifts | Feature unused |
| thumbnail_queue | Fetches SDSS/LS/PS1 cutouts for new objects | No outbound network |
| tns_retrieval_queue | Matches your objects against TNS reports | Idles without app.tns.* |
| sharing_service_submission_queue | Submits sources to TNS and Hermes for the sharing services | No sharing service |
| jpl_sbident_queue | Answers “is this a known minor planet?” through JPL SBIdent | Feature unused |
| gcn_service | Consumes GCN Kafka notices | Idles without gcn.client_id/gcn.client_secret |
| gcn_crossmatch | Crossmatches GCN alerts against sources, see GCN crossmatch | Idles without gcn_crossmatch.enabled |
| ep_service | Ingests candidates from the proprietary Einstein Probe feed | Idles without einstein_probe.enabled |
| scout_service | Consumes the JPL Scout NEO ToO Kafka stream | Idles without scout.* |
| neofixer_service | Polls NEOFixer target lists and annotates solar system objects | Idles without neofixer.enabled |
| tess_sector | Loads TESS sector footprints and annotates coverage | Idles without tess.enabled |
| broker_ingest | Runs the ingestion loop of each active broker, see broker ingestion | Idles without brokers.ingest_enabled |
| hermes_skyportal_sync | Consumes the Hermes Kafka topic into sources and photometry | Idles without app.hermes.sync.* |
| pdl_service | Watches a PDL receiver directory and ingests earthquake QuakeML | No PDL client feeding it |
| slack | Proxies Slack notifications so the token stays server-side | No Slack integration |
| assistant | Answers posted assistant messages through the MCP endpoint | No app.assistant configured |
| openai_analysis_service | Analysis backend: LLM summaries and embeddings | No AnalysisService record points at it |
| sn_analysis_service | Analysis backend: supernova light curve fitting | No AnalysisService record points at it |
| ngsf_analysis_service | Analysis backend: NGSF spectral fitting | No AnalysisService record points at it |
| spectral_cube_analysis_service | Analysis backend: spectral cube extraction | No AnalysisService record points at it |