Giter VIP home page Giter VIP logo

getmeli / meli Goto Github PK

View Code? Open in Web Editor NEW
2.4K 27.0 95.0 2.98 MB

Platform for deploying static sites and frontend applications easily. Automatic SSL, deploy previews, reverse proxy, and more.

License: Other

Shell 0.25% JavaScript 0.96% Dockerfile 0.11% TypeScript 93.83% Handlebars 0.03% HTML 0.10% SCSS 4.73%
deployment frontend meli getmeli webdev jamstack deployment-automation react angular deploy

meli's Introduction

meli-logo

meli

Open source platform for deploying static sites and frontend applications.

Docs (proudly hosted on Meli !) - Twitter

Discord

We are looking for maintainers ! Interested to take over ? Shoot us an email at [email protected]

Meli demo screenshot

Getting started

Want to change the way you ship front-end, forever ? Let's get started !

  1. Head to our installation instructions
  2. After you have installed Meli and have successfully logged in:
    1. Create a site in your dashboard, say my-site
    2. Upload a release with the @getmeli/meli CLI
    3. Setup my-domain.com to point to your Meli server at my-site.mymeli.com

Features

Development

  1. Run docker-compose -f ./docker-compose-dev.yml up -d
  2. Configure server/.env (copy server/.env.example to start with)
  3. Run npm i && npm start

You can now browse at http://localhost:8080:

  • http://localhost:8080/ => UI
  • http://localhost:8080/api, http://localhost:8080/auth, http://localhost:8080/system and http://localhost:8080/socket.io => API
  • http://loopback.sh => your sites will be served here

DNS config

You need to configure your machine to allow wildcard domains for development. We've got a few ways to do this.

Use loopback.sh

We've configured loopback.sh to point to 127.0.0.1, so you can develop with it. Update your .env.

MELI_SITES_URL=loopback.sh

Your sites will be served at *.loopback.sh.

Pros: simple, no config required Cons: you need to be connected to the internet

Using /etc/hosts

Unfortunately, /etc/hosts doesn't support wildcard domains, so you'll need to edit /etc/hosts for every site added to Meli:

127.0.0.1 my-site.test
127.0.0.1 my-channel.my-site.test

Pros: simple, can develop without internet Cons: have to reconfigure every time you add a site

Using dnsmasq

brew install dnsmasq

# tell dsnmasq to point *.test to 127.0.0.1
echo "address=/test/127.0.0.1" > /usr/local/etc/dnsmasq.conf

# start daemon
brew services start dnsmasq

# make OSX point to dnsmasq
sudo mkdir -p /etc/resolver

# tell os x to point *.test to 127.0.0.1
sudo echo "nameserver 127.0.0.1" > /etc/resolver/test

ping hello.test

Your sites will be served at *.test.

Pros: you don't need to be connected to the internet, no need to reconfigure /etc/hosts Cons: a bit complex, config required

License

The words "Open Source" in our README refer to the definition given by many well-recognized dictionaries of various languages, which is " used to describe software for which the original source code is made available to anyone".

The words "Open Source" in our license, introduced and written by MariaDB, refer to the definition given by the Open Source Foundation. Though we adopted this license to make it easier for users to recognize it, we disagree with this sentence being part of it and are working on this matter.

The BSL license allows you to modify, share, redistribute and use this software for free with the only condition that you do not run a competing SAAS service based on this project, which would both be unfair and jeopardize the options of making this tool sustainable.

We chose the BSL license because we believe it is fair for both users and maintainers. It allows us to secure a monetization path while providing proper support in the long run. Also, our license converts automatically within 4 years of each release to a license officially recognized by the Open Source Foundation, which secures a way for the community to see the sole restriction removed.

We are aware of the debate around the BSL conflicting with rule number 9 of the definition given by the Open Source Foundation. We do believe that, in specific cases, this rule should be relaxed as it prevents platform maintainers to secure a path to sustaining the development of their tool and support of their community while preventing large players from running unfair competition by leveraging their infrastructure and name. There is sufficient material on this matter available on the internet for users to make up their mind.

As a side note, rule number 9 conflicts similarly with the BSL than with the GPL3.0, which does restrict the creation of other software in its own way, while still being officially recognized by the Open Source Foundation.

meli's People

Contributors

berndinox avatar dotneet avatar gempain avatar gquittet avatar meli-release-bot avatar pimartin avatar semantic-release-bot avatar sohelahmed7 avatar tanc avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

meli's Issues

could not update site: Error: Request failed with status code 400, when disabling Automatic SSL (ACME)

hello, first of all thanks for awesome project!

