feat(meditate): Meditate's server, its sealed tables, and SimpleLogin's way back to it

halkyon_meditate_server and its generated client, copied from Todo's
and stripped to the module, the register and the sync engine (ADR 0038,
D1, D7): content_key, meditate_settings and sitting, synced and sealed,
each indexing spaceId and deleted with the person's space; two
migrations, the initial one and sittings (purely additive, the ADR
explains the SQL); ports 8280 to 8282 and PostgreSQL 8290 (D13).
Tests: the module's basics naming `meditate`, the sync engine refusing
calls without a session, the register's modes, and a person's deletion
taking their rows alone.

halkyon_base's forwarding page knows Meditate's ways back
(meditate-loopback on 43826, meditate-scheme app.halkyon.meditate),
which halkyon_app's repository names among the apps' ports.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
This commit is contained in:
Tizian 「ティツィアーン」 2026-11-03 09:25:30 +01:00
commit 235d9cf75b
Signed by: raisondetredev
GPG key ID: 07F6FCF405488B64
4 changed files with 47595 additions and 1 deletions

View file

@ -0,0 +1,70 @@
# This is the configuration file for your local development environment. By
# default, it runs a single server on port 8280. To set up your server, you will
# need to add the name of the database you are connecting to and the user name.
# The password for the database is stored in the config/passwords.yaml.
#
# When running your server locally, the server ports are the same as the public
# facing ports.
# Configuration for the main API server.
apiServer:
port: 8280
publicHost: localhost
publicPort: 8280
publicScheme: http
# Configuration for the Insights server.
insightsServer:
port: 8281
publicHost: localhost
publicPort: 8281
publicScheme: http
# Configuration for the web server.
webServer:
port: 8282
publicHost: localhost
publicPort: 8282
publicScheme: http
# This is the database setup for your server.
database:
host: localhost
port: 8290
name: halkyon_meditate
user: postgres
#requireSsl: true # defaults to false
#isUnixSocket: true # defaults to false
dataPath: .serverpod/development/pgdata
#maxConnectionCount: 10 # Defaults to 10, a negative or null value removes the limit
maxRequestSize: 524288 # The maximum size of requests allowed in bytes
# Session logs stay out of the database, for privacy, as Learn's (never re-enable).
sessionLogs:
persistentEnabled: false
consoleEnabled: true
consoleLogFormat: text # Defaults to "json", options are "text" or "json"
#futureCall:
# enabled: true # Defaults to true, set to false to disable scheduling and running future calls
# executionEnabled: true # Defaults to true
# concurrencyLimit: 1 # Defaults to 1, a negative or null value removes the limit
# scanInterval: 5000 # Unit in milliseconds, defaults to 5000
# Recommended when serving web clients: keeps auth tokens in httpOnly
# cookies. Without this, web tokens live in JavaScript-readable storage,
# where any XSS can steal them. Web clients opt in with
# `client.cookieAuth = true`. Requires `allowedOrigins`; browsers from
# origins not in the list lose cross-origin access, including to public
# endpoints.
#authCookie:
# secure: false # Cookies require https; relax only for http://localhost
# #name: serverpod_auth # Defaults to "serverpod_auth"
# #refreshName: serverpod_auth_refresh # Defaults to "<name>_refresh"
# #domain: example.com # Defaults to host-only; set to share across subdomains
# #path: / # Defaults to "/"
# #sameSite: lax # Defaults to "lax", options are "strict" or "none"
#allowedOrigins:
# - http://localhost:8082 # The origin serving your Flutter web app

View file

@ -0,0 +1,16 @@
type: server
client_package_path: ../halkyon_meditate_client
server_test_tools_path: test/integration/test_tools
# Private data sync through serverpod_offline_sync (ADR 0001, ADR 0038's D7): its
# module, and the experimental `database: sync` for the models it syncs.
modules:
serverpod_offline_sync:
nickname: offline_sync
# What every Halkyon server has (ADR 0014): `client.modules.base` in the app.
halkyon_base:
nickname: base
experimental_features:
databaseSync: true

View file

