Skip to content

Commit 308a61c

Browse files
committed
chore: pin tag and update fixtures
1 parent 453ac49 commit 308a61c

11 files changed

Lines changed: 279 additions & 289 deletions

.github/workflows/deploy-pretalx-digitalocean.yml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ on:
66
target_environment:
77
description: GitHub deployment environment name
88
required: true
9-
default: pretalx-test
9+
default: pretalx-prod
1010
pretalx_site_url:
1111
description: Public Pretalx base URL
1212
required: false
@@ -26,7 +26,7 @@ jobs:
2626
deploy:
2727
runs-on: ubuntu-latest
2828
environment:
29-
name: ${{ github.event.inputs.target_environment || 'pretalx-test' }}
29+
name: ${{ github.event.inputs.target_environment || 'pretalx-prod' }}
3030
url: ${{ steps.deployment-url.outputs.url }}
3131
steps:
3232
- name: Checkout
@@ -103,7 +103,7 @@ jobs:
103103
PRETALX_REMOTE_PATH: ${{ vars.PRETALX_REMOTE_PATH || '/opt/asyncapi-pretalx' }}
104104
POSTGRES_PASSWORD: ${{ secrets.POSTGRES_PASSWORD }}
105105
PRETALX_HTTP_PORT: ${{ vars.PRETALX_HTTP_PORT || '8346' }}
106-
PRETALX_IMAGE_TAG: ${{ vars.PRETALX_IMAGE_TAG || 'latest' }}
106+
PRETALX_IMAGE_TAG: ${{ vars.PRETALX_IMAGE_TAG || 'v2026.1.2' }}
107107
PRETALX_FILE_UPLOAD_LIMIT: ${{ vars.PRETALX_FILE_UPLOAD_LIMIT || '2' }}
108108
GUNICORN_FORWARDED_ALLOW_IPS: ${{ vars.GUNICORN_FORWARDED_ALLOW_IPS || '127.0.0.1' }}
109109
run: |

.github/workflows/sync-pretalx-schedule.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ jobs:
4343
commit-message: "chore: sync pretalx schedule"
4444
title: Sync Pretalx schedule
4545
body: |
46-
Syncs public Pretalx events, released schedule slots, and speaker data into generated website JSON config.
46+
Syncs public Pretalx events, location metadata, city images, released schedule slots, and speaker data into generated website JSON config.
4747
Private submissions and review data are not fetched by this workflow.
4848
add-paths: |
4949
config/pretalx/agenda.json

deploy/pretalx/.env.example

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
POSTGRES_PASSWORD=change-me-for-local
22
PRETALX_HTTP_PORT=8346
3-
PRETALX_IMAGE_TAG=latest
3+
PRETALX_IMAGE_TAG=v2026.1.2
44
PRETALX_FILE_UPLOAD_LIMIT=2
55
GUNICORN_FORWARDED_ALLOW_IPS=127.0.0.1

deploy/pretalx/Dockerfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
ARG PRETALX_IMAGE_TAG=latest
1+
ARG PRETALX_IMAGE_TAG=v2026.1.2
22
FROM pretalx/standalone:${PRETALX_IMAGE_TAG}
33

44
USER root

deploy/pretalx/README.md

Lines changed: 30 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,15 @@ This directory contains the Pretalx deployment files used by the GitHub Actions
77
- `DO_SSH_HOST`
88
- `DO_SSH_USER`
99
- `DO_SSH_PRIVATE_KEY`
10-
- `PRETALX_SITE_URL` such as `https://your-test-droplet.example.com`
1110
- `POSTGRES_PASSWORD`
1211
- `PRETALX_ADMIN_EMAIL`
1312
- `PRETALX_MAIL_FROM`
1413
- `PRETALX_MAIL_HOST`
1514
- `PRETALX_MAIL_PORT`
1615
- `PRETALX_MAIL_USER`
1716
- `PRETALX_MAIL_PASSWORD`
18-
- `PRETALX_API_TOKEN`
17+
18+
The sync workflow also needs `PRETALX_API_TOKEN`.
1919

2020
For Mailjet, use:
2121

@@ -30,13 +30,21 @@ PRETALX_MAIL_PASSWORD=<mailjet-secret-key>
3030
## Optional GitHub Variables
3131

3232
- `DO_SSH_PORT`, defaults to `22`
33+
- `PRETALX_SITE_URL`, defaults to the workflow input or `https://pretalx.asyncapi.com`
3334
- `PRETALX_REMOTE_PATH`, defaults to `/opt/asyncapi-pretalx`
3435
- `PRETALX_HTTP_PORT`, defaults to `8346`
35-
- `PRETALX_IMAGE_TAG`, defaults to `latest`
36+
- `PRETALX_IMAGE_TAG`, defaults to `v2026.1.2`
37+
- `PRETALX_FILE_UPLOAD_LIMIT`, defaults to `2`
3638
- `PRETALX_MAIL_TLS`, defaults to `True`
3739
- `PRETALX_MAIL_SSL`, defaults to `False`
3840
- `GUNICORN_FORWARDED_ALLOW_IPS`, defaults to `127.0.0.1`
3941

42+
Only the Pretalx image is configurable through `PRETALX_IMAGE_TAG`. The supporting nginx, Postgres, Redis, and local Mailpit images stay defined directly in Compose so deploy configuration does not grow extra tag knobs.
43+
44+
## Uploaded Media
45+
46+
Pretalx writes media and static files to the shared `pretalx-public` volume under `/public`. The compose stack publishes the nginx container, not the Pretalx app container, so URLs such as `/media/avatars/...webp` and `/static/...` are served directly from that volume. `PRETALX_FILE_UPLOAD_LIMIT` defaults to `2` MB, and both nginx configs allow `3m` request bodies to leave room for multipart upload overhead.
47+
4048
## Production URL
4149

4250
Keep production disabled in website env until DNS and the production droplet are ready:
@@ -61,12 +69,12 @@ docker compose exec pretalx pretalx init
6169

6270
5. Configure the event, CFP fields, deadlines, review workflow, and schedule release in Pretalx.
6371
6. Enable the `AsyncAPI CFP API` plugin for each event.
64-
7. Open `Event settings -> Plugins -> AsyncAPI CFP API -> Location metadata` and fill in the event city, country, address, and map URL. Saving this form also writes a managed `Location` section into Pretalx's public event landing page text. If metadata was saved before this behavior existed, save the form once again after rebuilding the image.
72+
7. Open `Event settings -> Plugins -> AsyncAPI CFP API -> Location metadata` and fill in the event city, country, address, map URL, and image URL. Saving this form also writes a managed `Location` section into Pretalx's public event landing page text. If metadata was saved before this behavior existed, save the form once again after rebuilding the image.
6573

6674
If you need to seed or repair the metadata from the droplet shell, write the same values directly:
6775

6876
```bash
69-
docker compose --env-file .env exec -T pretalx python -m pretalx shell --event=asyncapi-india-2026 -c 'from pretalx.event.models import Event; e=Event.objects.get(slug="asyncapi-india-2026"); e.display_settings["asyncapi_location"]={"city":"Bangalore","country":"India","address":"NIMHANS Convention Centre, Bangalore","map_url":"https://maps.example.com/bangalore"}; e.save(); print(e.display_settings["asyncapi_location"])'
77+
docker compose --env-file .env exec -T pretalx python -m pretalx shell --event=asyncapi-india-2026 -c 'from pretalx.event.models import Event; e=Event.objects.get(slug="asyncapi-india-2026"); e.display_settings["asyncapi_location"]={"city":"Bengaluru","country":"India","address":"NIMHANS Convention Centre, Bengaluru","map_url":"https://maps.example.com/bengaluru","image_url":"https://pretalx.example.com/media/event-bengaluru.webp"}; e.save(); print(e.display_settings["asyncapi_location"])'
7078
```
7179

7280
The sync endpoint returns global CFP dates and location metadata at:
@@ -85,7 +93,7 @@ The sync endpoint returns global CFP dates and location metadata at:
8593