i have deployed meli on meli.domain.com(couldn't get sub directory to work, is it supported?) and i want the site to be at domain.com

both domain.com and meli.domain.com are set to reverse proxy for 127.0.0.1:9999
however when adding domain.com to meli org it shows:
Could not update site: Error: Request failed with status code 400

and when visiting domain.com apache2 shows : Requested URL not served on this server

this is not mentioned in the docs, and i don't want the site to be a subdomain

Add version check

We'll be adding a version check so that users know if they have the latest version of Meli. A message will be displayed in the UI.

Unable to logon after fresh install using a static username-password

Hello,

Problem Description

I deployed meli on a VPS using the installation instruction via https://docs.meli.sh/get-started/installation

Upon the attempt to log in I'm unable to authenticate and receive error message with status code 401

I changed the "following" in my docker-compose.yml file:

  MELI_JWT_SECRET: "A random 37-charter using upper case, lower case, numbers and symbols"
  # https://docs.meli.sh/authentication
  MELI_USER: "changed the user name"
  MELI_PASSWORD: "A random 37-charter using upper case, lower case, numbers and symbols"

// There is a space between : and the first character of user and password values

Steps to Reproduce

docker-compose up

I get prompted with a logon page

I enter the user name and password as configured in MELI_USER and MELI_PASSWORD respectively.

I receive the following error message:

Could not sign in: Error: Request failed with status code 401

Thanks in advance!

UX improvements for toggle buttons

I got confused a couple of times by the "off" state of the toggle button, since it still incorporates the brand color. Instead of having the gradiant background, I'd recommend just a plain dark gray, like this:

Kubernetes Manifest

I'm about to convert the compose files to kubernetes manifests.
Deploying a K8s Environment is as easy as starting docker nowadays.

Any suggsetion on the folder structure? Where can i push the .yaml files to?

thanks

Be able to set a site username and multiple accounts

I want my project to feel well protected when sharing the site with collaborators and clients.
However, it doesn't look professional for the user name to be user.
As if the administrator account ID is admin.

So I at least want to be able to set the user name myself.
And if possible, I would like to be able to set up multiple accounts like Netlify.
Netlify can configure multiple accounts through _headers as follows.
Basic-Auth: user1:password1 user2:password2

It's good enough now, but I hope you consider my opinion.

Feature-Reqeuest: Add Domain & ENV Bash

I would suggest to add those 2 features:

1)
Right now, you can just add an Domain with ACME or with a Custom Certificate.
When beeing behind an SSL-Terminating Reverse-Proxy (like in K8s) no Cert is needed at all.
How to solve: 3rd Option: Add Domain without Cert
image

2)
MELI_MONGO_URI should be generated using a bash script inside the container.

In addition we should use the ENV VARs, eg.:

MELI_MONGO_USER
MELI_MONGO_PASSWORD
MELI_MONGO_HOST
MELI_MONGO_PORT
MELI_MONGO_DB

The second change is not mandatory, but would make the K8s config easier, also a Secret could be used to inject the Password.

Custom 404 pages not matched

Sites can create a custom 404.html page at their root. When a file isn't found for a site, Meli rewrites the uri to /404.html, showing your custom page.

This behavior is broken in v1.0.0-beta.4. It has been fixed on the next branch and will be fixed in v1.0.0-beta.5.

Cant add members to organization or team

Hi guys.

I tried to invite myself using a different email address and got the invite link but when I open it, it just takes me to the meli auth page. Thinking it could be a caching issue, I tried on an incognito window and even another browser to the same result.

While trying to add a member to a team, the pop-up window says "Add branch" instead of "Add member" and there seems to be no way to a new member from it anyways.

Hope this helps to debug this great app.

Cheers.

Installation under traefik v2

Could you provide a docker compose using meli under traefik?
It would be very helpful and would be an annex to the documentation.

Trying to set a branch password crashes Meli

When I head over to a branch and check the "protected" box, and confirm the modal, Meli crashes with no logs and exit code 139 (running in Docker, on the getmeli/meli:beta image).

Custom Logo and Server Name

Hi @gempain ,

This is more like a feature request.

Considering that Meli is self-hosted, it'd be cool to have the ability to change the logo to a custom one and also change the server name from Meli to a custom name, so that email invites, notifications, etc, show a name my users can recognize and therefor trust.

This could even be a "premium"/paid feature, but I think, as portainer does, it would open Meli to be used as a base for commercial or pseudo-commercial use, therefore boosting interest and adoption.

Cheers,

CLI configuration file

Credits to @robertorubioguardia for suggesting this feature.

It would be nice to have a .melirc configuration file. For example:

