Blog/content/posts/2022/pasty-selfhost.md

6.9 KiB
Raw Blame History

title date draft tags
Pasty: Selfhosted pastebin сервис 2022-09-15T11:01:12+03:00 true
tutorial

Введение

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 доступен по адресу TODO: add links