{"id":13751460,"url":"https://github.com/oestrich/grapevine","last_synced_at":"2025-05-01T12:31:09.103Z","repository":{"id":33922264,"uuid":"138809123","full_name":"oestrich/grapevine","owner":"oestrich","description":"The MUD Chat Network","archived":false,"fork":false,"pushed_at":"2023-09-14T21:51:29.000Z","size":3579,"stargazers_count":153,"open_issues_count":17,"forks_count":22,"subscribers_count":9,"default_branch":"master","last_synced_at":"2024-08-03T09:02:42.117Z","etag":null,"topics":["elixir","grapevine","mud","phoenix"],"latest_commit_sha":null,"homepage":"https://grapevine.haus/","language":"Elixir","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/oestrich.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","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},"funding":{"github":"oestrich","patreon":"ericoestrich"}},"created_at":"2018-06-27T00:35:11.000Z","updated_at":"2024-08-03T09:03:05.791Z","dependencies_parsed_at":"2024-08-03T09:02:17.076Z","dependency_job_id":"1a8ff0ba-d217-4976-9844-135e6cf7d55c","html_url":"https://github.com/oestrich/grapevine","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oestrich%2Fgrapevine","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oestrich%2Fgrapevine/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oestrich%2Fgrapevine/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oestrich%2Fgrapevine/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/oestrich","download_url":"https://codeload.github.com/oestrich/grapevine/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":224256900,"owners_count":17281620,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","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":["elixir","grapevine","mud","phoenix"],"created_at":"2024-08-03T09:00:45.587Z","updated_at":"2024-11-12T10:29:38.340Z","avatar_url":"https://github.com/oestrich.png","language":"Elixir","funding_links":["https://github.com/sponsors/oestrich","https://patreon.com/ericoestrich","https://www.patreon.com/ericoestrich"],"categories":["Clients"],"sub_categories":["Web Clients"],"readme":"# Grapevine\n\n![Grapevine](https://grapevine.haus/images/grapevine.png)\n\nGrapevine is a MUD chat network.\n\n- [MUD Coders Slack](https://slack.mudcoders.com/)\n- [Docs](https://grapevine.haus/docs)\n- [Trello](https://trello.com/b/bWZ00VpS/grapevine)\n- [Patreon](https://www.patreon.com/ericoestrich)\n- [Discord](https://discord.gg/GPEa6dB)\n\n## WebSocket Protocol\n\nView the websocket details on [Grapevine][websocket-docs].\n\n## Server\n\n### Requirements\n\nThis is only required to run Grapevine itself, the server. These are not required to connect as a game. See the above [websocket docs][websocket-docs] for connecting as a client.\n\n- PostgreSQL 11\n- Elixir 1.9.0\n- Erlang 22.0.4\n- node.js 10.13.0\n- [Yarn](https://yarnpkg.com/en/docs/install)\n\n### Setup\n\n```bash\ncd apps/grapevine\nmix deps.get\nmix compile\nyarn --cwd assets\nmix ecto.reset\nmix phx.server\n```\n\nThis will start a web server on port 4100. You can now load [http://localhost:4100/](http://localhost:4100/) to view the application.\n\n### Running Tests\n\n```bash\nMIX_ENV=test mix ecto.create\nMIX_ENV=test mix ecto.migrate\nmix test\n```\n\n### Telnet Web Client\n\nTelnet connections live in the `apps/telnet` application. This node holds the telnet connections so the main application can reboot on deploys and not drop active game connections.\n\nFor deployment the telnet application needs to be on its own erlang node. You can connect with something similar to:\n\n```elixir\nconfig :grapevine,\n  topologies: [\n    local: [\n      strategy: Cluster.Strategy.Epmd,\n      config: [\n        hosts: [\n          :grapevine@localhost,\n          :telnet@localhost,\n        ]\n      ]\n    ]\n  ]\n```\n\n### Docker Compose\n\nTo run a production like system locally, you can use [docker-compose](https://docs.docker.com/compose/).\n\nThe following commands will get a system running locally at `http://grapevine.local`. This also assumes you have something listening locally (such as nginx) that will proxy port 80 traffic to port 4100.\n\n```bash\ndocker-compose build\ndocker-compose up -d postgres\ndocker-compose up -d socket\ndocker-compose up -d telnet\ndocker-compose run --rm web eval \"Grapevine.ReleaseTasks.migrate()\"\ndocker-compose run --rm web eval \"Grapevine.ReleaseTasks.seed()\"\ndocker-compose up web\n```\n\n#### Simple nginx config\n\nThis nginx config will configure your server to listen for `grapevine.local` and forward to either a local development server or the docker-compose setup from above.\n\n```nginx\n    upstream grapevine {\n            server localhost:4100;\n    }\n\n    server {\n            listen 80;\n            server_name grapevine.local;\n\n            location / {\n                    proxy_set_header Host $host;\n                    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n                    proxy_set_header X-Real-IP $remote_addr;\n                    proxy_set_header X-Forwarded-Proto $scheme;\n                    proxy_http_version 1.1;\n                    proxy_set_header Upgrade $http_upgrade;\n                    proxy_set_header Connection \"upgrade\";\n                    proxy_pass http://grapevine;\n            }\n    }\n```\n\n## Setting up a new Play CNAME\n\n- Game sets the CNAME to `client.grapevine.haus`\n- Game must have a homepage url\n- Game must have the web client enabled\n- Update game's record for their CNAME\n- Update nginx config for new domain\n- Run certbot for the new domain\n- Refresh CNAMEs in ETS `Grapevine.CNAMEs.reload()`\n\n[websocket-docs]: https://grapevine.haus/docs\n\n## Kubernetes\n\nSome notes on installing into kubernetes:\n\n```bash\n# Set up nginx ingress\nhelm install nginx-ingress stable/nginx-ingress --set controller.publishService.enabled=true\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Foestrich%2Fgrapevine","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Foestrich%2Fgrapevine","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Foestrich%2Fgrapevine/lists"}