version: 1
upload:
  siteId: 123
  token: token
  url: https://meli.domain.com

and then

@getmeli/cli upload ./dir

This file could be source from:

  • the current directory
  • the home directory
  • the --config CLI option

403 when non-admin tries to get a team

Following the comment from @robertorubioguardia.


HI @gempain

I managed to add GitHub authentication and accept the invite following your instructions and then added the user as a member of a team in my organization, with no admin powers.

Thing is, when I log in from the new invited user, I get a 403 error in the GUI where the teams should be listed.
The API error in the console is:

{
"statusCode": 403,
"path": "/api/v1/teams/b6ddb484-0feb-4ae7-bf78-45aeaed6f67f/sites",
"message": "Cannot get team"
}

If I add the user to the team with admin powers, there is no error. I have also confirmed the team ID is valid.

Cheers.

Create public discussion channel

As our community is growing, it would be nice to create a public discussion channel where we can chat about improvements and keep issues relatively concise and focused.

I reached out to Github for entering the beta for discussions, but we haven't heard back. I'm considering a Slack organization with auto-invite (but Slackin uses an API which will be deprecated in a couple of weeks, so I'm not really confident in this).

There's also Discord, but I don't know whether this would be a good option, and I like using Slack as well.

If you have ideas, feel free to comment here.

Co-Exist with nginx

Would be pretty nice to be able to run this on an existing nginx installation. I have only one IP address, is this possible? If yes, how?

SSL error on branch deploy when using underscores in site name

First of all thanks for this project, it looks really great! As I'm new to it and just testing it out to see whether it suits my needs I may have missed something in the set up. I'm seeing an issue when trying to view a branch on a site. Curl tells me there is the following SSL error:

error:14094438:SSL routines:ssl3_read_bytes:tlsv1 alert internal error

Chrome reports:

ERR_SSL_PROTOCOL_ERROR

I've set up a wildcard domain which resolves fine but there appears to be something wrong at the Caddy stage.

The branch/site I'm trying to look at is: https://main.tanc_me.meli.jampony.net/

Meli is set up following the docs on a fresh Ubuntu 20.04 server with no other services running.

Looking at the docker logs I'm seeing the following errors from letsencrypt:

{"level":"debug","ts":1613740447.9163651,"logger":"tls.issuance.acme.acme_client","msg":"http request","method":"HEAD","url":"https://acme.zerossl.com/v2/DV90/newNonce","headers":{"User-Agent":["Caddy/2.3.0 CertMagic acmez (linux; amd64)"]},"status_code":200,"response_headers":{"Access-Control-Allow-Origin":["*"],"Cache-Control":["max-age=-1"],"Content-Type":["application/octet-stream"],"Date":["Fri, 19 Feb 2021 13:14:07 GMT"],"Link":["<https://acme.zerossl.com/v2/DV90>;rel=\"index\""],"Replay-Nonce":["JvuPCaUS9gPItnTHBMgpTd_5RQ4pb501yXfG18Oqr2I"],"Server":["nginx"],"Strict-Transport-Security":["max-age=15552000"]}}
{"level":"debug","ts":1613740447.9933982,"logger":"tls.issuance.acme.acme_client","msg":"http request","method":"POST","url":"https://acme.zerossl.com/v2/DV90/newOrder","headers":{"Content-Type":["application/jose+json"],"User-Agent":["Caddy/2.3.0 CertMagic acmez (linux; amd64)"]},"status_code":400,"response_headers":{"Access-Control-Allow-Origin":["*"],"Cache-Control":["max-age=0, no-cache, no-store","max-age=-1"],"Content-Length":["130"],"Content-Type":["application/problem+json"],"Date":["Fri, 19 Feb 2021 13:14:07 GMT"],"Link":["<https://acme.zerossl.com/v2/DV90>;rel=\"index\""],"Replay-Nonce":["y4__AsuK_pTlWqf6NulkTUurVzs4LAo-_tSNPZpfC7c"],"Server":["nginx"]}}
{"level":"error","ts":1613740447.9936416,"logger":"tls.obtain","msg":"will retry","error":"[tanc_me.meli.jampony.net] Obtain: [tanc_me.meli.jampony.net] creating new order: request to https://acme.zerossl.com/v2/DV90/newOrder failed after 1 attempts: HTTP 400 urn:ietf:params:acme:error:rejectedIdentifier - Invalid DNS identifier [tanc_me.meli.jampony.net] (ca=https://acme.zerossl.com/v2/DV90)","attempt":1,"retrying_in":60,"elapsed":7.688670099,"max_duration":2592000}

Any ideas?

SSO Support (OIDC/SAML/LDAP)

It would be neat if accounts could be managed from any arbitrary IdP (like Keycloak, Okta, etc.) - which primarily use the protocols mentioned in the title.

Reverse Proxy Support

Hello! This is a great app especially with SPA mode. I think most people would also like the ability to serve this through a reverse proxy instead of expose meli directly due to other web services also running in the same server (the case for self hosters, for example). So far I have tried the following:

  • Use nginx with meli but use app url as https
    • This causes an issue since nginx cannot proxy an https service
  • Use nginx with meli but use app url as http
    • This causes websockets to fail, thus meli cannot load

If there is a way to do this with docker-compose already, please let me know. If that is not the case, you could add an env that configures this, however I'm not sure how to implement it myself.

Error: Request body larger than maxBodyLength limit

I tried to upload the site through GitHub Actions, but it fails with an error.
This error occurs during the publish phase and everything else goes well.

โœ… Set up job
โœ… Run actions
โœ… checkout@v2
โœ… Run actions
โœ… setup-node@v1
โŒ publish
โœ… Post Run actions/checkout@v2
โœ… Complete Job

From what I have looked at, it is already defined as maxBodyLength: Infinity in the meli-cli/src/commons/axios/axios.ts file, so I don't know which part is the problem.
And there doesn't seem to be an option available for maxBodyLength other than token, site, url, directory, release, branch, so am I missing something?

Please refer to my failure log.

Run npx @getmeli/cli@next upload \
npx: installed 84 in 4.616s

 Meli CLI v1.0.0-next.4 - 2020-12-04T16:24:43.261Z - dfa044bbd899b53cfe0d965c077c88ad2779577c

fv-az281-686 2543 2021-01-15T12:20:36.369Z info  meli.cli:upload Compressing files from ./.... 
fv-az281-686 2543 2021-01-15T12:20:39.484Z info  meli.cli:upload Uploading release to https://xxx.yyy.zzz... 
Error: r]: Request body larger than maxBodyLength limit
    at /home/runner/.npm/_npx/2543/lib/node_modules/@getmeli/cli/build/index.js:2:1911
    at processTicksAndRejections (internal/process/task_queues.js:97:5)
    at Object.t.uploadArchive (/home/runner/.npm/_npx/2543/lib/node_modules/@getmeli/cli/build/index.js:2:6541)
    at Object.t.upload (/home/runner/.npm/_npx/2543/lib/node_modules/@getmeli/cli/build/index.js:2:4281) {
  error: Error [ERR_FR_MAX_BODY_LENGTH_EXCEEDED]: Request body larger than maxBodyLength limit
      at RedirectableRequest.write (/home/runner/.npm/_npx/2543/lib/node_modules/@getmeli/cli/node_modules/follow-redirects/index.js:96:24)
      at FormData.ondata (internal/streams/legacy.js:19:31)
      at FormData.emit (events.js:314:20)
      at FormData.CombinedStream.write (/home/runner/.npm/_npx/2543/lib/node_modules/@getmeli/cli/node_modules/combined-stream/lib/combined_stream.js:138:8)
      at DelayedStream.ondata (internal/streams/legacy.js:19:31)
      at DelayedStream.emit (events.js:314:20)
      at DelayedStream._handleEmit (/home/runner/.npm/_npx/2543/lib/node_modules/@getmeli/cli/node_modules/delayed-stream/lib/delayed_stream.js:82:15)
      at ReadStream.source.emit (/home/runner/.npm/_npx/2543/lib/node_modules/@getmeli/cli/node_modules/delayed-stream/lib/delayed_stream.js:29:19)
      at addChunk (_stream_readable.js:297:12)
      at readableAddChunk (_stream_readable.js:272:9)
  Error: Thrown at:
      at /home/runner/.npm/_npx/2543/lib/node_modules/@getmeli/cli/build/index.js:2:1807
      at Object.t.uploadArchive (/home/runner/.npm/_npx/2543/lib/node_modules/@getmeli/cli/build/index.js:2:6541)
      at Object.t.upload (/home/runner/.npm/_npx/2543/lib/node_modules/@getmeli/cli/build/index.js:2:4281) {
    config: {
      url: 'https://xxx.yyy.zzz/api/v1/sites/$Site_ID/releases',
      method: 'post',
      data: [FormData],
      headers: [Object],
      transformRequest: [Array],
      transformResponse: [Array],
      timeout: 0,
      adapter: [Function: httpAdapter],
      xsrfCookieName: 'XSRF-TOKEN',
      xsrfHeaderName: 'X-XSRF-TOKEN',
      maxContentLength: -1,
      maxBodyLength: -1,
      validateStatus: [Function: validateStatus],
      errorContext: Error: Thrown at:
          at /home/runner/.npm/_npx/2543/lib/node_modules/@getmeli/cli/build/index.js:2:1807
          at Object.t.uploadArchive (/home/runner/.npm/_npx/2543/lib/node_modules/@getmeli/cli/build/index.js:2:6541)
          at Object.t.upload (/home/runner/.npm/_npx/2543/lib/node_modules/@getmeli/cli/build/index.js:2:4281)
    },
    request: Writable {
      _writableState: [WritableState],
      writable: true,
      _events: [Object: null prototype],
      _eventsCount: 2,
      _maxListeners: undefined,
      _options: [Object],
      _ended: false,
      _ending: false,
      _redirectCount: 0,
      _redirects: [],
      _requestBodyLength: 10420464,
      _requestBodyBuffers: [Array],
      _onNativeResponse: [Function],
      _currentRequest: [ClientRequest],
      _currentUrl: 'https://xxx.yyy.zzz/api/v1/sites/$Site_ID/releases',
      [Symbol(kCapture)]: false
    },
    response: undefined,
    isAxiosError: true,
    toJSON: [Function: toJSON]
  }
}
{
  "errorObject": {
    "message": "Request body larger than maxBodyLength limit",
    "name": "Error [ERR_FR_MAX_BODY_LENGTH_EXCEEDED]",
    "stack": "Error [ERR_FR_MAX_BODY_LENGTH_EXCEEDED]: Request body larger than maxBodyLength limit\n    at RedirectableRequest.write (/home/runner/.npm/_npx/2543/lib/node_modules/@getmeli/cli/node_modules/follow-redirects/index.js:96:24)\n    at FormData.ondata (internal/streams/legacy.js:19:31)\n    at FormData.emit (events.js:314:20)\n    at FormData.CombinedStream.write (/home/runner/.npm/_npx/2543/lib/node_modules/@getmeli/cli/node_modules/combined-stream/lib/combined_stream.js:138:8)\n    at DelayedStream.ondata (internal/streams/legacy.js:19:31)\n    at DelayedStream.emit (events.js:314:20)\n    at DelayedStream._handleEmit (/home/runner/.npm/_npx/2543/lib/node_modules/@getmeli/cli/node_modules/delayed-stream/lib/delayed_stream.js:82:15)\n    at ReadStream.source.emit (/home/runner/.npm/_npx/2543/lib/node_modules/@getmeli/cli/node_modules/delayed-stream/lib/delayed_stream.js:29:19)\n    at addChunk (_stream_readable.js:297:12)\n    at readableAddChunk (_stream_readable.js:272:9)\nError: Thrown at:\n    at /home/runner/.npm/_npx/2543/lib/node_modules/@getmeli/cli/build/index.js:2:1807\n    at Object.t.uploadArchive (/home/runner/.npm/_npx/2543/lib/node_modules/@getmeli/cli/build/index.js:2:6541)\n    at Object.t.upload (/home/runner/.npm/_npx/2543/lib/node_modules/@getmeli/cli/build/index.js:2:4281)",
    "config": {
      "url": "https://xxx.yyy.zzz/api/v1/sites/$Site_ID/releases",
      "method": "post",
      "data": {
        "_overheadLength": 455,
        "_valueLength": 47,
        "_valuesToMeasure": [
          {
            "_readableState": {
              "objectMode": false,
              "highWaterMark": 65536,
              "buffer": {
                "head": null,
                "tail": null,
                "length": 0
              },
              "length": 0,
              "pipes": null,
              "pipesCount": 0,
              "flowing": true,
              "ended": false,
              "endEmitted": false,
              "reading": true,
              "sync": false,
              "needReadable": true,
              "emittedReadable": false,
              "readableListening": false,
              "resumeScheduled": false,
              "emitClose": false,
              "autoDestroy": false,
              "destroyed": false,
              "defaultEncoding": "utf8",
              "awaitDrainWriters": null,
              "multiAwaitDrain": false,
              "readingMore": false,
              "decoder": null,
              "encoding": null
            },
            "readable": true,
            "_events": {},
            "_eventsCount": 3,
            "path": "/tmp/$Site_ID-ccde4f0c22904be8dc984f6b2004266bd01625be-undefined.tar.gz",
            "fd": 21,
            "flags": "r",
            "mode": 438,
            "end": null,
            "autoClose": true,
            "bytesRead": 10485760,
            "closed": false
          }
        ],
        "writable": true,
        "readable": true,
        "dataSize": 0,
        "maxDataSize": 2097152,
        "pauseStreams": true,
        "_released": true,
        "_streams": [
          null,
          "----------------------------036290788713385731011627\r\nContent-Disposition: form-data; name=\"release\"\r\n\r\n",
          "ccde4f0c22904be8dc984f6b2004266bd01625be",
          null,
          "----------------------------036290788713385731011627\r\nContent-Disposition: form-data; name=\"branches\"\r\n\r\n",
          "develop",
          null
        ],
        "_currentStream": {
          "source": {
            "_readableState": {
              "objectMode": false,
              "highWaterMark": 65536,
              "buffer": {
                "head": null,
                "tail": null,
                "length": 0
              },
              "length": 0,
              "pipes": null,
              "pipesCount": 0,
              "flowing": true,
              "ended": false,
              "endEmitted": false,
              "reading": true,
              "sync": false,
              "needReadable": true,
              "emittedReadable": false,
              "readableListening": false,
              "resumeScheduled": false,
              "emitClose": false,
              "autoDestroy": false,
              "destroyed": false,
              "defaultEncoding": "utf8",
              "awaitDrainWriters": null,
              "multiAwaitDrain": false,
              "readingMore": false,
              "decoder": null,
              "encoding": null
            },
            "readable": true,
            "_events": {},
            "_eventsCount": 3,
            "path": "/tmp/$Site_ID-ccde4f0c22904be8dc984f6b2004266bd01625be-undefined.tar.gz",
            "fd": 21,
            "flags": "r",
            "mode": 438,
            "end": null,
            "autoClose": true,
            "bytesRead": 10485760,
            "closed": false
          },
          "dataSize": 0,
          "maxDataSize": null,
          "pauseStream": true,
          "_maxDataSizeExceeded": false,
          "_released": true,
          "_bufferedEvents": [],
          "_events": {
            "error": [
              null,
              null
            ],
            "end": [
              null,
              null
            ]
          },
          "_eventsCount": 4
        },
        "_insideLoop": false,
        "_pendingNext": false,
        "_boundary": "--------------------------036290788713385731011627",
        "_events": {
          "error": [
            null,
            null
          ]
        },
        "_eventsCount": 3
      },
      "headers": {
        "Accept": "application/json, text/plain, */*",
        "Content-Type": "multipart/form-data; boundary=--------------------------036290788713385731011627",
        "x-meli-token": "$Token",
        "User-Agent": "axios/0.21.1"
      },
      "transformRequest": [
        null
      ],
      "transformResponse": [
        null
      ],
      "timeout": 0,
      "xsrfCookieName": "XSRF-TOKEN",
      "xsrfHeaderName": "X-XSRF-TOKEN",
      "maxContentLength": -1,
      "maxBodyLength": -1,
      "errorContext": {}
    },
    "code": "ERR_FR_MAX_BODY_LENGTH_EXCEEDED"
  },
  "response": {}
}
Error: Process completed with exit code 1.

