{"id":51029112,"url":"https://github.com/dvassallo/singleserver","last_synced_at":"2026-06-21T22:30:39.516Z","repository":{"id":364247455,"uuid":"1261632565","full_name":"dvassallo/singleserver","owner":"dvassallo","description":"All your projects on a single server","archived":false,"fork":false,"pushed_at":"2026-06-21T07:28:36.000Z","size":876,"stargazers_count":133,"open_issues_count":0,"forks_count":6,"subscribers_count":3,"default_branch":"main","last_synced_at":"2026-06-21T08:07:55.818Z","etag":null,"topics":["cloudflare","deployment","docker","kamal","paas","self-hosted","tailscale","vps"],"latest_commit_sha":null,"homepage":"https://singleserver.com","language":"Go","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/dvassallo.png","metadata":{"files":{"readme":"README.md","changelog":null,"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":"2026-06-07T00:29:25.000Z","updated_at":"2026-06-21T08:03:13.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/dvassallo/singleserver","commit_stats":null,"previous_names":["dvassallo/singleserver"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/dvassallo/singleserver","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dvassallo%2Fsingleserver","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dvassallo%2Fsingleserver/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dvassallo%2Fsingleserver/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dvassallo%2Fsingleserver/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/dvassallo","download_url":"https://codeload.github.com/dvassallo/singleserver/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dvassallo%2Fsingleserver/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34628453,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-21T02:00:05.568Z","response_time":54,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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":["cloudflare","deployment","docker","kamal","paas","self-hosted","tailscale","vps"],"created_at":"2026-06-21T22:30:39.065Z","updated_at":"2026-06-21T22:30:39.511Z","avatar_url":"https://github.com/dvassallo.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://singleserver.com\"\u003e\u003cimg src=\"www/server-single-wordmark.svg\" alt=\"single server\" width=\"484\"\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n\u003cp\u003e\u003cstrong\u003eGit push to production in \u0026lt;5 seconds.\u003c/strong\u003e\u003c/p\u003e\n\n\u003cp\u003eOne Linux box can run every app you've ever shipped. Single Server wires up Cloudflare, Tailscale, Docker, Kamal, and GitHub. From there, every \u003cstrong\u003egit push\u003c/strong\u003e goes live in under 5 seconds. No build queue, no per-app bills, no pile of YAML.\u003c/p\u003e\n\n\u003cp\u003eThis README is for working on Single Server itself. For what it does and why, see \u003ca href=\"https://singleserver.com\"\u003esingleserver.com\u003c/a\u003e. For the full manual, see the \u003ca href=\"https://singleserver.com/docs/\"\u003edocs\u003c/a\u003e.\u003c/p\u003e\n\n## Quickstart\n\nSSH into any fresh Linux box:\n\n```sh\nssh root@\u003cserver_ip\u003e\n```\n\nRun the interactive installer:\n\n```sh\ncurl -fsSL https://singleserver.com/install.sh | sh\n```\n\nPoint it at your repos:\n\n```sh\nsingleserver add https://github.com/you/your-app\n```\n\nEvery push to the configured branch deploys from then on. The [docs](https://singleserver.com/docs/) cover everything else.\n\n## Repository layout\n\n- `cmd/singleserverd` — entry point for the one Go binary, which runs as both the deploy daemon and the CLI.\n- `internal/singleserver` — all of the product: config, deploys, provider connections, and commands.\n- `www` — singleserver.com, including the docs page and `install.sh`. The site deploys as a Single Server app, and its `Dockerfile` builds the hosted binaries it serves at `/bin/`.\n- `test/e2e` — the real-dependency end-to-end harness.\n- `config/apps.example.yml` — an example app config.\n\n## Build and test\n\nThe module targets Go 1.26 and has no service dependencies for development:\n\n```sh\ngo build ./...\ngo test ./...\n```\n\nThe unit tests are plain `go test` with no setup, no network, and no build tags. They also run inside the site's Docker build, so a deploy fails before it ships if a test fails.\n\n`go run ./cmd/singleserverd help` prints the CLI. Most commands expect to run on a configured server, so for real behavior use the E2E harness or a throwaway VPS.\n\n## Releases\n\nTo release a new version, push a SemVer tag. That triggers `.github/workflows/release.yml`, which builds the binaries and publishes a GitHub Release with checksums and notes:\n\n```sh\ngit tag -a v0.2.0 -m \"…\"\ngit push origin v0.2.0\n```\n\n`install.sh` and `singleserver upgrade` read two channels:\n\n- **stable** (default) — the latest tagged release, checksum-verified.\n- **edge** — the latest `main` build at `singleserver.com/bin`.\n\nBoth default to stable. To use edge instead, install a fresh box with:\n\n```sh\ncurl -fsSL https://singleserver.com/install.sh | SINGLESERVER_CHANNEL=edge sh\n```\n\nor switch an existing box with:\n\n```sh\nsingleserver upgrade --edge\n```\n\n## End-to-end tests\n\nThe E2E harness spins up disposable Linux hosts in Docker Desktop and runs the real installer against real Tailscale, Cloudflare, and GitHub. It is serial, stateful, and needs Docker plus a local `.env` of test credentials. [test/e2e/README.md](test/e2e/README.md) covers the `.env` and setup, then:\n\n```sh\ntest/e2e/run.sh\n```\n\n---\n\n\u003cp align=\"center\"\u003eMIT License · \u003ca href=\"https://singleserver.com\"\u003esingleserver.com\u003c/a\u003e · \u003ca href=\"https://singleserver.com/docs/\"\u003eDocs\u003c/a\u003e\u003c/p\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdvassallo%2Fsingleserver","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdvassallo%2Fsingleserver","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdvassallo%2Fsingleserver/lists"}