{"id":41900250,"url":"https://github.com/imarc/ops","last_synced_at":"2026-04-21T22:07:07.512Z","repository":{"id":37546569,"uuid":"152636526","full_name":"imarc/ops","owner":"imarc","description":"A Docker based local development environment. Focused on PHP projects.","archived":false,"fork":false,"pushed_at":"2025-12-04T18:34:27.000Z","size":1182,"stargazers_count":20,"open_issues_count":6,"forks_count":6,"subscribers_count":5,"default_branch":"master","last_synced_at":"2026-01-26T04:55:19.067Z","etag":null,"topics":["docker","hacktoberfest","localdevelopment"],"latest_commit_sha":null,"homepage":"","language":"Shell","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/imarc.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2018-10-11T18:22:23.000Z","updated_at":"2025-12-04T18:34:32.000Z","dependencies_parsed_at":"2024-07-16T21:23:39.007Z","dependency_job_id":"e3de97f8-9f03-49f4-b763-a645e4820528","html_url":"https://github.com/imarc/ops","commit_stats":null,"previous_names":[],"tags_count":68,"template":false,"template_full_name":null,"purl":"pkg:github/imarc/ops","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/imarc%2Fops","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/imarc%2Fops/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/imarc%2Fops/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/imarc%2Fops/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/imarc","download_url":"https://codeload.github.com/imarc/ops/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/imarc%2Fops/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32112081,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-21T11:25:29.218Z","status":"ssl_error","status_checked_at":"2026-04-21T11:25:28.499Z","response_time":128,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["docker","hacktoberfest","localdevelopment"],"created_at":"2026-01-25T15:04:48.393Z","updated_at":"2026-04-21T22:07:07.483Z","avatar_url":"https://github.com/imarc.png","language":"Shell","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Ops\n\n**Version 0.17.0**\n\n- A local development environment focused on PHP-based projects.\n- Create a new host by making a directory.\n- Local HTTPS with self-signed certs.\n- Shared services: MariaDB, PostgreSQL, Redis, Mailhog, Adminer, and more.\n- Sync remote databases and filesystem paths to local projects.\n- Built on Docker and Traefik. Configure project-specific services when required.\n\n![Ops Dashboard](dashboard.png)\n\n## Prerequisites\n\nOps supports Linux, Mac, and Windows Subshell Linux (WSL)\n\n`bash`, `npm`, `docker`, `docker-compose`, `ssh`, and `rsync` are required.\n\n### Linux Installation Instructions\n\n- [Install Docker CE](https://docs.docker.com/engine/installation/linux/)\n- [Install Docker Compose](https://docs.docker.com/compose/install/)\n\n### Mac Installation Instructions\n\n- [Install Docker Desktop](https://docs.docker.com/docker-for-mac/install/)\n\n\n### Windows Subshell for Linux\n\n- [Install Docker Desktop](https://docs.docker.com/docker-for-windows/install/)\n\nFor HTTPS support in Firefox on Windows, go to `about:config` and change `security.enterprise_roots.enabled` to `true`\n\n## How To Install\n\nWhen installing global npm scripts, ensure you can do this as a non-superuser [through one of these solutions](https://github.com/imarc/ops/issues/22#issuecomment-728979823).\n\nInstall/Update ops:\n\n    npm install -g git+https://git@github.com/imarc/ops\n    ops system install\n\n**On first install, You will be asked for your sudo/system password in order to install the self-signed certs for HTTPS support**\n\n## Create Your First Project\n\nTo start ops services, run `ops start`\n\nTo add a new project, create a directory within $HOME/Sites. Your local project will then be available at `https://{directory}.imarc.io`.\n\nThe project directory name can only contain letters, numbers, and dashes ([A-Za-z0-9-]+).\n\nBy default the document root is set to a `public` directory within your project.\n\nTo stop ops, run `ops stop`\n\n## The Dashboard\n\nThe dashboard ([https://ops.imarc.io](https://ops.imarc.io)) will show you all projects and let you manage services.\n\n## Project Configuration\n\nWithin your project's .env file you can set the following options:\n\n    # Set the application backend\n    #\n    # Valid values are the OPS_BACKENDS global option\n    #\n    # Default: value of OPS_DEFAULT_BACKEND global option\n    OPS_PROJECT_BACKEND=\"apache-php82\"\n\n    # set the project document root\n    #\n    # Default: value of OPS_DEFAULT_DOCROOT global option\n    OPS_PROJECT_DOCROOT=\"public\"\n\n    # enable basic auth for project\n    #\n    # Default: 0\n    OPS_PROJECT_BASIC_AUTH=1\n\n    # sets the .htpasswd file to use for basic auth\n    # looks for this file within the project path\n    #\n    # Default: .htpasswd\n    OPS_PROJECT_BASIC_AUTH_FILE=\".htpasswd\"\n\n    # allow the use of subdomains.\n    # may require 'ops system regenerate-certs' for HTTPS\n    #\n    # Default: 0\n    OPS_PROJECT_ALLOW_SUBDOMAINS=1\n\n## Global Configuration\n\nThe following options can be set within your $HOME/.ops/config file.\n\n    # A space separated list of application backends that\n    # should be enabled. Available options are:\n    #  apache-php72, apache-php73, apache-php74, apache-php80\n    #\n    # Default: apache-php82\n    OPS_BACKENDS=\"apache-php82 apache-php83\"\n\n    # A linux user id that a backend process should attempt to run as.\n    #\n    # Recommended on linux systems. Ensures that files written to the filesystem\n    # by the backend process map to the correct owner on the host system.\n    #\n    # Docker Desktop for mac or windows already resolves this behavior.\n    #\n    # Default: (none)\n    OPS_DOCKER_UID=\"\"\n\n    # A linux group id that a backend process should attempt to run as.\n    #\n    # See OPS_DOCKER_UID for description.\n    #\n    # Default: (none)\n    OPS_DOCKER_GID=\"\"\n\n    # The root domain to extend with custom project subdomains\n    #\n    # For development, the dns should be configured as a wildcard and to point\n    # back to 127.0.0.1\n    #\n    # Default: \"imarc.io\"\n    OPS_DOMAIN=\"imarc.io\"\n\n    # Configure domain aliases for a particular project\n    #\n    # Set up space separated key value pairs to use a real domain\n    # Also requires a host override in /etc/hosts to 127.0.0.1\n    #\n    # Example:\n    #   OPS_DOMAIN_ALIASES=\"myrealdomain.com:project\"\n    #\n    # Default: (none)\n    OPS_DOMAIN_ALIASES=\"\"\n\n    # Set the diretory where projects live.\n    #\n    # Default: $HOME/Sites\n    OPS_SITES_DIR=\"$HOME/Sites\"\n\n    # If a backend is not specified in a project's .env\n    # file, this backend will be used.\n    #\n    # Default: apache-php73\n    OPS_DEFAULT_BACKEND=\"apache-php73\"\n\n    # If a document root is not specified in a project's .env\n    # file, this document root will be used.\n    #\n    # Default: public\n    OPS_DEFAULT_DOCROOT=\"public\"\n\n    # A localtunnel (localtunnel.me) host. If you run your own server, configure it here.\n    #\n    # Default: https://localtunnel.me\n    OPS_LOCALTUNNEL_HOST=\"https://localtunnel.me\"\n\n    # Command to launch a browser for 'ops www'. You can override the browser here.\n    #\n    # Default (mac): open\n    # Default (linux): xdg-open\n    # Default (WSL): explorer.exe\n    OPS_BROWSER=firefox\n\n    # Enable XDebug extension for PHP containers\n    #\n    # Requires restart to take effect. Set to 1 to enable.\n    #\n    # Default: 0\n    OPS_PHP_XDEBUG=\"0\"\n\n## Connect to Services\n\nYou can connect your app to the following shared services:\n\n**MariaDB 11.4**\u003cbr\u003e\nhostname: mariadb\u003cbr\u003e\nusername: root\u003cbr\u003e\npassword: *none*\u003cbr\u003e\nport: 3306\n\n**PostgreSQL 9.6**\u003cbr\u003e\nhostname: postgres\u003cbr\u003e\nusername: postgres\u003cbr\u003e\npassword: *none*\u003cbr\u003e\nport: 5432\n\n**PostgreSQL 16.3**\u003cbr\u003e\nhostname: postgres16\u003cbr\u003e\nusername: postgres\u003cbr\u003e\npassword: *none*\u003cbr\u003e\nport: 5432\n\n**Redis 3.2**\u003cbr\u003e\nhostname: redis\u003cbr\u003e\nport: 6379\n\n**Memcached 1.4**\u003cbr\u003e\nhostname: memcached\u003cbr\u003e\nport: 11211\n\n**Minio**\u003cbr\u003e\nhostname: minio\u003cbr\u003e\nroot user: minio-user\u003cbr\u003e\nroot password: minio-password\u003cbr\u003e\n\n**Mailhog**\u003cbr\u003e\n*SMTP Config:*\u003cbr\u003e\nhostname: mailhog\u003cbr\u003e\nport: 1025\n\n**ChromeDriver**\u003cbr\u003e\nhostname: chrome\u003cbr\u003e\nport: 9515\n\n## Remote to Local Syncing\n\nWith a few settings in a project's `.env` file, you can sync the project's database and filesystem storage\nfrom a remote server. Ideally, these settings should be checked into version control within a `.env.example` file to be shared amongst the development team.\n\nCurrently `ops sync` assumes the following:\n\n- SSH access is enabled to the remote web and/or DB servers.\n- remote server has the following database tools available to the SSH user: mysqldump, pg_dump.\n- `OPS_PROJECT_SYNC_DIRS`, `OPS_PROJECT_REMOTE_HOST` and `OPS_PROJECT_REMOTE_PATH` are all defined.\n\nThe following settings can be placed in the project's `.env`\n\n    # the local database type: mariadb, psql\n    # default: none\n    OPS_PROJECT_DB_TYPE=\"\"\n\n    # the local database name.\n    # default: the project name (which is the directory name)\n    OPS_PROJECT_DB_NAME=\"${OPS_PROJECT_NAME}\"\n\n    # space separated relative dirs to sync down\n    # default: none\n    OPS_PROJECT_SYNC_DIRS=\"\"\n\n    # disable remote database sync. 1 or 0\n    # default: 0\n    OPS_PROJECT_SYNC_NODB=\"0\"\n\n    # space separated rsync exclude patterns\n    # default: none\n    OPS_PROJECT_SYNC_EXCLUDES=\"\"\n\n    # rsync max filesize to sync\n    # default: 500M\n    OPS_PROJECT_SYNC_MAXSIZE=\"500M\"\n\n    # the remote hostname for the filesystem sync\n    # default: the project name (which is the directory name)\n    OPS_PROJECT_REMOTE_HOST=\"${OPS_PROJECT_NAME}\"\n\n    # the remote SSH user for the filesystem sync\n    # default: none\n    OPS_PROJECT_REMOTE_USER=\"\"\n\n    # the remote project path for the filesystem sync\n    # default: none\n    OPS_PROJECT_REMOTE_PATH=\"\"\n\n    # the remote hostname for the database sync\n    # default: the remote hostname for the filesystem sync\n    OPS_PROJECT_REMOTE_DB_HOST=\"\"\n\n    # the remote database type\n    # default: the local database type\n    OPS_PROJECT_REMOTE_DB_TYPE=\"${OPS_PROJECT_DB_TYPE-$OPS_PROJECT_DB_TYPE}\"\n\n    # the remote database name\n    # default: the local database name\n    OPS_PROJECT_REMOTE_DB_NAME=\"${$OPS_PROJECT_DB_NAME}\"\n\n    # the remote database user\n    # default: the remote SSH user\n    OPS_PROJECT_REMOTE_DB_USER=\"${OPS_PROJECT_REMOTE_USER}\"\n\n    # the remote database password\n    #\n    # !!! best practice is to not use this and instead place a .my.cnf file\n    # !!! in your remote home directory. that is more secure as it won't\n    # !!! leak your password in cli history or process lists\n    #\n    # default: none\n    OPS_PROJECT_REMOTE_DB_PASSWORD=\"\"\n\n    # the remote database port\n    # default: 3306 for mariadb, 5432 for psql\n    OPS_PROJECT_REMOTE_DB_PORT=\"\"\n\n\n## Custom Project Container\n\n*This is for advanced users and it would be best to have a solid understanding of docker and docker-compose files\nbefore moving forward with implementing this solution*\n\nThere are times where you want to configura a custom container to run your project. This could be due to:\n\n- Your project needs a special PHP configuration or extension.\n- Your project need to lock down the PHP version or use a specific image.\n- You are using a language that isn't PHP.\n\nWith a little configuration, Ops allows you to run a custom container beside the shared services. Ops' `project`\nsubcommands deal with project specific compose commands. Running `ops link` within a project directory\nwill load a `ops-compose.yml` file.\n\nBy linking a project, its containers will respond to with `ops start` and `ops stop` commands.\n\nTo unlink a project and remove its container run `ops unlink` within a project directory.\n\nHere is a generic ops-compose.yml file:\n\n    version: '2'\n\n    services:\n      craft:\n        image: imarcagency/ops-apache-php72:${OPS_VERSION}\n\n        labels:\n          - \"ops.project=${OPS_PROJECT_NAME}\"\n          - \"ops.hostname=${OPS_PROJECT_NAME}.${OPS_DOMAIN}\"\n          - \"traefik.enable=true\"\n          - \"traefik.docker.network=ops_gateway\"\n          - \"traefik.frontend.rule=Host:${OPS_PROJECT_NAME}.${OPS_DOMAIN}\"\n          - \"traefik.port=80\"\n        environment:\n          - \"APACHE_UID=${OPS_DOCKER_UID}\"\n          - \"APACHE_GID=${OPS_DOCKER_GID}\"\n          - \"APACHE_ROOT=/var/www/public\"\n        volumes:\n          - \"./:/var/www/:cached\"\n        networks:\n          - default\n          - ops_gateway\n          - ops_backend\n\n    networks:\n      ops_gateway:\n        external: true\n      ops_backend:\n        external: true\n\nThe most important things are the labels and the networks.\nThose settings are required for the proxy to function or for your app to conenct to shared services.\nEverything else can be customized to whatever your app requires.\n\n## Contributing\n\nIf you are contributing to ops, debugging, or want to try out bleeding edge features, It is recommended you install like so:\n\n    # clone into a local dir and enter dir\n    git clone git@github.com:imarc/ops.git\n    cd ops\n\n    # create 'ops' symlink to your repo\n    npm install -g .\n\nThis means your global ops script will point directly to the repo and you can make live changes.\n\n## License\n\nMIT License\n\nCopyright (c) 2021 Imarc\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fimarc%2Fops","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fimarc%2Fops","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fimarc%2Fops/lists"}