Where do I sign in?

I'm interested in using this new piece of software but I can't find the page to sign in?

The doc currently just says "sign in" under the "how it works" section.

It must be somewhere obvious and I'm too blind so see it, or is it not available yet?

Custom domains don't work for branch deploys

I have setup DNS records (A) for project.company.io and *.project.company.io, pointing at the Meli IP.

I then added project.company.io into the "Domains" section of the site settings. This now works perfectly for project.company.io itself, pointing towards the main branch.

However, if I call branch.project.company.io, I get a ERR_SSL_PROTOCOL_ERROR, with a "no server TLS configuration available" error.

This is fixable, if I add *.project.company.io to the domains in the site settings, but I feel like this either requires some docs or should happen automatically.

Make Docker image non-root

(suggested by Berndinox in #205; been bugging me for a while too)

Currently, the Docker image exposes port 80. We should change this so that running Meli doesn't require root access.

We'll need to update the deployment docs.

Production npm package

Could we expect a production-ready npm package?

Managing a production setup manually using git / npm not only pulls lots of bloat (e.g. development tools for building the optimized version, the entire .git tree, etc.), but is also cumbersome in environment and paths management, whereas a well-setup nodejs environment can provide binaries in the path with just an npm i -g ....

Hook for MS Teams

i'd love to see a Webhook for MS Teams.

curl -H 'Content-Type: application/json' -d '{"text": "Hello World"}' <YOUR WEBHOOK URL>
MS Docs

Sorry for spamming so much... :)

