Projectly is a modern open-source project management system designed to streamline task tracking and team collaboration. Ease of use and effective UI/UX make projectly a good tool for any team!
- Collaborative team workspaces
- Project statistics and insights
- Kanban boards for task progress tracking
- Flexible project management tools
- Add users with customizable roles
- Editable user profiles
- Role-based access control
- Create and update task statuses
- Attach documents and files
- Commenting and mention system for communication
- Detailed progress tracking
Deploy Projectly on any server with Docker:
curl -fsSL https://projectly.ru/install.sh | shWith a custom domain and HTTPS (Let's Encrypt):
curl -fsSL https://projectly.ru/install.sh | sh -s -- --domain app.example.com --email admin@example.comNon-interactive / CI:
curl -fsSL https://projectly.ru/install.sh | sh -s -- --non-interactive --dir /opt/projectly --build-frontendThe installer will:
- Check the OS, install Docker via
get.docker.comif missing, and verify Docker Compose v2 - Generate secure passwords and JWT secrets (
openssl rand) into.env/.env.backend(mode600) - Write
docker-compose.ymlandnginx.conf, optionally configuring HTTPS via Let's Encrypt (certbot) - Pull images, run database migrations, create the MinIO bucket, and wait for health checks
- Print the app URL, MinIO console, credentials path, and management commands
| Flag | Description |
|---|---|
--dir <path> |
Install directory (default: /opt/projectly as root, ~/projectly otherwise) |
--version <tag> |
Deploy a specific version/tag (default: latest) |
--domain <host> |
Public domain β enables HTTPS (Let's Encrypt) with --email |
--email <addr> |
Admin e-mail for Let's Encrypt registration/renewals |
--port <port> |
Host port for the web UI (default: 4242) |
--build-frontend |
Build the frontend locally with your domain/port baked in (recommended for self-hosted installs) |
--no-tls |
Force plain HTTP even when --domain is given |
--non-interactive |
Never prompt; missing values fall back to defaults (CI) |
--force |
Overwrite existing credentials/configs without asking |
--yes / -y |
Assume "yes" for all confirmations |
--show-secrets |
Print generated credentials at the end |
--verify <sha256> |
Verify the script checksum before running |
--skip-docker-install |
Do not auto-install Docker |
--update |
Update an existing install (fetch configs, pull, restart). Domain and HTTPS settings are restored from the install marker unless overridden |
--uninstall |
Stop and remove containers (--purge also deletes data volumes) |
--dry-run |
Print what would be done without executing |
Integrity:
docker-compose.ymlis verified against a publishedsha256checksum when fetched from GitHub;nginx.confis always regenerated from the installer's local template. Run with--verify <sha256>to also check the script itself.
Note: If the GHCR images require authentication, run
docker login ghcr.io -u YOUR_GITHUB_USERNAMEwith a PAT that hasread:packagesscope first.
- Linux (Ubuntu/Debian/CentOS/RHEL) or macOS (dev) with
curl - Docker + Docker Compose (v2) β installed automatically by the installer if missing
openssl(pre-installed on macOS / Linux)
Edit .env and .env.backend after the first run to change settings like domain, Yandex OAuth, or database credentials.
Follow these steps to set up a development environment.
- Vue.js 3 - Progressive JavaScript framework
- Nuxt 3 - For static site generation
- Composition API - As a modern approach to code splitting
- TypeScript - For types
- Tailwind CSS - Easy utility-first CSS styles
- Element Plus - Pretty UI component library
- Golang - High-performance and easy to use
- PostgreSQL - Reliable relational database
- MinIO - Object storage
- Docker - Application containerization
- Nginx - Web server and reverse proxy
Thank you for considering contributing to Projectly! Here are some steps to get you started:
Ensure you have the following installed:
-
Clone the Repository
git clone https://github.com/neketli/projectly.git cd projectly -
Configure Environment
Create a
.envfile in the project root and set the environment variables:POSTGRES_USER=postgres POSTGRES_PASSWORD=[change_password] POSTGRES_DB=projectly MINIO_ROOT_USER=minioadmin MINIO_ROOT_PASSWORD=[change_password]
Also you need to set
.envin./frontendNUXT_PUBLIC_API_HOST=http://localhost:8080 # or your API URL NUXT_PUBLIC_S3_HOST=http://localhost:8080 NUXT_PUBLIC_SITE_URL=projectly.ru NUXT_APP_BASE_URL=/
And do this again for
./backendAPP_MODE=dev PG_DSN=postgresql://[postgres_user]:[postgres_password]@[host]:5432/projectly?sslmode=disable S3_HOST=[minio_host] S3_ACCESS=[minio_access_token] S3_SECRET=[minio_secret_token] AUTH_ACCESS_SECRET=[jwt_secret_encoding_key] AUTH_REFRESH_SECRET=[jwt_secret_encoding_key] AUTH_YANDEX_CLIENT_ID= AUTH_YANDEX_CLIENT_SECRET= AUTH_YANDEX_CALLBACK_URL=http://localhost:8080/api/v1/auth/yandex/callback SESSION_SECRET=[any_token_for_setup_sessions]
-
Set Up Infrastructure
docker compose up postgres minio nginx -d
-
Install Dependencies
cd ./backend go mod downloadcd ../frontend npm install -
Make migrations
Make sure you have a
.envin./backendand that you have created a bucket in your S3 provider with the correct access policiescd ./backend make migrate-up -
Run the Application
Backend:
cd backend make build make runFrontend (in a new terminal):
cd frontend npm run dev -
Access the Application
Open your browser and navigate to:
http://localhost:3000
# Build the application
make build
# Run the application
make run
# Generates swagger by swag-go doc comments
make swagger
# Applies up migrations to DB
make migrate-up
# Applies down migrations to DB
make migrate-down# Development mode
npm run dev
# Build for production
npm run build
# Generate static files
npm run generate
# Preview production build
npm run preview
# Lint code with fixing
npm run lintprojectly
ββ docker-compose.yml # Docker compose project config
ββ backend # Golang backend
β ββ cmd # Application entry points
β β ββ server # Backend HTTP server
β ββ config # Project configuration files
β ββ docs # Project docs
β β ββ swagger.yaml # HTTP Swagger/OpenAPI
β ββ go.mod # Go module declaration
β ββ Makefile # Backend make commands
β ββ internal # App core
β β ββ app # Main entry point
β β ββ domain # App domains
β β ββ task # Domain example - task
β β β ββ delivery # HTTP Handlers
β β β ββ entity # Domain entities (structs)
β β β ββ repository # Data saving
β β β ββ usecase # Core business logic of module
β β ββ board
β β ββ media
β β ββ project
β β ββ status
β β ββ team
β β ββ user
β ββ migrations # Database migrations
β ββ pkg # Reusable packages
ββ frontend # Vue 3 (Nuxt.js) Frontend
β ββ app.vue # Entry point
β ββ assets # App static assets
β ββ components # Reusable domain / UI components
β ββ composables # Reusable logic / APIs
β ββ error.vue # Fallback error page
β ββ i18n # Locales
β ββ layouts # Page base layouts
β ββ middleware # Frontend middlewares
β ββ nuxt.config.ts # Nuxt config
β ββ pages # App pages
β ββ plugins # App plugins
β ββ public # Public files
β ββ store # Pinia stores
ββ ββ types # App TS typesFor questions or suggestions:
- π Create an issue
- π§ Contact the author
β If you find this project useful, please give it a star on GitHub!
