{"id":380,"date":"2026-10-14T01:20:59","date_gmt":"2026-10-14T01:20:59","guid":{"rendered":"http:\/\/www.scmgalaxy.com\/tutorials\/2014\/09\/25\/svn-server-setup\/"},"modified":"2026-10-14T01:20:59","modified_gmt":"2026-10-14T01:20:59","slug":"svn-server-setup","status":"publish","type":"post","link":"https:\/\/www.devopsschool.com\/blog\/svn-server-setup\/","title":{"rendered":"SVN Server Setup with svnserve: Install, Secure, and Use a Subversion Repository"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\"><em>Originally published on 2014-09-25; fully revised and updated.<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">If you need a lightweight Subversion server for a team or internal project, <strong>svnserve<\/strong> is the fastest path to get running. This guide walks administrators through installation, repository creation, access control, daemon startup, and first client operations with practical commands you can adapt to your environment.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><img decoding=\"async\" src=\"https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2014\/09\/svn-server-setup.png\" alt=\"SVN server setup\" \/><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">What this guide sets up<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">By the end, you will have a working SVN repository served over <strong>svn:\/\/<\/strong> with user authentication and basic authorization controls.<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Install and verify Subversion tools (<code>svn<\/code>, <code>svnadmin<\/code>)<\/li><li>Create a repository at a server path you control<\/li><li>Configure <code>svnserve.conf<\/code>, <code>passwd<\/code>, and <code>authz<\/code><\/li><li>Start <code>svnserve<\/code> as a daemon<\/li><li>Import source and run checkout\/commit from clients<\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">SVN server setup workflow<\/h2>\n\n\n\n<pre class=\"mermaid\">\nflowchart TD\n    A[Install Subversion] --> B[Create repository]\n    B --> C[Configure auth and access]\n    C --> D[Start svnserve daemon]\n    D --> E[Import initial code]\n    E --> F[Client checkout]\n    F --> G[Daily commit and update cycle]\n<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Install and verify Subversion<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Package commands vary by Linux distribution. Install Subversion, then verify both client and admin tools are available.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php language-bash\"><span class=\"hljs-comment\"># Debian\/Ubuntu<\/span>\nsudo apt update\nsudo apt install subversion\n\n<span class=\"hljs-comment\"># RHEL\/CentOS Stream\/Fedora<\/span>\nsudo dnf install subversion\n\n<span class=\"hljs-comment\"># Older RHEL\/CentOS<\/span>\nsudo yum install subversion\n\n<span class=\"hljs-comment\"># Verify installation<\/span>\nsvn --version\nsvnadmin --version<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Create repository storage<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Use a dedicated root directory for repositories. In this example, a single project repository is created at <code>\/srv\/svn\/myproject<\/code>.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php language-bash\">sudo mkdir -p \/srv\/svn\nsudo svnadmin create \/srv\/svn\/myproject\n\n<span class=\"hljs-comment\"># Inspect repository layout<\/span>\nls \/srv\/svn\/myproject<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">You should see standard Subversion repository directories such as <code>conf<\/code>, <code>db<\/code>, <code>hooks<\/code>, and <code>locks<\/code>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Configure users and permissions<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Edit svnserve.conf<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Enable authenticated access and point svnserve to the password and authorization files.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php language-ini\"><span class=\"hljs-comment\"># \/srv\/svn\/myproject\/conf\/svnserve.conf<\/span>\n&#91;general]\nanon-access = none\nauth-access = write\npassword-db = passwd\nauthz-db = authz\nrealm = myproject<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Define users and path-based authorization<\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php language-ini\"><span class=\"hljs-comment\"># \/srv\/svn\/myproject\/conf\/passwd<\/span>\n&#91;users]\nalice = ChangeMeStrong1\nbob = ChangeMeStrong2\n\n<span class=\"hljs-comment\"># \/srv\/svn\/myproject\/conf\/authz<\/span>\n&#91;\/]\nalice = rw\nbob = r<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">The original post used anonymous write access. For most environments, disable anonymous writes and require authenticated users.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Start svnserve and connect a client<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Start the daemon and set repository root with <code>-r<\/code>. This keeps client URLs clean.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php language-bash\"><span class=\"hljs-comment\"># Run svnserve in daemon mode with repository root<\/span>\nsvnserve -d -r \/srv\/svn\n\n<span class=\"hljs-comment\"># Client checkout example<\/span>\nsvn checkout svn:<span class=\"hljs-comment\">\/\/SVN_SERVER_IP\/myproject myproject<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">If you do not use <code>-r<\/code>, clients usually need a longer URL path (for example, <code>svn:\/\/SVN_SERVER_IP\/srv\/svn\/myproject<\/code>).<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Access method<\/th><th>Example URL<\/th><th>Best for<\/th><th>Notes<\/th><\/tr><\/thead><tbody><tr><td>file:\/\/<\/td><td>file:\/\/\/srv\/svn\/myproject<\/td><td>Local admin operations on server<\/td><td>No network service required<\/td><\/tr><tr><td>svn:\/\/<\/td><td>svn:\/\/SVN_SERVER_IP\/myproject<\/td><td>Lightweight remote access via svnserve<\/td><td>What this guide configures<\/td><\/tr><tr><td>https:\/\/<\/td><td>https:\/\/svn.example.com\/repos\/myproject<\/td><td>TLS and web-integrated auth<\/td><td>Requires Apache-based SVN setup, not covered here<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Import code and run basic SVN operations<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Import your existing source once, then have users work from checked-out working copies.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php language-bash\"><span class=\"hljs-comment\"># Initial import from server or a machine with repository access<\/span>\nsvn import \/path\/to\/source file:<span class=\"hljs-comment\">\/\/\/srv\/svn\/myproject -m \"Initial import\"<\/span>\n\n<span class=\"hljs-comment\"># Developer workflow<\/span>\nsvn checkout svn:<span class=\"hljs-comment\">\/\/SVN_SERVER_IP\/myproject myproject<\/span>\ncd myproject\nsvn status\nsvn add newfile.txt\nsvn commit -m <span class=\"hljs-string\">\"Add new file\"<\/span>\nsvn update<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Common pitfalls and best practices<\/h2>\n\n\n\n<ul class=\"wp-block-list\"><li><strong>Avoid anonymous write access<\/strong> unless you explicitly want an open repository.<\/li><li><strong>Keep one clear repository layout<\/strong> to avoid mixing repository root and project subfolders.<\/li><li><strong>Use strong passwords<\/strong> and rotate them periodically.<\/li><li><strong>Back up repository data<\/strong> (especially <code>db<\/code>) on a scheduled basis.<\/li><li><strong>Prefer service management<\/strong> (systemd\/init) for production daemon startup instead of ad-hoc shell sessions.<\/li><\/ul>\n","protected":false},"excerpt":{"rendered":"<p>This step-by-step guide shows how to set up an SVN server with svnserve, create a repository, configure authentication, and connect clients. It also covers secure defaults and core import\/checkout\/commit commands.<\/p>\n","protected":false},"author":1,"featured_media":3579,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_joinchat":[],"footnotes":""},"categories":[2],"tags":[],"class_list":["post-380","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorised"],"_links":{"self":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/380","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/comments?post=380"}],"version-history":[{"count":2,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/380\/revisions"}],"predecessor-version":[{"id":79260,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/380\/revisions\/79260"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media\/3579"}],"wp:attachment":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media?parent=380"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/categories?post=380"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/tags?post=380"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}