initial commit

Signed-off-by: Ava Hahn <a.hahn@f5.com>
This commit is contained in:
Ava Hahn 2025-08-16 00:47:14 +00:00
commit 4ee7c0cc18
13 changed files with 582 additions and 0 deletions

21
kaproxy/Dockerfile Normal file
View file

@ -0,0 +1,21 @@
FROM archlinux:latest
EXPOSE 8080
RUN pacman -Syyu --noconfirm
RUN pacman -S base-devel glibc gcc-libs --noconfirm
COPY nginx /nginx
WORKDIR /nginx
RUN auto/configure \
--with-debug \
--with-http_ssl_module \
--with-cc-opt=-pg
RUN make
RUN make install
COPY nginx.conf /
COPY dhparam.pem /
COPY www.example.com.crt /
COPY www.example.com.key /
COPY run.sh /
CMD ["/run.sh"]

29
kaproxy/dhparam.pem Normal file
View file

@ -0,0 +1,29 @@
-----BEGIN DH PARAMETERS-----
MIIE7gKCBOMA3dPbX68yiaLYtcNvknBf442ugqhCrRIrxz81m3YdWqKbyI+XOnkT
u6A7Be5jP2CJJJWBpqEZOFLWqZ9Dr5y42mDBCNPx2E/fXh1jcYbfC3vHJjOE1aC1
Rn7CwWs+9qwesTn8zcGaB1SUoLLAiaQ6gtUHzYRM3p/5I8DDTqbIAX7pAzQmjVZM
VZXMeJhlERnA95Hqfvr9dW7zSwwDWx1ilsTv28MXergqSCpOsy4AK0iN5kzTUPez
nZQoObqTtQl8zduzXf68yMrDAbdmhKlX3eeFDFo73ZQopeixtrt7CEnwbxPCPCzb
LpfGv+HEVLZyUIiywZ0v6DkMbam/btmnML4fB9fawZ+W9kAIC1WM9SoaL7czDLlA
uspcPZFZ6sAONFPyFLWmsSoCE8J0a4wZocaDxhbnYkCvdZ4jkwQiamsWk9VTXXmq
vXpqWq2Ubwcf0brDH0F7TW+SD58rcYTVwdcq+jGIflLj9xLNMYdnUHCBhV8TajcK
TolDQgEOaWokzW5stGtCuv54CgsFpkTvbvp6YNtu2v6tle+V1gCkrQsm4wagEt/p
O+tafBxJeBt4OoGTEWNwFtOJd85TpvPBtajDWaV4trLdvY8RUQOAIbkZzcMgp4Mz
qTeSLhDhIhmYIfXXD3hRULsSyKkUs1ztheuFa0WaHY+41AKPUjgFMrodSDJ/SQjS
nRaOdXbYPux/nQ6Yx7sgvjW1nhAGkYIo42Wn+x6QueJUrr3m0HrKpAEg50ExmyO3
80CMgGaVQAPgysICKLF5+p2or2oQv12QsOj8Jpt7hPIBHZqO/cVnO/1eXoLZnKRo
P/epOkM9aKv+vASHi29Iqrew1s7NAfVijk8zB9Lh5+2x6A62V/iuHMcVZuqgkPGF
ujwANkokOuQD1chqprfCT7mTQKAa0M4wmvJgkxmRe17EH41zbIax3BhfhYI1RscH
yEg5xYYZJFYcqNHkqTOwyK6hWYc9gjiQxXaj/O9EqquHfZXEEfV+5VF0nKAn92ss
VubqbTtTv/zGapQzBNggTrFO5qB2+05tU6vIs8XVKPjkncffmssMWSRWwnuPEAhP
LzjDd+F2oN/+j9eANK075U/6AhNSBF4WUam3u/i8L3KoIjTn+P/+4a7bSU6FFMHx
2uQD2sfE9s5EmTnMgr68rC+If2mbWNb58RADMOR1Hvphw0rHgVbvbikRKFXaf26f
sDjBV8mSE47xCc05T0DF9apgWiFjwAx9YXqlXlIFLJ77IQrrlCwA8Q4KedgE+Ovq
8bNgYodgkiszGW16/o97kDLigKhRUGgAoAOB28l57Pw0EfoxOIJOazzcSTfU52nW
zs25F42ptwKs3MEA9ySvTEtSYyacMNMtAJOUNaQelvFX1GpSZDCmSp7VbRhXWFH0
pZN+rpD9FoZTpixqTeNDvJoazuZ8L18Lz5nLDPxeUAh4LKvgeKJE/e699Hgn2RJ4
5/N4FmU6FesUGJ6CtSlbMjK/iOQQgXPIzBeNmZEBnSZGoHNSiKpfi89AKrmtSDfR
//VPh75xISCmq5k+UqTuQsx7LFODl+0pY/9QeofMR1BZcjcnknVSikB4NMzOYEaP
VtK37hj2LgN6ObvQuvJi0TpDJKD8/yWqRDWxh3OedrNssVpIgZYUvmP3ZoDM9N2/
myFqy7manTL2Dc8CAQICAgHC
-----END DH PARAMETERS-----

1
kaproxy/nginx Submodule

@ -0,0 +1 @@
Subproject commit 64d0795ac41836b6be8fcceba68f1dbb62b4035a

59
kaproxy/nginx.conf Normal file
View file

@ -0,0 +1,59 @@
worker_processes 5;
error_log /dev/stdout notice;
pid /tmp/pid;
events {
worker_connections 20;
}
http {
keepalive_timeout 300;
server {
listen 8080 ssl;
server_name www.example.com;
ssl_certificate /www.example.com.crt;
ssl_certificate_key /www.example.com.key;
access_log /tmp/access.log;
location /0 {
proxy_pass http://kasvc-0:8080;
}
location /1 {
proxy_pass http://kasvc-1:8080;
}
location /2 {
proxy_pass http://kasvc-2:8080;
}
location /3 {
proxy_pass http://kasvc-3:8080;
}
location /4 {
proxy_pass http://kasvc-4:8080;
}
location /5 {
proxy_pass http://kasvc-5:8080;
}
location /6 {
proxy_pass http://kasvc-6:8080;
}
location /7 {
proxy_pass http://kasvc-7:8080;
}
location /8 {
proxy_pass http://kasvc-8:8080;
}
location /9 {
proxy_pass http://kasvc-9:8080;
}
}
}

23
kaproxy/run.sh Executable file
View file

@ -0,0 +1,23 @@
#!/bin/bash
function invoke() {
/nginx/objs/nginx \
-p /tmp \
-e /tmp/error.log \
-c /nginx.conf \
-g "daemon off;" \
$@
}
function sigint_handler() {
echo "sigint received. trigger again to kill."
invoke -s quit
trap - INT
}
trap 'sigint_handler' INT
invoke &
wait
echo "NGINX down. waiting until signalled..."
sleep infinity

View file

@ -0,0 +1,94 @@
-----BEGIN CERTIFICATE-----
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
-----END CERTIFICATE-----

196
kaproxy/www.example.com.key Normal file
View file

@ -0,0 +1,196 @@
-----BEGIN PRIVATE KEY-----
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
VD6dr9AUi1S36keVP9O3yf5stygNSmg=
-----END PRIVATE KEY-----