96 lines
3.8 KiB
Plaintext
96 lines
3.8 KiB
Plaintext
## Set a variable to help us decide if we need to add the
|
|
## 'Docker-Distribution-Api-Version' header.
|
|
## The registry always sets this header.
|
|
## In the case of nginx performing auth, the header is unset
|
|
## since nginx is auth-ing before proxying.
|
|
map $upstream_http_docker_distribution_api_version $docker_distribution_api_version {
|
|
'' 'registry/2.0';
|
|
}
|
|
|
|
## Record actual registry push/pull traffic
|
|
include /etc/nginx/snippets/registry-transfer-logging.conf;
|
|
|
|
server {
|
|
listen 443 ssl;
|
|
listen [::]:443 ssl;
|
|
server_name registry.zinomedia.de;
|
|
|
|
access_log /var/log/nginx/registry.zinomedia.de.access.log;
|
|
error_log /var/log/nginx/error.log;
|
|
|
|
# Record actual registry push/pull traffic
|
|
access_log access_log /var/log/nginx/registry.zinomedia.de.access.json.log registry_json if=$is_transfer_loggable;
|
|
|
|
ssl_certificate /etc/letsencrypt/live/registry.zinomedia.de/fullchain.pem;
|
|
ssl_certificate_key /etc/letsencrypt/live/registry.zinomedia.de/privkey.pem;
|
|
|
|
# Recommendations from https://raymii.org/s/tutorials/Strong_SSL_Security_On_nginx.html
|
|
ssl_protocols TLSv1.1 TLSv1.2;
|
|
ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';
|
|
ssl_prefer_server_ciphers on;
|
|
|
|
# required to avoid HTTP 411: see Issue #1486 (https://github.com/moby/moby/issues/1486)
|
|
chunked_transfer_encoding on;
|
|
|
|
location / {
|
|
return 403;
|
|
}
|
|
|
|
location /v2/ {
|
|
# disable any limits to avoid HTTP 413 for large image uploads
|
|
client_max_body_size 0;
|
|
|
|
# Password protect
|
|
auth_basic "Protected Registry";
|
|
auth_basic_user_file /usr/share/nginx/html/registry.zinomedia.de/.htpasswd;
|
|
|
|
if ($request_method = OPTIONS) {
|
|
add_header 'Access-Control-Allow-Origin' 'https://registryui.zinomedia.de';
|
|
add_header 'Access-Control-Allow-Credentials' 'true';
|
|
add_header 'Access-Control-Allow-Headers' 'Authorization, Accept, Cache-Control';
|
|
add_header 'Access-Control-Allow-Methods' 'HEAD, GET, OPTIONS, DELETE';
|
|
add_header 'Content-Length' '0';
|
|
add_header 'Content-Type' 'text/plain charset=UTF-8';
|
|
return 204;
|
|
}
|
|
|
|
if ($request_method = DELETE) {
|
|
add_header 'Access-Control-Allow-Origin' 'https://registryui.zinomedia.de' always;
|
|
add_header 'Access-Control-Allow-Credentials' 'true' always;
|
|
add_header 'Access-Control-Allow-Headers' 'Authorization, Accept, Cache-Control' always;
|
|
add_header 'Access-Control-Allow-Methods' 'HEAD, GET, OPTIONS, DELETE' always;
|
|
}
|
|
|
|
add_header Access-Control-Allow-Origin "https://registryui.zinomedia.de";
|
|
add_header Access-Control-Allow-Credentials "true";
|
|
add_header Access-Control-Allow-Headers "Authorization, Accept, Cache-Control";
|
|
add_header Access-Control-Allow-Methods "HEAD, GET, OPTIONS, DELETE";
|
|
|
|
# Do not allow connections from docker 1.5 and earlier
|
|
if ($http_user_agent ~ "^(docker\/1\.(3|4|5(?!\.[0-9]-dev))|Go ).*$" ) {
|
|
return 404;
|
|
}
|
|
|
|
## If $docker_distribution_api_version is empty, the header is not added.
|
|
## See the map directive above where this variable is defined.
|
|
add_header 'Docker-Distribution-Api-Version' $docker_distribution_api_version always;
|
|
|
|
resolver 127.0.0.11;
|
|
set $upstream "http://registry:5000";
|
|
proxy_pass $upstream;
|
|
|
|
proxy_set_header Host $http_host; # required for docker client's sake
|
|
proxy_set_header X-Real-IP $remote_addr; # pass on real client's IP
|
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
|
proxy_set_header X-Forwarded-Proto $scheme;
|
|
proxy_read_timeout 900;
|
|
}
|
|
}
|
|
|
|
server {
|
|
listen 80;
|
|
listen [::]:80;
|
|
server_name registry.zinomedia.de;
|
|
return 301 https://$host$request_uri;
|
|
}
|