<?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>Docker Deployment on 4n6Post</title><link>https://4n6post.com/tags/docker-deployment/</link><description>Recent content in Docker Deployment on 4n6Post</description><atom:link href="https://4n6post.com/tags/docker-deployment/index.xml" rel="self" type="application/rss+xml"/><item><title>Live-Translate</title><link>https://4n6post.com/dockers/live-translate/</link><pubDate>2026-09-20</pubDate><description>&lt;p&gt;Live-Translate is a real-time translation tool that allows users to translate text and speech using direct or LLM translation methods using LibreTranslate. It supports multiple languages and can be deployed using Docker for easy setup for multi user available use and pure offline only operation.&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/live-translate"&gt;https://github.com/Jonesckevin/live-translate&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="../images/live-translate_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;18 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;# Live-Translate
&lt;span class="line-number" data-line="2"&gt;&lt;/span&gt;# https://github.com/Jonesckevin/live-translate
&lt;span class="line-number" data-line="3"&gt;&lt;/span&gt;
&lt;span class="line-number" data-line="4"&gt;&lt;/span&gt;docker run --name live-translate --restart unless-stopped -p 9015:5000 -v ./data:/data \
&lt;span class="line-number" data-line="5"&gt;&lt;/span&gt; -e ALLOW_AUTH=true \
&lt;span class="line-number" data-line="6"&gt;&lt;/span&gt; -e REQUIRE_AUTH=true \
&lt;span class="line-number" data-line="7"&gt;&lt;/span&gt; -e SOCKETIO_CORS_CREDENTIALS=true \
&lt;span class="line-number" data-line="8"&gt;&lt;/span&gt; -e ALLOW_USER_REGISTRATION=true \
&lt;span class="line-number" data-line="9"&gt;&lt;/span&gt; -e ALLOW_GUEST_LOGIN=true \
&lt;span class="line-number" data-line="10"&gt;&lt;/span&gt; -e WHISPER_ENABLED=true \
&lt;span class="line-number" data-line="11"&gt;&lt;/span&gt; -e WHISPER_MODEL=tiny \
&lt;span class="line-number" data-line="12"&gt;&lt;/span&gt; -e ENABLE_SERVER_ANALYTICS=false \
&lt;span class="line-number" data-line="13"&gt;&lt;/span&gt; -e SECRET_KEY=&amp;#39;$(openssl rand -hex 32)&amp;#39; \
&lt;span class="line-number" data-line="14"&gt;&lt;/span&gt; -e SECRETS=&amp;#39;$(openssl rand -hex 32)&amp;#39; \
&lt;span class="line-number" data-line="15"&gt;&lt;/span&gt; -e REQUIRE_SECRETS=true \
&lt;span class="line-number" data-line="16"&gt;&lt;/span&gt; -e LOGS_ACCESS_TOKEN= \
&lt;span class="line-number" data-line="17"&gt;&lt;/span&gt; -e ALLOW_CLIENT_API_KEYS=true \
&lt;span class="line-number" data-line="18"&gt;&lt;/span&gt; jonesckevin/live-translate: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;23 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; live-translate:
&lt;span class="line-number" data-line="3"&gt;&lt;/span&gt; image: jonesckevin/live-translate:latest
&lt;span class="line-number" data-line="4"&gt;&lt;/span&gt; container_name: live-translate
&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;9015:5000&amp;#34;
&lt;span class="line-number" data-line="7"&gt;&lt;/span&gt; volumes:
&lt;span class="line-number" data-line="8"&gt;&lt;/span&gt; - &amp;#34;./data:/data&amp;#34;
&lt;span class="line-number" data-line="9"&gt;&lt;/span&gt; environment:
&lt;span class="line-number" data-line="10"&gt;&lt;/span&gt; ALLOW_AUTH: &amp;#34;true&amp;#34;
&lt;span class="line-number" data-line="11"&gt;&lt;/span&gt; REQUIRE_AUTH: &amp;#34;true&amp;#34;
&lt;span class="line-number" data-line="12"&gt;&lt;/span&gt; SOCKETIO_CORS_CREDENTIALS: &amp;#34;true&amp;#34;
&lt;span class="line-number" data-line="13"&gt;&lt;/span&gt; ALLOW_USER_REGISTRATION: &amp;#34;true&amp;#34;
&lt;span class="line-number" data-line="14"&gt;&lt;/span&gt; ALLOW_GUEST_LOGIN: &amp;#34;true&amp;#34;
&lt;span class="line-number" data-line="15"&gt;&lt;/span&gt; WHISPER_ENABLED: &amp;#34;true&amp;#34;
&lt;span class="line-number" data-line="16"&gt;&lt;/span&gt; WHISPER_MODEL: &amp;#34;tiny&amp;#34;
&lt;span class="line-number" data-line="17"&gt;&lt;/span&gt; ENABLE_SERVER_ANALYTICS: &amp;#34;false&amp;#34;
&lt;span class="line-number" data-line="18"&gt;&lt;/span&gt; SECRET_KEY: &amp;#34;$(openssl rand -hex 32)&amp;#34;
&lt;span class="line-number" data-line="19"&gt;&lt;/span&gt; SECRETS: &amp;#34;$(openssl rand -hex 32)&amp;#34;
&lt;span class="line-number" data-line="20"&gt;&lt;/span&gt; REQUIRE_SECRETS: &amp;#34;true&amp;#34;
&lt;span class="line-number" data-line="21"&gt;&lt;/span&gt; LOGS_ACCESS_TOKEN: &amp;#34;&amp;#34;
&lt;span class="line-number" data-line="22"&gt;&lt;/span&gt; ALLOW_CLIENT_API_KEYS: &amp;#34;true&amp;#34;
&lt;span class="line-number" data-line="23"&gt;&lt;/span&gt; restart: unless-stopped&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/live-translate.git
&lt;span class="line-number" data-line="2"&gt;&lt;/span&gt;cd live-translate
&lt;span class="line-number" data-line="3"&gt;&lt;/span&gt;docker build -t live-translate: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 live-translate \
&lt;span class="line-number" data-line="8"&gt;&lt;/span&gt; -p 9015:5000 \
&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; live-translate:latest&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/details&gt;
&lt;/div&gt;</description></item><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>