Simple Web App Launcher. Perfect for mounting on NAS units
72
A self-hosted start page for your homelab. Stargate shows the apps on your network as a grid of icons over an animated space background. You manage the list from a small admin panel.
DATABASE_URL and Stargate uses Postgres
instead of SQLite.linux/amd64 and linux/arm64: NAS boxes (UGREEN, Synology,
TrueNAS), mini PCs and Raspberry Pi.docker run -d --name stargate \
-p 4015:4015 \
-e [email protected] \
-v stargate_data:/app/data \
--restart unless-stopped \
louismanson/stargate:latest
Open http://<server-ip>:4015. Without ADMIN_PASSWORD, Stargate generates a
password and prints it once in the logs:
docker logs stargate | grep "Generated password"
services:
app:
image: louismanson/stargate:latest
restart: unless-stopped
ports:
- "4015:4015"
environment:
ADMIN_EMAIL: [email protected]
# 12+ characters. Leave empty to have one generated and shown in the logs.
ADMIN_PASSWORD: ""
volumes:
- stargate_data:/app/data
volumes:
stargate_data:
docker compose up -d
services:
app:
image: louismanson/stargate:latest
restart: unless-stopped
depends_on:
db:
condition: service_healthy
ports:
- "4015:4015"
environment:
ADMIN_EMAIL: [email protected]
ADMIN_PASSWORD: ""
DATABASE_URL: ecto://stargate:change-me@db/stargate
volumes:
- stargate_data:/app/data
db:
image: postgres:17
restart: unless-stopped
environment:
POSTGRES_USER: stargate
POSTGRES_PASSWORD: change-me
POSTGRES_DB: stargate
volumes:
- stargate_db:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U stargate -d stargate"]
interval: 5s
timeout: 5s
retries: 10
volumes:
stargate_data:
stargate_db:
Switching between SQLite and Postgres does not move your data. Stargate starts with an empty database and creates the admin again.
| Variable | Default | Description |
|---|---|---|
ADMIN_EMAIL | [email protected] | Email of the admin account created on first start. |
ADMIN_PASSWORD | (generated) | Admin password, 12+ characters. If empty, one is generated and printed once in the logs. Ignored once the admin exists. |
PORT | 4015 | Port the app listens on inside the container. |
DATABASE_URL | (empty) | ecto://USER:PASSWORD@HOST/DATABASE. When set, Postgres is used instead of SQLite. |
DATABASE_PATH | /app/data/stargate.db | Location of the SQLite file. |
POOL_SIZE | 5 (SQLite), 10 (Postgres) | Database connection pool size. |
ECTO_IPV6 | (empty) | true to connect to Postgres over IPv6. |
PHX_HOST | (empty) | Restricts the app to this host name. Access by IP stops working. Also makes generated URLs use https. |
PHX_SCHEME | http, or https with PHX_HOST | Scheme used in generated URLs. |
PHX_URL_PORT | PORT, or 443 over https | Public port used in generated URLs. |
SECRET_KEY_BASE | (generated) | Key that signs sessions. If unset, a random one is created and stored in /app/data/secret_key_base. |
RELEASE_COOKIE | (generated) | Erlang distribution cookie. If unset, a random one is created and stored in /app/data/release_cookie. |
Everything Stargate keeps lives in /app/data:
stargate.db: the SQLite database, unless you use Postgresuploads/: icons you uploadsecret_key_base and release_cookie: generated once per installMount a named volume there so the data survives updates. If you bind-mount a
host folder instead, the container's nobody user must be able to write to it.
Stargate works behind Nginx Proxy Manager, Traefik, Caddy or your NAS's own
proxy. It reads the public scheme, host and port from the X-Forwarded-*
headers. Point the proxy at http://<server-ip>:4015 and turn on WebSocket
support, since the interface uses it.
docker compose pull && docker compose up -d
Migrations run automatically on startup.
latest: the most recent build.0.1.0): use one to pin a specific release.Every tag is a multi-arch image for linux/amd64 and linux/arm64.
Content type
Image
Digest
sha256:f236bc2d6…
Size
57.8 MB
Last updated
1 day ago
docker pull louismanson/stargate