Private, self-hosted Composer/Satis repository with unlimited private and open-source packages and support for Git, Mercurial, and Subversion.

Overview

lukaszlach / satis-server

Version Docker pulls Docker stars

Satis Server provides ready to use solution for self-hosted repository of Composer packages, it is distributed as a lightweight Docker image based on Alpine Linux. With the power of Satis, Composer and WebHook projects, it provides a set of powerful tools:

  • Private, self-hosted Composer repository with unlimited private and open-source packages and support for Git, Mercurial, and Subversion.
  • API - HTTP API with several endpoints allowing you to add and remove packages, build one single package or whole repository, list packages with last build date information, show package details, dump Satis configuration file. Access to the API can be restricted to selected subnetwork mask.
  • Webhook handler - bind HTTP PUSH event in GitHub, GitLab or Beanstalk to automatically rebuild Satis index just after commit is made. This HTTP endpoint can be secured with a pre-shared key.
  • Scheduled builds - periodically rebuild whole Satis repository, based on crontab expression.
  • Command-line interface - manage Satis Server from command-line, all Satis API endpoints are available as shell commands.
  • Build notifier - send message to Slack or HipChat channel when repository or single package is rebuilt.
  • HTTPs support.

Installing

Use automated install script, that pulls Docker image, creates directory structure and configuration files and installs start/stop commands for you, by executing below command. If you prefer to do it manually - proceed with usage instructions, as Docker image will download automatically on first usage.

export SATIS_SERVER_VERSION=1.1
curl -L "https://raw.githubusercontent.com/lukaszlach/satis-server/$SATIS_SERVER_VERSION/install" | bash

You will see "satis-server installed and running" message after installation is done, satis.json file is created under /etc/satis (if did not exist before), this is also repository build directory where output JSON/ZIP files are stored. Configuration directory /etc/satis-server holds satis-server.conf that allows you to modify settings.

Installation process also adds satis-server-start and satis-server-stop management commands and satis-server-help command.

You can use the same commands to upgrade Satis Server, all your configuration values, repository settings and packages will be preserved. Just change SATIS_SERVER_VERSION to desired version.

Building manually

You need to have Docker installed to run this project.

git clone https://github.com/lukaszlach/satis-server.git satis-server/
cd satis-server/
# build the "lukaszlach/satis-server:latest" image
make

Running

If you have installed Satis Server using automated install script there are satis-server-start and satis-server-stop commands already available on your server, below section covers manual installations.

In order to properly run Satis Server Docker container you need to pass at least one volume:

  • (required) directory where satis.json configuration is kept and where built files will be stored, i.e. /etc/satis
  • (optional) satis-server configuration directory, allows adding your own SSH key to use with private repositories and handle HTTPs, i.e. /etc/satis-server
  • (optional) satis-server working directory where current status is kept, i.e. /var/satis-server

In case /etc/satis/satis.json does not exist in the container it will be created with empty repository settings.

If you do not bind working directory volume, packages "last updated" information displayed by HTTP endpoints will be missing after Docker container is restarted. However, they can be always regenerated by rebuilding the repository or a single package.

Container exposes Satis API on ports 80 and 443, second one is reachable only with configured HTTPs.

Below command runs Satis Server listening on port 8080:

docker run -d \
    -p 8080:80 \
    -v /etc/satis:/etc/satis/ \
    -v /etc/satis-server/:/etc/satis-server/ \
    -v /var/satis-server/:/var/satis-server/ \
    --name satis_server \
    lukaszlach/satis-server:latest

You can also try an example docker-compose.yml file provided in this repository:

docker-compose -f docker-compose.yml.example up -d

Run docker logs satis_server -f to monitor logs or docker stop satis_server to stop the container.

You can always view the documentation you are currently reading by calling docker run --rm lukaszlach/satis-server:latest help

Configuration

satis-server.conf

Automated installation creates configuration file under /etc/satis-server/satis-server.conf that is used by docker-compose.yml file from the same directory to start and stop the service, environment variables are passes automatically. This file has simple FIELD=value structure, currently below options are recognized:

satis-server.conf.example file with example configuration is available in root directory of this repository.

SSH key for private repositories

In order to use private repositories (including GitHub) you have to provide SSH key that both Composer and Satis will use to fetch repository contents.

