Compare commits

...

6 Commits

Author SHA1 Message Date
646de9a1fe Карты и ресурспаки
All checks were successful
Build MkDocs / build-and-deploy (push) Successful in 27s
2026-03-05 08:30:36 +03:00
520af29279 Время жизни сессии Roundcube
All checks were successful
Build MkDocs / build-and-deploy (push) Successful in 30s
2026-02-17 23:40:54 +03:00
035bae4fca Автообновление года в Copyright :)
All checks were successful
Build MkDocs / build-and-deploy (push) Successful in 30s
2026-02-13 11:16:21 +03:00
bd620e77eb Заметка про SMTP Relay
All checks were successful
Build MkDocs / build-and-deploy (push) Successful in 32s
2026-02-12 15:28:25 +03:00
4f3b2ad52a Про zram
All checks were successful
Build MkDocs / build-and-deploy (push) Successful in 28s
2026-02-11 22:21:39 +03:00
90f7ea0064 Уточнил инструкции по бэкапу и переносу Gitea 2026-02-11 22:11:18 +03:00
7 changed files with 213 additions and 13 deletions

1
.gitignore vendored
View File

@@ -1,2 +1,3 @@
site/ site/
.obsidian/ .obsidian/
*.pyc

View File

@@ -98,6 +98,36 @@ cd gitea-backup
### Gitea установлена с Docker ### Gitea установлена с Docker
!!! info "Есть вариант проще"
Если Gitea запускается через Docker Compose, как показано в инструкции [выше](#установка-с-docker) и в качестве базы данных используется SQLite, то для создания полного бэкапа достаточно сохранить папку `data`. Её же достаточно перенести на другую машину при переезде.
```sh
# Предварительно нужно остановить Gitea
sudo su - gitea
docker compose stop
exit
mkdir gitea-backup
cd gitea-backup
# Запускать надо с root правами, потому что некоторые файлы
# внутри волюма создаются из-под root
sudo tar -czf gitea-backup.tar.gz -C /home/gitea data
sudo chown $USER:$USER gitea-backup.tar.gz
# Опционально: можно зашифровать бэкап хотя бы просто паролем
gpg -c gitea-backup.tar.gz
rm gitea-backup.tar.gz
# Команда для расшифровки
# gpg -d gitea-backup.tar.gz.gpg > gitea-backup.tar.gz
# Перезапускаем Gitea
sudo su - gitea
docker compose up -d
```
Предполагается, что Gitea развёрнута с помощью Docker Compose как описано в инструкции [выше](#установка-с-docker). Предполагается, что Gitea развёрнута с помощью Docker Compose как описано в инструкции [выше](#установка-с-docker).
Подключаемся к контейнеру. Подключаемся к контейнеру.
@@ -145,6 +175,11 @@ curl -O http://<IP>:8080/gitea-dump-1760203345.zip
## Восстановление из бэкапа в Docker ## Восстановление из бэкапа в Docker
!!! info "Есть вариант проще"
Если в качестве бэкапа Gitea была сохранена папка `data`. То для восстановления Gitea на другой машине достаточно просто пройти по инструкции [установки Gitea с Docker](#установка-с-docker), но перед запуском просто скопировать папку `data` по пути, указанном в `docker-compose.yml`.
Предполагается, что Gitea разворачивается из [бэкапа](#создание-бэкапа) с помощью Docker Compose как описано в инструкции [выше](#установка-с-docker). В [документации](https://docs.gitea.com/1.24/administration/backup-and-restore#using-docker-restore) есть соответствующая инструкция, однако она не полная и содержит ошибки. Предполагается, что Gitea разворачивается из [бэкапа](#создание-бэкапа) с помощью Docker Compose как описано в инструкции [выше](#установка-с-docker). В [документации](https://docs.gitea.com/1.24/administration/backup-and-restore#using-docker-restore) есть соответствующая инструкция, однако она не полная и содержит ошибки.
```sh ```sh
@@ -165,17 +200,23 @@ cp -r dump/data/ data/gitea/
mkdir data/git/ mkdir data/git/
cp -r dump/repos/ data/git/repositories/ cp -r dump/repos/ data/git/repositories/
# Копируем SSH ключи, если есть
mkdir data/ssh
cp -r dump/ssh/ data/ssh/
# Копируем кастомные стили и шаблоны # Копируем кастомные стили и шаблоны
cp -r dump/custom/. data/gitea/ # Актуально, если $GITEA_CUSTOM не совпадала с data/gitea
# cp -r dump/custom/. data/gitea/
# Если Gitea в Docker будет работать с SQLite, # Если Gitea в Docker будет работать с SQLite,
# то восстановить базу данных можно так. # то восстановить базу данных можно так.
# sqlite3 data/gitea/gitea.db < dump/gitea-db.sql
# Если файл data/gitea/gitea.db уже есть, то и восстанавливать ничего не нужно
# Команды для других баз данныех есть в документации # Команды для других баз данныех есть в документации
sqlite3 data/gitea/gitea.db < dump/gitea-db.sql
# Копируем конфиг # Копируем конфиг, если изначально он был в другом месте
mkdir data/gitea/conf # mkdir data/gitea/conf
cp dump/app.ini data/gitea/conf/app.ini # cp dump/app.ini data/gitea/conf/app.ini
``` ```
Если до этого Gitea была запущена не через Docker, то нужно отредактировать конфиг. Если до этого Gitea была запущена не через Docker, то нужно отредактировать конфиг.

View File

@@ -244,3 +244,33 @@ p10k configure
# Type Path Mode UID GID Age Argument # Type Path Mode UID GID Age Argument
d /home/USERNAME/Downloads 0755 USER USER 7d d /home/USERNAME/Downloads 0755 USER USER 7d
``` ```
## Настройка zram
[zram-tools](https://packages.debian.org/sid/zram-tools) позволяет оптимизировать использование памяти, сжимая редко используемые данные в RAM.
```sh
sudo apt install zram-tools
reboot
# Проверить, что swap работает
swapon --show
```
По умолчанию под swap выделяется 50% памяти, можно изменить:
```sh
sudo nano /etc/default/zramswap
sudo systemctl restart zramswap
sudo systemctl status zramswap
```
Также при использовании zram рекомендуют уменьшать swappiness. Этот параметр говорит системе, насколько часто ей стоит использовать swap файл.
```sh
echo "vm.swappiness=10" | sudo tee /etc/sysctl.d/99-swappiness.conf
sudo sysctl -p /etc/sysctl.d/99-swappiness.conf
# Проверка
cat /proc/sys/vm/swappiness
```

View File

@@ -280,3 +280,81 @@ DNS-записи распространяются не мгновенно, но
```sh ```sh
./run-and-backup.sh -h ./run-and-backup.sh -h
``` ```
## Загрузка карт
Карту нужно загрузить на сервер и разместить в папке `./data/`. Название папки с картой нужно будет указать в переменной `LEVEL` в файле `docker-compose.yml`. Также, почти все карты требуют включения командных блоков, это делается с помощью переменной `ENABLE_COMMAND_BLOCK`.
=== "Терминал"
```sh
nano docker-compose.yml
```
=== "docker-compose.yml"
```yaml
environment:
LEVEL: "MapName"
ENABLE_COMMAND_BLOCK: "true"
```
### Загрузка ресурспаков
Многие карты предоставляют свои ресурспаки. Игроки, конечно, могут сами загрузить ресурспак и выбрать его в настройках, но можно настроить автоматическую загрузку при входе на сервер. Для этого ресурспак должен быть доступен для скачивания по публичной ссылке.
=== "Терминал"
```sh
sudo mkdir -p /var/www/minecraft/packs/
sudo mv pack.zip /var/www/minecraft/packs/
sudo chmod -R 755 /var/www/minecraft/
# Настройка nginx
sudo nano /etc/nginx/sites-available/minecraft.tishenko.dev
sudo ln -s /etc/nginx/sites-available/minecraft.tishenko.dev /etc/nginx/sites-enabled/
sudo certbot --nginx -d minecraft.tishenko.dev -d www.minecraft.tishenko.dev
```
=== "Пример конфига Nginx"
В этом примере ресурспаки будут доступны для скачивания по ссылке вида `https://minecraft.tishenko.dev/packs/pack.zip`. `https` будет работать после получения [SSL сертификата](../servers/nginx.md#ssl-сертификат-с-certbot).
```nginx
limit_conn_zone $binary_remote_addr zone=conn_limit:10m;
server {
listen 80;
server_name minecraft.tishenko.dev www.minecraft.tishenko.dev;
location = /packs {
return 301 /packs/;
}
location /packs/ {
alias /var/www/minecraft/packs/;
autoindex on;
limit_conn conn_limit 2;
limit_rate_after 1m;
limit_rate 2560k;
}
}
```
Название файла ресурспака нужно будет указать в переменной `RESOURCE_PACK` в файле `docker-compose.yml`. Опционально можно указать SHA1 хэш файла ресурспака в переменной `RESOURCE_PACK_SHA1`. Можно сделать загрузку ресурспака обязательной при подключении к серверу с помощью переменной `RESOURCE_PACK_ENFORCE`.
=== "Терминал"
```sh
# Опционально
# sha1sum /var/www/minecraft/packs/pack.zip
nano docker-compose.yml
```
=== "docker-compose.yml"
```yaml
environment:
RESOURCE_PACK: "https://.../yourpack.zip"
RESOURCE_PACK_SHA1: "0123abcd... (40 hex)"
RESOURCE_PACK_ENFORCE: "true"
```

View File

@@ -17,6 +17,7 @@ nc -vz smtp.gmail.com 587
Если порты закрыты, то можно обратиться в поддержку хостинг провайдера с запросом на открытие портов. Если порты закрыты, то можно обратиться в поддержку хостинг провайдера с запросом на открытие портов.
??? abstract "Пример обращения в поддержку" ??? abstract "Пример обращения в поддержку"
``` ```
Добрый день! Добрый день!
@@ -27,6 +28,11 @@ nc -vz smtp.gmail.com 587
Спасибо! Спасибо!
``` ```
??? question "Если нельзя открыть исходящие на 25/tcp?"
Не все хостинги позволяют открывать исходящие соединения на порт 25, даже через поддержку.
В этом случае можно использовать SMTP Relay, например, [Cloud Postbox](https://yandex.cloud/ru/services/postbox). Инструкция по его настройке приведена [ниже](#smtp-relay).
## Настройка DNS ## Настройка DNS
Настройка DNS на примере домена `tishenko.dev` (почта `@tishenko.dev`). Более подробное описание всех настроек можно прочитать в документации Docker Mailserver: [[1]](https://docker-mailserver.github.io/docker-mailserver/latest/usage/#minimal-dns-setup) и [[2]](https://docker-mailserver.github.io/docker-mailserver/latest/config/best-practices/dkim_dmarc_spf/). Настройка DNS на примере домена `tishenko.dev` (почта `@tishenko.dev`). Более подробное описание всех настроек можно прочитать в документации Docker Mailserver: [[1]](https://docker-mailserver.github.io/docker-mailserver/latest/usage/#minimal-dns-setup) и [[2]](https://docker-mailserver.github.io/docker-mailserver/latest/config/best-practices/dkim_dmarc_spf/).
@@ -369,7 +375,7 @@ sudo certbot --nginx -d mail.tishenko.dev -d www.mail.tishenko.dev
### Конфиг ### Конфиг
Некоторые настройки Roundcube нельзя задать через переменные окружения, они задаются в файле `config.inc.php`. Например, "название продукта", оно отображается в заголовке страницы, на странице входа и в других местах. По умолчанию это `Roundcube Webmail`. Его можно изменить в `config/config.inc.php`. Некоторые настройки Roundcube нельзя задать через переменные окружения, они задаются в файле `config.inc.php`. Например, "название продукта", оно отображается в заголовке страницы, на странице входа и в других местах. По умолчанию это `Roundcube Webmail`. Также по умолчанию в Roundcube очень короткое время сессии, всего 10 минут, после которых нужно логиниться заново. Эти параметры можно изменить в `config/config.inc.php`.
=== "Терминал" === "Терминал"
@@ -382,6 +388,13 @@ sudo certbot --nginx -d mail.tishenko.dev -d www.mail.tishenko.dev
```php ```php
<?php <?php
$config['product_name'] = 'Tish\'s Mail'; $config['product_name'] = 'Tish\'s Mail';
$config['session_lifetime'] = 60 * 24;
```
После изменения конфига нужно перезапустить Roundcube.
```sh
docker compose restart roundcube
``` ```
### Настройки аккаунта ### Настройки аккаунта
@@ -452,3 +465,32 @@ v=BIMI1; l=https://tishenko.dev/logo.svg;
``` ```
Однако в gmail и некоторых других почтовых клиентах он всё равно не будет отображаться, так как они требуют для этого платные VMC сертификаты. Однако в gmail и некоторых других почтовых клиентах он всё равно не будет отображаться, так как они требуют для этого платные VMC сертификаты.
## SMTP Relay
Не всегда есть возможность открыть исходящие соединения на порт 25. Для этого можно использовать SMTP Relay. Это отдельный сервис, у которого есть свои сервера с открытыми почтовыми портами. Бонусом является то, что при использовании подобных сервисов обычно требуется меньше настроек DNS, а также письма с IP адресов таких сервисов практически не попадают в спам. [Yandex Cloud Postbox](https://yandex.cloud/ru/services/postbox) это пример подобного сервиса. Вообще говоря, он предназначен для транзакционных рассылок, то есть сообщений с подтверждением разных действий, но его можно использовать и для отправки писем с личной почты.
1. После регистрации, нужно создать почтовый адрес для отправки писем. При создании нужно указать домен, например, `tishenko.dev` и выбрать простой вариант настройки DKIM.
2. Подтверждаем принадлежность домена. Для этого нужно добавить две CNAME записи в DNS. Для каждого адреса генерируются уникальные ключи, ниже пример для домена `tishenko.dev`.
```dns
egt9mf1fnu9td07bs857-1._domainkey IN CNAME egt9mf1fnu9td07bs857-1.dkim.pstbx.ru.
egt9mf1fnu9td07bs857-2._domainkey IN CNAME egt9mf1fnu9td07bs857-2.dkim.pstbx.ru.
```
Затем нужно подождать пока записи появятся в DNS, затем запустить проверку в Cloud Postbox. Посмотреть процесс распространения записей можно с помощью сайта [DNS Checker](egt9mf1fnu9td07bs857-1._domainkey.tishenko.dev).
3. Добавляем TXT запись для домена `tishenko.dev`.
```dns
v=spf1 include:_spf.yandex.net -all
```
Дальше настраиваем Docker Mailserver для работы с SMTP Relay. [Документация DMS](https://docker-mailserver.github.io/docker-mailserver/latest/config/advanced/mail-forwarding/relay-hosts) по настройке SMTP Relay и [документация Yandex Cloud Postbox](https://yandex.cloud/en/docs/tutorials/serverless/postfix-integration) в помощь. В `mailserver.env` нужно добавить следующие переменные:
```sh
# Отправка всей исходящей почты через Postbox
DEFAULT_RELAY_HOST=[postbox.cloud.yandex.net]:587
# SMTP-учётка Postbox:
RELAY_USER=SMTP_USERNAME
RELAY_PASSWORD=SMTP_PASSWORD
```
Для получения паролей надо создать [сервисный аккаунт](https://yandex.cloud/ru/docs/iam/operations/sa/create), назначить ему роль [`postbox.sender`](https://yandex.cloud/ru/docs/tutorials/serverless/postfix-integration#infrastructure), а затем создать API-ключ с областью действия `yc.postbox.send`. Идентификатор ключа можно использовать как `RELAY_USER`, а сам секретный ключ как `RELAY_PASSWORD`.

6
hooks.py Normal file
View File

@@ -0,0 +1,6 @@
# https://github.com/squidfunk/mkdocs-material/discussions/4969#discussioncomment-7290363
from datetime import datetime
def on_config(config, **kwargs):
config.copyright = config.copyright.format(year=datetime.now().year)

View File

@@ -1,9 +1,11 @@
site_name: Tish Knowledge Base site_name: Tish Knowledge Base
site_url: https://kb.tishenko.dev site_url: https://kb.tishenko.dev
copyright: Copyright &copy; 2025 copyright: Copyright &copy; {year}
repo_url: https://github.com/Arity-T/knowledge-base repo_url: https://github.com/Arity-T/knowledge-base
repo_name: Arity-T/knowledge-base repo_name: Arity-T/knowledge-base
edit_uri: edit/main/docs/ edit_uri: edit/main/docs/
hooks:
- hooks.py
theme: theme:
name: material name: material
language: ru language: ru