Индекс на дневникаDockup / бележка от практиката
Note / self-host-memos

Как да хоствате Memos самостоятелно през 2026 г.: бележки, достъп до API и резервни копия

Практическо ръководство за самостоятелно хостване на Memos с Docker, портове, постоянни данни, TLS, сигурност, резервни копия и проблемите, които пречат на използването в production. Стъпка по стъпка.

Разглеждайте Memos като малка система, а не като Docker image. Целта за потребителя е ясна: бързи Markdown бележки с API; deployment-ът е приемлив само когато можете да създадете private memo и attachment, да го извлечете през API, да го редактирате и да потвърдите, че остава наличен след подмяна на container-а.

Това разграничение разкрива проблема, с който операторите се сблъскват след локално тестване: database файлът се намира в container layer-а и изчезва при подмяна. То също така прави плана за backup и upgrade достатъчно конкретен, за да бъде тестван.

Превърнете локалната команда в услуга, която може да се инспектира

Първият container трябва да може лесно да бъде изтрит и създаден наново. Дръжте данните извън writable layer-а, bind-нете порт 5230 само там, където proxy-то може да достигне до него, и подавайте конфигурацията по време на runtime.

docker run -d \
  --name memos \
  --restart unless-stopped \
  -p 127.0.0.1:5230:5230 \
  -v memos-data:/var/opt/memos \
  neosmemo/memos:stable --mode prod --port 5230

Фиксирайте image-а след първоначалния тест. Прочетете най-ранната startup грешка, а не финалното съобщение за restart, проверете всеки mount с docker inspect и следете логовете, докато създавате private memo и attachment, извличате го през API, редактирате го и потвърждавате, че остава наличен след подмяна на container-а. Тази последователност разграничава неправилна команда за image-а от проблем със зависимост или права за достъп.

Първо дефинирайте успеха за Memos

Разделете четири аспекта при Memos: ingress, listener-а на порт 5230, durable state и supporting services или локален капацитет. Изискването на локалния runtime е един durable volume за вградената database и asset-ите. Тествайте тази граница преди публикуване и отново след подмяна на container-а.

Изпълнете познатата успешна транзакция — създайте private memo и attachment, извлечете го през API, редактирайте го и потвърдете, че остава наличен след подмяна на container-а — преди да приемете, че разделянето е завършено. Измервайте SQLite writes, attachment growth, API traffic и search върху натрупаните бележки и съхранявайте резултата със записа за deployment-а. Той осигурява както критерий за приемане, така и първоначална база за оценка на капацитета.

Не давайте на Memos целия host

При Memos ценната повърхност не е непременно landing page-ът. Основната грешка е да оставите registration-а отворен по-дълго от предвиденото. Противодействайте ѝ целенасочено: затворете registration-а, когато е необходимо, и дръжте private memos зад надежден account и HTTPS.

В тази baseline конфигурация Memos няма задължителен bootstrap secret; защитете действителния му administrator account или upstream authentication-а. Използвайте unprivileged container user, когато image-ът го поддържа, и не mount-вайте несвързани credentials. Прилагайте rate или size limits на ingress ниво, където непроверени заявки могат да изразходват SQLite writes, attachment growth, API traffic и search върху натрупаните бележки.

TLS е лесен; генерираните URL адреси — не

Избягвайте временни и постоянни public origins за Memos. Вместо това използвайте стабилен HTTPS origin за browser и API clients, насочете избраното DNS име към platform route-а и proxy-вайте само към порт 5230.

Изпълнете това действие извън host-а: създайте private memo и attachment, извлечете го през API, редактирайте го и потвърдете, че остава наличен след подмяна на container-а. Ако ingress-ът не работи, ръководството за отстраняване на проблеми с 502 обхваща грешките с портове и listener-и. Ако Memos получава заявката, но database файлът се намира в container layer-а и изчезва след подмяна, доказателствата вече насочват към проблем извън proxy-то.

Докажете, че Memos преживява подмяна

Docker image може да бъде изтеглен отново; database-ът на Memos и качените ресурси не могат. Mount-нете /var/opt/memos преди bootstrap, запишете безвредни примерни данни и подменете container-а, за да докажете, че този path наистина е persistent. Проверете effective mount-а, вместо да се доверявате на името във Compose файла, и се уверете, че runtime user-ът може да записва там, където Memos очаква.

