automate CSS/JS cache busting

This commit is contained in:
Daniel Micay 2021-03-26 21:03:34 -04:00
parent f5f23e2a95
commit 342a31c06c
23 changed files with 47 additions and 30 deletions

1
.gitignore vendored
View File

@ -1,2 +1,3 @@
nginx.conf.tmp
node_modules node_modules
static_tmp static_tmp

View File

@ -25,5 +25,9 @@ ssh $remote sync -f $target
ssh $remote ln -snf $target /var/www/html ssh $remote ln -snf $target /var/www/html
ssh $remote sync . ssh $remote sync .
rsync -rpcv --chmod=D755,F644 --delete nginx.conf.tmp $remote:/etc/nginx/nginx.conf
ssh $remote sync -f /etc/nginx/nginx.conf
ssh $remote systemctl reload nginx
echo echo
echo active is now $target echo active is now $target

View File

@ -67,7 +67,7 @@ http {
map $http_cookie $preload_resources { map $http_cookie $preload_resources {
"~*__Host-preload=1" ""; "~*__Host-preload=1" "";
default "</grapheneos.css?29>; rel=preload; as=style, </fonts/roboto_latin.woff2?20>; rel=preload; as=font; crossorigin, </fonts/roboto_bold_latin.woff2?20>; rel=preload; as=font; crossorigin, </mask-icon.svg>; rel=preload; as=image"; default "</grapheneos.css>; rel=preload; as=style, </fonts/roboto_latin.woff2?20>; rel=preload; as=font; crossorigin, </fonts/roboto_bold_latin.woff2?20>; rel=preload; as=font; crossorigin, </mask-icon.svg>; rel=preload; as=image";
} }
server { server {

View File

@ -15,6 +15,18 @@ done
find static_tmp -name '*.css' -exec csso {} -o {} \; find static_tmp -name '*.css' -exec csso {} -o {} \;
find static_tmp -name '*.js' -exec terser --module -cmo {} {} \; find static_tmp -name '*.js' -exec terser --module -cmo {} {} \;
replace=""
for file in static_tmp/**/*.css static_tmp/js/*.js; do
hash=$(sha256sum "$file" | head -c 8)
dest="$(dirname $file)/$hash.$(basename $file)"
mv "$file" "$dest"
replace+=";s/\\/$(basename $file)/\\/$(basename $dest)/g"
done
cp nginx/nginx.conf nginx.conf.tmp
sed -i "$replace" static_tmp/**/*.html nginx.conf.tmp
find static_tmp -name '*.html' -exec html-minifier --collapse-whitespace \ find static_tmp -name '*.html' -exec html-minifier --collapse-whitespace \
--process-scripts "application/ld+json" --collapse-boolean-attributes \ --process-scripts "application/ld+json" --collapse-boolean-attributes \
--remove-attribute-quotes --remove-comments --remove-empty-attributes \ --remove-attribute-quotes --remove-comments --remove-empty-attributes \

View File

@ -21,7 +21,7 @@
<link rel="icon" sizes="any" type="image/svg+xml" href="/mask-icon.svg"/> <link rel="icon" sizes="any" type="image/svg+xml" href="/mask-icon.svg"/>
<link rel="mask-icon" href="/mask-icon.svg" color="#1a1a1a"/> <link rel="mask-icon" href="/mask-icon.svg" color="#1a1a1a"/>
<link rel="apple-touch-icon" href="/apple-touch-icon.png"/> <link rel="apple-touch-icon" href="/apple-touch-icon.png"/>
<link rel="stylesheet" href="/grapheneos.css?29"/> <link rel="stylesheet" href="/grapheneos.css"/>
<link rel="manifest" href="/manifest.webmanifest"/> <link rel="manifest" href="/manifest.webmanifest"/>
<link rel="license" href="/LICENSE.txt"/> <link rel="license" href="/LICENSE.txt"/>
</head> </head>

View File

@ -23,7 +23,7 @@
<link rel="icon" sizes="any" type="image/svg+xml" href="/mask-icon.svg"/> <link rel="icon" sizes="any" type="image/svg+xml" href="/mask-icon.svg"/>
<link rel="mask-icon" href="/mask-icon.svg" color="#1a1a1a"/> <link rel="mask-icon" href="/mask-icon.svg" color="#1a1a1a"/>
<link rel="apple-touch-icon" href="/apple-touch-icon.png"/> <link rel="apple-touch-icon" href="/apple-touch-icon.png"/>
<link rel="stylesheet" href="/grapheneos.css?29"/> <link rel="stylesheet" href="/grapheneos.css"/>
<link rel="manifest" href="/manifest.webmanifest"/> <link rel="manifest" href="/manifest.webmanifest"/>
<link rel="license" href="/LICENSE.txt"/> <link rel="license" href="/LICENSE.txt"/>
</head> </head>

View File

@ -23,7 +23,7 @@
<link rel="icon" sizes="any" type="image/svg+xml" href="/mask-icon.svg"/> <link rel="icon" sizes="any" type="image/svg+xml" href="/mask-icon.svg"/>
<link rel="mask-icon" href="/mask-icon.svg" color="#1a1a1a"/> <link rel="mask-icon" href="/mask-icon.svg" color="#1a1a1a"/>
<link rel="apple-touch-icon" href="/apple-touch-icon.png"/> <link rel="apple-touch-icon" href="/apple-touch-icon.png"/>
<link rel="stylesheet" href="/grapheneos.css?29"/> <link rel="stylesheet" href="/grapheneos.css"/>
<link rel="manifest" href="/manifest.webmanifest"/> <link rel="manifest" href="/manifest.webmanifest"/>
<link rel="license" href="/LICENSE.txt"/> <link rel="license" href="/LICENSE.txt"/>
</head> </head>

View File

@ -23,7 +23,7 @@
<link rel="icon" sizes="any" type="image/svg+xml" href="/mask-icon.svg"/> <link rel="icon" sizes="any" type="image/svg+xml" href="/mask-icon.svg"/>
<link rel="mask-icon" href="/mask-icon.svg" color="#1a1a1a"/> <link rel="mask-icon" href="/mask-icon.svg" color="#1a1a1a"/>
<link rel="apple-touch-icon" href="/apple-touch-icon.png"/> <link rel="apple-touch-icon" href="/apple-touch-icon.png"/>
<link rel="stylesheet" href="/grapheneos.css?29"/> <link rel="stylesheet" href="/grapheneos.css"/>
<link rel="manifest" href="/manifest.webmanifest"/> <link rel="manifest" href="/manifest.webmanifest"/>
<link rel="license" href="/LICENSE.txt"/> <link rel="license" href="/LICENSE.txt"/>
</head> </head>

View File

@ -23,7 +23,7 @@
<link rel="icon" sizes="any" type="image/svg+xml" href="/mask-icon.svg"/> <link rel="icon" sizes="any" type="image/svg+xml" href="/mask-icon.svg"/>
<link rel="mask-icon" href="/mask-icon.svg" color="#1a1a1a"/> <link rel="mask-icon" href="/mask-icon.svg" color="#1a1a1a"/>
<link rel="apple-touch-icon" href="/apple-touch-icon.png"/> <link rel="apple-touch-icon" href="/apple-touch-icon.png"/>
<link rel="stylesheet" href="/grapheneos.css?29"/> <link rel="stylesheet" href="/grapheneos.css"/>
<link rel="manifest" href="/manifest.webmanifest"/> <link rel="manifest" href="/manifest.webmanifest"/>
<link rel="license" href="/LICENSE.txt"/> <link rel="license" href="/LICENSE.txt"/>
</head> </head>

View File

@ -23,10 +23,10 @@
<link rel="icon" sizes="any" type="image/svg+xml" href="/mask-icon.svg"/> <link rel="icon" sizes="any" type="image/svg+xml" href="/mask-icon.svg"/>
<link rel="mask-icon" href="/mask-icon.svg" color="#1a1a1a"/> <link rel="mask-icon" href="/mask-icon.svg" color="#1a1a1a"/>
<link rel="apple-touch-icon" href="/apple-touch-icon.png"/> <link rel="apple-touch-icon" href="/apple-touch-icon.png"/>
<link rel="stylesheet" href="/grapheneos.css?29"/> <link rel="stylesheet" href="/grapheneos.css"/>
<link rel="manifest" href="/manifest.webmanifest"/> <link rel="manifest" href="/manifest.webmanifest"/>
<link rel="license" href="/LICENSE.txt"/> <link rel="license" href="/LICENSE.txt"/>
<script type="module" src="/js/redirect.js?12"></script> <script type="module" src="/js/redirect.js"></script>
</head> </head>
<body> <body>
<header> <header>

View File

@ -23,7 +23,7 @@
<link rel="icon" sizes="any" type="image/svg+xml" href="/mask-icon.svg"/> <link rel="icon" sizes="any" type="image/svg+xml" href="/mask-icon.svg"/>
<link rel="mask-icon" href="/mask-icon.svg" color="#1a1a1a"/> <link rel="mask-icon" href="/mask-icon.svg" color="#1a1a1a"/>
<link rel="apple-touch-icon" href="/apple-touch-icon.png"/> <link rel="apple-touch-icon" href="/apple-touch-icon.png"/>
<link rel="stylesheet" href="/grapheneos.css?29"/> <link rel="stylesheet" href="/grapheneos.css"/>
<link rel="manifest" href="/manifest.webmanifest"/> <link rel="manifest" href="/manifest.webmanifest"/>
<link rel="license" href="/LICENSE.txt"/> <link rel="license" href="/LICENSE.txt"/>
</head> </head>

View File

@ -23,7 +23,7 @@
<link rel="icon" sizes="any" type="image/svg+xml" href="/mask-icon.svg"/> <link rel="icon" sizes="any" type="image/svg+xml" href="/mask-icon.svg"/>
<link rel="mask-icon" href="/mask-icon.svg" color="#1a1a1a"/> <link rel="mask-icon" href="/mask-icon.svg" color="#1a1a1a"/>
<link rel="apple-touch-icon" href="/apple-touch-icon.png"/> <link rel="apple-touch-icon" href="/apple-touch-icon.png"/>
<link rel="stylesheet" href="/grapheneos.css?29"/> <link rel="stylesheet" href="/grapheneos.css"/>
<link rel="manifest" href="/manifest.webmanifest"/> <link rel="manifest" href="/manifest.webmanifest"/>
<link rel="license" href="/LICENSE.txt"/> <link rel="license" href="/LICENSE.txt"/>
</head> </head>

View File

@ -23,10 +23,10 @@
<link rel="icon" sizes="any" type="image/svg+xml" href="/mask-icon.svg"/> <link rel="icon" sizes="any" type="image/svg+xml" href="/mask-icon.svg"/>
<link rel="mask-icon" href="/mask-icon.svg" color="#1a1a1a"/> <link rel="mask-icon" href="/mask-icon.svg" color="#1a1a1a"/>
<link rel="apple-touch-icon" href="/apple-touch-icon.png"/> <link rel="apple-touch-icon" href="/apple-touch-icon.png"/>
<link rel="stylesheet" href="/grapheneos.css?29"/> <link rel="stylesheet" href="/grapheneos.css"/>
<link rel="manifest" href="/manifest.webmanifest"/> <link rel="manifest" href="/manifest.webmanifest"/>
<link rel="license" href="/LICENSE.txt"/> <link rel="license" href="/LICENSE.txt"/>
<script type="module" src="/js/redirect.js?12"></script> <script type="module" src="/js/redirect.js"></script>
</head> </head>
<body> <body>
<header> <header>

View File

@ -23,7 +23,7 @@
<link rel="icon" sizes="any" type="image/svg+xml" href="/mask-icon.svg"/> <link rel="icon" sizes="any" type="image/svg+xml" href="/mask-icon.svg"/>
<link rel="mask-icon" href="/mask-icon.svg" color="#1a1a1a"/> <link rel="mask-icon" href="/mask-icon.svg" color="#1a1a1a"/>
<link rel="apple-touch-icon" href="/apple-touch-icon.png"/> <link rel="apple-touch-icon" href="/apple-touch-icon.png"/>
<link rel="stylesheet" href="/grapheneos.css?29"/> <link rel="stylesheet" href="/grapheneos.css"/>
<link rel="manifest" href="/manifest.webmanifest"/> <link rel="manifest" href="/manifest.webmanifest"/>
<link rel="license" href="/LICENSE.txt"/> <link rel="license" href="/LICENSE.txt"/>
</head> </head>

View File

@ -23,7 +23,7 @@
<link rel="icon" sizes="any" type="image/svg+xml" href="/mask-icon.svg"/> <link rel="icon" sizes="any" type="image/svg+xml" href="/mask-icon.svg"/>
<link rel="mask-icon" href="/mask-icon.svg" color="#1a1a1a"/> <link rel="mask-icon" href="/mask-icon.svg" color="#1a1a1a"/>
<link rel="apple-touch-icon" href="/apple-touch-icon.png"/> <link rel="apple-touch-icon" href="/apple-touch-icon.png"/>
<link rel="stylesheet" href="/grapheneos.css?29"/> <link rel="stylesheet" href="/grapheneos.css"/>
<link rel="manifest" href="/manifest.webmanifest"/> <link rel="manifest" href="/manifest.webmanifest"/>
<link rel="license" href="/LICENSE.txt"/> <link rel="license" href="/LICENSE.txt"/>
</head> </head>

View File

@ -23,10 +23,10 @@
<link rel="icon" sizes="any" type="image/svg+xml" href="/mask-icon.svg"/> <link rel="icon" sizes="any" type="image/svg+xml" href="/mask-icon.svg"/>
<link rel="mask-icon" href="/mask-icon.svg" color="#1a1a1a"/> <link rel="mask-icon" href="/mask-icon.svg" color="#1a1a1a"/>
<link rel="apple-touch-icon" href="/apple-touch-icon.png"/> <link rel="apple-touch-icon" href="/apple-touch-icon.png"/>
<link rel="stylesheet" href="/grapheneos.css?29"/> <link rel="stylesheet" href="/grapheneos.css"/>
<link rel="manifest" href="/manifest.webmanifest"/> <link rel="manifest" href="/manifest.webmanifest"/>
<link rel="license" href="/LICENSE.txt"/> <link rel="license" href="/LICENSE.txt"/>
<script type="module" src="/js/redirect.js?12"></script> <script type="module" src="/js/redirect.js"></script>
</head> </head>
<body> <body>
<header> <header>

View File

@ -23,10 +23,10 @@
<link rel="icon" sizes="any" type="image/svg+xml" href="/mask-icon.svg"/> <link rel="icon" sizes="any" type="image/svg+xml" href="/mask-icon.svg"/>
<link rel="mask-icon" href="/mask-icon.svg" color="#1a1a1a"/> <link rel="mask-icon" href="/mask-icon.svg" color="#1a1a1a"/>
<link rel="apple-touch-icon" href="/apple-touch-icon.png"/> <link rel="apple-touch-icon" href="/apple-touch-icon.png"/>
<link rel="stylesheet" href="/grapheneos.css?29"/> <link rel="stylesheet" href="/grapheneos.css"/>
<link rel="manifest" href="/manifest.webmanifest"/> <link rel="manifest" href="/manifest.webmanifest"/>
<link rel="license" href="/LICENSE.txt"/> <link rel="license" href="/LICENSE.txt"/>
<script type="module" src="/js/redirect.js?12"></script> <script type="module" src="/js/redirect.js"></script>
</head> </head>
<body> <body>
<header> <header>

View File

@ -23,10 +23,10 @@
<link rel="icon" sizes="any" type="image/svg+xml" href="/mask-icon.svg"/> <link rel="icon" sizes="any" type="image/svg+xml" href="/mask-icon.svg"/>
<link rel="mask-icon" href="/mask-icon.svg" color="#1a1a1a"/> <link rel="mask-icon" href="/mask-icon.svg" color="#1a1a1a"/>
<link rel="apple-touch-icon" href="/apple-touch-icon.png"/> <link rel="apple-touch-icon" href="/apple-touch-icon.png"/>
<link rel="stylesheet" href="/grapheneos.css?29"/> <link rel="stylesheet" href="/grapheneos.css"/>
<link rel="manifest" href="/manifest.webmanifest"/> <link rel="manifest" href="/manifest.webmanifest"/>
<link rel="license" href="/LICENSE.txt"/> <link rel="license" href="/LICENSE.txt"/>
<script type="module" src="/js/redirect.js?12"></script> <script type="module" src="/js/redirect.js"></script>
</head> </head>
<body> <body>
<header> <header>

View File

@ -23,12 +23,12 @@
<link rel="icon" sizes="any" type="image/svg+xml" href="/mask-icon.svg"/> <link rel="icon" sizes="any" type="image/svg+xml" href="/mask-icon.svg"/>
<link rel="mask-icon" href="/mask-icon.svg" color="#1a1a1a"/> <link rel="mask-icon" href="/mask-icon.svg" color="#1a1a1a"/>
<link rel="apple-touch-icon" href="/apple-touch-icon.png"/> <link rel="apple-touch-icon" href="/apple-touch-icon.png"/>
<link rel="stylesheet" href="/grapheneos.css?29"/> <link rel="stylesheet" href="/grapheneos.css"/>
<link rel="manifest" href="/manifest.webmanifest"/> <link rel="manifest" href="/manifest.webmanifest"/>
<link rel="license" href="/LICENSE.txt"/> <link rel="license" href="/LICENSE.txt"/>
<script type="module" src="/js/redirect.js?12"></script> <script type="module" src="/js/redirect.js"></script>
<script type="module" src="/js/fastboot/dist/fastboot.min.mjs?1.0.8"></script> <script type="module" src="/js/fastboot/dist/fastboot.min.mjs?1.0.8"></script>
<script type="module" src="/js/web-install.js?13"></script> <script type="module" src="/js/web-install.js"></script>
</head> </head>
<body> <body>
<header> <header>

View File

@ -23,7 +23,7 @@
<link rel="icon" sizes="any" type="image/svg+xml" href="/mask-icon.svg"/> <link rel="icon" sizes="any" type="image/svg+xml" href="/mask-icon.svg"/>
<link rel="mask-icon" href="/mask-icon.svg" color="#1a1a1a"/> <link rel="mask-icon" href="/mask-icon.svg" color="#1a1a1a"/>
<link rel="apple-touch-icon" href="/apple-touch-icon.png"/> <link rel="apple-touch-icon" href="/apple-touch-icon.png"/>
<link rel="stylesheet" href="/grapheneos.css?29"/> <link rel="stylesheet" href="/grapheneos.css"/>
<link rel="manifest" href="/manifest.webmanifest"/> <link rel="manifest" href="/manifest.webmanifest"/>
<link rel="license" href="/LICENSE.txt"/> <link rel="license" href="/LICENSE.txt"/>
</head> </head>

View File

@ -24,11 +24,11 @@
<link rel="icon" sizes="any" type="image/svg+xml" href="/mask-icon.svg"/> <link rel="icon" sizes="any" type="image/svg+xml" href="/mask-icon.svg"/>
<link rel="mask-icon" href="/mask-icon.svg" color="#1a1a1a"/> <link rel="mask-icon" href="/mask-icon.svg" color="#1a1a1a"/>
<link rel="apple-touch-icon" href="/apple-touch-icon.png"/> <link rel="apple-touch-icon" href="/apple-touch-icon.png"/>
<link rel="stylesheet" href="/grapheneos.css?29"/> <link rel="stylesheet" href="/grapheneos.css"/>
<link rel="manifest" href="/manifest.webmanifest"/> <link rel="manifest" href="/manifest.webmanifest"/>
<link rel="license" href="/LICENSE.txt"/> <link rel="license" href="/LICENSE.txt"/>
<script type="module" src="/js/releases.js?14"></script> <script type="module" src="/js/releases.js"></script>
<script type="module" src="/js/redirect.js?12"></script> <script type="module" src="/js/redirect.js"></script>
</head> </head>
<body> <body>
<header> <header>

View File

@ -23,7 +23,7 @@
<link rel="icon" sizes="any" type="image/svg+xml" href="/mask-icon.svg"/> <link rel="icon" sizes="any" type="image/svg+xml" href="/mask-icon.svg"/>
<link rel="mask-icon" href="/mask-icon.svg" color="#1a1a1a"/> <link rel="mask-icon" href="/mask-icon.svg" color="#1a1a1a"/>
<link rel="apple-touch-icon" href="/apple-touch-icon.png"/> <link rel="apple-touch-icon" href="/apple-touch-icon.png"/>
<link rel="stylesheet" href="/grapheneos.css?29"/> <link rel="stylesheet" href="/grapheneos.css"/>
<link rel="manifest" href="/manifest.webmanifest"/> <link rel="manifest" href="/manifest.webmanifest"/>
<link rel="license" href="/LICENSE.txt"/> <link rel="license" href="/LICENSE.txt"/>
</head> </head>

View File

@ -23,10 +23,10 @@
<link rel="icon" sizes="any" type="image/svg+xml" href="/mask-icon.svg"/> <link rel="icon" sizes="any" type="image/svg+xml" href="/mask-icon.svg"/>
<link rel="mask-icon" href="/mask-icon.svg" color="#1a1a1a"/> <link rel="mask-icon" href="/mask-icon.svg" color="#1a1a1a"/>
<link rel="apple-touch-icon" href="/apple-touch-icon.png"/> <link rel="apple-touch-icon" href="/apple-touch-icon.png"/>
<link rel="stylesheet" href="/grapheneos.css?29"/> <link rel="stylesheet" href="/grapheneos.css"/>
<link rel="manifest" href="/manifest.webmanifest"/> <link rel="manifest" href="/manifest.webmanifest"/>
<link rel="license" href="/LICENSE.txt"/> <link rel="license" href="/LICENSE.txt"/>
<script type="module" src="/js/redirect.js?12"></script> <script type="module" src="/js/redirect.js"></script>
</head> </head>
<body> <body>
<header> <header>