diff --git a/.github/workflows/main.yaml b/.github/workflows/main.yaml new file mode 100644 index 0000000..2f754d5 --- /dev/null +++ b/.github/workflows/main.yaml @@ -0,0 +1,51 @@ +name: Deploy everything +on: + push: + branches: + - main +env: + CONTAINER_REGISTRY: schmelczera + DOMAIN: '161.35.71.163' + +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: Checkout current branch with lfs + uses: actions/checkout@main + with: + lfs: true + + - name: Setup auth tokens + run: | + docker login -u ${{ secrets.DOCKER_USER }} -p ${{ secrets.DOCKER_PASSWORD }} + + - name: Build and push + run: | + docker build . -t $CONTAINER_REGISTRY/timeline + docker push $CONTAINER_REGISTRY/timeline + + push: + runs-on: ubuntu-latest + needs: + - build-frontend + - build-ingress + steps: + - name: Checkout current branch with lfs + uses: actions/checkout@main + with: + lfs: true + + - name: Setup auth tokens + run: | + # SSH key + mkdir ~/.ssh + echo "${{ secrets.SSH_PRIVATE_KEY }}" > ~/.ssh/id_ed25519 + chmod 400 ~/.ssh/id_ed25519 + ssh -o StrictHostKeyChecking=no root@$DOMAIN uptime + + - name: Stack up + run: | + DOCKER_HOST=ssh://root@$DOMAIN docker login -u ${{ secrets.DOCKER_TOKEN }} -p ${{ secrets.DOCKER_TOKEN }} $CONTAINER_REGISTRY + DOCKER_HOST=ssh://root@$DOMAIN docker stack up declared -c docker-compose.yml --with-registry-auth + working-directory: infrastructure diff --git a/Dockerfile b/Dockerfile index d4cb9c9..84904e2 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,9 +1,23 @@ -FROM node:latest as build +FROM schmelczera/error-pages as build-error-pages +RUN python build.py 403 404 50x +FROM node:latest as build-webpage WORKDIR /home/node -COPY . . + +COPY src src +COPY package.json custom.d.ts tsconfig.json webpack.config.js ./ + RUN npm install RUN npm run build FROM nginx:alpine -COPY --from=build /home/node/dist/ /usr/share/nginx/html + +WORKDIR /usr/share/nginx/html + +RUN rm -rf * +COPY --from=build-webpage /home/node/dist . +COPY --from=build-error-pages /home/python/built errors +RUN find . -type f | xargs gzip -k9 &&\ + chmod -R 555 . + +COPY nginx-config /etc/nginx/ diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..d8a6289 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,34 @@ +version: "3.8" + +services: + timeline: + init: true + image: schmelczera/timeline + depends_on: + - frontend + networks: + - network + deploy: + replicas: 2 + resources: + limits: + cpus: "0.5" + memory: 32M + reservations: + cpus: "0.2" + memory: 32M + placement: + max_replicas_per_node: 1 + update_config: + parallelism: 1 + failure_action: rollback + delay: 10s + monitor: 10s + restart_policy: + condition: on-failure + window: 30s + ports: + - "80" + +networks: + network: diff --git a/nginx-config/nginx.conf b/nginx-config/nginx.conf new file mode 100644 index 0000000..901dada --- /dev/null +++ b/nginx-config/nginx.conf @@ -0,0 +1,54 @@ +user nginx; +worker_processes auto; + +error_log /var/log/nginx/error.log warn; +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; + sendfile_max_chunk 1m; + tcp_nopush on; + + keepalive_timeout 65; + + gzip on; + gzip_static on; + gzip_vary on; + gzip_min_length 10240; + gzip_proxied any; + gzip_disable "MSIE [1-6]\.(?!.*SV1)"; + + server { + listen 80; + server_name localhost; + + root /usr/share/nginx/html; + index index.html; + + location ~* \.(jpg|jpeg|png|ico)$ { + expires 30d; + } + + error_page 403 /403.html; + error_page 404 /404.html; + error_page 500 501 502 503 504 /50x.html; + + location ~ ^/(403|404|50x).html$ { + root /usr/share/nginx/html/errors; + internal; + } + } +} diff --git a/package.json b/package.json index eb7956d..1d3bd84 100644 --- a/package.json +++ b/package.json @@ -5,8 +5,7 @@ "private": true, "scripts": { "start": "webpack-dev-server --mode development", - "build": "webpack", - "build-docker": "webpack && docker build -t portfolio . && docker save -o target/portfolio portfolio" + "build": "webpack && find dist -type f -regex \".*\\(js\\|css\\|txt\\)\" | xargs rm" }, "repository": { "type": "git", @@ -33,9 +32,9 @@ ], "homepage": "https://github.com/schmelczerandras/timeline#readme", "devDependencies": { - "autoprefixer": "^9.7.6", + "autoprefixer": "^9.8.6", "clean-webpack-plugin": "^3.0.0", - "css-loader": "^3.5.2", + "css-loader": "^3.6.0", "cssnano": "latest", "file-loader": "^5.1.0", "html-webpack-inline-source-plugin": "0.0.10", @@ -47,16 +46,16 @@ "prettier": "^1.19.1", "resolve-url-loader": "^3.1.1", "responsive-loader": "^1.2.0", - "sass": "^1.26.3", + "sass": "^1.26.10", "sass-loader": "^8.0.2", "sharp": "^0.23.4", - "style-loader": "^1.1.4", + "style-loader": "^1.2.1", "svg-url-loader": "^3.0.3", - "terser-webpack-plugin": "^2.3.5", + "terser-webpack-plugin": "^2.3.7", "ts-loader": "^6.2.2", - "typescript": "^3.8.3", - "webpack": "^4.43.0", - "webpack-cli": "^3.3.11", - "webpack-dev-server": "^3.10.3" + "typescript": "^3.9.7", + "webpack": "^4.44.1", + "webpack-cli": "^3.3.12", + "webpack-dev-server": "^3.11.0" } } diff --git a/src/page/footer/footer.html.ts b/src/page/footer/footer.html.ts index 3cdaaaf..a30a00d 100644 --- a/src/page/footer/footer.html.ts +++ b/src/page/footer/footer.html.ts @@ -16,7 +16,7 @@ export const generate = ({