Compare commits
15 Commits
docker-imp
...
v1.22.2
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
936c298e15 | ||
|
|
f5dc06ab88 | ||
|
|
24e2ac9c65 | ||
|
|
349f50b87f | ||
|
|
5f8c476f18 | ||
|
|
dbf5361fe4 | ||
|
|
54a92ad5d5 | ||
|
|
d59e91ced3 | ||
|
|
31dacb357f | ||
|
|
daeda58b80 | ||
|
|
195daf343d | ||
|
|
c41e022e4f | ||
|
|
15c4355a58 | ||
|
|
a23f64067a | ||
|
|
cf72ac1ec8 |
36
.github/workflows/bearer.yml
vendored
Normal file
36
.github/workflows/bearer.yml
vendored
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
name: Security Scan
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- master
|
||||||
|
pull_request:
|
||||||
|
branches:
|
||||||
|
- master
|
||||||
|
schedule:
|
||||||
|
- cron: '0 0 * * 0' # Run weekly on Sunday
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
security-events: write
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
security-scan:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Bearer Security Scan
|
||||||
|
uses: bearer/bearer-action@v2
|
||||||
|
with:
|
||||||
|
scanner: sast
|
||||||
|
format: sarif
|
||||||
|
output: bearer.sarif
|
||||||
|
severity: critical,high
|
||||||
|
path: .
|
||||||
|
exit-code: 0
|
||||||
|
|
||||||
|
- name: Upload SARIF results
|
||||||
|
uses: github/codeql-action/upload-sarif@v2
|
||||||
|
with:
|
||||||
|
sarif_file: bearer.sarif
|
||||||
6
.github/workflows/build.yml
vendored
6
.github/workflows/build.yml
vendored
@@ -149,9 +149,9 @@ jobs:
|
|||||||
platforms: linux/amd64,linux/arm64
|
platforms: linux/amd64,linux/arm64
|
||||||
push: true
|
push: true
|
||||||
tags: |
|
tags: |
|
||||||
ghcr.io/liamcottle/reticulum-meshchat:latest
|
ghcr.io/sudo-ivan/reticulum-meshchat:latest
|
||||||
ghcr.io/liamcottle/reticulum-meshchat:${{ github.ref_name }}
|
ghcr.io/sudo-ivan/reticulum-meshchat:${{ github.ref_name }}
|
||||||
labels: |
|
labels: |
|
||||||
org.opencontainers.image.title=Reticulum MeshChat
|
org.opencontainers.image.title=Reticulum MeshChat
|
||||||
org.opencontainers.image.description=Docker image for Reticulum MeshChat
|
org.opencontainers.image.description=Docker image for Reticulum MeshChat
|
||||||
org.opencontainers.image.url=https://github.com/liamcottle/reticulum-meshchat/pkgs/container/reticulum-meshchat/
|
org.opencontainers.image.url=https://github.com/Sudo-Ivan/reticulum-meshchat/pkgs/container/reticulum-meshchat/
|
||||||
|
|||||||
6
.github/workflows/manual-docker-build.yml
vendored
6
.github/workflows/manual-docker-build.yml
vendored
@@ -33,10 +33,10 @@ jobs:
|
|||||||
platforms: linux/amd64,linux/arm64
|
platforms: linux/amd64,linux/arm64
|
||||||
push: true
|
push: true
|
||||||
tags: |
|
tags: |
|
||||||
ghcr.io/liamcottle/reticulum-meshchat:latest
|
ghcr.io/sudo-ivan/reticulum-meshchat:latest
|
||||||
ghcr.io/liamcottle/reticulum-meshchat:${{ github.ref_name }}
|
ghcr.io/sudo-ivan/reticulum-meshchat:${{ github.ref_name }}
|
||||||
labels: |
|
labels: |
|
||||||
org.opencontainers.image.title=Reticulum MeshChat
|
org.opencontainers.image.title=Reticulum MeshChat
|
||||||
org.opencontainers.image.description=Docker image for Reticulum MeshChat
|
org.opencontainers.image.description=Docker image for Reticulum MeshChat
|
||||||
org.opencontainers.image.url=https://github.com/liamcottle/reticulum-meshchat/pkgs/container/reticulum-meshchat/
|
org.opencontainers.image.url=https://github.com/Sudo-Ivan/reticulum-meshchat/pkgs/container/reticulum-meshchat/
|
||||||
|
|
||||||
|
|||||||
4
.gitignore
vendored
4
.gitignore
vendored
@@ -9,3 +9,7 @@ node_modules
|
|||||||
|
|
||||||
# local storage
|
# local storage
|
||||||
storage/
|
storage/
|
||||||
|
|
||||||
|
__pycache__/
|
||||||
|
|
||||||
|
config/
|
||||||
50
Dockerfile
50
Dockerfile
@@ -1,33 +1,51 @@
|
|||||||
# Build the frontend
|
# Build the frontend
|
||||||
FROM node:20-bookworm-slim AS build-frontend
|
FROM node:20-alpine AS build-frontend
|
||||||
|
|
||||||
WORKDIR /src
|
WORKDIR /src
|
||||||
|
|
||||||
# Copy required source files
|
# Copy required source files
|
||||||
COPY *.json .
|
COPY --chown=node:node *.json .
|
||||||
COPY *.js .
|
COPY --chown=node:node *.js .
|
||||||
COPY src/frontend ./src/frontend
|
COPY --chown=node:node src/frontend ./src/frontend
|
||||||
|
|
||||||
# Install NodeJS deps, exluding electron
|
# Fix permissions and install NodeJS deps
|
||||||
|
USER root
|
||||||
|
RUN chown -R node:node /src
|
||||||
|
USER node
|
||||||
RUN npm install --omit=dev && \
|
RUN npm install --omit=dev && \
|
||||||
npm run build-frontend
|
npm run build-frontend
|
||||||
|
|
||||||
# Main app build
|
# Main app build
|
||||||
FROM python:3.11-bookworm
|
FROM python:3.13-alpine
|
||||||
|
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
|
|
||||||
# Install Python deps
|
# Install system dependencies
|
||||||
COPY ./requirements.txt .
|
RUN apk add --no-cache \
|
||||||
RUN pip install -r requirements.txt
|
gcc \
|
||||||
|
musl-dev \
|
||||||
|
python3-dev \
|
||||||
|
libffi-dev \
|
||||||
|
openssl-dev
|
||||||
|
|
||||||
# Copy prebuilt frontend
|
# Create config directories with proper permissions
|
||||||
COPY --from=build-frontend /src/public public
|
RUN mkdir -p /config/.reticulum /config/.meshchat && \
|
||||||
|
chown -R 1000:1000 /config
|
||||||
|
|
||||||
|
# Install Python deps
|
||||||
|
COPY --chown=1000:1000 ./requirements.txt .
|
||||||
|
RUN pip install --no-cache-dir -r requirements.txt
|
||||||
|
|
||||||
|
# Create public directory and copy frontend
|
||||||
|
RUN mkdir -p /app/public
|
||||||
|
COPY --from=build-frontend --chown=1000:1000 /src/public/ /app/public/
|
||||||
|
|
||||||
# Copy other required source files
|
# Copy other required source files
|
||||||
COPY *.py .
|
COPY --chown=1000:1000 *.py .
|
||||||
COPY src/__init__.py ./src/__init__.py
|
COPY --chown=1000:1000 src/__init__.py ./src/__init__.py
|
||||||
COPY src/backend ./src/backend
|
COPY --chown=1000:1000 src/backend ./src/backend
|
||||||
COPY *.json .
|
COPY --chown=1000:1000 *.json .
|
||||||
|
|
||||||
CMD ["python", "meshchat.py", "--host=0.0.0.0", "--reticulum-config-dir=/config/.reticulum", "--storage-dir=/config/.meshchat", "--headless"]
|
USER 1000
|
||||||
|
ENTRYPOINT ["python"]
|
||||||
|
CMD ["meshchat.py", "--host=0.0.0.0", "--reticulum-config-dir=/config/.reticulum", "--storage-dir=/config/.meshchat", "--headless"]
|
||||||
|
|||||||
18
README.md
18
README.md
@@ -1,3 +1,21 @@
|
|||||||
|
# Ivans Fork Edition
|
||||||
|
|
||||||
|
## Containers
|
||||||
|
|
||||||
|
- Drop unnecassary permissions (compose)
|
||||||
|
- Rootless (user 1000:1000)
|
||||||
|
- Resource Limits (compose)
|
||||||
|
- Alpine Image Variants
|
||||||
|
- Updated Dependencies
|
||||||
|
- Dockerfile use python 3.13
|
||||||
|
|
||||||
|
## Security
|
||||||
|
|
||||||
|
- Bearer Security Scan Action
|
||||||
|
- [Socket](https://socket.dev/) Supply Chain Security/Analysis
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
<p align="center">
|
<p align="center">
|
||||||
<a href="https://github.com/liamcottle/reticulum-meshchat"><img src="./logo/logo-chat-bubble.png" width="150"></a>
|
<a href="https://github.com/liamcottle/reticulum-meshchat"><img src="./logo/logo-chat-bubble.png" width="150"></a>
|
||||||
</p>
|
</p>
|
||||||
|
|||||||
40
docker-compose.dev.yml
Normal file
40
docker-compose.dev.yml
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
services:
|
||||||
|
reticulum-meshchat:
|
||||||
|
container_name: reticulum-meshchat-dev
|
||||||
|
build:
|
||||||
|
context: .
|
||||||
|
dockerfile: Dockerfile
|
||||||
|
pull_policy: never
|
||||||
|
restart: unless-stopped
|
||||||
|
user: "1000:1000"
|
||||||
|
# Make the meshchat web interface accessible from the host on port 8000
|
||||||
|
ports:
|
||||||
|
- 0.0.0.0:8000:8000
|
||||||
|
volumes:
|
||||||
|
- meshchat-config:/config:rw
|
||||||
|
- .:/app:delegated
|
||||||
|
- /app/public
|
||||||
|
# Uncomment if you have a USB device connected, such as an RNode
|
||||||
|
# devices:
|
||||||
|
# - /dev/ttyUSB0:/dev/ttyUSB0
|
||||||
|
cap_drop:
|
||||||
|
- ALL
|
||||||
|
cap_add:
|
||||||
|
- NET_ADMIN
|
||||||
|
- NET_RAW
|
||||||
|
deploy:
|
||||||
|
resources:
|
||||||
|
limits:
|
||||||
|
cpus: '1'
|
||||||
|
memory: 512M
|
||||||
|
reservations:
|
||||||
|
cpus: '0.25'
|
||||||
|
memory: 128M
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
meshchat-config:
|
||||||
|
driver: local
|
||||||
|
driver_opts:
|
||||||
|
type: none
|
||||||
|
o: bind
|
||||||
|
device: ${PWD}/config
|
||||||
@@ -1,17 +1,31 @@
|
|||||||
services:
|
services:
|
||||||
reticulum-meshchat:
|
reticulum-meshchat:
|
||||||
container_name: reticulum-meshchat
|
container_name: reticulum-meshchat
|
||||||
image: ghcr.io/liamcottle/reticulum-meshchat:latest
|
image: ghcr.io/sudo-ivan/reticulum-meshchat:latest
|
||||||
pull_policy: always
|
pull_policy: always
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
|
user: "1000:1000"
|
||||||
# Make the meshchat web interface accessible from the host on port 8000
|
# Make the meshchat web interface accessible from the host on port 8000
|
||||||
ports:
|
ports:
|
||||||
- 0.0.0.0:8000:8000
|
- 0.0.0.0:8000:8000
|
||||||
volumes:
|
volumes:
|
||||||
- meshchat-config:/config
|
- meshchat-config:/config:rw
|
||||||
# Uncomment if you have a USB device connected, such as an RNode
|
# Uncomment if you have a USB device connected, such as an RNode
|
||||||
# devices:
|
# devices:
|
||||||
# - /dev/ttyUSB0:/dev/ttyUSB0
|
# - /dev/ttyUSB0:/dev/ttyUSB0
|
||||||
|
cap_drop:
|
||||||
|
- ALL
|
||||||
|
cap_add:
|
||||||
|
- NET_ADMIN
|
||||||
|
- NET_RAW
|
||||||
|
deploy:
|
||||||
|
resources:
|
||||||
|
limits:
|
||||||
|
cpus: '1'
|
||||||
|
memory: 512M
|
||||||
|
reservations:
|
||||||
|
cpus: '0.25'
|
||||||
|
memory: 128M
|
||||||
|
|
||||||
volumes:
|
volumes:
|
||||||
meshchat-config:
|
meshchat-config:
|
||||||
|
|||||||
@@ -99,7 +99,9 @@ function getDefaultReticulumConfigDir() {
|
|||||||
app.whenReady().then(async () => {
|
app.whenReady().then(async () => {
|
||||||
|
|
||||||
// get arguments passed to application, and remove the provided application path
|
// get arguments passed to application, and remove the provided application path
|
||||||
const userProvidedArguments = process.argv.slice(1);
|
const ignoredArguments = ["--no-sandbox"];
|
||||||
|
const userProvidedArguments = process.argv.slice(1)
|
||||||
|
.filter(arg => !ignoredArguments.includes(arg));
|
||||||
const shouldLaunchHeadless = userProvidedArguments.includes("--headless");
|
const shouldLaunchHeadless = userProvidedArguments.includes("--headless");
|
||||||
|
|
||||||
if(!shouldLaunchHeadless){
|
if(!shouldLaunchHeadless){
|
||||||
|
|||||||
1749
package-lock.json
generated
1749
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
14
package.json
14
package.json
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "reticulum-meshchat",
|
"name": "reticulum-meshchat",
|
||||||
"version": "1.21.0",
|
"version": "1.22.2",
|
||||||
"description": "",
|
"description": "",
|
||||||
"main": "electron/main.js",
|
"main": "electron/main.js",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
@@ -96,9 +96,9 @@
|
|||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@mdi/js": "^7.4.47",
|
"@mdi/js": "^7.4.47",
|
||||||
"@tailwindcss/forms": "^0.5.9",
|
"@tailwindcss/forms": "^0.5.9",
|
||||||
"@vitejs/plugin-vue": "^5.2.1",
|
"@vitejs/plugin-vue": "^5.2.4",
|
||||||
"autoprefixer": "^10.4.20",
|
"autoprefixer": "^10.4.20",
|
||||||
"axios": "^1.7.9",
|
"axios": "^1.9.0",
|
||||||
"click-outside-vue3": "^4.0.1",
|
"click-outside-vue3": "^4.0.1",
|
||||||
"compressorjs": "^1.2.1",
|
"compressorjs": "^1.2.1",
|
||||||
"electron-prompt": "^1.7.0",
|
"electron-prompt": "^1.7.0",
|
||||||
@@ -106,13 +106,13 @@
|
|||||||
"mitt": "^3.0.1",
|
"mitt": "^3.0.1",
|
||||||
"moment": "^2.30.1",
|
"moment": "^2.30.1",
|
||||||
"postcss": "^8.4.49",
|
"postcss": "^8.4.49",
|
||||||
"protobufjs": "^7.4.0",
|
"protobufjs": "^7.5.1",
|
||||||
"tailwindcss": "^3.4.17",
|
"tailwindcss": "^3.4.17",
|
||||||
"vis-data": "^7.1.9",
|
"vis-data": "^7.1.9",
|
||||||
"vis-network": "^9.1.9",
|
"vis-network": "^9.1.9",
|
||||||
"vite": "^6.0.5",
|
"vite": "^6.3.5",
|
||||||
"vite-plugin-vuetify": "^2.0.4",
|
"vite-plugin-vuetify": "^2.0.4",
|
||||||
"vue-router": "^4.5.0",
|
"vue-router": "^4.5.1",
|
||||||
"vuetify": "^3.7.6"
|
"vuetify": "^3.8.4"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
aiohttp>=3.9.5
|
aiohttp>=3.11.18
|
||||||
cx_freeze>=7.0.0
|
cx_freeze>=7.0.0
|
||||||
lxmf>=0.6.3
|
lxmf>=0.6.3
|
||||||
peewee>=3.17.3
|
peewee>=3.18.1
|
||||||
rns>=0.9.3
|
rns>=0.9.5
|
||||||
websockets>=14.2
|
websockets>=15.0.1
|
||||||
Reference in New Issue
Block a user