8694
The website sync workflow uses the authenticated Pretalx API. It fetches public events from `/api/events/?is_public=true`, enriches them with `/api/events/{event}/p/asyncapi-cfp/event-info/` when the plugin is enabled, then fetches `/api/events/{event}/schedules/latest/` with expanded schedule slots, submissions, speakers, proposal types, and tracks.
8795

88-
The workflow writes generated data to `config/pretalx/city-lists.json`, `config/pretalx/speakers.json`, and `config/pretalx/agenda.json`, then opens a PR. When the plugin endpoint is available, `city-lists.json` includes global CFP deadline, city, country, address, and map URL from Pretalx. Third-party/manual CFP systems remain in `config/third-party/` and are merged into the website by `config/conference-data.ts`.
96+
The workflow writes generated data to `config/pretalx/city-lists.json`, `config/pretalx/speakers.json`, and `config/pretalx/agenda.json`, then opens a PR. When the plugin endpoint is available, `city-lists.json` includes global CFP deadline, city, country, address, map URL, and image URL from Pretalx. Third-party/manual CFP systems remain in `config/third-party/` and are merged into the website by `config/conference-data.ts`.
8997

9098
## Local Mail Testing
9199

@@ -97,6 +105,20 @@ docker compose -f docker-compose.yml -f docker-compose.local.yml --env-file .env
97105

98106
Configure Pretalx with `PRETALX_MAIL_HOST=mailpit`, `PRETALX_MAIL_PORT=1025`, `PRETALX_MAIL_TLS=False`, and `PRETALX_MAIL_SSL=False`. Open captured mail at `http://localhost:8025`.
99107

108+
To test the real Mailjet SMTP path locally, render `conf/pretalx.cfg` with these mail values instead of Mailpit:
109+
110+
```env
111+
PRETALX_MAIL_FROM=cfp@asyncapi.com
112+
PRETALX_MAIL_HOST=in-v3.mailjet.com
113+
PRETALX_MAIL_PORT=2525
114+
PRETALX_MAIL_USER=<mailjet-api-key>
115+
PRETALX_MAIL_PASSWORD=<mailjet-secret-key>
116+
PRETALX_MAIL_TLS=True
117+
PRETALX_MAIL_SSL=False
118+
```
119+
120+
Use a verified Mailjet sender/domain and do not commit the rendered `conf/pretalx.cfg`.
121+
100122
## DigitalOcean Mail
101123

102124
Run Pretalx on DigitalOcean, but do not run outbound mail delivery from the Droplet itself. DigitalOcean blocks Droplet SMTP ports `25`, `465`, and `587`, so use Mailjet as the external SMTP provider and configure the `PRETALX_MAIL_*` secrets for it. Prefer Mailjet port `2525` for the test droplet.
@@ -105,6 +127,6 @@ Kit should stay in the newsletter/broadcast path. Pretalx's built-in email deliv
105127

106128
## GitHub Deployments UI
107129

108-
The deploy workflow uses a GitHub Actions environment named `pretalx-test` by default. GitHub creates deployment status entries for environment jobs and shows them in the repository's Deployments UI with the Pretalx URL.
130+
The deploy workflow uses a GitHub Actions environment named `pretalx-prod` by default. GitHub creates deployment status entries for environment jobs and shows them in the repository's Deployments UI with the Pretalx URL.
109131

110-
When running the workflow manually, you can change `target_environment` to a different value such as `pretalx-prod`.
132+
When running the workflow manually, you can change `target_environment` to a different value such as `pretalx-test`.

deploy/pretalx/docker-compose.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@ services:
44
context: .
55
dockerfile: Dockerfile
66
args:
7-
PRETALX_IMAGE_TAG: ${PRETALX_IMAGE_TAG:-latest}
8-
image: asyncapi-pretalx:${PRETALX_IMAGE_TAG:-latest}
7+
PRETALX_IMAGE_TAG: ${PRETALX_IMAGE_TAG:-v2026.1.2}
8+
image: asyncapi-pretalx:${PRETALX_IMAGE_TAG:-v2026.1.2}
99
container_name: pretalx
1010
restart: unless-stopped
1111
depends_on:

example.env.local

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
NEXT_PUBLIC_PRETALX_BASE_URL="https://cfp.asyncapi.com"
2-
# NEXT_PUBLIC_PRETALX_BASE_URL="https://cfp.asyncapi.com"
1+
NEXT_PUBLIC_PRETALX_BASE_URL="http://localhost:8346"
2+
# Production: NEXT_PUBLIC_PRETALX_BASE_URL="https://cfp.asyncapi.com"
33
NEXT_PUBLIC_PRETALX_CFP_PATH="cfp"
44

55
# Conference registration (2026) via Supabase
Lines changed: 50 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -1,55 +1,52 @@
1-
{
2-
"count": 3,
3-
"next": null,
4-
"previous": null,
5-
"results": [
6-
{
7-
"name": {
8-
"en": "AsyncAPI Online 2026"
9-
},
10-
"slug": "asyncapi-online-2026",
11-
"is_public": true,
12-
"date_from": "2026-10-28T10:00:00Z",
13-
"date_to": null,
14-
"timezone": "UTC",
15-
"urls": {
16-
"base": "https://pretalx.test/asyncapi-online-2026/",
17-
"schedule": "https://pretalx.test/asyncapi-online-2026/schedule/",
18-
"login": "https://pretalx.test/asyncapi-online-2026/login/",
19-
"feed": "https://pretalx.test/asyncapi-online-2026/schedule/feed.xml"
20-
}
1+
[
2+
{
3+
"name": {
4+
"en": "AsyncAPI Conf Europe 2026"
215
},
22-
{
23-
"name": {
24-
"en": "Internal Draft Event"
25-
},
26-
"slug": "internal-draft-event",
27-
"is_public": false,
28-
"date_from": "2026-08-01T10:00:00Z",
29-
"date_to": null,
30-
"timezone": "UTC",
31-
"urls": {
32-
"base": "https://pretalx.test/internal-draft-event/",
33-
"schedule": "https://pretalx.test/internal-draft-event/schedule/",
34-
"login": "https://pretalx.test/internal-draft-event/login/",
35-
"feed": "https://pretalx.test/internal-draft-event/schedule/feed.xml"
36-
}
6+
"slug": "asyncapi-europe-2026",
7+
"is_public": true,
8+
"date_from": "2026-11-05",
9+
"date_to": "2026-11-06",
10+
"timezone": "Europe/Amsterdam"
11+
},
12+
{
13+
"name": {
14+
"en": "AsyncAPI Conf Online 2026"
3715
},
38-
{
39-
"name": {
40-
"en": "Unmatched Public Event"
41-
},
42-
"slug": "unmatched-public-event",
43-
"is_public": true,
44-
"date_from": "2026-11-01T10:00:00Z",
45-
"date_to": null,
46-
"timezone": "UTC",
47-
"urls": {
48-
"base": "https://pretalx.test/unmatched-public-event/",
49-
"schedule": "https://pretalx.test/unmatched-public-event/schedule/",
50-
"login": "https://pretalx.test/unmatched-public-event/login/",
51-
"feed": "https://pretalx.test/unmatched-public-event/schedule/feed.xml"
52-
}
53-
}
54-
]
55-
}
16+
"slug": "asyncapi-online-2026",
17+
"is_public": true,
18+
"date_from": "2026-10-28",
19+
"date_to": "2026-10-28",
20+
"timezone": "UTC"
21+
},
22+
{
23+
"name": {
24+
"en": "AsyncAPI Conf India 2026"
25+
},
26+
"slug": "asyncapi-india-2026",
27+
"is_public": true,
28+
"date_from": "2026-08-22",
29+
"date_to": "2026-08-23",
30+
"timezone": "Asia/Kolkata"
31+
},
32+
{
33+
"name": {
34+
"en": "AsyncAPI US Conf"
35+
},
36+
"slug": "asyncapi-us-conf-2026",
37+
"is_public": true,
38+
"date_from": "2026-06-17",
39+
"date_to": "2026-06-20",
40+
"timezone": "UTC"
41+
},
42+
{
43+
"name": {
44+
"en": "DemoConf"
45+
},
46+
"slug": "democonf",
47+
"is_public": true,
48+
"date_from": "2026-06-02",
49+
"date_to": "2026-06-04",
50+
"timezone": "Europe/Berlin"
51+
}
52+
]
Lines changed: 39 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -1,85 +1,53 @@
11
{
2-
"id": 1,
3-
"version": "1.0",
4-
"published": "2026-10-01T09:00:00Z",
2+
"id": 9,
3+
"version": "0.1",
4+
"published": "2026-06-05T13:46:52.667931Z",
5+
"comment": {
6+
"en": "We released our first schedule!"
7+
},
58
"slots": [
69
{
7-
"id": 101,
8-
"start": "2026-10-28T10:00:00Z",
9-
"end": "2026-10-28T10:30:00Z",
10-
"room": {
11-
"id": 1,
12-
"name": {
13-
"en": "Main Stage"
14-
}
15-
},
10+
"id": 327,
11+
"room": 9,
12+
"start": "2026-06-18T09:30:00Z",
13+
"end": "2026-06-18T10:00:00Z",
1614
"submission": {
17-
"code": "EVT101",
18-
"title": "Designing Event-Driven APIs",
19-
"submission_type": {
20-
"id": 1,
21-
"name": {
22-
"en": "Talk"
23-
}
24-
},
25-
"track": {
26-
"id": 1,
27-
"name": {
28-
"en": "API Design"
29-
}
30-
},
31-
"state": "confirmed",
15+
"code": "FN7M8A",
16+
"title": "Test Proposal",
3217
"speakers": [
3318
{
34-
"code": "ALICE",
35-
"name": "Alice Example",
36-
"biography": "Principal engineer",
37-
"avatar_url": "https://pretalx.test/media/avatars/alice.jpg"
19+
"code": "EMTVZL",
20+
"name": "Thulie Sibasanda",
21+
"biography": "Hello this is a test bio.",
22+
"submissions": [],
23+
"avatar_url": "http://localhost:8346/media/avatars/GUKSGV_ASOxI1D.webp",
24+
"answers": []
3825
}
39-
]
40-
}
41-
},
42-
{
43-
"id": 102,
44-
"start": "2026-10-28T11:00:00Z",
45-
"end": "2026-10-28T11:45:00Z",
46-
"room": {
47-
"id": 1,
48-
"name": {
49-
"en": "Main Stage"
50-
}
51-
},
52-
"submission": {
53-
"code": "EVT102",
54-
"title": "Operating AsyncAPI at Scale",
26+
],
5527
"submission_type": {
56-
"id": 2,
28+
"id": 9,
5729
"name": {
58-
"en": "Workshop"
59-
}
60-
},
61-
"track": {
62-
"id": 2,
63-
"name": {
64-
"en": "Operations"
65-
}
30+
"en": "Talk"
31+
},
32+
"default_duration": 30,
33+
"deadline": null,
34+
"requires_access_code": false
6635
},
36+
"track": null,
37+
"tags": [],
6738
"state": "confirmed",
68-
"speakers": [
69-
{
70-
"code": "BOB",
71-
"name": "Bob Example",
72-
"biography": "Developer advocate",
73-
"avatar_url": null
74-
},
75-
{
76-
"code": "CASEY",
77-
"name": "Casey Example",
78-
"biography": "",
79-
"avatar_url": "https://pretalx.test/media/avatars/casey.jpg"
80-
}
81-
]
82-
}
39+
"abstract": "Test abstract",
40+
"description": "",
41+
"duration": 30,
42+
"slot_count": 1,
43+
"content_locale": "en",
44+
"do_not_record": false,
45+
"image": "http://localhost:8346/media/asyncapi-us-conf-2026/submissions/FN7M8A/image_MfasF2T.webp",
46+
"resources": [],
47+
"answers": []
48+
},
49+
"description": null,
50+
"duration": 30
8351
}
8452
]
8553
}

0 commit comments

Comments
 (0)