├── .dockerignore ├── .github ├── FUNDING.yml └── workflows │ ├── build.yml │ ├── client_build.yml │ └── client_test.yml ├── .gitignore ├── Dockerfile ├── LICENSE ├── OpenApi.yml ├── README.md ├── client ├── .browserslistrc ├── .editorconfig ├── .eslintrc.js ├── .gitignore ├── .npmrc ├── README.md ├── babel.config.js ├── package-lock.json ├── package.json ├── public │ ├── favicon-16x16.png │ ├── favicon-32x32.png │ ├── favicon.ico │ └── index.html ├── src │ ├── App.vue │ ├── api │ │ ├── .gitignore │ │ ├── .npmignore │ │ ├── .openapi-generator-ignore │ │ ├── .openapi-generator │ │ │ ├── FILES │ │ │ └── VERSION │ │ ├── api.ts │ │ ├── base.ts │ │ ├── common.ts │ │ ├── configuration.ts │ │ └── index.ts │ ├── assets │ │ └── styles │ │ │ ├── _variables.scss │ │ │ ├── main.scss │ │ │ └── vendor │ │ │ └── _sweetalert2.scss │ ├── components │ │ ├── Pull.vue │ │ ├── RoomActionBtn.vue │ │ ├── RoomInfo.vue │ │ ├── RoomLink.vue │ │ ├── RoomsCreate.vue │ │ ├── RoomsList.vue │ │ └── RoomsQuick.vue │ ├── main.ts │ ├── plugins │ │ ├── filters.ts │ │ ├── sweetalert.ts │ │ └── vuetify.ts │ ├── shims-tsx.d.ts │ ├── shims-vue.d.ts │ ├── shims-vuetify.d.ts │ ├── store │ │ ├── index.ts │ │ └── state.ts │ ├── utils │ │ └── random.ts │ └── views │ │ └── Home.vue ├── tsconfig.json └── vue.config.js ├── cmd ├── neko_rooms │ └── main.go ├── root.go └── serve.go ├── community ├── README.md └── scripts │ ├── aws-linux.sh │ └── ubuntu-debian.sh ├── dev ├── .gitignore ├── api-gen ├── build ├── go ├── rebuild ├── serve ├── start └── traefik │ ├── .env.example │ ├── rebuild │ ├── serve │ ├── start │ └── traefik ├── docker-compose.yml ├── docs ├── README.md ├── architecture.drawio ├── architecture.svg ├── dind │ ├── .gitignore │ ├── Dockerfile │ ├── README.md │ ├── docker-compose.yml │ ├── nrooms-entrypoint.sh │ └── nrooms-start.sh ├── lables.md ├── neko.gif ├── new_room.png ├── rooms.png ├── storage.md └── storage.png ├── go.mod ├── go.sum ├── internal ├── api │ ├── api.go │ ├── config.go │ ├── events.go │ ├── pull.go │ └── rooms.go ├── config │ ├── config.go │ ├── room.go │ ├── root.go │ └── server.go ├── policies │ ├── chromium │ │ ├── generator.go │ │ ├── parser.go │ │ └── policies.json │ ├── config.go │ └── firefox │ │ ├── generator.go │ │ ├── parser.go │ │ └── policies.json ├── proxy │ ├── lobby.go │ └── manager.go ├── pull │ └── manager.go ├── room │ ├── containers.go │ ├── events.go │ ├── labels.go │ ├── manager.go │ └── ports.go ├── server │ ├── logger.go │ └── manager.go ├── types │ ├── api.go │ ├── policies.go │ ├── proxy.go │ ├── pull.go │ ├── room.go │ ├── room_api_v2.go │ └── room_api_v3.go └── utils │ ├── color.go │ ├── fs.go │ ├── swal2.go │ ├── swal2.html │ └── uid.go ├── neko.go ├── pkg └── prefix │ ├── doc.go │ ├── tree.go │ └── tree_test.go ├── traefik ├── .env.example ├── .gitignore ├── README.md ├── config │ ├── middlewares.yml │ ├── routers.yml │ └── tls.yml ├── docker-compose.http.yml ├── docker-compose.yml ├── install ├── nginx-auth │ ├── README.md │ ├── docker-compose.yml │ └── nginx.conf ├── nginx │ ├── docker-compose.yml │ └── nginx.conf └── traefik.yml └── tsconfig.json /.dockerignore: -------------------------------------------------------------------------------- 1 | dev 2 | docs 3 | client/node_modules 4 | -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | github: [ m1k1o ] 2 | -------------------------------------------------------------------------------- /.github/workflows/build.yml: -------------------------------------------------------------------------------- 1 | name: "CI for builds" 2 | 3 | on: 4 | push: 5 | branches: 6 | - master 7 | tags: 8 | - 'v*' 9 | 10 | jobs: 11 | build-client: 12 | name: Build Client Artifacts 13 | uses: ./.github/workflows/client_build.yml 14 | 15 | build-and-push: 16 | name: Build and Push Docker Image 17 | runs-on: ubuntu-latest 18 | needs: build-client 19 | steps: 20 | - name: Checkout 21 | uses: actions/checkout@v4 22 | with: 23 | fetch-depth: 0 24 | 25 | - name: Download client dist 26 | uses: actions/download-artifact@v4 27 | with: 28 | name: client 29 | path: client/dist 30 | 31 | - name: Set up QEMU 32 | uses: docker/setup-qemu-action@v3 33 | 34 | - name: Set up Docker Buildx 35 | uses: docker/setup-buildx-action@v3 36 | 37 | - name: Extract metadata (tags, labels) for Docker 38 | uses: docker/metadata-action@v5 39 | id: meta 40 | with: 41 | images: | 42 | docker.io/${{ github.repository }} 43 | ghcr.io/${{ github.repository }} 44 | tags: | 45 | type=raw,value=latest,enable=${{ endsWith(github.ref, github.event.repository.default_branch) }} 46 | type=semver,pattern={{version}} 47 | type=semver,pattern={{major}}.{{minor}} 48 | type=semver,pattern={{major}} 49 | 50 | - name: Log in to Docker Hub 51 | uses: docker/login-action@v3 52 | with: 53 | username: ${{ github.actor }} 54 | password: ${{ secrets.DOCKER_TOKEN }} 55 | 56 | - name: Log in to GitHub Container Registry 57 | uses: docker/login-action@v3 58 | with: 59 | registry: ghcr.io 60 | username: ${{ github.actor }} 61 | password: ${{ secrets.GHCR_ACCESS_TOKEN }} 62 | 63 | - name: Remove client stage from Dockerfile 64 | # Change dockerfile: remove first stage - everything between # STAGE 1 and # STAGE 2 65 | # Replace "--from=frontend /src/dist/" with "./client/dist/" 66 | run: | 67 | sed -i '/# STAGE 1/,/# STAGE 2/d' ./Dockerfile 68 | sed -i 's/--from=frontend \/src\/dist\//.\/client\/dist\//g' ./Dockerfile 69 | 70 | - name: Build and push 71 | uses: docker/build-push-action@v6 72 | with: 73 | context: ./ 74 | push: true 75 | tags: ${{ steps.meta.outputs.tags }} 76 | labels: ${{ steps.meta.outputs.labels }} 77 | platforms: linux/amd64,linux/arm64,linux/arm/v7 78 | cache-from: type=gha 79 | cache-to: type=gha,mode=max 80 | -------------------------------------------------------------------------------- /.github/workflows/client_build.yml: -------------------------------------------------------------------------------- 1 | name: Build Client 2 | 3 | on: 4 | workflow_call: 5 | inputs: 6 | with-artifact: 7 | required: false 8 | type: boolean 9 | default: true 10 | description: | 11 | If true, the build artifacts will be uploaded as a GitHub Actions artifact. 12 | This is useful for debugging and testing purposes. If false, the artifacts 13 | will not be uploaded. This is useful for test builds where you don't need 14 | the artifacts. 15 | 16 | jobs: 17 | build-client: 18 | name: Build Client 19 | runs-on: ubuntu-latest 20 | 21 | steps: 22 | - uses: actions/checkout@v4 23 | with: 24 | fetch-depth: 0 25 | 26 | - uses: actions/setup-node@v4 27 | with: 28 | node-version: 20 29 | cache: npm 30 | cache-dependency-path: client/package-lock.json 31 | 32 | - name: Install dependencies 33 | working-directory: ./client 34 | run: npm ci 35 | 36 | - name: Build client 37 | working-directory: ./client 38 | run: npm run build 39 | 40 | - name: Upload artifacts 41 | uses: actions/upload-artifact@v4 42 | if: ${{ inputs.with-artifact }} 43 | with: 44 | name: client 45 | path: client/dist 46 | -------------------------------------------------------------------------------- /.github/workflows/client_test.yml: -------------------------------------------------------------------------------- 1 | name: Test Client 2 | 3 | on: 4 | pull_request: 5 | branches: 6 | - master 7 | paths: 8 | - client/** 9 | - .github/workflows/client_build.yml 10 | - .github/workflows/client_test.yml 11 | 12 | jobs: 13 | test-client: 14 | name: Test Client 15 | uses: ./.github/workflows/client_build.yml 16 | with: 17 | # Do not upload artifacts for test builds 18 | with-artifact: false 19 | secrets: inherit 20 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .env 2 | bin 3 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | # 2 | # STAGE 1: build static web files 3 | # 4 | FROM node:20-bookworm-slim AS frontend 5 | WORKDIR /src 6 | 7 | # 8 | # install dependencies 9 | COPY client/package*.json client/.npmrc ./ 10 | RUN npm install 11 | 12 | # 13 | # build client 14 | COPY client/ . 15 | RUN npm run build 16 | 17 | # 18 | # STAGE 2: build executable binary 19 | # 20 | FROM golang:1.21-bullseye AS builder 21 | WORKDIR /app 22 | 23 | COPY . . 24 | RUN go get -v -t -d .; \ 25 | CGO_ENABLED=0 go build -o bin/neko_rooms cmd/neko_rooms/main.go 26 | 27 | # 28 | # STAGE 3: build a small image 29 | # 30 | FROM scratch 31 | COPY --from=builder /app/bin/neko_rooms /app/bin/neko_rooms 32 | COPY --from=frontend /src/dist/ /var/www 33 | 34 | ENV DOCKER_API_VERSION=1.39 35 | ENV NEKO_ROOMS_BIND=:8080 36 | ENV NEKO_ROOMS_ADMIN_STATIC=/var/www 37 | 38 | EXPOSE 8080 39 | 40 | ENTRYPOINT [ "/app/bin/neko_rooms" ] 41 | CMD [ "serve" ] 42 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # neko-rooms 2 | 3 |
10 | 11 | Simple room management system for [n.eko](https://github.com/m1k1o/neko). Self hosted rabb.it alternative. 12 | 13 |20 | Selfhosted collaborative browser (m1k1o/neko-rooms) - room management for n.eko 21 |
22 | 23 | 24 | -------------------------------------------------------------------------------- /client/src/App.vue: -------------------------------------------------------------------------------- 1 | 2 |{{ layer.id }} {{ layer.status }}{{ layer.progress && ' ' + layer.progress }}20 |
{{ text }}24 | 25 |
Preparing docker image pull26 |
Ports used:
7 |