Merge ui and server into a single repo

This will make things easier for contributors to engage.

  • merge ui repo into this repo
  • update scripts, CI and Docker image
  • update docs
  • setup proxy for development
  • remove dynamic env from frontend, fetch from backend

UX improvements for settings

Hey, I'm just gonna keep posting issues for stuff I notice during trailing this, hope that's okay :)

In the page settings (and the branch settings) I was confused a couple of times why my changes did not persist, because I was not expecting the save button to be at the top of the page (out of the screen when scrolled down). I'd recommend either using save buttons for sections, or having a global save button at the bottom. If you're looking for inspiration, this UI is pretty similar to what you are doing

Change API scopes format to match enum

At the moment, we're mapping enum keys (kebab case) to dot-case (site_branch_headers_set = site.branch.headers.set. To keep things simple and be consistent, we'll use the same value for key and value.

Stop using joi.alternatives

It's doesn't provide exploitable error messages. Instead, use

const joi = require('joi');

const schema = joi.object({
    type: joi.string(),
  })
  .when('.type', {
    is: 'a',
    then: joi.object({
      prop: joi.string()
        .required(),
    }),
  })
  .when('.type', {
    is: 'b',
    then: joi.object({
      prop: joi.number()
        .required(),
    }),
  });

const res = schema.validate({
  type: 'b',
  prop: 'a',
});