SSH key should be available under /etc/satis-server/ssh/id_rsa file. If runnning manually you can do it with -v /etc/satis-server:/etc/satis-server to mount the whole config directory or -v /path/to/id_rsa:/etc/satis-server/ssh/id_rsa to mount this single file only.

HTTPs

If you want to serve Satis API and webhook handler through HTTPs you need to place cert.pem and key.pem files inside /etc/satis-server/https/ configuration directory. Existence of these files is detected automatically and after restart satis-server starts working over SSL.

Scheduled builds

You can easily configure Satis Server to automatically rebuild the whole Satis repository once a day or every few hours/minutes.

For automated installation you have to edit REBUILD_AT in /etc/satis-server/satis-server.conf, when running Docker image manually pass SATIS_REBUILD_AT environment variable i.e. -e SATIS_REBUILD_AT="1 0 * * *" to rebuild at one minute past midnight (00:01) every day. The value must be a valid crontab expression.

Use your repository

Point Satis Server repository in your composer.json and require your packages by name, exactly as public packages.

{
    "repositories": [
        {"type": "composer", "url": "https://your-server/"}
    ],
    "require": {
        "org/foo": "~1.0",
        "org/bar": "dev-master",
        "php-amqplib/php-amqplib": "v2.6.3"
    }
}

For more details read Composer documentation on how to modify composer.json to work with your private repository.

Such change in composer.json requires composer update command to be executed in order to update composer.lock file.

If Satis Server does not work over HTTPs you need to set secure-http to false.

Satis API

All HTTP endpoints are executing shell command underneath and return 200 OK in case of success or 500 Internal Server Error otherwise. Both application/x-www-form-urlencoded and application/json payloads are properly handled by all endpoints.

Raw command outputs are returned, sometimes including shell colors but this is useful when running on CI environments and sending HTTP requests from command-line.

Since Satis repository files can be found under / URL path, Satis API endpoints are available under /api.

/push

PUSH events handler, returns immediately and does not wait for build to finish.

$ curl -sS -d'{"repository":{"url":"https://github.com/php-amqplib/php-amqplib"}}' -H'Content-Type: application/json' http://your-server:8080/api/push

Point http://your-server:8080/api/push as an URL to handle PUSH events on your repository.

Securing

As this endpoint is meant to be called by external services, you can protect it with a pre-shared key that will be required to call /api/push endpoint, it looks for secret query parameter so your final URL should look like this: http://your-server:8080/api/push?secret= .

To set the pre-shared key, either modify PUSH_SECRET variable in /etc/satis-server/satis-server.conf or pass it's value via environment variable: -e PUSH_SECRET=d5a7c0d0c897665588cd0844744e3109.

Integration

See below links for documentation how PUSH events work and how to configure them:

/add

Add new package to Satis repository, send POST request and repository URL in url parameter.

$ curl -sS -d'url=https://github.com/php-amqplib/php-amqplib' http://your-server:8080/api/add
Your configuration file successfully updated! It's time to rebuild your repository  

/remove

Remove package from Satis repository by URL, send POST request and point repository in url parameter.

$ curl -sS -d'url=https://github.com/php-amqplib/php-amqplib' http://your-server:8080/api/remove
Successfully removed https://github.com/php-amqplib/php-amqplib

/build

Build a single package with matching repository URL, send POST request and point repository in url parameter.

$ curl -sS -d'url=https://github.com/php-amqplib/php-amqplib' http://your-server:8080/api/build
Scanning packages
Reading composer.json of php-amqplib/php-amqplib (v1.0)
Skipped tag v1.0, no composer file
Reading composer.json of php-amqplib/php-amqplib (v1.1)
Importing tag v1.1 (1.1.0.0)
Reading composer.json of php-amqplib/php-amqplib (v1.2.0)
Importing tag v1.2.0 (1.2.0.0)
...

/build-all

Rebuild whole package repository, request is hold until process is done and it's output is returned.

$ curl -sS http://your-server:8080/api/build-all
Scanning packages
...

/show

Display details about selected package, send POST request and point repository in url parameter.

