From 0d7dc93a67146c90890b1fc98fab268bc93f9656 Mon Sep 17 00:00:00 2001 From: Tim Date: Sun, 28 Sep 2025 21:06:52 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E5=88=9D=E6=AD=A5=E8=BD=AC=E7=A7=BB?= =?UTF-8?q?=E4=B8=BAdocker?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env.example | 94 ++++++++++++++++++ backend/open-isle.env.example | 3 + .../src/main/resources/application.properties | 20 ++-- docker/.env.example | 20 +--- docker/docker-compose.yaml | 97 +++++++++++++++++-- frontend_nuxt/.env.dev.example | 15 +-- frontend_nuxt/.env.example | 24 +---- frontend_nuxt/.env.production.example | 16 +-- frontend_nuxt/.env.staging.example | 20 +--- .../websocket_service.env.example | 2 + 10 files changed, 215 insertions(+), 96 deletions(-) create mode 100644 .env.example diff --git a/.env.example b/.env.example new file mode 100644 index 000000000..00624c513 --- /dev/null +++ b/.env.example @@ -0,0 +1,94 @@ +# === Core Service Ports === +SERVER_PORT=8080 +FRONTEND_PORT=3000 +WEBSOCKET_PORT=8082 +MYSQL_PORT=3306 +REDIS_PORT=6379 +RABBITMQ_PORT=5672 +RABBITMQ_MANAGEMENT_PORT=15672 + +# === OpenSearch Configuration === +OPENSEARCH_PORT=9200 +OPENSEARCH_METRICS_PORT=9600 +OPENSEARCH_DASHBOARDS_PORT=5601 +OPENSEARCH_ENABLED=true +OPENSEARCH_SCHEME=http +OPENSEARCH_USERNAME= +OPENSEARCH_PASSWORD= + +# === Database Configuration === +MYSQL_DATABASE=openisle +MYSQL_ROOT_PASSWORD= +MYSQL_USER= +MYSQL_PASSWORD= +MYSQL_HOST= + +# === Redis Configuration === +REDIS_HOST=redis +REDIS_DATABASE=0 + +# === RabbitMQ Configuration === +RABBITMQ_HOST=rabbitmq +RABBITMQ_USERNAME=openisle +RABBITMQ_PASSWORD=openisle_password + +# === Backend Application Secrets === +JWT_SECRET=change-me-jwt-secret +JWT_REASON_SECRET=change-me-jwt-reason-secret +JWT_RESET_SECRET=change-me-jwt-reset-secret +JWT_INVITE_SECRET=change-me-jwt-invite-secret +JWT_EXPIRATION=2592000000 +PASSWORD_STRENGTH=LOW +POST_PUBLISH_MODE=DIRECT +REGISTER_MODE=WHITELIST +UPLOAD_CHECK_TYPE=true +UPLOAD_MAX_SIZE=5242880 +AVATAR_STYLE=pixel-art-neutral +AVATAR_SIZE=128 +AVATAR_BASE_URL=https://api.dicebear.com/6.x +USER_POSTS_LIMIT=10 +USER_REPLIES_LIMIT=50 +SNIPPET_LENGTH=200 +SEARCH_INDEX_PREFIX=openisle +SEARCH_HIGHLIGHT_FRAGMENT_SIZE=200 +SEARCH_REINDEX_ON_STARTUP=true +SEARCH_REINDEX_BATCH_SIZE=500 +CAPTCHA_ENABLED=false +RECAPTCHA_SECRET_KEY= +CAPTCHA_REGISTER_ENABLED=false +CAPTCHA_LOGIN_ENABLED=false +CAPTCHA_POST_ENABLED=false +CAPTCHA_COMMENT_ENABLED=false +RESEND_API_KEY= +RESEND_FROM_EMAIL= +COS_BASE_URL=https://<你的cos>.cos.accelerate.myqcloud.com +COS_SECRET_ID= +COS_SECRET_KEY= +COS_REGION=ap-guangzhou +COS_BUCKET_NAME= +GOOGLE_CLIENT_ID= +GITHUB_CLIENT_ID= +GITHUB_CLIENT_SECRET= +DISCORD_CLIENT_ID= +DISCORD_CLIENT_SECRET= +TWITTER_CLIENT_ID= +TWITTER_CLIENT_SECRET= +TELEGRAM_BOT_TOKEN= +OPENAI_API_KEY= +OPENAI_MODEL=gpt-4o +AI_FORMAT_LIMIT=3 +WEBSITE_URL=http://localhost:3000 +WEBPUSH_PUBLIC_KEY= +WEBPUSH_PRIVATE_KEY= +LOG_LEVEL=INFO + +# === Frontend (Nuxt) === +NUXT_PUBLIC_API_BASE_URL=http://127.0.0.1:8080 +NUXT_PUBLIC_WEBSOCKET_URL=https://127.0.0.1:8082 +NUXT_PUBLIC_WEBSITE_BASE_URL=http://localhost:3000 +NUXT_PUBLIC_GOOGLE_CLIENT_ID=777830451304-nt8afkkap18gui4f9entcha99unal744.apps.googleusercontent.com +NUXT_PUBLIC_GITHUB_CLIENT_ID=Ov23liOlrZnPKRF7s7NN +NUXT_PUBLIC_DISCORD_CLIENT_ID=1394985417044000779 +NUXT_PUBLIC_TWITTER_CLIENT_ID=ZTRTU05KSk9KTTJrTTdrVC1tc1E6MTpjaQ +NUXT_PUBLIC_TELEGRAM_BOT_ID=8450237135 + diff --git a/backend/open-isle.env.example b/backend/open-isle.env.example index a62ac877f..261c45b17 100644 --- a/backend/open-isle.env.example +++ b/backend/open-isle.env.example @@ -1,3 +1,6 @@ +# 所有环境变量已集中在仓库根目录的 .env.*.example 文件。 +# 此文件保留作参考用途,如需在 Docker 之外手动配置,可按需复制。 + # === Spring Boot === SERVER_PORT=8080 diff --git a/backend/src/main/resources/application.properties b/backend/src/main/resources/application.properties index 479fc683c..b59065e3f 100644 --- a/backend/src/main/resources/application.properties +++ b/backend/src/main/resources/application.properties @@ -4,7 +4,7 @@ server.port=${SERVER_PORT:8080} # for mysql logging.level.root=${LOG_LEVEL:INFO} logging.level.com.openisle.service.CosImageUploader=DEBUG -spring.datasource.url=${MYSQL_URL:jdbc:mysql://localhost:3306/openisle} +spring.datasource.url=jdbc:mysql://${MYSQL_HOST}:3306/${MYSQL_DATABASE} spring.datasource.username=${MYSQL_USER:root} spring.datasource.password=${MYSQL_PASSWORD:password} spring.jpa.hibernate.ddl-auto=update @@ -47,11 +47,11 @@ app.snippet-length=${SNIPPET_LENGTH:200} # OpenSearch integration app.search.enabled=${SEARCH_ENABLED:true} -app.search.host=${SEARCH_HOST:localhost} -app.search.port=${SEARCH_PORT:9200} -app.search.scheme=${SEARCH_SCHEME:http} -app.search.username=${SEARCH_USERNAME:} -app.search.password=${SEARCH_PASSWORD:} +app.search.host=${OPENSEARCH_HOST:localhost} +app.search.port=${OPENSEARCH_PORT:9200} +app.search.scheme=${OPENSEARCH_SCHEME:http} +app.search.username=${OPENSEARCH_USERNAME:} +app.search.password=${OPENSEARCH_PASSWORD:} app.search.index-prefix=${SEARCH_INDEX_PREFIX:openisle} app.search.highlight-fragment-size=${SEARCH_HIGHLIGHT_FRAGMENT_SIZE:${SNIPPET_LENGTH:200}} app.search.reindex-on-startup=${SEARCH_REINDEX_ON_STARTUP:true} @@ -81,15 +81,15 @@ cos.bucket-name=${COS_BUCKET_NAME:} # your image upload services: ... # Google OAuth configuration -google.client-id=${GOOGLE_CLIENT_ID:} +google.client-id=${NUXT_PUBLIC_GOOGLE_CLIENT_ID:} # GitHub OAuth configuration -github.client-id=${GITHUB_CLIENT_ID:} +github.client-id=${NUXT_PUBLIC_GITHUB_CLIENT_ID:} github.client-secret=${GITHUB_CLIENT_SECRET:} # Discord OAuth configuration -discord.client-id=${DISCORD_CLIENT_ID:} +discord.client-id=${NUXT_PUBLIC_DISCORD_CLIENT_ID:} discord.client-secret=${DISCORD_CLIENT_SECRET:} # Twitter OAuth configuration -twitter.client-id=${TWITTER_CLIENT_ID:} +twitter.client-id=${NUXT_PUBLIC_TWITTER_CLIENT_ID:} twitter.client-secret=${TWITTER_CLIENT_SECRET:} # Telegram login configuration telegram.bot-token=${TELEGRAM_BOT_TOKEN:} diff --git a/docker/.env.example b/docker/.env.example index 0ad80a93c..a798793ea 100644 --- a/docker/.env.example +++ b/docker/.env.example @@ -1,16 +1,4 @@ -# 前端访问端口 -SERVER_PORT=8080 - -# OpenSearch 配置 -OPENSEARCH_PORT=9200 -OPENSEARCH_METRICS_PORT=9600 -OPENSEARCH_DASHBOARDS_PORT=5601 - -# MySQL 配置 -MYSQL_ROOT_PASSWORD=toor - -# 会覆盖 `open-isle.env` -MYSQL_PORT=3306 -MYSQL_DATABASE=openisle -MYSQL_USER=<数据库用户名> -MYSQL_PASSWORD=<数据库密码> +# 已迁移到仓库根目录的 .env.*.example 文件。 +# 请复制对应环境的示例文件到项目根目录,例如: +# cp ../.env.dev.example ../.env +# docker-compose 将自动读取 ../.env。 diff --git a/docker/docker-compose.yaml b/docker/docker-compose.yaml index 50a60557d..58c0e1150 100644 --- a/docker/docker-compose.yaml +++ b/docker/docker-compose.yaml @@ -5,16 +5,20 @@ services: container_name: openisle-mysql restart: always env_file: - - ../backend/open-isle.env - - ./.env + - ../.env + environment: + MYSQL_DATABASE: ${MYSQL_DATABASE} + MYSQL_USER: ${MYSQL_USER} + MYSQL_PASSWORD: ${MYSQL_PASSWORD} + MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD} ports: - - "${MYSQL_PORT}:3306" + - "${MYSQL_PORT:-3306}:3306" volumes: - mysql-data:/var/lib/mysql - ../backend/src/main/resources/db/init:/docker-entrypoint-initdb.d networks: - openisle-network - + # OpenSearch Service opensearch: build: @@ -52,6 +56,35 @@ services: - opensearch restart: unless-stopped + rabbitmq: + image: rabbitmq:3.13-management + container_name: openisle-rabbitmq + restart: unless-stopped + env_file: + - ../.env + environment: + RABBITMQ_DEFAULT_USER: ${RABBITMQ_USERNAME} + RABBITMQ_DEFAULT_PASS: ${RABBITMQ_PASSWORD} + ports: + - "${RABBITMQ_PORT:-5672}:5672" + - "${RABBITMQ_MANAGEMENT_PORT:-15672}:15672" + volumes: + - rabbitmq-data:/var/lib/rabbitmq + networks: + - openisle-network + + redis: + image: redis:7 + container_name: openisle-redis + restart: unless-stopped + env_file: + - ../.env + ports: + - "${REDIS_PORT:-6379}:6379" + volumes: + - redis-data:/data + networks: + - openisle-network # Java spring boot service springboot: @@ -59,21 +92,63 @@ services: container_name: openisle-springboot working_dir: /app env_file: - - ../backend/open-isle.env - - ./.env - environment: - - MYSQL_URL=jdbc:mysql://mysql:${MYSQL_PORT}/${MYSQL_DATABASE}?useUnicode=yes&characterEncoding=UTF-8&useInformationSchema=true&useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true + - ../.env ports: - - "${SERVER_PORT}:8080" + - "${SERVER_PORT:-8080}:${SERVER_PORT:-8080}" volumes: - ../backend:/app - maven-repo:/root/.m2 depends_on: - mysql + - redis + - rabbitmq command: mvn clean spring-boot:run -Dmaven.test.skip=true networks: - openisle-network + websocket-service: + image: maven:3.9-eclipse-temurin-17 + container_name: openisle-websocket + working_dir: /app + env_file: + - ../.env + environment: + SERVER_PORT: ${WEBSOCKET_PORT} + RABBITMQ_HOST: ${RABBITMQ_HOST} + RABBITMQ_PORT: ${RABBITMQ_PORT} + RABBITMQ_USERNAME: ${RABBITMQ_USERNAME} + RABBITMQ_PASSWORD: ${RABBITMQ_PASSWORD} + JWT_SECRET: ${JWT_SECRET} + WEBSITE_URL: ${WEBSITE_URL} + ports: + - "${WEBSOCKET_PORT:-8082}:${WEBSOCKET_PORT:-8082}" + volumes: + - ../websocket_service:/app + - websocket-maven-repo:/root/.m2 + depends_on: + - rabbitmq + command: mvn clean spring-boot:run -Dmaven.test.skip=true + networks: + - openisle-network + + frontend: + image: node:20 + container_name: openisle-frontend + working_dir: /app + env_file: + - ../.env + command: sh -c "npm install && npm run dev" + volumes: + - ../frontend_nuxt:/app + - frontend-node-modules:/app/node_modules + ports: + - "${FRONTEND_PORT:-3000}:3000" + depends_on: + - springboot + - websocket-service + networks: + - openisle-network + networks: openisle-network: driver: bridge @@ -81,3 +156,7 @@ networks: volumes: mysql-data: maven-repo: + redis-data: + rabbitmq-data: + websocket-maven-repo: + frontend-node-modules: diff --git a/frontend_nuxt/.env.dev.example b/frontend_nuxt/.env.dev.example index bb0ee2635..9a41ba7af 100644 --- a/frontend_nuxt/.env.dev.example +++ b/frontend_nuxt/.env.dev.example @@ -1,12 +1,3 @@ -; 本地部署后端 -NUXT_PUBLIC_API_BASE_URL=http://127.0.0.1:8080 -NUXT_PUBLIC_WEBSOCKET_URL=https://127.0.0.1:8082 -NUXT_PUBLIC_WEBSITE_BASE_URL=http://localhost:3000 - -NUXT_PUBLIC_GOOGLE_CLIENT_ID=777830451304-nt8afkkap18gui4f9entcha99unal744.apps.googleusercontent.com -# NUXT_PUBLIC_GITHUB_CLIENT_ID=Ov23liVkO1NPAX5JyWxJ -; 本地 -NUXT_PUBLIC_GITHUB_CLIENT_ID=Ov23liOlrZnPKRF7s7NN -NUXT_PUBLIC_DISCORD_CLIENT_ID=1394985417044000779 -NUXT_PUBLIC_TWITTER_CLIENT_ID=ZTRTU05KSk9KTTJrTTdrVC1tc1E6MTpjaQ -NUXT_PUBLIC_TELEGRAM_BOT_ID=8450237135 +# 环境变量已统一迁移至仓库根目录的 .env.*.example 文件。 +# 如需在本地运行 Nuxt,请复制对应的示例文件到项目根目录: +# cp ../.env.dev.example ../.env diff --git a/frontend_nuxt/.env.example b/frontend_nuxt/.env.example index dadb36387..bcbdb7bf6 100644 --- a/frontend_nuxt/.env.example +++ b/frontend_nuxt/.env.example @@ -1,19 +1,5 @@ -; 本地部署后端 -; NUXT_PUBLIC_API_BASE_URL=https://127.0.0.1:8081 -; 预发环境后端 -; NUXT_PUBLIC_API_BASE_URL=https://staging.open-isle.com -; 生产环境后端 -NUXT_PUBLIC_API_BASE_URL=https://open-isle.com - -; 生产环境ws后端 -NUXT_PUBLIC_WEBSOCKET_URL=https://open-isle.com/websocket - -; 预发环境 -; NUXT_PUBLIC_WEBSITE_BASE_URL=https://staging.open-isle.com -; 正式环境/生产环境 -NUXT_PUBLIC_WEBSITE_BASE_URL=https://open-isle.com -NUXT_PUBLIC_GOOGLE_CLIENT_ID=777830451304-nt8afkkap18gui4f9entcha99unal744.apps.googleusercontent.com -NUXT_PUBLIC_GITHUB_CLIENT_ID=Ov23liVkO1NPAX5JyWxJ -NUXT_PUBLIC_DISCORD_CLIENT_ID=1394985417044000779 -NUXT_PUBLIC_TWITTER_CLIENT_ID=ZTRTU05KSk9KTTJrTTdrVC1tc1E6MTpjaQ -NUXT_PUBLIC_TELEGRAM_BOT_ID=8450237135 +# 环境变量已统一迁移至仓库根目录的 .env.*.example 文件。 +# 根据环境选择对应文件复制至项目根目录: +# cp ../.env.dev.example ../.env +# cp ../.env.staging.example ../.env +# cp ../.env.production.example ../.env diff --git a/frontend_nuxt/.env.production.example b/frontend_nuxt/.env.production.example index a1bff6842..ee3573dd6 100644 --- a/frontend_nuxt/.env.production.example +++ b/frontend_nuxt/.env.production.example @@ -1,13 +1,3 @@ - -; 生产环境后端 -NUXT_PUBLIC_API_BASE_URL=https://www.open-isle.com -; 正式环境/生产环境 -NUXT_PUBLIC_WEBSITE_BASE_URL=https://www.open-isle.com -; 生产环境ws后端 -NUXT_PUBLIC_WEBSOCKET_URL=https://www.open-isle.com/websocket - -NUXT_PUBLIC_GOOGLE_CLIENT_ID=777830451304-nt8afkkap18gui4f9entcha99unal744.apps.googleusercontent.com -NUXT_PUBLIC_GITHUB_CLIENT_ID=Ov23liVkO1NPAX5JyWxJ -NUXT_PUBLIC_DISCORD_CLIENT_ID=1394985417044000779 -NUXT_PUBLIC_TWITTER_CLIENT_ID=ZTRTU05KSk9KTTJrTTdrVC1tc1E6MTpjaQ -NUXT_PUBLIC_TELEGRAM_BOT_ID=8450237135 +# 环境变量已统一迁移至仓库根目录的 .env.*.example 文件。 +# 如需配置生产环境,请复制并修改对应示例文件: +# cp ../.env.production.example ../.env diff --git a/frontend_nuxt/.env.staging.example b/frontend_nuxt/.env.staging.example index 0cc8ef140..dde477e44 100644 --- a/frontend_nuxt/.env.staging.example +++ b/frontend_nuxt/.env.staging.example @@ -1,17 +1,3 @@ -; 本地部署后端 -; NUXT_PUBLIC_API_BASE_URL=http://127.0.0.1:8080 - -; 预发环境后端 -NUXT_PUBLIC_API_BASE_URL=https://staging.open-isle.com - -; 预发环境ws后端 -NUXT_PUBLIC_WEBSOCKET_URL=https://staging.open-isle.com/websocket - -; 预发环境 -NUXT_PUBLIC_WEBSITE_BASE_URL=https://staging.open-isle.com - -NUXT_PUBLIC_GOOGLE_CLIENT_ID=777830451304-nt8afkkap18gui4f9entcha99unal744.apps.googleusercontent.com -NUXT_PUBLIC_GITHUB_CLIENT_ID=Ov23liVkO1NPAX5JyWxJ -NUXT_PUBLIC_DISCORD_CLIENT_ID=1394985417044000779 -NUXT_PUBLIC_TWITTER_CLIENT_ID=ZTRTU05KSk9KTTJrTTdrVC1tc1E6MTpjaQ -NUXT_PUBLIC_TELEGRAM_BOT_ID=8450237135 +# 环境变量已统一迁移至仓库根目录的 .env.*.example 文件。 +# 如需配置预发环境,请复制并修改对应示例文件: +# cp ../.env.staging.example ../.env diff --git a/websocket_service/websocket_service.env.example b/websocket_service/websocket_service.env.example index 9f6304269..79e51ccdf 100644 --- a/websocket_service/websocket_service.env.example +++ b/websocket_service/websocket_service.env.example @@ -1,3 +1,5 @@ +# 所有环境变量已集中在仓库根目录的 .env.*.example 文件。 +# 如需在独立环境中运行,可参考以下字段: SERVER_PORT= # RabbitMQ 配置