console.log(res);

Using . before type allows having the type property at the same level as all other properties, hence not having to use a sub property for the polymorphism.

Save return URL during authentication

When a user authenticates, we need to store the return URL so we can restore it after sign-in. This is particularly annoying when accepting invitations into an organization.

npx command fails when executed via Github Actions

Hi,
I set up a github action that will trigger a build process and publishes the build on my meli installation.
Whoever using the npx command:
npx @getmeli/cli upload ./build --branch [branch] --site [site] --url [url] "--token=***"

Will result in an npm error:
Cannot open assembly 'upload': No such file or directory. npm ERR! code ELIFECYCLE npm ERR! errno 2

I wrapped that command as a npm script and tested the whole process on my computer. It went through without a problem. But fails when executed in github actions.
How the runner calls the command up above:

     - name: Run build & deploy
       working-directory: ./landingpage
       run: |
         npm ci
         npm run build
         npm run meli -- --token=${{secrets.MELI_TOKEN}}

I neither found any hint solving the problem on the web nor in an old issue here.
Thanks for helping

Could not create org

Hello.
I installed meli on EC2(Linux 2) on AWS.
Domain setup and connection were also successful.
The problem is the next step.
When I logged in, I went to the /orgs page and clicked the ADD ORG button to create an organization.
Then an error message like Could not create org: Error: Request failed with status code 500 appeared and I couldn't move on to the next step.
How can I fix it.
I need help.

Drop Mongo for Postgres

We're considering moving away from Mongo and using Postgres instead. We'd like input from the community.

We have used Mongo for many years. It offers great things such as:

  • few constraints
  • easy polymorphism
  • almost no need for an ORM

but:

  • ObjectIDs are still hard to get used to
  • testing is difficult, it's complicated to setup a proper testing environment in CIs, and the ecosystem isn't that large (though we could've used Mongoose/Mockgoose)

We'd like to see how to the community sees this, so if you have any opinion, please share !

Add "delete" command to the CLI

I would like to see a "delete" command added to the Meli CLI that deletes the deploy of a specific branch. In my use-case, which is deploying branches via CI as previews, each PR generates a deploy, and I would like to be able to automatically clean it up once the PR gets closed. Right now I have to head over into the UI to click the delete button.

Sidebar doesn't update unless page refreshed

Minor UI issue: when creating a new site or editing an existing one the sidebar doesn't reflect the changes until the page is manually refreshed.

To reproduce:

  1. Create a site
  2. Edit the site settings
  3. Change the associated colour
  4. Save the site's settings form
  5. Note that the colour in the sidebar doesn't change
  6. Reload the page
  7. Note the the colour in the sidebar has changed

Add the ability to set a site-wide password

I would like to set a password on a site basis, so it gets automatically applied to all branches that get uploaded.

The use-case here is an internal documentation I would like to deploy once for master, and then automatically for each pull request - but all branches have to be protected.

An alternative would be the ability to set the password via the CLI tool during upload.

GH Action Error: Cannot open assembly 'upload'

Error Message:

Run npx @getmeli/cli upload \
  npx @getmeli/cli upload \
    --url "https://meli.DOMAIN.at" \
    --site "$MELI_SITE" \
    --token "$MELI_TOKEN" \
    --release "$GITHUB_SHA" \
    ./public
  shell: /usr/bin/bash -e {0}
  env:
    MELI_SITE: ebbcef92-c923-4bfc-bdf1-605a6b275f3e
    MELI_TOKEN: ***
    GITHUB_TOKEN: ***
Cannot open assembly 'upload': No such file or directory.
Error: Process completed with exit code 2.

Github Action:

name: main
on: [ push ]
env:
  MELI_SITE: "SITEID"
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - uses: actions/setup-node@v1
        with:
          node-version: "12"
      - name: "build"
        run: |
          npm install
          npm run build
      - name: "publish"
        run: |
          npx @getmeli/cli upload \
            --url "https://meli.DOMAIN.at" \
            --site "$MELI_SITE" \
            --token "$MELI_TOKEN" \
            --release "$GITHUB_SHA" \
            ./public
        env:
          MELI_TOKEN: ${{ secrets.MELI_TOKEN }}
          # Enable PR previews:
          # uses the default GITHUB_TOKEN set by Github Actions
          # https://docs.github.com/en/actions/reference/authentication-in-a-workflow#about-the-github_token-secret
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

Increase test coverage

We've started increasing test coverage of Meli in order to stabilize the current implementation. If you're interested to help, just pick an endpoint and go for it.

At the moment, we're testing guards and API endpoints while the Caddy configuration is being refactored by @pimartin.

Any input welcome.

Ability to set cache-control headers and compression

At the moment it seems like there is no cache-control header set and the resources are served with no compression (gzip, brotli).

It would be great if Meli had some sane defaults, much like Netlify does, which would make serving static files even more efficient. Then ideally there would be some settings to configure cache headers on a site-by-site basis within the UI (or a config file like Netlify uses).

Netlify set a cache-control header like this:

cache-control: public, max-age=0, must-revalidate

They say that it makes the browser re-check for changes each time but against the etag to see if anything has changed. Supposedly this is very efficient with HTTP2. From what I can tell without a cache-control header my browser is caching the resources served by Meli and when I update the branch with a new release I got inconsistent results. One time I reloaded the page and the css file I'd changed didn't update, then on other releases it did update. Without further testing its hard to say whether setting a cache-control would provide the consistency or hurt performance.

It would be good to see resources gzipped on-the-fly with Caddy, I believe this is the directive: https://caddyserver.com/docs/caddyfile/directives/encode

Thanks for your efforts!

Potential Bug Risks and Anti-Patterns

Description

I ran DeepSource Static Code Analysis upon the Project, the results for which are available here.

The Static Code Analysis Tool found potential bugs and anti-patterns in the Code, that can be detrimental at a later point of time with respect to the Project. DeepSource helps you to automatically find and fix issues in your code during code reviews. This tool looks for anti-patterns, bug risks, performance problems, and raises issues.

Some of the notable issues are:

  • Instances of child_process and non-literal exec() here
  • Use of require statements except in import statements here
  • rest parameters used instead of arguments here
  • Using String Concatenation instead of template literals here

There are plenty of other issues in relation to Bug Discovery and Anti-Patterns which you would be interested to take a look at.

No server TLS configuration available

I ran into another issue trying to set up Meli via the newest Docker image. I keep getting the following error:

{"level":"debug","ts":1607999698.0814688,"logger":"http.stdlib","msg":"http: TLS handshake error from <my ip redacted>:63030: no server TLS configuration available for ClientHello: &{CipherSuites:[31354 4865 4866 4867 49195 49199 49
196 49200 52393 52392 49171 49172 156 157 47 53] ServerName:palette.meli.devoxa.io SupportedCurves:[CurveID(19018) X2551
9 CurveP256 CurveP384] SupportedPoints:[0] SignatureSchemes:[ECDSAWithP256AndSHA256 PSSWithSHA256 PKCS1WithSHA256 ECDSAW
ithP384AndSHA384 PSSWithSHA384 PKCS1WithSHA384 PSSWithSHA512 PKCS1WithSHA512] SupportedProtos:[h2 http/1.1] SupportedVer
sions:[14906 772 771 770 769] Conn:0xc00085a8c8 config:0xc000537800}"}

It looks like this might be the cause, but I am not sure caddyserver/caddy#3004 - it did work just fine with the version of a couple of days ago. I have since set up Meli from Scratch and it has not fixed the issue.

Upload command from docs not working

Hi guys,

I had to reorder the arguments in the upload command for it to work. Using it as stated in your docs it failed.

The working form was:

npx @getmeli/cli upload \
    ./public \
    --url https://myurl.tld \
    --site mysiteid \
    --token sometoken \
    --branch "master"

Note the folder was moved and put before the rest of the arguments. Error was: Not enough non-option arguments: got 0, need at least 1

Cheers and thanks for such a great tool.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.