<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Trivia-Quest on 4n6Post</title><link>https://4n6post.com/tags/trivia-quest/</link><description>Recent content in Trivia-Quest on 4n6Post</description><atom:link href="https://4n6post.com/tags/trivia-quest/index.xml" rel="self" type="application/rss+xml"/><item><title>Trivia Quest</title><link>https://4n6post.com/dockers/trivia-quest/</link><pubDate>2026-09-20</pubDate><description>&lt;p&gt;Trivia Quest is a quiz / jeopardy stytle game that can be used for training, educationm, and fun. You can use pre-made trivia questions or create your own. Designed for offline/internal use and quickly deployable using Docker.&lt;/p&gt;
&lt;h2 id="portainer-stack"&gt;Portainer Stack&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Ref:&lt;/strong&gt; &lt;a href="https://github.com/Jonesckevin/trivia-quest"&gt;https://github.com/Jonesckevin/trivia-quest&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="../images/trivia-quest_example.png" alt="Live-Translate Example"&gt;&lt;/p&gt;
&lt;h2 id="bash-docker-run"&gt;Bash Docker Run&lt;/h2&gt;
&lt;div class="code-block-wrapper"&gt;
&lt;details class="code-block-collapsible" open&gt;
&lt;summary class="code-block-header"&gt;
&lt;span class="code-language"&gt;bash&lt;/span&gt;
&lt;span class="code-line-count"&gt;11 lines&lt;/span&gt;
&lt;/summary&gt;
&lt;div class="code-block-content"&gt;
&lt;pre class="line-numbers language-bash"&gt;&lt;code class="language-bash"&gt;&lt;span class="line-number" data-line="1"&gt;&lt;/span&gt;docker pull jonesckevin/trivia-quest:latest
&lt;span class="line-number" data-line="2"&gt;&lt;/span&gt;
&lt;span class="line-number" data-line="3"&gt;&lt;/span&gt;docker run --rm -p 3023:80 `
&lt;span class="line-number" data-line="4"&gt;&lt;/span&gt; -e &amp;#34;APP_TITLE=Trivia Quest&amp;#34; `
&lt;span class="line-number" data-line="5"&gt;&lt;/span&gt; -e &amp;#34;JWT_SECRET=change-me-this-should-be-32-chars-minimum-for-security!&amp;#34; `
&lt;span class="line-number" data-line="6"&gt;&lt;/span&gt; -e &amp;#34;SECRET_KEY=change-me-this-should-be-32-chars-minimum-for-security!&amp;#34; `
&lt;span class="line-number" data-line="7"&gt;&lt;/span&gt; -e &amp;#34;ADMIN_PASSWORD=admin123&amp;#34; `
&lt;span class="line-number" data-line="8"&gt;&lt;/span&gt; -e &amp;#34;ACCOUNTS_ENABLED=false&amp;#34; `
&lt;span class="line-number" data-line="9"&gt;&lt;/span&gt; -e &amp;#34;REQUIRE_USER_PASSWORD=false&amp;#34; `
&lt;span class="line-number" data-line="10"&gt;&lt;/span&gt; -e &amp;#34;MAX_UPLOAD_MB=25&amp;#34; `
&lt;span class="line-number" data-line="11"&gt;&lt;/span&gt; jonesckevin/trivia-quest:latest&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/details&gt;
&lt;/div&gt;&lt;h2 id="docker-compose"&gt;Docker Compose&lt;/h2&gt;
&lt;div class="code-block-wrapper"&gt;
&lt;details class="code-block-collapsible" open&gt;
&lt;summary class="code-block-header"&gt;
&lt;span class="code-language"&gt;yaml&lt;/span&gt;
&lt;span class="code-line-count"&gt;43 lines&lt;/span&gt;
&lt;/summary&gt;
&lt;div class="code-block-content"&gt;
&lt;pre class="line-numbers language-yaml"&gt;&lt;code class="language-yaml"&gt;&lt;span class="line-number" data-line="1"&gt;&lt;/span&gt;services:
&lt;span class="line-number" data-line="2"&gt;&lt;/span&gt; trivia-quest:
&lt;span class="line-number" data-line="3"&gt;&lt;/span&gt; image: jonesckevin/trivia-quest:latest
&lt;span class="line-number" data-line="4"&gt;&lt;/span&gt; container_name: trivia-quest
&lt;span class="line-number" data-line="5"&gt;&lt;/span&gt; ports:
&lt;span class="line-number" data-line="6"&gt;&lt;/span&gt; - &amp;#34;3002:80&amp;#34;
&lt;span class="line-number" data-line="7"&gt;&lt;/span&gt; environment:
&lt;span class="line-number" data-line="8"&gt;&lt;/span&gt; - APP_TITLE=${APP_TITLE:-Trivia Quest}
&lt;span class="line-number" data-line="9"&gt;&lt;/span&gt; # JWT — persistent secret so tokens survive container restarts.
&lt;span class="line-number" data-line="10"&gt;&lt;/span&gt; # Change this value if you want to invalidate all existing sessions.
&lt;span class="line-number" data-line="11"&gt;&lt;/span&gt; # Generate a new one with: $(openssl rand -hex 32)
&lt;span class="line-number" data-line="12"&gt;&lt;/span&gt; - JWT_SECRET=${JWT_SECRET:-change-me-i-am-not-secret}
&lt;span class="line-number" data-line="13"&gt;&lt;/span&gt; - SECRET_KEY=${SECRET_KEY:-change-me-i-am-not-secret}
&lt;span class="line-number" data-line="14"&gt;&lt;/span&gt; - JWT_TTL_SECONDS=${JWT_TTL_SECONDS:-86400}
&lt;span class="line-number" data-line="15"&gt;&lt;/span&gt; # CORS — set to your frontend origin in production (e.g. https://yourdomain.com)
&lt;span class="line-number" data-line="16"&gt;&lt;/span&gt; - CORS_ALLOWED_ORIGINS=${CORS_ALLOWED_ORIGINS:-*}
&lt;span class="line-number" data-line="17"&gt;&lt;/span&gt; # Rate limiting
&lt;span class="line-number" data-line="18"&gt;&lt;/span&gt; - LOGIN_RATE_MAX=${LOGIN_RATE_MAX:-5}
&lt;span class="line-number" data-line="19"&gt;&lt;/span&gt; - LOGIN_RATE_WINDOW=${LOGIN_RATE_WINDOW:-900}
&lt;span class="line-number" data-line="20"&gt;&lt;/span&gt; - REG_RATE_MAX=${REG_RATE_MAX:-3}
&lt;span class="line-number" data-line="21"&gt;&lt;/span&gt; - REG_RATE_WINDOW=${REG_RATE_WINDOW:-3600}
&lt;span class="line-number" data-line="22"&gt;&lt;/span&gt; # Proxy
&lt;span class="line-number" data-line="23"&gt;&lt;/span&gt; - TRUST_PROXY=${TRUST_PROXY:-false} # Set true when behind a reverse proxy that sets X-Forwarded-For
&lt;span class="line-number" data-line="24"&gt;&lt;/span&gt; - MAX_UPLOAD_MB=${MAX_UPLOAD_MB:-25} # File upload
&lt;span class="line-number" data-line="25"&gt;&lt;/span&gt; # Quiz settings
&lt;span class="line-number" data-line="26"&gt;&lt;/span&gt; - ADMIN_PASSWORD=${ADMIN_PASSWORD:-admin123}
&lt;span class="line-number" data-line="27"&gt;&lt;/span&gt; - ACCOUNTS_ENABLED=${ACCOUNTS_ENABLED:-false} # false = freeplay-only mode (no user accounts)
&lt;span class="line-number" data-line="28"&gt;&lt;/span&gt; - REQUIRE_USER_PASSWORD=${REQUIRE_USER_PASSWORD:-true} # true = users must set a password when registering (recommended)
&lt;span class="line-number" data-line="29"&gt;&lt;/span&gt; restart: unless-stopped
&lt;span class="line-number" data-line="30"&gt;&lt;/span&gt; security_opt:
&lt;span class="line-number" data-line="31"&gt;&lt;/span&gt; - no-new-privileges:true
&lt;span class="line-number" data-line="32"&gt;&lt;/span&gt; healthcheck:
&lt;span class="line-number" data-line="33"&gt;&lt;/span&gt; test: [&amp;#34;CMD&amp;#34;, &amp;#34;wget&amp;#34;, &amp;#34;-q&amp;#34;, &amp;#34;--spider&amp;#34;, &amp;#34;http://localhost/&amp;#34;, &amp;#34;&amp;amp;&amp;amp;&amp;#34;, &amp;#34;wget&amp;#34;, &amp;#34;-q&amp;#34;, &amp;#34;--spider&amp;#34;, &amp;#34;http://localhost/api/health&amp;#34;]
&lt;span class="line-number" data-line="34"&gt;&lt;/span&gt; interval: 30s
&lt;span class="line-number" data-line="35"&gt;&lt;/span&gt; timeout: 10s
&lt;span class="line-number" data-line="36"&gt;&lt;/span&gt; retries: 3
&lt;span class="line-number" data-line="37"&gt;&lt;/span&gt; start_period: 10s
&lt;span class="line-number" data-line="38"&gt;&lt;/span&gt; volumes:
&lt;span class="line-number" data-line="39"&gt;&lt;/span&gt; - ./data:/data # Contains the SQLite database and uploaded files (avatars, logos, etc.)
&lt;span class="line-number" data-line="40"&gt;&lt;/span&gt;
&lt;span class="line-number" data-line="41"&gt;&lt;/span&gt; ## Optional Mount custom question bank for updates without rebuild
&lt;span class="line-number" data-line="42"&gt;&lt;/span&gt; # volumes:
&lt;span class="line-number" data-line="43"&gt;&lt;/span&gt; # - ./question_bank:/question_bank:ro&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/details&gt;
&lt;/div&gt;&lt;h2 id="for-a-simplistic-view"&gt;For a simplistic view&lt;/h2&gt;
&lt;div class="code-block-wrapper"&gt;
&lt;details class="code-block-collapsible" open&gt;
&lt;summary class="code-block-header"&gt;
&lt;span class="code-language"&gt;bash&lt;/span&gt;
&lt;span class="code-line-count"&gt;12 lines&lt;/span&gt;
&lt;/summary&gt;
&lt;div class="code-block-content"&gt;
&lt;pre class="line-numbers language-bash"&gt;&lt;code class="language-bash"&gt;&lt;span class="line-number" data-line="1"&gt;&lt;/span&gt;git clone https://github.com/jonesckevin/trivia-quest.git
&lt;span class="line-number" data-line="2"&gt;&lt;/span&gt;cd trivia-quest
&lt;span class="line-number" data-line="3"&gt;&lt;/span&gt;docker build -t trivia-quest:latest .
&lt;span class="line-number" data-line="4"&gt;&lt;/span&gt;
&lt;span class="line-number" data-line="5"&gt;&lt;/span&gt;# Then run with your local image
&lt;span class="line-number" data-line="6"&gt;&lt;/span&gt;docker run -d \
&lt;span class="line-number" data-line="7"&gt;&lt;/span&gt; --name trivia-quest \
&lt;span class="line-number" data-line="8"&gt;&lt;/span&gt; -p 3023:80 \
&lt;span class="line-number" data-line="9"&gt;&lt;/span&gt; -v $(pwd)/data:/data \
&lt;span class="line-number" data-line="10"&gt;&lt;/span&gt; -e REQUIRE_AUTH=false \
&lt;span class="line-number" data-line="11"&gt;&lt;/span&gt; -e OFFLINE_MODE=auto \
&lt;span class="line-number" data-line="12"&gt;&lt;/span&gt; trivia-quest:latest&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/details&gt;
&lt;/div&gt;</description></item></channel></rss>