$ curl -sS -d'url=https://github.com/php-amqplib/php-amqplib' http://your-server:8080/api/show
Package: php-amqplib/php-amqplib
Description: Formerly videlalvaro/php-amqplib.  This library is a pure PHP implementation of the AMQP protocol. It's been tested against RabbitMQ.
Authors: Alvaro Videla, John Kelly, Raúl Araya
Releases: dev-channel_connection_closed, dev-master, dev-revert-460-HHVM-compat-bugfix, v1.1, v1.2.0, v1.2.1, v2.0.0, v2.0.1, v2.0.2, v2.1.0, v2.2.0, v2.2.1, v2.2.2, v2.2.3, v2.2.4, v2.2.5, v2.2.6, v2.3.0, v2.4.0, v2.4.1, v2.5.0, v2.5.1, v2.5.2, v2.6.0, v2.6.1, v2.6.2, v2.6.3, v2.7.0-rc1
Homepage: https://github.com/php-amqplib/php-amqplib/
Last built: Mon Jul 31 19:27:55 2017

/list

List all packages in Satis repository.

$ curl -sS http://your-server:8080/api/list
PACKAGE NAME                    PACKAGE URL                                             LAST UPDATED
php-amqplib/php-amqplib         https://github.com/php-amqplib/php-amqplib              Mon Jul 31 19:27:55 2017

/dump

Dump satis.json configuration file.

$ curl -sS http://your-server:8080/api/dump
{
    "name": "Your Repository",
    "homepage": "http://your-server",
    "repositories": [
        {
            "type": "vcs",
            "url": "https://github.com/php-amqplib/php-amqplib"
        }
    ]
}

/version

Display versions of satis-server, Satis, Composer and PHP used inside the container.

$ curl -sS http://your-server:8080/api/version
satis-server 1.0 (build 20170731-24b177b)
Satis 1.0.0-dev
Composer version 1.4.2 2017-05-17 08:17:52
PHP 7.1.5 (cli) (built: May 13 2017 00:09:07) ( NTS )
webhook version 2.6.4

/help

View HTML version of this documentation in web browser.

http://your-server:8080/help

Restricting access to API

All Satis API endpoints can be restricted to specific subnetwork, except for /api/push which can be secured using pre-shard key.

By default API is opened for everyone, meaning 0.0.0.0/0. To restrict access, set API_ALLOW to a valid subnetwork mask in CIDR notation. If you are running Docker image manually, pass API_ALLOW environment variable: -e API_ALLOW=192.168.1.0/24.

Command-line interface

All Satis API commands are available as shell commands inside the container. See available commands and example usages below.

Enter satis-server and execute command

$ docker exec -it satis_server sh
/satis-server # satis-
   
    
     
satis-add             satis-build-all       satis-list            satis-server
satis-build           satis-dump            satis-remove          satis-show
satis-server-version  satis-server-help


/satis-server # satis-show "https://github.com/php-amqplib/php-amqplib"

    
   

Execute command directly on a running container

$ docker exec satis_server satis-show "https://github.com/php-amqplib/php-amqplib"

Create command alias for portability

$ alias satis-server='docker exec satis_server'
$ satis-server satis-show "https://github.com/php-amqplib/php-amqplib"

Build notifier

Notifications are sent before and after single package or the whole repository is built. To enable them you have to either edit /etc/satis-server/satis-server.conf file for automated installation or pass values as environment variables to Docker, i.e. -e NOTIFY_HIPCHAT=1 -e ....

HipChat

Set NOTIFY_HIPCHAT=1 to enable HipChat notifications, you will also have to provide:

  • HIPCHAT_API - base URL of your HipChat API, including trailing slash
  • HIPCHAT_ROOM - room ID
  • HIPCHAT_TOKEN - room notification token

Slack

Set NOTIFY_SLACK=1 to enable Slack notifications, you will also have to provide:

  • SLACK_URL - "Incoming WebHook" URL
  • SLACK_ROOM - room name

Examples

All possible parameters

So you can just remove what is not needed and replace rest with your values.

