6.8 KiB
title | date | draft | tags | |
---|---|---|---|---|
Pasty: Selfhosted pastebin сервис | 2022-09-15T11:01:12+03:00 | true |
|
Введение
pasty - это Pastebin сервис.
Pastebin или nopaste — веб-приложение, которое позволяет загружать отрывки текста, обычно фрагменты исходного кода, для возможности просмотра окружающими.
(c) Wikipedia
Адрес сервиса: pasty.lus.pm.
Преимущества этого проекта (как и почти всех остальных) это открытый исходный код, что позволяет развернуть сервис на своём сервере.
Selfhosting
Сборка
Исходный код досупен на GitHub, а также на моём зеркале Gitea.
В первую очередь pasty
необходимо собрать из исходного кода,
потому что автор не размещает бинарные сборки.
Проекты на Go собираются без каких-либо проблем.
git clone https://github.com/lus/pasty
cd pasty/
go build -o pasty ./cmd/pasty/main.go
После завершения операции, в текущей директории появится файл исполняемый pasty
.
Настройка
Pasty конфигурируется через файл .env
, размещённый в тойже директории,
где расположен исполняемый файл.
Pasty поддерживает несколько типов хранения данных, который определяется параметром PASTY_STORAGE_TYPE
.
Список поддерживаемых типов хранения данных:
Для каждого из типа хранения присутсуют свои особеннные настройки, которые можно посмотреть перейдя по ссылке из списка типов выше.
Я буду использовать тип file
,
для чего мне необходимо добавить второй параметр в настройки
PASTY_STORAGE_FILE_PATH
.
Значение по умолчанию ./data
.
Если ты запускаешь исполняемый файл из сторонней директории,
необходимо ещё скопировать каталог web
из исходников.
Я допустим создал отдельную директорию $HOME/Sites/Pasty/
,
настроил в .env
запуск по адресу localhost:3004 (PASTY_WEB_ADDRESS=localhost:3004
),
а в Nginx настроил location
с proxy_pass
.
location /pastebin/ {
proxy_pass http://localhost:3004;
}
Глубокая настройка
... заключается в изменении всех остальных параметров, список которых можно посмотреть в файле README.md или на странице проекта на GitHub pasty#general-environment-variables.
Использование pasty не на отдельном домене
Если захочется использовать pasty не на отдельном домене/поддомене, например pastebin.example.com, а например как я, по пути iiiypuk.me/pastebin/, ничего работать не будет.
Получим ошибку
Failed loading API information:
404 Not Found
В первую очередь, необходимо исправить константу API_BASE_URL
в файле /web/assets/js/modules/api.js
.
Это первая строка.
const API_BASE_URL = location.protocol + "//" + location.host + "/api/v2";
const API_BASE_URL = location.protocol + "//" + location.host + "/pastebin" + "/api/v2";
Однако опять ничего не заработает, будет ошибка
Could not load paste: paste not found
А всё потому, что часть /pastebin/
в адресе сервис распознаёт, как ID.
api.js:8
GET https://iiiypuk.me/pastebin/api/v2/pastes/pastebin 404 (Not Found)
Вот код, в котором якобы происходит ошибка.
export async function getPaste(pasteID) {
return fetch(API_BASE_URL + "/pastes/" + pasteID);
}
Следующий файл, который необходимо исправить /web/assets/js/modules/state.js
.
В этом куске кода изменяем первую строку:
if (location.pathname !== "/") {
// Extract the paste data (ID and language)
const split = location.pathname.replace("/", "").split(".");
const pasteID = split[0];
const language = split[1];
На это:
if (location.pathname !== "/pastebin/") {
Всё, теперь с главной страницы не редиректит.
Но при сохранении, в редирект не подставляется /pastebin/
.
Эта часть кода овечает, за редирект на главную, если pasteID отсутсвует в базе.
// Try to retrieve the paste data from the API
const response = await API.getPaste(pasteID);
if (!response.ok) {
Notifications.error("Could not load paste: <b>" + await response.text() + "</b>");
setTimeout(() => location.replace(location.protocol + "//" + location.host), 3000);
return;
}
Исправляем пятую строку на:
setTimeout(() => location.replace(location.protocol + "//" + location.host + "/pastebin/"), 3000);
По сути во все куски кода с location.protocol + "//" + location.host
необходимо добавить /pastebin/
.
// Redirect the user to his newly created paste
location.replace(location.protocol + "//" + location.host + "/" + data.id + (key ? "#" + key : ""));
// Redirect the user to his newly created paste
location.replace(location.protocol + "//" + location.host + "/pastebin/" + data.id + (key ? "#" + key : ""));
Мой инстанс
Мой pasty доступен по адресу