Converted the website service project into a reusable template.
This commit is contained in:
@@ -0,0 +1,13 @@
|
|||||||
|
# Template root Makefile — bootstrap convenience only.
|
||||||
|
# This file is removed by `Tools/bootstrap` once the template is generated.
|
||||||
|
|
||||||
|
.DEFAULT_GOAL := help
|
||||||
|
|
||||||
|
.PHONY: bootstrap
|
||||||
|
bootstrap: ## Generate a concrete website from this template (interactive)
|
||||||
|
@./Scripts/bootstrap
|
||||||
|
|
||||||
|
.PHONY: help
|
||||||
|
help: ## Show available commands
|
||||||
|
@grep -hE '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) \
|
||||||
|
| awk 'BEGIN {FS = ":.*?## "}; {printf " \033[36m%-12s\033[0m %s\n", $$1, $$2}'
|
||||||
@@ -36,9 +36,9 @@ struct ServiceTests {
|
|||||||
.init(
|
.init(
|
||||||
host: "127.0.0.1",
|
host: "127.0.0.1",
|
||||||
port: 3306,
|
port: 3306,
|
||||||
name: "loud",
|
name: "site",
|
||||||
username: "loud",
|
username: "site",
|
||||||
password: "loud",
|
password: "site",
|
||||||
tls: .off,
|
tls: .off,
|
||||||
maxConnectionsPerEventLoop: 1
|
maxConnectionsPerEventLoop: 1
|
||||||
)
|
)
|
||||||
@@ -126,7 +126,7 @@ private extension ServiceTests {
|
|||||||
try await fluent.migrate()
|
try await fluent.migrate()
|
||||||
|
|
||||||
let repository = ExampleRepository(fluent: fluent)
|
let repository = ExampleRepository(fluent: fluent)
|
||||||
let created = try await repository.create(name: "loud")
|
let created = try await repository.create(name: "site")
|
||||||
|
|
||||||
#expect(try await repository.all().contains(created))
|
#expect(try await repository.all().contains(created))
|
||||||
|
|
||||||
@@ -158,9 +158,9 @@ private let mysqlDriver: Persistence.Driver? = {
|
|||||||
.init(
|
.init(
|
||||||
host: host,
|
host: host,
|
||||||
port: environment["MYSQL_TEST_PORT"].flatMap(Int.init) ?? 3306,
|
port: environment["MYSQL_TEST_PORT"].flatMap(Int.init) ?? 3306,
|
||||||
name: environment["MYSQL_TEST_NAME"] ?? "loud",
|
name: environment["MYSQL_TEST_NAME"] ?? "site",
|
||||||
username: environment["MYSQL_TEST_USERNAME"] ?? "loud",
|
username: environment["MYSQL_TEST_USERNAME"] ?? "site",
|
||||||
password: environment["MYSQL_TEST_PASSWORD"] ?? "loud",
|
password: environment["MYSQL_TEST_PASSWORD"] ?? "site",
|
||||||
tls: .off,
|
tls: .off,
|
||||||
maxConnectionsPerEventLoop: 2
|
maxConnectionsPerEventLoop: 2
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -0,0 +1,86 @@
|
|||||||
|
# Website Template
|
||||||
|
|
||||||
|
This repository is a **template** for the platform's websites. It ships as a
|
||||||
|
complete, buildable reference site whose identity is the neutral placeholder
|
||||||
|
**`Site`** / **`site`**. You generate a real site from it in two steps:
|
||||||
|
generate a fresh repository, then run the bootstrap script to stamp in your
|
||||||
|
site's name and slug.
|
||||||
|
|
||||||
|
## What's in here
|
||||||
|
|
||||||
|
| Path | Role |
|
||||||
|
| --- | --- |
|
||||||
|
| `Services/Website` | The Hummingbird website service (the engine + placeholder content). |
|
||||||
|
| `Packages/Localization`, `Packages/Persistence` | Reusable packages, **vendored** into every site — each generated repo owns its own copy. |
|
||||||
|
| `Site.xcodeproj` | The umbrella Xcode project (renamed to your site by bootstrap). |
|
||||||
|
| `Scripts/bootstrap` | The generator. Rewrites placeholders, then deletes itself. |
|
||||||
|
|
||||||
|
The engine is intentionally copied into each site rather than shared as a
|
||||||
|
remote dependency: a generated site is fully self-contained and can diverge
|
||||||
|
freely. Engine fixes are propagated to existing sites by hand (or by
|
||||||
|
re-generating and porting content).
|
||||||
|
|
||||||
|
## Generating a new site
|
||||||
|
|
||||||
|
### 1. Create a repository from this template
|
||||||
|
|
||||||
|
On Gitea, mark this repository as a template once (repository **Settings →
|
||||||
|
Template → “Template” checkbox**). New sites are then created with the
|
||||||
|
**“Use this template”** button, which produces a fresh repository with its own
|
||||||
|
history — no template commits carried over.
|
||||||
|
|
||||||
|
> No Gitea button? Just clone this repo, `rm -rf .git`, and continue — the
|
||||||
|
> bootstrap script offers to re-initialise git for you.
|
||||||
|
|
||||||
|
### 2. Bootstrap
|
||||||
|
|
||||||
|
Clone the new repository, then from its root run:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
make bootstrap # or: ./Scripts/bootstrap
|
||||||
|
```
|
||||||
|
|
||||||
|
You'll be asked for:
|
||||||
|
|
||||||
|
| Prompt | Example | Rewrites |
|
||||||
|
| --- | --- | --- |
|
||||||
|
| **Site display name** (PascalCase) | `Loud` | Server name (`LoudWebsite`), `Loud.xcodeproj`, README title. |
|
||||||
|
| **Project slug** (lowercase) | `loud-ams` | Container owner, database name/user, Compose project name. |
|
||||||
|
|
||||||
|
The script rewrites the placeholder occurrences in place, renames
|
||||||
|
`Site.xcodeproj`, optionally starts a fresh git history, and then removes
|
||||||
|
itself along with this file and the root `Makefile`.
|
||||||
|
|
||||||
|
### 3. Fill in the content
|
||||||
|
|
||||||
|
Bootstrap leaves reminders, but in short:
|
||||||
|
|
||||||
|
1. **Copy & localization** — `Services/Website/Sources/Library/Catalogs/Localizable.xcstrings`
|
||||||
|
and the landing / 404 pages under `Services/Website/Sources/Library`.
|
||||||
|
2. **Static assets** — `Services/Website/Resources/Static` (CSS, JS, favicon, icons, manifest).
|
||||||
|
3. **Secrets** — set a real `DATABASE_PASSWORD` in a git-ignored
|
||||||
|
`Services/Website/.env` (the committed `.env.local` is an example only).
|
||||||
|
4. **Domain models** — the `Persistence` package ships a sample
|
||||||
|
`ExampleRecord` / `ExampleRepository`; replace it when you add real data.
|
||||||
|
|
||||||
|
### 4. Build & run
|
||||||
|
|
||||||
|
```sh
|
||||||
|
cd Services/Website
|
||||||
|
make site-run # watch + rebuild
|
||||||
|
# or
|
||||||
|
make site-mount # docker compose up --build
|
||||||
|
```
|
||||||
|
|
||||||
|
## What bootstrap does NOT change
|
||||||
|
|
||||||
|
- Organisation (`Röck+Cöde VoF`) and Xcode `DEVELOPMENT_TEAM` — shared across all sites.
|
||||||
|
- The package architecture, middleware, security headers, and persistence layer.
|
||||||
|
- The generic `website` image name and `Makefile` command names (`site-run`, `site-mount`, …).
|
||||||
|
|
||||||
|
## Maintaining the template itself
|
||||||
|
|
||||||
|
Edit and test the reference site directly — it builds and its tests pass with
|
||||||
|
the `Site` / `site` placeholders in place. Keep the placeholders intact so the
|
||||||
|
bootstrap script's targeted replacements keep matching; if you introduce a new
|
||||||
|
site-specific value, add a matching rewrite line in `Scripts/bootstrap`.
|
||||||
Executable
+159
@@ -0,0 +1,159 @@
|
|||||||
|
#!/usr/bin/env sh
|
||||||
|
#
|
||||||
|
# bootstrap — turn this template into a concrete website.
|
||||||
|
#
|
||||||
|
# The template ships as a fully buildable reference site whose identity is the
|
||||||
|
# neutral placeholder "Site" / "site". This script rewrites those placeholders,
|
||||||
|
# in place, to the values you provide — then removes itself.
|
||||||
|
#
|
||||||
|
# Run once, from the repository root:
|
||||||
|
#
|
||||||
|
# ./Tools/bootstrap
|
||||||
|
#
|
||||||
|
# It is idempotent only in the sense that it self-destructs: once run, the
|
||||||
|
# placeholders are gone and the script (and its scaffolding) are deleted.
|
||||||
|
|
||||||
|
set -eu
|
||||||
|
|
||||||
|
# --- Preconditions ------------------------------------------------------------
|
||||||
|
|
||||||
|
if [ ! -d "Services/Website" ]; then
|
||||||
|
echo "error: run this from the repository root (Services/Website not found)." >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
XCODEPROJ="./Site.xcodeproj"
|
||||||
|
|
||||||
|
# --- Prompts ------------------------------------------------------------------
|
||||||
|
|
||||||
|
printf 'Site display name (PascalCase, e.g. Berlin) [Site]: '
|
||||||
|
read -r NAME
|
||||||
|
NAME="${NAME:-Site}"
|
||||||
|
|
||||||
|
DEFAULT_SLUG="$(printf '%s' "$NAME" | tr '[:upper:]' '[:lower:]')"
|
||||||
|
printf 'Project slug (lowercase, used for owner/db/compose, e.g. loud-berlin) [%s]: ' "$DEFAULT_SLUG"
|
||||||
|
read -r SLUG
|
||||||
|
SLUG="${SLUG:-$DEFAULT_SLUG}"
|
||||||
|
|
||||||
|
echo
|
||||||
|
echo " display name : $NAME (server name \"${NAME}Website\", ${NAME}.xcodeproj)"
|
||||||
|
echo " slug : $SLUG (container owner, database name/user, compose project)"
|
||||||
|
echo
|
||||||
|
printf 'Apply these values? [y/N]: '
|
||||||
|
read -r CONFIRM
|
||||||
|
case "$CONFIRM" in
|
||||||
|
y | Y | yes | YES) ;;
|
||||||
|
*)
|
||||||
|
echo "Aborted. Nothing was changed."
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# --- Helpers ------------------------------------------------------------------
|
||||||
|
|
||||||
|
# Portable in-place sed (works on both BSD/macOS and GNU/Linux).
|
||||||
|
rewrite() {
|
||||||
|
file="$1"
|
||||||
|
shift
|
||||||
|
[ -f "$file" ] || return 0
|
||||||
|
tmp="${file}.bootstrap.tmp"
|
||||||
|
sed "$@" "$file" >"$tmp" && mv "$tmp" "$file"
|
||||||
|
}
|
||||||
|
|
||||||
|
W="Services/Website"
|
||||||
|
|
||||||
|
# --- Rewrites -----------------------------------------------------------------
|
||||||
|
|
||||||
|
# Swift constants: server name + database name/username.
|
||||||
|
rewrite "$W/Sources/Library/Public/Extensions/String+Constants.swift" \
|
||||||
|
-e "s/SiteWebsite/${NAME}Website/g" \
|
||||||
|
-e "s/= \"site\"/= \"${SLUG}\"/g"
|
||||||
|
|
||||||
|
# Local env example.
|
||||||
|
rewrite "$W/.env.local" \
|
||||||
|
-e "s/SiteWebsite/${NAME}Website/g" \
|
||||||
|
-e "s/^HOST_OWNER=site\$/HOST_OWNER=${SLUG}/" \
|
||||||
|
-e "s/^DATABASE_NAME=site\$/DATABASE_NAME=${SLUG}/" \
|
||||||
|
-e "s/^DATABASE_USERNAME=site\$/DATABASE_USERNAME=${SLUG}/" \
|
||||||
|
-e "s/^DATABASE_PASSWORD=site\$/DATABASE_PASSWORD=${SLUG}/"
|
||||||
|
|
||||||
|
# Production compose.
|
||||||
|
rewrite "$W/docker-compose.yml" \
|
||||||
|
-e "s/SiteWebsite/${NAME}Website/g" \
|
||||||
|
-e "s/^name: site-platform\$/name: ${SLUG}-platform/" \
|
||||||
|
-e "s/DATABASE_NAME:-site}/DATABASE_NAME:-${SLUG}}/" \
|
||||||
|
-e "s/DATABASE_USERNAME:-site}/DATABASE_USERNAME:-${SLUG}}/"
|
||||||
|
|
||||||
|
# Local override compose.
|
||||||
|
rewrite "$W/docker-compose.override.yml" \
|
||||||
|
-e "s/HOST_OWNER:-site}/HOST_OWNER:-${SLUG}}/" \
|
||||||
|
-e "s/DATABASE_NAME:-site}/DATABASE_NAME:-${SLUG}}/" \
|
||||||
|
-e "s/DATABASE_USERNAME:-site}/DATABASE_USERNAME:-${SLUG}}/" \
|
||||||
|
-e "s/DATABASE_PASSWORD:-site}/DATABASE_PASSWORD:-${SLUG}}/"
|
||||||
|
|
||||||
|
# Makefile db-shell fallbacks.
|
||||||
|
rewrite "$W/Makefile" \
|
||||||
|
-e "s/),site)/),${SLUG})/g"
|
||||||
|
|
||||||
|
# Service README.
|
||||||
|
rewrite "$W/README.md" \
|
||||||
|
-e "s/^# Site Website\$/# ${NAME} Website/" \
|
||||||
|
-e "s/\*\*Site\*\*/**${NAME}**/" \
|
||||||
|
-e "s/SiteWebsite/${NAME}Website/g" \
|
||||||
|
-e "s/\`site\`/\`${SLUG}\`/g"
|
||||||
|
|
||||||
|
# Xcode project: PBXProject name + directory.
|
||||||
|
if [ -d "$XCODEPROJ" ]; then
|
||||||
|
rewrite "$XCODEPROJ/project.pbxproj" -e "s/\"Site\"/\"${NAME}\"/g"
|
||||||
|
if command -v git >/dev/null 2>&1 && git rev-parse --is-inside-work-tree >/dev/null 2>&1; then
|
||||||
|
git mv "$XCODEPROJ" "./${NAME}.xcodeproj" 2>/dev/null || mv "$XCODEPROJ" "./${NAME}.xcodeproj"
|
||||||
|
else
|
||||||
|
mv "$XCODEPROJ" "./${NAME}.xcodeproj"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# --- Optional: fresh git history ---------------------------------------------
|
||||||
|
|
||||||
|
echo
|
||||||
|
printf 'Start a fresh git history (drops the template history)? [y/N]: '
|
||||||
|
read -r FRESH
|
||||||
|
case "$FRESH" in
|
||||||
|
y | Y | yes | YES)
|
||||||
|
if command -v git >/dev/null 2>&1; then
|
||||||
|
rm -rf .git
|
||||||
|
git init -q
|
||||||
|
echo "Reinitialised git. Remember to add your remote and commit."
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
*) ;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# --- Self-cleanup -------------------------------------------------------------
|
||||||
|
|
||||||
|
rm -f Scripts/bootstrap
|
||||||
|
rmdir Scripts 2>/dev/null || true
|
||||||
|
rm -f Makefile # root convenience Makefile (bootstrap only)
|
||||||
|
rm -f README.md # template usage docs
|
||||||
|
rm -rf .gitea # Gitea template metadata
|
||||||
|
|
||||||
|
# --- Done ---------------------------------------------------------------------
|
||||||
|
|
||||||
|
cat <<EOF
|
||||||
|
|
||||||
|
Done. "${NAME}" (slug "${SLUG}") is ready.
|
||||||
|
|
||||||
|
Next steps:
|
||||||
|
1. Replace the placeholder content:
|
||||||
|
- $W/Sources/Library/Catalogs/Localizable.xcstrings (copy)
|
||||||
|
- $W/Sources/Library (landing / 404 pages)
|
||||||
|
- $W/Resources/Static (css, js, favicon, icons)
|
||||||
|
2. Set a real database password in a git-ignored $W/.env
|
||||||
|
(the committed .env.local defaults the password to the slug — do NOT ship that).
|
||||||
|
3. Point the git remote at your new repository:
|
||||||
|
git remote set-url origin <new-repo-url> # or 'git remote add origin ...'
|
||||||
|
4. Build and run:
|
||||||
|
cd $W && make site-run
|
||||||
|
|
||||||
|
The Persistence package still ships an ExampleRecord / ExampleRepository sample
|
||||||
|
model — replace it with your real domain models when you add persistence.
|
||||||
|
EOF
|
||||||
@@ -12,7 +12,7 @@
|
|||||||
HOST_CONTAINER=containers.rock-n-code.com
|
HOST_CONTAINER=containers.rock-n-code.com
|
||||||
|
|
||||||
# Owner of the container running the Website service.
|
# Owner of the container running the Website service.
|
||||||
HOST_OWNER=loud
|
HOST_OWNER=site
|
||||||
|
|
||||||
# Password for authenticating to the container registry.
|
# Password for authenticating to the container registry.
|
||||||
HOST_PASSWORD=
|
HOST_PASSWORD=
|
||||||
@@ -36,7 +36,7 @@ IMAGE_TAG=latest
|
|||||||
# --- Application config -------------------------------------------------------
|
# --- Application config -------------------------------------------------------
|
||||||
|
|
||||||
# Server name reported by the HTTP service.
|
# Server name reported by the HTTP service.
|
||||||
HTTP_SERVER_NAME=LoudWebsite
|
HTTP_SERVER_NAME=SiteWebsite
|
||||||
|
|
||||||
# Log verbosity: trace | debug | info | notice | warning | error | critical
|
# Log verbosity: trace | debug | info | notice | warning | error | critical
|
||||||
LOG_LEVEL=info
|
LOG_LEVEL=info
|
||||||
@@ -55,13 +55,13 @@ DATABASE_HOST=localhost
|
|||||||
DATABASE_PORT=3306
|
DATABASE_PORT=3306
|
||||||
|
|
||||||
# Name of the database to connect to.
|
# Name of the database to connect to.
|
||||||
DATABASE_NAME=loud-ams
|
DATABASE_NAME=site
|
||||||
|
|
||||||
# Username of the database to connect as.
|
# Username of the database to connect as.
|
||||||
DATABASE_USERNAME=loud-ams
|
DATABASE_USERNAME=site
|
||||||
|
|
||||||
# Provide the real password via the environment or a secret — never commit it.
|
# Provide the real password via the environment or a secret — never commit it.
|
||||||
DATABASE_PASSWORD=loud-ams
|
DATABASE_PASSWORD=site
|
||||||
|
|
||||||
# TLS posture when connecting: off | prefer | require (use `require` in production).
|
# TLS posture when connecting: off | prefer | require (use `require` in production).
|
||||||
DATABASE_TLS=off
|
DATABASE_TLS=off
|
||||||
|
|||||||
@@ -90,9 +90,9 @@ db-shell: ## Open a SQL shell on the local database instance
|
|||||||
--profile database \
|
--profile database \
|
||||||
exec mariadb \
|
exec mariadb \
|
||||||
mariadb \
|
mariadb \
|
||||||
--user=$(or $(DATABASE_USERNAME),loud) \
|
--user=$(or $(DATABASE_USERNAME),site) \
|
||||||
--password=$(or $(DATABASE_PASSWORD),loud) \
|
--password=$(or $(DATABASE_PASSWORD),site) \
|
||||||
$(or $(DATABASE_NAME),loud)
|
$(or $(DATABASE_NAME),site)
|
||||||
|
|
||||||
.PHONY: db-unmount
|
.PHONY: db-unmount
|
||||||
db-unmount: ## Stop and remove the local database instance (keeps the data volume)
|
db-unmount: ## Stop and remove the local database instance (keeps the data volume)
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
# Loud Website
|
# Site Website
|
||||||
The **Loud** public website service — a [Hummingbird](https://github.com/hummingbird-project/hummingbird) server that renders a static landing page and serves the site's static assets.
|
The **Site** public website service — a [Hummingbird](https://github.com/hummingbird-project/hummingbird) server that renders a static landing page and serves the site's static assets.
|
||||||
|
|
||||||
## Overview
|
## Overview
|
||||||
The service:
|
The service:
|
||||||
@@ -73,7 +73,7 @@ A dotted config key maps to an environment variable by upper-casing, splitting c
|
|||||||
| --- | --- | --- | --- |
|
| --- | --- | --- | --- |
|
||||||
| `http.host` | `HTTP_HOST` | _none_ | Host the server binds to. Supplied via the `--http-host` CLI flag (the Docker image passes `0.0.0.0`). |
|
| `http.host` | `HTTP_HOST` | _none_ | Host the server binds to. Supplied via the `--http-host` CLI flag (the Docker image passes `0.0.0.0`). |
|
||||||
| `http.port` | `HTTP_PORT` | _none_ | Port the server listens on. Supplied via the `--http-port` CLI flag (the Docker image passes `8080`). |
|
| `http.port` | `HTTP_PORT` | _none_ | Port the server listens on. Supplied via the `--http-port` CLI flag (the Docker image passes `8080`). |
|
||||||
| `http.serverName` | `HTTP_SERVER_NAME` | `LoudWebsite` | Server name and logger label. |
|
| `http.serverName` | `HTTP_SERVER_NAME` | `SiteWebsite` | Server name and logger label. |
|
||||||
|
|
||||||
### Logging
|
### Logging
|
||||||
| Config key | Environment variable | Default | Description |
|
| Config key | Environment variable | Default | Description |
|
||||||
@@ -87,8 +87,8 @@ A dotted config key maps to an environment variable by upper-casing, splitting c
|
|||||||
| `database.migrate` | `DATABASE_MIGRATE` (flag `--database-migrate`) | `false` | When set, run the migrations and exit instead of serving. |
|
| `database.migrate` | `DATABASE_MIGRATE` (flag `--database-migrate`) | `false` | When set, run the migrations and exit instead of serving. |
|
||||||
| `database.host` | `DATABASE_HOST` | `localhost` | MySQL/MariaDB host. Ignored for `inMemory`. |
|
| `database.host` | `DATABASE_HOST` | `localhost` | MySQL/MariaDB host. Ignored for `inMemory`. |
|
||||||
| `database.port` | `DATABASE_PORT` | `3306` | MySQL/MariaDB port. Ignored for `inMemory`. |
|
| `database.port` | `DATABASE_PORT` | `3306` | MySQL/MariaDB port. Ignored for `inMemory`. |
|
||||||
| `database.name` | `DATABASE_NAME` | `loud` | Database name. Ignored for `inMemory`. |
|
| `database.name` | `DATABASE_NAME` | `site` | Database name. Ignored for `inMemory`. |
|
||||||
| `database.username` | `DATABASE_USERNAME` | `loud` | Database username. Ignored for `inMemory`. |
|
| `database.username` | `DATABASE_USERNAME` | `site` | Database username. Ignored for `inMemory`. |
|
||||||
| `database.password` | `DATABASE_PASSWORD` | _(empty)_ | Database password. Provide via the environment/a secret — never commit it. |
|
| `database.password` | `DATABASE_PASSWORD` | _(empty)_ | Database password. Provide via the environment/a secret — never commit it. |
|
||||||
| `database.tls` | `DATABASE_TLS` | `prefer` | TLS posture when connecting: `off`, `prefer`, or `require`. Ignored for `inMemory`. |
|
| `database.tls` | `DATABASE_TLS` | `prefer` | TLS posture when connecting: `off`, `prefer`, or `require`. Ignored for `inMemory`. |
|
||||||
| `database.pool.maxPerEventLoop` | `DATABASE_POOL_MAX_PER_EVENT_LOOP` | `4` | Maximum pooled connections per event loop. Ignored for `inMemory`. |
|
| `database.pool.maxPerEventLoop` | `DATABASE_POOL_MAX_PER_EVENT_LOOP` | `4` | Maximum pooled connections per event loop. Ignored for `inMemory`. |
|
||||||
@@ -203,7 +203,7 @@ The Makefile and Compose files read these from a `.env` file (or the environment
|
|||||||
| `IMAGE_PLATFORM` | Build platform (e.g. `linux/amd64`). |
|
| `IMAGE_PLATFORM` | Build platform (e.g. `linux/amd64`). |
|
||||||
| `HOST_PORT` | Host port mapped to the container's `8080` (default `8080`). |
|
| `HOST_PORT` | Host port mapped to the container's `8080` (default `8080`). |
|
||||||
| `LOG_LEVEL` | Runtime log level (default `info`). |
|
| `LOG_LEVEL` | Runtime log level (default `info`). |
|
||||||
| `HTTP_SERVER_NAME` | Runtime server name (default `LoudWebsite`). |
|
| `HTTP_SERVER_NAME` | Runtime server name (default `SiteWebsite`). |
|
||||||
| `SECURITY_STRICT_TRANSPORT_SECURITY` | HSTS header value (default `max-age=31536000; includeSubDomains`). |
|
| `SECURITY_STRICT_TRANSPORT_SECURITY` | HSTS header value (default `max-age=31536000; includeSubDomains`). |
|
||||||
| `DATABASE_DRIVER` | `inMemory` (default) or `mysql`. Set to `mysql` in production to use a managed database. |
|
| `DATABASE_DRIVER` | `inMemory` (default) or `mysql`. Set to `mysql` in production to use a managed database. |
|
||||||
| `DATABASE_HOST`, `DATABASE_PORT`, `DATABASE_NAME`, `DATABASE_USERNAME`, `DATABASE_PASSWORD` | MySQL/MariaDB connection (when `DATABASE_DRIVER=mysql`). Provide the password via a secret. |
|
| `DATABASE_HOST`, `DATABASE_PORT`, `DATABASE_NAME`, `DATABASE_USERNAME`, `DATABASE_PASSWORD` | MySQL/MariaDB connection (when `DATABASE_DRIVER=mysql`). Provide the password via a secret. |
|
||||||
|
|||||||
@@ -8,9 +8,9 @@ extension String {
|
|||||||
/// The default MySQL/MariaDB host.
|
/// The default MySQL/MariaDB host.
|
||||||
public static let host = "localhost"
|
public static let host = "localhost"
|
||||||
/// The default database name.
|
/// The default database name.
|
||||||
public static let name = "loud"
|
public static let name = "site"
|
||||||
/// The default database username.
|
/// The default database username.
|
||||||
public static let username = "loud"
|
public static let username = "site"
|
||||||
/// The default TLS posture token.
|
/// The default TLS posture token.
|
||||||
public static let tls = "prefer"
|
public static let tls = "prefer"
|
||||||
/// The TLS token disabling TLS.
|
/// The TLS token disabling TLS.
|
||||||
@@ -47,6 +47,6 @@ extension String {
|
|||||||
/// A namespace for the server string constants.
|
/// A namespace for the server string constants.
|
||||||
public enum Server {
|
public enum Server {
|
||||||
/// The website server's name.
|
/// The website server's name.
|
||||||
public static let name = "LoudWebsite"
|
public static let name = "SiteWebsite"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ services:
|
|||||||
# docker compose --profile database up mariadb
|
# docker compose --profile database up mariadb
|
||||||
mariadb:
|
mariadb:
|
||||||
image: mariadb:11
|
image: mariadb:11
|
||||||
container_name: ${HOST_OWNER:-loud}-db
|
container_name: ${HOST_OWNER:-site}-db
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
profiles:
|
profiles:
|
||||||
- database
|
- database
|
||||||
@@ -34,9 +34,9 @@ services:
|
|||||||
- "127.0.0.1:${DATABASE_PORT:-3306}:3306"
|
- "127.0.0.1:${DATABASE_PORT:-3306}:3306"
|
||||||
environment:
|
environment:
|
||||||
MARIADB_RANDOM_ROOT_PASSWORD: "yes"
|
MARIADB_RANDOM_ROOT_PASSWORD: "yes"
|
||||||
MARIADB_DATABASE: ${DATABASE_NAME:-loud-ams}
|
MARIADB_DATABASE: ${DATABASE_NAME:-site}
|
||||||
MARIADB_USER: ${DATABASE_USERNAME:-loud-ams}
|
MARIADB_USER: ${DATABASE_USERNAME:-site}
|
||||||
MARIADB_PASSWORD: ${DATABASE_PASSWORD:-loud-ams}
|
MARIADB_PASSWORD: ${DATABASE_PASSWORD:-site}
|
||||||
MARIADB_AUTO_UPGRADE: "1"
|
MARIADB_AUTO_UPGRADE: "1"
|
||||||
command:
|
command:
|
||||||
- "--character-set-server=utf8mb4"
|
- "--character-set-server=utf8mb4"
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
name: loud-platform
|
name: site-platform
|
||||||
|
|
||||||
# Production base configuration.
|
# Production base configuration.
|
||||||
# Deploys a pre-built image pulled from a registry — no build step.
|
# Deploys a pre-built image pulled from a registry — no build step.
|
||||||
@@ -19,7 +19,7 @@ services:
|
|||||||
- "${HOST_PORT:-8080}:8080"
|
- "${HOST_PORT:-8080}:8080"
|
||||||
environment:
|
environment:
|
||||||
LOG_LEVEL: ${LOG_LEVEL:-info}
|
LOG_LEVEL: ${LOG_LEVEL:-info}
|
||||||
HTTP_SERVER_NAME: ${HTTP_SERVER_NAME:-LoudWebsite}
|
HTTP_SERVER_NAME: ${HTTP_SERVER_NAME:-SiteWebsite}
|
||||||
SECURITY_STRICT_TRANSPORT_SECURITY: "${SECURITY_STRICT_TRANSPORT_SECURITY:-max-age=31536000; includeSubDomains}"
|
SECURITY_STRICT_TRANSPORT_SECURITY: "${SECURITY_STRICT_TRANSPORT_SECURITY:-max-age=31536000; includeSubDomains}"
|
||||||
# Persistence: in-memory by default; set DATABASE_DRIVER=mysql to run against a
|
# Persistence: in-memory by default; set DATABASE_DRIVER=mysql to run against a
|
||||||
# managed MySQL/MariaDB database. Provide the password via the environment or a
|
# managed MySQL/MariaDB database. Provide the password via the environment or a
|
||||||
@@ -27,7 +27,7 @@ services:
|
|||||||
DATABASE_DRIVER: ${DATABASE_DRIVER:-mysql}
|
DATABASE_DRIVER: ${DATABASE_DRIVER:-mysql}
|
||||||
DATABASE_HOST: ${DATABASE_HOST:-localhost}
|
DATABASE_HOST: ${DATABASE_HOST:-localhost}
|
||||||
DATABASE_PORT: ${DATABASE_PORT:-3306}
|
DATABASE_PORT: ${DATABASE_PORT:-3306}
|
||||||
DATABASE_NAME: ${DATABASE_NAME:-loud-ams}
|
DATABASE_NAME: ${DATABASE_NAME:-site}
|
||||||
DATABASE_USERNAME: ${DATABASE_USERNAME:-loud-ams}
|
DATABASE_USERNAME: ${DATABASE_USERNAME:-site}
|
||||||
DATABASE_PASSWORD: ${DATABASE_PASSWORD:-}
|
DATABASE_PASSWORD: ${DATABASE_PASSWORD:-}
|
||||||
DATABASE_TLS: ${DATABASE_TLS:-require}
|
DATABASE_TLS: ${DATABASE_TLS:-require}
|
||||||
|
|||||||
@@ -44,7 +44,7 @@
|
|||||||
LastUpgradeCheck = 2700;
|
LastUpgradeCheck = 2700;
|
||||||
ORGANIZATIONNAME = "Röck+Cöde VoF";
|
ORGANIZATIONNAME = "Röck+Cöde VoF";
|
||||||
};
|
};
|
||||||
buildConfigurationList = 02642FD42FEEB9A5007FA466 /* Build configuration list for PBXProject "Loud" */;
|
buildConfigurationList = 02642FD42FEEB9A5007FA466 /* Build configuration list for PBXProject "Site" */;
|
||||||
developmentRegion = en;
|
developmentRegion = en;
|
||||||
hasScannedForEncodings = 0;
|
hasScannedForEncodings = 0;
|
||||||
knownRegions = (
|
knownRegions = (
|
||||||
@@ -62,14 +62,14 @@
|
|||||||
/* End PBXProject section */
|
/* End PBXProject section */
|
||||||
|
|
||||||
/* Begin XCBuildConfiguration section */
|
/* Begin XCBuildConfiguration section */
|
||||||
02642FD52FEEB9A5007FA466 /* Debug configuration for PBXProject "Loud" */ = {
|
02642FD52FEEB9A5007FA466 /* Debug configuration for PBXProject "Site" */ = {
|
||||||
isa = XCBuildConfiguration;
|
isa = XCBuildConfiguration;
|
||||||
buildSettings = {
|
buildSettings = {
|
||||||
DEVELOPMENT_TEAM = 7FMNM89WKG;
|
DEVELOPMENT_TEAM = 7FMNM89WKG;
|
||||||
};
|
};
|
||||||
name = Debug;
|
name = Debug;
|
||||||
};
|
};
|
||||||
02642FD62FEEB9A5007FA466 /* Release configuration for PBXProject "Loud" */ = {
|
02642FD62FEEB9A5007FA466 /* Release configuration for PBXProject "Site" */ = {
|
||||||
isa = XCBuildConfiguration;
|
isa = XCBuildConfiguration;
|
||||||
buildSettings = {
|
buildSettings = {
|
||||||
DEVELOPMENT_TEAM = 7FMNM89WKG;
|
DEVELOPMENT_TEAM = 7FMNM89WKG;
|
||||||
@@ -79,11 +79,11 @@
|
|||||||
/* End XCBuildConfiguration section */
|
/* End XCBuildConfiguration section */
|
||||||
|
|
||||||
/* Begin XCConfigurationList section */
|
/* Begin XCConfigurationList section */
|
||||||
02642FD42FEEB9A5007FA466 /* Build configuration list for PBXProject "Loud" */ = {
|
02642FD42FEEB9A5007FA466 /* Build configuration list for PBXProject "Site" */ = {
|
||||||
isa = XCConfigurationList;
|
isa = XCConfigurationList;
|
||||||
buildConfigurations = (
|
buildConfigurations = (
|
||||||
02642FD52FEEB9A5007FA466 /* Debug configuration for PBXProject "Loud" */,
|
02642FD52FEEB9A5007FA466 /* Debug configuration for PBXProject "Site" */,
|
||||||
02642FD62FEEB9A5007FA466 /* Release configuration for PBXProject "Loud" */,
|
02642FD62FEEB9A5007FA466 /* Release configuration for PBXProject "Site" */,
|
||||||
);
|
);
|
||||||
defaultConfigurationName = Release;
|
defaultConfigurationName = Release;
|
||||||
};
|
};
|
||||||
Reference in New Issue
Block a user