Skip to content

Private Location Self-Hosted Not Registering/SeenΒ #1941

@terrancesnyder

Description

@terrancesnyder

I have followed the instructions and tried many different things. Overall basically private location shows up but "not seen". Examining all logs and options I dont see anything that shows the reason.

# networks:
#     openstatus:
#         driver: bridge
#         name: openstatus

volumes:
    libsql-data:
        name: openstatus-libsql-data

services:
    # External services
    libsql:
        container_name: openstatus-libsql
        image: ghcr.io/tursodatabase/libsql-server:latest
        networks:
            - pdns-net
        dns:
            - ${DNS_HOST}
        ports:
            - "8082:8080"
            - "5001:5001"
        volumes:
            - libsql-data:/var/lib/sqld
        environment:
            - SQLD_NODE=primary
        healthcheck:
            test:
                [
                    "CMD-SHELL",
                    'perl -e ''use IO::Socket::INET; exit(IO::Socket::INET->new(PeerAddr=>"127.0.0.1:8080",Timeout=>1) ? 0 : 1);''',
                ]
            interval: 10s
            timeout: 5s
            retries: 5
            start_period: 10s
        restart: unless-stopped

    tinybird-local:
        container_name: openstatus-tinybird
        image: tinybirdco/tinybird-local:latest
        platform: linux/amd64
        networks:
            - pdns-net
        dns:
            - ${DNS_HOST}
        ports:
            - "7181:7181"
        environment:
            - COMPATIBILITY_MODE=1
        healthcheck:
            test: ["CMD", "curl", "-f", "http://localhost:7181/"]
            interval: 15s
            timeout: 5s
            retries: 5
            start_period: 20s
        restart: unless-stopped

    # Internal Services
    workflows:
        container_name: openstatus-workflows
        build:
            context: .
            dockerfile: apps/workflows/Dockerfile
        image: openstatus/workflows:latest
        networks:
            - pdns-net
        dns:
            - ${DNS_HOST}
        ports:
            - "3003:3000"
        volumes:
            - ./data:/app/data
        env_file:
            - .env.docker
        environment:
            - DATABASE_URL=http://libsql:8080
            - PORT=3000
        depends_on:
            libsql:
                condition: service_healthy
        healthcheck:
            test: ["CMD-SHELL", "curl -f http://localhost:3000/ping || exit 1"]
            interval: 15s
            timeout: 10s
            retries: 3
            start_period: 30s
        restart: unless-stopped

    server:
        container_name: openstatus-server
        build:
            context: .
            dockerfile: apps/server/Dockerfile
        image: openstatus/server:latest
        networks:
            - pdns-net
        dns:
            - ${DNS_HOST}
        ports:
            - "3002:3000"
        env_file:
            - .env.docker
        environment:
            - DATABASE_URL=http://libsql:8080
            - PORT=3000
        depends_on:
            workflows:
                condition: service_healthy
            libsql:
                condition: service_healthy
        healthcheck:
            test: ["CMD-SHELL", "curl -f http://localhost:3000/ping || exit 1"]
            interval: 15s
            timeout: 10s
            retries: 3
            start_period: 30s
        restart: unless-stopped

    private-location:
        container_name: openstatus-private-location
        build:
            context: apps/private-location
            dockerfile: Dockerfile
        image: openstatus/private-location:latest
        networks:
            - pdns-net
        dns:
            - ${DNS_HOST}
        ports:
            - "8081:8080"
        env_file:
            - .env.docker
        environment:
            - DB_URL=http://libsql:8080
            - GIN_MODE=release
            - PORT=8080
        depends_on:
            server:
                condition: service_healthy
        healthcheck:
            test:
                [
                    "CMD",
                    "wget",
                    "--spider",
                    "-q",
                    "http://localhost:8080/health",
                ]
            interval: 15s
            timeout: 10s
            retries: 3
            start_period: 30s
        restart: unless-stopped

    dashboard:
        container_name: openstatus-dashboard
        build:
            context: .
            dockerfile: apps/dashboard/Dockerfile
        image: openstatus/dashboard:latest
        networks:
            - pdns-net
        dns:
            - ${DNS_HOST}
        ports:
            - "3005:3000"
        env_file:
            - .env.docker
        environment:
            - DATABASE_URL=http://libsql:8080
            - PORT=3000
            - HOSTNAME=0.0.0.0
            - AUTH_TRUST_HOST=true
        depends_on:
            workflows:
                condition: service_healthy
            libsql:
                condition: service_healthy
            server:
                condition: service_healthy
        healthcheck:
            test: ["CMD-SHELL", "curl -f http://localhost:3000/ || exit 1"]
            interval: 15s
            timeout: 10s
            retries: 3
            start_period: 45s
        restart: unless-stopped

    status-page:
        container_name: openstatus-status-page
        build:
            context: .
            dockerfile: apps/status-page/Dockerfile
        image: openstatus/status-page:latest
        networks:
            - pdns-net
        dns:
            - ${DNS_HOST}
        ports:
            - "3004:3000"
        env_file:
            - .env.docker
        environment:
            - DATABASE_URL=http://libsql:8080
            - PORT=3000
            - HOSTNAME=0.0.0.0
            - AUTH_TRUST_HOST=true
        depends_on:
            workflows:
                condition: service_healthy
            libsql:
                condition: service_healthy
            server:
                condition: service_healthy
        healthcheck:
            test: ["CMD-SHELL", "curl -f http://localhost:3000/ || exit 1"]
            interval: 15s
            timeout: 10s
            retries: 3
            start_period: 45s
        restart: unless-stopped

