mirror of
https://github.com/andwati/zitadel.git
synced 2026-10-22 23:42:16 +00:00
## Todos for release - [x] Configure Env in docs project on vercel - [x] Configure Root Path in the docs project on vercel - [ ] Remove old CSP https://github.com/zitadel/website/pull/1592 ## What we did This pull request migrates the project documentation from the old `docs/` directory to the new `apps/docs/` directory, introduces a new documentation system built with Next.js and Fumadocs, and updates all relevant references, configuration files, and documentation to reflect this change. It also adds new configuration and ignore files for the new documentation app, updates CI and linting to exclude the new docs from certain checks, and revises the contributing guidelines accordingly. **Documentation System Migration and New Docs App** * Migrated all documentation from `docs/` to `apps/docs/`, and updated all references in `README.md`, `CONTRIBUTING.md`, and other files to point to the new location. [[1]](diffhunk://#diff-eca12c0a30e25b4b46522ebf89465a03ba72a03f540796c979137931d8f92055L585-L640) [[2]](diffhunk://#diff-eca12c0a30e25b4b46522ebf89465a03ba72a03f540796c979137931d8f92055L660-R607) [[3]](diffhunk://#diff-eca12c0a30e25b4b46522ebf89465a03ba72a03f540796c979137931d8f92055L740-R687) [[4]](diffhunk://#diff-b335630551682c19a781afebcf4d07bf978fb1f8ac04c6bf87428ed5106870f5L2-R3) [[5]](diffhunk://#diff-b335630551682c19a781afebcf4d07bf978fb1f8ac04c6bf87428ed5106870f5L30-R30) * Added a new Next.js/Fumadocs-based documentation app under `apps/docs/`, including core app files, layouts, routing, search API, and a comprehensive `README.md` with development and contribution instructions. [[1]](diffhunk://#diff-5a1b07344a2c1b4d3f37b23ff1388b62cd9f57dea3c1cd23d8a0412b7602b132R1-R74) [[2]](diffhunk://#diff-462b9ad1eabbb7d1c29bb9c36e4931eb180fd7190900e6d2babf8f4d66ad1c28R1-R39) [[3]](diffhunk://#diff-e16ae25660ded787b10ac35dea96d5ecaacf895dae0afc8a9bd4382dc79a8c87R1-R7) [apps/docs/app/[[...slug]]/layout.tsxR1-R81](diffhunk://#diff-59e08acde4e805b7aeccef1dcf98f1d71dfc550777e6b9402085cee0e9fa4e0aR1-R81), [apps/docs/app/[[...slug]]/page.tsxR1-R79](diffhunk://#diff-e5df3f80d0fa01e12d63d81f29c57a9d14e846c78fd3beabb2ef768e38fd9580R1-R79), [[4]](diffhunk://#diff-389b34918e040cacaa87cd7201ffa462cc2b0b716736f537e3d3c660ac69353bR1-R7) [[5]](diffhunk://#diff-d3b03416d1c457b19f1c27b26f2db741412df841b875c26ccadc36e4522247f4R1-R29) [[6]](diffhunk://#diff-c8fb8339570a5305809be7c618e14705fd86390dc278e6ce8ba224a7bc8b0c3cR1-R25) **Configuration and Tooling Updates** * Updated `.github/workflows/codeql.yml`, `.golangci.yaml`, and `.github/dependabot.yml` to properly handle the new docs app: excluded `apps/docs` from certain checks, added npm dependency updates for the docs app, and excluded generated content. [[1]](diffhunk://#diff-12783128521e452af0cfac94b99b8d250413c516ec71fe6d97dbea666ff7ba27L8-R14) [[2]](diffhunk://#diff-9917ddc9f1c3304218f7269265b746d997c5c0615478177b5fceecd33ef47cb5R5-R6) [[3]](diffhunk://#diff-9917ddc9f1c3304218f7269265b746d997c5c0615478177b5fceecd33ef47cb5R126-R129) [[4]](diffhunk://#diff-dd4fbda47e51f1e35defb9275a9cd9c212ecde0b870cba89ddaaae65c5f3cd28R89-R106) * Updated `.devcontainer/devcontainer.json` to use the latest Go 1.25.3 version for consistency. **Licensing and Miscellaneous** * Added `apps/docs/` to the list of licensed directories in `LICENSING.md`. These changes ensure the documentation is now maintained in a modern, scalable system and all project tooling is updated to support the new structure. --------- Co-authored-by: Federico Coppede <[email protected]>
104 lines
3.3 KiB
Plaintext
104 lines
3.3 KiB
Plaintext
---
|
|
title: Technical Advisory 10016
|
|
---
|
|
|
|
## Date
|
|
|
|
- v2.65.x: > v2.65.9
|
|
- v2.66.x > v2.66.17
|
|
- v2.67.x > v2.67.14
|
|
- v2.68.x > v2.68.10
|
|
- v2.69.x > v2.69.10
|
|
- v2.70.x > v2.70.11
|
|
- v2.71.x > v2.71.10
|
|
- v3.x > v3.2.1
|
|
|
|
Date: 2025-05-14
|
|
|
|
Last updated: 2025-05-19
|
|
|
|
## Description
|
|
|
|
### Background
|
|
|
|
Zitadel uses a eventstore table as main source of truth for state changes.
|
|
Projections are tables which provide alternative views of state, which are built using events.
|
|
In order to know which events are reduced into projections, we use a `position` column in the eventstore and a dedicated table which records the current state.
|
|
|
|
### Problem
|
|
|
|
Zitadel prior to the listed version had a precision bug. The `position` column uses a fixed-point numeric type. In Zitadel's Go code we used a `float64`. In certain cases we noticed a precision loss when Zitadel updated the `current_states` table.
|
|
|
|
## Impact
|
|
|
|
During a past attempt to fix this, we got reports of failing projections inside Zitadel. Because the precision became exact certain compare operations like *equal*, *less then*, etc would now return different results. This was because the values in `current_states` would already have lost precision from a broken version. This might happen to **some** deployments or projections: there is only a small probability.
|
|
|
|
We are releasing the fix again and your system might get affected.
|
|
|
|
- Original issue: [8671](https://github.com/zitadel/zitadel/issues/8671)
|
|
- Follow-up issue: [8863](https://github.com/zitadel/zitadel/issues/8863)
|
|
|
|
## Mitigation
|
|
|
|
When **after** deploying a fixed version and only when experiencing problems described by issue [8863](https://github.com/zitadel/zitadel/issues/8863), the following queries can be executed to fix `current_state` rows which have "broken" values. We recommend doing this in a transaction in order to double-check the affected rows, before committing the update.
|
|
|
|
```sql
|
|
begin;
|
|
|
|
with
|
|
broken as (
|
|
select
|
|
s.projection_name,
|
|
s.instance_id,
|
|
s.aggregate_id,
|
|
s.aggregate_type,
|
|
s.sequence,
|
|
s."position" as old_position,
|
|
e."position" as new_position
|
|
from
|
|
projections.current_states s
|
|
join eventstore.events2 e on s.instance_id = e.instance_id
|
|
and s.aggregate_id = e.aggregate_id
|
|
and s.aggregate_type = e.aggregate_type
|
|
and s.sequence = e.sequence
|
|
and s."position" != e."position"
|
|
where
|
|
s."position" != 0
|
|
and projection_name != 'projections.execution_handler'
|
|
),fixed as (
|
|
update projections.current_states s
|
|
set
|
|
"position" = b.new_position
|
|
from
|
|
broken b
|
|
where
|
|
s.instance_id = b.instance_id
|
|
and s.projection_name = b.projection_name
|
|
and s.aggregate_id = b.aggregate_id
|
|
and s.aggregate_type = b.aggregate_type
|
|
and s.sequence = b.sequence
|
|
returning *
|
|
)
|
|
select
|
|
b.projection_name,
|
|
b.instance_id,
|
|
b.aggregate_id,
|
|
b.aggregate_type,
|
|
b.sequence,
|
|
b.old_position,
|
|
b.new_position,
|
|
b.old_position - b.new_position difference
|
|
from
|
|
broken b;
|
|
```
|
|
|
|
If the output from the above looks reasonable, for example not a huge number in the `difference` column, commit the transaction:
|
|
|
|
```sql
|
|
commit;
|
|
```
|
|
|
|
When there are no rows returned, your system was not affected by precision loss.
|
|
|
|
When there's unexpected output, use `rollback;` instead.
|