Skip to content

Commit 4e8b5bc

Browse files
authored
feat: update proxy path handling and deployment (#21)
PR mainly improves how proxy settings are handled, which helps simplify some of the compose files and how deployment is handled. Also updated the build image workflow. - Proxy changes: - Proxy settings now managed via settings/environment variables, removing the dynamic trusted hosts. - Static assets are now referenced using FastAPI’s `url_for` - mymdc proxy path worked out from request path in all cases - Compose: - Simplified compose files and removed duplication - `compose.yml` contains main config, with `compose.override.yml` having default (dev) overrides - Staging inherits from main file, prod inherits from staging, with minimal changes - Project name used for dynamic routing and path prefix
2 parents f9ebc56 + 19f7ac4 commit 4e8b5bc

File tree

18 files changed

+172
-242
lines changed

18 files changed

+172
-242
lines changed

.github/setup/action.yml

Lines changed: 0 additions & 37 deletions
This file was deleted.

.github/workflows/build-image.yml

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,56 +1,56 @@
1-
name: Build Image
1+
name: Build and Publish Container Image
22

33
on:
44
push:
5-
tags:
6-
- "v**"
7-
workflow_call:
8-
workflow_dispatch:
5+
branches:
6+
- main
7+
release:
8+
types: [published]
99

1010
env:
1111
REGISTRY: ghcr.io
1212
IMAGE_NAME: ${{ github.repository }}
1313

1414
jobs:
15-
build-and-push-image:
15+
build-and-push:
1616
runs-on: ubuntu-latest
1717
permissions:
1818
contents: read
1919
packages: write
2020

2121
steps:
2222
- name: Checkout repository
23-
uses: actions/checkout@v3
23+
uses: actions/checkout@v4
2424

25-
- name: Log in to the Container registry
26-
uses: docker/login-action@65b78e6e13532edd9afa3aa52ac7964289d1a9c1
25+
- name: Set up Docker Buildx
26+
uses: docker/setup-buildx-action@v3
27+
28+
- name: Log in to GitHub Container Registry
29+
uses: docker/login-action@v3
2730
with:
2831
registry: ${{ env.REGISTRY }}
2932
username: ${{ github.actor }}
3033
password: ${{ secrets.GITHUB_TOKEN }}
3134

3235
- name: Extract metadata (tags, labels) for Docker
3336
id: meta
34-
uses: docker/metadata-action@9ec57ed1fcdbf14dcef7dfbe97b2010124a938b7
37+
uses: docker/metadata-action@v5
3538
with:
3639
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
3740
tags: |
3841
type=ref,event=branch
39-
type=ref,event=pr
4042
type=semver,pattern={{version}}
4143
type=semver,pattern={{major}}.{{minor}}
4244
type=semver,pattern={{major}}
43-
type=sha
44-
45-
- name: Set up QEMU
46-
uses: docker/setup-qemu-action@v2
47-
48-
- name: Set up Docker Buildx
49-
uses: docker/setup-buildx-action@v2
45+
type=raw,value=staging,enable=${{ github.event_name == 'push' && github.ref == 'refs/heads/main' }}
46+
type=raw,value=stable,enable=${{ github.event_name == 'release' }}
5047
5148
- name: Build and push Docker image
52-
uses: docker/build-push-action@f2a1d5e99d037542a71f64918e516c093c6f3fc4
49+
uses: docker/build-push-action@v6
5350
with:
51+
context: .
5452
push: true
5553
tags: ${{ steps.meta.outputs.tags }}
5654
labels: ${{ steps.meta.outputs.labels }}
55+
cache-from: type=gha
56+
cache-to: type=gha,mode=max

.github/workflows/deploy.yml

Lines changed: 0 additions & 15 deletions
This file was deleted.

Dockerfile

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ ENV \
3434
UV_LINK_MODE=copy \
3535
UV_CACHE_DIR=/opt/uv-cache/
3636

37-
RUN apt update && apt install -y openssh-client
37+
RUN apt update && apt install -y openssh-client wget && rm -rf /var/lib/apt/lists/*
3838

3939
COPY --link ./pyproject.toml ./uv.lock /app/
4040

@@ -56,4 +56,4 @@ ENV ZWOP_ADDRESS=http://0.0.0.0:8000
5656
CMD ["uv", "run", "-m", "zulip_write_only_proxy.main"]
5757

5858
HEALTHCHECK --start-interval=1s --start-period=30s --interval=60s \
59-
CMD wget --spider http://0.0.0.0:8000/api/health || exit 1
59+
CMD wget http://0.0.0.0:8000/api/health || exit 1

compose.override.yml

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
2+
name: zwop-dev
3+
4+
services:
5+
server:
6+
environment:
7+
- "ZWOP_TOKEN_WRITER__ZWOP_URL=http://localhost:8000/${COMPOSE_PROJECT_NAME}"
8+
develop:
9+
watch:
10+
- action: sync
11+
path: ./src/zulip_write_only_proxy
12+
target: /app/src/zulip_write_only_proxy
13+
ignore:
14+
- __pycache__/
15+
- "*.pyc"
16+
- ".pytest_cache/"
17+
- action: sync+restart
18+
path: ./pyproject.toml
19+
target: /app/pyproject.toml
20+
- action: sync+restart
21+
path: ./src/zulip_write_only_proxy/main.py
22+
target: /app/src/zulip_write_only_proxy/main.py
23+
restart: never
24+
25+
traefik:
26+
image: "traefik:latest"
27+
command:
28+
- "--api.insecure=true"
29+
- "--providers.docker=true"
30+
- "--providers.docker.exposedbydefault=false"
31+
- "--entrypoints.web.address=:8000"
32+
- "--log.level=DEBUG"
33+
ports:
34+
- 8000:8000
35+
- 8080:8080
36+
volumes:
37+
- ${DOCKER_SOCK:-/var/run/docker.sock}:/var/run/docker.sock:ro
38+
39+
whoami:
40+
image: traefik/whoami
41+
labels:
42+
- "traefik.enable=true"
43+
- "traefik.http.routers.whoami.rule=PathRegexp(`^/whoami(/|$)`)"

compose.prod.yml

Lines changed: 5 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,38 +1,9 @@
1-
version: "3.8"
1+
name: zwop
22

3-
networks:
4-
proxy:
5-
external: true
3+
include:
4+
- compose.staging.yml
65

76
services:
87
server:
9-
image: ${IMAGE:-ghcr.io/european-xfel/zulip-write-only-proxy}:${TAG:?error}
10-
volumes:
11-
- ./config:/app/config
12-
env_file:
13-
- .env
14-
environment:
15-
- ZWOP_PROXY_ROOT=/zwop
16-
networks:
17-
- proxy
18-
labels:
19-
- "traefik.enable=true"
20-
- "traefik.docker.network=proxy"
21-
- "traefik.http.middlewares.zwop.stripprefix.forceSlash=false"
22-
- "traefik.http.middlewares.zwop.stripprefix.prefixes=/zwop"
23-
- "traefik.http.routers.zwop.middlewares=zwop"
24-
- "traefik.http.routers.zwop.rule=Host(`exfldadev01.desy.de`) && PathPrefix(`/zwop{slash:(/|$)}`)"
25-
- "traefik.http.services.zwop.loadbalancer.server.port=8000"
26-
command: ["poe", "prod"]
27-
deploy:
28-
update_config:
29-
parallelism: 1
30-
delay: 10s
31-
failure_action: rollback
32-
order: start-first
33-
monitor: 10s
34-
max_failure_ratio: 0
35-
restart_policy:
36-
condition: any
37-
delay: 5s
38-
window: 120s
8+
image: ghcr.io/european-xfel/zulip-write-only-proxy:stable
9+
pull_policy: "every_10m"

compose.staging.yml

Lines changed: 7 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,17 @@
1-
version: "3.8"
1+
name: zwop-staging
2+
3+
include:
4+
- compose.yml
25

36
networks:
47
proxy:
58
external: true
69

710
services:
811
server:
9-
image: zwop:staging
10-
volumes:
11-
- ./config:/app/config
12-
env_file:
13-
- .env
12+
build: .
1413
environment:
15-
- ZWOP_PROXY_ROOT=/zwop-staging
16-
- ZWOP_TOKEN_WRITER__ZWOP_URL=https://exfldadev01.desy.de/zwop-staging
14+
- "ZWOP_TOKEN_WRITER__ZWOP_URL=https://exfldadev01.desy.de/${COMPOSE_PROJECT_NAME}"
1715
networks:
1816
- proxy
19-
labels:
20-
- "traefik.enable=true"
21-
- "traefik.docker.network=proxy"
22-
- "traefik.http.middlewares.zwop-staging.stripprefix.forceSlash=false"
23-
- "traefik.http.middlewares.zwop-staging.stripprefix.prefixes=/zwop-staging"
24-
- "traefik.http.routers.zwop-staging.middlewares=zwop-staging"
25-
- "traefik.http.routers.zwop-staging.rule=Host(`exfldadev01.desy.de`) && PathPrefix(`/zwop-staging{slash:(/|$)}`)"
26-
- "traefik.http.services.zwop-staging.loadbalancer.server.port=8000"
27-
command: ["poe", "staging"]
28-
deploy:
29-
restart_policy:
30-
condition: any
31-
delay: 5s
32-
window: 120s
33-
17+
restart: unless-stopped

compose.yml

Lines changed: 9 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1,46 +1,17 @@
1-
version: "3.8"
2-
31
services:
42
server:
53
build: .
64
volumes:
7-
- ./config:/app/config
5+
- ./config:/config
86
env_file:
97
- .env
108
environment:
11-
- ZWOP_PROXY_ROOT=/zwop
9+
- "ZWOP_PROXY_ROOT=/${COMPOSE_PROJECT_NAME}"
10+
- "ZWOP_PROXY_HEADERS=true"
11+
- "ZWOP_FORWARDED_ALLOW_IPS=*"
1212
labels:
13-
traefik.enable: true
14-
traefik.http.middlewares.zwop-dev.stripprefix.forceSlash: false
15-
traefik.http.middlewares.zwop-dev.stripprefix.prefixes: /zwop
16-
traefik.http.routers.zwop-dev.middlewares: zwop-dev
17-
traefik.http.routers.zwop-dev.rule: PathPrefix(`/zwop{slash:(/|$)}`)
18-
traefik.http.services.zwop-dev.loadbalancer.server.port: 8000
19-
develop:
20-
watch:
21-
- action: sync
22-
path: ./src/zulip_write_only_proxy
23-
target: /app/src/zulip_write_only_proxy
24-
ignore:
25-
- node_modules/
26-
- action: sync+restart
27-
path: ./compose.yml
28-
target: /app/compose.yml
29-
- action: sync+restart
30-
path: ./src/zulip_write_only_proxy/main.py
31-
target: /app/src/zulip_write_only_proxy/main.py
32-
ports:
33-
- 5678:5678
34-
35-
traefik:
36-
image: "traefik:v2.10"
37-
command:
38-
- "--api.insecure=true"
39-
- "--providers.docker=true"
40-
- "--providers.docker.exposedbydefault=false"
41-
- "--entrypoints.web.address=:8000"
42-
ports:
43-
- 8000:8000
44-
- 8080:8080
45-
volumes:
46-
- "/var/run/docker.sock:/var/run/docker.sock:ro"
13+
- "traefik.enable=true"
14+
- "traefik.http.middlewares.${COMPOSE_PROJECT_NAME}-stripprefix.stripprefix.prefixes=/${COMPOSE_PROJECT_NAME}"
15+
- "traefik.http.routers.${COMPOSE_PROJECT_NAME}.middlewares=${COMPOSE_PROJECT_NAME}-stripprefix"
16+
- "traefik.http.routers.${COMPOSE_PROJECT_NAME}.rule=PathRegexp(`^/${COMPOSE_PROJECT_NAME}(/|$)`)"
17+
- "traefik.http.services.${COMPOSE_PROJECT_NAME}.loadbalancer.server.port=8000"

0 commit comments

Comments
 (0)