networks:
  pdns-net:
    external: true

and my env is

# ============================================================================
# Docker Environment Configuration (Example)
# ============================================================================
# Copy this file to .env.docker and replace with your actual values
#
# NOTE: Build-time placeholders are set in each service's dofigen.yml file.
# Values in this file override those placeholders at runtime via docker compose.
# Required values are marked with [REQUIRED]

# DATABASE
# ============================================================================
# LibSQL database connection - points to the libsql container
DATABASE_URL=http://libsql:8080
DATABASE_AUTH_TOKEN=


# REDIS & QUEUE
# ============================================================================
# Redis (optional) - for caching
UPSTASH_REDIS_REST_URL=http://localhost:6379
UPSTASH_REDIS_REST_TOKEN=placeholder

# QStash (optional - for background jobs)
QSTASH_CURRENT_SIGNING_KEY=
QSTASH_NEXT_SIGNING_KEY=
QSTASH_TOKEN=
QSTASH_URL=https://qstash.upstash.io/v1/publish/

# ANALYTICS
# ============================================================================
# Tinybird (optional - for monitor analytics and charts)
# Leave empty to disable analytics features
# Get from: https://www.tinybird.co
TINYBIRD_TOKEN=p.eyJ1IjogImI3NWY0M2ZmLTZlMjktNDZhZC1iODQ1LWFiMDc2YWU2MzY4MSIsICJpZCI6ICJiNmQ3MzJjYy1kMzdmLTQ5NTEtODA3Yi03N2NhMjI1OGQ0YzEiLCAiaG9zdCI6IG51bGx9._iOVcMdb6w0eyE9OI-n0VgN2SdUzWdhaZyCIPOGG7Kg
CLOUD_PROVIDER=local

# Tinybird URL (optional - defaults to cloud API)
# For local Tinybird container, set to: http://tinybird-local:7181
TINYBIRD_URL=http://tinybird-local:7181

# EMAIL
# ============================================================================
# [REQUIRED] Resend API key for sending magic link emails
# Get from: https://resend.com
RESEND_API_KEY=re_your_resend_api_key_here

# AUTHENTICATION
# ============================================================================
# [REQUIRED] NextAuth secret - generate with: openssl rand -base64 32
AUTH_SECRET=your-random-secret-here-min-32-chars

# [REQUIRED] Self-hosted mode - enables magic link authentication
# Set to "true" to allow email login without OAuth
SELF_HOST="true"

# GitHub OAuth (optional)
# Get from: https://github.com/settings/developers
AUTH_GITHUB_ID=
AUTH_GITHUB_SECRET=

# Google OAuth (optional)
# Get from: https://console.cloud.google.com
AUTH_GOOGLE_ID=
AUTH_GOOGLE_SECRET=

# GOOGLE CLOUD
# ============================================================================
# Google Cloud Platform (optional - for scheduled tasks)
GCP_PROJECT_ID=your-value
GCP_LOCATION=your-value
GCP_CLIENT_EMAIL=your-value
GCP_PRIVATE_KEY=your-value

# Cron secret for scheduled jobs
CRON_SECRET=your-random-cron-secret

# API KEYS
# ============================================================================
# Unkey (optional - for API key management)
# Get from: https://unkey.dev
UNKEY_API_ID=
UNKEY_TOKEN=

# Super admin token for privileged operations
SUPER_ADMIN_TOKEN=

# Server region identifier
FLY_REGION=self-hosted

# STRIPE
# ============================================================================
# Stripe (optional - for payments)
# Get from: https://stripe.com/docs/keys
STRIPE_SECRET_KEY=
STRIPE_WEBHOOK_SECRET_KEY=
NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY=

# VERCEL
# ============================================================================
# Vercel (optional - for custom domains)
# Get from: https://vercel.com
PROJECT_ID_VERCEL=
TEAM_ID_VERCEL=
VERCEL_AUTH_BEARER_TOKEN=

# Vercel Blob storage (optional)
BLOB_READ_WRITE_TOKEN=

# OBSERVABILITY
# ============================================================================
# Sentry (optional - error tracking)
# Get from: https://sentry.io
NEXT_PUBLIC_SENTRY_DSN=
SENTRY_AUTH_TOKEN=

# OpenPanel (optional - analytics)
# Get from: https://openpanel.dev
NEXT_PUBLIC_OPENPANEL_CLIENT_ID=
OPENPANEL_CLIENT_SECRET=

# PagerDuty (optional - alerting)
PAGERDUTY_APP_ID=

# Slack webhook (optional)
SLACK_SUPPORT_WEBHOOK_URL=

# Telegram Bot (optional)
TELEGRAM_BOT_TOKEN=

# SERVICE CONFIGURATION
# ============================================================================
NODE_ENV=production

# [REQUIRED] Public URL for the application
NEXT_PUBLIC_URL=https://openstatus.dev.klustr.io

# Screenshot service (optional)
SCREENSHOT_SERVICE_URL=

# External services
OPENSTATUS_INGEST_URL=http://openstatus-server:3000
OPENSTATUS_KEY=c749ac36-4ab2-4e06-b43a-6e12588604f3

# DEVELOPMENT & TESTING
# ============================================================================
# Turbo build mode
TURBO_ENV_MODE=loose

# Playground API keys (optional)
PLAYGROUND_UNKEY_API_KEY=

# Workspace settings (optional)
WORKSPACES_LOOKBACK_30=
WORKSPACES_HIDE_URL=
Image

I had to put openstatus behind HTTPs given the error identified with #1927.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions