Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,8 @@ The project documentation remains in the
Both carry `hreflang` alternates and a language switch; the layout picks its few
interface strings from the page's `lang`. A content change to one page belongs in
the other in the same change. `check_site.rb` fails if the German page, its
alternates or its search terms go missing.
alternates or its search terms go missing, and if either page or `llms.txt`
loses the stack section (the terms are listed in `STACK` in that script).

## Local verification

Expand Down
12 changes: 12 additions & 0 deletions de/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,18 @@ an ein geschlossenes Produkt anzupassen.
</li>
</ul>

## Worauf es läuft

Ein selbst gehosteter E-Commerce-Stack aus bewährten Open-Source-Bausteinen, gestartet
mit Docker Compose:

- **Backend:** Python und FastAPI, mit asynchronem SQLAlchemy auf PostgreSQL und Redis für Hintergrundjobs.
- **Storefront und Backoffice:** Angular, angebunden über die API. Es ist headless, du kannst also dein eigenes Frontend mitbringen.
- **Konten:** Keycloak-Single-Sign-on für Kundschaft und Team.
- **Zahlung und Versand:** Stripe für Zahlungen, DHL für den Versand.
- **Dokumente und Dateien:** Paperless-ngx für Buchhaltungsbelege, MinIO als S3-kompatibler Speicher.
- **Betrieb:** Prometheus, Grafana und OpenTelemetry.

## So fängst du an

<div class="callout">
Expand Down
12 changes: 12 additions & 0 deletions index.md
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,18 @@ product.
</li>
</ul>

## What it runs on

A self-hosted e-commerce stack built from well-known open-source parts, started with
Docker Compose:

- **Backend:** Python and FastAPI, with async SQLAlchemy on PostgreSQL and Redis for background jobs.
- **Storefront and back office:** Angular, talking to the API. It is headless, so you can bring your own frontend.
- **Accounts:** Keycloak single sign-on for customers and staff.
- **Payment and shipping:** Stripe for payments, DHL for shipping.
- **Documents and files:** Paperless-ngx for accounting documents, MinIO as S3-compatible storage.
- **Operations:** Prometheus, Grafana and OpenTelemetry.

## How to start

<div class="callout">
Expand Down
10 changes: 10 additions & 0 deletions llms.txt
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,16 @@ A German version of the website is at {{ site.url }}/de/.
- [admin_frontend](https://github.com/OpenTaberna/admin_frontend): Role-protected back office for products, inventory, orders and returns.
- [wiki](https://github.com/OpenTaberna/wiki): Source-controlled documentation for setup, architecture and operation.

## Stack

- Backend: Python, FastAPI, async SQLAlchemy, PostgreSQL, Redis for background jobs.
- Storefront and back office: Angular (headless; any frontend can use the API).
- Accounts: Keycloak single sign-on.
- Payment and shipping: Stripe, DHL.
- Documents and files: Paperless-ngx, MinIO (S3-compatible).
- Operations: Prometheus, Grafana, OpenTelemetry.
- Deployment: self-hosted with Docker Compose.

## Documentation

The [OpenTaberna wiki](https://wiki.opentaberna.de) is the project's documentation site and single source of truth. Begin with the [Getting Started guide](https://github.com/OpenTaberna/wiki/blob/main/Getting-Started.md). This website deliberately does not duplicate those instructions.
Expand Down
13 changes: 13 additions & 0 deletions scripts/check_site.rb
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,18 @@ def internal_target(reference)
fail!("#{path}: has lost the language switch to #{expected[:switch]}") unless html.match?(/<a class="[^"]*\blang-switch\b[^"]*"[^>]*href="#{Regexp.escape(expected[:switch])}"/)
end

STACK = [
"FastAPI", "PostgreSQL", "Redis", "Keycloak", "Angular", "Stripe", "DHL",
"Paperless-ngx", "MinIO", "Prometheus", "Grafana", "OpenTelemetry", "Docker Compose",
].freeze
{ "index.html" => "What it runs on", "de/index.html" => "Worauf es läuft", "llms.txt" => "## Stack" }.each do |path, heading|
text = read(path)
next unless text

fail!("#{path}: has lost the #{heading.inspect} section") unless text.include?(heading)
STACK.each { |term| fail!("#{path}: stack section has lost #{term.inspect}") unless text.include?(term) }
end

german = read("de/index.html")
if german
h1 = german[%r{<h1[^>]*>(.*?)</h1>}m, 1].to_s.downcase
Expand Down Expand Up @@ -170,6 +182,7 @@ def internal_target(reference)
sections = [
"What OpenTaberna is",
"What it is made of",
"What it runs on",
"How to start",
"Licence and intent",
"Founders",
Expand Down
Loading