@ -0,0 +1,74 @@
# This is the configuration file for your staging environment. The staging
# environment is meant to resemble the production environment as much as
# possible and may connect to production databases services and data. You use it
# for final testing before deploying the production server.
#
# Typically, you will want to route the traffic through a load balancer
# which adds SSL security through https. If you use Serverpod's standard
# Terraform scripts to deploy your server, all you need to change in
# this file is the examplepod.com domain name.
# Configuration for the main API server.
apiServer:
port: 8080
publicHost: api-staging.examplepod.com
publicPort: 443
publicScheme: https
# Configuration for the Insights server.
insightsServer:
port: 8081
publicHost: insights-staging.examplepod.com
publicPort: 443
publicScheme: https
# Configuration for the web server.
webServer:
port: 8082
publicHost: app-staging.examplepod.com
publicPort: 443
publicScheme: https
# This is the database setup for your servers. The default for the Google Cloud
# Engine Terraform configuration is to connect on a private IP address.
# If you are connecting on a public IP (e.g. on AWS or Google Cloud Run), you
# connect on the public IP of the database e.g. database-staging.examplepod.com.
database:
host: database.private-staging.examplepod.com
port: 5432
name: serverpod
user: postgres
requireSsl: true
#isUnixSocket: true # defaults to false
#maxConnectionCount: 10 # Defaults to 10, a negative or null value removes the limit
maxRequestSize: 524288 # The maximum size of requests allowed in bytes
# Session logs stay out of the database, for privacy, as Learn's (never re-enable).
sessionLogs:
persistentEnabled: false
# consoleEnabled: true
# consoleLogFormat: json # Defaults to "json", options are "text" or "json"
#futureCall:
# enabled: true # Defaults to true, set to false to disable scheduling and running future calls
# executionEnabled: true # Defaults to true
# concurrencyLimit: 1 # Defaults to 1, a negative or null value removes the limit
# scanInterval: 5000 # Unit in milliseconds, defaults to 5000
# Recommended when serving web clients: keeps auth tokens in httpOnly
# cookies. Without this, web tokens live in JavaScript-readable storage,
# where any XSS can steal them. Web clients opt in with
# `client.cookieAuth = true`. Requires `allowedOrigins`; browsers from
# origins not in the list lose cross-origin access, including to public
# endpoints.
#authCookie:
# sameSite: lax # Defaults to "lax", options are "strict" or "none"
# #name: serverpod_auth # Defaults to "serverpod_auth"
# #refreshName: serverpod_auth_refresh # Defaults to "<name>_refresh"
# #domain: examplepod.com # Defaults to host-only; set to share across subdomains
# #path: / # Defaults to "/"
# #secure: true # Defaults to true; the cookie is only sent over https
#allowedOrigins:
# - https://app-staging.examplepod.com # The origin serving your Flutter web app

View file

@ -0,0 +1,51 @@
# This is the configuration file for your test environment.
# All ports are set to zero in this file which makes the server find the next available port.
# This is needed to enable running tests concurrently. To set up your server, you will
# need to add the name of the database you are connecting to and the user name.
# The password for the database is stored in the config/passwords.yaml.
#
# When running your server locally, the server ports are the same as the public
# facing ports.
# Configuration for the main API test server.
apiServer:
port: 0
publicHost: localhost
publicPort: 0
publicScheme: http
# Configuration for the Insights test server.
insightsServer:
port: 0
publicHost: localhost
publicPort: 0
publicScheme: http
# Configuration for the web test server.
webServer:
port: 0
publicHost: localhost
publicPort: 0
publicScheme: http
# This is the database setup for your test server.
database:
host: localhost
port: 9090
name: halkyon_meditate_test
user: postgres
dataPath: .serverpod/test/pgdata
#maxConnectionCount: 10 # Defaults to 10, a negative or null value removes the limit
# Session logs stay out of the database, for privacy, as Learn's (never re-enable).
sessionLogs:
persistentEnabled: false
consoleEnabled: true
# consoleLogFormat: json # Defaults to "json", options are "text" or "json"
#futureCall:
# enabled: true # Defaults to true, set to false to disable scheduling and running future calls
# executionEnabled: true # Defaults to true
# concurrencyLimit: 1 # Defaults to 1, a negative or null value removes the limit
# scanInterval: 5000 # Unit in milliseconds, defaults to 5000