Изберете retention и off-host destination, след което упражнете recovery без да засягате production. Тестът е успешен само когато users, memos, tags и resources се възстановят и API извлече известното private memo. При database-backed state комбинирайте storage snapshots с application-consistent exports, както е описано в възстановяване до определен момент срещу snapshots.

Пет проверки, по-надеждни от health на container-а

Не използвайте трафика от първия потребител като acceptance test за Memos. Подгответе безвредно примерно състояние и изпълнете цялото действие „създайте private memo и attachment, извлечете го през API, редактирайте го и потвърдете, че остава наличен след подмяна на container-а“. Запишете точния public URL, резултата, image reference-а и log interval-а, свързани с изпълнението.

Подменете container-а и повторете, без да създавате данните наново. След това възстановете системата на празен host; условието за recovery е users, memos, tags и resources да се върнат и API да извлече известното private memo. Наблюдавайте SQLite writes, attachment growth, API traffic и search върху натрупаните бележки при всяко изпълнение и дефинирайте alert при влошаване на транзакцията, а не при idle metrics на container-а.

Една последна проверка трябва умишлено да се провали: изпратете безвреден input близо до resource или format limit-а, свързан с тази граница: database файлът се намира в container layer-а и изчезва след подмяна. Уверете се, че полученото съобщение от Memos идентифицира съответната граница, вместо да предизвика изтриване на данни или безкраен restart. Възстановете валидното състояние и потвърдете, че същата примерна транзакция е успешна. Включете това кратко упражнение в release checklist-а.

Логове, които отговарят на следващия въпрос

Използвайте създаването на private memo и attachment, извличането му през API, редактирането му и потвърждението, че остава наличен след подмяна на container-а, като smoke test за Memos след всеки deployment. Поддържащите му metrics са SQLite writes, attachment growth, API traffic и search върху натрупаните бележки; създайте alert, когато тези ресурси се доближат до ниво, което влошава потребителското действие.

Основният риск при промяна е, че database migrations на Memos трябва да се упражняват върху копие, тъй като цялото service state се намира в един компактен path. Безопасният release започва от възстановим snapshot и валидира всяка еднопосочна промяна на state-а, преди трафикът да бъде насочен към новата версия. Когато database файлът се намира в container layer-а и изчезва след подмяна, задръжте неуспешния container достатъчно дълго, за да прочетете конфигурацията му и първата грешка.

Използвайте Dockup за platform layer-а

Dockup премахва ръчната работа по reverse proxy и lifecycle management около Memos. Услугата получава стабилен HTTPS route към 5230, инжектирана конфигурация и persistent storage при подмени. Свързаният customer server следва същия модел като compute, хостван в Dockup.

След стартирането изпълнете application contract-а: използвайте стабилен HTTPS origin за browser и API clients, потвърдете локалното изискване — един durable volume за вградената database и asset-ите — и изпълнете следното доказателство: създайте private memo и attachment, извлечете го през API, редактирайте го и потвърдете, че остава наличен след подмяна на container-а. Така one-click изживяването остава полезно, без да се заличават детайлите, които правят Memos възстановим и сигурен.

Често задавани въпроси

Какво е необходимо на Memos за production deployment?

Насочете Memos container-а на порт 5230 през един HTTPS origin. Изискването на локалния runtime е един durable volume за вградената database и asset-ите. Не обявявайте Memos за готов, докато не можете да създадете private memo и attachment, да го извлечете през API, да го редактирате и да потвърдите, че остава наличен след подмяна на container-а.

Кои данни на Memos трябва да бъдат включени в backup?

Запазете /var/opt/memos и включете database-а на Memos и качените resources в един и същ recovery manifest. Чистото възстановяване на Memos е успешно само когато users, memos, tags и resources се върнат и API извлече известното private memo.

Изисква ли Memos HTTPS зад reverse proxy?

Използвайте HTTPS за public origin-а на Memos и оставете порт 5230 във вътрешния route. Приложете правилно настройката на Memos: използвайте стабилен HTTPS origin за browser и API clients. При Memos HTTPS защитава credentials или user content при пренос и поддържа consistent поведението на clients, зависимо от origin-а.

Как трябва да се тества upgrade на Memos?

Възстановете текущото състояние на Memos в изолиран deployment, приложете candidate версията и повторете acceptance транзакцията. Обърнете специално внимание, защото database migrations на Memos трябва да се упражняват върху копие, тъй като цялото service state се намира в един компактен path. Запазете предишния Memos image, докато не изясните границите на data migration-а и rollback-а.