docker run -d \
    -p 8080:80 \
    -v /etc/satis:/etc/satis/ \
    -v /etc/satis-server/:/etc/satis-server/ \
    -v /var/satis-server/:/var/satis-server/ \
    -e PORT=8080 \
    -e SSL_PORT=443 \
    -e REBUILD_AT="1 0 * * *" \
    -e PUSH_SECRET=d5a7c0d0c897665588cd0844744e3109 \
    -e API_ALLOW="0.0.0.0/0" \
    -e NOTIFY_DEBUG=1 \
    -e NOTIFY_HIPCHAT=1 \
    -e HIPCHAT_API=https://hipchat.server.com/ \
    -e HIPCHAT_ROOM=123 \
    -e HIPCHAT_TOKEN=XTlyCeYH8rFhgjA4sJ8tu8UBnYhrmFOTPr5gM3J0 \
    -e NOTIFY_SLACK=1 \
    -e SLACK_ROOM=dev \
    -e SLACK_URL=https://hooks.slack.com/services/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 \
    --name satis_server \
    lukaszlach/satis-server:latest

Licence

MIT License

Copyright (c) 2017 Łukasz Lach [email protected]

Portions Copyright (c) 2015 Adnan Hajdarevic [email protected], Portions Copyright (c) Composer, Portions Copyright (c) 2012 Stephen Dolan

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.


jq ❤️

