diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..b947077 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,2 @@ +node_modules/ +dist/ diff --git a/Dockerfile b/Dockerfile index 3c79d8b..980a322 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,3 +1,26 @@ +# ======Building the project===== +FROM node:17.2.0 AS builder + +WORKDIR /usr/src/app + +# Install Node dependencies +COPY package.json yarn.lock ./ +RUN yarn install + +# Copy over source code & build project +COPY vite.config.ts tsconfig.json index.html ./ +COPY src/ ./src +COPY public/ ./public +RUN yarn run build + + +# =====Packaging inside an Nginx container===== FROM nginx:1.21.4-alpine -COPY default.conf.template /etc/nginx/templates/default.conf.template +# Copy over the Nginx config files +COPY nginx/nginx.conf /etc/nginx/nginx.conf +COPY nginx/*.conf.template /etc/nginx/templates/ +COPY nginx/default.conf /etc/nginx/conf.d/default.conf + +# Copy over build artifacts +COPY --from=builder /usr/src/app/dist /usr/share/nginx/html diff --git a/nginx/default.conf b/nginx/default.conf new file mode 100644 index 0000000..797d322 --- /dev/null +++ b/nginx/default.conf @@ -0,0 +1,20 @@ +# vim: ft=nginx +server { + listen 80; + listen [::]:80; + + + # =====FRONTEND HOSTING===== + location / { + root /usr/share/nginx/html; + index index.html; + } + + error_page 404 /404.html; + + # redirect server error pages to the static page /50x.html + error_page 500 502 503 504 /50x.html; + location = /50x.html { + root /usr/share/nginx/html; + } +} diff --git a/nginx/gateway.conf.template b/nginx/gateway.conf.template new file mode 100644 index 0000000..ab11892 --- /dev/null +++ b/nginx/gateway.conf.template @@ -0,0 +1,13 @@ +# vim: ft=nginx +server { + listen 80; + listen [::]:80; + + location /api/v1/posts/ { + proxy_pass http://${RB_BLOG}/v1/posts/; + } + + location /api/v1/sections/ { + proxy_pass http://${RB_BLOG}/v1/sections/; + } +} diff --git a/nginx/matrix.conf.template b/nginx/matrix.conf.template new file mode 100644 index 0000000..8a86d43 --- /dev/null +++ b/nginx/matrix.conf.template @@ -0,0 +1,55 @@ +# vim: ft=nginx +server { + listen 80; + listen [::]:80; + + + # =====MATRIX WELL-KNOWN FILES===== + # Used for server federation + location = /.well-known/matrix/server { + charset utf-8; + default_type application/json; + + if ($request_method = 'GET') { + add_header Access-Control-Allow-Origin '*'; + add_header Access-Control-Allow-Methods 'GET, POST, PUT, DELETE, OPTIONS'; + add_header Access-Control-Allow-Headers 'X-Requested-With, Content-Type, Authorization'; + + return 200 '{"m.server":"${MATRIX_SERVER}"}'; + } + + if ($request_method = 'OPTIONS') { + add_header Access-Control-Allow-Origin '*'; + add_header Access-Control-Allow-Methods 'GET, POST, PUT, DELETE, OPTIONS'; + add_header Access-Control-Allow-Headers 'X-Requested-With, Content-Type, Authorization'; + add_header 'Content-Length' 0; + return 204; + } + + return 405; + } + + location = /.well-known/matrix/client { + charset utf-8; + default_type application/json; + + if ($request_method = 'GET') { + add_header Access-Control-Allow-Origin '*'; + add_header Access-Control-Allow-Methods 'GET, POST, PUT, DELETE, OPTIONS'; + add_header Access-Control-Allow-Headers 'X-Requested-With, Content-Type, Authorization'; + + return 200 '{"m.homeserver":{"base_url":"${MATRIX_CLIENT_SERVER}"}}'; + } + + if ($request_method = 'OPTIONS') { + add_header Access-Control-Allow-Origin '*'; + add_header Access-Control-Allow-Methods 'GET, POST, PUT, DELETE, OPTIONS'; + add_header Access-Control-Allow-Headers 'X-Requested-With, Content-Type, Authorization'; + add_header 'Content-Length' 0; + return 204; + } + + return 405; + } + +} diff --git a/nginx/nginx.conf b/nginx/nginx.conf new file mode 100644 index 0000000..c9f17e7 --- /dev/null +++ b/nginx/nginx.conf @@ -0,0 +1,33 @@ +user nginx; +worker_processes auto; + +error_log /var/log/nginx/error.log notice; +pid /var/run/nginx.pid; + + +events { + worker_connections 1024; +} + + +http { + include /etc/nginx/mime.types; + default_type application/octet-stream; + + log_format main '$remote_addr - $remote_user [$time_local] "$request" ' + '$status $body_bytes_sent "$http_referer" ' + '"$http_user_agent" "$http_x_forwarded_for"'; + + access_log /var/log/nginx/access.log main; + + sendfile on; + + keepalive_timeout 65; + + gzip on; + + # This order is important, as the Matrix matches should be evaluated first + include /etc/nginx/conf.d/matrix.conf; + include /etc/nginx/conf.d/gateway.conf; + include /etc/nginx/conf.d/default.conf; +} diff --git a/package.json b/package.json index 15dd17e..addbab4 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,8 @@ "scripts": { "dev": "vite", "build": "vue-tsc --noEmit && vite build", - "preview": "vite preview" + "preview": "vite preview", + "image": "docker build -t chewingbever/rb-blog ." }, "dependencies": { "vue": "^3.2.25" @@ -15,4 +16,4 @@ "vite": "^2.7.2", "vue-tsc": "^0.29.8" } -} \ No newline at end of file +}