feat: 切换邮箱认证并重构前后端启动与门禁

This commit is contained in:
qzl
2026-04-02 18:39:35 +08:00
parent 92cdfd9fca
commit 31594558eb
116 changed files with 5608 additions and 628 deletions
+2
View File
@@ -58,6 +58,8 @@ services:
GOTRUE_JWT_DEFAULT_GROUP_NAME: authenticated
GOTRUE_JWT_EXP: 3600
GOTRUE_JWT_SECRET: ${ERYAO_SUPABASE__JWT_SECRET}
GOTRUE_EXTERNAL_EMAIL_ENABLED: "true"
GOTRUE_EXTERNAL_PHONE_ENABLED: "false"
GOTRUE_MAILER_AUTOCONFIRM: "false"
GOTRUE_SMTP_ADMIN_EMAIL: dev@example.com
GOTRUE_SMTP_HOST: localhost
+6 -10
View File
@@ -4,6 +4,7 @@ set -euo pipefail
ROOT_DIR="$(cd "$(dirname "$0")/../.." && pwd)"
SESSION_NAME="${SESSION_NAME:-eryao-dev}"
ENV_FILE="$ROOT_DIR/.env"
ENV_LOADER="$ROOT_DIR/infra/scripts/lib/env.sh"
usage() {
echo "Usage: $0 {start|stop|restart}"
@@ -16,12 +17,9 @@ usage() {
}
load_env_if_exists() {
if [ -f "$ENV_FILE" ]; then
set -a
# shellcheck disable=SC1090
. "$ENV_FILE"
set +a
fi
# shellcheck disable=SC1090
. "$ENV_LOADER"
load_env_file "$ENV_FILE"
}
is_port_in_use() {
@@ -152,16 +150,14 @@ start() {
echo "Warning: ERYAO_DEEPSEEK__API_KEY is empty; deepseek calls may fail." >&2
fi
WEB_CMD="cd '$ROOT_DIR' && PYTHONPATH=backend/src ERYAO_RUNTIME__SERVICE_NAME=web uv run uvicorn backend.src.app:app --host ${ERYAO_WEB__HOST:-0.0.0.0} --port ${WEB_PORT} --workers ${ERYAO_WEB__WORKERS:-2} --log-level ${UVICORN_LOG_LEVEL}"
WEB_CMD="cd '$ROOT_DIR' && PYTHONPATH=backend/src ERYAO_RUNTIME__SERVICE_NAME=web uv run uvicorn app:app --host ${ERYAO_WEB__HOST:-0.0.0.0} --port ${WEB_PORT} --workers ${ERYAO_WEB__WORKERS:-2} --log-level ${UVICORN_LOG_LEVEL}"
WORKER_AGENT_CMD="cd '$ROOT_DIR' && PYTHONPATH=backend/src ERYAO_RUNTIME__SERVICE_NAME=worker-agent uv run taskiq worker core.taskiq.app:worker_agent_broker core.runtime.tasks --workers ${ERYAO_WORKER__GROUPS__AGENT__CONCURRENCY:-2}"
WORKER_GENERAL_CMD="cd '$ROOT_DIR' && PYTHONPATH=backend/src ERYAO_RUNTIME__SERVICE_NAME=worker-general uv run taskiq worker core.taskiq.app:worker_general_broker core.runtime.tasks --workers ${ERYAO_WORKER__GROUPS__GENERAL__CONCURRENCY:-1}"
echo "Starting tmux web process in session '$SESSION_NAME'..."
tmux new-session -d -s "$SESSION_NAME" -n web "bash -lc \"$WEB_CMD; echo '[web] exited'; exec bash\""
tmux new-window -t "$SESSION_NAME" -n worker-agent "bash -lc \"$WORKER_AGENT_CMD; echo '[worker-agent] exited'; exec bash\""
tmux new-window -t "$SESSION_NAME" -n worker-general "bash -lc \"$WORKER_GENERAL_CMD; echo '[worker-general] exited'; exec bash\""
echo ""
echo "=== App Started ==="
@@ -187,7 +183,7 @@ stop() {
echo "Checking for orphaned processes..."
kill_matching_processes "uvicorn" "uv run uvicorn backend.src.app:app"
kill_matching_processes "uvicorn" "uv run uvicorn app:app"
kill_listening_processes "port ${WEB_PORT} listeners" "$WEB_PORT"
+47
View File
@@ -0,0 +1,47 @@
#!/bin/bash
set -euo pipefail
ROOT_DIR="$(cd "$(dirname "$0")/../.." && pwd)"
ENV_FILE="$ROOT_DIR/.env"
ENV_LOADER="$ROOT_DIR/infra/scripts/lib/env.sh"
usage() {
echo "Usage: $0 {migrate|init-data|bootstrap}"
echo ""
echo "Commands:"
echo " migrate Run database migrations only"
echo " init-data Initialize seed data only"
echo " bootstrap Run migrations + init-data"
echo ""
echo "Note: Requires redis service running (docker compose up -d redis)"
exit 1
}
if [ ! -f "$ENV_FILE" ]; then
echo "Error: env file not found at $ENV_FILE" >&2
exit 1
fi
# shellcheck disable=SC1090
. "$ENV_LOADER"
load_env_file "$ENV_FILE"
cd "$ROOT_DIR"
case "${1:-}" in
migrate)
echo "=== Running Migrations ==="
PYTHONPATH=backend/src uv run python -m core.runtime.cli migrate
;;
init-data)
echo "=== Running Init Data ==="
PYTHONPATH=backend/src uv run python -m core.runtime.cli init-data
;;
bootstrap)
echo "=== Running Bootstrap ==="
PYTHONPATH=backend/src uv run python -m core.runtime.cli bootstrap
;;
*)
usage
;;
esac
+37
View File
@@ -0,0 +1,37 @@
#!/bin/bash
load_env_file() {
local env_file="$1"
if [ ! -f "$env_file" ]; then
return 0
fi
while IFS= read -r raw_line || [ -n "$raw_line" ]; do
local line key value
line="${raw_line%$'\r'}"
[[ -z "${line//[[:space:]]/}" ]] && continue
[[ "$line" =~ ^[[:space:]]*# ]] && continue
[[ "$line" != *"="* ]] && continue
key="${line%%=*}"
value="${line#*=}"
key="${key#${key%%[![:space:]]*}}"
key="${key%${key##*[![:space:]]}}"
if [[ ! "$key" =~ ^[A-Za-z_][A-Za-z0-9_]*$ ]]; then
continue
fi
value="${value#${value%%[![:space:]]*}}"
value="${value%${value##*[![:space:]]}}"
if [[ "$value" =~ ^\".*\"$ ]]; then
value="${value:1:${#value}-2}"
elif [[ "$value" =~ ^\'.*\'$ ]]; then
value="${value:1:${#value}-2}"
fi
export "$key=$value"
done < "$env_file"
}