Comments
  • Pushes to dev-master does not rebuild the distribution zip but works fine on dev-develop

    Pushes to dev-master does not rebuild the distribution zip but works fine on dev-develop

    We have 2 main dev branches - dev-develop and dev-master

    if we push to dev-develop the zip file on the satis server is rebuilt and when we run composer update we get the latest code.

    However if we do the same on dev-master and run composer update we see the latest commit being detected by composer but the zip file does not get re-generated and our code becomes outdated.

    If we add -prefer-source in composer then it works fine - the issue is with the “distribution packages” provided by this software.

    Any ideas ? I’ve tried everything to try and fix the issue !

    Thanks

    opened by lukeenglish 3
  • POST zip file as package

    POST zip file as package

    Hi, I try to build a ci/cd solution for a composer project. My idea was to have sth like a nexus repo which hosts the php packages written by me. This is possible with satis as you can place a package as zip file to the folder used as repository and now the package can be used by json.

    But as all is running on openshift/kubernetes within their own docker containers I need a way to push/upload the zip file to the repository somehow. Can this be done by the satis-server api?

    Best regards, Marco

    documentation 
    opened by MarWestermann 3
  • Problem with push event

    Problem with push event

    After push webhook from GitHub repo I receive this error:

    [webhook] 2018/08/08 23:20:21 push got matched
    [webhook] 2018/08/08 23:20:21 push hook triggered successfully
    [webhook] 2018/08/08 23:20:21 error extracting command arguments: couldn't retrieve argument for {Source:payload Name:repository.url EnvName:}
    server {
    [webhook] 2018/08/08 23:20:21 executing /satis-server/bin/satis-push.sh (/satis-server/bin/satis-push.sh) with arguments ["/satis-server/bin/satis-push.sh" ""] and environment [REQUEST_PUSH_SECRET=xxxx] using /etc/satis as cwd
    [webhook] 2018/08/08 23:20:21 200 | 355.357µs | 127.0.0.1:9000 | POST /api/push
    172.18.0.1 - - [08/Aug/2018:23:20:21 +0000] "POST /api/push?secret=xxxx HTTP/1.1" 200 0 "-" "GitHub-Hookshot/cac83ef"
    [webhook] 2018/08/08 23:20:21 command output: [ERROR] Repository URL was not passed as first parameter
    
    [webhook] 2018/08/08 23:20:21 error occurred: exit status 1
    [webhook] 2018/08/08 23:20:21 finished handling push
    

    I suppose it's related to nginx config but I'm not sure what's wrong - I used configuration provided with this package with one small change http://127.0.0.1:9000 was changed into http://127.0.0.1:8080

        location /api/ {
            if ($request_uri ~ /api/push) {
                set $state "1";
            }
            if ($arg_secret != "$PUSH_SECRET") {
                set $state "${state}1";
            }
            if ($state = 11) {
                return 403;
            }
    
            proxy_pass http://127.0.0.1:8080$request_uri;
            proxy_max_temp_file_size 0k;
            proxy_http_version 1.1;
            proxy_set_header Connection "";
            proxy_set_header Proxy "";
            proxy_redirect off;
            proxy_read_timeout 600s;
            proxy_send_timeout 60s;
            proxy_connect_timeout 10s;
            proxy_buffering off;
            proxy_intercept_errors on;
            error_page 500 =500 /500.html;
        }
    

    Do you have any idea how to solve it?

    documentation 
    opened by seSze 2
  • Problem with partial match of repo name.

    Problem with partial match of repo name.

    I have 4 repos;

    vendor/aaa-bbb
    vendor/aaa-bbb-ccc
    vendor/aaa-bbb-ddd
    vendor/aaa-bbb-eee
    

    When I do curl -n -sS -d'url=https://github.com/vendor/aaa-bbb' https://satis/api/build I get the following error:

    Scanning packages
      [InvalidArgumentException]
      Specified repository url "https://github.com/vendor/aaa-bbb
      https://github.com/vendor/aaa-bbb-ccc
      https://github.com/vendor/aaa-bbb-ddd
      https://github.com/vendor/aaa-bbb-eee" does not exist.
    

    NOTE, satis believes the url is https://github.com/vendor/aaa-bbb https://github.com/vendor/aaa-bbb-ccc https://github.com/vendor/aaa-bbb-ddd https://github.com/vendor/aaa-bbb-eee

    curl -n -sS -d'url=https://github.com/vendor/aaa-bbb' https://satis/api/show gives me:

    jq: error (at <stdin>:1): null (null) has no keys
    Package: vendor/aaa-bbb
     vendor/aaa-bbb-ccc
     vendor/aaa-bbb-ddd
     vendor/aaa-bbb-eee
    Description:
    Authors:
    Releases:
    Homepage:
    Last built: Mon Apr 26 00:02:04 2021
    

    If I do curl -n -sS -d'url=https://github.com/vendor/aaa-bbb-ccc' https://satis/api/show, I get the expected result.

    opened by soderlind 1
  • Mirror Files Location

    Mirror Files Location

    Maybe I'm missing something, but is this supposed to mirror all of the upstream packages it finds? I am looking to use this as a behind-firewall mirror for a network that may not have internet access.

    Thanks,

    CJ

    opened by cjsfj 1
  • "jq: cannot iterate over null" error when sending /api/show request

    According to composer.json Schema the only required parameters are description and name. Given they're both present in my library' composer.json I'm wondering where this error is coming from

    Response I get:

    jq: error (at <stdin>:140): Cannot iterate over null (null)
    Package: vendor/package
    Description: 
    Authors: 
    Releases: 1.0.0, 1.0.1, dev-master
    Homepage: https://gitlab.xyz/vendor/package
    Last built: Fri Oct 13 10:02:02 2017
    

    composer.json of package I'm querying for:

    {
        "name": "vendor/package",
        "description": "",
        "license": "proprietary",
        "homepage": "https://gitlab.xyz/vendor/package",
        "type": "library",
        "keywords": ["abc", "def", "ghi"],
        "repositories": [
            {
                "type": "composer",
                "url": "https://composer.xyz"
            }
        ],
        "require": {
            "symfony/http-foundation": "^2.6|^3.0",
            "symfony/http-kernel": "^2.6|^3.0",
            "symfony/config": "^2.6|^3.0",
            "symfony/dependency-injection": "^2.6|^3.0"
        },
        "require-dev": {
            "phpspec/phpspec": "~3.4",
            "phpunit/phpunit": "~5.7",
            "symfony/framework-bundle": "^2.6|^3.0"
        },
        "minimum-stability": "stable"
    }
    
    bug 1.1 
    opened by markiewitch 1
  • Error: Net::ReadTimeout

    Error: Net::ReadTimeout

    POST https://mydomain.com/api/push?secret=XXX

    Error 500...no response from Server

    Internal error occurred while delivering this webhook. Error: Net::ReadTimeout

    opened by developedsoftware 0
  • Add missing package tini

    Add missing package tini

    In the newer images tini is missing, because docker now supports tini via a command line flag. But that also needed some rework due to a changed exec path for tini, so I found it easiest (and backwards compatible with older compose installations) to just install tini in the image.

    opened by Bonno 0
  • Fixed regular expression not accepting the given ip (cidr notation)

    Fixed regular expression not accepting the given ip (cidr notation)

    I had a problem that the given ip address didn't end up in the nginx config. This was due to the regexp being to strict. I made a little change so it allows valid combinations.

    opened by Bonno 0
  • remove broken /api/push cURL example

    remove broken /api/push cURL example

    This PR removes the first curl example command for /api/push, which I feel is incorrect after looking at this line in hooks.json.

    From my understanding, /api/push will only parse a payload of application/json, not application/x-www-form-urlencoded.

    I suppose another option would be to change hooks.json so that /api/push accepts a plain url parameter, much like /api/build or /api/add.

    opened by ehough 0
  • It is possible to remove all packages by sending parallel requests

    It is possible to remove all packages by sending parallel requests

    Hello,

    I've sent a request to "build" a package and since the request was taking too long, I've stopped it and sent another one (second one finished quickly and successfully built my package). After that tho there is only one package visible on Satis webpage — the one I was building.

    bug 1.1 
    opened by kipelovets 0
  • OpenSSL Fails with custom repository

    OpenSSL Fails with custom repository

    I have a custom Gitlab repository set up (stock installation) and am trying to connect satis-server to it using the instructions found here: https://docs.gitlab.com/ee/user/packages/composer_repository/#install-a-composer-package

    However, when I configure satis-server to use the packages provided by GitLab, I get the error below.

    I believe this is due to the old libressl version that ships with satis-server but am unsure how to resolve this problem.

    This does not occur when I use satis to build the packages manually on my own computer.

      [Composer\Downloader\TransportException]
      The "https://[REDACTED, DM ME FOR REPRO]/api/v4/group/4/-/packages/composer/packages.
      json" file could not be downloaded: SSL operation failed with code 1. OpenS
      SL Error messages:
      error:14007086:SSL routines:CONNECT_CR_CERT:certificate verify failed
      Failed to enable crypto
      failed to open stream: operation failed
    
    opened by tylershuster 0
  • Automated builds to match latest satis releases

    Automated builds to match latest satis releases

    Thanks very much for this package! Any chance you could set up a trigger for automated builds to Docker Hub to bring in the latest versions of Satis? Right now I've had to fork and build on our own, but only to get a newer version of satis; it would be great if I could continue to use and support your trunk repo. :-)

    enhancement help wanted 
    opened by bradjones1 2
  • Add support: Specify user

    Add support: Specify user

    When attempting to assign my own user to run the container, I get the repeated error in the logs:

    mkdir: can't create directory '/root/.ssh/': Permission denied

    I'm using docker-compose and the user key, which is equivalent to using docker run -u. I would like to be able to assign my own local user to sandbox the permissions for the persistent data.

    enhancement 
    opened by internalsystemerror 0
  • HTTPs redirect does not correctly pass/remove/replace port from URL

    HTTPs redirect does not correctly pass/remove/replace port from URL

    root@satis-server:/home/llach# curl localhost:8080/api -v
    * Hostname was NOT found in DNS cache
    *   Trying 127.0.0.1...
    * Connected to localhost (127.0.0.1) port 8080 (#0)
    > GET /api HTTP/1.1
    > User-Agent: curl/7.38.0
    > Host: localhost:8080
    > Accept: */*
    >
    < HTTP/1.1 302 Moved Temporarily
    * Server nginx/1.10.3 is not blacklisted
    < Server: nginx/1.10.3
    < Date: Wed, 25 Oct 2017 14:48:57 GMT
    < Content-Type: text/html
    < Content-Length: 161
    < Connection: keep-alive
    < Location: https://localhost:/api
    <
    <html>
    <head><title>302 Found</title></head>
    <body bgcolor="white">
    <center><h1>302 Found</h1></center>
    <hr><center>nginx/1.10.3</center>
    </body>
    </html>
    * Connection #0 to host localhost left intact
    
    bug 
    opened by lukaszlach 0
Releases(1.1)
Owner
Łukasz Lach
Docker Captain, Software Architect, DevSecOp
Łukasz Lach
Your private self hosted composer repository with user management

Devliver Your private self-hosted composer repository. Requirements Docker MariaDB/MySQL the running docker container has access to private git reposi

Nikita Loges 53 Dec 30, 2022
Private Composer registry for private PHP packages on AWS Serverless

Tug Tug is a Composer private registry for private PHP packages installable with Composer (1 and 2). The main idea of this project is to have an inter

Fxp 33 Oct 5, 2022
CodeFever Community Edition (A Self-hosted Git Services)

CodeFever Community Edition (A Self-hosted Git Services)

PGYER 2.3k Jan 7, 2023
A composer plugin, to install differenty types of composer packages in custom directories outside the default composer default installation path which is in the vendor folder.

composer-custom-directory-installer A composer plugin, to install differenty types of composer packages in custom directories outside the default comp

Mina Nabil Sami 136 Dec 30, 2022
Composer Repository Manager for selling Magento 2 extension and offering composer installation for ordered packages.

Magento 2 Composer Repository Credits We got inspired by https://github.com/Genmato. Composer Repository for Magento 2 This extension works as a Magen

EAdesign 18 Dec 16, 2021
Your self-hosted bookmark archive. Free and open source.

Your self-hosted bookmark archive. Free and open source. Contents About LinkAce Support Setup Contribution About LinkAce LinkAce is a self-hosted arch

Kevin Woblick 1.7k Jan 2, 2023
Repman - PHP Repository Manager: packagist proxy and host for private packages

Repman - PHP Repository Manager Repman is a PHP repository manager. Main features: free and open source works as a proxy for packagist.org (speeds up

Repman 438 Jan 2, 2023
Composer plugin that wraps all composer vendor packages inside your own namespace. Intended for WordPress plugins.

Imposter Plugin Composer plugin that wraps all composer vendor packages inside your own namespace. Intended for WordPress plugins. Built with ♥ by Typ

Typist Tech 127 Dec 17, 2022
Version is a library that helps with managing the version number of Git-hosted PHP projects

Version Version is a library that helps with managing the version number of Git-hosted PHP projects. Installation You can add this library as a local,

Sebastian Bergmann 6.3k Dec 26, 2022
Composer registry manager that help to easily switch to the composer repository you want

CRM - Composer Registry Manager Composer Registry Manager can help you easily and quickly switch between different composer repositories. 简体中文 Install

Tao 500 Dec 29, 2022
Smd tags - A Textpattern CMS plugin for unlimited, structured taxonomy across content types.

smd_tags Tag articles, images, files and links with stuff, then use the public-side tags to display the lists, filter or find related content. Feature

Stef Dawson 4 Dec 26, 2022
Glz custom fields - Unlimited Custom Fields for Textpattern

Unlimited custom fields for Textpattern This plugin sits under the Extensions tab in the back-end and gives your custom fields new life. You can final

Gerhard Lazu 21 Dec 1, 2019
Ekonomy - PocketMine economy plugin with unlimited currencies & more features

Ekonomy What does this plugin do? Similar to EconomyAPI, This economy plugin is optimized with asynchronous query libraries such as libasynql and awai

OctoPush 1 Apr 13, 2022
Phalcon Builder - is a packaging system that make it easy and quick to build Phalcon packages such as rpms, debs, etc. Phalcon's distribution that hosted at PackageCloud.

Phalcon Builder - is a packaging system that make it easy and quick to build Phalcon packages such as rpms, debs, etc. Phalcon's distribution that hos

The Phalcon PHP Framework 26 Oct 7, 2022
Easily manage git hooks in your composer config

composer-git-hooks Manage git hooks easily in your composer configuration. This command line tool makes it easy to implement a consistent project-wide

Ezinwa Okpoechi 985 Jan 3, 2023
Jump is yet another self-hosted startpage for your server designed to be simple, stylish, fast and secure.

Jump Jump is yet another self-hosted startpage for your server designed to be simple, stylish, fast and secure. Features Fast, easy to deploy, secure

Dale Davies 309 Dec 27, 2022
Your personal Self-hosted or offline YoutTube Kids!

New Tube You have a problem with youtube kids and need online youtube? This is yours. NewTube! Simply clone the project and put your mp4 video & cover

Javad Adib 7 Dec 28, 2022
FreshRSS is a self-hosted RSS feed aggregator like Leed or Kriss Feed.

Read this document on github.com/FreshRSS/FreshRSS/ to get the correct links and pictures. Version française FreshRSS FreshRSS is a self-hosted RSS fe

FreshRSS 5.3k Jan 4, 2023
Raspberry Pi Self Hosted Server Based on Docker / Portainer.io

Pi-Hosted Portainer Template V2 This repository is a collection of tutorials for hosting a variety of server applications using Docker and Portainer.

don 776 Jan 8, 2023