mirror of
https://codeberg.org/likwid/likwid.git
synced 2026-03-26 19:03:08 +00:00
docs(ops): standardize on podman compose
This commit is contained in:
parent
33311c51c8
commit
3b1f8aa177
20 changed files with 269 additions and 266 deletions
|
|
@ -18,7 +18,7 @@
|
||||||
- MSVC toolchain for Rust
|
- MSVC toolchain for Rust
|
||||||
|
|
||||||
**Linux:**
|
**Linux:**
|
||||||
- podman-compose
|
- podman compose
|
||||||
|
|
||||||
### Quick Setup
|
### Quick Setup
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -44,7 +44,7 @@ cp compose/.env.production.example compose/.env.production
|
||||||
|
|
||||||
# 4. Deploy
|
# 4. Deploy
|
||||||
cd compose
|
cd compose
|
||||||
podman-compose --env-file .env.production -f production.yml up -d
|
podman compose --env-file .env.production -f production.yml up -d
|
||||||
|
|
||||||
# 5. Access at http://localhost:4321
|
# 5. Access at http://localhost:4321
|
||||||
```
|
```
|
||||||
|
|
@ -57,7 +57,7 @@ cp compose/.env.demo.example compose/.env.demo
|
||||||
|
|
||||||
# 2. Deploy
|
# 2. Deploy
|
||||||
cd compose
|
cd compose
|
||||||
podman-compose --env-file .env.demo -f demo.yml up -d
|
podman compose --env-file .env.demo -f demo.yml up -d
|
||||||
|
|
||||||
# 3. Access at http://localhost:4322
|
# 3. Access at http://localhost:4322
|
||||||
```
|
```
|
||||||
|
|
@ -105,8 +105,8 @@ To reset the demo to a clean state:
|
||||||
./scripts/demo-reset.sh
|
./scripts/demo-reset.sh
|
||||||
|
|
||||||
# Or manually:
|
# Or manually:
|
||||||
podman-compose --env-file compose/.env.demo -f compose/demo.yml down -v
|
podman compose --env-file compose/.env.demo -f compose/demo.yml down -v
|
||||||
podman-compose --env-file compose/.env.demo -f compose/demo.yml up -d
|
podman compose --env-file compose/.env.demo -f compose/demo.yml up -d
|
||||||
```
|
```
|
||||||
|
|
||||||
## Configuration Reference
|
## Configuration Reference
|
||||||
|
|
@ -141,7 +141,7 @@ For local development without containers:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# 1. Start only the database
|
# 1. Start only the database
|
||||||
podman-compose -f compose/dev.yml up -d
|
podman compose -f compose/dev.yml up -d
|
||||||
|
|
||||||
# 2. Configure backend environment
|
# 2. Configure backend environment
|
||||||
cp backend/.env.example backend/.env
|
cp backend/.env.example backend/.env
|
||||||
|
|
@ -159,10 +159,10 @@ npm run dev
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# View all logs
|
# View all logs
|
||||||
podman-compose --env-file compose/.env.demo -f compose/demo.yml logs -f
|
podman compose --env-file compose/.env.demo -f compose/demo.yml logs -f
|
||||||
|
|
||||||
# View specific service
|
# View specific service
|
||||||
podman-compose --env-file compose/.env.demo -f compose/demo.yml logs -f backend
|
podman compose --env-file compose/.env.demo -f compose/demo.yml logs -f backend
|
||||||
|
|
||||||
# Check health
|
# Check health
|
||||||
curl http://localhost:3001/health
|
curl http://localhost:3001/health
|
||||||
|
|
@ -173,10 +173,10 @@ curl http://localhost:3001/health
|
||||||
### Database connection issues
|
### Database connection issues
|
||||||
```bash
|
```bash
|
||||||
# Check if postgres is running
|
# Check if postgres is running
|
||||||
podman-compose --env-file compose/.env.demo -f compose/demo.yml ps
|
podman compose --env-file compose/.env.demo -f compose/demo.yml ps
|
||||||
|
|
||||||
# View postgres logs
|
# View postgres logs
|
||||||
podman-compose --env-file compose/.env.demo -f compose/demo.yml logs postgres
|
podman compose --env-file compose/.env.demo -f compose/demo.yml logs postgres
|
||||||
```
|
```
|
||||||
|
|
||||||
### Migration failures
|
### Migration failures
|
||||||
|
|
@ -194,6 +194,6 @@ SELECT * FROM _sqlx_migrations;
|
||||||
### Reset everything
|
### Reset everything
|
||||||
```bash
|
```bash
|
||||||
# Nuclear option - removes all data and volumes
|
# Nuclear option - removes all data and volumes
|
||||||
podman-compose --env-file compose/.env.demo -f compose/demo.yml down -v
|
podman compose --env-file compose/.env.demo -f compose/demo.yml down -v
|
||||||
podman-compose --env-file compose/.env.demo -f compose/demo.yml up -d
|
podman compose --env-file compose/.env.demo -f compose/demo.yml up -d
|
||||||
```
|
```
|
||||||
|
|
|
||||||
314
README.md
314
README.md
|
|
@ -1,157 +1,157 @@
|
||||||
# Likwid - Modular Governance Platform
|
# Likwid - Modular Governance Platform
|
||||||
|
|
||||||
## Composable Governance Infrastructure
|
## Composable Governance Infrastructure
|
||||||
|
|
||||||
A modular toolkit for deliberation, voting, delegation, moderation, and plugins — configure what you need per community.
|
A modular toolkit for deliberation, voting, delegation, moderation, and plugins — configure what you need per community.
|
||||||
|
|
||||||
Likwid is an open-source platform for participatory governance. Assemble decision-making workflows from modular building blocks: deliberation, voting methods, delegation, moderation, and plugins.
|
Likwid is an open-source platform for participatory governance. Assemble decision-making workflows from modular building blocks: deliberation, voting methods, delegation, moderation, and plugins.
|
||||||
|
|
||||||
> *"We are citizens of the 21st century, but we rely on institutions designed in the 19th century, through means designed in the 13th century. The problem is not democracy, it's the interface."*
|
> *"We are citizens of the 21st century, but we rely on institutions designed in the 19th century, through means designed in the 13th century. The problem is not democracy, it's the interface."*
|
||||||
|
|
||||||
## Philosophy
|
## Philosophy
|
||||||
|
|
||||||
Likwid implements a set of principles for **modular governance infrastructure**:
|
Likwid implements a set of principles for **modular governance infrastructure**:
|
||||||
|
|
||||||
- **Information must be understandable**, not just available
|
- **Information must be understandable**, not just available
|
||||||
- **Listening matters more than speaking** — structured deliberation over flame wars
|
- **Listening matters more than speaking** — structured deliberation over flame wars
|
||||||
- **Voting should express nuance** — from simple approval to Schulze and quadratic methods
|
- **Voting should express nuance** — from simple approval to Schulze and quadratic methods
|
||||||
- **Delegation should be fluid** — trust networks that adapt in real-time
|
- **Delegation should be fluid** — trust networks that adapt in real-time
|
||||||
- **Governance should be composable** — workflows assembled from modules, not imposed
|
- **Governance should be composable** — workflows assembled from modules, not imposed
|
||||||
|
|
||||||
## Features
|
## Features
|
||||||
|
|
||||||
### Deliberative Democracy
|
### Deliberative Democracy
|
||||||
|
|
||||||
- **Inform → Discuss → Decide** workflow for proposals
|
- **Inform → Discuss → Decide** workflow for proposals
|
||||||
- Resource libraries for informed participation
|
- Resource libraries for informed participation
|
||||||
- Optional facilitator role on proposals
|
- Optional facilitator role on proposals
|
||||||
- "Read before discuss" requirements
|
- "Read before discuss" requirements
|
||||||
- Comment reactions for quality signals (agree/disagree/insightful/constructive/off-topic)
|
- Comment reactions for quality signals (agree/disagree/insightful/constructive/off-topic)
|
||||||
|
|
||||||
### Advanced Voting Methods
|
### Advanced Voting Methods
|
||||||
|
|
||||||
- **Approval Voting** — vote for multiple options
|
- **Approval Voting** — vote for multiple options
|
||||||
- **Ranked Choice** — order preferences
|
- **Ranked Choice** — order preferences
|
||||||
- **Schulze Method** — Condorcet-consistent pairwise comparison
|
- **Schulze Method** — Condorcet-consistent pairwise comparison
|
||||||
- **STAR Voting** — score + automatic runoff
|
- **STAR Voting** — score + automatic runoff
|
||||||
- **Quadratic Voting** — express intensity of preference
|
- **Quadratic Voting** — express intensity of preference
|
||||||
|
|
||||||
### Liquid Delegation
|
### Liquid Delegation
|
||||||
|
|
||||||
- Delegate your vote globally or within a community
|
- Delegate your vote globally or within a community
|
||||||
- Real-time transparency: see how delegates vote
|
- Real-time transparency: see how delegates vote
|
||||||
- Revoke delegation instantly
|
- Revoke delegation instantly
|
||||||
- Transitive delegation chains
|
- Transitive delegation chains
|
||||||
- Delegation analytics and trust networks
|
- Delegation analytics and trust networks
|
||||||
|
|
||||||
### Modular Plugin System
|
### Modular Plugin System
|
||||||
|
|
||||||
- WASM-based sandboxed plugins
|
- WASM-based sandboxed plugins
|
||||||
- Per-community plugin configuration
|
- Per-community plugin configuration
|
||||||
- Hook-based architecture (actions/filters)
|
- Hook-based architecture (actions/filters)
|
||||||
- Built-in and third-party plugins
|
- Built-in and third-party plugins
|
||||||
- Admin policy for signed/unsigned plugins
|
- Admin policy for signed/unsigned plugins
|
||||||
|
|
||||||
### Governance Infrastructure
|
### Governance Infrastructure
|
||||||
|
|
||||||
- Multi-community platform support
|
- Multi-community platform support
|
||||||
- Granular admin controls (platform mode, registration, moderation)
|
- Granular admin controls (platform mode, registration, moderation)
|
||||||
- Tamper-evident public moderation ledger
|
- Tamper-evident public moderation ledger
|
||||||
- Role-based access (admin, moderator, facilitator, member)
|
- Role-based access (admin, moderator, facilitator, member)
|
||||||
|
|
||||||
## Tech Stack
|
## Tech Stack
|
||||||
|
|
||||||
| Layer | Technology |
|
| Layer | Technology |
|
||||||
| --- | --- |
|
| --- | --- |
|
||||||
| **Backend** | Rust (Axum 0.8, Tokio, SQLx) |
|
| **Backend** | Rust (Axum 0.8, Tokio, SQLx) |
|
||||||
| **Frontend** | Astro + TypeScript |
|
| **Frontend** | Astro + TypeScript |
|
||||||
| **Database** | PostgreSQL 16 |
|
| **Database** | PostgreSQL 16 |
|
||||||
| **Plugins** | WebAssembly (wasmtime) |
|
| **Plugins** | WebAssembly (wasmtime) |
|
||||||
| **Containers** | Podman (rootless) |
|
| **Containers** | Podman (rootless) |
|
||||||
|
|
||||||
## Quick Start
|
## Quick Start
|
||||||
|
|
||||||
### Prerequisites
|
### Prerequisites
|
||||||
|
|
||||||
**Windows:**
|
**Windows:**
|
||||||
|
|
||||||
- Windows 10/11 with WSL2
|
- Windows 10/11 with WSL2
|
||||||
- Podman Desktop (WSL2 backend)
|
- Podman Desktop (WSL2 backend)
|
||||||
- Rust (rustup, MSVC toolchain)
|
- Rust (rustup, MSVC toolchain)
|
||||||
- Node.js LTS
|
- Node.js LTS
|
||||||
|
|
||||||
**Linux:**
|
**Linux:**
|
||||||
|
|
||||||
- Podman + podman-compose
|
- Podman + podman compose
|
||||||
- Rust (rustup)
|
- Rust (rustup)
|
||||||
- Node.js LTS
|
- Node.js LTS
|
||||||
|
|
||||||
### Development
|
### Development
|
||||||
|
|
||||||
```powershell
|
```powershell
|
||||||
# 1. Clone and configure
|
# 1. Clone and configure
|
||||||
git clone https://codeberg.org/likwid/likwid.git
|
git clone https://codeberg.org/likwid/likwid.git
|
||||||
cd likwid
|
cd likwid
|
||||||
$env:JWT_SECRET="dev_secret_change_me"
|
$env:JWT_SECRET="dev_secret_change_me"
|
||||||
|
|
||||||
# 2. Start everything (database + backend + frontend)
|
# 2. Start everything (database + backend + frontend)
|
||||||
.\scripts\dev-start.ps1
|
.\scripts\dev-start.ps1
|
||||||
|
|
||||||
# 3. Stop everything
|
# 3. Stop everything
|
||||||
.\scripts\dev-stop.ps1
|
.\scripts\dev-stop.ps1
|
||||||
```
|
```
|
||||||
|
|
||||||
The platform will be available at:
|
The platform will be available at:
|
||||||
|
|
||||||
- **Frontend**: <http://localhost:4321>
|
- **Frontend**: <http://localhost:4321>
|
||||||
- **Backend API**: <http://localhost:3000>
|
- **Backend API**: <http://localhost:3000>
|
||||||
- **Setup Wizard**: <http://localhost:4321/setup> (first run)
|
- **Setup Wizard**: <http://localhost:4321/setup> (first run)
|
||||||
|
|
||||||
### First Run
|
### First Run
|
||||||
|
|
||||||
1. Navigate to `/register` to create the first user (automatically becomes admin)
|
1. Navigate to `/register` to create the first user (automatically becomes admin)
|
||||||
2. Complete platform setup at `/setup`
|
2. Complete platform setup at `/setup`
|
||||||
3. Configure instance settings at `/admin/settings`
|
3. Configure instance settings at `/admin/settings`
|
||||||
4. Create your first community
|
4. Create your first community
|
||||||
|
|
||||||
## Project Structure
|
## Project Structure
|
||||||
|
|
||||||
```text
|
```text
|
||||||
likwid/
|
likwid/
|
||||||
├── backend/ # Rust backend
|
├── backend/ # Rust backend
|
||||||
│ ├── src/
|
│ ├── src/
|
||||||
│ │ ├── api/ # REST endpoints
|
│ │ ├── api/ # REST endpoints
|
||||||
│ │ ├── auth/ # JWT authentication
|
│ │ ├── auth/ # JWT authentication
|
||||||
│ │ ├── models/ # Database models
|
│ │ ├── models/ # Database models
|
||||||
│ │ └── plugins/ # Plugin system (WASM + builtins)
|
│ │ └── plugins/ # Plugin system (WASM + builtins)
|
||||||
│ └── migrations/ # SQL migrations
|
│ └── migrations/ # SQL migrations
|
||||||
├── frontend/ # Astro frontend
|
├── frontend/ # Astro frontend
|
||||||
│ ├── src/
|
│ ├── src/
|
||||||
│ │ ├── pages/ # Routes
|
│ │ ├── pages/ # Routes
|
||||||
│ │ ├── layouts/ # Page layouts
|
│ │ ├── layouts/ # Page layouts
|
||||||
│ │ └── components/ # UI components
|
│ │ └── components/ # UI components
|
||||||
├── compose/ # Podman compose files
|
├── compose/ # Podman compose files
|
||||||
├── scripts/ # Dev scripts (cross-platform)
|
├── scripts/ # Dev scripts (cross-platform)
|
||||||
└── docu_dev/ # Design documents
|
└── docu_dev/ # Design documents
|
||||||
```
|
```
|
||||||
|
|
||||||
### Core Principles
|
### Core Principles
|
||||||
|
|
||||||
1. **Be considerate** — Your work affects others
|
1. **Be considerate** — Your work affects others
|
||||||
2. **Be respectful** — Assume good intentions
|
2. **Be respectful** — Assume good intentions
|
||||||
3. **Be collaborative** — Work transparently
|
3. **Be collaborative** — Work transparently
|
||||||
4. **Be pragmatic** — Results over debates
|
4. **Be pragmatic** — Results over debates
|
||||||
5. **Find a third way** — Seek solutions that satisfy everyone
|
5. **Find a third way** — Seek solutions that satisfy everyone
|
||||||
|
|
||||||
## License
|
## License
|
||||||
|
|
||||||
EUPL-1.2
|
EUPL-1.2
|
||||||
|
|
||||||
## Acknowledgments
|
## Acknowledgments
|
||||||
|
|
||||||
Inspired by:
|
Inspired by:
|
||||||
|
|
||||||
- [Pol.is](https://pol.is/) — Opinion mapping
|
- [Pol.is](https://pol.is/) — Opinion mapping
|
||||||
- [Decidim](https://decidim.org/) — Participatory democracy
|
- [Decidim](https://decidim.org/) — Participatory democracy
|
||||||
- [LiquidFeedback](https://liquidfeedback.org/) — Liquid democracy
|
- [LiquidFeedback](https://liquidfeedback.org/) — Liquid democracy
|
||||||
- [Equal Vote Coalition](https://www.equal.vote/) — STAR Voting
|
- [Equal Vote Coalition](https://www.equal.vote/) — STAR Voting
|
||||||
|
|
|
||||||
|
|
@ -66,7 +66,7 @@ sqlx migrate run --source migrations_demo
|
||||||
```bash
|
```bash
|
||||||
# Uses separate database on port 5433, backend on 3001, frontend on 4322
|
# Uses separate database on port 5433, backend on 3001, frontend on 4322
|
||||||
cp compose/.env.demo.example compose/.env.demo
|
cp compose/.env.demo.example compose/.env.demo
|
||||||
podman-compose --env-file compose/.env.demo -f compose/demo.yml up -d
|
podman compose --env-file compose/.env.demo -f compose/demo.yml up -d
|
||||||
```
|
```
|
||||||
|
|
||||||
### For real users (Production)
|
### For real users (Production)
|
||||||
|
|
@ -76,7 +76,7 @@ cp compose/.env.production.example compose/.env.production
|
||||||
# Edit with secure passwords and your domain
|
# Edit with secure passwords and your domain
|
||||||
|
|
||||||
# 2. Deploy
|
# 2. Deploy
|
||||||
podman-compose --env-file compose/.env.production -f compose/production.yml up -d
|
podman compose --env-file compose/.env.production -f compose/production.yml up -d
|
||||||
```
|
```
|
||||||
|
|
||||||
## Common Tasks
|
## Common Tasks
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
# Demo deployment - includes demo users, seed data, and restricted actions
|
# Demo deployment - includes demo users, seed data, and restricted actions
|
||||||
# Usage: podman-compose --env-file compose/.env.demo -f compose/demo.yml up -d
|
# Usage: podman compose --env-file compose/.env.demo -f compose/demo.yml up -d
|
||||||
# Reset: podman-compose --env-file compose/.env.demo -f compose/demo.yml down -v; podman-compose --env-file compose/.env.demo -f compose/demo.yml up -d
|
# Reset: podman compose --env-file compose/.env.demo -f compose/demo.yml down -v; podman compose --env-file compose/.env.demo -f compose/demo.yml up -d
|
||||||
|
|
||||||
services:
|
services:
|
||||||
postgres:
|
postgres:
|
||||||
|
|
|
||||||
|
|
@ -1,61 +1,61 @@
|
||||||
# Production deployment - clean instance without demo data
|
# Production deployment - clean instance without demo data
|
||||||
# Usage: podman-compose -f compose/production.yml up -d
|
# Usage: podman compose -f compose/production.yml up -d
|
||||||
|
|
||||||
services:
|
services:
|
||||||
postgres:
|
postgres:
|
||||||
image: postgres:16
|
image: postgres:16
|
||||||
container_name: likwid-prod-db
|
container_name: likwid-prod-db
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
ports:
|
ports:
|
||||||
- "${DB_PORT:-5432}:5432"
|
- "${DB_PORT:-5432}:5432"
|
||||||
environment:
|
environment:
|
||||||
POSTGRES_USER: ${POSTGRES_USER:-likwid}
|
POSTGRES_USER: ${POSTGRES_USER:-likwid}
|
||||||
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
|
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
|
||||||
POSTGRES_DB: ${POSTGRES_DB:-likwid_prod}
|
POSTGRES_DB: ${POSTGRES_DB:-likwid_prod}
|
||||||
volumes:
|
volumes:
|
||||||
- likwid_prod_data:/var/lib/postgresql/data
|
- likwid_prod_data:/var/lib/postgresql/data
|
||||||
healthcheck:
|
healthcheck:
|
||||||
test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-likwid}"]
|
test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-likwid}"]
|
||||||
interval: 10s
|
interval: 10s
|
||||||
timeout: 5s
|
timeout: 5s
|
||||||
retries: 5
|
retries: 5
|
||||||
|
|
||||||
backend:
|
backend:
|
||||||
build:
|
build:
|
||||||
context: ../backend
|
context: ../backend
|
||||||
dockerfile: Dockerfile
|
dockerfile: Dockerfile
|
||||||
args:
|
args:
|
||||||
INCLUDE_DEMO_SEED: "false"
|
INCLUDE_DEMO_SEED: "false"
|
||||||
container_name: likwid-prod-backend
|
container_name: likwid-prod-backend
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
ports:
|
ports:
|
||||||
- "${BACKEND_PORT:-3000}:3000"
|
- "${BACKEND_PORT:-3000}:3000"
|
||||||
environment:
|
environment:
|
||||||
DATABASE_URL: postgres://${POSTGRES_USER:-likwid}:${POSTGRES_PASSWORD}@postgres:5432/${POSTGRES_DB:-likwid_prod}
|
DATABASE_URL: postgres://${POSTGRES_USER:-likwid}:${POSTGRES_PASSWORD}@postgres:5432/${POSTGRES_DB:-likwid_prod}
|
||||||
JWT_SECRET: ${JWT_SECRET}
|
JWT_SECRET: ${JWT_SECRET}
|
||||||
SERVER_HOST: 0.0.0.0
|
SERVER_HOST: 0.0.0.0
|
||||||
SERVER_PORT: 3000
|
SERVER_PORT: 3000
|
||||||
DEMO_MODE: "false"
|
DEMO_MODE: "false"
|
||||||
RUST_LOG: info
|
RUST_LOG: info
|
||||||
depends_on:
|
depends_on:
|
||||||
postgres:
|
postgres:
|
||||||
condition: service_healthy
|
condition: service_healthy
|
||||||
|
|
||||||
frontend:
|
frontend:
|
||||||
build:
|
build:
|
||||||
context: ../frontend
|
context: ../frontend
|
||||||
dockerfile: Dockerfile
|
dockerfile: Dockerfile
|
||||||
args:
|
args:
|
||||||
API_BASE: ${API_BASE:-http://localhost:3000}
|
API_BASE: ${API_BASE:-http://localhost:3000}
|
||||||
container_name: likwid-prod-frontend
|
container_name: likwid-prod-frontend
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
ports:
|
ports:
|
||||||
- "${FRONTEND_PORT:-4321}:4321"
|
- "${FRONTEND_PORT:-4321}:4321"
|
||||||
environment:
|
environment:
|
||||||
INTERNAL_API_BASE: http://backend:3000
|
INTERNAL_API_BASE: http://backend:3000
|
||||||
API_BASE: ${API_BASE:-http://localhost:3000}
|
API_BASE: ${API_BASE:-http://localhost:3000}
|
||||||
depends_on:
|
depends_on:
|
||||||
- backend
|
- backend
|
||||||
|
|
||||||
volumes:
|
volumes:
|
||||||
likwid_prod_data:
|
likwid_prod_data:
|
||||||
|
|
|
||||||
|
|
@ -49,7 +49,7 @@ find "$BACKUP_DIR" -name "*.dump.gz" -mtime +$RETENTION_DAYS -delete
|
||||||
### Containerized Backup
|
### Containerized Backup
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# If using podman-compose
|
# If using podman compose
|
||||||
podman exec likwid-prod-db pg_dump -U likwid likwid_prod > backup.sql
|
podman exec likwid-prod-db pg_dump -U likwid likwid_prod > backup.sql
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -37,7 +37,7 @@ Managed via the Admin panel or API:
|
||||||
- **Instance Name** - Display name for your Likwid instance
|
- **Instance Name** - Display name for your Likwid instance
|
||||||
- **Instance Description** - Brief description
|
- **Instance Description** - Brief description
|
||||||
- **Registration** - Open, invite-only, or closed
|
- **Registration** - Open, invite-only, or closed
|
||||||
- **Email Verification** - Required or optional
|
- **Approval workflows** - Registration and community creation can be open, invite-only, or require admin approval
|
||||||
|
|
||||||
### Features
|
### Features
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -34,7 +34,7 @@ Required settings:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
cd compose
|
cd compose
|
||||||
podman-compose --env-file .env.production -f production.yml up -d
|
podman compose --env-file .env.production -f production.yml up -d
|
||||||
```
|
```
|
||||||
|
|
||||||
### 4. Access
|
### 4. Access
|
||||||
|
|
|
||||||
|
|
@ -11,7 +11,7 @@ Likwid is a modular governance platform for distributed organizations. This guid
|
||||||
- Email address
|
- Email address
|
||||||
- Display name (shown to others)
|
- Display name (shown to others)
|
||||||
- Password
|
- Password
|
||||||
4. Verify your email if required by the instance
|
4. If registration requires approval, your account will be pending until an admin approves it
|
||||||
|
|
||||||
## Exploring Without an Account
|
## Exploring Without an Account
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -29,10 +29,10 @@ if (Test-Path $envFile) {
|
||||||
}
|
}
|
||||||
|
|
||||||
Write-Host "`n[1/3] Stopping demo containers and removing volumes..." -ForegroundColor Yellow
|
Write-Host "`n[1/3] Stopping demo containers and removing volumes..." -ForegroundColor Yellow
|
||||||
podman-compose @composeArgs down --remove-orphans -v
|
podman compose @composeArgs down --remove-orphans -v
|
||||||
|
|
||||||
Write-Host "`n[2/3] Starting fresh demo instance..." -ForegroundColor Yellow
|
Write-Host "`n[2/3] Starting fresh demo instance..." -ForegroundColor Yellow
|
||||||
podman-compose @composeArgs up -d
|
podman compose @composeArgs up -d
|
||||||
|
|
||||||
Write-Host "`n[3/3] Waiting for services to be ready..." -ForegroundColor Yellow
|
Write-Host "`n[3/3] Waiting for services to be ready..." -ForegroundColor Yellow
|
||||||
Start-Sleep -Seconds 10
|
Start-Sleep -Seconds 10
|
||||||
|
|
@ -63,4 +63,4 @@ while ($retry -lt $maxRetries) {
|
||||||
|
|
||||||
Write-Host "`nWarning: Backend health check timed out. Check logs with:" -ForegroundColor Yellow
|
Write-Host "`nWarning: Backend health check timed out. Check logs with:" -ForegroundColor Yellow
|
||||||
$composeArgsText = ($composeArgs -join ' ')
|
$composeArgsText = ($composeArgs -join ' ')
|
||||||
Write-Host " podman-compose $composeArgsText logs backend"
|
Write-Host " podman compose $composeArgsText logs backend"
|
||||||
|
|
|
||||||
|
|
@ -26,10 +26,10 @@ if [ "$1" != "--force" ] && [ "$1" != "-f" ]; then
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo -e "\n[1/3] Stopping demo containers and removing volumes..."
|
echo -e "\n[1/3] Stopping demo containers and removing volumes..."
|
||||||
podman-compose "${COMPOSE_ARGS[@]}" down --remove-orphans -v || docker-compose "${COMPOSE_ARGS[@]}" down --remove-orphans -v
|
podman compose "${COMPOSE_ARGS[@]}" down --remove-orphans -v || podman-compose "${COMPOSE_ARGS[@]}" down --remove-orphans -v || docker-compose "${COMPOSE_ARGS[@]}" down --remove-orphans -v
|
||||||
|
|
||||||
echo -e "\n[2/3] Starting fresh demo instance..."
|
echo -e "\n[2/3] Starting fresh demo instance..."
|
||||||
podman-compose "${COMPOSE_ARGS[@]}" up -d || docker-compose "${COMPOSE_ARGS[@]}" up -d
|
podman compose "${COMPOSE_ARGS[@]}" up -d || podman-compose "${COMPOSE_ARGS[@]}" up -d || docker-compose "${COMPOSE_ARGS[@]}" up -d
|
||||||
|
|
||||||
echo -e "\n[3/3] Waiting for services to be ready..."
|
echo -e "\n[3/3] Waiting for services to be ready..."
|
||||||
sleep 5
|
sleep 5
|
||||||
|
|
@ -54,5 +54,5 @@ while [ $retry -lt $max_retries ]; do
|
||||||
done
|
done
|
||||||
|
|
||||||
echo -e "\nWarning: Backend health check timed out. Check logs with:"
|
echo -e "\nWarning: Backend health check timed out. Check logs with:"
|
||||||
echo " podman-compose ${COMPOSE_ARGS[*]} logs backend"
|
echo " podman compose ${COMPOSE_ARGS[*]} logs backend"
|
||||||
echo " docker-compose ${COMPOSE_ARGS[*]} logs backend"
|
echo " docker-compose ${COMPOSE_ARGS[*]} logs backend"
|
||||||
|
|
|
||||||
|
|
@ -27,19 +27,19 @@ function Invoke-Compose {
|
||||||
[Parameter(Mandatory=$true)][string[]]$Args
|
[Parameter(Mandatory=$true)][string[]]$Args
|
||||||
)
|
)
|
||||||
|
|
||||||
$podmanCompose = Get-Command podman-compose -ErrorAction SilentlyContinue
|
|
||||||
if ($podmanCompose) {
|
|
||||||
$null = & podman-compose @Args
|
|
||||||
return $LASTEXITCODE
|
|
||||||
}
|
|
||||||
|
|
||||||
$podman = Get-Command podman -ErrorAction SilentlyContinue
|
$podman = Get-Command podman -ErrorAction SilentlyContinue
|
||||||
if ($podman) {
|
if ($podman) {
|
||||||
$null = & podman compose @Args
|
$null = & podman compose @Args
|
||||||
return $LASTEXITCODE
|
return $LASTEXITCODE
|
||||||
}
|
}
|
||||||
|
|
||||||
throw 'Neither podman-compose nor podman was found in PATH.'
|
$podmanCompose = Get-Command podman-compose -ErrorAction SilentlyContinue
|
||||||
|
if ($podmanCompose) {
|
||||||
|
$null = & podman-compose @Args
|
||||||
|
return $LASTEXITCODE
|
||||||
|
}
|
||||||
|
|
||||||
|
throw 'Neither podman nor podman-compose was found in PATH.'
|
||||||
}
|
}
|
||||||
|
|
||||||
function Get-CommandLine {
|
function Get-CommandLine {
|
||||||
|
|
|
||||||
|
|
@ -30,7 +30,7 @@ fi
|
||||||
|
|
||||||
# Start PostgreSQL
|
# Start PostgreSQL
|
||||||
echo "Starting PostgreSQL..."
|
echo "Starting PostgreSQL..."
|
||||||
podman-compose -f "$ROOT_DIR/compose/dev.yml" up -d 2>/dev/null || true
|
podman compose -f "$ROOT_DIR/compose/dev.yml" up -d 2>/dev/null || podman-compose -f "$ROOT_DIR/compose/dev.yml" up -d 2>/dev/null || true
|
||||||
|
|
||||||
# Wait for PostgreSQL
|
# Wait for PostgreSQL
|
||||||
echo "Waiting for PostgreSQL..."
|
echo "Waiting for PostgreSQL..."
|
||||||
|
|
|
||||||
|
|
@ -19,19 +19,19 @@ function Invoke-Compose {
|
||||||
[Parameter(Mandatory=$true)][string[]]$Args
|
[Parameter(Mandatory=$true)][string[]]$Args
|
||||||
)
|
)
|
||||||
|
|
||||||
$podmanCompose = Get-Command podman-compose -ErrorAction SilentlyContinue
|
|
||||||
if ($podmanCompose) {
|
|
||||||
$null = & podman-compose @Args
|
|
||||||
return $LASTEXITCODE
|
|
||||||
}
|
|
||||||
|
|
||||||
$podman = Get-Command podman -ErrorAction SilentlyContinue
|
$podman = Get-Command podman -ErrorAction SilentlyContinue
|
||||||
if ($podman) {
|
if ($podman) {
|
||||||
$null = & podman compose @Args
|
$null = & podman compose @Args
|
||||||
return $LASTEXITCODE
|
return $LASTEXITCODE
|
||||||
}
|
}
|
||||||
|
|
||||||
throw 'Neither podman-compose nor podman was found in PATH.'
|
$podmanCompose = Get-Command podman-compose -ErrorAction SilentlyContinue
|
||||||
|
if ($podmanCompose) {
|
||||||
|
$null = & podman-compose @Args
|
||||||
|
return $LASTEXITCODE
|
||||||
|
}
|
||||||
|
|
||||||
|
throw 'Neither podman nor podman-compose was found in PATH.'
|
||||||
}
|
}
|
||||||
|
|
||||||
function Get-CommandLine {
|
function Get-CommandLine {
|
||||||
|
|
|
||||||
|
|
@ -48,7 +48,7 @@ pkill -f "astro dev" 2>/dev/null || true
|
||||||
# Stop PostgreSQL if requested
|
# Stop PostgreSQL if requested
|
||||||
if [ "$STOP_DB" = "--all" ] || [ "$STOP_DB" = "-a" ]; then
|
if [ "$STOP_DB" = "--all" ] || [ "$STOP_DB" = "-a" ]; then
|
||||||
echo "Stopping PostgreSQL..."
|
echo "Stopping PostgreSQL..."
|
||||||
podman-compose -f "$ROOT_DIR/compose/dev.yml" down 2>/dev/null || true
|
podman compose -f "$ROOT_DIR/compose/dev.yml" down 2>/dev/null || podman-compose -f "$ROOT_DIR/compose/dev.yml" down 2>/dev/null || true
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo "Done."
|
echo "Done."
|
||||||
|
|
|
||||||
|
|
@ -1 +1,4 @@
|
||||||
podman-compose -f compose/dev.yml up
|
podman compose -f compose/dev.yml up
|
||||||
|
if ($LASTEXITCODE -ne 0) {
|
||||||
|
podman-compose -f compose/dev.yml up
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,2 +1,2 @@
|
||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
podman-compose -f compose/dev.yml up
|
podman compose -f compose/dev.yml up || podman-compose -f compose/dev.yml up
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@ Write-Host "=== Likwid Post-Reboot Setup ===" -ForegroundColor Cyan
|
||||||
|
|
||||||
# Step 1: Verify WSL2 is working
|
# Step 1: Verify WSL2 is working
|
||||||
Write-Host "`n[1/4] Checking WSL2 status..." -ForegroundColor Yellow
|
Write-Host "`n[1/4] Checking WSL2 status..." -ForegroundColor Yellow
|
||||||
$wslStatus = wsl --status 2>&1
|
wsl --status 2>&1 | Out-Null
|
||||||
if ($LASTEXITCODE -ne 0) {
|
if ($LASTEXITCODE -ne 0) {
|
||||||
Write-Host "WSL2 is not ready. Please ensure virtualization is enabled in BIOS." -ForegroundColor Red
|
Write-Host "WSL2 is not ready. Please ensure virtualization is enabled in BIOS." -ForegroundColor Red
|
||||||
Write-Host "Run 'wsl --install --no-distribution' as administrator if needed." -ForegroundColor Red
|
Write-Host "Run 'wsl --install --no-distribution' as administrator if needed." -ForegroundColor Red
|
||||||
|
|
@ -35,7 +35,7 @@ wsl --set-default openSUSE-Tumbleweed
|
||||||
# Step 4: Configure Podman in WSL2
|
# Step 4: Configure Podman in WSL2
|
||||||
Write-Host "`n[4/4] Configuring Podman in openSUSE Tumbleweed..." -ForegroundColor Yellow
|
Write-Host "`n[4/4] Configuring Podman in openSUSE Tumbleweed..." -ForegroundColor Yellow
|
||||||
wsl -d openSUSE-Tumbleweed -e bash -c "
|
wsl -d openSUSE-Tumbleweed -e bash -c "
|
||||||
echo 'Installing Podman and podman-compose...'
|
echo 'Installing Podman and compose support (use: podman compose)'
|
||||||
sudo zypper refresh
|
sudo zypper refresh
|
||||||
sudo zypper install -y podman podman-compose
|
sudo zypper install -y podman podman-compose
|
||||||
|
|
||||||
|
|
@ -44,7 +44,7 @@ wsl -d openSUSE-Tumbleweed -e bash -c "
|
||||||
|
|
||||||
echo 'Verifying installation...'
|
echo 'Verifying installation...'
|
||||||
podman --version
|
podman --version
|
||||||
podman-compose --version
|
podman compose --help >/dev/null 2>&1 || true
|
||||||
"
|
"
|
||||||
|
|
||||||
Write-Host "`n=== Setup Complete ===" -ForegroundColor Cyan
|
Write-Host "`n=== Setup Complete ===" -ForegroundColor Cyan
|
||||||
|
|
|
||||||
|
|
@ -28,4 +28,4 @@ if (Test-Path $demoMigration) {
|
||||||
Write-Host "`n=== Production Preparation Complete ===" -ForegroundColor Green
|
Write-Host "`n=== Production Preparation Complete ===" -ForegroundColor Green
|
||||||
Write-Host "`nNext steps:"
|
Write-Host "`nNext steps:"
|
||||||
Write-Host " 1. Configure compose/.env.production"
|
Write-Host " 1. Configure compose/.env.production"
|
||||||
Write-Host " 2. Run: podman-compose -f compose/production.yml up -d"
|
Write-Host " 2. Run: podman compose -f compose/production.yml up -d"
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue