Skip to content

Commit a326a5f

Browse files
committed
feat: Finalise admin panel. Fix k8s. Add demo user portal
1 parent a433379 commit a326a5f

90 files changed

Lines changed: 9874 additions & 241 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.env_example

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,18 @@ ADMIN_USERNAME=admin
3434
ADMIN_PASSWORD=admin
3535
ADMIN_EMAIL=admin@example.tld
3636

37+
#Web Admin UI
38+
#cd stack/admin/app
39+
#php -r "echo password_hash('your_password', PASSWORD_BCRYPT, ['cost' => 12]) . PHP_EOL;"
40+
WEBADMIN_USERNAME='admin'
41+
WEBADMIN_PASSWORD='$2y$12$hTwdJQunSJJYEb/uA2ZH/e0wGdmR/LFtbIazPpaHh4gyixp6ouWW.'
42+
43+
#User Portal WebUI
44+
# Session secret: Generate with `openssl rand -hex 32`
45+
PORTAL_SESSION_SECRET=
46+
3747
#Version
38-
VER=v3.1.0
48+
VER=v3.2.0
3949

4050

4151

.github/workflows/push-all-images.yml

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -162,4 +162,24 @@ jobs:
162162
file: stack/tinymce-clean-server/tmcs.Dockerfile
163163
platforms: linux/amd64,linux/arm64
164164
push: true
165-
tags: uniuu/zotprime-tinymceclean:${{ env.VERSION }}
165+
tags: uniuu/zotprime-tinymceclean:${{ env.VERSION }}
166+
167+
-
168+
name: Build and push admin
169+
uses: docker/build-push-action@v5
170+
with:
171+
context: ./stack/admin
172+
file: stack/admin/admin.Dockerfile
173+
platforms: linux/amd64,linux/arm64
174+
push: true
175+
tags: uniuu/zotprime-admin:${{ env.VERSION }}
176+
177+
-
178+
name: Build and push portal
179+
uses: docker/build-push-action@v5
180+
with:
181+
context: ./stack/webui/portal
182+
file: stack/webui/portal/webui.Dockerfile
183+
platforms: linux/amd64,linux/arm64
184+
push: true
185+
tags: uniuu/zotprime-portal:${{ env.VERSION }}

.gitignore

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,14 @@ docker-compose-test.yml
1010
**/cred.json
1111
.vscode/
1212

13+
# Next.js / TypeScript
14+
node_modules
15+
.next
16+
out
17+
*.tsbuildinfo
18+
next-env.d.ts
19+
.env*.local
20+
1321
zotprime-k8s/microk8s/helm-chart/values.yaml
1422
zotprime-k8s/microk8s/helm-chart/values-*.yaml
1523
!zotprime-k8s/microk8s/helm-chart/values-example.yaml

bin/admin.sh

Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ if [ -f "$PROJECT_DIR/.env" ]; then
99
export $(grep -v '^#' "$PROJECT_DIR/.env" | xargs)
1010
fi
1111

12-
# Derive DSHOST from SERVER_IP
12+
# Default DSHOST from SERVER_IP
1313
DSHOST="http://${SERVER_IP:-127.0.0.1}:8080"
1414

