Files
ermnvldmr.com/services/www/content/articles/2026/joplin-web-deployment-guide.ru.mdx
T
2026-03-20 01:32:26 +03:00

228 lines
11 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
title: 'Руководство по развертыванию Joplin Web'
description: 'Развертывание Joplin Server и веб-приложения с нуля'
createdDate: 2026-03-20
tags: ['joplin', 'deployment', 'guide']
---
Это руководство описывает, как развернуть приватную инфраструктуру для заметок, используя Joplin Server и его веб-клиент.
## Почему я выбрал Joplin?
Я давно пользуюсь Joplin, и он стал моим основным инструментом для ведения заметок. Есть несколько причин, по которым я выбрал его среди других альтернатив:
- **Local-First**: Заметки хранятся локально на вашем устройстве, что обеспечивает быстрый доступ и полное владение данными (особенно когда интернет недоступен).
- **Формат Markdown**: Joplin использует Markdown для всех заметок, что позволяет невероятно легко экспортировать, импортировать или переносить данные на другую платформу при необходимости.
- **Удобный обмен**: Возможность делиться заметками через веб делает совместную работу или публичный доступ простыми.
- **Резервное копирование**: Joplin предоставляет надежные варианты резервного копирования, давая мне уверенность в сохранности моих данных.
Одной вещи мне не хватало — возможности быстро добавить или просмотреть заметки, когда у меня нет доступа к моим основным устройствам (например, на работе). Эта статья предлагает решение: самостоятельно размещенный (self-hosted) веб-клиент.
## Обзор технологического стека
1. **Joplin Server**: Сервер синхронизации. Он обрабатывает протокол синхронизации Joplin, логику учетных записей и синхронизацию заметок между устройствами.
2. **Postgres**: База данных. Необходима для производительности в рабочей среде.
3. **Joplin Web App**: Браузерный клиент, созданный из исходного кода мобильного приложения Joplin с использованием React Native for Web.
## 1. Стек развертывания
Эта конфигурация является универсальной, использует **Docker Volumes** и предоставляет минимальную настройку для развертывания полного стека.
### Основной docker-compose.yml
Этот compose-файл представляет собой минимальную конфигурацию для запуска Joplin Server и веб-приложения. Предполагается, что вы понимаете, как настроить обратный прокси-сервер, или, что еще лучше, у вас уже есть собственная установка Joplin.
```yaml
x-environment: &shared-environment
TZ: 'Europe/Moscow'
POSTGRES_DB: 'joplin'
POSTGRES_USER: ${SHARED_USERNAME?:error}
POSTGRES_PASSWORD: ${SHARED_PASSWORD?:error}
services:
postgres:
image: postgres:16
container_name: joplin-postgres
volumes:
- postgres_data:/var/lib/postgresql/data
environment:
<<: *shared-environment
restart: unless-stopped
server:
image: joplin/server:3.5.2
container_name: joplin-server
depends_on:
- postgres
environment:
<<: *shared-environment
APP_PORT: 22300
APP_BASE_URL: 'https://example.com'
DB_CLIENT: 'pg'
POSTGRES_HOST: 'joplin-postgres'
POSTGRES_PORT: 5432
POSTGRES_DATABASE: 'joplin'
ports:
- '22300:22300'
restart: unless-stopped
app:
build:
context: ./app
args:
- GIT_TAG=v3.5.13
container_name: joplin-app
environment:
<<: *shared-environment
ports:
- '8080:8080'
restart: unless-stopped
volumes:
postgres_data:
```
### Dockerfile
Создайте директорию `app` и поместите в нее этот `Dockerfile` для сборки веб-клиента. Мы собираем собственный образ, так как авторы оригинала его не предоставляют.
Хотя существуют репозитории с готовыми образами, создать свой достаточно просто.
```dockerfile
# Stage 1: Build
FROM node:20-bookworm-slim AS builder
ARG GIT_TAG=v3.5.13
# Install build dependencies for Joplin monorepo
RUN apt-get update && apt-get install -y \
git python3 build-essential rsync \
&& rm -rf /var/lib/apt/lists/*
WORKDIR /app
# Configure regional mirror and timeout for reliability
RUN corepack enable && \
yarn config set registry https://registry.npmmirror.com
# Clone specific tag
RUN git clone --depth 1 --branch ${GIT_TAG} https://github.com/laurent22/joplin.git .
# Install dependencies and build the web distribution
RUN yarn install --network-timeout 1000000
RUN cd packages/app-mobile/ && yarn web
# Stage 2: Production Server
FROM nginx:alpine
# Remove default assets
RUN rm -rf /usr/share/nginx/html/*
# Copy built app and custom nginx config
COPY --from=builder /app/packages/app-mobile/web/dist /usr/share/nginx/html/app
COPY nginx.conf /etc/nginx/conf.d/default.conf
EXPOSE 8080
CMD ["nginx", "-g", "daemon off;"]
```
### Конфигурация Nginx
Поместите этот `nginx.conf` рядом с `Dockerfile` в директории `app`. Joplin — это SPA (Single Page Application), а значит, не имеет значения, где оно развернуто, так как вся навигация обрабатывается внутренне без зависимости от местоположения. Поэтому вполне нормально развернуть его по пути, который не пересекается с основным сервером, например `/app`.
> Это довольно минималистичная конфигурация; предполагается, что ваш обратный прокси достаточно хорош, чтобы закрыть все спорные моменты, но вы можете расширить ее по своему усмотрению.
```nginx
server {
listen 8080;
server_name _;
root /usr/share/nginx/html;
index index.html;
# Gzip-сжатие для производительности
gzip on;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
gzip_min_length 1000;
# SPA-роутинг: возврат к index.html, если файл не найден
location /app/ {
try_files $uri $uri/ /app/index.html;
}
# Кэширование статических ресурсов
location ~* \.(?:ico|css|js|gif|jpe?g|png|woff2?|eot|ttf|svg|webmanifest)$ {
expires 6M;
access_log off;
add_header Cache-Control "public, max-age=15552000, immutable";
}
}
```
## 2. Конфигурация
Создайте файл `.env` в той же директории, что и `docker-compose.yml`. **Не пропускайте шаг генерации секретов ниже.**
```bash
# --- Учетные данные базы данных ---
SHARED_USERNAME=joplin
SHARED_PASSWORD=generate_this_with_openssl
```
### Генерация секретов
Используйте `openssl`, чтобы легко создать безопасные случайные строки для записей в вашем `.env`:
```bash
# Генерация SHARED_PASSWORD
openssl rand -hex 32
```
## 3. Развертывание
Запустите стек, выполнив следующую команду:
```bash
docker compose up -d --build
```
## 4. Начальная настройка сервера
Перед настройкой веб-приложения необходимо инициализировать ваш Joplin Server:
Следуйте официальному руководству: [Joplin Server README](https://github.com/laurent22/joplin/blob/dev/packages/server/README.md)
По сути, вам нужно убедиться, что базовая синхронизация через приложение работает.
## 5. Демонстрация и настройка веб-приложения
Как только веб-приложение запустится по адресу `https://example.com/app/`, оно поприветствует вас.
### О веб-приложении
![Интерфейс Joplin Web](https://static.ermnvldmr.com/www/articles/2026/joplin-web-deployment-guide/joplin-web-interface.webp)
По сути, это то же самое мобильное приложение Joplin, но в браузере. Оно использует LocalStorage API для обработки данных. Все по-прежнему работает по принципу local-first, поэтому после входа в систему потребуется время для синхронизации всех удаленных заметок.
Но самое главное: _Веб-интерфейс Joplin позволяет просматривать и редактировать заметки прямо из браузера._
> Говорят, что работа гарантирована только в Chrome из-за требований к совместимости API; однако я добился отличных результатов и в Firefox. Браузеры быстро догоняют друг друга.
### Настройка аутентификации
Чтобы подключиться к вашему self-hosted серверу Joplin, перейдите в **Settings > Synchronization** и настройте следующие параметры:
- **Sync Target**: Joplin Server
- **Joplin Server URL**: `https://example.com`
- **Joplin Server Email**: `your-email@example.com` (тот, который вы только что создали/настроили)
- **Joplin Server Password**: `your-password`
![Настройка Joplin Web](https://static.ermnvldmr.com/www/articles/2026/joplin-web-deployment-guide/joplin-web-setup.webp)
_Наслаждайтесь!_
## Ресурсы
- [Joplin GitHub](https://github.com/laurent22/joplin)
- [Joplin Server README](https://github.com/laurent22/joplin/blob/dev/packages/server/README.md)