Розробка внутрішніх інструментів на Appsmith
Appsmith — платформа з відкритим кодом для створення внутрішніх інструментів. На відміну від Retool, Appsmith повністю self-hosted і безплатна для необмеженої кількості користувачів. Вихідний код відкритий — можна форкнути та доробити.
Переваги Appsmith
- Self-hosted — дані не покидають вашу інфраструктуру
- Open-source — MIT ліцензія, немає vendor lock-in
- Docker-деплой за 5 хвилин
- Підтримка PostgreSQL, MySQL, MongoDB, REST API, GraphQL, Redis, S3
Встановлення
# Docker Compose
curl -L https://bit.ly/32jBNin -o $PWD/docker-compose.yml
docker-compose up -d
# Appsmith на http://localhost:80
# docker-compose.yml для продакшну
services:
appsmith:
image: index.docker.io/appsmith/appsmith-ee:latest
ports:
- "80:80"
- "443:443"
volumes:
- ./stacks:/appsmith-stacks
environment:
APPSMITH_ENCRYPTION_PASSWORD: "strong-random-password"
APPSMITH_ENCRYPTION_SALT: "random-salt"
APPSMITH_SUPERVISOR_TOKEN: "token"
restart: unless-stopped
Структура додатку
Appsmith-додаток складається з:
- Pages — окремі екрани (Dashboard, Users, Orders)
- Widgets — компоненти UI (Table, Form, Chart, Modal)
- Queries — запити до БД або API
- JSObjects — JavaScript для бізнес-логіки
Приклад: CRM-панель
// JSObject: userActions
export default {
// Блокування користувача з підтвердженням
async blockUser() {
const confirmed = await showAlert(
`Заблокувати ${usersTable.selectedRow.email}?`,
'confirm'
);
if (!confirmed) return;
await blockUserQuery.run({
userId: usersTable.selectedRow.id,
reason: blockReasonInput.text
});
showAlert('Користувач заблокований', 'success');
await getUsersQuery.run();
},
// Експорт у CSV
exportToCSV() {
const data = getUsersQuery.data.map(u => ({
Email: u.email,
Статус: u.status,
'Дата реєстрації': u.created_at
}));
download(data, 'users.csv', 'text/csv');
}
}
Ролевий доступ
Appsmith підтримує групи користувачів з різними правами на додаток: перегляд, редагування, публікація.
Терміни
Простий інструмент з CRUD-операціями — 2–4 дні. Багатосторінковий інструмент з ролями — 1–2 тижні.







