Initial commit

This commit is contained in:
Никита Сычев
2026-01-03 23:09:01 +01:00
commit d0cb02102e
14 changed files with 389 additions and 0 deletions
+7
View File
@@ -0,0 +1,7 @@
secrets/*
!secrets/.gitkeep
*.tar.gz
*.tar
.DS_Store
+25
View File
@@ -0,0 +1,25 @@
stages:
- build
build-images:
stage: build
image: repo.nstart.local/nstart/docker-cli-buildx:1.0.0
services:
- name: repo.nstart.local/nstart/docker-dind-ca:1.0.0
alias: docker
command: ["--tls=false"]
variables:
DOCKER_HOST: tcp://docker:2375
DOCKER_TLS_CERTDIR: ""
parallel:
matrix:
- BAKE_TARGET:
- server
- backup
- proxy
script:
- echo $REGISTRY_PASSWORD | docker login -u $REGISTRY_USER --password-stdin $REGISTRY
- docker bake "$BAKE_TARGET" -f docker-bake.hcl --no-cache --push
only:
- master
+101
View File
@@ -0,0 +1,101 @@
# Развертывание Vaultwarden
Vaultwarden — это менеджер паролей с открытым исходным кодом, который позволяет
безопасно хранить и управлять вашими паролями, логинами и другими
конфиденциальными данными.
## Сборка OCI-образа
Для сборки необходимо выполнить команду:
```sh
docker bake all
```
Загрузка образов в реестр:
```sh
docker bake all --push
```
## Экспорт образов в tar
Для экспорта необходимо выполнить команду:
```sh
docker bake save
```
Архивы будут находиться в директории **dist**
## Генерация Argon2-хеша токена
Для безопасного хранения ADMIN_TOKEN вместо простого текста используется
Argon2id-PHC.
Перед первым запуском необходимо сгенерировать секрет с Argon2-хеш секретного
токена.Для этого необходимо выполнить команду находясь в директории проекта:
```sh
docker run --rm -ti \
nstart/vaultwarden-server:1.0.1 \
/vaultwarden hash --preset owasp \
| tee >(grep 'ADMIN_TOKEN=' > secrets/vw_admin_token.txt)
```
## Переменные окружения
Перед запуском нужно сформировать файлы с секретами.
| Файл | Переменная окружения | Описание |
| ---------------------------- | -------------------- | ---------------------------- |
| ./secrets/vw_admin_token.txt | ADMIN_TOKEN | Argon2id-PHC хеш админ-токен |
| ./secrets/vw_sso_secret.txt | SSO_CLIENT_SECRET | Секрет клиента OIDC/SSO |
## Запуск и остановка
Для запуска необходимо выполнить команду находясь в директории проекта:
```sh
docker compose up -d
```
Для остановки необходимо выполнить команду находясь в директории проекта:
```sh
docker compose down
```
## Доступ к панели администратора (/admin)
В целях безопасности закрыт прямой доступ к панели администрирования.
Чтобы открыть панель локально на своей машине, можно установить SSH-туннель:
```sh
ssh -L 8080:localhost:8080 root@srvvw01.nstart.local
```
и в браузер открыть <http://localhost:8080/admin>
## Резервное копирование
Резервная копия упаковывает в **.tar.gz.**:
- всего именованного volume **vaultwarden-data**
- секретов
По умолчанию резервное копирование делается каждый день в 3 часа ночи.
Сохраняются последние 30 копий.
Результаты резервного копирования хранятся в именованном volume
**vaultwarden-backup**.
Для изменения времени и частоты и расписания резервного копирования необходимо
поправить файл **backup/crontab**.
> ВНИМАНИЕ!!!!! Отправку резервных копий на удаленный сервер необходимо
настраивать сторонними средствами.
В качестве планировщика используется Supercronic — специализированный
планировщик для контейнеров, не требующий дополнительных прав.
+12
View File
@@ -0,0 +1,12 @@
ARG BASE_REPO="repo.nstart.local/"
FROM ${BASE_REPO}library/alpine:3.22.1
LABEL org.opencontainers.image.title="VaultWarden backup" \
org.opencontainers.image.description="Supercronic VaultWarden backup."
RUN apk add --no-cache supercronic tar
COPY --chmod=0755 backup.sh /usr/local/bin/backup.sh
COPY --chmod=0644 crontab /etc/supercronic/crontab
CMD ["/usr/bin/supercronic", "/etc/supercronic/crontab"]
+11
View File
@@ -0,0 +1,11 @@
#!/bin/sh
set -euo pipefail
find /backup -type f -name 'vaultwarden-*.tar.gz' -mtime +30 -print -delete
TIMESTAMP=$(date +'%Y%m%d_%H%M')
DEST="/backup/vaultwarden-${TIMESTAMP}.tar.gz"
tar czf "$DEST" -C /data .
echo "[backup] Created $DEST"
+2
View File
@@ -0,0 +1,2 @@
# Ежедневный запуск в 03:00
0 3 * * * /usr/local/bin/backup.sh >> /var/log/cron.log 2>&1
View File
+62
View File
@@ -0,0 +1,62 @@
variable "registry" {
default = "repo.nstart.local"
}
variable "base_repo" {
default = "repo.nstart.local/"
}
variable "VERSION" {
default = "1.0.1"
}
function "oci_labels" {
params = [name]
result = {
"org.opencontainers.image.version" = VERSION,
"org.opencontainers.image.vendor" = "New Start",
"org.opencontainers.image.authors" = "Sychev Nikita <Sychev.NA@nstart.space>",
}
}
function "image_ref" {
params = [name]
result = registry != "" ? "${registry}/nstart/vaultwarden-${name}" : "nstart/vaultwarden-${name}"
}
target "image" {
name = combo.image
matrix = {
combo = [
{ image = "server" },
{ image = "backup" },
{ image = "proxy" }
]
}
platforms = ["linux/amd64"]
output = ["type=image"]
attest = [
"type=sbom,generator=${registry}/docker/buildkit-syft-scanner:stable-1",
"type=provenance,mode=max"
]
context = combo.image
dockerfile = "Dockerfile"
args = {
BASE_REPO = base_repo
}
tags = [
"${image_ref(combo.image)}:${VERSION}",
"${image_ref(combo.image)}:latest",
]
labels = oci_labels(combo.image)
}
group "all" {
targets = ["image"]
}
+53
View File
@@ -0,0 +1,53 @@
services:
vaultwarden:
image: repo.nstart.local/nstart/vaultwarden-server:1.0.1
container_name: vaultwarden-server
restart: unless-stopped
env_file:
- ./secrets/vw_admin_token.txt
- ./secrets/vw_sso_secret.txt
volumes:
- vaultwarden-data:/data
networks:
- vaultwarden
proxy:
image: repo.nstart.local/nstart/vaultwarden-proxy:1.0.1
container_name: vaultwarden-proxy
restart: unless-stopped
depends_on:
vaultwarden:
condition: service_healthy
ports:
- 8080:8080
networks:
- vaultwarden
backup:
image: repo.nstart.local/nstart/vaultwarden-backup:1.0.1
container_name: vaultwarden-backup
restart: unless-stopped
depends_on:
vaultwarden:
condition: service_healthy
volumes:
- vaultwarden-backup:/backup
- vaultwarden-data:/data/vaultwarden:ro
- ./secrets:/data/secrets:ro
networks:
- vaultwarden
volumes:
vaultwarden-data:
name: vaultwarden-data
vaultwarden-backup:
name: vaultwarden-backup
networks:
vaultwarden:
driver: bridge
name: vaultwarden
ipam:
driver: default
config:
- subnet: 172.30.0.0/24
+13
View File
@@ -0,0 +1,13 @@
ARG BASE_REPO="repo.nstart.local/"
FROM ${BASE_REPO}library/nginx:1.29.1-alpine
LABEL org.opencontainers.image.title="VaultWarden proxy" \
org.opencontainers.image.description="NGINX VaultWarden proxy."
COPY vaultwarden.conf /etc/nginx/conf.d/
HEALTHCHECK --interval=30s --timeout=3s CMD nginx -t || exit 1
EXPOSE 8080
CMD ["nginx", "-g", "daemon off;"]
+33
View File
@@ -0,0 +1,33 @@
upstream vaultwarden_upstream {
server vaultwarden-server:80;
keepalive 2;
}
map $http_upgrade $connection_upgrade {
default upgrade;
'' "";
}
server {
listen 8080;
server_name _;
client_max_body_size 525M;
proxy_http_version 1.1;
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;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
location /admin {
allow 172.30.0.0/24;
deny all;
proxy_pass http://vaultwarden_upstream;
}
location / {
proxy_pass http://vaultwarden_upstream;
}
}
View File
+11
View File
@@ -0,0 +1,11 @@
ARG BASE_REPO="repo.nstart.local/"
FROM ${BASE_REPO}vaultwarden/server:testing-alpine
LABEL org.opencontainers.image.title="VaultWarden server" \
org.opencontainers.image.description="NStart VaultWarden server."
COPY config.json /data/config.json
HEALTHCHECK --interval=15s --timeout=10s CMD /healthcheck.sh || exit 1
CMD ["/start.sh"]
+59
View File
@@ -0,0 +1,59 @@
{
"domain": "https://vaultwarden.nstart.local",
"sends_allowed": true,
"incomplete_2fa_time_limit": 3,
"disable_icon_download": true,
"signups_allowed": false,
"signups_verify": false,
"signups_verify_resend_time": 3600,
"signups_verify_resend_limit": 6,
"invitations_allowed": false,
"emergency_access_allowed": false,
"email_change_allowed": false,
"password_iterations": 600000,
"password_hints_allowed": false,
"show_password_hint": false,
"invitation_org_name": "АО Новый Старт",
"ip_header": "X-Forwarded-For",
"icon_redirect_code": 302,
"icon_cache_ttl": 0,
"icon_cache_negttl": 259200,
"icon_download_timeout": 10,
"http_request_block_non_global_ips": true,
"disable_2fa_remember": true,
"authenticator_disable_time_drift": false,
"require_device_email": false,
"reload_templates": false,
"log_timestamp_format": "%Y-%m-%d %H:%M:%S.%3f",
"admin_session_lifetime": 20,
"increase_note_size_limit": false,
"sso_enabled": true,
"sso_only": true,
"sso_client_id": "vaultwarden",
"sso_authority": "https://auth.nstart.space/realms/nstart",
"sso_signups_match_email": true,
"sso_allow_unknown_email_verification": false,
"sso_scopes": "openid email profile",
"sso_pkce": true,
"sso_callback_path": "/identity/connect/oidc-signin",
"sso_auth_only_not_session": false,
"sso_client_cache_expiration": 0,
"sso_debug_tokens": false,
"_enable_yubico": false,
"_enable_duo": false,
"_enable_smtp": false,
"use_sendmail": false,
"smtp_security": "starttls",
"smtp_port": 587,
"smtp_from_name": "Vaultwarden",
"smtp_timeout": 15,
"smtp_embed_images": true,
"smtp_accept_invalid_certs": false,
"smtp_accept_invalid_hostnames": false,
"_enable_email_2fa": false,
"email_token_size": 6,
"email_expiration_time": 600,
"email_attempts_limit": 3,
"email_2fa_enforce_on_verified_invite": false,
"email_2fa_auto_fallback": false
}