mirror of
https://github.com/pewdiepie-archdaemon/odysseus.git
synced 2026-08-09 10:39:11 +02:00
fix(config): forward Google email OAuth settings through Compose (#5650)
* fix(config): forward Google OAuth env vars into Docker container and document setup GOOGLE_OAUTH_CLIENT_ID, GOOGLE_OAUTH_CLIENT_SECRET, and GOOGLE_OAUTH_REDIRECT_URI were read by the app but never forwarded through docker-compose.yml's explicit environment allowlist, causing the "not set" error even when the vars existed in .env. Also adds a documented section to .env.example with step-by-step GCP setup instructions so users know where to get the credentials. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix(config): cover OAuth in standalone compose files * test(config): parse OAuth compose service env * test(config): keep checkout skip wording neutral --------- Co-authored-by: TNTBA <trynottobreakanything@gmail.com> Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
parent
93f97e74cd
commit
dcc7e52a86
5 changed files with 98 additions and 0 deletions
21
.env.example
21
.env.example
|
|
@ -130,6 +130,27 @@ SEARXNG_INSTANCE=http://localhost:8080
|
||||||
# FASTEMBED_MODEL=sentence-transformers/all-MiniLM-L6-v2
|
# FASTEMBED_MODEL=sentence-transformers/all-MiniLM-L6-v2
|
||||||
# FASTEMBED_CACHE_PATH= # defaults to ~/.cache/fastembed
|
# FASTEMBED_CACHE_PATH= # defaults to ~/.cache/fastembed
|
||||||
|
|
||||||
|
# ============================================================
|
||||||
|
# Google OAuth2 (Google Workspace / .edu email accounts)
|
||||||
|
# ============================================================
|
||||||
|
# Required to use the "Connect with Google" OAuth flow in email account setup.
|
||||||
|
# Create credentials at: console.cloud.google.com → APIs & Services → Credentials
|
||||||
|
# 1. Enable the Gmail API for your project.
|
||||||
|
# 2. Configure the OAuth consent screen (User Type: Internal for Workspace orgs).
|
||||||
|
# Add scopes: https://mail.google.com/ and email.
|
||||||
|
# 3. Create an OAuth 2.0 Client ID (type: Web application).
|
||||||
|
# Add your redirect URI: http://localhost:7000/api/email/oauth/google/callback
|
||||||
|
# (replace host/port for hosted installs).
|
||||||
|
# 4. Copy the Client ID and Client Secret below.
|
||||||
|
#
|
||||||
|
# GOOGLE_OAUTH_CLIENT_ID=your-client-id.apps.googleusercontent.com
|
||||||
|
# GOOGLE_OAUTH_CLIENT_SECRET=replace-with-client-secret
|
||||||
|
#
|
||||||
|
# Set this explicitly for HTTPS, reverse-proxy, or hosted deployments. The
|
||||||
|
# value must exactly match an authorized redirect URI in the Google client.
|
||||||
|
# Local HTTP setups may use the callback URL inferred by the application.
|
||||||
|
# GOOGLE_OAUTH_REDIRECT_URI=https://your-domain.com/api/email/oauth/google/callback
|
||||||
|
|
||||||
# ============================================================
|
# ============================================================
|
||||||
# Misc
|
# Misc
|
||||||
# ============================================================
|
# ============================================================
|
||||||
|
|
|
||||||
|
|
@ -70,6 +70,9 @@ services:
|
||||||
- DATA_BRAVE_API_KEY=${DATA_BRAVE_API_KEY:-}
|
- DATA_BRAVE_API_KEY=${DATA_BRAVE_API_KEY:-}
|
||||||
- GOOGLE_API_KEY=${GOOGLE_API_KEY:-}
|
- GOOGLE_API_KEY=${GOOGLE_API_KEY:-}
|
||||||
- GOOGLE_PSE_CX=${GOOGLE_PSE_CX:-}
|
- GOOGLE_PSE_CX=${GOOGLE_PSE_CX:-}
|
||||||
|
- GOOGLE_OAUTH_CLIENT_ID=${GOOGLE_OAUTH_CLIENT_ID:-}
|
||||||
|
- GOOGLE_OAUTH_CLIENT_SECRET=${GOOGLE_OAUTH_CLIENT_SECRET:-}
|
||||||
|
- GOOGLE_OAUTH_REDIRECT_URI=${GOOGLE_OAUTH_REDIRECT_URI:-}
|
||||||
- TAVILY_API_KEY=${TAVILY_API_KEY:-}
|
- TAVILY_API_KEY=${TAVILY_API_KEY:-}
|
||||||
- SERPER_API_KEY=${SERPER_API_KEY:-}
|
- SERPER_API_KEY=${SERPER_API_KEY:-}
|
||||||
# PUID / PGID — the user/group the container drops to before
|
# PUID / PGID — the user/group the container drops to before
|
||||||
|
|
|
||||||
|
|
@ -69,6 +69,9 @@ services:
|
||||||
- DATA_BRAVE_API_KEY=${DATA_BRAVE_API_KEY:-}
|
- DATA_BRAVE_API_KEY=${DATA_BRAVE_API_KEY:-}
|
||||||
- GOOGLE_API_KEY=${GOOGLE_API_KEY:-}
|
- GOOGLE_API_KEY=${GOOGLE_API_KEY:-}
|
||||||
- GOOGLE_PSE_CX=${GOOGLE_PSE_CX:-}
|
- GOOGLE_PSE_CX=${GOOGLE_PSE_CX:-}
|
||||||
|
- GOOGLE_OAUTH_CLIENT_ID=${GOOGLE_OAUTH_CLIENT_ID:-}
|
||||||
|
- GOOGLE_OAUTH_CLIENT_SECRET=${GOOGLE_OAUTH_CLIENT_SECRET:-}
|
||||||
|
- GOOGLE_OAUTH_REDIRECT_URI=${GOOGLE_OAUTH_REDIRECT_URI:-}
|
||||||
- TAVILY_API_KEY=${TAVILY_API_KEY:-}
|
- TAVILY_API_KEY=${TAVILY_API_KEY:-}
|
||||||
- SERPER_API_KEY=${SERPER_API_KEY:-}
|
- SERPER_API_KEY=${SERPER_API_KEY:-}
|
||||||
# PUID / PGID — the user/group the container drops to before
|
# PUID / PGID — the user/group the container drops to before
|
||||||
|
|
|
||||||
|
|
@ -58,6 +58,9 @@ services:
|
||||||
- DATA_BRAVE_API_KEY=${DATA_BRAVE_API_KEY:-}
|
- DATA_BRAVE_API_KEY=${DATA_BRAVE_API_KEY:-}
|
||||||
- GOOGLE_API_KEY=${GOOGLE_API_KEY:-}
|
- GOOGLE_API_KEY=${GOOGLE_API_KEY:-}
|
||||||
- GOOGLE_PSE_CX=${GOOGLE_PSE_CX:-}
|
- GOOGLE_PSE_CX=${GOOGLE_PSE_CX:-}
|
||||||
|
- GOOGLE_OAUTH_CLIENT_ID=${GOOGLE_OAUTH_CLIENT_ID:-}
|
||||||
|
- GOOGLE_OAUTH_CLIENT_SECRET=${GOOGLE_OAUTH_CLIENT_SECRET:-}
|
||||||
|
- GOOGLE_OAUTH_REDIRECT_URI=${GOOGLE_OAUTH_REDIRECT_URI:-}
|
||||||
- TAVILY_API_KEY=${TAVILY_API_KEY:-}
|
- TAVILY_API_KEY=${TAVILY_API_KEY:-}
|
||||||
- SERPER_API_KEY=${SERPER_API_KEY:-}
|
- SERPER_API_KEY=${SERPER_API_KEY:-}
|
||||||
# PUID / PGID — the user/group the container drops to before
|
# PUID / PGID — the user/group the container drops to before
|
||||||
|
|
|
||||||
68
tests/test_email_oauth_docker_config.py
Normal file
68
tests/test_email_oauth_docker_config.py
Normal file
|
|
@ -0,0 +1,68 @@
|
||||||
|
"""Regression coverage for Google OAuth configuration in Docker Compose."""
|
||||||
|
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
import pytest
|
||||||
|
import yaml
|
||||||
|
|
||||||
|
|
||||||
|
ROOT = Path(__file__).resolve().parent.parent
|
||||||
|
COMPOSE_PATHS = tuple(
|
||||||
|
ROOT / name
|
||||||
|
for name in (
|
||||||
|
"docker-compose.yml",
|
||||||
|
"docker-compose.gpu-nvidia.yml",
|
||||||
|
"docker-compose.gpu-amd.yml",
|
||||||
|
)
|
||||||
|
)
|
||||||
|
ENV_EXAMPLE_PATH = ROOT / ".env.example"
|
||||||
|
|
||||||
|
|
||||||
|
def _env_example():
|
||||||
|
if not ENV_EXAMPLE_PATH.exists():
|
||||||
|
pytest.skip("this checkout does not include the optional .env.example file")
|
||||||
|
return ENV_EXAMPLE_PATH.read_text(encoding="utf-8")
|
||||||
|
|
||||||
|
|
||||||
|
def _odysseus_environment(path):
|
||||||
|
compose = yaml.safe_load(path.read_text(encoding="utf-8"))
|
||||||
|
return set(compose["services"]["odysseus"]["environment"])
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.parametrize(
|
||||||
|
"key",
|
||||||
|
(
|
||||||
|
"GOOGLE_OAUTH_CLIENT_ID",
|
||||||
|
"GOOGLE_OAUTH_CLIENT_SECRET",
|
||||||
|
"GOOGLE_OAUTH_REDIRECT_URI",
|
||||||
|
),
|
||||||
|
)
|
||||||
|
def test_google_oauth_setting_is_forwarded(key):
|
||||||
|
expected = f"{key}=${{{key}:-}}"
|
||||||
|
for path in COMPOSE_PATHS:
|
||||||
|
assert expected in _odysseus_environment(path), path.name
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.parametrize(
|
||||||
|
"key",
|
||||||
|
(
|
||||||
|
"GOOGLE_OAUTH_CLIENT_ID",
|
||||||
|
"GOOGLE_OAUTH_CLIENT_SECRET",
|
||||||
|
"GOOGLE_OAUTH_REDIRECT_URI",
|
||||||
|
),
|
||||||
|
)
|
||||||
|
def test_google_oauth_setting_is_documented(key):
|
||||||
|
assert f"# {key}=" in _env_example()
|
||||||
|
|
||||||
|
|
||||||
|
def test_google_oauth_example_uses_a_neutral_secret_placeholder():
|
||||||
|
env_example = _env_example()
|
||||||
|
assert "GOOGLE_OAUTH_CLIENT_SECRET=replace-with-client-secret" in env_example
|
||||||
|
assert "GOCSPX-" not in env_example
|
||||||
|
|
||||||
|
|
||||||
|
def test_redirect_documentation_covers_https_and_reverse_proxies():
|
||||||
|
oauth_section = _env_example().split("# Google OAuth2", 1)[1].split("# Misc", 1)[0]
|
||||||
|
assert "HTTPS" in oauth_section
|
||||||
|
assert "reverse-proxy" in oauth_section
|
||||||
|
assert "exactly match an authorized redirect URI" in oauth_section
|
||||||
Loading…
Add table
Add a link
Reference in a new issue