Skip to content

Add infineon (#2461) #232

Add infineon (#2461)

Add infineon (#2461) #232

name: Deploy Crawler (Hetzner)
on:
push:
branches: [main]
paths:
- 'apps/crawler/**'
- '.github/workflows/deploy-crawler-browser.yml'
jobs:
deploy:
runs-on: ubuntu-latest
environment: production
permissions:
contents: read
packages: write
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
- name: Read VERSION
id: version
run: echo "version=$(cat apps/crawler/VERSION | tr -d '[:space:]')" >> "$GITHUB_OUTPUT"
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@8d2750c68a42422c14e847fe6c8ac0403b4cbd6f # v3
- name: Log in to GHCR
uses: docker/login-action@c94ce9fb468520275223c153574b00df6fe4bcc9 # v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Build and push slim image (worker, exporter, drain)
uses: docker/build-push-action@10e90e3645eae34f1e60eeb005ba3a3d33f178e8 # v6
with:
context: apps/crawler
target: slim
platforms: linux/amd64
push: true
tags: |
ghcr.io/${{ github.repository_owner }}/jobseek-crawler:latest
ghcr.io/${{ github.repository_owner }}/jobseek-crawler:v${{ steps.version.outputs.version }}
cache-from: type=gha,scope=crawler-slim
cache-to: type=gha,mode=max,scope=crawler-slim
- name: Build and push browser image (full)
uses: docker/build-push-action@10e90e3645eae34f1e60eeb005ba3a3d33f178e8 # v6
with:
context: apps/crawler
target: full
platforms: linux/amd64
push: true
tags: |
ghcr.io/${{ github.repository_owner }}/jobseek-crawler-browser:latest
ghcr.io/${{ github.repository_owner }}/jobseek-crawler-browser:v${{ steps.version.outputs.version }}
cache-from: type=gha,scope=crawler-browser
cache-to: type=gha,mode=max,scope=crawler-browser
- name: Copy deploy files
uses: appleboy/scp-action@917f8b81dfc1ccd331fef9e2d61bdc6c8be94634 # v0.1.7
with:
host: ${{ secrets.HETZNER_HOST }}
username: deploy
key: ${{ secrets.HETZNER_SSH_KEY }}
source: apps/crawler/deploy.sh,apps/crawler/docker-compose.yml,apps/crawler/alloy.river
target: /home/deploy/
strip_components: 2
- name: Deploy via SSH
uses: appleboy/ssh-action@0ff4204d59e8e51228ff73bce53f80d53301dee2 # v1
with:
host: ${{ secrets.HETZNER_HOST }}
username: deploy
key: ${{ secrets.HETZNER_SSH_KEY }}
envs: OWNER,DATABASE_URL_UNPOOLED,LOCAL_DATABASE_URL,R2_ACCESS_KEY_ID,R2_SECRET_ACCESS_KEY,R2_ENDPOINT_URL,R2_DOMAIN_URL,R2_BUCKET,GRAFANA_PROM_URL,GRAFANA_PROM_USERNAME,GRAFANA_PROM_PASSWORD,GRAFANA_LOKI_URL,GRAFANA_LOKI_USERNAME,GRAFANA_LOKI_PASSWORD,TYPESENSE_HOST,TYPESENSE_PORT,TYPESENSE_PROTOCOL,TYPESENSE_ADMIN_KEY,PROXY_PROVIDER,WEBSHARE_PROXY_URL,DECODO_PROXY_URL,INDEXNOW_KEY,INDEXNOW_SITE_URL,INDEXNOW_KEY_URL,INDEXNOW_INTERVAL
script: bash /home/deploy/deploy.sh
env:
OWNER: ${{ github.repository_owner }}
DATABASE_URL_UNPOOLED: ${{ secrets.DATABASE_URL_UNPOOLED }}
LOCAL_DATABASE_URL: ${{ secrets.LOCAL_DATABASE_URL }}
R2_ACCESS_KEY_ID: ${{ secrets.R2_ACCESS_KEY_ID }}
R2_SECRET_ACCESS_KEY: ${{ secrets.R2_SECRET_ACCESS_KEY }}
R2_ENDPOINT_URL: ${{ secrets.R2_ENDPOINT_URL }}
R2_DOMAIN_URL: ${{ secrets.R2_DOMAIN_URL }}
R2_BUCKET: ${{ secrets.R2_BUCKET }}
GRAFANA_PROM_URL: ${{ secrets.GRAFANA_PROM_URL }}
GRAFANA_PROM_USERNAME: ${{ secrets.GRAFANA_PROM_USERNAME }}
GRAFANA_PROM_PASSWORD: ${{ secrets.GRAFANA_PROM_PASSWORD }}
GRAFANA_LOKI_URL: ${{ secrets.GRAFANA_LOKI_URL }}
GRAFANA_LOKI_USERNAME: ${{ secrets.GRAFANA_LOKI_USERNAME }}
GRAFANA_LOKI_PASSWORD: ${{ secrets.GRAFANA_LOKI_PASSWORD }}
TYPESENSE_HOST: ${{ secrets.TYPESENSE_HOST }}
TYPESENSE_PORT: ${{ secrets.TYPESENSE_PORT }}
TYPESENSE_PROTOCOL: ${{ secrets.TYPESENSE_PROTOCOL }}
TYPESENSE_ADMIN_KEY: ${{ secrets.TYPESENSE_ADMIN_KEY }}
# Proxy provider — see src/shared/proxy.py. All three vars are
# safe-empty: deploy.sh defaults PROXY_PROVIDER to "none" and
# the proxy module treats empty URLs as a disabled provider.
PROXY_PROVIDER: ${{ secrets.PROXY_PROVIDER }}
WEBSHARE_PROXY_URL: ${{ secrets.WEBSHARE_PROXY_URL }}
DECODO_PROXY_URL: ${{ secrets.DECODO_PROXY_URL }}
# IndexNow notifier (see apps/crawler/src/indexnow.py). The
# notifier short-circuits when INDEXNOW_KEY is empty, so
# deploys without the secret run the loop as a no-op rather
# than failing.
INDEXNOW_KEY: ${{ secrets.INDEXNOW_KEY }}
INDEXNOW_SITE_URL: ${{ secrets.INDEXNOW_SITE_URL }}
INDEXNOW_KEY_URL: ${{ secrets.INDEXNOW_KEY_URL }}
INDEXNOW_INTERVAL: ${{ secrets.INDEXNOW_INTERVAL }}