1515
# Validate required env vars
@@ -24,7 +24,10 @@ usage() {
2424
cat <<EOF
2525
ZotPrime Admin Tool
2626
27-
Usage: $0 <resource> <action> [args...]
27+
Usage: $0 [--host <url>] <resource> <action> [args...]
28+
29+
Options:
30+
--host <url> Dataserver URL (default: http://127.0.0.1:8080)
2831
2932
Resources and Actions:
3033
user create <username> <email> <password> Create a new user
@@ -165,10 +168,10 @@ user_enable() {
165168
}
166169

167170
user_quota() {
168-
local mode=$1 user_id=$2
171+
local user_id=$1
169172

170173
if [ -z "$user_id" ]; then
171-
echo "Usage: $0 $mode user quota <user_id>" >&2
174+
echo "Usage: $0 user quota <user_id>" >&2
172175
exit 1
173176
fi
174177

@@ -328,23 +331,34 @@ group_members() {
328331
local group_id=$1
329332

330333
if [ -z "$group_id" ]; then
331-
echo "Usage: $0 <mode> group members <group_id>" >&2
334+
echo "Usage: $0 group members <group_id>" >&2
332335
exit 1
333336
fi
334337

335338
local response=$(api_call GET "groups/$group_id/users")
336339

337-
echo "UserID Role"
338-
echo "------ ------"
340+
# Get all users to map ID to username
341+
local users_response=$(curl -s -H "Authorization: Bearer $API_SUPER_TOKEN" \
342+
"${DSHOST}/admin/users")
343+
344+
echo "UserID Username Role"
345+
echo "------ ------------------ ------"
339346
echo "$response" | grep -oP '<xfer:user id="\K[^"]+' | while read uid; do
340347
local role=$(echo "$response" | grep "id=\"$uid\"" | grep -oP 'role="\K[^"]+')
341-
printf "%-6s %s\n" "$uid" "$role"
348+
local username=$(echo "$users_response" | jq -r ".[] | select(.userID==$uid) | .username")
349+
printf "%-6s %-18s %s\n" "$uid" "$username" "$role"
342350
done
343351
}
344352

345353
# Main
346354
[ $# -lt 2 ] && usage
347355

356+
# Parse --host flag
357+
if [ "$1" = "--host" ]; then
358+
DSHOST="$2"
359+
shift 2
360+
fi
361+
348362
RESOURCE=$1
349363
ACTION=$2
350364
shift 2

docker-compose-dev-arm.yml

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,28 @@ services:
112112
platforms:
113113
- linux/arm64
114114

115+
zotprime-admin:
116+
profiles: ["admin"]
117+
platform: linux/arm64
118+
image: "uniuu/zotprime-admin:${VER}-arm64"
119+
pull_policy: build
120+
build:
121+
context: ./stack/admin
122+
dockerfile: admin.Dockerfile
123+
platforms:
124+
- linux/arm64
125+
126+
zotprime-portal:
127+
profiles: ["portal"]
128+
platform: linux/arm64
129+
image: "uniuu/zotprime-portal:${VER}-arm64"
130+
pull_policy: build
131+
build:
132+
context: ./stack/webui/portal
133+
dockerfile: webui.Dockerfile
134+
platforms:
135+
- linux/arm64
136+
115137
zotprime-init:
116138
platform: linux/arm64
117139
image: "uniuu/zotprime-dataserver:${VER}-arm64"

docker-compose-dev.yml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,13 @@ services:
122122
context: ./stack/admin
123123
dockerfile: admin.Dockerfile
124124

125+
zotprime-portal:
126+
profiles: ["portal"]
127+
pull_policy: build
128+
build:
129+
context: ./stack/webui
130+
dockerfile: webui.Dockerfile
131+
125132
# zotprime-init:
126133
# build:
127134
# context: ./stack/init

docker-compose.yml

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -259,6 +259,7 @@ services:
259259
- API_SUPER_TOKEN=${API_SUPER_TOKEN}
260260
volumes:
261261
- /etc/localtime:/etc/localtime:ro
262+
- admin-data:/var/lib/admin-data
262263
depends_on:
263264
zotprime-dataserver:
264265
condition: service_started
@@ -268,11 +269,34 @@ services:
268269
networks:
269270
zotprime:
270271
ipv4_address: 10.5.5.12
272+
zotprime-portal:
273+
profiles: ["portal"]
274+
image: "uniuu/zotprime-portal:${VER}"
275+
ports:
276+
- "3045:3000"
277+
environment:
278+
- PORTAL_SESSION_SECRET=${PORTAL_SESSION_SECRET}
279+
- API_SUPER_TOKEN=${API_SUPER_TOKEN}
280+
- NODE_ENV=production
281+
volumes:
282+
- /etc/localtime:/etc/localtime:ro
283+
- ./stack/webui/portal/config.yaml:/app/config.yaml:ro
284+
depends_on:
285+
zotprime-dataserver:
286+
condition: service_started
287+
links:
288+
- zotprime-dataserver:dataserver
289+
restart: always
290+
networks:
291+
zotprime:
292+
ipv4_address: 10.5.5.13
271293
volumes:
272294
dbdata:
273295
driver: local
274296
miniodata:
275297
driver: local
298+
admin-data:
299+
driver: local
276300

277301
networks:
278302
zotprime:

docs/admin.md

Lines changed: 12 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,74 +1,52 @@
11
# Admin UI Setup
22

3-
## 1. Generate Password Hash
3+
## Docker Compose
44

5-
```bash
6-
cd stack/admin/app
7-
php -r "echo password_hash('your_password', PASSWORD_BCRYPT, ['cost' => 12]) . PHP_EOL;"
8-
```
9-
10-
## 2. Build Tailwind CSS
5+
### 1. Generate Password Hash
116

127
```bash
138
cd stack/admin/app
14-
curl -sLO https://github.com/tailwindlabs/tailwindcss/releases/latest/download/tailwindcss-linux-x64
15-
chmod +x tailwindcss-linux-x64
16-
./tailwindcss-linux-x64 -i ./resources/css/app.css -o ./public/css/app.css --minify
17-
rm tailwindcss-linux-x64
9+
php -r "echo password_hash('your_password', PASSWORD_BCRYPT, ['cost' => 12]) . PHP_EOL;"
1810
```
1911

20-
## 3. Add to `.env`
12+
### 2. Add to `.env`
2113

2214
```env
2315
WEBADMIN_USERNAME=admin
2416
WEBADMIN_PASSWORD=$2y$12$...hash_from_step_1...
2517
API_SUPER_TOKEN=your_existing_token
2618
```
2719

28-
## 4. Deploy
29-
30-
### Docker Compose
20+
### 3. Deploy:
3121

3222
```bash
3323
docker-compose --profile admin up -d
3424
```
3525

3626
Access: `http://localhost:8082/login`
3727

38-
### Kubernetes
28+
## K8s
3929

40-
Edit `zotprime-k8s/*/helm-chart/values.yaml`:
30+
### 1. Edit `zotprime-k8s/*/helm-chart/values.yaml`:
4131

4232
```yaml
4333
webAdmin:
4434
enabled: true # Set to false to disable
4535
username: "" # echo -n "admin" | base64
46-
password: "" # echo -n "$2y$12$...hash..." | base64
36+
password: "" # echo -n "...hash..." | base64 # where hash generated as in step 1 docker: php -r "echo password_hash('your_password', PASSWORD_BCRYPT, ['cost' => 12]) . PHP_EOL;"
37+
4738
```
4839

49-
Deploy:
40+
### 2. Deploy:
5041

5142
```bash
5243
helm upgrade zotprime-k8s helm-chart --namespace zotprime
5344
```
5445

5546
Access: `https://admin.yourdomain.com/login`
5647

57-
## 5. First Login
48+
## First Login
5849

5950
1. Enter username and password
6051
2. Scan QR code with Google Authenticator
61-
3. Enter 6-digit code
62-
63-
## Troubleshooting
64-
65-
```bash
66-
# Check logs
67-
docker logs zotprime-admin
68-
69-
# Verify Redis
70-
docker exec zotprime-admin redis-cli ping
71-
72-
# Check environment
73-
docker exec zotprime-admin env | grep WEBADMIN
74-
```
52+
3. Enter 6-digit code

stack/admin/admin.Dockerfile

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,10 @@
22
FROM php:8-fpm AS builder
33

44
# Install build dependencies
5-
RUN apt-get update && apt-get install -y curl unzip && rm -rf /var/lib/apt/lists/*
5+
RUN apt-get update && apt-get install -y curl unzip libyaml-dev && rm -rf /var/lib/apt/lists/*
6+
7+
# Install PHP extensions for build
8+
RUN pecl install yaml && docker-php-ext-enable yaml
69

710
# Install Composer
811
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer
@@ -15,10 +18,14 @@ RUN curl -sLO https://github.com/tailwindlabs/tailwindcss/releases/latest/downlo
1518
# Copy application
1619
WORKDIR /var/www/html
1720
COPY app/ .
21+
COPY config.yaml ../config.yaml
1822

1923
# Install Laravel dependencies
2024
RUN composer install --no-dev --optimize-autoloader
2125

26+
# # Generate APP_KEY
27+
# RUN php artisan key:generate --force
28+
2229
# Build Tailwind CSS
2330
RUN tailwindcss -i ./resources/css/app.css -o ./public/css/app.css --minify
2431

@@ -32,16 +39,19 @@ RUN useradd -m -u 1000 appuser
3239
RUN apt-get update && apt-get install -y \
3340
nginx \
3441
redis-server \
42+
libyaml-dev \
3543
&& rm -rf /var/lib/apt/lists/*
3644

3745
# Install PHP extensions
3846
RUN docker-php-ext-install pdo pdo_mysql \
39-
&& pecl install redis \
40-
&& docker-php-ext-enable redis
47+
&& pecl install redis yaml \
48+
&& docker-php-ext-enable redis yaml
4149

4250
# Copy application from builder
4351
WORKDIR /var/www/html
4452
COPY --from=builder --chown=appuser:appuser /var/www/html .
53+
COPY --chown=appuser:appuser config.yaml ../config.yaml
54+
COPY --chown=appuser:appuser entrypoint.sh /entrypoint.sh
4555

4656
# Copy configs
4757
COPY nginx/nginx.conf /etc/nginx/nginx.conf
@@ -51,10 +61,12 @@ COPY redis/redis.conf /etc/redis/redis.conf
5161
RUN chown -R appuser:appuser /var/www/html \
5262
&& chown -R appuser:appuser /var/log/nginx \
5363
&& chown -R appuser:appuser /var/lib/nginx \
54-
&& mkdir -p /run/php /var/run/redis \
55-
&& chown -R appuser:appuser /run/php /var/run/redis \
64+
&& chown -R appuser:appuser /etc/redis \
65+
&& mkdir -p /run/php /var/run/redis /var/lib/admin-data/redis /var/lib/admin-data/sqlite \
66+
&& chown -R appuser:appuser /run/php /var/run/redis /var/lib/admin-data \
5667
&& touch /run/nginx.pid \
57-
&& chown appuser:appuser /run/nginx.pid
68+
&& chown appuser:appuser /run/nginx.pid \
69+
&& chmod +x /entrypoint.sh
5870

5971
# Switch to non-root user
6072
USER appuser
@@ -63,4 +75,4 @@ USER appuser
6375
EXPOSE 8080
6476

6577
# Start services
66-
CMD ["/bin/sh", "-c", "redis-server /etc/redis/redis.conf --daemonize yes && php-fpm & nginx -g 'daemon off;'"]
78+
CMD ["/entrypoint.sh"]

0 commit comments

Comments
 (0)