Backups and your data
Tiago Águeda edited this page 2026-11-11 16:19:04 +01:00

Page revisions

27 Commits

Author SHA1 Message Date
0de29e0a12
Describe what is kept on the data volume, and SQLite's upkeep
Configuration says what fetch_geonames leaves behind and when postulo.W003
is raised, and gains a section on looking after a SQLite database with
manage.py compact_database. Files and Backups name the .partial file an
export is built under and the gzip level of a backup.

Refs postulo/postulo#1124
Refs postulo/postulo#1125
Refs postulo/postulo#1127
Refs postulo/postulo#1128

Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
2026-11-11 16:19:04 +01:00
b39438f2e1
Say how a killed backup, a failing sync and a silent worker behave
Backups gain the .partial file an archive is written under and the ten-minute
claim of a running backup; Background work says when an interrupted errand is
marked failed and what its page says while no worker is seen. Syncs gain the
back-off of a failing connection, for the person and for a plugin author, and
what add_reminder returns.

Refs postulo/postulo#1123
Refs postulo/postulo#1131
Refs postulo/postulo#1122
Refs postulo/postulo#1162
Refs postulo/postulo#1164

Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
2026-11-11 16:15:08 +01:00
633bf5175d
Backup destinations: the kind, encryption with age, off-site copies (postulo/postulo#325)
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-28 16:35:08 +01:00
4ab1bf0176
Backups: an unsigned archive needs --unverified; unknown download rule refused
Refs postulo/postulo#974
Refs postulo/postulo#978

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-17 16:17:27 +02:00
5a2c90f8b2
Document plugin calendar entries and links, the new settings, backup signing and the renames
Refs postulo/postulo#887 postulo/postulo#889 postulo/postulo#780 postulo/postulo#786
Refs postulo/postulo#772 postulo/postulo#881 postulo/postulo#882

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-11 17:47:23 +02:00
c5a8d38f01 Say that an avatar and a company logo are rows of the database and go with their owner (#662)
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-06 18:45:48 +02:00
b17e3dc3fc Describe the files of one kind of record on Backups and your data (#659)
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-06 07:19:33 +02:00
febed195d5 Document managing backups from Server settings (#242)
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-06 07:19:32 +02:00
8c35862213 Say the spreadsheet import runs as an errand, in chunks (#555)
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-06 05:53:27 +02:00
84ee7beabe Document messaging handles, identifier order, Markdown listings, key caps and save-as-you-go
Writing a plugin names MessagingService, MessagingServicePlugin and messaging_service_of
and says the kind registers in postulo.messaging_services. Refs postulo/postulo#682 #672
#665 #658 #656 #333

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-05 18:57:07 +02:00
3dd02d7534
Say what import checks in the files it unpacks
Refs postulo/postulo#466

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-04 22:41:54 +02:00
adac8dd859
Installing, Backups: source builds have their own image name, a PostgreSQL restore is all or nothing
Installing-Postulo: the install checks out the latest release tag; a source build is the base
file plus the build override and is tagged postulo:local, so one upgrade path per kind of
install and a pull can never replace a source build. Backups-and-your-data: on PostgreSQL a
restore runs in one transaction that stops at the first error and leaves the database as it was.

Refs postulo/postulo#403 postulo/postulo#477

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-04 15:28:20 +02:00
de5c9e63ea
Backups and your data: the archive's new contents, the spreadsheet import's rules, restore onto a fresh database, the key check
Backups-and-your-data: reminders about no application, the files an application went out with
and where a sent document went travel in the archive, an older archive restores without them,
and every record is built only from the fields Postulo writes. A spreadsheet status is matched as
whole words, a row with no status is decided by its date, a listing keeps its deadline and tags.
Expired export archives are also deleted by the export page. Restore counts a never-migrated
database as empty and counts every secret under the field key. Accounts-and-invitations: what an
account deletion removes from disk.

Refs postulo/postulo#467 postulo/postulo#468 postulo/postulo#471 postulo/postulo#394
Refs postulo/postulo#334 postulo/postulo#469 postulo/postulo#354 postulo/postulo#476
Refs postulo/postulo#481 postulo/postulo#539 postulo/postulo#355

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-04 12:04:57 +02:00
4360075460
Restoring: --allow-newer, the worker's profile in the container recipe; the export carries the accessibility choices
Refs postulo/postulo#479
Refs postulo/postulo#541
Refs postulo/postulo#464

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-04 03:14:48 +02:00
05eef9f47b
Say how an instance defines identifier schemes of its own
Configuration: the JSON, the pattern language and its budget, what is refused and how it
is said, what deleting or changing a scheme does to what is stored, where the text is
kept. Writing a plugin: what a reader of the registry now meets. Design: a dialog with a
page behind it, and a box of code. Backups, the API, Your career record and Tracking
applications: what happens to identifiers of a kind this instance lacks.

Refs postulo/postulo#311

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-03 03:33:35 +02:00
0cc2583605
Say how a postal address is checked against its country
Your career record: a section on the address rows -- what is refused, that a street is
never required and a town and a country are enough, how a postcode is put right, the
forces and territory forms, and that a stored or imported address is marked and left
alone. The same said shortly in Configuration, Getting started and Backups; the
address-line grid in Design; and in Writing a plugin, what postal-rules governs and
that a word shared with Postulo needs a context.

Refs postulo/postulo#306
Refs postulo/postulo#635
Refs postulo/postulo#458
Refs postulo/postulo#651

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-02 02:40:22 +02:00
9fff446515 A language code is a BCP 47 tag in its canonical form, said where one is met
Postulo writes `pt-BR` wherever it writes a language, and Serbian is `sr-Cyrl`.
The pages that show or describe a code say so where a reader meets one: the
webhook payload, the API's `language` and `record_language`, what a notifier
and a store are handed, and the catalogue directories of a plugin, which are
gettext's names and the one place an underscore is written.

*Writing a plugin* names the four calls that are on the surface for it:
`language_tag`, `is_language_tag`, `language_match` and `language_matches`,
Postulo's own writer, shape check and comparison, so that a plugin does not
grow its own way of lower-casing a code.

Also: what an older archive's codes become when it is put back, that a
language menu keeps a language it does not list, that Django's admin says its
own language in lower case, and the working catalogues in the design rules.

Refs postulo/postulo#337

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-01 21:51:55 +02:00
e8738ed35c
Say that each CV chooses which of your details it prints
A menu per kind on a CV's settings, the default following Your details
and a choice pinning a row; the form of address and pronouns printed
only where a CV says so; PATCH /cvs/{id} in the API; and what an archive
carries of the choice.

Refs postulo/postulo#308

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-01 19:48:56 +02:00
faefabcd2c
Say what a fetch refuses, how long it waits, and what an import does with a username
Addresses that carry a private one are refused; a page, its robots.txt
and a logo are held to a whole-download time as well as a size; only
gzip and deflate are unpacked; an archive's username is taken only when
the rules allow it; and Python 3.12.4 is the oldest Python.

Refs postulo/postulo#321

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-01 15:27:01 +02:00
de1f524672
Say how a page with no standard is read, and how a site learns from your corrections
Capturing postings says what the fallback reads now (a title line split
only where the page vouches for a part, a salary and a closing date
after the words the page's own language uses) and gains *Sites you
capture from often*: where a correction is remembered, what teaches and
what does not, how a field says it came from a remembered place, how a
place forgets itself and how you forget it. The capture API documents
`hinted` on a preview and that corrections sent with a capture teach
the same way. Writing a plugin says what the fallback source does, that
remembered places go only to Postulo's own sources, and names the two
new names on the surface. Backups says the export carries them.

Refs postulo/postulo#267

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-29 19:21:37 +02:00
1d73e48656
Say why an application ended, who put it forward, and how two records become one
Tracking applications gains four sections: why an application ended
(the reason, added then or later, and the last stage read from the
timeline), who referred you and the agency it went through, the notice
of possible duplicates, and merging two companies or two contacts, with
what moves, what the kept record takes and what cannot be undone.

Insights gains the widget *Where and why applications end* and the two
tables *By referrer* and *By agency* under *Where they came from*.
Reports lists the four columns the spreadsheet gains, and why the page
and the PDF do not. The API page names the new fields on an
application, `end_reason` on the status call, and the two ids a new
application may carry. Backups says the archive now holds the people
recorded at no company.

Your career record stops pinning the archive's format number, which
#236 and #239 have both moved since #181 wrote it down.

Refs postulo/postulo#239

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-29 14:09:15 +02:00
6fd0db7886
Say how one person's own record is taken out as a file and read back
Your career record gains the section on the candidate file: what it
holds and leaves out, the two steps of putting one back, the rule that
it merges and never replaces, what makes two entries the same entry,
and what it refuses. Its two headings that repeated the Europass
section's are worded apart, so each keeps its own anchor.

Backups and your data points to it from taking everything out, from
bringing a career record in, and from putting an archive back, which
that page does not read. Hardening lists the file's 1 MB cap beside
the other upload caps, and Roadmap keeps the whole-archive importer as
still wanted.

Refs postulo/postulo#181

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-29 13:39:21 +02:00
3c45357d65
Say that a worker can do the slow things, and how to run one
Refs postulo/postulo#247

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-20 14:30:42 +02:00
d966f83f2a
Say what losing the secret key costs, and how to restore without breaking things
The backup page said losing POSTULO_SECRET_KEY "will not lose your data, but it
will log everyone out", which was half of it. Unless POSTULO_FIELD_KEY is set,
that key is what every stored connection credential and the Web Push signing key
are derived from, so losing it leaves the rows in place with passwords and tokens
in them that nothing can read. The configuration page has said so for a while;
the page somebody reads while planning their backups contradicted it.

Restoring was worse. The steps said to restore onto an empty instance and run
nothing else, and then gave a uv run command — so in a container the only route
left was exec into the running web container, with gunicorn and the scheduler live
while the database underneath them is overwritten. There is now a container
section that stops the services first and uses compose run with
POSTULO_SKIP_MIGRATE=1, an explanation of what the new refusal in `restore` can
and cannot see, and an afterwards section covering the key warning and prune_media
for the files an archive never carried and a restore never deletes.

Restoring by hand was missing the step that matters most under WAL: the -wal and
-shm beside the database belong to the file that was there, and leaving them next
to one you have just swapped in means SQLite replays a log written against a
different database. The plugins directory joins the database and the media in
everything here that lists what has to be copied together.

Refs postulo/postulo#234

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-16 13:45:01 +02:00
2d4c0c70de
Take the pages over from postulo/wiki, which this repository now replaces
Until now this was a copy of postulo/wiki, refreshed by postulo's
scripts/publish-wiki.sh whenever somebody remembered to run it. The last
time was 5 September (postulo@9645ee1). This brings it to postulo@b6cfb8f7:

- the four pages that never arrived: Accessibility, Hardening, Listings
  and Reports;
- the seventeen that had changed since;
- the images, which the script never copied because it copied *.md and
  nothing else, so Home has shown its logo and its Buy me a coffee button
  broken since the day they were added.

Nothing here was lost: every earlier commit is a publish, and the pages
they left matched postulo/wiki at 9645ee1 exactly.

From here pages are written in this repository and nowhere else.

Refs postulo/postulo#169

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-10 13:55:38 +02:00
7bf6d841aa
Update wiki from postulo@b978b1e 2026-09-04 21:08:06 +02:00
ef61de01eb
Update wiki from postulo@036d3d3 2026-09-04 19:54:11 +02:00