feat(nginx): Use builtin envsubst mechanics of nginx container
Part-of: <https://dev.funkwhale.audio/funkwhale/funkwhale/-/merge_requests/2541>
This commit is contained in:
		
							parent
							
								
									d714c721b4
								
							
						
					
					
						commit
						1808cf6cf7
					
				|  | @ -0,0 +1 @@ | ||||||
|  | Merge nginx configs for docker production and development setups (#1939) | ||||||
							
								
								
									
										4
									
								
								dev.yml
								
								
								
								
							
							
						
						
									
										4
									
								
								dev.yml
								
								
								
								
							|  | @ -115,7 +115,6 @@ services: | ||||||
|       - "node3.funkwhale.test:172.17.0.1" |       - "node3.funkwhale.test:172.17.0.1" | ||||||
| 
 | 
 | ||||||
|   nginx: |   nginx: | ||||||
|     command: /entrypoint.sh |  | ||||||
|     env_file: |     env_file: | ||||||
|       - .env.dev |       - .env.dev | ||||||
|       - .env |       - .env | ||||||
|  | @ -134,8 +133,7 @@ services: | ||||||
|       - api |       - api | ||||||
|       - front |       - front | ||||||
|     volumes: |     volumes: | ||||||
|       - ./docker/nginx/conf.dev:/etc/nginx/nginx.conf.template:ro |       - ./docker/nginx/conf.dev:/etc/nginx/templates/default.conf.template:ro | ||||||
|       - ./docker/nginx/entrypoint.sh:/entrypoint.sh:ro |  | ||||||
|       - "${MUSIC_DIRECTORY_SERVE_PATH-./data/music}:/music:ro" |       - "${MUSIC_DIRECTORY_SERVE_PATH-./data/music}:/music:ro" | ||||||
|       - ./deploy/funkwhale_proxy.conf:/etc/nginx/funkwhale_proxy.conf:ro |       - ./deploy/funkwhale_proxy.conf:/etc/nginx/funkwhale_proxy.conf:ro | ||||||
|       - "./front:/frontend:ro" |       - "./front:/frontend:ro" | ||||||
|  |  | ||||||
|  | @ -1,167 +1,140 @@ | ||||||
| user  nginx; | upstream funkwhale-api { | ||||||
| worker_processes  1; |     server ${FUNKWHALE_API_IP}:${FUNKWHALE_API_PORT}; | ||||||
| 
 | } | ||||||
| error_log  /var/log/nginx/error.log warn; | upstream funkwhale-front { | ||||||
| pid        /var/run/nginx.pid; |     server ${FUNKWHALE_FRONT_IP}:${FUNKWHALE_FRONT_PORT}; | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| events { |  | ||||||
|     worker_connections  1024; |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | # Required for websocket support. | ||||||
|  | map $http_upgrade $connection_upgrade { | ||||||
|  |     default upgrade; | ||||||
|  |     ''      close; | ||||||
|  | } | ||||||
| 
 | 
 | ||||||
| http { | server { | ||||||
|     include       /etc/nginx/mime.types; |     listen      80; | ||||||
|     default_type  application/octet-stream; |     listen [::]:80; | ||||||
|  |     charset     utf-8; | ||||||
|  |     client_max_body_size ${NGINX_MAX_BODY_SIZE}; | ||||||
|  |     include /etc/nginx/funkwhale_proxy.conf; | ||||||
| 
 | 
 | ||||||
|     log_format  main  '$remote_addr - $remote_user [$time_local] "$request" ' |     add_header Content-Security-Policy "default-src 'self'; connect-src https: wss: http: ws: 'self' 'unsafe-eval'; script-src 'self' 'wasm-unsafe-eval'; style-src https: http: 'self' 'unsafe-inline'; img-src https: http: 'self' data:; font-src https: http: 'self' data:; media-src https: http: 'self' data:; object-src 'none'"; | ||||||
|                       '$status $body_bytes_sent "$http_referer" ' |     add_header Referrer-Policy "strict-origin-when-cross-origin"; | ||||||
|                       '"$http_user_agent" "$http_x_forwarded_for"'; |     add_header X-Frame-Options "SAMEORIGIN" always; | ||||||
|  |     add_header Service-Worker-Allowed "/"; | ||||||
| 
 | 
 | ||||||
|     access_log  /var/log/nginx/access.log  main; |     # compression settings | ||||||
|  |     gzip on; | ||||||
|  |     gzip_comp_level    5; | ||||||
|  |     gzip_min_length    256; | ||||||
|  |     gzip_proxied       any; | ||||||
|  |     gzip_vary          on; | ||||||
| 
 | 
 | ||||||
|     sendfile        on; |     gzip_types | ||||||
|  |         application/javascript | ||||||
|  |         application/vnd.geo+json | ||||||
|  |         application/vnd.ms-fontobject | ||||||
|  |         application/x-font-ttf | ||||||
|  |         application/x-web-app-manifest+json | ||||||
|  |         font/opentype | ||||||
|  |         image/bmp | ||||||
|  |         image/svg+xml | ||||||
|  |         image/x-icon | ||||||
|  |         text/cache-manifest | ||||||
|  |         text/css | ||||||
|  |         text/plain | ||||||
|  |         text/vcard | ||||||
|  |         text/vnd.rim.location.xloc | ||||||
|  |         text/vtt | ||||||
|  |         text/x-component | ||||||
|  |         text/x-cross-domain-policy; | ||||||
|  |     # end of compression settings | ||||||
| 
 | 
 | ||||||
|     keepalive_timeout  65; |     location /api/ { | ||||||
| 
 |  | ||||||
|     upstream funkwhale-api { |  | ||||||
|         server ${FUNKWHALE_API_IP}:${FUNKWHALE_API_PORT}; |  | ||||||
|     } |  | ||||||
|     upstream funkwhale-front { |  | ||||||
|         server ${FUNKWHALE_FRONT_IP}:${FUNKWHALE_FRONT_PORT}; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     # Required for websocket support. |  | ||||||
|     map $http_upgrade $connection_upgrade { |  | ||||||
|         default upgrade; |  | ||||||
|         ''      close; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     server { |  | ||||||
|         listen      80; |  | ||||||
|         listen [::]:80; |  | ||||||
|         charset     utf-8; |  | ||||||
|         client_max_body_size ${NGINX_MAX_BODY_SIZE}; |  | ||||||
|         include /etc/nginx/funkwhale_proxy.conf; |         include /etc/nginx/funkwhale_proxy.conf; | ||||||
|  |         # This is needed if you have file import via upload enabled. | ||||||
|  |         client_max_body_size ${NGINX_MAX_BODY_SIZE}; | ||||||
|  |         proxy_pass   http://funkwhale-api; | ||||||
|  |     } | ||||||
| 
 | 
 | ||||||
|         add_header Content-Security-Policy "default-src 'self'; connect-src https: wss: http: ws: 'self' 'unsafe-eval'; script-src 'self' 'wasm-unsafe-eval'; style-src https: http: 'self' 'unsafe-inline'; img-src https: http: 'self' data:; font-src https: http: 'self' data:; media-src https: http: 'self' data:; object-src 'none'"; |     location / { | ||||||
|  |         proxy_pass   http://funkwhale-front; | ||||||
|  |         expires 1d; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     location = /embed.html { | ||||||
|  |         add_header Content-Security-Policy "connect-src https: http: 'self'; default-src 'self'; script-src 'self' unpkg.com 'unsafe-inline' 'unsafe-eval'; style-src https: http: 'self' 'unsafe-inline'; img-src https: http: 'self' data:; font-src https: http: 'self' data:; object-src 'none'; media-src https: http: 'self' data:"; | ||||||
|         add_header Referrer-Policy "strict-origin-when-cross-origin"; |         add_header Referrer-Policy "strict-origin-when-cross-origin"; | ||||||
|         add_header X-Frame-Options "SAMEORIGIN" always; |  | ||||||
|         add_header Service-Worker-Allowed "/"; |  | ||||||
| 
 | 
 | ||||||
|         # compression settings |         proxy_pass   http://funkwhale-front; | ||||||
|         gzip on; |         expires 1d; | ||||||
|         gzip_comp_level    5; |     } | ||||||
|         gzip_min_length    256; |  | ||||||
|         gzip_proxied       any; |  | ||||||
|         gzip_vary          on; |  | ||||||
| 
 | 
 | ||||||
|         gzip_types |     location /federation/ { | ||||||
|             application/javascript |         include /etc/nginx/funkwhale_proxy.conf; | ||||||
|             application/vnd.geo+json |         proxy_pass   http://funkwhale-api; | ||||||
|             application/vnd.ms-fontobject |     } | ||||||
|             application/x-font-ttf |  | ||||||
|             application/x-web-app-manifest+json |  | ||||||
|             font/opentype |  | ||||||
|             image/bmp |  | ||||||
|             image/svg+xml |  | ||||||
|             image/x-icon |  | ||||||
|             text/cache-manifest |  | ||||||
|             text/css |  | ||||||
|             text/plain |  | ||||||
|             text/vcard |  | ||||||
|             text/vnd.rim.location.xloc |  | ||||||
|             text/vtt |  | ||||||
|             text/x-component |  | ||||||
|             text/x-cross-domain-policy; |  | ||||||
|         # end of compression settings |  | ||||||
| 
 | 
 | ||||||
|         location /api/ { |     # You can comment this if you do not plan to use the Subsonic API. | ||||||
|             include /etc/nginx/funkwhale_proxy.conf; |     location /rest/ { | ||||||
|             # This is needed if you have file import via upload enabled. |         include /etc/nginx/funkwhale_proxy.conf; | ||||||
|             client_max_body_size ${NGINX_MAX_BODY_SIZE}; |         proxy_pass   http://funkwhale-api/api/subsonic/rest/; | ||||||
|             proxy_pass   http://funkwhale-api; |     } | ||||||
|         } |  | ||||||
| 
 | 
 | ||||||
|         location / { |     location /.well-known/ { | ||||||
|             proxy_pass   http://funkwhale-front; |         include /etc/nginx/funkwhale_proxy.conf; | ||||||
|             expires 1d; |         proxy_pass   http://funkwhale-api; | ||||||
|         } |     } | ||||||
| 
 | 
 | ||||||
|         location = /embed.html { |     # Allow direct access to only specific subdirectories in /media | ||||||
|             add_header Content-Security-Policy "connect-src https: http: 'self'; default-src 'self'; script-src 'self' unpkg.com 'unsafe-inline' 'unsafe-eval'; style-src https: http: 'self' 'unsafe-inline'; img-src https: http: 'self' data:; font-src https: http: 'self' data:; object-src 'none'; media-src https: http: 'self' data:"; |     location /media/__sized__/ { | ||||||
|             add_header Referrer-Policy "strict-origin-when-cross-origin"; |         alias /protected/media/__sized__/; | ||||||
|  |         add_header Access-Control-Allow-Origin '*'; | ||||||
|  |     } | ||||||
| 
 | 
 | ||||||
|             proxy_pass   http://funkwhale-front; |     # Allow direct access to only specific subdirectories in /media | ||||||
|             expires 1d; |     location /media/attachments/ { | ||||||
|         } |         alias /protected/media/attachments/; | ||||||
|  |         add_header Access-Control-Allow-Origin '*'; | ||||||
|  |     } | ||||||
| 
 | 
 | ||||||
|         location /federation/ { |     # Allow direct access to only specific subdirectories in /media | ||||||
|             include /etc/nginx/funkwhale_proxy.conf; |     location /media/dynamic_preferences/ { | ||||||
|             proxy_pass   http://funkwhale-api; |         alias ${MEDIA_ROOT}/dynamic_preferences/; | ||||||
|         } |         add_header Access-Control-Allow-Origin '*'; | ||||||
|  |     } | ||||||
| 
 | 
 | ||||||
|         # You can comment this if you do not plan to use the Subsonic API. |     # This is an internal location that is used to serve | ||||||
|         location /rest/ { |     # media (uploaded) files once correct permission / authentication | ||||||
|             include /etc/nginx/funkwhale_proxy.conf; |     # has been checked on API side. | ||||||
|             proxy_pass   http://funkwhale-api/api/subsonic/rest/; |     # Comment the "NON-S3" commented lines and uncomment "S3" commented lines | ||||||
|         } |     # if you're storing media files in a S3 bucket. | ||||||
| 
 |     location ~ /_protected/media/(.+) { | ||||||
|         location /.well-known/ { |         internal; | ||||||
|             include /etc/nginx/funkwhale_proxy.conf; |         alias   /protected/media/$1;                                        # NON-S3 | ||||||
|             proxy_pass   http://funkwhale-api; |         # Needed to ensure DSub auth isn't forwarded to S3/Minio, see #932. | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         # Allow direct access to only specific subdirectories in /media |  | ||||||
|         location /media/__sized__/ { |  | ||||||
|             alias /protected/media/__sized__/; |  | ||||||
|             add_header Access-Control-Allow-Origin '*'; |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         # Allow direct access to only specific subdirectories in /media |  | ||||||
|         location /media/attachments/ { |  | ||||||
|             alias /protected/media/attachments/; |  | ||||||
|             add_header Access-Control-Allow-Origin '*'; |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         # Allow direct access to only specific subdirectories in /media |  | ||||||
|         location /media/dynamic_preferences/ { |  | ||||||
|             alias ${MEDIA_ROOT}/dynamic_preferences/; |  | ||||||
|             add_header Access-Control-Allow-Origin '*'; |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         # This is an internal location that is used to serve |  | ||||||
|         # media (uploaded) files once correct permission / authentication |  | ||||||
|         # has been checked on API side. |  | ||||||
|         # Comment the "NON-S3" commented lines and uncomment "S3" commented lines |  | ||||||
|         # if you're storing media files in a S3 bucket. |  | ||||||
|         location ~ /_protected/media/(.+) { |  | ||||||
|             internal; |  | ||||||
|             alias   /protected/media/$1;                                        # NON-S3 |  | ||||||
|             # Needed to ensure DSub auth isn't forwarded to S3/Minio, see #932. |  | ||||||
| #           proxy_set_header Authorization "";                                  # S3 | #           proxy_set_header Authorization "";                                  # S3 | ||||||
| #           proxy_pass $1;                                                      # S3 | #           proxy_pass $1;                                                      # S3 | ||||||
|             add_header Access-Control-Allow-Origin '*'; |         add_header Access-Control-Allow-Origin '*'; | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         location /_protected/music/ { |  | ||||||
|             # This is an internal location that is used to serve |  | ||||||
|             # local music files once correct permission / authentication |  | ||||||
|             # has been checked on API side. |  | ||||||
|             # Set this to the same value as your MUSIC_DIRECTORY_PATH setting. |  | ||||||
|             internal; |  | ||||||
|             alias   /music/; |  | ||||||
|             add_header Access-Control-Allow-Origin '*'; |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         location /manifest.json { |  | ||||||
|             # If the reverse proxy is terminating SSL, nginx gets confused and redirects to http, hence the full URL |  | ||||||
|             return 302 ${FUNKWHALE_PROTOCOL}://${FUNKWHALE_HOSTNAME}/api/v1/instance/spa-manifest.json; |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         location /staticfiles/ { |  | ||||||
|             alias /staticfiles/; |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|     } |     } | ||||||
|  | 
 | ||||||
|  |     location /_protected/music/ { | ||||||
|  |         # This is an internal location that is used to serve | ||||||
|  |         # local music files once correct permission / authentication | ||||||
|  |         # has been checked on API side. | ||||||
|  |         # Set this to the same value as your MUSIC_DIRECTORY_PATH setting. | ||||||
|  |         internal; | ||||||
|  |         alias   /music/; | ||||||
|  |         add_header Access-Control-Allow-Origin '*'; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     location /manifest.json { | ||||||
|  |         # If the reverse proxy is terminating SSL, nginx gets confused and redirects to http, hence the full URL | ||||||
|  |         return 302 ${FUNKWHALE_PROTOCOL}://${FUNKWHALE_HOSTNAME}/api/v1/instance/spa-manifest.json; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     location /staticfiles/ { | ||||||
|  |         alias /staticfiles/; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -1,11 +0,0 @@ | ||||||
| #!/bin/sh |  | ||||||
| 
 |  | ||||||
| set -eux |  | ||||||
| 
 |  | ||||||
| TEMPLATE_PATH="/etc/nginx/nginx.conf.template" |  | ||||||
| CONFIG_PATH="/etc/nginx/nginx.conf" |  | ||||||
| 
 |  | ||||||
| ALLOWED_VARS="$(env | cut -d '=' -f 1 | xargs printf "\${%s} ")" |  | ||||||
| envsubst "$ALLOWED_VARS" < "$TEMPLATE_PATH" | tee "$CONFIG_PATH" |  | ||||||
| 
 |  | ||||||
| nginx-debug -g 'daemon off;' |  | ||||||
		Loading…
	
		Reference in New Issue
	
	 Georg Krause
						Georg Krause