GoSetup-bubble/confs/repko.yaml

531 lines
22 KiB
YAML
Raw Normal View History

2025-12-26 17:45:37 +05:00
---
name: "RepKo"
version: 1.0
description: "Сервер для управления собственным Debian репозиторием.
Позволяет работать с дистрибутивами и его компонентами, загружать пакеты, автоматически подписывать файлы Release для доступа apt."
icon: "_public/icons/repository.png"
type: "other"
conf-files:
- file: "_public/files/config.ini"
type: "ini"
name: "ini config"
- file: "_public/files/.env"
type: "env"
name: "env config"
- file: "_public/files/repko.service"
type: "service"
name: "app service"
- file: "_public/files/separated.repko.conf"
type: "nginx"
name: "nginx separated config"
- file: "_public/files/united.repko.conf"
type: "nginx"
name: "nginx united config"
variables:
- name: "user_type"
type: "string"
default: "Create"
- name: "repko_user"
type: "string"
default: "repko-user"
- name: "api_domain"
type: "string"
default: "api.repko.com"
- name: "panel_domain"
type: "string"
default: "panel.repko.com"
- name: "cookie_domain"
type: "string"
default: "repko.com"
- name: "is_secure"
type: "bool"
default: false
- name: "server_address"
type: "string"
default: "127.0.0.1:9988"
- name: "trusted_proxy"
type: "string"
default: "127.0.0.1,::1"
- name: "nginx_port"
type: "string"
default: "80"
- name: "ssl_type"
type: "string"
default: "path now"
- name: "ssl_cert_path"
type: "string"
default: "/etc/repko/ssl/repko.crt"
2025-12-26 17:45:37 +05:00
- name: "ssl_key_path"
type: "string"
default: "/etc/repko/ssl/repko.key"
- name: "database_type"
type: "string"
default: "sqlite"
- name: "database_host"
type: "string"
default: "localhost"
- name: "database_port"
type: "string"
default: "5435"
- name: "database_name"
type: "string"
default: "repkoDB"
- name: "database_user"
type: "string"
default: "root"
- name: "database_password"
type: "string"
default: "admin"
- name: "gpg_full_name"
type: "string"
default: "Repko Repository"
- name: "gpg_note"
type: "string"
default: "note"
- name: "gpg_mail"
type: "string"
default: "admin@repko.com"
- name: "gpg_key_id"
type: "string"
default: "123ABCD"
- name: "repko_login"
type: "string"
default: "admin_repko"
- name: "repko_pass"
type: "string"
default: "admin_repko"
2025-12-26 17:45:37 +05:00
- name: "debian_root"
type: "string"
default: "/var/www/repko/debian"
- name: "archive_root"
type: "string"
default: "/var/www/repko/archive"
sections:
- name: "Repko about"
type: "about"
description: "Описание приложения"
paragraphs:
- "# Repko - инновационное решение для создания и управления репозиториями Debian на собственном хостинге."
- "Разработан на языке GO,обеспечивает высокую производительность и надежность, подходит как для небольших проектов, так и для корпоративных сред."
- "## Ключевые особенности:"
- "- Гибкость хранения метаданных: поддержка PostgreSQl и SQLite"
- "- Автоматическая генерация debian структуры"
- "- Автоматическая подпись файлов Release"
- "- Высокая производительность и минимальное потребление ресурсов"
- "- Современный веб-интерфейс на Next.js"
actions:
- name: "Create directories"
type: "command"
command: "mkdir -p \
/etc/repko \
/var/log/repko \
/var/lib/repko \
/var/lib/repko/uploads \
/var/lib/repko/gnupg \
/var/www/repko \
/usr/share/keyrings \
/usr/share/ca-certificates/repko"
error: "не удалось создать необходимые директории"
2025-12-26 17:45:37 +05:00
- name: "user"
description: "Настройка данных пользователя"
fields:
- name: "choose_user"
variable-name: "user_type"
field-type: "select"
options:
- "Create"
- "Existing"
- name: "select_user"
variable-name: "repko_user"
field-type: "select"
special-value: "code:users"
description: "Выберите существующего пользователя"
condition: "user_type=='Existing'"
parent:
- "user_type"
- name: "new_user"
variable-name: "repko_user"
field-type: "input"
description: "Пользователь от которого будет запускаться программа"
condition: "user_type=='Create'"
parent:
- "user_type"
validate:
- rule: "regex_match(repko_user, `^[a-z][a-z0-9_-]*$`)"
message: "Только строчные латинские буквы, цифры, _, -"
- rule: "not user_exists(repko_user)"
message: "Пользователь существует"
actions:
- name: "create_user"
type: "command"
command: "adduser --system --group --no-create-home --disabled-password --shell /bin/false {{.repko_user}}"
2025-12-26 17:45:37 +05:00
condition: "user_type=='Create'"
run-as: "root"
require-packages:
- "adduser"
error: "Ошибка при создании пользователя"
- name: "Set directories ownership"
type: "command"
command: "chown -R {{.repko_user}}:{{.repko_user}} /var/log/repko /var/lib/repko /var/www/repko /etc/repko /var/lib/repko/gnupg"
error: "Ошибка установка владельца для директорий"
- name: "Set rights 755"
type: "command"
command: "chmod -R 755 /var/www/repko /usr/share/keyrings"
error: "Ошибка установки прав 755"
- name: "Set rights 750"
type: "command"
command: "chmod -R 750 /var/log/repko /var/lib/repko /etc/repko"
error: "ошибка установки прав 750"
- name: "Set rights 700"
type: "command"
command: "chmod -R 700 /var/lib/repko/gnupg"
error: "Ошибка установки прав 700"
2025-12-26 17:45:37 +05:00
- name: "domain"
description: "Настройка используемых доменов"
fields:
- name: "api_domain"
variable-name: "api_domain"
field-type: "input"
description: "Домен на котором будет работать api"
validate:
- rule: "regex_match(api_domain,`^[a-zA-Z0-9.-]+$`)"
message: "Только латинские буквы, цифры, -, '.'"
2025-12-26 17:45:37 +05:00
- name: "panel_domain"
variable-name: "panel_domain"
field-type: "input"
description: "Домен на котором будет работать сайт"
validate:
- rule: "regex_match(api_domain,`^[a-zA-Z0-9.-]+$`)"
message: "Только латинские буквы, цифры, -, '.'"
2025-12-26 17:45:37 +05:00
- name: "cookie_domain"
variable-name: "cookie_domain"
description: "Домен для куки"
field-type: "compute"
parent:
- "panel_domain"
- "api_domain"
compute: |
api_domain == panel_domain ? api_domain :
regex(api_domain, `^.*\.([a-zA-Z0-9-]+\.[a-zA-Z]{2,})$`, '$1') !=
regex(panel_domain, `^.*\.([a-zA-Z0-9-]+\.[a-zA-Z]{2,})$`, '$1') ?
error("Разные корневые домены") :
regex(api_domain, `^.*\.([a-zA-Z0-9-]+\.[a-zA-Z]{2,})$`, '$1')
- name: "is_secure"
variable-name: "is_secure"
field-type: "check"
description: "Использовать SSL"
- name: "server_address"
variable-name: "server_address"
field-type: "input"
description: "Адрес сервера"
validate:
- rule: "regex_match(server_address,`^[a-zA-Z0-9.-]+:[0-9]+$`)"
message: "Неверный формат, host:port, host только латиница,цифры, тире, '.', port только цифры"
- rule: "port_free( regex(server_address, `^.*:([0-9]+)$`, `$1`) )"
message: "Порт занят"
- name: "trusted_proxy"
variable-name: "trusted_proxy"
description: "Доверенные прокси"
field-type: "compute"
parent:
- "server_address"
compute: split(server_address,":")[0]
2025-12-26 17:45:37 +05:00
- name: "ssl"
description: "Настройка ssl"
condition: "is_secure == true"
parent:
- "is_secure"
fields:
- name: "ssl_type"
variable-name: "ssl_type"
field-type: "select"
options:
- "path later"
- "path now"
- "self-signed"
- "lets encrypt"
- name: "ssl_cert_path"
variable-name: "ssl_cert_path"
field-type: "file"
file-field-extensions:
- ".crt"
- ".cer"
- ".pem"
description: "Путь к ssl сертификату"
condition: "ssl_type=='path now'"
parent:
- "ssl_type"
validate:
- rule: "file_exists(ssl_cert_path)"
message: "Файл не существует"
2025-12-26 17:45:37 +05:00
- name: "ssl_key_path"
variable-name: "ssl_key_path"
field-type: "file"
file-field-extensions:
- ".key"
description: "Путь к ssl ключу"
condition: "ssl_type=='path now'"
parent:
- "ssl_type"
validate:
- rule: "file_exists(ssl_key_path)"
message: "Файл не существует"
2025-12-26 17:45:37 +05:00
actions:
- name: "create_ssl_repko_dir"
type: "command"
command: "mkdir -p /usr/share/ca-certificates/repko"
condition: "ssl_type == 'self-signed'"
run-as: "root"
error: "Ошибка при создании директории для сертификатов"
- name: "generate_self_signed" #тут
2025-12-26 17:45:37 +05:00
type: "command"
command: |
openssl req -x509 -nodes -days 365 \
-newkey rsa:2048 \
-keyout {{.ssl_key_path}} \
-out {{.ssl_cert_path}} \
-subj "/CN={{.api_domain}}"
2025-12-26 17:45:37 +05:00
condition: "ssl_type == 'self-signed'"
run-as: "root"
error: "Не удалось сгенерировать сертификат через openssl"
- name: "Set owner for key"
type: "command"
command: "chown root:root {{.ssl_key_path}}"
condition: "ssl_type == 'self-signed'"
error: "Ошибка установки владельца ключа"
- name: "Set rights 600 for key"
type: "command"
command: "chmod 600 {{.ssl_key_path}}"
condition: "ssl_type == 'self-signed'"
error: "Ошибка установки прав ключа"
2025-12-26 17:45:37 +05:00
- name: "run_certbot"
type: "command"
command: "certbot --nginx -d {{.api_domain}} -d {{.panel_domain}} --non-interactive --agree-tos -m admin@{{.api_domain}}"
2025-12-26 17:45:37 +05:00
condition: "ssl_type == 'lets encrypt'"
require-packages:
- "nginx"
- "certbot"
run-as: "root"
error: "Ошибка при генерации сертификата через lets encrypt"
- name: "update_ca_certificates"
type: "command"
command: "update_ca_certificates"
run-as: "root"
error: "Не удалось обновить сертификаты"
condition: "ssl_type != 'path later'"
2025-12-26 17:45:37 +05:00
- name: "database"
description: "Настройка используемой базы данных"
fields:
- name: "database_type"
variable-name: "database_type"
field-type: "select"
options:
- "sqlite"
- "postgres"
description: "Используемая база данных"
- name: "database_host"
variable-name: "database_host"
field-type: "input"
description: "Адрес база данных"
condition: "database_type=='postgres'"
parent:
- "database_type"
validate:
- rule: "regex_match(database_host,`^[a-zA-Z0-9.-]+$`)"
message: "Только латинские буквы, цифры, -, '.'"
2025-12-26 17:45:37 +05:00
- name: "database_port"
variable-name: "database_port"
field-type: "input"
description: "Порт база данных"
condition: "database_type=='postgres'"
parent:
- "database_type"
validate:
- rule: "regex_match(database_host,`^[0-9]+$`)"
message: "Только цифры"
2025-12-26 17:45:37 +05:00
- name: "database_name"
variable-name: "database_name"
field-type: "input"
description: "Имя базы данных"
condition: "database_type=='postgres'"
parent:
- "database_type"
validate:
- rule: "regex_match(database_name,`^[a-zA-Z0-9_-]+$`)"
message: "Только латинские буквы, цифры, -, _"
2025-12-26 17:45:37 +05:00
- name: "database_user"
variable-name: "database_user"
field-type: "input"
description: "Имя пользователя база данных"
condition: "database_type=='postgres'"
parent:
- "database_type"
validate:
- rule: "regex_match(database_user,`^[a-zA-Z0-9_-]+$`)"
message: "Только латинские буквы, цифры, -, _"
2025-12-26 17:45:37 +05:00
- name: "database_password"
variable-name: "database_password"
field-type: "input"
description: "Пароль база данных"
condition: "database_type=='postgres'"
parent:
- "database_type"
validate:
- rule: "database_password!=''"
message: "Поле не может быть пустым"
- name: "gpg"
description: "Настройка gpg"
condition: "not file_exists('/var/lib/repko/gnupg/pubring.kbx')"
fields:
- name: "gpg name"
variable-name: "gpg_full_name"
field-type: "input"
description: "Полное имя для gpg ключа"
validate:
- rule: "gpg_full_name!=''"
message: "Поле не может быть пустым"
- rule: "regex_match(gpg_full_name,`^[a-zA-z0-9 .-]+$`)"
message: "Только латинские буквы, цифры, -, _, ' '"
- name: "gpg note"
variable-name: "gpg_note"
field-type: "input"
description: "Описание для gpg ключа"
validate:
- rule: "regex_match(gpg_note,`^[a-zA-Z0-9 .-]*$`)"
message: "Только латинские буквы, цифры, -, _, ' ' либо пустое"
- name: "gpg mail"
variable-name: "gpg_mail"
field-type: "input"
description: "Почта для gpg ключа"
validate:
- rule: "gpg_mail!=''"
message: "Поле не может быть пустым"
- rule: "regex_match(gpg_mail,`^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+.[a-zA-Z]{2,}$`)"
message: "Не соответствует формату почты"
actions:
- name: "generate gpg key"
type: "command"
command: "sudo -u {{.repko_user}} gpg --homedir /var/lib/repko/gnupg --batch --passphrase '' --quick-generate-key '{{.gpg_full_name}} ({{.gpg_note}}) <{{.gpg_mail}}>' rsa4096"
error: "Не удалось создать ключ"
- name: "get gpg key id"
type: "command"
command: "sudo -u {{.repko_user}} gpg --homedir /var/lib/repko/gnupg --list-keys --with-colons | grep pub | cut -d: -f5"
error: "Не удалось получить и сохранить id gpg ключа"
assign-to: "gpg_key_id"
- name: "export gpg key"
type: "command"
command: "sudo -u {{.repko_user}} gpg --homedir /var/lib/repko/gnupg --armor --export '{{.gpg_key_id}}!' 2>/dev/null > /usr/share/keyrings/repko.asc"
error: "Не удалось экспортировать gpg ключ"
- name: "write gpg key id"
type: "command"
command: "echo {{.gpg_key_id}} > /etc/repko/keyid"
error: "не удалось записать gpg key id в файл keyid"
- name: "set owner for exported key"
type: "command"
command: "chown -R root:root /usr/share/keyrings/repko.asc"
error: "Ошибка установки владельца файла экспортированного ключа"
- name: "set owner for keyid file"
type: "command"
command: "chown -R {{.repko_user}}:{{.repko_user}} /etc/repko/keyid"
error: "Ошибка установки владельца файла id ключа"
- name: "set rights for keys"
type: "command"
command: "chmod 644 /usr/share/keyrings/repko.asc /etc/repko/keyid"
error: "Ошибка установки прав для ключей"
- name: "basic auth"
description: "Настройка базовой аутентификации"
fields:
- name: "repko login"
variable-name: "repko_login"
field-type: "input"
description: "Логин для входа на сайт"
validate:
- rule: "regex_match(repko_login,`^[a-zA-Z0-9_-]+$`)"
message: "Только строчные латинские буквы, цифры, _, -"
- name: "repko pass"
variable-name: "repko_pass"
field-type: "input"
description: "Пароль для входа на сайт"
validate:
- rule: "repko_pass!=''"
message: "Пароль не должен быть пустым"
actions:
- name: "generate htpasswd"
type: "command"
command: "htpasswd -c -b /etc/repko/.htpasswd {{.repko_login}} {{.repko_pass}}"
error: "Не удалось создать файл htpasswd"
- name: "set htpasswd owner"
type: "command"
command: "chown {{.repko_user}}:{{.repko_user}} /etc/repko/.htpasswd"
error: "Ошибка установки владельца файла "
- name: "set rights for htpasswd "
type: "command"
command: "chmod 640 /etc/repko/.htpasswd"
error: "Ошибку установки прав для файла"
2025-12-26 17:45:37 +05:00
- name: "paths"
description: "Настройка директорий"
fields:
- name: "debian_root"
variable-name: "debian_root"
field-type: "directory"
description: "Директория debian"
- name: "archive_root"
variable-name: "archive_root"
field-type: "directory"
description: "Директория архива debian"
actions:
- name: "create debian and archive dir"
type: "command"
command: "mkdir -p {{.debian_root}} {{.archive_root}}"
error: "Ошибка создания папок debian и archive"
- name: "set ownership for debian and archive dir"
type: "command"
command: "chown -R {{.repko_user}}:{{.repko_user}} {{.debian_root}} {{.archive_root}}"
error: "ошибка установки владельца для папок debian и archive"
- name: "set rights for debian and archive dir"
type: "command"
command: "chmod -R 755 {{.debian_root}} {{.archive_root}}"
error: "ошибка установки прав для папок debian и archive"
2025-12-26 17:45:37 +05:00
- name: "finale"
description: "Последний этап, проверьте правильность введенных данных"
type: "final"
actions:
- name: "update_united_nginx_conf"
type: "file_template"
condition: "api_domain==panel_domain"
file-source: "/opt/repko/donors/united.repko.conf"
file-target: "/etc/nginx/sites-available/repko.conf"
error: "Ошибка при создании файла united nginx conf"
2025-12-26 17:45:37 +05:00
- name: "update_separated_nginx_conf"
type: "file_template"
condition: "api_domain !=panel_domain"
file-source: "/opt/repko/donors/separated.repko.conf"
file-target: "/etc/nginx/sites-available/repko.conf"
error: "Ошибка при создании файла separated nginx conf"
2025-12-26 17:45:37 +05:00
- name: "update_repko_service"
type: "file_template"
file-source: "/opt/repko/donors/repko.service"
file-target: "/etc/systemd/system/repko.service"
error: "Ошибка при создании файла repko service"
2025-12-26 17:45:37 +05:00
- name: "update_repko_ini"
type: "file_template"
file-source: "/opt/repko/donors/config.ini"
file-target: "/etc/repko/config.ini"
error: "Ошибка при создании файла repko config"
- name: "update_web_config"
type: "file_template"
file-source: "/opt/repko/donors/config.json"
file-target: "/var/www/repko/web/config.json"
error: "Ошибка при создании файла repko web config"
- name: "Set files ownership"
type: "command"
command: "chown {{.repko_user}}:{{.repko_user}} /opt/repko/repko /opt/repko/.env /etc/repko/config.ini"
error: "Ошибка установка владельца для файлов"
- name: "Set rights 750"
type: "command"
command: "chmod 750 /opt/repko/repko"
error: "Ошибка установки прав 750"
- name: "Set rights 640"
type: "command"
command: "chmod 640 /opt/repko/.env /etc/repko/config.ini"
error: "Ошибка установки прав 640"