diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..c601032 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,6 @@ +node_modules +.git +.gitignore +*.md +dist +.cache diff --git a/Dockerfile b/Dockerfile index 111173d..d979544 100644 --- a/Dockerfile +++ b/Dockerfile @@ -24,6 +24,18 @@ COPY ngnix.conf /etc/nginx/conf.d/default.conf # 复制SSL证书 COPY ssl/* /etc/nginx/ssl/ +# 启动时自动获取宿主机内网 IP,替换 __API_HOST__ 占位符 +RUN printf '%s\n' \ + '#!/bin/sh' \ + 'set -e' \ + 'if [ -n "$API_HOST" ]; then' \ + ' HOST_IP="$API_HOST"' \ + 'else' \ + ' HOST_IP=$(route -n 2>/dev/null | grep "^0.0.0.0" | tr -s " " | cut -d " " -f2)' \ + 'fi' \ + 'sed -i "s/__API_HOST__/$HOST_IP/g" /etc/nginx/conf.d/default.conf' \ + > /docker-entrypoint.d/01-set-api-host.sh && chmod +x /docker-entrypoint.d/01-set-api-host.sh + EXPOSE 80 443 CMD ["nginx", "-g", "daemon off;"] diff --git a/ngnix.conf b/ngnix.conf index 98464b3..d67a9f9 100644 --- a/ngnix.conf +++ b/ngnix.conf @@ -1,53 +1,110 @@ # Nginx 静态文件服务 + 智能代理 + 自定义 404 页面 -# Gitea 域名转发(HTTP) +# 主站 HTTP → HTTPS 重定向 +server { + listen 80; + server_name redpowerfuture.com www.redpowerfuture.com; + return 301 https://$host$request_uri; +} + +# Gitea HTTP → HTTPS 重定向 server { listen 80; server_name gitea.redpowerfuture.com; return 301 https://$host$request_uri; } -# MinIO 域名转发(HTTP) +# MinIO HTTP 直连(支持 HTTP/HTTPS 双协议) server { listen 80; server_name minio.redpowerfuture.com; - return 301 https://$host$request_uri; + location / { + proxy_pass http://__API_HOST__:9001; + proxy_http_version 1.1; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + } } -# HTTP 重定向到 HTTPS(其他域名) +# Consul HTTP(仅 HTTP) server { listen 80; - server_name _; - return 301 https://$host$request_uri; + server_name consul.redpowerfuture.com; + location / { + proxy_pass http://__API_HOST__:8500; + proxy_http_version 1.1; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + } } +# MeiliSearch HTTP(仅 HTTP) +server { + listen 80; + server_name meilisearch.redpowerfuture.com; + location / { + proxy_pass http://__API_HOST__:7700; + proxy_http_version 1.1; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + } +} +# 项目管理 HTTP(仅 HTTP) +server { + listen 80; + server_name pm.redpowerfuture.com; + location / { + proxy_pass http://192.168.0.83:8080; + proxy_http_version 1.1; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + } +} +# jaeger HTTP(仅 HTTP) +server { + listen 80; + server_name jaeger.redpowerfuture.com; + location / { + proxy_pass http://__API_HOST__:16686; + proxy_http_version 1.1; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + } +} +# ==================== 主站 HTTPS(静态文件 + API 反向代理) ==================== server { - # 静态资源根目录(dist) root /usr/share/nginx/html; index index.html; client_max_body_size 50M; - # SSL 配置 listen 443 ssl; + server_name redpowerfuture.com www.redpowerfuture.com; ssl_certificate /etc/nginx/ssl/scs1779764972146_redpowerfuture.com_server.crt; ssl_certificate_key /etc/nginx/ssl/scs1779764972146_redpowerfuture.com_server.key; ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers HIGH:!aNULL:!MD5; - # 自定义 404 页面,保持 404 状态码 error_page 404 /404.html; location = /404.html { internal; } - # 根路径默认进入网页端 location = / { return 302 /web/index.html; } - # 兼容无斜杠访问 location = /web { return 302 /web/; } @@ -56,32 +113,26 @@ server { return 302 /sys/; } - # 网页端(public/web/index.html -> dist/web/index.html) location /web/ { alias /usr/share/nginx/html/web/; try_files $uri $uri/ /web/index.html; } - # 后台管理端(dist/index.html,前缀 /sys/) location /sys/ { alias /usr/share/nginx/html/; try_files $uri $uri/ /index.html; } - # 1. 先尝试作为静态文件查找 location / { try_files $uri $uri/ @proxy; } - # 2. 无法找到的请求(API路径)代理到后端 location @proxy { - # 判断 URI 最后一段是否有扩展名 - # 有扩展名返回 404,无扩展名则代理 if ($uri ~ \.[^./]+$) { return 404; } - proxy_pass http://116.204.74.41:8000; + proxy_pass http://__API_HOST__:8000; proxy_http_version 1.1; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; @@ -93,7 +144,7 @@ server { } } -# Gitea 域名转发(HTTPS) +# ==================== Gitea HTTPS ==================== server { listen 443 ssl; server_name gitea.redpowerfuture.com; @@ -104,7 +155,7 @@ server { ssl_ciphers HIGH:!aNULL:!MD5; location / { - proxy_pass http://gitea.redpowerfuture.com:3000; + proxy_pass http://192.168.0.83:3000; proxy_http_version 1.1; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; @@ -116,25 +167,3 @@ server { } } -# MinIO 域名转发(HTTPS) -server { - listen 443 ssl; - server_name minio.redpowerfuture.com; - - ssl_certificate /etc/nginx/ssl/minio.redpowerfuture.com.pem; - ssl_certificate_key /etc/nginx/ssl/minio.redpowerfuture.com.key; - ssl_protocols TLSv1.2 TLSv1.3; - ssl_ciphers HIGH:!aNULL:!MD5; - - location / { - proxy_pass http://minio.redpowerfuture.com:9000; - proxy_http_version 1.1; - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; - proxy_connect_timeout 75s; - proxy_send_timeout 86400s; - proxy_read_timeout 86400s; - } -} diff --git a/ssl/cdn.redpowerfuture.com.key b/ssl/cdn.redpowerfuture.com.key new file mode 100644 index 0000000..71d0cfb --- /dev/null +++ b/ssl/cdn.redpowerfuture.com.key @@ -0,0 +1,27 @@ +-----BEGIN RSA PRIVATE KEY----- +MIIEowIBAAKCAQEAiQenl6SmaR+i9rEZn+4A+vyKd9ST0XNfKWIRUIyth5nhZOC+ +BAAB7wo4sGWS7seEpu0mQOkeAAdFGrjdjNhEhq+74sJAiKXgm8UixBGlDDB0czxI +CtQ5BXM8oX32aR0oc3qjytiDxq8LsJhSJ5M33ZijbFhRxeUioYvdNznXDofcIK5X +JSsTh/VhlpQcpvBYz/tiO9FjPC8z85RI+0U3uqFzuD0NCG7PG4mYDFG2RQpqaClh +TGbB8Kqj6IsMA5ivlLVxoT165hW0anbEVSGS3a8yZ8tzcBkAk4CyoUaONDCvCTef +yHBGq2ZnaMObCBnCyEwdssUJl3dVPKRK8x0O7QIDAQABAoIBAB5TNtgc5IT8Ltzo +SZL2oXnp/JzTSxk9rpAid1F7qIWLXPGtuO96rvLfMLd86xzzw5wLfH09+dkowrbM +tZ8PV271Ih/nPE/hYcknQe/hNcTyTjsYWpsm5y2ZGJBmp2sQvFx+BhSEgPkt0Oj2 +dKv0bRcZygTWsNYaROU6ZizsHHdG79ovS+EoDdHvkMTTO4J/5bLBOMTb6JAquoh3 +sJjuusbxJQMsR7vyNPDCaKQvyqqzHbckjCduh5tdOTsVNTLUhxbrrvXoe1i5g302 +QUcghEiQnE98ZHaypcBdMSvE3gGRKywmCez1na3HuadNCYvrDrBd7M0094lFe8HK +61j5xfMCgYEAvyCAMf9Cp4B0Iibto4RR3FfkB5LmT7gN2wMTzU9x6mrhUuQM9oqg +UItiINS8yhw973qYegxAapLVQTm6VErE8mykNhV2JrzFYrgIkwxMkeZX+AHrWJRD +WAqh73BZRnzN7vhjnI9o6iDnwS2+XqkBcbzHTAQOQxCJQYbfmq8bQT8CgYEAt4qG +hae/yj3ByOUAmgYLPSKMKJv321vB6gtNBU1RD6CcV4F6tW8T9ihOxGcibHJEA39S +lyIqnLOBVsffMf06rjB/5+oUY10u9IOLmV+/HkPnR4dNesx1bSynatuaCJkMsGLZ +Jc9Mjzf18/k5KuFUlW9OZflqrZmK4x77dzX/uNMCgYEAoKJHPD4mnjMW6DFBnyGx +z3hLHZZ4XV36vyzp8q+ntXaY5BrpTjianrdXBPLnrRJpd6HZDxLG/QtlkolbMkcZ +Ggr3RMFq6QnU97Bm/HfkzucC3l12mJ8brp5ZFa2eSuDQD93Rkp7xdX2saq7whgyT +Oy2HbzslZXY7dchOnGo5hO8CgYB8JvUF9cnTGOE7bkRw64Owr+zVD2Oiezf5g/lu +i7U4d/EpdAk4L1H2YZ+eVRFBAC4nm3mXh+IBK59iv0KoAt4ts9rhWkK+T+sSNOU6 +Mz0JUO9iQBDV7vXDisAYlUFlbXna2pJ+c/IassTpan0UF2Xqy2bhrcxOb502Mt/w +7JL1RwKBgAUEFHwhFVqRSRTVUK7qJgys/okow602oIsxuaD2dDuLnQ+sCrLCSdZK +GIiKSD2AUVg0lX3jWv0FJSWfc3DmxkeRXB7nMsZvdd217sI+/UvgEmm8j9ZaSPNx +B8HEANFPjPdNv4rBke7h+c0LbffFJj2E+woTppRwu1LQ4fJK+Fmo +-----END RSA PRIVATE KEY----- diff --git a/ssl/cdn.redpowerfuture.com.pem b/ssl/cdn.redpowerfuture.com.pem new file mode 100644 index 0000000..9cbbeeb --- /dev/null +++ b/ssl/cdn.redpowerfuture.com.pem @@ -0,0 +1,62 @@ +-----BEGIN CERTIFICATE----- +MIIGHzCCBQegAwIBAgIQCBFA3zLwrBf2Ts9EwIgUMzANBgkqhkiG9w0BAQsFADBu +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMS0wKwYDVQQDEyRFbmNyeXB0aW9uIEV2ZXJ5d2hlcmUg +RFYgVExTIENBIC0gRzIwHhcNMjYwNjI1MDAwMDAwWhcNMjYwOTIyMjM1OTU5WjAh +MR8wHQYDVQQDExZjZG4ucmVkcG93ZXJmdXR1cmUuY29tMIIBIjANBgkqhkiG9w0B +AQEFAAOCAQ8AMIIBCgKCAQEAiQenl6SmaR+i9rEZn+4A+vyKd9ST0XNfKWIRUIyt +h5nhZOC+BAAB7wo4sGWS7seEpu0mQOkeAAdFGrjdjNhEhq+74sJAiKXgm8UixBGl +DDB0czxICtQ5BXM8oX32aR0oc3qjytiDxq8LsJhSJ5M33ZijbFhRxeUioYvdNznX +DofcIK5XJSsTh/VhlpQcpvBYz/tiO9FjPC8z85RI+0U3uqFzuD0NCG7PG4mYDFG2 +RQpqaClhTGbB8Kqj6IsMA5ivlLVxoT165hW0anbEVSGS3a8yZ8tzcBkAk4CyoUaO +NDCvCTefyHBGq2ZnaMObCBnCyEwdssUJl3dVPKRK8x0O7QIDAQABo4IDBDCCAwAw +HwYDVR0jBBgwFoAUeN+RkF/u3qz2xXXr1UxVU+8kSrYwHQYDVR0OBBYEFIEPqevi +mZcIRUqroAQbY8OSUDvyMD0GA1UdEQQ2MDSCFmNkbi5yZWRwb3dlcmZ1dHVyZS5j +b22CGnd3dy5jZG4ucmVkcG93ZXJmdXR1cmUuY29tMD4GA1UdIAQ3MDUwMwYGZ4EM +AQIBMCkwJwYIKwYBBQUHAgEWG2h0dHA6Ly93d3cuZGlnaWNlcnQuY29tL0NQUzAO +BgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMIGA +BggrBgEFBQcBAQR0MHIwJAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmRpZ2ljZXJ0 +LmNvbTBKBggrBgEFBQcwAoY+aHR0cDovL2NhY2VydHMuZGlnaWNlcnQuY29tL0Vu +Y3J5cHRpb25FdmVyeXdoZXJlRFZUTFNDQS1HMi5jcnQwDAYDVR0TAQH/BAIwADCC +AX0GCisGAQQB1nkCBAIEggFtBIIBaQFnAHUAwjF+V0UZo0XufzjespBB68fCIVoi +v3/Vta12mtkOUs0AAAGe/NA+xwAABAMARjBEAiACQ77/5D5Vd1/AY4hmqDqeheYR +Q0oEPWVFKa2tVtA77gIgIbkFKMiJE/MPEkfh7wEAI+IRvEKkW8OoetJu8+tPWs8A +dgDXbX0Q0af1d8LH6V/XAL/5gskzWmXh0LMBcxfAyMVpdwAAAZ780D6zAAAEAwBH +MEUCIQDMVpjW9wbcnd3S/7HNEocFnl2QV+qOJIe4tJoMEgsoZwIgddASbOcKHYc2 +7p9gCHCiUlOEk3FR/SaRpnGW+F/y/DMAdgCUTkOH+uzB74HzGSQmqBhlAcfTXzgC +AT9yZ31VNy4Z2AAAAZ780D7UAAAEAwBHMEUCICnb/ctP3+45HcMPVMJHyS8Sm5hk +B20qMtlp5DmRJA2TAiEApCP3cRGv/sKtV68n1z30Hvih37X6f36wGTMsbL34I1Uw +DQYJKoZIhvcNAQELBQADggEBACa9GfzcvecgPyVpPgAqKVF1mnktUzB+5/hMOdH1 +czjsyRPMvPlYAnMqsCKWasOoEZsTi2mYUdEDmcICcx5zJbYpKfs7m90ch6ZNCAV+ +ar6uyPGDdeVn2I8QMfJtOcKvpxW/hsZfWkRxDmT1d6bfoUuz94hloDdtEUOmoVUh +Mz3BBsEeXX+n3YMM0ZTnz0xNCd7CYnjsVmDM6fvPOeurKM5aa4a2WPamNoFTVDs5 +iRaSDbmOc0N3pdNc9oYvZsSWQAYy+V2Pn6ncb1uKPFs6CmlAe2VtAIHGc++KlTZm +XWfxdNX1o1hKuOFoNa9KZnijXOkO0ktHeI+/jF2uRhffFKE= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEqjCCA5KgAwIBAgIQDeD/te5iy2EQn2CMnO1e0zANBgkqhkiG9w0BAQsFADBh +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBH +MjAeFw0xNzExMjcxMjQ2NDBaFw0yNzExMjcxMjQ2NDBaMG4xCzAJBgNVBAYTAlVT +MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j +b20xLTArBgNVBAMTJEVuY3J5cHRpb24gRXZlcnl3aGVyZSBEViBUTFMgQ0EgLSBH +MjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAO8Uf46i/nr7pkgTDqnE +eSIfCFqvPnUq3aF1tMJ5hh9MnO6Lmt5UdHfBGwC9Si+XjK12cjZgxObsL6Rg1njv +NhAMJ4JunN0JGGRJGSevbJsA3sc68nbPQzuKp5Jc8vpryp2mts38pSCXorPR+sch +QisKA7OSQ1MjcFN0d7tbrceWFNbzgL2csJVQeogOBGSe/KZEIZw6gXLKeFe7mupn +NYJROi2iC11+HuF79iAttMc32Cv6UOxixY/3ZV+LzpLnklFq98XORgwkIJL1HuvP +ha8yvb+W6JislZJL+HLFtidoxmI7Qm3ZyIV66W533DsGFimFJkz3y0GeHWuSVMbI +lfsCAwEAAaOCAU8wggFLMB0GA1UdDgQWBBR435GQX+7erPbFdevVTFVT7yRKtjAf +BgNVHSMEGDAWgBROIlQgGJXm427mD/r6uRLtBhePOTAOBgNVHQ8BAf8EBAMCAYYw +HQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBIGA1UdEwEB/wQIMAYBAf8C +AQAwNAYIKwYBBQUHAQEEKDAmMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdp +Y2VydC5jb20wQgYDVR0fBDswOTA3oDWgM4YxaHR0cDovL2NybDMuZGlnaWNlcnQu +Y29tL0RpZ2lDZXJ0R2xvYmFsUm9vdEcyLmNybDBMBgNVHSAERTBDMDcGCWCGSAGG +/WwBAjAqMCgGCCsGAQUFBwIBFhxodHRwczovL3d3dy5kaWdpY2VydC5jb20vQ1BT +MAgGBmeBDAECATANBgkqhkiG9w0BAQsFAAOCAQEAoBs1eCLKakLtVRPFRjBIJ9LJ +L0s8ZWum8U8/1TMVkQMBn+CPb5xnCD0GSA6L/V0ZFrMNqBirrr5B241OesECvxIi +98bZ90h9+q/X5eMyOD35f8YTaEMpdnQCnawIwiHx06/0BfiTj+b/XQih+mqt3ZXe +xNCJqKexdiB2IWGSKcgahPacWkk/BAQFisKIFYEqHzV974S3FAz/8LIfD58xnsEN +GfzyIDkH3JrwYZ8caPTf6ZX9M1GrISN8HnWTtdNCH2xEajRa/h9ZBXjUyFKQrGk2 +n2hcLrfZSbynEC/pSw/ET7H5nWwckjmAJ1l9fcnbqkU/pf6uMQmnfl0JQjJNSg== +-----END CERTIFICATE-----