Rustrak (Full Stack)
Self-hosted error tracking compatible with Sentry SDKs. Includes server, web dashboard UI, and PostgreSQL. Written in Rust with <100MB memory footprint.
Configuration
version: "3.8"
services:
rustrak-server:
image: abians7/rustrak-server:v0.2.1-postgres
restart: unless-stopped
environment:
- HOST=0.0.0.0
- PORT=8080
- RUST_LOG=info
- SSL_PROXY=true
- DATABASE_URL=postgres://rustrak:${POSTGRES_PASSWORD}@postgres:5432/rustrak
- SESSION_SECRET_KEY=${SESSION_SECRET_KEY}
- CREATE_SUPERUSER=${CREATE_SUPERUSER}
ports:
- 8080
depends_on:
postgres:
condition: service_healthy
rustrak-ui:
image: abians7/rustrak-ui:v0.1.6
restart: unless-stopped
environment:
- RUSTRAK_API_URL=${RUSTRAK_API_URL}
ports:
- 3000
depends_on:
- rustrak-server
postgres:
image: postgres:16-alpine
restart: unless-stopped
environment:
- POSTGRES_USER=rustrak
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
- POSTGRES_DB=rustrak
volumes:
- postgres_data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U rustrak -d rustrak"]
interval: 10s
timeout: 5s
retries: 5
expose:
- 5432
volumes:
postgres_data:[variables]
main_domain = "${domain}"
api_domain = "${domain}"
postgres_password = "${password:32}"
session_secret_key = "${password:64}"
admin_email = "${email}"
admin_password = "${password:16}"
create_superuser = "${admin_email}:${admin_password}"
rustrak_api_url = "https://${api_domain}"
[config]
env = [
"POSTGRES_PASSWORD=${postgres_password}",
"SESSION_SECRET_KEY=${session_secret_key}",
"CREATE_SUPERUSER=${create_superuser}",
"RUSTRAK_API_URL=${rustrak_api_url}",
]
[[config.domains]]
serviceName = "rustrak-ui"
port = 3000
host = "${main_domain}"
[[config.domains]]
serviceName = "rustrak-server"
port = 8080
host = "${api_domain}"Base64
To import this template in Dokploy: create a Compose service → Advanced → Base64 import and paste the content below:
ewogICJjb21wb3NlIjogInZlcnNpb246IFwiMy44XCJcblxuc2VydmljZXM6XG4gIHJ1c3RyYWstc2VydmVyOlxuICAgIGltYWdlOiBhYmlhbnM3L3J1c3RyYWstc2VydmVyOnYwLjIuMS1wb3N0Z3Jlc1xuICAgIHJlc3RhcnQ6IHVubGVzcy1zdG9wcGVkXG4gICAgZW52aXJvbm1lbnQ6XG4gICAgICAtIEhPU1Q9MC4wLjAuMFxuICAgICAgLSBQT1JUPTgwODBcbiAgICAgIC0gUlVTVF9MT0c9aW5mb1xuICAgICAgLSBTU0xfUFJPWFk9dHJ1ZVxuICAgICAgLSBEQVRBQkFTRV9VUkw9cG9zdGdyZXM6Ly9ydXN0cmFrOiR7UE9TVEdSRVNfUEFTU1dPUkR9QHBvc3RncmVzOjU0MzIvcnVzdHJha1xuICAgICAgLSBTRVNTSU9OX1NFQ1JFVF9LRVk9JHtTRVNTSU9OX1NFQ1JFVF9LRVl9XG4gICAgICAtIENSRUFURV9TVVBFUlVTRVI9JHtDUkVBVEVfU1VQRVJVU0VSfVxuICAgIHBvcnRzOlxuICAgICAgLSA4MDgwXG4gICAgZGVwZW5kc19vbjpcbiAgICAgIHBvc3RncmVzOlxuICAgICAgICBjb25kaXRpb246IHNlcnZpY2VfaGVhbHRoeVxuXG4gIHJ1c3RyYWstdWk6XG4gICAgaW1hZ2U6IGFiaWFuczcvcnVzdHJhay11aTp2MC4xLjZcbiAgICByZXN0YXJ0OiB1bmxlc3Mtc3RvcHBlZFxuICAgIGVudmlyb25tZW50OlxuICAgICAgLSBSVVNUUkFLX0FQSV9VUkw9JHtSVVNUUkFLX0FQSV9VUkx9XG4gICAgcG9ydHM6XG4gICAgICAtIDMwMDBcbiAgICBkZXBlbmRzX29uOlxuICAgICAgLSBydXN0cmFrLXNlcnZlclxuXG4gIHBvc3RncmVzOlxuICAgIGltYWdlOiBwb3N0Z3JlczoxNi1hbHBpbmVcbiAgICByZXN0YXJ0OiB1bmxlc3Mtc3RvcHBlZFxuICAgIGVudmlyb25tZW50OlxuICAgICAgLSBQT1NUR1JFU19VU0VSPXJ1c3RyYWtcbiAgICAgIC0gUE9TVEdSRVNfUEFTU1dPUkQ9JHtQT1NUR1JFU19QQVNTV09SRH1cbiAgICAgIC0gUE9TVEdSRVNfREI9cnVzdHJha1xuICAgIHZvbHVtZXM6XG4gICAgICAtIHBvc3RncmVzX2RhdGE6L3Zhci9saWIvcG9zdGdyZXNxbC9kYXRhXG4gICAgaGVhbHRoY2hlY2s6XG4gICAgICB0ZXN0OiBbXCJDTUQtU0hFTExcIiwgXCJwZ19pc3JlYWR5IC1VIHJ1c3RyYWsgLWQgcnVzdHJha1wiXVxuICAgICAgaW50ZXJ2YWw6IDEwc1xuICAgICAgdGltZW91dDogNXNcbiAgICAgIHJldHJpZXM6IDVcbiAgICBleHBvc2U6XG4gICAgICAtIDU0MzJcblxudm9sdW1lczpcbiAgcG9zdGdyZXNfZGF0YTpcbiIsCiAgImNvbmZpZyI6ICJbdmFyaWFibGVzXVxubWFpbl9kb21haW4gPSBcIiR7ZG9tYWlufVwiXG5hcGlfZG9tYWluID0gXCIke2RvbWFpbn1cIlxucG9zdGdyZXNfcGFzc3dvcmQgPSBcIiR7cGFzc3dvcmQ6MzJ9XCJcbnNlc3Npb25fc2VjcmV0X2tleSA9IFwiJHtwYXNzd29yZDo2NH1cIlxuYWRtaW5fZW1haWwgPSBcIiR7ZW1haWx9XCJcbmFkbWluX3Bhc3N3b3JkID0gXCIke3Bhc3N3b3JkOjE2fVwiXG5jcmVhdGVfc3VwZXJ1c2VyID0gXCIke2FkbWluX2VtYWlsfToke2FkbWluX3Bhc3N3b3JkfVwiXG5ydXN0cmFrX2FwaV91cmwgPSBcImh0dHBzOi8vJHthcGlfZG9tYWlufVwiXG5cbltjb25maWddXG5lbnYgPSBbXG4gIFwiUE9TVEdSRVNfUEFTU1dPUkQ9JHtwb3N0Z3Jlc19wYXNzd29yZH1cIixcbiAgXCJTRVNTSU9OX1NFQ1JFVF9LRVk9JHtzZXNzaW9uX3NlY3JldF9rZXl9XCIsXG4gIFwiQ1JFQVRFX1NVUEVSVVNFUj0ke2NyZWF0ZV9zdXBlcnVzZXJ9XCIsXG4gIFwiUlVTVFJBS19BUElfVVJMPSR7cnVzdHJha19hcGlfdXJsfVwiLFxuXVxuXG5bW2NvbmZpZy5kb21haW5zXV1cbnNlcnZpY2VOYW1lID0gXCJydXN0cmFrLXVpXCJcbnBvcnQgPSAzMDAwXG5ob3N0ID0gXCIke21haW5fZG9tYWlufVwiXG5cbltbY29uZmlnLmRvbWFpbnNdXVxuc2VydmljZU5hbWUgPSBcInJ1c3RyYWstc2VydmVyXCJcbnBvcnQgPSA4MDgwXG5ob3N0ID0gXCIke2FwaV9kb21haW59XCJcbiIKfQ==Links
Tags
monitoring, error-tracking, sentry, rust, observability, postgresql
Version: 0.2.1
Rustrak
Self-hosted error tracking compatible with Sentry SDKs. Server only, written in Rust with <100MB memory footprint and SQLite storage. No external database required.
ruTorrent
ruTorrent + rTorrent BitTorrent client (crazy-max image). Web UI on 8080, XMLRPC on 8000, with P2P ports exposed for seeding.