Compare commits

..

16 Commits

21 changed files with 375 additions and 59 deletions

17
.gitignore vendored
View File

@@ -10,10 +10,6 @@ proxy/nginx/logs/*
proxy/ssl/conf/* proxy/ssl/conf/*
proxy/ssl/www/* proxy/ssl/www/*
proxy/ddns/domains.txt proxy/ddns/domains.txt
proxy/crowdsec/*
!proxy/crowdsec/config
proxy/crowdsec/config/*
!proxy/crowdsec/config/acquis.yaml
gitea/data/* gitea/data/*
gitea/db gitea/db
@@ -22,9 +18,16 @@ gitea/config/*
matrix/data/* matrix/data/*
matrix/db matrix/db
cloud/filebrowser.db cloud/db
cloud/data
cloud/config
cloud/apps
pihole/etc-pihole/* disk/filebrowser.db
pihole/etc-dnsmasq.d/*
memos/memos/*.db
memos/memos/*.db-wal
memos/memos/*.db-shm
memos/memos/.thumbnail_cache
!.keep !.keep

3
.gitmodules vendored Normal file
View File

@@ -0,0 +1,3 @@
[submodule "homepage/src"]
path = homepage/src
url = https://github.com/StepanovPlaton/AboutMe

View File

@@ -46,11 +46,15 @@
- Автоматическое обновление DNS записей у регистратора [рег.ру](https://www.reg.ru) - Автоматическое обновление DNS записей у регистратора [рег.ру](https://www.reg.ru)
- **Git-сервер Gitea** для хостинга репозиториев - **Git-сервер Gitea** для хостинга репозиториев
- **FileBrowser** — веб-интерфейс для управления файлами через браузер - **FileBrowser** — веб-интерфейс для управления файлами через браузер
- **Matrix Synapse** — собственный сервер для мессенджера Matrix с веб-клиентом Element - **Memos** — быстрые заметки через веб-интерфейс
- **Matrix Synapse** — собственный сервер для мессенджера Matrix с веб-клиентом Element и административной панелью
- **NextCloud** — полнофункциональное облачное хранилище с синхронизацией файлов, календарем, контактами, задачами и многими другими функциями
- Блокировка рекламы, нежелательной слежки, частичная защита от атак с помощью **AdGuard Home** - Блокировка рекламы, нежелательной слежки, частичная защита от атак с помощью **AdGuard Home**
- Управление контейнерами через **Portainer** - Управление контейнерами через **Portainer**
- Все **сервисы используют переменные окружения** для гибкой настройки и примеры конфигурации - Все **сервисы используют переменные окружения** для гибкой настройки и примеры конфигурации
> 💡 **Важно:** Все сервисы модульные и независимые. Вы можете устанавливать только те, которые вам действительно нужны. Подробные инструкции по установке каждого сервиса находятся в файле [Services.md](./Services.md).
--- ---
## 📝 Подготовка ## 📝 Подготовка
@@ -108,4 +112,12 @@
#### FileBrowser #### FileBrowser
![FileBrowser Interface](./screenshots/cloud.png) ![FileBrowser Interface](./screenshots/filebrowser.png)
#### Memos
![Memos Interface](./screenshots/memos.png)
#### NextCloud
![NextCloud Interface](./screenshots/nextcloud.png)

View File

@@ -99,10 +99,10 @@ podman-compose up -d
--- ---
## 8Cloud (FileBrowser) — веб-интерфейс для управления файлами ## 8⃣ FileBrowser — простой веб-интерфейс для управления файлами
```bash ```bash
cd cloud cd disk
cp .env.example .env && vim .env cp .env.example .env && vim .env
touch filebrowser.db && podman unshare chown -R 1000:1000 filebrowser.db touch filebrowser.db && podman unshare chown -R 1000:1000 filebrowser.db
podman-compose up -d podman-compose up -d
@@ -110,7 +110,19 @@ podman-compose up -d
--- ---
## 9⃣ Matrix — собственный сервер для мессенджера Matrix ## 9⃣ Memos — быстрые заметки
> Memos — это простой и быстрый способ создавать и управлять заметками через веб-интерфейс.
```bash
cd memos
cp .env.example .env && vim .env
podman-compose up -d
```
---
## 🔟 Matrix — собственный сервер для мессенджера Matrix
```bash ```bash
cd matrix cd matrix
@@ -147,7 +159,54 @@ podman exec -it matrix-synapse register_new_matrix_user -c /data/homeserver.yaml
--- ---
## 🔟 Nginx Reverse Proxy (Entrypoint) ## 1⃣1⃣ NextCloud — личное многофункциональное облако
> NextCloud — полнофункциональное облачное хранилище с возможностью синхронизации файлов, календарем, контактами, задачами и многими другими функциями.
```bash
cd cloud
cp .env.example .env && vim .env
mkdir db
mkdir config && podman unshare chown -R 33:33 config
mkdir data && podman unshare chown -R 33:33 data
mkdir apps && podman unshare chown -R 33:33 apps
podman-compose up -d
```
> ⚠️ В docker-compose.yml есть переменные, которые можно указать при первом запуске, но они мешают если пересоздавать контейнер не с нуля.
Настраиваем NextCloud через веб-форму после запуска Nginx. Выбираем пользователя по умолчанию, БД. В разделе приложений можем установить дополнительные модули:
**Базовые модули:**
- Calendar — календарь
- Contacts — контакты
- Deck — доски задач
- Whiteboard — виртуальная доска
- Forms — формы
**Комплексные модули:**
- **NextCloud Office** — конфигурируется с Collabora Office, которая запускается на отдельном домене, его нужно указать в настройках
- **NextCloud Talk** — видеоконференции. Для доступа извне сети нужен модуль CoTurn, он запускается на отдельном домене
> ⚠️ Для этого модуля нужно открыть UDP порты с SSL, что проблематично. Это я пока не настраивал
> Для работы NextCloud Office в `config/config.php` нужно добавить:
> ```php
> 'trusted_proxies' => ['10.89.0.1'],
> 'overwrite.cli.url' => 'https://cloud.domain.ru',
> 'overwriteprotocol' => 'https',
> 'overwritehost' => 'cloud.domain.ru',
> ```
>
> `10.89.0.1` — это Gateway для Podman
> `cloud.domain.ru` меняем на наш домен
**Настройка внешнего хранилища:**
Также устанавливаем модуль **External Storage Support** и в его настройках добавляем диск локального типа по пути `/var/www/external_storage` (это внешний диск, указанный в `.env`).
---
## 1⃣2⃣ Nginx Reverse Proxy (Entrypoint)
```bash ```bash
cd proxy cd proxy

View File

@@ -1,5 +1,13 @@
SHARED_FOLDER=/path/to/folder NEXTCLOUD_DATABASE=nextcloud-db
USER_ID=1000 DATABASE_USER=nextcloud
GROUP_ID=1000 DATABASE_PASSWORD=password
ADMIN_USER=admin DATABASE_ROOT_PASSWORD=another_password
ADMIN_PASSWORD=password # Минимальная длинна 12 символов PATH_TO_FOLDER=/path/to/folder/
NEXTCLOUD_ADMIN=admin
NEXTCLOUD_PASSWORD=password
NEXTCLOUD_DOMAIN=cloud.domain.ru
COLLABORA_ADMIN=admin
COLLABORA_PASSWORD=password
COLLABORA_DOMAIN=office.domain.ru

View File

@@ -1,40 +1,71 @@
services: services:
filebrowser: nextcloud-db:
image: docker.io/filebrowser/filebrowser:latest image: docker.io/library/mariadb:11
container_name: filebrowser
restart: always restart: always
command: --transaction-isolation=READ-COMMITTED --binlog-format=ROW
container_name: nextcloud-db
volumes: volumes:
# Папка с вашими файлами (замените /path/to/your/files на реальный путь) - ./db:/var/lib/mysql:z
- ${SHARED_FOLDER}:/srv
# База данных настроек и пользователей
- ./filebrowser.db:/database/filebrowser.db
# (Опционально) Конфигурационный файл
# - ./settings.json:/config/settings.json
environment: environment:
- PUID=${USER_ID:?} - MARIADB_DATABASE=${NEXTCLOUD_DATABASE:?}
- PGID=${GROUP_ID:?} - MARIADB_USER=${DATABASE_USER:?}
entrypoint: ["/bin/sh", "-c"] - MARIADB_PASSWORD=${DATABASE_PASSWORD:?}
command: - MARIADB_ROOT_PASSWORD=${DATABASE_ROOT_PASSWORD:?}
- | networks:
if [ ! -s /database/filebrowser.db ]; then - private_cloud_network
filebrowser config init --database /database/filebrowser.db
filebrowser config set --auth.method=json --database /database/filebrowser.db nextcloud-redis:
fi image: docker.io/library/redis:alpine
filebrowser config set --root /srv --database /database/filebrowser.db restart: always
filebrowser users add ${ADMIN_USER:?} ${ADMIN_PASSWORD:?} --perm.admin --scope "." --database /database/filebrowser.db || \ container_name: nextcloud-redis
filebrowser users update ${ADMIN_USER:?} --password ${ADMIN_PASSWORD:?} --scope "." --database /database/filebrowser.db networks:
filebrowser --database /database/filebrowser.db --address 0.0.0.0 --port 8080 --root /srv - private_cloud_network
deploy:
resources: nextcloud:
limits: image: docker.io/library/nextcloud:latest
cpus: '1.0' restart: always
memory: 512M container_name: nextcloud
reservations: volumes:
memory: 256M - ${PATH_TO_FOLDER:?}:/var/www/external_storage:z
- ./data:/var/www/html/data:z
- ./config:/var/www/html/config:z
- ./apps:/var/www/html/custom_apps:z
#environment:
# - MYSQL_PASSWORD=${DATABASE_PASSWORD:?}
# - MYSQL_DATABASE=${NEXTCLOUD_DATABASE:?}
# - MYSQL_USER=${DATABASE_USER:?}
# - MYSQL_HOST=nextcloud-db
# - REDIS_HOST=nextcloud-redis
#
# - NEXTCLOUD_ADMIN_USER=${NEXTCLOUD_ADMIN:?}
# - NEXTCLOUD_ADMIN_PASSWORD=${NEXTCLOUD_PASSWORD:?}
# - NEXTCLOUD_TRUSTED_DOMAINS=${NEXTCLOUD_DOMAIN:?}
depends_on:
- nextcloud-db
- nextcloud-redis
networks: networks:
- cloud_network - cloud_network
- private_cloud_network
nextcloud-collabora:
image: docker.io/collabora/code:latest
container_name: nextcloud-collabora
restart: always
environment:
- aliasgroup1=https://${NEXTCLOUD_DOMAIN:?}
- DONT_GEN_SSL_CERT=true
- server_name=${COLLABORA_DOMAIN:?}
- extra_params=--o:ssl.enable=false --o:ssl.termination=true --o:net.post_allow.host[0]=.*
- username=${COLLABORA_ADMIN:?}
- password=${COLLABORA_PASSWORD:?}
networks:
- cloud_network
- private_cloud_network
networks: networks:
cloud_network: cloud_network:
name: cloud_network name: cloud_network
driver: bridge driver: bridge
private_cloud_network:
name: private_cloud_network
driver: bridge

5
disk/.env.example Normal file
View File

@@ -0,0 +1,5 @@
SHARED_FOLDER=/path/to/folder
USER_ID=1000
GROUP_ID=1000
ADMIN_USER=admin
ADMIN_PASSWORD=password # Минимальная длинна 12 символов

40
disk/docker-compose.yml Normal file
View File

@@ -0,0 +1,40 @@
services:
filebrowser:
image: docker.io/filebrowser/filebrowser:latest
container_name: filebrowser
restart: always
volumes:
# Папка с вашими файлами (замените /path/to/your/files на реальный путь)
- ${SHARED_FOLDER}:/srv
# База данных настроек и пользователей
- ./filebrowser.db:/database/filebrowser.db
# (Опционально) Конфигурационный файл
# - ./settings.json:/config/settings.json
environment:
- PUID=${USER_ID:?}
- PGID=${GROUP_ID:?}
entrypoint: ["/bin/sh", "-c"]
command:
- |
if [ ! -s /database/filebrowser.db ]; then
filebrowser config init --database /database/filebrowser.db
filebrowser config set --auth.method=json --database /database/filebrowser.db
fi
filebrowser config set --root /srv --database /database/filebrowser.db
filebrowser users add ${ADMIN_USER:?} ${ADMIN_PASSWORD:?} --perm.admin --scope "." --database /database/filebrowser.db || \
filebrowser users update ${ADMIN_USER:?} --password ${ADMIN_PASSWORD:?} --scope "." --database /database/filebrowser.db
filebrowser --database /database/filebrowser.db --address 0.0.0.0 --port 8080 --root /srv
deploy:
resources:
limits:
cpus: '1.0'
memory: 512M
reservations:
memory: 256M
networks:
- disk_network
networks:
disk_network:
name: disk_network
driver: bridge

2
homepage/.env.example Normal file
View File

@@ -0,0 +1,2 @@
OAUTH_GITHUB_CLIENT_ID=
OAUTH_GITHUB_CLIENT_SECRET=

View File

@@ -0,0 +1,18 @@
services:
homepage:
container_name: homepage
restart: always
build:
context: src
args:
- OAUTH_GITHUB_CLIENT_ID=${OAUTH_GITHUB_CLIENT_ID:?}
- OAUTH_GITHUB_CLIENT_SECRET=${OAUTH_GITHUB_CLIENT_SECRET:?}
environment:
- NODE_ENV=production
networks:
- homepage_network
networks:
homepage_network:
driver: bridge
name: homepage_network

1
homepage/src Submodule

Submodule homepage/src added at 4f76ca5601

7
homepage/update.sh Executable file
View File

@@ -0,0 +1,7 @@
cd src
git pull
cd ..
podman-compose down
podman-compose up -d --build
cd ../proxy
podman-compose restart nginx-proxy

1
memos/.env.example Normal file
View File

@@ -0,0 +1 @@
MEMOS_URL=https://todo.domain.ru

16
memos/docker-compose.yml Normal file
View File

@@ -0,0 +1,16 @@
services:
memos:
image: docker.io/neosmemo/memos:stable
container_name: memos
restart: always
volumes:
- ./memos:/var/opt/memos
environment:
- MEMOS_INSTANCE_URL=${MEMOS_URL:?}
networks:
- memos_network
networks:
memos_network:
name: memos_network
driver: bridge

View File

@@ -5,3 +5,4 @@ git
cloud cloud
matrix matrix
chat chat
todo

View File

@@ -23,8 +23,11 @@ services:
networks: networks:
- proxy_network - proxy_network
- gitea_network - gitea_network
- cloud_network - disk_network
- matrix_network - matrix_network
- memos_network
- homepage_network
- cloud_network
certbot: certbot:
image: docker.io/certbot/certbot image: docker.io/certbot/certbot
@@ -71,9 +74,18 @@ networks:
gitea_network: gitea_network:
external: true external: true
name: gitea_network name: gitea_network
cloud_network: disk_network:
external: true external: true
name: cloud_network name: disk_network
matrix_network: matrix_network:
external: true external: true
name: matrix_network name: matrix_network
memos_network:
external: true
name: memos_network
homepage_network:
external: true
name: homepage_network
cloud_network:
external: true
name: cloud_network

Binary file not shown.

View File

@@ -2,7 +2,7 @@
server { server {
listen 80 default_server; listen 80 default_server;
listen [::]:80 default_server; listen [::]:80 default_server;
server_name domain.ru www.domain.ru git.domain.ru cloud.domain.ru m.domain.ru chat.domain.ru; server_name domain.ru www.domain.ru git.domain.ru disk.domain.ru cloud.domain.ru m.domain.ru chat.domain.ru todo.domain.ru draw.domain.ru;
location /.well-known/acme-challenge/ { location /.well-known/acme-challenge/ {
root /var/www/certbot; root /var/www/certbot;
@@ -23,10 +23,13 @@ server {
ssl_certificate /etc/letsencrypt/live/domain.ru/fullchain.pem; ssl_certificate /etc/letsencrypt/live/domain.ru/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/domain.ru/privkey.pem; ssl_certificate_key /etc/letsencrypt/live/domain.ru/privkey.pem;
location / { location / {
charset utf-8; proxy_pass http://homepage:4321;
default_type text/plain; proxy_set_header Host $host;
return 200 "Hello world!"; proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
} }
} }
@@ -38,6 +41,11 @@ server {
ssl_certificate /etc/letsencrypt/live/git.domain.ru/fullchain.pem; ssl_certificate /etc/letsencrypt/live/git.domain.ru/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/git.domain.ru/privkey.pem; ssl_certificate_key /etc/letsencrypt/live/git.domain.ru/privkey.pem;
# Меняем домашнюю страницу на страницу админа
location = / {
return 301 /username;
}
location / { location / {
proxy_pass http://gitea:3000; proxy_pass http://gitea:3000;
proxy_set_header Host $host; proxy_set_header Host $host;
@@ -47,13 +55,13 @@ server {
} }
} }
# 4. Cloud # 4. Disk
server { server {
listen 443 ssl; listen 443 ssl;
server_name cloud.domain.ru; server_name disk.domain.ru;
ssl_certificate /etc/letsencrypt/live/cloud.domain.ru/fullchain.pem; ssl_certificate /etc/letsencrypt/live/disk.domain.ru/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/cloud.domain.ru/privkey.pem; ssl_certificate_key /etc/letsencrypt/live/disk.domain.ru/privkey.pem;
client_max_body_size 0; client_max_body_size 0;
@@ -66,7 +74,77 @@ server {
} }
} }
# 4. Matrix # 5. Cloud
server {
listen 443 ssl;
server_name cloud.stepanovplaton.ru;
ssl_certificate /etc/letsencrypt/live/cloud.stepanovplaton.ru/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/cloud.stepanovplaton.ru/privkey.pem;
client_max_body_size 0;
location / {
proxy_pass http://nextcloud;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
server {
listen 443 ssl;
server_name office.stepanovplaton.ru;
ssl_certificate /etc/letsencrypt/live/office.stepanovplaton.ru/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/office.stepanovplaton.ru/privkey.pem;
location ^~ /browser {
proxy_pass http://nextcloud-collabora:9980;
proxy_set_header Host $host;
}
location ^~ /hosting/discovery {
proxy_pass http://nextcloud-collabora:9980;
proxy_set_header Host $host;
}
location ^~ /hosting/capabilities {
proxy_pass http://nextcloud-collabora:9980;
proxy_set_header Host $host;
}
location ~ ^/cool/(.*)/ws$ {
proxy_pass http://nextcloud-collabora:9980;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade"; # Явно указываем Upgrade
proxy_set_header Host $host;
proxy_read_timeout 36000s;
}
location ^~ /cool/adminws {
proxy_pass http://nextcloud-collabora:9980;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
proxy_set_header Host $host;
proxy_read_timeout 36000s;
}
location / {
proxy_pass http://nextcloud-collabora:9980;
proxy_set_header Host $host;
}
}
server {
listen 443 ssl;
server_name talk.stepanovplaton.ru;
ssl_certificate /etc/letsencrypt/live/talk.stepanovplaton.ru/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/talk.stepanovplaton.ru/privkey.pem;
location / {
return 200 "Nextcloud Talk TURN server not configured";
add_header Content-Type text/plain;
}
}
# 6. Matrix
server { server {
listen 443 ssl; listen 443 ssl;
server_name m.domain.ru; server_name m.domain.ru;
@@ -101,3 +179,22 @@ server {
client_max_body_size 50M; client_max_body_size 50M;
} }
} }
# 7. Memos
server {
listen 443 ssl;
server_name todo.domain.ru;
ssl_certificate /etc/letsencrypt/live/todo.domain.ru/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/todo.domain.ru/privkey.pem;
location / {
proxy_pass http://memos:5230;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
client_max_body_size 50M;
}
}

View File

Before

Width:  |  Height:  |  Size: 104 KiB

After

Width:  |  Height:  |  Size: 104 KiB

BIN
screenshots/memos.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 59 KiB

BIN
screenshots/nextcloud.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 80 KiB